agentic-qe 3.15.15 → 3.15.17

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 (526) hide show
  1. package/.claude/skills/skills-manifest.json +1 -1
  2. package/CHANGELOG.md +168 -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-OMILP6KH.js +2 -0
  8. package/dist/cli/chunks/{agent-booster-wasm-EUF4XVUC.js → agent-booster-wasm-6BUOFQZA.js} +2 -2
  9. package/dist/cli/chunks/{agent-handler-MOX6PSIQ.js → agent-handler-HPDK3JI3.js} +2 -2
  10. package/dist/cli/chunks/{agent-memory-branch-AEXKIGDG.js → agent-memory-branch-5QKUTWK5.js} +2 -2
  11. package/dist/cli/chunks/aqe-learning-engine-OXH5CCOS.js +2 -0
  12. package/dist/cli/chunks/{arena-IQ5ZZDRF.js → arena-7OKPMNHD.js} +2 -2
  13. package/dist/cli/chunks/{arena-M7GA3CVG.js → arena-HZ35LESR.js} +4 -4
  14. package/dist/cli/chunks/{audit-4IPBMKWB.js → audit-XI575SVK.js} +3 -3
  15. package/dist/cli/chunks/base-MAK2BLTG.js +2 -0
  16. package/dist/cli/chunks/{better-sqlite3-IKDKJ2IE.js → better-sqlite3-YO5X7ZJS.js} +2 -2
  17. package/dist/cli/chunks/{brain-handler-5NQUDH4W.js → brain-handler-GCQZFZGQ.js} +3 -3
  18. package/dist/cli/chunks/{branch-enumerator-KSXELWRC.js → branch-enumerator-N6G44UU2.js} +2 -2
  19. package/dist/cli/chunks/{browser-6LACARWE.js → browser-EVKPTLOI.js} +2 -2
  20. package/dist/cli/chunks/browser-workflow-IR3VF2TL.js +2 -0
  21. package/dist/cli/chunks/{chunk-DKX4GNRU.js → chunk-2EQK7B5L.js} +2 -2
  22. package/dist/cli/chunks/chunk-2PCEMDIX.js +757 -0
  23. package/dist/cli/chunks/{chunk-JCQGJGGZ.js → chunk-2UUZCQSD.js} +7 -7
  24. package/dist/cli/chunks/chunk-2YWYW7NU.js +21 -0
  25. package/dist/cli/chunks/{chunk-PFQCV6YS.js → chunk-45223KK6.js} +6 -6
  26. package/dist/cli/chunks/chunk-4EJLHNER.js +12 -0
  27. package/dist/cli/chunks/{chunk-E5G4WZ2T.js → chunk-4L6WX5KC.js} +1 -1
  28. package/dist/cli/chunks/{chunk-UQPA33UK.js → chunk-4NKZU2JZ.js} +2 -2
  29. package/dist/cli/chunks/{chunk-OBDONJQM.js → chunk-4UKTIQDT.js} +2 -2
  30. package/dist/cli/chunks/{chunk-7BLZHFKD.js → chunk-4YM45Z5B.js} +1 -1
  31. package/dist/cli/chunks/{chunk-ZWBGYJ7K.js → chunk-5FSPELOG.js} +2 -2
  32. package/dist/cli/chunks/{chunk-NWIIYHT6.js → chunk-5WATBVU6.js} +2 -2
  33. package/dist/cli/chunks/{chunk-7ACCBHRB.js → chunk-5WYZVSL2.js} +1 -1
  34. package/dist/cli/chunks/{chunk-ZYJB6FML.js → chunk-6LSZCEW2.js} +1 -1
  35. package/dist/cli/chunks/{chunk-U62OUXBF.js → chunk-6V6BD6PH.js} +1 -1
  36. package/dist/cli/chunks/{chunk-MIA447GY.js → chunk-74MDUIAZ.js} +1 -1
  37. package/dist/cli/chunks/{chunk-AJPROCDW.js → chunk-776K4ZLE.js} +2 -2
  38. package/dist/cli/chunks/{chunk-CBK5CT6T.js → chunk-7BSOO3CY.js} +2 -2
  39. package/dist/cli/chunks/{chunk-ERN56H6S.js → chunk-7SNSI4VY.js} +1 -1
  40. package/dist/cli/chunks/{chunk-JKJOB65O.js → chunk-A4BVDYIL.js} +1 -1
  41. package/dist/cli/chunks/{chunk-MV55NXTD.js → chunk-AGCS5GSO.js} +2 -2
  42. package/dist/cli/chunks/{chunk-XIVVTYM2.js → chunk-AVHYJ3XP.js} +2 -2
  43. package/dist/cli/chunks/{chunk-KJBPB7P5.js → chunk-BE7ZHM34.js} +2 -2
  44. package/dist/cli/chunks/{chunk-GKSMRBHU.js → chunk-BHQ2DLJU.js} +1 -1
  45. package/dist/cli/chunks/{chunk-7XB3FCKM.js → chunk-BKHEQIRZ.js} +2 -2
  46. package/dist/cli/chunks/{chunk-G242G224.js → chunk-BSIWI4ES.js} +2 -2
  47. package/dist/cli/chunks/{chunk-NQS3BWS6.js → chunk-C7QLLMYI.js} +1 -1
  48. package/dist/cli/chunks/{chunk-XWIAZG3C.js → chunk-CMN7PU2H.js} +2 -2
  49. package/dist/cli/chunks/{chunk-4X3SWKBA.js → chunk-COTQ44YO.js} +2 -2
  50. package/dist/cli/chunks/{chunk-3J3RNJNX.js → chunk-CQER6IJ5.js} +1 -1
  51. package/dist/cli/chunks/{chunk-6KCSKGVY.js → chunk-CVPXHDQU.js} +1 -1
  52. package/dist/cli/chunks/{chunk-R6LHJ7ME.js → chunk-CVYPMGUM.js} +2 -2
  53. package/dist/cli/chunks/chunk-CXCMATZ6.js +3 -0
  54. package/dist/cli/chunks/{chunk-PYPS65P7.js → chunk-D75GLKEL.js} +2 -2
  55. package/dist/cli/chunks/chunk-DCDSN67A.js +2 -0
  56. package/dist/cli/chunks/{chunk-6RBTS3NF.js → chunk-DHKSPOUQ.js} +2 -2
  57. package/dist/cli/chunks/{chunk-JW74KRBC.js → chunk-DJDVD6RM.js} +2 -2
  58. package/dist/cli/chunks/{chunk-X33CWRDF.js → chunk-DNVRTJKB.js} +2 -2
  59. package/dist/cli/chunks/{chunk-BQ47GQPK.js → chunk-DS5IFRY6.js} +2 -2
  60. package/dist/cli/chunks/{chunk-AHMWD6JG.js → chunk-E7XIMOKW.js} +2 -2
  61. package/dist/cli/chunks/{chunk-SON6ZRH3.js → chunk-ECKHDHR2.js} +2 -2
  62. package/dist/cli/chunks/chunk-EPVPXHL7.js +2 -0
  63. package/dist/cli/chunks/{chunk-BP5T3OEV.js → chunk-ERYADKMZ.js} +4 -4
  64. package/dist/cli/chunks/{chunk-DUKE27HC.js → chunk-EUWG2JG4.js} +2 -2
  65. package/dist/cli/chunks/chunk-FAQ24UHB.js +29 -0
  66. package/dist/cli/chunks/{chunk-XG4F4XH4.js → chunk-FBBPRVNF.js} +2 -2
  67. package/dist/cli/chunks/{chunk-5PTAFGJT.js → chunk-FBSBXCZS.js} +2 -2
  68. package/dist/cli/chunks/chunk-G2X3OLMN.js +153 -0
  69. package/dist/cli/chunks/{chunk-IXL5ZHWJ.js → chunk-GG7PMTHD.js} +1 -1
  70. package/dist/cli/chunks/{chunk-6BRQPHMZ.js → chunk-GN6OE3JT.js} +1 -1
  71. package/dist/cli/chunks/{chunk-SZAZQZWI.js → chunk-GPPTRKEM.js} +2 -2
  72. package/dist/cli/chunks/{chunk-LTQVUAPH.js → chunk-H2LHWZRE.js} +2 -2
  73. package/dist/cli/chunks/{chunk-WVXJ2QIG.js → chunk-HAQJFUAQ.js} +2 -2
  74. package/dist/cli/chunks/{chunk-C5CXL3JP.js → chunk-HD6W6PHV.js} +2 -2
  75. package/dist/cli/chunks/{chunk-K3WZICFA.js → chunk-HFZD5KLR.js} +1 -1
  76. package/dist/cli/chunks/{chunk-VCXI4XC4.js → chunk-HRUHHHVR.js} +2 -2
  77. package/dist/cli/chunks/{chunk-GV2QE5TO.js → chunk-HVT7RMGV.js} +1 -1
  78. package/dist/cli/chunks/chunk-HWQPMUSN.js +2 -0
  79. package/dist/cli/chunks/{chunk-4ATQP3PR.js → chunk-HZ5O7G2P.js} +1 -1
  80. package/dist/cli/chunks/{chunk-XHHWABJV.js → chunk-IHQGNDMX.js} +2 -2
  81. package/dist/cli/chunks/{chunk-UUBIQR6A.js → chunk-IJSROBM6.js} +18 -18
  82. package/dist/cli/chunks/{chunk-PS6UMZVK.js → chunk-IJZFJPHS.js} +2 -2
  83. package/dist/cli/chunks/{chunk-C4KLXFJP.js → chunk-IKB3M7OF.js} +1 -1
  84. package/dist/cli/chunks/{chunk-SJCKCSN3.js → chunk-INI3Q4CN.js} +1 -1
  85. package/dist/cli/chunks/{chunk-LYJHUNBK.js → chunk-IOWEBPXJ.js} +2 -2
  86. package/dist/cli/chunks/{chunk-HTZSRMHW.js → chunk-IQL6XRF5.js} +2 -2
  87. package/dist/cli/chunks/{chunk-DEKR3CTS.js → chunk-IRHXGCQR.js} +2 -2
  88. package/dist/cli/chunks/{chunk-TODNOP7C.js → chunk-J3QFJI2Y.js} +6 -6
  89. package/dist/cli/chunks/{chunk-OLZH5LRT.js → chunk-J6QRNQJF.js} +11 -11
  90. package/dist/cli/chunks/{chunk-HL2ANKN3.js → chunk-J7Q5TXFZ.js} +2 -2
  91. package/dist/cli/chunks/{chunk-6YVMX2TC.js → chunk-JHKKIJT2.js} +2 -2
  92. package/dist/cli/chunks/{chunk-K3XBQC3R.js → chunk-JI33PMPZ.js} +1 -1
  93. package/dist/cli/chunks/{chunk-74YG72NQ.js → chunk-JRIJM4LE.js} +3 -3
  94. package/dist/cli/chunks/{chunk-TDQWTSBS.js → chunk-JVWZAE2H.js} +2 -2
  95. package/dist/cli/chunks/{chunk-RDMRY7CT.js → chunk-K7WAI662.js} +1 -1
  96. package/dist/cli/chunks/{chunk-C4RTAVC6.js → chunk-KB34MTFZ.js} +2 -2
  97. package/dist/cli/chunks/{chunk-2CKERSMB.js → chunk-KPIPVSIP.js} +2 -2
  98. package/dist/cli/chunks/{chunk-LNX74WHQ.js → chunk-KR2TAAF6.js} +1 -1
  99. package/dist/cli/chunks/{chunk-73PBAWAF.js → chunk-KT2QCXO6.js} +2 -2
  100. package/dist/cli/chunks/{chunk-BBRROA3Z.js → chunk-KTORRIX3.js} +2 -2
  101. package/dist/cli/chunks/{chunk-GCHYOPRZ.js → chunk-LCWEQRZI.js} +2 -2
  102. package/dist/cli/chunks/{chunk-M4WMSCAE.js → chunk-LG5PPJT7.js} +1 -1
  103. package/dist/cli/chunks/{chunk-UAQZI6N4.js → chunk-LIF6UWHV.js} +2 -2
  104. package/dist/cli/chunks/chunk-LN7NKE3N.js +27 -0
  105. package/dist/cli/chunks/chunk-LOLSZG5J.js +2 -0
  106. package/dist/cli/chunks/{chunk-BLL2XU7A.js → chunk-LOMT4UC2.js} +2 -2
  107. package/dist/cli/chunks/chunk-LRKLATSH.js +2 -0
  108. package/dist/cli/chunks/{chunk-EKP2SC77.js → chunk-LRY6UIRI.js} +2 -2
  109. package/dist/cli/chunks/{chunk-JCZCJE6X.js → chunk-LV7UIK4Q.js} +2 -2
  110. package/dist/cli/chunks/{chunk-LVABQNRF.js → chunk-M2YI5YUR.js} +2 -2
  111. package/dist/cli/chunks/{chunk-RIRZHOS2.js → chunk-MCXW3DKE.js} +2 -2
  112. package/dist/cli/chunks/{chunk-ZSOMUTNL.js → chunk-MGZ6XZHU.js} +1 -1
  113. package/dist/cli/chunks/{chunk-H5DER3JY.js → chunk-MLMD3I75.js} +1 -1
  114. package/dist/cli/chunks/{chunk-UXIY4IAI.js → chunk-MVVVGQJ6.js} +2 -2
  115. package/dist/cli/chunks/{chunk-WUOOX7UG.js → chunk-ND72UDVH.js} +2 -2
  116. package/dist/cli/chunks/{chunk-AKZO6GGG.js → chunk-NE3LRUNC.js} +4 -4
  117. package/dist/cli/chunks/{chunk-O6EWL5DQ.js → chunk-NKUHMA4T.js} +2 -2
  118. package/dist/cli/chunks/{chunk-L32JNNKL.js → chunk-NQFDJ6BT.js} +1 -1
  119. package/dist/cli/chunks/{chunk-T66PPF4D.js → chunk-NZJVDOUN.js} +31 -31
  120. package/dist/cli/chunks/{chunk-EBTNMQSS.js → chunk-O7VJ3VKD.js} +2 -2
  121. package/dist/cli/chunks/{chunk-76P32JVU.js → chunk-OJIUIEI4.js} +1 -1
  122. package/dist/cli/chunks/chunk-OO2M2QUV.js +12 -0
  123. package/dist/cli/chunks/{chunk-CAOUV5GZ.js → chunk-ORQ2YBRR.js} +2 -2
  124. package/dist/cli/chunks/chunk-OWIQR6N2.js +4 -0
  125. package/dist/cli/chunks/chunk-OWIZBZLN.js +14 -0
  126. package/dist/cli/chunks/{chunk-J3FP5UGL.js → chunk-P3D7SEHW.js} +1 -1
  127. package/dist/cli/chunks/{chunk-3CYNZFKH.js → chunk-P4OB6WDJ.js} +1 -1
  128. package/dist/cli/chunks/{chunk-LHMQIZ6B.js → chunk-PCL5JRKN.js} +2 -2
  129. package/dist/cli/chunks/{chunk-KLTMOXIK.js → chunk-PIWGKGWP.js} +2 -2
  130. package/dist/cli/chunks/{chunk-VMAM46HQ.js → chunk-PK34KJH7.js} +2 -2
  131. package/dist/cli/chunks/chunk-POPSZDI2.js +65 -0
  132. package/dist/cli/chunks/{chunk-JUDUBQHA.js → chunk-Q6F3DYZN.js} +2 -2
  133. package/dist/cli/chunks/{chunk-Y2OX6KGN.js → chunk-QJSSUBO3.js} +2 -2
  134. package/dist/cli/chunks/{chunk-XM6ZVFM5.js → chunk-QN7HP2UW.js} +235 -173
  135. package/dist/cli/chunks/{chunk-T4GE7MPI.js → chunk-QSQNXBD2.js} +2 -2
  136. package/dist/cli/chunks/{chunk-5C62XMJR.js → chunk-QTQDX4TZ.js} +33 -33
  137. package/dist/cli/chunks/{chunk-DURD37JZ.js → chunk-R3KBOQ3O.js} +2 -2
  138. package/dist/cli/chunks/{chunk-LJMYRTJ7.js → chunk-REY52O7J.js} +1 -1
  139. package/dist/cli/chunks/{chunk-W5ZJG2OU.js → chunk-RKCN4B26.js} +2 -2
  140. package/dist/cli/chunks/chunk-S3DT5TPR.js +14 -0
  141. package/dist/cli/chunks/{chunk-4HKAD25N.js → chunk-S3TBOKAZ.js} +22 -22
  142. package/dist/cli/chunks/{chunk-2IIXCEMS.js → chunk-SAEECT23.js} +2 -2
  143. package/dist/cli/chunks/{chunk-LB2LGEDP.js → chunk-SAZ4PJBR.js} +2 -2
  144. package/dist/cli/chunks/{chunk-FOOW4JVS.js → chunk-SFITYZLV.js} +2 -2
  145. package/dist/cli/chunks/{chunk-2ZFLULL4.js → chunk-SRBCBVSI.js} +2 -2
  146. package/dist/cli/chunks/chunk-SUAZ5Z47.js +63 -0
  147. package/dist/cli/chunks/{chunk-RBKUU7WF.js → chunk-TDZ6N43D.js} +2 -2
  148. package/dist/cli/chunks/chunk-TIVKDIF7.js +2 -0
  149. package/dist/cli/chunks/{chunk-MPFPWJTH.js → chunk-TM75GAXG.js} +2 -2
  150. package/dist/cli/chunks/{chunk-UJABDXST.js → chunk-TWBZONKT.js} +2 -2
  151. package/dist/cli/chunks/{chunk-AOKKUB5F.js → chunk-U4S74IIZ.js} +1 -1
  152. package/dist/cli/chunks/{chunk-W62OOK7A.js → chunk-U5SMBJ6F.js} +2 -2
  153. package/dist/cli/chunks/{chunk-6LE362LZ.js → chunk-UHJVZEQA.js} +2 -2
  154. package/dist/cli/chunks/{chunk-T67R2MUN.js → chunk-UOVCTK5L.js} +2 -2
  155. package/dist/cli/chunks/{chunk-FTRSS64D.js → chunk-VDEKVIP5.js} +2 -2
  156. package/dist/cli/chunks/{chunk-BDKEAGQ2.js → chunk-VITV7AEC.js} +2 -2
  157. package/dist/cli/chunks/{chunk-BU4UQR36.js → chunk-VKREKVFI.js} +2 -2
  158. package/dist/cli/chunks/{chunk-BZULJMGH.js → chunk-VLTDW7XJ.js} +2 -2
  159. package/dist/cli/chunks/{chunk-UE2J6MA5.js → chunk-VQFV2IPV.js} +1 -1
  160. package/dist/cli/chunks/{chunk-TZIHDJZD.js → chunk-VYPVU3JF.js} +2 -2
  161. package/dist/cli/chunks/{chunk-UORB2QDU.js → chunk-WAOEQA3W.js} +2 -2
  162. package/dist/cli/chunks/{chunk-GQABPCQE.js → chunk-WBDWHHKP.js} +2 -2
  163. package/dist/cli/chunks/{chunk-GGQGCT4Y.js → chunk-WX4PO65Q.js} +2 -2
  164. package/dist/cli/chunks/chunk-X2DWHGCC.js +6 -0
  165. package/dist/cli/chunks/{chunk-337Z52QM.js → chunk-X5QD76IU.js} +2 -2
  166. package/dist/cli/chunks/{chunk-E56PVVWC.js → chunk-XBTGEYED.js} +2 -2
  167. package/dist/cli/chunks/{chunk-5AFVEWMT.js → chunk-XEMCHGAJ.js} +2 -2
  168. package/dist/cli/chunks/{chunk-E3MRDIZF.js → chunk-XEYFZLIT.js} +1 -1
  169. package/dist/cli/chunks/{chunk-KCQNFBBR.js → chunk-XFTX3KLE.js} +1 -1
  170. package/dist/cli/chunks/{chunk-QFGYH6HD.js → chunk-XPTCQKVE.js} +1 -1
  171. package/dist/cli/chunks/{chunk-PXATBHWN.js → chunk-YAJOBZE5.js} +2 -2
  172. package/dist/cli/chunks/{chunk-27HE2BHC.js → chunk-YCVLKU6H.js} +2 -2
  173. package/dist/cli/chunks/{chunk-ZIPAB5J6.js → chunk-YD2C6EPN.js} +2 -2
  174. package/dist/cli/chunks/{chunk-5G4UFTV4.js → chunk-YKRLUTK7.js} +2 -2
  175. package/dist/cli/chunks/{chunk-YUS6TWAL.js → chunk-YMUY3TES.js} +6 -6
  176. package/dist/cli/chunks/chunk-YR5QBUHZ.js +6 -0
  177. package/dist/cli/chunks/{chunk-XH4JMX5O.js → chunk-Z7SKUC6P.js} +1 -1
  178. package/dist/cli/chunks/{chunk-EFUJDMNC.js → chunk-ZAQMRFBB.js} +2 -2
  179. package/dist/cli/chunks/{chunk-22UKJGGN.js → chunk-ZC3KDNJW.js} +3 -3
  180. package/dist/cli/chunks/{chunk-AP2W7Z3A.js → chunk-ZGV7L4MW.js} +1 -1
  181. package/dist/cli/chunks/{chunk-W27AJ5B4.js → chunk-ZN35XSKF.js} +2 -2
  182. package/dist/cli/chunks/{chunk-M4CJCPCQ.js → chunk-ZNXM6WVL.js} +2 -2
  183. package/dist/cli/chunks/{chunk-5I7357KS.js → chunk-ZP5AWQRO.js} +2 -2
  184. package/dist/cli/chunks/{chunk-OQG3UQQ7.js → chunk-ZTP3DQ5M.js} +1 -1
  185. package/dist/cli/chunks/{chunk-BFQTLF5X.js → chunk-ZVMSSCTH.js} +2 -2
  186. package/dist/cli/chunks/chunk-ZWUF27P4.js +2 -0
  187. package/dist/cli/chunks/{ci-UCUJOSBW.js → ci-3RTTTS2D.js} +2 -2
  188. package/dist/cli/chunks/{ci-config-2XILD3XG.js → ci-config-XRUR3I4K.js} +2 -2
  189. package/dist/cli/chunks/{ci-output-BL6KWOHW.js → ci-output-E5IAMU2U.js} +2 -2
  190. package/dist/cli/chunks/{circuit-breaker-5XLIOXE5.js → circuit-breaker-SHR2P44P.js} +2 -2
  191. package/dist/cli/chunks/{claude-flow-setup-4IMP6ACS.js → claude-flow-setup-ZDDILFMF.js} +2 -2
  192. package/dist/cli/chunks/client-NO5FOWT4.js +2 -0
  193. package/dist/cli/chunks/{cline-installer-RYLHCDK7.js → cline-installer-BGYVUM6G.js} +2 -2
  194. package/dist/cli/chunks/{code-WY3GJXHX.js → code-PJ4MC3MC.js} +4 -3
  195. package/dist/cli/chunks/{code-index-extractor-Y4MZBZCW.js → code-index-extractor-IW2P22YG.js} +2 -2
  196. package/dist/cli/chunks/{codex-installer-SCJ3T3DX.js → codex-installer-A7WZ6OGL.js} +2 -2
  197. package/dist/cli/chunks/{completions-CN2DXQFU.js → completions-KS23WD5J.js} +2 -2
  198. package/dist/cli/chunks/{complexity-analyzer-7MDPPIBH.js → complexity-analyzer-Q7GLSR2E.js} +2 -2
  199. package/dist/cli/chunks/{continuedev-installer-GCEJRK34.js → continuedev-installer-SK55BFW2.js} +2 -2
  200. package/dist/cli/chunks/copilot-installer-3N5J3WTM.js +3 -0
  201. package/dist/cli/chunks/core-handlers-JNAZPXE2.js +2 -0
  202. package/dist/cli/chunks/{cost-tracker-VO5MFWR6.js → cost-tracker-NENVSO4A.js} +2 -2
  203. package/dist/cli/chunks/{coverage-LYFQYNH6.js → coverage-5L7UQWDH.js} +3 -3
  204. package/dist/cli/chunks/cross-domain-router-HEBM767Z.js +2 -0
  205. package/dist/cli/chunks/{cursor-installer-KP4HA7TV.js → cursor-installer-XXBO2ZE6.js} +2 -2
  206. package/dist/cli/chunks/{daemon-7RC7TS57.js → daemon-CDCQU3LR.js} +3 -3
  207. package/dist/cli/chunks/daemon-JEBJGEUK.js +18 -0
  208. package/dist/cli/chunks/{dag-attention-scheduler-NKA44RSR.js → dag-attention-scheduler-HOMMF7FA.js} +2 -2
  209. package/dist/cli/chunks/{detect-CMYAJWYF.js → detect-FXCOUG6X.js} +2 -2
  210. package/dist/cli/chunks/{dist-node-EN3PYEGW.js → dist-node-GXQ7FMTY.js} +2 -2
  211. package/dist/cli/chunks/{domain-handler-EXSZCX7A.js → domain-handler-TI3JBAPC.js} +2 -2
  212. package/dist/cli/chunks/{domain-plugins-HCQFSNL7.js → domain-plugins-R7LTUM32.js} +2 -2
  213. package/dist/cli/chunks/{domain-transfer-3LGSNTPO.js → domain-transfer-LBIAFHIQ.js} +2 -2
  214. package/dist/cli/chunks/dream-GQDCEJMS.js +2 -0
  215. package/dist/cli/chunks/embed-and-insert-pattern-33KLHDD5.js +3 -0
  216. package/dist/cli/chunks/embedding-space-HHLWTBF5.js +2 -0
  217. package/dist/cli/chunks/{eval-OQELIWJK.js → eval-KDOZMAXJ.js} +2 -2
  218. package/dist/cli/chunks/experience-capture-middleware-X45PECQN.js +40 -0
  219. package/dist/cli/chunks/{fast-paths-UV4NDEWM.js → fast-paths-462V6UUB.js} +2 -2
  220. package/dist/cli/chunks/{feature-flags-H7H33B6C.js → feature-flags-G66OT3AS.js} +2 -2
  221. package/dist/cli/chunks/{feature-flags-CKTYX67J.js → feature-flags-NIRQ4YDM.js} +2 -2
  222. package/dist/cli/chunks/file-discovery-33USPLB5.js +2 -0
  223. package/dist/cli/chunks/{fleet-ZJBCAKRG.js → fleet-PXWGB7CU.js} +3 -3
  224. package/dist/cli/chunks/{gnn-wrapper-RUE2QZRG.js → gnn-wrapper-7MUW3M5M.js} +2 -2
  225. package/dist/cli/chunks/{heartbeat-handler-XRV327M7.js → heartbeat-handler-5237PB35.js} +4 -4
  226. package/dist/cli/chunks/heartbeat-scheduler-LIXLC5IH.js +2 -0
  227. package/dist/cli/chunks/hnsw-adapter-62D5UH27.js +2 -0
  228. package/dist/cli/chunks/hnsw-index-GSGUMQQC.js +2 -0
  229. package/dist/cli/chunks/{hnsw-legacy-bridge-UJID6ZZ4.js → hnsw-legacy-bridge-OSQPW7JP.js} +2 -2
  230. package/dist/cli/chunks/{hnswlib-node-WS43R4AX.js → hnswlib-node-GX6WG2GB.js} +2 -2
  231. package/dist/cli/chunks/{hooks-YZNJKXAJ.js → hooks-GUWHL7VC.js} +23 -22
  232. package/dist/cli/chunks/hybrid-backend-FRWP4BOY.js +2 -0
  233. package/dist/cli/chunks/{hypergraph-engine-XQJSIMTS.js → hypergraph-engine-SRWLLCU3.js} +2 -2
  234. package/dist/cli/chunks/{hypergraph-handler-ZD2NYXMR.js → hypergraph-handler-AVOPRHHO.js} +3 -3
  235. package/dist/cli/chunks/impact-analyzer-7KF3AQXV.js +2 -0
  236. package/dist/cli/chunks/{init-guard-DSRUAVRT.js → init-guard-P4N6EVZS.js} +2 -2
  237. package/dist/cli/chunks/{init-handler-RJU5QMAP.js → init-handler-LRGWOJMD.js} +6 -6
  238. package/dist/cli/chunks/init-wizard-XWWAXY25.js +2 -0
  239. package/dist/cli/chunks/kernel-ZEJPNDBW.js +2 -0
  240. package/dist/cli/chunks/{kilocode-installer-BCPOCVMC.js → kilocode-installer-7R2EPOQ6.js} +2 -2
  241. package/dist/cli/chunks/{kiro-installer-GFCWCB2S.js → kiro-installer-QNM7DPOB.js} +2 -2
  242. package/dist/cli/chunks/knowledge-graph-RRZQS7KY.js +2 -0
  243. package/dist/cli/chunks/{learning-FZTD72CF.js → learning-7OIZBPXZ.js} +3 -3
  244. package/dist/cli/chunks/{llm-router-GJVKGRJL.js → llm-router-SIDXES23.js} +4 -4
  245. package/dist/cli/chunks/llm-router-service-3OSW67LC.js +2 -0
  246. package/dist/cli/chunks/{load-YKTPOYBE.js → load-EI2E2C3S.js} +2 -2
  247. package/dist/cli/chunks/load-test-7TRIH2WJ.js +2 -0
  248. package/dist/cli/chunks/{mcp-LT6R2IKS.js → mcp-IOE5WOCS.js} +2 -2
  249. package/dist/cli/chunks/{memory-4HKKOLRY.js → memory-DLYGJAP7.js} +5 -5
  250. package/dist/cli/chunks/memory-backend-G7ZW6Q2B.js +2 -0
  251. package/dist/cli/chunks/memory-handlers-TPF3KCO5.js +2 -0
  252. package/dist/cli/chunks/{multi-model-executor-2YPM2WTK.js → multi-model-executor-WHH4YCHM.js} +2 -2
  253. package/dist/cli/chunks/{opencode-installer-WBAJMH5K.js → opencode-installer-63FDZAMS.js} +2 -2
  254. package/dist/cli/chunks/{orchestrator-5W5WVMVJ.js → orchestrator-3LA776KK.js} +5 -5
  255. package/dist/cli/chunks/pattern-null-store-OU3ZC3NR.js +2 -0
  256. package/dist/cli/chunks/{pattern-usage-recorder-GXRMNPAZ.js → pattern-usage-recorder-NW54QUGI.js} +2 -2
  257. package/dist/cli/chunks/{pipeline-2NA4DRDA.js → pipeline-P3TYX6J6.js} +2 -2
  258. package/dist/cli/chunks/{platform-BGERNQ5V.js → platform-FNA2WLI6.js} +2 -2
  259. package/dist/cli/chunks/{plugin-L4EPVENR.js → plugin-NJS7BC2S.js} +2 -2
  260. package/dist/cli/chunks/{prime-radiant-advanced-wasm-RTQRTPTM.js → prime-radiant-advanced-wasm-NIAVL2OT.js} +2 -2
  261. package/dist/cli/chunks/project-root-GMOFJEKD.js +2 -0
  262. package/dist/cli/chunks/protocol-executor-AD345XRO.js +2 -0
  263. package/dist/cli/chunks/{protocol-handler-SYQXM6JK.js → protocol-handler-JU5C4JHY.js} +2 -2
  264. package/dist/cli/chunks/{prove-5O7GPJCU.js → prove-35VOSLYP.js} +2 -2
  265. package/dist/cli/chunks/qe-reasoning-bank-NLTP26RC.js +2 -0
  266. package/dist/cli/chunks/{quality-KIIDHGNF.js → quality-ET74X7HN.js} +2 -2
  267. package/dist/cli/chunks/{quality-gate-H65VECD3.js → quality-gate-FEDQISNB.js} +3 -3
  268. package/dist/cli/chunks/queen-coordinator-2TB4FWS6.js +2 -0
  269. package/dist/cli/chunks/real-embeddings-II6CXTCI.js +2 -0
  270. package/dist/cli/chunks/{ref-validation-CSBJOMZM.js → ref-validation-DTBPYCEB.js} +2 -2
  271. package/dist/cli/chunks/{roocode-installer-G7OVYXEN.js → roocode-installer-LYQEMR4J.js} +2 -2
  272. package/dist/cli/chunks/router-PLM3MWME.js +2 -0
  273. package/dist/cli/chunks/routing-feedback-I7VOX2HU.js +2 -0
  274. package/dist/cli/chunks/{routing-handler-ZNZPPI5Y.js → routing-handler-DJOJFPII.js} +2 -2
  275. package/dist/cli/chunks/{ruvector-commands-C6IG3OY3.js → ruvector-commands-VXYGJDPW.js} +2 -2
  276. package/dist/cli/chunks/rvf-dual-writer-GQZHFWO2.js +2 -0
  277. package/dist/cli/chunks/rvf-migration-adapter-3TVKBCAM.js +2 -0
  278. package/dist/cli/chunks/rvf-migration-coordinator-XUHKLMT6.js +2 -0
  279. package/dist/cli/chunks/rvf-native-adapter-5GUTYOWS.js +2 -0
  280. package/dist/cli/chunks/{rvf-store-integrity-3G6LFLT3.js → rvf-store-integrity-GA2ZYOEG.js} +2 -2
  281. package/dist/cli/chunks/safe-db-RZPQGLGQ.js +2 -0
  282. package/dist/cli/chunks/schedule-G7JMQDUX.js +2 -0
  283. package/dist/cli/chunks/scheduler-4SEGPCKD.js +2 -0
  284. package/dist/cli/chunks/{security-A3IMVLFM.js → security-MM6YOECX.js} +3 -3
  285. package/dist/cli/chunks/{shared-rvf-adapter-VHWQ6US5.js → shared-rvf-adapter-6AHPA3V5.js} +2 -2
  286. package/dist/cli/chunks/{shared-rvf-dual-writer-JB3QS7IG.js → shared-rvf-dual-writer-EYAVY2GZ.js} +2 -2
  287. package/dist/cli/chunks/sqlite-persistence-IVE4SQXR.js +2 -0
  288. package/dist/cli/chunks/{standalone-memory-DDNXCSBD.js → standalone-memory-A3PLB4CZ.js} +2 -2
  289. package/dist/cli/chunks/{status-handler-2HK7XPEK.js → status-handler-OSSFAP4Z.js} +2 -2
  290. package/dist/cli/chunks/{structural-health-DSJVLEPV.js → structural-health-PGY5XUNO.js} +2 -2
  291. package/dist/cli/chunks/{sync-NTUR53PI.js → sync-CWEHYGNN.js} +2 -2
  292. package/dist/cli/chunks/sync-PM6D7EQF.js +2 -0
  293. package/dist/cli/chunks/task-handler-LHMQ75W4.js +64 -0
  294. package/dist/cli/chunks/{task-handlers-VJR6EHRZ.js → task-handlers-S2TX5FTR.js} +4 -4
  295. package/dist/cli/chunks/test-4EGZZ6NJ.js +34 -0
  296. package/dist/cli/chunks/test-runner-process-72YACW6M.js +2 -0
  297. package/dist/cli/chunks/{test-scheduling-Q6QEEOS6.js → test-scheduling-YJQHH3XE.js} +3 -3
  298. package/dist/cli/chunks/token-bootstrap-DJNETMVW.js +2 -0
  299. package/dist/cli/chunks/{token-usage-YEEFWSSI.js → token-usage-WPNOJR6H.js} +2 -2
  300. package/dist/cli/chunks/{transformers-BZCHJJJT.js → transformers-4MRPXCPU.js} +2 -2
  301. package/dist/cli/chunks/tree-sitter-wasm-parser-UVWSDXFR.js +2 -0
  302. package/dist/cli/chunks/{types-4AOKZYOX.js → types-6P5FB4EB.js} +2 -2
  303. package/dist/cli/chunks/unified-memory-2VMGSGQL.js +2 -0
  304. package/dist/cli/chunks/unified-memory-hnsw-3KULVD3N.js +2 -0
  305. package/dist/cli/chunks/unified-persistence-QCSLU2SV.js +2 -0
  306. package/dist/cli/chunks/{upgrade-2MWW6BT2.js → upgrade-4ICTN63Y.js} +2 -2
  307. package/dist/cli/chunks/{validate-PAEV3GT5.js → validate-HQF5GZ7L.js} +2 -2
  308. package/dist/cli/chunks/{validate-swarm-ZIXACK5K.js → validate-swarm-45JYG7VW.js} +2 -2
  309. package/dist/cli/chunks/visual-security-ZYP2KPH7.js +2 -0
  310. package/dist/cli/chunks/{web-tree-sitter-VLTXZFAB.js → web-tree-sitter-UOTWZLNH.js} +2 -2
  311. package/dist/cli/chunks/{windsurf-installer-VELMLOZF.js → windsurf-installer-WDWSBXGN.js} +2 -2
  312. package/dist/cli/chunks/witness-chain-5QRT7EMX.js +2 -0
  313. package/dist/cli/chunks/witness-chain-DOYMNPC7.js +2 -0
  314. package/dist/cli/chunks/witness-chain-repair-CUF2AFQB.js +2 -0
  315. package/dist/cli/chunks/{witness-chain-verifier-MIDWD4JS.js → witness-chain-verifier-JB42X62J.js} +2 -2
  316. package/dist/cli/chunks/{witness-key-manager-OSVCWOB2.js → witness-key-manager-LXXO6L2G.js} +2 -2
  317. package/dist/cli/chunks/{workflow-MK7A7QCX.js → workflow-6ARK47NF.js} +4 -4
  318. package/dist/cli/chunks/workflow-orchestrator-RYDDWIXN.js +2 -0
  319. package/dist/cli/chunks/wrappers-CYQBOMPL.js +2 -0
  320. package/dist/cli/commands/code.js +4 -0
  321. package/dist/cli/commands/hooks-handlers/hooks-dream-learning.js +10 -2
  322. package/dist/cli/commands/test.js +26 -4
  323. package/dist/cli/handlers/task-handler.d.ts +5 -0
  324. package/dist/cli/handlers/task-handler.js +21 -1
  325. package/dist/cli/utils/task-result.d.ts +11 -0
  326. package/dist/cli/utils/task-result.js +39 -0
  327. package/dist/coordination/handlers/test-execution-handlers.js +137 -59
  328. package/dist/coordination/mincut/mincut-persistence.js +29 -25
  329. package/dist/domains/code-intelligence/coordinator.d.ts +4 -0
  330. package/dist/domains/code-intelligence/coordinator.js +46 -13
  331. package/dist/domains/code-intelligence/interfaces.d.ts +10 -1
  332. package/dist/domains/code-intelligence/services/semantic-analyzer.d.ts +37 -7
  333. package/dist/domains/code-intelligence/services/semantic-analyzer.js +135 -62
  334. package/dist/domains/code-intelligence/services/text-relevance.d.ts +32 -0
  335. package/dist/domains/code-intelligence/services/text-relevance.js +63 -0
  336. package/dist/domains/learning-optimization/services/learning-coordinator.js +1 -1
  337. package/dist/domains/quality-assessment/coordinator.js +2 -1
  338. package/dist/domains/test-execution/coordinator.d.ts +3 -1
  339. package/dist/domains/test-execution/coordinator.js +21 -7
  340. package/dist/domains/test-execution/interfaces.d.ts +17 -0
  341. package/dist/domains/test-execution/plugin.js +8 -2
  342. package/dist/domains/test-execution/services/flaky-detector.d.ts +9 -1
  343. package/dist/domains/test-execution/services/flaky-detector.js +26 -8
  344. package/dist/domains/test-execution/services/retry-handler.d.ts +9 -1
  345. package/dist/domains/test-execution/services/retry-handler.js +56 -12
  346. package/dist/domains/test-execution/services/runner-test-cases.d.ts +2 -0
  347. package/dist/domains/test-execution/services/runner-test-cases.js +7 -3
  348. package/dist/domains/test-execution/services/test-executor.d.ts +6 -1
  349. package/dist/domains/test-execution/services/test-executor.js +97 -14
  350. package/dist/domains/visual-accessibility/coordinator.d.ts +15 -7
  351. package/dist/domains/visual-accessibility/coordinator.js +15 -7
  352. package/dist/domains/visual-accessibility/interfaces.d.ts +27 -3
  353. package/dist/domains/visual-accessibility/services/accessibility-contrast.d.ts +39 -0
  354. package/dist/domains/visual-accessibility/services/accessibility-contrast.js +93 -0
  355. package/dist/domains/visual-accessibility/services/accessibility-tester-browser.d.ts +18 -3
  356. package/dist/domains/visual-accessibility/services/accessibility-tester-browser.js +50 -40
  357. package/dist/domains/visual-accessibility/services/accessibility-tester-checks.d.ts +27 -0
  358. package/dist/domains/visual-accessibility/services/accessibility-tester-checks.js +137 -0
  359. package/dist/domains/visual-accessibility/services/accessibility-tester.d.ts +5 -0
  360. package/dist/domains/visual-accessibility/services/accessibility-tester.js +43 -24
  361. package/dist/domains/visual-accessibility/services/browser-swarm-coordinator.d.ts +2 -3
  362. package/dist/domains/visual-accessibility/services/browser-swarm-coordinator.js +8 -14
  363. package/dist/feedback/coverage-learner.js +13 -9
  364. package/dist/feedback/test-outcome-tracker.js +13 -9
  365. package/dist/governance/witness-chain.d.ts +5 -0
  366. package/dist/governance/witness-chain.js +22 -6
  367. package/dist/init/copilot-installer.d.ts +6 -0
  368. package/dist/init/copilot-installer.js +37 -17
  369. package/dist/init/platform-config-generator.d.ts +10 -0
  370. package/dist/init/platform-config-generator.js +26 -1
  371. package/dist/integrations/agentic-flow/reasoning-bank/experience-replay.d.ts +22 -0
  372. package/dist/integrations/agentic-flow/reasoning-bank/experience-replay.js +115 -45
  373. package/dist/integrations/agentic-flow/reasoning-bank/pattern-evolution.d.ts +6 -0
  374. package/dist/integrations/agentic-flow/reasoning-bank/pattern-evolution.js +51 -33
  375. package/dist/integrations/agentic-flow/reasoning-bank/trajectory-tracker.js +17 -9
  376. package/dist/integrations/embeddings/cache/EmbeddingCache.d.ts +8 -0
  377. package/dist/integrations/embeddings/cache/EmbeddingCache.js +24 -10
  378. package/dist/integrations/ruvector/delta-tracker.d.ts +11 -0
  379. package/dist/integrations/ruvector/delta-tracker.js +16 -0
  380. package/dist/integrations/ruvector/sona-persistence.d.ts +10 -0
  381. package/dist/integrations/ruvector/sona-persistence.js +49 -24
  382. package/dist/kernel/unified-memory.d.ts +32 -0
  383. package/dist/kernel/unified-memory.js +76 -8
  384. package/dist/learning/aqe-learning-engine.js +1 -1
  385. package/dist/learning/embed-and-insert-pattern.js +4 -2
  386. package/dist/learning/embedder-endpoint-client.d.ts +76 -0
  387. package/dist/learning/embedder-endpoint-client.js +201 -13
  388. package/dist/learning/embedding-space-registry.d.ts +75 -0
  389. package/dist/learning/embedding-space-registry.js +142 -0
  390. package/dist/learning/embedding-space.d.ts +12 -0
  391. package/dist/learning/embedding-space.js +17 -0
  392. package/dist/learning/experience-capture-middleware.js +25 -13
  393. package/dist/learning/experience-capture.js +1 -1
  394. package/dist/learning/experience-consolidation.d.ts +18 -0
  395. package/dist/learning/experience-consolidation.js +55 -8
  396. package/dist/learning/experience-space-verification.d.ts +71 -0
  397. package/dist/learning/experience-space-verification.js +147 -0
  398. package/dist/learning/pattern-lifecycle.d.ts +40 -4
  399. package/dist/learning/pattern-lifecycle.js +153 -76
  400. package/dist/learning/pattern-null-store.d.ts +5 -0
  401. package/dist/learning/pattern-null-store.js +8 -0
  402. package/dist/learning/pattern-promotion.js +6 -3
  403. package/dist/learning/pattern-store.d.ts +6 -0
  404. package/dist/learning/pattern-store.js +19 -6
  405. package/dist/learning/qe-reasoning-bank.js +2 -2
  406. package/dist/learning/real-embeddings.d.ts +3 -0
  407. package/dist/learning/real-embeddings.js +52 -12
  408. package/dist/learning/real-qe-reasoning-bank.d.ts +5 -0
  409. package/dist/learning/real-qe-reasoning-bank.js +77 -47
  410. package/dist/learning/rvf-pattern-store.js +6 -2
  411. package/dist/learning/sqlite-persistence.d.ts +6 -0
  412. package/dist/learning/sqlite-persistence.js +10 -0
  413. package/dist/mcp/bundle.js +699 -619
  414. package/dist/mcp/entry.js +4 -0
  415. package/dist/mcp/handlers/domain-handler-configs.js +2 -0
  416. package/dist/mcp/handlers/trajectory-judge.js +1 -1
  417. package/dist/mcp/protocol-server.js +1 -0
  418. package/dist/mcp/tools/visual-accessibility/index.js +8 -2
  419. package/dist/mcp/types.d.ts +6 -0
  420. package/dist/optimization/session-cache.d.ts +17 -1
  421. package/dist/optimization/session-cache.js +40 -36
  422. package/dist/planning/goap-planner.d.ts +6 -0
  423. package/dist/planning/goap-planner.js +35 -19
  424. package/dist/planning/plan-executor.js +24 -15
  425. package/dist/routing/co-execution-repository.js +12 -9
  426. package/dist/routing/routing-feedback.d.ts +8 -0
  427. package/dist/routing/routing-feedback.js +46 -24
  428. package/dist/routing/routing-outcomes-migration.js +7 -2
  429. package/dist/shared/embeddings/index.d.ts +2 -2
  430. package/dist/shared/embeddings/index.js +1 -1
  431. package/dist/shared/embeddings/nomic-embedder.d.ts +8 -2
  432. package/dist/shared/embeddings/nomic-embedder.js +19 -11
  433. package/dist/shared/embeddings/ollama-client.d.ts +28 -2
  434. package/dist/shared/embeddings/ollama-client.js +84 -22
  435. package/dist/shared/embeddings/types.d.ts +15 -0
  436. package/dist/shared/embeddings/types.js +4 -0
  437. package/dist/shared/llm/spend-ledger.d.ts +9 -0
  438. package/dist/shared/llm/spend-ledger.js +64 -39
  439. package/dist/shared/pytest-junit-report.d.ts +93 -0
  440. package/dist/shared/pytest-junit-report.js +241 -0
  441. package/dist/shared/sqlite-lock-wait.d.ts +27 -0
  442. package/dist/shared/sqlite-lock-wait.js +37 -0
  443. package/dist/shared/sqlite-write-queue.d.ts +28 -0
  444. package/dist/shared/sqlite-write-queue.js +38 -0
  445. package/dist/shared/test-runner-project.d.ts +119 -0
  446. package/dist/shared/test-runner-project.js +301 -0
  447. package/dist/skills/security-visual-testing/index.d.ts +3 -1
  448. package/dist/skills/security-visual-testing/index.js +49 -35
  449. package/dist/skills/security-visual-testing/types.d.ts +19 -3
  450. package/dist/workers/workers/heartbeat-scheduler.js +5 -5
  451. package/dist/workers/workers/learning-consolidation.js +8 -7
  452. package/package.json +1 -1
  453. package/dist/cli/chunks/adapter-QU6INSKP.js +0 -2
  454. package/dist/cli/chunks/aqe-learning-engine-PAJPENJD.js +0 -2
  455. package/dist/cli/chunks/base-OTGSN6IC.js +0 -2
  456. package/dist/cli/chunks/browser-workflow-WLZGR6SB.js +0 -2
  457. package/dist/cli/chunks/chunk-2LUTPMBO.js +0 -21
  458. package/dist/cli/chunks/chunk-3HVFIITW.js +0 -2
  459. package/dist/cli/chunks/chunk-4D4CWP72.js +0 -2
  460. package/dist/cli/chunks/chunk-5KA5TVPR.js +0 -6
  461. package/dist/cli/chunks/chunk-6NBRMD25.js +0 -13
  462. package/dist/cli/chunks/chunk-7O45RQHF.js +0 -153
  463. package/dist/cli/chunks/chunk-EMSZVUYA.js +0 -29
  464. package/dist/cli/chunks/chunk-G6RDCCFV.js +0 -4
  465. package/dist/cli/chunks/chunk-HH4ED4F7.js +0 -744
  466. package/dist/cli/chunks/chunk-Q6I4SIUU.js +0 -65
  467. package/dist/cli/chunks/chunk-QGBGSQ2E.js +0 -14
  468. package/dist/cli/chunks/chunk-QRKTBSZT.js +0 -27
  469. package/dist/cli/chunks/chunk-SHRI7TKJ.js +0 -62
  470. package/dist/cli/chunks/chunk-TX2CHQD7.js +0 -2
  471. package/dist/cli/chunks/chunk-UGYM4U44.js +0 -2
  472. package/dist/cli/chunks/chunk-VY4U6DPO.js +0 -12
  473. package/dist/cli/chunks/chunk-WNTA4YKE.js +0 -14
  474. package/dist/cli/chunks/chunk-XHLYGXYE.js +0 -2
  475. package/dist/cli/chunks/client-KKRNPX4F.js +0 -2
  476. package/dist/cli/chunks/copilot-installer-BHPDSELY.js +0 -3
  477. package/dist/cli/chunks/core-handlers-47MPMED7.js +0 -2
  478. package/dist/cli/chunks/cross-domain-router-U6MBFHEC.js +0 -2
  479. package/dist/cli/chunks/daemon-AXLVPKVO.js +0 -18
  480. package/dist/cli/chunks/dream-76L6EEN7.js +0 -2
  481. package/dist/cli/chunks/embed-and-insert-pattern-B6MNHICW.js +0 -3
  482. package/dist/cli/chunks/experience-capture-middleware-SUFILYPW.js +0 -40
  483. package/dist/cli/chunks/file-discovery-VSFKZ3LJ.js +0 -2
  484. package/dist/cli/chunks/heartbeat-scheduler-NIK3KKEH.js +0 -2
  485. package/dist/cli/chunks/hnsw-adapter-WJG7LUJJ.js +0 -2
  486. package/dist/cli/chunks/hnsw-index-D6PRI5HC.js +0 -2
  487. package/dist/cli/chunks/hybrid-backend-RIUR3I7F.js +0 -2
  488. package/dist/cli/chunks/impact-analyzer-C36YYTJ5.js +0 -2
  489. package/dist/cli/chunks/init-wizard-JCKNGIGT.js +0 -2
  490. package/dist/cli/chunks/kernel-F7ILJTYD.js +0 -2
  491. package/dist/cli/chunks/knowledge-graph-VTXDBHB2.js +0 -2
  492. package/dist/cli/chunks/llm-router-service-TNOWQINA.js +0 -2
  493. package/dist/cli/chunks/load-test-FPVBK2EV.js +0 -2
  494. package/dist/cli/chunks/memory-backend-2QE7O67A.js +0 -2
  495. package/dist/cli/chunks/memory-handlers-X4CMVBXB.js +0 -2
  496. package/dist/cli/chunks/pattern-null-store-UI35ORHW.js +0 -2
  497. package/dist/cli/chunks/project-root-S7WDFTMU.js +0 -2
  498. package/dist/cli/chunks/protocol-executor-OPANXQVB.js +0 -2
  499. package/dist/cli/chunks/qe-reasoning-bank-3OTF4DYQ.js +0 -2
  500. package/dist/cli/chunks/queen-coordinator-WTYH4TAN.js +0 -2
  501. package/dist/cli/chunks/real-embeddings-DYIOLKQ3.js +0 -2
  502. package/dist/cli/chunks/router-DBBW4NC2.js +0 -2
  503. package/dist/cli/chunks/routing-feedback-W35QHCL4.js +0 -2
  504. package/dist/cli/chunks/rvf-dual-writer-X3NSL25Z.js +0 -2
  505. package/dist/cli/chunks/rvf-migration-adapter-TZR7GDOK.js +0 -2
  506. package/dist/cli/chunks/rvf-migration-coordinator-4ATTHGHD.js +0 -2
  507. package/dist/cli/chunks/rvf-native-adapter-HD25ZYV5.js +0 -2
  508. package/dist/cli/chunks/safe-db-ZS2QKANY.js +0 -2
  509. package/dist/cli/chunks/schedule-ZH6VNA32.js +0 -2
  510. package/dist/cli/chunks/scheduler-T6CD74B6.js +0 -2
  511. package/dist/cli/chunks/sqlite-persistence-47WU5EKZ.js +0 -2
  512. package/dist/cli/chunks/sync-3MUV6S5E.js +0 -2
  513. package/dist/cli/chunks/task-handler-74MZN2EO.js +0 -62
  514. package/dist/cli/chunks/test-O6FK3FVF.js +0 -34
  515. package/dist/cli/chunks/test-runner-process-2NPW3UDQ.js +0 -2
  516. package/dist/cli/chunks/token-bootstrap-TTRCECLP.js +0 -2
  517. package/dist/cli/chunks/tree-sitter-wasm-parser-RZAND65G.js +0 -2
  518. package/dist/cli/chunks/unified-memory-FZ5K2C7W.js +0 -2
  519. package/dist/cli/chunks/unified-memory-hnsw-VREWX56M.js +0 -2
  520. package/dist/cli/chunks/unified-persistence-YZGMKX6B.js +0 -2
  521. package/dist/cli/chunks/visual-security-GXGSFBVA.js +0 -2
  522. package/dist/cli/chunks/witness-chain-MRJKVCOW.js +0 -2
  523. package/dist/cli/chunks/witness-chain-WWHJKITG.js +0 -2
  524. package/dist/cli/chunks/witness-chain-repair-5SAXPETG.js +0 -2
  525. package/dist/cli/chunks/workflow-orchestrator-SG7DV72E.js +0 -2
  526. package/dist/cli/chunks/wrappers-5QFMCKXL.js +0 -2
