agentic-qe 3.15.14 → 3.15.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (513) hide show
  1. package/.claude/agents/v3/templates/qx-report-template.html +1 -1
  2. package/.claude/skills/skills-manifest.json +1 -1
  3. package/CHANGELOG.md +136 -0
  4. package/assets/agents/v3/templates/qx-report-template.html +1 -1
  5. package/assets/skills/skills-manifest.json +1 -1
  6. package/dist/audit/witness-chain.d.ts +7 -0
  7. package/dist/audit/witness-chain.js +10 -0
  8. package/dist/cli/bundle.js +6 -6
  9. package/dist/cli/chunks/adapter-6CQ2PIP5.js +2 -0
  10. package/dist/cli/chunks/agent-booster-wasm-45NWEKVS.js +2 -0
  11. package/dist/cli/chunks/{agent-handler-P3IY7XEE.js → agent-handler-LVHMYFEF.js} +2 -2
  12. package/dist/cli/chunks/{agent-memory-branch-WWKC2H3G.js → agent-memory-branch-YDWOJFEQ.js} +2 -2
  13. package/dist/cli/chunks/aqe-learning-engine-73RR52VS.js +2 -0
  14. package/dist/cli/chunks/{arena-EIV5OALF.js → arena-CZKHXDDS.js} +2 -2
  15. package/dist/cli/chunks/{arena-4BMFF6BS.js → arena-ELDZH3CZ.js} +4 -4
  16. package/dist/cli/chunks/{audit-DNTI453H.js → audit-5MT4T47Z.js} +3 -3
  17. package/dist/cli/chunks/base-SMCMMVGP.js +2 -0
  18. package/dist/cli/chunks/{better-sqlite3-TQBQGNC6.js → better-sqlite3-6TGYPC2B.js} +2 -2
  19. package/dist/cli/chunks/{brain-handler-HY57CNAO.js → brain-handler-HQWZFO52.js} +3 -3
  20. package/dist/cli/chunks/{branch-enumerator-THPMZPHQ.js → branch-enumerator-WVILM4SO.js} +2 -2
  21. package/dist/cli/chunks/{browser-O6JJOZCK.js → browser-RX5ALU3H.js} +2 -2
  22. package/dist/cli/chunks/browser-workflow-A2MEZ66K.js +2 -0
  23. package/dist/cli/chunks/{chunk-CIINJHOX.js → chunk-24OX5TQJ.js} +1 -1
  24. package/dist/cli/chunks/{chunk-6P4Q4RTC.js → chunk-24QHCVX6.js} +1 -1
  25. package/dist/cli/chunks/{chunk-U6IOQKCT.js → chunk-2H4XH6FT.js} +2 -2
  26. package/dist/cli/chunks/{chunk-OGEIHS76.js → chunk-2YZ4G6NW.js} +1 -1
  27. package/dist/cli/chunks/chunk-32BPDLRZ.js +27 -0
  28. package/dist/cli/chunks/{chunk-5PLBQZ5J.js → chunk-32GN3JKR.js} +1 -1
  29. package/dist/cli/chunks/{chunk-AJVLVF7V.js → chunk-3HD7E6HN.js} +2 -2
  30. package/dist/cli/chunks/{chunk-X7CUI7KH.js → chunk-4D4DENG6.js} +2 -2
  31. package/dist/cli/chunks/{chunk-E2JLAW3U.js → chunk-4LQFBY5L.js} +6 -6
  32. package/dist/cli/chunks/{chunk-E3QIQMMN.js → chunk-4NFQLP6R.js} +1 -1
  33. package/dist/cli/chunks/{chunk-7Y3LXH57.js → chunk-525CFDUE.js} +2 -2
  34. package/dist/cli/chunks/chunk-5B5QPCNU.js +65 -0
  35. package/dist/cli/chunks/{chunk-X6Q2N5S5.js → chunk-5JZRZI4S.js} +2 -2
  36. package/dist/cli/chunks/{chunk-MB4UKUBV.js → chunk-5LAVKGLH.js} +2 -2
  37. package/dist/cli/chunks/chunk-5NNNEWLS.js +755 -0
  38. package/dist/cli/chunks/{chunk-NKOLILT7.js → chunk-5PBLPQ5T.js} +2 -2
  39. package/dist/cli/chunks/chunk-5QO3R3TU.js +6 -0
  40. package/dist/cli/chunks/{chunk-7T6L3LFN.js → chunk-5SPCGMBB.js} +2 -2
  41. package/dist/cli/chunks/{chunk-2QLE6NDW.js → chunk-5V3TI2LG.js} +1 -1
  42. package/dist/cli/chunks/{chunk-A2T56XVL.js → chunk-5VZL4UVN.js} +2 -2
  43. package/dist/cli/chunks/{chunk-TWOV3I3A.js → chunk-63GMRQ25.js} +1 -1
  44. package/dist/cli/chunks/{chunk-YGOSSVY5.js → chunk-63ZKI4PX.js} +6 -6
  45. package/dist/cli/chunks/{chunk-FHPNWHY7.js → chunk-67Z5R7RJ.js} +2 -2
  46. package/dist/cli/chunks/{chunk-PCQZIAXB.js → chunk-6DPYNAOK.js} +2 -2
  47. package/dist/cli/chunks/{chunk-WCM6WE7G.js → chunk-6ICX3FEG.js} +3 -3
  48. package/dist/cli/chunks/{chunk-JB7R77SH.js → chunk-6XXZDV2C.js} +2 -2
  49. package/dist/cli/chunks/{chunk-FJOIBZUB.js → chunk-6ZBXSOX6.js} +2 -2
  50. package/dist/cli/chunks/{chunk-WZQADC5R.js → chunk-72XSEQMW.js} +2 -2
  51. package/dist/cli/chunks/{chunk-AYLEH2UF.js → chunk-7TE5ONQQ.js} +1 -1
  52. package/dist/cli/chunks/{chunk-7QUSNBAA.js → chunk-A5GBXCP5.js} +2 -2
  53. package/dist/cli/chunks/{chunk-7724KXM2.js → chunk-AAMLQ2LF.js} +3 -3
  54. package/dist/cli/chunks/chunk-AG2EWGXS.js +21 -0
  55. package/dist/cli/chunks/{chunk-2UZBLC5H.js → chunk-AGRV5B3T.js} +2 -2
  56. package/dist/cli/chunks/{chunk-V6SE2ZU2.js → chunk-AJMJNQMP.js} +1 -1
  57. package/dist/cli/chunks/{chunk-2HPNGK7A.js → chunk-AR67RJPY.js} +2 -2
  58. package/dist/cli/chunks/{chunk-G7HGUQAE.js → chunk-ASEOFRIG.js} +2 -2
  59. package/dist/cli/chunks/{chunk-7TH4PJSU.js → chunk-BEKDKVQT.js} +2 -2
  60. package/dist/cli/chunks/{chunk-M5JEA6ZY.js → chunk-BY5OF7OH.js} +2 -2
  61. package/dist/cli/chunks/{chunk-OLUOVNUF.js → chunk-C5FP5GW3.js} +2 -2
  62. package/dist/cli/chunks/{chunk-R5RRWLRI.js → chunk-C6D5AHBO.js} +2 -2
  63. package/dist/cli/chunks/{chunk-K7GFYFBO.js → chunk-CAKMOVZ6.js} +2 -2
  64. package/dist/cli/chunks/{chunk-6NIGSY5L.js → chunk-CEYSYSK5.js} +2 -2
  65. package/dist/cli/chunks/{chunk-U4TML2VD.js → chunk-CGGUM2YJ.js} +2 -2
  66. package/dist/cli/chunks/{chunk-YE54T2NQ.js → chunk-CJSHWQXP.js} +2 -2
  67. package/dist/cli/chunks/{chunk-7SQTLUEN.js → chunk-CRPIYUTJ.js} +2 -2
  68. package/dist/cli/chunks/{chunk-65EE2EST.js → chunk-D6COXLYE.js} +2 -2
  69. package/dist/cli/chunks/{chunk-4WLIOPHX.js → chunk-DTMAS2GB.js} +2 -2
  70. package/dist/cli/chunks/{chunk-E7QTWGPI.js → chunk-DVYHMDFR.js} +470 -411
  71. package/dist/cli/chunks/chunk-DXD6K2ZP.js +3 -0
  72. package/dist/cli/chunks/{chunk-HSDWPQQY.js → chunk-E3D4GPLP.js} +3 -3
  73. package/dist/cli/chunks/{chunk-JJHLGGPP.js → chunk-EA4YQVKS.js} +1 -1
  74. package/dist/cli/chunks/{chunk-EIEEST4T.js → chunk-EGYE5UPQ.js} +2 -2
  75. package/dist/cli/chunks/{chunk-O756AOUX.js → chunk-EK7OLYOZ.js} +2 -2
  76. package/dist/cli/chunks/{chunk-57DRT6UA.js → chunk-F742SZAX.js} +2 -2
  77. package/dist/cli/chunks/{chunk-6OI5SK7M.js → chunk-FBDVGRSC.js} +1 -1
  78. package/dist/cli/chunks/{chunk-H3C5FJRH.js → chunk-FDDC72IA.js} +2 -2
  79. package/dist/cli/chunks/{chunk-IQRPR4KB.js → chunk-FL64OUBA.js} +2 -2
  80. package/dist/cli/chunks/{chunk-BNG4J3CE.js → chunk-FLNAW7C4.js} +2 -2
  81. package/dist/cli/chunks/{chunk-C3OIBFAA.js → chunk-G5RHFBAY.js} +2 -2
  82. package/dist/cli/chunks/{chunk-NPCXGX7N.js → chunk-GAHNO6JJ.js} +2 -2
  83. package/dist/cli/chunks/{chunk-PNRPVQGI.js → chunk-GFWHUQSF.js} +2 -2
  84. package/dist/cli/chunks/{chunk-OCN53CCK.js → chunk-GJYHWYXR.js} +2 -2
  85. package/dist/cli/chunks/{chunk-5Z4MO2F3.js → chunk-GQ6TUIKY.js} +1 -1
  86. package/dist/cli/chunks/{chunk-N736GLWZ.js → chunk-GSKMOPL7.js} +2 -2
  87. package/dist/cli/chunks/{chunk-43XHGWYH.js → chunk-HCH4Y6XX.js} +2 -2
  88. package/dist/cli/chunks/{chunk-QP6GL3O5.js → chunk-HGWXF45W.js} +1 -1
  89. package/dist/cli/chunks/{chunk-PGN4TARY.js → chunk-HJ6ZGVTB.js} +2 -2
  90. package/dist/cli/chunks/{chunk-M2TG7VDK.js → chunk-HLUXXCHF.js} +1 -1
  91. package/dist/cli/chunks/{chunk-UMHFTQTR.js → chunk-HVRRLYX6.js} +4 -4
  92. package/dist/cli/chunks/{chunk-L7PC675Y.js → chunk-I7MQIM2U.js} +1 -1
  93. package/dist/cli/chunks/{chunk-JSSU4RIK.js → chunk-IESR7TNB.js} +2 -2
  94. package/dist/cli/chunks/{chunk-H4LYXLAT.js → chunk-IHRXZZQM.js} +1 -1
  95. package/dist/cli/chunks/{chunk-HV43NX4A.js → chunk-IOKYCMTJ.js} +6 -6
  96. package/dist/cli/chunks/{chunk-NZQYJCO6.js → chunk-IOQ6ZQ5W.js} +1 -1
  97. package/dist/cli/chunks/{chunk-JO26SG47.js → chunk-IOYG4VFL.js} +2 -2
  98. package/dist/cli/chunks/{chunk-6O63ZTVX.js → chunk-IUBJVHNB.js} +2 -2
  99. package/dist/cli/chunks/{chunk-XSPMLJCQ.js → chunk-J442IZLE.js} +1 -1
  100. package/dist/cli/chunks/{chunk-LTGQJYYO.js → chunk-J4ELZNLY.js} +2 -2
  101. package/dist/cli/chunks/chunk-J7I6PABJ.js +153 -0
  102. package/dist/cli/chunks/chunk-JDIYMZCQ.js +2 -0
  103. package/dist/cli/chunks/{chunk-TOJF3ZG4.js → chunk-JHQCRRJI.js} +2 -2
  104. package/dist/cli/chunks/{chunk-QUZ745UQ.js → chunk-JQ3DYUMS.js} +2 -2
  105. package/dist/cli/chunks/{chunk-P2TPH3TC.js → chunk-KITOPKRG.js} +2 -2
  106. package/dist/cli/chunks/{chunk-QNQE3EOH.js → chunk-KKU2QGSJ.js} +2 -2
  107. package/dist/cli/chunks/chunk-KL7OKSU2.js +4 -0
  108. package/dist/cli/chunks/{chunk-L5VSLPMW.js → chunk-KNSRL6NO.js} +2 -2
  109. package/dist/cli/chunks/{chunk-INGXD5IX.js → chunk-KPRCB5LT.js} +2 -2
  110. package/dist/cli/chunks/{chunk-GY4P7KAI.js → chunk-KQYJ4VQ5.js} +1 -1
  111. package/dist/cli/chunks/{chunk-Z2S7DNFP.js → chunk-KU2AUFGX.js} +2 -2
  112. package/dist/cli/chunks/{chunk-O5CEL447.js → chunk-KVF4NXGQ.js} +2 -2
  113. package/dist/cli/chunks/{chunk-2IJO3657.js → chunk-KXCLACFG.js} +2 -2
  114. package/dist/cli/chunks/{chunk-ZJGFQK27.js → chunk-L2DWPVNJ.js} +1 -1
  115. package/dist/cli/chunks/{chunk-E7OR6V3V.js → chunk-L6QSTQME.js} +2 -2
  116. package/dist/cli/chunks/{chunk-RE6JTSDM.js → chunk-LE4QJREF.js} +1 -1
  117. package/dist/cli/chunks/{chunk-DSQESXL4.js → chunk-LKTTUHLF.js} +2 -2
  118. package/dist/cli/chunks/{chunk-YGC5QKQ4.js → chunk-LQLPB2T6.js} +2 -2
  119. package/dist/cli/chunks/{chunk-VGZOPQQY.js → chunk-LRSX2FJM.js} +1 -1
  120. package/dist/cli/chunks/chunk-M4FRQ4TE.js +12 -0
  121. package/dist/cli/chunks/chunk-M7WJCTG3.js +2 -0
  122. package/dist/cli/chunks/{chunk-56NSE3LJ.js → chunk-MAFQV4U4.js} +2 -2
  123. package/dist/cli/chunks/{chunk-MKYOE7NE.js → chunk-MD43XRX5.js} +1 -1
  124. package/dist/cli/chunks/{chunk-3TF27MG5.js → chunk-MI5MFHRA.js} +2 -2
  125. package/dist/cli/chunks/{chunk-JK6PMLQQ.js → chunk-MO55CVMT.js} +32 -32
  126. package/dist/cli/chunks/{chunk-X6NJOT3V.js → chunk-N7HL5PHH.js} +1 -1
  127. package/dist/cli/chunks/chunk-NAEWCFQT.js +14 -0
  128. package/dist/cli/chunks/{chunk-WUGXXNK4.js → chunk-NDJ7P2EP.js} +1 -1
  129. package/dist/cli/chunks/{chunk-D5GB5PUU.js → chunk-NO3IV5Q5.js} +1 -1
  130. package/dist/cli/chunks/{chunk-3XACRXBY.js → chunk-NQXXI77K.js} +2 -2
  131. package/dist/cli/chunks/{chunk-EC65UZ77.js → chunk-NVEWF4JV.js} +1 -1
  132. package/dist/cli/chunks/{chunk-JI67T6Q2.js → chunk-NZU4ACBZ.js} +2 -2
  133. package/dist/cli/chunks/chunk-O5W3FIO6.js +63 -0
  134. package/dist/cli/chunks/{chunk-YEFTK4HD.js → chunk-OAEE6JWQ.js} +2 -2
  135. package/dist/cli/chunks/{chunk-JAOCHPYX.js → chunk-OCV2XEWQ.js} +2 -2
  136. package/dist/cli/chunks/{chunk-IDBA5GK2.js → chunk-P3EYRILV.js} +2 -2
  137. package/dist/cli/chunks/{chunk-4RPBODN5.js → chunk-PEQDY4BO.js} +2 -2
  138. package/dist/cli/chunks/{chunk-CPPYZYXC.js → chunk-PF7RBAYL.js} +2 -2
  139. package/dist/cli/chunks/{chunk-WCPSR4MJ.js → chunk-PHT5N7SC.js} +2 -2
  140. package/dist/cli/chunks/{chunk-O2AAYJUV.js → chunk-PINSJCM3.js} +1 -1
  141. package/dist/cli/chunks/{chunk-HEDGFKC5.js → chunk-PPUZWYUG.js} +2 -2
  142. package/dist/cli/chunks/{chunk-XMCSKYDE.js → chunk-QPEOLAAS.js} +1 -1
  143. package/dist/cli/chunks/{chunk-7MUO4DEH.js → chunk-QQWBWEJS.js} +18 -18
  144. package/dist/cli/chunks/{chunk-UFP7SN5V.js → chunk-QVDCVD5D.js} +2 -2
  145. package/dist/cli/chunks/{chunk-NHEG2DLN.js → chunk-RJIEG3NA.js} +2 -2
  146. package/dist/cli/chunks/{chunk-KJ5A54ZH.js → chunk-RV74I3YO.js} +2 -2
  147. package/dist/cli/chunks/{chunk-UDSB3XCG.js → chunk-S75SOOZL.js} +2 -2
  148. package/dist/cli/chunks/{chunk-BPDAQB3F.js → chunk-SASBO5Y5.js} +2 -2
  149. package/dist/cli/chunks/{chunk-VJBJRFUO.js → chunk-SDLWKRVL.js} +9 -9
  150. package/dist/cli/chunks/{chunk-J6ASX536.js → chunk-SHKOCGNK.js} +2 -2
  151. package/dist/cli/chunks/{chunk-J35JWDJE.js → chunk-SI6DPU5D.js} +1 -1
  152. package/dist/cli/chunks/{chunk-V3MGY76S.js → chunk-SJ6Y4725.js} +2 -2
  153. package/dist/cli/chunks/{chunk-FTYRPEJS.js → chunk-SR52XP5F.js} +1 -1
  154. package/dist/cli/chunks/{chunk-ZUE524JL.js → chunk-SSUAAX3F.js} +2 -2
  155. package/dist/cli/chunks/{chunk-VG32EEUG.js → chunk-SSYAQZXA.js} +2 -2
  156. package/dist/cli/chunks/{chunk-HTVGHHX2.js → chunk-SUDMM5SO.js} +2 -2
  157. package/dist/cli/chunks/{chunk-K2SMP4OD.js → chunk-TIUKLYAI.js} +1 -1
  158. package/dist/cli/chunks/{chunk-VCVRZD4Y.js → chunk-TVGI32MB.js} +33 -33
  159. package/dist/cli/chunks/{chunk-CAZM63TP.js → chunk-U2A7NHZA.js} +2 -2
  160. package/dist/cli/chunks/{chunk-WBC6WB32.js → chunk-UE5ZOZR2.js} +2 -2
  161. package/dist/cli/chunks/{chunk-BQJ7CV53.js → chunk-UHEOGZLX.js} +12 -12
  162. package/dist/cli/chunks/chunk-UNGBRZDK.js +12 -0
  163. package/dist/cli/chunks/{chunk-XN3KCKAM.js → chunk-V5NHZV7S.js} +2 -2
  164. package/dist/cli/chunks/{chunk-UNYTHZDZ.js → chunk-VJCIEHEF.js} +1 -1
  165. package/dist/cli/chunks/{chunk-5Y7UFHJD.js → chunk-VMDFFTCK.js} +1 -1
  166. package/dist/cli/chunks/chunk-VSIKHWZ4.js +29 -0
  167. package/dist/cli/chunks/{chunk-UPWLMIDY.js → chunk-VWPM27GU.js} +2 -2
  168. package/dist/cli/chunks/{chunk-USAKCGHC.js → chunk-VXFLJNCA.js} +2 -2
  169. package/dist/cli/chunks/{chunk-WKI46WWN.js → chunk-W5HQUIML.js} +2 -2
  170. package/dist/cli/chunks/{chunk-Z54G2YOL.js → chunk-WP4RETKG.js} +2 -2
  171. package/dist/cli/chunks/{chunk-IRPNEXOU.js → chunk-XIIQ5QTT.js} +2 -2
  172. package/dist/cli/chunks/{chunk-O32BFQV4.js → chunk-XIQW7EFL.js} +2 -2
  173. package/dist/cli/chunks/{chunk-TW6Z6W4X.js → chunk-XWUWX7BV.js} +13 -13
  174. package/dist/cli/chunks/{chunk-57FX3GP6.js → chunk-Y4PFUMOU.js} +1 -1
  175. package/dist/cli/chunks/chunk-YAPLJR7K.js +2 -0
  176. package/dist/cli/chunks/{chunk-4T7XV5KQ.js → chunk-YLMNVLDK.js} +1 -1
  177. package/dist/cli/chunks/{chunk-TSP6SU5V.js → chunk-YNMJEDN5.js} +2 -2
  178. package/dist/cli/chunks/{chunk-PWQWKYBG.js → chunk-YPBSUGMI.js} +1 -1
  179. package/dist/cli/chunks/{chunk-QP2HLKTS.js → chunk-YRAX7SFJ.js} +2 -2
  180. package/dist/cli/chunks/{chunk-O3ERGUXH.js → chunk-YTHTQPWR.js} +1 -1
  181. package/dist/cli/chunks/{chunk-MR2OPUSA.js → chunk-YU2BDRSD.js} +1 -1
  182. package/dist/cli/chunks/chunk-ZB3LEFYG.js +2 -0
  183. package/dist/cli/chunks/{chunk-2W5MQDHM.js → chunk-ZFL436FN.js} +2 -2
  184. package/dist/cli/chunks/{chunk-7MISCSL5.js → chunk-ZJH5MU2I.js} +2 -2
  185. package/dist/cli/chunks/{chunk-52KOPIMI.js → chunk-ZQ2XW3IP.js} +2 -2
  186. package/dist/cli/chunks/chunk-ZR2TKVXQ.js +14 -0
  187. package/dist/cli/chunks/{ci-UMA2SMNW.js → ci-MFUR4CWV.js} +2 -2
  188. package/dist/cli/chunks/{ci-config-UQSILJFQ.js → ci-config-PNDLQ6XV.js} +2 -2
  189. package/dist/cli/chunks/{ci-output-U6YZLLKH.js → ci-output-PFZ4M7NC.js} +2 -2
  190. package/dist/cli/chunks/{circuit-breaker-ATYQP6X2.js → circuit-breaker-5HH6NLZN.js} +2 -2
  191. package/dist/cli/chunks/{claude-flow-setup-6YHFD7AN.js → claude-flow-setup-QCKYLGLC.js} +2 -2
  192. package/dist/cli/chunks/client-MHQRTZM4.js +2 -0
  193. package/dist/cli/chunks/{cline-installer-EPE7IOZE.js → cline-installer-EASVPFXR.js} +2 -2
  194. package/dist/cli/chunks/{code-NUEJ4XYO.js → code-UJXDVYRK.js} +4 -3
  195. package/dist/cli/chunks/{code-index-extractor-D4DBT6OL.js → code-index-extractor-BZJ3UDP4.js} +2 -2
  196. package/dist/cli/chunks/{codex-installer-633SM4LR.js → codex-installer-XSQZUVOZ.js} +4 -4
  197. package/dist/cli/chunks/{completions-WUKVIW3L.js → completions-OWOOJFI2.js} +2 -2
  198. package/dist/cli/chunks/{complexity-analyzer-F73ACR5H.js → complexity-analyzer-KP5TOHDT.js} +2 -2
  199. package/dist/cli/chunks/{continuedev-installer-QH42TKMS.js → continuedev-installer-IFKQXLHM.js} +2 -2
  200. package/dist/cli/chunks/{copilot-installer-Y3XC7BTT.js → copilot-installer-IGJ6KGQY.js} +2 -2
  201. package/dist/cli/chunks/core-handlers-UAK3LLJE.js +2 -0
  202. package/dist/cli/chunks/{cost-tracker-57QPV7E3.js → cost-tracker-MMDDNKZB.js} +2 -2
  203. package/dist/cli/chunks/{coverage-IBCHMBCR.js → coverage-LUH2B7NT.js} +3 -3
  204. package/dist/cli/chunks/cross-domain-router-WTRZQPNQ.js +2 -0
  205. package/dist/cli/chunks/{cursor-installer-F4UYQHIN.js → cursor-installer-4YLM5GWM.js} +2 -2
  206. package/dist/cli/chunks/daemon-CAVZ7OFV.js +18 -0
  207. package/dist/cli/chunks/{daemon-XR4Q6YZF.js → daemon-MZKVM4CJ.js} +3 -3
  208. package/dist/cli/chunks/{dag-attention-scheduler-ZR5ZD3TW.js → dag-attention-scheduler-X4CYW665.js} +2 -2
  209. package/dist/cli/chunks/{detect-GEGYURLL.js → detect-7BM2XINO.js} +2 -2
  210. package/dist/cli/chunks/{dist-node-JU3KT2JO.js → dist-node-Y5APLEYB.js} +2 -2
  211. package/dist/cli/chunks/{domain-handler-7QI3FJGE.js → domain-handler-X3ZRJNAH.js} +2 -2
  212. package/dist/cli/chunks/{domain-plugins-O2YRM2PD.js → domain-plugins-2UW5KQJB.js} +2 -2
  213. package/dist/cli/chunks/{domain-transfer-7J3S2OS6.js → domain-transfer-35W4CIBV.js} +2 -2
  214. package/dist/cli/chunks/dream-EJY24JN6.js +2 -0
  215. package/dist/cli/chunks/embed-and-insert-pattern-COG4C7ZI.js +3 -0
  216. package/dist/cli/chunks/embedding-space-SBM2MZD2.js +2 -0
  217. package/dist/cli/chunks/{eval-RVMCIUOR.js → eval-4QA2SROK.js} +2 -2
  218. package/dist/cli/chunks/experience-capture-middleware-Z6BF6KYM.js +40 -0
  219. package/dist/cli/chunks/{fast-paths-QUKPKWKZ.js → fast-paths-FIORX6GN.js} +2 -2
  220. package/dist/cli/chunks/{feature-flags-K7JXNKJI.js → feature-flags-6LYI2T4G.js} +2 -2
  221. package/dist/cli/chunks/{feature-flags-5JCSKL2P.js → feature-flags-ZOO7LMIC.js} +2 -2
  222. package/dist/cli/chunks/file-discovery-UZSFSS4V.js +2 -0
  223. package/dist/cli/chunks/{fleet-II4Q6HXK.js → fleet-7WF53H4F.js} +3 -3
  224. package/dist/cli/chunks/{gnn-wrapper-M7VO2EMS.js → gnn-wrapper-KJ6B7BRM.js} +2 -2
  225. package/dist/cli/chunks/{heartbeat-handler-ND5CY26N.js → heartbeat-handler-DEKKMOVW.js} +4 -4
  226. package/dist/cli/chunks/heartbeat-scheduler-NVR356I7.js +2 -0
  227. package/dist/cli/chunks/hnsw-adapter-LFMPLUJU.js +2 -0
  228. package/dist/cli/chunks/hnsw-index-POCPMVJH.js +2 -0
  229. package/dist/cli/chunks/{hnsw-legacy-bridge-N3AUUUU7.js → hnsw-legacy-bridge-L27WS27N.js} +2 -2
  230. package/dist/cli/chunks/{hnswlib-node-NZY3E5EN.js → hnswlib-node-4YOQC6L4.js} +2 -2
  231. package/dist/cli/chunks/{hooks-QVJDTII5.js → hooks-TAOKV4EJ.js} +23 -22
  232. package/dist/cli/chunks/hybrid-backend-4STAO7CV.js +2 -0
  233. package/dist/cli/chunks/{hypergraph-engine-ZRY6MTDV.js → hypergraph-engine-BODRJLHL.js} +2 -2
  234. package/dist/cli/chunks/{hypergraph-handler-56DO4XZQ.js → hypergraph-handler-RKMYJNTU.js} +3 -3
  235. package/dist/cli/chunks/impact-analyzer-3VIIISBQ.js +2 -0
  236. package/dist/cli/chunks/{init-guard-DTF4EVUY.js → init-guard-MXHSLSB2.js} +2 -2
  237. package/dist/cli/chunks/{init-handler-M6CNQHMX.js → init-handler-HUE57IFW.js} +6 -6
  238. package/dist/cli/chunks/init-wizard-PL6QN6RQ.js +2 -0
  239. package/dist/cli/chunks/kernel-CCDWT7KS.js +2 -0
  240. package/dist/cli/chunks/{kilocode-installer-IJN7XKBH.js → kilocode-installer-S333IKYQ.js} +2 -2
  241. package/dist/cli/chunks/{kiro-installer-UKKPGPDC.js → kiro-installer-WM5DLQWC.js} +2 -2
  242. package/dist/cli/chunks/knowledge-graph-KFOMEN3H.js +2 -0
  243. package/dist/cli/chunks/{learning-W2HETWQ4.js → learning-LNHMQLH5.js} +3 -3
  244. package/dist/cli/chunks/{llm-router-Y546K4VX.js → llm-router-EWFXYZZR.js} +4 -4
  245. package/dist/cli/chunks/llm-router-service-7NBE2EX6.js +2 -0
  246. package/dist/cli/chunks/{load-MKAB2AXE.js → load-FGYGWVDK.js} +2 -2
  247. package/dist/cli/chunks/load-test-UNZUWY3F.js +2 -0
  248. package/dist/cli/chunks/{mcp-AZKUS6K3.js → mcp-2FHNAAOM.js} +2 -2
  249. package/dist/cli/chunks/{memory-ZDOQN2KU.js → memory-DZMQ73AB.js} +5 -5
  250. package/dist/cli/chunks/memory-backend-DFGKWA2Q.js +2 -0
  251. package/dist/cli/chunks/memory-handlers-MP426XRJ.js +2 -0
  252. package/dist/cli/chunks/{multi-model-executor-WWVXDHG4.js → multi-model-executor-6F2UAEUW.js} +2 -2
  253. package/dist/cli/chunks/{opencode-installer-YUJNXXWS.js → opencode-installer-XY3BGOTZ.js} +2 -2
  254. package/dist/cli/chunks/{orchestrator-Z6PWPLRE.js → orchestrator-B4CNKUOS.js} +17 -17
  255. package/dist/cli/chunks/pattern-null-store-SSVF5TE5.js +2 -0
  256. package/dist/cli/chunks/{pattern-usage-recorder-TPWPX32U.js → pattern-usage-recorder-R4GUFNMD.js} +2 -2
  257. package/dist/cli/chunks/{pipeline-4BBGTE4M.js → pipeline-FG5RKVRO.js} +2 -2
  258. package/dist/cli/chunks/{platform-5GSHXCV5.js → platform-3BT4KEVJ.js} +2 -2
  259. package/dist/cli/chunks/{plugin-OFDVF5HS.js → plugin-WI4RIN7O.js} +2 -2
  260. package/dist/cli/chunks/{prime-radiant-advanced-wasm-NC6MUYGJ.js → prime-radiant-advanced-wasm-7ECDNQFS.js} +2 -2
  261. package/dist/cli/chunks/project-root-BEANNYWU.js +2 -0
  262. package/dist/cli/chunks/protocol-executor-FQVIHXZ7.js +2 -0
  263. package/dist/cli/chunks/{protocol-handler-MPOAAEPA.js → protocol-handler-WNODKPGW.js} +2 -2
  264. package/dist/cli/chunks/{prove-CDKMAIVM.js → prove-5RHAEPYZ.js} +2 -2
  265. package/dist/cli/chunks/qe-reasoning-bank-5TFYSE24.js +2 -0
  266. package/dist/cli/chunks/{quality-ZH4F7R7R.js → quality-WPHR7BGQ.js} +2 -2
  267. package/dist/cli/chunks/{quality-gate-IDRMW6OE.js → quality-gate-4RKTEZMX.js} +3 -3
  268. package/dist/cli/chunks/queen-coordinator-Y2OUL7IN.js +2 -0
  269. package/dist/cli/chunks/real-embeddings-OXLYU7JW.js +2 -0
  270. package/dist/cli/chunks/{ref-validation-Z5GCGVXK.js → ref-validation-TPAWHOHH.js} +2 -2
  271. package/dist/cli/chunks/{roocode-installer-IZ2S7PH2.js → roocode-installer-7AVHFNDI.js} +2 -2
  272. package/dist/cli/chunks/router-EP34O3KB.js +2 -0
  273. package/dist/cli/chunks/routing-feedback-FJCRKXNG.js +2 -0
  274. package/dist/cli/chunks/{routing-handler-NAX35VUW.js → routing-handler-YKEDVJSH.js} +2 -2
  275. package/dist/cli/chunks/{ruvector-commands-5YW2SOFF.js → ruvector-commands-JUAMM354.js} +2 -2
  276. package/dist/cli/chunks/rvf-dual-writer-ILITJSFG.js +2 -0
  277. package/dist/cli/chunks/rvf-migration-adapter-XF6W4C2N.js +2 -0
  278. package/dist/cli/chunks/rvf-migration-coordinator-CMKG56AR.js +2 -0
  279. package/dist/cli/chunks/rvf-native-adapter-7YFW6S4Y.js +2 -0
  280. package/dist/cli/chunks/{rvf-store-integrity-IPGCAT6C.js → rvf-store-integrity-VJDUIRTX.js} +2 -2
  281. package/dist/cli/chunks/safe-db-TCAU4FUT.js +2 -0
  282. package/dist/cli/chunks/schedule-NB5KV435.js +2 -0
  283. package/dist/cli/chunks/scheduler-JKXGKVK6.js +2 -0
  284. package/dist/cli/chunks/{security-3IH4BO5Z.js → security-ORDN3RD2.js} +3 -3
  285. package/dist/cli/chunks/{shared-rvf-adapter-ABY7PAY2.js → shared-rvf-adapter-CF4BCIO7.js} +2 -2
  286. package/dist/cli/chunks/{shared-rvf-dual-writer-6KENLN2W.js → shared-rvf-dual-writer-C32UBR6D.js} +2 -2
  287. package/dist/cli/chunks/sqlite-persistence-IXCNZRTW.js +2 -0
  288. package/dist/cli/chunks/{standalone-memory-RLFAUGOW.js → standalone-memory-OXRJYZXN.js} +2 -2
  289. package/dist/cli/chunks/{status-handler-FCOZBPE5.js → status-handler-BCX5D4HY.js} +2 -2
  290. package/dist/cli/chunks/{structural-health-4RDA5UUM.js → structural-health-LFG7RUU6.js} +2 -2
  291. package/dist/cli/chunks/sync-OSF7C2NL.js +2 -0
  292. package/dist/cli/chunks/{sync-KGEEXXCC.js → sync-YJEE2K2L.js} +2 -2
  293. package/dist/cli/chunks/task-handler-6LXKPTXJ.js +64 -0
  294. package/dist/cli/chunks/{task-handlers-6H7L2UT4.js → task-handlers-CILP36I7.js} +4 -4
  295. package/dist/cli/chunks/{test-S7IG6EIX.js → test-SD457QJ6.js} +4 -4
  296. package/dist/cli/chunks/test-runner-process-VKD65QQU.js +2 -0
  297. package/dist/cli/chunks/{test-scheduling-7XYXI4L2.js → test-scheduling-ISI2O4Q5.js} +3 -3
  298. package/dist/cli/chunks/token-bootstrap-VUELSBOS.js +2 -0
  299. package/dist/cli/chunks/{token-usage-Y2YTPOFE.js → token-usage-XOC5KG7S.js} +2 -2
  300. package/dist/cli/chunks/{transformers-UCJ3HHHC.js → transformers-LSLQAARK.js} +2 -2
  301. package/dist/cli/chunks/tree-sitter-wasm-parser-YAIPHRIL.js +2 -0
  302. package/dist/cli/chunks/{types-6CMFPETH.js → types-5BLCGLCR.js} +2 -2
  303. package/dist/cli/chunks/unified-memory-GI76TXFV.js +2 -0
  304. package/dist/cli/chunks/unified-memory-hnsw-GXJ5BTZO.js +2 -0
  305. package/dist/cli/chunks/unified-persistence-OP7FDQPD.js +2 -0
  306. package/dist/cli/chunks/{upgrade-K25DN6WU.js → upgrade-RQJYLK3J.js} +2 -2
  307. package/dist/cli/chunks/{validate-T4V3TBY3.js → validate-QBHWXXCK.js} +2 -2
  308. package/dist/cli/chunks/{validate-swarm-XSRC576T.js → validate-swarm-IKXBKFB5.js} +2 -2
  309. package/dist/cli/chunks/visual-security-GZ2MOKWB.js +2 -0
  310. package/dist/cli/chunks/{web-tree-sitter-YOZXHRTN.js → web-tree-sitter-ZF6FIE5R.js} +2 -2
  311. package/dist/cli/chunks/{windsurf-installer-ITPU2IYL.js → windsurf-installer-HQGDZT5D.js} +2 -2
  312. package/dist/cli/chunks/witness-chain-DCHCAMSQ.js +2 -0
  313. package/dist/cli/chunks/witness-chain-P3XXXA62.js +2 -0
  314. package/dist/cli/chunks/witness-chain-repair-PUX2NFDL.js +2 -0
  315. package/dist/cli/chunks/{witness-chain-verifier-DTDSVKOG.js → witness-chain-verifier-PX2OQ6XT.js} +2 -2
  316. package/dist/cli/chunks/{witness-key-manager-EWACWGAW.js → witness-key-manager-RXYQNFJB.js} +2 -2
  317. package/dist/cli/chunks/{workflow-ZIQ4FV42.js → workflow-FBKCA4H6.js} +4 -4
  318. package/dist/cli/chunks/workflow-orchestrator-P2APAJAA.js +2 -0
  319. package/dist/cli/chunks/wrappers-TWSKBTWD.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/handlers/task-handler.d.ts +5 -0
  323. package/dist/cli/handlers/task-handler.js +21 -1
  324. package/dist/cli/utils/task-result.d.ts +11 -0
  325. package/dist/cli/utils/task-result.js +39 -0
  326. package/dist/coordination/handlers/test-execution-handlers.js +92 -58
  327. package/dist/coordination/mincut/mincut-persistence.js +29 -25
  328. package/dist/domains/code-intelligence/coordinator.d.ts +4 -0
  329. package/dist/domains/code-intelligence/coordinator.js +46 -13
  330. package/dist/domains/code-intelligence/interfaces.d.ts +10 -1
  331. package/dist/domains/code-intelligence/services/semantic-analyzer.d.ts +32 -7
  332. package/dist/domains/code-intelligence/services/semantic-analyzer.js +112 -53
  333. package/dist/domains/learning-optimization/services/learning-coordinator.js +1 -1
  334. package/dist/domains/quality-assessment/coordinator.js +2 -1
  335. package/dist/domains/test-execution/coordinator.js +10 -5
  336. package/dist/domains/test-execution/interfaces.d.ts +12 -0
  337. package/dist/domains/test-execution/plugin.js +6 -2
  338. package/dist/domains/test-execution/services/retry-handler.d.ts +2 -0
  339. package/dist/domains/test-execution/services/retry-handler.js +14 -9
  340. package/dist/domains/test-execution/services/test-executor.d.ts +1 -0
  341. package/dist/domains/test-execution/services/test-executor.js +28 -9
  342. package/dist/domains/visual-accessibility/coordinator.d.ts +15 -7
  343. package/dist/domains/visual-accessibility/coordinator.js +15 -7
  344. package/dist/domains/visual-accessibility/interfaces.d.ts +27 -3
  345. package/dist/domains/visual-accessibility/services/accessibility-contrast.d.ts +39 -0
  346. package/dist/domains/visual-accessibility/services/accessibility-contrast.js +93 -0
  347. package/dist/domains/visual-accessibility/services/accessibility-tester-browser.d.ts +18 -3
  348. package/dist/domains/visual-accessibility/services/accessibility-tester-browser.js +50 -40
  349. package/dist/domains/visual-accessibility/services/accessibility-tester-checks.d.ts +27 -0
  350. package/dist/domains/visual-accessibility/services/accessibility-tester-checks.js +137 -0
  351. package/dist/domains/visual-accessibility/services/accessibility-tester.d.ts +5 -0
  352. package/dist/domains/visual-accessibility/services/accessibility-tester.js +43 -24
  353. package/dist/domains/visual-accessibility/services/browser-swarm-coordinator.d.ts +2 -3
  354. package/dist/domains/visual-accessibility/services/browser-swarm-coordinator.js +8 -14
  355. package/dist/feedback/coverage-learner.js +13 -9
  356. package/dist/feedback/test-outcome-tracker.js +13 -9
  357. package/dist/governance/witness-chain.d.ts +5 -0
  358. package/dist/governance/witness-chain.js +22 -6
  359. package/dist/init/init-wizard-hooks.d.ts +1 -1
  360. package/dist/init/init-wizard-hooks.js +7 -8
  361. package/dist/init/phases/08-mcp.js +9 -0
  362. package/dist/init/settings-merge.d.ts +13 -0
  363. package/dist/init/settings-merge.js +49 -2
  364. package/dist/integrations/agent-booster-wasm/agent_booster_wasm.js +849 -0
  365. package/dist/integrations/agent-booster-wasm/agent_booster_wasm_bg.wasm +0 -0
  366. package/dist/integrations/agent-booster-wasm/index.d.ts +8 -0
  367. package/dist/integrations/agent-booster-wasm/index.js +25 -2
  368. package/dist/integrations/agent-booster-wasm/package.json +16 -0
  369. package/dist/integrations/agentic-flow/reasoning-bank/experience-replay.d.ts +22 -0
  370. package/dist/integrations/agentic-flow/reasoning-bank/experience-replay.js +115 -45
  371. package/dist/integrations/agentic-flow/reasoning-bank/pattern-evolution.d.ts +6 -0
  372. package/dist/integrations/agentic-flow/reasoning-bank/pattern-evolution.js +51 -33
  373. package/dist/integrations/agentic-flow/reasoning-bank/trajectory-tracker.js +17 -9
  374. package/dist/integrations/embeddings/cache/EmbeddingCache.d.ts +8 -0
  375. package/dist/integrations/embeddings/cache/EmbeddingCache.js +24 -10
  376. package/dist/integrations/ruvector/delta-tracker.d.ts +11 -0
  377. package/dist/integrations/ruvector/delta-tracker.js +16 -0
  378. package/dist/integrations/ruvector/sona-persistence.d.ts +10 -0
  379. package/dist/integrations/ruvector/sona-persistence.js +49 -24
  380. package/dist/kernel/unified-memory.d.ts +24 -0
  381. package/dist/kernel/unified-memory.js +63 -8
  382. package/dist/learning/aqe-learning-engine.js +1 -1
  383. package/dist/learning/dream/dream-engine.d.ts +3 -2
  384. package/dist/learning/dream/dream-engine.js +42 -24
  385. package/dist/learning/dream/dream-lock-retry.d.ts +38 -0
  386. package/dist/learning/dream/dream-lock-retry.js +66 -0
  387. package/dist/learning/dream/speculative-dreamer.js +1 -1
  388. package/dist/learning/embed-and-insert-pattern.js +4 -2
  389. package/dist/learning/embedder-endpoint-client.d.ts +31 -0
  390. package/dist/learning/embedder-endpoint-client.js +103 -10
  391. package/dist/learning/embedding-space.d.ts +12 -0
  392. package/dist/learning/embedding-space.js +17 -0
  393. package/dist/learning/experience-capture-middleware.js +25 -13
  394. package/dist/learning/experience-capture.js +1 -1
  395. package/dist/learning/experience-consolidation.d.ts +18 -0
  396. package/dist/learning/experience-consolidation.js +55 -8
  397. package/dist/learning/experience-space-verification.d.ts +71 -0
  398. package/dist/learning/experience-space-verification.js +147 -0
  399. package/dist/learning/pattern-lifecycle.d.ts +40 -4
  400. package/dist/learning/pattern-lifecycle.js +153 -76
  401. package/dist/learning/pattern-null-store.d.ts +5 -0
  402. package/dist/learning/pattern-null-store.js +8 -0
  403. package/dist/learning/pattern-promotion.js +6 -3
  404. package/dist/learning/pattern-store.d.ts +6 -0
  405. package/dist/learning/pattern-store.js +19 -6
  406. package/dist/learning/qe-reasoning-bank.js +2 -2
  407. package/dist/learning/real-embeddings.js +3 -1
  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 +642 -571
  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/llm/spend-ledger.d.ts +9 -0
  430. package/dist/shared/llm/spend-ledger.js +64 -39
  431. package/dist/shared/sqlite-lock-wait.d.ts +27 -0
  432. package/dist/shared/sqlite-lock-wait.js +37 -0
  433. package/dist/shared/sqlite-write-queue.d.ts +28 -0
  434. package/dist/shared/sqlite-write-queue.js +38 -0
  435. package/dist/shared/test-runner-project.d.ts +69 -0
  436. package/dist/shared/test-runner-project.js +186 -0
  437. package/dist/skills/security-visual-testing/index.d.ts +3 -1
  438. package/dist/skills/security-visual-testing/index.js +49 -35
  439. package/dist/skills/security-visual-testing/types.d.ts +19 -3
  440. package/dist/workers/workers/heartbeat-scheduler.js +5 -5
  441. package/dist/workers/workers/learning-consolidation.js +8 -7
  442. package/package.json +4 -2
  443. package/dist/cli/chunks/adapter-23KA2YW7.js +0 -2
  444. package/dist/cli/chunks/agent-booster-wasm-2DLAEZK6.js +0 -2
  445. package/dist/cli/chunks/aqe-learning-engine-MUICAXW5.js +0 -2
  446. package/dist/cli/chunks/base-XPWGYDKD.js +0 -2
  447. package/dist/cli/chunks/browser-workflow-UMQVBVGK.js +0 -2
  448. package/dist/cli/chunks/chunk-3FITMWWJ.js +0 -21
  449. package/dist/cli/chunks/chunk-ARRBXCII.js +0 -4
  450. package/dist/cli/chunks/chunk-BBYJBZHG.js +0 -14
  451. package/dist/cli/chunks/chunk-BM3EJLMV.js +0 -153
  452. package/dist/cli/chunks/chunk-D3ZZ2NLL.js +0 -62
  453. package/dist/cli/chunks/chunk-DLTB5KCR.js +0 -2
  454. package/dist/cli/chunks/chunk-DRLSJJIC.js +0 -6
  455. package/dist/cli/chunks/chunk-HAYKLXCT.js +0 -744
  456. package/dist/cli/chunks/chunk-HHBF2BZC.js +0 -65
  457. package/dist/cli/chunks/chunk-K7RT6ITZ.js +0 -2
  458. package/dist/cli/chunks/chunk-L752CNG3.js +0 -13
  459. package/dist/cli/chunks/chunk-MQXWG55U.js +0 -12
  460. package/dist/cli/chunks/chunk-WM2QRIRD.js +0 -14
  461. package/dist/cli/chunks/chunk-WRC3HLUY.js +0 -29
  462. package/dist/cli/chunks/chunk-XTZGAG6P.js +0 -27
  463. package/dist/cli/chunks/chunk-YKQWIXUY.js +0 -2
  464. package/dist/cli/chunks/client-E43GWLQH.js +0 -2
  465. package/dist/cli/chunks/core-handlers-R5A3SQDY.js +0 -2
  466. package/dist/cli/chunks/cross-domain-router-LLYVPZF6.js +0 -2
  467. package/dist/cli/chunks/daemon-BYYPIJ7G.js +0 -18
  468. package/dist/cli/chunks/dream-6C4NURSE.js +0 -2
  469. package/dist/cli/chunks/embed-and-insert-pattern-URES5Q6J.js +0 -3
  470. package/dist/cli/chunks/experience-capture-middleware-SYJQSBKE.js +0 -40
  471. package/dist/cli/chunks/file-discovery-J5IE5KP7.js +0 -2
  472. package/dist/cli/chunks/heartbeat-scheduler-FC5PBTMN.js +0 -2
  473. package/dist/cli/chunks/hnsw-adapter-47UIVOBG.js +0 -2
  474. package/dist/cli/chunks/hnsw-index-3AKVLOZQ.js +0 -2
  475. package/dist/cli/chunks/hybrid-backend-YAOSNX47.js +0 -2
  476. package/dist/cli/chunks/impact-analyzer-4FMJXM4M.js +0 -2
  477. package/dist/cli/chunks/init-wizard-RTLCRWDT.js +0 -2
  478. package/dist/cli/chunks/kernel-2OWIGGGT.js +0 -2
  479. package/dist/cli/chunks/knowledge-graph-25XXKDJN.js +0 -2
  480. package/dist/cli/chunks/llm-router-service-G3EIN4UB.js +0 -2
  481. package/dist/cli/chunks/load-test-D6QYNIVT.js +0 -2
  482. package/dist/cli/chunks/memory-backend-LDFFZMEQ.js +0 -2
  483. package/dist/cli/chunks/memory-handlers-3SQVY7FE.js +0 -2
  484. package/dist/cli/chunks/pattern-null-store-KDVRM7PW.js +0 -2
  485. package/dist/cli/chunks/project-root-DDGBWDP6.js +0 -2
  486. package/dist/cli/chunks/protocol-executor-KBOLLCWA.js +0 -2
  487. package/dist/cli/chunks/qe-reasoning-bank-GRXBT7FC.js +0 -2
  488. package/dist/cli/chunks/queen-coordinator-L2QWMJ5Q.js +0 -2
  489. package/dist/cli/chunks/real-embeddings-I2UVNNB3.js +0 -2
  490. package/dist/cli/chunks/router-FT5WJPUH.js +0 -2
  491. package/dist/cli/chunks/routing-feedback-EO2MKOUX.js +0 -2
  492. package/dist/cli/chunks/rvf-dual-writer-WHBFQJVU.js +0 -2
  493. package/dist/cli/chunks/rvf-migration-adapter-YT3APF2I.js +0 -2
  494. package/dist/cli/chunks/rvf-migration-coordinator-VUIZHTVG.js +0 -2
  495. package/dist/cli/chunks/rvf-native-adapter-37PUFKQD.js +0 -2
  496. package/dist/cli/chunks/safe-db-TDZKUOZJ.js +0 -2
  497. package/dist/cli/chunks/schedule-CRKTRY2A.js +0 -2
  498. package/dist/cli/chunks/scheduler-6ZBDVQWN.js +0 -2
  499. package/dist/cli/chunks/sqlite-persistence-FFJQAIKW.js +0 -2
  500. package/dist/cli/chunks/sync-54LUAUTK.js +0 -2
  501. package/dist/cli/chunks/task-handler-K3OXHYKU.js +0 -62
  502. package/dist/cli/chunks/test-runner-process-OTQDAJLN.js +0 -2
  503. package/dist/cli/chunks/token-bootstrap-3QMABE45.js +0 -2
  504. package/dist/cli/chunks/tree-sitter-wasm-parser-D6JTTHTP.js +0 -2
  505. package/dist/cli/chunks/unified-memory-QARWQKJ2.js +0 -2
  506. package/dist/cli/chunks/unified-memory-hnsw-LHY3DXCP.js +0 -2
  507. package/dist/cli/chunks/unified-persistence-WEYYGLHM.js +0 -2
  508. package/dist/cli/chunks/visual-security-O4ALMCXQ.js +0 -2
  509. package/dist/cli/chunks/witness-chain-B3YW5NMS.js +0 -2
  510. package/dist/cli/chunks/witness-chain-PIYR72HJ.js +0 -2
  511. package/dist/cli/chunks/witness-chain-repair-YUG7E3UX.js +0 -2
  512. package/dist/cli/chunks/workflow-orchestrator-3ZN2BCGY.js +0 -2
  513. package/dist/cli/chunks/wrappers-PW2O27LL.js +0 -2
