agentic-qe 3.15.4 → 3.15.6

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 (556) hide show
  1. package/.claude/skills/qe-court/evals/fixtures/seeded-mutant-delivery/README.md +9 -2
  2. package/.claude/skills/qe-court/evals/qe-court.yaml +3 -2
  3. package/.claude/skills/qe-quality-assessment/schemas/output.json +12 -2
  4. package/.claude/skills/skills-manifest.json +1 -1
  5. package/CHANGELOG.md +191 -0
  6. package/assets/skills/qe-court/evals/fixtures/seeded-mutant-delivery/README.md +9 -2
  7. package/assets/skills/qe-court/evals/qe-court.yaml +3 -2
  8. package/assets/skills/qe-quality-assessment/schemas/output.json +12 -2
  9. package/assets/skills/skills-manifest.json +1 -1
  10. package/dist/bridge/captured-experience-bridge.js +7 -9
  11. package/dist/cli/bundle.js +5 -5
  12. package/dist/cli/chunks/adapter-PP3XIXDV.js +2 -0
  13. package/dist/cli/chunks/{agent-booster-wasm-MHJBRXMK.js → agent-booster-wasm-SY7UCLBL.js} +2 -2
  14. package/dist/cli/chunks/{agent-handler-G64SD7J2.js → agent-handler-KAMYBU3S.js} +2 -2
  15. package/dist/cli/chunks/{agent-memory-branch-G4UXFPKH.js → agent-memory-branch-2CAW3KUM.js} +2 -2
  16. package/dist/cli/chunks/aqe-learning-engine-VDUQJKKY.js +2 -0
  17. package/dist/cli/chunks/{arena-63M3M6EW.js → arena-4OFLJ3R2.js} +2 -2
  18. package/dist/cli/chunks/{arena-QJMKYPHS.js → arena-QCCVIOAH.js} +4 -4
  19. package/dist/cli/chunks/{audit-UDFVTWSX.js → audit-RBDQJQJB.js} +3 -3
  20. package/dist/cli/chunks/base-QSYWWPCE.js +2 -0
  21. package/dist/cli/chunks/{better-sqlite3-JLX2G56I.js → better-sqlite3-5JRACCDQ.js} +2 -2
  22. package/dist/cli/chunks/{brain-handler-PWF32LLW.js → brain-handler-W4QIIRT4.js} +3 -3
  23. package/dist/cli/chunks/{branch-enumerator-PB7QWXDP.js → branch-enumerator-IBNGI572.js} +2 -2
  24. package/dist/cli/chunks/{browser-CYNV2F3U.js → browser-GMSCVAOI.js} +2 -2
  25. package/dist/cli/chunks/browser-workflow-WXXPBSCM.js +2 -0
  26. package/dist/cli/chunks/{chunk-S5D3HCGN.js → chunk-22OZIJAD.js} +2 -2
  27. package/dist/cli/chunks/{chunk-NBMQOP2R.js → chunk-24ZSGYC6.js} +1 -1
  28. package/dist/cli/chunks/{chunk-HFSBONCS.js → chunk-2CIDFR2H.js} +3 -3
  29. package/dist/cli/chunks/{chunk-A4OPQJ4A.js → chunk-2IWPJUVV.js} +5 -5
  30. package/dist/cli/chunks/{chunk-RI4JPBZD.js → chunk-2ZTWPMTK.js} +2 -2
  31. package/dist/cli/chunks/{chunk-ZURYZEHX.js → chunk-34MDMFET.js} +2 -2
  32. package/dist/cli/chunks/chunk-3DJNKNBR.js +742 -0
  33. package/dist/cli/chunks/{chunk-GJVRQBLI.js → chunk-3NJ7O3OH.js} +2 -2
  34. package/dist/cli/chunks/chunk-45MVRQG4.js +2 -0
  35. package/dist/cli/chunks/chunk-46HBVDMU.js +2 -0
  36. package/dist/cli/chunks/{chunk-SCL2OYN7.js → chunk-47Q7JL3V.js} +2 -2
  37. package/dist/cli/chunks/chunk-4CLDYT36.js +2 -0
  38. package/dist/cli/chunks/{chunk-3ZIVBTX6.js → chunk-4KOVHQXK.js} +2 -2
  39. package/dist/cli/chunks/{chunk-BBKLVHDQ.js → chunk-4POOJYXA.js} +1 -1
  40. package/dist/cli/chunks/{chunk-DAYMT7TH.js → chunk-5DH5QI7G.js} +26 -26
  41. package/dist/cli/chunks/{chunk-2534PXIV.js → chunk-5GIJU2ZY.js} +2 -2
  42. package/dist/cli/chunks/{chunk-MBV57LKC.js → chunk-5HAPS6VD.js} +2 -2
  43. package/dist/cli/chunks/{chunk-NIJMLEAX.js → chunk-5LST62QR.js} +2 -2
  44. package/dist/cli/chunks/{chunk-33IUCP34.js → chunk-5MT7DMD7.js} +2 -2
  45. package/dist/cli/chunks/{chunk-LRTF5RMG.js → chunk-5NC7QEJ6.js} +4 -4
  46. package/dist/cli/chunks/{chunk-SJB4KMZS.js → chunk-5UPIL62W.js} +3 -3
  47. package/dist/cli/chunks/{chunk-76PRW2KY.js → chunk-5VUIXDY2.js} +2 -2
  48. package/dist/cli/chunks/chunk-5VZVMO7B.js +3 -0
  49. package/dist/cli/chunks/{chunk-J3RNVHDH.js → chunk-624QRKQX.js} +1 -1
  50. package/dist/cli/chunks/{chunk-N6CRIUTO.js → chunk-66NW3ZB4.js} +2 -2
  51. package/dist/cli/chunks/{chunk-PCWZCXBD.js → chunk-6HWARQWV.js} +2 -2
  52. package/dist/cli/chunks/{chunk-VAXQUD5G.js → chunk-6MXAJBEA.js} +1 -1
  53. package/dist/cli/chunks/{chunk-LOLAEDZD.js → chunk-6R3FBFCJ.js} +2 -2
  54. package/dist/cli/chunks/{chunk-ASKPTGUU.js → chunk-6RDVY26I.js} +2 -2
  55. package/dist/cli/chunks/{chunk-35A22AUL.js → chunk-6T6AHVLF.js} +1 -1
  56. package/dist/cli/chunks/{chunk-IKWAPHJA.js → chunk-6WOZUSSN.js} +2 -2
  57. package/dist/cli/chunks/chunk-72MQCZSM.js +2 -0
  58. package/dist/cli/chunks/chunk-7QVPMH25.js +3 -0
  59. package/dist/cli/chunks/{chunk-5H7MR6HP.js → chunk-7SAMMQVS.js} +1 -1
  60. package/dist/cli/chunks/{chunk-B7J3O2WM.js → chunk-7TJZDRDU.js} +1 -1
  61. package/dist/cli/chunks/{chunk-OFQDM73J.js → chunk-7TVIX4WL.js} +2 -2
  62. package/dist/cli/chunks/{chunk-SZWXUG36.js → chunk-7VTKR44N.js} +2 -2
  63. package/dist/cli/chunks/{chunk-5B5D5KCV.js → chunk-7XTANLTN.js} +1 -1
  64. package/dist/cli/chunks/chunk-7XUB7U6Z.js +4 -0
  65. package/dist/cli/chunks/{chunk-GAXTPQCZ.js → chunk-A74J23QB.js} +2 -2
  66. package/dist/cli/chunks/{chunk-K2VUYRMG.js → chunk-A7ANPS4E.js} +2 -2
  67. package/dist/cli/chunks/{chunk-WO4NSPLX.js → chunk-AJT3XDRD.js} +2 -2
  68. package/dist/cli/chunks/{chunk-LPSE6DOQ.js → chunk-ALCIUWFC.js} +1 -1
  69. package/dist/cli/chunks/{chunk-UK5HY6LC.js → chunk-AUN4FG7V.js} +1 -1
  70. package/dist/cli/chunks/{chunk-MGH4XIHH.js → chunk-AUOSHM63.js} +2 -2
  71. package/dist/cli/chunks/{chunk-HX5KQK7I.js → chunk-AX26QJ6T.js} +2 -2
  72. package/dist/cli/chunks/{chunk-BZWZTGMF.js → chunk-B7RHBKHL.js} +2 -2
  73. package/dist/cli/chunks/{chunk-I5A3HGO6.js → chunk-BAYGQRNP.js} +2 -2
  74. package/dist/cli/chunks/{chunk-3C2BFLYC.js → chunk-BIXRTOH3.js} +18 -18
  75. package/dist/cli/chunks/{chunk-EWUFVWRT.js → chunk-BO7UFNYV.js} +2 -2
  76. package/dist/cli/chunks/{chunk-6TMUZGM2.js → chunk-BUTGIVKW.js} +1 -1
  77. package/dist/cli/chunks/{chunk-2MU4WCMQ.js → chunk-BXATKI5S.js} +2 -2
  78. package/dist/cli/chunks/{chunk-HEDLZWPM.js → chunk-CCL436IU.js} +44 -33
  79. package/dist/cli/chunks/{chunk-6EHVPFHW.js → chunk-CEXNW5TR.js} +1 -1
  80. package/dist/cli/chunks/{chunk-2ICC4H6K.js → chunk-CLAMMGY3.js} +2 -2
  81. package/dist/cli/chunks/{chunk-BPGFCUDO.js → chunk-CR66HNAE.js} +1 -1
  82. package/dist/cli/chunks/{chunk-CFXFGQEN.js → chunk-CZBIREL5.js} +2 -2
  83. package/dist/cli/chunks/{chunk-Z56QTRRB.js → chunk-D5N2O5EH.js} +2 -2
  84. package/dist/cli/chunks/{chunk-M6SJALLA.js → chunk-DA7DGDTI.js} +2 -2
  85. package/dist/cli/chunks/{chunk-R47LNH5W.js → chunk-DLSFT6PO.js} +2 -2
  86. package/dist/cli/chunks/{chunk-6HTO4BLV.js → chunk-DQNUPEY5.js} +2 -2
  87. package/dist/cli/chunks/{chunk-XZ5Z56OP.js → chunk-EECF4CMA.js} +1 -1
  88. package/dist/cli/chunks/{chunk-DFJGXXCL.js → chunk-EF5UHDCG.js} +1 -1
  89. package/dist/cli/chunks/{chunk-PJAXWCFC.js → chunk-EJ4KZFZN.js} +1 -1
  90. package/dist/cli/chunks/{chunk-RA3MI5WK.js → chunk-ELI4GDQO.js} +2 -2
  91. package/dist/cli/chunks/{chunk-BND6M2JX.js → chunk-F3KS3TAB.js} +2 -2
  92. package/dist/cli/chunks/{chunk-RB2SL5GD.js → chunk-F7A2UBZO.js} +2 -2
  93. package/dist/cli/chunks/{chunk-X5S5UEM6.js → chunk-FOJRPEIP.js} +2 -2
  94. package/dist/cli/chunks/{chunk-ZP6ANUP7.js → chunk-FQ5N666N.js} +1 -1
  95. package/dist/cli/chunks/{chunk-LZSLJJII.js → chunk-FU7LNUD7.js} +2 -2
  96. package/dist/cli/chunks/{chunk-FDK2GF4G.js → chunk-GFB6BZWU.js} +2 -2
  97. package/dist/cli/chunks/{chunk-C5EN5WB6.js → chunk-GI5HWS4H.js} +1 -1
  98. package/dist/cli/chunks/{chunk-SIUUAKCE.js → chunk-GNYOHZVV.js} +1 -1
  99. package/dist/cli/chunks/{chunk-OOK6GPJR.js → chunk-GVRFSXY6.js} +2 -2
  100. package/dist/cli/chunks/{chunk-6QPW4OVH.js → chunk-GWM4M5NF.js} +1 -1
  101. package/dist/cli/chunks/{chunk-PMXWDTDK.js → chunk-HAN4MS5T.js} +2 -2
  102. package/dist/cli/chunks/{chunk-WW6WUMS7.js → chunk-HEGGV2PT.js} +2 -2
  103. package/dist/cli/chunks/{chunk-4GLR2S2M.js → chunk-HOEWMEF2.js} +2 -2
  104. package/dist/cli/chunks/{chunk-BY3IL56R.js → chunk-HZFK2Z2Z.js} +1 -1
  105. package/dist/cli/chunks/chunk-I7WAW7TM.js +2 -0
  106. package/dist/cli/chunks/{chunk-LXYTC62V.js → chunk-IEPWO4XP.js} +2 -2
  107. package/dist/cli/chunks/{chunk-3MSBVOYW.js → chunk-ITIJ23K2.js} +2 -2
  108. package/dist/cli/chunks/{chunk-PEA4DVXW.js → chunk-IVJIHZSM.js} +1 -1
  109. package/dist/cli/chunks/{chunk-P7GM3EE7.js → chunk-JAPBSSFY.js} +1 -1
  110. package/dist/cli/chunks/{chunk-SOSJFEFB.js → chunk-JCE76MPP.js} +2 -2
  111. package/dist/cli/chunks/{chunk-YZ2AGC7O.js → chunk-JPJEAK4G.js} +1 -1
  112. package/dist/cli/chunks/{chunk-RG67RZIX.js → chunk-JYKQVYX2.js} +2 -2
  113. package/dist/cli/chunks/{chunk-W6TJXK5Y.js → chunk-K55EAWZ5.js} +2 -2
  114. package/dist/cli/chunks/chunk-KCB6P463.js +3 -0
  115. package/dist/cli/chunks/{chunk-W3PPYNHF.js → chunk-KIDOBLUO.js} +2 -2
  116. package/dist/cli/chunks/{chunk-JL3TI43V.js → chunk-KYVIOC3C.js} +2 -2
  117. package/dist/cli/chunks/{chunk-WEDVLKRB.js → chunk-L2TDHJR3.js} +2 -2
  118. package/dist/cli/chunks/{chunk-5GWTJJEO.js → chunk-L4D3TPFP.js} +1 -1
  119. package/dist/cli/chunks/{chunk-PB2WSCBW.js → chunk-LAY7NCQK.js} +3 -3
  120. package/dist/cli/chunks/{chunk-T3BMCEQR.js → chunk-LCCTJ2PC.js} +2 -2
  121. package/dist/cli/chunks/{chunk-7INP6HZH.js → chunk-LJCEDTUM.js} +3 -3
  122. package/dist/cli/chunks/{chunk-DEJM2P5K.js → chunk-LMAEMVPA.js} +1 -1
  123. package/dist/cli/chunks/{chunk-HCDTLV5J.js → chunk-LZWJ5BMP.js} +2 -2
  124. package/dist/cli/chunks/{chunk-D7RVZ5C2.js → chunk-MP3FSUNB.js} +2 -2
  125. package/dist/cli/chunks/{chunk-ADF6LGHZ.js → chunk-MQCTLTGE.js} +2 -2
  126. package/dist/cli/chunks/{chunk-OHH6BUZK.js → chunk-MQTA6KIO.js} +1 -1
  127. package/dist/cli/chunks/{chunk-ISASRHZP.js → chunk-NBUXM5X6.js} +10 -6
  128. package/dist/cli/chunks/{chunk-KOLHZSEC.js → chunk-NHRF3V4B.js} +2 -2
  129. package/dist/cli/chunks/chunk-NMY4KTWA.js +16 -0
  130. package/dist/cli/chunks/chunk-NYS2GUNO.js +2 -0
  131. package/dist/cli/chunks/{chunk-EGHK6NMH.js → chunk-ONPPBLRB.js} +2 -2
  132. package/dist/cli/chunks/{chunk-YQ6BK7QC.js → chunk-OPDZBRIL.js} +2 -2
  133. package/dist/cli/chunks/{chunk-DPL4ZXTE.js → chunk-OQ4S6B7P.js} +1 -1
  134. package/dist/cli/chunks/{chunk-6HO3XRXE.js → chunk-ORBODZSO.js} +2 -2
  135. package/dist/cli/chunks/{chunk-GLKLEHK3.js → chunk-ORFL3YXB.js} +2 -2
  136. package/dist/cli/chunks/{chunk-I43QRLLB.js → chunk-P7DXVL2S.js} +2 -2
  137. package/dist/cli/chunks/chunk-PEMSXSP2.js +4 -0
  138. package/dist/cli/chunks/chunk-PS6WFCA4.js +6 -0
  139. package/dist/cli/chunks/{chunk-HEKCN5XQ.js → chunk-Q2RBOC7V.js} +2 -2
  140. package/dist/cli/chunks/{chunk-54XTJBHV.js → chunk-QLKUCMZC.js} +1 -1
  141. package/dist/cli/chunks/{chunk-3BDDOFYW.js → chunk-QLYO3H7E.js} +9 -9
  142. package/dist/cli/chunks/{chunk-VMSO6DMF.js → chunk-QS5KZYUZ.js} +2 -2
  143. package/dist/cli/chunks/{chunk-JFQDWAU3.js → chunk-R363XXGH.js} +2 -2
  144. package/dist/cli/chunks/chunk-RD5BYLN7.js +2 -0
  145. package/dist/cli/chunks/{chunk-73PCVMGA.js → chunk-RFDFET3O.js} +2 -2
  146. package/dist/cli/chunks/{chunk-LJRZAALA.js → chunk-RHIQ6QO5.js} +357 -351
  147. package/dist/cli/chunks/chunk-RLB7K7QP.js +2 -0
  148. package/dist/cli/chunks/{chunk-RJ5CZ7B6.js → chunk-RUTO67PT.js} +2 -2
  149. package/dist/cli/chunks/{chunk-DF4Y3HPO.js → chunk-RV6HSMKJ.js} +1 -1
  150. package/dist/cli/chunks/{chunk-54ITMOFM.js → chunk-SOSJWM3E.js} +4 -4
  151. package/dist/cli/chunks/{chunk-5SS2Z7JC.js → chunk-SV5BUYHH.js} +2 -2
  152. package/dist/cli/chunks/{chunk-XHCCH7UC.js → chunk-TL5GV3PR.js} +8 -8
  153. package/dist/cli/chunks/{chunk-ZKXZTIVF.js → chunk-TLUIO37P.js} +2 -2
  154. package/dist/cli/chunks/{chunk-2LL35V3A.js → chunk-TUDENMAE.js} +2 -2
  155. package/dist/cli/chunks/chunk-TVLOED6O.js +2 -0
  156. package/dist/cli/chunks/{chunk-2DRMTRBM.js → chunk-UB6DQGWM.js} +2 -2
  157. package/dist/cli/chunks/chunk-UHHMAKPE.js +3 -0
  158. package/dist/cli/chunks/{chunk-DBIK4OFX.js → chunk-ULCHPPW2.js} +1 -1
  159. package/dist/cli/chunks/chunk-V3OLS2NG.js +2 -0
  160. package/dist/cli/chunks/{chunk-I6E4X3L3.js → chunk-VAYZ5QIE.js} +1 -1
  161. package/dist/cli/chunks/{chunk-G3ZUB3HD.js → chunk-VCONCVSY.js} +3 -3
  162. package/dist/cli/chunks/{chunk-7X2IVMXN.js → chunk-VVF337SV.js} +2 -2
  163. package/dist/cli/chunks/{chunk-EY5IUF7U.js → chunk-WKDWRRDT.js} +2 -2
  164. package/dist/cli/chunks/{chunk-FRBCX46J.js → chunk-X2DR27AY.js} +2 -2
  165. package/dist/cli/chunks/{chunk-I53365HG.js → chunk-X33F7NXH.js} +3 -3
  166. package/dist/cli/chunks/{chunk-MVTUFPM2.js → chunk-XBEI2JBA.js} +2 -2
  167. package/dist/cli/chunks/{chunk-OG4KHX7S.js → chunk-XBFQJZWX.js} +2 -2
  168. package/dist/cli/chunks/{chunk-DVE5SM5G.js → chunk-XFPQIWEH.js} +3 -3
  169. package/dist/cli/chunks/{chunk-RWZ4F44Y.js → chunk-XPB5BVU6.js} +2 -2
  170. package/dist/cli/chunks/{chunk-TVQPYP2Z.js → chunk-XQ53PZEF.js} +3 -3
  171. package/dist/cli/chunks/{chunk-73MTUM6F.js → chunk-XZ46CI35.js} +2 -2
  172. package/dist/cli/chunks/chunk-YLNYPQDR.js +2 -0
  173. package/dist/cli/chunks/{chunk-BY5PLEPZ.js → chunk-YNG7E26C.js} +2 -2
  174. package/dist/cli/chunks/{chunk-YUWUFYHK.js → chunk-YXU35GGD.js} +1 -1
  175. package/dist/cli/chunks/{chunk-B7GJXQD2.js → chunk-ZCP4P6O2.js} +2 -2
  176. package/dist/cli/chunks/{chunk-LGA6J4I4.js → chunk-ZL5LJT7D.js} +2 -2
  177. package/dist/cli/chunks/{chunk-TB22Y3WW.js → chunk-ZOUEQ6DL.js} +1 -1
  178. package/dist/cli/chunks/{chunk-U2E5F3VZ.js → chunk-ZSBD4FUX.js} +2 -2
  179. package/dist/cli/chunks/chunk-ZTB32K5N.js +5 -0
  180. package/dist/cli/chunks/{chunk-WYO5VN2L.js → chunk-ZUTFHGEO.js} +1 -1
  181. package/dist/cli/chunks/ci-GEJCXMBK.js +81 -0
  182. package/dist/cli/chunks/ci-config-2ZVV4OXL.js +2 -0
  183. package/dist/cli/chunks/{ci-output-BMJABAEX.js → ci-output-E45OGVPR.js} +2 -2
  184. package/dist/cli/chunks/{circuit-breaker-GYD5CMJQ.js → circuit-breaker-X73ITYZC.js} +2 -2
  185. package/dist/cli/chunks/{claude-flow-setup-MMOYVBVD.js → claude-flow-setup-W4PPH46C.js} +2 -2
  186. package/dist/cli/chunks/client-6XKSQ4JT.js +2 -0
  187. package/dist/cli/chunks/{cline-installer-B2SOZ44R.js → cline-installer-NUEPMWDE.js} +2 -2
  188. package/dist/cli/chunks/{code-V3FIRAXD.js → code-6WQHBS7G.js} +4 -4
  189. package/dist/cli/chunks/{code-index-extractor-CV6A756Z.js → code-index-extractor-BXQIFIFT.js} +2 -2
  190. package/dist/cli/chunks/{codex-installer-EUC6J47Y.js → codex-installer-Z337R2KH.js} +2 -2
  191. package/dist/cli/chunks/{completions-DQQIBAHR.js → completions-F5DMYFHV.js} +2 -2
  192. package/dist/cli/chunks/{complexity-analyzer-HPXMXP5I.js → complexity-analyzer-W2SYPZDI.js} +2 -2
  193. package/dist/cli/chunks/{continuedev-installer-RCIYXH6V.js → continuedev-installer-ZCHUIFTN.js} +2 -2
  194. package/dist/cli/chunks/{copilot-installer-VUH32SHF.js → copilot-installer-M5JNODXF.js} +2 -2
  195. package/dist/cli/chunks/core-handlers-OJYW4Y6M.js +2 -0
  196. package/dist/cli/chunks/{cost-tracker-YLCKLOAL.js → cost-tracker-LSYTHBHV.js} +2 -2
  197. package/dist/cli/chunks/coverage-PGMRS5SS.js +49 -0
  198. package/dist/cli/chunks/cross-domain-router-QVUPQ2SC.js +2 -0
  199. package/dist/cli/chunks/{cursor-installer-B42FN62K.js → cursor-installer-XPUA73UW.js} +2 -2
  200. package/dist/cli/chunks/{daemon-DECQRQII.js → daemon-ITKDIYMW.js} +5 -5
  201. package/dist/cli/chunks/daemon-QBYTCIMH.js +10 -0
  202. package/dist/cli/chunks/{dag-attention-scheduler-RY7CDYSC.js → dag-attention-scheduler-T55AXLD6.js} +2 -2
  203. package/dist/cli/chunks/{detect-NW53BMJN.js → detect-DR7J6K4O.js} +2 -2
  204. package/dist/cli/chunks/{dist-node-LE6KHXAB.js → dist-node-LAJJBOUT.js} +2 -2
  205. package/dist/cli/chunks/{domain-handler-JGXFT4LW.js → domain-handler-OMSHCRMK.js} +2 -2
  206. package/dist/cli/chunks/{domain-plugins-GY3RYKKK.js → domain-plugins-EQXSKC5K.js} +2 -2
  207. package/dist/cli/chunks/{domain-transfer-CGBRXNTC.js → domain-transfer-FKRAGVSW.js} +2 -2
  208. package/dist/cli/chunks/dream-3UABDRZJ.js +2 -0
  209. package/dist/cli/chunks/embed-and-insert-pattern-JZFPCNL3.js +3 -0
  210. package/dist/cli/chunks/{eval-YPYIZQUR.js → eval-JSNNASBW.js} +2 -2
  211. package/dist/cli/chunks/experience-capture-middleware-UPD3IZBK.js +40 -0
  212. package/dist/cli/chunks/{fast-paths-HYQTAF2S.js → fast-paths-YNMIBS2E.js} +2 -2
  213. package/dist/cli/chunks/{feature-flags-HNSAFFX2.js → feature-flags-SRLXDKBI.js} +2 -2
  214. package/dist/cli/chunks/{feature-flags-YACUH6OW.js → feature-flags-VIR7O4L7.js} +2 -2
  215. package/dist/cli/chunks/file-discovery-ZFGZTKZ4.js +2 -0
  216. package/dist/cli/chunks/{fleet-6M3BP4OO.js → fleet-K2ED46EL.js} +3 -3
  217. package/dist/cli/chunks/{gnn-wrapper-QLD7KHXV.js → gnn-wrapper-QCU4ZRYW.js} +2 -2
  218. package/dist/cli/chunks/{heartbeat-handler-EZP333X4.js → heartbeat-handler-YYQI4WZM.js} +4 -4
  219. package/dist/cli/chunks/heartbeat-scheduler-MJ6MTPDF.js +2 -0
  220. package/dist/cli/chunks/hnsw-adapter-FQWJCFVW.js +2 -0
  221. package/dist/cli/chunks/hnsw-index-NJYKJUHC.js +2 -0
  222. package/dist/cli/chunks/{hnsw-legacy-bridge-47CUCSAU.js → hnsw-legacy-bridge-C5TJSWTZ.js} +2 -2
  223. package/dist/cli/chunks/{hnswlib-node-SVNYDJZH.js → hnswlib-node-SE3MJJYS.js} +2 -2
  224. package/dist/cli/chunks/{hooks-6V5LMWP6.js → hooks-C572SRDH.js} +43 -43
  225. package/dist/cli/chunks/hybrid-backend-SL7RFID7.js +2 -0
  226. package/dist/cli/chunks/{hypergraph-engine-L2FOBIFF.js → hypergraph-engine-35A6G3M5.js} +2 -2
  227. package/dist/cli/chunks/{hypergraph-handler-DU6Z57EE.js → hypergraph-handler-U2756CWI.js} +3 -3
  228. package/dist/cli/chunks/impact-analyzer-5ZJTXPVC.js +2 -0
  229. package/dist/cli/chunks/init-handler-PCLYQUSB.js +88 -0
  230. package/dist/cli/chunks/init-wizard-MQMDSIOF.js +2 -0
  231. package/dist/cli/chunks/kernel-MEJ5GMRH.js +2 -0
  232. package/dist/cli/chunks/{kilocode-installer-NHKYGJ7Q.js → kilocode-installer-32PX5YH7.js} +2 -2
  233. package/dist/cli/chunks/{kiro-installer-24UK6GGR.js → kiro-installer-C4ROMMUS.js} +2 -2
  234. package/dist/cli/chunks/knowledge-graph-XUBZSEZE.js +2 -0
  235. package/dist/cli/chunks/learning-GEPVZGJQ.js +122 -0
  236. package/dist/cli/chunks/{llm-router-XRMI2VMG.js → llm-router-XRKTTJTX.js} +4 -4
  237. package/dist/cli/chunks/llm-router-service-QZAPAEPX.js +2 -0
  238. package/dist/cli/chunks/{load-W5UWL5C7.js → load-XVH6HW7E.js} +2 -2
  239. package/dist/cli/chunks/load-test-OVXIQ3AF.js +2 -0
  240. package/dist/cli/chunks/{mcp-N7ALQ4BL.js → mcp-IULSTM4Z.js} +2 -2
  241. package/dist/cli/chunks/{memory-WV52DLSA.js → memory-6K7IAU4T.js} +5 -5
  242. package/dist/cli/chunks/memory-backend-TRPOMPK4.js +2 -0
  243. package/dist/cli/chunks/memory-handlers-CG6DRLAW.js +2 -0
  244. package/dist/cli/chunks/{multi-model-executor-3FVTZCSO.js → multi-model-executor-VZDUYPLX.js} +2 -2
  245. package/dist/cli/chunks/{opencode-installer-NTPWGHUW.js → opencode-installer-QUTXKNH4.js} +2 -2
  246. package/dist/cli/chunks/orchestrator-PCKKUWOP.js +452 -0
  247. package/dist/cli/chunks/pattern-null-store-JWYBRBZG.js +2 -0
  248. package/dist/cli/chunks/{pattern-usage-recorder-WWXHUH5U.js → pattern-usage-recorder-PX5HQVRL.js} +2 -2
  249. package/dist/cli/chunks/{pipeline-ZOKZFXTH.js → pipeline-O562GTOG.js} +2 -2
  250. package/dist/cli/chunks/{platform-CDNL322F.js → platform-PM7Q2AZS.js} +2 -2
  251. package/dist/cli/chunks/plugin-OTYTFGPY.js +27 -0
  252. package/dist/cli/chunks/{prime-radiant-advanced-wasm-FVJDU2JY.js → prime-radiant-advanced-wasm-6CFXTHC2.js} +2 -2
  253. package/dist/cli/chunks/project-root-VVSTHIP4.js +2 -0
  254. package/dist/cli/chunks/protocol-executor-PXZCLZD3.js +2 -0
  255. package/dist/cli/chunks/{protocol-handler-4YBN5R23.js → protocol-handler-PPGNSAOS.js} +2 -2
  256. package/dist/cli/chunks/{prove-BHDHY664.js → prove-WQ3BKRZG.js} +2 -2
  257. package/dist/cli/chunks/qe-reasoning-bank-42FRS5V3.js +2 -0
  258. package/dist/cli/chunks/quality-C5WUU3AA.js +8 -0
  259. package/dist/cli/chunks/{quality-gate-WANE7TCN.js → quality-gate-WSSRKD5U.js} +3 -3
  260. package/dist/cli/chunks/queen-coordinator-UI3B7DI6.js +2 -0
  261. package/dist/cli/chunks/real-embeddings-CFQE7IRQ.js +2 -0
  262. package/dist/cli/chunks/{ref-validation-S7UWXQIP.js → ref-validation-DHKHXVZT.js} +2 -2
  263. package/dist/cli/chunks/{roocode-installer-TEYOQYL6.js → roocode-installer-3PPODABV.js} +2 -2
  264. package/dist/cli/chunks/router-HYRPWLAY.js +2 -0
  265. package/dist/cli/chunks/routing-feedback-BPZ5R6F3.js +2 -0
  266. package/dist/cli/chunks/{routing-handler-KDTLMRWD.js → routing-handler-JNXTGT6T.js} +2 -2
  267. package/dist/cli/chunks/{ruvector-commands-AOUDXCYE.js → ruvector-commands-6YLROPVP.js} +2 -2
  268. package/dist/cli/chunks/rvf-dual-writer-DEKDQ6KO.js +2 -0
  269. package/dist/cli/chunks/rvf-migration-adapter-L53VBS7I.js +2 -0
  270. package/dist/cli/chunks/rvf-migration-coordinator-4DWB4WRK.js +2 -0
  271. package/dist/cli/chunks/rvf-native-adapter-I6RUGD2D.js +2 -0
  272. package/dist/cli/chunks/{rvf-store-integrity-QI47Y354.js → rvf-store-integrity-YKR2ZNBF.js} +2 -2
  273. package/dist/cli/chunks/safe-db-KS65XDCP.js +2 -0
  274. package/dist/cli/chunks/schedule-KD2VN6GB.js +2 -0
  275. package/dist/cli/chunks/scheduler-ZH3RMUHY.js +2 -0
  276. package/dist/cli/chunks/{security-SN6MWOJT.js → security-PWQTGDRU.js} +3 -3
  277. package/dist/cli/chunks/shared-rvf-adapter-LNRLFP5I.js +2 -0
  278. package/dist/cli/chunks/{shared-rvf-dual-writer-WU7PFKQM.js → shared-rvf-dual-writer-GWU6YQNS.js} +2 -2
  279. package/dist/cli/chunks/sqlite-persistence-6DTVME5D.js +2 -0
  280. package/dist/cli/chunks/{standalone-memory-F6FSRFWC.js → standalone-memory-46KKBSSV.js} +2 -2
  281. package/dist/cli/chunks/{status-handler-DHD5MS4G.js → status-handler-35T5FTDQ.js} +2 -2
  282. package/dist/cli/chunks/{structural-health-P6HPSQMR.js → structural-health-P7QPQWLO.js} +2 -2
  283. package/dist/cli/chunks/{sync-LISJGDSE.js → sync-W6Z4R4PL.js} +2 -2
  284. package/dist/cli/chunks/sync-Y43EWBSY.js +2 -0
  285. package/dist/cli/chunks/{task-handler-ZT44NT5Z.js → task-handler-5CX3ZYT7.js} +2 -2
  286. package/dist/cli/chunks/{task-handlers-R6DQ5324.js → task-handlers-DQZGOJNE.js} +3 -3
  287. package/dist/cli/chunks/{test-MUFHR4JQ.js → test-TPP53VVV.js} +12 -12
  288. package/dist/cli/chunks/{test-scheduling-TAUSLZJP.js → test-scheduling-WBV4UMQH.js} +3 -3
  289. package/dist/cli/chunks/token-bootstrap-GIIDXHLC.js +2 -0
  290. package/dist/cli/chunks/{token-usage-IX65ECBR.js → token-usage-AKK37RB7.js} +2 -2
  291. package/dist/cli/chunks/{transformers-QKPSVW2W.js → transformers-7MASPELS.js} +2 -2
  292. package/dist/cli/chunks/{tree-sitter-wasm-parser-Z7PPA2JO.js → tree-sitter-wasm-parser-YZKD6UGB.js} +2 -2
  293. package/dist/cli/chunks/{types-ULNNGGGH.js → types-AZ3BTXDP.js} +2 -2
  294. package/dist/cli/chunks/unified-memory-FCX7NLFZ.js +2 -0
  295. package/dist/cli/chunks/unified-memory-hnsw-VU5QJK37.js +2 -0
  296. package/dist/cli/chunks/unified-persistence-FM376LGE.js +2 -0
  297. package/dist/cli/chunks/{upgrade-ECI3YUYA.js → upgrade-L7OTDKEK.js} +2 -2
  298. package/dist/cli/chunks/{validate-3JKRUW2S.js → validate-O3QVFIGP.js} +2 -2
  299. package/dist/cli/chunks/{validate-swarm-LZWANCIE.js → validate-swarm-2UGBGLTX.js} +2 -2
  300. package/dist/cli/chunks/visual-security-EU7Y3X46.js +2 -0
  301. package/dist/cli/chunks/{web-tree-sitter-N5V4A6XG.js → web-tree-sitter-J75IYPRO.js} +2 -2
  302. package/dist/cli/chunks/{windsurf-installer-5TBM5B3C.js → windsurf-installer-FQ5DBFCG.js} +2 -2
  303. package/dist/cli/chunks/witness-chain-CSEBT52D.js +2 -0
  304. package/dist/cli/chunks/{witness-chain-MFP3HBWQ.js → witness-chain-I7TN4MXZ.js} +2 -2
  305. package/dist/cli/chunks/witness-chain-repair-D3NE3NQK.js +2 -0
  306. package/dist/cli/chunks/{witness-chain-verifier-SRAT7LVY.js → witness-chain-verifier-RU2WOP5M.js} +2 -2
  307. package/dist/cli/chunks/witness-key-manager-IHQB2FR5.js +2 -0
  308. package/dist/cli/chunks/{workflow-M7TUYYXY.js → workflow-6BWTNVV6.js} +28 -28
  309. package/dist/cli/chunks/workflow-orchestrator-ALNKOM3N.js +2 -0
  310. package/dist/cli/chunks/wrappers-URVP25VU.js +2 -0
  311. package/dist/cli/commands/ci.js +53 -23
  312. package/dist/cli/commands/code.js +1 -0
  313. package/dist/cli/commands/coverage.d.ts +1 -0
  314. package/dist/cli/commands/coverage.js +182 -138
  315. package/dist/cli/commands/daemon.js +7 -1
  316. package/dist/cli/commands/hooks-handlers/stats-hooks.d.ts +15 -0
  317. package/dist/cli/commands/hooks-handlers/stats-hooks.js +54 -2
  318. package/dist/cli/commands/learning.js +47 -7
  319. package/dist/cli/commands/quality.d.ts +12 -1
  320. package/dist/cli/commands/quality.js +51 -3
  321. package/dist/cli/commands/test.js +6 -7
  322. package/dist/cli/commands/workflow.js +9 -5
  323. package/dist/cli/handlers/init-guard.d.ts +13 -0
  324. package/dist/cli/handlers/init-guard.js +23 -0
  325. package/dist/cli/handlers/init-handler.d.ts +3 -0
  326. package/dist/cli/handlers/init-handler.js +9 -0
  327. package/dist/cli/handlers/interfaces.js +5 -1
  328. package/dist/cli/scheduler/persistent-scheduler.d.ts +6 -2
  329. package/dist/cli/scheduler/persistent-scheduler.js +107 -41
  330. package/dist/cli/utils/ci-output.d.ts +22 -5
  331. package/dist/cli/utils/ci-output.js +33 -5
  332. package/dist/cli/utils/coverage-data.d.ts +10 -0
  333. package/dist/cli/utils/coverage-data.js +34 -65
  334. package/dist/cli/utils/coverage-verdict.d.ts +130 -0
  335. package/dist/cli/utils/coverage-verdict.js +193 -0
  336. package/dist/cli/utils/file-discovery.js +5 -0
  337. package/dist/contracts/verdicts.d.ts +14 -0
  338. package/dist/contracts/verdicts.js +44 -3
  339. package/dist/coordination/deterministic-actions.js +24 -13
  340. package/dist/coordination/handlers/code-intelligence-handlers.d.ts +8 -0
  341. package/dist/coordination/handlers/code-intelligence-handlers.js +39 -0
  342. package/dist/coordination/handlers/coverage-handlers.js +150 -121
  343. package/dist/coordination/handlers/coverage-runner.d.ts +143 -0
  344. package/dist/coordination/handlers/coverage-runner.js +462 -0
  345. package/dist/coordination/handlers/coverage-target.d.ts +145 -0
  346. package/dist/coordination/handlers/coverage-target.js +314 -0
  347. package/dist/coordination/handlers/handler-types.d.ts +9 -0
  348. package/dist/coordination/handlers/handler-utils.d.ts +23 -1
  349. package/dist/coordination/handlers/handler-utils.js +90 -23
  350. package/dist/coordination/handlers/quality-handlers.js +209 -33
  351. package/dist/coordination/handlers/test-execution-handlers.js +4 -1
  352. package/dist/coordination/protocols/defect-investigation.d.ts +2 -1
  353. package/dist/coordination/protocols/defect-investigation.js +6 -3
  354. package/dist/coordination/protocols/quality-gate.js +10 -6
  355. package/dist/coordination/result-saver.d.ts +22 -0
  356. package/dist/coordination/result-saver.js +130 -46
  357. package/dist/coordination/task-executor.d.ts +12 -0
  358. package/dist/coordination/task-executor.js +37 -1
  359. package/dist/domains/code-intelligence/coordinator.d.ts +2 -1
  360. package/dist/domains/code-intelligence/coordinator.js +10 -32
  361. package/dist/domains/code-intelligence/interfaces.d.ts +5 -0
  362. package/dist/domains/code-intelligence/plugin.js +5 -0
  363. package/dist/domains/code-intelligence/project-root-resolver.d.ts +50 -0
  364. package/dist/domains/code-intelligence/project-root-resolver.js +121 -0
  365. package/dist/domains/code-intelligence/services/metric-collector/index.js +9 -2
  366. package/dist/domains/code-intelligence/services/metric-collector/interfaces.d.ts +21 -0
  367. package/dist/domains/code-intelligence/services/metric-collector/interfaces.js +25 -0
  368. package/dist/domains/code-intelligence/services/metric-collector/loc-counter.d.ts +12 -0
  369. package/dist/domains/code-intelligence/services/metric-collector/loc-counter.js +69 -3
  370. package/dist/domains/code-intelligence/services/metric-collector/test-counter.js +4 -1
  371. package/dist/domains/coverage-analysis/collected-metrics.d.ts +33 -0
  372. package/dist/domains/coverage-analysis/collected-metrics.js +36 -0
  373. package/dist/domains/coverage-analysis/coordinator.js +22 -7
  374. package/dist/domains/coverage-analysis/interfaces.d.ts +59 -0
  375. package/dist/domains/coverage-analysis/interfaces.js +6 -1
  376. package/dist/domains/coverage-analysis/plugin.js +7 -1
  377. package/dist/domains/coverage-analysis/services/coverage-analyzer.d.ts +7 -0
  378. package/dist/domains/coverage-analysis/services/coverage-analyzer.js +85 -38
  379. package/dist/domains/coverage-analysis/services/gap-detector.js +7 -2
  380. package/dist/domains/defect-intelligence/plugin.js +4 -0
  381. package/dist/domains/defect-intelligence/services/defect-predictor.js +6 -4
  382. package/dist/domains/learning-optimization/coordinator.js +4 -0
  383. package/dist/domains/learning-optimization/plugin.js +4 -0
  384. package/dist/domains/quality-assessment/coordinator-claim-verifier.js +2 -1
  385. package/dist/domains/quality-assessment/coordinator-rl-integration.d.ts +14 -0
  386. package/dist/domains/quality-assessment/coordinator-rl-integration.js +54 -16
  387. package/dist/domains/quality-assessment/coordinator.js +18 -14
  388. package/dist/domains/quality-assessment/coverage-report-event.d.ts +49 -0
  389. package/dist/domains/quality-assessment/coverage-report-event.js +58 -0
  390. package/dist/domains/quality-assessment/evidence-sufficiency.d.ts +57 -0
  391. package/dist/domains/quality-assessment/evidence-sufficiency.js +97 -0
  392. package/dist/domains/quality-assessment/index.d.ts +2 -2
  393. package/dist/domains/quality-assessment/index.js +1 -1
  394. package/dist/domains/quality-assessment/interfaces.d.ts +46 -0
  395. package/dist/domains/quality-assessment/plugin.js +8 -8
  396. package/dist/domains/quality-assessment/quality-evidence.d.ts +98 -4
  397. package/dist/domains/quality-assessment/quality-evidence.js +152 -8
  398. package/dist/domains/quality-assessment/services/quality-analyzer.d.ts +23 -2
  399. package/dist/domains/quality-assessment/services/quality-analyzer.js +203 -116
  400. package/dist/domains/security-compliance/services/scanners/dast-scanner.js +22 -16
  401. package/dist/domains/test-execution/interfaces.d.ts +10 -6
  402. package/dist/domains/test-execution/plugin.js +4 -0
  403. package/dist/domains/test-execution/services/test-executor.js +152 -102
  404. package/dist/domains/test-generation/coordinator.js +4 -0
  405. package/dist/domains/test-generation/plugin.js +4 -0
  406. package/dist/feedback/coverage-learner.js +4 -1
  407. package/dist/feedback/coverage-session-provenance.d.ts +29 -0
  408. package/dist/feedback/coverage-session-provenance.js +39 -0
  409. package/dist/init/orchestrator.js +2 -0
  410. package/dist/init/phases/09-assets.d.ts +4 -0
  411. package/dist/init/phases/09-assets.js +35 -0
  412. package/dist/init/retired-assets.d.ts +86 -0
  413. package/dist/init/retired-assets.js +230 -0
  414. package/dist/init/skills-installer.d.ts +2 -0
  415. package/dist/init/skills-installer.js +4 -0
  416. package/dist/init/types.d.ts +3 -0
  417. package/dist/integrations/ruvector/rvf-native-adapter.d.ts +2 -0
  418. package/dist/integrations/ruvector/rvf-native-adapter.js +5 -0
  419. package/dist/integrations/ruvector/server-client.js +4 -12
  420. package/dist/kernel/project-root.d.ts +17 -0
  421. package/dist/kernel/project-root.js +54 -2
  422. package/dist/kernel/shared-dirs.d.ts +66 -0
  423. package/dist/kernel/shared-dirs.js +168 -0
  424. package/dist/learning/daily-log.js +2 -1
  425. package/dist/learning/experience-capture-middleware.d.ts +22 -0
  426. package/dist/learning/experience-capture-middleware.js +35 -0
  427. package/dist/learning/learnable-result.d.ts +16 -0
  428. package/dist/learning/learnable-result.js +24 -0
  429. package/dist/learning/pattern-mutation-error.d.ts +8 -0
  430. package/dist/learning/pattern-mutation-error.js +12 -0
  431. package/dist/learning/qe-reasoning-bank.d.ts +10 -0
  432. package/dist/learning/qe-reasoning-bank.js +50 -1
  433. package/dist/learning/rvf-reconcile.d.ts +39 -0
  434. package/dist/learning/rvf-reconcile.js +40 -0
  435. package/dist/learning/sqlite-persistence.d.ts +14 -0
  436. package/dist/learning/sqlite-persistence.js +36 -0
  437. package/dist/mcp/bundle.js +524 -507
  438. package/dist/mcp/handlers/domain-handler-configs.d.ts +49 -2
  439. package/dist/mcp/handlers/domain-handler-configs.js +79 -7
  440. package/dist/mcp/handlers/handler-factory.js +43 -14
  441. package/dist/mcp/handlers/wrapped-domain-handlers.js +7 -1
  442. package/dist/mcp/protocol-server.js +30 -4
  443. package/dist/mcp/tool-cache-scope.d.ts +31 -0
  444. package/dist/mcp/tool-cache-scope.js +71 -0
  445. package/dist/mcp/tools/code-intelligence/analyze.js +5 -3
  446. package/dist/mcp/tools/coverage-analysis/index.js +1 -0
  447. package/dist/mcp/types.d.ts +10 -0
  448. package/dist/optimization/session-cache.d.ts +19 -1
  449. package/dist/optimization/session-cache.js +36 -2
  450. package/dist/plugins/cache.js +2 -1
  451. package/dist/plugins/sources/github.js +2 -1
  452. package/dist/plugins/sources/npm.js +2 -1
  453. package/dist/shared/aqe-managed-dirs.d.ts +24 -0
  454. package/dist/shared/aqe-managed-dirs.js +56 -0
  455. package/dist/shared/events/domain-events.d.ts +20 -3
  456. package/dist/shared/events/domain-events.js +4 -0
  457. package/dist/shared/http/http-client.d.ts +6 -0
  458. package/dist/shared/http/http-client.js +13 -15
  459. package/dist/shared/io/file-reader.d.ts +26 -0
  460. package/dist/shared/io/file-reader.js +111 -17
  461. package/dist/shared/llm/providers/response-deadline.d.ts +7 -2
  462. package/dist/shared/llm/providers/response-deadline.js +17 -5
  463. package/dist/shared/metrics/code-metrics.d.ts +24 -0
  464. package/dist/shared/metrics/code-metrics.js +93 -6
  465. package/dist/shared/metrics/index.d.ts +1 -1
  466. package/dist/workers/interfaces.d.ts +9 -1
  467. package/dist/workers/quality-daemon/coverage-delta.d.ts +4 -3
  468. package/dist/workers/quality-daemon/coverage-delta.js +13 -6
  469. package/dist/workers/quality-daemon/index.js +6 -5
  470. package/dist/workers/quality-daemon/notification-service.js +3 -3
  471. package/dist/workers/quality-daemon/persistent-memory.d.ts +2 -2
  472. package/dist/workers/quality-daemon/persistent-memory.js +2 -2
  473. package/dist/workers/worker-manager.js +5 -1
  474. package/dist/workers/workers/coverage-tracker.js +69 -33
  475. package/dist/workers/workers/regression-monitor.d.ts +18 -1
  476. package/dist/workers/workers/regression-monitor.js +276 -117
  477. package/package.json +1 -1
  478. package/dist/cli/chunks/adapter-T54G3TBK.js +0 -2
  479. package/dist/cli/chunks/aqe-learning-engine-HLCJJ3JM.js +0 -2
  480. package/dist/cli/chunks/base-VLD755UU.js +0 -2
  481. package/dist/cli/chunks/browser-workflow-6M6VLWRF.js +0 -2
  482. package/dist/cli/chunks/chunk-5XXLWJU7.js +0 -2
  483. package/dist/cli/chunks/chunk-AHVN3UQZ.js +0 -4
  484. package/dist/cli/chunks/chunk-AOKSLWON.js +0 -742
  485. package/dist/cli/chunks/chunk-CQ3WSTJ2.js +0 -16
  486. package/dist/cli/chunks/chunk-LY53L6NH.js +0 -2
  487. package/dist/cli/chunks/chunk-O7TMY4GS.js +0 -2
  488. package/dist/cli/chunks/chunk-QIAX3JJB.js +0 -3
  489. package/dist/cli/chunks/chunk-RJMBHZYL.js +0 -2
  490. package/dist/cli/chunks/chunk-UORI2CZ4.js +0 -2
  491. package/dist/cli/chunks/chunk-V3NZ23X6.js +0 -2
  492. package/dist/cli/chunks/chunk-WI5AEB7Q.js +0 -2
  493. package/dist/cli/chunks/chunk-XKIFNKHV.js +0 -2
  494. package/dist/cli/chunks/chunk-ZAOQIVHG.js +0 -5
  495. package/dist/cli/chunks/chunk-ZF5JTQEE.js +0 -4
  496. package/dist/cli/chunks/ci-NGMGB43T.js +0 -82
  497. package/dist/cli/chunks/client-FUHNNK5O.js +0 -2
  498. package/dist/cli/chunks/core-handlers-F7TLX4LM.js +0 -2
  499. package/dist/cli/chunks/coverage-IVKDV236.js +0 -27
  500. package/dist/cli/chunks/cross-domain-router-EGWPY67O.js +0 -2
  501. package/dist/cli/chunks/daemon-IPTOSCHM.js +0 -10
  502. package/dist/cli/chunks/dream-V4QN6OF5.js +0 -2
  503. package/dist/cli/chunks/embed-and-insert-pattern-65H4XHWR.js +0 -3
  504. package/dist/cli/chunks/experience-capture-middleware-4JXVF5PL.js +0 -40
  505. package/dist/cli/chunks/file-discovery-R73BYEXB.js +0 -2
  506. package/dist/cli/chunks/heartbeat-scheduler-3N3L6CRM.js +0 -2
  507. package/dist/cli/chunks/hnsw-adapter-2BXJYDXI.js +0 -2
  508. package/dist/cli/chunks/hnsw-index-2DLI5OVO.js +0 -2
  509. package/dist/cli/chunks/hybrid-backend-OW4J65YH.js +0 -2
  510. package/dist/cli/chunks/impact-analyzer-ZH5I2RG6.js +0 -2
  511. package/dist/cli/chunks/init-handler-HETPWU67.js +0 -86
  512. package/dist/cli/chunks/init-wizard-NIKM3ZOK.js +0 -2
  513. package/dist/cli/chunks/kernel-2EOSVM6X.js +0 -2
  514. package/dist/cli/chunks/knowledge-graph-D3BPWNNO.js +0 -2
  515. package/dist/cli/chunks/learning-QLVRZNHT.js +0 -122
  516. package/dist/cli/chunks/llm-router-service-TJPPZFUN.js +0 -2
  517. package/dist/cli/chunks/load-test-RFT7IDOL.js +0 -2
  518. package/dist/cli/chunks/memory-backend-O2O4CFKZ.js +0 -2
  519. package/dist/cli/chunks/memory-handlers-DAEGUDBD.js +0 -2
  520. package/dist/cli/chunks/orchestrator-ORGJ6VAA.js +0 -452
  521. package/dist/cli/chunks/pattern-null-store-TUBNXS34.js +0 -2
  522. package/dist/cli/chunks/plugin-ZVLFNZZ4.js +0 -27
  523. package/dist/cli/chunks/project-root-UCHQH3QL.js +0 -2
  524. package/dist/cli/chunks/protocol-executor-6FQTTO3Y.js +0 -2
  525. package/dist/cli/chunks/qe-reasoning-bank-TKPND56C.js +0 -2
  526. package/dist/cli/chunks/quality-46AK277P.js +0 -7
  527. package/dist/cli/chunks/queen-coordinator-DWMXLPJG.js +0 -2
  528. package/dist/cli/chunks/real-embeddings-56MNGJGJ.js +0 -2
  529. package/dist/cli/chunks/router-QIMUYRCC.js +0 -2
  530. package/dist/cli/chunks/routing-feedback-4OH5ZNF4.js +0 -2
  531. package/dist/cli/chunks/rvf-dual-writer-S6JBZL54.js +0 -2
  532. package/dist/cli/chunks/rvf-migration-adapter-TSGMLMYR.js +0 -2
  533. package/dist/cli/chunks/rvf-migration-coordinator-V74MVBHS.js +0 -2
  534. package/dist/cli/chunks/rvf-native-adapter-Z7QOW47S.js +0 -2
  535. package/dist/cli/chunks/safe-db-JLOVBJNC.js +0 -2
  536. package/dist/cli/chunks/schedule-IM6XOBGR.js +0 -2
  537. package/dist/cli/chunks/scheduler-XL2SVVK5.js +0 -2
  538. package/dist/cli/chunks/shared-rvf-adapter-2LB56LP4.js +0 -2
  539. package/dist/cli/chunks/sqlite-persistence-LWMIIC4U.js +0 -2
  540. package/dist/cli/chunks/sync-SNAXAVCN.js +0 -2
  541. package/dist/cli/chunks/token-bootstrap-UGRH7OPU.js +0 -2
  542. package/dist/cli/chunks/unified-memory-F5IJY7W7.js +0 -2
  543. package/dist/cli/chunks/unified-memory-hnsw-C3WAMAQL.js +0 -2
  544. package/dist/cli/chunks/unified-persistence-EWXXOTCB.js +0 -2
  545. package/dist/cli/chunks/visual-security-CKLTAIAB.js +0 -2
  546. package/dist/cli/chunks/witness-chain-Z6LWFEZS.js +0 -2
  547. package/dist/cli/chunks/witness-chain-repair-5QWRFVUK.js +0 -2
  548. package/dist/cli/chunks/witness-key-manager-FYZXQTLJ.js +0 -2
  549. package/dist/cli/chunks/workflow-orchestrator-OFTAR2NA.js +0 -2
  550. package/dist/cli/chunks/wrappers-COU73OQ6.js +0 -2
  551. /package/.claude/skills/qe-court/evals/fixtures/seeded-mutant-delivery/{budget.test.ts → budget-tests.ts.fixture} +0 -0
  552. /package/.claude/skills/qe-court/evals/fixtures/seeded-mutant-delivery/{budget.ts → budget.ts.fixture} +0 -0
  553. /package/.claude/skills/testability-scoring/resources/templates/{testability-scoring.spec.template.js → testability-scoring-spec.template.js} +0 -0
  554. /package/assets/skills/qe-court/evals/fixtures/seeded-mutant-delivery/{budget.test.ts → budget-tests.ts.fixture} +0 -0
  555. /package/assets/skills/qe-court/evals/fixtures/seeded-mutant-delivery/{budget.ts → budget.ts.fixture} +0 -0
  556. /package/assets/skills/testability-scoring/resources/templates/{testability-scoring.spec.template.js → testability-scoring-spec.template.js} +0 -0
