agentic-qe 3.14.2 → 3.14.4

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 (760) hide show
  1. package/.claude/agents/v3/qe-coverage-specialist.md +1 -1
  2. package/.claude/agents/v3/qe-fleet-commander.md +1 -1
  3. package/.claude/agents/v3/qe-pentest-validator.md +1 -1
  4. package/.claude/agents/v3/qe-queen-coordinator.md +1 -1
  5. package/.claude/agents/v3/qe-risk-assessor.md +1 -1
  6. package/.claude/agents/v3/qe-root-cause-analyzer.md +1 -1
  7. package/.claude/agents/v3/qe-security-auditor.md +1 -1
  8. package/.claude/agents/v3/qe-test-architect.md +1 -1
  9. package/.claude/commands/aqe-costs.md +10 -10
  10. package/.claude/helpers/advisor-call.cjs +3 -3
  11. package/.claude/helpers/v3/advisor-call.cjs +3 -3
  12. package/.claude/skills/.validation/examples/chaos-engineering-output.example.json +1 -1
  13. package/.claude/skills/.validation/examples/performance-testing-output.example.json +1 -1
  14. package/.claude/skills/.validation/examples/security-testing-output.example.json +1 -1
  15. package/.claude/skills/.validation/examples/testability-scoring-output.example.json +1 -1
  16. package/.claude/skills/.validation/schemas/skill-eval.schema.json +4 -1
  17. package/.claude/skills/.validation/schemas/skill-frontmatter.schema.json +1 -1
  18. package/.claude/skills/.validation/schemas/skill-output.template.json +1 -1
  19. package/.claude/skills/.validation/templates/eval.template.yaml +1 -1
  20. package/.claude/skills/.validation/templates/security-testing-eval.template.yaml +1 -1
  21. package/.claude/skills/.validation/templates/skill-frontmatter.example.yaml +1 -1
  22. package/.claude/skills/.validation/test-data/sample-output.json +1 -1
  23. package/.claude/skills/a11y-ally/SKILL.md +1 -1
  24. package/.claude/skills/a11y-ally/evals/a11y-ally.yaml +1 -1
  25. package/.claude/skills/accessibility-testing/evals/accessibility-testing.yaml +1 -1
  26. package/.claude/skills/api-testing-patterns/evals/api-testing-patterns.yaml +1 -1
  27. package/.claude/skills/chaos-engineering-resilience/evals/chaos-engineering-resilience.yaml +1 -1
  28. package/.claude/skills/cicd-pipeline-qe-orchestrator/evals/cicd-pipeline-qe-orchestrator.yaml +1 -1
  29. package/.claude/skills/compatibility-testing/evals/compatibility-testing.yaml +1 -1
  30. package/.claude/skills/compliance-testing/evals/compliance-testing.yaml +1 -1
  31. package/.claude/skills/contract-testing/evals/contract-testing.yaml +1 -1
  32. package/.claude/skills/database-testing/evals/database-testing.yaml +1 -1
  33. package/.claude/skills/enterprise-integration-testing/evals/enterprise-integration-testing.yaml +1 -1
  34. package/.claude/skills/localization-testing/evals/localization-testing.yaml +1 -1
  35. package/.claude/skills/middleware-testing-patterns/evals/middleware-testing-patterns.yaml +1 -1
  36. package/.claude/skills/mobile-testing/evals/mobile-testing.yaml +1 -1
  37. package/.claude/skills/mutation-testing/evals/mutation-testing.yaml +1 -1
  38. package/.claude/skills/mutation-testing/test-data/sample-output.json +1 -1
  39. package/.claude/skills/n8n-expression-testing/evals/n8n-expression-testing.yaml +1 -1
  40. package/.claude/skills/n8n-integration-testing-patterns/evals/n8n-integration-testing-patterns.yaml +1 -1
  41. package/.claude/skills/n8n-security-testing/evals/n8n-security-testing.yaml +1 -1
  42. package/.claude/skills/n8n-trigger-testing-strategies/evals/n8n-trigger-testing-strategies.yaml +1 -1
  43. package/.claude/skills/n8n-workflow-testing-fundamentals/evals/n8n-workflow-testing-fundamentals.yaml +1 -1
  44. package/.claude/skills/observability-testing-patterns/evals/observability-testing-patterns.yaml +1 -1
  45. package/.claude/skills/pentest-validation/evals/pentest-validation.yaml +1 -1
  46. package/.claude/skills/performance-testing/evals/performance-testing.yaml +1 -1
  47. package/.claude/skills/qcsd-cicd-swarm/evals/qcsd-cicd-swarm.yaml +1 -1
  48. package/.claude/skills/qcsd-development-swarm/evals/qcsd-development-swarm.yaml +1 -1
  49. package/.claude/skills/qcsd-ideation-swarm/evals/qcsd-ideation-swarm.yaml +1 -1
  50. package/.claude/skills/qcsd-production-swarm/evals/qcsd-production-swarm.yaml +1 -1
  51. package/.claude/skills/qcsd-refinement-swarm/evals/qcsd-refinement-swarm.yaml +1 -1
  52. package/.claude/skills/qe-browser/evals/qe-browser.yaml +1 -1
  53. package/.claude/skills/qe-chaos-resilience/evals/qe-chaos-resilience.yaml +1 -1
  54. package/.claude/skills/qe-code-intelligence/evals/qe-code-intelligence.yaml +1 -1
  55. package/.claude/skills/qe-coverage-analysis/evals/qe-coverage-analysis.yaml +1 -1
  56. package/.claude/skills/qe-defect-intelligence/evals/qe-defect-intelligence.yaml +1 -1
  57. package/.claude/skills/qe-learning-optimization/evals/qe-learning-optimization.yaml +2 -2
  58. package/.claude/skills/qe-quality-assessment/evals/qe-quality-assessment.yaml +1 -1
  59. package/.claude/skills/qe-requirements-validation/evals/qe-requirements-validation.yaml +1 -1
  60. package/.claude/skills/qe-test-execution/evals/qe-test-execution.yaml +1 -1
  61. package/.claude/skills/qe-test-generation/evals/qe-test-generation.yaml +1 -1
  62. package/.claude/skills/qe-visual-accessibility/evals/qe-visual-accessibility.yaml +1 -1
  63. package/.claude/skills/quality-metrics/evals/quality-metrics.yaml +1 -1
  64. package/.claude/skills/regression-testing/evals/regression-testing.yaml +1 -1
  65. package/.claude/skills/risk-based-testing/evals/risk-based-testing.yaml +1 -1
  66. package/.claude/skills/security-testing/evals/security-testing.yaml +1 -1
  67. package/.claude/skills/security-visual-testing/evals/security-visual-testing.yaml +1 -1
  68. package/.claude/skills/shift-left-testing/evals/shift-left-testing.yaml +1 -1
  69. package/.claude/skills/shift-right-testing/evals/shift-right-testing.yaml +1 -1
  70. package/.claude/skills/skills-manifest.json +1 -1
  71. package/.claude/skills/test-automation-strategy/evals/test-automation-strategy.yaml +1 -1
  72. package/.claude/skills/test-data-management/evals/test-data-management.yaml +1 -1
  73. package/.claude/skills/test-design-techniques/evals/test-design-techniques.yaml +1 -1
  74. package/.claude/skills/test-reporting-analytics/evals/test-reporting-analytics.yaml +1 -1
  75. package/.claude/skills/testability-scoring/evals/testability-scoring.yaml +1 -1
  76. package/.claude/skills/validation-pipeline/evals/validation-pipeline.yaml +1 -1
  77. package/.claude/skills/verification-quality/evals/verification-quality.yaml +1 -1
  78. package/.claude/skills/visual-testing-advanced/evals/visual-testing-advanced.yaml +1 -1
  79. package/.claude/skills/wms-testing-patterns/evals/wms-testing-patterns.yaml +1 -1
  80. package/.opencode/agents/collective-intelligence-coordinator.yaml +1 -1
  81. package/.opencode/agents/ddd-domain-expert.yaml +1 -1
  82. package/.opencode/agents/memory-specialist.yaml +1 -1
  83. package/.opencode/agents/performance-engineer.yaml +1 -1
  84. package/.opencode/agents/qe-accessibility-auditor.yaml +1 -1
  85. package/.opencode/agents/qe-api-contract-validator.yaml +1 -1
  86. package/.opencode/agents/qe-bdd-generator.yaml +1 -1
  87. package/.opencode/agents/qe-chaos-engineer.yaml +1 -1
  88. package/.opencode/agents/qe-code-complexity.yaml +1 -1
  89. package/.opencode/agents/qe-code-intelligence.yaml +1 -1
  90. package/.opencode/agents/qe-coverage-analyzer.yaml +1 -1
  91. package/.opencode/agents/qe-defect-predictor.yaml +1 -1
  92. package/.opencode/agents/qe-dependency-mapper.yaml +1 -1
  93. package/.opencode/agents/qe-deployment-advisor.yaml +1 -1
  94. package/.opencode/agents/qe-devils-advocate.yaml +1 -1
  95. package/.opencode/agents/qe-flaky-hunter.yaml +1 -1
  96. package/.opencode/agents/qe-fleet-commander.yaml +1 -1
  97. package/.opencode/agents/qe-gap-detector.yaml +1 -1
  98. package/.opencode/agents/qe-graphql-tester.yaml +1 -1
  99. package/.opencode/agents/qe-impact-analyzer.yaml +1 -1
  100. package/.opencode/agents/qe-integration-architect.yaml +1 -1
  101. package/.opencode/agents/qe-integration-tester.yaml +1 -1
  102. package/.opencode/agents/qe-kg-builder.yaml +1 -1
  103. package/.opencode/agents/qe-learning-coordinator.yaml +1 -1
  104. package/.opencode/agents/qe-load-tester.yaml +1 -1
  105. package/.opencode/agents/qe-message-broker-tester.yaml +1 -1
  106. package/.opencode/agents/qe-metrics-optimizer.yaml +1 -1
  107. package/.opencode/agents/qe-middleware-validator.yaml +1 -1
  108. package/.opencode/agents/qe-mutation-tester.yaml +1 -1
  109. package/.opencode/agents/qe-odata-contract-tester.yaml +1 -1
  110. package/.opencode/agents/qe-parallel-executor.yaml +1 -1
  111. package/.opencode/agents/qe-pattern-learner.yaml +1 -1
  112. package/.opencode/agents/qe-pentest-validator.yaml +1 -1
  113. package/.opencode/agents/qe-performance-tester.yaml +1 -1
  114. package/.opencode/agents/qe-product-factors-assessor.yaml +1 -1
  115. package/.opencode/agents/qe-property-tester.yaml +1 -1
  116. package/.opencode/agents/qe-quality-criteria-recommender.yaml +1 -1
  117. package/.opencode/agents/qe-quality-gate.yaml +1 -1
  118. package/.opencode/agents/qe-queen-coordinator.yaml +1 -1
  119. package/.opencode/agents/qe-qx-partner.yaml +1 -1
  120. package/.opencode/agents/qe-regression-analyzer.yaml +1 -1
  121. package/.opencode/agents/qe-requirements-validator.yaml +1 -1
  122. package/.opencode/agents/qe-responsive-tester.yaml +1 -1
  123. package/.opencode/agents/qe-retry-handler.yaml +1 -1
  124. package/.opencode/agents/qe-risk-assessor.yaml +1 -1
  125. package/.opencode/agents/qe-root-cause-analyzer.yaml +1 -1
  126. package/.opencode/agents/qe-sap-idoc-tester.yaml +1 -1
  127. package/.opencode/agents/qe-sap-rfc-tester.yaml +1 -1
  128. package/.opencode/agents/qe-security-auditor.yaml +1 -1
  129. package/.opencode/agents/qe-security-scanner.yaml +1 -1
  130. package/.opencode/agents/qe-soap-tester.yaml +1 -1
  131. package/.opencode/agents/qe-sod-analyzer.yaml +1 -1
  132. package/.opencode/agents/qe-tdd-specialist.yaml +1 -1
  133. package/.opencode/agents/qe-test-generator.yaml +1 -1
  134. package/.opencode/agents/qe-test-idea-rewriter.yaml +1 -1
  135. package/.opencode/agents/qe-transfer-specialist.yaml +1 -1
  136. package/.opencode/agents/qe-visual-tester.yaml +1 -1
  137. package/.opencode/agents/security-architect.yaml +1 -1
  138. package/.opencode/agents/security-auditor.yaml +1 -1
  139. package/CHANGELOG.md +183 -0
  140. package/README.md +7 -2
  141. package/assets/agents/v3/helpers/advisor-call.cjs +3 -3
  142. package/assets/agents/v3/qe-coverage-specialist.md +1 -1
  143. package/assets/agents/v3/qe-fleet-commander.md +1 -1
  144. package/assets/agents/v3/qe-pentest-validator.md +1 -1
  145. package/assets/agents/v3/qe-queen-coordinator.md +1 -1
  146. package/assets/agents/v3/qe-risk-assessor.md +1 -1
  147. package/assets/agents/v3/qe-root-cause-analyzer.md +1 -1
  148. package/assets/agents/v3/qe-security-auditor.md +1 -1
  149. package/assets/agents/v3/qe-test-architect.md +1 -1
  150. package/assets/skills/.validation/examples/chaos-engineering-output.example.json +1 -1
  151. package/assets/skills/.validation/examples/performance-testing-output.example.json +1 -1
  152. package/assets/skills/.validation/examples/security-testing-output.example.json +1 -1
  153. package/assets/skills/.validation/examples/testability-scoring-output.example.json +1 -1
  154. package/assets/skills/.validation/schemas/skill-eval.schema.json +4 -1
  155. package/assets/skills/.validation/schemas/skill-frontmatter.schema.json +1 -1
  156. package/assets/skills/.validation/schemas/skill-output.template.json +1 -1
  157. package/assets/skills/.validation/templates/eval.template.yaml +1 -1
  158. package/assets/skills/.validation/templates/security-testing-eval.template.yaml +1 -1
  159. package/assets/skills/.validation/templates/skill-frontmatter.example.yaml +1 -1
  160. package/assets/skills/.validation/test-data/sample-output.json +1 -1
  161. package/assets/skills/a11y-ally/SKILL.md +1 -1
  162. package/assets/skills/a11y-ally/evals/a11y-ally.yaml +1 -1
  163. package/assets/skills/accessibility-testing/evals/accessibility-testing.yaml +1 -1
  164. package/assets/skills/api-testing-patterns/evals/api-testing-patterns.yaml +1 -1
  165. package/assets/skills/chaos-engineering-resilience/evals/chaos-engineering-resilience.yaml +1 -1
  166. package/assets/skills/cicd-pipeline-qe-orchestrator/evals/cicd-pipeline-qe-orchestrator.yaml +1 -1
  167. package/assets/skills/compatibility-testing/evals/compatibility-testing.yaml +1 -1
  168. package/assets/skills/compliance-testing/evals/compliance-testing.yaml +1 -1
  169. package/assets/skills/contract-testing/evals/contract-testing.yaml +1 -1
  170. package/assets/skills/database-testing/evals/database-testing.yaml +1 -1
  171. package/assets/skills/enterprise-integration-testing/evals/enterprise-integration-testing.yaml +1 -1
  172. package/assets/skills/localization-testing/evals/localization-testing.yaml +1 -1
  173. package/assets/skills/middleware-testing-patterns/evals/middleware-testing-patterns.yaml +1 -1
  174. package/assets/skills/mobile-testing/evals/mobile-testing.yaml +1 -1
  175. package/assets/skills/mutation-testing/evals/mutation-testing.yaml +1 -1
  176. package/assets/skills/mutation-testing/test-data/sample-output.json +1 -1
  177. package/assets/skills/n8n-expression-testing/evals/n8n-expression-testing.yaml +1 -1
  178. package/assets/skills/n8n-integration-testing-patterns/evals/n8n-integration-testing-patterns.yaml +1 -1
  179. package/assets/skills/n8n-security-testing/evals/n8n-security-testing.yaml +1 -1
  180. package/assets/skills/n8n-trigger-testing-strategies/evals/n8n-trigger-testing-strategies.yaml +1 -1
  181. package/assets/skills/n8n-workflow-testing-fundamentals/evals/n8n-workflow-testing-fundamentals.yaml +1 -1
  182. package/assets/skills/observability-testing-patterns/evals/observability-testing-patterns.yaml +1 -1
  183. package/assets/skills/pentest-validation/evals/pentest-validation.yaml +1 -1
  184. package/assets/skills/performance-testing/evals/performance-testing.yaml +1 -1
  185. package/assets/skills/qcsd-cicd-swarm/evals/qcsd-cicd-swarm.yaml +1 -1
  186. package/assets/skills/qcsd-development-swarm/evals/qcsd-development-swarm.yaml +1 -1
  187. package/assets/skills/qcsd-ideation-swarm/evals/qcsd-ideation-swarm.yaml +1 -1
  188. package/assets/skills/qcsd-production-swarm/evals/qcsd-production-swarm.yaml +1 -1
  189. package/assets/skills/qcsd-refinement-swarm/evals/qcsd-refinement-swarm.yaml +1 -1
  190. package/assets/skills/qe-browser/evals/qe-browser.yaml +1 -1
  191. package/assets/skills/qe-chaos-resilience/evals/qe-chaos-resilience.yaml +1 -1
  192. package/assets/skills/qe-code-intelligence/evals/qe-code-intelligence.yaml +1 -1
  193. package/assets/skills/qe-coverage-analysis/evals/qe-coverage-analysis.yaml +1 -1
  194. package/assets/skills/qe-defect-intelligence/evals/qe-defect-intelligence.yaml +1 -1
  195. package/assets/skills/qe-learning-optimization/evals/qe-learning-optimization.yaml +2 -2
  196. package/assets/skills/qe-quality-assessment/evals/qe-quality-assessment.yaml +1 -1
  197. package/assets/skills/qe-requirements-validation/evals/qe-requirements-validation.yaml +1 -1
  198. package/assets/skills/qe-test-execution/evals/qe-test-execution.yaml +1 -1
  199. package/assets/skills/qe-test-generation/evals/qe-test-generation.yaml +1 -1
  200. package/assets/skills/qe-visual-accessibility/evals/qe-visual-accessibility.yaml +1 -1
  201. package/assets/skills/quality-metrics/evals/quality-metrics.yaml +1 -1
  202. package/assets/skills/regression-testing/evals/regression-testing.yaml +1 -1
  203. package/assets/skills/risk-based-testing/evals/risk-based-testing.yaml +1 -1
  204. package/assets/skills/security-testing/evals/security-testing.yaml +1 -1
  205. package/assets/skills/security-visual-testing/evals/security-visual-testing.yaml +1 -1
  206. package/assets/skills/shift-left-testing/evals/shift-left-testing.yaml +1 -1
  207. package/assets/skills/shift-right-testing/evals/shift-right-testing.yaml +1 -1
  208. package/assets/skills/skills-manifest.json +1 -1
  209. package/assets/skills/test-automation-strategy/evals/test-automation-strategy.yaml +1 -1
  210. package/assets/skills/test-data-management/evals/test-data-management.yaml +1 -1
  211. package/assets/skills/test-design-techniques/evals/test-design-techniques.yaml +1 -1
  212. package/assets/skills/test-reporting-analytics/evals/test-reporting-analytics.yaml +1 -1
  213. package/assets/skills/testability-scoring/evals/testability-scoring.yaml +1 -1
  214. package/assets/skills/validation-pipeline/evals/validation-pipeline.yaml +1 -1
  215. package/assets/skills/verification-quality/evals/verification-quality.yaml +1 -1
  216. package/assets/skills/visual-testing-advanced/evals/visual-testing-advanced.yaml +1 -1
  217. package/assets/skills/wms-testing-patterns/evals/wms-testing-patterns.yaml +1 -1
  218. package/dist/cli/bundle.js +7 -7
  219. package/dist/cli/chunks/adapter-TNNNJRDG.js +2 -0
  220. package/dist/cli/chunks/{agent-booster-wasm-SD5N32MX.js → agent-booster-wasm-5PC7D2FW.js} +2 -2
  221. package/dist/cli/chunks/{agent-handler-OZRSJM7F.js → agent-handler-RDNTK4CA.js} +2 -2
  222. package/dist/cli/chunks/{agent-memory-branch-NYTRANRN.js → agent-memory-branch-NAAMBWIR.js} +2 -2
  223. package/dist/cli/chunks/aqe-learning-engine-5ZRMYJLB.js +2 -0
  224. package/dist/cli/chunks/{arena-EX3SC2DP.js → arena-HXTWJ5YY.js} +4 -4
  225. package/dist/cli/chunks/{arena-FOTVSRK4.js → arena-KXFHRWX4.js} +2 -2
  226. package/dist/cli/chunks/{audit-Q5GHSUQY.js → audit-YSGA7UWT.js} +3 -3
  227. package/dist/cli/chunks/base-KWZHOPSH.js +2 -0
  228. package/dist/cli/chunks/{better-sqlite3-S7M5R2HS.js → better-sqlite3-UICJZIDG.js} +2 -2
  229. package/dist/cli/chunks/brain-handler-ET6YAP4B.js +90 -0
  230. package/dist/cli/chunks/{branch-enumerator-RWAXTGEU.js → branch-enumerator-SS7UNVIA.js} +2 -2
  231. package/dist/cli/chunks/{browser-IGDESJGF.js → browser-77GI6KBE.js} +2 -2
  232. package/dist/cli/chunks/browser-workflow-2FZTKDUL.js +2 -0
  233. package/dist/cli/chunks/{chunk-U54OOA24.js → chunk-2JW3BCGG.js} +1 -1
  234. package/dist/cli/chunks/{chunk-LML5VTFK.js → chunk-33YYYWBQ.js} +1 -1
  235. package/dist/cli/chunks/{chunk-P64DMQ2C.js → chunk-34WO57CW.js} +1 -1
  236. package/dist/cli/chunks/{chunk-57TNBR2P.js → chunk-3QHGWY7T.js} +2 -2
  237. package/dist/cli/chunks/chunk-3TW5W5LX.js +2 -0
  238. package/dist/cli/chunks/{chunk-S4MR6RTE.js → chunk-3UPAMMCB.js} +1 -1
  239. package/dist/cli/chunks/{chunk-5WJUNRTY.js → chunk-3VOQRIQM.js} +2 -2
  240. package/dist/cli/chunks/{chunk-4RT7I7PI.js → chunk-3X3DJZJJ.js} +1 -1
  241. package/dist/cli/chunks/{chunk-RFNEHNJV.js → chunk-4MHXCAG2.js} +1 -1
  242. package/dist/cli/chunks/{chunk-PMUBG2RU.js → chunk-4OYFXLBK.js} +2 -2
  243. package/dist/cli/chunks/{chunk-W2FLULF4.js → chunk-55RWDRJD.js} +3 -3
  244. package/dist/cli/chunks/chunk-5R3QL7WN.js +14 -0
  245. package/dist/cli/chunks/{chunk-RHJVDCLV.js → chunk-5SJHQ2CO.js} +2 -2
  246. package/dist/cli/chunks/{chunk-HBTC4L53.js → chunk-5YPYDPBJ.js} +2 -2
  247. package/dist/cli/chunks/chunk-5Z6XZV7K.js +65 -0
  248. package/dist/cli/chunks/{chunk-6EHN7Q2Q.js → chunk-64PFWE2F.js} +2 -2
  249. package/dist/cli/chunks/{chunk-KFXZDQ5J.js → chunk-6CQN24ZK.js} +1 -1
  250. package/dist/cli/chunks/{chunk-WVY22NHZ.js → chunk-6J62K3SW.js} +2 -2
  251. package/dist/cli/chunks/{chunk-TLPL3EQY.js → chunk-6KJABXAR.js} +2 -2
  252. package/dist/cli/chunks/{chunk-PZKZY6PB.js → chunk-6QYNWR7U.js} +2 -2
  253. package/dist/cli/chunks/{chunk-A7N3YUDJ.js → chunk-6TPKK7LD.js} +2 -2
  254. package/dist/cli/chunks/{chunk-RYJHREYS.js → chunk-6UWGMOND.js} +2 -2
  255. package/dist/cli/chunks/{chunk-XPLSLHRB.js → chunk-6VRA2QGL.js} +1 -1
  256. package/dist/cli/chunks/{chunk-Q3JHS3UD.js → chunk-7D777LTF.js} +2 -2
  257. package/dist/cli/chunks/chunk-7ZIOFPL3.js +2 -0
  258. package/dist/cli/chunks/chunk-A4FYONNU.js +2 -0
  259. package/dist/cli/chunks/{chunk-7AFBNU6K.js → chunk-AIHDEEJO.js} +2 -2
  260. package/dist/cli/chunks/{chunk-L2F7FVIU.js → chunk-AUXFKCQL.js} +2 -2
  261. package/dist/cli/chunks/{chunk-67A6PEZM.js → chunk-AWWNB2T7.js} +2 -2
  262. package/dist/cli/chunks/{chunk-DVHWLAEO.js → chunk-BDESSCVR.js} +3 -3
  263. package/dist/cli/chunks/{chunk-JQ2ZD3WO.js → chunk-BFP7KO7P.js} +2 -2
  264. package/dist/cli/chunks/{chunk-N5ZRUOMR.js → chunk-BGE6FOLM.js} +2 -2
  265. package/dist/cli/chunks/{chunk-BWRHOIYC.js → chunk-BOARZKU3.js} +2 -2
  266. package/dist/cli/chunks/{chunk-CTCQOYBS.js → chunk-BOZZYWCR.js} +1 -1
  267. package/dist/cli/chunks/{chunk-NHHWLJQF.js → chunk-C2WU3533.js} +1 -1
  268. package/dist/cli/chunks/{chunk-5EHLGOWW.js → chunk-CDHQFHRP.js} +2 -2
  269. package/dist/cli/chunks/chunk-CDKG6EI7.js +16 -0
  270. package/dist/cli/chunks/{chunk-RGH3WGWD.js → chunk-CIKSHTEQ.js} +3 -3
  271. package/dist/cli/chunks/{chunk-K574FLVB.js → chunk-CIZ5JPDC.js} +2 -2
  272. package/dist/cli/chunks/{chunk-LWUJQGCS.js → chunk-CLTMDCSE.js} +2 -2
  273. package/dist/cli/chunks/{chunk-GHQ5PUOV.js → chunk-CNG6GQEZ.js} +2 -2
  274. package/dist/cli/chunks/{chunk-3C2K4YMS.js → chunk-CSU5NYOX.js} +3 -3
  275. package/dist/cli/chunks/chunk-CU46J64M.js +4 -0
  276. package/dist/cli/chunks/{chunk-EH5OCHAJ.js → chunk-CXQPR5MY.js} +1 -1
  277. package/dist/cli/chunks/chunk-DA5K5754.js +96 -0
  278. package/dist/cli/chunks/{chunk-FVGTINVR.js → chunk-DAEFDCJ4.js} +81 -65
  279. package/dist/cli/chunks/{chunk-MH73D5TN.js → chunk-DEYLEDJN.js} +2 -2
  280. package/dist/cli/chunks/{chunk-7FWP7CZY.js → chunk-DFZCKIGY.js} +3 -3
  281. package/dist/cli/chunks/{chunk-QXTW7XCS.js → chunk-DHJPWQBR.js} +2 -2
  282. package/dist/cli/chunks/{chunk-NAZVPZJS.js → chunk-DOTK76IJ.js} +2 -2
  283. package/dist/cli/chunks/{chunk-RCI64RIJ.js → chunk-DPFRKBOG.js} +2 -2
  284. package/dist/cli/chunks/{chunk-WMW47QMR.js → chunk-EDJ3O7RH.js} +2 -2
  285. package/dist/cli/chunks/{chunk-4K27ESCA.js → chunk-EKQ673SA.js} +1 -1
  286. package/dist/cli/chunks/chunk-F3SBRQC6.js +2 -0
  287. package/dist/cli/chunks/{chunk-4N44UJGI.js → chunk-FGYMFUE2.js} +2 -2
  288. package/dist/cli/chunks/chunk-FLYOJOKN.js +2 -0
  289. package/dist/cli/chunks/{chunk-W4OQYLYO.js → chunk-FRH6VAUS.js} +1 -1
  290. package/dist/cli/chunks/{chunk-VOYJJ3KA.js → chunk-FWGOHAAB.js} +2 -2
  291. package/dist/cli/chunks/{chunk-D4RCV4LY.js → chunk-G6T45OIC.js} +2 -2
  292. package/dist/cli/chunks/{chunk-2EHFEMRU.js → chunk-GPLQ6DOK.js} +2 -2
  293. package/dist/cli/chunks/{chunk-RVCWSAXI.js → chunk-HDSAM2RE.js} +2 -2
  294. package/dist/cli/chunks/chunk-HIVA55CJ.js +2 -0
  295. package/dist/cli/chunks/{chunk-6F4WHN7D.js → chunk-HIYXCDEP.js} +1 -1
  296. package/dist/cli/chunks/{chunk-NRR23SJV.js → chunk-HUWNIPZ5.js} +1 -1
  297. package/dist/cli/chunks/{chunk-4M6A3PVJ.js → chunk-HV2J7KKQ.js} +2 -2
  298. package/dist/cli/chunks/{chunk-CJHVOBJY.js → chunk-IFCLB7FJ.js} +1 -1
  299. package/dist/cli/chunks/{chunk-Q335R4MR.js → chunk-IPR4QP3H.js} +2 -2
  300. package/dist/cli/chunks/{chunk-HZMLNM2T.js → chunk-ISDMD6EU.js} +178 -175
  301. package/dist/cli/chunks/chunk-J6GNQS62.js +5 -0
  302. package/dist/cli/chunks/{chunk-3DFFFXXO.js → chunk-JBNEE5UH.js} +2 -2
  303. package/dist/cli/chunks/chunk-JZ3ORVZ3.js +54 -0
  304. package/dist/cli/chunks/{chunk-T4C56HBW.js → chunk-KCZR45PA.js} +2 -2
  305. package/dist/cli/chunks/chunk-KGT36Z42.js +14 -0
  306. package/dist/cli/chunks/{chunk-JIUF6NV6.js → chunk-KHFNNVJA.js} +2 -2
  307. package/dist/cli/chunks/{chunk-7SK6IMGZ.js → chunk-KPA7MZ6C.js} +2 -2
  308. package/dist/cli/chunks/{chunk-G2CLZVYI.js → chunk-KSKEF7LZ.js} +3 -3
  309. package/dist/cli/chunks/{chunk-6LMLN5R2.js → chunk-M2JBBZQB.js} +2 -2
  310. package/dist/cli/chunks/{chunk-UHTAI4ZB.js → chunk-M4WJKGVK.js} +1 -1
  311. package/dist/cli/chunks/{chunk-KZOBLLXW.js → chunk-M5QUBZY6.js} +2 -2
  312. package/dist/cli/chunks/{chunk-42WUDDUU.js → chunk-MCUJEZT6.js} +2 -2
  313. package/dist/cli/chunks/{chunk-ZFGND4QK.js → chunk-MDWCE7YW.js} +1 -1
  314. package/dist/cli/chunks/{chunk-TYVQNYXX.js → chunk-MEGDYJPV.js} +7 -7
  315. package/dist/cli/chunks/chunk-MIQTXNBG.js +4 -0
  316. package/dist/cli/chunks/{chunk-PFXX5Q32.js → chunk-MNW6QGNJ.js} +2 -2
  317. package/dist/cli/chunks/{chunk-IVGVOGIZ.js → chunk-MOBNBMFW.js} +1 -1
  318. package/dist/cli/chunks/{chunk-NWFIJNEB.js → chunk-MTZH7AHC.js} +1 -1
  319. package/dist/cli/chunks/chunk-MVNP7GIR.js +2 -0
  320. package/dist/cli/chunks/chunk-MVPCNSPY.js +2 -0
  321. package/dist/cli/chunks/chunk-NA7B2QYB.js +2 -0
  322. package/dist/cli/chunks/{chunk-E3Q7WNJD.js → chunk-NDPFGIMJ.js} +3 -3
  323. package/dist/cli/chunks/{chunk-GHUPID5E.js → chunk-NJBGXDQ7.js} +1 -1
  324. package/dist/cli/chunks/chunk-OBAP2TXZ.js +2 -0
  325. package/dist/cli/chunks/{chunk-OBCKP3G4.js → chunk-OCWWP5PL.js} +4 -4
  326. package/dist/cli/chunks/{chunk-CJCT452S.js → chunk-ODKLFVYC.js} +2 -2
  327. package/dist/cli/chunks/{chunk-YN6W2XIT.js → chunk-ONII3572.js} +4 -4
  328. package/dist/cli/chunks/{chunk-QW4LN5NK.js → chunk-OSLYSG3B.js} +2 -2
  329. package/dist/cli/chunks/{chunk-HZ6NEJMO.js → chunk-OULHKEVH.js} +2 -2
  330. package/dist/cli/chunks/{chunk-CG2MUD7U.js → chunk-PAWXJ73E.js} +1 -1
  331. package/dist/cli/chunks/chunk-PEPFCPES.js +2 -0
  332. package/dist/cli/chunks/{chunk-UIGEUEBT.js → chunk-PFR4G3DJ.js} +2 -2
  333. package/dist/cli/chunks/chunk-PO3IXGMQ.js +2 -0
  334. package/dist/cli/chunks/{chunk-6SZKLWZT.js → chunk-PZJOPURC.js} +5 -5
  335. package/dist/cli/chunks/{chunk-ARMZYHYL.js → chunk-Q5DO24IJ.js} +2 -2
  336. package/dist/cli/chunks/chunk-QGIU2WRL.js +2 -0
  337. package/dist/cli/chunks/{chunk-N3RN4QTC.js → chunk-R4VL6E65.js} +2 -2
  338. package/dist/cli/chunks/{chunk-MWQTACNA.js → chunk-R5NE6B2M.js} +2 -2
  339. package/dist/cli/chunks/{chunk-T46LOLW3.js → chunk-RJCYCLZV.js} +2 -2
  340. package/dist/cli/chunks/{chunk-CH2TQCV5.js → chunk-SGYJ4NFZ.js} +1 -1
  341. package/dist/cli/chunks/{chunk-NG2UVPTW.js → chunk-SRKETSFF.js} +1 -1
  342. package/dist/cli/chunks/{chunk-QFUX7ELG.js → chunk-STJCATGN.js} +2 -2
  343. package/dist/cli/chunks/{chunk-CIESXO73.js → chunk-STM3UDNO.js} +1 -1
  344. package/dist/cli/chunks/{chunk-C7AXRI7E.js → chunk-T6BVLVI5.js} +1 -1
  345. package/dist/cli/chunks/{chunk-HSJ5FQCF.js → chunk-TDZ53WO2.js} +2 -2
  346. package/dist/cli/chunks/{chunk-YF5OP6CR.js → chunk-TPGED2IF.js} +2 -2
  347. package/dist/cli/chunks/{chunk-2TG24LYQ.js → chunk-TSRSV3LD.js} +1 -1
  348. package/dist/cli/chunks/{chunk-6VKJAMZY.js → chunk-TT23RRB7.js} +1 -1
  349. package/dist/cli/chunks/{chunk-WXMSRBQF.js → chunk-TWAWHOP7.js} +2 -2
  350. package/dist/cli/chunks/{chunk-ZCDXJ27H.js → chunk-U5K45TFH.js} +1 -1
  351. package/dist/cli/chunks/{chunk-3WV4H33V.js → chunk-UDHKLT4C.js} +1 -1
  352. package/dist/cli/chunks/{chunk-VNAKBHJI.js → chunk-UEM7ZF5K.js} +2 -2
  353. package/dist/cli/chunks/{chunk-4ZUZDFAA.js → chunk-UGVHCMUN.js} +6 -6
  354. package/dist/cli/chunks/{chunk-NNOMDM4N.js → chunk-V3QLFNA2.js} +2 -2
  355. package/dist/cli/chunks/{chunk-S7N4BKI3.js → chunk-VD6QRULW.js} +2 -2
  356. package/dist/cli/chunks/{chunk-WBH4C4BG.js → chunk-VIHTL3U2.js} +2 -2
  357. package/dist/cli/chunks/chunk-W7BWUTVV.js +2 -0
  358. package/dist/cli/chunks/{chunk-IWFL6EFI.js → chunk-WLG5AJ4N.js} +2 -2
  359. package/dist/cli/chunks/{chunk-KEEBUVGV.js → chunk-XC7DYDSY.js} +8 -8
  360. package/dist/cli/chunks/{chunk-F2KRT2II.js → chunk-XJ7QNVI5.js} +3 -3
  361. package/dist/cli/chunks/chunk-XRT2WRMS.js +2 -0
  362. package/dist/cli/chunks/{chunk-ADK7DF3G.js → chunk-XRYF6JV7.js} +2 -2
  363. package/dist/cli/chunks/{chunk-PWEIDHT7.js → chunk-XWMZ6D6N.js} +2 -2
  364. package/dist/cli/chunks/{chunk-ICKLBATY.js → chunk-Y3MW3YBC.js} +2 -2
  365. package/dist/cli/chunks/chunk-YNXS6CGV.js +2 -0
  366. package/dist/cli/chunks/{chunk-PVHO6KLB.js → chunk-Z3RHREWF.js} +1 -1
  367. package/dist/cli/chunks/{chunk-EAJK25IS.js → chunk-ZBAKA4YB.js} +1 -1
  368. package/dist/cli/chunks/chunk-ZBJ4XOOV.js +180 -0
  369. package/dist/cli/chunks/chunk-ZBQY5GLF.js +11 -0
  370. package/dist/cli/chunks/{chunk-R5RNOLHI.js → chunk-ZJ26AQA5.js} +1 -1
  371. package/dist/cli/chunks/{chunk-KPFG4OIM.js → chunk-ZNEMGX5O.js} +1 -1
  372. package/dist/cli/chunks/{chunk-2H5YJ5ZK.js → chunk-ZNPKDCZR.js} +2 -2
  373. package/dist/cli/chunks/{chunk-DW6ZMNMR.js → chunk-ZZDIMOOV.js} +2 -2
  374. package/dist/cli/chunks/ci-464KPQNP.js +81 -0
  375. package/dist/cli/chunks/ci-output-I7FX2RSO.js +2 -0
  376. package/dist/cli/chunks/{circuit-breaker-4WST3QSA.js → circuit-breaker-3FW237WW.js} +2 -2
  377. package/dist/cli/chunks/{claude-flow-setup-KB4TKMYI.js → claude-flow-setup-6JKMBPGU.js} +2 -2
  378. package/dist/cli/chunks/client-7E4LM2WW.js +2 -0
  379. package/dist/cli/chunks/{cline-installer-W2ZHQ6WM.js → cline-installer-UWFHT6VY.js} +2 -2
  380. package/dist/cli/chunks/{code-TF2AVR5D.js → code-KQSUT3FS.js} +29 -29
  381. package/dist/cli/chunks/{code-index-extractor-RMDRUVQJ.js → code-index-extractor-PABBNUSC.js} +2 -2
  382. package/dist/cli/chunks/{codex-installer-VSTRHJHV.js → codex-installer-CQ24DTP5.js} +2 -2
  383. package/dist/cli/chunks/{completions-3Q37QVFR.js → completions-7RWHAUAR.js} +2 -2
  384. package/dist/cli/chunks/complexity-analyzer-XPOAF33E.js +2 -0
  385. package/dist/cli/chunks/{continuedev-installer-VTEXM455.js → continuedev-installer-V4F2FIZP.js} +2 -2
  386. package/dist/cli/chunks/{copilot-installer-AGY7DQUS.js → copilot-installer-JMICURQB.js} +2 -2
  387. package/dist/cli/chunks/core-handlers-IFG3757P.js +2 -0
  388. package/dist/cli/chunks/cost-tracker-5OFHEYFJ.js +2 -0
  389. package/dist/cli/chunks/{coverage-TT64IOS4.js → coverage-QKN57JDS.js} +3 -3
  390. package/dist/cli/chunks/cross-domain-router-EK7W4PGP.js +2 -0
  391. package/dist/cli/chunks/{cursor-installer-OVOJIOHN.js → cursor-installer-GBJ7YXSM.js} +2 -2
  392. package/dist/cli/chunks/{daemon-DMFZMXKA.js → daemon-GKP7CMEK.js} +3 -3
  393. package/dist/cli/chunks/{daemon-XCULEHWY.js → daemon-IAVSO6HK.js} +4 -4
  394. package/dist/cli/chunks/{dag-attention-scheduler-WW2RX4B5.js → dag-attention-scheduler-S225TCI7.js} +2 -2
  395. package/dist/cli/chunks/{detect-QNWIM232.js → detect-IUYH422U.js} +2 -2
  396. package/dist/cli/chunks/{dist-node-6GQIY3CG.js → dist-node-2YRE6A7C.js} +2 -2
  397. package/dist/cli/chunks/{domain-handler-6RJPDELX.js → domain-handler-PL2TZC6H.js} +2 -2
  398. package/dist/cli/chunks/domain-plugins-HCGLXKIT.js +2 -0
  399. package/dist/cli/chunks/{domain-transfer-WK524LBS.js → domain-transfer-KQJRUPXA.js} +2 -2
  400. package/dist/cli/chunks/dream-NFSCSLY7.js +2 -0
  401. package/dist/cli/chunks/{embed-and-insert-pattern-SO6GWJW7.js → embed-and-insert-pattern-ZPAG7235.js} +2 -2
  402. package/dist/cli/chunks/eval-WCK7KNFN.js +17 -0
  403. package/dist/cli/chunks/{experience-capture-middleware-BCCJ35OX.js → experience-capture-middleware-2MSQWSAR.js} +3 -3
  404. package/dist/cli/chunks/{fast-paths-CATDDBEU.js → fast-paths-VYOSIBKF.js} +2 -2
  405. package/dist/cli/chunks/{feature-flags-BUXNAORY.js → feature-flags-UJRHFBRX.js} +2 -2
  406. package/dist/cli/chunks/{feature-flags-KNNWWP5G.js → feature-flags-WCFUKHNQ.js} +2 -2
  407. package/dist/cli/chunks/{file-discovery-S4HF3O7D.js → file-discovery-JDGL4ZWS.js} +2 -2
  408. package/dist/cli/chunks/fleet-ROXVMZ2F.js +43 -0
  409. package/dist/cli/chunks/{gnn-wrapper-G7ABZUG7.js → gnn-wrapper-NIO4ZCO3.js} +2 -2
  410. package/dist/cli/chunks/{heartbeat-handler-UFMELIWT.js → heartbeat-handler-PI42WD3C.js} +4 -4
  411. package/dist/cli/chunks/heartbeat-scheduler-ZATCDJDK.js +2 -0
  412. package/dist/cli/chunks/hnsw-adapter-WXQABRCA.js +2 -0
  413. package/dist/cli/chunks/hnsw-index-TPSWLEA5.js +2 -0
  414. package/dist/cli/chunks/{hnsw-legacy-bridge-YIILSRXI.js → hnsw-legacy-bridge-YLC7SPK2.js} +2 -2
  415. package/dist/cli/chunks/{hnswlib-node-TSVRMXDH.js → hnswlib-node-LG6OS3B7.js} +2 -2
  416. package/dist/cli/chunks/{hooks-OHQPNK74.js → hooks-WVALP5GX.js} +10 -10
  417. package/dist/cli/chunks/{hypergraph-engine-LY7PJDSL.js → hypergraph-engine-GJEMW3EG.js} +2 -2
  418. package/dist/cli/chunks/{hypergraph-handler-YGDYZO6H.js → hypergraph-handler-BLF6LXEV.js} +3 -3
  419. package/dist/cli/chunks/impact-analyzer-HNIU45P5.js +2 -0
  420. package/dist/cli/chunks/{init-handler-MTK65LI3.js → init-handler-K25RWRYY.js} +6 -6
  421. package/dist/cli/chunks/init-wizard-JUIPBMHG.js +2 -0
  422. package/dist/cli/chunks/kernel-5BOZQ754.js +2 -0
  423. package/dist/cli/chunks/{kilocode-installer-3IICU4RS.js → kilocode-installer-BXN6WZ7G.js} +2 -2
  424. package/dist/cli/chunks/{kiro-installer-MXOVQYQA.js → kiro-installer-PM362DLN.js} +12 -12
  425. package/dist/cli/chunks/knowledge-graph-EWDAENWM.js +2 -0
  426. package/dist/cli/chunks/learning-CPERDDRG.js +122 -0
  427. package/dist/cli/chunks/llm-router-GOAV5FPI.js +37 -0
  428. package/dist/cli/chunks/llm-router-service-3YT7JGBS.js +2 -0
  429. package/dist/cli/chunks/{load-F4PVAMXQ.js → load-2BG6SHAK.js} +2 -2
  430. package/dist/cli/chunks/load-test-BP2CPLIV.js +2 -0
  431. package/dist/cli/chunks/{mcp-DUYJUEME.js → mcp-5TTB37DC.js} +2 -2
  432. package/dist/cli/chunks/{memory-XTTYORAS.js → memory-4NHBYT6S.js} +5 -5
  433. package/dist/cli/chunks/memory-backend-4PYQBPRM.js +2 -0
  434. package/dist/cli/chunks/memory-handlers-2B27NITS.js +2 -0
  435. package/dist/cli/chunks/multi-model-executor-KCWSGCDT.js +14 -0
  436. package/dist/cli/chunks/{opencode-installer-33ULBU2F.js → opencode-installer-ATZLLK74.js} +2 -2
  437. package/dist/cli/chunks/{orchestrator-34ZJEKTJ.js → orchestrator-RKB7XJRG.js} +19 -19
  438. package/dist/cli/chunks/pattern-null-store-OYOQOV2O.js +2 -0
  439. package/dist/cli/chunks/{pattern-usage-recorder-GZ2M3F2E.js → pattern-usage-recorder-7VE4XDAI.js} +2 -2
  440. package/dist/cli/chunks/pipeline-LQZSNDD2.js +19 -0
  441. package/dist/cli/chunks/{platform-VKJFJIAW.js → platform-OD5H5U6G.js} +2 -2
  442. package/dist/cli/chunks/{plugin-5C5UBQUQ.js → plugin-EJ6K2MGU.js} +2 -2
  443. package/dist/cli/chunks/{prime-radiant-advanced-wasm-KO2PQI3D.js → prime-radiant-advanced-wasm-OIHTKJMN.js} +2 -2
  444. package/dist/cli/chunks/protocol-executor-3ATJTXWG.js +2 -0
  445. package/dist/cli/chunks/{protocol-handler-ZF74NIKA.js → protocol-handler-NRBROAU7.js} +2 -2
  446. package/dist/cli/chunks/{prove-MO5TQQU4.js → prove-EJOGEGD3.js} +2 -2
  447. package/dist/cli/chunks/qe-reasoning-bank-LLMYZT4X.js +2 -0
  448. package/dist/cli/chunks/{quality-EYIN6AER.js → quality-E55UC73D.js} +2 -2
  449. package/dist/cli/chunks/{quality-gate-V6OQM57O.js → quality-gate-OIQATNT3.js} +3 -3
  450. package/dist/cli/chunks/queen-coordinator-RN7L6KG5.js +2 -0
  451. package/dist/cli/chunks/{real-embeddings-AR7TZX7U.js → real-embeddings-FPFFNOSZ.js} +2 -2
  452. package/dist/cli/chunks/ref-validation-OPO6J7OL.js +2 -0
  453. package/dist/cli/chunks/{roocode-installer-46E626VZ.js → roocode-installer-ODY5KRWU.js} +2 -2
  454. package/dist/cli/chunks/router-MDHITQ2V.js +2 -0
  455. package/dist/cli/chunks/routing-feedback-5XLNJ3Y3.js +2 -0
  456. package/dist/cli/chunks/{routing-handler-ZNRVW6QW.js → routing-handler-KQM6VWLC.js} +4 -4
  457. package/dist/cli/chunks/{ruvector-commands-4L2CQMWS.js → ruvector-commands-U2GVV6PF.js} +2 -2
  458. package/dist/cli/chunks/rvf-dual-writer-JBW4O3II.js +2 -0
  459. package/dist/cli/chunks/rvf-migration-adapter-BPPQL4XJ.js +2 -0
  460. package/dist/cli/chunks/{rvf-migration-coordinator-H4RVGBIA.js → rvf-migration-coordinator-V2GHCJKN.js} +2 -2
  461. package/dist/cli/chunks/rvf-native-adapter-S4562CG5.js +2 -0
  462. package/dist/cli/chunks/rvf-store-integrity-KMIHD3LP.js +2 -0
  463. package/dist/cli/chunks/safe-db-FIRHSXVF.js +2 -0
  464. package/dist/cli/chunks/schedule-RVXFB4HK.js +2 -0
  465. package/dist/cli/chunks/scheduler-IKKAMAOO.js +2 -0
  466. package/dist/cli/chunks/security-P5NM353C.js +13 -0
  467. package/dist/cli/chunks/{shared-rvf-adapter-M6NNIZ5W.js → shared-rvf-adapter-LVIUOO4S.js} +2 -2
  468. package/dist/cli/chunks/{shared-rvf-dual-writer-LHMFCYVE.js → shared-rvf-dual-writer-2CSG7C4W.js} +2 -2
  469. package/dist/cli/chunks/sqlite-persistence-SQ3HCUQ7.js +2 -0
  470. package/dist/cli/chunks/{status-handler-GMIOXQIE.js → status-handler-6TU6O37R.js} +2 -2
  471. package/dist/cli/chunks/{structural-health-YZXHVHM6.js → structural-health-KBIJSTXJ.js} +2 -2
  472. package/dist/cli/chunks/{sync-GMPCPV5L.js → sync-LNHI5SB7.js} +2 -2
  473. package/dist/cli/chunks/{sync-N56UQGCS.js → sync-UHOX6RJW.js} +2 -2
  474. package/dist/cli/chunks/task-handler-AVDHMLGI.js +49 -0
  475. package/dist/cli/chunks/task-handlers-KYK4VTRA.js +9 -0
  476. package/dist/cli/chunks/{test-GQNCKRSP.js → test-DHAAI3DU.js} +11 -11
  477. package/dist/cli/chunks/test-scheduling-XDBZ3QC2.js +15 -0
  478. package/dist/cli/chunks/{token-bootstrap-76SRNXGG.js → token-bootstrap-GUTTLPZX.js} +2 -2
  479. package/dist/cli/chunks/{token-usage-O7CZDP5Q.js → token-usage-Q2YG5YQN.js} +2 -2
  480. package/dist/cli/chunks/{transformers-LTU4LSSC.js → transformers-F5UQTQCY.js} +2 -2
  481. package/dist/cli/chunks/{tree-sitter-wasm-parser-NQSQCMBM.js → tree-sitter-wasm-parser-DEGOHS6F.js} +2 -2
  482. package/dist/cli/chunks/types-JQ7EQO5Q.js +2 -0
  483. package/dist/cli/chunks/unified-memory-CXHLHB5I.js +2 -0
  484. package/dist/cli/chunks/unified-memory-hnsw-I7WAE54M.js +2 -0
  485. package/dist/cli/chunks/unified-persistence-6CPF65WI.js +2 -0
  486. package/dist/cli/chunks/{upgrade-OQWRBZ3R.js → upgrade-TJRVGHGD.js} +2 -2
  487. package/dist/cli/chunks/{validate-TH5SRP3E.js → validate-BWPCVHBN.js} +2 -2
  488. package/dist/cli/chunks/{validate-swarm-UITL2JUS.js → validate-swarm-QVVKCQLP.js} +2 -2
  489. package/dist/cli/chunks/{vibium-O6PRAG4J.js → vibium-ZFATIWHO.js} +2 -2
  490. package/dist/cli/chunks/visual-security-GNPHME5H.js +2 -0
  491. package/dist/cli/chunks/{web-tree-sitter-XBFBY4OF.js → web-tree-sitter-KPLY7ONR.js} +2 -2
  492. package/dist/cli/chunks/{windsurf-installer-DVT5NRNY.js → windsurf-installer-H7XM7ISA.js} +2 -2
  493. package/dist/cli/chunks/{witness-chain-VRSH2F36.js → witness-chain-RRN6NDCH.js} +2 -2
  494. package/dist/cli/chunks/witness-chain-VT4UHHBR.js +2 -0
  495. package/dist/cli/chunks/{witness-key-manager-GFHRDKQ4.js → witness-key-manager-DFRL42GE.js} +2 -2
  496. package/dist/cli/chunks/workflow-2ZQO6WYI.js +51 -0
  497. package/dist/cli/chunks/workflow-orchestrator-DB3HIECD.js +2 -0
  498. package/dist/cli/chunks/{wrappers-5LLLT7GM.js → wrappers-SUS6XEJD.js} +2 -2
  499. package/dist/cli/commands/ci.js +54 -28
  500. package/dist/cli/commands/code.js +6 -0
  501. package/dist/cli/commands/eval.js +3 -2
  502. package/dist/cli/commands/fleet.js +35 -16
  503. package/dist/cli/commands/learning-snapshot.d.ts +38 -0
  504. package/dist/cli/commands/learning-snapshot.js +171 -0
  505. package/dist/cli/commands/learning.js +16 -64
  506. package/dist/cli/commands/llm-router.js +13 -12
  507. package/dist/cli/commands/pipeline.js +9 -0
  508. package/dist/cli/commands/security.js +167 -100
  509. package/dist/cli/commands/test.js +1 -0
  510. package/dist/cli/commands/workflow.js +9 -1
  511. package/dist/cli/handlers/task-handler.js +19 -9
  512. package/dist/cli/helpers/domain-plugins.d.ts +5 -0
  513. package/dist/cli/helpers/domain-plugins.js +11 -0
  514. package/dist/cli/index.js +17 -8
  515. package/dist/cli/utils/ci-config.d.ts +3 -0
  516. package/dist/cli/utils/ci-output.d.ts +17 -0
  517. package/dist/cli/utils/ci-output.js +34 -2
  518. package/dist/context/sources/git-source.d.ts +2 -0
  519. package/dist/context/sources/git-source.js +9 -2
  520. package/dist/coordination/cancelled-task-settlement.d.ts +11 -0
  521. package/dist/coordination/cancelled-task-settlement.js +15 -0
  522. package/dist/coordination/consensus/providers/claude-provider.d.ts +2 -2
  523. package/dist/coordination/consensus/providers/claude-provider.js +18 -25
  524. package/dist/coordination/consensus/providers/gemini-provider.d.ts +14 -4
  525. package/dist/coordination/consensus/providers/gemini-provider.js +39 -36
  526. package/dist/coordination/consensus/providers/ollama-provider.d.ts +8 -7
  527. package/dist/coordination/consensus/providers/ollama-provider.js +16 -18
  528. package/dist/coordination/consensus/providers/openai-provider.d.ts +14 -4
  529. package/dist/coordination/consensus/providers/openai-provider.js +36 -34
  530. package/dist/coordination/consensus/providers/openrouter-provider.d.ts +5 -5
  531. package/dist/coordination/consensus/providers/openrouter-provider.js +64 -37
  532. package/dist/coordination/handlers/handler-types.d.ts +3 -0
  533. package/dist/coordination/handlers/quality-handlers.js +10 -0
  534. package/dist/coordination/handlers/security-handlers.js +168 -72
  535. package/dist/coordination/handlers/test-execution-handlers.js +39 -43
  536. package/dist/coordination/interfaces.d.ts +2 -2
  537. package/dist/coordination/protocol-executor.js +68 -9
  538. package/dist/coordination/protocols/security-audit.d.ts +3 -0
  539. package/dist/coordination/protocols/security-audit.js +61 -39
  540. package/dist/coordination/queen-coordinator.js +10 -4
  541. package/dist/coordination/queen-event-handlers.js +17 -0
  542. package/dist/coordination/queen-task-management.js +25 -0
  543. package/dist/coordination/queen-types.d.ts +2 -0
  544. package/dist/coordination/result-saver.js +36 -5
  545. package/dist/coordination/task-executor.d.ts +3 -1
  546. package/dist/coordination/task-executor.js +8 -8
  547. package/dist/coordination/workflow-composition.d.ts +19 -0
  548. package/dist/coordination/workflow-composition.js +114 -0
  549. package/dist/coordination/workflow-orchestrator.d.ts +3 -2
  550. package/dist/coordination/workflow-orchestrator.js +219 -85
  551. package/dist/coordination/workflow-types.d.ts +30 -1
  552. package/dist/coordination/yaml-pipeline-loader.js +9 -5
  553. package/dist/domains/chaos-resilience/services/chaos-engineer.js +2 -7
  554. package/dist/domains/code-intelligence/services/knowledge-graph.js +2 -7
  555. package/dist/domains/code-intelligence/services/metric-collector/test-counter.js +9 -40
  556. package/dist/domains/constants.d.ts +1 -6
  557. package/dist/domains/constants.js +2 -6
  558. package/dist/domains/contract-testing/services/contract-validator.js +2 -7
  559. package/dist/domains/coverage-analysis/services/coverage-analyzer.js +2 -12
  560. package/dist/domains/coverage-analysis/services/gap-detector.js +2 -7
  561. package/dist/domains/defect-intelligence/services/defect-predictor.js +2 -12
  562. package/dist/domains/defect-intelligence/services/root-cause-analyzer.js +2 -7
  563. package/dist/domains/learning-optimization/services/learning-coordinator.js +2 -7
  564. package/dist/domains/quality-assessment/services/deployment-advisor.js +2 -7
  565. package/dist/domains/quality-assessment/services/quality-analyzer.js +2 -7
  566. package/dist/domains/requirements-validation/services/requirements-validator.js +2 -7
  567. package/dist/domains/security-compliance/interfaces.d.ts +5 -0
  568. package/dist/domains/security-compliance/interfaces.js +0 -6
  569. package/dist/domains/security-compliance/scan-discovery.d.ts +12 -0
  570. package/dist/domains/security-compliance/scan-discovery.js +105 -0
  571. package/dist/domains/security-compliance/scan-evidence.d.ts +57 -0
  572. package/dist/domains/security-compliance/scan-evidence.js +2 -0
  573. package/dist/domains/security-compliance/services/scanners/sast-scanner.d.ts +3 -2
  574. package/dist/domains/security-compliance/services/scanners/sast-scanner.js +112 -72
  575. package/dist/domains/security-compliance/services/semgrep-integration.d.ts +9 -2
  576. package/dist/domains/security-compliance/services/semgrep-integration.js +68 -20
  577. package/dist/domains/test-execution/services/flaky-detector.js +46 -5
  578. package/dist/domains/test-execution/services/retry-handler.js +38 -20
  579. package/dist/domains/test-execution/services/test-executor.js +84 -29
  580. package/dist/domains/test-generation/services/test-generator.js +2 -7
  581. package/dist/domains/visual-accessibility/services/visual-tester.js +2 -7
  582. package/dist/init/init-wizard-hooks.js +2 -2
  583. package/dist/init/init-wizard-steps.js +1 -1
  584. package/dist/init/kiro-installer.js +9 -8
  585. package/dist/init/opencode-installer.js +1 -1
  586. package/dist/init/phases/07-hooks.js +4 -2
  587. package/dist/init/phases/12-verification.js +1 -1
  588. package/dist/init/settings-merge.d.ts +10 -3
  589. package/dist/init/settings-merge.js +40 -9
  590. package/dist/integrations/agentic-flow/model-router/types.js +6 -8
  591. package/dist/integrations/agentic-flow/reasoning-bank/index.js +3 -20
  592. package/dist/integrations/coherence/engines/cohomology-adapter.js +100 -30
  593. package/dist/integrations/ruvector/brain-exporter.js +9 -15
  594. package/dist/integrations/ruvector/brain-rvf-exporter.js +17 -30
  595. package/dist/integrations/ruvector/brain-shared.d.ts +5 -1
  596. package/dist/integrations/ruvector/brain-shared.js +70 -4
  597. package/dist/integrations/ruvector/rvf-dual-writer.js +36 -15
  598. package/dist/integrations/ruvector/rvf-store-integrity.d.ts +14 -9
  599. package/dist/integrations/ruvector/rvf-store-integrity.js +39 -9
  600. package/dist/integrations/ruvector/shared-rvf-adapter.js +20 -23
  601. package/dist/kernel/memory-factory.js +14 -4
  602. package/dist/kernel/project-root.js +10 -8
  603. package/dist/kernel/unified-memory.js +1 -1
  604. package/dist/learning/local-judge-client.d.ts +6 -5
  605. package/dist/learning/local-judge-client.js +7 -6
  606. package/dist/learning/pattern-store.js +29 -11
  607. package/dist/mcp/bundle.js +548 -527
  608. package/dist/mcp/handlers/domain-handler-configs.d.ts +22 -1
  609. package/dist/mcp/handlers/domain-handler-configs.js +50 -19
  610. package/dist/mcp/handlers/domain-handlers.d.ts +7 -5
  611. package/dist/mcp/handlers/domain-handlers.js +7 -5
  612. package/dist/mcp/handlers/index.d.ts +1 -1
  613. package/dist/mcp/handlers/index.js +1 -1
  614. package/dist/mcp/handlers/pipeline-handlers.d.ts +31 -1
  615. package/dist/mcp/handlers/pipeline-handlers.js +63 -0
  616. package/dist/mcp/handlers/task-handlers.d.ts +1 -0
  617. package/dist/mcp/handlers/task-handlers.js +12 -4
  618. package/dist/mcp/protocol-server.d.ts +2 -0
  619. package/dist/mcp/protocol-server.js +112 -53
  620. package/dist/mcp/security/sampling-server.js +2 -1
  621. package/dist/mcp/tool-annotations.js +1 -1
  622. package/dist/mcp/tools/test-execution/schedule.js +7 -0
  623. package/dist/mcp/types.d.ts +10 -1
  624. package/dist/optimization/session-cache.d.ts +5 -0
  625. package/dist/optimization/session-cache.js +23 -0
  626. package/dist/routing/advisor/multi-model-executor.d.ts +4 -1
  627. package/dist/routing/advisor/multi-model-executor.js +8 -1
  628. package/dist/routing/free-tier/ladder.d.ts +2 -1
  629. package/dist/routing/free-tier/ladder.js +3 -2
  630. package/dist/routing/security/cyber-pin.d.ts +35 -11
  631. package/dist/routing/security/cyber-pin.js +76 -14
  632. package/dist/routing/value-score.js +1 -1
  633. package/dist/shared/git/index.d.ts +1 -0
  634. package/dist/shared/git/index.js +1 -0
  635. package/dist/shared/git/ref-validation.d.ts +20 -0
  636. package/dist/shared/git/ref-validation.js +43 -0
  637. package/dist/shared/llm/anthropic-params.d.ts +40 -0
  638. package/dist/shared/llm/anthropic-params.js +51 -0
  639. package/dist/shared/llm/cost-tracker.d.ts +15 -2
  640. package/dist/shared/llm/cost-tracker.js +62 -10
  641. package/dist/shared/llm/index.d.ts +2 -2
  642. package/dist/shared/llm/index.js +2 -2
  643. package/dist/shared/llm/interfaces.d.ts +1 -1
  644. package/dist/shared/llm/metrics/cost-metrics.js +5 -4
  645. package/dist/shared/llm/model-mapping.js +131 -0
  646. package/dist/shared/llm/model-registry.d.ts +37 -11
  647. package/dist/shared/llm/model-registry.js +393 -18
  648. package/dist/shared/llm/openai-params.d.ts +35 -0
  649. package/dist/shared/llm/openai-params.js +54 -0
  650. package/dist/shared/llm/provider-manager.js +4 -3
  651. package/dist/shared/llm/providers/azure-openai.d.ts +11 -0
  652. package/dist/shared/llm/providers/azure-openai.js +26 -15
  653. package/dist/shared/llm/providers/bedrock.js +11 -19
  654. package/dist/shared/llm/providers/claude.js +6 -29
  655. package/dist/shared/llm/providers/codex.js +4 -3
  656. package/dist/shared/llm/providers/gemini.d.ts +3 -2
  657. package/dist/shared/llm/providers/gemini.js +19 -10
  658. package/dist/shared/llm/providers/ollama.d.ts +2 -0
  659. package/dist/shared/llm/providers/ollama.js +30 -20
  660. package/dist/shared/llm/providers/openai.js +10 -17
  661. package/dist/shared/llm/providers/openrouter.d.ts +1 -1
  662. package/dist/shared/llm/providers/openrouter.js +57 -21
  663. package/dist/shared/llm/router/agent-router-config.js +33 -32
  664. package/dist/shared/llm/router/hybrid-router.d.ts +4 -0
  665. package/dist/shared/llm/router/hybrid-router.js +95 -35
  666. package/dist/shared/llm/router/routing-rules.js +9 -8
  667. package/dist/shared/llm/router/types.d.ts +9 -2
  668. package/dist/shared/llm/router/types.js +81 -13
  669. package/dist/shared/llm/translation/message-formatter.js +4 -23
  670. package/dist/shared/test-runner-verdict.d.ts +29 -0
  671. package/dist/shared/test-runner-verdict.js +43 -0
  672. package/dist/shared/vitest-json-report.d.ts +45 -0
  673. package/dist/shared/vitest-json-report.js +80 -0
  674. package/dist/test-scheduling/executors/vitest-executor.d.ts +7 -2
  675. package/dist/test-scheduling/executors/vitest-executor.js +174 -52
  676. package/dist/test-scheduling/git-aware/test-selector.js +3 -0
  677. package/dist/test-scheduling/phase-scheduler.d.ts +1 -0
  678. package/dist/test-scheduling/phase-scheduler.js +23 -1
  679. package/dist/validation/frontier-judge.d.ts +7 -4
  680. package/dist/validation/frontier-judge.js +11 -6
  681. package/package.json +6 -6
  682. package/dist/cli/chunks/adapter-OJF6LAJV.js +0 -2
  683. package/dist/cli/chunks/aqe-learning-engine-FGT474XB.js +0 -2
  684. package/dist/cli/chunks/base-HH765JFV.js +0 -2
  685. package/dist/cli/chunks/brain-handler-5FSA46R5.js +0 -90
  686. package/dist/cli/chunks/browser-workflow-NPM4FUPI.js +0 -2
  687. package/dist/cli/chunks/chunk-2LKAMMMI.js +0 -2
  688. package/dist/cli/chunks/chunk-4AKGBUYD.js +0 -4
  689. package/dist/cli/chunks/chunk-4MH22236.js +0 -2
  690. package/dist/cli/chunks/chunk-4PH7O5ZH.js +0 -2
  691. package/dist/cli/chunks/chunk-4UCMTYFQ.js +0 -65
  692. package/dist/cli/chunks/chunk-DRO5NJZA.js +0 -11
  693. package/dist/cli/chunks/chunk-FPHPP5TQ.js +0 -2
  694. package/dist/cli/chunks/chunk-FREF6Y4L.js +0 -14
  695. package/dist/cli/chunks/chunk-G6AV2HGY.js +0 -54
  696. package/dist/cli/chunks/chunk-GJAWEUIN.js +0 -16
  697. package/dist/cli/chunks/chunk-IUNMW454.js +0 -2
  698. package/dist/cli/chunks/chunk-JDXLCNKV.js +0 -2
  699. package/dist/cli/chunks/chunk-OC2CKU7I.js +0 -2
  700. package/dist/cli/chunks/chunk-OX6T26CD.js +0 -180
  701. package/dist/cli/chunks/chunk-PHHXHG2W.js +0 -2
  702. package/dist/cli/chunks/chunk-SEHCX4NH.js +0 -2
  703. package/dist/cli/chunks/chunk-TENYL5TI.js +0 -14
  704. package/dist/cli/chunks/chunk-U2AY57XZ.js +0 -5
  705. package/dist/cli/chunks/chunk-UYTWDS2R.js +0 -2
  706. package/dist/cli/chunks/chunk-VSYBMNIR.js +0 -2
  707. package/dist/cli/chunks/chunk-WBMRADQP.js +0 -81
  708. package/dist/cli/chunks/chunk-ZWRQ5VAU.js +0 -2
  709. package/dist/cli/chunks/chunk-ZYLSOBOR.js +0 -2
  710. package/dist/cli/chunks/ci-NTRH7PAW.js +0 -81
  711. package/dist/cli/chunks/ci-output-F57RSD35.js +0 -2
  712. package/dist/cli/chunks/client-GPZEC54E.js +0 -2
  713. package/dist/cli/chunks/complexity-analyzer-3FNFLACD.js +0 -2
  714. package/dist/cli/chunks/core-handlers-YMGHYIBR.js +0 -2
  715. package/dist/cli/chunks/cost-tracker-LTZAQBX7.js +0 -2
  716. package/dist/cli/chunks/cross-domain-router-ECBNTGYJ.js +0 -2
  717. package/dist/cli/chunks/dream-EHGKCFWH.js +0 -2
  718. package/dist/cli/chunks/eval-GL544IPO.js +0 -17
  719. package/dist/cli/chunks/fleet-DQVQQONW.js +0 -43
  720. package/dist/cli/chunks/heartbeat-scheduler-UFEL2CBW.js +0 -2
  721. package/dist/cli/chunks/hnsw-adapter-BLSD45CX.js +0 -2
  722. package/dist/cli/chunks/hnsw-index-A3RZODEN.js +0 -2
  723. package/dist/cli/chunks/impact-analyzer-OXHD3FOH.js +0 -2
  724. package/dist/cli/chunks/init-wizard-PKZL7QBU.js +0 -2
  725. package/dist/cli/chunks/kernel-XWPM72UJ.js +0 -2
  726. package/dist/cli/chunks/knowledge-graph-FRKR5XWI.js +0 -2
  727. package/dist/cli/chunks/learning-EV5LSOOM.js +0 -122
  728. package/dist/cli/chunks/llm-router-7LYDJUOT.js +0 -37
  729. package/dist/cli/chunks/llm-router-service-R7A5HHDM.js +0 -2
  730. package/dist/cli/chunks/load-test-5IKDWSYL.js +0 -2
  731. package/dist/cli/chunks/memory-backend-7VW5QCMO.js +0 -2
  732. package/dist/cli/chunks/memory-handlers-VZH3R2TQ.js +0 -2
  733. package/dist/cli/chunks/multi-model-executor-R6XCTMCF.js +0 -14
  734. package/dist/cli/chunks/pattern-null-store-BU6LCB2W.js +0 -2
  735. package/dist/cli/chunks/pipeline-SR5OTY45.js +0 -19
  736. package/dist/cli/chunks/protocol-executor-BSP5LWJN.js +0 -2
  737. package/dist/cli/chunks/qe-reasoning-bank-J2RC7P25.js +0 -2
  738. package/dist/cli/chunks/queen-coordinator-XI5AJV2V.js +0 -2
  739. package/dist/cli/chunks/router-VXQYYA3D.js +0 -2
  740. package/dist/cli/chunks/routing-feedback-HZQTASFF.js +0 -2
  741. package/dist/cli/chunks/rvf-dual-writer-BDTLLJER.js +0 -2
  742. package/dist/cli/chunks/rvf-migration-adapter-IB343MDN.js +0 -2
  743. package/dist/cli/chunks/rvf-native-adapter-Y7SN7LHU.js +0 -2
  744. package/dist/cli/chunks/rvf-store-integrity-OJGWWPLL.js +0 -2
  745. package/dist/cli/chunks/safe-db-2VTKKBJU.js +0 -2
  746. package/dist/cli/chunks/schedule-QJ4CFGJY.js +0 -2
  747. package/dist/cli/chunks/scheduler-2NHDQPC3.js +0 -2
  748. package/dist/cli/chunks/security-JF3BVNRO.js +0 -14
  749. package/dist/cli/chunks/sqlite-persistence-NVVAPZN3.js +0 -2
  750. package/dist/cli/chunks/task-handler-VTNRGAXP.js +0 -49
  751. package/dist/cli/chunks/task-handlers-FYSDH55N.js +0 -9
  752. package/dist/cli/chunks/test-scheduling-GPRXSIRP.js +0 -15
  753. package/dist/cli/chunks/types-OP6IWE6N.js +0 -2
  754. package/dist/cli/chunks/unified-memory-DSTIEDSH.js +0 -2
  755. package/dist/cli/chunks/unified-memory-hnsw-KBV3P4OS.js +0 -2
  756. package/dist/cli/chunks/unified-persistence-XKCOUBKY.js +0 -2
  757. package/dist/cli/chunks/visual-security-TTWSPZTZ.js +0 -2
  758. package/dist/cli/chunks/witness-chain-2KY73HPN.js +0 -2
  759. package/dist/cli/chunks/workflow-HAZ6YKOG.js +0 -51
  760. package/dist/cli/chunks/workflow-orchestrator-UK56AVOT.js +0 -2
