@tavaressan/vetor 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (78) hide show
  1. package/README.md +42 -0
  2. package/bin/vetor.js +6 -0
  3. package/lib/banner.js +35 -0
  4. package/lib/commands/install.js +71 -0
  5. package/lib/commands/status.js +59 -0
  6. package/lib/commands/uninstall.js +119 -0
  7. package/lib/commands/update.js +63 -0
  8. package/lib/installer/command-exists.js +30 -0
  9. package/lib/installer/cursor-hooks.js +181 -0
  10. package/lib/installer/detector.js +79 -0
  11. package/lib/installer/manifest.js +76 -0
  12. package/lib/installer/prompts.js +97 -0
  13. package/lib/installer/writer.js +382 -0
  14. package/lib/router.js +50 -0
  15. package/package.json +39 -0
  16. package/templates/.gitkeep +0 -0
  17. package/templates/agents/code-review/agent.json +27 -0
  18. package/templates/agents/code-review/codex.toml +37 -0
  19. package/templates/agents/code-review.md +99 -0
  20. package/templates/agents/issue-worker/agent.json +33 -0
  21. package/templates/agents/issue-worker/codex.toml +57 -0
  22. package/templates/agents/issue-worker.md +112 -0
  23. package/templates/hooks/hooks-codex.json +48 -0
  24. package/templates/hooks/hooks.json +62 -0
  25. package/templates/opencode/agent/code-review.md +73 -0
  26. package/templates/opencode/agent/issue-coordinator.md +521 -0
  27. package/templates/opencode/agent/issue-worker.md +64 -0
  28. package/templates/opencode/mcp.jsonc +39 -0
  29. package/templates/opencode/plugin/vetor.ts +207 -0
  30. package/templates/opencode/scripts/agent-registration_test.ts +92 -0
  31. package/templates/opencode/scripts/check-edit.ts +147 -0
  32. package/templates/opencode/scripts/ensure-external-directory-permission.ts +110 -0
  33. package/templates/opencode/scripts/ensure-external-directory-permission_test.ts +142 -0
  34. package/templates/opencode/scripts/lib/guard.ts +45 -0
  35. package/templates/opencode/scripts/lib/model-health.ts +133 -0
  36. package/templates/opencode/scripts/lib/model-health_test.ts +181 -0
  37. package/templates/opencode/scripts/lib/project.ts +240 -0
  38. package/templates/opencode/scripts/lib/project_test.ts +45 -0
  39. package/templates/opencode/scripts/lib/status.ts +69 -0
  40. package/templates/opencode/scripts/lib/worktree.ts +41 -0
  41. package/templates/opencode/scripts/model-health.ts +50 -0
  42. package/templates/opencode/scripts/model-health_test.ts +80 -0
  43. package/templates/opencode/scripts/resolve-model.ts +112 -0
  44. package/templates/opencode/scripts/resolve-model_test.ts +185 -0
  45. package/templates/opencode/scripts/safety-check.ts +203 -0
  46. package/templates/opencode/scripts/vetor-checks.sh +217 -0
  47. package/templates/opencode/scripts/vetor-status.sh +99 -0
  48. package/templates/skills/architecture-review/SKILL.md +187 -0
  49. package/templates/skills/backlog-ideator/SKILL.md +277 -0
  50. package/templates/skills/design/SKILL.md +468 -0
  51. package/templates/skills/design/examples/design-contract-example.md +46 -0
  52. package/templates/skills/design/examples/prototype-handoff-example.md +142 -0
  53. package/templates/skills/fix-loop-agent/SKILL.md +255 -0
  54. package/templates/skills/guardian/SKILL.md +343 -0
  55. package/templates/skills/issue-coordinator/SKILL.md +596 -0
  56. package/templates/skills/retro/SKILL.md +156 -0
  57. package/templates/skills/shared/references/agent-status.template.md +68 -0
  58. package/templates/skills/shared/references/codebase-design-vocabulary.md +54 -0
  59. package/templates/skills/shared/references/conflict-resolution.md +94 -0
  60. package/templates/skills/shared/references/delegate-to-runtime.md +239 -0
  61. package/templates/skills/shared/references/design-vocabulary.md +508 -0
  62. package/templates/skills/shared/references/evidence-state.md +365 -0
  63. package/templates/skills/shared/references/frontend-design-enforcement.md +33 -0
  64. package/templates/skills/shared/references/grilling-conventions.md +64 -0
  65. package/templates/skills/shared/references/knowledge-provider-contract.md +150 -0
  66. package/templates/skills/shared/references/mcp-availability.md +104 -0
  67. package/templates/skills/shared/references/module-test-map.template.md +72 -0
  68. package/templates/skills/shared/references/planning-conventions.md +97 -0
  69. package/templates/skills/shared/references/project-conventions.md +63 -0
  70. package/templates/skills/shared/references/tdd-conventions.md +81 -0
  71. package/templates/skills/shared/references/touched-files-cache.md +30 -0
  72. package/templates/skills/spec/SKILL.md +524 -0
  73. package/templates/skills/spec-validate/SKILL.md +195 -0
  74. package/templates/skills/spec-validate/references/traceability.md +169 -0
  75. package/templates/skills/stack-practices/SKILL.md +151 -0
  76. package/templates/skills/vetor/SKILL.md +174 -0
  77. package/templates/skills/worktree-create/SKILL.md +142 -0
  78. package/templates/skills/worktree-ship/SKILL.md +394 -0
