@fontdata/ai-harness 2.0.0 → 2.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/.claude-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +9 -2
- package/LICENSE +21 -0
- package/README.md +174 -140
- package/{src → dist}/catalog.js +5 -12
- package/dist/cli.js +174 -0
- package/dist/comentarios/command.js +74 -0
- package/dist/comentarios/instalar.js +33 -0
- package/dist/config/config.js +98 -0
- package/dist/contratos/artefatos.js +284 -0
- package/dist/contratos/eventos.js +103 -0
- package/dist/doctor/checks.js +424 -0
- package/dist/init.js +240 -0
- package/dist/install/atomic.js +51 -0
- package/dist/install/flags.js +99 -0
- package/dist/install/hooks.js +47 -0
- package/dist/install/lock.js +39 -0
- package/dist/install/plan.js +209 -0
- package/dist/install/selection.js +77 -0
- package/dist/install/settings.js +108 -0
- package/dist/memoria/indice.js +195 -0
- package/dist/migrar/migrar.js +426 -0
- package/dist/rastro/command.js +46 -0
- package/dist/run.js +86 -0
- package/dist/types.js +1 -0
- package/dist/update/legado.js +74 -0
- package/dist/update/update.js +284 -0
- package/package.json +17 -8
- package/templates/CLAUDE.md +59 -30
- package/templates/agents/auditor-plano.md +42 -0
- package/templates/agents/investigador.md +32 -0
- package/templates/agents/qa.md +44 -0
- package/templates/agents/revisor-testes.md +40 -0
- package/templates/catalog.json +24 -61
- package/templates/commands/atualizar-deps.md +43 -9
- package/templates/commands/diagrama.md +35 -10
- package/templates/commands/gerar-env.md +39 -10
- package/templates/commands/gerar-testes.md +42 -10
- package/templates/commands/git-commit-push.md +0 -0
- package/templates/commands/onboarding.md +44 -15
- package/templates/commands/refatorar.md +50 -10
- package/templates/commands/revisar-pr.md +56 -12
- package/templates/commands/sincronizar-claude-md.md +177 -9
- package/templates/commands/versao.md +0 -0
- package/templates/hooks/comentarios/check.mjs +210 -0
- package/templates/hooks/hooks.json +34 -0
- package/templates/hooks/lembrete.mjs +29 -0
- package/templates/hooks/lib/config.mjs +40 -0
- package/templates/hooks/lib/hook.mjs +85 -0
- package/templates/hooks/lib/rastro.mjs +130 -0
- package/templates/hooks/lib/segredos.mjs +91 -0
- package/templates/hooks/lib/temas.mjs +111 -0
- package/templates/hooks/lib/trabalho.mjs +94 -0
- package/templates/hooks/proteger-contratos.mjs +56 -0
- package/templates/hooks/segredo-no-commit.mjs +76 -0
- package/templates/hooks/sem-jargao.mjs +58 -0
- package/templates/hooks/task-so-fecha-verde.mjs +33 -0
- package/templates/legado/manifesto.json +1267 -0
- package/templates/rules/comentarios.md +166 -0
- package/templates/rules/harness-projeto.md +41 -0
- package/templates/skills/auditar-performance/SKILL.md +53 -0
- package/templates/skills/auditar-performance/references/pontos-quentes.md +35 -0
- package/templates/skills/auditar-performance/templates/relatorios/CLIENTE.md +26 -0
- package/templates/skills/auditar-performance/templates/relatorios/TECNICO.md +27 -0
- package/templates/skills/auditar-seguranca/SKILL.md +67 -0
- package/templates/skills/auditar-seguranca/references/seguranca-tecnica.md +23 -0
- package/templates/skills/auditar-seguranca/templates/relatorios/CLIENTE.md +30 -0
- package/templates/skills/auditar-seguranca/templates/relatorios/TECNICO.md +38 -0
- package/templates/skills/auditar-ui/SKILL.md +64 -0
- package/templates/skills/auditar-ui/references/lentes.md +33 -0
- package/templates/skills/auditar-ui/templates/relatorios/CLIENTE.md +26 -0
- package/templates/skills/auditar-ui/templates/relatorios/TECNICO.md +31 -0
- package/templates/skills/evoluir-harness/SKILL.md +81 -0
- package/templates/skills/evoluir-harness/references/agent.md +83 -0
- package/templates/skills/evoluir-harness/references/auditoria.md +107 -0
- package/templates/skills/evoluir-harness/references/code-reviewer.md +68 -0
- package/templates/skills/evoluir-harness/references/design-system.md +56 -0
- package/templates/skills/evoluir-harness/references/hook.md +95 -0
- package/templates/skills/evoluir-harness/references/rule.md +67 -0
- package/templates/skills/evoluir-harness/references/skill.md +63 -0
- package/templates/skills/executar-plan/SKILL.md +114 -0
- package/templates/skills/executar-plan/references/delegacao.md +43 -0
- package/templates/skills/executar-plan/references/retomada.md +33 -0
- package/templates/skills/executar-plan/templates/BLOQUEIOS.md +30 -0
- package/templates/skills/harness/SKILL.md +75 -0
- package/templates/skills/harness/references/auto-tag.md +118 -0
- package/templates/skills/harness/references/ignores.md +40 -0
- package/templates/skills/harness/references/scaffold.md +29 -0
- package/templates/skills/harness/references/validar-ideia.md +42 -0
- package/templates/skills/memoria/SKILL.md +52 -0
- package/templates/skills/nova-tarefa/SKILL.md +97 -0
- package/templates/skills/nova-tarefa/references/isso-ja-existe.md +24 -0
- package/templates/skills/nova-tarefa/references/regras-do-plano.md +33 -0
- package/templates/skills/nova-tarefa/templates/DECISOES.md +20 -0
- package/templates/skills/nova-tarefa/templates/PLAN.md +58 -0
- package/templates/skills/nova-tarefa/templates/SPEC.md +37 -0
- package/templates/skills/resolver-bug/SKILL.md +104 -0
- package/templates/skills/resolver-bug/references/relatorio-para-cliente.md +26 -0
- package/templates/skills/resolver-bug/templates/PLAN.md +62 -0
- package/templates/skills/resolver-bug/templates/relatorios/CLIENTE.md +29 -0
- package/templates/skills/resolver-bug/templates/relatorios/TECNICO.md +32 -0
- package/bin/cli.js +0 -122
- package/src/init.js +0 -317
- package/src/installer.js +0 -92
- package/src/run.js +0 -99
- package/templates/commands/auditar-performance.md +0 -27
- package/templates/commands/auditar-seguranca.md +0 -64
- package/templates/commands/auditar-ui.md +0 -38
- package/templates/commands/codigo-morto.md +0 -22
- package/templates/commands/configurar-auto-tag.md +0 -185
- package/templates/commands/configurar-comentarios.md +0 -543
- package/templates/commands/configurar-orquestrador.md +0 -13
- package/templates/commands/corrigir-review.md +0 -11
- package/templates/commands/criar-agents.md +0 -42
- package/templates/commands/criar-code-reviewer.md +0 -30
- package/templates/commands/criar-hooks.md +0 -32
- package/templates/commands/criar-rag.md +0 -25
- package/templates/commands/criar-rules.md +0 -31
- package/templates/commands/criar-skill.md +0 -22
- package/templates/commands/design-system.md +0 -27
- package/templates/commands/executar-plan.md +0 -36
- package/templates/commands/gerar-claude-md.md +0 -66
- package/templates/commands/gerar-ignore.md +0 -37
- package/templates/commands/gerar-spec.md +0 -33
- package/templates/commands/harness.md +0 -34
- package/templates/commands/nova-tarefa.md +0 -60
- package/templates/commands/resolver-bug.md +0 -25
- package/templates/commands/review-por-task.md +0 -16
- package/templates/commands/scaffold.md +0 -25
- package/templates/commands/validar-commands.md +0 -24
- package/templates/commands/validar-ideia.md +0 -36
|
@@ -1,543 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
description: Instala o padrão de comentários do projeto (comentar o "porquê" com orçamento duro, em qualquer linguagem inclusive Delphi/Pascal) — rule, bloco no CLAUDE.md e hook bloqueante com catraca sobre o legado.
|
|
3
|
-
---
|
|
4
|
-
|
|
5
|
-
# /configurar-comentarios — Padrão de comentários (porquê, com orçamento)
|
|
6
|
-
|
|
7
|
-
Você vai **instalar o padrão de comentários** deste projeto, em três camadas que se reforçam:
|
|
8
|
-
|
|
9
|
-
1. **A rule** `.claude/rules/comentarios.md` — o guia completo, com orçamento e contra-exemplos.
|
|
10
|
-
2. **O bloco no `CLAUDE.md`** da raiz — **autossuficiente** (não é um ponteiro), com `@import` da rule.
|
|
11
|
-
3. **O hook** `.claude/hooks/comentarios/check.mjs` — `PostToolUse` bloqueante, com **catraca** sobre o
|
|
12
|
-
código legado.
|
|
13
|
-
|
|
14
|
-
Como tudo fica **versionado no projeto**, qualquer clone já vem com o padrão configurado — sem depender de
|
|
15
|
-
configuração global de cada máquina.
|
|
16
|
-
|
|
17
|
-
> **Por que três camadas.** A versão anterior deste comando só instalava a rule e um ponteiro no fim do
|
|
18
|
-
> `CLAUDE.md`. Em produção isso falhou: a rule mandava "comentar o porquê" **sem nenhum teto**, e os
|
|
19
|
-
> sub-agents produziram arquivos com 38% a 59% de linhas de comentário — blocos de 10 a 25 linhas narrando
|
|
20
|
-
> investigação, medição e histórico de task. Formalmente era "o porquê"; na prática era ilegível. Regra sem
|
|
21
|
-
> orçamento, sem contra-exemplo e sem enforcement não segura nada.
|
|
22
|
-
|
|
23
|
-
> **🚦 Há um GATE de aprovação obrigatório** antes de gravar qualquer arquivo. Este comando **não faz commit
|
|
24
|
-
> nem push**.
|
|
25
|
-
|
|
26
|
-
## Uso
|
|
27
|
-
|
|
28
|
-
- `/configurar-comentarios` — instala/atualiza as três camadas neste projeto.
|
|
29
|
-
|
|
30
|
-
## Passo 0 — Pré-checagem (somente leitura)
|
|
31
|
-
|
|
32
|
-
1. Alvos deste comando (escopo **projeto**):
|
|
33
|
-
- rule → `.claude/rules/comentarios.md`
|
|
34
|
-
- context file → `CLAUDE.md` na raiz
|
|
35
|
-
- hook → `.claude/hooks/comentarios/check.mjs`
|
|
36
|
-
- registro do hook → `.claude/settings.json`
|
|
37
|
-
- catraca → `.claude/hooks/comentarios/baseline.json` (gerado no Passo 6)
|
|
38
|
-
2. Verifique o que **já existe**. Se houver rule ou bloco antigos, trate como **atualização** (reconcilie
|
|
39
|
-
no lugar), nunca como duplicação.
|
|
40
|
-
3. Verifique se `.claude/settings.json` já existe e **quais hooks ele já registra** — o Passo 5 faz *merge*,
|
|
41
|
-
nunca sobrescreve.
|
|
42
|
-
4. Detecte se o projeto usa Prettier/formatador em `.md`. Não é bloqueante: o conteúdo da rule abaixo já
|
|
43
|
-
vem com os exemplos dentro de code fences justamente para sobreviver à formatação.
|
|
44
|
-
|
|
45
|
-
## Passo 1 — Rascunhar a rule (sem gravar ainda)
|
|
46
|
-
|
|
47
|
-
Prepare o conteúdo de `.claude/rules/comentarios.md` exatamente como abaixo:
|
|
48
|
-
|
|
49
|
-
````markdown
|
|
50
|
-
# Estilo de comentários (todas as linguagens)
|
|
51
|
-
|
|
52
|
-
IMPORTANT: o padrão é **não comentar**. Comentário é exceção que precisa se justificar.
|
|
53
|
-
|
|
54
|
-
Antes de escrever qualquer comentário, responda:
|
|
55
|
-
**"quem editar esta linha daqui a 6 meses quebra o sistema sem esta informação?"**
|
|
56
|
-
Se a resposta não for um "sim" claro, **não comente**.
|
|
57
|
-
|
|
58
|
-
## Orçamento (limites duros)
|
|
59
|
-
|
|
60
|
-
| Item | Limite |
|
|
61
|
-
|---|---|
|
|
62
|
-
| Bloco de comentário interno | **3 linhas** |
|
|
63
|
-
| Docstring de função/método público | **5 linhas** |
|
|
64
|
-
| Cabeçalho de arquivo | **proibido** |
|
|
65
|
-
| Comentários internos por função | **1** |
|
|
66
|
-
| Densidade do arquivo | **<= 10%** das linhas |
|
|
67
|
-
|
|
68
|
-
Se o porquê não cabe em 3 linhas, **ele não pertence ao código**.
|
|
69
|
-
|
|
70
|
-
## Proibido
|
|
71
|
-
|
|
72
|
-
1. **Banner/separador de seção** — `// ─── X ───`, `// ==== SEÇÃO ====`, `// ---- X ----`.
|
|
73
|
-
Arquivo que precisa de seções precisa ser **dividido**, não decorado.
|
|
74
|
-
2. **Rastreabilidade de processo** — `Task 4.2.1`, `Fase 2`, `Plano 006`, `T2.1`, `SPEC 001`,
|
|
75
|
-
`docs/plans/...`, `achado do @code-reviewer`, `commit c83bb4e0`, `bug de 2026-07-16`.
|
|
76
|
-
O git e `docs/` já guardam isso; no código vira lixo em três meses.
|
|
77
|
-
3. **Narração do passo a passo** — `// Carrega o usuário`, `// Verifica se existe`, `// Monta o payload`.
|
|
78
|
-
4. **Redundância com o identificador** — `// Mapa de nó por id` acima de `const nodeMap = new Map()`.
|
|
79
|
-
5. **Ensaio/investigação** — medição, histórico do bug, o que foi tentado, o que foi rejeitado.
|
|
80
|
-
Isso vive em `docs/investigacoes/`, não no código.
|
|
81
|
-
6. **Ênfase tipográfica** — CAPS-LOCK (`NUNCA`, `IMPOSSÍVEL`), emoji, `⚠️ REGRA DE OURO`.
|
|
82
|
-
7. **Código comentado** — apague; o git guarda.
|
|
83
|
-
|
|
84
|
-
## Permitido (lista fechada)
|
|
85
|
-
|
|
86
|
-
- **Contrato não óbvio** de função/método público — docstring de até 5 linhas.
|
|
87
|
-
- **Armadilha real**: por que a abordagem óbvia quebra — até 3 linhas, **no presente**, sem contar a história.
|
|
88
|
-
- **`TODO:` / `FIXME:`** com o motivo real — 1 linha.
|
|
89
|
-
- **Referência externa** (RFC, issue da lib, doc de API) que justifica um workaround — 1 linha.
|
|
90
|
-
|
|
91
|
-
## Para onde vai cada informação
|
|
92
|
-
|
|
93
|
-
| Informação | Onde mora | Nunca em |
|
|
94
|
-
|---|---|---|
|
|
95
|
-
| Por que a mudança foi feita | mensagem de commit | comentário |
|
|
96
|
-
| Task / fase / plano / spec | `docs/plans/`, `docs/specs/` | comentário |
|
|
97
|
-
| Diagnóstico e correção de um defeito | `docs/bugs/` | comentário |
|
|
98
|
-
| Investigação, medição, auditoria, paridade, comparação | `docs/investigacoes/` | comentário, `docs/bugs/` |
|
|
99
|
-
| Achado de review | resposta do review, commit | comentário |
|
|
100
|
-
| Decisão de arquitetura | `SPEC.md` | comentário |
|
|
101
|
-
| Armadilha ao editar **aquela linha** | comentário de até 3 linhas | — |
|
|
102
|
-
|
|
103
|
-
**Bug ou investigação?** Só vai para `docs/bugs/` o que tem os três: sintoma reproduzível,
|
|
104
|
-
causa-raiz identificada e correção aplicada no código. Se falta qualquer um — é auditoria,
|
|
105
|
-
paridade com legado, medição, comparação, levantamento, handoff ou follow-up — vai para
|
|
106
|
-
`docs/investigacoes/`. Se o documento descreve trabalho a fazer em vez de defeito apurado,
|
|
107
|
-
vai para `docs/plans/`.
|
|
108
|
-
|
|
109
|
-
Convenção de nome em ambas: `<yyyy-mm-dd>-<slug>.md`.
|
|
110
|
-
|
|
111
|
-
## Antes e depois
|
|
112
|
-
|
|
113
|
-
**1. Ensaio de investigação → armadilha objetiva**
|
|
114
|
-
|
|
115
|
-
```ts
|
|
116
|
-
// ANTES (7 linhas: medição, histórico e ênfase)
|
|
117
|
-
// Timeout PRÓPRIO (independente do timeout global de query do Baileys) para a busca
|
|
118
|
-
// da foto de perfil no recebimento. Medição real: com o timeout global em 60000ms,
|
|
119
|
-
// todo recebimento de contato LID (que não responde à query w:profile:picture)
|
|
120
|
-
// travava por ~60s; baixando para 15000ms o atraso caiu para 15.001ms — proporcional
|
|
121
|
-
// ao milissegundo. A foto é cosmética e NUNCA pode bloquear o recebimento; default
|
|
122
|
-
// SEGURO e curto, sem depender de NODE_ENV.
|
|
123
|
-
PROFILE_PIC_TIMEOUT_MS: z.coerce.number().default(3000),
|
|
124
|
-
|
|
125
|
-
// DEPOIS (2 linhas: só o que quebra ao editar esta linha)
|
|
126
|
-
// Contato LID nunca responde a essa query e a foto é cosmética — subir este timeout
|
|
127
|
-
// volta a travar o recebimento de mensagem.
|
|
128
|
-
PROFILE_PIC_TIMEOUT_MS: z.coerce.number().default(3000),
|
|
129
|
-
```
|
|
130
|
-
|
|
131
|
-
**2. Cabeçalho de arquivo → nada**
|
|
132
|
-
|
|
133
|
-
```ts
|
|
134
|
-
// ANTES (49 linhas antes do primeiro import)
|
|
135
|
-
/**
|
|
136
|
-
* Task 1.3.4 / Task 2.3.7 — AgentFlowExecutor
|
|
137
|
-
*
|
|
138
|
-
* Orquestra a execução de um AgentRun:
|
|
139
|
-
* 1. Carrega AgentRun escopado por id + companyId (multi-tenant)
|
|
140
|
-
* 2. Adquire lock por ticket
|
|
141
|
-
* ...
|
|
142
|
-
* GRAFO DINÂMICO (Fase 2):
|
|
143
|
-
* ROTEAMENTO POR builderMode (Plano 006 — modo simples, T2.1):
|
|
144
|
-
*/
|
|
145
|
-
import { ... }
|
|
146
|
-
|
|
147
|
-
// DEPOIS
|
|
148
|
-
import { ... }
|
|
149
|
-
```
|
|
150
|
-
|
|
151
|
-
O nome do arquivo, os exports e a assinatura pública já dizem o que ele é. A ordem dos passos está no
|
|
152
|
-
código; a história está no git.
|
|
153
|
-
|
|
154
|
-
**3. Banner + narração → código legível**
|
|
155
|
-
|
|
156
|
-
```ts
|
|
157
|
-
// ANTES
|
|
158
|
-
// ── 1. Carrega AgentRun escopado por id + companyId ─────────────────
|
|
159
|
-
const run = await AgentRun.findOne({ where: { id, companyId } });
|
|
160
|
-
// ── 2. Adquire lock por ticket ──────────────────────────────────────
|
|
161
|
-
const lock = await acquireTicketLock(companyId, ticketId);
|
|
162
|
-
|
|
163
|
-
// DEPOIS
|
|
164
|
-
const run = await AgentRun.findOne({ where: { id, companyId } });
|
|
165
|
-
const lock = await acquireTicketLock(companyId, ticketId);
|
|
166
|
-
```
|
|
167
|
-
|
|
168
|
-
**4. Docstring inflada → contrato**
|
|
169
|
-
|
|
170
|
-
```ts
|
|
171
|
-
// ANTES (12 linhas)
|
|
172
|
-
/**
|
|
173
|
-
* Gera um novo par de chaves de API para a empresa.
|
|
174
|
-
* Task 7.3.1. Esta função foi criada no plano de 2026-07-28 depois que o
|
|
175
|
-
* @code-reviewer apontou que a chave estava sendo salva em texto puro.
|
|
176
|
-
* Primeiro gera bytes aleatórios, depois deriva o hash SHA-256, e por fim
|
|
177
|
-
* ...
|
|
178
|
-
*/
|
|
179
|
-
|
|
180
|
-
// DEPOIS (4 linhas)
|
|
181
|
-
/**
|
|
182
|
-
* Gera um par (plainKey, keyHash).
|
|
183
|
-
* - plainKey: devolvido UMA única vez ao chamador, nunca persistido
|
|
184
|
-
* - keyHash: o que vai para o banco
|
|
185
|
-
*/
|
|
186
|
-
```
|
|
187
|
-
|
|
188
|
-
## Sintaxe por linguagem
|
|
189
|
-
|
|
190
|
-
```ts
|
|
191
|
-
/**
|
|
192
|
-
* Uma linha de propósito; entradas/saídas só quando não são óbvias.
|
|
193
|
-
*/
|
|
194
|
-
export function hashApiKey(plainKey: string): string {}
|
|
195
|
-
```
|
|
196
|
-
|
|
197
|
-
```pascal
|
|
198
|
-
/// <summary>
|
|
199
|
-
/// Gera o hash SHA-256 de uma API Key.
|
|
200
|
-
/// </summary>
|
|
201
|
-
function HashApiKey(const APlainKey: string): string;
|
|
202
|
-
```
|
|
203
|
-
|
|
204
|
-
- **TypeScript/JavaScript/Java/C#/C++/Go/Rust/PHP:** `/** ... */` no topo do símbolo **público**.
|
|
205
|
-
- **Python:** docstring `"""..."""` curta logo abaixo da assinatura.
|
|
206
|
-
- **Delphi/Pascal:** `///` (XMLDoc) nas rotinas públicas da `interface`; nunca repetir na `implementation`.
|
|
207
|
-
- **SQL/Shell/YAML:** somente regra de negócio ou pegadinha não evidente.
|
|
208
|
-
|
|
209
|
-
## Enforcement
|
|
210
|
-
|
|
211
|
-
O hook `.claude/hooks/comentarios/check.mjs` roda a cada `Write`/`Edit` e **bloqueia** banner, rastreabilidade
|
|
212
|
-
de processo, data, cabeçalho de arquivo, código comentado e bloco acima do teto.
|
|
213
|
-
|
|
214
|
-
Arquivos que já existiam quando o padrão foi instalado estão em
|
|
215
|
-
`.claude/hooks/comentarios/baseline.json` (catraca): eles **não precisam ser limpos de uma vez**, só não
|
|
216
|
-
podem piorar. Quando melhoram, a catraca desce e não volta.
|
|
217
|
-
````
|
|
218
|
-
|
|
219
|
-
## Passo 2 — Rascunhar o bloco do CLAUDE.md (sem gravar ainda)
|
|
220
|
-
|
|
221
|
-
O bloco é **autossuficiente** — quem só ler o `CLAUDE.md` já sabe o que fazer sem abrir a rule. Ele vai
|
|
222
|
-
logo **após a seção "Padrões de código"** (ou, se ela não existir, após "Stack"). **Não** no fim do arquivo.
|
|
223
|
-
|
|
224
|
-
````markdown
|
|
225
|
-
## Comentários em código
|
|
226
|
-
|
|
227
|
-
IMPORTANT: o padrão é **não comentar**. Comentário é exceção que precisa se justificar — em qualquer
|
|
228
|
-
linguagem, incluindo Delphi/Pascal. Antes de comentar: *"quem editar esta linha daqui a 6 meses quebra o
|
|
229
|
-
sistema sem esta informação?"* Se não for um "sim" claro, não comente.
|
|
230
|
-
|
|
231
|
-
**Orçamento:** bloco interno <= 3 linhas · docstring pública <= 5 linhas · cabeçalho de arquivo proibido ·
|
|
232
|
-
1 comentário interno por função · densidade <= 10% do arquivo.
|
|
233
|
-
Se o porquê não cabe em 3 linhas, ele não pertence ao código.
|
|
234
|
-
|
|
235
|
-
**Proibido:** banner/separador (`// ─── X ───`) · task/fase/plano/spec/data/hash de commit/achado de review
|
|
236
|
-
· narração do passo a passo · redundância com o nome do identificador · ensaio de investigação · CAPS-LOCK
|
|
237
|
-
e emoji · código comentado.
|
|
238
|
-
|
|
239
|
-
**Onde a informação mora:** por que a mudança foi feita → mensagem de commit · task/plano → `docs/plans/` ·
|
|
240
|
-
correção de defeito → `docs/bugs/` · investigação, medição e auditoria → `docs/investigacoes/` ·
|
|
241
|
-
decisão de arquitetura → `SPEC.md`. No código, só a armadilha que quebra ao editar aquela linha.
|
|
242
|
-
|
|
243
|
-
Enforcement: `.claude/hooks/comentarios/check.mjs` bloqueia no `Write`/`Edit`. Legado tem catraca em
|
|
244
|
-
`.claude/hooks/comentarios/baseline.json` — não precisa ser limpo de uma vez, mas não pode piorar.
|
|
245
|
-
|
|
246
|
-
@.claude/rules/comentarios.md
|
|
247
|
-
````
|
|
248
|
-
|
|
249
|
-
Se o `CLAUDE.md` não existir na raiz, avise que ele será **criado** só com esse bloco — e confirme se é isso
|
|
250
|
-
que o usuário quer, ou se prefere rodar antes o `/gerar-claude-md`.
|
|
251
|
-
|
|
252
|
-
## Passo 3 — Rascunhar o hook (sem gravar ainda)
|
|
253
|
-
|
|
254
|
-
Conteúdo de `.claude/hooks/comentarios/check.mjs`:
|
|
255
|
-
|
|
256
|
-
```js
|
|
257
|
-
#!/usr/bin/env node
|
|
258
|
-
import { readFileSync, writeFileSync, existsSync, readdirSync, mkdirSync } from 'node:fs';
|
|
259
|
-
import { extname, relative, join, dirname } from 'node:path';
|
|
260
|
-
|
|
261
|
-
const MAX_BLOCO = Number(process.env.COMENTARIOS_MAX_BLOCO ?? 3);
|
|
262
|
-
const MAX_DOCSTRING = Number(process.env.COMENTARIOS_MAX_DOCSTRING ?? 5);
|
|
263
|
-
const DENSIDADE_ALVO = 0.1;
|
|
264
|
-
|
|
265
|
-
const EXTENSOES = new Set([
|
|
266
|
-
'.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs',
|
|
267
|
-
'.py', '.go', '.rs', '.java', '.cs', '.php',
|
|
268
|
-
'.pas', '.dpr', '.sql', '.sh',
|
|
269
|
-
]);
|
|
270
|
-
|
|
271
|
-
const IGNORAR = [
|
|
272
|
-
/node_modules/,
|
|
273
|
-
/[\\/]\.git[\\/]/,
|
|
274
|
-
/[\\/](dist|build|coverage|out|\.next|\.nuxt|vendor|migrations|generated|__generated__)[\\/]/,
|
|
275
|
-
/\.d\.ts$/,
|
|
276
|
-
/\.(test|spec)\.[jt]sx?$/,
|
|
277
|
-
];
|
|
278
|
-
|
|
279
|
-
const CABECALHO_PERMITIDO =
|
|
280
|
-
/eslint|ts-nocheck|ts-ignore|prettier|@license|copyright|spdx|jshint|globals|^#!|use (strict|client|server)/i;
|
|
281
|
-
|
|
282
|
-
const BANNER = /^[-=─-╿_*#~+]{3,}|[-=─-╿_*#~+]{3,}$/;
|
|
283
|
-
|
|
284
|
-
const RASTREIO = [
|
|
285
|
-
[/\b(task|tarefa|fase|etapa|plano|spec|sprint|epico|épico)\s*[\dIVX]/i, 'referência a task/fase/plano/spec'],
|
|
286
|
-
[/\bT\d+(\.\d+)+\b/, 'referência a task (T0.0)'],
|
|
287
|
-
[/docs\/(plans|specs|bugs|investigacoes)\//i, 'caminho de docs/ dentro do código'],
|
|
288
|
-
[/\bachado d[oe]\b/i, 'achado de review no código'],
|
|
289
|
-
[/@[\w-]*(reviewer|auditor|orquestrador|agent)\b/i, 'menção a agent no código'],
|
|
290
|
-
[/\b(commit|sha|hash)\s+[0-9a-f]{7,40}\b/i, 'hash de commit'],
|
|
291
|
-
];
|
|
292
|
-
|
|
293
|
-
const DATA = /(^|[^"'\w])20\d{2}-\d{2}-\d{2}([^"'\w]|$)/;
|
|
294
|
-
const CODIGO_TOKEN = /(^|\s)(const|let|var|function|return|if|for|while|await|import|export|def|class)\b/;
|
|
295
|
-
const CODIGO_FIM = /[;{}]\s*$/;
|
|
296
|
-
|
|
297
|
-
function comentario(linha, ext) {
|
|
298
|
-
const t = linha.trim();
|
|
299
|
-
if (!t) return null;
|
|
300
|
-
if (ext === '.py' || ext === '.sh') return t.startsWith('#') ? t.replace(/^#+/, '').trim() : null;
|
|
301
|
-
if (ext === '.sql') {
|
|
302
|
-
if (t.startsWith('--')) return t.replace(/^-+/, '').trim();
|
|
303
|
-
if (t.startsWith('/*') || t.startsWith('*')) return t.replace(/^[/*]+/, '').trim();
|
|
304
|
-
return null;
|
|
305
|
-
}
|
|
306
|
-
if (ext === '.pas' || ext === '.dpr') {
|
|
307
|
-
if (t.startsWith('//')) return t.replace(/^\/+/, '').trim();
|
|
308
|
-
if (t.startsWith('(*')) return t.replace(/^\(\*/, '').trim();
|
|
309
|
-
if (t.startsWith('{') && !t.startsWith('{$')) return t.replace(/^\{/, '').trim();
|
|
310
|
-
return null;
|
|
311
|
-
}
|
|
312
|
-
if (t.startsWith('//')) return t.replace(/^\/+/, '').trim();
|
|
313
|
-
if (t.startsWith('/*')) return t.replace(/^\/\*+/, '').trim();
|
|
314
|
-
if (t.startsWith('*')) return t.replace(/^\*+\/?/, '').trim();
|
|
315
|
-
return null;
|
|
316
|
-
}
|
|
317
|
-
|
|
318
|
-
function analisar(caminho, fonte) {
|
|
319
|
-
const ext = extname(caminho);
|
|
320
|
-
const linhas = fonte.split('\n');
|
|
321
|
-
const achados = [];
|
|
322
|
-
const marca = (linha, msg) => achados.push({ linha, msg });
|
|
323
|
-
const ehComentario = linhas.map((l) => comentario(l, ext));
|
|
324
|
-
|
|
325
|
-
let primeiroCodigo = -1;
|
|
326
|
-
for (let i = 0; i < linhas.length; i++) {
|
|
327
|
-
if (ehComentario[i] === null && linhas[i].trim()) { primeiroCodigo = i; break; }
|
|
328
|
-
}
|
|
329
|
-
|
|
330
|
-
let i = 0;
|
|
331
|
-
while (i < linhas.length) {
|
|
332
|
-
if (ehComentario[i] === null) { i++; continue; }
|
|
333
|
-
const inicio = i;
|
|
334
|
-
const conteudo = [];
|
|
335
|
-
while (i < linhas.length && ehComentario[i] !== null) { conteudo.push(ehComentario[i]); i++; }
|
|
336
|
-
const fim = i - 1;
|
|
337
|
-
const corpo = conteudo.filter(Boolean);
|
|
338
|
-
const texto = corpo.join(' ');
|
|
339
|
-
|
|
340
|
-
for (let k = 0; k < conteudo.length; k++) {
|
|
341
|
-
if (conteudo[k] && BANNER.test(conteudo[k])) {
|
|
342
|
-
marca(inicio + k + 1, 'separador/banner decorativo — divida o arquivo em vez de decorá-lo');
|
|
343
|
-
break;
|
|
344
|
-
}
|
|
345
|
-
}
|
|
346
|
-
for (const [re, motivo] of RASTREIO) {
|
|
347
|
-
if (re.test(texto)) { marca(inicio + 1, `${motivo} — isso mora no commit ou em docs/, não no código`); break; }
|
|
348
|
-
}
|
|
349
|
-
if (DATA.test(texto)) marca(inicio + 1, 'data de mudança no comentário — o git já registra isso');
|
|
350
|
-
for (let k = 0; k < conteudo.length; k++) {
|
|
351
|
-
if (conteudo[k] && CODIGO_TOKEN.test(conteudo[k]) && CODIGO_FIM.test(conteudo[k])) {
|
|
352
|
-
marca(inicio + k + 1, 'código comentado — apague, o git guarda');
|
|
353
|
-
break;
|
|
354
|
-
}
|
|
355
|
-
}
|
|
356
|
-
|
|
357
|
-
let proxima = fim + 1;
|
|
358
|
-
while (proxima < linhas.length && !linhas[proxima].trim()) proxima++;
|
|
359
|
-
const ehDocstring =
|
|
360
|
-
/^(\/\*\*|"""|'''|\/\/\/)/.test(linhas[inicio].trim()) &&
|
|
361
|
-
proxima < linhas.length &&
|
|
362
|
-
ehComentario[proxima] === null;
|
|
363
|
-
const teto = ehDocstring ? MAX_DOCSTRING : MAX_BLOCO;
|
|
364
|
-
if (corpo.length > teto) {
|
|
365
|
-
marca(inicio + 1, `bloco de ${corpo.length} linhas (teto ${teto}) — mova o rationale para o commit ou docs/`);
|
|
366
|
-
}
|
|
367
|
-
|
|
368
|
-
// `ehDocstring` exclui o caso do primeiro símbolo do arquivo já vir documentado:
|
|
369
|
-
// isso é docstring do símbolo, não cabeçalho.
|
|
370
|
-
if (primeiroCodigo !== -1 && inicio < primeiroCodigo && !ehDocstring && !CABECALHO_PERMITIDO.test(texto)) {
|
|
371
|
-
marca(inicio + 1, 'cabeçalho de arquivo — proibido; o nome do arquivo e os exports já dizem o que ele é');
|
|
372
|
-
}
|
|
373
|
-
}
|
|
374
|
-
|
|
375
|
-
const comentadas = ehComentario.filter((c) => c !== null).length;
|
|
376
|
-
const uteis = linhas.filter((l) => l.trim()).length;
|
|
377
|
-
return { achados, comentadas, uteis, densidade: uteis ? comentadas / uteis : 0 };
|
|
378
|
-
}
|
|
379
|
-
|
|
380
|
-
function elegivel(caminho) {
|
|
381
|
-
return EXTENSOES.has(extname(caminho)) && !IGNORAR.some((re) => re.test(caminho));
|
|
382
|
-
}
|
|
383
|
-
|
|
384
|
-
const raiz = process.env.CLAUDE_PROJECT_DIR || process.cwd();
|
|
385
|
-
const BASELINE = join(raiz, '.claude', 'hooks', 'comentarios', 'baseline.json');
|
|
386
|
-
|
|
387
|
-
function varrer(dir, saida = []) {
|
|
388
|
-
let itens;
|
|
389
|
-
try { itens = readdirSync(dir, { withFileTypes: true }); } catch { return saida; }
|
|
390
|
-
for (const item of itens) {
|
|
391
|
-
const cheio = join(dir, item.name);
|
|
392
|
-
if (item.isDirectory()) {
|
|
393
|
-
if (item.name === 'node_modules' || item.name === '.git') continue;
|
|
394
|
-
if (IGNORAR.some((re) => re.test(`${cheio}/`))) continue;
|
|
395
|
-
varrer(cheio, saida);
|
|
396
|
-
} else if (elegivel(cheio)) saida.push(cheio);
|
|
397
|
-
}
|
|
398
|
-
return saida;
|
|
399
|
-
}
|
|
400
|
-
|
|
401
|
-
if (process.argv.includes('--gerar-baseline')) {
|
|
402
|
-
const mapa = {};
|
|
403
|
-
let arquivos = 0;
|
|
404
|
-
let violacoes = 0;
|
|
405
|
-
for (const f of varrer(raiz)) {
|
|
406
|
-
let fonte;
|
|
407
|
-
try { fonte = readFileSync(f, 'utf8'); } catch { continue; }
|
|
408
|
-
const { achados } = analisar(f, fonte);
|
|
409
|
-
if (achados.length > 0) { mapa[relative(raiz, f)] = achados.length; arquivos++; violacoes += achados.length; }
|
|
410
|
-
}
|
|
411
|
-
if (!existsSync(dirname(BASELINE))) mkdirSync(dirname(BASELINE), { recursive: true });
|
|
412
|
-
writeFileSync(BASELINE, `${JSON.stringify(mapa, null, 2)}\n`);
|
|
413
|
-
console.log(`[comentarios] baseline gravado: ${arquivos} arquivos legados, ${violacoes} violações toleradas.`);
|
|
414
|
-
console.log('[comentarios] arquivo novo responde ao padrão cheio; legado só não pode piorar.');
|
|
415
|
-
process.exit(0);
|
|
416
|
-
}
|
|
417
|
-
|
|
418
|
-
if (process.env.COMENTARIOS_CHECK === 'off') process.exit(0);
|
|
419
|
-
|
|
420
|
-
let payload = null;
|
|
421
|
-
try { payload = JSON.parse(readFileSync(0, 'utf8')); } catch { process.exit(0); }
|
|
422
|
-
const caminho = payload?.tool_input?.file_path;
|
|
423
|
-
if (!caminho || !elegivel(caminho)) process.exit(0);
|
|
424
|
-
|
|
425
|
-
let fonte;
|
|
426
|
-
try { fonte = readFileSync(caminho, 'utf8'); } catch { process.exit(0); }
|
|
427
|
-
|
|
428
|
-
const { achados, comentadas, uteis, densidade } = analisar(caminho, fonte);
|
|
429
|
-
const chave = relative(raiz, caminho);
|
|
430
|
-
const rel = !chave || chave.startsWith('..') ? caminho : chave;
|
|
431
|
-
|
|
432
|
-
let baseline = null;
|
|
433
|
-
try { baseline = JSON.parse(readFileSync(BASELINE, 'utf8')); } catch {}
|
|
434
|
-
const tolerado = baseline?.[chave] ?? 0;
|
|
435
|
-
|
|
436
|
-
if (achados.length <= tolerado) {
|
|
437
|
-
if (baseline && tolerado > 0 && achados.length < tolerado) {
|
|
438
|
-
if (achados.length === 0) delete baseline[chave];
|
|
439
|
-
else baseline[chave] = achados.length;
|
|
440
|
-
try { writeFileSync(BASELINE, `${JSON.stringify(baseline, null, 2)}\n`); } catch {}
|
|
441
|
-
console.error(`[comentarios] ${rel}: ${tolerado} → ${achados.length} violações. Catraca desceu — não pode mais subir.`);
|
|
442
|
-
} else if (achados.length === 0 && densidade > DENSIDADE_ALVO) {
|
|
443
|
-
console.error(`[comentarios] aviso: ${rel} tem ${(densidade * 100).toFixed(0)}% de linhas de comentário (${comentadas}/${uteis}), alvo <= ${DENSIDADE_ALVO * 100}%.`);
|
|
444
|
-
}
|
|
445
|
-
process.exit(0);
|
|
446
|
-
}
|
|
447
|
-
|
|
448
|
-
const lista = achados.sort((a, b) => a.linha - b.linha).map((a) => ` ${rel}:${a.linha} ${a.msg}`);
|
|
449
|
-
const contexto =
|
|
450
|
-
tolerado > 0
|
|
451
|
-
? `Este arquivo é legado: a baseline tolera ${tolerado} violação(ões) e agora há ${achados.length}. Não é preciso limpar o arquivo inteiro — basta não piorá-lo.`
|
|
452
|
-
: 'Este arquivo não tem tolerância na baseline: vale o padrão cheio.';
|
|
453
|
-
|
|
454
|
-
console.error(
|
|
455
|
-
[
|
|
456
|
-
`[comentarios] ${rel} viola a rule .claude/rules/comentarios.md:`,
|
|
457
|
-
'',
|
|
458
|
-
...lista,
|
|
459
|
-
'',
|
|
460
|
-
contexto,
|
|
461
|
-
'Tetos: bloco interno <= 3 linhas, docstring pública <= 5, cabeçalho de arquivo proibido.',
|
|
462
|
-
'Task/plano/data/achado de review e rationale longo vão para a mensagem de commit ou docs/ — nunca para o código.',
|
|
463
|
-
'Corrija no próprio arquivo antes de continuar a task.',
|
|
464
|
-
].join('\n'),
|
|
465
|
-
);
|
|
466
|
-
process.exit(2);
|
|
467
|
-
```
|
|
468
|
-
|
|
469
|
-
E o registro em `.claude/settings.json` (**merge**, preservando o que já existir):
|
|
470
|
-
|
|
471
|
-
```json
|
|
472
|
-
{
|
|
473
|
-
"hooks": {
|
|
474
|
-
"PostToolUse": [
|
|
475
|
-
{
|
|
476
|
-
"matcher": "Write|Edit|MultiEdit",
|
|
477
|
-
"hooks": [
|
|
478
|
-
{ "type": "command", "command": "node \"${CLAUDE_PROJECT_DIR}/.claude/hooks/comentarios/check.mjs\"" }
|
|
479
|
-
]
|
|
480
|
-
}
|
|
481
|
-
]
|
|
482
|
-
}
|
|
483
|
-
}
|
|
484
|
-
```
|
|
485
|
-
|
|
486
|
-
## Passo 4 — 🚦 GATE de aprovação (obrigatório)
|
|
487
|
-
|
|
488
|
-
Antes de escrever qualquer arquivo, mostre ao usuário:
|
|
489
|
-
|
|
490
|
-
- os **caminhos exatos** que serão tocados (rule, `CLAUDE.md`, hook, `settings.json`);
|
|
491
|
-
- o **conteúdo completo** da rule e do bloco do `CLAUDE.md`;
|
|
492
|
-
- o `settings.json` **resultante do merge** (não só o trecho novo), se o arquivo já existia;
|
|
493
|
-
- o que **já existia** (portanto é atualização, não criação).
|
|
494
|
-
|
|
495
|
-
**Peça aprovação explícita.** Não grave nada sem o "ok".
|
|
496
|
-
|
|
497
|
-
## Passo 5 — Gravar os artefatos (somente após aprovação)
|
|
498
|
-
|
|
499
|
-
1. `.claude/rules/comentarios.md` (criando `.claude/rules/` se necessário).
|
|
500
|
-
2. Bloco "Comentários em código" no `CLAUDE.md`, **após "Padrões de código"** — sem duplicar: se já houver
|
|
501
|
-
um bloco equivalente (inclusive o formato antigo, que terminava em `Ver detalhes em ...`), **substitua-o
|
|
502
|
-
no lugar**.
|
|
503
|
-
3. `.claude/hooks/comentarios/check.mjs`.
|
|
504
|
-
4. `.claude/settings.json` — **merge**: se já existir `hooks.PostToolUse`, acrescente uma entrada ao array
|
|
505
|
-
em vez de substituí-lo; se já houver uma entrada para este mesmo `check.mjs`, não duplique.
|
|
506
|
-
|
|
507
|
-
## Passo 6 — Gerar a catraca do legado (obrigatório)
|
|
508
|
-
|
|
509
|
-
Rode, a partir da raiz do projeto:
|
|
510
|
-
|
|
511
|
-
```bash
|
|
512
|
-
CLAUDE_PROJECT_DIR="$PWD" node .claude/hooks/comentarios/check.mjs --gerar-baseline
|
|
513
|
-
```
|
|
514
|
-
|
|
515
|
-
Isso grava `.claude/hooks/comentarios/baseline.json` com a contagem de violações por arquivo **no estado
|
|
516
|
-
atual**. A partir daí:
|
|
517
|
-
|
|
518
|
-
- **arquivo novo ou já limpo** → padrão cheio, qualquer violação bloqueia;
|
|
519
|
-
- **arquivo legado** → só bloqueia se o número **subir**;
|
|
520
|
-
- **arquivo legado que melhora** → a catraca desce sozinha e não volta.
|
|
521
|
-
|
|
522
|
-
Informe ao usuário quantos arquivos entraram na catraca. Se forem muitos, deixe claro que **não é dívida a
|
|
523
|
-
pagar de uma vez** — o legado se limpa por contato.
|
|
524
|
-
|
|
525
|
-
> Sem este passo o hook cobraria o padrão cheio de todo o código existente e travaria o projeto. Não pule.
|
|
526
|
-
|
|
527
|
-
## Passo 7 — Finalizar (sem commit)
|
|
528
|
-
|
|
529
|
-
- **Não** rode `git add/commit/push`. Deixe tudo no working tree e informe o usuário.
|
|
530
|
-
- Sugira comitar para que outros clones já venham configurados — por exemplo
|
|
531
|
-
`chore: Configura padrão de comentários (rule + hook + catraca)`.
|
|
532
|
-
- Lembre que `baseline.json` **deve ser versionado**: é o contrato do que é legado.
|
|
533
|
-
|
|
534
|
-
## Guardrails
|
|
535
|
-
|
|
536
|
-
- **NUNCA** gravar antes do GATE; **NUNCA** commitar ou dar push por conta própria.
|
|
537
|
-
- **NUNCA** pular o Passo 6 — hook sem catraca trava o projeto inteiro.
|
|
538
|
-
- **Escopo projeto apenas**: não tocar em `~/.claude` nem em configuração global da máquina.
|
|
539
|
-
- **Idempotência**: não duplicar a rule, o bloco do `CLAUDE.md`, o hook nem a entrada no `settings.json`.
|
|
540
|
-
- **Merge, não sobrescrita**, em `CLAUDE.md` e `settings.json` — outros hooks já registrados devem continuar
|
|
541
|
-
funcionando.
|
|
542
|
-
- **Não** editar código-fonte do projeto neste comando — ele instala o padrão, não faz a limpeza.
|
|
543
|
-
- Conteúdo em **pt-BR**.
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
description: Configura o agente orquestrador de sub-agents, persistindo a orientação no CLAUDE.md.
|
|
3
|
-
---
|
|
4
|
-
|
|
5
|
-
# Configuração do orquestrador de agentes
|
|
6
|
-
|
|
7
|
-
Configure-se para ser um **agente orquestrador de subagentes**.
|
|
8
|
-
|
|
9
|
-
- Salve esta orientação no `CLAUDE.md` (ou em outro arquivo que será lido e entendido em toda nova sessão), para que o comportamento persista.
|
|
10
|
-
- Você irá **delegar** o trabalho para os outros agentes do projeto, em vez de implementar diretamente.
|
|
11
|
-
- Oriente o agente orquestrador **e todos os outros agentes** a sempre relatar no chat qual agente está sendo usado no momento — principalmente quando fizerem gates entre eles.
|
|
12
|
-
|
|
13
|
-
Ao terminar, mostre o trecho exato que foi adicionado ao `CLAUDE.md`.
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
description: Organiza as correções do code-review em sprints/fases/tasks com TDD e delega ao orquestrador.
|
|
3
|
-
---
|
|
4
|
-
|
|
5
|
-
# Execução de correções levantadas pelo code-review
|
|
6
|
-
|
|
7
|
-
Vamos realizar as correções necessárias. Organize-as em **Sprints, Fases e Tasks**, com critérios de aceite em cada uma e **testes (TDD) obrigatórios** para cada implementação e correção, de modo que esses tipos de problema não voltem a ocorrer. O que por ventura não estiver mapeado nas nossas rules, incremente também (`.claude/rules/`).
|
|
8
|
-
|
|
9
|
-
Grave o(s) arquivo(s) de Sprint na convenção do projeto: `docs/plans/AAAA-MM-DD-correcoes-breve-descricao.md` (e, se fizer sentido, a spec correspondente em `docs/specs/`).
|
|
10
|
-
|
|
11
|
-
Após a criação dos arquivos das Sprints, **chame o Agente Orquestrador** (`/executar-plan`) para delegar as implementações utilizando sub-agents em paralelo.
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
description: Cria agents especializados em .claude/agents/ a partir do plano, SPEC e CLAUDE.md.
|
|
3
|
-
---
|
|
4
|
-
|
|
5
|
-
# Criação dos agents do projeto
|
|
6
|
-
|
|
7
|
-
Leia o `CLAUDE.md` e o `SPEC.md` na raiz e o **plano mais recente em `docs/plans/`**.
|
|
8
|
-
|
|
9
|
-
Com base nos módulos e tasks definidos, crie os **agents especializados** para este projeto.
|
|
10
|
-
|
|
11
|
-
Para cada agent, defina:
|
|
12
|
-
1. Nome e descrição clara de quando usar
|
|
13
|
-
2. Tools necessárias — apenas o mínimo para a task (não dê `Write` se o agent só precisa de `Read`)
|
|
14
|
-
3. Model adequado — **Haiku** para tasks simples, **Sonnet** para implementação, **Opus** para arquitetura
|
|
15
|
-
4. Skills do projeto que o agent deve carregar
|
|
16
|
-
5. System prompt com:
|
|
17
|
-
- Papel e responsabilidades
|
|
18
|
-
- Restrições explícitas (o que nunca fazer)
|
|
19
|
-
- Padrões do projeto que deve seguir
|
|
20
|
-
|
|
21
|
-
**Obrigatório em todo agent que escreve código** (implementação, testes, refactor, design system): incluir
|
|
22
|
-
no system prompt, literalmente, o bloco abaixo. Rule referenciada só por caminho não é lida — precisa estar
|
|
23
|
-
no prompt.
|
|
24
|
-
|
|
25
|
-
```markdown
|
|
26
|
-
## Comentários
|
|
27
|
-
|
|
28
|
-
@.claude/rules/comentarios.md
|
|
29
|
-
|
|
30
|
-
O padrão é **não comentar**. Orçamento: bloco interno <= 3 linhas · docstring pública <= 5 · cabeçalho de
|
|
31
|
-
arquivo proibido · densidade <= 10%.
|
|
32
|
-
Nunca colocar no código: banner/separador de seção, task/fase/plano/spec, data, hash de commit, achado de
|
|
33
|
-
review, narração do passo a passo, código comentado.
|
|
34
|
-
Isso mora na mensagem de commit e em `docs/` — nunca em comentário.
|
|
35
|
-
```
|
|
36
|
-
|
|
37
|
-
> Este ponto é onde o padrão falhou antes: os agents eram instruídos a rastrear plano/SPEC/task e
|
|
38
|
-
> despejavam essa rastreabilidade em comentário, porque nada dizia **onde** ela deveria morar.
|
|
39
|
-
|
|
40
|
-
Crie os arquivos em `.claude/agents/`.
|
|
41
|
-
|
|
42
|
-
Ao terminar, mostre como invocar cada agent manualmente e como o agent primário (orquestrador) pode delegar para eles automaticamente.
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
description: Cria o agent code-reviewer (somente leitura) em .claude/agents/code-reviewer.md.
|
|
3
|
-
---
|
|
4
|
-
|
|
5
|
-
# Criação do code-reviewer
|
|
6
|
-
|
|
7
|
-
Leia o `CLAUDE.md` e o `SPEC.md` na raiz do projeto.
|
|
8
|
-
|
|
9
|
-
Crie um agent de review em `.claude/agents/code-reviewer.md` com:
|
|
10
|
-
|
|
11
|
-
- **Somente ferramentas de leitura** — nunca escrita ou execução.
|
|
12
|
-
- System prompt focado em revisar contra o `SPEC.md` e o plano mais recente em `docs/plans/`.
|
|
13
|
-
- Hook que **bloqueia** qualquer tentativa de modificar arquivos (`PreToolUse` bloqueando `Write`/`Edit`).
|
|
14
|
-
- Critérios de classificação: **BLOQUEANTE**, **IMPORTANTE**, **SUGESTÃO**.
|
|
15
|
-
|
|
16
|
-
Inclua no system prompt um **checklist explícito** do que revisar (sem isso o agent revisa o que lhe parecer
|
|
17
|
-
relevante e ignora o resto):
|
|
18
|
-
|
|
19
|
-
1. Correção — bugs, casos de borda, erros silenciados.
|
|
20
|
-
2. Aderência ao `SPEC.md` e ao plano em `docs/plans/`.
|
|
21
|
-
3. Testes — existem e cobrem o crítico da task?
|
|
22
|
-
4. Segurança e isolamento de dados (multi-tenant, autorização, segredos).
|
|
23
|
-
5. Rules do projeto em `.claude/rules/`.
|
|
24
|
-
6. **Comentários** — classificar como **IMPORTANTE** (nunca SUGESTÃO): bloco interno acima de 3 linhas,
|
|
25
|
-
docstring pública acima de 5, cabeçalho de arquivo, banner/separador de seção, task/fase/plano/data/hash
|
|
26
|
-
de commit/achado de review dentro do código, narração do passo a passo, código comentado.
|
|
27
|
-
Ver `.claude/rules/comentarios.md`.
|
|
28
|
-
7. Legibilidade e simplicidade.
|
|
29
|
-
|
|
30
|
-
O agent não deve corrigir nada — apenas identificar e reportar problemas.
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
description: Cria hooks por agent em .claude/hooks/ conforme o escopo (leitura, implementação, QA).
|
|
3
|
-
---
|
|
4
|
-
|
|
5
|
-
# Geração de hooks para os agents
|
|
6
|
-
|
|
7
|
-
Leia os agents criados em `.claude/agents/` e o **plano mais recente em `docs/plans/`**.
|
|
8
|
-
|
|
9
|
-
Para cada agent, crie os hooks específicos que façam sentido para o seu domínio e escopo. Siga estas regras por tipo de agent:
|
|
10
|
-
|
|
11
|
-
**AGENT SOMENTE LEITURA (revisor, auditor):**
|
|
12
|
-
- `PreToolUse` que bloqueia `Write`, `Edit` e `Bash` com mensagem clara de por que está bloqueando.
|
|
13
|
-
|
|
14
|
-
**AGENT DE IMPLEMENTAÇÃO (backend, frontend, parser):**
|
|
15
|
-
- `PostToolUse` que roda os testes do módulo após qualquer edição de arquivo.
|
|
16
|
-
- `PreToolUse` que bloqueia comandos fora do escopo (ex: backend não faz `git push`, parser não acessa banco de dados).
|
|
17
|
-
- `Stop` que verifica se os testes passam antes de encerrar.
|
|
18
|
-
|
|
19
|
-
**AGENT DE QA/TESTES:**
|
|
20
|
-
- `PreToolUse` que permite apenas comandos de execução de testes (`pytest`, `vitest`, `jest`) e bloqueia qualquer outra coisa.
|
|
21
|
-
|
|
22
|
-
**Hook já existente — não recrie nem remova:** se `.claude/hooks/comentarios/check.mjs` existir, ele é do
|
|
23
|
-
`/configurar-comentarios` (valida comentários no `PostToolUse` de `Write|Edit`, com catraca em
|
|
24
|
-
`baseline.json`). Preserve-o e preserve o registro dele no `.claude/settings.json` ao fazer merge dos
|
|
25
|
-
hooks novos.
|
|
26
|
-
|
|
27
|
-
Para o Claude Code:
|
|
28
|
-
- Adicione a seção `hooks` no frontmatter de cada arquivo em `.claude/agents/`.
|
|
29
|
-
- Crie os scripts em `.claude/hooks/nome-do-agent/`.
|
|
30
|
-
- Scripts devem usar `exit 2` para bloquear e `exit 0` para permitir.
|
|
31
|
-
|
|
32
|
-
Ao terminar, demonstre um caso de uso real: um agent tentando fazer algo fora do seu escopo e sendo bloqueado pelo hook.
|