Nesta página

Desenvolvimento e Implementação de Plugins

O Seer fornece uma arquitetura modular de plugins que permite aos desenvolvedores expandir suas capacidades em várias frentes. Selecione uma funcionalidade de plugin abaixo para explorar suas especificações de desenvolvimento:

Plugins de visualizador (Viewers)

Os plugins de visualizador expandem a janela de pré-visualização acionada pela barra de espaço. Eles suportam duas arquiteturas de implementação: Plugins de conversão (Convert) e Plugins DLL (SDK v3).

Criar um plugin de visualizador com um agente de IA

Substitua o marcador de posição abaixo e forneça a instrução completa ao seu agente de codificação:

Leia e siga o guia de desenvolvimento de plugins do Seer em https://raw.githubusercontent.com/ccseer/Seer-Plugins/refs/heads/master/plugin_development_guide.md. Trate-o como a fonte da verdade para arquitetura, plugin.json, implementação, validação e empacotamento. Se o guia não estiver disponível, pare e relate isso antes de prosseguir.

Antes de iniciar qualquer trabalho, inspecione a Requirement abaixo. Se estiver ausente, mantiver o texto do marcador inalterado ou for muito ambígua para implementar, faça uma pergunta de esclarecimento e aguarde. Não deduza o requisito ausente.

Depois de esclarecido, escolha Convert ou DLL e justifique brevemente a escolha; em seguida, implemente um plugin completo e instalável no espaço de trabalho atual. Não modifique o próprio Seer nem pare em um plano ou trechos de código.

Siga todas as etapas de validação aplicáveis do guia e relate os resultados reais. Execute um teste de pré-visualização no aplicativo Seer quando possível; caso contrário, declare explicitamente que a verificação em tempo de execução não foi realizada.

Requirement: [SUBSTITUA ESTE MARCADOR DE POSIÇÃO pelo requisito do seu plugin de visualizador, por exemplo, renderizar diagramas mermaid na pré-visualização de markdown]

Plugins de conversão (Convert)

O Seer trata os plugins de conversão como executores de linha de comando externos. Quando um usuário pressiona a barra de espaço em um arquivo compatível, o Seer executa o programa configurado, passando os caminhos de arquivo por meio de marcadores de posição. O programa converte o arquivo para um formato suportado nativamente pelo Seer (HTML, JSON, TXT, imagens, etc.), que o Seer carrega e renderiza assim que o processo termina.

Variáveis de marcador de posição

Marcador Descrição Exemplo
${output_file} Caminho base do arquivo de saída; anexe a extensão desejada nos argumentos. ${output_file}.html
${no_cache} Desativa o cache de conversão e armazena a saída no diretório de exclusão automática, que é limpo ao fechar as janelas de pré-visualização. ${no_cache}

Os plugins de conversão também aceitam os marcadores universais (${input_file}, ${use_backslash}, ${seer_dir}, ${seer_exe}, ${seerviewer_exe}, ${7z}) e não usam os tokens de correspondência ${type_*} porque declaram suas correspondências em formats em vez de extensions. Ambos são abordados na seção compartilhada Marcadores de posição e tokens de correspondência abaixo.

Executáveis e ambientes de script suportados

  • Scripts: Scripts em PowerShell (.ps1, suportados nativamente via PowerShell). Para Python (.py), Node.js (.js) ou scripts em lote (.bat), compile em um executável .exe independente (por exemplo, com PyInstaller) ou inclua o interpretador dentro do pacote.
  • Binários personalizados: Executáveis CLI independentes compilados a partir de C/C++, Rust, Go ou C#.

Exemplo 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 obter o máximo desempenho de renderização, interatividade profunda ou visualizações em streaming, o Seer suporta bibliotecas de vínculo dinâmico nativas em C++/Qt carregadas diretamente na área de exibição via QPluginLoader.

  • Especificações técnicas: C++17, Qt 6.8, MSVC 2022 (x64), CMake 3.22+.
  • Interfaces essenciais: Herdar de ViewerBase (implementação de widget) e implementar ViewerPluginInterface (IID "seer.plugin.interface.preview/3").
  • Versão mínima do aplicativo: Plugins SDK v3 devem declarar "appMinVersion": "4.2.9".

Projetos de referência

Projeto Finalidade
F3DViewer Renderização de modelos 3D e visão panorâmica
OfficeViewer Documentos do Office e desenhos CAD
FontViewer Inspeção e renderização de glifos de fontes
JsonTreeViewer Árvore JSON interativa de alto desempenho
Collections Todos os plugins de visualizador oficiais e da comunidade

