cross-compatible-plugin
Skills que auditam e corrigem um plugin de agente para que um único repositório, sem código duplicado (DRY), funcione no GitHub Copilot CLI, no VS Code (agent plugins), no Claude Code e no OpenAI Codex.
Instalação
Clique no botão abaixo correspondente a sua edição do VS Code e confirme o prompt de instalação no editor.
Instalar Plugin de Chat no VS Code
Instalar Plugin de Chat no VS Code Insiders
Execução orquestrada
O slash command inicia o fluxo completo com um caminho opcional:
/plugin-cross ../meu-plugin
/plugin-cross
Sem caminho, o agente plugin-cross-orchestrator detecta a raiz mais provável no workspace e pede confirmação. Ele coordena as skills de auditoria, correção e badges, mas mantém aprovações separadas para aplicar correções, substituir duplicatas idênticas e alterar o README.
Como o plugin se comporta
O fluxo nunca altera arquivos sem aprovação explícita:
- Auditoria (
plugin-cross-audit): roda os três validadores e grava.compat-report.json. - Relatório e dry-run: mostra os findings por gravidade (
error,warning,info) e as correções propostas. - Aprovação das correções: espera um "sim" explícito.
- Sim:
plugin-cross-fixmove os arquivos para a fonte canônica e cria links relativos por arquivo. - Não: segue sem alterar os arquivos.
- Sim:
- Reauditoria: executa novamente os validadores após a decisão.
- Preview dos badges (
readme-install-badge): confirma o repositório e mostra as alterações propostas para o README. - Aprovação do README: espera uma nova confirmação explícita.
- Sim: adiciona os badges.
- Não: segue sem alterar o README.
- Relatório final: apresenta o estado resultante da execução.
O agente e o comando têm fontes canônicas em agents/ e commands/. Claude Code lê essas fontes; Copilot CLI e VS Code usam os links em com.github.copilot/.
Skills
| Skill | Função | Altera arquivos? |
|---|---|---|
plugin-cross-audit | Orquestra os validadores e consolida o relatório | Não (só grava o relatório) |
validate-manifest | plugin.json e mcp.json contra o Agent Plugins 1.0 | Não |
validate-links | Links por arquivo, duplicatas, links quebrados, absolutos ou para fora da raiz | Não |
validate-components | Frontmatter de agentes, nomes de skills, eventos de hooks, arquivos de instruções | Não |
plugin-cross-fix | Aplica move, link e replace-identical do relatório | Sim, com --apply --confirm |
readme-install-badge | Adiciona os botões de instalação no README | Sim, com --apply |
Todas as regras ficam em lib/compat-rules.mjs, e o formato do relatório em lib/report.mjs.
Estrutura que o plugin valida
Cada conteúdo tem uma fonte canônica (arquivo real). Os outros clientes chegam a ela por symlinks relativos, um por arquivo:
| Fonte canônica (real) | Link | Lido por |
|---|---|---|
plugin.json | .claude-plugin/plugin.json | Claude Code |
plugin.json | .codex-plugin/plugin.json | Codex |
mcp.json | .mcp.json | Claude Code |
agents/<nome>.agent.md | com.github.copilot/agents/<nome>.agent.md | Copilot CLI, VS Code |
commands/<nome>.md | com.github.copilot/commands/<nome>.md | Copilot CLI, VS Code |
hooks/hooks.json | com.github.copilot/hooks/hooks.json | Copilot CLI, VS Code |
skills/<nome>/SKILL.md | (sem link) | Todos |
Regras de compatibilidade aplicadas:
- Manifesto:
plugin.jsonusa$schemaAgent Plugins 1.0 e só os campos permitidos. O Claude ignora o$schema, e o Codex usaname,versionedescription. - MCP:
typeexplícito (stdio,streamable-http,sse)..mcp.jsonsó vira link se não houver${PLUGIN_ROOT}nem${CLAUDE_PLUGIN_ROOT}, porque cada cliente só expande o próprio token. - Hooks: formato do Claude (PascalCase +
matcher), apenas com os eventos comuns:SessionStart,UserPromptSubmit,PreToolUse,PostToolUse,PreCompact,SubagentStart,SubagentStop,Stop. O VS Code ignoramatcher, então filtre também dentro do script. - Agentes:
nameno frontmatter é obrigatório e igual ao nome do arquivo. Sem ele, o Claude nomeia o agente<id>.agent. - Skills:
nameigual ao nome da pasta, em kebab-case. - Instruções:
CLAUDE.mdeAGENTS.mdna raiz do plugin não são carregados por nenhum cliente. Use uma skill. - Removido:
.plugin/plugin.json, o formato OpenPlugin legado, que conflita com o 1.0.
Guardrails
- Nenhuma alteração sem o OK explícito do usuário. Os scripts de correção rodam em dry-run por padrão.
plugin-cross-fixexige--apply --confirm. - Nunca sobrescreve e nunca apaga arquivos divergentes. Conflitos são reportados (código 5). Duplicatas byte a byte idênticas só viram link com
--replace-identical. - Links sempre relativos, por arquivo e dentro da raiz do plugin. Links de pasta, absolutos ou que saem da raiz são erros.
- Recusa cópias instaladas ou em cache (
~/.vscode*/agent-plugins,~/.copilot/installed-plugins,~/.claude/plugins/cache, …): código 4. A auditoria dessas cópias é permitida, com aviso. - Revalida antes de agir. A correção confere o estado atual de cada caminho, então um relatório desatualizado não causa estragos.
- Sem rede e sem prompts interativos. JSON no stdout, diagnósticos no stderr,
--helpem todos os scripts. - Pode rodar várias vezes. Uma segunda execução não faz nada.
Códigos de saída
| Código | Significado |
|---|---|
| 0 | OK |
| 1 | Há findings com gravidade error |
| 2 | Argumento inválido (ex.: --apply sem --confirm) |
| 3 | Raiz, plugin.json, relatório ou README não encontrado |
| 4 | Caminho recusado (cópia instalada ou cache) |
| 5 | Conflito: ações puladas para não sobrescrever |
Uso rápido
node skills/plugin-cross-audit/scripts/aggregate.mjs --root ../meu-plugin
node skills/plugin-cross-fix/scripts/fix.mjs --report ../meu-plugin/.compat-report.json
node skills/plugin-cross-fix/scripts/fix.mjs --report ../meu-plugin/.compat-report.json --apply --confirm
node skills/readme-install-badge/scripts/add-badge.mjs --root ../meu-plugin --apply
Requisitos: Node.js 18+. O git é opcional (usado para git mv e para detectar core.symlinks).
Limitações conhecidas
toolsno frontmatter: nomes comovscode/memorysão do VS Code/Copilot. No Claude Code,toolsfunciona como allowlist, então o agente pode perder ferramentas. A skill avisa, mas não corrige.- Codex: não lê os agentes e comandos Markdown deste plugin (usa TOML próprio para agentes). Manifesto e skills funcionam.
- Symlinks não documentados: nenhuma documentação cobre como o Codex trata um manifesto por link, nem como o Copilot e o VS Code tratam links ao instalar via git. Valide com uma instalação real.
- Windows: com
core.symlinks=false, os links viram arquivos de texto (validate-linksavisa). - LSP: os formatos diferem por cliente, então este plugin não tenta unificá-los.
Desenvolvimento
node --test tests/*.test.mjs