目次

プラグインの開発と実装

Seer はモジュール式のプラグインアーキテクチャを備えており、開発者は複数の領域でその機能を拡張できます。以下からプラグイン機能を選択して、開発仕様を確認してください:

ビューアプラグイン (Viewers)

ビューアプラグインは、スペースキーによるプレビューウィンドウを拡張します。変換タイププラグイン (Convert Plugins) と DLL プラグイン (SDK v3) の 2 つの実装アーキテクチャをサポートしています。

AI エージェントを使用したビューアプラグインの構築

以下のプレースホルダーを置き換えてから、コーディングエージェントに完全な指示を与えてください:

https://raw.githubusercontent.com/ccseer/Seer-Plugins/refs/heads/master/plugin_development_guide.md にある Seer プラグイン開発ガイドを読み、従ってください。これをアーキテクチャ、plugin.json、実装、検証、およびパッケージングの信頼できる唯一の情報源(Single Source of Truth)として扱ってください。ガイドが利用できない場合は、続行する前に停止して報告してください。

作業を行う前に、以下の Requirement(要件)を確認してください。欠落している場合、変更されていないプレースホルダーテキストである場合、または実装するには曖昧すぎる場合は、確認の質問を 1 つ行って待機してください。欠落している要件を推測しないでください。

明確になったら、Convert または DLL を選択してその選択理由を簡潔に説明し、現在のワークスペースに完全でインストール可能なプラグインを実装してください。Seer 自体を変更したり、計画やコードスニペットで停止したりしないでください。

ガイド内の該当するすべての検証手順に従い、実際の結果を報告してください。可能であれば Seer アプリ内プレビューテストを実行し、それ以外の場合は実行時検証が実行されなかったことを明示的に述べてください。

Requirement: [このプレースホルダーをビューアプラグインの要件に置き換えてください。例: Markdown プレビューで 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 Office ドキュメントと 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(要件)を確認してください。欠落している場合、変更されていないプレースホルダーテキストである場合、または実装するには曖昧すぎる場合は、確認の質問を 1 つ行って待機してください。欠落している要件を推測しないでください。

明確になったら、現在のワークスペースで Canonical v1 プロセス規約に準拠した完全でインストール可能なコントロールプラグインを実装してください。Seer 自体を変更したり、計画やコードスニペットで停止したりしないでください。

ガイド内の該当するすべての検証手順に従い、実際の結果を報告してください。

Requirement: [このプレースホルダーをコントロールプラグインの要件に置き換えてください。例: カレントディレクトリで VS Code を開く、または絶対パスをクリップボードにコピーする]

アーキテクチャと規約

  • プロセスモデル: Canonical v1 プロセス規約(backend: "process", capabilities: ["control"])を実装します。Seer は CLI 経由でヘルパーを実行します。
  • 終了ステータスとエラーレポート:
    • 成功: プロセスが終了コード 0 で終了します(または success_exit_codes に一致)。"close_after_success": true が設定されている場合、Seer は実行成功後にプレビューウィンドウを自動的に閉じます。
    • 失敗: プロセスがゼロ以外のコードで終了します。標準エラー出力(stderr)に書き込まれた内容はすべて Seer にキャプチャされ、アプリ内 Toast エラー通知 として表示されます。
  • 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(要件)を確認してください。欠落している場合、変更されていないプレースホルダーテキストである場合、または実装するには曖昧すぎる場合は、確認の質問を 1 つ行って待機してください。欠落している要件を推測しないでください。

明確になったら、現在のワークスペースで 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 内でステータスを説明する必要があります。
    • 致命的なエラーまたは無効な呼び出しの場合にのみ非ゼロで終了してください(非ゼロでの終了により、ホストはリクエストディレクトリを消去します)。

コマンドラインプレースホルダー

プレースホルダー 説明 例
${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. 単一キーオブジェクトの順序付き配列を持つサブグループ (デフォルト)

複数の行を生成する結果は、プラグインにちなんだ名前のちょうど 1 つのサブグループとして公開しなければなりません。トップレベルに散在する行は他のすべてのプラグインの行と衝突し、インスペクターはそれらを 1 つのリストに表示します。配列の順序がそのまま表示順序になるため、行の表示順序をプラグイン自身が決められるのはこの形式だけです:

{
  "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 などの Web ファイルに一致します。
${type_text} テキスト、コード、および設定ファイルに一致します。
${type_pdf} PDF ドキュメントに一致します。
${type_none} 上記のカテゴリー以外のファイル(例: アーカイブ、実行可能ファイル)に一致します。

パッケージ化とアプリ内テスト

開発が完了したら、プラグインをインストール用の標準 ZIP アーカイブにパッケージ化する必要があります。これはすべてのプラグイン機能に適用されます。

パッケージ化の基準

  1. パッケージドキュメント: スタンドアロンのコントロールまたはプロパティパッケージには、パッケージルートに README.md として配置される PACKAGE_README.md(説明と ## Options & Arguments テーブル)を含める必要があります。
  2. フラットなルートレイアウト: コントロールおよびプロパティパッケージ(Canonical v1)の場合、plugin.json、実行可能ファイル/スクリプト、README.md、および実行時依存関係は、アーカイブのルート直下に配置する必要があります。余分なフォルダー内にラップしないでください。また、フラットなエントリとネストされたエントリを混在させないでください。ホストはパッケージルートが曖昧なアーカイブを拒否します。

    オンラインカタログからインストールされる従来の変換プラグインは、逆のレイアウトを使用します。パッケージファイルをラップする最上位の <archive-name>/ フォルダーです。その場合は変換プラグインガイドに従ってください。この 2 つのレイアウトには互換性がありません。

  3. 最大圧縮率: 最大 Deflate 圧縮を適用した 7-Zip を推奨します: powershell 7z a -tzip -mx=9 my-plugin-1.0.0.zip .\*

ローカルでのアプリ内テスト

  1. Seer の設定を開き、対象のセクションに移動します:
    • ビューアプラグイン: 設定 > プラグイン -> Local タブ
    • コントロールプラグイン: 設定 > コントロール
    • プロパティプラグイン: 設定 > プロパティ
  2. リストの下にある + をクリックし、.zip アーカイブ(またはローカルフォルダーの plugin.json)を選択します。
  3. Seer は自動的にパッケージを検証して読み込みます。設定を確認し、OK をクリックして有効化します。