@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,639 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Agentic QE v3 - Testability Scorer Service
|
|
3
|
-
* Evaluates how testable requirements are
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import { Result, ok, err } from '../../../shared/types/index.js';
|
|
7
|
-
import { MemoryBackend } from '../../../kernel/interfaces.js';
|
|
8
|
-
import {
|
|
9
|
-
ITestabilityScoringService,
|
|
10
|
-
Requirement,
|
|
11
|
-
TestabilityScore,
|
|
12
|
-
TestabilityFactor,
|
|
13
|
-
} from '../interfaces.js';
|
|
14
|
-
|
|
15
|
-
/**
|
|
16
|
-
* Configuration for the testability scorer
|
|
17
|
-
*/
|
|
18
|
-
export interface TestabilityScorerConfig {
|
|
19
|
-
defaultThreshold: number;
|
|
20
|
-
weights: FactorWeights;
|
|
21
|
-
enableAIScoring: boolean;
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
/**
|
|
25
|
-
* Factor weights for testability calculation
|
|
26
|
-
*/
|
|
27
|
-
export interface FactorWeights {
|
|
28
|
-
specificity: number;
|
|
29
|
-
measurability: number;
|
|
30
|
-
atomicity: number;
|
|
31
|
-
feasibility: number;
|
|
32
|
-
traceability: number;
|
|
33
|
-
independency: number;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
const DEFAULT_WEIGHTS: FactorWeights = {
|
|
37
|
-
specificity: 0.20,
|
|
38
|
-
measurability: 0.25,
|
|
39
|
-
atomicity: 0.15,
|
|
40
|
-
feasibility: 0.15,
|
|
41
|
-
traceability: 0.10,
|
|
42
|
-
independency: 0.15,
|
|
43
|
-
};
|
|
44
|
-
|
|
45
|
-
const DEFAULT_CONFIG: TestabilityScorerConfig = {
|
|
46
|
-
defaultThreshold: 60,
|
|
47
|
-
weights: DEFAULT_WEIGHTS,
|
|
48
|
-
enableAIScoring: false,
|
|
49
|
-
};
|
|
50
|
-
|
|
51
|
-
/**
|
|
52
|
-
* Testability Scorer Service Implementation
|
|
53
|
-
* Evaluates requirements using SMART-like criteria adapted for testability
|
|
54
|
-
*/
|
|
55
|
-
export class TestabilityScorerService implements ITestabilityScoringService {
|
|
56
|
-
private readonly config: TestabilityScorerConfig;
|
|
57
|
-
|
|
58
|
-
constructor(
|
|
59
|
-
private readonly memory: MemoryBackend,
|
|
60
|
-
config: Partial<TestabilityScorerConfig> = {}
|
|
61
|
-
) {
|
|
62
|
-
this.config = {
|
|
63
|
-
...DEFAULT_CONFIG,
|
|
64
|
-
...config,
|
|
65
|
-
weights: { ...DEFAULT_WEIGHTS, ...config.weights },
|
|
66
|
-
};
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
/**
|
|
70
|
-
* Score a single requirement's testability
|
|
71
|
-
*/
|
|
72
|
-
async scoreRequirement(requirement: Requirement): Promise<Result<TestabilityScore>> {
|
|
73
|
-
try {
|
|
74
|
-
const factors: TestabilityFactor[] = [];
|
|
75
|
-
|
|
76
|
-
// Calculate each factor
|
|
77
|
-
factors.push(this.scoreSpecificity(requirement));
|
|
78
|
-
factors.push(this.scoreMeasurability(requirement));
|
|
79
|
-
factors.push(this.scoreAtomicity(requirement));
|
|
80
|
-
factors.push(this.scoreFeasibility(requirement));
|
|
81
|
-
factors.push(this.scoreTraceability(requirement));
|
|
82
|
-
factors.push(this.scoreIndependency(requirement));
|
|
83
|
-
|
|
84
|
-
// Calculate weighted average
|
|
85
|
-
const totalWeight = factors.reduce((sum, f) => sum + f.weight, 0);
|
|
86
|
-
const weightedSum = factors.reduce((sum, f) => sum + f.score * f.weight, 0);
|
|
87
|
-
const overallScore = Math.round(weightedSum / totalWeight);
|
|
88
|
-
|
|
89
|
-
// Determine category
|
|
90
|
-
const category = this.categorizeScore(overallScore);
|
|
91
|
-
|
|
92
|
-
const score: TestabilityScore = {
|
|
93
|
-
value: overallScore,
|
|
94
|
-
category,
|
|
95
|
-
factors,
|
|
96
|
-
};
|
|
97
|
-
|
|
98
|
-
// Store score for learning and trends
|
|
99
|
-
await this.storeScore(requirement.id, score);
|
|
100
|
-
|
|
101
|
-
return ok(score);
|
|
102
|
-
} catch (error) {
|
|
103
|
-
return err(error instanceof Error ? error : new Error(String(error)));
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
/**
|
|
108
|
-
* Score multiple requirements
|
|
109
|
-
*/
|
|
110
|
-
async scoreRequirements(
|
|
111
|
-
requirements: Requirement[]
|
|
112
|
-
): Promise<Result<Map<string, TestabilityScore>>> {
|
|
113
|
-
try {
|
|
114
|
-
const scores = new Map<string, TestabilityScore>();
|
|
115
|
-
|
|
116
|
-
for (const requirement of requirements) {
|
|
117
|
-
const result = await this.scoreRequirement(requirement);
|
|
118
|
-
if (result.success) {
|
|
119
|
-
scores.set(requirement.id, result.value);
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
return ok(scores);
|
|
124
|
-
} catch (error) {
|
|
125
|
-
return err(error instanceof Error ? error : new Error(String(error)));
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
/**
|
|
130
|
-
* Get improvement suggestions based on score
|
|
131
|
-
*/
|
|
132
|
-
async suggestImprovements(
|
|
133
|
-
requirement: Requirement,
|
|
134
|
-
score: TestabilityScore
|
|
135
|
-
): Promise<Result<string[]>> {
|
|
136
|
-
try {
|
|
137
|
-
const suggestions: string[] = [];
|
|
138
|
-
|
|
139
|
-
// Sort factors by score (lowest first)
|
|
140
|
-
const sortedFactors = [...score.factors].sort((a, b) => a.score - b.score);
|
|
141
|
-
|
|
142
|
-
// Generate suggestions for low-scoring factors
|
|
143
|
-
for (const factor of sortedFactors) {
|
|
144
|
-
if (factor.score < 70) {
|
|
145
|
-
const factorSuggestions = this.getSuggestionsForFactor(
|
|
146
|
-
factor,
|
|
147
|
-
requirement
|
|
148
|
-
);
|
|
149
|
-
suggestions.push(...factorSuggestions);
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
// Add issues as suggestions
|
|
153
|
-
for (const issue of factor.issues) {
|
|
154
|
-
suggestions.push(`Fix: ${issue}`);
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
// Add general suggestions based on overall score
|
|
159
|
-
if (score.value < 50) {
|
|
160
|
-
suggestions.push(
|
|
161
|
-
'Consider rewriting the requirement with clearer, more specific language'
|
|
162
|
-
);
|
|
163
|
-
suggestions.push(
|
|
164
|
-
'Add measurable acceptance criteria using Given-When-Then format'
|
|
165
|
-
);
|
|
166
|
-
} else if (score.value < 70) {
|
|
167
|
-
suggestions.push(
|
|
168
|
-
'Add quantifiable metrics where possible (response times, limits, thresholds)'
|
|
169
|
-
);
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
// Deduplicate suggestions
|
|
173
|
-
const uniqueSuggestions = [...new Set(suggestions)];
|
|
174
|
-
|
|
175
|
-
return ok(uniqueSuggestions.slice(0, 10)); // Limit to top 10
|
|
176
|
-
} catch (error) {
|
|
177
|
-
return err(error instanceof Error ? error : new Error(String(error)));
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
/**
|
|
182
|
-
* Check if score meets threshold
|
|
183
|
-
*/
|
|
184
|
-
meetsThreshold(score: TestabilityScore, threshold: number): boolean {
|
|
185
|
-
return score.value >= threshold;
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
// ============================================================================
|
|
189
|
-
// Factor Scoring Methods
|
|
190
|
-
// ============================================================================
|
|
191
|
-
|
|
192
|
-
/**
|
|
193
|
-
* Score specificity - how specific and unambiguous is the requirement
|
|
194
|
-
*/
|
|
195
|
-
private scoreSpecificity(requirement: Requirement): TestabilityFactor {
|
|
196
|
-
let score = 100;
|
|
197
|
-
const issues: string[] = [];
|
|
198
|
-
|
|
199
|
-
const text = `${requirement.title} ${requirement.description} ${requirement.acceptanceCriteria.join(' ')}`;
|
|
200
|
-
const lowerText = text.toLowerCase();
|
|
201
|
-
|
|
202
|
-
// Check for ambiguous terms
|
|
203
|
-
const ambiguousTerms = [
|
|
204
|
-
'fast', 'quickly', 'efficient', 'user-friendly', 'intuitive',
|
|
205
|
-
'simple', 'easy', 'flexible', 'robust', 'appropriate',
|
|
206
|
-
'reasonable', 'adequate', 'good', 'better', 'best',
|
|
207
|
-
'several', 'many', 'few', 'some', 'most', 'etc',
|
|
208
|
-
];
|
|
209
|
-
|
|
210
|
-
for (const term of ambiguousTerms) {
|
|
211
|
-
if (lowerText.includes(term)) {
|
|
212
|
-
score -= 8;
|
|
213
|
-
issues.push(`Contains ambiguous term: "${term}"`);
|
|
214
|
-
}
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
// Check for specific numbers/metrics
|
|
218
|
-
const hasNumbers = /\d+/.test(text);
|
|
219
|
-
if (!hasNumbers) {
|
|
220
|
-
score -= 15;
|
|
221
|
-
issues.push('No specific numbers or metrics provided');
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
// Check for clear actors/subjects
|
|
225
|
-
const hasActor = /\b(user|admin|system|customer|developer)\b/i.test(text);
|
|
226
|
-
if (!hasActor) {
|
|
227
|
-
score -= 10;
|
|
228
|
-
issues.push('No clear actor/subject specified');
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
// Check description length
|
|
232
|
-
if (requirement.description.length < 50) {
|
|
233
|
-
score -= 10;
|
|
234
|
-
issues.push('Description is too brief for specificity');
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
return {
|
|
238
|
-
name: 'Specificity',
|
|
239
|
-
score: Math.max(0, score),
|
|
240
|
-
weight: this.config.weights.specificity,
|
|
241
|
-
issues,
|
|
242
|
-
};
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
/**
|
|
246
|
-
* Score measurability - can the requirement be objectively verified
|
|
247
|
-
*/
|
|
248
|
-
private scoreMeasurability(requirement: Requirement): TestabilityFactor {
|
|
249
|
-
let score = 100;
|
|
250
|
-
const issues: string[] = [];
|
|
251
|
-
|
|
252
|
-
const text = `${requirement.description} ${requirement.acceptanceCriteria.join(' ')}`;
|
|
253
|
-
const lowerText = text.toLowerCase();
|
|
254
|
-
|
|
255
|
-
// Check for measurable criteria
|
|
256
|
-
const measurablePatterns = [
|
|
257
|
-
/\d+\s*(ms|seconds?|minutes?|hours?)/i, // Time metrics
|
|
258
|
-
/\d+\s*%/, // Percentages
|
|
259
|
-
/\d+\s*(users?|requests?|transactions?)/i, // Volume metrics
|
|
260
|
-
/\d+\s*(mb|gb|kb)/i, // Size metrics
|
|
261
|
-
/(less than|more than|at least|maximum|minimum)\s*\d+/i,
|
|
262
|
-
/\b(must|shall|should)\b.*\b(be|have|support)\b/i,
|
|
263
|
-
];
|
|
264
|
-
|
|
265
|
-
const hasMeasurables = measurablePatterns.some((p) => p.test(text));
|
|
266
|
-
if (!hasMeasurables) {
|
|
267
|
-
score -= 25;
|
|
268
|
-
issues.push('No measurable criteria found');
|
|
269
|
-
}
|
|
270
|
-
|
|
271
|
-
// Check acceptance criteria for verifiable conditions
|
|
272
|
-
if (requirement.acceptanceCriteria.length === 0) {
|
|
273
|
-
score -= 30;
|
|
274
|
-
issues.push('No acceptance criteria defined');
|
|
275
|
-
} else {
|
|
276
|
-
const verifiableCriteria = requirement.acceptanceCriteria.filter((ac) => {
|
|
277
|
-
const acLower = ac.toLowerCase();
|
|
278
|
-
return (
|
|
279
|
-
/\bthen\b/i.test(ac) ||
|
|
280
|
-
/\b(verify|confirm|check|ensure|assert)\b/i.test(acLower) ||
|
|
281
|
-
/\b(should|must|shall)\b/i.test(acLower)
|
|
282
|
-
);
|
|
283
|
-
});
|
|
284
|
-
|
|
285
|
-
if (verifiableCriteria.length < requirement.acceptanceCriteria.length * 0.5) {
|
|
286
|
-
score -= 15;
|
|
287
|
-
issues.push('Less than half of acceptance criteria are clearly verifiable');
|
|
288
|
-
}
|
|
289
|
-
}
|
|
290
|
-
|
|
291
|
-
// Check for subjective terms
|
|
292
|
-
const subjectiveTerms = ['looks good', 'feels right', 'works well', 'properly'];
|
|
293
|
-
for (const term of subjectiveTerms) {
|
|
294
|
-
if (lowerText.includes(term)) {
|
|
295
|
-
score -= 10;
|
|
296
|
-
issues.push(`Contains subjective term: "${term}"`);
|
|
297
|
-
}
|
|
298
|
-
}
|
|
299
|
-
|
|
300
|
-
return {
|
|
301
|
-
name: 'Measurability',
|
|
302
|
-
score: Math.max(0, score),
|
|
303
|
-
weight: this.config.weights.measurability,
|
|
304
|
-
issues,
|
|
305
|
-
};
|
|
306
|
-
}
|
|
307
|
-
|
|
308
|
-
/**
|
|
309
|
-
* Score atomicity - is the requirement focused and not compound
|
|
310
|
-
*/
|
|
311
|
-
private scoreAtomicity(requirement: Requirement): TestabilityFactor {
|
|
312
|
-
let score = 100;
|
|
313
|
-
const issues: string[] = [];
|
|
314
|
-
|
|
315
|
-
const text = requirement.description;
|
|
316
|
-
const lowerText = text.toLowerCase();
|
|
317
|
-
|
|
318
|
-
// Check for compound statements
|
|
319
|
-
const compoundPatterns = [
|
|
320
|
-
/\band\b.*\band\b/i, // Multiple "and"s
|
|
321
|
-
/\bor\b/i, // Contains "or"
|
|
322
|
-
/\bas well as\b/i,
|
|
323
|
-
/\bin addition\b/i,
|
|
324
|
-
/\balso\b/i,
|
|
325
|
-
/\bfurthermore\b/i,
|
|
326
|
-
];
|
|
327
|
-
|
|
328
|
-
for (const pattern of compoundPatterns) {
|
|
329
|
-
if (pattern.test(lowerText)) {
|
|
330
|
-
score -= 12;
|
|
331
|
-
issues.push('Contains compound statements that may need splitting');
|
|
332
|
-
break;
|
|
333
|
-
}
|
|
334
|
-
}
|
|
335
|
-
|
|
336
|
-
// Check acceptance criteria count (too many might indicate non-atomic)
|
|
337
|
-
if (requirement.acceptanceCriteria.length > 7) {
|
|
338
|
-
score -= 15;
|
|
339
|
-
issues.push('Too many acceptance criteria - consider splitting requirement');
|
|
340
|
-
}
|
|
341
|
-
|
|
342
|
-
// Check for multiple distinct features in description
|
|
343
|
-
const featureIndicators = ['feature', 'capability', 'function', 'ability'];
|
|
344
|
-
let featureCount = 0;
|
|
345
|
-
for (const indicator of featureIndicators) {
|
|
346
|
-
const matches = lowerText.match(new RegExp(indicator, 'g'));
|
|
347
|
-
if (matches) {
|
|
348
|
-
featureCount += matches.length;
|
|
349
|
-
}
|
|
350
|
-
}
|
|
351
|
-
|
|
352
|
-
if (featureCount > 2) {
|
|
353
|
-
score -= 15;
|
|
354
|
-
issues.push('Multiple features/capabilities mentioned - may not be atomic');
|
|
355
|
-
}
|
|
356
|
-
|
|
357
|
-
// Check description length (too long might not be atomic)
|
|
358
|
-
if (requirement.description.length > 500) {
|
|
359
|
-
score -= 10;
|
|
360
|
-
issues.push('Description length suggests requirement may not be atomic');
|
|
361
|
-
}
|
|
362
|
-
|
|
363
|
-
return {
|
|
364
|
-
name: 'Atomicity',
|
|
365
|
-
score: Math.max(0, score),
|
|
366
|
-
weight: this.config.weights.atomicity,
|
|
367
|
-
issues,
|
|
368
|
-
};
|
|
369
|
-
}
|
|
370
|
-
|
|
371
|
-
/**
|
|
372
|
-
* Score feasibility - can the requirement be reasonably tested
|
|
373
|
-
*/
|
|
374
|
-
private scoreFeasibility(requirement: Requirement): TestabilityFactor {
|
|
375
|
-
let score = 100;
|
|
376
|
-
const issues: string[] = [];
|
|
377
|
-
|
|
378
|
-
const text = `${requirement.description} ${requirement.acceptanceCriteria.join(' ')}`;
|
|
379
|
-
const lowerText = text.toLowerCase();
|
|
380
|
-
|
|
381
|
-
// Check for unrealistic requirements
|
|
382
|
-
const unrealisticPatterns = [
|
|
383
|
-
/100%\s*(availability|uptime|coverage)/i,
|
|
384
|
-
/zero\s*(defects?|bugs?|errors?)/i,
|
|
385
|
-
/never\s+(fail|crash|error)/i,
|
|
386
|
-
/always\s+work/i,
|
|
387
|
-
/infinite/i,
|
|
388
|
-
/unlimited/i,
|
|
389
|
-
];
|
|
390
|
-
|
|
391
|
-
for (const pattern of unrealisticPatterns) {
|
|
392
|
-
if (pattern.test(lowerText)) {
|
|
393
|
-
score -= 20;
|
|
394
|
-
issues.push('Contains unrealistic or impossible to verify conditions');
|
|
395
|
-
break;
|
|
396
|
-
}
|
|
397
|
-
}
|
|
398
|
-
|
|
399
|
-
// Check for external dependencies that complicate testing
|
|
400
|
-
const externalDependencies = [
|
|
401
|
-
'third-party', 'external service', 'external api',
|
|
402
|
-
'hardware', 'physical', 'manual',
|
|
403
|
-
];
|
|
404
|
-
|
|
405
|
-
for (const dep of externalDependencies) {
|
|
406
|
-
if (lowerText.includes(dep)) {
|
|
407
|
-
score -= 10;
|
|
408
|
-
issues.push(`Testing complicated by external dependency: ${dep}`);
|
|
409
|
-
}
|
|
410
|
-
}
|
|
411
|
-
|
|
412
|
-
// Check for time-sensitive testing challenges
|
|
413
|
-
if (/real-time|real time/i.test(lowerText)) {
|
|
414
|
-
score -= 5;
|
|
415
|
-
issues.push('Real-time requirements require specialized testing');
|
|
416
|
-
}
|
|
417
|
-
|
|
418
|
-
// Check for security/compliance complexity
|
|
419
|
-
if (/compliance|regulation|legal|gdpr|hipaa/i.test(lowerText)) {
|
|
420
|
-
score -= 5;
|
|
421
|
-
issues.push('Compliance testing may require specialized expertise');
|
|
422
|
-
}
|
|
423
|
-
|
|
424
|
-
return {
|
|
425
|
-
name: 'Feasibility',
|
|
426
|
-
score: Math.max(0, score),
|
|
427
|
-
weight: this.config.weights.feasibility,
|
|
428
|
-
issues,
|
|
429
|
-
};
|
|
430
|
-
}
|
|
431
|
-
|
|
432
|
-
/**
|
|
433
|
-
* Score traceability - can tests be traced back to this requirement
|
|
434
|
-
*/
|
|
435
|
-
private scoreTraceability(requirement: Requirement): TestabilityFactor {
|
|
436
|
-
let score = 100;
|
|
437
|
-
const issues: string[] = [];
|
|
438
|
-
|
|
439
|
-
// Check for requirement ID
|
|
440
|
-
if (!requirement.id || requirement.id.trim() === '') {
|
|
441
|
-
score -= 30;
|
|
442
|
-
issues.push('Requirement lacks a unique identifier');
|
|
443
|
-
}
|
|
444
|
-
|
|
445
|
-
// Check for clear title
|
|
446
|
-
if (requirement.title.length < 10) {
|
|
447
|
-
score -= 15;
|
|
448
|
-
issues.push('Title is too short for effective traceability');
|
|
449
|
-
}
|
|
450
|
-
|
|
451
|
-
// Check for type classification
|
|
452
|
-
if (!requirement.type) {
|
|
453
|
-
score -= 15;
|
|
454
|
-
issues.push('Requirement type not specified');
|
|
455
|
-
}
|
|
456
|
-
|
|
457
|
-
// Check for priority
|
|
458
|
-
if (!requirement.priority) {
|
|
459
|
-
score -= 10;
|
|
460
|
-
issues.push('Requirement priority not specified');
|
|
461
|
-
}
|
|
462
|
-
|
|
463
|
-
// Check for acceptance criteria that can be linked to tests
|
|
464
|
-
const criteriaWithIds = requirement.acceptanceCriteria.filter((ac) =>
|
|
465
|
-
/\[AC[-\d]+\]|#\d+|AC\d+/i.test(ac)
|
|
466
|
-
);
|
|
467
|
-
|
|
468
|
-
if (criteriaWithIds.length === 0 && requirement.acceptanceCriteria.length > 0) {
|
|
469
|
-
score -= 10;
|
|
470
|
-
issues.push('Acceptance criteria lack identifiers for test traceability');
|
|
471
|
-
}
|
|
472
|
-
|
|
473
|
-
return {
|
|
474
|
-
name: 'Traceability',
|
|
475
|
-
score: Math.max(0, score),
|
|
476
|
-
weight: this.config.weights.traceability,
|
|
477
|
-
issues,
|
|
478
|
-
};
|
|
479
|
-
}
|
|
480
|
-
|
|
481
|
-
/**
|
|
482
|
-
* Score independency - can this be tested independently
|
|
483
|
-
*/
|
|
484
|
-
private scoreIndependency(requirement: Requirement): TestabilityFactor {
|
|
485
|
-
let score = 100;
|
|
486
|
-
const issues: string[] = [];
|
|
487
|
-
|
|
488
|
-
const text = `${requirement.description} ${requirement.acceptanceCriteria.join(' ')}`;
|
|
489
|
-
const lowerText = text.toLowerCase();
|
|
490
|
-
|
|
491
|
-
// Check for explicit dependencies
|
|
492
|
-
const dependencyPatterns = [
|
|
493
|
-
/depends on/i,
|
|
494
|
-
/requires\s+(that|the)/i,
|
|
495
|
-
/after\s+(the|completing)/i,
|
|
496
|
-
/following\s+completion/i,
|
|
497
|
-
/prerequisite/i,
|
|
498
|
-
/blocked by/i,
|
|
499
|
-
];
|
|
500
|
-
|
|
501
|
-
for (const pattern of dependencyPatterns) {
|
|
502
|
-
if (pattern.test(lowerText)) {
|
|
503
|
-
score -= 15;
|
|
504
|
-
issues.push('Has explicit dependencies that complicate isolated testing');
|
|
505
|
-
break;
|
|
506
|
-
}
|
|
507
|
-
}
|
|
508
|
-
|
|
509
|
-
// Check for references to other requirements
|
|
510
|
-
const refPatterns = [
|
|
511
|
-
/REQ[-_]?\d+/gi,
|
|
512
|
-
/requirement\s+\d+/gi,
|
|
513
|
-
/see\s+(also|requirement)/i,
|
|
514
|
-
/as described in/i,
|
|
515
|
-
];
|
|
516
|
-
|
|
517
|
-
for (const pattern of refPatterns) {
|
|
518
|
-
if (pattern.test(text)) {
|
|
519
|
-
score -= 10;
|
|
520
|
-
issues.push('References other requirements');
|
|
521
|
-
break;
|
|
522
|
-
}
|
|
523
|
-
}
|
|
524
|
-
|
|
525
|
-
// Check for shared state indicators
|
|
526
|
-
const sharedStateTerms = [
|
|
527
|
-
'global state', 'shared', 'common data', 'same session',
|
|
528
|
-
'across all', 'system-wide',
|
|
529
|
-
];
|
|
530
|
-
|
|
531
|
-
for (const term of sharedStateTerms) {
|
|
532
|
-
if (lowerText.includes(term)) {
|
|
533
|
-
score -= 10;
|
|
534
|
-
issues.push(`Involves shared state: "${term}"`);
|
|
535
|
-
break;
|
|
536
|
-
}
|
|
537
|
-
}
|
|
538
|
-
|
|
539
|
-
return {
|
|
540
|
-
name: 'Independency',
|
|
541
|
-
score: Math.max(0, score),
|
|
542
|
-
weight: this.config.weights.independency,
|
|
543
|
-
issues,
|
|
544
|
-
};
|
|
545
|
-
}
|
|
546
|
-
|
|
547
|
-
// ============================================================================
|
|
548
|
-
// Private Helper Methods
|
|
549
|
-
// ============================================================================
|
|
550
|
-
|
|
551
|
-
private categorizeScore(score: number): TestabilityScore['category'] {
|
|
552
|
-
if (score >= 80) return 'excellent';
|
|
553
|
-
if (score >= 60) return 'good';
|
|
554
|
-
if (score >= 40) return 'fair';
|
|
555
|
-
return 'poor';
|
|
556
|
-
}
|
|
557
|
-
|
|
558
|
-
private getSuggestionsForFactor(
|
|
559
|
-
factor: TestabilityFactor,
|
|
560
|
-
_requirement: Requirement
|
|
561
|
-
): string[] {
|
|
562
|
-
const suggestions: string[] = [];
|
|
563
|
-
|
|
564
|
-
switch (factor.name) {
|
|
565
|
-
case 'Specificity':
|
|
566
|
-
suggestions.push('Replace ambiguous terms with specific, measurable values');
|
|
567
|
-
suggestions.push('Define clear actors (user, system, admin) for each action');
|
|
568
|
-
suggestions.push('Add concrete examples or scenarios');
|
|
569
|
-
break;
|
|
570
|
-
|
|
571
|
-
case 'Measurability':
|
|
572
|
-
suggestions.push('Add quantifiable acceptance criteria (time limits, percentages)');
|
|
573
|
-
suggestions.push('Use Given-When-Then format for each acceptance criterion');
|
|
574
|
-
suggestions.push('Define success/failure conditions explicitly');
|
|
575
|
-
break;
|
|
576
|
-
|
|
577
|
-
case 'Atomicity':
|
|
578
|
-
suggestions.push('Split compound requirements into separate, focused items');
|
|
579
|
-
suggestions.push('Each requirement should describe one testable behavior');
|
|
580
|
-
suggestions.push('Remove "and" chains by creating separate requirements');
|
|
581
|
-
break;
|
|
582
|
-
|
|
583
|
-
case 'Feasibility':
|
|
584
|
-
suggestions.push('Replace absolute terms (100%, never, always) with realistic thresholds');
|
|
585
|
-
suggestions.push('Document test environment requirements for external dependencies');
|
|
586
|
-
suggestions.push('Consider mock/stub strategies for third-party integrations');
|
|
587
|
-
break;
|
|
588
|
-
|
|
589
|
-
case 'Traceability':
|
|
590
|
-
suggestions.push('Ensure requirement has a unique, persistent identifier');
|
|
591
|
-
suggestions.push('Add identifiers to each acceptance criterion (e.g., AC-1, AC-2)');
|
|
592
|
-
suggestions.push('Link to related design documents or user stories');
|
|
593
|
-
break;
|
|
594
|
-
|
|
595
|
-
case 'Independency':
|
|
596
|
-
suggestions.push('Document dependencies explicitly for test planning');
|
|
597
|
-
suggestions.push('Consider if the requirement can be broken down to reduce dependencies');
|
|
598
|
-
suggestions.push('Design tests that can run in isolation with proper setup/teardown');
|
|
599
|
-
break;
|
|
600
|
-
}
|
|
601
|
-
|
|
602
|
-
return suggestions;
|
|
603
|
-
}
|
|
604
|
-
|
|
605
|
-
private async storeScore(
|
|
606
|
-
requirementId: string,
|
|
607
|
-
score: TestabilityScore
|
|
608
|
-
): Promise<void> {
|
|
609
|
-
await this.memory.set(
|
|
610
|
-
`requirements-validation:testability:${requirementId}`,
|
|
611
|
-
{
|
|
612
|
-
requirementId,
|
|
613
|
-
score,
|
|
614
|
-
scoredAt: new Date().toISOString(),
|
|
615
|
-
},
|
|
616
|
-
{ namespace: 'requirements-validation', ttl: 86400 * 30 } // 30 days
|
|
617
|
-
);
|
|
618
|
-
|
|
619
|
-
// Also store for trend analysis
|
|
620
|
-
const trendKey = `requirements-validation:testability-trend:${requirementId}`;
|
|
621
|
-
const existingTrend = await this.memory.get<{ scores: Array<{ score: number; date: string }> }>(trendKey);
|
|
622
|
-
|
|
623
|
-
const trend = existingTrend || { scores: [] };
|
|
624
|
-
trend.scores.push({
|
|
625
|
-
score: score.value,
|
|
626
|
-
date: new Date().toISOString(),
|
|
627
|
-
});
|
|
628
|
-
|
|
629
|
-
// Keep last 10 scores
|
|
630
|
-
if (trend.scores.length > 10) {
|
|
631
|
-
trend.scores = trend.scores.slice(-10);
|
|
632
|
-
}
|
|
633
|
-
|
|
634
|
-
await this.memory.set(trendKey, trend, {
|
|
635
|
-
namespace: 'requirements-validation',
|
|
636
|
-
persist: true,
|
|
637
|
-
});
|
|
638
|
-
}
|
|
639
|
-
}
|