spec-first-copilot 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 +2 -2
- package/package.json +1 -1
- package/templates/.github/adapters/SETUP.md +287 -0
- package/templates/.github/copilot-instructions.md +4 -5
- package/templates/.github/skills/sf-new-project/SKILL.md +128 -0
- package/templates/.github/skills/sf-setup-projeto/SKILL.md +0 -123
- package/templates/workspace/Input/setup_projeto/.gitkeep +0 -0
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.
|
|
66
|
-
console.log(' 3. Run /sf-
|
|
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 /sf-new-project <folder-name> to start the pipeline');
|
|
67
67
|
console.log('');
|
|
68
68
|
}
|
|
69
69
|
|
package/package.json
CHANGED
|
@@ -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: `.github/adapters/interface.md`
|
|
284
|
+
- ConfluenceAdapter: `.github/adapters/confluence.md`
|
|
285
|
+
- FilesystemAdapter: `.github/adapters/filesystem.md`
|
|
286
|
+
- Erros: `.github/adapters/errors.md`
|
|
287
|
+
- Naming: `.github/adapters/naming.md`
|
|
@@ -24,7 +24,7 @@ Verificar que TODAS as 9 skills estão acessíveis:
|
|
|
24
24
|
|
|
25
25
|
| Skill | Caminho |
|
|
26
26
|
|-------|---------|
|
|
27
|
-
| `/sf-
|
|
27
|
+
| `/sf-new-project` | `.github/skills/sf-new-project/SKILL.md` |
|
|
28
28
|
| `/sf-feature` | `.github/skills/sf-feature/SKILL.md` |
|
|
29
29
|
| `/sf-extract` | `.github/skills/sf-extract/SKILL.md` |
|
|
30
30
|
| `/sf-design` | `.github/skills/sf-design/SKILL.md` |
|
|
@@ -77,7 +77,7 @@ Nenhum código é escrito sem especificação aprovada (SDD).
|
|
|
77
77
|
|
|
78
78
|
```
|
|
79
79
|
workspace/Input/ (qualquer arquivo)
|
|
80
|
-
↓ /sf-
|
|
80
|
+
↓ /sf-new-project <nome> (TRD — bootstrap técnico) ou /sf-feature <nome> (PRD — feature)
|
|
81
81
|
/sf-discovery → análise profunda dos insumos (RECOMENDADO, opcional)
|
|
82
82
|
↓
|
|
83
83
|
/sf-extract → PRD ou TRD em workspace/Output/{nome}/ (checkpoint — usuário revisa e aprova)
|
|
@@ -94,7 +94,7 @@ workspace/Input/ (qualquer arquivo)
|
|
|
94
94
|
|
|
95
95
|
| Skill | Tipo | O que faz |
|
|
96
96
|
|-------|------|-----------|
|
|
97
|
-
| `/sf-
|
|
97
|
+
| `/sf-new-project <nome>` | Orquestrador | Bootstrap técnico: cria .context.md tipo TRD, chama /sf-extract, para no checkpoint |
|
|
98
98
|
| `/sf-feature <nome>` | Orquestrador | Feature: cria .context.md tipo PRD, chama /sf-extract, para no checkpoint |
|
|
99
99
|
| `/sf-extract <nome>` | Atômica | Lê workspace/Input/{nome}/ → gera PRD ou TRD. Re-executável para novos insumos |
|
|
100
100
|
| `/sf-design <nome>` | Atômica | Pergunta aprovação → gera SDD a partir do PRD/TRD |
|
|
@@ -168,8 +168,7 @@ specs/ ← AGENT CONTRACTS (projeções do SDD pro coder)
|
|
|
168
168
|
|
|
169
169
|
workspace/ ← TEAM CONTENT (futuro wiki)
|
|
170
170
|
├── Input/ ← Insumos brutos (QUALQUER formato — nunca modificar)
|
|
171
|
-
│
|
|
172
|
-
│ └── feat_*/ ← Insumos por feature
|
|
171
|
+
│ └── {nome}/ ← Nomeado livremente pelo usuário (ex: app_barbearia, feat_login)
|
|
173
172
|
└── Output/ ← Artefatos humanos gerados pelo workflow
|
|
174
173
|
└── {nome}/
|
|
175
174
|
├── PRD.md ou TRD.md ← Requirements (gerado pelo /sf-extract)
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: sf-new-project
|
|
3
|
+
description: |
|
|
4
|
+
Bootstrap técnico do projeto. Recebe nome do scope no Input, cria contexto TRD,
|
|
5
|
+
chama /sf-extract, para no checkpoint.
|
|
6
|
+
Trigger: /sf-new-project <nome>
|
|
7
|
+
author: GustavoMaritan
|
|
8
|
+
version: 2.0.0
|
|
9
|
+
date: 2026-04-12
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# Skill: /sf-new-project <nome>
|
|
13
|
+
|
|
14
|
+
> Orquestrador de bootstrap técnico do projeto.
|
|
15
|
+
> Cria contexto TRD a partir dos insumos em `workspace/Input/{nome}/`,
|
|
16
|
+
> chama `/sf-extract` e para no checkpoint de aprovação.
|
|
17
|
+
>
|
|
18
|
+
> Simétrico ao `/sf-feature <nome>` — a diferença é que gera TRD (perfil técnico)
|
|
19
|
+
> em vez de PRD (perfil de produto).
|
|
20
|
+
|
|
21
|
+
## Tipo
|
|
22
|
+
Orquestrador (primeira etapa do pipeline)
|
|
23
|
+
|
|
24
|
+
## Uso
|
|
25
|
+
```
|
|
26
|
+
/sf-new-project <nome>
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
`<nome>` = nome da pasta no Input. O usuário nomeia livremente
|
|
30
|
+
(ex: `app_barbearia`, `meu_sistema`, `api_pagamentos`).
|
|
31
|
+
|
|
32
|
+
## Pré-condições
|
|
33
|
+
|
|
34
|
+
| # | Validação | Se falhar |
|
|
35
|
+
|---|-----------|-----------|
|
|
36
|
+
| 1 | `workspace/Input/{nome}/` existe | Parar → "Crie a pasta workspace/Input/{nome}/ e adicione seus insumos" |
|
|
37
|
+
| 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)" |
|
|
38
|
+
| 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" |
|
|
39
|
+
|
|
40
|
+
## Passos
|
|
41
|
+
|
|
42
|
+
### 1. Criar estrutura
|
|
43
|
+
```
|
|
44
|
+
workspace/Output/{nome}/
|
|
45
|
+
├── .context.md ← criado agora
|
|
46
|
+
└── (TRD.md será criado pelo /sf-extract)
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
### 2. Criar `.context.md`
|
|
50
|
+
```yaml
|
|
51
|
+
---
|
|
52
|
+
nome: "{nome}"
|
|
53
|
+
tipo: "project"
|
|
54
|
+
documento: "TRD"
|
|
55
|
+
pm_path: "workspace/Input/{nome}/"
|
|
56
|
+
status: "not_started"
|
|
57
|
+
ultima_skill: "/sf-new-project"
|
|
58
|
+
atualizado_em: "{{ISO_DATETIME}}"
|
|
59
|
+
---
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
### 3. Sugerir /sf-discovery (RECOMENDADO)
|
|
63
|
+
|
|
64
|
+
Antes de extrair, perguntar ao usuário:
|
|
65
|
+
```
|
|
66
|
+
Insumos encontrados em workspace/Input/{nome}/.
|
|
67
|
+
|
|
68
|
+
Recomendo rodar /sf-discovery antes da extração para:
|
|
69
|
+
- Análise profunda dos insumos (parseia drawio, XML, SQL completo)
|
|
70
|
+
- Identificar gaps e contradições antes de estruturar
|
|
71
|
+
- Validar entendimento com você (mapa do sistema)
|
|
72
|
+
|
|
73
|
+
Quer rodar /sf-discovery workspace/Input/{nome}/ agora? (s/n)
|
|
74
|
+
Se SIM → rodar discovery, salvar discovery.md, depois continuar com extract
|
|
75
|
+
Se NÃO → pular direto para /sf-extract (ok para insumos simples)
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
Se o usuário aceitar:
|
|
79
|
+
- Rodar `/sf-discovery workspace/Input/{nome}/`
|
|
80
|
+
- Aguardar conclusão — discovery.md salvo em `workspace/Output/{nome}/`
|
|
81
|
+
- Continuar para o passo 4
|
|
82
|
+
|
|
83
|
+
### 4. Chamar `/sf-extract {nome}`
|
|
84
|
+
O `/sf-extract` lê os insumos + discovery.md (se existir), gera o TRD e atualiza status para `extract_done`.
|
|
85
|
+
|
|
86
|
+
### 5. CHECKPOINT — Parar e informar o usuário
|
|
87
|
+
Mensagem ao usuário:
|
|
88
|
+
```
|
|
89
|
+
TRD gerado em workspace/Output/{nome}/TRD.md
|
|
90
|
+
|
|
91
|
+
Revise o documento. Quando estiver satisfeito, execute:
|
|
92
|
+
/sf-design {nome}
|
|
93
|
+
|
|
94
|
+
Se precisar adicionar mais insumos, coloque na pasta workspace/Input/{nome}/
|
|
95
|
+
e execute:
|
|
96
|
+
/sf-extract {nome}
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
**O orquestrador encerra aqui.** O restante do pipeline é responsabilidade do usuário chamar as skills atômicas na ordem:
|
|
100
|
+
1. `/sf-design {nome}` (pergunta aprovação → gera SDD + docs/ + projetos.yaml)
|
|
101
|
+
2. `/sf-plan {nome}` (gera tasks com campo Repo por task)
|
|
102
|
+
3. `/sf-dev {nome}` (INFRA-001 cria/clona repos em projetos/, executa tasks nos repos corretos)
|
|
103
|
+
|
|
104
|
+
## Saídas diretas desta skill
|
|
105
|
+
- `workspace/Output/{nome}/.context.md`
|
|
106
|
+
- `workspace/Output/{nome}/TRD.md` (via /sf-extract)
|
|
107
|
+
- `workspace/Output/{nome}/.extract-log.md` (via /sf-extract)
|
|
108
|
+
|
|
109
|
+
## Saídas indiretas (skills subsequentes)
|
|
110
|
+
- `sdd.md` (via /sf-design)
|
|
111
|
+
- `projetos.yaml` (via /sf-design — manifesto de repos)
|
|
112
|
+
- `docs/` populado (via /sf-design)
|
|
113
|
+
- `specs/{nome}/tasks.md` + `Progresso.md` (via /sf-plan)
|
|
114
|
+
- `projetos/` com repos criados/clonados (via /sf-dev INFRA-001)
|
|
115
|
+
|
|
116
|
+
## Erros
|
|
117
|
+
|
|
118
|
+
| Erro | Ação |
|
|
119
|
+
|------|------|
|
|
120
|
+
| workspace/Input/{nome}/ não existe | Parar, instruir criação |
|
|
121
|
+
| workspace/Input/{nome}/ vazio | Parar, listar formatos aceitos |
|
|
122
|
+
| Pipeline já iniciado | Parar, mostrar status atual do .context.md |
|
|
123
|
+
|
|
124
|
+
## Notas
|
|
125
|
+
- docs/ é gerado pelo /sf-design (passo 3), não por tasks DOC
|
|
126
|
+
- `projetos.yaml` é gerado pelo /sf-design (passo 3b) — mapeia serviços para repos
|
|
127
|
+
- Repos são criados/clonados pelo /sf-dev (INFRA-001) dentro de `projetos/`
|
|
128
|
+
- O `/sf-merge-delta` NÃO se aplica ao new-project (é criação, não atualização)
|
|
@@ -1,123 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: sf-setup-projeto
|
|
3
|
-
description: |
|
|
4
|
-
Bootstrap do projeto. Cria contexto TRD, chama /sf-extract, para no checkpoint.
|
|
5
|
-
Trigger: /sf-setup-projeto
|
|
6
|
-
author: GustavoMaritan
|
|
7
|
-
version: 1.0.0
|
|
8
|
-
date: 2026-04-08
|
|
9
|
-
---
|
|
10
|
-
|
|
11
|
-
# Skill: /sf-setup-projeto
|
|
12
|
-
|
|
13
|
-
> Orquestrador de bootstrap do projeto. Executa uma única vez.
|
|
14
|
-
> Cria contexto TRD, chama `/extract` e para no checkpoint de aprovação.
|
|
15
|
-
|
|
16
|
-
## Tipo
|
|
17
|
-
Orquestrador (primeira etapa do pipeline)
|
|
18
|
-
|
|
19
|
-
## Uso
|
|
20
|
-
```
|
|
21
|
-
/sf-setup-projeto
|
|
22
|
-
```
|
|
23
|
-
|
|
24
|
-
## Pré-condições
|
|
25
|
-
|
|
26
|
-
| # | Validação | Se falhar |
|
|
27
|
-
|---|-----------|-----------|
|
|
28
|
-
| 1 | `workspace/Input/setup_projeto/` existe | Parar → "Crie a pasta workspace/Input/setup_projeto/ e adicione seus insumos" |
|
|
29
|
-
| 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)" |
|
|
30
|
-
| 3 | `docs/` está vazio ou contém apenas templates vazios | Parar → "Setup já foi executado. Use /sf-feature para novas funcionalidades" |
|
|
31
|
-
| 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" |
|
|
32
|
-
|
|
33
|
-
## Passos
|
|
34
|
-
|
|
35
|
-
### 1. Criar estrutura
|
|
36
|
-
```
|
|
37
|
-
workspace/Output/setup_projeto/
|
|
38
|
-
├── .context.md ← criado agora
|
|
39
|
-
└── (TRD.md será criado pelo /extract)
|
|
40
|
-
```
|
|
41
|
-
|
|
42
|
-
### 2. Criar `.context.md`
|
|
43
|
-
```yaml
|
|
44
|
-
---
|
|
45
|
-
nome: "setup_projeto"
|
|
46
|
-
tipo: "setup"
|
|
47
|
-
documento: "TRD"
|
|
48
|
-
pm_path: "workspace/Input/setup_projeto/"
|
|
49
|
-
status: "not_started"
|
|
50
|
-
ultima_skill: "/sf-setup-projeto"
|
|
51
|
-
atualizado_em: "{{ISO_DATETIME}}"
|
|
52
|
-
---
|
|
53
|
-
```
|
|
54
|
-
|
|
55
|
-
### 3. Sugerir /sf-discovery (RECOMENDADO)
|
|
56
|
-
|
|
57
|
-
Antes de extrair, perguntar ao usuário:
|
|
58
|
-
```
|
|
59
|
-
📋 Insumos encontrados em workspace/Input/setup_projeto/.
|
|
60
|
-
|
|
61
|
-
Recomendo rodar /sf-discovery antes da extração para:
|
|
62
|
-
- Análise profunda dos insumos (parseia drawio, XML, SQL completo)
|
|
63
|
-
- Identificar gaps e contradições antes de estruturar
|
|
64
|
-
- Validar entendimento com você (mapa do sistema)
|
|
65
|
-
|
|
66
|
-
Quer rodar /sf-discovery workspace/Input/setup_projeto/ agora? (s/n)
|
|
67
|
-
Se SIM → rodar discovery, salvar discovery.md, depois continuar com extract
|
|
68
|
-
Se NÃO → pular direto para /sf-extract (ok para insumos simples)
|
|
69
|
-
```
|
|
70
|
-
|
|
71
|
-
Se o usuário aceitar:
|
|
72
|
-
- Rodar `/sf-discovery workspace/Input/setup_projeto/`
|
|
73
|
-
- Aguardar conclusão — discovery.md salvo em `workspace/Output/setup_projeto/`
|
|
74
|
-
- Continuar para o passo 4
|
|
75
|
-
|
|
76
|
-
### 4. Chamar `/sf-extract setup_projeto`
|
|
77
|
-
O `/sf-extract` lê os insumos + discovery.md (se existir), gera o TRD e atualiza status para `extract_done`.
|
|
78
|
-
|
|
79
|
-
### 5. CHECKPOINT — Parar e informar o usuário
|
|
80
|
-
Mensagem ao usuário:
|
|
81
|
-
```
|
|
82
|
-
✅ TRD gerado em workspace/Output/setup_projeto/TRD.md
|
|
83
|
-
|
|
84
|
-
Revise o documento. Quando estiver satisfeito, execute:
|
|
85
|
-
/sf-design setup_projeto
|
|
86
|
-
|
|
87
|
-
Se precisar adicionar mais insumos, coloque na pasta workspace/Input/setup_projeto/
|
|
88
|
-
e execute:
|
|
89
|
-
/sf-extract setup_projeto
|
|
90
|
-
```
|
|
91
|
-
|
|
92
|
-
**O orquestrador encerra aqui.** O restante do pipeline é responsabilidade do usuário chamar as skills atômicas na ordem:
|
|
93
|
-
1. `/sf-design setup_projeto` (pergunta aprovação → gera SDD + docs/ + projetos.yaml)
|
|
94
|
-
2. `/sf-plan setup_projeto` (gera tasks com campo Repo por task)
|
|
95
|
-
3. `/sf-dev setup_projeto` (INFRA-001 cria/clona repos em projetos/, executa tasks nos repos corretos)
|
|
96
|
-
|
|
97
|
-
## Saídas diretas desta skill
|
|
98
|
-
- `workspace/Output/setup_projeto/.context.md`
|
|
99
|
-
- `workspace/Output/setup_projeto/TRD.md` (via /extract)
|
|
100
|
-
- `workspace/Output/setup_projeto/.extract-log.md` (via /extract)
|
|
101
|
-
|
|
102
|
-
## Saídas indiretas (skills subsequentes)
|
|
103
|
-
- `sdd.md` (via /design)
|
|
104
|
-
- `projetos.yaml` (via /sf-design — manifesto de repos)
|
|
105
|
-
- `docs/` populado (via /design)
|
|
106
|
-
- `specs/{nome}/tasks.md` + `Progresso.md` (via /plan)
|
|
107
|
-
- `projetos/` com repos criados/clonados (via /sf-dev INFRA-001)
|
|
108
|
-
|
|
109
|
-
## Erros
|
|
110
|
-
|
|
111
|
-
| Erro | Ação |
|
|
112
|
-
|------|------|
|
|
113
|
-
| workspace/Input/setup_projeto/ não existe | Parar, instruir criação |
|
|
114
|
-
| workspace/Input/setup_projeto/ vazio | Parar, listar formatos aceitos |
|
|
115
|
-
| docs/ já populado | Parar, sugerir /sf-feature |
|
|
116
|
-
| Pipeline já iniciado | Parar, mostrar status atual do .context.md |
|
|
117
|
-
|
|
118
|
-
## Notas
|
|
119
|
-
- Esta skill roda **uma única vez** por projeto
|
|
120
|
-
- docs/ é gerado pelo /sf-design (passo 3), não por tasks DOC
|
|
121
|
-
- `projetos.yaml` é gerado pelo /sf-design (passo 3b) — mapeia serviços para repos
|
|
122
|
-
- Repos são criados/clonados pelo /sf-dev (INFRA-001) dentro de `projetos/`
|
|
123
|
-
- O `/merge-delta` NÃO se aplica ao setup (é criação, não atualização)
|
|
File without changes
|