@@ -4,143 +4,159 @@
4
4
  * Extracted from task-executor.ts registerHandlers().
5
5
  * Covers: analyze-coverage
6
6
  */
7
- import * as fs from 'fs/promises';
8
- import * as path from 'path';
9
7
  import { ok, err } from '../../shared/types/index.js';
10
8
  import { toError } from '../../shared/error-utils.js';
11
- import { safeJsonParse } from '../../shared/safe-json.js';
12
- import { loadCoverageData } from './handler-utils.js';
13
- import { buildEstimatedCoverage, collectRustCoverage, isCoverageExecDisabled, isRustProject, isTestPath, } from './coverage-collection.js';
9
+ import { buildEstimatedCoverage, collectRustCoverage, findCargoRoot, isCoverageExecDisabled, isRustProject, } from './coverage-collection.js';
10
+ import { describeNoData, evaluateCoverageForTarget, isUnmeasured, resolveExistingCoverage, scopeCoverageToTarget, reconcileRecommendations, thresholdVerdict, } from './coverage-target.js';
11
+ import { randomUUID } from 'crypto';
12
+ import { describeRunFailure, runJsCoverage, testRunStatus } from './coverage-runner.js';
13
+ import { collectedMetrics } from '../../domains/coverage-analysis/collected-metrics.js';
14
14
  /**
15
- * Try to produce a JS/TS coverage report by running the project's test runner.
16
- * Returns true if the runner completed (which does not guarantee a report was
17
- * written — the caller re-checks disk).
15
+ * How long the project's test runner may take before its process tree is
16
+ * killed. `AQE_COVERAGE_TIMEOUT_MS` overrides the 120s default.
18
17
  */
