spec-first-copilot 0.7.0-beta.1 → 0.7.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 (55) hide show
  1. package/README.md +252 -167
  2. package/bin/cli.js +70 -70
  3. package/lib/init.js +92 -92
  4. package/lib/update.js +132 -132
  5. package/package.json +1 -1
  6. package/templates/.ai/memory/napkin.md +68 -68
  7. package/templates/.github/CHANGELOG.md +560 -533
  8. package/templates/.github/adapters/SETUP.md +314 -314
  9. package/templates/.github/adapters/confluence.md +295 -295
  10. package/templates/.github/adapters/errors.md +234 -234
  11. package/templates/.github/adapters/filesystem.md +353 -353
  12. package/templates/.github/adapters/interface.md +301 -301
  13. package/templates/.github/adapters/naming.md +241 -241
  14. package/templates/.github/adapters/registry.md +244 -244
  15. package/templates/.github/agents/backend-coder.md +215 -215
  16. package/templates/.github/agents/db-coder.md +165 -165
  17. package/templates/.github/agents/doc-writer.md +66 -66
  18. package/templates/.github/agents/frontend-coder.md +222 -222
  19. package/templates/.github/agents/infra-coder.md +341 -341
  20. package/templates/.github/agents/reviewer.md +99 -99
  21. package/templates/.github/agents/security-reviewer.md +153 -153
  22. package/templates/.github/copilot-instructions.md +272 -272
  23. package/templates/.github/instructions/docs.instructions.md +147 -145
  24. package/templates/.github/instructions/sensitive-files.instructions.md +32 -32
  25. package/templates/.github/rules.md +229 -229
  26. package/templates/.github/scripts/bootstrap-confluence.js +289 -289
  27. package/templates/.github/skills/sf-design/SKILL.md +161 -161
  28. package/templates/.github/skills/sf-dev/SKILL.md +204 -204
  29. package/templates/.github/skills/sf-discovery/SKILL.md +415 -415
  30. package/templates/.github/skills/sf-extract/SKILL.md +225 -225
  31. package/templates/.github/skills/sf-load/SKILL.md +296 -296
  32. package/templates/.github/skills/sf-mcp/SKILL.md +386 -386
  33. package/templates/.github/skills/sf-merge-docs/SKILL.md +152 -152
  34. package/templates/.github/skills/sf-plan/SKILL.md +152 -152
  35. package/templates/.github/skills/sf-publish/SKILL.md +144 -144
  36. package/templates/.github/skills/sf-session-finish/SKILL.md +93 -93
  37. package/templates/.github/skills/sf-start/SKILL.md +192 -192
  38. package/templates/.github/templates/estrutura/apiContracts.template.md +160 -159
  39. package/templates/.github/templates/estrutura/architecture.template.md +169 -168
  40. package/templates/.github/templates/estrutura/conventions.template.md +214 -212
  41. package/templates/.github/templates/estrutura/decisions.template.md +107 -107
  42. package/templates/.github/templates/estrutura/domain.template.md +161 -160
  43. package/templates/.github/templates/feature/PRD.template.md +279 -279
  44. package/templates/.github/templates/feature/Progresso.template.md +141 -141
  45. package/templates/.github/templates/feature/TRD.template.md +358 -358
  46. package/templates/.github/templates/feature/context.template.md +89 -89
  47. package/templates/.github/templates/feature/extract-log.template.md +49 -49
  48. package/templates/.github/templates/feature/projetos.template.yaml +79 -79
  49. package/templates/.github/templates/global/progresso_global.template.md +59 -57
  50. package/templates/.github/templates/specs/brief.template.md +66 -66
  51. package/templates/.github/templates/specs/contracts.template.md +147 -147
  52. package/templates/.github/templates/specs/scenarios.template.md +125 -125
  53. package/templates/.github/templates/specs/tasks.template.md +65 -65
  54. package/templates/_gitignore +35 -35
  55. package/templates/sfw.config.yml.example +147 -147
