@fontdata/ai-harness 2.0.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 (52) hide show
  1. package/.claude-plugin/marketplace.json +17 -0
  2. package/.claude-plugin/plugin.json +8 -0
  3. package/README.md +239 -0
  4. package/bin/cli.js +122 -0
  5. package/package.json +44 -0
  6. package/src/catalog.js +26 -0
  7. package/src/init.js +317 -0
  8. package/src/installer.js +92 -0
  9. package/src/run.js +99 -0
  10. package/templates/CLAUDE.md +49 -0
  11. package/templates/catalog.json +124 -0
  12. package/templates/commands/atualizar-deps.md +15 -0
  13. package/templates/commands/auditar-performance.md +27 -0
  14. package/templates/commands/auditar-seguranca.md +64 -0
  15. package/templates/commands/auditar-ui.md +38 -0
  16. package/templates/commands/codigo-morto.md +22 -0
  17. package/templates/commands/configurar-auto-tag.md +185 -0
  18. package/templates/commands/configurar-comentarios.md +543 -0
  19. package/templates/commands/configurar-orquestrador.md +13 -0
  20. package/templates/commands/corrigir-review.md +11 -0
  21. package/templates/commands/criar-agents.md +42 -0
  22. package/templates/commands/criar-code-reviewer.md +30 -0
  23. package/templates/commands/criar-hooks.md +32 -0
  24. package/templates/commands/criar-rag.md +25 -0
  25. package/templates/commands/criar-rules.md +31 -0
  26. package/templates/commands/criar-skill.md +22 -0
  27. package/templates/commands/design-system.md +27 -0
  28. package/templates/commands/diagrama.md +17 -0
  29. package/templates/commands/executar-plan.md +36 -0
  30. package/templates/commands/gerar-claude-md.md +66 -0
  31. package/templates/commands/gerar-env.md +16 -0
  32. package/templates/commands/gerar-ignore.md +37 -0
  33. package/templates/commands/gerar-spec.md +33 -0
  34. package/templates/commands/gerar-testes.md +17 -0
  35. package/templates/commands/git-commit-push.md +38 -0
  36. package/templates/commands/harness.md +34 -0
  37. package/templates/commands/nova-tarefa.md +60 -0
  38. package/templates/commands/onboarding.md +21 -0
  39. package/templates/commands/refatorar.md +17 -0
  40. package/templates/commands/resolver-bug.md +25 -0
  41. package/templates/commands/review-por-task.md +16 -0
  42. package/templates/commands/revisar-pr.md +18 -0
  43. package/templates/commands/scaffold.md +25 -0
  44. package/templates/commands/sincronizar-claude-md.md +15 -0
  45. package/templates/commands/validar-commands.md +24 -0
  46. package/templates/commands/validar-ideia.md +36 -0
  47. package/templates/commands/versao.md +159 -0
  48. package/templates/skills/lgpd-checker/ORIGEM.md +21 -0
  49. package/templates/skills/lgpd-checker/SKILL.md +152 -0
  50. package/templates/skills/lgpd-checker/references/checklist.md +155 -0
  51. package/templates/skills/lgpd-checker/references/lgpd-artigos.md +178 -0
  52. package/templates/skills/lgpd-checker/references/report-template.md +117 -0
