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.exeindependente (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 implementarViewerPluginInterface(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 asuccess_exit_codes). Se"close_after_success": trueestiver 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.
- Sucesso: O processo é encerrado com o código
- 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.
- O host expande
- 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
0e 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).
- 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
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
- 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 comoREADME.mdna raiz do pacote. - Estrutura de raiz plana: Para pacotes de Controle e Propriedades (Canonical v1),
plugin.json, o executável/script,README.mde 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. - 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
- 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
- Plugins de visualizador:
- Clique no botão + abaixo da lista e selecione o arquivo
.zip(ouplugin.jsonda sua pasta local). - O Seer valida automaticamente o pacote e o carrega. Verifique as configurações e clique em OK para ativá-lo.