package/README.md CHANGED
@@ -1,167 +1,252 @@
1
- # spec-first-copilot
2
-
3
- Kit completo para desenvolvimento **spec-first** com [GitHub Copilot](https://github.com/features/copilot). 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
- - **GitHub Copilot** com acesso a Copilot Chat
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-copilot
36
- ```
37
-
38
- ## Uso
39
-
40
- ```bash
41
- spec-first-copilot 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
- ├── .github/ <- AI OPERATIONAL CONFIG
50
- │ ├── copilot-instructions.md <- Regras globais pro agente
51
- │ ├── rules.md <- Regras de desenvolvimento
52
- │ ├── CHANGELOG.md <- Historico do framework
53
- │ ├── instructions/ <- Regras por contexto
54
- │ ├── templates/ <- Templates do workflow
55
- │ │ ├── feature/ <- PRD, SDD, context, extract-log, Progresso, backlog, projetos.yaml
56
- │ │ ├── specs/ <- brief, contracts, scenarios, tasks (projecoes pro agent)
57
- │ │ ├── estrutura/ <- 5 templates de sintese cross-feature
58
- │ │ └── global/ <- Progresso global
59
- │ ├── adapters/ <- SourceAdapter + ConfluenceAdapter + FilesystemAdapter
60
- │ ├── skills/ <- 11 skills do workflow
61
- │ │ ├── sf-mcp/
62
- │ │ ├── sf-load/
63
- │ │ ├── sf-publish/
64
- │ │ ├── sf-start/ <- entrada unica (substitui sf-new-project + sf-feature)
65
- │ │ ├── sf-discovery/
66
- │ │ ├── sf-extract/
67
- │ │ ├── sf-design/
68
- │ │ ├── sf-plan/
69
- │ │ ├── sf-dev/
70
- │ │ ├── sf-merge-docs/ <- renomeado de sf-merge-delta
71
- │ │ └── sf-session-finish/
72
- │ └── agents/ <- 7 agentes especializados
73
- │ ├── backend-coder.md <- .NET 8 / C#
74
- │ ├── frontend-coder.md <- React
75
- │ ├── db-coder.md <- PostgreSQL
76
- │ ├── infra-coder.md <- Docker
77
- │ ├── doc-writer.md <- Documentacao
78
- │ ├── reviewer.md <- Code review
79
- │ └── security-reviewer.md <- Auditoria de seguranca
80
- ├── docs/ <- SINTESE CROSS-FEATURE (atualizada pelo /sf-merge-docs)
81
- │ ├── architecture.md <- Containers, stack, ambientes, deploy
82
- │ ├── domain.md <- Visao de negocio + modelo de dados
83
- │ ├── conventions.md <- Auth, authz, LGPD, env vars, monitoramento
84
- │ ├── apiContracts.md <- Rotas, paginacao, erros, catalogo de endpoints
85
- │ └── decisions.md <- ADRs (append-only)
86
- ├── specs/ <- AGENT CONTRACTS (projecoes do SDD pro coder)
87
- │ └── {nome}/
88
- │ ├── brief.md <- Problema/Solucao (SDD §1+§2+§10)
89
- │ ├── contracts.md <- Sistema + Áreas tocadas (SDD §3-§7)
90
- │ ├── scenarios.md <- Fluxos/UI/CAs (SDD §5.2+§8+§9)
91
- │ └── tasks.md <- Tabela unica com coluna Area
92
- ├── workspace/ <- TEAM CONTENT
93
- │ ├── Input/ <- Jogue seus insumos aqui (nome livre)
94
- │ │ └── {nome}/ <- ex: app_barbearia, feat_login
95
- │ └── Output/ <- Docs narrativos pro humano (PRD, SDD, Progresso)
96
- ├── sfw.config.yml.example <- Manifesto de adapters (input/output)
97
- └── .gitignore
98
- ```
99
-
100
- ## Como comecar
101
-
102
- 1. Crie o projeto:
103
- ```bash
104
- spec-first-copilot init --name=MeuProjeto
105
- cd MeuProjeto
106
- ```
107
-
108
- 2. Jogue seus insumos em `workspace/Input/<nome>/` qualquer formato.
109
- `<nome>` e livre: `app_barbearia`, `bootstrap`, `feat_login`, `bug_checkout`, etc.
110
- - `.md`, `.txt` (descricoes, requisitos, decisoes)
111
- - `.sql` (modelagem de banco)
112
- - `.csv`, `.xml`, `.html` (dados, configs)
113
- - `.png`, `.jpg`, `.pdf` (telas, diagramas)
114
-
115
- 3. Abra o VS Code com Copilot Chat e rode:
116
- ```
117
- /sf-start <nome>
118
- ```
119
-
120
- 4. O pipeline comeca. A IA detecta automaticamente se e first-run (docs/ ausente)
121
- ou feature (docs/ ja existe). Nao ha skills diferentes pra setup vs feature.
122
-
123
- - Extrai PRD dos seus insumos (pode ser empty em scopes puro-tecnicos)
124
- - Para e pede sua aprovacao
125
- - Depois voce roda `/sf-design`, `/sf-plan`, `/sf-dev` na sequencia
126
-
127
- ## Pipeline completo
128
-
129
- ```
130
- workspace/Input/<nome>/ (seus arquivos)
131
- |
132
- v
133
- /sf-start <nome> --> /sf-extract --> PRD (voce revisa e aprova)
134
- |
135
- v
136
- /sf-design --> SDD + docs/ (first-run: cria 5 arquivos)
137
- (feature: gera só §Área-X + §11 delta)
138
- |
139
- v
140
- /sf-plan --> tasks + Progresso.md
141
- |
142
- v
143
- /sf-dev --> codigo nos repos
144
- + /sf-merge-docs automatico
145
- (aplica §11 em docs/)
146
- ```
147
-
148
- Mesmo comando pra bootstrap e feature — `first_run` e derivado da ausencia/presenca de `docs/`.
149
-
150
- ## Opcoes do CLI
151
-
152
- ```
153
- spec-first-copilot init --name=<nome> [--target=<caminho>]
154
- ```
155
-
156
- | Opcao | Descricao |
157
- |-------|-----------|
158
- | `--name` | Nome do projeto (obrigatorio) |
159
- | `--target` | Diretorio destino (default: `./<nome>`) |
160
-
161
- ## Links
162
-
163
- - [Repositorio](https://github.com/gustavomaritan-labs/spec-first-workflow)
164
-
165
- ## Licenca
166
-
167
- MIT
1
+ # spec-first-copilot
2
+
3
+ [![npm version](https://img.shields.io/npm/v/spec-first-copilot.svg)](https://www.npmjs.com/package/spec-first-copilot)
4
+ [![license](https://img.shields.io/npm/l/spec-first-copilot.svg)](https://github.com/gustavomaritan-labs/spec-first-workflow/blob/main/LICENSE)
5
+ [![node](https://img.shields.io/node/v/spec-first-copilot.svg)](https://nodejs.org)
6
+
7
+ Kit completo de desenvolvimento **spec-first** para [GitHub Copilot](https://github.com/features/copilot).
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/.github/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
+ - [Skills disponíveis](#skills-disponíveis)
24
+ - [Agents especializados](#agents-especializados)
25
+ - [Backends plugáveis (adapters)](#backends-plugáveis-adapters)
26
+ - [Troubleshooting](#troubleshooting)
27
+ - [Links](#links)
28
+
29
+ ---
30
+
31
+ ## Pra quem é isso
32
+
33
+ Você gerencia projetos onde PMs/POs entregam requisitos em formatos
34
+ heterogêneos (docs no Confluence, SQLs de modelagem, wireframes, notas
35
+ dispersas) e quer que o desenvolvimento assistido por IA siga um processo
36
+ previsível. Sem "a IA adivinhou" — com specs aprovadas antes de uma linha
37
+ de código.
38
+
39
+ **Use-cases cobertos**:
40
+ - Bootstrap de projeto novo (define stack + arquitetura + primeiras features)
41
+ - Features novas em projeto existente (merge aditivo em docs cross-feature)
42
+ - Bugs e tasks técnicas (mesmo pipeline, escopo menor)
43
+ - Times multi-dev (contratos firmes via `specs/` + `projetos.yaml`)
44
+
45
+ ## O que você ganha
46
+
47
+ | Benefício | Como entrega |
48
+ |-----------|--------------|
49
+ | **Spec-first rígido** | Nenhum código sem PRD/TRD aprovados + `specs/` gerado |
50
+ | **Dois revisores, dois docs** | PM aprova PRD (produto), dev aprova TRD (técnico) |
51
+ | **Rastreabilidade total** | Cada RN, ADR, endpoint, task aponta pro insumo-fonte via hash SHA-256 |
52
+ | **Security by default** | Security Reviewer audita 6 categorias pós-dev (Auth, AuthZ, Injeção, PII, Headers, Banco) |
53
+ | **Backend-agnóstico** | Rode local (filesystem) ou sincronize com Confluence via MCP |
54
+ | **Multi-repo nativo** | `projetos.yaml` mapeia serviços → repos; cada repo com branch/PR próprio |
55
+ | **Entregáveis contínuos** | Features obrigatoriamente faseadas (P1/P2/P3) nunca "tudo ou nada" |
56
+ | **Re-executável** | Toda skill pode rodar de novo; hashes detectam incremental |
57
+
58
+ ## Instalação
59
+
60
+ ```bash
61
+ npm i -g spec-first-copilot
62
+ ```
63
+
64
+ **Pré-requisitos**: Node.js 18+, Git, [GitHub Copilot](https://github.com/features/copilot) com acesso a Copilot Chat.
65
+
66
+ **Windows (PowerShell)** — se o CLI não rodar por política de execução:
67
+ ```powershell
68
+ Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned
69
+ ```
70
+
71
+ ## Primeiros passos
72
+
73
+ ```bash
74
+ # 1. Criar o projeto
75
+ spec-first-copilot init --name=MeuProjeto
76
+ cd MeuProjeto
77
+
78
+ # 2. Jogar insumos brutos (qualquer formato)
79
+ # em workspace/Input/<nome>/
80
+ # Ex: workspace/Input/app_barbearia/visao.md + modelo.sql + decisoes.md
81
+
82
+ # 3. Abrir com VS Code + Copilot Chat e iniciar o pipeline
83
+ # /sf-start app_barbearia
84
+ ```
85
+
86
+ **Opções do CLI**:
87
+
88
+ | Opção | Descrição |
89
+ |-------|-----------|
90
+ | `--name` | Nome do projeto (obrigatório) |
91
+ | `--target` | Diretório destino (default: `./<name>`) |
92
+
93
+ ## Estrutura gerada
94
+
95
+ ```
96
+ MeuProjeto/
97
+ ├── .ai/memory/napkin.md <- Memória persistente (curada continuamente)
98
+ ├── .github/ <- AI OPERATIONAL CONFIG
99
+ │ ├── copilot-instructions.md <- Meta-regras pro agente
100
+ │ ├── rules.md <- Regras invioláveis + quality gate
101
+ │ ├── CHANGELOG.md <- Histórico do framework
102
+ │ ├── instructions/ <- Regras por contexto (docs, arquivos sensíveis)
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
+ ├── skills/ <- 11 skills do workflow (ver tabela abaixo)
110
+ └── agents/ <- 7 perfis especializados (ver tabela abaixo)
111
+ ├── docs/ <- SÍNTESE CROSS-FEATURE (atualizada pelo /sf-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 /sf-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
+ └── .gitignore
136
+ ```
137
+
138
+ **Três zonas, zero ambiguidade**:
139
+ - `.github/` + `.ai/` → config operacional + memória (time edita raro)
140
+ - `docs/` → síntese cross-feature (atualizada pelo `/sf-merge-docs`)
141
+ - `workspace/` → content compartilhável (Input = time, Output = workflow)
142
+
143
+ ## Pipeline passo a passo
144
+
145
+ ```
146
+ workspace/Input/<scope>/ (seus arquivos)
147
+
148
+
149
+ /sf-start <scope> ──▶ /sf-load ──▶ /sf-discovery ──▶ /sf-extract
150
+
151
+
152
+ PRD + TRD gerados
153
+
154
+ ┌──────── CHECKPOINT DUPLO ────────┐
155
+ │ PM aprova PRD | dev aprova TRD │
156
+ └──────────────────────────────────┘
157
+
158
+
159
+ /sf-design ──▶ specs/ (sempre)
160
+ docs/ + projetos.yaml (first-run)
161
+
162
+
163
+ /sf-plan ──▶ tasks.md + Progresso.md
164
+
165
+
166
+ /sf-dev ──▶ código nos repos
167
+ + Security Review
168
+ + /sf-merge-docs automático
169
+ (diff PRD+TRD ↔ docs/)
170
+ ```
171
+
172
+ Mesmo comando pra bootstrap e feature — `first_run` é derivado da
173
+ ausência/presença de `docs/`.
174
+
175
+ **Apresentação visual**: abra
176
+ [`apresentacao.html`](https://github.com/gustavomaritan-labs/spec-first-workflow/blob/main/packages/apresentacao.html)
177
+ pra ver o fluxo completo com personas, artefatos e adapters.
178
+
179
+ ## Skills disponíveis
180
+
181
+ | Skill | Tipo | Função |
182
+ |-------|------|--------|
183
+ | `/sf-mcp <provider>` | Setup | Configura backend externo (Confluence). Cria `.mcp.json` + `sfw.config.yml` |
184
+ | `/sf-load <scope>` | Utilitária | Puxa Input do backend (incremental via hash) |
185
+ | `/sf-publish <scope> <tipo>` | Utilitária | Publica PRD/TRD/Progresso nos targets. Auto-chamada por extract/plan |
186
+ | `/sf-start <scope>` | Orquestrador | Entrada única. Cria `.context.md`, chama `/sf-load` + `/sf-discovery` + `/sf-extract` |
187
+ | `/sf-discovery <path>` | Atômica | Análise profunda prévia dos insumos (obrigatório em v4) |
188
+ | `/sf-extract <scope>` | Atômica | Gera PRD e/ou TRD conforme conteúdo dos insumos |
189
+ | `/sf-design <scope>` | Atômica | PRD+TRD aprovados → `specs/`. First-run também cria `docs/` + `projetos.yaml` |
190
+ | `/sf-plan <scope>` | Atômica | Lê PRD + TRD + specs/ → tasks por área + Progresso.md |
191
+ | `/sf-dev <scope>` | Atômica | Implementa tasks com loop (implement → test → review). Merge-docs automático no fim |
192
+ | `/sf-merge-docs <scope>` | Atômica | Diff semântico PRD+TRD ↔ docs/ → atualiza síntese cross-feature |
193
+ | `/sf-session-finish` | Utilitária | Encerra sessão: salva estado, atualiza napkin, gera retomada.md |
194
+
195
+ ## Agents especializados
196
+
197
+ | Agent | Área | Stack padrão | Modelo |
198
+ |-------|------|--------------|--------|
199
+ | Backend Coder | BACK | .NET 8 / C# (editável) | Sonnet (S/M) · Opus (L) |
200
+ | Frontend Coder | FRONT | React + Fusion (editável) | Sonnet (S/M) · Opus (L) |
201
+ | DB Coder | DB | PostgreSQL 16 (editável) | Sonnet (S/M) · Opus (L) |
202
+ | Infra Coder | INFRA | Docker | Sonnet (S/M) · Opus (L) |
203
+ | Doc Writer | DOC | — | Sonnet |
204
+ | Reviewer | Todas | — (quality gate) | Sonnet |
205
+ | Security Reviewer | Todas | — (gate pós-dev) | Opus |
206
+
207
+ Perfis em `.github/agents/` — editáveis pelo time pra ajustar stack
208
+ específica do projeto (ex: Node.js em vez de .NET, Angular em vez de React).
209
+
210
+ ## Backends plugáveis (adapters)
211
+
212
+ Arquitetura de **adapter layer** via `sfw.config.yml`. Skills não conhecem
213
+ Confluence ou filesystem — chamam uma interface padrão. Novos backends
214
+ entram como plugins sem tocar o pipeline.
215
+
216
+ **Built-in**:
217
+ - **`FilesystemAdapter`** — zero dependência externa. Ideal pra times
218
+ offline, testes automatizados (mock natural), ou diretório compartilhado.
219
+ - **`ConfluenceAdapter`** — via MCP Atlassian. Conflict detection client-side.
220
+ PM edita Input no Confluence, agent auto-publica Output (PRD/TRD/Progresso)
221
+ após cada skill.
222
+
223
+ **Roadmap**: `NotionAdapter`, `JIRAAdapter`, `SharePointAdapter`,
224
+ `GitHubIssuesAdapter` (formalizados quando surgir 3º caso real).
225
+
226
+ Setup do Confluence:
227
+ ```
228
+ /sf-mcp confluence
229
+ ```
230
+ Guia o setup interativo (space key, parent IDs, credenciais gitignored).
231
+
232
+ ## Troubleshooting
233
+
234
+ | Problema | Solução |
235
+ |----------|---------|
236
+ | `/sf-start` reclama que pasta Input está vazia | Verifique que há pelo menos 1 arquivo em `workspace/Input/<scope>/` |
237
+ | Pipeline trava em ambiguidade | PRD §12 ou TRD §10 têm linhas sem resposta. Preencher coluna "Resposta" e rodar `/sf-design` de novo |
238
+ | PM quer mudar algo depois do PRD aprovado | Criar `workspace/Input/<scope>/ajustes_v1.md` e rodar `/sf-extract` → merge aditivo preserva IDs |
239
+ | `/sf-publish` não envia TRD pro Confluence | Verificar `publishes: [PRD, TRD, Progresso]` no `sfw.config.yml` |
240
+ | Coder pede algo que não está nas specs/ | Não é bug — é feature. Significa que spec ficou incompleto. Completar via `/sf-extract` e re-rodar `/sf-design` |
241
+ | Security Review bloqueia merge | CRÍTICO/ALTO são bloqueantes. MÉDIO/BAIXO são recomendações. Ver `agents/security-reviewer.md` |
242
+
243
+ ## Links
244
+
245
+ - **Repositório**: [gustavomaritan-labs/spec-first-workflow](https://github.com/gustavomaritan-labs/spec-first-workflow)
246
+ - **Kit Claude** (equivalente pra Claude Code): [spec-first-claude](https://www.npmjs.com/package/spec-first-claude)
247
+ - **Apresentação do pipeline**: [apresentacao.html](https://github.com/gustavomaritan-labs/spec-first-workflow/blob/main/packages/apresentacao.html)
248
+ - **Issues**: [github.com/.../issues](https://github.com/gustavomaritan-labs/spec-first-workflow/issues)
249
+
250
+ ## Licença
251
+
252
+ MIT © [Gustavo Maritan](https://github.com/GustavoMaritan)
package/bin/cli.js CHANGED
@@ -1,70 +1,70 @@
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-copilot init --name=<nome-do-projeto> [--target=<caminho>]');
13
- console.log(' spec-first-copilot 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 skills/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
- }
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-copilot init --name=<nome-do-projeto> [--target=<caminho>]');
13
+ console.log(' spec-first-copilot 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 skills/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
+ }