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
@@ -0,0 +1,314 @@
1
+ /**
2
+ * Coverage target resolution (issue #995).
3
+ *
4
+ * A coverage target can be the project root, a subfolder of it, a single source
5
+ * file, or an existing coverage report. Before #995 every target was treated as
6
+ * if it were the project root: `target: "src/"` ran vitest FROM `src/` (which
7
+ * found no tests, reported 0%, and wrote `src/coverage/` into the source tree),
8
+ * and `target: "coverage/lcov.info"` was searched for a `coverage/` folder
9
+ * inside a file and came back empty.
10
+ *
11
+ * This module answers the three questions every collector needs first:
12
+ * 1. Which project does the target belong to? (`findCoverageProjectRoot`)
13
+ * 2. Is the target itself a coverage report? (`isCoverageReportFile` /
14
+ * `loadCoverageReportFile`)
15
+ * 3. Which entries of a project-wide report belong to the target?
16
+ * (`scopeCoverageToTarget`)
17
+ *
18
+ * Kept free of task-executor and child-process imports so both the MCP handler
19
+ * and the CLI `coverage` command can share it.
20
+ */
21
+ import * as fs from 'fs';
22
+ import * as os from 'os';
23
+ import * as path from 'path';
24
+ import { loadCoverageData, parseCoberturaXml, parseCoverageJson, parseCoverageSummaryJson, parseLcovInfo, } from './handler-utils.js';
25
+ import { isTestPath } from './coverage-collection.js';
26
+ // ============================================================================
27
+ // Project root
28
+ // ============================================================================
29
+ /**
30
+ * Files whose presence marks a directory as a project root, i.e. the directory
31
+ * a test/coverage tool must be run from. `.git` bounds the walk for projects
32
+ * without a manifest.
33
+ */
34
+ const PROJECT_ROOT_MARKERS = [
35
+ 'package.json',
36
+ 'pyproject.toml', 'setup.py', 'setup.cfg',
37
+ 'go.mod', 'Cargo.toml',
38
+ 'pom.xml', 'build.gradle', 'build.gradle.kts',
39
+ '.git',
40
+ ];
41
+ /**
42
+ * Walk up from a target to the nearest directory that holds a project marker.
43
+ *
44
+ * NEAREST rather than topmost: in a monorepo, `packages/core/src` belongs to
45
+ * `packages/core` (its own package.json and test config), not the workspace
46
+ * root. This intentionally differs from `kernel/findProjectRoot`, which locates
47
+ * the AQE data root (honouring AQE_PROJECT_ROOT and `.agentic-qe`).
48
+ *
49
+ * Returns `null` when the target does not exist (a typo must not silently
50
+ * resolve to — and run tests for — an ancestor project) or when no marker is
51
+ * found below the home directory / filesystem root within `maxDepth` levels.
52
+ */
53
+ export function findCoverageProjectRoot(target, maxDepth = 12) {
54
+ let dir;
55
+ try {
56
+ const resolved = path.resolve(target);
57
+ if (!fs.existsSync(resolved))
58
+ return null;
59
+ const real = fs.realpathSync(resolved);
60
+ dir = fs.statSync(real).isDirectory() ? real : path.dirname(real);
61
+ }
62
+ catch {
63
+ return null;
64
+ }
65
+ let home = null;
66
+ try {
67
+ home = fs.realpathSync(os.homedir());
68
+ }
69
+ catch {
70
+ home = null;
71
+ }
72
+ const start = dir;
73
+ for (let depth = 0; depth <= maxDepth; depth++) {
74
+ // A stray manifest in $HOME must not claim every directory beneath it.
75
+ // $HOME is still a valid root when it is the target itself.
76
+ if (home !== null && dir === home && dir !== start)
77
+ return null;
78
+ if (PROJECT_ROOT_MARKERS.some(m => fs.existsSync(path.join(dir, m))))
79
+ return dir;
80
+ const parent = path.dirname(dir);
81
+ if (parent === dir)
82
+ return null;
83
+ dir = parent;
84
+ }
85
+ return null;
86
+ }
87
+ // ============================================================================
88
+ // Coverage report files as targets
89
+ // ============================================================================
90
+ const REPORT_BASENAMES = new Set([
91
+ 'lcov.info',
92
+ 'coverage-final.json',
93
+ 'coverage-summary.json',
94
+ 'coverage.xml',
95
+ 'cobertura-coverage.xml',
96
+ 'cobertura.xml',
97
+ ]);
98
+ /** Is this path (by name) a coverage report rather than source code? */
99
+ export function isCoverageReportFile(filePath) {
100
+ const base = path.basename(filePath).toLowerCase();
101
+ return REPORT_BASENAMES.has(base) || base.endsWith('.lcov') || base.endsWith('.lcov.info');
102
+ }
103
+ /**
104
+ * Parse a coverage report file of any supported format.
105
+ *
106
+ * Returns `null` — never an empty "0%" report — when the file can't be read,
107
+ * can't be parsed, or lists no files.
108
+ */
109
+ export async function loadCoverageReportFile(filePath) {
110
+ let content;
111
+ try {
112
+ content = await fs.promises.readFile(filePath, 'utf-8');
113
+ }
114
+ catch {
115
+ return null;
116
+ }
117
+ if (content.trim().length === 0)
118
+ return null;
119
+ try {
120
+ const base = path.basename(filePath).toLowerCase();
121
+ let data;
122
+ if (base.endsWith('.json')) {
123
+ const parsed = JSON.parse(content);
124
+ // coverage-summary.json carries a `total` entry with per-metric totals.
125
+ if (isSummaryShape(parsed))
126
+ data = parseCoverageSummaryJson(content);
127
+ // Anything else must be istanbul's per-file map. Raw V8 output
128
+ // (`{ result: [...] }`) and arbitrary JSON are rejected, not parsed into
129
+ // a phantom file called "result" with 0/0 coverage.
130
+ else if (isIstanbulShape(parsed))
131
+ data = parseCoverageJson(content);
132
+ else
133
+ return null;
134
+ }
135
+ else if (base.endsWith('.xml')) {
136
+ data = parseCoberturaXml(content);
137
+ }
138
+ else {
139
+ data = parseLcovInfo(content);
140
+ }
141
+ return data.files.length > 0 ? data : null;
142
+ }
143
+ catch {
144
+ return null;
145
+ }
146
+ }
147
+ function isIstanbulShape(parsed) {
148
+ const entries = Object.values(parsed);
149
+ return entries.length > 0 && entries.every(e => typeof e === 'object' && e !== null && !Array.isArray(e) &&
150
+ typeof e.s === 'object' &&
151
+ typeof e.statementMap === 'object');
152
+ }
153
+ function isSummaryShape(parsed) {
154
+ const total = parsed.total;
155
+ return typeof total === 'object' && total !== null && typeof total.lines === 'object';
156
+ }
157
+ // ============================================================================
158
+ // Scoping
159
+ // ============================================================================
160
+ /** True when `child` is `parent` or inside it (path-segment aware). */
161
+ function isWithin(child, parent) {
162
+ const rel = path.relative(parent, child);
163
+ return rel === '' || (!rel.startsWith('..') && !path.isAbsolute(rel));
164
+ }
165
+ /** Canonicalise a path without requiring it to exist (macOS /tmp → /private/tmp). */
166
+ function canonical(p) {
167
+ try {
168
+ return fs.realpathSync(p);
169
+ }
170
+ catch {
171
+ return path.resolve(p);
172
+ }
173
+ }
174
+ /**
175
+ * Keep only the report entries that lie under `target`.
176
+ *
177
+ * Report paths come in two shapes: absolute (istanbul `coverage-final.json`)
178
+ * and project-root-relative (vitest/jest `lcov.info` writes `SF:src/math.ts`).
179
+ * Relative entries are resolved against `root` before comparing. Entry paths are
180
+ * returned unchanged.
181
+ */
182
+ export function scopeCoverageToTarget(data, root, target) {
183
+ const rootAbs = canonical(root);
184
+ const targetAbs = canonical(target);
185
+ if (targetAbs === rootAbs)
186
+ return [...data.files];
187
+ return data.files.filter(f => {
188
+ const abs = path.isAbsolute(f.path) ? canonical(f.path) : path.resolve(rootAbs, f.path);
189
+ return isWithin(abs, targetAbs);
190
+ });
191
+ }
192
+ /**
193
+ * Decide what a report says about `target`. Shared by the MCP handler and the
194
+ * CLI so the two cannot disagree (#995 review B2).
195
+ *
196
+ * "Unmeasured" is decided ONLY from evidence that nothing was measured:
197
+ * - the runner's own result says it ran 0 tests (`numTotalTests === 0`), or
198
+ * - the report has no entry under the target.
199
+ * Hit counts are never used: a file listed with 0 hits is a measured 0%,
200
+ * whether the report came from our run or from the user (#995 review B3).
201
+ */
202
+ export function evaluateCoverageForTarget(report, projectRoot, target, options = {}) {
203
+ if (options.numTotalTests === 0)
204
+ return { status: 'no-data', reason: 'no-tests-ran' };
205
+ const scoped = scopeCoverageToTarget(report, projectRoot, target);
206
+ if (scoped.length === 0)
207
+ return { status: 'no-data', reason: 'target-not-covered' };
208
+ // Coverage OF a test file is not production coverage (#569). A report with
209
+ // only test entries yields no production figure — never the unfiltered set.
210
+ const production = scoped.filter(f => !isTestPath(f.path, projectRoot));
211
+ if (production.length === 0)
212
+ return { status: 'no-data', reason: 'test-only-report' };
213
+ return { status: 'measured', files: production };
214
+ }
215
+ /**
216
+ * Resolve a target to coverage that already exists on disk, without running
217
+ * anything:
218
+ * - a coverage report passed as the target is parsed and analysed whole;
219
+ * - otherwise the PROJECT ROOT's report (not the cwd's, not the subfolder's)
220
+ * is scoped to the target;
221
+ * - `no-report` tells the caller it may run tooling from `projectRoot`.
222
+ */
223
+ export async function resolveExistingCoverage(targetPath) {
224
+ const target = path.resolve(targetPath);
225
+ let stat;
226
+ try {
227
+ stat = fs.statSync(target);
228
+ }
229
+ catch {
230
+ return { status: 'target-missing', target };
231
+ }
232
+ if (stat.isFile() && isCoverageReportFile(target)) {
233
+ const reportDir = path.dirname(target);
234
+ const projectRoot = findCoverageProjectRoot(reportDir)
235
+ ?? (path.basename(reportDir) === 'coverage' ? path.dirname(reportDir) : reportDir);
236
+ const report = await loadCoverageReportFile(target);
237
+ const evaluation = report
238
+ ? evaluateCoverageForTarget(report, projectRoot, projectRoot)
239
+ : { status: 'no-data', reason: 'unreadable-report' };
240
+ return { status: 'evaluated', target, projectRoot, source: 'report-file', evaluation };
241
+ }
242
+ const projectRoot = findCoverageProjectRoot(target) ?? (stat.isDirectory() ? target : path.dirname(target));
243
+ const existing = await loadCoverageData(projectRoot);
244
+ if (!existing)
245
+ return { status: 'no-report', target, projectRoot };
246
+ return {
247
+ status: 'evaluated', target, projectRoot, source: 'project-report',
248
+ evaluation: evaluateCoverageForTarget(existing, projectRoot, target),
249
+ };
250
+ }
251
+ /**
252
+ * Threshold verdict over the metrics that were actually collected. Shared by
253
+ * MCP and CLI (#995 review NB5): an uncollected metric (no branch data in the
254
+ * report) is null, and a null must not drag the average down as a fake 0.
255
+ */
256
+ export function thresholdVerdict(summary, threshold, collected) {
257
+ // #1027 N7: lcov / Cobertura carry no statement data; it is left out too.
258
+ const metrics = [summary.line];
259
+ if (collected.statement !== false)
260
+ metrics.push(summary.statement);
261
+ if (collected.branch)
262
+ metrics.push(summary.branch);
263
+ if (collected.function)
264
+ metrics.push(summary.function);
265
+ const overall = metrics.reduce((a, b) => a + b, 0) / metrics.length;
266
+ return { overall, meetsThreshold: overall >= threshold };
267
+ }
268
+ const SHORTFALL_RE = /^Coverage is [\d.]+% below threshold/i;
269
+ /**
270
+ * Make the analyzer's recommendations agree with `thresholdVerdict`
271
+ * (#995 review NB-A). The analyzer computes its "Coverage is X% below
272
+ * threshold" line from a 4-metric average that counts an uncollected metric as
273
+ * 0 — so a line-only report at 90% got "Met" next to "35.0% below threshold".
274
+ * Here the shortfall line is recomputed from the collected-metrics verdict,
275
+ * and advice about a metric that was never collected is dropped.
276
+ */
277
+ export function reconcileRecommendations(recommendations, verdict, threshold, collected) {
278
+ const kept = recommendations.filter(rec => !SHORTFALL_RE.test(rec) &&
279
+ (collected.branch || !/branch coverage/i.test(rec)) &&
280
+ (collected.function || !/function coverage/i.test(rec)));
281
+ if (verdict.meetsThreshold)
282
+ return kept;
283
+ return [
284
+ `Coverage is ${(threshold - verdict.overall).toFixed(1)}% below threshold. Focus on high-risk files first.`,
285
+ ...kept,
286
+ ];
287
+ }
288
+ /** Is this verdict "no measurement exists" (as opposed to an error or test-only report)? */
289
+ export function isUnmeasured(reason) {
290
+ return reason === 'target-not-covered' || reason === 'no-tests-ran';
291
+ }
292
+ /** Caller-facing explanation of a no-data verdict. Shared by MCP and CLI. */
293
+ export function describeNoData(reason, target, projectRoot) {
294
+ switch (reason) {
295
+ case 'target-missing':
296
+ return `Target does not exist: ${target}`;
297
+ case 'unreadable-report':
298
+ return `Unreadable coverage report: ${target}. It could not be parsed or lists no files. ` +
299
+ 'Supported: lcov.info, istanbul coverage-final.json / coverage-summary.json, Cobertura XML. ' +
300
+ "Raw V8 output is not supported — convert it with c8 or your runner's istanbul reporter.";
301
+ case 'test-only-report':
302
+ return 'The coverage report contains only test files, so there is no production ' +
303
+ 'coverage to report. Coverage OF a test file is not a meaningful metric. ' +
304
+ 'Check that your coverage tool is instrumenting your source directory.';
305
+ case 'target-not-covered':
306
+ return `Target is UNMEASURED: the coverage data for project ${projectRoot ?? '?'} has no entry ` +
307
+ `for any production file under ${target}. This is not 0% coverage — no measurement exists ` +
308
+ "for it. Check your coverage tool's include/exclude settings, or regenerate the report.";
309
+ case 'no-tests-ran':
310
+ return `Target is UNMEASURED: the test runner reported running 0 tests from ${projectRoot ?? '?'}. ` +
311
+ 'This is not 0% coverage.';
312
+ }
313
+ }
314
+ //# sourceMappingURL=coverage-target.js.map
@@ -11,7 +11,10 @@ import type { CoverageAnalyzerService } from '../../domains/coverage-analysis';
11
11
  import type { SecurityScannerService } from '../../domains/security-compliance';
