Auf dieser Seite

Plugin-Entwicklung & Implementierung

Seer bietet eine modulare Plugin-Architektur, mit der Entwickler die Funktionen über mehrere Bereiche hinweg erweitern können. Wählen Sie unten eine Plugin-Funktion aus, um deren Entwicklungsspezifikationen zu erkunden:

Betrachter-Plugins (Viewers)

Betrachter-Plugins erweitern das Leertasten-Vorschaufenster. Sie unterstützen zwei Implementierungsarchitekturen: Konvertierungs-Plugins (Convert) und DLL-Plugins (SDK v3).

Betrachter-Plugin mit einem KI-Agenten erstellen

Ersetzen Sie den unten stehenden Platzhalter und geben Sie Ihrem Codierungs-Agenten die vollständige Anweisung:

Lesen und befolgen Sie die Seer-Plugin-Entwicklungsanleitung unter https://raw.githubusercontent.com/ccseer/Seer-Plugins/refs/heads/master/plugin_development_guide.md. Betrachten Sie sie als maßgebliche Quelle (Source of Truth) für Architektur, plugin.json, Implementierung, Validierung und Paketierung. Wenn die Anleitung nicht verfügbar ist, stoppen Sie und melden Sie dies, bevor Sie fortfahren.

Überprüfen Sie vor jeder Arbeit die folgende Requirement (Anforderung). Wenn sie fehlt, unveränderter Platzhaltertext ist oder zu ungenau für eine Implementierung ist, stellen Sie eine klärende Frage und warten Sie. Versuchen Sie nicht, die fehlende Anforderung zu erraten.

Sobald dies geklärt ist, wählen Sie Convert oder DLL und begründen Sie die Wahl kurz. Implementieren Sie dann ein vollständiges, installierbares Plugin im aktuellen Arbeitsbereich. Nehmen Sie keine Änderungen an Seer selbst vor und bleiben Sie nicht bei Plänen oder Code-Snippets stehen.

Befolgen Sie jeden anwendbaren Validierungsschritt in der Anleitung und melden Sie die tatsächlichen Ergebnisse. Führen Sie nach Möglichkeit einen In-App-Vorschautest in Seer durch; andernfalls geben Sie explizit an, dass keine Laufzeitüberprüfung durchgeführt wurde.

Requirement: [ERSETZEN SIE DIESEN PLATZHALTER durch Ihre Betrachter-Plugin-Anforderung, z. B. Rendern von Mermaid-Diagrammen in der Markdown-Vorschau]

Konvertierungs-Plugins (Convert)

Seer behandelt Konvertierungs-Plugins als externe Befehlszeilenausführer. Wenn ein Benutzer die Leertaste auf einer unterstützten Datei drückt, startet Seer das konfigurierte Programm und übergibt die Dateipfade über Platzhalter. Das Programm konvertiert die Datei in ein von Seer nativ unterstütztes Format (HTML, JSON, TXT, Bilder usw.), das Seer nach Beenden des Prozesses lädt und rendert.

Platzhalter-Variablen

Platzhalter Beschreibung Beispiel
${output_file} Basis-Ausgabedateipfad; hängen Sie die Zielerweiterung in den Argumenten an. ${output_file}.html
${no_cache} Deaktiviert das Konvertierungs-Caching und speichert die Ausgabe im Verzeichnis für automatisches Löschen, das beim Schließen von Vorschaufenstern bereinigt wird. ${no_cache}

Konvertierungs-Plugins akzeptieren auch die universellen Platzhalter (${input_file}, ${use_backslash}, ${seer_dir}, ${seer_exe}, ${seerviewer_exe}, ${7z}) und verwenden keine ${type_*}-Matcher-Token, da sie ihre Übereinstimmungen in formats statt in extensions deklarieren. Beide werden im gemeinsamen Abschnitt Platzhalter & Matching-Token weiter unten beschrieben.

Unterstützte ausführbare Dateien & Skript-Laufzeiten

  • Skripte: PowerShell-Skripte (.ps1, wird standardmäßig über PowerShell unterstützt). Für Python (.py), Node.js (.js) oder Batch (.bat) kompilieren Sie eine eigenständige .exe (z. B. mit PyInstaller) oder bündeln Sie den Interpreter im Paket.
  • Benutzerdefinierte Binärdateien: Eigenständige CLI-Programme, kompiliert aus C/C++, Rust, Go oder C#.

