In questa pagina

Sviluppo e implementazione di plugin

Seer fornisce un'architettura di plugin modulare che consente agli sviluppatori di estendere le sue funzionalità su più superfici. Seleziona una funzionalità del plugin di seguito per esplorarne le specifiche di sviluppo:

Plugin di visualizzazione (Viewers)

I plugin di visualizzazione estendono la finestra di anteprima della barra spaziatrice. Supportano due architetture di implementazione: Plugin di conversione (Convert) e Plugin DLL (SDK v3).

Creare un plugin di visualizzazione con un agente IA

Sostituisci il segnaposto sottostante, quindi fornisci l'istruzione completa al tuo agente di programmazione:

Leggi e segui la guida allo sviluppo dei plugin di Seer all'indirizzo https://raw.githubusercontent.com/ccseer/Seer-Plugins/refs/heads/master/plugin_development_guide.md. Considerala come l'unica fonte di verità per architettura, plugin.json, implementazione, convalida e creazione del pacchetto. Se la guida non è disponibile, fermati e segnalalo prima di procedere.

Prima di iniziare qualsiasi attività, esamina la Requirement qui sotto. Se è mancante, contiene il testo segnaposto invariato o è troppo ambigua per essere implementata, poni una domanda di chiarimento e attendi. Non dedurre il requisito mancante.

Una volta chiarito, scegli Convert o DLL e giustifica brevemente la scelta; quindi implementa un plugin completo e installabile nello spazio di lavoro corrente. Non modificare Seer stesso e non fermarti a un piano o a frammenti di codice.

Segui ogni passaggio di convalida applicabile indicato nella guida e segnala i risultati effettivi. Esegui un test di anteprima nell'app Seer quando possibile; in caso contrario, dichiara esplicitamente che la verifica a runtime non è stata eseguita.

Requirement: [SOSTITUISCI QUESTO SEGNAPOSTO con il requisito del tuo plugin di visualizzazione, ad es. rendering di diagrammi mermaid nell'anteprima markdown]

Plugin di conversione (Convert)

Seer tratta i plugin di conversione come esecutori da riga di comando esterni. Quando un utente preme Spazio su un file supportato, Seer avvia il programma configurato, passando i percorsi dei file tramite segnaposto. Il programma converte il file in un formato supportato nativamente da Seer (HTML, JSON, TXT, immagini, ecc.), che Seer carica e visualizza una volta terminato il processo.

Variabili segnaposto

Segnaposto Descrizione Esempio
${output_file} Percorso base del file di output; aggiungi l'estensione di destinazione negli argomenti. ${output_file}.html
${no_cache} Disabilita la memorizzazione nella cache della conversione e archivia l'output nella directory a cancellazione automatica, che viene svuotata alla chiusura delle finestre di anteprima. ${no_cache}

I plugin di conversione accettano anche i segnaposto universali (${input_file}, ${use_backslash}, ${seer_dir}, ${seer_exe}, ${seerviewer_exe}, ${7z}) e non utilizzano i token di corrispondenza ${type_*} poiché dichiarano le loro corrispondenze in formats invece di extensions. Entrambi sono trattati nella sezione condivisa Segnaposto e token di corrispondenza più in basso.

Eseguibili e ambienti di script supportati

  • Script: Script PowerShell (.ps1, supportati nativamente tramite PowerShell). Per Python (.py), Node.js (.js) o script batch (.bat), compila in un eseguibile autonomo .exe (ad es. con PyInstaller) o includi l'interprete all'interno del pacchetto.
  • Binari personalizzati: Eseguibili CLI autonomi compilati da C/C++, Rust, Go o C#.

Esempio di 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"
}

Plugin DLL (SDK v3)

Per massime prestazioni di rendering, interattività avanzata o visualizzazioni in streaming, Seer supporta librerie a collegamento dinamico native C++/Qt caricate direttamente nella vista tramite QPluginLoader.

  • Specifiche tecniche: C++17, Qt 6.8, MSVC 2022 (x64), CMake 3.22+.
  • Interfacce essenziali: Ereditare da ViewerBase (implementazione del widget) e implementare ViewerPluginInterface (IID "seer.plugin.interface.preview/3").
  • Versione minima dell'app: I plugin SDK v3 devono dichiarare "appMinVersion": "4.2.9".

Progetti di riferimento

Progetto Scopo
F3DViewer Rendering di modelli 3D e visualizzazione panoramica
OfficeViewer Documenti Office e disegni CAD
FontViewer Ispezione e rendering dei glifi dei font
JsonTreeViewer Struttura ad albero JSON interattiva ad alte prestazioni
Collections Tutti i plugin di visualizzazione ufficiali e della community

