spec-first-claude 0.5.0-beta.3 → 0.5.0-beta.5

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/lib/init.js CHANGED
@@ -62,8 +62,8 @@ function init({ name, templatesDir, targetDir }) {
62
62
  console.log(`\nDone! Project "${name}" is ready.`);
63
63
  console.log('\nNext steps:');
64
64
  console.log(` 1. cd ${name}`);
65
- console.log(' 2. Add your input files to workspace/Input/setup_projeto/');
66
- console.log(' 3. Run /setup-projeto to start the pipeline');
65
+ console.log(' 2. Create a folder in workspace/Input/ with your project files (e.g. workspace/Input/my_app/)');
66
+ console.log(' 3. Run /new-project <folder-name> to start the pipeline');
67
67
  console.log('');
68
68
  }
69
69
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "spec-first-claude",
3
- "version": "0.5.0-beta.3",
3
+ "version": "0.5.0-beta.5",
4
4
  "description": "Spec-first workflow kit for Claude Code — AI-driven development with specs, not guesswork",
5
5
  "bin": {
6
6
  "spec-first-claude": "bin/cli.js"
@@ -0,0 +1,287 @@
1
+ # Adapter Setup Guide
2
+
3
+ > Guia passo a passo para configurar os adapters do SFW.
4
+ > Se o usuário pedir ajuda pra configurar, siga este guia.
5
+
6
+ ---
7
+
8
+ ## Escolha seu modo de trabalho
9
+
10
+ O SFW funciona em **3 modos**, configurados no `sfw.config.yml`:
11
+
12
+ | Modo | Input | Output | Quando usar |
13
+ |------|-------|--------|-------------|
14
+ | **Full Confluence** | `adapter: confluence` | `mode: auto` | Time usa Confluence, PM publica lá, quer artefatos lá |
15
+ | **Confluence só leitura** | `adapter: confluence` | `mode: off` | PM publica no Confluence, mas artefatos ficam só local |
16
+ | **100% local** | `adapter: filesystem` | `mode: off` | Time sem Confluence, tudo no disco |
17
+
18
+ Para mudar: edite `sfw.config.yml` e ajuste `input.adapter` e `output.targets[].mode`.
19
+
20
+ ---
21
+
22
+ ## Setup 1: Confluence (Full ou só leitura)
23
+
24
+ ### Pré-requisitos
25
+
26
+ - Python 3.10+ instalado
27
+ - Conta Atlassian com acesso ao Confluence Cloud
28
+ - Claude Code instalado
29
+
30
+ ### Passo 1 — Instalar uvx
31
+
32
+ `uvx` é o runtime que executa o MCP server do Confluence.
33
+
34
+ ```bash
35
+ # Windows (PowerShell)
36
+ pip install uv
37
+
38
+ # Mac/Linux
39
+ pip install uv
40
+ # ou
41
+ brew install uv
42
+ ```
43
+
44
+ Verificar:
45
+ ```bash
46
+ uvx --version
47
+ ```
48
+
49
+ ### Passo 2 — Gerar API Token Atlassian
50
+
51
+ 1. Acesse: https://id.atlassian.com/manage-profile/security/api-tokens
52
+ 2. Clique **Create API token**
53
+ 3. Nome: `sfw-mcp` (ou qualquer nome descritivo)
54
+ 4. Copie o token gerado — **ele só aparece uma vez**
55
+
56
+ Você vai precisar de:
57
+ - **Email**: seu email da conta Atlassian (ex: `dev@empresa.com`)
58
+ - **Token**: o token que acabou de copiar
59
+ - **URL do Confluence**: geralmente `https://sua-empresa.atlassian.net/wiki`
60
+
61
+ ### Passo 3 — Criar `.mcp.json`
62
+
63
+ Crie o arquivo `.mcp.json` na **raiz do projeto** (onde está o `sfw.config.yml`).
64
+
65
+ ```json
66
+ {
67
+ "mcpServers": {
68
+ "atlassian": {
69
+ "command": "uvx",
70
+ "args": ["mcp-atlassian"],
71
+ "env": {
72
+ "CONFLUENCE_URL": "https://sua-empresa.atlassian.net/wiki",
73
+ "CONFLUENCE_USERNAME": "seu-email@empresa.com",
74
+ "CONFLUENCE_API_TOKEN": "seu-token-aqui"
75
+ }
76
+ }
77
+ }
78
+ }
79
+ ```
80
+
81
+ **IMPORTANTE — Gotchas aprendidos na prática:**
82
+
83
+ 1. **Credenciais HARDCODED no arquivo** — `${VAR}` com variáveis de ambiente **NÃO funciona** no startup do Claude Code. Coloque os valores direto.
84
+
85
+ 2. **`.mcp.json` DEVE estar no `.gitignore`** — tem credenciais. O template do kit já inclui isso, mas verifique:
86
+ ```
87
+ # .gitignore
88
+ .mcp.json
89
+ ```
90
+
91
+ 3. **Após criar/editar `.mcp.json`, REINICIE o Claude Code** — servers MCP só são carregados no startup. Mudança no arquivo não tem efeito em sessão ativa.
92
+
93
+ 4. **Primeira execução baixa ~118 dependências** — o pacote `mcp-atlassian` é pesado. A primeira vez pode demorar 1-2 minutos. As seguintes são instantâneas.
94
+
95
+ ### Passo 4 — Descobrir seu Space Key
96
+
97
+ O Space Key é o identificador curto do espaço Confluence (ex: `ST`, `DEV`, `PROJ`).
98
+
99
+ Para encontrar:
100
+ - Abra qualquer página do seu espaço Confluence
101
+ - Olhe a URL: `https://empresa.atlassian.net/wiki/spaces/ST/pages/...`
102
+ - O `ST` é o Space Key
103
+
104
+ ### Passo 5 — Criar estrutura no Confluence
105
+
106
+ Crie manualmente no Confluence (ou peça pro PM criar):
107
+
108
+ ```
109
+ {Seu Space}
110
+ └── {Nome do Projeto} ← page raiz do projeto
111
+ ├── Input ← PM coloca insumos aqui
112
+ │ └── (scopes como pages filhas)
113
+ └── Output ← agent publica aqui (não editar manualmente)
114
+ ```
115
+
116
+ Anote os **Page IDs** de `Input` e `Output`:
117
+ - Abra a page → ... (menu) → Page information → o ID está na URL
118
+ - Ou: URL da page contém `/pages/123456/...` — o número é o Page ID
119
+
120
+ ### Passo 6 — Configurar `sfw.config.yml`
121
+
122
+ Copie o `sfw.config.yml.example` pra `sfw.config.yml` e preencha:
123
+
124
+ ```yaml
125
+ project:
126
+ name: "Meu Projeto"
127
+
128
+ naming:
129
+ output_container: "out_{scope}"
130
+ output_artifact: "{scope} - {type}"
131
+
132
+ input:
133
+ adapter: confluence
134
+ config:
135
+ space_key: "ST" # ← seu Space Key
136
+ parent_page_id: "360668" # ← Page ID da page Input
137
+ recursive: true
138
+ include_attachments: true
139
+ cache:
140
+ local_dir: "workspace/Input/"
141
+ log: ".ai/load-log.md"
142
+ incremental: true
143
+
144
+ output:
145
+ targets:
146
+ - name: confluence-mirror
147
+ adapter: confluence
148
+ config:
149
+ space_key: "ST" # ← mesmo Space Key
150
+ parent_page_id: "294931" # ← Page ID da page Output
151
+ publishes: [PRD, TRD, SDD, Progresso]
152
+ mode: auto # ← auto | manual | off
153
+ conflict_detection: version
154
+ approval_mechanism: label
155
+ approval_label: "sfw-approved"
156
+ ```
157
+
158
+ ### Passo 7 — Testar a conexão
159
+
160
+ Após reiniciar o Claude Code com o `.mcp.json` configurado, peça ao agent:
161
+
162
+ ```
163
+ Teste a conexão com o Confluence: liste as páginas filhas de {Page ID do Input}
164
+ ```
165
+
166
+ O agent deve conseguir usar `confluence_get_page_children` e listar o conteúdo.
167
+ Se der erro de auth → verifique email, token e URL no `.mcp.json`.
168
+ Se o MCP não estiver disponível → reinicie o Claude Code.
169
+
170
+ ---
171
+
172
+ ## Setup 2: 100% Local (sem Confluence)
173
+
174
+ Nenhuma instalação extra necessária. Não precisa de `.mcp.json`.
175
+
176
+ ### Passo 1 — Configurar `sfw.config.yml`
177
+
178
+ ```yaml
179
+ project:
180
+ name: "Meu Projeto"
181
+
182
+ naming:
183
+ output_container: "out_{scope}"
184
+ output_artifact: "{type}" # sem {scope} no nome — sem risco de colisão local
185
+
186
+ input:
187
+ adapter: filesystem
188
+ config:
189
+ root_path: "workspace/Input"
190
+ cache:
191
+ local_dir: "workspace/Input/"
192
+ log: ".ai/load-log.md"
193
+ incremental: true
194
+
195
+ output:
196
+ targets:
197
+ - name: local
198
+ adapter: filesystem
199
+ config:
200
+ root_path: "workspace/Output"
201
+ publishes: [PRD, TRD, SDD, Progresso]
202
+ mode: auto
203
+ conflict_detection: hash
204
+ approval_mechanism: none
205
+ ```
206
+
207
+ ### Passo 2 — Criar pastas de Input
208
+
209
+ ```bash
210
+ mkdir -p workspace/Input/meu_escopo
211
+ # Adicione seus arquivos de insumo na pasta
212
+ ```
213
+
214
+ Pronto. `/new-project meu_escopo` funciona direto.
215
+
216
+ ---
217
+
218
+ ## Ligar e desligar Confluence (sem mudar nada estrutural)
219
+
220
+ ### Desligar output pro Confluence (manter input)
221
+
222
+ Mude `mode` no target:
223
+
224
+ ```yaml
225
+ output:
226
+ targets:
227
+ - name: confluence-mirror
228
+ mode: off # ← era "auto", agora "off"
229
+ ```
230
+
231
+ Pipeline roda normal, artefatos ficam locais. Quando quiser religar, volte pra `auto`.
232
+
233
+ ### Desligar tudo (input + output) — virar 100% local
234
+
235
+ Mude o adapter do input:
236
+
237
+ ```yaml
238
+ input:
239
+ adapter: filesystem # ← era "confluence"
240
+ config:
241
+ root_path: "workspace/Input"
242
+ ```
243
+
244
+ E coloque `mode: off` nos targets de Confluence.
245
+
246
+ ### Adicionar Confluence depois (começou local, quer publicar)
247
+
248
+ 1. Siga os passos 1-5 do Setup Confluence
249
+ 2. Adicione o target no `sfw.config.yml`:
250
+ ```yaml
251
+ output:
252
+ targets:
253
+ - name: confluence-mirror
254
+ adapter: confluence
255
+ config:
256
+ space_key: "ST"
257
+ parent_page_id: "294931"
258
+ publishes: [PRD, TRD, SDD, Progresso]
259
+ mode: auto
260
+ ```
261
+ 3. Re-rode `/extract`, `/design`, `/plan` — os artefatos locais serão publicados
262
+
263
+ ---
264
+
265
+ ## Troubleshooting
266
+
267
+ | Problema | Solução |
268
+ |----------|---------|
269
+ | MCP server não aparece no Claude Code | Reiniciar Claude Code. MCP só carrega no startup |
270
+ | `${VAR}` não resolve no `.mcp.json` | Hardcode as credenciais direto. Variáveis de ambiente não funcionam |
271
+ | "401 Unauthorized" | Verifique email + token no `.mcp.json`. Token pode ter expirado |
272
+ | "403 Forbidden" | Usuário sem permissão no space. Pedir acesso ao admin |
273
+ | "Page not found" (404) | Page ID errado. Confirme o ID via URL da page no Confluence |
274
+ | Primeira execução demora muito | Normal — uvx baixa ~118 deps na primeira vez |
275
+ | `BadRequestException: title already exists` | Title duplicado no space (unique per space no Confluence). Renomear o scope no Input |
276
+ | Edição no `.mcp.json` não faz efeito | Reiniciar Claude Code obrigatório |
277
+ | Content no Confluence parece diferente do local | Markdown roundtrip normaliza (`#`→`===`, `-`→`*`). Normal — version number é fonte de verdade, não bytes |
278
+
279
+ ---
280
+
281
+ ## Referências
282
+
283
+ - Interface do adapter: `.claude/adapters/interface.md`
284
+ - ConfluenceAdapter: `.claude/adapters/confluence.md`
285
+ - FilesystemAdapter: `.claude/adapters/filesystem.md`
286
+ - Erros: `.claude/adapters/errors.md`
287
+ - Naming: `.claude/adapters/naming.md`
@@ -0,0 +1,72 @@
1
+ # /new-project <nome>
2
+
3
+ Orquestrador de bootstrap técnico do projeto.
4
+ Cria contexto TRD a partir dos insumos em `workspace/Input/{nome}/`, chama /extract e para no checkpoint de aprovação.
5
+
6
+ Simétrico ao `/feature <nome>` — a diferença é que gera TRD (perfil técnico) em vez de PRD (perfil de produto).
7
+
8
+ ## Argumento
9
+
10
+ `<nome>` = nome do item no Input. O usuário nomeia livremente (ex: `app_barbearia`, `meu_sistema`, `api_pagamentos`). O agent busca `workspace/Input/{nome}/` — se não existir, para com erro.
11
+
12
+ ## Execução
13
+
14
+ Siga EXATAMENTE os passos da skill em ordem. Leia o arquivo completo antes de agir.
15
+
16
+ ### Pré-condições — validar TODAS antes de prosseguir
17
+
18
+ | # | Validação | Se falhar |
19
+ |---|-----------|-----------|
20
+ | 1 | `workspace/Input/{nome}/` existe | Parar → "Crie a pasta workspace/Input/{nome}/ e adicione seus insumos" |
21
+ | 2 | Pasta contém pelo menos 1 arquivo (ignorar .gitkeep) | Parar → "Adicione insumos na pasta (aceitos: .md, .txt, .sql, .xml, .html, .json, .csv, .png, .jpg, .pdf — qualquer formato)" |
22
+ | 3 | `workspace/Output/{nome}/.context.md` não existe ou status é `not_started` | Parar → "Este escopo já está em andamento. Verifique o status em .context.md" |
23
+
24
+ ### Passos
25
+
26
+ 1. Criar `workspace/Output/{nome}/` se não existir
27
+
28
+ 2. Criar `.context.md`:
29
+ ```yaml
30
+ ---
31
+ nome: "{nome}"
32
+ tipo: "project"
33
+ documento: "TRD"
34
+ pm_path: "workspace/Input/{nome}/"
35
+ status: "not_started"
36
+ ultima_skill: "/new-project"
37
+ atualizado_em: "{{ISO_DATETIME}}"
38
+ ---
39
+ ```
40
+
41
+ 3. Sugerir /discovery (RECOMENDADO):
42
+ ```
43
+ Recomendo rodar /discovery antes da extração para análise profunda dos insumos.
44
+ Quer rodar /discovery workspace/Input/{nome}/ agora? (s/n)
45
+ ```
46
+ Se SIM → rodar discovery, salvar discovery.md em workspace/Output/{nome}/
47
+ Se NÃO → pular direto para extract
48
+
49
+ 4. Executar /extract {nome} (seguir o command /extract)
50
+
51
+ 5. CHECKPOINT — Parar e informar:
52
+ ```
53
+ TRD gerado em workspace/Output/{nome}/TRD.md
54
+
55
+ Revise o documento. Quando estiver satisfeito, execute:
56
+ /design {nome}
57
+
58
+ Se precisar adicionar mais insumos, coloque na pasta workspace/Input/{nome}/
59
+ e execute:
60
+ /extract {nome}
61
+ ```
62
+
63
+ **O orquestrador encerra aqui.** Próximos passos do usuário:
64
+ 1. `/design {nome}` (pergunta aprovação → gera SDD + docs/ + projetos.yaml)
65
+ 2. `/plan {nome}` (gera tasks com campo Repo por task)
66
+ 3. `/dev {nome}` (INFRA-001 cria/clona repos em projetos/, executa tasks nos repos corretos)
67
+
68
+ ### Notas
69
+ - docs/ é gerado pelo /design (passo 3), não por tasks DOC
70
+ - `projetos.yaml` é gerado pelo /design (passo 3b) — mapeia serviços para repos
71
+ - Repos são criados/clonados pelo /dev (INFRA-001) dentro de `projetos/`
72
+ - /merge-delta NÃO se aplica ao new-project (é criação, não atualização)
@@ -24,7 +24,7 @@ Verificar que TODOS os 9 commands estão acessíveis:
24
24
 
25
25
  | Command | Caminho |
26
26
  |---------|---------|
27
- | `/setup-projeto` | `.claude/commands/setup-projeto.md` |
27
+ | `/new-project` | `.claude/commands/new-project.md` |
28
28
  | `/feature` | `.claude/commands/feature.md` |
29
29
  | `/discovery` | `.claude/commands/discovery.md` |
30
30
  | `/extract` | `.claude/commands/extract.md` |
@@ -76,7 +76,7 @@ ESTE REPO (projeto-base) = ORQUESTRADOR
76
76
 
77
77
  ```
78
78
  workspace/Input/ (qualquer arquivo)
79
- ↓ /setup-projeto (uma vez) ou /feature (por feature)
79
+ ↓ /new-project <nome> (TRD — bootstrap técnico) ou /feature <nome> (PRD feature)
80
80
  /discovery → análise profunda dos insumos (RECOMENDADO, opcional)
81
81
 
82
82
  /extract → PRD ou TRD em workspace/Output/{nome}/ (checkpoint — usuário revisa e aprova)
@@ -93,7 +93,7 @@ workspace/Input/ (qualquer arquivo)
93
93
 
94
94
  | Command | Tipo | O que faz |
95
95
  |---------|------|-----------|
96
- | `/setup-projeto` | Orquestrador | Bootstrap: cria .context.md, chama /extract, para no checkpoint. Roda UMA vez |
96
+ | `/new-project <nome>` | Orquestrador | Bootstrap técnico: cria .context.md tipo TRD, chama /extract, para no checkpoint |
97
97
  | `/feature <nome>` | Orquestrador | Feature: cria .context.md tipo PRD, chama /extract, para no checkpoint |
98
98
  | `/discovery <path>` | Utilitária | Análise profunda dos insumos (RECOMENDADO antes do /extract) |
99
99
  | `/extract <nome>` | Atômico | Lê workspace/Input/{nome}/ → gera PRD ou TRD. Re-executável para novos insumos |
@@ -166,8 +166,7 @@ specs/ ← AGENT CONTRACTS (projeções do SDD pro coder)
166
166
 
167
167
  workspace/ ← TEAM CONTENT (futuro wiki)
168
168
  ├── Input/ ← Insumos brutos (QUALQUER formato — nunca modificar)
169
- ├── setup_projeto/ Insumos de bootstrap
170
- │ └── feat_*/ ← Insumos por feature
169
+ └── {nome}/ Nomeado livremente pelo usuário (ex: app_barbearia, feat_login)
171
170
  └── Output/ ← Artefatos humanos gerados pelo workflow
172
171
  └── {nome}/
173
172
  ├── PRD.md ou TRD.md ← Requirements (gerado pelo /extract)
@@ -1,68 +0,0 @@
1
- # /setup-projeto
2
-
3
- Orquestrador de bootstrap do projeto. Executa uma única vez.
4
- Cria contexto TRD, chama /extract e para no checkpoint de aprovação.
5
-
6
- ## Execução
7
-
8
- Siga EXATAMENTE os passos da skill em ordem. Leia o arquivo completo antes de agir.
9
-
10
- ### Pré-condições — validar TODAS antes de prosseguir
11
-
12
- | # | Validação | Se falhar |
13
- |---|-----------|-----------|
14
- | 1 | `workspace/Input/setup_projeto/` existe | Parar → "Crie a pasta workspace/Input/setup_projeto/ e adicione seus insumos" |
15
- | 2 | Pasta contém pelo menos 1 arquivo (ignorar .gitkeep) | Parar → "Adicione insumos na pasta (aceitos: .md, .txt, .sql, .xml, .html, .json, .csv, .png, .jpg, .pdf — qualquer formato)" |
16
- | 3 | `docs/` está vazio ou contém apenas .gitkeep | Parar → "Setup já foi executado. Use /feature para novas funcionalidades" |
17
- | 4 | `workspace/Output/setup_projeto/.context.md` não existe ou status é `not_started` | Parar → "Setup já está em andamento. Verifique o status em .context.md" |
18
-
19
- ### Passos
20
-
21
- 1. Criar `workspace/Output/setup_projeto/` se não existir
22
-
23
- 2. Criar `.context.md`:
24
- ```yaml
25
- ---
26
- nome: "setup_projeto"
27
- tipo: "setup"
28
- documento: "TRD"
29
- pm_path: "workspace/Input/setup_projeto/"
30
- status: "not_started"
31
- ultima_skill: "/setup-projeto"
32
- atualizado_em: "{{ISO_DATETIME}}"
33
- ---
34
- ```
35
-
36
- 3. Sugerir /sf-discovery (RECOMENDADO):
37
- ```
38
- 📋 Recomendo rodar /sf-discovery antes da extração para análise profunda dos insumos.
39
- Quer rodar /sf-discovery workspace/Input/setup_projeto/ agora? (s/n)
40
- ```
41
- Se SIM → rodar discovery, salvar discovery.md em workspace/Output/setup_projeto/
42
- Se NÃO → pular direto para extract
43
-
44
- 4. Executar /extract setup_projeto (seguir o command /extract)
45
-
46
- 5. CHECKPOINT — Parar e informar:
47
- ```
48
- ✅ TRD gerado em workspace/Output/setup_projeto/TRD.md
49
-
50
- Revise o documento. Quando estiver satisfeito, execute:
51
- /design setup_projeto
52
-
53
- Se precisar adicionar mais insumos, coloque na pasta workspace/Input/setup_projeto/
54
- e execute:
55
- /extract setup_projeto
56
- ```
57
-
58
- **O orquestrador encerra aqui.** Próximos passos do usuário:
59
- 1. `/design setup_projeto` (pergunta aprovação → gera SDD + docs/ + projetos.yaml)
60
- 2. `/plan setup_projeto` (gera tasks com campo Repo por task)
61
- 3. `/dev setup_projeto` (INFRA-001 cria/clona repos em projetos/, executa tasks nos repos corretos)
62
-
63
- ### Notas
64
- - Esta skill roda UMA ÚNICA VEZ por projeto
65
- - docs/ é gerado pelo /design (passo 3), não por tasks DOC
66
- - `projetos.yaml` é gerado pelo /design (passo 3b) — mapeia serviços para repos
67
- - Repos são criados/clonados pelo /dev (INFRA-001) dentro de `projetos/`
68
- - /merge-delta NÃO se aplica ao setup (é criação, não atualização)
File without changes