목차
플러그인 개발 및 구현
Seer는 개발자가 다양한 영역에서 기능을 확장할 수 있도록 모듈식 플러그인 아키텍처를 제공합니다. 아래에서 개발할 플러그인 기능을 선택하여 개발 사양을 살펴보세요:
뷰어 플러그인 (Viewers)
뷰어 플러그인은 스페이스바 미리보기 창을 확장합니다. 변환 플러그인 (Convert Plugins) 및 DLL 플러그인 (SDK v3) 두 가지 구현 아키텍처를 지원합니다.
AI 에이전트로 뷰어 플러그인 구축
아래의 자리 표시자를 교체한 후 코딩 에이전트에 전체 지침을 전달하세요:
https://raw.githubusercontent.com/ccseer/Seer-Plugins/refs/heads/master/plugin_development_guide.md 에 있는 Seer 플러그인 개발 가이드를 읽고 따르세요. 아키텍처, plugin.json, 구현, 검증 및 패키징에 대한 단일 진실 출처(Single Source of Truth)로 취급하세요. 가이드를 사용할 수 없는 경우 계속하기 전에 중단하고 보고하세요.
작업을 수행하기 전에 아래의 Requirement(요구 사항)를 검사하세요. 누락되었거나 변경되지 않은 자리 표시자 텍스트이거나 구현하기에 너무 모호한 경우 한 가지 확인 질문을 하고 기다리세요. 누락된 요구 사항을 추측하지 마세요.
명확해지면 Convert 또는 DLL을 선택하고 선택 이유를 간략히 설명한 후 현재 작업 영역에 완전하고 설치 가능한 플러그인을 구현하세요. Seer 자체를 수정하거나 계획 또는 코드 스니펫에서 멈추지 마세요.
가이드의 모든 해당 검증 단계를 따르고 실제 결과를 보고하세요. 가능한 경우 앱 내 Seer 미리 보기 테스트를 실행하고, 그렇지 않은 경우 런타임 검증이 수행되지 않았음을 명시적으로 밝히세요.
Requirement: [이 자리 표시자를 뷰어 플러그인 요구 사항으로 교체하세요. 예: 마크다운 미리보기에서 mermaid 다이어그램 렌더링]
변환 플러그인 (Convert)
Seer는 변환 플러그인을 외부 명령줄 실행 프로그램으로 취급합니다. 사용자가 지원되는 파일에서 스페이스바를 누르면 Seer는 구성된 프로그램을 실행하고 자리 표시자를 통해 파일 경로를 전달합니다. 프로그램은 파일을 Seer에서 기본 지원하는 형식(HTML, JSON, TXT, 이미지 등)으로 변환하며, 프로세스가 종료되면 Seer가 이를 로드하여 렌더링합니다.
자리 표시자 변수
| 자리 표시자 | 설명 | 예시 |
|---|---|---|
${output_file} |
기본 출력 파일 경로. 인수에 대상 확장자를 추가합니다. | ${output_file}.html |
${no_cache} |
변환 캐싱을 비활성화하고 미리보기 창이 닫힐 때 비워지는 자동 삭제 디렉터리에 출력을 저장합니다. | ${no_cache} |
변환 플러그인은 범용 자리 표시자(${input_file}, ${use_backslash}, ${seer_dir}, ${seer_exe}, ${seerviewer_exe}, ${7z})도 허용하며, 확장자 일치를 extensions 대신 formats에서 선언하므로 ${type_*} 일치 토큰은 사용하지 않습니다. 둘 다 아래의 공통 자리 표시자 및 일치 토큰 섹션에서 설명합니다.
지원되는 실행 파일 및 스크립트 런타임
- 스크립트: PowerShell 스크립트(
.ps1, PowerShell을 통해 기본 지원). Python(.py), Node.js(.js) 또는 배치(.bat)의 경우 독립 실행형.exe로 컴파일하거나(예: PyInstaller 사용) 패키지 내에 인터프리터를 번들로 제공하세요. - 사용자 지정 바이너리: C/C++, Rust, Go 또는 C#으로 컴파일된 독립 실행형 CLI 실행 파일.
plugin.json 예시 (Convert)
{
"name": "ipynb",
"version": "1.2.0",
"type": "convert",
"roles": [
"viewer"
],
"entry": "ipynb.ps1",
"args": [
"-i",
"${input_file}",
"-o",
"${output_file}.html"
],
"formats": [
"ipynb"
],
"appMinVersion": "4.1.3",
"author": "ccseer"
}
DLL 플러그인 (SDK v3)
최고의 렌더링 성능, 심층적인 상호 작용 또는 스트리밍 뷰를 위해 Seer는 QPluginLoader를 통해 뷰포트에 직접 로드되는 기본 C++/Qt 동적 링크 라이브러리를 지원합니다.
- 기술 사양: C++17, Qt 6.8, MSVC 2022 (x64), CMake 3.22+.
- 필수 인터페이스:
ViewerBase(위젯 구현)를 상속하고ViewerPluginInterface(IID"seer.plugin.interface.preview/3")를 구현합니다. - 최소 앱 버전: SDK v3 플러그인은
"appMinVersion": "4.2.9"를 선언해야 합니다.
참조 프로젝트
| 프로젝트 | 목적 |
|---|---|
| F3DViewer | 3D 모델 렌더링 및 파노라마 뷰 |
| OfficeViewer | 오피스 문서 및 CAD 도면 |
| FontViewer | 글꼴 글리프 검사 및 렌더링 |
| JsonTreeViewer | 고성능 대화형 JSON 트리 |
| Collections | 모든 공식 및 커뮤니티 미리보기 플러그인 |
컨트롤 플러그인
컨트롤 플러그인은 미리보기 창의 하단 컨트롤 바 왼쪽에 사용자 지정 작업 버튼을 추가하여 활성 파일 또는 폴더에 대한 빠른 작업 및 외부 도구 연동을 지원합니다.
AI 에이전트로 컨트롤 플러그인 구축
아래의 자리 표시자를 교체한 후 코딩 에이전트에 전체 지침을 전달하세요:
https://raw.githubusercontent.com/ccseer/Seer-Controls/refs/heads/main/plugin_development_guide.md 에 있는 Seer 컨트롤 플러그인 개발 가이드를 읽고 따르세요. 아키텍처, plugin.json, 구현, 검증 및 패키징에 대한 단일 진실 출처(Single Source of Truth)로 취급하세요. 가이드를 사용할 수 없는 경우 계속하기 전에 중단하고 보고하세요.
작업을 수행하기 전에 아래의 Requirement(요구 사항)를 검사하세요. 누락되었거나 변경되지 않은 자리 표시자 텍스트이거나 구현하기에 너무 모호한 경우 한 가지 확인 질문을 하고 기다리세요. 누락된 요구 사항을 추측하지 마세요.
명확해지면 현재 작업 영역에서 Canonical v1 프로세스 계약을 준수하는 완전하고 설치 가능한 컨트롤 플러그인을 구현하세요. Seer 자체를 수정하거나 계획 또는 코드 스니펫에서 멈추지 마세요.
가이드의 모든 해당 검증 단계를 따르고 실제 결과를 보고하세요.
Requirement: [이 자리 표시자를 컨트롤 플러그인 요구 사항으로 교체하세요. 예: 현재 디렉터리에서 VS Code 열기 또는 절대 경로를 클립보드에 복사]
아키텍처 및 계약
- 프로세스 모델: Canonical v1 프로세스 계약(
backend: "process",capabilities: ["control"])을 구현합니다. Seer는 CLI를 통해 헬퍼를 실행합니다. - 반환 상태 및 오류 보고:
- 성공: 프로세스가 종료 코드
0으로 종료됩니다(또는success_exit_codes와 일치)."close_after_success": true가 구성된 경우 Seer는 실행 성공 후 미리보기 창을 자동으로 닫습니다. - 실패: 프로세스가 0이 아닌 코드로 종료됩니다. 표준 오류(
stderr)에 기록된 모든 내용은 Seer에 의해 캡처되어 앱 내 토스트 오류 알림으로 표시됩니다.
- 성공: 프로세스가 종료 코드
- UI 및 상호 작용: 컨트롤 플러그인은 자체적인 상주 기본 창을 그리지 않습니다. 일반적인 헬퍼는 백그라운드 작업을 실행하거나, 텍스트를 클립보드에 복사하거나, 네이티브 Windows 시스템 대화 상자(예: 연결 프로그램, 속성, 공유)를 호출합니다.
명령줄 자리 표시자
컨트롤 헬퍼는 대상 경로만 수신합니다 — ${input_file} 및 아래의 공통 자리 표시자 및 일치 토큰 섹션에 나열된 범용 자리 표시자(${use_backslash}, ${seer_dir}, ${seer_exe}, ${seerviewer_exe}, ${7z}).
컨트롤 매니페스트에서는 ${output_dir}, ${output_file} 및 ${no_cache}가 거부됩니다. 임시 공간이 필요한 컨트롤은 자체적으로 해결해야 합니다. 자체 실행 파일 디렉터리를 먼저 사용하고, 그 다음 시스템 임시 디렉터리를 사용합니다.
plugin.json 예시 (Control)
예시 1: 폴더 작업 (Terminal Here)
공식 Terminal Here 플러그인 구성:
{
"schema_version": 1,
"id": "io.1218.seer.terminal-here",
"name": "Terminal Here",
"description": "Opens a terminal window in the current folder.",
"version": "1.0.0",
"appMinVersion": "4.5.10",
"backend": "process",
"capabilities": [
"control"
],
"extensions": [
"${type_folder}"
],
"command": "terminal_here.exe",
"arguments": [
"--input",
"${input_file}"
],
"close_after_success": false,
"timeout_ms": 150000,
"success_exit_codes": [
0
]
}
예시 2: 파일 작업 (Explorer Open With)
공식 Explorer Open With 플러그인 구성:
{
"schema_version": 1,
"id": "io.1218.seer.explorer-open-with",
"name": "Open With",
"description": "Opens the Windows Open With dialog for the current file.",
"version": "1.1.0",
"appMinVersion": "4.5.10",
"backend": "process",
"capabilities": [
"control"
],
"extensions": [
"${type_file}"
],
"command": "shellopenwith.exe",
"arguments": [
"--input",
"${input_file}",
"${use_backslash}"
],
"timeout_ms": 30000,
"success_exit_codes": [
0
]
}
성공 시 미리보기 창을 자동으로 닫으려면 매니페스트에서 "close_after_success": true를 설정하세요.
공식 컨트롤 플러그인 소스 코드는 다음을 참조하세요: ccseer/Seer-Controls.
속성 플러그인
속성 플러그인은 Seer의 메타데이터 검사 엔진을 확장합니다. 사용자가 미리보기 중인 파일이나 폴더에서 Ctrl + I를 누르거나(또는 속성 창을 열 때), 일치하는 속성 플러그인이 구조화된 메타데이터와 시각적 스코프/차트를 추출하여 표시합니다.
AI 에이전트로 속성 플러그인 구축
아래의 자리 표시자를 교체한 후 코딩 에이전트에 전체 지침을 전달하세요:
https://raw.githubusercontent.com/ccseer/Seer-Properties/refs/heads/main/plugin_development_guide.md 에 있는 Seer 속성 플러그인 개발 가이드를 읽고 따르세요. 아키텍처, plugin.json, 구현, 검증 및 패키징에 대한 단일 진실 출처(Single Source of Truth)로 취급하세요. 가이드를 사용할 수 없는 경우 계속하기 전에 중단하고 보고하세요.
작업을 수행하기 전에 아래의 Requirement(요구 사항)를 검사하세요. 누락되었거나 변경되지 않은 자리 표시자 텍스트이거나 구현하기에 너무 모호한 경우 한 가지 확인 질문을 하고 기다리세요. 누락된 요구 사항을 추측하지 마세요.
명확해지면 현재 작업 영역에서 Canonical v1 프로세스 계약 및 Schema 1 JSON 사양을 준수하는 완전하고 설치 가능한 속성 플러그인을 구현하세요. Seer 자체를 수정하거나 계획 또는 코드 스니펫에서 멈추지 마세요.
가이드의 모든 해당 검증 단계를 따르고 실제 결과를 보고하세요.
Requirement: [이 자리 표시자를 속성 플러그인 요구 사항으로 교체하세요. 예: MP4 파일의 세부 오디오/비디오 코덱 매개변수 및 비트레이트 추출 및 표시]
아키텍처 및 계약
- 프로세스 모델: Canonical v1 프로세스 계약(
backend: "process",capabilities: ["property"],result_schema: 1)을 구현합니다. - CLI 호출: 호스트가 다음을 전달합니다:
--input "${input_file}" --output "${output_file}" --output-dir "${output_dir}" - 출력 게시:
- 호스트는
${output_file}을 확장자가 없는 기본 경로(예:<requestDir>/<md5>)로 확장합니다. - 플러그인은 JSON 결과를
<output-base>.json(즉,${output_file}.json)에 작성해야 합니다. - 시각적 첨부 파일(차트, 히스토그램, 벡터스코프)은
${output_dir}에 저장해야 합니다. - 제약 조건: 속성 플러그인에는
${no_cache}를 사용할 수 없습니다.
- 호스트는
- 종료 코드 정책:
- 예상되는 도메인 결과(예: 서명되지 않은 파일, git 저장소가 아님, 빈 메타데이터 등)는 반드시 종료 코드
0으로 종료하고 JSON에 상태를 설명해야 합니다. - 치명적인 오류나 유효하지 않은 호출의 경우에만 0이 아닌 코드로 종료하세요(0이 아닌 종료 시 호스트가 요청 디렉터리를 완전히 삭제합니다).
- 예상되는 도메인 결과(예: 서명되지 않은 파일, git 저장소가 아님, 빈 메타데이터 등)는 반드시 종료 코드
명령줄 자리 표시자
| 자리 표시자 | 설명 | 예시 |
|---|---|---|
${output_file} |
확장자 없이 호스트가 할당한 기본 경로. 결과는 ${output_file}.json에 작성해야 합니다. |
C:\Users\...\request_dir\md5_hash |
${output_dir} |
첨부 파일(차트, 이미지)을 위해 호스트가 할당한 요청 디렉터리. | C:\Users\...\request_dir |
또한 아래의 공통 자리 표시자 및 일치 토큰 섹션에 나열된 범용 자리 표시자 및 ${type_*} 일치 토큰을 지원합니다. 속성 플러그인에서는 ${no_cache}가 거부됩니다.
결과 JSON (Schema 1) 사양
결과 파일 ${output_file}.json은 result_schema: 1 및 data 개체를 포함하는 유효한 UTF-8 JSON이어야 합니다:
1. 단순 행 (Flat Rows)
전체 결과가 단일 행인 경우에만 사용합니다 (예: SHA-256):
{
"result_schema": 1,
"data": {
"SHA-256": "2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824"
}
}
2. 순서가 지정된 단일 키 객체 배열을 포함하는 하위 그룹 (기본값)
둘 이상의 행을 생성하는 결과는 플러그인 이름을 딴 정확히 하나의 하위 그룹으로 게시해야 합니다. 최상위 수준의 느슨한 행은 다른 모든 플러그인의 행과 충돌하며, 검사기는 이를 하나의 목록으로 표시합니다. 배열의 순서가 곧 렌더링 순서이므로, 행이 나타나는 순서를 플러그인이 결정할 수 있는 유일한 형식입니다:
{
"result_schema": 1,
"data": {
"Git": {
"value": [
{ "Repository": "ccseer/Seer-Properties" },
{ "Branch": "main" },
{ "Status": "Clean" }
]
}
}
}
3. 값 객체를 포함하는 하위 그룹
value는 일반 객체일 수도 있지만, 그 행은 파싱된 객체의 키 순서로 렌더링되며 플러그인이 제어할 수 없습니다. 행 순서가 중요하지 않은 경우에만 사용하세요:
{
"result_schema": 1,
"data": {
"Git": {
"value": {
"Branch": "main",
"Status": "Working tree clean"
}
}
}
}
4. 그래픽 차트 및 스코프 (이미지 첨부 파일)
생성된 PNG 차트를 ${output_dir}에 저장하고 {"type": "image", "value": "relative_filename.png"} 형식으로 선언합니다:
{
"result_schema": 1,
"data": {
"Image Scopes": {
"value": [
{ "RGB Histogram": { "type": "image", "value": "histogram.png" } },
{ "Luma Waveform": { "type": "image", "value": "waveform.png" } }
]
}
}
}
plugin.json 예시 (Property)
{
"schema_version": 1,
"id": "io.1218.seer.git-info",
"name": "Git Info",
"description": "Reports repository information for the current folder using Git.",
"version": "1.0.0",
"appMinVersion": "4.5.10",
"backend": "process",
"capabilities": [
"property"
],
"extensions": [
"${type_folder}"
],
"invocations": {
"property": {
"command": "git_info.exe",
"arguments": [
"--input",
"${input_file}",
"--output",
"${output_file}",
"--output-dir",
"${output_dir}"
],
"result_schema": 1,
"timeout_ms": 30000,
"success_exit_codes": [
0
]
}
}
}
공식 속성 플러그인 소스 코드는 다음을 참조하세요: ccseer/Seer-Properties.
자리 표시자 및 일치 토큰
Seer는 arguments에서 이러한 토큰을 확장합니다. 기능이 사용할 수 있는 자리 표시자는 매니페스트 로드 시 호스트에 의해 검증됩니다. 지원되지 않는 토큰을 사용하는 것은 런타임 경고가 아니라 매니페스트 로드 오류입니다.
모든 기능에서 사용 가능
| 자리 표시자 | 설명 | 예시 |
|---|---|---|
${input_file} |
미리보기 중인 파일 또는 폴더의 절대 경로. | C:\Docs\sample.pdf |
${use_backslash} |
경로 구분 기호를 Windows 네이티브 역슬래시 (\)로 서식 지정하는 선택적 플래그. |
${use_backslash} |
${seer_dir} |
Seer.exe가 위치한 디렉터리. |
C:\Program Files\Seer |
${seer_exe} |
Seer.exe의 절대 경로. |
C:\Program Files\Seer\Seer.exe |
${seerviewer_exe} |
SeerViewer.exe의 절대 경로. |
C:\Program Files\Seer\SeerViewer.exe |
${7z} |
Seer와 함께 번들로 제공되는 7z.exe의 절대 경로. |
C:\Program Files\Seer\plugins\7z.exe |
${theme} |
Seer의 현재 테마이며 dark 또는 light로 확장됩니다. 데이터 자리표시자이므로 command 전체로 단독 사용할 수 없습니다. |
dark |
${lang} |
Seer의 현재 언어이며 BCP-47 형식(예: en, zh-CN)으로 확장됩니다. 데이터 자리표시자이므로 command 전체로 단독 사용할 수 없습니다. |
en |
${screenshot} |
현재 보기의 임시 PNG 스크린샷의 절대 경로. | C:\Users\Username\AppData\Local\Temp\Seer\screenshot\view_1.png |
기능별 전용 자리 표시자
| 자리 표시자 | 미리보기 (Preview) | 컨트롤 (Control) | 속성 (Property) |
|---|---|---|---|
${output_file} |
기본 출력 경로. 대상 확장자를 추가합니다(예: ${output_file}.html) |
지원되지 않음 | 확장자 없는 기본 경로. 결과는 ${output_file}.json에 기록해야 함 |
${output_dir} |
지원되지 않음 | 지원되지 않음 | 첨부 파일(차트, 이미지)용 요청 디렉터리 |
${no_cache} |
변환 캐싱을 비활성화하고 출력을 자동 삭제 디렉터리에 저장 | 지원되지 않음 | 지원되지 않음 |
컨트롤 헬퍼는 대상 경로만 수신합니다. 임시 공간이 필요한 경우 자체적으로 해결해야 합니다. 자체 실행 파일 디렉터리를 먼저 사용하고, 그 다음 시스템 임시 디렉터리를 사용합니다.
extensions 일치 토큰
표준 확장자(예: ["png", "zip"]) 외에도 extensions는 광범위한 범주와 일치하는 토큰을 허용합니다. 이는 extensions를 선언하는 플러그인(컨트롤 및 속성)에 적용됩니다. 변환 플러그인은 대신 formats를 선언하므로 사용하지 않습니다.
| 토큰 | 설명 |
|---|---|
${type_folder} |
디렉터리 및 폴더와 일치합니다. |
${type_file} |
모든 파일(확장자가 없는 파일 포함)과 일치합니다. |
${type_all} |
모든 항목(파일과 폴더 모두)과 일치합니다. |
${type_image} |
Seer의 내장 이미지 뷰어에서 지원하는 이미지와 일치합니다. |
${type_media} |
오디오 및 비디오 형식과 일치합니다. |
${type_web} |
HTML 및 Markdown과 같은 웹 파일과 일치합니다. |
${type_text} |
텍스트, 코드 및 구성 파일과 일치합니다. |
${type_pdf} |
PDF 문서와 일치합니다. |
${type_none} |
위 범주에 속하지 않는 파일과 일치합니다(예: 압축 파일, 실행 파일). |
패키징 및 앱 내 테스트
개발이 완료되면 플러그인을 설치를 위해 표준 ZIP 아카이브로 패키징해야 합니다. 이는 모든 플러그인 기능에 적용됩니다.
패키징 표준
- 패키지 문서: 모든 독립형 컨트롤 또는 속성 패키지에는 패키지 루트에
README.md로 배치되는PACKAGE_README.md(설명 및## Options & Arguments표)가 포함되어야 합니다. - 플랫 루트 레이아웃: 컨트롤 및 속성 패키지(Canonical v1)의 경우
plugin.json, 실행 파일/스크립트,README.md및 런타임 종속 항목이 아카이브 루트에 직접 위치해야 합니다. 추가 폴더 안에 래핑하지 마시고, 플랫 항목과 중첩 항목을 혼합하지 마세요. 호스트는 패키지 루트가 모호한 아카이브를 거부합니다.온라인 카탈로그에서 설치된 기존 레거시 변환 플러그인은 반대 레이아웃을 사용합니다. 패키지 파일을 래핑하는 최상위
<archive-name>/폴더입니다. 해당 경우에는 변환 플러그인 가이드를 따르세요. 두 레이아웃은 호환되지 않습니다. - 최대 압축: 최대 Deflate 압축이 적용된 7-Zip을 권장합니다:
powershell 7z a -tzip -mx=9 my-plugin-1.0.0.zip .\*
로컬 앱 내 테스트
- Seer 설정을 열고 대상 섹션으로 이동합니다:
- 뷰어 플러그인:
설정 > 플러그인-> Local 탭 - 컨트롤 플러그인:
설정 > 컨트롤 - 속성 플러그인:
설정 > 속성
- 뷰어 플러그인:
- 목록 하단의 +를 클릭하고
.zip아카이브(또는 로컬 폴더의plugin.json)를 선택합니다. - Seer가 패키지를 자동으로 검증하고 로드합니다. 설정을 확인하고 확인을 클릭하여 활성화합니다.