spec-first-copilot 0.6.0-beta.9 → 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.
Files changed (57) hide show
  1. package/README.md +252 -167
  2. package/bin/cli.js +70 -70
  3. package/lib/init.js +92 -92
  4. package/lib/update.js +132 -132
  5. package/package.json +1 -1
  6. package/templates/.ai/memory/napkin.md +68 -68
  7. package/templates/.github/CHANGELOG.md +121 -0
  8. package/templates/.github/adapters/SETUP.md +314 -314
  9. package/templates/.github/adapters/confluence.md +295 -295
  10. package/templates/.github/adapters/errors.md +234 -234
  11. package/templates/.github/adapters/filesystem.md +353 -353
  12. package/templates/.github/adapters/interface.md +301 -301
  13. package/templates/.github/adapters/naming.md +241 -241
  14. package/templates/.github/adapters/registry.md +244 -244
  15. package/templates/.github/agents/backend-coder.md +14 -14
  16. package/templates/.github/agents/db-coder.md +165 -165
  17. package/templates/.github/agents/doc-writer.md +66 -53
  18. package/templates/.github/agents/frontend-coder.md +5 -5
  19. package/templates/.github/agents/infra-coder.md +341 -341
  20. package/templates/.github/agents/reviewer.md +6 -6
  21. package/templates/.github/agents/security-reviewer.md +153 -153
  22. package/templates/.github/copilot-instructions.md +272 -262
  23. package/templates/.github/instructions/docs.instructions.md +147 -145
  24. package/templates/.github/instructions/sensitive-files.instructions.md +32 -32
  25. package/templates/.github/rules.md +229 -229
  26. package/templates/.github/scripts/bootstrap-confluence.js +289 -223
  27. package/templates/.github/skills/sf-design/SKILL.md +161 -216
  28. package/templates/.github/skills/sf-dev/SKILL.md +204 -351
  29. package/templates/.github/skills/sf-discovery/SKILL.md +415 -414
  30. package/templates/.github/skills/sf-extract/SKILL.md +225 -249
  31. package/templates/.github/skills/sf-load/SKILL.md +296 -295
  32. package/templates/.github/skills/sf-mcp/SKILL.md +386 -385
  33. package/templates/.github/skills/sf-merge-docs/SKILL.md +152 -100
  34. package/templates/.github/skills/sf-plan/SKILL.md +152 -128
  35. package/templates/.github/skills/sf-publish/SKILL.md +144 -143
  36. package/templates/.github/skills/sf-session-finish/SKILL.md +93 -120
  37. package/templates/.github/skills/sf-start/SKILL.md +192 -145
  38. package/templates/.github/templates/estrutura/apiContracts.template.md +160 -159
  39. package/templates/.github/templates/estrutura/architecture.template.md +169 -168
  40. package/templates/.github/templates/estrutura/conventions.template.md +214 -212
  41. package/templates/.github/templates/estrutura/decisions.template.md +107 -107
  42. package/templates/.github/templates/estrutura/domain.template.md +161 -160
  43. package/templates/.github/templates/feature/PRD.template.md +279 -286
  44. package/templates/.github/templates/feature/Progresso.template.md +141 -141
  45. package/templates/.github/templates/feature/TRD.template.md +358 -0
  46. package/templates/.github/templates/feature/context.template.md +89 -48
  47. package/templates/.github/templates/feature/extract-log.template.md +49 -39
  48. package/templates/.github/templates/feature/projetos.template.yaml +79 -79
  49. package/templates/.github/templates/global/progresso_global.template.md +59 -57
  50. package/templates/.github/templates/specs/brief.template.md +66 -59
  51. package/templates/.github/templates/specs/contracts.template.md +147 -141
  52. package/templates/.github/templates/specs/scenarios.template.md +125 -117
  53. package/templates/.github/templates/specs/tasks.template.md +65 -63
  54. package/templates/_gitignore +35 -35
  55. package/templates/sfw.config.yml.example +147 -147
  56. package/templates/.github/templates/feature/backlog-extraido.template.md +0 -156
  57. package/templates/.github/templates/feature/sdd.template.md +0 -559
