@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,1146 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Agentic QE v3 - Task Executor
|
|
3
|
-
* Bridges Queen tasks to domain service execution
|
|
4
|
-
*
|
|
5
|
-
* This component actually executes domain services when tasks are assigned,
|
|
6
|
-
* completing the execution pipeline with REAL implementations.
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
import { v4 as uuidv4 } from 'uuid';
|
|
10
|
-
import * as fs from 'fs/promises';
|
|
11
|
-
import * as path from 'path';
|
|
12
|
-
import { DomainName, DomainEvent, Result, ok, err } from '../shared/types';
|
|
13
|
-
import { EventBus, QEKernel, MemoryBackend } from '../kernel/interfaces';
|
|
14
|
-
import { TaskType, QueenTask, TaskExecution } from './queen-coordinator';
|
|
15
|
-
import { ResultSaver, createResultSaver, SaveOptions } from './result-saver';
|
|
16
|
-
|
|
17
|
-
// Import real domain services
|
|
18
|
-
import { CoverageAnalyzerService, type CoverageData, type FileCoverage } from '../domains/coverage-analysis';
|
|
19
|
-
import { SecurityScannerService, type FullScanResult } from '../domains/security-compliance';
|
|
20
|
-
import { TestGeneratorService, type GeneratedTests } from '../domains/test-generation';
|
|
21
|
-
import { KnowledgeGraphService } from '../domains/code-intelligence';
|
|
22
|
-
import { QualityAnalyzerService, type QualityReport } from '../domains/quality-assessment';
|
|
23
|
-
|
|
24
|
-
// ============================================================================
|
|
25
|
-
// Types
|
|
26
|
-
// ============================================================================
|
|
27
|
-
|
|
28
|
-
export interface TaskExecutorConfig {
|
|
29
|
-
timeout: number;
|
|
30
|
-
maxRetries: number;
|
|
31
|
-
enableCaching: boolean;
|
|
32
|
-
/** Enable result persistence to files */
|
|
33
|
-
saveResults: boolean;
|
|
34
|
-
/** Base directory for result files */
|
|
35
|
-
resultsDir: string;
|
|
36
|
-
/** Default language for test generation */
|
|
37
|
-
defaultLanguage: string;
|
|
38
|
-
/** Default framework for test generation */
|
|
39
|
-
defaultFramework: string;
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
export interface TaskResult {
|
|
43
|
-
taskId: string;
|
|
44
|
-
success: boolean;
|
|
45
|
-
data?: unknown;
|
|
46
|
-
error?: string;
|
|
47
|
-
duration: number;
|
|
48
|
-
domain: DomainName;
|
|
49
|
-
/** Files saved by result saver */
|
|
50
|
-
savedFiles?: string[];
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
type TaskHandler = (task: QueenTask, kernel: QEKernel) => Promise<Result<unknown, Error>>;
|
|
54
|
-
|
|
55
|
-
// Service cache to avoid re-instantiation
|
|
56
|
-
let coverageAnalyzer: CoverageAnalyzerService | null = null;
|
|
57
|
-
let securityScanner: SecurityScannerService | null = null;
|
|
58
|
-
let testGenerator: TestGeneratorService | null = null;
|
|
59
|
-
let knowledgeGraph: KnowledgeGraphService | null = null;
|
|
60
|
-
let qualityAnalyzer: QualityAnalyzerService | null = null;
|
|
61
|
-
|
|
62
|
-
// Helper to get or create services
|
|
63
|
-
function getCoverageAnalyzer(memory: MemoryBackend): CoverageAnalyzerService {
|
|
64
|
-
if (!coverageAnalyzer) {
|
|
65
|
-
coverageAnalyzer = new CoverageAnalyzerService(memory);
|
|
66
|
-
}
|
|
67
|
-
return coverageAnalyzer;
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
function getSecurityScanner(memory: MemoryBackend): SecurityScannerService {
|
|
71
|
-
if (!securityScanner) {
|
|
72
|
-
securityScanner = new SecurityScannerService(memory);
|
|
73
|
-
}
|
|
74
|
-
return securityScanner;
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
function getTestGenerator(memory: MemoryBackend): TestGeneratorService {
|
|
78
|
-
if (!testGenerator) {
|
|
79
|
-
testGenerator = new TestGeneratorService(memory);
|
|
80
|
-
}
|
|
81
|
-
return testGenerator;
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
function getKnowledgeGraph(memory: MemoryBackend): KnowledgeGraphService {
|
|
85
|
-
if (!knowledgeGraph) {
|
|
86
|
-
knowledgeGraph = new KnowledgeGraphService(memory);
|
|
87
|
-
}
|
|
88
|
-
return knowledgeGraph;
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
function getQualityAnalyzer(memory: MemoryBackend): QualityAnalyzerService {
|
|
92
|
-
if (!qualityAnalyzer) {
|
|
93
|
-
qualityAnalyzer = new QualityAnalyzerService(memory);
|
|
94
|
-
}
|
|
95
|
-
return qualityAnalyzer;
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
// ============================================================================
|
|
99
|
-
// Task Handler Registry
|
|
100
|
-
// ============================================================================
|
|
101
|
-
|
|
102
|
-
const taskHandlers: Map<TaskType, TaskHandler> = new Map();
|
|
103
|
-
|
|
104
|
-
// Register test generation handler - REAL IMPLEMENTATION
|
|
105
|
-
taskHandlers.set('generate-tests', async (task, kernel) => {
|
|
106
|
-
const payload = task.payload as {
|
|
107
|
-
sourceCode?: string;
|
|
108
|
-
filePath?: string;
|
|
109
|
-
sourceFiles?: string[];
|
|
110
|
-
language: string;
|
|
111
|
-
framework: string;
|
|
112
|
-
testType: 'unit' | 'integration' | 'e2e';
|
|
113
|
-
coverageGoal: number;
|
|
114
|
-
};
|
|
115
|
-
|
|
116
|
-
try {
|
|
117
|
-
const generator = getTestGenerator(kernel.memory);
|
|
118
|
-
|
|
119
|
-
// Determine source files to analyze
|
|
120
|
-
let sourceFiles: string[] = [];
|
|
121
|
-
if (payload.sourceFiles && payload.sourceFiles.length > 0) {
|
|
122
|
-
sourceFiles = payload.sourceFiles;
|
|
123
|
-
} else if (payload.filePath) {
|
|
124
|
-
sourceFiles = [payload.filePath];
|
|
125
|
-
} else if (payload.sourceCode) {
|
|
126
|
-
// Write temporary file for analysis if only source code provided
|
|
127
|
-
const tempPath = `/tmp/aqe-temp-${uuidv4()}.ts`;
|
|
128
|
-
await fs.writeFile(tempPath, payload.sourceCode, 'utf-8');
|
|
129
|
-
sourceFiles = [tempPath];
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
if (sourceFiles.length === 0) {
|
|
133
|
-
// Return a graceful fallback with warning when no source files provided
|
|
134
|
-
return ok({
|
|
135
|
-
testsGenerated: 0,
|
|
136
|
-
coverageEstimate: 0,
|
|
137
|
-
tests: [],
|
|
138
|
-
patternsUsed: [],
|
|
139
|
-
warning: 'No source files or code provided for test generation. Provide sourceCode, filePath, or sourceFiles in the payload.',
|
|
140
|
-
});
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
// Use the real TestGeneratorService
|
|
144
|
-
const framework = (payload.framework || 'vitest') as 'jest' | 'vitest' | 'mocha' | 'pytest';
|
|
145
|
-
const result = await generator.generateTests({
|
|
146
|
-
sourceFiles,
|
|
147
|
-
testType: payload.testType || 'unit',
|
|
148
|
-
framework,
|
|
149
|
-
coverageTarget: payload.coverageGoal || 80,
|
|
150
|
-
patterns: [],
|
|
151
|
-
});
|
|
152
|
-
|
|
153
|
-
if (!result.success) {
|
|
154
|
-
return result;
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
const generatedTests = result.value;
|
|
158
|
-
|
|
159
|
-
return ok({
|
|
160
|
-
testsGenerated: generatedTests.tests.length,
|
|
161
|
-
coverageEstimate: generatedTests.coverageEstimate,
|
|
162
|
-
tests: generatedTests.tests.map(t => ({
|
|
163
|
-
name: t.name,
|
|
164
|
-
file: t.testFile,
|
|
165
|
-
type: t.type,
|
|
166
|
-
sourceFile: t.sourceFile,
|
|
167
|
-
assertions: t.assertions,
|
|
168
|
-
})),
|
|
169
|
-
patternsUsed: generatedTests.patternsUsed,
|
|
170
|
-
});
|
|
171
|
-
} catch (error) {
|
|
172
|
-
return err(error instanceof Error ? error : new Error(String(error)));
|
|
173
|
-
}
|
|
174
|
-
});
|
|
175
|
-
|
|
176
|
-
// Register coverage analysis handler - REAL IMPLEMENTATION
|
|
177
|
-
taskHandlers.set('analyze-coverage', async (task, kernel) => {
|
|
178
|
-
const payload = task.payload as {
|
|
179
|
-
target: string;
|
|
180
|
-
detectGaps: boolean;
|
|
181
|
-
threshold?: number;
|
|
182
|
-
};
|
|
183
|
-
|
|
184
|
-
try {
|
|
185
|
-
const analyzer = getCoverageAnalyzer(kernel.memory);
|
|
186
|
-
const targetPath = payload.target || process.cwd();
|
|
187
|
-
const threshold = payload.threshold || 80;
|
|
188
|
-
|
|
189
|
-
// Try to find and read actual coverage files
|
|
190
|
-
const coverageData = await loadCoverageData(targetPath);
|
|
191
|
-
|
|
192
|
-
if (!coverageData) {
|
|
193
|
-
// No coverage data found - return informative error with fallback metrics
|
|
194
|
-
return ok({
|
|
195
|
-
lineCoverage: 0,
|
|
196
|
-
branchCoverage: 0,
|
|
197
|
-
functionCoverage: 0,
|
|
198
|
-
statementCoverage: 0,
|
|
199
|
-
totalFiles: 0,
|
|
200
|
-
gaps: [],
|
|
201
|
-
algorithm: 'sublinear-O(log n)',
|
|
202
|
-
warning: 'No coverage data found. Run tests with coverage first: npm test -- --coverage',
|
|
203
|
-
});
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
// Analyze coverage using the real CoverageAnalyzerService
|
|
207
|
-
const analysisResult = await analyzer.analyze({
|
|
208
|
-
coverageData,
|
|
209
|
-
threshold,
|
|
210
|
-
includeFileDetails: payload.detectGaps,
|
|
211
|
-
});
|
|
212
|
-
|
|
213
|
-
if (!analysisResult.success) {
|
|
214
|
-
return analysisResult;
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
const report = analysisResult.value;
|
|
218
|
-
|
|
219
|
-
// Find gaps if requested
|
|
220
|
-
let gaps: Array<{ file: string; lines: number[]; risk: string }> = [];
|
|
221
|
-
if (payload.detectGaps) {
|
|
222
|
-
const gapsResult = await analyzer.findGaps(coverageData, threshold);
|
|
223
|
-
if (gapsResult.success) {
|
|
224
|
-
gaps = gapsResult.value.gaps.map(gap => ({
|
|
225
|
-
file: gap.file,
|
|
226
|
-
lines: gap.lines,
|
|
227
|
-
risk: gap.severity,
|
|
228
|
-
}));
|
|
229
|
-
}
|
|
230
|
-
}
|
|
231
|
-
|
|
232
|
-
return ok({
|
|
233
|
-
lineCoverage: Math.round(report.summary.line * 10) / 10,
|
|
234
|
-
branchCoverage: Math.round(report.summary.branch * 10) / 10,
|
|
235
|
-
functionCoverage: Math.round(report.summary.function * 10) / 10,
|
|
236
|
-
statementCoverage: Math.round(report.summary.statement * 10) / 10,
|
|
237
|
-
totalFiles: report.summary.files,
|
|
238
|
-
gaps,
|
|
239
|
-
meetsThreshold: report.meetsThreshold,
|
|
240
|
-
delta: report.delta,
|
|
241
|
-
recommendations: report.recommendations,
|
|
242
|
-
algorithm: 'sublinear-O(log n)',
|
|
243
|
-
});
|
|
244
|
-
} catch (error) {
|
|
245
|
-
return err(error instanceof Error ? error : new Error(String(error)));
|
|
246
|
-
}
|
|
247
|
-
});
|
|
248
|
-
|
|
249
|
-
// Register security scan handler - REAL IMPLEMENTATION
|
|
250
|
-
taskHandlers.set('scan-security', async (task, kernel) => {
|
|
251
|
-
const payload = task.payload as {
|
|
252
|
-
target: string;
|
|
253
|
-
sast: boolean;
|
|
254
|
-
dast: boolean;
|
|
255
|
-
compliance: string[];
|
|
256
|
-
targetUrl?: string;
|
|
257
|
-
};
|
|
258
|
-
|
|
259
|
-
try {
|
|
260
|
-
const scanner = getSecurityScanner(kernel.memory);
|
|
261
|
-
const targetPath = payload.target || process.cwd();
|
|
262
|
-
|
|
263
|
-
// Discover files to scan
|
|
264
|
-
const filesToScan = await discoverSourceFiles(targetPath);
|
|
265
|
-
|
|
266
|
-
if (filesToScan.length === 0) {
|
|
267
|
-
return ok({
|
|
268
|
-
vulnerabilities: 0,
|
|
269
|
-
critical: 0,
|
|
270
|
-
high: 0,
|
|
271
|
-
medium: 0,
|
|
272
|
-
low: 0,
|
|
273
|
-
informational: 0,
|
|
274
|
-
topVulnerabilities: [],
|
|
275
|
-
recommendations: ['No source files found to scan'],
|
|
276
|
-
scanTypes: {
|
|
277
|
-
sast: payload.sast !== false,
|
|
278
|
-
dast: payload.dast || false,
|
|
279
|
-
},
|
|
280
|
-
warning: `No TypeScript/JavaScript files found in ${targetPath}`,
|
|
281
|
-
});
|
|
282
|
-
}
|
|
283
|
-
|
|
284
|
-
// Convert string paths to FilePath objects
|
|
285
|
-
const filePathObjects = filesToScan.map(filePath => ({
|
|
286
|
-
value: filePath,
|
|
287
|
-
extension: path.extname(filePath).slice(1),
|
|
288
|
-
}));
|
|
289
|
-
|
|
290
|
-
// Run SAST scan if requested
|
|
291
|
-
let sastResult = null;
|
|
292
|
-
if (payload.sast !== false) {
|
|
293
|
-
const result = await scanner.scanFiles(filePathObjects as any);
|
|
294
|
-
if (result.success) {
|
|
295
|
-
sastResult = result.value;
|
|
296
|
-
}
|
|
297
|
-
}
|
|
298
|
-
|
|
299
|
-
// Run DAST scan if URL provided and dast is enabled
|
|
300
|
-
let dastResult = null;
|
|
301
|
-
if (payload.dast && payload.targetUrl) {
|
|
302
|
-
const result = await scanner.scanUrl(payload.targetUrl, {
|
|
303
|
-
activeScanning: true,
|
|
304
|
-
maxDepth: 3,
|
|
305
|
-
timeout: 30000,
|
|
306
|
-
});
|
|
307
|
-
if (result.success) {
|
|
308
|
-
dastResult = result.value;
|
|
309
|
-
}
|
|
310
|
-
}
|
|
311
|
-
|
|
312
|
-
// Combine results - create mutable copy
|
|
313
|
-
const summary = {
|
|
314
|
-
critical: (sastResult?.summary?.critical || 0) + (dastResult?.summary?.critical || 0),
|
|
315
|
-
high: (sastResult?.summary?.high || 0) + (dastResult?.summary?.high || 0),
|
|
316
|
-
medium: (sastResult?.summary?.medium || 0) + (dastResult?.summary?.medium || 0),
|
|
317
|
-
low: (sastResult?.summary?.low || 0) + (dastResult?.summary?.low || 0),
|
|
318
|
-
informational: (sastResult?.summary?.informational || 0) + (dastResult?.summary?.informational || 0),
|
|
319
|
-
};
|
|
320
|
-
|
|
321
|
-
// Extract top vulnerabilities
|
|
322
|
-
const allVulns = [
|
|
323
|
-
...(sastResult?.vulnerabilities || []),
|
|
324
|
-
...(dastResult?.vulnerabilities || []),
|
|
325
|
-
];
|
|
326
|
-
|
|
327
|
-
const topVulnerabilities = allVulns
|
|
328
|
-
.sort((a, b) => {
|
|
329
|
-
const severityOrder = { critical: 0, high: 1, medium: 2, low: 3, informational: 4 };
|
|
330
|
-
return severityOrder[a.severity] - severityOrder[b.severity];
|
|
331
|
-
})
|
|
332
|
-
.slice(0, 10)
|
|
333
|
-
.map(v => ({
|
|
334
|
-
type: v.title,
|
|
335
|
-
severity: v.severity,
|
|
336
|
-
file: v.location.file,
|
|
337
|
-
line: v.location.line,
|
|
338
|
-
description: v.description,
|
|
339
|
-
}));
|
|
340
|
-
|
|
341
|
-
// Generate recommendations based on findings
|
|
342
|
-
const recommendations = generateSecurityRecommendations(allVulns);
|
|
343
|
-
|
|
344
|
-
return ok({
|
|
345
|
-
vulnerabilities: allVulns.length,
|
|
346
|
-
critical: summary.critical,
|
|
347
|
-
high: summary.high,
|
|
348
|
-
medium: summary.medium,
|
|
349
|
-
low: summary.low,
|
|
350
|
-
informational: summary.informational,
|
|
351
|
-
topVulnerabilities,
|
|
352
|
-
recommendations,
|
|
353
|
-
scanTypes: {
|
|
354
|
-
sast: payload.sast !== false,
|
|
355
|
-
dast: payload.dast || false,
|
|
356
|
-
},
|
|
357
|
-
filesScanned: filesToScan.length,
|
|
358
|
-
coverage: sastResult?.coverage,
|
|
359
|
-
});
|
|
360
|
-
} catch (error) {
|
|
361
|
-
return err(error instanceof Error ? error : new Error(String(error)));
|
|
362
|
-
}
|
|
363
|
-
});
|
|
364
|
-
|
|
365
|
-
// Register code indexing handler - REAL IMPLEMENTATION
|
|
366
|
-
taskHandlers.set('index-code', async (task, kernel) => {
|
|
367
|
-
const payload = task.payload as {
|
|
368
|
-
target: string;
|
|
369
|
-
incremental: boolean;
|
|
370
|
-
includeTests?: boolean;
|
|
371
|
-
languages?: string[];
|
|
372
|
-
};
|
|
373
|
-
|
|
374
|
-
try {
|
|
375
|
-
const kg = getKnowledgeGraph(kernel.memory);
|
|
376
|
-
const targetPath = payload.target || process.cwd();
|
|
377
|
-
const startTime = Date.now();
|
|
378
|
-
|
|
379
|
-
// Discover files to index
|
|
380
|
-
const filesToIndex = await discoverSourceFiles(targetPath, {
|
|
381
|
-
includeTests: payload.includeTests !== false,
|
|
382
|
-
languages: payload.languages,
|
|
383
|
-
});
|
|
384
|
-
|
|
385
|
-
if (filesToIndex.length === 0) {
|
|
386
|
-
return ok({
|
|
387
|
-
filesIndexed: 0,
|
|
388
|
-
nodesCreated: 0,
|
|
389
|
-
edgesCreated: 0,
|
|
390
|
-
target: targetPath,
|
|
391
|
-
incremental: payload.incremental || false,
|
|
392
|
-
languages: payload.languages || ['typescript', 'javascript'],
|
|
393
|
-
duration: Date.now() - startTime,
|
|
394
|
-
warning: `No source files found in ${targetPath}`,
|
|
395
|
-
});
|
|
396
|
-
}
|
|
397
|
-
|
|
398
|
-
// Use the real KnowledgeGraphService to index files
|
|
399
|
-
const result = await kg.index({
|
|
400
|
-
paths: filesToIndex,
|
|
401
|
-
incremental: payload.incremental || false,
|
|
402
|
-
includeTests: payload.includeTests !== false,
|
|
403
|
-
languages: payload.languages,
|
|
404
|
-
});
|
|
405
|
-
|
|
406
|
-
if (!result.success) {
|
|
407
|
-
return result;
|
|
408
|
-
}
|
|
409
|
-
|
|
410
|
-
const indexResult = result.value;
|
|
411
|
-
|
|
412
|
-
// Detect languages from files
|
|
413
|
-
const detectedLanguages = new Set<string>();
|
|
414
|
-
for (const file of filesToIndex) {
|
|
415
|
-
const ext = path.extname(file).slice(1);
|
|
416
|
-
if (['ts', 'tsx'].includes(ext)) detectedLanguages.add('typescript');
|
|
417
|
-
if (['js', 'jsx', 'mjs', 'cjs'].includes(ext)) detectedLanguages.add('javascript');
|
|
418
|
-
if (ext === 'py') detectedLanguages.add('python');
|
|
419
|
-
}
|
|
420
|
-
|
|
421
|
-
return ok({
|
|
422
|
-
filesIndexed: indexResult.filesIndexed,
|
|
423
|
-
nodesCreated: indexResult.nodesCreated,
|
|
424
|
-
edgesCreated: indexResult.edgesCreated,
|
|
425
|
-
target: targetPath,
|
|
426
|
-
incremental: payload.incremental || false,
|
|
427
|
-
languages: Array.from(detectedLanguages),
|
|
428
|
-
duration: indexResult.duration,
|
|
429
|
-
errors: indexResult.errors,
|
|
430
|
-
});
|
|
431
|
-
} catch (error) {
|
|
432
|
-
return err(error instanceof Error ? error : new Error(String(error)));
|
|
433
|
-
}
|
|
434
|
-
});
|
|
435
|
-
|
|
436
|
-
// Register quality assessment handler - REAL IMPLEMENTATION
|
|
437
|
-
taskHandlers.set('assess-quality', async (task, kernel) => {
|
|
438
|
-
const payload = task.payload as {
|
|
439
|
-
runGate: boolean;
|
|
440
|
-
threshold: number;
|
|
441
|
-
metrics: string[];
|
|
442
|
-
sourceFiles?: string[];
|
|
443
|
-
target?: string;
|
|
444
|
-
};
|
|
445
|
-
|
|
446
|
-
try {
|
|
447
|
-
const analyzer = getQualityAnalyzer(kernel.memory);
|
|
448
|
-
const threshold = payload.threshold || 80;
|
|
449
|
-
|
|
450
|
-
// Determine source files to analyze
|
|
451
|
-
let sourceFiles: string[] = [];
|
|
452
|
-
if (payload.sourceFiles && payload.sourceFiles.length > 0) {
|
|
453
|
-
sourceFiles = payload.sourceFiles;
|
|
454
|
-
} else if (payload.target) {
|
|
455
|
-
sourceFiles = await discoverSourceFiles(payload.target, { includeTests: false });
|
|
456
|
-
} else {
|
|
457
|
-
sourceFiles = await discoverSourceFiles(process.cwd(), { includeTests: false });
|
|
458
|
-
}
|
|
459
|
-
|
|
460
|
-
if (sourceFiles.length === 0) {
|
|
461
|
-
return ok({
|
|
462
|
-
qualityScore: 0,
|
|
463
|
-
passed: false,
|
|
464
|
-
threshold,
|
|
465
|
-
metrics: {
|
|
466
|
-
coverage: 0,
|
|
467
|
-
complexity: 0,
|
|
468
|
-
maintainability: 0,
|
|
469
|
-
testability: 0,
|
|
470
|
-
},
|
|
471
|
-
recommendations: ['No source files found for quality assessment'],
|
|
472
|
-
warning: 'No source files found',
|
|
473
|
-
});
|
|
474
|
-
}
|
|
475
|
-
|
|
476
|
-
// Use the real QualityAnalyzerService
|
|
477
|
-
const result = await analyzer.analyzeQuality({
|
|
478
|
-
sourceFiles,
|
|
479
|
-
includeMetrics: payload.metrics || ['coverage', 'complexity', 'maintainability', 'testability'],
|
|
480
|
-
});
|
|
481
|
-
|
|
482
|
-
if (!result.success) {
|
|
483
|
-
return result;
|
|
484
|
-
}
|
|
485
|
-
|
|
486
|
-
const report = result.value;
|
|
487
|
-
const passed = report.score.overall >= threshold;
|
|
488
|
-
|
|
489
|
-
// Convert metrics to the expected format
|
|
490
|
-
const metrics: Record<string, number> = {};
|
|
491
|
-
for (const metric of report.metrics) {
|
|
492
|
-
metrics[metric.name] = metric.value;
|
|
493
|
-
}
|
|
494
|
-
|
|
495
|
-
return ok({
|
|
496
|
-
qualityScore: report.score.overall,
|
|
497
|
-
passed,
|
|
498
|
-
threshold,
|
|
499
|
-
metrics: {
|
|
500
|
-
coverage: report.score.coverage,
|
|
501
|
-
complexity: report.score.complexity,
|
|
502
|
-
maintainability: report.score.maintainability,
|
|
503
|
-
security: report.score.security,
|
|
504
|
-
...metrics,
|
|
505
|
-
},
|
|
506
|
-
recommendations: report.recommendations.map(r => `[${r.type}] ${r.title}: ${r.description}`),
|
|
507
|
-
trends: report.trends.map(t => ({
|
|
508
|
-
metric: t.metric,
|
|
509
|
-
direction: t.direction,
|
|
510
|
-
dataPoints: t.dataPoints.length,
|
|
511
|
-
})),
|
|
512
|
-
filesAnalyzed: sourceFiles.length,
|
|
513
|
-
});
|
|
514
|
-
} catch (error) {
|
|
515
|
-
return err(error instanceof Error ? error : new Error(String(error)));
|
|
516
|
-
}
|
|
517
|
-
});
|
|
518
|
-
|
|
519
|
-
// Register test execution handler
|
|
520
|
-
taskHandlers.set('execute-tests', async (task, _kernel) => {
|
|
521
|
-
const payload = task.payload as {
|
|
522
|
-
testFiles: string[];
|
|
523
|
-
parallel: boolean;
|
|
524
|
-
retryCount: number;
|
|
525
|
-
};
|
|
526
|
-
|
|
527
|
-
// In production, would actually run tests via test runner
|
|
528
|
-
const testCount = payload.testFiles?.length || 10;
|
|
529
|
-
const passed = Math.floor(testCount * 0.9);
|
|
530
|
-
const failed = testCount - passed;
|
|
531
|
-
|
|
532
|
-
return ok({
|
|
533
|
-
total: testCount,
|
|
534
|
-
passed,
|
|
535
|
-
failed,
|
|
536
|
-
skipped: 0,
|
|
537
|
-
duration: testCount * 50, // ~50ms per test
|
|
538
|
-
coverage: 82.5,
|
|
539
|
-
failedTests: failed > 0 ? ['example.test.ts:42'] : [],
|
|
540
|
-
});
|
|
541
|
-
});
|
|
542
|
-
|
|
543
|
-
// Register defect prediction handler
|
|
544
|
-
taskHandlers.set('predict-defects', async (task, _kernel) => {
|
|
545
|
-
const payload = task.payload as {
|
|
546
|
-
target: string;
|
|
547
|
-
minConfidence: number;
|
|
548
|
-
};
|
|
549
|
-
|
|
550
|
-
return ok({
|
|
551
|
-
predictedDefects: [
|
|
552
|
-
{
|
|
553
|
-
file: `${payload.target}/complex-module.ts`,
|
|
554
|
-
probability: 0.78,
|
|
555
|
-
reason: 'High cyclomatic complexity combined with low test coverage',
|
|
556
|
-
},
|
|
557
|
-
{
|
|
558
|
-
file: `${payload.target}/legacy-handler.ts`,
|
|
559
|
-
probability: 0.65,
|
|
560
|
-
reason: 'Frequent changes in recent commits with error-prone patterns',
|
|
561
|
-
},
|
|
562
|
-
],
|
|
563
|
-
riskScore: 42,
|
|
564
|
-
recommendations: [
|
|
565
|
-
'Add integration tests for complex-module.ts',
|
|
566
|
-
'Refactor legacy-handler.ts to reduce complexity',
|
|
567
|
-
],
|
|
568
|
-
});
|
|
569
|
-
});
|
|
570
|
-
|
|
571
|
-
// Register requirements validation handler
|
|
572
|
-
taskHandlers.set('validate-requirements', async (task, _kernel) => {
|
|
573
|
-
const payload = task.payload as {
|
|
574
|
-
generateBDD: boolean;
|
|
575
|
-
};
|
|
576
|
-
|
|
577
|
-
return ok({
|
|
578
|
-
requirementsAnalyzed: 15,
|
|
579
|
-
testable: 12,
|
|
580
|
-
ambiguous: 2,
|
|
581
|
-
untestable: 1,
|
|
582
|
-
coverage: 80,
|
|
583
|
-
bddScenarios: payload.generateBDD ? [
|
|
584
|
-
'Given a user is logged in, When they view the dashboard, Then they see their metrics',
|
|
585
|
-
'Given an API request fails, When the retry limit is exceeded, Then an error is returned',
|
|
586
|
-
] : [],
|
|
587
|
-
});
|
|
588
|
-
});
|
|
589
|
-
|
|
590
|
-
// Register contract validation handler
|
|
591
|
-
taskHandlers.set('validate-contracts', async (task, _kernel) => {
|
|
592
|
-
const payload = task.payload as {
|
|
593
|
-
contractPath: string;
|
|
594
|
-
checkBreakingChanges: boolean;
|
|
595
|
-
};
|
|
596
|
-
|
|
597
|
-
return ok({
|
|
598
|
-
contractPath: payload.contractPath,
|
|
599
|
-
valid: true,
|
|
600
|
-
breakingChanges: [],
|
|
601
|
-
warnings: [
|
|
602
|
-
'Deprecated field "legacyId" should be removed in next major version',
|
|
603
|
-
],
|
|
604
|
-
coverage: 95,
|
|
605
|
-
});
|
|
606
|
-
});
|
|
607
|
-
|
|
608
|
-
// Register accessibility test handler
|
|
609
|
-
taskHandlers.set('test-accessibility', async (task, _kernel) => {
|
|
610
|
-
const payload = task.payload as {
|
|
611
|
-
url: string;
|
|
612
|
-
standard: string;
|
|
613
|
-
};
|
|
614
|
-
|
|
615
|
-
return ok({
|
|
616
|
-
url: payload.url,
|
|
617
|
-
standard: payload.standard || 'wcag21-aa',
|
|
618
|
-
passed: true,
|
|
619
|
-
violations: [],
|
|
620
|
-
warnings: [
|
|
621
|
-
{ rule: 'color-contrast', impact: 'minor', element: 'nav > a' },
|
|
622
|
-
],
|
|
623
|
-
score: 94,
|
|
624
|
-
});
|
|
625
|
-
});
|
|
626
|
-
|
|
627
|
-
// Register chaos test handler
|
|
628
|
-
taskHandlers.set('run-chaos', async (task, _kernel) => {
|
|
629
|
-
const payload = task.payload as {
|
|
630
|
-
faultType: string;
|
|
631
|
-
target: string;
|
|
632
|
-
duration: number;
|
|
633
|
-
dryRun: boolean;
|
|
634
|
-
};
|
|
635
|
-
|
|
636
|
-
return ok({
|
|
637
|
-
faultType: payload.faultType,
|
|
638
|
-
target: payload.target,
|
|
639
|
-
dryRun: payload.dryRun,
|
|
640
|
-
duration: payload.duration,
|
|
641
|
-
systemBehavior: payload.dryRun ? 'simulated' : 'tested',
|
|
642
|
-
resilience: {
|
|
643
|
-
recovered: true,
|
|
644
|
-
recoveryTime: 2500,
|
|
645
|
-
dataLoss: false,
|
|
646
|
-
},
|
|
647
|
-
});
|
|
648
|
-
});
|
|
649
|
-
|
|
650
|
-
// Register learning optimization handler
|
|
651
|
-
taskHandlers.set('optimize-learning', async (task, _kernel) => {
|
|
652
|
-
return ok({
|
|
653
|
-
patternsLearned: 12,
|
|
654
|
-
modelsUpdated: 3,
|
|
655
|
-
memoryConsolidated: true,
|
|
656
|
-
recommendations: [
|
|
657
|
-
'Pattern recognition improved for error handling',
|
|
658
|
-
'Test generation templates optimized',
|
|
659
|
-
],
|
|
660
|
-
});
|
|
661
|
-
});
|
|
662
|
-
|
|
663
|
-
// ============================================================================
|
|
664
|
-
// Helper Functions for Real Implementations
|
|
665
|
-
// ============================================================================
|
|
666
|
-
|
|
667
|
-
/**
|
|
668
|
-
* Load coverage data from common coverage file formats
|
|
669
|
-
*/
|
|
670
|
-
async function loadCoverageData(targetPath: string): Promise<CoverageData | null> {
|
|
671
|
-
// Try various coverage file locations
|
|
672
|
-
const coverageLocations = [
|
|
673
|
-
path.join(targetPath, 'coverage', 'coverage-final.json'),
|
|
674
|
-
path.join(targetPath, 'coverage', 'lcov.info'),
|
|
675
|
-
path.join(targetPath, '.nyc_output', 'coverage-final.json'),
|
|
676
|
-
path.join(targetPath, 'coverage-final.json'),
|
|
677
|
-
];
|
|
678
|
-
|
|
679
|
-
for (const coveragePath of coverageLocations) {
|
|
680
|
-
try {
|
|
681
|
-
const content = await fs.readFile(coveragePath, 'utf-8');
|
|
682
|
-
|
|
683
|
-
if (coveragePath.endsWith('.json')) {
|
|
684
|
-
return parseCoverageJson(content);
|
|
685
|
-
} else if (coveragePath.endsWith('.info')) {
|
|
686
|
-
return parseLcovInfo(content);
|
|
687
|
-
}
|
|
688
|
-
} catch {
|
|
689
|
-
// File not found, try next
|
|
690
|
-
}
|
|
691
|
-
}
|
|
692
|
-
|
|
693
|
-
return null;
|
|
694
|
-
}
|
|
695
|
-
|
|
696
|
-
/**
|
|
697
|
-
* Parse Istanbul/nyc coverage-final.json format
|
|
698
|
-
*/
|
|
699
|
-
function parseCoverageJson(content: string): CoverageData {
|
|
700
|
-
const data = JSON.parse(content);
|
|
701
|
-
const files: FileCoverage[] = [];
|
|
702
|
-
let totalLines = 0, coveredLines = 0;
|
|
703
|
-
let totalBranches = 0, coveredBranches = 0;
|
|
704
|
-
let totalFunctions = 0, coveredFunctions = 0;
|
|
705
|
-
let totalStatements = 0, coveredStatements = 0;
|
|
706
|
-
|
|
707
|
-
for (const [filePath, fileData] of Object.entries(data)) {
|
|
708
|
-
const fd = fileData as any;
|
|
709
|
-
|
|
710
|
-
// Calculate file-level metrics
|
|
711
|
-
const lineMap = fd.statementMap || {};
|
|
712
|
-
const lineCounts = fd.s || {};
|
|
713
|
-
const branchMap = fd.branchMap || {};
|
|
714
|
-
const branchCounts = fd.b || {};
|
|
715
|
-
const fnMap = fd.fnMap || {};
|
|
716
|
-
const fnCounts = fd.f || {};
|
|
717
|
-
|
|
718
|
-
const fileLines = Object.keys(lineCounts).length;
|
|
719
|
-
const fileCoveredLines = Object.values(lineCounts).filter((v: any) => v > 0).length;
|
|
720
|
-
const fileBranches = Object.values(branchCounts).flat().length;
|
|
721
|
-
const fileCoveredBranches = Object.values(branchCounts).flat().filter((v: any) => v > 0).length;
|
|
722
|
-
const fileFunctions = Object.keys(fnCounts).length;
|
|
723
|
-
const fileCoveredFunctions = Object.values(fnCounts).filter((v: any) => v > 0).length;
|
|
724
|
-
const fileStatements = Object.keys(lineMap).length;
|
|
725
|
-
const fileCoveredStatements = Object.values(lineCounts).filter((v: any) => v > 0).length;
|
|
726
|
-
|
|
727
|
-
// Find uncovered lines
|
|
728
|
-
const uncoveredLines: number[] = [];
|
|
729
|
-
for (const [key, count] of Object.entries(lineCounts)) {
|
|
730
|
-
if (count === 0) {
|
|
731
|
-
const stmtInfo = lineMap[key];
|
|
732
|
-
if (stmtInfo?.start?.line) {
|
|
733
|
-
uncoveredLines.push(stmtInfo.start.line);
|
|
734
|
-
}
|
|
735
|
-
}
|
|
736
|
-
}
|
|
737
|
-
|
|
738
|
-
// Find uncovered branches
|
|
739
|
-
const uncoveredBranches: number[] = [];
|
|
740
|
-
for (const [branchId, counts] of Object.entries(branchCounts)) {
|
|
741
|
-
const branchInfo = branchMap[branchId];
|
|
742
|
-
(counts as number[]).forEach((count, idx) => {
|
|
743
|
-
if (count === 0 && branchInfo?.locations?.[idx]?.start?.line) {
|
|
744
|
-
uncoveredBranches.push(branchInfo.locations[idx].start.line);
|
|
745
|
-
}
|
|
746
|
-
});
|
|
747
|
-
}
|
|
748
|
-
|
|
749
|
-
files.push({
|
|
750
|
-
path: filePath,
|
|
751
|
-
lines: { covered: fileCoveredLines, total: fileLines },
|
|
752
|
-
branches: { covered: fileCoveredBranches, total: fileBranches },
|
|
753
|
-
functions: { covered: fileCoveredFunctions, total: fileFunctions },
|
|
754
|
-
statements: { covered: fileCoveredStatements, total: fileStatements },
|
|
755
|
-
uncoveredLines: Array.from(new Set(uncoveredLines)).sort((a, b) => a - b),
|
|
756
|
-
uncoveredBranches: Array.from(new Set(uncoveredBranches)).sort((a, b) => a - b),
|
|
757
|
-
});
|
|
758
|
-
|
|
759
|
-
totalLines += fileLines;
|
|
760
|
-
coveredLines += fileCoveredLines;
|
|
761
|
-
totalBranches += fileBranches;
|
|
762
|
-
coveredBranches += fileCoveredBranches;
|
|
763
|
-
totalFunctions += fileFunctions;
|
|
764
|
-
coveredFunctions += fileCoveredFunctions;
|
|
765
|
-
totalStatements += fileStatements;
|
|
766
|
-
coveredStatements += fileCoveredStatements;
|
|
767
|
-
}
|
|
768
|
-
|
|
769
|
-
return {
|
|
770
|
-
files,
|
|
771
|
-
summary: {
|
|
772
|
-
line: totalLines > 0 ? (coveredLines / totalLines) * 100 : 0,
|
|
773
|
-
branch: totalBranches > 0 ? (coveredBranches / totalBranches) * 100 : 0,
|
|
774
|
-
function: totalFunctions > 0 ? (coveredFunctions / totalFunctions) * 100 : 0,
|
|
775
|
-
statement: totalStatements > 0 ? (coveredStatements / totalStatements) * 100 : 0,
|
|
776
|
-
files: files.length,
|
|
777
|
-
},
|
|
778
|
-
};
|
|
779
|
-
}
|
|
780
|
-
|
|
781
|
-
/**
|
|
782
|
-
* Parse LCOV info format
|
|
783
|
-
*/
|
|
784
|
-
function parseLcovInfo(content: string): CoverageData {
|
|
785
|
-
const files: FileCoverage[] = [];
|
|
786
|
-
const lines = content.split('\n');
|
|
787
|
-
|
|
788
|
-
let currentFile: string | null = null;
|
|
789
|
-
let linesTotal = 0, linesCovered = 0;
|
|
790
|
-
let branchesTotal = 0, branchesCovered = 0;
|
|
791
|
-
let functionsTotal = 0, functionsCovered = 0;
|
|
792
|
-
const uncoveredLines: number[] = [];
|
|
793
|
-
const uncoveredBranches: number[] = [];
|
|
794
|
-
|
|
795
|
-
for (const line of lines) {
|
|
796
|
-
if (line.startsWith('SF:')) {
|
|
797
|
-
currentFile = line.slice(3);
|
|
798
|
-
} else if (line.startsWith('LF:')) {
|
|
799
|
-
linesTotal = parseInt(line.slice(3), 10);
|
|
800
|
-
} else if (line.startsWith('LH:')) {
|
|
801
|
-
linesCovered = parseInt(line.slice(3), 10);
|
|
802
|
-
} else if (line.startsWith('BRF:')) {
|
|
803
|
-
branchesTotal = parseInt(line.slice(4), 10);
|
|
804
|
-
} else if (line.startsWith('BRH:')) {
|
|
805
|
-
branchesCovered = parseInt(line.slice(4), 10);
|
|
806
|
-
} else if (line.startsWith('FNF:')) {
|
|
807
|
-
functionsTotal = parseInt(line.slice(4), 10);
|
|
808
|
-
} else if (line.startsWith('FNH:')) {
|
|
809
|
-
functionsCovered = parseInt(line.slice(4), 10);
|
|
810
|
-
} else if (line.startsWith('DA:')) {
|
|
811
|
-
const [lineNum, count] = line.slice(3).split(',').map(s => parseInt(s, 10));
|
|
812
|
-
if (count === 0) {
|
|
813
|
-
uncoveredLines.push(lineNum);
|
|
814
|
-
}
|
|
815
|
-
} else if (line.startsWith('BRDA:')) {
|
|
816
|
-
const parts = line.slice(5).split(',');
|
|
817
|
-
const lineNum = parseInt(parts[0], 10);
|
|
818
|
-
const taken = parts[3];
|
|
819
|
-
if (taken === '0' || taken === '-') {
|
|
820
|
-
uncoveredBranches.push(lineNum);
|
|
821
|
-
}
|
|
822
|
-
} else if (line === 'end_of_record' && currentFile) {
|
|
823
|
-
files.push({
|
|
824
|
-
path: currentFile,
|
|
825
|
-
lines: { covered: linesCovered, total: linesTotal },
|
|
826
|
-
branches: { covered: branchesCovered, total: branchesTotal },
|
|
827
|
-
functions: { covered: functionsCovered, total: functionsTotal },
|
|
828
|
-
statements: { covered: linesCovered, total: linesTotal },
|
|
829
|
-
uncoveredLines: Array.from(new Set(uncoveredLines)),
|
|
830
|
-
uncoveredBranches: Array.from(new Set(uncoveredBranches)),
|
|
831
|
-
});
|
|
832
|
-
|
|
833
|
-
// Reset for next file
|
|
834
|
-
currentFile = null;
|
|
835
|
-
linesTotal = linesCovered = 0;
|
|
836
|
-
branchesTotal = branchesCovered = 0;
|
|
837
|
-
functionsTotal = functionsCovered = 0;
|
|
838
|
-
uncoveredLines.length = 0;
|
|
839
|
-
uncoveredBranches.length = 0;
|
|
840
|
-
}
|
|
841
|
-
}
|
|
842
|
-
|
|
843
|
-
// Calculate summary
|
|
844
|
-
let totalLines = 0, totalCoveredLines = 0;
|
|
845
|
-
let totalBranches = 0, totalCoveredBranches = 0;
|
|
846
|
-
let totalFunctions = 0, totalCoveredFunctions = 0;
|
|
847
|
-
|
|
848
|
-
for (const file of files) {
|
|
849
|
-
totalLines += file.lines.total;
|
|
850
|
-
totalCoveredLines += file.lines.covered;
|
|
851
|
-
totalBranches += file.branches.total;
|
|
852
|
-
totalCoveredBranches += file.branches.covered;
|
|
853
|
-
totalFunctions += file.functions.total;
|
|
854
|
-
totalCoveredFunctions += file.functions.covered;
|
|
855
|
-
}
|
|
856
|
-
|
|
857
|
-
return {
|
|
858
|
-
files,
|
|
859
|
-
summary: {
|
|
860
|
-
line: totalLines > 0 ? (totalCoveredLines / totalLines) * 100 : 0,
|
|
861
|
-
branch: totalBranches > 0 ? (totalCoveredBranches / totalBranches) * 100 : 0,
|
|
862
|
-
function: totalFunctions > 0 ? (totalCoveredFunctions / totalFunctions) * 100 : 0,
|
|
863
|
-
statement: totalLines > 0 ? (totalCoveredLines / totalLines) * 100 : 0,
|
|
864
|
-
files: files.length,
|
|
865
|
-
},
|
|
866
|
-
};
|
|
867
|
-
}
|
|
868
|
-
|
|
869
|
-
/**
|
|
870
|
-
* Discover source files in a directory
|
|
871
|
-
*/
|
|
872
|
-
async function discoverSourceFiles(
|
|
873
|
-
targetPath: string,
|
|
874
|
-
options: { includeTests?: boolean; languages?: string[] } = {}
|
|
875
|
-
): Promise<string[]> {
|
|
876
|
-
const files: string[] = [];
|
|
877
|
-
const { includeTests = true, languages } = options;
|
|
878
|
-
|
|
879
|
-
// Determine file extensions to include
|
|
880
|
-
let extensions = ['.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs'];
|
|
881
|
-
if (languages && languages.length > 0) {
|
|
882
|
-
extensions = [];
|
|
883
|
-
for (const lang of languages) {
|
|
884
|
-
if (lang === 'typescript') extensions.push('.ts', '.tsx');
|
|
885
|
-
if (lang === 'javascript') extensions.push('.js', '.jsx', '.mjs', '.cjs');
|
|
886
|
-
if (lang === 'python') extensions.push('.py');
|
|
887
|
-
}
|
|
888
|
-
}
|
|
889
|
-
|
|
890
|
-
async function walkDir(dir: string): Promise<void> {
|
|
891
|
-
try {
|
|
892
|
-
const entries = await fs.readdir(dir, { withFileTypes: true });
|
|
893
|
-
|
|
894
|
-
for (const entry of entries) {
|
|
895
|
-
const fullPath = path.join(dir, entry.name);
|
|
896
|
-
|
|
897
|
-
// Skip common non-source directories
|
|
898
|
-
if (entry.isDirectory()) {
|
|
899
|
-
if (['node_modules', '.git', 'dist', 'build', 'coverage', '.nyc_output'].includes(entry.name)) {
|
|
900
|
-
continue;
|
|
901
|
-
}
|
|
902
|
-
await walkDir(fullPath);
|
|
903
|
-
} else if (entry.isFile()) {
|
|
904
|
-
const ext = path.extname(entry.name);
|
|
905
|
-
|
|
906
|
-
// Check extension
|
|
907
|
-
if (!extensions.includes(ext)) continue;
|
|
908
|
-
|
|
909
|
-
// Skip test files if not including tests
|
|
910
|
-
if (!includeTests) {
|
|
911
|
-
const isTestFile = entry.name.includes('.test.') ||
|
|
912
|
-
entry.name.includes('.spec.') ||
|
|
913
|
-
entry.name.endsWith('_test.ts') ||
|
|
914
|
-
entry.name.endsWith('_test.js') ||
|
|
915
|
-
fullPath.includes('/__tests__/') ||
|
|
916
|
-
fullPath.includes('/test/') ||
|
|
917
|
-
fullPath.includes('/tests/');
|
|
918
|
-
if (isTestFile) continue;
|
|
919
|
-
}
|
|
920
|
-
|
|
921
|
-
files.push(fullPath);
|
|
922
|
-
}
|
|
923
|
-
}
|
|
924
|
-
} catch {
|
|
925
|
-
// Directory not accessible
|
|
926
|
-
}
|
|
927
|
-
}
|
|
928
|
-
|
|
929
|
-
// Check if targetPath is a file or directory
|
|
930
|
-
try {
|
|
931
|
-
const stat = await fs.stat(targetPath);
|
|
932
|
-
if (stat.isFile()) {
|
|
933
|
-
return [targetPath];
|
|
934
|
-
}
|
|
935
|
-
await walkDir(targetPath);
|
|
936
|
-
} catch {
|
|
937
|
-
// Path doesn't exist
|
|
938
|
-
}
|
|
939
|
-
|
|
940
|
-
return files;
|
|
941
|
-
}
|
|
942
|
-
|
|
943
|
-
/**
|
|
944
|
-
* Generate security recommendations based on findings
|
|
945
|
-
*/
|
|
946
|
-
function generateSecurityRecommendations(vulnerabilities: Array<{ category: string; severity: string }>): string[] {
|
|
947
|
-
const recommendations = new Set<string>();
|
|
948
|
-
|
|
949
|
-
const categoryRecommendations: Record<string, string> = {
|
|
950
|
-
'injection': 'Use parameterized queries and input validation to prevent injection attacks',
|
|
951
|
-
'xss': 'Sanitize user input and use Content-Security-Policy headers',
|
|
952
|
-
'sensitive-data': 'Never hardcode secrets; use environment variables or secret managers',
|
|
953
|
-
'access-control': 'Implement proper authentication and authorization checks',
|
|
954
|
-
'security-misconfiguration': 'Review and harden security configurations',
|
|
955
|
-
'insecure-deserialization': 'Avoid deserializing untrusted data; use safe alternatives',
|
|
956
|
-
'broken-auth': 'Use strong authentication mechanisms and secure session management',
|
|
957
|
-
'dependencies': 'Keep dependencies updated and regularly audit for vulnerabilities',
|
|
958
|
-
};
|
|
959
|
-
|
|
960
|
-
// Add category-specific recommendations
|
|
961
|
-
for (const vuln of vulnerabilities) {
|
|
962
|
-
const rec = categoryRecommendations[vuln.category];
|
|
963
|
-
if (rec) {
|
|
964
|
-
recommendations.add(rec);
|
|
965
|
-
}
|
|
966
|
-
}
|
|
967
|
-
|
|
968
|
-
// Add severity-based general recommendations
|
|
969
|
-
const hasCritical = vulnerabilities.some(v => v.severity === 'critical');
|
|
970
|
-
const hasHigh = vulnerabilities.some(v => v.severity === 'high');
|
|
971
|
-
|
|
972
|
-
if (hasCritical) {
|
|
973
|
-
recommendations.add('CRITICAL: Address critical vulnerabilities immediately before deployment');
|
|
974
|
-
}
|
|
975
|
-
if (hasHigh) {
|
|
976
|
-
recommendations.add('Prioritize fixing high-severity issues in the next sprint');
|
|
977
|
-
}
|
|
978
|
-
|
|
979
|
-
if (recommendations.size === 0 && vulnerabilities.length === 0) {
|
|
980
|
-
recommendations.add('No vulnerabilities found - maintain current security practices');
|
|
981
|
-
}
|
|
982
|
-
|
|
983
|
-
return Array.from(recommendations);
|
|
984
|
-
}
|
|
985
|
-
|
|
986
|
-
// ============================================================================
|
|
987
|
-
// Task Executor
|
|
988
|
-
// ============================================================================
|
|
989
|
-
|
|
990
|
-
export class DomainTaskExecutor {
|
|
991
|
-
private readonly config: TaskExecutorConfig;
|
|
992
|
-
private readonly resultSaver: ResultSaver;
|
|
993
|
-
|
|
994
|
-
constructor(
|
|
995
|
-
private readonly kernel: QEKernel,
|
|
996
|
-
private readonly eventBus: EventBus,
|
|
997
|
-
config?: Partial<TaskExecutorConfig>
|
|
998
|
-
) {
|
|
999
|
-
this.config = {
|
|
1000
|
-
timeout: config?.timeout ?? 300000,
|
|
1001
|
-
maxRetries: config?.maxRetries ?? 3,
|
|
1002
|
-
enableCaching: config?.enableCaching ?? true,
|
|
1003
|
-
saveResults: config?.saveResults ?? true,
|
|
1004
|
-
resultsDir: config?.resultsDir ?? '.agentic-qe',
|
|
1005
|
-
defaultLanguage: config?.defaultLanguage ?? 'typescript',
|
|
1006
|
-
defaultFramework: config?.defaultFramework ?? 'vitest',
|
|
1007
|
-
};
|
|
1008
|
-
this.resultSaver = createResultSaver(this.config.resultsDir);
|
|
1009
|
-
}
|
|
1010
|
-
|
|
1011
|
-
/**
|
|
1012
|
-
* Execute a task and return results
|
|
1013
|
-
*/
|
|
1014
|
-
async execute(task: QueenTask): Promise<TaskResult> {
|
|
1015
|
-
const startTime = Date.now();
|
|
1016
|
-
const domain = this.getTaskDomain(task.type);
|
|
1017
|
-
|
|
1018
|
-
try {
|
|
1019
|
-
const handler = taskHandlers.get(task.type);
|
|
1020
|
-
|
|
1021
|
-
if (!handler) {
|
|
1022
|
-
return {
|
|
1023
|
-
taskId: task.id,
|
|
1024
|
-
success: false,
|
|
1025
|
-
error: `No handler registered for task type: ${task.type}`,
|
|
1026
|
-
duration: Date.now() - startTime,
|
|
1027
|
-
domain,
|
|
1028
|
-
};
|
|
1029
|
-
}
|
|
1030
|
-
|
|
1031
|
-
// Execute with timeout
|
|
1032
|
-
const result = await Promise.race([
|
|
1033
|
-
handler(task, this.kernel),
|
|
1034
|
-
this.timeout(task.timeout || this.config.timeout),
|
|
1035
|
-
]);
|
|
1036
|
-
|
|
1037
|
-
if (!result.success) {
|
|
1038
|
-
const errorMsg = 'error' in result ? (result.error as Error).message : 'Unknown error';
|
|
1039
|
-
await this.publishTaskFailed(task.id, errorMsg, domain);
|
|
1040
|
-
return {
|
|
1041
|
-
taskId: task.id,
|
|
1042
|
-
success: false,
|
|
1043
|
-
error: errorMsg,
|
|
1044
|
-
duration: Date.now() - startTime,
|
|
1045
|
-
domain,
|
|
1046
|
-
};
|
|
1047
|
-
}
|
|
1048
|
-
|
|
1049
|
-
await this.publishTaskCompleted(task.id, result.value, domain);
|
|
1050
|
-
|
|
1051
|
-
// Save results to files if enabled
|
|
1052
|
-
let savedFiles: string[] | undefined;
|
|
1053
|
-
if (this.config.saveResults) {
|
|
1054
|
-
try {
|
|
1055
|
-
const saveOptions: SaveOptions = {
|
|
1056
|
-
language: (task.payload as Record<string, unknown>)?.language as string || this.config.defaultLanguage,
|
|
1057
|
-
framework: (task.payload as Record<string, unknown>)?.framework as string || this.config.defaultFramework,
|
|
1058
|
-
includeSecondary: true,
|
|
1059
|
-
};
|
|
1060
|
-
const saved = await this.resultSaver.save(task.id, task.type, result.value, saveOptions);
|
|
1061
|
-
savedFiles = saved.files.map(f => f.path);
|
|
1062
|
-
} catch (saveError) {
|
|
1063
|
-
// Log but don't fail the task if saving fails
|
|
1064
|
-
console.error(`[TaskExecutor] Failed to save results: ${saveError}`);
|
|
1065
|
-
}
|
|
1066
|
-
}
|
|
1067
|
-
|
|
1068
|
-
return {
|
|
1069
|
-
taskId: task.id,
|
|
1070
|
-
success: true,
|
|
1071
|
-
data: result.value,
|
|
1072
|
-
duration: Date.now() - startTime,
|
|
1073
|
-
domain,
|
|
1074
|
-
savedFiles,
|
|
1075
|
-
};
|
|
1076
|
-
} catch (error) {
|
|
1077
|
-
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
1078
|
-
await this.publishTaskFailed(task.id, errorMessage, domain);
|
|
1079
|
-
|
|
1080
|
-
return {
|
|
1081
|
-
taskId: task.id,
|
|
1082
|
-
success: false,
|
|
1083
|
-
error: errorMessage,
|
|
1084
|
-
duration: Date.now() - startTime,
|
|
1085
|
-
domain,
|
|
1086
|
-
};
|
|
1087
|
-
}
|
|
1088
|
-
}
|
|
1089
|
-
|
|
1090
|
-
private getTaskDomain(taskType: TaskType): DomainName {
|
|
1091
|
-
const domainMap: Record<TaskType, DomainName> = {
|
|
1092
|
-
'generate-tests': 'test-generation',
|
|
1093
|
-
'execute-tests': 'test-execution',
|
|
1094
|
-
'analyze-coverage': 'coverage-analysis',
|
|
1095
|
-
'assess-quality': 'quality-assessment',
|
|
1096
|
-
'predict-defects': 'defect-intelligence',
|
|
1097
|
-
'validate-requirements': 'requirements-validation',
|
|
1098
|
-
'index-code': 'code-intelligence',
|
|
1099
|
-
'scan-security': 'security-compliance',
|
|
1100
|
-
'validate-contracts': 'contract-testing',
|
|
1101
|
-
'test-accessibility': 'visual-accessibility',
|
|
1102
|
-
'run-chaos': 'chaos-resilience',
|
|
1103
|
-
'optimize-learning': 'learning-optimization',
|
|
1104
|
-
'cross-domain-workflow': 'learning-optimization',
|
|
1105
|
-
'protocol-execution': 'learning-optimization',
|
|
1106
|
-
};
|
|
1107
|
-
return domainMap[taskType] || 'learning-optimization';
|
|
1108
|
-
}
|
|
1109
|
-
|
|
1110
|
-
private async timeout(ms: number): Promise<never> {
|
|
1111
|
-
return new Promise((_, reject) => {
|
|
1112
|
-
setTimeout(() => reject(new Error(`Task execution timed out after ${ms}ms`)), ms);
|
|
1113
|
-
});
|
|
1114
|
-
}
|
|
1115
|
-
|
|
1116
|
-
private async publishTaskCompleted(taskId: string, result: unknown, domain: DomainName): Promise<void> {
|
|
1117
|
-
await this.eventBus.publish({
|
|
1118
|
-
id: uuidv4(),
|
|
1119
|
-
type: 'TaskCompleted',
|
|
1120
|
-
timestamp: new Date(),
|
|
1121
|
-
source: domain,
|
|
1122
|
-
payload: { taskId, result },
|
|
1123
|
-
});
|
|
1124
|
-
}
|
|
1125
|
-
|
|
1126
|
-
private async publishTaskFailed(taskId: string, error: string, domain: DomainName): Promise<void> {
|
|
1127
|
-
await this.eventBus.publish({
|
|
1128
|
-
id: uuidv4(),
|
|
1129
|
-
type: 'TaskFailed',
|
|
1130
|
-
timestamp: new Date(),
|
|
1131
|
-
source: domain,
|
|
1132
|
-
payload: { taskId, error },
|
|
1133
|
-
});
|
|
1134
|
-
}
|
|
1135
|
-
}
|
|
1136
|
-
|
|
1137
|
-
// ============================================================================
|
|
1138
|
-
// Factory
|
|
1139
|
-
// ============================================================================
|
|
1140
|
-
|
|
1141
|
-
export function createTaskExecutor(
|
|
1142
|
-
kernel: QEKernel,
|
|
1143
|
-
config?: Partial<TaskExecutorConfig>
|
|
1144
|
-
): DomainTaskExecutor {
|
|
1145
|
-
return new DomainTaskExecutor(kernel, kernel.eventBus, config);
|
|
1146
|
-
}
|