plugin.json-Beispiel (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-Plugins (SDK v3)

Für maximale Rendering-Leistung, tiefe Interaktivität oder Streaming-Ansichten unterstützt Seer native C++/Qt-Dynamic-Link-Libraries, die über QPluginLoader direkt in den Viewport geladen werden.

  • Technische Spezifikationen: C++17, Qt 6.8, MSVC 2022 (x64), CMake 3.22+.
  • Wesentliche Schnittstellen: Erben Sie von ViewerBase (Widget-Implementierung) und implementieren Sie ViewerPluginInterface (IID "seer.plugin.interface.preview/3").
  • Mindestversion der Anwendung: SDK v3-Plugins müssen "appMinVersion": "4.2.9" deklarieren.

Referenzprojekte

Projekt Zweck
F3DViewer 3D-Modell-Rendering und Panoramaansicht
OfficeViewer Office-Dokumente und CAD-Zeichnungen
FontViewer Überprüfung und Darstellung von Schriftarten
JsonTreeViewer Leistungsstarke interaktive JSON-Baumansicht
Collections Alle offiziellen und Community-Vorschau-Plugins

Steuerelement-Plugins

Steuerelement-Plugins fügen benutzerdefinierte Aktionsschaltflächen auf der linken Seite der unteren Steuerleiste im Vorschaufenster hinzu und ermöglichen schnelle Operationen und Integrationen externer Werkzeuge für die aktive Datei oder den aktiven Ordner.

Steuerelement-Plugin mit einem KI-Agenten erstellen

Ersetzen Sie den unten stehenden Platzhalter und geben Sie Ihrem Codierungs-Agenten die vollständige Anweisung:

Lesen und befolgen Sie die Seer-Steuerelement-Plugin-Entwicklungsanleitung unter https://raw.githubusercontent.com/ccseer/Seer-Controls/refs/heads/main/plugin_development_guide.md. Betrachten Sie sie als maßgebliche Quelle (Source of Truth) für Architektur, plugin.json, Implementierung, Validierung und Paketierung. Wenn die Anleitung nicht verfügbar ist, stoppen Sie und melden Sie dies, bevor Sie fortfahren.

Überprüfen Sie vor jeder Arbeit die folgende Requirement (Anforderung). Wenn sie fehlt, unveränderter Platzhaltertext ist oder zu ungenau für eine Implementierung ist, stellen Sie eine klärende Frage und warten Sie. Versuchen Sie nicht, die fehlende Anforderung zu erraten.

Sobald dies geklärt ist, implementieren Sie ein vollständiges, installierbares Steuerelement-Plugin gemäß dem Canonical v1-Prozessvertrag im aktuellen Arbeitsbereich. Nehmen Sie keine Änderungen an Seer selbst vor und bleiben Sie nicht bei Plänen oder Code-Snippets stehen.

Befolgen Sie jeden anwendbaren Validierungsschritt in der Anleitung und melden Sie die tatsächlichen Ergebnisse.

Requirement: [ERSETZEN SIE DIESEN PLATZHALTER durch Ihre Steuerelement-Plugin-Anforderung, z. B. VS Code im aktuellen Ordner öffnen oder absoluten Pfad in die Zwischenablage kopieren]

Architektur & Vertrag

  • Prozessmodell: Implementiert den Canonical v1-Prozessvertrag (backend: "process", capabilities: ["control"]). Seer führt das Hilfsprogramm über die Befehlszeile (CLI) aus.
  • Rückgabestatus & Fehlerberichterstattung:
    • Erfolg: Der Prozess wird mit Exit-Code 0 beendet (oder entspricht success_exit_codes). Wenn "close_after_success": true konfiguriert ist, schließt Seer das Vorschaufenster automatisch nach erfolgreicher Ausführung.
    • Fehler: Der Prozess wird mit einem Wert ungleich Null beendet. Alle in die Standardfehlerausgabe (stderr) geschriebenen Inhalte werden von Seer erfasst und als In-App-Toast-Fehlermeldung angezeigt.
  • Benutzeroberfläche & Interaktion: Steuerelement-Plugins zeichnen keine eigenen dauerhaften Hauptfenster. Typische Helfer führen Hintergrundaufgaben aus, kopieren Text in die Zwischenablage oder rufen native Windows-Systemdialoge auf (z. B. Öffnen mit, Eigenschaften, Freigeben).

Befehlszeilen-Platzhalter

Ein Steuerelement-Hilfsprogramm empfängt ausschließlich den Zielpfad — ${input_file} sowie die universellen Platzhalter (${use_backslash}, ${seer_dir}, ${seer_exe}, ${seerviewer_exe}, ${7z}), die im gemeinsamen Abschnitt Platzhalter & Matching-Token weiter unten aufgeführt sind.

${output_dir}, ${output_file} und ${no_cache} werden in einem Steuerelement-Manifest abgelehnt. Ein Steuerelement, das einen temporären Speicherort benötigt, muss diesen selbst auflösen: zuerst sein eigenes Programmverzeichnis, dann das temporäre Systemverzeichnis.

plugin.json-Beispiele (Control)

Beispiel 1: Ordneraktion (Terminal Here)

Die Konfiguration des offiziellen Terminal Here-Plugins:

{
  "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
  ]
}

