@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,156 @@
1
+ ---
2
+ name: retro
3
+ description: Avalia o uso do Vetor nesta sessão, destaca o que pode ser melhorado no plugin em si (não no projeto do usuário) e propõe issues para o repositório do Vetor, com aprovação antes de criar.
4
+ license: MIT
5
+ compatibility: Claude Code
6
+ metadata:
7
+ author: vitortavares
8
+ version: "1.0.0"
9
+ ---
10
+
11
+ Você é o retrospectivo do Vetor. Sua missão é olhar para trás nesta sessão, identificar onde o
12
+ **próprio plugin** (skills, agentes, hooks, scripts do Vetor) gerou fricção, ambiguidade ou
13
+ comportamento incorreto — e propor issues acionáveis no repositório do Vetor para alimentar seu
14
+ desenvolvimento.
15
+
16
+ **Escopo estrito:** isto avalia o Vetor, não o projeto do usuário. Bugs no código do projeto, dívida
17
+ técnica do projeto ou decisões de arquitetura do projeto **não** entram aqui — isso é trabalho do
18
+ `/vetor:backlog`.
19
+
20
+ ---
21
+
22
+ ## Sintaxe
23
+
24
+ ```
25
+ /vetor:retro
26
+ ```
27
+
28
+ Invocação manual, tipicamente ao final de uma sessão que usou uma ou mais skills do Vetor
29
+ (`backlog-ideator`, `issue-coordinator`, `guardian`, `worktree-create`, `worktree-ship`,
30
+ `fix-loop-agent`, `issue-worker`).
31
+
32
+ ---
33
+
34
+ ## Referências
35
+
36
+ > Paths relativos abaixo resolvem a partir do diretório desta própria skill (informado ao carregar,
37
+ > ex. "Base directory for this skill: ..."), não do `cwd` de execução. Em comandos `bash`/`deno run`,
38
+ > prefixe o path absoluto desse diretório ao caminho relativo antes de executar — defina uma vez:
39
+ > ```bash
40
+ > SKILL_DIR="<path absoluto informado como 'Base directory for this skill' no carregamento>"
41
+ > ```
42
+ > e use `"$SKILL_DIR/../../scripts/..."` em todo comando abaixo, nunca o path relativo isolado.
43
+
44
+ - `../shared/references/mcp-availability.md` — ao avaliar um achado sobre
45
+ hooks, slash commands, configuração de MCP, permissões ou SDK de agentes do próprio Claude Code, o
46
+ MCP `claude-code-docs` é **obrigatório quando disponível** (ver "Documentação do próprio Claude
47
+ Code (`claude-code-docs`)") antes de afirmar o comportamento esperado da plataforma. Nota: há
48
+ sobreposição parcial com o agente `claude-code-guide` (dúvidas gerais do usuário sobre o produto) —
49
+ o `retro` usa o MCP para decisões internas sobre o comportamento do Vetor, não para responder
50
+ perguntas do usuário sobre o Claude Code em si.
51
+
52
+ ---
53
+
54
+ ## Comportamento
55
+
56
+ ### 1 — Levantar o que aconteceu nesta sessão
57
+
58
+ Releia a conversa (não o histórico de outras sessões) em busca de interações com o Vetor. Para cada
59
+ skill/agente do Vetor invocado, procure por sinais de fricção real — não invente achados:
60
+
61
+ - **Você teve que improvisar** algo que a skill não documentava (ex.: um atalho, uma exceção, uma
62
+ interpretação de instrução ambígua).
63
+ - **O usuário corrigiu** um comportamento seu relacionado a uma skill do Vetor (não ao código do
64
+ projeto).
65
+ - **Uma alegação da skill se mostrou falsa** ao ser exercitada de verdade (ex.: um "enforcement" que
66
+ não bloqueou nada, um caminho documentado que não existe na plataforma).
67
+ - **Um efeito colateral não documentado** apareceu (ex.: arquivo escrito fora do esperado, chamada que
68
+ falhou silenciosamente).
69
+ - **Um passo pareceu redundante ou bloqueou sem necessidade** (aprovação dupla, checagem que nunca
70
+ se aplica neste tipo de projeto, etc.).
71
+
72
+ Se nenhuma dessas situações ocorreu na sessão, diga isso claramente e pare — não force achados.
73
+
74
+ ### 2 — Classificar e formular como issue candidata
75
+
76
+ Para cada achado real, monte:
77
+
78
+ ```markdown
79
+ ### <Título curto e específico>
80
+
81
+ **Tipo:** bug | enhancement | docs
82
+ **Skill/arquivo afetado:** <ex.: skills/issue-coordinator/SKILL.md>
83
+ **Evidência:** <trecho da sessão que mostra o problema — cite o que aconteceu, não hipótese>
84
+ **Descrição:** <o que está errado ou faltando, e o efeito prático>
85
+ **Sugestão de fix:** <se houver uma direção clara; opcional caso a solução não seja óbvia>
86
+ ```
87
+
88
+ Priorize achados que **realmente aconteceram** nesta sessão sobre problemas hipotéticos.
89
+
90
+ ### 3 — Verificar duplicatas no repositório do Vetor
91
+
92
+ Antes de propor criação, cheque se já existe issue equivalente no repo do Vetor (não no projeto
93
+ atual). Resolva o repo alvo lendo `homepage` (ou `repository`, se presente) de
94
+ `$SKILL_DIR/../../.claude-plugin/plugin.json` — hoje `Tavaressan/Vetor`.
95
+
96
+ Use a CLI `gh`:
97
+ ```bash
98
+ gh issue list --repo Tavaressan/Vetor --search "<palavras-chave>" --state all
99
+ ```
100
+
101
+ Se encontrar equivalente, não proponha criar de novo — anote como "já rastreado em #<N>" no resumo.
102
+
103
+ ### 4 — Apresentar e aguardar aprovação
104
+
105
+ Apresente a lista de issues candidatas (após remover duplicatas) e obtenha aprovação seguindo o
106
+ mecanismo do ecossistema atual (`../shared/references/planning-conventions.md`
107
+ §2.2 — plan mode nativo no Claude Code via `ExitPlanMode`, `implementation_plan.md` com
108
+ `request_feedback: true` no Antigravity, ou confirmação no chat).
109
+
110
+ **Pare** até a aprovação. O usuário pode aprovar todas, algumas, ou nenhuma.
111
+
112
+ ### 5 — Criar as issues aprovadas — sempre no repo do Vetor, nunca no do projeto
113
+
114
+ ⚠️ **Restrição crítica:** estas issues vão para o repositório do **plugin** (`Tavaressan/Vetor`, lido
115
+ do `plugin.json`), que quase sempre é diferente do repositório do projeto onde esta sessão está
116
+ rodando. Sempre especifique o repo explicitamente — nunca deixe implícito no diretório atual.
117
+
118
+ Use a CLI `gh`:
119
+ ```bash
120
+ gh issue create --repo Tavaressan/Vetor \
121
+ --title "<título>" \
122
+ --body "$(cat <<'EOF'
123
+ <corpo no formato de §2>
124
+
125
+ ---
126
+ 🤖 Gerado por `/vetor:retro` — sessão em <projeto atual, sem dados sensíveis>
127
+ EOF
128
+ )"
129
+ ```
130
+ Não passe `--label retro` se não tiver certeza de que o label existe no repo alvo — `gh issue
131
+ create` falha se o label não existir. Tente sem label em caso de erro, e reporte a falha do label
132
+ sem abortar a criação da issue.
133
+
134
+ Se a criação falhar (repo inacessível, sem permissão, `gh`/MCP indisponível), **não perca o
135
+ trabalho**: imprima a lista completa de issues candidatas no chat para o usuário copiar manualmente.
136
+
137
+ Após criação, imprima:
138
+
139
+ ```
140
+ Issues de retrospectiva criadas em Tavaressan/Vetor:
141
+ - #<N1> — <título 1>
142
+ - #<N2> — <título 2>
143
+
144
+ Já rastreados (duplicata, não recriado):
145
+ - #<N3> — <título existente>
146
+ ```
147
+
148
+ ---
149
+
150
+ ## Restrições
151
+
152
+ - Nunca avalia o código ou as issues do projeto do usuário — só o comportamento do Vetor
153
+ - Nunca cria issues sem aprovação explícita
154
+ - Nunca cria issues no repositório do projeto atual — sempre no repo do Vetor (`plugin.json`)
155
+ - Não força achados: sessão sem fricção real produz "nada a reportar", não issues artificiais
156
+ - Evidência é obrigatória por achado — sem trecho real da sessão, não vira issue candidata
@@ -0,0 +1,68 @@
1
+ # Status file — fonte única do formato
2
+
3
+ **Path canônico:** `<repo-root>/.claude/vetor/status/<branch com / trocada por ->.md`
4
+ (ex.: branch `fix/42-cache-ttl` → `.claude/vetor/status/fix-42-cache-ttl.md`).
5
+
6
+ Escrito pelo worker/fix-loop a cada iteração. Lido pelo `issue-coordinator` (via
7
+ `scripts/vetor-status.sh`) e pelo safety hook (que bloqueia `git push`/`gh pr *` de um worktree
8
+ enquanto `Status` ≠ `GREEN`). Fica **fora do worktree**, no root do repo — não há risco de commit
9
+ acidental; o `/vetor` init garante a entrada no `.gitignore`.
10
+
11
+ **Fallback (issue #94):** se a plataforma bloquear a escrita fora do worktree, o worker deve salvar
12
+ uma cópia em `<worktree>/.claude/vetor-status.md`. O coordinator verifica esse fallback ao ler.
13
+
14
+ ## Estrutura base (todos os estados)
15
+
16
+ ```markdown
17
+ # Agent Status — <branch>
18
+ Updated: <ISO 8601>
19
+ Status: RUNNING | BLOCKED_WAITING | GREEN | FAILED_MAX_ITERATIONS
20
+ Iteration: <N>/5 (Issue #<M>)
21
+ Last action: <última ação executada>
22
+ Next: <próximo passo planejado>
23
+ ```
24
+
25
+ ## Blocos adicionais por estado
26
+
27
+ **`BLOCKED_WAITING`** (obrigatórios — o coordinator escala ao usuário a partir deles; sem eles a
28
+ escalação não acontece):
29
+
30
+ ```markdown
31
+ Blocked on: <o que precisa — permissão, decisão técnica>
32
+ Options:
33
+ 1. <opção sugerida>
34
+ 2. <opção alternativa>
35
+ Recommendation: <opção recomendada e por quê>
36
+ ```
37
+
38
+ Quando o bloqueio for epistemológico (falta de informação, premissa não confirmada, evidências que
39
+ se contradizem) em vez de uma permissão de comando, use o vocabulário de
40
+ `$CLAUDE_PLUGIN_ROOT/skills/shared/references/evidence-state.md` para nomear a natureza do bloqueio
41
+ em `Blocked on` — ex.: `Blocked on: OPEN_QUESTION crítica — <pergunta>`, `Blocked on: ASSUMED sem
42
+ confirmação — <premissa>` ou `Blocked on: Evidence Conflict — <fontes em contradição>`. Isso não cria
43
+ um novo estado ou caminho de escalação: `BLOCKED_WAITING` continua sendo o único mecanismo; o
44
+ vocabulário apenas qualifica o motivo já registrado em `Blocked on`.
45
+
46
+ **`FAILED_MAX_ITERATIONS`**: além de atualizar o status, crie `FAIL_ANALYSIS.md` no root do
47
+ worktree com o handover de falha (ver `fix-loop-agent` §4).
48
+
49
+ Iterações em `BLOCKED_WAITING` não contam contra o orçamento de 5 do fix-loop (sugerido, não
50
+ enforced pelo hook — issue #156: ao atingi-lo, registre `BLOCKED_WAITING` ou
51
+ `FAILED_MAX_ITERATIONS`, nunca decida sozinho continuar).
52
+
53
+ ## Efeitos colaterais externos (fora do controle de versão)
54
+
55
+ Testes locais passarem (verde) não é evidência de que uma ação que altera estado **fora do repositório**
56
+ de fato colou — ex.: `gh api` fazendo PATCH/POST em branch protection, webhooks, secrets, configurações
57
+ de repositório/organização no GitHub, ou qualquer outra chamada de API externa que muda estado remoto.
58
+
59
+ **Regra:** antes de marcar `Status: GREEN` para uma ação desse tipo, o worker deve rodar um GET (ou
60
+ comando de leitura equivalente) que confirme o novo estado imediatamente após o PATCH/POST, e incluir
61
+ o resultado bruto (ou um resumo objetivo e verificável) no `Last action` do status file.
62
+
63
+ - Se a verificação confirmar o estado esperado → prossiga para `GREEN` normalmente.
64
+ - Se a verificação falhar, for inconclusiva, ou não puder ser executada (ex.: falta de permissão) →
65
+ marque `Status: BLOCKED_WAITING` com o motivo em `Blocked on`, nunca `GREEN` sem confirmação.
66
+
67
+ Isso evita que o `issue-coordinator` e sessões futuras confiem em um estado externo que pode nunca ter
68
+ sido aplicado ou que foi revertido silenciosamente, sem nenhum sinal de alerta no painel de status.
@@ -0,0 +1,54 @@
1
+ # Vocabulário de design de código (Vetor)
2
+
3
+ Fonte única do vocabulário de arquitetura consumido por referência (sem replicar texto) por
4
+ `architecture-review/SKILL.md` e pelo Check 9 do `guardian/SKILL.md` (que hoje usa "deletion test"/
5
+ "fan-in" de forma solta, sem definição centralizada). Adapta o skill público
6
+ `engineering/codebase-design` de Matt Pocock (github.com/mattpocock/skills) ao vocabulário do Vetor.
7
+
8
+ Use estes termos consistentemente — nunca "componente"/"service"/"boundary" como sinônimo frouxo de
9
+ `module`/`seam`.
10
+
11
+ ---
12
+
13
+ ## Termos
14
+
15
+ - **Module (módulo)** — unidade de código com uma responsabilidade coesa e um limite identificável
16
+ (arquivo, diretório, package). A pergunta relevante nunca é "esse arquivo é grande?", mas "esse
17
+ módulo tem uma única razão coerente para mudar?".
18
+ - **Interface** — a superfície pública através da qual outros módulos interagem com um módulo
19
+ (função exportada, endpoint, CLI, contrato de tipo). Tudo que não é interface é **implementação**
20
+ — livre para mudar sem quebrar quem depende do módulo.
21
+ - **Depth (profundidade)** — relação entre o tamanho da interface e o poder da funcionalidade que ela
22
+ esconde. Um módulo **profundo** expõe pouco e faz muito (alta profundidade); um módulo **raso**
23
+ (shallow) expõe quase tanto quanto implementa — a interface já é praticamente a implementação, e
24
+ não economiza nada de quem a usa entender o módulo.
25
+ - **Seam** — o ponto de encaixe entre dois módulos, onde um comportamento pode ser trocado/isolado
26
+ sem tocar o outro lado. É também, por definição, a superfície de teste de um módulo (ver
27
+ Princípio 2).
28
+ - **Adapter** — implementação concreta que plugga em um seam (ex.: driver de banco específico atrás
29
+ de uma interface de repositório). Um único adapter existente não prova que o seam é real — pode
30
+ ser especulação prematura (ver Princípio 3).
31
+ - **Leverage (alavancagem)** — o ganho que uma mudança de design compra: quanto código a mais se
32
+ torna simples, testável ou substituível por causa dela. Alavancagem baixa é sinal de que a
33
+ reestruturação proposta não paga o custo de fazê-la.
34
+ - **Locality (localidade)** — o quanto o código relevante para entender ou corrigir um comportamento
35
+ está fisicamente próximo (mesmo módulo/arquivo) de onde o comportamento é observado. Baixa
36
+ localidade é o sintoma clássico de uma função pura extraída só para testabilidade, enquanto o bug
37
+ real mora em como ela é chamada.
38
+
39
+ ## Princípios
40
+
41
+ 1. **Deletion test.** Para avaliar se um módulo/abstração paga o custo de existir: imagine deletá-lo
42
+ e inlinar seu conteúdo no(s) chamador(es). Se o resultado fica mais simples de entender (menos
43
+ indireção, sem perda de teste relevante), a abstração provavelmente não deveria existir como está.
44
+ Se o resultado fica mais confuso ou duplica lógica não trivial, a abstração se justifica. É
45
+ julgamento qualitativo sobre legibilidade e coesão — não uma métrica textual (ex.: contagem de
46
+ linhas ou de referências) que a substitua sozinha.
47
+ 2. **A interface é a superfície de teste.** Um bom teste exercita o módulo pela sua interface pública
48
+ — nunca por um detalhe de implementação exposto lateralmente. Se testar um módulo exige alcançar
49
+ além da sua interface, o seam está no lugar errado (mesma disciplina de `tdd-conventions.md` §1-2,
50
+ aplicada aqui à avaliação arquitetural, não ao ciclo vermelho-verde).
51
+ 3. **Um adapter é seam hipotético; dois é seam real.** Uma interface desenhada para "permitir trocar
52
+ a implementação no futuro" com um único adapter implementado é especulação (YAGNI) até que um
53
+ segundo adapter concreto exista. Dois adapters reais confirmam que o seam paga o custo de existir;
54
+ um só ainda não prova nada.
@@ -0,0 +1,94 @@
1
+ # Resolução de conflitos de merge
2
+
3
+ Procedimento compartilhado, usado pelo `worktree-ship` (passos 2 e 10) quando `git merge` da branch
4
+ default deixa arquivos conflitantes.
5
+
6
+ ## Princípio geral — Resolver por intenção
7
+
8
+ Antes de aceitar ou descartar código em conflito, sempre **inspecione a intenção de cada lado** usando
9
+ `git log` e `git show`:
10
+
11
+ 1. **Seu lado (current branch):** `git log --oneline -5` (últimos 5 commits) para entender o contexto
12
+ local, depois `git show <hash>` para ver a mudança específica que criou o conflito.
13
+
14
+ 2. **Lado remoto (default branch):** `git show origin/$DEFAULT_BRANCH:<filepath>` para ver a versão
15
+ resolvida no default, depois `git log origin/$DEFAULT_BRANCH --oneline -5` para entender a
16
+ intenção remota.
17
+
18
+ 3. **Decida pela lógica de negócio:** a mensagem de commit, o conteúdo exato e o contexto histórico
19
+ juntos revelam qual versão respeita melhor as regras do produto e do projeto.
20
+
21
+ Isso é **resolução consciente por intenção**, não mecanicamente por padrão sintático — distingue-se
22
+ do safety-valve de orçamento esgotado (§5.3), que é um fallback quando a inspeção honesta não
23
+ resolve a ambiguidade.
24
+
25
+ ## 1 — Identificar os conflitos
26
+
27
+ ```bash
28
+ git diff --name-only --diff-filter=U
29
+ ```
30
+
31
+ ## 2 — Lockfiles (KISS/YAGNI)
32
+
33
+ Para arquivos de lock na lista (`deno.lock`, `package-lock.json`, `pnpm-lock.yaml`, `yarn.lock`,
34
+ `Cargo.lock`, `poetry.lock`):
35
+
36
+ 1. `git checkout --theirs <lockfile-path>` — aceita a versão da branch default e limpa os marcadores.
37
+ 2. Execute o instalador do projeto (`deno install`, `npm install`, `pnpm install`, `cargo build`,
38
+ `poetry lock --no-update`) para que o próprio gerenciador regenere o lockfile reconciliado. O
39
+ `runtime` gravado em `.claude/vetor/config.json` diz qual usar.
40
+ 3. `git add <lockfile-path>`
41
+
42
+ Nunca mescle lockfile à mão.
43
+
44
+ ## 3 — Conflitos aditivos em listas
45
+
46
+ Quando dois workers paralelos editam **a mesma linha** de um campo que agrega itens (scripts de
47
+ `package.json`, arrays JSON, strings concatenadas com `&&`) e **ambos os lados só adicionam**, aplique
48
+ **união aditiva** em vez de escolher um lado:
49
+
50
+ ```json
51
+ <<<<<<< HEAD
52
+ "scripts": { "test": "jest unit && npm run lint" }
53
+ =======
54
+ "scripts": { "test": "jest unit && npm run e2e" }
55
+ >>>>>>> origin/master
56
+ ```
57
+
58
+ Resolução:
59
+
60
+ ```json
61
+ "scripts": { "test": "jest unit && npm run lint && npm run e2e" }
62
+ ```
63
+
64
+ Remova duplicatas do resultado e `git add <arquivo>`.
65
+
66
+ Se um dos lados **remove** algo que o outro mantém, não é conflito aditivo — trate como código (§4).
67
+
68
+ ## 4 — Demais arquivos de código
69
+
70
+ Localize os marcadores (`<<<<<<<`, `=======`, `>>>>>>>`), mescle logicamente as regras de negócio e
71
+ remova os marcadores.
72
+
73
+ ## 5 — Validar
74
+
75
+ 1. Execute os testes do módulo correspondente via `module-test-map`.
76
+ 2. **Verde:** commite (`merge branch '$DEFAULT_BRANCH' and resolve conflicts`), `git push origin <branch>`.
77
+ 3. **Vermelho:** chame o `fix-loop-agent` localmente. Se as iterações estourarem sem verde, aborte o
78
+ merge, preserve o worktree e alerte o usuário.
79
+
80
+ ⚠️ **Nunca rode `git stash` (ou `git checkout` para outro branch) enquanto um merge está em conflito
81
+ e ainda não commitado.** Qualquer comando que descarte `MERGE_HEAD` faz o `git commit` seguinte virar
82
+ um commit comum de 1 pai — mesmo com a árvore correta, o GitHub recalcula o merge do zero (a partir
83
+ do merge-base real) e reporta `mergeable: CONFLICTING`/`mergeStateStatus: DIRTY`, mesmo já resolvido
84
+ localmente. Para inspecionar o conteúdo de outro branch sem alterar o estado do merge em andamento,
85
+ use:
86
+
87
+ ```bash
88
+ git show "origin/$DEFAULT_BRANCH:<path>"
89
+ ```
90
+
91
+ Se `MERGE_HEAD` já foi perdido por engano, refaça o merge do zero (`git merge --abort` se ainda
92
+ houver estado parcial recuperável, ou `git merge -s ours "origin/$DEFAULT_BRANCH" -m "merge branch
93
+ '$DEFAULT_BRANCH' and resolve conflicts"` para registrar o segundo pai sem alterar a árvore já
94
+ resolvida) antes de prosseguir para o passo 2 do `worktree-ship`.
@@ -0,0 +1,239 @@
1
+ # Delegação assistida a runtime externo (opcional, agnóstica de provedor)
2
+
3
+ Referência compartilhada para economizar tokens delegando **tarefas mecânicas e de baixo
4
+ risco** a um CLI externo de IA. Padrão: **o runtime delegado rascunha, Claude valida.**
5
+
6
+ Consumida por `worktree-ship`, `fix-loop-agent`, `backlog-ideator`, `guardian` e
7
+ `issue-coordinator`.
8
+
9
+ Generaliza o antigo acoplamento a um único CLI (`agy` — Google Antigravity/Gemini CLI): a
10
+ delegação agora suporta qualquer runtime candidato (Gemini/`agy`, OpenCode/`opencode`,
11
+ Codex/`codex`, ou outro CLI futuro), escolhido por disponibilidade no ambiente, preferência
12
+ configurada e, quando ambíguo, anuência explícita do usuário (issue #247).
13
+
14
+ ---
15
+
16
+ ## 1. Detecção (zero dependência obrigatória, detecção estática)
17
+
18
+ Mesmo princípio já validado para MCPs em `mcp-availability.md`: **olhar se o binário existe no
19
+ PATH**, nunca "tentar a chamada para ver se funciona" (issue #247 reaproveita esse princípio para
20
+ CLIs externos, não só MCPs).
21
+
22
+ No início da skill, detecte todos os candidatos em **uma única chamada em lote** (não uma por
23
+ runtime, para não gastar turnos):
24
+
25
+ ```bash
26
+ command -v agy 2>/dev/null; command -v opencode 2>/dev/null; command -v codex 2>/dev/null
27
+ ```
28
+
29
+ Monte a lista `available` com os que retornaram um path. Runtimes candidatos conhecidos hoje:
30
+
31
+ | Runtime | Binário | Invocação não-interativa | Consome stdin via pipe (pré-requisito das tarefas §4)? |
32
+ |---------|---------|---|---|
33
+ | Gemini (Antigravity) | `agy` | `agy -p "<prompt>"` — `-p`/`--print` roda um prompt único e imprime a resposta | **Não funciona com modo padrão** — flag `--input-format` padrão é `text`, que ignora stdin (regressão de #111). Alternativa verificada: embutir conteúdo no argumento do prompt: `agy -p "... $conteudo"` (válido para conteúdo que cabe no limite de linha de comando); para conteúdo grande, use `opencode` (stdin confirmado empiricamente) em vez de `agy`. |
34
+ | OpenCode | `opencode` | `opencode run "<prompt>"` — mensagem como argumento posicional, não flag `-p` (`-p`/`--password` do OpenCode é autenticação HTTP, não prompt — não confundir com o `-p` do `agy`) | **Confirmado empiricamente**: `echo "MARCADOR-XYZ-123" \| opencode run --model <free> "Repita exatamente o texto que você recebeu via stdin"` devolveu `MARCADOR-XYZ-123` — o conteúdo do pipe chega ao modelo mesmo sem flag dedicada |
35
+ | Codex | `codex` | `codex exec "<prompt>"` (sintaxe **não verificada neste ambiente** — binário não estava instalado nem MCP de documentação disponível na sessão que escreveu esta referência) | **Não verificado** |
36
+
37
+ **Regra:** um runtime com consumo de stdin **não verificado** nunca deve ser usado para as tarefas
38
+ de §4 (todas dependem do pipe `<producer> | $DELEGATE "..."` carregar o conteúdo real). Um CLI que
39
+ ignora silenciosamente o stdin ainda retorna exit 0 e uma resposta plausível — não é uma falha que
40
+ o guardrail do §3 detecta, é uma alucinação sobre um input que o runtime nunca recebeu. Antes do
41
+ primeiro uso de um runtime novo em produção: rode o teste de eco acima (`echo "<marcador>" | <cli> "repita o marcador"`) e só marque a coluna acima como confirmada se o marcador voltar exato. Enquanto
42
+ não confirmado, trate esse runtime como **não viável para §4** (mesmo que detectado no PATH) — se
43
+ for o único candidato disponível, siga inline; use o CLI apenas via seu mecanismo documentado de
44
+ anexo de arquivo (ex.: `-f/--file` do `opencode`) se a tarefa permitir.
45
+
46
+ **Preferência configurada:** leia `.claude/vetor/config.json` → bloco opcional `delegation`:
47
+
48
+ ```json
49
+ {
50
+ "delegation": { "preferredRuntime": "opencode" }
51
+ }
52
+ ```
53
+
54
+ (Exemplo mostra `opencode` como preferência recomendada: é o único com suporte comprovado a stdin
55
+ em todas as tarefas de §4. Se preferir `agy`, consulte a linha da tabela do §1 para limitações e alternativas.)
56
+
57
+ Ausência do bloco `delegation` (ou do `config.json` inteiro) nunca é erro — mesmo contrato do
58
+ bloco `knowledge` (ver `skills/vetor/SKILL.md`).
59
+
60
+ ## 2. Algoritmo de seleção
61
+
62
+ Com `available` (lista detectada) e `preferred` (config, pode ser `null`):
63
+
64
+ 1. **`available` vazio** → siga **inline**. Nunca falhe nem peça instalação — a delegação é
65
+ puramente opcional.
66
+ 2. **`preferred` configurado:**
67
+ - Se `preferred` está em `available` → delegue para `preferred`.
68
+ - Se `preferred` **não** está em `available` → siga **inline**. Nunca substitua
69
+ silenciosamente por outro candidato disponível: o usuário consentiu com um runtime
70
+ específico, não com "qualquer um" (issue #247 — "nenhum runtime é assumido como
71
+ padrão/preferencial sem configuração ou anuência").
72
+ 3. **Sem `preferred`, `available` com exatamente 1 candidato** → delegue para ele. Não há
73
+ ambiguidade entre runtimes a resolver, então não é necessário perguntar (a anuência explícita
74
+ só é exigida "quando houver mais de um runtime viável e nenhuma preferência registrada").
75
+ 4. **Sem `preferred`, `available` com 2+ candidatos (ambíguo):**
76
+ - **Sessão interativa** (há interlocutor, ex.: `issue-coordinator` fora de `--headless`):
77
+ pergunte ao usuário qual runtime usar (mecanismo de seleção interativa da skill, quando
78
+ disponível). Ofereça salvar a escolha em `delegation.preferredRuntime` para não perguntar de
79
+ novo.
80
+ - **Sessão headless** (`fix-loop-agent`, `issue-worker`, `guardian`, `backlog-ideator` sem
81
+ interlocutor): **critério de desempate documentado é sempre inline** — nunca escolha
82
+ silenciosamente entre candidatos não consentidos. Isso é intencional mesmo que sacrifique
83
+ uma oportunidade de economia de tokens: é o preço de não assumir uma preferência que
84
+ ninguém configurou.
85
+
86
+ Lógica de referência (implementada e testada em `scripts/lib/delegation-runtime.ts`,
87
+ `scripts/tests/delegation-runtime_test.ts`):
88
+
89
+ ```ts
90
+ selectDelegationRuntime({ available, preferred, interactive });
91
+ // => { action: "inline" | "delegate" | "ask", runtime?, reason }
92
+ ```
93
+
94
+ Skills que rodam em Deno podem importar a função diretamente; skills descritas só em markdown
95
+ devem seguir o mesmo algoritmo em prosa (passos 1-4 acima).
96
+
97
+ Antes de rodar o comando de delegação escolhido, **sempre imprima um log explícito no console**:
98
+ `echo "[Vetor:Delegação] Delegando tarefa a <runtime>: <breve descrição>"`.
99
+
100
+ **Nota — cache próprio de alguns runtimes fora do projeto:** o `agy`, por exemplo, pode persistir
101
+ uma cópia do rascunho em `~/.gemini/antigravity-cli/brain/<uuid>/...` (fora do repositório e do
102
+ controle de versão). Isso é comportamento do CLI externo, não do Vetor — o Vetor consome apenas a
103
+ saída via stdout (pipe) e não depende nem gerencia esse cache. Não é necessário limpar esses
104
+ arquivos manualmente.
105
+
106
+ ---
107
+
108
+ ## 3. Qualquer falha do CLI delegado = fallback inline imediato, sem retry
109
+
110
+ Duas categorias distintas de falha, **mesma resposta para ambas**:
111
+
112
+ ### 3.a Negação de permissão pelo classificador de auto-mode
113
+
114
+ Mesmo com o binário presente, a chamada pode ser **negada em runtime** pela camada de
115
+ permissão/classificador de auto-mode do Claude Code — motivo típico é **exfiltração de dados**
116
+ (envio de diff ou conteúdo de código confidencial para CLI externo não estabelecido como
117
+ confiável).
118
+
119
+ **Esta não é uma falha transiente de rede; é uma política de segurança.** Não deve ser
120
+ retentada.
121
+
122
+ ### 3.b Falha genérica do CLI (encoding, crash, timeout, exit code ≠ 0)
123
+
124
+ Já observado em produção: uma chamada ao `agy` pode falhar com um erro genérico de encoding
125
+ (`proto: field ... contains invalid UTF-8`) ao processar texto em português com acentuação. Isso
126
+ não é exclusivo do Gemini — qualquer CLI externo pode falhar de formas imprevisíveis
127
+ (encoding, crash, timeout, versão incompatível).
128
+
129
+ **Regra única para 3.a e 3.b:** qualquer falha do CLI de delegação (exit code ≠ 0, exceção,
130
+ negação de permissão, saída vazia/corrompida) — não só ausência do binário — é motivo de
131
+ **fallback inline imediato**:
132
+
133
+ 1. **Não retente** — nem o mesmo runtime, nem trocar para outro candidato disponível. A
134
+ simplicidade do "sem retry" evita loops de tentativa em CLIs com falhas erráticas.
135
+ 2. **Use o fallback inline imediatamente** — monte a descrição, o resumo ou o rascunho
136
+ manualmente usando o template padrão fornecido na skill (ex.: template de PR padrão em §6 do
137
+ `worktree-ship`).
138
+ 3. **Prossiga sem atraso** — evita I/O desnecessário e mensagens de erro em sessões com
139
+ auto-mode restritivo.
140
+
141
+ A delegação é **opcional e confortável para falhar**; a tarefa sempre tem um caminho inline
142
+ viável.
143
+
144
+ ---
145
+
146
+ ## 4. Tarefas delegáveis (baixo risco, alto volume)
147
+
148
+ Mesmo contrato de saída independente do runtime escolhido: substitua `$DELEGATE` pelo comando de
149
+ invocação do runtime selecionado no passo 2 (tabela do §1).
150
+
151
+ ### 4.1. Resumir logs de CI / build
152
+ Antes de diagnosticar uma falha, condense o log bruto para não despejar centenas de
153
+ linhas no contexto:
154
+
155
+ ```bash
156
+ gh run view <run-id> --log-failed \
157
+ | $DELEGATE "Resuma a causa raiz das falhas neste log de CI em até 15 linhas, citando arquivo:linha quando houver. Não invente; se não houver causa clara, diga isso."
158
+ ```
159
+
160
+ O Claude lê o resumo e **decide o fix**. Usado por `worktree-ship` (monitorar CI) e
161
+ `fix-loop-agent` (avaliar resultado dos testes).
162
+
163
+ ### 4.2. Rascunhar texto de issues
164
+ Em `backlog-ideator`, gere a primeira versão do corpo da issue:
165
+
166
+ ```bash
167
+ $DELEGATE "Escreva o corpo de uma issue GitHub (descrição + critério de aceite verificável) para: <tema>. Conciso, em PT-BR."
168
+ ```
169
+
170
+ O Claude **revisa e ancora** o rascunho na documentação do projeto antes de criar via
171
+ `gh issue create`.
172
+
173
+ ### 4.3. Rascunhar mensagens de commit e relatórios
174
+ Mensagens de commit (`fix-loop-agent`, `worktree-ship`) e o relatório do `guardian`:
175
+
176
+ ```bash
177
+ git diff --staged | $DELEGATE "Escreva uma mensagem de commit conventional commits (uma linha de subject + corpo opcional) para este diff."
178
+ ```
179
+
180
+ O Claude valida o rascunho antes de usar.
181
+
182
+ ### 4.4. Rascunhar corpo/descrição de Pull Request
183
+ Em `worktree-ship`, gere a primeira versão da descrição do Pull Request com base no diff acumulado da branch em relação à branch default do projeto:
184
+
185
+ ```bash
186
+ git diff "$DEFAULT_BRANCH"...HEAD | $DELEGATE "Escreva uma descrição concisa e estruturada de Pull Request para este diff. Use markdown em PT-BR com seções: 'O que mudou' (tópicos curtos) e 'Como testar'."
187
+ ```
188
+
189
+ O Claude **revisa e formata** a descrição antes de passá-la ao comando `gh pr create --body`.
190
+
191
+ ### 4.5. Análise de afinidade e agrupamento de issues
192
+ Em `issue-coordinator`, delegue a varredura e o agrupamento preliminar de issues em lote:
193
+
194
+ ```bash
195
+ gh issue list --label <label> --state open --json number,title,labels,body \
196
+ | $DELEGATE "Analise estas issues em formato JSON e sugira um agrupamento de afinidade. Retorne o resultado em formato markdown estruturado indicando para cada grupo a Lead Issue, as issues secundárias subsequentes do grupo, o slug sugerido e se o modelo ideal de execução deve ser haiku (ajustes simples/chore) ou sonnet (features complexas/refactor)."
197
+ ```
198
+
199
+ O Claude **valida a afinidade**, resolve eventuais erros do rascunho e constrói a tabela final de dispatch.
200
+
201
+ ### 4.6. Geração de Changelog de Sessão
202
+ No `issue-coordinator`, delegue a criação do changelog consolidado a partir do histórico de commits da sessão. **Sempre limite o range** (a regra de 100 linhas de `planning-conventions.md` §1.1 vale para histórico de git também) — `origin/main...HEAD` sozinho não é suficiente como limite: uma branch de longa duração e nunca rebaseada pode produzir um range enorme. Use um cap numérico fixo além do range:
203
+
204
+ ```bash
205
+ git log origin/main...HEAD --oneline -200 | $DELEGATE "Com base nestes commits, crie um Changelog em markdown em PT-BR organizado pelas seções: Melhorias (features), Correções (fixes) e Outros."
206
+ ```
207
+
208
+ O Claude **valida o texto**, refina o formato e salva no arquivo `.claude/vetor/CHANGELOG.md`.
209
+
210
+ ### 4.7. Validação de Migrations
211
+ No `guardian`, envie o dump de arquivos de migrations para verificar a integridade da sequência temporal:
212
+
213
+ ```bash
214
+ ls "$MIGRATIONS_DIR" | $DELEGATE "Examine esta listagem de arquivos de migrations e detecte se existem timestamps/versões fora de ordem, buracos na sequência cronológica de numeração ou desvios do padrão de nomenclatura V<N>__<descrição>.sql."
215
+ ```
216
+
217
+ O Claude **avalia os findings apontados** e os compila no relatório da auditoria.
218
+
219
+ ### 4.8. Resumo Conceitual da Arquitetura
220
+ No `backlog-ideator`, envie arquivos longos de documentação para obter uma síntese executiva de apoio à ideação:
221
+
222
+ ```bash
223
+ cat ARCHITECTURE.md docs/*.md | $DELEGATE "Gere um resumo arquitetural consolidado deste projeto contendo os principais padrões de design e módulos, para que um agente possa compreender a estrutura do sistema rapidamente."
224
+ ```
225
+
226
+ O Claude **usa este sumário como âncora conceitual** sem precisar ler dezenas de arquivos markdown na íntegra.
227
+
228
+ ---
229
+
230
+ ## 5. Guardrail (invariante — não negociável, independe do runtime)
231
+
232
+ **NUNCA delegue a nenhum runtime externo:**
233
+ - Aplicação de correções de código / geração de diffs (`fix-loop-agent`)
234
+ - Resolução de conflitos de merge
235
+ - Decisão de fazer (ou não) merge
236
+
237
+ Essas etapas ficam **sempre** com o Claude. Toda saída delegada é tratada como rascunho
238
+ não confiável e **validada pelo Claude antes de qualquer escrita** (commit, push, criação
239
+ de PR ou merge). Em caso de dúvida sobre a qualidade do rascunho, descarte-o e faça inline.