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.
- package/package.json +1 -1
- package/templates/.github/CHANGELOG.md +123 -0
- package/templates/.github/agents/db-coder.md +165 -165
- package/templates/.github/rules.md +1 -1
- package/templates/.github/skills/sf-design/SKILL.md +21 -7
- package/templates/.github/skills/sf-dev/SKILL.md +3 -3
- package/templates/.github/skills/sf-discovery/SKILL.md +9 -0
- package/templates/.github/skills/sf-extract/SKILL.md +30 -0
- package/templates/.github/skills/sf-load/SKILL.md +86 -22
- package/templates/.github/skills/sf-mcp/SKILL.md +27 -15
- package/templates/.github/skills/sf-plan/SKILL.md +4 -4
- package/templates/.github/templates/feature/PRD.template.md +11 -5
- package/templates/.github/templates/feature/Progresso.template.md +141 -136
- package/templates/.github/templates/feature/context.template.md +6 -6
- package/templates/.github/templates/feature/projetos.template.yaml +25 -19
- package/templates/.github/templates/feature/sdd.template.md +14 -7
- package/templates/.github/templates/global/progresso_global.template.md +2 -2
- package/templates/.github/templates/specs/brief.template.md +22 -10
- package/templates/.github/templates/specs/contracts.template.md +94 -35
- package/templates/.github/templates/specs/scenarios.template.md +75 -37
- package/templates/.github/templates/specs/tasks.template.md +63 -61
|
@@ -71,29 +71,14 @@ function loadScope(pageId, targetDir):
|
|
|
71
71
|
collectAllPages(pageId, allPages)
|
|
72
72
|
|
|
73
73
|
para cada page em allPages:
|
|
74
|
-
//
|
|
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
|
|
77
|
-
|
|
78
|
-
|
|
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
|
|
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" /></>` | `` (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: ` ` → espaço, `&` → `&`, `<` → `<`, `>` → `>`
|
|
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 ` ` 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
|
|
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 —
|
|
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
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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 |
|
|
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
|
-
|
|
|
63
|
-
| BACK-001 | BACK | 1 | M | Endpoint POST /clientes | api | src/Api/... |
|
|
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 (
|
|
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
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
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
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
<!--
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
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
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
- [ ]
|
|
134
|
-
- [ ]
|
|
135
|
-
|
|
136
|
-
-
|
|
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:
|
|
4
|
-
prd_empty:
|
|
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:
|
|
20
|
-
|
|
21
|
-
- prd_empty:
|
|
22
|
-
|
|
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.
|
|
14
|
-
# 4. Se
|
|
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
|
-
# -
|
|
21
|
-
# - O campo `stack`
|
|
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
|
-
#
|
|
39
|
+
# API backend (exemplo — adaptar stack ao SDD real do projeto)
|
|
34
40
|
api:
|
|
35
|
-
repo: "{{GITHUB_ORG}}/{{PROJECT_NAME}}-api"
|
|
36
|
-
path: "projetos/api"
|
|
37
|
-
existing: false
|
|
38
|
-
areas: [BACK,
|
|
39
|
-
stack: ".
|
|
40
|
-
branch_prefix: "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
|
-
#
|
|
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]
|
|
48
|
-
# stack: "
|
|
53
|
+
# areas: [BACK] # ou criar área WORKER dedicada se preferir
|
|
54
|
+
# stack: "{{STACK_WORKER}}"
|
|
49
55
|
# branch_prefix: "feature/"
|
|
50
56
|
|
|
51
|
-
#
|
|
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: "
|
|
63
|
+
# stack: "{{STACK_FRONTEND}}"
|
|
58
64
|
# branch_prefix: "feature/"
|
|
59
65
|
|
|
60
|
-
#
|
|
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: "
|
|
72
|
+
# stack: "{{STACK_MOBILE}}"
|
|
67
73
|
# branch_prefix: "feature/"
|
|
68
74
|
|
|
69
75
|
# Notas:
|