specifica-br 1.2.2 → 1.5.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 +114 -44
- package/dist/boilerplate/commands/executar-task.md +133 -0
- package/dist/boilerplate/commands/gerar-contexto.md +1462 -0
- package/dist/boilerplate/commands/gerar-prd.md +289 -0
- package/dist/boilerplate/commands/gerar-tasks.md +168 -0
- package/dist/boilerplate/commands/gerar-techspec.md +1467 -0
- package/dist/boilerplate/commands/gerar-visao.md +731 -0
- package/dist/boilerplate/commands/realizar-codereview.md +288 -0
- package/dist/boilerplate/opencode-commands/executar-task.md +55 -48
- package/dist/boilerplate/opencode-commands/gerar-contexto.md +1462 -0
- package/dist/boilerplate/opencode-commands/gerar-prd.md +232 -40
- package/dist/boilerplate/opencode-commands/gerar-tasks.md +112 -31
- package/dist/boilerplate/opencode-commands/gerar-techspec.md +1464 -80
- package/dist/boilerplate/opencode-commands/gerar-visao.md +731 -0
- package/dist/boilerplate/opencode-commands/realizar-codereview.md +288 -0
- package/dist/boilerplate/skills/product-manager/SKILL.md +32 -0
- package/dist/boilerplate/skills/techspec-generator/SKILL.md +489 -0
- package/dist/boilerplate/skills/techspec-generator/references/api-contracts.md +421 -0
- package/dist/boilerplate/skills/techspec-generator/references/architecture-patterns.md +316 -0
- package/dist/boilerplate/skills/techspec-generator/references/database-modeling.md +436 -0
- package/dist/boilerplate/skills/techspec-generator/references/observability-testing.md +436 -0
- package/dist/boilerplate/skills/techspec-generator/references/security-hardening.md +238 -0
- package/dist/boilerplate/skills/techspec-generator/references/ux-ui-accessibility.md +511 -0
- package/dist/boilerplate/specs-templates/architecture-template.md +736 -0
- package/dist/boilerplate/specs-templates/codereview-template.md +95 -0
- package/dist/boilerplate/specs-templates/prd-template.md +101 -19
- package/dist/boilerplate/specs-templates/product_vision-template.md +284 -0
- package/dist/boilerplate/specs-templates/task-template.md +64 -18
- package/dist/boilerplate/specs-templates/tasks-template.md +12 -4
- package/dist/boilerplate/specs-templates/techspec-template.md +1227 -89
- package/dist/boilerplate/templates/architecture-template.md +736 -0
- package/dist/boilerplate/templates/codereview-template.md +95 -0
- package/dist/boilerplate/templates/prd-template.md +167 -0
- package/dist/boilerplate/templates/product_vision-template.md +284 -0
- package/dist/boilerplate/templates/task-template.md +169 -0
- package/dist/boilerplate/templates/tasks-template.md +15 -0
- package/dist/boilerplate/templates/techspec-template.md +1306 -0
- package/dist/commands/help.js +33 -11
- package/dist/commands/init.js +39 -43
- package/dist/tools-mapping.json +32 -0
- package/dist/types/init.d.ts +14 -17
- package/dist/utils/file-service.d.ts +5 -3
- package/dist/utils/file-service.js +168 -56
- package/dist/utils/message-formatter.d.ts +2 -1
- package/dist/utils/message-formatter.js +39 -22
- package/package.json +1 -1
|
@@ -0,0 +1,316 @@
|
|
|
1
|
+
# Padrões Arquiteturais e Decisões de Design
|
|
2
|
+
|
|
3
|
+
Referência técnica para decisões arquiteturais ao gerar Tech Specs.
|
|
4
|
+
|
|
5
|
+
## Sumário
|
|
6
|
+
|
|
7
|
+
1. [Paradigmas Arquiteturais](#1-paradigmas-arquiteturais)
|
|
8
|
+
2. [Padrões de Design](#2-padroes-de-design)
|
|
9
|
+
3. [Princípios SOLID no Contexto de Specs](#3-principios-solid-no-contexto-de-specs)
|
|
10
|
+
4. [Separação de Camadas](#4-separacao-de-camadas)
|
|
11
|
+
5. [Decisões de Orquestração](#5-decisoes-de-orquestracao)
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## 1. Paradigmas Arquiteturais
|
|
16
|
+
|
|
17
|
+
### 1.1. Clean Architecture
|
|
18
|
+
|
|
19
|
+
**Quando usar:** Projetos que valorizam testabilidade e independência de frameworks.
|
|
20
|
+
|
|
21
|
+
**Estrutura típica:**
|
|
22
|
+
```
|
|
23
|
+
src/
|
|
24
|
+
├── Domain/ # Entidades, Value Objects, Interfaces de Repository
|
|
25
|
+
├── Application/ # Use Cases, Commands, Queries, Handlers, DTOs
|
|
26
|
+
├── Infrastructure/ # Repository implementations, External Services, Adapters
|
|
27
|
+
└── Interface/ # Controllers, Presenters, Gateways (API/Web)
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
**Regras de dependência:**
|
|
31
|
+
- Domain → não depende de ninguém
|
|
32
|
+
- Application → depende apenas de Domain
|
|
33
|
+
- Infrastructure → implementa interfaces de Domain/Application
|
|
34
|
+
- Interface → orquestra chamadas para Application
|
|
35
|
+
|
|
36
|
+
**O que especificar na TechSpec:**
|
|
37
|
+
- A qual camada pertence cada novo componente
|
|
38
|
+
- Quais interfaces cada camada define
|
|
39
|
+
- Qual a direção de dependência (sempre para dentro)
|
|
40
|
+
|
|
41
|
+
**Violações comuns a detectar:**
|
|
42
|
+
- Controller com lógica de negócio (deveria estar em Application)
|
|
43
|
+
- Entity importando ORM (deveria ser agnóstico)
|
|
44
|
+
- Handler acessando banco diretamente (deveria usar Repository)
|
|
45
|
+
- Domain dependendo de biblioteca externa
|
|
46
|
+
|
|
47
|
+
### 1.2. Domain-Driven Design (DDD)
|
|
48
|
+
|
|
49
|
+
**Quando usar:** Domínios complexos com regras de negócio ricas.
|
|
50
|
+
|
|
51
|
+
**Conceitos-chave para especificar:**
|
|
52
|
+
|
|
53
|
+
| Conceito | O que documentar na TechSpec |
|
|
54
|
+
|:---|:---|
|
|
55
|
+
| **Bounded Context** | Qual contexto esta feature pertence |
|
|
56
|
+
| **Aggregate Root** | Qual entidade é a raiz do aggregate |
|
|
57
|
+
| **Value Object** | Quais conceitos são imutáveis sem identidade |
|
|
58
|
+
| **Domain Event** | Quais eventos de domínio a feature emite/consome |
|
|
59
|
+
| **Repository** | Interface de persistência (não implementação) |
|
|
60
|
+
| **Domain Service** | Lógica que não pertence a nenhuma entidade |
|
|
61
|
+
|
|
62
|
+
**Exemplo de especificação DDD:**
|
|
63
|
+
```
|
|
64
|
+
Aggregate Root: Order
|
|
65
|
+
- Entities: Order, OrderItem
|
|
66
|
+
- Value Objects: Money, OrderStatus
|
|
67
|
+
- Invariants: Total > 0, Status transitions válidas, Items não vazio
|
|
68
|
+
- Events: OrderCreated, OrderPaid, OrderCancelled
|
|
69
|
+
- Repository: IOrderRepository (interface em Domain)
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
### 1.3. Hexagonal Architecture (Ports & Adapters)
|
|
73
|
+
|
|
74
|
+
**Quando usar:** Quando a feature precisa de múltiplos adaptadores (API, CLI, Queue).
|
|
75
|
+
|
|
76
|
+
**Estrutura:**
|
|
77
|
+
```
|
|
78
|
+
src/
|
|
79
|
+
├── core/ # Lógica de negócio pura
|
|
80
|
+
│ ├── domain/ # Entidades, Value Objects
|
|
81
|
+
│ └── ports/ # Interfaces (inbound e outbound)
|
|
82
|
+
├── adapters/
|
|
83
|
+
│ ├── inbound/ # Controllers, Consumers, CLI handlers
|
|
84
|
+
│ └── outbound/ # Repository impl, External Service impl
|
|
85
|
+
└── config/ # Wiring/DI configuration
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
**Ports:** Interfaces que definem contratos
|
|
89
|
+
- Inbound (driving): O que o mundo externo pode fazer com o domínio
|
|
90
|
+
- Outbound (driven): O que o domínio precisa do mundo externo
|
|
91
|
+
|
|
92
|
+
### 1.4. CQRS (Command Query Responsibility Segregation)
|
|
93
|
+
|
|
94
|
+
**Quando usar:** Quando operações de leitura e escrita têm padrões muito diferentes.
|
|
95
|
+
|
|
96
|
+
**O que especificar:**
|
|
97
|
+
```
|
|
98
|
+
Command Side:
|
|
99
|
+
- CreateOrderCommand → CreateOrderHandler → IOrderRepository
|
|
100
|
+
- Separado da leitura
|
|
101
|
+
|
|
102
|
+
Query Side:
|
|
103
|
+
- GetOrderByIdQuery → GetOrderByIdHandler → IOrderReadRepository
|
|
104
|
+
- Pode usar modelo de leitura diferente (projection)
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
**Trade-offs:**
|
|
108
|
+
- (+) Leitura e escrita otimizadas independentemente
|
|
109
|
+
- (+) Melhor escalabilidade
|
|
110
|
+
- (-) Consistência eventual (se separar modelos de dados)
|
|
111
|
+
- (-) Complexidade adicional
|
|
112
|
+
|
|
113
|
+
### 1.5. Event Sourcing
|
|
114
|
+
|
|
115
|
+
**Quando usar:** Quando o histórico de mudanças é importante para o negócio.
|
|
116
|
+
|
|
117
|
+
**O que especificar:**
|
|
118
|
+
```
|
|
119
|
+
Eventos armazenados:
|
|
120
|
+
- OrderCreated { orderId, items, total }
|
|
121
|
+
- OrderItemAdded { orderId, itemId, product, quantity }
|
|
122
|
+
- OrderPaid { orderId, paymentId, paidAt }
|
|
123
|
+
|
|
124
|
+
Snapshot: A cada N eventos, gerar snapshot do estado atual
|
|
125
|
+
Projection: Para queries, criar modelo de leitura a partir dos eventos
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
**Trade-offs:**
|
|
129
|
+
- (+) Audit trail completo
|
|
130
|
+
- (+) Time travel (reconstruir estado em qualquer ponto)
|
|
131
|
+
- (-) Complexidade elevada
|
|
132
|
+
- (-) Storage cresce continuamente
|
|
133
|
+
|
|
134
|
+
---
|
|
135
|
+
|
|
136
|
+
## 2. Padrões de Design
|
|
137
|
+
|
|
138
|
+
### 2.1. Repository Pattern
|
|
139
|
+
|
|
140
|
+
**Especificação na TechSpec:**
|
|
141
|
+
```
|
|
142
|
+
Interface: IOrderRepository (em Domain/Interfaces)
|
|
143
|
+
Métodos:
|
|
144
|
+
- AddAsync(order: Order): Promise<void>
|
|
145
|
+
- GetByIdAsync(id: UUID): Promise<Order | null>
|
|
146
|
+
- UpdateAsync(order: Order): Promise<void>
|
|
147
|
+
- GetByCustomerIdAsync(customerId: UUID, page: number, size: number): Promise<PaginatedResult<Order>>
|
|
148
|
+
|
|
149
|
+
Implementação: OrderRepository (em Infrastructure/Persistence)
|
|
150
|
+
ORM: Prisma/Dapper/EF Core (conforme padrão do projeto)
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
### 2.2. Strategy Pattern
|
|
154
|
+
|
|
155
|
+
**Quando usar:** Múltiplas variantes de um algoritmo (ex: cálculo de frete, métodos de pagamento).
|
|
156
|
+
|
|
157
|
+
```
|
|
158
|
+
Interface: IShippingCalculator
|
|
159
|
+
Estratégias: CorreiosCalculator, FedexCalculator, LocalPickupCalculator
|
|
160
|
+
Seleção: ShippingCalculatorFactory baseado em ShippingMethod
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
### 2.3. Factory Pattern
|
|
164
|
+
|
|
165
|
+
**Quando usar:** Criação de objetos complexos com validações.
|
|
166
|
+
|
|
167
|
+
```
|
|
168
|
+
Método estático: Order.Create(customerId, items) → Order
|
|
169
|
+
Validações: Items não vazio, produtos existem, estoque disponível
|
|
170
|
+
Resultado: Order válido ou lança DomainException
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
### 2.4. Observer Pattern / Event-Driven
|
|
174
|
+
|
|
175
|
+
**Quando usar:** Desacoplar produtores de consumidores de eventos.
|
|
176
|
+
|
|
177
|
+
```
|
|
178
|
+
Evento: OrderCreated
|
|
179
|
+
Produtores: CreateOrderHandler (Application)
|
|
180
|
+
Consumidores: PaymentProcessor, NotificationService, InventoryUpdater
|
|
181
|
+
Barramento: IMediatR (in-process) ou RabbitMQ (out-of-process)
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
### 2.5. Specification Pattern
|
|
185
|
+
|
|
186
|
+
**Quando usar:** Regras de negócio complexas e combináveis.
|
|
187
|
+
|
|
188
|
+
```
|
|
189
|
+
Specification: CanCancelOrderSpecification
|
|
190
|
+
- OrderStatus must be PENDING or PROCESSING
|
|
191
|
+
- Time since creation < 24 hours
|
|
192
|
+
- No payment processed yet
|
|
193
|
+
Combinação: CanCancelOrder.And(NoPaymentProcessed)
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
---
|
|
197
|
+
|
|
198
|
+
## 3. Princípios SOLID no Contexto de Specs
|
|
199
|
+
|
|
200
|
+
### Single Responsibility (SRP)
|
|
201
|
+
|
|
202
|
+
Cada componente deve ter uma razão para mudar:
|
|
203
|
+
- Handler: Processa UM comando
|
|
204
|
+
- Repository: Persiste UMA entidade
|
|
205
|
+
- Validator: Valida UM input
|
|
206
|
+
- Controller: Expõe UM conjunto de endpoints relacionados
|
|
207
|
+
|
|
208
|
+
### Open/Closed (OCP)
|
|
209
|
+
|
|
210
|
+
Estender sem modificar:
|
|
211
|
+
- Novo método de pagamento → nova classe que implementa IPaymentStrategy
|
|
212
|
+
- Novo tipo de notificação → novo classe que implementa INotificationService
|
|
213
|
+
- Sem modificar código existente
|
|
214
|
+
|
|
215
|
+
### Liskov Substitution (LSP)
|
|
216
|
+
|
|
217
|
+
Subtipos devem ser substituíveis:
|
|
218
|
+
- Se IOrderRepository tem GetByIdAsync, qualquer implementação deve retornar Order ou null
|
|
219
|
+
- Não criar implementação que lança NotImplementedException
|
|
220
|
+
|
|
221
|
+
### Interface Segregation (ISP)
|
|
222
|
+
|
|
223
|
+
Interfaces específicas e pequenas:
|
|
224
|
+
- Ruim: IOrderService com 20 métodos
|
|
225
|
+
- Bom: IOrderReader (queries) + IOrderWriter (commands)
|
|
226
|
+
|
|
227
|
+
### Dependency Inversion (DIP)
|
|
228
|
+
|
|
229
|
+
Depender de abstrações, não implementações:
|
|
230
|
+
- Handler depende de IOrderRepository (interface), não OrderRepository (implementação)
|
|
231
|
+
- Controller depende de IMediator (ou IHandler), não Handler diretamente
|
|
232
|
+
|
|
233
|
+
---
|
|
234
|
+
|
|
235
|
+
## 4. Separação de Camadas
|
|
236
|
+
|
|
237
|
+
### Matriz de Responsabilidades
|
|
238
|
+
|
|
239
|
+
| Camada | Responsável por | NÃO responsável por |
|
|
240
|
+
|:---|:---|:---|
|
|
241
|
+
| **Domain** | Entidades, Value Objects, regras de negócio, interfaces de repository | Persistência, HTTP, DI, logging |
|
|
242
|
+
| **Application** | Use cases, handlers, commands, queries, DTOs, validação de input | Acesso a DB, HTTP, frameworks |
|
|
243
|
+
| **Infrastructure** | Repositories, external services, email, storage, DB context | Regras de negócio, DTOs |
|
|
244
|
+
| **Interface** | Controllers, rotas, auth middleware, response formatting | Lógica de negócio, acesso a DB |
|
|
245
|
+
|
|
246
|
+
### Direção de Dependências
|
|
247
|
+
|
|
248
|
+
```
|
|
249
|
+
Interface → Application → Domain ← Infrastructure
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
- Interface depende de Application (chama handlers)
|
|
253
|
+
- Application depende de Domain (usa entidades e interfaces)
|
|
254
|
+
- Infrastructure depende de Domain (implementa interfaces)
|
|
255
|
+
- Domain não depende de ninguém
|
|
256
|
+
|
|
257
|
+
---
|
|
258
|
+
|
|
259
|
+
## 5. Decisões de Orquestração
|
|
260
|
+
|
|
261
|
+
### 5.1. Síncrono vs Assíncrono
|
|
262
|
+
|
|
263
|
+
**Critérios de decisão:**
|
|
264
|
+
|
|
265
|
+
| Fator | Síncrono | Assíncrono |
|
|
266
|
+
|:---|:---|:---|
|
|
267
|
+
| Latência aceitável | < 500ms | > 500ms OK |
|
|
268
|
+
| Necessidade de resposta imediata | Sim | Não |
|
|
269
|
+
| Volume de operações | Baixo/Médio | Alto |
|
|
270
|
+
| Dependência externa | Confiável | Pode falhar |
|
|
271
|
+
| Consistência | Imediata | Eventual OK |
|
|
272
|
+
|
|
273
|
+
**O que especificar na TechSpec:**
|
|
274
|
+
```
|
|
275
|
+
Decisão: Processamento assíncrono para pagamento
|
|
276
|
+
Justificativa: Payment gateway responde em média 2s (timeout em 5s).
|
|
277
|
+
PRD RF-005 requer "processamento assíncrono".
|
|
278
|
+
Padrão existente: RabbitMQ já configurado (docker-compose).
|
|
279
|
+
Fluxo: API publica OrderCreated → PaymentWorker consome → atualiza status
|
|
280
|
+
```
|
|
281
|
+
|
|
282
|
+
### 5.2. Saga Pattern
|
|
283
|
+
|
|
284
|
+
**Quando usar:** Transações que envolvem múltiplos serviços/bounded contexts.
|
|
285
|
+
|
|
286
|
+
**Choreography (event-driven):**
|
|
287
|
+
```
|
|
288
|
+
OrderService → OrderCreated event
|
|
289
|
+
PaymentService → consome OrderCreated, processa → PaymentProcessed event
|
|
290
|
+
InventoryService → consome PaymentProcessed, reserva → InventoryReserved event
|
|
291
|
+
```
|
|
292
|
+
|
|
293
|
+
**Orchestration (centralizado):**
|
|
294
|
+
```
|
|
295
|
+
OrderOrchestrator → chama PaymentService → chama InventoryService → completa
|
|
296
|
+
Se falha: OrderOrchestrator executa compensating transactions
|
|
297
|
+
```
|
|
298
|
+
|
|
299
|
+
**Trade-offs:**
|
|
300
|
+
- Choreography: Mais simples, mas difícil rastrear fluxo
|
|
301
|
+
- Orchestration: Mais controlado, mas ponto central de falha
|
|
302
|
+
|
|
303
|
+
### 5.3. Outbox Pattern
|
|
304
|
+
|
|
305
|
+
**Quando usar:** Garantir que eventos sejam publicados mesmo com falha.
|
|
306
|
+
|
|
307
|
+
```
|
|
308
|
+
1. Salvar dados + evento na mesma transação (Outbox table)
|
|
309
|
+
2. Background worker lê Outbox e publica eventos
|
|
310
|
+
3. Marca evento como publicado
|
|
311
|
+
```
|
|
312
|
+
|
|
313
|
+
**Especificação na TechSpec:**
|
|
314
|
+
- Tabela de outbox: outbox_events (id, aggregate_type, aggregate_id, event_type, payload, published_at, created_at)
|
|
315
|
+
- Worker: polling a cada N segundos
|
|
316
|
+
- Cleanup: remover eventos publicados após M dias
|