spec-first-copilot 0.7.0 → 0.8.0-beta.2
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 +45 -0
- package/bin/cli.js +1 -1
- package/package.json +1 -1
- package/templates/.github/CHANGELOG.md +61 -0
- package/templates/.github/copilot-instructions.md +4 -2
- package/templates/.github/skills/sf-design/SKILL.md +161 -161
- package/templates/.github/skills/sf-dev/SKILL.md +204 -204
- package/templates/.github/skills/sf-discovery/SKILL.md +415 -415
- package/templates/.github/skills/sf-extract/SKILL.md +225 -225
- package/templates/.github/skills/sf-load/SKILL.md +296 -296
- package/templates/.github/skills/sf-mcp/SKILL.md +386 -386
- package/templates/.github/skills/sf-merge-docs/SKILL.md +152 -152
- package/templates/.github/skills/sf-onboard/SKILL.md +437 -0
- package/templates/.github/skills/sf-plan/SKILL.md +152 -152
- package/templates/.github/skills/sf-publish/SKILL.md +144 -144
- package/templates/.github/skills/sf-session-finish/SKILL.md +93 -93
- package/templates/.github/skills/sf-start/SKILL.md +192 -192
- package/templates/.github/templates/estrutura/decisions.template.md +140 -107
- package/templates/.github/templates/feature/TRD.template.md +450 -358
- package/templates/.github/templates/feature/context.template.md +118 -89
|
@@ -1,358 +1,450 @@
|
|
|
1
|
-
# TRD — {{NOME}}
|
|
2
|
-
## Technical Requirements Document
|
|
3
|
-
|
|
4
|
-
> **Artefato gerado pela IA** a partir do processamento de insumos técnicos em `workspace/Input/{{NOME}}/`.
|
|
5
|
-
> Este é um dos dois docs source do pipeline SFW (peer do PRD).
|
|
6
|
-
> O TRD é aprovado pelo **dev / tech lead** — contém todas as decisões técnicas da feature.
|
|
7
|
-
> Depois de aprovado, alimenta `/sf-merge-docs` (docs/ cross-feature) e `/sf-design` (specs/).
|
|
8
|
-
|
|
9
|
-
---
|
|
10
|
-
|
|
11
|
-
## Meta
|
|
12
|
-
|
|
13
|
-
| Campo | Valor |
|
|
14
|
-
|-------|-------|
|
|
15
|
-
| Scope | `{{NOME}}` |
|
|
16
|
-
| Status | `em extração` → `aguardando aprovação (dev)` → `aprovado` |
|
|
17
|
-
| Insumos processados | {{LISTA_INSUMOS}} |
|
|
18
|
-
| Gerado em | |
|
|
19
|
-
| Aprovado em | |
|
|
20
|
-
| Aprovado por | {{nome do dev}} |
|
|
21
|
-
|
|
22
|
-
---
|
|
23
|
-
|
|
24
|
-
<!--
|
|
25
|
-
=============================================================================
|
|
26
|
-
INSTRUÇÕES PARA O AGENTE (não incluir no arquivo gerado)
|
|
27
|
-
=============================================================================
|
|
28
|
-
|
|
29
|
-
QUANDO USAR: Gerado pelo /sf-extract (chamado via /sf-start).
|
|
30
|
-
QUEM GERA: Agent Tech-Analyzer (Opus) a partir dos outputs dos Readers (Sonnet).
|
|
31
|
-
|
|
32
|
-
PAR COM PRD: o TRD é peer do PRD. Ambos podem coexistir (caso mais comum),
|
|
33
|
-
ou o scope pode ter só um dos dois:
|
|
34
|
-
- Scope puro-produto (raro): só PRD, sem TRD
|
|
35
|
-
- Scope puro-técnico (bootstrap de infra, mudança de stack): só TRD, sem PRD
|
|
36
|
-
- Scope misto (maioria): ambos
|
|
37
|
-
|
|
38
|
-
REGRA DE OURO: o Analyzer decide qual(is) gerar baseado nos insumos. Não existe
|
|
39
|
-
"TRD empty" — se insumos não trazem conteúdo técnico, simplesmente não gera TRD.
|
|
40
|
-
Filtragem é responsabilidade do Analyzer + rastreada em §11 Rastreabilidade.
|
|
41
|
-
|
|
42
|
-
ZERO OVERLAP COM PRD:
|
|
43
|
-
- Jornadas de usuário, atores, RNs de negócio, UI → PRD
|
|
44
|
-
- Stack, schema, endpoints, validações de schema, deploy, ADRs → TRD
|
|
45
|
-
- Integrações externas: PRD descreve POR QUÊ; TRD descreve COMO
|
|
46
|
-
- Validações: PRD descreve regras de domínio; TRD descreve validações de formato
|
|
47
|
-
|
|
48
|
-
COMO GERAR:
|
|
49
|
-
1. Readers (Sonnet) leem cada arquivo do Input/ individualmente e catalogam por seção
|
|
50
|
-
2. Tech-Analyzer (Opus) recebe outputs e:
|
|
51
|
-
a. Consolida conteúdo técnico em visão unificada
|
|
52
|
-
b. Organiza por área (§Sistema + §Backend + §Frontend + §DB + §Infra)
|
|
53
|
-
c. Cruza com `docs/` (se existir) pra evitar decisões contraditórias
|
|
54
|
-
d. Identifica ambiguidades técnicas (ex: "qual DB?", "sync ou async?")
|
|
55
|
-
3. Consultar `docs/` ANTES de marcar ambiguidade — se `docs/architecture.md` já
|
|
56
|
-
define stack, não perguntar de novo. Marcar "resolvido em docs/X §Y"
|
|
57
|
-
4. Registrar DE QUAL insumo veio cada informação (rastreabilidade §11)
|
|
58
|
-
|
|
59
|
-
GATES POR ÁREA:
|
|
60
|
-
Cada seção §Área tem GATE: SIM/NÃO.
|
|
61
|
-
- GATE=SIM: feature toca essa área → preencher completo
|
|
62
|
-
- GATE=NÃO: feature não toca → escrever "N/A — feature não toca esta área" e pular
|
|
63
|
-
Em first-run (bootstrap), §Sistema é SEMPRE GATE=SIM (baseline completo).
|
|
64
|
-
|
|
65
|
-
ARQUIVOS DE INFRA:
|
|
66
|
-
TRD §Infra inclui docker-compose, Dockerfile, CI/CD scripts, env vars esperadas.
|
|
67
|
-
Mas não inclui arquivo de infra em si — só a DECISÃO. Arquivos reais viram tasks
|
|
68
|
-
no /sf-plan.
|
|
69
|
-
|
|
70
|
-
RELAÇÃO COM ADRs:
|
|
71
|
-
§9 Decisões Técnicas tem ADR-NNN com justificativa e alternativas. Esses ADRs
|
|
72
|
-
são sincronizados em docs/decisions.md via /sf-merge-docs após aprovação.
|
|
73
|
-
|
|
74
|
-
RE-GERAÇÃO:
|
|
75
|
-
- Merge ADITIVO com TRD existente (novos insumos não apagam decisões já aprovadas)
|
|
76
|
-
- Seções modificadas marcadas com <!-- ATUALIZADO: re-extração ISO_DATE -->
|
|
77
|
-
- IDs de ADR continuam sequência existente
|
|
78
|
-
- Se user quiser recomeçar do zero: deletar TRD.md + .extract-log.md manualmente
|
|
79
|
-
|
|
80
|
-
=============================================================================
|
|
81
|
-
-->
|
|
82
|
-
|
|
83
|
-
## 1. §Sistema
|
|
84
|
-
|
|
85
|
-
> **GATE**: SIM / NÃO
|
|
86
|
-
> Baseline técnico da feature. Em first-run, preenche-se completo (é a base
|
|
87
|
-
> de todo o projeto). Em features subsequentes, preenche APENAS o que MUDA.
|
|
88
|
-
|
|
89
|
-
### 1.1 Stack
|
|
90
|
-
|
|
91
|
-
| Camada | Tecnologia | Versão | Justificativa breve |
|
|
92
|
-
|--------|-----------|--------|---------------------|
|
|
93
|
-
| | | | |
|
|
94
|
-
|
|
95
|
-
### 1.2 Arquitetura (C4 Nível 2)
|
|
96
|
-
|
|
97
|
-
```
|
|
98
|
-
<!-- Representação textual dos containers e suas conexões -->
|
|
99
|
-
<!-- Formato: [Container] --protocolo--> [Container] -->
|
|
100
|
-
```
|
|
101
|
-
|
|
102
|
-
| Container | Tecnologia | Responsabilidade | Porta | Comunicação |
|
|
103
|
-
|-----------|-----------|-----------------|-------|-------------|
|
|
104
|
-
| | | | | |
|
|
105
|
-
|
|
106
|
-
### 1.3 Ambientes
|
|
107
|
-
|
|
108
|
-
| Ambiente | URL | Banco | Branch |
|
|
109
|
-
|----------|-----|-------|--------|
|
|
110
|
-
| Local | | | qualquer |
|
|
111
|
-
| Staging | | | develop |
|
|
112
|
-
| Produção | | | main |
|
|
113
|
-
|
|
114
|
-
### 1.4 Deploy baseline
|
|
115
|
-
|
|
116
|
-
| Aspecto | Decisão |
|
|
117
|
-
|---------|---------|
|
|
118
|
-
| Plataforma | |
|
|
119
|
-
| Estratégia | rolling / blue-green / canary |
|
|
120
|
-
| Build | |
|
|
121
|
-
|
|
122
|
-
### 1.5 Segurança baseline
|
|
123
|
-
|
|
124
|
-
- Autenticação: <!-- JWT/OAuth2/Session --> (detalhes em §7)
|
|
125
|
-
- CORS: <!-- config geral -->
|
|
126
|
-
- TLS: <!-- versão mínima -->
|
|
127
|
-
- Secrets: <!-- onde e como -->
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
>
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
|
170
|
-
|
|
171
|
-
|
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
|
182
|
-
|
|
183
|
-
|
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
|
236
|
-
|
|
237
|
-
|
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
|
274
|
-
|
|
275
|
-
|
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
-
|
|
320
|
-
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
1
|
+
# TRD — {{NOME}}
|
|
2
|
+
## Technical Requirements Document
|
|
3
|
+
|
|
4
|
+
> **Artefato gerado pela IA** a partir do processamento de insumos técnicos em `workspace/Input/{{NOME}}/`.
|
|
5
|
+
> Este é um dos dois docs source do pipeline SFW (peer do PRD).
|
|
6
|
+
> O TRD é aprovado pelo **dev / tech lead** — contém todas as decisões técnicas da feature.
|
|
7
|
+
> Depois de aprovado, alimenta `/sf-merge-docs` (docs/ cross-feature) e `/sf-design` (specs/).
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## Meta
|
|
12
|
+
|
|
13
|
+
| Campo | Valor |
|
|
14
|
+
|-------|-------|
|
|
15
|
+
| Scope | `{{NOME}}` |
|
|
16
|
+
| Status | `em extração` → `aguardando aprovação (dev)` → `aprovado` |
|
|
17
|
+
| Insumos processados | {{LISTA_INSUMOS}} |
|
|
18
|
+
| Gerado em | |
|
|
19
|
+
| Aprovado em | |
|
|
20
|
+
| Aprovado por | {{nome do dev}} |
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
<!--
|
|
25
|
+
=============================================================================
|
|
26
|
+
INSTRUÇÕES PARA O AGENTE (não incluir no arquivo gerado)
|
|
27
|
+
=============================================================================
|
|
28
|
+
|
|
29
|
+
QUANDO USAR: Gerado pelo /sf-extract (chamado via /sf-start).
|
|
30
|
+
QUEM GERA: Agent Tech-Analyzer (Opus) a partir dos outputs dos Readers (Sonnet).
|
|
31
|
+
|
|
32
|
+
PAR COM PRD: o TRD é peer do PRD. Ambos podem coexistir (caso mais comum),
|
|
33
|
+
ou o scope pode ter só um dos dois:
|
|
34
|
+
- Scope puro-produto (raro): só PRD, sem TRD
|
|
35
|
+
- Scope puro-técnico (bootstrap de infra, mudança de stack): só TRD, sem PRD
|
|
36
|
+
- Scope misto (maioria): ambos
|
|
37
|
+
|
|
38
|
+
REGRA DE OURO: o Analyzer decide qual(is) gerar baseado nos insumos. Não existe
|
|
39
|
+
"TRD empty" — se insumos não trazem conteúdo técnico, simplesmente não gera TRD.
|
|
40
|
+
Filtragem é responsabilidade do Analyzer + rastreada em §11 Rastreabilidade.
|
|
41
|
+
|
|
42
|
+
ZERO OVERLAP COM PRD:
|
|
43
|
+
- Jornadas de usuário, atores, RNs de negócio, UI → PRD
|
|
44
|
+
- Stack, schema, endpoints, validações de schema, deploy, ADRs → TRD
|
|
45
|
+
- Integrações externas: PRD descreve POR QUÊ; TRD descreve COMO
|
|
46
|
+
- Validações: PRD descreve regras de domínio; TRD descreve validações de formato
|
|
47
|
+
|
|
48
|
+
COMO GERAR:
|
|
49
|
+
1. Readers (Sonnet) leem cada arquivo do Input/ individualmente e catalogam por seção
|
|
50
|
+
2. Tech-Analyzer (Opus) recebe outputs e:
|
|
51
|
+
a. Consolida conteúdo técnico em visão unificada
|
|
52
|
+
b. Organiza por área (§Sistema + §Backend + §Frontend + §DB + §Infra)
|
|
53
|
+
c. Cruza com `docs/` (se existir) pra evitar decisões contraditórias
|
|
54
|
+
d. Identifica ambiguidades técnicas (ex: "qual DB?", "sync ou async?")
|
|
55
|
+
3. Consultar `docs/` ANTES de marcar ambiguidade — se `docs/architecture.md` já
|
|
56
|
+
define stack, não perguntar de novo. Marcar "resolvido em docs/X §Y"
|
|
57
|
+
4. Registrar DE QUAL insumo veio cada informação (rastreabilidade §11)
|
|
58
|
+
|
|
59
|
+
GATES POR ÁREA:
|
|
60
|
+
Cada seção §Área tem GATE: SIM/NÃO.
|
|
61
|
+
- GATE=SIM: feature toca essa área → preencher completo
|
|
62
|
+
- GATE=NÃO: feature não toca → escrever "N/A — feature não toca esta área" e pular
|
|
63
|
+
Em first-run (bootstrap), §Sistema é SEMPRE GATE=SIM (baseline completo).
|
|
64
|
+
|
|
65
|
+
ARQUIVOS DE INFRA:
|
|
66
|
+
TRD §Infra inclui docker-compose, Dockerfile, CI/CD scripts, env vars esperadas.
|
|
67
|
+
Mas não inclui arquivo de infra em si — só a DECISÃO. Arquivos reais viram tasks
|
|
68
|
+
no /sf-plan.
|
|
69
|
+
|
|
70
|
+
RELAÇÃO COM ADRs:
|
|
71
|
+
§9 Decisões Técnicas tem ADR-NNN com justificativa e alternativas. Esses ADRs
|
|
72
|
+
são sincronizados em docs/decisions.md via /sf-merge-docs após aprovação.
|
|
73
|
+
|
|
74
|
+
RE-GERAÇÃO:
|
|
75
|
+
- Merge ADITIVO com TRD existente (novos insumos não apagam decisões já aprovadas)
|
|
76
|
+
- Seções modificadas marcadas com <!-- ATUALIZADO: re-extração ISO_DATE -->
|
|
77
|
+
- IDs de ADR continuam sequência existente
|
|
78
|
+
- Se user quiser recomeçar do zero: deletar TRD.md + .extract-log.md manualmente
|
|
79
|
+
|
|
80
|
+
=============================================================================
|
|
81
|
+
-->
|
|
82
|
+
|
|
83
|
+
## 1. §Sistema
|
|
84
|
+
|
|
85
|
+
> **GATE**: SIM / NÃO
|
|
86
|
+
> Baseline técnico da feature. Em first-run, preenche-se completo (é a base
|
|
87
|
+
> de todo o projeto). Em features subsequentes, preenche APENAS o que MUDA.
|
|
88
|
+
|
|
89
|
+
### 1.1 Stack
|
|
90
|
+
|
|
91
|
+
| Camada | Tecnologia | Versão | Justificativa breve |
|
|
92
|
+
|--------|-----------|--------|---------------------|
|
|
93
|
+
| | | | |
|
|
94
|
+
|
|
95
|
+
### 1.2 Arquitetura (C4 Nível 2)
|
|
96
|
+
|
|
97
|
+
```
|
|
98
|
+
<!-- Representação textual dos containers e suas conexões -->
|
|
99
|
+
<!-- Formato: [Container] --protocolo--> [Container] -->
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
| Container | Tecnologia | Responsabilidade | Porta | Comunicação |
|
|
103
|
+
|-----------|-----------|-----------------|-------|-------------|
|
|
104
|
+
| | | | | |
|
|
105
|
+
|
|
106
|
+
### 1.3 Ambientes
|
|
107
|
+
|
|
108
|
+
| Ambiente | URL | Banco | Branch |
|
|
109
|
+
|----------|-----|-------|--------|
|
|
110
|
+
| Local | | | qualquer |
|
|
111
|
+
| Staging | | | develop |
|
|
112
|
+
| Produção | | | main |
|
|
113
|
+
|
|
114
|
+
### 1.4 Deploy baseline
|
|
115
|
+
|
|
116
|
+
| Aspecto | Decisão |
|
|
117
|
+
|---------|---------|
|
|
118
|
+
| Plataforma | |
|
|
119
|
+
| Estratégia | rolling / blue-green / canary |
|
|
120
|
+
| Build | |
|
|
121
|
+
|
|
122
|
+
### 1.5 Segurança baseline
|
|
123
|
+
|
|
124
|
+
- Autenticação: <!-- JWT/OAuth2/Session --> (detalhes em §7)
|
|
125
|
+
- CORS: <!-- config geral -->
|
|
126
|
+
- TLS: <!-- versão mínima -->
|
|
127
|
+
- Secrets: <!-- onde e como -->
|
|
128
|
+
|
|
129
|
+
### 1.6 Padrões Observados
|
|
130
|
+
|
|
131
|
+
> **Obrigatório quando `tipo: onboard` em `.context.md`**. Em scopes normais é opcional
|
|
132
|
+
> — preenchido apenas se o time já tem convenções tribais não documentadas em `docs/conventions.md`.
|
|
133
|
+
> Coders de features futuras consultam ESTA seção antes de implementar — devem
|
|
134
|
+
> SEGUIR os padrões existentes, não propor mudanças.
|
|
135
|
+
>
|
|
136
|
+
> **Snippets reais do código** (não pseudo-código). Cite arquivo+linha quando aplicável.
|
|
137
|
+
> Quando padrões divergem internamente, documente o **mais frequente** como padrão
|
|
138
|
+
> e cite divergências sem julgar (ex: "3 controllers seguem X, 1 segue Y").
|
|
139
|
+
|
|
140
|
+
#### 1.6.1 Estrutura de pastas
|
|
141
|
+
|
|
142
|
+
```
|
|
143
|
+
<!-- snippet real do tree -->
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
| Camada | Onde mora | Convenção de nome |
|
|
147
|
+
|--------|-----------|-------------------|
|
|
148
|
+
| | | |
|
|
149
|
+
|
|
150
|
+
#### 1.6.2 Naming
|
|
151
|
+
|
|
152
|
+
| Tipo | Padrão observado | Exemplo do código |
|
|
153
|
+
|------|------------------|-------------------|
|
|
154
|
+
| Classe / módulo | | |
|
|
155
|
+
| Função / método | | |
|
|
156
|
+
| Arquivo | | |
|
|
157
|
+
| Variável | | |
|
|
158
|
+
| Constante | | |
|
|
159
|
+
|
|
160
|
+
#### 1.6.3 Error handling
|
|
161
|
+
|
|
162
|
+
```
|
|
163
|
+
<!-- snippet real mostrando como erros são tratados (try/catch, Result, exceptions, errors) -->
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
| Aspecto | Padrão | Onde ver |
|
|
167
|
+
|---------|--------|----------|
|
|
168
|
+
| Captura | | |
|
|
169
|
+
| Propagação | | |
|
|
170
|
+
| Resposta HTTP de erro | | |
|
|
171
|
+
| Logging do erro | | |
|
|
172
|
+
|
|
173
|
+
#### 1.6.4 Validação
|
|
174
|
+
|
|
175
|
+
```
|
|
176
|
+
<!-- snippet real de validação de input -->
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
| Camada | Como valida | Lib/framework |
|
|
180
|
+
|--------|-------------|---------------|
|
|
181
|
+
| HTTP | | |
|
|
182
|
+
| Domain | | |
|
|
183
|
+
| DB | | |
|
|
184
|
+
|
|
185
|
+
#### 1.6.5 Testes
|
|
186
|
+
|
|
187
|
+
```
|
|
188
|
+
<!-- snippet real de teste (nomenclatura, estrutura AAA/given-when-then) -->
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
| Aspecto | Padrão observado |
|
|
192
|
+
|---------|------------------|
|
|
193
|
+
| Framework | |
|
|
194
|
+
| Localização dos testes | |
|
|
195
|
+
| Naming dos arquivos de teste | |
|
|
196
|
+
| Naming dos métodos de teste | |
|
|
197
|
+
| Mock / stub | |
|
|
198
|
+
| Coverage observada | |
|
|
199
|
+
|
|
200
|
+
#### 1.6.6 Logging
|
|
201
|
+
|
|
202
|
+
```
|
|
203
|
+
<!-- snippet real de log estruturado -->
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
| Aspecto | Padrão |
|
|
207
|
+
|---------|--------|
|
|
208
|
+
| Lib | |
|
|
209
|
+
| Níveis usados | |
|
|
210
|
+
| Formato (json/text) | |
|
|
211
|
+
| Campos padrão | |
|
|
212
|
+
|
|
213
|
+
#### 1.6.7 Divergências internas observadas
|
|
214
|
+
|
|
215
|
+
> Quando o código tem mais de um padrão pra mesma coisa. Sem julgar — apenas documentar.
|
|
216
|
+
|
|
217
|
+
| Tema | Padrão dominante | Divergência | Onde ver |
|
|
218
|
+
|------|------------------|-------------|----------|
|
|
219
|
+
| | | | |
|
|
220
|
+
|
|
221
|
+
---
|
|
222
|
+
|
|
223
|
+
## 2. §Área-Backend
|
|
224
|
+
|
|
225
|
+
> **GATE**: SIM / NÃO
|
|
226
|
+
|
|
227
|
+
### 2.1 Endpoints
|
|
228
|
+
|
|
229
|
+
| Método | Rota | Auth | Responsabilidade |
|
|
230
|
+
|--------|------|------|------------------|
|
|
231
|
+
| | | | |
|
|
232
|
+
|
|
233
|
+
### 2.2 Services / Camadas
|
|
234
|
+
|
|
235
|
+
| Service | Responsabilidade | Depende de |
|
|
236
|
+
|---------|------------------|------------|
|
|
237
|
+
| | | |
|
|
238
|
+
|
|
239
|
+
### 2.3 Validações de entrada (schema)
|
|
240
|
+
|
|
241
|
+
> Formato/tipo/obrigatoriedade de campos — antes da lógica de negócio.
|
|
242
|
+
|
|
243
|
+
| Endpoint | Campo | Tipo | Obrigatório | Restrição | Erro |
|
|
244
|
+
|----------|-------|------|-------------|-----------|------|
|
|
245
|
+
| | | | | | |
|
|
246
|
+
|
|
247
|
+
### 2.4 Libs e dependências principais
|
|
248
|
+
|
|
249
|
+
| Pacote | Versão | Para quê |
|
|
250
|
+
|--------|--------|----------|
|
|
251
|
+
| | | |
|
|
252
|
+
|
|
253
|
+
---
|
|
254
|
+
|
|
255
|
+
## 3. §Área-Frontend
|
|
256
|
+
|
|
257
|
+
> **GATE**: SIM / NÃO
|
|
258
|
+
|
|
259
|
+
### 3.1 Rotas
|
|
260
|
+
|
|
261
|
+
| Rota | Tela | Guard | Descrição |
|
|
262
|
+
|------|------|-------|-----------|
|
|
263
|
+
| | | | |
|
|
264
|
+
|
|
265
|
+
### 3.2 Componentes principais
|
|
266
|
+
|
|
267
|
+
| Componente | Responsabilidade | Props principais |
|
|
268
|
+
|------------|------------------|------------------|
|
|
269
|
+
| | | |
|
|
270
|
+
|
|
271
|
+
### 3.3 State management
|
|
272
|
+
|
|
273
|
+
| Aspecto | Decisão |
|
|
274
|
+
|---------|---------|
|
|
275
|
+
| Server state | <!-- TanStack Query / SWR / RTK Query --> |
|
|
276
|
+
| Client state | <!-- Context / Zustand / Redux --> |
|
|
277
|
+
| Forms | <!-- React Hook Form / Formik --> |
|
|
278
|
+
|
|
279
|
+
### 3.4 Design system
|
|
280
|
+
|
|
281
|
+
- <!-- Tailwind / MUI / Fusion / custom -->
|
|
282
|
+
|
|
283
|
+
---
|
|
284
|
+
|
|
285
|
+
## 4. §Área-DB
|
|
286
|
+
|
|
287
|
+
> **GATE**: SIM / NÃO
|
|
288
|
+
|
|
289
|
+
### 4.1 Schema
|
|
290
|
+
|
|
291
|
+
```sql
|
|
292
|
+
-- Entidades desta feature ou alterações em tabelas existentes
|
|
293
|
+
```
|
|
294
|
+
|
|
295
|
+
### 4.2 Índices e constraints
|
|
296
|
+
|
|
297
|
+
| Nome | Tabela | Colunas | Tipo | Justificativa |
|
|
298
|
+
|------|--------|---------|------|---------------|
|
|
299
|
+
| | | | btree / unique / gin / EXCLUDE | |
|
|
300
|
+
|
|
301
|
+
### 4.3 Migrations
|
|
302
|
+
|
|
303
|
+
| # | Arquivo | Descrição | Rollback? |
|
|
304
|
+
|---|---------|-----------|-----------|
|
|
305
|
+
| 001 | | | Sim/Não |
|
|
306
|
+
|
|
307
|
+
### 4.4 Convenções (se diferem de docs/domain.md)
|
|
308
|
+
|
|
309
|
+
- <!-- Apenas o que é particular a esta feature -->
|
|
310
|
+
|
|
311
|
+
---
|
|
312
|
+
|
|
313
|
+
## 5. §Área-Infra
|
|
314
|
+
|
|
315
|
+
> **GATE**: SIM / NÃO
|
|
316
|
+
|
|
317
|
+
### 5.1 Containers
|
|
318
|
+
|
|
319
|
+
- <!-- docker-compose.dev (só dependências: postgres, redis, etc.) -->
|
|
320
|
+
- <!-- Dockerfiles pra CI/prod se aplicável -->
|
|
321
|
+
|
|
322
|
+
### 5.2 CI/CD
|
|
323
|
+
|
|
324
|
+
| Etapa | Ferramenta | Trigger |
|
|
325
|
+
|-------|-----------|---------|
|
|
326
|
+
| Lint | | push |
|
|
327
|
+
| Test | | push |
|
|
328
|
+
| Build | | push em main/develop |
|
|
329
|
+
| Deploy staging | | push em develop |
|
|
330
|
+
| Deploy prod | | tag / manual |
|
|
331
|
+
|
|
332
|
+
### 5.3 Variáveis de ambiente
|
|
333
|
+
|
|
334
|
+
| Variável | Obrigatória | Ambientes | Exemplo |
|
|
335
|
+
|----------|-------------|-----------|---------|
|
|
336
|
+
| | Sim/Não | | |
|
|
337
|
+
|
|
338
|
+
### 5.4 Monitoramento
|
|
339
|
+
|
|
340
|
+
| Aspecto | Ferramenta | O que monitora |
|
|
341
|
+
|---------|-----------|----------------|
|
|
342
|
+
| Logs | | |
|
|
343
|
+
| Métricas| | |
|
|
344
|
+
| Alertas | | |
|
|
345
|
+
|
|
346
|
+
---
|
|
347
|
+
|
|
348
|
+
## 6. Integrações Externas
|
|
349
|
+
|
|
350
|
+
> Sistemas terceiros consumidos ou notificados. Timeout + Retry + Fallback são OBRIGATÓRIOS.
|
|
351
|
+
|
|
352
|
+
| Sistema | Direção | Protocolo | Timeout | Retry | Fallback |
|
|
353
|
+
|---------|---------|-----------|---------|-------|----------|
|
|
354
|
+
| | envia/recebe/ambos | REST/gRPC/webhook | | | |
|
|
355
|
+
|
|
356
|
+
---
|
|
357
|
+
|
|
358
|
+
## 7. Segurança Detalhada
|
|
359
|
+
|
|
360
|
+
### 7.1 Autenticação
|
|
361
|
+
|
|
362
|
+
| Aspecto | Implementação |
|
|
363
|
+
|---------|--------------|
|
|
364
|
+
| Método | JWT / OAuth2 / Session |
|
|
365
|
+
| Expiração access | |
|
|
366
|
+
| Refresh token | |
|
|
367
|
+
| Hash de senha | bcrypt rounds N / argon2 |
|
|
368
|
+
|
|
369
|
+
### 7.2 Autorização
|
|
370
|
+
|
|
371
|
+
| Aspecto | Decisão |
|
|
372
|
+
|---------|---------|
|
|
373
|
+
| Tipo | RBAC / ABAC / RBAC+ABAC |
|
|
374
|
+
| Onde é verificado | Middleware / Decorator / Service |
|
|
375
|
+
|
|
376
|
+
#### Papéis e permissões
|
|
377
|
+
|
|
378
|
+
| Papel | Herda de | Permissões desta feature |
|
|
379
|
+
|-------|----------|--------------------------|
|
|
380
|
+
| | | |
|
|
381
|
+
|
|
382
|
+
### 7.3 LGPD / Privacidade (se aplicável)
|
|
383
|
+
|
|
384
|
+
| Dado | Base legal | Retenção | Criptografado? |
|
|
385
|
+
|------|-----------|----------|----------------|
|
|
386
|
+
| | | | |
|
|
387
|
+
|
|
388
|
+
### 7.4 Rate limiting
|
|
389
|
+
|
|
390
|
+
| Categoria | Limite | Janela | Resposta |
|
|
391
|
+
|-----------|--------|--------|----------|
|
|
392
|
+
| | | | 429 + Retry-After |
|
|
393
|
+
|
|
394
|
+
---
|
|
395
|
+
|
|
396
|
+
## 8. Estratégia de Testes
|
|
397
|
+
|
|
398
|
+
| Nível | Framework | Escopo | Quando roda |
|
|
399
|
+
|-------|-----------|--------|-------------|
|
|
400
|
+
| Unit | | lógica isolada | por task |
|
|
401
|
+
| Integration | | request → DB → response | por fase |
|
|
402
|
+
| E2E | | jornadas completas | por feature |
|
|
403
|
+
|
|
404
|
+
---
|
|
405
|
+
|
|
406
|
+
## 9. Decisões Técnicas (ADRs)
|
|
407
|
+
|
|
408
|
+
> Cada ADR é imutável após aceita. Sincronizada em docs/decisions.md via /sf-merge-docs.
|
|
409
|
+
|
|
410
|
+
### ADR-001: {{Título}}
|
|
411
|
+
- **Status**: proposta | aceita | substituída por ADR-XXX | descartada
|
|
412
|
+
- **Data**: YYYY-MM-DD
|
|
413
|
+
- **Contexto**: <!-- Por que essa decisão foi necessária? -->
|
|
414
|
+
- **Decisão**: <!-- O que decidimos? -->
|
|
415
|
+
- **Alternativas consideradas**:
|
|
416
|
+
1. <!-- Alternativa A — rejeitada porque... -->
|
|
417
|
+
2. <!-- Alternativa B — rejeitada porque... -->
|
|
418
|
+
- **Consequências**:
|
|
419
|
+
- Positivas: <!-- -->
|
|
420
|
+
- Negativas: <!-- -->
|
|
421
|
+
- Riscos: <!-- -->
|
|
422
|
+
|
|
423
|
+
---
|
|
424
|
+
|
|
425
|
+
## 10. Ambiguidades Técnicas
|
|
426
|
+
|
|
427
|
+
> ⚠️ **BLOQUEANTE** — `/sf-design` NÃO avança enquanto houver linha com `Resposta`
|
|
428
|
+
> vazia E `Resolvido em docs/` vazio.
|
|
429
|
+
>
|
|
430
|
+
> **Como responder** (ver `.github/skills/sf-extract/SKILL.md` → "Como responder ambiguidades"):
|
|
431
|
+
> preencher a coluna `Resposta` direto nesta tabela e rodar `/sf-design` de novo.
|
|
432
|
+
|
|
433
|
+
| ID | Pergunta | Contexto | Fonte | Consultei docs/? | Resposta | Resolvido em docs/ |
|
|
434
|
+
|----|----------|----------|-------|------------------|----------|--------------------|
|
|
435
|
+
| AMB-TRD-001 | ⚠️ | | | sim / não / ausente | (aguardando) | — |
|
|
436
|
+
|
|
437
|
+
---
|
|
438
|
+
|
|
439
|
+
## 11. Rastreabilidade
|
|
440
|
+
|
|
441
|
+
> Mapa de qual insumo originou qual seção. Permite auditoria da extração.
|
|
442
|
+
|
|
443
|
+
| Insumo | Tipo | Seções alimentadas |
|
|
444
|
+
|--------|------|--------------------|
|
|
445
|
+
| `{{arquivo}}` | {{tipo}} | §1.1, §1.2, §2.1, §9 (ADR-001) |
|
|
446
|
+
|
|
447
|
+
---
|
|
448
|
+
|
|
449
|
+
> **Próximo passo**: Após aprovação do dev (campo `trd_aprovado: true` no
|
|
450
|
+
> `.context.md`), este TRD alimenta `/sf-design` (specs/) + `/sf-merge-docs` (docs/).
|