Plugins de barra de controle

Os plugins de barra de controle adicionam botões de ação personalizados ao lado esquerdo da barra de controle inferior na janela de pré-visualização, permitindo operações rápidas e integrações com ferramentas externas para o arquivo ou pasta ativo.

Criar um plugin de barra de controle com um agente de IA

Substitua o marcador de posição abaixo e forneça a instrução completa ao seu agente de codificação:

Leia e siga o guia de desenvolvimento de plugins de controle do Seer em https://raw.githubusercontent.com/ccseer/Seer-Controls/refs/heads/main/plugin_development_guide.md. Trate-o como a fonte da verdade para arquitetura, plugin.json, implementação, validação e empacotamento. Se o guia não estiver disponível, pare e relate isso antes de prosseguir.

Antes de iniciar qualquer trabalho, inspecione a Requirement abaixo. Se estiver ausente, mantiver o texto do marcador inalterado ou for muito ambígua para implementar, faça uma pergunta de esclarecimento e aguarde. Não deduza o requisito ausente.

Depois de esclarecido, implemente um plugin de controle completo e instalável em conformidade com o contrato de processo Canonical v1 no espaço de trabalho atual. Não modifique o próprio Seer nem pare em um plano ou trechos de código.

Siga todas as etapas de validação aplicáveis do guia e relate os resultados reais.

Requirement: [SUBSTITUA ESTE MARCADOR DE POSIÇÃO pelo requisito do seu plugin de controle, por exemplo, abrir o VS Code na pasta atual ou copiar o caminho absoluto para a área de transferência]

Arquitetura e contrato

  • Modelo de processo: Implementa o contrato de processo Canonical v1 (backend: "process", capabilities: ["control"]). O Seer executa o utilitário auxiliar via CLI.
  • Código de retorno e relatório de erros:
    • Sucesso: O processo é encerrado com o código 0 (ou corresponde a success_exit_codes). Se "close_after_success": true estiver configurado, o Seer fecha automaticamente a janela de pré-visualização após o sucesso da execução.
    • Falha: O processo é encerrado com um código diferente de zero. Tudo o que for gravado na saída de erro padrão (stderr) é capturado pelo Seer e exibido como uma notificação Toast de falha no aplicativo.
  • Interface e interação: Os plugins de barra de controle não desenham janelas principais persistentes próprias. Os utilitários típicos executam tarefas em segundo plano, copiam texto para a área de transferência ou chamam caixas de diálogo nativas do sistema Windows (por exemplo, Abrir com, Propriedades, Compartilhar).

Marcadores de linha de comando

Um utilitário de controle recebe apenas o caminho de destino — ${input_file} mais os marcadores universais (${use_backslash}, ${seer_dir}, ${seer_exe}, ${seerviewer_exe}, ${7z}) listados na seção compartilhada Marcadores de posição e tokens de correspondência abaixo.

${output_dir}, ${output_file} e ${no_cache} são rejeitados no manifesto de controle. Um plugin de controle que precise de um local temporário deve determiná-lo por conta própria: primeiro seu próprio diretório de executáveis e, em seguida, o diretório temporário do sistema.

Exemplos de plugin.json (Control)

Exemplo 1: Ação em pasta (Terminal Here)

Configuração oficial do 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
  ]
}

Exemplo 2: Ação em arquivo (Explorer Open With)

Configuração oficial do 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 fechar automaticamente a janela de pré-visualização após o sucesso, defina "close_after_success": true no manifesto.

Para obter o código-fonte oficial de plugins de controle, consulte: ccseer/Seer-Controls.

Plugins de propriedades

Os plugins de propriedades expandem o mecanismo de inspeção de metadados do Seer. Quando o usuário pressiona Ctrl + I em um arquivo ou pasta pré-visualizado (ou abre a janela Propriedades), os plugins de propriedades correspondentes extraem e exibem metadados estruturados e gráficos/painéis visuais.

Criar um plugin de propriedades com um agente de IA

Substitua o marcador de posição abaixo e forneça a instrução completa ao seu agente de codificação:

Leia e siga o guia de desenvolvimento de plugins de propriedades do Seer em https://raw.githubusercontent.com/ccseer/Seer-Properties/refs/heads/main/plugin_development_guide.md. Trate-o como a fonte da verdade para arquitetura, plugin.json, implementação, validação e empacotamento. Se o guia não estiver disponível, pare e relate isso antes de prosseguir.

