spec-first-copilot 0.6.0-beta.4 → 0.6.0-beta.6

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.
@@ -71,29 +71,14 @@ function loadScope(pageId, targetDir):
71
71
  collectAllPages(pageId, allPages)
72
72
 
73
73
  para cada page em allPages:
74
- // IMPORTANTE: SEMPRE pedir markdown, NUNCA storage format (HTML)
74
+ // PEDIR MARKDOWN PRIMEIRO (MCP converte do storage format)
75
75
  result = mcp__atlassian__confluence_get_page(page_id=page.id, convert_to_markdown=true)
76
- content = result.content (ou result.body — depende da resposta do MCP)
77
-
78
- // LIMPEZA OBRIGATÓRIA — Confluence pode vazar HTML mesmo com convert_to_markdown
79
- // Se o conteúdo contém tags HTML (<p>, <div>, <span>, <table>, etc.):
80
- // 1. Remover tags de metadata: <p local-id="...">, <ri:...>, <ac:...>
81
- // 2. Converter tags semânticas pra markdown:
82
- // <h1> → #, <h2> → ##, <h3> → ###
83
- // <strong>/<b> → **texto**
84
- // <em>/<i> → *texto*
85
- // <a href="url"> → [texto](url)
86
- // <ul>/<li> → - item
87
- // <ol>/<li> → 1. item
88
- // <code> → `código`
89
- // <pre> → ```bloco```
90
- // <table>/<tr>/<td> → tabela markdown
91
- // 3. Remover tags restantes sem equivalente markdown (strip tags, manter texto)
92
- // 4. Limpar linhas vazias excessivas
93
- // O arquivo salvo DEVE ser markdown limpo, sem nenhuma tag HTML.
76
+ content = result.content (ou result.body — depende do MCP)
77
+
78
+ content = preservarFormatacao(content)
94
79
 
95
80
  filename = sanitize(page.title) + ".md"
96
- salvar content LIMPO em {targetDir}/{filename}
81
+ salvar content em {targetDir}/{filename}
97
82
  registrar no load-log
98
83
 
99
84
  // Attachments de CADA page
@@ -111,6 +96,86 @@ function collectAllPages(pageId, result):
111
96
  collectAllPages(child.id, result) // recursão total
