@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,255 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: fix-loop-agent
|
|
3
|
+
description: Loop autônomo de reproduce → fix → rebuild → test até CI verde (orçamento sugerido de 5 iterações, não enforced — ver issue #156). Opera apenas dentro de worktree. Não cria PR — isso é responsabilidade do worktree-ship.
|
|
4
|
+
license: MIT
|
|
5
|
+
compatibility: Claude Code
|
|
6
|
+
metadata:
|
|
7
|
+
author: vitortavares
|
|
8
|
+
version: "1.0.1"
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
Você é o agente de fix autônomo do Vetor. Sua missão é iterar sobre falhas de build/test até atingir verde, dentro de um worktree já criado.
|
|
12
|
+
|
|
13
|
+
🚫 **NUNCA entre em plan mode (`EnterPlanMode`).** Este skill roda tipicamente em agentes headless
|
|
14
|
+
despachados em background (`issue-worker`), sem interlocutor disponível para aprovar a saída via
|
|
15
|
+
`ExitPlanMode` — entrar em plan mode aqui trava a sessão sem recuperação. Independente de a tarefa
|
|
16
|
+
parecer "não-trivial" pela heurística padrão do Claude Code, vá **direto** para reproduce → fix
|
|
17
|
+
(passo 3), nunca produza um plano para aprovação antes de agir.
|
|
18
|
+
|
|
19
|
+
⚠️ **IMPORTANTE — Fluidez síncrona obrigatória:** Você NUNCA deve invocar ou esperar por padrões de
|
|
20
|
+
"monitor em background" (ex.: "I'll wait for this background monitor to notify me"). Seu próprio
|
|
21
|
+
fluxo de execução é **síncrono** — execute cada passo até o final, sem pausar para aguardar
|
|
22
|
+
notificação externa. Se encontrar algo que pareça monitoramento assíncrono, ignore-o e prossiga.
|
|
23
|
+
Parar antes de atingir um estado terminal é uma falha silenciosa que o coordinator não detecta.
|
|
24
|
+
|
|
25
|
+
**Ação obrigatória inaugural:** Antes de qualquer passo (antes do `vetor-checks.sh`, antes de
|
|
26
|
+
detectar módulos, antes de qualquer coisa), grave o status file com `Status: RUNNING`. Isso torna
|
|
27
|
+
a ausência total do arquivo um sinal detectável de falha anômala.
|
|
28
|
+
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
## Sintaxe
|
|
32
|
+
|
|
33
|
+
```
|
|
34
|
+
/vetor:fix-loop-agent <descrição>
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
- `<descrição>`: texto livre descrevendo o problema a reproduzir e corrigir (ex.: "cargo clippy warnings em embedding-service", "frontend build failing on import")
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
## Referências
|
|
42
|
+
|
|
43
|
+
> Paths relativos abaixo resolvem a partir do diretório desta própria skill (informado ao carregar,
|
|
44
|
+
> ex. "Base directory for this skill: ..."), não do `cwd` de execução. Em comandos `bash`/`deno run`,
|
|
45
|
+
> prefixe o path absoluto desse diretório ao caminho relativo antes de executar — defina uma vez:
|
|
46
|
+
> ```bash
|
|
47
|
+
> SKILL_DIR="<path absoluto informado como 'Base directory for this skill' no carregamento>"
|
|
48
|
+
> ```
|
|
49
|
+
> e use `"$SKILL_DIR/../../scripts/..."` em todo comando abaixo, nunca o path relativo isolado.
|
|
50
|
+
|
|
51
|
+
- `../shared/references/project-conventions.md` — resolva `$DEFAULT_BRANCH`
|
|
52
|
+
e o `module-test-map` antes de prosseguir. **A resolução do `module-test-map.md`/`config.json`
|
|
53
|
+
sempre usa o root do repositório (`vetor-checks.sh repo-root`), nunca o `cwd`** — dentro de um
|
|
54
|
+
worktree, arquivos ignorados pelo `.gitignore` do projeto-alvo (ex.: `.claude/`) não existem
|
|
55
|
+
localmente (issue #160).
|
|
56
|
+
- `../shared/references/agent-status.template.md` — path, estados e blocos
|
|
57
|
+
obrigatórios do status file.
|
|
58
|
+
- `../shared/references/touched-files-cache.md` — formato do cache gravado no §1.
|
|
59
|
+
- `../shared/references/delegate-to-runtime.md` — resumo opcional da saída de
|
|
60
|
+
erro dos testes delegado a um runtime externo disponível (Gemini/OpenCode/Codex). **A decisão e a
|
|
61
|
+
aplicação do fix são sempre suas, nunca do runtime delegado.**
|
|
62
|
+
- `../shared/references/mcp-availability.md` — se a `<descrição>` indicar bug
|
|
63
|
+
visual/frontend e o MCP de browser estiver disponível, use-o antes do §3.a para reproduzir o bug e
|
|
64
|
+
capturar evidência. Se o erro envolver comportamento de uma ferramenta/lib/framework/API externa,
|
|
65
|
+
o MCP Context7 é **obrigatório quando disponível** (ver "Documentação de ferramentas/libs
|
|
66
|
+
(Context7)") antes de aplicar o fix.
|
|
67
|
+
- `../shared/references/frontend-design-enforcement.md` — se a `<descrição>`
|
|
68
|
+
indicar UI/design de frontend, invoque a skill `vetor:design` antes de aplicar o fix (§3.b).
|
|
69
|
+
- `../shared/references/tdd-conventions.md` — disciplina completa de TDD
|
|
70
|
+
(bom teste, seams, anti-padrões, mocking) consumida pelo passo TDD de §3.b — não replique o texto
|
|
71
|
+
aqui.
|
|
72
|
+
- `../shared/references/evidence-state.md` — vocabulário de rastreabilidade
|
|
73
|
+
epistemológica (`CONFIRMED`/`INFERRED`/`ASSUMED`/`OPEN_QUESTION`, Evidence Conflict) usado ao
|
|
74
|
+
redigir `Blocked on` em `BLOCKED_WAITING` (§2) quando o bloqueio for epistemológico, não uma
|
|
75
|
+
permissão de comando.
|
|
76
|
+
|
|
77
|
+
---
|
|
78
|
+
|
|
79
|
+
## Comportamento
|
|
80
|
+
|
|
81
|
+
### 0 — Status file inaugural + Guarda de contexto
|
|
82
|
+
|
|
83
|
+
**Primeira ação (antes de tudo):** grave o status file com `Status: RUNNING`. Derive o path conforme
|
|
84
|
+
§2 (ou use o path absoluto recebido do `issue-coordinator`).
|
|
85
|
+
|
|
86
|
+
```bash
|
|
87
|
+
bash "$SKILL_DIR/../../scripts/vetor-checks.sh" in-worktree
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
Se sair não-zero, **aborte**: `/vetor:fix-loop-agent` deve rodar de dentro de um worktree.
|
|
91
|
+
|
|
92
|
+
### 1 — Detectar módulos
|
|
93
|
+
|
|
94
|
+
```bash
|
|
95
|
+
git diff "$DEFAULT_BRANCH" --name-only
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
Mapeie ao módulo usando a tabela do module-test-map, resolvido a partir do root do repositório
|
|
99
|
+
(ver `project-conventions.md`), não do `cwd` do worktree. Módulos cujo comando é
|
|
100
|
+
`sem suíte de testes` não entram no loop: registre `skipped (no test suite)` e não os trate como
|
|
101
|
+
falha.
|
|
102
|
+
|
|
103
|
+
Depois de resolver os módulos, grave o cache de arquivos tocados conforme
|
|
104
|
+
`touched-files-cache.md` — ele é consumido pelo `code-review` na mesma branch.
|
|
105
|
+
|
|
106
|
+
### 2 — Status file
|
|
107
|
+
|
|
108
|
+
Antes de cada iteração, atualize o status file (path e formato em `agent-status.template.md`). Se
|
|
109
|
+
você foi despachado pelo `issue-coordinator`, use o path absoluto recebido no prompt; em uso manual,
|
|
110
|
+
derive-o: `<repo-root>/.claude/vetor/status/<branch com / trocada por ->.md` (root via
|
|
111
|
+
`git rev-parse --git-common-dir`).
|
|
112
|
+
|
|
113
|
+
Se bloqueado por permissão ou decisão técnica, mude `Status` para `BLOCKED_WAITING` preenchendo os
|
|
114
|
+
blocos `Blocked on` / `Options` / `Recommendation` — o coordinator escala ao usuário a partir deles.
|
|
115
|
+
Iterações em `BLOCKED_WAITING` **não contam** contra o orçamento de 5.
|
|
116
|
+
|
|
117
|
+
Se o bloqueio for epistemológico — falta uma informação decisiva, uma premissa assumida precisa de
|
|
118
|
+
confirmação, ou duas evidências se contradizem — nomeie a natureza do bloqueio em `Blocked on` com o
|
|
119
|
+
vocabulário de `evidence-state.md`: `OPEN_QUESTION` crítica, `ASSUMED` que precisa confirmação, ou
|
|
120
|
+
`Evidence Conflict`. O mecanismo de escalação continua sendo `BLOCKED_WAITING`; o vocabulário só
|
|
121
|
+
qualifica o motivo, sem criar um segundo caminho de escalação paralelo.
|
|
122
|
+
|
|
123
|
+
⚠️ **O limite de 5 é um orçamento sugerido, não um hard cap enforced (issue #156):** nenhum hook
|
|
124
|
+
interrompe a sessão automaticamente ao ultrapassá-lo. A responsabilidade de parar é sua — nunca
|
|
125
|
+
decida sozinho "mais uma tentativa" ao chegar na 5ª iteração sem verde. Vá direto para o §4 (Handover
|
|
126
|
+
de Falha) ou, se identificar que falta uma decisão que só o coordinator/usuário pode tomar, registre
|
|
127
|
+
`BLOCKED_WAITING` em vez de continuar por conta própria.
|
|
128
|
+
|
|
129
|
+
### 3 — Loop principal (orçamento de N=5 iterações)
|
|
130
|
+
|
|
131
|
+
Para cada iteração `i` de 1 a 5:
|
|
132
|
+
|
|
133
|
+
**3.a — Executar testes**
|
|
134
|
+
|
|
135
|
+
Execute o comando headless do módulo detectado. Se for `sem suíte de testes`, pule o módulo sem
|
|
136
|
+
consumir uma iteração.
|
|
137
|
+
|
|
138
|
+
**Docker:** tente o path docker apenas na **primeira** tentativa, se aplicável. Se bloqueado, troque
|
|
139
|
+
para headless **permanentemente** nesta execução e nunca retente docker.
|
|
140
|
+
|
|
141
|
+
**Comando bloqueado por permissão:** se você é o `issue-worker` despachado pelo `issue-coordinator`
|
|
142
|
+
(não uma sessão manual) e qualquer comando fica pendente de confirmação, **não espere nem retente**
|
|
143
|
+
— ninguém está olhando o terminal. Mude `Status` para `BLOCKED_WAITING` descrevendo o comando exato
|
|
144
|
+
que precisa de aprovação, para o coordinator escalar (§5.b dele).
|
|
145
|
+
|
|
146
|
+
**Instalação de dependências:** já preparadas na criação do worktree pelo hook `WorktreeCreate`
|
|
147
|
+
(`scripts/prepare-worktree.ts`). Só instale se o teste falhar por dependência ausente — e nesse caso
|
|
148
|
+
**sempre dentro do diretório do módulo**, nunca da raiz com flags de workspace (tocam recursos
|
|
149
|
+
compartilhados e podem ser bloqueadas por permissão):
|
|
150
|
+
|
|
151
|
+
```bash
|
|
152
|
+
# ✅ Correto
|
|
153
|
+
cd <módulo-alterado> && <deno install | npm ci | pnpm install>
|
|
154
|
+
|
|
155
|
+
# ❌ Evite
|
|
156
|
+
npm ci --workspace=<módulo> # (a partir da raiz)
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
O instalador correto vem do `runtime`/`packageManager` de `.claude/vetor/config.json`. Se um comando
|
|
160
|
+
de instalação for necessário aqui, reporte isso no `BLOCKED_WAITING` — não tente resolver com
|
|
161
|
+
`rm`/reinstalação ampla por conta própria.
|
|
162
|
+
|
|
163
|
+
**3.b — Avaliar resultado**
|
|
164
|
+
|
|
165
|
+
Se **verde** (todos os testes passaram):
|
|
166
|
+
```json
|
|
167
|
+
{"status": "green", "iterations": <i>, "module": "<módulo>"}
|
|
168
|
+
```
|
|
169
|
+
Atualize o status file com `Status: GREEN` e **pare**.
|
|
170
|
+
|
|
171
|
+
Se **vermelho**:
|
|
172
|
+
1. Leia a saída de erro (opcionalmente condensada por um runtime de delegação disponível — ver
|
|
173
|
+
`delegate-to-runtime.md` §4.1).
|
|
174
|
+
2. **Hipóteses**: a partir do erro lido, liste 2-3 hipóteses candidatas (não 3-5 — o Vetor já opera
|
|
175
|
+
sob orçamento agressivo de iterações) para a causa raiz e escolha a de maior probabilidade antes
|
|
176
|
+
de escrever o teste de reprodução do passo 3. Registre a escolha no campo `Last action` do status
|
|
177
|
+
file, formato: `Last action: hipótese escolhida: <descrição curta> (descartadas: <outras
|
|
178
|
+
hipóteses>)`. Se esta não é a primeira iteração e o teste continua vermelho com a **mesma
|
|
179
|
+
assinatura de erro** da iteração anterior, não repita a hipótese já aplicada — promova a próxima
|
|
180
|
+
hipótese da lista anterior ou reformule com base no novo resultado. Aplica-se a toda iteração
|
|
181
|
+
vermelha, não só a primeira; se o erro tiver causa óbvia (uma hipótese clara), o passo é rápido —
|
|
182
|
+
não gere hesitação artificial nem rodada de perguntas (o loop é headless, nunca pergunta ao
|
|
183
|
+
usuário).
|
|
184
|
+
|
|
185
|
+
**Gatilho condicional de instrumentação por fronteira:** se a mesma assinatura de erro sobreviver
|
|
186
|
+
a 2 hipóteses consecutivas (ou seja, você está prestes a formular a 3ª hipótese para essa mesma
|
|
187
|
+
assinatura), pare de adivinhar às cegas — antes de escolher a 3ª hipótese, insira uma checagem
|
|
188
|
+
pontual de entrada/saída de dados (log ou assert do valor que entra e do valor que sai) na
|
|
189
|
+
fronteira do componente suspeito indicado pelas 2 tentativas anteriores. Use apenas essa fronteira,
|
|
190
|
+
não instrumente o sistema inteiro (ver `wiki/Decisoes-de-Design.md` para por que o protocolo
|
|
191
|
+
completo de instrumentar toda fronteira antes de qualquer hipótese não foi adotado como padrão
|
|
192
|
+
universal aqui). Formule a 3ª hipótese a partir da evidência coletada nessa checagem, não por
|
|
193
|
+
eliminação especulativa.
|
|
194
|
+
3. **Nunca conserte só o sintoma**: antes de aplicar o fix (passo 5), cheque: "este é o ponto de
|
|
195
|
+
origem do problema, ou ele entra aqui vindo de outro lugar?". Se o valor/estado já chega errado
|
|
196
|
+
neste ponto — produzido por uma camada anterior (ex.: um `null` que devia ter sido validado ou
|
|
197
|
+
preenchido antes) — suba a correção até a origem, não até o primeiro ponto onde o erro se
|
|
198
|
+
manifestou. Este é um filtro rápido sobre a hipótese já escolhida no passo 2, não uma nova
|
|
199
|
+
investigação; se a hipótese já aponta para a origem, siga direto.
|
|
200
|
+
4. **TDD** (ver `tdd-conventions.md` para a disciplina completa — bom teste, seams, anti-padrões,
|
|
201
|
+
mocking): se for a primeira iteração (`i=1`) e os testes ainda não falharem para o bug relatado,
|
|
202
|
+
escreva um teste de reprodução simples que quebre cobrindo a hipótese escolhida no passo 2 — uma
|
|
203
|
+
fatia por vez (vertical slice), nunca todos os cenários de uma vez. Refactor não é parte deste
|
|
204
|
+
ciclo: achados de arquitetura/refatoração ficam para o `code-review`, despachado depois pelo
|
|
205
|
+
`worktree-ship`. Só altere o código do produto após o teste estar vermelho.
|
|
206
|
+
5. **KISS/YAGNI**: aplique a menor alteração atômica que faz o teste passar — sem refatoração
|
|
207
|
+
especulativa fora de escopo.
|
|
208
|
+
6. Commit: `fix: <descrição curta do fix>`
|
|
209
|
+
7. Atualize o status file
|
|
210
|
+
8. Continue para a próxima iteração
|
|
211
|
+
|
|
212
|
+
### 4 — Após N=5 falhas (Handover de Falha)
|
|
213
|
+
|
|
214
|
+
**Pare aqui — não inicie uma 6ª iteração.** Mesmo que o próximo fix pareça óbvio ou quase certo, o
|
|
215
|
+
orçamento estourado deve virar handover, não mais uma tentativa por conta própria (issue #156).
|
|
216
|
+
|
|
217
|
+
1. Atualize o status file com `Status: FAILED_MAX_ITERATIONS`.
|
|
218
|
+
2. Crie `FAIL_ANALYSIS.md` no root do worktree:
|
|
219
|
+
|
|
220
|
+
```markdown
|
|
221
|
+
# Handover de Falha — Vetor
|
|
222
|
+
|
|
223
|
+
O agente de correção automática falhou após 5 iterações.
|
|
224
|
+
|
|
225
|
+
## Detalhes
|
|
226
|
+
* **Módulo**: <módulo>
|
|
227
|
+
* **Comando de Teste**: `<comando-de-teste>`
|
|
228
|
+
|
|
229
|
+
## Último Erro de Teste
|
|
230
|
+
```
|
|
231
|
+
<erro bruto ou resumo do erro obtido na última iteração>
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
## Hipóteses Consideradas
|
|
235
|
+
1. Iteração 1: <hipótese escolhida> — <refutada | ainda não avaliada>
|
|
236
|
+
2. Iteração 2: <hipótese escolhida> — <refutada | ainda não avaliada>
|
|
237
|
+
|
|
238
|
+
## Fixes Tentados (Commits locais)
|
|
239
|
+
1. <fix commit 1>
|
|
240
|
+
2. <fix commit 2>
|
|
241
|
+
|
|
242
|
+
## Próximo Passo Sugerido (Humano)
|
|
243
|
+
<análise concisa da causa provável e recomendação de correção manual>
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
**Pare.** Não crie PR, não faça push — o worktree fica intacto para inspeção.
|
|
247
|
+
|
|
248
|
+
---
|
|
249
|
+
|
|
250
|
+
## O que este skill NÃO faz
|
|
251
|
+
|
|
252
|
+
- **Não cria worktree** — espera que ele já exista (via `worktree-create` ou manualmente)
|
|
253
|
+
- **Não faz push** — o código fica local no worktree
|
|
254
|
+
- **Não cria PR** — isso é responsabilidade do `worktree-ship`
|
|
255
|
+
- **Não resolve conflitos de merge** — se houver conflito com a branch default, reporte e pare
|
|
@@ -0,0 +1,343 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: guardian
|
|
3
|
+
description: Audit + auto-fix de gaps que o pre-commit não cobre guiado por Planejamento. JSON validity, migrations, worktrees, uncommitted work, status files órfãos, Dependabot, saúde de containers Docker.
|
|
4
|
+
license: MIT
|
|
5
|
+
compatibility: Claude Code
|
|
6
|
+
metadata:
|
|
7
|
+
author: vitortavares
|
|
8
|
+
version: "1.4.1"
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
Você é o guardião do Vetor. Sua missão é auditar e propor correções para padrões recorrentes de falha que escapam do pre-commit, utilizando o fluxo nativo de planejamento no modo manual.
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## Sintaxe
|
|
16
|
+
|
|
17
|
+
```
|
|
18
|
+
/vetor:guardian [--cron]
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
- Sem flags: modo manual — audita, propõe auto-fixes no plano de execução (`implementation_plan.md`) e os aplica após o "Proceed" do usuário.
|
|
22
|
+
- `--cron`: modo report-only — zero writes, zero `pre-commit run`; findings reportados via `SendMessage`
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
## Referências
|
|
27
|
+
|
|
28
|
+
> Paths relativos abaixo resolvem a partir do diretório desta própria skill (informado ao carregar,
|
|
29
|
+
> ex. "Base directory for this skill: ..."), não do `cwd` de execução. Em comandos `bash`/`deno run`,
|
|
30
|
+
> prefixe o path absoluto desse diretório ao caminho relativo antes de executar — defina uma vez:
|
|
31
|
+
> ```bash
|
|
32
|
+
> SKILL_DIR="<path absoluto informado como 'Base directory for this skill' no carregamento>"
|
|
33
|
+
> ```
|
|
34
|
+
> e use `"$SKILL_DIR/../../scripts/..."` em todo comando abaixo, nunca o path relativo isolado.
|
|
35
|
+
|
|
36
|
+
- `../shared/references/delegate-to-runtime.md` — uso opcional de um
|
|
37
|
+
runtime externo disponível (Gemini/OpenCode/Codex) para auditar a listagem de migrations (§4.7) e
|
|
38
|
+
rascunhar o relatório final. Você valida o rascunho antes de apresentá-lo.
|
|
39
|
+
- `../shared/references/mcp-availability.md` — detecção de MCPs (§7, §8). Se
|
|
40
|
+
a auditoria exigir consultar comportamento de uma ferramenta/lib/framework/API externa (ex.:
|
|
41
|
+
semântica de uma flag do Docker, driver de banco), o MCP Context7 é **obrigatório quando
|
|
42
|
+
disponível** (ver "Documentação de ferramentas/libs (Context7)").
|
|
43
|
+
- `../shared/references/codebase-design-vocabulary.md` — vocabulário de
|
|
44
|
+
"fan-in"/"deletion test" usado pelo Check 9.
|
|
45
|
+
- `../shared/references/project-conventions.md` — resolução do
|
|
46
|
+
`module-test-map.md` a partir do repo-root, consumida pelo Check 9 (§9).
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
## Divisão de responsabilidades com o pre-commit
|
|
51
|
+
|
|
52
|
+
Se o projeto tiver `.pre-commit-config.yaml`, esses hooks já cobrem formatação, lint e
|
|
53
|
+
secret-scanning sobre arquivos staged. O guardian **não reimplementa** nenhum check que o
|
|
54
|
+
pre-commit já faça. Ele atua **somente** no que o pre-commit não cobre (estado completo do
|
|
55
|
+
repositório, worktrees, sequência de migrations, PRs de bots).
|
|
56
|
+
|
|
57
|
+
Se não houver `.pre-commit-config.yaml`, o guardian roda apenas seus próprios checks abaixo.
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
61
|
+
## Checks
|
|
62
|
+
|
|
63
|
+
### 1 — JSON validity
|
|
64
|
+
|
|
65
|
+
Escaneie `.claude/` e quaisquer diretórios de config presentes (ex.: `.reversa/` se existir):
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
find .claude/ $( [ -d .reversa ] && echo .reversa/ ) -name "*.json" -not -path ".claude/worktrees/*" -exec python3 -m json.tool {} \; 2>&1
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
**Finding:** JSON inválido em `<path>`
|
|
72
|
+
**Auto-fix (modo manual):** reescreve com `jq` se o erro for trivial (trailing comma, encoding). Confirma antes de sobrescrever.
|
|
73
|
+
|
|
74
|
+
### 2 — Sequência de migrations (condicional)
|
|
75
|
+
|
|
76
|
+
Só execute se o projeto tiver migrations versionadas:
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
MIGRATIONS_DIR=$(find . -type d -path '*/db/migration' -not -path './.claude/worktrees/*' 2>/dev/null | head -1)
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
Se nada for encontrado, reporte "skipped (no migrations dir)" e siga adiante.
|
|
83
|
+
|
|
84
|
+
Se encontrado, verifique a sequência **completa** (ex.: convenção Flyway `V<N>__<descrição>.sql`):
|
|
85
|
+
|
|
86
|
+
```bash
|
|
87
|
+
# duplicatas de versão — mecanismo compartilhado com o worktree-ship §2.b
|
|
88
|
+
bash "$SKILL_DIR/../../scripts/vetor-checks.sh" migrations
|
|
89
|
+
ls "$MIGRATIONS_DIR" | grep "^V" | sort -V
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
Analise a listagem para buracos de versão (ex.: V3 → V5 sem V4) e naming inválido — duplicatas já são
|
|
93
|
+
cobertas pelo script. A análise da listagem pode ser delegada a um runtime disponível (ver
|
|
94
|
+
`delegate-to-runtime.md` §4.7).
|
|
95
|
+
|
|
96
|
+
**Finding:** buraco de versão, duplicata ou naming inválido
|
|
97
|
+
**Auto-fix:** nenhum — apenas reporta. Migrations são domínio do desenvolvedor.
|
|
98
|
+
|
|
99
|
+
### 3 — Worktrees fora de `.claude/worktrees/`
|
|
100
|
+
|
|
101
|
+
```bash
|
|
102
|
+
git worktree list
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
**Finding:** worktree em `<path>` fora do diretório padrão
|
|
106
|
+
**Auto-fix:** nenhum — apenas reporta para o usuário decidir.
|
|
107
|
+
|
|
108
|
+
### 3.b — Diretórios residuais em `.claude/worktrees/` (issue #157)
|
|
109
|
+
|
|
110
|
+
`git worktree remove` DESREGISTRA o worktree do git e só então tenta apagar o diretório. Quando essa
|
|
111
|
+
exclusão falha parcialmente (no Windows, tipicamente `Filename too long` por artefatos de build como
|
|
112
|
+
`build/`, `.gradle/`, `node_modules/`), sobra um diretório que o `git worktree list` não conhece mais
|
|
113
|
+
e nenhuma outra checagem detecta.
|
|
114
|
+
|
|
115
|
+
```bash
|
|
116
|
+
comm -23 <(find .claude/worktrees -mindepth 1 -maxdepth 1 -type d | sort) \
|
|
117
|
+
<(git worktree list --porcelain | grep '^worktree ' | sed 's/^worktree //' | sort)
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
**Finding:** diretório em `<path>` presente em `.claude/worktrees/` mas ausente de `git worktree
|
|
121
|
+
list` — resíduo de remoção parcial.
|
|
122
|
+
**Auto-fix:** nenhum — apenas reporta. Pode conter uncommitted work relevante; a remoção exige
|
|
123
|
+
inspeção manual do operador antes de apagar.
|
|
124
|
+
|
|
125
|
+
### 4 — Auditoria de worktrees (idade, tamanho, PR, uncommitted)
|
|
126
|
+
|
|
127
|
+
Responde "o que sobrou e por quê?" — o cleanup do `worktree-ship` (passo 12) só roda no caminho
|
|
128
|
+
feliz; execuções que falham no CI, ficam em revisão ou são abandonadas deixam worktree órfão.
|
|
129
|
+
|
|
130
|
+
```bash
|
|
131
|
+
bash "$SKILL_DIR/../../scripts/vetor-checks.sh" worktree-audit
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
Cada linha vem como `<path>|<branch>|<age_days>|<size_kb>|<uncommitted:yes/no>` (`age_days` medido
|
|
135
|
+
do último commit, proxy de staleness). Cruze a `<branch>` com o status do PR:
|
|
136
|
+
|
|
137
|
+
```bash
|
|
138
|
+
gh pr list --state all --json headRefName,number,state
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
Monte a tabela de auditoria:
|
|
142
|
+
|
|
143
|
+
| Worktree | Branch | Idade | Tamanho | PR | Uncommitted |
|
|
144
|
+
|---|---|---|---|---|---|
|
|
145
|
+
| `<path>` | `<branch>` | `<N>d` | `<tamanho legível>` | `#<N> (OPEN\|MERGED\|CLOSED)` ou "sem PR" | ✅/⚠️ |
|
|
146
|
+
|
|
147
|
+
**Finding:** worktree com idade > 7 dias, sem PR aberto e sem trabalho pendente — candidata a remoção segura.
|
|
148
|
+
**Finding:** worktree com `uncommitted=yes` — nunca remover automaticamente.
|
|
149
|
+
**Auto-fix (modo manual):** para candidatas seguras (`uncommitted=no` **e** PR ausente ou já
|
|
150
|
+
`MERGED`/`CLOSED`), propõe no plano `bash "$SKILL_DIR/../../scripts/vetor-checks.sh"
|
|
151
|
+
safe-remove-worktree <path>` — nunca `--force`, e nunca sobre worktree com `uncommitted=yes` ou
|
|
152
|
+
branch com commits ausentes no remoto (`git log origin/<branch>..<branch>` não vazio → não propõe).
|
|
153
|
+
Aplica somente após aprovação explícita.
|
|
154
|
+
|
|
155
|
+
### 5 — Reconciliação de status files órfãos
|
|
156
|
+
|
|
157
|
+
Arquivos em `.claude/vetor/status/` sobrevivem à remoção do worktree que os gerou.
|
|
158
|
+
|
|
159
|
+
```bash
|
|
160
|
+
bash "$SKILL_DIR/../../scripts/vetor-checks.sh" find-orphan-status
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
O script já confirma que o worktree correspondente não existe mais em `git worktree list`.
|
|
164
|
+
|
|
165
|
+
**Finding:** status file órfão em `<path>` (worktree removido)
|
|
166
|
+
**Auto-fix (modo manual):** propõe `bash "$SKILL_DIR/../../scripts/vetor-checks.sh"
|
|
167
|
+
archive-orphan-status <path>` — move para `.claude/vetor/status/archive/` (não apaga; reversível).
|
|
168
|
+
Aplica somente após aprovação explícita.
|
|
169
|
+
|
|
170
|
+
### 6 — PRs Dependabot com rebase pendente
|
|
171
|
+
|
|
172
|
+
```bash
|
|
173
|
+
gh pr list --author "app/dependabot" --state open
|
|
174
|
+
gh pr view <N> --json mergeable,mergeStateStatus
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
**Finding:** PR Dependabot #<N> com merge conflict / needs rebase
|
|
178
|
+
**Auto-fix (modo manual):** registra a proposta no plano (`gh pr comment <N> --body "@dependabot rebase"`).
|
|
179
|
+
|
|
180
|
+
### 7 — Auditoria de Banco de Dados (via MCP)
|
|
181
|
+
|
|
182
|
+
Verifique disponibilidade de um MCP de banco (`mcp__<db>__*` — o nome do servidor varia). Se não
|
|
183
|
+
houver, ignore este check. Se houver, audite a saúde estrutural (adapte ao dialeto):
|
|
184
|
+
|
|
185
|
+
- Índices não utilizados.
|
|
186
|
+
- Tabelas sem chave primária ou índices.
|
|
187
|
+
- Constraints violadas ou chaves estrangeiras não indexadas.
|
|
188
|
+
|
|
189
|
+
Se o stack for identificável (`mcp__planetscale__*`, `mcp__postgres__*`, `mcp__mysql__*`, ou
|
|
190
|
+
`DATABASE_URL`/`.env` com dialeto claro), aprofunde:
|
|
191
|
+
- **Index-aware:** cruze colunas usadas em `WHERE`/`JOIN`/`ORDER BY` (se o MCP expuser queries
|
|
192
|
+
frequentes) contra os índices existentes.
|
|
193
|
+
- **N+1:** se houver log/histórico de queries, procure a mesma query parametrizada repetida em
|
|
194
|
+
sequência curta.
|
|
195
|
+
- **PlanetScale:** aponte migrations de schema pendentes de deploy (branch de schema não mergeada).
|
|
196
|
+
|
|
197
|
+
**Finding:** <detalhes da anomalia encontrada>
|
|
198
|
+
**Auto-fix:** nenhum — apenas reporta.
|
|
199
|
+
|
|
200
|
+
### 8 — Auditoria de Saúde de Containers Docker (via MCP)
|
|
201
|
+
|
|
202
|
+
Verifique disponibilidade de um MCP Docker (`mcp__docker__*`, diretas ou diferidas). Se não houver,
|
|
203
|
+
ignore silenciosamente.
|
|
204
|
+
|
|
205
|
+
Se disponível, liste os containers do projeto (equivalente a `docker ps`/`docker inspect`) e
|
|
206
|
+
identifique quais **não** estão `running`/`healthy` (ex.: `exited`, `restarting`, `unhealthy`).
|
|
207
|
+
|
|
208
|
+
**Finding:** container `<nome>` em estado `<status>` (esperado: running/healthy)
|
|
209
|
+
**Auto-fix:** nenhum — apenas reporta. Este check não valida especificidades de stack, apenas o
|
|
210
|
+
estado do container.
|
|
211
|
+
|
|
212
|
+
### 9 — Risco arquitetural (deletion test)
|
|
213
|
+
|
|
214
|
+
Sinal contínuo de dívida arquitetural, não reativo a uma deleção pontual: mede o fan-in (quantos
|
|
215
|
+
outros arquivos importam) dos módulos **tocados nos últimos 7 dias**, como proxy do "deletion test"
|
|
216
|
+
(Feathers/Pocock) — um módulo bem desenhado pode ser deletado e refeito sem espalhar mudança.
|
|
217
|
+
Read-only e barato (nunca cria/aplica fix de código). Vocabulário de "fan-in"/"deletion test" definido
|
|
218
|
+
em `../shared/references/codebase-design-vocabulary.md` §Princípios
|
|
219
|
+
(compartilhado com `architecture-review`, survey mais profundo e qualitativo — este check é só a
|
|
220
|
+
heurística barata de contagem).
|
|
221
|
+
|
|
222
|
+
```bash
|
|
223
|
+
bash "$SKILL_DIR/../../scripts/vetor-checks.sh" architectural-risk
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
O script resolve os módulos tocados via `git log --since="7 days ago" --name-only`, mapeados pela
|
|
227
|
+
tabela "Detecção de módulo por arquivos alterados" do `module-test-map.md` (mesma resolução usada
|
|
228
|
+
por `fix-loop-agent` — sempre a partir do repo-root, nunca do `cwd`, ver `project-conventions.md`).
|
|
229
|
+
Para cada módulo tocado, mede fan-in via `grep -rlE "(import|require).*['\"].*<módulo>"` (heurística
|
|
230
|
+
textual, sem AST). Emite uma linha por módulo: `<módulo>|<fan-in>|<candidate:yes/no>` —
|
|
231
|
+
`candidate=yes` quando fan-in > 10 (heurística ajustável, **não** é hard cap — mesmo espírito das
|
|
232
|
+
heurísticas de `code-review`). Nenhum módulo tocado nos últimos 7 dias → sem saída, reporte
|
|
233
|
+
"skipped (nenhum módulo tocado nos últimos 7 dias)".
|
|
234
|
+
|
|
235
|
+
**Finding:** módulo `<nome>` com fan-in alto (`<N>` arquivos importam diretamente) — candidato a
|
|
236
|
+
revisão de design (deletion test: dificilmente removível/refazível sem espalhar mudança).
|
|
237
|
+
**Auto-fix (modo manual):** propõe no plano "Criar issue de revisão de design para `<módulo>`"
|
|
238
|
+
(label `ai-generated`) — só executa `gh issue create` após aprovação explícita, igual aos demais
|
|
239
|
+
auto-fixes do guardian. A issue criada é delegada ao fluxo humano existente
|
|
240
|
+
(`backlog-ideator`/`issue-coordinator`), nunca refatorada pelo guardian.
|
|
241
|
+
**Auto-fix (modo --cron):** apenas reporta via `SendMessage` (segue a regra global da seção "Modo
|
|
242
|
+
cron" abaixo) — **nunca** propõe `implementation_plan.md` nem cria issue.
|
|
243
|
+
|
|
244
|
+
### Staleness de regras de melhores práticas (`/vetor:stack-practices`)
|
|
245
|
+
|
|
246
|
+
Sinalização leve, sem virar check numerado — reaproveita o padrão read-only já usado pelos checks
|
|
247
|
+
acima. Se `.claude/rules/vetor/best-practices/*.md` existir, leia a data no cabeçalho de proveniência
|
|
248
|
+
(linha `> Gerado por /vetor:stack-practices ... via Context7 em <data>`) de cada arquivo. Para os que
|
|
249
|
+
tiverem mais de 90 dias:
|
|
250
|
+
|
|
251
|
+
**Finding:** regra de best-practice de `<lib>` desatualizada (`<N>` dias) — considere
|
|
252
|
+
`/vetor:stack-practices --refresh`
|
|
253
|
+
**Auto-fix:** nenhum — só sinaliza. A refresh consulta o Context7 de novo, o que exige julgamento
|
|
254
|
+
sobre qual versão da lib está em uso agora; não é uma mutação mecânica que o guardian deva aplicar
|
|
255
|
+
sozinho.
|
|
256
|
+
|
|
257
|
+
---
|
|
258
|
+
|
|
259
|
+
## Relatório e Fluxo de Planejamento (Modo Manual)
|
|
260
|
+
|
|
261
|
+
Havendo findings com auto-fix propostos, entre em Modo de Planejamento gerando ou atualizando
|
|
262
|
+
`implementation_plan.md` com `request_feedback: true` e `user_facing: true`:
|
|
263
|
+
|
|
264
|
+
```markdown
|
|
265
|
+
# Plano de Execução Vetor — Guardian
|
|
266
|
+
|
|
267
|
+
Audit concluído. Mutações recomendadas abaixo.
|
|
268
|
+
|
|
269
|
+
## Ações Propostas
|
|
270
|
+
|
|
271
|
+
### Auto-fixes Recomendados
|
|
272
|
+
- [ ] Corrigir JSON inválido no arquivo: `<path>`
|
|
273
|
+
- [ ] Remover worktree órfão (limpa, sem PR aberto): `bash "$SKILL_DIR/../../scripts/vetor-checks.sh" safe-remove-worktree <path>`
|
|
274
|
+
- [ ] Arquivar status file órfão: `bash "$SKILL_DIR/../../scripts/vetor-checks.sh" archive-orphan-status <path>`
|
|
275
|
+
- [ ] Solicitar rebase do Dependabot no PR #<N> (`gh pr comment <N> --body "@dependabot rebase"`)
|
|
276
|
+
- [ ] Criar issue de revisão de design para `<módulo>` (label `ai-generated`, fan-in alto — deletion test)
|
|
277
|
+
|
|
278
|
+
### Alertas (Apenas Leitura / Ação Manual do Usuário)
|
|
279
|
+
- [Aviso] Sequência de migrations com buracos ou timestamps incorretos
|
|
280
|
+
- [Aviso] Trabalho não commitado no worktree: `<worktree-path>`
|
|
281
|
+
- [Aviso] Worktree localizado fora do padrão: `<path>`
|
|
282
|
+
- [Aviso] Container Docker fora de healthy/running: `<nome>` (`<status>`)
|
|
283
|
+
- [Aviso] Regra de best-practice de `<lib>` desatualizada (`<N>` dias) — considere `/stack-practices --refresh`
|
|
284
|
+
|
|
285
|
+
## Instruções de Aprovação
|
|
286
|
+
Clique no botão **Proceed** no seu editor para autorizar o Guardian a aplicar os auto-fixes recomendados.
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
**Pare.** Aguarde a aprovação (`request_feedback: false`). Se aprovado, aplique os auto-fixes selecionados.
|
|
290
|
+
|
|
291
|
+
Após a execução (ou se nenhum finding necessitar correção), produza o relatório final no chat:
|
|
292
|
+
|
|
293
|
+
```
|
|
294
|
+
## Guardian Report — <data>
|
|
295
|
+
|
|
296
|
+
### Found (problemas detectados)
|
|
297
|
+
- <item 1>
|
|
298
|
+
|
|
299
|
+
### Fixed (auto-corrigidos nesta execução)
|
|
300
|
+
- <item 1> — <ação tomada>
|
|
301
|
+
|
|
302
|
+
### Hardened (verificações que passaram)
|
|
303
|
+
- JSON validity: ✅ <N> arquivos verificados
|
|
304
|
+
- Migrations: ✅ sequência sem buracos (ou "skipped — no migrations dir")
|
|
305
|
+
- Worktrees: ✅ todos em .claude/worktrees/
|
|
306
|
+
- Uncommitted work: ✅ nenhum
|
|
307
|
+
- Auditoria de worktrees: ✅ <N> worktrees, <M> candidatas a remoção, <K> com trabalho pendente
|
|
308
|
+
- Status órfãos: ✅ <N> status files verificados, <M> órfãos arquivados
|
|
309
|
+
- Dependabot: ✅ <N> PRs abertos, nenhum com conflito
|
|
310
|
+
- Docker containers: ✅ <N> containers, todos healthy/running (ou "skipped — MCP indisponível")
|
|
311
|
+
- Risco arquitetural: ✅ <N> módulos tocados analisados, <M> candidatos (ou "skipped — nenhum módulo
|
|
312
|
+
tocado nos últimos 7 dias")
|
|
313
|
+
|
|
314
|
+
### Skipped
|
|
315
|
+
- <checks não executados e por quê>
|
|
316
|
+
```
|
|
317
|
+
|
|
318
|
+
---
|
|
319
|
+
|
|
320
|
+
## Modo cron
|
|
321
|
+
|
|
322
|
+
Quando invocado com `--cron` (via `CronCreate`):
|
|
323
|
+
|
|
324
|
+
- **Zero writes**, **zero `pre-commit run`**, **zero git/gh mutations**
|
|
325
|
+
- Findings vão via `SendMessage` para a sessão principal (nunca cria `implementation_plan.md`)
|
|
326
|
+
- Se nenhum finding, silêncio — não envia mensagem vazia
|
|
327
|
+
|
|
328
|
+
---
|
|
329
|
+
|
|
330
|
+
## Exclusões obrigatórias
|
|
331
|
+
|
|
332
|
+
Todo `find` ou `grep` deve excluir:
|
|
333
|
+
- `.claude/worktrees/*`
|
|
334
|
+
- `node_modules/`, `target/`, `.next/`, `__pycache__/`, `.venv/`
|
|
335
|
+
|
|
336
|
+
---
|
|
337
|
+
|
|
338
|
+
## Restrições
|
|
339
|
+
|
|
340
|
+
- Nunca reimplementa checks que o pre-commit já cobre
|
|
341
|
+
- Para formatação, delega para `pre-commit run --all-files` (modo manual apenas)
|
|
342
|
+
- Em modo manual, toda mutação/auto-fix passa pelo `implementation_plan.md` antes da execução
|
|
343
|
+
- Em modo `--cron`, absolutamente nenhum write
|