agentic-qe 3.14.7 → 3.14.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (393) hide show
  1. package/.claude/helpers/.helpers-version +1 -1
  2. package/.claude/helpers/auto-memory-hook.mjs +18 -9
  3. package/.claude/helpers/helpers.manifest.json +6 -5
  4. package/.claude/helpers/hook-handler.cjs +40 -12
  5. package/.claude/helpers/memory.cjs +86 -0
  6. package/.claude/helpers/router.cjs +105 -0
  7. package/.claude/helpers/session.cjs +166 -0
  8. package/.claude/helpers/statusline.cjs +73 -621
  9. package/.claude/skills/skills-manifest.json +1 -1
  10. package/CHANGELOG.md +130 -0
  11. package/assets/skills/skills-manifest.json +1 -1
  12. package/dist/adapters/a2a/notifications/retry-queue.js +5 -0
  13. package/dist/adapters/claude-flow/pretrain-bridge.js +3 -2
  14. package/dist/agents/claim-verifier/verifiers/file-verifier.js +3 -2
  15. package/dist/cli/bundle.js +6 -6
  16. package/dist/cli/chunks/adapter-XYCOXQCC.js +2 -0
  17. package/dist/cli/chunks/{agent-booster-wasm-AK2W76RG.js → agent-booster-wasm-67OKGDGZ.js} +2 -2
  18. package/dist/cli/chunks/{agent-handler-MGZCWHIY.js → agent-handler-4HZEQ3WQ.js} +2 -2
  19. package/dist/cli/chunks/{agent-memory-branch-JZ54MCSP.js → agent-memory-branch-IBHZQSRN.js} +2 -2
  20. package/dist/cli/chunks/aqe-learning-engine-DTJCROTG.js +2 -0
  21. package/dist/cli/chunks/{arena-CUVH3V7H.js → arena-EJBIGSF4.js} +2 -2
  22. package/dist/cli/chunks/{arena-YSWTKBCL.js → arena-LCLRGUIK.js} +4 -4
  23. package/dist/cli/chunks/{audit-LVU76QGA.js → audit-PY4JNDQQ.js} +3 -3
  24. package/dist/cli/chunks/base-5TQ34GMD.js +2 -0
  25. package/dist/cli/chunks/{better-sqlite3-DB3LOJQU.js → better-sqlite3-2JG5K6XT.js} +2 -2
  26. package/dist/cli/chunks/{brain-handler-SD63KOQ6.js → brain-handler-3UYK55GA.js} +4 -4
  27. package/dist/cli/chunks/{branch-enumerator-4MNOPUC7.js → branch-enumerator-GOSWOX46.js} +2 -2
  28. package/dist/cli/chunks/{browser-OLPNTWQE.js → browser-DC2JV47Z.js} +2 -2
  29. package/dist/cli/chunks/browser-workflow-KWX4ESTJ.js +2 -0
  30. package/dist/cli/chunks/{chunk-QQFQDEUE.js → chunk-25EEIAHS.js} +2 -2
  31. package/dist/cli/chunks/{chunk-DOBKEXMJ.js → chunk-3576QGPP.js} +1 -1
  32. package/dist/cli/chunks/{chunk-3M7J4U74.js → chunk-3EKG7HFV.js} +4 -4
  33. package/dist/cli/chunks/{chunk-DYTQHRUS.js → chunk-3FCHH4VP.js} +1 -1
  34. package/dist/cli/chunks/{chunk-EJ6MMYLK.js → chunk-3S5IIK32.js} +1 -1
  35. package/dist/cli/chunks/{chunk-NOHWJOBS.js → chunk-3X2JSW3R.js} +1 -1
  36. package/dist/cli/chunks/{chunk-7EZ2Z2CK.js → chunk-4HXFPBAA.js} +1 -1
  37. package/dist/cli/chunks/{chunk-XBYQ2BS4.js → chunk-4PY44TKH.js} +2 -2
  38. package/dist/cli/chunks/{chunk-5FSLMYAC.js → chunk-4RNCVSVN.js} +2 -2
  39. package/dist/cli/chunks/{chunk-X7ADKL7T.js → chunk-56M4QNXU.js} +2 -2
  40. package/dist/cli/chunks/{chunk-JHJUSSAU.js → chunk-5X4HDW5W.js} +2 -2
  41. package/dist/cli/chunks/{chunk-7MIOK72I.js → chunk-673XJBGW.js} +7 -7
  42. package/dist/cli/chunks/{chunk-77QZHIVX.js → chunk-6F7MFHTY.js} +2 -2
  43. package/dist/cli/chunks/{chunk-Q6NTEICT.js → chunk-6GJWT2OY.js} +2 -2
  44. package/dist/cli/chunks/{chunk-GV4DYPJP.js → chunk-6GNWVPMR.js} +2 -2
  45. package/dist/cli/chunks/{chunk-V5AK56DA.js → chunk-6VTC3OHD.js} +2 -2
  46. package/dist/cli/chunks/{chunk-MM56VPNE.js → chunk-775WGWLL.js} +3 -3
  47. package/dist/cli/chunks/{chunk-A3DK3XNZ.js → chunk-77WL5HQW.js} +1 -1
  48. package/dist/cli/chunks/chunk-7STWD4KJ.js +3 -0
  49. package/dist/cli/chunks/{chunk-RC2A4JZ5.js → chunk-7TNCEVWX.js} +2 -2
  50. package/dist/cli/chunks/{chunk-XL5KIYE3.js → chunk-7X3LMTRA.js} +2 -2
  51. package/dist/cli/chunks/{chunk-VW6FRMLW.js → chunk-A53MMSGC.js} +2 -2
  52. package/dist/cli/chunks/{chunk-UFSVUBTR.js → chunk-A5CLVZC3.js} +2 -2
  53. package/dist/cli/chunks/{chunk-4INST4ZL.js → chunk-AEYJ4ZLA.js} +1 -1
  54. package/dist/cli/chunks/{chunk-5U6N4V5M.js → chunk-AJ5PCJQ2.js} +4 -4
  55. package/dist/cli/chunks/{chunk-OAZX6WFU.js → chunk-AJMAKUS3.js} +2 -2
  56. package/dist/cli/chunks/{chunk-74IOEOMH.js → chunk-AOD2ES44.js} +2 -2
  57. package/dist/cli/chunks/chunk-AR2S4DOB.js +2 -0
  58. package/dist/cli/chunks/{chunk-PYKY22GC.js → chunk-AUFV2G2J.js} +5 -5
  59. package/dist/cli/chunks/{chunk-KD2BLA5Y.js → chunk-B2QKBQYD.js} +1 -1
  60. package/dist/cli/chunks/{chunk-6EGS77BB.js → chunk-BCCSV3RH.js} +1 -1
  61. package/dist/cli/chunks/{chunk-JOZ47MV6.js → chunk-BFIXUKOR.js} +1 -1
  62. package/dist/cli/chunks/chunk-BHPTHC5O.js +4 -0
  63. package/dist/cli/chunks/{chunk-OIDWDGLG.js → chunk-BITFGVZ4.js} +2 -2
  64. package/dist/cli/chunks/{chunk-ONR2NXXD.js → chunk-BL6273KR.js} +3 -3
  65. package/dist/cli/chunks/{chunk-BLG7SH4A.js → chunk-BOIUENWW.js} +1 -1
  66. package/dist/cli/chunks/{chunk-T77GZF4B.js → chunk-BT3MI2BW.js} +1 -1
  67. package/dist/cli/chunks/{chunk-UYUJT6QO.js → chunk-BTBJ2NLH.js} +2 -2
  68. package/dist/cli/chunks/{chunk-YMW57PEL.js → chunk-BUVJIVFG.js} +1 -1
  69. package/dist/cli/chunks/{chunk-QUORH2MG.js → chunk-BZIPW2PA.js} +8 -8
  70. package/dist/cli/chunks/{chunk-GVVFTFMB.js → chunk-C647D42G.js} +2 -2
  71. package/dist/cli/chunks/{chunk-AJUBT4NP.js → chunk-CBWM5NOO.js} +3 -3
  72. package/dist/cli/chunks/{chunk-F2OPFVQH.js → chunk-CIEXUYY7.js} +1 -1
  73. package/dist/cli/chunks/{chunk-QGOWNVVG.js → chunk-CLUHGBLN.js} +4 -4
  74. package/dist/cli/chunks/{chunk-WOV6XI3A.js → chunk-CQEWL32R.js} +1 -1
  75. package/dist/cli/chunks/{chunk-3QJU4Q4R.js → chunk-CXUC7YKA.js} +2 -2
  76. package/dist/cli/chunks/{chunk-HZY42OVU.js → chunk-D2Y36V5J.js} +2 -2
  77. package/dist/cli/chunks/{chunk-WF6UISKW.js → chunk-DSJJHPPS.js} +4 -4
  78. package/dist/cli/chunks/{chunk-FYPX5WBJ.js → chunk-DZHXCOSK.js} +1 -1
  79. package/dist/cli/chunks/{chunk-TXSPBLBT.js → chunk-EBV3WFIR.js} +2 -2
  80. package/dist/cli/chunks/{chunk-Y6AKKQIQ.js → chunk-EKO5QL2B.js} +1 -1
  81. package/dist/cli/chunks/{chunk-MZB2UV2O.js → chunk-EMOZ5O5S.js} +1 -1
  82. package/dist/cli/chunks/{chunk-23CX7JNL.js → chunk-ES7TAJRJ.js} +2 -2
  83. package/dist/cli/chunks/{chunk-Z4Q5PCRZ.js → chunk-EXQGHTPD.js} +4 -4
  84. package/dist/cli/chunks/{chunk-A2VUCUTT.js → chunk-F2WAB4WK.js} +2 -2
  85. package/dist/cli/chunks/{chunk-CQNMGK6Y.js → chunk-F57FTFWS.js} +2 -2
  86. package/dist/cli/chunks/{chunk-OEPNNLR4.js → chunk-F6JJNBE5.js} +1 -1
  87. package/dist/cli/chunks/{chunk-UBJG3IHT.js → chunk-FRC7AFB4.js} +2 -2
  88. package/dist/cli/chunks/{chunk-2G63VIJE.js → chunk-G36RZF2Y.js} +1 -1
  89. package/dist/cli/chunks/{chunk-YRHTQZU4.js → chunk-G3C7Z6FO.js} +2 -2
  90. package/dist/cli/chunks/{chunk-B4I43GE2.js → chunk-GA63ESNT.js} +2 -2
  91. package/dist/cli/chunks/{chunk-7QYOTUOX.js → chunk-GHMJFICO.js} +2 -2
  92. package/dist/cli/chunks/{chunk-HYOPJHHW.js → chunk-GK5WLUX3.js} +1 -1
  93. package/dist/cli/chunks/{chunk-A5MA7A23.js → chunk-GQJ4QDEN.js} +6 -6
  94. package/dist/cli/chunks/{chunk-UA7TDVL7.js → chunk-GVLRE3BV.js} +4 -4
  95. package/dist/cli/chunks/{chunk-25P6JA6V.js → chunk-H5UH234L.js} +1 -1
  96. package/dist/cli/chunks/{chunk-BE4KALTE.js → chunk-HBAFXWSO.js} +1 -1
  97. package/dist/cli/chunks/{chunk-EGOIIUBD.js → chunk-HE3BDBAO.js} +2 -2
  98. package/dist/cli/chunks/{chunk-P2UPYSDJ.js → chunk-HHANMCD2.js} +1 -1
  99. package/dist/cli/chunks/{chunk-ZUOVNFXK.js → chunk-HPVYJ6JH.js} +2 -2
  100. package/dist/cli/chunks/{chunk-RKI3IQKQ.js → chunk-I6NZFBT3.js} +3 -3
  101. package/dist/cli/chunks/{chunk-QVH5Y7AP.js → chunk-ISBOHF6Y.js} +1 -1
  102. package/dist/cli/chunks/{chunk-IWFFO6VT.js → chunk-J24AJEDE.js} +2 -2
  103. package/dist/cli/chunks/{chunk-5GFKTJ65.js → chunk-J5HTQHJK.js} +2 -2
  104. package/dist/cli/chunks/{chunk-LY7MFGBD.js → chunk-JDOVO4E4.js} +150 -149
  105. package/dist/cli/chunks/chunk-JQAJUXRE.js +2 -0
  106. package/dist/cli/chunks/{chunk-HXXHMLJ5.js → chunk-JRK5GX56.js} +1 -1
  107. package/dist/cli/chunks/{chunk-36VKMAMN.js → chunk-JRLZ7LZ3.js} +2 -2
  108. package/dist/cli/chunks/{chunk-6PJPQGF4.js → chunk-JTOFLDU7.js} +2 -2
  109. package/dist/cli/chunks/{chunk-CVOQ6ESD.js → chunk-K6EOHGKS.js} +2 -2
  110. package/dist/cli/chunks/{chunk-LU2EDWQK.js → chunk-KKXH25IH.js} +2 -2
  111. package/dist/cli/chunks/{chunk-EYXE2XKP.js → chunk-KNSQWM2E.js} +2 -2
  112. package/dist/cli/chunks/{chunk-IEJ7ZV3M.js → chunk-L5T32SRF.js} +1 -1
  113. package/dist/cli/chunks/{chunk-BEFTQVEW.js → chunk-LKFBW2QM.js} +2 -2
  114. package/dist/cli/chunks/{chunk-C3FXFU2T.js → chunk-LMAI74EP.js} +1 -1
  115. package/dist/cli/chunks/{chunk-P7XSPP5D.js → chunk-LQVS5IWH.js} +2 -2
  116. package/dist/cli/chunks/{chunk-4EKV7PHB.js → chunk-LRGTPUJA.js} +2 -2
  117. package/dist/cli/chunks/{chunk-MT7UNBZ7.js → chunk-LTHV4PIG.js} +2 -2
  118. package/dist/cli/chunks/{chunk-B2YGVSOP.js → chunk-M7QKCHLQ.js} +2 -2
  119. package/dist/cli/chunks/{chunk-H5RQPO3X.js → chunk-N3ASALOL.js} +2 -2
  120. package/dist/cli/chunks/{chunk-MQZ53OR3.js → chunk-NEXBTLN6.js} +2 -2
  121. package/dist/cli/chunks/{chunk-BD7FEUN3.js → chunk-NJEEKYEP.js} +3 -3
  122. package/dist/cli/chunks/{chunk-UOI6ULCH.js → chunk-NWUFTLSF.js} +2 -2
  123. package/dist/cli/chunks/{chunk-RT6O2HW2.js → chunk-O4QB2GFL.js} +2 -2
  124. package/dist/cli/chunks/{chunk-MZMG6CUJ.js → chunk-OA75C4HY.js} +2 -2
  125. package/dist/cli/chunks/{chunk-HYFQUWNB.js → chunk-OVMG6EEF.js} +2 -2
  126. package/dist/cli/chunks/{chunk-FSSR6WBE.js → chunk-OX7MJFLC.js} +2 -2
  127. package/dist/cli/chunks/{chunk-ENK44A6Q.js → chunk-OZJQN7YE.js} +2 -2
  128. package/dist/cli/chunks/{chunk-LXZMP3VX.js → chunk-PFXCRRR6.js} +25 -25
  129. package/dist/cli/chunks/{chunk-WIH522AP.js → chunk-PVJLQ2YZ.js} +1 -1
  130. package/dist/cli/chunks/{chunk-ZUB5YOCM.js → chunk-QDRFLM77.js} +2 -2
  131. package/dist/cli/chunks/{chunk-NHUGHAY6.js → chunk-QH7C4PTX.js} +1 -1
  132. package/dist/cli/chunks/{chunk-VXKWNRGA.js → chunk-QKM4XT2F.js} +2 -2
  133. package/dist/cli/chunks/{chunk-ON2UTP2U.js → chunk-QP7EKLWU.js} +2 -2
  134. package/dist/cli/chunks/{chunk-KUHLTVWC.js → chunk-QPACHVDI.js} +1 -1
  135. package/dist/cli/chunks/{chunk-PCJQCEBA.js → chunk-QQVE65ER.js} +2 -2
  136. package/dist/cli/chunks/{chunk-Q3NSU24F.js → chunk-QYCZYJH7.js} +2 -2
  137. package/dist/cli/chunks/{chunk-AEUEMVJK.js → chunk-R6I5I724.js} +2 -2
  138. package/dist/cli/chunks/{chunk-5D7ZFWDS.js → chunk-RJJIPTVH.js} +2 -2
  139. package/dist/cli/chunks/{chunk-ZWEKAEEV.js → chunk-RM6OC35G.js} +1 -1
  140. package/dist/cli/chunks/{chunk-ZELWDJXT.js → chunk-RTD4U7IW.js} +2 -2
  141. package/dist/cli/chunks/{chunk-O5V7RHVG.js → chunk-SKJQKOFJ.js} +2 -2
  142. package/dist/cli/chunks/{chunk-6RD44SCE.js → chunk-SMBGK7XI.js} +1 -1
  143. package/dist/cli/chunks/{chunk-ND4QTZOL.js → chunk-SPS472C5.js} +2 -2
  144. package/dist/cli/chunks/{chunk-TFK2AYIN.js → chunk-SUNXA2UR.js} +2 -2
  145. package/dist/cli/chunks/{chunk-RDGPXENG.js → chunk-SVP3BP52.js} +2 -2
  146. package/dist/cli/chunks/{chunk-NBLDBVAW.js → chunk-T4WQPE77.js} +1 -1
  147. package/dist/cli/chunks/{chunk-ZS4XVJGV.js → chunk-T53ZN4NO.js} +2 -2
  148. package/dist/cli/chunks/chunk-T6W2EYHC.js +2 -0
  149. package/dist/cli/chunks/{chunk-JZT7BU44.js → chunk-T7YCNOW5.js} +2 -2
  150. package/dist/cli/chunks/{chunk-EADSQN5T.js → chunk-TCQWVVSR.js} +1 -1
  151. package/dist/cli/chunks/{chunk-XYLQZWF6.js → chunk-TGRHO4ES.js} +2 -2
  152. package/dist/cli/chunks/{chunk-QPLSYEWJ.js → chunk-TP7L4EX6.js} +2 -2
  153. package/dist/cli/chunks/{chunk-N5XOXPHZ.js → chunk-TT45RCLN.js} +2 -2
  154. package/dist/cli/chunks/{chunk-OZGIOKEA.js → chunk-TUZNWRYC.js} +1 -1
  155. package/dist/cli/chunks/{chunk-53BXTTRO.js → chunk-U2QTL5T2.js} +3 -3
  156. package/dist/cli/chunks/chunk-U64QORFO.js +2 -0
  157. package/dist/cli/chunks/{chunk-SRPLERER.js → chunk-UHLZKH6B.js} +4 -4
  158. package/dist/cli/chunks/{chunk-HPWWYT67.js → chunk-UIWXKRTK.js} +2 -2
  159. package/dist/cli/chunks/{chunk-XWYELBZS.js → chunk-UNFE4RPV.js} +1 -1
  160. package/dist/cli/chunks/{chunk-FW4DJ4FJ.js → chunk-UQGIC5OX.js} +1 -1
  161. package/dist/cli/chunks/{chunk-GLGKQX2V.js → chunk-VAXTPLO3.js} +2 -2
  162. package/dist/cli/chunks/{chunk-VYDVI6FZ.js → chunk-VCSNNLWL.js} +2 -2
  163. package/dist/cli/chunks/{chunk-J7AQZLIH.js → chunk-VSPNIDQK.js} +4 -4
  164. package/dist/cli/chunks/{chunk-EIGRV3J6.js → chunk-VV2JVYOI.js} +2 -2
  165. package/dist/cli/chunks/{chunk-CBONQM5D.js → chunk-VW7AXJQS.js} +2 -2
  166. package/dist/cli/chunks/{chunk-O6MO5KMR.js → chunk-W7JUD4EZ.js} +2 -2
  167. package/dist/cli/chunks/{chunk-QFETNCNN.js → chunk-WFKE7NZ5.js} +2 -2
  168. package/dist/cli/chunks/{chunk-ROVZSZCS.js → chunk-WVEHKAIH.js} +3 -3
  169. package/dist/cli/chunks/{chunk-YO4ESCB4.js → chunk-XAESN54Q.js} +1 -1
  170. package/dist/cli/chunks/{chunk-RKUAWQOF.js → chunk-XECZYQT5.js} +2 -2
  171. package/dist/cli/chunks/{chunk-RLW25X66.js → chunk-XFT4FYTC.js} +2 -2
  172. package/dist/cli/chunks/{chunk-SM2YJ2AL.js → chunk-YHX74M7C.js} +2 -2
  173. package/dist/cli/chunks/chunk-YIWBJ637.js +2 -0
  174. package/dist/cli/chunks/{chunk-IAENZ2DR.js → chunk-Z5UZOYQS.js} +2 -2
  175. package/dist/cli/chunks/{chunk-G367W7XR.js → chunk-Z6G3QVZ4.js} +12 -12
  176. package/dist/cli/chunks/ci-5LIV2HW5.js +82 -0
  177. package/dist/cli/chunks/{ci-output-RLS32FUY.js → ci-output-UO5BDFU4.js} +2 -2
  178. package/dist/cli/chunks/{circuit-breaker-MRCC7WCM.js → circuit-breaker-UQDPXYRD.js} +2 -2
  179. package/dist/cli/chunks/{claude-flow-setup-LIZCEKDF.js → claude-flow-setup-62QES3QX.js} +2 -2
  180. package/dist/cli/chunks/client-AJZKCP4I.js +2 -0
  181. package/dist/cli/chunks/{cline-installer-T7H6R2RC.js → cline-installer-X7VZTSZG.js} +2 -2
  182. package/dist/cli/chunks/{code-XMBLI7OF.js → code-H3BF4L4H.js} +3 -3
  183. package/dist/cli/chunks/{code-index-extractor-QS7BYLEX.js → code-index-extractor-BJGFZGGL.js} +2 -2
  184. package/dist/cli/chunks/{codex-installer-6PGT5FM6.js → codex-installer-KVZWKU6S.js} +2 -2
  185. package/dist/cli/chunks/{completions-2A3WRXY2.js → completions-YMILE6V7.js} +2 -2
  186. package/dist/cli/chunks/{complexity-analyzer-23HOOGJ7.js → complexity-analyzer-J26N2PWG.js} +2 -2
  187. package/dist/cli/chunks/{continuedev-installer-4FSF7B3N.js → continuedev-installer-MAR42OV7.js} +2 -2
  188. package/dist/cli/chunks/{copilot-installer-A5GRQQUU.js → copilot-installer-CVOJF6OT.js} +2 -2
  189. package/dist/cli/chunks/core-handlers-MQHEMGDV.js +2 -0
  190. package/dist/cli/chunks/{cost-tracker-Z4STQ5VB.js → cost-tracker-SXLWXE55.js} +2 -2
  191. package/dist/cli/chunks/{coverage-NUPP6KZZ.js → coverage-D7HCHFP3.js} +3 -3
  192. package/dist/cli/chunks/cross-domain-router-3QNMZV5R.js +2 -0
  193. package/dist/cli/chunks/{cursor-installer-FVJ7ROPJ.js → cursor-installer-X37VHIKW.js} +2 -2
  194. package/dist/cli/chunks/{daemon-D662EX5N.js → daemon-JN7SOH6F.js} +4 -4
  195. package/dist/cli/chunks/{daemon-7ZZA2MMN.js → daemon-LIW47IDM.js} +4 -4
  196. package/dist/cli/chunks/{dag-attention-scheduler-IB4TQ2KA.js → dag-attention-scheduler-QCHHIZBT.js} +2 -2
  197. package/dist/cli/chunks/{detect-LGLBZN4I.js → detect-WRFCWAX5.js} +2 -2
  198. package/dist/cli/chunks/{dist-node-Z3OL42YE.js → dist-node-6FWT4XZO.js} +2 -2
  199. package/dist/cli/chunks/{domain-handler-L3CLNL7U.js → domain-handler-SNFPNMRT.js} +2 -2
  200. package/dist/cli/chunks/{domain-plugins-GQ3V5X6L.js → domain-plugins-MXKHH62P.js} +2 -2
  201. package/dist/cli/chunks/domain-transfer-47UJNERX.js +2 -0
  202. package/dist/cli/chunks/dream-OSWAITPT.js +2 -0
  203. package/dist/cli/chunks/{embed-and-insert-pattern-UGD6USYH.js → embed-and-insert-pattern-LZFAUNBQ.js} +2 -2
  204. package/dist/cli/chunks/{eval-3B7UIYGY.js → eval-AMUXTMJB.js} +2 -2
  205. package/dist/cli/chunks/{experience-capture-middleware-3RQ4NYY3.js → experience-capture-middleware-3D65TR2C.js} +4 -4
  206. package/dist/cli/chunks/{fast-paths-QOSAEPYD.js → fast-paths-Y7BBMM56.js} +2 -2
  207. package/dist/cli/chunks/{feature-flags-TLF4NKOH.js → feature-flags-JMQQ7JW4.js} +2 -2
  208. package/dist/cli/chunks/{feature-flags-3S5TH6P4.js → feature-flags-VESRRQ6V.js} +2 -2
  209. package/dist/cli/chunks/{file-discovery-AEVMJRNB.js → file-discovery-JJKQQUV6.js} +2 -2
  210. package/dist/cli/chunks/{fleet-E6WTXWFL.js → fleet-WIGHICJF.js} +4 -4
  211. package/dist/cli/chunks/{gnn-wrapper-MCKH3AUU.js → gnn-wrapper-BFNPETTT.js} +2 -2
  212. package/dist/cli/chunks/{heartbeat-handler-U7XENHRR.js → heartbeat-handler-HDXKTGUI.js} +4 -4
  213. package/dist/cli/chunks/heartbeat-scheduler-BVRVVIE2.js +2 -0
  214. package/dist/cli/chunks/hnsw-adapter-MZTHXULS.js +2 -0
  215. package/dist/cli/chunks/hnsw-index-KHEX4VDG.js +2 -0
  216. package/dist/cli/chunks/{hnsw-legacy-bridge-5GW4SAEI.js → hnsw-legacy-bridge-6A7OTAPT.js} +2 -2
  217. package/dist/cli/chunks/{hnswlib-node-7BLZBK5T.js → hnswlib-node-LKV2H47B.js} +2 -2
  218. package/dist/cli/chunks/{hooks-F3O2SB6H.js → hooks-KDSFYQQG.js} +10 -10
  219. package/dist/cli/chunks/hybrid-backend-2B3LCLR4.js +2 -0
  220. package/dist/cli/chunks/{hypergraph-engine-PV4EKXHB.js → hypergraph-engine-GDLPEPUC.js} +2 -2
  221. package/dist/cli/chunks/{hypergraph-handler-VOWO5ZTW.js → hypergraph-handler-4UMFA2EW.js} +3 -3
  222. package/dist/cli/chunks/impact-analyzer-4R4VWOGQ.js +2 -0
  223. package/dist/cli/chunks/{init-handler-ENJ5ONJX.js → init-handler-4GCHPQHD.js} +6 -6
  224. package/dist/cli/chunks/init-wizard-TAOPXHHD.js +2 -0
  225. package/dist/cli/chunks/kernel-6I6VZUWY.js +2 -0
  226. package/dist/cli/chunks/{kilocode-installer-HNNJOOPE.js → kilocode-installer-HJZMT2G5.js} +2 -2
  227. package/dist/cli/chunks/{kiro-installer-UZBIQ3IC.js → kiro-installer-WUPY67HG.js} +2 -2
  228. package/dist/cli/chunks/knowledge-graph-KFMTTUR5.js +2 -0
  229. package/dist/cli/chunks/{learning-YMLCVFUT.js → learning-AXKIS7IG.js} +4 -4
  230. package/dist/cli/chunks/{llm-router-YWTARCCT.js → llm-router-HUDPNZLJ.js} +4 -4
  231. package/dist/cli/chunks/llm-router-service-2D74XVM3.js +2 -0
  232. package/dist/cli/chunks/{load-DKE3F3IP.js → load-RM44POD7.js} +2 -2
  233. package/dist/cli/chunks/load-test-53FWOWNS.js +2 -0
  234. package/dist/cli/chunks/{mcp-5PSGIUCW.js → mcp-5JVQRBOP.js} +2 -2
  235. package/dist/cli/chunks/{memory-3L3O6JMM.js → memory-VGZ2V6PL.js} +5 -5
  236. package/dist/cli/chunks/memory-backend-KFJDDPEZ.js +2 -0
  237. package/dist/cli/chunks/memory-handlers-EI537Z32.js +2 -0
  238. package/dist/cli/chunks/{multi-model-executor-AEEO7IA4.js → multi-model-executor-WPRKCSCM.js} +2 -2
  239. package/dist/cli/chunks/{opencode-installer-ABBO355U.js → opencode-installer-YAJMRCQO.js} +2 -2
  240. package/dist/cli/chunks/{orchestrator-E36Q7MKE.js → orchestrator-MUGWBUYP.js} +6 -6
  241. package/dist/cli/chunks/pattern-null-store-7DMU5CJ4.js +2 -0
  242. package/dist/cli/chunks/{pattern-usage-recorder-H4XKSID4.js → pattern-usage-recorder-ZQJJ2YNG.js} +2 -2
  243. package/dist/cli/chunks/{pipeline-BGFEHXIN.js → pipeline-F4DXDUDC.js} +2 -2
  244. package/dist/cli/chunks/{platform-GK7ZVDJI.js → platform-HI3A3OWF.js} +2 -2
  245. package/dist/cli/chunks/{plugin-CAH2CKI6.js → plugin-XRITPTR7.js} +2 -2
  246. package/dist/cli/chunks/{prime-radiant-advanced-wasm-M5EYRONA.js → prime-radiant-advanced-wasm-HHNJP7CQ.js} +2 -2
  247. package/dist/cli/chunks/{project-root-BSNZC243.js → project-root-2VN4WO2A.js} +2 -2
  248. package/dist/cli/chunks/protocol-executor-2EMTBTMG.js +2 -0
  249. package/dist/cli/chunks/{protocol-handler-JDSSC2SF.js → protocol-handler-ZEVHSEBG.js} +2 -2
  250. package/dist/cli/chunks/{prove-ANPTOZJE.js → prove-C4BLZWBS.js} +2 -2
  251. package/dist/cli/chunks/qe-reasoning-bank-VZHZZPHE.js +2 -0
  252. package/dist/cli/chunks/{quality-SXWGYRQR.js → quality-M3DTE4KK.js} +2 -2
  253. package/dist/cli/chunks/quality-gate-V6KS7ML3.js +7 -0
  254. package/dist/cli/chunks/queen-coordinator-7MYTTUHI.js +2 -0
  255. package/dist/cli/chunks/{real-embeddings-WSRYAOZM.js → real-embeddings-YWSE3IRT.js} +2 -2
  256. package/dist/cli/chunks/{ref-validation-AZ3LRWEK.js → ref-validation-ZWOTFA3T.js} +2 -2
  257. package/dist/cli/chunks/{roocode-installer-2QKGFIEU.js → roocode-installer-GJBIWETD.js} +2 -2
  258. package/dist/cli/chunks/router-ZD4LXAWA.js +2 -0
  259. package/dist/cli/chunks/routing-feedback-FSLMDVGD.js +2 -0
  260. package/dist/cli/chunks/{routing-handler-UYDC5MMD.js → routing-handler-CFYLGNAR.js} +2 -2
  261. package/dist/cli/chunks/{ruvector-commands-QXADPVEY.js → ruvector-commands-EDKG456B.js} +2 -2
  262. package/dist/cli/chunks/rvf-dual-writer-LTKTDRFS.js +2 -0
  263. package/dist/cli/chunks/rvf-migration-adapter-IF24EVC5.js +2 -0
  264. package/dist/cli/chunks/{rvf-migration-coordinator-GD4NBFKT.js → rvf-migration-coordinator-ZMEYMAI6.js} +2 -2
  265. package/dist/cli/chunks/rvf-native-adapter-E6JNBKMZ.js +2 -0
  266. package/dist/cli/chunks/{rvf-store-integrity-7SXG66IL.js → rvf-store-integrity-AH6PNJP6.js} +2 -2
  267. package/dist/cli/chunks/safe-db-F6TRB5KZ.js +2 -0
  268. package/dist/cli/chunks/schedule-HBD4BYTE.js +2 -0
  269. package/dist/cli/chunks/scheduler-6FYWPMQC.js +2 -0
  270. package/dist/cli/chunks/{security-YKB622PK.js → security-ZU2GW3ZM.js} +3 -3
  271. package/dist/cli/chunks/{shared-rvf-adapter-KMLAV7JK.js → shared-rvf-adapter-5FOVSL3T.js} +2 -2
  272. package/dist/cli/chunks/{shared-rvf-dual-writer-OYY27DFV.js → shared-rvf-dual-writer-IO4DC4XV.js} +2 -2
  273. package/dist/cli/chunks/sqlite-persistence-DOU72F5Z.js +2 -0
  274. package/dist/cli/chunks/{standalone-memory-2DOABVLC.js → standalone-memory-3UXDZ7HI.js} +2 -2
  275. package/dist/cli/chunks/{status-handler-EXRKETV7.js → status-handler-264CHTWS.js} +2 -2
  276. package/dist/cli/chunks/{structural-health-2SKK6DU6.js → structural-health-E2QPUOZE.js} +2 -2
  277. package/dist/cli/chunks/{sync-UW7SX7GO.js → sync-2ACMWM7D.js} +2 -2
  278. package/dist/cli/chunks/{sync-DQ2YUNI6.js → sync-N2L2OST4.js} +2 -2
  279. package/dist/cli/chunks/{task-handler-LYQ6WYUY.js → task-handler-IB5CVOTY.js} +2 -2
  280. package/dist/cli/chunks/{task-handlers-DIJO232S.js → task-handlers-QBMYNJHE.js} +3 -3
  281. package/dist/cli/chunks/{test-WRHZMUCW.js → test-7RGLRDSP.js} +6 -6
  282. package/dist/cli/chunks/{test-scheduling-HI23RXFK.js → test-scheduling-RJABJT2W.js} +3 -3
  283. package/dist/cli/chunks/{token-bootstrap-23SA6SWZ.js → token-bootstrap-JVHMHB72.js} +2 -2
  284. package/dist/cli/chunks/{token-usage-M7RRDPXO.js → token-usage-3ECHQVCY.js} +2 -2
  285. package/dist/cli/chunks/{transformers-4TC35KKS.js → transformers-KJH3IJWI.js} +2 -2
  286. package/dist/cli/chunks/{tree-sitter-wasm-parser-F4LTKAWD.js → tree-sitter-wasm-parser-XN6PFI32.js} +2 -2
  287. package/dist/cli/chunks/{types-NBXV6LXQ.js → types-5BAPXOLS.js} +2 -2
  288. package/dist/cli/chunks/unified-memory-GHAYAXWZ.js +2 -0
  289. package/dist/cli/chunks/unified-memory-hnsw-CCC63YXT.js +2 -0
  290. package/dist/cli/chunks/unified-persistence-HKRHI5PG.js +2 -0
  291. package/dist/cli/chunks/{upgrade-4BGOU5RM.js → upgrade-S5NFQZID.js} +2 -2
  292. package/dist/cli/chunks/{validate-EDWAR63H.js → validate-BIBWOLJD.js} +2 -2
  293. package/dist/cli/chunks/{validate-swarm-VI72CPR7.js → validate-swarm-WAA3LBHH.js} +2 -2
  294. package/dist/cli/chunks/visual-security-APOXJ3Q3.js +2 -0
  295. package/dist/cli/chunks/{web-tree-sitter-Y5XBRQXF.js → web-tree-sitter-OTBQTHAV.js} +2 -2
  296. package/dist/cli/chunks/{windsurf-installer-VEX23WAF.js → windsurf-installer-NNQ22EW6.js} +2 -2
  297. package/dist/cli/chunks/witness-chain-7IP5IJGT.js +2 -0
  298. package/dist/cli/chunks/{witness-chain-3YNL6YGY.js → witness-chain-E7MUBOJW.js} +2 -2
  299. package/dist/cli/chunks/{witness-chain-repair-MJZGZRWT.js → witness-chain-repair-FW4QSN4C.js} +2 -2
  300. package/dist/cli/chunks/{witness-chain-verifier-TTJYXTBE.js → witness-chain-verifier-YMROEBVL.js} +2 -2
  301. package/dist/cli/chunks/{witness-key-manager-EM6YXYOY.js → witness-key-manager-4CGRNDMJ.js} +2 -2
  302. package/dist/cli/chunks/{workflow-2RBDOM7V.js → workflow-4VRSTRAN.js} +4 -4
  303. package/dist/cli/chunks/workflow-orchestrator-2HNW5ZMQ.js +2 -0
  304. package/dist/cli/chunks/{wrappers-5OTAVVOV.js → wrappers-4M4UTGEU.js} +2 -2
  305. package/dist/cli/commands/ci.js +17 -6
  306. package/dist/cli/commands/quality-gate.js +6 -1
  307. package/dist/cli/index.js +7 -2
  308. package/dist/cli/process-store-cleanup.d.ts +7 -0
  309. package/dist/cli/process-store-cleanup.js +27 -0
  310. package/dist/cli/utils/ci-config.d.ts +3 -3
  311. package/dist/cli/utils/ci-config.js +202 -68
  312. package/dist/domains/quality-assessment/quality-evidence.d.ts +3 -1
  313. package/dist/domains/quality-assessment/quality-evidence.js +7 -2
  314. package/dist/domains/test-execution/services/retry-handler.js +32 -13
  315. package/dist/domains/test-execution/services/test-executor.d.ts +3 -3
  316. package/dist/domains/test-execution/services/test-executor.js +66 -22
  317. package/dist/init/fleet-integration.js +3 -2
  318. package/dist/init/init-wizard-steps.js +3 -2
  319. package/dist/init/phases/06-code-intelligence.js +6 -4
  320. package/dist/integrations/ruvector/sona-persistence.d.ts +1 -0
  321. package/dist/integrations/ruvector/sona-persistence.js +74 -20
  322. package/dist/integrations/ruvector/sona-wrapper.d.ts +2 -0
  323. package/dist/integrations/ruvector/sona-wrapper.js +13 -0
  324. package/dist/kernel/memory-backend.js +5 -4
  325. package/dist/kernel/unified-memory.js +3 -2
  326. package/dist/learning/aqe-learning-engine.js +3 -2
  327. package/dist/mcp/bundle.js +440 -439
  328. package/dist/mcp/connection-pool.d.ts +2 -0
  329. package/dist/mcp/connection-pool.js +13 -2
  330. package/dist/mcp/handlers/memory-handlers.d.ts +1 -0
  331. package/dist/mcp/handlers/memory-handlers.js +16 -6
  332. package/dist/mcp/protocol-server.js +29 -8
  333. package/dist/mcp/types.d.ts +2 -0
  334. package/dist/optimization/session-cache.js +13 -11
  335. package/dist/plugins/cache.js +10 -3
  336. package/dist/shared/embeddings/embedding-cache.js +4 -4
  337. package/dist/shared/llm/cache.js +7 -10
  338. package/dist/shared/retry-engine.js +4 -0
  339. package/dist/shared/test-runner-process.d.ts +10 -0
  340. package/dist/shared/test-runner-process.js +210 -0
  341. package/dist/validation/quality-verdict.js +3 -2
  342. package/dist/workers/quality-daemon/priority-queue.js +4 -1
  343. package/package.json +4 -4
  344. package/dist/cli/chunks/adapter-TVQKH65T.js +0 -2
  345. package/dist/cli/chunks/aqe-learning-engine-ULGTVVWE.js +0 -2
  346. package/dist/cli/chunks/base-W42BURDL.js +0 -2
  347. package/dist/cli/chunks/browser-workflow-HKGHFFFT.js +0 -2
  348. package/dist/cli/chunks/chunk-2IMSJ7IO.js +0 -2
  349. package/dist/cli/chunks/chunk-FBZC4IGB.js +0 -2
  350. package/dist/cli/chunks/chunk-MNQN7UZX.js +0 -4
  351. package/dist/cli/chunks/chunk-OXHF3L2T.js +0 -2
  352. package/dist/cli/chunks/chunk-PELENDDQ.js +0 -2
  353. package/dist/cli/chunks/chunk-TW3SR4TS.js +0 -2
  354. package/dist/cli/chunks/chunk-V6RE4YRQ.js +0 -2
  355. package/dist/cli/chunks/chunk-ZQZD55MN.js +0 -3
  356. package/dist/cli/chunks/ci-J3TDK5RA.js +0 -81
  357. package/dist/cli/chunks/client-3BD2DI4N.js +0 -2
  358. package/dist/cli/chunks/core-handlers-C3H2ZCS2.js +0 -2
  359. package/dist/cli/chunks/cross-domain-router-JCQ7SWDP.js +0 -2
  360. package/dist/cli/chunks/domain-transfer-MFCI76IY.js +0 -2
  361. package/dist/cli/chunks/dream-FTP33IJB.js +0 -2
  362. package/dist/cli/chunks/heartbeat-scheduler-HXBJVJL2.js +0 -2
  363. package/dist/cli/chunks/hnsw-adapter-TU6WG2ME.js +0 -2
  364. package/dist/cli/chunks/hnsw-index-MS5KODD7.js +0 -2
  365. package/dist/cli/chunks/hybrid-backend-HT45LBHC.js +0 -2
  366. package/dist/cli/chunks/impact-analyzer-AP4AGTG5.js +0 -2
  367. package/dist/cli/chunks/init-wizard-I5DFZUQL.js +0 -2
  368. package/dist/cli/chunks/kernel-MISPSPPA.js +0 -2
  369. package/dist/cli/chunks/knowledge-graph-L26JESGE.js +0 -2
  370. package/dist/cli/chunks/llm-router-service-MWGC43ZA.js +0 -2
  371. package/dist/cli/chunks/load-test-H5ISNNM5.js +0 -2
  372. package/dist/cli/chunks/memory-backend-HWDNOBKW.js +0 -2
  373. package/dist/cli/chunks/memory-handlers-ZFDVQZM5.js +0 -2
  374. package/dist/cli/chunks/pattern-null-store-GQP6ICWK.js +0 -2
  375. package/dist/cli/chunks/protocol-executor-AD5A4DAI.js +0 -2
  376. package/dist/cli/chunks/qe-reasoning-bank-W3Z2PKTR.js +0 -2
  377. package/dist/cli/chunks/quality-gate-GYNCA4ZY.js +0 -7
  378. package/dist/cli/chunks/queen-coordinator-HQRHLIJX.js +0 -2
  379. package/dist/cli/chunks/router-MTP5LH4H.js +0 -2
  380. package/dist/cli/chunks/routing-feedback-GWETVB4L.js +0 -2
  381. package/dist/cli/chunks/rvf-dual-writer-4UE5S7WP.js +0 -2
  382. package/dist/cli/chunks/rvf-migration-adapter-PHH3HF4Q.js +0 -2
  383. package/dist/cli/chunks/rvf-native-adapter-KTLZBUWV.js +0 -2
  384. package/dist/cli/chunks/safe-db-FWWGAPVE.js +0 -2
  385. package/dist/cli/chunks/schedule-TPA4V4D5.js +0 -2
  386. package/dist/cli/chunks/scheduler-5ZTEPNDD.js +0 -2
  387. package/dist/cli/chunks/sqlite-persistence-HPTT624C.js +0 -2
  388. package/dist/cli/chunks/unified-memory-OVFEPRPS.js +0 -2
  389. package/dist/cli/chunks/unified-memory-hnsw-KKRSCZHR.js +0 -2
  390. package/dist/cli/chunks/unified-persistence-7GLR4RI3.js +0 -2
  391. package/dist/cli/chunks/visual-security-2FUM5GLI.js +0 -2
  392. package/dist/cli/chunks/witness-chain-MH6GA5L6.js +0 -2
  393. package/dist/cli/chunks/workflow-orchestrator-H6G65YKU.js +0 -2