112
97
  ```
113
98
 
99
+ ### 3.1 Função `preservarFormatacao(content)` — regras obrigatórias
100
+
101
+ O MCP pode retornar markdown "parcial" (com tags HTML misturadas) ou storage format
102
+ (XHTML do Confluence). A função DEVE preservar toda a estrutura semântica:
103
+
104
+ **Passo 1 — Macros do Confluence (prioridade alta — preservar semântica)**
105
+
106
+ | Macro Confluence | Converter pra markdown |
107
+ |------------------|------------------------|
108
+ | `<ac:structured-macro ac:name="code">...<ac:plain-text-body><![CDATA[...]]></>` | ```` ```{lang}\n{código}\n``` ```` (pegar linguagem de `<ac:parameter ac:name="language">`) |
109
+ | `<ac:structured-macro ac:name="info\|note\|warning\|tip">` | `> ℹ️` (info), `> 📝` (note), `> ⚠️` (warning), `> 💡` (tip) + conteúdo como blockquote |
110
+ | `<ac:structured-macro ac:name="expand">` | `<details><summary>{title}</summary>\n{body}\n</details>` |
111
+ | `<ac:structured-macro ac:name="panel">` | blockquote simples `> ` |
112
+ | `<ac:link><ri:page ri:content-title="X" /></>` | `[X](../X.md)` (link interno) |
113
+ | `<ac:image><ri:attachment ri:filename="X" /></>` | `![X](X)` (imagem inline — attachment já é baixado) |
114
+
115
+ **Passo 2 — Tabelas (crítico — fidelidade alta)**
116
+
117
+ Preservar estrutura completa:
118
+ ```
119
+ <table>
120
+ <tbody>
121
+ <tr><th>Col A</th><th>Col B</th></tr>
122
+ <tr><td>val1</td><td>val2</td></tr>
123
+ </tbody>
124
+ </table>
125
+ ```
126
+ vira:
127
+ ```
128
+ | Col A | Col B |
129
+ |-------|-------|
130
+ | val1 | val2 |
131
+ ```
132
+
133
+ **NUNCA** achatar tabela em lista ou parágrafo — perde dados estruturados.
134
+ Se célula tem formatação inline (bold, link), preservar dentro da célula.
135
+
136
+ **Passo 3 — Tags semânticas padrão**
137
+
138
+ | HTML | Markdown |
139
+ |------|----------|
140
+ | `<h1>` → `<h6>` | `#` → `######` |
141
+ | `<strong>`, `<b>` | `**texto**` |
142
+ | `<em>`, `<i>` | `*texto*` |
143
+ | `<u>` | `<u>texto</u>` (markdown não tem underline nativo — manter tag) |
144
+ | `<s>`, `<del>` | `~~texto~~` |
145
+ | `<a href="URL">` | `[texto](URL)` |
146
+ | `<ul><li>` | `- item` |
147
+ | `<ol><li>` | `1. item` |
148
+ | `<code>` inline | `` `código` `` |
149
+ | `<pre>` sem macro code | ```` ``` ```` bloco |
150
+ | `<blockquote>` | `> texto` |
151
+ | `<hr>` | `---` |
152
+ | `<br>` | quebra de linha |
153
+ | `<p>` (simples) | parágrafo (linha em branco antes/depois) |
154
+
155
+ **Passo 4 — Remover metadata/lixo do Confluence**
156
+
157
+ Strip silencioso (sem manter nada):
158
+ - `<p local-id="uuid">` → remove tag, mantém conteúdo
159
+ - Atributos `ac:schema-version`, `ac:macro-id`, `ac:local-id`, `ri:version-at-save`
160
+ - `<ri:user>`, `<ri:space>` sem contexto útil
161
+ - Comentários HTML `<!-- ... -->`
162
+ - Entidades HTML: `&nbsp;` → espaço, `&amp;` → `&`, `&lt;` → `<`, `&gt;` → `>`
163
+
164
+ **Passo 5 — Limpeza final**
165
+
166
+ - Colapsar 3+ linhas em branco consecutivas em 2
167
+ - Trim whitespace no fim de cada linha
168
+ - Garantir que arquivo termine com uma única newline
169
+
170
+ **Passo 6 — Validação**
171
+
172
+ Após conversão, o markdown resultante NÃO deve conter:
173
+ - Nenhuma tag `<ac:...>`, `<ri:...>`, `<p local-id=...>`
174
+ - Nenhum `&nbsp;` ou entidade HTML não convertida
175
+ - Tabelas sem pipes markdown
176
+
177
+ Se qualquer um aparecer, é bug da função — reportar ao user no load-log com flag `FORMAT_WARN`.
178
+
114
179
  **Para cada scope de Output — materializar em `workspace/Output/{nome}/`:**
115
180
 
116
181
  Mesmo processo, mas:
@@ -178,8 +243,7 @@ Scope "{nome}" carregado:
178
243
  ou "nenhum artefato publicado ainda"
179
244
 
180
245
  Próximo passo:
181
- /sf-start {nome} ← bootstrap técnico ou feature (gera PRD)
182
-
246
+ /sf-start {nome} ← entrada única (bootstrap ou feature, detecta via docs/)
183
247
 
184
248
  Log: .ai/sf-load-log.md
185
249
  ```
@@ -171,27 +171,32 @@ mcp__atlassian__confluence_get_page(page_id={resposta})
171
171
  - Se 404 e user colou ID → pedir de novo
172
172
  - Se OK → seguir
173
173
 
174
- ### Passo 4 — Mapear árvore do projeto
174
+ ### Passo 4 — Listar filhos diretos do root (NÃO recursivo)
175
+
176
+ Nesta etapa queremos só o **primeiro nível** da árvore. Pra identificar Input/Output,
177
+ basta saber quais pages estão logo abaixo do root. A árvore profunda vem depois via
178
+ `/sf-load` quando o agent realmente precisa do conteúdo.
175
179
 
176
- Chamar recursivamente:
177
180
  ```
178
181
  mcp__atlassian__confluence_get_page_children(page_id={root_page_id})
179
- → pra cada filho, chamar get_page_children até bater em folha
180
182
  ```
