@maestro-ai/mcp-server 1.0.0 → 1.0.1
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 +266 -227
- package/dist/content/design-system/README.md +231 -231
- package/dist/content/design-system/indexes/README.md +211 -211
- package/dist/content/design-system/indexes/colors-index.md +156 -156
- package/dist/content/design-system/indexes/quick-search.md +111 -111
- package/dist/content/design-system/indexes/stacks-index.md +341 -341
- package/dist/content/examples/Exemplo de Fluxo Completo com Java e Spring Boot.md +249 -249
- package/dist/content/examples/Exemplo de Fluxo Completo com Laravel e Filament.md +277 -277
- package/dist/content/examples/Exemplo de Fluxo Completo com Laravel e Livewire.md +260 -260
- package/dist/content/examples/Exemplo de Fluxo Completo com Node e NestJS.md +257 -257
- package/dist/content/guides/Cat/303/241logo de Stacks para Cloud Moderna.md" +119 -119
- package/dist/content/guides/Cat/303/241logo de Stacks para Hospedagem Compartilhada.md" +147 -147
- package/dist/content/guides/Checklist Mestre de Entrega.md +68 -68
- package/dist/content/guides/Gates de Qualidade.md +209 -209
- package/dist/content/guides/Guia de Adi/303/247/303/243o de Novas Funcionalidades.md" +355 -355
- package/dist/content/guides/Guia de Chaos Engineering.md +267 -267
- package/dist/content/guides/Guia de Debugging com IA.md +135 -135
- package/dist/content/guides/Guia de Estrat/303/251gias de Cache.md" +352 -352
- package/dist/content/guides/Guia de Migrations Zero-Downtime.md +311 -311
- package/dist/content/guides/Guia de Multi-tenancy.md +368 -368
- package/dist/content/guides/Guia de Otimiza/303/247/303/243o de Custos Cloud.md" +195 -195
- package/dist/content/guides/Guia de Refatora/303/247/303/243o de C/303/263digo Legado com IA.md" +162 -162
- package/dist/content/guides/Guia de SLOs e Error Budgets.md +315 -315
- package/dist/content/guides/M/303/251tricas de Efici/303/252ncia do Desenvolvimento com IA.md" +93 -93
- package/dist/content/guides/Rules base.md +90 -90
- package/dist/content/playbook/Playbook de Desenvolvimento com IA.md +364 -364
- package/dist/content/prompts/README.md +203 -203
- package/dist/content/prompts/acessibilidade/analise-acessibilidade.md +257 -257
- package/dist/content/prompts/apis/design-api-rest.md +303 -303
- package/dist/content/prompts/apis/idempotencia.md +254 -254
- package/dist/content/prompts/apis/versionamento.md +313 -313
- package/dist/content/prompts/arquitetura/arquitetura-c4-completo.md +190 -190
- package/dist/content/prompts/arquitetura/clean-architecture.md +151 -151
- package/dist/content/prompts/arquitetura/ddd-bounded-contexts.md +183 -183
- package/dist/content/prompts/arquitetura/ddd-cqrs.md +176 -176
- package/dist/content/prompts/arquitetura/modelo-dominio.md +207 -207
- package/dist/content/prompts/arquitetura/multi-tenancy.md +235 -235
- package/dist/content/prompts/database/migrations-zero-downtime.md +192 -192
- package/dist/content/prompts/database/otimizacao-queries.md +296 -296
- package/dist/content/prompts/desenvolvimento/code-review.md +301 -301
- package/dist/content/prompts/desenvolvimento/gerar-servico.md +271 -271
- package/dist/content/prompts/devops/docker-compose.md +336 -336
- package/dist/content/prompts/devops/feature-flags.md +374 -374
- package/dist/content/prompts/devops/kubernetes-deploy.md +460 -460
- package/dist/content/prompts/devops/pipeline-cicd.md +358 -358
- package/dist/content/prompts/devops/terraform-iac.md +502 -502
- package/dist/content/prompts/escalabilidade/analise-performance.md +240 -240
- package/dist/content/prompts/escalabilidade/analise-performance.txt +94 -94
- package/dist/content/prompts/escalabilidade/caching.md +255 -255
- package/dist/content/prompts/observabilidade/chaos-testing.md +237 -237
- package/dist/content/prompts/observabilidade/estrategia-observabilidade.md +263 -263
- package/dist/content/prompts/observabilidade/estrategia-observabilidade.txt +134 -134
- package/dist/content/prompts/observabilidade/slos.md +215 -215
- package/dist/content/prompts/produto/discovery-inicial.md +203 -203
- package/dist/content/prompts/produto/discovery-inicial.txt +33 -33
- package/dist/content/prompts/requisitos/refinar-requisitos.md +232 -232
- package/dist/content/prompts/requisitos/refinar-requisitos.txt +40 -40
- package/dist/content/prompts/seguranca/analise-seguranca.md +243 -243
- package/dist/content/prompts/seguranca/pentest-checklist.md +333 -333
- package/dist/content/prompts/seguranca/rate-limiting.md +356 -356
- package/dist/content/prompts/seguranca/revisao-lgpd.md +227 -227
- package/dist/content/prompts/seguranca/threat-modeling.md +224 -224
- package/dist/content/prompts/testes/contract-testing.md +340 -340
- package/dist/content/prompts/testes/gerar-testes-unitarios.md +474 -474
- package/dist/content/prompts/testes/testes-e2e.md +460 -460
- package/dist/content/prompts/testes/testes-integracao.md +418 -418
- package/dist/content/prompts/testes/testes-performance.md +458 -458
- package/dist/content/prompts/ux/gerar-ui-stitch.md +151 -151
- package/dist/content/rules/RULES.md +835 -835
- package/dist/content/rules/adapters/copilot.md +10 -10
- package/dist/content/rules/adapters/cursor.md +10 -10
- package/dist/content/rules/adapters/gemini.md +13 -13
- package/dist/content/rules/adapters/windsurf.md +10 -10
- package/dist/content/specialists/Especialista em Acessibilidade.md +266 -266
- package/dist/content/specialists/Especialista em An/303/241lise de Testes.md" +434 -434
- package/dist/content/specialists/Especialista em Arquitetura Avan/303/247ada.md" +358 -358
- package/dist/content/specialists/Especialista em Arquitetura de Software.md +177 -177
- package/dist/content/specialists/Especialista em Banco de Dados.md +260 -260
- package/dist/content/specialists/Especialista em Contrato de API.md +172 -172
- package/dist/content/specialists/Especialista em Dados e Analytics com IA.md +246 -246
- package/dist/content/specialists/Especialista em Debugging e Troubleshooting.md +191 -191
- package/dist/content/specialists/Especialista em Desenvolvimento Frontend.md +477 -477
- package/dist/content/specialists/Especialista em Desenvolvimento Mobile.md +241 -241
- package/dist/content/specialists/Especialista em Desenvolvimento e Vibe Coding Estruturado.md +417 -417
- package/dist/content/specialists/Especialista em DevOps e Infraestrutura.md +294 -294
- package/dist/content/specialists/Especialista em Documenta/303/247/303/243o T/303/251cnica.md" +227 -227
- package/dist/content/specialists/Especialista em Engenharia de Requisitos com IA.md +299 -299
- package/dist/content/specialists/Especialista em Explora/303/247/303/243o de Codebase.md" +179 -179
- package/dist/content/specialists/Especialista em Gest/303/243o de Produto.md" +179 -179
- package/dist/content/specialists/Especialista em Migra/303/247/303/243o e Moderniza/303/247/303/243o.md" +410 -410
- package/dist/content/specialists/Especialista em Modelagem e Arquitetura de Dom/303/255nio com IA.md" +248 -248
- package/dist/content/specialists/Especialista em Observabilidade.md +415 -415
- package/dist/content/specialists/Especialista em Performance e Escalabilidade.md +373 -373
- package/dist/content/specialists/Especialista em Plano de Execu/303/247/303/243o com IA.md" +341 -341
- package/dist/content/specialists/Especialista em Prototipagem R/303/241pida com Google Stitch.md" +419 -419
- package/dist/content/specialists/Especialista em Seguran/303/247a da Informa/303/247/303/243o.md" +508 -508
- package/dist/content/specialists/Especialista em UX Design.md +453 -453
- package/dist/content/specialists/INDEX.md +43 -43
- package/dist/content/templates/PRD.md +165 -165
- package/dist/content/templates/README.md +65 -65
- package/dist/content/templates/adr.md +103 -103
- package/dist/content/templates/arquitetura.md +279 -279
- package/dist/content/templates/backlog.md +185 -185
- package/dist/content/templates/checklist-seguranca.md +180 -180
- package/dist/content/templates/contexto.md +120 -120
- package/dist/content/templates/criterios-aceite.md +99 -99
- package/dist/content/templates/design-banco.md +270 -270
- package/dist/content/templates/design-doc.md +240 -240
- package/dist/content/templates/feature.md +88 -88
- package/dist/content/templates/historia-backend.md +84 -84
- package/dist/content/templates/historia-frontend.md +75 -75
- package/dist/content/templates/historia-usuario.md +125 -125
- package/dist/content/templates/mapa-navegacao.md +133 -133
- package/dist/content/templates/matriz-rastreabilidade.md +121 -121
- package/dist/content/templates/modelo-dominio.md +219 -219
- package/dist/content/templates/plano-testes.md +199 -199
- package/dist/content/templates/prototipo-stitch.md +138 -138
- package/dist/content/templates/requisitos.md +162 -162
- package/dist/content/templates/slo-sli.md +197 -197
- package/dist/content/workflows/README-MCP.md +363 -363
- package/dist/content/workflows/mcp-debug.md +506 -506
- package/dist/content/workflows/mcp-feature.md +385 -385
- package/dist/content/workflows/mcp-gate.md +413 -413
- package/dist/content/workflows/mcp-next.md +388 -388
- package/dist/content/workflows/mcp-refactor.md +600 -600
- package/dist/content/workflows/mcp-start.md +304 -304
- package/dist/content/workflows/mcp-status.md +400 -400
- package/dist/gates/tiers.test.js +14 -14
- package/dist/index.js +133 -133
- package/dist/resources/index.js +61 -61
- package/dist/stdio.js +39 -32
- package/dist/stdio.js.map +1 -1
- package/dist/tools/analise/performance.js +23 -23
- package/dist/tools/analise/qualidade.js +23 -23
- package/dist/tools/analise/relatorio.js +24 -24
- package/dist/tools/analise/seguranca.js +28 -28
- package/dist/tools/aprovar-gate.js +81 -81
- package/dist/tools/atualizar-codebase.js +18 -18
- package/dist/tools/avaliar-entregavel.js +18 -18
- package/dist/tools/carregar-projeto.js +103 -103
- package/dist/tools/classificar.js +36 -36
- package/dist/tools/confirmar-classificacao.js +36 -36
- package/dist/tools/confirmar-stitch.js +75 -75
- package/dist/tools/contexto.js +56 -56
- package/dist/tools/fluxos-alternativos.js +98 -98
- package/dist/tools/implementar-historia.js +63 -63
- package/dist/tools/iniciar-projeto.js +174 -174
- package/dist/tools/proximo.js +239 -239
- package/dist/tools/salvar.js +59 -59
- package/dist/tools/status.js +76 -76
- package/dist/tools/validar-gate.js +35 -35
- package/dist/types/response.js +11 -11
- package/dist/utils/instructions.js +48 -48
- package/dist/utils/prompt-mapper.js +16 -16
- package/dist/utils/system-md.js +33 -33
- package/package.json +67 -67
- package/dist/content/content/design-system/README.md +0 -231
- package/dist/content/content/design-system/data/charts.csv +0 -26
- package/dist/content/content/design-system/data/colors.csv +0 -97
- package/dist/content/content/design-system/data/icons.csv +0 -101
- package/dist/content/content/design-system/data/landing.csv +0 -31
- package/dist/content/content/design-system/data/products.csv +0 -97
- package/dist/content/content/design-system/data/prompts.csv +0 -24
- package/dist/content/content/design-system/data/react-performance.csv +0 -45
- package/dist/content/content/design-system/data/styles.csv +0 -59
- package/dist/content/content/design-system/data/typography.csv +0 -58
- package/dist/content/content/design-system/data/ui-reasoning.csv +0 -101
- package/dist/content/content/design-system/data/ux-guidelines.csv +0 -100
- package/dist/content/content/design-system/data/web-interface.csv +0 -31
- package/dist/content/content/design-system/indexes/README.md +0 -211
- package/dist/content/content/design-system/indexes/colors-index.md +0 -156
- package/dist/content/content/design-system/indexes/quick-search.md +0 -111
- package/dist/content/content/design-system/indexes/stacks-index.md +0 -341
- package/dist/content/content/design-system/stacks/flutter.csv +0 -53
- package/dist/content/content/design-system/stacks/html-tailwind.csv +0 -56
- package/dist/content/content/design-system/stacks/jetpack-compose.csv +0 -53
- package/dist/content/content/design-system/stacks/nextjs.csv +0 -53
- package/dist/content/content/design-system/stacks/nuxt-ui.csv +0 -51
- package/dist/content/content/design-system/stacks/nuxtjs.csv +0 -59
- package/dist/content/content/design-system/stacks/react-native.csv +0 -52
- package/dist/content/content/design-system/stacks/react.csv +0 -54
- package/dist/content/content/design-system/stacks/shadcn.csv +0 -61
- package/dist/content/content/design-system/stacks/svelte.csv +0 -54
- package/dist/content/content/design-system/stacks/swiftui.csv +0 -51
- package/dist/content/content/design-system/stacks/vue.csv +0 -50
- package/dist/content/content/examples/Exemplo de Fluxo Completo com Java e Spring Boot.md +0 -250
- package/dist/content/content/examples/Exemplo de Fluxo Completo com Laravel e Filament.md +0 -278
- package/dist/content/content/examples/Exemplo de Fluxo Completo com Laravel e Livewire.md +0 -261
- package/dist/content/content/examples/Exemplo de Fluxo Completo com Node e NestJS.md +0 -258
- package/dist/content/content/guides/Cat/303/241logo de Stacks para Cloud Moderna.md" +0 -119
- package/dist/content/content/guides/Cat/303/241logo de Stacks para Hospedagem Compartilhada.md" +0 -147
- package/dist/content/content/guides/Checklist Mestre de Entrega.md +0 -68
- package/dist/content/content/guides/Gates de Qualidade.md +0 -209
- package/dist/content/content/guides/Guia de Adi/303/247/303/243o de Novas Funcionalidades.md" +0 -355
- package/dist/content/content/guides/Guia de Chaos Engineering.md +0 -267
- package/dist/content/content/guides/Guia de Debugging com IA.md +0 -135
- package/dist/content/content/guides/Guia de Estrat/303/251gias de Cache.md" +0 -352
- package/dist/content/content/guides/Guia de Migrations Zero-Downtime.md +0 -311
- package/dist/content/content/guides/Guia de Multi-tenancy.md +0 -368
- package/dist/content/content/guides/Guia de Otimiza/303/247/303/243o de Custos Cloud.md" +0 -195
- package/dist/content/content/guides/Guia de Refatora/303/247/303/243o de C/303/263digo Legado com IA.md" +0 -162
- package/dist/content/content/guides/Guia de SLOs e Error Budgets.md +0 -315
- package/dist/content/content/guides/M/303/251tricas de Efici/303/252ncia do Desenvolvimento com IA.md" +0 -93
- package/dist/content/content/guides/Rules base.md +0 -90
- package/dist/content/content/playbook/Playbook de Desenvolvimento com IA.md +0 -364
- package/dist/content/content/prompts/README.md +0 -203
- package/dist/content/content/prompts/acessibilidade/analise-acessibilidade.md +0 -257
- package/dist/content/content/prompts/apis/design-api-rest.md +0 -303
- package/dist/content/content/prompts/apis/idempotencia.md +0 -254
- package/dist/content/content/prompts/apis/versionamento.md +0 -313
- package/dist/content/content/prompts/arquitetura/arquitetura-c4-completo.md +0 -190
- package/dist/content/content/prompts/arquitetura/clean-architecture.md +0 -151
- package/dist/content/content/prompts/arquitetura/ddd-bounded-contexts.md +0 -183
- package/dist/content/content/prompts/arquitetura/ddd-cqrs.md +0 -176
- package/dist/content/content/prompts/arquitetura/modelo-dominio.md +0 -207
- package/dist/content/content/prompts/arquitetura/multi-tenancy.md +0 -235
- package/dist/content/content/prompts/database/migrations-zero-downtime.md +0 -192
- package/dist/content/content/prompts/database/otimizacao-queries.md +0 -296
- package/dist/content/content/prompts/desenvolvimento/code-review.md +0 -301
- package/dist/content/content/prompts/desenvolvimento/gerar-servico.md +0 -271
- package/dist/content/content/prompts/devops/docker-compose.md +0 -336
- package/dist/content/content/prompts/devops/feature-flags.md +0 -374
- package/dist/content/content/prompts/devops/kubernetes-deploy.md +0 -460
- package/dist/content/content/prompts/devops/pipeline-cicd.md +0 -358
- package/dist/content/content/prompts/devops/terraform-iac.md +0 -502
- package/dist/content/content/prompts/escalabilidade/analise-performance.md +0 -240
- package/dist/content/content/prompts/escalabilidade/analise-performance.txt +0 -94
- package/dist/content/content/prompts/escalabilidade/caching.md +0 -255
- package/dist/content/content/prompts/observabilidade/chaos-testing.md +0 -237
- package/dist/content/content/prompts/observabilidade/estrategia-observabilidade.md +0 -263
- package/dist/content/content/prompts/observabilidade/estrategia-observabilidade.txt +0 -134
- package/dist/content/content/prompts/observabilidade/slos.md +0 -215
- package/dist/content/content/prompts/produto/discovery-inicial.md +0 -203
- package/dist/content/content/prompts/produto/discovery-inicial.txt +0 -33
- package/dist/content/content/prompts/requisitos/refinar-requisitos.md +0 -232
- package/dist/content/content/prompts/requisitos/refinar-requisitos.txt +0 -40
- package/dist/content/content/prompts/seguranca/analise-seguranca.md +0 -243
- package/dist/content/content/prompts/seguranca/pentest-checklist.md +0 -333
- package/dist/content/content/prompts/seguranca/rate-limiting.md +0 -356
- package/dist/content/content/prompts/seguranca/revisao-lgpd.md +0 -227
- package/dist/content/content/prompts/seguranca/threat-modeling.md +0 -224
- package/dist/content/content/prompts/testes/contract-testing.md +0 -340
- package/dist/content/content/prompts/testes/gerar-testes-unitarios.md +0 -474
- package/dist/content/content/prompts/testes/testes-e2e.md +0 -460
- package/dist/content/content/prompts/testes/testes-integracao.md +0 -418
- package/dist/content/content/prompts/testes/testes-performance.md +0 -458
- package/dist/content/content/prompts/ux/gerar-ui-stitch.md +0 -151
- package/dist/content/content/rules/GEMINI.md +0 -841
- package/dist/content/content/rules/RULES.md +0 -835
- package/dist/content/content/rules/adapters/copilot.md +0 -10
- package/dist/content/content/rules/adapters/cursor.md +0 -10
- package/dist/content/content/rules/adapters/gemini.md +0 -13
- package/dist/content/content/rules/adapters/windsurf.md +0 -10
- package/dist/content/content/skills/api-patterns/SKILL.md +0 -81
- package/dist/content/content/skills/api-patterns/api-style.md +0 -42
- package/dist/content/content/skills/api-patterns/auth.md +0 -24
- package/dist/content/content/skills/api-patterns/documentation.md +0 -26
- package/dist/content/content/skills/api-patterns/graphql.md +0 -41
- package/dist/content/content/skills/api-patterns/rate-limiting.md +0 -31
- package/dist/content/content/skills/api-patterns/response.md +0 -37
- package/dist/content/content/skills/api-patterns/rest.md +0 -40
- package/dist/content/content/skills/api-patterns/scripts/api_validator.py +0 -211
- package/dist/content/content/skills/api-patterns/security-testing.md +0 -122
- package/dist/content/content/skills/api-patterns/trpc.md +0 -41
- package/dist/content/content/skills/api-patterns/versioning.md +0 -22
- package/dist/content/content/skills/app-builder/SKILL.md +0 -75
- package/dist/content/content/skills/app-builder/agent-coordination.md +0 -71
- package/dist/content/content/skills/app-builder/feature-building.md +0 -53
- package/dist/content/content/skills/app-builder/project-detection.md +0 -34
- package/dist/content/content/skills/app-builder/scaffolding.md +0 -118
- package/dist/content/content/skills/app-builder/tech-stack.md +0 -40
- package/dist/content/content/skills/app-builder/templates/SKILL.md +0 -39
- package/dist/content/content/skills/app-builder/templates/astro-static/TEMPLATE.md +0 -76
- package/dist/content/content/skills/app-builder/templates/chrome-extension/TEMPLATE.md +0 -92
- package/dist/content/content/skills/app-builder/templates/cli-tool/TEMPLATE.md +0 -88
- package/dist/content/content/skills/app-builder/templates/electron-desktop/TEMPLATE.md +0 -88
- package/dist/content/content/skills/app-builder/templates/express-api/TEMPLATE.md +0 -83
- package/dist/content/content/skills/app-builder/templates/flutter-app/TEMPLATE.md +0 -90
- package/dist/content/content/skills/app-builder/templates/monorepo-turborepo/TEMPLATE.md +0 -90
- package/dist/content/content/skills/app-builder/templates/nextjs-fullstack/TEMPLATE.md +0 -82
- package/dist/content/content/skills/app-builder/templates/nextjs-saas/TEMPLATE.md +0 -100
- package/dist/content/content/skills/app-builder/templates/nextjs-static/TEMPLATE.md +0 -106
- package/dist/content/content/skills/app-builder/templates/nuxt-app/TEMPLATE.md +0 -101
- package/dist/content/content/skills/app-builder/templates/python-fastapi/TEMPLATE.md +0 -83
- package/dist/content/content/skills/app-builder/templates/react-native-app/TEMPLATE.md +0 -93
- package/dist/content/content/skills/architecture/SKILL.md +0 -55
- package/dist/content/content/skills/architecture/context-discovery.md +0 -43
- package/dist/content/content/skills/architecture/examples.md +0 -94
- package/dist/content/content/skills/architecture/pattern-selection.md +0 -68
- package/dist/content/content/skills/architecture/patterns-reference.md +0 -50
- package/dist/content/content/skills/architecture/trade-off-analysis.md +0 -77
- package/dist/content/content/skills/bash-linux/SKILL.md +0 -199
- package/dist/content/content/skills/behavioral-modes/SKILL.md +0 -242
- package/dist/content/content/skills/brainstorming/SKILL.md +0 -163
- package/dist/content/content/skills/brainstorming/dynamic-questioning.md +0 -350
- package/dist/content/content/skills/clean-code/SKILL.md +0 -201
- package/dist/content/content/skills/code-review-checklist/SKILL.md +0 -109
- package/dist/content/content/skills/database-design/SKILL.md +0 -52
- package/dist/content/content/skills/database-design/database-selection.md +0 -43
- package/dist/content/content/skills/database-design/indexing.md +0 -39
- package/dist/content/content/skills/database-design/migrations.md +0 -48
- package/dist/content/content/skills/database-design/optimization.md +0 -36
- package/dist/content/content/skills/database-design/orm-selection.md +0 -30
- package/dist/content/content/skills/database-design/schema-design.md +0 -56
- package/dist/content/content/skills/database-design/scripts/schema_validator.py +0 -172
- package/dist/content/content/skills/deployment-procedures/SKILL.md +0 -241
- package/dist/content/content/skills/doc.md +0 -177
- package/dist/content/content/skills/documentation-templates/SKILL.md +0 -194
- package/dist/content/content/skills/frontend-design/SKILL.md +0 -396
- package/dist/content/content/skills/frontend-design/animation-guide.md +0 -331
- package/dist/content/content/skills/frontend-design/color-system.md +0 -311
- package/dist/content/content/skills/frontend-design/decision-trees.md +0 -418
- package/dist/content/content/skills/frontend-design/motion-graphics.md +0 -306
- package/dist/content/content/skills/frontend-design/scripts/accessibility_checker.py +0 -183
- package/dist/content/content/skills/frontend-design/scripts/ux_audit.py +0 -722
- package/dist/content/content/skills/frontend-design/typography-system.md +0 -345
- package/dist/content/content/skills/frontend-design/ux-psychology.md +0 -541
- package/dist/content/content/skills/frontend-design/visual-effects.md +0 -383
- package/dist/content/content/skills/game-development/2d-games/SKILL.md +0 -119
- package/dist/content/content/skills/game-development/3d-games/SKILL.md +0 -135
- package/dist/content/content/skills/game-development/SKILL.md +0 -167
- package/dist/content/content/skills/game-development/game-art/SKILL.md +0 -185
- package/dist/content/content/skills/game-development/game-audio/SKILL.md +0 -190
- package/dist/content/content/skills/game-development/game-design/SKILL.md +0 -129
- package/dist/content/content/skills/game-development/mobile-games/SKILL.md +0 -108
- package/dist/content/content/skills/game-development/multiplayer/SKILL.md +0 -132
- package/dist/content/content/skills/game-development/pc-games/SKILL.md +0 -144
- package/dist/content/content/skills/game-development/vr-ar/SKILL.md +0 -123
- package/dist/content/content/skills/game-development/web-games/SKILL.md +0 -150
- package/dist/content/content/skills/geo-fundamentals/SKILL.md +0 -156
- package/dist/content/content/skills/geo-fundamentals/scripts/geo_checker.py +0 -289
- package/dist/content/content/skills/i18n-localization/SKILL.md +0 -154
- package/dist/content/content/skills/i18n-localization/scripts/i18n_checker.py +0 -241
- package/dist/content/content/skills/intelligent-routing/SKILL.md +0 -334
- package/dist/content/content/skills/lint-and-validate/SKILL.md +0 -45
- package/dist/content/content/skills/lint-and-validate/scripts/lint_runner.py +0 -172
- package/dist/content/content/skills/lint-and-validate/scripts/type_coverage.py +0 -173
- package/dist/content/content/skills/mcp-builder/SKILL.md +0 -176
- package/dist/content/content/skills/mobile-design/SKILL.md +0 -394
- package/dist/content/content/skills/mobile-design/decision-trees.md +0 -516
- package/dist/content/content/skills/mobile-design/mobile-backend.md +0 -491
- package/dist/content/content/skills/mobile-design/mobile-color-system.md +0 -420
- package/dist/content/content/skills/mobile-design/mobile-debugging.md +0 -122
- package/dist/content/content/skills/mobile-design/mobile-design-thinking.md +0 -357
- package/dist/content/content/skills/mobile-design/mobile-navigation.md +0 -458
- package/dist/content/content/skills/mobile-design/mobile-performance.md +0 -767
- package/dist/content/content/skills/mobile-design/mobile-testing.md +0 -356
- package/dist/content/content/skills/mobile-design/mobile-typography.md +0 -433
- package/dist/content/content/skills/mobile-design/platform-android.md +0 -666
- package/dist/content/content/skills/mobile-design/platform-ios.md +0 -561
- package/dist/content/content/skills/mobile-design/scripts/mobile_audit.py +0 -670
- package/dist/content/content/skills/mobile-design/touch-psychology.md +0 -537
- package/dist/content/content/skills/nextjs-best-practices/SKILL.md +0 -203
- package/dist/content/content/skills/nodejs-best-practices/SKILL.md +0 -333
- package/dist/content/content/skills/parallel-agents/SKILL.md +0 -175
- package/dist/content/content/skills/performance-profiling/SKILL.md +0 -143
- package/dist/content/content/skills/performance-profiling/scripts/lighthouse_audit.py +0 -76
- package/dist/content/content/skills/plan-writing/SKILL.md +0 -152
- package/dist/content/content/skills/powershell-windows/SKILL.md +0 -167
- package/dist/content/content/skills/python-patterns/SKILL.md +0 -441
- package/dist/content/content/skills/react-patterns/SKILL.md +0 -198
- package/dist/content/content/skills/red-team-tactics/SKILL.md +0 -199
- package/dist/content/content/skills/seo-fundamentals/SKILL.md +0 -129
- package/dist/content/content/skills/seo-fundamentals/scripts/seo_checker.py +0 -219
- package/dist/content/content/skills/server-management/SKILL.md +0 -161
- package/dist/content/content/skills/systematic-debugging/SKILL.md +0 -109
- package/dist/content/content/skills/tailwind-patterns/SKILL.md +0 -269
- package/dist/content/content/skills/tdd-workflow/SKILL.md +0 -149
- package/dist/content/content/skills/testing-patterns/SKILL.md +0 -178
- package/dist/content/content/skills/testing-patterns/scripts/test_runner.py +0 -219
- package/dist/content/content/skills/vulnerability-scanner/SKILL.md +0 -276
- package/dist/content/content/skills/vulnerability-scanner/checklists.md +0 -121
- package/dist/content/content/skills/vulnerability-scanner/scripts/security_scan.py +0 -458
- package/dist/content/content/skills/webapp-testing/SKILL.md +0 -187
- package/dist/content/content/skills/webapp-testing/scripts/playwright_runner.py +0 -173
- package/dist/content/content/specialists/Especialista em Acessibilidade.md +0 -266
- package/dist/content/content/specialists/Especialista em An/303/241lise de Testes.md" +0 -434
- package/dist/content/content/specialists/Especialista em Arquitetura Avan/303/247ada.md" +0 -358
- package/dist/content/content/specialists/Especialista em Arquitetura de Software.md +0 -177
- package/dist/content/content/specialists/Especialista em Banco de Dados.md +0 -260
- package/dist/content/content/specialists/Especialista em Contrato de API.md +0 -172
- package/dist/content/content/specialists/Especialista em Dados e Analytics com IA.md +0 -246
- package/dist/content/content/specialists/Especialista em Debugging e Troubleshooting.md +0 -191
- package/dist/content/content/specialists/Especialista em Desenvolvimento Frontend.md +0 -477
- package/dist/content/content/specialists/Especialista em Desenvolvimento Mobile.md +0 -241
- package/dist/content/content/specialists/Especialista em Desenvolvimento e Vibe Coding Estruturado.md +0 -417
- package/dist/content/content/specialists/Especialista em DevOps e Infraestrutura.md +0 -294
- package/dist/content/content/specialists/Especialista em Documenta/303/247/303/243o T/303/251cnica.md" +0 -227
- package/dist/content/content/specialists/Especialista em Engenharia de Requisitos com IA.md +0 -299
- package/dist/content/content/specialists/Especialista em Explora/303/247/303/243o de Codebase.md" +0 -179
- package/dist/content/content/specialists/Especialista em Gest/303/243o de Produto.md" +0 -179
- package/dist/content/content/specialists/Especialista em Migra/303/247/303/243o e Moderniza/303/247/303/243o.md" +0 -410
- package/dist/content/content/specialists/Especialista em Modelagem e Arquitetura de Dom/303/255nio com IA.md" +0 -248
- package/dist/content/content/specialists/Especialista em Observabilidade.md +0 -415
- package/dist/content/content/specialists/Especialista em Performance e Escalabilidade.md +0 -373
- package/dist/content/content/specialists/Especialista em Plano de Execu/303/247/303/243o com IA.md" +0 -341
- package/dist/content/content/specialists/Especialista em Prototipagem R/303/241pida com Google Stitch.md" +0 -419
- package/dist/content/content/specialists/Especialista em Seguran/303/247a da Informa/303/247/303/243o.md" +0 -508
- package/dist/content/content/specialists/Especialista em UX Design.md +0 -453
- package/dist/content/content/specialists/INDEX.md +0 -43
- package/dist/content/content/templates/PRD.md +0 -165
- package/dist/content/content/templates/README.md +0 -65
- package/dist/content/content/templates/adr.md +0 -103
- package/dist/content/content/templates/arquitetura.md +0 -279
- package/dist/content/content/templates/backlog.md +0 -185
- package/dist/content/content/templates/checklist-seguranca.md +0 -180
- package/dist/content/content/templates/contexto.md +0 -120
- package/dist/content/content/templates/criterios-aceite.md +0 -99
- package/dist/content/content/templates/design-banco.md +0 -270
- package/dist/content/content/templates/design-doc.md +0 -240
- package/dist/content/content/templates/feature.md +0 -88
- package/dist/content/content/templates/historia-backend.md +0 -84
- package/dist/content/content/templates/historia-frontend.md +0 -75
- package/dist/content/content/templates/historia-usuario.md +0 -125
- package/dist/content/content/templates/mapa-navegacao.md +0 -133
- package/dist/content/content/templates/matriz-rastreabilidade.md +0 -121
- package/dist/content/content/templates/modelo-dominio.md +0 -219
- package/dist/content/content/templates/plano-testes.md +0 -199
- package/dist/content/content/templates/prototipo-stitch.md +0 -138
- package/dist/content/content/templates/requisitos.md +0 -162
- package/dist/content/content/templates/slo-sli.md +0 -197
- package/dist/content/content/workflows/README-MCP.md +0 -363
- package/dist/content/content/workflows/brainstorm.md +0 -113
- package/dist/content/content/workflows/create.md +0 -59
- package/dist/content/content/workflows/debug.md +0 -103
- package/dist/content/content/workflows/deploy.md +0 -176
- package/dist/content/content/workflows/enhance.md +0 -63
- package/dist/content/content/workflows/mcp-debug.md +0 -506
- package/dist/content/content/workflows/mcp-feature.md +0 -385
- package/dist/content/content/workflows/mcp-gate.md +0 -413
- package/dist/content/content/workflows/mcp-next.md +0 -388
- package/dist/content/content/workflows/mcp-refactor.md +0 -600
- package/dist/content/content/workflows/mcp-start.md +0 -304
- package/dist/content/content/workflows/mcp-status.md +0 -400
- package/dist/content/content/workflows/orchestrate.md +0 -237
- package/dist/content/content/workflows/plan.md +0 -89
- package/dist/content/content/workflows/preview.md +0 -81
- package/dist/content/content/workflows/status.md +0 -86
- package/dist/content/content/workflows/test.md +0 -144
- package/dist/content/content/workflows/ui-ux-pro-max.md +0 -296
|
@@ -1,356 +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)
|
|
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)
|