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
@@ -112,12 +112,17 @@ export class PersistentScheduler {
112
112
  }
113
113
  try {
114
114
  const content = fs.readFileSync(this.schedulesPath, 'utf-8');
115
- const data = this.parseSchedulesFile(content);
115
+ const { file: data, skipped } = this.parseSchedulesFile(content);
116
+ if (skipped.length > 0) {
117
+ console.warn(`[PersistentScheduler] Skipped ${skipped.length} malformed schedule ` +
118
+ `entries in ${this.schedulesPath} (not an object, no id, or duplicate id)`);
119
+ }
116
120
  this.log(`Loaded ${data.schedules.length} schedules`);
117
121
  return data.schedules;
118
122
  }
119
123
  catch (error) {
120
- // Handle corrupt file - backup and recreate
124
+ // Only a genuinely unparseable file gets here (bad JSON, no schedules
125
+ // array, oversize); malformed entries are disabled or skipped (#991).
121
126
  await this.handleCorruptFile(error);
122
127
  return [];
123
128
  }
@@ -128,7 +133,7 @@ export class PersistentScheduler {
128
133
  async saveSchedule(schedule) {
129
134
  await this.initialize();
130
135
  await this.withFileLock(async () => {
131
- const schedules = await this.loadSchedulesUnsafe();
136
+ const { schedules, skipped } = this.loadForWrite();
132
137
  const existingIndex = schedules.findIndex(s => s.id === schedule.id);
133
138
  if (existingIndex >= 0) {
134
139
  schedules[existingIndex] = schedule;
@@ -138,7 +143,7 @@ export class PersistentScheduler {
138
143
  schedules.push(schedule);
139
144
  this.log(`Added schedule: ${schedule.id}`);
140
145
  }
141
- await this.writeSchedules(schedules);
146
+ await this.writeSchedules(schedules, skipped);
142
147
  });
143
148
  }
144
149
  /**
@@ -147,13 +152,13 @@ export class PersistentScheduler {
147
152
  async removeSchedule(id) {
148
153
  await this.initialize();
149
154
  await this.withFileLock(async () => {
150
- const schedules = await this.loadSchedulesUnsafe();
155
+ const { schedules, skipped } = this.loadForWrite();
151
156
  const newSchedules = schedules.filter(s => s.id !== id);
152
157
  if (newSchedules.length === schedules.length) {
153
158
  this.log(`Schedule not found: ${id}`);
154
159
  return;
155
160
  }
156
- await this.writeSchedules(newSchedules);
161
+ await this.writeSchedules(newSchedules, skipped);
157
162
  this.log(`Removed schedule: ${id}`);
158
163
  });
159
164
  }
@@ -189,15 +194,20 @@ export class PersistentScheduler {
189
194
  async markExecuted(id) {
190
195
  await this.initialize();
191
196
  await this.withFileLock(async () => {
192
- const schedules = await this.loadSchedulesUnsafe();
197
+ const { schedules, skipped } = this.loadForWrite();
193
198
  const schedule = schedules.find(s => s.id === id);
194
199
  if (!schedule) {
195
200
  throw new Error(`Schedule not found: ${id}`);
196
201
  }
197
202
  const now = new Date();
198
203
  schedule.lastRun = now.toISOString();
199
- schedule.nextRun = calculateNextRun(schedule.schedule, now).toISOString();
200
- await this.writeSchedules(schedules);
204
+ // #913: an entry disabled on load (legacy/invalid cron, missing fields)
205
+ // has no computable next run. Record the run and keep it disabled
206
+ // instead of throwing from calculateNextRun.
207
+ if (!schedule.disabledReason) {
208
+ schedule.nextRun = calculateNextRun(schedule.schedule, now).toISOString();
209
+ }
210
+ await this.writeSchedules(schedules, skipped);
201
211
  this.log(`Marked executed: ${id}, next run: ${schedule.nextRun}`);
202
212
  });
203
213
  }
@@ -207,17 +217,22 @@ export class PersistentScheduler {
207
217
  async setEnabled(id, enabled) {
208
218
  await this.initialize();
209
219
  await this.withFileLock(async () => {
210
- const schedules = await this.loadSchedulesUnsafe();
220
+ const { schedules, skipped } = this.loadForWrite();
211
221
  const schedule = schedules.find(s => s.id === id);
212
222
  if (!schedule) {
213
223
  throw new Error(`Schedule not found: ${id}`);
214
224
  }
225
+ // #913/#991: an entry disabled on load cannot run; say why instead of
226
+ // failing inside calculateNextRun (or with no cron at all).
227
+ if (enabled && schedule.disabledReason) {
228
+ throw new Error(`Cannot enable schedule ${id}: ${schedule.disabledReason}`);
229
+ }
215
230
  schedule.enabled = enabled;
216
231
  // If re-enabling, recalculate next run from now
217
232
  if (enabled) {
218
233
  schedule.nextRun = calculateNextRun(schedule.schedule, new Date()).toISOString();
219
234
  }
220
- await this.writeSchedules(schedules);
235
+ await this.writeSchedules(schedules, skipped);
221
236
  this.log(`Set enabled=${enabled}: ${id}`);
222
237
  });
223
238
  }
@@ -241,7 +256,8 @@ export class PersistentScheduler {
241
256
  async clearAll() {
242
257
  await this.initialize();
243
258
  await this.withFileLock(async () => {
244
- await this.writeSchedules([]);
259
+ const { skipped } = this.loadForWrite();
260
+ await this.writeSchedules([], skipped);
245
261
  this.log('Cleared all schedules');
246
262
  });
247
263
  }
@@ -262,19 +278,22 @@ export class PersistentScheduler {
262
278
  // Private Helper Methods
263
279
  // ============================================================================
264
280
  /**
265
- * Load schedules without acquiring lock (for use within locked context)
281
+ * Load schedules for a locked read-modify-write. A genuinely unparseable
282
+ * file is backed up (not removed) first, so the write that follows cannot
283
+ * silently replace it with fewer schedules.
266
284
  */
267
- async loadSchedulesUnsafe() {
285
+ loadForWrite() {
268
286
  if (!fs.existsSync(this.schedulesPath)) {
269
- return [];
287
+ return { schedules: [], skipped: [] };
270
288
  }
271
289
  try {
272
290
  const content = fs.readFileSync(this.schedulesPath, 'utf-8');
273
- const data = this.parseSchedulesFile(content);
274
- return data.schedules;
291
+ const { file, skipped } = this.parseSchedulesFile(content);
292
+ return { schedules: file.schedules, skipped };
275
293
  }
276
- catch {
277
- return [];
294
+ catch (error) {
295
+ this.backupCorruptFile(error);
296
+ return { schedules: [], skipped: [] };
278
297
  }
279
298
  }
280
299
  /**
@@ -288,32 +307,53 @@ export class PersistentScheduler {
288
307
  throw new Error(`Schedules file exceeds maximum allowed size (${MAX_SCHEDULES_FILE_SIZE / (1024 * 1024)}MB). File is ${(contentSize / (1024 * 1024)).toFixed(2)}MB.`);
289
308
  }
290
309
  const data = safeJsonParse(content);
291
- // Validate structure
292
- if (!data.schedules || !Array.isArray(data.schedules)) {
310
+ // Validate structure: only a missing schedules array makes the file corrupt.
311
+ if (!isPlainObject(data) || !Array.isArray(data.schedules)) {
293
312
  throw new Error('Invalid schedules file: missing schedules array');
294
313
  }
295
- // Validate each schedule has required fields
296
- for (const schedule of data.schedules) {
297
- if (!schedule.id || !schedule.workflowId || !Object.prototype.hasOwnProperty.call(schedule, 'schedule')) {
298
- throw new Error(`Invalid schedule entry: missing required fields`);
314
+ // #991: validate each entry on its own. A malformed entry is disabled
315
+ // (when it can still be addressed by id) or skipped; it never makes the
316
+ // whole file "corrupt", which used to back up and REMOVE schedules.json.
317
+ const schedules = [];
318
+ const skipped = [];
319
+ const seen = new Set();
320
+ for (const entry of data.schedules) {
321
+ if (!isPlainObject(entry) || typeof entry.id !== 'string' || entry.id.length === 0 || seen.has(entry.id)) {
322
+ skipped.push(entry);
323
+ continue;
299
324
  }
300
- if (typeof schedule.schedule !== 'string' || !isValidCronExpression(schedule.schedule)) {
301
- schedule.disabledReason = `Invalid cron expression: ${schedule.schedule}`;
325
+ const schedule = entry;
326
+ seen.add(schedule.id);
327
+ const reason = scheduleDisabledReason(entry);
328
+ if (reason) {
329
+ schedule.disabledReason = reason;
302
330
  if (schedule.enabled) {
303
- console.warn(`[PersistentScheduler] Disabled schedule ${schedule.id}: ${schedule.disabledReason}`);
331
+ console.warn(`[PersistentScheduler] Disabled schedule ${schedule.id}: ${reason}`);
304
332
  }
305
333
  schedule.enabled = false;
306
334
  }
307
335
  else {
308
336
  delete schedule.disabledReason;
309
337
  }
338
+ schedules.push(schedule);
310
339
  }
311
- return data;
340
+ return { file: { ...data, schedules }, skipped };
312
341
  }
313
342
  /**
314
343
  * Write schedules to disk
315
344
  */
316
- async writeSchedules(schedules) {
345
+ async writeSchedules(schedules, skipped = []) {
346
+ // #991: entries skipped on load are not written back; keep a copy next to
347
+ // the file first so nothing a user stored is lost silently.
348
+ if (skipped.length > 0) {
349
+ const quarantinePath = `${this.schedulesPath}.quarantine.${Date.now()}.json`;
350
+ fs.writeFileSync(quarantinePath, JSON.stringify({
351
+ quarantinedAt: new Date().toISOString(),
352
+ reason: 'Malformed schedule entries (not an object, no id, or duplicate id)',
353
+ entries: skipped,
354
+ }, null, 2), { encoding: 'utf-8', flag: 'wx' });
355
+ console.warn(`[PersistentScheduler] Moved ${skipped.length} malformed schedule entries to ${quarantinePath}`);
356
+ }
317
357
  const data = {
318
358
  version: FILE_VERSION,
319
359
  updatedAt: new Date().toISOString(),
@@ -329,17 +369,7 @@ export class PersistentScheduler {
329
369
  async handleCorruptFile(error) {
330
370
  const errorMsg = toErrorMessage(error);
331
371
  this.log(`Corrupt schedules file detected: ${errorMsg}`);
332
- // Create backup of corrupt file
333
- const backupPath = `${this.schedulesPath}.corrupt.${Date.now()}`;
334
- try {
335
- if (fs.existsSync(this.schedulesPath)) {
336
- fs.copyFileSync(this.schedulesPath, backupPath);
337
- this.log(`Backed up corrupt file to: ${backupPath}`);
338
- }
339
- }
340
- catch (backupError) {
341
- this.log(`Failed to backup corrupt file: ${backupError}`);
342
- }
372
+ this.backupCorruptFile(error);
343
373
  // Remove corrupt file
344
374
  try {
345
375
  if (fs.existsSync(this.schedulesPath)) {
@@ -351,6 +381,20 @@ export class PersistentScheduler {
351
381
  this.log(`Failed to remove corrupt file: ${removeError}`);
352
382
  }
353
383
  }
384
+ /** Copy an unparseable schedules file to `.corrupt.<ts>` (left in place). */
385
+ backupCorruptFile(error) {
386
+ this.log(`Corrupt schedules file detected: ${toErrorMessage(error)}`);
387
+ const backupPath = `${this.schedulesPath}.corrupt.${Date.now()}`;
388
+ try {
389
+ if (fs.existsSync(this.schedulesPath)) {
390
+ fs.copyFileSync(this.schedulesPath, backupPath, fs.constants.COPYFILE_EXCL);
391
+ this.log(`Backed up corrupt file to: ${backupPath}`);
392
+ }
393
+ }
394
+ catch (backupError) {
395
+ this.log(`Failed to backup corrupt file: ${backupError}`);
396
+ }
397
+ }
354
398
  /**
355
399
  * Execute a function with file locking for safe concurrent access
356
400
  */
@@ -433,6 +477,28 @@ export class PersistentScheduler {
433
477
  }
434
478
  }
435
479
  // ============================================================================
480
+ // Entry validation (#991)
481
+ // ============================================================================
482
+ function isPlainObject(value) {
483
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
484
+ }
485
+ /**
486
+ * Why a persisted entry cannot run, or undefined when it is valid. Such
487
+ * entries are kept (disabled) so `workflow list` shows them with the reason.
488
+ */
489
+ function scheduleDisabledReason(entry) {
490
+ if (!Object.prototype.hasOwnProperty.call(entry, 'schedule')) {
491
+ return 'Missing cron expression (no schedule field)';
492
+ }
493
+ if (typeof entry.schedule !== 'string' || !isValidCronExpression(entry.schedule)) {
494
+ return `Invalid cron expression: ${String(entry.schedule)}`;
495
+ }
496
+ if (typeof entry.workflowId !== 'string' || entry.workflowId.length === 0) {
497
+ return 'Missing workflowId';
498
+ }
499
+ return undefined;
500
+ }
501
+ // ============================================================================
436
502
  // Factory Function
437
503
  // ============================================================================
438
504
  /**
@@ -64,14 +64,22 @@ export interface TestRunSummary {
64
64
  tests?: TestResult[];
65
65
  }
66
66
  export interface CoverageResult {
67
+ /** `null` = the report never collected that metric (#995); not 0%. */
67
68
  summary: {
68
- line: number;
69
- branch: number;
70
- function: number;
71
- statement: number;
69
+ line: number | null;
70
+ branch: number | null;
71
+ function: number | null;
72
+ statement: number | null;
72
73
  };
73
- meetsThreshold: boolean;
74
+ /** `null` = no verdict: nothing was measured (UNMEASURED or estimate only, #1012). */
75
+ meetsThreshold: boolean | null;
74
76
  threshold: number;
77
+ /** Provenance, the same vocabulary as MCP `coverage_analyze_sublinear` (#1012). */
78
+ measured?: boolean;
79
+ estimated?: boolean;
80
+ unmeasured?: boolean;
81
+ coverageMethod?: string;
82
+ warning?: string;
75
83
  files?: Array<{
76
84
  path: string;
77
85
  lineCoverage: number;
@@ -96,6 +104,15 @@ export interface QualityGateResult {
96
104
  threshold: number | string;
97
105
  }>;
98
106
  recommendations?: string[];
107
+ /** #996 (additive): 'insufficient-evidence' when the gate could not be evaluated. */
108
+ status?: 'insufficient-evidence';
109
+ evidenceStatus?: 'measured' | 'insufficient-evidence';
110
+ /** #996: canonical metrics with no measured evidence. */
111
+ unmeasured?: string[];
112
+ /** #996: false when missing evidence prevented the gate from running. */
113
+ gateEvaluated?: boolean;
114
+ /** #996: why the gate could not be evaluated. */
115
+ error?: string;
99
116
  }
100
117
  /**
101
118
  * Standard --format and --output options to add to any Command.
@@ -207,13 +207,28 @@ export function toJUnit(summary) {
207
207
  // ============================================================================
208
208
  export function coverageToMarkdown(result) {
209
209
  let md = `# Coverage Report\n\n`;
210
+ // #1012: an estimate is labelled and carries no verdict.
211
+ if (result.estimated) {
212
+ md += `> **STATIC ESTIMATE — not measured.** ${result.warning ?? ''}\n\n`;
213
+ }
214
+ const evaluated = result.meetsThreshold !== null && !result.estimated;
215
+ // #1027 N7: one decimal, never `~33.33333333333333%`.
216
+ const fmt = (v) => String(Math.round(v * 10) / 10);
210
217
  md += `| Metric | Value | Status |\n`;
211
218
  md += `|--------|-------|--------|\n`;
212
- md += `| Lines | ${result.summary.line}% | ${result.summary.line >= result.threshold ? '\u2705' : '\u274C'} |\n`;
213
- md += `| Branches | ${result.summary.branch}% | ${result.summary.branch >= result.threshold ? '\u2705' : '\u274C'} |\n`;
214
- md += `| Functions | ${result.summary.function}% | ${result.summary.function >= result.threshold ? '\u2705' : '\u274C'} |\n`;
215
- md += `| Statements | ${result.summary.statement}% | ${result.summary.statement >= result.threshold ? '\u2705' : '\u274C'} |\n`;
216
- md += `\n**Threshold:** ${result.threshold}% \u2014 ${result.meetsThreshold ? '\u2705 Met' : '\u274C Not met'}\n`;
219
+ // #995: an uncollected metric is "n/a", with no pass/fail mark — it is not 0%.
220
+ const row = (label, v) => v === null
221
+ ? `| ${label} | n/a (not collected) | \u2014 |\n`
222
+ : evaluated
223
+ ? `| ${label} | ${fmt(v)}% | ${v >= result.threshold ? '\u2705' : '\u274C'} |\n`
224
+ : `| ${label} | ~${fmt(v)}% (estimate) | \u2014 |\n`;
225
+ md += row('Lines', result.summary.line);
226
+ md += row('Branches', result.summary.branch);
227
+ md += row('Functions', result.summary.function);
228
+ md += row('Statements', result.summary.statement);
229
+ md += evaluated
230
+ ? `\n**Threshold:** ${result.threshold}% \u2014 ${result.meetsThreshold ? '\u2705 Met' : '\u274C Not met'}\n`
231
+ : `\n**Threshold:** ${result.threshold}% \u2014 not evaluated (UNMEASURED)\n`;
217
232
  if (result.gaps && result.gaps.length > 0) {
218
233
  md += `\n## Coverage Gaps\n\n`;
219
234
  md += `| File | Uncovered Lines | Risk | Severity |\n`;
@@ -232,6 +247,19 @@ export function coverageToMarkdown(result) {
232
247
  }
233
248
  export function qualityGateToMarkdown(result) {
234
249
  let md = `# Quality Gate Report\n\n`;
250
+ if (result.evidenceStatus === 'insufficient-evidence') {
251
+ // #996: a gate that could not run is neither a pass nor a measured failure.
252
+ md += `**Result:** \u26A0\uFE0F INSUFFICIENT EVIDENCE \u2014 quality gate not evaluated\n`;
253
+ if (result.unmeasured && result.unmeasured.length > 0) {
254
+ md += `**Unmeasured:** ${result.unmeasured.join(', ')}\n`;
255
+ }
256
+ if (result.error)
257
+ md += `**Reason:** ${result.error}\n`;
258
+ if (result.recommendations && result.recommendations.length > 0) {
259
+ md += `\n## Recommendations\n\n${result.recommendations.map(rec => `- ${rec}`).join('\n')}\n`;
260
+ }
261
+ return md;
262
+ }
235
263
  md += `**Result:** ${result.passed ? '\u2705 PASSED' : '\u274C FAILED'}\n`;
236
264
  md += `**Score:** ${result.score}\n\n`;
237
265
  md += `## Checks\n\n`;
@@ -41,12 +41,22 @@ export interface CoverageData {
41
41
  };
42
42
  /** True if data came from real instrumented coverage (V8/istanbul) */
43
43
  instrumented: boolean;
44
+ /**
45
+ * Source files the instrumented report has no entry for (#995). These are
46
+ * UNMEASURED — excluded from the figures rather than counted as 0%.
47
+ */
48
+ unmeasuredFiles?: string[];
44
49
  }
45
50
  /**
46
51
  * Try to read real coverage data from a coverage-final.json file.
47
52
  * Returns null if no instrumented coverage is available.
53
+ *
54
+ * #1012: per-file figures come from the shared istanbul parser, so the CLI
55
+ * and MCP compute "line" coverage the same way (source lines, not statements).
48
56
  */
49
57
  export declare function readInstrumentedCoverage(projectRoot: string): Map<string, FileCoverage> | null;
58
+ /** Aggregate per-file coverage into whole-number percentages. */
59
+ export declare function summarizeCoverage(files: FileCoverage[]): CoverageData['summary'];
50
60
  /**
51
61
  * Build coverage data for the given source files.
52
62
  *
@@ -11,6 +11,7 @@
11
11
  */
12
12
  import * as fs from 'fs';
13
13
  import * as path from 'path';
14
+ import { parseCoverageJson } from '../../coordination/handlers/handler-utils.js';
14
15
  // ============================================================================
15
16
  // V8/Istanbul Coverage Reader
16
17
  // ============================================================================
@@ -23,6 +24,9 @@ const COVERAGE_JSON_PATHS = [
23
24
  /**
24
25
  * Try to read real coverage data from a coverage-final.json file.
25
26
  * Returns null if no instrumented coverage is available.
27
+ *
28
+ * #1012: per-file figures come from the shared istanbul parser, so the CLI
29
+ * and MCP compute "line" coverage the same way (source lines, not statements).
26
30
  */
27
31
  export function readInstrumentedCoverage(projectRoot) {
28
32
  for (const relPath of COVERAGE_JSON_PATHS) {
@@ -30,50 +34,16 @@ export function readInstrumentedCoverage(projectRoot) {
30
34
  if (!fs.existsSync(fullPath))
31
35
  continue;
32
36
  try {
33
- const raw = JSON.parse(fs.readFileSync(fullPath, 'utf-8'));
37
+ const content = fs.readFileSync(fullPath, 'utf-8');
38
+ const raw = JSON.parse(content);
34
39
  // coverage-summary.json has a different shape
35
40
  if (raw.total && raw.total.lines) {
36
41
  return readCoverageSummary(raw, projectRoot);
37
42
  }
38
43
  // coverage-final.json: Record<filepath, IstanbulFileCoverage>
39
44
  const coverageMap = new Map();
40
- for (const [filePath, entry] of Object.entries(raw)) {
41
- const cov = entry;
42
- const stmtKeys = Object.keys(cov.s);
43
- const stmtCovered = stmtKeys.filter(k => cov.s[k] > 0).length;
44
- const branchKeys = Object.keys(cov.b);
45
- let branchTotal = 0;
46
- let branchCovered = 0;
47
- for (const k of branchKeys) {
48
- for (const count of cov.b[k]) {
49
- branchTotal++;
50
- if (count > 0)
51
- branchCovered++;
52
- }
53
- }
54
- const fnKeys = Object.keys(cov.f);
55
- const fnCovered = fnKeys.filter(k => cov.f[k] > 0).length;
56
- // Compute uncovered lines from statement map
57
- const coveredLineSet = new Set();
58
- const allLineSet = new Set();
59
- for (const stmtKey of stmtKeys) {
60
- const stmt = cov.statementMap[stmtKey];
61
- for (let line = stmt.start.line; line <= stmt.end.line; line++) {
62
- allLineSet.add(line);
63
- if (cov.s[stmtKey] > 0)
64
- coveredLineSet.add(line);
65
- }
66
- }
67
- const uncoveredLines = [...allLineSet].filter(l => !coveredLineSet.has(l)).sort((a, b) => a - b);
68
- coverageMap.set(filePath, {
69
- path: filePath,
70
- lines: { covered: coveredLineSet.size, total: allLineSet.size },
71
- branches: { covered: branchCovered, total: branchTotal },
72
- functions: { covered: fnCovered, total: fnKeys.length },
73
- statements: { covered: stmtCovered, total: stmtKeys.length },
74
- uncoveredLines,
75
- uncoveredBranches: uncoveredLines.slice(0, Math.floor(uncoveredLines.length / 2)),
76
- });
45
+ for (const file of parseCoverageJson(content).files) {
46
+ coverageMap.set(file.path, file);
77
47
  }
78
48
  return coverageMap.size > 0 ? coverageMap : null;
79
49
  }
@@ -161,6 +131,25 @@ function estimateFileCoverage(filePath, content) {
161
131
  // ============================================================================
162
132
  // Public API
163
133
  // ============================================================================
134
+ /** Aggregate per-file coverage into whole-number percentages. */
135
+ export function summarizeCoverage(files) {
136
+ const sum = (pick) => files.reduce((acc, f) => acc + pick(f), 0);
137
+ const safeDiv = (a, b) => b > 0 ? Math.round((a / b) * 100) : 0;
138
+ const totalLines = sum(f => f.lines.total);
139
+ const coveredLines = sum(f => f.lines.covered);
140
+ // #1012: statements are statements. A report without statement detail
141
+ // (lcov) carries its line figures in `statements`, so this falls back alike.
142
+ const totalStatements = sum(f => f.statements.total);
143
+ return {
144
+ line: safeDiv(coveredLines, totalLines),
145
+ branch: safeDiv(sum(f => f.branches.covered), sum(f => f.branches.total)),
146
+ function: safeDiv(sum(f => f.functions.covered), sum(f => f.functions.total)),
147
+ statement: totalStatements > 0
148
+ ? safeDiv(sum(f => f.statements.covered), totalStatements)
149
+ : safeDiv(coveredLines, totalLines),
150
+ files: files.length,
151
+ };
152
+ }
164
153
  /**
165
154
  * Build coverage data for the given source files.
166
155
  *
@@ -174,6 +163,7 @@ export function buildCoverageData(sourceFiles, projectRoot) {
174
163
  // Try instrumented coverage first
175
164
  const instrumentedData = readInstrumentedCoverage(root);
176
165
  const files = [];
166
+ const unmeasuredFiles = [];
177
167
  let isInstrumented = false;
178
168
  if (instrumentedData && instrumentedData.size > 0) {
179
169
  isInstrumented = true;
@@ -187,18 +177,10 @@ export function buildCoverageData(sourceFiles, projectRoot) {
187
177
  files.push({ ...match, path: filePath });
188
178
  }
189
179
  else {
190
- // File exists in source but has no coverage data — 0% coverage
191
- const content = fs.existsSync(filePath) ? fs.readFileSync(filePath, 'utf-8') : '';
192
- const totalLines = content.split('\n').length;
193
- files.push({
194
- path: filePath,
195
- lines: { covered: 0, total: totalLines },
196
- branches: { covered: 0, total: 1 },
197
- functions: { covered: 0, total: 1 },
198
- statements: { covered: 0, total: totalLines },
199
- uncoveredLines: Array.from({ length: totalLines }, (_, i) => i + 1),
200
- uncoveredBranches: [],
201
- });
180
+ // #995: the report has no entry for this file — the coverage run did
181
+ // not measure it. That is "unmeasured", not 0%: counting it as fully
182
+ // uncovered invented a figure nobody measured.
183
+ unmeasuredFiles.push(filePath);
202
184
  }
203
185
  }
204
186
  }
@@ -209,24 +191,11 @@ export function buildCoverageData(sourceFiles, projectRoot) {
209
191
  files.push(estimateFileCoverage(filePath, content));
210
192
  }
211
193
  }
212
- // Compute summary
213
- const totalLines = files.reduce((sum, f) => sum + f.lines.total, 0);
214
- const coveredLines = files.reduce((sum, f) => sum + f.lines.covered, 0);
215
- const totalBranches = files.reduce((sum, f) => sum + f.branches.total, 0);
216
- const coveredBranches = files.reduce((sum, f) => sum + f.branches.covered, 0);
217
- const totalFunctions = files.reduce((sum, f) => sum + f.functions.total, 0);
218
- const coveredFunctions = files.reduce((sum, f) => sum + f.functions.covered, 0);
219
- const safeDiv = (a, b) => b > 0 ? Math.round((a / b) * 100) : 0;
220
194
  return {
221
195
  files,
222
- summary: {
223
- line: safeDiv(coveredLines, totalLines),
224
- branch: safeDiv(coveredBranches, totalBranches),
225
- function: safeDiv(coveredFunctions, totalFunctions),
226
- statement: safeDiv(coveredLines, totalLines),
227
- files: files.length,
228
- },
196
+ summary: summarizeCoverage(files),
229
197
  instrumented: isInstrumented,
198
+ ...(unmeasuredFiles.length > 0 ? { unmeasuredFiles } : {}),
230
199
  };
231
200
  }
232
201
  //# sourceMappingURL=coverage-data.js.map