181
183
 
184
+ **APENAS 1 chamada**. Sem loop recursivo.
185
+
182
186
  Mostrar ao usuário:
183
187
  ```
184
188
  Projeto: "Barbearia Digital" (root_page_id: 65708)
185
189
 
186
- Estrutura encontrada:
187
- ├── Requisitos (360668)
188
- │ ├── App mobile (294950)
189
- │ └── Painel admin (131084)
190
- ├── Documentação técnica (294931)
191
- ├── Referências (557057)
192
- └── Decisões (425998)
190
+ Filhos diretos do root:
191
+ 1. Requisitos (360668)
192
+ 2. Documentação técnica (294931)
193
+ 3. Referências (557057)
194
+ 4. Decisões (425998)
193
195
  ```
194
196
 
197
+ Se algum desses filhos tiver sub-pages (ex: Requisitos contém scopes), isso será descoberto
198
+ pelo `/sf-load` quando rodar. Aqui só precisamos saber quem é Input e quem é Output no nível 1.
199
+
195
200
  ### Passo 5 — Identificar Input e Output
196
201
 
197
202
  **Se já existe config com Input/Output**: mostrar o que está salvo + opção de mudar:
@@ -217,23 +222,30 @@ Qual dessas pages contém os INSUMOS (Input, onde PM/PO publica)?
217
222
  >
218
223
  ```
219
224
 
220
- Após escolher Input, perguntar Output com as pages restantes + opção "Criar nova page 'Output'".
225
+ Opção 1-4: usar o page_id correspondente.
226
+ Opção 5: criar page nova — `mcp__atlassian__confluence_create_page(parent_id={root}, title="Input", content="")`.
227
+
228
+ Após escolher Input, perguntar Output com as pages **restantes** (remover a escolhida de Input da lista) + opção "Criar nova page 'Output'".
221
229
 
222
230
  Se escolher "Criar nova" → `mcp__atlassian__confluence_create_page` como filha da raiz.
223
231
 
224
232
  ### Passo 6 — Sugerir context_pages (opcional)
225
233
 
226
- Pages da árvore que não viraram Input nem Output:
234
+ Das pages do nível 1 (filhos diretos do root) que **não** foram escolhidas como Input ou Output,
235
+ sugerir como contexto adicional pro /sf-extract e /sf-design:
236
+
227
237
  ```
228
- Encontrei outras pages que podem ser úteis durante o desenvolvimento:
238
+ Das pages restantes no primeiro nível:
229
239
 
230
240
  - "Referências" (557057) → posso consultar durante /sf-extract e /sf-design
231
241
  - "Decisões" (425998) → posso consultar para ADRs no /sf-design
232
242
 
233
- Quer que eu mapeie essas páginas como contexto adicional? (s/n)
243
+ Quer que eu mapeie alguma dessas como contexto adicional? (listar números, ou "não")
234
244
  ```
235
245
 
236
- Se sim, incluir em `context_pages[]` no `sfw.config.yml`.
246
+ Se sim, incluir as escolhidas em `context_pages[]` no `sfw.config.yml`.
247
+
248
+ Obs: `/sf-load` descobre a árvore profunda sob Input/Output quando rodar. Aqui só tratamos nível 1.
237
249
 
238
250
  ### Passo 7 — Escrever `sfw.config.yml`
239
251
 
@@ -33,7 +33,7 @@ Ler PRD §11 (Fases de Entrega) — cada fase vira um agrupamento de tasks:
33
33
 
34
34
  | Seção SDD | Área |
35
35
  |-----------|------|
36
- | §3 Modelo de dados | BANCO |
36
+ | §3 Modelo de dados | DB |
37
37
  | §5 Endpoints API | BACK |
38
38
  | §6 Componentes/Telas | FRONT |
39
39
  | §8 Integrações | INFRA |
@@ -59,14 +59,14 @@ Gerar UM arquivo só em `specs/{nome}/tasks.md` com tabela única de todas as ta
59
59
  ```markdown
60
60
  | ID | Área | Fase | Tam | Título | Repo | Arquivos | Depende de | Ref spec | Ref CA |
61
61
  |----|------|------|-----|--------|------|----------|-----------|----------|--------|
