agentic-qe 3.15.16 → 3.15.18

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 (539) hide show
  1. package/.claude/helpers/brain-checkpoint.cjs +107 -10
  2. package/.claude/skills/agentic-quality-engineering/SKILL.md +67 -44
  3. package/.claude/skills/brutal-honesty-review/SKILL.md +12 -7
  4. package/.claude/skills/brutal-honesty-review/evals/brutal-honesty-review.yaml +120 -0
  5. package/.claude/skills/brutal-honesty-review/schemas/output.json +9 -3
  6. package/.claude/skills/code-review-quality/SKILL.md +2 -2
  7. package/.claude/skills/holistic-testing-pact/SKILL.md +11 -11
  8. package/.claude/skills/sherlock-review/SKILL.md +4 -2
  9. package/.claude/skills/sherlock-review/evals/sherlock-review.yaml +124 -0
  10. package/.claude/skills/skills-manifest.json +1 -1
  11. package/.claude/skills/technical-writing/SKILL.md +12 -6
  12. package/.claude/skills/technical-writing/evals/technical-writing.yaml +96 -0
  13. package/.opencode/skills/qe-agentic-quality-engineering.yaml +2 -2
  14. package/.opencode/skills/qe-holistic-testing-pact.yaml +2 -2
  15. package/CHANGELOG.md +201 -0
  16. package/assets/skills/agentic-quality-engineering/SKILL.md +67 -44
  17. package/assets/skills/brutal-honesty-review/SKILL.md +12 -8
  18. package/assets/skills/brutal-honesty-review/evals/brutal-honesty-review.yaml +120 -0
  19. package/assets/skills/brutal-honesty-review/schemas/output.json +9 -3
  20. package/assets/skills/code-review-quality/SKILL.md +2 -2
  21. package/assets/skills/holistic-testing-pact/SKILL.md +11 -11
  22. package/assets/skills/sherlock-review/SKILL.md +4 -3
  23. package/assets/skills/sherlock-review/evals/sherlock-review.yaml +124 -0
  24. package/assets/skills/skills-manifest.json +1 -1
  25. package/assets/skills/technical-writing/SKILL.md +12 -6
  26. package/assets/skills/technical-writing/evals/technical-writing.yaml +96 -0
  27. package/dist/cli/brain-commands.d.ts +5 -0
  28. package/dist/cli/brain-commands.js +4 -0
  29. package/dist/cli/bundle.js +6 -6
  30. package/dist/cli/chunks/adapter-WRSDXLOT.js +2 -0
  31. package/dist/cli/chunks/{agent-booster-wasm-45NWEKVS.js → agent-booster-wasm-UFNJNF3M.js} +2 -2
  32. package/dist/cli/chunks/{agent-handler-LVHMYFEF.js → agent-handler-EAYVRJXN.js} +2 -2
  33. package/dist/cli/chunks/{agent-memory-branch-YDWOJFEQ.js → agent-memory-branch-M65C6WAQ.js} +2 -2
  34. package/dist/cli/chunks/aqe-learning-engine-O6NJBCCM.js +2 -0
  35. package/dist/cli/chunks/{arena-ELDZH3CZ.js → arena-2GDICP6R.js} +4 -4
  36. package/dist/cli/chunks/{arena-CZKHXDDS.js → arena-CG3X67OE.js} +2 -2
  37. package/dist/cli/chunks/{audit-5MT4T47Z.js → audit-F4FSPJPL.js} +3 -3
  38. package/dist/cli/chunks/base-J2FXOE77.js +2 -0
  39. package/dist/cli/chunks/{better-sqlite3-6TGYPC2B.js → better-sqlite3-2MCFXW4J.js} +2 -2
  40. package/dist/cli/chunks/brain-handler-WGTJNYNB.js +95 -0
  41. package/dist/cli/chunks/{branch-enumerator-WVILM4SO.js → branch-enumerator-KL7C535H.js} +2 -2
  42. package/dist/cli/chunks/{browser-RX5ALU3H.js → browser-SJEXDVHS.js} +2 -2
  43. package/dist/cli/chunks/browser-workflow-LXGER6ZD.js +2 -0
  44. package/dist/cli/chunks/{chunk-2H4XH6FT.js → chunk-244RKAEP.js} +2 -2
  45. package/dist/cli/chunks/{chunk-SI6DPU5D.js → chunk-27TUMXPD.js} +1 -1
  46. package/dist/cli/chunks/{chunk-YNMJEDN5.js → chunk-2MBYDPCP.js} +2 -2
  47. package/dist/cli/chunks/{chunk-24QHCVX6.js → chunk-2Q6DTBMT.js} +1 -1
  48. package/dist/cli/chunks/{chunk-XWUWX7BV.js → chunk-355MI7RV.js} +13 -13
  49. package/dist/cli/chunks/{chunk-NQXXI77K.js → chunk-3LX5OKBD.js} +2 -2
  50. package/dist/cli/chunks/{chunk-63GMRQ25.js → chunk-3RPDKJGV.js} +1 -1
  51. package/dist/cli/chunks/chunk-3YMIT73A.js +4 -0
  52. package/dist/cli/chunks/{chunk-P3EYRILV.js → chunk-43KUVBSU.js} +2 -2
  53. package/dist/cli/chunks/chunk-477FKXSS.js +2 -0
  54. package/dist/cli/chunks/{chunk-HGWXF45W.js → chunk-4BIMTRRX.js} +1 -1
  55. package/dist/cli/chunks/{chunk-SSUAAX3F.js → chunk-4CVNVBX5.js} +2 -2
  56. package/dist/cli/chunks/{chunk-5V3TI2LG.js → chunk-4HL3SD4A.js} +1 -1
  57. package/dist/cli/chunks/{chunk-KKU2QGSJ.js → chunk-4PEG4DU2.js} +2 -2
  58. package/dist/cli/chunks/{chunk-J4ELZNLY.js → chunk-4QSQKFED.js} +2 -2
  59. package/dist/cli/chunks/chunk-53ZBETYR.js +16 -0
  60. package/dist/cli/chunks/{chunk-7TE5ONQQ.js → chunk-544KDWL4.js} +1 -1
  61. package/dist/cli/chunks/chunk-54RCGMLB.js +8 -0
  62. package/dist/cli/chunks/{chunk-KU2AUFGX.js → chunk-5AGXIZQ5.js} +2 -2
  63. package/dist/cli/chunks/{chunk-LQLPB2T6.js → chunk-5M24X6W7.js} +2 -2
  64. package/dist/cli/chunks/{chunk-YU2BDRSD.js → chunk-5O5T4LEU.js} +1 -1
  65. package/dist/cli/chunks/{chunk-NAEWCFQT.js → chunk-5RFXX4IF.js} +2 -2
  66. package/dist/cli/chunks/{chunk-MD43XRX5.js → chunk-62MLAQRJ.js} +1 -1
  67. package/dist/cli/chunks/{chunk-PEQDY4BO.js → chunk-6D6TGL2E.js} +2 -2
  68. package/dist/cli/chunks/{chunk-IOYG4VFL.js → chunk-6IHZDSDL.js} +2 -2
  69. package/dist/cli/chunks/{chunk-C5FP5GW3.js → chunk-6P3Y45QL.js} +2 -2
  70. package/dist/cli/chunks/{chunk-4LQFBY5L.js → chunk-6TEVM3X3.js} +10 -10
  71. package/dist/cli/chunks/{chunk-YPBSUGMI.js → chunk-7XTUKKRA.js} +1 -1
  72. package/dist/cli/chunks/chunk-A3GDX6UF.js +2 -0
  73. package/dist/cli/chunks/{chunk-HLUXXCHF.js → chunk-A5YTKKNA.js} +1 -1
  74. package/dist/cli/chunks/{chunk-Y4PFUMOU.js → chunk-ADNGZAT2.js} +1 -1
  75. package/dist/cli/chunks/{chunk-KNSRL6NO.js → chunk-AWQAE3SW.js} +2 -2
  76. package/dist/cli/chunks/{chunk-BY5OF7OH.js → chunk-AXDBQFR4.js} +2 -2
  77. package/dist/cli/chunks/{chunk-525CFDUE.js → chunk-AXVD7O3F.js} +2 -2
  78. package/dist/cli/chunks/{chunk-JHQCRRJI.js → chunk-B52ULNYO.js} +2 -2
  79. package/dist/cli/chunks/chunk-B6S4FC7M.js +3 -0
  80. package/dist/cli/chunks/{chunk-AJMJNQMP.js → chunk-BDVFSMOQ.js} +1 -1
  81. package/dist/cli/chunks/{chunk-DXD6K2ZP.js → chunk-BGXXMX3Y.js} +2 -2
  82. package/dist/cli/chunks/{chunk-EK7OLYOZ.js → chunk-BKMQQY5T.js} +2 -2
  83. package/dist/cli/chunks/{chunk-VWPM27GU.js → chunk-BN2FROBQ.js} +2 -2
  84. package/dist/cli/chunks/{chunk-J7I6PABJ.js → chunk-BO6EQNOC.js} +2 -2
  85. package/dist/cli/chunks/{chunk-4D4DENG6.js → chunk-BOVAKCDC.js} +2 -2
  86. package/dist/cli/chunks/{chunk-ZFL436FN.js → chunk-BSXKZDKO.js} +2 -2
  87. package/dist/cli/chunks/{chunk-J442IZLE.js → chunk-C5QVJ5XQ.js} +1 -1
  88. package/dist/cli/chunks/{chunk-ZB3LEFYG.js → chunk-CFQLLF3D.js} +2 -2
  89. package/dist/cli/chunks/{chunk-UHEOGZLX.js → chunk-DUCVLT3F.js} +7 -7
  90. package/dist/cli/chunks/{chunk-TVGI32MB.js → chunk-E4RMJCGA.js} +3 -3
  91. package/dist/cli/chunks/{chunk-TIUKLYAI.js → chunk-EONDCWY4.js} +1 -1
  92. package/dist/cli/chunks/{chunk-ZJH5MU2I.js → chunk-F4AGNKL2.js} +2 -2
  93. package/dist/cli/chunks/{chunk-N7HL5PHH.js → chunk-F6YD3BOW.js} +1 -1
  94. package/dist/cli/chunks/{chunk-5VZL4UVN.js → chunk-FQRS7WVA.js} +2 -2
  95. package/dist/cli/chunks/{chunk-SHKOCGNK.js → chunk-FT24SSDG.js} +2 -2
  96. package/dist/cli/chunks/chunk-FV4YNSAJ.js +5 -0
  97. package/dist/cli/chunks/{chunk-KXCLACFG.js → chunk-FVDM3X42.js} +2 -2
  98. package/dist/cli/chunks/{chunk-32BPDLRZ.js → chunk-FVH7TXWU.js} +2 -2
  99. package/dist/cli/chunks/{chunk-72XSEQMW.js → chunk-FWR5QY37.js} +2 -2
  100. package/dist/cli/chunks/chunk-FYINK2B7.js +6 -0
  101. package/dist/cli/chunks/{chunk-5JZRZI4S.js → chunk-GGISVPOZ.js} +2 -2
  102. package/dist/cli/chunks/{chunk-5LAVKGLH.js → chunk-GPIJIZJQ.js} +2 -2
  103. package/dist/cli/chunks/{chunk-5QO3R3TU.js → chunk-GXEVOT5F.js} +2 -2
  104. package/dist/cli/chunks/{chunk-IHRXZZQM.js → chunk-GZ4VB5RI.js} +1 -1
  105. package/dist/cli/chunks/chunk-HBDSCYSK.js +2 -0
  106. package/dist/cli/chunks/{chunk-GSKMOPL7.js → chunk-HGG4HR7C.js} +2 -2
  107. package/dist/cli/chunks/{chunk-AR67RJPY.js → chunk-HSCKWWO2.js} +2 -2
  108. package/dist/cli/chunks/{chunk-6XXZDV2C.js → chunk-HSQ3GUYJ.js} +2 -2
  109. package/dist/cli/chunks/{chunk-AAMLQ2LF.js → chunk-HZQBW5EM.js} +3 -3
  110. package/dist/cli/chunks/{chunk-O5W3FIO6.js → chunk-IGIYANVT.js} +2 -2
  111. package/dist/cli/chunks/{chunk-C6D5AHBO.js → chunk-IPWMSXBF.js} +2 -2
  112. package/dist/cli/chunks/{chunk-NDJ7P2EP.js → chunk-IWVNC7VY.js} +1 -1
  113. package/dist/cli/chunks/{chunk-FDDC72IA.js → chunk-IZODXKZD.js} +2 -2
  114. package/dist/cli/chunks/{chunk-NO3IV5Q5.js → chunk-J2MT2OJV.js} +1 -1
  115. package/dist/cli/chunks/{chunk-GQ6TUIKY.js → chunk-JKIJVVSP.js} +1 -1
  116. package/dist/cli/chunks/{chunk-LE4QJREF.js → chunk-JMRDT2XK.js} +1 -1
  117. package/dist/cli/chunks/{chunk-2YZ4G6NW.js → chunk-JR2UMTKG.js} +1 -1
  118. package/dist/cli/chunks/{chunk-RJIEG3NA.js → chunk-K6CH4CFF.js} +2 -2
  119. package/dist/cli/chunks/{chunk-5NNNEWLS.js → chunk-K7KW5QB5.js} +81 -88
  120. package/dist/cli/chunks/chunk-KFCQP434.js +2 -0
  121. package/dist/cli/chunks/{chunk-A5GBXCP5.js → chunk-KH4T6STG.js} +2 -2
  122. package/dist/cli/chunks/{chunk-VMDFFTCK.js → chunk-KJBYZO57.js} +1 -1
  123. package/dist/cli/chunks/{chunk-GJYHWYXR.js → chunk-KP4OKOKV.js} +2 -2
  124. package/dist/cli/chunks/chunk-L2MBKVSE.js +2 -0
  125. package/dist/cli/chunks/{chunk-XIQW7EFL.js → chunk-L3IPUIT3.js} +2 -2
  126. package/dist/cli/chunks/{chunk-W5HQUIML.js → chunk-L7PSU2YN.js} +2 -2
  127. package/dist/cli/chunks/{chunk-6DPYNAOK.js → chunk-LA3JPGQA.js} +2 -2
  128. package/dist/cli/chunks/{chunk-5PBLPQ5T.js → chunk-LC2QRN7V.js} +14 -13
  129. package/dist/cli/chunks/{chunk-SSYAQZXA.js → chunk-LHY7TMTM.js} +2 -2
  130. package/dist/cli/chunks/{chunk-QQWBWEJS.js → chunk-LLQ2UMF6.js} +3 -3
  131. package/dist/cli/chunks/{chunk-DTMAS2GB.js → chunk-LOJ7OO6W.js} +2 -2
  132. package/dist/cli/chunks/{chunk-32GN3JKR.js → chunk-LPUSH3VF.js} +1 -1
  133. package/dist/cli/chunks/{chunk-SDLWKRVL.js → chunk-LSEC2BU7.js} +2 -2
  134. package/dist/cli/chunks/{chunk-IOKYCMTJ.js → chunk-LTGB7OIU.js} +2 -2
  135. package/dist/cli/chunks/{chunk-6ZBXSOX6.js → chunk-LUG7YNVZ.js} +2 -2
  136. package/dist/cli/chunks/{chunk-CAKMOVZ6.js → chunk-LWAFRYKE.js} +2 -2
  137. package/dist/cli/chunks/{chunk-FLNAW7C4.js → chunk-M24ZAZ4U.js} +2 -2
  138. package/dist/cli/chunks/{chunk-L2DWPVNJ.js → chunk-MKRKRXTX.js} +1 -1
  139. package/dist/cli/chunks/{chunk-YTHTQPWR.js → chunk-MNNLONAD.js} +1 -1
  140. package/dist/cli/chunks/{chunk-V5NHZV7S.js → chunk-MQM37KAR.js} +2 -2
  141. package/dist/cli/chunks/{chunk-PPUZWYUG.js → chunk-MSX2OHYT.js} +2 -2
  142. package/dist/cli/chunks/{chunk-YRAX7SFJ.js → chunk-MVYQRVLP.js} +2 -2
  143. package/dist/cli/chunks/{chunk-QVDCVD5D.js → chunk-MZC5WM2P.js} +2 -2
  144. package/dist/cli/chunks/{chunk-S75SOOZL.js → chunk-MZRBNBB3.js} +2 -2
  145. package/dist/cli/chunks/{chunk-FL64OUBA.js → chunk-N3KQU4UC.js} +2 -2
  146. package/dist/cli/chunks/{chunk-G5RHFBAY.js → chunk-NKU3FFM4.js} +2 -2
  147. package/dist/cli/chunks/chunk-O5EWFR76.js +2 -0
  148. package/dist/cli/chunks/{chunk-63ZKI4PX.js → chunk-O5RDHD5T.js} +2 -2
  149. package/dist/cli/chunks/chunk-O6UWIXME.js +3 -0
  150. package/dist/cli/chunks/{chunk-HCH4Y6XX.js → chunk-OA4EQDC4.js} +2 -2
  151. package/dist/cli/chunks/{chunk-QPEOLAAS.js → chunk-OBCXCRXK.js} +1 -1
  152. package/dist/cli/chunks/{chunk-6ICX3FEG.js → chunk-OHU5P25N.js} +22 -22
  153. package/dist/cli/chunks/{chunk-GFWHUQSF.js → chunk-OOSV2RIA.js} +2 -2
  154. package/dist/cli/chunks/{chunk-MO55CVMT.js → chunk-OW23N2Y5.js} +14 -14
  155. package/dist/cli/chunks/{chunk-M7WJCTG3.js → chunk-OXOO3YDL.js} +2 -2
  156. package/dist/cli/chunks/{chunk-KQYJ4VQ5.js → chunk-OYGKSSSI.js} +1 -1
  157. package/dist/cli/chunks/chunk-PGO46IIW.js +2 -0
  158. package/dist/cli/chunks/{chunk-NVEWF4JV.js → chunk-PZOYQHWS.js} +1 -1
  159. package/dist/cli/chunks/{chunk-IESR7TNB.js → chunk-Q2BZSG7Z.js} +2 -2
  160. package/dist/cli/chunks/{chunk-XIIQ5QTT.js → chunk-Q7V722K5.js} +2 -2
  161. package/dist/cli/chunks/{chunk-F742SZAX.js → chunk-QZU6M5IO.js} +2 -2
  162. package/dist/cli/chunks/{chunk-PINSJCM3.js → chunk-R55Y76SJ.js} +1 -1
  163. package/dist/cli/chunks/{chunk-5B5QPCNU.js → chunk-RMEQYJPU.js} +4 -4
  164. package/dist/cli/chunks/{chunk-ZQ2XW3IP.js → chunk-RTYXFXTI.js} +2 -2
  165. package/dist/cli/chunks/{chunk-DVYHMDFR.js → chunk-SJF3O4FX.js} +374 -371
  166. package/dist/cli/chunks/{chunk-AG2EWGXS.js → chunk-SOUS7Z2H.js} +2 -2
  167. package/dist/cli/chunks/{chunk-3HD7E6HN.js → chunk-SRVNR3R3.js} +2 -2
  168. package/dist/cli/chunks/{chunk-KITOPKRG.js → chunk-SU3SXMVG.js} +2 -2
  169. package/dist/cli/chunks/chunk-SWGPLXWW.js +32 -0
  170. package/dist/cli/chunks/{chunk-ZR2TKVXQ.js → chunk-TRB3EVH3.js} +2 -2
  171. package/dist/cli/chunks/{chunk-OCV2XEWQ.js → chunk-TVBDUMKT.js} +2 -2
  172. package/dist/cli/chunks/{chunk-IOQ6ZQ5W.js → chunk-TWTXPSFU.js} +1 -1
  173. package/dist/cli/chunks/{chunk-CJSHWQXP.js → chunk-ULYUVUL2.js} +2 -2
  174. package/dist/cli/chunks/{chunk-PHT5N7SC.js → chunk-UNTBVJ5X.js} +2 -2
  175. package/dist/cli/chunks/{chunk-LKTTUHLF.js → chunk-UQAA4PHU.js} +2 -2
  176. package/dist/cli/chunks/{chunk-SR52XP5F.js → chunk-UWSJVKTE.js} +1 -1
  177. package/dist/cli/chunks/{chunk-L6QSTQME.js → chunk-V2LJ54KP.js} +2 -2
  178. package/dist/cli/chunks/{chunk-FBDVGRSC.js → chunk-VCCTTKP3.js} +7 -7
  179. package/dist/cli/chunks/{chunk-YLMNVLDK.js → chunk-VEGUYUVS.js} +1 -1
  180. package/dist/cli/chunks/{chunk-ASEOFRIG.js → chunk-VUQPVWNK.js} +2 -2
  181. package/dist/cli/chunks/{chunk-VXFLJNCA.js → chunk-VVGUE2T2.js} +2 -2
  182. package/dist/cli/chunks/{chunk-4NFQLP6R.js → chunk-W5ASDHJQ.js} +1 -1
  183. package/dist/cli/chunks/{chunk-I7MQIM2U.js → chunk-WGXT5NWQ.js} +1 -1
  184. package/dist/cli/chunks/chunk-WJN3V7QB.js +7 -0
  185. package/dist/cli/chunks/chunk-WPCRQIIF.js +29 -0
  186. package/dist/cli/chunks/{chunk-SASBO5Y5.js → chunk-WQNLXUWA.js} +6 -6
  187. package/dist/cli/chunks/{chunk-5SPCGMBB.js → chunk-WZVRMKG2.js} +2 -2
  188. package/dist/cli/chunks/{chunk-MI5MFHRA.js → chunk-X27IUWTD.js} +2 -2
  189. package/dist/cli/chunks/{chunk-HJ6ZGVTB.js → chunk-X4B345B6.js} +2 -2
  190. package/dist/cli/chunks/{chunk-HVRRLYX6.js → chunk-X5I2Y4VO.js} +2 -2
  191. package/dist/cli/chunks/{chunk-SUDMM5SO.js → chunk-X7IQIFTS.js} +2 -2
  192. package/dist/cli/chunks/chunk-XJN3RKUD.js +3 -0
  193. package/dist/cli/chunks/{chunk-E3D4GPLP.js → chunk-XQMGXTHJ.js} +3 -3
  194. package/dist/cli/chunks/{chunk-67Z5R7RJ.js → chunk-XTSAMB2Q.js} +2 -2
  195. package/dist/cli/chunks/{chunk-KVF4NXGQ.js → chunk-XZLIF4O2.js} +2 -2
  196. package/dist/cli/chunks/{chunk-EA4YQVKS.js → chunk-Y4LSEOZ3.js} +1 -1
  197. package/dist/cli/chunks/{chunk-OAEE6JWQ.js → chunk-Y4YN2RXR.js} +2 -2
  198. package/dist/cli/chunks/{chunk-CEYSYSK5.js → chunk-YDI56L35.js} +2 -2
  199. package/dist/cli/chunks/{chunk-JDIYMZCQ.js → chunk-YFILS5D5.js} +2 -2
  200. package/dist/cli/chunks/{chunk-GAHNO6JJ.js → chunk-YISDX6WB.js} +2 -2
  201. package/dist/cli/chunks/{chunk-AGRV5B3T.js → chunk-YP2GHQSV.js} +2 -2
  202. package/dist/cli/chunks/{chunk-UNGBRZDK.js → chunk-YSX756AM.js} +4 -4
  203. package/dist/cli/chunks/{chunk-BEKDKVQT.js → chunk-YWANOASW.js} +2 -2
  204. package/dist/cli/chunks/{chunk-JQ3DYUMS.js → chunk-YYIJLG7S.js} +2 -2
  205. package/dist/cli/chunks/{chunk-CRPIYUTJ.js → chunk-Z7SD7LXM.js} +2 -2
  206. package/dist/cli/chunks/{chunk-U2A7NHZA.js → chunk-ZDWD73UF.js} +2 -2
  207. package/dist/cli/chunks/{chunk-WP4RETKG.js → chunk-ZFT3RLA4.js} +2 -2
  208. package/dist/cli/chunks/{chunk-VJCIEHEF.js → chunk-ZNTHX5G3.js} +1 -1
  209. package/dist/cli/chunks/{chunk-PF7RBAYL.js → chunk-ZS27R7VL.js} +2 -2
  210. package/dist/cli/chunks/{chunk-24OX5TQJ.js → chunk-ZXHHHR7K.js} +1 -1
  211. package/dist/cli/chunks/{ci-MFUR4CWV.js → ci-N5MOMNXH.js} +2 -2
  212. package/dist/cli/chunks/{ci-config-PNDLQ6XV.js → ci-config-6L2ROQCW.js} +2 -2
  213. package/dist/cli/chunks/{ci-output-PFZ4M7NC.js → ci-output-DSRBYEIK.js} +2 -2
  214. package/dist/cli/chunks/{circuit-breaker-5HH6NLZN.js → circuit-breaker-VRPTNBL7.js} +2 -2
  215. package/dist/cli/chunks/{claude-flow-setup-QCKYLGLC.js → claude-flow-setup-4YFG3FU5.js} +2 -2
  216. package/dist/cli/chunks/client-I3L6BKRQ.js +2 -0
  217. package/dist/cli/chunks/{cline-installer-EASVPFXR.js → cline-installer-7RGYJWGN.js} +2 -2
  218. package/dist/cli/chunks/{code-UJXDVYRK.js → code-ISC6NW2K.js} +3 -3
  219. package/dist/cli/chunks/{code-index-extractor-BZJ3UDP4.js → code-index-extractor-2FID75YV.js} +2 -2
  220. package/dist/cli/chunks/{codex-installer-XSQZUVOZ.js → codex-installer-DZ7OG6KM.js} +2 -2
  221. package/dist/cli/chunks/{completions-OWOOJFI2.js → completions-SM3LICWK.js} +2 -2
  222. package/dist/cli/chunks/{complexity-analyzer-KP5TOHDT.js → complexity-analyzer-ZWD2CTAD.js} +2 -2
  223. package/dist/cli/chunks/{continuedev-installer-IFKQXLHM.js → continuedev-installer-AGASOA26.js} +2 -2
  224. package/dist/cli/chunks/copilot-installer-CLPZYTQC.js +3 -0
  225. package/dist/cli/chunks/core-handlers-5EFOJ37H.js +2 -0
  226. package/dist/cli/chunks/{cost-tracker-MMDDNKZB.js → cost-tracker-7PIGQYDV.js} +2 -2
  227. package/dist/cli/chunks/{coverage-LUH2B7NT.js → coverage-T2GEBTYS.js} +9 -9
  228. package/dist/cli/chunks/cross-domain-router-65WJAKVD.js +2 -0
  229. package/dist/cli/chunks/{cursor-installer-4YLM5GWM.js → cursor-installer-KXBID4MB.js} +2 -2
  230. package/dist/cli/chunks/daemon-43MXIVH3.js +18 -0
  231. package/dist/cli/chunks/{daemon-MZKVM4CJ.js → daemon-VAMJLQJ5.js} +3 -3
  232. package/dist/cli/chunks/{dag-attention-scheduler-X4CYW665.js → dag-attention-scheduler-UBP4VHTA.js} +2 -2
  233. package/dist/cli/chunks/{detect-7BM2XINO.js → detect-QWFIQRKI.js} +2 -2
  234. package/dist/cli/chunks/{dist-node-Y5APLEYB.js → dist-node-I2GICS3W.js} +2 -2
  235. package/dist/cli/chunks/{domain-handler-X3ZRJNAH.js → domain-handler-Z66ISB2A.js} +2 -2
  236. package/dist/cli/chunks/{domain-plugins-2UW5KQJB.js → domain-plugins-KHMD3FKT.js} +2 -2
  237. package/dist/cli/chunks/{domain-transfer-35W4CIBV.js → domain-transfer-JWGNNA6K.js} +2 -2
  238. package/dist/cli/chunks/dream-VQ2PZCVR.js +2 -0
  239. package/dist/cli/chunks/embed-and-insert-pattern-F5P5B6JX.js +3 -0
  240. package/dist/cli/chunks/{embedding-space-SBM2MZD2.js → embedding-space-KHG6TITM.js} +2 -2
  241. package/dist/cli/chunks/{eval-4QA2SROK.js → eval-43OHU7EI.js} +2 -2
  242. package/dist/cli/chunks/{experience-capture-middleware-Z6BF6KYM.js → experience-capture-middleware-KXD47H6P.js} +3 -3
  243. package/dist/cli/chunks/{fast-paths-FIORX6GN.js → fast-paths-6D75D5KD.js} +2 -2
  244. package/dist/cli/chunks/{feature-flags-6LYI2T4G.js → feature-flags-IE35Y55N.js} +2 -2
  245. package/dist/cli/chunks/{feature-flags-ZOO7LMIC.js → feature-flags-OYYHY7LS.js} +2 -2
  246. package/dist/cli/chunks/file-discovery-LGBTY3ID.js +2 -0
  247. package/dist/cli/chunks/{fleet-7WF53H4F.js → fleet-AGVJMFGD.js} +16 -16
  248. package/dist/cli/chunks/{gnn-wrapper-KJ6B7BRM.js → gnn-wrapper-5L66A7LW.js} +2 -2
  249. package/dist/cli/chunks/{heartbeat-handler-DEKKMOVW.js → heartbeat-handler-2BY6YYOT.js} +5 -5
  250. package/dist/cli/chunks/heartbeat-scheduler-3DU3M5AT.js +2 -0
  251. package/dist/cli/chunks/hnsw-adapter-N2IMSRPV.js +2 -0
  252. package/dist/cli/chunks/hnsw-index-DVU7TTJE.js +2 -0
  253. package/dist/cli/chunks/{hnsw-legacy-bridge-L27WS27N.js → hnsw-legacy-bridge-RYMWFNAH.js} +2 -2
  254. package/dist/cli/chunks/{hnswlib-node-4YOQC6L4.js → hnswlib-node-GG47HP2P.js} +2 -2
  255. package/dist/cli/chunks/{hooks-TAOKV4EJ.js → hooks-FQNACS24.js} +10 -10
  256. package/dist/cli/chunks/hybrid-backend-AS2PNHOD.js +2 -0
  257. package/dist/cli/chunks/{hypergraph-engine-BODRJLHL.js → hypergraph-engine-6BYNJQEP.js} +2 -2
  258. package/dist/cli/chunks/{hypergraph-handler-RKMYJNTU.js → hypergraph-handler-CYTAXZKJ.js} +3 -3
  259. package/dist/cli/chunks/impact-analyzer-Y4OONLFP.js +2 -0
  260. package/dist/cli/chunks/{init-guard-MXHSLSB2.js → init-guard-METTAV5O.js} +2 -2
  261. package/dist/cli/chunks/{init-handler-HUE57IFW.js → init-handler-GFT74U5Y.js} +6 -6
  262. package/dist/cli/chunks/init-wizard-HLNUBJQN.js +2 -0
  263. package/dist/cli/chunks/kernel-XKFWCL7Y.js +2 -0
  264. package/dist/cli/chunks/{kilocode-installer-S333IKYQ.js → kilocode-installer-GZV2D3FF.js} +2 -2
  265. package/dist/cli/chunks/{kiro-installer-WM5DLQWC.js → kiro-installer-Q4ZXUFC7.js} +2 -2
  266. package/dist/cli/chunks/knowledge-graph-CNL77CSZ.js +2 -0
  267. package/dist/cli/chunks/{learning-LNHMQLH5.js → learning-WA2QEYL7.js} +35 -34
  268. package/dist/cli/chunks/{llm-router-EWFXYZZR.js → llm-router-GRTCHWH7.js} +4 -4
  269. package/dist/cli/chunks/llm-router-service-UIYTYKP6.js +2 -0
  270. package/dist/cli/chunks/{load-FGYGWVDK.js → load-WXN3Q7Y5.js} +2 -2
  271. package/dist/cli/chunks/load-test-PXLW4A5B.js +2 -0
  272. package/dist/cli/chunks/{mcp-2FHNAAOM.js → mcp-LIQCPSJN.js} +2 -2
  273. package/dist/cli/chunks/{memory-DZMQ73AB.js → memory-OP6CHRFH.js} +5 -5
  274. package/dist/cli/chunks/memory-backend-XYOSO73Q.js +2 -0
  275. package/dist/cli/chunks/memory-handlers-PQFYVNVG.js +2 -0
  276. package/dist/cli/chunks/{multi-model-executor-6F2UAEUW.js → multi-model-executor-H54DEVRZ.js} +2 -2
  277. package/dist/cli/chunks/{opencode-installer-XY3BGOTZ.js → opencode-installer-BSQV6UAT.js} +2 -2
  278. package/dist/cli/chunks/{orchestrator-B4CNKUOS.js → orchestrator-TJDPQ4VL.js} +122 -35
  279. package/dist/cli/chunks/pattern-null-store-BKGTQFNF.js +2 -0
  280. package/dist/cli/chunks/{pattern-usage-recorder-R4GUFNMD.js → pattern-usage-recorder-FOVS4M5L.js} +2 -2
  281. package/dist/cli/chunks/{pipeline-FG5RKVRO.js → pipeline-4AY2ZIC6.js} +2 -2
  282. package/dist/cli/chunks/{platform-3BT4KEVJ.js → platform-FCSITYMR.js} +2 -2
  283. package/dist/cli/chunks/{plugin-WI4RIN7O.js → plugin-E56TV5S2.js} +2 -2
  284. package/dist/cli/chunks/{prime-radiant-advanced-wasm-7ECDNQFS.js → prime-radiant-advanced-wasm-ACOPC533.js} +2 -2
  285. package/dist/cli/chunks/project-root-MPX7CN2C.js +2 -0
  286. package/dist/cli/chunks/protocol-executor-CRQOCC4A.js +2 -0
  287. package/dist/cli/chunks/{protocol-handler-WNODKPGW.js → protocol-handler-KRVXF4LS.js} +2 -2
  288. package/dist/cli/chunks/{prove-5RHAEPYZ.js → prove-KMFPSKGD.js} +2 -2
  289. package/dist/cli/chunks/qe-reasoning-bank-UEGQ3O7F.js +2 -0
  290. package/dist/cli/chunks/{quality-WPHR7BGQ.js → quality-6DBI3HLB.js} +2 -2
  291. package/dist/cli/chunks/{quality-gate-4RKTEZMX.js → quality-gate-3ROZMEIL.js} +3 -3
  292. package/dist/cli/chunks/queen-coordinator-32574XSG.js +2 -0
  293. package/dist/cli/chunks/real-embeddings-MIGZNKK3.js +2 -0
  294. package/dist/cli/chunks/{ref-validation-TPAWHOHH.js → ref-validation-EYIP7DHW.js} +2 -2
  295. package/dist/cli/chunks/{roocode-installer-7AVHFNDI.js → roocode-installer-IGGZHR2Y.js} +2 -2
  296. package/dist/cli/chunks/router-CZJY5WX6.js +2 -0
  297. package/dist/cli/chunks/routing-feedback-RC3UBNFX.js +2 -0
  298. package/dist/cli/chunks/{routing-handler-YKEDVJSH.js → routing-handler-BWNHBYDC.js} +2 -2
  299. package/dist/cli/chunks/{ruvector-commands-JUAMM354.js → ruvector-commands-PXIHF432.js} +2 -2
  300. package/dist/cli/chunks/rvf-dual-writer-OG7OV2AK.js +2 -0
  301. package/dist/cli/chunks/rvf-migration-adapter-THYMW7ZO.js +2 -0
  302. package/dist/cli/chunks/rvf-migration-coordinator-3H6CLFU7.js +2 -0
  303. package/dist/cli/chunks/rvf-native-adapter-6JQJIKKW.js +2 -0
  304. package/dist/cli/chunks/{rvf-store-integrity-VJDUIRTX.js → rvf-store-integrity-CVB3NMSL.js} +2 -2
  305. package/dist/cli/chunks/safe-db-QFKCVTIJ.js +2 -0
  306. package/dist/cli/chunks/schedule-6JLVMMYB.js +2 -0
  307. package/dist/cli/chunks/scheduler-3MPZRMJD.js +2 -0
  308. package/dist/cli/chunks/{security-ORDN3RD2.js → security-DCRGOTWU.js} +3 -3
  309. package/dist/cli/chunks/{shared-rvf-adapter-CF4BCIO7.js → shared-rvf-adapter-GKD74QUB.js} +2 -2
  310. package/dist/cli/chunks/{shared-rvf-dual-writer-C32UBR6D.js → shared-rvf-dual-writer-HVAAVEOH.js} +2 -2
  311. package/dist/cli/chunks/sqlite-persistence-LGTIKAEX.js +2 -0
  312. package/dist/cli/chunks/{standalone-memory-OXRJYZXN.js → standalone-memory-O7O2U5N4.js} +2 -2
  313. package/dist/cli/chunks/{status-handler-BCX5D4HY.js → status-handler-BQTPJJTL.js} +2 -2
  314. package/dist/cli/chunks/{structural-health-LFG7RUU6.js → structural-health-4H6J4OHK.js} +2 -2
  315. package/dist/cli/chunks/sync-DJ4TF6QX.js +2 -0
  316. package/dist/cli/chunks/{sync-YJEE2K2L.js → sync-WW5TAVYW.js} +2 -2
  317. package/dist/cli/chunks/{task-handler-6LXKPTXJ.js → task-handler-HEM4IEOW.js} +2 -2
  318. package/dist/cli/chunks/{task-handlers-CILP36I7.js → task-handlers-JRA3NXIR.js} +3 -3
  319. package/dist/cli/chunks/test-772ZXVG2.js +34 -0
  320. package/dist/cli/chunks/test-runner-process-XGF2U3NG.js +2 -0
  321. package/dist/cli/chunks/{test-scheduling-ISI2O4Q5.js → test-scheduling-4TRB7LZ7.js} +3 -3
  322. package/dist/cli/chunks/token-bootstrap-CICBIJ7T.js +2 -0
  323. package/dist/cli/chunks/{token-usage-XOC5KG7S.js → token-usage-B7PEKE2G.js} +2 -2
  324. package/dist/cli/chunks/{transformers-LSLQAARK.js → transformers-V7X7BDZX.js} +2 -2
  325. package/dist/cli/chunks/tree-sitter-wasm-parser-OXPFKFZS.js +2 -0
  326. package/dist/cli/chunks/{types-5BLCGLCR.js → types-AHHTUY3I.js} +2 -2
  327. package/dist/cli/chunks/unified-memory-GUR3IUI6.js +2 -0
  328. package/dist/cli/chunks/unified-memory-hnsw-NJP2F2RY.js +2 -0
  329. package/dist/cli/chunks/unified-persistence-NILBWXDP.js +2 -0
  330. package/dist/cli/chunks/{upgrade-RQJYLK3J.js → upgrade-DZ4DLUQ5.js} +2 -2
  331. package/dist/cli/chunks/{validate-QBHWXXCK.js → validate-4DTLIDJE.js} +2 -2
  332. package/dist/cli/chunks/{validate-swarm-IKXBKFB5.js → validate-swarm-A26UFVIS.js} +2 -2
  333. package/dist/cli/chunks/visual-security-YECYZ27X.js +2 -0
  334. package/dist/cli/chunks/{web-tree-sitter-ZF6FIE5R.js → web-tree-sitter-F2C7QRYT.js} +2 -2
  335. package/dist/cli/chunks/{windsurf-installer-HQGDZT5D.js → windsurf-installer-OOBTDA6W.js} +2 -2
  336. package/dist/cli/chunks/{witness-chain-DCHCAMSQ.js → witness-chain-KGFZJP32.js} +2 -2
  337. package/dist/cli/chunks/witness-chain-LYBXFLJB.js +2 -0
  338. package/dist/cli/chunks/witness-chain-repair-CNTXOGPN.js +2 -0
  339. package/dist/cli/chunks/{witness-chain-verifier-PX2OQ6XT.js → witness-chain-verifier-OB7ZZOI3.js} +2 -2
  340. package/dist/cli/chunks/{witness-key-manager-RXYQNFJB.js → witness-key-manager-YCKGKGQI.js} +2 -2
  341. package/dist/cli/chunks/{workflow-FBKCA4H6.js → workflow-PRERHWKY.js} +4 -4
  342. package/dist/cli/chunks/workflow-orchestrator-UIBGWCU3.js +2 -0
  343. package/dist/cli/chunks/wrappers-L4UY4V63.js +2 -0
  344. package/dist/cli/commands/coverage.js +4 -1
  345. package/dist/cli/commands/learning-prune.js +9 -1
  346. package/dist/cli/commands/test.js +26 -4
  347. package/dist/cli/handlers/brain-handler.js +32 -2
  348. package/dist/cli/handlers/heartbeat-handler.js +3 -1
  349. package/dist/cli/utils/coverage-data.js +5 -1
  350. package/dist/cli/utils/coverage-verdict.d.ts +10 -2
  351. package/dist/cli/utils/coverage-verdict.js +23 -8
  352. package/dist/cli/utils/fleet-operation.js +9 -3
  353. package/dist/coordination/handlers/code-intelligence-handlers.js +17 -3
  354. package/dist/coordination/handlers/coverage-handlers.js +22 -9
  355. package/dist/coordination/handlers/coverage-target.d.ts +22 -2
  356. package/dist/coordination/handlers/coverage-target.js +45 -9
  357. package/dist/coordination/handlers/handler-utils.d.ts +19 -0
  358. package/dist/coordination/handlers/handler-utils.js +22 -8
  359. package/dist/coordination/handlers/test-execution-handlers.js +64 -20
  360. package/dist/coordination/protocols/code-intelligence-index.js +6 -3
  361. package/dist/coordination/protocols/learning-consolidation-archive.d.ts +6 -3
  362. package/dist/coordination/protocols/learning-consolidation-archive.js +4 -3
  363. package/dist/coordination/workflow-builtin.js +1 -0
  364. package/dist/domains/code-intelligence/services/semantic-analyzer.d.ts +8 -3
  365. package/dist/domains/code-intelligence/services/semantic-analyzer.js +39 -25
  366. package/dist/domains/code-intelligence/services/text-relevance.d.ts +32 -0
  367. package/dist/domains/code-intelligence/services/text-relevance.js +63 -0
  368. package/dist/domains/defect-intelligence/interfaces.d.ts +2 -0
  369. package/dist/domains/defect-intelligence/prediction-history.d.ts +15 -1
  370. package/dist/domains/defect-intelligence/prediction-history.js +63 -7
  371. package/dist/domains/defect-intelligence/services/defect-predictor.d.ts +1 -0
  372. package/dist/domains/defect-intelligence/services/defect-predictor.js +33 -13
  373. package/dist/domains/learning-optimization/coordinator.js +17 -10
  374. package/dist/domains/learning-optimization/domain-ranking.d.ts +26 -0
  375. package/dist/domains/learning-optimization/domain-ranking.js +28 -0
  376. package/dist/domains/learning-optimization/interfaces.d.ts +5 -0
  377. package/dist/domains/learning-optimization/pattern-archive.d.ts +55 -8
  378. package/dist/domains/learning-optimization/pattern-archive.js +90 -17
  379. package/dist/domains/learning-optimization/pattern-consolidation.js +18 -2
  380. package/dist/domains/learning-optimization/pattern-merge.d.ts +26 -0
  381. package/dist/domains/learning-optimization/pattern-merge.js +127 -0
  382. package/dist/domains/learning-optimization/services/learning-coordinator.js +21 -35
  383. package/dist/domains/test-execution/coordinator.d.ts +3 -1
  384. package/dist/domains/test-execution/coordinator.js +13 -4
  385. package/dist/domains/test-execution/interfaces.d.ts +5 -0
  386. package/dist/domains/test-execution/plugin.js +2 -0
  387. package/dist/domains/test-execution/services/flaky-detector.d.ts +9 -1
  388. package/dist/domains/test-execution/services/flaky-detector.js +26 -8
  389. package/dist/domains/test-execution/services/retry-handler.d.ts +7 -1
  390. package/dist/domains/test-execution/services/retry-handler.js +44 -5
  391. package/dist/domains/test-execution/services/runner-test-cases.d.ts +2 -0
  392. package/dist/domains/test-execution/services/runner-test-cases.js +7 -3
  393. package/dist/domains/test-execution/services/test-executor.d.ts +5 -1
  394. package/dist/domains/test-execution/services/test-executor.js +85 -17
  395. package/dist/init/copilot-installer.d.ts +6 -0
  396. package/dist/init/copilot-installer.js +37 -17
  397. package/dist/init/init-wizard-steps.js +3 -1
  398. package/dist/init/phases/07-hooks.js +97 -10
  399. package/dist/init/platform-config-generator.d.ts +10 -0
  400. package/dist/init/platform-config-generator.js +26 -1
  401. package/dist/integrations/embeddings/cache/EmbeddingCache.js +1 -1
  402. package/dist/integrations/ruvector/brain-rvf-exporter.d.ts +16 -1
  403. package/dist/integrations/ruvector/brain-rvf-exporter.js +18 -32
  404. package/dist/integrations/ruvector/brain-rvf-richness.d.ts +75 -0
  405. package/dist/integrations/ruvector/brain-rvf-richness.js +127 -0
  406. package/dist/kernel/unified-memory-migration.js +1 -1
  407. package/dist/kernel/unified-memory.d.ts +8 -0
  408. package/dist/kernel/unified-memory.js +13 -0
  409. package/dist/learning/checkpoint-shrink-ack.d.ts +25 -0
  410. package/dist/learning/checkpoint-shrink-ack.js +57 -0
  411. package/dist/learning/dream/dream-engine.d.ts +44 -3
  412. package/dist/learning/dream/dream-engine.js +6 -2
  413. package/dist/learning/embedder-endpoint-client.d.ts +45 -0
  414. package/dist/learning/embedder-endpoint-client.js +98 -3
  415. package/dist/learning/embedder-identity-store.js +3 -1
  416. package/dist/learning/embedding-space-legacy-adoption.d.ts +53 -0
  417. package/dist/learning/embedding-space-legacy-adoption.js +115 -0
  418. package/dist/learning/embedding-space-registry.d.ts +90 -0
  419. package/dist/learning/embedding-space-registry.js +181 -0
  420. package/dist/learning/experience-capture.d.ts +3 -1
  421. package/dist/learning/experience-capture.js +15 -5
  422. package/dist/learning/experience-space-verification.d.ts +2 -0
  423. package/dist/learning/experience-space-verification.js +3 -2
  424. package/dist/learning/learning-retention.js +4 -0
  425. package/dist/learning/pattern-promotion.d.ts +7 -0
  426. package/dist/learning/pattern-promotion.js +64 -12
  427. package/dist/learning/real-embeddings.d.ts +3 -0
  428. package/dist/learning/real-embeddings.js +73 -11
  429. package/dist/learning/rvf-pattern-store.js +6 -1
  430. package/dist/mcp/bundle.js +558 -537
  431. package/dist/mcp/handlers/domain-handler-configs.d.ts +3 -0
  432. package/dist/mcp/handlers/domain-handler-configs.js +1 -0
  433. package/dist/mcp/handlers/heartbeat-handlers.d.ts +4 -2
  434. package/dist/mcp/protocol-server.js +1 -1
  435. package/dist/mcp/tools/learning-optimization/optimize.d.ts +6 -1
  436. package/dist/mcp/tools/learning-optimization/optimize.js +20 -11
  437. package/dist/planning/goap-planner.js +4 -0
  438. package/dist/planning/plan-executor.js +6 -2
  439. package/dist/shared/embeddings/index.d.ts +2 -2
  440. package/dist/shared/embeddings/index.js +1 -1
  441. package/dist/shared/embeddings/nomic-embedder.d.ts +8 -2
  442. package/dist/shared/embeddings/nomic-embedder.js +19 -11
  443. package/dist/shared/embeddings/ollama-client.d.ts +28 -2
  444. package/dist/shared/embeddings/ollama-client.js +84 -22
  445. package/dist/shared/embeddings/types.d.ts +15 -0
  446. package/dist/shared/embeddings/types.js +4 -0
  447. package/dist/shared/git/git-analyzer.d.ts +30 -11
  448. package/dist/shared/git/git-analyzer.js +95 -48
  449. package/dist/shared/io/confined-read.d.ts +32 -7
  450. package/dist/shared/io/confined-read.js +58 -25
  451. package/dist/shared/io/file-reader.js +4 -1
  452. package/dist/shared/pytest-junit-report.d.ts +93 -0
  453. package/dist/shared/pytest-junit-report.js +241 -0
  454. package/dist/shared/safe-db.d.ts +1 -1
  455. package/dist/shared/safe-db.js +20 -5
  456. package/dist/shared/sqlite-journal-mode.d.ts +39 -0
  457. package/dist/shared/sqlite-journal-mode.js +53 -0
  458. package/dist/shared/test-runner-project.d.ts +51 -1
  459. package/dist/shared/test-runner-project.js +140 -25
  460. package/dist/sync/claude-flow-bridge.js +1 -1
  461. package/dist/sync/readers/sqlite-reader.js +3 -4
  462. package/dist/sync/writers/sqlite-writer.js +1 -1
  463. package/dist/workers/interfaces.d.ts +2 -2
  464. package/dist/workers/quality-daemon/git-watcher.d.ts +8 -0
  465. package/dist/workers/quality-daemon/git-watcher.js +54 -12
  466. package/dist/workers/quality-daemon/index.js +1 -1
  467. package/dist/workers/quality-daemon/priority-queue.d.ts +2 -1
  468. package/dist/workers/workers/defect-predictor.d.ts +9 -4
  469. package/dist/workers/workers/defect-predictor.js +98 -37
  470. package/package.json +1 -1
  471. package/dist/cli/chunks/adapter-6CQ2PIP5.js +0 -2
  472. package/dist/cli/chunks/aqe-learning-engine-73RR52VS.js +0 -2
  473. package/dist/cli/chunks/base-SMCMMVGP.js +0 -2
  474. package/dist/cli/chunks/brain-handler-HQWZFO52.js +0 -95
  475. package/dist/cli/chunks/browser-workflow-A2MEZ66K.js +0 -2
  476. package/dist/cli/chunks/chunk-CGGUM2YJ.js +0 -3
  477. package/dist/cli/chunks/chunk-D6COXLYE.js +0 -8
  478. package/dist/cli/chunks/chunk-EGYE5UPQ.js +0 -2
  479. package/dist/cli/chunks/chunk-IUBJVHNB.js +0 -3
  480. package/dist/cli/chunks/chunk-KL7OKSU2.js +0 -4
  481. package/dist/cli/chunks/chunk-KPRCB5LT.js +0 -7
  482. package/dist/cli/chunks/chunk-LRSX2FJM.js +0 -2
  483. package/dist/cli/chunks/chunk-M4FRQ4TE.js +0 -12
  484. package/dist/cli/chunks/chunk-MAFQV4U4.js +0 -16
  485. package/dist/cli/chunks/chunk-NZU4ACBZ.js +0 -2
  486. package/dist/cli/chunks/chunk-RV74I3YO.js +0 -3
  487. package/dist/cli/chunks/chunk-SJ6Y4725.js +0 -5
  488. package/dist/cli/chunks/chunk-UE5ZOZR2.js +0 -2
  489. package/dist/cli/chunks/chunk-VSIKHWZ4.js +0 -29
  490. package/dist/cli/chunks/chunk-YAPLJR7K.js +0 -2
  491. package/dist/cli/chunks/client-MHQRTZM4.js +0 -2
  492. package/dist/cli/chunks/copilot-installer-IGJ6KGQY.js +0 -3
  493. package/dist/cli/chunks/core-handlers-UAK3LLJE.js +0 -2
  494. package/dist/cli/chunks/cross-domain-router-WTRZQPNQ.js +0 -2
  495. package/dist/cli/chunks/daemon-CAVZ7OFV.js +0 -18
  496. package/dist/cli/chunks/dream-EJY24JN6.js +0 -2
  497. package/dist/cli/chunks/embed-and-insert-pattern-COG4C7ZI.js +0 -3
  498. package/dist/cli/chunks/file-discovery-UZSFSS4V.js +0 -2
  499. package/dist/cli/chunks/heartbeat-scheduler-NVR356I7.js +0 -2
  500. package/dist/cli/chunks/hnsw-adapter-LFMPLUJU.js +0 -2
  501. package/dist/cli/chunks/hnsw-index-POCPMVJH.js +0 -2
  502. package/dist/cli/chunks/hybrid-backend-4STAO7CV.js +0 -2
  503. package/dist/cli/chunks/impact-analyzer-3VIIISBQ.js +0 -2
  504. package/dist/cli/chunks/init-wizard-PL6QN6RQ.js +0 -2
  505. package/dist/cli/chunks/kernel-CCDWT7KS.js +0 -2
  506. package/dist/cli/chunks/knowledge-graph-KFOMEN3H.js +0 -2
  507. package/dist/cli/chunks/llm-router-service-7NBE2EX6.js +0 -2
  508. package/dist/cli/chunks/load-test-UNZUWY3F.js +0 -2
  509. package/dist/cli/chunks/memory-backend-DFGKWA2Q.js +0 -2
  510. package/dist/cli/chunks/memory-handlers-MP426XRJ.js +0 -2
  511. package/dist/cli/chunks/pattern-null-store-SSVF5TE5.js +0 -2
  512. package/dist/cli/chunks/project-root-BEANNYWU.js +0 -2
  513. package/dist/cli/chunks/protocol-executor-FQVIHXZ7.js +0 -2
  514. package/dist/cli/chunks/qe-reasoning-bank-5TFYSE24.js +0 -2
  515. package/dist/cli/chunks/queen-coordinator-Y2OUL7IN.js +0 -2
  516. package/dist/cli/chunks/real-embeddings-OXLYU7JW.js +0 -2
  517. package/dist/cli/chunks/router-EP34O3KB.js +0 -2
  518. package/dist/cli/chunks/routing-feedback-FJCRKXNG.js +0 -2
  519. package/dist/cli/chunks/rvf-dual-writer-ILITJSFG.js +0 -2
  520. package/dist/cli/chunks/rvf-migration-adapter-XF6W4C2N.js +0 -2
  521. package/dist/cli/chunks/rvf-migration-coordinator-CMKG56AR.js +0 -2
  522. package/dist/cli/chunks/rvf-native-adapter-7YFW6S4Y.js +0 -2
  523. package/dist/cli/chunks/safe-db-TCAU4FUT.js +0 -2
  524. package/dist/cli/chunks/schedule-NB5KV435.js +0 -2
  525. package/dist/cli/chunks/scheduler-JKXGKVK6.js +0 -2
  526. package/dist/cli/chunks/sqlite-persistence-IXCNZRTW.js +0 -2
  527. package/dist/cli/chunks/sync-OSF7C2NL.js +0 -2
  528. package/dist/cli/chunks/test-SD457QJ6.js +0 -34
  529. package/dist/cli/chunks/test-runner-process-VKD65QQU.js +0 -2
  530. package/dist/cli/chunks/token-bootstrap-VUELSBOS.js +0 -2
  531. package/dist/cli/chunks/tree-sitter-wasm-parser-YAIPHRIL.js +0 -2
  532. package/dist/cli/chunks/unified-memory-GI76TXFV.js +0 -2
  533. package/dist/cli/chunks/unified-memory-hnsw-GXJ5BTZO.js +0 -2
  534. package/dist/cli/chunks/unified-persistence-OP7FDQPD.js +0 -2
  535. package/dist/cli/chunks/visual-security-GZ2MOKWB.js +0 -2
  536. package/dist/cli/chunks/witness-chain-P3XXXA62.js +0 -2
  537. package/dist/cli/chunks/witness-chain-repair-PUX2NFDL.js +0 -2
  538. package/dist/cli/chunks/workflow-orchestrator-P2APAJAA.js +0 -2
  539. package/dist/cli/chunks/wrappers-TWSKBTWD.js +0 -2