Beispiel 2: Dateiaktion (Explorer Open With)

Die Konfiguration des offiziellen Explorer Open With-Plugins:

{
  "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
  ]
}

Um das Vorschaufenster bei Erfolg automatisch zu schließen, setzen Sie "close_after_success": true im Manifest.

Den Quellcode offizieller Steuerelement-Plugins finden Sie unter: ccseer/Seer-Controls.

Eigenschaften-Plugins

Eigenschaften-Plugins erweitern die Metadaten-Prüfungs-Engine von Seer. Wenn ein Benutzer Strg + I auf einer in der Vorschau angezeigten Datei oder einem Ordner drückt (oder das Eigenschaftenfenster öffnet), extrahieren passende Eigenschaften-Plugins strukturierte Metadaten sowie grafische Oszilloskope/Diagramme und zeigen diese an.

Eigenschaften-Plugin mit einem KI-Agenten erstellen

Ersetzen Sie den unten stehenden Platzhalter und geben Sie Ihrem Codierungs-Agenten die vollständige Anweisung:

Lesen und befolgen Sie die Seer-Eigenschaften-Plugin-Entwicklungsanleitung unter https://raw.githubusercontent.com/ccseer/Seer-Properties/refs/heads/main/plugin_development_guide.md. Betrachten Sie sie als maßgebliche Quelle (Source of Truth) für Architektur, plugin.json, Implementierung, Validierung und Paketierung. Wenn die Anleitung nicht verfügbar ist, stoppen Sie und melden Sie dies, bevor Sie fortfahren.

Überprüfen Sie vor jeder Arbeit die folgende Requirement (Anforderung). Wenn sie fehlt, unveränderter Platzhaltertext ist oder zu ungenau für eine Implementierung ist, stellen Sie eine klärende Frage und warten Sie. Versuchen Sie nicht, die fehlende Anforderung zu erraten.

Sobald dies geklärt ist, implementieren Sie ein vollständiges, installierbares Eigenschaften-Plugin gemäß dem Canonical v1-Prozessvertrag und der Schema 1-JSON-Spezifikation im aktuellen Arbeitsbereich. Nehmen Sie keine Änderungen an Seer selbst vor und bleiben Sie nicht bei Plänen oder Code-Snippets stehen.

Befolgen Sie jeden anwendbaren Validierungsschritt in der Anleitung und melden Sie die tatsächlichen Ergebnisse.

Requirement: [ERSETZEN SIE DIESEN PLATZHALTER durch Ihre Eigenschaften-Plugin-Anforderung, z. B. Extrahieren und Anzeigen detaillierter Audio-/Videocodec-Parameter und Bitraten für MP4-Dateien]

Architektur & Vertrag

  • Prozessmodell: Implementiert den Canonical v1-Prozessvertrag (backend: "process", capabilities: ["property"], result_schema: 1).
  • CLI-Aufruf: Die Host-Anwendung übergibt: --input "${input_file}" --output "${output_file}" --output-dir "${output_dir}"
  • Ausgabeveröffentlichung:
    • Der Host erweitert ${output_file} zu einem Basispfad ohne Dateierweiterung (z. B. <requestDir>/<md5>).
    • Das Plugin muss sein JSON-Ergebnis in <output-base>.json (d. h. ${output_file}.json) schreiben.
    • Visuelle Anhänge (Diagramme, Histogramme, Vektorskope) müssen in ${output_dir} gespeichert werden.
    • Einschränkung: ${no_cache} ist für Eigenschaften-Plugins verboten.
  • Exit-Code-Richtlinie:
    • Erwartete Domänenergebnisse (z. B. nicht signierte Datei, kein Git-Repository, leere Metadaten) müssen mit Code 0 beendet werden und den Status in JSON beschreiben.
    • Ein Exit-Code ungleich Null darf nur bei schwerwiegenden Fehlern oder ungültigen Aufrufen zurückgegeben werden (Exits ungleich Null führen dazu, dass der Host das Anforderungsverzeichnis löscht).