@@ -16,6 +16,7 @@ import { createDomainFinding, } from '../../coordination/consensus/domain-findin
16
16
  // CQ-002: Base domain coordinator
17
17
  import { BaseDomainCoordinator, } from '../base-domain-coordinator.js';
18
18
  import { toError } from '../../shared/error-utils.js';
19
+ import { isPythonTestFile } from '../../shared/pytest-junit-report.js';
19
20
  import { createMinCutTestOptimizer, } from './services/mincut-test-optimizer.js';
20
21
  // ============================================================================
21
22
  // Coordinator Configuration
@@ -146,6 +147,8 @@ export class TestExecutionCoordinator extends BaseDomainCoordinator {
146
147
  });
147
148
  }
148
149
  const framework = request.framework ?? this.detectFramework(testsToRun);
150
+ // #1272: without an explicit framework, each runner project's config decides.
151
+ const frameworkFromConfig = request.framework === undefined;
149
152
  const workers = request.workers ?? Math.min(4, Math.max(1, testsToRun.length));
150
153
  // Batched runners own internal parallelism, so the timeout applies to the
151
154
  // whole discovered suite rather than one file.
@@ -157,17 +160,21 @@ export class TestExecutionCoordinator extends BaseDomainCoordinator {
157
160
  return this.executeParallel({
158
161
  testFiles: testsToRun,
159
162
  framework,
163
+ frameworkFromConfig,
160
164
  workers,
161
165
  timeout,
162
166
  retryCount: request.retryCount,
167
+ projectRoot: request.projectRoot,
163
168
  });
164
169
  }