@@ -2,12 +2,16 @@
2
2
  * Agentic QE v3 - SAST (Static Application Security Testing) Scanner
3
3
  * Performs static code analysis to detect security vulnerabilities
4
4
  */
5
+ import { createHash } from 'node:crypto';
6
+ import * as path from 'node:path';
7
+ import { FilePath } from '../../../../shared/value-objects/index.js';
5
8
  import { LoggerFactory } from '../../../../logging/index.js';
6
9
  import { v4 as uuidv4 } from 'uuid';
7
10
  import { ok, err } from '../../../../shared/types/index.js';
8
11
  import { ALL_SECURITY_PATTERNS, BUILT_IN_RULE_SETS } from './security-patterns.js';
9
12
  import { toError } from '../../../../shared/error-utils.js';
10
13
  import { safeJsonParse } from '../../../../shared/safe-json.js';
14
+ import { CLAUDE_TIER_MODELS, DEFAULT_OPUS_MODEL } from '../../../../shared/llm/model-registry.js';
11
15
  import { isSemgrepAvailable, runSemgrepWithRules, convertSemgrepFindings, } from '../semgrep-integration.js';
12
16
  // ============================================================================
13
17
  // SAST Scanner Service
@@ -48,30 +52,61 @@ export class SASTScanner {
48
52
  if (files.length === 0) {
49
53
  return err(new Error('No files provided for scanning'));
50
54
  }
51
- this.activeScans.set(scanId, 'running');
52
55
  const startTime = Date.now();
53
56
  // Get applicable rule sets
54
57
  const ruleSets = BUILT_IN_RULE_SETS.filter((rs) => ruleSetIds.includes(rs.id));
55
58
  if (ruleSets.length === 0) {
56
59
  return err(new Error(`No valid rule sets found: ${ruleSetIds.join(', ')}`));
57
60
  }
58
- // Run pattern-based scanning and semgrep in parallel
59
- const [patternResult, semgrepVulns] = await Promise.all([
60
- this.runPatternScanning(files, ruleSets),
61
- this.runSemgrepScanning(files, ruleSetIds),
61
+ const unknownRuleSets = ruleSetIds.filter(id => !BUILT_IN_RULE_SETS.some(ruleSet => ruleSet.id === id));
62
+ if (unknownRuleSets.length > 0) {
63
+ return err(new Error('Unknown rule sets requested; no scan executed.'));
64
+ }
65
+ this.activeScans.set(scanId, 'running');
66
+ // Deduplicate lexical absolute paths; do not follow symlinks to invent identity.
67
+ const requestedPaths = [...new Set(files.map(file => path.resolve(file.value)))];
68
+ const uniqueFiles = requestedPaths.map(value => FilePath.create(value));
69
+ // Run independent engines while retaining each engine's execution outcome.
70
+ const [patternResult, semgrepResult] = await Promise.all([
71
+ this.runPatternScanning(uniqueFiles, ruleSets),
72
+ this.runSemgrepScanning(uniqueFiles, ruleSetIds),
62
73
  ]);
63
74
  // Merge pattern-based and semgrep findings, deduplicating by file+line
64
- const vulnerabilities = this.mergeVulnerabilities(patternResult.vulnerabilities, semgrepVulns);
65
- const linesScanned = patternResult.linesScanned;
75
+ const vulnerabilities = this.mergeVulnerabilities(patternResult.vulnerabilities, semgrepResult.vulnerabilities);
76
+ const analyzedFiles = patternResult.files.filter(file => file.status === 'analyzed');
77
+ const linesScanned = analyzedFiles.reduce((total, file) => total + file.analyzedLines, 0);
66
78
  const scanDurationMs = Date.now() - startTime;
67
79
  // Calculate summary
68
- const summary = this.calculateSummary(vulnerabilities, files.length, scanDurationMs);
69
- // Calculate coverage — include semgrep rules when they ran
70
- const patternRules = ruleSets.reduce((acc, rs) => acc + rs.ruleCount, 0);
80
+ const summary = this.calculateSummary(vulnerabilities, analyzedFiles.length, scanDurationMs);
81
+ const patterns = this.getApplicablePatterns(ruleSets);
82
+ const ruleIds = analyzedFiles.length > 0 ? [...new Set(patterns.map(pattern => pattern.id))] : [];
71
83
  const coverage = {
72
- filesScanned: files.length,
84
+ filesScanned: analyzedFiles.length,
73
85
  linesScanned,
74
- rulesApplied: patternRules + (semgrepVulns.length > 0 ? semgrepVulns.length : 0),
86
+ rulesApplied: ruleIds.length,
87
+ rulesAppliedScope: 'built-in-patterns',
88
+ };
89
+ const patternEngine = {
90
+ id: 'patterns', requested: true, required: true, scope: 'requested-files',
91
+ status: analyzedFiles.length === uniqueFiles.length ? 'completed' : analyzedFiles.length > 0 ? 'partial' : 'failed',
92
+ analyzedFiles: analyzedFiles.length,
93
+ ruleIds,
94
+ rulesetDigest: createHash('sha256').update(JSON.stringify(patterns.map(pattern => ({
95
+ id: pattern.id, category: pattern.category, expression: pattern.pattern.source, flags: pattern.pattern.flags,
96
+ })))).digest('hex'),
97
+ ruleCoverage: 'known',
98
+ errors: patternResult.files.filter(file => file.status === 'unreadable').map(file => file.reason || 'File unreadable'),
99
+ limitations: ['Built-in pattern matching covers supported JavaScript and TypeScript inputs only.'],
100
+ };
101
+ const evidence = {
102
+ schemaVersion: 1,
103
+ completeness: analyzedFiles.length === uniqueFiles.length ? 'complete' : analyzedFiles.length > 0 ? 'partial' : 'none',
104
+ requestedFiles: uniqueFiles.length,
105
+ requestedPaths,
106
+ duplicateInputs: files.length - uniqueFiles.length,
107
+ files: patternResult.files,
108
+ engines: [patternEngine, semgrepResult.evidence],
109
+ limitations: [...patternEngine.limitations, ...semgrepResult.evidence.limitations],
75
110
  };
76
111
  // Store scan results in memory
77
112
  await this.storeScanResults(scanId, 'sast', vulnerabilities, summary);
@@ -81,6 +116,7 @@ export class SASTScanner {
81
116
  vulnerabilities,
82
117
  summary,
83
118
  coverage,
119
+ evidence,
84
120
  });
85
121
  }
86
122
  catch (error) {
@@ -93,36 +129,48 @@ export class SASTScanner {
93
129
  */
94
130
  async runPatternScanning(files, ruleSets) {
95
131
  const vulnerabilities = [];
96
- let linesScanned = 0;
132
+ const receipts = [];
97
133
  for (const file of files) {
98
- const fileVulns = await this.analyzeFile(file, ruleSets);
99
- vulnerabilities.push(...fileVulns.vulnerabilities);
100
- linesScanned += fileVulns.linesScanned;
134
+ const result = await this.analyzeFile(file, ruleSets);
135
+ vulnerabilities.push(...result.vulnerabilities);
136
+ receipts.push(result.evidence);
101
137
  }
102
- return { vulnerabilities, linesScanned };
138
+ return { vulnerabilities, files: receipts };
103
139
  }
104
140
  /**
105
141
  * Run semgrep scanning when enabled and available.
106
- * Returns converted vulnerabilities or empty array on failure/unavailability.
142
+ * Optional engine failure preserves completed pattern analysis and its findings.
107
143
  */
108
144
  async runSemgrepScanning(files, ruleSetIds) {
145
+ const targetDir = this.resolveTargetDirectory(files);
146
+ const base = {
147
+ id: 'semgrep', requested: !!this.config.enableSemgrep, required: false,
148
+ status: 'disabled', scope: 'parent-directory', target: targetDir,
149
+ ruleCoverage: 'unknown', errors: [], limitations: [],
150
+ };
109
151
  if (!this.config.enableSemgrep) {
110
- return [];
152
+ return { vulnerabilities: [], evidence: base };
111
153
  }
154
+ const limitations = [
155
+ 'Optional Semgrep scans a parent directory; requested-file membership and executed-rule coverage are unverified.',
156
+ ];
112
157
  try {
113
- const available = await isSemgrepAvailable();
114
- if (!available) {
115
- return [];
158
+ if (!await isSemgrepAvailable()) {
159
+ return { vulnerabilities: [], evidence: { ...base, status: 'unavailable', limitations,
160
+ errors: ['Semgrep is unavailable.'] } };
116
161
  }
117
- // Determine target directory from files (use common parent)
118
- const targetDir = this.resolveTargetDirectory(files);
119
162
  const semgrepResult = await runSemgrepWithRules(targetDir, ruleSetIds);
120
- if (!semgrepResult.success || semgrepResult.findings.length === 0) {
121
- return [];
122
- }
163
+ const evidence = {
164
+ ...base,
165
+ status: semgrepResult.status || 'unverified',
166
+ version: semgrepResult.version,
167
+ errors: semgrepResult.errors.length > 0 ? [`Semgrep reported ${semgrepResult.errors.length} execution error(s).`] : [],
168
+ limitations: [...limitations, ...(semgrepResult.diagnostics ?? []),
169
+ ...(!semgrepResult.status ? ['Legacy Semgrep adapter returned no execution disposition.'] : [])],
170
+ };
123
171
  // Convert semgrep findings to our Vulnerability format
124
172
  const converted = convertSemgrepFindings(semgrepResult.findings);
125
- return converted.map(f => ({
173
+ const vulnerabilities = converted.map(f => ({
126
174
  id: uuidv4(),
127
175
  cveId: undefined,
128
176
  title: f.title,
@@ -142,10 +190,11 @@ export class SASTScanner {
142
190
  },
143
191
  references: f.references,
144
192
  }));
193
+ return { vulnerabilities, evidence };
145
194
  }
146
195
  catch {
147
- // Semgrep failure is non-fatal — pattern scanning still covers us
148
- return [];
196
+ return { vulnerabilities: [], evidence: { ...base, status: 'failed', limitations,
197
+ errors: ['Semgrep execution failed.'] } };
149
198
  }
150
199
  }
151
200
  /**
@@ -153,25 +202,18 @@ export class SASTScanner {
153
202
  */
154
203
  resolveTargetDirectory(files) {
155
204
  if (files.length === 0)
156
- return '.';
157
- if (files.length === 1)
158
- return files[0].directory || '.';
159
- // Find common prefix of all directories
160
- const dirs = files.map(f => f.directory || '.');
161
- const first = dirs[0];
162
- let commonLen = first.length;
163
- for (let i = 1; i < dirs.length; i++) {
164
- const dir = dirs[i];
165
- const maxLen = Math.min(commonLen, dir.length);
166
- let j = 0;
167
- while (j < maxLen && first[j] === dir[j])
168
- j++;
169
- commonLen = j;
205
+ return process.cwd();
206
+ let common = path.dirname(path.resolve(files[0].value));
207
+ for (const file of files.slice(1)) {
208
+ const directory = path.dirname(path.resolve(file.value));
209
+ while (directory !== common && !directory.startsWith(common.endsWith(path.sep) ? common : common + path.sep)) {
210
+ const parent = path.dirname(common);
211
+ if (parent === common)
212
+ break;
213
+ common = parent;
214
+ }
170
215
  }
171
- const common = first.substring(0, commonLen);
172
- // Trim to last path separator
173
- const lastSep = common.lastIndexOf('/');
174
- return lastSep > 0 ? common.substring(0, lastSep) : common || '.';
216
+ return common;
175
217
  }
176
218
  /**
177
219
  * Map semgrep OWASP category string to VulnerabilityCategory
@@ -250,32 +292,35 @@ export class SASTScanner {
250
292
  /**
251
293
  * Analyze a file for security vulnerabilities using pattern-based detection
252
294
  */
295
+ getApplicablePatterns(ruleSets) {
296
+ const categories = new Set(ruleSets.flatMap(ruleSet => ruleSet.categories));
297
+ return ALL_SECURITY_PATTERNS.filter(pattern => categories.has(pattern.category));
298
+ }
253
299
  async analyzeFile(file, ruleSets) {
254
300
  const vulnerabilities = [];
255
301
  const filePath = file.value;
256
- const extension = file.extension;
257
- // Read file content
302
+ const receipt = { path: filePath, engineId: 'patterns', readLines: 0, analyzedLines: 0 };
258
303
  let content;
259
- let lines;
304
+ let sourceDigest;
260
305
  try {
261
306
  const fs = await import('fs/promises');
262
- content = await fs.readFile(filePath, 'utf-8');
263
- lines = content.split('\n');
307
+ const bytes = await fs.readFile(filePath);
308
+ sourceDigest = createHash('sha256').update(bytes).digest('hex');
309
+ content = bytes.toString('utf8');
264
310
  }
265
- catch {
266
- // File not accessible - return empty results
267
- return { vulnerabilities: [], linesScanned: 0 };
311
+ catch (error) {
312
+ const code = error.code;
313
+ return { vulnerabilities: [], evidence: { ...receipt, status: 'unreadable',
314
+ reason: typeof code === 'string' && /^[A-Z0-9_]{1,32}$/.test(code) ? code : 'File unreadable' } };
268
315
  }
269
- const linesScanned = lines.length;
270
- // Only scan supported file types
316
+ const lines = content.split('\n');
317
+ const readReceipt = { ...receipt, sourceDigest, readLines: lines.length };
271
318
  const supportedExtensions = ['ts', 'tsx', 'js', 'jsx', 'mjs', 'cjs'];
272
- if (!supportedExtensions.includes(extension)) {
273
- return { vulnerabilities: [], linesScanned };
319
+ if (!supportedExtensions.includes(file.extension)) {
320
+ return { vulnerabilities: [], evidence: { ...readReceipt, status: 'unsupported',
321
+ reason: 'Unsupported language for built-in SAST patterns' } };
274
322
  }
275
- // Get applicable categories from rule sets
276
- const applicableCategories = new Set(ruleSets.flatMap((rs) => rs.categories));
277
- // Filter patterns to only those matching applicable categories
278
- const applicablePatterns = ALL_SECURITY_PATTERNS.filter((pattern) => applicableCategories.has(pattern.category));
323
+ const applicablePatterns = this.getApplicablePatterns(ruleSets);
279
324
  // Scan content for each pattern
280
325
  for (const securityPattern of applicablePatterns) {
281
326
  const matches = this.findPatternMatches(content, lines, securityPattern);
@@ -291,7 +336,7 @@ export class SASTScanner {
291
336
  vulnerabilities.push(this.createVulnerabilityFromPattern(securityPattern, filePath, match));
292
337
  }
293
338
  }
294
- return { vulnerabilities, linesScanned };
339
+ return { vulnerabilities, evidence: { ...readReceipt, status: 'analyzed', analyzedLines: lines.length } };
295
340
  }
296
341
  /**
297
342
  * Find all matches of a security pattern in the file content
@@ -493,13 +538,8 @@ export class SASTScanner {
493
538
  * Get model ID for the configured tier
494
539
  */
495
540
  getModelForTier(tier) {
496
- switch (tier) {
497
- case 1: return 'claude-haiku-4-5-20251001';
498
- case 2: return 'claude-sonnet-4-6';
499
- case 3: return 'claude-sonnet-4-6';
500
- case 4: return 'claude-opus-4-7';
501
- default: return 'claude-opus-4-7'; // Default to Opus for security
502
- }
541
+ // Default to Opus for security when the tier is out of range
542
+ return CLAUDE_TIER_MODELS[tier] ?? DEFAULT_OPUS_MODEL;
503
543
  }
504
544
  /**
505
545
  * Analyze vulnerability with LLM for deeper insights
@@ -9,6 +9,8 @@
9
9
  *
10
10
  * @module security-compliance/semgrep-integration
11
11
  */
12
+ declare const SEMGREP_SEVERITIES: readonly ["ERROR", "WARNING", "INFO", "CRITICAL", "HIGH", "MEDIUM", "LOW", "EXPERIMENT", "INVENTORY"];
13
+ export type SemgrepSeverity = typeof SEMGREP_SEVERITIES[number];
12
14
  export interface SemgrepFinding {
13
15
  check_id: string;
14
16
  path: string;
@@ -22,7 +24,7 @@ export interface SemgrepFinding {
22
24
  };
23
25
  extra: {
24
26
  message: string;
25
- severity: 'ERROR' | 'WARNING' | 'INFO';
27
+ severity: SemgrepSeverity;
26
28
  lines: string;
27
29
  metadata?: {
28
30
  cwe?: string[];
@@ -37,8 +39,12 @@ export interface SemgrepFinding {
37
39
  }
38
40
  export interface SemgrepResult {
39
41
  success: boolean;
42
+ /** Optional only for compatibility with legacy adapters. */
43
+ status?: 'completed' | 'partial' | 'failed' | 'unavailable';
40
44
  findings: SemgrepFinding[];
41
45
  errors: string[];
46
+ /** Sanitized non-fatal diagnostics, separate from analysis failures. */
47
+ diagnostics?: string[];
42
48
  version?: string;
43
49
  }
44
50
  export interface SemgrepConfig {
@@ -74,7 +80,7 @@ export declare function runSemgrepWithRules(target: string, rules: string[], opt
74
80
  /**
75
81
  * Map semgrep severity to standard severity
76
82
  */
77
- export declare function mapSemgrepSeverity(severity: 'ERROR' | 'WARNING' | 'INFO'): 'critical' | 'high' | 'medium' | 'low';
83
+ export declare function mapSemgrepSeverity(severity: SemgrepSeverity): 'critical' | 'high' | 'medium' | 'low';
78
84
  /**
79
85
  * Convert semgrep findings to a generic format
80
86
  */
@@ -92,4 +98,5 @@ export declare function convertSemgrepFindings(findings: SemgrepFinding[]): Arra
92
98
  remediation: string;
93
99
  references: string[];
94
100
  }>;
101
+ export {};
95
102
  //# sourceMappingURL=semgrep-integration.d.ts.map
@@ -12,10 +12,15 @@
12
12
  import { execFile } from 'child_process';
13
13
  import { promisify } from 'util';
14
14
  import * as path from 'path';
15
- import { toErrorMessage } from '../../../shared/error-utils.js';
16
15
  import { safeJsonParse } from '../../../shared/safe-json.js';
17
16
  const execFileAsync = promisify(execFile);
18
17
  // ============================================================================
18
+ // Types
19
+ // ============================================================================
20
+ // Semgrep's match_severity schema retains legacy/deprecated values as well as
21
+ // CRITICAL/HIGH/MEDIUM/LOW introduced in 1.72.0.
22
+ const SEMGREP_SEVERITIES = ['ERROR', 'WARNING', 'INFO', 'CRITICAL', 'HIGH', 'MEDIUM', 'LOW', 'EXPERIMENT', 'INVENTORY'];
23
+ // ============================================================================
19
24
  // Semgrep Integration
20
25
  // ============================================================================
21
26
  /**
@@ -59,8 +64,9 @@ export async function runSemgrep(config) {
59
64
  if (!available) {
60
65
  return {
61
66
  success: false,
67
+ status: 'unavailable',
62
68
  findings: [],
63
- errors: ['Semgrep is not installed. Install with: pip install semgrep'],
69
+ errors: ['Semgrep is unavailable.'],
64
70
  };
65
71
  }
66
72
  try {
@@ -87,28 +93,26 @@ export async function runSemgrep(config) {
87
93
  });
88
94
  const result = parseSemgrepOutput(stdout);
89
95
  if (stderr && fullConfig.verbose) {
90
- result.errors.push(stderr);
96
+ result.diagnostics = ['Semgrep emitted diagnostic output.'];
91
97
  }
92
98
  result.version = await getSemgrepVersion() || undefined;
93
99
  return result;
94
100
  }
95
101
  catch (error) {
96
- // Semgrep exits with non-zero if findings exist
97
102
  const execError = error;
98
- if (execError.stdout) {
99
- try {
100
- const result = parseSemgrepOutput(execError.stdout);
101
- result.version = await getSemgrepVersion() || undefined;
103
+ if (typeof execError.stdout === 'string' && execError.stdout.length > 0) {
104
+ const result = parseSemgrepOutput(execError.stdout);
105
+ // Exit 1 can represent findings with --error. Other process failures cannot
106
+ // be converted into success just because stdout contains valid JSON.
107
+ if (execError.code === 1 && !execError.killed && !execError.signal && result.success && result.findings.length > 0) {
102
108
  return result;
103
109
  }
104
- catch {
105
- // Parse failed, return error
106
- }
110
+ return { ...result, success: false, status: 'failed',
111
+ errors: [...result.errors, 'Semgrep process did not complete successfully.'] };
107
112
  }
108
113
  return {
109
- success: false,
110
- findings: [],
111
- errors: [execError.message ?? String(error)],
114
+ success: false, status: 'failed', findings: [],
115
+ errors: ['Semgrep execution failed.'],
112
116
  };
113
117
  }
114
118
  }
@@ -118,11 +122,47 @@ export async function runSemgrep(config) {
118
122
  function parseSemgrepOutput(stdout) {
119
123
  try {
120
124
  const parsed = safeJsonParse(stdout);
121
- // Handle different output formats
122
- const results = parsed.results || parsed.findings || [];
123
- const errors = parsed.errors?.map(e => e.message || String(e)) || [];
125
+ if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {
126
+ throw new Error('Expected a JSON object');
127
+ }
128
+ const rawResults = parsed.results ?? parsed.findings;
129
+ if (!Array.isArray(rawResults) || (parsed.errors !== undefined && !Array.isArray(parsed.errors))) {
130
+ throw new Error('Missing or invalid result collection');
131
+ }
132
+ const isRecord = (value) => !!value && typeof value === 'object' && !Array.isArray(value);
133
+ const optionalText = (value) => value === undefined || typeof value === 'string';
134
+ const validSeverity = (value) => value === undefined
135
+ || (typeof value === 'string' && SEMGREP_SEVERITIES.includes(value));
136
+ const validPosition = (value) => value === undefined || (isRecord(value)
137
+ && ['line', 'col'].every(key => value[key] === undefined
138
+ || (typeof value[key] === 'number' && Number.isSafeInteger(value[key]) && value[key] > 0)));
139
+ const validMetadata = (value) => value === undefined || (isRecord(value)
140
+ && ['cwe', 'owasp', 'references'].every(key => value[key] === undefined
141
+ || (Array.isArray(value[key]) && value[key].every(item => typeof item === 'string')))
142
+ && ['category', 'description', 'fix', 'confidence'].every(key => optionalText(value[key])));
143
+ const validFinding = (value) => {
144
+ if (!isRecord(value))
145
+ return false;
146
+ const id = value.check_id ?? value.rule_id;
147
+ if (typeof value.path !== 'string' || value.path.length === 0 || typeof id !== 'string' || id.length === 0
148
+ || !validPosition(value.start) || !validPosition(value.end)
149
+ || !optionalText(value.message) || !validSeverity(value.severity) || !validMetadata(value.metadata))
150
+ return false;
151
+ const extra = value.extra;
152
+ return extra === undefined || (isRecord(extra)
153
+ && ['message', 'lines', 'fix'].every(key => optionalText(extra[key]))
154
+ && validSeverity(extra.severity) && validMetadata(extra.metadata));
155
+ };
156
+ const results = rawResults.filter(validFinding);
157
+ const malformed = rawResults.length - results.length;
158
+ const errors = [];
159
+ if (parsed.errors?.length)
160
+ errors.push(`Semgrep reported ${parsed.errors.length} analysis error(s).`);
161
+ if (malformed)
162
+ errors.push(`Semgrep returned ${malformed} malformed finding(s).`);
124
163
  return {
125
- success: true,
164
+ success: errors.length === 0,
165
+ status: errors.length === 0 ? 'completed' : 'partial',
126
166
  findings: results.map(r => ({
127
167
  check_id: r.check_id || r.rule_id || 'unknown',
128
168
  path: r.path,
@@ -146,11 +186,12 @@ function parseSemgrepOutput(stdout) {
146
186
  errors,
147
187
  };
148
188
  }
149
- catch (error) {
189
+ catch {
150
190
  return {
151
191
  success: false,
192
+ status: 'failed',
152
193
  findings: [],
153
- errors: [`Failed to parse semgrep output: ${toErrorMessage(error)}`],
194
+ errors: ['Invalid Semgrep output.'],
154
195
  };
155
196
  }
156
197
  }
@@ -191,6 +232,13 @@ export function mapSemgrepSeverity(severity) {
191
232
  ERROR: 'high',
192
233
  WARNING: 'medium',
193
234
  INFO: 'low',
235
+ CRITICAL: 'critical',
236
+ HIGH: 'high',
237
+ MEDIUM: 'medium',
238
+ LOW: 'low',
239
+ // Retain the existing non-risky INFO mapping for deprecated categories.
240
+ EXPERIMENT: 'low',
241
+ INVENTORY: 'low',
194
242
  };
195
243
  return mapping[severity] || 'medium';
196
244
  }
@@ -11,6 +11,8 @@ import { ok, err } from '../../../shared/types/index.js';
11
11
  import { TEST_EXECUTION_CONSTANTS, RETRY_CONSTANTS } from '../../constants.js';
12
12
  import { toError } from '../../../shared/error-utils.js';
13
13
  import { safeJsonParse } from '../../../shared/safe-json.js';
14
+ import { getTestRunnerExecutionError } from '../../../shared/test-runner-verdict.js';
15
+ import { createVitestJsonReport, needsVitestJsonReportFile } from '../../../shared/vitest-json-report.js';
14
16
  import { secureRandom } from '../../../shared/utils/crypto-random.js';
15
17
  const DEFAULT_FLAKY_CONFIG = {
16
18
  simulateForTesting: false,
@@ -254,7 +256,13 @@ export class FlakyDetectorService {
254
256
  const runId = uuidv4();
255
257
  const startTime = Date.now();
256
258
  return new Promise((resolve, reject) => {
257
- const args = [...this.config.testRunnerArgs, file];
259
+ const baseArgs = [...this.config.testRunnerArgs, file];
260
+ // Vitest 5 writes --reporter=json output to a file, not stdout. Detect
261
+ // Vitest from the runner command too (testRunner: 'vitest', args: ['run', ...]).
262
+ const report = needsVitestJsonReportFile([this.config.testRunner, ...baseArgs])
263
+ ? createVitestJsonReport()
264
+ : undefined;
265
+ const args = report ? [...baseArgs, ...report.args] : baseArgs;
258
266
  const cwd = this.config.cwd ?? process.cwd();
259
267
  const child = spawn(this.config.testRunner, args, {
260
268
  cwd,
@@ -272,21 +280,50 @@ export class FlakyDetectorService {
272
280
  // Set timeout
273
281
  const timeout = setTimeout(() => {
274
282
  child.kill('SIGTERM');
283
+ report?.cleanup();
275
284
  reject(new Error(`Test execution timed out after ${this.config.runTimeout}ms for ${file}`));
276
285
  }, this.config.runTimeout);
277
286
  child.on('error', (error) => {
278
287
  clearTimeout(timeout);
288
+ report?.cleanup();
279
289
  reject(new Error(`Failed to execute test runner: ${error.message}. ` +
280
290
  `Ensure ${this.config.testRunner} is installed and accessible.`));
281
291
  });
282
292
  child.on('close', (code) => {
283
293
  clearTimeout(timeout);
284
294
  const duration = Date.now() - startTime;
295
+ let reportText;
285
296
  try {
286
- // Parse the test results from stdout
287
- const parsedResults = this.parseTestOutput(stdout, stderr, code ?? 0, file, runId, runIndex, duration);
297
+ reportText = report ? report.read(stdout) : stdout;
298
+ }
299
+ catch (error) {
300
+ report?.cleanup();
301
+ reject(toError(error));
302
+ return;
303
+ }
304
+ report?.cleanup();
305
+ if (reportText === undefined) {
306
+ reject(new Error(`The current Vitest JSON report is missing for ${file}.`));
307
+ return;
308
+ }
309
+ try {
310
+ // Parse the test results from the JSON report (or stdout for other runners)
311
+ const parsedResults = this.parseTestOutput(reportText, stderr, code ?? 0, file, runId, runIndex, duration);
312
+ if (report) {
313
+ const verdictReport = safeJsonParse(reportText);
314
+ const assertions = verdictReport.testResults?.flatMap(suite => suite.assertionResults ?? []) ?? [];
315
+ const executionError = getTestRunnerExecutionError('vitest', file, code, {
316
+ passed: assertions.filter(test => test.status === 'passed').length,
317
+ failed: assertions.filter(test => test.status === 'failed').length,
318
+ skipped: assertions.filter(test => test.status === 'skipped' || test.status === 'pending').length,
319
+ }, stderr, verdictReport);
320
+ if (executionError)
321
+ throw executionError;
322
+ }
288
323
  // If parsing fails but we have an exit code, create a single result for the file
289
324
  if (parsedResults.size === 0) {
325
+ if (report)
326
+ throw new Error(`The current Vitest JSON report has no test results for ${file}.`);
290
327
  const testId = this.generateTestId(file, 'main');
291
328
  results.set(testId, [
292
329
  {
@@ -310,6 +347,10 @@ export class FlakyDetectorService {
310
347
  resolve(results);
311
348
  }
312
349
  catch (parseError) {
350
+ if (report) {
351
+ reject(toError(parseError));
352
+ return;
353
+ }
313
354
  // If we can't parse output but process completed, create result from exit code
314
355
  const testId = this.generateTestId(file, 'main');
315
356
  results.set(testId, [
@@ -345,7 +386,7 @@ export class FlakyDetectorService {
345
386
  return this.parseVitestJson(parsed, file, runId, runIndex);
346
387
  }
347
388
  }
348
- catch (error) {
389
+ catch {
349
390
  // Non-critical: not valid JSON, try other formats
350
391
  logger.debug('Vitest JSON parse failed:');
351
392
  }
@@ -359,7 +400,7 @@ export class FlakyDetectorService {
359
400
  }
360
401
  }
361
402
  }
362
- catch (error) {
403
+ catch {
363
404
  // Non-critical: not Jest format
364
405
  logger.debug('Jest JSON parse failed:');
365
406
  }