agentic-qe 3.15.5 → 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 (536) 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 +121 -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/cli/bundle.js +5 -5
  11. package/dist/cli/chunks/adapter-PP3XIXDV.js +2 -0
  12. package/dist/cli/chunks/{agent-booster-wasm-CCTTGCQS.js → agent-booster-wasm-SY7UCLBL.js} +2 -2
  13. package/dist/cli/chunks/{agent-handler-DHYUF3NX.js → agent-handler-KAMYBU3S.js} +2 -2
  14. package/dist/cli/chunks/{agent-memory-branch-642W7CYX.js → agent-memory-branch-2CAW3KUM.js} +2 -2
  15. package/dist/cli/chunks/aqe-learning-engine-VDUQJKKY.js +2 -0
  16. package/dist/cli/chunks/{arena-NW2JVAFY.js → arena-4OFLJ3R2.js} +2 -2
  17. package/dist/cli/chunks/{arena-MUCC7UUN.js → arena-QCCVIOAH.js} +4 -4
  18. package/dist/cli/chunks/{audit-VKQTZJAA.js → audit-RBDQJQJB.js} +3 -3
  19. package/dist/cli/chunks/base-QSYWWPCE.js +2 -0
  20. package/dist/cli/chunks/{better-sqlite3-7ZUFVWLQ.js → better-sqlite3-5JRACCDQ.js} +2 -2
  21. package/dist/cli/chunks/{brain-handler-7LKAWSBI.js → brain-handler-W4QIIRT4.js} +3 -3
  22. package/dist/cli/chunks/{branch-enumerator-HUNXJKM4.js → branch-enumerator-IBNGI572.js} +2 -2
  23. package/dist/cli/chunks/{browser-ZSZEYUDP.js → browser-GMSCVAOI.js} +2 -2
  24. package/dist/cli/chunks/browser-workflow-WXXPBSCM.js +2 -0
  25. package/dist/cli/chunks/{chunk-RUSLEOMC.js → chunk-22OZIJAD.js} +2 -2
  26. package/dist/cli/chunks/{chunk-WR64BKUE.js → chunk-24ZSGYC6.js} +1 -1
  27. package/dist/cli/chunks/{chunk-CR2JUANW.js → chunk-2CIDFR2H.js} +3 -3
  28. package/dist/cli/chunks/{chunk-SDWMLT7B.js → chunk-2IWPJUVV.js} +5 -5
  29. package/dist/cli/chunks/{chunk-VYDNLQJN.js → chunk-2ZTWPMTK.js} +2 -2
  30. package/dist/cli/chunks/{chunk-WN55MNZ2.js → chunk-34MDMFET.js} +2 -2
  31. package/dist/cli/chunks/{chunk-D3G2NN7F.js → chunk-3DJNKNBR.js} +66 -65
  32. package/dist/cli/chunks/{chunk-XQRE2HWM.js → chunk-3NJ7O3OH.js} +2 -2
  33. package/dist/cli/chunks/chunk-45MVRQG4.js +2 -0
  34. package/dist/cli/chunks/chunk-46HBVDMU.js +2 -0
  35. package/dist/cli/chunks/{chunk-MNQ36MAF.js → chunk-47Q7JL3V.js} +2 -2
  36. package/dist/cli/chunks/chunk-4CLDYT36.js +2 -0
  37. package/dist/cli/chunks/{chunk-ORTBRO7F.js → chunk-4KOVHQXK.js} +2 -2
  38. package/dist/cli/chunks/{chunk-B2UHTA4Q.js → chunk-4POOJYXA.js} +1 -1
  39. package/dist/cli/chunks/{chunk-QXY3IRBW.js → chunk-5DH5QI7G.js} +26 -26
  40. package/dist/cli/chunks/{chunk-7BIYJRQJ.js → chunk-5GIJU2ZY.js} +2 -2
  41. package/dist/cli/chunks/{chunk-6LG5UEQE.js → chunk-5HAPS6VD.js} +2 -2
  42. package/dist/cli/chunks/{chunk-OU4ZAWCC.js → chunk-5LST62QR.js} +2 -2
  43. package/dist/cli/chunks/{chunk-Y2E3IJ53.js → chunk-5MT7DMD7.js} +2 -2
  44. package/dist/cli/chunks/{chunk-6UYN5PHA.js → chunk-5NC7QEJ6.js} +4 -4
  45. package/dist/cli/chunks/{chunk-3DTEQHFB.js → chunk-5UPIL62W.js} +3 -3
  46. package/dist/cli/chunks/{chunk-YINFES3E.js → chunk-5VUIXDY2.js} +2 -2
  47. package/dist/cli/chunks/chunk-5VZVMO7B.js +3 -0
  48. package/dist/cli/chunks/{chunk-JCC7QEKZ.js → chunk-624QRKQX.js} +1 -1
  49. package/dist/cli/chunks/{chunk-HIUNCO2W.js → chunk-66NW3ZB4.js} +2 -2
  50. package/dist/cli/chunks/{chunk-4AZP7ZCW.js → chunk-6HWARQWV.js} +2 -2
  51. package/dist/cli/chunks/{chunk-LNO5IWGH.js → chunk-6MXAJBEA.js} +1 -1
  52. package/dist/cli/chunks/{chunk-XNEEYXR2.js → chunk-6R3FBFCJ.js} +2 -2
  53. package/dist/cli/chunks/{chunk-ZT3GUYM5.js → chunk-6RDVY26I.js} +2 -2
  54. package/dist/cli/chunks/{chunk-W3ZGNNDV.js → chunk-6T6AHVLF.js} +1 -1
  55. package/dist/cli/chunks/{chunk-JANLATHN.js → chunk-6WOZUSSN.js} +2 -2
  56. package/dist/cli/chunks/chunk-72MQCZSM.js +2 -0
  57. package/dist/cli/chunks/chunk-7QVPMH25.js +3 -0
  58. package/dist/cli/chunks/{chunk-HLFDC4SF.js → chunk-7SAMMQVS.js} +1 -1
  59. package/dist/cli/chunks/{chunk-644DFAGS.js → chunk-7TJZDRDU.js} +1 -1
  60. package/dist/cli/chunks/{chunk-BYXNHGQC.js → chunk-7TVIX4WL.js} +2 -2
  61. package/dist/cli/chunks/{chunk-FBEXG4HD.js → chunk-7VTKR44N.js} +2 -2
  62. package/dist/cli/chunks/{chunk-UE22ODHN.js → chunk-7XTANLTN.js} +1 -1
  63. package/dist/cli/chunks/chunk-7XUB7U6Z.js +4 -0
  64. package/dist/cli/chunks/{chunk-HPLMX62I.js → chunk-A74J23QB.js} +2 -2
  65. package/dist/cli/chunks/{chunk-VRJPH3LG.js → chunk-A7ANPS4E.js} +2 -2
  66. package/dist/cli/chunks/{chunk-IHFUEPZH.js → chunk-AJT3XDRD.js} +2 -2
  67. package/dist/cli/chunks/{chunk-EUEHBERE.js → chunk-ALCIUWFC.js} +1 -1
  68. package/dist/cli/chunks/{chunk-NMJVG22Z.js → chunk-AUN4FG7V.js} +1 -1
  69. package/dist/cli/chunks/{chunk-DWZI3IVB.js → chunk-AUOSHM63.js} +2 -2
  70. package/dist/cli/chunks/{chunk-7EZLOC4K.js → chunk-AX26QJ6T.js} +2 -2
  71. package/dist/cli/chunks/{chunk-PDPEMBFV.js → chunk-B7RHBKHL.js} +2 -2
  72. package/dist/cli/chunks/{chunk-DEGWCUMY.js → chunk-BAYGQRNP.js} +2 -2
  73. package/dist/cli/chunks/{chunk-ONCH5AXU.js → chunk-BIXRTOH3.js} +18 -18
  74. package/dist/cli/chunks/{chunk-U4TV75AC.js → chunk-BO7UFNYV.js} +2 -2
  75. package/dist/cli/chunks/{chunk-FNAYDITO.js → chunk-BUTGIVKW.js} +1 -1
  76. package/dist/cli/chunks/{chunk-HBYQYGXP.js → chunk-BXATKI5S.js} +2 -2
  77. package/dist/cli/chunks/{chunk-BO4PKNYP.js → chunk-CCL436IU.js} +32 -27
  78. package/dist/cli/chunks/{chunk-XIE7OHML.js → chunk-CEXNW5TR.js} +1 -1
  79. package/dist/cli/chunks/{chunk-663ZFPUL.js → chunk-CLAMMGY3.js} +2 -2
  80. package/dist/cli/chunks/{chunk-PVAE65B4.js → chunk-CR66HNAE.js} +1 -1
  81. package/dist/cli/chunks/{chunk-LRASYSGV.js → chunk-CZBIREL5.js} +2 -2
  82. package/dist/cli/chunks/{chunk-WLIYWBQR.js → chunk-D5N2O5EH.js} +2 -2
  83. package/dist/cli/chunks/{chunk-A337MD3C.js → chunk-DA7DGDTI.js} +2 -2
  84. package/dist/cli/chunks/{chunk-WC47GICZ.js → chunk-DLSFT6PO.js} +2 -2
  85. package/dist/cli/chunks/{chunk-KHCALIFP.js → chunk-DQNUPEY5.js} +2 -2
  86. package/dist/cli/chunks/{chunk-GTSOFCMQ.js → chunk-EECF4CMA.js} +1 -1
  87. package/dist/cli/chunks/{chunk-5BOZCMXZ.js → chunk-EF5UHDCG.js} +1 -1
  88. package/dist/cli/chunks/{chunk-L6SVCNXK.js → chunk-EJ4KZFZN.js} +1 -1
  89. package/dist/cli/chunks/{chunk-CFPR24YK.js → chunk-ELI4GDQO.js} +2 -2
  90. package/dist/cli/chunks/{chunk-KJ3KBP24.js → chunk-F3KS3TAB.js} +2 -2
  91. package/dist/cli/chunks/{chunk-RMJ7PJOS.js → chunk-F7A2UBZO.js} +2 -2
  92. package/dist/cli/chunks/{chunk-U6OVPMQX.js → chunk-FOJRPEIP.js} +2 -2
  93. package/dist/cli/chunks/{chunk-JYY7AYGA.js → chunk-FQ5N666N.js} +1 -1
  94. package/dist/cli/chunks/{chunk-4XSCZVON.js → chunk-FU7LNUD7.js} +2 -2
  95. package/dist/cli/chunks/{chunk-OW42F2TX.js → chunk-GFB6BZWU.js} +2 -2
  96. package/dist/cli/chunks/{chunk-JI77KJP7.js → chunk-GI5HWS4H.js} +1 -1
  97. package/dist/cli/chunks/{chunk-4UXPDV7E.js → chunk-GNYOHZVV.js} +1 -1
  98. package/dist/cli/chunks/{chunk-VCKDVOPD.js → chunk-GVRFSXY6.js} +2 -2
  99. package/dist/cli/chunks/{chunk-PURHGLEC.js → chunk-GWM4M5NF.js} +1 -1
  100. package/dist/cli/chunks/{chunk-BY646JOM.js → chunk-HAN4MS5T.js} +2 -2
  101. package/dist/cli/chunks/{chunk-OGYWWZU7.js → chunk-HEGGV2PT.js} +2 -2
  102. package/dist/cli/chunks/{chunk-FHUJCVT3.js → chunk-HOEWMEF2.js} +2 -2
  103. package/dist/cli/chunks/{chunk-CXOXUBYU.js → chunk-HZFK2Z2Z.js} +1 -1
  104. package/dist/cli/chunks/chunk-I7WAW7TM.js +2 -0
  105. package/dist/cli/chunks/{chunk-E4VIVMDL.js → chunk-IEPWO4XP.js} +2 -2
  106. package/dist/cli/chunks/{chunk-DTJODGCE.js → chunk-ITIJ23K2.js} +2 -2
  107. package/dist/cli/chunks/{chunk-AQN5EDBM.js → chunk-IVJIHZSM.js} +1 -1
  108. package/dist/cli/chunks/{chunk-PHP4UJYP.js → chunk-JAPBSSFY.js} +1 -1
  109. package/dist/cli/chunks/{chunk-A2WOQO2N.js → chunk-JCE76MPP.js} +2 -2
  110. package/dist/cli/chunks/{chunk-A5J4XJS6.js → chunk-JPJEAK4G.js} +1 -1
  111. package/dist/cli/chunks/{chunk-3OAQPN2N.js → chunk-JYKQVYX2.js} +2 -2
  112. package/dist/cli/chunks/{chunk-MQGEZA2A.js → chunk-K55EAWZ5.js} +2 -2
  113. package/dist/cli/chunks/chunk-KCB6P463.js +3 -0
  114. package/dist/cli/chunks/{chunk-L375O3CZ.js → chunk-KIDOBLUO.js} +2 -2
  115. package/dist/cli/chunks/{chunk-NLDFNAOS.js → chunk-KYVIOC3C.js} +2 -2
  116. package/dist/cli/chunks/{chunk-CQMHDAJS.js → chunk-L2TDHJR3.js} +2 -2
  117. package/dist/cli/chunks/{chunk-FE3AIZI6.js → chunk-L4D3TPFP.js} +1 -1
  118. package/dist/cli/chunks/{chunk-VLOIEVER.js → chunk-LAY7NCQK.js} +3 -3
  119. package/dist/cli/chunks/{chunk-WT3JC4A6.js → chunk-LCCTJ2PC.js} +2 -2
  120. package/dist/cli/chunks/{chunk-VML4SG3X.js → chunk-LJCEDTUM.js} +3 -3
  121. package/dist/cli/chunks/{chunk-NF6AFIAX.js → chunk-LMAEMVPA.js} +1 -1
  122. package/dist/cli/chunks/{chunk-2XYTS2WY.js → chunk-LZWJ5BMP.js} +2 -2
  123. package/dist/cli/chunks/{chunk-PHAQWAEV.js → chunk-MP3FSUNB.js} +2 -2
  124. package/dist/cli/chunks/{chunk-IJ2EXSMO.js → chunk-MQCTLTGE.js} +2 -2
  125. package/dist/cli/chunks/{chunk-GRIPCYW5.js → chunk-MQTA6KIO.js} +1 -1
  126. package/dist/cli/chunks/{chunk-GGDKOJVF.js → chunk-NBUXM5X6.js} +10 -6
  127. package/dist/cli/chunks/{chunk-DPYDUKVZ.js → chunk-NHRF3V4B.js} +2 -2
  128. package/dist/cli/chunks/chunk-NMY4KTWA.js +16 -0
  129. package/dist/cli/chunks/chunk-NYS2GUNO.js +2 -0
  130. package/dist/cli/chunks/{chunk-AUZXRFOX.js → chunk-ONPPBLRB.js} +2 -2
  131. package/dist/cli/chunks/{chunk-HGBJ2QQ4.js → chunk-OPDZBRIL.js} +2 -2
  132. package/dist/cli/chunks/{chunk-DXVZBJE4.js → chunk-OQ4S6B7P.js} +1 -1
  133. package/dist/cli/chunks/{chunk-Y2WMPEUP.js → chunk-ORBODZSO.js} +2 -2
  134. package/dist/cli/chunks/{chunk-IJOFZBXD.js → chunk-ORFL3YXB.js} +2 -2
  135. package/dist/cli/chunks/{chunk-BMWAWZAN.js → chunk-P7DXVL2S.js} +2 -2
  136. package/dist/cli/chunks/chunk-PEMSXSP2.js +4 -0
  137. package/dist/cli/chunks/chunk-PS6WFCA4.js +6 -0
  138. package/dist/cli/chunks/{chunk-DPV33C77.js → chunk-Q2RBOC7V.js} +2 -2
  139. package/dist/cli/chunks/{chunk-3AYYGR6W.js → chunk-QLKUCMZC.js} +1 -1
  140. package/dist/cli/chunks/{chunk-EVCFUYYK.js → chunk-QLYO3H7E.js} +9 -9
  141. package/dist/cli/chunks/{chunk-3SH23PS3.js → chunk-QS5KZYUZ.js} +2 -2
  142. package/dist/cli/chunks/{chunk-3YNP33GB.js → chunk-R363XXGH.js} +2 -2
  143. package/dist/cli/chunks/chunk-RD5BYLN7.js +2 -0
  144. package/dist/cli/chunks/{chunk-MS3Z2CP5.js → chunk-RFDFET3O.js} +2 -2
  145. package/dist/cli/chunks/{chunk-ZLBBX24Q.js → chunk-RHIQ6QO5.js} +357 -351
  146. package/dist/cli/chunks/chunk-RLB7K7QP.js +2 -0
  147. package/dist/cli/chunks/{chunk-3YASZPLO.js → chunk-RUTO67PT.js} +2 -2
  148. package/dist/cli/chunks/{chunk-V7GNUVYI.js → chunk-RV6HSMKJ.js} +1 -1
  149. package/dist/cli/chunks/{chunk-4PT5KNXL.js → chunk-SOSJWM3E.js} +4 -4
  150. package/dist/cli/chunks/{chunk-6ZIDZ4TJ.js → chunk-SV5BUYHH.js} +2 -2
  151. package/dist/cli/chunks/{chunk-ZTC5FBL6.js → chunk-TL5GV3PR.js} +8 -8
  152. package/dist/cli/chunks/{chunk-GKPRECLL.js → chunk-TLUIO37P.js} +2 -2
  153. package/dist/cli/chunks/{chunk-FWYJ6UDX.js → chunk-TUDENMAE.js} +2 -2
  154. package/dist/cli/chunks/chunk-TVLOED6O.js +2 -0
  155. package/dist/cli/chunks/{chunk-3QD7U3FY.js → chunk-UB6DQGWM.js} +2 -2
  156. package/dist/cli/chunks/{chunk-SAPIRK2G.js → chunk-UHHMAKPE.js} +1 -1
  157. package/dist/cli/chunks/{chunk-35MDATQE.js → chunk-ULCHPPW2.js} +1 -1
  158. package/dist/cli/chunks/chunk-V3OLS2NG.js +2 -0
  159. package/dist/cli/chunks/{chunk-UXZEVIFX.js → chunk-VAYZ5QIE.js} +1 -1
  160. package/dist/cli/chunks/{chunk-VH3EB6ZG.js → chunk-VCONCVSY.js} +3 -3
  161. package/dist/cli/chunks/{chunk-QPV3OKX2.js → chunk-VVF337SV.js} +2 -2
  162. package/dist/cli/chunks/{chunk-XNHB6TLC.js → chunk-WKDWRRDT.js} +2 -2
  163. package/dist/cli/chunks/{chunk-RUJLVJDE.js → chunk-X2DR27AY.js} +2 -2
  164. package/dist/cli/chunks/{chunk-47GEI2LT.js → chunk-X33F7NXH.js} +3 -3
  165. package/dist/cli/chunks/{chunk-MB4VFAJC.js → chunk-XBEI2JBA.js} +2 -2
  166. package/dist/cli/chunks/{chunk-OQDC7GCM.js → chunk-XBFQJZWX.js} +2 -2
  167. package/dist/cli/chunks/{chunk-EAYQCBXL.js → chunk-XFPQIWEH.js} +3 -3
  168. package/dist/cli/chunks/{chunk-2KWI3MT3.js → chunk-XPB5BVU6.js} +2 -2
  169. package/dist/cli/chunks/{chunk-DL5JENWD.js → chunk-XQ53PZEF.js} +3 -3
  170. package/dist/cli/chunks/{chunk-BZFT4QDQ.js → chunk-XZ46CI35.js} +2 -2
  171. package/dist/cli/chunks/chunk-YLNYPQDR.js +2 -0
  172. package/dist/cli/chunks/{chunk-EOR3RECZ.js → chunk-YNG7E26C.js} +2 -2
  173. package/dist/cli/chunks/{chunk-6JFGB2JB.js → chunk-YXU35GGD.js} +1 -1
  174. package/dist/cli/chunks/{chunk-JNMUVBAJ.js → chunk-ZCP4P6O2.js} +2 -2
  175. package/dist/cli/chunks/{chunk-Y7GPLOXB.js → chunk-ZL5LJT7D.js} +2 -2
  176. package/dist/cli/chunks/{chunk-PCCIZFD7.js → chunk-ZOUEQ6DL.js} +1 -1
  177. package/dist/cli/chunks/{chunk-FQKEZVN6.js → chunk-ZSBD4FUX.js} +2 -2
  178. package/dist/cli/chunks/chunk-ZTB32K5N.js +5 -0
  179. package/dist/cli/chunks/{chunk-X52TMBHU.js → chunk-ZUTFHGEO.js} +1 -1
  180. package/dist/cli/chunks/ci-GEJCXMBK.js +81 -0
  181. package/dist/cli/chunks/{ci-config-XDDZOOEI.js → ci-config-2ZVV4OXL.js} +2 -2
  182. package/dist/cli/chunks/{ci-output-7ZUQI4U6.js → ci-output-E45OGVPR.js} +2 -2
  183. package/dist/cli/chunks/{circuit-breaker-ALXKCFAL.js → circuit-breaker-X73ITYZC.js} +2 -2
  184. package/dist/cli/chunks/{claude-flow-setup-RL7K2NI2.js → claude-flow-setup-W4PPH46C.js} +2 -2
  185. package/dist/cli/chunks/client-6XKSQ4JT.js +2 -0
  186. package/dist/cli/chunks/{cline-installer-2Z2QQKC3.js → cline-installer-NUEPMWDE.js} +2 -2
  187. package/dist/cli/chunks/{code-QSZTDINQ.js → code-6WQHBS7G.js} +3 -3
  188. package/dist/cli/chunks/{code-index-extractor-5CGR5D3Y.js → code-index-extractor-BXQIFIFT.js} +2 -2
  189. package/dist/cli/chunks/{codex-installer-7JLSEDE5.js → codex-installer-Z337R2KH.js} +2 -2
  190. package/dist/cli/chunks/{completions-U4NBSXEB.js → completions-F5DMYFHV.js} +2 -2
  191. package/dist/cli/chunks/{complexity-analyzer-WYZD2YSY.js → complexity-analyzer-W2SYPZDI.js} +2 -2
  192. package/dist/cli/chunks/{continuedev-installer-UPXINJFT.js → continuedev-installer-ZCHUIFTN.js} +2 -2
  193. package/dist/cli/chunks/{copilot-installer-WIVYQRIF.js → copilot-installer-M5JNODXF.js} +2 -2
  194. package/dist/cli/chunks/core-handlers-OJYW4Y6M.js +2 -0
  195. package/dist/cli/chunks/{cost-tracker-RIN4JDDM.js → cost-tracker-LSYTHBHV.js} +2 -2
  196. package/dist/cli/chunks/coverage-PGMRS5SS.js +49 -0
  197. package/dist/cli/chunks/cross-domain-router-QVUPQ2SC.js +2 -0
  198. package/dist/cli/chunks/{cursor-installer-POM7NGCC.js → cursor-installer-XPUA73UW.js} +2 -2
  199. package/dist/cli/chunks/{daemon-HFGKQ6LB.js → daemon-ITKDIYMW.js} +5 -5
  200. package/dist/cli/chunks/daemon-QBYTCIMH.js +10 -0
  201. package/dist/cli/chunks/{dag-attention-scheduler-HJXM7Q5P.js → dag-attention-scheduler-T55AXLD6.js} +2 -2
  202. package/dist/cli/chunks/{detect-XKQGLZYN.js → detect-DR7J6K4O.js} +2 -2
  203. package/dist/cli/chunks/{dist-node-SSKB53QL.js → dist-node-LAJJBOUT.js} +2 -2
  204. package/dist/cli/chunks/{domain-handler-6BNDHATU.js → domain-handler-OMSHCRMK.js} +2 -2
  205. package/dist/cli/chunks/{domain-plugins-DOX54YE3.js → domain-plugins-EQXSKC5K.js} +2 -2
  206. package/dist/cli/chunks/{domain-transfer-FW4ZX3Z7.js → domain-transfer-FKRAGVSW.js} +2 -2
  207. package/dist/cli/chunks/dream-3UABDRZJ.js +2 -0
  208. package/dist/cli/chunks/embed-and-insert-pattern-JZFPCNL3.js +3 -0
  209. package/dist/cli/chunks/{eval-K7E4XXBS.js → eval-JSNNASBW.js} +2 -2
  210. package/dist/cli/chunks/experience-capture-middleware-UPD3IZBK.js +40 -0
  211. package/dist/cli/chunks/{fast-paths-5JXXTYAG.js → fast-paths-YNMIBS2E.js} +2 -2
  212. package/dist/cli/chunks/{feature-flags-2CR3CO23.js → feature-flags-SRLXDKBI.js} +2 -2
  213. package/dist/cli/chunks/{feature-flags-RB72LHOJ.js → feature-flags-VIR7O4L7.js} +2 -2
  214. package/dist/cli/chunks/file-discovery-ZFGZTKZ4.js +2 -0
  215. package/dist/cli/chunks/{fleet-SDU7QEOA.js → fleet-K2ED46EL.js} +3 -3
  216. package/dist/cli/chunks/{gnn-wrapper-AWCFODUV.js → gnn-wrapper-QCU4ZRYW.js} +2 -2
  217. package/dist/cli/chunks/{heartbeat-handler-A4PJ3NFP.js → heartbeat-handler-YYQI4WZM.js} +4 -4
  218. package/dist/cli/chunks/heartbeat-scheduler-MJ6MTPDF.js +2 -0
  219. package/dist/cli/chunks/hnsw-adapter-FQWJCFVW.js +2 -0
  220. package/dist/cli/chunks/hnsw-index-NJYKJUHC.js +2 -0
  221. package/dist/cli/chunks/{hnsw-legacy-bridge-KRS7SSFM.js → hnsw-legacy-bridge-C5TJSWTZ.js} +2 -2
  222. package/dist/cli/chunks/{hnswlib-node-OGGCPKPO.js → hnswlib-node-SE3MJJYS.js} +2 -2
  223. package/dist/cli/chunks/{hooks-XNRNMUBW.js → hooks-C572SRDH.js} +43 -43
  224. package/dist/cli/chunks/hybrid-backend-SL7RFID7.js +2 -0
  225. package/dist/cli/chunks/{hypergraph-engine-X35LTXYT.js → hypergraph-engine-35A6G3M5.js} +2 -2
  226. package/dist/cli/chunks/{hypergraph-handler-M6THKAG6.js → hypergraph-handler-U2756CWI.js} +3 -3
  227. package/dist/cli/chunks/impact-analyzer-5ZJTXPVC.js +2 -0
  228. package/dist/cli/chunks/init-handler-PCLYQUSB.js +88 -0
  229. package/dist/cli/chunks/init-wizard-MQMDSIOF.js +2 -0
  230. package/dist/cli/chunks/kernel-MEJ5GMRH.js +2 -0
  231. package/dist/cli/chunks/{kilocode-installer-TEPR2ZJD.js → kilocode-installer-32PX5YH7.js} +2 -2
  232. package/dist/cli/chunks/{kiro-installer-RUKHGDEE.js → kiro-installer-C4ROMMUS.js} +2 -2
  233. package/dist/cli/chunks/knowledge-graph-XUBZSEZE.js +2 -0
  234. package/dist/cli/chunks/learning-GEPVZGJQ.js +122 -0
  235. package/dist/cli/chunks/{llm-router-7GECMDCP.js → llm-router-XRKTTJTX.js} +4 -4
  236. package/dist/cli/chunks/llm-router-service-QZAPAEPX.js +2 -0
  237. package/dist/cli/chunks/{load-NTJ4Y4ZR.js → load-XVH6HW7E.js} +2 -2
  238. package/dist/cli/chunks/load-test-OVXIQ3AF.js +2 -0
  239. package/dist/cli/chunks/{mcp-4335GTTG.js → mcp-IULSTM4Z.js} +2 -2
  240. package/dist/cli/chunks/{memory-HYC4M4XS.js → memory-6K7IAU4T.js} +5 -5
  241. package/dist/cli/chunks/memory-backend-TRPOMPK4.js +2 -0
  242. package/dist/cli/chunks/memory-handlers-CG6DRLAW.js +2 -0
  243. package/dist/cli/chunks/{multi-model-executor-T7FYKM6T.js → multi-model-executor-VZDUYPLX.js} +2 -2
  244. package/dist/cli/chunks/{opencode-installer-3USXVT5M.js → opencode-installer-QUTXKNH4.js} +2 -2
  245. package/dist/cli/chunks/orchestrator-PCKKUWOP.js +452 -0
  246. package/dist/cli/chunks/pattern-null-store-JWYBRBZG.js +2 -0
  247. package/dist/cli/chunks/{pattern-usage-recorder-CMZLPX2K.js → pattern-usage-recorder-PX5HQVRL.js} +2 -2
  248. package/dist/cli/chunks/{pipeline-BTRZOVSL.js → pipeline-O562GTOG.js} +2 -2
  249. package/dist/cli/chunks/{platform-2MCRKC25.js → platform-PM7Q2AZS.js} +2 -2
  250. package/dist/cli/chunks/plugin-OTYTFGPY.js +27 -0
  251. package/dist/cli/chunks/{prime-radiant-advanced-wasm-TXFEMBP6.js → prime-radiant-advanced-wasm-6CFXTHC2.js} +2 -2
  252. package/dist/cli/chunks/project-root-VVSTHIP4.js +2 -0
  253. package/dist/cli/chunks/protocol-executor-PXZCLZD3.js +2 -0
  254. package/dist/cli/chunks/{protocol-handler-DZ26OYVZ.js → protocol-handler-PPGNSAOS.js} +2 -2
  255. package/dist/cli/chunks/{prove-QWONEJWX.js → prove-WQ3BKRZG.js} +2 -2
  256. package/dist/cli/chunks/qe-reasoning-bank-42FRS5V3.js +2 -0
  257. package/dist/cli/chunks/{quality-WFH54FY7.js → quality-C5WUU3AA.js} +2 -2
  258. package/dist/cli/chunks/{quality-gate-ONJB7XU7.js → quality-gate-WSSRKD5U.js} +3 -3
  259. package/dist/cli/chunks/queen-coordinator-UI3B7DI6.js +2 -0
  260. package/dist/cli/chunks/real-embeddings-CFQE7IRQ.js +2 -0
  261. package/dist/cli/chunks/{ref-validation-HW5Y55ZC.js → ref-validation-DHKHXVZT.js} +2 -2
  262. package/dist/cli/chunks/{roocode-installer-5OABDNZT.js → roocode-installer-3PPODABV.js} +2 -2
  263. package/dist/cli/chunks/router-HYRPWLAY.js +2 -0
  264. package/dist/cli/chunks/routing-feedback-BPZ5R6F3.js +2 -0
  265. package/dist/cli/chunks/{routing-handler-CVHVOQTC.js → routing-handler-JNXTGT6T.js} +2 -2
  266. package/dist/cli/chunks/{ruvector-commands-KKDKFGIQ.js → ruvector-commands-6YLROPVP.js} +2 -2
  267. package/dist/cli/chunks/rvf-dual-writer-DEKDQ6KO.js +2 -0
  268. package/dist/cli/chunks/rvf-migration-adapter-L53VBS7I.js +2 -0
  269. package/dist/cli/chunks/rvf-migration-coordinator-4DWB4WRK.js +2 -0
  270. package/dist/cli/chunks/rvf-native-adapter-I6RUGD2D.js +2 -0
  271. package/dist/cli/chunks/{rvf-store-integrity-UGUXKIFX.js → rvf-store-integrity-YKR2ZNBF.js} +2 -2
  272. package/dist/cli/chunks/safe-db-KS65XDCP.js +2 -0
  273. package/dist/cli/chunks/schedule-KD2VN6GB.js +2 -0
  274. package/dist/cli/chunks/scheduler-ZH3RMUHY.js +2 -0
  275. package/dist/cli/chunks/{security-7723AZZ4.js → security-PWQTGDRU.js} +3 -3
  276. package/dist/cli/chunks/shared-rvf-adapter-LNRLFP5I.js +2 -0
  277. package/dist/cli/chunks/{shared-rvf-dual-writer-ZSHYG5IA.js → shared-rvf-dual-writer-GWU6YQNS.js} +2 -2
  278. package/dist/cli/chunks/sqlite-persistence-6DTVME5D.js +2 -0
  279. package/dist/cli/chunks/{standalone-memory-MHZEEYMK.js → standalone-memory-46KKBSSV.js} +2 -2
  280. package/dist/cli/chunks/{status-handler-JKXPJ22K.js → status-handler-35T5FTDQ.js} +2 -2
  281. package/dist/cli/chunks/{structural-health-J4RKCYWF.js → structural-health-P7QPQWLO.js} +2 -2
  282. package/dist/cli/chunks/{sync-PDPORHVN.js → sync-W6Z4R4PL.js} +2 -2
  283. package/dist/cli/chunks/sync-Y43EWBSY.js +2 -0
  284. package/dist/cli/chunks/{task-handler-VERADM44.js → task-handler-5CX3ZYT7.js} +2 -2
  285. package/dist/cli/chunks/{task-handlers-4RUCWUR2.js → task-handlers-DQZGOJNE.js} +3 -3
  286. package/dist/cli/chunks/{test-DMBJFQNL.js → test-TPP53VVV.js} +12 -12
  287. package/dist/cli/chunks/{test-scheduling-LUPTVGCD.js → test-scheduling-WBV4UMQH.js} +3 -3
  288. package/dist/cli/chunks/token-bootstrap-GIIDXHLC.js +2 -0
  289. package/dist/cli/chunks/{token-usage-VOA34IKM.js → token-usage-AKK37RB7.js} +2 -2
  290. package/dist/cli/chunks/{transformers-GU4TYAN5.js → transformers-7MASPELS.js} +2 -2
  291. package/dist/cli/chunks/{tree-sitter-wasm-parser-MZPXAH7C.js → tree-sitter-wasm-parser-YZKD6UGB.js} +2 -2
  292. package/dist/cli/chunks/{types-K4FLXR2K.js → types-AZ3BTXDP.js} +2 -2
  293. package/dist/cli/chunks/unified-memory-FCX7NLFZ.js +2 -0
  294. package/dist/cli/chunks/unified-memory-hnsw-VU5QJK37.js +2 -0
  295. package/dist/cli/chunks/unified-persistence-FM376LGE.js +2 -0
  296. package/dist/cli/chunks/{upgrade-M3ATDRMK.js → upgrade-L7OTDKEK.js} +2 -2
  297. package/dist/cli/chunks/{validate-AAP773B3.js → validate-O3QVFIGP.js} +2 -2
  298. package/dist/cli/chunks/{validate-swarm-7RGAZX5F.js → validate-swarm-2UGBGLTX.js} +2 -2
  299. package/dist/cli/chunks/visual-security-EU7Y3X46.js +2 -0
  300. package/dist/cli/chunks/{web-tree-sitter-GQMRHGGI.js → web-tree-sitter-J75IYPRO.js} +2 -2
  301. package/dist/cli/chunks/{windsurf-installer-HG6HF2GF.js → windsurf-installer-FQ5DBFCG.js} +2 -2
  302. package/dist/cli/chunks/witness-chain-CSEBT52D.js +2 -0
  303. package/dist/cli/chunks/{witness-chain-WKU3ZIBQ.js → witness-chain-I7TN4MXZ.js} +2 -2
  304. package/dist/cli/chunks/witness-chain-repair-D3NE3NQK.js +2 -0
  305. package/dist/cli/chunks/{witness-chain-verifier-Q2KW3QEQ.js → witness-chain-verifier-RU2WOP5M.js} +2 -2
  306. package/dist/cli/chunks/witness-key-manager-IHQB2FR5.js +2 -0
  307. package/dist/cli/chunks/{workflow-CX6SHFBW.js → workflow-6BWTNVV6.js} +28 -28
  308. package/dist/cli/chunks/workflow-orchestrator-ALNKOM3N.js +2 -0
  309. package/dist/cli/chunks/wrappers-URVP25VU.js +2 -0
  310. package/dist/cli/commands/ci.js +47 -25
  311. package/dist/cli/commands/coverage.d.ts +1 -28
  312. package/dist/cli/commands/coverage.js +63 -134
  313. package/dist/cli/commands/daemon.js +7 -1
  314. package/dist/cli/commands/hooks-handlers/stats-hooks.d.ts +15 -0
  315. package/dist/cli/commands/hooks-handlers/stats-hooks.js +54 -2
  316. package/dist/cli/commands/learning.js +47 -7
  317. package/dist/cli/commands/test.js +6 -7
  318. package/dist/cli/commands/workflow.js +9 -5
  319. package/dist/cli/handlers/init-guard.d.ts +13 -0
  320. package/dist/cli/handlers/init-guard.js +23 -0
  321. package/dist/cli/handlers/init-handler.d.ts +3 -0
  322. package/dist/cli/handlers/init-handler.js +9 -0
  323. package/dist/cli/handlers/interfaces.js +5 -1
  324. package/dist/cli/scheduler/persistent-scheduler.d.ts +6 -2
  325. package/dist/cli/scheduler/persistent-scheduler.js +107 -41
  326. package/dist/cli/utils/ci-output.d.ts +8 -1
  327. package/dist/cli/utils/ci-output.js +13 -2
  328. package/dist/cli/utils/coverage-data.d.ts +3 -0
  329. package/dist/cli/utils/coverage-data.js +14 -39
  330. package/dist/cli/utils/coverage-verdict.d.ts +130 -0
  331. package/dist/cli/utils/coverage-verdict.js +193 -0
  332. package/dist/cli/utils/file-discovery.js +5 -0
  333. package/dist/coordination/deterministic-actions.js +24 -13
  334. package/dist/coordination/handlers/code-intelligence-handlers.d.ts +8 -0
  335. package/dist/coordination/handlers/code-intelligence-handlers.js +39 -0
  336. package/dist/coordination/handlers/coverage-handlers.js +34 -6
  337. package/dist/coordination/handlers/coverage-runner.d.ts +22 -0
  338. package/dist/coordination/handlers/coverage-runner.js +105 -10
  339. package/dist/coordination/handlers/coverage-target.d.ts +1 -0
  340. package/dist/coordination/handlers/coverage-target.js +4 -1
  341. package/dist/coordination/handlers/handler-types.d.ts +9 -0
  342. package/dist/coordination/handlers/handler-utils.d.ts +14 -1
  343. package/dist/coordination/handlers/handler-utils.js +46 -22
  344. package/dist/coordination/handlers/quality-handlers.js +108 -18
  345. package/dist/coordination/handlers/test-execution-handlers.js +4 -1
  346. package/dist/coordination/protocols/defect-investigation.d.ts +2 -1
  347. package/dist/coordination/protocols/defect-investigation.js +6 -3
  348. package/dist/coordination/protocols/quality-gate.js +10 -6
  349. package/dist/coordination/result-saver.d.ts +22 -0
  350. package/dist/coordination/result-saver.js +113 -43
  351. package/dist/coordination/task-executor.d.ts +7 -0
  352. package/dist/coordination/task-executor.js +32 -3
  353. package/dist/domains/code-intelligence/plugin.js +4 -0
  354. package/dist/domains/code-intelligence/services/metric-collector/index.js +9 -2
  355. package/dist/domains/code-intelligence/services/metric-collector/interfaces.d.ts +21 -0
  356. package/dist/domains/code-intelligence/services/metric-collector/interfaces.js +25 -0
  357. package/dist/domains/code-intelligence/services/metric-collector/loc-counter.d.ts +12 -0
  358. package/dist/domains/code-intelligence/services/metric-collector/loc-counter.js +69 -3
  359. package/dist/domains/code-intelligence/services/metric-collector/test-counter.js +4 -1
  360. package/dist/domains/coverage-analysis/collected-metrics.d.ts +33 -0
  361. package/dist/domains/coverage-analysis/collected-metrics.js +36 -0
  362. package/dist/domains/coverage-analysis/coordinator.js +18 -6
  363. package/dist/domains/coverage-analysis/interfaces.d.ts +44 -0
  364. package/dist/domains/coverage-analysis/interfaces.js +6 -1
  365. package/dist/domains/coverage-analysis/services/coverage-analyzer.js +61 -34
  366. package/dist/domains/coverage-analysis/services/gap-detector.js +7 -2
  367. package/dist/domains/defect-intelligence/plugin.js +4 -0
  368. package/dist/domains/defect-intelligence/services/defect-predictor.js +6 -4
  369. package/dist/domains/learning-optimization/coordinator.js +4 -0
  370. package/dist/domains/learning-optimization/plugin.js +4 -0
  371. package/dist/domains/quality-assessment/coordinator-rl-integration.d.ts +14 -0
  372. package/dist/domains/quality-assessment/coordinator-rl-integration.js +54 -16
  373. package/dist/domains/quality-assessment/coordinator.js +10 -6
  374. package/dist/domains/quality-assessment/coverage-report-event.d.ts +32 -8
  375. package/dist/domains/quality-assessment/coverage-report-event.js +28 -6
  376. package/dist/domains/quality-assessment/index.d.ts +1 -1
  377. package/dist/domains/quality-assessment/interfaces.d.ts +46 -0
  378. package/dist/domains/quality-assessment/quality-evidence.d.ts +48 -2
  379. package/dist/domains/quality-assessment/quality-evidence.js +62 -0
  380. package/dist/domains/quality-assessment/services/quality-analyzer.d.ts +23 -2
  381. package/dist/domains/quality-assessment/services/quality-analyzer.js +192 -109
  382. package/dist/domains/security-compliance/services/scanners/dast-scanner.js +22 -16
  383. package/dist/domains/test-execution/interfaces.d.ts +10 -6
  384. package/dist/domains/test-execution/plugin.js +4 -0
  385. package/dist/domains/test-execution/services/test-executor.js +152 -102
  386. package/dist/domains/test-generation/coordinator.js +4 -0
  387. package/dist/domains/test-generation/plugin.js +4 -0
  388. package/dist/feedback/coverage-learner.js +4 -1
  389. package/dist/feedback/coverage-session-provenance.d.ts +29 -0
  390. package/dist/feedback/coverage-session-provenance.js +39 -0
  391. package/dist/init/orchestrator.js +2 -0
  392. package/dist/init/phases/09-assets.d.ts +4 -0
  393. package/dist/init/phases/09-assets.js +35 -0
  394. package/dist/init/retired-assets.d.ts +86 -0
  395. package/dist/init/retired-assets.js +230 -0
  396. package/dist/init/skills-installer.d.ts +2 -0
  397. package/dist/init/skills-installer.js +4 -0
  398. package/dist/init/types.d.ts +3 -0
  399. package/dist/integrations/ruvector/rvf-native-adapter.d.ts +2 -0
  400. package/dist/integrations/ruvector/rvf-native-adapter.js +5 -0
  401. package/dist/integrations/ruvector/server-client.js +4 -12
  402. package/dist/kernel/project-root.d.ts +17 -0
  403. package/dist/kernel/project-root.js +54 -2
  404. package/dist/kernel/shared-dirs.d.ts +66 -0
  405. package/dist/kernel/shared-dirs.js +168 -0
  406. package/dist/learning/daily-log.js +2 -1
  407. package/dist/learning/experience-capture-middleware.d.ts +22 -0
  408. package/dist/learning/experience-capture-middleware.js +35 -0
  409. package/dist/learning/learnable-result.d.ts +16 -0
  410. package/dist/learning/learnable-result.js +24 -0
  411. package/dist/learning/pattern-mutation-error.d.ts +8 -0
  412. package/dist/learning/pattern-mutation-error.js +12 -0
  413. package/dist/learning/qe-reasoning-bank.d.ts +10 -0
  414. package/dist/learning/qe-reasoning-bank.js +50 -1
  415. package/dist/learning/rvf-reconcile.d.ts +39 -0
  416. package/dist/learning/rvf-reconcile.js +40 -0
  417. package/dist/learning/sqlite-persistence.d.ts +14 -0
  418. package/dist/learning/sqlite-persistence.js +36 -0
  419. package/dist/mcp/bundle.js +516 -504
  420. package/dist/mcp/handlers/domain-handler-configs.d.ts +31 -1
  421. package/dist/mcp/handlers/domain-handler-configs.js +37 -3
  422. package/dist/mcp/handlers/handler-factory.js +40 -14
  423. package/dist/mcp/protocol-server.js +27 -2
  424. package/dist/mcp/tool-cache-scope.d.ts +31 -0
  425. package/dist/mcp/tool-cache-scope.js +71 -0
  426. package/dist/mcp/tools/code-intelligence/analyze.js +5 -3
  427. package/dist/mcp/types.d.ts +4 -0
  428. package/dist/optimization/session-cache.d.ts +19 -1
  429. package/dist/optimization/session-cache.js +36 -2
  430. package/dist/plugins/cache.js +2 -1
  431. package/dist/plugins/sources/github.js +2 -1
  432. package/dist/plugins/sources/npm.js +2 -1
  433. package/dist/shared/aqe-managed-dirs.d.ts +24 -0
  434. package/dist/shared/aqe-managed-dirs.js +56 -0
  435. package/dist/shared/events/domain-events.d.ts +18 -3
  436. package/dist/shared/events/domain-events.js +4 -0
  437. package/dist/shared/http/http-client.d.ts +6 -0
  438. package/dist/shared/http/http-client.js +13 -15
  439. package/dist/shared/io/file-reader.d.ts +26 -0
  440. package/dist/shared/io/file-reader.js +111 -17
  441. package/dist/shared/llm/providers/response-deadline.d.ts +7 -2
  442. package/dist/shared/llm/providers/response-deadline.js +17 -5
  443. package/dist/shared/metrics/code-metrics.d.ts +24 -0
  444. package/dist/shared/metrics/code-metrics.js +93 -6
  445. package/dist/shared/metrics/index.d.ts +1 -1
  446. package/dist/workers/interfaces.d.ts +9 -1
  447. package/dist/workers/quality-daemon/coverage-delta.d.ts +4 -3
  448. package/dist/workers/quality-daemon/coverage-delta.js +13 -6
  449. package/dist/workers/quality-daemon/index.js +6 -5
  450. package/dist/workers/quality-daemon/notification-service.js +3 -3
  451. package/dist/workers/quality-daemon/persistent-memory.d.ts +2 -2
  452. package/dist/workers/quality-daemon/persistent-memory.js +2 -2
  453. package/dist/workers/worker-manager.js +5 -1
  454. package/dist/workers/workers/coverage-tracker.js +69 -33
  455. package/dist/workers/workers/regression-monitor.d.ts +18 -1
  456. package/dist/workers/workers/regression-monitor.js +276 -117
  457. package/package.json +1 -1
  458. package/dist/cli/chunks/adapter-EGIPTX5H.js +0 -2
  459. package/dist/cli/chunks/aqe-learning-engine-WP4GCBDT.js +0 -2
  460. package/dist/cli/chunks/base-6ORFD62I.js +0 -2
  461. package/dist/cli/chunks/browser-workflow-PIXGERWP.js +0 -2
  462. package/dist/cli/chunks/chunk-2WFTZSRT.js +0 -2
  463. package/dist/cli/chunks/chunk-7YB2KELI.js +0 -5
  464. package/dist/cli/chunks/chunk-BBL6YXD3.js +0 -2
  465. package/dist/cli/chunks/chunk-BJ5P4IV2.js +0 -2
  466. package/dist/cli/chunks/chunk-DFPL5N3Q.js +0 -16
  467. package/dist/cli/chunks/chunk-DLY4YEN3.js +0 -2
  468. package/dist/cli/chunks/chunk-ERGWWI4Y.js +0 -3
  469. package/dist/cli/chunks/chunk-KZVJW2SD.js +0 -2
  470. package/dist/cli/chunks/chunk-L336HFFE.js +0 -2
  471. package/dist/cli/chunks/chunk-N2TJNIHA.js +0 -2
  472. package/dist/cli/chunks/chunk-RCXMUEZN.js +0 -3
  473. package/dist/cli/chunks/chunk-SEZLYRCS.js +0 -2
  474. package/dist/cli/chunks/chunk-TDLKXLJC.js +0 -4
  475. package/dist/cli/chunks/chunk-WOZIXXY5.js +0 -7
  476. package/dist/cli/chunks/ci-KP4GZKJ7.js +0 -81
  477. package/dist/cli/chunks/client-C3KHVRM6.js +0 -2
  478. package/dist/cli/chunks/core-handlers-KSQM6Q6S.js +0 -2
  479. package/dist/cli/chunks/coverage-SPFVHRRU.js +0 -43
  480. package/dist/cli/chunks/coverage-target-GSRBNHXE.js +0 -2
  481. package/dist/cli/chunks/cross-domain-router-CTGNOVCF.js +0 -2
  482. package/dist/cli/chunks/daemon-M5TD5Y6T.js +0 -10
  483. package/dist/cli/chunks/dream-MIK2E4UL.js +0 -2
  484. package/dist/cli/chunks/embed-and-insert-pattern-QST77T2B.js +0 -3
  485. package/dist/cli/chunks/experience-capture-middleware-X66IYSRV.js +0 -40
  486. package/dist/cli/chunks/file-discovery-3NHRUQQB.js +0 -2
  487. package/dist/cli/chunks/heartbeat-scheduler-OCKRACUW.js +0 -2
  488. package/dist/cli/chunks/hnsw-adapter-X67XG73C.js +0 -2
  489. package/dist/cli/chunks/hnsw-index-I7KCQBQR.js +0 -2
  490. package/dist/cli/chunks/hybrid-backend-FOUHTKAK.js +0 -2
  491. package/dist/cli/chunks/impact-analyzer-GXYVX46O.js +0 -2
  492. package/dist/cli/chunks/init-handler-2AXMXHYF.js +0 -86
  493. package/dist/cli/chunks/init-wizard-C2MRX2QG.js +0 -2
  494. package/dist/cli/chunks/kernel-Q2IUDIDC.js +0 -2
  495. package/dist/cli/chunks/knowledge-graph-E2Z6K5EE.js +0 -2
  496. package/dist/cli/chunks/learning-BEA26RNA.js +0 -122
  497. package/dist/cli/chunks/llm-router-service-YATYFEDD.js +0 -2
  498. package/dist/cli/chunks/load-test-LV77JXWA.js +0 -2
  499. package/dist/cli/chunks/memory-backend-XME3X3QX.js +0 -2
  500. package/dist/cli/chunks/memory-handlers-VG47X5DX.js +0 -2
  501. package/dist/cli/chunks/orchestrator-VHUXUYIM.js +0 -452
  502. package/dist/cli/chunks/pattern-null-store-TAXMLENP.js +0 -2
  503. package/dist/cli/chunks/plugin-2VAYWAO3.js +0 -27
  504. package/dist/cli/chunks/project-root-CFFPBGPX.js +0 -2
  505. package/dist/cli/chunks/protocol-executor-ML76QAVQ.js +0 -2
  506. package/dist/cli/chunks/qe-reasoning-bank-LUZH6RYV.js +0 -2
  507. package/dist/cli/chunks/queen-coordinator-EWXNIXB6.js +0 -2
  508. package/dist/cli/chunks/real-embeddings-GZV4VKK4.js +0 -2
  509. package/dist/cli/chunks/router-MXOBVEBF.js +0 -2
  510. package/dist/cli/chunks/routing-feedback-T6CCRUEK.js +0 -2
  511. package/dist/cli/chunks/rvf-dual-writer-WHXVT3V3.js +0 -2
  512. package/dist/cli/chunks/rvf-migration-adapter-JFPWIRCG.js +0 -2
  513. package/dist/cli/chunks/rvf-migration-coordinator-D4KUBNRZ.js +0 -2
  514. package/dist/cli/chunks/rvf-native-adapter-KOXR7TJL.js +0 -2
  515. package/dist/cli/chunks/safe-db-CI6IPSIN.js +0 -2
  516. package/dist/cli/chunks/schedule-X4HW6TVJ.js +0 -2
  517. package/dist/cli/chunks/scheduler-KCNJ2ON3.js +0 -2
  518. package/dist/cli/chunks/shared-rvf-adapter-KEQ5CLNI.js +0 -2
  519. package/dist/cli/chunks/sqlite-persistence-PGHU6VUR.js +0 -2
  520. package/dist/cli/chunks/sync-EFWXMA2H.js +0 -2
  521. package/dist/cli/chunks/token-bootstrap-S346YBVO.js +0 -2
  522. package/dist/cli/chunks/unified-memory-6CK3TUNQ.js +0 -2
  523. package/dist/cli/chunks/unified-memory-hnsw-A7BWBGYN.js +0 -2
  524. package/dist/cli/chunks/unified-persistence-GEPMDBQZ.js +0 -2
  525. package/dist/cli/chunks/visual-security-L4J7LQWT.js +0 -2
  526. package/dist/cli/chunks/witness-chain-CDUMX623.js +0 -2
  527. package/dist/cli/chunks/witness-chain-repair-WNYH6O4L.js +0 -2
  528. package/dist/cli/chunks/witness-key-manager-NQ5DAAC4.js +0 -2
  529. package/dist/cli/chunks/workflow-orchestrator-USJDWVDR.js +0 -2
  530. package/dist/cli/chunks/wrappers-CZDI6Z3X.js +0 -2
  531. /package/.claude/skills/qe-court/evals/fixtures/seeded-mutant-delivery/{budget.test.ts → budget-tests.ts.fixture} +0 -0
  532. /package/.claude/skills/qe-court/evals/fixtures/seeded-mutant-delivery/{budget.ts → budget.ts.fixture} +0 -0
  533. /package/.claude/skills/testability-scoring/resources/templates/{testability-scoring.spec.template.js → testability-scoring-spec.template.js} +0 -0
  534. /package/assets/skills/qe-court/evals/fixtures/seeded-mutant-delivery/{budget.test.ts → budget-tests.ts.fixture} +0 -0
  535. /package/assets/skills/qe-court/evals/fixtures/seeded-mutant-delivery/{budget.ts → budget.ts.fixture} +0 -0
  536. /package/assets/skills/testability-scoring/resources/templates/{testability-scoring.spec.template.js → testability-scoring-spec.template.js} +0 -0
