agentic-qe 3.15.16 → 3.15.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (539) hide show
  1. package/.claude/helpers/brain-checkpoint.cjs +107 -10
  2. package/.claude/skills/agentic-quality-engineering/SKILL.md +67 -44
  3. package/.claude/skills/brutal-honesty-review/SKILL.md +12 -7
  4. package/.claude/skills/brutal-honesty-review/evals/brutal-honesty-review.yaml +120 -0
  5. package/.claude/skills/brutal-honesty-review/schemas/output.json +9 -3
  6. package/.claude/skills/code-review-quality/SKILL.md +2 -2
  7. package/.claude/skills/holistic-testing-pact/SKILL.md +11 -11
  8. package/.claude/skills/sherlock-review/SKILL.md +4 -2
  9. package/.claude/skills/sherlock-review/evals/sherlock-review.yaml +124 -0
  10. package/.claude/skills/skills-manifest.json +1 -1
  11. package/.claude/skills/technical-writing/SKILL.md +12 -6
  12. package/.claude/skills/technical-writing/evals/technical-writing.yaml +96 -0
  13. package/.opencode/skills/qe-agentic-quality-engineering.yaml +2 -2
  14. package/.opencode/skills/qe-holistic-testing-pact.yaml +2 -2
  15. package/CHANGELOG.md +201 -0
  16. package/assets/skills/agentic-quality-engineering/SKILL.md +67 -44
  17. package/assets/skills/brutal-honesty-review/SKILL.md +12 -8
  18. package/assets/skills/brutal-honesty-review/evals/brutal-honesty-review.yaml +120 -0
  19. package/assets/skills/brutal-honesty-review/schemas/output.json +9 -3
  20. package/assets/skills/code-review-quality/SKILL.md +2 -2
  21. package/assets/skills/holistic-testing-pact/SKILL.md +11 -11
  22. package/assets/skills/sherlock-review/SKILL.md +4 -3
  23. package/assets/skills/sherlock-review/evals/sherlock-review.yaml +124 -0
  24. package/assets/skills/skills-manifest.json +1 -1
  25. package/assets/skills/technical-writing/SKILL.md +12 -6
  26. package/assets/skills/technical-writing/evals/technical-writing.yaml +96 -0
  27. package/dist/cli/brain-commands.d.ts +5 -0
  28. package/dist/cli/brain-commands.js +4 -0
  29. package/dist/cli/bundle.js +6 -6
  30. package/dist/cli/chunks/adapter-WRSDXLOT.js +2 -0
  31. package/dist/cli/chunks/{agent-booster-wasm-45NWEKVS.js → agent-booster-wasm-UFNJNF3M.js} +2 -2
  32. package/dist/cli/chunks/{agent-handler-LVHMYFEF.js → agent-handler-EAYVRJXN.js} +2 -2
  33. package/dist/cli/chunks/{agent-memory-branch-YDWOJFEQ.js → agent-memory-branch-M65C6WAQ.js} +2 -2
  34. package/dist/cli/chunks/aqe-learning-engine-O6NJBCCM.js +2 -0
  35. package/dist/cli/chunks/{arena-ELDZH3CZ.js → arena-2GDICP6R.js} +4 -4
  36. package/dist/cli/chunks/{arena-CZKHXDDS.js → arena-CG3X67OE.js} +2 -2
  37. package/dist/cli/chunks/{audit-5MT4T47Z.js → audit-F4FSPJPL.js} +3 -3
  38. package/dist/cli/chunks/base-J2FXOE77.js +2 -0
  39. package/dist/cli/chunks/{better-sqlite3-6TGYPC2B.js → better-sqlite3-2MCFXW4J.js} +2 -2
  40. package/dist/cli/chunks/brain-handler-WGTJNYNB.js +95 -0
  41. package/dist/cli/chunks/{branch-enumerator-WVILM4SO.js → branch-enumerator-KL7C535H.js} +2 -2
  42. package/dist/cli/chunks/{browser-RX5ALU3H.js → browser-SJEXDVHS.js} +2 -2
  43. package/dist/cli/chunks/browser-workflow-LXGER6ZD.js +2 -0
  44. package/dist/cli/chunks/{chunk-2H4XH6FT.js → chunk-244RKAEP.js} +2 -2
  45. package/dist/cli/chunks/{chunk-SI6DPU5D.js → chunk-27TUMXPD.js} +1 -1
  46. package/dist/cli/chunks/{chunk-YNMJEDN5.js → chunk-2MBYDPCP.js} +2 -2
  47. package/dist/cli/chunks/{chunk-24QHCVX6.js → chunk-2Q6DTBMT.js} +1 -1
  48. package/dist/cli/chunks/{chunk-XWUWX7BV.js → chunk-355MI7RV.js} +13 -13
  49. package/dist/cli/chunks/{chunk-NQXXI77K.js → chunk-3LX5OKBD.js} +2 -2
  50. package/dist/cli/chunks/{chunk-63GMRQ25.js → chunk-3RPDKJGV.js} +1 -1
  51. package/dist/cli/chunks/chunk-3YMIT73A.js +4 -0
  52. package/dist/cli/chunks/{chunk-P3EYRILV.js → chunk-43KUVBSU.js} +2 -2
  53. package/dist/cli/chunks/chunk-477FKXSS.js +2 -0
  54. package/dist/cli/chunks/{chunk-HGWXF45W.js → chunk-4BIMTRRX.js} +1 -1
  55. package/dist/cli/chunks/{chunk-SSUAAX3F.js → chunk-4CVNVBX5.js} +2 -2
  56. package/dist/cli/chunks/{chunk-5V3TI2LG.js → chunk-4HL3SD4A.js} +1 -1
  57. package/dist/cli/chunks/{chunk-KKU2QGSJ.js → chunk-4PEG4DU2.js} +2 -2
  58. package/dist/cli/chunks/{chunk-J4ELZNLY.js → chunk-4QSQKFED.js} +2 -2
  59. package/dist/cli/chunks/chunk-53ZBETYR.js +16 -0
  60. package/dist/cli/chunks/{chunk-7TE5ONQQ.js → chunk-544KDWL4.js} +1 -1
  61. package/dist/cli/chunks/chunk-54RCGMLB.js +8 -0
  62. package/dist/cli/chunks/{chunk-KU2AUFGX.js → chunk-5AGXIZQ5.js} +2 -2
  63. package/dist/cli/chunks/{chunk-LQLPB2T6.js → chunk-5M24X6W7.js} +2 -2
  64. package/dist/cli/chunks/{chunk-YU2BDRSD.js → chunk-5O5T4LEU.js} +1 -1
  65. package/dist/cli/chunks/{chunk-NAEWCFQT.js → chunk-5RFXX4IF.js} +2 -2
  66. package/dist/cli/chunks/{chunk-MD43XRX5.js → chunk-62MLAQRJ.js} +1 -1
  67. package/dist/cli/chunks/{chunk-PEQDY4BO.js → chunk-6D6TGL2E.js} +2 -2
  68. package/dist/cli/chunks/{chunk-IOYG4VFL.js → chunk-6IHZDSDL.js} +2 -2
  69. package/dist/cli/chunks/{chunk-C5FP5GW3.js → chunk-6P3Y45QL.js} +2 -2
  70. package/dist/cli/chunks/{chunk-4LQFBY5L.js → chunk-6TEVM3X3.js} +10 -10
  71. package/dist/cli/chunks/{chunk-YPBSUGMI.js → chunk-7XTUKKRA.js} +1 -1
  72. package/dist/cli/chunks/chunk-A3GDX6UF.js +2 -0
  73. package/dist/cli/chunks/{chunk-HLUXXCHF.js → chunk-A5YTKKNA.js} +1 -1
  74. package/dist/cli/chunks/{chunk-Y4PFUMOU.js → chunk-ADNGZAT2.js} +1 -1
  75. package/dist/cli/chunks/{chunk-KNSRL6NO.js → chunk-AWQAE3SW.js} +2 -2
  76. package/dist/cli/chunks/{chunk-BY5OF7OH.js → chunk-AXDBQFR4.js} +2 -2
  77. package/dist/cli/chunks/{chunk-525CFDUE.js → chunk-AXVD7O3F.js} +2 -2
  78. package/dist/cli/chunks/{chunk-JHQCRRJI.js → chunk-B52ULNYO.js} +2 -2
  79. package/dist/cli/chunks/chunk-B6S4FC7M.js +3 -0
  80. package/dist/cli/chunks/{chunk-AJMJNQMP.js → chunk-BDVFSMOQ.js} +1 -1
  81. package/dist/cli/chunks/{chunk-DXD6K2ZP.js → chunk-BGXXMX3Y.js} +2 -2
  82. package/dist/cli/chunks/{chunk-EK7OLYOZ.js → chunk-BKMQQY5T.js} +2 -2
  83. package/dist/cli/chunks/{chunk-VWPM27GU.js → chunk-BN2FROBQ.js} +2 -2
  84. package/dist/cli/chunks/{chunk-J7I6PABJ.js → chunk-BO6EQNOC.js} +2 -2
  85. package/dist/cli/chunks/{chunk-4D4DENG6.js → chunk-BOVAKCDC.js} +2 -2
  86. package/dist/cli/chunks/{chunk-ZFL436FN.js → chunk-BSXKZDKO.js} +2 -2
  87. package/dist/cli/chunks/{chunk-J442IZLE.js → chunk-C5QVJ5XQ.js} +1 -1
  88. package/dist/cli/chunks/{chunk-ZB3LEFYG.js → chunk-CFQLLF3D.js} +2 -2
  89. package/dist/cli/chunks/{chunk-UHEOGZLX.js → chunk-DUCVLT3F.js} +7 -7
  90. package/dist/cli/chunks/{chunk-TVGI32MB.js → chunk-E4RMJCGA.js} +3 -3
  91. package/dist/cli/chunks/{chunk-TIUKLYAI.js → chunk-EONDCWY4.js} +1 -1
  92. package/dist/cli/chunks/{chunk-ZJH5MU2I.js → chunk-F4AGNKL2.js} +2 -2
  93. package/dist/cli/chunks/{chunk-N7HL5PHH.js → chunk-F6YD3BOW.js} +1 -1
  94. package/dist/cli/chunks/{chunk-5VZL4UVN.js → chunk-FQRS7WVA.js} +2 -2
  95. package/dist/cli/chunks/{chunk-SHKOCGNK.js → chunk-FT24SSDG.js} +2 -2
  96. package/dist/cli/chunks/chunk-FV4YNSAJ.js +5 -0
  97. package/dist/cli/chunks/{chunk-KXCLACFG.js → chunk-FVDM3X42.js} +2 -2
  98. package/dist/cli/chunks/{chunk-32BPDLRZ.js → chunk-FVH7TXWU.js} +2 -2
  99. package/dist/cli/chunks/{chunk-72XSEQMW.js → chunk-FWR5QY37.js} +2 -2
  100. package/dist/cli/chunks/chunk-FYINK2B7.js +6 -0
  101. package/dist/cli/chunks/{chunk-5JZRZI4S.js → chunk-GGISVPOZ.js} +2 -2
  102. package/dist/cli/chunks/{chunk-5LAVKGLH.js → chunk-GPIJIZJQ.js} +2 -2
  103. package/dist/cli/chunks/{chunk-5QO3R3TU.js → chunk-GXEVOT5F.js} +2 -2
  104. package/dist/cli/chunks/{chunk-IHRXZZQM.js → chunk-GZ4VB5RI.js} +1 -1
  105. package/dist/cli/chunks/chunk-HBDSCYSK.js +2 -0
  106. package/dist/cli/chunks/{chunk-GSKMOPL7.js → chunk-HGG4HR7C.js} +2 -2
  107. package/dist/cli/chunks/{chunk-AR67RJPY.js → chunk-HSCKWWO2.js} +2 -2
  108. package/dist/cli/chunks/{chunk-6XXZDV2C.js → chunk-HSQ3GUYJ.js} +2 -2
  109. package/dist/cli/chunks/{chunk-AAMLQ2LF.js → chunk-HZQBW5EM.js} +3 -3
  110. package/dist/cli/chunks/{chunk-O5W3FIO6.js → chunk-IGIYANVT.js} +2 -2
  111. package/dist/cli/chunks/{chunk-C6D5AHBO.js → chunk-IPWMSXBF.js} +2 -2
  112. package/dist/cli/chunks/{chunk-NDJ7P2EP.js → chunk-IWVNC7VY.js} +1 -1
  113. package/dist/cli/chunks/{chunk-FDDC72IA.js → chunk-IZODXKZD.js} +2 -2
  114. package/dist/cli/chunks/{chunk-NO3IV5Q5.js → chunk-J2MT2OJV.js} +1 -1
  115. package/dist/cli/chunks/{chunk-GQ6TUIKY.js → chunk-JKIJVVSP.js} +1 -1
  116. package/dist/cli/chunks/{chunk-LE4QJREF.js → chunk-JMRDT2XK.js} +1 -1
  117. package/dist/cli/chunks/{chunk-2YZ4G6NW.js → chunk-JR2UMTKG.js} +1 -1
  118. package/dist/cli/chunks/{chunk-RJIEG3NA.js → chunk-K6CH4CFF.js} +2 -2
  119. package/dist/cli/chunks/{chunk-5NNNEWLS.js → chunk-K7KW5QB5.js} +81 -88
  120. package/dist/cli/chunks/chunk-KFCQP434.js +2 -0
  121. package/dist/cli/chunks/{chunk-A5GBXCP5.js → chunk-KH4T6STG.js} +2 -2
  122. package/dist/cli/chunks/{chunk-VMDFFTCK.js → chunk-KJBYZO57.js} +1 -1
  123. package/dist/cli/chunks/{chunk-GJYHWYXR.js → chunk-KP4OKOKV.js} +2 -2
  124. package/dist/cli/chunks/chunk-L2MBKVSE.js +2 -0
  125. package/dist/cli/chunks/{chunk-XIQW7EFL.js → chunk-L3IPUIT3.js} +2 -2
  126. package/dist/cli/chunks/{chunk-W5HQUIML.js → chunk-L7PSU2YN.js} +2 -2
  127. package/dist/cli/chunks/{chunk-6DPYNAOK.js → chunk-LA3JPGQA.js} +2 -2
  128. package/dist/cli/chunks/{chunk-5PBLPQ5T.js → chunk-LC2QRN7V.js} +14 -13
  129. package/dist/cli/chunks/{chunk-SSYAQZXA.js → chunk-LHY7TMTM.js} +2 -2
  130. package/dist/cli/chunks/{chunk-QQWBWEJS.js → chunk-LLQ2UMF6.js} +3 -3
  131. package/dist/cli/chunks/{chunk-DTMAS2GB.js → chunk-LOJ7OO6W.js} +2 -2
  132. package/dist/cli/chunks/{chunk-32GN3JKR.js → chunk-LPUSH3VF.js} +1 -1
  133. package/dist/cli/chunks/{chunk-SDLWKRVL.js → chunk-LSEC2BU7.js} +2 -2
  134. package/dist/cli/chunks/{chunk-IOKYCMTJ.js → chunk-LTGB7OIU.js} +2 -2
  135. package/dist/cli/chunks/{chunk-6ZBXSOX6.js → chunk-LUG7YNVZ.js} +2 -2
  136. package/dist/cli/chunks/{chunk-CAKMOVZ6.js → chunk-LWAFRYKE.js} +2 -2
  137. package/dist/cli/chunks/{chunk-FLNAW7C4.js → chunk-M24ZAZ4U.js} +2 -2
  138. package/dist/cli/chunks/{chunk-L2DWPVNJ.js → chunk-MKRKRXTX.js} +1 -1
  139. package/dist/cli/chunks/{chunk-YTHTQPWR.js → chunk-MNNLONAD.js} +1 -1
  140. package/dist/cli/chunks/{chunk-V5NHZV7S.js → chunk-MQM37KAR.js} +2 -2
  141. package/dist/cli/chunks/{chunk-PPUZWYUG.js → chunk-MSX2OHYT.js} +2 -2
  142. package/dist/cli/chunks/{chunk-YRAX7SFJ.js → chunk-MVYQRVLP.js} +2 -2
  143. package/dist/cli/chunks/{chunk-QVDCVD5D.js → chunk-MZC5WM2P.js} +2 -2
  144. package/dist/cli/chunks/{chunk-S75SOOZL.js → chunk-MZRBNBB3.js} +2 -2
  145. package/dist/cli/chunks/{chunk-FL64OUBA.js → chunk-N3KQU4UC.js} +2 -2
  146. package/dist/cli/chunks/{chunk-G5RHFBAY.js → chunk-NKU3FFM4.js} +2 -2
  147. package/dist/cli/chunks/chunk-O5EWFR76.js +2 -0
  148. package/dist/cli/chunks/{chunk-63ZKI4PX.js → chunk-O5RDHD5T.js} +2 -2
  149. package/dist/cli/chunks/chunk-O6UWIXME.js +3 -0
  150. package/dist/cli/chunks/{chunk-HCH4Y6XX.js → chunk-OA4EQDC4.js} +2 -2
  151. package/dist/cli/chunks/{chunk-QPEOLAAS.js → chunk-OBCXCRXK.js} +1 -1
  152. package/dist/cli/chunks/{chunk-6ICX3FEG.js → chunk-OHU5P25N.js} +22 -22
  153. package/dist/cli/chunks/{chunk-GFWHUQSF.js → chunk-OOSV2RIA.js} +2 -2
  154. package/dist/cli/chunks/{chunk-MO55CVMT.js → chunk-OW23N2Y5.js} +14 -14
  155. package/dist/cli/chunks/{chunk-M7WJCTG3.js → chunk-OXOO3YDL.js} +2 -2
  156. package/dist/cli/chunks/{chunk-KQYJ4VQ5.js → chunk-OYGKSSSI.js} +1 -1
  157. package/dist/cli/chunks/chunk-PGO46IIW.js +2 -0
  158. package/dist/cli/chunks/{chunk-NVEWF4JV.js → chunk-PZOYQHWS.js} +1 -1
  159. package/dist/cli/chunks/{chunk-IESR7TNB.js → chunk-Q2BZSG7Z.js} +2 -2
  160. package/dist/cli/chunks/{chunk-XIIQ5QTT.js → chunk-Q7V722K5.js} +2 -2
  161. package/dist/cli/chunks/{chunk-F742SZAX.js → chunk-QZU6M5IO.js} +2 -2
  162. package/dist/cli/chunks/{chunk-PINSJCM3.js → chunk-R55Y76SJ.js} +1 -1
  163. package/dist/cli/chunks/{chunk-5B5QPCNU.js → chunk-RMEQYJPU.js} +4 -4
  164. package/dist/cli/chunks/{chunk-ZQ2XW3IP.js → chunk-RTYXFXTI.js} +2 -2
  165. package/dist/cli/chunks/{chunk-DVYHMDFR.js → chunk-SJF3O4FX.js} +374 -371
  166. package/dist/cli/chunks/{chunk-AG2EWGXS.js → chunk-SOUS7Z2H.js} +2 -2
  167. package/dist/cli/chunks/{chunk-3HD7E6HN.js → chunk-SRVNR3R3.js} +2 -2
  168. package/dist/cli/chunks/{chunk-KITOPKRG.js → chunk-SU3SXMVG.js} +2 -2
  169. package/dist/cli/chunks/chunk-SWGPLXWW.js +32 -0
  170. package/dist/cli/chunks/{chunk-ZR2TKVXQ.js → chunk-TRB3EVH3.js} +2 -2
  171. package/dist/cli/chunks/{chunk-OCV2XEWQ.js → chunk-TVBDUMKT.js} +2 -2
  172. package/dist/cli/chunks/{chunk-IOQ6ZQ5W.js → chunk-TWTXPSFU.js} +1 -1
  173. package/dist/cli/chunks/{chunk-CJSHWQXP.js → chunk-ULYUVUL2.js} +2 -2
  174. package/dist/cli/chunks/{chunk-PHT5N7SC.js → chunk-UNTBVJ5X.js} +2 -2
  175. package/dist/cli/chunks/{chunk-LKTTUHLF.js → chunk-UQAA4PHU.js} +2 -2
  176. package/dist/cli/chunks/{chunk-SR52XP5F.js → chunk-UWSJVKTE.js} +1 -1
  177. package/dist/cli/chunks/{chunk-L6QSTQME.js → chunk-V2LJ54KP.js} +2 -2
  178. package/dist/cli/chunks/{chunk-FBDVGRSC.js → chunk-VCCTTKP3.js} +7 -7
  179. package/dist/cli/chunks/{chunk-YLMNVLDK.js → chunk-VEGUYUVS.js} +1 -1
  180. package/dist/cli/chunks/{chunk-ASEOFRIG.js → chunk-VUQPVWNK.js} +2 -2
  181. package/dist/cli/chunks/{chunk-VXFLJNCA.js → chunk-VVGUE2T2.js} +2 -2
  182. package/dist/cli/chunks/{chunk-4NFQLP6R.js → chunk-W5ASDHJQ.js} +1 -1
  183. package/dist/cli/chunks/{chunk-I7MQIM2U.js → chunk-WGXT5NWQ.js} +1 -1
  184. package/dist/cli/chunks/chunk-WJN3V7QB.js +7 -0
  185. package/dist/cli/chunks/chunk-WPCRQIIF.js +29 -0
  186. package/dist/cli/chunks/{chunk-SASBO5Y5.js → chunk-WQNLXUWA.js} +6 -6
  187. package/dist/cli/chunks/{chunk-5SPCGMBB.js → chunk-WZVRMKG2.js} +2 -2
  188. package/dist/cli/chunks/{chunk-MI5MFHRA.js → chunk-X27IUWTD.js} +2 -2
  189. package/dist/cli/chunks/{chunk-HJ6ZGVTB.js → chunk-X4B345B6.js} +2 -2
  190. package/dist/cli/chunks/{chunk-HVRRLYX6.js → chunk-X5I2Y4VO.js} +2 -2
  191. package/dist/cli/chunks/{chunk-SUDMM5SO.js → chunk-X7IQIFTS.js} +2 -2
  192. package/dist/cli/chunks/chunk-XJN3RKUD.js +3 -0
  193. package/dist/cli/chunks/{chunk-E3D4GPLP.js → chunk-XQMGXTHJ.js} +3 -3
  194. package/dist/cli/chunks/{chunk-67Z5R7RJ.js → chunk-XTSAMB2Q.js} +2 -2
  195. package/dist/cli/chunks/{chunk-KVF4NXGQ.js → chunk-XZLIF4O2.js} +2 -2
  196. package/dist/cli/chunks/{chunk-EA4YQVKS.js → chunk-Y4LSEOZ3.js} +1 -1
  197. package/dist/cli/chunks/{chunk-OAEE6JWQ.js → chunk-Y4YN2RXR.js} +2 -2
  198. package/dist/cli/chunks/{chunk-CEYSYSK5.js → chunk-YDI56L35.js} +2 -2
  199. package/dist/cli/chunks/{chunk-JDIYMZCQ.js → chunk-YFILS5D5.js} +2 -2
  200. package/dist/cli/chunks/{chunk-GAHNO6JJ.js → chunk-YISDX6WB.js} +2 -2
  201. package/dist/cli/chunks/{chunk-AGRV5B3T.js → chunk-YP2GHQSV.js} +2 -2
  202. package/dist/cli/chunks/{chunk-UNGBRZDK.js → chunk-YSX756AM.js} +4 -4
  203. package/dist/cli/chunks/{chunk-BEKDKVQT.js → chunk-YWANOASW.js} +2 -2
  204. package/dist/cli/chunks/{chunk-JQ3DYUMS.js → chunk-YYIJLG7S.js} +2 -2
  205. package/dist/cli/chunks/{chunk-CRPIYUTJ.js → chunk-Z7SD7LXM.js} +2 -2
  206. package/dist/cli/chunks/{chunk-U2A7NHZA.js → chunk-ZDWD73UF.js} +2 -2
  207. package/dist/cli/chunks/{chunk-WP4RETKG.js → chunk-ZFT3RLA4.js} +2 -2
  208. package/dist/cli/chunks/{chunk-VJCIEHEF.js → chunk-ZNTHX5G3.js} +1 -1
  209. package/dist/cli/chunks/{chunk-PF7RBAYL.js → chunk-ZS27R7VL.js} +2 -2
  210. package/dist/cli/chunks/{chunk-24OX5TQJ.js → chunk-ZXHHHR7K.js} +1 -1
  211. package/dist/cli/chunks/{ci-MFUR4CWV.js → ci-N5MOMNXH.js} +2 -2
  212. package/dist/cli/chunks/{ci-config-PNDLQ6XV.js → ci-config-6L2ROQCW.js} +2 -2
  213. package/dist/cli/chunks/{ci-output-PFZ4M7NC.js → ci-output-DSRBYEIK.js} +2 -2
  214. package/dist/cli/chunks/{circuit-breaker-5HH6NLZN.js → circuit-breaker-VRPTNBL7.js} +2 -2
  215. package/dist/cli/chunks/{claude-flow-setup-QCKYLGLC.js → claude-flow-setup-4YFG3FU5.js} +2 -2
  216. package/dist/cli/chunks/client-I3L6BKRQ.js +2 -0
  217. package/dist/cli/chunks/{cline-installer-EASVPFXR.js → cline-installer-7RGYJWGN.js} +2 -2
  218. package/dist/cli/chunks/{code-UJXDVYRK.js → code-ISC6NW2K.js} +3 -3
  219. package/dist/cli/chunks/{code-index-extractor-BZJ3UDP4.js → code-index-extractor-2FID75YV.js} +2 -2
  220. package/dist/cli/chunks/{codex-installer-XSQZUVOZ.js → codex-installer-DZ7OG6KM.js} +2 -2
  221. package/dist/cli/chunks/{completions-OWOOJFI2.js → completions-SM3LICWK.js} +2 -2
  222. package/dist/cli/chunks/{complexity-analyzer-KP5TOHDT.js → complexity-analyzer-ZWD2CTAD.js} +2 -2
  223. package/dist/cli/chunks/{continuedev-installer-IFKQXLHM.js → continuedev-installer-AGASOA26.js} +2 -2
  224. package/dist/cli/chunks/copilot-installer-CLPZYTQC.js +3 -0
  225. package/dist/cli/chunks/core-handlers-5EFOJ37H.js +2 -0
  226. package/dist/cli/chunks/{cost-tracker-MMDDNKZB.js → cost-tracker-7PIGQYDV.js} +2 -2
  227. package/dist/cli/chunks/{coverage-LUH2B7NT.js → coverage-T2GEBTYS.js} +9 -9
  228. package/dist/cli/chunks/cross-domain-router-65WJAKVD.js +2 -0
  229. package/dist/cli/chunks/{cursor-installer-4YLM5GWM.js → cursor-installer-KXBID4MB.js} +2 -2
  230. package/dist/cli/chunks/daemon-43MXIVH3.js +18 -0
  231. package/dist/cli/chunks/{daemon-MZKVM4CJ.js → daemon-VAMJLQJ5.js} +3 -3
  232. package/dist/cli/chunks/{dag-attention-scheduler-X4CYW665.js → dag-attention-scheduler-UBP4VHTA.js} +2 -2
  233. package/dist/cli/chunks/{detect-7BM2XINO.js → detect-QWFIQRKI.js} +2 -2
  234. package/dist/cli/chunks/{dist-node-Y5APLEYB.js → dist-node-I2GICS3W.js} +2 -2
  235. package/dist/cli/chunks/{domain-handler-X3ZRJNAH.js → domain-handler-Z66ISB2A.js} +2 -2
  236. package/dist/cli/chunks/{domain-plugins-2UW5KQJB.js → domain-plugins-KHMD3FKT.js} +2 -2
  237. package/dist/cli/chunks/{domain-transfer-35W4CIBV.js → domain-transfer-JWGNNA6K.js} +2 -2
  238. package/dist/cli/chunks/dream-VQ2PZCVR.js +2 -0
  239. package/dist/cli/chunks/embed-and-insert-pattern-F5P5B6JX.js +3 -0
  240. package/dist/cli/chunks/{embedding-space-SBM2MZD2.js → embedding-space-KHG6TITM.js} +2 -2
  241. package/dist/cli/chunks/{eval-4QA2SROK.js → eval-43OHU7EI.js} +2 -2
  242. package/dist/cli/chunks/{experience-capture-middleware-Z6BF6KYM.js → experience-capture-middleware-KXD47H6P.js} +3 -3
  243. package/dist/cli/chunks/{fast-paths-FIORX6GN.js → fast-paths-6D75D5KD.js} +2 -2
  244. package/dist/cli/chunks/{feature-flags-6LYI2T4G.js → feature-flags-IE35Y55N.js} +2 -2
  245. package/dist/cli/chunks/{feature-flags-ZOO7LMIC.js → feature-flags-OYYHY7LS.js} +2 -2
  246. package/dist/cli/chunks/file-discovery-LGBTY3ID.js +2 -0
  247. package/dist/cli/chunks/{fleet-7WF53H4F.js → fleet-AGVJMFGD.js} +16 -16
  248. package/dist/cli/chunks/{gnn-wrapper-KJ6B7BRM.js → gnn-wrapper-5L66A7LW.js} +2 -2
  249. package/dist/cli/chunks/{heartbeat-handler-DEKKMOVW.js → heartbeat-handler-2BY6YYOT.js} +5 -5
  250. package/dist/cli/chunks/heartbeat-scheduler-3DU3M5AT.js +2 -0
  251. package/dist/cli/chunks/hnsw-adapter-N2IMSRPV.js +2 -0
  252. package/dist/cli/chunks/hnsw-index-DVU7TTJE.js +2 -0
  253. package/dist/cli/chunks/{hnsw-legacy-bridge-L27WS27N.js → hnsw-legacy-bridge-RYMWFNAH.js} +2 -2
  254. package/dist/cli/chunks/{hnswlib-node-4YOQC6L4.js → hnswlib-node-GG47HP2P.js} +2 -2
  255. package/dist/cli/chunks/{hooks-TAOKV4EJ.js → hooks-FQNACS24.js} +10 -10
  256. package/dist/cli/chunks/hybrid-backend-AS2PNHOD.js +2 -0
  257. package/dist/cli/chunks/{hypergraph-engine-BODRJLHL.js → hypergraph-engine-6BYNJQEP.js} +2 -2
  258. package/dist/cli/chunks/{hypergraph-handler-RKMYJNTU.js → hypergraph-handler-CYTAXZKJ.js} +3 -3
  259. package/dist/cli/chunks/impact-analyzer-Y4OONLFP.js +2 -0
  260. package/dist/cli/chunks/{init-guard-MXHSLSB2.js → init-guard-METTAV5O.js} +2 -2
  261. package/dist/cli/chunks/{init-handler-HUE57IFW.js → init-handler-GFT74U5Y.js} +6 -6
  262. package/dist/cli/chunks/init-wizard-HLNUBJQN.js +2 -0
  263. package/dist/cli/chunks/kernel-XKFWCL7Y.js +2 -0
  264. package/dist/cli/chunks/{kilocode-installer-S333IKYQ.js → kilocode-installer-GZV2D3FF.js} +2 -2
  265. package/dist/cli/chunks/{kiro-installer-WM5DLQWC.js → kiro-installer-Q4ZXUFC7.js} +2 -2
  266. package/dist/cli/chunks/knowledge-graph-CNL77CSZ.js +2 -0
  267. package/dist/cli/chunks/{learning-LNHMQLH5.js → learning-WA2QEYL7.js} +35 -34
  268. package/dist/cli/chunks/{llm-router-EWFXYZZR.js → llm-router-GRTCHWH7.js} +4 -4
  269. package/dist/cli/chunks/llm-router-service-UIYTYKP6.js +2 -0
  270. package/dist/cli/chunks/{load-FGYGWVDK.js → load-WXN3Q7Y5.js} +2 -2
  271. package/dist/cli/chunks/load-test-PXLW4A5B.js +2 -0
  272. package/dist/cli/chunks/{mcp-2FHNAAOM.js → mcp-LIQCPSJN.js} +2 -2
  273. package/dist/cli/chunks/{memory-DZMQ73AB.js → memory-OP6CHRFH.js} +5 -5
  274. package/dist/cli/chunks/memory-backend-XYOSO73Q.js +2 -0
  275. package/dist/cli/chunks/memory-handlers-PQFYVNVG.js +2 -0
  276. package/dist/cli/chunks/{multi-model-executor-6F2UAEUW.js → multi-model-executor-H54DEVRZ.js} +2 -2
  277. package/dist/cli/chunks/{opencode-installer-XY3BGOTZ.js → opencode-installer-BSQV6UAT.js} +2 -2
  278. package/dist/cli/chunks/{orchestrator-B4CNKUOS.js → orchestrator-TJDPQ4VL.js} +122 -35
  279. package/dist/cli/chunks/pattern-null-store-BKGTQFNF.js +2 -0
  280. package/dist/cli/chunks/{pattern-usage-recorder-R4GUFNMD.js → pattern-usage-recorder-FOVS4M5L.js} +2 -2
  281. package/dist/cli/chunks/{pipeline-FG5RKVRO.js → pipeline-4AY2ZIC6.js} +2 -2
  282. package/dist/cli/chunks/{platform-3BT4KEVJ.js → platform-FCSITYMR.js} +2 -2
  283. package/dist/cli/chunks/{plugin-WI4RIN7O.js → plugin-E56TV5S2.js} +2 -2
  284. package/dist/cli/chunks/{prime-radiant-advanced-wasm-7ECDNQFS.js → prime-radiant-advanced-wasm-ACOPC533.js} +2 -2
  285. package/dist/cli/chunks/project-root-MPX7CN2C.js +2 -0
  286. package/dist/cli/chunks/protocol-executor-CRQOCC4A.js +2 -0
  287. package/dist/cli/chunks/{protocol-handler-WNODKPGW.js → protocol-handler-KRVXF4LS.js} +2 -2
  288. package/dist/cli/chunks/{prove-5RHAEPYZ.js → prove-KMFPSKGD.js} +2 -2
  289. package/dist/cli/chunks/qe-reasoning-bank-UEGQ3O7F.js +2 -0
  290. package/dist/cli/chunks/{quality-WPHR7BGQ.js → quality-6DBI3HLB.js} +2 -2
  291. package/dist/cli/chunks/{quality-gate-4RKTEZMX.js → quality-gate-3ROZMEIL.js} +3 -3
  292. package/dist/cli/chunks/queen-coordinator-32574XSG.js +2 -0
  293. package/dist/cli/chunks/real-embeddings-MIGZNKK3.js +2 -0
  294. package/dist/cli/chunks/{ref-validation-TPAWHOHH.js → ref-validation-EYIP7DHW.js} +2 -2
  295. package/dist/cli/chunks/{roocode-installer-7AVHFNDI.js → roocode-installer-IGGZHR2Y.js} +2 -2
  296. package/dist/cli/chunks/router-CZJY5WX6.js +2 -0
  297. package/dist/cli/chunks/routing-feedback-RC3UBNFX.js +2 -0
  298. package/dist/cli/chunks/{routing-handler-YKEDVJSH.js → routing-handler-BWNHBYDC.js} +2 -2
  299. package/dist/cli/chunks/{ruvector-commands-JUAMM354.js → ruvector-commands-PXIHF432.js} +2 -2
  300. package/dist/cli/chunks/rvf-dual-writer-OG7OV2AK.js +2 -0
  301. package/dist/cli/chunks/rvf-migration-adapter-THYMW7ZO.js +2 -0
  302. package/dist/cli/chunks/rvf-migration-coordinator-3H6CLFU7.js +2 -0
  303. package/dist/cli/chunks/rvf-native-adapter-6JQJIKKW.js +2 -0
  304. package/dist/cli/chunks/{rvf-store-integrity-VJDUIRTX.js → rvf-store-integrity-CVB3NMSL.js} +2 -2
  305. package/dist/cli/chunks/safe-db-QFKCVTIJ.js +2 -0
  306. package/dist/cli/chunks/schedule-6JLVMMYB.js +2 -0
  307. package/dist/cli/chunks/scheduler-3MPZRMJD.js +2 -0
  308. package/dist/cli/chunks/{security-ORDN3RD2.js → security-DCRGOTWU.js} +3 -3
  309. package/dist/cli/chunks/{shared-rvf-adapter-CF4BCIO7.js → shared-rvf-adapter-GKD74QUB.js} +2 -2
  310. package/dist/cli/chunks/{shared-rvf-dual-writer-C32UBR6D.js → shared-rvf-dual-writer-HVAAVEOH.js} +2 -2
  311. package/dist/cli/chunks/sqlite-persistence-LGTIKAEX.js +2 -0
  312. package/dist/cli/chunks/{standalone-memory-OXRJYZXN.js → standalone-memory-O7O2U5N4.js} +2 -2
  313. package/dist/cli/chunks/{status-handler-BCX5D4HY.js → status-handler-BQTPJJTL.js} +2 -2
  314. package/dist/cli/chunks/{structural-health-LFG7RUU6.js → structural-health-4H6J4OHK.js} +2 -2
  315. package/dist/cli/chunks/sync-DJ4TF6QX.js +2 -0
  316. package/dist/cli/chunks/{sync-YJEE2K2L.js → sync-WW5TAVYW.js} +2 -2
  317. package/dist/cli/chunks/{task-handler-6LXKPTXJ.js → task-handler-HEM4IEOW.js} +2 -2
  318. package/dist/cli/chunks/{task-handlers-CILP36I7.js → task-handlers-JRA3NXIR.js} +3 -3
  319. package/dist/cli/chunks/test-772ZXVG2.js +34 -0
  320. package/dist/cli/chunks/test-runner-process-XGF2U3NG.js +2 -0
  321. package/dist/cli/chunks/{test-scheduling-ISI2O4Q5.js → test-scheduling-4TRB7LZ7.js} +3 -3
  322. package/dist/cli/chunks/token-bootstrap-CICBIJ7T.js +2 -0
  323. package/dist/cli/chunks/{token-usage-XOC5KG7S.js → token-usage-B7PEKE2G.js} +2 -2
  324. package/dist/cli/chunks/{transformers-LSLQAARK.js → transformers-V7X7BDZX.js} +2 -2
  325. package/dist/cli/chunks/tree-sitter-wasm-parser-OXPFKFZS.js +2 -0
  326. package/dist/cli/chunks/{types-5BLCGLCR.js → types-AHHTUY3I.js} +2 -2
  327. package/dist/cli/chunks/unified-memory-GUR3IUI6.js +2 -0
  328. package/dist/cli/chunks/unified-memory-hnsw-NJP2F2RY.js +2 -0
  329. package/dist/cli/chunks/unified-persistence-NILBWXDP.js +2 -0
  330. package/dist/cli/chunks/{upgrade-RQJYLK3J.js → upgrade-DZ4DLUQ5.js} +2 -2
  331. package/dist/cli/chunks/{validate-QBHWXXCK.js → validate-4DTLIDJE.js} +2 -2
  332. package/dist/cli/chunks/{validate-swarm-IKXBKFB5.js → validate-swarm-A26UFVIS.js} +2 -2
  333. package/dist/cli/chunks/visual-security-YECYZ27X.js +2 -0
  334. package/dist/cli/chunks/{web-tree-sitter-ZF6FIE5R.js → web-tree-sitter-F2C7QRYT.js} +2 -2
  335. package/dist/cli/chunks/{windsurf-installer-HQGDZT5D.js → windsurf-installer-OOBTDA6W.js} +2 -2
  336. package/dist/cli/chunks/{witness-chain-DCHCAMSQ.js → witness-chain-KGFZJP32.js} +2 -2
  337. package/dist/cli/chunks/witness-chain-LYBXFLJB.js +2 -0
  338. package/dist/cli/chunks/witness-chain-repair-CNTXOGPN.js +2 -0
  339. package/dist/cli/chunks/{witness-chain-verifier-PX2OQ6XT.js → witness-chain-verifier-OB7ZZOI3.js} +2 -2
  340. package/dist/cli/chunks/{witness-key-manager-RXYQNFJB.js → witness-key-manager-YCKGKGQI.js} +2 -2
  341. package/dist/cli/chunks/{workflow-FBKCA4H6.js → workflow-PRERHWKY.js} +4 -4
  342. package/dist/cli/chunks/workflow-orchestrator-UIBGWCU3.js +2 -0
  343. package/dist/cli/chunks/wrappers-L4UY4V63.js +2 -0
  344. package/dist/cli/commands/coverage.js +4 -1
  345. package/dist/cli/commands/learning-prune.js +9 -1
  346. package/dist/cli/commands/test.js +26 -4
  347. package/dist/cli/handlers/brain-handler.js +32 -2
  348. package/dist/cli/handlers/heartbeat-handler.js +3 -1
  349. package/dist/cli/utils/coverage-data.js +5 -1
  350. package/dist/cli/utils/coverage-verdict.d.ts +10 -2
  351. package/dist/cli/utils/coverage-verdict.js +23 -8
  352. package/dist/cli/utils/fleet-operation.js +9 -3
  353. package/dist/coordination/handlers/code-intelligence-handlers.js +17 -3
  354. package/dist/coordination/handlers/coverage-handlers.js +22 -9
  355. package/dist/coordination/handlers/coverage-target.d.ts +22 -2
  356. package/dist/coordination/handlers/coverage-target.js +45 -9
  357. package/dist/coordination/handlers/handler-utils.d.ts +19 -0
  358. package/dist/coordination/handlers/handler-utils.js +22 -8
  359. package/dist/coordination/handlers/test-execution-handlers.js +64 -20
  360. package/dist/coordination/protocols/code-intelligence-index.js +6 -3
  361. package/dist/coordination/protocols/learning-consolidation-archive.d.ts +6 -3
  362. package/dist/coordination/protocols/learning-consolidation-archive.js +4 -3
  363. package/dist/coordination/workflow-builtin.js +1 -0
  364. package/dist/domains/code-intelligence/services/semantic-analyzer.d.ts +8 -3
  365. package/dist/domains/code-intelligence/services/semantic-analyzer.js +39 -25
  366. package/dist/domains/code-intelligence/services/text-relevance.d.ts +32 -0
  367. package/dist/domains/code-intelligence/services/text-relevance.js +63 -0
  368. package/dist/domains/defect-intelligence/interfaces.d.ts +2 -0
  369. package/dist/domains/defect-intelligence/prediction-history.d.ts +15 -1
  370. package/dist/domains/defect-intelligence/prediction-history.js +63 -7
  371. package/dist/domains/defect-intelligence/services/defect-predictor.d.ts +1 -0
  372. package/dist/domains/defect-intelligence/services/defect-predictor.js +33 -13
  373. package/dist/domains/learning-optimization/coordinator.js +17 -10
  374. package/dist/domains/learning-optimization/domain-ranking.d.ts +26 -0
  375. package/dist/domains/learning-optimization/domain-ranking.js +28 -0
  376. package/dist/domains/learning-optimization/interfaces.d.ts +5 -0
  377. package/dist/domains/learning-optimization/pattern-archive.d.ts +55 -8
  378. package/dist/domains/learning-optimization/pattern-archive.js +90 -17
  379. package/dist/domains/learning-optimization/pattern-consolidation.js +18 -2
  380. package/dist/domains/learning-optimization/pattern-merge.d.ts +26 -0
  381. package/dist/domains/learning-optimization/pattern-merge.js +127 -0
  382. package/dist/domains/learning-optimization/services/learning-coordinator.js +21 -35
  383. package/dist/domains/test-execution/coordinator.d.ts +3 -1
  384. package/dist/domains/test-execution/coordinator.js +13 -4
  385. package/dist/domains/test-execution/interfaces.d.ts +5 -0
  386. package/dist/domains/test-execution/plugin.js +2 -0
  387. package/dist/domains/test-execution/services/flaky-detector.d.ts +9 -1
  388. package/dist/domains/test-execution/services/flaky-detector.js +26 -8
  389. package/dist/domains/test-execution/services/retry-handler.d.ts +7 -1
  390. package/dist/domains/test-execution/services/retry-handler.js +44 -5
  391. package/dist/domains/test-execution/services/runner-test-cases.d.ts +2 -0
  392. package/dist/domains/test-execution/services/runner-test-cases.js +7 -3
  393. package/dist/domains/test-execution/services/test-executor.d.ts +5 -1
  394. package/dist/domains/test-execution/services/test-executor.js +85 -17
  395. package/dist/init/copilot-installer.d.ts +6 -0
  396. package/dist/init/copilot-installer.js +37 -17
  397. package/dist/init/init-wizard-steps.js +3 -1
  398. package/dist/init/phases/07-hooks.js +97 -10
  399. package/dist/init/platform-config-generator.d.ts +10 -0
  400. package/dist/init/platform-config-generator.js +26 -1
  401. package/dist/integrations/embeddings/cache/EmbeddingCache.js +1 -1
  402. package/dist/integrations/ruvector/brain-rvf-exporter.d.ts +16 -1
  403. package/dist/integrations/ruvector/brain-rvf-exporter.js +18 -32
  404. package/dist/integrations/ruvector/brain-rvf-richness.d.ts +75 -0
  405. package/dist/integrations/ruvector/brain-rvf-richness.js +127 -0
  406. package/dist/kernel/unified-memory-migration.js +1 -1
  407. package/dist/kernel/unified-memory.d.ts +8 -0
  408. package/dist/kernel/unified-memory.js +13 -0
  409. package/dist/learning/checkpoint-shrink-ack.d.ts +25 -0
  410. package/dist/learning/checkpoint-shrink-ack.js +57 -0
  411. package/dist/learning/dream/dream-engine.d.ts +44 -3
  412. package/dist/learning/dream/dream-engine.js +6 -2
  413. package/dist/learning/embedder-endpoint-client.d.ts +45 -0
  414. package/dist/learning/embedder-endpoint-client.js +98 -3
  415. package/dist/learning/embedder-identity-store.js +3 -1
  416. package/dist/learning/embedding-space-legacy-adoption.d.ts +53 -0
  417. package/dist/learning/embedding-space-legacy-adoption.js +115 -0
  418. package/dist/learning/embedding-space-registry.d.ts +90 -0
  419. package/dist/learning/embedding-space-registry.js +181 -0
  420. package/dist/learning/experience-capture.d.ts +3 -1
  421. package/dist/learning/experience-capture.js +15 -5
  422. package/dist/learning/experience-space-verification.d.ts +2 -0
  423. package/dist/learning/experience-space-verification.js +3 -2
  424. package/dist/learning/learning-retention.js +4 -0
  425. package/dist/learning/pattern-promotion.d.ts +7 -0
  426. package/dist/learning/pattern-promotion.js +64 -12
  427. package/dist/learning/real-embeddings.d.ts +3 -0
  428. package/dist/learning/real-embeddings.js +73 -11
  429. package/dist/learning/rvf-pattern-store.js +6 -1
  430. package/dist/mcp/bundle.js +558 -537
  431. package/dist/mcp/handlers/domain-handler-configs.d.ts +3 -0
  432. package/dist/mcp/handlers/domain-handler-configs.js +1 -0
  433. package/dist/mcp/handlers/heartbeat-handlers.d.ts +4 -2
  434. package/dist/mcp/protocol-server.js +1 -1
  435. package/dist/mcp/tools/learning-optimization/optimize.d.ts +6 -1
  436. package/dist/mcp/tools/learning-optimization/optimize.js +20 -11
  437. package/dist/planning/goap-planner.js +4 -0
  438. package/dist/planning/plan-executor.js +6 -2
  439. package/dist/shared/embeddings/index.d.ts +2 -2
  440. package/dist/shared/embeddings/index.js +1 -1
  441. package/dist/shared/embeddings/nomic-embedder.d.ts +8 -2
  442. package/dist/shared/embeddings/nomic-embedder.js +19 -11
  443. package/dist/shared/embeddings/ollama-client.d.ts +28 -2
  444. package/dist/shared/embeddings/ollama-client.js +84 -22
  445. package/dist/shared/embeddings/types.d.ts +15 -0
  446. package/dist/shared/embeddings/types.js +4 -0
  447. package/dist/shared/git/git-analyzer.d.ts +30 -11
  448. package/dist/shared/git/git-analyzer.js +95 -48
  449. package/dist/shared/io/confined-read.d.ts +32 -7
  450. package/dist/shared/io/confined-read.js +58 -25
  451. package/dist/shared/io/file-reader.js +4 -1
  452. package/dist/shared/pytest-junit-report.d.ts +93 -0
  453. package/dist/shared/pytest-junit-report.js +241 -0
  454. package/dist/shared/safe-db.d.ts +1 -1
  455. package/dist/shared/safe-db.js +20 -5
  456. package/dist/shared/sqlite-journal-mode.d.ts +39 -0
  457. package/dist/shared/sqlite-journal-mode.js +53 -0
  458. package/dist/shared/test-runner-project.d.ts +51 -1
  459. package/dist/shared/test-runner-project.js +140 -25
  460. package/dist/sync/claude-flow-bridge.js +1 -1
  461. package/dist/sync/readers/sqlite-reader.js +3 -4
  462. package/dist/sync/writers/sqlite-writer.js +1 -1
  463. package/dist/workers/interfaces.d.ts +2 -2
  464. package/dist/workers/quality-daemon/git-watcher.d.ts +8 -0
  465. package/dist/workers/quality-daemon/git-watcher.js +54 -12
  466. package/dist/workers/quality-daemon/index.js +1 -1
  467. package/dist/workers/quality-daemon/priority-queue.d.ts +2 -1
  468. package/dist/workers/workers/defect-predictor.d.ts +9 -4
  469. package/dist/workers/workers/defect-predictor.js +98 -37
  470. package/package.json +1 -1
  471. package/dist/cli/chunks/adapter-6CQ2PIP5.js +0 -2
  472. package/dist/cli/chunks/aqe-learning-engine-73RR52VS.js +0 -2
  473. package/dist/cli/chunks/base-SMCMMVGP.js +0 -2
  474. package/dist/cli/chunks/brain-handler-HQWZFO52.js +0 -95
  475. package/dist/cli/chunks/browser-workflow-A2MEZ66K.js +0 -2
  476. package/dist/cli/chunks/chunk-CGGUM2YJ.js +0 -3
  477. package/dist/cli/chunks/chunk-D6COXLYE.js +0 -8
  478. package/dist/cli/chunks/chunk-EGYE5UPQ.js +0 -2
  479. package/dist/cli/chunks/chunk-IUBJVHNB.js +0 -3
  480. package/dist/cli/chunks/chunk-KL7OKSU2.js +0 -4
  481. package/dist/cli/chunks/chunk-KPRCB5LT.js +0 -7
  482. package/dist/cli/chunks/chunk-LRSX2FJM.js +0 -2
  483. package/dist/cli/chunks/chunk-M4FRQ4TE.js +0 -12
  484. package/dist/cli/chunks/chunk-MAFQV4U4.js +0 -16
  485. package/dist/cli/chunks/chunk-NZU4ACBZ.js +0 -2
  486. package/dist/cli/chunks/chunk-RV74I3YO.js +0 -3
  487. package/dist/cli/chunks/chunk-SJ6Y4725.js +0 -5
  488. package/dist/cli/chunks/chunk-UE5ZOZR2.js +0 -2
  489. package/dist/cli/chunks/chunk-VSIKHWZ4.js +0 -29
  490. package/dist/cli/chunks/chunk-YAPLJR7K.js +0 -2
  491. package/dist/cli/chunks/client-MHQRTZM4.js +0 -2
  492. package/dist/cli/chunks/copilot-installer-IGJ6KGQY.js +0 -3
  493. package/dist/cli/chunks/core-handlers-UAK3LLJE.js +0 -2
  494. package/dist/cli/chunks/cross-domain-router-WTRZQPNQ.js +0 -2
  495. package/dist/cli/chunks/daemon-CAVZ7OFV.js +0 -18
  496. package/dist/cli/chunks/dream-EJY24JN6.js +0 -2
  497. package/dist/cli/chunks/embed-and-insert-pattern-COG4C7ZI.js +0 -3
  498. package/dist/cli/chunks/file-discovery-UZSFSS4V.js +0 -2
  499. package/dist/cli/chunks/heartbeat-scheduler-NVR356I7.js +0 -2
  500. package/dist/cli/chunks/hnsw-adapter-LFMPLUJU.js +0 -2
  501. package/dist/cli/chunks/hnsw-index-POCPMVJH.js +0 -2
  502. package/dist/cli/chunks/hybrid-backend-4STAO7CV.js +0 -2
  503. package/dist/cli/chunks/impact-analyzer-3VIIISBQ.js +0 -2
  504. package/dist/cli/chunks/init-wizard-PL6QN6RQ.js +0 -2
  505. package/dist/cli/chunks/kernel-CCDWT7KS.js +0 -2
  506. package/dist/cli/chunks/knowledge-graph-KFOMEN3H.js +0 -2
  507. package/dist/cli/chunks/llm-router-service-7NBE2EX6.js +0 -2
  508. package/dist/cli/chunks/load-test-UNZUWY3F.js +0 -2
  509. package/dist/cli/chunks/memory-backend-DFGKWA2Q.js +0 -2
  510. package/dist/cli/chunks/memory-handlers-MP426XRJ.js +0 -2
  511. package/dist/cli/chunks/pattern-null-store-SSVF5TE5.js +0 -2
  512. package/dist/cli/chunks/project-root-BEANNYWU.js +0 -2
  513. package/dist/cli/chunks/protocol-executor-FQVIHXZ7.js +0 -2
  514. package/dist/cli/chunks/qe-reasoning-bank-5TFYSE24.js +0 -2
  515. package/dist/cli/chunks/queen-coordinator-Y2OUL7IN.js +0 -2
  516. package/dist/cli/chunks/real-embeddings-OXLYU7JW.js +0 -2
  517. package/dist/cli/chunks/router-EP34O3KB.js +0 -2
  518. package/dist/cli/chunks/routing-feedback-FJCRKXNG.js +0 -2
  519. package/dist/cli/chunks/rvf-dual-writer-ILITJSFG.js +0 -2
  520. package/dist/cli/chunks/rvf-migration-adapter-XF6W4C2N.js +0 -2
  521. package/dist/cli/chunks/rvf-migration-coordinator-CMKG56AR.js +0 -2
  522. package/dist/cli/chunks/rvf-native-adapter-7YFW6S4Y.js +0 -2
  523. package/dist/cli/chunks/safe-db-TCAU4FUT.js +0 -2
  524. package/dist/cli/chunks/schedule-NB5KV435.js +0 -2
  525. package/dist/cli/chunks/scheduler-JKXGKVK6.js +0 -2
  526. package/dist/cli/chunks/sqlite-persistence-IXCNZRTW.js +0 -2
  527. package/dist/cli/chunks/sync-OSF7C2NL.js +0 -2
  528. package/dist/cli/chunks/test-SD457QJ6.js +0 -34
  529. package/dist/cli/chunks/test-runner-process-VKD65QQU.js +0 -2
  530. package/dist/cli/chunks/token-bootstrap-VUELSBOS.js +0 -2
  531. package/dist/cli/chunks/tree-sitter-wasm-parser-YAIPHRIL.js +0 -2
  532. package/dist/cli/chunks/unified-memory-GI76TXFV.js +0 -2
  533. package/dist/cli/chunks/unified-memory-hnsw-GXJ5BTZO.js +0 -2
  534. package/dist/cli/chunks/unified-persistence-OP7FDQPD.js +0 -2
  535. package/dist/cli/chunks/visual-security-GZ2MOKWB.js +0 -2
  536. package/dist/cli/chunks/witness-chain-P3XXXA62.js +0 -2
  537. package/dist/cli/chunks/witness-chain-repair-PUX2NFDL.js +0 -2
  538. package/dist/cli/chunks/workflow-orchestrator-P2APAJAA.js +0 -2
  539. package/dist/cli/chunks/wrappers-TWSKBTWD.js +0 -2
