@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.
Files changed (131) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +9 -2
  3. package/LICENSE +21 -0
  4. package/README.md +174 -140
  5. package/{src → dist}/catalog.js +5 -12
  6. package/dist/cli.js +174 -0
  7. package/dist/comentarios/command.js +74 -0
  8. package/dist/comentarios/instalar.js +33 -0
  9. package/dist/config/config.js +98 -0
  10. package/dist/contratos/artefatos.js +284 -0
  11. package/dist/contratos/eventos.js +103 -0
  12. package/dist/doctor/checks.js +424 -0
  13. package/dist/init.js +240 -0
  14. package/dist/install/atomic.js +51 -0
  15. package/dist/install/flags.js +99 -0
  16. package/dist/install/hooks.js +47 -0
  17. package/dist/install/lock.js +39 -0
  18. package/dist/install/plan.js +209 -0
  19. package/dist/install/selection.js +77 -0
  20. package/dist/install/settings.js +108 -0
  21. package/dist/memoria/indice.js +195 -0
  22. package/dist/migrar/migrar.js +426 -0
  23. package/dist/rastro/command.js +46 -0
  24. package/dist/run.js +86 -0
  25. package/dist/types.js +1 -0
  26. package/dist/update/legado.js +74 -0
  27. package/dist/update/update.js +284 -0
  28. package/package.json +17 -8
  29. package/templates/CLAUDE.md +59 -30
  30. package/templates/agents/auditor-plano.md +42 -0
  31. package/templates/agents/investigador.md +32 -0
  32. package/templates/agents/qa.md +44 -0
  33. package/templates/agents/revisor-testes.md +40 -0
  34. package/templates/catalog.json +24 -61
  35. package/templates/commands/atualizar-deps.md +43 -9
  36. package/templates/commands/diagrama.md +35 -10
  37. package/templates/commands/gerar-env.md +39 -10
  38. package/templates/commands/gerar-testes.md +42 -10
  39. package/templates/commands/git-commit-push.md +0 -0
  40. package/templates/commands/onboarding.md +44 -15
  41. package/templates/commands/refatorar.md +50 -10
  42. package/templates/commands/revisar-pr.md +56 -12
  43. package/templates/commands/sincronizar-claude-md.md +177 -9
  44. package/templates/commands/versao.md +0 -0
  45. package/templates/hooks/comentarios/check.mjs +210 -0
  46. package/templates/hooks/hooks.json +34 -0
  47. package/templates/hooks/lembrete.mjs +29 -0
  48. package/templates/hooks/lib/config.mjs +40 -0
  49. package/templates/hooks/lib/hook.mjs +85 -0
  50. package/templates/hooks/lib/rastro.mjs +130 -0
  51. package/templates/hooks/lib/segredos.mjs +91 -0
  52. package/templates/hooks/lib/temas.mjs +111 -0
  53. package/templates/hooks/lib/trabalho.mjs +94 -0
  54. package/templates/hooks/proteger-contratos.mjs +56 -0
  55. package/templates/hooks/segredo-no-commit.mjs +76 -0
  56. package/templates/hooks/sem-jargao.mjs +58 -0
  57. package/templates/hooks/task-so-fecha-verde.mjs +33 -0
  58. package/templates/legado/manifesto.json +1267 -0
  59. package/templates/rules/comentarios.md +166 -0
  60. package/templates/rules/harness-projeto.md +41 -0
  61. package/templates/skills/auditar-performance/SKILL.md +53 -0
  62. package/templates/skills/auditar-performance/references/pontos-quentes.md +35 -0
  63. package/templates/skills/auditar-performance/templates/relatorios/CLIENTE.md +26 -0
  64. package/templates/skills/auditar-performance/templates/relatorios/TECNICO.md +27 -0
  65. package/templates/skills/auditar-seguranca/SKILL.md +67 -0
  66. package/templates/skills/auditar-seguranca/references/seguranca-tecnica.md +23 -0
  67. package/templates/skills/auditar-seguranca/templates/relatorios/CLIENTE.md +30 -0
  68. package/templates/skills/auditar-seguranca/templates/relatorios/TECNICO.md +38 -0
  69. package/templates/skills/auditar-ui/SKILL.md +64 -0
  70. package/templates/skills/auditar-ui/references/lentes.md +33 -0
  71. package/templates/skills/auditar-ui/templates/relatorios/CLIENTE.md +26 -0
  72. package/templates/skills/auditar-ui/templates/relatorios/TECNICO.md +31 -0
  73. package/templates/skills/evoluir-harness/SKILL.md +81 -0
  74. package/templates/skills/evoluir-harness/references/agent.md +83 -0
  75. package/templates/skills/evoluir-harness/references/auditoria.md +107 -0
  76. package/templates/skills/evoluir-harness/references/code-reviewer.md +68 -0
  77. package/templates/skills/evoluir-harness/references/design-system.md +56 -0
  78. package/templates/skills/evoluir-harness/references/hook.md +95 -0
  79. package/templates/skills/evoluir-harness/references/rule.md +67 -0
  80. package/templates/skills/evoluir-harness/references/skill.md +63 -0
  81. package/templates/skills/executar-plan/SKILL.md +114 -0
  82. package/templates/skills/executar-plan/references/delegacao.md +43 -0
  83. package/templates/skills/executar-plan/references/retomada.md +33 -0
  84. package/templates/skills/executar-plan/templates/BLOQUEIOS.md +30 -0
  85. package/templates/skills/harness/SKILL.md +75 -0
  86. package/templates/skills/harness/references/auto-tag.md +118 -0
  87. package/templates/skills/harness/references/ignores.md +40 -0
  88. package/templates/skills/harness/references/scaffold.md +29 -0
  89. package/templates/skills/harness/references/validar-ideia.md +42 -0
  90. package/templates/skills/memoria/SKILL.md +52 -0
  91. package/templates/skills/nova-tarefa/SKILL.md +97 -0
  92. package/templates/skills/nova-tarefa/references/isso-ja-existe.md +24 -0
  93. package/templates/skills/nova-tarefa/references/regras-do-plano.md +33 -0
  94. package/templates/skills/nova-tarefa/templates/DECISOES.md +20 -0
  95. package/templates/skills/nova-tarefa/templates/PLAN.md +58 -0
  96. package/templates/skills/nova-tarefa/templates/SPEC.md +37 -0
  97. package/templates/skills/resolver-bug/SKILL.md +104 -0
  98. package/templates/skills/resolver-bug/references/relatorio-para-cliente.md +26 -0
  99. package/templates/skills/resolver-bug/templates/PLAN.md +62 -0
  100. package/templates/skills/resolver-bug/templates/relatorios/CLIENTE.md +29 -0
  101. package/templates/skills/resolver-bug/templates/relatorios/TECNICO.md +32 -0
  102. package/bin/cli.js +0 -122
  103. package/src/init.js +0 -317
  104. package/src/installer.js +0 -92
  105. package/src/run.js +0 -99
  106. package/templates/commands/auditar-performance.md +0 -27
  107. package/templates/commands/auditar-seguranca.md +0 -64
  108. package/templates/commands/auditar-ui.md +0 -38
  109. package/templates/commands/codigo-morto.md +0 -22
  110. package/templates/commands/configurar-auto-tag.md +0 -185
  111. package/templates/commands/configurar-comentarios.md +0 -543
  112. package/templates/commands/configurar-orquestrador.md +0 -13
  113. package/templates/commands/corrigir-review.md +0 -11
  114. package/templates/commands/criar-agents.md +0 -42
  115. package/templates/commands/criar-code-reviewer.md +0 -30
  116. package/templates/commands/criar-hooks.md +0 -32
  117. package/templates/commands/criar-rag.md +0 -25
  118. package/templates/commands/criar-rules.md +0 -31
  119. package/templates/commands/criar-skill.md +0 -22
  120. package/templates/commands/design-system.md +0 -27
  121. package/templates/commands/executar-plan.md +0 -36
  122. package/templates/commands/gerar-claude-md.md +0 -66
  123. package/templates/commands/gerar-ignore.md +0 -37
  124. package/templates/commands/gerar-spec.md +0 -33
  125. package/templates/commands/harness.md +0 -34
  126. package/templates/commands/nova-tarefa.md +0 -60
  127. package/templates/commands/resolver-bug.md +0 -25
  128. package/templates/commands/review-por-task.md +0 -16
  129. package/templates/commands/scaffold.md +0 -25
  130. package/templates/commands/validar-commands.md +0 -24
  131. 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.