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,521 @@
|
|
|
1
|
+
# Async Error Handling
|
|
2
|
+
|
|
3
|
+
Managing errors in asynchronous operations, background jobs, and event-driven systems.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Promise Error Handling
|
|
8
|
+
|
|
9
|
+
### Basic Patterns
|
|
10
|
+
|
|
11
|
+
```typescript
|
|
12
|
+
// Pattern 1: try-catch with async/await
|
|
13
|
+
async function processOrder(orderId: string) {
|
|
14
|
+
try {
|
|
15
|
+
const order = await getOrder(orderId);
|
|
16
|
+
await validateOrder(order);
|
|
17
|
+
await processPayment(order);
|
|
18
|
+
await fulfillOrder(order);
|
|
19
|
+
} catch (error) {
|
|
20
|
+
if (error instanceof ValidationError) {
|
|
21
|
+
// Handle validation errors
|
|
22
|
+
logger.warn('Order validation failed', { orderId, error });
|
|
23
|
+
throw error;
|
|
24
|
+
}
|
|
25
|
+
if (error instanceof PaymentError) {
|
|
26
|
+
// Handle payment errors
|
|
27
|
+
await handlePaymentFailure(orderId, error);
|
|
28
|
+
throw error;
|
|
29
|
+
}
|
|
30
|
+
// Unexpected error
|
|
31
|
+
logger.error('Order processing failed', { orderId, error });
|
|
32
|
+
throw new ProcessingError('Order processing failed', { cause: error });
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// Pattern 2: Promise chain with .catch()
|
|
37
|
+
fetchData()
|
|
38
|
+
.then(processData)
|
|
39
|
+
.then(saveData)
|
|
40
|
+
.catch(handleError);
|
|
41
|
+
|
|
42
|
+
// Pattern 3: Promise.allSettled for parallel operations
|
|
43
|
+
const results = await Promise.allSettled([
|
|
44
|
+
fetchUser(userId),
|
|
45
|
+
fetchOrders(userId),
|
|
46
|
+
fetchPreferences(userId),
|
|
47
|
+
]);
|
|
48
|
+
|
|
49
|
+
const errors = results.filter(r => r.status === 'rejected');
|
|
50
|
+
if (errors.length > 0) {
|
|
51
|
+
logger.warn('Some operations failed', { errors });
|
|
52
|
+
}
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
### Error Aggregation
|
|
56
|
+
|
|
57
|
+
```typescript
|
|
58
|
+
// errors/async.ts
|
|
59
|
+
export class AggregateAsyncError extends BaseError {
|
|
60
|
+
readonly code = 'AGGREGATE_ERROR';
|
|
61
|
+
readonly statusCode = 500;
|
|
62
|
+
readonly isOperational = true;
|
|
63
|
+
|
|
64
|
+
readonly errors: Error[];
|
|
65
|
+
readonly successCount: number;
|
|
66
|
+
readonly failureCount: number;
|
|
67
|
+
|
|
68
|
+
constructor(errors: Error[], successCount: number) {
|
|
69
|
+
super(`${errors.length} operations failed`);
|
|
70
|
+
this.errors = errors;
|
|
71
|
+
this.successCount = successCount;
|
|
72
|
+
this.failureCount = errors.length;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// Usage
|
|
77
|
+
async function batchProcess(items: Item[]) {
|
|
78
|
+
const results = await Promise.allSettled(
|
|
79
|
+
items.map(item => processItem(item))
|
|
80
|
+
);
|
|
81
|
+
|
|
82
|
+
const failures = results
|
|
83
|
+
.filter((r): r is PromiseRejectedResult => r.status === 'rejected')
|
|
84
|
+
.map(r => r.reason);
|
|
85
|
+
|
|
86
|
+
const successes = results.filter(r => r.status === 'fulfilled');
|
|
87
|
+
|
|
88
|
+
if (failures.length > 0) {
|
|
89
|
+
throw new AggregateAsyncError(failures, successes.length);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
return successes.map(s => s.value);
|
|
93
|
+
}
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
---
|
|
97
|
+
|
|
98
|
+
## Background Job Errors
|
|
99
|
+
|
|
100
|
+
### Job Error Configuration
|
|
101
|
+
|
|
102
|
+
```yaml
|
|
103
|
+
# proagents.config.yaml
|
|
104
|
+
patterns:
|
|
105
|
+
async_errors:
|
|
106
|
+
jobs:
|
|
107
|
+
# Retry configuration
|
|
108
|
+
retry:
|
|
109
|
+
enabled: true
|
|
110
|
+
max_attempts: 3
|
|
111
|
+
backoff:
|
|
112
|
+
type: "exponential"
|
|
113
|
+
initial_delay: "1s"
|
|
114
|
+
max_delay: "5m"
|
|
115
|
+
multiplier: 2
|
|
116
|
+
|
|
117
|
+
# Dead letter queue
|
|
118
|
+
dlq:
|
|
119
|
+
enabled: true
|
|
120
|
+
queue_name: "failed-jobs"
|
|
121
|
+
retention: "7d"
|
|
122
|
+
|
|
123
|
+
# Error handling
|
|
124
|
+
on_error:
|
|
125
|
+
log: true
|
|
126
|
+
notify:
|
|
127
|
+
after_attempts: 3
|
|
128
|
+
channels: ["slack"]
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
### Job Error Handler
|
|
132
|
+
|
|
133
|
+
```typescript
|
|
134
|
+
// jobs/errorHandler.ts
|
|
135
|
+
import { Job } from 'bull';
|
|
136
|
+
import { BaseError } from '../errors';
|
|
137
|
+
|
|
138
|
+
interface JobErrorContext {
|
|
139
|
+
jobId: string;
|
|
140
|
+
jobName: string;
|
|
141
|
+
attempt: number;
|
|
142
|
+
data: unknown;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
export async function handleJobError(
|
|
146
|
+
error: Error,
|
|
147
|
+
job: Job,
|
|
148
|
+
done: (err?: Error) => void
|
|
149
|
+
) {
|
|
150
|
+
const context: JobErrorContext = {
|
|
151
|
+
jobId: job.id,
|
|
152
|
+
jobName: job.name,
|
|
153
|
+
attempt: job.attemptsMade,
|
|
154
|
+
data: job.data,
|
|
155
|
+
};
|
|
156
|
+
|
|
157
|
+
// Log the error
|
|
158
|
+
logger.error('Job failed', { error, ...context });
|
|
159
|
+
|
|
160
|
+
// Determine if retryable
|
|
161
|
+
const isRetryable = isRetryableError(error);
|
|
162
|
+
const maxAttempts = job.opts.attempts || 3;
|
|
163
|
+
|
|
164
|
+
if (isRetryable && job.attemptsMade < maxAttempts) {
|
|
165
|
+
// Let it retry
|
|
166
|
+
logger.info('Job will retry', {
|
|
167
|
+
...context,
|
|
168
|
+
remainingAttempts: maxAttempts - job.attemptsMade,
|
|
169
|
+
});
|
|
170
|
+
done(error);
|
|
171
|
+
} else {
|
|
172
|
+
// Move to dead letter queue
|
|
173
|
+
await moveToDeadLetterQueue(job, error);
|
|
174
|
+
logger.error('Job moved to DLQ', context);
|
|
175
|
+
|
|
176
|
+
// Notify if max attempts reached
|
|
177
|
+
if (job.attemptsMade >= maxAttempts) {
|
|
178
|
+
await notifyJobFailure(job, error);
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
done(); // Mark as processed (to DLQ)
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
function isRetryableError(error: Error): boolean {
|
|
186
|
+
// Network errors, timeouts are retryable
|
|
187
|
+
if (error instanceof NetworkError) return true;
|
|
188
|
+
if (error instanceof TimeoutError) return true;
|
|
189
|
+
|
|
190
|
+
// Validation errors are not retryable
|
|
191
|
+
if (error instanceof ValidationError) return false;
|
|
192
|
+
if (error instanceof BusinessLogicError) return false;
|
|
193
|
+
|
|
194
|
+
// Default: retry unknown errors
|
|
195
|
+
return true;
|
|
196
|
+
}
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
### Bull Queue Error Handling
|
|
200
|
+
|
|
201
|
+
```typescript
|
|
202
|
+
// jobs/queue.ts
|
|
203
|
+
import Queue from 'bull';
|
|
204
|
+
|
|
205
|
+
const orderQueue = new Queue('orders', {
|
|
206
|
+
redis: process.env.REDIS_URL,
|
|
207
|
+
defaultJobOptions: {
|
|
208
|
+
attempts: 3,
|
|
209
|
+
backoff: {
|
|
210
|
+
type: 'exponential',
|
|
211
|
+
delay: 1000,
|
|
212
|
+
},
|
|
213
|
+
removeOnComplete: 100,
|
|
214
|
+
removeOnFail: false, // Keep for debugging
|
|
215
|
+
},
|
|
216
|
+
});
|
|
217
|
+
|
|
218
|
+
// Global error handler
|
|
219
|
+
orderQueue.on('failed', async (job, error) => {
|
|
220
|
+
logger.error('Job failed', {
|
|
221
|
+
jobId: job.id,
|
|
222
|
+
attempts: job.attemptsMade,
|
|
223
|
+
error: error.message,
|
|
224
|
+
});
|
|
225
|
+
|
|
226
|
+
// Check if final failure
|
|
227
|
+
if (job.attemptsMade >= job.opts.attempts) {
|
|
228
|
+
await handleFinalFailure(job, error);
|
|
229
|
+
}
|
|
230
|
+
});
|
|
231
|
+
|
|
232
|
+
orderQueue.on('error', (error) => {
|
|
233
|
+
logger.error('Queue error', { error });
|
|
234
|
+
});
|
|
235
|
+
|
|
236
|
+
// Stalled job handler
|
|
237
|
+
orderQueue.on('stalled', (job) => {
|
|
238
|
+
logger.warn('Job stalled', { jobId: job.id });
|
|
239
|
+
});
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
---
|
|
243
|
+
|
|
244
|
+
## Event-Driven Error Handling
|
|
245
|
+
|
|
246
|
+
### Event Emitter Errors
|
|
247
|
+
|
|
248
|
+
```typescript
|
|
249
|
+
// events/errorHandler.ts
|
|
250
|
+
import { EventEmitter } from 'events';
|
|
251
|
+
|
|
252
|
+
class SafeEventEmitter extends EventEmitter {
|
|
253
|
+
emit(event: string, ...args: unknown[]): boolean {
|
|
254
|
+
try {
|
|
255
|
+
return super.emit(event, ...args);
|
|
256
|
+
} catch (error) {
|
|
257
|
+
this.handleEmitError(event, error, args);
|
|
258
|
+
return false;
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
private handleEmitError(event: string, error: Error, args: unknown[]) {
|
|
263
|
+
logger.error('Event handler error', {
|
|
264
|
+
event,
|
|
265
|
+
error: error.message,
|
|
266
|
+
args,
|
|
267
|
+
});
|
|
268
|
+
|
|
269
|
+
// Emit to error handlers
|
|
270
|
+
if (event !== 'error') {
|
|
271
|
+
this.emit('error', error, { event, args });
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
// Usage
|
|
277
|
+
const events = new SafeEventEmitter();
|
|
278
|
+
|
|
279
|
+
events.on('error', (error, context) => {
|
|
280
|
+
logger.error('Unhandled event error', { error, context });
|
|
281
|
+
// Optionally notify monitoring
|
|
282
|
+
});
|
|
283
|
+
|
|
284
|
+
events.on('order.created', async (order) => {
|
|
285
|
+
await processOrder(order); // If this throws, it's caught
|
|
286
|
+
});
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
### Message Queue Errors
|
|
290
|
+
|
|
291
|
+
```typescript
|
|
292
|
+
// messaging/consumer.ts
|
|
293
|
+
import { Message, Consumer } from 'kafka-js';
|
|
294
|
+
|
|
295
|
+
async function processMessage(message: Message): Promise<void> {
|
|
296
|
+
const context = {
|
|
297
|
+
topic: message.topic,
|
|
298
|
+
partition: message.partition,
|
|
299
|
+
offset: message.offset,
|
|
300
|
+
};
|
|
301
|
+
|
|
302
|
+
try {
|
|
303
|
+
const payload = JSON.parse(message.value.toString());
|
|
304
|
+
await handlePayload(payload);
|
|
305
|
+
|
|
306
|
+
} catch (error) {
|
|
307
|
+
if (isParseError(error)) {
|
|
308
|
+
// Invalid message format - send to DLQ
|
|
309
|
+
await sendToDeadLetterQueue(message, error);
|
|
310
|
+
logger.error('Invalid message format', { ...context, error });
|
|
311
|
+
return; // Don't retry
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
if (isRetryableError(error)) {
|
|
315
|
+
// Throw to trigger retry
|
|
316
|
+
logger.warn('Message processing failed, will retry', { ...context, error });
|
|
317
|
+
throw error;
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
// Non-retryable error
|
|
321
|
+
await sendToDeadLetterQueue(message, error);
|
|
322
|
+
logger.error('Message processing failed permanently', { ...context, error });
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
// Consumer configuration
|
|
327
|
+
const consumer: Consumer = kafka.consumer({
|
|
328
|
+
retry: {
|
|
329
|
+
initialRetryTime: 100,
|
|
330
|
+
retries: 5,
|
|
331
|
+
maxRetryTime: 30000,
|
|
332
|
+
factor: 2,
|
|
333
|
+
},
|
|
334
|
+
});
|
|
335
|
+
```
|
|
336
|
+
|
|
337
|
+
---
|
|
338
|
+
|
|
339
|
+
## Circuit Breaker Pattern
|
|
340
|
+
|
|
341
|
+
### Configuration
|
|
342
|
+
|
|
343
|
+
```yaml
|
|
344
|
+
patterns:
|
|
345
|
+
async_errors:
|
|
346
|
+
circuit_breaker:
|
|
347
|
+
enabled: true
|
|
348
|
+
|
|
349
|
+
# Thresholds
|
|
350
|
+
failure_threshold: 5
|
|
351
|
+
success_threshold: 3
|
|
352
|
+
timeout: "30s"
|
|
353
|
+
|
|
354
|
+
# States
|
|
355
|
+
states:
|
|
356
|
+
closed: "Normal operation"
|
|
357
|
+
open: "Failing fast"
|
|
358
|
+
half_open: "Testing recovery"
|
|
359
|
+
|
|
360
|
+
# Monitoring
|
|
361
|
+
metrics:
|
|
362
|
+
enabled: true
|
|
363
|
+
export: "prometheus"
|
|
364
|
+
```
|
|
365
|
+
|
|
366
|
+
### Implementation
|
|
367
|
+
|
|
368
|
+
```typescript
|
|
369
|
+
// patterns/circuitBreaker.ts
|
|
370
|
+
enum CircuitState {
|
|
371
|
+
CLOSED = 'closed',
|
|
372
|
+
OPEN = 'open',
|
|
373
|
+
HALF_OPEN = 'half_open',
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
class CircuitBreaker {
|
|
377
|
+
private state: CircuitState = CircuitState.CLOSED;
|
|
378
|
+
private failures = 0;
|
|
379
|
+
private successes = 0;
|
|
380
|
+
private lastFailureTime?: Date;
|
|
381
|
+
|
|
382
|
+
constructor(
|
|
383
|
+
private readonly failureThreshold: number,
|
|
384
|
+
private readonly successThreshold: number,
|
|
385
|
+
private readonly timeout: number
|
|
386
|
+
) {}
|
|
387
|
+
|
|
388
|
+
async execute<T>(fn: () => Promise<T>): Promise<T> {
|
|
389
|
+
if (this.state === CircuitState.OPEN) {
|
|
390
|
+
if (this.shouldAttemptReset()) {
|
|
391
|
+
this.state = CircuitState.HALF_OPEN;
|
|
392
|
+
} else {
|
|
393
|
+
throw new CircuitOpenError('Circuit is open');
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
try {
|
|
398
|
+
const result = await fn();
|
|
399
|
+
this.onSuccess();
|
|
400
|
+
return result;
|
|
401
|
+
} catch (error) {
|
|
402
|
+
this.onFailure();
|
|
403
|
+
throw error;
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
private onSuccess() {
|
|
408
|
+
this.failures = 0;
|
|
409
|
+
if (this.state === CircuitState.HALF_OPEN) {
|
|
410
|
+
this.successes++;
|
|
411
|
+
if (this.successes >= this.successThreshold) {
|
|
412
|
+
this.state = CircuitState.CLOSED;
|
|
413
|
+
this.successes = 0;
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
private onFailure() {
|
|
419
|
+
this.failures++;
|
|
420
|
+
this.lastFailureTime = new Date();
|
|
421
|
+
if (this.failures >= this.failureThreshold) {
|
|
422
|
+
this.state = CircuitState.OPEN;
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
private shouldAttemptReset(): boolean {
|
|
427
|
+
if (!this.lastFailureTime) return true;
|
|
428
|
+
const elapsed = Date.now() - this.lastFailureTime.getTime();
|
|
429
|
+
return elapsed >= this.timeout;
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
// Usage
|
|
434
|
+
const paymentCircuit = new CircuitBreaker(5, 3, 30000);
|
|
435
|
+
|
|
436
|
+
async function processPayment(payment: Payment) {
|
|
437
|
+
return paymentCircuit.execute(() => paymentGateway.charge(payment));
|
|
438
|
+
}
|
|
439
|
+
```
|
|
440
|
+
|
|
441
|
+
---
|
|
442
|
+
|
|
443
|
+
## Timeout Handling
|
|
444
|
+
|
|
445
|
+
### Timeout Wrapper
|
|
446
|
+
|
|
447
|
+
```typescript
|
|
448
|
+
// utils/timeout.ts
|
|
449
|
+
export class TimeoutError extends BaseError {
|
|
450
|
+
readonly code = 'TIMEOUT_ERROR';
|
|
451
|
+
readonly statusCode = 504;
|
|
452
|
+
readonly isOperational = true;
|
|
453
|
+
|
|
454
|
+
constructor(operation: string, timeout: number) {
|
|
455
|
+
super(`Operation "${operation}" timed out after ${timeout}ms`);
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
export async function withTimeout<T>(
|
|
460
|
+
promise: Promise<T>,
|
|
461
|
+
timeout: number,
|
|
462
|
+
operation: string
|
|
463
|
+
): Promise<T> {
|
|
464
|
+
let timeoutId: NodeJS.Timeout;
|
|
465
|
+
|
|
466
|
+
const timeoutPromise = new Promise<never>((_, reject) => {
|
|
467
|
+
timeoutId = setTimeout(() => {
|
|
468
|
+
reject(new TimeoutError(operation, timeout));
|
|
469
|
+
}, timeout);
|
|
470
|
+
});
|
|
471
|
+
|
|
472
|
+
try {
|
|
473
|
+
const result = await Promise.race([promise, timeoutPromise]);
|
|
474
|
+
clearTimeout(timeoutId!);
|
|
475
|
+
return result;
|
|
476
|
+
} catch (error) {
|
|
477
|
+
clearTimeout(timeoutId!);
|
|
478
|
+
throw error;
|
|
479
|
+
}
|
|
480
|
+
}
|
|
481
|
+
|
|
482
|
+
// Usage
|
|
483
|
+
const user = await withTimeout(
|
|
484
|
+
fetchUser(userId),
|
|
485
|
+
5000,
|
|
486
|
+
'fetchUser'
|
|
487
|
+
);
|
|
488
|
+
```
|
|
489
|
+
|
|
490
|
+
---
|
|
491
|
+
|
|
492
|
+
## Commands
|
|
493
|
+
|
|
494
|
+
```bash
|
|
495
|
+
# View failed jobs
|
|
496
|
+
proagents jobs failed --queue orders
|
|
497
|
+
|
|
498
|
+
# Retry failed job
|
|
499
|
+
proagents jobs retry --id job-123
|
|
500
|
+
|
|
501
|
+
# View dead letter queue
|
|
502
|
+
proagents jobs dlq --queue orders
|
|
503
|
+
|
|
504
|
+
# Process DLQ
|
|
505
|
+
proagents jobs process-dlq --queue orders --limit 10
|
|
506
|
+
|
|
507
|
+
# Circuit breaker status
|
|
508
|
+
proagents circuit-breaker status
|
|
509
|
+
```
|
|
510
|
+
|
|
511
|
+
---
|
|
512
|
+
|
|
513
|
+
## Best Practices
|
|
514
|
+
|
|
515
|
+
1. **Always Handle Rejections**: Never leave promises unhandled
|
|
516
|
+
2. **Use Circuit Breakers**: Prevent cascade failures
|
|
517
|
+
3. **Implement Retries**: With exponential backoff
|
|
518
|
+
4. **Dead Letter Queues**: Capture permanently failed messages
|
|
519
|
+
5. **Timeout Everything**: Don't wait forever
|
|
520
|
+
6. **Log Context**: Include job/message IDs for debugging
|
|
521
|
+
7. **Monitor Failures**: Track failure rates and patterns
|