12
12
  import type { TestGeneratorService } from '../../domains/test-generation';
13
13
  import type { KnowledgeGraphService } from '../../domains/code-intelligence';
14
+ import type { ICodeIntelligenceCoordinator } from '../../domains/code-intelligence/coordinator';
14
15
  import type { QualityAnalyzerService } from '../../domains/quality-assessment';
16
+ /** The coordinator surface the MCP index-code handler needs (#999). */
17
+ export type ProjectMetricsCollector = Pick<ICodeIntelligenceCoordinator, 'collectProjectMetrics'>;
15
18
  /** Signature of a single task handler */
16
19
  export type InstanceTaskHandler = (task: QueenTask) => Promise<Result<unknown, Error>>;
17
20
  /**
@@ -33,6 +36,12 @@ export interface TaskHandlerContext {
33
36
  */
34
37
  getTestGenerator(useLLM?: boolean): Promise<TestGeneratorService>;
35
38
  getKnowledgeGraph(): KnowledgeGraphService;
39
+ /**
40
+ * #999 MCP-CLI parity: the code-intelligence coordinator, whose
41
+ * collectProjectMetrics step `aqe code index` runs. Resolves to undefined when
42
+ * the domain is unavailable. Optional so lightweight contexts can omit it.
43
+ */
44
+ getCodeIntelligenceCoordinator?(): Promise<ProjectMetricsCollector | undefined>;
36
45
  getQualityAnalyzer(): QualityAnalyzerService;