19
- async function tryRunJsCoverage(targetPath) {
20
- // Running the project's test suite executes code from the analyzed repository
21
- // (the tests themselves, plus npm lifecycle scripts via npx). Honor the
22
- // opt-out before doing that.
23
- if (isCoverageExecDisabled())
24
- return false;
25
- try {
26
- const { execSync } = await import('child_process');
27
- let coverageCmd = 'npx vitest run --coverage --reporter=json 2>/dev/null';
28
- try {
29
- const pkgContent = await fs.readFile(path.join(targetPath, 'package.json'), 'utf-8');
30
- const pkg = safeJsonParse(pkgContent);
31
- const deps = {
32
- ...(pkg.devDependencies || {}),
33
- ...(pkg.dependencies || {}),
34
- };
35
- if (deps['jest'] || deps['@jest/core']) {
36
- coverageCmd = 'npx jest --coverage --json 2>/dev/null';
37
- }
38
- else if (deps['mocha'] || deps['nyc']) {
39
- coverageCmd = 'npx nyc mocha 2>/dev/null';
40
- }
41
- // vitest is the default — covers vitest, @vitest/coverage-v8, etc.
42
- }
43
- catch {
44
- // No package.json — use default vitest
45
- }
46
- execSync(coverageCmd, {
47
- cwd: targetPath,
48
- timeout: 120000,
49
- encoding: 'utf-8',
50
- stdio: ['pipe', 'pipe', 'pipe'],
51
- });
52
- return true;
53
- }
54
- catch {
55
- // Test runner failed or not available.
56
- return false;
57
- }
18
+ function coverageTimeoutMs(env = process.env) {
19
+ const parsed = Number.parseInt(env.AQE_COVERAGE_TIMEOUT_MS ?? '', 10);
20
+ return Number.isFinite(parsed) && parsed > 0 ? parsed : 120000;
58
21
  }
59
- /**
60
- * Narrow an instrumented report to production files only, recomputing the
61
- * aggregate from what survives.
62
- *
63
- * Returns `null` when the report contains no production files at all — the
64
- * caller must NOT fall back to the unfiltered set, because that reports the test
65
- * files' own coverage as the project's (#569's third contradiction).
66
- */
67
- function productionOnly(report, targetPath) {
68
- const files = report.files.filter(f => !isTestPath(f.path, targetPath));
69
- if (files.length === 0)
70
- return null;
71
- // Recompute rather than carrying the original summary: it was computed over
72
- // the unfiltered set, so keeping it would blend test-file coverage into the
73
- // production headline figure.
22
+ /** Aggregate a file list into whole-number percentages. */
23
+ function recomputeSummary(files) {
74
24
  const sum = (pick) => files.reduce((acc, f) => acc + pick(f), 0);
75
- const pct = (covered, total) => total > 0 ? Math.round((covered / total) * 100) : 0;
25
+ const pct = (covered, total) => (total > 0 ? Math.round((covered / total) * 100) : 0);
76
26
  const totalLines = sum(f => f.lines.total);
77
27
  const coveredLines = sum(f => f.lines.covered);
78
- const branchDataCollected = files.some(f => f.branches.total > 0);
79
- const functionDataCollected = files.some(f => f.functions.total > 0);
28
+ // #1012: statements are statements (lcov carries its line figures there).
29
+ const totalStatements = sum(f => f.statements.total);
80
30
  return {
81
- data: {
82
- files,
83
- summary: {
84
- line: pct(coveredLines, totalLines),
85
- branch: pct(sum(f => f.branches.covered), sum(f => f.branches.total)),
86
- function: pct(sum(f => f.functions.covered), sum(f => f.functions.total)),
87
- statement: pct(coveredLines, totalLines),
88
- files: files.length,
89
- },
90
- },
31
+ line: pct(coveredLines, totalLines),
32
+ branch: pct(sum(f => f.branches.covered), sum(f => f.branches.total)),
33
+ function: pct(sum(f => f.functions.covered), sum(f => f.functions.total)),
34
+ statement: totalStatements > 0
35
+ ? pct(sum(f => f.statements.covered), totalStatements)
36
+ : pct(coveredLines, totalLines),
37
+ files: files.length,
38
+ };
39
+ }
40
+ /** An instrumented verdict as a collected result with honest provenance. */
41
+ function instrumented(files) {
42
+ return {
43
+ data: { files, summary: recomputeSummary(files) },
91
44
  provenance: {
92
45
  method: 'instrumented-report',
93
46
  estimated: false,
94
- branchDataCollected,
95
- functionDataCollected,
47
+ branchDataCollected: files.some(f => f.branches.total > 0),
48
+ functionDataCollected: files.some(f => f.functions.total > 0),
96
49
  notes: [],
97
50
  },
98
51
  };
99
52
  }
53
+ function fromEvaluation(evaluation, ranTests, projectRoot) {
54
+ return evaluation.status === 'measured'
55
+ ? { collected: instrumented(evaluation.files), ranTests, projectRoot }
56
+ : { collected: null, ranTests, noData: evaluation.reason, projectRoot };
57
+ }
100
58
  /**
101
59
  * Collect coverage for a target, preferring real measurement over estimation
102
60
  * and always reporting which one happened (#569).
103
61
  *
62
+ * The target may be the project root, a subfolder or file inside it, or an
63
+ * existing coverage report (#995). Tooling always runs from the project root
64
+ * and the result is scoped back down to the target. The decision about what
65
+ * a report says for a target is shared with the CLI (`resolveExistingCoverage`
66
+ * / `evaluateCoverageForTarget`).
67
+ *
104
68
  * Cascade:
105
- * 1. an instrumented report already on disk (istanbul/lcov/cobertura)
69
+ * 0. the target IS a coverage report — parse it, run nothing
70
+ * 1. an instrumented report already on disk at the project root
106
71
  * 2. language-specific instrumentation we can run — `cargo llvm-cov` for Rust,
107
- * the project's test runner for JS/TS
72
+ * the project's test runner for JS/TS — writing to a temp dir
108
73
  * 3. static estimation, explicitly labelled `estimated: true`
109
74
  */
110
75
  async function collectCoverage(targetPath) {
111
- const existing = await loadCoverageData(targetPath);
112
- if (existing) {
113
- const fromReport = productionOnly(existing, targetPath);
114
- // A report whose only entries are test files yields NO production coverage.
115
- // Falling back to the unfiltered set here would report the test files'
116
- // own coverage as the project's — recreating #569's third contradiction
117
- // (`tests/verifier_matrix.rs` analysed at 79.2% as if it were a target).
118
- if (!fromReport)
119
- return { collected: null, ranTests: false, testOnlyReport: true };
120
- return { collected: fromReport, ranTests: false };
76
+ const existing = await resolveExistingCoverage(targetPath);
77
+ if (existing.status === 'target-missing') {
78
+ return { collected: null, ranTests: false, noData: 'target-missing', projectRoot: null };
79
+ }
80
+ if (existing.status === 'evaluated') {
81
+ return fromEvaluation(existing.evaluation, false, existing.projectRoot);
121
82
  }
83
+ const { target, projectRoot } = existing;
122
84
  // #569 work item 1: delegate to real instrumentation where available.
123
- const rustProject = isRustProject(targetPath);
124
- if (rustProject) {
125
- const rust = await collectRustCoverage(targetPath);
126
- if (rust)
127
- return { collected: rust, ranTests: true };
85
+ if (isRustProject(target)) {
86
+ const rust = await collectRustCoverage(target);
87
+ if (rust) {
88
+ // cargo ran from the crate root; scope its crate-wide output to the target.
89
+ const crateRoot = findCargoRoot(target) ?? projectRoot;
90
+ const scoped = scopeCoverageToTarget(rust.data, crateRoot, target);
91
+ if (scoped.length === 0) {
92
+ return { collected: null, ranTests: true, noData: 'target-not-covered', projectRoot: crateRoot };
93
+ }
94
+ const collected = scoped.length === rust.data.files.length
95
+ ? rust
96
+ : { data: { files: scoped, summary: recomputeSummary(scoped) }, provenance: rust.provenance };
97
+ return { collected, ranTests: true, projectRoot: crateRoot };
98
+ }
128
99
  // This target is a Rust crate. Do not continue into the JS/TS runner:
129
100
  // `npx vitest --coverage` can still be available through the parent
130
101
  // process PATH and will write an empty report even though the crate has no
131
102
  // JavaScript tests. Treating that artifact as coverage hides the intended
132
103
  // Rust static-estimation fallback and mislabels the result.
133
- return { collected: buildEstimatedCoverage(targetPath), ranTests: false };
104
+ return { collected: buildEstimatedCoverage(target), ranTests: false, projectRoot };
134
105
  }
135
- const ranTests = await tryRunJsCoverage(targetPath);
136
- const afterRun = await loadCoverageData(targetPath);
137
- if (afterRun) {
138
- const fromRun = productionOnly(afterRun, targetPath);
139
- if (!fromRun)
140
- return { collected: null, ranTests, testOnlyReport: true };
141
- return { collected: fromRun, ranTests };
106
+ // Running the project's test suite executes code from the analyzed repository
107
+ // (the tests themselves, plus npm lifecycle scripts via npx). Honor the
108
+ // opt-out before doing that.
109
+ if (isCoverageExecDisabled()) {
110
+ return { collected: buildEstimatedCoverage(target), ranTests: false, projectRoot };
142
111
  }
143
- return { collected: buildEstimatedCoverage(targetPath), ranTests };
112
+ const run = await runJsCoverage(projectRoot, { timeoutMs: coverageTimeoutMs() });
113
+ // An EMPTY report (`{}`) from a run that reported its tests means "the run
114
+ // instrumented nothing under the target" → unmeasured, never an estimate
115
+ // (#995 review BL2). An empty report from a run that crashed before
116
+ // reporting any tests is a crash, handled below.
117
+ const crashedEmpty = run.data !== null && run.data.files.length === 0 &&
118
+ run.numTotalTests === null && !run.exitedCleanly;
119
+ if ((run.data && !crashedEmpty) || run.numTotalTests === 0) {
120
+ const evaluation = run.data
121
+ ? evaluateCoverageForTarget(run.data, projectRoot, target, { numTotalTests: run.numTotalTests })
122
+ : { status: 'no-data', reason: 'no-tests-ran' };
123
+ const result = fromEvaluation(evaluation, run.exitedCleanly || run.data !== null, projectRoot);
124
+ if (result.collected) {
125
+ // #1027 N4/NB2: a run with failing tests still measured coverage; the
126
+ // failure is decided from the runner's counts, not its exit code.
127
+ result.runStatus = testRunStatus(run);
128
+ // #1027 NB1: the run's own testsPassing is recorded with its coverage.
129
+ if (typeof run.numPassedTests === 'number' && typeof run.numFailedTests === 'number') {
130
+ result.testRun = {
131
+ runId: randomUUID(), passed: run.numPassedTests, failed: run.numFailedTests, skipped: run.numPendingTests ?? 0,
132
+ };
133
+ }
134
+ }
135
+ return result;
136
+ }
137
+ // No report at all: say exactly what happened to the run (not installed,
138
+ // timed out, crashed with stderr), then fall back to a labelled estimate.
139
+ const estimate = buildEstimatedCoverage(target);
140
+ const runNote = describeRunFailure(run, projectRoot);
141
+ if (estimate) {
142
+ estimate.provenance.notes = [
143
+ `${runNote} These numbers are a STATIC ESTIMATE derived from source shape — ` +
144
+ 'not measured coverage, and must not be reported as such.',
145
+ ...estimate.provenance.notes.filter(n => !/^No instrumentation ran/.test(n)),
146
+ ];
147
+ }
148
+ return {
149
+ collected: estimate, ranTests: run.exitedCleanly, projectRoot,
150
+ notes: estimate ? [] : [runNote],
151
+ };
152
+ }
153
+ /** Caller-facing explanation for a result with no coverage figures. */
154
+ function noDataWarning(reason, ranTests, targetPath, projectRoot) {
155
+ if (reason)
156
+ return describeNoData(reason, targetPath, projectRoot);
157
+ return ranTests
158
+ ? 'Tests ran but no coverage output was generated. Ensure a coverage provider is configured (e.g., @vitest/coverage-v8, istanbul).'
159
+ : 'No coverage data found and could not run tests automatically. ' + estimationGuidance(targetPath);
144
160
  }
145
161
  /**
146
162
  * Build the guidance string shown when a result is an estimate rather than a
@@ -169,8 +185,13 @@ export function registerCoverageHandlers(ctx) {
169
185
  const analyzer = ctx.getCoverageAnalyzer();
170
186
  const targetPath = payload.target || process.cwd();
171
187
  const threshold = payload.threshold || 80;
172
- const { collected, ranTests, testOnlyReport } = await collectCoverage(targetPath);
188
+ const { collected, ranTests, noData, projectRoot, notes, runStatus, testRun } = await collectCoverage(targetPath);
189
+ // #995 review N5: say so plainly instead of "no coverage data found".
190
+ if (noData === 'target-missing') {
191
+ return err(new Error(describeNoData('target-missing', targetPath, null)));
192
+ }
173
193
  if (!collected) {
194
+ const unmeasured = noData !== undefined && isUnmeasured(noData);
174
195
  return ok({
175
196
  lineCoverage: null,
176
197
  branchCoverage: null,
@@ -182,22 +203,25 @@ export function registerCoverageHandlers(ctx) {
182
203
  estimated: false,
183
204
  measured: false,
184
205
  coverageMethod: 'none',
206
+ // #995(d): "no measurement exists for this target", distinct from 0%.
207
+ ...(unmeasured ? { unmeasured: true } : {}),
185
208
  algorithm: 'sublinear-O(log n)',
186
- warning: testOnlyReport
187
- ? 'The coverage report contains only test files, so there is no production ' +
188
- 'coverage to report. Coverage OF a test file is not a meaningful metric. ' +
189
- 'Check that your coverage tool is instrumenting your source directory.'
190
- : ranTests
191
- ? 'Tests ran but no coverage output was generated. Ensure a coverage provider is configured (e.g., @vitest/coverage-v8, istanbul).'
192
- : 'No coverage data found and could not run tests automatically. ' + estimationGuidance(targetPath),
209
+ warning: notes?.length ? notes.join(' ') : noDataWarning(noData, ranTests, targetPath, projectRoot),
193
210
  });
194
211
  }
195
212
  const { data: coverageData, provenance } = collected;
196
213
  // Analyze coverage using the real CoverageAnalyzerService
214
+ // #1008: the analyzer persists only measured coverage; a static estimate
215
+ // is returned below, labelled, but never stored as evidence.
197
216
  const analysisResult = await analyzer.analyze({
198
217
  coverageData,
199
218
  threshold,
200
219
  includeFileDetails: payload.detectGaps,
220
+ measured: !provenance.estimated,
221
+ // #1027 N7: per-file records use absolute keys; N4: failing-suite coverage is labelled.
222
+ ...(projectRoot ? { projectRoot } : {}),
223
+ ...(runStatus && !provenance.estimated ? { runStatus } : {}),
224
+ ...(testRun && !provenance.estimated ? { testRun } : {}),
201
225
  });
202
226
  if (!analysisResult.success) {
203
227
  return analysisResult;
@@ -227,7 +251,7 @@ export function registerCoverageHandlers(ctx) {
227
251
  }
228
252
  const round = (n) => Math.round(n * 10) / 10;
229
253
  const pct = (covered, total) => total > 0 ? Math.round((covered / total) * 1000) / 10 : null;
230
- const warnings = [...provenance.notes];
254
+ const warnings = [...provenance.notes, ...(notes ?? [])];
231
255
  if (provenance.estimated)
232
256
  warnings.push(estimationGuidance(targetPath));
233
257
  // #569: the analyzer generates recommendations from the summary numbers.
@@ -236,20 +260,22 @@ export function registerCoverageHandlers(ctx) {
236
260
  // significantly lower than line coverage", "Function coverage is below
237
261
  // 70%") is a statement about a metric nobody measured. Drop it rather
238
262
  // than send a developer to fix a number that doesn't exist.
239
- const recommendations = report.recommendations.filter(rec => {
240
- if (!provenance.branchDataCollected && /branch coverage/i.test(rec))
241
- return false;
242
- if (!provenance.functionDataCollected && /function coverage/i.test(rec))
243
- return false;
244
- return true;
245
- });
263
+ // #995 NB5/NB-A: the verdict and the shortfall advice come from the same
264
+ // collected-metrics computation (shared with the CLI), so they can't disagree.
265
+ // #1027 N7: lcov / Cobertura carry no statement data — n/a, out of the verdict.
266
+ const statementCollected = provenance.estimated || collectedMetrics(coverageData.files).statement;
267
+ const metricsCollected = {
268
+ branch: provenance.branchDataCollected, function: provenance.functionDataCollected, statement: statementCollected,
269
+ };
270
+ const verdict = thresholdVerdict(report.summary, threshold, metricsCollected);
271
+ const recommendations = reconcileRecommendations(report.recommendations, verdict, threshold, metricsCollected);
246
272
  return ok({
247
273
  lineCoverage: round(report.summary.line),
248
274
  // #569 work item 4: never report a branch percentage — least of all
249
275
  // 100% — when no branch data was collected.
250
276
  branchCoverage: provenance.branchDataCollected ? round(report.summary.branch) : null,
251
277
  functionCoverage: provenance.functionDataCollected ? round(report.summary.function) : null,
252
- statementCoverage: round(report.summary.statement),
278
+ statementCoverage: statementCollected ? round(report.summary.statement) : null,
253
279
  totalFiles: report.summary.files,
254
280
  coverageByFile: coverageData.files.map(f => ({
255
281
  file: f.path,
@@ -258,7 +284,8 @@ export function registerCoverageHandlers(ctx) {
258
284
  functionCoverage: provenance.functionDataCollected ? pct(f.functions.covered, f.functions.total) : null,
259
285
  })),
260
286
  gaps,
261
- meetsThreshold: report.meetsThreshold,
287
+ // NB5: judged only on the metrics that were collected (shared with the CLI).
288
+ meetsThreshold: verdict.meetsThreshold,
262
289
  delta: report.delta,
263
290
  recommendations,
264
291
  algorithm: 'sublinear-O(log n)',
@@ -268,6 +295,8 @@ export function registerCoverageHandlers(ctx) {
268
295
  coverageMethod: provenance.method,
269
296
  branchDataCollected: provenance.branchDataCollected,
270
297
  functionDataCollected: provenance.functionDataCollected,
298
+ statementDataCollected: statementCollected,
299
+ ...(runStatus && !provenance.estimated ? { runStatus } : {}),
271
300
  ...(warnings.length > 0 ? { warning: warnings.join(' ') } : {}),
272
301
  });
273
302
  }
@@ -0,0 +1,143 @@
1
+ /**
2
+ * Run a JS/TS project's test runner with coverage — safely (issue #995).
3
+ *
4
+ * Properties, each learned the hard way:
5
+ *
6
+ * 1. **Run from the project root, write to a private temp dir.** The coverage
7
+ * report and the runner's JSON result go to `reportDir`, never into the
8
+ * project tree (#995 wrote `src/coverage/`). The result file is set with
9
+ * plain `--outputFile=` — vitest ignores `--outputFile.json=` when the
10
+ * user's config sets `outputFile` as a string.
11
+ * 2. **No shell, no download.** The runner's own JS entry point is resolved
12
+ * from the project's `node_modules` and started with `process.execPath`.
13
+ * Arguments are an array, so `$(…)`, spaces, `& ^ %` in a path are data on
14
+ * every platform. A runner that isn't installed is reported, never fetched
15
+ * (`npx` would silently download one).
16
+ * 3. **Kill the whole process tree.** Runner → workers is several levels deep.
17
+ * The child is started in its own process group (POSIX) and the group is
18
+ * killed on timeout (`taskkill /T /F` on Windows).
19
+ * 4. **Die with the host.** Every live run is registered; a synchronous
20
+ * `process.on('exit')` hook kills each group and removes its temp dir. That
21
+ * covers every path that ends in `process.exit()` or a natural exit — the
22
+ * MCP server's shutdown on SIGTERM/SIGINT/stdin EOF routes there. It cannot
23
+ * cover SIGKILL of the host (or a signal with no handler installed): no
24
+ * code runs in that case, and the group is left to its own timeout-less
25
+ * fate. Hosts should shut down via a handled signal.
26
+ */
27
+ import type { CoverageData } from '../../domains/coverage-analysis/interfaces';
28
+ export type JsRunnerName = 'vitest' | 'jest' | 'nyc';
29
+ export interface JsCoverageInvocation {
30
+ runner: JsRunnerName;
31
+ /** `process.execPath`, or null when the runner is not installed. */
32
+ command: string | null;
33
+ /** `[<runner JS entry>, ...runner args]`. */
34
+ args: string[];
35
+ /** Where the runner writes its own JSON result (tests run / passed), if supported. */
36
+ resultsFile: string | null;
37
+ }
38
+ export interface JsCoverageRun {
39
+ runner: JsRunnerName;
40
+ /** The runner package was not found in the project's node_modules. Nothing ran. */
41
+ missing: boolean;
42
+ exitCode: number | null;
43
+ exitedCleanly: boolean;
44
+ timedOut: boolean;
45
+ timeoutMs: number;
46
+ /**
47
+ * Parsed istanbul report, or null when none was written. A report that was
48
+ * written but lists no files is `{ files: [] }` — NOT null: "the run covered
49
+ * nothing" is different from "the run produced no report".
50
+ */
51
+ data: CoverageData | null;
52
+ /**
53
+ * Number of tests the runner reports having run, from its own JSON result.
54
+ * `null` when the runner gives no machine-readable result (nyc) or it could
55
+ * not be read — "unknown", which callers must not treat as 0.
56
+ */
57
+ numTotalTests: number | null;
58
+ /**
59
+ * Per-outcome counts from the runner's JSON result (#1027 NB1/NB2), null
60
+ * when unknown. A failing suite is decided from these, not the exit code:
61
+ * vitest also exits non-zero for a coverage-threshold failure.
62
+ */
63
+ numPassedTests?: number | null;
64
+ numFailedTests?: number | null;
65
+ numPendingTests?: number | null;
66
+ numFailedTestSuites?: number | null;
67
+ /** The runner's first error line plus the last ~2 KB of its stderr, for diagnosing a crash. */
68
+ stderrTail: string;
69
+ }
70
+ /**
71
+ * Outcome of a coverage run's tests (#1027 NB2): 'failed' when the runner's
72
+ * own result reports a failed test or test suite, 'passed' when it reports
73
+ * none — whatever the exit code (a coverage-threshold failure exits 1 with
74
+ * every test passing). Without counts (nyc), the exit code decides.
75
+ */
76
+ export declare function testRunStatus(run: JsCoverageRun): 'passed' | 'failed';
77
+ /**
78
+ * Summarise a runner's stderr for a caller: the FIRST error-looking line (or
79
+ * the first ~512 bytes) plus the last ~2 KB (#995 review NB-C). A tail alone
80
+ * loses the cause when a long stack follows it — a vitest config syntax error
81
+ * prints `[PARSE_ERROR] …` first and then kilobytes of frames.
82
+ */
83
+ export declare function summarizeStderr(head: string, tail: string, totalBytes: number): string;
84
+ /**
85
+ * Find an installed package's bin script, walking up `node_modules` from the
86
+ * project root (hoisted monorepo installs live above the package).
87
+ */
88
+ export declare function findPackageBin(projectRoot: string, pkg: string, binName?: string, maxDepth?: number): string | null;
89
+ /**
90
+ * Every `node_modules/.bin` from the project up to the workspace root,
91
+ * nearest first. Runners that shell out to sibling tools (nyc → mocha) need
92
+ * the hoisted ones too (#1012).
93
+ */
94
+ export declare function runnerBinDirs(projectRoot: string): string[];
95
+ /**
96
+ * Pick the runner and its argv. No shell is involved: `command` is the Node
97
+ * binary and `args[0]` the runner's JS entry, so paths are passed verbatim.
98
+ */
99
+ export declare function buildJsCoverageInvocation(projectRoot: string, reportDir: string): JsCoverageInvocation;
100
+ /**
101
+ * Synchronously kill every live coverage run and remove its temp dir. Runs from
102
+ * `process.on('exit')`, where only synchronous work is possible.
103
+ */
104
+ export declare function killAllLiveRunsSync(): void;
105
+ /** Number of runs currently registered (for tests and diagnostics). */
106
+ export declare function liveRunCount(): number;
107
+ export interface ProcessTreeResult {
108
+ exitCode: number | null;
109
+ timedOut: boolean;
110
+ spawnError: boolean;
111
+ pid: number | undefined;
112
+ stderrTail: string;
113
+ }
114
+ /**
115
+ * Spawn `command args` in `cwd` (no shell) as the leader of a new process
116
+ * group, wait for it, and on timeout kill the entire group. Resolves only once
117
+ * no process of the group remains (bounded), so the caller can safely delete
118
+ * its temp dir. While running, the group and `cleanupDir` are registered with
119
+ * the exit hook so they never outlive the host process.
120
+ */
121
+ export declare function runProcessTree(command: string, args: string[], options: {
122
+ cwd: string;
123
+ timeoutMs: number;
124
+ graceMs?: number;
125
+ cleanupDir?: string;
126
+ env?: NodeJS.ProcessEnv;
127
+ }): Promise<ProcessTreeResult>;
128
+ /**
129
+ * Run the project's test runner with coverage from `projectRoot`.
130
+ *
131
+ * Everything the runner writes goes to a fresh temp dir that is removed before
132
+ * this returns — after the whole process group is gone — or by the exit hook if
133
+ * the host exits first.
134
+ */
135
+ export declare function runJsCoverage(projectRoot: string, options?: {
136
+ timeoutMs?: number;
137
+ }): Promise<JsCoverageRun>;
138
+ /**
139
+ * One-line, caller-facing explanation of why a run produced no usable report.
140
+ * Never "No instrumentation ran" when the runner did run and failed.
141
+ */
142
+ export declare function describeRunFailure(run: JsCoverageRun, projectRoot: string): string;
143
+ //# sourceMappingURL=coverage-runner.d.ts.map