spec-first-copilot 0.7.0 → 0.8.0-beta.2
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 +45 -0
- package/bin/cli.js +1 -1
- package/package.json +1 -1
- package/templates/.github/CHANGELOG.md +61 -0
- package/templates/.github/copilot-instructions.md +4 -2
- 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-onboard/SKILL.md +437 -0
- 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/decisions.template.md +140 -107
- package/templates/.github/templates/feature/TRD.template.md +450 -358
- package/templates/.github/templates/feature/context.template.md +118 -89
|
@@ -1,93 +1,93 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: sf-session-finish
|
|
3
|
-
description: |
|
|
4
|
-
Encerrar sessão. Salva estado, atualiza napkin, gera retomada.md.
|
|
5
|
-
Trigger: /sf-session-finish
|
|
6
|
-
author: GustavoMaritan
|
|
7
|
-
version: 1.0.0
|
|
8
|
-
date: 2026-04-08
|
|
9
|
-
---
|
|
10
|
-
|
|
11
|
-
# /sf-session-finish
|
|
12
|
-
|
|
13
|
-
Encerra a sessão de trabalho de forma organizada.
|
|
14
|
-
Consolida estado, atualiza memória, gera ponto de retomada para a próxima sessão.
|
|
15
|
-
|
|
16
|
-
## Passos
|
|
17
|
-
|
|
18
|
-
### 1. Levantar estado atual
|
|
19
|
-
|
|
20
|
-
Para cada `.context.md` em `workspace/Output/*/`:
|
|
21
|
-
- Status atual + Progresso.md (% concluído, fase atual)
|
|
22
|
-
- Tasks em andamento
|
|
23
|
-
|
|
24
|
-
### 2. Verificar working tree dos repos
|
|
25
|
-
|
|
26
|
-
Para cada repo em `projetos/`:
|
|
27
|
-
```bash
|
|
28
|
-
cd projetos/{repo}
|
|
29
|
-
git status --short
|
|
30
|
-
git log --oneline -3
|
|
31
|
-
```
|
|
32
|
-
- Se working tree sujo → avisar (sugerir commit antes de pausar)
|
|
33
|
-
|
|
34
|
-
### 3. Atualizar `.ai/memory/napkin.md`
|
|
35
|
-
|
|
36
|
-
Atualizar seção `## Sessão Atual` com:
|
|
37
|
-
- Data, o que foi feito, o que estava em andamento
|
|
38
|
-
- Decisões tomadas, armadilhas encontradas
|
|
39
|
-
|
|
40
|
-
### 4. Gerar resumo de retomada
|
|
41
|
-
|
|
42
|
-
Criar/atualizar `workspace/Output/retomada.md`:
|
|
43
|
-
|
|
44
|
-
```markdown
|
|
45
|
-
# Ponto de Retomada — {{DATA}}
|
|
46
|
-
|
|
47
|
-
> Gerado pelo /sf-session-finish. Leia este arquivo ao iniciar a próxima sessão.
|
|
48
|
-
|
|
49
|
-
## Estado geral
|
|
50
|
-
|
|
51
|
-
| Feature/Setup | Status | Fase atual | % | Próxima ação |
|
|
52
|
-
|---------------|--------|------------|---|-------------|
|
|
53
|
-
| {{nome}} | {{status}} | Fase {{N}} | {{%}} | {{ação}} |
|
|
54
|
-
|
|
55
|
-
## Repos — estado do git
|
|
56
|
-
|
|
57
|
-
| Repo | Branch ativa | Working tree | Último commit |
|
|
58
|
-
|------|-------------|-------------|---------------|
|
|
59
|
-
| {{repo}} | {{branch}} | limpo/sujo | {{commit msg}} |
|
|
60
|
-
|
|
61
|
-
## O que estava em andamento
|
|
62
|
-
|
|
63
|
-
- Task: {{AREA-NNN}} — {{descrição}}
|
|
64
|
-
- Bloqueios: {{se houver}}
|
|
65
|
-
- Decisões pendentes: {{se houver}}
|
|
66
|
-
|
|
67
|
-
## Para retomar
|
|
68
|
-
|
|
69
|
-
1. {{Passo 1 — ex: "Subir infra: docker compose up -d"}}
|
|
70
|
-
2. {{Passo 2 — ex: "Continuar /sf-dev feat_mvp --fase 2"}}
|
|
71
|
-
3. {{Passo 3 — ex: "Resolver ambiguidade X do PRD"}}
|
|
72
|
-
|
|
73
|
-
## Aprendizados desta sessão
|
|
74
|
-
|
|
75
|
-
- {{Decisão ou armadilha que vale registrar}}
|
|
76
|
-
```
|
|
77
|
-
|
|
78
|
-
### 5. Informar ao usuário
|
|
79
|
-
|
|
80
|
-
```
|
|
81
|
-
✅ Sessão encerrada. Estado salvo em:
|
|
82
|
-
- `.ai/memory/napkin.md` — memória atualizada
|
|
83
|
-
- `workspace/Output/retomada.md` — ponto de retomada
|
|
84
|
-
|
|
85
|
-
Para retomar:
|
|
86
|
-
1. Ler retomada.md
|
|
87
|
-
2. Seguir os passos listados
|
|
88
|
-
```
|
|
89
|
-
|
|
90
|
-
## Notas
|
|
91
|
-
- Não modifica .context.md (status da pipeline não muda)
|
|
92
|
-
- Não faz commit automático — avisa se working tree sujo
|
|
93
|
-
- `retomada.md` é sobrescrito a cada /sf-session-finish (ponto atual, não histórico)
|
|
1
|
+
---
|
|
2
|
+
name: sf-session-finish
|
|
3
|
+
description: |
|
|
4
|
+
Encerrar sessão. Salva estado, atualiza napkin, gera retomada.md.
|
|
5
|
+
Trigger: /sf-session-finish
|
|
6
|
+
author: GustavoMaritan
|
|
7
|
+
version: 1.0.0
|
|
8
|
+
date: 2026-04-08
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# /sf-session-finish
|
|
12
|
+
|
|
13
|
+
Encerra a sessão de trabalho de forma organizada.
|
|
14
|
+
Consolida estado, atualiza memória, gera ponto de retomada para a próxima sessão.
|
|
15
|
+
|
|
16
|
+
## Passos
|
|
17
|
+
|
|
18
|
+
### 1. Levantar estado atual
|
|
19
|
+
|
|
20
|
+
Para cada `.context.md` em `workspace/Output/*/`:
|
|
21
|
+
- Status atual + Progresso.md (% concluído, fase atual)
|
|
22
|
+
- Tasks em andamento
|
|
23
|
+
|
|
24
|
+
### 2. Verificar working tree dos repos
|
|
25
|
+
|
|
26
|
+
Para cada repo em `projetos/`:
|
|
27
|
+
```bash
|
|
28
|
+
cd projetos/{repo}
|
|
29
|
+
git status --short
|
|
30
|
+
git log --oneline -3
|
|
31
|
+
```
|
|
32
|
+
- Se working tree sujo → avisar (sugerir commit antes de pausar)
|
|
33
|
+
|
|
34
|
+
### 3. Atualizar `.ai/memory/napkin.md`
|
|
35
|
+
|
|
36
|
+
Atualizar seção `## Sessão Atual` com:
|
|
37
|
+
- Data, o que foi feito, o que estava em andamento
|
|
38
|
+
- Decisões tomadas, armadilhas encontradas
|
|
39
|
+
|
|
40
|
+
### 4. Gerar resumo de retomada
|
|
41
|
+
|
|
42
|
+
Criar/atualizar `workspace/Output/retomada.md`:
|
|
43
|
+
|
|
44
|
+
```markdown
|
|
45
|
+
# Ponto de Retomada — {{DATA}}
|
|
46
|
+
|
|
47
|
+
> Gerado pelo /sf-session-finish. Leia este arquivo ao iniciar a próxima sessão.
|
|
48
|
+
|
|
49
|
+
## Estado geral
|
|
50
|
+
|
|
51
|
+
| Feature/Setup | Status | Fase atual | % | Próxima ação |
|
|
52
|
+
|---------------|--------|------------|---|-------------|
|
|
53
|
+
| {{nome}} | {{status}} | Fase {{N}} | {{%}} | {{ação}} |
|
|
54
|
+
|
|
55
|
+
## Repos — estado do git
|
|
56
|
+
|
|
57
|
+
| Repo | Branch ativa | Working tree | Último commit |
|
|
58
|
+
|------|-------------|-------------|---------------|
|
|
59
|
+
| {{repo}} | {{branch}} | limpo/sujo | {{commit msg}} |
|
|
60
|
+
|
|
61
|
+
## O que estava em andamento
|
|
62
|
+
|
|
63
|
+
- Task: {{AREA-NNN}} — {{descrição}}
|
|
64
|
+
- Bloqueios: {{se houver}}
|
|
65
|
+
- Decisões pendentes: {{se houver}}
|
|
66
|
+
|
|
67
|
+
## Para retomar
|
|
68
|
+
|
|
69
|
+
1. {{Passo 1 — ex: "Subir infra: docker compose up -d"}}
|
|
70
|
+
2. {{Passo 2 — ex: "Continuar /sf-dev feat_mvp --fase 2"}}
|
|
71
|
+
3. {{Passo 3 — ex: "Resolver ambiguidade X do PRD"}}
|
|
72
|
+
|
|
73
|
+
## Aprendizados desta sessão
|
|
74
|
+
|
|
75
|
+
- {{Decisão ou armadilha que vale registrar}}
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
### 5. Informar ao usuário
|
|
79
|
+
|
|
80
|
+
```
|
|
81
|
+
✅ Sessão encerrada. Estado salvo em:
|
|
82
|
+
- `.ai/memory/napkin.md` — memória atualizada
|
|
83
|
+
- `workspace/Output/retomada.md` — ponto de retomada
|
|
84
|
+
|
|
85
|
+
Para retomar:
|
|
86
|
+
1. Ler retomada.md
|
|
87
|
+
2. Seguir os passos listados
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
## Notas
|
|
91
|
+
- Não modifica .context.md (status da pipeline não muda)
|
|
92
|
+
- Não faz commit automático — avisa se working tree sujo
|
|
93
|
+
- `retomada.md` é sobrescrito a cada /sf-session-finish (ponto atual, não histórico)
|
|
@@ -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
|