37
46
  /** Executor configuration */
38
47
  readonly config: {
@@ -75,9 +75,31 @@ export interface IstanbulFileCoverage {
75
75
  */
76
76
  export declare function loadCoverageData(targetPath: string): Promise<CoverageData | null>;
77
77
  /**
78
- * Parse Istanbul/nyc coverage-final.json format
78
+ * Per-line hit counts of one istanbul file entry, computed the way istanbul's
79
+ * own `FileCoverage#getLineCoverage` (and therefore coverage-summary.json
80
+ * `lines` and lcov.info `DA:` records) does: each statement counts on its
81
+ * START line, and a line's count is the highest count of the statements that
82
+ * start on it. A line is covered when any statement on it ran (#1012).
83
+ */
84
+ export declare function istanbulLineHits(fd: Pick<IstanbulFileCoverage, 'statementMap' | 's'>): Map<number, number>;
85
+ /**
86
+ * Parse Istanbul/nyc coverage-final.json format.
87
+ *
88
+ * #1012: `lines` are SOURCE LINES (derived from `statementMap` start lines,
89
+ * as istanbul's own summary does), not statements. Before, statement counts
90
+ * were reported as "line", so one project had two different line figures
91
+ * depending on whether coverage-final.json or lcov.info was read.
79
92
  */
80
93
  export declare function parseCoverageJson(content: string): CoverageData;
94
+ /**
95
+ * Parse istanbul `coverage-summary.json` (the `json-summary` reporter).
96
+ *
97
+ * Shape: `{ total: {...}, "<file>": { lines, statements, functions, branches } }`
98
+ * where each metric is `{ total, covered, skipped, pct }`. There is no
99
+ * per-line detail, so `uncoveredLines` is empty — a summary can report a
100
+ * figure but cannot locate a gap (#995).
101
+ */
102
+ export declare function parseCoverageSummaryJson(content: string): CoverageData;
81
103
  /**
82
104
  * Parse LCOV info format
83
105
  */
@@ -6,6 +6,7 @@
6
6
  */
7
7
  import * as fs from 'fs/promises';
8
8
  import * as path from 'path';
9
+ import { isAqeManagedDir } from '../../shared/aqe-managed-dirs.js';
9
10
  import { safeJsonParse } from '../../shared/safe-json.js';
10
11
  // ============================================================================
11
12
  // Coverage Data Loaders
@@ -21,6 +22,8 @@ export async function loadCoverageData(targetPath) {
21
22
  path.join(targetPath, 'coverage', 'lcov.info'),
22
23
  path.join(targetPath, '.nyc_output', 'coverage-final.json'),
23
24
  path.join(targetPath, 'coverage-final.json'),
25
+ // Summary-only (per-file totals, no line detail) — last JS resort (#995)
26
+ path.join(targetPath, 'coverage', 'coverage-summary.json'),
24
27
  // Python (pytest-cov, coverage.py)
25
28
  path.join(targetPath, 'coverage.xml'),
26
29
  path.join(targetPath, 'htmlcov', 'status.json'),
@@ -30,7 +33,10 @@ export async function loadCoverageData(targetPath) {
30
33
  for (const coveragePath of coverageLocations) {
31
34
  try {
32
35
  const content = await fs.readFile(coveragePath, 'utf-8');
33
- if (coveragePath.endsWith('.json')) {
36
+ if (coveragePath.endsWith('coverage-summary.json')) {
37
+ return parseCoverageSummaryJson(content);
38
+ }
39
+ else if (coveragePath.endsWith('.json')) {
34
40
  return parseCoverageJson(content);
35
41
  }
36
42
  else if (coveragePath.endsWith('.info')) {
@@ -47,7 +53,32 @@ export async function loadCoverageData(targetPath) {
47
53
  return null;
48
54
  }
49
55
  /**
50
- * Parse Istanbul/nyc coverage-final.json format
56
+ * Per-line hit counts of one istanbul file entry, computed the way istanbul's
57
+ * own `FileCoverage#getLineCoverage` (and therefore coverage-summary.json
58
+ * `lines` and lcov.info `DA:` records) does: each statement counts on its
59
+ * START line, and a line's count is the highest count of the statements that
60
+ * start on it. A line is covered when any statement on it ran (#1012).
61
+ */
62
+ export function istanbulLineHits(fd) {
63
+ const lineHits = new Map();
64
+ const statementMap = fd.statementMap || {};
65
+ for (const [id, count] of Object.entries(fd.s || {})) {
66
+ const line = statementMap[id]?.start?.line;
67
+ if (typeof line !== 'number')
68
+ continue;
69
+ const prev = lineHits.get(line);
70
+ if (prev === undefined || prev < count)
71
+ lineHits.set(line, count);
72
+ }
73
+ return lineHits;
74
+ }
75
+ /**
76
+ * Parse Istanbul/nyc coverage-final.json format.
77
+ *
78
+ * #1012: `lines` are SOURCE LINES (derived from `statementMap` start lines,
79
+ * as istanbul's own summary does), not statements. Before, statement counts
80
+ * were reported as "line", so one project had two different line figures
81
+ * depending on whether coverage-final.json or lcov.info was read.
51
82
  */
52
83
  export function parseCoverageJson(content) {
53
84
  const data = safeJsonParse(content);
@@ -58,30 +89,21 @@ export function parseCoverageJson(content) {
58
89
  let totalStatements = 0, coveredStatements = 0;
59
90
  for (const [filePath, fileData] of Object.entries(data)) {
60
91
  const fd = fileData;
61
- // Calculate file-level metrics
62
- const lineMap = fd.statementMap || {};
63
- const lineCounts = fd.s || {};
92
+ const statementCounts = fd.s || {};
64
93
  const branchMap = fd.branchMap || {};
65
94
  const branchCounts = fd.b || {};
66
95
  const fnCounts = fd.f || {};
67
- const fileLines = Object.keys(lineCounts).length;
68
- const fileCoveredLines = Object.values(lineCounts).filter((v) => v > 0).length;
96
+ const lineHits = istanbulLineHits(fd);
97
+ const fileLines = lineHits.size;
98
+ const fileCoveredLines = [...lineHits.values()].filter(v => v > 0).length;
69
99
  const fileBranches = Object.values(branchCounts).flat().length;
70
100
  const fileCoveredBranches = Object.values(branchCounts).flat().filter((v) => v > 0).length;
71
101
  const fileFunctions = Object.keys(fnCounts).length;
72
102
  const fileCoveredFunctions = Object.values(fnCounts).filter((v) => v > 0).length;
73
- const fileStatements = Object.keys(lineMap).length;
74
- const fileCoveredStatements = Object.values(lineCounts).filter((v) => v > 0).length;
75
- // Find uncovered lines
76
- const uncoveredLines = [];
77
- for (const [key, count] of Object.entries(lineCounts)) {
78
- if (count === 0) {
79
- const stmtInfo = lineMap[key];
80
- if (stmtInfo?.start?.line) {
81
- uncoveredLines.push(stmtInfo.start.line);
82
- }
83
- }
84
- }
103
+ const fileStatements = Object.keys(statementCounts).length;
104
+ const fileCoveredStatements = Object.values(statementCounts).filter((v) => v > 0).length;
105
+ // Uncovered lines: lines no statement on which ran.
106
+ const uncoveredLines = [...lineHits.entries()].filter(([, hits]) => hits === 0).map(([line]) => line);
85
107
  // Find uncovered branches
86
108
  const uncoveredBranches = [];
87
109
  for (const [branchId, counts] of Object.entries(branchCounts)) {
@@ -98,7 +120,7 @@ export function parseCoverageJson(content) {
98
120
  branches: { covered: fileCoveredBranches, total: fileBranches },
99
121
  functions: { covered: fileCoveredFunctions, total: fileFunctions },
100
122
  statements: { covered: fileCoveredStatements, total: fileStatements },
101
- uncoveredLines: Array.from(new Set(uncoveredLines)).sort((a, b) => a - b),
123
+ uncoveredLines: uncoveredLines.sort((a, b) => a - b),
102
124
  uncoveredBranches: Array.from(new Set(uncoveredBranches)).sort((a, b) => a - b),
103
125
  });
104
126
  totalLines += fileLines;
@@ -121,6 +143,44 @@ export function parseCoverageJson(content) {
121
143
  },
122
144
  };
123
145
  }
146
+ /**
147
+ * Parse istanbul `coverage-summary.json` (the `json-summary` reporter).
148
+ *
149
+ * Shape: `{ total: {...}, "<file>": { lines, statements, functions, branches } }`
150
+ * where each metric is `{ total, covered, skipped, pct }`. There is no
151
+ * per-line detail, so `uncoveredLines` is empty — a summary can report a
152
+ * figure but cannot locate a gap (#995).
153
+ */
154
+ export function parseCoverageSummaryJson(content) {
155
+ const data = safeJsonParse(content);
156
+ const pick = (m) => ({ covered: Number(m?.covered) || 0, total: Number(m?.total) || 0 });
157
+ const files = [];
158
+ for (const [filePath, entry] of Object.entries(data)) {
159
+ if (filePath === 'total' || typeof entry !== 'object' || entry === null || !entry.lines)
160
+ continue;
161
+ files.push({
162
+ path: filePath,
163
+ lines: pick(entry.lines),
164
+ branches: pick(entry.branches),
165
+ functions: pick(entry.functions),
166
+ statements: pick(entry.statements ?? entry.lines),
167
+ uncoveredLines: [],
168
+ uncoveredBranches: [],
169
+ });
170
+ }
171
+ const sum = (get) => files.reduce((acc, f) => ({ covered: acc.covered + get(f).covered, total: acc.total + get(f).total }), { covered: 0, total: 0 });
172
+ const pct = (m) => (m.total > 0 ? (m.covered / m.total) * 100 : 0);
173
+ return {
174
+ files,
175
+ summary: {
176
+ line: pct(sum(f => f.lines)),
177
+ branch: pct(sum(f => f.branches)),
178
+ function: pct(sum(f => f.functions)),
179
+ statement: pct(sum(f => f.statements)),
180
+ files: files.length,
181
+ },
182
+ };
183
+ }
124
184
  /**
125
185
  * Parse LCOV info format
126
186
  */
@@ -175,7 +235,8 @@ export function parseLcovInfo(content) {
175
235
  lines: { covered: linesCovered, total: linesTotal },
176
236
  branches: { covered: branchesCovered, total: branchesTotal },
177
237
  functions: { covered: functionsCovered, total: functionsTotal },
178
- statements: { covered: linesCovered, total: linesTotal },
238
+ // #1027 N7: lcov has no statement detail — not collected, not a copy of lines.
239
+ statements: { covered: 0, total: 0 },
179
240
  uncoveredLines: Array.from(new Set(uncoveredLines)),
180
241
  uncoveredBranches: Array.from(new Set(uncoveredBranches)),
181
242
  });
@@ -312,7 +373,8 @@ export function parseCoberturaXml(content) {
312
373
  lines: { covered: linesCovered, total: linesTotal },
313
374
  branches: { covered: branchesCovered, total: branchesTotal },
314
375
  functions: { covered: functionsCovered, total: functionsTotal },
315
- statements: { covered: linesCovered, total: linesTotal },
376
+ // #1027 N7: Cobertura has no statement detail — not collected.
377
+ statements: { covered: 0, total: 0 },
316
378
  uncoveredLines,
317
379
  uncoveredBranches,
318
380
  });
@@ -406,11 +468,16 @@ export async function discoverSourceFiles(targetPath, options = {}) {
406
468
  if (['node_modules', '.git', 'dist', 'build', 'coverage', '.nyc_output',
407
469
  '__pycache__', '.venv', 'venv', '.tox', '.mypy_cache', 'target',
408
470
  '.gradle', 'vendor', '.bundle',
409
- '.agentic-qe', '.claude', '.cache', '.npm', '.yarn',
471
+ '.cache', '.npm', '.yarn',
410
472
  '.next', '.nuxt', '.svelte-kit', 'out', '.turbo',
411
473
  'tmp', 'temp', '.tmp'].includes(entry.name)) {
412
474
  continue;
413
475
  }
476
+ // #999: AQE state/assets are not source: .agentic-qe anywhere; .claude at
477
+ // the root or next to a nested .agentic-qe. A plugin's own .claude/hooks
478
+ // source (no AQE install beside it) is kept.
479
+ if (isAqeManagedDir(dir, entry.name, dir === targetPath))
480
+ continue;
414
481
  if (files.length >= maxFiles)
415
482
  return; // Cap reached
416
483
  await walkDir(fullPath);