@@ -1,100 +1,152 @@
1
- # /sf-merge-docs $ARGUMENTS
2
-
3
- Skill atômica pós-dev. Aplica SDD §11 Delta Specs em `docs/` pra manter a síntese cross-feature sincronizada com o estado do sistema.
4
- `$ARGUMENTS` = nome do scope (ex: `feat_cadastro_cliente`).
5
-
6
- Chamado automaticamente pelo `/sf-dev` ao final. Re-executável manualmente se precisar.
7
-
8
- > **Renomeado de `/sf-merge-delta` em v3**. "Delta Specs" fica como conceito interno no SDD §11 (mecanismo OpenSpec). O nome do command alinha ao outcome (atualiza docs/).
9
-
10
- ## Agente: Integrator (Sonnet)
11
-
12
- Meticuloso com consistência. Aplica apenas o que §11 diz. Merge idempotente — re-aplicar o mesmo delta não duplica.
13
-
14
- ## Pré-condições
15
-
16
- | # | Validação | Se falhar |
17
- |---|-----------|-----------|
18
- | 1 | `$ARGUMENTS` informado | Parar |
19
- | 2 | `.context.md` com status `dev_done` | Se anterior → "Rode /sf-dev primeiro" |
20
- | 3 | `workspace/Output/$ARGUMENTS/sdd.md` §11 Delta Specs presente | Parar |
21
- | 4 | `docs/` populado | Parar "docs/ não existe. /sf-design com first_run=true é quem cria docs/" |
22
-
23
- Note: **serve pra first-run e feature**. Em first-run, `/sf-design` criou `docs/` a partir do SDD §Sistema (passo 6 do /sf-design). §11 de first-run geralmente lista tudo em ADDED refletindo o estado criado — `/sf-merge-docs` nesse caso é idempotente (merge não duplica). Em feature, aplica as mudanças incrementais de verdade.
24
-
25
- ## Passos
26
-
27
- ### 1. Ler SDD §11 Delta Specs
28
-
29
- | Tipo | Significado |
30
- |------|-------------|
31
- | ADDED | Elemento novo (tabela, endpoint, tela, env var, ADR) |
32
- | MODIFIED | Elemento existente alterado (campo mudou tipo, auth expandida) |
33
- | REMOVED | Elemento removido ou deprecado |
34
-
35
- Cada item referencia arquivo-alvo: `docs/conventions.md §Autenticação`.
36
-
37
- ### 2. Mapear elementos → arquivo alvo em docs/
38
-
39
- | Elemento do delta | Doc alvo |
40
- |-------------------|----------|
41
- | Tabelas, colunas, índices, entidades, FKs | `domain.md` |
42
- | Atores, permissões (modelo), integrações externas, glossário | `domain.md` |
43
- | Endpoints (catálogo), rotas, paginação, filtros, erros HTTP | `apiContracts.md` |
44
- | Containers, stack, ambientes, deploy, CI/CD, rollback | `architecture.md` |
45
- | Padrões de comunicação, padrões de design | `architecture.md` |
46
- | Auth, authz, roles, matriz de permissões, CORS, rate limiting | `conventions.md` |
47
- | LGPD, auditoria, TLS, criptografia | `conventions.md` |
48
- | Env vars, domínios, monitoramento, observabilidade | `conventions.md` |
49
- | Códigos de erro do domínio, alternativas tech descartadas, versionamento | `conventions.md` |
50
- | Decisões arquiteturais (ADR-*) | `decisions.md` |
51
-
52
- ### 3. Aplicar deltas (merge idempotente)
53
-
54
- Para cada delta:
55
- - **ADDED** localizar seção apropriada no doc, adicionar conteúdo. Se existe conteúdo idêntico → skip (idempotente).
56
- - **MODIFIED** localizar elemento pelo ID/nome, atualizar campos. Se elemento ausente criar como ADDED.
57
- - **REMOVED** — marcar como deprecated (não apagar). ADRs sempre viram `status: substituída por ADR-XXX`.
58
-
59
- ### 4. Registrar changelog em cada doc afetado
60
-
61
- ```markdown
62
- ## Changelog
63
-
64
- | Data | Feature | Tipo | Descrição |
65
- |------|---------|------|-----------|
66
- | {{data}} | $ARGUMENTS | ADDED | Endpoint POST /api/v1/users |
67
- | {{data}} | $ARGUMENTS | MODIFIED | Matriz de permissões: novo role `manager` |
68
- ```
69
-
70
- ### 5. Validar consistência
71
-
72
- - Referências quebradas (endpoint deletado mas mencionado em outro lugar) reportar
73
- - REMOVED deixou órfãos (role que ainda aparece em policies ativas) reportar
74
- - ADR-NNN substituída mas ainda referenciada → reportar
75
-
76
- ### 6. Atualizar status
77
-
78
- - `.context.md` `status: done`, `ultima_skill: /sf-merge-docs`
79
- - `progresso.md` global scope concluído
80
-
81
- ### 7. Informar ao usuário
82
-
83
- ```
84
- docs/ sincronizada com SDD de $ARGUMENTS.
85
- Arquivos afetados:
86
- - docs/apiContracts.md (3 endpoints ADDED)
87
- - docs/conventions.md (1 role ADDED, matriz atualizada)
88
- - docs/decisions.md (ADR-005 ADDED)
89
- ```
90
-
91
- ## Erros
92
-
93
- | Erro | Ação |
94
- |------|------|
95
- | Status não é `dev_done` | Parar — pedir rodar /sf-dev primeiro |
96
- | `docs/` não existe | Parar explicar que /sf-design em first-run é quem cria docs/ |
97
- | §11 Delta Specs vazia | Marcar `done` (legítimo em refactors que não mudam sistema) |
98
- | Elemento MODIFIED não encontrado no doc | Converter pra ADDED (doc estava desatualizado) + reportar |
99
- | Elemento REMOVED não encontrado | Skip + reportar (provavelmente já foi removido antes) |
100
- | Referências quebradas detectadas | Parar, listar inconsistências, pedir resolução manual |
1
+
2
+ # /sf-merge-docs $ARGUMENTS
3
+
4
+ Skill atômica pós-dev. Aplica as decisões de **PRD + TRD aprovados** em `docs/` pra manter a síntese cross-feature sincronizada com o estado do sistema.
5
+ `$ARGUMENTS` = nome do scope (ex: `feat_cadastro_cliente`).
6
+
7
+ Chamado automaticamente pelo `/sf-dev` ao final. Re-executável manualmente quando precisa.
8
+
9
+ > **Mudança v3 → v4**: antes aplicava `SDD §11 Delta Specs` (mecanismo OpenSpec).
10
+ > Agora **PRD + TRD aprovados diretamente** e infere o delta comparando com
11
+ > o estado atual de `docs/` (diff semântico). SDD não existe mais em v4.
12
+
13
+ ## Agente: Integrator (Opus)
14
+
15
+ Em v4 promovido de Sonnet → Opus: diff semântico PRD/TRD ↔ docs/ exige reasoning
16
+ de maior nível que o antigo "aplicar §11 explícito". Meticuloso com consistência.
17
+ Merge idempotente — re-aplicar os mesmos docs source não duplica conteúdo.
18
+
19
+ ## Pré-condições
20
+
21
+ | # | Validação | Se falhar |
22
+ |---|-----------|-----------|
23
+ | 1 | `$ARGUMENTS` informado | Parar |
24
+ | 2 | `.context.md` com status `dev_done` (uso auto no /sf-dev) OU `design_done` a mais (uso manual) | Se anterior → "Rode /sf-design primeiro" |
25
+ | 3 | Pelo menos PRD.md OU TRD.md existe e está aprovado | Parar — "Nenhum doc source aprovado pra mergear" |
26
+ | 4 | `docs/` populado (veio de first-run anterior) | Parar — "/sf-design com first_run=true é quem cria docs/" |
27
+
28
+ > `/sf-merge-docs` **só se aplica a features**, não a first-run. Em first-run, é o
29
+ > próprio `/sf-design` que cria `docs/` a partir de PRD+TRD — não há o que mergear.
30
+
31
+ ## Passos
32
+
33
+ ### 1. Snapshot do estado atual de docs/
34
+
35
+ Ler `docs/{architecture,domain,conventions,apiContracts,decisions}.md`.
36
+ Indexar por elementos (tabelas, endpoints, ADRs, papéis, env vars...) pra diff.
37
+
38
+ ### 2. Extrair elementos-destino do PRD e TRD aprovados
39
+
40
+ | Fonte (PRD/TRD) | Elemento | Destino em docs/ |
41
+ |-----------------|----------|------------------|
42
+ | TRD §1.1 Stack | Nova tecnologia / versão | `architecture.md` §Stack |
43
+ | TRD §1.2 Arquitetura | Novo container / padrão | `architecture.md` §Containers/Padrões |
44
+ | TRD §1.3 Ambientes | Novo ambiente / mudança | `architecture.md` §Ambientes |
45
+ | TRD §1.4 Deploy | Mudança na estratégia | `architecture.md` §Deploy |
46
+ | TRD §4 §Área-DB | Nova tabela / índice / FK | `domain.md` §Catálogo de Tabelas |
47
+ | TRD §2.1 Endpoints | Novo endpoint | `apiContracts.md` §Catálogo |
48
+ | TRD §7.1 Auth | Mudança em auth | `conventions.md` §Autenticação |
49
+ | TRD §7.2 Autorização | Novo papel / permissão | `conventions.md` §Autorização |
50
+ | TRD §7.3 LGPD | Novo dado pessoal | `conventions.md` §LGPD |
51
+ | TRD §7.4 Rate limit | Nova categoria | `conventions.md` §Rate Limiting |
52
+ | TRD §5.3 Env vars | Nova variável | `conventions.md` §Variáveis de Ambiente |
53
+ | TRD §6 Integrações | Novo sistema externo | `domain.md` §Integrações Externas |
54
+ | TRD §9 ADRs | Nova decisão | `decisions.md` (append-only, imutável) |
55
+ | PRD §2 Atores | Novo papel/persona | `domain.md` §Usuários e Papéis |
56
+ | PRD §5 RNs | Nova regra de negócio | (não vai pra docs/ fica em specs/{nome}/contracts.md) |
57
+
58
+ > **Regra**: PRD alimenta poucas seções de `docs/` (só atores e alto-nível).
59
+ > O grosso vem do TRD `docs/` é síntese técnica + negócio cross-feature.
60
+
61
+ ### 3. Diff semântico: calcular ADDED / MODIFIED / REMOVED
62
+
63
+ Pra cada elemento-destino extraído (passo 2), comparar com snapshot (passo 1):
64
+
65
+ | Resultado | Condição | Ação |
66
+ |-----------|----------|------|
67
+ | ADDED | Elemento não existe em docs/ | Adicionar na seção apropriada |
68
+ | MODIFIED | Elemento existe mas mudou (nome igual, valor diferente) | Atualizar campos |
69
+ | UNCHANGED | Elemento existe e está igual | Skip (idempotente) |
70
+ | REMOVED | Elemento estava em docs/ mas não aparece em PRD+TRD aprovados | **NÃO remover** — apenas registrar no output como "possivelmente orfão" |
71
+
72
+ > **Conservadorismo em REMOVED**: PRD/TRD falam da feature atual. Algo que
73
+ > "não aparece" pode ser de outra feature (que continua válida). NUNCA deletar
74
+ > automaticamente. Reportar e deixar remoção manual.
75
+
76
+ ### 4. Aplicar ADDED e MODIFIED
77
+
78
+ - Localizar seção apropriada no doc destino
79
+ - Preservar estrutura do template (não quebrar tabelas)
80
+ - ADRs em `decisions.md`: SEMPRE append; ADR com status=aceita é imutável
81
+ - Registrar cada mudança em changelog do doc afetado
82
+
83
+ ### 5. Changelog em cada doc afetado
84
+
85
+ Adicionar linha no `## Changelog` do doc:
86
+
87
+ ```markdown
88
+ | Data | Feature | Tipo | Descrição |
89
+ |------|---------|------|-----------|
90
+ | {{ISO_DATE}} | $ARGUMENTS | ADDED | Endpoint POST /api/v1/users |
91
+ | {{ISO_DATE}} | $ARGUMENTS | MODIFIED | Matriz de permissões: novo role `manager` |
92
+ ```
93
+
94
+ ### 6. Validar consistência cross-doc
95
+
96
+ - Referências quebradas (endpoint do apiContracts referencia tabela que não existe em domain) reportar
97
+ - Papel novo em conventions mas não aparece em matriz de autorização reportar
98
+ - ADR substituída mas ainda referenciada reportar
99
+
100
+ Validação reporta, não bloqueia. Usuário decide se resolve manualmente.
101
+
102
+ ### 7. Atualizar status
103
+
104
+ ```yaml
105
+ status: "done"
106
+ ultima_skill: "/sf-merge-docs"
107
+ atualizado_em: "{{ISO_DATETIME}}"
108
+ ```
109
+
110
+ ### 8. Saída obrigatória
111
+
112
+ ```
113
+ /sf-merge-docs $ARGUMENTS — completo
114
+
115
+ docs/ sincronizado com PRD + TRD aprovados:
116
+ - docs/architecture.md (2 ADDED, 0 MODIFIED)
117
+ - docs/apiContracts.md (3 ADDED, 1 MODIFIED)
118
+ - docs/conventions.md (0 ADDED, 1 MODIFIED — novo role)
119
+ - docs/decisions.md (1 ADDED — ADR-007)
120
+ - docs/domain.md (0 mudanças)
121
+
122
+ Possivelmente órfãos (NÃO removidos — revisão manual):
123
+ - docs/apiContracts.md: endpoint `/legacy/foo` não aparece em PRD+TRD novos
124
+ (pode ser de outra feature; deletar manualmente se confirmado deprecated)
125
+
126
+ Validação: passed / N issues
127
+ ```
128
+
129
+ ## Erros
130
+
131
+ | Erro | Ação |
132
+ |------|------|
133
+ | Status != `dev_done` (auto) nem >= `design_done` (manual) | Parar — pedir rodar /sf-dev ou /sf-design primeiro |
134
+ | `docs/` não existe | Parar — explicar que `/sf-design` em first-run cria docs/ (feature só atualiza) |
135
+ | PRD+TRD sem nada novo vs docs/ | Marcar `done` (legítimo — feature sem impacto cross-feature) |
136
+ | Elemento MODIFIED não encontrado no doc | Converter pra ADDED + reportar (doc estava desatualizado) |
137
+ | Referências quebradas detectadas | Reportar, não bloqueia |
138
+
139
+ ## Uso automático (pelo `/sf-dev`)
140
+
141
+ `/sf-dev` chama `/sf-merge-docs` automaticamente ao final de feature (não first-run):
142
+
143
+ - Condição: `status=dev_done` E `first_run=false` E (`prd_aprovado=true` OU `trd_aprovado=true`)
144
+ - Rodado inline, sem nova interação
145
+ - Falha em `/sf-merge-docs` não derruba `/sf-dev` — apenas reporta; user pode re-rodar manualmente
146
+
147
+ ## Uso manual
148
+
149
+ Rodar `/sf-merge-docs $ARGUMENTS` quando:
150
+ - `/sf-dev` falhou e você quer sincronizar docs/ com o que já foi aprovado
151
+ - Fez edição direta em PRD/TRD aprovados e quer propagar pra docs/
152
+ - Quer forçar um re-merge (idempotente — não duplica)
@@ -1,128 +1,152 @@
1
- # /sf-plan $ARGUMENTS
2
-
3
- Skill atômica de planejamento. Lê SDD + specs/{nome}/ e gera `specs/{nome}/tasks.md` (arquivo único) + `workspace/Output/{nome}/Progresso.md`.
4
- $ARGUMENTS = nome (ex: setup_projeto, feat_cadastro_cliente)
5
-
6
- ## Agente: Planner (Opus)
7
- Metódico e exaustivo. Cada task auto-contida. Prioriza ordem correta.
8
-
9
- ## Pré-condições
10
-
11
- | # | Validação | Se falhar |
12
- |---|-----------|-----------|
13
- | 1 | $ARGUMENTS informado | Parar |
14
- | 2 | `.context.md` com status `design_done` | Se anterior → "/sf-design primeiro". Se posterior → "Tasks já geradas" |
15
- | 3 | `workspace/Output/{nome}/sdd.md` existe | Parar → "/sf-design primeiro" |
16
- | 4 | `specs/{nome}/contracts.md` e `scenarios.md` existem (projeções) | Parar → "/sf-design não gerou projeções — re-rode" |
17
-
18
- ## Passos
19
-
20
- ### 1. Ler contexto
21
- - `workspace/Output/{nome}/sdd.md` completo (fonte humana)
22
- - `specs/{nome}/contracts.md` e `scenarios.md` (projeções já geradas pelo /sf-design)
23
- - `projetos.yaml` + `docs/` (architecture, domain, conventions) + `.github/rules.md`
24
- - Template `.github/templates/specs/tasks.template.md`
25
-
26
- ### 2. Identificar fases de entrega
27
- Ler PRD §11 (Fases de Entrega) cada fase vira um agrupamento de tasks:
28
- - Fases são sequenciais: Fase 2 depende de Fase 1 concluída
29
- - Cada fase tem entregável e critério de done
30
- - O `/sf-dev` pode rodar por fase: `/sf-dev feat_nome --fase 1`
31
-
32
- ### 3. Identificar áreas (por fase)
33
-
34
- | Seção SDD | Área |
35
- |-----------|------|
36
- | §3 Modelo de dados | DB |
37
- | §5 Endpoints API | BACK |
38
- | §6 Componentes/Telas | FRONT |
39
- | §8 Integrações | INFRA |
40
- | Outras | MOBILE, DEVOPS, etc. conforme SDD |
41
-
42
- > **Nota**: Área DOC NÃO existe mais no setup. `docs/` é gerado pelo /sf-design (passo 3).
43
- > DOC só aparece em features se houver necessidade explícita de documentação adicional.
44
-
45
- Áreas são DINÂMICAS — só criar as que o SDD exige.
46
-
47
- **Área INFRA obrigatória no setup:**
48
- ```
49
- - [ ] INFRA-001: Validar e configurar ambiente local [M]
50
- - [ ] INFRA-002: Criar docker-compose.yml + Dockerfiles [M]
51
- - [ ] INFRA-003: Hello world subir stack completa e validar [M]
52
- ```
53
- INFRA-001 é a PRIMEIRA task do setup. INFRA-003 é a ÚLTIMA (validação final).
54
-
55
- ### 4. Gerar `specs/{nome}/tasks.md` (arquivo único)
56
-
57
- Gerar UM arquivo só em `specs/{nome}/tasks.md` com tabela única de todas as tasks, coluna `Área` diferencia.
58
-
59
- ```markdown
60
- | ID | Área | Fase | Tam | Título | Repo | Arquivos | Depende de | Ref spec | Ref CA |
61
- |----|------|------|-----|--------|------|----------|-----------|----------|--------|
62
- | DB-001 | DB | 1 | S | Migration clientes | api | src/Migrations/... | — | SDD §3.1 | — |
63
- | BACK-001 | BACK | 1 | M | Endpoint POST /clientes | api | src/Api/... | DB-001 | SDD §5.1 | CA-001 |
64
- ```
65
-
66
- Regras:
67
- - Cada task é atômica — coder lê `specs/{nome}/` + task, nada mais
68
- - **Repo obrigatório** consultar `projetos.yaml`. Caminhos relativos ao repo
69
- - Área é COLUNA, não arquivo (DB, BACK, FRONT, INFRA, DOC, MOBILE...)
70
- - Tamanhos: S (<30min), M (30min-2h), L (2h+). L → avaliar se quebra em M+S
71
- - IDs sequenciais por área, nunca reutilizar
72
- - Dependências cross-area permitidas
73
- - `Ref spec`: seção do SDD (ex: `SDD §3.1`)
74
- - `Ref CA`: ID do critério em `specs/{nome}/scenarios.md` ou `—`
75
- - Ordenar tabela por Fase → Área → ID (visual)
76
-
77
- ### 5. Gerar `workspace/Output/{nome}/Progresso.md` (tracking)
78
- Progresso.md fica em **workspace/Output** (user tracking, não spec).
79
- - Resumo Área × Fase com contagem (derivado de `tasks.md`)
80
- - Ordem de execução com paralelismos
81
- - Checklist pós-conclusão
82
-
83
- **Regra**: status vive em Progresso.md. `tasks.md` é o plano imutável.
84
-
85
- ### 6. Atualizar progresso global + `.context.md`
86
- ```yaml
87
- status: "plan_done"
88
- ultima_skill: "/sf-plan"
89
- ```
90
-
91
- ### 7. Publicar Progresso no backend (OBRIGATÓRIO quando config existe)
92
-
93
- **Este passo NÃO é opcional**. Tomar decisão baseada em arquivo:
94
-
95
- | Detecção | Ação |
96
- |----------|------|
97
- | `sfw.config.yml` NÃO existe | Pular silenciosamente. Registrar: "publish: skipped (no sfw.config.yml)" |
98
- | `sfw.config.yml` existe | **Chamar `/sf-publish $ARGUMENTS Progresso`** sem condicional. Execute. |
99
-
100
- `/sf-publish` respeita `mode` de cada target. Ver `.github/skills/sf-publish/SKILL.md`.
101
-
102
- **Nota**: `tasks.md`, `specs/`, `docs/`, `projetos.yaml` são LOCAL ONLY — `/sf-publish` nunca toca neles.
103
-
104
- ### 8. Saída obrigatória
105
-
106
- Antes de terminar, a skill DEVE reportar:
107
-
108
- ```
109
- /sf-plan $ARGUMENTS — completo
110
-
111
- Artefatos locais:
112
- - specs/$ARGUMENTS/tasks.md ({N} tasks em {F} fases, áreas: [{lista}])
113
- - workspace/Output/$ARGUMENTS/Progresso.md
114
-
115
- Publish:
116
- - {target-name}: {CREATED|UPDATED|SKIPPED|CONFLICT|ERROR} — ver .ai/sf-publish-log.md
117
- OU
118
- - SKIPPED (no sfw.config.yml)
119
-
120
- Próximo passo:
121
- /sf-dev $ARGUMENTS ← implementa tudo
122
- /sf-dev $ARGUMENTS --fase 1 ← só fase 1
123
- ```
124
-
125
- ## Saídas
126
- - `specs/{nome}/tasks.md` — tabela única
127
- - `workspace/Output/{nome}/Progresso.md` — tracking
128
- - `workspace/Output/progresso.md` (global) — atualizado
1
+
2
+ # /sf-plan $ARGUMENTS
3
+
4
+ Skill atômica de planejamento. Lê **PRD + TRD + specs/{nome}/** e gera
5
+ `specs/{nome}/tasks.md` (arquivo único) + `workspace/Output/{nome}/Progresso.md`.
6
+ `$ARGUMENTS` = nome do scope (ex: `app_barbearia`, `feat_cadastro_cliente`).
7
+
8
+ ## Agente: Planner (Opus)
9
+
10
+ Metódico e exaustivo. Cada task auto-contida. Prioriza ordem correta.
11
+
12
+ ## Pré-condições
13
+
14
+ | # | Validação | Se falhar |
15
+ |---|-----------|-----------|
16
+ | 1 | $ARGUMENTS informado | Parar |
17
+ | 2 | `.context.md` com status `design_done` | Se anterior → "/sf-design primeiro". Se posterior → "Tasks já geradas" |
18
+ | 3 | Se `prd_existe=true`: PRD.md existe e `prd_aprovado=true` | Parar (não deveria passar pelo /sf-design, mas defensivo) |
19
+ | 4 | Se `trd_existe=true`: TRD.md existe e `trd_aprovado=true` | Parar |
20
+ | 5 | `specs/{nome}/{contracts,scenarios}.md` existem (projeções do /sf-design) | Parar → "/sf-design não gerou projeções — re-rode" |
21
+
22
+ ## Passos
23
+
24
+ ### 1. Ler contexto
25
+
26
+ - `workspace/Output/{nome}/PRD.md` (se prd_existe) + `TRD.md` (se trd_existe) — fontes
27
+ - `specs/{nome}/{brief,contracts,scenarios}.md` (projeções geradas pelo /sf-design)
28
+ - `projetos.yaml` + `docs/` (architecture, domain, conventions) + `.github/rules.md`
29
+ - Template `.github/templates/specs/tasks.template.md`
30
+
31
+ ### 2. Identificar fases de entrega
32
+
33
+ Ler **PRD §10 (Fases de Entrega)** — cada fase vira um agrupamento de tasks:
34
+
35
+ - Fases são sequenciais: Fase 2 depende de Fase 1 concluída
36
+ - Cada fase tem entregável + critério de done
37
+ - O `/sf-dev` pode rodar por fase: `/sf-dev feat_nome --fase 1`
38
+
39
+ **Se scope não tem PRD** (puro-técnico): toda task vai pra **Fase 1**. Não há
40
+ fases de entrega de produto é bootstrap/infra em uma leva só.
41
+
42
+ ### 3. Identificar áreas (dinâmicas, vêm do TRD)
43
+
44
+ Ler `.context.md → areas_tocadas` (populado pelo /sf-design a partir dos GATEs do TRD).
45
+
46
+ | Seção do TRD | Área |
47
+ |--------------|------|
48
+ | §2 §Área-Backend (GATE=SIM) | BACK |
49
+ | §3 §Área-Frontend (GATE=SIM) | FRONT |
50
+ | §4 §Área-DB (GATE=SIM) | DB |
51
+ | §5 §Área-Infra (GATE=SIM) | INFRA |
52
+
53
+ Áreas com GATE=NÃO não geram tasks nessa área. Se o scope tem apenas PRD (raríssimo
54
+ caso puro-produto sem TRD): área FRONT derivada de PRD §7 Telas.
55
+
56
+ **INFRA em first-run** (detectado via `first_run=true` no .context):
57
+
58
+ ```
59
+ - [ ] INFRA-001: Validar ambiente local + setup repos (projetos.yaml)
60
+ - [ ] INFRA-002: Docker-compose dev (só dependências) + Dockerfiles prod
61
+ - [ ] INFRA-003: Hello world — subir stack completa e validar
62
+ ```
63
+
64
+ INFRA-001 sempre a PRIMEIRA; INFRA-003 sempre a ÚLTIMA da Fase 1 (validação).
65
+
66
+ ### 4. Gerar `specs/{nome}/tasks.md` (arquivo único)
67
+
68
+ Tabela única com coluna `Área` diferenciando:
69
+
70
+ ```markdown
71
+ | ID | Área | Fase | Tam | Título | Repo | Arquivos | Depende de | Ref TRD | Ref CA |
72
+ |----|------|------|-----|--------|------|----------|-----------|---------|--------|
73
+ | DB-001 | DB | 1 | S | Migration clientes | api | src/db/migrations/... | — | TRD §4.1 | — |
74
+ | BACK-001 | BACK | 1 | M | Endpoint POST /clientes | api | src/routes/... | DB-001 | TRD §2.1 | CA-001 |
75
+ ```
76
+
77
+ **Regras** (ver `.github/templates/specs/tasks.template.md` pra detalhes):
78
+
79
+ - Cada task é atômica coder `specs/{nome}/` + task, nada mais
80
+ - **Repo obrigatório** consultar `projetos.yaml`. Caminhos relativos ao repo.
81
+ - Área é COLUNA, não arquivo (DB, BACK, FRONT, INFRA, MOBILE...)
82
+ - Tamanhos: S (≤2h), M (≤4h), L (≤2 dias). L → considerar dividir (INVEST: Small)
83
+ - IDs sequenciais por área, nunca reutilizar
84
+ - Dependências cross-area permitidas
85
+ - `Ref TRD`: seção do TRD (ex: `§2.1`, `§4.2`) — obrigatório quando TRD existe
86
+ - `Ref CA`: ID do CA em `specs/{nome}/scenarios.md` ou `—`
87
+ - Ordenar por Fase → Área → ID (visual)
88
+
89
+ **Tasks L**: preencher bloco "Done When — {TASK-ID}" abaixo da tabela com 3-5
90
+ bullets verificáveis.
91
+
92
+ ### 5. Gerar `workspace/Output/{nome}/Progresso.md` (tracking)
93
+
94
+ Progresso.md vive em **workspace/Output** (tracking de execução, não spec).
95
+
96
+ - Resumo Área × Fase com contagem (derivado de `tasks.md`)
97
+ - Ordem de execução com paralelismos
98
+ - Checklist pós-conclusão (já coberto pelo /sf-merge-docs automático no fim do /sf-dev)
99
+
100
+ **Regra**: status das tasks vive SÓ em Progresso.md. `tasks.md` é o plano imutável.
101
+
102
+ ### 6. Atualizar `.context.md`
103
+
104
+ ```yaml
105
+ status: "plan_done"
106
+ ultima_skill: "/sf-plan"
107
+ atualizado_em: "{{ISO_DATETIME}}"
108
+ ```
109
+
110
+ ### 7. Publicar Progresso no backend (se `sfw.config.yml` existe)
111
+
112
+ Chamar `/sf-publish $ARGUMENTS Progresso`. Respeita `mode` de cada target.
113
+
114
+ **Nota**: `tasks.md`, `specs/*`, `docs/*`, `projetos.yaml` são **LOCAL ONLY** — `/sf-publish`
115
+ nunca toca neles. Apenas PRD/TRD/Progresso vão pro Confluence.
116
+
117
+ ### 8. Saída obrigatória
118
+
119
+ ```
120
+ /sf-plan $ARGUMENTS — completo
121
+
122
+ Artefatos locais:
123
+ - specs/$ARGUMENTS/tasks.md ({N} tasks em {F} fases, áreas: [{lista}])
124
+ - workspace/Output/$ARGUMENTS/Progresso.md
125
+
126
+ Publish:
127
+ - {target-name}: Progresso: {{status}}
128
+ OU
129
+ - SKIPPED (no sfw.config.yml)
130
+
131
+ Próximo passo:
132
+ /sf-dev $ARGUMENTS ← implementa tudo
133
+ /sf-dev $ARGUMENTS --fase 1 ← só a primeira fase (RECOMENDADO)
134
+ ```
135
+
136
+ ## Saídas
137
+
138
+ - `specs/{nome}/tasks.md` — plano (tabela única)
139
+ - `workspace/Output/{nome}/Progresso.md` — tracking
140
+
141
+ ## Rastreabilidade
142
+
143
+ Cada task gerada deve ter:
144
+ - **Ref TRD** (se TRD existe): seção do TRD que motivou — garante que nada do TRD
145
+ fica sem task correspondente
146
+ - **Ref CA** (se aplicável): garante que cada CA em `scenarios.md` tem pelo menos
147
+ 1 task que o satisfaz
148
+
149
+ Validação final antes de terminar:
150
+ - Todo endpoint do TRD §2.1 tem task BACK correspondente? ✓
151
+ - Toda tabela/migration do TRD §4 tem task DB correspondente? ✓
152
+ - Todo CA em `scenarios.md` tem task Ref CA correspondente (ou justificativa de why not)? ✓