proagents 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/LICENSE +21 -0
- package/README.md +170 -0
- package/bin/proagents.js +90 -0
- package/lib/commands/feature.js +125 -0
- package/lib/commands/fix.js +60 -0
- package/lib/commands/help.js +76 -0
- package/lib/commands/init.js +64 -0
- package/lib/commands/status.js +91 -0
- package/lib/index.js +28 -0
- package/package.json +52 -0
- package/proagents/.learning/global/common-patterns.json +77 -0
- package/proagents/.learning/global/user-preferences.json +76 -0
- package/proagents/.learning/projects/example-project/corrections.json +99 -0
- package/proagents/.learning/projects/example-project/feedback.json +109 -0
- package/proagents/.learning/projects/example-project/metrics.json +101 -0
- package/proagents/.learning/projects/example-project/patterns.json +102 -0
- package/proagents/.learning/schemas/README.md +48 -0
- package/proagents/.learning/schemas/corrections-schema.json +100 -0
- package/proagents/.learning/schemas/feedback-schema.json +144 -0
- package/proagents/.learning/schemas/metrics-schema.json +96 -0
- package/proagents/.learning/schemas/patterns-schema.json +82 -0
- package/proagents/.learning/schemas/project-patterns-schema.json +125 -0
- package/proagents/.learning/schemas/user-preferences-schema.json +136 -0
- package/proagents/GETTING-STARTED-STORY.md +708 -0
- package/proagents/README.md +99 -0
- package/proagents/WORKFLOW.md +1234 -0
- package/proagents/active-features/.gitkeep +0 -0
- package/proagents/active-features/README.md +176 -0
- package/proagents/active-features/_index.json +74 -0
- package/proagents/active-features/feature-user-auth/dependencies.json +81 -0
- package/proagents/active-features/feature-user-auth/files-modified.json +126 -0
- package/proagents/active-features/feature-user-auth/status.json +122 -0
- package/proagents/active-features/schemas/dependencies-schema.json +119 -0
- package/proagents/active-features/schemas/feature-schema.json +132 -0
- package/proagents/active-features/schemas/files-schema.json +100 -0
- package/proagents/active-features/schemas/index-schema.json +95 -0
- package/proagents/adr/README.md +302 -0
- package/proagents/adr/examples/api-versioning.md +297 -0
- package/proagents/adr/examples/database-choice.md +264 -0
- package/proagents/adr/template.md +273 -0
- package/proagents/ai-models/README.md +141 -0
- package/proagents/ai-models/cost-management.md +362 -0
- package/proagents/ai-models/fallbacks.md +342 -0
- package/proagents/ai-models/model-config.md +318 -0
- package/proagents/ai-models/task-routing.md +503 -0
- package/proagents/ai-training/README.md +155 -0
- package/proagents/ai-training/continuous-learning.md +413 -0
- package/proagents/ai-training/domain-knowledge.md +378 -0
- package/proagents/ai-training/pattern-learning.md +455 -0
- package/proagents/ai-training/training-data.md +337 -0
- package/proagents/ai-training/user-preferences.md +346 -0
- package/proagents/api-versioning/README.md +257 -0
- package/proagents/api-versioning/changelog-template.md +225 -0
- package/proagents/api-versioning/deprecation-workflow.md +470 -0
- package/proagents/api-versioning/versioning-strategy.md +291 -0
- package/proagents/approval-workflows/README.md +146 -0
- package/proagents/approval-workflows/approval-config.md +332 -0
- package/proagents/approval-workflows/approval-stages.md +503 -0
- package/proagents/approval-workflows/emergency-bypass.md +351 -0
- package/proagents/approval-workflows/examples.md +859 -0
- package/proagents/approval-workflows/notifications.md +320 -0
- package/proagents/automation/README.md +38 -0
- package/proagents/automation/ai-behavior-rules.md +339 -0
- package/proagents/automation/ai-prompt-injection.md +331 -0
- package/proagents/automation/auto-decisions.md +535 -0
- package/proagents/automation/decision-defaults.yaml +317 -0
- package/proagents/cache/README.md +110 -0
- package/proagents/cache/analysis-metadata.json +76 -0
- package/proagents/cache/conventions.json +125 -0
- package/proagents/cache/dependencies.json +85 -0
- package/proagents/cache/features.json +115 -0
- package/proagents/cache/patterns.json +105 -0
- package/proagents/cache/schemas/conventions-schema.json +138 -0
- package/proagents/cache/schemas/dependencies-schema.json +95 -0
- package/proagents/cache/schemas/features-schema.json +104 -0
- package/proagents/cache/schemas/metadata-schema.json +83 -0
- package/proagents/cache/schemas/patterns-schema.json +136 -0
- package/proagents/cache/schemas/structure-schema.json +72 -0
- package/proagents/cache/structure.json +109 -0
- package/proagents/changelog/2024/01/2024-01-10-api-url-config.md +41 -0
- package/proagents/changelog/2024/01/2024-01-12-login-bug-fix.md +69 -0
- package/proagents/changelog/2024/01/2024-01-15-user-auth-feature.md +99 -0
- package/proagents/changelog/CHANGELOG.md +82 -0
- package/proagents/changelog/README.md +327 -0
- package/proagents/changelog/entry-template.md +283 -0
- package/proagents/checklists/README.md +261 -0
- package/proagents/checklists/code-quality.md +137 -0
- package/proagents/checklists/code-review.md +148 -0
- package/proagents/checklists/pr-checklist.md +78 -0
- package/proagents/checklists/pre-deployment.md +132 -0
- package/proagents/checklists/pre-implementation.md +80 -0
- package/proagents/checklists/testing.md +120 -0
- package/proagents/cicd/README.md +338 -0
- package/proagents/cicd/azure-devops.md +267 -0
- package/proagents/cicd/github-actions.md +375 -0
- package/proagents/cicd/gitlab-ci.md +278 -0
- package/proagents/cicd/jenkins.md +317 -0
- package/proagents/cli/README.md +392 -0
- package/proagents/cli/commands-reference.md +893 -0
- package/proagents/cli/ide-integration.md +584 -0
- package/proagents/cli/shortcuts.md +394 -0
- package/proagents/cli/slash-commands.md +507 -0
- package/proagents/collaboration/README.md +143 -0
- package/proagents/collaboration/roles.md +248 -0
- package/proagents/collaboration/sessions.md +390 -0
- package/proagents/collaboration/sync.md +358 -0
- package/proagents/compliance/README.md +206 -0
- package/proagents/compliance/access-control.md +310 -0
- package/proagents/compliance/audit-logging.md +444 -0
- package/proagents/compliance/compliance-frameworks.md +429 -0
- package/proagents/compliance/reports.md +491 -0
- package/proagents/compliance/retention-policies.md +454 -0
- package/proagents/config/README.md +181 -0
- package/proagents/config/integrations/README.md +68 -0
- package/proagents/config/integrations/github.yaml +211 -0
- package/proagents/config/integrations/jira.yaml +144 -0
- package/proagents/config/integrations/linear.yaml +157 -0
- package/proagents/config/integrations/notion.yaml +203 -0
- package/proagents/config/integrations/slack.yaml +230 -0
- package/proagents/config/rules/README.md +73 -0
- package/proagents/config/rules/custom-rules.template.yaml +188 -0
- package/proagents/config/rules/validation-rules.template.yaml +177 -0
- package/proagents/config/standards/README.md +58 -0
- package/proagents/config/standards/architecture-rules.template.md +124 -0
- package/proagents/config/standards/coding-standards.template.md +107 -0
- package/proagents/config/standards/naming-conventions.template.md +114 -0
- package/proagents/config/standards/testing-standards.template.md +213 -0
- package/proagents/config/templates/README.md +74 -0
- package/proagents/config/templates/api-route.template.ts +142 -0
- package/proagents/config/templates/component.template.tsx +55 -0
- package/proagents/config/templates/hook.template.ts +93 -0
- package/proagents/config/templates/test.template.ts +171 -0
- package/proagents/config-versioning/README.md +120 -0
- package/proagents/config-versioning/changelog.md +300 -0
- package/proagents/config-versioning/rollback.md +283 -0
- package/proagents/config-versioning/versioning.md +330 -0
- package/proagents/contract-testing/README.md +223 -0
- package/proagents/contract-testing/contract-testing.md +614 -0
- package/proagents/contract-testing/pact-integration.md +507 -0
- package/proagents/contract-testing/schema-validation.md +565 -0
- package/proagents/cost/README.md +48 -0
- package/proagents/cost/cost-template.md +283 -0
- package/proagents/cost/estimation-framework.md +287 -0
- package/proagents/database/README.md +72 -0
- package/proagents/database/examples/001-create-users.sql +129 -0
- package/proagents/database/examples/002-add-preferences.sql +94 -0
- package/proagents/database/examples/003-add-index.sql +105 -0
- package/proagents/database/examples/004-rename-column.sql +122 -0
- package/proagents/database/examples/005-add-foreign-key.sql +142 -0
- package/proagents/database/examples/006-data-migration.sql +196 -0
- package/proagents/database/examples/007-drop-column.sql +163 -0
- package/proagents/database/examples/README.md +89 -0
- package/proagents/database/migration-workflow.md +478 -0
- package/proagents/database/rollback-scripts.md +487 -0
- package/proagents/database/safety-checks.md +447 -0
- package/proagents/dependency-management/README.md +140 -0
- package/proagents/dependency-management/automation.md +363 -0
- package/proagents/dependency-management/compatibility.md +319 -0
- package/proagents/dependency-management/security-scanning.md +413 -0
- package/proagents/dependency-management/update-policies.md +374 -0
- package/proagents/disaster-recovery/README.md +247 -0
- package/proagents/disaster-recovery/automation.md +366 -0
- package/proagents/disaster-recovery/backup-recovery.md +571 -0
- package/proagents/disaster-recovery/incident-response.md +565 -0
- package/proagents/disaster-recovery/rollback-procedures.md +499 -0
- package/proagents/disaster-recovery/runbooks.md +603 -0
- package/proagents/disaster-recovery/scenarios.md +892 -0
- package/proagents/disaster-recovery/testing.md +438 -0
- package/proagents/environments/README.md +244 -0
- package/proagents/environments/configuration.md +437 -0
- package/proagents/environments/promotion.md +434 -0
- package/proagents/environments/setup.md +420 -0
- package/proagents/examples/README.md +55 -0
- package/proagents/examples/backend-nodejs/README.md +188 -0
- package/proagents/examples/backend-nodejs/complete-conversation.md +601 -0
- package/proagents/examples/backend-nodejs/proagents.config.yaml +415 -0
- package/proagents/examples/backend-nodejs/workflow-example.md +909 -0
- package/proagents/examples/fullstack-nextjs/README.md +155 -0
- package/proagents/examples/fullstack-nextjs/complete-conversation.md +604 -0
- package/proagents/examples/fullstack-nextjs/proagents.config.yaml +287 -0
- package/proagents/examples/fullstack-nextjs/workflow-example.md +553 -0
- package/proagents/examples/mobile-react-native/README.md +171 -0
- package/proagents/examples/mobile-react-native/complete-conversation.md +825 -0
- package/proagents/examples/mobile-react-native/proagents.config.yaml +330 -0
- package/proagents/examples/mobile-react-native/workflow-example.md +723 -0
- package/proagents/examples/web-frontend-react/README.md +125 -0
- package/proagents/examples/web-frontend-react/complete-conversation.md +556 -0
- package/proagents/examples/web-frontend-react/proagents.config.yaml +183 -0
- package/proagents/examples/web-frontend-react/workflow-example.md +603 -0
- package/proagents/existing-projects/README.md +65 -0
- package/proagents/existing-projects/challenges.md +861 -0
- package/proagents/existing-projects/coexistence-mode.md +483 -0
- package/proagents/existing-projects/compatibility-assessment.md +541 -0
- package/proagents/existing-projects/gradual-adoption.md +515 -0
- package/proagents/existing-projects/migration-strategies.md +788 -0
- package/proagents/existing-projects/pattern-reconciliation.md +489 -0
- package/proagents/existing-projects/team-onboarding.md +617 -0
- package/proagents/existing-projects/technical-debt-handling.md +644 -0
- package/proagents/feature-flags/README.md +263 -0
- package/proagents/feature-flags/ab-testing.md +413 -0
- package/proagents/feature-flags/configuration.md +420 -0
- package/proagents/feature-flags/kill-switches.md +444 -0
- package/proagents/feature-flags/rollout-strategies.md +392 -0
- package/proagents/getting-started/README.md +60 -0
- package/proagents/getting-started/ai-training-setup.md +380 -0
- package/proagents/getting-started/ide-setup.md +195 -0
- package/proagents/getting-started/mcp-setup.md +239 -0
- package/proagents/getting-started/pm-integration.md +336 -0
- package/proagents/getting-started/prompt-engineering.md +478 -0
- package/proagents/getting-started/team-onboarding.md +236 -0
- package/proagents/git/README.md +68 -0
- package/proagents/git/branch-strategy.md +164 -0
- package/proagents/git/commit-conventions.md +241 -0
- package/proagents/git/pr-workflow.md +286 -0
- package/proagents/git/rollback-procedures.md +416 -0
- package/proagents/i18n/README.md +133 -0
- package/proagents/i18n/extraction.md +433 -0
- package/proagents/i18n/tms-integration.md +332 -0
- package/proagents/i18n/translation-workflow.md +413 -0
- package/proagents/i18n/validation.md +355 -0
- package/proagents/ide-integration/README.md +124 -0
- package/proagents/ide-integration/cline-config.md +429 -0
- package/proagents/ide-integration/continue-config.md +380 -0
- package/proagents/ide-integration/cursor-rules.md +280 -0
- package/proagents/ide-integration/github-copilot.md +384 -0
- package/proagents/ide-integration/windsurf-rules.md +314 -0
- package/proagents/integrations/README.md +97 -0
- package/proagents/integrations/pm/README.md +344 -0
- package/proagents/learning/README.md +136 -0
- package/proagents/learning/adaptation.md +305 -0
- package/proagents/learning/data-collection.md +283 -0
- package/proagents/learning/implementation-guide.md +865 -0
- package/proagents/learning/reports.md +306 -0
- package/proagents/logging/README.md +276 -0
- package/proagents/logging/aggregation.md +475 -0
- package/proagents/logging/log-levels.md +376 -0
- package/proagents/logging/sensitive-data.md +423 -0
- package/proagents/logging/structured-logging.md +406 -0
- package/proagents/mcp/README.md +133 -0
- package/proagents/mcp/context-providers.md +442 -0
- package/proagents/mcp/server-config.md +306 -0
- package/proagents/mcp/tools-definition.md +513 -0
- package/proagents/metrics/README.md +174 -0
- package/proagents/metrics/code-quality-kpis.md +461 -0
- package/proagents/metrics/deployment-metrics.md +517 -0
- package/proagents/metrics/developer-productivity.md +368 -0
- package/proagents/metrics/learning-effectiveness.md +478 -0
- package/proagents/migrations/README.md +77 -0
- package/proagents/migrations/from-claude-projects.md +312 -0
- package/proagents/migrations/from-cursor-rules.md +345 -0
- package/proagents/migrations/from-custom-workflows.md +410 -0
- package/proagents/monitoring/README.md +308 -0
- package/proagents/monitoring/alerting.md +449 -0
- package/proagents/monitoring/dashboards.md +454 -0
- package/proagents/monitoring/health-checks.md +436 -0
- package/proagents/monitoring/metrics.md +434 -0
- package/proagents/multi-project/README.md +170 -0
- package/proagents/multi-project/coordinated-deploy.md +510 -0
- package/proagents/multi-project/cross-project-deps.md +395 -0
- package/proagents/multi-project/unified-changelog.md +477 -0
- package/proagents/multi-project/walkthroughs/monorepo-setup.md +787 -0
- package/proagents/multi-project/workspace-config.md +408 -0
- package/proagents/notifications/README.md +151 -0
- package/proagents/notifications/channels.md +457 -0
- package/proagents/notifications/preferences.md +415 -0
- package/proagents/notifications/routing.md +449 -0
- package/proagents/notifications/scheduling.md +425 -0
- package/proagents/notifications/templates.md +446 -0
- package/proagents/offline-mode/README.md +145 -0
- package/proagents/offline-mode/caching.md +344 -0
- package/proagents/offline-mode/offline-operations.md +312 -0
- package/proagents/offline-mode/queue-specifications.md +679 -0
- package/proagents/offline-mode/sync.md +475 -0
- package/proagents/parallel-features/README.md +85 -0
- package/proagents/parallel-features/conflict-detection.md +226 -0
- package/proagents/parallel-features/dependency-management.md +392 -0
- package/proagents/parallel-features/merge-coordination.md +506 -0
- package/proagents/parallel-features/tracking-system.md +416 -0
- package/proagents/patterns/README.md +305 -0
- package/proagents/patterns/api-errors.md +453 -0
- package/proagents/patterns/async-errors.md +521 -0
- package/proagents/patterns/error-types.md +437 -0
- package/proagents/patterns/ui-errors.md +595 -0
- package/proagents/performance/README.md +59 -0
- package/proagents/performance/bundle-analysis.md +375 -0
- package/proagents/performance/load-testing.md +563 -0
- package/proagents/performance/runtime-metrics.md +489 -0
- package/proagents/performance/web-vitals.md +425 -0
- package/proagents/plugins/README.md +139 -0
- package/proagents/plugins/creating-plugins.md +504 -0
- package/proagents/plugins/plugin-api.md +467 -0
- package/proagents/plugins/plugin-registry.md +276 -0
- package/proagents/pm-integration/README.md +151 -0
- package/proagents/pm-integration/asana.md +346 -0
- package/proagents/pm-integration/github-issues.md +308 -0
- package/proagents/pm-integration/gitlab-issues.md +482 -0
- package/proagents/pm-integration/jira.md +364 -0
- package/proagents/pm-integration/linear.md +409 -0
- package/proagents/pm-integration/notion.md +275 -0
- package/proagents/pm-integration/sync-config.md +533 -0
- package/proagents/pm-integration/trello.md +159 -0
- package/proagents/proagents.config.yaml +213 -0
- package/proagents/prompts/00-init-wizard.md +426 -0
- package/proagents/prompts/00-init.md +219 -0
- package/proagents/prompts/01-analysis.md +244 -0
- package/proagents/prompts/02-requirements.md +399 -0
- package/proagents/prompts/03-ui-design.md +493 -0
- package/proagents/prompts/04-planning.md +505 -0
- package/proagents/prompts/05-implementation.md +518 -0
- package/proagents/prompts/06-testing.md +620 -0
- package/proagents/prompts/06.5-code-review.md +512 -0
- package/proagents/prompts/07-documentation.md +673 -0
- package/proagents/prompts/08-deployment.md +539 -0
- package/proagents/prompts/09-rollback.md +554 -0
- package/proagents/prompts/README.md +51 -0
- package/proagents/prompts/accessibility/README.md +146 -0
- package/proagents/prompts/accessibility/aria.md +276 -0
- package/proagents/prompts/accessibility/audit.md +233 -0
- package/proagents/prompts/accessibility/keyboard.md +392 -0
- package/proagents/prompts/accessibility/wcag.md +189 -0
- package/proagents/prompts/debugging/README.md +51 -0
- package/proagents/prompts/debugging/error-analysis.md +385 -0
- package/proagents/prompts/debugging/performance-debug.md +381 -0
- package/proagents/prompts/debugging/systematic.md +270 -0
- package/proagents/prompts/performance/README.md +47 -0
- package/proagents/prompts/performance/analyze.md +265 -0
- package/proagents/prompts/performance/optimize.md +347 -0
- package/proagents/prompts/refactoring/README.md +51 -0
- package/proagents/prompts/refactoring/architecture.md +531 -0
- package/proagents/prompts/refactoring/code-smells.md +174 -0
- package/proagents/prompts/refactoring/patterns.md +516 -0
- package/proagents/prompts/security-audit/README.md +197 -0
- package/proagents/prompts/security-audit/code-review.md +260 -0
- package/proagents/prompts/security-audit/vulnerability-scan.md +288 -0
- package/proagents/reporting/README.md +158 -0
- package/proagents/reporting/dashboards.md +366 -0
- package/proagents/reporting/exports.md +524 -0
- package/proagents/reporting/quality-metrics.md +385 -0
- package/proagents/reporting/templates/README.md +56 -0
- package/proagents/reporting/templates/dashboard-config.json +187 -0
- package/proagents/reporting/templates/metrics-queries.md +427 -0
- package/proagents/reporting/templates/react-dashboard.tsx +544 -0
- package/proagents/reporting/templates/widgets.md +451 -0
- package/proagents/reporting/velocity-metrics.md +340 -0
- package/proagents/reverse-engineering/README.md +151 -0
- package/proagents/reverse-engineering/architecture-extraction.md +325 -0
- package/proagents/reverse-engineering/code-analysis.md +377 -0
- package/proagents/reverse-engineering/dependency-mapping.md +567 -0
- package/proagents/reverse-engineering/diagram-generation.md +586 -0
- package/proagents/reverse-engineering/documentation-generation.md +468 -0
- package/proagents/reverse-engineering/pattern-detection.md +569 -0
- package/proagents/reverse-engineering/quality-assessment.md +733 -0
- package/proagents/rules/README.md +179 -0
- package/proagents/rules/custom-rules-template.yaml +286 -0
- package/proagents/rules/custom-rules.md +754 -0
- package/proagents/rules/validation-rules-template.yaml +517 -0
- package/proagents/runbooks/README.md +219 -0
- package/proagents/runbooks/dependency-vulnerability.md +505 -0
- package/proagents/runbooks/incident-response.md +451 -0
- package/proagents/runbooks/performance-degradation.md +584 -0
- package/proagents/runbooks/production-debugging.md +489 -0
- package/proagents/scaffolding/README.md +64 -0
- package/proagents/scaffolding/nextjs/README.md +578 -0
- package/proagents/scaffolding/nextjs/templates/api-route.ts.template +185 -0
- package/proagents/scaffolding/nextjs/templates/page.tsx.template +109 -0
- package/proagents/scaffolding/nextjs/templates/server-action.ts.template +204 -0
- package/proagents/scaffolding/nodejs/README.md +558 -0
- package/proagents/scaffolding/nodejs/templates/controller.ts.template +167 -0
- package/proagents/scaffolding/nodejs/templates/repository.ts.template +155 -0
- package/proagents/scaffolding/nodejs/templates/service.ts.template +207 -0
- package/proagents/scaffolding/project-types.md +401 -0
- package/proagents/scaffolding/react/README.md +399 -0
- package/proagents/scaffolding/react/templates/component.tsx.template +88 -0
- package/proagents/scaffolding/react/templates/hook.ts.template +127 -0
- package/proagents/scaffolding/react/templates/service.ts.template +155 -0
- package/proagents/scaffolding/react/templates/test.tsx.template +149 -0
- package/proagents/scaffolding/react-native/README.md +476 -0
- package/proagents/scaffolding/react-native/templates/hook.ts.template +226 -0
- package/proagents/scaffolding/react-native/templates/screen.tsx.template +247 -0
- package/proagents/secrets/README.md +278 -0
- package/proagents/secrets/access-control.md +443 -0
- package/proagents/secrets/rotation.md +403 -0
- package/proagents/secrets/scanning.md +487 -0
- package/proagents/secrets/storage.md +394 -0
- package/proagents/security/README.md +71 -0
- package/proagents/security/owasp-checklist.md +390 -0
- package/proagents/security/sast-guide.md +473 -0
- package/proagents/security/security-report-template.md +343 -0
- package/proagents/security/vulnerability-scanning.md +329 -0
- package/proagents/slash-commands.json +161 -0
- package/proagents/standards/README.md +120 -0
- package/proagents/standards/architecture-patterns.md +728 -0
- package/proagents/standards/architecture-rules-template.md +489 -0
- package/proagents/standards/coding-standards-template.md +489 -0
- package/proagents/standards/examples/README.md +61 -0
- package/proagents/standards/examples/nodejs-api.md +560 -0
- package/proagents/standards/examples/react-nextjs.md +428 -0
- package/proagents/standards/naming-conventions-template.md +526 -0
- package/proagents/standards/override-system.md +717 -0
- package/proagents/standards/testing-standards-template.md +220 -0
- package/proagents/team/README.md +256 -0
- package/proagents/team/code-ownership.md +306 -0
- package/proagents/team/communication-templates.md +441 -0
- package/proagents/team/handoff-protocol.md +380 -0
- package/proagents/team/ide-setup/README.md +103 -0
- package/proagents/team/ide-setup/cursor.md +276 -0
- package/proagents/team/ide-setup/jetbrains.md +330 -0
- package/proagents/team/ide-setup/neovim.md +640 -0
- package/proagents/team/ide-setup/vscode.md +348 -0
- package/proagents/team/onboarding.md +278 -0
- package/proagents/templates/README.md +57 -0
- package/proagents/templates/code-review-report.md +255 -0
- package/proagents/templates/codebase-analysis-report.md +315 -0
- package/proagents/templates/deployment-checklist.md +277 -0
- package/proagents/templates/feature-requirements.md +142 -0
- package/proagents/templates/feature-status.md +231 -0
- package/proagents/templates/implementation-plan.md +373 -0
- package/proagents/templates/rollback-plan.md +331 -0
- package/proagents/templates/test-plan.md +336 -0
- package/proagents/templates/ui-specification.md +431 -0
- package/proagents/testing-standards/README.md +229 -0
- package/proagents/testing-standards/coverage-requirements.md +198 -0
- package/proagents/testing-standards/mocking-guidelines.md +478 -0
- package/proagents/testing-standards/test-naming.md +485 -0
- package/proagents/testing-standards/test-patterns.md +488 -0
- package/proagents/troubleshooting/README.md +730 -0
- package/proagents/troubleshooting/ai-issues.md +601 -0
- package/proagents/troubleshooting/workflow-issues.md +571 -0
- package/proagents/ui-integration/README.md +77 -0
- package/proagents/ui-integration/figma-guide.md +217 -0
- package/proagents/ui-integration/manual-export-guide.md +358 -0
- package/proagents/ui-integration/sketch-interpretation.md +471 -0
- package/proagents/webhooks/README.md +126 -0
- package/proagents/webhooks/endpoints.md +298 -0
- package/proagents/webhooks/events.md +316 -0
- package/proagents/webhooks/payloads.md +325 -0
- package/proagents/webhooks/reliability.md +363 -0
- package/proagents/webhooks/security.md +380 -0
- package/proagents/workflow-modes/README.md +136 -0
- package/proagents/workflow-modes/deferred-tracking.md +405 -0
- package/proagents/workflow-modes/entry-modes.md +397 -0
- package/proagents/workflow-modes/guardrails.md +405 -0
- package/proagents/workflow-modes/mode-detection.md +358 -0
- package/proagents/workflow-modes/mode-switching.md +372 -0
|
@@ -0,0 +1,601 @@
|
|
|
1
|
+
# Complete Conversation Example: Node.js API
|
|
2
|
+
|
|
3
|
+
An example of building a backend feature using ProAgents workflow.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Starting Point
|
|
8
|
+
|
|
9
|
+
**User has:** Express + TypeScript API with Prisma ORM and JWT auth.
|
|
10
|
+
|
|
11
|
+
**Goal:** Add a rate limiting system with per-user quotas.
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## The Conversation
|
|
16
|
+
|
|
17
|
+
### User Initiates
|
|
18
|
+
|
|
19
|
+
```
|
|
20
|
+
User: Add rate limiting to our API. I want different limits for different
|
|
21
|
+
user tiers (free, pro, enterprise) and per-endpoint limits for expensive
|
|
22
|
+
operations.
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
### AI Response: Analysis & Understanding
|
|
26
|
+
|
|
27
|
+
```
|
|
28
|
+
AI: I'll help you implement a tiered rate limiting system. Let me analyze
|
|
29
|
+
your codebase first.
|
|
30
|
+
|
|
31
|
+
[Running Analysis...]
|
|
32
|
+
|
|
33
|
+
──────────────────────────────────────────────────────────
|
|
34
|
+
Codebase Analysis Complete
|
|
35
|
+
──────────────────────────────────────────────────────────
|
|
36
|
+
|
|
37
|
+
Tech Stack:
|
|
38
|
+
• Node.js 20.x + TypeScript 5.2
|
|
39
|
+
• Express 4.18
|
|
40
|
+
• Prisma ORM 5.x (PostgreSQL)
|
|
41
|
+
• JWT authentication
|
|
42
|
+
• Redis connected (for caching)
|
|
43
|
+
|
|
44
|
+
Middleware Structure:
|
|
45
|
+
src/middleware/
|
|
46
|
+
├── auth.ts # JWT validation, sets req.user
|
|
47
|
+
├── validate.ts # Zod schema validation
|
|
48
|
+
├── errorHandler.ts # Global error handler
|
|
49
|
+
└── cors.ts # CORS configuration
|
|
50
|
+
|
|
51
|
+
Existing User Model:
|
|
52
|
+
model User {
|
|
53
|
+
id String @id @default(uuid())
|
|
54
|
+
email String @unique
|
|
55
|
+
tier UserTier @default(FREE)
|
|
56
|
+
// ... other fields
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
enum UserTier {
|
|
60
|
+
FREE
|
|
61
|
+
PRO
|
|
62
|
+
ENTERPRISE
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
I see you already have:
|
|
66
|
+
• User tier in the database
|
|
67
|
+
• Redis available for rate limit storage
|
|
68
|
+
• Auth middleware that sets req.user
|
|
69
|
+
|
|
70
|
+
This is a good foundation for tiered rate limiting. Let me gather the
|
|
71
|
+
specific requirements.
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
### AI: Requirements Clarification
|
|
75
|
+
|
|
76
|
+
```
|
|
77
|
+
AI: I have some questions to define the rate limits:
|
|
78
|
+
|
|
79
|
+
1. What are the default rate limits per tier?
|
|
80
|
+
|
|
81
|
+
My suggestion based on common patterns:
|
|
82
|
+
┌────────────────────────────────────────────────────┐
|
|
83
|
+
│ Tier │ Requests/min │ Requests/day │ Burst │
|
|
84
|
+
├────────────────────────────────────────────────────┤
|
|
85
|
+
│ FREE │ 60 │ 1,000 │ 10 │
|
|
86
|
+
│ PRO │ 300 │ 10,000 │ 50 │
|
|
87
|
+
│ ENTERPRISE │ 1,000 │ 100,000 │ 200 │
|
|
88
|
+
└────────────────────────────────────────────────────┘
|
|
89
|
+
|
|
90
|
+
2. Which endpoints need special (lower) limits?
|
|
91
|
+
|
|
92
|
+
Common expensive operations:
|
|
93
|
+
[ ] File uploads
|
|
94
|
+
[ ] Report generation
|
|
95
|
+
[ ] Bulk operations
|
|
96
|
+
[ ] Search with complex queries
|
|
97
|
+
[ ] Export endpoints
|
|
98
|
+
|
|
99
|
+
3. What should happen when rate limited?
|
|
100
|
+
[ ] Return 429 with retry-after header (standard)
|
|
101
|
+
[ ] Return 429 with upgrade prompt
|
|
102
|
+
[ ] Gradually degrade (slower responses)
|
|
103
|
+
|
|
104
|
+
4. Should rate limits reset at midnight or rolling window?
|
|
105
|
+
[ ] Rolling window (recommended)
|
|
106
|
+
[ ] Fixed daily reset
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
### User Provides Details
|
|
110
|
+
|
|
111
|
+
```
|
|
112
|
+
User:
|
|
113
|
+
1. Your suggestions look good, use those numbers
|
|
114
|
+
2. File uploads, report generation, and bulk operations need lower limits
|
|
115
|
+
3. Return 429 with retry-after and include upgrade info for free users
|
|
116
|
+
4. Rolling window
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
### AI: Implementation Plan
|
|
120
|
+
|
|
121
|
+
```
|
|
122
|
+
AI: Got it. Here's the implementation plan:
|
|
123
|
+
|
|
124
|
+
──────────────────────────────────────────────────────────
|
|
125
|
+
Implementation Plan: Rate Limiting System
|
|
126
|
+
──────────────────────────────────────────────────────────
|
|
127
|
+
|
|
128
|
+
Architecture:
|
|
129
|
+
┌─────────────────────────────────────────────────────────┐
|
|
130
|
+
│ Request Flow │
|
|
131
|
+
├─────────────────────────────────────────────────────────┤
|
|
132
|
+
│ │
|
|
133
|
+
│ Request → Auth Middleware → Rate Limiter → Route │
|
|
134
|
+
│ │ │
|
|
135
|
+
│ ↓ │
|
|
136
|
+
│ ┌─────────────┐ │
|
|
137
|
+
│ │ Redis │ │
|
|
138
|
+
│ │ (Counters) │ │
|
|
139
|
+
│ └─────────────┘ │
|
|
140
|
+
│ │
|
|
141
|
+
└─────────────────────────────────────────────────────────┘
|
|
142
|
+
|
|
143
|
+
Files to Create:
|
|
144
|
+
|
|
145
|
+
src/middleware/
|
|
146
|
+
├── rateLimit/
|
|
147
|
+
│ ├── index.ts # Main middleware export
|
|
148
|
+
│ ├── rateLimiter.ts # Core rate limiting logic
|
|
149
|
+
│ ├── tierLimits.ts # Tier configuration
|
|
150
|
+
│ ├── endpointLimits.ts # Per-endpoint overrides
|
|
151
|
+
│ └── types.ts # TypeScript interfaces
|
|
152
|
+
|
|
153
|
+
src/services/
|
|
154
|
+
└── rateLimitStore.ts # Redis operations
|
|
155
|
+
|
|
156
|
+
src/utils/
|
|
157
|
+
└── rateLimitResponse.ts # 429 response formatting
|
|
158
|
+
|
|
159
|
+
Files to Modify:
|
|
160
|
+
|
|
161
|
+
• src/app.ts # Apply global rate limiter
|
|
162
|
+
• src/routes/files.ts # Add stricter limits
|
|
163
|
+
• src/routes/reports.ts # Add stricter limits
|
|
164
|
+
• src/routes/bulk.ts # Add stricter limits
|
|
165
|
+
• src/types/express.d.ts # Extend Request type
|
|
166
|
+
|
|
167
|
+
Database Changes:
|
|
168
|
+
|
|
169
|
+
• Add RateLimitOverride table (for custom limits per user)
|
|
170
|
+
• Migration: 20240120_add_rate_limit_overrides
|
|
171
|
+
|
|
172
|
+
Shall I proceed with implementation?
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
### User Confirms
|
|
176
|
+
|
|
177
|
+
```
|
|
178
|
+
User: Yes, proceed.
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
### AI: Implementation
|
|
182
|
+
|
|
183
|
+
```
|
|
184
|
+
AI: Starting implementation...
|
|
185
|
+
|
|
186
|
+
✓ Created types and configuration
|
|
187
|
+
──────────────────────────────────────────────────────────
|
|
188
|
+
// src/middleware/rateLimit/tierLimits.ts
|
|
189
|
+
|
|
190
|
+
import { UserTier } from '@prisma/client';
|
|
191
|
+
|
|
192
|
+
export interface TierLimit {
|
|
193
|
+
requestsPerMinute: number;
|
|
194
|
+
requestsPerDay: number;
|
|
195
|
+
burstLimit: number;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
export const TIER_LIMITS: Record<UserTier, TierLimit> = {
|
|
199
|
+
FREE: {
|
|
200
|
+
requestsPerMinute: 60,
|
|
201
|
+
requestsPerDay: 1_000,
|
|
202
|
+
burstLimit: 10,
|
|
203
|
+
},
|
|
204
|
+
PRO: {
|
|
205
|
+
requestsPerMinute: 300,
|
|
206
|
+
requestsPerDay: 10_000,
|
|
207
|
+
burstLimit: 50,
|
|
208
|
+
},
|
|
209
|
+
ENTERPRISE: {
|
|
210
|
+
requestsPerMinute: 1_000,
|
|
211
|
+
requestsPerDay: 100_000,
|
|
212
|
+
burstLimit: 200,
|
|
213
|
+
},
|
|
214
|
+
};
|
|
215
|
+
|
|
216
|
+
// Expensive endpoint multipliers (lower = stricter)
|
|
217
|
+
export const ENDPOINT_MULTIPLIERS: Record<string, number> = {
|
|
218
|
+
'POST:/api/files/upload': 0.1, // 10% of normal limit
|
|
219
|
+
'POST:/api/reports/generate': 0.05, // 5% of normal limit
|
|
220
|
+
'POST:/api/bulk/*': 0.02, // 2% of normal limit
|
|
221
|
+
};
|
|
222
|
+
──────────────────────────────────────────────────────────
|
|
223
|
+
|
|
224
|
+
✓ Created Redis store
|
|
225
|
+
──────────────────────────────────────────────────────────
|
|
226
|
+
// src/services/rateLimitStore.ts
|
|
227
|
+
|
|
228
|
+
import { redis } from './redis';
|
|
229
|
+
|
|
230
|
+
export class RateLimitStore {
|
|
231
|
+
private prefix = 'ratelimit:';
|
|
232
|
+
|
|
233
|
+
async increment(
|
|
234
|
+
userId: string,
|
|
235
|
+
window: 'minute' | 'day',
|
|
236
|
+
endpoint?: string
|
|
237
|
+
): Promise<{ count: number; ttl: number }> {
|
|
238
|
+
const key = this.getKey(userId, window, endpoint);
|
|
239
|
+
const ttl = window === 'minute' ? 60 : 86400;
|
|
240
|
+
|
|
241
|
+
const multi = redis.multi();
|
|
242
|
+
multi.incr(key);
|
|
243
|
+
multi.expire(key, ttl);
|
|
244
|
+
multi.ttl(key);
|
|
245
|
+
|
|
246
|
+
const [count, , remainingTtl] = await multi.exec();
|
|
247
|
+
|
|
248
|
+
return {
|
|
249
|
+
count: count as number,
|
|
250
|
+
ttl: remainingTtl as number,
|
|
251
|
+
};
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
async getCount(
|
|
255
|
+
userId: string,
|
|
256
|
+
window: 'minute' | 'day',
|
|
257
|
+
endpoint?: string
|
|
258
|
+
): Promise<number> {
|
|
259
|
+
const key = this.getKey(userId, window, endpoint);
|
|
260
|
+
const count = await redis.get(key);
|
|
261
|
+
return parseInt(count || '0', 10);
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
private getKey(
|
|
265
|
+
userId: string,
|
|
266
|
+
window: string,
|
|
267
|
+
endpoint?: string
|
|
268
|
+
): string {
|
|
269
|
+
const base = `${this.prefix}${userId}:${window}`;
|
|
270
|
+
return endpoint ? `${base}:${endpoint}` : base;
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
export const rateLimitStore = new RateLimitStore();
|
|
275
|
+
──────────────────────────────────────────────────────────
|
|
276
|
+
|
|
277
|
+
✓ Created main rate limiter middleware
|
|
278
|
+
──────────────────────────────────────────────────────────
|
|
279
|
+
// src/middleware/rateLimit/rateLimiter.ts
|
|
280
|
+
|
|
281
|
+
import { Request, Response, NextFunction } from 'express';
|
|
282
|
+
import { rateLimitStore } from '@/services/rateLimitStore';
|
|
283
|
+
import { TIER_LIMITS, ENDPOINT_MULTIPLIERS } from './tierLimits';
|
|
284
|
+
import { RateLimitError } from '@/errors';
|
|
285
|
+
|
|
286
|
+
interface RateLimitOptions {
|
|
287
|
+
windowMs?: number;
|
|
288
|
+
endpointKey?: string;
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
export function createRateLimiter(options: RateLimitOptions = {}) {
|
|
292
|
+
return async (req: Request, res: Response, next: NextFunction) => {
|
|
293
|
+
// Skip if no authenticated user (handled by auth)
|
|
294
|
+
if (!req.user) {
|
|
295
|
+
return next();
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
const userId = req.user.id;
|
|
299
|
+
const userTier = req.user.tier;
|
|
300
|
+
const limits = TIER_LIMITS[userTier];
|
|
301
|
+
|
|
302
|
+
// Get endpoint-specific multiplier
|
|
303
|
+
const endpointKey = options.endpointKey ||
|
|
304
|
+
`${req.method}:${req.baseUrl}${req.path}`;
|
|
305
|
+
const multiplier = getMultiplier(endpointKey);
|
|
306
|
+
|
|
307
|
+
// Calculate effective limits
|
|
308
|
+
const effectiveMinuteLimit = Math.floor(
|
|
309
|
+
limits.requestsPerMinute * multiplier
|
|
310
|
+
);
|
|
311
|
+
const effectiveDayLimit = Math.floor(
|
|
312
|
+
limits.requestsPerDay * multiplier
|
|
313
|
+
);
|
|
314
|
+
|
|
315
|
+
// Check minute window
|
|
316
|
+
const minuteResult = await rateLimitStore.increment(
|
|
317
|
+
userId,
|
|
318
|
+
'minute',
|
|
319
|
+
multiplier < 1 ? endpointKey : undefined
|
|
320
|
+
);
|
|
321
|
+
|
|
322
|
+
if (minuteResult.count > effectiveMinuteLimit) {
|
|
323
|
+
return sendRateLimitResponse(res, {
|
|
324
|
+
retryAfter: minuteResult.ttl,
|
|
325
|
+
limit: effectiveMinuteLimit,
|
|
326
|
+
window: 'minute',
|
|
327
|
+
userTier,
|
|
328
|
+
});
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
// Check daily window
|
|
332
|
+
const dayResult = await rateLimitStore.increment(userId, 'day');
|
|
333
|
+
|
|
334
|
+
if (dayResult.count > effectiveDayLimit) {
|
|
335
|
+
return sendRateLimitResponse(res, {
|
|
336
|
+
retryAfter: dayResult.ttl,
|
|
337
|
+
limit: effectiveDayLimit,
|
|
338
|
+
window: 'day',
|
|
339
|
+
userTier,
|
|
340
|
+
});
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
// Add rate limit headers
|
|
344
|
+
res.setHeader('X-RateLimit-Limit', effectiveMinuteLimit);
|
|
345
|
+
res.setHeader('X-RateLimit-Remaining',
|
|
346
|
+
Math.max(0, effectiveMinuteLimit - minuteResult.count)
|
|
347
|
+
);
|
|
348
|
+
res.setHeader('X-RateLimit-Reset',
|
|
349
|
+
Math.floor(Date.now() / 1000) + minuteResult.ttl
|
|
350
|
+
);
|
|
351
|
+
|
|
352
|
+
next();
|
|
353
|
+
};
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
function getMultiplier(endpointKey: string): number {
|
|
357
|
+
// Check exact match first
|
|
358
|
+
if (ENDPOINT_MULTIPLIERS[endpointKey]) {
|
|
359
|
+
return ENDPOINT_MULTIPLIERS[endpointKey];
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
// Check wildcard patterns
|
|
363
|
+
for (const [pattern, mult] of Object.entries(ENDPOINT_MULTIPLIERS)) {
|
|
364
|
+
if (pattern.endsWith('/*')) {
|
|
365
|
+
const prefix = pattern.slice(0, -1);
|
|
366
|
+
if (endpointKey.startsWith(prefix)) {
|
|
367
|
+
return mult;
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
return 1;
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
function sendRateLimitResponse(
|
|
376
|
+
res: Response,
|
|
377
|
+
info: {
|
|
378
|
+
retryAfter: number;
|
|
379
|
+
limit: number;
|
|
380
|
+
window: string;
|
|
381
|
+
userTier: string;
|
|
382
|
+
}
|
|
383
|
+
) {
|
|
384
|
+
res.setHeader('Retry-After', info.retryAfter);
|
|
385
|
+
|
|
386
|
+
const response: any = {
|
|
387
|
+
error: 'Too Many Requests',
|
|
388
|
+
message: `Rate limit exceeded. Try again in ${info.retryAfter} seconds.`,
|
|
389
|
+
retryAfter: info.retryAfter,
|
|
390
|
+
};
|
|
391
|
+
|
|
392
|
+
// Add upgrade prompt for free users
|
|
393
|
+
if (info.userTier === 'FREE') {
|
|
394
|
+
response.upgrade = {
|
|
395
|
+
message: 'Upgrade to Pro for higher rate limits',
|
|
396
|
+
link: '/pricing',
|
|
397
|
+
proLimit: TIER_LIMITS.PRO.requestsPerMinute,
|
|
398
|
+
};
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
return res.status(429).json(response);
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
export const rateLimit = createRateLimiter();
|
|
405
|
+
──────────────────────────────────────────────────────────
|
|
406
|
+
|
|
407
|
+
✓ Applied to app.ts
|
|
408
|
+
──────────────────────────────────────────────────────────
|
|
409
|
+
// In src/app.ts - After auth middleware
|
|
410
|
+
|
|
411
|
+
import { rateLimit } from '@/middleware/rateLimit';
|
|
412
|
+
|
|
413
|
+
// Apply global rate limiter
|
|
414
|
+
app.use(rateLimit);
|
|
415
|
+
──────────────────────────────────────────────────────────
|
|
416
|
+
|
|
417
|
+
✓ Added stricter limits to expensive routes
|
|
418
|
+
──────────────────────────────────────────────────────────
|
|
419
|
+
// In src/routes/files.ts
|
|
420
|
+
|
|
421
|
+
import { createRateLimiter } from '@/middleware/rateLimit';
|
|
422
|
+
|
|
423
|
+
const uploadLimiter = createRateLimiter({
|
|
424
|
+
endpointKey: 'POST:/api/files/upload',
|
|
425
|
+
});
|
|
426
|
+
|
|
427
|
+
router.post('/upload', uploadLimiter, async (req, res) => {
|
|
428
|
+
// ... upload logic
|
|
429
|
+
});
|
|
430
|
+
──────────────────────────────────────────────────────────
|
|
431
|
+
|
|
432
|
+
✓ Created database migration
|
|
433
|
+
──────────────────────────────────────────────────────────
|
|
434
|
+
-- Migration: 20240120_add_rate_limit_overrides
|
|
435
|
+
|
|
436
|
+
CREATE TABLE rate_limit_overrides (
|
|
437
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
438
|
+
user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
|
439
|
+
requests_per_minute INT,
|
|
440
|
+
requests_per_day INT,
|
|
441
|
+
endpoint_pattern VARCHAR(255),
|
|
442
|
+
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
|
|
443
|
+
expires_at TIMESTAMP WITH TIME ZONE,
|
|
444
|
+
reason TEXT,
|
|
445
|
+
UNIQUE(user_id, endpoint_pattern)
|
|
446
|
+
);
|
|
447
|
+
|
|
448
|
+
CREATE INDEX idx_rate_limit_overrides_user
|
|
449
|
+
ON rate_limit_overrides(user_id);
|
|
450
|
+
──────────────────────────────────────────────────────────
|
|
451
|
+
|
|
452
|
+
Implementation complete. Running tests...
|
|
453
|
+
```
|
|
454
|
+
|
|
455
|
+
### AI: Testing
|
|
456
|
+
|
|
457
|
+
```
|
|
458
|
+
AI: Running tests...
|
|
459
|
+
|
|
460
|
+
──────────────────────────────────────────────────────────
|
|
461
|
+
Test Results
|
|
462
|
+
──────────────────────────────────────────────────────────
|
|
463
|
+
|
|
464
|
+
Unit Tests:
|
|
465
|
+
✓ rateLimitStore.increment increments counter (15ms)
|
|
466
|
+
✓ rateLimitStore.increment sets TTL correctly (12ms)
|
|
467
|
+
✓ createRateLimiter allows requests under limit (28ms)
|
|
468
|
+
✓ createRateLimiter blocks requests over minute limit (32ms)
|
|
469
|
+
✓ createRateLimiter blocks requests over daily limit (35ms)
|
|
470
|
+
✓ createRateLimiter applies endpoint multipliers (25ms)
|
|
471
|
+
✓ createRateLimiter sets correct headers (22ms)
|
|
472
|
+
✓ FREE tier gets upgrade prompt in 429 response (30ms)
|
|
473
|
+
✓ PRO tier does not get upgrade prompt (28ms)
|
|
474
|
+
|
|
475
|
+
Integration Tests:
|
|
476
|
+
✓ Rate limit persists across requests (145ms)
|
|
477
|
+
✓ Rate limit resets after window (2015ms)
|
|
478
|
+
✓ Different users have separate limits (95ms)
|
|
479
|
+
✓ Expensive endpoints have lower limits (88ms)
|
|
480
|
+
|
|
481
|
+
Load Tests:
|
|
482
|
+
✓ Handles 1000 concurrent rate checks (234ms)
|
|
483
|
+
|
|
484
|
+
Coverage: 96%
|
|
485
|
+
|
|
486
|
+
All 14 tests passed.
|
|
487
|
+
```
|
|
488
|
+
|
|
489
|
+
### AI: Summary
|
|
490
|
+
|
|
491
|
+
```
|
|
492
|
+
AI: Rate limiting implementation complete!
|
|
493
|
+
|
|
494
|
+
──────────────────────────────────────────────────────────
|
|
495
|
+
Summary: Rate Limiting System
|
|
496
|
+
──────────────────────────────────────────────────────────
|
|
497
|
+
|
|
498
|
+
Features Implemented:
|
|
499
|
+
✓ Tiered rate limits (FREE/PRO/ENTERPRISE)
|
|
500
|
+
✓ Per-minute and per-day windows
|
|
501
|
+
✓ Rolling window implementation
|
|
502
|
+
✓ Per-endpoint overrides for expensive operations
|
|
503
|
+
✓ Standard rate limit headers
|
|
504
|
+
✓ 429 responses with retry-after
|
|
505
|
+
✓ Upgrade prompts for free users
|
|
506
|
+
✓ Redis-based distributed counting
|
|
507
|
+
✓ Custom override support via database
|
|
508
|
+
|
|
509
|
+
Rate Limits:
|
|
510
|
+
┌────────────────────────────────────────────────────┐
|
|
511
|
+
│ Tier │ /min │ /day │ Upload │ Report │
|
|
512
|
+
├────────────────────────────────────────────────────┤
|
|
513
|
+
│ FREE │ 60 │ 1,000 │ 6 │ 3 │
|
|
514
|
+
│ PRO │ 300 │ 10,000 │ 30 │ 15 │
|
|
515
|
+
│ ENTERPRISE │ 1,000 │ 100,000 │ 100 │ 50 │
|
|
516
|
+
└────────────────────────────────────────────────────┘
|
|
517
|
+
|
|
518
|
+
Files Created: 6
|
|
519
|
+
Files Modified: 4
|
|
520
|
+
Test Coverage: 96%
|
|
521
|
+
|
|
522
|
+
Ready to commit?
|
|
523
|
+
```
|
|
524
|
+
|
|
525
|
+
### User Commits
|
|
526
|
+
|
|
527
|
+
```
|
|
528
|
+
User: Yes, commit it.
|
|
529
|
+
```
|
|
530
|
+
|
|
531
|
+
### AI: Commit
|
|
532
|
+
|
|
533
|
+
```
|
|
534
|
+
AI: Committing changes...
|
|
535
|
+
|
|
536
|
+
$ git add .
|
|
537
|
+
$ git commit -m "feat(api): add tiered rate limiting system
|
|
538
|
+
|
|
539
|
+
- Add rate limiting middleware with Redis storage
|
|
540
|
+
- Implement FREE/PRO/ENTERPRISE tier limits
|
|
541
|
+
- Add per-endpoint multipliers for expensive operations
|
|
542
|
+
- Include rate limit headers on all responses
|
|
543
|
+
- Return 429 with retry-after and upgrade prompts
|
|
544
|
+
- Add rate limit override table for custom limits
|
|
545
|
+
- Add comprehensive tests (96% coverage)
|
|
546
|
+
|
|
547
|
+
Rate limits:
|
|
548
|
+
- FREE: 60/min, 1000/day
|
|
549
|
+
- PRO: 300/min, 10000/day
|
|
550
|
+
- ENTERPRISE: 1000/min, 100000/day
|
|
551
|
+
|
|
552
|
+
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>"
|
|
553
|
+
|
|
554
|
+
Committed: abc123f
|
|
555
|
+
Branch: feature/rate-limiting
|
|
556
|
+
```
|
|
557
|
+
|
|
558
|
+
---
|
|
559
|
+
|
|
560
|
+
## API Documentation Generated
|
|
561
|
+
|
|
562
|
+
```
|
|
563
|
+
AI: I've also generated API documentation for the rate limiting:
|
|
564
|
+
|
|
565
|
+
──────────────────────────────────────────────────────────
|
|
566
|
+
Rate Limiting Documentation
|
|
567
|
+
──────────────────────────────────────────────────────────
|
|
568
|
+
|
|
569
|
+
All API requests include rate limit headers:
|
|
570
|
+
|
|
571
|
+
Response Headers:
|
|
572
|
+
• X-RateLimit-Limit: Maximum requests per minute
|
|
573
|
+
• X-RateLimit-Remaining: Requests remaining in window
|
|
574
|
+
• X-RateLimit-Reset: Unix timestamp when window resets
|
|
575
|
+
|
|
576
|
+
429 Response:
|
|
577
|
+
{
|
|
578
|
+
"error": "Too Many Requests",
|
|
579
|
+
"message": "Rate limit exceeded. Try again in 45 seconds.",
|
|
580
|
+
"retryAfter": 45,
|
|
581
|
+
"upgrade": {
|
|
582
|
+
"message": "Upgrade to Pro for higher rate limits",
|
|
583
|
+
"link": "/pricing",
|
|
584
|
+
"proLimit": 300
|
|
585
|
+
}
|
|
586
|
+
}
|
|
587
|
+
|
|
588
|
+
For custom rate limits, contact support.
|
|
589
|
+
──────────────────────────────────────────────────────────
|
|
590
|
+
```
|
|
591
|
+
|
|
592
|
+
---
|
|
593
|
+
|
|
594
|
+
## Key Backend Patterns Shown
|
|
595
|
+
|
|
596
|
+
1. **Middleware composition** - Rate limiter as Express middleware
|
|
597
|
+
2. **Redis integration** - For distributed rate limit counting
|
|
598
|
+
3. **Configuration-driven** - Tier limits in separate config file
|
|
599
|
+
4. **Header standards** - Proper rate limit headers
|
|
600
|
+
5. **Database flexibility** - Override table for exceptions
|
|
601
|
+
6. **Testability** - High test coverage with unit and integration tests
|