@@ -30,6 +30,18 @@ import * as os from 'os';
30
30
  import * as path from 'path';
31
31
  import { safeJsonParse } from '../../shared/safe-json.js';
32
32
  import { loadCoverageReportFile } from './coverage-target.js';
33
+ /**
34
+ * Outcome of a coverage run's tests (#1027 NB2): 'failed' when the runner's
35
+ * own result reports a failed test or test suite, 'passed' when it reports
36
+ * none — whatever the exit code (a coverage-threshold failure exits 1 with
37
+ * every test passing). Without counts (nyc), the exit code decides.
38
+ */
39
+ export function testRunStatus(run) {
40
+ if (typeof run.numFailedTests === 'number' || typeof run.numFailedTestSuites === 'number') {
41
+ return (run.numFailedTests ?? 0) > 0 || (run.numFailedTestSuites ?? 0) > 0 ? 'failed' : 'passed';
42
+ }
43
+ return run.exitedCleanly ? 'passed' : 'failed';
44
+ }
33
45
  const RESULTS_FILE = 'test-results.json';
34
46
  const STDERR_TAIL_BYTES = 2048;
35
47
  const STDERR_HEAD_BYTES = 4096;
@@ -92,13 +104,79 @@ function readDeps(projectRoot) {
92
104
  return {};
93
105
  }