Antes de iniciar qualquer trabalho, inspecione a Requirement abaixo. Se estiver ausente, mantiver o texto do marcador inalterado ou for muito ambígua para implementar, faça uma pergunta de esclarecimento e aguarde. Não deduza o requisito ausente.

Depois de esclarecido, implemente um plugin de propriedades completo e instalável em conformidade com o contrato de processo Canonical v1 e com a especificação Schema 1 JSON no espaço de trabalho atual. Não modifique o próprio Seer nem pare em um plano ou trechos de código.

Siga todas as etapas de validação aplicáveis do guia e relate os resultados reais.

Requirement: [SUBSTITUA ESTE MARCADOR DE POSIÇÃO pelo requisito do seu plugin de propriedades, por exemplo, extrair e exibir parâmetros detalhados de codec de áudio/vídeo e taxa de bits para arquivos MP4]

Arquitetura e contrato

  • Modelo de processo: Implementa o contrato de processo Canonical v1 (backend: "process", capabilities: ["property"], result_schema: 1).
  • Invocação via CLI: O host passa os seguintes argumentos: --input "${input_file}" --output "${output_file}" --output-dir "${output_dir}"
  • Publicação da saída:
    • O host expande ${output_file} para um caminho base sem extensão (por exemplo, <requestDir>/<md5>).
    • O plugin deve gravar o resultado JSON em <output-base>.json (ou seja, ${output_file}.json).
    • Anexos visuais (gráficos, histogramas, vetorscópios) devem ser salvos em ${output_dir}.
    • Restrição: ${no_cache} é proibido para plugins de propriedades.
  • Política de código de saída:
    • Resultados esperados de domínio (por exemplo, arquivo não assinado, não é um repositório git, metadados vazios) devem sair com o código 0 e descrever o status no JSON.
    • Saia com código diferente de zero apenas em erros fatais ou invocações inválidas (saídas diferentes de zero fazem com que o host limpe o diretório de requisição).

Marcadores de linha de comando

Marcador Descrição Exemplo
${output_file} Caminho base atribuído pelo host sem extensão; o resultado deve ser gravado em ${output_file}.json. C:\Users\...\request_dir\md5_hash
${output_dir} Diretório de requisição atribuído pelo host para anexos (gráficos, imagens). C:\Users\...\request_dir

Além dos marcadores universais listados na seção compartilhada Marcadores de posição e tokens de correspondência abaixo, que também descreve os tokens de correspondência ${type_*}. O uso de ${no_cache} é rejeitado para plugins de propriedades.

Especificação de resultado JSON (Schema 1)

O arquivo de resultado ${output_file}.json deve ser um JSON UTF-8 válido contendo result_schema: 1 e um objeto data:

1. Linhas simples (Flat Rows)

Somente quando o resultado inteiro é uma única linha (por exemplo, SHA-256):

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

2. Subgrupo com uma matriz ordenada de objetos de chave única (Padrão)

Tudo o que produzir mais de uma linha deve ser publicado como exatamente um subgrupo nomeado após o plugin — linhas soltas de nível superior colidem com as linhas de todos os outros plugins, que o Inspetor mostra em uma única lista. A ordem da matriz é a ordem de exibição, portanto esta é a única forma que permite ao plugin decidir a sequência em que as linhas aparecem:

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

3. Subgrupo com um objeto de valor

value também pode ser um objeto simples, mas suas linhas são renderizadas na ordem das chaves do objeto analisado, que o plugin não pode controlar. Use-o apenas quando a ordem das linhas não importar:

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

4. Gráficos e painéis visuais (Anexos de imagem)

Salve os gráficos PNG gerados em ${output_dir} e declare-os com {"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" } }
      ]
    }
  }
}

Exemplo 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 obter o código-fonte oficial de plugins de propriedades, consulte: ccseer/Seer-Properties.


Marcadores de posição e tokens de correspondência

O Seer expande estes tokens no parâmetro arguments. Quais marcadores uma capacidade pode usar são validados pelo host no carregamento do manifesto — usar um token não suportado é um erro no carregamento do manifesto, e não apenas um aviso em tempo de execução.

Disponíveis para todas as capacidades

