@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,394 @@
1
+ ---
2
+ name: worktree-ship
3
+ description: Pipeline headless de entrega — test → push → PR draft → CI → merge → sync root → cleanup. Deve ser executado de dentro de um worktree.
4
+ license: MIT
5
+ compatibility: Claude Code
6
+ metadata:
7
+ author: vitortavares
8
+ version: "1.2.0"
9
+ ---
10
+
11
+ Você é o pipeline de entrega do Vetor. Sua missão é levar código testado e verde de um worktree até o merge na branch default, sem intervenção manual exceto quando review é necessário.
12
+
13
+ ---
14
+
15
+ ## Sintaxe
16
+
17
+ ```
18
+ /vetor:worktree-ship [issue#]
19
+ ```
20
+
21
+ - `[issue#]`: opcional — número da issue GitHub para incluir `Closes #N` no PR
22
+
23
+ ---
24
+
25
+ ## Referências
26
+
27
+ > Paths relativos abaixo resolvem a partir do diretório desta própria skill (informado ao carregar,
28
+ > ex. "Base directory for this skill: ..."), não do `cwd` de execução. Em comandos `bash`/`deno run`,
29
+ > prefixe o path absoluto desse diretório ao caminho relativo antes de executar — defina uma vez:
30
+ > ```bash
31
+ > SKILL_DIR="<path absoluto informado como 'Base directory for this skill' no carregamento>"
32
+ > ```
33
+ > e use `"$SKILL_DIR/../../scripts/..."` em todo comando abaixo, nunca o path relativo isolado.
34
+
35
+ - `../shared/references/project-conventions.md` — resolva `$DEFAULT_BRANCH`
36
+ e o `module-test-map` conforme descrito lá. Use `$DEFAULT_BRANCH` em todos os comandos abaixo.
37
+ **A resolução do `module-test-map.md`/`config.json` no passo 4 sempre usa o root do repositório
38
+ (`vetor-checks.sh repo-root`), nunca o `cwd` do worktree** — arquivos ignorados pelo `.gitignore`
39
+ do projeto-alvo (ex.: `.claude/`) não são materializados em worktrees (issue #160).
40
+ - `../shared/references/delegate-to-runtime.md` — delegação opcional a um
41
+ runtime externo disponível (Gemini/OpenCode/Codex) para resumo de logs de CI §4.1 e corpo do PR
42
+ §4.4. Se a chamada for **negada pelo classificador de permissão**, ou falhar por qualquer outro
43
+ motivo, não retente: siga com o caminho nativo imediatamente (§3 da referência).
44
+ - `../shared/references/conflict-resolution.md` — procedimento de resolução
45
+ de conflitos (passos 2 e 10).
46
+ - `../shared/references/mcp-availability.md` — se os módulos alterados
47
+ envolverem UI/frontend e o MCP de browser estiver disponível, use-o no passo 4 como checagem e2e
48
+ leve **adicional** aos testes automatizados, nunca substituta.
49
+
50
+ ---
51
+
52
+ ## Comportamento
53
+
54
+ ### 1 — Guarda de contexto
55
+
56
+ ```bash
57
+ bash "$SKILL_DIR/../../scripts/vetor-checks.sh" in-worktree
58
+ ```
59
+
60
+ Se sair não-zero, **aborte**: `/vetor:worktree-ship` deve rodar de dentro de um worktree (use
61
+ `/vetor:worktree-create` primeiro). Se passar, guarde a branch atual (`git branch --show-current`).
62
+
63
+ Este comando **nunca muda de diretório por conta própria** — quem o invoca de outro contexto (ex.:
64
+ `issue-coordinator`, cujo cwd é o root) deve fazer `cd` para o worktree antes.
65
+
66
+ ### 2 — Sincronizar com a branch default
67
+
68
+ ```bash
69
+ git fetch origin "$DEFAULT_BRANCH"
70
+ git merge "origin/$DEFAULT_BRANCH"
71
+ ```
72
+
73
+ Sincronizar antes dos testes evita descobrir divergências só no merge final. Se houver conflito
74
+ aqui, resolva-o já seguindo `conflict-resolution.md`. Não prossiga com testes contra base
75
+ desatualizada.
76
+
77
+ Se houve conflito resolvido com commit, valide que o commit de resolução é de fato um merge commit
78
+ de 2 pais antes de prosseguir — um commit de 1 pai indica que `MERGE_HEAD` foi perdido (ex.: `git
79
+ stash` rodado no meio do conflito) e o GitHub vai recalcular o merge do zero, reportando
80
+ `CONFLICTING` mesmo com a árvore correta:
81
+
82
+ ```bash
83
+ [ "$(git log -1 --format='%P' HEAD | wc -w)" -eq 2 ] || {
84
+ echo "ALERTA: commit de resolução de conflito não tem 2 pais — MERGE_HEAD foi perdido." >&2
85
+ exit 1
86
+ }
87
+ ```
88
+
89
+ Se falhar, siga a recuperação descrita em `conflict-resolution.md` §5 (refaça o merge com `git merge
90
+ -s ours` para registrar o segundo pai sem alterar a árvore já resolvida) antes de seguir.
91
+
92
+ ### 2.b — Colisão de versão de migration (condicional)
93
+
94
+ Logo após o merge do passo 2, **antes dos testes locais**:
95
+
96
+ ```bash
97
+ bash "$SKILL_DIR/../../scripts/vetor-checks.sh" migrations
98
+ ```
99
+
100
+ Detecta colisões semânticas invisíveis ao git entre workers paralelos (dois arquivos com a mesma
101
+ versão, sem conflito textual). Se sair não-zero, **pare** e mostre a saída. Projetos sem migrations
102
+ versionadas: no-op. Mesma convenção Flyway do `guardian` §2.
103
+
104
+ ### 3 — Detecção de módulos alterados
105
+
106
+ ```bash
107
+ git diff "origin/$DEFAULT_BRANCH" --name-only
108
+ ```
109
+
110
+ Mapeie os arquivos alterados aos módulos usando a tabela do module-test-map, resolvido a partir do
111
+ root do repositório (`vetor-checks.sh repo-root`), não do `cwd` do worktree.
112
+
113
+ ### 4 — Testes locais
114
+
115
+ Para cada módulo alterado, execute o comando headless correspondente do `module-test-map.md`
116
+ resolvido no passo 3. Quando o comando for `sem suíte de testes`, registre `skipped (no test
117
+ suite)` no sumário; esse estado não bloqueia o ship.
118
+
119
+ **Regra sandbox:**
120
+ - Tente docker uma vez (se aplicável ao módulo)
121
+ - Se bloqueado: troque permanentemente para o comando headless e registre no sumário
122
+ - Módulo de integração sem a dependência viva (DB etc.): reporte "skipped (requires <dep>)" sem falhar
123
+
124
+ **Se algum teste falhar:**
125
+ ```
126
+ FALHA: testes locais não passaram. Corrija antes de fazer ship.
127
+ Módulo: <módulo>
128
+ Saída: <últimas 30 linhas do log>
129
+ ```
130
+ **Pare.** Não faça push de código vermelho.
131
+
132
+ ### 4.b — Scan de debugging
133
+
134
+ ```bash
135
+ bash "$SKILL_DIR/../../scripts/vetor-checks.sh" debug-scan "origin/$DEFAULT_BRANCH"
136
+ ```
137
+
138
+ Se sair não-zero, remova os padrões apontados (debug temporário, `it.only` etc.) e commite antes
139
+ do push.
140
+
141
+ ### 5 — Push
142
+
143
+ ```bash
144
+ git push -u origin <branch>
145
+ ```
146
+
147
+ Se falhar por rede, retente.
148
+
149
+ ### 6 — Criar PR draft
150
+
151
+ Construa o título a partir dos commits:
152
+ ```bash
153
+ git log "origin/$DEFAULT_BRANCH..HEAD" --oneline
154
+ ```
155
+
156
+ O corpo pode ser rascunhado por um runtime de delegação disponível (ver `delegate-to-runtime.md`
157
+ §4.4); caso contrário, use o template inline:
158
+ ```markdown
159
+ ## Resumo
160
+ - <bullet points das mudanças principais, derivados dos commits>
161
+
162
+ ## Módulos testados
163
+ - <lista de módulos testados e resultado>
164
+
165
+ ## Issue relacionada
166
+ Closes #<issue#>
167
+
168
+ 🤖 Desenvolvido com [Claude Code](https://claude.ai/code)
169
+ ```
170
+
171
+ Anexe `Closes #<issue#>` (se fornecida) e a nota do rodapé ao final. Crie o PR draft:
172
+ ```bash
173
+ gh pr create \
174
+ --title "<type>(<slug>): <resumo dos commits>" \
175
+ --body "<descrição gerada e validada>" \
176
+ --draft \
177
+ --base "$DEFAULT_BRANCH"
178
+ ```
179
+
180
+ ### 7 — Monitorar CI
181
+
182
+ Antes do loop de CI, cheque cedo se o GitHub considera o PR mergeável — evita descobrir um
183
+ `CONFLICTING` só no timeout do CI (ex.: causado por `MERGE_HEAD` perdido no passo 2):
184
+
185
+ ```bash
186
+ gh pr view <PR-number> --json mergeable,mergeStateStatus
187
+ ```
188
+
189
+ Se `mergeable` == `CONFLICTING` (ou `mergeStateStatus` == `DIRTY`), **não prossiga para o CI**: volte
190
+ ao passo 2 e refaça a sincronização/merge seguindo `conflict-resolution.md` (incluindo a checagem de
191
+ 2 pais do §2 acima) antes de repetir este passo.
192
+
193
+ ```bash
194
+ gh pr checks <PR-number> --watch
195
+ ```
196
+
197
+ Timeout: 20 minutos. Se expirar, notifique e pare.
198
+
199
+ ⚠️ **Nunca substitua `gh pr checks --watch` por um loop de monitoramento próprio que só checa
200
+ existência/início de um run** (ex.: sair assim que `status` deixar de estar vazio ou virar
201
+ `in_progress`) — isso perde silenciosamente o momento em que o CI chega a um estado terminal. O
202
+ comando `--watch` é bloqueante por design e é exatamente esse comportamento que se quer: ele só
203
+ retorna quando os checks atingem um estado terminal (`success`/`failure`/`cancelled`/`timed_out`).
204
+
205
+ Se for necessário rodar em background (ex.: para não bloquear outra atividade), use a tool `Monitor`
206
+ no padrão "per-occurrence com fim conhecido" — o loop só termina em estado terminal do CI, nunca na
207
+ mera existência do run:
208
+
209
+ ```bash
210
+ until gh pr checks <PR-number> --json state -q '.[].state' \
211
+ | grep -qvE '^(IN_PROGRESS|QUEUED|PENDING)$'; do
212
+ sleep 15
213
+ done
214
+ gh pr checks <PR-number>
215
+ ```
216
+
217
+ ### 8 — Classificação de erros e loop de fix (máximo 3 iterações)
218
+
219
+ Para cada falha detectada:
220
+
221
+ **8.a — Circuit breaker de infraestrutura (antes de ler logs)**
222
+
223
+ ```bash
224
+ deno run -A scripts/detect-infra-failure.ts <run-id>
225
+ ```
226
+
227
+ Se retornar exit 0 (JSON com `isInfrastructureFailure: true`), nenhum fix de código resolve:
228
+ - **Pule** inteiramente as iterações de fix (§8.b).
229
+ - Escreva o status file:
230
+ ```markdown
231
+ Status: BLOCKED_INFRA
232
+ Motivo: Falha de infraestrutura da plataforma — <reason do script>.
233
+ Ação necessária: resolver billing/outage no GitHub antes de retomar.
234
+ ```
235
+ - **Escale** via `AskUserQuestion`: `⚠️ Falha de infraestrutura detectada no CI (billing/outage). Não é possível resolver com fix de código. Deseja aguardar a resolução ou prosseguir sem CI (merge manual)?`
236
+ - **Pare.** Não consuma iterações de fix-loop.
237
+
238
+ **8.b — Erro de código (só se não for infraestrutura)**
239
+
240
+ ```bash
241
+ gh run view <run-id> --log-failed
242
+ ```
243
+ (opcionalmente condensado por um runtime de delegação disponível — ver `delegate-to-runtime.md`
244
+ §4.1). Avalie a natureza do erro:
245
+
246
+ - **Transiente (rede/timeout do runner):** **não altere o código**. Aguarde 30 segundos e rode
247
+ `gh run rerun <run-id>`. Backoff exponencial, até 3 tentativas.
248
+ - **Erro de código (lint/compilação/teste):** identifique a causa raiz, aplique a correção no
249
+ worktree, commite (`fix: corrige <problema> no CI`), `git push origin <branch>` e volte ao passo 7.
250
+
251
+ Após 3 iterações de fix sem CI verde:
252
+ ```
253
+ FALHA: CI não passou após 3 tentativas de fix de código.
254
+ Último erro: <trecho do log>
255
+ Worktree preservado para inspeção manual.
256
+ ```
257
+ **Pare.** Não tente mergear.
258
+
259
+ ### 8.5 — Revisões consultivas (não bloqueantes)
260
+
261
+ Roda **só quando há mudança real de código-fonte**: se o passo 3 não mapeou nenhum módulo (PR só de
262
+ docs, lockfile ou config), **pule este passo inteiro**.
263
+
264
+ Havendo módulo alterado, execute as duas revisões:
265
+
266
+ 1. **Code review** (bugs, correção, arquitetura):
267
+ ```javascript
268
+ Agent({
269
+ description: "Code review: PR #<PR-number>",
270
+ prompt: "PR #<PR-number>, branch <branch>, base $DEFAULT_BRANCH.",
271
+ subagent_type: "vetor:code-review",
272
+ model: "sonnet"
273
+ })
274
+ ```
275
+ O harness **sempre** despacha subagentes em background — não existe modo síncrono, e o retorno
276
+ imediato é apenas a confirmação de que o agente foi lançado, nunca o resultado da revisão.
277
+ **Bloqueante-leve:** antes de prosseguir para o passo 9, aguarde a notificação de conclusão deste
278
+ subagente (ele publica os achados como comentário na PR ao terminar). Os achados continuam
279
+ **consultivos** — não bloqueiam o merge por si só —, mas aguardar garante que eles cheguem a
280
+ tempo de virar decisão (ou commit corretivo) antes do merge, em vez de serem descobertos depois.
281
+
282
+ 2. **Security review** (segurança da aplicação — OWASP: injeção, XSS, segredos expostos): verifique
283
+ se a skill nativa `security-review` está disponível nesta sessão. **Se não estiver, pule
284
+ silenciosamente.** Se estiver, invoque-a conforme §8.6 abaixo.
285
+
286
+ **Nunca pare o pipeline por causa dos achados** — mesmo com itens `blocker` ou vulnerabilidades,
287
+ prossiga para o passo 9 assim que ambas as revisões tiverem retornado. Quem decide agir é o humano,
288
+ lendo o comentário na PR. Se um dos despachos falhar (rate limit, erro de ferramenta), registre no
289
+ sumário e prossiga.
290
+
291
+ ### 8.6 — Security review (skill nativa)
292
+
293
+ A skill nativa `security-review` **não publica comentário sozinha**: seu contrato de saída é
294
+ "a resposta final deve conter o relatório em markdown e nada mais". Quem invoca (você, executando
295
+ o `worktree-ship`) é responsável por publicar esse relatório na PR no turno seguinte à resposta.
296
+
297
+ Além disso, a skill monta o próprio contexto sozinha (git status, arquivos modificados, commits,
298
+ diff da branch atual) — **não** passe `gh pr diff <PR-number>` como argumento; ela ignora diffs
299
+ passados por fora e lê a branch diretamente.
300
+
301
+ ```
302
+ Invoque a skill nativa `security-review` sem argumento de diff — ela lê a branch atual.
303
+ ```
304
+
305
+ Ao receber a resposta final (o relatório em markdown), publique-o você mesmo:
306
+ ```bash
307
+ gh pr comment <PR-number> --body "<relatório de security-review recebido>"
308
+ ```
309
+
310
+ **Proporção do protocolo de sub-tasks:** o protocolo de sub-tasks paralelas da skill nativa (uma
311
+ por vulnerabilidade candidata, para filtrar falso-positivo) é desenhado para diffs grandes. Para
312
+ diffs pequenos — heurística sugerida: abaixo de ~200 linhas alteradas, já filtrados pelo
313
+ `vetor:code-review` do §8.5 — peça à skill para analisar inline, sem abrir o protocolo completo de
314
+ sub-tasks por vulnerabilidade. Acima desse limiar, deixe a skill decidir seu próprio protocolo.
315
+
316
+ ### 9 — Verificar review
317
+
318
+ ```bash
319
+ gh pr view <PR-number> --json reviewDecision
320
+ ```
321
+
322
+ Se `reviewDecision` == `REVIEW_REQUIRED` ou `CHANGES_REQUESTED`:
323
+ ```
324
+ PR requer review humano. Status: <reviewDecision>
325
+ URL: <PR-url>
326
+ Aguardando aprovação antes de prosseguir com merge.
327
+ ```
328
+ **Pare.** Não entre em loop tentando merge.
329
+
330
+ ### 10 — Merge
331
+
332
+ ```bash
333
+ bash "$SKILL_DIR/../../scripts/vetor-merge.sh" <PR-number>
334
+ ```
335
+
336
+ O script faz `gh pr ready` + `gh pr merge --squash --delete-branch` e verifica o estado real do PR
337
+ quando o `gh` sai não-zero (erro de cleanup local da branch não é falha de merge):
338
+ - **exit 0** — PR mergeado. Siga para o passo 11.
339
+ - **exit 3** — merge não aconteceu. Rode `git merge "$DEFAULT_BRANCH"` localmente no worktree e siga
340
+ `../shared/references/conflict-resolution.md`. Resolvido e verde, volte ao
341
+ passo 7.
342
+
343
+ **Se o comando for negado pela camada de permissões do Claude Code** (classificador de auto-mode,
344
+ motivo tipo "merge sem review") — barreira independente do `reviewDecision` do passo 9: **pare, peça
345
+ aprovação explícita via `AskUserQuestion`** e só repita após o "sim". **Nunca** contorne a negação.
346
+
347
+ ### 11 — Sincronizar root
348
+
349
+ ```bash
350
+ bash "$SKILL_DIR/../../scripts/vetor-checks.sh" sync-root
351
+ ```
352
+
353
+ Volta ao root e sincroniza com a branch default. (Só numa sessão manual em que você entrou no
354
+ worktree com `EnterWorktree` é preciso sair com `ExitWorktree` antes.) Confirme pela mensagem de
355
+ sucesso.
356
+
357
+ ### 12 — Cleanup
358
+
359
+ Descubra o path real do worktree via `git worktree list` (não assuma convenção de path — a
360
+ localização é do harness). Se invocado pelo `issue-coordinator` (modo headless), execute
361
+ automaticamente:
362
+ ```bash
363
+ bash "$SKILL_DIR/../../scripts/vetor-checks.sh" safe-remove-worktree "<path-do-worktree>"
364
+ git branch -d <branch>
365
+ rm -f .claude/vetor/status/<branch>.md
366
+ rm -f .claude/vetor/status/<branch>-touched-files.json
367
+ ```
368
+
369
+ Se a checagem falhar, **pare o cleanup** e não prossiga com `git branch -d`/remoção dos arquivos de
370
+ status/cache — há dois motivos distintos de falha:
371
+
372
+ - **Worktree filho ativo dentro do path alvo**: mostre os paths e preserve worktree pai, branch e
373
+ arquivos de status/cache até os filhos serem realocados.
374
+ - **Diretório residual em disco após `git worktree remove`** (issue #157): o `git worktree remove`
375
+ desregistrou o worktree do git (não aparece mais em `git worktree list`) mas falhou ao apagar o
376
+ diretório — no Windows, tipicamente por `Filename too long` (artefatos como `build/`, `.gradle/`,
377
+ `node_modules/` estouram o limite de 260 caracteres). `safe-remove-worktree` já tenta uma remoção
378
+ com prefixo de path longo nesse caso; se mesmo assim restar, ela sai não-zero citando o path
379
+ residual. Reporte o path ao operador para remoção manual — não tente forçar via `rm -rf` por conta
380
+ própria, o diretório pode conter uncommitted work relevante para inspeção.
381
+
382
+ Se invocado manualmente pelo usuário: pergunte antes de remover (a confirmação cobre worktree,
383
+ branch, status file e cache de arquivos tocados).
384
+
385
+ ---
386
+
387
+ ## Restrições
388
+
389
+ - Nunca faz push de código com testes falhando
390
+ - Nunca entra em loop de merge se review é necessário
391
+ - Máximo 3 iterações de fix de CI
392
+ - Preserva worktree intacto em caso de falha (para inspeção manual)
393
+ - As revisões do passo 8.5 são sempre consultivas — achados nunca bloqueiam o merge
394
+ - O circuit breaker de infraestrutura (§8.a) pausa sem consumir iterações de fix