Plugin barra di controllo

I plugin della barra di controllo aggiungono pulsanti di azione personalizzati sul lato sinistro della barra di controllo inferiore nella finestra di anteprima, consentendo operazioni rapide e integrazioni con strumenti esterni per il file o la cartella corrente.

Creare un plugin barra di controllo con un agente IA

Sostituisci il segnaposto sottostante, quindi fornisci l'istruzione completa al tuo agente di programmazione:

Leggi e segui la guida allo sviluppo dei plugin della barra di controllo di Seer all'indirizzo https://raw.githubusercontent.com/ccseer/Seer-Controls/refs/heads/main/plugin_development_guide.md. Considerala come l'unica fonte di verità per architettura, plugin.json, implementazione, convalida e creazione del pacchetto. Se la guida non è disponibile, fermati e segnalalo prima di procedere.

Prima di iniziare qualsiasi attività, esamina la Requirement qui sotto. Se è mancante, contiene il testo segnaposto invariato o è troppo ambigua per essere implementata, poni una domanda di chiarimento e attendi. Non dedurre il requisito mancante.

Una volta chiarito, implementa un plugin di controllo completo e installabile che rispetti il contratto di processo Canonical v1 nello spazio di lavoro corrente. Non modificare Seer stesso e non fermarti a un piano o a frammenti di codice.

Segui ogni passaggio di convalida applicabile indicato nella guida e segnala i risultati effettivi.

Requirement: [SOSTITUISCI QUESTO SEGNAPOSTO con il requisito del tuo plugin di controllo, ad es. aprire VS Code nella cartella corrente o copiare il percorso assoluto negli appunti]

Architettura e contratto

  • Modello di processo: Implementa il contratto de processo Canonical v1 (backend: "process", capabilities: ["control"]). Seer esegue l'helper tramite CLI.
  • Stato restituito e segnalazione errori:
    • Successo: Il processo termina con codice 0 (o corrisponde a success_exit_codes). Se è configurato "close_after_success": true, Seer chiude automaticamente la finestra di anteprima dopo l'esecuzione con successo.
    • Errore: Il processo termina con un codice diverso da zero. Tutto ciò che viene scritto sullo standard error (stderr) viene catturato da Seer e mostrato come una notifica di errore Toast nell'app.
  • Interfaccia utente e interazione: I plugin della barra di controllo non disegnano finestre principali permanenti proprie. I tipici helper eseguono attività in background, copiano testo negli appunti o richiamano finestre di dialogo di sistema native di Windows (ad es. Apri con, Proprietà, Condividi).

Segnaposto per la riga di comando

Un helper di controllo riceve solo il percorso di destinazione: ${input_file} oltre ai segnaposto universali (${use_backslash}, ${seer_dir}, ${seer_exe}, ${seerviewer_exe}, ${7z}) elencati nella sezione condivisa Segnaposto e token di corrispondenza sottostante.

${output_dir}, ${output_file} e ${no_cache} vengono rifiutati in un manifesto di controllo. Un controllo che necessita di una posizione temporanea deve risolverla autonomamente: prima la directory del proprio eseguibile, poi la directory temporanea di sistema.

Esempi di plugin.json (Control)

Esempio 1: Azione per cartella (Terminal Here)

La configurazione ufficiale del plugin 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
  ]
}

Esempio 2: Azione per file (Explorer Open With)

La configurazione ufficiale del plugin 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
  ]
}

Per chiudere automaticamente la finestra di anteprima in caso di successo, imposta "close_after_success": true nel manifesto.

Per il codice sorgente dei plugin di controllo ufficiali, consulta: ccseer/Seer-Controls.

Plugin delle proprietà

I plugin delle proprietà estendono il motore di ispezione dei metadati di Seer. Quando un utente preme Ctrl + I su un file o una cartella in anteprima (o apre la finestra Proprietà), i plugin delle proprietà corrispondenti estraggono e visualizzano metadati strutturati e grafici/istogrammi visivi.

Creare un plugin delle proprietà con un agente IA

Sostituisci il segnaposto sottostante, quindi fornisci l'istruzione completa al tuo agente di programmazione:

Leggi e segui la guida allo sviluppo dei plugin delle proprietà di Seer all'indirizzo https://raw.githubusercontent.com/ccseer/Seer-Properties/refs/heads/main/plugin_development_guide.md. Considerala come l'unica fonte di verità per architettura, plugin.json, implementazione, convalida e creazione del pacchetto. Se la guida non è disponibile, fermati e segnalalo prima di procedere.

