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