@@ -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
  */
@@ -159,6 +159,12 @@ export declare class RetryHandlerService implements IRetryHandler {
159
159
  * Spawn a test process and parse the result
160
160
  */
161
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;
162
168
  /**
163
169
  * Parse test runner output to determine pass/fail status
164
170
  */
@@ -7,6 +7,7 @@ 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
9
  import { runnerCwdFor } from '../../../shared/test-runner-project.js';
10
+ import { createPytestJunitReport, isPythonTestFile, parsePytestJunitXml, pytestCommand, PYTEST_ENV, } from '../../../shared/pytest-junit-report.js';
10
11
  import { existsSync, readFileSync, realpathSync } from 'node:fs';
11
12
  import { resolve as resolvePath } from 'node:path';
12
13
  import { ok, err } from '../../../shared/types/index.js';
@@ -300,8 +301,8 @@ export class RetryHandlerService {
300
301
  // projectRoot, else a configured directory, else the file's runner
301
302
  // project. The file path stays relative to `cwd`.
302
303
  const runCwd = projectRoot ?? this.config.cwd ?? runnerCwdFor(testFile);
303
- // Detect or use configured test runner
304
- const runner = await this.detectTestRunner(runCwd);
304
+ // Detect or use configured test runner. #1248: a Python file is pytest's.
305
+ const runner = isPythonTestFile(testFile) ? 'pytest' : await this.detectTestRunner(runCwd);
305
306
  if (!runner) {
306
307
  throw new Error(`No test runner detected or configured. Install vitest, jest, or mocha, ` +
307
308
  `or configure testRunner in RetryHandlerConfig. Cannot execute retry for: ${testFile}`);
@@ -309,7 +310,7 @@ export class RetryHandlerService {
309
310
  // Build command based on runner
310
311
  const { command, args, report } = this.buildTestCommand(runner, testFile, testName, cwd);
311
312
  // Execute the test
312
- return this.spawnTestProcess(command, args, runCwd, 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);
313
314
  }
314
315
  /**
315
316
  * Detect which test runner is available in the project
@@ -415,6 +416,13 @@ export class RetryHandlerService {
415
416
  mochaArgs.push(nameFilterArg('mocha', testName));
416
417
  return { command: npx, args: mochaArgs };
417
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
+ }
418
426
  default:
419
427
  throw new Error(`Unsupported test runner: ${runner}`);
420
428
  }
@@ -422,7 +430,7 @@ export class RetryHandlerService {
422
430
  /**
423
431
  * Spawn a test process and parse the result
424
432
  */
425
- spawnTestProcess(command, args, cwd, report, targetFile) {
433
+ spawnTestProcess(command, args, cwd, report, targetFile, parseReport) {
426
434
  return new Promise((resolve, reject) => {
427
435
  const timeout = this.config.testTimeout;
428
436
  let stdout = '';
@@ -439,7 +447,7 @@ export class RetryHandlerService {
439
447
  const proc = spawn(command, args, {
440
448
  cwd,
441
449
  detached: process.platform !== 'win32',
442
- env: { ...process.env, FORCE_COLOR: '0', CI: 'true' },
450
+ env: { ...process.env, FORCE_COLOR: '0', CI: 'true', ...PYTEST_ENV },
443
451
  });
444
452
  const untrackExit = trackTestRunnerExit(proc);
445
453
  const timeoutHandle = setTimeout(() => {
@@ -470,6 +478,10 @@ export class RetryHandlerService {
470
478
  // report to the --outputFile; read it back rather than trusting stdout).
471
479
  try {
472
480
  const reportText = report ? report.read(stdout) : stdout;
481
+ if (parseReport) {
482
+ settle(resolve, parseReport(code, reportText, `${stderr}\n${stdout}`.trim()));
483
+ return;
484
+ }
473
485
  if (reportText === undefined) {
474
486
  throw new Error('The current Vitest JSON report is missing for the retry run.');
475
487
  }
@@ -489,6 +501,33 @@ export class RetryHandlerService {
489
501
  });
490
502
  });
491
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
+ }
492
531
  /**
493
532
  * Parse test runner output to determine pass/fail status
494
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;
@@ -115,7 +115,7 @@ export declare class TestExecutorService implements ITestExecutionService {
115
115
  private executeTestFiles;
116
116
  private executeProjectFiles;
117
117
  /**
118
- * Spawn actual test runner process (vitest, jest, mocha)
118
+ * Spawn actual test runner process (vitest, jest, mocha, node:test, pytest)
119
119
  */
120
120
  private spawnTestRunner;
121
121
  /**
@@ -126,6 +126,10 @@ export declare class TestExecutorService implements ITestExecutionService {
126
126
  * Parse test runner output to extract results
127
127
  */
128
128
  private parseTestOutput;
129
+ /**
130
+ * #1248: a pytest run from its JUnit report (undefined when pytest wrote none).
131
+ */
132
+ private parsePytestOutput;
129
133
  /**
130
134
  * Parse the TAP or spec summary emitted by Node's built-in test runner.
131
135
  */
@@ -11,17 +11,18 @@ import { isDeepStrictEqual } from 'node:util';
11
11
  import { v4 as uuidv4 } from 'uuid';
12
12
  import { ok, err } from '../../../shared/types/index.js';
13
13
  import { TEST_EXECUTION_CONSTANTS, LLM_ANALYSIS_CONSTANTS } from '../../constants.js';
14
- import { toErrorMessage, toError } from '../../../shared/error-utils.js';
14
+ import { CallerInputError, isCallerInputError, toErrorMessage, toError } from '../../../shared/error-utils.js';
15
15
  import { safeJsonParse } from '../../../shared/safe-json.js';
16
16
  import { secureRandom, secureRandomInt } from '../../../shared/utils/crypto-random.js';
17
17
  import { writeTestRunEvidence } from '../../quality-assessment/quality-evidence.js';
18
18
  import { istanbulLineHits } from '../../../coordination/handlers/handler-utils.js';
19
19
  import { fileCoverageKey, projectFileCoverageKeys } from '../../coverage-analysis/collected-metrics.js';
20
- import { mergeTestCases, redactFailedTests, redactFailureText, testCasesFromRunnerReport } from './runner-test-cases.js';
20
+ import { mergeTestCases, redactFailedTests, redactFailureText, testCaseFailureMessage, testCasesFromRunnerReport } from './runner-test-cases.js';
21
21
  import { capDiagnostics, getTestRunnerExecutionError, TestRunnerExecutionError } from '../../../shared/test-runner-verdict.js';
22
22
  import { createVitestJsonReport } from '../../../shared/vitest-json-report.js';
23
+ import { createPytestJunitReport, isPythonTestFile, pytestCommand, pytestRunFromReport, PYTEST_ENV } from '../../../shared/pytest-junit-report.js';
23
24
  import { jestExactPathPattern, runnerFilePath } from '../../../shared/test-runner-args.js';
24
- import { groupByRunnerProject } from '../../../shared/test-runner-project.js';
25
+ import { groupByRunnerProject, runnerFrameworkFor } from '../../../shared/test-runner-project.js';
25
26
  import { getClaudeModelForTier } from '../../../shared/llm/model-registry.js';
26
27
  import { terminateTestRunner, trackTestRunnerExit } from '../../../shared/test-runner-process.js';
27
28
  const DEFAULT_CONFIG = {
@@ -315,7 +316,7 @@ Provide:
315
316
  return ok(undefined);
316
317
  }
317
318
  async runTests(request) {
318
- const { testFiles, framework, timeout = 30000, projectRoot } = request;
319
+ const { testFiles, framework, timeout = 30000, projectRoot, frameworkFromConfig } = request;
319
320
  const failedTests = [];
320
321
  const coverages = [];
321
322
  const allFileCoverages = [];
@@ -324,7 +325,7 @@ Provide:
324
325
  let failed = 0;
325
326
  let skipped = 0;
326
327
  for (const file of testFiles) {
327
- const result = await this.executeTestFile(file, framework, timeout, projectRoot);
328
+ const result = await this.executeTestFile(file, framework, timeout, projectRoot, frameworkFromConfig);
328
329
  executionResults.push(result);
329
330
  passed += result.passed;
330
331
  failed += result.failed;
@@ -394,25 +395,40 @@ Provide:
394
395
  const coverage = this.extractCoverageFromJson({ coverageMap: merged });
395
396
  return coverage.summary ? { summary: coverage.summary, perFile: coverage.perFile } : undefined;
396
397
  }
397
- async executeTestFile(file, framework, timeout, projectRoot) {
398
- return this.executeTestFiles([file], framework, timeout, projectRoot);
398
+ async executeTestFile(file, framework, timeout, projectRoot, frameworkFromConfig = false) {
399
+ return this.executeTestFiles([file], framework, timeout, projectRoot, frameworkFromConfig);
399
400
  }
400
- async executeTestFiles(files, framework, timeout, projectRoot) {
401
+ async executeTestFiles(files, framework, timeout, projectRoot, frameworkFromConfig = false) {
401
402
  // In simulation mode (for unit testing), use random behavior
402
403
  if (this.config.simulateForTesting) {
403
404
  return this.aggregateResults(files.map(file => this.simulateTestExecution(file)));
404
405
  }
405
406
  // #1247: a runner loads the config of the directory it starts in, so each
406
407
  // file runs from its own runner project (or the caller's projectRoot).
408
+ // #1248: Python files run apart from the others, with pytest.
407
409
  const groups = projectRoot
408
- ? [{ cwd: projectRoot, files }]
410
+ ? [files.filter(isPythonTestFile), files.filter(file => !isPythonTestFile(file))]
411
+ .filter(group => group.length > 0)
412
+ .map(group => ({ cwd: projectRoot, files: group }))
409
413
  : groupByRunnerProject(files);
414
+ // #1272: an explicit framework wins; otherwise the project's config decides.
415
+ // #1248: Python files run with pytest, never with a JavaScript runner.
416
+ const frameworkIn = (group) => {
417
+ if (group.files.some(isPythonTestFile)) {
418
+ if (frameworkFromConfig || framework.toLowerCase() === 'pytest')
419
+ return 'pytest';
420
+ throw new TestRunnerExecutionError(`Python test files cannot run with ${framework}: ${group.files.filter(isPythonTestFile).join(', ')}. ` +
421
+ `Use framework 'pytest', or leave the framework unset.`);
422
+ }
423
+ return (frameworkFromConfig ? runnerFrameworkFor(group.cwd) : undefined) ?? framework;
424
+ };
410
425
  if (groups.length === 1) {
411
- return this.executeProjectFiles(groups[0].files, framework, timeout, groups[0].cwd);
426
+ return this.executeProjectFiles(groups[0].files, frameworkIn(groups[0]), timeout, groups[0].cwd);
412
427
  }
413
428
  // Each project gets its own runner and timeout. Their coverage maps are
414
429
  // 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)));
430
+ const frameworks = groups.map(frameworkIn);
431
+ const results = await Promise.all(groups.map((group, index) => this.executeProjectFiles(group.files, frameworks[index], timeout, group.cwd)));
416
432
  const combined = this.aggregateResults(results);
417
433
  const merged = this.mergeSequentialCoverage(results);
418
434
  combined.coverage = merged?.summary;
@@ -426,6 +442,10 @@ Provide:
426
442
  // Runner/suite errors have no trustworthy assertion receipt to aggregate.
427
443
  if (result.error instanceof TestRunnerExecutionError)
428
444
  throw result.error;
445
+ // #1147: the caller's input (a test file that does not exist) is not a
446
+ // failed test, so it is never counted as a measured failure.
447
+ if (isCallerInputError(result.error))
448
+ throw result.error;
429
449
  // Return as a failed test rather than throwing — allows other files to still run
430
450
  return {
431
451
  total: files.length,
@@ -445,13 +465,13 @@ Provide:
445
465
  return result.value;
446
466
  }
447
467
  /**
448
- * Spawn actual test runner process (vitest, jest, mocha)
468
+ * Spawn actual test runner process (vitest, jest, mocha, node:test, pytest)
449
469
  */
450
470
  async spawnTestRunner(files, framework, timeout, cwd = process.cwd()) {
451
471
  // Verify test file exists
452
472
  const missingFile = files.find(file => !existsSync(file));
453
473
  if (missingFile) {
454
- return err(new Error(`Test file not found: ${missingFile}`));
474
+ return err(new CallerInputError(`Test file not found: ${missingFile}`));
455
475
  }
456
476
  // Build command based on framework
457
477
  const { command, args, report, coverageDirectory } = this.buildTestCommand(files, framework);
@@ -490,6 +510,7 @@ Provide:
490
510
  env: {
491
511
  ...process.env,
492
512
  FORCE_COLOR: '0', // Disable color codes for easier parsing
513
+ ...PYTEST_ENV, // pytest reads any FORCE_COLOR as "force colour" (#1248)
493
514
  CI: 'true', // Enable CI mode for consistent output
494
515
  },
495
516
  });
@@ -534,11 +555,15 @@ Provide:
534
555
  finish(err(toError(error)));
535
556
  return;
536
557
  }
537
- if (reportText === undefined) {
558
+ // #1248: pytest reports its own missing report (pytest not installed).
559
+ const pytest = framework.toLowerCase() === 'pytest';
560
+ if (reportText === undefined && !pytest) {
538
561
  finish(err(new TestRunnerExecutionError(`The current Vitest JSON report is missing for ${fileLabel}.`)));
539
562
  return;
540
563
  }
541
- const parseResult = this.parseTestOutput(reportText, stderr, fileLabel, framework, code);
564
+ const parseResult = pytest
565
+ ? this.parsePytestOutput(reportText, `${stderr}\n${stdout}`, files, code, command)
566
+ : this.parseTestOutput(reportText ?? '', stderr, fileLabel, framework, code);
542
567
  // Read only this invocation's coverage artifacts. A previous or
543
568
  // concurrent run's project coverage directory is not evidence.
544
569
  if (parseResult.success && coverageDirectory) {
@@ -611,8 +636,14 @@ Provide:
611
636
  command: process.execPath,
612
637
  args: ['--test', ...files],
613
638
  };
639
+ case 'pytest': {
640
+ // #1248: results come from the JUnit report file; no coverage is collected.
641
+ const report = createPytestJunitReport();
642
+ return { ...pytestCommand(files, report.path), report };
643
+ }
614
644
  default: {
615
- // Default to vitest
645
+ // Default to vitest. Python files never get here: executeTestFiles
646
+ // sends them to pytest or refuses the run (#1248).
616
647
  const coverageDirectory = createCoverageDirectory();
617
648
  let report;
618
649
  try {
@@ -655,6 +686,43 @@ Provide:
655
686
  `stdout: ${capDiagnostics(stdout, 500)}\nstderr: ${capDiagnostics(stderr, 500)}`));
656
687
  }
657
688
  }
689
+ /**
690
+ * #1248: a pytest run from its JUnit report (undefined when pytest wrote none).
691
+ */
692
+ parsePytestOutput(report, output, files, exitCode, python) {
693
+ const run = pytestRunFromReport(report, files, exitCode, output, python);
694
+ if (!run.success)
695
+ return run;
696
+ const failedTests = run.value.tests
697
+ .filter(test => test.status === 'failed')
698
+ .map(test => ({
699
+ testId: uuidv4(),
700
+ testName: test.name,
701
+ file: test.file,
702
+ error: test.failureMessage ?? 'Test failed',
703
+ stack: test.failureMessage ?? '',
704
+ duration: test.duration ?? 0,
705
+ }));
706
+ const testCases = run.value.tests.map(test => {
707
+ const failureMessage = test.failureMessage && testCaseFailureMessage(test.failureMessage);
708
+ return {
709
+ name: test.name,
710
+ file: test.file,
711
+ status: test.status,
712
+ ...(test.duration !== undefined ? { duration: test.duration } : {}),
713
+ ...(failureMessage ? { failureMessage } : {}),
714
+ };
715
+ });
716
+ return ok({
717
+ total: run.value.total,
718
+ passed: run.value.passed,
719
+ failed: run.value.failed,
720
+ skipped: run.value.skipped,
721
+ failedTests,
722
+ testCases,
723
+ coverage: undefined,
724
+ });
725
+ }
658
726
  /**
659
727
  * Parse the TAP or spec summary emitted by Node's built-in test runner.
660
728
  */
@@ -1018,7 +1086,7 @@ Provide:
1018
1086
  return shards;
1019
1087
  }
1020
1088
  async executeWorker(files, _workerIndex, _isolation, request) {
1021
- return this.executeTestFiles(files, request.framework, request.timeout ?? 30000, request.projectRoot);
1089
+ return this.executeTestFiles(files, request.framework, request.timeout ?? 30000, request.projectRoot, request.frameworkFromConfig);
1022
1090
  }
1023
1091
  aggregateResults(results) {
1024
1092
  const aggregated = {
@@ -29,6 +29,12 @@ export declare class CopilotInstaller {
29
29
  private generator;
30
30
  constructor(options: CopilotInstallerOptions);
31
31
  install(): Promise<CopilotInstallResult>;
32
+ /**
33
+ * Replace AQE's server entry in an existing config, keeping everything else.
34
+ * Returns null when the file cannot be merged safely (e.g. JSONC comments,
35
+ * which VS Code accepts but JSON.parse does not) so the user's file is never
36
+ * clobbered wholesale.
37
+ */
32
38
  private mergeExistingConfig;
33
39
  }
34
40
  export declare function createCopilotInstaller(options: CopilotInstallerOptions): CopilotInstaller;
@@ -8,6 +8,7 @@
8
8
  import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs';
9
9
  import { join, dirname } from 'path';
10
10
  import { toErrorMessage } from '../shared/error-utils.js';
11
+ import { writeFileIfChanged } from './idempotent-write.js';
11
12
  import { createPlatformConfigGenerator, } from './platform-config-generator.js';
12
13
  // ============================================================================
13
14
  // Copilot Installer Class
@@ -37,20 +38,28 @@ export class CopilotInstaller {
37
38
  const mcpConfig = this.generator.generateMcpConfig('copilot', { memoryBackend: this.options.memoryBackend });
38
39
  const configPath = join(this.projectRoot, mcpConfig.path);
39
40
  result.configPath = configPath;
40
- if (!existsSync(configPath) || this.overwrite) {
41
+ // AQE's own server entry is refreshed on every init, independent of
42
+ // `overwrite` (#1269): its launch config is version-pinned, and a stale one
43
+ // leaves VS Code serving tool schemas cached from an older server. Other
44
+ // servers and top-level keys in the file are preserved.
45
+ if (!existsSync(configPath)) {
41
46
  const configDir = dirname(configPath);
42
47
  if (!existsSync(configDir)) {
43
48
  mkdirSync(configDir, { recursive: true });
44
49
  }
45
- // Merge with existing if present
46
- if (existsSync(configPath) && this.overwrite) {
47
- const merged = this.mergeExistingConfig(configPath, mcpConfig.content);
48
- writeFileSync(configPath, merged);
50
+ writeFileSync(configPath, mcpConfig.content);
51
+ result.mcpConfigured = true;
52
+ }
53
+ else {
54
+ const merged = this.mergeExistingConfig(configPath, mcpConfig.content);
55
+ if (merged === null) {
56
+ result.errors.push(`${configPath} is not plain JSON (comments?) and was left unchanged; ` +
57
+ `update its "agentic-qe" server entry by hand`);
49
58
  }
50
59
  else {
51
- writeFileSync(configPath, mcpConfig.content);
60
+ writeFileIfChanged(configPath, merged);
61
+ result.mcpConfigured = true;
52
62
  }
53
- result.mcpConfigured = true;
54
63
  }
55
64
  // Generate behavioral rules
56
65
  const rules = this.generator.generateBehavioralRules('copilot');
@@ -71,23 +80,34 @@ export class CopilotInstaller {
71
80
  }
72
81
  return result;
73
82
  }
83
+ /**
84
+ * Replace AQE's server entry in an existing config, keeping everything else.
85
+ * Returns null when the file cannot be merged safely (e.g. JSONC comments,
86
+ * which VS Code accepts but JSON.parse does not) so the user's file is never
87
+ * clobbered wholesale.
88
+ */
74
89
  mergeExistingConfig(configPath, newContent) {
90
+ let existing;
75
91
  try {
76
- const existing = JSON.parse(readFileSync(configPath, 'utf-8'));
77
- const incoming = JSON.parse(newContent);
78
- // Merge servers
79
- if (!existing.servers) {
80
- existing.servers = {};
81
- }
82
- Object.assign(existing.servers, incoming.servers);
83
- return JSON.stringify(existing, null, 2) + '\n';
92
+ existing = JSON.parse(readFileSync(configPath, 'utf-8'));
84
93
  }
85
94
  catch {
86
- // If existing config is invalid, overwrite
87
- return newContent;
95
+ return null;
88
96
  }
97
+ if (!isPlainObject(existing))
98
+ return null;
99
+ if (existing.servers === undefined)
100
+ existing.servers = {};
101
+ if (!isPlainObject(existing.servers))
102
+ return null;
103
+ const incoming = JSON.parse(newContent);
104
+ Object.assign(existing.servers, incoming.servers);
105
+ return JSON.stringify(existing, null, 2) + '\n';
89
106
  }
90
107
  }
108
+ function isPlainObject(value) {
109
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
110
+ }
91
111
  // ============================================================================
92
112
  // Factory Function
93
113
  // ============================================================================
@@ -13,6 +13,7 @@ import { createN8nInstaller } from './n8n-installer.js';
13
13
  import { toErrorMessage } from '../shared/error-utils.js';
14
14
  import { isNativeModuleLoadFailure, withNativeModuleRemedy } from '../shared/native-module-errors.js';
15
15
  import { openDatabase } from '../shared/safe-db.js';
16
+ import { setJournalModeWithRetry } from '../shared/sqlite-journal-mode.js';
16
17
  import { safeJsonParse } from '../shared/safe-json.js';
17
18
  // ============================================================================
18
19
  // Version Management
@@ -128,8 +129,9 @@ export async function initializePersistenceDatabase(projectRoot) {
128
129
  const dbPath = join(dataDir, 'memory.db');
129
130
  try {
130
131
  const db = new Database(dbPath);
131
- db.pragma('journal_mode = WAL');
132
+ // busy_timeout first; the WAL switch retries within it (#1164).
132
133
  db.pragma('busy_timeout = 5000');
134
+ setJournalModeWithRetry(db, 'WAL', 5000);
133
135
  db.exec(`
134
136
  CREATE TABLE IF NOT EXISTS kv_store (
135
137
  key TEXT NOT NULL,