spec-first-copilot 0.5.0-beta.15 → 0.5.0-beta.16

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "spec-first-copilot",
3
- "version": "0.5.0-beta.15",
3
+ "version": "0.5.0-beta.16",
4
4
  "description": "Spec-first workflow kit for GitHub Copilot — AI-driven development with specs, not guesswork",
5
5
  "bin": {
6
6
  "spec-first-copilot": "bin/cli.js"
@@ -1,19 +1,18 @@
1
1
  # /sf-mcp <provider>
2
2
 
3
- Setup interativo de backend externo. Pergunta os dados necessários e cria todos os arquivos de configuração.
3
+ Setup interativo de backend externo. Pergunta os dados necessários, descobre a estrutura do projeto e cria todos os arquivos de configuração.
4
4
 
5
5
  ## Providers disponíveis
6
6
 
7
7
  | Provider | O que faz |
8
8
  |----------|-----------|
9
- | `confluence` | Configura MCP Atlassian + `sfw.config.yml` + `.mcp.json` + `.gitignore` |
10
-
11
- Futuros: `notion`, `jira`, `filesystem` (não precisa de MCP, só cria `sfw.config.yml`).
9
+ | `confluence` | Configura MCP Atlassian + descobre projeto + cria `sfw.config.yml` + `.mcp.json` + `.gitignore` |
12
10
 
13
11
  ## Uso
14
12
 
15
13
  ```
16
14
  /sf-mcp confluence
15
+ /sf-mcp confluence test ← só testa conexão
17
16
  ```
18
17
 
19
18
  ---
@@ -36,9 +35,9 @@ Depois rode /sf-mcp confluence novamente.
36
35
  ```
37
36
  **Parar aqui** se uvx não estiver disponível.
38
37
 
39
- ### Passo 2 — Coletar dados do usuário
38
+ ### Passo 2 — Coletar credenciais
40
39
 
41
- Perguntar um por um, com explicação curta:
40
+ Perguntar uma por uma:
42
41
 
43
42
  ```
44
43
  Configurando Confluence para o SFW.
@@ -56,71 +55,133 @@ Configurando Confluence para o SFW.
56
55
  >
57
56
  ```
58
57
 
59
- Após coletar os 4 dados, perguntar sobre a estrutura no Confluence:
58
+ ### Passo 3 Criar `.mcp.json`
59
+
60
+ Verificar se `.mcp.json` já existe:
61
+ - Se existe e já tem entrada `atlassian` → perguntar se quer atualizar
62
+ - Se existe sem `atlassian` → adicionar entrada
63
+ - Se não existe → criar
60
64
 
65
+ ```json
66
+ {
67
+ "mcpServers": {
68
+ "atlassian": {
69
+ "command": "uvx",
70
+ "args": ["mcp-atlassian"],
71
+ "env": {
72
+ "CONFLUENCE_URL": "{url}",
73
+ "CONFLUENCE_USERNAME": "{email}",
74
+ "CONFLUENCE_API_TOKEN": "{token}"
75
+ }
76
+ }
77
+ }
78
+ }
61
79
  ```
62
- 5. Você já tem pages Input e Output criadas no Confluence? (s/n)
80
+
81
+ **IMPORTANTE**: Credenciais hardcoded — `${VAR}` NÃO funciona no Claude Code.
82
+
83
+ ### Passo 4 — Testar conexão e descobrir projeto
84
+
85
+ Testar chamando:
86
+ ```
87
+ mcp__atlassian__confluence_search(query="space.key={space_key}", limit=5)
88
+ ```
89
+ ou
90
+ ```
91
+ mcp__atlassian__confluence_get_page_children(page_id=<root do space>)
63
92
  ```
64
93
 
65
- **Se SIM** — pedir os Page IDs:
94
+ **Se MCP não disponível** (primeira vez `.mcp.json` acabou de ser criado):
66
95
  ```
67
- Page ID da page Input (o número na URL /pages/XXXXX/...):
68
- >
96
+ .mcp.json criado. O Claude Code precisa ser reiniciado para carregar o MCP.
69
97
 
70
- Page ID da page Output:
71
- >
98
+ 1. Reinicie o Claude Code (feche e abra)
99
+ 2. Rode /sf-mcp confluence novamente — vou continuar de onde paramos
72
100
  ```
101
+ **Parar aqui.**
102
+
103
+ **Se MCP funcionar** — pedir o projeto:
73
104
 
74
- **Se NÃO** — informar que serão criadas:
75
105
  ```
76
- Vou criar a estrutura no Confluence:
77
- - {project.name} (raiz)
78
- ├── Input
79
- └── Output
106
+ Conexão OK!
80
107
 
81
- Nome do projeto pra page raiz (ex: Meu Projeto):
108
+ 5. Qual é a page raiz do seu projeto no Confluence?
109
+ Cole o Page ID (número na URL) ou o título exato:
82
110
  >
83
111
  ```
84
112
 
85
- Então usar MCP pra criar:
86
- 1. `mcp__atlassian__confluence_create_page` → page raiz com título informado
87
- 2. `mcp__atlassian__confluence_create_page` → page "Input" como filha da raiz
88
- 3. `mcp__atlassian__confluence_create_page` → page "Output" como filha da raiz
89
- 4. Anotar os 3 Page IDs retornados
113
+ ### Passo 5 Mapear a árvore do projeto
90
114
 
91
- ### Passo 3 Criar `.mcp.json`
115
+ Após receber o Page ID ou título da raiz:
92
116
 
93
- Verificar se `.mcp.json` existe:
94
- - Se existe perguntar se quer sobrescrever ou adicionar entrada
95
- - Se não existe criar
117
+ 1. Chamar `mcp__atlassian__confluence_get_page` pra confirmar que existe
118
+ 2. Chamar `mcp__atlassian__confluence_get_page_children` na raiz
119
+ 3. Chamar recursivamente nos filhos pra mapear a árvore completa
96
120
 
97
- Conteúdo (credenciais hardcoded — `${VAR}` NÃO funciona no Claude Code):
121
+ Mostrar ao usuário:
98
122
 
99
- ```json
100
- {
101
- "mcpServers": {
102
- "atlassian": {
103
- "command": "uvx",
104
- "args": ["mcp-atlassian"],
105
- "env": {
106
- "CONFLUENCE_URL": "{url informada}",
107
- "CONFLUENCE_USERNAME": "{email informado}",
108
- "CONFLUENCE_API_TOKEN": "{token informado}"
109
- }
110
- }
111
- }
112
- }
123
+ ```
124
+ Projeto: "Barbearia Digital" (page_id: 65708)
125
+
126
+ Estrutura encontrada:
127
+ ├── Requisitos (page_id: 360668)
128
+ │ ├── App mobile (page_id: 294950)
129
+ │ └── Painel admin (page_id: 131084)
130
+ ├── Documentação técnica (page_id: 294931)
131
+ ├── Referências (page_id: 557057)
132
+ └── Decisões (page_id: 425998)
113
133
  ```
114
134
 
115
- ### Passo 4Criar `sfw.config.yml`
135
+ ### Passo 6Identificar Input e Output
116
136
 
117
- Verificar se já existe:
118
- - Se existe → perguntar se quer sobrescrever
119
- - Se não existe → criar
137
+ Perguntar ao usuário:
138
+
139
+ ```
140
+ Preciso saber qual pasta contém os INSUMOS (Input) e onde devo PUBLICAR os artefatos (Output).
141
+
142
+ Qual dessas é o Input (onde estão os insumos do PM/PO)?
143
+ 1. Requisitos (360668)
144
+ 2. Documentação técnica (294931)
145
+ 3. Referências (557057)
146
+ 4. Decisões (425998)
147
+ 5. Criar nova page "Input"
148
+ >
149
+ ```
150
+
151
+ Após o user escolher Input:
152
+
153
+ ```
154
+ Qual dessas é o Output (onde publico TRD, SDD, Progresso)?
155
+ 1. Documentação técnica (294931)
156
+ 2. Referências (557057)
157
+ 3. Decisões (425998)
158
+ 4. Criar nova page "Output"
159
+ >
160
+ ```
161
+
162
+ **Se o user escolher "Criar nova"** → usar `mcp__atlassian__confluence_create_page` como filha da raiz.
163
+
164
+ ### Passo 7 — Sugerir mapeamento de páginas úteis (opcional)
165
+
166
+ Se a árvore tem outras pages relevantes, sugerir:
167
+
168
+ ```
169
+ Encontrei outras páginas que podem ser úteis durante o desenvolvimento:
170
+
171
+ - "Referências" (557057) → posso consultar durante /sf-extract e /sf-design
172
+ - "Decisões" (425998) → posso consultar para ADRs no /sf-design
173
+
174
+ Quer que eu mapeie essas páginas como contexto adicional? (s/n)
175
+ ```
176
+
177
+ Se sim, registrar no `sfw.config.yml` como `context_pages`.
178
+
179
+ ### Passo 8 — Criar `sfw.config.yml`
120
180
 
121
181
  ```yaml
122
182
  project:
123
- name: "{nome do projeto}"
183
+ name: "{título da page raiz}"
184
+ root_page_id: "{page_id raiz}"
124
185
 
125
186
  naming:
126
187
  output_container: "out_{scope}"
@@ -130,7 +191,7 @@ input:
130
191
  adapter: confluence
131
192
  config:
132
193
  space_key: "{space_key}"
133
- parent_page_id: "{page_id_input}"
194
+ parent_page_id: "{page_id escolhido como Input}"
134
195
  recursive: true
135
196
  include_attachments: true
136
197
  cache:
@@ -144,94 +205,88 @@ output:
144
205
  adapter: confluence
145
206
  config:
146
207
  space_key: "{space_key}"
147
- parent_page_id: "{page_id_output}"
208
+ parent_page_id: "{page_id escolhido como Output}"
148
209
  publishes: [PRD, TRD, SDD, Progresso]
149
210
  mode: auto
150
211
  conflict_detection: version
151
212
  approval_mechanism: label
152
213
  approval_label: "sfw-approved"
214
+
215
+ # Pages de contexto adicional (consultadas pelo /sf-extract e /sf-design)
216
+ # context_pages:
217
+ # - id: "557057"
218
+ # title: "Referências"
219
+ # use_in: [extract, design]
220
+ # - id: "425998"
221
+ # title: "Decisões"
222
+ # use_in: [design]
153
223
  ```
154
224
 
155
- ### Passo 5 — Ajustar `.gitignore`
225
+ ### Passo 9 — Ajustar `.gitignore`
156
226
 
157
- Verificar que `.gitignore` contém:
158
- - `.mcp.json` — se não, adicionar
159
- - Bloco `# SFW: workspace ignored` — se não, adicionar:
227
+ Adicionar se não existem:
228
+ - `.mcp.json`
229
+ - Bloco workspace ignored:
160
230
  ```
161
231
  # SFW: workspace ignored (external backend detected)
162
232
  workspace/Output/**
163
233
  !workspace/Output/.gitkeep
164
234
  ```
165
235
 
166
- ### Passo 6Testar conexão
236
+ ### Passo 10Resumir
167
237
 
168
238
  ```
169
- Testando conexão com o Confluence...
170
- ```
239
+ Confluence configurado!
171
240
 
172
- Chamar:
173
- ```
174
- mcp__atlassian__confluence_get_page_children(page_id={page_id_input})
175
- ```
176
-
177
- **Se funcionar**:
178
- ```
179
- Conexão OK! Confluence configurado com sucesso.
241
+ Projeto: {nome} ({page_id raiz})
242
+ Input: {título Input} ({page_id})
243
+ Output: {título Output} ({page_id})
180
244
 
181
- Arquivos criados:
245
+ Arquivos criados/atualizados:
182
246
  .mcp.json ← credenciais (gitignored)
183
247
  sfw.config.yml ← configuração do projeto
184
- .gitignore ← atualizado (workspace ignorado)
248
+ .gitignore ← atualizado
185
249
 
186
- Próximo passo:
187
- 1. Crie pages de insumo como filhas de Input no Confluence
188
- 2. Rode /sf-new-project <nome-da-page> ou /sf-feature <nome-da-page>
189
- ```
190
-
191
- **Se falhar** (MCP não disponível):
192
- ```
193
- MCP não está disponível. Isso acontece porque o Claude Code precisa
194
- ser reiniciado para carregar o .mcp.json que acabamos de criar.
195
-
196
- Arquivos foram criados com sucesso:
197
- .mcp.json ← credenciais
198
- sfw.config.yml ← configuração
250
+ O projeto tem {N} scopes no Input:
251
+ - {lista dos filhos do Input}
199
252
 
200
253
  Próximo passo:
201
- 1. Reinicie o Claude Code (feche e abra novamente)
202
- 2. Rode /sf-mcp confluence test para verificar a conexão
203
- 3. Depois: /sf-new-project <nome> ou /sf-feature <nome>
254
+ /sf-new-project <nome-do-scope> ← bootstrap técnico
255
+ /sf-feature <nome-do-scope> nova feature
204
256
  ```
205
257
 
206
- ### Subcomando: `/sf-mcp confluence test`
258
+ ---
259
+
260
+ ## Subcomando: `/sf-mcp confluence test`
207
261
 
208
- Apenas testa a conexão sem criar arquivos:
262
+ Apenas testa a conexão sem criar/modificar arquivos:
209
263
 
210
264
  1. Verificar que `.mcp.json` existe
211
265
  2. Verificar que `sfw.config.yml` existe e tem `adapter: confluence`
212
- 3. Chamar `mcp__atlassian__confluence_get_page_children(page_id={page_id_input})`
213
- 4. Se OK → "Conexão OK! {N} pages encontradas em Input"
266
+ 3. Chamar `mcp__atlassian__confluence_get_page_children(page_id={input.parent_page_id})`
267
+ 4. Se OK → "Conexão OK! {N} scopes encontrados em Input: {lista}"
214
268
  5. Se falha → orientar troubleshooting (ver `.github/adapters/SETUP.md`)
215
269
 
270
+ ---
271
+
216
272
  ## Notas
217
273
 
218
274
  - `.mcp.json` é SEMPRE gitignored — contém credenciais
219
275
  - `sfw.config.yml` é commitável — zero segredos
220
- - Após criar `.mcp.json`, Claude Code PRECISA ser reiniciado pra carregar o MCP
221
- - Se o user tem `.mcp.json` com outras entradas, o comando ADICIONA a entrada `atlassian` sem apagar as existentes
222
- - Token da Atlassian pode expirar se der 401 depois de um tempo, gerar novo token e atualizar `.mcp.json`
276
+ - Após criar `.mcp.json`, Claude Code PRECISA ser reiniciado
277
+ - O framework conhece o projeto INTEIRO (raiz + toda a árvore), não Input/Output
278
+ - `context_pages` permite que /sf-extract e /sf-design consultem páginas extras como referência
279
+ - Token Atlassian pode expirar — se der 401, gerar novo e atualizar `.mcp.json`
223
280
 
224
281
  ## Erros
225
282
 
226
283
  | Erro | Ação |
227
284
  |------|------|
228
285
  | uvx não instalado | Parar, instruir instalação |
229
- | URL inválida | Pedir novamente |
230
- | Token vazio | Pedir novamente, linkar página de geração |
231
- | Space key não encontrado | Pedir novamente, sugerir como descobrir |
232
- | Page ID inválido | Pedir novamente, sugerir como descobrir |
233
- | MCP não disponível após criar | Normal — pedir reinício do Claude Code |
234
- | Create page falhou (403) | Usuário sem permissão de escrita no space |
286
+ | MCP não disponível | Pedir reinício do Claude Code |
287
+ | Page raiz não encontrada | Pedir ID/título correto |
288
+ | Sem permissão de escrita | Informar, pedir ao admin |
289
+ | Space key errado | Listar spaces disponíveis se possível |
235
290
 
236
291
  ## Referências
237
292
 
@@ -23,6 +23,8 @@
23
23
  # ----------------------------------------------------------------------------
24
24
  project:
25
25
  name: "Meu Projeto"
26
+ # Page ID raiz do projeto no Confluence (o framework conhece o projeto inteiro)
27
+ # root_page_id: "65708"
26
28
 
27
29
  # ----------------------------------------------------------------------------
28
30
  # naming — templates de nome (aplicados pela engine em .github/adapters/naming.md)
@@ -129,3 +131,17 @@ output:
129
131
  # mode: auto
130
132
  # conflict_detection: hash
131
133
  # approval_mechanism: none
134
+
135
+ # ----------------------------------------------------------------------------
136
+ # context_pages — páginas extras que o framework pode consultar (opcional)
137
+ # ----------------------------------------------------------------------------
138
+ # O /mcp descobre a árvore do projeto e sugere pages que podem ser úteis
139
+ # como contexto durante /extract e /design (referências, decisões, etc.)
140
+ #
141
+ # context_pages:
142
+ # - id: "557057"
143
+ # title: "Referências"
144
+ # use_in: [extract, design]
145
+ # - id: "425998"
146
+ # title: "Decisões"
147
+ # use_in: [design]