62
- | BANCO-001 | BANCO | 1 | S | Migration clientes | api | src/Migrations/... | — | SDD §3.1 | — |
63
- | BACK-001 | BACK | 1 | M | Endpoint POST /clientes | api | src/Api/... | BANCO-001 | SDD §5.1 | CA-001 |
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
64
  ```
65
65
 
66
66
  Regras:
67
67
  - Cada task é atômica — coder lê `specs/{nome}/` + task, nada mais
68
68
  - **Repo obrigatório** — consultar `projetos.yaml`. Caminhos relativos ao repo
69
- - Área é COLUNA, não arquivo (BANCO, BACK, FRONT, INFRA, DOC, MOBILE...)
69
+ - Área é COLUNA, não arquivo (DB, BACK, FRONT, INFRA, DOC, MOBILE...)
70
70
  - Tamanhos: S (<30min), M (30min-2h), L (2h+). L → avaliar se quebra em M+S
71
71
  - IDs sequenciais por área, nunca reutilizar
72
72
  - Dependências cross-area permitidas
@@ -259,11 +259,17 @@ RE-EXTRAÇÃO:
259
259
 
260
260
  ## 14. Ambiguidades e Perguntas
261
261
 
262
- > ⚠️ **BLOQUEANTE** — o fluxo NÃO avança até o usuário responder TODAS.
263
-
264
- | # | Pergunta | Contexto | Fonte | Resposta do usuário |
265
- |---|----------|----------|-------|---------------------|
266
- | 1 | ⚠️ | | | (aguardando) |
262
+ > ⚠️ **BLOQUEANTE** — o `/design` NÃO avança enquanto houver linha com `Resposta` vazia E `Resolvido em docs/` vazio.
263
+ >
264
+ > **Como responder** (ver `.claude/commands/extract.md` "Como responder ambiguidades"):
265
+ > preencher a coluna `Resposta` direto nesta tabela e rodar `/design` de novo.
266
+ >
267
+ > **Coluna `Resolvido em docs/`**: preenchida pelo Analyzer quando a resposta já
268
+ > existe em `docs/` — formato `docs/{arquivo}.md §{seção}`. NÃO preencher manualmente.
269
+
270
+ | ID | Pergunta | Contexto | Fonte | Resposta | Resolvido em docs/ |
271
+ |----|----------|----------|-------|----------|--------------------|
272
+ | AMB-001 | ⚠️ | | | (aguardando) | — |
267
273
 
268
274
  ---
269
275
 
@@ -1,136 +1,141 @@
1
- # Progresso — {{FEATURE}}
2
-
3
- > Visão consolidada do andamento da feature.
4
- > Organizado por **fases de entrega** — cada fase é um entregável independente.
5
- > Atualizado automaticamente pelo /dev a cada task concluída.
6
-
7
- ---
8
-
9
- ## Status Geral: `não iniciado`
10
-
11
- <!-- não iniciado → em desenvolvimento → em revisão → concluído → arquivado -->
12
-
13
- ---
14
-
15
- <!--
16
- =============================================================================
17
- INSTRUÇÕES PARA O AGENTE (não incluir no arquivo gerado)
18
- =============================================================================
19
-
20
- COMO GERAR ESTE ARQUIVO:
21
-
22
- 1. Ler PRD §11 (Fases de Entrega) para definir as fases
23
- 2. Ler TODOS os specs/{nome}/tasks.md da feature
24
- 3. Para cada FASE DE ENTREGA, listar as áreas e contagem de tasks
25
- 4. A visão primária é POR FASE, não por área
26
-
27
- COMO ATUALIZAR:
28
-
29
- - O /dev atualiza após cada task concluída
30
- - Status por fase: pendente 🔄 em andamento → ✅ concluída
31
- - Fase concluída = todas tasks de todas áreas daquela fase estão [x]
32
- - Ao concluir uma fase: registrar no Histórico + abrir PR
33
-
34
- =============================================================================
35
- -->
36
-
37
- ## Fases de Entrega
38
-
39
- | Fase | Nome | Prioridade | Entregável | Status | Tasks |
40
- |------|------|-----------|------------|--------|-------|
41
- | 1 | {{Nome}} | P1 | {{Entregável}} | ⬜ pendente | 0/{{N}} |
42
- | 2 | {{Nome}} | P1 | {{Entregável}} | ⬜ pendente | 0/{{N}} |
43
- | 3 | {{Nome}} | P2 | {{Entregável}} | ⬜ pendente | 0/{{N}} |
44
-
45
- ---
46
-
47
- ## Fase 1 {{Nome}} [P1]
48
-
49
- > **Entregável**: {{O que o usuário pode usar}}
50
- > **Critério de done**: {{Testes E2E que devem passar}}
51
- > **Branch**: `feature/{{FEATURE}}_fase1`
52
- > **PR**: (a ser criado)
53
-
54
- ### Tasks por área
55
-
56
- #### {{AREA_1}} ({{N}} tasks)
57
-
58
- | Task | Descrição | Tamanho | Repo | Status |
59
- |------|-----------|---------|------|--------|
60
- | AREA-001 | | S/M/L | {{repo}} | ⬜ |
61
-
62
- #### {{AREA_2}} ({{N}} tasks)
63
-
64
- | Task | Descrição | Tamanho | Repo | Status |
65
- |------|-----------|---------|------|--------|
66
- | AREA-001 | | S/M/L | {{repo}} | ⬜ |
67
-
68
- ### Resumo Fase 1
69
-
70
- | Área | Total | Feitas | % |
71
- |------|-------|--------|---|
72
- | {{AREA_1}} | {{N}} | 0 | 0% |
73
- | {{AREA_2}} | {{N}} | 0 | 0% |
74
- | **Total Fase 1** | **{{N}}** | **0** | **0%** |
75
-
76
- ---
77
-
78
- ## Fase 2 {{Nome}} [P1]
79
-
80
- > **Entregável**: {{...}}
81
- > **Depende de**: Fase 1 concluída
82
-
83
- <!-- Repetir mesma estrutura -->
84
-
85
- ---
86
-
87
- ## Totais Gerais
88
-
89
- | Fase | Total | Feitas | % |
90
- |------|-------|--------|---|
91
- | Fase 1 | {{N}} | 0 | 0% |
92
- | Fase 2 | {{N}} | 0 | 0% |
93
- | **Total** | **{{N}}** | **0** | **0%** |
94
-
95
- ---
96
-
97
- ## Ordem de Execução
98
-
99
- ```
100
- Fase 1:
101
- 1. INFRA (setup de repos/ambiente)
102
- 2. BANCO (schema/migrations)
103
- 3. BACK (endpoints) ← pode paralelizar com FRONT após BANCO
104
- 4. FRONT (telas)
105
- → PR Fase 1 + testes manuais + merge
106
-
107
- Fase 2:
108
- 1. BANCO (novas tabelas/migrations)
109
- 2. BACK (endpoints + regras)
110
- 3. FRONT (telas + integração)
111
- → PR Fase 2 + testes manuais + merge
112
- ```
113
-
114
- ---
115
-
116
- ## Histórico
117
-
118
- | Data | Evento | Detalhes |
119
- |------|--------|----------|
120
- | | Feature criada | PRD aprovado, SDD gerado |
121
-
122
- ---
123
-
124
- ## Pós-conclusão (por fase)
125
-
126
- - [ ] PR aberto com template detalhado
127
- - [ ] Ambiente local rodando para testes manuais
128
- - [ ] Testes automatizados passando (unit + integration + security)
129
- - [ ] Usuário aprovou e fez merge
130
-
131
- ## Pós-conclusão (feature completa)
132
-
133
- - [ ] Todas fases concluídas e mergeadas
134
- - [ ] Mergear Delta Specs (SDD §11) nos docs de `docs/`
135
- - [ ] Atualizar `workspace/Output/progresso.md` (visão global)
136
- - [ ] Atualizar `.ai/memory/napkin.md` se houver aprendizado relevante
1
+ # Progresso — {{FEATURE}}
2
+
3
+ > Visão consolidada do andamento da feature.
4
+ > Organizado por **fases de entrega** — cada fase é um entregável independente.
5
+ > Atualizado automaticamente pelo /dev a cada task concluída.
6
+ >
7
+ > **Este arquivo rastreia FASES DE ENTREGA, não o pipeline do SFW.**
8
+ > O estado do pipeline (extract_done, design_done, plan_done, dev_in_progress, dev_done, done)
9
+ > vive em `.context.md`. Aqui rastreamos: "as fases de entrega do PRD §11 já foram implementadas?"
10
+
11
+ ---
12
+
13
+ ## Status das Fases: `não iniciado`
14
+
15
+ <!-- não iniciado → em desenvolvimento → em revisão → concluído → arquivado
16
+ (vocabulário PRÓPRIO deste arquivo — não confundir com status da pipeline em .context.md) -->
17
+
18
+ ---
19
+
20
+ <!--
21
+ =============================================================================
22
+ INSTRUÇÕES PARA O AGENTE (não incluir no arquivo gerado)
23
+ =============================================================================
24
+
25
+ COMO GERAR ESTE ARQUIVO:
26
+
27
+ 1. Ler PRD §11 (Fases de Entrega) para definir as fases
28
+ 2. Ler TODOS os specs/{nome}/tasks.md da feature
29
+ 3. Para cada FASE DE ENTREGA, listar as áreas e contagem de tasks
30
+ 4. A visão primária é POR FASE, não por área
31
+
32
+ COMO ATUALIZAR:
33
+
34
+ - O /dev atualiza após cada task concluída
35
+ - Status por fase: ⬜ pendente → 🔄 em andamento → ✅ concluída
36
+ - Fase concluída = todas tasks de todas áreas daquela fase estão [x]
37
+ - Ao concluir uma fase: registrar no Histórico + abrir PR
38
+
39
+ =============================================================================
40
+ -->
41
+
42
+ ## Fases de Entrega
43
+
44
+ | Fase | Nome | Prioridade | Entregável | Status | Tasks |
45
+ |------|------|-----------|------------|--------|-------|
46
+ | 1 | {{Nome}} | P1 | {{Entregável}} | ⬜ pendente | 0/{{N}} |
47
+ | 2 | {{Nome}} | P1 | {{Entregável}} | ⬜ pendente | 0/{{N}} |
48
+ | 3 | {{Nome}} | P2 | {{Entregável}} | ⬜ pendente | 0/{{N}} |
49
+
50
+ ---
51
+
52
+ ## Fase 1 {{Nome}} [P1]
53
+
54
+ > **Entregável**: {{O que o usuário pode usar}}
55
+ > **Critério de done**: {{Testes E2E que devem passar}}
56
+ > **Branch**: `feature/{{FEATURE}}_fase1`
57
+ > **PR**: (a ser criado)
58
+
59
+ ### Tasks por área
60
+
61
+ #### {{AREA_1}} ({{N}} tasks)
62
+
63
+ | Task | Descrição | Tamanho | Repo | Status |
64
+ |------|-----------|---------|------|--------|
65
+ | AREA-001 | | S/M/L | {{repo}} | ⬜ |
66
+
67
+ #### {{AREA_2}} ({{N}} tasks)
68
+
69
+ | Task | Descrição | Tamanho | Repo | Status |
70
+ |------|-----------|---------|------|--------|
71
+ | AREA-001 | | S/M/L | {{repo}} | ⬜ |
72
+
73
+ ### Resumo Fase 1
74
+
75
+ | Área | Total | Feitas | % |
76
+ |------|-------|--------|---|
77
+ | {{AREA_1}} | {{N}} | 0 | 0% |
78
+ | {{AREA_2}} | {{N}} | 0 | 0% |
79
+ | **Total Fase 1** | **{{N}}** | **0** | **0%** |
80
+
81
+ ---
82
+
83
+ ## Fase 2 {{Nome}} [P1]
84
+
85
+ > **Entregável**: {{...}}
86
+ > **Depende de**: Fase 1 concluída
87
+
88
+ <!-- Repetir mesma estrutura -->
89
+
90
+ ---
91
+
92
+ ## Totais Gerais
93
+
94
+ | Fase | Total | Feitas | % |
95
+ |------|-------|--------|---|
96
+ | Fase 1 | {{N}} | 0 | 0% |
97
+ | Fase 2 | {{N}} | 0 | 0% |
98
+ | **Total** | **{{N}}** | **0** | **0%** |
99
+
100
+ ---
101
+
102
+ ## Ordem de Execução
103
+
104
+ ```
105
+ Fase 1:
106
+ 1. INFRA (setup de repos/ambiente)
107
+ 2. DB (schema/migrations)
108
+ 3. BACK (endpoints) ← pode paralelizar com FRONT após DB
109
+ 4. FRONT (telas)
110
+ PR Fase 1 + testes manuais + merge
111
+
112
+ Fase 2:
113
+ 1. DB (novas tabelas/migrations)
114
+ 2. BACK (endpoints + regras)
115
+ 3. FRONT (telas + integração)
116
+ PR Fase 2 + testes manuais + merge
117
+ ```
118
+
119
+ ---
120
+
121
+ ## Histórico
122
+
123
+ | Data | Evento | Detalhes |
124
+ |------|--------|----------|
125
+ | | Feature criada | PRD aprovado, SDD gerado |
126
+
127
+ ---
128
+
129
+ ## Pós-conclusão (por fase)
130
+
131
+ - [ ] PR aberto com template detalhado
132
+ - [ ] Ambiente local rodando para testes manuais
133
+ - [ ] Testes automatizados passando (unit + integration + security)
134
+ - [ ] Usuário aprovou e fez merge
135
+
136
+ ## Pós-conclusão (feature completa)
137
+
138
+ - [ ] Todas fases concluídas e mergeadas
139
+ - [ ] Mergear Delta Specs (SDD §11) nos docs de `docs/`
140
+ - [ ] Atualizar `workspace/Output/progresso.md` (visão global)
141
+ - [ ] Atualizar `.ai/memory/napkin.md` se houver aprendizado relevante
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  nome: "{{NOME}}"
3
- first_run: "{{true|false}}"
4
- prd_empty: "{{true|false}}"
3
+ first_run: {{true|false}}
4
+ prd_empty: {{true|false}}
5
5
  areas_tocadas: []
6
6
  input_path: "workspace/Input/{{NOME}}/"
7
7
  status: "not_started"
@@ -16,10 +16,10 @@ INSTRUÇÕES PARA O AGENTE (não incluir no arquivo gerado)
16
16
 
17
17
  CAMPOS:
18
18
  - nome: identificador livre do scope (ex: app_barbearia, feat_login, infra_k8s)
19
- - first_run: "true" se docs/ não existia quando /sfw-start foi chamado (bootstrap)
20
- "false" se é feature/incremento em projeto existente
21
- - prd_empty: "true" se o /extract marcou PRD como empty (scope puro-técnico)
22
- "false" se PRD tem conteúdo de produto
19
+ - first_run: bool (true/false, SEM aspas) — true se docs/ não existia quando /sfw-start foi chamado
20
+ IMUTÁVEL após criação
21
+ - prd_empty: bool (true/false, SEM aspas) — true se /extract marcou PRD como empty (scope puro-técnico)
22
+ Pode mudar em re-extração (empty → non-empty se novo insumo trouxer produto)
23
23
  - areas_tocadas: lista de áreas que o scope toca (ex: [BACK, DB]). Preenchido pelo /design.
24
24
  Possíveis: BACK, FRONT, DB, INFRA. Usado pelos GATEs do SDD §Área-X.
25
25
  - input_path: caminho relativo da pasta de insumos
@@ -10,16 +10,22 @@
10
10
  # COMO GERAR:
11
11
  # 1. Ler SDD §3.2 Arquitetura → identificar quais serviços existem (api, worker, web, etc.)
12
12
  # 2. Para cada serviço, definir: nome do repo, path local, áreas de task, stack
13
- # 3. Se o repo existe no GitHub, marcar existing: true
14
- # 4. Se é novo, marcar existing: false (será criado pelo /dev INFRA-001)
13
+ # 3. A stack DEVE vir do SDD §3.1 (Stack) — não inventar, não copiar exemplo
14
+ # 4. Se o repo já existe no GitHub, marcar existing: true
15
+ # 5. Se é novo, marcar existing: false (será criado pelo /dev INFRA-001)
15
16
  #
16
17
  # REGRAS:
17
18
  # - Todo serviço identificado no SDD §3.2 DEVE ter uma entrada
18
19
  # - O campo `areas` define quais prefixos de task escrevem nesse repo
19
20
  # - Uma área NÃO pode pertencer a dois repos (mapeamento 1:1)
20
- # - BANCO pode ir junto com api (se usa EF migrations) ou separado (se repo de migrations)
21
- # - O campo `stack` deve ser consistente com docs/architecture.md (seção Stack Principal)
21
+ # - DB pode ir junto com api (se usa ORM com migrations no mesmo repo) ou separado
22
+ # - O campo `stack` DEVE ser consistente com SDD §3.1 + docs/architecture.md
22
23
  # - O `org` é a organização/user do GitHub
24
+ #
25
+ # EXEMPLOS DE STACK (apenas referência — usar a REAL do SDD):
26
+ # - Backend: ".NET 8", "Node.js 20 + Express", "Python 3.12 + FastAPI", "Go 1.22"
27
+ # - Frontend: "React 18 + Vite", "Next.js 15", "Vue 3 + Nuxt", "Angular 17"
28
+ # - Mobile: "React Native", "Flutter", "Swift / Kotlin nativo"
23
29
  # =============================================================================
24
30
 
25
31
  # Organização/usuário no GitHub
@@ -28,42 +34,42 @@ org: "{{GITHUB_ORG}}"
28
34
  # Nome base do projeto (usado como prefixo dos repos)
29
35
  project: "{{PROJECT_NAME}}"
30
36
 
31
- # Repositórios
37
+ # Repositórios — preencher conforme serviços do SDD §3.2
32
38
  repos:
33
- # Exemplo: API backend
39
+ # API backend (exemplo — adaptar stack ao SDD real do projeto)
34
40
  api:
35
- repo: "{{GITHUB_ORG}}/{{PROJECT_NAME}}-api" # nome completo do repo
36
- path: "projetos/api" # path local (relativo à raiz)
37
- existing: false # true = clonar, false = criar
38
- areas: [BACK, BANCO] # áreas de task que escrevem aqui
39
- stack: ".NET 8" # stack principal
40
- branch_prefix: "feature/" # prefixo de branches de feature
41
+ repo: "{{GITHUB_ORG}}/{{PROJECT_NAME}}-api"
42
+ path: "projetos/api"
43
+ existing: false # true = clonar existente; false = criar novo
44
+ areas: [BACK, DB] # áreas de task que escrevem aqui (1:1 por área)
45
+ stack: "{{STACK_BACKEND}}" # do SDD §3.1 (ex: "Node.js 20 + Express")
46
+ branch_prefix: "feature/"
41
47
 
42
- # Exemplo: Worker/background jobs
48
+ # Worker / jobs assíncronos (descomentar se SDD §3.2 define)
43
49
  # worker:
44
50
  # repo: "{{GITHUB_ORG}}/{{PROJECT_NAME}}-worker"
45
51
  # path: "projetos/worker"
46
52
  # existing: false
47
- # areas: [BACK] # worker tem tasks BACK separadas
48
- # stack: ".NET 8"
53
+ # areas: [BACK] # ou criar área WORKER dedicada se preferir
54
+ # stack: "{{STACK_WORKER}}"
49
55
  # branch_prefix: "feature/"
50
56
 
51
- # Exemplo: Frontend web
57
+ # Frontend web (descomentar se SDD §3.2 define)
52
58
  # web:
53
59
  # repo: "{{GITHUB_ORG}}/{{PROJECT_NAME}}-web"
54
60
  # path: "projetos/web"
55
61
  # existing: false
56
62
  # areas: [FRONT]
57
- # stack: "React"
63
+ # stack: "{{STACK_FRONTEND}}"
58
64
  # branch_prefix: "feature/"
59
65
 
60
- # Exemplo: App mobile
66
+ # App mobile (descomentar se SDD §3.2 define)
61
67
  # mobile:
62
68
  # repo: "{{GITHUB_ORG}}/{{PROJECT_NAME}}-mobile"
63
69
  # path: "projetos/mobile"
64
70
  # existing: false
65
71
  # areas: [MOBILE]
66
- # stack: "React Native"
72
+ # stack: "{{STACK_MOBILE}}"
67
73
  # branch_prefix: "feature/"
68
74
 
69
75
  # Notas: