spec-first-claude 0.7.0-beta.1 → 0.8.0-beta.1

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 (54) hide show
  1. package/README.md +296 -166
  2. package/bin/cli.js +69 -69
  3. package/lib/init.js +92 -92
  4. package/lib/update.js +133 -133
  5. package/package.json +1 -1
  6. package/templates/.ai/memory/napkin.md +68 -68
  7. package/templates/.claude/CHANGELOG.md +594 -523
  8. package/templates/.claude/adapters/SETUP.md +314 -314
  9. package/templates/.claude/adapters/confluence.md +295 -295
  10. package/templates/.claude/adapters/errors.md +234 -234
  11. package/templates/.claude/adapters/filesystem.md +353 -353
  12. package/templates/.claude/adapters/interface.md +301 -301
  13. package/templates/.claude/adapters/naming.md +241 -241
  14. package/templates/.claude/adapters/registry.md +244 -244
  15. package/templates/.claude/agents/backend-coder.md +215 -215
  16. package/templates/.claude/agents/db-coder.md +165 -165
  17. package/templates/.claude/agents/doc-writer.md +66 -66
  18. package/templates/.claude/agents/frontend-coder.md +222 -222
  19. package/templates/.claude/agents/infra-coder.md +341 -341
  20. package/templates/.claude/agents/reviewer.md +99 -99
  21. package/templates/.claude/agents/security-reviewer.md +153 -153
  22. package/templates/.claude/commands/design.md +160 -160
  23. package/templates/.claude/commands/dev.md +194 -194
  24. package/templates/.claude/commands/discovery.md +414 -414
  25. package/templates/.claude/commands/extract.md +224 -224
  26. package/templates/.claude/commands/load.md +295 -295
  27. package/templates/.claude/commands/mcp.md +385 -385
  28. package/templates/.claude/commands/merge-docs.md +151 -151
  29. package/templates/.claude/commands/plan.md +151 -151
  30. package/templates/.claude/commands/publish.md +143 -143
  31. package/templates/.claude/commands/session-finish.md +83 -83
  32. package/templates/.claude/commands/sfw-onboard.md +359 -0
  33. package/templates/.claude/commands/sfw-start.md +191 -191
  34. package/templates/.claude/rules.md +229 -229
  35. package/templates/.claude/scripts/bootstrap-confluence.js +289 -289
  36. package/templates/.claude/templates/estrutura/apiContracts.template.md +160 -159
  37. package/templates/.claude/templates/estrutura/architecture.template.md +169 -168
  38. package/templates/.claude/templates/estrutura/conventions.template.md +214 -212
  39. package/templates/.claude/templates/estrutura/decisions.template.md +140 -107
  40. package/templates/.claude/templates/estrutura/domain.template.md +161 -160
  41. package/templates/.claude/templates/feature/PRD.template.md +279 -279
  42. package/templates/.claude/templates/feature/Progresso.template.md +141 -141
  43. package/templates/.claude/templates/feature/TRD.template.md +450 -358
  44. package/templates/.claude/templates/feature/context.template.md +118 -89
  45. package/templates/.claude/templates/feature/extract-log.template.md +49 -49
  46. package/templates/.claude/templates/feature/projetos.template.yaml +79 -79
  47. package/templates/.claude/templates/global/progresso_global.template.md +59 -57
  48. package/templates/.claude/templates/specs/brief.template.md +66 -66
  49. package/templates/.claude/templates/specs/contracts.template.md +147 -147
  50. package/templates/.claude/templates/specs/scenarios.template.md +125 -125
  51. package/templates/.claude/templates/specs/tasks.template.md +65 -65
  52. package/templates/CLAUDE.md +274 -272
  53. package/templates/_gitignore +35 -35
  54. package/templates/sfw.config.yml.example +147 -147
package/README.md CHANGED
@@ -1,166 +1,296 @@
1
- # spec-first-claude
2
-
3
- Kit completo para desenvolvimento **spec-first** com [Claude Code](https://claude.ai/code). A IA segue um pipeline disciplinado — da especificacao ao codigo — com checkpoints humanos e rastreabilidade ponta a ponta.
4
-
5
- ## O que e spec-first?
6
-
7
- Em vez de pedir pra IA "cria um CRUD de usuarios", voce fornece insumos brutos (docs, SQLs, rascunhos) e a IA:
8
-
9
- 1. **Extrai** requisitos estruturados (PRD)
10
- 2. **Espera sua aprovacao** (checkpoint humano)
11
- 3. **Gera design tecnico** (SDD) — fonte unica de verdade
12
- 4. **Planeja tasks** com dependencias e fases
13
- 5. **Implementa** com agentes especializados por area + security review
14
- 6. **Atualiza docs** automaticamente (delta specs)
15
-
16
- Resultado: codigo previsivel, seguro e rastreavel.
17
-
18
- ## Pre-requisitos
19
-
20
- - **Node.js** 18+
21
- - **Git** instalado
22
- - **Claude Code** instalado e configurado
23
-
24
- ### Windows (PowerShell)
25
-
26
- Se encontrar erro de script nao assinado ao rodar o CLI, execute:
27
-
28
- ```powershell
29
- Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned
30
- ```
31
-
32
- ## Instalacao
33
-
34
- ```bash
35
- npm i -g spec-first-claude
36
- ```
37
-
38
- ## Uso
39
-
40
- ```bash
41
- spec-first-claude init --name=MeuProjeto
42
- ```
43
-
44
- Isso cria a pasta `MeuProjeto/` com toda a estrutura pronta:
45
-
46
- ```
47
- MeuProjeto/
48
- ├── .ai/memory/napkin.md <- Memoria persistente do projeto
49
- ├── .claude/ <- AI OPERATIONAL CONFIG
50
- │ ├── rules.md <- Regras de desenvolvimento
51
- │ ├── CHANGELOG.md <- Historico do framework
52
- │ ├── templates/ <- Templates do workflow
53
- │ │ ├── feature/ <- PRD, SDD, context, extract-log, Progresso, backlog, projetos.yaml
54
- │ │ ├── specs/ <- brief, contracts, scenarios, tasks (projecoes pro agent)
55
- │ │ ├── estrutura/ <- 5 templates de sintese cross-feature
56
- │ │ └── global/ <- Progresso global
57
- │ ├── adapters/ <- SourceAdapter + ConfluenceAdapter + FilesystemAdapter
58
- │ ├── commands/ <- 11 commands do workflow
59
- │ │ ├── mcp.md
60
- │ │ ├── load.md
61
- │ │ ├── publish.md
62
- │ │ ├── sfw-start.md <- entrada unica (substitui setup-projeto + feature)
63
- │ │ ├── discovery.md
64
- │ │ ├── extract.md
65
- │ │ ├── design.md
66
- │ │ ├── plan.md
67
- │ │ ├── dev.md
68
- │ │ ├── merge-docs.md <- renomeado de merge-delta
69
- │ │ └── session-finish.md
70
- │ └── agents/ <- 7 agentes especializados
71
- │ ├── backend-coder.md <- .NET 8 / C#
72
- │ ├── frontend-coder.md <- React
73
- │ ├── db-coder.md <- PostgreSQL
74
- │ ├── infra-coder.md <- Docker
75
- │ ├── doc-writer.md <- Documentacao
76
- │ ├── reviewer.md <- Code review
77
- │ └── security-reviewer.md <- Auditoria de seguranca
78
- ├── docs/ <- SINTESE CROSS-FEATURE (atualizada pelo /merge-docs)
79
- │ ├── architecture.md <- Containers, stack, ambientes, deploy
80
- │ ├── domain.md <- Visao de negocio + modelo de dados
81
- │ ├── conventions.md <- Auth, authz, LGPD, env vars, monitoramento
82
- │ ├── apiContracts.md <- Rotas, paginacao, erros, catalogo de endpoints
83
- │ └── decisions.md <- ADRs (append-only)
84
- ├── specs/ <- AGENT CONTRACTS (projecoes do SDD pro coder)
85
- │ └── {nome}/
86
- │ ├── brief.md <- Problema/Solucao (SDD §1+§2+§10)
87
- │ ├── contracts.md <- Sistema + Áreas tocadas (SDD §3-§7)
88
- │ ├── scenarios.md <- Fluxos/UI/CAs (SDD §5.2+§8+§9)
89
- │ └── tasks.md <- Tabela unica com coluna Area
90
- ├── workspace/ <- TEAM CONTENT
91
- │ ├── Input/ <- Jogue seus insumos aqui (nome livre)
92
- │ │ └── {nome}/ <- ex: app_barbearia, feat_login
93
- │ └── Output/ <- Docs narrativos pro humano (PRD, SDD, Progresso)
94
- ├── sfw.config.yml.example <- Manifesto de adapters (input/output)
95
- ├── CLAUDE.md <- Regras globais pro agente
96
- └── .gitignore
97
- ```
98
-
99
- ## Como comecar
100
-
101
- 1. Crie o projeto:
102
- ```bash
103
- spec-first-claude init --name=MeuProjeto
104
- cd MeuProjeto
105
- ```
106
-
107
- 2. Jogue seus insumos em `workspace/Input/<nome>/` — qualquer formato.
108
- `<nome>` é livre: `app_barbearia`, `bootstrap`, `feat_login`, `bug_checkout`, etc.
109
- - `.md`, `.txt` (descricoes, requisitos, decisoes)
110
- - `.sql` (modelagem de banco)
111
- - `.csv`, `.xml`, `.html` (dados, configs)
112
- - `.png`, `.jpg`, `.pdf` (telas, diagramas)
113
-
114
- 3. Abra o Claude Code e rode:
115
- ```
116
- /sfw-start <nome>
117
- ```
118
-
119
- 4. O pipeline comeca. A IA detecta automaticamente se e first-run (docs/ ausente)
120
- ou feature (docs/ ja existe). Nao ha comandos diferentes pra setup vs feature.
121
-
122
- - Extrai PRD dos seus insumos (pode ser empty em scopes puro-tecnicos)
123
- - Para e pede sua aprovacao
124
- - Depois voce roda `/design`, `/plan`, `/dev` na sequencia
125
-
126
- ## Pipeline completo
127
-
128
- ```
129
- workspace/Input/<nome>/ (seus arquivos)
130
- |
131
- v
132
- /sfw-start <nome> --> /extract --> PRD (voce revisa e aprova)
133
- |
134
- v
135
- /design --> SDD + docs/ (first-run: cria 5 arquivos)
136
- (feature: gera só §Área-X + §11 delta)
137
- |
138
- v
139
- /plan --> tasks + Progresso.md
140
- |
141
- v
142
- /dev --> codigo nos repos
143
- + /merge-docs automatico
144
- (aplica §11 em docs/)
145
- ```
146
-
147
- Mesmo comando pra bootstrap e feature — `first_run` e derivado da ausencia/presenca de `docs/`.
148
-
149
- ## Opcoes do CLI
150
-
151
- ```
152
- spec-first-claude init --name=<nome> [--target=<caminho>]
153
- ```
154
-
155
- | Opcao | Descricao |
156
- |-------|-----------|
157
- | `--name` | Nome do projeto (obrigatorio) |
158
- | `--target` | Diretorio destino (default: `./<nome>`) |
159
-
160
- ## Links
161
-
162
- - [Repositorio](https://github.com/gustavomaritan-labs/spec-first-workflow)
163
-
164
- ## Licenca
165
-
166
- MIT
1
+ # spec-first-claude
2
+
3
+ [![npm version](https://img.shields.io/npm/v/spec-first-claude.svg)](https://www.npmjs.com/package/spec-first-claude)
4
+ [![license](https://img.shields.io/npm/l/spec-first-claude.svg)](https://github.com/gustavomaritan-labs/spec-first-workflow/blob/main/LICENSE)
5
+ [![node](https://img.shields.io/node/v/spec-first-claude.svg)](https://nodejs.org)
6
+
7
+ Kit completo de desenvolvimento **spec-first** para [Claude Code](https://claude.ai/code).
8
+ Pipeline disciplinado do insumo bruto ao código — com checkpoints humanos,
9
+ agents especializados por área, security review e rastreabilidade ponta a ponta.
10
+
11
+ > **v0.7.0 (estável)**TRD ressuscitado como peer do PRD, aprovação por persona,
12
+ > SDD eliminado. Ver [CHANGELOG](templates/.claude/CHANGELOG.md) para detalhes da migração v3→v4.
13
+
14
+ ---
15
+
16
+ ## Conteúdo
17
+
18
+ - [Pra quem é isso](#pra-quem-é-isso)
19
+ - [O que você ganha](#o-que-você-ganha)
20
+ - [Instalação](#instalação)
21
+ - [Estrutura gerada](#estrutura-gerada)
22
+ - [Pipeline passo a passo](#pipeline-passo-a-passo)
23
+ - [Brownfield: assumir aplicação existente](#brownfield-assumir-aplicação-existente)
24
+ - [Commands disponíveis](#commands-disponíveis)
25
+ - [Agents especializados](#agents-especializados)
26
+ - [Backends plugáveis (adapters)](#backends-plugáveis-adapters)
27
+ - [Troubleshooting](#troubleshooting)
28
+ - [Links](#links)
29
+
30
+ ---
31
+
32
+ ## Pra quem é isso
33
+
34
+ Você gerencia projetos onde PMs/POs entregam requisitos em formatos
35
+ heterogêneos (docs no Confluence, SQLs de modelagem, wireframes, notas
36
+ dispersas) e quer que o desenvolvimento assistido por IA siga um processo
37
+ previsível. Sem "a IA adivinhou" — com specs aprovadas antes de uma linha
38
+ de código.
39
+
40
+ **Use-cases cobertos**:
41
+ - Bootstrap de projeto novo (define stack + arquitetura + primeiras features)
42
+ - Features novas em projeto existente (merge aditivo em docs cross-feature)
43
+ - **Brownfield**: assumir aplicação existente — `/sfw-onboard` lê o código e gera a base documental (ver [seção dedicada](#brownfield-assumir-aplicação-existente))
44
+ - Bugs e tasks técnicas (mesmo pipeline, escopo menor)
45
+ - Times multi-dev (contratos firmes via `specs/` + `projetos.yaml`)
46
+
47
+ ## O que você ganha
48
+
49
+ | Benefício | Como entrega |
50
+ |-----------|--------------|
51
+ | **Spec-first rígido** | Nenhum código sem PRD/TRD aprovados + `specs/` gerado |
52
+ | **Dois revisores, dois docs** | PM aprova PRD (produto), dev aprova TRD (técnico) |
53
+ | **Rastreabilidade total** | Cada RN, ADR, endpoint, task aponta pro insumo-fonte via hash SHA-256 |
54
+ | **Security by default** | Security Reviewer audita 6 categorias pós-dev (Auth, AuthZ, Injeção, PII, Headers, Banco) |
55
+ | **Backend-agnóstico** | Rode local (filesystem) ou sincronize com Confluence via MCP |
56
+ | **Multi-repo nativo** | `projetos.yaml` mapeia serviços → repos; cada repo com branch/PR próprio |
57
+ | **Entregáveis contínuos** | Features obrigatoriamente faseadas (P1/P2/P3) nunca "tudo ou nada" |
58
+ | **Re-executável** | Toda skill pode rodar de novo; hashes detectam incremental |
59
+
60
+ ## Instalação
61
+
62
+ ```bash
63
+ npm i -g spec-first-claude
64
+ ```
65
+
66
+ **Pré-requisitos**: Node.js 18+, Git, [Claude Code](https://claude.ai/code) instalado.
67
+
68
+ **Windows (PowerShell)** se o CLI não rodar por política de execução:
69
+ ```powershell
70
+ Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned
71
+ ```
72
+
73
+ ## Primeiros passos
74
+
75
+ ```bash
76
+ # 1. Criar o projeto
77
+ spec-first-claude init --name=MeuProjeto
78
+ cd MeuProjeto
79
+
80
+ # 2. Jogar insumos brutos (qualquer formato)
81
+ # em workspace/Input/<nome>/
82
+ # Ex: workspace/Input/app_barbearia/visao.md + modelo.sql + decisoes.md
83
+
84
+ # 3. Abrir com Claude Code e iniciar o pipeline
85
+ # /sfw-start app_barbearia
86
+ ```
87
+
88
+ **Opções do CLI**:
89
+
90
+ | Opção | Descrição |
91
+ |-------|-----------|
92
+ | `--name` | Nome do projeto (obrigatório) |
93
+ | `--target` | Diretório destino (default: `./<name>`) |
94
+
95
+ ## Estrutura gerada
96
+
97
+ ```
98
+ MeuProjeto/
99
+ ├── .ai/memory/napkin.md <- Memória persistente (curada continuamente)
100
+ ├── .claude/ <- AI OPERATIONAL CONFIG
101
+ │ ├── rules.md <- Regras invioláveis + quality gate
102
+ ├── CHANGELOG.md <- Histórico do framework
103
+ ├── templates/ <- 17 templates do workflow
104
+ │ ├── feature/ <- PRD, TRD, context, extract-log, Progresso, projetos.yaml
105
+ │ ├── specs/ <- brief, contracts, scenarios, tasks (projeções pro coder)
106
+ │ │ ├── estrutura/ <- 5 docs cross-feature (architecture, domain, conventions, apiContracts, decisions)
107
+ │ │ └── global/ <- progresso_global
108
+ ├── adapters/ <- SourceAdapter interface + 2 implementations built-in
109
+ ├── commands/ <- 11 slash commands (ver tabela abaixo)
110
+ └── agents/ <- 7 perfis especializados (ver tabela abaixo)
111
+ ├── docs/ <- SÍNTESE CROSS-FEATURE (atualizada pelo /merge-docs)
112
+ ├── architecture.md <- Containers C4 + stack + ambientes + deploy
113
+ │ ├── domain.md <- Visão de negócio + modelo de dados consolidado
114
+ │ ├── conventions.md <- Auth, authz, LGPD, env vars, códigos de erro, monitoramento
115
+ ├── apiContracts.md <- Convenções de API + catálogo de endpoints
116
+ └── decisions.md <- ADRs (append-only)
117
+ ├── specs/ <- AGENT CONTRACTS (projeções de PRD+TRD pro coder)
118
+ │ └── {scope}/
119
+ │ ├── brief.md <- Problema/Solução
120
+ │ ├── contracts.md <- Sistema + áreas tocadas (schema, endpoints, integrações, RNs)
121
+ │ ├── scenarios.md <- Jornadas + CAs + estratégia de testes
122
+ │ └── tasks.md <- Tabela única com coluna Área (gerado pelo /plan)
123
+ ├── workspace/ <- TEAM CONTENT
124
+ ├── Input/ <- Insumos brutos (QUALQUER formato nunca modificar)
125
+ │ │ └── {scope}/ <- Nome livre (app_barbearia, feat_login, bug_checkout)
126
+ │ └── Output/ <- Docs narrativos pro humano
127
+ │ └── {scope}/
128
+ │ ├── PRD.md <- Requirements de produto (se insumos têm produto)
129
+ │ ├── TRD.md <- Requirements técnicos (se insumos têm técnica)
130
+ │ ├── Progresso.md <- Tracking de execução
131
+ │ └── .context.md <- Estado da pipeline (YAML)
132
+ ├── projetos/ <- Repos de código (gitignored, cada um com .git)
133
+ ├── projetos.yaml <- Manifesto de repos (gerado no first-run)
134
+ ├── sfw.config.yml.example <- Manifesto de adapters (input/output)
135
+ ├── CLAUDE.md <- Meta-regras pro agente
136
+ └── .gitignore
137
+ ```
138
+
139
+ **Três zonas, zero ambiguidade**:
140
+ - `.claude/` + `.ai/` → config operacional + memória (time edita raro)
141
+ - `docs/` → síntese cross-feature (atualizada pelo `/merge-docs`)
142
+ - `workspace/` → content compartilhável (Input = time, Output = workflow)
143
+
144
+ ## Pipeline passo a passo
145
+
146
+ ```
147
+ workspace/Input/<scope>/ (seus arquivos)
148
+
149
+
150
+ /sfw-start <scope> ──▶ /load ──▶ /discovery ──▶ /extract
151
+
152
+
153
+ PRD + TRD gerados
154
+
155
+ ┌──────── CHECKPOINT DUPLO ────────┐
156
+ │ PM aprova PRD | dev aprova TRD │
157
+ └──────────────────────────────────┘
158
+
159
+
160
+ /design ──▶ specs/ (sempre)
161
+ docs/ + projetos.yaml (first-run)
162
+
163
+
164
+ /plan ──▶ tasks.md + Progresso.md
165
+
166
+
167
+ /dev ──▶ código nos repos
168
+ + Security Review
169
+ + /merge-docs automático
170
+ (diff PRD+TRD ↔ docs/)
171
+ ```
172
+
173
+ Mesmo comando pra bootstrap e feature — `first_run` é derivado da
174
+ ausência/presença de `docs/`.
175
+
176
+ **Apresentação visual**: abra
177
+ [`apresentacao.html`](https://github.com/gustavomaritan-labs/spec-first-workflow/blob/main/packages/apresentacao.html)
178
+ pra ver o fluxo completo com personas, artefatos e adapters.
179
+
180
+ ## Brownfield: assumir aplicação existente
181
+
182
+ Para projetos que **já existem** e não nasceram com SFW. O `/sfw-onboard` lê o
183
+ código, identifica stack/padrões/decisões observadas, e popula a base documental
184
+ (TRD + `docs/` + `projetos.yaml`) sem PRD.
185
+
186
+ **Filosofia**: cartógrafo, não arquiteto. Descreve o que existe sem julgar.
187
+ Coders de features futuras **seguem** os padrões observados — mudanças entram
188
+ como features propostas pelo dev.
189
+
190
+ ```bash
191
+ # 1. Criar shell SFW vazio (mesma instalação)
192
+ spec-first-claude init --name=MeuProjeto
193
+ cd MeuProjeto
194
+
195
+ # 2. Onboardar repo existente (pré-req: SSH/PAT já configurado)
196
+ /sfw-onboard https://github.com/empresa/app-legado.git
197
+
198
+ # 3. (Multi-repo) Re-rodar pra cada repo do mesmo projeto
199
+ /sfw-onboard https://github.com/empresa/app-legado-web.git
200
+ /sfw-onboard https://github.com/empresa/app-legado-worker.git
201
+
202
+ # 4. Começar features novas com o pipeline normal
203
+ /sfw-start feat_nova_funcionalidade
204
+ ```
205
+
206
+ **O que é gerado**:
207
+ - `projetos/<repo>/` — clone(s) com `.git` próprio
208
+ - `workspace/Output/onboard_<repo>/TRD.md` — completo, com §1.6 Padrões Observados (snippets reais)
209
+ - `workspace/Input/onboard_<repo>/code-snapshot.md` — índice + hashes (re-onboard incremental)
210
+ - `docs/` — 5 arquivos cross-feature populados
211
+ - `projetos.yaml` — entries dos repos clonados
212
+ - `docs/decisions.md` — ADRs **inferidas** com flag `Inferido: true` (dev revisa e remove flag ao confirmar)
213
+
214
+ **Re-onboard** quando o código legado evolui: rodar de novo, hash detecta arquivos
215
+ modificados, merge aditivo no TRD.
216
+
217
+ **Diferença vs `/sfw-start`**: brownfield NÃO gera PRD nem ambiguidades (código é
218
+ a verdade), não tem checkpoint humano, e auto-aprova TRD. Após onboard, features
219
+ novas entram pelo `/sfw-start` normal — `first_run` da feature já será `false`
220
+ porque `docs/` existe.
221
+
222
+ ## Commands disponíveis
223
+
224
+ | Command | Tipo | Função |
225
+ |---------|------|--------|
226
+ | `/mcp <provider>` | Setup | Configura backend externo (Confluence). Cria `.mcp.json` + `sfw.config.yml` |
227
+ | `/load <scope>` | Utilitária | Puxa Input do backend (incremental via hash) |
228
+ | `/publish <scope> <tipo>` | Utilitária | Publica PRD/TRD/Progresso nos targets. Auto-chamada por extract/plan |
229
+ | `/sfw-start <scope>` | Orquestrador | Entrada única. Cria `.context.md`, chama `/load` + `/discovery` + `/extract` |
230
+ | `/sfw-onboard <git-url>` | Atômica | **Brownfield**. Clona repo existente, gera TRD + docs/ + projetos.yaml (sem PRD) |
231
+ | `/discovery <path>` | Atômica | Análise profunda prévia dos insumos (obrigatório em v4) |
232
+ | `/extract <scope>` | Atômica | Gera PRD e/ou TRD conforme conteúdo dos insumos |
233
+ | `/design <scope>` | Atômica | PRD+TRD aprovados → `specs/`. First-run também cria `docs/` + `projetos.yaml` |
234
+ | `/plan <scope>` | Atômica | Lê PRD + TRD + specs/ → tasks por área + Progresso.md |
235
+ | `/dev <scope>` | Atômica | Implementa tasks com loop (implement → test → review). Merge-docs automático no fim |
236
+ | `/merge-docs <scope>` | Atômica | Diff semântico PRD+TRD ↔ docs/ → atualiza síntese cross-feature |
237
+ | `/session-finish` | Utilitária | Encerra sessão: salva estado, atualiza napkin, gera retomada.md |
238
+
239
+ ## Agents especializados
240
+
241
+ | Agent | Área | Stack padrão | Modelo |
242
+ |-------|------|--------------|--------|
243
+ | Backend Coder | BACK | .NET 8 / C# (editável) | Sonnet (S/M) · Opus (L) |
244
+ | Frontend Coder | FRONT | React + Fusion (editável) | Sonnet (S/M) · Opus (L) |
245
+ | DB Coder | DB | PostgreSQL 16 (editável) | Sonnet (S/M) · Opus (L) |
246
+ | Infra Coder | INFRA | Docker | Sonnet (S/M) · Opus (L) |
247
+ | Doc Writer | DOC | — | Sonnet |
248
+ | Reviewer | Todas | — (quality gate) | Sonnet |
249
+ | Security Reviewer | Todas | — (gate pós-dev) | Opus |
250
+
251
+ Perfis em `.claude/agents/` — editáveis pelo time pra ajustar stack
252
+ específica do projeto (ex: Node.js em vez de .NET, Angular em vez de React).
253
+
254
+ ## Backends plugáveis (adapters)
255
+
256
+ Arquitetura de **adapter layer** via `sfw.config.yml`. Skills não conhecem
257
+ Confluence ou filesystem — chamam uma interface padrão. Novos backends
258
+ entram como plugins sem tocar o pipeline.
259
+
260
+ **Built-in**:
261
+ - **`FilesystemAdapter`** — zero dependência externa. Ideal pra times
262
+ offline, testes automatizados (mock natural), ou diretório compartilhado.
263
+ - **`ConfluenceAdapter`** — via MCP Atlassian. Conflict detection client-side.
264
+ PM edita Input no Confluence, agent auto-publica Output (PRD/TRD/Progresso)
265
+ após cada skill.
266
+
267
+ **Roadmap**: `NotionAdapter`, `JIRAAdapter`, `SharePointAdapter`,
268
+ `GitHubIssuesAdapter` (formalizados quando surgir 3º caso real).
269
+
270
+ Setup do Confluence:
271
+ ```
272
+ /mcp confluence
273
+ ```
274
+ Guia o setup interativo (space key, parent IDs, credenciais gitignored).
275
+
276
+ ## Troubleshooting
277
+
278
+ | Problema | Solução |
279
+ |----------|---------|
280
+ | `/sfw-start` reclama que pasta Input está vazia | Verifique que há pelo menos 1 arquivo em `workspace/Input/<scope>/` |
281
+ | Pipeline trava em ambiguidade | PRD §12 ou TRD §10 têm linhas sem resposta. Preencher coluna "Resposta" e rodar `/design` de novo |
282
+ | PM quer mudar algo depois do PRD aprovado | Criar `workspace/Input/<scope>/ajustes_v1.md` e rodar `/extract` → merge aditivo preserva IDs |
283
+ | `/publish` não envia TRD pro Confluence | Verificar `publishes: [PRD, TRD, Progresso]` no `sfw.config.yml` |
284
+ | Coder pede algo que não está nas specs/ | Não é bug — é feature. Significa que spec ficou incompleto. Completar via `/extract` e re-rodar `/design` |
285
+ | Security Review bloqueia merge | CRÍTICO/ALTO são bloqueantes. MÉDIO/BAIXO são recomendações. Ver `agents/security-reviewer.md` |
286
+
287
+ ## Links
288
+
289
+ - **Repositório**: [gustavomaritan-labs/spec-first-workflow](https://github.com/gustavomaritan-labs/spec-first-workflow)
290
+ - **Kit Copilot** (equivalente pra GitHub Copilot): [spec-first-copilot](https://www.npmjs.com/package/spec-first-copilot)
291
+ - **Apresentação do pipeline**: [apresentacao.html](https://github.com/gustavomaritan-labs/spec-first-workflow/blob/main/packages/apresentacao.html)
292
+ - **Issues**: [github.com/.../issues](https://github.com/gustavomaritan-labs/spec-first-workflow/issues)
293
+
294
+ ## Licença
295
+
296
+ MIT © [Gustavo Maritan](https://github.com/GustavoMaritan)
package/bin/cli.js CHANGED
@@ -1,70 +1,70 @@
1
1
  #!/usr/bin/env node
2
-
3
- const path = require('path');
4
- const { init } = require('../lib/init');
5
- const { update } = require('../lib/update');
6
-
7
- const args = process.argv.slice(2);
8
- const command = args[0];
9
-
10
- function printUsage() {
11
- console.log('Uso:');
12
- console.log(' spec-first-claude init --name=<nome-do-projeto> [--target=<caminho>]');
13
- console.log(' spec-first-claude update [--target=<caminho>] [--force]');
14
- console.log('');
15
- console.log('Comandos:');
16
- console.log(' init Cria um novo projeto spec-first');
17
- console.log(' update Atualiza projeto existente com arquivos novos do framework');
18
- console.log(' (adiciona faltantes, atualiza commands/adapters/agents/templates)');
19
- console.log('');
20
- console.log('Opções:');
21
- console.log(' --name=<nome> Nome do projeto (obrigatório no init)');
22
- console.log(' --target=<path> Diretório destino (default: ./<nome> no init, cwd no update)');
23
- console.log(' --force Força atualizar TODOS arquivos, não só os do framework (cuidado)');
24
- }
25
-
26
- function parseArgs(args) {
27
- const parsed = { flags: [] };
28
- for (const arg of args) {
29
- const match = arg.match(/^--(\w+)=(.+)$/);
30
- if (match) {
31
- parsed[match[1]] = match[2];
32
- } else if (arg.startsWith('--')) {
33
- parsed.flags.push(arg.slice(2));
34
- }
35
- }
36
- return parsed;
37
- }
38
-
39
- if (command === 'init') {
40
- const opts = parseArgs(args.slice(1));
41
-
42
- if (!opts.name) {
43
- console.error('Erro: --name é obrigatório.\n');
44
- printUsage();
45
- process.exit(1);
46
- }
47
-
48
- const templatesDir = path.join(__dirname, '..', 'templates');
49
-
50
- init({
51
- name: opts.name,
52
- templatesDir,
53
- targetDir: opts.target || undefined,
54
- });
55
- } else if (command === 'update') {
56
- const opts = parseArgs(args.slice(1));
57
- const templatesDir = path.join(__dirname, '..', 'templates');
58
-
59
- update({
60
- templatesDir,
61
- targetDir: opts.target || undefined,
62
- force: opts.flags.includes('force'),
63
- });
64
- } else {
65
- printUsage();
66
- if (command) {
67
- console.error(`\nComando desconhecido: "${command}"`);
68
- }
69
- process.exit(command ? 1 : 0);
70
- }
2
+
3
+ const path = require('path');
4
+ const { init } = require('../lib/init');
5
+ const { update } = require('../lib/update');
6
+
7
+ const args = process.argv.slice(2);
8
+ const command = args[0];
9
+
10
+ function printUsage() {
11
+ console.log('Uso:');
12
+ console.log(' spec-first-claude init --name=<nome-do-projeto> [--target=<caminho>]');
13
+ console.log(' spec-first-claude update [--target=<caminho>] [--force]');
14
+ console.log('');
15
+ console.log('Comandos:');
16
+ console.log(' init Cria um novo projeto spec-first');
17
+ console.log(' update Atualiza projeto existente com arquivos novos do framework');
18
+ console.log(' (adiciona faltantes, atualiza commands/adapters/agents/templates)');
19
+ console.log('');
20
+ console.log('Opções:');
21
+ console.log(' --name=<nome> Nome do projeto (obrigatório no init)');
22
+ console.log(' --target=<path> Diretório destino (default: ./<nome> no init, cwd no update)');
23
+ console.log(' --force Força atualizar TODOS arquivos, não só os do framework (cuidado)');
24
+ }
25
+
26
+ function parseArgs(args) {
27
+ const parsed = { flags: [] };
28
+ for (const arg of args) {
29
+ const match = arg.match(/^--(\w+)=(.+)$/);
30
+ if (match) {
31
+ parsed[match[1]] = match[2];
32
+ } else if (arg.startsWith('--')) {
33
+ parsed.flags.push(arg.slice(2));
34
+ }
35
+ }
36
+ return parsed;
37
+ }
38
+
39
+ if (command === 'init') {
40
+ const opts = parseArgs(args.slice(1));
41
+
42
+ if (!opts.name) {
43
+ console.error('Erro: --name é obrigatório.\n');
44
+ printUsage();
45
+ process.exit(1);
46
+ }
47
+
48
+ const templatesDir = path.join(__dirname, '..', 'templates');
49
+
50
+ init({
51
+ name: opts.name,
52
+ templatesDir,
53
+ targetDir: opts.target || undefined,
54
+ });
55
+ } else if (command === 'update') {
56
+ const opts = parseArgs(args.slice(1));
57
+ const templatesDir = path.join(__dirname, '..', 'templates');
58
+
59
+ update({
60
+ templatesDir,
61
+ targetDir: opts.target || undefined,
62
+ force: opts.flags.includes('force'),
63
+ });
64
+ } else {
65
+ printUsage();
66
+ if (command) {
67
+ console.error(`\nComando desconhecido: "${command}"`);
68
+ }
69
+ process.exit(command ? 1 : 0);
70
+ }