94
106
  }
107
+ const RUNNER_DEPS = ['jest', '@jest/core', 'mocha', 'nyc', 'vitest'];
108
+ /**
109
+ * The project and its ancestors up to the repository / workspace root: the
110
+ * project itself, then each parent, stopping after the directory holding
111
+ * `.git` (or a `workspaces` manifest), at $HOME, or after `maxDepth` levels.
112
+ */
113
+ function projectAndAncestors(projectRoot, maxDepth = 10) {
114
+ const dirs = [];
115
+ let home = null;
116
+ try {
117
+ home = fs.realpathSync(os.homedir());
118
+ }
119
+ catch {
120
+ home = null;
121
+ }
122
+ let dir = path.resolve(projectRoot);
123
+ for (let i = 0; i <= maxDepth; i++) {
124
+ if (i > 0 && home !== null && dir === home)
125
+ break;
126
+ dirs.push(dir);
127
+ if (fs.existsSync(path.join(dir, '.git')) || isWorkspaceRoot(dir))
128
+ break;
129
+ const parent = path.dirname(dir);
130
+ if (parent === dir)
131
+ break;
132
+ dir = parent;
133
+ }
134
+ return dirs;
135
+ }
136
+ function isWorkspaceRoot(dir) {
137
+ try {
138
+ const pkg = JSON.parse(fs.readFileSync(path.join(dir, 'package.json'), 'utf-8'));
139
+ return pkg.workspaces !== undefined;
140
+ }
141
+ catch {
142
+ return false;
143
+ }
144
+ }
145
+ /**
146
+ * Dependencies that decide the runner (#1012): the package's own when it
147
+ * declares a test runner, otherwise those of the nearest ancestor (workspace
148
+ * root) that does. A package of a monorepo whose jest is declared only at the
149
+ * root runs jest, not the vitest default.
150
+ */
151
+ function readRunnerDeps(projectRoot) {
152
+ for (const dir of projectAndAncestors(projectRoot)) {
153
+ const deps = readDeps(dir);
154
+ if (RUNNER_DEPS.some(d => deps[d]))
155
+ return deps;
156
+ }
157
+ return {};
158
+ }
159
+ /**
160
+ * Every `node_modules/.bin` from the project up to the workspace root,
161
+ * nearest first. Runners that shell out to sibling tools (nyc → mocha) need
162
+ * the hoisted ones too (#1012).
163
+ */
164
+ export function runnerBinDirs(projectRoot) {
165
+ return projectAndAncestors(projectRoot)
166
+ .map(dir => path.join(dir, 'node_modules', '.bin'))
167
+ .filter(dir => fs.existsSync(dir));
168
+ }
169
+ /** Is the project installed with Yarn Plug'n'Play (no node_modules to resolve from)? */
170
+ function usesPlugNPlay(projectRoot) {
171
+ return projectAndAncestors(projectRoot).some(dir => fs.existsSync(path.join(dir, '.pnp.cjs')) || fs.existsSync(path.join(dir, '.pnp.js')));
172
+ }
95
173
  /**
96
174
  * Pick the runner and its argv. No shell is involved: `command` is the Node
97
175
  * binary and `args[0]` the runner's JS entry, so paths are passed verbatim.
98
176
  */