@@ -0,0 +1,17 @@
1
+ {
2
+ "name": "ai-harness",
3
+ "owner": {
4
+ "name": "Fontdata Tecnologia",
5
+ "url": "https://github.com/fontdata-tecnologia"
6
+ },
7
+ "metadata": {
8
+ "description": "Harness de engenharia com IA da Fontdata para Claude Code."
9
+ },
10
+ "plugins": [
11
+ {
12
+ "name": "fontdata",
13
+ "source": "./",
14
+ "description": "36 slash commands para conduzir spec, scaffold, harness, revisão e manutenção de projetos com Claude Code."
15
+ }
16
+ ]
17
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "name": "fontdata",
3
+ "version": "2.0.0",
4
+ "description": "Harness de engenharia com IA da Fontdata para Claude Code",
5
+ "author": { "name": "Fontdata" },
6
+ "commands": ["./templates/commands"],
7
+ "skills": ["./templates/skills"]
8
+ }
package/README.md ADDED
@@ -0,0 +1,239 @@
1
+ # @fontdata/ai-harness
2
+
3
+ O **harness de engenharia com IA da Fontdata** (slash commands do Claude Code) para qualquer projeto — novo ou existente. Você pode **rodar os comandos direto na pasta do projeto, sem instalar nada**, ou instalá-los em `.claude/commands/` quando quiser versioná-los junto com o código.
4
+
5
+ > Foco exclusivo em **Claude Code**.
6
+
7
+ ## Modo 1 — rodar sem instalar (recomendado)
8
+
9
+ Na pasta do projeto, chame o comando pelo nome. O Claude Code abre já executando aquele prompt, e o pacote é carregado como plugin **só daquela sessão** — nenhum arquivo é escrito no repositório.
10
+
11
+ ```bash
12
+ # npm / npx
13
+ npx @fontdata/ai-harness harness
14
+ npx @fontdata/ai-harness resolver-bug "login 500 no refresh token"
15
+ npx @fontdata/ai-harness versao minor
16
+
17
+ # yarn
18
+ yarn dlx @fontdata/ai-harness harness
19
+
20
+ # pnpm
21
+ pnpm dlx @fontdata/ai-harness harness
22
+ ```
23
+
24
+ Durante a sessão, todos os 36 comandos ficam disponíveis com o prefixo do plugin — `/fontdata:gerar-spec`, `/fontdata:criar-agents` etc. — assim como a skill `lgpd-checker`. É isso que faz o `/harness`, que encadeia 14 comandos, funcionar sem instalação prévia.
25
+
26
+ O texto depois do nome do comando vira o `$ARGUMENTS` daquele prompt. Tudo depois de `--` é repassado ao Claude Code:
27
+
28
+ ```bash
29
+ npx @fontdata/ai-harness harness -- --model claude-opus-5
30
+ npx @fontdata/ai-harness auditar-seguranca -- -p # headless, para CI
31
+ ```
32
+
33
+ Use `run <comando>` quando o nome puder colidir com uma palavra reservada do CLI:
34
+
35
+ ```bash
36
+ npx @fontdata/ai-harness run git-commit-push
37
+ ```
38
+
39
+ **Requisito:** o [Claude Code](https://claude.com/claude-code) precisa estar no `PATH` (`npm i -g @anthropic-ai/claude-code`).
40
+
41
+ ## Modo 2 — instalar como plugin global
42
+
43
+ Se você usa os comandos com frequência e não quer o `npx` a cada vez, registre o marketplace uma vez:
44
+
45
+ ```bash
46
+ claude plugin marketplace add fontdata-tecnologia/ai-harness
47
+ claude plugin install fontdata@ai-harness
48
+ ```
49
+
50
+ Os comandos passam a existir em qualquer sessão do Claude Code como `/fontdata:<comando>`.
51
+
52
+ ## Modo 3 — instalar no projeto (`init`)
53
+
54
+ Quando você quer os comandos versionados junto com o repositório, em `.claude/commands/`:
55
+
56
+ ```bash
57
+ # npm / npx
58
+ npx @fontdata/ai-harness init
59
+
60
+ # yarn
61
+ yarn dlx @fontdata/ai-harness init
62
+
63
+ # pnpm
64
+ pnpm dlx @fontdata/ai-harness init
65
+ ```
66
+
67
+ Ou instale o CLI globalmente uma vez:
68
+
69
+ ```bash
70
+ npm i -g @fontdata/ai-harness
71
+ fontdata-ai-harness init
72
+ ```
73
+
74
+ Instalados assim, os comandos são invocados sem prefixo: `/harness`, `/gerar-spec`, etc.
75
+
76
+ ## Outros comandos do CLI
77
+
78
+ ```bash
79
+ npx @fontdata/ai-harness list # lista todos os comandos do catálogo
80
+ npx @fontdata/ai-harness --help # ajuda
81
+ ```
82
+
83
+ ## Migrando do `@fontdata/ai-commands`
84
+
85
+ O pacote foi renomeado de `@fontdata/ai-commands` para `@fontdata/ai-harness` na versão 2.0.0. Os comandos continuam os mesmos; muda o nome do pacote, o nome do plugin e o prefixo.
86
+
87
+ | Você usava | Passe a usar |
88
+ |---|---|
89
+ | `npx @fontdata/ai-commands <comando>` | `npx @fontdata/ai-harness <comando>` |
90
+ | `/ai-commands:<comando>` | `/fontdata:<comando>` |
91
+ | Plugin `ai-commands@fontdata` | Plugin `fontdata@ai-harness` (veja abaixo) |
92
+ | `npm i -g @fontdata/ai-commands` + `fontdata-ai-commands init` | `npm uninstall -g @fontdata/ai-commands && npm i -g @fontdata/ai-harness` + `fontdata-ai-harness init` |
93
+ | Comandos instalados via `init` | Nada muda — os arquivos em `.claude/commands/` não têm prefixo |
94
+
95
+ Para trocar o plugin global:
96
+
97
+ ```bash
98
+ claude plugin uninstall ai-commands@fontdata
99
+ claude plugin marketplace remove fontdata
100
+ claude plugin marketplace add fontdata-tecnologia/ai-harness
101
+ claude plugin install fontdata@ai-harness
102
+ ```
103
+
104
+ Os binários `ai-commands` e `fontdata-ai-commands` foram removidos: use `ai-harness` e `fontdata-ai-harness`.
105
+
106
+ ## O que o `init` faz
107
+
108
+ Fluxo interativo:
109
+
110
+ 1. Pergunta a **pasta do projeto** (padrão: pasta atual).
111
+ 2. **Detecta se o projeto é novo ou existente** (manifestos de stack, arquivos `.sln/.csproj`, pastas de código com conteúdo) e avisa o que isso muda na seleção manual.
112
+ 3. Pergunta **o que instalar**: _Conjunto recomendado_, _Tudo_ ou _Escolher manualmente_ (seleção por categoria).
113
+ - Em _Escolher manualmente_, **projeto novo** já vem com os comandos recomendados marcados; **projeto existente** vem vazio (ideal para cadastrar comandos avulsos).
114
+ 4. Pergunta se quer o **comando-mestre `/harness`** (conduz a sequência de setup em ordem). Se escolhido, o init **inclui automaticamente** os comandos que o `/harness` depende, mesmo que não tenham sido marcados. O mesmo vale para **dependências entre comandos** (campo `requires` no catálogo): ao instalar um comando que depende de outro, o dependente entra junto automaticamente.
115
+ 5. Pergunta se deve criar/atualizar o **`CLAUDE.md` base** na raiz (com opção de `.bak` se já existir).
116
+ 6. Copia os comandos para `.claude/commands/` e mostra um resumo. Em caso de conflito, pergunta se sobrescreve ou pula.
117
+ 7. Instala em `.claude/skills/` as **skills exigidas** pelos comandos escolhidos (campo `requiresSkills` no catálogo) — hoje, `/auditar-seguranca` puxa a skill `lgpd-checker`.
118
+
119
+ ## Skills instaláveis
120
+
121
+ Algumas skills acompanham comandos e são instaladas junto com eles, em `.claude/skills/<id>/`.
122
+
123
+ | Skill | Vem com | O que faz |
124
+ |---|---|---|
125
+ | `lgpd-checker` | `/auditar-seguranca` | Analisa conformidade com a LGPD (Lei nº 13.709/2018) em 11 categorias, com checklist, artigos de referência e template de relatório. |
126
+
127
+ A skill `lgpd-checker` é uma cópia vendorizada de
128
+ [bittencourtthulio/lgpd-checker](https://github.com/bittencourtthulio/lgpd-checker); veja
129
+ `templates/skills/lgpd-checker/ORIGEM.md` para créditos e instruções de atualização.
130
+
131
+ ## Modelo de arquivos do harness
132
+
133
+ | Arquivo | Local | Papel |
134
+ |--------|-------|-------|
135
+ | `SPEC.md` | raiz | Definição **principal** e completa do projeto (única). |
136
+ | `CLAUDE.md` | raiz | Context file lido em toda sessão. |
137
+ | `docs/specs/AAAA-MM-DD-*.md` | `docs/specs/` | Specs **complementares**: o start inicial e cada nova tarefa. |
138
+ | `docs/plans/AAAA-MM-DD-*.md` | `docs/plans/` | Plano de implementação de cada spec complementar. |
139
+ | `docs/bugs/AAAA-MM-DD-<slug>.md` | `docs/bugs/` | Plano de correção de bugs (via `/resolver-bug`). |
140
+
141
+ ## Comandos instaláveis
142
+
143
+ `⭐` = incluído no _Conjunto recomendado_.
144
+
145
+ ### Setup inicial
146
+ - `/validar-ideia` ⭐ — valida se a ideia cabe em ~4h com multi-agents
147
+ - `/gerar-spec` ⭐ — entrevista e gera o `SPEC.md` principal na raiz
148
+ - `/gerar-claude-md` ⭐ — gera o `CLAUDE.md` a partir do SPEC
149
+ - `/gerar-ignore` — gera `.claudeignore` e `.gitignore`
150
+ - `/scaffold` ⭐ — estrutura inicial, rota `/health` e testes de smoke
151
+
152
+ > O plano do start inicial é gerado pelo `/nova-tarefa` (veja _Slash commands & dia a dia_).
153
+
154
+ ### Orquestração & implementação
155
+ - `/executar-plan` ⭐ — orquestra a execução do plano com sub-agents em paralelo
156
+ - `/configurar-orquestrador` — configura o agente orquestrador no `CLAUDE.md`
157
+ - `/corrigir-review` — organiza correções em sprints/fases/tasks com TDD
158
+ - `/review-por-task` — enforça implementação → review isolado → correção
159
+
160
+ ### Harness (agents/skills/hooks/rules)
161
+ - `/criar-skill` — cria skills do projeto em `.claude/skills/`
162
+ - `/criar-agents` — cria agents especializados em `.claude/agents/`
163
+ - `/criar-hooks` — cria hooks por agent em `.claude/hooks/`
164
+ - `/criar-rules` — cria rules em `.claude/rules/`
165
+ - `/configurar-comentarios` ⭐ — instala o padrão de comentários em três camadas: a rule `.claude/rules/comentarios.md` (orçamento duro e contra-exemplos), o bloco autossuficiente no `CLAUDE.md` e o hook `PostToolUse` bloqueante com **catraca** sobre o código legado — em qualquer linguagem, inclusive Delphi/Pascal
166
+ - `/criar-code-reviewer` ⭐ — cria o agent `code-reviewer` (somente leitura)
167
+
168
+ ### Slash commands & dia a dia
169
+ - `/resolver-bug` ⭐ — investiga, planeja em `docs/bugs` e corrige um bug
170
+ - `/nova-tarefa` ⭐ — gera spec+plano em `docs/` (start inicial ou nova tarefa) e, se confirmado, dispara o orquestrador
171
+
172
+ ### Qualidade & manutenção de código
173
+ - `/gerar-testes` — detecta cobertura faltante e escreve testes seguindo TDD (RED→GREEN)
174
+ - `/refatorar` — refatora usando os testes como rede de segurança, sem mudar comportamento
175
+ - `/codigo-morto` — varre o projeto em busca de código morto e propõe remoção segura
176
+ - `/atualizar-deps` — atualiza dependências em lotes, testando a cada passo
177
+
178
+ ### Documentação & onboarding
179
+ - `/sincronizar-claude-md` — aponta onde o `CLAUDE.md`/`SPEC.md` divergiu do código
180
+ - `/diagrama` — gera diagramas Mermaid de arquitetura/fluxo a partir do código
181
+ - `/onboarding` — gera um guia de onboarding (rodar, entender e contribuir) em `docs/`
182
+ - `/gerar-env` — monta o `.env.example` a partir das variáveis lidas no código
183
+
184
+ ### Avançado
185
+ - `/criar-rag` — sistema de RAG (SQLite + sqlite-vec) para capturar aprendizados
186
+ - `/auditar-ui` — navega a app via Playwright MCP e audita UX/UI e/ou acessibilidade (a11y)
187
+ - `/design-system` — cria o agent de design system com skills e rules
188
+ - `/auditar-performance` — audita gargalos de performance (queries, bundle, renders)
189
+ - `/auditar-seguranca` — auditoria defensiva (segredos, deps, inputs, configs) **+ conformidade LGPD** via skill `lgpd-checker`
190
+
191
+ ### Manutenção & validação
192
+ - `/validar-commands` — audita `.claude`: valida models dos agents, aponta redundâncias e sugere novos commands
193
+
194
+ ### Utilitário
195
+ - `/git-commit-push` ⭐ — gera mensagem (PT-BR, Conventional Commits) e faz add/commit/push
196
+ - `/versao` ⭐ — detecta o versionamento da stack atual (React+Vite/Next, Node, Delphi, .NET, Flutter…) e aplica o bump de versão + changelog + commit de release (gate de aprovação, sem push). **Autossuficiente**: gera o changelog amigável dos commits internamente, sem depender de outros comandos.
197
+ - `/configurar-auto-tag` ⭐ — detecta o padrão de versionamento (qualquer stack, inclusive Delphi) e gera a GitHub Action que cria a tag automaticamente quando a versão chega na `main`. Separa **versionar** (`/versao`, humano) de **taguear/deployar** (automático). Documenta a pegadinha `GITHUB_TOKEN` × `RELEASE_PAT`.
198
+ - `/revisar-pr` — revisa um PR ou o diff atual, classificando os achados
199
+
200
+ ### Comando-mestre
201
+ - `/harness` — conduz a sequência de setup em ordem, validando entre etapas
202
+
203
+ ## Fluxo recomendado
204
+
205
+ A forma mais simples é rodar o comando-mestre **`/harness`**, que conduz toda a sequência abaixo em ordem, parando para validar entre as etapas. Ele pergunta logo no início se o projeto é **novo** ou **existente** e ajusta o fluxo.
206
+
207
+ **Projeto novo** — sequência completa:
208
+
209
+ ```
210
+ /validar-ideia → /gerar-spec → /gerar-claude-md → /gerar-ignore
211
+ → /nova-tarefa (plano do start) → /scaffold
212
+ → /configurar-comentarios → /criar-skill → /criar-agents → /criar-code-reviewer → /criar-rules → /criar-hooks → /configurar-orquestrador
213
+ → /executar-plan
214
+ ```
215
+
216
+ > As skills vêm **antes** dos agents (os agents dependem delas).
217
+
218
+ **Projeto existente** — documenta e monta o harness sobre o código que já existe, pulando validação de ideia, plano do start, scaffold e execução:
219
+
220
+ ```
221
+ /gerar-spec → /gerar-claude-md → /gerar-ignore
222
+ → /configurar-comentarios → /criar-skill → /criar-agents → /criar-code-reviewer → /criar-rules → /criar-hooks → /configurar-orquestrador
223
+ ```
224
+
225
+ No dia a dia: `/nova-tarefa`, `/resolver-bug`, `/git-commit-push` e `/versao` (para publicar uma nova versão).
226
+
227
+ ## Desenvolvimento
228
+
229
+ ```bash
230
+ npm install
231
+ node bin/cli.js list
232
+ node bin/cli.js harness # roda na pasta atual, com o plugin local
233
+ node bin/cli.js init ./caminho-de-teste
234
+ claude plugin validate . # valida o manifesto do plugin
235
+ ```
236
+
237
+ Os templates ficam em `templates/` (`commands/*.md` + `skills/` + `CLAUDE.md` + `catalog.json`). Para adicionar um comando: crie o `.md` em `templates/commands/` e registre-o em `templates/catalog.json`.
238
+
239
+ A raiz do pacote também é um plugin do Claude Code: `.claude-plugin/plugin.json` aponta `commands` e `skills` para dentro de `templates/`, então **não há duplicação de arquivos** — a mesma pasta serve o `init` (cópia) e o modo sem instalação (`--plugin-dir`). O `npm version` sincroniza a `version` do `plugin.json` automaticamente (script `version` → `scripts/sync-plugin-version.mjs`).
package/bin/cli.js ADDED
@@ -0,0 +1,122 @@
1
+ #!/usr/bin/env node
2
+ import { readFileSync } from 'node:fs';
3
+ import { fileURLToPath } from 'node:url';
4
+ import { dirname, join } from 'node:path';
5
+ import { loadCatalog, allCommands } from '../src/catalog.js';
6
+ import { runCommand, runnableIds, suggestIds } from '../src/run.js';
7
+
8
+ const __dirname = dirname(fileURLToPath(import.meta.url));
9
+
10
+ const RESERVED = new Set(['init', 'list', 'run', 'help', '--help', '-h', '--version', '-v']);
11
+
12
+ function pkgVersion() {
13
+ try {
14
+ const pkg = JSON.parse(readFileSync(join(__dirname, '..', 'package.json'), 'utf8'));
15
+ return pkg.version;
16
+ } catch {
17
+ return '0.0.0';
18
+ }
19
+ }
20
+
21
+ function printHelp() {
22
+ console.log(`
23
+ @fontdata/ai-harness — harness de engenharia com IA para Claude Code
24
+
25
+ Uso:
26
+ npx @fontdata/ai-harness <comando> [contexto] roda o comando na pasta atual
27
+ npx @fontdata/ai-harness init instala os comandos no projeto
28
+
29
+ Executar sem instalar:
30
+ <comando> Abre o Claude Code aqui já executando o comando (ex.: harness)
31
+ run <comando> Forma explícita, útil quando o nome colide com uma palavra reservada
32
+
33
+ Gerenciar:
34
+ init [caminho] Instala os slash commands em .claude/commands do projeto (interativo)
35
+ list Lista todos os comandos disponíveis no catálogo
36
+ --help, -h Mostra esta ajuda
37
+ --version, -v Mostra a versão
38
+
39
+ Exemplos:
40
+ npx @fontdata/ai-harness harness
41
+ npx @fontdata/ai-harness resolver-bug "login 500 no refresh token"
42
+ npx @fontdata/ai-harness run versao minor
43
+ npx @fontdata/ai-harness harness -- --model claude-opus-5
44
+
45
+ Tudo depois de \`--\` é repassado ao Claude Code (--model, --effort, -p, ...).
46
+ `);
47
+ }
48
+
49
+ function printList() {
50
+ const catalog = loadCatalog();
51
+ console.log('\nComandos disponíveis:\n');
52
+ for (const group of catalog.groups) {
53
+ console.log(` ${group.title}`);
54
+ for (const cmd of group.commands) {
55
+ const star = cmd.recommended ? ' *' : ' ';
56
+ console.log(` ${star} ${cmd.title.padEnd(26)} ${cmd.description}`);
57
+ }
58
+ console.log('');
59
+ }
60
+ console.log(` (* = conjunto recomendado · total: ${allCommands(catalog).length} comandos + /harness)\n`);
61
+ }
62
+
63
+ /** Separa os argumentos do comando dos flags destinados ao Claude Code. */
64
+ function splitArgs(rest) {
65
+ const sep = rest.indexOf('--');
66
+ if (sep === -1) return { args: rest, claudeFlags: [] };
67
+ return { args: rest.slice(0, sep), claudeFlags: rest.slice(sep + 1) };
68
+ }
69
+
70
+ async function main() {
71
+ const argv = process.argv.slice(2);
72
+ const cmd = argv[0];
73
+
74
+ if (cmd === '--version' || cmd === '-v') {
75
+ console.log(pkgVersion());
76
+ return;
77
+ }
78
+ if (!cmd || cmd === '--help' || cmd === '-h' || cmd === 'help') {
79
+ printHelp();
80
+ return;
81
+ }
82
+ if (cmd === 'list') {
83
+ printList();
84
+ return;
85
+ }
86
+ if (cmd === 'init') {
87
+ // Import dinâmico: só carrega @clack/prompts quando o init é realmente usado.
88
+ const { runInit } = await import('../src/init.js');
89
+ await runInit(argv[1]);
90
+ return;
91
+ }
92
+ if (cmd === 'run') {
93
+ const id = argv[1];
94
+ if (!id) {
95
+ console.error('Informe o comando a executar. Ex.: npx @fontdata/ai-harness run harness\n');
96
+ printHelp();
97
+ process.exit(1);
98
+ }
99
+ const { args, claudeFlags } = splitArgs(argv.slice(2));
100
+ process.exit(runCommand(id, args, claudeFlags));
101
+ }
102
+
103
+ const ids = runnableIds();
104
+ if (ids.includes(cmd.replace(/^\//, ''))) {
105
+ const { args, claudeFlags } = splitArgs(argv.slice(1));
106
+ process.exit(runCommand(cmd, args, claudeFlags));
107
+ }
108
+
109
+ if (!RESERVED.has(cmd)) {
110
+ const near = suggestIds(cmd.replace(/^\//, ''), ids);
111
+ console.error(`Comando desconhecido: ${cmd}`);
112
+ if (near.length) console.error(`\nVocê quis dizer: ${near.join(', ')}`);
113
+ console.error('');
114
+ }
115
+ printHelp();
116
+ process.exit(1);
117
+ }
118
+
119
+ main().catch((err) => {
120
+ console.error('Erro:', err?.message || err);
121
+ process.exit(1);
122
+ });
package/package.json ADDED
@@ -0,0 +1,44 @@
1
+ {
2
+ "name": "@fontdata/ai-harness",
3
+ "version": "2.0.0",
4
+ "description": "Harness de engenharia com IA da Fontdata para Claude Code: roda os slash commands direto na pasta do projeto via npx, sem instalar nada — ou instala-os em .claude/commands.",
5
+ "type": "module",
6
+ "bin": {
7
+ "ai-harness": "bin/cli.js",
8
+ "fontdata-ai-harness": "bin/cli.js"
9
+ },
10
+ "engines": {
11
+ "node": ">=18"
12
+ },
13
+ "publishConfig": {
14
+ "access": "public"
15
+ },
16
+ "files": [
17
+ ".claude-plugin/",
18
+ "bin/",
19
+ "src/",
20
+ "templates/",
21
+ "README.md"
22
+ ],
23
+ "scripts": {
24
+ "start": "node bin/cli.js",
25
+ "version": "node scripts/sync-plugin-version.mjs && git add .claude-plugin/plugin.json"
26
+ },
27
+ "keywords": [
28
+ "claude-code",
29
+ "ai",
30
+ "harness",
31
+ "slash-commands",
32
+ "scaffold",
33
+ "fontdata"
34
+ ],
35
+ "author": "Fontdata Tecnologia",
36
+ "license": "MIT",
37
+ "repository": {
38
+ "type": "git",
39
+ "url": "git+https://github.com/fontdata-tecnologia/ai-harness.git"
40
+ },
41
+ "dependencies": {
42
+ "@clack/prompts": "^0.7.0"
43
+ }
44
+ }
package/src/catalog.js ADDED
@@ -0,0 +1,26 @@
1
+ import { readFileSync } from 'node:fs';
2
+ import { fileURLToPath } from 'node:url';
3
+ import { dirname, join } from 'node:path';
4
+
5
+ const __dirname = dirname(fileURLToPath(import.meta.url));
6
+
7
+ /** Raiz da pasta de templates do pacote. */
8
+ export const templatesDir = join(__dirname, '..', 'templates');
9
+
10
+ /** Carrega e retorna o catálogo de comandos (templates/catalog.json). */
11
+ export function loadCatalog() {
12
+ const raw = readFileSync(join(templatesDir, 'catalog.json'), 'utf8');
13
+ return JSON.parse(raw);
14
+ }
15
+
16
+ /** Lista achatada de todos os comandos do catálogo, com o grupo anexado. */
17
+ export function allCommands(catalog) {
18
+ return catalog.groups.flatMap((group) =>
19
+ group.commands.map((cmd) => ({ ...cmd, group: group.title }))
20
+ );
21
+ }
22
+
23
+ /** Apenas os comandos marcados como recomendados (conjunto núcleo). */
24
+ export function recommendedCommands(catalog) {
25
+ return allCommands(catalog).filter((cmd) => cmd.recommended);
26
+ }