Prima di iniziare qualsiasi attività, esamina la Requirement qui sotto. Se è mancante, contiene il testo segnaposto invariato o è troppo ambigua per essere implementata, poni una domanda di chiarimento e attendi. Non dedurre il requisito mancante.

Una volta chiarito, implementa un plugin delle proprietà completo e installabile che rispetti il contratto di processo Canonical v1 e la specifica Schema 1 JSON nello spazio di lavoro corrente. Non modificare Seer stesso e non fermarti a un piano o a frammenti di codice.

Segui ogni passaggio di convalida applicabile indicato nella guida e segnala i risultati effettivi.

Requirement: [SOSTITUISCI QUESTO SEGNAPOSTO con il requisito del tuo plugin delle proprietà, ad es. estrarre e visualizzare parametri dettagliati del codec audio/video e bitrate per file MP4]

Architettura e contratto

  • Modello di processo: Implementa il contratto di processo Canonical v1 (backend: "process", capabilities: ["property"], result_schema: 1).
  • Invocazione da CLI: L'host passa i seguenti parametri: --input "${input_file}" --output "${output_file}" --output-dir "${output_dir}"
  • Pubblicazione dell'output:
    • L'host espande ${output_file} in un percorso base senza estensione (ad es. <requestDir>/<md5>).
    • Il plugin deve scrivere il proprio risultato JSON in <output-base>.json (ovvero ${output_file}.json).
    • Gli allegati visivi (grafici, istogrammi, vettorscopi) devono essere salvati in ${output_dir}.
    • Vincolo: ${no_cache} è proibito per i plugin delle proprietà.
  • Politica dei codici di uscita:
    • I risultati di dominio previsti (ad es. file non firmato, non è un repository git, metadati vuoti) devono uscire con codice 0 e descrivere lo stato nel JSON.
    • Esci con un codice diverso da zero solo in caso di errori irreversibili o chiamate non valide (le uscite diverse da zero inducono l'host a cancellare la directory della richiesta).

Segnaposto per la riga di comando

Segnaposto Descrizione Esempio
${output_file} Percorso base assegnato dall'host senza estensione; il risultato deve essere scritto in ${output_file}.json. C:\Users\...\request_dir\md5_hash
${output_dir} Directory di richiesta assegnata dall'host per gli allegati (grafici, immagini). C:\Users\...\request_dir

Oltre ai segnaposto universali elencati nella sezione condivisa Segnaposto e token di corrispondenza sottostante, che descrive anche i token di corrispondenza ${type_*}. ${no_cache} viene rifiutato per i plugin delle proprietà.

Specifica del risultato JSON (Schema 1)

Il file di risultato ${output_file}.json deve essere un JSON UTF-8 valido contenente result_schema: 1 e un oggetto data:

1. Righe semplici (Flat Rows)

Solo quando l'intero risultato è una singola riga (ad es. SHA-256):

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

2. Sottogruppo con array ordinato di oggetti a chiave singola (Predefinito)

Tutto ciò che produce più di una riga deve essere pubblicato come esattamente un sottogruppo intitolato al plugin: le righe isolate di primo livello collidono con le righe di tutti gli altri plugin, che l'Inspector mostra in un unico elenco. L'ordine dell'array è l'ordine di visualizzazione, quindi questa è l'unica forma che consente al plugin di decidere la sequenza con cui appaiono le righe:

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

3. Sottogruppo con un oggetto valore

value può anche essere un oggetto semplice, ma le sue righe vengono visualizzate nell'ordine delle chiavi dell'oggetto analizzato, che il plugin non può controllare. Usalo solo quando l'ordine delle righe non importa:

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

4. Grafici e visualizzazioni (Allegati immagine)

Salva i grafici PNG generati in ${output_dir} e dichiarali con {"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" } }
      ]
    }
  }
}

Esempio di 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
      ]
    }
  }
}

Per il codice sorgente dei plugin delle proprietà ufficiali, consulta: ccseer/Seer-Properties.


Segnaposto e token di corrispondenza

Seer espande questi token in arguments. I segnaposto utilizzabili da ciascuna funzionalità vengono convalidati dall'host al caricamento del manifesto: un token non supportato è un errore di caricamento del manifesto, non un avviso a runtime.

Disponibili per ogni funzionalità

