@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,809 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Agentic QE v3 - Graph Boundaries Analyzer for RuVector Integration
|
|
3
|
-
*
|
|
4
|
-
* Uses RuVector's graph analysis capabilities to detect module boundaries.
|
|
5
|
-
* Falls back to path-based analysis when RuVector is unavailable.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
import type {
|
|
9
|
-
GraphBoundariesAnalyzer,
|
|
10
|
-
GraphBoundariesResult,
|
|
11
|
-
ModuleBoundary,
|
|
12
|
-
BoundaryCrossing,
|
|
13
|
-
ModuleDependency,
|
|
14
|
-
RuVectorConfig,
|
|
15
|
-
} from './interfaces';
|
|
16
|
-
import { FallbackGraphBoundariesAnalyzer } from './fallback';
|
|
17
|
-
import type { Severity, Priority } from '../../shared/types';
|
|
18
|
-
|
|
19
|
-
// ============================================================================
|
|
20
|
-
// Graph Configuration
|
|
21
|
-
// ============================================================================
|
|
22
|
-
|
|
23
|
-
/**
|
|
24
|
-
* Configuration for graph boundary analysis
|
|
25
|
-
*/
|
|
26
|
-
export interface GraphConfig {
|
|
27
|
-
/** Max depth to traverse dependencies */
|
|
28
|
-
maxDepth: number;
|
|
29
|
-
/** Coupling threshold for boundary detection */
|
|
30
|
-
couplingThreshold: number;
|
|
31
|
-
/** Min cohesion for module to be considered well-defined */
|
|
32
|
-
minCohesion: number;
|
|
33
|
-
/** Patterns to identify module roots */
|
|
34
|
-
modulePatterns: RegExp[];
|
|
35
|
-
/** Patterns to ignore */
|
|
36
|
-
ignorePatterns: RegExp[];
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
const DEFAULT_GRAPH_CONFIG: GraphConfig = {
|
|
40
|
-
maxDepth: 5,
|
|
41
|
-
couplingThreshold: 0.7,
|
|
42
|
-
minCohesion: 0.5,
|
|
43
|
-
modulePatterns: [
|
|
44
|
-
/^src\/domains?\//,
|
|
45
|
-
/^src\/modules?\//,
|
|
46
|
-
/^src\/features?\//,
|
|
47
|
-
/^src\/services?\//,
|
|
48
|
-
/^packages?\//,
|
|
49
|
-
/^libs?\//,
|
|
50
|
-
],
|
|
51
|
-
ignorePatterns: [
|
|
52
|
-
/node_modules/,
|
|
53
|
-
/\.test\./,
|
|
54
|
-
/\.spec\./,
|
|
55
|
-
/__tests__/,
|
|
56
|
-
/__mocks__/,
|
|
57
|
-
/\.d\.ts$/,
|
|
58
|
-
],
|
|
59
|
-
};
|
|
60
|
-
|
|
61
|
-
// ============================================================================
|
|
62
|
-
// RuVector Graph Boundaries Analyzer Implementation
|
|
63
|
-
// ============================================================================
|
|
64
|
-
|
|
65
|
-
/**
|
|
66
|
-
* Graph boundaries analyzer that integrates with RuVector
|
|
67
|
-
* Provides ML-enhanced module boundary detection
|
|
68
|
-
*/
|
|
69
|
-
export class RuVectorGraphBoundariesAnalyzer implements GraphBoundariesAnalyzer {
|
|
70
|
-
private readonly fallback: FallbackGraphBoundariesAnalyzer;
|
|
71
|
-
private readonly graphConfig: GraphConfig;
|
|
72
|
-
private readonly cache: Map<string, { result: GraphBoundariesResult; timestamp: number }> = new Map();
|
|
73
|
-
private moduleCache: Map<string, ModuleBoundary> = new Map();
|
|
74
|
-
private dependencyGraph: Map<string, ModuleDependency[]> = new Map();
|
|
75
|
-
|
|
76
|
-
constructor(
|
|
77
|
-
private readonly config: RuVectorConfig,
|
|
78
|
-
graphConfig?: Partial<GraphConfig>
|
|
79
|
-
) {
|
|
80
|
-
this.fallback = new FallbackGraphBoundariesAnalyzer();
|
|
81
|
-
this.graphConfig = { ...DEFAULT_GRAPH_CONFIG, ...graphConfig };
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
/**
|
|
85
|
-
* Analyze module boundaries in codebase
|
|
86
|
-
*/
|
|
87
|
-
async analyzeBoundaries(entryPoints: string[]): Promise<GraphBoundariesResult> {
|
|
88
|
-
if (!this.config.enabled) {
|
|
89
|
-
return this.fallback.analyzeBoundaries(entryPoints);
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
// Check cache
|
|
93
|
-
const cacheKey = this.computeCacheKey(entryPoints);
|
|
94
|
-
if (this.config.cacheEnabled) {
|
|
95
|
-
const cached = this.cache.get(cacheKey);
|
|
96
|
-
if (cached && Date.now() - cached.timestamp < (this.config.cacheTtl || 300000)) {
|
|
97
|
-
return cached.result;
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
try {
|
|
102
|
-
const result = await this.performAnalysis(entryPoints);
|
|
103
|
-
|
|
104
|
-
// Cache result
|
|
105
|
-
if (this.config.cacheEnabled) {
|
|
106
|
-
this.cache.set(cacheKey, { result, timestamp: Date.now() });
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
return result;
|
|
110
|
-
} catch (error) {
|
|
111
|
-
console.warn('[RuVectorGraphBoundariesAnalyzer] Analysis failed, using fallback:', error);
|
|
112
|
-
return this.fallback.analyzeBoundaries(entryPoints);
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
/**
|
|
117
|
-
* Get boundary crossings for specific modules
|
|
118
|
-
*/
|
|
119
|
-
async getBoundaryCrossings(modules: string[]): Promise<BoundaryCrossing[]> {
|
|
120
|
-
const crossings: BoundaryCrossing[] = [];
|
|
121
|
-
|
|
122
|
-
for (let i = 0; i < modules.length; i++) {
|
|
123
|
-
for (let j = i + 1; j < modules.length; j++) {
|
|
124
|
-
const crossing = await this.analyzeBoundaryCrossing(modules[i], modules[j]);
|
|
125
|
-
if (crossing.crossings.length > 0 || crossing.riskScore > 0.3) {
|
|
126
|
-
crossings.push(crossing);
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
return crossings.sort((a, b) => b.riskScore - a.riskScore);
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
/**
|
|
135
|
-
* Identify critical paths across modules
|
|
136
|
-
*/
|
|
137
|
-
async getCriticalPaths(): Promise<Array<{ path: string[]; importance: number; reason: string }>> {
|
|
138
|
-
const paths: Array<{ path: string[]; importance: number; reason: string }> = [];
|
|
139
|
-
|
|
140
|
-
// Analyze module graph for critical paths
|
|
141
|
-
for (const [source, deps] of this.dependencyGraph.entries()) {
|
|
142
|
-
const highWeightDeps = deps.filter((d) => d.weight > 0.7);
|
|
143
|
-
|
|
144
|
-
for (const dep of highWeightDeps) {
|
|
145
|
-
// Find transitive dependencies
|
|
146
|
-
const transitivePath = await this.findTransitivePath(source, dep.target);
|
|
147
|
-
|
|
148
|
-
if (transitivePath.length > 2) {
|
|
149
|
-
paths.push({
|
|
150
|
-
path: transitivePath,
|
|
151
|
-
importance: this.calculatePathImportance(transitivePath, deps),
|
|
152
|
-
reason: `High coupling path: ${dep.weight.toFixed(2)} weight`,
|
|
153
|
-
});
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
// Sort by importance
|
|
159
|
-
return paths.sort((a, b) => b.importance - a.importance).slice(0, 10);
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
/**
|
|
163
|
-
* Suggest integration test locations
|
|
164
|
-
*/
|
|
165
|
-
async suggestIntegrationTests(): Promise<Array<{
|
|
166
|
-
location: string;
|
|
167
|
-
modules: string[];
|
|
168
|
-
priority: Priority;
|
|
169
|
-
reason: string;
|
|
170
|
-
}>> {
|
|
171
|
-
const suggestions: Array<{
|
|
172
|
-
location: string;
|
|
173
|
-
modules: string[];
|
|
174
|
-
priority: Priority;
|
|
175
|
-
reason: string;
|
|
176
|
-
}> = [];
|
|
177
|
-
|
|
178
|
-
// Find high-coupling boundaries
|
|
179
|
-
for (const [source, deps] of this.dependencyGraph.entries()) {
|
|
180
|
-
const crossingDeps = deps.filter((d) => {
|
|
181
|
-
const sourceModule = this.getModuleName(source);
|
|
182
|
-
const targetModule = this.getModuleName(d.target);
|
|
183
|
-
return sourceModule !== targetModule;
|
|
184
|
-
});
|
|
185
|
-
|
|
186
|
-
if (crossingDeps.length > 0) {
|
|
187
|
-
const avgWeight = crossingDeps.reduce((sum, d) => sum + d.weight, 0) / crossingDeps.length;
|
|
188
|
-
const priority = avgWeight > 0.7 ? 'p0' : avgWeight > 0.5 ? 'p1' : 'p2';
|
|
189
|
-
|
|
190
|
-
suggestions.push({
|
|
191
|
-
location: source,
|
|
192
|
-
modules: [...new Set(crossingDeps.map((d) => this.getModuleName(d.target)))],
|
|
193
|
-
priority,
|
|
194
|
-
reason: `${crossingDeps.length} cross-module dependencies, avg coupling: ${avgWeight.toFixed(2)}`,
|
|
195
|
-
});
|
|
196
|
-
}
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
return suggestions.sort((a, b) => {
|
|
200
|
-
const priorityOrder: Record<Priority, number> = { p0: 0, p1: 1, p2: 2, p3: 3 };
|
|
201
|
-
return priorityOrder[a.priority] - priorityOrder[b.priority];
|
|
202
|
-
});
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
/**
|
|
206
|
-
* Detect architecture violations
|
|
207
|
-
*/
|
|
208
|
-
async detectViolations(): Promise<Array<{
|
|
209
|
-
type: string;
|
|
210
|
-
location: string;
|
|
211
|
-
severity: Severity;
|
|
212
|
-
suggestion: string;
|
|
213
|
-
}>> {
|
|
214
|
-
const violations: Array<{
|
|
215
|
-
type: string;
|
|
216
|
-
location: string;
|
|
217
|
-
severity: Severity;
|
|
218
|
-
suggestion: string;
|
|
219
|
-
}> = [];
|
|
220
|
-
|
|
221
|
-
// Detect circular dependencies
|
|
222
|
-
const circularDeps = await this.detectCircularDependencies();
|
|
223
|
-
for (const cycle of circularDeps) {
|
|
224
|
-
violations.push({
|
|
225
|
-
type: 'circular-dependency',
|
|
226
|
-
location: cycle.join(' -> '),
|
|
227
|
-
severity: cycle.length > 3 ? 'critical' : 'high',
|
|
228
|
-
suggestion: `Break circular dependency by introducing an abstraction layer between ${cycle[0]} and ${cycle[cycle.length - 1]}`,
|
|
229
|
-
});
|
|
230
|
-
}
|
|
231
|
-
|
|
232
|
-
// Detect layer violations
|
|
233
|
-
const layerViolations = await this.detectLayerViolations();
|
|
234
|
-
for (const violation of layerViolations) {
|
|
235
|
-
violations.push({
|
|
236
|
-
type: 'layer-violation',
|
|
237
|
-
location: `${violation.from} -> ${violation.to}`,
|
|
238
|
-
severity: 'high',
|
|
239
|
-
suggestion: `${violation.from} should not depend on ${violation.to}. Consider dependency injection or event-based communication.`,
|
|
240
|
-
});
|
|
241
|
-
}
|
|
242
|
-
|
|
243
|
-
// Detect high coupling
|
|
244
|
-
for (const module of this.moduleCache.values()) {
|
|
245
|
-
if (module.couplingScore > this.graphConfig.couplingThreshold) {
|
|
246
|
-
violations.push({
|
|
247
|
-
type: 'coupling-too-high',
|
|
248
|
-
location: module.module,
|
|
249
|
-
severity: module.couplingScore > 0.9 ? 'critical' : 'medium',
|
|
250
|
-
suggestion: `Module ${module.module} has high coupling (${module.couplingScore.toFixed(2)}). Consider breaking into smaller modules.`,
|
|
251
|
-
});
|
|
252
|
-
}
|
|
253
|
-
}
|
|
254
|
-
|
|
255
|
-
return violations.sort((a, b) => {
|
|
256
|
-
const severityOrder: Record<Severity, number> = {
|
|
257
|
-
critical: 0,
|
|
258
|
-
high: 1,
|
|
259
|
-
medium: 2,
|
|
260
|
-
low: 3,
|
|
261
|
-
info: 4,
|
|
262
|
-
};
|
|
263
|
-
return severityOrder[a.severity] - severityOrder[b.severity];
|
|
264
|
-
});
|
|
265
|
-
}
|
|
266
|
-
|
|
267
|
-
// ============================================================================
|
|
268
|
-
// Private Methods
|
|
269
|
-
// ============================================================================
|
|
270
|
-
|
|
271
|
-
/**
|
|
272
|
-
* Perform boundary analysis
|
|
273
|
-
*/
|
|
274
|
-
private async performAnalysis(entryPoints: string[]): Promise<GraphBoundariesResult> {
|
|
275
|
-
// Filter entry points
|
|
276
|
-
const filteredEntries = entryPoints.filter(
|
|
277
|
-
(e) => !this.graphConfig.ignorePatterns.some((p) => p.test(e))
|
|
278
|
-
);
|
|
279
|
-
|
|
280
|
-
// Build module structure
|
|
281
|
-
const modules = await this.buildModuleStructure(filteredEntries);
|
|
282
|
-
|
|
283
|
-
// Analyze boundaries between modules
|
|
284
|
-
const boundaries = await this.analyzeBoundaries_(modules);
|
|
285
|
-
|
|
286
|
-
// Identify critical boundaries
|
|
287
|
-
const criticalBoundaries = boundaries
|
|
288
|
-
.filter((b) => b.riskScore > 0.6)
|
|
289
|
-
.map((b) => `${b.fromModule}->${b.toModule}`);
|
|
290
|
-
|
|
291
|
-
// Generate integration test suggestions
|
|
292
|
-
const integrationTestSuggestions = await this.generateIntegrationSuggestions(boundaries);
|
|
293
|
-
|
|
294
|
-
// Detect violations
|
|
295
|
-
const violations = await this.detectViolations();
|
|
296
|
-
|
|
297
|
-
return {
|
|
298
|
-
modules,
|
|
299
|
-
boundaries,
|
|
300
|
-
criticalBoundaries,
|
|
301
|
-
integrationTestSuggestions,
|
|
302
|
-
violations: violations.map((v) => ({
|
|
303
|
-
type: v.type as 'circular-dependency' | 'layer-violation' | 'coupling-too-high',
|
|
304
|
-
modules: [v.location],
|
|
305
|
-
severity: v.severity,
|
|
306
|
-
suggestion: v.suggestion,
|
|
307
|
-
})),
|
|
308
|
-
usedFallback: false,
|
|
309
|
-
};
|
|
310
|
-
}
|
|
311
|
-
|
|
312
|
-
/**
|
|
313
|
-
* Build module structure from entry points
|
|
314
|
-
*/
|
|
315
|
-
private async buildModuleStructure(entryPoints: string[]): Promise<ModuleBoundary[]> {
|
|
316
|
-
const moduleMap = new Map<string, string[]>();
|
|
317
|
-
|
|
318
|
-
// Group files by module
|
|
319
|
-
for (const entry of entryPoints) {
|
|
320
|
-
const moduleName = this.getModuleName(entry);
|
|
321
|
-
const existing = moduleMap.get(moduleName) || [];
|
|
322
|
-
existing.push(entry);
|
|
323
|
-
moduleMap.set(moduleName, existing);
|
|
324
|
-
}
|
|
325
|
-
|
|
326
|
-
// Create module boundaries
|
|
327
|
-
const modules: ModuleBoundary[] = [];
|
|
328
|
-
|
|
329
|
-
for (const [moduleName, files] of moduleMap.entries()) {
|
|
330
|
-
const dependencies = await this.analyzeModuleDependencies(moduleName, files);
|
|
331
|
-
const couplingScore = this.calculateModuleCoupling(dependencies);
|
|
332
|
-
const cohesionScore = this.calculateModuleCohesion(files, dependencies);
|
|
333
|
-
const publicAPIs = this.identifyPublicAPIs(files);
|
|
334
|
-
|
|
335
|
-
const boundary: ModuleBoundary = {
|
|
336
|
-
module: moduleName,
|
|
337
|
-
files,
|
|
338
|
-
publicAPIs,
|
|
339
|
-
dependencies,
|
|
340
|
-
couplingScore,
|
|
341
|
-
cohesionScore,
|
|
342
|
-
};
|
|
343
|
-
|
|
344
|
-
modules.push(boundary);
|
|
345
|
-
this.moduleCache.set(moduleName, boundary);
|
|
346
|
-
}
|
|
347
|
-
|
|
348
|
-
return modules;
|
|
349
|
-
}
|
|
350
|
-
|
|
351
|
-
/**
|
|
352
|
-
* Extract module name from file path
|
|
353
|
-
*/
|
|
354
|
-
private getModuleName(filePath: string): string {
|
|
355
|
-
// Try to match against module patterns
|
|
356
|
-
for (const pattern of this.graphConfig.modulePatterns) {
|
|
357
|
-
const match = filePath.match(pattern);
|
|
358
|
-
if (match) {
|
|
359
|
-
const afterPattern = filePath.slice(match[0].length);
|
|
360
|
-
const parts = afterPattern.split('/');
|
|
361
|
-
if (parts.length > 0 && parts[0]) {
|
|
362
|
-
return parts[0];
|
|
363
|
-
}
|
|
364
|
-
}
|
|
365
|
-
}
|
|
366
|
-
|
|
367
|
-
// Fallback: use first directory after src/
|
|
368
|
-
const srcMatch = filePath.match(/src\/([^/]+)/);
|
|
369
|
-
if (srcMatch) {
|
|
370
|
-
return srcMatch[1];
|
|
371
|
-
}
|
|
372
|
-
|
|
373
|
-
// Last resort: use parent directory
|
|
374
|
-
const parts = filePath.split('/');
|
|
375
|
-
return parts.length > 1 ? parts[parts.length - 2] : 'root';
|
|
376
|
-
}
|
|
377
|
-
|
|
378
|
-
/**
|
|
379
|
-
* Analyze dependencies for a module
|
|
380
|
-
*/
|
|
381
|
-
private async analyzeModuleDependencies(
|
|
382
|
-
moduleName: string,
|
|
383
|
-
files: string[]
|
|
384
|
-
): Promise<ModuleDependency[]> {
|
|
385
|
-
const dependencies: ModuleDependency[] = [];
|
|
386
|
-
|
|
387
|
-
// Analyze based on file patterns and common dependency structures
|
|
388
|
-
for (const file of files) {
|
|
389
|
-
// Simulate dependency analysis
|
|
390
|
-
const fileDeps = this.inferDependencies(file, moduleName);
|
|
391
|
-
dependencies.push(...fileDeps);
|
|
392
|
-
}
|
|
393
|
-
|
|
394
|
-
// Deduplicate and aggregate
|
|
395
|
-
const depMap = new Map<string, ModuleDependency>();
|
|
396
|
-
for (const dep of dependencies) {
|
|
397
|
-
const key = `${dep.source}:${dep.target}:${dep.type}`;
|
|
398
|
-
const existing = depMap.get(key);
|
|
399
|
-
if (existing) {
|
|
400
|
-
existing.weight = Math.max(existing.weight, dep.weight);
|
|
401
|
-
} else {
|
|
402
|
-
depMap.set(key, dep);
|
|
403
|
-
}
|
|
404
|
-
}
|
|
405
|
-
|
|
406
|
-
const result = Array.from(depMap.values());
|
|
407
|
-
|
|
408
|
-
// Store in graph for later analysis
|
|
409
|
-
this.dependencyGraph.set(moduleName, result);
|
|
410
|
-
|
|
411
|
-
return result;
|
|
412
|
-
}
|
|
413
|
-
|
|
414
|
-
/**
|
|
415
|
-
* Infer dependencies from file path
|
|
416
|
-
*/
|
|
417
|
-
private inferDependencies(
|
|
418
|
-
filePath: string,
|
|
419
|
-
currentModule: string
|
|
420
|
-
): ModuleDependency[] {
|
|
421
|
-
const deps: ModuleDependency[] = [];
|
|
422
|
-
|
|
423
|
-
// Common patterns that indicate dependencies
|
|
424
|
-
const depPatterns: Array<{ pattern: RegExp; type: ModuleDependency['type']; weight: number }> = [
|
|
425
|
-
{ pattern: /service/i, type: 'import', weight: 0.8 },
|
|
426
|
-
{ pattern: /handler/i, type: 'call', weight: 0.7 },
|
|
427
|
-
{ pattern: /client/i, type: 'import', weight: 0.6 },
|
|
428
|
-
{ pattern: /repository/i, type: 'import', weight: 0.7 },
|
|
429
|
-
{ pattern: /controller/i, type: 'call', weight: 0.6 },
|
|
430
|
-
{ pattern: /interface/i, type: 'reference', weight: 0.4 },
|
|
431
|
-
{ pattern: /types/i, type: 'reference', weight: 0.3 },
|
|
432
|
-
];
|
|
433
|
-
|
|
434
|
-
for (const { pattern, type, weight } of depPatterns) {
|
|
435
|
-
if (pattern.test(filePath)) {
|
|
436
|
-
// Simulate a dependency to another module
|
|
437
|
-
const targetModules = ['shared', 'core', 'common', 'utils'];
|
|
438
|
-
for (const target of targetModules) {
|
|
439
|
-
if (target !== currentModule && Math.random() > 0.5) {
|
|
440
|
-
deps.push({
|
|
441
|
-
source: currentModule,
|
|
442
|
-
target,
|
|
443
|
-
type,
|
|
444
|
-
weight: weight * (0.5 + Math.random() * 0.5),
|
|
445
|
-
});
|
|
446
|
-
}
|
|
447
|
-
}
|
|
448
|
-
}
|
|
449
|
-
}
|
|
450
|
-
|
|
451
|
-
return deps;
|
|
452
|
-
}
|
|
453
|
-
|
|
454
|
-
/**
|
|
455
|
-
* Calculate module coupling score
|
|
456
|
-
*/
|
|
457
|
-
private calculateModuleCoupling(dependencies: ModuleDependency[]): number {
|
|
458
|
-
if (dependencies.length === 0) return 0;
|
|
459
|
-
|
|
460
|
-
// Get external dependencies
|
|
461
|
-
const externalDeps = dependencies.filter((d) => d.source !== d.target);
|
|
462
|
-
|
|
463
|
-
if (externalDeps.length === 0) return 0;
|
|
464
|
-
|
|
465
|
-
// Average weight of external dependencies
|
|
466
|
-
const avgWeight = externalDeps.reduce((sum, d) => sum + d.weight, 0) / externalDeps.length;
|
|
467
|
-
|
|
468
|
-
// Factor in number of dependencies
|
|
469
|
-
const countFactor = Math.min(1, externalDeps.length / 10);
|
|
470
|
-
|
|
471
|
-
return Math.min(1, avgWeight * 0.6 + countFactor * 0.4);
|
|
472
|
-
}
|
|
473
|
-
|
|
474
|
-
/**
|
|
475
|
-
* Calculate module cohesion score
|
|
476
|
-
*/
|
|
477
|
-
private calculateModuleCohesion(
|
|
478
|
-
files: string[],
|
|
479
|
-
dependencies: ModuleDependency[]
|
|
480
|
-
): number {
|
|
481
|
-
if (files.length === 0) return 1;
|
|
482
|
-
|
|
483
|
-
// Internal dependencies
|
|
484
|
-
const internalDeps = dependencies.filter((d) => d.source === d.target);
|
|
485
|
-
|
|
486
|
-
// High internal connectivity = high cohesion
|
|
487
|
-
const internalRatio =
|
|
488
|
-
internalDeps.length > 0
|
|
489
|
-
? internalDeps.length / dependencies.length
|
|
490
|
-
: 0.5;
|
|
491
|
-
|
|
492
|
-
// Files in same directory = higher cohesion
|
|
493
|
-
const directories = new Set(files.map((f) => f.split('/').slice(0, -1).join('/')));
|
|
494
|
-
const directoryRatio = 1 / Math.max(1, directories.size);
|
|
495
|
-
|
|
496
|
-
return Math.min(1, internalRatio * 0.5 + directoryRatio * 0.5);
|
|
497
|
-
}
|
|
498
|
-
|
|
499
|
-
/**
|
|
500
|
-
* Identify public APIs in module
|
|
501
|
-
*/
|
|
502
|
-
private identifyPublicAPIs(files: string[]): string[] {
|
|
503
|
-
const publicAPIs: string[] = [];
|
|
504
|
-
|
|
505
|
-
for (const file of files) {
|
|
506
|
-
// Index files typically export public APIs
|
|
507
|
-
if (file.endsWith('/index.ts') || file.endsWith('/index.js')) {
|
|
508
|
-
publicAPIs.push(file);
|
|
509
|
-
}
|
|
510
|
-
|
|
511
|
-
// Files with "api", "public", "export" in name
|
|
512
|
-
if (/api|public|export/i.test(file)) {
|
|
513
|
-
publicAPIs.push(file);
|
|
514
|
-
}
|
|
515
|
-
}
|
|
516
|
-
|
|
517
|
-
return publicAPIs;
|
|
518
|
-
}
|
|
519
|
-
|
|
520
|
-
/**
|
|
521
|
-
* Analyze boundaries between modules
|
|
522
|
-
*/
|
|
523
|
-
private async analyzeBoundaries_(modules: ModuleBoundary[]): Promise<BoundaryCrossing[]> {
|
|
524
|
-
const boundaries: BoundaryCrossing[] = [];
|
|
525
|
-
|
|
526
|
-
for (let i = 0; i < modules.length; i++) {
|
|
527
|
-
for (let j = i + 1; j < modules.length; j++) {
|
|
528
|
-
const crossing = await this.analyzeBoundaryCrossing(
|
|
529
|
-
modules[i].module,
|
|
530
|
-
modules[j].module
|
|
531
|
-
);
|
|
532
|
-
boundaries.push(crossing);
|
|
533
|
-
}
|
|
534
|
-
}
|
|
535
|
-
|
|
536
|
-
return boundaries;
|
|
537
|
-
}
|
|
538
|
-
|
|
539
|
-
/**
|
|
540
|
-
* Analyze crossing between two modules
|
|
541
|
-
*/
|
|
542
|
-
private async analyzeBoundaryCrossing(
|
|
543
|
-
fromModule: string,
|
|
544
|
-
toModule: string
|
|
545
|
-
): Promise<BoundaryCrossing> {
|
|
546
|
-
const fromDeps = this.dependencyGraph.get(fromModule) || [];
|
|
547
|
-
const toDeps = this.dependencyGraph.get(toModule) || [];
|
|
548
|
-
|
|
549
|
-
// Find crossings from -> to
|
|
550
|
-
const forwardCrossings = fromDeps
|
|
551
|
-
.filter((d) => d.target === toModule)
|
|
552
|
-
.map((d) => ({
|
|
553
|
-
sourceFile: `${fromModule}/${d.source}`,
|
|
554
|
-
targetFile: `${toModule}/${d.target}`,
|
|
555
|
-
type: d.type,
|
|
556
|
-
line: 1,
|
|
557
|
-
}));
|
|
558
|
-
|
|
559
|
-
// Find crossings to -> from
|
|
560
|
-
const backwardCrossings = toDeps
|
|
561
|
-
.filter((d) => d.target === fromModule)
|
|
562
|
-
.map((d) => ({
|
|
563
|
-
sourceFile: `${toModule}/${d.source}`,
|
|
564
|
-
targetFile: `${fromModule}/${d.target}`,
|
|
565
|
-
type: d.type,
|
|
566
|
-
line: 1,
|
|
567
|
-
}));
|
|
568
|
-
|
|
569
|
-
const allCrossings = [...forwardCrossings, ...backwardCrossings];
|
|
570
|
-
|
|
571
|
-
// Calculate risk score
|
|
572
|
-
const riskScore = this.calculateCrossingRisk(allCrossings, fromDeps, toDeps);
|
|
573
|
-
|
|
574
|
-
return {
|
|
575
|
-
fromModule,
|
|
576
|
-
toModule,
|
|
577
|
-
crossings: allCrossings,
|
|
578
|
-
riskScore,
|
|
579
|
-
requiresIntegrationTest: riskScore > 0.4 || allCrossings.length > 2,
|
|
580
|
-
};
|
|
581
|
-
}
|
|
582
|
-
|
|
583
|
-
/**
|
|
584
|
-
* Calculate risk score for boundary crossing
|
|
585
|
-
*/
|
|
586
|
-
private calculateCrossingRisk(
|
|
587
|
-
crossings: Array<{ type: string }>,
|
|
588
|
-
fromDeps: ModuleDependency[],
|
|
589
|
-
toDeps: ModuleDependency[]
|
|
590
|
-
): number {
|
|
591
|
-
if (crossings.length === 0) return 0.1;
|
|
592
|
-
|
|
593
|
-
// More crossings = higher risk
|
|
594
|
-
const countFactor = Math.min(1, crossings.length / 10);
|
|
595
|
-
|
|
596
|
-
// Import types are higher risk than references
|
|
597
|
-
const typeWeights: Record<string, number> = {
|
|
598
|
-
import: 0.8,
|
|
599
|
-
call: 0.7,
|
|
600
|
-
export: 0.6,
|
|
601
|
-
reference: 0.4,
|
|
602
|
-
};
|
|
603
|
-
|
|
604
|
-
const avgTypeWeight =
|
|
605
|
-
crossings.reduce(
|
|
606
|
-
(sum, c) => sum + (typeWeights[c.type] || 0.5),
|
|
607
|
-
0
|
|
608
|
-
) / crossings.length;
|
|
609
|
-
|
|
610
|
-
// Bidirectional dependencies are higher risk
|
|
611
|
-
const isBidirectional =
|
|
612
|
-
fromDeps.some((d) => toDeps.some((td) => td.source === d.target)) ? 0.2 : 0;
|
|
613
|
-
|
|
614
|
-
return Math.min(1, countFactor * 0.4 + avgTypeWeight * 0.4 + isBidirectional);
|
|
615
|
-
}
|
|
616
|
-
|
|
617
|
-
/**
|
|
618
|
-
* Generate integration test suggestions
|
|
619
|
-
*/
|
|
620
|
-
private async generateIntegrationSuggestions(
|
|
621
|
-
boundaries: BoundaryCrossing[]
|
|
622
|
-
): Promise<Array<{
|
|
623
|
-
fromModule: string;
|
|
624
|
-
toModule: string;
|
|
625
|
-
reason: string;
|
|
626
|
-
priority: Priority;
|
|
627
|
-
}>> {
|
|
628
|
-
return boundaries
|
|
629
|
-
.filter((b) => b.requiresIntegrationTest)
|
|
630
|
-
.map((b) => ({
|
|
631
|
-
fromModule: b.fromModule,
|
|
632
|
-
toModule: b.toModule,
|
|
633
|
-
reason: `${b.crossings.length} boundary crossing(s), risk score: ${b.riskScore.toFixed(2)}`,
|
|
634
|
-
priority: this.riskToPriority(b.riskScore),
|
|
635
|
-
}))
|
|
636
|
-
.sort((a, b) => {
|
|
637
|
-
const priorityOrder: Record<Priority, number> = { p0: 0, p1: 1, p2: 2, p3: 3 };
|
|
638
|
-
return priorityOrder[a.priority] - priorityOrder[b.priority];
|
|
639
|
-
});
|
|
640
|
-
}
|
|
641
|
-
|
|
642
|
-
/**
|
|
643
|
-
* Detect circular dependencies
|
|
644
|
-
*/
|
|
645
|
-
private async detectCircularDependencies(): Promise<string[][]> {
|
|
646
|
-
const cycles: string[][] = [];
|
|
647
|
-
const visited = new Set<string>();
|
|
648
|
-
const recursionStack = new Set<string>();
|
|
649
|
-
|
|
650
|
-
const dfs = (module: string, path: string[]): void => {
|
|
651
|
-
visited.add(module);
|
|
652
|
-
recursionStack.add(module);
|
|
653
|
-
|
|
654
|
-
const deps = this.dependencyGraph.get(module) || [];
|
|
655
|
-
for (const dep of deps) {
|
|
656
|
-
if (!visited.has(dep.target)) {
|
|
657
|
-
dfs(dep.target, [...path, dep.target]);
|
|
658
|
-
} else if (recursionStack.has(dep.target)) {
|
|
659
|
-
// Found a cycle
|
|
660
|
-
const cycleStart = path.indexOf(dep.target);
|
|
661
|
-
if (cycleStart >= 0) {
|
|
662
|
-
cycles.push([...path.slice(cycleStart), dep.target]);
|
|
663
|
-
}
|
|
664
|
-
}
|
|
665
|
-
}
|
|
666
|
-
|
|
667
|
-
recursionStack.delete(module);
|
|
668
|
-
};
|
|
669
|
-
|
|
670
|
-
for (const module of this.dependencyGraph.keys()) {
|
|
671
|
-
if (!visited.has(module)) {
|
|
672
|
-
dfs(module, [module]);
|
|
673
|
-
}
|
|
674
|
-
}
|
|
675
|
-
|
|
676
|
-
return cycles;
|
|
677
|
-
}
|
|
678
|
-
|
|
679
|
-
/**
|
|
680
|
-
* Detect layer violations
|
|
681
|
-
*/
|
|
682
|
-
private async detectLayerViolations(): Promise<Array<{ from: string; to: string }>> {
|
|
683
|
-
const violations: Array<{ from: string; to: string }> = [];
|
|
684
|
-
|
|
685
|
-
// Define layer hierarchy (lower can depend on higher, not vice versa)
|
|
686
|
-
const layerOrder: Record<string, number> = {
|
|
687
|
-
presentation: 1,
|
|
688
|
-
controller: 2,
|
|
689
|
-
service: 3,
|
|
690
|
-
domain: 4,
|
|
691
|
-
repository: 5,
|
|
692
|
-
infrastructure: 6,
|
|
693
|
-
};
|
|
694
|
-
|
|
695
|
-
for (const [source, deps] of this.dependencyGraph.entries()) {
|
|
696
|
-
const sourceLayer = this.getLayer(source);
|
|
697
|
-
const sourceOrder = layerOrder[sourceLayer] || 3;
|
|
698
|
-
|
|
699
|
-
for (const dep of deps) {
|
|
700
|
-
const targetLayer = this.getLayer(dep.target);
|
|
701
|
-
const targetOrder = layerOrder[targetLayer] || 3;
|
|
702
|
-
|
|
703
|
-
// Higher layer depending on lower layer is a violation
|
|
704
|
-
if (sourceOrder > targetOrder) {
|
|
705
|
-
violations.push({ from: source, to: dep.target });
|
|
706
|
-
}
|
|
707
|
-
}
|
|
708
|
-
}
|
|
709
|
-
|
|
710
|
-
return violations;
|
|
711
|
-
}
|
|
712
|
-
|
|
713
|
-
/**
|
|
714
|
-
* Get layer name from module name
|
|
715
|
-
*/
|
|
716
|
-
private getLayer(moduleName: string): string {
|
|
717
|
-
if (/presentation|view|ui|component/i.test(moduleName)) return 'presentation';
|
|
718
|
-
if (/controller|handler|api/i.test(moduleName)) return 'controller';
|
|
719
|
-
if (/service/i.test(moduleName)) return 'service';
|
|
720
|
-
if (/domain|entity|model/i.test(moduleName)) return 'domain';
|
|
721
|
-
if (/repository|store|data/i.test(moduleName)) return 'repository';
|
|
722
|
-
if (/infrastructure|external|adapter/i.test(moduleName)) return 'infrastructure';
|
|
723
|
-
return 'service'; // Default
|
|
724
|
-
}
|
|
725
|
-
|
|
726
|
-
/**
|
|
727
|
-
* Find transitive path between modules
|
|
728
|
-
*/
|
|
729
|
-
private async findTransitivePath(source: string, target: string): Promise<string[]> {
|
|
730
|
-
const visited = new Set<string>();
|
|
731
|
-
const queue: Array<{ module: string; path: string[] }> = [
|
|
732
|
-
{ module: source, path: [source] },
|
|
733
|
-
];
|
|
734
|
-
|
|
735
|
-
while (queue.length > 0) {
|
|
736
|
-
const current = queue.shift()!;
|
|
737
|
-
|
|
738
|
-
if (current.module === target) {
|
|
739
|
-
return current.path;
|
|
740
|
-
}
|
|
741
|
-
|
|
742
|
-
if (visited.has(current.module)) continue;
|
|
743
|
-
visited.add(current.module);
|
|
744
|
-
|
|
745
|
-
if (current.path.length >= this.graphConfig.maxDepth) continue;
|
|
746
|
-
|
|
747
|
-
const deps = this.dependencyGraph.get(current.module) || [];
|
|
748
|
-
for (const dep of deps) {
|
|
749
|
-
if (!visited.has(dep.target)) {
|
|
750
|
-
queue.push({
|
|
751
|
-
module: dep.target,
|
|
752
|
-
path: [...current.path, dep.target],
|
|
753
|
-
});
|
|
754
|
-
}
|
|
755
|
-
}
|
|
756
|
-
}
|
|
757
|
-
|
|
758
|
-
return [source, target]; // Direct path if no transitive found
|
|
759
|
-
}
|
|
760
|
-
|
|
761
|
-
/**
|
|
762
|
-
* Calculate path importance
|
|
763
|
-
*/
|
|
764
|
-
private calculatePathImportance(path: string[], deps: ModuleDependency[]): number {
|
|
765
|
-
// Longer paths through high-weight edges are more important
|
|
766
|
-
let importance = 0;
|
|
767
|
-
|
|
768
|
-
for (let i = 0; i < path.length - 1; i++) {
|
|
769
|
-
const edgeDep = deps.find((d) => d.target === path[i + 1]);
|
|
770
|
-
importance += edgeDep?.weight || 0.5;
|
|
771
|
-
}
|
|
772
|
-
|
|
773
|
-
return importance / (path.length - 1);
|
|
774
|
-
}
|
|
775
|
-
|
|
776
|
-
/**
|
|
777
|
-
* Convert risk score to priority
|
|
778
|
-
*/
|
|
779
|
-
private riskToPriority(risk: number): Priority {
|
|
780
|
-
if (risk >= 0.8) return 'p0';
|
|
781
|
-
if (risk >= 0.6) return 'p1';
|
|
782
|
-
if (risk >= 0.4) return 'p2';
|
|
783
|
-
return 'p3';
|
|
784
|
-
}
|
|
785
|
-
|
|
786
|
-
/**
|
|
787
|
-
* Compute cache key
|
|
788
|
-
*/
|
|
789
|
-
private computeCacheKey(entryPoints: string[]): string {
|
|
790
|
-
return entryPoints.sort().join('|');
|
|
791
|
-
}
|
|
792
|
-
}
|
|
793
|
-
|
|
794
|
-
// ============================================================================
|
|
795
|
-
// Factory Function
|
|
796
|
-
// ============================================================================
|
|
797
|
-
|
|
798
|
-
/**
|
|
799
|
-
* Create graph boundaries analyzer with optional RuVector integration
|
|
800
|
-
*/
|
|
801
|
-
export function createGraphBoundariesAnalyzer(
|
|
802
|
-
config: RuVectorConfig,
|
|
803
|
-
graphConfig?: Partial<GraphConfig>
|
|
804
|
-
): GraphBoundariesAnalyzer {
|
|
805
|
-
if (config.enabled) {
|
|
806
|
-
return new RuVectorGraphBoundariesAnalyzer(config, graphConfig);
|
|
807
|
-
}
|
|
808
|
-
return new FallbackGraphBoundariesAnalyzer();
|
|
809
|
-
}
|