@maestro-ai/cli 1.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/README.md +59 -0
- package/content/guides/Cat/303/241logo de Stacks para Cloud Moderna.md" +119 -0
- package/content/guides/Cat/303/241logo de Stacks para Hospedagem Compartilhada.md" +147 -0
- package/content/guides/Checklist Mestre de Entrega.md +68 -0
- package/content/guides/Gates de Qualidade.md +209 -0
- package/content/guides/Guia de Adi/303/247/303/243o de Novas Funcionalidades.md" +355 -0
- package/content/guides/Guia de Chaos Engineering.md +267 -0
- package/content/guides/Guia de Debugging com IA.md +135 -0
- package/content/guides/Guia de Estrat/303/251gias de Cache.md" +352 -0
- package/content/guides/Guia de Migrations Zero-Downtime.md +311 -0
- package/content/guides/Guia de Multi-tenancy.md +368 -0
- package/content/guides/Guia de Otimiza/303/247/303/243o de Custos Cloud.md" +195 -0
- package/content/guides/Guia de Refatora/303/247/303/243o de C/303/263digo Legado com IA.md" +162 -0
- package/content/guides/Guia de SLOs e Error Budgets.md +315 -0
- package/content/guides/M/303/251tricas de Efici/303/252ncia do Desenvolvimento com IA.md" +93 -0
- package/content/guides/Rules base.md +90 -0
- package/content/prompts/README.md +203 -0
- package/content/prompts/acessibilidade/analise-acessibilidade.md +257 -0
- package/content/prompts/apis/design-api-rest.md +303 -0
- package/content/prompts/apis/idempotencia.md +254 -0
- package/content/prompts/apis/versionamento.md +313 -0
- package/content/prompts/arquitetura/arquitetura-c4-completo.md +190 -0
- package/content/prompts/arquitetura/clean-architecture.md +151 -0
- package/content/prompts/arquitetura/ddd-bounded-contexts.md +183 -0
- package/content/prompts/arquitetura/ddd-cqrs.md +176 -0
- package/content/prompts/arquitetura/modelo-dominio.md +207 -0
- package/content/prompts/arquitetura/multi-tenancy.md +235 -0
- package/content/prompts/database/migrations-zero-downtime.md +192 -0
- package/content/prompts/database/otimizacao-queries.md +296 -0
- package/content/prompts/desenvolvimento/code-review.md +301 -0
- package/content/prompts/desenvolvimento/gerar-servico.md +271 -0
- package/content/prompts/devops/docker-compose.md +336 -0
- package/content/prompts/devops/feature-flags.md +374 -0
- package/content/prompts/devops/kubernetes-deploy.md +460 -0
- package/content/prompts/devops/pipeline-cicd.md +358 -0
- package/content/prompts/devops/terraform-iac.md +502 -0
- package/content/prompts/escalabilidade/analise-performance.md +240 -0
- package/content/prompts/escalabilidade/analise-performance.txt +94 -0
- package/content/prompts/escalabilidade/caching.md +255 -0
- package/content/prompts/observabilidade/chaos-testing.md +237 -0
- package/content/prompts/observabilidade/estrategia-observabilidade.md +263 -0
- package/content/prompts/observabilidade/estrategia-observabilidade.txt +134 -0
- package/content/prompts/observabilidade/slos.md +215 -0
- package/content/prompts/produto/discovery-inicial.md +203 -0
- package/content/prompts/produto/discovery-inicial.txt +33 -0
- package/content/prompts/requisitos/refinar-requisitos.md +232 -0
- package/content/prompts/requisitos/refinar-requisitos.txt +40 -0
- package/content/prompts/seguranca/analise-seguranca.md +243 -0
- package/content/prompts/seguranca/pentest-checklist.md +333 -0
- package/content/prompts/seguranca/rate-limiting.md +356 -0
- package/content/prompts/seguranca/revisao-lgpd.md +227 -0
- package/content/prompts/seguranca/threat-modeling.md +224 -0
- package/content/prompts/testes/contract-testing.md +340 -0
- package/content/prompts/testes/gerar-testes-unitarios.md +474 -0
- package/content/prompts/testes/testes-e2e.md +460 -0
- package/content/prompts/testes/testes-integracao.md +418 -0
- package/content/prompts/testes/testes-performance.md +458 -0
- package/content/prompts/ux/gerar-ui-stitch.md +151 -0
- package/content/skills/api-patterns/SKILL.md +81 -0
- package/content/skills/api-patterns/api-style.md +42 -0
- package/content/skills/api-patterns/auth.md +24 -0
- package/content/skills/api-patterns/documentation.md +26 -0
- package/content/skills/api-patterns/graphql.md +41 -0
- package/content/skills/api-patterns/rate-limiting.md +31 -0
- package/content/skills/api-patterns/response.md +37 -0
- package/content/skills/api-patterns/rest.md +40 -0
- package/content/skills/api-patterns/scripts/api_validator.py +211 -0
- package/content/skills/api-patterns/security-testing.md +122 -0
- package/content/skills/api-patterns/trpc.md +41 -0
- package/content/skills/api-patterns/versioning.md +22 -0
- package/content/skills/app-builder/SKILL.md +75 -0
- package/content/skills/app-builder/agent-coordination.md +71 -0
- package/content/skills/app-builder/feature-building.md +53 -0
- package/content/skills/app-builder/project-detection.md +34 -0
- package/content/skills/app-builder/scaffolding.md +118 -0
- package/content/skills/app-builder/tech-stack.md +40 -0
- package/content/skills/app-builder/templates/SKILL.md +39 -0
- package/content/skills/app-builder/templates/astro-static/TEMPLATE.md +76 -0
- package/content/skills/app-builder/templates/chrome-extension/TEMPLATE.md +92 -0
- package/content/skills/app-builder/templates/cli-tool/TEMPLATE.md +88 -0
- package/content/skills/app-builder/templates/electron-desktop/TEMPLATE.md +88 -0
- package/content/skills/app-builder/templates/express-api/TEMPLATE.md +83 -0
- package/content/skills/app-builder/templates/flutter-app/TEMPLATE.md +90 -0
- package/content/skills/app-builder/templates/monorepo-turborepo/TEMPLATE.md +90 -0
- package/content/skills/app-builder/templates/nextjs-fullstack/TEMPLATE.md +82 -0
- package/content/skills/app-builder/templates/nextjs-saas/TEMPLATE.md +100 -0
- package/content/skills/app-builder/templates/nextjs-static/TEMPLATE.md +106 -0
- package/content/skills/app-builder/templates/nuxt-app/TEMPLATE.md +101 -0
- package/content/skills/app-builder/templates/python-fastapi/TEMPLATE.md +83 -0
- package/content/skills/app-builder/templates/react-native-app/TEMPLATE.md +93 -0
- package/content/skills/architecture/SKILL.md +55 -0
- package/content/skills/architecture/context-discovery.md +43 -0
- package/content/skills/architecture/examples.md +94 -0
- package/content/skills/architecture/pattern-selection.md +68 -0
- package/content/skills/architecture/patterns-reference.md +50 -0
- package/content/skills/architecture/trade-off-analysis.md +77 -0
- package/content/skills/bash-linux/SKILL.md +199 -0
- package/content/skills/behavioral-modes/SKILL.md +242 -0
- package/content/skills/brainstorming/SKILL.md +163 -0
- package/content/skills/brainstorming/dynamic-questioning.md +350 -0
- package/content/skills/clean-code/SKILL.md +201 -0
- package/content/skills/code-review-checklist/SKILL.md +109 -0
- package/content/skills/database-design/SKILL.md +52 -0
- package/content/skills/database-design/database-selection.md +43 -0
- package/content/skills/database-design/indexing.md +39 -0
- package/content/skills/database-design/migrations.md +48 -0
- package/content/skills/database-design/optimization.md +36 -0
- package/content/skills/database-design/orm-selection.md +30 -0
- package/content/skills/database-design/schema-design.md +56 -0
- package/content/skills/database-design/scripts/schema_validator.py +172 -0
- package/content/skills/deployment-procedures/SKILL.md +241 -0
- package/content/skills/doc.md +177 -0
- package/content/skills/documentation-templates/SKILL.md +194 -0
- package/content/skills/frontend-design/SKILL.md +396 -0
- package/content/skills/frontend-design/animation-guide.md +331 -0
- package/content/skills/frontend-design/color-system.md +311 -0
- package/content/skills/frontend-design/decision-trees.md +418 -0
- package/content/skills/frontend-design/motion-graphics.md +306 -0
- package/content/skills/frontend-design/scripts/accessibility_checker.py +183 -0
- package/content/skills/frontend-design/scripts/ux_audit.py +722 -0
- package/content/skills/frontend-design/typography-system.md +345 -0
- package/content/skills/frontend-design/ux-psychology.md +541 -0
- package/content/skills/frontend-design/visual-effects.md +383 -0
- package/content/skills/game-development/2d-games/SKILL.md +119 -0
- package/content/skills/game-development/3d-games/SKILL.md +135 -0
- package/content/skills/game-development/SKILL.md +167 -0
- package/content/skills/game-development/game-art/SKILL.md +185 -0
- package/content/skills/game-development/game-audio/SKILL.md +190 -0
- package/content/skills/game-development/game-design/SKILL.md +129 -0
- package/content/skills/game-development/mobile-games/SKILL.md +108 -0
- package/content/skills/game-development/multiplayer/SKILL.md +132 -0
- package/content/skills/game-development/pc-games/SKILL.md +144 -0
- package/content/skills/game-development/vr-ar/SKILL.md +123 -0
- package/content/skills/game-development/web-games/SKILL.md +150 -0
- package/content/skills/geo-fundamentals/SKILL.md +156 -0
- package/content/skills/geo-fundamentals/scripts/geo_checker.py +289 -0
- package/content/skills/i18n-localization/SKILL.md +154 -0
- package/content/skills/i18n-localization/scripts/i18n_checker.py +241 -0
- package/content/skills/intelligent-routing/SKILL.md +334 -0
- package/content/skills/lint-and-validate/SKILL.md +45 -0
- package/content/skills/lint-and-validate/scripts/lint_runner.py +172 -0
- package/content/skills/lint-and-validate/scripts/type_coverage.py +173 -0
- package/content/skills/mcp-builder/SKILL.md +176 -0
- package/content/skills/mobile-design/SKILL.md +394 -0
- package/content/skills/mobile-design/decision-trees.md +516 -0
- package/content/skills/mobile-design/mobile-backend.md +491 -0
- package/content/skills/mobile-design/mobile-color-system.md +420 -0
- package/content/skills/mobile-design/mobile-debugging.md +122 -0
- package/content/skills/mobile-design/mobile-design-thinking.md +357 -0
- package/content/skills/mobile-design/mobile-navigation.md +458 -0
- package/content/skills/mobile-design/mobile-performance.md +767 -0
- package/content/skills/mobile-design/mobile-testing.md +356 -0
- package/content/skills/mobile-design/mobile-typography.md +433 -0
- package/content/skills/mobile-design/platform-android.md +666 -0
- package/content/skills/mobile-design/platform-ios.md +561 -0
- package/content/skills/mobile-design/scripts/mobile_audit.py +670 -0
- package/content/skills/mobile-design/touch-psychology.md +537 -0
- package/content/skills/nextjs-best-practices/SKILL.md +203 -0
- package/content/skills/nodejs-best-practices/SKILL.md +333 -0
- package/content/skills/parallel-agents/SKILL.md +175 -0
- package/content/skills/performance-profiling/SKILL.md +143 -0
- package/content/skills/performance-profiling/scripts/lighthouse_audit.py +76 -0
- package/content/skills/plan-writing/SKILL.md +152 -0
- package/content/skills/powershell-windows/SKILL.md +167 -0
- package/content/skills/python-patterns/SKILL.md +441 -0
- package/content/skills/react-patterns/SKILL.md +198 -0
- package/content/skills/red-team-tactics/SKILL.md +199 -0
- package/content/skills/seo-fundamentals/SKILL.md +129 -0
- package/content/skills/seo-fundamentals/scripts/seo_checker.py +219 -0
- package/content/skills/server-management/SKILL.md +161 -0
- package/content/skills/systematic-debugging/SKILL.md +109 -0
- package/content/skills/tailwind-patterns/SKILL.md +269 -0
- package/content/skills/tdd-workflow/SKILL.md +149 -0
- package/content/skills/testing-patterns/SKILL.md +178 -0
- package/content/skills/testing-patterns/scripts/test_runner.py +219 -0
- package/content/skills/vulnerability-scanner/SKILL.md +276 -0
- package/content/skills/vulnerability-scanner/checklists.md +121 -0
- package/content/skills/vulnerability-scanner/scripts/security_scan.py +458 -0
- package/content/skills/webapp-testing/SKILL.md +187 -0
- package/content/skills/webapp-testing/scripts/playwright_runner.py +173 -0
- package/content/specialists/Especialista em Acessibilidade.md +266 -0
- package/content/specialists/Especialista em An/303/241lise de Testes.md" +434 -0
- package/content/specialists/Especialista em Arquitetura Avan/303/247ada.md" +358 -0
- package/content/specialists/Especialista em Arquitetura de Software.md +177 -0
- package/content/specialists/Especialista em Banco de Dados.md +260 -0
- package/content/specialists/Especialista em Contrato de API.md +172 -0
- package/content/specialists/Especialista em Dados e Analytics com IA.md +246 -0
- package/content/specialists/Especialista em Debugging e Troubleshooting.md +191 -0
- package/content/specialists/Especialista em Desenvolvimento Frontend.md +477 -0
- package/content/specialists/Especialista em Desenvolvimento Mobile.md +241 -0
- package/content/specialists/Especialista em Desenvolvimento e Vibe Coding Estruturado.md +417 -0
- package/content/specialists/Especialista em DevOps e Infraestrutura.md +294 -0
- package/content/specialists/Especialista em Documenta/303/247/303/243o T/303/251cnica.md" +227 -0
- package/content/specialists/Especialista em Engenharia de Requisitos com IA.md +299 -0
- package/content/specialists/Especialista em Explora/303/247/303/243o de Codebase.md" +179 -0
- package/content/specialists/Especialista em Gest/303/243o de Produto.md" +179 -0
- package/content/specialists/Especialista em Migra/303/247/303/243o e Moderniza/303/247/303/243o.md" +410 -0
- package/content/specialists/Especialista em Modelagem e Arquitetura de Dom/303/255nio com IA.md" +248 -0
- package/content/specialists/Especialista em Observabilidade.md +415 -0
- package/content/specialists/Especialista em Performance e Escalabilidade.md +373 -0
- package/content/specialists/Especialista em Plano de Execu/303/247/303/243o com IA.md" +341 -0
- package/content/specialists/Especialista em Prototipagem R/303/241pida com Google Stitch.md" +419 -0
- package/content/specialists/Especialista em Seguran/303/247a da Informa/303/247/303/243o.md" +508 -0
- package/content/specialists/Especialista em UX Design.md +453 -0
- package/content/specialists/INDEX.md +43 -0
- package/content/templates/PRD.md +165 -0
- package/content/templates/README.md +65 -0
- package/content/templates/adr.md +103 -0
- package/content/templates/arquitetura.md +279 -0
- package/content/templates/backlog.md +185 -0
- package/content/templates/checklist-seguranca.md +180 -0
- package/content/templates/contexto.md +120 -0
- package/content/templates/criterios-aceite.md +99 -0
- package/content/templates/design-banco.md +270 -0
- package/content/templates/design-doc.md +240 -0
- package/content/templates/feature.md +88 -0
- package/content/templates/historia-backend.md +84 -0
- package/content/templates/historia-frontend.md +75 -0
- package/content/templates/historia-usuario.md +125 -0
- package/content/templates/mapa-navegacao.md +133 -0
- package/content/templates/matriz-rastreabilidade.md +121 -0
- package/content/templates/modelo-dominio.md +219 -0
- package/content/templates/plano-testes.md +199 -0
- package/content/templates/prototipo-stitch.md +138 -0
- package/content/templates/requisitos.md +162 -0
- package/content/templates/slo-sli.md +197 -0
- package/content/workflows/README-MCP.md +363 -0
- package/content/workflows/brainstorm.md +113 -0
- package/content/workflows/create.md +59 -0
- package/content/workflows/debug.md +103 -0
- package/content/workflows/deploy.md +176 -0
- package/content/workflows/enhance.md +63 -0
- package/content/workflows/mcp-debug.md +506 -0
- package/content/workflows/mcp-feature.md +385 -0
- package/content/workflows/mcp-gate.md +413 -0
- package/content/workflows/mcp-next.md +388 -0
- package/content/workflows/mcp-refactor.md +600 -0
- package/content/workflows/mcp-start.md +304 -0
- package/content/workflows/mcp-status.md +400 -0
- package/content/workflows/orchestrate.md +237 -0
- package/content/workflows/plan.md +89 -0
- package/content/workflows/preview.md +81 -0
- package/content/workflows/status.md +86 -0
- package/content/workflows/test.md +144 -0
- package/content/workflows/ui-ux-pro-max.md +296 -0
- package/dist/commands/init.d.ts +6 -0
- package/dist/commands/init.js +138 -0
- package/dist/commands/update.d.ts +5 -0
- package/dist/commands/update.js +50 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +21 -0
- package/package.json +48 -0
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
# Prompt: Code Review Automatizado
|
|
2
|
+
|
|
3
|
+
> **Quando usar**: Durante Pull Requests ou revisão de código
|
|
4
|
+
> **Especialista**: [Desenvolvimento Backend](../../02-especialistas/Especialista%20em%20Desenvolvimento%20e%20Vibe%20Coding%20Estruturado.md) ou Tech Lead
|
|
5
|
+
> **Nível**: Médio
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Fluxo de Contexto
|
|
10
|
+
|
|
11
|
+
Antes de usar este prompt, tenha em mãos:
|
|
12
|
+
- Código a ser revisado (diff ou arquivo completo)
|
|
13
|
+
- Contexto do projeto e padrões existentes
|
|
14
|
+
|
|
15
|
+
Após revisão, crie comentários inline no PR ou salve em:
|
|
16
|
+
- Comentários no sistema de versionamento (GitHub, GitLab)
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## Prompt Completo
|
|
21
|
+
|
|
22
|
+
```text
|
|
23
|
+
Atue como desenvolvedor sênior realizando code review.
|
|
24
|
+
|
|
25
|
+
## Contexto do Projeto
|
|
26
|
+
|
|
27
|
+
[BREVE DESCRIÇÃO DO PROJETO E STACK]
|
|
28
|
+
|
|
29
|
+
## Padrões do Projeto
|
|
30
|
+
|
|
31
|
+
- Linguagem: [TypeScript/Python/Java/etc]
|
|
32
|
+
- Framework: [NestJS/FastAPI/Spring/etc]
|
|
33
|
+
- Style Guide: [Airbnb/Google/PEP8/etc]
|
|
34
|
+
- Arquitetura: [Clean/Hexagonal/MVC/etc]
|
|
35
|
+
- Padrões específicos: [Liste convenções do projeto]
|
|
36
|
+
|
|
37
|
+
## Código para Revisar
|
|
38
|
+
|
|
39
|
+
```[LINGUAGEM]
|
|
40
|
+
[COLE O CÓDIGO - Pode ser diff ou arquivo completo]
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## Tipo de Mudança
|
|
44
|
+
|
|
45
|
+
- [ ] Nova feature
|
|
46
|
+
- [ ] Bug fix
|
|
47
|
+
- [ ] Refactoring
|
|
48
|
+
- [ ] Performance
|
|
49
|
+
- [ ] Documentação
|
|
50
|
+
|
|
51
|
+
---
|
|
52
|
+
|
|
53
|
+
## Sua Missão
|
|
54
|
+
|
|
55
|
+
Realize um code review completo analisando:
|
|
56
|
+
|
|
57
|
+
### 1. Categorize os Comentários
|
|
58
|
+
|
|
59
|
+
Use prefixos para categorizar:
|
|
60
|
+
- 🔴 **BLOCKER**: Erro crítico, impede aprovação
|
|
61
|
+
- 🟡 **WARN**: Problema que deveria ser corrigido
|
|
62
|
+
- 🟢 **SUGGESTION**: Melhoria opcional
|
|
63
|
+
- 💬 **QUESTION**: Dúvida que precisa esclarecimento
|
|
64
|
+
- 👍 **PRAISE**: Destaque positivo
|
|
65
|
+
|
|
66
|
+
### 2. Checklist de Revisão
|
|
67
|
+
|
|
68
|
+
#### Correção
|
|
69
|
+
- [ ] Código faz o que deveria fazer?
|
|
70
|
+
- [ ] Edge cases tratados?
|
|
71
|
+
- [ ] Erros tratados adequadamente?
|
|
72
|
+
- [ ] Null/undefined handling?
|
|
73
|
+
|
|
74
|
+
#### Legibilidade
|
|
75
|
+
- [ ] Nomes de variáveis/funções claros?
|
|
76
|
+
- [ ] Código autoexplicativo ou comentado?
|
|
77
|
+
- [ ] Magic numbers/strings evitados?
|
|
78
|
+
- [ ] Complexidade ciclomática aceitável?
|
|
79
|
+
|
|
80
|
+
#### Manutenibilidade
|
|
81
|
+
- [ ] DRY (Don't Repeat Yourself)?
|
|
82
|
+
- [ ] Single Responsibility?
|
|
83
|
+
- [ ] Baixo acoplamento?
|
|
84
|
+
- [ ] Testável?
|
|
85
|
+
|
|
86
|
+
#### Performance
|
|
87
|
+
- [ ] N+1 queries evitados?
|
|
88
|
+
- [ ] Loops desnecessários?
|
|
89
|
+
- [ ] Memória bem gerenciada?
|
|
90
|
+
- [ ] Operações bloqueantes?
|
|
91
|
+
|
|
92
|
+
#### Segurança
|
|
93
|
+
- [ ] Input sanitizado?
|
|
94
|
+
- [ ] Dados sensíveis protegidos?
|
|
95
|
+
- [ ] Authorization verificada?
|
|
96
|
+
- [ ] Logs sem dados sensíveis?
|
|
97
|
+
|
|
98
|
+
#### Testes
|
|
99
|
+
- [ ] Testes unitários incluídos?
|
|
100
|
+
- [ ] Casos de erro testados?
|
|
101
|
+
- [ ] Coverage adequado?
|
|
102
|
+
|
|
103
|
+
### 3. Formato dos Comentários
|
|
104
|
+
|
|
105
|
+
Para cada comentário, inclua:
|
|
106
|
+
- Linha(s) afetada(s)
|
|
107
|
+
- Categoria (BLOCKER/WARN/SUGGESTION)
|
|
108
|
+
- Problema identificado
|
|
109
|
+
- Sugestão de correção com código
|
|
110
|
+
|
|
111
|
+
### 4. Resumo
|
|
112
|
+
|
|
113
|
+
No final, forneça:
|
|
114
|
+
- Aprovado / Aprovar com mudanças / Solicitar mudanças
|
|
115
|
+
- Lista priorizada das mudanças necessárias
|
|
116
|
+
- Pontos positivos do código
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
---
|
|
120
|
+
|
|
121
|
+
## Exemplo de Uso
|
|
122
|
+
|
|
123
|
+
```text
|
|
124
|
+
Atue como desenvolvedor sênior realizando code review.
|
|
125
|
+
|
|
126
|
+
## Contexto do Projeto
|
|
127
|
+
|
|
128
|
+
API de agendamento para salões de beleza, NestJS.
|
|
129
|
+
|
|
130
|
+
## Padrões do Projeto
|
|
131
|
+
|
|
132
|
+
- Linguagem: TypeScript
|
|
133
|
+
- Framework: NestJS
|
|
134
|
+
- Style Guide: ESLint + Prettier
|
|
135
|
+
- Arquitetura: Clean Architecture
|
|
136
|
+
- Padrões: Injeção de dependência, DTOs, Repository pattern
|
|
137
|
+
|
|
138
|
+
## Código para Revisar
|
|
139
|
+
|
|
140
|
+
```typescript
|
|
141
|
+
@Controller('agendamentos')
|
|
142
|
+
export class AgendamentoController {
|
|
143
|
+
constructor(private agendamentoService: any) {}
|
|
144
|
+
|
|
145
|
+
@Post()
|
|
146
|
+
async criar(@Body() body) {
|
|
147
|
+
if (!body.clienteId) {
|
|
148
|
+
throw new Error('Cliente obrigatorio');
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
const result = await this.agendamentoService.criar(body);
|
|
152
|
+
console.log('Agendamento criado:', result.id);
|
|
153
|
+
return result;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
@Get()
|
|
157
|
+
async listar() {
|
|
158
|
+
const agendamentos = await this.agendamentoService.repository.findAll();
|
|
159
|
+
return agendamentos;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
## Tipo de Mudança
|
|
165
|
+
|
|
166
|
+
- [x] Nova feature
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
---
|
|
170
|
+
|
|
171
|
+
## Resposta Esperada
|
|
172
|
+
|
|
173
|
+
### Comentários de Código
|
|
174
|
+
|
|
175
|
+
**Linha 3**
|
|
176
|
+
🔴 **BLOCKER**: Tipo `any` para o serviço
|
|
177
|
+
|
|
178
|
+
O uso de `any` quebra a tipagem e pode causar bugs em runtime.
|
|
179
|
+
|
|
180
|
+
```typescript
|
|
181
|
+
// ❌ Antes
|
|
182
|
+
constructor(private agendamentoService: any) {}
|
|
183
|
+
|
|
184
|
+
// ✅ Depois
|
|
185
|
+
constructor(private readonly agendamentoService: AgendamentoService) {}
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
---
|
|
189
|
+
|
|
190
|
+
**Linha 6**
|
|
191
|
+
🔴 **BLOCKER**: Body sem tipagem e validação
|
|
192
|
+
|
|
193
|
+
Sem DTO, não há validação de input, vulnerável a payloads maliciosos.
|
|
194
|
+
|
|
195
|
+
```typescript
|
|
196
|
+
// ❌ Antes
|
|
197
|
+
async criar(@Body() body) {
|
|
198
|
+
|
|
199
|
+
// ✅ Depois
|
|
200
|
+
async criar(@Body() dto: CriarAgendamentoDto) {
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
E criar o DTO:
|
|
204
|
+
```typescript
|
|
205
|
+
export class CriarAgendamentoDto {
|
|
206
|
+
@IsUUID()
|
|
207
|
+
clienteId: string;
|
|
208
|
+
|
|
209
|
+
@IsDate()
|
|
210
|
+
dataHora: Date;
|
|
211
|
+
}
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
---
|
|
215
|
+
|
|
216
|
+
**Linha 7-9**
|
|
217
|
+
🟡 **WARN**: Validação manual no controller
|
|
218
|
+
|
|
219
|
+
Validação deveria estar no DTO com class-validator, não manual.
|
|
220
|
+
|
|
221
|
+
```typescript
|
|
222
|
+
// ❌ Antes (validação manual)
|
|
223
|
+
if (!body.clienteId) {
|
|
224
|
+
throw new Error('Cliente obrigatorio');
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
// ✅ Depois (remover, DTO com @IsNotEmpty() cuida disso)
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
---
|
|
231
|
+
|
|
232
|
+
**Linha 12**
|
|
233
|
+
🔴 **BLOCKER**: Console.log em código de produção
|
|
234
|
+
|
|
235
|
+
Logs devem usar o sistema de logging do NestJS.
|
|
236
|
+
|
|
237
|
+
```typescript
|
|
238
|
+
// ❌ Antes
|
|
239
|
+
console.log('Agendamento criado:', result.id);
|
|
240
|
+
|
|
241
|
+
// ✅ Depois
|
|
242
|
+
this.logger.log(`Agendamento criado: ${result.id}`);
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
---
|
|
246
|
+
|
|
247
|
+
**Linha 17**
|
|
248
|
+
🔴 **BLOCKER**: Acesso direto ao repository do service
|
|
249
|
+
|
|
250
|
+
Controller acessando `service.repository` viola encapsulamento.
|
|
251
|
+
|
|
252
|
+
```typescript
|
|
253
|
+
// ❌ Antes
|
|
254
|
+
const agendamentos = await this.agendamentoService.repository.findAll();
|
|
255
|
+
|
|
256
|
+
// ✅ Depois
|
|
257
|
+
const agendamentos = await this.agendamentoService.listar();
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
---
|
|
261
|
+
|
|
262
|
+
**Linha 16**
|
|
263
|
+
🟡 **WARN**: Endpoint sem paginação
|
|
264
|
+
|
|
265
|
+
Listar todos os registros pode ser problemático com muitos dados.
|
|
266
|
+
|
|
267
|
+
```typescript
|
|
268
|
+
// ✅ Sugerir
|
|
269
|
+
@Get()
|
|
270
|
+
async listar(@Query() query: PaginacaoDto) {
|
|
271
|
+
return this.agendamentoService.listar(query.page, query.limit);
|
|
272
|
+
}
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
---
|
|
276
|
+
|
|
277
|
+
### Resumo
|
|
278
|
+
|
|
279
|
+
**Decisão**: 🔴 **Solicitar mudanças**
|
|
280
|
+
|
|
281
|
+
**Prioridade de Correções:**
|
|
282
|
+
1. Tipar service e remover `any`
|
|
283
|
+
2. Criar DTO com class-validator
|
|
284
|
+
3. Remover console.log
|
|
285
|
+
4. Não acessar repository diretamente
|
|
286
|
+
5. Adicionar paginação
|
|
287
|
+
|
|
288
|
+
**Pontos Positivos:**
|
|
289
|
+
- Estrutura básica de controller correta
|
|
290
|
+
- Uso de async/await adequado
|
|
291
|
+
|
|
292
|
+
---
|
|
293
|
+
|
|
294
|
+
## Checklist Pós-Geração
|
|
295
|
+
|
|
296
|
+
- [ ] Todos os BLOCKERs corrigidos
|
|
297
|
+
- [ ] WARNs revisados e priorizados
|
|
298
|
+
- [ ] Sugestões consideradas
|
|
299
|
+
- [ ] Testes adicionados se necessário
|
|
300
|
+
- [ ] Código refatorado aprovado
|
|
301
|
+
- [ ] PR atualizado com correções
|
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
# Prompt: Gerar Serviço de Aplicação
|
|
2
|
+
|
|
3
|
+
> **Quando usar**: Durante implementação, para gerar services/use cases
|
|
4
|
+
> **Especialista**: [Desenvolvimento Backend](../../02-especialistas/Especialista%20em%20Desenvolvimento%20e%20Vibe%20Coding%20Estruturado.md)
|
|
5
|
+
> **Nível**: Médio
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Fluxo de Contexto
|
|
10
|
+
|
|
11
|
+
Antes de usar este prompt, tenha em mãos:
|
|
12
|
+
- `docs/CONTEXTO.md` - Entendimento atual do projeto
|
|
13
|
+
- `docs/05-arquitetura/arquitetura.md` - Arquitetura definida
|
|
14
|
+
- `docs/04-modelo/modelo-dominio.md` - Entidades e regras
|
|
15
|
+
|
|
16
|
+
Após gerar, salve o código em:
|
|
17
|
+
- `src/application/services/` ou equivalente na sua estrutura
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## Prompt Completo
|
|
22
|
+
|
|
23
|
+
```text
|
|
24
|
+
Atue como desenvolvedor sênior especializado em Clean Architecture.
|
|
25
|
+
|
|
26
|
+
## Contexto do Projeto
|
|
27
|
+
|
|
28
|
+
[COLE O CONTEÚDO DE docs/CONTEXTO.md]
|
|
29
|
+
|
|
30
|
+
## Arquitetura
|
|
31
|
+
|
|
32
|
+
[COLE RESUMO DA ARQUITETURA - Padrão usado, camadas]
|
|
33
|
+
|
|
34
|
+
## Entidade Alvo
|
|
35
|
+
|
|
36
|
+
Nome: [NOME DA ENTIDADE]
|
|
37
|
+
Campos: [LISTE OS CAMPOS]
|
|
38
|
+
|
|
39
|
+
## Regras de Negócio
|
|
40
|
+
|
|
41
|
+
[DESCREVA AS VALIDAÇÕES E REGRAS]
|
|
42
|
+
|
|
43
|
+
## Stack
|
|
44
|
+
|
|
45
|
+
Linguagem: [TypeScript/Python/Java/Go/etc]
|
|
46
|
+
Framework: [NestJS/FastAPI/Spring/etc]
|
|
47
|
+
ORM/Database: [Prisma/TypeORM/SQLAlchemy/etc]
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
## Sua Missão
|
|
52
|
+
|
|
53
|
+
Gere o código do serviço/classe de aplicação com:
|
|
54
|
+
|
|
55
|
+
### 1. Estrutura do Serviço
|
|
56
|
+
- Injeção de dependências (Repository, outros Services)
|
|
57
|
+
- Tipagem correta de DTOs de entrada e saída
|
|
58
|
+
|
|
59
|
+
### 2. Métodos Principais
|
|
60
|
+
Para cada operação CRUD + regras específicas:
|
|
61
|
+
- Assinatura com tipos
|
|
62
|
+
- Documentação JSDoc/Docstring
|
|
63
|
+
- Lógica do happy path
|
|
64
|
+
- Tratamento de erros com exceções específicas
|
|
65
|
+
- Validações de negócio
|
|
66
|
+
|
|
67
|
+
### 3. Padrões a Seguir
|
|
68
|
+
- Separação entre Application Service e Domain Service (se aplicável)
|
|
69
|
+
- DTOs para entrada/saída (nunca expor entidade diretamente)
|
|
70
|
+
- Repository interface (não implementação)
|
|
71
|
+
- Unit of Work pattern para transações (se aplicável)
|
|
72
|
+
|
|
73
|
+
### 4. Não Gere
|
|
74
|
+
- Controllers/Rotas
|
|
75
|
+
- Implementação de Repository
|
|
76
|
+
- Migrations
|
|
77
|
+
- Configurações de framework
|
|
78
|
+
|
|
79
|
+
### 5. Formato
|
|
80
|
+
Retorne código pronto para uso com:
|
|
81
|
+
- Imports necessários
|
|
82
|
+
- Types/Interfaces auxiliares
|
|
83
|
+
- Comentários explicando decisões
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
---
|
|
87
|
+
|
|
88
|
+
## Exemplo de Uso
|
|
89
|
+
|
|
90
|
+
```text
|
|
91
|
+
Atue como desenvolvedor sênior especializado em Clean Architecture.
|
|
92
|
+
|
|
93
|
+
## Contexto do Projeto
|
|
94
|
+
|
|
95
|
+
Sistema de agendamento para salões de beleza.
|
|
96
|
+
|
|
97
|
+
## Arquitetura
|
|
98
|
+
|
|
99
|
+
Clean Architecture com camadas: Domain, Application, Infrastructure, Interface.
|
|
100
|
+
Services na camada Application orquestram casos de uso.
|
|
101
|
+
|
|
102
|
+
## Entidade Alvo
|
|
103
|
+
|
|
104
|
+
Nome: Agendamento
|
|
105
|
+
Campos:
|
|
106
|
+
- id: UUID
|
|
107
|
+
- clienteId: UUID
|
|
108
|
+
- servicoId: UUID
|
|
109
|
+
- dataHora: DateTime
|
|
110
|
+
- status: enum (PENDENTE, CONFIRMADO, CANCELADO, CONCLUIDO)
|
|
111
|
+
|
|
112
|
+
## Regras de Negócio
|
|
113
|
+
|
|
114
|
+
1. Não pode agendar no passado
|
|
115
|
+
2. Não pode haver conflito de horário para o mesmo prestador
|
|
116
|
+
3. Cancelamento só até 2h antes
|
|
117
|
+
4. Após criar, enviar notificação ao cliente
|
|
118
|
+
|
|
119
|
+
## Stack
|
|
120
|
+
|
|
121
|
+
Linguagem: TypeScript
|
|
122
|
+
Framework: NestJS
|
|
123
|
+
ORM: Prisma
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
---
|
|
127
|
+
|
|
128
|
+
## Resposta Esperada
|
|
129
|
+
|
|
130
|
+
```typescript
|
|
131
|
+
import { Injectable, ConflictException, BadRequestException } from '@nestjs/common';
|
|
132
|
+
import { AgendamentoRepository } from '../ports/agendamento.repository';
|
|
133
|
+
import { NotificacaoService } from './notificacao.service';
|
|
134
|
+
import { CriarAgendamentoDto, AgendamentoResponseDto } from '../dtos/agendamento.dto';
|
|
135
|
+
import { StatusAgendamento } from '../../domain/enums/status-agendamento.enum';
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* Service responsável por orquestrar casos de uso de Agendamento.
|
|
139
|
+
* Não contém regras de domínio, apenas coordena operações.
|
|
140
|
+
*/
|
|
141
|
+
@Injectable()
|
|
142
|
+
export class AgendamentoService {
|
|
143
|
+
constructor(
|
|
144
|
+
private readonly agendamentoRepository: AgendamentoRepository,
|
|
145
|
+
private readonly notificacaoService: NotificacaoService,
|
|
146
|
+
) {}
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
* Cria um novo agendamento validando regras de negócio.
|
|
150
|
+
* @throws BadRequestException - Data no passado
|
|
151
|
+
* @throws ConflictException - Horário já ocupado
|
|
152
|
+
*/
|
|
153
|
+
async criar(dto: CriarAgendamentoDto): Promise<AgendamentoResponseDto> {
|
|
154
|
+
// Validar: não pode ser no passado
|
|
155
|
+
if (dto.dataHora < new Date()) {
|
|
156
|
+
throw new BadRequestException('Não é possível agendar no passado');
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
// Validar: horário disponível
|
|
160
|
+
const conflito = await this.agendamentoRepository.findByHorarioEPrestador(
|
|
161
|
+
dto.dataHora,
|
|
162
|
+
dto.prestadorId,
|
|
163
|
+
);
|
|
164
|
+
if (conflito) {
|
|
165
|
+
throw new ConflictException('Horário já ocupado para este prestador');
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
// Criar agendamento
|
|
169
|
+
const agendamento = await this.agendamentoRepository.create({
|
|
170
|
+
...dto,
|
|
171
|
+
status: StatusAgendamento.PENDENTE,
|
|
172
|
+
});
|
|
173
|
+
|
|
174
|
+
// Side effect: notificar cliente
|
|
175
|
+
await this.notificacaoService.enviarConfirmacaoAgendamento(agendamento);
|
|
176
|
+
|
|
177
|
+
return AgendamentoResponseDto.fromEntity(agendamento);
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
/**
|
|
181
|
+
* Cancela um agendamento respeitando a regra de 2h.
|
|
182
|
+
* @throws BadRequestException - Menos de 2h para o horário
|
|
183
|
+
*/
|
|
184
|
+
async cancelar(id: string, motivo: string): Promise<void> {
|
|
185
|
+
const agendamento = await this.agendamentoRepository.findById(id);
|
|
186
|
+
|
|
187
|
+
// Validar: limite de 2h
|
|
188
|
+
const duasHorasAntes = new Date(agendamento.dataHora);
|
|
189
|
+
duasHorasAntes.setHours(duasHorasAntes.getHours() - 2);
|
|
190
|
+
|
|
191
|
+
if (new Date() > duasHorasAntes) {
|
|
192
|
+
throw new BadRequestException(
|
|
193
|
+
'Cancelamento só é permitido até 2 horas antes do horário',
|
|
194
|
+
);
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
await this.agendamentoRepository.updateStatus(id, StatusAgendamento.CANCELADO);
|
|
198
|
+
await this.notificacaoService.enviarCancelamento(agendamento, motivo);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
---
|
|
204
|
+
|
|
205
|
+
## Variações por Stack
|
|
206
|
+
|
|
207
|
+
### Python + FastAPI
|
|
208
|
+
|
|
209
|
+
```python
|
|
210
|
+
from fastapi import HTTPException, status
|
|
211
|
+
from app.repositories.agendamento_repository import AgendamentoRepository
|
|
212
|
+
from app.services.notificacao_service import NotificacaoService
|
|
213
|
+
from app.schemas.agendamento import CriarAgendamentoDto, AgendamentoResponse
|
|
214
|
+
|
|
215
|
+
class AgendamentoService:
|
|
216
|
+
def __init__(
|
|
217
|
+
self,
|
|
218
|
+
repository: AgendamentoRepository,
|
|
219
|
+
notificacao: NotificacaoService,
|
|
220
|
+
):
|
|
221
|
+
self._repository = repository
|
|
222
|
+
self._notificacao = notificacao
|
|
223
|
+
|
|
224
|
+
async def criar(self, dto: CriarAgendamentoDto) -> AgendamentoResponse:
|
|
225
|
+
if dto.data_hora < datetime.now():
|
|
226
|
+
raise HTTPException(
|
|
227
|
+
status_code=status.HTTP_400_BAD_REQUEST,
|
|
228
|
+
detail="Não é possível agendar no passado"
|
|
229
|
+
)
|
|
230
|
+
# ... resto da lógica
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
### Java + Spring
|
|
234
|
+
|
|
235
|
+
```java
|
|
236
|
+
@Service
|
|
237
|
+
@Transactional
|
|
238
|
+
public class AgendamentoService {
|
|
239
|
+
|
|
240
|
+
private final AgendamentoRepository repository;
|
|
241
|
+
private final NotificacaoService notificacao;
|
|
242
|
+
|
|
243
|
+
public AgendamentoService(
|
|
244
|
+
AgendamentoRepository repository,
|
|
245
|
+
NotificacaoService notificacao
|
|
246
|
+
) {
|
|
247
|
+
this.repository = repository;
|
|
248
|
+
this.notificacao = notificacao;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
public AgendamentoResponse criar(CriarAgendamentoDto dto) {
|
|
252
|
+
if (dto.getDataHora().isBefore(LocalDateTime.now())) {
|
|
253
|
+
throw new BadRequestException("Não é possível agendar no passado");
|
|
254
|
+
}
|
|
255
|
+
// ... resto da lógica
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
---
|
|
261
|
+
|
|
262
|
+
## Checklist Pós-Geração
|
|
263
|
+
|
|
264
|
+
- [ ] Service não contém lógica de domínio complexa (mover para Domain Service se necessário)
|
|
265
|
+
- [ ] Todas as dependências são injetadas (não há `new` de repositórios)
|
|
266
|
+
- [ ] DTOs separados para entrada e saída
|
|
267
|
+
- [ ] Exceções são específicas (não genéricas)
|
|
268
|
+
- [ ] Validações de negócio estão presentes
|
|
269
|
+
- [ ] Side effects (notificações, eventos) estão isolados
|
|
270
|
+
- [ ] Código está tipado corretamente
|
|
271
|
+
- [ ] Comentários explicam o "porquê", não o "como"
|