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.
Files changed (502) hide show
  1. package/.claude/agents/v3/qe-accessibility-auditor.md +14 -9
  2. package/.claude/agents/v3/qe-bdd-generator.md +14 -9
  3. package/.claude/agents/v3/qe-chaos-engineer.md +15 -10
  4. package/.claude/agents/v3/qe-code-complexity.md +14 -9
  5. package/.claude/agents/v3/qe-code-intelligence.md +14 -9
  6. package/.claude/agents/v3/qe-contract-validator.md +14 -9
  7. package/.claude/agents/v3/qe-coverage-specialist.md +14 -9
  8. package/.claude/agents/v3/qe-defect-predictor.md +14 -9
  9. package/.claude/agents/v3/qe-dependency-mapper.md +14 -9
  10. package/.claude/agents/v3/qe-deployment-advisor.md +14 -9
  11. package/.claude/agents/v3/qe-flaky-hunter.md +14 -9
  12. package/.claude/agents/v3/qe-fleet-commander.md +14 -9
  13. package/.claude/agents/v3/qe-gap-detector.md +14 -9
  14. package/.claude/agents/v3/qe-graphql-tester.md +14 -9
  15. package/.claude/agents/v3/qe-impact-analyzer.md +14 -9
  16. package/.claude/agents/v3/qe-kg-builder.md +14 -9
  17. package/.claude/agents/v3/qe-load-tester.md +14 -9
  18. package/.claude/agents/v3/qe-message-broker-tester.md +15 -10
  19. package/.claude/agents/v3/qe-metrics-optimizer.md +14 -9
  20. package/.claude/agents/v3/qe-middleware-validator.md +15 -10
  21. package/.claude/agents/v3/qe-mutation-tester.md +14 -9
  22. package/.claude/agents/v3/qe-odata-contract-tester.md +17 -12
  23. package/.claude/agents/v3/qe-performance-tester.md +14 -9
  24. package/.claude/agents/v3/qe-product-factors-assessor.md +19 -0
  25. package/.claude/agents/v3/qe-property-tester.md +14 -9
  26. package/.claude/agents/v3/qe-qx-partner.md +101 -14
  27. package/.claude/agents/v3/qe-regression-analyzer.md +14 -9
  28. package/.claude/agents/v3/qe-requirements-validator.md +14 -9
  29. package/.claude/agents/v3/qe-responsive-tester.md +14 -9
  30. package/.claude/agents/v3/qe-retry-handler.md +14 -9
  31. package/.claude/agents/v3/qe-risk-assessor.md +14 -9
  32. package/.claude/agents/v3/qe-root-cause-analyzer.md +14 -9
  33. package/.claude/agents/v3/qe-sap-idoc-tester.md +16 -11
  34. package/.claude/agents/v3/qe-sap-rfc-tester.md +15 -10
  35. package/.claude/agents/v3/qe-security-auditor.md +18 -9
  36. package/.claude/agents/v3/qe-security-scanner.md +15 -10
  37. package/.claude/agents/v3/qe-soap-tester.md +15 -10
  38. package/.claude/agents/v3/qe-sod-analyzer.md +17 -12
  39. package/.claude/agents/v3/qe-test-architect.md +14 -9
  40. package/.claude/agents/v3/qe-transfer-specialist.md +14 -9
  41. package/.claude/agents/v3/subagents/qe-code-reviewer.md +14 -9
  42. package/.claude/agents/v3/subagents/qe-integration-reviewer.md +14 -9
  43. package/.claude/agents/v3/subagents/qe-performance-reviewer.md +14 -9
  44. package/.claude/agents/v3/subagents/qe-security-reviewer.md +14 -9
  45. package/.claude/agents/v3/subagents/qe-tdd-green.md +14 -9
  46. package/.claude/agents/v3/subagents/qe-tdd-red.md +14 -9
  47. package/.claude/agents/v3/subagents/qe-tdd-refactor.md +14 -9
  48. package/.claude/agents/v3/templates/qx-report-template.html +26 -22
  49. package/.claude/skills/.validation/README.md +2 -2
  50. package/.claude/skills/.validation/skill-validation-mcp-integration.md +1 -1
  51. package/.claude/skills/.validation/templates/skill-frontmatter.example.yaml +1 -1
  52. package/.claude/skills/TRUST-TIERS.md +55 -55
  53. package/.claude/skills/a11y-ally/SKILL.md +1 -1
  54. package/.claude/skills/a11y-ally/evals/a11y-ally.yaml +1 -1
  55. package/.claude/skills/a11y-ally/scripts/validate-config.json +42 -0
  56. package/.claude/skills/accessibility-testing/SKILL.md +1 -1
  57. package/.claude/skills/accessibility-testing/scripts/validate-config.json +56 -0
  58. package/.claude/skills/api-testing-patterns/SKILL.md +1 -1
  59. package/.claude/skills/api-testing-patterns/scripts/validate-config.json +61 -0
  60. package/.claude/skills/brutal-honesty-review/SKILL.md +1 -1
  61. package/.claude/skills/brutal-honesty-review/scripts/validate-config.json +34 -0
  62. package/.claude/skills/bug-reporting-excellence/SKILL.md +1 -1
  63. package/.claude/skills/bug-reporting-excellence/scripts/validate-config.json +34 -0
  64. package/.claude/skills/chaos-engineering-resilience/SKILL.md +1 -1
  65. package/.claude/skills/chaos-engineering-resilience/evals/chaos-engineering-resilience.yaml +1 -1
  66. package/.claude/skills/chaos-engineering-resilience/scripts/validate-config.json +47 -0
  67. package/.claude/skills/cicd-pipeline-qe-orchestrator/SKILL.md +1 -1
  68. package/.claude/skills/cicd-pipeline-qe-orchestrator/scripts/validate-config.json +42 -0
  69. package/.claude/skills/code-review-quality/SKILL.md +1 -1
  70. package/.claude/skills/code-review-quality/scripts/validate-config.json +34 -0
  71. package/.claude/skills/compatibility-testing/SKILL.md +1 -1
  72. package/.claude/skills/compatibility-testing/scripts/validate-config.json +44 -0
  73. package/.claude/skills/compliance-testing/SKILL.md +1 -1
  74. package/.claude/skills/compliance-testing/scripts/validate-config.json +39 -0
  75. package/.claude/skills/contract-testing/SKILL.md +1 -1
  76. package/.claude/skills/contract-testing/scripts/validate-config.json +59 -0
  77. package/.claude/skills/database-testing/SKILL.md +1 -1
  78. package/.claude/skills/database-testing/evals/database-testing.yaml +1 -1
  79. package/.claude/skills/database-testing/scripts/validate-config.json +48 -0
  80. package/.claude/skills/enterprise-integration-testing/SKILL.md +1 -1
  81. package/.claude/skills/localization-testing/SKILL.md +1 -1
  82. package/.claude/skills/localization-testing/evals/localization-testing.yaml +1 -1
  83. package/.claude/skills/localization-testing/scripts/validate-config.json +42 -0
  84. package/.claude/skills/middleware-testing-patterns/SKILL.md +1 -1
  85. package/.claude/skills/mobile-testing/SKILL.md +1 -1
  86. package/.claude/skills/mobile-testing/evals/mobile-testing.yaml +1 -1
  87. package/.claude/skills/mobile-testing/scripts/validate-config.json +43 -0
  88. package/.claude/skills/mutation-testing/SKILL.md +1 -1
  89. package/.claude/skills/mutation-testing/scripts/validate-config.json +44 -0
  90. package/.claude/skills/n8n-expression-testing/SKILL.md +1 -1
  91. package/.claude/skills/n8n-expression-testing/evals/n8n-expression-testing.yaml +1 -1
  92. package/.claude/skills/n8n-expression-testing/scripts/validate-config.json +39 -0
  93. package/.claude/skills/n8n-integration-testing-patterns/SKILL.md +1 -1
  94. package/.claude/skills/n8n-integration-testing-patterns/evals/n8n-integration-testing-patterns.yaml +1 -1
  95. package/.claude/skills/n8n-integration-testing-patterns/scripts/validate-config.json +34 -0
  96. package/.claude/skills/n8n-security-testing/SKILL.md +1 -1
  97. package/.claude/skills/n8n-security-testing/evals/n8n-security-testing.yaml +1 -1
  98. package/.claude/skills/n8n-security-testing/scripts/validate-config.json +34 -0
  99. package/.claude/skills/n8n-trigger-testing-strategies/SKILL.md +1 -1
  100. package/.claude/skills/n8n-trigger-testing-strategies/evals/n8n-trigger-testing-strategies.yaml +1 -1
  101. package/.claude/skills/n8n-trigger-testing-strategies/scripts/validate-config.json +34 -0
  102. package/.claude/skills/n8n-workflow-testing-fundamentals/SKILL.md +1 -1
  103. package/.claude/skills/n8n-workflow-testing-fundamentals/evals/n8n-workflow-testing-fundamentals.yaml +1 -1
  104. package/.claude/skills/n8n-workflow-testing-fundamentals/scripts/validate-config.json +35 -0
  105. package/.claude/skills/observability-testing-patterns/SKILL.md +1 -1
  106. package/.claude/skills/pentest-validation/SKILL.md +1 -1
  107. package/.claude/skills/pentest-validation/evals/pentest-validation.yaml +1 -1
  108. package/.claude/skills/pentest-validation/scripts/validate-config.json +12 -0
  109. package/.claude/skills/performance-analysis/SKILL.md +1 -1
  110. package/.claude/skills/performance-analysis/scripts/validate-config.json +36 -0
  111. package/.claude/skills/performance-testing/SKILL.md +1 -1
  112. package/.claude/skills/performance-testing/evals/performance-testing.yaml +1 -1
  113. package/.claude/skills/performance-testing/scripts/validate-config.json +55 -0
  114. package/.claude/skills/qcsd-cicd-swarm/SKILL.md +1 -1
  115. package/.claude/skills/qcsd-development-swarm/SKILL.md +1 -1
  116. package/.claude/skills/qcsd-ideation-swarm/SKILL.md +1 -1
  117. package/.claude/skills/qcsd-ideation-swarm/scripts/validate-config.json +25 -0
  118. package/.claude/skills/qcsd-refinement-swarm/SKILL.md +1 -1
  119. package/.claude/skills/qcsd-refinement-swarm/scripts/validate-config.json +25 -0
  120. package/.claude/skills/qe-chaos-resilience/SKILL.md +1 -1
  121. package/.claude/skills/qe-chaos-resilience/evals/qe-chaos-resilience.yaml +1 -1
  122. package/.claude/skills/qe-chaos-resilience/scripts/validate-config.json +43 -0
  123. package/.claude/skills/qe-code-intelligence/SKILL.md +1 -1
  124. package/.claude/skills/qe-code-intelligence/evals/qe-code-intelligence.yaml +1 -1
  125. package/.claude/skills/qe-code-intelligence/scripts/validate-config.json +41 -0
  126. package/.claude/skills/qe-contract-testing/SKILL.md +1 -1
  127. package/.claude/skills/qe-contract-testing/evals/qe-contract-testing.yaml +1 -1
  128. package/.claude/skills/qe-contract-testing/scripts/validate-config.json +42 -0
  129. package/.claude/skills/qe-coverage-analysis/SKILL.md +1 -1
  130. package/.claude/skills/qe-coverage-analysis/evals/qe-coverage-analysis.yaml +1 -1
  131. package/.claude/skills/qe-coverage-analysis/scripts/validate-config.json +42 -0
  132. package/.claude/skills/qe-defect-intelligence/SKILL.md +1 -1
  133. package/.claude/skills/qe-defect-intelligence/evals/qe-defect-intelligence.yaml +1 -1
  134. package/.claude/skills/qe-defect-intelligence/scripts/validate-config.json +40 -0
  135. package/.claude/skills/qe-iterative-loop/SKILL.md +1 -1
  136. package/.claude/skills/qe-iterative-loop/scripts/validate-config.json +40 -0
  137. package/.claude/skills/qe-learning-optimization/SKILL.md +1 -1
  138. package/.claude/skills/qe-learning-optimization/scripts/validate-config.json +25 -0
  139. package/.claude/skills/qe-quality-assessment/SKILL.md +1 -1
  140. package/.claude/skills/qe-quality-assessment/evals/qe-quality-assessment.yaml +1 -1
  141. package/.claude/skills/qe-quality-assessment/scripts/validate-config.json +47 -0
  142. package/.claude/skills/qe-requirements-validation/SKILL.md +1 -1
  143. package/.claude/skills/qe-requirements-validation/evals/qe-requirements-validation.yaml +1 -1
  144. package/.claude/skills/qe-requirements-validation/scripts/validate-config.json +37 -0
  145. package/.claude/skills/qe-security-compliance/SKILL.md +1 -1
  146. package/.claude/skills/qe-security-compliance/evals/qe-security-compliance.yaml +1 -1
  147. package/.claude/skills/qe-security-compliance/scripts/validate-config.json +41 -0
  148. package/.claude/skills/qe-test-execution/SKILL.md +1 -1
  149. package/.claude/skills/qe-test-execution/evals/qe-test-execution.yaml +1 -1
  150. package/.claude/skills/qe-test-execution/scripts/validate-config.json +37 -0
  151. package/.claude/skills/qe-test-generation/SKILL.md +1 -1
  152. package/.claude/skills/qe-test-generation/scripts/validate-config.json +25 -0
  153. package/.claude/skills/qe-visual-accessibility/SKILL.md +1 -1
  154. package/.claude/skills/qe-visual-accessibility/scripts/validate-config.json +25 -0
  155. package/.claude/skills/quality-metrics/SKILL.md +1 -1
  156. package/.claude/skills/quality-metrics/evals/quality-metrics.yaml +1 -1
  157. package/.claude/skills/quality-metrics/scripts/validate-config.json +43 -0
  158. package/.claude/skills/refactoring-patterns/SKILL.md +1 -1
  159. package/.claude/skills/refactoring-patterns/scripts/validate-config.json +35 -0
  160. package/.claude/skills/regression-testing/SKILL.md +1 -1
  161. package/.claude/skills/regression-testing/evals/regression-testing.yaml +1 -1
  162. package/.claude/skills/regression-testing/scripts/validate-config.json +50 -0
  163. package/.claude/skills/risk-based-testing/SKILL.md +1 -1
  164. package/.claude/skills/risk-based-testing/scripts/validate-config.json +25 -0
  165. package/.claude/skills/security-testing/SKILL.md +1 -1
  166. package/.claude/skills/security-testing/evals/security-testing.yaml +1 -1
  167. package/.claude/skills/security-testing/scripts/validate-config.json +45 -0
  168. package/.claude/skills/security-visual-testing/SKILL.md +1 -1
  169. package/.claude/skills/security-visual-testing/scripts/validate-config.json +45 -0
  170. package/.claude/skills/sherlock-review/SKILL.md +1 -1
  171. package/.claude/skills/sherlock-review/scripts/validate-config.json +35 -0
  172. package/.claude/skills/shift-left-testing/SKILL.md +1 -1
  173. package/.claude/skills/shift-left-testing/scripts/validate-config.json +25 -0
  174. package/.claude/skills/shift-right-testing/SKILL.md +1 -1
  175. package/.claude/skills/shift-right-testing/scripts/validate-config.json +25 -0
  176. package/.claude/skills/skill-builder/SKILL.md +2 -2
  177. package/.claude/skills/skills-manifest.json +1 -1
  178. package/.claude/skills/tdd-london-chicago/SKILL.md +1 -1
  179. package/.claude/skills/tdd-london-chicago/scripts/validate-config.json +43 -0
  180. package/.claude/skills/test-automation-strategy/SKILL.md +1 -1
  181. package/.claude/skills/test-automation-strategy/scripts/validate-config.json +39 -0
  182. package/.claude/skills/test-data-management/SKILL.md +1 -1
  183. package/.claude/skills/test-data-management/evals/test-data-management.yaml +1 -1
  184. package/.claude/skills/test-data-management/scripts/validate-config.json +41 -0
  185. package/.claude/skills/test-design-techniques/SKILL.md +1 -1
  186. package/.claude/skills/test-design-techniques/scripts/validate-config.json +36 -0
  187. package/.claude/skills/test-reporting-analytics/SKILL.md +1 -1
  188. package/.claude/skills/test-reporting-analytics/scripts/validate-config.json +36 -0
  189. package/.claude/skills/testability-scoring/SKILL.md +1 -1
  190. package/.claude/skills/testability-scoring/scripts/validate-config.json +42 -0
  191. package/.claude/skills/trust-tier-manifest.json +106 -106
  192. package/.claude/skills/verification-quality/scripts/validate-config.json +36 -0
  193. package/.claude/skills/visual-testing-advanced/SKILL.md +1 -1
  194. package/.claude/skills/visual-testing-advanced/scripts/validate-config.json +38 -0
  195. package/.claude/skills/wms-testing-patterns/SKILL.md +1 -1
  196. package/.claude/skills/wms-testing-patterns/evals/wms-testing-patterns.yaml +165 -0
  197. package/.claude/skills/wms-testing-patterns/schemas/output.json +150 -0
  198. package/.claude/skills/wms-testing-patterns/scripts/validate-config.json +51 -0
  199. package/README.md +20 -20
  200. package/package.json +6 -6
  201. package/scripts/migrate-validators.cjs +171 -0
  202. package/scripts/postinstall.cjs +57 -0
  203. package/scripts/preinstall.cjs +28 -8
  204. package/scripts/test-schema-validation.js +2 -2
  205. package/scripts/update-skill-manifest.ts +3 -3
  206. package/scripts/validate-skill.cjs +384 -0
  207. package/scripts/validate-tier3.cjs +61 -0
  208. package/scripts/validator-lib.cjs +274 -0
  209. package/v3/CHANGELOG.md +21 -0
  210. package/v3/assets/agents/v3/qe-product-factors-assessor.md +19 -0
  211. package/v3/assets/agents/v3/qe-qx-partner.md +27 -0
  212. package/v3/assets/skills/.validation/README.md +1 -1
  213. package/v3/assets/skills/.validation/skill-validation-mcp-integration.md +1 -1
  214. package/v3/assets/skills/.validation/templates/skill-frontmatter.example.yaml +1 -1
  215. package/v3/assets/skills/accessibility-testing/SKILL.md +1 -1
  216. package/v3/assets/skills/accessibility-testing/scripts/validate-config.json +56 -0
  217. package/v3/assets/skills/api-testing-patterns/SKILL.md +1 -1
  218. package/v3/assets/skills/api-testing-patterns/scripts/validate-config.json +61 -0
  219. package/v3/assets/skills/bug-reporting-excellence/SKILL.md +1 -1
  220. package/v3/assets/skills/bug-reporting-excellence/scripts/validate-config.json +34 -0
  221. package/v3/assets/skills/chaos-engineering-resilience/SKILL.md +1 -1
  222. package/v3/assets/skills/chaos-engineering-resilience/evals/chaos-engineering-resilience.yaml +1 -1
  223. package/v3/assets/skills/chaos-engineering-resilience/scripts/validate-config.json +47 -0
  224. package/v3/assets/skills/code-review-quality/SKILL.md +1 -1
  225. package/v3/assets/skills/code-review-quality/scripts/validate-config.json +34 -0
  226. package/v3/assets/skills/compatibility-testing/SKILL.md +1 -1
  227. package/v3/assets/skills/compatibility-testing/scripts/validate-config.json +44 -0
  228. package/v3/assets/skills/compliance-testing/SKILL.md +1 -1
  229. package/v3/assets/skills/compliance-testing/scripts/validate-config.json +39 -0
  230. package/v3/assets/skills/contract-testing/SKILL.md +1 -1
  231. package/v3/assets/skills/contract-testing/scripts/validate-config.json +59 -0
  232. package/v3/assets/skills/database-testing/SKILL.md +1 -1
  233. package/v3/assets/skills/database-testing/evals/database-testing.yaml +1 -1
  234. package/v3/assets/skills/database-testing/scripts/validate-config.json +48 -0
  235. package/v3/assets/skills/enterprise-integration-testing/SKILL.md +1 -1
  236. package/v3/assets/skills/localization-testing/SKILL.md +1 -1
  237. package/v3/assets/skills/localization-testing/evals/localization-testing.yaml +1 -1
  238. package/v3/assets/skills/localization-testing/scripts/validate-config.json +42 -0
  239. package/v3/assets/skills/middleware-testing-patterns/SKILL.md +1 -1
  240. package/v3/assets/skills/mobile-testing/SKILL.md +1 -1
  241. package/v3/assets/skills/mobile-testing/evals/mobile-testing.yaml +1 -1
  242. package/v3/assets/skills/mobile-testing/scripts/validate-config.json +43 -0
  243. package/v3/assets/skills/mutation-testing/SKILL.md +1 -1
  244. package/v3/assets/skills/mutation-testing/scripts/validate-config.json +44 -0
  245. package/v3/assets/skills/observability-testing-patterns/SKILL.md +1 -1
  246. package/v3/assets/skills/pentest-validation/SKILL.md +1 -1
  247. package/v3/assets/skills/pentest-validation/evals/pentest-validation.yaml +1 -1
  248. package/v3/assets/skills/performance-testing/SKILL.md +1 -1
  249. package/v3/assets/skills/performance-testing/evals/performance-testing.yaml +1 -1
  250. package/v3/assets/skills/performance-testing/scripts/validate-config.json +55 -0
  251. package/v3/assets/skills/qcsd-cicd-swarm/SKILL.md +1 -1
  252. package/v3/assets/skills/qcsd-development-swarm/SKILL.md +1 -1
  253. package/v3/assets/skills/qcsd-ideation-swarm/SKILL.md +1 -1
  254. package/v3/assets/skills/qcsd-refinement-swarm/SKILL.md +1 -1
  255. package/v3/assets/skills/qe-chaos-resilience/SKILL.md +1 -1
  256. package/v3/assets/skills/qe-chaos-resilience/evals/qe-chaos-resilience.yaml +1 -1
  257. package/v3/assets/skills/qe-chaos-resilience/scripts/validate-config.json +43 -0
  258. package/v3/assets/skills/qe-code-intelligence/SKILL.md +1 -1
  259. package/v3/assets/skills/qe-code-intelligence/evals/qe-code-intelligence.yaml +1 -1
  260. package/v3/assets/skills/qe-code-intelligence/scripts/validate-config.json +41 -0
  261. package/v3/assets/skills/qe-contract-testing/SKILL.md +1 -1
  262. package/v3/assets/skills/qe-contract-testing/evals/qe-contract-testing.yaml +1 -1
  263. package/v3/assets/skills/qe-contract-testing/scripts/validate-config.json +42 -0
  264. package/v3/assets/skills/qe-coverage-analysis/SKILL.md +1 -1
  265. package/v3/assets/skills/qe-coverage-analysis/evals/qe-coverage-analysis.yaml +1 -1
  266. package/v3/assets/skills/qe-coverage-analysis/scripts/validate-config.json +42 -0
  267. package/v3/assets/skills/qe-defect-intelligence/SKILL.md +1 -1
  268. package/v3/assets/skills/qe-defect-intelligence/evals/qe-defect-intelligence.yaml +1 -1
  269. package/v3/assets/skills/qe-defect-intelligence/scripts/validate-config.json +40 -0
  270. package/v3/assets/skills/qe-iterative-loop/SKILL.md +1 -1
  271. package/v3/assets/skills/qe-iterative-loop/scripts/validate-config.json +40 -0
  272. package/v3/assets/skills/qe-learning-optimization/SKILL.md +1 -1
  273. package/v3/assets/skills/qe-learning-optimization/scripts/validate-config.json +25 -0
  274. package/v3/assets/skills/qe-quality-assessment/SKILL.md +1 -1
  275. package/v3/assets/skills/qe-quality-assessment/evals/qe-quality-assessment.yaml +1 -1
  276. package/v3/assets/skills/qe-quality-assessment/scripts/validate-config.json +47 -0
  277. package/v3/assets/skills/qe-requirements-validation/SKILL.md +1 -1
  278. package/v3/assets/skills/qe-requirements-validation/evals/qe-requirements-validation.yaml +1 -1
  279. package/v3/assets/skills/qe-requirements-validation/scripts/validate-config.json +37 -0
  280. package/v3/assets/skills/qe-security-compliance/SKILL.md +1 -1
  281. package/v3/assets/skills/qe-security-compliance/evals/qe-security-compliance.yaml +1 -1
  282. package/v3/assets/skills/qe-security-compliance/scripts/validate-config.json +41 -0
  283. package/v3/assets/skills/qe-test-execution/SKILL.md +1 -1
  284. package/v3/assets/skills/qe-test-execution/evals/qe-test-execution.yaml +1 -1
  285. package/v3/assets/skills/qe-test-execution/scripts/validate-config.json +37 -0
  286. package/v3/assets/skills/qe-test-generation/SKILL.md +1 -1
  287. package/v3/assets/skills/qe-test-generation/scripts/validate-config.json +25 -0
  288. package/v3/assets/skills/qe-visual-accessibility/SKILL.md +1 -1
  289. package/v3/assets/skills/qe-visual-accessibility/scripts/validate-config.json +25 -0
  290. package/v3/assets/skills/quality-metrics/SKILL.md +1 -1
  291. package/v3/assets/skills/quality-metrics/evals/quality-metrics.yaml +1 -1
  292. package/v3/assets/skills/quality-metrics/scripts/validate-config.json +43 -0
  293. package/v3/assets/skills/refactoring-patterns/SKILL.md +1 -1
  294. package/v3/assets/skills/refactoring-patterns/scripts/validate-config.json +35 -0
  295. package/v3/assets/skills/regression-testing/SKILL.md +1 -1
  296. package/v3/assets/skills/regression-testing/evals/regression-testing.yaml +1 -1
  297. package/v3/assets/skills/regression-testing/scripts/validate-config.json +50 -0
  298. package/v3/assets/skills/risk-based-testing/SKILL.md +1 -1
  299. package/v3/assets/skills/risk-based-testing/scripts/validate-config.json +25 -0
  300. package/v3/assets/skills/security-testing/SKILL.md +1 -1
  301. package/v3/assets/skills/security-testing/evals/security-testing.yaml +1 -1
  302. package/v3/assets/skills/security-testing/scripts/validate-config.json +45 -0
  303. package/v3/assets/skills/security-visual-testing/SKILL.md +1 -1
  304. package/v3/assets/skills/shift-left-testing/SKILL.md +1 -1
  305. package/v3/assets/skills/shift-left-testing/scripts/validate-config.json +25 -0
  306. package/v3/assets/skills/shift-right-testing/SKILL.md +1 -1
  307. package/v3/assets/skills/shift-right-testing/scripts/validate-config.json +25 -0
  308. package/v3/assets/skills/tdd-london-chicago/SKILL.md +1 -1
  309. package/v3/assets/skills/tdd-london-chicago/scripts/validate-config.json +43 -0
  310. package/v3/assets/skills/test-automation-strategy/SKILL.md +1 -1
  311. package/v3/assets/skills/test-automation-strategy/scripts/validate-config.json +39 -0
  312. package/v3/assets/skills/test-data-management/SKILL.md +1 -1
  313. package/v3/assets/skills/test-data-management/evals/test-data-management.yaml +1 -1
  314. package/v3/assets/skills/test-data-management/scripts/validate-config.json +41 -0
  315. package/v3/assets/skills/test-design-techniques/SKILL.md +1 -1
  316. package/v3/assets/skills/test-design-techniques/scripts/validate-config.json +36 -0
  317. package/v3/assets/skills/test-reporting-analytics/SKILL.md +1 -1
  318. package/v3/assets/skills/test-reporting-analytics/scripts/validate-config.json +36 -0
  319. package/v3/assets/skills/verification-quality/SKILL.md +0 -6
  320. package/v3/assets/skills/verification-quality/scripts/validate-config.json +36 -0
  321. package/v3/assets/skills/visual-testing-advanced/SKILL.md +1 -1
  322. package/v3/assets/skills/visual-testing-advanced/scripts/validate-config.json +38 -0
  323. package/v3/assets/skills/wms-testing-patterns/SKILL.md +1 -1
  324. package/v3/dist/adapters/claude-flow/model-router-bridge.js +3 -3
  325. package/v3/dist/adapters/claude-flow/model-router-bridge.js.map +1 -1
  326. package/v3/dist/adapters/claude-flow/pretrain-bridge.js +4 -4
  327. package/v3/dist/adapters/claude-flow/pretrain-bridge.js.map +1 -1
  328. package/v3/dist/adapters/claude-flow/trajectory-bridge.js +4 -4
  329. package/v3/dist/adapters/claude-flow/trajectory-bridge.js.map +1 -1
  330. package/v3/dist/cli/bundle.js +135 -153
  331. package/v3/dist/cli/commands/claude-flow-setup.js +3 -3
  332. package/v3/dist/cli/commands/claude-flow-setup.js.map +1 -1
  333. package/v3/dist/cli/commands/completions.d.ts.map +1 -1
  334. package/v3/dist/cli/commands/completions.js +2 -1
  335. package/v3/dist/cli/commands/completions.js.map +1 -1
  336. package/v3/dist/cli/commands/hooks.js +8 -8
  337. package/v3/dist/cli/commands/hooks.js.map +1 -1
  338. package/v3/dist/cli/completions/index.d.ts.map +1 -1
  339. package/v3/dist/cli/completions/index.js +4 -3
  340. package/v3/dist/cli/completions/index.js.map +1 -1
  341. package/v3/dist/domains/code-intelligence/services/metric-collector/test-counter.js +5 -5
  342. package/v3/dist/domains/code-intelligence/services/metric-collector/test-counter.js.map +1 -1
  343. package/v3/dist/init/enhancements/claude-flow-adapter.d.ts.map +1 -1
  344. package/v3/dist/init/enhancements/claude-flow-adapter.js +15 -12
  345. package/v3/dist/init/enhancements/claude-flow-adapter.js.map +1 -1
  346. package/v3/dist/init/enhancements/detector.js +2 -2
  347. package/v3/dist/init/enhancements/detector.js.map +1 -1
  348. package/v3/dist/init/init-wizard.d.ts.map +1 -1
  349. package/v3/dist/init/init-wizard.js +17 -33
  350. package/v3/dist/init/init-wizard.js.map +1 -1
  351. package/v3/dist/init/phases/07-hooks.js +9 -9
  352. package/v3/dist/init/phases/07-hooks.js.map +1 -1
  353. package/v3/dist/init/phases/10-workers.d.ts.map +1 -1
  354. package/v3/dist/init/phases/10-workers.js +74 -85
  355. package/v3/dist/init/phases/10-workers.js.map +1 -1
  356. package/v3/dist/kernel/hybrid-backend.d.ts.map +1 -1
  357. package/v3/dist/kernel/hybrid-backend.js +4 -1
  358. package/v3/dist/kernel/hybrid-backend.js.map +1 -1
  359. package/v3/dist/kernel/memory-backend.d.ts.map +1 -1
  360. package/v3/dist/kernel/memory-backend.js +3 -0
  361. package/v3/dist/kernel/memory-backend.js.map +1 -1
  362. package/v3/dist/mcp/bundle.js +1339 -18
  363. package/v3/dist/mcp/tools/index.d.ts +2 -1
  364. package/v3/dist/mcp/tools/index.d.ts.map +1 -1
  365. package/v3/dist/mcp/tools/index.js +5 -1
  366. package/v3/dist/mcp/tools/index.js.map +1 -1
  367. package/v3/dist/mcp/tools/qx-analysis/analyze.d.ts +33 -0
  368. package/v3/dist/mcp/tools/qx-analysis/analyze.d.ts.map +1 -0
  369. package/v3/dist/mcp/tools/qx-analysis/analyze.js +679 -0
  370. package/v3/dist/mcp/tools/qx-analysis/analyze.js.map +1 -0
  371. package/v3/dist/mcp/tools/qx-analysis/heuristics-engine.d.ts +38 -0
  372. package/v3/dist/mcp/tools/qx-analysis/heuristics-engine.d.ts.map +1 -0
  373. package/v3/dist/mcp/tools/qx-analysis/heuristics-engine.js +458 -0
  374. package/v3/dist/mcp/tools/qx-analysis/heuristics-engine.js.map +1 -0
  375. package/v3/dist/mcp/tools/qx-analysis/impact-analyzer.d.ts +16 -0
  376. package/v3/dist/mcp/tools/qx-analysis/impact-analyzer.d.ts.map +1 -0
  377. package/v3/dist/mcp/tools/qx-analysis/impact-analyzer.js +175 -0
  378. package/v3/dist/mcp/tools/qx-analysis/impact-analyzer.js.map +1 -0
  379. package/v3/dist/mcp/tools/qx-analysis/index.d.ts +27 -0
  380. package/v3/dist/mcp/tools/qx-analysis/index.d.ts.map +1 -0
  381. package/v3/dist/mcp/tools/qx-analysis/index.js +34 -0
  382. package/v3/dist/mcp/tools/qx-analysis/index.js.map +1 -0
  383. package/v3/dist/mcp/tools/qx-analysis/oracle-detector.d.ts +22 -0
  384. package/v3/dist/mcp/tools/qx-analysis/oracle-detector.d.ts.map +1 -0
  385. package/v3/dist/mcp/tools/qx-analysis/oracle-detector.js +194 -0
  386. package/v3/dist/mcp/tools/qx-analysis/oracle-detector.js.map +1 -0
  387. package/v3/dist/mcp/tools/qx-analysis/types.d.ts +278 -0
  388. package/v3/dist/mcp/tools/qx-analysis/types.d.ts.map +1 -0
  389. package/v3/dist/mcp/tools/qx-analysis/types.js +46 -0
  390. package/v3/dist/mcp/tools/qx-analysis/types.js.map +1 -0
  391. package/v3/dist/mcp/tools/registry.d.ts +1 -0
  392. package/v3/dist/mcp/tools/registry.d.ts.map +1 -1
  393. package/v3/dist/mcp/tools/registry.js +5 -0
  394. package/v3/dist/mcp/tools/registry.js.map +1 -1
  395. package/v3/package.json +5 -5
  396. package/.claude/skills/.validation/templates/validate.template.sh +0 -1060
  397. package/.claude/skills/.validation/templates/validator-lib.sh +0 -1031
  398. package/.claude/skills/a11y-ally/scripts/validate.sh +0 -690
  399. package/.claude/skills/accessibility-testing/scripts/validate.sh +0 -943
  400. package/.claude/skills/api-testing-patterns/scripts/validate.sh +0 -931
  401. package/.claude/skills/brutal-honesty-review/scripts/validate.sh +0 -130
  402. package/.claude/skills/bug-reporting-excellence/scripts/validate.sh +0 -108
  403. package/.claude/skills/chaos-engineering-resilience/scripts/validate.sh +0 -1107
  404. package/.claude/skills/cicd-pipeline-qe-orchestrator/scripts/validate.sh +0 -310
  405. package/.claude/skills/code-review-quality/scripts/validate.sh +0 -113
  406. package/.claude/skills/compatibility-testing/scripts/validate.sh +0 -605
  407. package/.claude/skills/compliance-testing/scripts/validate.sh +0 -888
  408. package/.claude/skills/contract-testing/scripts/validate.sh +0 -1033
  409. package/.claude/skills/database-testing/scripts/validate.sh +0 -1099
  410. package/.claude/skills/localization-testing/scripts/validate.sh +0 -131
  411. package/.claude/skills/mobile-testing/scripts/validate.sh +0 -127
  412. package/.claude/skills/mutation-testing/scripts/validate.sh +0 -992
  413. package/.claude/skills/n8n-expression-testing/scripts/validate.sh +0 -162
  414. package/.claude/skills/n8n-integration-testing-patterns/scripts/validate.sh +0 -104
  415. package/.claude/skills/n8n-security-testing/scripts/validate.sh +0 -120
  416. package/.claude/skills/n8n-trigger-testing-strategies/scripts/validate.sh +0 -121
  417. package/.claude/skills/n8n-workflow-testing-fundamentals/scripts/validate.sh +0 -126
  418. package/.claude/skills/pentest-validation/scripts/validate.sh +0 -402
  419. package/.claude/skills/performance-analysis/scripts/validate.sh +0 -63
  420. package/.claude/skills/performance-testing/scripts/validate.sh +0 -1090
  421. package/.claude/skills/qcsd-ideation-swarm/scripts/validate.sh +0 -56
  422. package/.claude/skills/qcsd-refinement-swarm/scripts/validate.sh +0 -56
  423. package/.claude/skills/qe-chaos-resilience/scripts/validate.sh +0 -401
  424. package/.claude/skills/qe-code-intelligence/scripts/validate.sh +0 -408
  425. package/.claude/skills/qe-contract-testing/scripts/validate.sh +0 -421
  426. package/.claude/skills/qe-coverage-analysis/scripts/validate.sh +0 -453
  427. package/.claude/skills/qe-defect-intelligence/scripts/validate.sh +0 -466
  428. package/.claude/skills/qe-iterative-loop/scripts/validate.sh +0 -474
  429. package/.claude/skills/qe-learning-optimization/scripts/validate.sh +0 -56
  430. package/.claude/skills/qe-quality-assessment/scripts/validate.sh +0 -352
  431. package/.claude/skills/qe-requirements-validation/scripts/validate.sh +0 -275
  432. package/.claude/skills/qe-security-compliance/scripts/validate.sh +0 -305
  433. package/.claude/skills/qe-test-execution/scripts/validate.sh +0 -323
  434. package/.claude/skills/qe-test-generation/scripts/validate.sh +0 -56
  435. package/.claude/skills/qe-visual-accessibility/scripts/validate.sh +0 -56
  436. package/.claude/skills/quality-metrics/scripts/validate.sh +0 -434
  437. package/.claude/skills/refactoring-patterns/scripts/validate.sh +0 -241
  438. package/.claude/skills/regression-testing/scripts/validate.sh +0 -130
  439. package/.claude/skills/risk-based-testing/scripts/validate.sh +0 -56
  440. package/.claude/skills/security-testing/scripts/validate.sh +0 -967
  441. package/.claude/skills/security-visual-testing/scripts/validate.sh +0 -748
  442. package/.claude/skills/sherlock-review/scripts/validate.sh +0 -115
  443. package/.claude/skills/shift-left-testing/scripts/validate.sh +0 -56
  444. package/.claude/skills/shift-right-testing/scripts/validate.sh +0 -56
  445. package/.claude/skills/tdd-london-chicago/scripts/validate.sh +0 -214
  446. package/.claude/skills/test-automation-strategy/scripts/validate.sh +0 -195
  447. package/.claude/skills/test-data-management/scripts/validate.sh +0 -137
  448. package/.claude/skills/test-design-techniques/scripts/validate.sh +0 -91
  449. package/.claude/skills/test-reporting-analytics/scripts/validate.sh +0 -77
  450. package/.claude/skills/testability-scoring/scripts/validate.sh +0 -891
  451. package/.claude/skills/verification-quality/scripts/validate.sh +0 -77
  452. package/.claude/skills/visual-testing-advanced/scripts/validate.sh +0 -77
  453. package/v3/assets/skills/.validation/templates/validate.template.sh +0 -1060
  454. package/v3/assets/skills/.validation/templates/validator-lib.sh +0 -1031
  455. package/v3/assets/skills/accessibility-testing/scripts/validate.sh +0 -943
  456. package/v3/assets/skills/api-testing-patterns/scripts/validate.sh +0 -931
  457. package/v3/assets/skills/aqe-v2-v3-migration/skill.md +0 -326
  458. package/v3/assets/skills/bug-reporting-excellence/scripts/validate.sh +0 -108
  459. package/v3/assets/skills/chaos-engineering-resilience/scripts/validate.sh +0 -1107
  460. package/v3/assets/skills/code-review-quality/scripts/validate.sh +0 -113
  461. package/v3/assets/skills/compatibility-testing/scripts/validate.sh +0 -605
  462. package/v3/assets/skills/compliance-testing/scripts/validate.sh +0 -888
  463. package/v3/assets/skills/contract-testing/scripts/validate.sh +0 -1033
  464. package/v3/assets/skills/database-testing/scripts/validate.sh +0 -1099
  465. package/v3/assets/skills/localization-testing/scripts/validate.sh +0 -131
  466. package/v3/assets/skills/mobile-testing/scripts/validate.sh +0 -127
  467. package/v3/assets/skills/mutation-testing/scripts/validate.sh +0 -992
  468. package/v3/assets/skills/n8n-expression-testing/scripts/validate.sh +0 -162
  469. package/v3/assets/skills/n8n-integration-testing-patterns/scripts/validate.sh +0 -104
  470. package/v3/assets/skills/n8n-security-testing/scripts/validate.sh +0 -120
  471. package/v3/assets/skills/n8n-trigger-testing-strategies/scripts/validate.sh +0 -121
  472. package/v3/assets/skills/n8n-workflow-testing-fundamentals/scripts/validate.sh +0 -126
  473. package/v3/assets/skills/pentest-validation/scripts/validate.sh +0 -402
  474. package/v3/assets/skills/performance-testing/scripts/validate.sh +0 -1090
  475. package/v3/assets/skills/qe-chaos-resilience/scripts/validate.sh +0 -401
  476. package/v3/assets/skills/qe-code-intelligence/scripts/validate.sh +0 -408
  477. package/v3/assets/skills/qe-contract-testing/scripts/validate.sh +0 -421
  478. package/v3/assets/skills/qe-coverage-analysis/scripts/validate.sh +0 -453
  479. package/v3/assets/skills/qe-defect-intelligence/scripts/validate.sh +0 -466
  480. package/v3/assets/skills/qe-iterative-loop/scripts/validate.sh +0 -474
  481. package/v3/assets/skills/qe-learning-optimization/scripts/validate.sh +0 -56
  482. package/v3/assets/skills/qe-quality-assessment/scripts/validate.sh +0 -352
  483. package/v3/assets/skills/qe-requirements-validation/scripts/validate.sh +0 -275
  484. package/v3/assets/skills/qe-security-compliance/scripts/validate.sh +0 -305
  485. package/v3/assets/skills/qe-test-execution/scripts/validate.sh +0 -323
  486. package/v3/assets/skills/qe-test-generation/scripts/validate.sh +0 -56
  487. package/v3/assets/skills/qe-visual-accessibility/scripts/validate.sh +0 -56
  488. package/v3/assets/skills/quality-metrics/scripts/validate.sh +0 -434
  489. package/v3/assets/skills/refactoring-patterns/scripts/validate.sh +0 -241
  490. package/v3/assets/skills/regression-testing/scripts/validate.sh +0 -130
  491. package/v3/assets/skills/risk-based-testing/scripts/validate.sh +0 -56
  492. package/v3/assets/skills/security-testing/scripts/validate.sh +0 -967
  493. package/v3/assets/skills/security-visual-testing/scripts/validate.sh +0 -748
  494. package/v3/assets/skills/shift-left-testing/scripts/validate.sh +0 -56
  495. package/v3/assets/skills/shift-right-testing/scripts/validate.sh +0 -56
  496. package/v3/assets/skills/tdd-london-chicago/scripts/validate.sh +0 -214
  497. package/v3/assets/skills/test-automation-strategy/scripts/validate.sh +0 -195
  498. package/v3/assets/skills/test-data-management/scripts/validate.sh +0 -137
  499. package/v3/assets/skills/test-design-techniques/scripts/validate.sh +0 -91
  500. package/v3/assets/skills/test-reporting-analytics/scripts/validate.sh +0 -77
  501. package/v3/assets/skills/verification-quality/scripts/validate.sh +0 -77
  502. package/v3/assets/skills/visual-testing-advanced/scripts/validate.sh +0 -77
@@ -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 2>/dev/null", {
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} 2>/dev/null`,
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} 2>/dev/null`,
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} 2>/dev/null`,
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 2>/dev/null", {
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)} 2>/dev/null`,
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} 2>/dev/null`,
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 2>/dev/null", {
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} 2>/dev/null`,
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} 2>/dev/null`,
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} 2>/dev/null`,
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 2>/dev/null",
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 2>/dev/null",
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
- 'cargo test --list 2>/dev/null || echo ""',
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
- 'pytest --collect-only -q 2>/dev/null || echo ""',
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 ".*" ./... 2>/dev/null || echo ""',
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) {