Befehlszeilen-Platzhalter

Platzhalter Beschreibung Beispiel
${output_file} Vom Host zugewiesener Basispfad ohne Erweiterung; das Ergebnis muss in ${output_file}.json geschrieben werden. C:\Users\...\request_dir\md5_hash
${output_dir} Vom Host zugewiesenes Anforderungsverzeichnis für Anhänge (Diagramme, Bilder). C:\Users\...\request_dir

Zusätzlich gelten die im gemeinsamen Abschnitt Platzhalter & Matching-Token aufgeführten universellen Platzhalter sowie die ${type_*}-Matcher-Token. ${no_cache} wird für Eigenschaften-Plugins abgelehnt.

Spezifikation für Ergebnis-JSON (Schema 1)

Die Ergebnisdatei ${output_file}.json muss gültiges UTF-8-JSON sein, das result_schema: 1 und ein data-Objekt enthält:

1. Flache Zeilen (Flat Rows)

Nur wenn das Gesamtergebnis eine einzelne Zeile ist (z. B. SHA-256):

{
  "result_schema": 1,
  "data": {
    "SHA-256": "2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824"
  }
}

2. Untergruppe mit geordnetem Array von Einzelschlüssel-Objekten (Standard)

Alles, was mehr als eine Zeile erzeugt, muss als genau eine Untergruppe veröffentlicht werden, die nach dem Plugin benannt ist – lose Zeilen auf oberster Ebene kollidieren mit den Zeilen jedes anderen Plugins, die der Inspektor in einer einzigen Liste anzeigt. Die Array-Reihenfolge ist die Anzeigereihenfolge, daher ist dies die einzige Form, bei der das Plugin die Reihenfolge der Zeilen selbst bestimmen kann:

{
  "result_schema": 1,
  "data": {
    "Git": {
      "value": [
        { "Repository": "ccseer/Seer-Properties" },
        { "Branch": "main" },
        { "Status": "Clean" }
      ]
    }
  }
}

3. Untergruppe mit Wertobjekt

value kann auch ein einfaches Objekt sein, aber seine Zeilen werden in der Schlüsselreihenfolge des geparsten Objekts gerendert, die das Plugin nicht steuern kann. Verwenden Sie es nur, wenn die Zeilenreihenfolge keine Rolle spielt:

{
  "result_schema": 1,
  "data": {
    "Git": {
      "value": {
        "Branch": "main",
        "Status": "Working tree clean"
      }
    }
  }
}

4. Grafische Diagramme & Oszilloskope (Bildanhänge)

Speichern Sie generierte PNG-Diagramme in ${output_dir} und deklarieren Sie sie mit {"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-Beispiel (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
      ]
    }
  }
}

Den Quellcode offizieller Eigenschaften-Plugins finden Sie unter: ccseer/Seer-Properties.


Platzhalter & Matching-Token

Seer löst diese Token in arguments auf. Welche Platzhalter eine Fähigkeit verwenden darf, wird vom Host beim Laden des Manifests validiert — ein nicht unterstütztes Token ist ein Ladefehler des Manifests, keine Laufzeitwarnung.

Für jede Funktion verfügbar

Platzhalter Beschreibung Beispiel
${input_file} Absoluter Pfad der in der Vorschau angezeigten Datei oder des Ordners. C:\Docs\sample.pdf
${use_backslash} Optionales Flag zur Formatierung von Pfadtrennzeichen als native Windows-Backslashes (\). ${use_backslash}
${seer_dir} Verzeichnis, das Seer.exe enthält. C:\Program Files\Seer
${seer_exe} Absoluter Pfad zu Seer.exe. C:\Program Files\Seer\Seer.exe
${seerviewer_exe} Absoluter Pfad zu SeerViewer.exe. C:\Program Files\Seer\SeerViewer.exe
${7z} Absoluter Pfad zur mitgelieferten 7z.exe. C:\Program Files\Seer\plugins\7z.exe
${theme} Das aktuelle Seer-Design, expandiert zu dark oder light. Ein Daten-Platzhalter, der nicht als alleiniger command verwendet werden kann. dark
${lang} Die aktuelle Seer-Sprache, expandiert im BCP-47-Format (z. B. en, zh-CN). Ein Daten-Platzhalter, der nicht als alleiniger command verwendet werden kann. en
${screenshot} Absoluter Pfad zu einem temporären PNG-Screenshot der aktuellen Ansicht. C:\Users\Username\AppData\Local\Temp\Seer\screenshot\view_1.png