165
170
  // Sequential execution
166
171
  return this.execute({
167
172
  testFiles: testsToRun,
168
173
  framework,
174
+ frameworkFromConfig,
169
175
  timeout,
170
176
  retryCount: request.retryCount,
177
+ projectRoot: request.projectRoot,
171
178
  });
172
179
  }
173
180
  /**
@@ -176,7 +183,7 @@ export class TestExecutionCoordinator extends BaseDomainCoordinator {
176
183
  * as passed and flaky in the run's own counts (#1170). When that changes
177
184
  * the outcome, the run is stored again with it (#1176).
178
185
  */
179
- async retryFailures(run, retryCount, testFiles) {
186
+ async retryFailures(run, retryCount, testFiles, projectRoot) {
180
187
  if (!retryCount || retryCount <= 0)
181
188
  return;
182
189
  if (run.failed === 0) {
@@ -188,6 +195,7 @@ export class TestExecutionCoordinator extends BaseDomainCoordinator {
188
195
  failedTests: run.failedTests.map(t => t.testId),
189
196
  maxRetries: retryCount,
190
197
  backoff: 'exponential',
198
+ projectRoot,
191
199
  });
192
200
  if (!retried.success)
193
201
  return;
@@ -195,9 +203,13 @@ export class TestExecutionCoordinator extends BaseDomainCoordinator {
195
203
  await this.executor.recordFinalOutcome(run, testFiles);
196
204
  }
197
205
  /**
198
- * Detect test framework from file patterns and project configuration
206
+ * Fallback framework from file names. With no explicit framework, each
207
+ * runner project's own config still decides between jest and vitest (#1272),
208
+ * and Python files always run with pytest (#1248).
199
209
  */
200
210
  detectFramework(testFiles) {
211
+ if (testFiles.every(isPythonTestFile))
212
+ return 'pytest';
201
213
  // Check file patterns for common framework indicators
202
214
  const hasVitestPattern = testFiles.some(f => f.includes('.test.') || f.includes('.spec.'));
203
215
  const hasMochaPattern = testFiles.some(f => f.includes('_test.') || f.includes('.mocha.'));
@@ -206,7 +218,6 @@ export class TestExecutionCoordinator extends BaseDomainCoordinator {
206
218
  return 'vitest';
207
219
  if (hasMochaPattern)
208
220
  return 'mocha';
209
- // Could add project config detection here (vitest.config.ts, jest.config.js, etc.)
210
221
  return 'vitest';
211
222
  }
212
223
  /**
@@ -258,7 +269,7 @@ export class TestExecutionCoordinator extends BaseDomainCoordinator {
258
269
  // #1176: these first-attempt failures did happen; flaky analysis
259
270
  // records them even when a retry then passes.
260
271
  const firstAttemptFailures = [...result.value.failedTests];
261
- await this.retryFailures(result.value, request.retryCount, orderedTestFiles);
272
+ await this.retryFailures(result.value, request.retryCount, orderedTestFiles, request.projectRoot);
262
273
  // Record execution results for learning
263
274
  if (this.config.enablePrioritization && prioritizationResult) {
264
275
  await this.recordExecutionResults(runId, orderedTestFiles, result.value, prioritizationResult);
@@ -296,7 +307,7 @@ export class TestExecutionCoordinator extends BaseDomainCoordinator {
296
307
  if (this.config.infraHealing && result.value.failedTests.length > 0) {
297
308
  this.feedInfraHealingFromFailures(result.value.failedTests);
298
309
  // 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 });
310
+ const rerunResult = await this.attemptAutoRecoveryAndRerun(result.value.failedTests, request.framework, { timeout: request.timeout, env: request.env, retryCount: request.retryCount, projectRoot: request.projectRoot, frameworkFromConfig: request.frameworkFromConfig });
300
311
  if (rerunResult)
301
312
  return rerunResult;
302
313
  }
@@ -367,7 +378,7 @@ export class TestExecutionCoordinator extends BaseDomainCoordinator {
367
378
  this.activeRuns.delete(runId);
368
379
  if (result.success) {
369
380
  // #1176: retries finish before the run is recorded or announced.
370
- await this.retryFailures(result.value, request.retryCount, orderedTestFiles);
381
+ await this.retryFailures(result.value, request.retryCount, orderedTestFiles, request.projectRoot);
371
382
  // Record execution results for learning
372
383
  if (this.config.enablePrioritization && prioritizationResult) {
373
384
  await this.recordExecutionResults(runId, orderedTestFiles, result.value, prioritizationResult);
@@ -407,7 +418,7 @@ export class TestExecutionCoordinator extends BaseDomainCoordinator {
407
418
  if (this.config.infraHealing && result.value.failedTests.length > 0) {
408
419
  this.feedInfraHealingFromFailures(result.value.failedTests);
409
420
  // 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 });
421
+ const rerunResult = await this.attemptAutoRecoveryAndRerun(result.value.failedTests, request.framework, { timeout: request.timeout, env: request.env, retryCount: request.retryCount, projectRoot: request.projectRoot, frameworkFromConfig: request.frameworkFromConfig });
411
422
  if (rerunResult)
412
423
  return rerunResult;
413
424
  }
@@ -510,6 +521,7 @@ export class TestExecutionCoordinator extends BaseDomainCoordinator {
510
521
  failedTests: testsToRetry,
511
522
  maxRetries: request.maxRetries,
512
523
  backoff: request.backoff ?? 'exponential',
524
+ projectRoot: request.projectRoot,
513
525
  onRetry: (testId, attempt) => {
514
526
  // Could publish individual retry events here
515
527
  void testId;
@@ -627,9 +639,11 @@ export class TestExecutionCoordinator extends BaseDomainCoordinator {
627
639
  return this.execute({
628
640
  testFiles: [...filesToRerun],
629
641
  framework,
642
+ frameworkFromConfig: originalRequest.frameworkFromConfig,
630
643
  timeout: originalRequest.timeout,
631
644
  env: originalRequest.env,
632
645
  retryCount: originalRequest.retryCount,
646
+ projectRoot: originalRequest.projectRoot,
633
647
  });
634
648
  }
635
649
  /**
@@ -47,10 +47,20 @@ 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[];
53
58
  framework: string;
59
+ /**
60
+ * #1272: the caller named no framework, so each runner project's own config
61
+ * chooses jest or vitest; `framework` is used where it names neither.
62
+ */
63
+ frameworkFromConfig?: boolean;
54
64
  timeout?: number;
55
65
  env?: Record<string, string>;
56
66
  reporters?: string[];
@@ -59,6 +69,11 @@ export interface IExecuteTestsRequest {
59
69
  * or TestRunCompleted is published, so both carry the final outcome.
60
70
  */
61
71
  retryCount?: number;
72
+ /**
73
+ * #1247: directory to run every file from, already checked to be inside the
74
+ * project. When omitted, each file runs from its nearest runner project.
75
+ */
76
+ projectRoot?: string;
62
77
  }
63
78
  export interface IParallelExecutionRequest extends IExecuteTestsRequest {
64
79
  workers: number;
@@ -173,6 +188,8 @@ export interface IRetryRequest {
173
188
  failedTests: string[];
174
189
  maxRetries: number;
175
190
  backoff?: 'linear' | 'exponential';
191
+ /** #1247: the run's explicit projectRoot; retries run from it too. */
192
+ projectRoot?: string;
176
193
  }
177
194
  export interface IRetryResult {
178
195
  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,22 +66,27 @@ 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) {
77
80
  // Simple request format
78
81
  const request = {
79
82
  testFiles,
83
+ // #1272: an explicit framework wins over the project's config.
84
+ framework: typeof payload.framework === 'string' ? payload.framework : undefined,
80
85
  parallel: payload.parallel,
81
86
  retryCount: payload.retryCount,
82
87
  timeout: payload.timeout,
83
88
  workers: payload.workers,
89
+ projectRoot,
84
90
  };
85
91
  return this.coordinator.runTests(request);
86
92
  }
@@ -39,7 +39,8 @@ export interface FlakyDetectorConfig {
39
39
  */
40
40
  testRunnerArgs: string[];
41
41
  /**
42
- * Working directory for test execution.
42
+ * Working directory for test execution. When omitted, each file runs from
43
+ * its nearest runner project, as test_execute_parallel does (#1247, #1272).
43
44
  */
44
45
  cwd?: string;
45
46
  /**
@@ -112,6 +113,13 @@ export declare class FlakyDetectorService implements IFlakyTestDetector {
112
113
  /** Cache TTL for analysis results (1 hour) */
113
114
  private readonly ANALYSIS_CACHE_TTL_MS;
114
115
  constructor(memory: MemoryBackend, config?: Partial<FlakyDetectorConfig>);
116
+ /** True when the caller chose the runner command; else the project's config picks it. */
117
+ private readonly runnerConfigured;
118
+ /**
119
+ * #1272: the runner command for a run started in `cwd`. A configured command
120
+ * is used as given; the default runs Jest in a project configured for Jest.
121
+ */
122
+ private runnerCommandIn;
115
123
  /**
116
124
  * Detect flaky tests by running them multiple times
117
125
  */
@@ -14,6 +14,7 @@ import { safeJsonParse } from '../../../shared/safe-json.js';
14
14
  import { getTestRunnerExecutionError } from '../../../shared/test-runner-verdict.js';
15
15
  import { createVitestJsonReport, needsVitestJsonReportFile } from '../../../shared/vitest-json-report.js';
16
16
  import { isJestCommand, jestExactPathPattern, runnerFilePath } from '../../../shared/test-runner-args.js';
17
+ import { runnerCwdFor, runnerFrameworkFor } from '../../../shared/test-runner-project.js';
17
18
  import { secureRandom } from '../../../shared/utils/crypto-random.js';
18
19
  import { redactFailureText } from './runner-test-cases.js';
19
20
  const DEFAULT_FLAKY_CONFIG = {
@@ -41,6 +42,19 @@ export class FlakyDetectorService {
41
42
  constructor(memory, config = {}) {
42
43
  this.memory = memory;
43
44
  this.config = { ...DEFAULT_FLAKY_CONFIG, ...config };
45
+ this.runnerConfigured = config.testRunner !== undefined || config.testRunnerArgs !== undefined;
46
+ }
47
+ /** True when the caller chose the runner command; else the project's config picks it. */
48
+ runnerConfigured;
49
+ /**
50
+ * #1272: the runner command for a run started in `cwd`. A configured command
51
+ * is used as given; the default runs Jest in a project configured for Jest.
52
+ */
53
+ runnerCommandIn(cwd) {
54
+ if (!this.runnerConfigured && runnerFrameworkFor(cwd) === 'jest') {
55
+ return { runner: 'npx', runnerArgs: ['jest', '--json'] };
56
+ }
57
+ return { runner: this.config.testRunner, runnerArgs: this.config.testRunnerArgs };
44
58
  }
45
59
  /**
46
60
  * Detect flaky tests by running them multiple times
@@ -259,20 +273,24 @@ export class FlakyDetectorService {
259
273
  const runId = uuidv4();
260
274
  const startTime = Date.now();
261
275
  return new Promise((resolve, reject) => {
262
- const cwd = this.config.cwd ?? process.cwd();
276
+ const fileBase = this.config.cwd ?? process.cwd();
277
+ // #1272: a runner loads the config of the directory it starts in, so the
278
+ // file runs from its own runner project (the file path stays absolute).
279
+ const cwd = this.config.cwd ?? runnerCwdFor(file);
280
+ const { runner, runnerArgs } = this.runnerCommandIn(cwd);
263
281
  // #909: pass an absolute path (never read as a flag); Jest reads it as a
264
282
  // regex, so escape and anchor it to select exactly this file.
265
- const fileArg = isJestCommand([this.config.testRunner, ...this.config.testRunnerArgs])
266
- ? jestExactPathPattern(file, cwd)
267
- : runnerFilePath(file, cwd);
268
- const baseArgs = [...this.config.testRunnerArgs, fileArg];
283
+ const fileArg = isJestCommand([runner, ...runnerArgs])
284
+ ? jestExactPathPattern(file, fileBase)
285
+ : runnerFilePath(file, fileBase);
286
+ const baseArgs = [...runnerArgs, fileArg];
269
287
  // Vitest 5 writes --reporter=json output to a file, not stdout. Detect
270
288
  // Vitest from the runner command too (testRunner: 'vitest', args: ['run', ...]).
271
- const report = needsVitestJsonReportFile([this.config.testRunner, ...baseArgs])
289
+ const report = needsVitestJsonReportFile([runner, ...baseArgs])
272
290
  ? createVitestJsonReport()
273
291
  : undefined;
274
292
  const args = report ? [...baseArgs, ...report.args] : baseArgs;
275
- const child = spawn(this.config.testRunner, args, {
293
+ const child = spawn(runner, args, {
276
294
  cwd,
277
295
  env: { ...process.env, ...this.config.env },
278
296
  stdio: ['ignore', 'pipe', 'pipe'],
@@ -295,7 +313,7 @@ export class FlakyDetectorService {
295
313
  clearTimeout(timeout);
296
314
  report?.cleanup();
297
315
  reject(new Error(`Failed to execute test runner: ${error.message}. ` +
298
- `Ensure ${this.config.testRunner} is installed and accessible.`));
316
+ `Ensure ${[runner, ...runnerArgs.slice(0, 1)].join(' ')} is installed and accessible.`));
299
317
  });
300
318
  child.on('close', (code) => {
301
319
  clearTimeout(timeout);
@@ -8,7 +8,7 @@ import { MemoryBackend } from '../../../kernel/interfaces';
8
8
  /**
9
9
  * Supported test runners for retry execution
10
10
  */
11
- export type TestRunner = 'vitest' | 'jest' | 'mocha' | 'auto';
11
+ export type TestRunner = 'vitest' | 'jest' | 'mocha' | 'pytest' | 'auto';
12
12
  /**
13
13
  * Configuration for the retry handler service
14
14
  */
@@ -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;
@@ -157,6 +159,12 @@ export declare class RetryHandlerService implements IRetryHandler {
157
159
  * Spawn a test process and parse the result
158
160
  */
159
161
  private spawnTestProcess;
162
+ /**
163
+ * #1248: a pytest retry passes only when its JUnit report shows the test
164
+ * passed. A node id pytest cannot find (exit code 4) or no collected test
165
+ * (exit code 5) reran nothing.
166
+ */
167
+ private parsePytestRetry;
160
168
  /**
161
169
  * Parse test runner output to determine pass/fail status
162
170
  */
@@ -6,6 +6,8 @@ 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';
10
+ import { createPytestJunitReport, isPythonTestFile, parsePytestJunitXml, pytestCommand, PYTEST_ENV, } from '../../../shared/pytest-junit-report.js';
9
11
  import { existsSync, readFileSync, realpathSync } from 'node:fs';
10
12
  import { resolve as resolvePath } from 'node:path';
11
13
  import { ok, err } from '../../../shared/types/index.js';
@@ -92,7 +94,7 @@ export class RetryHandlerService {
92
94
  * Execute failed tests with retry logic
93
95
  */
94
96
  async executeWithRetry(request) {
95
- const { runId, failedTests, maxRetries, backoff, baseDelay = 1000, maxDelay = 30000, onRetry, } = request;
97
+ const { runId, failedTests, maxRetries, backoff, baseDelay = 1000, maxDelay = 30000, onRetry, projectRoot, } = request;
96
98
  try {
97
99
  const stats = {
98
100
  runId,
@@ -108,7 +110,7 @@ export class RetryHandlerService {
108
110
  const unmatched = [];
109
111
  const tests = [];
110
112
  for (const test of failedTests) {
111
- const result = await this.retryTest(test, maxRetries, backoff, baseDelay, maxDelay, onRetry);
113
+ const result = await this.retryTest(test, maxRetries, backoff, baseDelay, maxDelay, onRetry, projectRoot);
112
114
  stats.totalRetries += result.attempts;
113
115
  if (result.passed) {
114
116
  nowPassing.push(test.testId);
@@ -228,7 +230,7 @@ export class RetryHandlerService {
228
230
  return false;
229
231
  }
230
232
  }
231
- async retryTest(test, maxRetries, backoff, baseDelay, maxDelay, onRetry) {
233
+ async retryTest(test, maxRetries, backoff, baseDelay, maxDelay, onRetry, projectRoot) {
232
234
  let attempts = 0;
233
235
  // #1122: the final error is persisted in retry-history, so keep it redacted.
234
236
  let lastError = redactFailureText(test.error);
@@ -246,7 +248,7 @@ export class RetryHandlerService {
246
248
  onRetry(test.testId, attempts + 1);
247
249
  }
248
250
  // Execute test (simulated - in real implementation, would run actual test)
249
- const result = await this.executeTest(test);
251
+ const result = await this.executeTest(test, projectRoot);
250
252
  // #1141: a filter that selected no test reran nothing. Report that
251
253
  // instead of counting it as a retry, and stop: another attempt would
252
254
  // select nothing again.
@@ -272,7 +274,7 @@ export class RetryHandlerService {
272
274
  finalError: lastError,
273
275
  };
274
276
  }
275
- async executeTest(test) {
277
+ async executeTest(test, projectRoot) {
276
278
  // In simulation mode (for unit testing), use random behavior
277
279
  if (this.config.simulateForTesting) {
278
280
  const passOnRetry = secureRandom() < this.config.simulatedRetrySuccessRate;
@@ -282,12 +284,12 @@ export class RetryHandlerService {
282
284
  };
283
285
  }
284
286
  // In production mode, actually execute the test
285
- return this.executeRealTest(test);
287
+ return this.executeRealTest(test, projectRoot);
286
288
  }
287
289
  /**
288
290
  * Execute a real test using the configured test runner
289
291
  */
290
- async executeRealTest(test) {
292
+ async executeRealTest(test, projectRoot) {
291
293
  const testFile = test.file;
292
294
  const testName = test.testName;
293
295
  const cwd = this.config.cwd ?? process.cwd();
@@ -295,8 +297,12 @@ export class RetryHandlerService {
295
297
  if (!existsSync(testFile)) {
296
298
  throw new Error(`Test file not found: ${testFile}. Cannot retry non-existent test file.`);
297
299
  }
298
- // Detect or use configured test runner
299
- const runner = await this.detectTestRunner(cwd);
300
+ // #1247: retry from the same directory as the first run: the caller's
301
+ // projectRoot, else a configured directory, else the file's runner
302
+ // project. The file path stays relative to `cwd`.
303
+ const runCwd = projectRoot ?? this.config.cwd ?? runnerCwdFor(testFile);
304
+ // Detect or use configured test runner. #1248: a Python file is pytest's.
305
+ const runner = isPythonTestFile(testFile) ? 'pytest' : await this.detectTestRunner(runCwd);
300
306
  if (!runner) {
301
307
  throw new Error(`No test runner detected or configured. Install vitest, jest, or mocha, ` +
302
308
  `or configure testRunner in RetryHandlerConfig. Cannot execute retry for: ${testFile}`);
@@ -304,7 +310,7 @@ export class RetryHandlerService {
304
310
  // Build command based on runner
305
311
  const { command, args, report } = this.buildTestCommand(runner, testFile, testName, cwd);
306
312
  // Execute the test
307
- return this.spawnTestProcess(command, args, cwd, report, runner === 'vitest' ? testFile : undefined);
313
+ return this.spawnTestProcess(command, args, runCwd, report, runner === 'vitest' ? testFile : undefined, runner === 'pytest' ? (code, reportText, output) => this.parsePytestRetry(code, reportText, output) : undefined);
308
314
  }
309
315
  /**
310
316
  * Detect which test runner is available in the project
@@ -410,6 +416,13 @@ export class RetryHandlerService {
410
416
  mochaArgs.push(nameFilterArg('mocha', testName));
411
417
  return { command: npx, args: mochaArgs };
412
418
  }
419
+ case 'pytest':
420
+ // #1248: the failed test's node id is <file>::<name> (name from the run).
421
+ {
422
+ const report = createPytestJunitReport();
423
+ const file = runnerFilePath(testFile, cwd);
424
+ return { ...pytestCommand([filterByName ? `${file}::${testName}` : file], report.path), report };
425
+ }
413
426
  default:
414
427
  throw new Error(`Unsupported test runner: ${runner}`);
415
428
  }
@@ -417,7 +430,7 @@ export class RetryHandlerService {
417
430
  /**
418
431
  * Spawn a test process and parse the result
419
432
  */
420
- spawnTestProcess(command, args, cwd, report, targetFile) {
433
+ spawnTestProcess(command, args, cwd, report, targetFile, parseReport) {
421
434
  return new Promise((resolve, reject) => {
422
435
  const timeout = this.config.testTimeout;
423
436
  let stdout = '';
@@ -434,7 +447,7 @@ export class RetryHandlerService {
434
447
  const proc = spawn(command, args, {
435
448
  cwd,
436
449
  detached: process.platform !== 'win32',
437
- env: { ...process.env, FORCE_COLOR: '0', CI: 'true' },
450
+ env: { ...process.env, FORCE_COLOR: '0', CI: 'true', ...PYTEST_ENV },
438
451
  });
439
452
  const untrackExit = trackTestRunnerExit(proc);
440
453
  const timeoutHandle = setTimeout(() => {
@@ -465,6 +478,10 @@ export class RetryHandlerService {
465
478
  // report to the --outputFile; read it back rather than trusting stdout).
466
479
  try {
467
480
  const reportText = report ? report.read(stdout) : stdout;
481
+ if (parseReport) {
482
+ settle(resolve, parseReport(code, reportText, `${stderr}\n${stdout}`.trim()));
483
+ return;
484
+ }
468
485
  if (reportText === undefined) {
469
486
  throw new Error('The current Vitest JSON report is missing for the retry run.');
470
487
  }
@@ -484,6 +501,33 @@ export class RetryHandlerService {
484
501
  });
485
502
  });
486
503
  }
504
+ /**
505
+ * #1248: a pytest retry passes only when its JUnit report shows the test
506
+ * passed. A node id pytest cannot find (exit code 4) or no collected test
507
+ * (exit code 5) reran nothing.
508
+ */
509
+ parsePytestRetry(exitCode, report, output) {
510
+ const failure = (text) => ({
511
+ passed: false,
512
+ error: redactFailureText(text || `pytest exited with code ${exitCode}`).substring(0, 1000),
513
+ });
514
+ if (exitCode === 4 || exitCode === 5)
515
+ return UNMATCHED;
516
+ if (report === undefined)
517
+ return failure(output);
518
+ try {
519
+ const cases = parsePytestJunitXml(report);
520
+ if (cases.length === 0)
521
+ return UNMATCHED;
522
+ const failed = cases.find(c => c.status === 'failed' || c.status === 'error');
523
+ if (exitCode === 0 && !failed && cases.some(c => c.status === 'passed'))
524
+ return { passed: true };
525
+ return failure(failed ? [failed.message, failed.details].filter(Boolean).join('\n') : output);
526
+ }
527
+ catch {
528
+ return failure(output);
529
+ }
530
+ }
487
531
  /**
488
532
  * Parse test runner output to determine pass/fail status
489
533
  */
@@ -6,6 +6,8 @@
6
6
  * derived from aggregate counts.
7
7
  */
8
8
  import type { ITestCaseResult } from '../interfaces';
9
+ /** A test case's failure text: redacted (#1122) and capped. */
10
+ export declare function testCaseFailureMessage(text: string): string | undefined;
9
11
  /**
10
12
  * #1122: failure text goes back over MCP and into saved results, so
11
13
  * credential-shaped values (e.g. a connection string) are redacted first.
@@ -12,10 +12,14 @@ const MAX_FAILURE_MESSAGE_LENGTH = 4000;
12
12
  function failureMessageOf(assertion) {
13
13
  if (!Array.isArray(assertion.failureMessages))
14
14
  return undefined;
15
- const joined = assertion.failureMessages.filter((m) => typeof m === 'string').join('\n').trim();
16
- if (!joined)
15
+ return testCaseFailureMessage(assertion.failureMessages.filter((m) => typeof m === 'string').join('\n'));
16
+ }
17
+ /** A test case's failure text: redacted (#1122) and capped. */
18
+ export function testCaseFailureMessage(text) {
19
+ const trimmed = text.trim();
20
+ if (!trimmed)
17
21
  return undefined;
18
- const message = redactFailureText(joined);
22
+ const message = redactFailureText(trimmed);
19
23
  return message.length > MAX_FAILURE_MESSAGE_LENGTH
20
24
  ? `${message.slice(0, MAX_FAILURE_MESSAGE_LENGTH)}… [truncated]`
21
25
  : message;
@@ -113,8 +113,9 @@ export declare class TestExecutorService implements ITestExecutionService {
113
113
  private mergeSequentialCoverage;
114
114
  private executeTestFile;
115
115
  private executeTestFiles;
116
+ private executeProjectFiles;
116
117
  /**
117
- * Spawn actual test runner process (vitest, jest, mocha)
118
+ * Spawn actual test runner process (vitest, jest, mocha, node:test, pytest)
118
119
  */
119
120
  private spawnTestRunner;
120
121
  /**
@@ -125,6 +126,10 @@ export declare class TestExecutorService implements ITestExecutionService {
125
126
  * Parse test runner output to extract results
126
127
  */
127
128
  private parseTestOutput;
129
+ /**
130
+ * #1248: a pytest run from its JUnit report (undefined when pytest wrote none).
131
+ */
132
+ private parsePytestOutput;
128
133
  /**
129
134
  * Parse the TAP or spec summary emitted by Node's built-in test runner.
130
135
  */