@@ -6,7 +6,7 @@
6
6
  */
7
7
  import * as fs from 'fs';
8
8
  import * as path from 'path';
9
- import { parseYAMLContent } from './workflow-parser.js';
9
+ import { isCollection, isScalar, parseDocument, visit } from 'yaml';
10
10
  // ============================================================================
11
11
  // Default Config
12
12
  // ============================================================================
@@ -100,89 +100,223 @@ export function parseCIConfigFile(filePath) {
100
100
  }
101
101
  return parseCIConfigContent(content, filePath);
102
102
  }
103
- /**
104
- * Parse CI config YAML content.
105
- */
103
+ const YAML_MAX_LINES = 10000;
104
+ const YAML_MAX_LINE_LENGTH = 10000;
105
+ const YAML_MAX_DEPTH = 20;
106
+ const UNSAFE_YAML_KEYS = new Set(['__proto__', 'constructor', 'prototype']);
107
+ function isRecord(value) {
108
+ return value !== null && typeof value === 'object' && !Array.isArray(value) &&
109
+ (Object.getPrototypeOf(value) === Object.prototype || Object.getPrototypeOf(value) === null);
110
+ }
111
+ /** Keep the previous parser's input bounds; reject unsafe expanded aliases too. */
112
+ function parseCIYAML(content) {
113
+ const lines = content.split('\n');
114
+ if (lines.length > YAML_MAX_LINES)
115
+ throw new Error(`YAML exceeds maximum allowed lines (${YAML_MAX_LINES})`);
116
+ if (lines.some(line => line.length > YAML_MAX_LINE_LENGTH)) {
117
+ throw new Error(`YAML exceeds maximum line length (${YAML_MAX_LINE_LENGTH})`);
118
+ }
119
+ const document = parseDocument(content, { prettyErrors: false, merge: true });
120
+ if (document.errors.length)
121
+ throw new Error(document.errors.map(error => error.message).join('; '));
122
+ visit(document, {
123
+ Collection: (_key, _node, ancestry) => {
124
+ if (ancestry.filter(isCollection).length >= YAML_MAX_DEPTH) {
125
+ throw new Error(`YAML exceeds maximum depth (${YAML_MAX_DEPTH})`);
126
+ }
127
+ },
128
+ Pair: (_key, pair) => {
129
+ if (isScalar(pair.key) && UNSAFE_YAML_KEYS.has(String(pair.key.value))) {
130
+ throw new Error(`Unsafe YAML key: ${pair.key.value}`);
131
+ }
132
+ },
133
+ });
134
+ const parsed = document.contents === null ? {} : document.toJS({ maxAliasCount: 100 });
135
+ // Alias references may add nesting or cycles that the syntax tree does not show.
136
+ function checkExpanded(value, depth, ancestors) {
137
+ if (value === null || typeof value !== 'object')
138
+ return;
139
+ if (depth > YAML_MAX_DEPTH)
140
+ throw new Error(`YAML exceeds maximum depth (${YAML_MAX_DEPTH})`);
141
+ if (ancestors.has(value))
142
+ throw new Error('Cyclic YAML aliases are not supported');
143
+ ancestors.add(value);
144
+ for (const child of Object.values(value))
145
+ checkExpanded(child, depth + 1, ancestors);
146
+ ancestors.delete(value);
147
+ }
148
+ checkExpanded(parsed, 0, new Set());
149
+ if (!isRecord(parsed))
150
+ throw new Error('CI config must be a YAML mapping');
151
+ return parsed;
152
+ }
153
+ /** Parse CI YAML faithfully, validating typed fields before any phase executes. */
106
154
  export function parseCIConfigContent(content, sourcePath) {
107
- const errors = [];
108
155
  let parsed;
109
156
  try {
110
- parsed = parseYAMLContent(content);
157
+ parsed = parseCIYAML(content);
111
158
  }
112
159
  catch (err) {
113
160
  return { success: false, errors: [`Invalid YAML: ${err}`] };
114
161
  }
115
- // Build config with defaults
116
- const config = {
117
- version: parsed.version || DEFAULT_CI_CONFIG.version,
118
- name: parsed.name || DEFAULT_CI_CONFIG.name,
119
- phases: [],
120
- output: { ...DEFAULT_CI_CONFIG.output },
121
- qualityGate: { ...DEFAULT_CI_CONFIG.qualityGate, thresholds: { ...DEFAULT_CI_CONFIG.qualityGate.thresholds } },
122
- };
123
- // Parse output section
124
- if (parsed.output && typeof parsed.output === 'object') {
125
- const out = parsed.output;
126
- if (out.format)
127
- config.output.format = out.format;
128
- if (out.directory)
129
- config.output.directory = out.directory;
130
- if (out.combined_report !== undefined)
131
- config.output.combinedReport = out.combined_report;
132
- }
133
- // Parse quality_gate section
134
- if (parsed.quality_gate && typeof parsed.quality_gate === 'object') {
135
- const qg = parsed.quality_gate;
136
- if (qg.enforced !== undefined)
137
- config.qualityGate.enforced = qg.enforced;
138
- if (qg.thresholds && typeof qg.thresholds === 'object') {
139
- const th = qg.thresholds;
140
- if (th.coverage !== undefined)
141
- config.qualityGate.thresholds.coverage = th.coverage;
142
- if (th.security !== undefined)
143
- config.qualityGate.thresholds.security = th.security;
144
- if (th.quality !== undefined)
145
- config.qualityGate.thresholds.quality = th.quality;
162
+ const errors = [];
163
+ const config = getDefaultCIConfig();
164
+ function readString(record, key, fallback, label) {
165
+ const value = record[key];
166
+ if (value === undefined)
167
+ return fallback;
168
+ if (typeof value !== 'string' || !value.trim()) {
169
+ errors.push(`${label} must be a non-empty string`);
170
+ return fallback;
146
171
  }
172
+ return value;
147
173
  }
148
- // Parse phases
149
- if (parsed.phases && Array.isArray(parsed.phases)) {
150
- for (let i = 0; i < parsed.phases.length; i++) {
151
- const p = parsed.phases[i];
152
- if (!p.name) {
153
- errors.push(`Phase ${i + 1} must have a "name" field`);
154
- continue;
155
- }
156
- if (!p.type) {
157
- errors.push(`Phase "${p.name}" must have a "type" field`);
158
- continue;
159
- }
160
- const validTypes = ['test', 'coverage', 'security', 'quality-gate', 'code-intelligence', 'custom'];
161
- if (!validTypes.includes(p.type)) {
162
- errors.push(`Phase "${p.name}" has invalid type "${p.type}". Valid: ${validTypes.join(', ')}`);
163
- continue;
174
+ function readBoolean(record, key, fallback, label) {
175
+ const value = record[key];
176
+ if (value === undefined)
177
+ return fallback;
178
+ if (typeof value !== 'boolean') {
179
+ errors.push(`${label} must be a boolean`);
180
+ return fallback;
181
+ }
182
+ return value;
183
+ }
184
+ if (parsed.version !== undefined) {
185
+ if (typeof parsed.version === 'number' && Number.isFinite(parsed.version))
186
+ config.version = String(parsed.version);
187
+ else
188
+ config.version = readString(parsed, 'version', config.version, 'version');
189
+ }
190
+ config.name = readString(parsed, 'name', config.name, 'name');
191
+ if (parsed.output !== undefined) {
192
+ if (!isRecord(parsed.output))
193
+ errors.push('output must be a mapping');
194
+ else {
195
+ config.output.format = readString(parsed.output, 'format', config.output.format, 'output.format');
196
+ config.output.directory = readString(parsed.output, 'directory', config.output.directory, 'output.directory');
197
+ config.output.combinedReport = readBoolean(parsed.output, 'combined_report', config.output.combinedReport, 'output.combined_report');
198
+ }
199
+ }
200
+ if (parsed.quality_gate !== undefined) {
201
+ if (!isRecord(parsed.quality_gate))
202
+ errors.push('quality_gate must be a mapping');
203
+ else {
204
+ const gate = parsed.quality_gate;
205
+ config.qualityGate.enforced = readBoolean(gate, 'enforced', config.qualityGate.enforced, 'quality_gate.enforced');
206
+ if (gate.thresholds !== undefined) {
207
+ if (!isRecord(gate.thresholds))
208
+ errors.push('quality_gate.thresholds must be a mapping');
209
+ else {
210
+ for (const key of ['coverage', 'quality']) {
211
+ const value = gate.thresholds[key];
212
+ if (value === undefined)
213
+ continue;
214
+ if (typeof value !== 'number' || !Number.isFinite(value) || value < 0 || value > 100) {
215
+ errors.push(`quality_gate.thresholds.${key} must be a finite number between 0 and 100`);
216
+ }
217
+ else
218
+ config.qualityGate.thresholds[key] = value;
219
+ }
220
+ if (gate.thresholds.security !== undefined) {
221
+ const value = gate.thresholds.security;
222
+ if (typeof value !== 'string' || !['none', 'low', 'medium', 'high'].includes(value)) {
223
+ errors.push('quality_gate.thresholds.security must be none, low, medium or high');
224
+ }
225
+ else
226
+ config.qualityGate.thresholds.security = value;
227
+ }
228
+ }
164
229
  }
165
- const phase = {
166
- name: p.name,
167
- type: p.type,
168
- enabled: p.enabled !== false,
169
- config: p.config || {},
170
- continueOnFailure: p.continue_on_failure || false,
171
- timeout: p.timeout || 300,
172
- };
173
- config.phases.push(phase);
174
230
  }
175
231
  }
176
- else {
177
- // Use defaults if no phases specified
178
- config.phases = [...DEFAULT_CI_CONFIG.phases];
232
+ if (parsed.phases !== undefined) {
233
+ config.phases = [];
234
+ if (!Array.isArray(parsed.phases))
235
+ errors.push('phases must be a sequence');
236
+ else
237
+ for (const [index, value] of parsed.phases.entries()) {
238
+ if (!isRecord(value)) {
239
+ errors.push(`Phase ${index + 1} must be a mapping`);
240
+ continue;
241
+ }
242
+ if (value.name === undefined)
243
+ errors.push(`Phase ${index + 1} must have a name`);
244
+ const name = readString(value, 'name', '', `Phase ${index + 1} name`);
245
+ const validTypes = ['test', 'coverage', 'security', 'quality-gate', 'code-intelligence', 'custom'];
246
+ if (!validTypes.includes(value.type)) {
247
+ errors.push(`Phase "${name}" has invalid type "${value.type}". Valid: ${validTypes.join(', ')}`);
248
+ continue;
249
+ }
250
+ let timeout = 300;
251
+ if (value.timeout !== undefined) {
252
+ if (typeof value.timeout !== 'number' || !Number.isFinite(value.timeout) || value.timeout <= 0) {
253
+ errors.push(`Phase "${name}" timeout must be a positive finite number`);
254
+ }
255
+ else
256
+ timeout = value.timeout;
257
+ }
258
+ if (value.config !== undefined && !isRecord(value.config))
259
+ errors.push(`Phase "${name}" config must be a mapping`);
260
+ config.phases.push({
261
+ name, type: value.type, timeout,
262
+ enabled: readBoolean(value, 'enabled', true, `Phase "${name}" enabled`),
263
+ continueOnFailure: readBoolean(value, 'continue_on_failure', false, `Phase "${name}" continue_on_failure`),
264
+ config: isRecord(value.config) ? { ...value.config } : {},
265
+ });
266
+ }
179
267
  }
180
- if (config.phases.length === 0) {
268
+ if (config.phases.length === 0)
181
269
  errors.push('Config must have at least one phase');
270
+ // Paths in a file are relative to that file's project, not the caller's cwd.
271
+ // Resolve existing ancestors too so a symlink cannot bypass containment.
272
+ const root = path.resolve(sourcePath ? path.dirname(sourcePath) : process.cwd());
273
+ function canonicalAncestor(candidate) {
274
+ let ancestor = candidate;
275
+ const suffix = [];
276
+ while (!fs.existsSync(ancestor)) {
277
+ const parent = path.dirname(ancestor);
278
+ if (parent === ancestor)
279
+ break;
280
+ suffix.unshift(path.basename(ancestor));
281
+ ancestor = parent;
282
+ }
283
+ return path.resolve(fs.realpathSync(ancestor), ...suffix);
182
284
  }
183
- if (errors.length > 0) {
184
- return { success: false, config, errors };
285
+ function containedPath(value, label) {
286
+ if (typeof value !== 'string' || !value.trim() || value.includes('\0')) {
287
+ errors.push(`${label} must be a non-empty relative path`);
288
+ return undefined;
289
+ }
290
+ const resolved = path.resolve(root, value);
291
+ const relative = path.relative(root, resolved);
292
+ if (path.isAbsolute(value) || path.win32.isAbsolute(value) ||
293
+ relative === '..' || relative.startsWith(`..${path.sep}`) || path.isAbsolute(relative)) {
294
+ errors.push(`${label} must stay inside the project and use a relative path`);
295
+ return undefined;
296
+ }
297
+ try {
298
+ const realRelative = path.relative(canonicalAncestor(root), canonicalAncestor(resolved));
299
+ if (realRelative === '..' || realRelative.startsWith(`..${path.sep}`) || path.isAbsolute(realRelative)) {
300
+ errors.push(`${label} must stay inside the project (symlink escapes are not allowed)`);
301
+ return undefined;
302
+ }
303
+ }
304
+ catch (error) {
305
+ errors.push(`${label} cannot be resolved safely: ${error}`);
306
+ return undefined;
307
+ }
308
+ return sourcePath ? resolved : value;
309
+ }
310
+ config.output.directory = containedPath(config.output.directory, 'output.directory') ?? config.output.directory;
311
+ for (const phase of config.phases) {
312
+ if (phase.config.target !== undefined) {
313
+ const target = containedPath(phase.config.target, `Phase "${phase.name}" config.target`);
314
+ if (target !== undefined)
315
+ phase.config.target = target;
316
+ }
185
317
  }
318
+ if (errors.length > 0)
319
+ return { success: false, config, errors };
186
320
  return { success: true, config, errors: [], configPath: sourcePath };
187
321
  }
188
322
  /**
@@ -33,7 +33,9 @@ export declare function loadQualityEvidence(memory: MemoryBackend, options?: {
33
33
  now?: number;
34
34
  maxAgeMs?: number;
35
35
  }): Promise<QualityEvidenceValues>;
36
- export declare function evaluateQualityEvidence(values: QualityEvidenceValues): {
36
+ export declare function evaluateQualityEvidence(values: QualityEvidenceValues, thresholds?: {
37
+ coverage?: number;
38
+ }): {
37
39
  passed: boolean;
38
40
  checks: EvaluatedQualityCheck[];
39
41
  recommendations: string[];
@@ -91,9 +91,14 @@ export async function loadQualityEvidence(memory, options = {}) {
91
91
  }
92
92
  return values;
93
93
  }
94
- export function evaluateQualityEvidence(values) {
94
+ export function evaluateQualityEvidence(values, thresholds = {}) {
95
+ if (thresholds.coverage !== undefined && (!Number.isFinite(thresholds.coverage) || thresholds.coverage < 0 || thresholds.coverage > 100)) {
96
+ throw new Error('Coverage quality threshold must be a finite number between 0 and 100.');
97
+ }
95
98
  const checks = QUALITY_METRICS.map((name) => {
96
- const threshold = DEFAULT_QUALITY_THRESHOLDS[name];
99
+ const threshold = name === 'coverage' && thresholds.coverage !== undefined
100
+ ? { ...DEFAULT_QUALITY_THRESHOLDS[name], value: thresholds.coverage }
101
+ : DEFAULT_QUALITY_THRESHOLDS[name];
97
102
  const value = values[name];
98
103
  return {
99
104
  name,
@@ -11,6 +11,7 @@ import { TEST_EXECUTION_CONSTANTS, RETRY_CONSTANTS } from '../../constants.js';
11
11
  import { toError } from '../../../shared/error-utils.js';
12
12
  import { safeJsonParse } from '../../../shared/safe-json.js';
13
13
  import { secureRandom } from '../../../shared/utils/crypto-random.js';
14
+ import { terminateTestRunner, trackTestRunnerExit } from '../../../shared/test-runner-process.js';
14
15
  const DEFAULT_RETRY_CONFIG = {
15
16
  simulateForTesting: false,
16
17
  simulatedRetrySuccessRate: RETRY_CONSTANTS.DEFAULT_FLAKY_PASS_RATE,
@@ -379,6 +380,8 @@ export class RetryHandlerService {
379
380
  let stdout = '';
380
381
  let stderr = '';
381
382
  let timedOut = false;
383
+ let termination;
384
+ const timeoutError = new Error(`Test execution timed out after ${timeout}ms for command: ${command} ${args.join(' ')}`);
382
385
  const settle = (fn, value) => {
383
386
  report?.cleanup();
384
387
  fn(value);
@@ -387,13 +390,20 @@ export class RetryHandlerService {
387
390
  // Arguments are passed as array to avoid shell interpretation
388
391
  const proc = spawn(command, args, {
389
392
  cwd,
393
+ detached: process.platform !== 'win32',
390
394
  env: { ...process.env, FORCE_COLOR: '0', CI: 'true' },
391
395
  });
396
+ const untrackExit = trackTestRunnerExit(proc);
392
397
  const timeoutHandle = setTimeout(() => {
393
398
  timedOut = true;
394
- proc.kill('SIGTERM');
395
- // Give it a moment to terminate gracefully, then force kill
396
- setTimeout(() => proc.kill('SIGKILL'), 1000);
399
+ termination = terminateTestRunner(proc);
400
+ termination.catch(error => {
401
+ logger.warn(`Retry runner cleanup failed: ${toError(error).message}`);
402
+ // A denied cleanup can leave the root alive: preserve the timeout
403
+ // outcome immediately, keeping artifacts because settlement is unknown.
404
+ reject(timeoutError);
405
+ });
406
+ termination.then(untrackExit, () => undefined);
397
407
  }, timeout);
398
408
  proc.stdout?.on('data', (data) => {
399
409
  stdout += data.toString();
@@ -404,9 +414,10 @@ export class RetryHandlerService {
404
414
  proc.on('close', (code) => {
405
415
  clearTimeout(timeoutHandle);
406
416
  if (timedOut) {
407
- settle(reject, new Error(`Test execution timed out after ${timeout}ms for command: ${command} ${args.join(' ')}`));
417
+ termination?.then(() => settle(reject, timeoutError), () => reject(timeoutError));
408
418
  return;
409
419
  }
420
+ untrackExit();
410
421
  // Parse result based on exit code and output (Vitest writes the JSON
411
422
  // report to the --outputFile; read it back rather than trusting stdout).
412
423
  try {
@@ -422,6 +433,7 @@ export class RetryHandlerService {
422
433
  });
423
434
  proc.on('error', (err) => {
424
435
  clearTimeout(timeoutHandle);
436
+ untrackExit();
425
437
  report?.cleanup();
426
438
  reject(new Error(`Failed to spawn test process: ${err.message}. ` +
427
439
  `Command: ${command} ${args.join(' ')}. ` +
@@ -433,20 +445,23 @@ export class RetryHandlerService {
433
445
  * Parse test runner output to determine pass/fail status
434
446
  */
435
447
  parseTestResult(exitCode, stdout, stderr) {
436
- // A passing process and a passing report must agree when JSON is available.
448
+ // A retry can clear a prior failure only when the report proves a test
449
+ // actually passed. Empty/fully skipped selections can also exit zero.
437
450
  try {
438
451
  // Vitest JSON output
439
452
  const vitestMatch = stdout.match(/\{[\s\S]*"testResults"[\s\S]*\}/);
440
453
  if (vitestMatch) {
441
454
  const result = safeJsonParse(vitestMatch[0]);
442
455
  if (exitCode === 0 && result.success !== false
443
- && result.numFailedTests === 0 && result.numFailedTestSuites === 0) {
456
+ && result.numFailedTests === 0 && result.numFailedTestSuites === 0
457
+ && Number.isFinite(result.numPassedTests) && result.numPassedTests > 0) {
444
458
  return { passed: true };
445
459
  }
446
460
  const failedTest = result.testResults?.[0]?.assertionResults?.find((r) => r.status === 'failed');
447
461
  return {
448
462
  passed: false,
449
- error: failedTest?.failureMessages?.join('\n') || stderr || `Test failed with exit code ${exitCode}`,
463
+ error: failedTest?.failureMessages?.join('\n') || stderr
464
+ || (exitCode === 0 ? 'Retry runner did not report any passing tests.' : `Test failed with exit code ${exitCode}`),
450
465
  };
451
466
  }
452
467
  // Jest JSON output
@@ -454,34 +469,38 @@ export class RetryHandlerService {
454
469
  if (jestMatch) {
455
470
  const result = safeJsonParse(jestMatch[0]);
456
471
  if (exitCode === 0 && result.success !== false
457
- && result.numFailedTests === 0 && result.numFailedTestSuites === 0) {
472
+ && result.numFailedTests === 0 && result.numFailedTestSuites === 0
473
+ && Number.isFinite(result.numPassedTests) && result.numPassedTests > 0) {
458
474
  return { passed: true };
459
475
  }
460
476
  const failedTest = result.testResults?.[0]?.assertionResults?.find((r) => r.status === 'failed');
461
477
  return {
462
478
  passed: false,
463
- error: failedTest?.failureMessages?.join('\n') || stderr || `Test failed with exit code ${exitCode}`,
479
+ error: failedTest?.failureMessages?.join('\n') || stderr
480
+ || (exitCode === 0 ? 'Retry runner did not report any passing tests.' : `Test failed with exit code ${exitCode}`),
464
481
  };
465
482
  }
466
483
  // Mocha JSON output
467
484
  const mochaMatch = stdout.match(/\{[\s\S]*"stats"[\s\S]*"failures"[\s\S]*\}/);
468
485
  if (mochaMatch) {
469
486
  const result = safeJsonParse(mochaMatch[0]);
470
- if (exitCode === 0 && result.stats?.failures === 0) {
487
+ if (exitCode === 0 && result.stats?.failures === 0
488
+ && Number.isFinite(result.stats?.passes) && result.stats.passes > 0) {
471
489
  return { passed: true };
472
490
  }
473
491
  const failure = result.failures?.[0];
474
492
  return {
475
493
  passed: false,
476
- error: failure?.err?.message || stderr || `Test failed with exit code ${exitCode}`,
494
+ error: failure?.err?.message || stderr
495
+ || (exitCode === 0 ? 'Retry runner did not report any passing tests.' : `Test failed with exit code ${exitCode}`),
477
496
  };
478
497
  }
479
498
  }
480
499
  catch {
481
- // JSON parsing failed, fall back to simple exit code check
500
+ // Unreadable output cannot prove that the retry executed a passing test.
482
501
  }
483
502
  if (exitCode === 0)
484
- return { passed: true };
503
+ return { passed: false, error: 'Retry runner did not report any passing tests.' };
485
504
  // Non-zero exit code means failure
486
505
  const errorOutput = stderr || stdout || `Test failed with exit code ${exitCode}`;
487
506
  return {
@@ -170,9 +170,9 @@ export declare class TestExecutorService implements ITestExecutionService {
170
170
  */
171
171
  private extractCoverageFromJson;
172
172
  /**
173
- * Read coverage from disk files written by vitest/jest.
174
- * Both runners write coverage-summary.json to a coverage/ directory when
175
- * --coverage is passed, rather than embedding it in stdout JSON.
173
+ * Read coverage from the private output directory of a completed runner.
174
+ * Setting the directory does not enable coverage; project configuration
175
+ * still decides whether coverage is collected.
176
176
  */
177
177
  private readCoverageFromDisk;
178
178
  private storeResults;