@@ -5,10 +5,10 @@
5
5
  * Covers: index-code, predict-defects
6
6
  */
7
7
  import { randomUUID } from 'node:crypto';
8
- import { prunePredictionHistory } from '../../domains/defect-intelligence/prediction-history.js';
8
+ import { MAX_PREDICTION_TARGET_LENGTH, prunePredictionHistory } from '../../domains/defect-intelligence/prediction-history.js';
9
9
  import * as path from 'path';
10
10
  import { ok, err } from '../../shared/types/index.js';
11
- import { toError } from '../../shared/error-utils.js';
11
+ import { CallerInputError, toError, toErrorMessage } from '../../shared/error-utils.js';
12
12
  import { discoverSourceFiles } from './handler-utils.js';
13
13
  import { resolveProjectRootFromPaths } from '../../domains/code-intelligence/project-root-resolver.js';
14
14
  import { nothingIndexedError } from '../../domains/code-intelligence/index-path-guard.js';
@@ -50,6 +50,10 @@ async function collectProjectMetricsForTarget(ctx, targetPath, indexedFiles) {
50
50
  async function confineTarget(taskType, target) {
51
51
  if (!target || target === '.')
52
52
  return ok(undefined);
53
+ // #1137: no path is longer than PATH_MAX; refuse before resolving, echoing or storing it.
54
+ if (typeof target === 'string' && target.length > MAX_PREDICTION_TARGET_LENGTH) {
55
+ return err(new CallerInputError(`Invalid ${taskType} payload: 'target' is ${target.length} characters; the limit is ${MAX_PREDICTION_TARGET_LENGTH}`));
56
+ }
53
57
  return requirePayloadPath(taskType, 'target', target, { allowDirectory: true, allowMissing: true });
54
58
  }
55
59
  /**
@@ -284,6 +288,7 @@ export function registerCodeIntelligenceHandlers(ctx) {
284
288
  const id = randomUUID();
285
289
  await ctx.memory.set(`defect-intelligence:predictor:prediction:${id}`, {
286
290
  id,
291
+ target: targetPath,
287
292
  timestamp: new Date().toISOString(),
288
293
  predictions,
289
294
  predictionMethod: 'static-code-indicators',
@@ -291,7 +296,15 @@ export function registerCodeIntelligenceHandlers(ctx) {
291
296
  filesSkipped,
292
297
  scanStatus: filesSkipped > 0 ? 'partial' : 'complete',
293
298
  }, { namespace: 'defect-intelligence', ttl: 86400 * 7 });
294
- await prunePredictionHistory(ctx.memory);
299
+ // #1137: the run is stored; a retention failure must not report it lost.
300
+ let retentionError;
301
+ try {
302
+ await prunePredictionHistory(ctx.memory);
303
+ }
304
+ catch (error) {
305
+ retentionError = toErrorMessage(error);
306
+ logger.warn('Defect prediction stored, but pruning older runs failed', { error: retentionError });
307
+ }
295
308
  // Sort by probability descending
296
309
  predictedDefects.sort((a, b) => b.probability - a.probability);
297
310
  // Calculate overall risk score
@@ -326,6 +339,7 @@ export function registerCodeIntelligenceHandlers(ctx) {
326
339
  scanStatus: filesSkipped > 0 ? 'partial' : 'complete',
327
340
  predictionMethod: 'static-code-indicators',
328
341
  estimated: true,
342
+ ...(retentionError ? { retention: 'failed', retentionError } : {}),
329
343
  });
330
344
  }
331
345
  catch (error) {
@@ -8,7 +8,7 @@ import { ok, err } from '../../shared/types/index.js';
8
8
  import { toError } from '../../shared/error-utils.js';
9
9
  import { requirePayloadPath } from '../../shared/io/payload-path-guard.js';
10
10
  import { buildEstimatedCoverage, collectRustCoverage, findCargoRoot, isCoverageExecDisabled, isRustProject, } from './coverage-collection.js';
11
- import { describeNoData, evaluateCoverageForTarget, isUnmeasured, packageFilterForTarget, resolveExistingCoverage, scopeCoverageToTarget, reconcileRecommendations, thresholdVerdict, } from './coverage-target.js';
11
+ import { describeNoData, describeRefusedReports, evaluateCoverageForTarget, isUnmeasured, packageFilterForTarget, resolveExistingCoverage, scopeCoverageToTarget, reconcileRecommendations, thresholdVerdict, } from './coverage-target.js';
12
12
  import { describeEvidence, describeExcludedEntries } from './coverage-evidence.js';
13
13
  import { randomUUID } from 'crypto';
14
14
  import * as path from 'path';
@@ -56,7 +56,10 @@ function instrumented(files) {
56
56
  function fromEvaluation(evaluation, ranTests, projectRoot) {
57
57
  return evaluation.status === 'measured'
58
58
  ? { collected: instrumented(evaluation.files), ranTests, projectRoot, evidence: evaluation.evidence }
59
- : { collected: null, ranTests, noData: evaluation.reason, projectRoot };
59
+ : {
60
+ collected: null, ranTests, noData: evaluation.reason, projectRoot,
61
+ ...(evaluation.refused ? { refused: evaluation.refused } : {}),
62
+ };
60
63
  }
61
64
  /**
62
65
  * Collect coverage for a target, preferring real measurement over estimation
@@ -83,8 +86,13 @@ async function collectCoverage(targetPath) {
83
86
  if (existing.status === 'evaluated') {
84
87
  return fromEvaluation(existing.evaluation, false, existing.projectRoot);
85
88
  }
86
- const { target } = existing;
87
- let projectRoot = existing.projectRoot;
89
+ // #1186: a report that exists but was refused is named in the result,
90
+ // whatever the run or estimate below produces.
91
+ const result = await collectWithoutReport(existing.target, existing.projectRoot);
92
+ return existing.refused.length > 0 ? { ...result, refused: existing.refused } : result;
93
+ }
94
+ /** Steps 2-3 of the cascade: no usable report exists at the project root. */
95
+ async function collectWithoutReport(target, projectRoot) {
88
96
  // #569 work item 1: delegate to real instrumentation where available.
89
97
  if (isRustProject(target)) {
90
98
  const rust = await collectRustCoverage(target);
@@ -171,9 +179,9 @@ async function collectCoverage(targetPath) {
171
179
  };
172
180
  }
173
181
  /** Caller-facing explanation for a result with no coverage figures. */
174
- function noDataWarning(reason, ranTests, targetPath, projectRoot) {
182
+ function noDataWarning(reason, ranTests, targetPath, projectRoot, refused = []) {
175
183
  if (reason)
176
- return describeNoData(reason, targetPath, projectRoot);
184
+ return describeNoData(reason, targetPath, projectRoot, refused);
177
185
  return ranTests
178
186
  ? 'Tests ran but no coverage output was generated. Ensure a coverage provider is configured (e.g., @vitest/coverage-v8, istanbul).'
179
187
  : 'No coverage data found and could not run tests automatically. ' + estimationGuidance(targetPath);
@@ -213,7 +221,9 @@ export function registerCoverageHandlers(ctx) {
213
221
  }
214
222
  const analyzer = ctx.getCoverageAnalyzer();
215
223
  const threshold = payload.threshold || 80;
216
- const { collected, ranTests, noData, projectRoot, notes, runStatus, testRun, evidence } = await collectCoverage(targetPath);
224
+ const { collected, ranTests, noData, projectRoot, notes, runStatus, testRun, evidence, refused } = await collectCoverage(targetPath);
225
+ // #1186: a refused report is named, never reported as a missing one.
226
+ const refusedNote = refused?.length && noData !== 'refused-report' ? [describeRefusedReports(refused)] : [];
217
227
  // #995 review N5: say so plainly instead of "no coverage data found".
218
228
  if (noData === 'target-missing') {
219
229
  return err(new Error(describeNoData('target-missing', targetPath, null)));
@@ -234,7 +244,10 @@ export function registerCoverageHandlers(ctx) {
234
244
  // #995(d): "no measurement exists for this target", distinct from 0%.
235
245
  ...(unmeasured ? { unmeasured: true } : {}),
236
246
  algorithm: 'sublinear-O(log n)',
237
- warning: notes?.length ? notes.join(' ') : noDataWarning(noData, ranTests, targetPath, projectRoot),
247
+ warning: [
248
+ ...refusedNote,
249
+ notes?.length ? notes.join(' ') : noDataWarning(noData, ranTests, targetPath, projectRoot, refused),
250
+ ].join(' '),
238
251
  });
239
252
  }
240
253
  const { data: coverageData, provenance } = collected;
@@ -283,7 +296,7 @@ export function registerCoverageHandlers(ctx) {
283
296
  // sources, leave the evidence insufficient: the figures stand for the
284
297
  // measured files only, and the threshold is not met on them.
285
298
  const evidenceReasons = describeEvidence(evidence, projectRoot ?? targetPath);
286
- const warnings = [...provenance.notes, ...(notes ?? [])];
299
+ const warnings = [...refusedNote, ...provenance.notes, ...(notes ?? [])];
287
300
  if (provenance.estimated)
288
301
  warnings.push(estimationGuidance(targetPath));
289
302
  if (evidenceReasons.length > 0) {
@@ -19,6 +19,7 @@
19
19
  * and the CLI `coverage` command can share it.
20
20
  */
21
21
  import type { CoverageData, FileCoverage } from '../../domains/coverage-analysis/interfaces';
22
+ import { type RefusedCoverageReport } from './handler-utils';
22
23
  import { type CoverageEvidence } from './coverage-evidence';
23
24
  /**
24
25
  * Walk up from a target to the nearest directory that holds a project marker.
@@ -52,6 +53,14 @@ export declare function isCoverageReportFile(filePath: string): boolean;
52
53
  * can't be parsed, or lists no files.
53
54
  */
54
55
  export declare function loadCoverageReportFile(filePath: string): Promise<CoverageData | null>;
56
+ /**
57
+ * `loadCoverageReportFile`, plus why the report was refused unread when it
58
+ * was (#1186), so a refused report is not described as an unparseable one.
59
+ */
60
+ export declare function readCoverageReportFile(filePath: string): Promise<{
61
+ data: CoverageData | null;
62
+ refused?: RefusedCoverageReport;
63
+ }>;
55
64
  /**
56
65
  * Keep only the report entries that lie under `target`.
57
66
  *
@@ -67,6 +76,8 @@ export type NoDataReason =
67
76
  'target-missing'
68
77
  /** A coverage report was given but cannot be parsed (malformed, raw V8, empty). */
69
78
  | 'unreadable-report'
79
+ /** A coverage report exists but was refused unread (#1186): see `refused`. */
80
+ | 'refused-report'
70
81
  /** The report lists only test files. */
71
82
  | 'test-only-report'
72
83
  /** The report has no entries under the target — it did not measure it. */
@@ -80,6 +91,7 @@ export type CoverageEvaluation = {
80
91
  } | {
81
92
  status: 'no-data';
82
93
  reason: NoDataReason;
94
+ refused?: RefusedCoverageReport[];
83
95
  };
84
96
  /**
85
97
  * Decide what a report says about `target`. Shared by the MCP handler and the
@@ -104,10 +116,13 @@ export declare function evaluateCoverageForTarget(report: CoverageData, projectR
104
116
  export type ExistingCoverage = {
105
117
  status: 'target-missing';
106
118
  target: string;
107
- } | {
119
+ }
120
+ /** `refused`: reports that exist but were not read (#1186); empty when none exists. */
121
+ | {
108
122
  status: 'no-report';
109
123
  target: string;
110
124
  projectRoot: string;
125
+ refused: RefusedCoverageReport[];
111
126
  } | {
112
127
  status: 'evaluated';
113
128
  target: string;
@@ -159,6 +174,11 @@ export declare function reconcileRecommendations(recommendations: string[], verd
159
174
  }): string[];
160
175
  /** Is this verdict "no measurement exists" (as opposed to an error or test-only report)? */
161
176
  export declare function isUnmeasured(reason: NoDataReason): boolean;
177
+ /**
178
+ * Why existing coverage reports were not used (#1186). A refused report is
179
+ * named with its reason, never described as a missing one. Shared by MCP and CLI.
180
+ */
181
+ export declare function describeRefusedReports(refused: readonly RefusedCoverageReport[]): string;
162
182
  /** Caller-facing explanation of a no-data verdict. Shared by MCP and CLI. */
163
- export declare function describeNoData(reason: NoDataReason, target: string, projectRoot: string | null): string;
183
+ export declare function describeNoData(reason: NoDataReason, target: string, projectRoot: string | null, refused?: readonly RefusedCoverageReport[]): string;
164
184
  //# sourceMappingURL=coverage-target.d.ts.map
@@ -19,10 +19,10 @@
19
19
  * and the CLI `coverage` command can share it.
20
20
  */
21
21
  import * as fs from 'fs';
22
- import { readConfinedText, readConfinedTextSync } from '../../shared/io/confined-read.js';
22
+ import { ConfinedReadError, readConfinedText, readConfinedTextSync } from '../../shared/io/confined-read.js';
23
23
  import * as os from 'os';
24
24
  import * as path from 'path';
25
- import { loadCoverageReport, parseCoberturaXml, parseCoverageJson, parseCoverageSummaryJson, parseLcovInfo, } from './handler-utils.js';
25
+ import { findCoverageReport, parseCoberturaXml, parseCoverageJson, parseCoverageSummaryJson, parseLcovInfo, } from './handler-utils.js';
26
26
  import { isTestPath } from './coverage-collection.js';
27
27
  import { assessCoverageEvidence } from './coverage-evidence.js';
28
28
  import { findProjectRoot } from '../../kernel/project-root.js';
@@ -327,15 +327,28 @@ export function isCoverageReportFile(filePath) {
327
327
  * can't be parsed, or lists no files.
328
328
  */
329
329
  export async function loadCoverageReportFile(filePath) {
330
+ return (await readCoverageReportFile(filePath)).data;
331
+ }
332
+ /**
333
+ * `loadCoverageReportFile`, plus why the report was refused unread when it
334
+ * was (#1186), so a refused report is not described as an unparseable one.
335
+ */
336
+ export async function readCoverageReportFile(filePath) {
330
337
  let content;
331
338
  try {
332
339
  // #1161: read from the validated descriptor, not the name checked earlier;
333
340
  // a report linked out of the project, or to a device, is not read.
334
341
  content = await readConfinedText(filePath, { outsideRoot: 'allow' });
335
342
  }
336
- catch {
337
- return null;
343
+ catch (error) {
344
+ if (error instanceof ConfinedReadError && error.reason !== 'not-found') {
345
+ return { data: null, refused: { path: filePath, reason: error.reason } };
346
+ }
347
+ return { data: null };
338
348
  }
349
+ return { data: parseCoverageReportContent(filePath, content) };
350
+ }
351
+ function parseCoverageReportContent(filePath, content) {
339
352
  if (content.trim().length === 0)
340
353
  return null;
341
354
  try {
@@ -469,17 +482,19 @@ export async function resolveExistingCoverage(targetPath) {
469
482
  const reportDir = path.dirname(target);
470
483
  const projectRoot = findCoverageProjectRoot(reportDir)
471
484
  ?? (path.basename(reportDir) === 'coverage' ? path.dirname(reportDir) : reportDir);
472
- const report = await loadCoverageReportFile(target);
485
+ const { data: report, refused } = await readCoverageReportFile(target);
473
486
  // The report itself is the target: judged whole, but still checked for staleness.
474
487
  const evaluation = report
475
488
  ? evaluateCoverageForTarget(report, projectRoot, projectRoot, { reportPath: target, checkCompleteness: false })
476
- : { status: 'no-data', reason: 'unreadable-report' };
489
+ : refused
490
+ ? { status: 'no-data', reason: 'refused-report', refused: [refused] }
491
+ : { status: 'no-data', reason: 'unreadable-report' };
477
492
  return { status: 'evaluated', target, projectRoot, source: 'report-file', evaluation };
478
493
  }
479
494
  const projectRoot = findCoverageProjectRoot(target) ?? (stat.isDirectory() ? target : path.dirname(target));
480
- const existing = await loadCoverageReport(projectRoot);
495
+ const { report: existing, refused } = await findCoverageReport(projectRoot);
481
496
  if (!existing)
482
- return { status: 'no-report', target, projectRoot };
497
+ return { status: 'no-report', target, projectRoot, refused };
483
498
  return {
484
499
  status: 'evaluated', target, projectRoot, source: 'project-report',
485
500
  evaluation: evaluateCoverageForTarget(existing.data, projectRoot, target, { reportPath: existing.path }),
@@ -526,11 +541,32 @@ export function reconcileRecommendations(recommendations, verdict, threshold, co
526
541
  export function isUnmeasured(reason) {
527
542
  return reason === 'target-not-covered' || reason === 'no-tests-ran';
528
543
  }
544
+ const REFUSAL_EXPLANATIONS = {
545
+ 'outside-project-root': 'it resolves outside the project (a symlink pointing out of it)',
546
+ 'not-a-file': 'it is not a regular file (a FIFO, device or directory)',
547
+ 'too-large': 'it is over the read size limit',
548
+ 'changed-during-read': 'it was replaced or removed while it was being read',
549
+ 'hardlinked': 'it has more than one hardlink',
550
+ 'unreadable': 'it could not be opened (permissions)',
551
+ };
552
+ /**
553
+ * Why existing coverage reports were not used (#1186). A refused report is
554
+ * named with its reason, never described as a missing one. Shared by MCP and CLI.
555
+ */
556
+ export function describeRefusedReports(refused) {
557
+ const items = refused.map(r => `${r.path} (${r.reason}: ${Object.hasOwn(REFUSAL_EXPLANATIONS, r.reason) ? REFUSAL_EXPLANATIONS[r.reason] : r.reason})`);
558
+ return `Coverage report refused and not read: ${items.join('; ')}. ` +
559
+ 'Write the report as a regular file inside the project, or pass a report file inside the project as the target.';
560
+ }
529
561
  /** Caller-facing explanation of a no-data verdict. Shared by MCP and CLI. */
530
- export function describeNoData(reason, target, projectRoot) {
562
+ export function describeNoData(reason, target, projectRoot, refused = []) {
531
563
  switch (reason) {
532
564
  case 'target-missing':
533
565
  return `Target does not exist: ${target}`;
566
+ case 'refused-report':
567
+ return refused.length > 0
568
+ ? describeRefusedReports(refused)
569
+ : `Coverage report refused and not read: ${target}.`;
534
570
  case 'unreadable-report':
535
571
  return `Unreadable coverage report: ${target}. It could not be parsed or lists no files. ` +
536
572
  'Supported: lcov.info, istanbul coverage-final.json / coverage-summary.json, Cobertura XML. ' +
@@ -4,6 +4,7 @@
4
4
  * These were originally module-level helpers in task-executor.ts and are
5
5
  * now co-located with the handlers that use them.
6
6
  */
7
+ import { type ConfinedReadReason } from '../../shared/io/confined-read.js';
7
8
  import type { CoverageData } from '../../domains/coverage-analysis';
8
9
  /**
9
10
  * Istanbul/nyc coverage-final.json file data structure
@@ -79,6 +80,24 @@ export declare function loadCoverageReport(targetPath: string): Promise<{
79
80
  data: CoverageData;
80
81
  path: string;
81
82
  } | null>;
83
+ /** A coverage report that exists but was refused unread (#1186). */
84
+ export interface RefusedCoverageReport {
85
+ path: string;
86
+ reason: ConfinedReadReason;
87
+ }
88
+ /**
89
+ * `loadCoverageReport` plus the reports that were refused unread (#1186): a
90
+ * report linked out of the project, a FIFO or device, or one over the size
91
+ * limit is not a missing report, and the caller must be able to say why it
92
+ * was not used.
93
+ */
94
+ export declare function findCoverageReport(targetPath: string): Promise<{
95
+ report: {
96
+ data: CoverageData;
97
+ path: string;
98
+ } | null;
99
+ refused: RefusedCoverageReport[];
100
+ }>;
82
101
  /**
83
102
  * Per-line hit counts of one istanbul file entry, computed the way istanbul's
84
103
  * own `FileCoverage#getLineCoverage` (and therefore coverage-summary.json
@@ -5,7 +5,7 @@
5
5
  * now co-located with the handlers that use them.
6
6
  */
7
7
  import * as fs from 'fs/promises';
8
- import { readConfinedText } from '../../shared/io/confined-read.js';
8
+ import { ConfinedReadError, readConfinedText } from '../../shared/io/confined-read.js';
9
9
  import * as path from 'path';
10
10
  import { isAqeManagedDir } from '../../shared/aqe-managed-dirs.js';
11
11
  import { safeJsonParse } from '../../shared/safe-json.js';
@@ -20,6 +20,16 @@ export async function loadCoverageData(targetPath) {
20
20
  }
21
21
  /** `loadCoverageData` plus the path of the report it read (#1154: staleness needs it). */
22
22
  export async function loadCoverageReport(targetPath) {
23
+ return (await findCoverageReport(targetPath)).report;
24
+ }
25
+ /**
26
+ * `loadCoverageReport` plus the reports that were refused unread (#1186): a
27
+ * report linked out of the project, a FIFO or device, or one over the size
28
+ * limit is not a missing report, and the caller must be able to say why it
29
+ * was not used.
30
+ */
31
+ export async function findCoverageReport(targetPath) {
32
+ const refused = [];
23
33
  // Try various coverage file locations (JS, Python, Java, etc.)
24
34
  const coverageLocations = [
25
35
  // JavaScript/TypeScript (Istanbul/nyc/vitest)
@@ -40,23 +50,27 @@ export async function loadCoverageReport(targetPath) {
40
50
  // #1161: a report linked out of the project, or to a device, is not read.
41
51
  const content = await readConfinedText(coveragePath, { outsideRoot: 'allow' });
42
52
  if (coveragePath.endsWith('coverage-summary.json')) {
43
- return { data: parseCoverageSummaryJson(content), path: coveragePath };
53
+ return { report: { data: parseCoverageSummaryJson(content), path: coveragePath }, refused };
44
54
  }
45
55
  else if (coveragePath.endsWith('.json')) {
46
- return { data: parseCoverageJson(content), path: coveragePath };
56
+ return { report: { data: parseCoverageJson(content), path: coveragePath }, refused };
47
57
  }
48
58
  else if (coveragePath.endsWith('.info')) {
49
- return { data: parseLcovInfo(content), path: coveragePath };
59
+ return { report: { data: parseLcovInfo(content), path: coveragePath }, refused };
50
60
  }
51
61
  else if (coveragePath.endsWith('.xml')) {
52
- return { data: parseCoberturaXml(content), path: coveragePath };
62
+ return { report: { data: parseCoberturaXml(content), path: coveragePath }, refused };
53
63
  }
54
64
  }
55
- catch {
56
- // File not found, try next
65
+ catch (error) {
66
+ // Not found (or unparseable): try the next location. A refused report
67
+ // is recorded so it is not reported as a missing one.
68
+ if (error instanceof ConfinedReadError && error.reason !== 'not-found') {
69
+ refused.push({ path: coveragePath, reason: error.reason });
70
+ }
57
71
  }
58
72
  }
59
- return null;
73
+ return { report: null, refused };
60
74
  }
61
75
  /**
62
76
  * Per-line hit counts of one istanbul file entry, computed the way istanbul's
@@ -11,10 +11,11 @@ import { toError } from '../../shared/error-utils.js';
11
11
  import { capDiagnostics, getTestRunnerExecutionError, TestRunnerExecutionError } from '../../shared/test-runner-verdict.js';
12
12
  import { createVitestJsonReport } from '../../shared/vitest-json-report.js';
13
13
  import { jestExactPathPattern, runnerFilePath } from '../../shared/test-runner-args.js';
14
- import { testCasesFromRunnerReport } from '../../domains/test-execution/services/runner-test-cases.js';
14
+ import { testCaseFailureMessage, testCasesFromRunnerReport } from '../../domains/test-execution/services/runner-test-cases.js';
15
+ import { createPytestJunitReport, isPythonTestFile, pytestCommand, pytestRunFromReport, PYTEST_ENV } from '../../shared/pytest-junit-report.js';
15
16
  import { runTestRunnerProcess } from '../../shared/test-runner-process.js';
16
17
  import { MAX_PAYLOAD_FILE_BYTES, requirePayloadFiles } from '../../shared/io/payload-path-guard.js';
17
- import { groupByRunnerProject, requireTestRunTargets } from '../../shared/test-runner-project.js';
18
+ import { groupByRunnerProject, requireTestRunTargets, runnerFrameworkFor } from '../../shared/test-runner-project.js';
18
19
  function escapeRegExp(s) {
19
20
  return s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
20
21
  }
@@ -58,36 +59,76 @@ export function rewriteTempPathsInGeneratedTest(testCode, sourceFile, tempPath,
58
59
  const newRef = sourceFile === tempPath ? (originalFilePath || sourceFile) : sourceFile;
59
60
  return { testCode: newCode, sourceFile: newRef };
60
61
  }
62
+ /** #1248: run Python test files with pytest, reading its JUnit report. */
63
+ async function runPytestTests(testFiles, cwd) {
64
+ const report = createPytestJunitReport();
65
+ try {
66
+ const { command, args } = pytestCommand(testFiles.map(file => runnerFilePath(file)), report.path);
67
+ const execution = await runTestRunnerProcess(command, args, { cwd, timeout: 120000, env: { ...process.env, ...PYTEST_ENV } });
68
+ const output = [execution.stderr, execution.stdout].filter(Boolean).join('\n');
69
+ if (execution.error || execution.signal) {
70
+ const reason = execution.error?.message ?? `Terminated by ${execution.signal}`;
71
+ return err(new TestRunnerExecutionError(`pytest could not complete: ${capDiagnostics(`${reason}\n${output}`)}`));
72
+ }
73
+ const run = pytestRunFromReport(report.read(), testFiles, execution.status, output, command);
74
+ if (!run.success)
75
+ return run;
76
+ const testCases = run.value.tests.map(test => {
77
+ const failureMessage = test.failureMessage && testCaseFailureMessage(test.failureMessage);
78
+ return {
79
+ name: test.name, file: test.file, status: test.status,
80
+ ...(test.duration !== undefined ? { duration: test.duration } : {}),
81
+ ...(failureMessage ? { failureMessage } : {}),
82
+ };
83
+ });
84
+ const { total, passed, failed, skipped } = run.value;
85
+ return ok({ total, passed, failed, skipped, testCases });
86
+ }
87
+ finally {
88
+ report.cleanup();
89
+ }
90
+ }
61
91
  /**
62
92
  * Run `testFiles` (paths relative to the process cwd, or absolute) with the
63
93
  * runner started in `cwd`.
64
94
  */
65
95
  async function runProjectTests(testFiles, cwd) {
96
+ if (testFiles.some(isPythonTestFile))
97
+ return runPytestTests(testFiles, cwd);
66
98
  // #1074: run the runner asynchronously so the MCP server keeps serving
67
99
  // other requests (task_status, task_cancel, ...) during the test run.
68
100
  const options = { cwd, timeout: 120000 };
101
+ const runJest = () => runTestRunnerProcess('npx', ['jest', ...testFiles.map(file => jestExactPathPattern(file)), '--json'], options);
69
102
  let runner = 'vitest';
70
- // Vitest 5 writes the JSON report to a file rather than stdout; an explicit
71
- // --outputFile gives Vitest 4 and 5 the same contract.
72
- const report = createVitestJsonReport();
73
103
  let execution;
74
- let output;
75
- try {
76
- // #909: absolute paths cannot be read as flags (e.g. a "--watch" entry).
77
- execution = await runTestRunnerProcess('npx', ['vitest', 'run', ...testFiles.map(file => runnerFilePath(file)), '--reporter=json', ...report.args], options);
78
- output = execution.error || execution.signal
79
- ? ''
80
- : report.read(execution.stdout || '') ?? '';
81
- }
82
- finally {
83
- report.cleanup();
84
- }
85
- // Preserve the existing Jest fallback when Vitest cannot produce a report.
86
- if (!output.includes('{') && execution.status !== 0 && !execution.error && !execution.signal) {
104
+ let output = '';
105
+ if (runnerFrameworkFor(cwd) === 'jest') {
106
+ // #1272: a project configured for Jest runs with Jest, never Vitest first.
87
107
  runner = 'jest';
88
- execution = await runTestRunnerProcess('npx', ['jest', ...testFiles.map(file => jestExactPathPattern(file)), '--json'], options);
108
+ execution = await runJest();
89
109
  output = execution.stdout || '';
90
110
  }
111
+ else {
112
+ // Vitest 5 writes the JSON report to a file rather than stdout; an explicit
113
+ // --outputFile gives Vitest 4 and 5 the same contract.
114
+ const report = createVitestJsonReport();
115
+ try {
116
+ // #909: absolute paths cannot be read as flags (e.g. a "--watch" entry).
117
+ execution = await runTestRunnerProcess('npx', ['vitest', 'run', ...testFiles.map(file => runnerFilePath(file)), '--reporter=json', ...report.args], options);
118
+ output = execution.error || execution.signal
119
+ ? ''
120
+ : report.read(execution.stdout || '') ?? '';
121
+ }
122
+ finally {
123
+ report.cleanup();
124
+ }
125
+ // Preserve the existing Jest fallback when Vitest cannot produce a report.
126
+ if (!output.includes('{') && execution.status !== 0 && !execution.error && !execution.signal) {
127
+ runner = 'jest';
128
+ execution = await runJest();
129
+ output = execution.stdout || '';
130
+ }
131
+ }
91
132
  const diagnostics = [execution.error?.message, execution.signal && `Terminated by ${execution.signal}`, execution.stderr, output].filter(Boolean).join('\n');
92
133
  if (execution.error) {
93
134
  return err(new TestRunnerExecutionError(`${runner} could not complete: ${capDiagnostics(diagnostics)}`));
@@ -286,8 +327,11 @@ export function registerTestExecutionHandlers(ctx) {
286
327
  }
287
328
  // #1247: a runner loads the config of the directory it starts in, so
288
329
  // each runner project's files run from that project (or projectRoot).
330
+ // #1248: Python files run apart from the others, with pytest.
289
331
  const groups = projectRoot
290
- ? [{ cwd: projectRoot, files: testFiles }]
332
+ ? [testFiles.filter(isPythonTestFile), testFiles.filter(file => !isPythonTestFile(file))]
333
+ .filter(files => files.length > 0)
334
+ .map(files => ({ cwd: projectRoot, files }))
291
335
  : groupByRunnerProject(testFiles);
292
336
  const totals = { total: 0, passed: 0, failed: 0, skipped: 0 };
293
337
  const testCases = [];
@@ -217,11 +217,14 @@ export class CodeIntelligenceIndexProtocol {
217
217
  if (uncommittedFiles.length > 0) {
218
218
  changedFiles.push(...uncommittedFiles);
219
219
  }
220
- // Then, get committed changes since last index
220
+ // Then, get committed changes since last index. #1165: a git failure or
221
+ // timeout fails the detection; indexing without the committed changes
222
+ // would record a new last-index time and skip them for good.
221
223
  const gitChanges = await this.detectGitChanges(lastIndexTime);
222
- if (gitChanges.success) {
223
- changedFiles.push(...gitChanges.value);
224
+ if (!gitChanges.success) {
225
+ return gitChanges;
224
226
  }
227
+ changedFiles.push(...gitChanges.value);
225
228
  // Deduplicate
226
229
  const uniqueFiles = [...new Set(changedFiles)];
227
230
  return ok(uniqueFiles);
@@ -12,8 +12,9 @@
12
12
  * - The active record must still be the selected pattern (same id, and the
13
13
  * same scores and last use) when the archive runs, or nothing is written or
14
14
  * deleted. A pattern used or re-scored since it was selected is left active.
15
- * - The archive copy is read back before the active key is deleted, so a
16
- * failed write never loses the pattern.
15
+ * - The archive copy is read back and compared in full before the active
16
+ * key is deleted, so a failed write never loses the pattern; the delete is
17
+ * a compare-and-delete against that copy (#1149).
17
18
  * The move is implemented in domains/learning-optimization/pattern-archive.ts.
18
19
  */
19
20
  import type { LearnedPattern } from '../../domains/learning-optimization/interfaces.js';
@@ -24,8 +25,10 @@ export interface ArchiveCounts {
24
25
  selected: number;
25
26
  /** Selected patterns moved to `:archived:` and removed from the active set. */
26
27
  archived: number;
27
- /** Selected patterns whose active record was gone or changed; left alone. */
28
+ /** Selected patterns whose active record was gone; nothing written. */
28
29
  missing: number;
30
+ /** Selected patterns changed since selection or during the move; left active (#1149). */
31
+ changed: number;
29
32
  /** Selected patterns whose archive copy could not be verified; left active. */
30
33
  failed: number;
31
34
  }
@@ -12,15 +12,16 @@
12
12
  * - The active record must still be the selected pattern (same id, and the
13
13
  * same scores and last use) when the archive runs, or nothing is written or
14
14
  * deleted. A pattern used or re-scored since it was selected is left active.
15
- * - The archive copy is read back before the active key is deleted, so a
16
- * failed write never loses the pattern.
15
+ * - The archive copy is read back and compared in full before the active
16
+ * key is deleted, so a failed write never loses the pattern; the delete is
17
+ * a compare-and-delete against that copy (#1149).
17
18
  * The move is implemented in domains/learning-optimization/pattern-archive.ts.
18
19
  */
19
20
  // The move itself lives with the patterns, so the merge path in
20
21
  // LearningCoordinatorService uses the same read-back rule (#1106).
21
22
  export { archiveSelectedPattern } from '../../domains/learning-optimization/pattern-archive.js';
22
23
  export function emptyArchiveCounts() {
23
- return { selected: 0, archived: 0, missing: 0, failed: 0 };
24
+ return { selected: 0, archived: 0, missing: 0, changed: 0, failed: 0 };
24
25
  }
25
26
  /** True when the pattern was created less than `graceDays` days ago. */
26
27
  export function isWithinRetentionGrace(pattern, graceDays, now = Date.now()) {
@@ -304,6 +304,7 @@ function continuousLearningWorkflow() {
304
304
  outputMapping: {
305
305
  transferSuccessRate: 'transfer.successRate',
306
306
  newPatternsCreated: 'transfer.newPatterns',
307
+ mergeFailures: 'transfer.mergeFailures',
307
308
  },
308
309
  },
309
310
  {
@@ -164,15 +164,20 @@ export declare class SemanticAnalyzerService implements ISemanticAnalyzerService
164
164
  * vector, so vector search cannot rank them. Match those by text, label the
165
165
  * hits 'lexical', and report the result as 'partial-vector' with the counts.
166
166
  * Cosine and text-match scores are not comparable, so vector hits come
167
- * first (by cosine), then lexical hits (by share of query words found); the
168
- * reason says how many text matches the limit left out.
167
+ * first (by cosine), then lexical hits (by share of query words found, ties
168
+ * by text relevance, #1287); the reason says how many text matches the
169
+ * limit left out.
169
170
  */
170
171
  private withVectorlessFiles;
171
172
  /** Word-overlap matching for a semantic query when no vectors can be used. */
172
173
  private lexicalSearch;
173
174
  private exactSearch;
174
175
  private fuzzySearch;
175
- /** Token-overlap match of one indexed file, or null when it is filtered out or scores too low. */
176
+ /**
177
+ * Token-overlap match of one indexed file, or null when it is filtered out or
178
+ * scores too low. The score is the share of query words found; `relevance`
179
+ * only orders equal scores (#1287).
180
+ */
176
181
  private fuzzyMatch;
177
182
  private extractConcepts;
178
183
  private detectPatterns;