@daniel-da-silva-alves/sddk 2.0.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/CHANGELOG.md +27 -0
- package/LICENSE +21 -0
- package/README.md +260 -0
- package/bin/cli.js +430 -0
- package/package.json +49 -0
- package/sddk/plugin.json +12 -0
- package/sddk/skills/code-review/SKILL.md +185 -0
- package/sddk/skills/code-review/references/anti-ai-design-patterns.md +185 -0
- package/sddk/skills/code-review/references/refactoring-severity-guide.md +96 -0
- package/sddk/skills/code-review/references/security-checklist.md +131 -0
- package/sddk/skills/fullstack-development/SKILL.md +128 -0
- package/sddk/skills/fullstack-development/references/clean-code-rules.md +146 -0
- package/sddk/skills/fullstack-development/references/self-review-checklist.md +64 -0
- package/sddk/skills/implementation-planning/SKILL.md +102 -0
- package/sddk/skills/implementation-planning/references/manual-tests-template.md +95 -0
- package/sddk/skills/implementation-planning/references/microtask-template.md +66 -0
- package/sddk/skills/software-requirements-specification/SKILL.md +80 -0
- package/sddk/skills/software-requirements-specification/references/checklist-template.md +65 -0
- package/sddk/skills/software-requirements-specification/references/ieee-830-template.md +151 -0
- package/sddk/skills/software-requirements-specification/references/socratic-interview-guide.md +96 -0
- package/sddk/skills/system-design-document/SKILL.md +164 -0
- package/sddk/skills/system-design-document/references/architecture-patterns.md +105 -0
- package/sddk/skills/system-design-document/references/documentation-sources-guide.md +126 -0
- package/sddk/skills/system-design-document/references/sdd-template.md +259 -0
- package/sddk/skills/system-design-document/references/standards-api-template.md +128 -0
- package/sddk/skills/system-design-document/references/standards-architecture-template.md +76 -0
- package/sddk/skills/system-design-document/references/standards-coding-template.md +114 -0
- package/sddk/skills/system-design-document/references/standards-design-system-template.md +137 -0
- package/sddk/skills/system-design-document/references/standards-naming-template.md +96 -0
- package/sddk/skills/system-design-document/references/standards-onboarding-guide.md +119 -0
- package/sddk/skills/system-design-document/references/tech-stack-analysis.md +84 -0
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
# Template de System Design Document (SDD)
|
|
2
|
+
|
|
3
|
+
Use este template como base para gerar o documento SDD. Adapte as seções conforme a complexidade da feature.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Estrutura do Documento
|
|
8
|
+
|
|
9
|
+
```markdown
|
|
10
|
+
# System Design Document (SDD)
|
|
11
|
+
## {Nome da Feature}
|
|
12
|
+
|
|
13
|
+
**Versão**: 1.0
|
|
14
|
+
**Data**: {data de criação}
|
|
15
|
+
**Projeto**: {nome do projeto}
|
|
16
|
+
**Feature**: {nome da feature}
|
|
17
|
+
**SRS Referência**: [srs.md](./srs.md)
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## 1. Visão Geral Técnica
|
|
22
|
+
|
|
23
|
+
### 1.1 Resumo
|
|
24
|
+
Breve descrição técnica do que será implementado e como.
|
|
25
|
+
|
|
26
|
+
### 1.2 Stack Tecnológica
|
|
27
|
+
|
|
28
|
+
| Camada | Tecnologia | Justificativa |
|
|
29
|
+
|:---|:---|:---|
|
|
30
|
+
| Linguagem | {ex: TypeScript} | {por que esta escolha} |
|
|
31
|
+
| Framework | {ex: Next.js 14} | {por que esta escolha} |
|
|
32
|
+
| Banco de dados | {ex: PostgreSQL} | {por que esta escolha} |
|
|
33
|
+
| ORM/Query | {ex: Prisma} | {por que esta escolha} |
|
|
34
|
+
| Autenticação | {ex: NextAuth.js} | {por que esta escolha} |
|
|
35
|
+
| Estilização | {ex: Tailwind CSS v4} | {por que esta escolha} |
|
|
36
|
+
|
|
37
|
+
### 1.3 Decisões Arquiteturais
|
|
38
|
+
|
|
39
|
+
| Decisão | Escolha | Alternativas Consideradas | Justificativa |
|
|
40
|
+
|:---|:---|:---|:---|
|
|
41
|
+
| Padrão | {ex: Clean Architecture} | MVC, Hexagonal | {razão} |
|
|
42
|
+
| State Management | {ex: Zustand} | Redux, Context | {razão} |
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
## 2. Arquitetura do Sistema
|
|
47
|
+
|
|
48
|
+
### 2.1 Diagrama de Arquitetura
|
|
49
|
+
|
|
50
|
+
```mermaid
|
|
51
|
+
graph TB
|
|
52
|
+
subgraph Frontend
|
|
53
|
+
A[Pages/Routes] --> B[Components]
|
|
54
|
+
B --> C[Hooks/State]
|
|
55
|
+
end
|
|
56
|
+
subgraph Backend
|
|
57
|
+
D[API Routes] --> E[Services]
|
|
58
|
+
E --> F[Repository]
|
|
59
|
+
F --> G[(Database)]
|
|
60
|
+
end
|
|
61
|
+
C --> D
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
### 2.2 Estrutura de Diretórios
|
|
65
|
+
|
|
66
|
+
```
|
|
67
|
+
src/
|
|
68
|
+
├── app/ # Routes / pages
|
|
69
|
+
├── components/ # Componentes reutilizáveis
|
|
70
|
+
│ ├── ui/ # Design system (atoms)
|
|
71
|
+
│ └── features/ # Componentes de feature
|
|
72
|
+
├── lib/ # Utilitários e helpers
|
|
73
|
+
├── services/ # Lógica de negócio
|
|
74
|
+
├── repositories/ # Acesso a dados
|
|
75
|
+
├── types/ # TypeScript types/interfaces
|
|
76
|
+
└── config/ # Configurações
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
### 2.3 Camadas e Responsabilidades
|
|
80
|
+
|
|
81
|
+
| Camada | Responsabilidade | Exemplo |
|
|
82
|
+
|:---|:---|:---|
|
|
83
|
+
| **Presentation** | UI, formulários, validação visual | Componentes React |
|
|
84
|
+
| **Application** | Orquestração, use cases | Services |
|
|
85
|
+
| **Domain** | Regras de negócio puras | Entidades, Value Objects |
|
|
86
|
+
| **Infrastructure** | Acesso a dados, APIs externas | Repositories, API clients |
|
|
87
|
+
|
|
88
|
+
---
|
|
89
|
+
|
|
90
|
+
## 3. Modelo de Dados
|
|
91
|
+
|
|
92
|
+
### 3.1 Entidades
|
|
93
|
+
|
|
94
|
+
#### {NomeEntidade}
|
|
95
|
+
|
|
96
|
+
| Campo | Tipo | Constraints | Descrição |
|
|
97
|
+
|:---|:---|:---|:---|
|
|
98
|
+
| id | UUID | PK, auto-generated | Identificador único |
|
|
99
|
+
| {campo} | {tipo} | {constraints} | {descrição} |
|
|
100
|
+
| created_at | DateTime | NOT NULL, default NOW | Data de criação |
|
|
101
|
+
| updated_at | DateTime | NOT NULL, auto-update | Última atualização |
|
|
102
|
+
|
|
103
|
+
### 3.2 Relacionamentos
|
|
104
|
+
|
|
105
|
+
```mermaid
|
|
106
|
+
erDiagram
|
|
107
|
+
ENTITY_A ||--o{ ENTITY_B : "has many"
|
|
108
|
+
ENTITY_B }|--|| ENTITY_C : "belongs to"
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
### 3.3 Migrations
|
|
112
|
+
|
|
113
|
+
Lista de migrations necessárias em ordem:
|
|
114
|
+
1. `001_create_{table}.sql` — Criar tabela principal
|
|
115
|
+
2. `002_create_{table}.sql` — Criar tabelas secundárias
|
|
116
|
+
|
|
117
|
+
---
|
|
118
|
+
|
|
119
|
+
## 4. Design de API
|
|
120
|
+
|
|
121
|
+
### 4.1 Endpoints
|
|
122
|
+
|
|
123
|
+
#### `POST /api/{resource}`
|
|
124
|
+
- **Descrição**: {o que faz}
|
|
125
|
+
- **Auth**: {requer autenticação? qual role?}
|
|
126
|
+
- **Request Body**:
|
|
127
|
+
```json
|
|
128
|
+
{
|
|
129
|
+
"field": "type — descrição"
|
|
130
|
+
}
|
|
131
|
+
```
|
|
132
|
+
- **Response 200**:
|
|
133
|
+
```json
|
|
134
|
+
{
|
|
135
|
+
"data": {}
|
|
136
|
+
}
|
|
137
|
+
```
|
|
138
|
+
- **Errors**: 400 (validação), 401 (não autenticado), 403 (não autorizado), 500 (erro interno)
|
|
139
|
+
|
|
140
|
+
### 4.2 Validações
|
|
141
|
+
|
|
142
|
+
| Endpoint | Campo | Regra |
|
|
143
|
+
|:---|:---|:---|
|
|
144
|
+
| POST /api/{resource} | {campo} | {regra de validação} |
|
|
145
|
+
|
|
146
|
+
---
|
|
147
|
+
|
|
148
|
+
## 5. Design de Interface (Frontend)
|
|
149
|
+
|
|
150
|
+
### 5.1 Componentes
|
|
151
|
+
|
|
152
|
+
| Componente | Tipo | Descrição |
|
|
153
|
+
|:---|:---|:---|
|
|
154
|
+
| `{ComponentName}` | Page | {descrição} |
|
|
155
|
+
| `{ComponentName}` | Feature | {descrição} |
|
|
156
|
+
| `{ComponentName}` | UI/Atom | {descrição} |
|
|
157
|
+
|
|
158
|
+
### 5.2 Estado e Fluxo de Dados
|
|
159
|
+
|
|
160
|
+
Descrever como o estado flui entre componentes:
|
|
161
|
+
- Fonte de dados
|
|
162
|
+
- Estado local vs global
|
|
163
|
+
- Cache strategy
|
|
164
|
+
|
|
165
|
+
### 5.3 Design Tokens
|
|
166
|
+
|
|
167
|
+
| Token | Valor | Uso |
|
|
168
|
+
|:---|:---|:---|
|
|
169
|
+
| `--color-primary` | {valor} | {onde usar} |
|
|
170
|
+
| `--spacing-md` | {valor} | {onde usar} |
|
|
171
|
+
|
|
172
|
+
---
|
|
173
|
+
|
|
174
|
+
## 6. Integrações
|
|
175
|
+
|
|
176
|
+
### 6.1 APIs Externas
|
|
177
|
+
|
|
178
|
+
| Serviço | Propósito | Endpoint | Auth |
|
|
179
|
+
|:---|:---|:---|:---|
|
|
180
|
+
| {nome} | {para quê} | {URL base} | {tipo de auth} |
|
|
181
|
+
|
|
182
|
+
### 6.2 Eventos / Webhooks
|
|
183
|
+
|
|
184
|
+
| Evento | Trigger | Payload |
|
|
185
|
+
|:---|:---|:---|
|
|
186
|
+
| {nome} | {quando dispara} | {dados enviados} |
|
|
187
|
+
|
|
188
|
+
---
|
|
189
|
+
|
|
190
|
+
## 7. Tratamento de Erros
|
|
191
|
+
|
|
192
|
+
### 7.1 Estratégia
|
|
193
|
+
|
|
194
|
+
| Camada | Estratégia | Exemplo |
|
|
195
|
+
|:---|:---|:---|
|
|
196
|
+
| Frontend | {ex: Error Boundary + toast} | {quando usar} |
|
|
197
|
+
| API | {ex: HTTP status + error body padronizado} | {formato} |
|
|
198
|
+
| Service | {ex: Custom exceptions + logging} | {tipos de erro} |
|
|
199
|
+
|
|
200
|
+
### 7.2 Error Codes
|
|
201
|
+
|
|
202
|
+
| Código | Mensagem | Ação do Usuário |
|
|
203
|
+
|:---|:---|:---|
|
|
204
|
+
| {code} | {mensagem} | {o que fazer} |
|
|
205
|
+
|
|
206
|
+
---
|
|
207
|
+
|
|
208
|
+
## 8. Segurança
|
|
209
|
+
|
|
210
|
+
### 8.1 Autenticação
|
|
211
|
+
Descrever mecanismo de autenticação.
|
|
212
|
+
|
|
213
|
+
### 8.2 Autorização
|
|
214
|
+
Descrever modelo de permissões (RBAC, ABAC, etc.).
|
|
215
|
+
|
|
216
|
+
### 8.3 Proteção de Dados
|
|
217
|
+
Campos sensíveis, criptografia, LGPD/GDPR.
|
|
218
|
+
|
|
219
|
+
---
|
|
220
|
+
|
|
221
|
+
## 9. Referências ao SRS
|
|
222
|
+
|
|
223
|
+
| Seção SDD | Requisito SRS | Referência |
|
|
224
|
+
|:---|:---|:---|
|
|
225
|
+
| 3. Modelo de Dados | RF-001 | [SRS#3 RF-001](./srs.md#rf-001) |
|
|
226
|
+
|
|
227
|
+
---
|
|
228
|
+
|
|
229
|
+
## 10. Fontes de Documentação Técnica
|
|
230
|
+
|
|
231
|
+
### 10.1 Configuração de Fontes
|
|
232
|
+
|
|
233
|
+
| Tecnologia | Versão | Fonte Primária | URL Oficial | MCP/Skill |
|
|
234
|
+
|:---|:---|:---|:---|:---|
|
|
235
|
+
| {tecnologia} | {versão} | {URL oficial / MCP / Skill / Docs local} | {URL} | {nome do MCP ou —} |
|
|
236
|
+
|
|
237
|
+
### 10.2 Documentação Local do Projeto
|
|
238
|
+
|
|
239
|
+
| Caminho | Conteúdo |
|
|
240
|
+
|:---|:---|
|
|
241
|
+
| {caminho} | {descrição do conteúdo} |
|
|
242
|
+
|
|
243
|
+
### 10.3 Regra de Consulta
|
|
244
|
+
|
|
245
|
+
Ordem de prioridade para consulta de documentação durante o desenvolvimento:
|
|
246
|
+
1. Documentação local do projeto (caminhos listados em 10.2)
|
|
247
|
+
2. MCP/Skill (se listado na coluna MCP/Skill em 10.1)
|
|
248
|
+
3. URL oficial (usar `read_url_content` na URL listada em 10.1)
|
|
249
|
+
4. Web search (usar `search_web` com query: "{tecnologia} {versão} {tópico} site:{domínio oficial}")
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
## Regras de Preenchimento
|
|
253
|
+
|
|
254
|
+
1. **Cada decisão arquitetural DEVE ter justificativa** — nunca apenas "porque sim"
|
|
255
|
+
2. **Modelo de dados DEVE corresponder aos requisitos do SRS** — usar matriz de referência
|
|
256
|
+
3. **Endpoints DEVEM cobrir todos os requisitos funcionais** do SRS
|
|
257
|
+
4. **Componentes DEVEM ser granulares** — nunca um componente monolítico
|
|
258
|
+
5. **Design tokens DEVEM ser definidos** — nunca usar valores hardcoded
|
|
259
|
+
6. **Fontes de documentação DEVEM ser configuradas** para cada tecnologia da stack com versão pinada
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
# Template: Convenções de API do Projeto
|
|
2
|
+
|
|
3
|
+
Use este template para gerar `.specs/standards/api-conventions.md`. Preencha com as respostas do onboarding. Se o projeto não tem API, criar com "N/A — projeto sem API".
|
|
4
|
+
|
|
5
|
+
```markdown
|
|
6
|
+
# Convenções de API
|
|
7
|
+
|
|
8
|
+
**Projeto**: {nome do projeto}
|
|
9
|
+
**Última atualização**: {data}
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## 1. Padrão de API
|
|
14
|
+
|
|
15
|
+
**Tipo**: {REST | GraphQL | tRPC | gRPC}
|
|
16
|
+
**Versionamento**: {ex: URL path /api/v1/, header, nenhum}
|
|
17
|
+
**Base URL**: {ex: /api/v1}
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## 2. Formato de Response
|
|
22
|
+
|
|
23
|
+
### Response de Sucesso
|
|
24
|
+
```json
|
|
25
|
+
{
|
|
26
|
+
"data": { ... },
|
|
27
|
+
"meta": {
|
|
28
|
+
"page": 1,
|
|
29
|
+
"perPage": 20,
|
|
30
|
+
"total": 150
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
### Response de Erro
|
|
36
|
+
```json
|
|
37
|
+
{
|
|
38
|
+
"error": {
|
|
39
|
+
"code": "{ERROR_CODE}",
|
|
40
|
+
"message": "{mensagem legível}",
|
|
41
|
+
"details": [ ... ]
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
### HTTP Status Codes
|
|
47
|
+
|
|
48
|
+
| Status | Quando usar |
|
|
49
|
+
|:---|:---|
|
|
50
|
+
| 200 | Sucesso (GET, PUT, PATCH) |
|
|
51
|
+
| 201 | Recurso criado (POST) |
|
|
52
|
+
| 204 | Sucesso sem body (DELETE) |
|
|
53
|
+
| 400 | Validação / input inválido |
|
|
54
|
+
| 401 | Não autenticado |
|
|
55
|
+
| 403 | Não autorizado (sem permissão) |
|
|
56
|
+
| 404 | Recurso não encontrado |
|
|
57
|
+
| 409 | Conflito (ex: email já existe) |
|
|
58
|
+
| 422 | Entidade não processável |
|
|
59
|
+
| 429 | Rate limit excedido |
|
|
60
|
+
| 500 | Erro interno do servidor |
|
|
61
|
+
|
|
62
|
+
---
|
|
63
|
+
|
|
64
|
+
## 3. Naming de Endpoints
|
|
65
|
+
|
|
66
|
+
| Regra | Exemplo correto | Exemplo errado |
|
|
67
|
+
|:---|:---|:---|
|
|
68
|
+
| Substantivos no plural | `/api/v1/users` | `/api/v1/user` |
|
|
69
|
+
| Sem verbos na URL | `GET /users` | `GET /getUsers` |
|
|
70
|
+
| Kebab-case para multi-palavras | `/order-items` | `/orderItems` |
|
|
71
|
+
| Recursos aninhados | `/users/:id/orders` | `/getUserOrders` |
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
## 4. Paginação
|
|
76
|
+
|
|
77
|
+
**Tipo**: {cursor | offset | keyset}
|
|
78
|
+
|
|
79
|
+
### Formato de Request
|
|
80
|
+
{ex para offset:}
|
|
81
|
+
```
|
|
82
|
+
GET /api/v1/users?page=2&per_page=20
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
### Formato de Response (meta)
|
|
86
|
+
```json
|
|
87
|
+
{
|
|
88
|
+
"meta": {
|
|
89
|
+
"page": 2,
|
|
90
|
+
"per_page": 20,
|
|
91
|
+
"total": 150,
|
|
92
|
+
"total_pages": 8
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
---
|
|
98
|
+
|
|
99
|
+
## 5. Filtros e Ordenação
|
|
100
|
+
|
|
101
|
+
### Filtros
|
|
102
|
+
```
|
|
103
|
+
GET /api/v1/users?status=active&role=admin
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
### Ordenação
|
|
107
|
+
```
|
|
108
|
+
GET /api/v1/users?sort=created_at&order=desc
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
---
|
|
112
|
+
|
|
113
|
+
## 6. Autenticação
|
|
114
|
+
|
|
115
|
+
**Método**: {ex: Bearer Token (JWT) via header Authorization}
|
|
116
|
+
**Header**: `Authorization: Bearer {token}`
|
|
117
|
+
**Refresh**: {ex: via POST /api/v1/auth/refresh com refresh token em httpOnly cookie}
|
|
118
|
+
|
|
119
|
+
---
|
|
120
|
+
|
|
121
|
+
## 7. Validação
|
|
122
|
+
|
|
123
|
+
| Regra | Descrição |
|
|
124
|
+
|:---|:---|
|
|
125
|
+
| Validação no backend | TODA input é validada no servidor, independente do frontend |
|
|
126
|
+
| Mensagens de erro | Retornar campo + mensagem específica |
|
|
127
|
+
| Formato de erro de validação | `{"error": {"code": "VALIDATION_ERROR", "details": [{"field": "email", "message": "Email inválido"}]}}` |
|
|
128
|
+
```
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
# Template: Padrões Arquiteturais do Projeto
|
|
2
|
+
|
|
3
|
+
Use este template para gerar `.specs/standards/architecture.md`. Preencha com as respostas do onboarding.
|
|
4
|
+
|
|
5
|
+
```markdown
|
|
6
|
+
# Padrões Arquiteturais do Projeto
|
|
7
|
+
|
|
8
|
+
**Projeto**: {nome do projeto}
|
|
9
|
+
**Última atualização**: {data}
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## 1. Padrão Arquitetural Base
|
|
14
|
+
|
|
15
|
+
**Padrão**: {ex: Domain-Driven Design (DDD)}
|
|
16
|
+
**Justificativa**: {por que este padrão}
|
|
17
|
+
|
|
18
|
+
### Camadas e Responsabilidades
|
|
19
|
+
|
|
20
|
+
| Camada | Responsabilidade | Pode importar de | NÃO pode importar de |
|
|
21
|
+
|:---|:---|:---|:---|
|
|
22
|
+
| {ex: Domain} | {ex: Entidades, Value Objects, regras de negócio} | {nenhuma} | {Application, Infrastructure, Presentation} |
|
|
23
|
+
| {ex: Application} | {ex: Use Cases, DTOs, Ports} | {Domain} | {Infrastructure, Presentation} |
|
|
24
|
+
| {ex: Infrastructure} | {ex: Repositories, API clients, DB} | {Domain, Application} | {Presentation} |
|
|
25
|
+
| {ex: Presentation} | {ex: Controllers, Views, Components} | {Application} | {Domain, Infrastructure} |
|
|
26
|
+
|
|
27
|
+
### Estrutura de Diretórios Padrão
|
|
28
|
+
|
|
29
|
+
```
|
|
30
|
+
src/
|
|
31
|
+
├── {camada1}/
|
|
32
|
+
├── {camada2}/
|
|
33
|
+
├── {camada3}/
|
|
34
|
+
└── {camada4}/
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
## 2. Padrões Avançados
|
|
40
|
+
|
|
41
|
+
### {ex: Event Sourcing}
|
|
42
|
+
- **Usado em**: {módulos/contextos onde se aplica}
|
|
43
|
+
- **NÃO usado em**: {módulos onde NÃO se aplica}
|
|
44
|
+
- **Implementação**: {detalhes técnicos}
|
|
45
|
+
|
|
46
|
+
### {ex: BFF (Backend for Frontend)}
|
|
47
|
+
- **Escopo**: {cada frontend tem seu BFF? ou BFF único?}
|
|
48
|
+
- **Regra**: {BFF contém lógica de negócio? Ou apenas orquestra?}
|
|
49
|
+
|
|
50
|
+
### {ex: CQRS (Command Query Responsibility Segregation)}
|
|
51
|
+
- **Usado em**: {onde se aplica}
|
|
52
|
+
- **Command**: {como são os commands}
|
|
53
|
+
- **Query**: {como são as queries}
|
|
54
|
+
|
|
55
|
+
---
|
|
56
|
+
|
|
57
|
+
## 3. Regras de Dependência
|
|
58
|
+
|
|
59
|
+
> [!IMPORTANT]
|
|
60
|
+
> Estas regras NUNCA devem ser violadas. Violação é classificada como 🔴 Crítica no Code Review.
|
|
61
|
+
|
|
62
|
+
1. {ex: Domain NUNCA importa de Infrastructure}
|
|
63
|
+
2. {ex: Use Cases orquestram, NUNCA contêm lógica de domínio pura}
|
|
64
|
+
3. {ex: Cada Aggregate tem seu próprio Repository}
|
|
65
|
+
4. {ex: Repositories retornam Domain Entities, não DTOs}
|
|
66
|
+
|
|
67
|
+
---
|
|
68
|
+
|
|
69
|
+
## 4. Princípios de Design
|
|
70
|
+
|
|
71
|
+
| Princípio | Como aplicamos |
|
|
72
|
+
|:---|:---|
|
|
73
|
+
| {ex: SSOT} | {ex: Estado vive no banco. Cache é derivado, nunca fonte primária} |
|
|
74
|
+
| {ex: Separation of Concerns} | {ex: Cada módulo tem responsabilidade única} |
|
|
75
|
+
| {ex: Fail Fast} | {ex: Validar inputs na borda do sistema} |
|
|
76
|
+
```
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
# Template: Boas Práticas e Padrões de Código
|
|
2
|
+
|
|
3
|
+
Use este template para gerar `.specs/standards/coding-standards.md`. Preencha com as respostas do onboarding.
|
|
4
|
+
|
|
5
|
+
```markdown
|
|
6
|
+
# Boas Práticas e Padrões de Código
|
|
7
|
+
|
|
8
|
+
**Projeto**: {nome do projeto}
|
|
9
|
+
**Última atualização**: {data}
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## 1. Princípios Adotados
|
|
14
|
+
|
|
15
|
+
| Princípio | O que significa NESTE projeto | Exemplo |
|
|
16
|
+
|:---|:---|:---|
|
|
17
|
+
| **SSOT** (Single Source of Truth) | {ex: Estado vive no banco. Cache é derivado.} | {ex: Não manter contadores em 2 tabelas} |
|
|
18
|
+
| **DRY** (Don't Repeat Yourself) | {ex: Extrair quando repetir ≥ 2 vezes} | {ex: apiClient centralizado, não fetch repetido} |
|
|
19
|
+
| **KISS** (Keep It Simple) | {ex: Preferir solução simples à elegante} | {ex: Usar map/filter ao invés de reduce complexo} |
|
|
20
|
+
| **YAGNI** (You Aren't Gonna Need It) | {ex: Não implementar features "por garantia"} | {ex: Não criar abstração genérica para 1 uso} |
|
|
21
|
+
| **SOLID** | {quais princípios do SOLID o projeto segue explicitamente} | — |
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
## 2. Regras de Abstração
|
|
26
|
+
|
|
27
|
+
### Quando Extrair uma Função
|
|
28
|
+
- {ex: Quando o bloco é usado ≥ 2 vezes}
|
|
29
|
+
- {ex: Quando o bloco tem mais de 10 linhas e pode ter nome descritivo}
|
|
30
|
+
- {ex: Quando o bloco faz algo semanticamente independente}
|
|
31
|
+
|
|
32
|
+
### Quando Criar um Componente
|
|
33
|
+
- {ex: Quando a UI é reutilizada em ≥ 2 lugares}
|
|
34
|
+
- {ex: Quando o componente tem mais de ~100 linhas}
|
|
35
|
+
- {ex: Quando tem estado ou lógica própria}
|
|
36
|
+
|
|
37
|
+
### Quando Criar um Hook (React)
|
|
38
|
+
- {ex: Quando lógica stateful é usada em ≥ 2 componentes}
|
|
39
|
+
- {ex: Quando o componente fica mais limpo separando a lógica}
|
|
40
|
+
|
|
41
|
+
### Quando Criar um Service
|
|
42
|
+
- {ex: Quando a lógica de negócio não pertence ao componente/controller}
|
|
43
|
+
- {ex: Quando a mesma operação é usada em múltiplos endpoints/páginas}
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
47
|
+
## 3. Tratamento de Erros
|
|
48
|
+
|
|
49
|
+
### Estratégia por Camada
|
|
50
|
+
|
|
51
|
+
| Camada | Estratégia |
|
|
52
|
+
|:---|:---|
|
|
53
|
+
| **Domain** | {ex: Lançar custom exceptions (DomainError, ValidationError)} |
|
|
54
|
+
| **Application/Service** | {ex: Capturar domain errors, traduzir para DTOs de erro} |
|
|
55
|
+
| **API/Controller** | {ex: Error handler global, mapear exceptions para HTTP status} |
|
|
56
|
+
| **Frontend** | {ex: Error Boundary para crashes, toast para erros de ação} |
|
|
57
|
+
|
|
58
|
+
### Custom Exceptions (se aplicável)
|
|
59
|
+
```typescript
|
|
60
|
+
// Hierarquia de erros do projeto
|
|
61
|
+
class AppError extends Error { code: string; statusCode: number; }
|
|
62
|
+
class ValidationError extends AppError { fields: FieldError[]; }
|
|
63
|
+
class NotFoundError extends AppError { }
|
|
64
|
+
class UnauthorizedError extends AppError { }
|
|
65
|
+
class ConflictError extends AppError { }
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
### Mensagens de Erro
|
|
69
|
+
- {ex: Mensagens voltadas ao usuário, nunca stack traces}
|
|
70
|
+
- {ex: Logging do erro completo no servidor, mensagem limpa no client}
|
|
71
|
+
- {ex: Códigos de erro padronizados (ERROR_CODE) para o frontend mapear}
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
## 4. Logging
|
|
76
|
+
|
|
77
|
+
### Estratégia
|
|
78
|
+
- **Formato**: {ex: Structured logging (JSON)}
|
|
79
|
+
- **Níveis**: {ex: error, warn, info, debug}
|
|
80
|
+
- **Ferramenta**: {ex: pino, winston, console estruturado}
|
|
81
|
+
|
|
82
|
+
### O que Logar
|
|
83
|
+
|
|
84
|
+
| Nível | Quando usar | Exemplo |
|
|
85
|
+
|:---|:---|:---|
|
|
86
|
+
| `error` | Falhas que impedem a operação | Erro de conexão DB, exception não tratada |
|
|
87
|
+
| `warn` | Situações anormais mas recuperáveis | Rate limit próximo, fallback ativado |
|
|
88
|
+
| `info` | Eventos de negócio importantes | Usuário criado, pagamento processado |
|
|
89
|
+
| `debug` | Detalhes para debugging | Query SQL executada, payload recebido |
|
|
90
|
+
|
|
91
|
+
### O que NUNCA Logar
|
|
92
|
+
- Senhas, tokens, chaves de API
|
|
93
|
+
- Dados pessoais sensíveis (CPF, cartão de crédito)
|
|
94
|
+
- Payloads completos de request em produção
|
|
95
|
+
|
|
96
|
+
---
|
|
97
|
+
|
|
98
|
+
## 5. Testes (se aplicável)
|
|
99
|
+
|
|
100
|
+
### Estratégia
|
|
101
|
+
- **Tipo principal**: {ex: Testes manuais via manual-tests.md}
|
|
102
|
+
- **Cobertura mínima**: {ex: N/A — foco em testes manuais}
|
|
103
|
+
- **Quando automatizar**: {ex: Lógica de domínio crítica (cálculos, validações)}
|
|
104
|
+
|
|
105
|
+
---
|
|
106
|
+
|
|
107
|
+
## 6. Performance
|
|
108
|
+
|
|
109
|
+
### Regras Gerais
|
|
110
|
+
- {ex: Queries de listagem DEVEM ter paginação (máximo 100 por página)}
|
|
111
|
+
- {ex: N+1 queries são proibidas — usar eager loading / join}
|
|
112
|
+
- {ex: Imagens devem ser otimizadas (WebP, lazy loading)}
|
|
113
|
+
- {ex: Bundle splitting para rotas de frontend}
|
|
114
|
+
```
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
# Template: Design System do Projeto
|
|
2
|
+
|
|
3
|
+
Use este template para gerar `.specs/standards/design-system.md`. Preencha com as respostas do onboarding. Se o projeto é backend-only, criar o arquivo com conteúdo "N/A — projeto backend-only".
|
|
4
|
+
|
|
5
|
+
```markdown
|
|
6
|
+
# Design System
|
|
7
|
+
|
|
8
|
+
**Projeto**: {nome do projeto}
|
|
9
|
+
**Última atualização**: {data}
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## 1. Paleta de Cores
|
|
14
|
+
|
|
15
|
+
### Cores Primárias
|
|
16
|
+
| Token | Valor | Uso |
|
|
17
|
+
|:---|:---|:---|
|
|
18
|
+
| `--color-primary-50` | {ex: #e8f0fe} | Backgrounds suaves |
|
|
19
|
+
| `--color-primary-100` | {ex: #d2e3fc} | Hover em backgrounds |
|
|
20
|
+
| `--color-primary-500` | {ex: #4285f4} | Ações primárias, links |
|
|
21
|
+
| `--color-primary-700` | {ex: #1a73e8} | Hover em ações primárias |
|
|
22
|
+
| `--color-primary-900` | {ex: #174ea6} | Texto em destaque |
|
|
23
|
+
|
|
24
|
+
### Cores de Superfície
|
|
25
|
+
| Token | Valor | Uso |
|
|
26
|
+
|:---|:---|:---|
|
|
27
|
+
| `--color-surface` | {ex: #ffffff} | Background de cards, modals |
|
|
28
|
+
| `--color-surface-variant` | {ex: #f8f9fa} | Background de seções alternadas |
|
|
29
|
+
| `--color-on-surface` | {ex: #1f1f1f} | Texto sobre surfaces |
|
|
30
|
+
| `--color-on-surface-secondary` | {ex: #5f6368} | Texto secundário |
|
|
31
|
+
| `--color-outline` | {ex: #dadce0} | Bordas, divisores |
|
|
32
|
+
|
|
33
|
+
### Cores Semânticas
|
|
34
|
+
| Token | Valor | Uso |
|
|
35
|
+
|:---|:---|:---|
|
|
36
|
+
| `--color-error` | {ex: #d32f2f} | Erros, validação |
|
|
37
|
+
| `--color-success` | {ex: #0f9d58} | Sucesso, confirmação |
|
|
38
|
+
| `--color-warning` | {ex: #f9ab00} | Alertas, avisos |
|
|
39
|
+
| `--color-info` | {ex: #4285f4} | Informações |
|
|
40
|
+
|
|
41
|
+
### Modo Escuro (se aplicável)
|
|
42
|
+
| Token Light | Token Dark | Valor Dark |
|
|
43
|
+
|:---|:---|:---|
|
|
44
|
+
| `--color-surface` | `--color-surface-dark` | {ex: #1e1e1e} |
|
|
45
|
+
|
|
46
|
+
---
|
|
47
|
+
|
|
48
|
+
## 2. Tipografia
|
|
49
|
+
|
|
50
|
+
### Fontes
|
|
51
|
+
| Token | Valor | Uso |
|
|
52
|
+
|:---|:---|:---|
|
|
53
|
+
| `--font-family` | {ex: 'Inter', sans-serif} | Texto geral |
|
|
54
|
+
| `--font-family-heading` | {ex: 'Outfit', sans-serif} | Headings |
|
|
55
|
+
| `--font-family-mono` | {ex: 'JetBrains Mono', monospace} | Código |
|
|
56
|
+
|
|
57
|
+
### Tamanhos
|
|
58
|
+
| Token | Valor | Line Height | Uso |
|
|
59
|
+
|:---|:---|:---|:---|
|
|
60
|
+
| `--text-xs` | {ex: 0.75rem} | {ex: 1rem} | Labels, captions |
|
|
61
|
+
| `--text-sm` | {ex: 0.875rem} | {ex: 1.25rem} | Body small |
|
|
62
|
+
| `--text-base` | {ex: 1rem} | {ex: 1.5rem} | Body default |
|
|
63
|
+
| `--text-lg` | {ex: 1.125rem} | {ex: 1.75rem} | Body large |
|
|
64
|
+
| `--text-xl` | {ex: 1.25rem} | {ex: 1.75rem} | Heading 4 |
|
|
65
|
+
| `--text-2xl` | {ex: 1.5rem} | {ex: 2rem} | Heading 3 |
|
|
66
|
+
| `--text-3xl` | {ex: 1.875rem} | {ex: 2.25rem} | Heading 2 |
|
|
67
|
+
| `--text-4xl` | {ex: 2.25rem} | {ex: 2.5rem} | Heading 1 |
|
|
68
|
+
|
|
69
|
+
### Pesos
|
|
70
|
+
| Token | Valor | Uso |
|
|
71
|
+
|:---|:---|:---|
|
|
72
|
+
| `--font-regular` | {ex: 400} | Texto normal |
|
|
73
|
+
| `--font-medium` | {ex: 500} | Ênfase suave |
|
|
74
|
+
| `--font-semibold` | {ex: 600} | Headings, labels |
|
|
75
|
+
| `--font-bold` | {ex: 700} | Destaque forte |
|
|
76
|
+
|
|
77
|
+
---
|
|
78
|
+
|
|
79
|
+
## 3. Espaçamento
|
|
80
|
+
|
|
81
|
+
| Token | Valor | Uso |
|
|
82
|
+
|:---|:---|:---|
|
|
83
|
+
| `--spacing-xs` | {ex: 0.25rem (4px)} | Espaço mínimo |
|
|
84
|
+
| `--spacing-sm` | {ex: 0.5rem (8px)} | Dentro de componentes |
|
|
85
|
+
| `--spacing-md` | {ex: 1rem (16px)} | Entre elementos |
|
|
86
|
+
| `--spacing-lg` | {ex: 1.5rem (24px)} | Entre seções |
|
|
87
|
+
| `--spacing-xl` | {ex: 2rem (32px)} | Entre blocos |
|
|
88
|
+
| `--spacing-2xl` | {ex: 3rem (48px)} | Entre seções maiores |
|
|
89
|
+
|
|
90
|
+
---
|
|
91
|
+
|
|
92
|
+
## 4. Bordas e Sombras
|
|
93
|
+
|
|
94
|
+
### Border Radius
|
|
95
|
+
| Token | Valor | Uso |
|
|
96
|
+
|:---|:---|:---|
|
|
97
|
+
| `--radius-sm` | {ex: 4px} | Botões, inputs |
|
|
98
|
+
| `--radius-md` | {ex: 8px} | Cards |
|
|
99
|
+
| `--radius-lg` | {ex: 12px} | Modals, containers |
|
|
100
|
+
| `--radius-full` | {ex: 9999px} | Avatars, badges |
|
|
101
|
+
|
|
102
|
+
### Shadows
|
|
103
|
+
| Token | Valor | Uso |
|
|
104
|
+
|:---|:---|:---|
|
|
105
|
+
| `--shadow-sm` | {ex: 0 1px 2px rgba(0,0,0,0.05)} | Cards sutis |
|
|
106
|
+
| `--shadow-md` | {ex: 0 4px 6px rgba(0,0,0,0.07)} | Cards elevados |
|
|
107
|
+
| `--shadow-lg` | {ex: 0 10px 15px rgba(0,0,0,0.1)} | Modals, dropdowns |
|
|
108
|
+
|
|
109
|
+
---
|
|
110
|
+
|
|
111
|
+
## 5. Componentes Base
|
|
112
|
+
|
|
113
|
+
| Componente | Background | Padding | Radius | Shadow |
|
|
114
|
+
|:---|:---|:---|:---|:---|
|
|
115
|
+
| Card | `--color-surface` | `--spacing-lg` | `--radius-md` | `--shadow-sm` |
|
|
116
|
+
| Button Primary | `--color-primary-500` | `--spacing-sm` `--spacing-md` | `--radius-sm` | none |
|
|
117
|
+
| Button Secondary | transparent | `--spacing-sm` `--spacing-md` | `--radius-sm` | none |
|
|
118
|
+
| Input | `--color-surface` | `--spacing-sm` `--spacing-md` | `--radius-sm` | inset border |
|
|
119
|
+
| Modal | `--color-surface` | `--spacing-xl` | `--radius-lg` | `--shadow-lg` |
|
|
120
|
+
| Badge | `--color-primary-50` | `--spacing-xs` `--spacing-sm` | `--radius-full` | none |
|
|
121
|
+
|
|
122
|
+
---
|
|
123
|
+
|
|
124
|
+
## 6. Breakpoints (Responsividade)
|
|
125
|
+
|
|
126
|
+
| Token | Valor | Dispositivo |
|
|
127
|
+
|:---|:---|:---|
|
|
128
|
+
| `--breakpoint-sm` | {ex: 640px} | Mobile landscape |
|
|
129
|
+
| `--breakpoint-md` | {ex: 768px} | Tablet |
|
|
130
|
+
| `--breakpoint-lg` | {ex: 1024px} | Desktop |
|
|
131
|
+
| `--breakpoint-xl` | {ex: 1280px} | Desktop largo |
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
## Regra para o Agente
|
|
135
|
+
|
|
136
|
+
> [!IMPORTANT]
|
|
137
|
+
> Quando o design system está definido, o agente NUNCA deve usar valores hardcoded para cores, espaçamentos, tipografia ou border-radius. SEMPRE usar os tokens definidos neste documento.
|