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,198 @@
|
|
|
1
|
+
# Coverage Requirements
|
|
2
|
+
|
|
3
|
+
Define and enforce test coverage thresholds.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Coverage Metrics
|
|
8
|
+
|
|
9
|
+
### Types of Coverage
|
|
10
|
+
|
|
11
|
+
| Metric | Description | Target |
|
|
12
|
+
|--------|-------------|--------|
|
|
13
|
+
| **Statements** | Lines of code executed | 80% |
|
|
14
|
+
| **Branches** | Decision paths taken | 75% |
|
|
15
|
+
| **Functions** | Functions called | 80% |
|
|
16
|
+
| **Lines** | Source lines covered | 80% |
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## Configuration
|
|
21
|
+
|
|
22
|
+
### Global Settings
|
|
23
|
+
|
|
24
|
+
```yaml
|
|
25
|
+
# proagents.config.yaml
|
|
26
|
+
testing:
|
|
27
|
+
coverage:
|
|
28
|
+
enabled: true
|
|
29
|
+
|
|
30
|
+
# Global thresholds
|
|
31
|
+
thresholds:
|
|
32
|
+
statements: 80
|
|
33
|
+
branches: 75
|
|
34
|
+
functions: 80
|
|
35
|
+
lines: 80
|
|
36
|
+
|
|
37
|
+
# Fail build if below
|
|
38
|
+
fail_under: true
|
|
39
|
+
|
|
40
|
+
# Coverage tool
|
|
41
|
+
tool: "istanbul" # istanbul, c8, nyc
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
### Per-Directory Thresholds
|
|
45
|
+
|
|
46
|
+
```yaml
|
|
47
|
+
testing:
|
|
48
|
+
coverage:
|
|
49
|
+
by_directory:
|
|
50
|
+
# Critical code needs higher coverage
|
|
51
|
+
"src/core/":
|
|
52
|
+
statements: 90
|
|
53
|
+
branches: 85
|
|
54
|
+
|
|
55
|
+
# UI can have lower thresholds
|
|
56
|
+
"src/components/":
|
|
57
|
+
statements: 70
|
|
58
|
+
branches: 65
|
|
59
|
+
|
|
60
|
+
# Utils should be well tested
|
|
61
|
+
"src/utils/":
|
|
62
|
+
statements: 95
|
|
63
|
+
functions: 100
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
### Exclude From Coverage
|
|
67
|
+
|
|
68
|
+
```yaml
|
|
69
|
+
testing:
|
|
70
|
+
coverage:
|
|
71
|
+
exclude:
|
|
72
|
+
- "**/*.test.ts"
|
|
73
|
+
- "**/*.spec.ts"
|
|
74
|
+
- "**/test/**"
|
|
75
|
+
- "**/mocks/**"
|
|
76
|
+
- "**/*.d.ts"
|
|
77
|
+
- "**/index.ts" # Re-export files
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
---
|
|
81
|
+
|
|
82
|
+
## Coverage by Feature Type
|
|
83
|
+
|
|
84
|
+
### New Features
|
|
85
|
+
|
|
86
|
+
| Phase | Requirement |
|
|
87
|
+
|-------|-------------|
|
|
88
|
+
| Implementation | 80% coverage for new code |
|
|
89
|
+
| PR Merge | No decrease in overall coverage |
|
|
90
|
+
| Release | Meet all thresholds |
|
|
91
|
+
|
|
92
|
+
### Bug Fixes
|
|
93
|
+
|
|
94
|
+
| Requirement |
|
|
95
|
+
|-------------|
|
|
96
|
+
| Add test that reproduces the bug |
|
|
97
|
+
| Test must fail before fix |
|
|
98
|
+
| Test must pass after fix |
|
|
99
|
+
|
|
100
|
+
### Refactoring
|
|
101
|
+
|
|
102
|
+
| Requirement |
|
|
103
|
+
|-------------|
|
|
104
|
+
| No decrease in coverage |
|
|
105
|
+
| All existing tests pass |
|
|
106
|
+
| Add tests for uncovered edge cases found |
|
|
107
|
+
|
|
108
|
+
---
|
|
109
|
+
|
|
110
|
+
## Coverage Reports
|
|
111
|
+
|
|
112
|
+
### Generate Report
|
|
113
|
+
|
|
114
|
+
```bash
|
|
115
|
+
# HTML report
|
|
116
|
+
proagents test --coverage --report html
|
|
117
|
+
|
|
118
|
+
# JSON for CI
|
|
119
|
+
proagents test --coverage --report json
|
|
120
|
+
|
|
121
|
+
# Summary only
|
|
122
|
+
proagents test --coverage --report summary
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
### Report Output
|
|
126
|
+
|
|
127
|
+
```
|
|
128
|
+
┌─────────────────────────────────────────────────────────────┐
|
|
129
|
+
│ Coverage Summary │
|
|
130
|
+
├─────────────────────────────────────────────────────────────┤
|
|
131
|
+
│ │
|
|
132
|
+
│ Overall: 83.5% │
|
|
133
|
+
│ [████████████████░░░░] 83.5% │
|
|
134
|
+
│ │
|
|
135
|
+
│ By Type: │
|
|
136
|
+
│ ├── Statements: 85.2% ✅ │
|
|
137
|
+
│ ├── Branches: 78.5% ✅ │
|
|
138
|
+
│ ├── Functions: 88.1% ✅ │
|
|
139
|
+
│ └── Lines: 84.8% ✅ │
|
|
140
|
+
│ │
|
|
141
|
+
│ By Directory: │
|
|
142
|
+
│ ├── src/core/ 92.1% ✅ (target: 90%) │
|
|
143
|
+
│ ├── src/services/ 81.3% ✅ (target: 80%) │
|
|
144
|
+
│ ├── src/utils/ 94.5% ✅ (target: 85%) │
|
|
145
|
+
│ └── src/ui/ 71.2% ✅ (target: 70%) │
|
|
146
|
+
│ │
|
|
147
|
+
│ Uncovered Files: │
|
|
148
|
+
│ ├── src/services/legacy.ts (45%) │
|
|
149
|
+
│ └── src/utils/deprecated.ts (30%) │
|
|
150
|
+
│ │
|
|
151
|
+
└─────────────────────────────────────────────────────────────┘
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
---
|
|
155
|
+
|
|
156
|
+
## CI Integration
|
|
157
|
+
|
|
158
|
+
### GitHub Actions
|
|
159
|
+
|
|
160
|
+
```yaml
|
|
161
|
+
- name: Run tests with coverage
|
|
162
|
+
run: proagents test --coverage --ci
|
|
163
|
+
|
|
164
|
+
- name: Check coverage thresholds
|
|
165
|
+
run: proagents test coverage-check
|
|
166
|
+
|
|
167
|
+
- name: Upload coverage report
|
|
168
|
+
uses: codecov/codecov-action@v3
|
|
169
|
+
with:
|
|
170
|
+
files: ./coverage/lcov.info
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
### Coverage Gates
|
|
174
|
+
|
|
175
|
+
```yaml
|
|
176
|
+
testing:
|
|
177
|
+
coverage:
|
|
178
|
+
ci:
|
|
179
|
+
# Block PR if coverage drops
|
|
180
|
+
block_on_decrease: true
|
|
181
|
+
|
|
182
|
+
# Minimum for new code
|
|
183
|
+
new_code_minimum: 80
|
|
184
|
+
|
|
185
|
+
# Allow small decreases
|
|
186
|
+
allowed_decrease: 1 # percent
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
---
|
|
190
|
+
|
|
191
|
+
## Best Practices
|
|
192
|
+
|
|
193
|
+
1. **Set Realistic Targets**: Start achievable, increase over time
|
|
194
|
+
2. **Focus on Critical Code**: Higher coverage for core logic
|
|
195
|
+
3. **Don't Chase 100%**: Diminishing returns after ~90%
|
|
196
|
+
4. **Track Trends**: Coverage should improve over time
|
|
197
|
+
5. **Review Uncovered Code**: Understand why it's not covered
|
|
198
|
+
6. **Quality Over Quantity**: Good tests > high numbers
|
|
@@ -0,0 +1,478 @@
|
|
|
1
|
+
# Mocking Guidelines
|
|
2
|
+
|
|
3
|
+
Best practices for creating and using mocks in tests.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## When to Mock
|
|
8
|
+
|
|
9
|
+
| Mock | Don't Mock |
|
|
10
|
+
|------|------------|
|
|
11
|
+
| External APIs | Pure functions |
|
|
12
|
+
| Databases (unit tests) | Simple utilities |
|
|
13
|
+
| File system | Data transformations |
|
|
14
|
+
| Time/Date | Domain logic |
|
|
15
|
+
| Random values | Value objects |
|
|
16
|
+
| Third-party services | Internal collaborators (usually) |
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## Mock Types
|
|
21
|
+
|
|
22
|
+
### Mocks
|
|
23
|
+
|
|
24
|
+
Full replacement with behavior verification.
|
|
25
|
+
|
|
26
|
+
```typescript
|
|
27
|
+
// Mock with Jest
|
|
28
|
+
const userRepository = {
|
|
29
|
+
findById: jest.fn(),
|
|
30
|
+
save: jest.fn(),
|
|
31
|
+
delete: jest.fn(),
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
// Set return value
|
|
35
|
+
userRepository.findById.mockResolvedValue({ id: '1', name: 'Test' });
|
|
36
|
+
|
|
37
|
+
// Verify calls
|
|
38
|
+
expect(userRepository.findById).toHaveBeenCalledWith('1');
|
|
39
|
+
expect(userRepository.save).toHaveBeenCalledTimes(1);
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
### Stubs
|
|
43
|
+
|
|
44
|
+
Predefined responses without verification.
|
|
45
|
+
|
|
46
|
+
```typescript
|
|
47
|
+
// Stub - just returns values
|
|
48
|
+
const configStub = {
|
|
49
|
+
get: (key: string) => {
|
|
50
|
+
const config = {
|
|
51
|
+
'api.url': 'https://api.test.com',
|
|
52
|
+
'api.timeout': 5000,
|
|
53
|
+
};
|
|
54
|
+
return config[key];
|
|
55
|
+
},
|
|
56
|
+
};
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
### Spies
|
|
60
|
+
|
|
61
|
+
Wraps real implementation with tracking.
|
|
62
|
+
|
|
63
|
+
```typescript
|
|
64
|
+
// Spy on real method
|
|
65
|
+
const spy = jest.spyOn(logger, 'error');
|
|
66
|
+
|
|
67
|
+
await processOrder(invalidOrder);
|
|
68
|
+
|
|
69
|
+
expect(spy).toHaveBeenCalledWith('Order processing failed', expect.any(Error));
|
|
70
|
+
|
|
71
|
+
spy.mockRestore(); // Restore original
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
### Fakes
|
|
75
|
+
|
|
76
|
+
Working implementation for testing.
|
|
77
|
+
|
|
78
|
+
```typescript
|
|
79
|
+
// Fake in-memory repository
|
|
80
|
+
class FakeUserRepository implements UserRepository {
|
|
81
|
+
private users: Map<string, User> = new Map();
|
|
82
|
+
|
|
83
|
+
async findById(id: string): Promise<User | null> {
|
|
84
|
+
return this.users.get(id) || null;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
async save(user: User): Promise<User> {
|
|
88
|
+
this.users.set(user.id, user);
|
|
89
|
+
return user;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
async delete(id: string): Promise<void> {
|
|
93
|
+
this.users.delete(id);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
// Test helper
|
|
97
|
+
clear(): void {
|
|
98
|
+
this.users.clear();
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
---
|
|
104
|
+
|
|
105
|
+
## Jest Mocking
|
|
106
|
+
|
|
107
|
+
### Module Mocks
|
|
108
|
+
|
|
109
|
+
```typescript
|
|
110
|
+
// Mock entire module
|
|
111
|
+
jest.mock('./emailService');
|
|
112
|
+
|
|
113
|
+
// Access mock
|
|
114
|
+
import { sendEmail } from './emailService';
|
|
115
|
+
const mockSendEmail = sendEmail as jest.MockedFunction<typeof sendEmail>;
|
|
116
|
+
|
|
117
|
+
// Configure
|
|
118
|
+
mockSendEmail.mockResolvedValue({ success: true });
|
|
119
|
+
|
|
120
|
+
// Auto-mock with implementation
|
|
121
|
+
jest.mock('./userRepository', () => ({
|
|
122
|
+
findById: jest.fn().mockResolvedValue({ id: '1', name: 'Test' }),
|
|
123
|
+
save: jest.fn().mockImplementation((user) => Promise.resolve(user)),
|
|
124
|
+
}));
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
### Partial Mocks
|
|
128
|
+
|
|
129
|
+
```typescript
|
|
130
|
+
// Mock only specific exports
|
|
131
|
+
jest.mock('./utils', () => ({
|
|
132
|
+
...jest.requireActual('./utils'),
|
|
133
|
+
fetchData: jest.fn(),
|
|
134
|
+
}));
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
### Class Mocks
|
|
138
|
+
|
|
139
|
+
```typescript
|
|
140
|
+
// Mock class
|
|
141
|
+
jest.mock('./UserService');
|
|
142
|
+
|
|
143
|
+
// Get mock constructor
|
|
144
|
+
const MockUserService = UserService as jest.MockedClass<typeof UserService>;
|
|
145
|
+
|
|
146
|
+
// Configure instance methods
|
|
147
|
+
MockUserService.prototype.getUser.mockResolvedValue(testUser);
|
|
148
|
+
|
|
149
|
+
// Verify instantiation
|
|
150
|
+
expect(MockUserService).toHaveBeenCalledWith(mockRepository);
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
---
|
|
154
|
+
|
|
155
|
+
## Dependency Injection
|
|
156
|
+
|
|
157
|
+
### Constructor Injection
|
|
158
|
+
|
|
159
|
+
```typescript
|
|
160
|
+
// Service with injected dependencies
|
|
161
|
+
class OrderService {
|
|
162
|
+
constructor(
|
|
163
|
+
private readonly orderRepository: OrderRepository,
|
|
164
|
+
private readonly paymentService: PaymentService,
|
|
165
|
+
private readonly emailService: EmailService
|
|
166
|
+
) {}
|
|
167
|
+
|
|
168
|
+
async placeOrder(order: Order): Promise<Order> {
|
|
169
|
+
const saved = await this.orderRepository.save(order);
|
|
170
|
+
await this.paymentService.charge(order.total);
|
|
171
|
+
await this.emailService.sendConfirmation(order);
|
|
172
|
+
return saved;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
// Test with mocks
|
|
177
|
+
describe('OrderService', () => {
|
|
178
|
+
let service: OrderService;
|
|
179
|
+
let mockOrderRepo: jest.Mocked<OrderRepository>;
|
|
180
|
+
let mockPaymentService: jest.Mocked<PaymentService>;
|
|
181
|
+
let mockEmailService: jest.Mocked<EmailService>;
|
|
182
|
+
|
|
183
|
+
beforeEach(() => {
|
|
184
|
+
mockOrderRepo = {
|
|
185
|
+
save: jest.fn(),
|
|
186
|
+
findById: jest.fn(),
|
|
187
|
+
};
|
|
188
|
+
mockPaymentService = {
|
|
189
|
+
charge: jest.fn(),
|
|
190
|
+
};
|
|
191
|
+
mockEmailService = {
|
|
192
|
+
sendConfirmation: jest.fn(),
|
|
193
|
+
};
|
|
194
|
+
|
|
195
|
+
service = new OrderService(mockOrderRepo, mockPaymentService, mockEmailService);
|
|
196
|
+
});
|
|
197
|
+
|
|
198
|
+
it('should save order and process payment', async () => {
|
|
199
|
+
const order = createOrder();
|
|
200
|
+
mockOrderRepo.save.mockResolvedValue(order);
|
|
201
|
+
mockPaymentService.charge.mockResolvedValue({ success: true });
|
|
202
|
+
|
|
203
|
+
await service.placeOrder(order);
|
|
204
|
+
|
|
205
|
+
expect(mockOrderRepo.save).toHaveBeenCalledWith(order);
|
|
206
|
+
expect(mockPaymentService.charge).toHaveBeenCalledWith(order.total);
|
|
207
|
+
});
|
|
208
|
+
});
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
---
|
|
212
|
+
|
|
213
|
+
## HTTP Mocking
|
|
214
|
+
|
|
215
|
+
### MSW (Mock Service Worker)
|
|
216
|
+
|
|
217
|
+
```typescript
|
|
218
|
+
// mocks/handlers.ts
|
|
219
|
+
import { rest } from 'msw';
|
|
220
|
+
|
|
221
|
+
export const handlers = [
|
|
222
|
+
rest.get('/api/users/:id', (req, res, ctx) => {
|
|
223
|
+
const { id } = req.params;
|
|
224
|
+
return res(
|
|
225
|
+
ctx.json({
|
|
226
|
+
id,
|
|
227
|
+
name: 'Test User',
|
|
228
|
+
email: 'test@example.com',
|
|
229
|
+
})
|
|
230
|
+
);
|
|
231
|
+
}),
|
|
232
|
+
|
|
233
|
+
rest.post('/api/orders', async (req, res, ctx) => {
|
|
234
|
+
const body = await req.json();
|
|
235
|
+
return res(
|
|
236
|
+
ctx.status(201),
|
|
237
|
+
ctx.json({
|
|
238
|
+
id: 'order-123',
|
|
239
|
+
...body,
|
|
240
|
+
})
|
|
241
|
+
);
|
|
242
|
+
}),
|
|
243
|
+
|
|
244
|
+
// Error response
|
|
245
|
+
rest.get('/api/error', (req, res, ctx) => {
|
|
246
|
+
return res(
|
|
247
|
+
ctx.status(500),
|
|
248
|
+
ctx.json({ error: 'Internal server error' })
|
|
249
|
+
);
|
|
250
|
+
}),
|
|
251
|
+
];
|
|
252
|
+
|
|
253
|
+
// Setup in tests
|
|
254
|
+
import { setupServer } from 'msw/node';
|
|
255
|
+
import { handlers } from './mocks/handlers';
|
|
256
|
+
|
|
257
|
+
const server = setupServer(...handlers);
|
|
258
|
+
|
|
259
|
+
beforeAll(() => server.listen());
|
|
260
|
+
afterEach(() => server.resetHandlers());
|
|
261
|
+
afterAll(() => server.close());
|
|
262
|
+
|
|
263
|
+
// Override for specific test
|
|
264
|
+
it('should handle API error', async () => {
|
|
265
|
+
server.use(
|
|
266
|
+
rest.get('/api/users/:id', (req, res, ctx) => {
|
|
267
|
+
return res(ctx.status(404));
|
|
268
|
+
})
|
|
269
|
+
);
|
|
270
|
+
|
|
271
|
+
await expect(userService.getUser('1')).rejects.toThrow('Not found');
|
|
272
|
+
});
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
### Nock
|
|
276
|
+
|
|
277
|
+
```typescript
|
|
278
|
+
import nock from 'nock';
|
|
279
|
+
|
|
280
|
+
describe('API Client', () => {
|
|
281
|
+
afterEach(() => {
|
|
282
|
+
nock.cleanAll();
|
|
283
|
+
});
|
|
284
|
+
|
|
285
|
+
it('should fetch user', async () => {
|
|
286
|
+
nock('https://api.example.com')
|
|
287
|
+
.get('/users/1')
|
|
288
|
+
.reply(200, { id: '1', name: 'Test User' });
|
|
289
|
+
|
|
290
|
+
const user = await apiClient.getUser('1');
|
|
291
|
+
|
|
292
|
+
expect(user.name).toBe('Test User');
|
|
293
|
+
});
|
|
294
|
+
|
|
295
|
+
it('should retry on failure', async () => {
|
|
296
|
+
nock('https://api.example.com')
|
|
297
|
+
.get('/users/1')
|
|
298
|
+
.reply(500)
|
|
299
|
+
.get('/users/1')
|
|
300
|
+
.reply(200, { id: '1', name: 'Test User' });
|
|
301
|
+
|
|
302
|
+
const user = await apiClient.getUser('1');
|
|
303
|
+
|
|
304
|
+
expect(user.name).toBe('Test User');
|
|
305
|
+
});
|
|
306
|
+
});
|
|
307
|
+
```
|
|
308
|
+
|
|
309
|
+
---
|
|
310
|
+
|
|
311
|
+
## Database Mocking
|
|
312
|
+
|
|
313
|
+
### Repository Mocks
|
|
314
|
+
|
|
315
|
+
```typescript
|
|
316
|
+
// Create typed mock repository
|
|
317
|
+
function createMockUserRepository(): jest.Mocked<UserRepository> {
|
|
318
|
+
return {
|
|
319
|
+
findById: jest.fn(),
|
|
320
|
+
findByEmail: jest.fn(),
|
|
321
|
+
save: jest.fn(),
|
|
322
|
+
delete: jest.fn(),
|
|
323
|
+
findAll: jest.fn(),
|
|
324
|
+
};
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
// Usage
|
|
328
|
+
const mockRepo = createMockUserRepository();
|
|
329
|
+
mockRepo.findById.mockResolvedValue(testUser);
|
|
330
|
+
```
|
|
331
|
+
|
|
332
|
+
### Test Containers
|
|
333
|
+
|
|
334
|
+
```typescript
|
|
335
|
+
// Use real database in containers
|
|
336
|
+
import { PostgreSqlContainer } from 'testcontainers';
|
|
337
|
+
|
|
338
|
+
describe('UserRepository (Integration)', () => {
|
|
339
|
+
let container: PostgreSqlContainer;
|
|
340
|
+
let db: Database;
|
|
341
|
+
|
|
342
|
+
beforeAll(async () => {
|
|
343
|
+
container = await new PostgreSqlContainer().start();
|
|
344
|
+
db = await createConnection(container.getConnectionUri());
|
|
345
|
+
await db.migrate();
|
|
346
|
+
}, 60000);
|
|
347
|
+
|
|
348
|
+
afterAll(async () => {
|
|
349
|
+
await db.close();
|
|
350
|
+
await container.stop();
|
|
351
|
+
});
|
|
352
|
+
|
|
353
|
+
it('should save and retrieve user', async () => {
|
|
354
|
+
const repo = new UserRepository(db);
|
|
355
|
+
const user = await repo.save(createUser());
|
|
356
|
+
const found = await repo.findById(user.id);
|
|
357
|
+
expect(found).toEqual(user);
|
|
358
|
+
});
|
|
359
|
+
});
|
|
360
|
+
```
|
|
361
|
+
|
|
362
|
+
---
|
|
363
|
+
|
|
364
|
+
## Time Mocking
|
|
365
|
+
|
|
366
|
+
### Jest Fake Timers
|
|
367
|
+
|
|
368
|
+
```typescript
|
|
369
|
+
describe('Scheduler', () => {
|
|
370
|
+
beforeEach(() => {
|
|
371
|
+
jest.useFakeTimers();
|
|
372
|
+
jest.setSystemTime(new Date('2024-01-15T10:00:00Z'));
|
|
373
|
+
});
|
|
374
|
+
|
|
375
|
+
afterEach(() => {
|
|
376
|
+
jest.useRealTimers();
|
|
377
|
+
});
|
|
378
|
+
|
|
379
|
+
it('should schedule job for tomorrow', () => {
|
|
380
|
+
const job = scheduler.scheduleForTomorrow(callback);
|
|
381
|
+
|
|
382
|
+
expect(job.scheduledTime).toEqual(new Date('2024-01-16T10:00:00Z'));
|
|
383
|
+
});
|
|
384
|
+
|
|
385
|
+
it('should execute after delay', () => {
|
|
386
|
+
const callback = jest.fn();
|
|
387
|
+
scheduler.scheduleIn(5000, callback);
|
|
388
|
+
|
|
389
|
+
jest.advanceTimersByTime(4999);
|
|
390
|
+
expect(callback).not.toHaveBeenCalled();
|
|
391
|
+
|
|
392
|
+
jest.advanceTimersByTime(1);
|
|
393
|
+
expect(callback).toHaveBeenCalled();
|
|
394
|
+
});
|
|
395
|
+
});
|
|
396
|
+
```
|
|
397
|
+
|
|
398
|
+
---
|
|
399
|
+
|
|
400
|
+
## Anti-Patterns
|
|
401
|
+
|
|
402
|
+
### Over-Mocking
|
|
403
|
+
|
|
404
|
+
```typescript
|
|
405
|
+
// ❌ Bad: Mocking too much
|
|
406
|
+
it('should calculate total', () => {
|
|
407
|
+
const mockMultiply = jest.fn().mockReturnValue(100);
|
|
408
|
+
const mockAdd = jest.fn().mockReturnValue(110);
|
|
409
|
+
|
|
410
|
+
// Testing implementation, not behavior
|
|
411
|
+
expect(calculateTotal([{ price: 10, qty: 10 }], 0.1)).toBe(110);
|
|
412
|
+
});
|
|
413
|
+
|
|
414
|
+
// ✅ Good: Test behavior, not implementation
|
|
415
|
+
it('should calculate total with tax', () => {
|
|
416
|
+
const items = [{ price: 10, quantity: 10 }];
|
|
417
|
+
expect(calculateTotal(items, 0.1)).toBe(110);
|
|
418
|
+
});
|
|
419
|
+
```
|
|
420
|
+
|
|
421
|
+
### Mock Verification Overkill
|
|
422
|
+
|
|
423
|
+
```typescript
|
|
424
|
+
// ❌ Bad: Over-verifying
|
|
425
|
+
it('should save user', async () => {
|
|
426
|
+
await userService.create(userData);
|
|
427
|
+
|
|
428
|
+
expect(mockRepo.save).toHaveBeenCalled();
|
|
429
|
+
expect(mockRepo.save).toHaveBeenCalledTimes(1);
|
|
430
|
+
expect(mockRepo.save).toHaveBeenCalledWith(expect.objectContaining(userData));
|
|
431
|
+
expect(mockRepo.save.mock.calls[0][0].id).toBeDefined();
|
|
432
|
+
// etc...
|
|
433
|
+
});
|
|
434
|
+
|
|
435
|
+
// ✅ Good: Verify what matters
|
|
436
|
+
it('should save user with generated id', async () => {
|
|
437
|
+
const user = await userService.create(userData);
|
|
438
|
+
|
|
439
|
+
expect(user.id).toBeDefined();
|
|
440
|
+
expect(mockRepo.save).toHaveBeenCalledWith(
|
|
441
|
+
expect.objectContaining({ ...userData, id: expect.any(String) })
|
|
442
|
+
);
|
|
443
|
+
});
|
|
444
|
+
```
|
|
445
|
+
|
|
446
|
+
---
|
|
447
|
+
|
|
448
|
+
## Configuration
|
|
449
|
+
|
|
450
|
+
```yaml
|
|
451
|
+
# proagents.config.yaml
|
|
452
|
+
testing:
|
|
453
|
+
mocking:
|
|
454
|
+
# HTTP mocking
|
|
455
|
+
http:
|
|
456
|
+
tool: "msw" # or "nock"
|
|
457
|
+
handlers_dir: "__mocks__/handlers"
|
|
458
|
+
|
|
459
|
+
# Database mocking
|
|
460
|
+
database:
|
|
461
|
+
strategy: "repository_mock" # or "test_container", "in_memory"
|
|
462
|
+
|
|
463
|
+
# Time mocking
|
|
464
|
+
time:
|
|
465
|
+
default_date: "2024-01-15T10:00:00Z"
|
|
466
|
+
```
|
|
467
|
+
|
|
468
|
+
---
|
|
469
|
+
|
|
470
|
+
## Best Practices
|
|
471
|
+
|
|
472
|
+
1. **Mock at Boundaries**: Mock external systems, not internal code
|
|
473
|
+
2. **Prefer Fakes**: Use fakes over mocks when behavior matters
|
|
474
|
+
3. **Verify Behavior**: Check what matters, not implementation details
|
|
475
|
+
4. **Reset State**: Clean up mocks between tests
|
|
476
|
+
5. **Type Safety**: Use typed mocks to catch errors
|
|
477
|
+
6. **Don't Mock What You Don't Own**: Wrap third-party code first
|
|
478
|
+
7. **Keep Mocks Simple**: Complex mocks indicate design issues
|