Segnaposto Descrizione Esempio
${input_file} Percorso assoluto del file o della cartella in anteprima. C:\Docs\sample.pdf
${use_backslash} Flag opzionale per formattare i separatori di percorso utilizzando i backslash nativi di Windows (\). ${use_backslash}
${seer_dir} Directory contenente Seer.exe. C:\Program Files\Seer
${seer_exe} Percorso assoluto di Seer.exe. C:\Program Files\Seer\Seer.exe
${seerviewer_exe} Percorso assoluto di SeerViewer.exe. C:\Program Files\Seer\SeerViewer.exe
${7z} Percorso assoluto di 7z.exe fornito con Seer. C:\Program Files\Seer\plugins\7z.exe
${theme} Tema corrente di Seer, espanso in dark o light. È un segnaposto di dati e non può essere usato come command intero. dark
${lang} Lingua corrente di Seer, espansa in formato BCP-47 (es. en, zh-CN). È un segnaposto di dati e non può essere usato come command intero. en
${screenshot} Percorso assoluto di uno screenshot PNG temporaneo della vista corrente. C:\Users\Username\AppData\Local\Temp\Seer\screenshot\view_1.png

Segnaposto specifici per funzionalità

Segnaposto Anteprima Controllo Proprietà
${output_file} Percorso di output base; aggiungi l'estensione di destinazione, ad es. ${output_file}.html Non supportato Percorso base senza estensione; il risultato deve essere scritto in ${output_file}.json
${output_dir} Non supportato Non supportato Directory di richiesta per allegati (grafici, immagini)
${no_cache} Disabilita la memorizzazione nella cache della conversione e archivia l'output nella directory di cancellazione automatica Non supportato Non supportato

Un helper di controllo riceve solo il percorso di destinazione. Se necessita di una posizione temporanea, deve risolverla autonomamente: prima la directory del proprio eseguibile, poi la directory temporanea di sistema.

Token di corrispondenza di extensions

Oltre alle estensioni standard (ad es. ["png", "zip"]), extensions accetta token che corrispondono ad ampie categorie. Questi si applicano ai plugin che dichiarano extensions (Controllo e Proprietà); i plugin di conversione dichiarano invece formats e non li utilizzano.

Token Descrizione
${type_folder} Corrisponde a directory e cartelle.
${type_file} Corrisponde a tutti i file (inclusi i file senza estensione).
${type_all} Corrisponde a tutto (sia file che cartelle).
${type_image} Corrisponde alle immagini supportate dal visualizzatore di immagini nativo di Seer.
${type_media} Corrisponde a formati audio e video.
${type_web} Corrisponde a file web HTML e Markdown.
${type_text} Corrisponde a file di testo, codice e configurazione.
${type_pdf} Corrisponde a documenti PDF.
${type_none} Corrisponde a file esterni alle categorie precedenti (ad es. archivi, eseguibili).

Creazione del pacchetto e test nell'app

Una volta sviluppato, il plugin deve essere impacchettato in un archivio ZIP standard per l'installazione. Questo vale per tutte le funzionalità del plugin.

Standard di creazione del pacchetto

  1. Documentazione del pacchetto: Ogni pacchetto autonomo di Controllo o Proprietà deve includere un file PACKAGE_README.md (descrizione più tabella ## Options & Arguments), posizionato come README.md nella radice del pacchetto.
  2. Struttura radice piatta: Per i pacchetti di Controllo e Proprietà (Canonical v1), plugin.json, l'eseguibile/script, README.md e le dipendenze di runtime devono risiedere direttamente nella radice dell'archivio. Non racchiuderli all'interno di un'ulteriore cartella e non mescolare mai voci piatte e annidate: l'host rifiuta un archivio con una radice del pacchetto ambigua.

    I plugin di conversione legacy installati dal catalogo online utilizzano la struttura opposta: una cartella di livello superiore <archive-name>/ che racchiude i file del pacchetto. Segui la guida dei plugin di conversione in quel caso; i due layout non sono intercambiabili.

  3. Compressione massima: Si consiglia 7-Zip con compressione Deflate massima: powershell 7z a -tzip -mx=9 my-plugin-1.0.0.zip .\*

Test locali nell'app

  1. Apri le Impostazioni di Seer e vai alla sezione di destinazione:
    • Plugin di visualizzazione: Impostazioni > Plugin -> scheda Locale
    • Plugin barra di controllo: Impostazioni > Controlli
    • Plugin delle proprietà: Impostazioni > Proprietà
  2. Fai clic su + sotto l'elenco e seleziona l'archivio .zip (o plugin.json dalla tua cartella locale).
  3. Seer convalida automaticamente il pacchetto e lo carica. Verifica le impostazioni e fai clic su OK per attivarlo.