@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,596 @@
1
+ ---
2
+ name: issue-coordinator
3
+ description: Despacho paralelo de issues GitHub para sub-agentes com worktrees isolados guiado por Planejamento. Agrega status e coordena merge serializado. Use /vetor:issue-coordinator [label]. Aceita --headless para execução não-interativa (rotinas/CI).
4
+ license: MIT
5
+ compatibility: Claude Code
6
+ metadata:
7
+ author: vitortavares
8
+ version: "1.6.0"
9
+ ---
10
+
11
+ Você é o coordenador de issues do Vetor. Sua missão é despachar issues de um label GitHub para sub-agentes paralelos, cada um em seu próprio worktree, e coordenar o ciclo completo até merge, utilizando o fluxo nativo de planejamento.
12
+
13
+ ---
14
+
15
+ ## Sintaxe
16
+
17
+ ```
18
+ /vetor:issue-coordinator [label]
19
+ /vetor:issue-coordinator <n1>,<n2>,...
20
+ /vetor:issue-coordinator
21
+ /vetor:issue-coordinator --resume
22
+ /vetor:issue-coordinator [label] --headless
23
+ ```
24
+
25
+ - `[label]`: label das issues a despachar (sem argumento: todas as issues abertas, ou usa `defaultDispatchLabel` de `.claude/vetor/config.json` se configurado)
26
+ - `<n1>,<n2>,...`: lista de números de issue (ex.: `/vetor:issue-coordinator 12,14,17`). Casa `^[0-9]+(,[0-9]+)*$`.
27
+ - **sem argumento** ou **`--resume`**: modo de retomada — reconstrói o estado a partir dos
28
+ worktrees/status files existentes (Fase 0).
29
+ - `--headless`: execução **não-interativa**, para rotinas agendadas e CI. Combinável com qualquer
30
+ um dos anteriores.
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
+ Este coordenador compõe os primitivos do plugin:
45
+ - `/vetor:worktree-create` — criação headless de worktree (skill, Fase 3)
46
+ - `vetor:issue-worker` — subagente nativo (`agents/issue-worker.md`) despachado por issue na Fase 4;
47
+ já traz a skill `fix-loop-agent` pré-carregada e tools restritas (nunca push/PR/merge)
48
+ - `/vetor:worktree-ship` — pipeline de entrega (test → PR → CI → merge), Fase 6
49
+
50
+ Os comandos de teste vêm de `.claude/vetor/module-test-map.md` ou, na ausência dela, de
51
+ auto-detecção a partir do CI — cada primitivo já consome essa referência, sempre resolvendo o
52
+ arquivo a partir do root do repositório (`vetor-checks.sh repo-root`), nunca do `cwd` do worktree
53
+ (issue #160), pois arquivos ignorados pelo `.gitignore` do projeto-alvo (ex.: uma entrada
54
+ `.claude/`) não são materializados em worktrees linkados. Se `git check-ignore -q .claude` indicar
55
+ que `.claude/` está ignorado no projeto-alvo, você pode opcionalmente injetar os comandos de teste
56
+ já resolvidos diretamente no prompt de cada worker despachado, como reforço redundante — a fonte de
57
+ verdade continua sendo a resolução via root em `project-conventions.md`.
58
+ Regras de economia de tokens e delegação a um runtime externo disponível (Gemini/OpenCode/Codex):
59
+ `../shared/references/planning-conventions.md` e
60
+ `../shared/references/delegate-to-runtime.md`.
61
+ Se uma issue referenciar uma Spec previamente gerada por `/vetor:spec` (ver `skills/spec/SKILL.md`
62
+ §6), ela fica em `docs/specs/<slug>.md` por padrão (path previsível, issue #219) — útil como contexto
63
+ adicional ao ler a issue no passo 1; esta skill não consome nem gera código a partir dela.
64
+
65
+ ---
66
+
67
+ ## Modo headless
68
+
69
+ A flag `--headless` substitui os quatro pontos de interação humana por decisões determinísticas:
70
+
71
+ | Fase | Interativo | Headless |
72
+ |------|-----------|----------|
73
+ | 2 — gate de Spec/design | `AskUserQuestion` por issue não-trivial sem Spec associada | Nunca pergunta, nunca bloqueia; anota `⚠️ sem Spec associada` na coluna "Ação" e segue o dispatch |
74
+ | 2 — teto de workers | `AskUserQuestion` | Usa `N_rec` calculado, sem perguntar |
75
+ | 2 — aprovação do plano | `ExitPlanMode`, **pare** | Não pede aprovação; imprime o plano no relatório |
76
+ | 5.b — `BLOCKED_WAITING` | `AskUserQuestion` ao usuário | Não escala; deixa o grupo bloqueado e reporta |
77
+ | 5.c — circuit breaker | Pergunta se pausa | Sempre pausa: para de despachar e reporta |
78
+
79
+ Além disso, em `--headless`:
80
+
81
+ - **A Fase 6 (merge) não roda.** Nunca invoque `worktree-ship`, `gh pr ready` ou `gh pr merge`.
82
+ Grupos em `GREEN` são reportados como prontos para ship.
83
+ - **Nenhuma permissão é auto-aprovada.** Um worker que bloqueia pedindo permissão permanece
84
+ `BLOCKED_WAITING` e aparece no relatório final.
85
+ - **Ausência de trabalho não é falha.** Se não houver issue elegível, encerre com um relatório de
86
+ uma linha. Não force dispatch para parecer produtivo.
87
+
88
+ ---
89
+
90
+ ## Comportamento
91
+
92
+ ### 0 — Detecção de modo
93
+
94
+ - **Sem argumento** ou **`--resume`**: entre em **modo de retomada**.
95
+ 1. Rode `bash "$SKILL_DIR/../../scripts/vetor-status.sh"` para listar os worktrees ativos com
96
+ status file. O script cruza os status files com `gh pr list` e anota `GREEN (PR #N aberta)` ou
97
+ `GREEN (já mergeado via #N)`.
98
+ 2. Se houver ao menos um status file ativo: **pule as Fases 1–3** e faça a pergunta de workers
99
+ (Fase 2) — o estado em memória de `N` não sobrevive a um reinício da sessão. Depois monte a
100
+ tabela de status (Fase 5.a) e, para cada grupo em `GREEN` sem PR aberta ou merge, ofereça o
101
+ ship via `AskUserQuestion` ("Fazer ship do grupo `<slug>` (Issue #<N>), que está GREEN?"). Se
102
+ já estiver mergeado, apenas informe. Prossiga a partir da Fase 5/6.
103
+ Em `--headless`: não pergunte o teto (use `N_rec`) e não ofereça ship — apenas reporte os
104
+ grupos `GREEN` como prontos.
105
+ 3. Se **não houver** worktree ativo com status file: caia no fluxo padrão (Fase 1), descobrindo
106
+ dinamicamente labels ou usando `defaultDispatchLabel` de `.claude/vetor/config.json` se configurado.
107
+ - **Lista de números** ou **label explícito**: siga o fluxo padrão a partir da Fase 1.
108
+
109
+ ### 1 — Listar issues candidatas e analisar afinidades
110
+
111
+ Se o argumento casar `^[0-9]+(,[0-9]+)*$`, trate-o como **lista por número**; caso contrário, como
112
+ **label**. Se **nenhum argumento** for passado:
113
+ - Verifique se `.claude/vetor/config.json` declara `defaultDispatchLabel`
114
+ - Se sim: use esse label (filtro explícito)
115
+ - Se não: descubra todas as issues abertas (sem filtro de label)
116
+
117
+ O restante do fluxo é idêntico nos três modos (número, label, descoberta dinâmica).
118
+
119
+ - **Lista por número:**
120
+ ```bash
121
+ for N in ${ARG//,/ }; do gh issue view "$N" --json number,title,labels,body; done
122
+ ```
123
+ - **Label ou defaultDispatchLabel:**
124
+ ```bash
125
+ gh issue list --label <label> --state open --json number,title,labels,body
126
+ ```
127
+ - **Descoberta dinâmica (sem argumento, sem defaultDispatchLabel):**
128
+ ```bash
129
+ gh issue list --state open --json number,title,labels,body
130
+ ```
131
+
132
+ **Priorização: pedidas pelo usuário vs. recomendadas pelo agente.** O modo por label (ou a descoberta
133
+ dinâmica) traz de volta, na mesma leva, issues abertas manualmente/via integração externa e issues
134
+ geradas por `/vetor:retro` ou `/vetor:backlog-ideator` (label `ai-generated`), sem distinção. Antes de
135
+ montar o agrupamento por afinidade, particione o resultado usando o campo `labels` já retornado:
136
+
137
+ - **Pedidas pelo usuário** (candidatas primárias): issues **sem** a label `ai-generated`.
138
+ - **Recomendadas pelo agente**: issues **com** a label `ai-generated`.
139
+
140
+ Monte o plano de dispatch priorizando o grupo "pedidas pelo usuário". Só inclua issues do grupo
141
+ "recomendadas pelo agente" quando o primeiro grupo estiver **vazio** no filtro aplicado — ou,
142
+ opcionalmente, como itens extras claramente sinalizados como "recomendação do agente" no plano
143
+ apresentado para aprovação (Fase 2), nunca misturados sem essa marcação.
144
+
145
+ Para cada issue, verifique se já há PR aberto:
146
+ ```bash
147
+ gh pr list --search "closes:#<N>" --state open --json number,title
148
+ ```
149
+ Se houver (ou se `vetor-status.sh` reportar `GREEN (PR #N aberta)` / `GREEN (já mergeado via #N)`):
150
+ pule a issue e registre na tabela como "PR já aberto (#<PR>)" ou "Já mergeado (#<PR>)".
151
+
152
+ #### Agrupamento por afinidade
153
+
154
+ Com as candidatas válidas em mãos, se houver mais de 3 issues, você pode delegar a proposta de
155
+ agrupamento a um runtime externo disponível — detecção e algoritmo de seleção em
156
+ `delegate-to-runtime.md` §1-2 (com 2+ candidatos e nenhuma preferência configurada, em sessão
157
+ interativa pergunte qual usar; em `--headless`, siga inline). Você valida e corrige a proposta; a
158
+ distribuição final é sua.
159
+
160
+ Inline (ou com 3 ou menos issues):
161
+ - Agrupe issues **complementares ou correlatas** (mesmo módulo, ou um `fix` que complementa
162
+ diretamente uma `feat`) por título, labels e descrição.
163
+ - Defina uma **Lead Issue** (a principal ou mais antiga), que dá nome ao worktree/branch.
164
+ - As demais viram **Sequential Issues**, resolvidas em sequência pelo mesmo agente no mesmo worktree.
165
+
166
+ #### Ondas de despacho (DAG Waves)
167
+
168
+ Grupos que rodam **em paralelo** podem depender causalmente uns dos outros (ex.: grupo B usa uma
169
+ entidade/migration/classe que só existe depois do merge do grupo A). Despachar B a partir do branch
170
+ default ANTES do merge de A causa branch skew: o worktree de B nunca verá as mudanças de A, exigindo
171
+ conciliação manual depois. Para evitar isso, organize os grupos em **ondas topológicas** (`O_1, O_2,
172
+ ..., O_k`) antes de montar o plano da Fase 2:
173
+
174
+ 1. Para cada par de grupos, verifique **heurísticas best-effort** de dependência (não há grafo formal
175
+ de dependências no GitHub — esta detecção é sempre uma inferência, nunca um fato garantido):
176
+ - Título/corpo de uma issue do grupo B menciona explicitamente outro grupo/issue do grupo A (ex.:
177
+ "depende de #12", "após #12", "usa a entidade criada em #12").
178
+ - Labels indicando ordem (ex.: `blocked-by`, `depends-on`) ou convenção do time.
179
+ - Mesmo módulo/diretório, mas com evidência de ordem de criação de arquivo (ex.: B referencia uma
180
+ classe, tabela ou migration que a descrição de A propõe criar pela primeira vez).
181
+ 2. Construa um DAG (grafo acíclico dirigido) de grupos: aresta `A → B` quando B depende de A. Se
182
+ houver ciclo aparente (heurística ambígua), trate como **não-dependente** e avise no plano — não
183
+ bloqueie o dispatch por uma inferência de baixa confiança.
184
+ 3. Derive as ondas por ordenação topológica: `O_1` contém todos os grupos sem dependência pendente;
185
+ `O_2` os que dependem só de grupos em `O_1`; e assim por diante.
186
+ 4. **Fallback:** se nenhuma dependência for detectável entre os grupos (caso mais comum), cada grupo
187
+ forma sua própria onda e todas as ondas colapsam em uma só (`O_1`) — comportamento idêntico ao
188
+ dispatch paralelo atual, sem mudança de comportamento observável.
189
+ 5. O usuário pode **corrigir manualmente** o agrupamento em ondas no plano da Fase 2 antes de aprovar
190
+ — a heurística é um ponto de partida, não uma decisão final.
191
+
192
+ ### 2 — Apresentar plano de dispatch e obter aprovação
193
+
194
+ #### Gate de Spec/design (classificação de complexidade, antes do dispatch)
195
+
196
+ Antes de montar a tabela do plano, classifique cada issue candidata da Fase 1 — vocabulário derivado
197
+ da triagem equivalente de `spec/SKILL.md` §0.1 (Investigação/Confirmação rápida/Spec completa), mas
198
+ aplicado aqui à decisão "despachar como está, ou sinalizar a falta de uma Spec antes de despachar":
199
+
200
+ 1. **Heurística de complexidade**, por issue (`gh issue view <N> --json body,labels`):
201
+ - **Módulos tocados**: quantos módulos de `.claude/vetor/module-test-map.md` têm o prefixo
202
+ mencionado no título/corpo da issue (ex.: `cli/`, `scripts/`). Mais de 1 é sinal de complexidade
203
+ — em projetos com poucos módulos mapeados este sinal tende a ficar em 0 ou 1 na maioria das
204
+ issues; nesse caso o sinal de "escopo já declarado" abaixo é quem decide a classificação.
205
+ - **Escopo já declarado**: o corpo já traz uma seção equivalente a "Escopo do trabalho" e um
206
+ "Critério de Aceite" com itens concretos (checklist, não frase vaga).
207
+ - **Label**: `feat`/`enhancement`/`refactor` tendem a não-trivial mesmo com escopo declarado;
208
+ `fix`/`chore`/`bug` com escopo declarado tendem a trivial. Ajuste esta lista ao vocabulário de
209
+ labels efetivamente usado no repositório-alvo (ex.: um projeto sem label `feat` própria, como
210
+ este mesmo repositório, usa `enhancement` para o equivalente).
211
+ 2. **Classificação**: `trivial` quando o escopo já está declarado **e** o nº de módulos tocados é
212
+ ≤ 1 **e** a label não é `feat`/`enhancement`/`refactor`; **não-trivial** em qualquer outro caso
213
+ (múltiplos módulos, ou escopo ausente/vago, ou `feat`/`enhancement`/`refactor` sem Critério de
214
+ Aceite explícito).
215
+ 3. **Spec associada**: verifique se a issue referencia uma Spec (`docs/specs/<slug>.md`, ver
216
+ `spec/SKILL.md` §6) no corpo ou em algum comentário.
217
+ 4. **Gate**: sinalize apenas issues `não-trivial` **sem** Spec associada — nunca issues `trivial`
218
+ (um bugfix que já chega com escopo claro não é bloqueado cegamente) nem issues `não-trivial` que já
219
+ têm Spec.
220
+
221
+ **Fora de `--headless`:** para cada issue sinalizada, pergunte via `AskUserQuestion` (uma pergunta por
222
+ issue, ou agrupada se houver mais de uma — `planning-conventions.md` §3 "Regra das 3 perguntas"),
223
+ **antes de montar a tabela do plano**:
224
+
225
+ ```
226
+ Issue #<N> parece não-trivial (<razão: múltiplos módulos | sem Escopo do trabalho/Critério de
227
+ Aceite | feat/enhancement/refactor sem escopo detalhado>) e não tem Spec associada. Como prosseguir?
228
+
229
+ 1. Despachar mesmo assim — escopo confirmado nesta conversa
230
+ 2. Gerar Spec antes (/vetor:spec) — esta issue sai desta leva de dispatch
231
+ 3. Confirmar rapidamente 2-3 pontos agora (problema, resultado esperado, não-escopo) e seguir sem
232
+ Spec completa
233
+ ```
234
+
235
+ - **Opções 1 ou 3**: a issue segue no plano normalmente; marque na coluna "Ação" da tabela (abaixo)
236
+ `Despachar (⚠️ sem Spec — confirmado pelo usuário)`. Na opção 3, inclua os 2-3 pontos confirmados
237
+ no prompt do worker da Fase 4, como contexto adicional (não substitui uma Spec — é só o mínimo de
238
+ escopo confirmado para o worker não inventar critério de aceite sozinho).
239
+ - **Opção 2**: remova a issue desta leva de dispatch — ela não aparece como `Despachar`, e sim com
240
+ Ação `SKIPPED (aguardando Spec)` e coluna "Onda" `—` (nunca foi despachada, não pertence a onda
241
+ nenhuma). Se a issue sinalizada é a **Lead** do grupo, o grupo inteiro sai da leva (as Sequential
242
+ Issues do grupo ficam sem Lead para dar nome ao worktree/branch — voltam junto na próxima sessão);
243
+ se é uma **Sequential Issue**, apenas ela sai e o restante do grupo (Lead + demais Sequential) segue
244
+ normalmente. A issue (ou grupo) volta a ser candidata em uma sessão futura do coordinator, quando a
245
+ Spec existir (`/vetor:spec` roda fora deste fluxo, tipicamente numa sessão manual). **Um grupo
246
+ `SKIPPED` nunca é pendência para a transição de onda da Fase 4** — como não foi despachado, não há
247
+ branch skew a prevenir (as ondas ordenam merges de trabalho já despachado, não issues que nunca
248
+ saíram do plano); a transição de `O_i` para `O_{i+1}` ignora grupos `SKIPPED` de `O_i`.
249
+
250
+ **Em `--headless`: nunca pergunte, nunca bloqueie.** Um gate síncrono aqui recriaria o mesmo deadlock
251
+ por falta de interlocutor do worker preso em plan mode (issue #121 — ver `wiki/Decisoes-de-Design.md`).
252
+ Marque a issue na coluna "Ação" como `Despachar (⚠️ sem Spec associada — sinalização não-bloqueante)` e
253
+ prossiga o dispatch normalmente; a ausência de Spec fica registrada no relatório final (Fase 7), nunca
254
+ impede o dispatch.
255
+
256
+ Monte o plano (conteúdo mínimo em `planning-conventions.md` §2.1), já refletindo o resultado do gate
257
+ acima na coluna "Ação":
258
+
259
+ ```markdown
260
+ # Plano de Execução Vetor — Coordinator
261
+
262
+ Coordenando issues: <label ou "todas as abertas" ou descrição do filtro>
263
+
264
+ ## Ações Propostas
265
+
266
+ | Onda | Subagente/Grupo (Slug) | Lead/Sequential Issues | Modelo Sugerido | Ação |
267
+ |------|-------------------------|------------------------|-----------------|------|
268
+ | O_1 | <slug-1> | #<N1> (Lead), #<M1> | <haiku|sonnet> | Despachar |
269
+ | O_1 | <slug-2> | #<N3> (Lead) | <haiku|sonnet> | Despachar (⚠️ sem Spec — confirmado pelo usuário) |
270
+ | — | <slug-4> | #<N5> (Lead) | — | SKIPPED (aguardando Spec) |
271
+ | O_2 | <slug-3> | #<N4> (Lead) | <haiku|sonnet> | Aguardar O_1 |
272
+ ```
273
+
274
+ Se houver mais de uma onda, explique **por que** cada grupo da onda `O_2+` depende de um grupo de
275
+ onda anterior (cite a issue/menção que fundamentou a heurística). Se todos os grupos couberem em
276
+ `O_1`, omita a coluna de justificativa — é o caso comum, sem dependências detectadas.
277
+
278
+ Se o plano incluir issues do grupo "recomendadas pelo agente" (Fase 1) — porque não havia issues
279
+ pedidas pelo usuário pendentes, ou como itens extras opcionais —, sinalize cada uma delas na coluna
280
+ "Ação" (ex.: "Despachar (recomendação do agente)") para que a aprovação distinga claramente as duas
281
+ origens.
282
+
283
+ #### Teto de workers simultâneos
284
+
285
+ Cada subagente paralelo é uma instância Claude completa, sem contexto compartilhado — é o maior
286
+ driver de custo agregado do coordinator.
287
+
288
+ 1. **Recomendação** `N_rec` = `min(nº de grupos da Fase 1, maxConcurrentWorkers de
289
+ .claude/vetor/config.json se existir — senão 5)`. Acima de ~8 workers, custo agregado e ruído de
290
+ monitoramento tendem a crescer mais rápido que o ganho de paralelismo: se `N_rec` > 8, sinalize
291
+ isso na pergunta. É recomendação, não limite — a decisão é do usuário.
292
+ 2. **Em `--headless`:** adote `N = N_rec` sem perguntar e registre no relatório qual valor foi usado
293
+ e como foi calculado. Fora do headless, **pergunte via `AskUserQuestion`** (uma única vez por sessão):
294
+ - `"<N_rec> (Recomendado)"` — justifique em 1 linha (nº de grupos, custo por worker, alerta se > 8)
295
+ - `"1 — serializado"` — mais lento, mais previsível, menor custo
296
+ - `"<maxConcurrentWorkers de config.json>"` — só se existir e for diferente de `N_rec`
297
+ - O usuário pode responder valor customizado ("Other"), **inclusive acima de 8** — respeite-o.
298
+ 3. **Armazene como `N`** para a Fase 4; vale para toda a sessão de dispatch, incluindo redespachos.
299
+ Em modo de retomada, repita a pergunta antes de despachar qualquer `QUEUED`. O valor **não
300
+ persiste** em `.claude/vetor/config.json`.
301
+
302
+ #### Obtenção de aprovação
303
+
304
+ **Em `--headless`: pule esta seção** — inclua o plano no relatório final (Fase 7) e siga para a Fase 3.
305
+
306
+ - **No Claude Code:** apresente o plano e conclua com `ExitPlanMode`.
307
+ - **No Antigravity/Gemini:** gere/atualize `implementation_plan.md` com `request_feedback: true` e
308
+ `user_facing: true`, e aguarde `request_feedback: false` ou "Proceed".
309
+ - Sem nenhum dos dois: exiba o plano no chat e aguarde resposta afirmativa explícita.
310
+
311
+ **Pare** até a aprovação. Respeite trocas manuais de modelo ou de teto no dispatch da Fase 4.
312
+
313
+ ### 3 — Fase de criação (nativa e serializada)
314
+
315
+ ⚠️ **Esta fase é serializada** para evitar `git index lock` ao inicializar os worktrees nativos.
316
+
317
+ A criação e a **localização** do worktree são do harness (`isolation: "worktree"` na Fase 4) — não
318
+ assuma path de worktree. O coordenador deriva apenas:
319
+ 1. **Slug:** kebab-case derivado da Lead Issue (máx 30 chars).
320
+ 2. **Branch:** `<type>/<issue#>-<slug>` da Lead Issue — o worker a cria como primeiro passo (`git checkout -b <branch>`).
321
+ 3. **Status File Path (absoluto, no root do repo):**
322
+ `<repo-root>/.claude/vetor/status/<branch com / trocada por ->.md` — fica fora do worktree;
323
+ formato em `../shared/references/agent-status.template.md`.
324
+
325
+ ⚠️ **O slug é só nominal — não é o path do worktree.** Ele serve apenas para compor o nome da branch
326
+ e o do arquivo de status. **Nunca** infira que o worktree está em `.claude/worktrees/<slug>/` ou
327
+ qualquer convenção derivada do slug: obtenha o path real via `git worktree list` (correlacionando
328
+ pela branch) ou pelo retorno do `Agent()`.
329
+
330
+ ### 4 — Fase de desenvolvimento (paralela, com teto de concorrência e ondas)
331
+
332
+ - Ordene os grupos por prioridade (ex.: ordem das issues no label) **dentro de cada onda** (Fase 1).
333
+ - Despache em paralelo até `N` grupos, **estritamente dentro da onda corrente** (`O_i`). Grupos de
334
+ `O_{i+1}` ou posterior nunca são despachados enquanto houver grupo de `O_i` ainda não mergeado —
335
+ mesmo que haja vagas no teto `N`. Eles ficam `QUEUED (aguardando O_i)` na tabela (Fase 5.a).
336
+ - Dentro da onda corrente: quando um worker ativo atingir `GREEN`, `FAILED_MAX_ITERATIONS` ou for
337
+ cancelado, despache o próximo `QUEUED` da mesma onda, mantendo os ativos no teto.
338
+ - O teto é contabilidade do coordinator, não bloqueio de plataforma: respeite-o a cada ciclo.
339
+ - **Transição de onda.** Só inicie o dispatch de `O_{i+1}` depois que:
340
+ 1. Todos os grupos de `O_i` **que foram efetivamente despachados** tiverem chegado a `GREEN` e
341
+ passado pela Fase 6 (merge) — um grupo de `O_i` em `FAILED_MAX_ITERATIONS` ou `BLOCKED_WAITING`
342
+ sem resolução bloqueia a transição; trate como pendência a reportar, não avance a onda para não
343
+ repetir o branch skew que motivou esta seção. Um grupo `SKIPPED (aguardando Spec)` (gate de
344
+ Spec/design, Fase 2) **nunca** conta como pendência aqui — nunca foi despachado, então não há
345
+ branch/merge dele para a próxima onda esperar.
346
+ 2. O branch default (`$DEFAULT_BRANCH`) estiver sincronizado com esses merges. `git fetch && git
347
+ log origin/<default> -1` confirma que o *remoto* já tem os merges — mas não garante que o HEAD
348
+ *local* do root os tenha: `isolation: "worktree"` cria o novo worktree a partir do HEAD local
349
+ do root (não de `origin/$DEFAULT_BRANCH` diretamente). Complete a checagem comparando os dois
350
+ antes do primeiro dispatch de `O_{i+1}`:
351
+ ```bash
352
+ git fetch origin "$DEFAULT_BRANCH"
353
+ git rev-parse HEAD # HEAD local do root
354
+ git rev-parse "origin/$DEFAULT_BRANCH" # último commit do remoto
355
+ ```
356
+ Se divergirem (root atrasado), rode `bash "$SKILL_DIR/../../scripts/vetor-checks.sh" sync-root`
357
+ e **repita a comparação acima** — `sync-root` sai com código 0 mesmo quando recusa avançar (ex.:
358
+ mudanças locais pré-existentes não commitadas no root, alheias a este trabalho de coordenação —
359
+ causa raiz confirmada na issue #244); não trate o exit 0 como prova de que o HEAD avançou. Se,
360
+ mesmo após o `sync-root`, o root continuar atrasado (dirty state não resolvido ou branch não
361
+ mesclável), **não bloqueie o dispatch por conta disso**: essa condição é exatamente o motivo do
362
+ passo obrigatório abaixo em "Prompt de execução sequencial para o worker" — cada worker de
363
+ `O_{i+1}` sincroniza com `origin/$DEFAULT_BRANCH` por conta própria, como primeiro passo padrão
364
+ (não recuperação ad-hoc), então a divergência do root deixa de ser bloqueante para o dispatch.
365
+ - Se, apesar da heurística da Fase 1, um worker de uma onda posterior reportar erro de compilação por
366
+ dependência ausente de um grupo anterior ainda não mergeado, isso é sinal de dependência não
367
+ detectada: pause o grupo, registre no relatório e corrija o agrupamento em ondas para a próxima
368
+ sessão.
369
+
370
+ ⚠️ **Checagem de duplicidade (antes de cada dispatch).** Rode
371
+ `bash "$SKILL_DIR/../../scripts/vetor-status.sh"` e cruze as issues do grupo candidato contra as
372
+ já reportadas como em andamento (`Iteration: N/5 (Issue #<M>)`) em status files ativos (`RUNNING`,
373
+ `BLOCKED_WAITING`, ou `GREEN` ainda não mergeado). Se qualquer issue do grupo já aparecer em um
374
+ worktree ativo: alerte (`⚠️ Issue #<M> já está em andamento no worktree/branch <outra-branch> —
375
+ pulando dispatch duplicado`) e **pule** o dispatch desse grupo.
376
+
377
+ **Antes de invocar `Agent()`, o coordenador DEVE criar o status file** (path da Fase 3) com
378
+ `Status: RUNNING` — o sandbox de isolamento pode impedir o worker de criar arquivo fora do worktree.
379
+ Exemplo: `echo -e "# Agent Status - <branch>\nStatus: RUNNING\nIteration: 1/5 (Issue #<M>)" > <path>`.
380
+
381
+ ```javascript
382
+ Agent({
383
+ description: "Grupo Lead #<N>: <título>",
384
+ prompt: "...",
385
+ subagent_type: "vetor:issue-worker",
386
+ model: "<haiku|sonnet>",
387
+ isolation: "worktree",
388
+ run_in_background: true
389
+ })
390
+ ```
391
+
392
+ **Escolha do `model`:** `haiku` se todas as issues do grupo forem `chore` ou `fix` simples; `sonnet`
393
+ se houver `feat`, `refactor` ou mais de 2 issues complementares. Se esgotar iterações, redespache
394
+ uma vez com `sonnet`.
395
+
396
+ ⚠️ **`isolation: "worktree"` é só para dispatch inicial (worktree ainda não existe).** Se o worktree
397
+ já existe — retomada de sessão, redespacho após `BLOCKED_WAITING` ou após `FAILED_MAX_ITERATIONS`, ou
398
+ recuperação de um worker travado em plan mode (sintoma: status parado em `RUNNING`, sem iteração nova
399
+ nem commit — descarte a sessão travada) — **NÃO use `vetor:issue-worker`**: ele força worktree novo
400
+ via frontmatter. Despache um subagente padrão sem `subagent_type`, instruindo-o com a skill
401
+ `fix-loop-agent` no prompt e um `cd` explícito para o path real do worktree (via `git worktree list`):
402
+
403
+ ```javascript
404
+ Agent({
405
+ description: "Grupo Lead #<N>: <título> (Resumo)",
406
+ prompt: "Entre no diretório <path> e retome o trabalho usando a skill fix-loop-agent...",
407
+ model: "<haiku|sonnet>",
408
+ run_in_background: true
409
+ })
410
+ ```
411
+
412
+ ⚠️ **Colisão de migrations paralelas.** Workers paralelos **dentro da mesma onda** que tocam módulos
413
+ com versionamento sequencial de arquivos (ex.: Flyway `V<N>__*.sql`) podem gerar colisões invisíveis
414
+ ao git. A rede de segurança é o merge serializado (Fase 6) somado à checagem 2.b do `worktree-ship`.
415
+ Já a colisão **entre ondas** (grupo de `O_2` sem visibilidade das migrations de `O_1`) é o problema
416
+ que as Ondas de Despacho (Fase 1) previnem estruturalmente, ao só liberar `O_2` depois do merge e
417
+ sincronismo do branch default com `O_1`.
418
+
419
+ **Nota (Antigravity):** o `issue-worker` também é registrado via `agents/issue-worker/agent.json`
420
+ (`customAgentSpec`). Como define `tools:` explicitamente, **não** herda MCP do contexto pai — se um
421
+ worker precisar de MCP, adicione-o à lista.
422
+
423
+ **Prompt de execução sequencial para o worker:**
424
+ 1. **Lead Issue:** #<N> (título, descrição, critérios de aceite).
425
+ 2. **Issues Sequenciais:** #<M1>, #<M2> (idem).
426
+ 3. **Branch:** `<type>/<issue#>-<slug>` — criar como primeiro passo no worktree.
427
+ 4. **Status File Path:** o path absoluto da Fase 3, atualizado a cada iteração de cada issue
428
+ (ex.: `Iteration: 2/5 (Issue #<M1>)`). Instrua o worker explicitamente:
429
+ > Escreva o status file no path absoluto `<status-file-path>`. Se a plataforma rejeitar com
430
+ > mensagem como *"Edit the worktree copy..."* ou qualquer bloqueio de escrita fora do worktree,
431
+ > salve também uma cópia dentro do worktree em `.claude/vetor-status.md`. Se apenas a cópia local
432
+ > foi gravada, sinalize no chat.
433
+ 5. **Sincronização com origin (obrigatória a partir de `O_2`).** Se este dispatch pertence a uma
434
+ onda `O_{i+1}` posterior à primeira, inclua no prompt, como **primeiro passo padrão logo após o
435
+ `git checkout -b`** — não como recuperação ad-hoc descoberta pelo próprio worker (issue #244):
436
+ > Antes de investigar o escopo da issue, rode `git fetch origin $DEFAULT_BRANCH` e compare com o
437
+ > seu HEAD (`git log origin/$DEFAULT_BRANCH -1` vs `git log HEAD -1`). Se o seu worktree nasceu
438
+ > de um commit anterior aos merges das ondas anteriores, sincronize agora (`git merge
439
+ > origin/$DEFAULT_BRANCH` ou `git rebase origin/$DEFAULT_BRANCH`) antes de procurar qualquer
440
+ > arquivo — issues desta onda podem depender de arquivos criados por PRs de ondas já mergeadas.
441
+ Isso vale mesmo que o coordinator já tenha checado a sincronia do root na Transição de onda: o
442
+ worktree é criado a partir do HEAD local do root no momento do dispatch (`isolation: "worktree"`
443
+ é controlado pelo harness, não pelo coordinator — não há como forçar a criação diretamente a
444
+ partir de `origin/$DEFAULT_BRANCH`), então essa instrução no prompt do worker é a rede de
445
+ segurança que não depende do root ter avançado a tempo.
446
+
447
+ Ao concluir todas as issues com sucesso, o worker marca `GREEN`. Se falhar em alguma, para e marca
448
+ `FAILED_MAX_ITERATIONS` especificando qual issue falhou.
449
+
450
+ ### 5 — Monitoramento
451
+
452
+ **5.a — Tabela de status**
453
+
454
+ ```bash
455
+ bash "$SKILL_DIR/../../scripts/vetor-status.sh"
456
+ ```
457
+
458
+ O script lê `.claude/vetor/status/*.md`, cruza com `git worktree list` (worktree removido
459
+ manualmente → `cancelled (worktree removed)`; não recrie) e com `gh pr list --state all`, e imprime
460
+ a tabela. Reproduza-a no chat acrescentando os grupos `QUEUED`, e adicione a coluna `Onda` (Fase 1)
461
+ a cada linha — o script não conhece o DAG, então essa coluna vem do plano da Fase 2 mantido em
462
+ memória pelo coordinator. Grupos `QUEUED` de uma onda posterior aparecem como
463
+ `QUEUED (aguardando O_i)` para deixar explícita a razão de não terem sido despachados mesmo havendo
464
+ vaga no teto `N`.
465
+
466
+ ⚠️ **Fallback de leitura.** Se o status file no path absoluto não existir ou estiver desatualizado
467
+ para um worktree ativo, leia `<path-do-worktree>/.claude/vetor-status.md` (path via
468
+ `git worktree list`).
469
+
470
+ ⚠️ **Workers duplicados.** Extraia o número de issue de cada `Iteration: N/5 (Issue #<M>)` dos status
471
+ files ativos e cruze-os. Se a mesma issue aparecer em mais de um worktree ativo, sinalize:
472
+ `⚠️ Issue #<M> em andamento simultaneamente em <slug-A> e <slug-B> — possível dispatch duplicado` e
473
+ avalie com o usuário qual worker continua.
474
+
475
+ **5.b — Escalação de bloqueios**
476
+
477
+ **A fonte de verdade da escalação é o status file.** Se um worker sinalizar bloqueio apenas por
478
+ chat, **não escale ainda**: instrua-o via `SendMessage` a gravar o `BLOCKED_WAITING` estruturado
479
+ (`Blocked on` / `Options` / `Recommendation`) primeiro, para que o estado sobreviva a um reinício.
480
+
481
+ **Em `--headless`: não escale.** Registre no relatório final o agente (`<slug>` / Issue `#<N>`), o
482
+ motivo do bloqueio e a recomendação do worker. Não conceda permissão, não escolha opção técnica e
483
+ não redespache. Nunca mate um worker bloqueado para abrir vaga no teto `N`.
484
+
485
+ Fora do headless, leia o bloco `Blocked on` / `Options` / `Recommendation` e escale via
486
+ `AskUserQuestion`, identificando o agente e transmitindo a recomendação. Opções conforme o tipo:
487
+ - **Permissão bloqueada** (`<comando>`): permitir esta vez / permitir para este agente (auto-aprova
488
+ chamadas similares dele) / negar (registra "skipped") / parar agente.
489
+ - **Decisão técnica**: as opções do bloco `Options`.
490
+
491
+ Comunique a decisão ao sub-agente via `SendMessage`. Se a resposta exigir redespachar em worktree
492
+ existente, siga a nota de redispatch da Fase 4.
493
+
494
+ **5.c — Circuit Breaker**
495
+
496
+ Se 2 ou mais agentes falharem com `FAILED_MAX_ITERATIONS` apresentando assinaturas de erro idênticas
497
+ (ex.: falha de rede do gerenciador de pacotes, erro de linkagem global), acione o circuit breaker:
498
+ pause os subagentes ativos e pergunte:
499
+ `⚠️ Circuit Breaker acionado devido a falhas recorrentes com erro similar. Deseja pausar para investigar ou prosseguir mesmo assim?`
500
+
501
+ **Em `--headless`: não pergunte — sempre pause.** Pare de despachar `QUEUED`, deixe os ativos
502
+ terminarem e vá para o relatório destacando a assinatura de erro comum.
503
+
504
+ ### 6 — Fase de merge (serializada)
505
+
506
+ ⚠️ **Serializada** — um merge por vez. ⚠️ **Em `--headless` esta fase inteira é pulada**: liste os
507
+ grupos `GREEN` no relatório final com branch e path do worktree, e encerre.
508
+
509
+ Quando um agente atingir `GREEN`:
510
+
511
+ 1. Verifique que o worker está de fato verde (leia o status file).
512
+ 2. `/vetor:worktree-ship` aborta se o `cwd` não for um worktree, e o contexto do coordinator é o root
513
+ do repo. Entre no worktree antes de invocar:
514
+ ```bash
515
+ git worktree list # localize a linha cuja branch é a do grupo (Fase 3)
516
+ cd <path-do-worktree-do-grupo>
517
+ ```
518
+ Só então:
519
+ ```
520
+ /vetor:worktree-ship <issue#>
521
+ ```
522
+ 3. Após merge bem-sucedido, atualize a tabela.
523
+
524
+ Se `worktree-ship` falhar (CI vermelho, review required), marque na tabela e continue com os outros.
525
+
526
+ ### 7 — Relatório final
527
+
528
+ **Antes do relatório, volte ao root e sincronize.** A Fase 6 faz `cd` para dentro do worktree de
529
+ cada grupo; sem um retorno explícito, a sessão termina com o git preso na branch de um worktree —
530
+ possivelmente já mergeada e obsoleta.
531
+
532
+ ```bash
533
+ cd "$(git worktree list | head -1 | awk '{print $1}')" # a 1ª linha é sempre o root
534
+ bash "$SKILL_DIR/../../scripts/vetor-checks.sh" sync-root
535
+ ```
536
+
537
+ `sync-root` só troca de branch se a atual estiver limpa e já mesclada em `origin/<default>`. Se
538
+ imprimir `AVISO`, **não force**: reporte a pendência no relatório em vez de descartar trabalho.
539
+
540
+ Após todos os agentes terminarem (ou timeout de 90 minutos):
541
+
542
+ ```
543
+ ## Coordinator Report
544
+
545
+ | Issue | Resultado | PR | Detalhes |
546
+ |-------|----------|-----|----------|
547
+ | #42 | ✅ Merged | #87 | squash merged |
548
+ | #43 | ❌ CI failed | #88 | 3 fix attempts, worktree preserved |
549
+ | #44 | ⏸️ Review required | #89 | awaiting human review |
550
+ | #45 | ⏭️ SKIPPED (aguardando Spec) | — | gate de Spec/design, Fase 2 — usuário optou por gerar a Spec antes |
551
+
552
+ Resumo: <N> merged, <M> falharam, <K> aguardando review, <J> aguardando Spec.
553
+ ```
554
+
555
+ **Em `--headless`, o relatório é a única saída da execução** — acrescente:
556
+ - O plano de dispatch da Fase 2 (apenas registrado, não aprovado).
557
+ - Para cada issue `não-trivial` sem Spec associada (gate de Spec/design, Fase 2): sinalizada, nunca
558
+ bloqueada — mesma marca `⚠️ sem Spec associada` da coluna "Ação" do plano.
559
+ - O teto `N` usado e como foi calculado.
560
+ - Para cada `GREEN`: branch e path do worktree, marcados como **prontos para ship**.
561
+ - Para cada `BLOCKED_WAITING`: o bloqueio e a recomendação do worker.
562
+ - Se o circuit breaker disparou: a assinatura de erro comum e os grupos não despachados.
563
+
564
+ ---
565
+
566
+ ## Orçamentos e hard caps
567
+
568
+ - **fix-loop-agent:** 5 iterações é **orçamento sugerido**, não hard cap enforced — nada no hook
569
+ interrompe o agente automaticamente (issue #156). Ao atingir a 5ª iteração sem verde, o agente
570
+ deve registrar `BLOCKED_WAITING` (não decidir sozinho continuar) e escalar ao coordinator via os
571
+ blocos `Blocked on`/`Options`/`Recommendation` do status file, em vez de estourar para 6+.
572
+ - **worktree-ship:** máximo 3 tentativas de fix de CI
573
+ - **Coordinator:** timeout global de 90 minutos (este sim, hard cap real)
574
+ - Agentes em `BLOCKED_WAITING` não consomem iterações do fix-loop
575
+ - `vetor-status.sh` destaca com `⚠️` na tabela qualquer `Iteration: N/5` com `N` acima do orçamento —
576
+ sinal de que o agente não escalou como deveria; trate como candidato a redispatch/intervenção.
577
+
578
+ O teto de workers simultâneos **não é um hard cap**: é o valor `N` decidido pelo usuário na Fase 2
579
+ (default recomendado `maxConcurrentWorkers` de `.claude/vetor/config.json`, senão 5).
580
+
581
+ ---
582
+
583
+ ## Restrições
584
+
585
+ - `worktree-create` e fase de merge são **sempre serializados**
586
+ - Fonte de verdade para status: status files (`.claude/vetor/status/`) + `gh pr list` + `gh pr checks`
587
+ - Nunca chama `EnterWorktree`/`ExitWorktree` por sub-agentes
588
+ - Se interrompido, reconstrói estado com `vetor-status.sh` + `gh pr list` — não depende de memória
589
+ - Ao fim de toda sessão (Fase 7), o root fica na branch principal e sincronizado — nunca preso numa
590
+ branch de worktree de grupo
591
+ - Em `--headless`: nunca chama `AskUserQuestion` nem `ExitPlanMode`, nunca faz merge/ship, nunca
592
+ auto-aprova permissão. Se o contexto exigir uma decisão que o headless não pode tomar, registre no
593
+ relatório e pare — não improvise
594
+ - O gate de Spec/design (Fase 2) nunca bloqueia o dispatch em `--headless` — vira sinalização
595
+ registrada no plano/relatório, nunca um `AskUserQuestion` síncrono (mesmo motivo do item acima:
596
+ deadlock por falta de interlocutor, issue #121)