agentic-qe 3.6.2 → 3.6.3
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/v3/qe-accessibility-auditor.md +14 -9
- package/.claude/agents/v3/qe-bdd-generator.md +14 -9
- package/.claude/agents/v3/qe-chaos-engineer.md +15 -10
- package/.claude/agents/v3/qe-code-complexity.md +14 -9
- package/.claude/agents/v3/qe-code-intelligence.md +14 -9
- package/.claude/agents/v3/qe-contract-validator.md +14 -9
- package/.claude/agents/v3/qe-coverage-specialist.md +14 -9
- package/.claude/agents/v3/qe-defect-predictor.md +14 -9
- package/.claude/agents/v3/qe-dependency-mapper.md +14 -9
- package/.claude/agents/v3/qe-deployment-advisor.md +14 -9
- package/.claude/agents/v3/qe-flaky-hunter.md +14 -9
- package/.claude/agents/v3/qe-fleet-commander.md +14 -9
- package/.claude/agents/v3/qe-gap-detector.md +14 -9
- package/.claude/agents/v3/qe-graphql-tester.md +14 -9
- package/.claude/agents/v3/qe-impact-analyzer.md +14 -9
- package/.claude/agents/v3/qe-kg-builder.md +14 -9
- package/.claude/agents/v3/qe-load-tester.md +14 -9
- package/.claude/agents/v3/qe-message-broker-tester.md +15 -10
- package/.claude/agents/v3/qe-metrics-optimizer.md +14 -9
- package/.claude/agents/v3/qe-middleware-validator.md +15 -10
- package/.claude/agents/v3/qe-mutation-tester.md +14 -9
- package/.claude/agents/v3/qe-odata-contract-tester.md +17 -12
- package/.claude/agents/v3/qe-performance-tester.md +14 -9
- package/.claude/agents/v3/qe-product-factors-assessor.md +19 -0
- package/.claude/agents/v3/qe-property-tester.md +14 -9
- package/.claude/agents/v3/qe-qx-partner.md +101 -14
- package/.claude/agents/v3/qe-regression-analyzer.md +14 -9
- package/.claude/agents/v3/qe-requirements-validator.md +14 -9
- package/.claude/agents/v3/qe-responsive-tester.md +14 -9
- package/.claude/agents/v3/qe-retry-handler.md +14 -9
- package/.claude/agents/v3/qe-risk-assessor.md +14 -9
- package/.claude/agents/v3/qe-root-cause-analyzer.md +14 -9
- package/.claude/agents/v3/qe-sap-idoc-tester.md +16 -11
- package/.claude/agents/v3/qe-sap-rfc-tester.md +15 -10
- package/.claude/agents/v3/qe-security-auditor.md +18 -9
- package/.claude/agents/v3/qe-security-scanner.md +15 -10
- package/.claude/agents/v3/qe-soap-tester.md +15 -10
- package/.claude/agents/v3/qe-sod-analyzer.md +17 -12
- package/.claude/agents/v3/qe-test-architect.md +14 -9
- package/.claude/agents/v3/qe-transfer-specialist.md +14 -9
- package/.claude/agents/v3/subagents/qe-code-reviewer.md +14 -9
- package/.claude/agents/v3/subagents/qe-integration-reviewer.md +14 -9
- package/.claude/agents/v3/subagents/qe-performance-reviewer.md +14 -9
- package/.claude/agents/v3/subagents/qe-security-reviewer.md +14 -9
- package/.claude/agents/v3/subagents/qe-tdd-green.md +14 -9
- package/.claude/agents/v3/subagents/qe-tdd-red.md +14 -9
- package/.claude/agents/v3/subagents/qe-tdd-refactor.md +14 -9
- package/.claude/agents/v3/templates/qx-report-template.html +26 -22
- package/.claude/skills/.validation/README.md +2 -2
- package/.claude/skills/.validation/skill-validation-mcp-integration.md +1 -1
- package/.claude/skills/.validation/templates/skill-frontmatter.example.yaml +1 -1
- package/.claude/skills/TRUST-TIERS.md +55 -55
- package/.claude/skills/a11y-ally/SKILL.md +1 -1
- package/.claude/skills/a11y-ally/evals/a11y-ally.yaml +1 -1
- package/.claude/skills/a11y-ally/scripts/validate-config.json +42 -0
- package/.claude/skills/accessibility-testing/SKILL.md +1 -1
- package/.claude/skills/accessibility-testing/scripts/validate-config.json +56 -0
- package/.claude/skills/api-testing-patterns/SKILL.md +1 -1
- package/.claude/skills/api-testing-patterns/scripts/validate-config.json +61 -0
- package/.claude/skills/brutal-honesty-review/SKILL.md +1 -1
- package/.claude/skills/brutal-honesty-review/scripts/validate-config.json +34 -0
- package/.claude/skills/bug-reporting-excellence/SKILL.md +1 -1
- package/.claude/skills/bug-reporting-excellence/scripts/validate-config.json +34 -0
- package/.claude/skills/chaos-engineering-resilience/SKILL.md +1 -1
- package/.claude/skills/chaos-engineering-resilience/evals/chaos-engineering-resilience.yaml +1 -1
- package/.claude/skills/chaos-engineering-resilience/scripts/validate-config.json +47 -0
- package/.claude/skills/cicd-pipeline-qe-orchestrator/SKILL.md +1 -1
- package/.claude/skills/cicd-pipeline-qe-orchestrator/scripts/validate-config.json +42 -0
- package/.claude/skills/code-review-quality/SKILL.md +1 -1
- package/.claude/skills/code-review-quality/scripts/validate-config.json +34 -0
- package/.claude/skills/compatibility-testing/SKILL.md +1 -1
- package/.claude/skills/compatibility-testing/scripts/validate-config.json +44 -0
- package/.claude/skills/compliance-testing/SKILL.md +1 -1
- package/.claude/skills/compliance-testing/scripts/validate-config.json +39 -0
- package/.claude/skills/contract-testing/SKILL.md +1 -1
- package/.claude/skills/contract-testing/scripts/validate-config.json +59 -0
- package/.claude/skills/database-testing/SKILL.md +1 -1
- package/.claude/skills/database-testing/evals/database-testing.yaml +1 -1
- package/.claude/skills/database-testing/scripts/validate-config.json +48 -0
- package/.claude/skills/enterprise-integration-testing/SKILL.md +1 -1
- package/.claude/skills/localization-testing/SKILL.md +1 -1
- package/.claude/skills/localization-testing/evals/localization-testing.yaml +1 -1
- package/.claude/skills/localization-testing/scripts/validate-config.json +42 -0
- package/.claude/skills/middleware-testing-patterns/SKILL.md +1 -1
- package/.claude/skills/mobile-testing/SKILL.md +1 -1
- package/.claude/skills/mobile-testing/evals/mobile-testing.yaml +1 -1
- package/.claude/skills/mobile-testing/scripts/validate-config.json +43 -0
- package/.claude/skills/mutation-testing/SKILL.md +1 -1
- package/.claude/skills/mutation-testing/scripts/validate-config.json +44 -0
- package/.claude/skills/n8n-expression-testing/SKILL.md +1 -1
- package/.claude/skills/n8n-expression-testing/evals/n8n-expression-testing.yaml +1 -1
- package/.claude/skills/n8n-expression-testing/scripts/validate-config.json +39 -0
- package/.claude/skills/n8n-integration-testing-patterns/SKILL.md +1 -1
- package/.claude/skills/n8n-integration-testing-patterns/evals/n8n-integration-testing-patterns.yaml +1 -1
- package/.claude/skills/n8n-integration-testing-patterns/scripts/validate-config.json +34 -0
- package/.claude/skills/n8n-security-testing/SKILL.md +1 -1
- package/.claude/skills/n8n-security-testing/evals/n8n-security-testing.yaml +1 -1
- package/.claude/skills/n8n-security-testing/scripts/validate-config.json +34 -0
- package/.claude/skills/n8n-trigger-testing-strategies/SKILL.md +1 -1
- package/.claude/skills/n8n-trigger-testing-strategies/evals/n8n-trigger-testing-strategies.yaml +1 -1
- package/.claude/skills/n8n-trigger-testing-strategies/scripts/validate-config.json +34 -0
- package/.claude/skills/n8n-workflow-testing-fundamentals/SKILL.md +1 -1
- package/.claude/skills/n8n-workflow-testing-fundamentals/evals/n8n-workflow-testing-fundamentals.yaml +1 -1
- package/.claude/skills/n8n-workflow-testing-fundamentals/scripts/validate-config.json +35 -0
- package/.claude/skills/observability-testing-patterns/SKILL.md +1 -1
- package/.claude/skills/pentest-validation/SKILL.md +1 -1
- package/.claude/skills/pentest-validation/evals/pentest-validation.yaml +1 -1
- package/.claude/skills/pentest-validation/scripts/validate-config.json +12 -0
- package/.claude/skills/performance-analysis/SKILL.md +1 -1
- package/.claude/skills/performance-analysis/scripts/validate-config.json +36 -0
- package/.claude/skills/performance-testing/SKILL.md +1 -1
- package/.claude/skills/performance-testing/evals/performance-testing.yaml +1 -1
- package/.claude/skills/performance-testing/scripts/validate-config.json +55 -0
- package/.claude/skills/qcsd-cicd-swarm/SKILL.md +1 -1
- package/.claude/skills/qcsd-development-swarm/SKILL.md +1 -1
- package/.claude/skills/qcsd-ideation-swarm/SKILL.md +1 -1
- package/.claude/skills/qcsd-ideation-swarm/scripts/validate-config.json +25 -0
- package/.claude/skills/qcsd-refinement-swarm/SKILL.md +1 -1
- package/.claude/skills/qcsd-refinement-swarm/scripts/validate-config.json +25 -0
- package/.claude/skills/qe-chaos-resilience/SKILL.md +1 -1
- package/.claude/skills/qe-chaos-resilience/evals/qe-chaos-resilience.yaml +1 -1
- package/.claude/skills/qe-chaos-resilience/scripts/validate-config.json +43 -0
- package/.claude/skills/qe-code-intelligence/SKILL.md +1 -1
- package/.claude/skills/qe-code-intelligence/evals/qe-code-intelligence.yaml +1 -1
- package/.claude/skills/qe-code-intelligence/scripts/validate-config.json +41 -0
- package/.claude/skills/qe-contract-testing/SKILL.md +1 -1
- package/.claude/skills/qe-contract-testing/evals/qe-contract-testing.yaml +1 -1
- package/.claude/skills/qe-contract-testing/scripts/validate-config.json +42 -0
- package/.claude/skills/qe-coverage-analysis/SKILL.md +1 -1
- package/.claude/skills/qe-coverage-analysis/evals/qe-coverage-analysis.yaml +1 -1
- package/.claude/skills/qe-coverage-analysis/scripts/validate-config.json +42 -0
- package/.claude/skills/qe-defect-intelligence/SKILL.md +1 -1
- package/.claude/skills/qe-defect-intelligence/evals/qe-defect-intelligence.yaml +1 -1
- package/.claude/skills/qe-defect-intelligence/scripts/validate-config.json +40 -0
- package/.claude/skills/qe-iterative-loop/SKILL.md +1 -1
- package/.claude/skills/qe-iterative-loop/scripts/validate-config.json +40 -0
- package/.claude/skills/qe-learning-optimization/SKILL.md +1 -1
- package/.claude/skills/qe-learning-optimization/scripts/validate-config.json +25 -0
- package/.claude/skills/qe-quality-assessment/SKILL.md +1 -1
- package/.claude/skills/qe-quality-assessment/evals/qe-quality-assessment.yaml +1 -1
- package/.claude/skills/qe-quality-assessment/scripts/validate-config.json +47 -0
- package/.claude/skills/qe-requirements-validation/SKILL.md +1 -1
- package/.claude/skills/qe-requirements-validation/evals/qe-requirements-validation.yaml +1 -1
- package/.claude/skills/qe-requirements-validation/scripts/validate-config.json +37 -0
- package/.claude/skills/qe-security-compliance/SKILL.md +1 -1
- package/.claude/skills/qe-security-compliance/evals/qe-security-compliance.yaml +1 -1
- package/.claude/skills/qe-security-compliance/scripts/validate-config.json +41 -0
- package/.claude/skills/qe-test-execution/SKILL.md +1 -1
- package/.claude/skills/qe-test-execution/evals/qe-test-execution.yaml +1 -1
- package/.claude/skills/qe-test-execution/scripts/validate-config.json +37 -0
- package/.claude/skills/qe-test-generation/SKILL.md +1 -1
- package/.claude/skills/qe-test-generation/scripts/validate-config.json +25 -0
- package/.claude/skills/qe-visual-accessibility/SKILL.md +1 -1
- package/.claude/skills/qe-visual-accessibility/scripts/validate-config.json +25 -0
- package/.claude/skills/quality-metrics/SKILL.md +1 -1
- package/.claude/skills/quality-metrics/evals/quality-metrics.yaml +1 -1
- package/.claude/skills/quality-metrics/scripts/validate-config.json +43 -0
- package/.claude/skills/refactoring-patterns/SKILL.md +1 -1
- package/.claude/skills/refactoring-patterns/scripts/validate-config.json +35 -0
- package/.claude/skills/regression-testing/SKILL.md +1 -1
- package/.claude/skills/regression-testing/evals/regression-testing.yaml +1 -1
- package/.claude/skills/regression-testing/scripts/validate-config.json +50 -0
- package/.claude/skills/risk-based-testing/SKILL.md +1 -1
- package/.claude/skills/risk-based-testing/scripts/validate-config.json +25 -0
- package/.claude/skills/security-testing/SKILL.md +1 -1
- package/.claude/skills/security-testing/evals/security-testing.yaml +1 -1
- package/.claude/skills/security-testing/scripts/validate-config.json +45 -0
- package/.claude/skills/security-visual-testing/SKILL.md +1 -1
- package/.claude/skills/security-visual-testing/scripts/validate-config.json +45 -0
- package/.claude/skills/sherlock-review/SKILL.md +1 -1
- package/.claude/skills/sherlock-review/scripts/validate-config.json +35 -0
- package/.claude/skills/shift-left-testing/SKILL.md +1 -1
- package/.claude/skills/shift-left-testing/scripts/validate-config.json +25 -0
- package/.claude/skills/shift-right-testing/SKILL.md +1 -1
- package/.claude/skills/shift-right-testing/scripts/validate-config.json +25 -0
- package/.claude/skills/skill-builder/SKILL.md +2 -2
- package/.claude/skills/skills-manifest.json +1 -1
- package/.claude/skills/tdd-london-chicago/SKILL.md +1 -1
- package/.claude/skills/tdd-london-chicago/scripts/validate-config.json +43 -0
- package/.claude/skills/test-automation-strategy/SKILL.md +1 -1
- package/.claude/skills/test-automation-strategy/scripts/validate-config.json +39 -0
- package/.claude/skills/test-data-management/SKILL.md +1 -1
- package/.claude/skills/test-data-management/evals/test-data-management.yaml +1 -1
- package/.claude/skills/test-data-management/scripts/validate-config.json +41 -0
- package/.claude/skills/test-design-techniques/SKILL.md +1 -1
- package/.claude/skills/test-design-techniques/scripts/validate-config.json +36 -0
- package/.claude/skills/test-reporting-analytics/SKILL.md +1 -1
- package/.claude/skills/test-reporting-analytics/scripts/validate-config.json +36 -0
- package/.claude/skills/testability-scoring/SKILL.md +1 -1
- package/.claude/skills/testability-scoring/scripts/validate-config.json +42 -0
- package/.claude/skills/trust-tier-manifest.json +106 -106
- package/.claude/skills/verification-quality/scripts/validate-config.json +36 -0
- package/.claude/skills/visual-testing-advanced/SKILL.md +1 -1
- package/.claude/skills/visual-testing-advanced/scripts/validate-config.json +38 -0
- package/.claude/skills/wms-testing-patterns/SKILL.md +1 -1
- package/.claude/skills/wms-testing-patterns/evals/wms-testing-patterns.yaml +165 -0
- package/.claude/skills/wms-testing-patterns/schemas/output.json +150 -0
- package/.claude/skills/wms-testing-patterns/scripts/validate-config.json +51 -0
- package/README.md +20 -20
- package/package.json +6 -6
- package/scripts/migrate-validators.cjs +171 -0
- package/scripts/postinstall.cjs +57 -0
- package/scripts/preinstall.cjs +28 -8
- package/scripts/test-schema-validation.js +2 -2
- package/scripts/update-skill-manifest.ts +3 -3
- package/scripts/validate-skill.cjs +384 -0
- package/scripts/validate-tier3.cjs +61 -0
- package/scripts/validator-lib.cjs +274 -0
- package/v3/CHANGELOG.md +21 -0
- package/v3/assets/agents/v3/qe-product-factors-assessor.md +19 -0
- package/v3/assets/agents/v3/qe-qx-partner.md +27 -0
- package/v3/assets/skills/.validation/README.md +1 -1
- package/v3/assets/skills/.validation/skill-validation-mcp-integration.md +1 -1
- package/v3/assets/skills/.validation/templates/skill-frontmatter.example.yaml +1 -1
- package/v3/assets/skills/accessibility-testing/SKILL.md +1 -1
- package/v3/assets/skills/accessibility-testing/scripts/validate-config.json +56 -0
- package/v3/assets/skills/api-testing-patterns/SKILL.md +1 -1
- package/v3/assets/skills/api-testing-patterns/scripts/validate-config.json +61 -0
- package/v3/assets/skills/bug-reporting-excellence/SKILL.md +1 -1
- package/v3/assets/skills/bug-reporting-excellence/scripts/validate-config.json +34 -0
- package/v3/assets/skills/chaos-engineering-resilience/SKILL.md +1 -1
- package/v3/assets/skills/chaos-engineering-resilience/evals/chaos-engineering-resilience.yaml +1 -1
- package/v3/assets/skills/chaos-engineering-resilience/scripts/validate-config.json +47 -0
- package/v3/assets/skills/code-review-quality/SKILL.md +1 -1
- package/v3/assets/skills/code-review-quality/scripts/validate-config.json +34 -0
- package/v3/assets/skills/compatibility-testing/SKILL.md +1 -1
- package/v3/assets/skills/compatibility-testing/scripts/validate-config.json +44 -0
- package/v3/assets/skills/compliance-testing/SKILL.md +1 -1
- package/v3/assets/skills/compliance-testing/scripts/validate-config.json +39 -0
- package/v3/assets/skills/contract-testing/SKILL.md +1 -1
- package/v3/assets/skills/contract-testing/scripts/validate-config.json +59 -0
- package/v3/assets/skills/database-testing/SKILL.md +1 -1
- package/v3/assets/skills/database-testing/evals/database-testing.yaml +1 -1
- package/v3/assets/skills/database-testing/scripts/validate-config.json +48 -0
- package/v3/assets/skills/enterprise-integration-testing/SKILL.md +1 -1
- package/v3/assets/skills/localization-testing/SKILL.md +1 -1
- package/v3/assets/skills/localization-testing/evals/localization-testing.yaml +1 -1
- package/v3/assets/skills/localization-testing/scripts/validate-config.json +42 -0
- package/v3/assets/skills/middleware-testing-patterns/SKILL.md +1 -1
- package/v3/assets/skills/mobile-testing/SKILL.md +1 -1
- package/v3/assets/skills/mobile-testing/evals/mobile-testing.yaml +1 -1
- package/v3/assets/skills/mobile-testing/scripts/validate-config.json +43 -0
- package/v3/assets/skills/mutation-testing/SKILL.md +1 -1
- package/v3/assets/skills/mutation-testing/scripts/validate-config.json +44 -0
- package/v3/assets/skills/observability-testing-patterns/SKILL.md +1 -1
- package/v3/assets/skills/pentest-validation/SKILL.md +1 -1
- package/v3/assets/skills/pentest-validation/evals/pentest-validation.yaml +1 -1
- package/v3/assets/skills/performance-testing/SKILL.md +1 -1
- package/v3/assets/skills/performance-testing/evals/performance-testing.yaml +1 -1
- package/v3/assets/skills/performance-testing/scripts/validate-config.json +55 -0
- package/v3/assets/skills/qcsd-cicd-swarm/SKILL.md +1 -1
- package/v3/assets/skills/qcsd-development-swarm/SKILL.md +1 -1
- package/v3/assets/skills/qcsd-ideation-swarm/SKILL.md +1 -1
- package/v3/assets/skills/qcsd-refinement-swarm/SKILL.md +1 -1
- package/v3/assets/skills/qe-chaos-resilience/SKILL.md +1 -1
- package/v3/assets/skills/qe-chaos-resilience/evals/qe-chaos-resilience.yaml +1 -1
- package/v3/assets/skills/qe-chaos-resilience/scripts/validate-config.json +43 -0
- package/v3/assets/skills/qe-code-intelligence/SKILL.md +1 -1
- package/v3/assets/skills/qe-code-intelligence/evals/qe-code-intelligence.yaml +1 -1
- package/v3/assets/skills/qe-code-intelligence/scripts/validate-config.json +41 -0
- package/v3/assets/skills/qe-contract-testing/SKILL.md +1 -1
- package/v3/assets/skills/qe-contract-testing/evals/qe-contract-testing.yaml +1 -1
- package/v3/assets/skills/qe-contract-testing/scripts/validate-config.json +42 -0
- package/v3/assets/skills/qe-coverage-analysis/SKILL.md +1 -1
- package/v3/assets/skills/qe-coverage-analysis/evals/qe-coverage-analysis.yaml +1 -1
- package/v3/assets/skills/qe-coverage-analysis/scripts/validate-config.json +42 -0
- package/v3/assets/skills/qe-defect-intelligence/SKILL.md +1 -1
- package/v3/assets/skills/qe-defect-intelligence/evals/qe-defect-intelligence.yaml +1 -1
- package/v3/assets/skills/qe-defect-intelligence/scripts/validate-config.json +40 -0
- package/v3/assets/skills/qe-iterative-loop/SKILL.md +1 -1
- package/v3/assets/skills/qe-iterative-loop/scripts/validate-config.json +40 -0
- package/v3/assets/skills/qe-learning-optimization/SKILL.md +1 -1
- package/v3/assets/skills/qe-learning-optimization/scripts/validate-config.json +25 -0
- package/v3/assets/skills/qe-quality-assessment/SKILL.md +1 -1
- package/v3/assets/skills/qe-quality-assessment/evals/qe-quality-assessment.yaml +1 -1
- package/v3/assets/skills/qe-quality-assessment/scripts/validate-config.json +47 -0
- package/v3/assets/skills/qe-requirements-validation/SKILL.md +1 -1
- package/v3/assets/skills/qe-requirements-validation/evals/qe-requirements-validation.yaml +1 -1
- package/v3/assets/skills/qe-requirements-validation/scripts/validate-config.json +37 -0
- package/v3/assets/skills/qe-security-compliance/SKILL.md +1 -1
- package/v3/assets/skills/qe-security-compliance/evals/qe-security-compliance.yaml +1 -1
- package/v3/assets/skills/qe-security-compliance/scripts/validate-config.json +41 -0
- package/v3/assets/skills/qe-test-execution/SKILL.md +1 -1
- package/v3/assets/skills/qe-test-execution/evals/qe-test-execution.yaml +1 -1
- package/v3/assets/skills/qe-test-execution/scripts/validate-config.json +37 -0
- package/v3/assets/skills/qe-test-generation/SKILL.md +1 -1
- package/v3/assets/skills/qe-test-generation/scripts/validate-config.json +25 -0
- package/v3/assets/skills/qe-visual-accessibility/SKILL.md +1 -1
- package/v3/assets/skills/qe-visual-accessibility/scripts/validate-config.json +25 -0
- package/v3/assets/skills/quality-metrics/SKILL.md +1 -1
- package/v3/assets/skills/quality-metrics/evals/quality-metrics.yaml +1 -1
- package/v3/assets/skills/quality-metrics/scripts/validate-config.json +43 -0
- package/v3/assets/skills/refactoring-patterns/SKILL.md +1 -1
- package/v3/assets/skills/refactoring-patterns/scripts/validate-config.json +35 -0
- package/v3/assets/skills/regression-testing/SKILL.md +1 -1
- package/v3/assets/skills/regression-testing/evals/regression-testing.yaml +1 -1
- package/v3/assets/skills/regression-testing/scripts/validate-config.json +50 -0
- package/v3/assets/skills/risk-based-testing/SKILL.md +1 -1
- package/v3/assets/skills/risk-based-testing/scripts/validate-config.json +25 -0
- package/v3/assets/skills/security-testing/SKILL.md +1 -1
- package/v3/assets/skills/security-testing/evals/security-testing.yaml +1 -1
- package/v3/assets/skills/security-testing/scripts/validate-config.json +45 -0
- package/v3/assets/skills/security-visual-testing/SKILL.md +1 -1
- package/v3/assets/skills/shift-left-testing/SKILL.md +1 -1
- package/v3/assets/skills/shift-left-testing/scripts/validate-config.json +25 -0
- package/v3/assets/skills/shift-right-testing/SKILL.md +1 -1
- package/v3/assets/skills/shift-right-testing/scripts/validate-config.json +25 -0
- package/v3/assets/skills/tdd-london-chicago/SKILL.md +1 -1
- package/v3/assets/skills/tdd-london-chicago/scripts/validate-config.json +43 -0
- package/v3/assets/skills/test-automation-strategy/SKILL.md +1 -1
- package/v3/assets/skills/test-automation-strategy/scripts/validate-config.json +39 -0
- package/v3/assets/skills/test-data-management/SKILL.md +1 -1
- package/v3/assets/skills/test-data-management/evals/test-data-management.yaml +1 -1
- package/v3/assets/skills/test-data-management/scripts/validate-config.json +41 -0
- package/v3/assets/skills/test-design-techniques/SKILL.md +1 -1
- package/v3/assets/skills/test-design-techniques/scripts/validate-config.json +36 -0
- package/v3/assets/skills/test-reporting-analytics/SKILL.md +1 -1
- package/v3/assets/skills/test-reporting-analytics/scripts/validate-config.json +36 -0
- package/v3/assets/skills/verification-quality/SKILL.md +0 -6
- package/v3/assets/skills/verification-quality/scripts/validate-config.json +36 -0
- package/v3/assets/skills/visual-testing-advanced/SKILL.md +1 -1
- package/v3/assets/skills/visual-testing-advanced/scripts/validate-config.json +38 -0
- package/v3/assets/skills/wms-testing-patterns/SKILL.md +1 -1
- package/v3/dist/adapters/claude-flow/model-router-bridge.js +3 -3
- package/v3/dist/adapters/claude-flow/model-router-bridge.js.map +1 -1
- package/v3/dist/adapters/claude-flow/pretrain-bridge.js +4 -4
- package/v3/dist/adapters/claude-flow/pretrain-bridge.js.map +1 -1
- package/v3/dist/adapters/claude-flow/trajectory-bridge.js +4 -4
- package/v3/dist/adapters/claude-flow/trajectory-bridge.js.map +1 -1
- package/v3/dist/cli/bundle.js +135 -153
- package/v3/dist/cli/commands/claude-flow-setup.js +3 -3
- package/v3/dist/cli/commands/claude-flow-setup.js.map +1 -1
- package/v3/dist/cli/commands/completions.d.ts.map +1 -1
- package/v3/dist/cli/commands/completions.js +2 -1
- package/v3/dist/cli/commands/completions.js.map +1 -1
- package/v3/dist/cli/commands/hooks.js +8 -8
- package/v3/dist/cli/commands/hooks.js.map +1 -1
- package/v3/dist/cli/completions/index.d.ts.map +1 -1
- package/v3/dist/cli/completions/index.js +4 -3
- package/v3/dist/cli/completions/index.js.map +1 -1
- package/v3/dist/domains/code-intelligence/services/metric-collector/test-counter.js +5 -5
- package/v3/dist/domains/code-intelligence/services/metric-collector/test-counter.js.map +1 -1
- package/v3/dist/init/enhancements/claude-flow-adapter.d.ts.map +1 -1
- package/v3/dist/init/enhancements/claude-flow-adapter.js +15 -12
- package/v3/dist/init/enhancements/claude-flow-adapter.js.map +1 -1
- package/v3/dist/init/enhancements/detector.js +2 -2
- package/v3/dist/init/enhancements/detector.js.map +1 -1
- package/v3/dist/init/init-wizard.d.ts.map +1 -1
- package/v3/dist/init/init-wizard.js +17 -33
- package/v3/dist/init/init-wizard.js.map +1 -1
- package/v3/dist/init/phases/07-hooks.js +9 -9
- package/v3/dist/init/phases/07-hooks.js.map +1 -1
- package/v3/dist/init/phases/10-workers.d.ts.map +1 -1
- package/v3/dist/init/phases/10-workers.js +74 -85
- package/v3/dist/init/phases/10-workers.js.map +1 -1
- package/v3/dist/kernel/hybrid-backend.d.ts.map +1 -1
- package/v3/dist/kernel/hybrid-backend.js +4 -1
- package/v3/dist/kernel/hybrid-backend.js.map +1 -1
- package/v3/dist/kernel/memory-backend.d.ts.map +1 -1
- package/v3/dist/kernel/memory-backend.js +3 -0
- package/v3/dist/kernel/memory-backend.js.map +1 -1
- package/v3/dist/mcp/bundle.js +1339 -18
- package/v3/dist/mcp/tools/index.d.ts +2 -1
- package/v3/dist/mcp/tools/index.d.ts.map +1 -1
- package/v3/dist/mcp/tools/index.js +5 -1
- package/v3/dist/mcp/tools/index.js.map +1 -1
- package/v3/dist/mcp/tools/qx-analysis/analyze.d.ts +33 -0
- package/v3/dist/mcp/tools/qx-analysis/analyze.d.ts.map +1 -0
- package/v3/dist/mcp/tools/qx-analysis/analyze.js +679 -0
- package/v3/dist/mcp/tools/qx-analysis/analyze.js.map +1 -0
- package/v3/dist/mcp/tools/qx-analysis/heuristics-engine.d.ts +38 -0
- package/v3/dist/mcp/tools/qx-analysis/heuristics-engine.d.ts.map +1 -0
- package/v3/dist/mcp/tools/qx-analysis/heuristics-engine.js +458 -0
- package/v3/dist/mcp/tools/qx-analysis/heuristics-engine.js.map +1 -0
- package/v3/dist/mcp/tools/qx-analysis/impact-analyzer.d.ts +16 -0
- package/v3/dist/mcp/tools/qx-analysis/impact-analyzer.d.ts.map +1 -0
- package/v3/dist/mcp/tools/qx-analysis/impact-analyzer.js +175 -0
- package/v3/dist/mcp/tools/qx-analysis/impact-analyzer.js.map +1 -0
- package/v3/dist/mcp/tools/qx-analysis/index.d.ts +27 -0
- package/v3/dist/mcp/tools/qx-analysis/index.d.ts.map +1 -0
- package/v3/dist/mcp/tools/qx-analysis/index.js +34 -0
- package/v3/dist/mcp/tools/qx-analysis/index.js.map +1 -0
- package/v3/dist/mcp/tools/qx-analysis/oracle-detector.d.ts +22 -0
- package/v3/dist/mcp/tools/qx-analysis/oracle-detector.d.ts.map +1 -0
- package/v3/dist/mcp/tools/qx-analysis/oracle-detector.js +194 -0
- package/v3/dist/mcp/tools/qx-analysis/oracle-detector.js.map +1 -0
- package/v3/dist/mcp/tools/qx-analysis/types.d.ts +278 -0
- package/v3/dist/mcp/tools/qx-analysis/types.d.ts.map +1 -0
- package/v3/dist/mcp/tools/qx-analysis/types.js +46 -0
- package/v3/dist/mcp/tools/qx-analysis/types.js.map +1 -0
- package/v3/dist/mcp/tools/registry.d.ts +1 -0
- package/v3/dist/mcp/tools/registry.d.ts.map +1 -1
- package/v3/dist/mcp/tools/registry.js +5 -0
- package/v3/dist/mcp/tools/registry.js.map +1 -1
- package/v3/package.json +5 -5
- package/.claude/skills/.validation/templates/validate.template.sh +0 -1060
- package/.claude/skills/.validation/templates/validator-lib.sh +0 -1031
- package/.claude/skills/a11y-ally/scripts/validate.sh +0 -690
- package/.claude/skills/accessibility-testing/scripts/validate.sh +0 -943
- package/.claude/skills/api-testing-patterns/scripts/validate.sh +0 -931
- package/.claude/skills/brutal-honesty-review/scripts/validate.sh +0 -130
- package/.claude/skills/bug-reporting-excellence/scripts/validate.sh +0 -108
- package/.claude/skills/chaos-engineering-resilience/scripts/validate.sh +0 -1107
- package/.claude/skills/cicd-pipeline-qe-orchestrator/scripts/validate.sh +0 -310
- package/.claude/skills/code-review-quality/scripts/validate.sh +0 -113
- package/.claude/skills/compatibility-testing/scripts/validate.sh +0 -605
- package/.claude/skills/compliance-testing/scripts/validate.sh +0 -888
- package/.claude/skills/contract-testing/scripts/validate.sh +0 -1033
- package/.claude/skills/database-testing/scripts/validate.sh +0 -1099
- package/.claude/skills/localization-testing/scripts/validate.sh +0 -131
- package/.claude/skills/mobile-testing/scripts/validate.sh +0 -127
- package/.claude/skills/mutation-testing/scripts/validate.sh +0 -992
- package/.claude/skills/n8n-expression-testing/scripts/validate.sh +0 -162
- package/.claude/skills/n8n-integration-testing-patterns/scripts/validate.sh +0 -104
- package/.claude/skills/n8n-security-testing/scripts/validate.sh +0 -120
- package/.claude/skills/n8n-trigger-testing-strategies/scripts/validate.sh +0 -121
- package/.claude/skills/n8n-workflow-testing-fundamentals/scripts/validate.sh +0 -126
- package/.claude/skills/pentest-validation/scripts/validate.sh +0 -402
- package/.claude/skills/performance-analysis/scripts/validate.sh +0 -63
- package/.claude/skills/performance-testing/scripts/validate.sh +0 -1090
- package/.claude/skills/qcsd-ideation-swarm/scripts/validate.sh +0 -56
- package/.claude/skills/qcsd-refinement-swarm/scripts/validate.sh +0 -56
- package/.claude/skills/qe-chaos-resilience/scripts/validate.sh +0 -401
- package/.claude/skills/qe-code-intelligence/scripts/validate.sh +0 -408
- package/.claude/skills/qe-contract-testing/scripts/validate.sh +0 -421
- package/.claude/skills/qe-coverage-analysis/scripts/validate.sh +0 -453
- package/.claude/skills/qe-defect-intelligence/scripts/validate.sh +0 -466
- package/.claude/skills/qe-iterative-loop/scripts/validate.sh +0 -474
- package/.claude/skills/qe-learning-optimization/scripts/validate.sh +0 -56
- package/.claude/skills/qe-quality-assessment/scripts/validate.sh +0 -352
- package/.claude/skills/qe-requirements-validation/scripts/validate.sh +0 -275
- package/.claude/skills/qe-security-compliance/scripts/validate.sh +0 -305
- package/.claude/skills/qe-test-execution/scripts/validate.sh +0 -323
- package/.claude/skills/qe-test-generation/scripts/validate.sh +0 -56
- package/.claude/skills/qe-visual-accessibility/scripts/validate.sh +0 -56
- package/.claude/skills/quality-metrics/scripts/validate.sh +0 -434
- package/.claude/skills/refactoring-patterns/scripts/validate.sh +0 -241
- package/.claude/skills/regression-testing/scripts/validate.sh +0 -130
- package/.claude/skills/risk-based-testing/scripts/validate.sh +0 -56
- package/.claude/skills/security-testing/scripts/validate.sh +0 -967
- package/.claude/skills/security-visual-testing/scripts/validate.sh +0 -748
- package/.claude/skills/sherlock-review/scripts/validate.sh +0 -115
- package/.claude/skills/shift-left-testing/scripts/validate.sh +0 -56
- package/.claude/skills/shift-right-testing/scripts/validate.sh +0 -56
- package/.claude/skills/tdd-london-chicago/scripts/validate.sh +0 -214
- package/.claude/skills/test-automation-strategy/scripts/validate.sh +0 -195
- package/.claude/skills/test-data-management/scripts/validate.sh +0 -137
- package/.claude/skills/test-design-techniques/scripts/validate.sh +0 -91
- package/.claude/skills/test-reporting-analytics/scripts/validate.sh +0 -77
- package/.claude/skills/testability-scoring/scripts/validate.sh +0 -891
- package/.claude/skills/verification-quality/scripts/validate.sh +0 -77
- package/.claude/skills/visual-testing-advanced/scripts/validate.sh +0 -77
- package/v3/assets/skills/.validation/templates/validate.template.sh +0 -1060
- package/v3/assets/skills/.validation/templates/validator-lib.sh +0 -1031
- package/v3/assets/skills/accessibility-testing/scripts/validate.sh +0 -943
- package/v3/assets/skills/api-testing-patterns/scripts/validate.sh +0 -931
- package/v3/assets/skills/aqe-v2-v3-migration/skill.md +0 -326
- package/v3/assets/skills/bug-reporting-excellence/scripts/validate.sh +0 -108
- package/v3/assets/skills/chaos-engineering-resilience/scripts/validate.sh +0 -1107
- package/v3/assets/skills/code-review-quality/scripts/validate.sh +0 -113
- package/v3/assets/skills/compatibility-testing/scripts/validate.sh +0 -605
- package/v3/assets/skills/compliance-testing/scripts/validate.sh +0 -888
- package/v3/assets/skills/contract-testing/scripts/validate.sh +0 -1033
- package/v3/assets/skills/database-testing/scripts/validate.sh +0 -1099
- package/v3/assets/skills/localization-testing/scripts/validate.sh +0 -131
- package/v3/assets/skills/mobile-testing/scripts/validate.sh +0 -127
- package/v3/assets/skills/mutation-testing/scripts/validate.sh +0 -992
- package/v3/assets/skills/n8n-expression-testing/scripts/validate.sh +0 -162
- package/v3/assets/skills/n8n-integration-testing-patterns/scripts/validate.sh +0 -104
- package/v3/assets/skills/n8n-security-testing/scripts/validate.sh +0 -120
- package/v3/assets/skills/n8n-trigger-testing-strategies/scripts/validate.sh +0 -121
- package/v3/assets/skills/n8n-workflow-testing-fundamentals/scripts/validate.sh +0 -126
- package/v3/assets/skills/pentest-validation/scripts/validate.sh +0 -402
- package/v3/assets/skills/performance-testing/scripts/validate.sh +0 -1090
- package/v3/assets/skills/qe-chaos-resilience/scripts/validate.sh +0 -401
- package/v3/assets/skills/qe-code-intelligence/scripts/validate.sh +0 -408
- package/v3/assets/skills/qe-contract-testing/scripts/validate.sh +0 -421
- package/v3/assets/skills/qe-coverage-analysis/scripts/validate.sh +0 -453
- package/v3/assets/skills/qe-defect-intelligence/scripts/validate.sh +0 -466
- package/v3/assets/skills/qe-iterative-loop/scripts/validate.sh +0 -474
- package/v3/assets/skills/qe-learning-optimization/scripts/validate.sh +0 -56
- package/v3/assets/skills/qe-quality-assessment/scripts/validate.sh +0 -352
- package/v3/assets/skills/qe-requirements-validation/scripts/validate.sh +0 -275
- package/v3/assets/skills/qe-security-compliance/scripts/validate.sh +0 -305
- package/v3/assets/skills/qe-test-execution/scripts/validate.sh +0 -323
- package/v3/assets/skills/qe-test-generation/scripts/validate.sh +0 -56
- package/v3/assets/skills/qe-visual-accessibility/scripts/validate.sh +0 -56
- package/v3/assets/skills/quality-metrics/scripts/validate.sh +0 -434
- package/v3/assets/skills/refactoring-patterns/scripts/validate.sh +0 -241
- package/v3/assets/skills/regression-testing/scripts/validate.sh +0 -130
- package/v3/assets/skills/risk-based-testing/scripts/validate.sh +0 -56
- package/v3/assets/skills/security-testing/scripts/validate.sh +0 -967
- package/v3/assets/skills/security-visual-testing/scripts/validate.sh +0 -748
- package/v3/assets/skills/shift-left-testing/scripts/validate.sh +0 -56
- package/v3/assets/skills/shift-right-testing/scripts/validate.sh +0 -56
- package/v3/assets/skills/tdd-london-chicago/scripts/validate.sh +0 -214
- package/v3/assets/skills/test-automation-strategy/scripts/validate.sh +0 -195
- package/v3/assets/skills/test-data-management/scripts/validate.sh +0 -137
- package/v3/assets/skills/test-design-techniques/scripts/validate.sh +0 -91
- package/v3/assets/skills/test-reporting-analytics/scripts/validate.sh +0 -77
- package/v3/assets/skills/verification-quality/scripts/validate.sh +0 -77
- package/v3/assets/skills/visual-testing-advanced/scripts/validate.sh +0 -77
package/v3/dist/mcp/bundle.js
CHANGED
|
@@ -19578,7 +19578,7 @@ var init_trajectory_bridge = __esm({
|
|
|
19578
19578
|
async checkClaudeFlow() {
|
|
19579
19579
|
try {
|
|
19580
19580
|
const { execSync: execSync6 } = await import("child_process");
|
|
19581
|
-
execSync6("npx @claude-flow/cli@latest hooks metrics --period 1h
|
|
19581
|
+
execSync6("npx @claude-flow/cli@latest hooks metrics --period 1h", {
|
|
19582
19582
|
encoding: "utf-8",
|
|
19583
19583
|
timeout: 5e3,
|
|
19584
19584
|
cwd: this.options.projectRoot
|
|
@@ -19598,7 +19598,7 @@ var init_trajectory_bridge = __esm({
|
|
|
19598
19598
|
const { execSync: execSync6 } = await import("child_process");
|
|
19599
19599
|
const agentArg = agent ? `--agent ${this.escapeArg(agent)}` : "";
|
|
19600
19600
|
const result = execSync6(
|
|
19601
|
-
`npx @claude-flow/cli@latest hooks intelligence trajectory-start --task ${this.escapeArg(task)} ${agentArg}
|
|
19601
|
+
`npx @claude-flow/cli@latest hooks intelligence trajectory-start --task ${this.escapeArg(task)} ${agentArg}`,
|
|
19602
19602
|
{ encoding: "utf-8", timeout: 1e4, cwd: this.options.projectRoot }
|
|
19603
19603
|
);
|
|
19604
19604
|
const match = result.match(/trajectoryId[:\s]+["']?([^"'\s,}]+)/i);
|
|
@@ -19628,7 +19628,7 @@ var init_trajectory_bridge = __esm({
|
|
|
19628
19628
|
const resultArg = result ? `--result ${this.escapeArg(result)}` : "";
|
|
19629
19629
|
const qualityArg = quality !== void 0 ? `--quality ${quality}` : "";
|
|
19630
19630
|
execSync6(
|
|
19631
|
-
`npx @claude-flow/cli@latest hooks intelligence trajectory-step --trajectory-id ${this.escapeArg(trajectoryId)} --action ${this.escapeArg(action)} ${resultArg} ${qualityArg}
|
|
19631
|
+
`npx @claude-flow/cli@latest hooks intelligence trajectory-step --trajectory-id ${this.escapeArg(trajectoryId)} --action ${this.escapeArg(action)} ${resultArg} ${qualityArg}`,
|
|
19632
19632
|
{ encoding: "utf-8", timeout: 1e4, cwd: this.options.projectRoot }
|
|
19633
19633
|
);
|
|
19634
19634
|
return;
|
|
@@ -19656,7 +19656,7 @@ var init_trajectory_bridge = __esm({
|
|
|
19656
19656
|
const { execSync: execSync6 } = await import("child_process");
|
|
19657
19657
|
const feedbackArg = feedback ? `--feedback ${this.escapeArg(feedback)}` : "";
|
|
19658
19658
|
execSync6(
|
|
19659
|
-
`npx @claude-flow/cli@latest hooks intelligence trajectory-end --trajectory-id ${this.escapeArg(trajectoryId)} --success ${success} ${feedbackArg}
|
|
19659
|
+
`npx @claude-flow/cli@latest hooks intelligence trajectory-end --trajectory-id ${this.escapeArg(trajectoryId)} --success ${success} ${feedbackArg}`,
|
|
19660
19660
|
{ encoding: "utf-8", timeout: 1e4, cwd: this.options.projectRoot }
|
|
19661
19661
|
);
|
|
19662
19662
|
} catch {
|
|
@@ -19795,7 +19795,7 @@ var init_model_router_bridge = __esm({
|
|
|
19795
19795
|
async checkClaudeFlow() {
|
|
19796
19796
|
try {
|
|
19797
19797
|
const { execSync: execSync6 } = await import("child_process");
|
|
19798
|
-
execSync6("npx @claude-flow/cli@latest hooks model-stats
|
|
19798
|
+
execSync6("npx @claude-flow/cli@latest hooks model-stats", {
|
|
19799
19799
|
encoding: "utf-8",
|
|
19800
19800
|
timeout: 5e3,
|
|
19801
19801
|
cwd: this.options.projectRoot
|
|
@@ -19813,7 +19813,7 @@ var init_model_router_bridge = __esm({
|
|
|
19813
19813
|
try {
|
|
19814
19814
|
const { execSync: execSync6 } = await import("child_process");
|
|
19815
19815
|
const result = execSync6(
|
|
19816
|
-
`npx @claude-flow/cli@latest hooks model-route --task ${this.escapeArg(task)}
|
|
19816
|
+
`npx @claude-flow/cli@latest hooks model-route --task ${this.escapeArg(task)}`,
|
|
19817
19817
|
{ encoding: "utf-8", timeout: 1e4, cwd: this.options.projectRoot }
|
|
19818
19818
|
);
|
|
19819
19819
|
const modelMatch = result.match(/model[:\s]+["']?(haiku|sonnet|opus)/i);
|
|
@@ -19844,7 +19844,7 @@ var init_model_router_bridge = __esm({
|
|
|
19844
19844
|
try {
|
|
19845
19845
|
const { execSync: execSync6 } = await import("child_process");
|
|
19846
19846
|
execSync6(
|
|
19847
|
-
`npx @claude-flow/cli@latest hooks model-outcome --task ${this.escapeArg(outcome.task)} --model ${outcome.model} --outcome ${outcome.outcome}
|
|
19847
|
+
`npx @claude-flow/cli@latest hooks model-outcome --task ${this.escapeArg(outcome.task)} --model ${outcome.model} --outcome ${outcome.outcome}`,
|
|
19848
19848
|
{ encoding: "utf-8", timeout: 1e4, cwd: this.options.projectRoot }
|
|
19849
19849
|
);
|
|
19850
19850
|
} catch (error) {
|
|
@@ -19959,7 +19959,7 @@ var init_pretrain_bridge = __esm({
|
|
|
19959
19959
|
async checkClaudeFlow() {
|
|
19960
19960
|
try {
|
|
19961
19961
|
const { execSync: execSync6 } = await import("child_process");
|
|
19962
|
-
execSync6("npx @claude-flow/cli@latest hooks pretrain --help
|
|
19962
|
+
execSync6("npx @claude-flow/cli@latest hooks pretrain --help", {
|
|
19963
19963
|
encoding: "utf-8",
|
|
19964
19964
|
timeout: 5e3,
|
|
19965
19965
|
cwd: this.options.projectRoot
|
|
@@ -19983,7 +19983,7 @@ var init_pretrain_bridge = __esm({
|
|
|
19983
19983
|
try {
|
|
19984
19984
|
const { execSync: execSync6 } = await import("child_process");
|
|
19985
19985
|
const result = execSync6(
|
|
19986
|
-
`npx @claude-flow/cli@latest hooks pretrain --path ${this.escapeArg(targetPath)} --depth ${depth}
|
|
19986
|
+
`npx @claude-flow/cli@latest hooks pretrain --path ${this.escapeArg(targetPath)} --depth ${depth}`,
|
|
19987
19987
|
{ encoding: "utf-8", timeout: 12e4, cwd: this.options.projectRoot }
|
|
19988
19988
|
);
|
|
19989
19989
|
try {
|
|
@@ -20018,7 +20018,7 @@ var init_pretrain_bridge = __esm({
|
|
|
20018
20018
|
try {
|
|
20019
20019
|
const { execSync: execSync6 } = await import("child_process");
|
|
20020
20020
|
const result = execSync6(
|
|
20021
|
-
`npx @claude-flow/cli@latest hooks build-agents --format ${format}
|
|
20021
|
+
`npx @claude-flow/cli@latest hooks build-agents --format ${format}`,
|
|
20022
20022
|
{ encoding: "utf-8", timeout: 6e4, cwd: this.options.projectRoot }
|
|
20023
20023
|
);
|
|
20024
20024
|
try {
|
|
@@ -20041,7 +20041,7 @@ var init_pretrain_bridge = __esm({
|
|
|
20041
20041
|
try {
|
|
20042
20042
|
const { execSync: execSync6 } = await import("child_process");
|
|
20043
20043
|
const result = execSync6(
|
|
20044
|
-
`npx @claude-flow/cli@latest hooks transfer --source-path ${this.escapeArg(sourcePath)} --min-confidence ${minConfidence}
|
|
20044
|
+
`npx @claude-flow/cli@latest hooks transfer --source-path ${this.escapeArg(sourcePath)} --min-confidence ${minConfidence}`,
|
|
20045
20045
|
{ encoding: "utf-8", timeout: 6e4, cwd: this.options.projectRoot }
|
|
20046
20046
|
);
|
|
20047
20047
|
const transferredMatch = result.match(/transferred[:\s]+(\d+)/i);
|
|
@@ -29930,6 +29930,9 @@ var InMemoryBackend = class {
|
|
|
29930
29930
|
cleanupInterval;
|
|
29931
29931
|
async initialize() {
|
|
29932
29932
|
this.cleanupInterval = setInterval(() => this.cleanup(), MEMORY_CONSTANTS.CLEANUP_INTERVAL_MS);
|
|
29933
|
+
if (this.cleanupInterval.unref) {
|
|
29934
|
+
this.cleanupInterval.unref();
|
|
29935
|
+
}
|
|
29933
29936
|
}
|
|
29934
29937
|
async dispose() {
|
|
29935
29938
|
if (this.cleanupInterval) {
|
|
@@ -30099,6 +30102,9 @@ var HybridMemoryBackend = class {
|
|
|
30099
30102
|
() => this.cleanup(),
|
|
30100
30103
|
this.config.cleanupInterval
|
|
30101
30104
|
);
|
|
30105
|
+
if (this.cleanupInterval.unref) {
|
|
30106
|
+
this.cleanupInterval.unref();
|
|
30107
|
+
}
|
|
30102
30108
|
this.initialized = true;
|
|
30103
30109
|
console.log(`[HybridBackend] Initialized with unified memory: ${this.unifiedMemory.getDbPath()}`);
|
|
30104
30110
|
}
|
|
@@ -84341,7 +84347,7 @@ function checkTestRunners(projectPath) {
|
|
|
84341
84347
|
function countVitestTests(projectPath, config) {
|
|
84342
84348
|
try {
|
|
84343
84349
|
const output = execSync5(
|
|
84344
|
-
"npx vitest list --reporter=json
|
|
84350
|
+
"npx vitest list --reporter=json",
|
|
84345
84351
|
{
|
|
84346
84352
|
cwd: projectPath,
|
|
84347
84353
|
encoding: "utf-8",
|
|
@@ -84401,7 +84407,7 @@ function countTestsRecursive(tests) {
|
|
|
84401
84407
|
function countJestTests(projectPath, config) {
|
|
84402
84408
|
try {
|
|
84403
84409
|
const output = execSync5(
|
|
84404
|
-
"npx jest --listTests
|
|
84410
|
+
"npx jest --listTests",
|
|
84405
84411
|
{
|
|
84406
84412
|
cwd: projectPath,
|
|
84407
84413
|
encoding: "utf-8",
|
|
@@ -84427,7 +84433,7 @@ function countJestTests(projectPath, config) {
|
|
|
84427
84433
|
function countCargoTests(projectPath, config) {
|
|
84428
84434
|
try {
|
|
84429
84435
|
const output = execSync5(
|
|
84430
|
-
|
|
84436
|
+
"cargo test --list",
|
|
84431
84437
|
{
|
|
84432
84438
|
cwd: projectPath,
|
|
84433
84439
|
encoding: "utf-8",
|
|
@@ -84461,7 +84467,7 @@ function countCargoTests(projectPath, config) {
|
|
|
84461
84467
|
function countPytestTests(projectPath, config) {
|
|
84462
84468
|
try {
|
|
84463
84469
|
const output = execSync5(
|
|
84464
|
-
|
|
84470
|
+
"pytest --collect-only -q",
|
|
84465
84471
|
{
|
|
84466
84472
|
cwd: projectPath,
|
|
84467
84473
|
encoding: "utf-8",
|
|
@@ -84502,7 +84508,7 @@ function countPytestTests(projectPath, config) {
|
|
|
84502
84508
|
function countGoTests(projectPath, config) {
|
|
84503
84509
|
try {
|
|
84504
84510
|
const output = execSync5(
|
|
84505
|
-
'go test -list ".*" ./...
|
|
84511
|
+
'go test -list ".*" ./...',
|
|
84506
84512
|
{
|
|
84507
84513
|
cwd: projectPath,
|
|
84508
84514
|
encoding: "utf-8",
|
|
@@ -146239,6 +146245,1317 @@ var COHERENCE_TOOL_NAMES = {
|
|
|
146239
146245
|
COHERENCE_COLLAPSE: "qe/coherence/collapse"
|
|
146240
146246
|
};
|
|
146241
146247
|
|
|
146248
|
+
// src/mcp/tools/qx-analysis/types.ts
|
|
146249
|
+
var QXHeuristic = /* @__PURE__ */ ((QXHeuristic2) => {
|
|
146250
|
+
QXHeuristic2["PROBLEM_UNDERSTANDING"] = "H1.1-problem-understanding";
|
|
146251
|
+
QXHeuristic2["RULE_OF_THREE"] = "H1.2-rule-of-three";
|
|
146252
|
+
QXHeuristic2["PROBLEM_COMPLEXITY"] = "H1.3-problem-complexity";
|
|
146253
|
+
QXHeuristic2["USER_NEEDS_IDENTIFICATION"] = "H2.1-user-needs-identification";
|
|
146254
|
+
QXHeuristic2["USER_NEEDS_SUITABILITY"] = "H2.2-user-needs-suitability";
|
|
146255
|
+
QXHeuristic2["USER_NEEDS_VALIDATION"] = "H2.3-user-needs-validation";
|
|
146256
|
+
QXHeuristic2["BUSINESS_NEEDS_IDENTIFICATION"] = "H3.1-business-needs-identification";
|
|
146257
|
+
QXHeuristic2["USER_VS_BUSINESS_BALANCE"] = "H3.2-user-vs-business-balance";
|
|
146258
|
+
QXHeuristic2["KPI_IMPACT_ANALYSIS"] = "H3.3-kpi-impact-analysis";
|
|
146259
|
+
QXHeuristic2["ORACLE_PROBLEM_DETECTION"] = "H4.1-oracle-problem-detection";
|
|
146260
|
+
QXHeuristic2["WHAT_MUST_NOT_CHANGE"] = "H4.2-what-must-not-change";
|
|
146261
|
+
QXHeuristic2["SUPPORTING_DATA_ANALYSIS"] = "H4.3-supporting-data-analysis";
|
|
146262
|
+
QXHeuristic2["GUI_FLOW_IMPACT"] = "H5.1-gui-flow-impact";
|
|
146263
|
+
QXHeuristic2["USER_FEELINGS_IMPACT"] = "H5.2-user-feelings-impact";
|
|
146264
|
+
QXHeuristic2["CROSS_FUNCTIONAL_IMPACT"] = "H5.3-cross-functional-impact";
|
|
146265
|
+
QXHeuristic2["DATA_DEPENDENT_IMPACT"] = "H5.4-data-dependent-impact";
|
|
146266
|
+
QXHeuristic2["COMPETITIVE_ANALYSIS"] = "H6.1-competitive-analysis";
|
|
146267
|
+
QXHeuristic2["DOMAIN_INSPIRATION"] = "H6.2-domain-inspiration";
|
|
146268
|
+
QXHeuristic2["INNOVATIVE_SOLUTIONS"] = "H6.3-innovative-solutions";
|
|
146269
|
+
QXHeuristic2["EXACTNESS_AND_CLARITY"] = "H7.1-exactness-and-clarity";
|
|
146270
|
+
QXHeuristic2["INTUITIVE_DESIGN"] = "H7.2-intuitive-design";
|
|
146271
|
+
QXHeuristic2["COUNTER_INTUITIVE_DESIGN"] = "H7.3-counter-intuitive-design";
|
|
146272
|
+
QXHeuristic2["CONSISTENCY_ANALYSIS"] = "H7.4-consistency-analysis";
|
|
146273
|
+
return QXHeuristic2;
|
|
146274
|
+
})(QXHeuristic || {});
|
|
146275
|
+
|
|
146276
|
+
// src/mcp/tools/qx-analysis/heuristics-engine.ts
|
|
146277
|
+
var QXHeuristicsEngine = class {
|
|
146278
|
+
enabledHeuristics;
|
|
146279
|
+
minConfidence;
|
|
146280
|
+
constructor(options = {}) {
|
|
146281
|
+
this.enabledHeuristics = options.enabledHeuristics || Object.values(QXHeuristic);
|
|
146282
|
+
this.minConfidence = options.minConfidence || 0.7;
|
|
146283
|
+
}
|
|
146284
|
+
/**
|
|
146285
|
+
* Apply all enabled heuristics
|
|
146286
|
+
*/
|
|
146287
|
+
async applyAll(context, problemAnalysis, userNeeds, businessNeeds) {
|
|
146288
|
+
const results = [];
|
|
146289
|
+
for (const heuristic of this.enabledHeuristics) {
|
|
146290
|
+
const result = await this.apply(heuristic, context, problemAnalysis, userNeeds, businessNeeds);
|
|
146291
|
+
results.push(result);
|
|
146292
|
+
}
|
|
146293
|
+
return results;
|
|
146294
|
+
}
|
|
146295
|
+
/**
|
|
146296
|
+
* Apply a specific heuristic
|
|
146297
|
+
*/
|
|
146298
|
+
async apply(heuristic, context, problemAnalysis, userNeeds, businessNeeds) {
|
|
146299
|
+
const category = this.getHeuristicCategory(heuristic);
|
|
146300
|
+
const findings = [];
|
|
146301
|
+
const issues = [];
|
|
146302
|
+
const recommendations = [];
|
|
146303
|
+
let score = 75;
|
|
146304
|
+
switch (heuristic) {
|
|
146305
|
+
// ========== Design Quality Heuristics (H7.x) ==========
|
|
146306
|
+
case "H7.4-consistency-analysis" /* CONSISTENCY_ANALYSIS */:
|
|
146307
|
+
if (context.domMetrics?.semanticStructure?.hasHeader && context.domMetrics?.semanticStructure?.hasFooter) {
|
|
146308
|
+
score = 85;
|
|
146309
|
+
findings.push("Consistent page structure with header and footer");
|
|
146310
|
+
} else {
|
|
146311
|
+
score = 60;
|
|
146312
|
+
recommendations.push("Add consistent header/footer structure");
|
|
146313
|
+
}
|
|
146314
|
+
break;
|
|
146315
|
+
case "H7.2-intuitive-design" /* INTUITIVE_DESIGN */:
|
|
146316
|
+
const hasNav = context.domMetrics?.semanticStructure?.hasNav;
|
|
146317
|
+
const focusable = context.accessibility?.focusableElementsCount || 0;
|
|
146318
|
+
if (hasNav && focusable > 10) {
|
|
146319
|
+
score = 82;
|
|
146320
|
+
findings.push("Intuitive navigation and interaction design");
|
|
146321
|
+
} else {
|
|
146322
|
+
score = 55;
|
|
146323
|
+
issues.push({ description: "Navigation or interaction patterns unclear", severity: "medium" });
|
|
146324
|
+
}
|
|
146325
|
+
break;
|
|
146326
|
+
case "H7.1-exactness-and-clarity" /* EXACTNESS_AND_CLARITY */:
|
|
146327
|
+
score = 70;
|
|
146328
|
+
const hasSemanticStructure = context.domMetrics?.semanticStructure;
|
|
146329
|
+
const structureScore = [
|
|
146330
|
+
hasSemanticStructure?.hasHeader,
|
|
146331
|
+
hasSemanticStructure?.hasMain,
|
|
146332
|
+
hasSemanticStructure?.hasNav,
|
|
146333
|
+
hasSemanticStructure?.hasFooter
|
|
146334
|
+
].filter(Boolean).length;
|
|
146335
|
+
score = 50 + structureScore * 10;
|
|
146336
|
+
if (structureScore >= 3) {
|
|
146337
|
+
findings.push("Strong visual hierarchy with semantic HTML elements");
|
|
146338
|
+
} else if (structureScore >= 2) {
|
|
146339
|
+
findings.push("Moderate visual hierarchy - some semantic elements present");
|
|
146340
|
+
recommendations.push("Add more semantic HTML5 elements for clarity");
|
|
146341
|
+
} else {
|
|
146342
|
+
issues.push({ description: "Weak visual hierarchy - missing semantic structure", severity: "high" });
|
|
146343
|
+
recommendations.push("Implement semantic HTML5: header, nav, main, footer");
|
|
146344
|
+
}
|
|
146345
|
+
if (context.metadata?.description && context.metadata.description.length > 20) {
|
|
146346
|
+
score += 10;
|
|
146347
|
+
findings.push("Page has descriptive metadata");
|
|
146348
|
+
}
|
|
146349
|
+
break;
|
|
146350
|
+
case "H7.3-counter-intuitive-design" /* COUNTER_INTUITIVE_DESIGN */:
|
|
146351
|
+
score = 85;
|
|
146352
|
+
const confusingNav = !context.domMetrics?.semanticStructure?.hasNav && (context.domMetrics?.interactiveElements || 0) > 10;
|
|
146353
|
+
const poorStructure = !context.domMetrics?.semanticStructure?.hasHeader && !context.domMetrics?.semanticStructure?.hasFooter;
|
|
146354
|
+
if (confusingNav) {
|
|
146355
|
+
score = 45;
|
|
146356
|
+
issues.push({ description: "Navigation structure may be counter-intuitive", severity: "high" });
|
|
146357
|
+
recommendations.push("Add semantic navigation elements");
|
|
146358
|
+
}
|
|
146359
|
+
if (poorStructure) {
|
|
146360
|
+
score -= 15;
|
|
146361
|
+
issues.push({ description: "Page structure lacks expected header/footer", severity: "medium" });
|
|
146362
|
+
}
|
|
146363
|
+
if (score > 75) {
|
|
146364
|
+
findings.push("No counter-intuitive design patterns detected");
|
|
146365
|
+
}
|
|
146366
|
+
break;
|
|
146367
|
+
// ========== Impact Analysis Heuristics (H5.x) ==========
|
|
146368
|
+
case "H5.2-user-feelings-impact" /* USER_FEELINGS_IMPACT */:
|
|
146369
|
+
const altCoverage = context.accessibility?.altTextsCoverage || 0;
|
|
146370
|
+
const loadTime = context.performance?.loadTime || 0;
|
|
146371
|
+
const ariaLabels = context.accessibility?.ariaLabelsCount || 0;
|
|
146372
|
+
const focusableElements = context.accessibility?.focusableElementsCount || 0;
|
|
146373
|
+
score = 60;
|
|
146374
|
+
if (altCoverage >= 90) {
|
|
146375
|
+
score += 20;
|
|
146376
|
+
findings.push("Excellent accessibility (90%+ alt coverage) creates inclusive, positive experience");
|
|
146377
|
+
} else if (altCoverage >= 70) {
|
|
146378
|
+
score += 12;
|
|
146379
|
+
findings.push("Good accessibility creates generally positive user feelings");
|
|
146380
|
+
} else if (altCoverage < 50) {
|
|
146381
|
+
score -= 15;
|
|
146382
|
+
issues.push({
|
|
146383
|
+
description: "Poor accessibility (<50% alt coverage) frustrates users with disabilities",
|
|
146384
|
+
severity: "high"
|
|
146385
|
+
});
|
|
146386
|
+
recommendations.push("Improve alt text coverage to at least 80% for better accessibility");
|
|
146387
|
+
}
|
|
146388
|
+
if (ariaLabels > 5) {
|
|
146389
|
+
score += 8;
|
|
146390
|
+
findings.push("Strong ARIA labeling enhances screen reader experience");
|
|
146391
|
+
}
|
|
146392
|
+
if (loadTime < 1500) {
|
|
146393
|
+
score += 15;
|
|
146394
|
+
findings.push("Very fast load time (<1.5s) delights users");
|
|
146395
|
+
} else if (loadTime < 2500) {
|
|
146396
|
+
score += 8;
|
|
146397
|
+
findings.push("Fast load time enhances user satisfaction");
|
|
146398
|
+
} else if (loadTime > 4e3) {
|
|
146399
|
+
score -= 20;
|
|
146400
|
+
issues.push({ description: "Very slow load time (>4s) causes significant frustration", severity: "critical" });
|
|
146401
|
+
recommendations.push("Optimize page load time - target under 2.5 seconds");
|
|
146402
|
+
} else if (loadTime > 3e3) {
|
|
146403
|
+
score -= 12;
|
|
146404
|
+
issues.push({ description: "Slow load time causes user frustration", severity: "high" });
|
|
146405
|
+
}
|
|
146406
|
+
if (context.errorIndicators?.hasErrorMessages) {
|
|
146407
|
+
score -= 12;
|
|
146408
|
+
issues.push({ description: "Visible errors reduce user confidence and satisfaction", severity: "high" });
|
|
146409
|
+
recommendations.push("Review and fix visible error messages");
|
|
146410
|
+
}
|
|
146411
|
+
if (focusableElements > 20) {
|
|
146412
|
+
score += 5;
|
|
146413
|
+
findings.push("Rich interactive elements provide user control and engagement");
|
|
146414
|
+
} else if (focusableElements < 5) {
|
|
146415
|
+
score -= 8;
|
|
146416
|
+
issues.push({ description: "Limited interactivity may feel restrictive", severity: "medium" });
|
|
146417
|
+
}
|
|
146418
|
+
score = Math.max(20, Math.min(100, score));
|
|
146419
|
+
break;
|
|
146420
|
+
case "H5.1-gui-flow-impact" /* GUI_FLOW_IMPACT */:
|
|
146421
|
+
const interactiveElements = context.domMetrics?.interactiveElements || 0;
|
|
146422
|
+
const forms = context.domMetrics?.forms || 0;
|
|
146423
|
+
if (interactiveElements > 20) {
|
|
146424
|
+
score = 75;
|
|
146425
|
+
findings.push(`${interactiveElements} interactive elements provide user control`);
|
|
146426
|
+
}
|
|
146427
|
+
if (forms > 0) {
|
|
146428
|
+
findings.push(`${forms} forms impact user input flows`);
|
|
146429
|
+
score = Math.min(100, score + 10);
|
|
146430
|
+
}
|
|
146431
|
+
if (interactiveElements === 0) {
|
|
146432
|
+
score = 30;
|
|
146433
|
+
issues.push({ description: "Limited user interaction capability", severity: "high" });
|
|
146434
|
+
}
|
|
146435
|
+
break;
|
|
146436
|
+
case "H5.3-cross-functional-impact" /* CROSS_FUNCTIONAL_IMPACT */:
|
|
146437
|
+
score = 70;
|
|
146438
|
+
if (context.accessibility && (context.accessibility.altTextsCoverage || 0) < 100) {
|
|
146439
|
+
findings.push("Content team needed for alt text creation");
|
|
146440
|
+
}
|
|
146441
|
+
if (context.performance && (context.performance.loadTime || 0) > 2e3) {
|
|
146442
|
+
findings.push("Engineering team needed for performance optimization");
|
|
146443
|
+
}
|
|
146444
|
+
if (problemAnalysis.complexity === "complex") {
|
|
146445
|
+
findings.push("QA team needed for comprehensive testing");
|
|
146446
|
+
}
|
|
146447
|
+
score = 70 + findings.length * 5;
|
|
146448
|
+
break;
|
|
146449
|
+
case "H5.4-data-dependent-impact" /* DATA_DEPENDENT_IMPACT */:
|
|
146450
|
+
if (context.domMetrics?.forms && context.domMetrics.forms > 0) {
|
|
146451
|
+
score = 75;
|
|
146452
|
+
findings.push(`${context.domMetrics.forms} forms depend on backend data processing`);
|
|
146453
|
+
} else {
|
|
146454
|
+
score = 50;
|
|
146455
|
+
findings.push("Limited data-dependent features");
|
|
146456
|
+
}
|
|
146457
|
+
break;
|
|
146458
|
+
// ========== Problem Analysis Heuristics (H1.x) ==========
|
|
146459
|
+
case "H1.1-problem-understanding" /* PROBLEM_UNDERSTANDING */:
|
|
146460
|
+
score = problemAnalysis.clarityScore;
|
|
146461
|
+
if (problemAnalysis.clarityScore > 80) {
|
|
146462
|
+
findings.push("Problem is well-defined");
|
|
146463
|
+
} else {
|
|
146464
|
+
issues.push({ description: "Problem clarity needs improvement", severity: "medium" });
|
|
146465
|
+
}
|
|
146466
|
+
findings.push(...problemAnalysis.breakdown);
|
|
146467
|
+
break;
|
|
146468
|
+
case "H1.2-rule-of-three" /* RULE_OF_THREE */:
|
|
146469
|
+
score = problemAnalysis.potentialFailures.length >= 3 ? 85 : 60;
|
|
146470
|
+
findings.push(`${problemAnalysis.potentialFailures.length} potential failure modes identified`);
|
|
146471
|
+
if (problemAnalysis.potentialFailures.length < 3) {
|
|
146472
|
+
recommendations.push("Identify at least 3 potential failure modes (Rule of Three)");
|
|
146473
|
+
}
|
|
146474
|
+
break;
|
|
146475
|
+
case "H1.3-problem-complexity" /* PROBLEM_COMPLEXITY */:
|
|
146476
|
+
score = problemAnalysis.complexity === "simple" ? 90 : problemAnalysis.complexity === "moderate" ? 75 : 60;
|
|
146477
|
+
findings.push(`Problem complexity: ${problemAnalysis.complexity}`);
|
|
146478
|
+
break;
|
|
146479
|
+
// ========== User Needs Heuristics (H2.x) ==========
|
|
146480
|
+
case "H2.1-user-needs-identification" /* USER_NEEDS_IDENTIFICATION */:
|
|
146481
|
+
score = userNeeds.alignmentScore;
|
|
146482
|
+
findings.push(`${userNeeds.needs.length} user needs identified`);
|
|
146483
|
+
const mustHave = userNeeds.needs.filter((n61) => n61.priority === "must-have").length;
|
|
146484
|
+
findings.push(`${mustHave} must-have features`);
|
|
146485
|
+
if (userNeeds.challenges.length > 0) {
|
|
146486
|
+
issues.push({ description: `${userNeeds.challenges.length} user need challenges found`, severity: "medium" });
|
|
146487
|
+
}
|
|
146488
|
+
break;
|
|
146489
|
+
case "H2.2-user-needs-suitability" /* USER_NEEDS_SUITABILITY */:
|
|
146490
|
+
score = userNeeds.suitability === "excellent" ? 95 : userNeeds.suitability === "good" ? 80 : userNeeds.suitability === "adequate" ? 65 : 45;
|
|
146491
|
+
findings.push(`User needs suitability: ${userNeeds.suitability}`);
|
|
146492
|
+
break;
|
|
146493
|
+
case "H2.3-user-needs-validation" /* USER_NEEDS_VALIDATION */:
|
|
146494
|
+
const addressedNeeds = userNeeds.needs.filter((n61) => n61.addressed).length;
|
|
146495
|
+
score = userNeeds.needs.length > 0 ? addressedNeeds / userNeeds.needs.length * 100 : 50;
|
|
146496
|
+
findings.push(`${addressedNeeds}/${userNeeds.needs.length} needs validated and addressed`);
|
|
146497
|
+
break;
|
|
146498
|
+
// ========== Business Needs Heuristics (H3.x) ==========
|
|
146499
|
+
case "H3.1-business-needs-identification" /* BUSINESS_NEEDS_IDENTIFICATION */:
|
|
146500
|
+
score = businessNeeds.alignmentScore;
|
|
146501
|
+
findings.push(`Primary goal: ${businessNeeds.primaryGoal}`);
|
|
146502
|
+
findings.push(`${businessNeeds.kpisAffected.length} KPIs affected`);
|
|
146503
|
+
findings.push(`${businessNeeds.crossTeamImpact.length} cross-team impacts`);
|
|
146504
|
+
break;
|
|
146505
|
+
case "H3.2-user-vs-business-balance" /* USER_VS_BUSINESS_BALANCE */:
|
|
146506
|
+
const balanceScore = 100 - Math.abs(userNeeds.alignmentScore - businessNeeds.alignmentScore);
|
|
146507
|
+
score = balanceScore;
|
|
146508
|
+
if (balanceScore > 80) {
|
|
146509
|
+
findings.push("Good balance between user and business needs");
|
|
146510
|
+
} else {
|
|
146511
|
+
issues.push({ description: "Imbalance between user and business priorities", severity: "medium" });
|
|
146512
|
+
recommendations.push("Align user and business objectives more closely");
|
|
146513
|
+
}
|
|
146514
|
+
break;
|
|
146515
|
+
case "H3.3-kpi-impact-analysis" /* KPI_IMPACT_ANALYSIS */:
|
|
146516
|
+
score = businessNeeds.impactsKPIs ? 85 : 50;
|
|
146517
|
+
findings.push(`KPIs impacted: ${businessNeeds.kpisAffected.join(", ")}`);
|
|
146518
|
+
if (businessNeeds.compromisesUX) {
|
|
146519
|
+
issues.push({ description: "Business ease compromises user experience", severity: "high" });
|
|
146520
|
+
score -= 20;
|
|
146521
|
+
}
|
|
146522
|
+
break;
|
|
146523
|
+
// ========== Balance / Oracle Heuristics (H4.x) ==========
|
|
146524
|
+
case "H4.1-oracle-problem-detection" /* ORACLE_PROBLEM_DETECTION */:
|
|
146525
|
+
score = 75;
|
|
146526
|
+
findings.push("Oracle problem detection capability active");
|
|
146527
|
+
break;
|
|
146528
|
+
case "H4.2-what-must-not-change" /* WHAT_MUST_NOT_CHANGE */:
|
|
146529
|
+
score = 80;
|
|
146530
|
+
if (context.domMetrics?.semanticStructure?.hasMain) {
|
|
146531
|
+
findings.push("Main content structure is immutable");
|
|
146532
|
+
}
|
|
146533
|
+
if (context.accessibility && (context.accessibility.focusableElementsCount || 0) > 0) {
|
|
146534
|
+
findings.push("Keyboard navigation support must be maintained");
|
|
146535
|
+
}
|
|
146536
|
+
break;
|
|
146537
|
+
case "H4.3-supporting-data-analysis" /* SUPPORTING_DATA_ANALYSIS */:
|
|
146538
|
+
score = 75;
|
|
146539
|
+
const hasData = (context.domMetrics?.forms || 0) > 0 || (context.domMetrics?.interactiveElements || 0) > 20;
|
|
146540
|
+
if (hasData) {
|
|
146541
|
+
score = 82;
|
|
146542
|
+
findings.push("Sufficient data points for informed decision-making");
|
|
146543
|
+
} else {
|
|
146544
|
+
score = 60;
|
|
146545
|
+
issues.push({ description: "Limited data for comprehensive analysis", severity: "medium" });
|
|
146546
|
+
recommendations.push("Collect more user interaction data");
|
|
146547
|
+
}
|
|
146548
|
+
break;
|
|
146549
|
+
// ========== Creativity Heuristics (H6.x) ==========
|
|
146550
|
+
case "H6.1-competitive-analysis" /* COMPETITIVE_ANALYSIS */:
|
|
146551
|
+
score = 70;
|
|
146552
|
+
findings.push("Competitive analysis capability available");
|
|
146553
|
+
if (context.domMetrics?.semanticStructure?.hasNav && context.domMetrics?.interactiveElements && context.domMetrics.interactiveElements > 15) {
|
|
146554
|
+
score = 78;
|
|
146555
|
+
findings.push("Navigation and interaction patterns follow industry standards");
|
|
146556
|
+
} else {
|
|
146557
|
+
recommendations.push("Compare interaction patterns with leading competitors");
|
|
146558
|
+
}
|
|
146559
|
+
break;
|
|
146560
|
+
case "H6.2-domain-inspiration" /* DOMAIN_INSPIRATION */:
|
|
146561
|
+
score = 72;
|
|
146562
|
+
const hasModernElements = context.accessibility && (context.accessibility.ariaLabelsCount || 0) > 0;
|
|
146563
|
+
if (hasModernElements) {
|
|
146564
|
+
score = 80;
|
|
146565
|
+
findings.push("Modern accessibility patterns show domain inspiration");
|
|
146566
|
+
} else {
|
|
146567
|
+
recommendations.push("Research domain-specific design patterns and best practices");
|
|
146568
|
+
}
|
|
146569
|
+
break;
|
|
146570
|
+
case "H6.3-innovative-solutions" /* INNOVATIVE_SOLUTIONS */:
|
|
146571
|
+
score = 65;
|
|
146572
|
+
const hasAdvancedFeatures = (context.accessibility?.landmarkRoles || 0) > 3;
|
|
146573
|
+
if (hasAdvancedFeatures) {
|
|
146574
|
+
score = 75;
|
|
146575
|
+
findings.push("Advanced accessibility features show innovative thinking");
|
|
146576
|
+
} else {
|
|
146577
|
+
recommendations.push("Explore innovative UX patterns to differentiate experience");
|
|
146578
|
+
}
|
|
146579
|
+
break;
|
|
146580
|
+
default:
|
|
146581
|
+
if (category === "user-needs") {
|
|
146582
|
+
score = userNeeds.alignmentScore;
|
|
146583
|
+
} else if (category === "business-needs") {
|
|
146584
|
+
score = businessNeeds.alignmentScore;
|
|
146585
|
+
} else if (category === "problem") {
|
|
146586
|
+
score = problemAnalysis.clarityScore;
|
|
146587
|
+
}
|
|
146588
|
+
break;
|
|
146589
|
+
}
|
|
146590
|
+
return {
|
|
146591
|
+
id: heuristic,
|
|
146592
|
+
name: this.getHeuristicName(heuristic),
|
|
146593
|
+
category,
|
|
146594
|
+
applied: true,
|
|
146595
|
+
score: Math.min(100, Math.max(0, score)),
|
|
146596
|
+
findings,
|
|
146597
|
+
issues,
|
|
146598
|
+
recommendations
|
|
146599
|
+
};
|
|
146600
|
+
}
|
|
146601
|
+
/**
|
|
146602
|
+
* Get the category for a heuristic
|
|
146603
|
+
*/
|
|
146604
|
+
getHeuristicCategory(heuristic) {
|
|
146605
|
+
if (heuristic.includes("problem")) return "problem";
|
|
146606
|
+
if (heuristic.includes("user-needs") || heuristic.includes("user-vs")) return "user-needs";
|
|
146607
|
+
if (heuristic.includes("business")) return "business-needs";
|
|
146608
|
+
if (heuristic.includes("oracle") || heuristic.includes("balance") || heuristic.includes("what-must") || heuristic.includes("supporting-data"))
|
|
146609
|
+
return "balance";
|
|
146610
|
+
if (heuristic.includes("impact") || heuristic.includes("gui-flow") || heuristic.includes("feelings") || heuristic.includes("cross-functional") || heuristic.includes("data-dependent"))
|
|
146611
|
+
return "impact";
|
|
146612
|
+
if (heuristic.includes("competitive") || heuristic.includes("inspiration") || heuristic.includes("innovative"))
|
|
146613
|
+
return "creativity";
|
|
146614
|
+
return "design";
|
|
146615
|
+
}
|
|
146616
|
+
/**
|
|
146617
|
+
* Get human-readable name for a heuristic
|
|
146618
|
+
*/
|
|
146619
|
+
getHeuristicName(heuristic) {
|
|
146620
|
+
const names = {
|
|
146621
|
+
["H1.1-problem-understanding" /* PROBLEM_UNDERSTANDING */]: "Problem Understanding",
|
|
146622
|
+
["H1.2-rule-of-three" /* RULE_OF_THREE */]: "Rule of Three",
|
|
146623
|
+
["H1.3-problem-complexity" /* PROBLEM_COMPLEXITY */]: "Problem Complexity",
|
|
146624
|
+
["H2.1-user-needs-identification" /* USER_NEEDS_IDENTIFICATION */]: "User Needs Identification",
|
|
146625
|
+
["H2.2-user-needs-suitability" /* USER_NEEDS_SUITABILITY */]: "User Needs Suitability",
|
|
146626
|
+
["H2.3-user-needs-validation" /* USER_NEEDS_VALIDATION */]: "User Needs Validation",
|
|
146627
|
+
["H3.1-business-needs-identification" /* BUSINESS_NEEDS_IDENTIFICATION */]: "Business Needs Identification",
|
|
146628
|
+
["H3.2-user-vs-business-balance" /* USER_VS_BUSINESS_BALANCE */]: "User vs Business Balance",
|
|
146629
|
+
["H3.3-kpi-impact-analysis" /* KPI_IMPACT_ANALYSIS */]: "KPI Impact Analysis",
|
|
146630
|
+
["H4.1-oracle-problem-detection" /* ORACLE_PROBLEM_DETECTION */]: "Oracle Problem Detection",
|
|
146631
|
+
["H4.2-what-must-not-change" /* WHAT_MUST_NOT_CHANGE */]: "What Must Not Change",
|
|
146632
|
+
["H4.3-supporting-data-analysis" /* SUPPORTING_DATA_ANALYSIS */]: "Supporting Data Analysis",
|
|
146633
|
+
["H5.1-gui-flow-impact" /* GUI_FLOW_IMPACT */]: "GUI Flow Impact",
|
|
146634
|
+
["H5.2-user-feelings-impact" /* USER_FEELINGS_IMPACT */]: "User Feelings Impact",
|
|
146635
|
+
["H5.3-cross-functional-impact" /* CROSS_FUNCTIONAL_IMPACT */]: "Cross-Functional Impact",
|
|
146636
|
+
["H5.4-data-dependent-impact" /* DATA_DEPENDENT_IMPACT */]: "Data-Dependent Impact",
|
|
146637
|
+
["H6.1-competitive-analysis" /* COMPETITIVE_ANALYSIS */]: "Competitive Analysis",
|
|
146638
|
+
["H6.2-domain-inspiration" /* DOMAIN_INSPIRATION */]: "Domain Inspiration",
|
|
146639
|
+
["H6.3-innovative-solutions" /* INNOVATIVE_SOLUTIONS */]: "Innovative Solutions",
|
|
146640
|
+
["H7.1-exactness-and-clarity" /* EXACTNESS_AND_CLARITY */]: "Exactness & Clarity",
|
|
146641
|
+
["H7.2-intuitive-design" /* INTUITIVE_DESIGN */]: "Intuitive Design",
|
|
146642
|
+
["H7.3-counter-intuitive-design" /* COUNTER_INTUITIVE_DESIGN */]: "Counter-Intuitive Design",
|
|
146643
|
+
["H7.4-consistency-analysis" /* CONSISTENCY_ANALYSIS */]: "Consistency Analysis"
|
|
146644
|
+
};
|
|
146645
|
+
return names[heuristic] || heuristic;
|
|
146646
|
+
}
|
|
146647
|
+
};
|
|
146648
|
+
|
|
146649
|
+
// src/mcp/tools/qx-analysis/oracle-detector.ts
|
|
146650
|
+
var OracleDetector = class {
|
|
146651
|
+
minSeverity;
|
|
146652
|
+
constructor(minSeverity = "medium") {
|
|
146653
|
+
this.minSeverity = minSeverity;
|
|
146654
|
+
}
|
|
146655
|
+
/**
|
|
146656
|
+
* Detect oracle problems from context and analysis
|
|
146657
|
+
*/
|
|
146658
|
+
detect(context, userNeeds, businessNeeds) {
|
|
146659
|
+
const problems = [];
|
|
146660
|
+
if (Math.abs(userNeeds.alignmentScore - businessNeeds.alignmentScore) > 20) {
|
|
146661
|
+
problems.push({
|
|
146662
|
+
type: "user-vs-business",
|
|
146663
|
+
description: "Significant gap between user needs and business objectives",
|
|
146664
|
+
severity: "high",
|
|
146665
|
+
stakeholders: ["Users", "Business"],
|
|
146666
|
+
resolutionApproach: [
|
|
146667
|
+
"Gather supporting data from both perspectives",
|
|
146668
|
+
"Facilitate discussion between stakeholders",
|
|
146669
|
+
"Find compromise solutions that address both needs"
|
|
146670
|
+
]
|
|
146671
|
+
});
|
|
146672
|
+
}
|
|
146673
|
+
if (userNeeds.challenges.length > 0 || businessNeeds.compromisesUX) {
|
|
146674
|
+
problems.push({
|
|
146675
|
+
type: "unclear-criteria",
|
|
146676
|
+
description: "Quality criteria unclear due to conflicting information",
|
|
146677
|
+
severity: "medium",
|
|
146678
|
+
missingInfo: userNeeds.challenges,
|
|
146679
|
+
resolutionApproach: [
|
|
146680
|
+
"Collect missing information from stakeholders",
|
|
146681
|
+
"Define clear acceptance criteria"
|
|
146682
|
+
]
|
|
146683
|
+
});
|
|
146684
|
+
}
|
|
146685
|
+
const titleLower = (context.title || "").toLowerCase();
|
|
146686
|
+
const descLower = (context.metadata?.description || "").toLowerCase();
|
|
146687
|
+
if (titleLower.includes("hotel") || titleLower.includes("booking") || titleLower.includes("travel") || titleLower.includes("shop") || titleLower.includes("store") || descLower.includes("book")) {
|
|
146688
|
+
if (businessNeeds.kpisAffected.some(
|
|
146689
|
+
(k68) => k68.toLowerCase().includes("conversion") || k68.toLowerCase().includes("engagement")
|
|
146690
|
+
)) {
|
|
146691
|
+
problems.push({
|
|
146692
|
+
type: "user-vs-business",
|
|
146693
|
+
description: "Potential conflict between conversion optimization (business) and user experience quality (user trust)",
|
|
146694
|
+
severity: "medium",
|
|
146695
|
+
stakeholders: ["Marketing", "Product", "Users"],
|
|
146696
|
+
resolutionApproach: [
|
|
146697
|
+
"A/B test aggressive vs. subtle conversion tactics",
|
|
146698
|
+
"Measure both conversion rate and user satisfaction metrics",
|
|
146699
|
+
"Balance urgency messaging with transparent communication"
|
|
146700
|
+
]
|
|
146701
|
+
});
|
|
146702
|
+
}
|
|
146703
|
+
problems.push({
|
|
146704
|
+
type: "unclear-criteria",
|
|
146705
|
+
description: "Unclear criteria for price display timing - when to show fees, taxes, and final price",
|
|
146706
|
+
severity: "medium",
|
|
146707
|
+
stakeholders: ["Users", "Legal", "Business"],
|
|
146708
|
+
resolutionApproach: [
|
|
146709
|
+
"Define regulatory compliance requirements for price display",
|
|
146710
|
+
"Balance business desire for competitive base pricing vs user need for full price transparency",
|
|
146711
|
+
"Establish clear standards for fee disclosure timing"
|
|
146712
|
+
]
|
|
146713
|
+
});
|
|
146714
|
+
}
|
|
146715
|
+
if (titleLower.includes("blog") || titleLower.includes("article") || titleLower.includes("news") || titleLower.includes("magazine") || titleLower.includes("testing")) {
|
|
146716
|
+
problems.push({
|
|
146717
|
+
type: "user-vs-business",
|
|
146718
|
+
description: "Content depth (user need) vs. publication frequency (business engagement goals) trade-off",
|
|
146719
|
+
severity: "low",
|
|
146720
|
+
stakeholders: ["Readers", "Content Team", "Editorial"],
|
|
146721
|
+
resolutionApproach: [
|
|
146722
|
+
"Define content quality standards and acceptance criteria",
|
|
146723
|
+
"Balance editorial calendar with quality thresholds",
|
|
146724
|
+
"Consider mix of in-depth and quick-read content formats"
|
|
146725
|
+
]
|
|
146726
|
+
});
|
|
146727
|
+
}
|
|
146728
|
+
if (titleLower.includes("health") || titleLower.includes("medical") || titleLower.includes("patient") || titleLower.includes("care") || titleLower.includes("nhs")) {
|
|
146729
|
+
problems.push({
|
|
146730
|
+
type: "stakeholder-conflict",
|
|
146731
|
+
description: "Healthcare compliance requirements may conflict with streamlined user experience",
|
|
146732
|
+
severity: "medium",
|
|
146733
|
+
stakeholders: ["Patients", "Healthcare Providers", "Compliance", "Legal"],
|
|
146734
|
+
resolutionApproach: [
|
|
146735
|
+
"Map regulatory requirements to UX touchpoints",
|
|
146736
|
+
"Identify where compliance can be achieved without friction",
|
|
146737
|
+
"Engage compliance team early in UX design reviews",
|
|
146738
|
+
"Document consent and data handling requirements clearly"
|
|
146739
|
+
]
|
|
146740
|
+
});
|
|
146741
|
+
if (context.accessibility && (context.accessibility.altTextsCoverage || 0) < 80) {
|
|
146742
|
+
problems.push({
|
|
146743
|
+
type: "technical-constraint",
|
|
146744
|
+
description: "Healthcare accessibility requirements not fully met - critical for patient inclusivity",
|
|
146745
|
+
severity: "high",
|
|
146746
|
+
stakeholders: ["Patients", "Accessibility Team", "Legal"],
|
|
146747
|
+
resolutionApproach: [
|
|
146748
|
+
"Prioritize WCAG 2.1 AA compliance for healthcare content",
|
|
146749
|
+
"Ensure screen reader compatibility for medical information",
|
|
146750
|
+
"Test with assistive technology users"
|
|
146751
|
+
]
|
|
146752
|
+
});
|
|
146753
|
+
}
|
|
146754
|
+
}
|
|
146755
|
+
if (titleLower.includes("bank") || titleLower.includes("finance") || titleLower.includes("payment") || titleLower.includes("money")) {
|
|
146756
|
+
problems.push({
|
|
146757
|
+
type: "stakeholder-conflict",
|
|
146758
|
+
description: "Security requirements vs user convenience - authentication friction vs fraud prevention",
|
|
146759
|
+
severity: "high",
|
|
146760
|
+
stakeholders: ["Users", "Security Team", "Product", "Compliance"],
|
|
146761
|
+
resolutionApproach: [
|
|
146762
|
+
"Implement risk-based authentication to reduce friction for trusted sessions",
|
|
146763
|
+
"Use biometrics where available for convenient yet secure access",
|
|
146764
|
+
"A/B test authentication flows for security effectiveness and user completion rates"
|
|
146765
|
+
]
|
|
146766
|
+
});
|
|
146767
|
+
}
|
|
146768
|
+
if ((context.domMetrics?.totalElements || 0) > 500 || (context.domMetrics?.interactiveElements || 0) > 50) {
|
|
146769
|
+
problems.push({
|
|
146770
|
+
type: "technical-constraint",
|
|
146771
|
+
description: "Platform technical limitations may restrict advanced UX features or accessibility enhancements",
|
|
146772
|
+
severity: "low",
|
|
146773
|
+
stakeholders: ["Development", "Product", "Users"],
|
|
146774
|
+
resolutionApproach: [
|
|
146775
|
+
"Evaluate platform capabilities and constraints",
|
|
146776
|
+
"Prioritize features based on user impact vs. implementation complexity",
|
|
146777
|
+
"Consider gradual enhancement approach"
|
|
146778
|
+
]
|
|
146779
|
+
});
|
|
146780
|
+
}
|
|
146781
|
+
if (context.performance && (context.performance.loadTime || 0) > 3e3) {
|
|
146782
|
+
problems.push({
|
|
146783
|
+
type: "technical-constraint",
|
|
146784
|
+
description: "Performance optimization needed but may require trade-offs with visual richness",
|
|
146785
|
+
severity: "medium",
|
|
146786
|
+
stakeholders: ["Users", "Development", "Design"],
|
|
146787
|
+
resolutionApproach: [
|
|
146788
|
+
"Profile and identify performance bottlenecks",
|
|
146789
|
+
"Consider progressive loading for visual elements",
|
|
146790
|
+
"Balance image quality with load time"
|
|
146791
|
+
]
|
|
146792
|
+
});
|
|
146793
|
+
}
|
|
146794
|
+
return problems.filter((p74) => this.meetsMinimumSeverity(p74.severity));
|
|
146795
|
+
}
|
|
146796
|
+
/**
|
|
146797
|
+
* Check if severity meets minimum threshold
|
|
146798
|
+
*/
|
|
146799
|
+
meetsMinimumSeverity(severity) {
|
|
146800
|
+
const severityLevels = ["low", "medium", "high", "critical"];
|
|
146801
|
+
const minIndex = severityLevels.indexOf(this.minSeverity);
|
|
146802
|
+
const currentIndex = severityLevels.indexOf(severity);
|
|
146803
|
+
return currentIndex >= minIndex;
|
|
146804
|
+
}
|
|
146805
|
+
};
|
|
146806
|
+
|
|
146807
|
+
// src/mcp/tools/qx-analysis/impact-analyzer.ts
|
|
146808
|
+
var ImpactAnalyzer = class {
|
|
146809
|
+
/**
|
|
146810
|
+
* Analyze impacts from context and problem analysis
|
|
146811
|
+
*/
|
|
146812
|
+
analyze(context, problemAnalysis) {
|
|
146813
|
+
const guiFlowEndUser = [];
|
|
146814
|
+
const guiFlowInternal = [];
|
|
146815
|
+
const userFeelings = [];
|
|
146816
|
+
const performance4 = [];
|
|
146817
|
+
const security = [];
|
|
146818
|
+
const immutableRequirements = [];
|
|
146819
|
+
const interactiveElements = context.domMetrics?.interactiveElements || 0;
|
|
146820
|
+
const forms = context.domMetrics?.forms || 0;
|
|
146821
|
+
if (interactiveElements > 0) {
|
|
146822
|
+
guiFlowEndUser.push(`${interactiveElements} interactive elements affect user journey`);
|
|
146823
|
+
}
|
|
146824
|
+
if (forms > 0) {
|
|
146825
|
+
guiFlowEndUser.push(`${forms} forms impact user input flows`);
|
|
146826
|
+
}
|
|
146827
|
+
if (context.domMetrics?.semanticStructure?.hasNav) {
|
|
146828
|
+
guiFlowEndUser.push("Navigation structure enables exploration flow");
|
|
146829
|
+
}
|
|
146830
|
+
if (context.domMetrics?.semanticStructure?.hasMain) {
|
|
146831
|
+
guiFlowEndUser.push("Clear main content area guides user focus");
|
|
146832
|
+
}
|
|
146833
|
+
if (forms > 0) {
|
|
146834
|
+
guiFlowInternal.push("Form submissions create data processing workflows");
|
|
146835
|
+
}
|
|
146836
|
+
if (context.domMetrics?.semanticStructure?.hasAside) {
|
|
146837
|
+
guiFlowInternal.push("Sidebar content may require separate management");
|
|
146838
|
+
}
|
|
146839
|
+
const altCoverage = context.accessibility?.altTextsCoverage || 0;
|
|
146840
|
+
if (altCoverage > 80) {
|
|
146841
|
+
userFeelings.push("Positive - Good accessibility creates inclusive experience");
|
|
146842
|
+
} else if (altCoverage >= 50 && altCoverage <= 80) {
|
|
146843
|
+
userFeelings.push("Neutral - Moderate accessibility; some users may struggle");
|
|
146844
|
+
} else if (altCoverage < 50) {
|
|
146845
|
+
userFeelings.push("Frustrated - Poor accessibility excludes some users");
|
|
146846
|
+
}
|
|
146847
|
+
const loadTime = context.performance?.loadTime || 0;
|
|
146848
|
+
if (loadTime > 4e3) {
|
|
146849
|
+
userFeelings.push("Impatient - Very slow load time causes significant frustration");
|
|
146850
|
+
} else if (loadTime > 3e3) {
|
|
146851
|
+
userFeelings.push("Impatient - Slow load time causes frustration");
|
|
146852
|
+
} else if (loadTime > 2e3) {
|
|
146853
|
+
userFeelings.push("Mildly Annoyed - Noticeable load time");
|
|
146854
|
+
} else if (loadTime < 1500) {
|
|
146855
|
+
userFeelings.push("Delighted - Fast load time enhances experience");
|
|
146856
|
+
} else if (loadTime < 2e3) {
|
|
146857
|
+
userFeelings.push("Satisfied - Good load time meets expectations");
|
|
146858
|
+
}
|
|
146859
|
+
if (context.errorIndicators?.hasErrorMessages) {
|
|
146860
|
+
userFeelings.push("Confused - Visible errors reduce confidence");
|
|
146861
|
+
}
|
|
146862
|
+
const semanticStructure = context.domMetrics?.semanticStructure;
|
|
146863
|
+
if (semanticStructure) {
|
|
146864
|
+
const structureCount = [
|
|
146865
|
+
semanticStructure.hasHeader,
|
|
146866
|
+
semanticStructure.hasNav,
|
|
146867
|
+
semanticStructure.hasMain,
|
|
146868
|
+
semanticStructure.hasFooter
|
|
146869
|
+
].filter(Boolean).length;
|
|
146870
|
+
if (structureCount >= 3) {
|
|
146871
|
+
userFeelings.push("Oriented - Clear page structure helps navigation");
|
|
146872
|
+
} else if (structureCount < 2) {
|
|
146873
|
+
userFeelings.push("Disoriented - Unclear page structure may confuse users");
|
|
146874
|
+
}
|
|
146875
|
+
}
|
|
146876
|
+
if (loadTime > 2e3) {
|
|
146877
|
+
performance4.push(`Load time ${loadTime}ms impacts user retention`);
|
|
146878
|
+
}
|
|
146879
|
+
if (!context.metadata?.viewport) {
|
|
146880
|
+
performance4.push("Missing viewport tag affects mobile performance");
|
|
146881
|
+
}
|
|
146882
|
+
if (context.performance?.firstContentfulPaint && context.performance.firstContentfulPaint > 2500) {
|
|
146883
|
+
performance4.push(`First Contentful Paint ${context.performance.firstContentfulPaint}ms delays perceived readiness`);
|
|
146884
|
+
}
|
|
146885
|
+
if (forms > 0) {
|
|
146886
|
+
security.push("Form data handling requires secure transmission");
|
|
146887
|
+
}
|
|
146888
|
+
if (context.accessibility && (context.accessibility.ariaLabelsCount || 0) > 0) {
|
|
146889
|
+
security.push("ARIA labels may expose internal element names - review for sensitive info");
|
|
146890
|
+
}
|
|
146891
|
+
if (context.domMetrics?.semanticStructure?.hasMain) {
|
|
146892
|
+
immutableRequirements.push("Must maintain main content accessibility");
|
|
146893
|
+
}
|
|
146894
|
+
if (context.accessibility && (context.accessibility.focusableElementsCount || 0) > 0) {
|
|
146895
|
+
immutableRequirements.push("Must support keyboard navigation");
|
|
146896
|
+
}
|
|
146897
|
+
if (problemAnalysis.complexity === "complex") {
|
|
146898
|
+
immutableRequirements.push("Must maintain system stability with complex interactions");
|
|
146899
|
+
}
|
|
146900
|
+
const titleLower = (context.title || "").toLowerCase();
|
|
146901
|
+
if (titleLower.includes("health") || titleLower.includes("medical") || titleLower.includes("care")) {
|
|
146902
|
+
immutableRequirements.push("Must comply with healthcare accessibility standards");
|
|
146903
|
+
immutableRequirements.push("Must protect patient data privacy");
|
|
146904
|
+
}
|
|
146905
|
+
if (titleLower.includes("bank") || titleLower.includes("finance") || titleLower.includes("payment")) {
|
|
146906
|
+
immutableRequirements.push("Must maintain PCI DSS compliance for payment data");
|
|
146907
|
+
immutableRequirements.push("Must support secure authentication flows");
|
|
146908
|
+
}
|
|
146909
|
+
let visibleScore = 50;
|
|
146910
|
+
if (guiFlowEndUser.length > 0) visibleScore += 15;
|
|
146911
|
+
if (userFeelings.some((f74) => f74.includes("Positive") || f74.includes("Satisfied") || f74.includes("Delighted")))
|
|
146912
|
+
visibleScore += 20;
|
|
146913
|
+
if (userFeelings.some((f74) => f74.includes("Oriented"))) visibleScore += 10;
|
|
146914
|
+
if (userFeelings.some((f74) => f74.includes("Frustrated") || f74.includes("Confused") || f74.includes("Impatient")))
|
|
146915
|
+
visibleScore -= 15;
|
|
146916
|
+
if (userFeelings.some((f74) => f74.includes("Disoriented"))) visibleScore -= 10;
|
|
146917
|
+
visibleScore = Math.max(0, Math.min(100, visibleScore));
|
|
146918
|
+
let invisibleScore = 50;
|
|
146919
|
+
if (performance4.length === 0) invisibleScore += 20;
|
|
146920
|
+
if (security.length === 0) invisibleScore += 10;
|
|
146921
|
+
if (performance4.length > 2) invisibleScore -= 15;
|
|
146922
|
+
invisibleScore = Math.max(0, Math.min(100, invisibleScore));
|
|
146923
|
+
const overallImpactScore = Math.round((visibleScore + invisibleScore) / 2);
|
|
146924
|
+
return {
|
|
146925
|
+
visible: {
|
|
146926
|
+
guiFlow: {
|
|
146927
|
+
forEndUser: guiFlowEndUser,
|
|
146928
|
+
forInternalUser: guiFlowInternal
|
|
146929
|
+
},
|
|
146930
|
+
userFeelings,
|
|
146931
|
+
score: visibleScore
|
|
146932
|
+
},
|
|
146933
|
+
invisible: {
|
|
146934
|
+
performance: performance4,
|
|
146935
|
+
security,
|
|
146936
|
+
score: invisibleScore
|
|
146937
|
+
},
|
|
146938
|
+
immutableRequirements,
|
|
146939
|
+
overallImpactScore
|
|
146940
|
+
};
|
|
146941
|
+
}
|
|
146942
|
+
};
|
|
146943
|
+
|
|
146944
|
+
// src/mcp/tools/qx-analysis/analyze.ts
|
|
146945
|
+
var QX_ANALYZE_SCHEMA = {
|
|
146946
|
+
type: "object",
|
|
146947
|
+
properties: {
|
|
146948
|
+
target: {
|
|
146949
|
+
type: "string",
|
|
146950
|
+
description: "Target URL or identifier to analyze"
|
|
146951
|
+
},
|
|
146952
|
+
context: {
|
|
146953
|
+
type: "object",
|
|
146954
|
+
description: "Pre-collected QX context (optional)"
|
|
146955
|
+
},
|
|
146956
|
+
mode: {
|
|
146957
|
+
type: "string",
|
|
146958
|
+
description: "Analysis mode: full, quick, or targeted",
|
|
146959
|
+
enum: ["full", "quick", "targeted"],
|
|
146960
|
+
default: "full"
|
|
146961
|
+
},
|
|
146962
|
+
heuristics: {
|
|
146963
|
+
type: "array",
|
|
146964
|
+
description: "Specific heuristics to apply (default: all)"
|
|
146965
|
+
},
|
|
146966
|
+
minOracleSeverity: {
|
|
146967
|
+
type: "string",
|
|
146968
|
+
description: "Minimum oracle problem severity to report",
|
|
146969
|
+
enum: ["low", "medium", "high", "critical"],
|
|
146970
|
+
default: "medium"
|
|
146971
|
+
},
|
|
146972
|
+
includeCreativity: {
|
|
146973
|
+
type: "boolean",
|
|
146974
|
+
description: "Include creativity analysis from diverse domains",
|
|
146975
|
+
default: true
|
|
146976
|
+
},
|
|
146977
|
+
includeDesign: {
|
|
146978
|
+
type: "boolean",
|
|
146979
|
+
description: "Include design quality analysis",
|
|
146980
|
+
default: true
|
|
146981
|
+
}
|
|
146982
|
+
},
|
|
146983
|
+
required: ["target"]
|
|
146984
|
+
};
|
|
146985
|
+
var QXAnalyzeTool = class extends MCPToolBase {
|
|
146986
|
+
config = {
|
|
146987
|
+
name: "qe/qx/analyze",
|
|
146988
|
+
description: "Comprehensive Quality Experience (QX) analysis combining QA and UX perspectives. Applies 23+ programmatic heuristics, detects oracle problems, and analyzes impacts. QX = Marriage between QA (Quality Advocacy) and UX (User Experience).",
|
|
146989
|
+
domain: "quality-assessment",
|
|
146990
|
+
schema: QX_ANALYZE_SCHEMA,
|
|
146991
|
+
streaming: true,
|
|
146992
|
+
timeout: 18e4
|
|
146993
|
+
};
|
|
146994
|
+
async execute(params, context) {
|
|
146995
|
+
const {
|
|
146996
|
+
target,
|
|
146997
|
+
context: qxContext = this.createMinimalContext(target),
|
|
146998
|
+
mode = "full",
|
|
146999
|
+
heuristics,
|
|
147000
|
+
minOracleSeverity = "medium",
|
|
147001
|
+
includeCreativity = true,
|
|
147002
|
+
includeDesign = true
|
|
147003
|
+
} = params;
|
|
147004
|
+
try {
|
|
147005
|
+
this.emitStream(context, {
|
|
147006
|
+
status: "starting",
|
|
147007
|
+
message: `Starting QX analysis for: ${target}`,
|
|
147008
|
+
phase: "initialization"
|
|
147009
|
+
});
|
|
147010
|
+
this.emitStream(context, { status: "analyzing", phase: "problem-analysis" });
|
|
147011
|
+
const problemAnalysis = this.analyzeProblem(qxContext);
|
|
147012
|
+
if (this.isAborted(context)) {
|
|
147013
|
+
return { success: false, error: "Operation aborted" };
|
|
147014
|
+
}
|
|
147015
|
+
this.emitStream(context, { status: "analyzing", phase: "user-needs" });
|
|
147016
|
+
const userNeeds = this.analyzeUserNeeds(qxContext, problemAnalysis);
|
|
147017
|
+
this.emitStream(context, { status: "analyzing", phase: "business-needs" });
|
|
147018
|
+
const businessNeeds = this.analyzeBusinessNeeds(qxContext, problemAnalysis);
|
|
147019
|
+
this.emitStream(context, { status: "analyzing", phase: "creativity" });
|
|
147020
|
+
const creativityAnalysis = includeCreativity ? this.analyzeCreativity(qxContext, problemAnalysis) : this.createMinimalCreativityAnalysis();
|
|
147021
|
+
this.emitStream(context, { status: "analyzing", phase: "design" });
|
|
147022
|
+
const designAnalysis = includeDesign ? this.analyzeDesign(qxContext) : this.createMinimalDesignAnalysis();
|
|
147023
|
+
this.emitStream(context, { status: "analyzing", phase: "oracle-detection" });
|
|
147024
|
+
const oracleDetector = new OracleDetector(minOracleSeverity);
|
|
147025
|
+
const oracleProblems = oracleDetector.detect(qxContext, userNeeds, businessNeeds);
|
|
147026
|
+
this.emitStream(context, { status: "analyzing", phase: "impact-analysis" });
|
|
147027
|
+
const impactAnalyzer = new ImpactAnalyzer();
|
|
147028
|
+
const impactAnalysis = impactAnalyzer.analyze(qxContext, problemAnalysis);
|
|
147029
|
+
this.emitStream(context, { status: "analyzing", phase: "heuristics", count: 23 });
|
|
147030
|
+
const heuristicsEngine = new QXHeuristicsEngine({
|
|
147031
|
+
enabledHeuristics: heuristics || Object.values(QXHeuristic)
|
|
147032
|
+
});
|
|
147033
|
+
const heuristicResults = await heuristicsEngine.applyAll(
|
|
147034
|
+
qxContext,
|
|
147035
|
+
problemAnalysis,
|
|
147036
|
+
userNeeds,
|
|
147037
|
+
businessNeeds
|
|
147038
|
+
);
|
|
147039
|
+
this.emitStream(context, { status: "analyzing", phase: "recommendations" });
|
|
147040
|
+
const recommendations = this.generateRecommendations(
|
|
147041
|
+
problemAnalysis,
|
|
147042
|
+
userNeeds,
|
|
147043
|
+
businessNeeds,
|
|
147044
|
+
oracleProblems,
|
|
147045
|
+
impactAnalysis,
|
|
147046
|
+
heuristicResults
|
|
147047
|
+
);
|
|
147048
|
+
const overallScore = this.calculateOverallScore(
|
|
147049
|
+
problemAnalysis,
|
|
147050
|
+
userNeeds,
|
|
147051
|
+
businessNeeds,
|
|
147052
|
+
creativityAnalysis,
|
|
147053
|
+
designAnalysis,
|
|
147054
|
+
impactAnalysis,
|
|
147055
|
+
heuristicResults
|
|
147056
|
+
);
|
|
147057
|
+
const grade = this.scoreToGrade(overallScore);
|
|
147058
|
+
const result = {
|
|
147059
|
+
overallScore,
|
|
147060
|
+
grade,
|
|
147061
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
147062
|
+
target,
|
|
147063
|
+
problemAnalysis,
|
|
147064
|
+
userNeeds,
|
|
147065
|
+
businessNeeds,
|
|
147066
|
+
creativityAnalysis,
|
|
147067
|
+
designAnalysis,
|
|
147068
|
+
oracleProblems,
|
|
147069
|
+
impactAnalysis,
|
|
147070
|
+
heuristics: heuristicResults,
|
|
147071
|
+
recommendations,
|
|
147072
|
+
context: qxContext
|
|
147073
|
+
};
|
|
147074
|
+
this.emitStream(context, {
|
|
147075
|
+
status: "complete",
|
|
147076
|
+
score: overallScore,
|
|
147077
|
+
grade,
|
|
147078
|
+
heuristicsApplied: heuristicResults.length,
|
|
147079
|
+
oracleProblemsFound: oracleProblems.length
|
|
147080
|
+
});
|
|
147081
|
+
return {
|
|
147082
|
+
success: true,
|
|
147083
|
+
data: result,
|
|
147084
|
+
metadata: this.createMetadata(context.startTime, context.requestId)
|
|
147085
|
+
};
|
|
147086
|
+
} catch (error) {
|
|
147087
|
+
return {
|
|
147088
|
+
success: false,
|
|
147089
|
+
error: `QX analysis failed: ${error instanceof Error ? error.message : String(error)}`
|
|
147090
|
+
};
|
|
147091
|
+
}
|
|
147092
|
+
}
|
|
147093
|
+
// ============================================================================
|
|
147094
|
+
// Analysis Methods (Ported from V2)
|
|
147095
|
+
// ============================================================================
|
|
147096
|
+
analyzeProblem(context) {
|
|
147097
|
+
const title = context.title || "Untitled page";
|
|
147098
|
+
const description = context.metadata?.description || "";
|
|
147099
|
+
const hasError = context.errorIndicators?.hasErrorMessages || false;
|
|
147100
|
+
let problemStatement = `Evaluate quality experience of "${title}"`;
|
|
147101
|
+
if (description) {
|
|
147102
|
+
problemStatement += ` - ${description.substring(0, 100)}`;
|
|
147103
|
+
}
|
|
147104
|
+
const totalElements = context.domMetrics?.totalElements || 0;
|
|
147105
|
+
const interactiveElements = context.domMetrics?.interactiveElements || 0;
|
|
147106
|
+
const forms = context.domMetrics?.forms || 0;
|
|
147107
|
+
let complexity;
|
|
147108
|
+
if (totalElements > 500 || interactiveElements > 50 || forms > 3) {
|
|
147109
|
+
complexity = "complex";
|
|
147110
|
+
} else if (totalElements > 200 || interactiveElements > 20 || forms > 1) {
|
|
147111
|
+
complexity = "moderate";
|
|
147112
|
+
} else {
|
|
147113
|
+
complexity = "simple";
|
|
147114
|
+
}
|
|
147115
|
+
const breakdown = [];
|
|
147116
|
+
if (context.domMetrics?.semanticStructure?.hasNav) breakdown.push("Navigation structure");
|
|
147117
|
+
if (forms > 0) breakdown.push(`Form interactions (${forms} forms)`);
|
|
147118
|
+
if (interactiveElements > 0) breakdown.push(`User interactions (${interactiveElements} elements)`);
|
|
147119
|
+
if (context.accessibility) breakdown.push("Accessibility compliance");
|
|
147120
|
+
if (context.performance) breakdown.push("Performance metrics");
|
|
147121
|
+
const potentialFailures = [];
|
|
147122
|
+
const titleLower = title.toLowerCase();
|
|
147123
|
+
if (titleLower.includes("health") || titleLower.includes("care") || titleLower.includes("nhs")) {
|
|
147124
|
+
potentialFailures.push({
|
|
147125
|
+
description: "Healthcare information may not be accessible to users with visual impairments",
|
|
147126
|
+
severity: "high",
|
|
147127
|
+
likelihood: "likely"
|
|
147128
|
+
});
|
|
147129
|
+
potentialFailures.push({
|
|
147130
|
+
description: "Patient journey complexity may cause confusion during registration or booking",
|
|
147131
|
+
severity: "medium",
|
|
147132
|
+
likelihood: "possible"
|
|
147133
|
+
});
|
|
147134
|
+
potentialFailures.push({
|
|
147135
|
+
description: "Emergency contact information may not be prominently visible",
|
|
147136
|
+
severity: "high",
|
|
147137
|
+
likelihood: "possible"
|
|
147138
|
+
});
|
|
147139
|
+
}
|
|
147140
|
+
if (!context.domMetrics?.semanticStructure?.hasMain) {
|
|
147141
|
+
potentialFailures.push({
|
|
147142
|
+
description: "Missing main content landmark - users may struggle to find primary content",
|
|
147143
|
+
severity: "medium",
|
|
147144
|
+
likelihood: "likely"
|
|
147145
|
+
});
|
|
147146
|
+
}
|
|
147147
|
+
if (context.accessibility && (context.accessibility.altTextsCoverage || 0) < 80) {
|
|
147148
|
+
potentialFailures.push({
|
|
147149
|
+
description: "Poor image alt text coverage - screen reader users affected",
|
|
147150
|
+
severity: "high",
|
|
147151
|
+
likelihood: "very-likely"
|
|
147152
|
+
});
|
|
147153
|
+
}
|
|
147154
|
+
if (hasError) {
|
|
147155
|
+
potentialFailures.push({
|
|
147156
|
+
description: "Visible error messages detected - potential usability issues",
|
|
147157
|
+
severity: "medium",
|
|
147158
|
+
likelihood: "likely"
|
|
147159
|
+
});
|
|
147160
|
+
}
|
|
147161
|
+
if (context.performance && (context.performance.loadTime || 0) > 3e3) {
|
|
147162
|
+
potentialFailures.push({
|
|
147163
|
+
description: "Slow load time - user frustration and abandonment risk",
|
|
147164
|
+
severity: "high",
|
|
147165
|
+
likelihood: "very-likely"
|
|
147166
|
+
});
|
|
147167
|
+
}
|
|
147168
|
+
while (potentialFailures.length < 3) {
|
|
147169
|
+
if (complexity === "complex") {
|
|
147170
|
+
potentialFailures.push({
|
|
147171
|
+
description: "Complex interaction flows may confuse first-time users",
|
|
147172
|
+
severity: "medium",
|
|
147173
|
+
likelihood: "possible"
|
|
147174
|
+
});
|
|
147175
|
+
} else if (complexity === "moderate") {
|
|
147176
|
+
potentialFailures.push({
|
|
147177
|
+
description: "Multiple interactive elements increase cognitive load",
|
|
147178
|
+
severity: "low",
|
|
147179
|
+
likelihood: "possible"
|
|
147180
|
+
});
|
|
147181
|
+
} else {
|
|
147182
|
+
potentialFailures.push({
|
|
147183
|
+
description: "Limited interactivity may not meet user expectations",
|
|
147184
|
+
severity: "low",
|
|
147185
|
+
likelihood: "possible"
|
|
147186
|
+
});
|
|
147187
|
+
}
|
|
147188
|
+
}
|
|
147189
|
+
let clarityScore = 50;
|
|
147190
|
+
if (title && title !== "Untitled page") clarityScore += 15;
|
|
147191
|
+
if (description) clarityScore += 15;
|
|
147192
|
+
if (breakdown.length >= 3) clarityScore += 10;
|
|
147193
|
+
if (context.domMetrics?.semanticStructure?.hasMain) clarityScore += 10;
|
|
147194
|
+
clarityScore = Math.min(100, clarityScore);
|
|
147195
|
+
return {
|
|
147196
|
+
problemStatement,
|
|
147197
|
+
complexity,
|
|
147198
|
+
breakdown,
|
|
147199
|
+
potentialFailures: potentialFailures.slice(0, 5),
|
|
147200
|
+
clarityScore
|
|
147201
|
+
};
|
|
147202
|
+
}
|
|
147203
|
+
analyzeUserNeeds(context, problemAnalysis) {
|
|
147204
|
+
const needs = [];
|
|
147205
|
+
const challenges = [];
|
|
147206
|
+
const semantic = context.domMetrics?.semanticStructure;
|
|
147207
|
+
const accessibility = context.accessibility;
|
|
147208
|
+
const interactiveElements = context.domMetrics?.interactiveElements || 0;
|
|
147209
|
+
const forms = context.domMetrics?.forms || 0;
|
|
147210
|
+
if (semantic?.hasNav) {
|
|
147211
|
+
needs.push({ description: "Clear navigation to find content", priority: "must-have", addressed: true });
|
|
147212
|
+
} else {
|
|
147213
|
+
challenges.push("Missing navigation structure - users cannot easily explore site");
|
|
147214
|
+
needs.push({ description: "Clear navigation to find content", priority: "must-have", addressed: false });
|
|
147215
|
+
}
|
|
147216
|
+
if (interactiveElements > 0) {
|
|
147217
|
+
needs.push({ description: "Interactive elements for engagement", priority: "must-have", addressed: true });
|
|
147218
|
+
}
|
|
147219
|
+
if (accessibility && (accessibility.focusableElementsCount || 0) > 0) {
|
|
147220
|
+
needs.push({ description: "Keyboard navigation support", priority: "must-have", addressed: true });
|
|
147221
|
+
} else {
|
|
147222
|
+
challenges.push("Limited keyboard navigation - inaccessible to some users");
|
|
147223
|
+
needs.push({ description: "Keyboard navigation support", priority: "must-have", addressed: false });
|
|
147224
|
+
}
|
|
147225
|
+
if (semantic?.hasHeader) {
|
|
147226
|
+
needs.push({ description: "Consistent page header for orientation", priority: "should-have", addressed: true });
|
|
147227
|
+
}
|
|
147228
|
+
if (semantic?.hasFooter) {
|
|
147229
|
+
needs.push({ description: "Footer with supporting information", priority: "should-have", addressed: true });
|
|
147230
|
+
}
|
|
147231
|
+
if (accessibility && (accessibility.altTextsCoverage || 0) > 50) {
|
|
147232
|
+
needs.push({ description: "Image descriptions for screen readers", priority: "should-have", addressed: true });
|
|
147233
|
+
} else if (accessibility && (accessibility.altTextsCoverage || 0) < 50) {
|
|
147234
|
+
challenges.push("Poor alt text coverage - images not accessible");
|
|
147235
|
+
needs.push({ description: "Image descriptions for screen readers", priority: "should-have", addressed: false });
|
|
147236
|
+
}
|
|
147237
|
+
if (context.performance && (context.performance.loadTime || 0) < 3e3) {
|
|
147238
|
+
needs.push({ description: "Fast page load time", priority: "should-have", addressed: true });
|
|
147239
|
+
} else if (context.performance && (context.performance.loadTime || 0) >= 3e3) {
|
|
147240
|
+
challenges.push("Slow load time - user frustration risk");
|
|
147241
|
+
needs.push({ description: "Fast page load time", priority: "should-have", addressed: false });
|
|
147242
|
+
}
|
|
147243
|
+
if (semantic?.hasAside) {
|
|
147244
|
+
needs.push({ description: "Supplementary content sections", priority: "nice-to-have", addressed: true });
|
|
147245
|
+
}
|
|
147246
|
+
if (accessibility && (accessibility.landmarkRoles || 0) > 3) {
|
|
147247
|
+
needs.push({ description: "Rich ARIA landmarks for navigation", priority: "nice-to-have", addressed: true });
|
|
147248
|
+
}
|
|
147249
|
+
if (forms > 0) {
|
|
147250
|
+
needs.push({ description: "Form interactions for user input", priority: "nice-to-have", addressed: true });
|
|
147251
|
+
}
|
|
147252
|
+
const addressedMustHaves = needs.filter((n61) => n61.priority === "must-have" && n61.addressed).length;
|
|
147253
|
+
let suitability;
|
|
147254
|
+
if (challenges.length === 0 && addressedMustHaves >= 3) {
|
|
147255
|
+
suitability = "excellent";
|
|
147256
|
+
} else if (challenges.length <= 1 && addressedMustHaves >= 2) {
|
|
147257
|
+
suitability = "good";
|
|
147258
|
+
} else if (challenges.length <= 2 && addressedMustHaves >= 2) {
|
|
147259
|
+
suitability = "adequate";
|
|
147260
|
+
} else {
|
|
147261
|
+
suitability = "poor";
|
|
147262
|
+
}
|
|
147263
|
+
let alignmentScore = 40;
|
|
147264
|
+
alignmentScore += addressedMustHaves * 10;
|
|
147265
|
+
alignmentScore += needs.filter((n61) => n61.priority === "should-have" && n61.addressed).length * 5;
|
|
147266
|
+
alignmentScore += needs.filter((n61) => n61.priority === "nice-to-have" && n61.addressed).length * 2;
|
|
147267
|
+
alignmentScore -= challenges.length * 8;
|
|
147268
|
+
alignmentScore = Math.max(0, Math.min(100, alignmentScore));
|
|
147269
|
+
return { needs, suitability, challenges, alignmentScore };
|
|
147270
|
+
}
|
|
147271
|
+
analyzeBusinessNeeds(context, problemAnalysis) {
|
|
147272
|
+
const forms = context.domMetrics?.forms || 0;
|
|
147273
|
+
const interactiveElements = context.domMetrics?.interactiveElements || 0;
|
|
147274
|
+
const performance4 = context.performance;
|
|
147275
|
+
const hasErrors = context.errorIndicators?.hasErrorMessages || false;
|
|
147276
|
+
let primaryGoal;
|
|
147277
|
+
let kpisAffected = [];
|
|
147278
|
+
if (forms > 2) {
|
|
147279
|
+
primaryGoal = "business-ease";
|
|
147280
|
+
kpisAffected = ["Form completion rate", "Lead generation", "User sign-ups"];
|
|
147281
|
+
} else if (interactiveElements > 30) {
|
|
147282
|
+
primaryGoal = "user-experience";
|
|
147283
|
+
kpisAffected = ["Time on site", "Click-through rate", "User engagement"];
|
|
147284
|
+
} else {
|
|
147285
|
+
primaryGoal = "balanced";
|
|
147286
|
+
kpisAffected = ["Content consumption", "Bounce rate", "Page views"];
|
|
147287
|
+
}
|
|
147288
|
+
const titleLower = (context.title || "").toLowerCase();
|
|
147289
|
+
if (titleLower.includes("health") || titleLower.includes("care")) {
|
|
147290
|
+
kpisAffected.push("Patient satisfaction", "Appointment completion rate", "Information accessibility");
|
|
147291
|
+
}
|
|
147292
|
+
const crossTeamImpact = [];
|
|
147293
|
+
if (forms > 0) {
|
|
147294
|
+
crossTeamImpact.push({ team: "Marketing", impactType: "positive", description: "Form conversion optimization needed" });
|
|
147295
|
+
crossTeamImpact.push({ team: "Development", impactType: "neutral", description: "Form validation and submission handling" });
|
|
147296
|
+
}
|
|
147297
|
+
if (context.accessibility && (context.accessibility.altTextsCoverage || 0) < 100) {
|
|
147298
|
+
crossTeamImpact.push({ team: "Content", impactType: "negative", description: "Image alt text creation required" });
|
|
147299
|
+
}
|
|
147300
|
+
if (performance4 && (performance4.loadTime || 0) > 2e3) {
|
|
147301
|
+
crossTeamImpact.push({ team: "Engineering", impactType: "negative", description: "Performance optimization needed" });
|
|
147302
|
+
}
|
|
147303
|
+
if (problemAnalysis.complexity === "complex") {
|
|
147304
|
+
crossTeamImpact.push({ team: "QA", impactType: "neutral", description: "Comprehensive testing strategy required" });
|
|
147305
|
+
}
|
|
147306
|
+
let compromisesUX = false;
|
|
147307
|
+
if (hasErrors) compromisesUX = true;
|
|
147308
|
+
if (context.accessibility && (context.accessibility.altTextsCoverage || 0) < 50) compromisesUX = true;
|
|
147309
|
+
if (performance4 && (performance4.loadTime || 0) > 4e3) compromisesUX = true;
|
|
147310
|
+
let alignmentScore = 50;
|
|
147311
|
+
if (kpisAffected.length > 0) alignmentScore += 15;
|
|
147312
|
+
if (crossTeamImpact.length > 0) alignmentScore += 10;
|
|
147313
|
+
if (!compromisesUX) alignmentScore += 20;
|
|
147314
|
+
alignmentScore = Math.min(100, alignmentScore);
|
|
147315
|
+
return {
|
|
147316
|
+
primaryGoal,
|
|
147317
|
+
kpisAffected,
|
|
147318
|
+
crossTeamImpact,
|
|
147319
|
+
compromisesUX,
|
|
147320
|
+
impactsKPIs: kpisAffected.length > 0,
|
|
147321
|
+
alignmentScore
|
|
147322
|
+
};
|
|
147323
|
+
}
|
|
147324
|
+
analyzeCreativity(context, problemAnalysis) {
|
|
147325
|
+
const innovativeApproaches = [];
|
|
147326
|
+
if (problemAnalysis.complexity === "complex" || problemAnalysis.complexity === "moderate") {
|
|
147327
|
+
innovativeApproaches.push({
|
|
147328
|
+
description: "Question fundamental assumptions about user mental models and expected workflows",
|
|
147329
|
+
inspirationSource: "philosophy",
|
|
147330
|
+
applicability: "high",
|
|
147331
|
+
novelty: "moderately-novel"
|
|
147332
|
+
});
|
|
147333
|
+
if (context.errorIndicators?.hasErrorMessages) {
|
|
147334
|
+
innovativeApproaches.push({
|
|
147335
|
+
description: "Apply diagnostic testing - systematically isolate error sources through controlled scenarios",
|
|
147336
|
+
inspirationSource: "medicine",
|
|
147337
|
+
applicability: "high",
|
|
147338
|
+
novelty: "moderately-novel"
|
|
147339
|
+
});
|
|
147340
|
+
}
|
|
147341
|
+
}
|
|
147342
|
+
if (context.domMetrics?.forms && context.domMetrics.forms > 0) {
|
|
147343
|
+
innovativeApproaches.push({
|
|
147344
|
+
description: "Test checkout/form flows like fashion retail - focus on friction points, abandonment triggers",
|
|
147345
|
+
inspirationSource: "e-commerce",
|
|
147346
|
+
applicability: "high",
|
|
147347
|
+
novelty: "incremental"
|
|
147348
|
+
});
|
|
147349
|
+
}
|
|
147350
|
+
innovativeApproaches.push({
|
|
147351
|
+
description: "Analyze through diverse demographic lenses (age, gender, culture, ability) for inclusive testing",
|
|
147352
|
+
inspirationSource: "social science",
|
|
147353
|
+
applicability: "high",
|
|
147354
|
+
novelty: "moderately-novel"
|
|
147355
|
+
});
|
|
147356
|
+
if (context.domMetrics?.interactiveElements && context.domMetrics.interactiveElements > 20) {
|
|
147357
|
+
innovativeApproaches.push({
|
|
147358
|
+
description: 'Test for "game-breaking" exploits - unexpected interaction sequences, boundary conditions',
|
|
147359
|
+
inspirationSource: "gaming",
|
|
147360
|
+
applicability: "medium",
|
|
147361
|
+
novelty: "highly-novel"
|
|
147362
|
+
});
|
|
147363
|
+
}
|
|
147364
|
+
const domainsExplored = [...new Set(innovativeApproaches.map((a37) => a37.inspirationSource))];
|
|
147365
|
+
const perspectives = [
|
|
147366
|
+
"Unexperienced user perspective (fresh eyes)",
|
|
147367
|
+
"Power user perspective (efficiency focus)",
|
|
147368
|
+
"Accessibility perspective (assistive tech users)",
|
|
147369
|
+
"International perspective (cultural differences)"
|
|
147370
|
+
];
|
|
147371
|
+
let creativityScore = 50;
|
|
147372
|
+
creativityScore += innovativeApproaches.length * 8;
|
|
147373
|
+
creativityScore += domainsExplored.length * 5;
|
|
147374
|
+
creativityScore = Math.min(100, creativityScore);
|
|
147375
|
+
return {
|
|
147376
|
+
innovativeApproaches,
|
|
147377
|
+
domainsExplored,
|
|
147378
|
+
perspectives,
|
|
147379
|
+
creativityScore,
|
|
147380
|
+
notes: [
|
|
147381
|
+
"Creativity draws from diverse domains to uncover unconventional testing approaches",
|
|
147382
|
+
"Higher complexity problems benefit from cross-disciplinary inspiration",
|
|
147383
|
+
`Applied ${innovativeApproaches.length} creative approaches from ${domainsExplored.length} domains`
|
|
147384
|
+
]
|
|
147385
|
+
};
|
|
147386
|
+
}
|
|
147387
|
+
analyzeDesign(context) {
|
|
147388
|
+
const clearElements = [];
|
|
147389
|
+
const unclearElements = [];
|
|
147390
|
+
if (context.domMetrics?.semanticStructure?.hasNav) {
|
|
147391
|
+
clearElements.push("Navigation structure clearly defined with semantic <nav> element");
|
|
147392
|
+
}
|
|
147393
|
+
if (context.domMetrics?.semanticStructure?.hasMain) {
|
|
147394
|
+
clearElements.push("Main content area clearly identified");
|
|
147395
|
+
}
|
|
147396
|
+
if (context.domMetrics?.semanticStructure?.hasHeader && context.domMetrics?.semanticStructure?.hasFooter) {
|
|
147397
|
+
clearElements.push("Header and footer provide clear page structure");
|
|
147398
|
+
}
|
|
147399
|
+
const ariaLabels = context.accessibility?.ariaLabelsCount || 0;
|
|
147400
|
+
const interactiveElements = context.domMetrics?.interactiveElements || 0;
|
|
147401
|
+
if (interactiveElements > 0 && ariaLabels < interactiveElements * 0.5) {
|
|
147402
|
+
unclearElements.push("Many interactive elements lack ARIA labels for clarity");
|
|
147403
|
+
}
|
|
147404
|
+
let exactnessScore = 50 + clearElements.length * 15 - unclearElements.length * 10;
|
|
147405
|
+
exactnessScore = Math.max(0, Math.min(100, exactnessScore));
|
|
147406
|
+
const clarity = exactnessScore >= 80 ? "excellent" : exactnessScore >= 60 ? "good" : exactnessScore >= 40 ? "adequate" : "poor";
|
|
147407
|
+
const intuitivePatterns = [];
|
|
147408
|
+
const culturalIssues = [];
|
|
147409
|
+
let followsConventions = true;
|
|
147410
|
+
if (context.domMetrics?.semanticStructure?.hasNav) {
|
|
147411
|
+
intuitivePatterns.push("Standard navigation placement");
|
|
147412
|
+
}
|
|
147413
|
+
if (context.domMetrics?.semanticStructure?.hasHeader) {
|
|
147414
|
+
intuitivePatterns.push("Header follows common layout conventions");
|
|
147415
|
+
}
|
|
147416
|
+
if (!context.domMetrics?.semanticStructure?.hasNav && interactiveElements > 10) {
|
|
147417
|
+
followsConventions = false;
|
|
147418
|
+
culturalIssues.push("Non-standard navigation pattern may confuse users from different regions");
|
|
147419
|
+
}
|
|
147420
|
+
let intuitiveScore = 50 + intuitivePatterns.length * 15;
|
|
147421
|
+
if (!followsConventions) intuitiveScore -= 20;
|
|
147422
|
+
intuitiveScore = Math.max(0, Math.min(100, intuitiveScore));
|
|
147423
|
+
const overallDesignScore = Math.round((exactnessScore + intuitiveScore) / 2);
|
|
147424
|
+
return {
|
|
147425
|
+
exactness: {
|
|
147426
|
+
clarity,
|
|
147427
|
+
clearElements,
|
|
147428
|
+
unclearElements,
|
|
147429
|
+
score: exactnessScore
|
|
147430
|
+
},
|
|
147431
|
+
intuitive: {
|
|
147432
|
+
followsConventions,
|
|
147433
|
+
intuitivePatterns,
|
|
147434
|
+
culturalIssues,
|
|
147435
|
+
score: intuitiveScore
|
|
147436
|
+
},
|
|
147437
|
+
counterIntuitive: {
|
|
147438
|
+
deviations: [],
|
|
147439
|
+
innovativeJustification: false,
|
|
147440
|
+
freshEyesPerspective: true,
|
|
147441
|
+
issuesCount: 0
|
|
147442
|
+
},
|
|
147443
|
+
overallDesignScore
|
|
147444
|
+
};
|
|
147445
|
+
}
|
|
147446
|
+
generateRecommendations(problemAnalysis, userNeeds, businessNeeds, oracleProblems, impactAnalysis, heuristics) {
|
|
147447
|
+
const recommendations = [];
|
|
147448
|
+
let priority = 1;
|
|
147449
|
+
for (const heuristic of heuristics) {
|
|
147450
|
+
for (const issue of heuristic.issues) {
|
|
147451
|
+
if (issue.severity === "critical" || issue.severity === "high") {
|
|
147452
|
+
recommendations.push({
|
|
147453
|
+
principle: heuristic.name,
|
|
147454
|
+
recommendation: issue.description,
|
|
147455
|
+
severity: issue.severity,
|
|
147456
|
+
impact: issue.severity === "critical" ? 90 : 75,
|
|
147457
|
+
effort: "medium",
|
|
147458
|
+
priority: priority++,
|
|
147459
|
+
category: "qx"
|
|
147460
|
+
});
|
|
147461
|
+
}
|
|
147462
|
+
}
|
|
147463
|
+
for (const rec of heuristic.recommendations) {
|
|
147464
|
+
recommendations.push({
|
|
147465
|
+
principle: heuristic.name,
|
|
147466
|
+
recommendation: rec,
|
|
147467
|
+
severity: "medium",
|
|
147468
|
+
impact: 60,
|
|
147469
|
+
effort: "medium",
|
|
147470
|
+
priority: priority++,
|
|
147471
|
+
category: "qx"
|
|
147472
|
+
});
|
|
147473
|
+
}
|
|
147474
|
+
}
|
|
147475
|
+
for (const oracle of oracleProblems) {
|
|
147476
|
+
recommendations.push({
|
|
147477
|
+
principle: `Oracle: ${oracle.type}`,
|
|
147478
|
+
recommendation: oracle.description,
|
|
147479
|
+
severity: oracle.severity,
|
|
147480
|
+
impact: oracle.severity === "critical" ? 95 : oracle.severity === "high" ? 80 : 60,
|
|
147481
|
+
effort: "high",
|
|
147482
|
+
priority: priority++,
|
|
147483
|
+
category: "process",
|
|
147484
|
+
evidence: oracle.resolutionApproach
|
|
147485
|
+
});
|
|
147486
|
+
}
|
|
147487
|
+
for (const challenge of userNeeds.challenges) {
|
|
147488
|
+
recommendations.push({
|
|
147489
|
+
principle: "User Needs",
|
|
147490
|
+
recommendation: challenge,
|
|
147491
|
+
severity: "medium",
|
|
147492
|
+
impact: 65,
|
|
147493
|
+
effort: "medium",
|
|
147494
|
+
priority: priority++,
|
|
147495
|
+
category: "ux"
|
|
147496
|
+
});
|
|
147497
|
+
}
|
|
147498
|
+
return recommendations.sort((a37, b68) => {
|
|
147499
|
+
const severityOrder = { critical: 0, high: 1, medium: 2, low: 3 };
|
|
147500
|
+
const severityDiff = severityOrder[a37.severity] - severityOrder[b68.severity];
|
|
147501
|
+
if (severityDiff !== 0) return severityDiff;
|
|
147502
|
+
return b68.impact - a37.impact;
|
|
147503
|
+
}).slice(0, 15);
|
|
147504
|
+
}
|
|
147505
|
+
calculateOverallScore(problemAnalysis, userNeeds, businessNeeds, creativityAnalysis, designAnalysis, impactAnalysis, heuristics) {
|
|
147506
|
+
const heuristicsAvg = heuristics.reduce((sum, h66) => sum + h66.score, 0) / heuristics.length || 0;
|
|
147507
|
+
const score = problemAnalysis.clarityScore * 0.1 + userNeeds.alignmentScore * 0.2 + businessNeeds.alignmentScore * 0.15 + creativityAnalysis.creativityScore * 0.1 + designAnalysis.overallDesignScore * 0.15 + (100 - impactAnalysis.overallImpactScore) * 0.1 + heuristicsAvg * 0.2;
|
|
147508
|
+
return Math.round(Math.max(0, Math.min(100, score)));
|
|
147509
|
+
}
|
|
147510
|
+
scoreToGrade(score) {
|
|
147511
|
+
if (score >= 90) return "A";
|
|
147512
|
+
if (score >= 80) return "B";
|
|
147513
|
+
if (score >= 70) return "C";
|
|
147514
|
+
if (score >= 60) return "D";
|
|
147515
|
+
return "F";
|
|
147516
|
+
}
|
|
147517
|
+
createMinimalContext(target) {
|
|
147518
|
+
return {
|
|
147519
|
+
url: target,
|
|
147520
|
+
title: target
|
|
147521
|
+
};
|
|
147522
|
+
}
|
|
147523
|
+
createMinimalCreativityAnalysis() {
|
|
147524
|
+
return {
|
|
147525
|
+
innovativeApproaches: [],
|
|
147526
|
+
domainsExplored: [],
|
|
147527
|
+
perspectives: [],
|
|
147528
|
+
creativityScore: 50,
|
|
147529
|
+
notes: ["Creativity analysis skipped"]
|
|
147530
|
+
};
|
|
147531
|
+
}
|
|
147532
|
+
createMinimalDesignAnalysis() {
|
|
147533
|
+
return {
|
|
147534
|
+
exactness: { clarity: "adequate", clearElements: [], unclearElements: [], score: 50 },
|
|
147535
|
+
intuitive: { followsConventions: true, intuitivePatterns: [], culturalIssues: [], score: 50 },
|
|
147536
|
+
counterIntuitive: { deviations: [], innovativeJustification: false, freshEyesPerspective: false, issuesCount: 0 },
|
|
147537
|
+
overallDesignScore: 50
|
|
147538
|
+
};
|
|
147539
|
+
}
|
|
147540
|
+
// Helper methods from base class
|
|
147541
|
+
emitStream(context, data) {
|
|
147542
|
+
if (context.streaming && context.onStream) {
|
|
147543
|
+
context.onStream(data);
|
|
147544
|
+
}
|
|
147545
|
+
}
|
|
147546
|
+
isAborted(context) {
|
|
147547
|
+
return context.abortSignal?.aborted || false;
|
|
147548
|
+
}
|
|
147549
|
+
createMetadata(startTime, requestId) {
|
|
147550
|
+
return {
|
|
147551
|
+
executionTime: Date.now() - startTime,
|
|
147552
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
147553
|
+
requestId
|
|
147554
|
+
};
|
|
147555
|
+
}
|
|
147556
|
+
};
|
|
147557
|
+
var qxAnalyzeTool = new QXAnalyzeTool();
|
|
147558
|
+
|
|
146242
147559
|
// src/mcp/tools/registry.ts
|
|
146243
147560
|
var QE_TOOL_NAMES = {
|
|
146244
147561
|
// Test Generation
|
|
@@ -146284,7 +147601,9 @@ var QE_TOOL_NAMES = {
|
|
|
146284
147601
|
EMBEDDING_STORE: "qe/embeddings/store",
|
|
146285
147602
|
EMBEDDING_STATS: "qe/embeddings/stats",
|
|
146286
147603
|
// Coherence Tools (ADR-052)
|
|
146287
|
-
...COHERENCE_TOOL_NAMES
|
|
147604
|
+
...COHERENCE_TOOL_NAMES,
|
|
147605
|
+
// QX Analysis (Quality Experience)
|
|
147606
|
+
QX_ANALYZE: "qe/qx/analyze"
|
|
146288
147607
|
};
|
|
146289
147608
|
var QE_TOOLS = [
|
|
146290
147609
|
// Test Generation Domain
|
|
@@ -146330,7 +147649,9 @@ var QE_TOOLS = [
|
|
|
146330
147649
|
new EmbeddingStoreTool(),
|
|
146331
147650
|
new EmbeddingStatsTool(),
|
|
146332
147651
|
// Coherence Tools (ADR-052)
|
|
146333
|
-
...COHERENCE_TOOLS
|
|
147652
|
+
...COHERENCE_TOOLS,
|
|
147653
|
+
// QX Analysis (Quality Experience)
|
|
147654
|
+
new QXAnalyzeTool()
|
|
146334
147655
|
];
|
|
146335
147656
|
function resetAllToolCaches() {
|
|
146336
147657
|
for (const tool of QE_TOOLS) {
|