@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.
- package/README.md +42 -0
- package/bin/vetor.js +6 -0
- package/lib/banner.js +35 -0
- package/lib/commands/install.js +71 -0
- package/lib/commands/status.js +59 -0
- package/lib/commands/uninstall.js +119 -0
- package/lib/commands/update.js +63 -0
- package/lib/installer/command-exists.js +30 -0
- package/lib/installer/cursor-hooks.js +181 -0
- package/lib/installer/detector.js +79 -0
- package/lib/installer/manifest.js +76 -0
- package/lib/installer/prompts.js +97 -0
- package/lib/installer/writer.js +382 -0
- package/lib/router.js +50 -0
- package/package.json +39 -0
- package/templates/.gitkeep +0 -0
- package/templates/agents/code-review/agent.json +27 -0
- package/templates/agents/code-review/codex.toml +37 -0
- package/templates/agents/code-review.md +99 -0
- package/templates/agents/issue-worker/agent.json +33 -0
- package/templates/agents/issue-worker/codex.toml +57 -0
- package/templates/agents/issue-worker.md +112 -0
- package/templates/hooks/hooks-codex.json +48 -0
- package/templates/hooks/hooks.json +62 -0
- package/templates/opencode/agent/code-review.md +73 -0
- package/templates/opencode/agent/issue-coordinator.md +521 -0
- package/templates/opencode/agent/issue-worker.md +64 -0
- package/templates/opencode/mcp.jsonc +39 -0
- package/templates/opencode/plugin/vetor.ts +207 -0
- package/templates/opencode/scripts/agent-registration_test.ts +92 -0
- package/templates/opencode/scripts/check-edit.ts +147 -0
- package/templates/opencode/scripts/ensure-external-directory-permission.ts +110 -0
- package/templates/opencode/scripts/ensure-external-directory-permission_test.ts +142 -0
- package/templates/opencode/scripts/lib/guard.ts +45 -0
- package/templates/opencode/scripts/lib/model-health.ts +133 -0
- package/templates/opencode/scripts/lib/model-health_test.ts +181 -0
- package/templates/opencode/scripts/lib/project.ts +240 -0
- package/templates/opencode/scripts/lib/project_test.ts +45 -0
- package/templates/opencode/scripts/lib/status.ts +69 -0
- package/templates/opencode/scripts/lib/worktree.ts +41 -0
- package/templates/opencode/scripts/model-health.ts +50 -0
- package/templates/opencode/scripts/model-health_test.ts +80 -0
- package/templates/opencode/scripts/resolve-model.ts +112 -0
- package/templates/opencode/scripts/resolve-model_test.ts +185 -0
- package/templates/opencode/scripts/safety-check.ts +203 -0
- package/templates/opencode/scripts/vetor-checks.sh +217 -0
- package/templates/opencode/scripts/vetor-status.sh +99 -0
- package/templates/skills/architecture-review/SKILL.md +187 -0
- package/templates/skills/backlog-ideator/SKILL.md +277 -0
- package/templates/skills/design/SKILL.md +468 -0
- package/templates/skills/design/examples/design-contract-example.md +46 -0
- package/templates/skills/design/examples/prototype-handoff-example.md +142 -0
- package/templates/skills/fix-loop-agent/SKILL.md +255 -0
- package/templates/skills/guardian/SKILL.md +343 -0
- package/templates/skills/issue-coordinator/SKILL.md +596 -0
- package/templates/skills/retro/SKILL.md +156 -0
- package/templates/skills/shared/references/agent-status.template.md +68 -0
- package/templates/skills/shared/references/codebase-design-vocabulary.md +54 -0
- package/templates/skills/shared/references/conflict-resolution.md +94 -0
- package/templates/skills/shared/references/delegate-to-runtime.md +239 -0
- package/templates/skills/shared/references/design-vocabulary.md +508 -0
- package/templates/skills/shared/references/evidence-state.md +365 -0
- package/templates/skills/shared/references/frontend-design-enforcement.md +33 -0
- package/templates/skills/shared/references/grilling-conventions.md +64 -0
- package/templates/skills/shared/references/knowledge-provider-contract.md +150 -0
- package/templates/skills/shared/references/mcp-availability.md +104 -0
- package/templates/skills/shared/references/module-test-map.template.md +72 -0
- package/templates/skills/shared/references/planning-conventions.md +97 -0
- package/templates/skills/shared/references/project-conventions.md +63 -0
- package/templates/skills/shared/references/tdd-conventions.md +81 -0
- package/templates/skills/shared/references/touched-files-cache.md +30 -0
- package/templates/skills/spec/SKILL.md +524 -0
- package/templates/skills/spec-validate/SKILL.md +195 -0
- package/templates/skills/spec-validate/references/traceability.md +169 -0
- package/templates/skills/stack-practices/SKILL.md +151 -0
- package/templates/skills/vetor/SKILL.md +174 -0
- package/templates/skills/worktree-create/SKILL.md +142 -0
- 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.
|