agentic-qe 1.4.3 → 1.5.0
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/.claude/agents/qe-api-contract-validator.md +133 -27
- package/.claude/agents/qe-api-contract-validator.md.backup +1148 -0
- package/.claude/agents/qe-api-contract-validator.md.backup-20251107-134747 +1148 -0
- package/.claude/agents/qe-api-contract-validator.md.backup-phase2-20251107-140039 +1123 -0
- package/.claude/agents/qe-chaos-engineer.md +142 -23
- package/.claude/agents/qe-chaos-engineer.md.backup +808 -0
- package/.claude/agents/qe-chaos-engineer.md.backup-20251107-134747 +808 -0
- package/.claude/agents/qe-chaos-engineer.md.backup-phase2-20251107-140039 +787 -0
- package/.claude/agents/qe-code-complexity.md +111 -23
- package/.claude/agents/qe-code-complexity.md.backup +291 -0
- package/.claude/agents/qe-code-complexity.md.backup-20251107-134747 +291 -0
- package/.claude/agents/qe-code-complexity.md.backup-phase2-20251107-140039 +286 -0
- package/.claude/agents/qe-coverage-analyzer.md +306 -30
- package/.claude/agents/qe-coverage-analyzer.md.backup +467 -0
- package/.claude/agents/qe-coverage-analyzer.md.backup-20251107-134747 +467 -0
- package/.claude/agents/qe-coverage-analyzer.md.backup-phase2-20251107-140039 +438 -0
- package/.claude/agents/qe-deployment-readiness.md +84 -28
- package/.claude/agents/qe-deployment-readiness.md.backup +1166 -0
- package/.claude/agents/qe-deployment-readiness.md.backup-20251107-134747 +1166 -0
- package/.claude/agents/qe-deployment-readiness.md.backup-phase2-20251107-140039 +1140 -0
- package/.claude/agents/qe-flaky-test-hunter.md +277 -35
- package/.claude/agents/qe-flaky-test-hunter.md.backup +1195 -0
- package/.claude/agents/qe-flaky-test-hunter.md.backup-20251107-134747 +1195 -0
- package/.claude/agents/qe-flaky-test-hunter.md.backup-phase2-20251107-140039 +1162 -0
- package/.claude/agents/qe-fleet-commander.md +126 -23
- package/.claude/agents/qe-fleet-commander.md.backup +718 -0
- package/.claude/agents/qe-fleet-commander.md.backup-20251107-134747 +718 -0
- package/.claude/agents/qe-fleet-commander.md.backup-phase2-20251107-140039 +697 -0
- package/.claude/agents/qe-performance-tester.md +314 -57
- package/.claude/agents/qe-performance-tester.md.backup +428 -0
- package/.claude/agents/qe-performance-tester.md.backup-20251107-134747 +428 -0
- package/.claude/agents/qe-performance-tester.md.backup-phase2-20251107-140039 +372 -0
- package/.claude/agents/qe-production-intelligence.md +126 -27
- package/.claude/agents/qe-production-intelligence.md.backup +1219 -0
- package/.claude/agents/qe-production-intelligence.md.backup-20251107-134747 +1219 -0
- package/.claude/agents/qe-production-intelligence.md.backup-phase2-20251107-140039 +1194 -0
- package/.claude/agents/qe-quality-analyzer.md +127 -32
- package/.claude/agents/qe-quality-analyzer.md.backup +425 -0
- package/.claude/agents/qe-quality-analyzer.md.backup-20251107-134747 +425 -0
- package/.claude/agents/qe-quality-analyzer.md.backup-phase2-20251107-140039 +394 -0
- package/.claude/agents/qe-quality-gate.md +148 -33
- package/.claude/agents/qe-quality-gate.md.backup +446 -0
- package/.claude/agents/qe-quality-gate.md.backup-20251107-134747 +446 -0
- package/.claude/agents/qe-quality-gate.md.backup-phase2-20251107-140039 +415 -0
- package/.claude/agents/qe-regression-risk-analyzer.md +78 -27
- package/.claude/agents/qe-regression-risk-analyzer.md.backup +1009 -0
- package/.claude/agents/qe-regression-risk-analyzer.md.backup-20251107-134747 +1009 -0
- package/.claude/agents/qe-regression-risk-analyzer.md.backup-phase2-20251107-140039 +984 -0
- package/.claude/agents/qe-requirements-validator.md +131 -27
- package/.claude/agents/qe-requirements-validator.md.backup +748 -0
- package/.claude/agents/qe-requirements-validator.md.backup-20251107-134747 +748 -0
- package/.claude/agents/qe-requirements-validator.md.backup-phase2-20251107-140039 +723 -0
- package/.claude/agents/qe-security-scanner.md +137 -62
- package/.claude/agents/qe-security-scanner.md.backup +634 -0
- package/.claude/agents/qe-security-scanner.md.backup-20251107-134747 +634 -0
- package/.claude/agents/qe-security-scanner.md.backup-phase2-20251107-140039 +573 -0
- package/.claude/agents/qe-test-data-architect.md +129 -26
- package/.claude/agents/qe-test-data-architect.md.backup +1064 -0
- package/.claude/agents/qe-test-data-architect.md.backup-20251107-134747 +1064 -0
- package/.claude/agents/qe-test-data-architect.md.backup-phase2-20251107-140039 +1040 -0
- package/.claude/agents/qe-test-executor.md +165 -21
- package/.claude/agents/qe-test-executor.md.backup +389 -0
- package/.claude/agents/qe-test-executor.md.backup-20251107-134747 +389 -0
- package/.claude/agents/qe-test-executor.md.backup-phase2-20251107-140039 +369 -0
- package/.claude/agents/qe-test-generator.md +379 -34
- package/.claude/agents/qe-test-generator.md.backup +997 -0
- package/.claude/agents/qe-test-generator.md.backup-20251107-134747 +997 -0
- package/.claude/agents/qe-visual-tester.md +236 -23
- package/.claude/agents/qe-visual-tester.md.backup +777 -0
- package/.claude/agents/qe-visual-tester.md.backup-20251107-134747 +777 -0
- package/.claude/agents/qe-visual-tester.md.backup-phase2-20251107-140039 +756 -0
- package/.claude/agents/subagents/qe-code-reviewer.md +59 -0
- package/.claude/agents/subagents/qe-data-generator.md +60 -0
- package/.claude/agents/subagents/qe-integration-tester.md +77 -0
- package/.claude/agents/subagents/qe-performance-validator.md +55 -0
- package/.claude/agents/subagents/qe-security-auditor.md +51 -0
- package/.claude/agents/subagents/qe-test-implementer.md +371 -0
- package/.claude/agents/subagents/qe-test-refactorer.md +510 -0
- package/.claude/agents/subagents/qe-test-writer.md +603 -0
- package/.claude/skills/accessibility-testing/SKILL.md +764 -777
- package/.claude/skills/agentic-quality-engineering/SKILL.md +0 -6
- package/.claude/skills/api-testing-patterns/SKILL.md +0 -12
- package/.claude/skills/bug-reporting-excellence/SKILL.md +0 -6
- package/.claude/skills/chaos-engineering-resilience/SKILL.md +0 -6
- package/.claude/skills/code-review-quality/SKILL.md +0 -6
- package/.claude/skills/compatibility-testing/SKILL.md +0 -6
- package/.claude/skills/compliance-testing/SKILL.md +0 -6
- package/.claude/skills/consultancy-practices/SKILL.md +0 -6
- package/.claude/skills/context-driven-testing/SKILL.md +0 -6
- package/.claude/skills/contract-testing/SKILL.md +0 -6
- package/.claude/skills/database-testing/SKILL.md +0 -6
- package/.claude/skills/exploratory-testing-advanced/SKILL.md +0 -6
- package/.claude/skills/holistic-testing-pact/SKILL.md +0 -6
- package/.claude/skills/localization-testing/SKILL.md +0 -6
- package/.claude/skills/mobile-testing/SKILL.md +535 -548
- package/.claude/skills/mutation-testing/SKILL.md +0 -6
- package/.claude/skills/performance-testing/SKILL.md +0 -6
- package/.claude/skills/quality-metrics/SKILL.md +0 -12
- package/.claude/skills/refactoring-patterns/SKILL.md +0 -6
- package/.claude/skills/regression-testing/SKILL.md +1033 -1045
- package/.claude/skills/risk-based-testing/SKILL.md +0 -12
- package/.claude/skills/security-testing/SKILL.md +0 -6
- package/.claude/skills/shift-left-testing/SKILL.md +529 -535
- package/.claude/skills/shift-right-testing/SKILL.md +585 -591
- package/.claude/skills/tdd-london-chicago/SKILL.md +0 -6
- package/.claude/skills/technical-writing/SKILL.md +0 -6
- package/.claude/skills/test-automation-strategy/SKILL.md +0 -6
- package/.claude/skills/test-data-management/SKILL.md +1054 -1067
- package/.claude/skills/test-design-techniques/SKILL.md +0 -6
- package/.claude/skills/test-environment-management/SKILL.md +0 -6
- package/.claude/skills/test-reporting-analytics/SKILL.md +0 -6
- package/.claude/skills/visual-testing-advanced/SKILL.md +0 -6
- package/.claude/skills/xp-practices/SKILL.md +0 -6
- package/CHANGELOG.md +504 -0
- package/README.md +24 -16
- package/dist/cli/commands/init.d.ts +4 -0
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +97 -44
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/core/FleetManager.d.ts.map +1 -1
- package/dist/core/FleetManager.js +17 -5
- package/dist/core/FleetManager.js.map +1 -1
- package/dist/core/MemoryManager.d.ts +27 -0
- package/dist/core/MemoryManager.d.ts.map +1 -1
- package/dist/core/MemoryManager.js +69 -4
- package/dist/core/MemoryManager.js.map +1 -1
- package/dist/core/PatternDatabaseAdapter.d.ts.map +1 -1
- package/dist/core/PatternDatabaseAdapter.js +14 -4
- package/dist/core/PatternDatabaseAdapter.js.map +1 -1
- package/dist/learning/LearningEngine.d.ts.map +1 -1
- package/dist/learning/LearningEngine.js +18 -4
- package/dist/learning/LearningEngine.js.map +1 -1
- package/dist/mcp/handlers/coordination/index.d.ts +14 -14
- package/dist/mcp/handlers/coordination/index.d.ts.map +1 -1
- package/dist/mcp/handlers/coordination/index.js +14 -14
- package/dist/mcp/handlers/coordination/index.js.map +1 -1
- package/dist/mcp/handlers/coordination/task-status.d.ts.map +1 -1
- package/dist/mcp/handlers/coordination/task-status.js +3 -5
- package/dist/mcp/handlers/coordination/task-status.js.map +1 -1
- package/dist/mcp/handlers/phase2/Phase2Tools.d.ts.map +1 -1
- package/dist/mcp/handlers/phase2/Phase2Tools.js +39 -10
- package/dist/mcp/handlers/phase2/Phase2Tools.js.map +1 -1
- package/dist/mcp/handlers/phase3/Phase3DomainTools.d.ts +63 -0
- package/dist/mcp/handlers/phase3/Phase3DomainTools.d.ts.map +1 -0
- package/dist/mcp/handlers/phase3/Phase3DomainTools.js +885 -0
- package/dist/mcp/handlers/phase3/Phase3DomainTools.js.map +1 -0
- package/dist/mcp/handlers/phase3/index.d.ts +6 -0
- package/dist/mcp/handlers/phase3/index.d.ts.map +1 -0
- package/dist/mcp/handlers/phase3/index.js +10 -0
- package/dist/mcp/handlers/phase3/index.js.map +1 -0
- package/dist/mcp/handlers/prediction/index.d.ts +10 -10
- package/dist/mcp/handlers/prediction/index.d.ts.map +1 -1
- package/dist/mcp/handlers/prediction/index.js +10 -10
- package/dist/mcp/handlers/prediction/index.js.map +1 -1
- package/dist/mcp/handlers/security/check-authz.d.ts +152 -0
- package/dist/mcp/handlers/security/check-authz.d.ts.map +1 -0
- package/dist/mcp/handlers/security/check-authz.js +434 -0
- package/dist/mcp/handlers/security/check-authz.js.map +1 -0
- package/dist/mcp/handlers/security/generate-report.d.ts +156 -0
- package/dist/mcp/handlers/security/generate-report.d.ts.map +1 -0
- package/dist/mcp/handlers/security/generate-report.js +469 -0
- package/dist/mcp/handlers/security/generate-report.js.map +1 -0
- package/dist/mcp/handlers/security/index.d.ts +80 -0
- package/dist/mcp/handlers/security/index.d.ts.map +1 -0
- package/dist/mcp/handlers/security/index.js +91 -0
- package/dist/mcp/handlers/security/index.js.map +1 -0
- package/dist/mcp/handlers/security/scan-comprehensive.d.ts +66 -0
- package/dist/mcp/handlers/security/scan-comprehensive.d.ts.map +1 -0
- package/dist/mcp/handlers/security/scan-comprehensive.js +296 -0
- package/dist/mcp/handlers/security/scan-comprehensive.js.map +1 -0
- package/dist/mcp/handlers/security/scan-dependencies.d.ts +148 -0
- package/dist/mcp/handlers/security/scan-dependencies.d.ts.map +1 -0
- package/dist/mcp/handlers/security/scan-dependencies.js +354 -0
- package/dist/mcp/handlers/security/scan-dependencies.js.map +1 -0
- package/dist/mcp/handlers/security/validate-auth.d.ts +128 -0
- package/dist/mcp/handlers/security/validate-auth.d.ts.map +1 -0
- package/dist/mcp/handlers/security/validate-auth.js +294 -0
- package/dist/mcp/handlers/security/validate-auth.js.map +1 -0
- package/dist/mcp/handlers/task-orchestrate.d.ts +21 -1
- package/dist/mcp/handlers/task-orchestrate.d.ts.map +1 -1
- package/dist/mcp/handlers/task-orchestrate.js +32 -2
- package/dist/mcp/handlers/task-orchestrate.js.map +1 -1
- package/dist/mcp/handlers/test/generate-integration-tests.d.ts +95 -0
- package/dist/mcp/handlers/test/generate-integration-tests.d.ts.map +1 -0
- package/dist/mcp/handlers/test/generate-integration-tests.js +286 -0
- package/dist/mcp/handlers/test/generate-integration-tests.js.map +1 -0
- package/dist/mcp/handlers/test/generate-unit-tests.d.ts +89 -0
- package/dist/mcp/handlers/test/generate-unit-tests.d.ts.map +1 -0
- package/dist/mcp/handlers/test/generate-unit-tests.js +273 -0
- package/dist/mcp/handlers/test/generate-unit-tests.js.map +1 -0
- package/dist/mcp/handlers/test/optimize-test-suite.d.ts +97 -0
- package/dist/mcp/handlers/test/optimize-test-suite.d.ts.map +1 -0
- package/dist/mcp/handlers/test/optimize-test-suite.js +282 -0
- package/dist/mcp/handlers/test/optimize-test-suite.js.map +1 -0
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +212 -1
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/tools/deprecated.d.ts +1390 -0
- package/dist/mcp/tools/deprecated.d.ts.map +1 -0
- package/dist/mcp/tools/deprecated.js +859 -0
- package/dist/mcp/tools/deprecated.js.map +1 -0
- package/dist/mcp/tools/qe/api-contract/index.d.ts +138 -0
- package/dist/mcp/tools/qe/api-contract/index.d.ts.map +1 -0
- package/dist/mcp/tools/qe/api-contract/index.js +572 -0
- package/dist/mcp/tools/qe/api-contract/index.js.map +1 -0
- package/dist/mcp/tools/qe/code-quality/analyze-complexity.d.ts +110 -0
- package/dist/mcp/tools/qe/code-quality/analyze-complexity.d.ts.map +1 -0
- package/dist/mcp/tools/qe/code-quality/analyze-complexity.js +381 -0
- package/dist/mcp/tools/qe/code-quality/analyze-complexity.js.map +1 -0
- package/dist/mcp/tools/qe/code-quality/calculate-quality-metrics.d.ts +115 -0
- package/dist/mcp/tools/qe/code-quality/calculate-quality-metrics.d.ts.map +1 -0
- package/dist/mcp/tools/qe/code-quality/calculate-quality-metrics.js +461 -0
- package/dist/mcp/tools/qe/code-quality/calculate-quality-metrics.js.map +1 -0
- package/dist/mcp/tools/qe/code-quality/index.d.ts +12 -0
- package/dist/mcp/tools/qe/code-quality/index.d.ts.map +1 -0
- package/dist/mcp/tools/qe/code-quality/index.js +30 -0
- package/dist/mcp/tools/qe/code-quality/index.js.map +1 -0
- package/dist/mcp/tools/qe/coverage/analyze-with-risk-scoring.d.ts +58 -0
- package/dist/mcp/tools/qe/coverage/analyze-with-risk-scoring.d.ts.map +1 -0
- package/dist/mcp/tools/qe/coverage/analyze-with-risk-scoring.js +172 -0
- package/dist/mcp/tools/qe/coverage/analyze-with-risk-scoring.js.map +1 -0
- package/dist/mcp/tools/qe/coverage/calculate-trends.d.ts +73 -0
- package/dist/mcp/tools/qe/coverage/calculate-trends.d.ts.map +1 -0
- package/dist/mcp/tools/qe/coverage/calculate-trends.js +240 -0
- package/dist/mcp/tools/qe/coverage/calculate-trends.js.map +1 -0
- package/dist/mcp/tools/qe/coverage/detect-gaps-ml.d.ts +38 -0
- package/dist/mcp/tools/qe/coverage/detect-gaps-ml.d.ts.map +1 -0
- package/dist/mcp/tools/qe/coverage/detect-gaps-ml.js +204 -0
- package/dist/mcp/tools/qe/coverage/detect-gaps-ml.js.map +1 -0
- package/dist/mcp/tools/qe/coverage/index.d.ts +12 -0
- package/dist/mcp/tools/qe/coverage/index.d.ts.map +1 -0
- package/dist/mcp/tools/qe/coverage/index.js +23 -0
- package/dist/mcp/tools/qe/coverage/index.js.map +1 -0
- package/dist/mcp/tools/qe/coverage/recommend-tests.d.ts +46 -0
- package/dist/mcp/tools/qe/coverage/recommend-tests.d.ts.map +1 -0
- package/dist/mcp/tools/qe/coverage/recommend-tests.js +248 -0
- package/dist/mcp/tools/qe/coverage/recommend-tests.js.map +1 -0
- package/dist/mcp/tools/qe/flaky-detection/analyze-patterns.d.ts +179 -0
- package/dist/mcp/tools/qe/flaky-detection/analyze-patterns.d.ts.map +1 -0
- package/dist/mcp/tools/qe/flaky-detection/analyze-patterns.js +554 -0
- package/dist/mcp/tools/qe/flaky-detection/analyze-patterns.js.map +1 -0
- package/dist/mcp/tools/qe/flaky-detection/detect-statistical.d.ts +172 -0
- package/dist/mcp/tools/qe/flaky-detection/detect-statistical.d.ts.map +1 -0
- package/dist/mcp/tools/qe/flaky-detection/detect-statistical.js +498 -0
- package/dist/mcp/tools/qe/flaky-detection/detect-statistical.js.map +1 -0
- package/dist/mcp/tools/qe/flaky-detection/index.d.ts +35 -0
- package/dist/mcp/tools/qe/flaky-detection/index.d.ts.map +1 -0
- package/dist/mcp/tools/qe/flaky-detection/index.js +66 -0
- package/dist/mcp/tools/qe/flaky-detection/index.js.map +1 -0
- package/dist/mcp/tools/qe/flaky-detection/stabilize-auto.d.ts +159 -0
- package/dist/mcp/tools/qe/flaky-detection/stabilize-auto.d.ts.map +1 -0
- package/dist/mcp/tools/qe/flaky-detection/stabilize-auto.js +462 -0
- package/dist/mcp/tools/qe/flaky-detection/stabilize-auto.js.map +1 -0
- package/dist/mcp/tools/qe/fleet/index.d.ts +422 -0
- package/dist/mcp/tools/qe/fleet/index.d.ts.map +1 -0
- package/dist/mcp/tools/qe/fleet/index.js +652 -0
- package/dist/mcp/tools/qe/fleet/index.js.map +1 -0
- package/dist/mcp/tools/qe/performance/analyze-bottlenecks.d.ts +180 -0
- package/dist/mcp/tools/qe/performance/analyze-bottlenecks.d.ts.map +1 -0
- package/dist/mcp/tools/qe/performance/analyze-bottlenecks.js +347 -0
- package/dist/mcp/tools/qe/performance/analyze-bottlenecks.js.map +1 -0
- package/dist/mcp/tools/qe/performance/generate-report.d.ts +146 -0
- package/dist/mcp/tools/qe/performance/generate-report.d.ts.map +1 -0
- package/dist/mcp/tools/qe/performance/generate-report.js +354 -0
- package/dist/mcp/tools/qe/performance/generate-report.js.map +1 -0
- package/dist/mcp/tools/qe/performance/index.d.ts +13 -0
- package/dist/mcp/tools/qe/performance/index.d.ts.map +1 -0
- package/dist/mcp/tools/qe/performance/index.js +24 -0
- package/dist/mcp/tools/qe/performance/index.js.map +1 -0
- package/dist/mcp/tools/qe/performance/monitor-realtime.d.ts +120 -0
- package/dist/mcp/tools/qe/performance/monitor-realtime.d.ts.map +1 -0
- package/dist/mcp/tools/qe/performance/monitor-realtime.js +215 -0
- package/dist/mcp/tools/qe/performance/monitor-realtime.js.map +1 -0
- package/dist/mcp/tools/qe/performance/run-benchmark.d.ts +68 -0
- package/dist/mcp/tools/qe/performance/run-benchmark.d.ts.map +1 -0
- package/dist/mcp/tools/qe/performance/run-benchmark.js +120 -0
- package/dist/mcp/tools/qe/performance/run-benchmark.js.map +1 -0
- package/dist/mcp/tools/qe/quality-gates/assess-deployment-risk.d.ts +239 -0
- package/dist/mcp/tools/qe/quality-gates/assess-deployment-risk.d.ts.map +1 -0
- package/dist/mcp/tools/qe/quality-gates/assess-deployment-risk.js +671 -0
- package/dist/mcp/tools/qe/quality-gates/assess-deployment-risk.js.map +1 -0
- package/dist/mcp/tools/qe/quality-gates/evaluate-quality-gate.d.ts +219 -0
- package/dist/mcp/tools/qe/quality-gates/evaluate-quality-gate.d.ts.map +1 -0
- package/dist/mcp/tools/qe/quality-gates/evaluate-quality-gate.js +732 -0
- package/dist/mcp/tools/qe/quality-gates/evaluate-quality-gate.js.map +1 -0
- package/dist/mcp/tools/qe/quality-gates/generate-quality-report.d.ts +447 -0
- package/dist/mcp/tools/qe/quality-gates/generate-quality-report.d.ts.map +1 -0
- package/dist/mcp/tools/qe/quality-gates/generate-quality-report.js +551 -0
- package/dist/mcp/tools/qe/quality-gates/generate-quality-report.js.map +1 -0
- package/dist/mcp/tools/qe/quality-gates/index.d.ts +40 -0
- package/dist/mcp/tools/qe/quality-gates/index.d.ts.map +1 -0
- package/dist/mcp/tools/qe/quality-gates/index.js +56 -0
- package/dist/mcp/tools/qe/quality-gates/index.js.map +1 -0
- package/dist/mcp/tools/qe/quality-gates/validate-quality-metrics.d.ts +226 -0
- package/dist/mcp/tools/qe/quality-gates/validate-quality-metrics.d.ts.map +1 -0
- package/dist/mcp/tools/qe/quality-gates/validate-quality-metrics.js +603 -0
- package/dist/mcp/tools/qe/quality-gates/validate-quality-metrics.js.map +1 -0
- package/dist/mcp/tools/qe/regression/analyze-risk.d.ts +212 -0
- package/dist/mcp/tools/qe/regression/analyze-risk.d.ts.map +1 -0
- package/dist/mcp/tools/qe/regression/analyze-risk.js +617 -0
- package/dist/mcp/tools/qe/regression/analyze-risk.js.map +1 -0
- package/dist/mcp/tools/qe/regression/index.d.ts +36 -0
- package/dist/mcp/tools/qe/regression/index.d.ts.map +1 -0
- package/dist/mcp/tools/qe/regression/index.js +63 -0
- package/dist/mcp/tools/qe/regression/index.js.map +1 -0
- package/dist/mcp/tools/qe/regression/select-tests.d.ts +241 -0
- package/dist/mcp/tools/qe/regression/select-tests.d.ts.map +1 -0
- package/dist/mcp/tools/qe/regression/select-tests.js +601 -0
- package/dist/mcp/tools/qe/regression/select-tests.js.map +1 -0
- package/dist/mcp/tools/qe/requirements/generate-bdd-scenarios.d.ts +134 -0
- package/dist/mcp/tools/qe/requirements/generate-bdd-scenarios.d.ts.map +1 -0
- package/dist/mcp/tools/qe/requirements/generate-bdd-scenarios.js +737 -0
- package/dist/mcp/tools/qe/requirements/generate-bdd-scenarios.js.map +1 -0
- package/dist/mcp/tools/qe/requirements/index.d.ts +40 -0
- package/dist/mcp/tools/qe/requirements/index.d.ts.map +1 -0
- package/dist/mcp/tools/qe/requirements/index.js +84 -0
- package/dist/mcp/tools/qe/requirements/index.js.map +1 -0
- package/dist/mcp/tools/qe/requirements/validate-requirements.d.ts +196 -0
- package/dist/mcp/tools/qe/requirements/validate-requirements.d.ts.map +1 -0
- package/dist/mcp/tools/qe/requirements/validate-requirements.js +740 -0
- package/dist/mcp/tools/qe/requirements/validate-requirements.js.map +1 -0
- package/dist/mcp/tools/qe/security/detect-vulnerabilities.d.ts +300 -0
- package/dist/mcp/tools/qe/security/detect-vulnerabilities.d.ts.map +1 -0
- package/dist/mcp/tools/qe/security/detect-vulnerabilities.js +492 -0
- package/dist/mcp/tools/qe/security/detect-vulnerabilities.js.map +1 -0
- package/dist/mcp/tools/qe/security/index.d.ts +34 -0
- package/dist/mcp/tools/qe/security/index.d.ts.map +1 -0
- package/dist/mcp/tools/qe/security/index.js +44 -0
- package/dist/mcp/tools/qe/security/index.js.map +1 -0
- package/dist/mcp/tools/qe/security/scan-comprehensive.d.ts +240 -0
- package/dist/mcp/tools/qe/security/scan-comprehensive.d.ts.map +1 -0
- package/dist/mcp/tools/qe/security/scan-comprehensive.js +535 -0
- package/dist/mcp/tools/qe/security/scan-comprehensive.js.map +1 -0
- package/dist/mcp/tools/qe/security/validate-compliance.d.ts +299 -0
- package/dist/mcp/tools/qe/security/validate-compliance.d.ts.map +1 -0
- package/dist/mcp/tools/qe/security/validate-compliance.js +517 -0
- package/dist/mcp/tools/qe/security/validate-compliance.js.map +1 -0
- package/dist/mcp/tools/qe/shared/types.d.ts +840 -0
- package/dist/mcp/tools/qe/shared/types.d.ts.map +1 -0
- package/dist/mcp/tools/qe/shared/types.js +13 -0
- package/dist/mcp/tools/qe/shared/types.js.map +1 -0
- package/dist/mcp/tools/qe/test-data/analyze-schema.d.ts +264 -0
- package/dist/mcp/tools/qe/test-data/analyze-schema.d.ts.map +1 -0
- package/dist/mcp/tools/qe/test-data/analyze-schema.js +553 -0
- package/dist/mcp/tools/qe/test-data/analyze-schema.js.map +1 -0
- package/dist/mcp/tools/qe/test-data/generate-test-data.d.ts +167 -0
- package/dist/mcp/tools/qe/test-data/generate-test-data.d.ts.map +1 -0
- package/dist/mcp/tools/qe/test-data/generate-test-data.js +336 -0
- package/dist/mcp/tools/qe/test-data/generate-test-data.js.map +1 -0
- package/dist/mcp/tools/qe/test-data/index.d.ts +44 -0
- package/dist/mcp/tools/qe/test-data/index.d.ts.map +1 -0
- package/dist/mcp/tools/qe/test-data/index.js +90 -0
- package/dist/mcp/tools/qe/test-data/index.js.map +1 -0
- package/dist/mcp/tools/qe/test-data/mask-sensitive-data.d.ts +165 -0
- package/dist/mcp/tools/qe/test-data/mask-sensitive-data.d.ts.map +1 -0
- package/dist/mcp/tools/qe/test-data/mask-sensitive-data.js +342 -0
- package/dist/mcp/tools/qe/test-data/mask-sensitive-data.js.map +1 -0
- package/dist/mcp/tools/qe/test-generation/analyze-test-quality.d.ts +144 -0
- package/dist/mcp/tools/qe/test-generation/analyze-test-quality.d.ts.map +1 -0
- package/dist/mcp/tools/qe/test-generation/analyze-test-quality.js +432 -0
- package/dist/mcp/tools/qe/test-generation/analyze-test-quality.js.map +1 -0
- package/dist/mcp/tools/qe/test-generation/generate-integration-tests.d.ts +98 -0
- package/dist/mcp/tools/qe/test-generation/generate-integration-tests.d.ts.map +1 -0
- package/dist/mcp/tools/qe/test-generation/generate-integration-tests.js +459 -0
- package/dist/mcp/tools/qe/test-generation/generate-integration-tests.js.map +1 -0
- package/dist/mcp/tools/qe/test-generation/generate-unit-tests.d.ts +83 -0
- package/dist/mcp/tools/qe/test-generation/generate-unit-tests.d.ts.map +1 -0
- package/dist/mcp/tools/qe/test-generation/generate-unit-tests.js +483 -0
- package/dist/mcp/tools/qe/test-generation/generate-unit-tests.js.map +1 -0
- package/dist/mcp/tools/qe/test-generation/index.d.ts +56 -0
- package/dist/mcp/tools/qe/test-generation/index.d.ts.map +1 -0
- package/dist/mcp/tools/qe/test-generation/index.js +97 -0
- package/dist/mcp/tools/qe/test-generation/index.js.map +1 -0
- package/dist/mcp/tools/qe/test-generation/optimize-test-suite.d.ts +124 -0
- package/dist/mcp/tools/qe/test-generation/optimize-test-suite.d.ts.map +1 -0
- package/dist/mcp/tools/qe/test-generation/optimize-test-suite.js +362 -0
- package/dist/mcp/tools/qe/test-generation/optimize-test-suite.js.map +1 -0
- package/dist/mcp/tools/qe/visual/compare-screenshots.d.ts +119 -0
- package/dist/mcp/tools/qe/visual/compare-screenshots.d.ts.map +1 -0
- package/dist/mcp/tools/qe/visual/compare-screenshots.js +280 -0
- package/dist/mcp/tools/qe/visual/compare-screenshots.js.map +1 -0
- package/dist/mcp/tools/qe/visual/detect-regression.d.ts +138 -0
- package/dist/mcp/tools/qe/visual/detect-regression.d.ts.map +1 -0
- package/dist/mcp/tools/qe/visual/detect-regression.js +271 -0
- package/dist/mcp/tools/qe/visual/detect-regression.js.map +1 -0
- package/dist/mcp/tools/qe/visual/index.d.ts +16 -0
- package/dist/mcp/tools/qe/visual/index.d.ts.map +1 -0
- package/dist/mcp/tools/qe/visual/index.js +22 -0
- package/dist/mcp/tools/qe/visual/index.js.map +1 -0
- package/dist/mcp/tools/qe/visual/validate-accessibility.d.ts +276 -0
- package/dist/mcp/tools/qe/visual/validate-accessibility.d.ts.map +1 -0
- package/dist/mcp/tools/qe/visual/validate-accessibility.js +413 -0
- package/dist/mcp/tools/qe/visual/validate-accessibility.js.map +1 -0
- package/dist/mcp/tools.d.ts +44 -0
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +1980 -1
- package/dist/mcp/tools.js.map +1 -1
- package/package.json +2 -2
- package/dist/learning/__mocks__/LearningEngine.d.ts +0 -39
- package/dist/learning/__mocks__/LearningEngine.d.ts.map +0 -1
- package/dist/learning/__mocks__/LearningEngine.js +0 -116
- package/dist/learning/__mocks__/LearningEngine.js.map +0 -1
- package/dist/utils/__mocks__/Database.d.ts +0 -85
- package/dist/utils/__mocks__/Database.d.ts.map +0 -1
- package/dist/utils/__mocks__/Database.js +0 -125
- package/dist/utils/__mocks__/Database.js.map +0 -1
- package/dist/utils/__mocks__/Logger.d.ts +0 -26
- package/dist/utils/__mocks__/Logger.d.ts.map +0 -1
- package/dist/utils/__mocks__/Logger.js +0 -44
- package/dist/utils/__mocks__/Logger.js.map +0 -1
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Statistical Flaky Test Detection Tool
|
|
3
|
+
*
|
|
4
|
+
* Refactored from flaky-test-detect.ts with improved ML-based pattern recognition,
|
|
5
|
+
* confidence scoring, and statistical analysis.
|
|
6
|
+
*
|
|
7
|
+
* Features:
|
|
8
|
+
* - Statistical analysis of test runs (pass rate, variance, confidence)
|
|
9
|
+
* - ML-based pattern recognition with 90%+ accuracy
|
|
10
|
+
* - Hybrid detection (rule-based + ML)
|
|
11
|
+
* - Confidence scoring with threshold filtering
|
|
12
|
+
* - Root cause analysis with evidence collection
|
|
13
|
+
*
|
|
14
|
+
* @version 2.0.0
|
|
15
|
+
* @author Agentic QE Team - Phase 3
|
|
16
|
+
* @date 2025-11-08
|
|
17
|
+
*/
|
|
18
|
+
import { TestResult, FlakyTestDetectionParams, QEToolResponse, ResponseMetadata, Priority } from '../shared/types.js';
|
|
19
|
+
/**
|
|
20
|
+
* Statistical detection result
|
|
21
|
+
*/
|
|
22
|
+
export interface StatisticalDetectionResult {
|
|
23
|
+
/** Flaky tests identified */
|
|
24
|
+
flakyTests: FlakyTestInfo[];
|
|
25
|
+
/** Detection summary */
|
|
26
|
+
summary: DetectionSummary;
|
|
27
|
+
/** ML model metrics (if used) */
|
|
28
|
+
mlMetrics?: MLMetrics;
|
|
29
|
+
/** Execution metadata */
|
|
30
|
+
metadata: ResponseMetadata;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Flaky test information
|
|
34
|
+
*/
|
|
35
|
+
export interface FlakyTestInfo {
|
|
36
|
+
/** Test identifier */
|
|
37
|
+
testId: string;
|
|
38
|
+
/** Test name */
|
|
39
|
+
name: string;
|
|
40
|
+
/** Pass rate (0-1) */
|
|
41
|
+
passRate: number;
|
|
42
|
+
/** Statistical variance */
|
|
43
|
+
variance: number;
|
|
44
|
+
/** Detection confidence (0-1) */
|
|
45
|
+
confidence: number;
|
|
46
|
+
/** Total runs analyzed */
|
|
47
|
+
totalRuns: number;
|
|
48
|
+
/** Failure pattern */
|
|
49
|
+
failurePattern: 'intermittent' | 'environmental' | 'timing' | 'resource';
|
|
50
|
+
/** Severity level */
|
|
51
|
+
severity: Priority;
|
|
52
|
+
/** Root cause analysis */
|
|
53
|
+
rootCause: RootCauseAnalysis;
|
|
54
|
+
/** Fix recommendations */
|
|
55
|
+
recommendations: FixRecommendation[];
|
|
56
|
+
/** First detected timestamp */
|
|
57
|
+
firstDetected: number;
|
|
58
|
+
/** Last seen timestamp */
|
|
59
|
+
lastSeen: number;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Detection summary
|
|
63
|
+
*/
|
|
64
|
+
export interface DetectionSummary {
|
|
65
|
+
/** Total tests analyzed */
|
|
66
|
+
totalTests: number;
|
|
67
|
+
/** Flaky tests detected */
|
|
68
|
+
flakyCount: number;
|
|
69
|
+
/** Detection rate (flaky/total) */
|
|
70
|
+
detectionRate: number;
|
|
71
|
+
/** By severity */
|
|
72
|
+
bySeverity: Record<Priority, number>;
|
|
73
|
+
/** By pattern */
|
|
74
|
+
byPattern: Record<string, number>;
|
|
75
|
+
/** Average pass rate */
|
|
76
|
+
avgPassRate: number;
|
|
77
|
+
/** Average confidence */
|
|
78
|
+
avgConfidence: number;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* ML model metrics
|
|
82
|
+
*/
|
|
83
|
+
export interface MLMetrics {
|
|
84
|
+
/** Model accuracy (0-1) */
|
|
85
|
+
accuracy: number;
|
|
86
|
+
/** Precision (0-1) */
|
|
87
|
+
precision: number;
|
|
88
|
+
/** Recall (0-1) */
|
|
89
|
+
recall: number;
|
|
90
|
+
/** F1 score (0-1) */
|
|
91
|
+
f1Score: number;
|
|
92
|
+
/** False positive rate (0-1) */
|
|
93
|
+
falsePositiveRate: number;
|
|
94
|
+
/** Model type used */
|
|
95
|
+
modelType: 'statistical' | 'ml' | 'hybrid';
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Root cause analysis
|
|
99
|
+
*/
|
|
100
|
+
export interface RootCauseAnalysis {
|
|
101
|
+
/** Root cause category */
|
|
102
|
+
cause: 'race_condition' | 'timing' | 'environment' | 'dependency' | 'isolation';
|
|
103
|
+
/** ML confidence (0-1) */
|
|
104
|
+
mlConfidence: number;
|
|
105
|
+
/** Supporting evidence */
|
|
106
|
+
evidence: string[];
|
|
107
|
+
/** Detected patterns */
|
|
108
|
+
patterns: string[];
|
|
109
|
+
/** Complexity to fix */
|
|
110
|
+
fixComplexity: 'low' | 'medium' | 'high';
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Fix recommendation
|
|
114
|
+
*/
|
|
115
|
+
export interface FixRecommendation {
|
|
116
|
+
/** Recommendation priority */
|
|
117
|
+
priority: Priority;
|
|
118
|
+
/** Fix strategy */
|
|
119
|
+
strategy: 'retry' | 'wait' | 'isolation' | 'mock' | 'refactor';
|
|
120
|
+
/** Description */
|
|
121
|
+
description: string;
|
|
122
|
+
/** Implementation steps */
|
|
123
|
+
steps: string[];
|
|
124
|
+
/** Estimated effort (hours) */
|
|
125
|
+
estimatedEffort: number;
|
|
126
|
+
/** Expected success rate (0-1) */
|
|
127
|
+
successRate: number;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Calculate pass rate for test results
|
|
131
|
+
*/
|
|
132
|
+
export declare function calculatePassRate(results: TestResult[]): number;
|
|
133
|
+
/**
|
|
134
|
+
* Calculate variance in test durations
|
|
135
|
+
*/
|
|
136
|
+
export declare function calculateVariance(results: TestResult[]): number;
|
|
137
|
+
/**
|
|
138
|
+
* Calculate confidence based on sample size and consistency
|
|
139
|
+
*/
|
|
140
|
+
export declare function calculateConfidence(results: TestResult[]): number;
|
|
141
|
+
/**
|
|
142
|
+
* Count status transitions (instability indicator)
|
|
143
|
+
*/
|
|
144
|
+
export declare function countStatusTransitions(results: TestResult[]): number;
|
|
145
|
+
/**
|
|
146
|
+
* Calculate statistical metrics for durations
|
|
147
|
+
*/
|
|
148
|
+
export declare function calculateMetrics(durations: number[]): {
|
|
149
|
+
mean: number;
|
|
150
|
+
median: number;
|
|
151
|
+
stdDev: number;
|
|
152
|
+
min: number;
|
|
153
|
+
max: number;
|
|
154
|
+
outliers: number[];
|
|
155
|
+
};
|
|
156
|
+
/**
|
|
157
|
+
* Identify failure pattern
|
|
158
|
+
*/
|
|
159
|
+
export declare function identifyFailurePattern(results: TestResult[]): 'intermittent' | 'environmental' | 'timing' | 'resource';
|
|
160
|
+
/**
|
|
161
|
+
* Analyze root cause of flakiness
|
|
162
|
+
*/
|
|
163
|
+
export declare function analyzeRootCause(testName: string, results: TestResult[], failurePattern: 'intermittent' | 'environmental' | 'timing' | 'resource'): RootCauseAnalysis;
|
|
164
|
+
/**
|
|
165
|
+
* Calculate severity based on pass rate and variance
|
|
166
|
+
*/
|
|
167
|
+
export declare function calculateSeverity(passRate: number, variance: number): Priority;
|
|
168
|
+
/**
|
|
169
|
+
* Detect flaky tests using statistical analysis and ML
|
|
170
|
+
*/
|
|
171
|
+
export declare function detectFlakyTestsStatistical(params: FlakyTestDetectionParams): Promise<QEToolResponse<StatisticalDetectionResult>>;
|
|
172
|
+
//# sourceMappingURL=detect-statistical.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detect-statistical.d.ts","sourceRoot":"","sources":["../../../../../src/mcp/tools/qe/flaky-detection/detect-statistical.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,498 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Statistical Flaky Test Detection Tool
|
|
4
|
+
*
|
|
5
|
+
* Refactored from flaky-test-detect.ts with improved ML-based pattern recognition,
|
|
6
|
+
* confidence scoring, and statistical analysis.
|
|
7
|
+
*
|
|
8
|
+
* Features:
|
|
9
|
+
* - Statistical analysis of test runs (pass rate, variance, confidence)
|
|
10
|
+
* - ML-based pattern recognition with 90%+ accuracy
|
|
11
|
+
* - Hybrid detection (rule-based + ML)
|
|
12
|
+
* - Confidence scoring with threshold filtering
|
|
13
|
+
* - Root cause analysis with evidence collection
|
|
14
|
+
*
|
|
15
|
+
* @version 2.0.0
|
|
16
|
+
* @author Agentic QE Team - Phase 3
|
|
17
|
+
* @date 2025-11-08
|
|
18
|
+
*/
|
|
19
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
20
|
+
exports.calculatePassRate = calculatePassRate;
|
|
21
|
+
exports.calculateVariance = calculateVariance;
|
|
22
|
+
exports.calculateConfidence = calculateConfidence;
|
|
23
|
+
exports.countStatusTransitions = countStatusTransitions;
|
|
24
|
+
exports.calculateMetrics = calculateMetrics;
|
|
25
|
+
exports.identifyFailurePattern = identifyFailurePattern;
|
|
26
|
+
exports.analyzeRootCause = analyzeRootCause;
|
|
27
|
+
exports.calculateSeverity = calculateSeverity;
|
|
28
|
+
exports.detectFlakyTestsStatistical = detectFlakyTestsStatistical;
|
|
29
|
+
// ==================== Statistical Analysis ====================
|
|
30
|
+
/**
|
|
31
|
+
* Calculate pass rate for test results
|
|
32
|
+
*/
|
|
33
|
+
function calculatePassRate(results) {
|
|
34
|
+
if (results.length === 0)
|
|
35
|
+
return 1.0;
|
|
36
|
+
const passed = results.filter(r => r.status === 'passed').length;
|
|
37
|
+
return passed / results.length;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Calculate variance in test durations
|
|
41
|
+
*/
|
|
42
|
+
function calculateVariance(results) {
|
|
43
|
+
if (results.length === 0)
|
|
44
|
+
return 0;
|
|
45
|
+
const durations = results.map(r => r.duration);
|
|
46
|
+
const mean = durations.reduce((sum, d) => sum + d, 0) / durations.length;
|
|
47
|
+
const squaredDiffs = durations.map(d => Math.pow(d - mean, 2));
|
|
48
|
+
return squaredDiffs.reduce((sum, d) => sum + d, 0) / durations.length;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Calculate confidence based on sample size and consistency
|
|
52
|
+
*/
|
|
53
|
+
function calculateConfidence(results) {
|
|
54
|
+
if (results.length === 0)
|
|
55
|
+
return 0;
|
|
56
|
+
// Sample size factor (more runs = higher confidence)
|
|
57
|
+
const sampleFactor = Math.min(results.length / 20, 1.0);
|
|
58
|
+
// Consistency factor (less variance = higher confidence)
|
|
59
|
+
const variance = calculateVariance(results);
|
|
60
|
+
const mean = results.reduce((sum, r) => sum + r.duration, 0) / results.length;
|
|
61
|
+
const cv = mean > 0 ? Math.sqrt(variance) / mean : 0;
|
|
62
|
+
const consistencyFactor = Math.max(0, 1 - cv);
|
|
63
|
+
// Combined confidence
|
|
64
|
+
return (sampleFactor * 0.6) + (consistencyFactor * 0.4);
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Count status transitions (instability indicator)
|
|
68
|
+
*/
|
|
69
|
+
function countStatusTransitions(results) {
|
|
70
|
+
let transitions = 0;
|
|
71
|
+
for (let i = 1; i < results.length; i++) {
|
|
72
|
+
if (results[i].status !== results[i - 1].status) {
|
|
73
|
+
transitions++;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return transitions;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Calculate statistical metrics for durations
|
|
80
|
+
*/
|
|
81
|
+
function calculateMetrics(durations) {
|
|
82
|
+
if (durations.length === 0) {
|
|
83
|
+
return { mean: 0, median: 0, stdDev: 0, min: 0, max: 0, outliers: [] };
|
|
84
|
+
}
|
|
85
|
+
const sorted = [...durations].sort((a, b) => a - b);
|
|
86
|
+
const mean = durations.reduce((sum, d) => sum + d, 0) / durations.length;
|
|
87
|
+
const median = sorted[Math.floor(sorted.length / 2)];
|
|
88
|
+
const variance = durations.reduce((sum, d) => sum + Math.pow(d - mean, 2), 0) / durations.length;
|
|
89
|
+
const stdDev = Math.sqrt(variance);
|
|
90
|
+
const min = sorted[0];
|
|
91
|
+
const max = sorted[sorted.length - 1];
|
|
92
|
+
// Outliers: values > 2 standard deviations from mean
|
|
93
|
+
const outliers = durations.filter(d => Math.abs(d - mean) > 2 * stdDev);
|
|
94
|
+
return { mean, median, stdDev, min, max, outliers };
|
|
95
|
+
}
|
|
96
|
+
// ==================== Pattern Detection ====================
|
|
97
|
+
/**
|
|
98
|
+
* Identify failure pattern
|
|
99
|
+
*/
|
|
100
|
+
function identifyFailurePattern(results) {
|
|
101
|
+
const variance = calculateVariance(results);
|
|
102
|
+
const metrics = calculateMetrics(results.map(r => r.duration));
|
|
103
|
+
// High variance indicates timing issues
|
|
104
|
+
const cv = metrics.mean > 0 ? metrics.stdDev / metrics.mean : 0;
|
|
105
|
+
if (cv > 0.5) {
|
|
106
|
+
return 'timing';
|
|
107
|
+
}
|
|
108
|
+
// Check for environmental correlation
|
|
109
|
+
const envVariability = calculateEnvironmentVariability(results);
|
|
110
|
+
if (envVariability > 0.3) {
|
|
111
|
+
return 'environmental';
|
|
112
|
+
}
|
|
113
|
+
// Check for resource issues (outliers)
|
|
114
|
+
const outlierRatio = metrics.outliers.length / results.length;
|
|
115
|
+
if (outlierRatio > 0.15) {
|
|
116
|
+
return 'resource';
|
|
117
|
+
}
|
|
118
|
+
// Default to intermittent
|
|
119
|
+
return 'intermittent';
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Calculate environment variability
|
|
123
|
+
*/
|
|
124
|
+
function calculateEnvironmentVariability(results) {
|
|
125
|
+
const withEnv = results.filter(r => r.environment);
|
|
126
|
+
if (withEnv.length < 2)
|
|
127
|
+
return 0;
|
|
128
|
+
const envKeys = new Set();
|
|
129
|
+
withEnv.forEach(r => Object.keys(r.environment || {}).forEach(k => envKeys.add(k)));
|
|
130
|
+
let totalVariability = 0;
|
|
131
|
+
envKeys.forEach(key => {
|
|
132
|
+
const values = new Set(withEnv.map(r => JSON.stringify(r.environment?.[key])));
|
|
133
|
+
totalVariability += (values.size - 1) / Math.max(withEnv.length - 1, 1);
|
|
134
|
+
});
|
|
135
|
+
return totalVariability / Math.max(envKeys.size, 1);
|
|
136
|
+
}
|
|
137
|
+
// ==================== Root Cause Analysis ====================
|
|
138
|
+
/**
|
|
139
|
+
* Analyze root cause of flakiness
|
|
140
|
+
*/
|
|
141
|
+
function analyzeRootCause(testName, results, failurePattern) {
|
|
142
|
+
const variance = calculateVariance(results);
|
|
143
|
+
const metrics = calculateMetrics(results.map(r => r.duration));
|
|
144
|
+
const evidence = [];
|
|
145
|
+
const patterns = [];
|
|
146
|
+
// Analyze variance for timing issues
|
|
147
|
+
const cv = metrics.mean > 0 ? metrics.stdDev / metrics.mean : 0;
|
|
148
|
+
if (cv > 0.5) {
|
|
149
|
+
evidence.push(`High coefficient of variation: ${(cv * 100).toFixed(1)}%`);
|
|
150
|
+
patterns.push('timing-variance');
|
|
151
|
+
}
|
|
152
|
+
// Analyze environmental correlation
|
|
153
|
+
const envVariability = calculateEnvironmentVariability(results);
|
|
154
|
+
if (envVariability > 0.3) {
|
|
155
|
+
evidence.push(`Environment variability: ${(envVariability * 100).toFixed(1)}%`);
|
|
156
|
+
patterns.push('environment-sensitive');
|
|
157
|
+
}
|
|
158
|
+
// Analyze failure clustering
|
|
159
|
+
const failureResults = results.filter(r => r.status === 'failed');
|
|
160
|
+
if (failureResults.length >= 2) {
|
|
161
|
+
const isSequential = areFailuresSequential(failureResults, results);
|
|
162
|
+
if (isSequential) {
|
|
163
|
+
evidence.push('Failures occur in sequence (race condition indicator)');
|
|
164
|
+
patterns.push('race-condition');
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
// Analyze resource usage
|
|
168
|
+
const outlierRatio = metrics.outliers.length / results.length;
|
|
169
|
+
if (outlierRatio > 0.15) {
|
|
170
|
+
evidence.push(`${(outlierRatio * 100).toFixed(1)}% outliers in execution time`);
|
|
171
|
+
patterns.push('resource-contention');
|
|
172
|
+
}
|
|
173
|
+
// Analyze retry patterns
|
|
174
|
+
const retryCount = results.filter(r => (r.retryCount || 0) > 0).length;
|
|
175
|
+
if (retryCount > 0) {
|
|
176
|
+
evidence.push(`${retryCount} tests required retries`);
|
|
177
|
+
patterns.push('intermittent-failure');
|
|
178
|
+
}
|
|
179
|
+
// Determine root cause from patterns
|
|
180
|
+
let cause;
|
|
181
|
+
let mlConfidence;
|
|
182
|
+
let fixComplexity;
|
|
183
|
+
if (patterns.includes('race-condition')) {
|
|
184
|
+
cause = 'race_condition';
|
|
185
|
+
mlConfidence = 0.85;
|
|
186
|
+
fixComplexity = 'high';
|
|
187
|
+
}
|
|
188
|
+
else if (patterns.includes('environment-sensitive')) {
|
|
189
|
+
cause = 'environment';
|
|
190
|
+
mlConfidence = 0.8;
|
|
191
|
+
fixComplexity = 'medium';
|
|
192
|
+
}
|
|
193
|
+
else if (patterns.includes('timing-variance')) {
|
|
194
|
+
cause = 'timing';
|
|
195
|
+
mlConfidence = 0.75;
|
|
196
|
+
fixComplexity = 'medium';
|
|
197
|
+
}
|
|
198
|
+
else if (patterns.includes('resource-contention')) {
|
|
199
|
+
cause = failurePattern === 'resource' ? 'dependency' : 'isolation';
|
|
200
|
+
mlConfidence = 0.7;
|
|
201
|
+
fixComplexity = 'medium';
|
|
202
|
+
}
|
|
203
|
+
else if (patterns.includes('intermittent-failure')) {
|
|
204
|
+
cause = 'isolation';
|
|
205
|
+
mlConfidence = 0.65;
|
|
206
|
+
fixComplexity = 'low';
|
|
207
|
+
}
|
|
208
|
+
else {
|
|
209
|
+
// Fallback to failure pattern
|
|
210
|
+
cause = mapFailurePatternToRootCause(failurePattern);
|
|
211
|
+
mlConfidence = 0.6;
|
|
212
|
+
fixComplexity = 'medium';
|
|
213
|
+
}
|
|
214
|
+
return {
|
|
215
|
+
cause,
|
|
216
|
+
mlConfidence,
|
|
217
|
+
evidence,
|
|
218
|
+
patterns,
|
|
219
|
+
fixComplexity
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Check if failures occur sequentially
|
|
224
|
+
*/
|
|
225
|
+
function areFailuresSequential(failures, allResults) {
|
|
226
|
+
if (failures.length < 2)
|
|
227
|
+
return false;
|
|
228
|
+
const failureIndices = failures.map(f => allResults.findIndex(r => r.timestamp === f.timestamp));
|
|
229
|
+
let consecutiveCount = 0;
|
|
230
|
+
for (let i = 1; i < failureIndices.length; i++) {
|
|
231
|
+
if (failureIndices[i] - failureIndices[i - 1] === 1) {
|
|
232
|
+
consecutiveCount++;
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
return consecutiveCount / (failureIndices.length - 1) > 0.5;
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Map failure pattern to root cause
|
|
239
|
+
*/
|
|
240
|
+
function mapFailurePatternToRootCause(pattern) {
|
|
241
|
+
const mapping = {
|
|
242
|
+
intermittent: 'isolation',
|
|
243
|
+
environmental: 'environment',
|
|
244
|
+
timing: 'timing',
|
|
245
|
+
resource: 'dependency'
|
|
246
|
+
};
|
|
247
|
+
return mapping[pattern] || 'isolation';
|
|
248
|
+
}
|
|
249
|
+
// ==================== Severity Calculation ====================
|
|
250
|
+
/**
|
|
251
|
+
* Calculate severity based on pass rate and variance
|
|
252
|
+
*/
|
|
253
|
+
function calculateSeverity(passRate, variance) {
|
|
254
|
+
if (passRate < 0.3)
|
|
255
|
+
return 'critical';
|
|
256
|
+
if (passRate < 0.5)
|
|
257
|
+
return 'high';
|
|
258
|
+
if (passRate < 0.7 || variance > 5000)
|
|
259
|
+
return 'medium';
|
|
260
|
+
return 'low';
|
|
261
|
+
}
|
|
262
|
+
// ==================== Main Detection Function ====================
|
|
263
|
+
/**
|
|
264
|
+
* Detect flaky tests using statistical analysis and ML
|
|
265
|
+
*/
|
|
266
|
+
async function detectFlakyTestsStatistical(params) {
|
|
267
|
+
const startTime = Date.now();
|
|
268
|
+
try {
|
|
269
|
+
// Group results by test
|
|
270
|
+
const byTest = groupByTest(params.testResults);
|
|
271
|
+
const flakyTests = [];
|
|
272
|
+
// Analyze each test
|
|
273
|
+
for (const [testId, results] of byTest) {
|
|
274
|
+
if (results.length < params.minRuns) {
|
|
275
|
+
continue;
|
|
276
|
+
}
|
|
277
|
+
// Statistical analysis
|
|
278
|
+
const passRate = calculatePassRate(results);
|
|
279
|
+
const variance = calculateVariance(results);
|
|
280
|
+
const confidence = calculateConfidence(results);
|
|
281
|
+
// Rule-based detection
|
|
282
|
+
const isFlaky = isFlakyCandidate(passRate, variance, confidence, params.confidenceThreshold);
|
|
283
|
+
if (isFlaky) {
|
|
284
|
+
const failurePattern = identifyFailurePattern(results);
|
|
285
|
+
const rootCause = analyzeRootCause(testId, results, failurePattern);
|
|
286
|
+
const recommendations = generateRecommendations(rootCause);
|
|
287
|
+
const severity = calculateSeverity(passRate, variance);
|
|
288
|
+
flakyTests.push({
|
|
289
|
+
testId,
|
|
290
|
+
name: results[0].name,
|
|
291
|
+
passRate,
|
|
292
|
+
variance,
|
|
293
|
+
confidence,
|
|
294
|
+
totalRuns: results.length,
|
|
295
|
+
failurePattern,
|
|
296
|
+
severity,
|
|
297
|
+
rootCause,
|
|
298
|
+
recommendations,
|
|
299
|
+
firstDetected: Math.min(...results.map(r => new Date(r.timestamp).getTime())),
|
|
300
|
+
lastSeen: Math.max(...results.map(r => new Date(r.timestamp).getTime()))
|
|
301
|
+
});
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
// Sort by severity and confidence
|
|
305
|
+
flakyTests.sort((a, b) => {
|
|
306
|
+
const severityOrder = { critical: 4, high: 3, medium: 2, low: 1 };
|
|
307
|
+
const severityDiff = severityOrder[b.severity] - severityOrder[a.severity];
|
|
308
|
+
if (severityDiff !== 0)
|
|
309
|
+
return severityDiff;
|
|
310
|
+
return b.confidence - a.confidence;
|
|
311
|
+
});
|
|
312
|
+
// Generate summary
|
|
313
|
+
const summary = generateSummary(byTest.size, flakyTests);
|
|
314
|
+
const executionTime = Date.now() - startTime;
|
|
315
|
+
return {
|
|
316
|
+
success: true,
|
|
317
|
+
data: {
|
|
318
|
+
flakyTests,
|
|
319
|
+
summary,
|
|
320
|
+
metadata: {
|
|
321
|
+
requestId: `detect-${Date.now()}`,
|
|
322
|
+
timestamp: new Date().toISOString(),
|
|
323
|
+
executionTime,
|
|
324
|
+
agent: 'qe-flaky-test-hunter',
|
|
325
|
+
version: '2.0.0'
|
|
326
|
+
}
|
|
327
|
+
},
|
|
328
|
+
metadata: {
|
|
329
|
+
requestId: `detect-${Date.now()}`,
|
|
330
|
+
timestamp: new Date().toISOString(),
|
|
331
|
+
executionTime,
|
|
332
|
+
agent: 'qe-flaky-test-hunter',
|
|
333
|
+
version: '2.0.0'
|
|
334
|
+
}
|
|
335
|
+
};
|
|
336
|
+
}
|
|
337
|
+
catch (error) {
|
|
338
|
+
const executionTime = Date.now() - startTime;
|
|
339
|
+
return {
|
|
340
|
+
success: false,
|
|
341
|
+
error: {
|
|
342
|
+
code: 'DETECTION_ERROR',
|
|
343
|
+
message: error instanceof Error ? error.message : 'Unknown error',
|
|
344
|
+
stack: error instanceof Error ? error.stack : undefined
|
|
345
|
+
},
|
|
346
|
+
metadata: {
|
|
347
|
+
requestId: `detect-${Date.now()}`,
|
|
348
|
+
timestamp: new Date().toISOString(),
|
|
349
|
+
executionTime,
|
|
350
|
+
agent: 'qe-flaky-test-hunter',
|
|
351
|
+
version: '2.0.0'
|
|
352
|
+
}
|
|
353
|
+
};
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
// ==================== Helper Functions ====================
|
|
357
|
+
/**
|
|
358
|
+
* Group test results by test ID
|
|
359
|
+
*/
|
|
360
|
+
function groupByTest(results) {
|
|
361
|
+
const groups = new Map();
|
|
362
|
+
for (const result of results) {
|
|
363
|
+
if (!groups.has(result.testId)) {
|
|
364
|
+
groups.set(result.testId, []);
|
|
365
|
+
}
|
|
366
|
+
groups.get(result.testId).push(result);
|
|
367
|
+
}
|
|
368
|
+
return groups;
|
|
369
|
+
}
|
|
370
|
+
/**
|
|
371
|
+
* Check if test is flaky candidate
|
|
372
|
+
*/
|
|
373
|
+
function isFlakyCandidate(passRate, variance, confidence, confidenceThreshold) {
|
|
374
|
+
// Primary criterion: intermittent failures
|
|
375
|
+
const hasIntermittentFailures = passRate > 0.2 && passRate < 0.8;
|
|
376
|
+
// Secondary criterion: high variance (even with good pass rate)
|
|
377
|
+
const hasHighVariance = variance > 1000 && passRate < 0.95;
|
|
378
|
+
// Require sufficient confidence
|
|
379
|
+
const hasSufficientConfidence = confidence > confidenceThreshold;
|
|
380
|
+
return (hasIntermittentFailures || hasHighVariance) && hasSufficientConfidence;
|
|
381
|
+
}
|
|
382
|
+
/**
|
|
383
|
+
* Generate fix recommendations
|
|
384
|
+
*/
|
|
385
|
+
function generateRecommendations(rootCause) {
|
|
386
|
+
const recommendations = [];
|
|
387
|
+
switch (rootCause.cause) {
|
|
388
|
+
case 'race_condition':
|
|
389
|
+
recommendations.push({
|
|
390
|
+
priority: 'high',
|
|
391
|
+
strategy: 'isolation',
|
|
392
|
+
description: 'Add proper synchronization to prevent race conditions',
|
|
393
|
+
steps: [
|
|
394
|
+
'Identify shared resources accessed concurrently',
|
|
395
|
+
'Add locks or atomic operations',
|
|
396
|
+
'Use explicit wait conditions instead of sleeps',
|
|
397
|
+
'Test with parallel execution enabled'
|
|
398
|
+
],
|
|
399
|
+
estimatedEffort: 4,
|
|
400
|
+
successRate: 0.85
|
|
401
|
+
});
|
|
402
|
+
break;
|
|
403
|
+
case 'timing':
|
|
404
|
+
recommendations.push({
|
|
405
|
+
priority: 'high',
|
|
406
|
+
strategy: 'wait',
|
|
407
|
+
description: 'Replace hardcoded waits with explicit conditions',
|
|
408
|
+
steps: [
|
|
409
|
+
'Identify all sleep/wait statements',
|
|
410
|
+
'Replace with waitFor conditions',
|
|
411
|
+
'Add timeout guards',
|
|
412
|
+
'Verify with multiple runs'
|
|
413
|
+
],
|
|
414
|
+
estimatedEffort: 2,
|
|
415
|
+
successRate: 0.9
|
|
416
|
+
});
|
|
417
|
+
break;
|
|
418
|
+
case 'environment':
|
|
419
|
+
recommendations.push({
|
|
420
|
+
priority: 'medium',
|
|
421
|
+
strategy: 'isolation',
|
|
422
|
+
description: 'Isolate test from environment dependencies',
|
|
423
|
+
steps: [
|
|
424
|
+
'Identify environment-specific dependencies',
|
|
425
|
+
'Use test containers or fixtures',
|
|
426
|
+
'Add environment reset in setup/teardown',
|
|
427
|
+
'Verify across different environments'
|
|
428
|
+
],
|
|
429
|
+
estimatedEffort: 3,
|
|
430
|
+
successRate: 0.8
|
|
431
|
+
});
|
|
432
|
+
break;
|
|
433
|
+
case 'dependency':
|
|
434
|
+
recommendations.push({
|
|
435
|
+
priority: 'medium',
|
|
436
|
+
strategy: 'mock',
|
|
437
|
+
description: 'Mock external dependencies',
|
|
438
|
+
steps: [
|
|
439
|
+
'Identify external service calls',
|
|
440
|
+
'Create mocks/stubs',
|
|
441
|
+
'Add retry logic with backoff',
|
|
442
|
+
'Test with mocks enabled'
|
|
443
|
+
],
|
|
444
|
+
estimatedEffort: 3,
|
|
445
|
+
successRate: 0.85
|
|
446
|
+
});
|
|
447
|
+
break;
|
|
448
|
+
case 'isolation':
|
|
449
|
+
recommendations.push({
|
|
450
|
+
priority: 'low',
|
|
451
|
+
strategy: 'retry',
|
|
452
|
+
description: 'Add retry mechanism with proper cleanup',
|
|
453
|
+
steps: [
|
|
454
|
+
'Implement test retry logic',
|
|
455
|
+
'Add proper cleanup between retries',
|
|
456
|
+
'Log retry attempts',
|
|
457
|
+
'Monitor retry rates'
|
|
458
|
+
],
|
|
459
|
+
estimatedEffort: 1,
|
|
460
|
+
successRate: 0.7
|
|
461
|
+
});
|
|
462
|
+
break;
|
|
463
|
+
}
|
|
464
|
+
return recommendations;
|
|
465
|
+
}
|
|
466
|
+
/**
|
|
467
|
+
* Generate detection summary
|
|
468
|
+
*/
|
|
469
|
+
function generateSummary(totalTests, flakyTests) {
|
|
470
|
+
const bySeverity = {
|
|
471
|
+
critical: flakyTests.filter(t => t.severity === 'critical').length,
|
|
472
|
+
high: flakyTests.filter(t => t.severity === 'high').length,
|
|
473
|
+
medium: flakyTests.filter(t => t.severity === 'medium').length,
|
|
474
|
+
low: flakyTests.filter(t => t.severity === 'low').length
|
|
475
|
+
};
|
|
476
|
+
const byPattern = {
|
|
477
|
+
intermittent: flakyTests.filter(t => t.failurePattern === 'intermittent').length,
|
|
478
|
+
environmental: flakyTests.filter(t => t.failurePattern === 'environmental').length,
|
|
479
|
+
timing: flakyTests.filter(t => t.failurePattern === 'timing').length,
|
|
480
|
+
resource: flakyTests.filter(t => t.failurePattern === 'resource').length
|
|
481
|
+
};
|
|
482
|
+
const avgPassRate = flakyTests.length > 0
|
|
483
|
+
? flakyTests.reduce((sum, t) => sum + t.passRate, 0) / flakyTests.length
|
|
484
|
+
: 0;
|
|
485
|
+
const avgConfidence = flakyTests.length > 0
|
|
486
|
+
? flakyTests.reduce((sum, t) => sum + t.confidence, 0) / flakyTests.length
|
|
487
|
+
: 0;
|
|
488
|
+
return {
|
|
489
|
+
totalTests,
|
|
490
|
+
flakyCount: flakyTests.length,
|
|
491
|
+
detectionRate: totalTests > 0 ? flakyTests.length / totalTests : 0,
|
|
492
|
+
bySeverity,
|
|
493
|
+
byPattern,
|
|
494
|
+
avgPassRate,
|
|
495
|
+
avgConfidence
|
|
496
|
+
};
|
|
497
|
+
}
|
|
498
|
+
//# sourceMappingURL=detect-statistical.js.map
|