@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,356 @@
|
|
|
1
|
+
# Prompt: Rate Limiting e Throttling
|
|
2
|
+
|
|
3
|
+
> **Prioridade**: 🔴 CRÍTICA
|
|
4
|
+
> **Aplicável a**: Todos os projetos com APIs expostas
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Por que é Crítico?
|
|
9
|
+
|
|
10
|
+
Rate limiting protege seu sistema contra:
|
|
11
|
+
- **DDoS e ataques de força bruta**
|
|
12
|
+
- **Abuso de API** (scraping, spam)
|
|
13
|
+
- **Esgotamento de recursos** (CPU, memória, banco)
|
|
14
|
+
- **Custos inesperados** (APIs pagas, cloud billing)
|
|
15
|
+
- **Degradação de serviço** para usuários legítimos
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## Algoritmos de Rate Limiting
|
|
20
|
+
|
|
21
|
+
| Algoritmo | Comportamento | Melhor Para |
|
|
22
|
+
|-----------|---------------|-------------|
|
|
23
|
+
| **Fixed Window** | Conta requests em janelas fixas (ex: por minuto) | APIs simples, fácil de implementar |
|
|
24
|
+
| **Sliding Window Log** | Janela deslizante precisa | Precisão, mas alto uso de memória |
|
|
25
|
+
| **Sliding Window Counter** | Híbrido: precisão + eficiência | Maioria dos casos |
|
|
26
|
+
| **Token Bucket** | Tokens recarregam gradualmente, permite bursts | APIs que toleram picos curtos |
|
|
27
|
+
| **Leaky Bucket** | Processa em taxa constante, descarta excesso | Suavizar tráfego, filas |
|
|
28
|
+
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
## Prompt Base
|
|
32
|
+
|
|
33
|
+
```text
|
|
34
|
+
Atue como engenheiro de segurança e performance.
|
|
35
|
+
|
|
36
|
+
Preciso implementar rate limiting para:
|
|
37
|
+
- API: [DESCREVA: ex. REST API pública de e-commerce]
|
|
38
|
+
- Endpoints críticos: [LISTE: ex. /login, /checkout, /api/*]
|
|
39
|
+
- Tráfego esperado: [ex. 1000 req/min normal, picos de 5000]
|
|
40
|
+
- Tipos de cliente: [AUTENTICADO/ANÔNIMO/API_KEY/OAUTH]
|
|
41
|
+
|
|
42
|
+
Stack: [ex. Node.js + Express + Redis / Python + FastAPI]
|
|
43
|
+
|
|
44
|
+
Gere implementação completa com:
|
|
45
|
+
|
|
46
|
+
1. **Algoritmo recomendado** e justificativa
|
|
47
|
+
|
|
48
|
+
2. **Limites por tier**
|
|
49
|
+
- Anônimo: X req/min
|
|
50
|
+
- Autenticado free: Y req/min
|
|
51
|
+
- Autenticado premium: Z req/min
|
|
52
|
+
- API Key: W req/min
|
|
53
|
+
|
|
54
|
+
3. **Limites específicos por endpoint**
|
|
55
|
+
- /login: mais restrito (proteção brute force)
|
|
56
|
+
- /search: menos restrito
|
|
57
|
+
- /checkout: moderado
|
|
58
|
+
|
|
59
|
+
4. **Headers de resposta** (RFC 6585)
|
|
60
|
+
- X-RateLimit-Limit
|
|
61
|
+
- X-RateLimit-Remaining
|
|
62
|
+
- X-RateLimit-Reset
|
|
63
|
+
- Retry-After (quando 429)
|
|
64
|
+
|
|
65
|
+
5. **Armazenamento** (Redis patterns)
|
|
66
|
+
- Schema de keys
|
|
67
|
+
- TTL
|
|
68
|
+
|
|
69
|
+
6. **Bypasses seguros**
|
|
70
|
+
- Health checks
|
|
71
|
+
- Requests internos
|
|
72
|
+
- IPs whitelisted
|
|
73
|
+
|
|
74
|
+
7. **Resposta 429** com:
|
|
75
|
+
- Mensagem clara
|
|
76
|
+
- Retry-After header
|
|
77
|
+
- Link para documentação de limites
|
|
78
|
+
|
|
79
|
+
8. **Testes automatizados**
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
---
|
|
83
|
+
|
|
84
|
+
## Padrões Obrigatórios
|
|
85
|
+
|
|
86
|
+
### Headers de Resposta
|
|
87
|
+
|
|
88
|
+
```http
|
|
89
|
+
HTTP/1.1 200 OK
|
|
90
|
+
X-RateLimit-Limit: 100
|
|
91
|
+
X-RateLimit-Remaining: 95
|
|
92
|
+
X-RateLimit-Reset: 1640000000
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
```http
|
|
96
|
+
HTTP/1.1 429 Too Many Requests
|
|
97
|
+
X-RateLimit-Limit: 100
|
|
98
|
+
X-RateLimit-Remaining: 0
|
|
99
|
+
X-RateLimit-Reset: 1640000000
|
|
100
|
+
Retry-After: 60
|
|
101
|
+
Content-Type: application/json
|
|
102
|
+
|
|
103
|
+
{
|
|
104
|
+
"error": "rate_limit_exceeded",
|
|
105
|
+
"message": "Too many requests. Please retry after 60 seconds.",
|
|
106
|
+
"documentation_url": "https://api.example.com/docs/rate-limits",
|
|
107
|
+
"limit": 100,
|
|
108
|
+
"remaining": 0,
|
|
109
|
+
"reset_at": "2024-01-01T12:01:00Z"
|
|
110
|
+
}
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
---
|
|
114
|
+
|
|
115
|
+
## Limites Recomendados por Contexto
|
|
116
|
+
|
|
117
|
+
### APIs Públicas
|
|
118
|
+
|
|
119
|
+
| Tier | Limite | Janela |
|
|
120
|
+
|------|--------|--------|
|
|
121
|
+
| Anônimo | 60 req | 1 min |
|
|
122
|
+
| Free | 100 req | 1 min |
|
|
123
|
+
| Pro | 1000 req | 1 min |
|
|
124
|
+
| Enterprise | 10000 req | 1 min |
|
|
125
|
+
|
|
126
|
+
### Endpoints Sensíveis
|
|
127
|
+
|
|
128
|
+
| Endpoint | Limite | Janela | Justificativa |
|
|
129
|
+
|----------|--------|--------|---------------|
|
|
130
|
+
| `/login` | 5 | 1 min | Brute force protection |
|
|
131
|
+
| `/password-reset` | 3 | 15 min | Anti-abuse |
|
|
132
|
+
| `/register` | 10 | 1 hora | Spam accounts |
|
|
133
|
+
| `/search` | 30 | 1 min | Resource intensive |
|
|
134
|
+
| `/export` | 5 | 1 hora | Heavy operation |
|
|
135
|
+
|
|
136
|
+
---
|
|
137
|
+
|
|
138
|
+
## Exemplo: Sliding Window Counter (Node.js + Redis)
|
|
139
|
+
|
|
140
|
+
```typescript
|
|
141
|
+
import { Redis } from 'ioredis';
|
|
142
|
+
import { Request, Response, NextFunction } from 'express';
|
|
143
|
+
|
|
144
|
+
const redis = new Redis();
|
|
145
|
+
|
|
146
|
+
interface RateLimitConfig {
|
|
147
|
+
windowMs: number; // Janela em ms
|
|
148
|
+
maxRequests: number; // Máximo de requests na janela
|
|
149
|
+
keyPrefix?: string; // Prefixo para a key
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
interface RateLimitInfo {
|
|
153
|
+
limit: number;
|
|
154
|
+
remaining: number;
|
|
155
|
+
reset: number;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
function getClientIdentifier(req: Request): string {
|
|
159
|
+
// Prioridade: API Key > User ID > IP
|
|
160
|
+
const apiKey = req.headers['x-api-key'] as string;
|
|
161
|
+
if (apiKey) return `apikey:${apiKey}`;
|
|
162
|
+
|
|
163
|
+
const userId = (req as any).user?.id;
|
|
164
|
+
if (userId) return `user:${userId}`;
|
|
165
|
+
|
|
166
|
+
const ip = req.ip || req.headers['x-forwarded-for'] || 'unknown';
|
|
167
|
+
return `ip:${ip}`;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
export function rateLimit(config: RateLimitConfig) {
|
|
171
|
+
const { windowMs, maxRequests, keyPrefix = 'ratelimit' } = config;
|
|
172
|
+
const windowSec = Math.ceil(windowMs / 1000);
|
|
173
|
+
|
|
174
|
+
return async (req: Request, res: Response, next: NextFunction) => {
|
|
175
|
+
const clientId = getClientIdentifier(req);
|
|
176
|
+
const now = Date.now();
|
|
177
|
+
const windowStart = Math.floor(now / windowMs) * windowMs;
|
|
178
|
+
const key = `${keyPrefix}:${clientId}:${windowStart}`;
|
|
179
|
+
|
|
180
|
+
try {
|
|
181
|
+
// Incrementar contador atomicamente
|
|
182
|
+
const current = await redis.incr(key);
|
|
183
|
+
|
|
184
|
+
// Definir TTL apenas na primeira request da janela
|
|
185
|
+
if (current === 1) {
|
|
186
|
+
await redis.expire(key, windowSec + 1);
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
const remaining = Math.max(0, maxRequests - current);
|
|
190
|
+
const resetTime = Math.ceil((windowStart + windowMs) / 1000);
|
|
191
|
+
|
|
192
|
+
// Adicionar headers
|
|
193
|
+
res.setHeader('X-RateLimit-Limit', maxRequests);
|
|
194
|
+
res.setHeader('X-RateLimit-Remaining', remaining);
|
|
195
|
+
res.setHeader('X-RateLimit-Reset', resetTime);
|
|
196
|
+
|
|
197
|
+
if (current > maxRequests) {
|
|
198
|
+
const retryAfter = Math.ceil((windowStart + windowMs - now) / 1000);
|
|
199
|
+
res.setHeader('Retry-After', retryAfter);
|
|
200
|
+
|
|
201
|
+
return res.status(429).json({
|
|
202
|
+
error: 'rate_limit_exceeded',
|
|
203
|
+
message: `Too many requests. Please retry after ${retryAfter} seconds.`,
|
|
204
|
+
limit: maxRequests,
|
|
205
|
+
remaining: 0,
|
|
206
|
+
reset_at: new Date(resetTime * 1000).toISOString()
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
next();
|
|
211
|
+
} catch (error) {
|
|
212
|
+
// Em caso de falha do Redis, permitir request (fail-open)
|
|
213
|
+
console.error('Rate limit error:', error);
|
|
214
|
+
next();
|
|
215
|
+
}
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
// Uso com diferentes limites
|
|
220
|
+
const apiLimiter = rateLimit({ windowMs: 60000, maxRequests: 100 });
|
|
221
|
+
const loginLimiter = rateLimit({ windowMs: 60000, maxRequests: 5, keyPrefix: 'login' });
|
|
222
|
+
const searchLimiter = rateLimit({ windowMs: 60000, maxRequests: 30, keyPrefix: 'search' });
|
|
223
|
+
|
|
224
|
+
app.use('/api/', apiLimiter);
|
|
225
|
+
app.post('/login', loginLimiter, loginHandler);
|
|
226
|
+
app.get('/search', searchLimiter, searchHandler);
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
---
|
|
230
|
+
|
|
231
|
+
## Exemplo: Token Bucket para Bursts
|
|
232
|
+
|
|
233
|
+
```typescript
|
|
234
|
+
interface TokenBucketConfig {
|
|
235
|
+
bucketSize: number; // Capacidade máxima
|
|
236
|
+
refillRate: number; // Tokens adicionados por segundo
|
|
237
|
+
keyPrefix?: string;
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
export function tokenBucket(config: TokenBucketConfig) {
|
|
241
|
+
const { bucketSize, refillRate, keyPrefix = 'tokenbucket' } = config;
|
|
242
|
+
|
|
243
|
+
return async (req: Request, res: Response, next: NextFunction) => {
|
|
244
|
+
const clientId = getClientIdentifier(req);
|
|
245
|
+
const key = `${keyPrefix}:${clientId}`;
|
|
246
|
+
const now = Date.now();
|
|
247
|
+
|
|
248
|
+
// Lua script para operação atômica
|
|
249
|
+
const luaScript = `
|
|
250
|
+
local key = KEYS[1]
|
|
251
|
+
local now = tonumber(ARGV[1])
|
|
252
|
+
local bucketSize = tonumber(ARGV[2])
|
|
253
|
+
local refillRate = tonumber(ARGV[3])
|
|
254
|
+
|
|
255
|
+
local bucket = redis.call('HMGET', key, 'tokens', 'last_refill')
|
|
256
|
+
local tokens = tonumber(bucket[1]) or bucketSize
|
|
257
|
+
local lastRefill = tonumber(bucket[2]) or now
|
|
258
|
+
|
|
259
|
+
-- Calcular tokens recarregados
|
|
260
|
+
local elapsed = (now - lastRefill) / 1000
|
|
261
|
+
local refilled = math.min(bucketSize, tokens + (elapsed * refillRate))
|
|
262
|
+
|
|
263
|
+
if refilled >= 1 then
|
|
264
|
+
-- Consumir 1 token
|
|
265
|
+
redis.call('HMSET', key, 'tokens', refilled - 1, 'last_refill', now)
|
|
266
|
+
redis.call('EXPIRE', key, 3600)
|
|
267
|
+
return {1, math.floor(refilled - 1), bucketSize}
|
|
268
|
+
else
|
|
269
|
+
return {0, 0, bucketSize}
|
|
270
|
+
end
|
|
271
|
+
`;
|
|
272
|
+
|
|
273
|
+
const result = await redis.eval(luaScript, 1, key, now, bucketSize, refillRate) as number[];
|
|
274
|
+
const [allowed, remaining, limit] = result;
|
|
275
|
+
|
|
276
|
+
res.setHeader('X-RateLimit-Limit', limit);
|
|
277
|
+
res.setHeader('X-RateLimit-Remaining', remaining);
|
|
278
|
+
|
|
279
|
+
if (!allowed) {
|
|
280
|
+
const retryAfter = Math.ceil((1 - remaining) / refillRate);
|
|
281
|
+
res.setHeader('Retry-After', retryAfter);
|
|
282
|
+
|
|
283
|
+
return res.status(429).json({
|
|
284
|
+
error: 'rate_limit_exceeded',
|
|
285
|
+
message: `Too many requests. Retry after ${retryAfter} seconds.`
|
|
286
|
+
});
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
next();
|
|
290
|
+
};
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
// Permite burst de 10, recarrega 2 tokens/segundo
|
|
294
|
+
app.use('/api/', tokenBucket({ bucketSize: 10, refillRate: 2 }));
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
---
|
|
298
|
+
|
|
299
|
+
## Prompt: Revisar Rate Limiting Existente
|
|
300
|
+
|
|
301
|
+
```text
|
|
302
|
+
Tenho este código de rate limiting implementado:
|
|
303
|
+
[COLE O CÓDIGO]
|
|
304
|
+
|
|
305
|
+
Analise:
|
|
306
|
+
1. O algoritmo está correto?
|
|
307
|
+
2. Há condições de corrida (race conditions)?
|
|
308
|
+
3. Os limites são apropriados para [CONTEXTO]?
|
|
309
|
+
4. O que acontece se o Redis falhar?
|
|
310
|
+
5. Sugira melhorias de segurança e performance.
|
|
311
|
+
```
|
|
312
|
+
|
|
313
|
+
---
|
|
314
|
+
|
|
315
|
+
## Prompt: Rate Limiting para Microserviços
|
|
316
|
+
|
|
317
|
+
```text
|
|
318
|
+
Tenho uma arquitetura de microserviços com:
|
|
319
|
+
- API Gateway (entrada única)
|
|
320
|
+
- Serviços: [auth, orders, payments, notifications]
|
|
321
|
+
- Comunicação interna via [gRPC/HTTP/mensageria]
|
|
322
|
+
|
|
323
|
+
Stack: [DESCREVA]
|
|
324
|
+
|
|
325
|
+
Projete uma estratégia de rate limiting que:
|
|
326
|
+
1. Limite no gateway (proteção global)
|
|
327
|
+
2. Limite por serviço (proteção granular)
|
|
328
|
+
3. Propague limites entre serviços
|
|
329
|
+
4. Trate rate limiting distribuído (múltiplas instâncias)
|
|
330
|
+
5. Inclua circuit breaker para dependências lentas
|
|
331
|
+
```
|
|
332
|
+
|
|
333
|
+
---
|
|
334
|
+
|
|
335
|
+
## Checklist de Implementação
|
|
336
|
+
|
|
337
|
+
- [ ] Algoritmo escolhido e justificado
|
|
338
|
+
- [ ] Limites definidos por tier de usuário
|
|
339
|
+
- [ ] Limites específicos para endpoints sensíveis
|
|
340
|
+
- [ ] Headers X-RateLimit-* em todas as respostas
|
|
341
|
+
- [ ] Resposta 429 com Retry-After
|
|
342
|
+
- [ ] Armazenamento distribuído (Redis)
|
|
343
|
+
- [ ] Bypass para health checks e IPs internos
|
|
344
|
+
- [ ] Fail-open em caso de falha do Redis
|
|
345
|
+
- [ ] Logs de rate limiting para análise
|
|
346
|
+
- [ ] Alertas quando limites são atingidos frequentemente
|
|
347
|
+
- [ ] Documentação de limites para desenvolvedores
|
|
348
|
+
- [ ] Testes automatizados
|
|
349
|
+
|
|
350
|
+
---
|
|
351
|
+
|
|
352
|
+
## Referências
|
|
353
|
+
|
|
354
|
+
- [RFC 6585 - 429 Too Many Requests](https://tools.ietf.org/html/rfc6585)
|
|
355
|
+
- [Stripe Rate Limiting](https://stripe.com/docs/rate-limits)
|
|
356
|
+
- [Redis Rate Limiting Patterns](https://redis.io/commands/incr#pattern-rate-limiter)
|
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
# Prompt: Revisão de Conformidade LGPD/GDPR
|
|
2
|
+
|
|
3
|
+
> **Quando usar**: Projetos com dados pessoais de brasileiros ou europeus
|
|
4
|
+
> **Especialista**: [Segurança da Informação](../../02-especialistas/Especialista%20em%20Segurança%20da%20Informação.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 do projeto
|
|
13
|
+
- `docs/04-modelo/modelo-dominio.md` - Entidades com dados pessoais
|
|
14
|
+
- Lista de tipos de dados coletados
|
|
15
|
+
|
|
16
|
+
Após gerar, salve o resultado em:
|
|
17
|
+
- `docs/09-seguranca/lgpd-compliance.md`
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## Prompt Completo
|
|
22
|
+
|
|
23
|
+
```text
|
|
24
|
+
Atue como especialista em privacidade e proteção de dados (DPO).
|
|
25
|
+
|
|
26
|
+
## Contexto do Projeto
|
|
27
|
+
|
|
28
|
+
[COLE O CONTEÚDO DE docs/CONTEXTO.md]
|
|
29
|
+
|
|
30
|
+
## Tipos de Dados Coletados
|
|
31
|
+
|
|
32
|
+
Liste todos os dados pessoais:
|
|
33
|
+
- [ ] Nome, CPF, RG
|
|
34
|
+
- [ ] Email, telefone
|
|
35
|
+
- [ ] Endereço
|
|
36
|
+
- [ ] Dados de pagamento
|
|
37
|
+
- [ ] Geolocalização
|
|
38
|
+
- [ ] Cookies e tracking
|
|
39
|
+
- [ ] Dados de saúde
|
|
40
|
+
- [ ] Dados biométricos
|
|
41
|
+
- [ ] Outros: [especificar]
|
|
42
|
+
|
|
43
|
+
## Titulares dos Dados
|
|
44
|
+
|
|
45
|
+
- Quem são: [clientes, funcionários, fornecedores]
|
|
46
|
+
- Quantidade estimada: [volume de registros]
|
|
47
|
+
- Localização: [Brasil, UE, outros]
|
|
48
|
+
|
|
49
|
+
## Finalidades do Tratamento
|
|
50
|
+
|
|
51
|
+
Para que os dados são usados:
|
|
52
|
+
- [ ] Cadastro e login
|
|
53
|
+
- [ ] Processamento de pedidos
|
|
54
|
+
- [ ] Marketing direto
|
|
55
|
+
- [ ] Analytics e melhoria do produto
|
|
56
|
+
- [ ] Obrigações legais
|
|
57
|
+
- [ ] Outros: [especificar]
|
|
58
|
+
|
|
59
|
+
## Compartilhamento de Dados
|
|
60
|
+
|
|
61
|
+
- Terceiros: [processadores de pagamento, analytics, email marketing]
|
|
62
|
+
- Transferência internacional: [sim/não, para onde]
|
|
63
|
+
|
|
64
|
+
---
|
|
65
|
+
|
|
66
|
+
## Sua Missão
|
|
67
|
+
|
|
68
|
+
Realize uma análise completa de conformidade LGPD:
|
|
69
|
+
|
|
70
|
+
### 1. Inventário de Dados Pessoais
|
|
71
|
+
|
|
72
|
+
| Dado | Categoria | Base Legal | Finalidade | Retenção | Armazenamento |
|
|
73
|
+
|------|-----------|------------|------------|----------|---------------|
|
|
74
|
+
| [Nome] | Identificação | Contrato | Cadastro | [período] | [local] |
|
|
75
|
+
|
|
76
|
+
### 2. Análise de Bases Legais (Art. 7º LGPD)
|
|
77
|
+
|
|
78
|
+
Para cada tratamento, justifique a base legal:
|
|
79
|
+
|
|
80
|
+
| Tratamento | Base Legal | Justificativa |
|
|
81
|
+
|------------|------------|---------------|
|
|
82
|
+
| [ex: Cadastro] | Execução de contrato | Necessário para prestar o serviço |
|
|
83
|
+
| [ex: Newsletter] | Consentimento | Opt-in explícito no cadastro |
|
|
84
|
+
| [ex: Retenção fiscal] | Obrigação legal | Lei 9.613 (5 anos) |
|
|
85
|
+
|
|
86
|
+
### 3. Direitos dos Titulares (Art. 18º)
|
|
87
|
+
|
|
88
|
+
Como o sistema atende cada direito:
|
|
89
|
+
|
|
90
|
+
| Direito | Implementado | Como Exercer |
|
|
91
|
+
|---------|--------------|--------------|
|
|
92
|
+
| Confirmação de tratamento | [Sim/Não/Parcial] | [descrição] |
|
|
93
|
+
| Acesso aos dados | [Sim/Não/Parcial] | [descrição] |
|
|
94
|
+
| Correção | [Sim/Não/Parcial] | [descrição] |
|
|
95
|
+
| Anonimização/bloqueio | [Sim/Não/Parcial] | [descrição] |
|
|
96
|
+
| Portabilidade | [Sim/Não/Parcial] | [descrição] |
|
|
97
|
+
| Eliminação | [Sim/Não/Parcial] | [descrição] |
|
|
98
|
+
| Revogação de consentimento | [Sim/Não/Parcial] | [descrição] |
|
|
99
|
+
|
|
100
|
+
### 4. Avaliação de Risco de Privacidade
|
|
101
|
+
|
|
102
|
+
| Risco | Probabilidade | Impacto | Nível | Mitigação |
|
|
103
|
+
|-------|---------------|---------|-------|-----------|
|
|
104
|
+
| Vazamento de dados | [1-5] | [1-5] | [P*I] | [ação] |
|
|
105
|
+
| Uso indevido | [1-5] | [1-5] | [P*I] | [ação] |
|
|
106
|
+
| Retenção excessiva | [1-5] | [1-5] | [P*I] | [ação] |
|
|
107
|
+
|
|
108
|
+
### 5. Checklist de Conformidade Técnica
|
|
109
|
+
|
|
110
|
+
#### Coleta de Dados
|
|
111
|
+
- [ ] Política de privacidade clara e acessível
|
|
112
|
+
- [ ] Consentimento com opt-in (não opt-out)
|
|
113
|
+
- [ ] Coleta apenas de dados necessários (minimização)
|
|
114
|
+
- [ ] Checkbox de aceite desvinculado de outros termos
|
|
115
|
+
|
|
116
|
+
#### Armazenamento
|
|
117
|
+
- [ ] Dados criptografados em repouso
|
|
118
|
+
- [ ] Acesso restrito por necessidade
|
|
119
|
+
- [ ] Logs de acesso a dados sensíveis
|
|
120
|
+
- [ ] Backup criptografado
|
|
121
|
+
|
|
122
|
+
#### Compartilhamento
|
|
123
|
+
- [ ] Contratos com operadores (Art. 39)
|
|
124
|
+
- [ ] Cláusulas de proteção de dados
|
|
125
|
+
- [ ] Transferência internacional com salvaguardas
|
|
126
|
+
|
|
127
|
+
#### Retenção e Eliminação
|
|
128
|
+
- [ ] Política de retenção documentada
|
|
129
|
+
- [ ] Processo de eliminação automática
|
|
130
|
+
- [ ] Anonimização quando possível
|
|
131
|
+
|
|
132
|
+
### 6. Relatório de Impacto (RIPD)
|
|
133
|
+
|
|
134
|
+
Se aplicável (tratamento de alto risco):
|
|
135
|
+
- Necessidade e proporcionalidade
|
|
136
|
+
- Riscos aos titulares
|
|
137
|
+
- Medidas de mitigação
|
|
138
|
+
- Parecer do encarregado
|
|
139
|
+
|
|
140
|
+
### 7. Plano de Ação
|
|
141
|
+
|
|
142
|
+
| Ação | Prioridade | Responsável | Prazo |
|
|
143
|
+
|------|------------|-------------|-------|
|
|
144
|
+
| [ação] | [Alta/Média/Baixa] | [quem] | [quando] |
|
|
145
|
+
|
|
146
|
+
### 8. Templates de Documentos
|
|
147
|
+
|
|
148
|
+
Gere drafts de:
|
|
149
|
+
- Política de Privacidade
|
|
150
|
+
- Termo de Consentimento
|
|
151
|
+
- Processo de atendimento a titulares
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
---
|
|
155
|
+
|
|
156
|
+
## Exemplo de Uso
|
|
157
|
+
|
|
158
|
+
```text
|
|
159
|
+
Atue como especialista em privacidade e proteção de dados (DPO).
|
|
160
|
+
|
|
161
|
+
## Contexto do Projeto
|
|
162
|
+
|
|
163
|
+
App de delivery de comida. Clientes fazem pedidos, restaurantes recebem e entregadores fazem a entrega.
|
|
164
|
+
|
|
165
|
+
## Tipos de Dados Coletados
|
|
166
|
+
|
|
167
|
+
- [x] Nome, CPF
|
|
168
|
+
- [x] Email, telefone
|
|
169
|
+
- [x] Endereço
|
|
170
|
+
- [x] Dados de pagamento (tokenizado via Stripe)
|
|
171
|
+
- [x] Geolocalização (para entregas)
|
|
172
|
+
- [x] Cookies e tracking
|
|
173
|
+
|
|
174
|
+
## Titulares dos Dados
|
|
175
|
+
|
|
176
|
+
- Clientes (consumidores finais)
|
|
177
|
+
- Entregadores (parceiros)
|
|
178
|
+
- Restaurantes (PJ, mas com dados de representantes)
|
|
179
|
+
- Volume: ~10.000 clientes, ~500 entregadores
|
|
180
|
+
|
|
181
|
+
## Finalidades
|
|
182
|
+
|
|
183
|
+
- [x] Cadastro e login
|
|
184
|
+
- [x] Processamento de pedidos
|
|
185
|
+
- [x] Marketing direto (promoções)
|
|
186
|
+
- [x] Analytics
|
|
187
|
+
|
|
188
|
+
## Compartilhamento
|
|
189
|
+
|
|
190
|
+
- Stripe (pagamentos)
|
|
191
|
+
- Google Analytics
|
|
192
|
+
- Firebase (push notifications)
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
---
|
|
196
|
+
|
|
197
|
+
## Resposta Esperada (Resumo)
|
|
198
|
+
|
|
199
|
+
### Gaps Críticos Identificados
|
|
200
|
+
|
|
201
|
+
| # | Gap | Risco | Ação |
|
|
202
|
+
|---|-----|-------|------|
|
|
203
|
+
| 1 | Sem política de privacidade | Alto | Criar e publicar |
|
|
204
|
+
| 2 | Geolocalização sem consentimento específico | Alto | Adicionar opt-in |
|
|
205
|
+
| 3 | Sem processo para exclusão de conta | Médio | Implementar feature |
|
|
206
|
+
| 4 | Analytics sem anonimização | Médio | Configurar IP anonymization |
|
|
207
|
+
|
|
208
|
+
### Cronograma Sugerido
|
|
209
|
+
|
|
210
|
+
- **Semana 1**: Política de privacidade + termos
|
|
211
|
+
- **Semana 2**: Consentimento granular (geolocalização, marketing)
|
|
212
|
+
- **Semana 3**: Feature de exclusão de conta
|
|
213
|
+
- **Semana 4**: Revisão de terceiros e contratos
|
|
214
|
+
|
|
215
|
+
---
|
|
216
|
+
|
|
217
|
+
## Checklist Pós-Geração
|
|
218
|
+
|
|
219
|
+
- [ ] Inventário de dados pessoais completo
|
|
220
|
+
- [ ] Base legal identificada para cada tratamento
|
|
221
|
+
- [ ] Direitos dos titulares mapeados
|
|
222
|
+
- [ ] Gaps de conformidade identificados
|
|
223
|
+
- [ ] Avaliação de risco realizada
|
|
224
|
+
- [ ] Checklist técnico verificado
|
|
225
|
+
- [ ] RIPD elaborado (se alto risco)
|
|
226
|
+
- [ ] Plano de ação priorizado
|
|
227
|
+
- [ ] Salvar em `docs/09-seguranca/lgpd-compliance.md`
|