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.
- 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 +121 -0
- 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 +14 -14
- package/templates/.github/agents/db-coder.md +165 -165
- package/templates/.github/agents/doc-writer.md +66 -53
- package/templates/.github/agents/frontend-coder.md +5 -5
- package/templates/.github/agents/infra-coder.md +341 -341
- package/templates/.github/agents/reviewer.md +6 -6
- package/templates/.github/agents/security-reviewer.md +153 -153
- package/templates/.github/copilot-instructions.md +272 -262
- 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 -223
- package/templates/.github/skills/sf-design/SKILL.md +161 -216
- package/templates/.github/skills/sf-dev/SKILL.md +204 -351
- package/templates/.github/skills/sf-discovery/SKILL.md +415 -414
- package/templates/.github/skills/sf-extract/SKILL.md +225 -249
- package/templates/.github/skills/sf-load/SKILL.md +296 -295
- package/templates/.github/skills/sf-mcp/SKILL.md +386 -385
- package/templates/.github/skills/sf-merge-docs/SKILL.md +152 -100
- package/templates/.github/skills/sf-plan/SKILL.md +152 -128
- package/templates/.github/skills/sf-publish/SKILL.md +144 -143
- package/templates/.github/skills/sf-session-finish/SKILL.md +93 -120
- package/templates/.github/skills/sf-start/SKILL.md +192 -145
- 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 -286
- package/templates/.github/templates/feature/Progresso.template.md +141 -141
- package/templates/.github/templates/feature/TRD.template.md +358 -0
- package/templates/.github/templates/feature/context.template.md +89 -48
- package/templates/.github/templates/feature/extract-log.template.md +49 -39
- 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 -59
- package/templates/.github/templates/specs/contracts.template.md +147 -141
- package/templates/.github/templates/specs/scenarios.template.md +125 -117
- package/templates/.github/templates/specs/tasks.template.md +65 -63
- package/templates/_gitignore +35 -35
- package/templates/sfw.config.yml.example +147 -147
- package/templates/.github/templates/feature/backlog-extraido.template.md +0 -156
- package/templates/.github/templates/feature/sdd.template.md +0 -559
|
@@ -1,63 +1,65 @@
|
|
|
1
|
-
# Tasks — {{NOME}}
|
|
2
|
-
|
|
3
|
-
> Plano de implementação: todas as tasks em tabela única com coluna Área.
|
|
4
|
-
> Gerado pelo /sf-plan a partir
|
|
5
|
-
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
<!--
|
|
9
|
-
=============================================================================
|
|
10
|
-
INSTRUÇÕES PARA O AGENTE (não incluir no arquivo gerado)
|
|
11
|
-
=============================================================================
|
|
12
|
-
|
|
13
|
-
ORIGEM: /sf-plan — deriva de
|
|
14
|
-
ATUALIZAÇÃO: /sf-plan re-roda se
|
|
15
|
-
|
|
16
|
-
STATUS: vive em workspace/Output/{{NOME}}/Progresso.md — NÃO aqui.
|
|
17
|
-
Tasks são só a definição do que precisa ser feito, não o estado atual.
|
|
18
|
-
|
|
19
|
-
CAMPOS OBRIGATÓRIOS (toda task):
|
|
20
|
-
- ID: {ÁREA}-NNN sequencial por área (DB-001, BACK-001, FRONT-001, INFRA-001)
|
|
21
|
-
- Área: derivada do
|
|
22
|
-
- Fase: número da fase de entrega (do PRD §
|
|
23
|
-
|
|
24
|
-
- Tam: S (≤2h) | M (≤4h) | L (≤2 dias)
|
|
25
|
-
- Título: verbo imperativo + objeto ("Criar migration tabela pedidos")
|
|
26
|
-
- Repo: nome do serviço em projetos.yaml (api, web, worker...)
|
|
27
|
-
- Arquivos: paths relativos ao repo que serão criados/modificados
|
|
28
|
-
- Depende: IDs de tasks que precisam estar concluídas antes. Cross-área OK.
|
|
29
|
-
- Ref
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
-
|
|
36
|
-
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
-
|
|
41
|
-
-
|
|
42
|
-
-
|
|
43
|
-
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
-
|
|
62
|
-
|
|
63
|
-
- [ ]
|
|
1
|
+
# Tasks — {{NOME}}
|
|
2
|
+
|
|
3
|
+
> Plano de implementação: todas as tasks em tabela única com coluna Área.
|
|
4
|
+
> Gerado pelo /sf-plan a partir de PRD + TRD + specs/{{NOME}}/. NUNCA editado manualmente.
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
<!--
|
|
9
|
+
=============================================================================
|
|
10
|
+
INSTRUÇÕES PARA O AGENTE (não incluir no arquivo gerado)
|
|
11
|
+
=============================================================================
|
|
12
|
+
|
|
13
|
+
ORIGEM: /sf-plan — deriva de PRD.md + TRD.md + contracts.md + scenarios.md
|
|
14
|
+
ATUALIZAÇÃO: /sf-plan re-roda se PRD/TRD/contracts/scenarios mudarem.
|
|
15
|
+
|
|
16
|
+
STATUS: vive em workspace/Output/{{NOME}}/Progresso.md — NÃO aqui.
|
|
17
|
+
Tasks são só a definição do que precisa ser feito, não o estado atual.
|
|
18
|
+
|
|
19
|
+
CAMPOS OBRIGATÓRIOS (toda task):
|
|
20
|
+
- ID: {ÁREA}-NNN sequencial por área (DB-001, BACK-001, FRONT-001, INFRA-001)
|
|
21
|
+
- Área: derivada dos GATEs do TRD §2-§5 — dinâmica, só as áreas tocadas.
|
|
22
|
+
- Fase: número da fase de entrega (do PRD §10). 1 fase = 1 entregável = 1 PR.
|
|
23
|
+
Se scope não tem PRD (puro-técnico): toda task vai pra Fase 1.
|
|
24
|
+
- Tam: S (≤2h) | M (≤4h) | L (≤2 dias)
|
|
25
|
+
- Título: verbo imperativo + objeto ("Criar migration tabela pedidos")
|
|
26
|
+
- Repo: nome do serviço em projetos.yaml (api, web, worker...)
|
|
27
|
+
- Arquivos: paths relativos ao repo que serão criados/modificados
|
|
28
|
+
- Depende: IDs de tasks que precisam estar concluídas antes. Cross-área OK.
|
|
29
|
+
- Ref TRD: seção do TRD que originou a task (ex: "§2.1", "§4.1"). Obrigatório
|
|
30
|
+
quando existe TRD (quase sempre — scopes puro-produto são raros).
|
|
31
|
+
- Ref CA: ID do CA em scenarios.md que esta task satisfaz. Opcional
|
|
32
|
+
(INFRA costuma não ter; BACK/FRONT normalmente têm).
|
|
33
|
+
|
|
34
|
+
PARA TASKS TAMANHO L:
|
|
35
|
+
- Preencher bloco "Done When — {TASK-ID}" logo abaixo da tabela
|
|
36
|
+
- L sugere: considerar dividir em 2 tasks M (INVEST: Small)
|
|
37
|
+
- Reviewer usa "Done When" como checklist antes de aprovar
|
|
38
|
+
|
|
39
|
+
REGRAS:
|
|
40
|
+
- IDs estáveis — nunca renumerar após commit
|
|
41
|
+
- Toda task com Ref CA deve ter teste correspondente (unit ou integration)
|
|
42
|
+
- Mesma fase = podem rodar em paralelo dentro da área
|
|
43
|
+
- Fases são SEQUENCIAIS entre si
|
|
44
|
+
- Áreas são dinâmicas — preencher apenas as tocadas pela feature
|
|
45
|
+
- Fase vem do PRD §10; task sem PRD correspondente (infra pura) usa Fase 1
|
|
46
|
+
|
|
47
|
+
=============================================================================
|
|
48
|
+
-->
|
|
49
|
+
|
|
50
|
+
## Tasks
|
|
51
|
+
|
|
52
|
+
| ID | Área | Fase | Tam | Título | Repo | Arquivos | Depende de | Ref TRD | Ref CA |
|
|
53
|
+
|----|------|------|-----|--------|------|----------|-----------|---------|--------|
|
|
54
|
+
| | | | | | | | — | | — |
|
|
55
|
+
|
|
56
|
+
## Done When — Tasks L
|
|
57
|
+
|
|
58
|
+
<!-- 1 bloco por task L. Remover esta seção inteira se não houver tasks L.
|
|
59
|
+
3-5 bullets verificáveis. Cada bullet deve ser observável objetivamente. -->
|
|
60
|
+
|
|
61
|
+
### {TASK-ID}
|
|
62
|
+
|
|
63
|
+
- [ ]
|
|
64
|
+
- [ ]
|
|
65
|
+
- [ ]
|
package/templates/_gitignore
CHANGED
|
@@ -1,35 +1,35 @@
|
|
|
1
|
-
# Insumos brutos do usuário — conteúdo nunca vai pro repositório
|
|
2
|
-
# A pasta workspace/Input/ existe no repo (via .gitkeep), mas seu conteúdo é ignorado
|
|
3
|
-
workspace/Input/**
|
|
4
|
-
!workspace/Input/.gitkeep
|
|
5
|
-
!workspace/Input/**/.gitkeep
|
|
6
|
-
|
|
7
|
-
# Memory pessoal (opcional — commit napkin.md se quiser compartilhar com o time)
|
|
8
|
-
# .ai/memory/napkin.md
|
|
9
|
-
|
|
10
|
-
# Repositórios de serviços (clonados/criados pelo workflow — cada um tem seu próprio .git)
|
|
11
|
-
projetos/
|
|
12
|
-
|
|
13
|
-
# MCP config — contém credenciais hardcoded (Confluence token, etc.)
|
|
14
|
-
.mcp.json
|
|
15
|
-
|
|
16
|
-
# Logs internos do workflow (append-only, gerados pelos commands)
|
|
17
|
-
.ai/load-log.md
|
|
18
|
-
.ai/publish-log.md
|
|
19
|
-
|
|
20
|
-
# IDEs
|
|
21
|
-
.vscode/
|
|
22
|
-
.idea/
|
|
23
|
-
|
|
24
|
-
# OS
|
|
25
|
-
.DS_Store
|
|
26
|
-
Thumbs.db
|
|
27
|
-
|
|
28
|
-
# Node
|
|
29
|
-
node_modules/
|
|
30
|
-
dist/
|
|
31
|
-
|
|
32
|
-
# Env
|
|
33
|
-
.env
|
|
34
|
-
.env.*
|
|
35
|
-
!.env.example
|
|
1
|
+
# Insumos brutos do usuário — conteúdo nunca vai pro repositório
|
|
2
|
+
# A pasta workspace/Input/ existe no repo (via .gitkeep), mas seu conteúdo é ignorado
|
|
3
|
+
workspace/Input/**
|
|
4
|
+
!workspace/Input/.gitkeep
|
|
5
|
+
!workspace/Input/**/.gitkeep
|
|
6
|
+
|
|
7
|
+
# Memory pessoal (opcional — commit napkin.md se quiser compartilhar com o time)
|
|
8
|
+
# .ai/memory/napkin.md
|
|
9
|
+
|
|
10
|
+
# Repositórios de serviços (clonados/criados pelo workflow — cada um tem seu próprio .git)
|
|
11
|
+
projetos/
|
|
12
|
+
|
|
13
|
+
# MCP config — contém credenciais hardcoded (Confluence token, etc.)
|
|
14
|
+
.mcp.json
|
|
15
|
+
|
|
16
|
+
# Logs internos do workflow (append-only, gerados pelos commands)
|
|
17
|
+
.ai/load-log.md
|
|
18
|
+
.ai/publish-log.md
|
|
19
|
+
|
|
20
|
+
# IDEs
|
|
21
|
+
.vscode/
|
|
22
|
+
.idea/
|
|
23
|
+
|
|
24
|
+
# OS
|
|
25
|
+
.DS_Store
|
|
26
|
+
Thumbs.db
|
|
27
|
+
|
|
28
|
+
# Node
|
|
29
|
+
node_modules/
|
|
30
|
+
dist/
|
|
31
|
+
|
|
32
|
+
# Env
|
|
33
|
+
.env
|
|
34
|
+
.env.*
|
|
35
|
+
!.env.example
|
|
@@ -1,147 +1,147 @@
|
|
|
1
|
-
# ============================================================================
|
|
2
|
-
# sfw.config.yml — Manifesto do projeto SFW
|
|
3
|
-
# ============================================================================
|
|
4
|
-
# Este arquivo define COMO o pipeline SFW fala com o mundo externo:
|
|
5
|
-
# - De onde vêm os insumos do PM/PO (input)
|
|
6
|
-
# - Pra onde vão os artefatos gerados (output.targets[])
|
|
7
|
-
# - Como os nomes dos itens são formados (naming)
|
|
8
|
-
#
|
|
9
|
-
# É commitável (zero segredos). Credenciais ficam em .mcp.json gitignored
|
|
10
|
-
# ou variáveis de ambiente exportadas ANTES de abrir o Claude Code.
|
|
11
|
-
#
|
|
12
|
-
# Gerado pelo CLI: `spec-first-claude init --name=X`
|
|
13
|
-
#
|
|
14
|
-
# Referências:
|
|
15
|
-
# - Interface do adapter: .github/adapters/interface.md
|
|
16
|
-
# - Adapters disponíveis: .github/adapters/registry.md
|
|
17
|
-
# - Templating de nomes: .github/adapters/naming.md
|
|
18
|
-
# - Erros: .github/adapters/errors.md
|
|
19
|
-
# ============================================================================
|
|
20
|
-
|
|
21
|
-
# ----------------------------------------------------------------------------
|
|
22
|
-
# project — identidade do projeto
|
|
23
|
-
# ----------------------------------------------------------------------------
|
|
24
|
-
project:
|
|
25
|
-
name: "Meu Projeto"
|
|
26
|
-
# Page ID raiz do projeto no Confluence (o framework conhece o projeto inteiro)
|
|
27
|
-
# root_page_id: "65708"
|
|
28
|
-
|
|
29
|
-
# ----------------------------------------------------------------------------
|
|
30
|
-
# naming — templates de nome (aplicados pela engine em .github/adapters/naming.md)
|
|
31
|
-
# ----------------------------------------------------------------------------
|
|
32
|
-
# Placeholders suportados: {scope}, {type}
|
|
33
|
-
# {scope} = nome do item no Input (ex: "app_barbearia", "feat_login")
|
|
34
|
-
# {type} = tipo do artefato (ex: "PRD", "
|
|
35
|
-
# Qualquer outro placeholder → ValidationError no load do manifest.
|
|
36
|
-
#
|
|
37
|
-
# O usuário nomeia livremente os items no Input — o agent NÃO impõe naming.
|
|
38
|
-
# Estes templates controlam apenas o que o agent GERA no Output.
|
|
39
|
-
naming:
|
|
40
|
-
# Subpasta (ou page-mãe) criada no Output por scope
|
|
41
|
-
# Ex: "out_app_barbearia", "out_feat_login"
|
|
42
|
-
output_container: "out_{scope}"
|
|
43
|
-
|
|
44
|
-
# Nome do artefato DENTRO do container
|
|
45
|
-
# No Confluence: {scope} no nome evita colisão de títulos no space
|
|
46
|
-
# No filesystem: pode simplificar pra "{type}" (sem redundância de scope)
|
|
47
|
-
output_artifact: "{scope} - {type}"
|
|
48
|
-
|
|
49
|
-
# ----------------------------------------------------------------------------
|
|
50
|
-
# input — de onde vêm os insumos do PM/PO (single source no MVP)
|
|
51
|
-
# ----------------------------------------------------------------------------
|
|
52
|
-
# /load {scope} usa esta seção pra puxar o conteúdo pro filesystem local.
|
|
53
|
-
# Dev nunca edita o backend de input — só lê. PM owns este espaço.
|
|
54
|
-
#
|
|
55
|
-
# O agent faz listChildren(parent_page_id) e busca o scope pelo nome.
|
|
56
|
-
# Se o scope não existir no backend, /load falha com erro explícito.
|
|
57
|
-
input:
|
|
58
|
-
# Chave do adapter no registry. MVP: "confluence" | "filesystem"
|
|
59
|
-
adapter: confluence
|
|
60
|
-
|
|
61
|
-
# Config passada pro adapter.validateConfig(). Campos obrigatórios/opcionais
|
|
62
|
-
# são documentados no arquivo do adapter (ex: .github/adapters/confluence.md).
|
|
63
|
-
config:
|
|
64
|
-
space_key: ST
|
|
65
|
-
parent_page_id: "360668" # page-mãe que contém os scopes no Input
|
|
66
|
-
recursive: true # desce na árvore de scopes
|
|
67
|
-
include_attachments: true # baixa PNGs, PDFs, planilhas
|
|
68
|
-
|
|
69
|
-
# Cache local onde /load materializa os insumos
|
|
70
|
-
cache:
|
|
71
|
-
local_dir: "workspace/Input/"
|
|
72
|
-
log: ".ai/load-log.md" # append-only: id, version, sha256, timestamp
|
|
73
|
-
incremental: true # hash-based re-load (NOVO/MODIFICADO/INALTERADO)
|
|
74
|
-
|
|
75
|
-
# ----------------------------------------------------------------------------
|
|
76
|
-
# output — pra onde os artefatos vão (MVP: 1 target, multi-target em P2)
|
|
77
|
-
# ----------------------------------------------------------------------------
|
|
78
|
-
# Cada target recebe um subset de artefatos via `publishes`.
|
|
79
|
-
# Auto-publish é disparado pelas skills (/extract, /design, /plan).
|
|
80
|
-
# Agent owns este espaço. PM só aplica label `sfw-approved` pra aprovar.
|
|
81
|
-
#
|
|
82
|
-
# Premissa: 1 space = 1 projeto (no Confluence). Multi-projeto no mesmo
|
|
83
|
-
# space causa colisão de títulos — constraint do Confluence, não do SFW.
|
|
84
|
-
# Se necessário, o user diferencia no Input (nomes únicos) e o Output
|
|
85
|
-
# herda a unicidade via {scope} no naming.
|
|
86
|
-
output:
|
|
87
|
-
targets:
|
|
88
|
-
|
|
89
|
-
# --- Target 1: Confluence (espelho de aprovação pro time) ---------------
|
|
90
|
-
- name: confluence-mirror
|
|
91
|
-
|
|
92
|
-
adapter: confluence
|
|
93
|
-
|
|
94
|
-
config:
|
|
95
|
-
space_key: ST
|
|
96
|
-
parent_page_id: "294931" # page-mãe do Output no Confluence
|
|
97
|
-
|
|
98
|
-
# Whitelist de tipos que este target recebe.
|
|
99
|
-
# Tipos válidos: PRD,
|
|
100
|
-
# (tasks.md, docs/, projetos.yaml, specs/ ficam LOCAL ONLY —
|
|
101
|
-
# ver §9.9 "Boundary publish vs local")
|
|
102
|
-
publishes: [PRD,
|
|
103
|
-
|
|
104
|
-
# auto — skill dispara publish automaticamente no fim
|
|
105
|
-
# manual — skill gera artefato local e pergunta se quer publicar
|
|
106
|
-
# off — target ignorado (offline-first natural)
|
|
107
|
-
mode: auto
|
|
108
|
-
|
|
109
|
-
# Estratégia de conflict detection:
|
|
110
|
-
# version — compara version do backend com publish-log antes de update
|
|
111
|
-
# hash — compara sha256 do conteúdo remoto com snapshot local
|
|
112
|
-
# none — sobrescreve cego (NÃO recomendado; perde drift humano)
|
|
113
|
-
conflict_detection: version
|
|
114
|
-
|
|
115
|
-
# Mecanismo de aprovação do artefato publicado:
|
|
116
|
-
# label — PM aplica label na página Confluence pra marcar aprovado
|
|
117
|
-
# none — sem aprovação formal (pipeline segue sem checar)
|
|
118
|
-
approval_mechanism: label
|
|
119
|
-
approval_label: "sfw-approved"
|
|
120
|
-
|
|
121
|
-
# --- Target 2: Filesystem mirror (opcional — time offline/backup) -------
|
|
122
|
-
# Descomente pra ativar. Útil pra testes E2E com FilesystemAdapter como
|
|
123
|
-
# mock natural — zero lib de mock, zero stub.
|
|
124
|
-
#
|
|
125
|
-
# - name: local-mirror
|
|
126
|
-
# adapter: filesystem
|
|
127
|
-
# config:
|
|
128
|
-
# root_path: "./mirror"
|
|
129
|
-
# glob: "**/*.md"
|
|
130
|
-
# publishes: [PRD,
|
|
131
|
-
# mode: auto
|
|
132
|
-
# conflict_detection: hash
|
|
133
|
-
# approval_mechanism: none
|
|
134
|
-
|
|
135
|
-
# ----------------------------------------------------------------------------
|
|
136
|
-
# context_pages — páginas extras que o framework pode consultar (opcional)
|
|
137
|
-
# ----------------------------------------------------------------------------
|
|
138
|
-
# O /mcp descobre a árvore do projeto e sugere pages que podem ser úteis
|
|
139
|
-
# como contexto durante /extract e /design (referências, decisões, etc.)
|
|
140
|
-
#
|
|
141
|
-
# context_pages:
|
|
142
|
-
# - id: "557057"
|
|
143
|
-
# title: "Referências"
|
|
144
|
-
# use_in: [extract, design]
|
|
145
|
-
# - id: "425998"
|
|
146
|
-
# title: "Decisões"
|
|
147
|
-
# use_in: [design]
|
|
1
|
+
# ============================================================================
|
|
2
|
+
# sfw.config.yml — Manifesto do projeto SFW
|
|
3
|
+
# ============================================================================
|
|
4
|
+
# Este arquivo define COMO o pipeline SFW fala com o mundo externo:
|
|
5
|
+
# - De onde vêm os insumos do PM/PO (input)
|
|
6
|
+
# - Pra onde vão os artefatos gerados (output.targets[])
|
|
7
|
+
# - Como os nomes dos itens são formados (naming)
|
|
8
|
+
#
|
|
9
|
+
# É commitável (zero segredos). Credenciais ficam em .mcp.json gitignored
|
|
10
|
+
# ou variáveis de ambiente exportadas ANTES de abrir o Claude Code.
|
|
11
|
+
#
|
|
12
|
+
# Gerado pelo CLI: `spec-first-claude init --name=X`
|
|
13
|
+
#
|
|
14
|
+
# Referências:
|
|
15
|
+
# - Interface do adapter: .github/adapters/interface.md
|
|
16
|
+
# - Adapters disponíveis: .github/adapters/registry.md
|
|
17
|
+
# - Templating de nomes: .github/adapters/naming.md
|
|
18
|
+
# - Erros: .github/adapters/errors.md
|
|
19
|
+
# ============================================================================
|
|
20
|
+
|
|
21
|
+
# ----------------------------------------------------------------------------
|
|
22
|
+
# project — identidade do projeto
|
|
23
|
+
# ----------------------------------------------------------------------------
|
|
24
|
+
project:
|
|
25
|
+
name: "Meu Projeto"
|
|
26
|
+
# Page ID raiz do projeto no Confluence (o framework conhece o projeto inteiro)
|
|
27
|
+
# root_page_id: "65708"
|
|
28
|
+
|
|
29
|
+
# ----------------------------------------------------------------------------
|
|
30
|
+
# naming — templates de nome (aplicados pela engine em .github/adapters/naming.md)
|
|
31
|
+
# ----------------------------------------------------------------------------
|
|
32
|
+
# Placeholders suportados: {scope}, {type}
|
|
33
|
+
# {scope} = nome do item no Input (ex: "app_barbearia", "feat_login")
|
|
34
|
+
# {type} = tipo do artefato (ex: "PRD", "TRD", "Progresso")
|
|
35
|
+
# Qualquer outro placeholder → ValidationError no load do manifest.
|
|
36
|
+
#
|
|
37
|
+
# O usuário nomeia livremente os items no Input — o agent NÃO impõe naming.
|
|
38
|
+
# Estes templates controlam apenas o que o agent GERA no Output.
|
|
39
|
+
naming:
|
|
40
|
+
# Subpasta (ou page-mãe) criada no Output por scope
|
|
41
|
+
# Ex: "out_app_barbearia", "out_feat_login"
|
|
42
|
+
output_container: "out_{scope}"
|
|
43
|
+
|
|
44
|
+
# Nome do artefato DENTRO do container
|
|
45
|
+
# No Confluence: {scope} no nome evita colisão de títulos no space
|
|
46
|
+
# No filesystem: pode simplificar pra "{type}" (sem redundância de scope)
|
|
47
|
+
output_artifact: "{scope} - {type}"
|
|
48
|
+
|
|
49
|
+
# ----------------------------------------------------------------------------
|
|
50
|
+
# input — de onde vêm os insumos do PM/PO (single source no MVP)
|
|
51
|
+
# ----------------------------------------------------------------------------
|
|
52
|
+
# /load {scope} usa esta seção pra puxar o conteúdo pro filesystem local.
|
|
53
|
+
# Dev nunca edita o backend de input — só lê. PM owns este espaço.
|
|
54
|
+
#
|
|
55
|
+
# O agent faz listChildren(parent_page_id) e busca o scope pelo nome.
|
|
56
|
+
# Se o scope não existir no backend, /load falha com erro explícito.
|
|
57
|
+
input:
|
|
58
|
+
# Chave do adapter no registry. MVP: "confluence" | "filesystem"
|
|
59
|
+
adapter: confluence
|
|
60
|
+
|
|
61
|
+
# Config passada pro adapter.validateConfig(). Campos obrigatórios/opcionais
|
|
62
|
+
# são documentados no arquivo do adapter (ex: .github/adapters/confluence.md).
|
|
63
|
+
config:
|
|
64
|
+
space_key: ST
|
|
65
|
+
parent_page_id: "360668" # page-mãe que contém os scopes no Input
|
|
66
|
+
recursive: true # desce na árvore de scopes
|
|
67
|
+
include_attachments: true # baixa PNGs, PDFs, planilhas
|
|
68
|
+
|
|
69
|
+
# Cache local onde /load materializa os insumos
|
|
70
|
+
cache:
|
|
71
|
+
local_dir: "workspace/Input/"
|
|
72
|
+
log: ".ai/load-log.md" # append-only: id, version, sha256, timestamp
|
|
73
|
+
incremental: true # hash-based re-load (NOVO/MODIFICADO/INALTERADO)
|
|
74
|
+
|
|
75
|
+
# ----------------------------------------------------------------------------
|
|
76
|
+
# output — pra onde os artefatos vão (MVP: 1 target, multi-target em P2)
|
|
77
|
+
# ----------------------------------------------------------------------------
|
|
78
|
+
# Cada target recebe um subset de artefatos via `publishes`.
|
|
79
|
+
# Auto-publish é disparado pelas skills (/extract, /design, /plan).
|
|
80
|
+
# Agent owns este espaço. PM só aplica label `sfw-approved` pra aprovar.
|
|
81
|
+
#
|
|
82
|
+
# Premissa: 1 space = 1 projeto (no Confluence). Multi-projeto no mesmo
|
|
83
|
+
# space causa colisão de títulos — constraint do Confluence, não do SFW.
|
|
84
|
+
# Se necessário, o user diferencia no Input (nomes únicos) e o Output
|
|
85
|
+
# herda a unicidade via {scope} no naming.
|
|
86
|
+
output:
|
|
87
|
+
targets:
|
|
88
|
+
|
|
89
|
+
# --- Target 1: Confluence (espelho de aprovação pro time) ---------------
|
|
90
|
+
- name: confluence-mirror
|
|
91
|
+
|
|
92
|
+
adapter: confluence
|
|
93
|
+
|
|
94
|
+
config:
|
|
95
|
+
space_key: ST
|
|
96
|
+
parent_page_id: "294931" # page-mãe do Output no Confluence
|
|
97
|
+
|
|
98
|
+
# Whitelist de tipos que este target recebe.
|
|
99
|
+
# Tipos válidos: PRD, TRD, Progresso
|
|
100
|
+
# (tasks.md, docs/, projetos.yaml, specs/ ficam LOCAL ONLY —
|
|
101
|
+
# ver §9.9 "Boundary publish vs local")
|
|
102
|
+
publishes: [PRD, TRD, Progresso]
|
|
103
|
+
|
|
104
|
+
# auto — skill dispara publish automaticamente no fim
|
|
105
|
+
# manual — skill gera artefato local e pergunta se quer publicar
|
|
106
|
+
# off — target ignorado (offline-first natural)
|
|
107
|
+
mode: auto
|
|
108
|
+
|
|
109
|
+
# Estratégia de conflict detection:
|
|
110
|
+
# version — compara version do backend com publish-log antes de update
|
|
111
|
+
# hash — compara sha256 do conteúdo remoto com snapshot local
|
|
112
|
+
# none — sobrescreve cego (NÃO recomendado; perde drift humano)
|
|
113
|
+
conflict_detection: version
|
|
114
|
+
|
|
115
|
+
# Mecanismo de aprovação do artefato publicado:
|
|
116
|
+
# label — PM aplica label na página Confluence pra marcar aprovado
|
|
117
|
+
# none — sem aprovação formal (pipeline segue sem checar)
|
|
118
|
+
approval_mechanism: label
|
|
119
|
+
approval_label: "sfw-approved"
|
|
120
|
+
|
|
121
|
+
# --- Target 2: Filesystem mirror (opcional — time offline/backup) -------
|
|
122
|
+
# Descomente pra ativar. Útil pra testes E2E com FilesystemAdapter como
|
|
123
|
+
# mock natural — zero lib de mock, zero stub.
|
|
124
|
+
#
|
|
125
|
+
# - name: local-mirror
|
|
126
|
+
# adapter: filesystem
|
|
127
|
+
# config:
|
|
128
|
+
# root_path: "./mirror"
|
|
129
|
+
# glob: "**/*.md"
|
|
130
|
+
# publishes: [PRD, TRD, Progresso]
|
|
131
|
+
# mode: auto
|
|
132
|
+
# conflict_detection: hash
|
|
133
|
+
# approval_mechanism: none
|
|
134
|
+
|
|
135
|
+
# ----------------------------------------------------------------------------
|
|
136
|
+
# context_pages — páginas extras que o framework pode consultar (opcional)
|
|
137
|
+
# ----------------------------------------------------------------------------
|
|
138
|
+
# O /mcp descobre a árvore do projeto e sugere pages que podem ser úteis
|
|
139
|
+
# como contexto durante /extract e /design (referências, decisões, etc.)
|
|
140
|
+
#
|
|
141
|
+
# context_pages:
|
|
142
|
+
# - id: "557057"
|
|
143
|
+
# title: "Referências"
|
|
144
|
+
# use_in: [extract, design]
|
|
145
|
+
# - id: "425998"
|
|
146
|
+
# title: "Decisões"
|
|
147
|
+
# use_in: [design]
|
|
@@ -1,156 +0,0 @@
|
|
|
1
|
-
# Roadmap de Produto — {{NOME}}
|
|
2
|
-
|
|
3
|
-
<!--
|
|
4
|
-
=============================================================================
|
|
5
|
-
INSTRUÇÕES PARA O AGENTE (não incluir no arquivo gerado)
|
|
6
|
-
=============================================================================
|
|
7
|
-
|
|
8
|
-
QUANDO USAR: Gerado pelo /sf-extract em scopes com first-run=true (bootstrap de projeto)
|
|
9
|
-
quando insumos trazem mais produto do que cabe no PRD principal — outras features
|
|
10
|
-
futuras que foram mencionadas mas não são o foco deste scope.
|
|
11
|
-
|
|
12
|
-
COMO GERAR:
|
|
13
|
-
1. Durante a extração, o Analyzer separa:
|
|
14
|
-
- Conteúdo do scope atual → PRD
|
|
15
|
-
- Produto adicional mencionado mas fora do scope atual → backlog (aqui)
|
|
16
|
-
2. Em vez de listar features soltas, ORGANIZAR em fases de entrega:
|
|
17
|
-
a. Identificar entidades/funcionalidades nos insumos
|
|
18
|
-
b. Mapear dependências entre elas (ex: agendamento depende de cadastro)
|
|
19
|
-
c. Agrupar em fases por dependência + complexidade
|
|
20
|
-
d. Definir entregável por fase (o que o usuário pode usar ao final)
|
|
21
|
-
e. Priorizar: P1 (base/core), P2 (operacional), P3 (crescimento)
|
|
22
|
-
3. Para cada item, rastrear o arquivo fonte
|
|
23
|
-
4. Sugerir UMA feature única com nome descritivo (ex: feat_mvp, feat_produto)
|
|
24
|
-
|
|
25
|
-
PRINCÍPIO: Entregáveis contínuos — cada fase entrega valor e pode ir pra produção.
|
|
26
|
-
Nunca "tudo ou nada". Pequeno e constante.
|
|
27
|
-
|
|
28
|
-
CRITÉRIOS DE FASEAMENTO:
|
|
29
|
-
- Fase 1 sempre = cadastros base / fundação (sem isso nada funciona)
|
|
30
|
-
- Cada fase depende das anteriores (sequencial)
|
|
31
|
-
- Cada fase tem entregável testável pelo usuário
|
|
32
|
-
- Máximo 4-5 fases (se precisa de mais, agrupar melhor)
|
|
33
|
-
|
|
34
|
-
USO POSTERIOR:
|
|
35
|
-
- O usuário roda `/sf-start <nome>` pra cada feature do backlog que decidir construir
|
|
36
|
-
- O /sf-extract dessa feature gera PRD com as fases já sugeridas aqui como referência
|
|
37
|
-
- O /sf-plan organiza tasks por fase de entrega × área
|
|
38
|
-
|
|
39
|
-
=============================================================================
|
|
40
|
-
-->
|
|
41
|
-
|
|
42
|
-
> Roadmap faseado de produto extraído dos insumos do setup.
|
|
43
|
-
> Organizado por fases de entrega incrementais — cada fase entrega valor e pode ir pra produção.
|
|
44
|
-
> Fonte de verdade para criação de features via `/feature`.
|
|
45
|
-
|
|
46
|
-
---
|
|
47
|
-
|
|
48
|
-
## Feature sugerida: `{{FEATURE_NAME}}`
|
|
49
|
-
|
|
50
|
-
> {{Descrição em 1-2 frases do produto completo}}
|
|
51
|
-
|
|
52
|
-
---
|
|
53
|
-
|
|
54
|
-
## Fase 1 — {{Nome}} [P1 — Fundação]
|
|
55
|
-
|
|
56
|
-
> **Entregável**: {{O que o usuário pode fazer/ver ao final desta fase}}
|
|
57
|
-
> **Critério de done**: {{Como validar que a fase está pronta}}
|
|
58
|
-
|
|
59
|
-
### Funcionalidades
|
|
60
|
-
|
|
61
|
-
| # | Funcionalidade | Tipo | Descrição | Fonte |
|
|
62
|
-
|---|---------------|------|-----------|-------|
|
|
63
|
-
| 1 | | CRUD / Feature / Config | | {{arquivo}} |
|
|
64
|
-
|
|
65
|
-
### Entidades envolvidas
|
|
66
|
-
|
|
67
|
-
| Entidade | Campos principais | Fonte |
|
|
68
|
-
|----------|-------------------|-------|
|
|
69
|
-
| | | |
|
|
70
|
-
|
|
71
|
-
### Regras de negócio
|
|
72
|
-
|
|
73
|
-
| ID | Regra | Fonte |
|
|
74
|
-
|----|-------|-------|
|
|
75
|
-
| RN-001 | | {{arquivo}} |
|
|
76
|
-
|
|
77
|
-
### Jornadas de usuário
|
|
78
|
-
|
|
79
|
-
| # | Jornada | Atores | Fonte |
|
|
80
|
-
|---|---------|--------|-------|
|
|
81
|
-
| 1 | | | |
|
|
82
|
-
|
|
83
|
-
---
|
|
84
|
-
|
|
85
|
-
## Fase 2 — {{Nome}} [P1 — Core Business]
|
|
86
|
-
|
|
87
|
-
> **Entregável**: {{O que o usuário pode fazer/ver ao final desta fase}}
|
|
88
|
-
> **Critério de done**: {{Como validar}}
|
|
89
|
-
> **Depende de**: Fase 1
|
|
90
|
-
|
|
91
|
-
### Funcionalidades
|
|
92
|
-
|
|
93
|
-
| # | Funcionalidade | Tipo | Descrição | Fonte |
|
|
94
|
-
|---|---------------|------|-----------|-------|
|
|
95
|
-
| 1 | | | | |
|
|
96
|
-
|
|
97
|
-
### Entidades envolvidas
|
|
98
|
-
|
|
99
|
-
| Entidade | Campos principais | Fonte |
|
|
100
|
-
|----------|-------------------|-------|
|
|
101
|
-
| | | |
|
|
102
|
-
|
|
103
|
-
### Regras de negócio
|
|
104
|
-
|
|
105
|
-
| ID | Regra | Fonte |
|
|
106
|
-
|----|-------|-------|
|
|
107
|
-
| RN-NNN | | |
|
|
108
|
-
|
|
109
|
-
### Jornadas de usuário
|
|
110
|
-
|
|
111
|
-
| # | Jornada | Atores | Fonte |
|
|
112
|
-
|---|---------|--------|-------|
|
|
113
|
-
| 1 | | | |
|
|
114
|
-
|
|
115
|
-
---
|
|
116
|
-
|
|
117
|
-
## Fase 3 — {{Nome}} [P2 — Operacional]
|
|
118
|
-
|
|
119
|
-
> **Entregável**: {{...}}
|
|
120
|
-
> **Critério de done**: {{...}}
|
|
121
|
-
> **Depende de**: Fase 2
|
|
122
|
-
|
|
123
|
-
<!-- Repetir estrutura -->
|
|
124
|
-
|
|
125
|
-
---
|
|
126
|
-
|
|
127
|
-
## Fase 4 — {{Nome}} [P3 — Crescimento]
|
|
128
|
-
|
|
129
|
-
> **Entregável**: {{...}}
|
|
130
|
-
> **Critério de done**: {{...}}
|
|
131
|
-
> **Depende de**: Fase 3
|
|
132
|
-
|
|
133
|
-
<!-- Repetir estrutura -->
|
|
134
|
-
|
|
135
|
-
---
|
|
136
|
-
|
|
137
|
-
## Visão geral das fases
|
|
138
|
-
|
|
139
|
-
| Fase | Nome | Prioridade | Entregável | Depende de |
|
|
140
|
-
|------|------|-----------|------------|------------|
|
|
141
|
-
| 1 | | P1 | | — |
|
|
142
|
-
| 2 | | P1 | | Fase 1 |
|
|
143
|
-
| 3 | | P2 | | Fase 2 |
|
|
144
|
-
| 4 | | P3 | | Fase 3 |
|
|
145
|
-
|
|
146
|
-
## Telas/fluxos identificados (por fase)
|
|
147
|
-
|
|
148
|
-
| # | Tela/Fluxo | Fase | Fonte |
|
|
149
|
-
|---|-----------|------|-------|
|
|
150
|
-
| 1 | | | |
|
|
151
|
-
|
|
152
|
-
---
|
|
153
|
-
|
|
154
|
-
> **Próximo passo**: Criar a feature com `/feature {{FEATURE_NAME}}`
|
|
155
|
-
> O /sf-extract vai gerar o PRD usando este roadmap como referência.
|
|
156
|
-
> O /sf-plan vai organizar tasks por fase de entrega × área.
|