Sur cette page
Développement et implémentation de plugins
Seer fournit une architecture de plugins modulaire qui permet aux développeurs d'étendre ses capacités sur plusieurs interfaces. Sélectionnez une capacité de plugin ci-dessous pour explorer ses spécifications de développement :
Plugins de prévisualisation (Viewers)
Les plugins de prévisualisation étendent la fenêtre d'aperçu de la barre d'espace. Ils prennent en charge deux architectures d'implémentation : les plugins de conversion (Convert) et les plugins DLL (SDK v3).
Créer un plugin de prévisualisation avec un agent IA
Remplacez le texte d'emplacement ci-dessous, puis donnez l'instruction complète à votre agent de codage :
Lisez et suivez le guide de développement de plugins Seer disponible sur https://raw.githubusercontent.com/ccseer/Seer-Plugins/refs/heads/master/plugin_development_guide.md. Considérez-le comme la source unique de vérité pour l'architecture, plugin.json, l'implémentation, la validation et l'empaquetage. Si le guide n'est pas disponible, arrêtez-vous et signalez-le avant de continuer.
Avant tout travail, inspectez la Requirement ci-dessous. Si elle est manquante, inchangée par rapport au texte d'origine ou trop ambiguë pour être implémentée, posez une question de clarification et attendez. N'induisez pas l'exigence manquante.
Une fois clair, choisissez Convert ou DLL et justifiez brièvement ce choix, puis implémentez un plugin complet et installable dans l'espace de travail actuel. Ne modifiez pas Seer lui-même et ne vous arrêtez pas à un plan ou à des extraits de code.
Suivez chaque étape de validation applicable dans le guide et signalez les résultats réels. Exécutez un test de prévisualisation dans l'application Seer si possible ; sinon, indiquez explicitement que la vérification à l'exécution n'a pas été effectuée.
Requirement: [REMPLACEZ CE TEXTE D'EMPLACEMENT par votre exigence de plugin de prévisualisation, ex. afficher les diagrammes mermaid dans l'aperçu markdown]
Plugins de conversion (Convert)
Seer traite les plugins de conversion comme des exécuteurs de ligne de commande externes. Lorsqu'un utilisateur appuie sur Espace sur un fichier pris en charge, Seer lance le programme configuré en transmettant les chemins de fichiers via des variables d'emplacement. Le programme convertit le fichier dans un format pris en charge nativement par Seer (HTML, JSON, TXT, images, etc.), que Seer charge et affiche une fois le processus terminé.
Variables d'emplacement
| Variable | Description | Exemple |
|---|---|---|
${output_file} |
Chemin de base du fichier de sortie ; ajoutez l'extension cible dans les arguments. | ${output_file}.html |
${no_cache} |
Désactive la mise en cache de la conversion et enregistre la sortie dans le répertoire de suppression automatique, qui est purgé à la fermeture des fenêtres d'aperçu. | ${no_cache} |
Les plugins de conversion acceptent également les variables universelles (${input_file}, ${use_backslash}, ${seer_dir}, ${seer_exe}, ${seerviewer_exe}, ${7z}) et n'utilisent pas les jetons de correspondance ${type_*} car ils déclarent leurs correspondances dans formats plutôt que dans extensions. Ces deux éléments sont décrits dans la section partagée Variables et jetons de correspondance ci-dessous.
Exécutables et environnements de script pris en charge
- Scripts : Scripts PowerShell (
.ps1, pris en charge nativement via PowerShell). Pour Python (.py), Node.js (.js) ou les fichiers de commandes (.bat), compilez-les en un exécutable autonome.exe(ex. avec PyInstaller) ou intégrez l'interpréteur dans le package. - Binaires personnalisés : Exécutables CLI autonomes compilés à partir de C/C++, Rust, Go ou C#.
Exemple de 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"
}
Plugins DLL (SDK v3)
Pour des performances de rendu maximales, une interactivité poussée ou des vues en flux continu, Seer prend en charge les bibliothèques de liens dynamiques C++/Qt natives chargées directement dans la zone d'affichage via QPluginLoader.
- Spécifications techniques : C++17, Qt 6.8, MSVC 2022 (x64), CMake 3.22+.
- Interfaces essentielles : Hériter de
ViewerBase(implémentation du widget) et implémenterViewerPluginInterface(IID"seer.plugin.interface.preview/3"). - Version minimale de l'application : Les plugins SDK v3 doivent déclarer
"appMinVersion": "4.2.9".
Projets de référence
| Projet | Objectif |
|---|---|
| F3DViewer | Rendu de modèles 3D et vue panoramique |
| OfficeViewer | Documents Office et dessins CAD |
| FontViewer | Inspection et rendu des glyphes de polices |
| JsonTreeViewer | Arborescence JSON interactive à haute performance |
| Collections | Tous les plugins de prévisualisation officiels et communautaires |
Plugins de barre de contrôle
Les plugins de barre de contrôle ajoutent des boutons d'action personnalisés sur le côté gauche de la barre de contrôle inférieure dans la fenêtre d'aperçu, permettant des opérations rapides et des intégrations d'outils externes pour le fichier ou dossier actif.
Créer un plugin de barre de contrôle avec un agent IA
Remplacez le texte d'emplacement ci-dessous, puis donnez l'instruction complète à votre agent de codage :
Lisez et suivez le guide de développement de plugins de contrôle Seer disponible sur https://raw.githubusercontent.com/ccseer/Seer-Controls/refs/heads/main/plugin_development_guide.md. Considérez-le comme la source unique de vérité pour l'architecture, plugin.json, l'implémentation, la validation et l'empaquetage. Si le guide n'est pas disponible, arrêtez-vous et signalez-le avant de continuer.
Avant tout travail, inspectez la Requirement ci-dessous. Si elle est manquante, inchangée par rapport au texte d'origine ou trop ambiguë pour être implémentée, posez une question de clarification et attendez. N'induisez pas l'exigence manquante.
Une fois clair, implémentez un plugin de contrôle complet et installable respectant le contrat de processus Canonical v1 dans l'espace de travail actuel. Ne modifiez pas Seer lui-même et ne vous arrêtez pas à un plan ou à des extraits de code.
Suivez chaque étape de validation applicable dans le guide et signalez les résultats réels.
Requirement: [REMPLACEZ CE TEXTE D'EMPLACEMENT par votre exigence de plugin de contrôle, ex. ouvrir VS Code dans le répertoire actuel ou copier le chemin absolu dans le presse-papiers]
Architecture et contrat
- Modèle de processus : Implémente le contrat de processus Canonical v1 (
backend: "process",capabilities: ["control"]). Seer exécute l'outil auxiliaire via la CLI. - Code de retour et rapport d'erreurs :
- Succès : Le processus se termine avec le code
0(ou correspond àsuccess_exit_codes). Si"close_after_success": trueest configuré, Seer ferme automatiquement la fenêtre d'aperçu après le succès de l'exécution. - Échec : Le processus se termine avec un code non nul. Tout ce qui est écrit sur la sortie d'erreur standard (
stderr) est capturé par Seer et affiché sous forme de notification d'échec Toast dans l'application.
- Succès : Le processus se termine avec le code
- Interface utilisateur et interaction : Les plugins de barre de contrôle ne dessinent pas de fenêtre principale permanente qui leur soit propre. Les outils auxiliaires typiques exécutent des tâches en arrière-plan, copient du texte dans le presse-papiers ou appellent des boîtes de dialogue système natives de Windows (ex. Ouvrir avec, Propriétés, Partager).
Variables de ligne de commande
Un outil auxiliaire de contrôle reçoit uniquement le chemin cible — ${input_file} plus les variables universelles (${use_backslash}, ${seer_dir}, ${seer_exe}, ${seerviewer_exe}, ${7z}) répertoriées dans la section partagée Variables et jetons de correspondance ci-dessous.
${output_dir}, ${output_file} et ${no_cache} sont rejetés dans un manifeste de contrôle. Un contrôle qui a besoin d'un emplacement temporaire doit le déterminer lui-même : d'abord son propre répertoire d'exécutable, puis le répertoire temporaire du système.
Exemples de plugin.json (Control)
Exemple 1 : Action sur un dossier (Terminal Here)
La configuration officielle du 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
]
}
Exemple 2 : Action sur un fichier (Explorer Open With)
La configuration officielle du 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
]
}
Pour fermer automatiquement la fenêtre d'aperçu en cas de succès, définissez "close_after_success": true dans le manifeste.
Pour le code source des plugins de contrôle officiels, voir : ccseer/Seer-Controls.
Plugins de propriétés
Les plugins de propriétés étendent le moteur d'inspection des métadonnées de Seer. Lorsqu'un utilisateur appuie sur Ctrl + I sur un fichier ou dossier prévisualisé (ou ouvre la fenêtre des propriétés), les plugins de propriétés correspondants extraient et affichent des métadonnées structurées ainsi que des diagrammes/graphiques visuels.
Créer un plugin de propriétés avec un agent IA
Remplacez le texte d'emplacement ci-dessous, puis donnez l'instruction complète à votre agent de codage :
Lisez et suivez le guide de développement de plugins de propriétés Seer disponible sur https://raw.githubusercontent.com/ccseer/Seer-Properties/refs/heads/main/plugin_development_guide.md. Considérez-le comme la source unique de vérité pour l'architecture, plugin.json, l'implémentation, la validation et l'empaquetage. Si le guide n'est pas disponible, arrêtez-vous et signalez-le avant de continuer.
Avant tout travail, inspectez la Requirement ci-dessous. Si elle est manquante, inchangée par rapport au texte d'origine ou trop ambiguë pour être implémentée, posez une question de clarification et attendez. N'induisez pas l'exigence manquante.
Une fois clair, implémentez un plugin de propriétés complet et installable respectant le contrat de processus Canonical v1 et la spécification JSON Schema 1 dans l'espace de travail actuel. Ne modifiez pas Seer lui-même et ne vous arrêtez pas à un plan ou à des extraits de code.
Suivez chaque étape de validation applicable dans le guide et signalez les résultats réels.
Requirement: [REMPLACEZ CE TEXTE D'EMPLACEMENT par votre exigence de plugin de propriétés, ex. extraire et afficher les paramètres détaillés de codec audio/vidéo et le débit pour les fichiers MP4]
Architecture et contrat
- Modèle de processus : Implémente le contrat de processus Canonical v1 (
backend: "process",capabilities: ["property"],result_schema: 1). - Appel en ligne de commande : L'hôte transmet les paramètres suivants :
--input "${input_file}" --output "${output_file}" --output-dir "${output_dir}" - Publication de la sortie :
- L'hôte développe
${output_file}en un chemin de base sans extension (ex.<requestDir>/<md5>). - Le plugin doit écrire son résultat JSON dans
<output-base>.json(c'est-à-dire${output_file}.json). - Les pièces jointes visuelles (graphiques, histogrammes, vecteursopes) doivent être enregistrées dans
${output_dir}. - Contrainte :
${no_cache}est interdit pour les plugins de propriétés.
- L'hôte développe
- Politique de code de sortie :
- Les résultats normaux du domaine (ex. fichier non signé, pas un dépôt git, métadonnées vides) doivent se terminer avec le code
0et décrire l'état dans le JSON. - Quitter avec un code non nul uniquement en cas d'erreurs fatales ou d'appels non valides (les sorties non nulles incitent l'hôte à vider le répertoire de la requête).
- Les résultats normaux du domaine (ex. fichier non signé, pas un dépôt git, métadonnées vides) doivent se terminer avec le code
Variables de ligne de commande
| Variable | Description | Exemple |
|---|---|---|
${output_file} |
Chemin de base attribué par l'hôte sans extension ; le résultat doit être écrit dans ${output_file}.json. |
C:\Users\...\request_dir\md5_hash |
${output_dir} |
Répertoire de requête attribué par l'hôte pour les pièces jointes (graphiques, images). | C:\Users\...\request_dir |
Auxquelles s'ajoutent les variables universelles répertoriées dans la section partagée Variables et jetons de correspondance ci-dessous, qui décrit également les jetons de correspondance ${type_*}. ${no_cache} est rejeté pour les plugins de propriétés.
Spécification du résultat JSON (Schema 1)
Le fichier de résultat ${output_file}.json doit être un JSON UTF-8 valide contenant result_schema: 1 et un objet data :
1. Lignes simples (Flat Rows)
Uniquement lorsque le résultat entier tient en une seule ligne (ex. SHA-256) :
{
"result_schema": 1,
"data": {
"SHA-256": "2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824"
}
}
2. Sous-groupe avec un tableau ordonné d'objets à clé unique (Par défaut)
Tout résultat produisant plus d'une ligne doit être publié comme un seul sous-groupe nommé d'après le plugin — les lignes isolées de premier niveau entrent en conflit avec celles de tous les autres plugins, que l'inspecteur affiche dans une seule liste. L'ordre du tableau est l'ordre d'affichage : c'est donc la seule forme qui permet au plugin de décider de la séquence d'apparition des lignes :
{
"result_schema": 1,
"data": {
"Git": {
"value": [
{ "Repository": "ccseer/Seer-Properties" },
{ "Branch": "main" },
{ "Status": "Clean" }
]
}
}
}
3. Sous-groupe avec un objet de valeur
value peut aussi être un objet simple, mais ses lignes sont rendues dans l'ordre des clés de l'objet analysé, que le plugin ne peut pas contrôler. À utiliser uniquement lorsque l'ordre des lignes n'a pas d'importance :
{
"result_schema": 1,
"data": {
"Git": {
"value": {
"Branch": "main",
"Status": "Working tree clean"
}
}
}
}
4. Graphiques et représentations visuelles (Pièces jointes d'images)
Enregistrez les graphiques PNG générés dans ${output_dir} et déclarez-les avec {"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" } }
]
}
}
}
Exemple de 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
]
}
}
}
Pour le code source des plugins de propriétés officiels, voir : ccseer/Seer-Properties.
Variables et jetons de correspondance
Seer développe ces variables dans les paramètres arguments. Les variables autorisées pour chaque capacité sont validées par l'hôte lors du chargement du manifeste — l'utilisation d'une variable non prise en charge constitue une erreur de chargement du manifeste, et non un simple avertissement à l'exécution.
Disponibles pour chaque capacité
| Variable | Description | Exemple |
|---|---|---|
${input_file} |
Chemin absolu du fichier ou dossier prévisualisé. | C:\Docs\sample.pdf |
${use_backslash} |
Indicateur optionnel pour formater les séparateurs de chemin en antislashs Windows natifs (\). |
${use_backslash} |
${seer_dir} |
Répertoire contenant Seer.exe. |
C:\Program Files\Seer |
${seer_exe} |
Chemin absolu de Seer.exe. |
C:\Program Files\Seer\Seer.exe |
${seerviewer_exe} |
Chemin absolu de SeerViewer.exe. |
C:\Program Files\Seer\SeerViewer.exe |
${7z} |
Chemin absolu de 7z.exe inclus avec Seer. |
C:\Program Files\Seer\plugins\7z.exe |
${theme} |
Thème actuel de Seer, développé en dark ou light. C'est un espace réservé de données qui ne peut pas être utilisé comme command unique. |
dark |
${lang} |
Langue actuelle de Seer, développée au format BCP-47 (ex. en, zh-CN). C'est un espace réservé de données qui ne peut pas être utilisé comme command unique. |
en |
${screenshot} |
Chemin absolu vers une capture d'écran PNG temporaire de la vue actuelle. | C:\Users\Username\AppData\Local\Temp\Seer\screenshot\view_1.png |
Variables spécifiques aux capacités
| Variable | Prévisualisation | Contrôle | Propriétés |
|---|---|---|---|
${output_file} |
Chemin de sortie de base ; ajoutez l'extension cible, ex. ${output_file}.html |
Non pris en charge | Chemin de base sans extension ; le résultat doit être écrit dans ${output_file}.json |
${output_dir} |
Non pris en charge | Non pris en charge | Répertoire de requête pour les pièces jointes (graphiques, images) |
${no_cache} |
Désactive la mise en cache de la conversion et enregistre la sortie dans le répertoire de suppression automatique | Non pris en charge | Non pris en charge |
Un outil auxiliaire de contrôle reçoit uniquement le chemin cible. S'il a besoin d'un emplacement temporaire, il doit le déterminer lui-même : d'abord son propre répertoire d'exécutable, puis le répertoire temporaire du système.
Jetons de correspondance extensions
En plus des extensions standards (ex. ["png", "zip"]), extensions accepte des jetons correspondant à de larges catégories. Ceux-ci s'appliquent aux plugins qui déclarent extensions (Contrôle et Propriétés) ; les plugins de conversion déclarent formats à la place et ne les utilisent pas.
| Jeton | Description |
|---|---|
${type_folder} |
Correspond aux répertoires et dossiers. |
${type_file} |
Correspond à tous les fichiers (y compris les fichiers sans extension). |
${type_all} |
Correspond à tout (fichiers et dossiers). |
${type_image} |
Correspond aux images prises en charge par la visionneuse d'images native de Seer. |
${type_media} |
Correspond aux formats audio et vidéo. |
${type_web} |
Correspond aux fichiers web HTML et Markdown. |
${type_text} |
Correspond aux fichiers texte, de code et de configuration. |
${type_pdf} |
Correspond aux documents PDF. |
${type_none} |
Correspond aux fichiers extérieurs aux catégories ci-dessus (ex. archives, exécutables). |
Empaquetage et tests locaux
Une fois développé, le plugin doit être empaqueté dans une archive ZIP standard pour son installation. Cela s'applique à toutes les capacités de plugin.
Normes d'empaquetage
- Documentation du paquet : Chaque paquet autonome de contrôle ou de propriétés doit inclure un fichier
PACKAGE_README.md(description et tableau## Options & Arguments), placé sous le nomREADME.mdà la racine du paquet. - Structure racine plate : Pour les paquets de contrôle et de propriétés (Canonical v1),
plugin.json, l'exécutable/script,README.mdet les dépendances d'exécution doivent résider directement à la racine de l'archive. Ne les enveloppez pas dans un dossier supplémentaire, et ne mélangez jamais entrées plates et imbriquées — l'hôte rejette une archive dont la racine de paquet est ambiguë.Les anciens plugins de conversion installés depuis le catalogue en ligne utilisent la structure inverse : un dossier de premier niveau
<archive-name>/enveloppant les fichiers du paquet. Suivez le guide des plugins de conversion dans ce cas ; les deux structures ne sont pas interchangeables. - Compression maximale : 7-Zip avec la compression Deflate maximale est recommandé :
powershell 7z a -tzip -mx=9 my-plugin-1.0.0.zip .\*
Tests locaux dans l'application
- Ouvrez les paramètres de Seer et accédez à la section cible :
- Plugins de prévisualisation :
Paramètres > Plugins-> onglet Local - Plugins de barre de contrôle :
Paramètres > Contrôles - Plugins de propriétés :
Paramètres > Propriétés
- Plugins de prévisualisation :
- Cliquez sur + sous la liste et sélectionnez l'archive
.zip(ou le fichierplugin.jsonde votre dossier local). - Seer valide automatiquement le paquet et le charge. Vérifiez les paramètres et cliquez sur OK pour l'activer.