Funktionsspezifische Platzhalter

Platzhalter Betrachter (Preview) Steuerelement (Control) Eigenschaften (Property)
${output_file} Basis-Ausgabepfad; Zieldateierweiterung anhängen, z. B. ${output_file}.html Nicht unterstützt Basispfad ohne Erweiterung; Ergebnis muss in ${output_file}.json geschrieben werden
${output_dir} Nicht unterstützt Nicht unterstützt Anforderungsverzeichnis für Anhänge (Diagramme, Bilder)
${no_cache} Deaktiviert Konvertierungs-Caching und speichert Ausgabe im Verzeichnis für automatisches Löschen Nicht unterstützt Nicht unterstützt

Ein Steuerelement-Hilfsprogramm empfängt ausschließlich den Zielpfad. Wenn es einen temporären Speicherort benötigt, muss es diesen selbst auflösen: zuerst sein eigenes Programmverzeichnis, dann das temporäre Systemverzeichnis.

extensions Matcher-Token

Neben Standarderweiterungen (z. B. ["png", "zip"]) akzeptiert extensions auch Token, die breite Kategorien abdecken. Diese gelten für Plugins, die extensions deklarieren (Steuerelement und Eigenschaften); Konvertierungs-Plugins deklarieren stattdessen formats und verwenden diese nicht.

Token Beschreibung
${type_folder} Entspricht Verzeichnissen und Ordnern.
${type_file} Entspricht allen Dateien (einschließlich Dateien ohne Erweiterung).
${type_all} Entspricht allem (sowohl Dateien als auch Ordnern).
${type_image} Entspricht Bildern, die vom nativen Bildbetrachter von Seer unterstützt werden.
${type_media} Entspricht Audio- und Videoformaten.
${type_web} Entspricht Webdateien wie HTML und Markdown.
${type_text} Entspricht Text-, Code- und Konfigurationsdateien.
${type_pdf} Entspricht PDF-Dokumenten.
${type_none} Entspricht Dateien außerhalb der obigen Kategorien (z. B. Archive, ausführbare Programme).

Paketierung und In-App-Tests

Nach der Entwicklung muss das Plugin für die Installation in ein Standard-ZIP-Archiv gepackt werden. Dies gilt für alle Plugin-Funktionen.

Paketierungsstandards

  1. Paketdokumentation: Jedes eigenständige Steuerelement- oder Eigenschaften-Paket sollte eine PACKAGE_README.md (Beschreibung plus Tabelle ## Options & Arguments) enthalten, die als README.md im Stammverzeichnis des Pakets abgelegt wird.
  2. Flaches Stammlayout: Für Steuerelement- und Eigenschaften-Pakete (Canonical v1) müssen plugin.json, die ausführbare Datei bzw. das Skript, die README.md und Laufzeitabhängigkeiten direkt im Stammverzeichnis des Archivs liegen. Verpacken Sie sie nicht in einen zusätzlichen Unterordner und mischen Sie niemals flache und verschachtelte Einträge — der Host weist ein Archiv mit mehrdeutigem Paketstammverzeichnis zurück.

    Ältere Konvertierungs-Plugins, die aus dem Online-Katalog installiert werden, verwenden das umgekehrte Layout: einen Ordner auf oberster Ebene <archive-name>/, der die Paketdateien umschließt. Befolgen Sie für diesen Fall die Anleitung für Konvertierungs-Plugins; die beiden Layouts sind nicht austauschbar.

  3. Maximale Kompression: Es wird 7-Zip mit maximaler Deflate-Kompression empfohlen: powershell 7z a -tzip -mx=9 my-plugin-1.0.0.zip .\*

Lokale In-App-Tests

  1. Öffnen Sie die Seer-Einstellungen und navigieren Sie zum Zielbereich:
    • Betrachter-Plugins: Einstellungen > Plugins -> Reiter Lokal
    • Steuerelement-Plugins: Einstellungen > Steuerung
    • Eigenschaften-Plugins: Einstellungen > Eigenschaften
  2. Klicken Sie unter der Liste auf + und wählen Sie das .zip-Archiv aus (oder die plugin.json aus Ihrem lokalen Entwicklungsordner).
  3. Seer validiert das Paket automatisch und lädt es. Überprüfen Sie die Einstellungen und klicken Sie auf OK, um es zu aktivieren.