@@ -0,0 +1,104 @@
1
+ # Verificação de Disponibilidade de MCP (Vetor)
2
+
3
+ Todas as skills que têm um caminho "Com MCP" / "Sem MCP (Fallback)" devem verificar disponibilidade
4
+ da mesma forma — esta referência centraliza o mecanismo para evitar que cada skill reinvente (ou
5
+ pule) a checagem.
6
+
7
+ ## O mecanismo correto
8
+
9
+ Ferramentas de servidores MCP aparecem no seu namespace de ferramentas com o prefixo
10
+ `mcp__<server>__<tool>` (ex.: `mcp__sentry__list_issues`) — diretas na
11
+ lista de ferramentas disponíveis, ou listadas por nome entre as ferramentas diferidas (que você
12
+ carrega via `ToolSearch` antes de chamar).
13
+
14
+ **Verificar disponibilidade é simplesmente olhar se algum nome com esse prefixo existe** — não é
15
+ necessário rodar comando, nem tentar a chamada MCP "para ver se funciona":
16
+
17
+ 1. Procure na sua lista de ferramentas (diretas + diferidas, listadas em `<system-reminder>` no
18
+ início da conversa e sempre que atualizadas) por qualquer nome começando com `mcp__<server>__`,
19
+ onde `<server>` é o servidor relevante para a tarefa (sentry/observabilidade,
20
+ banco de dados).
21
+ 2. **Se existir:** o MCP está disponível. Se a ferramenta estiver na lista de diferidas, carregue-a
22
+ primeiro com `ToolSearch({query: "select:<tool_name>"})` antes de chamá-la.
23
+ 3. **Se não existir nenhum nome com esse prefixo:** o MCP não está configurado nesta sessão — vá
24
+ direto para o fallback documentado na skill (CLI `gh`, query SQL manual, etc.). Não gaste uma
25
+ chamada tentando invocar uma ferramenta MCP inexistente só para descobrir que falha.
26
+
27
+ ## Por que não "tentar e capturar erro"
28
+
29
+ Tentar chamar uma ferramenta MCP e cair para o fallback só se ela falhar desperdiça uma chamada de
30
+ ferramenta (e o turno associado) sempre que o MCP não está configurado — que é exatamente o caso mais
31
+ comum hoje. Como a lista de ferramentas já informa antecipadamente o que está disponível, a checagem
32
+ correta é estática (olhar a lista), não uma tentativa em runtime.
33
+
34
+ ## Servidores relevantes neste plugin
35
+
36
+ | Observabilidade (Sentry/Datadog) | `mcp__sentry__` / `mcp__datadog__` | `backlog-ideator` §2.a (opcional) |
37
+ | Banco de dados | `mcp__<db>__` (nome depende do MCP configurado) | `guardian` (auditoria de schema/queries) |
38
+ | Docker | `mcp__docker__` | `guardian` (auditoria de saúde de containers) |
39
+ | Browser (chrome-devtools) | `mcp__chrome-devtools__` | `fix-loop-agent` (reproduzir bug de UI antes do fix), `worktree-ship` (checagem e2e leve antes do PR) |
40
+ | Pesquisa web (Exa) | `mcp__exa__` | `backlog-ideator` (pesquisar padrões/arquitetura antes de propor issue), `fix-loop-agent` (pesquisar mensagem de erro/documentação de uma lib externa), `issue-worker` (checar docs de API externa durante a implementação) |
41
+ | Documentação de ferramentas/libs (Context7) | `mcp__context7__` | **Obrigatório quando disponível** (ver issue vetor#163) — qualquer skill que precise pesquisar comportamento de uma ferramenta/lib/framework/API externa (`issue-worker`, `fix-loop-agent`, `guardian`, `backlog-ideator`) |
42
+ | Documentação do próprio Claude Code (`claude-code-docs`) | `mcp__claude-code-docs__` | **Obrigatório quando disponível** (ver issue vetor#164) — qualquer skill que precise responder sobre o funcionamento do próprio Claude Code (hooks, slash commands, MCP, permissões, SDK) (`vetor` (setup), `retro`) |
43
+
44
+ ### Documentação de ferramentas/libs (Context7)
45
+
46
+ Use antes de afirmar comportamento de uma ferramenta, biblioteca, framework, SDK ou API externa —
47
+ não confie só no conhecimento pré-treinado do agente, que pode estar desatualizado.
48
+
49
+ - **Com MCP (obrigatório):** `mcp__context7__resolve-library-id` para achar o library ID, depois
50
+ `mcp__context7__query-docs` com uma pergunta específica e escopada a um único conceito.
51
+ - **Sem MCP (fallback):** siga sem o MCP, sinalizando a limitação no resultado entregue ao usuário —
52
+ não bloqueia a skill.
53
+
54
+ ### Documentação do próprio Claude Code (`claude-code-docs`)
55
+
56
+ Use antes de afirmar comportamento do próprio Claude Code (hooks, slash commands, configuração de
57
+ MCP, permissões, SDK de agentes, comportamento do harness) — evita responder de memória sobre um
58
+ produto que muda rápido.
59
+
60
+ - **Com MCP (obrigatório):** consulte via `mcp__claude-code-docs__*` antes de afirmar comportamento
61
+ do produto. Registro: `claude mcp add --transport http claude-code-docs https://code.claude.com/docs/mcp`
62
+ (endpoint oficial confirmado via Context7 contra `code.claude.com/docs/en/mcp-quickstart` —
63
+ **não** usar `https://claude.com` nem `https://code.claude.com/docs/en/`, que são páginas HTML e
64
+ não conectam como MCP).
65
+ - **Sem MCP (fallback):** siga sem o MCP, sinalizando a limitação no resultado — não bloqueia a
66
+ skill. Nota: há sobreposição parcial com o agente `claude-code-guide` já existente no Vetor/Claude
67
+ Code para dúvidas sobre o próprio produto; ao implementar, avaliar se o MCP substitui ou
68
+ complementa esse agente.
69
+
70
+ ### Pesquisa web (Exa)
71
+
72
+ Use quando a tarefa precisa de busca na web ou fetch de uma página específica — pesquisar
73
+ documentação externa, mensagens de erro pouco usuais, padrões de arquitetura, ou conteúdo de uma
74
+ URL já conhecida. Não é um substituto do Context7 (ver issue vetor#163 — Context7 é o caminho
75
+ preferido para documentação de ferramentas/bibliotecas quando disponível); use Exa para busca web
76
+ geral e fetch de páginas que o Context7 não cobre.
77
+
78
+ - **Com MCP:** use `mcp__exa__web_search_exa` para busca geral e `mcp__exa__web_fetch_exa` para
79
+ buscar o conteúdo de uma URL específica. Se o servidor tiver sido registrado com
80
+ `web_search_advanced_exa` habilitado (query param `tools=` na URL do MCP), prefira essa variante
81
+ para buscas que precisem de filtros mais refinados.
82
+ - **Sem MCP (fallback):** prossiga sem pesquisa web — baseie a resposta no conhecimento do agente e
83
+ nos arquivos do projeto, sinalizando a limitação quando a falta de pesquisa externa for relevante
84
+ para a conclusão.
85
+
86
+ **Autenticação:** o Exa MCP usa OAuth (sem API key) — a primeira conexão abre o navegador para login
87
+ na conta Exa. Não é necessário configurar segredo nenhum no ambiente do Vetor.
88
+
89
+ ### Browser (chrome-devtools)
90
+
91
+ Use só quando a tarefa envolve UI/frontend (bug reportado como visual, PR que altera componentes de
92
+ interface). Não invoque para módulos puramente backend/CLI.
93
+
94
+ - **Com MCP:** navegue até a página relevante (`mcp__chrome-devtools__navigate_page`), reproduza o
95
+ cenário (`click`/`fill`/`fill_form`) e capture evidência (`take_screenshot`,
96
+ `list_console_messages`, `list_network_requests`) antes de propor o fix. No `worktree-ship`, use o
97
+ mesmo fluxo como checagem e2e leve (navegar pelo fluxo alterado e conferir ausência de erros de
98
+ console) antes de abrir o PR — nunca como substituto dos testes automatizados do módulo.
99
+ - **Sem MCP (fallback):** prossiga sem reprodução visual — baseie o diagnóstico/fix na descrição do
100
+ bug, logs de erro e testes existentes, como já era feito antes deste mecanismo.
101
+
102
+ Cada skill que referencia este documento deve nomear o servidor esperado (ex.: "Observabilidade" na seção
103
+ acima) antes de aplicar o mecanismo — este documento define *como* checar, não *quais* servidores
104
+ uma skill específica precisa.
@@ -0,0 +1,72 @@
1
+ # Module Test Map — TEMPLATE
2
+
3
+ > **Este é um template.** Copie-o para o seu projeto e preencha com os comandos do
4
+ > SEU repositório:
5
+ >
6
+ > ```bash
7
+ > mkdir -p .claude/vetor
8
+ > cp "$CLAUDE_PLUGIN_ROOT/skills/shared/references/module-test-map.template.md" \
9
+ > .claude/vetor/module-test-map.md
10
+ > # edite .claude/vetor/module-test-map.md
11
+ > ```
12
+ >
13
+ > As skills `worktree-ship`, `fix-loop-agent` e `guardian` procuram a cópia preenchida
14
+ > em `.claude/vetor/module-test-map.md`. Se ela não existir, tentam auto-detectar os
15
+ > comandos a partir de `.github/workflows/*.yml`; só então recorrem a este template.
16
+
17
+ Referência canônica dos comandos de teste headless por módulo. O ideal é derivá-la do
18
+ seu pipeline de CI (ex.: `.github/workflows/ci.yml`).
19
+
20
+ ---
21
+
22
+ ## Comandos por módulo
23
+
24
+ Substitua as linhas abaixo pelos módulos e comandos do seu projeto. Cada comando deve
25
+ ser **headless** (sem interação) e retornar exit code 0 em caso de sucesso.
26
+
27
+ | Módulo | Comando headless | Notas |
28
+ |-------------------|---------------------------------------------------|-------|
29
+ | `<seu-modulo-1>` | `<comando de format + lint + test>` | `<observações>` |
30
+ | `<seu-modulo-2>` | `<comando de build + test>` | `<observações>` |
31
+ | `<modulo-integ>` | `<comando de testes de integração>` | Requer serviço externo (DB etc.); pular em sandbox e reportar "skipped (requires <dep>)" |
32
+ | `<modulo-sem-testes>` | `sem suíte de testes` | Não executar; reportar como "skipped (no test suite)" |
33
+
34
+ <!--
35
+ Exemplo ilustrativo (remova após preencher):
36
+
37
+ | `api` | `cd api && deno task test` | Deno; deps vêm do cache global |
38
+ | `core` | `cd core && deno test -A` | Deno sem task `test` definida |
39
+ | `backend` | `cd backend && npm ci && npm run lint && npm test` | Node: lint + unit |
40
+ | `backend-integ` | `cd backend && npm run test:integration` | Requer DB vivo; pular em sandbox |
41
+ -->
42
+
43
+ ## Detecção de módulo por arquivos alterados
44
+
45
+ Para determinar qual módulo testar, inspecione `git diff <default-branch> --name-only`
46
+ e mapeie os prefixos de path aos módulos:
47
+
48
+ | Prefixo do path | Módulo |
49
+ |---------------------|-------------------|
50
+ | `<seu-modulo-1>/` | `<seu-modulo-1>` |
51
+ | `<seu-modulo-2>/` | `<seu-modulo-2>` |
52
+
53
+ Se arquivos de múltiplos módulos foram alterados, execute todos os módulos afetados em
54
+ sequência.
55
+
56
+ ## Regras de execução
57
+
58
+ ### Regra sandbox
59
+ - **Docker:** uma tentativa por sessão; se bloqueado pelo usuário ou pelo sistema, troca
60
+ permanentemente para comandos headless desta tabela.
61
+ - **Docker isolado:** usar `docker compose -p <slug>` para evitar conflito de portas entre
62
+ worktrees paralelos.
63
+ - **Testes que exigem serviço externo (DB, broker, etc.):** só executar em ambiente com a
64
+ dependência disponível (docker ou CI); em headless, pular e reportar como
65
+ "skipped (requires <dep>)" no sumário.
66
+ - **Módulo sem suíte:** quando o comando for `sem suíte de testes`, não execute comando algum;
67
+ reporte "skipped (no test suite)". Isso não é falha de teste.
68
+
69
+ ### Exclusões obrigatórias
70
+ Todo `find` ou `grep` executado pelos skills deve excluir:
71
+ - `.claude/worktrees/*` — evita contaminação por worktrees aninhados
72
+ - `node_modules/`, `target/`, `.next/`, `__pycache__/`, `.venv/`, `build/`, `dist/`
@@ -0,0 +1,97 @@
1
+ # Convenções de Planejamento e Economia de Tokens (Vetor)
2
+
3
+ Este documento estabelece o padrão de design para o ciclo de vida de planejamento das skills do Vetor, visando a **experiência do usuário (Human-in-the-Loop)** e a **redução drástica do consumo de tokens**.
4
+
5
+ ---
6
+
7
+ ## 1. Princípios de Economia de Tokens e Contexto
8
+
9
+ Para evitar sessões com mais de 150k de contexto e o spawn excessivo de subagentes caros:
10
+
11
+ ### 1.1 Limites de Contexto e Leitura Bruta
12
+ * **Regra de 100 linhas**: Nunca despeje mais de 100 linhas de logs, documentações ou dumps brutos de arquivos no contexto do agente primário se houver um runtime de delegação disponível (Gemini/OpenCode/Codex — ver `delegate-to-runtime.md`).
13
+ * **Delegação Obrigatória** (sintaxe de invocação e algoritmo de seleção de runtime em `delegate-to-runtime.md` §1-2; `$DELEGATE` = comando do runtime selecionado):
14
+ - **Logs de Erro/CI**: Utilize `gh run view <run-id> --log-failed | $DELEGATE "..."` para obter resumos de até 15 linhas antes do diagnóstico.
15
+ - **Documentações longas**: Use `cat <docs> | $DELEGATE "..."` para gerar sumários arquiteturais compactos de alta densidade antes de analisar o backlog.
16
+ - **Dumps de Migrations/Estruturas**: Use `ls -R | $DELEGATE "..."` para pré-auditar antes de o agente ler os arquivos.
17
+ * **Finalização Restrita**: Oriente os subagentes a finalizarem a execução assim que atingirem seu objetivo restrito, em vez de manter contexto acumulando além do necessário.
18
+
19
+ ### 1.2 Regras de Orquestração de Subagentes
20
+ * **Haicuzation por Padrão**: Todo subagente worker deve ser configurado por padrão com `haiku` para tarefas classificadas como `fix`, `chore` ou `test` menores.
21
+ * **Sonnet sob Demanda**: Limite o uso de `sonnet` apenas para features complexas (`feat`), refatorações estruturais (`refactor`) ou quando um subagente `haiku` esgotar suas iterações e o coordenador optar pelo redespacho seletivo.
22
+
23
+ ---
24
+
25
+ ## 2. Aprovação do plano antes de despachar subagentes
26
+
27
+ Todas as skills que realizam mutações estruturais (criar issues, rodar auto-fixes no repo, despachar
28
+ subagentes) devem apresentar o plano de ações e obter aprovação explícita do usuário antes de agir.
29
+ O mecanismo de aprovação depende do ecossistema — ver §2.2.
30
+
31
+ ### 2.1 Conteúdo mínimo do plano
32
+
33
+ Independente do mecanismo de aprovação, o plano apresentado deve conter:
34
+
35
+ ```markdown
36
+ # Plano de Execução Vetor — [Nome da Skill]
37
+
38
+ [Breve sumário executivo da operação]
39
+
40
+ ## Ações Propostas
41
+
42
+ [Lista detalhada de mutações a serem feitas, ex.: issues a criar, commits a aplicar, subagentes a iniciar]
43
+
44
+ ### Tabela de Configuração e Recursos
45
+ Exemplo para Coordinator:
46
+ | Subagente/Grupo | Módulo/Issue | Modelo Sugerido | Ação |
47
+ |-----------------|--------------|-----------------|------|
48
+ | worker-slug-a | #42 | haiku | Criar|
49
+
50
+ *Você pode pedir para forçar o uso de um modelo diferente antes de aprovar.*
51
+ ```
52
+
53
+ ### 2.2 Mecanismo de aprovação por ecossistema
54
+
55
+ #### Para skills de implementação de código (`fix-loop-agent`, `issue-worker`, e similares)
56
+
57
+ * **No Claude Code**: use o plan mode nativo — apresente o plano acima e conclua com `ExitPlanMode`
58
+ para pedir aprovação do usuário. Este é o caminho de primeira classe no Claude Code para código,
59
+ não um fallback.
60
+ * **No Antigravity/Gemini**: salve o plano no artefato `implementation_plan.md` definindo
61
+ `request_feedback: true` nos metadados. O agente interromperá a chamada até o clique em "Proceed".
62
+
63
+ #### Para skills de orquestração/ideação (`backlog-ideator`, `issue-coordinator`, `guardian`)
64
+
65
+ Estas skills realizam mutações estruturais (criar issues, orquestrar subagentes) mas **não implementam
66
+ código de produto**. Para elas:
67
+
68
+ * **No Claude Code**: exiba o plano no chat e aguarde uma resposta textual afirmativa do usuário
69
+ (ex.: "sim", "prosseguir"). **Não use `ExitPlanMode`** — a ferramenta a desaconselha explicitamente
70
+ para tarefas fora do escopo de escrita de código.
71
+ * **No Antigravity/Gemini**: salve o plano no artefato `implementation_plan.md` definindo
72
+ `request_feedback: true` nos metadados. O agente interromperá a chamada até o clique em "Proceed".
73
+
74
+ #### Fallback para ecossistemas sem mecanismo nativo
75
+
76
+ Em ecossistemas sem nenhum dos dois mecanismos acima, exiba o plano no chat e aguarde uma resposta
77
+ textual afirmativa do usuário (ex.: "sim", "prosseguir") antes de prosseguir com a execução.
78
+
79
+ ---
80
+
81
+ ## 3. Equilíbrio de Princípios: YAGNI, KISS e DRY
82
+
83
+ Regras não-óbvias de escrita de código, consumidas por referência pelos prompts do `issue-worker`
84
+ e do `fix-loop-agent` (não replique estes parágrafos nas skills):
85
+
86
+ * **Regra das 3 perguntas**: só pergunte quando houver ambiguidade crítica de arquitetura/escopo,
87
+ e nunca mais de 3 perguntas objetivas num único turno. Se o prompt/requisitos já bastam,
88
+ prossiga sem perguntar (YAGNI — não pergunte sobre cenários futuros).
89
+ * **TDD antes do fix**: red antes de green — escreva primeiro um teste de reprodução que falhe,
90
+ cobrindo só o bug em questão, antes de tocar no código de produto. Disciplina completa (bom teste,
91
+ seams, anti-padrões, mocking) em `tdd-conventions.md` — não replique o texto aqui.
92
+ * **KISS/YAGNI no código**: a menor alteração que faz o teste passar; sem refatoração oportunista
93
+ em arquivos adjacentes nem abstrações "para o futuro".
94
+ * **Reuso antes de reinventar**: rotinas complexas (detecção de testes, checagens de git) já podem
95
+ estar em `scripts/` (ex.: `detect-project.ts`, `vetor-checks.sh`) ou nas referências — verifique
96
+ antes de escrever lógica inline.
97
+
@@ -0,0 +1,63 @@
1
+ # Convenções de projeto (branch default + comandos de teste)
2
+
3
+ Referência compartilhada para as duas resoluções que `fix-loop-agent`, `worktree-ship` e
4
+ `worktree-create` precisam fazer no início de sua execução. Consumida pelos três — nenhuma outra
5
+ skill precisa disso.
6
+
7
+ ---
8
+
9
+ ## Branch default
10
+
11
+ Nunca assuma `master`. Resolva em runtime via mecanismo compartilhado:
12
+
13
+ ```bash
14
+ DEFAULT_BRANCH=$(bash "$CLAUDE_PLUGIN_ROOT/scripts/vetor-checks.sh" default-branch)
15
+ ```
16
+
17
+ Use `$DEFAULT_BRANCH` em todos os comandos subsequentes (`git diff`, `git pull`, `git push`,
18
+ `gh pr create --base`, etc.).
19
+
20
+ ---
21
+
22
+ ## Comandos de teste por módulo (`module-test-map`)
23
+
24
+ **Mecanismo canônico de resolução (issue #160): sempre resolva via ROOT do repositório, nunca via
25
+ `cwd`.** Quando `fix-loop-agent`/`worktree-ship` rodam dentro de um worktree linkado, o worktree é
26
+ um checkout limpo — arquivos ignorados pelo `.gitignore` do projeto-alvo (ex.: uma entrada `.claude/`,
27
+ comum em setups que tratam config de assistente como local) nunca são materializados nele. Se
28
+ `.claude/vetor/module-test-map.md`/`config.json` só existirem no repositório principal, procurá-los
29
+ a partir do `cwd` do worktree falha silenciosamente — o agente ou inventa um comando de teste, ou
30
+ reporta erroneamente que não há suíte.
31
+
32
+ Resolva o root primeiro, sempre:
33
+
34
+ ```bash
35
+ REPO_ROOT=$(bash "$CLAUDE_PLUGIN_ROOT/scripts/vetor-checks.sh" repo-root)
36
+ ```
37
+
38
+ Esse subcomando usa `git rev-parse --git-common-dir`, que aponta para o `.git` compartilhado do
39
+ checkout principal mesmo quando executado de dentro de um worktree linkado — funciona tanto no root
40
+ quanto em qualquer worktree.
41
+
42
+ Em seguida, resolva nesta ordem, sempre a partir de `$REPO_ROOT` (nunca do `cwd`):
43
+
44
+ 1. Verifique se `$REPO_ROOT/.claude/vetor/module-test-map.md` existe.
45
+ 2. Se não existir, alerte o desenvolvedor que o ambiente não está inicializado e recomende rodar a skill `/vetor` para configurá-lo corretamente. Como fallback de execução automática, execute o script de auto-detecção:
46
+ ```bash
47
+ deno run -A "$CLAUDE_PLUGIN_ROOT/scripts/detect-project.ts"
48
+ ```
49
+ Imprima no console do desenvolvedor:
50
+ `echo "[Vetor:AutoSetup] ATENÇÃO: Configuração não encontrada. Recomenda-se rodar o comando /vetor para inicializar. Gerado mapeamento temporário em .claude/vetor/module-test-map.md"`
51
+ 3. Se a auto-detecção falhar, instrua o usuário a rodar o comando `/vetor` para preparar o ambiente.
52
+
53
+ O mesmo vale para `.claude/vetor/config.json` (que contém `testCommand`, `runtime`,
54
+ `packageManager`, etc.) — sempre leia via `$REPO_ROOT/.claude/vetor/config.json`, nunca via um path
55
+ relativo ao `cwd`.
56
+
57
+ Mapeie arquivos alterados (`git diff "$DEFAULT_BRANCH" --name-only`) aos módulos usando a tabela de
58
+ detecção do `module-test-map.md` resolvido.
59
+
60
+ **Nota (reforço redundante, opcional):** o `issue-coordinator`, ao detectar que `.claude/` está no
61
+ `.gitignore` do projeto-alvo (`git check-ignore -q .claude`), pode injetar os comandos de teste já
62
+ resolvidos diretamente no prompt de cada worker despachado, como reforço adicional — mas a fonte de
63
+ verdade permanece a resolução via `repo-root` acima, não essa injeção.
@@ -0,0 +1,81 @@
1
+ # Disciplina de TDD (Vetor)
2
+
3
+ Fonte única da disciplina de TDD do Vetor — consumida por referência (sem replicar texto) por
4
+ `planning-conventions.md` §3, `fix-loop-agent/SKILL.md` §3.b e `agents/issue-worker.md`. Adapta o
5
+ conjunto `engineering/tdd/SKILL.md` + `tests.md` + `mocking.md` de Matt Pocock
6
+ (github.com/mattpocock/skills) ao modo **headless** do Vetor — sem sessão síncrona de confirmação
7
+ com o usuário.
8
+
9
+ ---
10
+
11
+ ## 1. O que é um bom teste
12
+
13
+ Um bom teste verifica **comportamento observável através da interface pública** do módulo — nunca
14
+ detalhe de implementação. Se o teste quebra quando você refatora o interior de uma função sem mudar
15
+ seu comportamento externo, o teste está acoplado à implementação, não ao comportamento.
16
+
17
+ - Teste a partir do que o módulo expõe (função pública, endpoint, CLI, contrato) — não a partir de
18
+ variáveis internas, métodos privados ou estrutura de dados intermediária.
19
+ - Um bom teste sobrevive a uma refatoração interna legítima; só falha quando o comportamento
20
+ observável realmente muda.
21
+
22
+ ## 2. Seams (adaptado ao modo headless)
23
+
24
+ O mattpocock exige confirmar o *seam* (ponto de encaixe do teste, i.e. qual interface pública
25
+ testar) com o usuário antes de escrever o teste. `issue-worker` e `fix-loop-agent` rodam headless,
26
+ sem interlocutor disponível para essa confirmação síncrona.
27
+
28
+ **Adaptação — campo da issue primeiro**: antes de inferir, verifique se a issue original já declara
29
+ o seam (`gh issue view <N>` — bloco `## Contexto`, campo `Seam de Teste:`, preenchido pelo
30
+ `backlog-ideator` e confirmado pelo usuário no checkpoint de aprovação da criação da issue). Se
31
+ presente, use-o diretamente — não infira do zero. Isso cobre issues criadas pelo `/backlog`, cuja
32
+ confirmação síncrona já aconteceu enquanto havia humano no loop, antes da implementação headless.
33
+
34
+ **Fallback — inferência automática**: se o campo estiver ausente (issue criada manualmente, por
35
+ versão anterior do `backlog-ideator`, ou fora dele), infira o seam automaticamente a partir da
36
+ interface pública já mapeada no módulo (`module-test-map.md` — comando headless e módulo associado
37
+ ao path alterado). Se o seam correto for ambíguo (ex.: módulo sem interface pública clara, ou o path
38
+ alterado não mapeia para nenhum módulo conhecido), o worker registra `Status: BLOCKED_WAITING`
39
+ (mecanismo já existente em `agent-status.template.md`) em vez de inventar uma interação síncrona
40
+ nova — reaproveita a escalação que o `issue-coordinator` já sabe tratar.
41
+
42
+ ## 3. Três anti-padrões nomeados
43
+
44
+ Evite estes três padrões ao escrever o teste de reprodução:
45
+
46
+ 1. **Implementation-coupled** — o teste mocka um colaborador interno, chama um método privado, ou
47
+ verifica o resultado por um canal lateral (ex.: consulta direta ao banco em vez de usar a
48
+ interface pública do módulo). Sintoma: o teste quebra ao refatorar sem mudar comportamento.
49
+ 2. **Tautológico** — o valor esperado é recalculado da mesma forma que o código sob teste calcula
50
+ (ex.: `expect(soma(a, b)).toBe(a + b)`). O teste sempre passa, mesmo com bug — não prova nada. O
51
+ valor esperado deve vir de um literal conhecido ou de um exemplo trabalhado manualmente
52
+ (ex.: `expect(soma(2, 3)).toBe(5)`).
53
+ 3. **Horizontal slicing** — escrever todos os testes de todos os cenários antes de implementar
54
+ qualquer um deles. Regra oposta obrigatória: **vertical slice** (também chamado *tracer bullet*)
55
+ — um teste, uma implementação mínima que o faz passar, repete. Isso já é, na prática, o que o
56
+ loop do `fix-loop-agent` §3.b faz iteração a iteração; esta seção só nomeia a regra
57
+ explicitamente.
58
+
59
+ ## 4. Regras do loop vermelho-verde
60
+
61
+ - **Red antes de green**: escreva o teste de reprodução — cobrindo só o bug/comportamento em
62
+ questão — antes de tocar no código de produto. Confirme que ele falha pelo motivo esperado antes
63
+ de aplicar o fix.
64
+ - **Uma fatia por vez**: um teste por iteração (vertical slice, ver §3.3). Não acumule múltiplos
65
+ cenários não relacionados num único teste nem escreva testes para comportamento ainda não
66
+ implementado.
67
+ - **Refactor não é parte deste ciclo**: o ciclo vermelho-verde do `fix-loop-agent`/`issue-worker` não
68
+ deve tentar refatorar código adjacente ou melhorar arquitetura durante o fix. Achados de
69
+ refatoração/arquitetura ficam para o `code-review`, agente separado despachado depois pelo
70
+ `worktree-ship` (ver issue #178) — é o estágio dedicado a esse tipo de achado.
71
+
72
+ ## 5. Mocking
73
+
74
+ Mocke **apenas na fronteira do sistema**: API externa, tempo/aleatoriedade (clock, `Math.random`),
75
+ e — quando estritamente necessário para isolar o teste do ambiente — banco de dados ou filesystem.
76
+
77
+ **Nunca mocke um módulo ou classe do próprio projeto.** Se testar um módulo exige mockar outro
78
+ módulo interno para funcionar, isso é sinal de acoplamento excessivo entre eles — reavalie o design
79
+ em vez de mascarar o problema com mock (mas não trate essa reavaliação como parte do ciclo
80
+ vermelho-verde — ver §4, "refactor não é parte deste ciclo"; registre como achado para o
81
+ `code-review` posterior).
@@ -0,0 +1,30 @@
1
+ # Cache de arquivos tocados
2
+
3
+ Cache leve e efêmero, gravado pelo `fix-loop-agent` (§1) e consumido pelo `code-review`
4
+ (`agents/code-review.md`), para que este não tenha que re-derivar do zero a lista de arquivos
5
+ alterados e o mapeamento módulo → arquivos da mesma branch.
6
+
7
+ **Path:** `<repo-root>/.claude/vetor/status/<branch com / trocada por ->-touched-files.json`
8
+ (mesmo diretório e convenção de nome do status file; root via `git rev-parse --git-common-dir`).
9
+
10
+ **Formato:**
11
+
12
+ ```json
13
+ {
14
+ "branch": "<branch>",
15
+ "head": "<git rev-parse HEAD>",
16
+ "generated_at": "<ISO 8601>",
17
+ "default_branch": "<DEFAULT_BRANCH>",
18
+ "modules": {
19
+ "<módulo>": ["<arquivo1>", "<arquivo2>"]
20
+ },
21
+ "files": ["<arquivo1>", "<arquivo2>", "..."]
22
+ }
23
+ ```
24
+
25
+ **Regras de gravação:** sobrescreva sempre que os módulos forem (re)detectados — primeira execução e
26
+ qualquer iteração do loop em que novos arquivos tenham sido alterados. `head` deve refletir o
27
+ `git rev-parse HEAD` **no momento da gravação**, para que o consumidor consiga validar frescor.
28
+
29
+ **Ciclo de vida:** efêmero por branch/worktree. Descartado no cleanup do `worktree-ship` (passo 12);
30
+ nunca persiste entre PRs.