spec-first-copilot 0.5.0-beta.14 → 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
|
@@ -20,10 +20,11 @@
|
|
|
20
20
|
|
|
21
21
|
### 2. Validar acesso a todas skills
|
|
22
22
|
|
|
23
|
-
Verificar que TODAS as
|
|
23
|
+
Verificar que TODAS as 11 skills estão acessíveis:
|
|
24
24
|
|
|
25
25
|
| Skill | Caminho |
|
|
26
26
|
|-------|---------|
|
|
27
|
+
| `/sf-mcp` | `.github/skills/sf-mcp/SKILL.md` |
|
|
27
28
|
| `/sf-load` | `.github/skills/sf-load/SKILL.md` |
|
|
28
29
|
| `/sf-new-project` | `.github/skills/sf-new-project/SKILL.md` |
|
|
29
30
|
| `/sf-feature` | `.github/skills/sf-feature/SKILL.md` |
|
|
@@ -96,6 +97,7 @@ Nenhum código é escrito sem especificação aprovada (SDD).
|
|
|
96
97
|
|
|
97
98
|
| Skill | Tipo | O que faz |
|
|
98
99
|
|-------|------|-----------|
|
|
100
|
+
| `/sf-mcp <provider>` | Setup | Configura backend externo interativamente. Cria .mcp.json + sfw.config.yml + ajusta .gitignore |
|
|
99
101
|
| `/sf-load <nome>` | Utilitária | Puxa insumos do backend (Confluence/filesystem) para workspace/Input/{nome}/. Incremental |
|
|
100
102
|
| `/sf-new-project <nome>` | Orquestrador | Bootstrap técnico: cria .context.md tipo TRD, chama /sf-extract, para no checkpoint |
|
|
101
103
|
| `/sf-feature <nome>` | Orquestrador | Feature: cria .context.md tipo PRD, chama /sf-extract, para no checkpoint |
|
|
@@ -0,0 +1,295 @@
|
|
|
1
|
+
# /sf-mcp <provider>
|
|
2
|
+
|
|
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
|
+
|
|
5
|
+
## Providers disponíveis
|
|
6
|
+
|
|
7
|
+
| Provider | O que faz |
|
|
8
|
+
|----------|-----------|
|
|
9
|
+
| `confluence` | Configura MCP Atlassian + descobre projeto + cria `sfw.config.yml` + `.mcp.json` + `.gitignore` |
|
|
10
|
+
|
|
11
|
+
## Uso
|
|
12
|
+
|
|
13
|
+
```
|
|
14
|
+
/sf-mcp confluence
|
|
15
|
+
/sf-mcp confluence test ← só testa conexão
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## Provider: Confluence
|
|
21
|
+
|
|
22
|
+
### Passo 1 — Verificar pré-requisitos
|
|
23
|
+
|
|
24
|
+
Verificar se `uvx` está instalado:
|
|
25
|
+
```bash
|
|
26
|
+
uvx --version
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
Se NÃO está instalado:
|
|
30
|
+
```
|
|
31
|
+
uvx não encontrado. Instale com:
|
|
32
|
+
pip install uv
|
|
33
|
+
|
|
34
|
+
Depois rode /sf-mcp confluence novamente.
|
|
35
|
+
```
|
|
36
|
+
**Parar aqui** se uvx não estiver disponível.
|
|
37
|
+
|
|
38
|
+
### Passo 2 — Coletar credenciais
|
|
39
|
+
|
|
40
|
+
Perguntar uma por uma:
|
|
41
|
+
|
|
42
|
+
```
|
|
43
|
+
Configurando Confluence para o SFW.
|
|
44
|
+
|
|
45
|
+
1. URL do Confluence (ex: https://sua-empresa.atlassian.net/wiki):
|
|
46
|
+
>
|
|
47
|
+
|
|
48
|
+
2. Email da conta Atlassian (ex: dev@empresa.com):
|
|
49
|
+
>
|
|
50
|
+
|
|
51
|
+
3. API Token (gere em https://id.atlassian.com/manage-profile/security/api-tokens):
|
|
52
|
+
>
|
|
53
|
+
|
|
54
|
+
4. Space Key (as letras na URL: /wiki/spaces/XX/...):
|
|
55
|
+
>
|
|
56
|
+
```
|
|
57
|
+
|
|
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
|
|
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
|
+
}
|
|
79
|
+
```
|
|
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>)
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
**Se MCP não disponível** (primeira vez — `.mcp.json` acabou de ser criado):
|
|
95
|
+
```
|
|
96
|
+
.mcp.json criado. O Claude Code precisa ser reiniciado para carregar o MCP.
|
|
97
|
+
|
|
98
|
+
1. Reinicie o Claude Code (feche e abra)
|
|
99
|
+
2. Rode /sf-mcp confluence novamente — vou continuar de onde paramos
|
|
100
|
+
```
|
|
101
|
+
**Parar aqui.**
|
|
102
|
+
|
|
103
|
+
**Se MCP funcionar** — pedir o projeto:
|
|
104
|
+
|
|
105
|
+
```
|
|
106
|
+
Conexão OK!
|
|
107
|
+
|
|
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:
|
|
110
|
+
>
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
### Passo 5 — Mapear a árvore do projeto
|
|
114
|
+
|
|
115
|
+
Após receber o Page ID ou título da raiz:
|
|
116
|
+
|
|
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
|
|
120
|
+
|
|
121
|
+
Mostrar ao usuário:
|
|
122
|
+
|
|
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)
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
### Passo 6 — Identificar Input e Output
|
|
136
|
+
|
|
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`
|
|
180
|
+
|
|
181
|
+
```yaml
|
|
182
|
+
project:
|
|
183
|
+
name: "{título da page raiz}"
|
|
184
|
+
root_page_id: "{page_id raiz}"
|
|
185
|
+
|
|
186
|
+
naming:
|
|
187
|
+
output_container: "out_{scope}"
|
|
188
|
+
output_artifact: "{scope} - {type}"
|
|
189
|
+
|
|
190
|
+
input:
|
|
191
|
+
adapter: confluence
|
|
192
|
+
config:
|
|
193
|
+
space_key: "{space_key}"
|
|
194
|
+
parent_page_id: "{page_id escolhido como Input}"
|
|
195
|
+
recursive: true
|
|
196
|
+
include_attachments: true
|
|
197
|
+
cache:
|
|
198
|
+
local_dir: "workspace/Input/"
|
|
199
|
+
log: ".ai/load-log.md"
|
|
200
|
+
incremental: true
|
|
201
|
+
|
|
202
|
+
output:
|
|
203
|
+
targets:
|
|
204
|
+
- name: confluence-mirror
|
|
205
|
+
adapter: confluence
|
|
206
|
+
config:
|
|
207
|
+
space_key: "{space_key}"
|
|
208
|
+
parent_page_id: "{page_id escolhido como Output}"
|
|
209
|
+
publishes: [PRD, TRD, SDD, Progresso]
|
|
210
|
+
mode: auto
|
|
211
|
+
conflict_detection: version
|
|
212
|
+
approval_mechanism: label
|
|
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]
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
### Passo 9 — Ajustar `.gitignore`
|
|
226
|
+
|
|
227
|
+
Adicionar se não existem:
|
|
228
|
+
- `.mcp.json`
|
|
229
|
+
- Bloco workspace ignored:
|
|
230
|
+
```
|
|
231
|
+
# SFW: workspace ignored (external backend detected)
|
|
232
|
+
workspace/Output/**
|
|
233
|
+
!workspace/Output/.gitkeep
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
### Passo 10 — Resumir
|
|
237
|
+
|
|
238
|
+
```
|
|
239
|
+
Confluence configurado!
|
|
240
|
+
|
|
241
|
+
Projeto: {nome} ({page_id raiz})
|
|
242
|
+
Input: {título Input} ({page_id})
|
|
243
|
+
Output: {título Output} ({page_id})
|
|
244
|
+
|
|
245
|
+
Arquivos criados/atualizados:
|
|
246
|
+
.mcp.json ← credenciais (gitignored)
|
|
247
|
+
sfw.config.yml ← configuração do projeto
|
|
248
|
+
.gitignore ← atualizado
|
|
249
|
+
|
|
250
|
+
O projeto tem {N} scopes no Input:
|
|
251
|
+
- {lista dos filhos do Input}
|
|
252
|
+
|
|
253
|
+
Próximo passo:
|
|
254
|
+
/sf-new-project <nome-do-scope> ← bootstrap técnico
|
|
255
|
+
/sf-feature <nome-do-scope> ← nova feature
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
---
|
|
259
|
+
|
|
260
|
+
## Subcomando: `/sf-mcp confluence test`
|
|
261
|
+
|
|
262
|
+
Apenas testa a conexão sem criar/modificar arquivos:
|
|
263
|
+
|
|
264
|
+
1. Verificar que `.mcp.json` existe
|
|
265
|
+
2. Verificar que `sfw.config.yml` existe e tem `adapter: confluence`
|
|
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}"
|
|
268
|
+
5. Se falha → orientar troubleshooting (ver `.github/adapters/SETUP.md`)
|
|
269
|
+
|
|
270
|
+
---
|
|
271
|
+
|
|
272
|
+
## Notas
|
|
273
|
+
|
|
274
|
+
- `.mcp.json` é SEMPRE gitignored — contém credenciais
|
|
275
|
+
- `sfw.config.yml` é commitável — zero segredos
|
|
276
|
+
- Após criar `.mcp.json`, Claude Code PRECISA ser reiniciado
|
|
277
|
+
- O framework conhece o projeto INTEIRO (raiz + toda a árvore), não só 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`
|
|
280
|
+
|
|
281
|
+
## Erros
|
|
282
|
+
|
|
283
|
+
| Erro | Ação |
|
|
284
|
+
|------|------|
|
|
285
|
+
| uvx não instalado | Parar, instruir instalação |
|
|
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 |
|
|
290
|
+
|
|
291
|
+
## Referências
|
|
292
|
+
|
|
293
|
+
- Setup guide completo: `.github/adapters/SETUP.md`
|
|
294
|
+
- Confluence adapter: `.github/adapters/confluence.md`
|
|
295
|
+
- Interface do adapter: `.github/adapters/interface.md`
|
|
@@ -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]
|