En esta página

Desarrollo e implementación de plugins

Seer proporciona una arquitectura modular de plugins que permite a los desarrolladores ampliar sus capacidades en múltiples áreas. Seleccione una capacidad de plugin a continuación para explorar sus especificaciones de desarrollo:

Plugins de visor (Viewers)

Los plugins de visor amplían la ventana de vista previa activada con la barra espaciadora. Admiten dos arquitecturas de implementación: plugins de conversión (Convert) y plugins DLL (SDK v3).

Crear un plugin de visor con un agente de IA

Reemplace el marcador de posición a continuación y luego proporcione la instrucción completa a su agente de programación:

Lea y siga la guía de desarrollo de plugins de Seer en https://raw.githubusercontent.com/ccseer/Seer-Plugins/refs/heads/master/plugin_development_guide.md. Trátela como la fuente de verdad para la arquitectura, plugin.json, implementación, validación y empaquetado. Si la guía no está disponible, deténgase e infórmelo antes de continuar.

Antes de realizar cualquier trabajo, inspeccione la Requirement a continuación. Si falta, es texto de marcador de posición sin cambios o es demasiado ambigua para implementarla, haga una pregunta aclaratoria y espere. No infiera el requisito faltante.

Una vez claro, elija Convert o DLL y justifique brevemente la elección; luego, implemente un plugin completo e instalable en el espacio de trabajo actual. No modifique Seer ni se detenga en un plan o fragmentos de código.

Siga cada paso de validación aplicable de la guía e informe los resultados reales. Ejecute una prueba de vista previa en la aplicación Seer cuando sea posible; de lo contrario, indique explícitamente que no se realizó la verificación en tiempo de ejecución.

Requirement: [REEMPLACE ESTE MARCADOR DE POSICIÓN con el requisito de su plugin de visor, p. ej., renderizar diagramas mermaid en la vista previa de markdown]

Plugins de conversión (Convert)

Seer trata los plugins de conversión como ejecutores de línea de comandos externos. Cuando un usuario presiona la barra espaciadora en un archivo compatible, Seer inicia el programa configurado, pasando las rutas de archivo a través de marcadores de posición. El programa convierte el archivo a un formato admitido de forma nativa por Seer (HTML, JSON, TXT, imágenes, etc.), que Seer carga y renderiza una vez que el proceso finaliza.

Variables de marcadores de posición

Marcador de posición Descripción Ejemplo
${output_file} Ruta base del archivo de salida; agregue la extensión de destino en los argumentos. ${output_file}.html
${no_cache} Deshabilita el almacenamiento en caché de conversión y guarda la salida en el directorio de eliminación automática, que se vacía al cerrar las ventanas de vista previa. ${no_cache}

Los plugins de conversión también admiten los marcadores universales (${input_file}, ${use_backslash}, ${seer_dir}, ${seer_exe}, ${seerviewer_exe}, ${7z}) y no utilizan los tokens de coincidencia ${type_*} porque declaran sus coincidencias en formats en lugar de extensions. Ambos se tratan en la sección compartida Marcadores de posición y tokens de coincidencia a continuación.

Ejecutables y entornos de script compatibles

  • Scripts: Scripts de PowerShell (.ps1, compatibles de forma nativa a través de PowerShell). Para Python (.py), Node.js (.js) o archivos por lotes (.bat), compile en un archivo ejecutable .exe independiente (p. ej., con PyInstaller) o incluya el intérprete dentro del paquete.
  • Binarios personalizados: Ejecutables CLI independientes compilados a partir de C/C++, Rust, Go o C#.

Ejemplo 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)

Para obtener el máximo rendimiento de renderizado, interactividad profunda o vistas en streaming, Seer admite bibliotecas de enlaces dinámicos nativas de C++/Qt cargadas directamente en el visor a través de QPluginLoader.

  • Especificaciones técnicas: C++17, Qt 6.8, MSVC 2022 (x64), CMake 3.22+.
  • Interfaces esenciales: Heredar de ViewerBase (implementación de widget) e implementar ViewerPluginInterface (IID "seer.plugin.interface.preview/3").
  • Versión mínima de la aplicación: Los plugins de SDK v3 deben declarar "appMinVersion": "4.2.9".

Proyectos de referencia

Proyecto Propósito
F3DViewer Renderizado de modelos 3D y vista panorámica
OfficeViewer Documentos de Office y dibujos CAD
FontViewer Inspección y renderizado de glifos de fuentes
JsonTreeViewer Árbol JSON interactivo de alto rendimiento
Collections Todos los plugins de visor oficiales y de la comunidad

Plugins de barra de control

Los plugins de barra de control añaden botones de acción personalizados al lado izquierdo de la barra de control inferior en la ventana de vista previa, lo que permite operaciones rápidas e integraciones de herramientas externas para el archivo o carpeta activo.

Crear un plugin de barra de control con un agente de IA

Reemplace el marcador de posición a continuación y luego proporcione la instrucción completa a su agente de programación:

Lea y siga la guía de desarrollo de plugins de control de Seer en https://raw.githubusercontent.com/ccseer/Seer-Controls/refs/heads/main/plugin_development_guide.md. Trátela como la fuente de verdad para la arquitectura, plugin.json, implementación, validación y empaquetado. Si la guía no está disponible, deténgase e infórmelo antes de continuar.

Antes de realizar cualquier trabajo, inspeccione la Requirement a continuación. Si falta, es texto de marcador de posición sin cambios o es demasiado ambigua para implementarla, haga una pregunta aclaratoria y espere. No infiera el requisito faltante.

Una vez claro, implemente un plugin de control completo e instalable que cumpla con el contrato de proceso Canonical v1 en el espacio de trabajo actual. No modifique Seer ni se detenga en un plan o fragmentos de código.

Siga cada paso de validación aplicable de la guía e informe los resultados reales.

Requirement: [REEMPLACE ESTE MARCADOR DE POSICIÓN con el requisito de su plugin de control, p. ej., abrir VS Code en el directorio actual o copiar la ruta absoluta al portapapeles]

Arquitectura y contrato

  • Modelo de proceso: Implementa el contrato de proceso Canonical v1 (backend: "process", capabilities: ["control"]). Seer ejecuta el programa auxiliar a través de la CLI.
  • Estado de retorno y reporte de errores:
    • Éxito: El proceso finaliza con código 0 (o coincide con success_exit_codes). Si está configurado "close_after_success": true, Seer cierra automáticamente la ventana de vista previa tras una ejecución correcta.
    • Fallo: El proceso finaliza con un código distinto de cero. Todo lo que se escriba en el error estándar (stderr) es capturado por Seer y se muestra como una notificación Toast de fallo en la aplicación.
  • Interfaz de usuario e interacción: Los plugins de barra de control no dibujan ventanas principales persistentes propias. Los programas auxiliares típicos ejecutan tareas en segundo plano, copian texto al portapapeles o invocan cuadros de diálogo nativos del sistema Windows (p. ej., Abrir con, Propiedades, Compartir).

Marcadores de posición de línea de comandos

Un programa auxiliar de control solo recibe la ruta de destino: ${input_file} más los marcadores universales (${use_backslash}, ${seer_dir}, ${seer_exe}, ${seerviewer_exe}, ${7z}) enumerados en la sección compartida Marcadores de posición y tokens de coincidencia a continuación.

${output_dir}, ${output_file} y ${no_cache} se rechazan en un manifiesto de control. Un plugin de control que requiera una ubicación temporal debe resolverla por sí mismo: primero su propio directorio de ejecutables, y luego el directorio temporal del sistema.

Ejemplos de plugin.json (Control)

Ejemplo 1: Acción sobre carpetas (Terminal Here)

Configuración oficial 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
  ]
}

Ejemplo 2: Acción sobre archivos (Explorer Open With)

Configuración oficial 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
  ]
}

Para cerrar automáticamente la ventana de vista previa tras completarse con éxito, establezca "close_after_success": true en el manifiesto.

Para el código fuente oficial de los plugins de control, consulte: ccseer/Seer-Controls.

Plugins de propiedades

Los plugins de propiedades amplían el motor de inspección de metadatos de Seer. Cuando un usuario presiona Ctrl + I en un archivo o carpeta previsualizado (o abre la ventana Propiedades), los plugins de propiedades coincidentes extraen y muestran metadatos estructurados y gráficos/visores visuales.

Crear un plugin de propiedades con un agente de IA

Reemplace el marcador de posición a continuación y luego proporcione la instrucción completa a su agente de programación:

Lea y siga la guía de desarrollo de plugins de propiedades de Seer en https://raw.githubusercontent.com/ccseer/Seer-Properties/refs/heads/main/plugin_development_guide.md. Trátela como la fuente de verdad para la arquitectura, plugin.json, implementación, validación y empaquetado. Si la guía no está disponible, deténgase e infórmelo antes de continuar.

Antes de realizar cualquier trabajo, inspeccione la Requirement a continuación. Si falta, es texto de marcador de posición sin cambios o es demasiado ambigua para implementarla, haga una pregunta aclaratoria y espere. No infiera el requisito faltante.

Una vez claro, implemente un plugin de propiedades completo e instalable que cumpla con el contrato de proceso Canonical v1 y la especificación Schema 1 JSON en el espacio de trabajo actual. No modifique Seer ni se detenga en un plan o fragmentos de código.

Siga cada paso de validación aplicable de la guía e informe los resultados reales.

Requirement: [REEMPLACE ESTE MARCADOR DE POSICIÓN con el requisito de su plugin de propiedades, p. ej., extraer y mostrar los parámetros detallados de códec de audio/vídeo y la tasa de bits para archivos MP4]

Arquitectura y contrato

  • Modelo de proceso: Implementa el contrato de proceso Canonical v1 (backend: "process", capabilities: ["property"], result_schema: 1).
  • Invocación por CLI: El host pasa los argumentos de la siguiente manera: --input "${input_file}" --output "${output_file}" --output-dir "${output_dir}"
  • Publicación de resultados:
    • El host expande ${output_file} a una ruta base sin extensión (p. ej., <requestDir>/<md5>).
    • El plugin debe escribir su resultado JSON en <output-base>.json (es decir, ${output_file}.json).
    • Los archivos adjuntos visuales (gráficos, histogramas, vectorescopios) deben guardarse en ${output_dir}.
    • Restricción: ${no_cache} está prohibido para plugins de propiedades.
  • Política de códigos de salida:
    • Los resultados normales del dominio (p. ej., archivo no firmado, no es un repositorio git, metadatos vacíos) deben salir con el código 0 y describir el estado en el JSON.
    • Salir con un código distinto de cero únicamente ante errores fatales o invocaciones no válidas (las salidas distintas de cero hacen que el host borre el directorio de la solicitud).

Marcadores de posición de línea de comandos

Marcador de posición Descripción Ejemplo
${output_file} Ruta base asignada por el host sin extensión; el resultado debe escribirse en ${output_file}.json. C:\Users\...\request_dir\md5_hash
${output_dir} Directorio de solicitud asignado por el host para archivos adjuntos (gráficos, imágenes). C:\Users\...\request_dir

Además de los marcadores universales enumerados en la sección compartida Marcadores de posición y tokens de coincidencia a continuación, que también describe los tokens de coincidencia ${type_*}. Se rechaza ${no_cache} para plugins de propiedades.

Especificación del resultado JSON (Schema 1)

El archivo de resultados ${output_file}.json debe ser un JSON UTF-8 válido que contenga result_schema: 1 y un objeto data:

1. Filas simples (Flat Rows)

Solo cuando el resultado completo es una única fila (p. ej., SHA-256):

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

2. Subgrupo con una matriz ordenada de objetos de clave única (Predeterminado)

Todo lo que produzca más de una fila debe publicarse como exactamente un subgrupo con el nombre del plugin: las filas sueltas de nivel superior colisionan con las filas de todos los demás plugins, que el Inspector muestra en una sola lista. El orden de la matriz es el orden de visualización, por lo que esta es la única forma que permite al plugin decidir la secuencia en la que aparecen las filas:

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

3. Subgrupo con un objeto de valor

value también puede ser un objeto simple, pero sus filas se muestran en el orden de las claves del objeto analizado, que el plugin no puede controlar. Úselo solo cuando el orden de las filas no importe:

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

4. Gráficos y representaciones visuales (Archivos adjuntos de imagen)

Guarde los gráficos PNG generados en ${output_dir} y declárelos 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" } }
      ]
    }
  }
}

Ejemplo 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
      ]
    }
  }
}

Para el código fuente oficial de plugins de propiedades, consulte: ccseer/Seer-Properties.


Marcadores de posición y tokens de coincidencia

Seer expande estos tokens en arguments. Qué marcadores puede usar cada capacidad es validado por el host cuando se carga el manifiesto: el uso de un token no admitido constituye un error de carga del manifiesto, no una advertencia en tiempo de ejecución.

Disponibles para todas las capacidades

