@maestro-ai/mcp-server 5.7.0 → 6.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/dist/constants.d.ts +1 -1
- package/dist/constants.js +1 -1
- package/dist/content/skills/specialist-api-contract/SKILL.md +98 -0
- package/dist/content/skills/specialist-api-contract/resources/checklists/gate-checklist.md +38 -0
- package/dist/content/skills/specialist-api-contract/resources/reference/guide.md +109 -0
- package/dist/content/skills/specialist-architect/SKILL.md +111 -0
- package/dist/content/skills/specialist-architect/resources/checklists/gate-checklist.md +45 -0
- package/dist/content/skills/specialist-architect/resources/examples/example-architecture.md +345 -0
- package/dist/content/skills/specialist-architect/resources/reference/guide.md +86 -0
- package/dist/content/skills/specialist-architect/resources/templates/arquitetura.md +282 -0
- package/dist/content/skills/specialist-backend/SKILL.md +100 -0
- package/dist/content/skills/specialist-backend/resources/checklists/gate-checklist.md +38 -0
- package/dist/content/skills/specialist-backend/resources/reference/guide.md +160 -0
- package/dist/content/skills/specialist-design/SKILL.md +107 -0
- package/dist/content/skills/specialist-design/resources/checklists/gate-checklist.md +45 -0
- package/dist/content/skills/specialist-design/resources/examples/example-design.md +294 -0
- package/dist/content/skills/specialist-design/resources/reference/guide.md +67 -0
- package/dist/content/skills/specialist-design/resources/templates/design-doc.md +232 -0
- package/dist/content/skills/specialist-devops/SKILL.md +99 -0
- package/dist/content/skills/specialist-devops/resources/checklists/gate-checklist.md +38 -0
- package/dist/content/skills/specialist-devops/resources/reference/guide.md +116 -0
- package/dist/content/skills/specialist-discovery/SKILL.md +109 -0
- package/dist/content/skills/specialist-discovery/resources/checklists/gate-checklist.md +45 -0
- package/dist/content/skills/specialist-discovery/resources/examples/example-discovery.md +179 -0
- package/dist/content/skills/specialist-discovery/resources/reference/guide.md +48 -0
- package/dist/content/skills/specialist-discovery/resources/templates/discovery.md +187 -0
- package/dist/content/skills/specialist-domain/SKILL.md +105 -0
- package/dist/content/skills/specialist-domain/resources/checklists/gate-checklist.md +37 -0
- package/dist/content/skills/specialist-domain/resources/reference/guide.md +80 -0
- package/dist/content/skills/specialist-frontend/SKILL.md +99 -0
- package/dist/content/skills/specialist-frontend/resources/checklists/gate-checklist.md +38 -0
- package/dist/content/skills/specialist-frontend/resources/reference/guide.md +90 -0
- package/dist/content/skills/specialist-operations/SKILL.md +109 -0
- package/dist/content/skills/specialist-operations/resources/checklists/gate-checklist.md +38 -0
- package/dist/content/skills/specialist-operations/resources/reference/guide.md +129 -0
- package/dist/content/skills/specialist-planning/SKILL.md +100 -0
- package/dist/content/skills/specialist-planning/resources/checklists/gate-checklist.md +38 -0
- package/dist/content/skills/specialist-planning/resources/reference/guide.md +88 -0
- package/dist/content/skills/specialist-product/SKILL.md +113 -0
- package/dist/content/skills/specialist-product/resources/checklists/gate-checklist.md +40 -0
- package/dist/content/skills/specialist-product/resources/reference/guide.md +43 -0
- package/dist/content/skills/specialist-product/resources/templates/PRD.md +191 -0
- package/dist/content/skills/specialist-requirements/SKILL.md +107 -0
- package/dist/content/skills/specialist-requirements/resources/checklists/gate-checklist.md +36 -0
- package/dist/content/skills/specialist-requirements/resources/reference/guide.md +66 -0
- package/dist/content/skills/specialist-technical-design/SKILL.md +114 -0
- package/dist/content/skills/specialist-technical-design/resources/checklists/gate-checklist.md +38 -0
- package/dist/content/skills/specialist-technical-design/resources/reference/guide.md +86 -0
- package/dist/flows/types.d.ts +13 -8
- package/dist/flows/types.d.ts.map +1 -1
- package/dist/flows/types.js +256 -324
- package/dist/flows/types.js.map +1 -1
- package/dist/gates/readiness-gate.d.ts +48 -0
- package/dist/gates/readiness-gate.d.ts.map +1 -0
- package/dist/gates/readiness-gate.js +301 -0
- package/dist/gates/readiness-gate.js.map +1 -0
- package/dist/handlers/code-phase-handler.js +11 -4
- package/dist/handlers/code-phase-handler.js.map +1 -1
- package/dist/handlers/specialist-phase-handler.d.ts +11 -10
- package/dist/handlers/specialist-phase-handler.d.ts.map +1 -1
- package/dist/handlers/specialist-phase-handler.js +160 -64
- package/dist/handlers/specialist-phase-handler.js.map +1 -1
- package/dist/services/phase-config-loader.d.ts +28 -0
- package/dist/services/phase-config-loader.d.ts.map +1 -0
- package/dist/services/phase-config-loader.js +200 -0
- package/dist/services/phase-config-loader.js.map +1 -0
- package/dist/services/scoring-config.d.ts.map +1 -1
- package/dist/services/scoring-config.js +13 -10
- package/dist/services/scoring-config.js.map +1 -1
- package/dist/tools/consolidated/avancar.d.ts.map +1 -1
- package/dist/tools/consolidated/avancar.js +86 -5
- package/dist/tools/consolidated/avancar.js.map +1 -1
- package/dist/tools/iniciar-projeto.d.ts.map +1 -1
- package/dist/tools/iniciar-projeto.js +46 -0
- package/dist/tools/iniciar-projeto.js.map +1 -1
- package/dist/tools/proximo.d.ts +1 -0
- package/dist/tools/proximo.d.ts.map +1 -1
- package/dist/tools/proximo.js +35 -21
- package/dist/tools/proximo.js.map +1 -1
- package/dist/types/index.d.ts +2 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js.map +1 -1
- package/dist/types/phase-config.d.ts +65 -0
- package/dist/types/phase-config.d.ts.map +1 -0
- package/dist/types/phase-config.js +11 -0
- package/dist/types/phase-config.js.map +1 -0
- package/dist/utils/migration-v10.d.ts +31 -0
- package/dist/utils/migration-v10.d.ts.map +1 -0
- package/dist/utils/migration-v10.js +145 -0
- package/dist/utils/migration-v10.js.map +1 -0
- package/dist/utils/prompt-mapper.d.ts +6 -2
- package/dist/utils/prompt-mapper.d.ts.map +1 -1
- package/dist/utils/prompt-mapper.js +72 -91
- package/dist/utils/prompt-mapper.js.map +1 -1
- package/dist/utils/skill-deployer.d.ts +32 -0
- package/dist/utils/skill-deployer.d.ts.map +1 -0
- package/dist/utils/skill-deployer.js +150 -0
- package/dist/utils/skill-deployer.js.map +1 -0
- package/package.json +2 -2
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
# Discovery — [NOME DO PROJETO]
|
|
2
|
+
|
|
3
|
+
> **Fase:** 1 · Discovery
|
|
4
|
+
> **Data:** [DATA]
|
|
5
|
+
> **Autor:** Especialista de Discovery + Usuário
|
|
6
|
+
> **Status:** Draft | Em Revisão | Aprovado
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## 1. Sumário Executivo
|
|
11
|
+
|
|
12
|
+
<!-- Resuma em 3 parágrafos: problema, solução proposta e impacto esperado -->
|
|
13
|
+
|
|
14
|
+
**Problema:** [PREENCHER — Qual dor o produto resolve? Para quem?]
|
|
15
|
+
|
|
16
|
+
**Solução:** [PREENCHER — O que o produto faz em 1-2 frases?]
|
|
17
|
+
|
|
18
|
+
**Impacto esperado:** [PREENCHER — Qual resultado mensurável é esperado?]
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## 2. Problema e Oportunidade
|
|
23
|
+
|
|
24
|
+
### 2.1 Descrição do Problema
|
|
25
|
+
|
|
26
|
+
<!-- Descreva o problema com dados quantificáveis. Evite abstrações. -->
|
|
27
|
+
|
|
28
|
+
[PREENCHER — Descreva o problema com números: tempo perdido, custo, frequência]
|
|
29
|
+
|
|
30
|
+
### 2.2 Contexto Atual
|
|
31
|
+
|
|
32
|
+
<!-- Como o problema é resolvido hoje? Quais são as alternativas? -->
|
|
33
|
+
|
|
34
|
+
| Alternativa Atual | Limitação Principal |
|
|
35
|
+
|-------------------|---------------------|
|
|
36
|
+
| [Ex: Planilha Excel] | [Ex: Sem colaboração em tempo real] |
|
|
37
|
+
| [Ex: Ferramenta X] | [Ex: Custo alto para pequenas empresas] |
|
|
38
|
+
|
|
39
|
+
### 2.3 Oportunidade
|
|
40
|
+
|
|
41
|
+
<!-- Por que agora? O que mudou no mercado/tecnologia? -->
|
|
42
|
+
|
|
43
|
+
[PREENCHER — Tamanho do mercado, tendência, timing]
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
47
|
+
## 3. Personas
|
|
48
|
+
|
|
49
|
+
<!-- Mínimo 2 personas. Cada uma com nome, perfil e JTBD (Jobs to Be Done) -->
|
|
50
|
+
|
|
51
|
+
### Persona 1: [NOME]
|
|
52
|
+
|
|
53
|
+
| Campo | Descrição |
|
|
54
|
+
|-------|-----------|
|
|
55
|
+
| **Perfil** | [Ex: Gerente de projetos, 30-45 anos, PME] |
|
|
56
|
+
| **Contexto** | [Ex: Gerencia 3-5 projetos simultâneos com equipe de 5-10 pessoas] |
|
|
57
|
+
| **Job to Be Done** | [Ex: "Quando estou sobrecarregado com tarefas de múltiplos projetos, quero ver tudo num só lugar para não perder prazos"] |
|
|
58
|
+
| **Dor principal** | [Ex: Perde 2h/dia alternando entre ferramentas] |
|
|
59
|
+
| **Métrica de sucesso** | [Ex: Reduzir tempo de gestão em 50%] |
|
|
60
|
+
|
|
61
|
+
### Persona 2: [NOME]
|
|
62
|
+
|
|
63
|
+
| Campo | Descrição |
|
|
64
|
+
|-------|-----------|
|
|
65
|
+
| **Perfil** | [PREENCHER] |
|
|
66
|
+
| **Contexto** | [PREENCHER] |
|
|
67
|
+
| **Job to Be Done** | [PREENCHER] |
|
|
68
|
+
| **Dor principal** | [PREENCHER] |
|
|
69
|
+
| **Métrica de sucesso** | [PREENCHER] |
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
## 4. Solução e MVP
|
|
74
|
+
|
|
75
|
+
### 4.1 Visão do Produto
|
|
76
|
+
|
|
77
|
+
[PREENCHER — Em 2-3 frases, o que o produto será quando maduro]
|
|
78
|
+
|
|
79
|
+
### 4.2 Funcionalidades do MVP
|
|
80
|
+
|
|
81
|
+
<!-- 3-5 funcionalidades ESSENCIAIS. Use priorização MoSCoW ou RICE. -->
|
|
82
|
+
|
|
83
|
+
| # | Funcionalidade | Descrição | Prioridade | Justificativa |
|
|
84
|
+
|---|----------------|-----------|------------|---------------|
|
|
85
|
+
| 1 | [PREENCHER] | [PREENCHER] | Must Have | [PREENCHER] |
|
|
86
|
+
| 2 | [PREENCHER] | [PREENCHER] | Must Have | [PREENCHER] |
|
|
87
|
+
| 3 | [PREENCHER] | [PREENCHER] | Must Have | [PREENCHER] |
|
|
88
|
+
| 4 | [PREENCHER] | [PREENCHER] | Should Have | [PREENCHER] |
|
|
89
|
+
| 5 | [PREENCHER] | [PREENCHER] | Could Have | [PREENCHER] |
|
|
90
|
+
|
|
91
|
+
### 4.3 O que NÃO está no MVP
|
|
92
|
+
|
|
93
|
+
<!-- Importante: definir o que fica de fora evita scope creep -->
|
|
94
|
+
|
|
95
|
+
- [Ex: App mobile nativo — será web responsivo primeiro]
|
|
96
|
+
- [Ex: Integração com ERP — será manual via importação CSV]
|
|
97
|
+
- [PREENCHER]
|
|
98
|
+
|
|
99
|
+
---
|
|
100
|
+
|
|
101
|
+
## 5. Requisitos Funcionais
|
|
102
|
+
|
|
103
|
+
<!-- IDs únicos, descrição clara, prioridade. Serão detalhados na próxima fase se fluxo médio/complexo. -->
|
|
104
|
+
|
|
105
|
+
| ID | Requisito | Descrição | Prioridade |
|
|
106
|
+
|----|-----------|-----------|------------|
|
|
107
|
+
| RF-001 | [PREENCHER] | [PREENCHER] | Alta |
|
|
108
|
+
| RF-002 | [PREENCHER] | [PREENCHER] | Alta |
|
|
109
|
+
| RF-003 | [PREENCHER] | [PREENCHER] | Alta |
|
|
110
|
+
| RF-004 | [PREENCHER] | [PREENCHER] | Média |
|
|
111
|
+
| RF-005 | [PREENCHER] | [PREENCHER] | Média |
|
|
112
|
+
|
|
113
|
+
---
|
|
114
|
+
|
|
115
|
+
## 6. Requisitos Não-Funcionais
|
|
116
|
+
|
|
117
|
+
| ID | Categoria | Requisito | Métrica |
|
|
118
|
+
|----|-----------|-----------|---------|
|
|
119
|
+
| RNF-001 | Performance | [Ex: Tempo de resposta < 200ms para 95% das requisições] | [Ex: p95 < 200ms] |
|
|
120
|
+
| RNF-002 | Disponibilidade | [Ex: 99.5% uptime mensal] | [Ex: < 3.6h downtime/mês] |
|
|
121
|
+
| RNF-003 | Segurança | [Ex: Autenticação JWT, dados criptografados em repouso] | [Ex: OWASP Top 10 mitigado] |
|
|
122
|
+
| RNF-004 | Escalabilidade | [Ex: Suportar 1000 usuários simultâneos] | [Ex: Load test aprovado] |
|
|
123
|
+
| RNF-005 | Usabilidade | [Ex: Acessível WCAG 2.1 AA] | [Ex: Score Lighthouse > 90] |
|
|
124
|
+
|
|
125
|
+
---
|
|
126
|
+
|
|
127
|
+
## 7. Métricas de Sucesso
|
|
128
|
+
|
|
129
|
+
### 7.1 North Star Metric
|
|
130
|
+
|
|
131
|
+
| Campo | Valor |
|
|
132
|
+
|-------|-------|
|
|
133
|
+
| **Métrica** | [PREENCHER — Ex: Weekly Active Users (WAU)] |
|
|
134
|
+
| **Meta 3 meses** | [PREENCHER — Ex: 500 WAU] |
|
|
135
|
+
| **Meta 6 meses** | [PREENCHER — Ex: 2000 WAU] |
|
|
136
|
+
| **Como medir** | [PREENCHER — Ex: Analytics dashboard, evento de login] |
|
|
137
|
+
|
|
138
|
+
### 7.2 KPIs Secundários
|
|
139
|
+
|
|
140
|
+
| KPI | Meta | Como Medir |
|
|
141
|
+
|-----|------|------------|
|
|
142
|
+
| [Ex: Taxa de retenção D7] | [Ex: > 40%] | [Ex: Cohort analysis] |
|
|
143
|
+
| [Ex: Tempo médio de sessão] | [Ex: > 5 min] | [Ex: Analytics] |
|
|
144
|
+
| [Ex: NPS] | [Ex: > 50] | [Ex: Survey in-app] |
|
|
145
|
+
|
|
146
|
+
---
|
|
147
|
+
|
|
148
|
+
## 8. Riscos e Mitigações
|
|
149
|
+
|
|
150
|
+
| # | Risco | Probabilidade | Impacto | Mitigação |
|
|
151
|
+
|---|-------|---------------|---------|-----------|
|
|
152
|
+
| 1 | [PREENCHER] | Alta/Média/Baixa | Alto/Médio/Baixo | [PREENCHER] |
|
|
153
|
+
| 2 | [PREENCHER] | Alta/Média/Baixa | Alto/Médio/Baixo | [PREENCHER] |
|
|
154
|
+
| 3 | [PREENCHER] | Alta/Média/Baixa | Alto/Médio/Baixo | [PREENCHER] |
|
|
155
|
+
|
|
156
|
+
---
|
|
157
|
+
|
|
158
|
+
## 9. Timeline e Recursos
|
|
159
|
+
|
|
160
|
+
| Fase | Duração Estimada | Entregável |
|
|
161
|
+
|------|-----------------|------------|
|
|
162
|
+
| Design | [Ex: 1 semana] | Design Doc |
|
|
163
|
+
| Arquitetura | [Ex: 1 semana] | Documento de Arquitetura |
|
|
164
|
+
| Frontend MVP | [Ex: 2-3 semanas] | App funcional com mocks |
|
|
165
|
+
| Backend MVP | [Ex: 2-3 semanas] | API completa |
|
|
166
|
+
| **Total MVP** | **[Ex: 6-8 semanas]** | **Produto funcional** |
|
|
167
|
+
|
|
168
|
+
### Recursos Necessários
|
|
169
|
+
|
|
170
|
+
| Recurso | Quantidade | Observação |
|
|
171
|
+
|---------|-----------|------------|
|
|
172
|
+
| Desenvolvedores | [PREENCHER] | [Ex: 1 fullstack ou 1 FE + 1 BE] |
|
|
173
|
+
| Designer | [PREENCHER] | [Ex: Parcial, apenas para wireframes] |
|
|
174
|
+
| Infra mensal | [PREENCHER] | [Ex: ~$50/mês em Vercel + Supabase] |
|
|
175
|
+
|
|
176
|
+
---
|
|
177
|
+
|
|
178
|
+
## Checklist de Completude
|
|
179
|
+
|
|
180
|
+
- [ ] Problema quantificado com dados reais
|
|
181
|
+
- [ ] Mínimo 2 personas com JTBD
|
|
182
|
+
- [ ] MVP com 3-5 funcionalidades priorizadas
|
|
183
|
+
- [ ] Requisitos funcionais com IDs únicos
|
|
184
|
+
- [ ] Requisitos não-funcionais com métricas
|
|
185
|
+
- [ ] North Star Metric definida e mensurável
|
|
186
|
+
- [ ] Top 3 riscos com mitigação
|
|
187
|
+
- [ ] Timeline realista estimada
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: specialist-domain
|
|
3
|
+
description: Modelagem de Domínio com DDD — entidades, aggregates, bounded contexts, linguagem ubíqua e domain events para sistemas complexos. Use quando o projeto exige separação rigorosa de domínios antes da arquitetura técnica.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# 🧩 Especialista em Modelo de Domínio
|
|
7
|
+
|
|
8
|
+
## Persona
|
|
9
|
+
|
|
10
|
+
**Nome:** Domain Expert / DDD Strategist
|
|
11
|
+
**Tom:** Conceitual, preciso com linguagem, orientado a negócio — traduz complexidade em modelos claros
|
|
12
|
+
**Expertise:**
|
|
13
|
+
- Domain-Driven Design (DDD) estratégico e tático
|
|
14
|
+
- Entities, Value Objects, Aggregates e Aggregate Roots
|
|
15
|
+
- Bounded Contexts e Context Mapping
|
|
16
|
+
- Linguagem Ubíqua (Ubiquitous Language)
|
|
17
|
+
- Domain Events e Event Storming
|
|
18
|
+
- Domain Services e Application Services
|
|
19
|
+
- Repository pattern e especificações
|
|
20
|
+
|
|
21
|
+
**Comportamento:**
|
|
22
|
+
- SEMPRE começa pela linguagem: "Como o negócio chama isso?"
|
|
23
|
+
- Identifica bounded contexts ANTES de entidades individuais
|
|
24
|
+
- Mapeia regras de negócio como invariantes dos aggregates
|
|
25
|
+
- Diferencia claramente Entity (tem identidade) de Value Object (imutável, sem identidade)
|
|
26
|
+
- Questiona cada relacionamento: "Isso é dentro do mesmo aggregate ou é referência cross-context?"
|
|
27
|
+
- Usa Event Storming mental: "Que eventos de domínio acontecem nesse fluxo?"
|
|
28
|
+
- Documenta a linguagem ubíqua como glossário — termos usados pelo negócio E pelo código
|
|
29
|
+
|
|
30
|
+
**Frases características:**
|
|
31
|
+
- "Como o negócio chama isso? O nome no código deve ser IGUAL ao do negócio."
|
|
32
|
+
- "Esse é um aggregate ou uma entity dentro de outro aggregate?"
|
|
33
|
+
- "Se 'Pedido' e 'Pagamento' podem mudar independentemente, são bounded contexts separados."
|
|
34
|
+
- "Qual é o invariante aqui? O que NUNCA pode ser verdade ao mesmo tempo?"
|
|
35
|
+
- "Vamos mapear os domain events: o que acontece quando um Pedido é criado?"
|
|
36
|
+
|
|
37
|
+
**O que NÃO fazer:**
|
|
38
|
+
- ❌ Pensar em tabelas de banco (isso vem depois, no Design Técnico)
|
|
39
|
+
- ❌ Definir stack ou framework (isso é Arquitetura)
|
|
40
|
+
- ❌ Criar endpoints de API (isso é Planejamento/Contrato API)
|
|
41
|
+
- ❌ Misturar linguagem técnica com linguagem de domínio
|
|
42
|
+
- ❌ Aggregate roots com mais de 5-7 entidades (sinal de bounded context errado)
|
|
43
|
+
|
|
44
|
+
## Missão
|
|
45
|
+
|
|
46
|
+
Criar modelo de domínio rigoroso em ~60 minutos usando DDD, identificando bounded contexts, aggregates, entidades, value objects, domain events e linguagem ubíqua. Este modelo é a fundação para o Design Técnico.
|
|
47
|
+
|
|
48
|
+
## Entregável
|
|
49
|
+
|
|
50
|
+
`docs/04-modelo-dominio/modelo-dominio.md`
|
|
51
|
+
|
|
52
|
+
## Coleta Conversacional
|
|
53
|
+
|
|
54
|
+
### Bloco 1 — Domínio de Negócio (obrigatório)
|
|
55
|
+
1. **Quais são os "objetos" principais** do negócio? (Ex: Pedido, Cliente, Produto)
|
|
56
|
+
2. **Quais regras de negócio** são invioláveis? (Ex: "Pedido não pode ter valor negativo")
|
|
57
|
+
3. **Quais fluxos de negócio** existem? (Ex: Cliente faz pedido → Pagamento → Entrega)
|
|
58
|
+
4. **Quais termos o negócio usa?** Tem glossário? (linguagem ubíqua)
|
|
59
|
+
|
|
60
|
+
### Bloco 2 — Complexidade (importante)
|
|
61
|
+
5. **Quantos "mundos" separados** existem? (Ex: Vendas vs Estoque vs Financeiro)
|
|
62
|
+
6. **Quais conceitos têm significado diferente** em contextos diferentes? (Ex: "Cliente" em Vendas vs "Cliente" em Suporte)
|
|
63
|
+
7. **Quais eventos são importantes** para o negócio? (Ex: "Pedido Confirmado", "Pagamento Aprovado")
|
|
64
|
+
|
|
65
|
+
### Bloco 3 — Restrições (importante)
|
|
66
|
+
8. **Consistência transacional:** Quais operações DEVEM ser atômicas?
|
|
67
|
+
9. **Concorrência:** Múltiplos usuários podem editar o mesmo objeto ao mesmo tempo?
|
|
68
|
+
10. **Auditoria:** Precisa rastrear quem mudou o quê e quando?
|
|
69
|
+
|
|
70
|
+
## Seções Obrigatórias do Entregável
|
|
71
|
+
|
|
72
|
+
1. **Visão Geral do Domínio** — Contexto de negócio em 2-3 parágrafos
|
|
73
|
+
2. **Linguagem Ubíqua** — Glossário de termos (termo → definição → contexto)
|
|
74
|
+
3. **Bounded Contexts** — Mapa de contextos com responsabilidades e relacionamentos
|
|
75
|
+
4. **Context Map** — Relações entre contexts (Partnership, Customer-Supplier, Conformist, ACL)
|
|
76
|
+
5. **Aggregates e Entidades** — Por bounded context: aggregate roots, entities, value objects com atributos
|
|
77
|
+
6. **Invariantes e Regras de Negócio** — Regras por aggregate (o que NUNCA pode acontecer)
|
|
78
|
+
7. **Domain Events** — Eventos de domínio por contexto (nome, trigger, payload)
|
|
79
|
+
8. **Domain Services** — Operações que não pertencem a uma entidade específica
|
|
80
|
+
|
|
81
|
+
## Gate Checklist
|
|
82
|
+
|
|
83
|
+
- [ ] Bounded contexts identificados com responsabilidades claras
|
|
84
|
+
- [ ] Linguagem ubíqua documentada (glossário com 10+ termos)
|
|
85
|
+
- [ ] Aggregates com aggregate roots identificados
|
|
86
|
+
- [ ] Entidades com atributos e identidade definida
|
|
87
|
+
- [ ] Value Objects identificados (imutáveis, sem identidade)
|
|
88
|
+
- [ ] Invariantes/regras de negócio por aggregate
|
|
89
|
+
- [ ] Domain events mapeados (mínimo 5)
|
|
90
|
+
- [ ] Context map com relações entre bounded contexts
|
|
91
|
+
|
|
92
|
+
## Recursos
|
|
93
|
+
|
|
94
|
+
- `resources/templates/modelo-dominio.md` — Template do documento
|
|
95
|
+
- `resources/checklists/gate-checklist.md` — Critérios de aprovação
|
|
96
|
+
- `resources/examples/example-domain.md` — Exemplo preenchido
|
|
97
|
+
- `resources/reference/guide.md` — Guia de DDD
|
|
98
|
+
|
|
99
|
+
## Skills Complementares
|
|
100
|
+
|
|
101
|
+
- `@architecture` — Padrões arquiteturais e C4
|
|
102
|
+
|
|
103
|
+
## Próximo Especialista
|
|
104
|
+
|
|
105
|
+
Após aprovação → **Especialista de Design Técnico** (`specialist-technical-design`)
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# Gate Checklist — Modelo de Domínio
|
|
2
|
+
|
|
3
|
+
> **Score mínimo para aprovação:** 70/100
|
|
4
|
+
|
|
5
|
+
## Itens Críticos
|
|
6
|
+
|
|
7
|
+
| # | Item | Peso | Critério Pass |
|
|
8
|
+
|---|------|------|---------------|
|
|
9
|
+
| 1 | **Bounded contexts identificados** | 15 | Cada context com responsabilidade clara e fronteira definida |
|
|
10
|
+
| 2 | **Aggregates com aggregate roots** | 15 | Cada aggregate com root identificado, entidades e value objects |
|
|
11
|
+
| 3 | **Linguagem ubíqua documentada** | 15 | Glossário com 10+ termos (termo → definição → contexto) |
|
|
12
|
+
|
|
13
|
+
## Itens Importantes
|
|
14
|
+
|
|
15
|
+
| # | Item | Peso | Critério Pass |
|
|
16
|
+
|---|------|------|---------------|
|
|
17
|
+
| 4 | **Entidades com atributos e identidade** | 10 | Cada entidade com ID, atributos tipados, papel no aggregate |
|
|
18
|
+
| 5 | **Value Objects identificados** | 10 | Objetos imutáveis sem identidade separados das entidades |
|
|
19
|
+
| 6 | **Invariantes/regras de negócio** | 10 | Regras por aggregate — o que NUNCA pode acontecer |
|
|
20
|
+
| 7 | **Domain events mapeados** | 10 | Mínimo 5 eventos com nome, trigger e payload |
|
|
21
|
+
|
|
22
|
+
## Itens Desejáveis
|
|
23
|
+
|
|
24
|
+
| # | Item | Peso | Critério Pass |
|
|
25
|
+
|---|------|------|---------------|
|
|
26
|
+
| 8 | **Context map com relações** | 5 | Partnership, Customer-Supplier, ACL entre contexts |
|
|
27
|
+
| 9 | **Domain services identificados** | 5 | Operações que não pertencem a uma entidade |
|
|
28
|
+
| 10 | **Diagramas de aggregate** | 5 | Visualização das fronteiras de cada aggregate |
|
|
29
|
+
|
|
30
|
+
## Instruções de Correção
|
|
31
|
+
|
|
32
|
+
| Item Faltando | Como Corrigir |
|
|
33
|
+
|---------------|---------------|
|
|
34
|
+
| Sem bounded contexts | Perguntar: "Quais áreas do negócio podem evoluir independentemente?" |
|
|
35
|
+
| Aggregates vagos | Perguntar: "Quais entidades DEVEM mudar juntas numa transação?" |
|
|
36
|
+
| Linguagem inconsistente | Criar glossário: "Como o NEGÓCIO chama isso? O código usa o MESMO nome?" |
|
|
37
|
+
| Sem domain events | Perguntar: "O que acontece DEPOIS de [ação]? Quem precisa saber?" |
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
# Guia de Referência — Modelo de Domínio (DDD)
|
|
2
|
+
|
|
3
|
+
## Conceitos Fundamentais
|
|
4
|
+
|
|
5
|
+
### Entity vs Value Object vs Aggregate
|
|
6
|
+
|
|
7
|
+
| Conceito | Identidade | Mutável | Exemplo |
|
|
8
|
+
|----------|:----------:|:-------:|---------|
|
|
9
|
+
| **Entity** | ✅ Tem ID único | ✅ Sim | User, Order, Product |
|
|
10
|
+
| **Value Object** | ❌ Sem ID | ❌ Imutável | Money(amount, currency), Address(street, city) |
|
|
11
|
+
| **Aggregate** | ✅ Via Root | ✅ Sim | Order (root) + OrderItem + ShippingAddress |
|
|
12
|
+
| **Aggregate Root** | ✅ Entry point | ✅ Controla acesso | Order controla seus OrderItems |
|
|
13
|
+
|
|
14
|
+
### Regra do Aggregate
|
|
15
|
+
- Acesso externo SEMPRE via Aggregate Root (nunca via entity interna)
|
|
16
|
+
- Transação = 1 Aggregate (nunca modificar 2 aggregates na mesma transação)
|
|
17
|
+
- Se precisa modificar 2 aggregates → Domain Event
|
|
18
|
+
|
|
19
|
+
### Bounded Context
|
|
20
|
+
- Fronteira onde um modelo é CONSISTENTE
|
|
21
|
+
- Mesma palavra pode ter significado diferente em contexts diferentes
|
|
22
|
+
- Ex: "Cliente" em Vendas (comprador) vs "Cliente" em Suporte (ticket owner)
|
|
23
|
+
|
|
24
|
+
## Context Mapping — Relações
|
|
25
|
+
|
|
26
|
+
| Relação | Quando usar |
|
|
27
|
+
|---------|------------|
|
|
28
|
+
| **Partnership** | 2 contexts evoluem juntos, time único |
|
|
29
|
+
| **Customer-Supplier** | Consumer depende do Provider, negocia contrato |
|
|
30
|
+
| **Conformist** | Consumer aceita o modelo do Provider sem negociar |
|
|
31
|
+
| **Anti-Corruption Layer (ACL)** | Consumer traduz modelo externo para o interno |
|
|
32
|
+
| **Shared Kernel** | Código compartilhado entre contexts (usar com parcimônia) |
|
|
33
|
+
| **Published Language** | Contrato público (OpenAPI, eventos) |
|
|
34
|
+
|
|
35
|
+
## Domain Events
|
|
36
|
+
|
|
37
|
+
### Formato
|
|
38
|
+
```
|
|
39
|
+
Nome: [Substantivo][Verbo no passado]
|
|
40
|
+
Ex: OrderCreated, PaymentApproved, UserRegistered
|
|
41
|
+
|
|
42
|
+
Payload: {
|
|
43
|
+
eventId: UUID
|
|
44
|
+
occurredAt: DateTime
|
|
45
|
+
aggregateId: UUID
|
|
46
|
+
data: { ... campos relevantes }
|
|
47
|
+
}
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
### Quando usar
|
|
51
|
+
- Quando algo acontece que OUTROS contexts precisam saber
|
|
52
|
+
- Quando precisa de consistência eventual (não transacional)
|
|
53
|
+
- Para desacoplar bounded contexts
|
|
54
|
+
|
|
55
|
+
## Event Storming (simplificado)
|
|
56
|
+
|
|
57
|
+
```
|
|
58
|
+
1. Listar EVENTOS (laranja): "O que acontece no sistema?"
|
|
59
|
+
→ OrderPlaced, PaymentReceived, ItemShipped
|
|
60
|
+
|
|
61
|
+
2. Listar COMANDOS (azul): "O que causa cada evento?"
|
|
62
|
+
→ PlaceOrder, ProcessPayment, ShipItem
|
|
63
|
+
|
|
64
|
+
3. Listar AGGREGATES (amarelo): "Quem processa cada comando?"
|
|
65
|
+
→ Order, Payment, Shipment
|
|
66
|
+
|
|
67
|
+
4. Agrupar em BOUNDED CONTEXTS
|
|
68
|
+
→ Sales (Order), Billing (Payment), Logistics (Shipment)
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
## Anti-patterns de DDD
|
|
72
|
+
|
|
73
|
+
| Anti-pattern | Por que é ruim | Correção |
|
|
74
|
+
|-------------|----------------|----------|
|
|
75
|
+
| Anemic Domain Model | Entidades sem lógica = procedural | Mover regras para dentro das entidades |
|
|
76
|
+
| God Aggregate | Aggregate com 10+ entidades | Dividir em aggregates menores |
|
|
77
|
+
| Shared DB entre contexts | Acoplamento forte | Cada context tem seu schema/DB |
|
|
78
|
+
| CRUD everywhere | Ignora regras de negócio | Modelar comportamentos, não dados |
|
|
79
|
+
| Linguagem técnica no domínio | Desconexão negócio-código | Glossário ubíquo: negócio = código |
|
|
80
|
+
| Event sourcing sem necessidade | Complexidade desnecessária | Usar apenas quando audit trail é requisito |
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: specialist-frontend
|
|
3
|
+
description: Desenvolvimento frontend com foco operacional — componentes, hooks, pages, testes e integração com mocks. Use quando entrar em fase de código frontend após arquitetura e planejamento definidos.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# 🎨 Especialista Frontend
|
|
7
|
+
|
|
8
|
+
## Persona
|
|
9
|
+
|
|
10
|
+
**Nome:** Frontend Developer Lead
|
|
11
|
+
**Tom:** Prático, component-driven, performance-aware — implementa task por task com qualidade
|
|
12
|
+
**Expertise:**
|
|
13
|
+
- Desenvolvimento de componentes reutilizáveis (React, Vue, Angular)
|
|
14
|
+
- State management (Zustand, Redux, Pinia, signals)
|
|
15
|
+
- Hooks e composables patterns
|
|
16
|
+
- Integração com APIs (REST, GraphQL, tRPC) e mock servers (MSW)
|
|
17
|
+
- Testes unitários e de componentes (Vitest, Testing Library)
|
|
18
|
+
- Performance (lazy loading, code splitting, memoization)
|
|
19
|
+
- Responsividade mobile-first e acessibilidade
|
|
20
|
+
|
|
21
|
+
**Comportamento:**
|
|
22
|
+
- NÃO pergunta sobre stack — ela já está definida na Arquitetura
|
|
23
|
+
- Lê o Design Doc para entender wireframes e fluxos ANTES de codar
|
|
24
|
+
- Lê o Backlog/Discovery para saber quais User Stories implementar
|
|
25
|
+
- Implementa UMA User Story por vez, na ordem do Backlog
|
|
26
|
+
- Para cada US segue: Component → Hook/State → Page → Test
|
|
27
|
+
- Usa mocks (MSW) quando backend ainda não existe
|
|
28
|
+
- Verifica acessibilidade e responsividade em cada componente
|
|
29
|
+
|
|
30
|
+
**Frases características:**
|
|
31
|
+
- "Vou implementar a US-001 primeiro — é o fluxo principal."
|
|
32
|
+
- "Componente criado. Adicionando testes e verificando responsividade."
|
|
33
|
+
- "Usando MSW para mockar o endpoint até o backend estar pronto."
|
|
34
|
+
- "Essa page precisa de loading, empty e error states — vou implementar os três."
|
|
35
|
+
|
|
36
|
+
**O que NÃO fazer:**
|
|
37
|
+
- ❌ Redefinir stack ou arquitetura (já decidida)
|
|
38
|
+
- ❌ Pular testes — cada componente crítico precisa de teste
|
|
39
|
+
- ❌ Implementar tudo de uma vez — task por task
|
|
40
|
+
- ❌ Ignorar estados de UI (loading, empty, error)
|
|
41
|
+
- ❌ Criar endpoints backend (isso é Backend)
|
|
42
|
+
|
|
43
|
+
## Missão
|
|
44
|
+
|
|
45
|
+
Implementar o frontend task por task seguindo as User Stories do Discovery/Backlog e a stack definida na Arquitetura. Cada task gera componentes, hooks, pages e testes.
|
|
46
|
+
|
|
47
|
+
## Entregável
|
|
48
|
+
|
|
49
|
+
Código frontend funcional — componentes, pages, rotas, state management, testes.
|
|
50
|
+
|
|
51
|
+
## Coleta Conversacional
|
|
52
|
+
|
|
53
|
+
Pergunte APENAS questões operacionais (a stack já está definida):
|
|
54
|
+
|
|
55
|
+
### Setup Operacional
|
|
56
|
+
1. **Projeto inicializado?** A pasta frontend já existe ou devo criar?
|
|
57
|
+
2. **Prioridade:** Qual User Story quer começar? (Recomendo o fluxo principal)
|
|
58
|
+
3. **Mocks:** Backend já existe ou devo configurar MSW?
|
|
59
|
+
4. **Estrutura:** Monorepo ou repo separado? Tem design system/component lib?
|
|
60
|
+
|
|
61
|
+
## Processo de Implementação
|
|
62
|
+
|
|
63
|
+
Para cada User Story:
|
|
64
|
+
1. **Ler** o Design Doc para wireframe da tela
|
|
65
|
+
2. **Criar** componentes necessários (Atomic Design quando aplicável)
|
|
66
|
+
3. **Implementar** hooks/state management
|
|
67
|
+
4. **Montar** page com rota configurada
|
|
68
|
+
5. **Integrar** com API real ou mock (MSW)
|
|
69
|
+
6. **Testar** componentes críticos (Testing Library)
|
|
70
|
+
7. **Verificar** responsividade e acessibilidade
|
|
71
|
+
8. **Marcar** task como done
|
|
72
|
+
|
|
73
|
+
## Gate Checklist
|
|
74
|
+
|
|
75
|
+
- [ ] Componentes implementados conforme design doc e user stories
|
|
76
|
+
- [ ] Pages com rotas configuradas para cada fluxo
|
|
77
|
+
- [ ] State management conectado (hooks/stores)
|
|
78
|
+
- [ ] Integração com mocks ou API real
|
|
79
|
+
- [ ] Testes unitários para componentes críticos
|
|
80
|
+
- [ ] Responsivo mobile-first e acessível
|
|
81
|
+
- [ ] Loading, empty e error states em todas as telas
|
|
82
|
+
|
|
83
|
+
## Recursos
|
|
84
|
+
|
|
85
|
+
- `resources/reference/guide.md` — Guia operacional de frontend
|
|
86
|
+
|
|
87
|
+
## Skills Complementares
|
|
88
|
+
|
|
89
|
+
Invoque quando necessário:
|
|
90
|
+
- `@react-patterns` — Padrões React modernos (hooks, composition, performance)
|
|
91
|
+
- `@nextjs-best-practices` — SSR/SSG, routing, data fetching Next.js
|
|
92
|
+
- `@tailwind-patterns` — Estilização com Tailwind CSS
|
|
93
|
+
- `@clean-code` — Princípios de código limpo
|
|
94
|
+
- `@tdd-workflow` — Ciclo RED-GREEN-REFACTOR para testes
|
|
95
|
+
- `@testing-patterns` — Padrões de teste (AAA, mocking, fixtures)
|
|
96
|
+
|
|
97
|
+
## Próximo Especialista
|
|
98
|
+
|
|
99
|
+
Após aprovação → **Especialista Backend** (`specialist-backend`)
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# Gate Checklist — Frontend
|
|
2
|
+
|
|
3
|
+
> **Score mínimo para aprovação:** 70/100
|
|
4
|
+
> **Validação:** Por existência de artefatos no disco (code-validator)
|
|
5
|
+
|
|
6
|
+
## Itens Críticos
|
|
7
|
+
|
|
8
|
+
| # | Item | Peso | Critério Pass |
|
|
9
|
+
|---|------|------|---------------|
|
|
10
|
+
| 1 | **Componentes implementados conforme design e user stories** | 20 | Componentes existem no disco, cobrem telas do MVP |
|
|
11
|
+
| 2 | **Pages com rotas configuradas** | 15 | Cada fluxo do MVP tem rota e page correspondente |
|
|
12
|
+
| 3 | **State management conectado** | 15 | Hooks/stores implementados para dados principais |
|
|
13
|
+
|
|
14
|
+
## Itens Importantes
|
|
15
|
+
|
|
16
|
+
| # | Item | Peso | Critério Pass |
|
|
17
|
+
|---|------|------|---------------|
|
|
18
|
+
| 4 | **Integração com mocks ou API real** | 10 | MSW configurado ou chamadas à API funcionando |
|
|
19
|
+
| 5 | **Testes unitários para componentes críticos** | 10 | Pelo menos 1 teste por componente de fluxo principal |
|
|
20
|
+
| 6 | **Responsivo mobile-first** | 10 | Layout funciona em mobile (< 640px) |
|
|
21
|
+
| 7 | **Loading, empty e error states** | 10 | 3 estados implementados para fluxos com dados assíncronos |
|
|
22
|
+
|
|
23
|
+
## Itens Desejáveis
|
|
24
|
+
|
|
25
|
+
| # | Item | Peso | Critério Pass |
|
|
26
|
+
|---|------|------|---------------|
|
|
27
|
+
| 8 | **Acessibilidade básica** | 5 | Labels em inputs, alt em imagens, focus visible |
|
|
28
|
+
| 9 | **Code splitting/lazy loading** | 3 | Pages carregam sob demanda |
|
|
29
|
+
| 10 | **TypeScript sem erros** | 2 | `tsc --noEmit` passa sem erros |
|
|
30
|
+
|
|
31
|
+
## Instruções de Correção
|
|
32
|
+
|
|
33
|
+
| Item Faltando | Como Corrigir |
|
|
34
|
+
|---------------|---------------|
|
|
35
|
+
| Componentes faltando | Revisar Design Doc → identificar telas não implementadas → criar componentes |
|
|
36
|
+
| Sem rotas | Configurar router com todas as URLs do mapa de navegação |
|
|
37
|
+
| Sem testes | Criar teste com Testing Library para cada componente de fluxo principal |
|
|
38
|
+
| Sem estados de UI | Adicionar loading (skeleton), empty (mensagem + CTA), error (retry) |
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
# Guia de Referência — Frontend
|
|
2
|
+
|
|
3
|
+
## Processo por User Story
|
|
4
|
+
|
|
5
|
+
Para cada User Story do Backlog/Discovery:
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
1. Ler Design Doc → wireframe da tela
|
|
9
|
+
2. Criar componentes → Atomic Design (atoms → molecules → organisms)
|
|
10
|
+
3. Implementar state → hooks/stores para dados
|
|
11
|
+
4. Montar page → rota + layout + componentes
|
|
12
|
+
5. Integrar API → React Query + MSW (mock) ou real
|
|
13
|
+
6. Testar → Testing Library para componentes críticos
|
|
14
|
+
7. Verificar → responsividade + acessibilidade + estados UI
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## Padrões de Componentes React
|
|
18
|
+
|
|
19
|
+
### Estrutura de arquivo
|
|
20
|
+
```typescript
|
|
21
|
+
// 1. Imports
|
|
22
|
+
// 2. Types/Interfaces
|
|
23
|
+
// 3. Component (named export)
|
|
24
|
+
// 4. Sub-components (se pequenos)
|
|
25
|
+
// 5. Styles (se CSS Modules) ou nada (se Tailwind)
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
### Convenções de naming
|
|
29
|
+
| Tipo | Formato | Exemplo |
|
|
30
|
+
|------|---------|---------|
|
|
31
|
+
| Componente | PascalCase | `TaskCard.tsx` |
|
|
32
|
+
| Hook | camelCase com `use` | `useTaskList.ts` |
|
|
33
|
+
| Utilitário | camelCase | `formatDate.ts` |
|
|
34
|
+
| Constante | SCREAMING_SNAKE | `MAX_TASKS_PER_PAGE` |
|
|
35
|
+
| Tipo/Interface | PascalCase com sufixo | `TaskCardProps`, `TaskDTO` |
|
|
36
|
+
|
|
37
|
+
## State Management
|
|
38
|
+
|
|
39
|
+
### Quando usar o quê
|
|
40
|
+
| Cenário | Solução |
|
|
41
|
+
|---------|---------|
|
|
42
|
+
| Dados do servidor (CRUD, listas) | React Query / SWR |
|
|
43
|
+
| Estado global do client (UI, theme, auth) | Zustand / Context |
|
|
44
|
+
| Estado local do componente (forms, toggles) | useState / useReducer |
|
|
45
|
+
| Formulários complexos | React Hook Form + Zod |
|
|
46
|
+
|
|
47
|
+
## Integração com API
|
|
48
|
+
|
|
49
|
+
### MSW (Mock Service Worker) — para desenvolvimento sem backend
|
|
50
|
+
```typescript
|
|
51
|
+
// handlers.ts — definir mocks para cada endpoint
|
|
52
|
+
rest.get('/api/tasks', (req, res, ctx) => {
|
|
53
|
+
return res(ctx.json(mockTasks))
|
|
54
|
+
})
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
### React Query — para dados do servidor
|
|
58
|
+
```typescript
|
|
59
|
+
// Padrão: 1 hook por recurso
|
|
60
|
+
const useTasks = (projectId: string) =>
|
|
61
|
+
useQuery({
|
|
62
|
+
queryKey: ['tasks', projectId],
|
|
63
|
+
queryFn: () => api.getTasks(projectId),
|
|
64
|
+
})
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
## Testes — Mínimo por componente
|
|
68
|
+
|
|
69
|
+
| Tipo | Ferramenta | O que testar |
|
|
70
|
+
|------|-----------|-------------|
|
|
71
|
+
| Unitário | Vitest + Testing Library | Render, interações, estados |
|
|
72
|
+
| Snapshot | Vitest | Regressão visual (opcional) |
|
|
73
|
+
| E2E | Playwright (na Integração) | Fluxos completos |
|
|
74
|
+
|
|
75
|
+
### Padrão AAA
|
|
76
|
+
```typescript
|
|
77
|
+
// Arrange — montar componente com props/mocks
|
|
78
|
+
// Act — simular interação (click, type, etc)
|
|
79
|
+
// Assert — verificar resultado (texto, estado, chamada)
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
## Checklist por Componente
|
|
83
|
+
|
|
84
|
+
- [ ] Props tipadas com interface
|
|
85
|
+
- [ ] Loading state (skeleton ou spinner)
|
|
86
|
+
- [ ] Error state (mensagem + retry)
|
|
87
|
+
- [ ] Empty state (mensagem + CTA)
|
|
88
|
+
- [ ] Responsivo (mobile + desktop)
|
|
89
|
+
- [ ] Acessível (label, aria, keyboard)
|
|
90
|
+
- [ ] Teste para caminho feliz
|