99
177
  export function buildJsCoverageInvocation(projectRoot, reportDir) {
100
178
  const resultsFile = path.join(reportDir, RESULTS_FILE);
101
- const deps = readDeps(projectRoot);
179
+ const deps = readRunnerDeps(projectRoot);
102
180
  let runner = 'vitest';
103
181
  let runnerArgs;
104
182
  let results = resultsFile;
@@ -117,8 +195,10 @@ export function buildJsCoverageInvocation(projectRoot, reportDir) {
117
195
  // vitest is the default — covers vitest, @vitest/coverage-v8, etc.
118
196
  // Plain `--outputFile=` (not `.json=`): it overrides a string, object, or
119
197
  // absent `outputFile` in the user's config alike.
198
+ // #1027 N4: vitest writes no coverage when a test fails unless asked;
199
+ // coverage from a failing suite is still a measurement (runStatus 'failed').
120
200
  runnerArgs = ['run', '--coverage', `--coverage.reportsDirectory=${reportDir}`,
121
- '--coverage.reporter=json', '--reporter=json', `--outputFile=${resultsFile}`];
201
+ '--coverage.reporter=json', '--coverage.reportOnFailure=true', '--reporter=json', `--outputFile=${resultsFile}`];
122
202
  }
123
203
  const bin = findPackageBin(projectRoot, runner === 'jest' ? 'jest' : runner);
