agentic-qe 3.15.15 → 3.15.16

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 (495) hide show
  1. package/.claude/skills/skills-manifest.json +1 -1
  2. package/CHANGELOG.md +90 -0
  3. package/assets/skills/skills-manifest.json +1 -1
  4. package/dist/audit/witness-chain.d.ts +7 -0
  5. package/dist/audit/witness-chain.js +10 -0
  6. package/dist/cli/bundle.js +6 -6
  7. package/dist/cli/chunks/adapter-6CQ2PIP5.js +2 -0
  8. package/dist/cli/chunks/{agent-booster-wasm-EUF4XVUC.js → agent-booster-wasm-45NWEKVS.js} +2 -2
  9. package/dist/cli/chunks/{agent-handler-MOX6PSIQ.js → agent-handler-LVHMYFEF.js} +2 -2
  10. package/dist/cli/chunks/{agent-memory-branch-AEXKIGDG.js → agent-memory-branch-YDWOJFEQ.js} +2 -2
  11. package/dist/cli/chunks/aqe-learning-engine-73RR52VS.js +2 -0
  12. package/dist/cli/chunks/{arena-IQ5ZZDRF.js → arena-CZKHXDDS.js} +2 -2
  13. package/dist/cli/chunks/{arena-M7GA3CVG.js → arena-ELDZH3CZ.js} +4 -4
  14. package/dist/cli/chunks/{audit-4IPBMKWB.js → audit-5MT4T47Z.js} +3 -3
  15. package/dist/cli/chunks/base-SMCMMVGP.js +2 -0
  16. package/dist/cli/chunks/{better-sqlite3-IKDKJ2IE.js → better-sqlite3-6TGYPC2B.js} +2 -2
  17. package/dist/cli/chunks/{brain-handler-5NQUDH4W.js → brain-handler-HQWZFO52.js} +3 -3
  18. package/dist/cli/chunks/{branch-enumerator-KSXELWRC.js → branch-enumerator-WVILM4SO.js} +2 -2
  19. package/dist/cli/chunks/{browser-6LACARWE.js → browser-RX5ALU3H.js} +2 -2
  20. package/dist/cli/chunks/browser-workflow-A2MEZ66K.js +2 -0
  21. package/dist/cli/chunks/{chunk-SJCKCSN3.js → chunk-24OX5TQJ.js} +1 -1
  22. package/dist/cli/chunks/{chunk-J3FP5UGL.js → chunk-24QHCVX6.js} +1 -1
  23. package/dist/cli/chunks/{chunk-BZULJMGH.js → chunk-2H4XH6FT.js} +2 -2
  24. package/dist/cli/chunks/{chunk-E3MRDIZF.js → chunk-2YZ4G6NW.js} +1 -1
  25. package/dist/cli/chunks/chunk-32BPDLRZ.js +27 -0
  26. package/dist/cli/chunks/{chunk-76P32JVU.js → chunk-32GN3JKR.js} +1 -1
  27. package/dist/cli/chunks/{chunk-W62OOK7A.js → chunk-3HD7E6HN.js} +2 -2
  28. package/dist/cli/chunks/{chunk-AJPROCDW.js → chunk-4D4DENG6.js} +2 -2
  29. package/dist/cli/chunks/{chunk-PFQCV6YS.js → chunk-4LQFBY5L.js} +6 -6
  30. package/dist/cli/chunks/{chunk-4ATQP3PR.js → chunk-4NFQLP6R.js} +1 -1
  31. package/dist/cli/chunks/{chunk-WUOOX7UG.js → chunk-525CFDUE.js} +2 -2
  32. package/dist/cli/chunks/chunk-5B5QPCNU.js +65 -0
  33. package/dist/cli/chunks/{chunk-SON6ZRH3.js → chunk-5JZRZI4S.js} +2 -2
  34. package/dist/cli/chunks/{chunk-2ZFLULL4.js → chunk-5LAVKGLH.js} +2 -2
  35. package/dist/cli/chunks/chunk-5NNNEWLS.js +755 -0
  36. package/dist/cli/chunks/{chunk-JCZCJE6X.js → chunk-5PBLPQ5T.js} +2 -2
  37. package/dist/cli/chunks/chunk-5QO3R3TU.js +6 -0
  38. package/dist/cli/chunks/{chunk-EKP2SC77.js → chunk-5SPCGMBB.js} +2 -2
  39. package/dist/cli/chunks/{chunk-3J3RNJNX.js → chunk-5V3TI2LG.js} +1 -1
  40. package/dist/cli/chunks/{chunk-UAQZI6N4.js → chunk-5VZL4UVN.js} +2 -2
  41. package/dist/cli/chunks/{chunk-MIA447GY.js → chunk-63GMRQ25.js} +1 -1
  42. package/dist/cli/chunks/{chunk-TODNOP7C.js → chunk-63ZKI4PX.js} +6 -6
  43. package/dist/cli/chunks/{chunk-TZIHDJZD.js → chunk-67Z5R7RJ.js} +2 -2
  44. package/dist/cli/chunks/{chunk-WVXJ2QIG.js → chunk-6DPYNAOK.js} +2 -2
  45. package/dist/cli/chunks/{chunk-4HKAD25N.js → chunk-6ICX3FEG.js} +3 -3
  46. package/dist/cli/chunks/{chunk-BLL2XU7A.js → chunk-6XXZDV2C.js} +2 -2
  47. package/dist/cli/chunks/{chunk-R6LHJ7ME.js → chunk-6ZBXSOX6.js} +2 -2
  48. package/dist/cli/chunks/{chunk-5PTAFGJT.js → chunk-72XSEQMW.js} +2 -2
  49. package/dist/cli/chunks/{chunk-GKSMRBHU.js → chunk-7TE5ONQQ.js} +1 -1
  50. package/dist/cli/chunks/{chunk-UJABDXST.js → chunk-A5GBXCP5.js} +2 -2
  51. package/dist/cli/chunks/{chunk-22UKJGGN.js → chunk-AAMLQ2LF.js} +3 -3
  52. package/dist/cli/chunks/chunk-AG2EWGXS.js +21 -0
  53. package/dist/cli/chunks/{chunk-SZAZQZWI.js → chunk-AGRV5B3T.js} +2 -2
  54. package/dist/cli/chunks/{chunk-XH4JMX5O.js → chunk-AJMJNQMP.js} +1 -1
  55. package/dist/cli/chunks/{chunk-ZIPAB5J6.js → chunk-AR67RJPY.js} +2 -2
  56. package/dist/cli/chunks/{chunk-GGQGCT4Y.js → chunk-ASEOFRIG.js} +2 -2
  57. package/dist/cli/chunks/{chunk-AHMWD6JG.js → chunk-BEKDKVQT.js} +2 -2
  58. package/dist/cli/chunks/{chunk-W27AJ5B4.js → chunk-BY5OF7OH.js} +2 -2
  59. package/dist/cli/chunks/{chunk-T67R2MUN.js → chunk-C5FP5GW3.js} +2 -2
  60. package/dist/cli/chunks/{chunk-XHHWABJV.js → chunk-C6D5AHBO.js} +2 -2
  61. package/dist/cli/chunks/{chunk-PXATBHWN.js → chunk-CAKMOVZ6.js} +2 -2
  62. package/dist/cli/chunks/{chunk-337Z52QM.js → chunk-CEYSYSK5.js} +2 -2
  63. package/dist/cli/chunks/{chunk-KJBPB7P5.js → chunk-CGGUM2YJ.js} +2 -2
  64. package/dist/cli/chunks/{chunk-CAOUV5GZ.js → chunk-CJSHWQXP.js} +2 -2
  65. package/dist/cli/chunks/{chunk-GCHYOPRZ.js → chunk-CRPIYUTJ.js} +2 -2
  66. package/dist/cli/chunks/{chunk-RIRZHOS2.js → chunk-D6COXLYE.js} +2 -2
  67. package/dist/cli/chunks/{chunk-O6EWL5DQ.js → chunk-DTMAS2GB.js} +2 -2
  68. package/dist/cli/chunks/{chunk-XM6ZVFM5.js → chunk-DVYHMDFR.js} +470 -411
  69. package/dist/cli/chunks/chunk-DXD6K2ZP.js +3 -0
  70. package/dist/cli/chunks/{chunk-74YG72NQ.js → chunk-E3D4GPLP.js} +3 -3
  71. package/dist/cli/chunks/{chunk-KCQNFBBR.js → chunk-EA4YQVKS.js} +1 -1
  72. package/dist/cli/chunks/{chunk-4D4CWP72.js → chunk-EGYE5UPQ.js} +2 -2
  73. package/dist/cli/chunks/{chunk-DURD37JZ.js → chunk-EK7OLYOZ.js} +2 -2
  74. package/dist/cli/chunks/{chunk-DKX4GNRU.js → chunk-F742SZAX.js} +2 -2
  75. package/dist/cli/chunks/{chunk-JCQGJGGZ.js → chunk-FBDVGRSC.js} +1 -1
  76. package/dist/cli/chunks/{chunk-LVABQNRF.js → chunk-FDDC72IA.js} +2 -2
  77. package/dist/cli/chunks/{chunk-5AFVEWMT.js → chunk-FL64OUBA.js} +2 -2
  78. package/dist/cli/chunks/{chunk-5I7357KS.js → chunk-FLNAW7C4.js} +2 -2
  79. package/dist/cli/chunks/{chunk-BQ47GQPK.js → chunk-G5RHFBAY.js} +2 -2
  80. package/dist/cli/chunks/{chunk-XIVVTYM2.js → chunk-GAHNO6JJ.js} +2 -2
  81. package/dist/cli/chunks/{chunk-X33CWRDF.js → chunk-GFWHUQSF.js} +2 -2
  82. package/dist/cli/chunks/{chunk-VMAM46HQ.js → chunk-GJYHWYXR.js} +2 -2
  83. package/dist/cli/chunks/{chunk-ZYJB6FML.js → chunk-GQ6TUIKY.js} +1 -1
  84. package/dist/cli/chunks/{chunk-E56PVVWC.js → chunk-GSKMOPL7.js} +2 -2
  85. package/dist/cli/chunks/{chunk-JUDUBQHA.js → chunk-HCH4Y6XX.js} +2 -2
  86. package/dist/cli/chunks/{chunk-QFGYH6HD.js → chunk-HGWXF45W.js} +1 -1
  87. package/dist/cli/chunks/{chunk-FTRSS64D.js → chunk-HJ6ZGVTB.js} +2 -2
  88. package/dist/cli/chunks/{chunk-6BRQPHMZ.js → chunk-HLUXXCHF.js} +1 -1
  89. package/dist/cli/chunks/{chunk-BP5T3OEV.js → chunk-HVRRLYX6.js} +4 -4
  90. package/dist/cli/chunks/{chunk-AOKKUB5F.js → chunk-I7MQIM2U.js} +1 -1
  91. package/dist/cli/chunks/{chunk-7XB3FCKM.js → chunk-IESR7TNB.js} +2 -2
  92. package/dist/cli/chunks/{chunk-OQG3UQQ7.js → chunk-IHRXZZQM.js} +1 -1
  93. package/dist/cli/chunks/{chunk-YUS6TWAL.js → chunk-IOKYCMTJ.js} +6 -6
  94. package/dist/cli/chunks/{chunk-ERN56H6S.js → chunk-IOQ6ZQ5W.js} +1 -1
  95. package/dist/cli/chunks/{chunk-GQABPCQE.js → chunk-IOYG4VFL.js} +2 -2
  96. package/dist/cli/chunks/{chunk-KLTMOXIK.js → chunk-IUBJVHNB.js} +2 -2
  97. package/dist/cli/chunks/{chunk-ZSOMUTNL.js → chunk-J442IZLE.js} +1 -1
  98. package/dist/cli/chunks/{chunk-G242G224.js → chunk-J4ELZNLY.js} +2 -2
  99. package/dist/cli/chunks/chunk-J7I6PABJ.js +153 -0
  100. package/dist/cli/chunks/chunk-JDIYMZCQ.js +2 -0
  101. package/dist/cli/chunks/{chunk-2IIXCEMS.js → chunk-JHQCRRJI.js} +2 -2
  102. package/dist/cli/chunks/{chunk-6LE362LZ.js → chunk-JQ3DYUMS.js} +2 -2
  103. package/dist/cli/chunks/{chunk-EFUJDMNC.js → chunk-KITOPKRG.js} +2 -2
  104. package/dist/cli/chunks/{chunk-M4CJCPCQ.js → chunk-KKU2QGSJ.js} +2 -2
  105. package/dist/cli/chunks/chunk-KL7OKSU2.js +4 -0
  106. package/dist/cli/chunks/{chunk-HL2ANKN3.js → chunk-KNSRL6NO.js} +2 -2
  107. package/dist/cli/chunks/{chunk-FOOW4JVS.js → chunk-KPRCB5LT.js} +2 -2
  108. package/dist/cli/chunks/{chunk-E5G4WZ2T.js → chunk-KQYJ4VQ5.js} +1 -1
  109. package/dist/cli/chunks/{chunk-RBKUU7WF.js → chunk-KU2AUFGX.js} +2 -2
  110. package/dist/cli/chunks/{chunk-UQPA33UK.js → chunk-KVF4NXGQ.js} +2 -2
  111. package/dist/cli/chunks/{chunk-BDKEAGQ2.js → chunk-KXCLACFG.js} +2 -2
  112. package/dist/cli/chunks/{chunk-K3WZICFA.js → chunk-L2DWPVNJ.js} +1 -1
  113. package/dist/cli/chunks/{chunk-6YVMX2TC.js → chunk-L6QSTQME.js} +2 -2
  114. package/dist/cli/chunks/{chunk-LJMYRTJ7.js → chunk-LE4QJREF.js} +1 -1
  115. package/dist/cli/chunks/{chunk-NWIIYHT6.js → chunk-LKTTUHLF.js} +2 -2
  116. package/dist/cli/chunks/{chunk-W5ZJG2OU.js → chunk-LQLPB2T6.js} +2 -2
  117. package/dist/cli/chunks/{chunk-JKJOB65O.js → chunk-LRSX2FJM.js} +1 -1
  118. package/dist/cli/chunks/chunk-M4FRQ4TE.js +12 -0
  119. package/dist/cli/chunks/chunk-M7WJCTG3.js +2 -0
  120. package/dist/cli/chunks/{chunk-6RBTS3NF.js → chunk-MAFQV4U4.js} +2 -2
  121. package/dist/cli/chunks/{chunk-UE2J6MA5.js → chunk-MD43XRX5.js} +1 -1
  122. package/dist/cli/chunks/{chunk-2CKERSMB.js → chunk-MI5MFHRA.js} +2 -2
  123. package/dist/cli/chunks/{chunk-T66PPF4D.js → chunk-MO55CVMT.js} +32 -32
  124. package/dist/cli/chunks/{chunk-C4KLXFJP.js → chunk-N7HL5PHH.js} +1 -1
  125. package/dist/cli/chunks/chunk-NAEWCFQT.js +14 -0
  126. package/dist/cli/chunks/{chunk-U62OUXBF.js → chunk-NDJ7P2EP.js} +1 -1
  127. package/dist/cli/chunks/{chunk-M4WMSCAE.js → chunk-NO3IV5Q5.js} +1 -1
  128. package/dist/cli/chunks/{chunk-27HE2BHC.js → chunk-NQXXI77K.js} +2 -2
  129. package/dist/cli/chunks/{chunk-NQS3BWS6.js → chunk-NVEWF4JV.js} +1 -1
  130. package/dist/cli/chunks/{chunk-EBTNMQSS.js → chunk-NZU4ACBZ.js} +2 -2
  131. package/dist/cli/chunks/chunk-O5W3FIO6.js +63 -0
  132. package/dist/cli/chunks/{chunk-BFQTLF5X.js → chunk-OAEE6JWQ.js} +2 -2
  133. package/dist/cli/chunks/{chunk-PS6UMZVK.js → chunk-OCV2XEWQ.js} +2 -2
  134. package/dist/cli/chunks/{chunk-BU4UQR36.js → chunk-P3EYRILV.js} +2 -2
  135. package/dist/cli/chunks/{chunk-LHMQIZ6B.js → chunk-PEQDY4BO.js} +2 -2
  136. package/dist/cli/chunks/{chunk-PYPS65P7.js → chunk-PF7RBAYL.js} +2 -2
  137. package/dist/cli/chunks/{chunk-UXIY4IAI.js → chunk-PHT5N7SC.js} +2 -2
  138. package/dist/cli/chunks/{chunk-GV2QE5TO.js → chunk-PINSJCM3.js} +1 -1
  139. package/dist/cli/chunks/{chunk-4X3SWKBA.js → chunk-PPUZWYUG.js} +2 -2
  140. package/dist/cli/chunks/{chunk-L32JNNKL.js → chunk-QPEOLAAS.js} +1 -1
  141. package/dist/cli/chunks/{chunk-UUBIQR6A.js → chunk-QQWBWEJS.js} +18 -18
  142. package/dist/cli/chunks/{chunk-VCXI4XC4.js → chunk-QVDCVD5D.js} +2 -2
  143. package/dist/cli/chunks/{chunk-JW74KRBC.js → chunk-RJIEG3NA.js} +2 -2
  144. package/dist/cli/chunks/{chunk-C4RTAVC6.js → chunk-RV74I3YO.js} +2 -2
  145. package/dist/cli/chunks/{chunk-5G4UFTV4.js → chunk-S75SOOZL.js} +2 -2
  146. package/dist/cli/chunks/{chunk-MV55NXTD.js → chunk-SASBO5Y5.js} +2 -2
  147. package/dist/cli/chunks/{chunk-UORB2QDU.js → chunk-SDLWKRVL.js} +2 -2
  148. package/dist/cli/chunks/{chunk-Y2OX6KGN.js → chunk-SHKOCGNK.js} +2 -2
  149. package/dist/cli/chunks/{chunk-6KCSKGVY.js → chunk-SI6DPU5D.js} +1 -1
  150. package/dist/cli/chunks/{chunk-LYJHUNBK.js → chunk-SJ6Y4725.js} +2 -2
  151. package/dist/cli/chunks/{chunk-7ACCBHRB.js → chunk-SR52XP5F.js} +1 -1
  152. package/dist/cli/chunks/{chunk-C5CXL3JP.js → chunk-SSUAAX3F.js} +2 -2
  153. package/dist/cli/chunks/{chunk-BBRROA3Z.js → chunk-SSYAQZXA.js} +2 -2
  154. package/dist/cli/chunks/{chunk-DUKE27HC.js → chunk-SUDMM5SO.js} +2 -2
  155. package/dist/cli/chunks/{chunk-H5DER3JY.js → chunk-TIUKLYAI.js} +1 -1
  156. package/dist/cli/chunks/{chunk-5C62XMJR.js → chunk-TVGI32MB.js} +33 -33
  157. package/dist/cli/chunks/{chunk-MPFPWJTH.js → chunk-U2A7NHZA.js} +2 -2
  158. package/dist/cli/chunks/{chunk-TX2CHQD7.js → chunk-UE5ZOZR2.js} +2 -2
  159. package/dist/cli/chunks/{chunk-OLZH5LRT.js → chunk-UHEOGZLX.js} +11 -11
  160. package/dist/cli/chunks/chunk-UNGBRZDK.js +12 -0
  161. package/dist/cli/chunks/{chunk-XWIAZG3C.js → chunk-V5NHZV7S.js} +2 -2
  162. package/dist/cli/chunks/{chunk-AP2W7Z3A.js → chunk-VJCIEHEF.js} +1 -1
  163. package/dist/cli/chunks/{chunk-K3XBQC3R.js → chunk-VMDFFTCK.js} +1 -1
  164. package/dist/cli/chunks/chunk-VSIKHWZ4.js +29 -0
  165. package/dist/cli/chunks/{chunk-LB2LGEDP.js → chunk-VWPM27GU.js} +2 -2
  166. package/dist/cli/chunks/{chunk-HTZSRMHW.js → chunk-VXFLJNCA.js} +2 -2
  167. package/dist/cli/chunks/{chunk-73PBAWAF.js → chunk-W5HQUIML.js} +2 -2
  168. package/dist/cli/chunks/{chunk-DEKR3CTS.js → chunk-WP4RETKG.js} +2 -2
  169. package/dist/cli/chunks/{chunk-ZWBGYJ7K.js → chunk-XIIQ5QTT.js} +2 -2
  170. package/dist/cli/chunks/{chunk-TDQWTSBS.js → chunk-XIQW7EFL.js} +2 -2
  171. package/dist/cli/chunks/{chunk-AKZO6GGG.js → chunk-XWUWX7BV.js} +4 -4
  172. package/dist/cli/chunks/{chunk-LNX74WHQ.js → chunk-Y4PFUMOU.js} +1 -1
  173. package/dist/cli/chunks/chunk-YAPLJR7K.js +2 -0
  174. package/dist/cli/chunks/{chunk-3CYNZFKH.js → chunk-YLMNVLDK.js} +1 -1
  175. package/dist/cli/chunks/{chunk-XG4F4XH4.js → chunk-YNMJEDN5.js} +2 -2
  176. package/dist/cli/chunks/{chunk-RDMRY7CT.js → chunk-YPBSUGMI.js} +1 -1
  177. package/dist/cli/chunks/{chunk-OBDONJQM.js → chunk-YRAX7SFJ.js} +2 -2
  178. package/dist/cli/chunks/{chunk-7BLZHFKD.js → chunk-YTHTQPWR.js} +1 -1
  179. package/dist/cli/chunks/{chunk-IXL5ZHWJ.js → chunk-YU2BDRSD.js} +1 -1
  180. package/dist/cli/chunks/chunk-ZB3LEFYG.js +2 -0
  181. package/dist/cli/chunks/{chunk-T4GE7MPI.js → chunk-ZFL436FN.js} +2 -2
  182. package/dist/cli/chunks/{chunk-CBK5CT6T.js → chunk-ZJH5MU2I.js} +2 -2
  183. package/dist/cli/chunks/{chunk-LTQVUAPH.js → chunk-ZQ2XW3IP.js} +2 -2
  184. package/dist/cli/chunks/chunk-ZR2TKVXQ.js +14 -0
  185. package/dist/cli/chunks/{ci-UCUJOSBW.js → ci-MFUR4CWV.js} +2 -2
  186. package/dist/cli/chunks/{ci-config-2XILD3XG.js → ci-config-PNDLQ6XV.js} +2 -2
  187. package/dist/cli/chunks/{ci-output-BL6KWOHW.js → ci-output-PFZ4M7NC.js} +2 -2
  188. package/dist/cli/chunks/{circuit-breaker-5XLIOXE5.js → circuit-breaker-5HH6NLZN.js} +2 -2
  189. package/dist/cli/chunks/{claude-flow-setup-4IMP6ACS.js → claude-flow-setup-QCKYLGLC.js} +2 -2
  190. package/dist/cli/chunks/client-MHQRTZM4.js +2 -0
  191. package/dist/cli/chunks/{cline-installer-RYLHCDK7.js → cline-installer-EASVPFXR.js} +2 -2
  192. package/dist/cli/chunks/{code-WY3GJXHX.js → code-UJXDVYRK.js} +4 -3
  193. package/dist/cli/chunks/{code-index-extractor-Y4MZBZCW.js → code-index-extractor-BZJ3UDP4.js} +2 -2
  194. package/dist/cli/chunks/{codex-installer-SCJ3T3DX.js → codex-installer-XSQZUVOZ.js} +2 -2
  195. package/dist/cli/chunks/{completions-CN2DXQFU.js → completions-OWOOJFI2.js} +2 -2
  196. package/dist/cli/chunks/{complexity-analyzer-7MDPPIBH.js → complexity-analyzer-KP5TOHDT.js} +2 -2
  197. package/dist/cli/chunks/{continuedev-installer-GCEJRK34.js → continuedev-installer-IFKQXLHM.js} +2 -2
  198. package/dist/cli/chunks/{copilot-installer-BHPDSELY.js → copilot-installer-IGJ6KGQY.js} +2 -2
  199. package/dist/cli/chunks/core-handlers-UAK3LLJE.js +2 -0
  200. package/dist/cli/chunks/{cost-tracker-VO5MFWR6.js → cost-tracker-MMDDNKZB.js} +2 -2
  201. package/dist/cli/chunks/{coverage-LYFQYNH6.js → coverage-LUH2B7NT.js} +3 -3
  202. package/dist/cli/chunks/cross-domain-router-WTRZQPNQ.js +2 -0
  203. package/dist/cli/chunks/{cursor-installer-KP4HA7TV.js → cursor-installer-4YLM5GWM.js} +2 -2
  204. package/dist/cli/chunks/daemon-CAVZ7OFV.js +18 -0
  205. package/dist/cli/chunks/{daemon-7RC7TS57.js → daemon-MZKVM4CJ.js} +3 -3
  206. package/dist/cli/chunks/{dag-attention-scheduler-NKA44RSR.js → dag-attention-scheduler-X4CYW665.js} +2 -2
  207. package/dist/cli/chunks/{detect-CMYAJWYF.js → detect-7BM2XINO.js} +2 -2
  208. package/dist/cli/chunks/{dist-node-EN3PYEGW.js → dist-node-Y5APLEYB.js} +2 -2
  209. package/dist/cli/chunks/{domain-handler-EXSZCX7A.js → domain-handler-X3ZRJNAH.js} +2 -2
  210. package/dist/cli/chunks/{domain-plugins-HCQFSNL7.js → domain-plugins-2UW5KQJB.js} +2 -2
  211. package/dist/cli/chunks/{domain-transfer-3LGSNTPO.js → domain-transfer-35W4CIBV.js} +2 -2
  212. package/dist/cli/chunks/dream-EJY24JN6.js +2 -0
  213. package/dist/cli/chunks/embed-and-insert-pattern-COG4C7ZI.js +3 -0
  214. package/dist/cli/chunks/embedding-space-SBM2MZD2.js +2 -0
  215. package/dist/cli/chunks/{eval-OQELIWJK.js → eval-4QA2SROK.js} +2 -2
  216. package/dist/cli/chunks/experience-capture-middleware-Z6BF6KYM.js +40 -0
  217. package/dist/cli/chunks/{fast-paths-UV4NDEWM.js → fast-paths-FIORX6GN.js} +2 -2
  218. package/dist/cli/chunks/{feature-flags-CKTYX67J.js → feature-flags-6LYI2T4G.js} +2 -2
  219. package/dist/cli/chunks/{feature-flags-H7H33B6C.js → feature-flags-ZOO7LMIC.js} +2 -2
  220. package/dist/cli/chunks/file-discovery-UZSFSS4V.js +2 -0
  221. package/dist/cli/chunks/{fleet-ZJBCAKRG.js → fleet-7WF53H4F.js} +3 -3
  222. package/dist/cli/chunks/{gnn-wrapper-RUE2QZRG.js → gnn-wrapper-KJ6B7BRM.js} +2 -2
  223. package/dist/cli/chunks/{heartbeat-handler-XRV327M7.js → heartbeat-handler-DEKKMOVW.js} +4 -4
  224. package/dist/cli/chunks/heartbeat-scheduler-NVR356I7.js +2 -0
  225. package/dist/cli/chunks/hnsw-adapter-LFMPLUJU.js +2 -0
  226. package/dist/cli/chunks/hnsw-index-POCPMVJH.js +2 -0
  227. package/dist/cli/chunks/{hnsw-legacy-bridge-UJID6ZZ4.js → hnsw-legacy-bridge-L27WS27N.js} +2 -2
  228. package/dist/cli/chunks/{hnswlib-node-WS43R4AX.js → hnswlib-node-4YOQC6L4.js} +2 -2
  229. package/dist/cli/chunks/{hooks-YZNJKXAJ.js → hooks-TAOKV4EJ.js} +23 -22
  230. package/dist/cli/chunks/hybrid-backend-4STAO7CV.js +2 -0
  231. package/dist/cli/chunks/{hypergraph-engine-XQJSIMTS.js → hypergraph-engine-BODRJLHL.js} +2 -2
  232. package/dist/cli/chunks/{hypergraph-handler-ZD2NYXMR.js → hypergraph-handler-RKMYJNTU.js} +3 -3
  233. package/dist/cli/chunks/impact-analyzer-3VIIISBQ.js +2 -0
  234. package/dist/cli/chunks/{init-guard-DSRUAVRT.js → init-guard-MXHSLSB2.js} +2 -2
  235. package/dist/cli/chunks/{init-handler-RJU5QMAP.js → init-handler-HUE57IFW.js} +6 -6
  236. package/dist/cli/chunks/init-wizard-PL6QN6RQ.js +2 -0
  237. package/dist/cli/chunks/kernel-CCDWT7KS.js +2 -0
  238. package/dist/cli/chunks/{kilocode-installer-BCPOCVMC.js → kilocode-installer-S333IKYQ.js} +2 -2
  239. package/dist/cli/chunks/{kiro-installer-GFCWCB2S.js → kiro-installer-WM5DLQWC.js} +2 -2
  240. package/dist/cli/chunks/knowledge-graph-KFOMEN3H.js +2 -0
  241. package/dist/cli/chunks/{learning-FZTD72CF.js → learning-LNHMQLH5.js} +3 -3
  242. package/dist/cli/chunks/{llm-router-GJVKGRJL.js → llm-router-EWFXYZZR.js} +4 -4
  243. package/dist/cli/chunks/llm-router-service-7NBE2EX6.js +2 -0
  244. package/dist/cli/chunks/{load-YKTPOYBE.js → load-FGYGWVDK.js} +2 -2
  245. package/dist/cli/chunks/load-test-UNZUWY3F.js +2 -0
  246. package/dist/cli/chunks/{mcp-LT6R2IKS.js → mcp-2FHNAAOM.js} +2 -2
  247. package/dist/cli/chunks/{memory-4HKKOLRY.js → memory-DZMQ73AB.js} +5 -5
  248. package/dist/cli/chunks/memory-backend-DFGKWA2Q.js +2 -0
  249. package/dist/cli/chunks/memory-handlers-MP426XRJ.js +2 -0
  250. package/dist/cli/chunks/{multi-model-executor-2YPM2WTK.js → multi-model-executor-6F2UAEUW.js} +2 -2
  251. package/dist/cli/chunks/{opencode-installer-WBAJMH5K.js → opencode-installer-XY3BGOTZ.js} +2 -2
  252. package/dist/cli/chunks/{orchestrator-5W5WVMVJ.js → orchestrator-B4CNKUOS.js} +5 -5
  253. package/dist/cli/chunks/pattern-null-store-SSVF5TE5.js +2 -0
  254. package/dist/cli/chunks/{pattern-usage-recorder-GXRMNPAZ.js → pattern-usage-recorder-R4GUFNMD.js} +2 -2
  255. package/dist/cli/chunks/{pipeline-2NA4DRDA.js → pipeline-FG5RKVRO.js} +2 -2
  256. package/dist/cli/chunks/{platform-BGERNQ5V.js → platform-3BT4KEVJ.js} +2 -2
  257. package/dist/cli/chunks/{plugin-L4EPVENR.js → plugin-WI4RIN7O.js} +2 -2
  258. package/dist/cli/chunks/{prime-radiant-advanced-wasm-RTQRTPTM.js → prime-radiant-advanced-wasm-7ECDNQFS.js} +2 -2
  259. package/dist/cli/chunks/project-root-BEANNYWU.js +2 -0
  260. package/dist/cli/chunks/protocol-executor-FQVIHXZ7.js +2 -0
  261. package/dist/cli/chunks/{protocol-handler-SYQXM6JK.js → protocol-handler-WNODKPGW.js} +2 -2
  262. package/dist/cli/chunks/{prove-5O7GPJCU.js → prove-5RHAEPYZ.js} +2 -2
  263. package/dist/cli/chunks/qe-reasoning-bank-5TFYSE24.js +2 -0
  264. package/dist/cli/chunks/{quality-KIIDHGNF.js → quality-WPHR7BGQ.js} +2 -2
  265. package/dist/cli/chunks/{quality-gate-H65VECD3.js → quality-gate-4RKTEZMX.js} +3 -3
  266. package/dist/cli/chunks/queen-coordinator-Y2OUL7IN.js +2 -0
  267. package/dist/cli/chunks/real-embeddings-OXLYU7JW.js +2 -0
  268. package/dist/cli/chunks/{ref-validation-CSBJOMZM.js → ref-validation-TPAWHOHH.js} +2 -2
  269. package/dist/cli/chunks/{roocode-installer-G7OVYXEN.js → roocode-installer-7AVHFNDI.js} +2 -2
  270. package/dist/cli/chunks/router-EP34O3KB.js +2 -0
  271. package/dist/cli/chunks/routing-feedback-FJCRKXNG.js +2 -0
  272. package/dist/cli/chunks/{routing-handler-ZNZPPI5Y.js → routing-handler-YKEDVJSH.js} +2 -2
  273. package/dist/cli/chunks/{ruvector-commands-C6IG3OY3.js → ruvector-commands-JUAMM354.js} +2 -2
  274. package/dist/cli/chunks/rvf-dual-writer-ILITJSFG.js +2 -0
  275. package/dist/cli/chunks/rvf-migration-adapter-XF6W4C2N.js +2 -0
  276. package/dist/cli/chunks/rvf-migration-coordinator-CMKG56AR.js +2 -0
  277. package/dist/cli/chunks/rvf-native-adapter-7YFW6S4Y.js +2 -0
  278. package/dist/cli/chunks/{rvf-store-integrity-3G6LFLT3.js → rvf-store-integrity-VJDUIRTX.js} +2 -2
  279. package/dist/cli/chunks/safe-db-TCAU4FUT.js +2 -0
  280. package/dist/cli/chunks/schedule-NB5KV435.js +2 -0
  281. package/dist/cli/chunks/scheduler-JKXGKVK6.js +2 -0
  282. package/dist/cli/chunks/{security-A3IMVLFM.js → security-ORDN3RD2.js} +3 -3
  283. package/dist/cli/chunks/{shared-rvf-adapter-VHWQ6US5.js → shared-rvf-adapter-CF4BCIO7.js} +2 -2
  284. package/dist/cli/chunks/{shared-rvf-dual-writer-JB3QS7IG.js → shared-rvf-dual-writer-C32UBR6D.js} +2 -2
  285. package/dist/cli/chunks/sqlite-persistence-IXCNZRTW.js +2 -0
  286. package/dist/cli/chunks/{standalone-memory-DDNXCSBD.js → standalone-memory-OXRJYZXN.js} +2 -2
  287. package/dist/cli/chunks/{status-handler-2HK7XPEK.js → status-handler-BCX5D4HY.js} +2 -2
  288. package/dist/cli/chunks/{structural-health-DSJVLEPV.js → structural-health-LFG7RUU6.js} +2 -2
  289. package/dist/cli/chunks/sync-OSF7C2NL.js +2 -0
  290. package/dist/cli/chunks/{sync-NTUR53PI.js → sync-YJEE2K2L.js} +2 -2
  291. package/dist/cli/chunks/task-handler-6LXKPTXJ.js +64 -0
  292. package/dist/cli/chunks/{task-handlers-VJR6EHRZ.js → task-handlers-CILP36I7.js} +4 -4
  293. package/dist/cli/chunks/{test-O6FK3FVF.js → test-SD457QJ6.js} +4 -4
  294. package/dist/cli/chunks/test-runner-process-VKD65QQU.js +2 -0
  295. package/dist/cli/chunks/{test-scheduling-Q6QEEOS6.js → test-scheduling-ISI2O4Q5.js} +3 -3
  296. package/dist/cli/chunks/token-bootstrap-VUELSBOS.js +2 -0
  297. package/dist/cli/chunks/{token-usage-YEEFWSSI.js → token-usage-XOC5KG7S.js} +2 -2
  298. package/dist/cli/chunks/{transformers-BZCHJJJT.js → transformers-LSLQAARK.js} +2 -2
  299. package/dist/cli/chunks/tree-sitter-wasm-parser-YAIPHRIL.js +2 -0
  300. package/dist/cli/chunks/{types-4AOKZYOX.js → types-5BLCGLCR.js} +2 -2
  301. package/dist/cli/chunks/unified-memory-GI76TXFV.js +2 -0
  302. package/dist/cli/chunks/unified-memory-hnsw-GXJ5BTZO.js +2 -0
  303. package/dist/cli/chunks/unified-persistence-OP7FDQPD.js +2 -0
  304. package/dist/cli/chunks/{upgrade-2MWW6BT2.js → upgrade-RQJYLK3J.js} +2 -2
  305. package/dist/cli/chunks/{validate-PAEV3GT5.js → validate-QBHWXXCK.js} +2 -2
  306. package/dist/cli/chunks/{validate-swarm-ZIXACK5K.js → validate-swarm-IKXBKFB5.js} +2 -2
  307. package/dist/cli/chunks/visual-security-GZ2MOKWB.js +2 -0
  308. package/dist/cli/chunks/{web-tree-sitter-VLTXZFAB.js → web-tree-sitter-ZF6FIE5R.js} +2 -2
  309. package/dist/cli/chunks/{windsurf-installer-VELMLOZF.js → windsurf-installer-HQGDZT5D.js} +2 -2
  310. package/dist/cli/chunks/witness-chain-DCHCAMSQ.js +2 -0
  311. package/dist/cli/chunks/witness-chain-P3XXXA62.js +2 -0
  312. package/dist/cli/chunks/witness-chain-repair-PUX2NFDL.js +2 -0
  313. package/dist/cli/chunks/{witness-chain-verifier-MIDWD4JS.js → witness-chain-verifier-PX2OQ6XT.js} +2 -2
  314. package/dist/cli/chunks/{witness-key-manager-OSVCWOB2.js → witness-key-manager-RXYQNFJB.js} +2 -2
  315. package/dist/cli/chunks/{workflow-MK7A7QCX.js → workflow-FBKCA4H6.js} +4 -4
  316. package/dist/cli/chunks/workflow-orchestrator-P2APAJAA.js +2 -0
  317. package/dist/cli/chunks/wrappers-TWSKBTWD.js +2 -0
  318. package/dist/cli/commands/code.js +4 -0
  319. package/dist/cli/commands/hooks-handlers/hooks-dream-learning.js +10 -2
  320. package/dist/cli/handlers/task-handler.d.ts +5 -0
  321. package/dist/cli/handlers/task-handler.js +21 -1
  322. package/dist/cli/utils/task-result.d.ts +11 -0
  323. package/dist/cli/utils/task-result.js +39 -0
  324. package/dist/coordination/handlers/test-execution-handlers.js +92 -58
  325. package/dist/coordination/mincut/mincut-persistence.js +29 -25
  326. package/dist/domains/code-intelligence/coordinator.d.ts +4 -0
  327. package/dist/domains/code-intelligence/coordinator.js +46 -13
  328. package/dist/domains/code-intelligence/interfaces.d.ts +10 -1
  329. package/dist/domains/code-intelligence/services/semantic-analyzer.d.ts +32 -7
  330. package/dist/domains/code-intelligence/services/semantic-analyzer.js +112 -53
  331. package/dist/domains/learning-optimization/services/learning-coordinator.js +1 -1
  332. package/dist/domains/quality-assessment/coordinator.js +2 -1
  333. package/dist/domains/test-execution/coordinator.js +10 -5
  334. package/dist/domains/test-execution/interfaces.d.ts +12 -0
  335. package/dist/domains/test-execution/plugin.js +6 -2
  336. package/dist/domains/test-execution/services/retry-handler.d.ts +2 -0
  337. package/dist/domains/test-execution/services/retry-handler.js +14 -9
  338. package/dist/domains/test-execution/services/test-executor.d.ts +1 -0
  339. package/dist/domains/test-execution/services/test-executor.js +28 -9
  340. package/dist/domains/visual-accessibility/coordinator.d.ts +15 -7
  341. package/dist/domains/visual-accessibility/coordinator.js +15 -7
  342. package/dist/domains/visual-accessibility/interfaces.d.ts +27 -3
  343. package/dist/domains/visual-accessibility/services/accessibility-contrast.d.ts +39 -0
  344. package/dist/domains/visual-accessibility/services/accessibility-contrast.js +93 -0
  345. package/dist/domains/visual-accessibility/services/accessibility-tester-browser.d.ts +18 -3
  346. package/dist/domains/visual-accessibility/services/accessibility-tester-browser.js +50 -40
  347. package/dist/domains/visual-accessibility/services/accessibility-tester-checks.d.ts +27 -0
  348. package/dist/domains/visual-accessibility/services/accessibility-tester-checks.js +137 -0
  349. package/dist/domains/visual-accessibility/services/accessibility-tester.d.ts +5 -0
  350. package/dist/domains/visual-accessibility/services/accessibility-tester.js +43 -24
  351. package/dist/domains/visual-accessibility/services/browser-swarm-coordinator.d.ts +2 -3
  352. package/dist/domains/visual-accessibility/services/browser-swarm-coordinator.js +8 -14
  353. package/dist/feedback/coverage-learner.js +13 -9
  354. package/dist/feedback/test-outcome-tracker.js +13 -9
  355. package/dist/governance/witness-chain.d.ts +5 -0
  356. package/dist/governance/witness-chain.js +22 -6
  357. package/dist/integrations/agentic-flow/reasoning-bank/experience-replay.d.ts +22 -0
  358. package/dist/integrations/agentic-flow/reasoning-bank/experience-replay.js +115 -45
  359. package/dist/integrations/agentic-flow/reasoning-bank/pattern-evolution.d.ts +6 -0
  360. package/dist/integrations/agentic-flow/reasoning-bank/pattern-evolution.js +51 -33
  361. package/dist/integrations/agentic-flow/reasoning-bank/trajectory-tracker.js +17 -9
  362. package/dist/integrations/embeddings/cache/EmbeddingCache.d.ts +8 -0
  363. package/dist/integrations/embeddings/cache/EmbeddingCache.js +24 -10
  364. package/dist/integrations/ruvector/delta-tracker.d.ts +11 -0
  365. package/dist/integrations/ruvector/delta-tracker.js +16 -0
  366. package/dist/integrations/ruvector/sona-persistence.d.ts +10 -0
  367. package/dist/integrations/ruvector/sona-persistence.js +49 -24
  368. package/dist/kernel/unified-memory.d.ts +24 -0
  369. package/dist/kernel/unified-memory.js +63 -8
  370. package/dist/learning/aqe-learning-engine.js +1 -1
  371. package/dist/learning/embed-and-insert-pattern.js +4 -2
  372. package/dist/learning/embedder-endpoint-client.d.ts +31 -0
  373. package/dist/learning/embedder-endpoint-client.js +103 -10
  374. package/dist/learning/embedding-space.d.ts +12 -0
  375. package/dist/learning/embedding-space.js +17 -0
  376. package/dist/learning/experience-capture-middleware.js +25 -13
  377. package/dist/learning/experience-capture.js +1 -1
  378. package/dist/learning/experience-consolidation.d.ts +18 -0
  379. package/dist/learning/experience-consolidation.js +55 -8
  380. package/dist/learning/experience-space-verification.d.ts +71 -0
  381. package/dist/learning/experience-space-verification.js +147 -0
  382. package/dist/learning/pattern-lifecycle.d.ts +40 -4
  383. package/dist/learning/pattern-lifecycle.js +153 -76
  384. package/dist/learning/pattern-null-store.d.ts +5 -0
  385. package/dist/learning/pattern-null-store.js +8 -0
  386. package/dist/learning/pattern-promotion.js +6 -3
  387. package/dist/learning/pattern-store.d.ts +6 -0
  388. package/dist/learning/pattern-store.js +19 -6
  389. package/dist/learning/qe-reasoning-bank.js +2 -2
  390. package/dist/learning/real-embeddings.js +3 -1
  391. package/dist/learning/real-qe-reasoning-bank.d.ts +5 -0
  392. package/dist/learning/real-qe-reasoning-bank.js +77 -47
  393. package/dist/learning/rvf-pattern-store.js +6 -2
  394. package/dist/learning/sqlite-persistence.d.ts +6 -0
  395. package/dist/learning/sqlite-persistence.js +10 -0
  396. package/dist/mcp/bundle.js +641 -570
  397. package/dist/mcp/entry.js +4 -0
  398. package/dist/mcp/handlers/domain-handler-configs.js +2 -0
  399. package/dist/mcp/handlers/trajectory-judge.js +1 -1
  400. package/dist/mcp/protocol-server.js +1 -0
  401. package/dist/mcp/tools/visual-accessibility/index.js +8 -2
  402. package/dist/mcp/types.d.ts +6 -0
  403. package/dist/optimization/session-cache.d.ts +17 -1
  404. package/dist/optimization/session-cache.js +40 -36
  405. package/dist/planning/goap-planner.d.ts +6 -0
  406. package/dist/planning/goap-planner.js +35 -19
  407. package/dist/planning/plan-executor.js +24 -15
  408. package/dist/routing/co-execution-repository.js +12 -9
  409. package/dist/routing/routing-feedback.d.ts +8 -0
  410. package/dist/routing/routing-feedback.js +46 -24
  411. package/dist/routing/routing-outcomes-migration.js +7 -2
  412. package/dist/shared/llm/spend-ledger.d.ts +9 -0
  413. package/dist/shared/llm/spend-ledger.js +64 -39
  414. package/dist/shared/sqlite-lock-wait.d.ts +27 -0
  415. package/dist/shared/sqlite-lock-wait.js +37 -0
  416. package/dist/shared/sqlite-write-queue.d.ts +28 -0
  417. package/dist/shared/sqlite-write-queue.js +38 -0
  418. package/dist/shared/test-runner-project.d.ts +69 -0
  419. package/dist/shared/test-runner-project.js +186 -0
  420. package/dist/skills/security-visual-testing/index.d.ts +3 -1
  421. package/dist/skills/security-visual-testing/index.js +49 -35
  422. package/dist/skills/security-visual-testing/types.d.ts +19 -3
  423. package/dist/workers/workers/heartbeat-scheduler.js +5 -5
  424. package/dist/workers/workers/learning-consolidation.js +8 -7
  425. package/package.json +1 -1
  426. package/dist/cli/chunks/adapter-QU6INSKP.js +0 -2
  427. package/dist/cli/chunks/aqe-learning-engine-PAJPENJD.js +0 -2
  428. package/dist/cli/chunks/base-OTGSN6IC.js +0 -2
  429. package/dist/cli/chunks/browser-workflow-WLZGR6SB.js +0 -2
  430. package/dist/cli/chunks/chunk-2LUTPMBO.js +0 -21
  431. package/dist/cli/chunks/chunk-3HVFIITW.js +0 -2
  432. package/dist/cli/chunks/chunk-5KA5TVPR.js +0 -6
  433. package/dist/cli/chunks/chunk-6NBRMD25.js +0 -13
  434. package/dist/cli/chunks/chunk-7O45RQHF.js +0 -153
  435. package/dist/cli/chunks/chunk-EMSZVUYA.js +0 -29
  436. package/dist/cli/chunks/chunk-G6RDCCFV.js +0 -4
  437. package/dist/cli/chunks/chunk-HH4ED4F7.js +0 -744
  438. package/dist/cli/chunks/chunk-Q6I4SIUU.js +0 -65
  439. package/dist/cli/chunks/chunk-QGBGSQ2E.js +0 -14
  440. package/dist/cli/chunks/chunk-QRKTBSZT.js +0 -27
  441. package/dist/cli/chunks/chunk-SHRI7TKJ.js +0 -62
  442. package/dist/cli/chunks/chunk-UGYM4U44.js +0 -2
  443. package/dist/cli/chunks/chunk-VY4U6DPO.js +0 -12
  444. package/dist/cli/chunks/chunk-WNTA4YKE.js +0 -14
  445. package/dist/cli/chunks/chunk-XHLYGXYE.js +0 -2
  446. package/dist/cli/chunks/client-KKRNPX4F.js +0 -2
  447. package/dist/cli/chunks/core-handlers-47MPMED7.js +0 -2
  448. package/dist/cli/chunks/cross-domain-router-U6MBFHEC.js +0 -2
  449. package/dist/cli/chunks/daemon-AXLVPKVO.js +0 -18
  450. package/dist/cli/chunks/dream-76L6EEN7.js +0 -2
  451. package/dist/cli/chunks/embed-and-insert-pattern-B6MNHICW.js +0 -3
  452. package/dist/cli/chunks/experience-capture-middleware-SUFILYPW.js +0 -40
  453. package/dist/cli/chunks/file-discovery-VSFKZ3LJ.js +0 -2
  454. package/dist/cli/chunks/heartbeat-scheduler-NIK3KKEH.js +0 -2
  455. package/dist/cli/chunks/hnsw-adapter-WJG7LUJJ.js +0 -2
  456. package/dist/cli/chunks/hnsw-index-D6PRI5HC.js +0 -2
  457. package/dist/cli/chunks/hybrid-backend-RIUR3I7F.js +0 -2
  458. package/dist/cli/chunks/impact-analyzer-C36YYTJ5.js +0 -2
  459. package/dist/cli/chunks/init-wizard-JCKNGIGT.js +0 -2
  460. package/dist/cli/chunks/kernel-F7ILJTYD.js +0 -2
  461. package/dist/cli/chunks/knowledge-graph-VTXDBHB2.js +0 -2
  462. package/dist/cli/chunks/llm-router-service-TNOWQINA.js +0 -2
  463. package/dist/cli/chunks/load-test-FPVBK2EV.js +0 -2
  464. package/dist/cli/chunks/memory-backend-2QE7O67A.js +0 -2
  465. package/dist/cli/chunks/memory-handlers-X4CMVBXB.js +0 -2
  466. package/dist/cli/chunks/pattern-null-store-UI35ORHW.js +0 -2
  467. package/dist/cli/chunks/project-root-S7WDFTMU.js +0 -2
  468. package/dist/cli/chunks/protocol-executor-OPANXQVB.js +0 -2
  469. package/dist/cli/chunks/qe-reasoning-bank-3OTF4DYQ.js +0 -2
  470. package/dist/cli/chunks/queen-coordinator-WTYH4TAN.js +0 -2
  471. package/dist/cli/chunks/real-embeddings-DYIOLKQ3.js +0 -2
  472. package/dist/cli/chunks/router-DBBW4NC2.js +0 -2
  473. package/dist/cli/chunks/routing-feedback-W35QHCL4.js +0 -2
  474. package/dist/cli/chunks/rvf-dual-writer-X3NSL25Z.js +0 -2
  475. package/dist/cli/chunks/rvf-migration-adapter-TZR7GDOK.js +0 -2
  476. package/dist/cli/chunks/rvf-migration-coordinator-4ATTHGHD.js +0 -2
  477. package/dist/cli/chunks/rvf-native-adapter-HD25ZYV5.js +0 -2
  478. package/dist/cli/chunks/safe-db-ZS2QKANY.js +0 -2
  479. package/dist/cli/chunks/schedule-ZH6VNA32.js +0 -2
  480. package/dist/cli/chunks/scheduler-T6CD74B6.js +0 -2
  481. package/dist/cli/chunks/sqlite-persistence-47WU5EKZ.js +0 -2
  482. package/dist/cli/chunks/sync-3MUV6S5E.js +0 -2
  483. package/dist/cli/chunks/task-handler-74MZN2EO.js +0 -62
  484. package/dist/cli/chunks/test-runner-process-2NPW3UDQ.js +0 -2
  485. package/dist/cli/chunks/token-bootstrap-TTRCECLP.js +0 -2
  486. package/dist/cli/chunks/tree-sitter-wasm-parser-RZAND65G.js +0 -2
  487. package/dist/cli/chunks/unified-memory-FZ5K2C7W.js +0 -2
  488. package/dist/cli/chunks/unified-memory-hnsw-VREWX56M.js +0 -2
  489. package/dist/cli/chunks/unified-persistence-YZGMKX6B.js +0 -2
  490. package/dist/cli/chunks/visual-security-GXGSFBVA.js +0 -2
  491. package/dist/cli/chunks/witness-chain-MRJKVCOW.js +0 -2
  492. package/dist/cli/chunks/witness-chain-WWHJKITG.js +0 -2
  493. package/dist/cli/chunks/witness-chain-repair-5SAXPETG.js +0 -2
  494. package/dist/cli/chunks/workflow-orchestrator-SG7DV72E.js +0 -2
  495. package/dist/cli/chunks/wrappers-5QFMCKXL.js +0 -2