@@ -160,6 +160,7 @@ export class TestExecutionCoordinator extends BaseDomainCoordinator {
160
160
  workers,
161
161
  timeout,
162
162
  retryCount: request.retryCount,
163
+ projectRoot: request.projectRoot,
163
164
  });
164
165
  }
165
166
  // Sequential execution
@@ -168,6 +169,7 @@ export class TestExecutionCoordinator extends BaseDomainCoordinator {
168
169
  framework,
169
170
  timeout,
170
171
  retryCount: request.retryCount,
172
+ projectRoot: request.projectRoot,
171
173
  });
172
174
  }
173
175
  /**
@@ -176,7 +178,7 @@ export class TestExecutionCoordinator extends BaseDomainCoordinator {
176
178
  * as passed and flaky in the run's own counts (#1170). When that changes
177
179
  * the outcome, the run is stored again with it (#1176).
178
180
  */
179
- async retryFailures(run, retryCount, testFiles) {
181
+ async retryFailures(run, retryCount, testFiles, projectRoot) {
180
182
  if (!retryCount || retryCount <= 0)
181
183
  return;
182
184
  if (run.failed === 0) {
@@ -188,6 +190,7 @@ export class TestExecutionCoordinator extends BaseDomainCoordinator {
188
190
  failedTests: run.failedTests.map(t => t.testId),
189
191
  maxRetries: retryCount,
190
192
  backoff: 'exponential',
193
+ projectRoot,
191
194
  });
192
195
  if (!retried.success)
193
196
  return;
@@ -258,7 +261,7 @@ export class TestExecutionCoordinator extends BaseDomainCoordinator {
258
261
  // #1176: these first-attempt failures did happen; flaky analysis
259
262
  // records them even when a retry then passes.
260
263
  const firstAttemptFailures = [...result.value.failedTests];
261
- await this.retryFailures(result.value, request.retryCount, orderedTestFiles);
264
+ await this.retryFailures(result.value, request.retryCount, orderedTestFiles, request.projectRoot);
262
265
  // Record execution results for learning
263
266
  if (this.config.enablePrioritization && prioritizationResult) {
264
267
  await this.recordExecutionResults(runId, orderedTestFiles, result.value, prioritizationResult);
@@ -296,7 +299,7 @@ export class TestExecutionCoordinator extends BaseDomainCoordinator {
296
299
  if (this.config.infraHealing && result.value.failedTests.length > 0) {
297
300
  this.feedInfraHealingFromFailures(result.value.failedTests);
298
301
  // ADR-057: Attempt automatic recovery and re-run affected tests
299
- const rerunResult = await this.attemptAutoRecoveryAndRerun(result.value.failedTests, request.framework, { timeout: request.timeout, env: request.env, retryCount: request.retryCount });
302
+ const rerunResult = await this.attemptAutoRecoveryAndRerun(result.value.failedTests, request.framework, { timeout: request.timeout, env: request.env, retryCount: request.retryCount, projectRoot: request.projectRoot });
300
303
  if (rerunResult)
301
304
  return rerunResult;
302
305
  }
@@ -367,7 +370,7 @@ export class TestExecutionCoordinator extends BaseDomainCoordinator {
367
370
  this.activeRuns.delete(runId);
368
371
  if (result.success) {
369
372
  // #1176: retries finish before the run is recorded or announced.
370
- await this.retryFailures(result.value, request.retryCount, orderedTestFiles);
373
+ await this.retryFailures(result.value, request.retryCount, orderedTestFiles, request.projectRoot);
371
374
  // Record execution results for learning
372
375
  if (this.config.enablePrioritization && prioritizationResult) {
373
376
  await this.recordExecutionResults(runId, orderedTestFiles, result.value, prioritizationResult);
@@ -407,7 +410,7 @@ export class TestExecutionCoordinator extends BaseDomainCoordinator {
407
410
  if (this.config.infraHealing && result.value.failedTests.length > 0) {
408
411
  this.feedInfraHealingFromFailures(result.value.failedTests);
409
412
  // ADR-057: Attempt automatic recovery and re-run affected tests
410
- const rerunResult = await this.attemptAutoRecoveryAndRerun(result.value.failedTests, request.framework, { timeout: request.timeout, env: request.env, retryCount: request.retryCount });
413
+ const rerunResult = await this.attemptAutoRecoveryAndRerun(result.value.failedTests, request.framework, { timeout: request.timeout, env: request.env, retryCount: request.retryCount, projectRoot: request.projectRoot });
411
414
  if (rerunResult)
412
415
  return rerunResult;
413
416
  }
@@ -510,6 +513,7 @@ export class TestExecutionCoordinator extends BaseDomainCoordinator {
510
513
  failedTests: testsToRetry,
511
514
  maxRetries: request.maxRetries,
512
515
  backoff: request.backoff ?? 'exponential',
516
+ projectRoot: request.projectRoot,
513
517
  onRetry: (testId, attempt) => {
514
518
  // Could publish individual retry events here
515
519
  void testId;
@@ -630,6 +634,7 @@ export class TestExecutionCoordinator extends BaseDomainCoordinator {
630
634
  timeout: originalRequest.timeout,
631
635
  env: originalRequest.env,
632
636
  retryCount: originalRequest.retryCount,
637
+ projectRoot: originalRequest.projectRoot,
633
638
  });
634
639
  }
635
640
  /**
@@ -47,6 +47,11 @@ export interface ISimpleTestRequest {
47
47
  timeout?: number;
48
48
  /** Number of parallel workers (default: auto based on file count) */
49
49
  workers?: number;
50
+ /**
51
+ * #1247: directory to run every file from, already checked to be inside the
52
+ * project. When omitted, each file runs from its nearest runner project.
53
+ */
54
+ projectRoot?: string;
50
55
  }
51
56
  export interface IExecuteTestsRequest {
52
57
  testFiles: string[];
@@ -59,6 +64,11 @@ export interface IExecuteTestsRequest {
59
64
  * or TestRunCompleted is published, so both carry the final outcome.
60
65
  */
61
66
  retryCount?: number;
67
+ /**
68
+ * #1247: directory to run every file from, already checked to be inside the
69
+ * project. When omitted, each file runs from its nearest runner project.
70
+ */
71
+ projectRoot?: string;
62
72
  }
63
73
  export interface IParallelExecutionRequest extends IExecuteTestsRequest {
64
74
  workers: number;
@@ -173,6 +183,8 @@ export interface IRetryRequest {
173
183
  failedTests: string[];
174
184
  maxRetries: number;
175
185
  backoff?: 'linear' | 'exponential';
186
+ /** #1247: the run's explicit projectRoot; retries run from it too. */
187
+ projectRoot?: string;
176
188
  }
177
189
  export interface IRetryResult {
178
190
  originalFailed: number;
@@ -5,6 +5,7 @@
5
5
  import { err } from '../../shared/types/index.js';
6
6
  import { BaseDomainPlugin } from '../domain-interface.js';
7
7
  import { requirePayloadFiles } from '../../shared/io/payload-path-guard.js';
8
+ import { requireTestRunTargets } from '../../shared/test-runner-project.js';
8
9
  import { createTestExecutionCoordinator } from './coordinator.js';
9
10
  import { getGlobalInfraHealing } from '../../strange-loop/infra-healing/global-instance.js';
10
11
  import { isMeasuredGapPayload } from '../../shared/events/domain-events.js';
@@ -65,12 +66,14 @@ export class TestExecutionPlugin extends BaseDomainPlugin {
65
66
  // directories (#909 Jest targets) inside the project, passed on as the
66
67
  // real paths that were checked. A missing one is still reported by the
67
68
  // runner.
69
+ // #1247: an explicit projectRoot is confined the same way.
68
70
  let testFiles;
71
+ let projectRoot;
69
72
  if (payload.testFiles !== undefined) {
70
- const confined = await requirePayloadFiles('execute-tests', 'testFiles', payload.testFiles, { allowMissing: true, allowDirectory: true });
73
+ const confined = await requireTestRunTargets('execute-tests', payload.testFiles, payload.projectRoot);
71
74
  if (!confined.success)
72
75
  return confined;
73
- testFiles = confined.value;
76
+ ({ testFiles, projectRoot } = confined.value);
74
77
  }
75
78
  // Support both simple and full request formats
76
79
  if (testFiles) {
@@ -81,6 +84,7 @@ export class TestExecutionPlugin extends BaseDomainPlugin {
81
84
  retryCount: payload.retryCount,
82
85
  timeout: payload.timeout,
83
86
  workers: payload.workers,
87
+ projectRoot,
84
88
  };
85
89
  return this.coordinator.runTests(request);
86
90
  }
@@ -74,6 +74,8 @@ export interface RetryExecutionRequest {
74
74
  baseDelay?: number;
75
75
  maxDelay?: number;
76
76
  onRetry?: (testId: string, attempt: number) => void;
77
+ /** #1247: the run's explicit projectRoot; every retry runs from it. */
78
+ projectRoot?: string;
77
79
  }
78
80
  export interface RetryStatistics {
79
81
  totalRetries: number;
@@ -6,6 +6,7 @@ import { LoggerFactory } from '../../../logging/index.js';
6
6
  import { spawn } from 'node:child_process';
7
7
  import { createVitestJsonReport } from '../../../shared/vitest-json-report.js';
8
8
  import { jestExactPathPattern, nameFilterArg, runnerFilePath } from '../../../shared/test-runner-args.js';
9
+ import { runnerCwdFor } from '../../../shared/test-runner-project.js';
9
10
  import { existsSync, readFileSync, realpathSync } from 'node:fs';
10
11
  import { resolve as resolvePath } from 'node:path';
11
12
  import { ok, err } from '../../../shared/types/index.js';
@@ -92,7 +93,7 @@ export class RetryHandlerService {
92
93
  * Execute failed tests with retry logic
93
94
  */
94
95
  async executeWithRetry(request) {
95
- const { runId, failedTests, maxRetries, backoff, baseDelay = 1000, maxDelay = 30000, onRetry, } = request;
96
+ const { runId, failedTests, maxRetries, backoff, baseDelay = 1000, maxDelay = 30000, onRetry, projectRoot, } = request;
96
97
  try {
97
98
  const stats = {
98
99
  runId,
@@ -108,7 +109,7 @@ export class RetryHandlerService {
108
109
  const unmatched = [];
109
110
  const tests = [];
110
111
  for (const test of failedTests) {
111
- const result = await this.retryTest(test, maxRetries, backoff, baseDelay, maxDelay, onRetry);
112
+ const result = await this.retryTest(test, maxRetries, backoff, baseDelay, maxDelay, onRetry, projectRoot);
112
113
  stats.totalRetries += result.attempts;
113
114
  if (result.passed) {
114
115
  nowPassing.push(test.testId);
@@ -228,7 +229,7 @@ export class RetryHandlerService {
228
229
  return false;
229
230
  }
230
231
  }
231
- async retryTest(test, maxRetries, backoff, baseDelay, maxDelay, onRetry) {
232
+ async retryTest(test, maxRetries, backoff, baseDelay, maxDelay, onRetry, projectRoot) {
232
233
  let attempts = 0;
233
234
  // #1122: the final error is persisted in retry-history, so keep it redacted.
234
235
  let lastError = redactFailureText(test.error);
@@ -246,7 +247,7 @@ export class RetryHandlerService {
246
247
  onRetry(test.testId, attempts + 1);
247
248
  }
248
249
  // Execute test (simulated - in real implementation, would run actual test)
249
- const result = await this.executeTest(test);
250
+ const result = await this.executeTest(test, projectRoot);
250
251
  // #1141: a filter that selected no test reran nothing. Report that
251
252
  // instead of counting it as a retry, and stop: another attempt would
252
253
  // select nothing again.
@@ -272,7 +273,7 @@ export class RetryHandlerService {
272
273
  finalError: lastError,
273
274
  };
274
275
  }
275
- async executeTest(test) {
276
+ async executeTest(test, projectRoot) {
276
277
  // In simulation mode (for unit testing), use random behavior
277
278
  if (this.config.simulateForTesting) {
278
279
  const passOnRetry = secureRandom() < this.config.simulatedRetrySuccessRate;
@@ -282,12 +283,12 @@ export class RetryHandlerService {
282
283
  };
283
284
  }
284
285
  // In production mode, actually execute the test
285
- return this.executeRealTest(test);
286
+ return this.executeRealTest(test, projectRoot);
286
287
  }
287
288
  /**
288
289
  * Execute a real test using the configured test runner
289
290
  */
290
- async executeRealTest(test) {
291
+ async executeRealTest(test, projectRoot) {
291
292
  const testFile = test.file;
292
293
  const testName = test.testName;
293
294
  const cwd = this.config.cwd ?? process.cwd();
@@ -295,8 +296,12 @@ export class RetryHandlerService {
295
296
  if (!existsSync(testFile)) {
296
297
  throw new Error(`Test file not found: ${testFile}. Cannot retry non-existent test file.`);
297
298
  }
299
+ // #1247: retry from the same directory as the first run: the caller's
300
+ // projectRoot, else a configured directory, else the file's runner
301
+ // project. The file path stays relative to `cwd`.
302
+ const runCwd = projectRoot ?? this.config.cwd ?? runnerCwdFor(testFile);
298
303
  // Detect or use configured test runner
299
- const runner = await this.detectTestRunner(cwd);
304
+ const runner = await this.detectTestRunner(runCwd);
300
305
  if (!runner) {
301
306
  throw new Error(`No test runner detected or configured. Install vitest, jest, or mocha, ` +
302
307
  `or configure testRunner in RetryHandlerConfig. Cannot execute retry for: ${testFile}`);
@@ -304,7 +309,7 @@ export class RetryHandlerService {
304
309
  // Build command based on runner
305
310
  const { command, args, report } = this.buildTestCommand(runner, testFile, testName, cwd);
306
311
  // Execute the test
307
- return this.spawnTestProcess(command, args, cwd, report, runner === 'vitest' ? testFile : undefined);
312
+ return this.spawnTestProcess(command, args, runCwd, report, runner === 'vitest' ? testFile : undefined);
308
313
  }
309
314
  /**
310
315
  * Detect which test runner is available in the project
@@ -113,6 +113,7 @@ export declare class TestExecutorService implements ITestExecutionService {
113
113
  private mergeSequentialCoverage;
114
114
  private executeTestFile;
115
115
  private executeTestFiles;
116
+ private executeProjectFiles;
116
117
  /**
117
118
  * Spawn actual test runner process (vitest, jest, mocha)
118
119
  */
@@ -21,6 +21,7 @@ import { mergeTestCases, redactFailedTests, redactFailureText, testCasesFromRunn
21
21
  import { capDiagnostics, getTestRunnerExecutionError, TestRunnerExecutionError } from '../../../shared/test-runner-verdict.js';
22
22
  import { createVitestJsonReport } from '../../../shared/vitest-json-report.js';
23
23
  import { jestExactPathPattern, runnerFilePath } from '../../../shared/test-runner-args.js';
24
+ import { groupByRunnerProject } from '../../../shared/test-runner-project.js';
24
25
  import { getClaudeModelForTier } from '../../../shared/llm/model-registry.js';
25
26
  import { terminateTestRunner, trackTestRunnerExit } from '../../../shared/test-runner-process.js';
26
27
  const DEFAULT_CONFIG = {
@@ -314,7 +315,7 @@ Provide:
314
315
  return ok(undefined);
315
316
  }
316
317
  async runTests(request) {
317
- const { testFiles, framework, timeout = 30000 } = request;
318
+ const { testFiles, framework, timeout = 30000, projectRoot } = request;
318
319
  const failedTests = [];
319
320
  const coverages = [];
320
321
  const allFileCoverages = [];
@@ -323,7 +324,7 @@ Provide:
323
324
  let failed = 0;
324
325
  let skipped = 0;
325
326
  for (const file of testFiles) {
326
- const result = await this.executeTestFile(file, framework, timeout);
327
+ const result = await this.executeTestFile(file, framework, timeout, projectRoot);
327
328
  executionResults.push(result);
328
329
  passed += result.passed;
329
330
  failed += result.failed;
@@ -393,16 +394,34 @@ Provide:
393
394
  const coverage = this.extractCoverageFromJson({ coverageMap: merged });
394
395
  return coverage.summary ? { summary: coverage.summary, perFile: coverage.perFile } : undefined;
395
396
  }
396
- async executeTestFile(file, framework, timeout) {
397
- return this.executeTestFiles([file], framework, timeout);
397
+ async executeTestFile(file, framework, timeout, projectRoot) {
398
+ return this.executeTestFiles([file], framework, timeout, projectRoot);
398
399
  }
399
- async executeTestFiles(files, framework, timeout) {
400
+ async executeTestFiles(files, framework, timeout, projectRoot) {
400
401
  // In simulation mode (for unit testing), use random behavior
401
402
  if (this.config.simulateForTesting) {
402
403
  return this.aggregateResults(files.map(file => this.simulateTestExecution(file)));
403
404
  }
405
+ // #1247: a runner loads the config of the directory it starts in, so each
406
+ // file runs from its own runner project (or the caller's projectRoot).
407
+ const groups = projectRoot
408
+ ? [{ cwd: projectRoot, files }]
409
+ : groupByRunnerProject(files);
410
+ if (groups.length === 1) {
411
+ return this.executeProjectFiles(groups[0].files, framework, timeout, groups[0].cwd);
412
+ }
413
+ // Each project gets its own runner and timeout. Their coverage maps are
414
+ // merged from raw counters, or left unmeasured (#1030).
415
+ const results = await Promise.all(groups.map(group => this.executeProjectFiles(group.files, framework, timeout, group.cwd)));
416
+ const combined = this.aggregateResults(results);
417
+ const merged = this.mergeSequentialCoverage(results);
418
+ combined.coverage = merged?.summary;
419
+ combined.fileCoverages = merged?.perFile;
420
+ return combined;
421
+ }
422
+ async executeProjectFiles(files, framework, timeout, cwd) {
404
423
  // Production mode: spawn actual test runner process
405
- const result = await this.spawnTestRunner(files, framework, timeout);
424
+ const result = await this.spawnTestRunner(files, framework, timeout, cwd);
406
425
  if (result.success === false) {
407
426
  // Runner/suite errors have no trustworthy assertion receipt to aggregate.
408
427
  if (result.error instanceof TestRunnerExecutionError)
@@ -428,7 +447,7 @@ Provide:
428
447
  /**
429
448
  * Spawn actual test runner process (vitest, jest, mocha)
430
449
  */
431
- async spawnTestRunner(files, framework, timeout) {
450
+ async spawnTestRunner(files, framework, timeout, cwd = process.cwd()) {
432
451
  // Verify test file exists
433
452
  const missingFile = files.find(file => !existsSync(file));
434
453
  if (missingFile) {
@@ -466,7 +485,7 @@ Provide:
466
485
  let proc;
467
486
  try {
468
487
  proc = spawn(command, args, {
469
- cwd: process.cwd(),
488
+ cwd,
470
489
  detached: process.platform !== 'win32',
471
490
  env: {
472
491
  ...process.env,
@@ -999,7 +1018,7 @@ Provide:
999
1018
  return shards;
1000
1019
  }
1001
1020
  async executeWorker(files, _workerIndex, _isolation, request) {
1002
- return this.executeTestFiles(files, request.framework, request.timeout ?? 30000);
1021
+ return this.executeTestFiles(files, request.framework, request.timeout ?? 30000, request.projectRoot);
1003
1022
  }
1004
1023
  aggregateResults(results) {
1005
1024
  const aggregated = {
@@ -25,6 +25,20 @@ export interface WorkflowStatus {
25
25
  progress: number;
26
26
  error?: string;
27
27
  }
28
+ /**
29
+ * A color-contrast violation as axe-core measured it (#1228). A colour the
30
+ * browser did not report is null and an unreported ratio is -1, with
31
+ * measured: false.
32
+ */
33
+ export interface ContrastIssue {
34
+ element: string;
35
+ foreground: string | null;
36
+ background: string | null;
37
+ ratio: number;
38
+ required: number;
39
+ measured: boolean;
40
+ notMeasuredReason?: string;
41
+ }
28
42
  /**
29
43
  * Coordinator configuration
30
44
  */
@@ -140,13 +154,7 @@ export declare class VisualAccessibilityCoordinator extends BaseDomainCoordinato
140
154
  url: string;
141
155
  wcagLevel?: 'A' | 'AA' | 'AAA';
142
156
  }): Promise<Result<{
143
- issues: Array<{
144
- element: string;
145
- foreground: string;
146
- background: string;
147
- ratio: number;
148
- required: number;
149
- }>;
157
+ issues: ContrastIssue[];
150
158
  }, Error>>;
151
159
  /**
152
160
  * Test responsive design across multiple viewports
@@ -11,6 +11,7 @@ import { cosineSimilarity } from '../../shared/utils/vector-math.js';
11
11
  import { createVisualTesterServiceWithDependencies, } from './services/visual-tester.js';
12
12
  import { AccessibilityTesterService, } from './services/accessibility-tester.js';
13
13
  import { ResponsiveTesterService, } from './services/responsive-tester.js';
14
+ import { contrastValues, contrastValuesMeasured, defaultRequiredRatio } from './services/accessibility-contrast.js';
14
15
  import { A2CAlgorithm } from '../../integrations/rl-suite/algorithms/a2c.js';
15
16
  import { createQEFlashAttention } from '../../integrations/ruvector/wrappers.js';
16
17
  // CQ-002: Base domain coordinator
@@ -589,13 +590,20 @@ export class VisualAccessibilityCoordinator extends BaseDomainCoordinator {
589
590
  }
590
591
  // Filter for color contrast violations
591
592
  const contrastViolations = auditResult.value.violations.filter((v) => v.id.includes('color-contrast') || v.id.includes('contrast'));
592
- const issues = contrastViolations.flatMap((violation) => violation.nodes.map((node) => ({
593
- element: node.target.join(' '),
594
- foreground: '#000000',
595
- background: '#ffffff',
596
- ratio: 1.0,
597
- required: level === 'AAA' ? 7.0 : 4.5,
598
- })));
593
+ // #1228: the colours and ratio axe-core measured; unreported values are null / -1
594
+ const issues = contrastViolations.flatMap((violation) => violation.nodes.map((node) => {
595
+ const values = node.contrast ?? contrastValues(undefined, node.failureSummary);
596
+ const measured = contrastValuesMeasured(values);
597
+ return {
598
+ element: node.target.join(' '),
599
+ foreground: values.foreground,
600
+ background: values.background,
601
+ ratio: values.ratio ?? -1,
602
+ required: values.requiredRatio ?? defaultRequiredRatio(level),
603
+ measured,
604
+ ...(measured ? {} : { notMeasuredReason: 'axe-core did not report the colours and ratio for this element' }),
605
+ };
606
+ }));
599
607
  return ok({ issues });
600
608
  }
601
609
  catch (error) {
@@ -187,18 +187,36 @@ export interface ViolationNode {
187
187
  readonly target: string[];
188
188
  readonly failureSummary: string;
189
189
  readonly fixSuggestion?: string;
190
+ /** Colours and ratio axe-core reported for a contrast violation (#1228). */
191
+ readonly contrast?: ContrastValues;
192
+ }
193
+ /**
194
+ * Colours and contrast ratio as the browser measured them (#1228).
195
+ * A value the browser did not report is null, never a default colour or ratio.
196
+ */
197
+ export interface ContrastValues {
198
+ readonly foreground: string | null;
199
+ readonly background: string | null;
200
+ readonly ratio: number | null;
201
+ /** The ratio axe-core required for this element (3:1 for large text), when reported. */
202
+ readonly requiredRatio: number | null;
190
203
  }
191
204
  /**
192
205
  * Color contrast analysis
193
206
  */
194
207
  export interface ContrastAnalysis {
195
208
  readonly element: string;
196
- readonly foreground: string;
197
- readonly background: string;
209
+ /** null when the browser did not report the colour (#1228). */
210
+ readonly foreground: string | null;
211
+ readonly background: string | null;
212
+ /** -1 when the browser did not report the ratio (#1228). */
198
213
  readonly ratio: number;
199
214
  readonly requiredRatio: number;
200
215
  readonly passes: boolean;
201
216
  readonly wcagLevel: 'A' | 'AA' | 'AAA';
217
+ /** false when the colours or ratio were not reported; see notMeasuredReason (#1228). */
218
+ readonly measured?: boolean;
219
+ readonly notMeasuredReason?: string;
202
220
  }
203
221
  export interface VisualRegressionDetectedEvent extends DomainEvent {
204
222
  readonly type: 'VisualRegressionDetectedEvent';
@@ -360,12 +378,18 @@ export interface KeyboardNavigationReport {
360
378
  readonly tabOrder: TabOrderItem[];
361
379
  readonly issues: KeyboardIssue[];
362
380
  readonly traps: FocusTrap[];
381
+ /**
382
+ * What this report did not measure (#1228). An empty `traps` list, or a
383
+ * null `hasVisibleFocus`, is not a clean result for an aspect listed here.
384
+ */
385
+ readonly notMeasured?: string[];
363
386
  }
364
387
  export interface TabOrderItem {
365
388
  readonly index: number;
366
389
  readonly selector: string;
367
390
  readonly elementType: string;
368
- readonly hasVisibleFocus: boolean;
391
+ /** null: the focus indicator was not measured (#1228). */
392
+ readonly hasVisibleFocus: boolean | null;
369
393
  }
370
394
  export interface KeyboardIssue {
371
395
  readonly type: 'no-focus-indicator' | 'skip-link-missing' | 'incorrect-tab-order' | 'non-interactive-focusable';
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Agentic QE v3 - Measured colour contrast values (#1228)
3
+ *
4
+ * axe-core reports the colours and ratio it measured for each element checked
5
+ * by its color-contrast rules: in the check data (fgColor, bgColor,
6
+ * contrastRatio, expectedContrastRatio) and in the failure summary text. These
7
+ * helpers carry those values through. A value the browser did not report is
8
+ * null (or a ratio of -1 in ContrastAnalysis), never a default colour or ratio.
9
+ */
10
+ import type { ContrastAnalysis, ContrastValues } from '../interfaces.js';
11
+ /** The fields of axe-core's color-contrast check data that AQE keeps. */
12
+ export interface AxeContrastData {
13
+ fgColor?: string;
14
+ bgColor?: string;
15
+ contrastRatio?: number;
16
+ expectedContrastRatio?: string;
17
+ }
18
+ /** axe-core rule ids that measure text contrast. */
19
+ export declare const CONTRAST_RULE_IDS: readonly ["color-contrast", "color-contrast-enhanced"];
20
+ export declare function isContrastRule(ruleId: string): boolean;
21
+ /**
22
+ * Browser-side expression `(node) => AxeContrastData | undefined` for an axe-core
23
+ * result node. Embedded in the scripts that run axe-core in the page.
24
+ */
25
+ export declare const AXE_CONTRAST_DATA_JS = "function (n) {\n var checks = [].concat(n.any || [], n.all || [], n.none || []);\n for (var i = 0; i < checks.length; i++) {\n var c = checks[i];\n if ((c.id === 'color-contrast' || c.id === 'color-contrast-enhanced') && c.data) {\n return {\n fgColor: c.data.fgColor,\n bgColor: c.data.bgColor,\n contrastRatio: c.data.contrastRatio,\n expectedContrastRatio: c.data.expectedContrastRatio\n };\n }\n }\n return undefined;\n}";
26
+ /**
27
+ * Read the values from axe-core's failure summary, e.g. "Element has insufficient
28
+ * color contrast of 2.32 (foreground color: #aaaaaa, background color: #ffffff,
29
+ * ...). Expected contrast ratio of 4.5:1".
30
+ */
31
+ export declare function parseContrastFailureSummary(summary: string | undefined): ContrastValues;
32
+ /** Values from axe-core's check data, with gaps filled from the failure summary. */
33
+ export declare function contrastValues(data: AxeContrastData | undefined, failureSummary?: string): ContrastValues;
34
+ export declare function contrastValuesMeasured(values: ContrastValues): boolean;
35
+ /** The ratio WCAG requires for normal text at a level, when axe-core did not say. */
36
+ export declare function defaultRequiredRatio(level: 'A' | 'AA' | 'AAA'): number;
37
+ /** One element's contrast result; unreported values stay unmeasured. */
38
+ export declare function toContrastAnalysis(element: string, values: ContrastValues, passes: boolean, wcagLevel: 'A' | 'AA' | 'AAA'): ContrastAnalysis;
39
+ //# sourceMappingURL=accessibility-contrast.d.ts.map
@@ -0,0 +1,93 @@
1
+ /**
2
+ * Agentic QE v3 - Measured colour contrast values (#1228)
3
+ *
4
+ * axe-core reports the colours and ratio it measured for each element checked
5
+ * by its color-contrast rules: in the check data (fgColor, bgColor,
6
+ * contrastRatio, expectedContrastRatio) and in the failure summary text. These
7
+ * helpers carry those values through. A value the browser did not report is
8
+ * null (or a ratio of -1 in ContrastAnalysis), never a default colour or ratio.
9
+ */
10
+ /** axe-core rule ids that measure text contrast. */
11
+ export const CONTRAST_RULE_IDS = ['color-contrast', 'color-contrast-enhanced'];
12
+ export function isContrastRule(ruleId) {
13
+ return ruleId.includes('contrast');
14
+ }
15
+ /**
16
+ * Browser-side expression `(node) => AxeContrastData | undefined` for an axe-core
17
+ * result node. Embedded in the scripts that run axe-core in the page.
18
+ */
19
+ export const AXE_CONTRAST_DATA_JS = `function (n) {
20
+ var checks = [].concat(n.any || [], n.all || [], n.none || []);
21
+ for (var i = 0; i < checks.length; i++) {
22
+ var c = checks[i];
23
+ if ((c.id === 'color-contrast' || c.id === 'color-contrast-enhanced') && c.data) {
24
+ return {
25
+ fgColor: c.data.fgColor,
26
+ bgColor: c.data.bgColor,
27
+ contrastRatio: c.data.contrastRatio,
28
+ expectedContrastRatio: c.data.expectedContrastRatio
29
+ };
30
+ }
31
+ }
32
+ return undefined;
33
+ }`;
34
+ const COLOR = '(#[0-9a-f]{3,8}|rgba?\\([^)]*\\))';
35
+ /**
36
+ * Read the values from axe-core's failure summary, e.g. "Element has insufficient
37
+ * color contrast of 2.32 (foreground color: #aaaaaa, background color: #ffffff,
38
+ * ...). Expected contrast ratio of 4.5:1".
39
+ */
40
+ export function parseContrastFailureSummary(summary) {
41
+ const text = summary ?? '';
42
+ const ratio = text.match(/contrast (?:ratio )?of\s*(\d+(?:\.\d+)?)(?![\d.]|\s*:)/i);
43
+ const fg = text.match(new RegExp(`foreground colou?r:?\\s*${COLOR}`, 'i'));
44
+ const bg = text.match(new RegExp(`background colou?r:?\\s*${COLOR}`, 'i'));
45
+ const expected = text.match(/expected contrast ratio of\s*(\d+(?:\.\d+)?)\s*:\s*1/i);
46
+ return {
47
+ foreground: fg?.[1] ?? null,
48
+ background: bg?.[1] ?? null,
49
+ ratio: validRatio(ratio ? parseFloat(ratio[1]) : undefined),
50
+ requiredRatio: validRatio(expected ? parseFloat(expected[1]) : undefined),
51
+ };
52
+ }
53
+ /** Values from axe-core's check data, with gaps filled from the failure summary. */
54
+ export function contrastValues(data, failureSummary) {
55
+ const parsed = parseContrastFailureSummary(failureSummary);
56
+ const expected = data?.expectedContrastRatio?.match(/(\d+(?:\.\d+)?)/);
57
+ return {
58
+ foreground: nonEmpty(data?.fgColor) ?? parsed.foreground,
59
+ background: nonEmpty(data?.bgColor) ?? parsed.background,
60
+ ratio: validRatio(data?.contrastRatio) ?? parsed.ratio,
61
+ requiredRatio: validRatio(expected ? parseFloat(expected[1]) : undefined) ?? parsed.requiredRatio,
62
+ };
63
+ }
64
+ export function contrastValuesMeasured(values) {
65
+ return values.foreground !== null && values.background !== null && values.ratio !== null;
66
+ }
67
+ /** The ratio WCAG requires for normal text at a level, when axe-core did not say. */
68
+ export function defaultRequiredRatio(level) {
69
+ return level === 'AAA' ? 7 : 4.5;
70
+ }
71
+ /** One element's contrast result; unreported values stay unmeasured. */
72
+ export function toContrastAnalysis(element, values, passes, wcagLevel) {
73
+ const measured = contrastValuesMeasured(values);
74
+ return {
75
+ element,
76
+ foreground: values.foreground,
77
+ background: values.background,
78
+ ratio: values.ratio ?? -1,
79
+ requiredRatio: values.requiredRatio ?? defaultRequiredRatio(wcagLevel),
80
+ passes,
81
+ wcagLevel,
82
+ measured,
83
+ ...(measured ? {} : { notMeasuredReason: 'the browser did not report the colours and ratio for this element' }),
84
+ };
85
+ }
86
+ function validRatio(value) {
87
+ // A contrast ratio is between 1 and 21; axe-core reports 0 when it could not compute one.
88
+ return typeof value === 'number' && Number.isFinite(value) && value >= 1 ? value : null;
89
+ }
90
+ function nonEmpty(value) {
91
+ return typeof value === 'string' && value.trim() !== '' ? value : null;
92
+ }
93
+ //# sourceMappingURL=accessibility-contrast.js.map