124
204
  return {
@@ -128,15 +208,23 @@ export function buildJsCoverageInvocation(projectRoot, reportDir) {
128
208
  resultsFile: results,
129
209
  };
130
210
  }
131
- function readNumTotalTests(resultsFile) {
211
+ const NO_COUNTS = {
212
+ numTotalTests: null, numPassedTests: null, numFailedTests: null, numPendingTests: null, numFailedTestSuites: null,
213
+ };
214
+ /** Test counts from the runner's own JSON result (vitest/jest share the shape). */
215
+ function readRunCounts(resultsFile) {
132
216
  if (!resultsFile)
133
- return null;
217
+ return NO_COUNTS;
134
218
  try {
135
219
  const parsed = JSON.parse(fs.readFileSync(resultsFile, 'utf-8'));
136
- return typeof parsed.numTotalTests === 'number' ? parsed.numTotalTests : null;
220
+ const n = (k) => (typeof parsed[k] === 'number' ? parsed[k] : null);
221
+ return {
222
+ numTotalTests: n('numTotalTests'), numPassedTests: n('numPassedTests'), numFailedTests: n('numFailedTests'),
223
+ numPendingTests: n('numPendingTests'), numFailedTestSuites: n('numFailedTestSuites'),
224
+ };
137
225
  }
138
226
  catch {
139
- return null;
227
+ return NO_COUNTS;
140
228
  }
141
229
  }
142
230
  /**
@@ -311,15 +399,16 @@ export async function runJsCoverage(projectRoot, options = {}) {
311
399
  timeoutMs, data: null, numTotalTests: null, stderrTail: '',
312
400
  };
313
401
  }
314
- // Runners that shell out to sibling tools (nyc → mocha) find them here.
315
- const binDir = path.join(projectRoot, 'node_modules', '.bin');
402
+ // Runners that shell out to sibling tools (nyc → mocha) find them here,
403
+ // including hoisted workspace-root installs (#1012).
404
+ const binDirs = runnerBinDirs(projectRoot);
316
405
  // The runner's own temp files (vite's SSR cache, etc.) go inside reportDir
317
406
  // too, so a killed run leaves nothing behind in the system temp dir.
318
407
  const runnerTmp = path.join(reportDir, 'tmp');
319
408
  fs.mkdirSync(runnerTmp);
320
409
  const env = {
321
410
  ...process.env,
322
- PATH: `${binDir}${path.delimiter}${process.env.PATH ?? ''}`,
411
+ PATH: [...binDirs, process.env.PATH ?? ''].join(path.delimiter),
323
412
  TMPDIR: runnerTmp, TMP: runnerTmp, TEMP: runnerTmp,
324
413
  };
325
414
  const run = await runProcessTree(inv.command, inv.args, {
@@ -334,7 +423,7 @@ export async function runJsCoverage(projectRoot, options = {}) {
334
423
  timedOut: run.timedOut,
335
424
  timeoutMs,
336
425
  data,
337
- numTotalTests: run.timedOut ? null : readNumTotalTests(inv.resultsFile),
426
+ ...(run.timedOut ? NO_COUNTS : readRunCounts(inv.resultsFile)),
338
427
  stderrTail: run.stderrTail,
339
428
  };
340
429
  }
@@ -350,6 +439,12 @@ export async function runJsCoverage(projectRoot, options = {}) {
350
439
  * Never "No instrumentation ran" when the runner did run and failed.
351
440
  */
352
441
  export function describeRunFailure(run, projectRoot) {
442
+ if (run.missing && usesPlugNPlay(projectRoot)) {
443
+ return `${run.runner} could not be resolved for ${projectRoot}: this project uses Yarn Plug'n'Play, ` +
444
+ 'and agentic-qe resolves test runners only from node_modules. Nothing was run and nothing was downloaded. ' +
445
+ `Generate a coverage report (e.g. \`yarn ${run.runner} --coverage\`) and pass it as the target, ` +
446
+ 'or use the node-modules linker.';
447
+ }
353
448
  if (run.missing) {
354
449
  return `${run.runner} is not installed in ${projectRoot} (no node_modules/${run.runner} found); ` +
355
450
  'nothing was run and nothing was downloaded. Install it, or generate a coverage report and pass it as the target.';
@@ -118,6 +118,7 @@ export declare function thresholdVerdict(summary: {
118
118
  }, threshold: number, collected: {
119
119
  branch: boolean;
120
120
  function: boolean;
121
+ statement?: boolean;
121
122
  }): {
122
123
  overall: number;
123
124
  meetsThreshold: boolean;
@@ -254,7 +254,10 @@ export async function resolveExistingCoverage(targetPath) {
254
254
  * report) is null, and a null must not drag the average down as a fake 0.
255
255
  */
256
256
  export function thresholdVerdict(summary, threshold, collected) {
257
- const metrics = [summary.line, summary.statement];
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);
258
261
  if (collected.branch)
259
262
  metrics.push(summary.branch);
260
263
  if (collected.function)
@@ -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,7 +75,20 @@ 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;
81
94
  /**
@@ -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
@@ -52,7 +53,32 @@ export async function loadCoverageData(targetPath) {
52
53
  return null;
53
54
  }
54
55
  /**
55
- * 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.
56
82
  */
57
83
  export function parseCoverageJson(content) {
58
84
  const data = safeJsonParse(content);
@@ -63,30 +89,21 @@ export function parseCoverageJson(content) {
63
89
  let totalStatements = 0, coveredStatements = 0;
64
90
  for (const [filePath, fileData] of Object.entries(data)) {
65
91
  const fd = fileData;
66
- // Calculate file-level metrics
67
- const lineMap = fd.statementMap || {};
68
- const lineCounts = fd.s || {};
92
+ const statementCounts = fd.s || {};
69
93
  const branchMap = fd.branchMap || {};
70
94
  const branchCounts = fd.b || {};
71
95
  const fnCounts = fd.f || {};
72
- const fileLines = Object.keys(lineCounts).length;
73
- 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;
74
99
  const fileBranches = Object.values(branchCounts).flat().length;
75
100
  const fileCoveredBranches = Object.values(branchCounts).flat().filter((v) => v > 0).length;
76
101
  const fileFunctions = Object.keys(fnCounts).length;
77
102
  const fileCoveredFunctions = Object.values(fnCounts).filter((v) => v > 0).length;
78
- const fileStatements = Object.keys(lineMap).length;
79
- const fileCoveredStatements = Object.values(lineCounts).filter((v) => v > 0).length;
80
- // Find uncovered lines
81
- const uncoveredLines = [];
82
- for (const [key, count] of Object.entries(lineCounts)) {
83
- if (count === 0) {
84
- const stmtInfo = lineMap[key];
85
- if (stmtInfo?.start?.line) {
86
- uncoveredLines.push(stmtInfo.start.line);
87
- }
88
- }
89
- }
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);
90
107
  // Find uncovered branches
91
108
  const uncoveredBranches = [];
92
109
  for (const [branchId, counts] of Object.entries(branchCounts)) {
@@ -103,7 +120,7 @@ export function parseCoverageJson(content) {
103
120
  branches: { covered: fileCoveredBranches, total: fileBranches },
104
121
  functions: { covered: fileCoveredFunctions, total: fileFunctions },
105
122
  statements: { covered: fileCoveredStatements, total: fileStatements },
106
- uncoveredLines: Array.from(new Set(uncoveredLines)).sort((a, b) => a - b),
123
+ uncoveredLines: uncoveredLines.sort((a, b) => a - b),
107
124
  uncoveredBranches: Array.from(new Set(uncoveredBranches)).sort((a, b) => a - b),
108
125
  });
109
126
  totalLines += fileLines;
@@ -218,7 +235,8 @@ export function parseLcovInfo(content) {
218
235
  lines: { covered: linesCovered, total: linesTotal },
219
236
  branches: { covered: branchesCovered, total: branchesTotal },
220
237
  functions: { covered: functionsCovered, total: functionsTotal },
221
- 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 },
222
240
  uncoveredLines: Array.from(new Set(uncoveredLines)),
223
241
  uncoveredBranches: Array.from(new Set(uncoveredBranches)),
224
242
  });
@@ -355,7 +373,8 @@ export function parseCoberturaXml(content) {
355
373
  lines: { covered: linesCovered, total: linesTotal },
356
374
  branches: { covered: branchesCovered, total: branchesTotal },
357
375
  functions: { covered: functionsCovered, total: functionsTotal },
358
- statements: { covered: linesCovered, total: linesTotal },
376
+ // #1027 N7: Cobertura has no statement detail — not collected.
377
+ statements: { covered: 0, total: 0 },
359
378
  uncoveredLines,
360
379
  uncoveredBranches,
361
380
  });
@@ -449,11 +468,16 @@ export async function discoverSourceFiles(targetPath, options = {}) {
449
468
  if (['node_modules', '.git', 'dist', 'build', 'coverage', '.nyc_output',
450
469
  '__pycache__', '.venv', 'venv', '.tox', '.mypy_cache', 'target',
451
470
  '.gradle', 'vendor', '.bundle',
452
- '.agentic-qe', '.claude', '.cache', '.npm', '.yarn',
471
+ '.cache', '.npm', '.yarn',
453
472
  '.next', '.nuxt', '.svelte-kit', 'out', '.turbo',
454
473
  'tmp', 'temp', '.tmp'].includes(entry.name)) {
455
474
  continue;
456
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;
457
481
  if (files.length >= maxFiles)
458
482
  return; // Cap reached
459
483
  await walkDir(fullPath);
@@ -4,9 +4,12 @@
4
4
  * Extracted from task-executor.ts registerHandlers().
5
5
  * Covers: assess-quality
6
6
  */
7
+ import * as nodePath from 'node:path';
8
+ import { existsSync, promises as fsp } from 'node:fs';
7
9
  import { ok, err } from '../../shared/types/index.js';
8
10
  import { CallerInputError, toError } from '../../shared/error-utils.js';
9
11
  import { discoverSourceFiles } from './handler-utils.js';
12
+ import { findProjectRoot } from '../../kernel/project-root.js';
10
13
  import { INSUFFICIENT_EVIDENCE, describeMissingMetrics, evaluateQualityEvidence, loadQualityEvidence, } from '../../domains/quality-assessment/quality-evidence.js';
11
14
  import { assessEvidenceSufficiency, describeMeasuredFailure, findMeasuredFailures, isMeasuredMetricValue, resolveCoverageOverride, validateRequestedMetrics, } from '../../domains/quality-assessment/evidence-sufficiency.js';
12
15
  const DEFAULT_STATIC_METRICS = ['coverage', 'complexity', 'maintainability', 'testability'];
@@ -17,6 +20,91 @@ const STATIC_ONLY_NOTE = 'Static analysis only; no quality gate was evaluated. '
17
20
  function sentinel(value) {
18
21
  return isMeasuredMetricValue(value) ? value : UNMEASURED;
19
22
  }
23
+ /**
24
+ * #1011: why each unmeasured metric has no value — the analyzer's reason
25
+ * (unreadable or unparseable file, failed detection, no stored coverage).
26
+ */
27
+ function unmeasuredReasons(unmeasured, reported) {
28
+ const byMetric = new Map((reported ?? []).map((u) => [u.metric, u.reason]));
29
+ return Object.fromEntries(unmeasured.map((metric) => [
30
+ metric,
31
+ byMetric.get(metric) ?? (metric === 'security'
32
+ ? 'static analysis never measures security'
33
+ : 'the static analyzer produced no measured value'),
34
+ ]));
35
+ }
36
+ /** Cap on excluded files echoed back in the result (the count is always exact). */
37
+ const MAX_EXCLUDED_LISTED = 50;
38
+ /** True when `candidate` is `root` or lies beneath it. */
39
+ function isWithin(root, candidate) {
40
+ const relative = nodePath.relative(root, candidate);
41
+ return relative === '' || (relative !== '..' && !relative.startsWith(`..${nodePath.sep}`) && !nodePath.isAbsolute(relative));
42
+ }
43
+ /**
44
+ * #1021 (B2): resolve a caller path against the project root and require it to
45
+ * stay inside — lexically, and by realpath when it exists (so a symlink cannot
46
+ * lead outside). A path that does not exist is returned as resolved; the
47
+ * analyzer reports it as unreadable.
48
+ */
49
+ async function resolveContained(input, root, label) {
50
+ const resolved = nodePath.resolve(root, input);
51
+ if (input.includes('\0') || !isWithin(root, resolved)) {
52
+ throw new CallerInputError(`${label} ${JSON.stringify(input)} is outside the project root (${root}).`);
53
+ }
54
+ let real;
55
+ try {
56
+ real = await fsp.realpath(resolved);
57
+ }
58
+ catch {
59
+ return resolved;
60
+ }
61
+ const rootReal = await fsp.realpath(root).catch(() => root);
62
+ if (!isWithin(rootReal, real)) {
63
+ throw new CallerInputError(`${label} ${JSON.stringify(input)} resolves outside the project root (${root}).`);
64
+ }
65
+ return resolved;
66
+ }
67
+ /**
68
+ * #1021 (B2): the files to analyse and which of them the caller named. Explicit
69
+ * sourceFiles win over target; with neither, src/ (else the root) is analysed.
70
+ */
71
+ async function resolveAnalysisScope(payload) {
72
+ // #1021 round 2b: the AQE project root (AQE_PROJECT_ROOT, else detected),
73
+ // not the process cwd — an MCP server may run from another directory.
74
+ const root = findProjectRoot();
75
+ if (Array.isArray(payload.sourceFiles) && payload.sourceFiles.length > 0) {
76
+ const files = [];
77
+ for (const file of payload.sourceFiles) {
78
+ if (typeof file !== 'string' || file.trim() === '') {
79
+ throw new CallerInputError('sourceFiles must be a non-empty array of file paths.');
80
+ }
81
+ files.push(await resolveContained(file, root, 'sourceFile'));
82
+ }
83
+ return { sourceFiles: files, explicitFiles: files, scope: 'sourceFiles' };
84
+ }
85
+ if (typeof payload.target === 'string' && payload.target.trim() !== '') {
86
+ const target = await resolveContained(payload.target, root, 'target');
87
+ const stat = await fsp.stat(target).catch(() => null);
88
+ if (!stat)
89
+ throw new CallerInputError(`target ${JSON.stringify(payload.target)} does not exist.`);
90
+ if (stat.isFile())
91
+ return { sourceFiles: [target], explicitFiles: [target], scope: target };
92
+ return { sourceFiles: await discoverSourceFiles(target, { includeTests: false }), explicitFiles: [], scope: target };
93
+ }
94
+ // Default to src/ — scanning the entire project root is too slow
95
+ // (node_modules, dist, .git, etc. make it hang on large projects)
96
+ const srcDir = nodePath.join(root, 'src');
97
+ const targetDir = existsSync(srcDir) ? srcDir : root;
98
+ return { sourceFiles: await discoverSourceFiles(targetDir, { includeTests: false }), explicitFiles: [], scope: targetDir };
99
+ }
100
+ /** #1021: one line per partially measured metric, naming the gap. */
101
+ function describePartialMetrics(partial) {
102
+ return (partial ?? []).map((p) => `Partial evidence: ${p.metric} measured over ${p.analysedFiles} of ${p.totalFiles} `
103
+ // coverageOfScope is already rounded down to 3 decimals; round only float noise here.
104
+ + `file(s) (${Math.round(p.coverageOfScope * 1000) / 10}%); not analysed: `
105
+ + p.failed.slice(0, 3).map((f) => f.reason).join('; ')
106
+ + (p.failed.length > 3 ? `; and ${p.failed.length - 3} more` : '') + '.');
107
+ }
20
108
  /** #996 (N3): reject a malformed `metrics` list instead of spreading a string into characters. */
21
109
  function requestedMetricsFrom(metrics) {
22
110
  if (metrics === undefined)
@@ -81,27 +169,13 @@ export function registerQualityHandlers(ctx) {
81
169
  const coverageOverride = await coverageOverrideFor(payload);
82
170
  const analyzer = ctx.getQualityAnalyzer();
83
171
  const threshold = payload.threshold || 80;
84
- // Determine source files to analyze
85
- let sourceFiles = [];
86
- if (payload.sourceFiles && payload.sourceFiles.length > 0) {
87
- sourceFiles = payload.sourceFiles;
88
- }
89
- else if (payload.target) {
90
- sourceFiles = await discoverSourceFiles(payload.target, { includeTests: false });
91
- }
92
- else {
93
- // Default to src/ — scanning the entire project root is too slow
94
- // (node_modules, dist, .git, etc. make it hang on large projects)
95
- const path = await import('path');
96
- const fs = await import('fs');
97
- const srcDir = path.join(process.cwd(), 'src');
98
- const targetDir = fs.existsSync(srcDir) ? srcDir : process.cwd();
99
- sourceFiles = await discoverSourceFiles(targetDir, { includeTests: false });
100
- }
172
+ // #1021 (B2): analyse what the caller scoped, contained in the project root.
173
+ const { sourceFiles, explicitFiles, scope } = await resolveAnalysisScope(payload);
101
174
  if (sourceFiles.length === 0) {
102
175
  // Nothing was analyzed: every requested metric is unmeasured (#996).
103
176
  return ok({
104
- qualityScore: 0,
177
+ // #1011: nothing was analysed, so there is no score (-1), not a score of 0.
178
+ qualityScore: UNMEASURED,
105
179
  passed: false,
106
180
  threshold,
107
181
  metrics: {
@@ -117,6 +191,7 @@ export function registerQualityHandlers(ctx) {
117
191
  warning: 'No source files found',
118
192
  evidenceStatus: INSUFFICIENT_EVIDENCE,
119
193
  unmeasured: requestedMetrics,
194
+ unmeasuredReasons: Object.fromEntries(requestedMetrics.map((m) => [m, 'no source files found to analyse'])),
120
195
  measuredFailures: [],
121
196
  gateEvaluated: false,
122
197
  confidence: 0,
@@ -127,6 +202,7 @@ export function registerQualityHandlers(ctx) {
127
202
  const result = await analyzer.analyzeQuality({
128
203
  sourceFiles,
129
204
  includeMetrics: requestedMetrics,
205
+ explicitFiles,
130
206
  });
131
207
  if (!result.success) {
132
208
  return result;
@@ -156,13 +232,27 @@ export function registerQualityHandlers(ctx) {
156
232
  maintainability: sentinel(metrics.maintainability),
157
233
  // The analyzer has no security measurement; never report a placeholder.
158
234
  security: sentinel(metrics.security),
235
+ // #1011: every requested metric appears, -1 when unmeasured.
236
+ ...Object.fromEntries(requestedMetrics.map((name) => [name, sentinel(metrics[name])])),
159
237
  ...metrics,
160
238
  },
239
+ unmeasuredReasons: unmeasuredReasons(sufficiency.unmeasured, report.unmeasured),
240
+ // #1021 round 2b: a score over a subset of the requested metrics (or over
241
+ // part of the files) names what it is based on — it is not a verdict.
242
+ ...(insufficient || (report.partial?.length ?? 0) > 0
243
+ ? { scoreBasis: report.metrics.map((m) => m.name) }
244
+ : {}),
161
245
  recommendations: [
162
246
  ...measuredFailures.map(describeMeasuredFailure),
163
247
  ...describeMissingMetrics(sufficiency.unmeasured),
248
+ ...describePartialMetrics(report.partial),
164
249
  ...recommendations,
165
250
  ],
251
+ ...(report.partial && report.partial.length > 0 ? { partialMetrics: report.partial } : {}),
252
+ ...(report.excluded && report.excluded.length > 0
253
+ ? { excludedFiles: report.excluded.slice(0, MAX_EXCLUDED_LISTED), excludedCount: report.excluded.length }
254
+ : {}),
255
+ scope,
166
256
  evidenceStatus: sufficiency.evidenceStatus,
167
257
  unmeasured: sufficiency.unmeasured,
168
258
  measuredFailures,
@@ -222,7 +222,10 @@ export function registerTestExecutionHandlers(ctx) {
222
222
  const executionError = getTestRunnerExecutionError(runner, testFiles.join(', '), execution.status, { passed, failed, skipped }, diagnostics, json);
223
223
  if (executionError)
224
224
  return err(executionError);
225
- return ok({ total, passed, failed, skipped, duration: 0, coverage: 0, failedTests: [] });
225
+ // #1027 N5/NB5: this handler runs the tests without --coverage, so it has no
226
+ // coverage figure to return (null, never 0%). For test_execute_parallel the
227
+ // measured coverage + testsPassing are recorded by TestExecutorService.
228
+ return ok({ total, passed, failed, skipped, duration: 0, coverage: null, failedTests: [] });
226
229
  }
227
230
  }
228
231
  }
@@ -64,7 +64,8 @@ export interface RelatedFailure {
64
64
  export interface CoverageContext {
65
65
  file: string;
66
66
  lineCoverage: number;
67
- branchCoverage: number;
67
+ /** `null` = no branch data was collected (#1027 NB4) — never a borrowed figure. */
68
+ branchCoverage: number | null;
68
69
  uncoveredLines: number[];
69
70
  riskScore: number;
70
71
  }
@@ -12,6 +12,7 @@ import { createEvent } from '../../shared/events/domain-events.js';
12
12
  import { toError } from '../../shared/error-utils.js';
13
13
  import { LoggerFactory } from '../../logging/index.js';
14
14
  import { addToCount } from '../../shared/utils/safe-record.js';
15
+ import { measuredFileCoverage } from '../../domains/quality-assessment/coverage-report-event.js';
15
16
  const logger = LoggerFactory.create('defect-investigation');
16
17
  export const DefectInvestigationEvents = {
17
18
  DefectInvestigationStarted: 'coordination.DefectInvestigationStarted',
@@ -605,12 +606,14 @@ export class DefectInvestigationProtocol {
605
606
  async getCoverageContext(file) {
606
607
  try {
607
608
  // Try per-file coverage (written by coverage-analyzer and test-executor)
608
- const coverage = await this.memory.get(`coverage:file:${file}`);
609
+ // #1014: only measured records; legacy unstamped estimates are ignored.
610
+ const coverage = measuredFileCoverage(await this.memory.get(`coverage:file:${file}`));
609
611
  if (!coverage) {
610
612
  return null;
611
613
  }
612
- // Calculate risk based on coverage
613
- const avgCoverage = (coverage.line + coverage.branch) / 2;
614
+ // Calculate risk based on coverage (an uncollected branch metric is
615
+ // left out, not counted as 0%).
616
+ const avgCoverage = coverage.branch === null ? coverage.line : (coverage.line + coverage.branch) / 2;
614
617
  const riskScore = 1 - avgCoverage / 100;
615
618
  return {
616
619
  file,
@@ -10,6 +10,7 @@ import { v4 as uuidv4 } from 'uuid';
10
10
  import { ok, err, } from '../../shared/types/index.js';
11
11
  import { createEvent } from '../../shared/events/domain-events.js';
12
12
  import { toErrorMessage, toError } from '../../shared/error-utils.js';
13
+ import { measuredCoverageSummary } from '../../domains/quality-assessment/coverage-report-event.js';
13
14
  // ============================================================================
14
15
  // Protocol Events
15
16
  // ============================================================================
@@ -402,12 +403,14 @@ export class QualityGateProtocol {
402
403
  async getCoverageMetrics(_releaseCandidate) {
403
404
  try {
404
405
  // Try to get latest coverage data from memory
405
- const latestCoverage = await this.memory.get('coverage:latest');
406
+ // #1014: only a measured record is coverage evidence; a legacy
407
+ // unstamped or estimated record is "no data" (the gate fails closed).
408
+ const latestCoverage = measuredCoverageSummary(await this.memory.get('coverage:latest'));
406
409
  if (!latestCoverage) {
407
410
  return null;
408
411
  }
409
- // Get previous coverage for trend
410
- const previousCoverage = await this.memory.get('coverage:previous');
412
+ // Get previous coverage for trend (measured baselines only, #1015)
413
+ const previousCoverage = measuredCoverageSummary(await this.memory.get('coverage:previous'));
411
414
  let trend = 'stable';
412
415
  if (previousCoverage) {
413
416
  const delta = latestCoverage.line - previousCoverage.line;
@@ -418,9 +421,10 @@ export class QualityGateProtocol {
418
421
  }
419
422
  return {
420
423
  line: latestCoverage.line,
421
- branch: latestCoverage.branch,
422
- function: latestCoverage.function,
423
- statement: latestCoverage.statement,
424
+ // An uncollected metric has no evidence: 0 fails its check closed.
425
+ branch: latestCoverage.branch ?? 0,
426
+ function: latestCoverage.function ?? 0,
427
+ statement: latestCoverage.statement ?? 0,
424
428
  trend,
425
429
  };
426
430
  }