@agentic-qe/v3 3.0.0-alpha.6 → 3.0.0-alpha.7
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/assets/agents/v3/subagents/v3-qe-code-reviewer.md +339 -0
- package/assets/agents/v3/subagents/v3-qe-integration-reviewer.md +344 -0
- package/assets/agents/v3/subagents/v3-qe-performance-reviewer.md +351 -0
- package/assets/agents/v3/subagents/v3-qe-security-reviewer.md +374 -0
- package/assets/agents/v3/subagents/v3-qe-tdd-green.md +334 -0
- package/assets/agents/v3/subagents/v3-qe-tdd-red.md +329 -0
- package/assets/agents/v3/subagents/v3-qe-tdd-refactor.md +361 -0
- package/assets/agents/v3/v3-qe-accessibility-auditor.md +266 -0
- package/assets/agents/v3/v3-qe-bdd-generator.md +279 -0
- package/assets/agents/v3/v3-qe-chaos-engineer.md +265 -0
- package/assets/agents/v3/v3-qe-code-complexity.md +298 -0
- package/assets/agents/v3/v3-qe-code-intelligence.md +262 -0
- package/assets/agents/v3/v3-qe-contract-validator.md +267 -0
- package/assets/agents/v3/v3-qe-coverage-specialist.md +227 -0
- package/assets/agents/v3/v3-qe-defect-predictor.md +251 -0
- package/assets/agents/v3/v3-qe-dependency-mapper.md +277 -0
- package/assets/agents/v3/v3-qe-deployment-advisor.md +275 -0
- package/assets/agents/v3/v3-qe-flaky-hunter.md +248 -0
- package/assets/agents/v3/v3-qe-fleet-commander.md +293 -0
- package/assets/agents/v3/v3-qe-gap-detector.md +260 -0
- package/assets/agents/v3/v3-qe-graphql-tester.md +308 -0
- package/assets/agents/v3/v3-qe-impact-analyzer.md +299 -0
- package/assets/agents/v3/v3-qe-integration-tester.md +238 -0
- package/assets/agents/v3/v3-qe-kg-builder.md +273 -0
- package/assets/agents/v3/v3-qe-learning-coordinator.md +226 -0
- package/assets/agents/v3/v3-qe-load-tester.md +280 -0
- package/assets/agents/v3/v3-qe-metrics-optimizer.md +300 -0
- package/assets/agents/v3/v3-qe-mutation-tester.md +301 -0
- package/assets/agents/v3/v3-qe-parallel-executor.md +240 -0
- package/assets/agents/v3/v3-qe-pattern-learner.md +271 -0
- package/assets/agents/v3/v3-qe-performance-tester.md +262 -0
- package/assets/agents/v3/v3-qe-property-tester.md +247 -0
- package/assets/agents/v3/v3-qe-quality-gate.md +218 -0
- package/assets/agents/v3/v3-qe-queen-coordinator.md +214 -0
- package/assets/agents/v3/v3-qe-qx-partner.md +313 -0
- package/assets/agents/v3/v3-qe-regression-analyzer.md +322 -0
- package/assets/agents/v3/v3-qe-requirements-validator.md +360 -0
- package/assets/agents/v3/v3-qe-responsive-tester.md +311 -0
- package/assets/agents/v3/v3-qe-retry-handler.md +256 -0
- package/assets/agents/v3/v3-qe-risk-assessor.md +273 -0
- package/assets/agents/v3/v3-qe-root-cause-analyzer.md +286 -0
- package/assets/agents/v3/v3-qe-security-auditor.md +299 -0
- package/assets/agents/v3/v3-qe-security-scanner.md +235 -0
- package/assets/agents/v3/v3-qe-tdd-specialist.md +239 -0
- package/assets/agents/v3/v3-qe-test-architect.md +233 -0
- package/assets/agents/v3/v3-qe-transfer-specialist.md +295 -0
- package/assets/agents/v3/v3-qe-visual-tester.md +232 -0
- package/assets/skills/accessibility-testing/SKILL.md +216 -0
- package/assets/skills/agentdb-advanced/SKILL.md +550 -0
- package/assets/skills/agentdb-learning/SKILL.md +545 -0
- package/assets/skills/agentdb-memory-patterns/SKILL.md +339 -0
- package/assets/skills/agentdb-optimization/SKILL.md +509 -0
- package/assets/skills/agentdb-vector-search/SKILL.md +339 -0
- package/assets/skills/agentic-jujutsu/SKILL.md +645 -0
- package/assets/skills/agentic-quality-engineering/SKILL.md +335 -0
- package/assets/skills/api-testing-patterns/SKILL.md +294 -0
- package/assets/skills/aqe-v2-v3-migration/skill.md +322 -0
- package/assets/skills/brutal-honesty-review/README.md +218 -0
- package/assets/skills/brutal-honesty-review/SKILL.md +235 -0
- package/assets/skills/brutal-honesty-review/resources/assessment-rubrics.md +295 -0
- package/assets/skills/brutal-honesty-review/resources/review-template.md +102 -0
- package/assets/skills/brutal-honesty-review/scripts/assess-code.sh +179 -0
- package/assets/skills/brutal-honesty-review/scripts/assess-tests.sh +223 -0
- package/assets/skills/bug-reporting-excellence/SKILL.md +225 -0
- package/assets/skills/chaos-engineering-resilience/SKILL.md +158 -0
- package/assets/skills/cicd-pipeline-qe-orchestrator/README.md +304 -0
- package/assets/skills/cicd-pipeline-qe-orchestrator/SKILL.md +315 -0
- package/assets/skills/cicd-pipeline-qe-orchestrator/resources/workflows/microservice-pipeline.md +239 -0
- package/assets/skills/cicd-pipeline-qe-orchestrator/resources/workflows/mobile-pipeline.md +375 -0
- package/assets/skills/cicd-pipeline-qe-orchestrator/resources/workflows/monolith-pipeline.md +268 -0
- package/assets/skills/code-review-quality/SKILL.md +227 -0
- package/assets/skills/compatibility-testing/SKILL.md +205 -0
- package/assets/skills/compliance-testing/SKILL.md +225 -0
- package/assets/skills/consultancy-practices/SKILL.md +202 -0
- package/assets/skills/context-driven-testing/SKILL.md +196 -0
- package/assets/skills/contract-testing/SKILL.md +222 -0
- package/assets/skills/database-testing/SKILL.md +244 -0
- package/assets/skills/exploratory-testing-advanced/SKILL.md +201 -0
- package/assets/skills/flow-nexus-neural/SKILL.md +738 -0
- package/assets/skills/flow-nexus-platform/SKILL.md +1157 -0
- package/assets/skills/flow-nexus-swarm/SKILL.md +610 -0
- package/assets/skills/github-code-review/SKILL.md +1140 -0
- package/assets/skills/github-multi-repo/SKILL.md +874 -0
- package/assets/skills/github-project-management/SKILL.md +1277 -0
- package/assets/skills/github-release-management/SKILL.md +1081 -0
- package/assets/skills/github-workflow-automation/SKILL.md +1065 -0
- package/assets/skills/hive-mind-advanced/SKILL.md +712 -0
- package/assets/skills/holistic-testing-pact/SKILL.md +171 -0
- package/assets/skills/hooks-automation/SKILL.md +1201 -0
- package/assets/skills/localization-testing/SKILL.md +221 -0
- package/assets/skills/mobile-testing/SKILL.md +219 -0
- package/assets/skills/mutation-testing/SKILL.md +229 -0
- package/assets/skills/n8n-expression-testing/SKILL.md +434 -0
- package/assets/skills/n8n-integration-testing-patterns/SKILL.md +540 -0
- package/assets/skills/n8n-security-testing/SKILL.md +599 -0
- package/assets/skills/n8n-trigger-testing-strategies/SKILL.md +541 -0
- package/assets/skills/n8n-workflow-testing-fundamentals/SKILL.md +447 -0
- package/assets/skills/pair-programming/SKILL.md +1202 -0
- package/assets/skills/performance-analysis/SKILL.md +563 -0
- package/assets/skills/performance-testing/SKILL.md +310 -0
- package/assets/skills/quality-metrics/SKILL.md +225 -0
- package/assets/skills/reasoningbank-agentdb/SKILL.md +446 -0
- package/assets/skills/reasoningbank-intelligence/SKILL.md +201 -0
- package/assets/skills/refactoring-patterns/SKILL.md +205 -0
- package/assets/skills/regression-testing/SKILL.md +227 -0
- package/assets/skills/risk-based-testing/SKILL.md +206 -0
- package/assets/skills/security-testing/SKILL.md +306 -0
- package/assets/skills/sherlock-review/SKILL.md +250 -0
- package/assets/skills/shift-left-testing/SKILL.md +225 -0
- package/assets/skills/shift-right-testing/SKILL.md +227 -0
- package/assets/skills/six-thinking-hats/README.md +190 -0
- package/assets/skills/six-thinking-hats/SKILL.md +280 -0
- package/assets/skills/six-thinking-hats/resources/examples/api-testing-example.md +345 -0
- package/assets/skills/six-thinking-hats/resources/templates/solo-session-template.md +167 -0
- package/assets/skills/six-thinking-hats/resources/templates/team-session-template.md +336 -0
- package/assets/skills/skill-builder/SKILL.md +910 -0
- package/assets/skills/sparc-methodology/SKILL.md +1115 -0
- package/assets/skills/stream-chain/SKILL.md +563 -0
- package/assets/skills/swarm-advanced/SKILL.md +973 -0
- package/assets/skills/swarm-orchestration/SKILL.md +179 -0
- package/assets/skills/tdd-london-chicago/SKILL.md +244 -0
- package/assets/skills/technical-writing/SKILL.md +178 -0
- package/assets/skills/test-automation-strategy/SKILL.md +230 -0
- package/assets/skills/test-data-management/SKILL.md +270 -0
- package/assets/skills/test-design-techniques/SKILL.md +244 -0
- package/assets/skills/test-environment-management/SKILL.md +243 -0
- package/assets/skills/test-reporting-analytics/SKILL.md +214 -0
- package/assets/skills/testability-scoring/README.md +71 -0
- package/assets/skills/testability-scoring/SKILL.md +346 -0
- package/assets/skills/testability-scoring/resources/templates/config.template.js +84 -0
- package/assets/skills/testability-scoring/resources/templates/testability-scoring.spec.template.js +532 -0
- package/assets/skills/testability-scoring/scripts/generate-html-report.js +1007 -0
- package/assets/skills/testability-scoring/scripts/run-assessment.sh +70 -0
- package/assets/skills/v3-qe-chaos-resilience/SKILL.md +238 -0
- package/assets/skills/v3-qe-code-intelligence/SKILL.md +209 -0
- package/assets/skills/v3-qe-contract-testing/SKILL.md +218 -0
- package/assets/skills/v3-qe-coverage-analysis/SKILL.md +187 -0
- package/assets/skills/v3-qe-defect-intelligence/SKILL.md +205 -0
- package/assets/skills/v3-qe-learning-optimization/SKILL.md +238 -0
- package/assets/skills/v3-qe-quality-assessment/SKILL.md +213 -0
- package/assets/skills/v3-qe-requirements-validation/SKILL.md +248 -0
- package/assets/skills/v3-qe-test-execution/SKILL.md +182 -0
- package/assets/skills/v3-qe-test-generation/SKILL.md +141 -0
- package/assets/skills/v3-qe-visual-accessibility/SKILL.md +242 -0
- package/assets/skills/verification-quality/SKILL.md +649 -0
- package/assets/skills/visual-testing-advanced/SKILL.md +219 -0
- package/assets/skills/xp-practices/SKILL.md +229 -0
- package/dist/cli/bundle.js +8 -8
- package/dist/init/agents-installer.js +4 -4
- package/dist/init/agents-installer.js.map +1 -1
- package/dist/init/skills-installer.js +4 -4
- package/dist/init/skills-installer.js.map +1 -1
- package/package.json +7 -1
- package/docs/analysis/V3-INIT-REQUIREMENTS-ANALYSIS.md +0 -352
- package/implementation/README.md +0 -90
- package/implementation/adrs/ADR-030-coherence-gated-quality-gates.md +0 -312
- package/implementation/adrs/ADR-031-strange-loop-self-awareness.md +0 -484
- package/implementation/adrs/ADR-032-time-crystal-scheduling.md +0 -530
- package/implementation/adrs/ADR-033-early-exit-testing.md +0 -634
- package/implementation/adrs/ADR-034-neural-topology-optimizer.md +0 -589
- package/implementation/adrs/ADR-035-causal-discovery.md +0 -610
- package/implementation/adrs/ADR-036-result-persistence.md +0 -326
- package/implementation/adrs/ADR-037-v3-qe-agent-naming.md +0 -105
- package/implementation/adrs/ADR-038-v3-qe-memory-unification.md +0 -154
- package/implementation/adrs/ADR-039-v3-qe-mcp-optimization.md +0 -179
- package/implementation/adrs/ADR-040-v3-qe-agentic-flow-integration.md +0 -240
- package/implementation/adrs/ADR-041-v3-qe-cli-enhancement.md +0 -296
- package/implementation/adrs/ADR-042-v3-qe-token-tracking-integration.md +0 -517
- package/implementation/adrs/v3-adrs.md +0 -2783
- package/implementation/planning/AQE-V3-MASTER-PLAN.md +0 -815
- package/security-scan-report-2026-01-11.md +0 -410
- package/security-verification-report-2026-01-11.md +0 -278
- package/src/benchmarks/performance-benchmarks.ts +0 -646
- package/src/benchmarks/run-benchmarks.ts +0 -324
- package/src/causal-discovery/causal-graph.ts +0 -450
- package/src/causal-discovery/discovery-engine.ts +0 -438
- package/src/causal-discovery/index.ts +0 -117
- package/src/causal-discovery/types.ts +0 -456
- package/src/causal-discovery/weight-matrix.ts +0 -453
- package/src/cli/commands/qe-tools.ts +0 -634
- package/src/cli/index.ts +0 -1976
- package/src/compatibility/agent-mapper.ts +0 -291
- package/src/compatibility/cli-adapter.ts +0 -277
- package/src/compatibility/config-migrator.ts +0 -334
- package/src/compatibility/index.ts +0 -112
- package/src/compatibility/mcp-adapter.ts +0 -248
- package/src/compatibility/types.ts +0 -156
- package/src/coordination/claims/claim-repository.ts +0 -636
- package/src/coordination/claims/claim-service.ts +0 -675
- package/src/coordination/claims/handoff-manager.ts +0 -535
- package/src/coordination/claims/index.ts +0 -276
- package/src/coordination/claims/interfaces.ts +0 -687
- package/src/coordination/claims/work-stealing.ts +0 -436
- package/src/coordination/cross-domain-router.ts +0 -492
- package/src/coordination/index.ts +0 -127
- package/src/coordination/interfaces.ts +0 -691
- package/src/coordination/protocol-executor.ts +0 -760
- package/src/coordination/protocols/code-intelligence-index.ts +0 -855
- package/src/coordination/protocols/defect-investigation.ts +0 -1184
- package/src/coordination/protocols/index.ts +0 -11
- package/src/coordination/protocols/learning-consolidation.ts +0 -1181
- package/src/coordination/protocols/morning-sync.ts +0 -1055
- package/src/coordination/protocols/quality-gate.ts +0 -1566
- package/src/coordination/protocols/security-audit.ts +0 -1587
- package/src/coordination/queen-coordinator.ts +0 -1176
- package/src/coordination/result-saver.ts +0 -780
- package/src/coordination/task-executor.ts +0 -1146
- package/src/coordination/workflow-orchestrator.ts +0 -1917
- package/src/domains/chaos-resilience/coordinator.ts +0 -1032
- package/src/domains/chaos-resilience/index.ts +0 -143
- package/src/domains/chaos-resilience/interfaces.ts +0 -659
- package/src/domains/chaos-resilience/plugin.ts +0 -691
- package/src/domains/chaos-resilience/services/chaos-engineer.ts +0 -1097
- package/src/domains/chaos-resilience/services/index.ts +0 -19
- package/src/domains/chaos-resilience/services/load-tester.ts +0 -799
- package/src/domains/chaos-resilience/services/performance-profiler.ts +0 -792
- package/src/domains/code-intelligence/coordinator.ts +0 -631
- package/src/domains/code-intelligence/index.ts +0 -86
- package/src/domains/code-intelligence/interfaces.ts +0 -162
- package/src/domains/code-intelligence/plugin.ts +0 -451
- package/src/domains/code-intelligence/services/impact-analyzer.ts +0 -567
- package/src/domains/code-intelligence/services/index.ts +0 -26
- package/src/domains/code-intelligence/services/knowledge-graph.ts +0 -1067
- package/src/domains/code-intelligence/services/semantic-analyzer.ts +0 -901
- package/src/domains/contract-testing/coordinator.ts +0 -1038
- package/src/domains/contract-testing/index.ts +0 -122
- package/src/domains/contract-testing/interfaces.ts +0 -458
- package/src/domains/contract-testing/plugin.ts +0 -746
- package/src/domains/contract-testing/services/api-compatibility.ts +0 -748
- package/src/domains/contract-testing/services/contract-validator.ts +0 -1700
- package/src/domains/contract-testing/services/index.ts +0 -19
- package/src/domains/contract-testing/services/schema-validator.ts +0 -1102
- package/src/domains/coverage-analysis/coordinator.ts +0 -485
- package/src/domains/coverage-analysis/index.ts +0 -114
- package/src/domains/coverage-analysis/interfaces.ts +0 -142
- package/src/domains/coverage-analysis/plugin.ts +0 -172
- package/src/domains/coverage-analysis/services/coverage-analyzer.ts +0 -449
- package/src/domains/coverage-analysis/services/coverage-embedder.ts +0 -733
- package/src/domains/coverage-analysis/services/coverage-parser.ts +0 -753
- package/src/domains/coverage-analysis/services/gap-detector.ts +0 -592
- package/src/domains/coverage-analysis/services/hnsw-index.ts +0 -728
- package/src/domains/coverage-analysis/services/index.ts +0 -61
- package/src/domains/coverage-analysis/services/risk-scorer.ts +0 -540
- package/src/domains/coverage-analysis/services/sublinear-analyzer.ts +0 -747
- package/src/domains/defect-intelligence/coordinator.ts +0 -635
- package/src/domains/defect-intelligence/index.ts +0 -83
- package/src/domains/defect-intelligence/interfaces.ts +0 -152
- package/src/domains/defect-intelligence/plugin.ts +0 -483
- package/src/domains/defect-intelligence/services/causal-root-cause-analyzer.ts +0 -494
- package/src/domains/defect-intelligence/services/defect-predictor.ts +0 -852
- package/src/domains/defect-intelligence/services/index.ts +0 -37
- package/src/domains/defect-intelligence/services/pattern-learner.ts +0 -738
- package/src/domains/defect-intelligence/services/root-cause-analyzer.ts +0 -637
- package/src/domains/domain-interface.ts +0 -77
- package/src/domains/index.ts +0 -23
- package/src/domains/learning-optimization/coordinator.ts +0 -1215
- package/src/domains/learning-optimization/index.ts +0 -127
- package/src/domains/learning-optimization/interfaces.ts +0 -570
- package/src/domains/learning-optimization/plugin.ts +0 -851
- package/src/domains/learning-optimization/services/index.ts +0 -29
- package/src/domains/learning-optimization/services/learning-coordinator.ts +0 -972
- package/src/domains/learning-optimization/services/metrics-optimizer.ts +0 -915
- package/src/domains/learning-optimization/services/production-intel.ts +0 -971
- package/src/domains/learning-optimization/services/transfer-specialist.ts +0 -723
- package/src/domains/quality-assessment/coherence/gate-controller.ts +0 -549
- package/src/domains/quality-assessment/coherence/index.ts +0 -211
- package/src/domains/quality-assessment/coherence/lambda-calculator.ts +0 -384
- package/src/domains/quality-assessment/coherence/partition-detector.ts +0 -469
- package/src/domains/quality-assessment/coherence/types.ts +0 -384
- package/src/domains/quality-assessment/coordinator.ts +0 -605
- package/src/domains/quality-assessment/index.ts +0 -97
- package/src/domains/quality-assessment/interfaces.ts +0 -152
- package/src/domains/quality-assessment/plugin.ts +0 -496
- package/src/domains/quality-assessment/services/coherence-gate.ts +0 -358
- package/src/domains/quality-assessment/services/deployment-advisor.ts +0 -571
- package/src/domains/quality-assessment/services/index.ts +0 -34
- package/src/domains/quality-assessment/services/quality-analyzer.ts +0 -670
- package/src/domains/quality-assessment/services/quality-gate.ts +0 -384
- package/src/domains/requirements-validation/coordinator.ts +0 -812
- package/src/domains/requirements-validation/index.ts +0 -92
- package/src/domains/requirements-validation/interfaces.ts +0 -303
- package/src/domains/requirements-validation/plugin.ts +0 -576
- package/src/domains/requirements-validation/services/bdd-scenario-writer.ts +0 -676
- package/src/domains/requirements-validation/services/index.ts +0 -20
- package/src/domains/requirements-validation/services/requirements-validator.ts +0 -559
- package/src/domains/requirements-validation/services/testability-scorer.ts +0 -639
- package/src/domains/security-compliance/coordinator.ts +0 -757
- package/src/domains/security-compliance/index.ts +0 -120
- package/src/domains/security-compliance/interfaces.ts +0 -434
- package/src/domains/security-compliance/plugin.ts +0 -509
- package/src/domains/security-compliance/services/compliance-validator.ts +0 -1226
- package/src/domains/security-compliance/services/index.ts +0 -31
- package/src/domains/security-compliance/services/security-auditor.ts +0 -2227
- package/src/domains/security-compliance/services/security-scanner.ts +0 -2354
- package/src/domains/security-compliance/services/semgrep-integration.ts +0 -289
- package/src/domains/test-execution/coordinator.ts +0 -426
- package/src/domains/test-execution/index.ts +0 -76
- package/src/domains/test-execution/interfaces.ts +0 -119
- package/src/domains/test-execution/plugin.ts +0 -208
- package/src/domains/test-execution/services/flaky-detector.ts +0 -1240
- package/src/domains/test-execution/services/index.ts +0 -8
- package/src/domains/test-execution/services/retry-handler.ts +0 -820
- package/src/domains/test-execution/services/test-executor.ts +0 -885
- package/src/domains/test-generation/coordinator.ts +0 -656
- package/src/domains/test-generation/index.ts +0 -77
- package/src/domains/test-generation/interfaces.ts +0 -118
- package/src/domains/test-generation/plugin.ts +0 -397
- package/src/domains/test-generation/services/index.ts +0 -23
- package/src/domains/test-generation/services/pattern-matcher.ts +0 -1725
- package/src/domains/test-generation/services/test-generator.ts +0 -2750
- package/src/domains/visual-accessibility/coordinator.ts +0 -860
- package/src/domains/visual-accessibility/index.ts +0 -116
- package/src/domains/visual-accessibility/interfaces.ts +0 -435
- package/src/domains/visual-accessibility/plugin.ts +0 -568
- package/src/domains/visual-accessibility/services/accessibility-tester.ts +0 -982
- package/src/domains/visual-accessibility/services/axe-core-audit.ts +0 -630
- package/src/domains/visual-accessibility/services/index.ts +0 -28
- package/src/domains/visual-accessibility/services/responsive-tester.ts +0 -934
- package/src/domains/visual-accessibility/services/visual-tester.ts +0 -458
- package/src/early-exit/early-exit-controller.ts +0 -490
- package/src/early-exit/early-exit-decision.ts +0 -391
- package/src/early-exit/index.ts +0 -115
- package/src/early-exit/quality-signal.ts +0 -389
- package/src/early-exit/speculative-executor.ts +0 -505
- package/src/early-exit/types.ts +0 -407
- package/src/feedback/coverage-learner.ts +0 -456
- package/src/feedback/feedback-loop.ts +0 -426
- package/src/feedback/index.ts +0 -72
- package/src/feedback/pattern-promotion.ts +0 -373
- package/src/feedback/quality-score-calculator.ts +0 -334
- package/src/feedback/test-outcome-tracker.ts +0 -450
- package/src/feedback/types.ts +0 -497
- package/src/index.ts +0 -224
- package/src/init/agents-installer.ts +0 -536
- package/src/init/index.ts +0 -80
- package/src/init/init-wizard.ts +0 -1061
- package/src/init/project-analyzer.ts +0 -696
- package/src/init/self-configurator.ts +0 -488
- package/src/init/skills-installer.ts +0 -467
- package/src/init/types.ts +0 -432
- package/src/integrations/ruvector/ast-complexity.ts +0 -470
- package/src/integrations/ruvector/coverage-router.ts +0 -594
- package/src/integrations/ruvector/diff-risk-classifier.ts +0 -759
- package/src/integrations/ruvector/fallback.ts +0 -942
- package/src/integrations/ruvector/graph-boundaries.ts +0 -809
- package/src/integrations/ruvector/index.ts +0 -363
- package/src/integrations/ruvector/interfaces.ts +0 -609
- package/src/integrations/ruvector/q-learning-router.ts +0 -550
- package/src/kernel/agent-coordinator.ts +0 -165
- package/src/kernel/agentdb-backend.ts +0 -504
- package/src/kernel/event-bus.ts +0 -129
- package/src/kernel/hybrid-backend.ts +0 -538
- package/src/kernel/index.ts +0 -28
- package/src/kernel/interfaces.ts +0 -257
- package/src/kernel/kernel.ts +0 -285
- package/src/kernel/memory-backend.ts +0 -169
- package/src/kernel/memory-factory.ts +0 -293
- package/src/kernel/plugin-loader.ts +0 -179
- package/src/learning/index.ts +0 -219
- package/src/learning/pattern-store.ts +0 -990
- package/src/learning/qe-guidance.ts +0 -832
- package/src/learning/qe-hooks.ts +0 -644
- package/src/learning/qe-patterns.ts +0 -449
- package/src/learning/qe-reasoning-bank.ts +0 -951
- package/src/learning/real-embeddings.ts +0 -277
- package/src/learning/real-qe-reasoning-bank.ts +0 -833
- package/src/learning/sqlite-persistence.ts +0 -554
- package/src/mcp/entry.ts +0 -59
- package/src/mcp/handlers/agent-handlers.ts +0 -285
- package/src/mcp/handlers/core-handlers.ts +0 -317
- package/src/mcp/handlers/domain-handlers.ts +0 -1444
- package/src/mcp/handlers/index.ts +0 -57
- package/src/mcp/handlers/memory-handlers.ts +0 -338
- package/src/mcp/handlers/task-handlers.ts +0 -363
- package/src/mcp/index.ts +0 -30
- package/src/mcp/metrics/index.ts +0 -14
- package/src/mcp/metrics/metrics-collector.ts +0 -503
- package/src/mcp/protocol-server.ts +0 -752
- package/src/mcp/security/cve-prevention.ts +0 -742
- package/src/mcp/security/index.ts +0 -356
- package/src/mcp/security/oauth21-provider.ts +0 -821
- package/src/mcp/security/rate-limiter.ts +0 -615
- package/src/mcp/security/sampling-server.ts +0 -662
- package/src/mcp/security/schema-validator.ts +0 -855
- package/src/mcp/server.ts +0 -657
- package/src/mcp/tool-registry.ts +0 -391
- package/src/mcp/tools/base.ts +0 -399
- package/src/mcp/tools/chaos-resilience/inject.ts +0 -699
- package/src/mcp/tools/code-intelligence/analyze.ts +0 -745
- package/src/mcp/tools/contract-testing/validate.ts +0 -708
- package/src/mcp/tools/coverage-analysis/index.ts +0 -770
- package/src/mcp/tools/defect-intelligence/predict.ts +0 -466
- package/src/mcp/tools/index.ts +0 -214
- package/src/mcp/tools/learning-optimization/optimize.ts +0 -772
- package/src/mcp/tools/quality-assessment/evaluate.ts +0 -385
- package/src/mcp/tools/registry.ts +0 -248
- package/src/mcp/tools/requirements-validation/validate.ts +0 -394
- package/src/mcp/tools/security-compliance/scan.ts +0 -365
- package/src/mcp/tools/test-execution/execute.ts +0 -291
- package/src/mcp/tools/test-generation/generate.ts +0 -544
- package/src/mcp/tools/visual-accessibility/index.ts +0 -791
- package/src/mcp/transport/index.ts +0 -31
- package/src/mcp/transport/stdio.ts +0 -318
- package/src/mcp/types.ts +0 -543
- package/src/neural-optimizer/index.ts +0 -111
- package/src/neural-optimizer/replay-buffer.ts +0 -455
- package/src/neural-optimizer/swarm-topology.ts +0 -508
- package/src/neural-optimizer/topology-optimizer.ts +0 -828
- package/src/neural-optimizer/types.ts +0 -481
- package/src/neural-optimizer/value-network.ts +0 -351
- package/src/optimization/auto-tuner.ts +0 -817
- package/src/optimization/index.ts +0 -77
- package/src/optimization/metric-collectors.ts +0 -474
- package/src/optimization/qe-workers.ts +0 -704
- package/src/optimization/tuning-algorithm.ts +0 -401
- package/src/optimization/types.ts +0 -314
- package/src/routing/index.ts +0 -51
- package/src/routing/qe-agent-registry.ts +0 -963
- package/src/routing/qe-task-router.ts +0 -564
- package/src/routing/routing-feedback.ts +0 -365
- package/src/routing/types.ts +0 -406
- package/src/shared/embeddings/embedding-cache.ts +0 -157
- package/src/shared/embeddings/index.ts +0 -50
- package/src/shared/embeddings/nomic-embedder.ts +0 -404
- package/src/shared/embeddings/ollama-client.ts +0 -195
- package/src/shared/embeddings/types.ts +0 -147
- package/src/shared/entities/agent.ts +0 -141
- package/src/shared/entities/base-entity.ts +0 -79
- package/src/shared/entities/index.ts +0 -6
- package/src/shared/events/domain-events.ts +0 -259
- package/src/shared/events/index.ts +0 -5
- package/src/shared/git/git-analyzer.ts +0 -656
- package/src/shared/git/index.ts +0 -11
- package/src/shared/http/http-client.ts +0 -420
- package/src/shared/http/index.ts +0 -13
- package/src/shared/index.ts +0 -41
- package/src/shared/io/file-reader.ts +0 -525
- package/src/shared/io/index.ts +0 -25
- package/src/shared/llm/cache.ts +0 -473
- package/src/shared/llm/circuit-breaker.ts +0 -369
- package/src/shared/llm/cost-tracker.ts +0 -460
- package/src/shared/llm/index.ts +0 -140
- package/src/shared/llm/interfaces.ts +0 -629
- package/src/shared/llm/provider-manager.ts +0 -685
- package/src/shared/llm/providers/claude.ts +0 -524
- package/src/shared/llm/providers/index.ts +0 -8
- package/src/shared/llm/providers/ollama.ts +0 -575
- package/src/shared/llm/providers/openai.ts +0 -609
- package/src/shared/metrics/code-metrics.ts +0 -520
- package/src/shared/metrics/index.ts +0 -23
- package/src/shared/metrics/system-metrics.ts +0 -353
- package/src/shared/parsers/index.ts +0 -6
- package/src/shared/parsers/typescript-parser.ts +0 -841
- package/src/shared/security/compliance-patterns.ts +0 -666
- package/src/shared/security/index.ts +0 -30
- package/src/shared/security/osv-client.ts +0 -468
- package/src/shared/types/index.ts +0 -150
- package/src/shared/value-objects/index.ts +0 -273
- package/src/strange-loop/healing-controller.ts +0 -833
- package/src/strange-loop/index.ts +0 -104
- package/src/strange-loop/self-model.ts +0 -494
- package/src/strange-loop/strange-loop.ts +0 -446
- package/src/strange-loop/swarm-observer.ts +0 -448
- package/src/strange-loop/topology-analyzer.ts +0 -565
- package/src/strange-loop/types.ts +0 -640
- package/src/time-crystal/default-phases.ts +0 -520
- package/src/time-crystal/index.ts +0 -164
- package/src/time-crystal/oscillator.ts +0 -425
- package/src/time-crystal/phase-executor.ts +0 -521
- package/src/time-crystal/scheduler.ts +0 -1025
- package/src/time-crystal/test-runner.ts +0 -787
- package/src/time-crystal/types.ts +0 -421
- package/src/workers/base-worker.ts +0 -304
- package/src/workers/daemon.ts +0 -264
- package/src/workers/index.ts +0 -119
- package/src/workers/interfaces.ts +0 -393
- package/src/workers/worker-manager.ts +0 -424
- package/src/workers/workers/compliance-checker.ts +0 -445
- package/src/workers/workers/coverage-tracker.ts +0 -344
- package/src/workers/workers/defect-predictor.ts +0 -375
- package/src/workers/workers/flaky-detector.ts +0 -390
- package/src/workers/workers/index.ts +0 -17
- package/src/workers/workers/learning-consolidation.ts +0 -442
- package/src/workers/workers/performance-baseline.ts +0 -434
- package/src/workers/workers/quality-gate.ts +0 -419
- package/src/workers/workers/regression-monitor.ts +0 -357
- package/src/workers/workers/security-scan.ts +0 -349
- package/src/workers/workers/test-health.ts +0 -359
- package/tests/integration/code-intelligence/knowledge-graph-real.test.ts +0 -540
- package/tests/integration/coordination/cross-domain-router.test.ts +0 -403
- package/tests/integration/coordination/protocol-executor.test.ts +0 -454
- package/tests/integration/coordination/workflow-orchestrator.test.ts +0 -418
- package/tests/integration/feedback/feedback-loop-integration.test.ts +0 -560
- package/tests/integration/migration/v2-to-v3-migration.test.ts +0 -471
- package/tests/integration/parsers/typescript-parser.test.ts +0 -463
- package/tests/integration/security/vulnerability-detection.test.ts +0 -628
- package/tests/integration/test-execution/coordinator.test.ts +0 -410
- package/tests/integration/test-generation/coordinator.test.ts +0 -361
- package/tests/mocks/index.ts +0 -228
- package/tests/time-crystal/default-phases.test.ts +0 -476
- package/tests/time-crystal/oscillator.test.ts +0 -541
- package/tests/time-crystal/phase-executor.test.ts +0 -653
- package/tests/time-crystal/scheduler.test.ts +0 -626
- package/tests/time-crystal/test-runner.test.ts +0 -594
- package/tests/unit/causal-discovery/causal-graph.test.ts +0 -504
- package/tests/unit/causal-discovery/causal-root-cause-analyzer.test.ts +0 -347
- package/tests/unit/causal-discovery/discovery-engine.test.ts +0 -435
- package/tests/unit/causal-discovery/weight-matrix.test.ts +0 -328
- package/tests/unit/cli/cli.test.ts +0 -341
- package/tests/unit/cli/commands.test.ts +0 -414
- package/tests/unit/cli/init-command.test.ts +0 -274
- package/tests/unit/cli/migrate-command.test.ts +0 -396
- package/tests/unit/coordination/claims/claim-service.test.ts +0 -949
- package/tests/unit/coordination/claims/handoff-manager.test.ts +0 -773
- package/tests/unit/coordination/claims/work-stealing.test.ts +0 -492
- package/tests/unit/coordination/queen-coordinator.test.ts +0 -966
- package/tests/unit/coordination/result-saver.test.ts +0 -653
- package/tests/unit/coordination/task-executor.test.ts +0 -810
- package/tests/unit/domains/chaos-resilience/chaos-engineer.test.ts +0 -484
- package/tests/unit/domains/chaos-resilience/load-tester.test.ts +0 -559
- package/tests/unit/domains/chaos-resilience/performance-profiler.test.ts +0 -490
- package/tests/unit/domains/code-intelligence/impact-analyzer.test.ts +0 -560
- package/tests/unit/domains/code-intelligence/knowledge-graph.test.ts +0 -460
- package/tests/unit/domains/code-intelligence/semantic-analyzer.test.ts +0 -584
- package/tests/unit/domains/contract-testing/api-compatibility.test.ts +0 -483
- package/tests/unit/domains/contract-testing/contract-validator.test.ts +0 -370
- package/tests/unit/domains/contract-testing/schema-validator.test.ts +0 -610
- package/tests/unit/domains/coverage-analysis/coverage-embedder.test.ts +0 -298
- package/tests/unit/domains/coverage-analysis/hnsw-index.test.ts +0 -292
- package/tests/unit/domains/coverage-analysis/sublinear-analyzer.test.ts +0 -506
- package/tests/unit/domains/defect-intelligence/defect-predictor.test.ts +0 -370
- package/tests/unit/domains/defect-intelligence/pattern-learner.test.ts +0 -546
- package/tests/unit/domains/defect-intelligence/root-cause-analyzer.test.ts +0 -534
- package/tests/unit/domains/learning-optimization/learning-coordinator.test.ts +0 -541
- package/tests/unit/domains/learning-optimization/metrics-optimizer.test.ts +0 -552
- package/tests/unit/domains/learning-optimization/production-intel.test.ts +0 -589
- package/tests/unit/domains/learning-optimization/transfer-specialist.test.ts +0 -453
- package/tests/unit/domains/quality-assessment/coherence-gate.test.ts +0 -1006
- package/tests/unit/domains/quality-assessment/deployment-advisor.test.ts +0 -515
- package/tests/unit/domains/quality-assessment/quality-analyzer.test.ts +0 -401
- package/tests/unit/domains/quality-assessment/quality-gate.test.ts +0 -324
- package/tests/unit/domains/requirements-validation/bdd-scenario-writer.test.ts +0 -479
- package/tests/unit/domains/requirements-validation/requirements-validator.test.ts +0 -452
- package/tests/unit/domains/requirements-validation/testability-scorer.test.ts +0 -505
- package/tests/unit/domains/security-compliance/compliance-validator.test.ts +0 -500
- package/tests/unit/domains/security-compliance/security-auditor.test.ts +0 -498
- package/tests/unit/domains/security-compliance/security-scanner.test.ts +0 -412
- package/tests/unit/domains/visual-accessibility/accessibility-tester.test.ts +0 -432
- package/tests/unit/domains/visual-accessibility/responsive-tester.test.ts +0 -506
- package/tests/unit/domains/visual-accessibility/visual-tester.test.ts +0 -412
- package/tests/unit/early-exit/early-exit-controller.test.ts +0 -548
- package/tests/unit/early-exit/early-exit-decision.test.ts +0 -617
- package/tests/unit/early-exit/index.test.ts +0 -254
- package/tests/unit/early-exit/quality-signal.test.ts +0 -589
- package/tests/unit/early-exit/speculative-executor.test.ts +0 -453
- package/tests/unit/feedback/coverage-learner.test.ts +0 -288
- package/tests/unit/feedback/feedback-loop.test.ts +0 -458
- package/tests/unit/feedback/pattern-promotion.test.ts +0 -390
- package/tests/unit/feedback/quality-score-calculator.test.ts +0 -364
- package/tests/unit/feedback/test-outcome-tracker.test.ts +0 -243
- package/tests/unit/init/init-wizard.test.ts +0 -881
- package/tests/unit/init/project-analyzer.test.ts +0 -807
- package/tests/unit/init/self-configurator.test.ts +0 -493
- package/tests/unit/integrations/ruvector/ast-complexity.test.ts +0 -240
- package/tests/unit/integrations/ruvector/coverage-router.test.ts +0 -366
- package/tests/unit/integrations/ruvector/diff-risk-classifier.test.ts +0 -340
- package/tests/unit/integrations/ruvector/graph-boundaries.test.ts +0 -355
- package/tests/unit/integrations/ruvector/q-learning-router.test.ts +0 -314
- package/tests/unit/kernel/agent-coordinator.test.ts +0 -220
- package/tests/unit/kernel/event-bus.test.ts +0 -197
- package/tests/unit/learning/qe-reasoning-bank.test.ts +0 -666
- package/tests/unit/learning/real-qe-reasoning-bank.benchmark.test.ts +0 -415
- package/tests/unit/mcp/mcp-server.test.ts +0 -544
- package/tests/unit/mcp/metrics/metrics-collector.test.ts +0 -340
- package/tests/unit/mcp/security/cve-prevention.test.ts +0 -512
- package/tests/unit/mcp/security/oauth21-provider.test.ts +0 -624
- package/tests/unit/mcp/security/rate-limiter.test.ts +0 -410
- package/tests/unit/mcp/security/sampling-server.test.ts +0 -420
- package/tests/unit/mcp/security/schema-validator.test.ts +0 -494
- package/tests/unit/mcp/tools/base.test.ts +0 -336
- package/tests/unit/mcp/tools/domain-tools.test.ts +0 -759
- package/tests/unit/mcp/tools/registry.test.ts +0 -240
- package/tests/unit/neural-optimizer/replay-buffer.test.ts +0 -403
- package/tests/unit/neural-optimizer/swarm-topology.test.ts +0 -473
- package/tests/unit/neural-optimizer/topology-optimizer.test.ts +0 -595
- package/tests/unit/neural-optimizer/value-network.test.ts +0 -343
- package/tests/unit/optimization/auto-tuner.test.ts +0 -506
- package/tests/unit/optimization/metric-collectors.test.ts +0 -352
- package/tests/unit/optimization/qe-workers.test.ts +0 -407
- package/tests/unit/optimization/tuning-algorithm.test.ts +0 -467
- package/tests/unit/routing/qe-agent-registry.test.ts +0 -229
- package/tests/unit/routing/qe-task-router.test.ts +0 -390
- package/tests/unit/routing/routing-feedback.test.ts +0 -339
- package/tests/unit/shared/embeddings/nomic-embedder.test.ts +0 -419
- package/tests/unit/shared/http/http-client.test.ts +0 -719
- package/tests/unit/shared/io/file-reader.test.ts +0 -511
- package/tests/unit/shared/llm/cache.test.ts +0 -391
- package/tests/unit/shared/llm/circuit-breaker.test.ts +0 -293
- package/tests/unit/shared/llm/cost-tracker.test.ts +0 -431
- package/tests/unit/shared/llm/provider-manager.test.ts +0 -550
- package/tests/unit/shared/llm/providers.test.ts +0 -532
- package/tests/unit/shared/parsers/typescript-parser.test.ts +0 -693
- package/tests/unit/shared/value-objects.test.ts +0 -184
- package/tests/unit/strange-loop/strange-loop.test.ts +0 -1170
- package/tests/unit/workers/base-worker.test.ts +0 -341
- package/tests/unit/workers/daemon.test.ts +0 -291
- package/tests/unit/workers/worker-manager.test.ts +0 -284
- package/tsconfig.json +0 -32
- package/vitest.config.ts +0 -27
|
@@ -1,1038 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Agentic QE v3 - Contract Testing Coordinator
|
|
3
|
-
* Orchestrates the contract testing workflow across services
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import { v4 as uuidv4 } from 'uuid';
|
|
7
|
-
import { Result, ok, err, DomainEvent } from '../../shared/types/index.js';
|
|
8
|
-
import { FilePath, Version } from '../../shared/value-objects/index.js';
|
|
9
|
-
import { HttpClient, createHttpClient } from '../../shared/http/index.js';
|
|
10
|
-
import { FileReader } from '../../shared/io/index.js';
|
|
11
|
-
import type {
|
|
12
|
-
EventBus,
|
|
13
|
-
MemoryBackend,
|
|
14
|
-
AgentCoordinator,
|
|
15
|
-
AgentSpawnConfig,
|
|
16
|
-
} from '../../kernel/interfaces.js';
|
|
17
|
-
import { createEvent } from '../../shared/events/domain-events.js';
|
|
18
|
-
import type {
|
|
19
|
-
IContractTestingCoordinator,
|
|
20
|
-
ApiContract,
|
|
21
|
-
VerificationResult,
|
|
22
|
-
ProviderVerificationReport,
|
|
23
|
-
PreReleaseReport,
|
|
24
|
-
BreakingChange,
|
|
25
|
-
AffectedConsumer,
|
|
26
|
-
ContractEndpoint,
|
|
27
|
-
SchemaDefinition,
|
|
28
|
-
HttpMethod,
|
|
29
|
-
ContractType,
|
|
30
|
-
FailureType,
|
|
31
|
-
} from './interfaces.js';
|
|
32
|
-
import { ContractValidatorService } from './services/contract-validator.js';
|
|
33
|
-
import { ApiCompatibilityService } from './services/api-compatibility.js';
|
|
34
|
-
|
|
35
|
-
/**
|
|
36
|
-
* Contract Testing Events
|
|
37
|
-
*/
|
|
38
|
-
export const ContractTestingEvents = {
|
|
39
|
-
ContractVerified: 'contract-testing.ContractVerified',
|
|
40
|
-
BreakingChangeDetected: 'contract-testing.BreakingChangeDetected',
|
|
41
|
-
ContractPublished: 'contract-testing.ContractPublished',
|
|
42
|
-
ConsumerContractCreated: 'contract-testing.ConsumerContractCreated',
|
|
43
|
-
VerificationFailed: 'contract-testing.VerificationFailed',
|
|
44
|
-
} as const;
|
|
45
|
-
|
|
46
|
-
/**
|
|
47
|
-
* Workflow status tracking
|
|
48
|
-
*/
|
|
49
|
-
export interface WorkflowStatus {
|
|
50
|
-
id: string;
|
|
51
|
-
type: 'verify' | 'compare' | 'import' | 'export';
|
|
52
|
-
status: 'pending' | 'running' | 'completed' | 'failed';
|
|
53
|
-
startedAt: Date;
|
|
54
|
-
completedAt?: Date;
|
|
55
|
-
agentIds: string[];
|
|
56
|
-
progress: number;
|
|
57
|
-
error?: string;
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
/**
|
|
61
|
-
* Coordinator configuration
|
|
62
|
-
*/
|
|
63
|
-
export interface CoordinatorConfig {
|
|
64
|
-
maxConcurrentWorkflows: number;
|
|
65
|
-
defaultTimeout: number;
|
|
66
|
-
enableAutoVerification: boolean;
|
|
67
|
-
publishEvents: boolean;
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
const DEFAULT_CONFIG: CoordinatorConfig = {
|
|
71
|
-
maxConcurrentWorkflows: 5,
|
|
72
|
-
defaultTimeout: 60000, // 60 seconds
|
|
73
|
-
enableAutoVerification: true,
|
|
74
|
-
publishEvents: true,
|
|
75
|
-
};
|
|
76
|
-
|
|
77
|
-
/**
|
|
78
|
-
* Contract Testing Coordinator
|
|
79
|
-
* Orchestrates contract testing workflows and coordinates with agents
|
|
80
|
-
*/
|
|
81
|
-
export class ContractTestingCoordinator implements IContractTestingCoordinator {
|
|
82
|
-
private readonly config: CoordinatorConfig;
|
|
83
|
-
private readonly contractValidator: ContractValidatorService;
|
|
84
|
-
private readonly apiCompatibility: ApiCompatibilityService;
|
|
85
|
-
private readonly httpClient: HttpClient;
|
|
86
|
-
private readonly fileReader: FileReader;
|
|
87
|
-
// SchemaValidatorService reserved for future use
|
|
88
|
-
private readonly workflows: Map<string, WorkflowStatus> = new Map();
|
|
89
|
-
private readonly contractStore: Map<string, ApiContract> = new Map();
|
|
90
|
-
private initialized = false;
|
|
91
|
-
|
|
92
|
-
constructor(
|
|
93
|
-
private readonly eventBus: EventBus,
|
|
94
|
-
private readonly memory: MemoryBackend,
|
|
95
|
-
private readonly agentCoordinator: AgentCoordinator,
|
|
96
|
-
config: Partial<CoordinatorConfig> = {}
|
|
97
|
-
) {
|
|
98
|
-
this.config = { ...DEFAULT_CONFIG, ...config };
|
|
99
|
-
this.contractValidator = new ContractValidatorService(memory);
|
|
100
|
-
this.apiCompatibility = new ApiCompatibilityService(memory);
|
|
101
|
-
this.httpClient = createHttpClient();
|
|
102
|
-
this.fileReader = new FileReader();
|
|
103
|
-
// Note: schemaValidator initialized when needed for schema operations
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
/**
|
|
107
|
-
* Initialize the coordinator
|
|
108
|
-
*/
|
|
109
|
-
async initialize(): Promise<void> {
|
|
110
|
-
if (this.initialized) return;
|
|
111
|
-
|
|
112
|
-
// Subscribe to relevant events
|
|
113
|
-
this.subscribeToEvents();
|
|
114
|
-
|
|
115
|
-
// Load any persisted contracts
|
|
116
|
-
await this.loadContracts();
|
|
117
|
-
|
|
118
|
-
this.initialized = true;
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
/**
|
|
122
|
-
* Dispose and cleanup
|
|
123
|
-
*/
|
|
124
|
-
async dispose(): Promise<void> {
|
|
125
|
-
// Save workflow state
|
|
126
|
-
await this.saveContracts();
|
|
127
|
-
|
|
128
|
-
// Clear active workflows
|
|
129
|
-
this.workflows.clear();
|
|
130
|
-
this.contractStore.clear();
|
|
131
|
-
|
|
132
|
-
this.initialized = false;
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
/**
|
|
136
|
-
* Get active workflow statuses
|
|
137
|
-
*/
|
|
138
|
-
getActiveWorkflows(): WorkflowStatus[] {
|
|
139
|
-
return Array.from(this.workflows.values()).filter(
|
|
140
|
-
(w) => w.status === 'running' || w.status === 'pending'
|
|
141
|
-
);
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
// ============================================================================
|
|
145
|
-
// IContractTestingCoordinator Implementation
|
|
146
|
-
// ============================================================================
|
|
147
|
-
|
|
148
|
-
/**
|
|
149
|
-
* Register new contract
|
|
150
|
-
*/
|
|
151
|
-
async registerContract(contract: ApiContract): Promise<Result<string>> {
|
|
152
|
-
try {
|
|
153
|
-
// Validate the contract first
|
|
154
|
-
const validationResult = await this.contractValidator.validateContract(contract);
|
|
155
|
-
if (!validationResult.success) {
|
|
156
|
-
return validationResult;
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
if (!validationResult.value.isValid) {
|
|
160
|
-
const errors = validationResult.value.errors.map((e) => e.message).join('; ');
|
|
161
|
-
return err(new Error(`Contract validation failed: ${errors}`));
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
// Store the contract
|
|
165
|
-
this.contractStore.set(contract.id, contract);
|
|
166
|
-
|
|
167
|
-
// Persist to memory
|
|
168
|
-
await this.memory.set(`contract-testing:contract:${contract.id}`, contract, {
|
|
169
|
-
namespace: 'contract-testing',
|
|
170
|
-
persist: true,
|
|
171
|
-
});
|
|
172
|
-
|
|
173
|
-
// Publish event
|
|
174
|
-
if (this.config.publishEvents) {
|
|
175
|
-
await this.publishContractRegistered(contract);
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
return ok(contract.id);
|
|
179
|
-
} catch (error) {
|
|
180
|
-
return err(error instanceof Error ? error : new Error(String(error)));
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
/**
|
|
185
|
-
* Verify all consumer contracts for provider
|
|
186
|
-
*/
|
|
187
|
-
async verifyAllConsumers(
|
|
188
|
-
providerName: string,
|
|
189
|
-
providerUrl: string
|
|
190
|
-
): Promise<Result<ProviderVerificationReport>> {
|
|
191
|
-
const workflowId = uuidv4();
|
|
192
|
-
|
|
193
|
-
try {
|
|
194
|
-
this.startWorkflow(workflowId, 'verify');
|
|
195
|
-
|
|
196
|
-
// Find all contracts for this provider
|
|
197
|
-
const contracts = await this.findContractsByProvider(providerName);
|
|
198
|
-
if (contracts.length === 0) {
|
|
199
|
-
this.completeWorkflow(workflowId);
|
|
200
|
-
return ok({
|
|
201
|
-
provider: providerName,
|
|
202
|
-
totalConsumers: 0,
|
|
203
|
-
passedConsumers: 0,
|
|
204
|
-
failedConsumers: [],
|
|
205
|
-
results: [],
|
|
206
|
-
canDeploy: true,
|
|
207
|
-
});
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
// Spawn verification agent
|
|
211
|
-
const agentResult = await this.spawnVerificationAgent(workflowId, providerName);
|
|
212
|
-
if (!agentResult.success) {
|
|
213
|
-
this.failWorkflow(workflowId, agentResult.error.message);
|
|
214
|
-
return agentResult;
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
this.addAgentToWorkflow(workflowId, agentResult.value);
|
|
218
|
-
|
|
219
|
-
const results: VerificationResult[] = [];
|
|
220
|
-
const failedConsumers: string[] = [];
|
|
221
|
-
|
|
222
|
-
// Verify each contract
|
|
223
|
-
for (const contract of contracts) {
|
|
224
|
-
for (const consumer of contract.consumers) {
|
|
225
|
-
const result = await this.verifyConsumerContract(contract, consumer.name, providerUrl);
|
|
226
|
-
results.push(result);
|
|
227
|
-
|
|
228
|
-
if (!result.passed) {
|
|
229
|
-
failedConsumers.push(consumer.name);
|
|
230
|
-
|
|
231
|
-
// Publish failure event
|
|
232
|
-
if (this.config.publishEvents) {
|
|
233
|
-
await this.publishVerificationFailed(contract, consumer.name, result);
|
|
234
|
-
}
|
|
235
|
-
} else {
|
|
236
|
-
// Publish success event
|
|
237
|
-
if (this.config.publishEvents) {
|
|
238
|
-
await this.publishContractVerified(contract, consumer.name, result);
|
|
239
|
-
}
|
|
240
|
-
}
|
|
241
|
-
}
|
|
242
|
-
|
|
243
|
-
this.updateWorkflowProgress(workflowId, (results.length / contracts.length) * 100);
|
|
244
|
-
}
|
|
245
|
-
|
|
246
|
-
// Stop the agent
|
|
247
|
-
await this.agentCoordinator.stop(agentResult.value);
|
|
248
|
-
|
|
249
|
-
this.completeWorkflow(workflowId);
|
|
250
|
-
|
|
251
|
-
const uniqueFailedConsumers = Array.from(new Set(failedConsumers));
|
|
252
|
-
const passedConsumers = contracts.flatMap((c) => c.consumers.map((cs) => cs.name))
|
|
253
|
-
.filter((c) => !uniqueFailedConsumers.includes(c)).length;
|
|
254
|
-
|
|
255
|
-
return ok({
|
|
256
|
-
provider: providerName,
|
|
257
|
-
totalConsumers: contracts.reduce((sum, c) => sum + c.consumers.length, 0),
|
|
258
|
-
passedConsumers,
|
|
259
|
-
failedConsumers: uniqueFailedConsumers,
|
|
260
|
-
results,
|
|
261
|
-
canDeploy: uniqueFailedConsumers.length === 0,
|
|
262
|
-
});
|
|
263
|
-
} catch (error) {
|
|
264
|
-
this.failWorkflow(workflowId, String(error));
|
|
265
|
-
return err(error instanceof Error ? error : new Error(String(error)));
|
|
266
|
-
}
|
|
267
|
-
}
|
|
268
|
-
|
|
269
|
-
/**
|
|
270
|
-
* Check for breaking changes before release
|
|
271
|
-
*/
|
|
272
|
-
async preReleaseCheck(
|
|
273
|
-
providerName: string,
|
|
274
|
-
newContractPath: FilePath
|
|
275
|
-
): Promise<Result<PreReleaseReport>> {
|
|
276
|
-
const workflowId = uuidv4();
|
|
277
|
-
|
|
278
|
-
try {
|
|
279
|
-
this.startWorkflow(workflowId, 'compare');
|
|
280
|
-
|
|
281
|
-
// Load new contract from path using FileReader
|
|
282
|
-
const newContract = await this.loadContractFromPath(newContractPath);
|
|
283
|
-
if (!newContract) {
|
|
284
|
-
this.failWorkflow(workflowId, 'Failed to load contract from path');
|
|
285
|
-
return err(new Error('Failed to load contract from path'));
|
|
286
|
-
}
|
|
287
|
-
|
|
288
|
-
// Find current contract
|
|
289
|
-
const currentContracts = await this.findContractsByProvider(providerName);
|
|
290
|
-
const currentContract = currentContracts.length > 0 ? currentContracts[0] : null;
|
|
291
|
-
|
|
292
|
-
if (!currentContract) {
|
|
293
|
-
// No existing contract - all changes are non-breaking
|
|
294
|
-
this.completeWorkflow(workflowId);
|
|
295
|
-
return ok({
|
|
296
|
-
breakingChanges: [],
|
|
297
|
-
affectedConsumers: [],
|
|
298
|
-
canRelease: true,
|
|
299
|
-
recommendations: ['No existing contract found. This will be the first version.'],
|
|
300
|
-
});
|
|
301
|
-
}
|
|
302
|
-
|
|
303
|
-
// Compare contracts
|
|
304
|
-
const comparisonResult = await this.apiCompatibility.compareVersions(
|
|
305
|
-
currentContract,
|
|
306
|
-
newContract
|
|
307
|
-
);
|
|
308
|
-
|
|
309
|
-
if (!comparisonResult.success) {
|
|
310
|
-
this.failWorkflow(workflowId, comparisonResult.error.message);
|
|
311
|
-
return comparisonResult;
|
|
312
|
-
}
|
|
313
|
-
|
|
314
|
-
const { breakingChanges, deprecations } = comparisonResult.value;
|
|
315
|
-
|
|
316
|
-
// Determine affected consumers
|
|
317
|
-
const affectedConsumers: AffectedConsumer[] = [];
|
|
318
|
-
for (const consumer of currentContract.consumers) {
|
|
319
|
-
const consumerBreakingChanges = breakingChanges.filter((bc) =>
|
|
320
|
-
bc.affectedConsumers.includes(consumer.name)
|
|
321
|
-
);
|
|
322
|
-
|
|
323
|
-
if (consumerBreakingChanges.length > 0) {
|
|
324
|
-
affectedConsumers.push({
|
|
325
|
-
name: consumer.name,
|
|
326
|
-
team: consumer.team,
|
|
327
|
-
breakingChanges: consumerBreakingChanges,
|
|
328
|
-
notified: false,
|
|
329
|
-
});
|
|
330
|
-
}
|
|
331
|
-
}
|
|
332
|
-
|
|
333
|
-
// Generate recommendations
|
|
334
|
-
const recommendations: string[] = [];
|
|
335
|
-
if (breakingChanges.length > 0) {
|
|
336
|
-
recommendations.push(`${breakingChanges.length} breaking changes detected. Coordinate with affected consumers before release.`);
|
|
337
|
-
|
|
338
|
-
// Generate migration guide
|
|
339
|
-
const migrationResult = await this.apiCompatibility.generateMigrationGuide(breakingChanges);
|
|
340
|
-
if (migrationResult.success) {
|
|
341
|
-
recommendations.push(`Migration effort estimated as: ${migrationResult.value.estimatedEffort}`);
|
|
342
|
-
}
|
|
343
|
-
}
|
|
344
|
-
|
|
345
|
-
if (deprecations.length > 0) {
|
|
346
|
-
recommendations.push(`${deprecations.length} deprecations detected. Consider communicating removal timeline.`);
|
|
347
|
-
}
|
|
348
|
-
|
|
349
|
-
if (breakingChanges.length === 0 && deprecations.length === 0) {
|
|
350
|
-
recommendations.push('No breaking changes detected. Safe to release.');
|
|
351
|
-
}
|
|
352
|
-
|
|
353
|
-
// Publish breaking change event if any
|
|
354
|
-
if (this.config.publishEvents && breakingChanges.length > 0) {
|
|
355
|
-
await this.publishBreakingChangeDetected(
|
|
356
|
-
newContract.id,
|
|
357
|
-
breakingChanges,
|
|
358
|
-
affectedConsumers.map((c) => c.name)
|
|
359
|
-
);
|
|
360
|
-
}
|
|
361
|
-
|
|
362
|
-
this.completeWorkflow(workflowId);
|
|
363
|
-
|
|
364
|
-
return ok({
|
|
365
|
-
breakingChanges,
|
|
366
|
-
affectedConsumers,
|
|
367
|
-
canRelease: breakingChanges.length === 0,
|
|
368
|
-
recommendations,
|
|
369
|
-
});
|
|
370
|
-
} catch (error) {
|
|
371
|
-
this.failWorkflow(workflowId, String(error));
|
|
372
|
-
return err(error instanceof Error ? error : new Error(String(error)));
|
|
373
|
-
}
|
|
374
|
-
}
|
|
375
|
-
|
|
376
|
-
/**
|
|
377
|
-
* Generate contract from OpenAPI spec
|
|
378
|
-
*/
|
|
379
|
-
async importFromOpenAPI(specPath: FilePath): Promise<Result<ApiContract>> {
|
|
380
|
-
const workflowId = uuidv4();
|
|
381
|
-
|
|
382
|
-
try {
|
|
383
|
-
this.startWorkflow(workflowId, 'import');
|
|
384
|
-
|
|
385
|
-
// Load and validate OpenAPI spec using FileReader
|
|
386
|
-
const specContent = await this.loadFileContent(specPath);
|
|
387
|
-
if (!specContent) {
|
|
388
|
-
this.failWorkflow(workflowId, 'Failed to load OpenAPI spec');
|
|
389
|
-
return err(new Error('Failed to load OpenAPI spec'));
|
|
390
|
-
}
|
|
391
|
-
|
|
392
|
-
// Validate the OpenAPI spec
|
|
393
|
-
const validationResult = await this.contractValidator.validateOpenAPI(specContent);
|
|
394
|
-
if (!validationResult.success) {
|
|
395
|
-
this.failWorkflow(workflowId, validationResult.error.message);
|
|
396
|
-
return validationResult;
|
|
397
|
-
}
|
|
398
|
-
|
|
399
|
-
if (!validationResult.value.isValid) {
|
|
400
|
-
const errors = validationResult.value.errors.map((e) => e.message).join('; ');
|
|
401
|
-
this.failWorkflow(workflowId, errors);
|
|
402
|
-
return err(new Error(`Invalid OpenAPI spec: ${errors}`));
|
|
403
|
-
}
|
|
404
|
-
|
|
405
|
-
// Parse and convert to ApiContract
|
|
406
|
-
const contract = this.parseOpenAPIToContract(specContent);
|
|
407
|
-
|
|
408
|
-
// Store the contract
|
|
409
|
-
this.contractStore.set(contract.id, contract);
|
|
410
|
-
await this.memory.set(`contract-testing:contract:${contract.id}`, contract, {
|
|
411
|
-
namespace: 'contract-testing',
|
|
412
|
-
persist: true,
|
|
413
|
-
});
|
|
414
|
-
|
|
415
|
-
this.completeWorkflow(workflowId);
|
|
416
|
-
|
|
417
|
-
return ok(contract);
|
|
418
|
-
} catch (error) {
|
|
419
|
-
this.failWorkflow(workflowId, String(error));
|
|
420
|
-
return err(error instanceof Error ? error : new Error(String(error)));
|
|
421
|
-
}
|
|
422
|
-
}
|
|
423
|
-
|
|
424
|
-
/**
|
|
425
|
-
* Export contract to OpenAPI spec
|
|
426
|
-
*/
|
|
427
|
-
async exportToOpenAPI(contractId: string): Promise<Result<string>> {
|
|
428
|
-
const workflowId = uuidv4();
|
|
429
|
-
|
|
430
|
-
try {
|
|
431
|
-
this.startWorkflow(workflowId, 'export');
|
|
432
|
-
|
|
433
|
-
// Find the contract
|
|
434
|
-
const contract = this.contractStore.get(contractId);
|
|
435
|
-
if (!contract) {
|
|
436
|
-
this.failWorkflow(workflowId, 'Contract not found');
|
|
437
|
-
return err(new Error(`Contract not found: ${contractId}`));
|
|
438
|
-
}
|
|
439
|
-
|
|
440
|
-
// Convert to OpenAPI
|
|
441
|
-
const openAPISpec = this.contractToOpenAPI(contract);
|
|
442
|
-
|
|
443
|
-
this.completeWorkflow(workflowId);
|
|
444
|
-
|
|
445
|
-
return ok(openAPISpec);
|
|
446
|
-
} catch (error) {
|
|
447
|
-
this.failWorkflow(workflowId, String(error));
|
|
448
|
-
return err(error instanceof Error ? error : new Error(String(error)));
|
|
449
|
-
}
|
|
450
|
-
}
|
|
451
|
-
|
|
452
|
-
// ============================================================================
|
|
453
|
-
// Private Helper Methods
|
|
454
|
-
// ============================================================================
|
|
455
|
-
|
|
456
|
-
private async verifyConsumerContract(
|
|
457
|
-
contract: ApiContract,
|
|
458
|
-
consumerName: string,
|
|
459
|
-
providerUrl: string
|
|
460
|
-
): Promise<VerificationResult> {
|
|
461
|
-
const failures: VerificationResult['failures'] = [];
|
|
462
|
-
const warnings: VerificationResult['warnings'] = [];
|
|
463
|
-
|
|
464
|
-
// Skip real HTTP for non-HTTP URLs (test mode)
|
|
465
|
-
const isRealUrl =
|
|
466
|
-
providerUrl.startsWith('http://') || providerUrl.startsWith('https://');
|
|
467
|
-
|
|
468
|
-
for (const endpoint of contract.endpoints) {
|
|
469
|
-
const endpointUrl = `${providerUrl}${endpoint.path}`;
|
|
470
|
-
const endpointKey = `${endpoint.method} ${endpoint.path}`;
|
|
471
|
-
|
|
472
|
-
if (isRealUrl) {
|
|
473
|
-
// Make actual HTTP request to verify endpoint
|
|
474
|
-
try {
|
|
475
|
-
const verifyResult = await this.verifyEndpoint(
|
|
476
|
-
endpointUrl,
|
|
477
|
-
endpoint.method,
|
|
478
|
-
endpoint
|
|
479
|
-
);
|
|
480
|
-
|
|
481
|
-
if (!verifyResult.success) {
|
|
482
|
-
failures.push({
|
|
483
|
-
endpoint: endpointKey,
|
|
484
|
-
type: verifyResult.errorType as FailureType,
|
|
485
|
-
expected: verifyResult.expected,
|
|
486
|
-
actual: verifyResult.actual,
|
|
487
|
-
message: verifyResult.message,
|
|
488
|
-
});
|
|
489
|
-
} else if (verifyResult.warning) {
|
|
490
|
-
warnings.push({
|
|
491
|
-
endpoint: endpointKey,
|
|
492
|
-
message: verifyResult.warning,
|
|
493
|
-
severity: 'low',
|
|
494
|
-
});
|
|
495
|
-
}
|
|
496
|
-
} catch (error) {
|
|
497
|
-
failures.push({
|
|
498
|
-
endpoint: endpointKey,
|
|
499
|
-
type: 'connection-error',
|
|
500
|
-
expected: 'reachable',
|
|
501
|
-
actual: 'error',
|
|
502
|
-
message: `Failed to verify endpoint: ${error instanceof Error ? error.message : String(error)}`,
|
|
503
|
-
});
|
|
504
|
-
}
|
|
505
|
-
} else {
|
|
506
|
-
// Simulation mode for non-HTTP URLs (testing)
|
|
507
|
-
// Endpoint is considered valid if URL is non-empty
|
|
508
|
-
if (!providerUrl) {
|
|
509
|
-
failures.push({
|
|
510
|
-
endpoint: endpointKey,
|
|
511
|
-
type: 'connection-error',
|
|
512
|
-
expected: 'reachable',
|
|
513
|
-
actual: 'unreachable',
|
|
514
|
-
message: `Endpoint ${endpointKey} is not reachable (no provider URL)`,
|
|
515
|
-
});
|
|
516
|
-
}
|
|
517
|
-
}
|
|
518
|
-
}
|
|
519
|
-
|
|
520
|
-
return {
|
|
521
|
-
contractId: contract.id,
|
|
522
|
-
provider: contract.provider.name,
|
|
523
|
-
consumer: consumerName,
|
|
524
|
-
passed: failures.length === 0,
|
|
525
|
-
failures,
|
|
526
|
-
warnings,
|
|
527
|
-
timestamp: new Date(),
|
|
528
|
-
};
|
|
529
|
-
}
|
|
530
|
-
|
|
531
|
-
private async verifyEndpoint(
|
|
532
|
-
url: string,
|
|
533
|
-
method: HttpMethod,
|
|
534
|
-
endpoint: ContractEndpoint
|
|
535
|
-
): Promise<{
|
|
536
|
-
success: boolean;
|
|
537
|
-
errorType: string;
|
|
538
|
-
expected: string;
|
|
539
|
-
actual: string;
|
|
540
|
-
message: string;
|
|
541
|
-
warning?: string;
|
|
542
|
-
}> {
|
|
543
|
-
const timeout = 10000;
|
|
544
|
-
const requestOptions = { timeout, retries: 1, circuitBreaker: false };
|
|
545
|
-
|
|
546
|
-
let result;
|
|
547
|
-
switch (method) {
|
|
548
|
-
case 'GET':
|
|
549
|
-
case 'HEAD':
|
|
550
|
-
result = await this.httpClient.get(url, requestOptions);
|
|
551
|
-
break;
|
|
552
|
-
case 'POST':
|
|
553
|
-
result = await this.httpClient.post(url, {}, requestOptions);
|
|
554
|
-
break;
|
|
555
|
-
case 'PUT':
|
|
556
|
-
result = await this.httpClient.put(url, {}, requestOptions);
|
|
557
|
-
break;
|
|
558
|
-
case 'PATCH':
|
|
559
|
-
result = await this.httpClient.patch(url, {}, requestOptions);
|
|
560
|
-
break;
|
|
561
|
-
case 'DELETE':
|
|
562
|
-
result = await this.httpClient.delete(url, requestOptions);
|
|
563
|
-
break;
|
|
564
|
-
case 'OPTIONS':
|
|
565
|
-
result = await this.httpClient.get(url, requestOptions);
|
|
566
|
-
break;
|
|
567
|
-
default:
|
|
568
|
-
result = await this.httpClient.get(url, requestOptions);
|
|
569
|
-
}
|
|
570
|
-
|
|
571
|
-
if (!result.success) {
|
|
572
|
-
return {
|
|
573
|
-
success: false,
|
|
574
|
-
errorType: 'connection-error',
|
|
575
|
-
expected: 'successful response',
|
|
576
|
-
actual: `error: ${result.error.message}`,
|
|
577
|
-
message: `Endpoint unreachable: ${result.error.message}`,
|
|
578
|
-
};
|
|
579
|
-
}
|
|
580
|
-
|
|
581
|
-
const response = result.value;
|
|
582
|
-
|
|
583
|
-
// Verify response status matches expected - use examples for expected status codes
|
|
584
|
-
if (endpoint.examples && endpoint.examples.length > 0) {
|
|
585
|
-
const expectedStatuses = endpoint.examples.map((e) => e.statusCode);
|
|
586
|
-
if (!expectedStatuses.includes(response.status)) {
|
|
587
|
-
return {
|
|
588
|
-
success: false,
|
|
589
|
-
errorType: 'status-mismatch',
|
|
590
|
-
expected: expectedStatuses.join(' or '),
|
|
591
|
-
actual: String(response.status),
|
|
592
|
-
message: `Expected status ${expectedStatuses.join('/')} but got ${response.status}`,
|
|
593
|
-
};
|
|
594
|
-
}
|
|
595
|
-
}
|
|
596
|
-
|
|
597
|
-
// Check for deprecation warnings
|
|
598
|
-
let warning: string | undefined;
|
|
599
|
-
const deprecationHeader = response.headers.get('Deprecation');
|
|
600
|
-
if (deprecationHeader) {
|
|
601
|
-
warning = `Endpoint is deprecated: ${deprecationHeader}`;
|
|
602
|
-
}
|
|
603
|
-
|
|
604
|
-
return {
|
|
605
|
-
success: true,
|
|
606
|
-
errorType: '',
|
|
607
|
-
expected: '',
|
|
608
|
-
actual: '',
|
|
609
|
-
message: 'Endpoint verified successfully',
|
|
610
|
-
warning,
|
|
611
|
-
};
|
|
612
|
-
}
|
|
613
|
-
|
|
614
|
-
private async findContractsByProvider(providerName: string): Promise<ApiContract[]> {
|
|
615
|
-
const contracts: ApiContract[] = [];
|
|
616
|
-
|
|
617
|
-
const contractValues = Array.from(this.contractStore.values());
|
|
618
|
-
for (const contract of contractValues) {
|
|
619
|
-
if (contract.provider.name === providerName) {
|
|
620
|
-
contracts.push(contract);
|
|
621
|
-
}
|
|
622
|
-
}
|
|
623
|
-
|
|
624
|
-
// Also search in memory
|
|
625
|
-
const keys = await this.memory.search(`contract-testing:contract:*`, 100);
|
|
626
|
-
for (const key of keys) {
|
|
627
|
-
const stored = await this.memory.get<ApiContract>(key);
|
|
628
|
-
if (stored && stored.provider.name === providerName) {
|
|
629
|
-
if (!this.contractStore.has(stored.id)) {
|
|
630
|
-
contracts.push(stored);
|
|
631
|
-
}
|
|
632
|
-
}
|
|
633
|
-
}
|
|
634
|
-
|
|
635
|
-
return contracts;
|
|
636
|
-
}
|
|
637
|
-
|
|
638
|
-
private async loadContractFromPath(path: FilePath): Promise<ApiContract | null> {
|
|
639
|
-
// Read contract file from path using FileReader
|
|
640
|
-
const content = await this.loadFileContent(path);
|
|
641
|
-
if (!content) {
|
|
642
|
-
return null;
|
|
643
|
-
}
|
|
644
|
-
|
|
645
|
-
try {
|
|
646
|
-
// Determine file type and parse accordingly
|
|
647
|
-
const filePath = path.value.toLowerCase();
|
|
648
|
-
|
|
649
|
-
if (filePath.endsWith('.json')) {
|
|
650
|
-
// Parse as JSON contract or OpenAPI spec
|
|
651
|
-
const parsed = JSON.parse(content);
|
|
652
|
-
|
|
653
|
-
// Check if it's an OpenAPI spec
|
|
654
|
-
if (parsed.openapi || parsed.swagger) {
|
|
655
|
-
return this.parseOpenAPIToContract(content);
|
|
656
|
-
}
|
|
657
|
-
|
|
658
|
-
// Assume it's a direct contract format
|
|
659
|
-
return parsed as ApiContract;
|
|
660
|
-
} else if (filePath.endsWith('.yaml') || filePath.endsWith('.yml')) {
|
|
661
|
-
// YAML support would require a YAML parser
|
|
662
|
-
// For now, log a warning and return null
|
|
663
|
-
console.warn('YAML contract files not yet supported:', path.value);
|
|
664
|
-
return null;
|
|
665
|
-
}
|
|
666
|
-
|
|
667
|
-
// Try parsing as JSON anyway
|
|
668
|
-
return JSON.parse(content) as ApiContract;
|
|
669
|
-
} catch (error) {
|
|
670
|
-
console.error(
|
|
671
|
-
`Failed to parse contract from ${path.value}:`,
|
|
672
|
-
error instanceof Error ? error.message : String(error)
|
|
673
|
-
);
|
|
674
|
-
return null;
|
|
675
|
-
}
|
|
676
|
-
}
|
|
677
|
-
|
|
678
|
-
private async loadFileContent(path: FilePath): Promise<string | null> {
|
|
679
|
-
// Read file content using FileReader
|
|
680
|
-
const result = await this.fileReader.readFile(path.value);
|
|
681
|
-
|
|
682
|
-
if (!result.success) {
|
|
683
|
-
console.error(`Failed to read file ${path.value}:`, result.error);
|
|
684
|
-
return null;
|
|
685
|
-
}
|
|
686
|
-
|
|
687
|
-
return result.value;
|
|
688
|
-
}
|
|
689
|
-
|
|
690
|
-
private parseOpenAPIToContract(specContent: string): ApiContract {
|
|
691
|
-
const spec = JSON.parse(specContent) as Record<string, unknown>;
|
|
692
|
-
const info = (spec.info || {}) as Record<string, unknown>;
|
|
693
|
-
const paths = (spec.paths || {}) as Record<string, Record<string, unknown>>;
|
|
694
|
-
|
|
695
|
-
const endpoints: ContractEndpoint[] = [];
|
|
696
|
-
const schemas: SchemaDefinition[] = [];
|
|
697
|
-
|
|
698
|
-
// Extract endpoints
|
|
699
|
-
for (const [path, methods] of Object.entries(paths)) {
|
|
700
|
-
const httpMethods: HttpMethod[] = ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'HEAD', 'OPTIONS'];
|
|
701
|
-
for (const method of httpMethods) {
|
|
702
|
-
const operation = methods[method.toLowerCase()] as Record<string, unknown> | undefined;
|
|
703
|
-
if (operation) {
|
|
704
|
-
endpoints.push({
|
|
705
|
-
path,
|
|
706
|
-
method,
|
|
707
|
-
requestSchema: this.extractRequestSchema(operation),
|
|
708
|
-
responseSchema: this.extractResponseSchema(operation),
|
|
709
|
-
headers: {},
|
|
710
|
-
examples: [],
|
|
711
|
-
});
|
|
712
|
-
}
|
|
713
|
-
}
|
|
714
|
-
}
|
|
715
|
-
|
|
716
|
-
// Extract schemas
|
|
717
|
-
const components = (spec.components || {}) as Record<string, unknown>;
|
|
718
|
-
const schemasDef = (components.schemas || {}) as Record<string, unknown>;
|
|
719
|
-
for (const [name, schemaDef] of Object.entries(schemasDef)) {
|
|
720
|
-
schemas.push({
|
|
721
|
-
id: name,
|
|
722
|
-
name,
|
|
723
|
-
type: 'openapi',
|
|
724
|
-
content: JSON.stringify(schemaDef),
|
|
725
|
-
});
|
|
726
|
-
}
|
|
727
|
-
|
|
728
|
-
return {
|
|
729
|
-
id: uuidv4(),
|
|
730
|
-
name: (info.title as string) || 'Imported Contract',
|
|
731
|
-
version: Version.parse((info.version as string) || '1.0.0'),
|
|
732
|
-
type: 'rest' as ContractType,
|
|
733
|
-
provider: {
|
|
734
|
-
name: (info.title as string) || 'Unknown Provider',
|
|
735
|
-
version: (info.version as string) || '1.0.0',
|
|
736
|
-
},
|
|
737
|
-
consumers: [],
|
|
738
|
-
endpoints,
|
|
739
|
-
schemas,
|
|
740
|
-
};
|
|
741
|
-
}
|
|
742
|
-
|
|
743
|
-
private extractRequestSchema(operation: Record<string, unknown>): string | undefined {
|
|
744
|
-
const requestBody = operation.requestBody as Record<string, unknown> | undefined;
|
|
745
|
-
if (requestBody) {
|
|
746
|
-
const content = requestBody.content as Record<string, unknown> | undefined;
|
|
747
|
-
if (content) {
|
|
748
|
-
const jsonContent = content['application/json'] as Record<string, unknown> | undefined;
|
|
749
|
-
if (jsonContent?.schema) {
|
|
750
|
-
const ref = (jsonContent.schema as Record<string, unknown>).$ref as string | undefined;
|
|
751
|
-
if (ref) {
|
|
752
|
-
return ref.split('/').pop();
|
|
753
|
-
}
|
|
754
|
-
}
|
|
755
|
-
}
|
|
756
|
-
}
|
|
757
|
-
return undefined;
|
|
758
|
-
}
|
|
759
|
-
|
|
760
|
-
private extractResponseSchema(operation: Record<string, unknown>): string | undefined {
|
|
761
|
-
const responses = operation.responses as Record<string, unknown> | undefined;
|
|
762
|
-
if (responses) {
|
|
763
|
-
const successResponse = (responses['200'] || responses['201']) as Record<string, unknown> | undefined;
|
|
764
|
-
if (successResponse) {
|
|
765
|
-
const content = successResponse.content as Record<string, unknown> | undefined;
|
|
766
|
-
if (content) {
|
|
767
|
-
const jsonContent = content['application/json'] as Record<string, unknown> | undefined;
|
|
768
|
-
if (jsonContent?.schema) {
|
|
769
|
-
const ref = (jsonContent.schema as Record<string, unknown>).$ref as string | undefined;
|
|
770
|
-
if (ref) {
|
|
771
|
-
return ref.split('/').pop();
|
|
772
|
-
}
|
|
773
|
-
}
|
|
774
|
-
}
|
|
775
|
-
}
|
|
776
|
-
}
|
|
777
|
-
return undefined;
|
|
778
|
-
}
|
|
779
|
-
|
|
780
|
-
private contractToOpenAPI(contract: ApiContract): string {
|
|
781
|
-
const paths: Record<string, Record<string, unknown>> = {};
|
|
782
|
-
|
|
783
|
-
for (const endpoint of contract.endpoints) {
|
|
784
|
-
if (!paths[endpoint.path]) {
|
|
785
|
-
paths[endpoint.path] = {};
|
|
786
|
-
}
|
|
787
|
-
|
|
788
|
-
const operation: Record<string, unknown> = {
|
|
789
|
-
summary: `${endpoint.method} ${endpoint.path}`,
|
|
790
|
-
responses: {
|
|
791
|
-
'200': {
|
|
792
|
-
description: 'Success',
|
|
793
|
-
content: endpoint.responseSchema
|
|
794
|
-
? {
|
|
795
|
-
'application/json': {
|
|
796
|
-
schema: { $ref: `#/components/schemas/${endpoint.responseSchema}` },
|
|
797
|
-
},
|
|
798
|
-
}
|
|
799
|
-
: undefined,
|
|
800
|
-
},
|
|
801
|
-
},
|
|
802
|
-
};
|
|
803
|
-
|
|
804
|
-
if (endpoint.requestSchema) {
|
|
805
|
-
operation.requestBody = {
|
|
806
|
-
content: {
|
|
807
|
-
'application/json': {
|
|
808
|
-
schema: { $ref: `#/components/schemas/${endpoint.requestSchema}` },
|
|
809
|
-
},
|
|
810
|
-
},
|
|
811
|
-
};
|
|
812
|
-
}
|
|
813
|
-
|
|
814
|
-
paths[endpoint.path][endpoint.method.toLowerCase()] = operation;
|
|
815
|
-
}
|
|
816
|
-
|
|
817
|
-
const schemas: Record<string, unknown> = {};
|
|
818
|
-
for (const schema of contract.schemas) {
|
|
819
|
-
try {
|
|
820
|
-
schemas[schema.id] = JSON.parse(schema.content);
|
|
821
|
-
} catch {
|
|
822
|
-
schemas[schema.id] = { type: 'object' };
|
|
823
|
-
}
|
|
824
|
-
}
|
|
825
|
-
|
|
826
|
-
const openAPISpec = {
|
|
827
|
-
openapi: '3.0.3',
|
|
828
|
-
info: {
|
|
829
|
-
title: contract.name,
|
|
830
|
-
version: contract.version.toString(),
|
|
831
|
-
},
|
|
832
|
-
paths,
|
|
833
|
-
components: {
|
|
834
|
-
schemas,
|
|
835
|
-
},
|
|
836
|
-
};
|
|
837
|
-
|
|
838
|
-
return JSON.stringify(openAPISpec, null, 2);
|
|
839
|
-
}
|
|
840
|
-
|
|
841
|
-
// ============================================================================
|
|
842
|
-
// Agent Spawning
|
|
843
|
-
// ============================================================================
|
|
844
|
-
|
|
845
|
-
private async spawnVerificationAgent(
|
|
846
|
-
workflowId: string,
|
|
847
|
-
providerName: string
|
|
848
|
-
): Promise<Result<string, Error>> {
|
|
849
|
-
const config: AgentSpawnConfig = {
|
|
850
|
-
name: `contract-verifier-${workflowId.slice(0, 8)}`,
|
|
851
|
-
domain: 'contract-testing',
|
|
852
|
-
type: 'validator',
|
|
853
|
-
capabilities: ['contract-verification', 'http-testing'],
|
|
854
|
-
config: {
|
|
855
|
-
workflowId,
|
|
856
|
-
providerName,
|
|
857
|
-
},
|
|
858
|
-
};
|
|
859
|
-
|
|
860
|
-
return this.agentCoordinator.spawn(config);
|
|
861
|
-
}
|
|
862
|
-
|
|
863
|
-
// ============================================================================
|
|
864
|
-
// Event Publishing
|
|
865
|
-
// ============================================================================
|
|
866
|
-
|
|
867
|
-
private async publishContractRegistered(contract: ApiContract): Promise<void> {
|
|
868
|
-
const event = createEvent(ContractTestingEvents.ContractPublished, 'contract-testing', {
|
|
869
|
-
contractId: contract.id,
|
|
870
|
-
version: contract.version.toString(),
|
|
871
|
-
provider: contract.provider.name,
|
|
872
|
-
});
|
|
873
|
-
|
|
874
|
-
await this.eventBus.publish(event);
|
|
875
|
-
}
|
|
876
|
-
|
|
877
|
-
private async publishContractVerified(
|
|
878
|
-
contract: ApiContract,
|
|
879
|
-
consumer: string,
|
|
880
|
-
result: VerificationResult
|
|
881
|
-
): Promise<void> {
|
|
882
|
-
const event = createEvent(ContractTestingEvents.ContractVerified, 'contract-testing', {
|
|
883
|
-
contractId: contract.id,
|
|
884
|
-
provider: contract.provider.name,
|
|
885
|
-
consumer,
|
|
886
|
-
passed: result.passed,
|
|
887
|
-
failureCount: result.failures.length,
|
|
888
|
-
});
|
|
889
|
-
|
|
890
|
-
await this.eventBus.publish(event);
|
|
891
|
-
}
|
|
892
|
-
|
|
893
|
-
private async publishVerificationFailed(
|
|
894
|
-
contract: ApiContract,
|
|
895
|
-
consumer: string,
|
|
896
|
-
result: VerificationResult
|
|
897
|
-
): Promise<void> {
|
|
898
|
-
const event = createEvent(ContractTestingEvents.VerificationFailed, 'contract-testing', {
|
|
899
|
-
contractId: contract.id,
|
|
900
|
-
provider: contract.provider.name,
|
|
901
|
-
consumer,
|
|
902
|
-
failures: result.failures.map((f) => ({
|
|
903
|
-
endpoint: f.endpoint,
|
|
904
|
-
type: f.type,
|
|
905
|
-
message: f.message,
|
|
906
|
-
})),
|
|
907
|
-
});
|
|
908
|
-
|
|
909
|
-
await this.eventBus.publish(event);
|
|
910
|
-
}
|
|
911
|
-
|
|
912
|
-
private async publishBreakingChangeDetected(
|
|
913
|
-
contractId: string,
|
|
914
|
-
changes: BreakingChange[],
|
|
915
|
-
affectedConsumers: string[]
|
|
916
|
-
): Promise<void> {
|
|
917
|
-
const event = createEvent(ContractTestingEvents.BreakingChangeDetected, 'contract-testing', {
|
|
918
|
-
contractId,
|
|
919
|
-
changes,
|
|
920
|
-
affectedConsumers,
|
|
921
|
-
});
|
|
922
|
-
|
|
923
|
-
await this.eventBus.publish(event);
|
|
924
|
-
}
|
|
925
|
-
|
|
926
|
-
// ============================================================================
|
|
927
|
-
// Workflow Management
|
|
928
|
-
// ============================================================================
|
|
929
|
-
|
|
930
|
-
private startWorkflow(id: string, type: WorkflowStatus['type']): void {
|
|
931
|
-
const activeWorkflows = this.getActiveWorkflows();
|
|
932
|
-
if (activeWorkflows.length >= this.config.maxConcurrentWorkflows) {
|
|
933
|
-
throw new Error(
|
|
934
|
-
`Maximum concurrent workflows (${this.config.maxConcurrentWorkflows}) reached`
|
|
935
|
-
);
|
|
936
|
-
}
|
|
937
|
-
|
|
938
|
-
this.workflows.set(id, {
|
|
939
|
-
id,
|
|
940
|
-
type,
|
|
941
|
-
status: 'running',
|
|
942
|
-
startedAt: new Date(),
|
|
943
|
-
agentIds: [],
|
|
944
|
-
progress: 0,
|
|
945
|
-
});
|
|
946
|
-
}
|
|
947
|
-
|
|
948
|
-
private completeWorkflow(id: string): void {
|
|
949
|
-
const workflow = this.workflows.get(id);
|
|
950
|
-
if (workflow) {
|
|
951
|
-
workflow.status = 'completed';
|
|
952
|
-
workflow.completedAt = new Date();
|
|
953
|
-
workflow.progress = 100;
|
|
954
|
-
}
|
|
955
|
-
}
|
|
956
|
-
|
|
957
|
-
private failWorkflow(id: string, error: string): void {
|
|
958
|
-
const workflow = this.workflows.get(id);
|
|
959
|
-
if (workflow) {
|
|
960
|
-
workflow.status = 'failed';
|
|
961
|
-
workflow.completedAt = new Date();
|
|
962
|
-
workflow.error = error;
|
|
963
|
-
}
|
|
964
|
-
}
|
|
965
|
-
|
|
966
|
-
private addAgentToWorkflow(workflowId: string, agentId: string): void {
|
|
967
|
-
const workflow = this.workflows.get(workflowId);
|
|
968
|
-
if (workflow) {
|
|
969
|
-
workflow.agentIds.push(agentId);
|
|
970
|
-
}
|
|
971
|
-
}
|
|
972
|
-
|
|
973
|
-
private updateWorkflowProgress(id: string, progress: number): void {
|
|
974
|
-
const workflow = this.workflows.get(id);
|
|
975
|
-
if (workflow) {
|
|
976
|
-
workflow.progress = Math.min(100, Math.max(0, progress));
|
|
977
|
-
}
|
|
978
|
-
}
|
|
979
|
-
|
|
980
|
-
// ============================================================================
|
|
981
|
-
// Event Handling
|
|
982
|
-
// ============================================================================
|
|
983
|
-
|
|
984
|
-
private subscribeToEvents(): void {
|
|
985
|
-
// Subscribe to code change events for auto-verification
|
|
986
|
-
this.eventBus.subscribe(
|
|
987
|
-
'code-intelligence.ImpactAnalysisCompleted',
|
|
988
|
-
this.handleImpactAnalysis.bind(this)
|
|
989
|
-
);
|
|
990
|
-
}
|
|
991
|
-
|
|
992
|
-
private async handleImpactAnalysis(event: DomainEvent): Promise<void> {
|
|
993
|
-
// Auto-verify contracts when code changes affect API endpoints
|
|
994
|
-
const payload = event.payload as {
|
|
995
|
-
changedFiles: string[];
|
|
996
|
-
impactedFiles: string[];
|
|
997
|
-
};
|
|
998
|
-
|
|
999
|
-
// Check if any changed files are contract-related
|
|
1000
|
-
const contractFiles = payload.changedFiles.filter(
|
|
1001
|
-
(f) => f.includes('contract') || f.includes('api') || f.includes('openapi')
|
|
1002
|
-
);
|
|
1003
|
-
|
|
1004
|
-
if (contractFiles.length > 0 && this.config.enableAutoVerification) {
|
|
1005
|
-
// Could trigger automatic verification
|
|
1006
|
-
// For now, just store the info for manual review
|
|
1007
|
-
await this.memory.set(
|
|
1008
|
-
`contract-testing:pending-verification:${Date.now()}`,
|
|
1009
|
-
{ changedFiles: contractFiles, timestamp: new Date().toISOString() },
|
|
1010
|
-
{ namespace: 'contract-testing', ttl: 3600 }
|
|
1011
|
-
);
|
|
1012
|
-
}
|
|
1013
|
-
}
|
|
1014
|
-
|
|
1015
|
-
// ============================================================================
|
|
1016
|
-
// State Persistence
|
|
1017
|
-
// ============================================================================
|
|
1018
|
-
|
|
1019
|
-
private async loadContracts(): Promise<void> {
|
|
1020
|
-
const keys = await this.memory.search('contract-testing:contract:*', 100);
|
|
1021
|
-
for (const key of keys) {
|
|
1022
|
-
const contract = await this.memory.get<ApiContract>(key);
|
|
1023
|
-
if (contract) {
|
|
1024
|
-
this.contractStore.set(contract.id, contract);
|
|
1025
|
-
}
|
|
1026
|
-
}
|
|
1027
|
-
}
|
|
1028
|
-
|
|
1029
|
-
private async saveContracts(): Promise<void> {
|
|
1030
|
-
const entries = Array.from(this.contractStore.entries());
|
|
1031
|
-
for (const [id, contract] of entries) {
|
|
1032
|
-
await this.memory.set(`contract-testing:contract:${id}`, contract, {
|
|
1033
|
-
namespace: 'contract-testing',
|
|
1034
|
-
persist: true,
|
|
1035
|
-
});
|
|
1036
|
-
}
|
|
1037
|
-
}
|
|
1038
|
-
}
|