@@ -94,12 +94,12 @@ export class SemanticAnalyzerService {
94
94
  return err(new Error(NOTHING_INDEXED_FOR_SEARCH));
95
95
  }
96
96
  let results;
97
- let lexicalOnlyReason;
97
+ let semanticOutcome = {};
98
98
  switch (type) {
99
99
  case 'semantic': {
100
- const semantic = await this.semanticSearch(query, limit, scope, filters);
101
- results = semantic.results;
102
- lexicalOnlyReason = semantic.lexicalOnlyReason;
100
+ const { results: hits, ...outcome } = await this.semanticSearch(query, limit, scope, filters);
101
+ results = hits;
102
+ semanticOutcome = outcome;
103
103
  break;
104
104
  }
105
105
  case 'exact':
@@ -116,11 +116,7 @@ export class SemanticAnalyzerService {
116
116
  results,
117
117
  total: results.length,
118
118
  searchTime,
119
- ...(type === 'semantic'
120
- ? lexicalOnlyReason === undefined
121
- ? { mode: 'vector' }
122
- : { mode: 'lexical-only', reason: lexicalOnlyReason }
123
- : {}),
119
+ ...semanticOutcome,
124
120
  });
125
121
  }
126
122
  catch (error) {
@@ -130,13 +126,13 @@ export class SemanticAnalyzerService {
130
126
  /**
131
127
  * Index code content for semantic search
132
128
  */
133
- async indexCode(file, content) {
129
+ async indexCode(file, content, options = {}) {
134
130
  try {
135
131
  // Extract code metadata
136
132
  const metadata = this.extractCodeMetadata(file, content);
137
133
  // #1224: store a vector only when a real embedding model produced one;
138
134
  // without it the file is still searchable by text.
139
- const embedded = await this.tryEmbed(content);
135
+ const embedded = options.embed === false ? {} : await this.tryEmbed(content);
140
136
  if (embedded.vector) {
141
137
  const key = `${this.vectorKeyPrefix()}${this.fileToKey(file)}`;
142
138
  await this.memory.storeVector(key, embedded.vector, {
@@ -153,8 +149,15 @@ export class SemanticAnalyzerService {
153
149
  // namespace, and a write with {namespace} could not be read back without
154
150
  // the same option (issue #491 Bug 2) — which silently dropped every
155
151
  // search result (#511 follow-up).
156
- await this.memory.set(`${this.config.namespace}:content:${this.fileToKey(file)}`, { file, content, metadata });
157
- return ok(undefined);
152
+ const stored = embedded.vector
153
+ ? { file, content, metadata, embeddingModel: this.embeddingModelId() }
154
+ : { file, content, metadata };
155
+ await this.memory.set(`${this.config.namespace}:content:${this.fileToKey(file)}`, stored);
156
+ return ok(embedded.vector
157
+ ? { vector: true }
158
+ : this.embedder && embedded.reason
159
+ ? { vector: false, vectorFailure: embedded.reason }
160
+ : { vector: false });
158
161
  }
159
162
  catch (error) {
160
163
  return err(toError(error));
@@ -284,21 +287,31 @@ export class SemanticAnalyzerService {
284
287
  contentKeyPattern() {
285
288
  return `${this.config.namespace}:content:*`;
286
289
  }
290
+ /** Visits every indexed file's stored content, one at a time. */
291
+ async forEachIndexed(visit) {
292
+ const keys = await this.memory.search(this.contentKeyPattern(), MAX_INDEXED_FILES_SCANNED);
293
+ for (const key of keys) {
294
+ const stored = await this.memory.get(key);
295
+ if (stored)
296
+ visit(stored);
297
+ }
298
+ }
287
299
  // ============================================================================
288
300
  // Private Search Methods
289
301
  // ============================================================================
290
302
  /**
291
303
  * #1224: vector search when an embedding model is available. Otherwise (or
292
304
  * when no indexed file has a vector from that model) it matches query words
293
- * against the indexed text and says so through `lexicalOnlyReason`; no
294
- * similarity is invented for those hits.
305
+ * against the indexed text and reports `mode: 'lexical-only'` with the
306
+ * reason; no similarity is invented for those hits.
295
307
  */
296
308
  async semanticSearch(query, limit, scope, filters) {
297
309
  const embedded = await this.tryEmbed(query);
298
310
  if (!embedded.vector) {
299
311
  return {
300
312
  results: await this.lexicalSearch(query, limit, scope, filters),
301
- lexicalOnlyReason: embedded.reason,
313
+ mode: 'lexical-only',
314
+ reason: embedded.reason,
302
315
  };
303
316
  }
304
317
  // Only this namespace's vectors, from the model that embedded the query.
@@ -310,7 +323,8 @@ export class SemanticAnalyzerService {
310
323
  if (vectorResults.length === 0) {
311
324
  return {
312
325
  results: await this.lexicalSearch(query, limit, scope, filters),
313
- lexicalOnlyReason: `no indexed file has an embedding from ${this.embeddingModelId()}; re-index to enable vector search`,
326
+ mode: 'lexical-only',
327
+ reason: `no indexed file has an embedding from ${this.embeddingModelId()}; re-index to enable vector search`,
314
328
  };
315
329
  }
316
330
  // Convert to search results with filtering
@@ -345,7 +359,53 @@ export class SemanticAnalyzerService {
345
359
  break;
346
360
  }
347
361
  }
348
- return { results };
362
+ return this.withVectorlessFiles(query, results, limit, scope, filters);
363
+ }
364
+ /**
365
+ * #1231: files indexed while the embedding model was unavailable have no
366
+ * vector, so vector search cannot rank them. Match those by text, label the
367
+ * hits 'lexical', and report the result as 'partial-vector' with the counts.
368
+ * Cosine and text-match scores are not comparable, so vector hits come
369
+ * first (by cosine), then lexical hits (by share of query words found); the
370
+ * reason says how many text matches the limit left out.
371
+ */
372
+ async withVectorlessFiles(query, vectorHits, limit, scope, filters) {
373
+ const model = this.embeddingModelId();
374
+ const vectorFiles = new Set(vectorHits.map((hit) => hit.file));
375
+ const queryTokens = this.tokenize(query.toLowerCase());
376
+ const lexicalHits = [];
377
+ let indexedFiles = 0;
378
+ let withoutVector = 0;
379
+ await this.forEachIndexed((stored) => {
380
+ indexedFiles++;
381
+ if (stored.embeddingModel === model)
382
+ return;
383
+ withoutVector++;
384
+ if (vectorFiles.has(stored.file))
385
+ return;
386
+ const hit = this.fuzzyMatch(queryTokens, stored, scope, filters);
387
+ if (hit)
388
+ lexicalHits.push({ ...hit, matchType: 'lexical' });
389
+ });
390
+ const coverage = { indexedFiles, filesWithVector: indexedFiles - withoutVector };
391
+ if (withoutVector === 0) {
392
+ return { results: vectorHits, mode: 'vector', coverage };
393
+ }
394
+ const byScore = (a, b) => b.score - a.score;
395
+ const results = [...[...vectorHits].sort(byScore), ...lexicalHits.sort(byScore)].slice(0, limit);
396
+ const droppedLexical = vectorHits.length + lexicalHits.length - results.length;
397
+ return {
398
+ results,
399
+ mode: 'partial-vector',
400
+ reason: `${withoutVector} of ${indexedFiles} indexed files have no embedding from ${model} ` +
401
+ '(it was unavailable when they were indexed, or an older aqe version indexed them), ' +
402
+ 'so they were matched by text only (matchType "lexical", listed after the vector hits); ' +
403
+ (droppedLexical > 0
404
+ ? `${droppedLexical} more text match(es) were left out by the limit of ${limit}; `
405
+ : '') +
406
+ 're-index to rank them by vector',
407
+ coverage,
408
+ };
349
409
  }
350
410
  /** Word-overlap matching for a semantic query when no vectors can be used. */
351
411
  async lexicalSearch(query, limit, scope, filters) {
@@ -390,39 +450,38 @@ export class SemanticAnalyzerService {
390
450
  }
391
451
  async fuzzySearch(query, limit, scope, filters) {
392
452
  const results = [];
393
- const keys = await this.memory.search(this.contentKeyPattern(), MAX_INDEXED_FILES_SCANNED);
394
453
  const queryTokens = this.tokenize(query.toLowerCase());
395
- for (const key of keys) {
396
- const stored = await this.memory.get(key);
397
- if (!stored)
398
- continue;
399
- // Apply scope filter
400
- if (scope && scope.length > 0) {
401
- const matchesScope = scope.some((s) => stored.file.includes(s));
402
- if (!matchesScope)
403
- continue;
404
- }
405
- // Apply filters
406
- if (filters && !this.matchesFilters(stored.metadata, filters)) {
407
- continue;
408
- }
409
- // Fuzzy match using token overlap
410
- const contentTokens = this.tokenize(stored.content.toLowerCase());
411
- const score = this.calculateFuzzyScore(queryTokens, contentTokens);
412
- if (score >= this.config.minScore) {
413
- const matchedTokens = queryTokens.filter((t) => contentTokens.some((ct) => this.tokensMatch(t, ct)));
414
- results.push({
415
- file: stored.file,
416
- snippet: this.extractSnippet(stored.content, 200),
417
- score,
418
- highlights: matchedTokens,
419
- metadata: stored.metadata,
420
- });
421
- }
422
- }
454
+ await this.forEachIndexed((stored) => {
455
+ const hit = this.fuzzyMatch(queryTokens, stored, scope, filters);
456
+ if (hit)
457
+ results.push(hit);
458
+ });
423
459
  // Sort by score and limit
424
460
  return results.sort((a, b) => b.score - a.score).slice(0, limit);
425
461
  }
462
+ /** Token-overlap match of one indexed file, or null when it is filtered out or scores too low. */
463
+ fuzzyMatch(queryTokens, stored, scope, filters) {
464
+ // Apply scope filter
465
+ if (scope && scope.length > 0 && !scope.some((s) => stored.file.includes(s))) {
466
+ return null;
467
+ }
468
+ // Apply filters
469
+ if (filters && !this.matchesFilters(stored.metadata, filters)) {
470
+ return null;
471
+ }
472
+ // Fuzzy match using token overlap
473
+ const contentTokens = this.tokenize(stored.content.toLowerCase());
474
+ const score = this.calculateFuzzyScore(queryTokens, contentTokens);
475
+ if (score < this.config.minScore)
476
+ return null;
477
+ return {
478
+ file: stored.file,
479
+ snippet: this.extractSnippet(stored.content, 200),
480
+ score,
481
+ highlights: queryTokens.filter((t) => contentTokens.some((ct) => this.tokensMatch(t, ct))),
482
+ metadata: stored.metadata,
483
+ };
484
+ }
426
485
  // ============================================================================
427
486
  // Private Analysis Methods
428
487
  // ============================================================================
@@ -625,13 +684,13 @@ export class SemanticAnalyzerService {
625
684
  return matches / queryTokens.length;
626
685
  }
627
686
  /**
628
- * A content token matches a query token it contains, or that contains it.
629
- * #1224: the second direction needs a content token of 3+ characters, so a
630
- * one-letter variable such as `i` does not match the query "login".
687
+ * A query word is found when a content word contains it (or equals it):
688
+ * "login" is found in `loginWithPassword`. #1279: not the reverse; a query
689
+ * word such as `stepHandler450` is not found just because the file has the
690
+ * shorter word `step`, which made almost every file a full match.
631
691
  */
632
692
  tokensMatch(queryToken, contentToken) {
633
- return contentToken.includes(queryToken) ||
634
- (contentToken.length >= 3 && queryToken.includes(contentToken));
693
+ return contentToken.includes(queryToken);
635
694
  }
636
695
  matchesFilters(metadata, filters) {
637
696
  for (const filter of filters) {
@@ -683,7 +742,7 @@ export class SemanticAnalyzerService {
683
742
  const queryTokens = this.tokenize(query.toLowerCase());
684
743
  const contentTokens = this.tokenize(content.toLowerCase());
685
744
  for (const qt of queryTokens) {
686
- const match = contentTokens.find((ct) => ct.includes(qt) || qt.includes(ct));
745
+ const match = contentTokens.find((ct) => this.tokensMatch(qt, ct));
687
746
  if (match && !highlights.includes(match)) {
688
747
  highlights.push(match);
689
748
  }
@@ -512,7 +512,7 @@ Provide:
512
512
  const contextFingerprint = `${experience.domain}:${experience.action}`;
513
513
  for (const patternId of experience.appliedPatternIds ?? []) {
514
514
  try {
515
- nullStore.recordNull({
515
+ await nullStore.recordNullWhenUnlocked({
516
516
  patternId,
517
517
  contextFingerprint,
518
518
  failureMode: String(experience.result.outcome?.error ?? experience.action),
@@ -284,7 +284,8 @@ export class QualityAssessmentCoordinator extends BaseDomainCoordinator {
284
284
  // ADR-070: Record quality gate decision in witness chain
285
285
  try {
286
286
  const wc = await getWitnessChain();
287
- wc.append(finalResult.passed ? 'QUALITY_GATE_PASS' : 'QUALITY_GATE_FAIL', { gateName: request.gateName, passed: finalResult.passed, score: finalResult.overallScore, failedChecks: finalResult.failedChecks }, 'quality-gate');
287
+ // #1283: queued, so a locked memory.db does not freeze the MCP server.
288
+ await wc.appendWhenUnlocked(finalResult.passed ? 'QUALITY_GATE_PASS' : 'QUALITY_GATE_FAIL', { gateName: request.gateName, passed: finalResult.passed, score: finalResult.overallScore, failedChecks: finalResult.failedChecks }, 'quality-gate');
288
289
  }
289
290
  catch (_wcErr) { /* non-critical */ }
290
291
  // ADR-062: Monotonic gate threshold ratcheting
@@ -160,6 +160,7 @@ export class TestExecutionCoordinator extends BaseDomainCoordinator {
160
160
  workers,
161
161
  timeout,
162
162
  retryCount: request.retryCount,
163
+ projectRoot: request.projectRoot,
163
164
  });
164
165
  }
165
166
  // Sequential execution
@@ -168,6 +169,7 @@ export class TestExecutionCoordinator extends BaseDomainCoordinator {
168
169
  framework,
169
170
  timeout,
170
171
  retryCount: request.retryCount,
172
+ projectRoot: request.projectRoot,
171
173
  });
172
174
  }
173
175
  /**
@@ -176,7 +178,7 @@ export class TestExecutionCoordinator extends BaseDomainCoordinator {
176
178
  * as passed and flaky in the run's own counts (#1170). When that changes
177
179
  * the outcome, the run is stored again with it (#1176).
178
180
  */
179
- async retryFailures(run, retryCount, testFiles) {
181
+ async retryFailures(run, retryCount, testFiles, projectRoot) {
180
182
  if (!retryCount || retryCount <= 0)
181
183
  return;
182
184
  if (run.failed === 0) {
@@ -188,6 +190,7 @@ export class TestExecutionCoordinator extends BaseDomainCoordinator {
188
190
  failedTests: run.failedTests.map(t => t.testId),
189
191
  maxRetries: retryCount,
190
192
  backoff: 'exponential',
193
+ projectRoot,
191
194
  });
192
195
  if (!retried.success)
193
196
  return;
@@ -258,7 +261,7 @@ export class TestExecutionCoordinator extends BaseDomainCoordinator {
258
261
  // #1176: these first-attempt failures did happen; flaky analysis
259
262
  // records them even when a retry then passes.
260
263
  const firstAttemptFailures = [...result.value.failedTests];
261
- await this.retryFailures(result.value, request.retryCount, orderedTestFiles);
264
+ await this.retryFailures(result.value, request.retryCount, orderedTestFiles, request.projectRoot);
262
265
  // Record execution results for learning
263
266
  if (this.config.enablePrioritization && prioritizationResult) {
264
267
  await this.recordExecutionResults(runId, orderedTestFiles, result.value, prioritizationResult);
@@ -296,7 +299,7 @@ export class TestExecutionCoordinator extends BaseDomainCoordinator {
296
299
  if (this.config.infraHealing && result.value.failedTests.length > 0) {
297
300
  this.feedInfraHealingFromFailures(result.value.failedTests);
298
301
  // ADR-057: Attempt automatic recovery and re-run affected tests
299
- const rerunResult = await this.attemptAutoRecoveryAndRerun(result.value.failedTests, request.framework, { timeout: request.timeout, env: request.env, retryCount: request.retryCount });
302
+ const rerunResult = await this.attemptAutoRecoveryAndRerun(result.value.failedTests, request.framework, { timeout: request.timeout, env: request.env, retryCount: request.retryCount, projectRoot: request.projectRoot });
300
303
  if (rerunResult)
301
304
  return rerunResult;
302
305
  }
@@ -367,7 +370,7 @@ export class TestExecutionCoordinator extends BaseDomainCoordinator {
367
370
  this.activeRuns.delete(runId);
368
371
  if (result.success) {
369
372
  // #1176: retries finish before the run is recorded or announced.
370
- await this.retryFailures(result.value, request.retryCount, orderedTestFiles);
373
+ await this.retryFailures(result.value, request.retryCount, orderedTestFiles, request.projectRoot);
371
374
  // Record execution results for learning
372
375
  if (this.config.enablePrioritization && prioritizationResult) {
373
376
  await this.recordExecutionResults(runId, orderedTestFiles, result.value, prioritizationResult);
@@ -407,7 +410,7 @@ export class TestExecutionCoordinator extends BaseDomainCoordinator {
407
410
  if (this.config.infraHealing && result.value.failedTests.length > 0) {
408
411
  this.feedInfraHealingFromFailures(result.value.failedTests);
409
412
  // ADR-057: Attempt automatic recovery and re-run affected tests
410
- const rerunResult = await this.attemptAutoRecoveryAndRerun(result.value.failedTests, request.framework, { timeout: request.timeout, env: request.env, retryCount: request.retryCount });
413
+ const rerunResult = await this.attemptAutoRecoveryAndRerun(result.value.failedTests, request.framework, { timeout: request.timeout, env: request.env, retryCount: request.retryCount, projectRoot: request.projectRoot });
411
414
  if (rerunResult)
412
415
  return rerunResult;
413
416
  }
@@ -510,6 +513,7 @@ export class TestExecutionCoordinator extends BaseDomainCoordinator {
510
513
  failedTests: testsToRetry,
511
514
  maxRetries: request.maxRetries,
512
515
  backoff: request.backoff ?? 'exponential',
516
+ projectRoot: request.projectRoot,
513
517
  onRetry: (testId, attempt) => {
514
518
  // Could publish individual retry events here
515
519
  void testId;
@@ -630,6 +634,7 @@ export class TestExecutionCoordinator extends BaseDomainCoordinator {
630
634
  timeout: originalRequest.timeout,
631
635
  env: originalRequest.env,
632
636
  retryCount: originalRequest.retryCount,
637
+ projectRoot: originalRequest.projectRoot,
633
638
  });
634
639
  }
635
640
  /**
@@ -47,6 +47,11 @@ export interface ISimpleTestRequest {
47
47
  timeout?: number;
48
48
  /** Number of parallel workers (default: auto based on file count) */
49
49
  workers?: number;
50
+ /**
51
+ * #1247: directory to run every file from, already checked to be inside the
52
+ * project. When omitted, each file runs from its nearest runner project.
53
+ */
54
+ projectRoot?: string;
50
55
  }
51
56
  export interface IExecuteTestsRequest {
52
57
  testFiles: string[];
@@ -59,6 +64,11 @@ export interface IExecuteTestsRequest {
59
64
  * or TestRunCompleted is published, so both carry the final outcome.
60
65
  */
61
66
  retryCount?: number;
67
+ /**
68
+ * #1247: directory to run every file from, already checked to be inside the
69
+ * project. When omitted, each file runs from its nearest runner project.
70
+ */
71
+ projectRoot?: string;
62
72
  }
63
73
  export interface IParallelExecutionRequest extends IExecuteTestsRequest {
64
74
  workers: number;
@@ -173,6 +183,8 @@ export interface IRetryRequest {
173
183
  failedTests: string[];
174
184
  maxRetries: number;
175
185
  backoff?: 'linear' | 'exponential';
186
+ /** #1247: the run's explicit projectRoot; retries run from it too. */
187
+ projectRoot?: string;
176
188
  }
177
189
  export interface IRetryResult {
178
190
  originalFailed: number;
@@ -5,6 +5,7 @@
5
5
  import { err } from '../../shared/types/index.js';
6
6
  import { BaseDomainPlugin } from '../domain-interface.js';
7
7
  import { requirePayloadFiles } from '../../shared/io/payload-path-guard.js';
8
+ import { requireTestRunTargets } from '../../shared/test-runner-project.js';
8
9
  import { createTestExecutionCoordinator } from './coordinator.js';
9
10
  import { getGlobalInfraHealing } from '../../strange-loop/infra-healing/global-instance.js';
10
11
  import { isMeasuredGapPayload } from '../../shared/events/domain-events.js';
@@ -65,12 +66,14 @@ export class TestExecutionPlugin extends BaseDomainPlugin {
65
66
  // directories (#909 Jest targets) inside the project, passed on as the
66
67
  // real paths that were checked. A missing one is still reported by the
67
68
  // runner.
69
+ // #1247: an explicit projectRoot is confined the same way.
68
70
  let testFiles;
71
+ let projectRoot;
69
72
  if (payload.testFiles !== undefined) {
70
- const confined = await requirePayloadFiles('execute-tests', 'testFiles', payload.testFiles, { allowMissing: true, allowDirectory: true });
73
+ const confined = await requireTestRunTargets('execute-tests', payload.testFiles, payload.projectRoot);
71
74
  if (!confined.success)
72
75
  return confined;
73
- testFiles = confined.value;
76
+ ({ testFiles, projectRoot } = confined.value);
74
77
  }
75
78
  // Support both simple and full request formats
76
79
  if (testFiles) {
@@ -81,6 +84,7 @@ export class TestExecutionPlugin extends BaseDomainPlugin {
81
84
  retryCount: payload.retryCount,
82
85
  timeout: payload.timeout,
83
86
  workers: payload.workers,
87
+ projectRoot,
84
88
  };
85
89
  return this.coordinator.runTests(request);
86
90
  }
@@ -74,6 +74,8 @@ export interface RetryExecutionRequest {
74
74
  baseDelay?: number;
75
75
  maxDelay?: number;
76
76
  onRetry?: (testId: string, attempt: number) => void;
77
+ /** #1247: the run's explicit projectRoot; every retry runs from it. */
78
+ projectRoot?: string;
77
79
  }
78
80
  export interface RetryStatistics {
79
81
  totalRetries: number;
@@ -6,6 +6,7 @@ import { LoggerFactory } from '../../../logging/index.js';
6
6
  import { spawn } from 'node:child_process';
7
7
  import { createVitestJsonReport } from '../../../shared/vitest-json-report.js';
8
8
  import { jestExactPathPattern, nameFilterArg, runnerFilePath } from '../../../shared/test-runner-args.js';
9
+ import { runnerCwdFor } from '../../../shared/test-runner-project.js';
9
10
  import { existsSync, readFileSync, realpathSync } from 'node:fs';
10
11
  import { resolve as resolvePath } from 'node:path';
11
12
  import { ok, err } from '../../../shared/types/index.js';
@@ -92,7 +93,7 @@ export class RetryHandlerService {
92
93
  * Execute failed tests with retry logic
93
94
  */
94
95
  async executeWithRetry(request) {
95
- const { runId, failedTests, maxRetries, backoff, baseDelay = 1000, maxDelay = 30000, onRetry, } = request;
96
+ const { runId, failedTests, maxRetries, backoff, baseDelay = 1000, maxDelay = 30000, onRetry, projectRoot, } = request;
96
97
  try {
97
98
  const stats = {
98
99
  runId,
@@ -108,7 +109,7 @@ export class RetryHandlerService {
108
109
  const unmatched = [];
109
110
  const tests = [];
110
111
  for (const test of failedTests) {
111
- const result = await this.retryTest(test, maxRetries, backoff, baseDelay, maxDelay, onRetry);
112
+ const result = await this.retryTest(test, maxRetries, backoff, baseDelay, maxDelay, onRetry, projectRoot);
112
113
  stats.totalRetries += result.attempts;
113
114
  if (result.passed) {
114
115
  nowPassing.push(test.testId);
@@ -228,7 +229,7 @@ export class RetryHandlerService {
228
229
  return false;
229
230
  }
230
231
  }
231
- async retryTest(test, maxRetries, backoff, baseDelay, maxDelay, onRetry) {
232
+ async retryTest(test, maxRetries, backoff, baseDelay, maxDelay, onRetry, projectRoot) {
232
233
  let attempts = 0;
233
234
  // #1122: the final error is persisted in retry-history, so keep it redacted.
234
235
  let lastError = redactFailureText(test.error);
@@ -246,7 +247,7 @@ export class RetryHandlerService {
246
247
  onRetry(test.testId, attempts + 1);
247
248
  }
248
249
  // Execute test (simulated - in real implementation, would run actual test)
249
- const result = await this.executeTest(test);
250
+ const result = await this.executeTest(test, projectRoot);
250
251
  // #1141: a filter that selected no test reran nothing. Report that
251
252
  // instead of counting it as a retry, and stop: another attempt would
252
253
  // select nothing again.
@@ -272,7 +273,7 @@ export class RetryHandlerService {
272
273
  finalError: lastError,
273
274
  };
274
275
  }
275
- async executeTest(test) {
276
+ async executeTest(test, projectRoot) {
276
277
  // In simulation mode (for unit testing), use random behavior
277
278
  if (this.config.simulateForTesting) {
278
279
  const passOnRetry = secureRandom() < this.config.simulatedRetrySuccessRate;
@@ -282,12 +283,12 @@ export class RetryHandlerService {
282
283
  };
283
284
  }
284
285
  // In production mode, actually execute the test
285
- return this.executeRealTest(test);
286
+ return this.executeRealTest(test, projectRoot);
286
287
  }
287
288
  /**
288
289
  * Execute a real test using the configured test runner
289
290
  */
290
- async executeRealTest(test) {
291
+ async executeRealTest(test, projectRoot) {
291
292
  const testFile = test.file;
292
293
  const testName = test.testName;
293
294
  const cwd = this.config.cwd ?? process.cwd();
@@ -295,8 +296,12 @@ export class RetryHandlerService {
295
296
  if (!existsSync(testFile)) {
296
297
  throw new Error(`Test file not found: ${testFile}. Cannot retry non-existent test file.`);
297
298
  }
299
+ // #1247: retry from the same directory as the first run: the caller's
300
+ // projectRoot, else a configured directory, else the file's runner
301
+ // project. The file path stays relative to `cwd`.
302
+ const runCwd = projectRoot ?? this.config.cwd ?? runnerCwdFor(testFile);
298
303
  // Detect or use configured test runner
299
- const runner = await this.detectTestRunner(cwd);
304
+ const runner = await this.detectTestRunner(runCwd);
300
305
  if (!runner) {
301
306
  throw new Error(`No test runner detected or configured. Install vitest, jest, or mocha, ` +
302
307
  `or configure testRunner in RetryHandlerConfig. Cannot execute retry for: ${testFile}`);
@@ -304,7 +309,7 @@ export class RetryHandlerService {
304
309
  // Build command based on runner
305
310
  const { command, args, report } = this.buildTestCommand(runner, testFile, testName, cwd);
306
311
  // Execute the test
307
- return this.spawnTestProcess(command, args, cwd, report, runner === 'vitest' ? testFile : undefined);
312
+ return this.spawnTestProcess(command, args, runCwd, report, runner === 'vitest' ? testFile : undefined);
308
313
  }
309
314
  /**
310
315
  * Detect which test runner is available in the project
@@ -113,6 +113,7 @@ export declare class TestExecutorService implements ITestExecutionService {
113
113
  private mergeSequentialCoverage;
114
114
  private executeTestFile;
115
115
  private executeTestFiles;
116
+ private executeProjectFiles;
116
117
  /**
117
118
  * Spawn actual test runner process (vitest, jest, mocha)
118
119
  */
@@ -21,6 +21,7 @@ import { mergeTestCases, redactFailedTests, redactFailureText, testCasesFromRunn
21
21
  import { capDiagnostics, getTestRunnerExecutionError, TestRunnerExecutionError } from '../../../shared/test-runner-verdict.js';
22
22
  import { createVitestJsonReport } from '../../../shared/vitest-json-report.js';
23
23
  import { jestExactPathPattern, runnerFilePath } from '../../../shared/test-runner-args.js';
24
+ import { groupByRunnerProject } from '../../../shared/test-runner-project.js';
24
25
  import { getClaudeModelForTier } from '../../../shared/llm/model-registry.js';
25
26
  import { terminateTestRunner, trackTestRunnerExit } from '../../../shared/test-runner-process.js';
26
27
  const DEFAULT_CONFIG = {
@@ -314,7 +315,7 @@ Provide:
314
315
  return ok(undefined);
315
316
  }
316
317
  async runTests(request) {
317
- const { testFiles, framework, timeout = 30000 } = request;
318
+ const { testFiles, framework, timeout = 30000, projectRoot } = request;
318
319
  const failedTests = [];
319
320
  const coverages = [];
320
321
  const allFileCoverages = [];
@@ -323,7 +324,7 @@ Provide:
323
324
  let failed = 0;
324
325
  let skipped = 0;
325
326
  for (const file of testFiles) {
326
- const result = await this.executeTestFile(file, framework, timeout);
327
+ const result = await this.executeTestFile(file, framework, timeout, projectRoot);
327
328
  executionResults.push(result);
328
329
  passed += result.passed;
329
330
  failed += result.failed;
@@ -393,16 +394,34 @@ Provide:
393
394
  const coverage = this.extractCoverageFromJson({ coverageMap: merged });
394
395
  return coverage.summary ? { summary: coverage.summary, perFile: coverage.perFile } : undefined;
395
396
  }
396
- async executeTestFile(file, framework, timeout) {
397
- return this.executeTestFiles([file], framework, timeout);
397
+ async executeTestFile(file, framework, timeout, projectRoot) {
398
+ return this.executeTestFiles([file], framework, timeout, projectRoot);
398
399
  }
399
- async executeTestFiles(files, framework, timeout) {
400
+ async executeTestFiles(files, framework, timeout, projectRoot) {
400
401
  // In simulation mode (for unit testing), use random behavior
401
402
  if (this.config.simulateForTesting) {
402
403
  return this.aggregateResults(files.map(file => this.simulateTestExecution(file)));
403
404
  }
405
+ // #1247: a runner loads the config of the directory it starts in, so each
406
+ // file runs from its own runner project (or the caller's projectRoot).
407
+ const groups = projectRoot
408
+ ? [{ cwd: projectRoot, files }]
409
+ : groupByRunnerProject(files);
410
+ if (groups.length === 1) {
411
+ return this.executeProjectFiles(groups[0].files, framework, timeout, groups[0].cwd);
412
+ }
413
+ // Each project gets its own runner and timeout. Their coverage maps are
414
+ // merged from raw counters, or left unmeasured (#1030).
415
+ const results = await Promise.all(groups.map(group => this.executeProjectFiles(group.files, framework, timeout, group.cwd)));
416
+ const combined = this.aggregateResults(results);
417
+ const merged = this.mergeSequentialCoverage(results);
418
+ combined.coverage = merged?.summary;
419
+ combined.fileCoverages = merged?.perFile;
420
+ return combined;
421
+ }
422
+ async executeProjectFiles(files, framework, timeout, cwd) {
404
423
  // Production mode: spawn actual test runner process
405
- const result = await this.spawnTestRunner(files, framework, timeout);
424
+ const result = await this.spawnTestRunner(files, framework, timeout, cwd);
406
425
  if (result.success === false) {
407
426
  // Runner/suite errors have no trustworthy assertion receipt to aggregate.
408
427
  if (result.error instanceof TestRunnerExecutionError)
@@ -428,7 +447,7 @@ Provide:
428
447
  /**
429
448
  * Spawn actual test runner process (vitest, jest, mocha)
430
449
  */
431
- async spawnTestRunner(files, framework, timeout) {
450
+ async spawnTestRunner(files, framework, timeout, cwd = process.cwd()) {
432
451
  // Verify test file exists
433
452
  const missingFile = files.find(file => !existsSync(file));
434
453
  if (missingFile) {
@@ -466,7 +485,7 @@ Provide:
466
485
  let proc;
467
486
  try {
468
487
  proc = spawn(command, args, {
469
- cwd: process.cwd(),
488
+ cwd,
470
489
  detached: process.platform !== 'win32',
471
490
  env: {
472
491
  ...process.env,
@@ -999,7 +1018,7 @@ Provide:
999
1018
  return shards;
1000
1019
  }
1001
1020
  async executeWorker(files, _workerIndex, _isolation, request) {
1002
- return this.executeTestFiles(files, request.framework, request.timeout ?? 30000);
1021
+ return this.executeTestFiles(files, request.framework, request.timeout ?? 30000, request.projectRoot);
1003
1022
  }
1004
1023
  aggregateResults(results) {
1005
1024
  const aggregated = {