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,559 +0,0 @@
|
|
|
1
|
-
# SDD — {{NOME}}
|
|
2
|
-
|
|
3
|
-
> **Software Design Document** — fonte de verdade técnica pro escopo `{{NOME}}`.
|
|
4
|
-
> Gerado pelo `/sf-design` a partir do PRD (se existir) + chunks tech do `/sf-extract`.
|
|
5
|
-
> O Coder lê APENAS este documento + `specs/{{NOME}}/` e seu task específica.
|
|
6
|
-
> Se não está aqui, não será implementado.
|
|
7
|
-
>
|
|
8
|
-
> **Sobre o tamanho do template**: o SDD tem 12 seções para cobrir o range completo
|
|
9
|
-
> (app simples → sistema distribuído com 5 serviços). Escopo pequeno preenche 3-4
|
|
10
|
-
> seções e marca as outras como "N/A" ou "não se aplica" — isso é **esperado**.
|
|
11
|
-
> Áreas não tocadas (§4-§7) usam `GATE: NÃO` e ficam vazias. Não inflar conteúdo
|
|
12
|
-
> pra preencher seção vazia — "N/A" é resposta válida.
|
|
13
|
-
|
|
14
|
-
---
|
|
15
|
-
|
|
16
|
-
## Meta
|
|
17
|
-
|
|
18
|
-
| Campo | Valor |
|
|
19
|
-
|-------|-------|
|
|
20
|
-
| Scope | `{{NOME}}` |
|
|
21
|
-
| PRD | `workspace/Output/{{NOME}}/PRD.md` — `empty: {{true\|false}}` (sem aspas, bool) |
|
|
22
|
-
| First-run | `{{true\|false}}` — true quando `docs/` não existia antes desta execução |
|
|
23
|
-
| Áreas tocadas | `[BACK?, FRONT?, DB?, INFRA?]` |
|
|
24
|
-
| Status | `rascunho` → `em revisão` → `aprovado` → `em dev` → `concluído` |
|
|
25
|
-
| Autor | `/sf-design` |
|
|
26
|
-
| Criado em | |
|
|
27
|
-
| Ambiguidades pendentes | `{{N}}` — ver §12 |
|
|
28
|
-
|
|
29
|
-
---
|
|
30
|
-
|
|
31
|
-
<!--
|
|
32
|
-
=============================================================================
|
|
33
|
-
INSTRUÇÕES PARA O AGENTE (não incluir no arquivo gerado)
|
|
34
|
-
=============================================================================
|
|
35
|
-
|
|
36
|
-
QUANDO USAR: Gerado pelo /sf-design após checkpoint de aprovação do PRD.
|
|
37
|
-
QUEM GERA: Agent Architect (Opus).
|
|
38
|
-
|
|
39
|
-
ENTRADAS:
|
|
40
|
-
1. `workspace/Output/{{NOME}}/PRD.md` — pode ter `empty: true` em first-run puro-técnico
|
|
41
|
-
2. `workspace/Output/{{NOME}}/.extract-log.md` — chunks tech categorizados pelo /sf-extract
|
|
42
|
-
3. `docs/` — se existir (não é first-run), usar como baseline; referenciar em vez de duplicar
|
|
43
|
-
4. `workspace/Input/{{NOME}}/` — consulta adicional apenas pra desambiguação
|
|
44
|
-
|
|
45
|
-
BRANCH FIRST-RUN vs FEATURE:
|
|
46
|
-
- `docs/` AUSENTE → first-run:
|
|
47
|
-
- Preencher §3 §Sistema COMPLETO (todas subseções)
|
|
48
|
-
- Preencher §Área-X de todas as áreas aplicáveis (scaffolding inicial)
|
|
49
|
-
- §11 Delta Specs: TUDO em ADDED (docs/ nasce a partir daqui via /sf-merge-docs)
|
|
50
|
-
- `docs/` EXISTE → feature:
|
|
51
|
-
- §3 §Sistema: só subseções que a feature MUDA (ex: nova env var → só §3.3)
|
|
52
|
-
- §Área-X: só áreas tocadas (outras ficam N/A — não remover, deixar vazia com "N/A: feature não toca esta área")
|
|
53
|
-
- §11 Delta Specs: ADDED/MODIFIED/REMOVED refletindo impacto cross-feature
|
|
54
|
-
|
|
55
|
-
GATE DE SEÇÃO (obrigatório):
|
|
56
|
-
Cada §Área-X começa com um bloco GATE:
|
|
57
|
-
> **GATE**: BACK tocada? [SIM|NÃO]
|
|
58
|
-
> Se NÃO, toda a seção vira "N/A — feature não toca backend" e passar.
|
|
59
|
-
Coder SÓ lê §Área-X quando GATE = SIM.
|
|
60
|
-
|
|
61
|
-
RASTREABILIDADE:
|
|
62
|
-
- Cada §Área-X referencia PRD §X ou "no-PRD" (origem: extract tech chunks)
|
|
63
|
-
- Cada decisão em §2 referencia item do PRD ou chunk do extract-log
|
|
64
|
-
- Se §Sistema é preenchida em feature, cada subseção diz "mudança em docs/X §Y"
|
|
65
|
-
|
|
66
|
-
AMBIGUIDADES:
|
|
67
|
-
- §12 lista ambiguidades não resolvidas — BLOQUEANTE pro /sf-design concluir
|
|
68
|
-
- Analyzer consulta `docs/` ANTES de marcar ambiguidade: se a resposta existe
|
|
69
|
-
(ex: auth já documentada em `docs/conventions.md`), marcar como "resolvido em
|
|
70
|
-
docs/conventions.md §Autenticação" e NÃO perguntar
|
|
71
|
-
- Ambiguidades reais só surgem se (a) docs/ ausente, (b) assunto novo,
|
|
72
|
-
(c) insumo contradiz docs/
|
|
73
|
-
|
|
74
|
-
DELTA SPECS:
|
|
75
|
-
- §11 é a ÚNICA seção lida pelo /sf-merge-docs
|
|
76
|
-
- Formato ADDED/MODIFIED/REMOVED (inspirado OpenSpec)
|
|
77
|
-
- Cada entry referencia arquivo-alvo: `docs/conventions.md §Monitoramento`
|
|
78
|
-
- Sem §11, docs/ não atualiza — é obrigatório (mesmo vazio com "nenhuma mudança")
|
|
79
|
-
|
|
80
|
-
=============================================================================
|
|
81
|
-
-->
|
|
82
|
-
|
|
83
|
-
## 1. Visão Geral
|
|
84
|
-
|
|
85
|
-
### O que é
|
|
86
|
-
<!-- 2-3 frases: o que este scope entrega, ligação com produto -->
|
|
87
|
-
|
|
88
|
-
### Escopo técnico
|
|
89
|
-
<!-- Limites: o que ENTRA (áreas tocadas, integrações) e o que FICA DE FORA -->
|
|
90
|
-
|
|
91
|
-
### Premissas
|
|
92
|
-
- [ ] <!-- Ex: Usuário já está autenticado (contexto global) -->
|
|
93
|
-
|
|
94
|
-
### Referência PRD
|
|
95
|
-
<!-- Se PRD existe: "Ver PRD.md §2 Jornadas, §5 Regras" -->
|
|
96
|
-
<!-- Se PRD empty: "PRD empty — scope puro-técnico (first-run de infra)" -->
|
|
97
|
-
|
|
98
|
-
---
|
|
99
|
-
|
|
100
|
-
## 2. Decisões de Design
|
|
101
|
-
|
|
102
|
-
> Mini-ADRs inline — decisões técnicas deste scope com justificativa.
|
|
103
|
-
> Decisões globais persistentes vão em `docs/decisions.md` via §11 Delta Specs.
|
|
104
|
-
|
|
105
|
-
| # | Decisão | Justificativa | Alternativa descartada | Origem |
|
|
106
|
-
|---|---------|---------------|------------------------|--------|
|
|
107
|
-
| 1 | | | | PRD §X / extract-log §Y |
|
|
108
|
-
|
|
109
|
-
---
|
|
110
|
-
|
|
111
|
-
## 3. §Sistema
|
|
112
|
-
|
|
113
|
-
> **GATE**: Preencher completo em first-run. Em feature, preencher APENAS
|
|
114
|
-
> subseções que a feature MODIFICA (mudanças propagam pra `docs/` via §11).
|
|
115
|
-
> Se nada muda no sistema, marcar: "N/A — feature não altera baseline".
|
|
116
|
-
|
|
117
|
-
### 3.1 Stack
|
|
118
|
-
|
|
119
|
-
| Camada | Tecnologia | Versão | Justificativa |
|
|
120
|
-
|--------|-----------|--------|---------------|
|
|
121
|
-
| Backend | | | |
|
|
122
|
-
| Frontend | | | |
|
|
123
|
-
| Banco | | | |
|
|
124
|
-
| Infra | | | |
|
|
125
|
-
|
|
126
|
-
**Ferramentas auxiliares**:
|
|
127
|
-
- <!-- build, lint, formatter, CI runner -->
|
|
128
|
-
|
|
129
|
-
### 3.2 Arquitetura
|
|
130
|
-
|
|
131
|
-
**Containers lógicos**:
|
|
132
|
-
|
|
133
|
-
| Container | Tecnologia | Responsabilidade | Porta |
|
|
134
|
-
|-----------|-----------|------------------|-------|
|
|
135
|
-
| | | | |
|
|
136
|
-
|
|
137
|
-
**Padrões de comunicação**:
|
|
138
|
-
- <!-- REST síncrono, event-driven, gRPC, etc. -->
|
|
139
|
-
|
|
140
|
-
**Padrões de design adotados**:
|
|
141
|
-
- <!-- Clean Arch, Hexagonal, CQRS, etc. -->
|
|
142
|
-
|
|
143
|
-
### 3.3 Ambientes
|
|
144
|
-
|
|
145
|
-
| Ambiente | Propósito | URL pattern | Deploy trigger |
|
|
146
|
-
|----------|-----------|-------------|----------------|
|
|
147
|
-
| dev | | `*.dev.internal` | push em feature |
|
|
148
|
-
| staging | | `staging.*` | merge em main |
|
|
149
|
-
| prod | | `www.*` | tag release |
|
|
150
|
-
|
|
151
|
-
**Variáveis de ambiente baseline**:
|
|
152
|
-
|
|
153
|
-
| Var | Dev | Staging | Prod | Descrição |
|
|
154
|
-
|-----|-----|---------|------|-----------|
|
|
155
|
-
| | | | | |
|
|
156
|
-
|
|
157
|
-
### 3.4 Infraestrutura
|
|
158
|
-
|
|
159
|
-
| Aspecto | Decisão |
|
|
160
|
-
|---------|---------|
|
|
161
|
-
| Hospedagem | |
|
|
162
|
-
| Orquestração | <!-- Docker Compose / K8s / ECS / etc. --> |
|
|
163
|
-
| CI/CD | <!-- GitHub Actions / GitLab CI / Jenkins --> |
|
|
164
|
-
| Containerização | |
|
|
165
|
-
| Registry | |
|
|
166
|
-
|
|
167
|
-
**Dev local** (convenção SFW: docker-compose = só dependências; apps rodam direto):
|
|
168
|
-
- Serviços no docker-compose: <!-- PostgreSQL, Redis, RabbitMQ --> (apenas infra)
|
|
169
|
-
- Apps (API, Worker, Web): rodam com `dotnet run`, `npm run dev`, etc.
|
|
170
|
-
- Motivo: hot reload, debug breakpoints, performance I/O
|
|
171
|
-
|
|
172
|
-
### 3.5 Segurança
|
|
173
|
-
|
|
174
|
-
| Aspecto | Decisão | Referência |
|
|
175
|
-
|---------|---------|-----------|
|
|
176
|
-
| Autenticação | <!-- JWT/OAuth2/session --> | |
|
|
177
|
-
| Autorização | <!-- RBAC/ABAC + fluxo --> | |
|
|
178
|
-
| Secrets | <!-- Vault/AWS SSM/.env gitignored --> | |
|
|
179
|
-
| CORS | | |
|
|
180
|
-
| Rate limiting | | |
|
|
181
|
-
| LGPD | | |
|
|
182
|
-
| Auditoria | | |
|
|
183
|
-
|
|
184
|
-
### 3.6 Convenções de API
|
|
185
|
-
|
|
186
|
-
| Aspecto | Convenção |
|
|
187
|
-
|---------|-----------|
|
|
188
|
-
| Estilo | <!-- REST / GraphQL / RPC --> |
|
|
189
|
-
| Formato | <!-- JSON / JSON:API --> |
|
|
190
|
-
| Versionamento | <!-- /v1/, header, none --> |
|
|
191
|
-
| Paginação | <!-- cursor / offset --> |
|
|
192
|
-
| Erros | <!-- RFC 7807 / custom envelope --> |
|
|
193
|
-
| Documentação | <!-- OpenAPI 3.1 / GraphQL Schema --> |
|
|
194
|
-
|
|
195
|
-
### 3.7 Monitoramento
|
|
196
|
-
|
|
197
|
-
| Aspecto | Ferramenta | Alvo |
|
|
198
|
-
|---------|-----------|------|
|
|
199
|
-
| Logs | <!-- Serilog/Pino + Datadog/ELK --> | |
|
|
200
|
-
| Métricas | <!-- Prometheus/Datadog --> | |
|
|
201
|
-
| Tracing | <!-- OpenTelemetry --> | |
|
|
202
|
-
| Alertas | | |
|
|
203
|
-
|
|
204
|
-
---
|
|
205
|
-
|
|
206
|
-
## 4. §Área-Backend
|
|
207
|
-
|
|
208
|
-
> **GATE**: Feature toca backend? `[SIM|NÃO]`
|
|
209
|
-
> Se NÃO → marcar toda a seção "N/A — feature não toca backend" e pular.
|
|
210
|
-
|
|
211
|
-
### 4.1 Endpoints
|
|
212
|
-
|
|
213
|
-
> Contratos completos. O Coder implementa exatamente estes schemas.
|
|
214
|
-
|
|
215
|
-
### `{{METHOD}} {{/api/v1/recurso}}` — {{Descrição}}
|
|
216
|
-
|
|
217
|
-
**Descrição**: <!-- o que faz -->
|
|
218
|
-
**Regras**: <!-- RN-001, RN-002 (do PRD §5) -->
|
|
219
|
-
**Autenticação**: <!-- público | Bearer token | API Key --> — se não público, justificar
|
|
220
|
-
**Autorização**: <!-- roles permitidos: admin, user, owner --> — OBRIGATÓRIO se autenticado
|
|
221
|
-
**Rate Limit**: <!-- N req/min ou N/A -->
|
|
222
|
-
|
|
223
|
-
**Request Body**:
|
|
224
|
-
```json
|
|
225
|
-
{
|
|
226
|
-
"campo": "tipo (required|optional, validações)"
|
|
227
|
-
}
|
|
228
|
-
```
|
|
229
|
-
|
|
230
|
-
**Response {{STATUS}}**:
|
|
231
|
-
```json
|
|
232
|
-
{
|
|
233
|
-
"campo": "tipo"
|
|
234
|
-
}
|
|
235
|
-
```
|
|
236
|
-
|
|
237
|
-
**Erros**:
|
|
238
|
-
|
|
239
|
-
| Status | Código | Quando |
|
|
240
|
-
|--------|--------|--------|
|
|
241
|
-
| 401 | `UNAUTHORIZED` | Token ausente ou inválido |
|
|
242
|
-
| 403 | `FORBIDDEN` | Sem permissão para este recurso |
|
|
243
|
-
| 400 | `VALIDATION_ERROR` | Campos inválidos |
|
|
244
|
-
|
|
245
|
-
<!-- Repetir bloco para cada endpoint -->
|
|
246
|
-
|
|
247
|
-
> **Regra**: todo endpoint DEVE ter Autenticação e Autorização explícitas.
|
|
248
|
-
> Se público, escrever "público" — nunca omitir.
|
|
249
|
-
|
|
250
|
-
### 4.2 Regras de Negócio e Validações
|
|
251
|
-
|
|
252
|
-
| ID | Regra | Onde aplica | Ref PRD |
|
|
253
|
-
|----|-------|-------------|---------|
|
|
254
|
-
| RN-001 | | back / front / banco | PRD §5 RN-001 |
|
|
255
|
-
|
|
256
|
-
**Validações de campo** (mensagens de erro obrigatórias):
|
|
257
|
-
|
|
258
|
-
| Campo | Validação | Obrigatório | Mensagem de erro |
|
|
259
|
-
|-------|-----------|-------------|------------------|
|
|
260
|
-
| | | | |
|
|
261
|
-
|
|
262
|
-
### 4.3 Integrações Externas
|
|
263
|
-
|
|
264
|
-
| Serviço | Protocolo | Quando | Timeout | Retry | Fallback |
|
|
265
|
-
|---------|-----------|--------|---------|-------|----------|
|
|
266
|
-
| | | | | | |
|
|
267
|
-
|
|
268
|
-
**Contrato por integração**:
|
|
269
|
-
|
|
270
|
-
#### `{{Nome do Serviço}}`
|
|
271
|
-
|
|
272
|
-
**Request**: `{{METHOD}} {{URL}}`
|
|
273
|
-
```json
|
|
274
|
-
{ }
|
|
275
|
-
```
|
|
276
|
-
|
|
277
|
-
**Response esperada**:
|
|
278
|
-
```json
|
|
279
|
-
{ }
|
|
280
|
-
```
|
|
281
|
-
|
|
282
|
-
**Tratamento de falha**: <!-- circuit breaker / retry exponencial / fallback -->
|
|
283
|
-
|
|
284
|
-
---
|
|
285
|
-
|
|
286
|
-
## 5. §Área-Frontend
|
|
287
|
-
|
|
288
|
-
> **GATE**: Feature toca frontend? `[SIM|NÃO]`
|
|
289
|
-
> Se NÃO → marcar "N/A — feature não toca frontend" e pular.
|
|
290
|
-
|
|
291
|
-
### 5.1 Telas e Componentes
|
|
292
|
-
|
|
293
|
-
#### Tela: {{Nome}}
|
|
294
|
-
|
|
295
|
-
| Propriedade | Valor |
|
|
296
|
-
|-------------|-------|
|
|
297
|
-
| Rota | `{{/rota}}` |
|
|
298
|
-
| Permissão | {{roles}} |
|
|
299
|
-
| Estado inicial | |
|
|
300
|
-
|
|
301
|
-
**Componentes**:
|
|
302
|
-
|
|
303
|
-
| Componente | Tipo | Comportamento |
|
|
304
|
-
|------------|------|---------------|
|
|
305
|
-
| | | |
|
|
306
|
-
|
|
307
|
-
**Estados**:
|
|
308
|
-
|
|
309
|
-
| Estado | Gatilho | Efeito visual |
|
|
310
|
-
|--------|---------|---------------|
|
|
311
|
-
| loading | requisição em andamento | skeleton/spinner |
|
|
312
|
-
| empty | lista vazia | mensagem |
|
|
313
|
-
| error | falha na API | toast + retry |
|
|
314
|
-
|
|
315
|
-
<!-- Repetir bloco para cada tela -->
|
|
316
|
-
|
|
317
|
-
### 5.2 Fluxos de Usuário
|
|
318
|
-
|
|
319
|
-
> Referência às jornadas do PRD — aqui traduzidas em passos técnicos front-back.
|
|
320
|
-
|
|
321
|
-
#### Fluxo: {{Nome}} (ref PRD §4 Jornada X)
|
|
322
|
-
|
|
323
|
-
```
|
|
324
|
-
Usuário {{ação}} → [front] {{passo}} → [back] {{passo}}
|
|
325
|
-
→ [back] retorna {{response}}
|
|
326
|
-
→ [front] {{feedback}}
|
|
327
|
-
```
|
|
328
|
-
|
|
329
|
-
### 5.3 Estados globais
|
|
330
|
-
|
|
331
|
-
<!-- Context/Store/Redux — o que vive fora do componente -->
|
|
332
|
-
|
|
333
|
-
---
|
|
334
|
-
|
|
335
|
-
## 6. §Área-DB
|
|
336
|
-
|
|
337
|
-
> **GATE**: Feature toca banco? `[SIM|NÃO]`
|
|
338
|
-
> Se NÃO → marcar "N/A — feature não toca banco" e pular.
|
|
339
|
-
|
|
340
|
-
### 6.1 Entidades
|
|
341
|
-
|
|
342
|
-
#### `{{nome_tabela}}`
|
|
343
|
-
|
|
344
|
-
| Campo | Tipo | Null? | Default | Constraint | Descrição |
|
|
345
|
-
|-------|------|-------|---------|------------|-----------|
|
|
346
|
-
| `id` | `UUID` | NOT NULL | `gen_random_uuid()` | PK | |
|
|
347
|
-
| `created_at` | `TIMESTAMPTZ` | NOT NULL | `NOW()` | | |
|
|
348
|
-
|
|
349
|
-
**Relações**:
|
|
350
|
-
- `tabela.campo` → `outra_tabela.campo` (FK, ON DELETE CASCADE)
|
|
351
|
-
|
|
352
|
-
**Índices**:
|
|
353
|
-
- `idx_tabela_campo` — tipo (btree/gin/gist) — justificativa
|
|
354
|
-
|
|
355
|
-
### 6.2 Migrations
|
|
356
|
-
|
|
357
|
-
| Ordem | Descrição | Dependência | Reversível? |
|
|
358
|
-
|-------|-----------|-------------|-------------|
|
|
359
|
-
| 1 | | nenhuma | sim |
|
|
360
|
-
|
|
361
|
-
### 6.3 Políticas de Dados
|
|
362
|
-
|
|
363
|
-
| Aspecto | Decisão |
|
|
364
|
-
|---------|---------|
|
|
365
|
-
| Retenção | <!-- dados ficam indefinidamente / TTL N dias --> |
|
|
366
|
-
| Backup | |
|
|
367
|
-
| Seed inicial | |
|
|
368
|
-
|
|
369
|
-
---
|
|
370
|
-
|
|
371
|
-
## 7. §Área-Infra
|
|
372
|
-
|
|
373
|
-
> **GATE**: Feature toca infra (docker, CI, deploy, env)? `[SIM|NÃO]`
|
|
374
|
-
> Se NÃO → marcar "N/A — feature não toca infra" e pular.
|
|
375
|
-
|
|
376
|
-
### 7.1 Mudanças em orquestração
|
|
377
|
-
|
|
378
|
-
**docker-compose.yml** (dev):
|
|
379
|
-
<!-- Novos serviços de infra apenas (apps rodam direto, ver §3.4) -->
|
|
380
|
-
|
|
381
|
-
**CI/CD**:
|
|
382
|
-
<!-- Novos steps, jobs, ou workflows -->
|
|
383
|
-
|
|
384
|
-
**Deploy**:
|
|
385
|
-
<!-- Mudanças no processo de deploy -->
|
|
386
|
-
|
|
387
|
-
### 7.2 Novas dependências
|
|
388
|
-
|
|
389
|
-
| Tipo | Nome | Versão | Justificativa |
|
|
390
|
-
|------|------|--------|---------------|
|
|
391
|
-
| pacote npm | | | |
|
|
392
|
-
| pacote NuGet | | | |
|
|
393
|
-
|
|
394
|
-
### 7.3 Novas variáveis de ambiente
|
|
395
|
-
|
|
396
|
-
| Var | Dev | Staging | Prod | Descrição | Sensível? |
|
|
397
|
-
|-----|-----|---------|------|-----------|-----------|
|
|
398
|
-
| | | | | | |
|
|
399
|
-
|
|
400
|
-
---
|
|
401
|
-
|
|
402
|
-
## 8. Fluxos de Dados (cross-area)
|
|
403
|
-
|
|
404
|
-
> Sequências que atravessam múltiplas áreas. O Coder segue como guia integrativo.
|
|
405
|
-
|
|
406
|
-
### Fluxo: {{Nome}} (principal)
|
|
407
|
-
|
|
408
|
-
```
|
|
409
|
-
Usuário {{ação}}
|
|
410
|
-
→ [front] {{componente}} dispara {{chamada}}
|
|
411
|
-
→ [back] {{endpoint}} valida + executa {{regra}}
|
|
412
|
-
→ [db] {{query/insert}}
|
|
413
|
-
→ [back] retorna {{response}}
|
|
414
|
-
→ [front] atualiza {{estado}}
|
|
415
|
-
```
|
|
416
|
-
|
|
417
|
-
### Fluxo: {{Nome}} (erro)
|
|
418
|
-
|
|
419
|
-
```
|
|
420
|
-
{{sequência do fallback}}
|
|
421
|
-
```
|
|
422
|
-
|
|
423
|
-
---
|
|
424
|
-
|
|
425
|
-
## 9. Estratégia de Testes
|
|
426
|
-
|
|
427
|
-
> O Coder implementa testes junto com o código — não é etapa separada.
|
|
428
|
-
|
|
429
|
-
### 9.1 Testes por área (apenas áreas tocadas)
|
|
430
|
-
|
|
431
|
-
| Área | Tipo | Framework | Comando | O que cobre |
|
|
432
|
-
|------|------|-----------|---------|-------------|
|
|
433
|
-
| BACK | Unit | | | Services, validações RN-*, regras de negócio |
|
|
434
|
-
| BACK | Integration | | | Endpoints completos (request → response) |
|
|
435
|
-
| FRONT | Unit | | | Componentes com lógica, hooks customizados |
|
|
436
|
-
| FRONT | E2E | | | Jornadas do §5.2 / fluxos do §8 |
|
|
437
|
-
| DB | Migration | | | Migration roda + rollback sem erro |
|
|
438
|
-
|
|
439
|
-
### 9.2 Estrutura de testes
|
|
440
|
-
|
|
441
|
-
```
|
|
442
|
-
<!-- Adaptar à stack. Exemplo: -->
|
|
443
|
-
backend/
|
|
444
|
-
├── tests/
|
|
445
|
-
│ ├── Unit/ ← services, validações
|
|
446
|
-
│ ├── Integration/ ← endpoints (in-memory ou testcontainers)
|
|
447
|
-
│ └── Fixtures/ ← dados de teste
|
|
448
|
-
frontend/
|
|
449
|
-
└── tests/
|
|
450
|
-
├── components/ ← unit (testing library)
|
|
451
|
-
└── e2e/ ← playwright (jornadas completas)
|
|
452
|
-
```
|
|
453
|
-
|
|
454
|
-
### 9.3 Critérios de Aceite
|
|
455
|
-
|
|
456
|
-
> Given/When/Then testável. Cada CA mapeia pelo menos 1 teste automatizado.
|
|
457
|
-
|
|
458
|
-
#### CA-001: {{Título}}
|
|
459
|
-
|
|
460
|
-
```gherkin
|
|
461
|
-
Given {{pré-condição}}
|
|
462
|
-
When {{ação do usuário}}
|
|
463
|
-
Then {{resultado esperado}}
|
|
464
|
-
```
|
|
465
|
-
|
|
466
|
-
| CA | Tipo de teste | Arquivo |
|
|
467
|
-
|----|---------------|---------|
|
|
468
|
-
| CA-001 | integration | `tests/Integration/{{Teste}}.cs` |
|
|
469
|
-
| CA-002 | e2e | `tests/e2e/{{teste}}.spec.ts` |
|
|
470
|
-
|
|
471
|
-
### 9.4 Métricas
|
|
472
|
-
|
|
473
|
-
| Métrica | Threshold | Como medir |
|
|
474
|
-
|---------|-----------|------------|
|
|
475
|
-
| Cobertura (linhas) | >= 70% | coverlet / vitest |
|
|
476
|
-
| Cobertura (branches) | >= 60% | |
|
|
477
|
-
| Tempo suite unit | < 30s | |
|
|
478
|
-
|
|
479
|
-
---
|
|
480
|
-
|
|
481
|
-
## 10. Fora de Escopo
|
|
482
|
-
|
|
483
|
-
> Lista explícita — evita scope creep durante implementação.
|
|
484
|
-
|
|
485
|
-
| # | Item | Motivo | Quando entra |
|
|
486
|
-
|---|------|--------|--------------|
|
|
487
|
-
| 1 | | | |
|
|
488
|
-
|
|
489
|
-
---
|
|
490
|
-
|
|
491
|
-
## 11. Delta Specs
|
|
492
|
-
|
|
493
|
-
> **ÚNICA seção lida pelo `/sf-merge-docs`.** Mantém `docs/` sincronizado com estado do sistema.
|
|
494
|
-
> Formato inspirado no OpenSpec: ADDED/MODIFIED/REMOVED.
|
|
495
|
-
> Sempre referenciar arquivo-alvo em `docs/`.
|
|
496
|
-
> Obrigatório mesmo vazio (marcar "nenhuma mudança").
|
|
497
|
-
|
|
498
|
-
### ADDED
|
|
499
|
-
<!-- Novos: endpoints, tabelas, componentes, regras, permissões, env vars, ADRs -->
|
|
500
|
-
- `docs/apiContracts.md §Catálogo` — novo endpoint `POST /api/v1/users`
|
|
501
|
-
- `docs/domain.md §Entidades` — nova tabela `users`
|
|
502
|
-
- `docs/decisions.md` — ADR-NNN: escolha de JWT vs session
|
|
503
|
-
|
|
504
|
-
### MODIFIED
|
|
505
|
-
<!-- Alterações em funcionalidades/docs existentes -->
|
|
506
|
-
- `docs/conventions.md §Autenticação` — expansão do fluxo JWT com refresh token
|
|
507
|
-
|
|
508
|
-
### REMOVED
|
|
509
|
-
<!-- Funcionalidades ou comportamentos que deixam de existir -->
|
|
510
|
-
-
|
|
511
|
-
|
|
512
|
-
---
|
|
513
|
-
|
|
514
|
-
## 12. Ambiguidades Pendentes
|
|
515
|
-
|
|
516
|
-
> ⚠️ **BLOQUEANTE** — `/sf-plan` não conclui com ambiguidades abertas.
|
|
517
|
-
> Architect consultou `docs/` antes de listar — itens aqui são genuínos.
|
|
518
|
-
> IDs começam em `AMB-NNN`, continuando a sequência iniciada no PRD §14 (se houver).
|
|
519
|
-
|
|
520
|
-
| ID | Pergunta | Contexto | Consultei `docs/`? | Resposta |
|
|
521
|
-
|----|----------|----------|--------------------|-----------|
|
|
522
|
-
| AMB-001 | | | sim / não / docs ausente | (aguardando) |
|
|
523
|
-
|
|
524
|
-
---
|
|
525
|
-
|
|
526
|
-
## Rastreabilidade
|
|
527
|
-
|
|
528
|
-
> Mapa cruzado PRD/sf-extract → SDD. Garante que nenhum requisito foi perdido.
|
|
529
|
-
|
|
530
|
-
### PRD → SDD
|
|
531
|
-
|
|
532
|
-
| PRD Seção | SDD Seção |
|
|
533
|
-
|-----------|-----------|
|
|
534
|
-
| §1 Visão | §1 Visão Geral |
|
|
535
|
-
| §2 Jornadas | §5.2 Fluxos de Usuário |
|
|
536
|
-
| §3 Entidades | §6.1 Entidades |
|
|
537
|
-
| §4 Regras (RN-*) | §4.2 Regras + §5.1 (validação UI) |
|
|
538
|
-
| §5 Validações | §4.2 Validações |
|
|
539
|
-
| §6 Telas | §5.1 Telas e Componentes |
|
|
540
|
-
| §7 Integrações | §4.3 Integrações Externas |
|
|
541
|
-
| §8 Erros | §4.1 Endpoints (Erros) |
|
|
542
|
-
| §9 Não-Funcionais | §9.4 Métricas |
|
|
543
|
-
| §10 Fora de Escopo | §10 Fora de Escopo |
|
|
544
|
-
|
|
545
|
-
### Chunks tech → SDD (PRD empty ou complementar)
|
|
546
|
-
|
|
547
|
-
| Chunk em `.extract-log.md` | SDD Seção |
|
|
548
|
-
|----------------------------|-----------|
|
|
549
|
-
| tech: stack | §3.1 Stack |
|
|
550
|
-
| tech: arquitetura | §3.2 Arquitetura |
|
|
551
|
-
| tech: schema SQL | §6.1 Entidades |
|
|
552
|
-
| tech: segurança | §3.5 Segurança |
|
|
553
|
-
| tech: infra | §3.4 Infra |
|
|
554
|
-
|
|
555
|
-
---
|
|
556
|
-
|
|
557
|
-
> **Regra**: este SDD é a fonte de verdade do scope `{{NOME}}`.
|
|
558
|
-
> Coder não consulta PRD, extract-log, PM, ou outro doc — lê SDD + `specs/{{NOME}}/` + task.
|
|
559
|
-
> Alterações pós-aprovação: editar SDD, re-rodar `/sf-design` se grande, ou atualizar §11 delta + `/sf-merge-docs` se cross-feature.
|