Marcador de posición Descripción Ejemplo
${input_file} Ruta absoluta del archivo o carpeta previsualizado. C:\Docs\sample.pdf
${use_backslash} Marca opcional para formatear separadores de ruta utilizando barras invertidas nativas de Windows (\). ${use_backslash}
${seer_dir} Directorio que contiene Seer.exe. C:\Program Files\Seer
${seer_exe} Ruta absoluta a Seer.exe. C:\Program Files\Seer\Seer.exe
${seerviewer_exe} Ruta absoluta a SeerViewer.exe. C:\Program Files\Seer\SeerViewer.exe
${7z} Ruta absoluta al 7z.exe incluido con Seer. C:\Program Files\Seer\plugins\7z.exe
${theme} Tema actual de Seer, expandido como dark o light. Es un marcador de datos y no puede usarse como command completo. dark
${lang} Idioma actual de Seer, expandido en formato BCP-47 (p. ej. en, zh-CN). Es un marcador de datos y no puede usarse como command completo. en
${screenshot} Ruta absoluta a una captura de pantalla PNG temporal de la vista actual. C:\Users\Username\AppData\Local\Temp\Seer\screenshot\view_1.png

Marcadores de posición específicos de cada capacidad

Marcador de posición Vista previa Control Propiedades
${output_file} Ruta de salida base; agregue la extensión de destino, p. ej. ${output_file}.html No admitido Ruta base sin extensión; el resultado debe escribirse en ${output_file}.json
${output_dir} No admitido No admitido Directorio de solicitud para archivos adjuntos (gráficos, imágenes)
${no_cache} Deshabilita el almacenamiento en caché de conversión y guarda la salida en el directorio de eliminación automática No admitido No admitido

Un programa auxiliar de control solo recibe la ruta de destino. Si necesita una ubicación temporal, debe resolverla por sí mismo: primero su propio directorio de ejecutables, y luego el directorio temporal del sistema.

Tokens de coincidencia de extensions

Además de las extensiones estándar (p. ej., ["png", "zip"]), extensions acepta tokens que coinciden con categorías amplias. Estos se aplican a los plugins que declaran extensions (Control y Propiedades); los plugins de conversión declaran formats en su lugar y no los utilizan.

Token Descripción
${type_folder} Coincide con directorios y carpetas.
${type_file} Coincide con todos los archivos (incluidos archivos sin extensión).
${type_all} Coincide con todo (tanto archivos como carpetas).
${type_image} Coincide con imágenes compatibles con el visor de imágenes nativo de Seer.
${type_media} Coincide con formatos de audio y vídeo.
${type_web} Coincide con archivos web HTML y Markdown.
${type_text} Coincide con archivos de texto, código y configuración.
${type_pdf} Coincide con documentos PDF.
${type_none} Coincide con archivos fuera de las categorías anteriores (p. ej., archivos comprimidos, ejecutables).

Empaquetado y pruebas en la aplicación

Una vez desarrollado, el plugin debe empaquetarse en un archivo ZIP estándar para su instalación. Esto se aplica a todas las capacidades de plugin.

Estándares de empaquetado

  1. Documentación del paquete: Cada paquete independiente de Control o Propiedades debe incluir un archivo PACKAGE_README.md (descripción más la tabla ## Options & Arguments), preparado como README.md en la raíz del paquete.
  2. Estructura plana en la raíz: Para paquetes de Control y Propiedades (Canonical v1), plugin.json, el ejecutable/script, README.md y las dependencias de tiempo de ejecución deben encontrarse directamente en la raíz del archivo. No los envuelva dentro de una carpeta adicional y nunca mezcle entradas planas y anidadas: el host rechaza un archivo con una raíz de paquete ambigua.

    Los plugins de conversión heredados instalados desde el catálogo en línea utilizan la estructura opuesta: una carpeta de nivel superior <archive-name>/ que envuelve los archivos del paquete. Siga la guía de plugins de conversión para ese caso; ambas estructuras no son intercambiables.

  3. Compresión máxima: Se recomienda 7-Zip con compresión Deflate máxima: powershell 7z a -tzip -mx=9 my-plugin-1.0.0.zip .\*

Pruebas locales en la aplicación

  1. Abra la Configuración de Seer y navegue a la sección de destino:
    • Plugins de visor: Configuración > Plugins -> pestaña Local
    • Plugins de barra de control: Configuración > Controles
    • Plugins de propiedades: Configuración > Propiedades
  2. Haga clic en + debajo de la lista y seleccione el archivo .zip (o plugin.json de su carpeta local).
  3. Seer valida automáticamente el paquete y lo carga. Verifique la configuración y haga clic en Aceptar para activarlo.