@agentic-qe/v3 3.0.0-alpha.6 → 3.0.0-alpha.8
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 +23 -13
- package/dist/init/agents-installer.js +4 -4
- package/dist/init/agents-installer.js.map +1 -1
- package/dist/init/init-wizard.d.ts.map +1 -1
- package/dist/init/init-wizard.js +15 -5
- package/dist/init/init-wizard.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,852 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Agentic QE v3 - Defect Prediction Service
|
|
3
|
-
* ML-based defect prediction using code metrics and historical data
|
|
4
|
-
* Uses GitAnalyzer for real git history analysis
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
import { v4 as uuidv4 } from 'uuid';
|
|
8
|
-
import { Result, ok, err, Severity } from '../../../shared/types';
|
|
9
|
-
import { MemoryBackend } from '../../../kernel/interfaces';
|
|
10
|
-
import {
|
|
11
|
-
PredictRequest,
|
|
12
|
-
PredictionResult,
|
|
13
|
-
FilePrediction,
|
|
14
|
-
PredictionFeature,
|
|
15
|
-
RegressionRequest,
|
|
16
|
-
RegressionRisk,
|
|
17
|
-
ImpactedArea,
|
|
18
|
-
} from '../interfaces';
|
|
19
|
-
import { GitAnalyzer } from '../../../shared/git';
|
|
20
|
-
import { FileReader } from '../../../shared/io';
|
|
21
|
-
import { TypeScriptParser } from '../../../shared/parsers';
|
|
22
|
-
|
|
23
|
-
/**
|
|
24
|
-
* Interface for the defect prediction service
|
|
25
|
-
*/
|
|
26
|
-
export interface IDefectPredictorService {
|
|
27
|
-
predictDefects(request: PredictRequest): Promise<Result<PredictionResult, Error>>;
|
|
28
|
-
analyzeRegressionRisk(request: RegressionRequest): Promise<Result<RegressionRisk, Error>>;
|
|
29
|
-
updateModel(feedback: PredictionFeedback): Promise<Result<void, Error>>;
|
|
30
|
-
getModelMetrics(): Promise<ModelMetrics>;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
/**
|
|
34
|
-
* Prediction feedback for model improvement
|
|
35
|
-
*/
|
|
36
|
-
export interface PredictionFeedback {
|
|
37
|
-
predictionId: string;
|
|
38
|
-
file: string;
|
|
39
|
-
predictedProbability: number;
|
|
40
|
-
actualDefect: boolean;
|
|
41
|
-
defectType?: string;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
/**
|
|
45
|
-
* Model performance metrics
|
|
46
|
-
*/
|
|
47
|
-
export interface ModelMetrics {
|
|
48
|
-
accuracy: number;
|
|
49
|
-
precision: number;
|
|
50
|
-
recall: number;
|
|
51
|
-
f1Score: number;
|
|
52
|
-
totalPredictions: number;
|
|
53
|
-
lastUpdated: Date;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
/**
|
|
57
|
-
* Configuration for the defect predictor
|
|
58
|
-
*/
|
|
59
|
-
export interface DefectPredictorConfig {
|
|
60
|
-
defaultThreshold: number;
|
|
61
|
-
maxPredictionsPerBatch: number;
|
|
62
|
-
enableHistoricalAnalysis: boolean;
|
|
63
|
-
modelNamespace: string;
|
|
64
|
-
featureWeights: Record<string, number>;
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
const DEFAULT_CONFIG: DefectPredictorConfig = {
|
|
68
|
-
defaultThreshold: 0.5,
|
|
69
|
-
maxPredictionsPerBatch: 100,
|
|
70
|
-
enableHistoricalAnalysis: true,
|
|
71
|
-
modelNamespace: 'defect-intelligence:predictor',
|
|
72
|
-
featureWeights: {
|
|
73
|
-
codeComplexity: 0.25,
|
|
74
|
-
changeFrequency: 0.20,
|
|
75
|
-
developerExperience: 0.15,
|
|
76
|
-
testCoverage: 0.20,
|
|
77
|
-
codeAge: 0.10,
|
|
78
|
-
bugHistory: 0.10,
|
|
79
|
-
},
|
|
80
|
-
};
|
|
81
|
-
|
|
82
|
-
/**
|
|
83
|
-
* Default prediction features
|
|
84
|
-
*/
|
|
85
|
-
const DEFAULT_FEATURES: PredictionFeature[] = [
|
|
86
|
-
{ name: 'codeComplexity', weight: 0.25 },
|
|
87
|
-
{ name: 'changeFrequency', weight: 0.20 },
|
|
88
|
-
{ name: 'developerExperience', weight: 0.15 },
|
|
89
|
-
{ name: 'testCoverage', weight: 0.20 },
|
|
90
|
-
{ name: 'codeAge', weight: 0.10 },
|
|
91
|
-
{ name: 'bugHistory', weight: 0.10 },
|
|
92
|
-
];
|
|
93
|
-
|
|
94
|
-
/**
|
|
95
|
-
* Defect Prediction Service Implementation
|
|
96
|
-
* Uses ML-based heuristics to predict defect probability in code files
|
|
97
|
-
*/
|
|
98
|
-
export class DefectPredictorService implements IDefectPredictorService {
|
|
99
|
-
private readonly config: DefectPredictorConfig;
|
|
100
|
-
private readonly gitAnalyzer: GitAnalyzer;
|
|
101
|
-
private readonly fileReader: FileReader;
|
|
102
|
-
private readonly tsParser: TypeScriptParser;
|
|
103
|
-
private modelMetrics: ModelMetrics = {
|
|
104
|
-
accuracy: 0.75,
|
|
105
|
-
precision: 0.72,
|
|
106
|
-
recall: 0.78,
|
|
107
|
-
f1Score: 0.75,
|
|
108
|
-
totalPredictions: 0,
|
|
109
|
-
lastUpdated: new Date(),
|
|
110
|
-
};
|
|
111
|
-
|
|
112
|
-
constructor(
|
|
113
|
-
private readonly memory: MemoryBackend,
|
|
114
|
-
config: Partial<DefectPredictorConfig> = {}
|
|
115
|
-
) {
|
|
116
|
-
this.config = { ...DEFAULT_CONFIG, ...config };
|
|
117
|
-
this.gitAnalyzer = new GitAnalyzer({ enableCache: true });
|
|
118
|
-
this.fileReader = new FileReader();
|
|
119
|
-
this.tsParser = new TypeScriptParser();
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
/**
|
|
123
|
-
* Predict defect probability for given files
|
|
124
|
-
*/
|
|
125
|
-
async predictDefects(request: PredictRequest): Promise<Result<PredictionResult, Error>> {
|
|
126
|
-
try {
|
|
127
|
-
const {
|
|
128
|
-
files,
|
|
129
|
-
features = DEFAULT_FEATURES,
|
|
130
|
-
threshold = this.config.defaultThreshold,
|
|
131
|
-
} = request;
|
|
132
|
-
|
|
133
|
-
if (files.length === 0) {
|
|
134
|
-
return err(new Error('No files provided for prediction'));
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
if (files.length > this.config.maxPredictionsPerBatch) {
|
|
138
|
-
return err(new Error(`Too many files. Maximum: ${this.config.maxPredictionsPerBatch}`));
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
const predictions: FilePrediction[] = [];
|
|
142
|
-
const factors: Set<string> = new Set();
|
|
143
|
-
|
|
144
|
-
for (const file of files) {
|
|
145
|
-
const prediction = await this.predictForFile(file, features, threshold);
|
|
146
|
-
predictions.push(prediction);
|
|
147
|
-
prediction.factors.forEach((f) => factors.add(f.name));
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
// Calculate model confidence based on historical accuracy
|
|
151
|
-
const modelConfidence = this.calculateModelConfidence(predictions);
|
|
152
|
-
|
|
153
|
-
// Store prediction for potential feedback
|
|
154
|
-
await this.storePrediction(predictions);
|
|
155
|
-
|
|
156
|
-
// Update metrics
|
|
157
|
-
this.modelMetrics.totalPredictions += predictions.length;
|
|
158
|
-
this.modelMetrics.lastUpdated = new Date();
|
|
159
|
-
|
|
160
|
-
return ok({
|
|
161
|
-
predictions,
|
|
162
|
-
modelConfidence,
|
|
163
|
-
factors: Array.from(factors),
|
|
164
|
-
});
|
|
165
|
-
} catch (error) {
|
|
166
|
-
return err(error instanceof Error ? error : new Error(String(error)));
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
/**
|
|
171
|
-
* Analyze regression risk for a changeset
|
|
172
|
-
*/
|
|
173
|
-
async analyzeRegressionRisk(
|
|
174
|
-
request: RegressionRequest
|
|
175
|
-
): Promise<Result<RegressionRisk, Error>> {
|
|
176
|
-
try {
|
|
177
|
-
const { changeset, baseline, depth = 'shallow' } = request;
|
|
178
|
-
|
|
179
|
-
if (changeset.length === 0) {
|
|
180
|
-
return err(new Error('No files in changeset'));
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
// Analyze each changed file
|
|
184
|
-
const impactedAreas: ImpactedArea[] = [];
|
|
185
|
-
let totalRisk = 0;
|
|
186
|
-
|
|
187
|
-
for (const file of changeset) {
|
|
188
|
-
const fileAnalysis = await this.analyzeFileImpact(file, depth);
|
|
189
|
-
impactedAreas.push(...fileAnalysis.areas);
|
|
190
|
-
totalRisk += fileAnalysis.risk;
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
// Consider baseline if provided
|
|
194
|
-
if (baseline && this.config.enableHistoricalAnalysis) {
|
|
195
|
-
const baselineRisk = await this.getBaselineRisk(baseline);
|
|
196
|
-
totalRisk = (totalRisk + baselineRisk) / 2;
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
// Normalize overall risk
|
|
200
|
-
const overallRisk = Math.min(1, totalRisk / changeset.length);
|
|
201
|
-
const riskLevel = this.riskToSeverity(overallRisk);
|
|
202
|
-
|
|
203
|
-
// Generate test recommendations based on impacted areas
|
|
204
|
-
const recommendedTests = this.generateTestRecommendations(impactedAreas);
|
|
205
|
-
|
|
206
|
-
// Calculate confidence based on analysis depth
|
|
207
|
-
const confidence = depth === 'deep' ? 0.85 : 0.70;
|
|
208
|
-
|
|
209
|
-
return ok({
|
|
210
|
-
overallRisk,
|
|
211
|
-
riskLevel,
|
|
212
|
-
impactedAreas,
|
|
213
|
-
recommendedTests,
|
|
214
|
-
confidence,
|
|
215
|
-
});
|
|
216
|
-
} catch (error) {
|
|
217
|
-
return err(error instanceof Error ? error : new Error(String(error)));
|
|
218
|
-
}
|
|
219
|
-
}
|
|
220
|
-
|
|
221
|
-
/**
|
|
222
|
-
* Update the prediction model with feedback
|
|
223
|
-
*/
|
|
224
|
-
async updateModel(feedback: PredictionFeedback): Promise<Result<void, Error>> {
|
|
225
|
-
try {
|
|
226
|
-
// Store feedback for model improvement
|
|
227
|
-
const feedbackKey = `${this.config.modelNamespace}:feedback:${feedback.predictionId}`;
|
|
228
|
-
await this.memory.set(feedbackKey, feedback, {
|
|
229
|
-
namespace: 'defect-intelligence',
|
|
230
|
-
persist: true,
|
|
231
|
-
});
|
|
232
|
-
|
|
233
|
-
// Update model metrics based on feedback
|
|
234
|
-
await this.recalculateMetrics(feedback);
|
|
235
|
-
|
|
236
|
-
return ok(undefined);
|
|
237
|
-
} catch (error) {
|
|
238
|
-
return err(error instanceof Error ? error : new Error(String(error)));
|
|
239
|
-
}
|
|
240
|
-
}
|
|
241
|
-
|
|
242
|
-
/**
|
|
243
|
-
* Get current model performance metrics
|
|
244
|
-
*/
|
|
245
|
-
async getModelMetrics(): Promise<ModelMetrics> {
|
|
246
|
-
// Try to load persisted metrics
|
|
247
|
-
const storedMetrics = await this.memory.get<ModelMetrics>(
|
|
248
|
-
`${this.config.modelNamespace}:metrics`
|
|
249
|
-
);
|
|
250
|
-
|
|
251
|
-
if (storedMetrics) {
|
|
252
|
-
this.modelMetrics = {
|
|
253
|
-
...storedMetrics,
|
|
254
|
-
lastUpdated: new Date(storedMetrics.lastUpdated),
|
|
255
|
-
};
|
|
256
|
-
}
|
|
257
|
-
|
|
258
|
-
return { ...this.modelMetrics };
|
|
259
|
-
}
|
|
260
|
-
|
|
261
|
-
// ============================================================================
|
|
262
|
-
// Private Helper Methods
|
|
263
|
-
// ============================================================================
|
|
264
|
-
|
|
265
|
-
private async predictForFile(
|
|
266
|
-
file: string,
|
|
267
|
-
features: PredictionFeature[],
|
|
268
|
-
threshold: number
|
|
269
|
-
): Promise<FilePrediction> {
|
|
270
|
-
// Extract file metrics
|
|
271
|
-
const fileMetrics = await this.extractFileMetrics(file);
|
|
272
|
-
|
|
273
|
-
// Calculate probability based on weighted features
|
|
274
|
-
const featureContributions: { name: string; contribution: number }[] = [];
|
|
275
|
-
let probability = 0;
|
|
276
|
-
|
|
277
|
-
for (const feature of features) {
|
|
278
|
-
const metricValue = fileMetrics[feature.name] ?? 0;
|
|
279
|
-
const contribution = metricValue * feature.weight;
|
|
280
|
-
probability += contribution;
|
|
281
|
-
featureContributions.push({
|
|
282
|
-
name: feature.name,
|
|
283
|
-
contribution: Math.round(contribution * 100) / 100,
|
|
284
|
-
});
|
|
285
|
-
}
|
|
286
|
-
|
|
287
|
-
// Normalize probability to 0-1 range
|
|
288
|
-
probability = Math.max(0, Math.min(1, probability));
|
|
289
|
-
|
|
290
|
-
// Determine risk level
|
|
291
|
-
const riskLevel = this.probabilityToRisk(probability, threshold);
|
|
292
|
-
|
|
293
|
-
// Generate recommendations based on high-contributing factors
|
|
294
|
-
const recommendations = this.generateRecommendations(featureContributions, probability);
|
|
295
|
-
|
|
296
|
-
return {
|
|
297
|
-
file,
|
|
298
|
-
probability,
|
|
299
|
-
riskLevel,
|
|
300
|
-
factors: featureContributions.filter((f) => f.contribution > 0.05),
|
|
301
|
-
recommendations,
|
|
302
|
-
};
|
|
303
|
-
}
|
|
304
|
-
|
|
305
|
-
private async extractFileMetrics(file: string): Promise<Record<string, number>> {
|
|
306
|
-
// Try to get cached metrics
|
|
307
|
-
const cachedMetrics = await this.memory.get<Record<string, number>>(
|
|
308
|
-
`${this.config.modelNamespace}:file-metrics:${file}`
|
|
309
|
-
);
|
|
310
|
-
|
|
311
|
-
if (cachedMetrics) {
|
|
312
|
-
return cachedMetrics;
|
|
313
|
-
}
|
|
314
|
-
|
|
315
|
-
// Calculate metrics using real code analysis and git history
|
|
316
|
-
const metrics: Record<string, number> = {
|
|
317
|
-
codeComplexity: await this.calculateComplexity(file),
|
|
318
|
-
changeFrequency: await this.getChangeFrequency(file),
|
|
319
|
-
developerExperience: await this.getDeveloperExperience(file),
|
|
320
|
-
testCoverage: await this.getTestCoverage(file),
|
|
321
|
-
codeAge: await this.getCodeAge(file),
|
|
322
|
-
bugHistory: await this.getBugHistory(file),
|
|
323
|
-
};
|
|
324
|
-
|
|
325
|
-
// Cache metrics
|
|
326
|
-
await this.memory.set(
|
|
327
|
-
`${this.config.modelNamespace}:file-metrics:${file}`,
|
|
328
|
-
metrics,
|
|
329
|
-
{ namespace: 'defect-intelligence', ttl: 3600 } // 1 hour cache
|
|
330
|
-
);
|
|
331
|
-
|
|
332
|
-
return metrics;
|
|
333
|
-
}
|
|
334
|
-
|
|
335
|
-
/**
|
|
336
|
-
* Calculate code complexity using TypeScript AST analysis
|
|
337
|
-
* Falls back to path-based heuristics if file cannot be parsed
|
|
338
|
-
*/
|
|
339
|
-
private async calculateComplexity(file: string): Promise<number> {
|
|
340
|
-
const extension = file.split('.').pop()?.toLowerCase();
|
|
341
|
-
|
|
342
|
-
// For TypeScript/JavaScript files, use AST analysis
|
|
343
|
-
if (extension && ['ts', 'tsx', 'js', 'jsx'].includes(extension)) {
|
|
344
|
-
const fileResult = await this.fileReader.readFile(file);
|
|
345
|
-
|
|
346
|
-
if (fileResult.success) {
|
|
347
|
-
try {
|
|
348
|
-
const fileName = file.split('/').pop() || file;
|
|
349
|
-
const ast = this.tsParser.parseFile(fileName, fileResult.value);
|
|
350
|
-
|
|
351
|
-
// Extract structural metrics
|
|
352
|
-
const functions = this.tsParser.extractFunctions(ast);
|
|
353
|
-
const classes = this.tsParser.extractClasses(ast);
|
|
354
|
-
|
|
355
|
-
// Calculate complexity factors
|
|
356
|
-
const lines = fileResult.value.split('\n').length;
|
|
357
|
-
const functionCount = functions.length;
|
|
358
|
-
const classCount = classes.length;
|
|
359
|
-
const methodCount = classes.reduce((sum, cls) => sum + cls.methods.length, 0);
|
|
360
|
-
const asyncCount = functions.filter((f) => f.isAsync).length;
|
|
361
|
-
|
|
362
|
-
// Count complexity indicators in code
|
|
363
|
-
const content = fileResult.value;
|
|
364
|
-
const ifCount = (content.match(/\bif\s*\(/g) || []).length;
|
|
365
|
-
const loopCount = (content.match(/\b(for|while|do)\s*[\(\{]/g) || []).length;
|
|
366
|
-
const switchCount = (content.match(/\bswitch\s*\(/g) || []).length;
|
|
367
|
-
const catchCount = (content.match(/\bcatch\s*\(/g) || []).length;
|
|
368
|
-
const ternaryCount = (content.match(/\?[^?:]+:/g) || []).length;
|
|
369
|
-
|
|
370
|
-
// Calculate cyclomatic complexity proxy
|
|
371
|
-
const cyclomaticProxy = ifCount + loopCount * 2 + switchCount * 2 + catchCount + ternaryCount;
|
|
372
|
-
|
|
373
|
-
// Normalize metrics to 0-1 scale
|
|
374
|
-
const lineComplexity = Math.min(1, lines / 500); // 500 lines = max
|
|
375
|
-
const functionComplexity = Math.min(1, (functionCount + methodCount) / 30); // 30 functions = max
|
|
376
|
-
const branchComplexity = Math.min(1, cyclomaticProxy / 50); // 50 branches = max
|
|
377
|
-
const asyncComplexity = asyncCount > 0 ? 0.1 : 0; // Async adds complexity
|
|
378
|
-
|
|
379
|
-
// Weighted average
|
|
380
|
-
const complexity =
|
|
381
|
-
lineComplexity * 0.2 +
|
|
382
|
-
functionComplexity * 0.25 +
|
|
383
|
-
branchComplexity * 0.4 +
|
|
384
|
-
asyncComplexity +
|
|
385
|
-
(classCount > 3 ? 0.05 : 0); // Many classes add complexity
|
|
386
|
-
|
|
387
|
-
return Math.max(0, Math.min(1, complexity));
|
|
388
|
-
} catch {
|
|
389
|
-
// Fall through to heuristics if parsing fails
|
|
390
|
-
}
|
|
391
|
-
}
|
|
392
|
-
}
|
|
393
|
-
|
|
394
|
-
// Fallback: Path-based heuristics for non-TS/JS files or parse failures
|
|
395
|
-
return this.estimateComplexityFromPath(file);
|
|
396
|
-
}
|
|
397
|
-
|
|
398
|
-
/**
|
|
399
|
-
* Estimate complexity based on file path heuristics (fallback)
|
|
400
|
-
*/
|
|
401
|
-
private estimateComplexityFromPath(file: string): number {
|
|
402
|
-
const pathParts = file.split('/');
|
|
403
|
-
const filename = pathParts[pathParts.length - 1];
|
|
404
|
-
|
|
405
|
-
let complexity = 0.3;
|
|
406
|
-
if (file.includes('controller') || file.includes('service')) complexity += 0.2;
|
|
407
|
-
if (file.includes('coordinator') || file.includes('orchestrator')) complexity += 0.15;
|
|
408
|
-
if (file.includes('utils') || file.includes('helper')) complexity -= 0.1;
|
|
409
|
-
if (file.includes('types') || file.includes('interfaces')) complexity -= 0.15;
|
|
410
|
-
if (filename.length > 30) complexity += 0.1;
|
|
411
|
-
|
|
412
|
-
return Math.max(0, Math.min(1, complexity));
|
|
413
|
-
}
|
|
414
|
-
|
|
415
|
-
/**
|
|
416
|
-
* Get change frequency for a file using git history
|
|
417
|
-
* Falls back to memory cache if git is not available
|
|
418
|
-
*/
|
|
419
|
-
private async getChangeFrequency(file: string): Promise<number> {
|
|
420
|
-
// Try git analysis first
|
|
421
|
-
const gitFrequency = await this.gitAnalyzer.getChangeFrequency(file);
|
|
422
|
-
if (gitFrequency !== 0.4) {
|
|
423
|
-
// Cache the result
|
|
424
|
-
await this.memory.set(
|
|
425
|
-
`${this.config.modelNamespace}:history:${file}`,
|
|
426
|
-
{ changes: Math.round(gitFrequency * 30) },
|
|
427
|
-
{ ttl: 3600 }
|
|
428
|
-
);
|
|
429
|
-
return gitFrequency;
|
|
430
|
-
}
|
|
431
|
-
|
|
432
|
-
// Fallback to cached value
|
|
433
|
-
const historyKey = `${this.config.modelNamespace}:history:${file}`;
|
|
434
|
-
const history = await this.memory.get<{ changes: number }>(historyKey);
|
|
435
|
-
if (history) {
|
|
436
|
-
return Math.min(1, history.changes / 50);
|
|
437
|
-
}
|
|
438
|
-
|
|
439
|
-
return 0.4;
|
|
440
|
-
}
|
|
441
|
-
|
|
442
|
-
/**
|
|
443
|
-
* Get developer experience score for a file using git blame
|
|
444
|
-
* Falls back to memory cache if git is not available
|
|
445
|
-
*/
|
|
446
|
-
private async getDeveloperExperience(file: string): Promise<number> {
|
|
447
|
-
// Try git analysis first
|
|
448
|
-
const gitExp = await this.gitAnalyzer.getDeveloperExperience(file);
|
|
449
|
-
if (gitExp !== 0.5) {
|
|
450
|
-
// Cache the result
|
|
451
|
-
await this.memory.set(
|
|
452
|
-
`${this.config.modelNamespace}:developer-exp:${file}`,
|
|
453
|
-
{ score: gitExp },
|
|
454
|
-
{ ttl: 3600 }
|
|
455
|
-
);
|
|
456
|
-
return gitExp;
|
|
457
|
-
}
|
|
458
|
-
|
|
459
|
-
// Fallback to cached value
|
|
460
|
-
const expKey = `${this.config.modelNamespace}:developer-exp:${file}`;
|
|
461
|
-
const exp = await this.memory.get<{ score: number }>(expKey);
|
|
462
|
-
if (exp) {
|
|
463
|
-
return exp.score;
|
|
464
|
-
}
|
|
465
|
-
|
|
466
|
-
return 0.5;
|
|
467
|
-
}
|
|
468
|
-
|
|
469
|
-
/**
|
|
470
|
-
* Get test coverage for a file from coverage reports
|
|
471
|
-
*/
|
|
472
|
-
private async getTestCoverage(file: string): Promise<number> {
|
|
473
|
-
const coverageKey = `coverage-analysis:file:${file}`;
|
|
474
|
-
const coverage = await this.memory.get<{ percentage: number }>(coverageKey);
|
|
475
|
-
|
|
476
|
-
if (coverage) {
|
|
477
|
-
// Invert: low coverage = high defect risk
|
|
478
|
-
return 1 - coverage.percentage / 100;
|
|
479
|
-
}
|
|
480
|
-
|
|
481
|
-
// Default to medium coverage (inverted)
|
|
482
|
-
return 0.4;
|
|
483
|
-
}
|
|
484
|
-
|
|
485
|
-
/**
|
|
486
|
-
* Get code age for a file using git history
|
|
487
|
-
* Falls back to memory cache if git is not available
|
|
488
|
-
*/
|
|
489
|
-
private async getCodeAge(file: string): Promise<number> {
|
|
490
|
-
// Try git analysis first
|
|
491
|
-
const gitAge = await this.gitAnalyzer.getCodeAge(file);
|
|
492
|
-
if (gitAge !== 0.4) {
|
|
493
|
-
return gitAge;
|
|
494
|
-
}
|
|
495
|
-
|
|
496
|
-
// Fallback to cached value
|
|
497
|
-
const ageKey = `${this.config.modelNamespace}:age:${file}`;
|
|
498
|
-
const age = await this.memory.get<{ days: number }>(ageKey);
|
|
499
|
-
|
|
500
|
-
if (age) {
|
|
501
|
-
if (age.days < 7) return 0.7; // New code
|
|
502
|
-
if (age.days > 365) return 0.3; // Stable code
|
|
503
|
-
return 0.4;
|
|
504
|
-
}
|
|
505
|
-
|
|
506
|
-
return 0.4;
|
|
507
|
-
}
|
|
508
|
-
|
|
509
|
-
/**
|
|
510
|
-
* Get bug history for a file using git commit messages
|
|
511
|
-
* Falls back to memory cache if git is not available
|
|
512
|
-
*/
|
|
513
|
-
private async getBugHistory(file: string): Promise<number> {
|
|
514
|
-
// Try git analysis first
|
|
515
|
-
const gitBugs = await this.gitAnalyzer.getBugHistory(file);
|
|
516
|
-
if (gitBugs !== 0.2) {
|
|
517
|
-
// Cache the result
|
|
518
|
-
await this.memory.set(
|
|
519
|
-
`${this.config.modelNamespace}:bugs:${file}`,
|
|
520
|
-
{ count: Math.round(gitBugs * 10) },
|
|
521
|
-
{ ttl: 3600 }
|
|
522
|
-
);
|
|
523
|
-
return gitBugs;
|
|
524
|
-
}
|
|
525
|
-
|
|
526
|
-
// Fallback to cached value
|
|
527
|
-
const bugKey = `${this.config.modelNamespace}:bugs:${file}`;
|
|
528
|
-
const bugs = await this.memory.get<{ count: number }>(bugKey);
|
|
529
|
-
|
|
530
|
-
if (bugs) {
|
|
531
|
-
return Math.min(1, bugs.count / 10);
|
|
532
|
-
}
|
|
533
|
-
|
|
534
|
-
return 0.2;
|
|
535
|
-
}
|
|
536
|
-
|
|
537
|
-
private probabilityToRisk(probability: number, threshold: number): Severity {
|
|
538
|
-
if (probability >= threshold + 0.3) return 'critical';
|
|
539
|
-
if (probability >= threshold + 0.15) return 'high';
|
|
540
|
-
if (probability >= threshold) return 'medium';
|
|
541
|
-
if (probability >= threshold - 0.2) return 'low';
|
|
542
|
-
return 'info';
|
|
543
|
-
}
|
|
544
|
-
|
|
545
|
-
private riskToSeverity(risk: number): Severity {
|
|
546
|
-
if (risk >= 0.8) return 'critical';
|
|
547
|
-
if (risk >= 0.6) return 'high';
|
|
548
|
-
if (risk >= 0.4) return 'medium';
|
|
549
|
-
if (risk >= 0.2) return 'low';
|
|
550
|
-
return 'info';
|
|
551
|
-
}
|
|
552
|
-
|
|
553
|
-
private generateRecommendations(
|
|
554
|
-
factors: { name: string; contribution: number }[],
|
|
555
|
-
probability: number
|
|
556
|
-
): string[] {
|
|
557
|
-
const recommendations: string[] = [];
|
|
558
|
-
|
|
559
|
-
// Sort factors by contribution
|
|
560
|
-
const sortedFactors = [...factors].sort((a, b) => b.contribution - a.contribution);
|
|
561
|
-
|
|
562
|
-
for (const factor of sortedFactors.slice(0, 3)) {
|
|
563
|
-
switch (factor.name) {
|
|
564
|
-
case 'codeComplexity':
|
|
565
|
-
if (factor.contribution > 0.1) {
|
|
566
|
-
recommendations.push('Consider refactoring to reduce cyclomatic complexity');
|
|
567
|
-
recommendations.push('Break down large functions into smaller, testable units');
|
|
568
|
-
}
|
|
569
|
-
break;
|
|
570
|
-
case 'changeFrequency':
|
|
571
|
-
if (factor.contribution > 0.1) {
|
|
572
|
-
recommendations.push('High churn area - add comprehensive regression tests');
|
|
573
|
-
recommendations.push('Consider stabilizing the interface before further changes');
|
|
574
|
-
}
|
|
575
|
-
break;
|
|
576
|
-
case 'testCoverage':
|
|
577
|
-
if (factor.contribution > 0.1) {
|
|
578
|
-
recommendations.push('Increase test coverage to reduce defect risk');
|
|
579
|
-
recommendations.push('Add unit tests for critical paths');
|
|
580
|
-
}
|
|
581
|
-
break;
|
|
582
|
-
case 'bugHistory':
|
|
583
|
-
if (factor.contribution > 0.1) {
|
|
584
|
-
recommendations.push('Review past bug fixes for patterns');
|
|
585
|
-
recommendations.push('Add regression tests for previously fixed issues');
|
|
586
|
-
}
|
|
587
|
-
break;
|
|
588
|
-
case 'codeAge':
|
|
589
|
-
if (factor.contribution > 0.1) {
|
|
590
|
-
recommendations.push('New code requires thorough review and testing');
|
|
591
|
-
}
|
|
592
|
-
break;
|
|
593
|
-
case 'developerExperience':
|
|
594
|
-
if (factor.contribution > 0.1) {
|
|
595
|
-
recommendations.push('Request code review from senior developer');
|
|
596
|
-
}
|
|
597
|
-
break;
|
|
598
|
-
}
|
|
599
|
-
}
|
|
600
|
-
|
|
601
|
-
if (probability > 0.7) {
|
|
602
|
-
recommendations.push('CRITICAL: Schedule immediate code review');
|
|
603
|
-
}
|
|
604
|
-
|
|
605
|
-
return recommendations;
|
|
606
|
-
}
|
|
607
|
-
|
|
608
|
-
private async analyzeFileImpact(
|
|
609
|
-
file: string,
|
|
610
|
-
depth: 'shallow' | 'deep'
|
|
611
|
-
): Promise<{ areas: ImpactedArea[]; risk: number }> {
|
|
612
|
-
const areas: ImpactedArea[] = [];
|
|
613
|
-
let risk = 0;
|
|
614
|
-
|
|
615
|
-
// Determine impacted areas based on file path
|
|
616
|
-
const area = this.categorizeFile(file);
|
|
617
|
-
const fileRisk = (await this.extractFileMetrics(file)).codeComplexity;
|
|
618
|
-
|
|
619
|
-
areas.push({
|
|
620
|
-
area,
|
|
621
|
-
files: [file],
|
|
622
|
-
risk: fileRisk,
|
|
623
|
-
reason: `Modified file in ${area} area`,
|
|
624
|
-
});
|
|
625
|
-
|
|
626
|
-
risk += fileRisk;
|
|
627
|
-
|
|
628
|
-
// Deep analysis includes dependency analysis
|
|
629
|
-
if (depth === 'deep') {
|
|
630
|
-
const dependencies = await this.analyzeDependencies(file);
|
|
631
|
-
for (const dep of dependencies) {
|
|
632
|
-
const depRisk = (await this.extractFileMetrics(dep)).codeComplexity * 0.5;
|
|
633
|
-
areas.push({
|
|
634
|
-
area: this.categorizeFile(dep),
|
|
635
|
-
files: [dep],
|
|
636
|
-
risk: depRisk,
|
|
637
|
-
reason: `Dependency of ${file}`,
|
|
638
|
-
});
|
|
639
|
-
risk += depRisk;
|
|
640
|
-
}
|
|
641
|
-
}
|
|
642
|
-
|
|
643
|
-
return { areas, risk };
|
|
644
|
-
}
|
|
645
|
-
|
|
646
|
-
private categorizeFile(file: string): string {
|
|
647
|
-
if (file.includes('controller')) return 'API Layer';
|
|
648
|
-
if (file.includes('service')) return 'Business Logic';
|
|
649
|
-
if (file.includes('repository') || file.includes('dao')) return 'Data Access';
|
|
650
|
-
if (file.includes('model') || file.includes('entity')) return 'Domain Model';
|
|
651
|
-
if (file.includes('util') || file.includes('helper')) return 'Utilities';
|
|
652
|
-
if (file.includes('test')) return 'Tests';
|
|
653
|
-
if (file.includes('config')) return 'Configuration';
|
|
654
|
-
return 'General';
|
|
655
|
-
}
|
|
656
|
-
|
|
657
|
-
private async analyzeDependencies(file: string): Promise<string[]> {
|
|
658
|
-
// Check cache first
|
|
659
|
-
const depsKey = `code-intelligence:dependencies:${file}`;
|
|
660
|
-
const cachedDeps = await this.memory.get<string[]>(depsKey);
|
|
661
|
-
if (cachedDeps && cachedDeps.length > 0) {
|
|
662
|
-
return cachedDeps;
|
|
663
|
-
}
|
|
664
|
-
|
|
665
|
-
// Parse the file to extract imports
|
|
666
|
-
const dependencies: string[] = [];
|
|
667
|
-
try {
|
|
668
|
-
const fileResult = await this.fileReader.readFile(file);
|
|
669
|
-
if (!fileResult.success) {
|
|
670
|
-
return [];
|
|
671
|
-
}
|
|
672
|
-
|
|
673
|
-
const fileName = file.split('/').pop() || file;
|
|
674
|
-
const ast = this.tsParser.parseFile(fileName, fileResult.value);
|
|
675
|
-
const imports = this.tsParser.extractImports(ast);
|
|
676
|
-
|
|
677
|
-
for (const importInfo of imports) {
|
|
678
|
-
// Resolve relative imports to actual file paths
|
|
679
|
-
if (importInfo.module.startsWith('.')) {
|
|
680
|
-
const resolvedPath = this.resolveRelativeImport(file, importInfo.module);
|
|
681
|
-
dependencies.push(resolvedPath);
|
|
682
|
-
} else if (!importInfo.module.startsWith('node:')) {
|
|
683
|
-
// External package dependencies
|
|
684
|
-
dependencies.push(importInfo.module);
|
|
685
|
-
}
|
|
686
|
-
}
|
|
687
|
-
|
|
688
|
-
// Cache the dependencies for future lookups
|
|
689
|
-
if (dependencies.length > 0) {
|
|
690
|
-
await this.memory.set(depsKey, dependencies, {
|
|
691
|
-
namespace: 'code-intelligence',
|
|
692
|
-
ttl: 3600, // Cache for 1 hour
|
|
693
|
-
});
|
|
694
|
-
}
|
|
695
|
-
} catch (error) {
|
|
696
|
-
// Log but don't fail - return empty array
|
|
697
|
-
console.error(`Failed to analyze dependencies for ${file}:`, error);
|
|
698
|
-
}
|
|
699
|
-
|
|
700
|
-
return dependencies;
|
|
701
|
-
}
|
|
702
|
-
|
|
703
|
-
/**
|
|
704
|
-
* Resolve a relative import path to an absolute file path
|
|
705
|
-
*/
|
|
706
|
-
private resolveRelativeImport(fromFile: string, importPath: string): string {
|
|
707
|
-
const fromDir = fromFile.substring(0, fromFile.lastIndexOf('/'));
|
|
708
|
-
const segments = fromDir.split('/');
|
|
709
|
-
|
|
710
|
-
// Process the relative path
|
|
711
|
-
const importSegments = importPath.split('/');
|
|
712
|
-
for (const segment of importSegments) {
|
|
713
|
-
if (segment === '.') {
|
|
714
|
-
continue;
|
|
715
|
-
} else if (segment === '..') {
|
|
716
|
-
segments.pop();
|
|
717
|
-
} else {
|
|
718
|
-
segments.push(segment);
|
|
719
|
-
}
|
|
720
|
-
}
|
|
721
|
-
|
|
722
|
-
let resolved = segments.join('/');
|
|
723
|
-
|
|
724
|
-
// Add file extension if not present
|
|
725
|
-
if (!resolved.endsWith('.ts') && !resolved.endsWith('.tsx') && !resolved.endsWith('.js')) {
|
|
726
|
-
// Check common extensions - prefer .ts
|
|
727
|
-
resolved = resolved + '.ts';
|
|
728
|
-
}
|
|
729
|
-
|
|
730
|
-
return resolved;
|
|
731
|
-
}
|
|
732
|
-
|
|
733
|
-
private async getBaselineRisk(baseline: string): Promise<number> {
|
|
734
|
-
const baselineKey = `${this.config.modelNamespace}:baseline:${baseline}`;
|
|
735
|
-
const baselineData = await this.memory.get<{ risk: number }>(baselineKey);
|
|
736
|
-
return baselineData?.risk ?? 0.3;
|
|
737
|
-
}
|
|
738
|
-
|
|
739
|
-
private generateTestRecommendations(areas: ImpactedArea[]): string[] {
|
|
740
|
-
const recommendations: string[] = [];
|
|
741
|
-
const areaNames = new Set(areas.map((a) => a.area));
|
|
742
|
-
|
|
743
|
-
for (const area of areaNames) {
|
|
744
|
-
switch (area) {
|
|
745
|
-
case 'API Layer':
|
|
746
|
-
recommendations.push('Run API integration tests');
|
|
747
|
-
recommendations.push('Verify endpoint response contracts');
|
|
748
|
-
break;
|
|
749
|
-
case 'Business Logic':
|
|
750
|
-
recommendations.push('Run unit tests for business rules');
|
|
751
|
-
recommendations.push('Execute scenario-based tests');
|
|
752
|
-
break;
|
|
753
|
-
case 'Data Access':
|
|
754
|
-
recommendations.push('Run database integration tests');
|
|
755
|
-
recommendations.push('Verify data integrity constraints');
|
|
756
|
-
break;
|
|
757
|
-
case 'Domain Model':
|
|
758
|
-
recommendations.push('Run entity validation tests');
|
|
759
|
-
recommendations.push('Check serialization/deserialization');
|
|
760
|
-
break;
|
|
761
|
-
}
|
|
762
|
-
}
|
|
763
|
-
|
|
764
|
-
// Add general recommendations based on risk
|
|
765
|
-
const highRiskAreas = areas.filter((a) => a.risk > 0.6);
|
|
766
|
-
if (highRiskAreas.length > 0) {
|
|
767
|
-
recommendations.push('Run full regression test suite');
|
|
768
|
-
recommendations.push('Consider exploratory testing for edge cases');
|
|
769
|
-
}
|
|
770
|
-
|
|
771
|
-
return [...new Set(recommendations)];
|
|
772
|
-
}
|
|
773
|
-
|
|
774
|
-
private calculateModelConfidence(predictions: FilePrediction[]): number {
|
|
775
|
-
// Base confidence from model metrics
|
|
776
|
-
let confidence = this.modelMetrics.accuracy;
|
|
777
|
-
|
|
778
|
-
// Adjust based on prediction spread
|
|
779
|
-
const probabilities = predictions.map((p) => p.probability);
|
|
780
|
-
const variance = this.calculateVariance(probabilities);
|
|
781
|
-
|
|
782
|
-
// High variance indicates uncertain predictions
|
|
783
|
-
if (variance > 0.2) confidence *= 0.9;
|
|
784
|
-
|
|
785
|
-
// More predictions generally mean better confidence
|
|
786
|
-
if (predictions.length > 10) confidence *= 1.05;
|
|
787
|
-
|
|
788
|
-
return Math.min(1, Math.max(0, confidence));
|
|
789
|
-
}
|
|
790
|
-
|
|
791
|
-
private calculateVariance(values: number[]): number {
|
|
792
|
-
if (values.length === 0) return 0;
|
|
793
|
-
const mean = values.reduce((a, b) => a + b, 0) / values.length;
|
|
794
|
-
const squareDiffs = values.map((v) => Math.pow(v - mean, 2));
|
|
795
|
-
return squareDiffs.reduce((a, b) => a + b, 0) / values.length;
|
|
796
|
-
}
|
|
797
|
-
|
|
798
|
-
private async storePrediction(predictions: FilePrediction[]): Promise<void> {
|
|
799
|
-
const predictionId = uuidv4();
|
|
800
|
-
await this.memory.set(
|
|
801
|
-
`${this.config.modelNamespace}:prediction:${predictionId}`,
|
|
802
|
-
{
|
|
803
|
-
id: predictionId,
|
|
804
|
-
predictions,
|
|
805
|
-
timestamp: new Date().toISOString(),
|
|
806
|
-
},
|
|
807
|
-
{ namespace: 'defect-intelligence', ttl: 86400 * 7 } // 7 days
|
|
808
|
-
);
|
|
809
|
-
}
|
|
810
|
-
|
|
811
|
-
private async recalculateMetrics(feedback: PredictionFeedback): Promise<void> {
|
|
812
|
-
// Simple online update of accuracy
|
|
813
|
-
const predicted = feedback.predictedProbability >= this.config.defaultThreshold;
|
|
814
|
-
const correct = predicted === feedback.actualDefect;
|
|
815
|
-
|
|
816
|
-
// Moving average update
|
|
817
|
-
const alpha = 0.01; // Learning rate
|
|
818
|
-
this.modelMetrics.accuracy =
|
|
819
|
-
this.modelMetrics.accuracy * (1 - alpha) + (correct ? 1 : 0) * alpha;
|
|
820
|
-
|
|
821
|
-
// Update precision/recall
|
|
822
|
-
if (predicted && feedback.actualDefect) {
|
|
823
|
-
// True positive
|
|
824
|
-
this.modelMetrics.precision =
|
|
825
|
-
this.modelMetrics.precision * (1 - alpha) + 1 * alpha;
|
|
826
|
-
this.modelMetrics.recall =
|
|
827
|
-
this.modelMetrics.recall * (1 - alpha) + 1 * alpha;
|
|
828
|
-
} else if (predicted && !feedback.actualDefect) {
|
|
829
|
-
// False positive
|
|
830
|
-
this.modelMetrics.precision =
|
|
831
|
-
this.modelMetrics.precision * (1 - alpha) + 0 * alpha;
|
|
832
|
-
} else if (!predicted && feedback.actualDefect) {
|
|
833
|
-
// False negative
|
|
834
|
-
this.modelMetrics.recall =
|
|
835
|
-
this.modelMetrics.recall * (1 - alpha) + 0 * alpha;
|
|
836
|
-
}
|
|
837
|
-
|
|
838
|
-
// Calculate F1
|
|
839
|
-
this.modelMetrics.f1Score =
|
|
840
|
-
(2 * this.modelMetrics.precision * this.modelMetrics.recall) /
|
|
841
|
-
(this.modelMetrics.precision + this.modelMetrics.recall || 1);
|
|
842
|
-
|
|
843
|
-
this.modelMetrics.lastUpdated = new Date();
|
|
844
|
-
|
|
845
|
-
// Persist metrics
|
|
846
|
-
await this.memory.set(
|
|
847
|
-
`${this.config.modelNamespace}:metrics`,
|
|
848
|
-
this.modelMetrics,
|
|
849
|
-
{ namespace: 'defect-intelligence', persist: true }
|
|
850
|
-
);
|
|
851
|
-
}
|
|
852
|
-
}
|