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.
- package/README.md +252 -167
- package/bin/cli.js +70 -70
- package/lib/init.js +92 -92
- package/lib/update.js +132 -132
- package/package.json +1 -1
- package/templates/.ai/memory/napkin.md +68 -68
- package/templates/.github/CHANGELOG.md +560 -533
- package/templates/.github/adapters/SETUP.md +314 -314
- package/templates/.github/adapters/confluence.md +295 -295
- package/templates/.github/adapters/errors.md +234 -234
- package/templates/.github/adapters/filesystem.md +353 -353
- package/templates/.github/adapters/interface.md +301 -301
- package/templates/.github/adapters/naming.md +241 -241
- package/templates/.github/adapters/registry.md +244 -244
- package/templates/.github/agents/backend-coder.md +215 -215
- package/templates/.github/agents/db-coder.md +165 -165
- package/templates/.github/agents/doc-writer.md +66 -66
- package/templates/.github/agents/frontend-coder.md +222 -222
- package/templates/.github/agents/infra-coder.md +341 -341
- package/templates/.github/agents/reviewer.md +99 -99
- package/templates/.github/agents/security-reviewer.md +153 -153
- package/templates/.github/copilot-instructions.md +272 -272
- package/templates/.github/instructions/docs.instructions.md +147 -145
- package/templates/.github/instructions/sensitive-files.instructions.md +32 -32
- package/templates/.github/rules.md +229 -229
- package/templates/.github/scripts/bootstrap-confluence.js +289 -289
- package/templates/.github/skills/sf-design/SKILL.md +161 -161
- package/templates/.github/skills/sf-dev/SKILL.md +204 -204
- package/templates/.github/skills/sf-discovery/SKILL.md +415 -415
- package/templates/.github/skills/sf-extract/SKILL.md +225 -225
- package/templates/.github/skills/sf-load/SKILL.md +296 -296
- package/templates/.github/skills/sf-mcp/SKILL.md +386 -386
- package/templates/.github/skills/sf-merge-docs/SKILL.md +152 -152
- package/templates/.github/skills/sf-plan/SKILL.md +152 -152
- package/templates/.github/skills/sf-publish/SKILL.md +144 -144
- package/templates/.github/skills/sf-session-finish/SKILL.md +93 -93
- package/templates/.github/skills/sf-start/SKILL.md +192 -192
- package/templates/.github/templates/estrutura/apiContracts.template.md +160 -159
- package/templates/.github/templates/estrutura/architecture.template.md +169 -168
- package/templates/.github/templates/estrutura/conventions.template.md +214 -212
- package/templates/.github/templates/estrutura/decisions.template.md +107 -107
- package/templates/.github/templates/estrutura/domain.template.md +161 -160
- package/templates/.github/templates/feature/PRD.template.md +279 -279
- package/templates/.github/templates/feature/Progresso.template.md +141 -141
- package/templates/.github/templates/feature/TRD.template.md +358 -358
- package/templates/.github/templates/feature/context.template.md +89 -89
- package/templates/.github/templates/feature/extract-log.template.md +49 -49
- package/templates/.github/templates/feature/projetos.template.yaml +79 -79
- package/templates/.github/templates/global/progresso_global.template.md +59 -57
- package/templates/.github/templates/specs/brief.template.md +66 -66
- package/templates/.github/templates/specs/contracts.template.md +147 -147
- package/templates/.github/templates/specs/scenarios.template.md +125 -125
- package/templates/.github/templates/specs/tasks.template.md +65 -65
- package/templates/_gitignore +35 -35
- package/templates/sfw.config.yml.example +147 -147
|
@@ -1,192 +1,192 @@
|
|
|
1
|
-
|
|
2
|
-
# /sf-start <nome>
|
|
3
|
-
|
|
4
|
-
Orquestrador único de entrada do pipeline SFW v4.
|
|
5
|
-
Mesma lógica pra qualquer scope (bootstrap, feature, bug, task técnica).
|
|
6
|
-
Distinção "bootstrap vs feature" é derivada automaticamente da existência de `docs/`.
|
|
7
|
-
|
|
8
|
-
## Argumento
|
|
9
|
-
|
|
10
|
-
`<nome>` = nome do scope no Input (título da page no Confluence, nome da pasta no filesystem).
|
|
11
|
-
Usuário nomeia livremente. Convenção sugerida (opcional):
|
|
12
|
-
|
|
13
|
-
- Bootstrap/setup: `app_<nome_projeto>`, `bootstrap`, `setup_<nome>`
|
|
14
|
-
- Features: `feat_<nome_descritivo>`
|
|
15
|
-
- Bugs: `bug_<nome_descritivo>`
|
|
16
|
-
- Tasks técnicas: `task_<nome_descritivo>`
|
|
17
|
-
|
|
18
|
-
Framework aceita qualquer nome. Convenção é pra organização visual no Input.
|
|
19
|
-
|
|
20
|
-
## Execução
|
|
21
|
-
|
|
22
|
-
Siga EXATAMENTE os passos em ordem. Leia o arquivo completo antes de agir.
|
|
23
|
-
|
|
24
|
-
### Passo 1 — Detectar first_run
|
|
25
|
-
|
|
26
|
-
| Condição | Significado |
|
|
27
|
-
|----------|-------------|
|
|
28
|
-
| `docs/` ausente ou vazio | **first_run = true** — bootstrap do projeto. `/sf-design` vai criar `docs/` + `projetos.yaml` a partir do TRD |
|
|
29
|
-
| `docs/` populado (≥1 arquivo) | **first_run = false** — feature/incremento. `docs/` atualizado via `/sf-merge-docs` no fim do `/sf-dev` |
|
|
30
|
-
|
|
31
|
-
Registrar no `.context.md` (Passo 4). **Imutável** depois de criado.
|
|
32
|
-
|
|
33
|
-
### Passo 2 — Carregar insumos do backend (`/sf-load`)
|
|
34
|
-
|
|
35
|
-
**SEMPRE executar**, independente do Input já existir local.
|
|
36
|
-
`/sf-load` é idempotente — se já existe, detecta INALTERADO e não sobrescreve.
|
|
37
|
-
|
|
38
|
-
```
|
|
39
|
-
Executar /sf-load {nome}
|
|
40
|
-
```
|
|
41
|
-
|
|
42
|
-
Seguir TODOS os passos do `/sf-load` (ver `.github/skills/sf-load/SKILL.md`):
|
|
43
|
-
- Ler `sfw.config.yml` pra saber o adapter
|
|
44
|
-
- Buscar scope `{nome}` no backend
|
|
45
|
-
- Descer recursivamente até o último nível
|
|
46
|
-
- Materializar TUDO em `workspace/Input/{nome}/`
|
|
47
|
-
- Registrar no `.ai/load-log.md`
|
|
48
|
-
|
|
49
|
-
**Se `sfw.config.yml` não existe**: projeto é 100% local.
|
|
50
|
-
Pular `/sf-load` e ir direto pro Passo 3. Usuário deve ter colocado insumos
|
|
51
|
-
manualmente em `workspace/Input/{nome}/`.
|
|
52
|
-
|
|
53
|
-
### Passo 3 — Validar pré-condições
|
|
54
|
-
|
|
55
|
-
| # | Validação | Se falhar |
|
|
56
|
-
|---|-----------|-----------|
|
|
57
|
-
| 1 | `<nome>` foi informado como argumento | Parar → "Informe o nome. Ex: /sf-start feat_cadastro_cliente" |
|
|
58
|
-
| 2 | `workspace/Input/{nome}/` existe e contém ≥1 arquivo | Parar → "Nenhum insumo encontrado. Verifique o backend ou crie workspace/Input/{nome}/ manualmente" |
|
|
59
|
-
| 3 | `workspace/Output/{nome}/.context.md` não existe OU tem status `not_started` | Se avançado → "Scope já em andamento. Status: {status}. Para continuar de onde parou, rode a skill do próximo estágio" |
|
|
60
|
-
|
|
61
|
-
### Passo 4 — Criar estrutura de Output + `.context.md`
|
|
62
|
-
|
|
63
|
-
1. Criar `workspace/Output/{nome}/` se não existir
|
|
64
|
-
2. Criar `.context.md` usando template `.github/templates/feature/context.template.md`:
|
|
65
|
-
|
|
66
|
-
```yaml
|
|
67
|
-
---
|
|
68
|
-
nome: "{nome}"
|
|
69
|
-
first_run: {true|false} # derivado do Passo 1 (SEM aspas, bool real)
|
|
70
|
-
prd_existe: false # /sf-extract preenche
|
|
71
|
-
trd_existe: false # /sf-extract preenche
|
|
72
|
-
prd_aprovado: false # usuário (PM) marca true após revisar PRD
|
|
73
|
-
trd_aprovado: false # usuário (dev) marca true após revisar TRD
|
|
74
|
-
areas_tocadas: [] # /sf-design preenche a partir dos GATEs do TRD
|
|
75
|
-
input_path: "workspace/Input/{nome}/"
|
|
76
|
-
status: "not_started"
|
|
77
|
-
ultima_skill: "/sf-start"
|
|
78
|
-
atualizado_em: "{{ISO_DATETIME}}"
|
|
79
|
-
---
|
|
80
|
-
```
|
|
81
|
-
|
|
82
|
-
### Passo 5 — Executar `/sf-discovery` (OBRIGATÓRIO em v4)
|
|
83
|
-
|
|
84
|
-
> **Breaking v4**: discovery deixou de ser opcional. Força entendimento dos
|
|
85
|
-
> insumos antes da extração. Reduz iteração de fix em PRD/TRD.
|
|
86
|
-
|
|
87
|
-
```
|
|
88
|
-
Executar /sf-discovery workspace/Input/{nome}/
|
|
89
|
-
```
|
|
90
|
-
|
|
91
|
-
Seguir `.github/skills/sf-discovery/SKILL.md`. Output: `workspace/Output/{nome}/sf-discovery.md`.
|
|
92
|
-
|
|
93
|
-
Atualizar `.context.md`:
|
|
94
|
-
```yaml
|
|
95
|
-
status: "discovery_done"
|
|
96
|
-
ultima_skill: "/sf-discovery"
|
|
97
|
-
```
|
|
98
|
-
|
|
99
|
-
### Passo 6 — Executar `/sf-extract`
|
|
100
|
-
|
|
101
|
-
```
|
|
102
|
-
Executar /sf-extract {nome}
|
|
103
|
-
```
|
|
104
|
-
|
|
105
|
-
Seguir `.github/skills/sf-extract/SKILL.md`. Pode gerar **PRD, TRD ou ambos** — dependendo
|
|
106
|
-
dos insumos. Outputs:
|
|
107
|
-
|
|
108
|
-
- `workspace/Output/{nome}/PRD.md` — se insumos têm conteúdo de produto
|
|
109
|
-
- `workspace/Output/{nome}/TRD.md` — se insumos têm conteúdo técnico
|
|
110
|
-
- `workspace/Output/{nome}/.extract-log.md` — hashes + destino por arquivo
|
|
111
|
-
|
|
112
|
-
`/sf-extract` atualiza `.context.md`:
|
|
113
|
-
```yaml
|
|
114
|
-
status: "extract_done"
|
|
115
|
-
prd_existe: {true|false}
|
|
116
|
-
trd_existe: {true|false}
|
|
117
|
-
```
|
|
118
|
-
|
|
119
|
-
### Passo 7 — CHECKPOINT DUPLO — aprovação PM + dev
|
|
120
|
-
|
|
121
|
-
Após `/sf-extract`, o orquestrador **para** e informa o usuário. Há 2 aprovações
|
|
122
|
-
paralelas (ordem irrelevante entre elas, ambas precisam antes de prosseguir):
|
|
123
|
-
|
|
124
|
-
```
|
|
125
|
-
/sf-extract completou. Próximos passos:
|
|
126
|
-
|
|
127
|
-
┌─ [PM APROVA PRD] (se prd_existe=true)
|
|
128
|
-
│ 1. Abra workspace/Output/{nome}/PRD.md
|
|
129
|
-
│ 2. Revise as 13 seções
|
|
130
|
-
│ 3. Responda ambiguidades em §12 (coluna `Resposta`)
|
|
131
|
-
│ 4. Quando aprovar, edite .context.md: prd_aprovado: true
|
|
132
|
-
│
|
|
133
|
-
├─ [DEV APROVA TRD] (se trd_existe=true)
|
|
134
|
-
│ 1. Abra workspace/Output/{nome}/TRD.md
|
|
135
|
-
│ 2. Revise as 11 seções (§Sistema + GATEs §Área-*)
|
|
136
|
-
│ 3. Responda ambiguidades em §10 (coluna `Resposta`)
|
|
137
|
-
│ 4. Quando aprovar, edite .context.md: trd_aprovado: true
|
|
138
|
-
│
|
|
139
|
-
└─ Quando as aprovações aplicáveis estiverem true, execute:
|
|
140
|
-
/sf-design {nome}
|
|
141
|
-
```
|
|
142
|
-
|
|
143
|
-
**Cenários**:
|
|
144
|
-
- `prd_existe=true + trd_existe=true` (maioria): precisa PM aprovar PRD E dev aprovar TRD
|
|
145
|
-
- `prd_existe=true + trd_existe=false`: só PM precisa aprovar PRD
|
|
146
|
-
- `prd_existe=false + trd_existe=true`: só dev precisa aprovar TRD
|
|
147
|
-
- `prd_existe=false + trd_existe=false`: extract reportou erro (não é possível chegar aqui)
|
|
148
|
-
|
|
149
|
-
### Passo 8 — Encerrar orquestrador
|
|
150
|
-
|
|
151
|
-
Após o CHECKPOINT do Passo 7, `/sf-start` **encerra**. O usuário revisa e aprova
|
|
152
|
-
manualmente os docs, depois chama `/sf-design {nome}`.
|
|
153
|
-
|
|
154
|
-
**Pipeline completo (para referência do usuário)**:
|
|
155
|
-
|
|
156
|
-
```
|
|
157
|
-
/sf-start {nome} ← ORQUESTRADOR (este skill)
|
|
158
|
-
├─ /sf-load (se backend configurado)
|
|
159
|
-
├─ /sf-discovery (obrigatório)
|
|
160
|
-
├─ /sf-extract → gera PRD e/ou TRD
|
|
161
|
-
└─ STOP: aguarda aprovação PM (PRD) + aprovação dev (TRD)
|
|
162
|
-
|
|
163
|
-
[manual: revisar PRD.md, marcar prd_aprovado=true]
|
|
164
|
-
[manual: revisar TRD.md, marcar trd_aprovado=true]
|
|
165
|
-
|
|
166
|
-
/sf-design {nome}
|
|
167
|
-
├─ first_run=true: cria docs/ (5 arquivos) + projetos.yaml
|
|
168
|
-
├─ sempre: gera specs/{nome}/ (brief, contracts, scenarios)
|
|
169
|
-
└─ status → design_done
|
|
170
|
-
|
|
171
|
-
/sf-plan {nome}
|
|
172
|
-
└─ gera specs/{nome}/tasks.md + workspace/Output/{nome}/Progresso.md
|
|
173
|
-
└─ status → plan_done
|
|
174
|
-
|
|
175
|
-
/sf-dev {nome} (ou /sf-dev {nome} --fase 1)
|
|
176
|
-
├─ first_run=true: INFRA-001 cria/clona repos em projetos/
|
|
177
|
-
├─ implementa tasks com loop (coder → review → security review)
|
|
178
|
-
├─ E2E + aprovação
|
|
179
|
-
├─ se feature (first_run=false): chama /sf-merge-docs automaticamente
|
|
180
|
-
└─ status → dev_done → done
|
|
181
|
-
```
|
|
182
|
-
|
|
183
|
-
## Notas
|
|
184
|
-
|
|
185
|
-
- `/sf-load` é sempre o 1º passo real — garante Input sincronizado com backend
|
|
186
|
-
- Se não há `sfw.config.yml`, projeto é 100% local e `/sf-load` é pulado
|
|
187
|
-
- `first_run` é imutável após criação do `.context.md`
|
|
188
|
-
- `docs/` em first_run: NASCE no `/sf-design` (não no `/sf-extract`) a partir do TRD
|
|
189
|
-
- `projetos.yaml` é gerado pelo `/sf-design` em first_run
|
|
190
|
-
- **Aprovação dupla**: mesmo em time pequeno (dev = PM), mantém as 2 marcações —
|
|
191
|
-
"fluxo fica mais claro" vence cerimônia-mínima (decisão de v4)
|
|
192
|
-
- Ambiguidades em §12 PRD / §10 TRD são BLOQUEANTES — `/sf-design` não avança sem respostas
|
|
1
|
+
|
|
2
|
+
# /sf-start <nome>
|
|
3
|
+
|
|
4
|
+
Orquestrador único de entrada do pipeline SFW v4.
|
|
5
|
+
Mesma lógica pra qualquer scope (bootstrap, feature, bug, task técnica).
|
|
6
|
+
Distinção "bootstrap vs feature" é derivada automaticamente da existência de `docs/`.
|
|
7
|
+
|
|
8
|
+
## Argumento
|
|
9
|
+
|
|
10
|
+
`<nome>` = nome do scope no Input (título da page no Confluence, nome da pasta no filesystem).
|
|
11
|
+
Usuário nomeia livremente. Convenção sugerida (opcional):
|
|
12
|
+
|
|
13
|
+
- Bootstrap/setup: `app_<nome_projeto>`, `bootstrap`, `setup_<nome>`
|
|
14
|
+
- Features: `feat_<nome_descritivo>`
|
|
15
|
+
- Bugs: `bug_<nome_descritivo>`
|
|
16
|
+
- Tasks técnicas: `task_<nome_descritivo>`
|
|
17
|
+
|
|
18
|
+
Framework aceita qualquer nome. Convenção é pra organização visual no Input.
|
|
19
|
+
|
|
20
|
+
## Execução
|
|
21
|
+
|
|
22
|
+
Siga EXATAMENTE os passos em ordem. Leia o arquivo completo antes de agir.
|
|
23
|
+
|
|
24
|
+
### Passo 1 — Detectar first_run
|
|
25
|
+
|
|
26
|
+
| Condição | Significado |
|
|
27
|
+
|----------|-------------|
|
|
28
|
+
| `docs/` ausente ou vazio | **first_run = true** — bootstrap do projeto. `/sf-design` vai criar `docs/` + `projetos.yaml` a partir do TRD |
|
|
29
|
+
| `docs/` populado (≥1 arquivo) | **first_run = false** — feature/incremento. `docs/` atualizado via `/sf-merge-docs` no fim do `/sf-dev` |
|
|
30
|
+
|
|
31
|
+
Registrar no `.context.md` (Passo 4). **Imutável** depois de criado.
|
|
32
|
+
|
|
33
|
+
### Passo 2 — Carregar insumos do backend (`/sf-load`)
|
|
34
|
+
|
|
35
|
+
**SEMPRE executar**, independente do Input já existir local.
|
|
36
|
+
`/sf-load` é idempotente — se já existe, detecta INALTERADO e não sobrescreve.
|
|
37
|
+
|
|
38
|
+
```
|
|
39
|
+
Executar /sf-load {nome}
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
Seguir TODOS os passos do `/sf-load` (ver `.github/skills/sf-load/SKILL.md`):
|
|
43
|
+
- Ler `sfw.config.yml` pra saber o adapter
|
|
44
|
+
- Buscar scope `{nome}` no backend
|
|
45
|
+
- Descer recursivamente até o último nível
|
|
46
|
+
- Materializar TUDO em `workspace/Input/{nome}/`
|
|
47
|
+
- Registrar no `.ai/load-log.md`
|
|
48
|
+
|
|
49
|
+
**Se `sfw.config.yml` não existe**: projeto é 100% local.
|
|
50
|
+
Pular `/sf-load` e ir direto pro Passo 3. Usuário deve ter colocado insumos
|
|
51
|
+
manualmente em `workspace/Input/{nome}/`.
|
|
52
|
+
|
|
53
|
+
### Passo 3 — Validar pré-condições
|
|
54
|
+
|
|
55
|
+
| # | Validação | Se falhar |
|
|
56
|
+
|---|-----------|-----------|
|
|
57
|
+
| 1 | `<nome>` foi informado como argumento | Parar → "Informe o nome. Ex: /sf-start feat_cadastro_cliente" |
|
|
58
|
+
| 2 | `workspace/Input/{nome}/` existe e contém ≥1 arquivo | Parar → "Nenhum insumo encontrado. Verifique o backend ou crie workspace/Input/{nome}/ manualmente" |
|
|
59
|
+
| 3 | `workspace/Output/{nome}/.context.md` não existe OU tem status `not_started` | Se avançado → "Scope já em andamento. Status: {status}. Para continuar de onde parou, rode a skill do próximo estágio" |
|
|
60
|
+
|
|
61
|
+
### Passo 4 — Criar estrutura de Output + `.context.md`
|
|
62
|
+
|
|
63
|
+
1. Criar `workspace/Output/{nome}/` se não existir
|
|
64
|
+
2. Criar `.context.md` usando template `.github/templates/feature/context.template.md`:
|
|
65
|
+
|
|
66
|
+
```yaml
|
|
67
|
+
---
|
|
68
|
+
nome: "{nome}"
|
|
69
|
+
first_run: {true|false} # derivado do Passo 1 (SEM aspas, bool real)
|
|
70
|
+
prd_existe: false # /sf-extract preenche
|
|
71
|
+
trd_existe: false # /sf-extract preenche
|
|
72
|
+
prd_aprovado: false # usuário (PM) marca true após revisar PRD
|
|
73
|
+
trd_aprovado: false # usuário (dev) marca true após revisar TRD
|
|
74
|
+
areas_tocadas: [] # /sf-design preenche a partir dos GATEs do TRD
|
|
75
|
+
input_path: "workspace/Input/{nome}/"
|
|
76
|
+
status: "not_started"
|
|
77
|
+
ultima_skill: "/sf-start"
|
|
78
|
+
atualizado_em: "{{ISO_DATETIME}}"
|
|
79
|
+
---
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
### Passo 5 — Executar `/sf-discovery` (OBRIGATÓRIO em v4)
|
|
83
|
+
|
|
84
|
+
> **Breaking v4**: discovery deixou de ser opcional. Força entendimento dos
|
|
85
|
+
> insumos antes da extração. Reduz iteração de fix em PRD/TRD.
|
|
86
|
+
|
|
87
|
+
```
|
|
88
|
+
Executar /sf-discovery workspace/Input/{nome}/
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
Seguir `.github/skills/sf-discovery/SKILL.md`. Output: `workspace/Output/{nome}/sf-discovery.md`.
|
|
92
|
+
|
|
93
|
+
Atualizar `.context.md`:
|
|
94
|
+
```yaml
|
|
95
|
+
status: "discovery_done"
|
|
96
|
+
ultima_skill: "/sf-discovery"
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
### Passo 6 — Executar `/sf-extract`
|
|
100
|
+
|
|
101
|
+
```
|
|
102
|
+
Executar /sf-extract {nome}
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
Seguir `.github/skills/sf-extract/SKILL.md`. Pode gerar **PRD, TRD ou ambos** — dependendo
|
|
106
|
+
dos insumos. Outputs:
|
|
107
|
+
|
|
108
|
+
- `workspace/Output/{nome}/PRD.md` — se insumos têm conteúdo de produto
|
|
109
|
+
- `workspace/Output/{nome}/TRD.md` — se insumos têm conteúdo técnico
|
|
110
|
+
- `workspace/Output/{nome}/.extract-log.md` — hashes + destino por arquivo
|
|
111
|
+
|
|
112
|
+
`/sf-extract` atualiza `.context.md`:
|
|
113
|
+
```yaml
|
|
114
|
+
status: "extract_done"
|
|
115
|
+
prd_existe: {true|false}
|
|
116
|
+
trd_existe: {true|false}
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
### Passo 7 — CHECKPOINT DUPLO — aprovação PM + dev
|
|
120
|
+
|
|
121
|
+
Após `/sf-extract`, o orquestrador **para** e informa o usuário. Há 2 aprovações
|
|
122
|
+
paralelas (ordem irrelevante entre elas, ambas precisam antes de prosseguir):
|
|
123
|
+
|
|
124
|
+
```
|
|
125
|
+
/sf-extract completou. Próximos passos:
|
|
126
|
+
|
|
127
|
+
┌─ [PM APROVA PRD] (se prd_existe=true)
|
|
128
|
+
│ 1. Abra workspace/Output/{nome}/PRD.md
|
|
129
|
+
│ 2. Revise as 13 seções
|
|
130
|
+
│ 3. Responda ambiguidades em §12 (coluna `Resposta`)
|
|
131
|
+
│ 4. Quando aprovar, edite .context.md: prd_aprovado: true
|
|
132
|
+
│
|
|
133
|
+
├─ [DEV APROVA TRD] (se trd_existe=true)
|
|
134
|
+
│ 1. Abra workspace/Output/{nome}/TRD.md
|
|
135
|
+
│ 2. Revise as 11 seções (§Sistema + GATEs §Área-*)
|
|
136
|
+
│ 3. Responda ambiguidades em §10 (coluna `Resposta`)
|
|
137
|
+
│ 4. Quando aprovar, edite .context.md: trd_aprovado: true
|
|
138
|
+
│
|
|
139
|
+
└─ Quando as aprovações aplicáveis estiverem true, execute:
|
|
140
|
+
/sf-design {nome}
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
**Cenários**:
|
|
144
|
+
- `prd_existe=true + trd_existe=true` (maioria): precisa PM aprovar PRD E dev aprovar TRD
|
|
145
|
+
- `prd_existe=true + trd_existe=false`: só PM precisa aprovar PRD
|
|
146
|
+
- `prd_existe=false + trd_existe=true`: só dev precisa aprovar TRD
|
|
147
|
+
- `prd_existe=false + trd_existe=false`: extract reportou erro (não é possível chegar aqui)
|
|
148
|
+
|
|
149
|
+
### Passo 8 — Encerrar orquestrador
|
|
150
|
+
|
|
151
|
+
Após o CHECKPOINT do Passo 7, `/sf-start` **encerra**. O usuário revisa e aprova
|
|
152
|
+
manualmente os docs, depois chama `/sf-design {nome}`.
|
|
153
|
+
|
|
154
|
+
**Pipeline completo (para referência do usuário)**:
|
|
155
|
+
|
|
156
|
+
```
|
|
157
|
+
/sf-start {nome} ← ORQUESTRADOR (este skill)
|
|
158
|
+
├─ /sf-load (se backend configurado)
|
|
159
|
+
├─ /sf-discovery (obrigatório)
|
|
160
|
+
├─ /sf-extract → gera PRD e/ou TRD
|
|
161
|
+
└─ STOP: aguarda aprovação PM (PRD) + aprovação dev (TRD)
|
|
162
|
+
|
|
163
|
+
[manual: revisar PRD.md, marcar prd_aprovado=true]
|
|
164
|
+
[manual: revisar TRD.md, marcar trd_aprovado=true]
|
|
165
|
+
|
|
166
|
+
/sf-design {nome}
|
|
167
|
+
├─ first_run=true: cria docs/ (5 arquivos) + projetos.yaml
|
|
168
|
+
├─ sempre: gera specs/{nome}/ (brief, contracts, scenarios)
|
|
169
|
+
└─ status → design_done
|
|
170
|
+
|
|
171
|
+
/sf-plan {nome}
|
|
172
|
+
└─ gera specs/{nome}/tasks.md + workspace/Output/{nome}/Progresso.md
|
|
173
|
+
└─ status → plan_done
|
|
174
|
+
|
|
175
|
+
/sf-dev {nome} (ou /sf-dev {nome} --fase 1)
|
|
176
|
+
├─ first_run=true: INFRA-001 cria/clona repos em projetos/
|
|
177
|
+
├─ implementa tasks com loop (coder → review → security review)
|
|
178
|
+
├─ E2E + aprovação
|
|
179
|
+
├─ se feature (first_run=false): chama /sf-merge-docs automaticamente
|
|
180
|
+
└─ status → dev_done → done
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
## Notas
|
|
184
|
+
|
|
185
|
+
- `/sf-load` é sempre o 1º passo real — garante Input sincronizado com backend
|
|
186
|
+
- Se não há `sfw.config.yml`, projeto é 100% local e `/sf-load` é pulado
|
|
187
|
+
- `first_run` é imutável após criação do `.context.md`
|
|
188
|
+
- `docs/` em first_run: NASCE no `/sf-design` (não no `/sf-extract`) a partir do TRD
|
|
189
|
+
- `projetos.yaml` é gerado pelo `/sf-design` em first_run
|
|
190
|
+
- **Aprovação dupla**: mesmo em time pequeno (dev = PM), mantém as 2 marcações —
|
|
191
|
+
"fluxo fica mais claro" vence cerimônia-mínima (decisão de v4)
|
|
192
|
+
- Ambiguidades em §12 PRD / §10 TRD são BLOQUEANTES — `/sf-design` não avança sem respostas
|