@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.
- package/.claude-plugin/marketplace.json +17 -0
- package/.claude-plugin/plugin.json +8 -0
- package/README.md +239 -0
- package/bin/cli.js +122 -0
- package/package.json +44 -0
- package/src/catalog.js +26 -0
- package/src/init.js +317 -0
- package/src/installer.js +92 -0
- package/src/run.js +99 -0
- package/templates/CLAUDE.md +49 -0
- package/templates/catalog.json +124 -0
- package/templates/commands/atualizar-deps.md +15 -0
- package/templates/commands/auditar-performance.md +27 -0
- package/templates/commands/auditar-seguranca.md +64 -0
- package/templates/commands/auditar-ui.md +38 -0
- package/templates/commands/codigo-morto.md +22 -0
- package/templates/commands/configurar-auto-tag.md +185 -0
- package/templates/commands/configurar-comentarios.md +543 -0
- package/templates/commands/configurar-orquestrador.md +13 -0
- package/templates/commands/corrigir-review.md +11 -0
- package/templates/commands/criar-agents.md +42 -0
- package/templates/commands/criar-code-reviewer.md +30 -0
- package/templates/commands/criar-hooks.md +32 -0
- package/templates/commands/criar-rag.md +25 -0
- package/templates/commands/criar-rules.md +31 -0
- package/templates/commands/criar-skill.md +22 -0
- package/templates/commands/design-system.md +27 -0
- package/templates/commands/diagrama.md +17 -0
- package/templates/commands/executar-plan.md +36 -0
- package/templates/commands/gerar-claude-md.md +66 -0
- package/templates/commands/gerar-env.md +16 -0
- package/templates/commands/gerar-ignore.md +37 -0
- package/templates/commands/gerar-spec.md +33 -0
- package/templates/commands/gerar-testes.md +17 -0
- package/templates/commands/git-commit-push.md +38 -0
- package/templates/commands/harness.md +34 -0
- package/templates/commands/nova-tarefa.md +60 -0
- package/templates/commands/onboarding.md +21 -0
- package/templates/commands/refatorar.md +17 -0
- package/templates/commands/resolver-bug.md +25 -0
- package/templates/commands/review-por-task.md +16 -0
- package/templates/commands/revisar-pr.md +18 -0
- package/templates/commands/scaffold.md +25 -0
- package/templates/commands/sincronizar-claude-md.md +15 -0
- package/templates/commands/validar-commands.md +24 -0
- package/templates/commands/validar-ideia.md +36 -0
- package/templates/commands/versao.md +159 -0
- package/templates/skills/lgpd-checker/ORIGEM.md +21 -0
- package/templates/skills/lgpd-checker/SKILL.md +152 -0
- package/templates/skills/lgpd-checker/references/checklist.md +155 -0
- package/templates/skills/lgpd-checker/references/lgpd-artigos.md +178 -0
- 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
|
+
}
|
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
|
+
}
|