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,614 @@
|
|
|
1
|
+
# Complete Contract Testing Guide
|
|
2
|
+
|
|
3
|
+
A comprehensive guide to implementing contract testing in your projects.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Table of Contents
|
|
8
|
+
|
|
9
|
+
1. [Introduction](#introduction)
|
|
10
|
+
2. [When to Use Contract Testing](#when-to-use-contract-testing)
|
|
11
|
+
3. [Consumer-Driven Contracts](#consumer-driven-contracts)
|
|
12
|
+
4. [Writing Consumer Tests](#writing-consumer-tests)
|
|
13
|
+
5. [Writing Provider Tests](#writing-provider-tests)
|
|
14
|
+
6. [Contract Versioning](#contract-versioning)
|
|
15
|
+
7. [CI/CD Integration](#cicd-integration)
|
|
16
|
+
8. [Troubleshooting](#troubleshooting)
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## Introduction
|
|
21
|
+
|
|
22
|
+
Contract testing verifies that two services (consumer and provider) can communicate correctly by testing them against a shared "contract" - an agreement about what requests look like and what responses are expected.
|
|
23
|
+
|
|
24
|
+
### Why Contract Testing?
|
|
25
|
+
|
|
26
|
+
```
|
|
27
|
+
Traditional Integration Testing:
|
|
28
|
+
┌──────────┐ ┌──────────┐ ┌──────────┐
|
|
29
|
+
│ Service A │ ───→ │ Service B │ ───→ │ Service C │
|
|
30
|
+
└──────────┘ └──────────┘ └──────────┘
|
|
31
|
+
All services must be running. Slow. Flaky.
|
|
32
|
+
|
|
33
|
+
Contract Testing:
|
|
34
|
+
┌──────────┐ ┌──────────┐
|
|
35
|
+
│ Service A │ ←── Contract JSON ───→ │ Service B │
|
|
36
|
+
└──────────┘ └──────────┘
|
|
37
|
+
Tests against Tests against
|
|
38
|
+
mock server real contract
|
|
39
|
+
|
|
40
|
+
Services test independently. Fast. Reliable.
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
### Key Concepts
|
|
44
|
+
|
|
45
|
+
| Term | Definition |
|
|
46
|
+
|------|------------|
|
|
47
|
+
| **Consumer** | Service that makes API requests |
|
|
48
|
+
| **Provider** | Service that handles API requests |
|
|
49
|
+
| **Contract** | JSON file describing expected interactions |
|
|
50
|
+
| **Pact** | Most popular contract testing framework |
|
|
51
|
+
| **Broker** | Central server storing contracts |
|
|
52
|
+
|
|
53
|
+
---
|
|
54
|
+
|
|
55
|
+
## When to Use Contract Testing
|
|
56
|
+
|
|
57
|
+
### Good Candidates
|
|
58
|
+
|
|
59
|
+
- **Microservices** communicating via HTTP/REST
|
|
60
|
+
- **Frontend-Backend** API interactions
|
|
61
|
+
- **Mobile-Backend** API interactions
|
|
62
|
+
- **Service-to-Service** internal APIs
|
|
63
|
+
- **Third-Party API** integrations (if you control the mock)
|
|
64
|
+
|
|
65
|
+
### Not Ideal For
|
|
66
|
+
|
|
67
|
+
- **Databases** - Use migration testing instead
|
|
68
|
+
- **Message Queues** - Use different patterns (Pact supports async)
|
|
69
|
+
- **UI Testing** - Use E2E tests
|
|
70
|
+
- **Internal Functions** - Use unit tests
|
|
71
|
+
|
|
72
|
+
### Decision Tree
|
|
73
|
+
|
|
74
|
+
```
|
|
75
|
+
Is it an API boundary between services?
|
|
76
|
+
├── Yes → Do you control both sides?
|
|
77
|
+
│ ├── Yes → Contract Testing ✓
|
|
78
|
+
│ └── No → Schema Validation / Mocks
|
|
79
|
+
└── No → Unit or Integration Tests
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
---
|
|
83
|
+
|
|
84
|
+
## Consumer-Driven Contracts
|
|
85
|
+
|
|
86
|
+
In CDC, **consumers define the contract** based on what they actually need.
|
|
87
|
+
|
|
88
|
+
### Why Consumer-Driven?
|
|
89
|
+
|
|
90
|
+
1. **No over-fetching** - Contract only includes used fields
|
|
91
|
+
2. **Consumer needs are explicit** - Provider knows what's important
|
|
92
|
+
3. **Changes are visible** - Breaking changes are caught immediately
|
|
93
|
+
|
|
94
|
+
### Workflow
|
|
95
|
+
|
|
96
|
+
```
|
|
97
|
+
1. Consumer writes test
|
|
98
|
+
│
|
|
99
|
+
▼
|
|
100
|
+
2. Consumer test generates contract (pact.json)
|
|
101
|
+
│
|
|
102
|
+
▼
|
|
103
|
+
3. Contract published to broker
|
|
104
|
+
│
|
|
105
|
+
▼
|
|
106
|
+
4. Provider pulls contract
|
|
107
|
+
│
|
|
108
|
+
▼
|
|
109
|
+
5. Provider verifies against contract
|
|
110
|
+
│
|
|
111
|
+
▼
|
|
112
|
+
6. Both sides pass → Safe to deploy
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
---
|
|
116
|
+
|
|
117
|
+
## Writing Consumer Tests
|
|
118
|
+
|
|
119
|
+
### Step 1: Set Up Pact
|
|
120
|
+
|
|
121
|
+
```typescript
|
|
122
|
+
// consumer/pact.setup.ts
|
|
123
|
+
import { PactV3 } from '@pact-foundation/pact';
|
|
124
|
+
import path from 'path';
|
|
125
|
+
|
|
126
|
+
export const provider = new PactV3({
|
|
127
|
+
consumer: 'WebApp',
|
|
128
|
+
provider: 'UserService',
|
|
129
|
+
dir: path.resolve(process.cwd(), 'pacts'),
|
|
130
|
+
logLevel: 'warn',
|
|
131
|
+
});
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
### Step 2: Define Interactions
|
|
135
|
+
|
|
136
|
+
```typescript
|
|
137
|
+
// consumer/tests/user.pact.test.ts
|
|
138
|
+
import { MatchersV3 } from '@pact-foundation/pact';
|
|
139
|
+
import { provider } from '../pact.setup';
|
|
140
|
+
import { UserService } from '../services/UserService';
|
|
141
|
+
|
|
142
|
+
const { eachLike, string, integer, email, datetime } = MatchersV3;
|
|
143
|
+
|
|
144
|
+
describe('User API Consumer Tests', () => {
|
|
145
|
+
// Test: Get user by ID
|
|
146
|
+
describe('GET /users/:id', () => {
|
|
147
|
+
it('returns user when user exists', async () => {
|
|
148
|
+
// Arrange: Define the expected interaction
|
|
149
|
+
await provider
|
|
150
|
+
.given('user with ID 123 exists')
|
|
151
|
+
.uponReceiving('a request to get user 123')
|
|
152
|
+
.withRequest({
|
|
153
|
+
method: 'GET',
|
|
154
|
+
path: '/api/users/123',
|
|
155
|
+
headers: {
|
|
156
|
+
Accept: 'application/json',
|
|
157
|
+
Authorization: string('Bearer token'),
|
|
158
|
+
},
|
|
159
|
+
})
|
|
160
|
+
.willRespondWith({
|
|
161
|
+
status: 200,
|
|
162
|
+
headers: {
|
|
163
|
+
'Content-Type': 'application/json',
|
|
164
|
+
},
|
|
165
|
+
body: {
|
|
166
|
+
id: string('123'),
|
|
167
|
+
email: email('user@example.com'),
|
|
168
|
+
name: string('John Doe'),
|
|
169
|
+
createdAt: datetime("2024-01-01T00:00:00.000Z"),
|
|
170
|
+
},
|
|
171
|
+
});
|
|
172
|
+
|
|
173
|
+
// Act & Assert: Run your actual code
|
|
174
|
+
await provider.executeTest(async (mockServer) => {
|
|
175
|
+
const userService = new UserService(mockServer.url);
|
|
176
|
+
const user = await userService.getUser('123');
|
|
177
|
+
|
|
178
|
+
expect(user.id).toBe('123');
|
|
179
|
+
expect(user.name).toBeDefined();
|
|
180
|
+
});
|
|
181
|
+
});
|
|
182
|
+
|
|
183
|
+
it('returns 404 when user does not exist', async () => {
|
|
184
|
+
await provider
|
|
185
|
+
.given('user with ID 999 does not exist')
|
|
186
|
+
.uponReceiving('a request for non-existent user')
|
|
187
|
+
.withRequest({
|
|
188
|
+
method: 'GET',
|
|
189
|
+
path: '/api/users/999',
|
|
190
|
+
headers: {
|
|
191
|
+
Accept: 'application/json',
|
|
192
|
+
},
|
|
193
|
+
})
|
|
194
|
+
.willRespondWith({
|
|
195
|
+
status: 404,
|
|
196
|
+
body: {
|
|
197
|
+
error: string('Not Found'),
|
|
198
|
+
message: string('User not found'),
|
|
199
|
+
},
|
|
200
|
+
});
|
|
201
|
+
|
|
202
|
+
await provider.executeTest(async (mockServer) => {
|
|
203
|
+
const userService = new UserService(mockServer.url);
|
|
204
|
+
await expect(userService.getUser('999')).rejects.toThrow('User not found');
|
|
205
|
+
});
|
|
206
|
+
});
|
|
207
|
+
});
|
|
208
|
+
|
|
209
|
+
// Test: Create user
|
|
210
|
+
describe('POST /users', () => {
|
|
211
|
+
it('creates a new user', async () => {
|
|
212
|
+
await provider
|
|
213
|
+
.given('no user with email test@example.com exists')
|
|
214
|
+
.uponReceiving('a request to create user')
|
|
215
|
+
.withRequest({
|
|
216
|
+
method: 'POST',
|
|
217
|
+
path: '/api/users',
|
|
218
|
+
headers: {
|
|
219
|
+
'Content-Type': 'application/json',
|
|
220
|
+
},
|
|
221
|
+
body: {
|
|
222
|
+
email: 'test@example.com',
|
|
223
|
+
name: 'Test User',
|
|
224
|
+
password: string('password123'),
|
|
225
|
+
},
|
|
226
|
+
})
|
|
227
|
+
.willRespondWith({
|
|
228
|
+
status: 201,
|
|
229
|
+
body: {
|
|
230
|
+
id: string(),
|
|
231
|
+
email: email('test@example.com'),
|
|
232
|
+
name: string('Test User'),
|
|
233
|
+
},
|
|
234
|
+
});
|
|
235
|
+
|
|
236
|
+
await provider.executeTest(async (mockServer) => {
|
|
237
|
+
const userService = new UserService(mockServer.url);
|
|
238
|
+
const user = await userService.createUser({
|
|
239
|
+
email: 'test@example.com',
|
|
240
|
+
name: 'Test User',
|
|
241
|
+
password: 'password123',
|
|
242
|
+
});
|
|
243
|
+
|
|
244
|
+
expect(user.id).toBeDefined();
|
|
245
|
+
expect(user.email).toBe('test@example.com');
|
|
246
|
+
});
|
|
247
|
+
});
|
|
248
|
+
});
|
|
249
|
+
|
|
250
|
+
// Test: List users
|
|
251
|
+
describe('GET /users', () => {
|
|
252
|
+
it('returns paginated list of users', async () => {
|
|
253
|
+
await provider
|
|
254
|
+
.given('multiple users exist')
|
|
255
|
+
.uponReceiving('a request to list users')
|
|
256
|
+
.withRequest({
|
|
257
|
+
method: 'GET',
|
|
258
|
+
path: '/api/users',
|
|
259
|
+
query: {
|
|
260
|
+
page: '1',
|
|
261
|
+
limit: '10',
|
|
262
|
+
},
|
|
263
|
+
})
|
|
264
|
+
.willRespondWith({
|
|
265
|
+
status: 200,
|
|
266
|
+
body: {
|
|
267
|
+
data: eachLike({
|
|
268
|
+
id: string('user-1'),
|
|
269
|
+
email: email(),
|
|
270
|
+
name: string('User Name'),
|
|
271
|
+
}),
|
|
272
|
+
meta: {
|
|
273
|
+
page: integer(1),
|
|
274
|
+
limit: integer(10),
|
|
275
|
+
total: integer(25),
|
|
276
|
+
},
|
|
277
|
+
},
|
|
278
|
+
});
|
|
279
|
+
|
|
280
|
+
await provider.executeTest(async (mockServer) => {
|
|
281
|
+
const userService = new UserService(mockServer.url);
|
|
282
|
+
const result = await userService.listUsers({ page: 1, limit: 10 });
|
|
283
|
+
|
|
284
|
+
expect(result.data.length).toBeGreaterThan(0);
|
|
285
|
+
expect(result.meta.page).toBe(1);
|
|
286
|
+
});
|
|
287
|
+
});
|
|
288
|
+
});
|
|
289
|
+
});
|
|
290
|
+
```
|
|
291
|
+
|
|
292
|
+
### Step 3: Run Consumer Tests
|
|
293
|
+
|
|
294
|
+
```bash
|
|
295
|
+
# Run consumer tests (generates pact files)
|
|
296
|
+
npm run test:contract:consumer
|
|
297
|
+
|
|
298
|
+
# Output: pacts/webapp-userservice.json
|
|
299
|
+
```
|
|
300
|
+
|
|
301
|
+
---
|
|
302
|
+
|
|
303
|
+
## Writing Provider Tests
|
|
304
|
+
|
|
305
|
+
### Step 1: Set Up Verifier
|
|
306
|
+
|
|
307
|
+
```typescript
|
|
308
|
+
// provider/tests/pact.verify.test.ts
|
|
309
|
+
import { Verifier } from '@pact-foundation/pact';
|
|
310
|
+
import { app } from '../app';
|
|
311
|
+
|
|
312
|
+
describe('User Service Provider Verification', () => {
|
|
313
|
+
let server: any;
|
|
314
|
+
|
|
315
|
+
beforeAll(async () => {
|
|
316
|
+
// Start your actual server
|
|
317
|
+
server = app.listen(3001);
|
|
318
|
+
});
|
|
319
|
+
|
|
320
|
+
afterAll(async () => {
|
|
321
|
+
server.close();
|
|
322
|
+
});
|
|
323
|
+
|
|
324
|
+
it('validates the expectations of WebApp', async () => {
|
|
325
|
+
const verifier = new Verifier({
|
|
326
|
+
providerBaseUrl: 'http://localhost:3001',
|
|
327
|
+
|
|
328
|
+
// Option 1: Local pact files
|
|
329
|
+
pactUrls: [
|
|
330
|
+
'./pacts/webapp-userservice.json',
|
|
331
|
+
],
|
|
332
|
+
|
|
333
|
+
// Option 2: Pact Broker
|
|
334
|
+
// pactBrokerUrl: process.env.PACT_BROKER_URL,
|
|
335
|
+
// pactBrokerToken: process.env.PACT_BROKER_TOKEN,
|
|
336
|
+
// provider: 'UserService',
|
|
337
|
+
// consumerVersionSelectors: [
|
|
338
|
+
// { latest: true },
|
|
339
|
+
// ],
|
|
340
|
+
|
|
341
|
+
// State handlers - set up test data for each state
|
|
342
|
+
stateHandlers: {
|
|
343
|
+
'user with ID 123 exists': async () => {
|
|
344
|
+
await db.users.create({
|
|
345
|
+
id: '123',
|
|
346
|
+
email: 'user@example.com',
|
|
347
|
+
name: 'John Doe',
|
|
348
|
+
createdAt: new Date('2024-01-01'),
|
|
349
|
+
});
|
|
350
|
+
},
|
|
351
|
+
|
|
352
|
+
'user with ID 999 does not exist': async () => {
|
|
353
|
+
await db.users.deleteMany({ id: '999' });
|
|
354
|
+
},
|
|
355
|
+
|
|
356
|
+
'no user with email test@example.com exists': async () => {
|
|
357
|
+
await db.users.deleteMany({ email: 'test@example.com' });
|
|
358
|
+
},
|
|
359
|
+
|
|
360
|
+
'multiple users exist': async () => {
|
|
361
|
+
await db.users.createMany([
|
|
362
|
+
{ id: 'user-1', email: 'user1@example.com', name: 'User 1' },
|
|
363
|
+
{ id: 'user-2', email: 'user2@example.com', name: 'User 2' },
|
|
364
|
+
{ id: 'user-3', email: 'user3@example.com', name: 'User 3' },
|
|
365
|
+
]);
|
|
366
|
+
},
|
|
367
|
+
},
|
|
368
|
+
|
|
369
|
+
// Clean up after each test
|
|
370
|
+
beforeEach: async () => {
|
|
371
|
+
await db.users.deleteMany({});
|
|
372
|
+
},
|
|
373
|
+
|
|
374
|
+
// Request filters (e.g., add auth)
|
|
375
|
+
requestFilter: (req, res, next) => {
|
|
376
|
+
// Add any necessary headers
|
|
377
|
+
req.headers['authorization'] = 'Bearer test-token';
|
|
378
|
+
next();
|
|
379
|
+
},
|
|
380
|
+
|
|
381
|
+
// Enable verbose logging
|
|
382
|
+
logLevel: 'info',
|
|
383
|
+
|
|
384
|
+
// Publish verification results
|
|
385
|
+
publishVerificationResult: process.env.CI === 'true',
|
|
386
|
+
providerVersion: process.env.GIT_COMMIT || '1.0.0',
|
|
387
|
+
});
|
|
388
|
+
|
|
389
|
+
await verifier.verifyProvider();
|
|
390
|
+
});
|
|
391
|
+
});
|
|
392
|
+
```
|
|
393
|
+
|
|
394
|
+
### Step 2: Run Provider Tests
|
|
395
|
+
|
|
396
|
+
```bash
|
|
397
|
+
# Run provider verification
|
|
398
|
+
npm run test:contract:provider
|
|
399
|
+
|
|
400
|
+
# Output shows each interaction verified
|
|
401
|
+
```
|
|
402
|
+
|
|
403
|
+
---
|
|
404
|
+
|
|
405
|
+
## Contract Versioning
|
|
406
|
+
|
|
407
|
+
### Using Pact Broker
|
|
408
|
+
|
|
409
|
+
```bash
|
|
410
|
+
# Publish consumer contract
|
|
411
|
+
pact-broker publish ./pacts \
|
|
412
|
+
--consumer-app-version $(git rev-parse HEAD) \
|
|
413
|
+
--branch $(git branch --show-current) \
|
|
414
|
+
--broker-base-url $PACT_BROKER_URL \
|
|
415
|
+
--broker-token $PACT_BROKER_TOKEN
|
|
416
|
+
|
|
417
|
+
# Verify provider
|
|
418
|
+
pact-broker verify \
|
|
419
|
+
--provider UserService \
|
|
420
|
+
--provider-app-version $(git rev-parse HEAD) \
|
|
421
|
+
--broker-base-url $PACT_BROKER_URL \
|
|
422
|
+
--broker-token $PACT_BROKER_TOKEN
|
|
423
|
+
|
|
424
|
+
# Can I deploy?
|
|
425
|
+
pact-broker can-i-deploy \
|
|
426
|
+
--pacticipant WebApp \
|
|
427
|
+
--version $(git rev-parse HEAD) \
|
|
428
|
+
--to-environment production
|
|
429
|
+
```
|
|
430
|
+
|
|
431
|
+
### Version Selectors
|
|
432
|
+
|
|
433
|
+
```typescript
|
|
434
|
+
// Provider test configuration
|
|
435
|
+
{
|
|
436
|
+
consumerVersionSelectors: [
|
|
437
|
+
{ mainBranch: true }, // Test against main branch
|
|
438
|
+
{ deployedOrReleased: true }, // Test against deployed versions
|
|
439
|
+
{ matchingBranch: true }, // Test against same branch
|
|
440
|
+
],
|
|
441
|
+
}
|
|
442
|
+
```
|
|
443
|
+
|
|
444
|
+
---
|
|
445
|
+
|
|
446
|
+
## CI/CD Integration
|
|
447
|
+
|
|
448
|
+
### GitHub Actions Example
|
|
449
|
+
|
|
450
|
+
```yaml
|
|
451
|
+
# .github/workflows/contract-tests.yml
|
|
452
|
+
name: Contract Tests
|
|
453
|
+
|
|
454
|
+
on:
|
|
455
|
+
push:
|
|
456
|
+
branches: [main, develop]
|
|
457
|
+
pull_request:
|
|
458
|
+
branches: [main]
|
|
459
|
+
|
|
460
|
+
env:
|
|
461
|
+
PACT_BROKER_URL: ${{ secrets.PACT_BROKER_URL }}
|
|
462
|
+
PACT_BROKER_TOKEN: ${{ secrets.PACT_BROKER_TOKEN }}
|
|
463
|
+
|
|
464
|
+
jobs:
|
|
465
|
+
consumer-tests:
|
|
466
|
+
runs-on: ubuntu-latest
|
|
467
|
+
steps:
|
|
468
|
+
- uses: actions/checkout@v4
|
|
469
|
+
|
|
470
|
+
- name: Setup Node
|
|
471
|
+
uses: actions/setup-node@v4
|
|
472
|
+
with:
|
|
473
|
+
node-version: '20'
|
|
474
|
+
|
|
475
|
+
- name: Install dependencies
|
|
476
|
+
run: npm ci
|
|
477
|
+
|
|
478
|
+
- name: Run consumer contract tests
|
|
479
|
+
run: npm run test:contract:consumer
|
|
480
|
+
|
|
481
|
+
- name: Publish contracts
|
|
482
|
+
if: github.ref == 'refs/heads/main'
|
|
483
|
+
run: |
|
|
484
|
+
npx pact-broker publish ./pacts \
|
|
485
|
+
--consumer-app-version ${{ github.sha }} \
|
|
486
|
+
--branch ${{ github.ref_name }}
|
|
487
|
+
|
|
488
|
+
provider-tests:
|
|
489
|
+
runs-on: ubuntu-latest
|
|
490
|
+
needs: consumer-tests
|
|
491
|
+
steps:
|
|
492
|
+
- uses: actions/checkout@v4
|
|
493
|
+
|
|
494
|
+
- name: Setup Node
|
|
495
|
+
uses: actions/setup-node@v4
|
|
496
|
+
|
|
497
|
+
- name: Install dependencies
|
|
498
|
+
run: npm ci
|
|
499
|
+
|
|
500
|
+
- name: Run provider verification
|
|
501
|
+
run: npm run test:contract:provider
|
|
502
|
+
env:
|
|
503
|
+
GIT_COMMIT: ${{ github.sha }}
|
|
504
|
+
CI: true
|
|
505
|
+
|
|
506
|
+
can-i-deploy:
|
|
507
|
+
runs-on: ubuntu-latest
|
|
508
|
+
needs: [consumer-tests, provider-tests]
|
|
509
|
+
if: github.ref == 'refs/heads/main'
|
|
510
|
+
steps:
|
|
511
|
+
- name: Can I deploy?
|
|
512
|
+
run: |
|
|
513
|
+
npx pact-broker can-i-deploy \
|
|
514
|
+
--pacticipant WebApp \
|
|
515
|
+
--version ${{ github.sha }} \
|
|
516
|
+
--to-environment production
|
|
517
|
+
```
|
|
518
|
+
|
|
519
|
+
---
|
|
520
|
+
|
|
521
|
+
## Troubleshooting
|
|
522
|
+
|
|
523
|
+
### Common Issues
|
|
524
|
+
|
|
525
|
+
#### 1. "No matching interaction found"
|
|
526
|
+
|
|
527
|
+
**Cause:** Request doesn't match any defined interaction.
|
|
528
|
+
|
|
529
|
+
**Solution:**
|
|
530
|
+
```typescript
|
|
531
|
+
// Check exact path, method, headers match
|
|
532
|
+
.withRequest({
|
|
533
|
+
method: 'GET', // Exact method
|
|
534
|
+
path: '/api/users/123', // Exact path (no trailing slash)
|
|
535
|
+
headers: {
|
|
536
|
+
Accept: 'application/json', // Required headers
|
|
537
|
+
},
|
|
538
|
+
})
|
|
539
|
+
```
|
|
540
|
+
|
|
541
|
+
#### 2. "State handler not found"
|
|
542
|
+
|
|
543
|
+
**Cause:** Provider test missing state handler.
|
|
544
|
+
|
|
545
|
+
**Solution:**
|
|
546
|
+
```typescript
|
|
547
|
+
stateHandlers: {
|
|
548
|
+
'user exists': async () => {
|
|
549
|
+
// This string must EXACTLY match the .given() in consumer
|
|
550
|
+
},
|
|
551
|
+
}
|
|
552
|
+
```
|
|
553
|
+
|
|
554
|
+
#### 3. "Response body mismatch"
|
|
555
|
+
|
|
556
|
+
**Cause:** Provider returns different structure than expected.
|
|
557
|
+
|
|
558
|
+
**Solution:**
|
|
559
|
+
- Use flexible matchers instead of exact values
|
|
560
|
+
- Check for extra fields in response
|
|
561
|
+
- Verify data types match
|
|
562
|
+
|
|
563
|
+
```typescript
|
|
564
|
+
// Consumer: Use matchers
|
|
565
|
+
body: {
|
|
566
|
+
id: string(), // Any string
|
|
567
|
+
count: integer(), // Any integer
|
|
568
|
+
items: eachLike({}), // Array with at least one item
|
|
569
|
+
}
|
|
570
|
+
```
|
|
571
|
+
|
|
572
|
+
#### 4. "Verification failed - missing fields"
|
|
573
|
+
|
|
574
|
+
**Cause:** Provider response missing required fields.
|
|
575
|
+
|
|
576
|
+
**Solution:**
|
|
577
|
+
- Ensure provider returns all fields in contract
|
|
578
|
+
- Check conditional fields are included
|
|
579
|
+
|
|
580
|
+
### Debugging Tips
|
|
581
|
+
|
|
582
|
+
```typescript
|
|
583
|
+
// Enable verbose logging
|
|
584
|
+
const provider = new PactV3({
|
|
585
|
+
logLevel: 'debug',
|
|
586
|
+
});
|
|
587
|
+
|
|
588
|
+
// Log actual requests/responses
|
|
589
|
+
const verifier = new Verifier({
|
|
590
|
+
logLevel: 'debug',
|
|
591
|
+
verbose: true,
|
|
592
|
+
});
|
|
593
|
+
```
|
|
594
|
+
|
|
595
|
+
### Pact Broker UI
|
|
596
|
+
|
|
597
|
+
The Pact Broker provides a web UI showing:
|
|
598
|
+
- All contracts
|
|
599
|
+
- Verification status
|
|
600
|
+
- Can-I-Deploy matrix
|
|
601
|
+
- Integration graph
|
|
602
|
+
|
|
603
|
+
---
|
|
604
|
+
|
|
605
|
+
## Best Practices Checklist
|
|
606
|
+
|
|
607
|
+
- [ ] Consumer tests generate contracts (not hand-written)
|
|
608
|
+
- [ ] Use matchers instead of exact values
|
|
609
|
+
- [ ] Keep contracts minimal (only what's used)
|
|
610
|
+
- [ ] Version contracts with git commits
|
|
611
|
+
- [ ] Run contract tests in CI/CD
|
|
612
|
+
- [ ] Block deployments on contract failures
|
|
613
|
+
- [ ] Clean up test data between verifications
|
|
614
|
+
- [ ] Document state requirements clearly
|