Marcador Descrição Exemplo
${input_file} Caminho absoluto do arquivo ou pasta pré-visualizado. C:\Docs\sample.pdf
${use_backslash} Sinalizador opcional para formatar separadores de caminho com barras invertidas nativas do Windows (\). ${use_backslash}
${seer_dir} Diretório contendo Seer.exe. C:\Program Files\Seer
${seer_exe} Caminho absoluto para Seer.exe. C:\Program Files\Seer\Seer.exe
${seerviewer_exe} Caminho absoluto para SeerViewer.exe. C:\Program Files\Seer\SeerViewer.exe
${7z} Caminho absoluto para o 7z.exe incluído com o Seer. C:\Program Files\Seer\plugins\7z.exe
${theme} Tema atual do Seer, expandido como dark ou light. É um marcador de dados e não pode ser usado como command inteiro. dark
${lang} Idioma atual do Seer, expandido no formato BCP-47 (ex: en, zh-CN). É um marcador de dados e não pode ser usado como command inteiro. en
${screenshot} Caminho absoluto para uma captura de tela PNG temporária da visualização atual. C:\Users\Username\AppData\Local\Temp\Seer\screenshot\view_1.png

Marcadores específicos por capacidade

Marcador Pré-visualização Controle Propriedades
${output_file} Caminho base de saída; anexe a extensão de destino, ex. ${output_file}.html Não suportado Caminho base sem extensão; o resultado deve ser gravado em ${output_file}.json
${output_dir} Não suportado Não suportado Diretório de requisição para anexos (gráficos, imagens)
${no_cache} Desativa o cache de conversão e armazena a saída no diretório de exclusão automática Não suportado Não suportado

Um utilitário de controle recebe apenas o caminho de destino. Se precisar de um local temporário, deve determiná-lo por conta própria: primeiro seu próprio diretório de executáveis e, em seguida, o diretório temporário do sistema.

Tokens de correspondência de extensions

Além de extensões padrão (por exemplo, ["png", "zip"]), extensions aceita tokens que correspondem a categorias amplas. Estes se aplicam a plugins que declaram extensions (Controle e Propriedades); plugins de conversão declaram formats e não os utilizam.

Token Descrição
${type_folder} Corresponde a diretórios e pastas.
${type_file} Corresponde a todos os arquivos (incluindo arquivos sem extensão).
${type_all} Corresponde a tudo (tanto arquivos quanto pastas).
${type_image} Corresponde a imagens suportadas pelo visualizador de imagens nativo do Seer.
${type_media} Corresponde a formatos de áudio e vídeo.
${type_web} Corresponde a arquivos web HTML e Markdown.
${type_text} Corresponde a arquivos de texto, código e configuração.
${type_pdf} Corresponde a documentos PDF.
${type_none} Corresponde a arquivos fora das categorias acima (por exemplo, arquivos compactados, executáveis).

Empacotamento e testes no aplicativo

Após desenvolvido, o plugin deve ser empacotado em um arquivo ZIP padrão para instalação. Isso se aplica a todas as capacidades de plugin.

Padrões de empacotamento

  1. Documentação do pacote: Todo pacote avulso de Controle ou Propriedades deve incluir um arquivo PACKAGE_README.md (descrição e tabela ## Options & Arguments), posicionado como README.md na raiz do pacote.
  2. Estrutura de raiz plana: Para pacotes de Controle e Propriedades (Canonical v1), plugin.json, o executável/script, README.md e as dependências de tempo de execução devem residir diretamente na raiz do arquivo compactado. Não os coloque dentro de uma pasta adicional e nunca misture itens planos e aninhados — o host rejeita arquivos compactados com raiz de pacote ambígua.

    Plugins de conversão legados instalados do catálogo online utilizam o layout oposto: uma pasta de nível superior <archive-name>/ englobando os arquivos do pacote. Siga o guia de plugins de conversão para esse caso; os dois formatos não são intercambiáveis.

  3. Compactação máxima: Recomenda-se o 7-Zip com compactação Deflate máxima: powershell 7z a -tzip -mx=9 my-plugin-1.0.0.zip .\*

Testes locais no aplicativo

  1. Abra as Configurações do Seer e vá até a seção de destino:
    • Plugins de visualizador: Configurações > Plugins -> aba Local
    • Plugins de barra de controle: Configurações > Controles
    • Plugins de propriedades: Configurações > Propriedades
  2. Clique no botão + abaixo da lista e selecione o arquivo .zip (ou plugin.json da sua pasta local).
  3. O Seer valida automaticamente o pacote e o carrega. Verifique as configurações e clique em OK para ativá-lo.