spec-first-copilot 0.7.0 → 0.8.0-beta.1
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 +44 -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 +370 -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
package/README.md
CHANGED
|
@@ -20,6 +20,7 @@ agents especializados por área, security review e rastreabilidade ponta a ponta
|
|
|
20
20
|
- [Instalação](#instalação)
|
|
21
21
|
- [Estrutura gerada](#estrutura-gerada)
|
|
22
22
|
- [Pipeline passo a passo](#pipeline-passo-a-passo)
|
|
23
|
+
- [Brownfield: assumir aplicação existente](#brownfield-assumir-aplicação-existente)
|
|
23
24
|
- [Skills disponíveis](#skills-disponíveis)
|
|
24
25
|
- [Agents especializados](#agents-especializados)
|
|
25
26
|
- [Backends plugáveis (adapters)](#backends-plugáveis-adapters)
|
|
@@ -39,6 +40,7 @@ de código.
|
|
|
39
40
|
**Use-cases cobertos**:
|
|
40
41
|
- Bootstrap de projeto novo (define stack + arquitetura + primeiras features)
|
|
41
42
|
- Features novas em projeto existente (merge aditivo em docs cross-feature)
|
|
43
|
+
- **Brownfield**: assumir aplicação existente — `/sf-onboard` lê o código e gera a base documental (ver [seção dedicada](#brownfield-assumir-aplicação-existente))
|
|
42
44
|
- Bugs e tasks técnicas (mesmo pipeline, escopo menor)
|
|
43
45
|
- Times multi-dev (contratos firmes via `specs/` + `projetos.yaml`)
|
|
44
46
|
|
|
@@ -176,6 +178,48 @@ ausência/presença de `docs/`.
|
|
|
176
178
|
[`apresentacao.html`](https://github.com/gustavomaritan-labs/spec-first-workflow/blob/main/packages/apresentacao.html)
|
|
177
179
|
pra ver o fluxo completo com personas, artefatos e adapters.
|
|
178
180
|
|
|
181
|
+
## Brownfield: assumir aplicação existente
|
|
182
|
+
|
|
183
|
+
Para projetos que **já existem** e não nasceram com SFW. O `/sf-onboard` lê o
|
|
184
|
+
código, identifica stack/padrões/decisões observadas, e popula a base documental
|
|
185
|
+
(TRD + `docs/` + `projetos.yaml`) sem PRD.
|
|
186
|
+
|
|
187
|
+
**Filosofia**: cartógrafo, não arquiteto. Descreve o que existe sem julgar.
|
|
188
|
+
Coders de features futuras **seguem** os padrões observados — mudanças entram
|
|
189
|
+
como features propostas pelo dev.
|
|
190
|
+
|
|
191
|
+
```bash
|
|
192
|
+
# 1. Criar shell SFW vazio (mesma instalação)
|
|
193
|
+
spec-first-copilot init --name=MeuProjeto
|
|
194
|
+
cd MeuProjeto
|
|
195
|
+
|
|
196
|
+
# 2. Onboardar repo existente (pré-req: SSH/PAT já configurado)
|
|
197
|
+
/sf-onboard https://github.com/empresa/app-legado.git
|
|
198
|
+
|
|
199
|
+
# 3. (Multi-repo) Re-rodar pra cada repo do mesmo projeto
|
|
200
|
+
/sf-onboard https://github.com/empresa/app-legado-web.git
|
|
201
|
+
/sf-onboard https://github.com/empresa/app-legado-worker.git
|
|
202
|
+
|
|
203
|
+
# 4. Começar features novas com o pipeline normal
|
|
204
|
+
/sf-start feat_nova_funcionalidade
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
**O que é gerado**:
|
|
208
|
+
- `projetos/<repo>/` — clone(s) com `.git` próprio
|
|
209
|
+
- `workspace/Output/onboard_<repo>/TRD.md` — completo, com §1.6 Padrões Observados (snippets reais)
|
|
210
|
+
- `workspace/Input/onboard_<repo>/code-snapshot.md` — índice + hashes (re-onboard incremental)
|
|
211
|
+
- `docs/` — 5 arquivos cross-feature populados
|
|
212
|
+
- `projetos.yaml` — entries dos repos clonados
|
|
213
|
+
- `docs/decisions.md` — ADRs **inferidas** com flag `Inferido: true` (dev revisa e remove flag ao confirmar)
|
|
214
|
+
|
|
215
|
+
**Re-onboard** quando o código legado evolui: rodar de novo, hash detecta arquivos
|
|
216
|
+
modificados, merge aditivo no TRD.
|
|
217
|
+
|
|
218
|
+
**Diferença vs `/sf-start`**: brownfield NÃO gera PRD nem ambiguidades (código é
|
|
219
|
+
a verdade), não tem checkpoint humano, e auto-aprova TRD. Após onboard, features
|
|
220
|
+
novas entram pelo `/sf-start` normal — `first_run` da feature já será `false`
|
|
221
|
+
porque `docs/` existe.
|
|
222
|
+
|
|
179
223
|
## Skills disponíveis
|
|
180
224
|
|
|
181
225
|
| Skill | Tipo | Função |
|
|
@@ -184,6 +228,7 @@ pra ver o fluxo completo com personas, artefatos e adapters.
|
|
|
184
228
|
| `/sf-load <scope>` | Utilitária | Puxa Input do backend (incremental via hash) |
|
|
185
229
|
| `/sf-publish <scope> <tipo>` | Utilitária | Publica PRD/TRD/Progresso nos targets. Auto-chamada por extract/plan |
|
|
186
230
|
| `/sf-start <scope>` | Orquestrador | Entrada única. Cria `.context.md`, chama `/sf-load` + `/sf-discovery` + `/sf-extract` |
|
|
231
|
+
| `/sf-onboard <git-url>` | Atômica | **Brownfield**. Clona repo existente, gera TRD + docs/ + projetos.yaml (sem PRD) |
|
|
187
232
|
| `/sf-discovery <path>` | Atômica | Análise profunda prévia dos insumos (obrigatório em v4) |
|
|
188
233
|
| `/sf-extract <scope>` | Atômica | Gera PRD e/ou TRD conforme conteúdo dos insumos |
|
|
189
234
|
| `/sf-design <scope>` | Atômica | PRD+TRD aprovados → `specs/`. First-run também cria `docs/` + `projetos.yaml` |
|
package/bin/cli.js
CHANGED
package/package.json
CHANGED
|
@@ -8,6 +8,50 @@
|
|
|
8
8
|
|
|
9
9
|
---
|
|
10
10
|
|
|
11
|
+
## 0.8.0-beta.1 (2026-05-11) — Brownfield onboarding
|
|
12
|
+
|
|
13
|
+
Skill nova `/sf-onboard` pra assumir aplicações **já existentes**. Lê o
|
|
14
|
+
código, gera TRD + `docs/` + `projetos.yaml` sem PRD. Cartógrafo descritivo —
|
|
15
|
+
mapeia stack, padrões e decisões observadas sem julgar.
|
|
16
|
+
|
|
17
|
+
### Adicionado
|
|
18
|
+
|
|
19
|
+
- **`/sf-onboard <git-url> [--branch=X] [--tag=Y] [--name=Z]`** — skill atômica:
|
|
20
|
+
- Clone em `projetos/<repo>/` (auth via SSH/PAT do user)
|
|
21
|
+
- Snapshot rastreável em `workspace/Input/onboard_<repo>/code-snapshot.md` (hashes SHA-256)
|
|
22
|
+
- 7 readers paralelos: DB, Backend, Frontend, Infra, Dependency, Security, Patterns
|
|
23
|
+
- Analyzer (Opus) consolida → TRD + `docs/` 5-arquivos + `projetos.yaml`
|
|
24
|
+
- Multi-repo via re-execução com mesmo `--name`
|
|
25
|
+
- Re-onboard incremental (NOVO/MODIFICADO/INALTERADO via hash)
|
|
26
|
+
- Sem ambiguidades — código resolve tudo
|
|
27
|
+
- `trd_aprovado=true` automático
|
|
28
|
+
- **TRD §1.6 Padrões Observados** — nova seção obrigatória em onboard:
|
|
29
|
+
estrutura de pastas, naming, error handling, validação, testes, logging,
|
|
30
|
+
divergências internas. Com snippets reais do código (arquivo:linha).
|
|
31
|
+
Coders de features futuras leem antes de implementar.
|
|
32
|
+
- **ADRs inferidas** em `docs/decisions.md` — flag `Inferido: true` distingue
|
|
33
|
+
decisão observada (cartógrafo) de decisão tomada em discussão. Dev remove
|
|
34
|
+
flag ao confirmar.
|
|
35
|
+
- **`.context.md` campo `tipo`** — `scope` (pipeline normal) vs `onboard`
|
|
36
|
+
(brownfield). Campos novos: `repo_url`, `repo_branch`, `repo_path`.
|
|
37
|
+
- **Fluxo de status alternativo** para onboarding:
|
|
38
|
+
`not_started → cloned → analyzing → done`.
|
|
39
|
+
|
|
40
|
+
### Filosofia
|
|
41
|
+
|
|
42
|
+
- **Cartógrafo, não arquiteto**: descreve o que existe sem julgar.
|
|
43
|
+
- **Coders SEGUEM padrões observados** — propostas de mudança entram como
|
|
44
|
+
features explícitas do dev.
|
|
45
|
+
- **Não há checkpoint humano** em onboard — código é a verdade.
|
|
46
|
+
|
|
47
|
+
### Migração
|
|
48
|
+
|
|
49
|
+
Não-breaking. Projetos existentes em `0.7.0` continuam funcionando sem mudança.
|
|
50
|
+
Skill nova adicionada ao roster. Templates de `TRD.md`, `decisions.md` e
|
|
51
|
+
`.context.md` ganharam campos opcionais.
|
|
52
|
+
|
|
53
|
+
---
|
|
54
|
+
|
|
11
55
|
## 0.7.0 (2026-04-14) — Redesign v4 estável
|
|
12
56
|
|
|
13
57
|
Promoção de `0.7.0-beta.1` para versão estável. Inclui fix crítico:
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
|
|
22
22
|
### 2. Validar acesso a todos commands
|
|
23
23
|
|
|
24
|
-
Verificar que TODOS os
|
|
24
|
+
Verificar que TODOS os 12 commands estão acessíveis:
|
|
25
25
|
|
|
26
26
|
| Command | Caminho |
|
|
27
27
|
|---------|---------|
|
|
@@ -29,6 +29,7 @@ Verificar que TODOS os 11 commands estão acessíveis:
|
|
|
29
29
|
| `/sf-load` | `.github/skills/sf-load/SKILL.md` |
|
|
30
30
|
| `/sf-publish` | `.github/skills/sf-publish/SKILL.md` |
|
|
31
31
|
| `/sf-start` | `.github/skills/sf-start/SKILL.md` |
|
|
32
|
+
| `/sf-onboard` | `.github/skills/sf-onboard/SKILL.md` |
|
|
32
33
|
| `/sf-discovery` | `.github/skills/sf-discovery/SKILL.md` |
|
|
33
34
|
| `/sf-extract` | `.github/skills/sf-extract/SKILL.md` |
|
|
34
35
|
| `/sf-design` | `.github/skills/sf-design/SKILL.md` |
|
|
@@ -108,6 +109,7 @@ ESTE REPO (projeto-base) = ORQUESTRADOR
|
|
|
108
109
|
| `/sf-load <nome> \| --all` | Utilitária | Puxa Input + Output do backend. Incremental |
|
|
109
110
|
| `/sf-publish <nome> <tipo>` | Utilitária | Publica artefato (PRD/TRD/Progresso) nos output.targets[]. Chamado auto por extract/sf-design/sf-plan |
|
|
110
111
|
| `/sf-start <nome>` | Orquestrador | Entrada única do pipeline. Detecta first_run, cria .context.md, chama /sf-load + /sf-discovery + /sf-extract, para no checkpoint de aprovação |
|
|
112
|
+
| `/sf-onboard <git-url>` | Atômica | **Brownfield**. Clona repo existente em projetos/, lê código e gera TRD + docs/ + projetos.yaml (sem PRD). Cartógrafo descritivo |
|
|
111
113
|
| `/sf-discovery <path>` | Utilitária | Análise profunda dos insumos (OBRIGATÓRIO no /sf-start em v4) |
|
|
112
114
|
| `/sf-extract <nome>` | Atômica | Lê workspace/Input/{nome}/ → gera PRD e/ou TRD conforme conteúdo. Re-executável |
|
|
113
115
|
| `/sf-design <nome>` | Atômica | Requer PRD e/ou TRD aprovados → gera specs/. first_run cria docs/ + projetos.yaml |
|
|
@@ -173,7 +175,7 @@ Antes de executar qualquer command, verificar o status. Cada command só avança
|
|
|
173
175
|
│ ├── estrutura/ ← architecture, domain, conventions, apiContracts, decisions
|
|
174
176
|
│ └── global/ ← progresso_global
|
|
175
177
|
├── adapters/ ← SourceAdapter interface + ConfluenceAdapter + FilesystemAdapter
|
|
176
|
-
├── commands/ ←
|
|
178
|
+
├── commands/ ← 12 commands (mcp, load, publish, sf-start, sf-onboard, discovery, extract, design, plan, dev, merge-docs, session-finish)
|
|
177
179
|
└── agents/ ← 7 perfis de agents especializados
|
|
178
180
|
|
|
179
181
|
docs/ ← SÍNTESE CROSS-FEATURE (atualizada pelo /sf-merge-docs)
|
|
@@ -1,161 +1,161 @@
|
|
|
1
|
-
|
|
2
|
-
# /sf-design $ARGUMENTS
|
|
3
|
-
|
|
4
|
-
Skill atômica de design. Consome PRD + TRD aprovados e gera **`docs/` + `specs/{nome}/` + `projetos.yaml`** (este último em first-run).
|
|
5
|
-
`$ARGUMENTS` = nome do scope (ex: `app_barbearia`, `feat_cadastro_cliente`).
|
|
6
|
-
|
|
7
|
-
Em **first-run** (docs/ ausente): cria docs/ a partir do PRD+TRD + projetos.yaml + specs/.
|
|
8
|
-
Em **feature** (docs/ existe): não cria docs/ (vem pelo /sf-merge-docs depois do /sf-dev) + gera apenas specs/ do scope atual.
|
|
9
|
-
|
|
10
|
-
## Agente: Architect (Opus)
|
|
11
|
-
|
|
12
|
-
Técnico e preciso. Deriva projeções a partir dos docs source sem reinventar decisões.
|
|
13
|
-
|
|
14
|
-
## Pré-condições
|
|
15
|
-
|
|
16
|
-
| # | Validação | Se falhar |
|
|
17
|
-
|---|-----------|-----------|
|
|
18
|
-
| 1 | `$ARGUMENTS` informado | Parar |
|
|
19
|
-
| 2 | `.context.md` existe com status `extract_done` ou posterior | Se anterior → "/sf-extract $ARGUMENTS primeiro" |
|
|
20
|
-
| 3 | Se `prd_existe=true`: `PRD.md` existe E `prd_aprovado=true` | Parar, listar ambiguidades pendentes (ver bloco abaixo) |
|
|
21
|
-
| 4 | Se `trd_existe=true`: `TRD.md` existe E `trd_aprovado=true` | Parar, listar ambiguidades pendentes |
|
|
22
|
-
| 5 | Pelo menos um dos 2 existe e está aprovado | Parar → "Extração falhou — nenhum doc aprovado" |
|
|
23
|
-
|
|
24
|
-
Quando parar por ambiguidade:
|
|
25
|
-
|
|
26
|
-
```
|
|
27
|
-
Ambiguidades pendentes em PRD §12 / TRD §10:
|
|
28
|
-
|
|
29
|
-
AMB-PRD-001: {pergunta}
|
|
30
|
-
AMB-TRD-002: {pergunta}
|
|
31
|
-
|
|
32
|
-
Como responder:
|
|
33
|
-
1. Abra workspace/Output/$ARGUMENTS/PRD.md (ou TRD.md)
|
|
34
|
-
2. Vá até §Ambiguidades e preencha a coluna `Resposta`
|
|
35
|
-
3. Marque prd_aprovado=true (ou trd_aprovado=true) em .context.md
|
|
36
|
-
4. Rode /sf-design $ARGUMENTS de novo
|
|
37
|
-
|
|
38
|
-
Mais detalhes em .github/skills/sf-extract/SKILL.md → "Como responder ambiguidades".
|
|
39
|
-
```
|
|
40
|
-
|
|
41
|
-
## Passos
|
|
42
|
-
|
|
43
|
-
### 1. Carregar contexto
|
|
44
|
-
|
|
45
|
-
- `.context.md` → `first_run`, `prd_existe`, `trd_existe`, `areas_tocadas` (vazio, vai popular)
|
|
46
|
-
- `workspace/Output/$ARGUMENTS/PRD.md` (se `prd_existe=true`)
|
|
47
|
-
- `workspace/Output/$ARGUMENTS/TRD.md` (se `trd_existe=true`)
|
|
48
|
-
- `docs/` (se existir — feature mode): baseline cross-feature
|
|
49
|
-
- `discovery.md` (se existir): análise prévia
|
|
50
|
-
- `.github/rules.md`
|
|
51
|
-
- Templates:
|
|
52
|
-
- `.github/templates/specs/{brief,contracts,scenarios}.template.md`
|
|
53
|
-
- `.github/templates/estrutura/*.template.md` (só se first-run)
|
|
54
|
-
- `.github/templates/feature/projetos.template.yaml` (só se first-run)
|
|
55
|
-
|
|
56
|
-
### 2. Determinar áreas tocadas
|
|
57
|
-
|
|
58
|
-
Ler GATEs do TRD §2-§5 (se TRD existe). Áreas marcadas como `GATE: SIM` vão pra
|
|
59
|
-
`.context.md → areas_tocadas: [...]`.
|
|
60
|
-
|
|
61
|
-
Se TRD não existe (scope puro-produto, raro): `areas_tocadas = []`; `/sf-plan` vai
|
|
62
|
-
gerar só tasks de frontend com base no PRD §7.
|
|
63
|
-
|
|
64
|
-
### 3. Branch first-run vs feature
|
|
65
|
-
|
|
66
|
-
Ler `first_run` do `.context.md`.
|
|
67
|
-
|
|
68
|
-
#### Branch A — first_run = true (bootstrap)
|
|
69
|
-
|
|
70
|
-
1. **Gerar `docs/`** (5 arquivos em `docs/` na raiz do projeto):
|
|
71
|
-
|
|
72
|
-
| Doc gerado | Fontes |
|
|
73
|
-
|-----------|--------|
|
|
74
|
-
| `architecture.md` | TRD §1.1 Stack + §1.2 Arquitetura + §1.3 Ambientes + §1.4 Deploy + §5 §Área-Infra |
|
|
75
|
-
| `domain.md` | PRD §1 Contexto + §2 Atores + §3 Jornadas (resumo) + TRD §4 §Área-DB |
|
|
76
|
-
| `conventions.md` | TRD §1.5 Segurança baseline + §7 Segurança detalhada + §5.3 Env vars + §5.4 Monitoramento |
|
|
77
|
-
| `apiContracts.md` | TRD §2.1 Endpoints + convenções de rota inferidas |
|
|
78
|
-
| `decisions.md` | TRD §9 ADRs (transcritas como ADR-001, ADR-002... imutáveis) |
|
|
79
|
-
|
|
80
|
-
Regras:
|
|
81
|
-
- Ler template → preencher TODAS as seções com dados do PRD/TRD
|
|
82
|
-
- Remover bloco `<!-- INSTRUÇÕES -->` do doc gerado
|
|
83
|
-
- Changelog inicia vazio
|
|
84
|
-
- Se PRD ou TRD não tem dados pra uma seção → "A definir" (não deixar vazio)
|
|
85
|
-
|
|
86
|
-
2. **Gerar `projetos.yaml`** na raiz:
|
|
87
|
-
|
|
88
|
-
- Identificar serviços separados no TRD §1.2 Containers (api, worker, web, etc.)
|
|
89
|
-
- Perguntar ao usuário: organização GitHub, nome base, se algum repo já existe
|
|
90
|
-
- Mapear áreas → repos (API+DB costumam ir juntos; Frontend separado)
|
|
91
|
-
- Validar: cada área em `areas_tocadas` tem repo correspondente
|
|
92
|
-
|
|
93
|
-
3. **Gerar `specs/$ARGUMENTS/`** (passo 4 abaixo, comum a first-run e feature)
|
|
94
|
-
|
|
95
|
-
#### Branch B — first_run = false (feature)
|
|
96
|
-
|
|
97
|
-
1. **Não toca em `docs/`** (isso é trabalho do /sf-merge-docs após /sf-dev)
|
|
98
|
-
2. **Não gera `projetos.yaml`** (já existe do first-run)
|
|
99
|
-
3. **Gera apenas `specs/$ARGUMENTS/`**
|
|
100
|
-
|
|
101
|
-
### 4. Gerar `specs/$ARGUMENTS/` (sempre)
|
|
102
|
-
|
|
103
|
-
Criar/sobrescrever os 4 arquivos em `specs/$ARGUMENTS/`:
|
|
104
|
-
|
|
105
|
-
| Arquivo | Projeção de | Conteúdo |
|
|
106
|
-
|---------|-------------|----------|
|
|
107
|
-
| `brief.md` | PRD §1 + §10 + §11 + TRD §1 | Problema, Solução, Serviços tocados (de projetos.yaml), Escopo (Dentro/Fora), Decisões principais (ADRs resumidas) |
|
|
108
|
-
| `contracts.md` | TRD §4 + §2.3 + §2.1 + §6 + PRD §5 | Dados (schema), Validações de Entrada, API (endpoints específicos), Integrações externas, Regras de Negócio com enforcement point |
|
|
109
|
-
| `scenarios.md` | PRD §3 + §8 + §7 + TRD §8 | Pré-condições globais, Fluxos happy path, Fluxos de erro (com Ref CA), UI por componente, CAs com Given/When/Then, Estratégia de testes |
|
|
110
|
-
| `tasks.md` | stub | (preenchido pelo `/sf-plan`) |
|
|
111
|
-
|
|
112
|
-
Regras:
|
|
113
|
-
- Projeções são **REGENERÁVEIS** — ao re-rodar `/sf-design`, sobrescreve
|
|
114
|
-
- NUNCA editar direto em `specs/` — PRD/TRD são as fontes
|
|
115
|
-
- Templates em `.github/templates/specs/`
|
|
116
|
-
- Coders e Reviewer leem daqui, NUNCA de PRD/TRD direto
|
|
117
|
-
|
|
118
|
-
### 5. Validação de consistência
|
|
119
|
-
|
|
120
|
-
Antes de terminar, verificar:
|
|
121
|
-
- Cada RN do PRD §5 aparece em `contracts.md → Regras de Negócio` com enforcement point
|
|
122
|
-
- Cada endpoint do TRD §2.1 aparece em `contracts.md → API`
|
|
123
|
-
- Cada CA em `scenarios.md` mapeia pra pelo menos 1 RN ou 1 jornada
|
|
124
|
-
- Áreas em `areas_tocadas` têm entries em `contracts.md` e `scenarios.md`
|
|
125
|
-
|
|
126
|
-
Divergências → alertar no output, sem falhar.
|
|
127
|
-
|
|
128
|
-
### 6. Atualizar `.context.md`
|
|
129
|
-
|
|
130
|
-
```yaml
|
|
131
|
-
status: "design_done"
|
|
132
|
-
areas_tocadas: [BACK, DB, ...] # derivado do passo 2
|
|
133
|
-
ultima_skill: "/sf-design"
|
|
134
|
-
atualizado_em: "{{ISO_DATETIME}}"
|
|
135
|
-
```
|
|
136
|
-
|
|
137
|
-
### 7. Saída obrigatória
|
|
138
|
-
|
|
139
|
-
```
|
|
140
|
-
/sf-design $ARGUMENTS — completo ({{first-run | feature}})
|
|
141
|
-
|
|
142
|
-
Artefatos:
|
|
143
|
-
- specs/$ARGUMENTS/brief.md
|
|
144
|
-
- specs/$ARGUMENTS/contracts.md
|
|
145
|
-
- specs/$ARGUMENTS/scenarios.md
|
|
146
|
-
- specs/$ARGUMENTS/tasks.md (stub — será preenchido por /sf-plan)
|
|
147
|
-
(se first-run:)
|
|
148
|
-
- docs/architecture.md, domain.md, conventions.md, apiContracts.md, decisions.md
|
|
149
|
-
- projetos.yaml
|
|
150
|
-
|
|
151
|
-
Áreas tocadas: [BACK, DB, FRONT, INFRA]
|
|
152
|
-
Validação: {{N issues / passed}}
|
|
153
|
-
|
|
154
|
-
Próximo passo: /sf-plan $ARGUMENTS
|
|
155
|
-
```
|
|
156
|
-
|
|
157
|
-
## Regra de ouro
|
|
158
|
-
|
|
159
|
-
- `/sf-design` NUNCA reinventa decisões. Apenas projeta PRD+TRD pra formatos consumíveis.
|
|
160
|
-
- Se precisa de uma decisão nova que não está no PRD ou TRD: é ambiguidade — voltar pra `/sf-extract` com novo insumo.
|
|
161
|
-
- Divergências entre PRD e TRD: **PRD vence em produto, TRD vence em técnica** (não há overlap por design).
|
|
1
|
+
|
|
2
|
+
# /sf-design $ARGUMENTS
|
|
3
|
+
|
|
4
|
+
Skill atômica de design. Consome PRD + TRD aprovados e gera **`docs/` + `specs/{nome}/` + `projetos.yaml`** (este último em first-run).
|
|
5
|
+
`$ARGUMENTS` = nome do scope (ex: `app_barbearia`, `feat_cadastro_cliente`).
|
|
6
|
+
|
|
7
|
+
Em **first-run** (docs/ ausente): cria docs/ a partir do PRD+TRD + projetos.yaml + specs/.
|
|
8
|
+
Em **feature** (docs/ existe): não cria docs/ (vem pelo /sf-merge-docs depois do /sf-dev) + gera apenas specs/ do scope atual.
|
|
9
|
+
|
|
10
|
+
## Agente: Architect (Opus)
|
|
11
|
+
|
|
12
|
+
Técnico e preciso. Deriva projeções a partir dos docs source sem reinventar decisões.
|
|
13
|
+
|
|
14
|
+
## Pré-condições
|
|
15
|
+
|
|
16
|
+
| # | Validação | Se falhar |
|
|
17
|
+
|---|-----------|-----------|
|
|
18
|
+
| 1 | `$ARGUMENTS` informado | Parar |
|
|
19
|
+
| 2 | `.context.md` existe com status `extract_done` ou posterior | Se anterior → "/sf-extract $ARGUMENTS primeiro" |
|
|
20
|
+
| 3 | Se `prd_existe=true`: `PRD.md` existe E `prd_aprovado=true` | Parar, listar ambiguidades pendentes (ver bloco abaixo) |
|
|
21
|
+
| 4 | Se `trd_existe=true`: `TRD.md` existe E `trd_aprovado=true` | Parar, listar ambiguidades pendentes |
|
|
22
|
+
| 5 | Pelo menos um dos 2 existe e está aprovado | Parar → "Extração falhou — nenhum doc aprovado" |
|
|
23
|
+
|
|
24
|
+
Quando parar por ambiguidade:
|
|
25
|
+
|
|
26
|
+
```
|
|
27
|
+
Ambiguidades pendentes em PRD §12 / TRD §10:
|
|
28
|
+
|
|
29
|
+
AMB-PRD-001: {pergunta}
|
|
30
|
+
AMB-TRD-002: {pergunta}
|
|
31
|
+
|
|
32
|
+
Como responder:
|
|
33
|
+
1. Abra workspace/Output/$ARGUMENTS/PRD.md (ou TRD.md)
|
|
34
|
+
2. Vá até §Ambiguidades e preencha a coluna `Resposta`
|
|
35
|
+
3. Marque prd_aprovado=true (ou trd_aprovado=true) em .context.md
|
|
36
|
+
4. Rode /sf-design $ARGUMENTS de novo
|
|
37
|
+
|
|
38
|
+
Mais detalhes em .github/skills/sf-extract/SKILL.md → "Como responder ambiguidades".
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## Passos
|
|
42
|
+
|
|
43
|
+
### 1. Carregar contexto
|
|
44
|
+
|
|
45
|
+
- `.context.md` → `first_run`, `prd_existe`, `trd_existe`, `areas_tocadas` (vazio, vai popular)
|
|
46
|
+
- `workspace/Output/$ARGUMENTS/PRD.md` (se `prd_existe=true`)
|
|
47
|
+
- `workspace/Output/$ARGUMENTS/TRD.md` (se `trd_existe=true`)
|
|
48
|
+
- `docs/` (se existir — feature mode): baseline cross-feature
|
|
49
|
+
- `discovery.md` (se existir): análise prévia
|
|
50
|
+
- `.github/rules.md`
|
|
51
|
+
- Templates:
|
|
52
|
+
- `.github/templates/specs/{brief,contracts,scenarios}.template.md`
|
|
53
|
+
- `.github/templates/estrutura/*.template.md` (só se first-run)
|
|
54
|
+
- `.github/templates/feature/projetos.template.yaml` (só se first-run)
|
|
55
|
+
|
|
56
|
+
### 2. Determinar áreas tocadas
|
|
57
|
+
|
|
58
|
+
Ler GATEs do TRD §2-§5 (se TRD existe). Áreas marcadas como `GATE: SIM` vão pra
|
|
59
|
+
`.context.md → areas_tocadas: [...]`.
|
|
60
|
+
|
|
61
|
+
Se TRD não existe (scope puro-produto, raro): `areas_tocadas = []`; `/sf-plan` vai
|
|
62
|
+
gerar só tasks de frontend com base no PRD §7.
|
|
63
|
+
|
|
64
|
+
### 3. Branch first-run vs feature
|
|
65
|
+
|
|
66
|
+
Ler `first_run` do `.context.md`.
|
|
67
|
+
|
|
68
|
+
#### Branch A — first_run = true (bootstrap)
|
|
69
|
+
|
|
70
|
+
1. **Gerar `docs/`** (5 arquivos em `docs/` na raiz do projeto):
|
|
71
|
+
|
|
72
|
+
| Doc gerado | Fontes |
|
|
73
|
+
|-----------|--------|
|
|
74
|
+
| `architecture.md` | TRD §1.1 Stack + §1.2 Arquitetura + §1.3 Ambientes + §1.4 Deploy + §5 §Área-Infra |
|
|
75
|
+
| `domain.md` | PRD §1 Contexto + §2 Atores + §3 Jornadas (resumo) + TRD §4 §Área-DB |
|
|
76
|
+
| `conventions.md` | TRD §1.5 Segurança baseline + §7 Segurança detalhada + §5.3 Env vars + §5.4 Monitoramento |
|
|
77
|
+
| `apiContracts.md` | TRD §2.1 Endpoints + convenções de rota inferidas |
|
|
78
|
+
| `decisions.md` | TRD §9 ADRs (transcritas como ADR-001, ADR-002... imutáveis) |
|
|
79
|
+
|
|
80
|
+
Regras:
|
|
81
|
+
- Ler template → preencher TODAS as seções com dados do PRD/TRD
|
|
82
|
+
- Remover bloco `<!-- INSTRUÇÕES -->` do doc gerado
|
|
83
|
+
- Changelog inicia vazio
|
|
84
|
+
- Se PRD ou TRD não tem dados pra uma seção → "A definir" (não deixar vazio)
|
|
85
|
+
|
|
86
|
+
2. **Gerar `projetos.yaml`** na raiz:
|
|
87
|
+
|
|
88
|
+
- Identificar serviços separados no TRD §1.2 Containers (api, worker, web, etc.)
|
|
89
|
+
- Perguntar ao usuário: organização GitHub, nome base, se algum repo já existe
|
|
90
|
+
- Mapear áreas → repos (API+DB costumam ir juntos; Frontend separado)
|
|
91
|
+
- Validar: cada área em `areas_tocadas` tem repo correspondente
|
|
92
|
+
|
|
93
|
+
3. **Gerar `specs/$ARGUMENTS/`** (passo 4 abaixo, comum a first-run e feature)
|
|
94
|
+
|
|
95
|
+
#### Branch B — first_run = false (feature)
|
|
96
|
+
|
|
97
|
+
1. **Não toca em `docs/`** (isso é trabalho do /sf-merge-docs após /sf-dev)
|
|
98
|
+
2. **Não gera `projetos.yaml`** (já existe do first-run)
|
|
99
|
+
3. **Gera apenas `specs/$ARGUMENTS/`**
|
|
100
|
+
|
|
101
|
+
### 4. Gerar `specs/$ARGUMENTS/` (sempre)
|
|
102
|
+
|
|
103
|
+
Criar/sobrescrever os 4 arquivos em `specs/$ARGUMENTS/`:
|
|
104
|
+
|
|
105
|
+
| Arquivo | Projeção de | Conteúdo |
|
|
106
|
+
|---------|-------------|----------|
|
|
107
|
+
| `brief.md` | PRD §1 + §10 + §11 + TRD §1 | Problema, Solução, Serviços tocados (de projetos.yaml), Escopo (Dentro/Fora), Decisões principais (ADRs resumidas) |
|
|
108
|
+
| `contracts.md` | TRD §4 + §2.3 + §2.1 + §6 + PRD §5 | Dados (schema), Validações de Entrada, API (endpoints específicos), Integrações externas, Regras de Negócio com enforcement point |
|
|
109
|
+
| `scenarios.md` | PRD §3 + §8 + §7 + TRD §8 | Pré-condições globais, Fluxos happy path, Fluxos de erro (com Ref CA), UI por componente, CAs com Given/When/Then, Estratégia de testes |
|
|
110
|
+
| `tasks.md` | stub | (preenchido pelo `/sf-plan`) |
|
|
111
|
+
|
|
112
|
+
Regras:
|
|
113
|
+
- Projeções são **REGENERÁVEIS** — ao re-rodar `/sf-design`, sobrescreve
|
|
114
|
+
- NUNCA editar direto em `specs/` — PRD/TRD são as fontes
|
|
115
|
+
- Templates em `.github/templates/specs/`
|
|
116
|
+
- Coders e Reviewer leem daqui, NUNCA de PRD/TRD direto
|
|
117
|
+
|
|
118
|
+
### 5. Validação de consistência
|
|
119
|
+
|
|
120
|
+
Antes de terminar, verificar:
|
|
121
|
+
- Cada RN do PRD §5 aparece em `contracts.md → Regras de Negócio` com enforcement point
|
|
122
|
+
- Cada endpoint do TRD §2.1 aparece em `contracts.md → API`
|
|
123
|
+
- Cada CA em `scenarios.md` mapeia pra pelo menos 1 RN ou 1 jornada
|
|
124
|
+
- Áreas em `areas_tocadas` têm entries em `contracts.md` e `scenarios.md`
|
|
125
|
+
|
|
126
|
+
Divergências → alertar no output, sem falhar.
|
|
127
|
+
|
|
128
|
+
### 6. Atualizar `.context.md`
|
|
129
|
+
|
|
130
|
+
```yaml
|
|
131
|
+
status: "design_done"
|
|
132
|
+
areas_tocadas: [BACK, DB, ...] # derivado do passo 2
|
|
133
|
+
ultima_skill: "/sf-design"
|
|
134
|
+
atualizado_em: "{{ISO_DATETIME}}"
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
### 7. Saída obrigatória
|
|
138
|
+
|
|
139
|
+
```
|
|
140
|
+
/sf-design $ARGUMENTS — completo ({{first-run | feature}})
|
|
141
|
+
|
|
142
|
+
Artefatos:
|
|
143
|
+
- specs/$ARGUMENTS/brief.md
|
|
144
|
+
- specs/$ARGUMENTS/contracts.md
|
|
145
|
+
- specs/$ARGUMENTS/scenarios.md
|
|
146
|
+
- specs/$ARGUMENTS/tasks.md (stub — será preenchido por /sf-plan)
|
|
147
|
+
(se first-run:)
|
|
148
|
+
- docs/architecture.md, domain.md, conventions.md, apiContracts.md, decisions.md
|
|
149
|
+
- projetos.yaml
|
|
150
|
+
|
|
151
|
+
Áreas tocadas: [BACK, DB, FRONT, INFRA]
|
|
152
|
+
Validação: {{N issues / passed}}
|
|
153
|
+
|
|
154
|
+
Próximo passo: /sf-plan $ARGUMENTS
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
## Regra de ouro
|
|
158
|
+
|
|
159
|
+
- `/sf-design` NUNCA reinventa decisões. Apenas projeta PRD+TRD pra formatos consumíveis.
|
|
160
|
+
- Se precisa de uma decisão nova que não está no PRD ou TRD: é ambiguidade — voltar pra `/sf-extract` com novo insumo.
|
|
161
|
+
- Divergências entre PRD e TRD: **PRD vence em produto, TRD vence em técnica** (não há overlap por design).
|