agentic-qe 3.12.0 → 3.12.2

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 (362) hide show
  1. package/.claude/skills/skills-manifest.json +1 -1
  2. package/CHANGELOG.md +83 -0
  3. package/assets/skills/skills-manifest.json +1 -1
  4. package/dist/cli/bundle.js +5 -5
  5. package/dist/cli/chunks/adapter-RL6GNUOS.js +2 -0
  6. package/dist/cli/chunks/{agent-booster-wasm-IO54X6IQ.js → agent-booster-wasm-3KYNICBC.js} +2 -2
  7. package/dist/cli/chunks/{agent-handler-A57SZUCW.js → agent-handler-NGPTMI6E.js} +2 -2
  8. package/dist/cli/chunks/{agent-memory-branch-BX7LRFGN.js → agent-memory-branch-GNTQKQMG.js} +2 -2
  9. package/dist/cli/chunks/aqe-learning-engine-UEEW6AQG.js +2 -0
  10. package/dist/cli/chunks/{arena-UTC4YY6Y.js → arena-HQEP2NWI.js} +4 -4
  11. package/dist/cli/chunks/{arena-Y3XTX6O7.js → arena-PA7VIYD4.js} +2 -2
  12. package/dist/cli/chunks/{audit-L4RL2AOY.js → audit-XSDM57GC.js} +3 -3
  13. package/dist/cli/chunks/base-JQA5YULE.js +2 -0
  14. package/dist/cli/chunks/{hnswlib-node-VS6L5VUG.js → better-sqlite3-RQCOOAZC.js} +2 -2
  15. package/dist/cli/chunks/{brain-handler-OHDPI5TQ.js → brain-handler-T7RDPKNM.js} +3 -3
  16. package/dist/cli/chunks/{branch-enumerator-ZRXE2CQ7.js → branch-enumerator-ZW7RNMUF.js} +2 -2
  17. package/dist/cli/chunks/{browser-NT33FG76.js → browser-4LU22CPP.js} +2 -2
  18. package/dist/cli/chunks/browser-workflow-XTKUHTIT.js +2 -0
  19. package/dist/cli/chunks/{chunk-XEYW3V5I.js → chunk-2L7K2J2T.js} +2 -2
  20. package/dist/cli/chunks/{chunk-VWJSWXHG.js → chunk-2R7J4ZGT.js} +1 -1
  21. package/dist/cli/chunks/{chunk-KZMRU7DL.js → chunk-2R7XZ2WP.js} +2 -2
  22. package/dist/cli/chunks/{chunk-2AR4B3DI.js → chunk-327YEKBU.js} +2 -2
  23. package/dist/cli/chunks/{chunk-HDJMD6UH.js → chunk-3AJUJAUJ.js} +1 -1
  24. package/dist/cli/chunks/{chunk-JOBCMNTP.js → chunk-3LELACAQ.js} +2 -2
  25. package/dist/cli/chunks/{chunk-JYX7AZHE.js → chunk-4FHJYJCH.js} +2 -2
  26. package/dist/cli/chunks/{chunk-KJWQ7ENF.js → chunk-4KEOBDEI.js} +2 -2
  27. package/dist/cli/chunks/{chunk-G6LR7FK7.js → chunk-56MXYSYY.js} +2 -2
  28. package/dist/cli/chunks/{chunk-5YGESYBC.js → chunk-5CGTBAVF.js} +1 -1
  29. package/dist/cli/chunks/{chunk-RZDNCTOA.js → chunk-5SM57X4D.js} +2 -2
  30. package/dist/cli/chunks/{chunk-O3C5RRDQ.js → chunk-5YLY2WT2.js} +3 -3
  31. package/dist/cli/chunks/{chunk-PQMLIVGV.js → chunk-6FBXYS6X.js} +2 -2
  32. package/dist/cli/chunks/{chunk-GGMQOEZZ.js → chunk-6N62KS3C.js} +2 -2
  33. package/dist/cli/chunks/{chunk-BB4OVXWF.js → chunk-6SWR2BN7.js} +1 -1
  34. package/dist/cli/chunks/{chunk-7HJHXSYT.js → chunk-6X65BGGK.js} +2 -2
  35. package/dist/cli/chunks/{chunk-P52YORQG.js → chunk-7DV42KFP.js} +2 -2
  36. package/dist/cli/chunks/{chunk-EZE2HRQB.js → chunk-7KMYBRKJ.js} +2 -2
  37. package/dist/cli/chunks/{chunk-335GHVJV.js → chunk-7OD6HFCP.js} +3 -3
  38. package/dist/cli/chunks/chunk-ABHKXMOJ.js +2 -0
  39. package/dist/cli/chunks/{chunk-L5ZLOW3K.js → chunk-ACDZ2CRV.js} +2 -2
  40. package/dist/cli/chunks/{chunk-NW7G57NR.js → chunk-ADZTWGEB.js} +2 -2
  41. package/dist/cli/chunks/{chunk-CC5G3K4X.js → chunk-AJ6DZXKK.js} +2 -2
  42. package/dist/cli/chunks/{chunk-SSXAW3ER.js → chunk-AL5QT6OX.js} +2 -2
  43. package/dist/cli/chunks/{chunk-FKPUPQQT.js → chunk-AMPYON7M.js} +2 -2
  44. package/dist/cli/chunks/{chunk-C4SZSPXY.js → chunk-APVXTHTA.js} +2 -2
  45. package/dist/cli/chunks/{chunk-FEEMJDUF.js → chunk-B7DI76SY.js} +2 -2
  46. package/dist/cli/chunks/{chunk-Q5YRPS4P.js → chunk-BDVOXGY5.js} +1 -1
  47. package/dist/cli/chunks/{chunk-VMP4M5PB.js → chunk-BDX54WJV.js} +1 -1
  48. package/dist/cli/chunks/{chunk-G5JQLUUO.js → chunk-BMRR3MBR.js} +2 -2
  49. package/dist/cli/chunks/{chunk-2UMCB7AH.js → chunk-BOR5MME3.js} +1 -1
  50. package/dist/cli/chunks/{chunk-HW62TB4T.js → chunk-BPSEFLJ6.js} +1 -1
  51. package/dist/cli/chunks/{chunk-DTOE3NYW.js → chunk-BUKGW63B.js} +12 -12
  52. package/dist/cli/chunks/{chunk-V2MD5EDD.js → chunk-C7VNQ4PY.js} +2 -2
  53. package/dist/cli/chunks/{chunk-W766S4SK.js → chunk-CDMAVNV5.js} +1 -1
  54. package/dist/cli/chunks/{chunk-K5SN66B4.js → chunk-CKFZOPZN.js} +2 -2
  55. package/dist/cli/chunks/{chunk-Y2MCIIJD.js → chunk-CMKCPRWX.js} +1 -1
  56. package/dist/cli/chunks/{chunk-DR7PCO3S.js → chunk-CQKEVUMO.js} +2 -2
  57. package/dist/cli/chunks/{chunk-2KHDGC7N.js → chunk-CTFW7CMI.js} +2 -2
  58. package/dist/cli/chunks/{chunk-5FR5GBUT.js → chunk-DGOZ3CGB.js} +2 -2
  59. package/dist/cli/chunks/{chunk-ZVPAFX4I.js → chunk-DTXHRALB.js} +2 -2
  60. package/dist/cli/chunks/{chunk-IJUYHIKN.js → chunk-E5XWCGSX.js} +2 -2
  61. package/dist/cli/chunks/{chunk-7ZIVDGSN.js → chunk-EGU54SNK.js} +1 -1
  62. package/dist/cli/chunks/{chunk-KI5BP4X5.js → chunk-EKTWIEEO.js} +2 -2
  63. package/dist/cli/chunks/{chunk-TJ6N4CCX.js → chunk-ERQL3D2O.js} +2 -2
  64. package/dist/cli/chunks/{chunk-CHO54B34.js → chunk-EZ3JVN6S.js} +2 -2
  65. package/dist/cli/chunks/{chunk-5VBPIJUZ.js → chunk-F3CKOVZM.js} +4 -4
  66. package/dist/cli/chunks/{chunk-RQN4HWGV.js → chunk-FKUH33L3.js} +2 -2
  67. package/dist/cli/chunks/{chunk-WNASEUBW.js → chunk-FTG4ZVTX.js} +11 -11
  68. package/dist/cli/chunks/{chunk-CMGYUCM7.js → chunk-FUBN5GPY.js} +1 -1
  69. package/dist/cli/chunks/{chunk-I6WHYRWB.js → chunk-GCQATSMK.js} +2 -2
  70. package/dist/cli/chunks/{chunk-TED4KOSK.js → chunk-GECWGFRR.js} +2 -2
  71. package/dist/cli/chunks/{chunk-BA6U7NSR.js → chunk-GP7IXYOY.js} +1 -1
  72. package/dist/cli/chunks/{chunk-CSEEGX5T.js → chunk-GUGUYFU5.js} +2 -2
  73. package/dist/cli/chunks/{chunk-KZ37VHMJ.js → chunk-HH5Y4NCR.js} +2 -2
  74. package/dist/cli/chunks/{chunk-DXOMRWDC.js → chunk-HNU32LN3.js} +1 -1
  75. package/dist/cli/chunks/{chunk-3AFNXU45.js → chunk-HU6ETNA7.js} +1 -1
  76. package/dist/cli/chunks/{chunk-KN5GOEYK.js → chunk-IKIKIHFQ.js} +2 -2
  77. package/dist/cli/chunks/{chunk-UGJQJSPB.js → chunk-ILNQPPKB.js} +1 -1
  78. package/dist/cli/chunks/{chunk-MJPYNGZ7.js → chunk-IQ56KMMH.js} +1 -1
  79. package/dist/cli/chunks/{chunk-SCMXIBI7.js → chunk-J6EFAKDQ.js} +2 -2
  80. package/dist/cli/chunks/{chunk-RMFRFING.js → chunk-K43YXI7C.js} +2 -2
  81. package/dist/cli/chunks/{chunk-FOPS6DRZ.js → chunk-KBAXD6PH.js} +1 -1
  82. package/dist/cli/chunks/{chunk-VS4GMNJK.js → chunk-KBXW7S3W.js} +3 -3
  83. package/dist/cli/chunks/{chunk-QJ6H2HQQ.js → chunk-KDGLNJPB.js} +1 -1
  84. package/dist/cli/chunks/{chunk-VA7TEOPM.js → chunk-KJJP446A.js} +1 -1
  85. package/dist/cli/chunks/{chunk-TC2JE5OK.js → chunk-KNOO6TFO.js} +3 -3
  86. package/dist/cli/chunks/{chunk-HAEUPIKW.js → chunk-KPV4N4KT.js} +2 -2
  87. package/dist/cli/chunks/{chunk-IKVNYK7Y.js → chunk-KV5OZ6T3.js} +2 -2
  88. package/dist/cli/chunks/{chunk-RG552ROA.js → chunk-LGEPR7MH.js} +3 -3
  89. package/dist/cli/chunks/{chunk-7WX3MKRS.js → chunk-LIAW5FD7.js} +2 -2
  90. package/dist/cli/chunks/{chunk-MUV56BPK.js → chunk-LOZAUP6L.js} +2 -2
  91. package/dist/cli/chunks/{chunk-BUYPRUNY.js → chunk-LWVUNBZO.js} +2 -2
  92. package/dist/cli/chunks/{chunk-FZRU73M4.js → chunk-M4XVEUUM.js} +2 -2
  93. package/dist/cli/chunks/{chunk-ICK3B24H.js → chunk-MALFTRCT.js} +2 -2
  94. package/dist/cli/chunks/{chunk-MBF3Q7FQ.js → chunk-MF4FULAI.js} +1 -1
  95. package/dist/cli/chunks/{chunk-7F7U2HUH.js → chunk-MNHGBG4D.js} +1 -1
  96. package/dist/cli/chunks/{chunk-XIFPIVZI.js → chunk-MNNNA57O.js} +2 -2
  97. package/dist/cli/chunks/{chunk-BZPF6GTL.js → chunk-N57BKUVE.js} +1 -1
  98. package/dist/cli/chunks/{chunk-TO5PQSDD.js → chunk-NDAJWCXN.js} +2 -2
  99. package/dist/cli/chunks/{chunk-NLHISTL2.js → chunk-OELLHV7S.js} +2 -2
  100. package/dist/cli/chunks/{chunk-PM566XEO.js → chunk-OEZNUXY7.js} +1 -1
  101. package/dist/cli/chunks/{chunk-4GU656WM.js → chunk-OIUIVV2N.js} +1 -1
  102. package/dist/cli/chunks/{chunk-CVGXB7IX.js → chunk-OMIGKGJJ.js} +2 -2
  103. package/dist/cli/chunks/{chunk-62RELCU6.js → chunk-OSAPKOGN.js} +1 -1
  104. package/dist/cli/chunks/{chunk-72VZGAMJ.js → chunk-P2FYRAC5.js} +1 -1
  105. package/dist/cli/chunks/{chunk-W2OMW6UU.js → chunk-P65S7AZA.js} +2 -2
  106. package/dist/cli/chunks/{chunk-VZ67ZDB3.js → chunk-PHIEJAQK.js} +3 -3
  107. package/dist/cli/chunks/chunk-PSA2SOON.js +18 -0
  108. package/dist/cli/chunks/{chunk-USB44IHJ.js → chunk-PXKVW6PT.js} +2 -2
  109. package/dist/cli/chunks/{chunk-64M3FFM4.js → chunk-QYST2TZW.js} +2 -2
  110. package/dist/cli/chunks/{chunk-MUAHFGIX.js → chunk-R554WVIG.js} +2 -2
  111. package/dist/cli/chunks/{chunk-TJEJ4UVX.js → chunk-R5HC6JVJ.js} +2 -2
  112. package/dist/cli/chunks/{chunk-6X3RJBA3.js → chunk-R6LDR3IO.js} +2 -2
  113. package/dist/cli/chunks/{chunk-OPIWFXME.js → chunk-RFQIC6ZF.js} +1 -1
  114. package/dist/cli/chunks/{chunk-EM2JIIAQ.js → chunk-RXEQB4OT.js} +2 -2
  115. package/dist/cli/chunks/{chunk-BGRJZH5Q.js → chunk-RXH2TC2K.js} +2 -2
  116. package/dist/cli/chunks/{chunk-DQDFACYW.js → chunk-SVUWAV6Y.js} +1 -1
  117. package/dist/cli/chunks/{chunk-POKMJTD2.js → chunk-SYLTJKN2.js} +1 -1
  118. package/dist/cli/chunks/{chunk-WJYTLRA5.js → chunk-T6TQPF5P.js} +3 -3
  119. package/dist/cli/chunks/{chunk-FI5SSLEF.js → chunk-T75VH6NT.js} +2 -2
  120. package/dist/cli/chunks/{chunk-EGH3H7QO.js → chunk-TERRRQVY.js} +1 -1
  121. package/dist/cli/chunks/{chunk-2ALNNXFF.js → chunk-TFVWUR2U.js} +2 -2
  122. package/dist/cli/chunks/{chunk-MK3J7JVZ.js → chunk-TLYZPOA7.js} +2 -2
  123. package/dist/cli/chunks/{chunk-RYUSZ43T.js → chunk-TMQ3S7HR.js} +1 -1
  124. package/dist/cli/chunks/{chunk-Z3W3R4CW.js → chunk-TQNNKW7K.js} +2 -2
  125. package/dist/cli/chunks/{chunk-PT3FTGKZ.js → chunk-TRHUH24V.js} +2 -2
  126. package/dist/cli/chunks/{chunk-5XFX25AJ.js → chunk-UEIIIDBJ.js} +2 -2
  127. package/dist/cli/chunks/{chunk-YKOTOCO6.js → chunk-UF3YOGHV.js} +2 -2
  128. package/dist/cli/chunks/{chunk-UUOXV3NS.js → chunk-UFPCNUJA.js} +10 -10
  129. package/dist/cli/chunks/{chunk-FZIHOMGY.js → chunk-V2QYW5KW.js} +2 -2
  130. package/dist/cli/chunks/{chunk-AAATFEIL.js → chunk-VHYACXLN.js} +2 -2
  131. package/dist/cli/chunks/chunk-VM6VBRRU.js +43 -0
  132. package/dist/cli/chunks/{chunk-ZT2WHCVM.js → chunk-VOHYQ6MX.js} +2 -2
  133. package/dist/cli/chunks/{chunk-C6GYLCTX.js → chunk-VQU2JXTK.js} +3 -3
  134. package/dist/cli/chunks/{chunk-FU5RNEXV.js → chunk-W7LBT3BF.js} +2 -2
  135. package/dist/cli/chunks/{chunk-GCF42L7M.js → chunk-WC5PM33J.js} +3 -3
  136. package/dist/cli/chunks/{chunk-WT4ZDDFM.js → chunk-WE5QHYL7.js} +1 -1
  137. package/dist/cli/chunks/chunk-WKWIUS5G.js +3 -0
  138. package/dist/cli/chunks/chunk-WL5VMIO4.js +2 -0
  139. package/dist/cli/chunks/{chunk-OHSVDMF7.js → chunk-WMNGPIP3.js} +1 -1
  140. package/dist/cli/chunks/{chunk-UVVKFBF7.js → chunk-WRMUQVKY.js} +2 -2
  141. package/dist/cli/chunks/{chunk-NNGCUJWQ.js → chunk-WY5CX3VH.js} +2 -2
  142. package/dist/cli/chunks/{chunk-36MPDANH.js → chunk-WYFEVPLO.js} +1 -1
  143. package/dist/cli/chunks/{chunk-RHC7TFPU.js → chunk-X47GHZY3.js} +2 -2
  144. package/dist/cli/chunks/{chunk-TR5GOGH3.js → chunk-XNNYHQLW.js} +5 -5
  145. package/dist/cli/chunks/{chunk-27JCWG5J.js → chunk-YDZIPP3Y.js} +2 -2
  146. package/dist/cli/chunks/{chunk-KDLYTJ5C.js → chunk-YRO7HNS4.js} +2 -2
  147. package/dist/cli/chunks/{chunk-SPEUF7ZL.js → chunk-YSCEUK55.js} +2 -2
  148. package/dist/cli/chunks/chunk-YY4KXDI6.js +2 -0
  149. package/dist/cli/chunks/{chunk-ZWC6CM4R.js → chunk-YYV3FYVB.js} +1 -1
  150. package/dist/cli/chunks/{chunk-AEX75YGI.js → chunk-YZ44FUVJ.js} +2 -2
  151. package/dist/cli/chunks/chunk-Z3FA5KR6.js +316 -0
  152. package/dist/cli/chunks/{chunk-G6RKUEGL.js → chunk-Z63IOTDW.js} +2 -2
  153. package/dist/cli/chunks/{chunk-6JNNZGI2.js → chunk-ZBYMF2QJ.js} +1 -1
  154. package/dist/cli/chunks/{chunk-JYXSVSH2.js → chunk-ZF65VOQH.js} +2 -2
  155. package/dist/cli/chunks/{chunk-4SALW7OT.js → chunk-ZHWXI4SK.js} +2 -2
  156. package/dist/cli/chunks/{chunk-LMJUQWR7.js → chunk-ZL7ZOIHO.js} +1 -1
  157. package/dist/cli/chunks/{ci-RJH5LAL3.js → ci-NT4DUGQ4.js} +2 -2
  158. package/dist/cli/chunks/{ci-output-62SGMGB2.js → ci-output-PXBD2QPH.js} +2 -2
  159. package/dist/cli/chunks/{circuit-breaker-QXTS5ZAW.js → circuit-breaker-ZPCCEEDX.js} +2 -2
  160. package/dist/cli/chunks/{claude-flow-setup-BBCCT5WV.js → claude-flow-setup-CZCDFZOE.js} +2 -2
  161. package/dist/cli/chunks/client-S7DIRNFJ.js +2 -0
  162. package/dist/cli/chunks/{cline-installer-IZCUJJ3I.js → cline-installer-6J2S7GLM.js} +2 -2
  163. package/dist/cli/chunks/{code-AWNVOZ7S.js → code-UTERK5AP.js} +2 -2
  164. package/dist/cli/chunks/{code-index-extractor-MX65BKMI.js → code-index-extractor-O3MJTOS2.js} +2 -2
  165. package/dist/cli/chunks/{codex-installer-EQT6JVLM.js → codex-installer-AZJIVXJR.js} +2 -2
  166. package/dist/cli/chunks/{completions-WOJAM45W.js → completions-A6ANQSZN.js} +2 -2
  167. package/dist/cli/chunks/{complexity-analyzer-3DJB7V3K.js → complexity-analyzer-MRSN7VUP.js} +2 -2
  168. package/dist/cli/chunks/{continuedev-installer-P4KWUTCJ.js → continuedev-installer-6LMKQRUI.js} +2 -2
  169. package/dist/cli/chunks/{copilot-installer-FFZWTMWQ.js → copilot-installer-KP3TWUNO.js} +2 -2
  170. package/dist/cli/chunks/core-handlers-NM2KCI6Z.js +2 -0
  171. package/dist/cli/chunks/{cost-tracker-CYBOV3NI.js → cost-tracker-R3C5IQPZ.js} +2 -2
  172. package/dist/cli/chunks/{coverage-GTZJBSC4.js → coverage-MR4QA2NM.js} +3 -3
  173. package/dist/cli/chunks/cross-domain-router-3TSZMCBM.js +2 -0
  174. package/dist/cli/chunks/{cursor-installer-WZIVXGGB.js → cursor-installer-LPZ7NGOS.js} +2 -2
  175. package/dist/cli/chunks/{daemon-JWMHEJEN.js → daemon-K3KW2UDV.js} +4 -4
  176. package/dist/cli/chunks/{daemon-MSFN2LXY.js → daemon-X5KXHRY3.js} +3 -3
  177. package/dist/cli/chunks/{dag-attention-scheduler-4TWOTTQE.js → dag-attention-scheduler-J4FJSGNN.js} +2 -2
  178. package/dist/cli/chunks/{detect-YZ6AGQPB.js → detect-22TX2NCA.js} +2 -2
  179. package/dist/cli/chunks/{dist-node-3EM2XH54.js → dist-node-QI4I4QPS.js} +2 -2
  180. package/dist/cli/chunks/{domain-handler-4XU5BINU.js → domain-handler-ZYZGPNOQ.js} +2 -2
  181. package/dist/cli/chunks/{domain-transfer-HUFC7I52.js → domain-transfer-2EEQTNIU.js} +2 -2
  182. package/dist/cli/chunks/dream-QIIJONYI.js +2 -0
  183. package/dist/cli/chunks/{embed-and-insert-pattern-J5ZFM6YX.js → embed-and-insert-pattern-LYCTU5BS.js} +2 -2
  184. package/dist/cli/chunks/eval-SOA72GUX.js +17 -0
  185. package/dist/cli/chunks/{experience-capture-middleware-E3RYQB6Z.js → experience-capture-middleware-AFFYOMYM.js} +3 -3
  186. package/dist/cli/chunks/{fast-paths-DKIYN2YS.js → fast-paths-WNMHOSUH.js} +2 -2
  187. package/dist/cli/chunks/{feature-flags-ZB63Z7N5.js → feature-flags-FT4YBZH4.js} +2 -2
  188. package/dist/cli/chunks/{feature-flags-S2RNZATS.js → feature-flags-HAP5IAAY.js} +2 -2
  189. package/dist/cli/chunks/{file-discovery-USJJLYQU.js → file-discovery-B4FFOH3Z.js} +2 -2
  190. package/dist/cli/chunks/{fleet-4MUPHSF5.js → fleet-2ICPYV3J.js} +3 -3
  191. package/dist/cli/chunks/{gnn-wrapper-PYOQZKX6.js → gnn-wrapper-XIBJAHMW.js} +2 -2
  192. package/dist/cli/chunks/{heartbeat-handler-HLO5XCG7.js → heartbeat-handler-NSLSKDOI.js} +4 -4
  193. package/dist/cli/chunks/heartbeat-scheduler-CDNGLJJO.js +2 -0
  194. package/dist/cli/chunks/hnsw-adapter-CR7Y4OAM.js +2 -0
  195. package/dist/cli/chunks/hnsw-index-TEDO4MQC.js +2 -0
  196. package/dist/cli/chunks/{hnsw-legacy-bridge-FZEH2KLM.js → hnsw-legacy-bridge-FTV4CCBB.js} +2 -2
  197. package/dist/cli/chunks/{better-sqlite3-LRDXKYOJ.js → hnswlib-node-BCASOCNU.js} +2 -2
  198. package/dist/cli/chunks/{hooks-R2757K57.js → hooks-SM4EU52N.js} +10 -10
  199. package/dist/cli/chunks/hybrid-router-O24ZDIP5.js +2 -0
  200. package/dist/cli/chunks/{hypergraph-engine-EAV3GJ5D.js → hypergraph-engine-RRMX4N3L.js} +2 -2
  201. package/dist/cli/chunks/{hypergraph-handler-5ERXAVGH.js → hypergraph-handler-MNFGDKAP.js} +3 -3
  202. package/dist/cli/chunks/impact-analyzer-PDM4SDB6.js +2 -0
  203. package/dist/cli/chunks/{init-handler-RXUSEMG7.js → init-handler-BNHIJ5TX.js} +6 -6
  204. package/dist/cli/chunks/init-wizard-F4KODPNW.js +2 -0
  205. package/dist/cli/chunks/kernel-77UM35L6.js +2 -0
  206. package/dist/cli/chunks/{kilocode-installer-ZUBVBHGT.js → kilocode-installer-GFKUKPLY.js} +2 -2
  207. package/dist/cli/chunks/{kiro-installer-TRTRQDGL.js → kiro-installer-YBIYKODN.js} +2 -2
  208. package/dist/cli/chunks/knowledge-graph-R6ZWWV2K.js +2 -0
  209. package/dist/cli/chunks/{learning-UYXWAU5D.js → learning-QEWUPCK6.js} +3 -3
  210. package/dist/cli/chunks/{llm-router-TB5OJPEV.js → llm-router-D5FQIMVQ.js} +5 -5
  211. package/dist/cli/chunks/llm-router-service-7QYCZ66H.js +2 -0
  212. package/dist/cli/chunks/{load-ELPSUIPV.js → load-CLBUCKZQ.js} +2 -2
  213. package/dist/cli/chunks/load-test-AWVA3CAQ.js +2 -0
  214. package/dist/cli/chunks/{mcp-UX7TK3XV.js → mcp-VOMG5DPV.js} +2 -2
  215. package/dist/cli/chunks/{memory-W3LG6H6N.js → memory-WZO63VSC.js} +5 -5
  216. package/dist/cli/chunks/memory-backend-YESSIHFW.js +2 -0
  217. package/dist/cli/chunks/memory-handlers-EOOWSUHI.js +2 -0
  218. package/dist/cli/chunks/{multi-model-executor-227LWZRY.js → multi-model-executor-7UKW43VV.js} +2 -2
  219. package/dist/cli/chunks/{opencode-installer-F4WKVWDL.js → opencode-installer-MLFPRRL2.js} +2 -2
  220. package/dist/cli/chunks/{orchestrator-V4DBMGK6.js → orchestrator-XNYDBGIN.js} +18 -18
  221. package/dist/cli/chunks/pattern-null-store-X3UXLJNL.js +2 -0
  222. package/dist/cli/chunks/{pattern-usage-recorder-BY3HEWSU.js → pattern-usage-recorder-ZAP7ASQI.js} +2 -2
  223. package/dist/cli/chunks/{pipeline-3F5RIESX.js → pipeline-4EJYOPBC.js} +2 -2
  224. package/dist/cli/chunks/{platform-KCGXTZO3.js → platform-ALPOWCOH.js} +2 -2
  225. package/dist/cli/chunks/{plugin-2H552KOV.js → plugin-S2RX3KHR.js} +2 -2
  226. package/dist/cli/chunks/{prime-radiant-advanced-wasm-EFKVL7VN.js → prime-radiant-advanced-wasm-P2JB73XX.js} +2 -2
  227. package/dist/cli/chunks/protocol-executor-KXDCTMWI.js +2 -0
  228. package/dist/cli/chunks/{protocol-handler-ELGYV7D2.js → protocol-handler-ZBJXSESA.js} +2 -2
  229. package/dist/cli/chunks/{prove-AYJCQYNI.js → prove-MYJ5YV45.js} +2 -2
  230. package/dist/cli/chunks/provider-manager-XJZVHYI6.js +2 -0
  231. package/dist/cli/chunks/qe-reasoning-bank-DPHPNIC6.js +2 -0
  232. package/dist/cli/chunks/{quality-HH7L5A7V.js → quality-NIACQC4M.js} +2 -2
  233. package/dist/cli/chunks/{quality-gate-NAQLXE4C.js → quality-gate-OAZ23ON5.js} +3 -3
  234. package/dist/cli/chunks/queen-coordinator-EVGWME5C.js +2 -0
  235. package/dist/cli/chunks/{real-embeddings-IO3F4ZFR.js → real-embeddings-6I4LP7PL.js} +2 -2
  236. package/dist/cli/chunks/{roocode-installer-X4TU5HO4.js → roocode-installer-LRQHP6MK.js} +2 -2
  237. package/dist/cli/chunks/router-R2N7TMAS.js +2 -0
  238. package/dist/cli/chunks/routing-feedback-G6W3H26L.js +2 -0
  239. package/dist/cli/chunks/{routing-handler-ZJKGDDMT.js → routing-handler-A7BW7MV4.js} +2 -2
  240. package/dist/cli/chunks/{ruvector-commands-NXCSUBN2.js → ruvector-commands-ZDRRFSJS.js} +2 -2
  241. package/dist/cli/chunks/{rvf-dual-writer-JMA74SKP.js → rvf-dual-writer-QWE3Z6BB.js} +2 -2
  242. package/dist/cli/chunks/{rvf-migration-adapter-BNTGH2KU.js → rvf-migration-adapter-6UDAP7QB.js} +2 -2
  243. package/dist/cli/chunks/{rvf-migration-coordinator-7T2HHUOH.js → rvf-migration-coordinator-FEW2N4R4.js} +2 -2
  244. package/dist/cli/chunks/rvf-native-adapter-D7R2GWXK.js +2 -0
  245. package/dist/cli/chunks/safe-db-CQZGF2KA.js +2 -0
  246. package/dist/cli/chunks/schedule-UP7E3LRC.js +2 -0
  247. package/dist/cli/chunks/scheduler-ENIZHYSL.js +2 -0
  248. package/dist/cli/chunks/{security-XSK2QHB3.js → security-KFXBV65O.js} +3 -3
  249. package/dist/cli/chunks/{shared-rvf-adapter-WLRKI7RY.js → shared-rvf-adapter-HDDCXCHY.js} +2 -2
  250. package/dist/cli/chunks/{shared-rvf-dual-writer-SZW3J7ZK.js → shared-rvf-dual-writer-CXXTB7CU.js} +2 -2
  251. package/dist/cli/chunks/sqlite-persistence-CEVJVWS5.js +2 -0
  252. package/dist/cli/chunks/status-handler-CXSVM236.js +47 -0
  253. package/dist/cli/chunks/{structural-health-4SJCFX63.js → structural-health-LMHSM7MJ.js} +2 -2
  254. package/dist/cli/chunks/{sync-7WAVNZGL.js → sync-DMOUY2EY.js} +2 -2
  255. package/dist/cli/chunks/{sync-ATR4DUSA.js → sync-REEFKICL.js} +2 -2
  256. package/dist/cli/chunks/{task-handler-O6REL34Y.js → task-handler-DMSNFIH3.js} +2 -2
  257. package/dist/cli/chunks/{task-handlers-WFV2ZYWW.js → task-handlers-3Z3QV7X7.js} +3 -3
  258. package/dist/cli/chunks/{test-4LXUVHEU.js → test-U6CGMDLN.js} +4 -4
  259. package/dist/cli/chunks/{test-scheduling-OTN3DMKY.js → test-scheduling-YHYA3BP5.js} +3 -3
  260. package/dist/cli/chunks/{token-bootstrap-VA7T4P42.js → token-bootstrap-MQCTJURQ.js} +2 -2
  261. package/dist/cli/chunks/{token-usage-TLT6OXXR.js → token-usage-EOOTM7Q3.js} +2 -2
  262. package/dist/cli/chunks/{transformers-JI7LZRQ3.js → transformers-EKDJW2H6.js} +2 -2
  263. package/dist/cli/chunks/{tree-sitter-wasm-parser-QNIMHB4K.js → tree-sitter-wasm-parser-HTGAXDQA.js} +2 -2
  264. package/dist/cli/chunks/{types-DJNWOAC6.js → types-GLRXY4RY.js} +2 -2
  265. package/dist/cli/chunks/unified-memory-PXOQ4N53.js +2 -0
  266. package/dist/cli/chunks/unified-memory-hnsw-VEXD6ASE.js +2 -0
  267. package/dist/cli/chunks/unified-persistence-46G6MZYC.js +2 -0
  268. package/dist/cli/chunks/{upgrade-VEW4FL23.js → upgrade-KU55H77X.js} +2 -2
  269. package/dist/cli/chunks/{validate-O3P6PF7B.js → validate-26VSBOJN.js} +2 -2
  270. package/dist/cli/chunks/{validate-swarm-M2HXHZVC.js → validate-swarm-OIALRDKF.js} +2 -2
  271. package/dist/cli/chunks/{vibium-GOU55LUO.js → vibium-LOTWW25P.js} +2 -2
  272. package/dist/cli/chunks/visual-security-4X3T3MFL.js +2 -0
  273. package/dist/cli/chunks/{web-tree-sitter-MXOI4GH3.js → web-tree-sitter-6LWPPBYU.js} +2 -2
  274. package/dist/cli/chunks/{windsurf-installer-6GKT53IH.js → windsurf-installer-ILOQYENG.js} +2 -2
  275. package/dist/cli/chunks/witness-chain-XW4S3LVW.js +2 -0
  276. package/dist/cli/chunks/{witness-chain-OXGQGL26.js → witness-chain-YBS6OHS4.js} +2 -2
  277. package/dist/cli/chunks/{witness-key-manager-PGFSQXUJ.js → witness-key-manager-SI3WV3ZQ.js} +2 -2
  278. package/dist/cli/chunks/{workflow-ENBWRMBA.js → workflow-GY6SJRQW.js} +4 -4
  279. package/dist/cli/chunks/workflow-orchestrator-IIVV6TCP.js +2 -0
  280. package/dist/cli/chunks/{wrappers-MHLNYANQ.js → wrappers-MMO5YKOZ.js} +2 -2
  281. package/dist/cli/commands/eval.js +73 -3
  282. package/dist/cli/commands/llm-router.js +2 -0
  283. package/dist/cli/handlers/status-handler.d.ts +5 -0
  284. package/dist/cli/handlers/status-handler.js +35 -0
  285. package/dist/coordination/consensus/providers/index.js +11 -0
  286. package/dist/init/init-wizard-hooks.js +11 -25
  287. package/dist/init/phases/07-hooks.js +15 -25
  288. package/dist/init/settings-merge.d.ts +44 -0
  289. package/dist/init/settings-merge.js +119 -4
  290. package/dist/mcp/bundle.js +412 -393
  291. package/dist/shared/llm/billing-modes.d.ts +24 -0
  292. package/dist/shared/llm/billing-modes.js +56 -0
  293. package/dist/shared/llm/cost-tracker.js +2 -0
  294. package/dist/shared/llm/interfaces.d.ts +61 -3
  295. package/dist/shared/llm/provider-manager.d.ts +34 -0
  296. package/dist/shared/llm/provider-manager.js +152 -3
  297. package/dist/shared/llm/providers/claude-code.d.ts +57 -0
  298. package/dist/shared/llm/providers/claude-code.js +312 -0
  299. package/dist/shared/llm/providers/cognitum.d.ts +64 -0
  300. package/dist/shared/llm/providers/cognitum.js +369 -0
  301. package/dist/shared/llm/providers/index.d.ts +2 -0
  302. package/dist/shared/llm/providers/index.js +2 -0
  303. package/dist/shared/llm/router/config-store.d.ts +31 -11
  304. package/dist/shared/llm/router/config-store.js +82 -12
  305. package/dist/shared/llm/router/hybrid-router.js +16 -0
  306. package/dist/shared/llm/router/types.js +7 -0
  307. package/dist/shared/llm/spend-ledger.d.ts +64 -0
  308. package/dist/shared/llm/spend-ledger.js +115 -0
  309. package/dist/shared/llm/translation/message-formatter.js +2 -0
  310. package/dist/shared/llm/translation/prompt-translator.js +2 -0
  311. package/dist/shared/llm/translation/tool-translator.js +2 -0
  312. package/dist/validation/index.d.ts +1 -0
  313. package/dist/validation/index.js +2 -0
  314. package/dist/validation/provider-llm-executor.d.ts +45 -0
  315. package/dist/validation/provider-llm-executor.js +98 -0
  316. package/package.json +1 -1
  317. package/dist/cli/chunks/adapter-6IWRIHF3.js +0 -2
  318. package/dist/cli/chunks/aqe-learning-engine-FSF5U67K.js +0 -2
  319. package/dist/cli/chunks/base-2CKCJU3O.js +0 -2
  320. package/dist/cli/chunks/browser-workflow-UGYJE64S.js +0 -2
  321. package/dist/cli/chunks/chunk-2AOOIAW3.js +0 -316
  322. package/dist/cli/chunks/chunk-3B4XXFKD.js +0 -18
  323. package/dist/cli/chunks/chunk-BBC526PL.js +0 -24
  324. package/dist/cli/chunks/chunk-ESDGCTC4.js +0 -2
  325. package/dist/cli/chunks/chunk-IDLNLSQI.js +0 -3
  326. package/dist/cli/chunks/chunk-MDT3LIXS.js +0 -2
  327. package/dist/cli/chunks/client-E2XUBCLK.js +0 -2
  328. package/dist/cli/chunks/core-handlers-46Z5VOO6.js +0 -2
  329. package/dist/cli/chunks/cross-domain-router-SXQ3HFRY.js +0 -2
  330. package/dist/cli/chunks/dream-R6MQQQ3N.js +0 -2
  331. package/dist/cli/chunks/eval-XYOA3EH2.js +0 -15
  332. package/dist/cli/chunks/heartbeat-scheduler-OSDPJT6A.js +0 -2
  333. package/dist/cli/chunks/hnsw-adapter-KMGSHBIN.js +0 -2
  334. package/dist/cli/chunks/hnsw-index-IMFRAOPE.js +0 -2
  335. package/dist/cli/chunks/hybrid-router-57QSWSWC.js +0 -2
  336. package/dist/cli/chunks/impact-analyzer-OC4MPBGA.js +0 -2
  337. package/dist/cli/chunks/init-wizard-CDBRL4PO.js +0 -2
  338. package/dist/cli/chunks/kernel-CQ7R3AAV.js +0 -2
  339. package/dist/cli/chunks/knowledge-graph-UXNH7RY4.js +0 -2
  340. package/dist/cli/chunks/llm-router-service-UV34YXBE.js +0 -2
  341. package/dist/cli/chunks/load-test-2VEN3PQZ.js +0 -2
  342. package/dist/cli/chunks/memory-backend-TZL5U6F3.js +0 -2
  343. package/dist/cli/chunks/memory-handlers-BNXAYS2P.js +0 -2
  344. package/dist/cli/chunks/pattern-null-store-KLX2RNHM.js +0 -2
  345. package/dist/cli/chunks/protocol-executor-5HJKW6MC.js +0 -2
  346. package/dist/cli/chunks/provider-manager-TRZSBXD3.js +0 -2
  347. package/dist/cli/chunks/qe-reasoning-bank-RCEYSLVV.js +0 -2
  348. package/dist/cli/chunks/queen-coordinator-6JFZD54W.js +0 -2
  349. package/dist/cli/chunks/router-KRLC46NS.js +0 -2
  350. package/dist/cli/chunks/routing-feedback-WW26H6SA.js +0 -2
  351. package/dist/cli/chunks/rvf-native-adapter-OVQKPQUH.js +0 -2
  352. package/dist/cli/chunks/safe-db-UQOCQIH2.js +0 -2
  353. package/dist/cli/chunks/schedule-EUX7ZQUK.js +0 -2
  354. package/dist/cli/chunks/scheduler-MALHQKNR.js +0 -2
  355. package/dist/cli/chunks/sqlite-persistence-OBCLRP4L.js +0 -2
  356. package/dist/cli/chunks/status-handler-HGCKYJX2.js +0 -46
  357. package/dist/cli/chunks/unified-memory-A5BS3LGX.js +0 -2
  358. package/dist/cli/chunks/unified-memory-hnsw-WJLJO5MY.js +0 -2
  359. package/dist/cli/chunks/unified-persistence-CFC2BKI5.js +0 -2
  360. package/dist/cli/chunks/visual-security-VPB6KVYJ.js +0 -2
  361. package/dist/cli/chunks/witness-chain-ZZAUAXDY.js +0 -2
  362. package/dist/cli/chunks/workflow-orchestrator-S4LBFTYD.js +0 -2
@@ -1,5 +1,5 @@
1
- import{createRequire as __cr}from"module";const require=__cr(import.meta.url);if(process.argv.includes('--version')||process.argv.includes('-v')){console.log("3.12.0");process.exit(0)}
2
- import"./chunk-EZE2HRQB.js";import{b as $}from"./chunk-MBF3Q7FQ.js";import{d as R}from"./chunk-SPEUF7ZL.js";import{b as k,c as C,d as b}from"./chunk-JYX7AZHE.js";import{c as W}from"./chunk-K5SN66B4.js";import"./chunk-7ZIVDGSN.js";import"./chunk-RHC7TFPU.js";import"./chunk-3AFNXU45.js";import{Command as O}from"commander";import o from"chalk";function P(d,a){let m=d.indexOf("=");return m>0&&(a[d.substring(0,m)]=d.substring(m+1)),a}function x(d,a,m){let y=new O("workflow").description("Manage QE workflows and pipelines (ADR-041)");return y.command("run <file>").description("Execute a QE pipeline from YAML file").option("-w, --watch","Watch execution progress").option("-v, --verbose","Show detailed output").option("--params <json>","Additional parameters as JSON","{}").action(async(t,l)=>{if(!await m())return;let e=await import("fs"),c=(await import("path")).resolve(t);try{console.log(o.blue(`
1
+ import{createRequire as __cr}from"module";const require=__cr(import.meta.url);if(process.argv.includes('--version')||process.argv.includes('-v')){console.log("3.12.2");process.exit(0)}
2
+ import"./chunk-7KMYBRKJ.js";import{b as $}from"./chunk-MF4FULAI.js";import{d as R}from"./chunk-YSCEUK55.js";import{b as k,c as C,d as b}from"./chunk-4FHJYJCH.js";import{c as W}from"./chunk-CKFZOPZN.js";import"./chunk-EGU54SNK.js";import"./chunk-X47GHZY3.js";import"./chunk-HU6ETNA7.js";import{Command as O}from"commander";import o from"chalk";function P(d,a){let m=d.indexOf("=");return m>0&&(a[d.substring(0,m)]=d.substring(m+1)),a}function x(d,a,m){let y=new O("workflow").description("Manage QE workflows and pipelines (ADR-041)");return y.command("run <file>").description("Execute a QE pipeline from YAML file").option("-w, --watch","Watch execution progress").option("-v, --verbose","Show detailed output").option("--params <json>","Additional parameters as JSON","{}").action(async(t,l)=>{if(!await m())return;let e=await import("fs"),c=(await import("path")).resolve(t);try{console.log(o.blue(`
3
3
  Running workflow from: ${t}
4
4
  `));let s=k(c);if(!s.success||!s.workflow){console.log(o.red("Failed to parse pipeline:"));for(let w of s.errors)console.log(o.red(` ${w}`));await a(1)}let r={...W(l.params,"params")};if(s.pipeline){for(let w of s.pipeline.stages)if(w.params)for(let[S,h]of Object.entries(w.params))r[S]=h}if(!d.workflowOrchestrator.getWorkflow(s.workflow.id)){let w=d.workflowOrchestrator.registerWorkflow(s.workflow);w.success||(console.log(o.red(`Failed to register workflow: ${w.error.message}`)),await a(1))}let n=await d.workflowOrchestrator.executeWorkflow(s.workflow.id,r);if(!n.success){console.log(o.red(`Failed to start workflow: ${n.error.message}`)),await a(1);return}let p=n.value;if(console.log(o.cyan(` Execution ID: ${p}`)),console.log(o.gray(` Workflow: ${s.workflow.name}`)),console.log(o.gray(` Stages: ${s.workflow.steps.length}`)),console.log(""),l.watch){console.log(o.blue(`Workflow Progress:
5
5
  `));let w,S=Date.now();for(;;){let g=d.workflowOrchestrator.getWorkflowStatus(p);if(!g)break;if(!w||w.progress!==g.progress||w.status!==g.status||JSON.stringify(w.currentSteps)!==JSON.stringify(g.currentSteps)){process.stdout.write("\r\x1B[K");let v="\u2588".repeat(Math.floor(g.progress/5))+"\u2591".repeat(20-Math.floor(g.progress/5)),D=g.status==="completed"?o.green:g.status==="failed"?o.red:g.status==="running"?o.yellow:o.gray;console.log(` [${v}] ${g.progress}% - ${D(g.status)}`),g.currentSteps.length>0&&l.verbose&&console.log(o.gray(` Running: ${g.currentSteps.join(", ")}`)),w=g}if(g.status==="completed"||g.status==="failed"||g.status==="cancelled")break;await new Promise(v=>setTimeout(v,500))}let h=d.workflowOrchestrator.getWorkflowStatus(p);if(h){console.log("");let g=h.duration||Date.now()-S;h.status==="completed"?(console.log(o.green("Workflow completed successfully")),console.log(o.gray(` Duration: ${$(g)}`)),console.log(o.gray(` Completed: ${h.completedSteps.length} stages`)),h.skippedSteps.length>0&&console.log(o.yellow(` Skipped: ${h.skippedSteps.length} stages`))):h.status==="failed"?(console.log(o.red("Workflow failed")),console.log(o.red(` Error: ${h.error}`)),console.log(o.gray(` Failed stages: ${h.failedSteps.join(", ")}`))):console.log(o.yellow(`Workflow ${h.status}`))}}else console.log(o.green("Workflow execution started")),console.log(o.gray(` Use 'aqe workflow status ${p}' to check progress`));console.log(""),await a(0)}catch(s){console.error(o.red(`
@@ -35,10 +35,10 @@ Workflow cancelled: ${t}
35
35
  `)):console.log(o.red(`
36
36
  Failed to cancel workflow: ${l.error.message}
37
37
  `)),await a(l.success?0:1)}catch(l){console.error(o.red(`
38
- Failed to cancel workflow:`),l),await a(1)}}),y.command("browser-list").description("List available browser workflow templates").action(async()=>{try{let{BrowserWorkflowTool:t}=await import("./browser-workflow-UGYJE64S.js"),e=await new t().invoke({});if(e.success&&e.data){console.log(o.blue(`
38
+ Failed to cancel workflow:`),l),await a(1)}}),y.command("browser-list").description("List available browser workflow templates").action(async()=>{try{let{BrowserWorkflowTool:t}=await import("./browser-workflow-XTKUHTIT.js"),e=await new t().invoke({});if(e.success&&e.data){console.log(o.blue(`
39
39
  Browser Workflow Templates:
40
40
  `));for(let u of e.data.availableTemplates)console.log(` ${o.cyan(u)}`);console.log("")}else console.log(o.red(`Failed: ${e.error||"Unknown error"}`));await a(0)}catch(t){console.error(o.red(`
41
- Failed:`),t),await a(1)}}),y.command("browser-load [template]").description("Load and validate a browser workflow template or inline YAML").option("--yaml <yaml>","Inline YAML workflow definition").option("-v, --var <key=value>","Variable override (repeatable)",P,{}).option("-F, --format <format>","Output format (text|json)","text").option("-o, --output <path>","Write output to file").action(async(t,l)=>{try{let{BrowserWorkflowTool:e}=await import("./browser-workflow-UGYJE64S.js"),{writeOutput:u,toJSON:c}=await import("./ci-output-62SGMGB2.js"),s=new e,f={variables:l.var||{}};if(l.yaml)f.workflowYaml=l.yaml;else if(t)if(t.endsWith(".yaml")||t.endsWith(".yml")){let i=await import("fs"),p=(await import("path")).resolve(t);i.existsSync(p)||(console.log(o.red(`
41
+ Failed:`),t),await a(1)}}),y.command("browser-load [template]").description("Load and validate a browser workflow template or inline YAML").option("--yaml <yaml>","Inline YAML workflow definition").option("-v, --var <key=value>","Variable override (repeatable)",P,{}).option("-F, --format <format>","Output format (text|json)","text").option("-o, --output <path>","Write output to file").action(async(t,l)=>{try{let{BrowserWorkflowTool:e}=await import("./browser-workflow-XTKUHTIT.js"),{writeOutput:u,toJSON:c}=await import("./ci-output-PXBD2QPH.js"),s=new e,f={variables:l.var||{}};if(l.yaml)f.workflowYaml=l.yaml;else if(t)if(t.endsWith(".yaml")||t.endsWith(".yml")){let i=await import("fs"),p=(await import("path")).resolve(t);i.existsSync(p)||(console.log(o.red(`
42
42
  File not found: ${p}
43
43
  `)),await a(1)),f.workflowYaml=i.readFileSync(p,"utf-8")}else f.templateName=t;else console.log(o.red(`
44
44
  Provide a template name or --yaml. Use "workflow browser-list" to see templates.
@@ -0,0 +1,2 @@
1
+ import{createRequire as __cr}from"module";const require=__cr(import.meta.url);if(process.argv.includes('--version')||process.argv.includes('-v')){console.log("3.12.2");process.exit(0)}
2
+ import{a,b,c,d}from"./chunk-GCQATSMK.js";import"./chunk-56MXYSYY.js";import"./chunk-APVXTHTA.js";import"./chunk-AL5QT6OX.js";import"./chunk-YY4KXDI6.js";import"./chunk-R5HC6JVJ.js";import"./chunk-ACDZ2CRV.js";import"./chunk-CKFZOPZN.js";import"./chunk-P65S7AZA.js";import"./chunk-EGU54SNK.js";import"./chunk-X47GHZY3.js";import"./chunk-ZBYMF2QJ.js";import"./chunk-WRMUQVKY.js";import"./chunk-UF3YOGHV.js";import"./chunk-V2QYW5KW.js";import"./chunk-4KEOBDEI.js";import"./chunk-C7VNQ4PY.js";import"./chunk-QYST2TZW.js";import"./chunk-YZ44FUVJ.js";import"./chunk-YDZIPP3Y.js";import"./chunk-CTFW7CMI.js";import"./chunk-HU6ETNA7.js";export{b as DEFAULT_WORKFLOW_CONFIG,a as WorkflowEvents,c as WorkflowOrchestrator,d as createWorkflowOrchestrator};
@@ -1,2 +1,2 @@
1
- import{createRequire as __cr}from"module";const require=__cr(import.meta.url);if(process.argv.includes('--version')||process.argv.includes('-v')){console.log("3.12.0");process.exit(0)}
2
- import{a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v as L,w as M,x as N}from"./chunk-ZT2WHCVM.js";import{a as v,b as w,c as x,d as y,e as z,f as A,g as B,h as C,i as D,j as E,k as F,l as G,m as H,n as I,o as J,p as K}from"./chunk-ZVPAFX4I.js";import"./chunk-C4SZSPXY.js";import"./chunk-SSXAW3ER.js";import"./chunk-MDT3LIXS.js";import"./chunk-TJEJ4UVX.js";import"./chunk-L5ZLOW3K.js";import"./chunk-K5SN66B4.js";import"./chunk-W2OMW6UU.js";import"./chunk-RHC7TFPU.js";import"./chunk-UVVKFBF7.js";import"./chunk-YKOTOCO6.js";import"./chunk-FZIHOMGY.js";import"./chunk-KJWQ7ENF.js";import"./chunk-V2MD5EDD.js";import"./chunk-64M3FFM4.js";import"./chunk-AEX75YGI.js";import"./chunk-27JCWG5J.js";import"./chunk-2KHDGC7N.js";import"./chunk-3AFNXU45.js";export{z as GNNLayerFactory,i as QEFlashAttention,x as QEGNNEmbeddingIndex,y as QEGNNIndexFactory,a as QESONA,e as QE_FLASH_ATTENTION_CONFIG,g as QE_PERFORMANCE_TARGETS,f as QE_SONA_CONFIG,A as TensorCompressionFactory,u as batchComputeAttention,K as batchDifferentiableSearch,M as checkRuvectorPackagesAvailable,c as createDomainQESONA,j as createQEFlashAttention,b as createQESONA,D as getDifferentiableSearch,F as getGetCompressionLevel,E as getHierarchicalForward,G as getInit,h as getOptimalBlockConfig,k as getQEFlashAttentionConfig,n as getRuvectorDotProductAttention,m as getRuvectorFlashAttention,p as getRuvectorHyperbolicAttention,B as getRuvectorLayer,q as getRuvectorLinearAttention,r as getRuvectorMoEAttention,o as getRuvectorMultiHeadAttention,L as getRuvectorPackageVersions,C as getTensorCompress,l as getWorkloadTypes,N as initAllRuvectorPackages,w as initGNN,d as isAttentionAvailable,v as isGNNAvailable,s as toFloat32Array,H as toFloat32ArrayGNN,J as toIEmbedding,t as toNumberArrayAttn,I as toNumberArrayGNN};
1
+ import{createRequire as __cr}from"module";const require=__cr(import.meta.url);if(process.argv.includes('--version')||process.argv.includes('-v')){console.log("3.12.2");process.exit(0)}
2
+ import{a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v as L,w as M,x as N}from"./chunk-VOHYQ6MX.js";import{a as v,b as w,c as x,d as y,e as z,f as A,g as B,h as C,i as D,j as E,k as F,l as G,m as H,n as I,o as J,p as K}from"./chunk-DTXHRALB.js";import"./chunk-APVXTHTA.js";import"./chunk-AL5QT6OX.js";import"./chunk-YY4KXDI6.js";import"./chunk-R5HC6JVJ.js";import"./chunk-ACDZ2CRV.js";import"./chunk-CKFZOPZN.js";import"./chunk-P65S7AZA.js";import"./chunk-X47GHZY3.js";import"./chunk-WRMUQVKY.js";import"./chunk-UF3YOGHV.js";import"./chunk-V2QYW5KW.js";import"./chunk-4KEOBDEI.js";import"./chunk-C7VNQ4PY.js";import"./chunk-QYST2TZW.js";import"./chunk-YZ44FUVJ.js";import"./chunk-YDZIPP3Y.js";import"./chunk-CTFW7CMI.js";import"./chunk-HU6ETNA7.js";export{z as GNNLayerFactory,i as QEFlashAttention,x as QEGNNEmbeddingIndex,y as QEGNNIndexFactory,a as QESONA,e as QE_FLASH_ATTENTION_CONFIG,g as QE_PERFORMANCE_TARGETS,f as QE_SONA_CONFIG,A as TensorCompressionFactory,u as batchComputeAttention,K as batchDifferentiableSearch,M as checkRuvectorPackagesAvailable,c as createDomainQESONA,j as createQEFlashAttention,b as createQESONA,D as getDifferentiableSearch,F as getGetCompressionLevel,E as getHierarchicalForward,G as getInit,h as getOptimalBlockConfig,k as getQEFlashAttentionConfig,n as getRuvectorDotProductAttention,m as getRuvectorFlashAttention,p as getRuvectorHyperbolicAttention,B as getRuvectorLayer,q as getRuvectorLinearAttention,r as getRuvectorMoEAttention,o as getRuvectorMultiHeadAttention,L as getRuvectorPackageVersions,C as getTensorCompress,l as getWorkloadTypes,N as initAllRuvectorPackages,w as initGNN,d as isAttentionAvailable,v as isGNNAvailable,s as toFloat32Array,H as toFloat32ArrayGNN,J as toIEmbedding,t as toNumberArrayAttn,I as toNumberArrayGNN};
@@ -15,7 +15,8 @@ import chalk from 'chalk';
15
15
  import * as fs from 'fs';
16
16
  import * as path from 'path';
17
17
  import * as yaml from 'yaml';
18
- import { createParallelEvalRunner, DEFAULT_PARALLEL_EVAL_CONFIG, } from '../../validation/parallel-eval-runner.js';
18
+ import { createParallelEvalRunner, DEFAULT_PARALLEL_EVAL_CONFIG, MockLLMExecutor, } from '../../validation/parallel-eval-runner.js';
19
+ import { resolveEvalExecutor } from '../../validation/provider-llm-executor.js';
19
20
  import { createCommandEvalRunner, isCommandEvalSuite, } from '../../validation/command-eval-runner.js';
20
21
  import { createSkillValidationLearner, } from '../../learning/skill-validation-learner.js';
21
22
  import { createRealQEReasoningBank, } from '../../learning/real-qe-reasoning-bank.js';
@@ -54,6 +55,16 @@ const P2_SKILLS = [
54
55
  /**
55
56
  * Get skills for a specific tier
56
57
  */
58
+ /**
59
+ * ADR-123: propagate a `--max-budget-usd` flag to the provider layer via the
60
+ * AQE_MAX_BUDGET_USD env var, which ProviderManager reads as a per-run cap.
61
+ */
62
+ function applyMaxBudget(maxBudgetUsd) {
63
+ if (typeof maxBudgetUsd === 'number' && Number.isFinite(maxBudgetUsd) && maxBudgetUsd > 0) {
64
+ process.env.AQE_MAX_BUDGET_USD = String(maxBudgetUsd);
65
+ console.log(chalk.gray(` Budget cap: $${maxBudgetUsd.toFixed(2)} for this run`));
66
+ }
67
+ }
57
68
  function getSkillsByTier(tier) {
58
69
  switch (tier) {
59
70
  case 3:
@@ -295,6 +306,36 @@ async function handleRunCommand(options) {
295
306
  }
296
307
  process.exit(result.passed ? 0 : 1);
297
308
  }
309
+ // Issue #557 follow-up: resolve a REAL LLM executor by default. `--mock`
310
+ // opts into canned responses (offline testing only). If neither a provider
311
+ // is configured nor --mock is passed, fail loudly rather than fabricate.
312
+ let executor;
313
+ let evalManager;
314
+ if (options.mock) {
315
+ console.log(chalk.yellow.bold(' ⚠️ MOCK MODE: canned responses, NOT real model output. Results are not valid eval evidence.'));
316
+ executor = new MockLLMExecutor();
317
+ }
318
+ else {
319
+ const resolved = await resolveEvalExecutor();
320
+ if (!resolved.executor) {
321
+ console.error(chalk.red('\n Cannot run real eval: ') + (resolved.reason ?? 'no provider'));
322
+ process.exit(1);
323
+ }
324
+ executor = resolved.executor;
325
+ evalManager = resolved.manager;
326
+ const modeLabel = resolved.billingMode === 'subscription'
327
+ ? chalk.green('subscription (no per-token charge)')
328
+ : resolved.billingMode === 'local'
329
+ ? chalk.green('local (no cost)')
330
+ : resolved.billingMode === 'metered-capped'
331
+ ? chalk.yellow('metered (server-side cap)')
332
+ : chalk.red('pay-per-token API');
333
+ console.log(` LLM provider: ${chalk.cyan(resolved.providerType)} billing: ${modeLabel}`);
334
+ if (process.env.AQE_MAX_BUDGET_USD) {
335
+ console.log(chalk.gray(` Budget cap: $${process.env.AQE_MAX_BUDGET_USD} for this run`));
336
+ }
337
+ console.log('');
338
+ }
298
339
  const { runner, reasoningBank } = await initializeRunner();
299
340
  try {
300
341
  // Configure runner
@@ -305,7 +346,7 @@ async function handleRunCommand(options) {
305
346
  timeout: options.timeout,
306
347
  retryFailedTests: options.retry,
307
348
  };
308
- const customRunner = createParallelEvalRunner(createSkillValidationLearner(reasoningBank), config);
349
+ const customRunner = createParallelEvalRunner(createSkillValidationLearner(reasoningBank), config, executor);
309
350
  // Set up progress reporting
310
351
  if (options.verbose) {
311
352
  customRunner.onProgress(displayProgress);
@@ -333,11 +374,30 @@ async function handleRunCommand(options) {
333
374
  }
334
375
  finally {
335
376
  await reasoningBank.dispose();
377
+ if (evalManager)
378
+ await evalManager.dispose();
336
379
  }
337
380
  }
338
381
  async function handleRunAllCommand(options) {
339
382
  console.log(chalk.bold('\nAQE Parallel Eval Runner - Multi-Skill'));
340
383
  console.log(chalk.dim('ADR-056 Phase 5: Worker Pool Pattern\n'));
384
+ // Issue #557 follow-up: real executor by default; --mock is offline-only.
385
+ let executor;
386
+ let evalManager;
387
+ if (options.mock) {
388
+ console.log(chalk.yellow.bold(' ⚠️ MOCK MODE: canned responses, NOT real model output. Results are not valid eval evidence.'));
389
+ executor = new MockLLMExecutor();
390
+ }
391
+ else {
392
+ const resolved = await resolveEvalExecutor();
393
+ if (!resolved.executor) {
394
+ console.error(chalk.red('\n Cannot run real eval: ') + (resolved.reason ?? 'no provider'));
395
+ process.exit(1);
396
+ }
397
+ executor = resolved.executor;
398
+ evalManager = resolved.manager;
399
+ console.log(` LLM provider: ${chalk.cyan(resolved.providerType)} billing: ${resolved.billingMode}`);
400
+ }
341
401
  const { runner, learner, reasoningBank } = await initializeRunner();
342
402
  try {
343
403
  // Get skills for tier
@@ -353,7 +413,7 @@ async function handleRunAllCommand(options) {
353
413
  ...DEFAULT_PARALLEL_EVAL_CONFIG,
354
414
  maxWorkers: options.parallel ? options.workers : 1,
355
415
  };
356
- const customRunner = createParallelEvalRunner(learner, config);
416
+ const customRunner = createParallelEvalRunner(learner, config, executor);
357
417
  // Run all evals
358
418
  const results = await customRunner.runMultipleEvalsParallel(skills, models);
359
419
  // Flatten results for display
@@ -394,6 +454,8 @@ async function handleRunAllCommand(options) {
394
454
  }
395
455
  finally {
396
456
  await reasoningBank.dispose();
457
+ if (evalManager)
458
+ await evalManager.dispose();
397
459
  }
398
460
  }
399
461
  async function handleStatusCommand(skill) {
@@ -531,7 +593,10 @@ export function createEvalCommand() {
531
593
  .option('--no-retry', 'Disable retry of failed tests')
532
594
  .option('-o, --output <path>', 'Output file path for results')
533
595
  .option('-v, --verbose', 'Show progress during execution', false)
596
+ .option('--max-budget-usd <n>', 'ADR-123: cap total LLM spend for this run in USD (aborts with COST_LIMIT_EXCEEDED past the cap)', parseFloat)
597
+ .option('--mock', 'Use canned responses instead of real model calls (offline testing only — results are NOT valid eval evidence)', false)
534
598
  .action(async (opts) => {
599
+ applyMaxBudget(opts.maxBudgetUsd);
535
600
  await handleRunCommand({
536
601
  skill: opts.skill,
537
602
  model: opts.model,
@@ -542,6 +607,7 @@ export function createEvalCommand() {
542
607
  retry: opts.retry !== false,
543
608
  output: opts.output,
544
609
  verbose: opts.verbose,
610
+ mock: opts.mock === true,
545
611
  });
546
612
  });
547
613
  // Run all evals
@@ -554,7 +620,10 @@ export function createEvalCommand() {
554
620
  .option('-w, --workers <n>', 'Number of parallel workers', parseInt, 5)
555
621
  .option('-o, --output <path>', 'Output file path for report')
556
622
  .option('-v, --verbose', 'Show progress during execution', false)
623
+ .option('--max-budget-usd <n>', 'ADR-123: cap total LLM spend for this run in USD (aborts with COST_LIMIT_EXCEEDED past the cap)', parseFloat)
624
+ .option('--mock', 'Use canned responses instead of real model calls (offline testing only — results are NOT valid eval evidence)', false)
557
625
  .action(async (opts) => {
626
+ applyMaxBudget(opts.maxBudgetUsd);
558
627
  await handleRunAllCommand({
559
628
  skillsTier: opts.skillsTier,
560
629
  models: opts.models,
@@ -562,6 +631,7 @@ export function createEvalCommand() {
562
631
  workers: opts.workers,
563
632
  output: opts.output,
564
633
  verbose: opts.verbose,
634
+ mock: opts.mock === true,
565
635
  });
566
636
  });
567
637
  // Status command
@@ -399,12 +399,14 @@ function formatCost(cost) {
399
399
  function getDefaultModelForProvider(provider) {
400
400
  const defaults = {
401
401
  claude: 'claude-sonnet-4-6',
402
+ 'claude-code': 'sonnet',
402
403
  openai: 'gpt-4o',
403
404
  ollama: 'llama3.1',
404
405
  openrouter: 'anthropic/claude-sonnet-4',
405
406
  gemini: 'gemini-2.0-pro',
406
407
  'azure-openai': 'gpt-4o',
407
408
  bedrock: 'anthropic.claude-sonnet-4-v1:0',
409
+ cognitum: 'cognitum-auto',
408
410
  onnx: 'phi-4',
409
411
  };
410
412
  return defaults[provider] || '';
@@ -22,6 +22,11 @@ export interface DaemonLivenessStatus {
22
22
  * tracks a *different*, in-process `QualityDaemon` instance that can't see a
23
23
  * truly detached process across separate CLI invocations anyway.
24
24
  */
25
+ /**
26
+ * ADR-123 (issue #557): print how the active LLM provider bills, plus any
27
+ * configured per-run budget cap. Best-effort — never throws into `aqe health`.
28
+ */
29
+ export declare function printLlmBilling(): void;
25
30
  export declare function checkDaemonLiveness(): DaemonLivenessStatus;
26
31
  export declare class StatusHandler implements ICommandHandler {
27
32
  readonly name = "status";
@@ -9,6 +9,8 @@ import { join } from 'node:path';
9
9
  import { getStatusColor, formatUptime, } from './interfaces.js';
10
10
  import { writeOutput, toJSON } from '../utils/ci-output.js';
11
11
  import { findProjectRoot } from '../../kernel/unified-memory.js';
12
+ import { loadRouterConfig } from '../../shared/llm/router/config-store.js';
13
+ import { billingModeForType } from '../../shared/llm/billing-modes.js';
12
14
  /**
13
15
  * Check whether the detached background-worker daemon (`.agentic-qe/workers/
14
16
  * start-daemon.cjs`, PID recorded in `daemon.pid` — see `10-workers.ts`) is
@@ -19,6 +21,36 @@ import { findProjectRoot } from '../../kernel/unified-memory.js';
19
21
  * tracks a *different*, in-process `QualityDaemon` instance that can't see a
20
22
  * truly detached process across separate CLI invocations anyway.
21
23
  */
24
+ /**
25
+ * ADR-123 (issue #557): print how the active LLM provider bills, plus any
26
+ * configured per-run budget cap. Best-effort — never throws into `aqe health`.
27
+ */
28
+ export function printLlmBilling() {
29
+ try {
30
+ const config = loadRouterConfig();
31
+ const primary = config.defaultProvider;
32
+ const mode = billingModeForType(primary);
33
+ const modeLabel = {
34
+ 'metered-api': `${chalk.red('●')} pay-per-token API key (no cap)`,
35
+ 'metered-capped': `${chalk.yellow('●')} pay-per-token with server-side cap`,
36
+ subscription: `${chalk.green('●')} Claude subscription (no per-token charge)`,
37
+ local: `${chalk.green('●')} local (no cost)`,
38
+ };
39
+ console.log(chalk.blue('\n LLM Billing:'));
40
+ console.log(` Provider: ${chalk.cyan(primary)} ${modeLabel[mode] ?? mode}`);
41
+ const cap = Number.parseFloat(process.env.AQE_MAX_BUDGET_USD ?? '');
42
+ if (Number.isFinite(cap) && cap > 0) {
43
+ console.log(` Per-run budget cap: ${chalk.cyan('$' + cap.toFixed(2))}`);
44
+ }
45
+ else if (mode === 'metered-api') {
46
+ console.log(chalk.gray(' No budget cap set — use AQE_MAX_BUDGET_USD or --max-budget-usd.'));
47
+ console.log(chalk.gray(' Tip: AQE_LLM_PROVIDER=claude-code runs on your Claude subscription.'));
48
+ }
49
+ }
50
+ catch {
51
+ // Billing display is informational; failures must not break health.
52
+ }
53
+ }
22
54
  export function checkDaemonLiveness() {
23
55
  try {
24
56
  const pidFile = join(findProjectRoot(), '.agentic-qe', 'workers', 'daemon.pid');
@@ -291,6 +323,9 @@ export class HealthHandler {
291
323
  else {
292
324
  console.log(` ${chalk.red('\u25CF')} Not running (stale PID: ${daemon.pid ?? 'unknown'}) \u2014 learning/consolidation snapshots will not advance`);
293
325
  }
326
+ // ADR-123 (issue #557): make LLM billing visible so a paid API key is
327
+ // never a silent surprise.
328
+ printLlmBilling();
294
329
  }
295
330
  console.log('');
296
331
  await this.cleanupAndExit(0);
@@ -184,6 +184,17 @@ export function registerProvidersFromEnv(enableLogging = false) {
184
184
  config.claude = {
185
185
  apiKey: process.env.ANTHROPIC_API_KEY,
186
186
  };
187
+ // ADR-123 (issue #557): this consensus/multi-model-verification path bills
188
+ // the pay-per-token Anthropic API, not a Claude subscription, and has no
189
+ // budget cap of its own. Surface it so the spend isn't silent. (Full
190
+ // subscription + budget support for the consensus ModelProvider layer is
191
+ // tracked as ADR-123 follow-up — it uses a different interface than the
192
+ // shared LLM ProviderManager.)
193
+ if ((process.env.AQE_LLM_NO_BILLING_NOTICE ?? '') !== '1') {
194
+ // eslint-disable-next-line no-console
195
+ console.error('⚠️ Consensus verification will use the Anthropic API key (pay-per-token, ' +
196
+ 'no budget cap). Unset ANTHROPIC_API_KEY to disable this path.');
197
+ }
187
198
  }
188
199
  // Detect OpenAI
189
200
  if (process.env.OPENAI_API_KEY) {
@@ -12,7 +12,7 @@
12
12
  import { existsSync, mkdirSync, writeFileSync, readFileSync, copyFileSync } from 'fs';
13
13
  import { join, dirname } from 'path';
14
14
  import { safeJsonParse } from '../shared/safe-json.js';
15
- import { mergeHooksSmart, generateAqeEnvVars, generateV3SettingsSections, } from './settings-merge.js';
15
+ import { mergeHooksSmart, generateAqeEnvVars, generateV3SettingsSections, applyV3Sections, mergeAqeEnv, backupSettingsFile, } from './settings-merge.js';
16
16
  // ============================================================================
17
17
  // Hook Configuration
18
18
  // ============================================================================
@@ -183,31 +183,15 @@ export async function configureHooks(projectRoot, config) {
183
183
  // Smart merge: replace old AQE hooks, keep user hooks, add new AQE hooks
184
184
  const existingHooks = settings.hooks || {};
185
185
  settings.hooks = mergeHooksSmart(existingHooks, aqeHooks);
186
- // Set full AQE environment variables
187
- const existingEnv = settings.env || {};
188
- settings.env = {
189
- ...existingEnv,
190
- ...generateAqeEnvVars(config),
191
- };
192
- // Apply v3 settings sections
193
- // Permissions are union-merged to preserve user entries (#362)
186
+ // Add AQE environment variables without clobbering any value the user already
187
+ // set including AQE_-prefixed overrides (only missing keys are added).
188
+ const existingEnv = settings.env;
189
+ settings.env = mergeAqeEnv(existingEnv, generateAqeEnvVars(config));
190
+ // Apply v3 settings sections non-destructively: permissions union-merged,
191
+ // statusLine / includeCoAuthoredBy preserved when user-set, AQE-owned
192
+ // sections deep-merged so user additions survive (#362 follow-up).
194
193
  const v3Sections = generateV3SettingsSections(config, projectRoot);
195
- for (const [key, value] of Object.entries(v3Sections)) {
196
- if (key === '_aqePermissions') {
197
- // Union-merge: add AQE entries without removing user-added permissions
198
- const existingPerms = settings.permissions || {};
199
- const existingAllow = existingPerms.allow || [];
200
- const aqeEntries = value;
201
- const merged = [...new Set([...existingAllow, ...aqeEntries])];
202
- settings.permissions = {
203
- ...existingPerms,
204
- allow: merged,
205
- };
206
- }
207
- else {
208
- settings[key] = value;
209
- }
210
- }
194
+ applyV3Sections(settings, v3Sections);
211
195
  // Enable MCP servers (deduplicate, replace old 'aqe' with 'agentic-qe')
212
196
  let existingMcp = settings.enabledMcpjsonServers || [];
213
197
  existingMcp = existingMcp.filter(s => s !== 'aqe');
@@ -215,6 +199,8 @@ export async function configureHooks(projectRoot, config) {
215
199
  existingMcp.push('agentic-qe');
216
200
  }
217
201
  settings.enabledMcpjsonServers = existingMcp;
202
+ // Back up the pristine original settings.json before writing (like CLAUDE.md)
203
+ backupSettingsFile(settingsPath);
218
204
  writeFileSync(settingsPath, JSON.stringify(settings, null, 2), 'utf-8');
219
205
  // Install cross-phase memory hooks configuration
220
206
  await installCrossPhaseMemoryHooks(projectRoot);
@@ -13,7 +13,7 @@ import { fileURLToPath } from 'url';
13
13
  import { safeJsonParse } from '../../shared/safe-json.js';
14
14
  const __filename = fileURLToPath(import.meta.url);
15
15
  const __dirname = dirname(__filename);
16
- import { isAqeHookEntry, mergeHooksSmart, generateAqeEnvVars, generateV3SettingsSections, } from '../settings-merge.js';
16
+ import { isAqeHookEntry, mergeHooksSmart, generateAqeEnvVars, generateV3SettingsSections, applyV3Sections, mergeAqeEnv, backupSettingsFile, } from '../settings-merge.js';
17
17
  import { BasePhase, } from './phase-interface.js';
18
18
  /**
19
19
  * Hooks phase - configures Claude Code hooks
@@ -76,31 +76,16 @@ export class HooksPhase extends BasePhase {
76
76
  }
77
77
  // Smart merge: remove old AQE hooks, keep user hooks, add new AQE hooks
78
78
  settings.hooks = mergeHooksSmart(existingHooks, aqeHooks);
79
- // Set full AQE environment variables
80
- const existingEnv = settings.env || {};
81
- settings.env = {
82
- ...existingEnv,
83
- ...generateAqeEnvVars(config),
84
- };
85
- // Apply v3 settings sections (statusLine, v3Configuration, v3Learning, etc.)
86
- // Permissions are union-merged to preserve user entries (#362)
79
+ // Add AQE environment variables without clobbering any value the user
80
+ // already set including AQE_-prefixed overrides (only missing keys added).
81
+ const existingEnv = settings.env;
82
+ settings.env = mergeAqeEnv(existingEnv, generateAqeEnvVars(config));
83
+ // Apply v3 settings sections non-destructively:
84
+ // - permissions union-merged (preserve user entries, #362)
85
+ // - statusLine / includeCoAuthoredBy preserved when user-set (#362 follow-up)
86
+ // - AQE-owned sections deep-merged so user additions survive
87
87
  const v3Sections = generateV3SettingsSections(config, projectRoot);
88
- for (const [key, value] of Object.entries(v3Sections)) {
89
- if (key === '_aqePermissions') {
90
- // Union-merge: add AQE entries without removing user-added permissions
91
- const existingPerms = settings.permissions || {};
92
- const existingAllow = existingPerms.allow || [];
93
- const aqeEntries = value;
94
- const merged = [...new Set([...existingAllow, ...aqeEntries])];
95
- settings.permissions = {
96
- ...existingPerms,
97
- allow: merged,
98
- };
99
- }
100
- else {
101
- settings[key] = value;
102
- }
103
- }
88
+ applyV3Sections(settings, v3Sections);
104
89
  // Enable MCP servers (deduplicate, replace old 'aqe' with 'agentic-qe')
105
90
  let existingMcp = settings.enabledMcpjsonServers || [];
106
91
  // Remove legacy 'aqe' entry if present (renamed to 'agentic-qe')
@@ -109,6 +94,11 @@ export class HooksPhase extends BasePhase {
109
94
  existingMcp.push('agentic-qe');
110
95
  }
111
96
  settings.enabledMcpjsonServers = existingMcp;
97
+ // Back up the pristine original settings.json before writing (like CLAUDE.md)
98
+ const backupPath = backupSettingsFile(settingsPath);
99
+ if (backupPath) {
100
+ context.services.log(` Backup created: ${backupPath}`);
101
+ }
112
102
  // Write settings
113
103
  writeFileSync(settingsPath, JSON.stringify(settings, null, 2), 'utf-8');
114
104
  // Write README and install hook assets (bridge script, cross-phase memory)
@@ -8,6 +8,18 @@
8
8
  * - Generates full env vars and v3 settings sections
9
9
  */
10
10
  import type { AQEInitConfig } from './types.js';
11
+ /**
12
+ * Create a one-time `.backup` of an existing settings.json before AQE modifies
13
+ * it — mirroring the CLAUDE.md backup convention.
14
+ *
15
+ * The backup captures the pristine, pre-AQE file and is NOT overwritten on
16
+ * subsequent re-inits, so the user's original settings are always recoverable.
17
+ * No-op when the file does not exist yet (fresh install) or a backup already
18
+ * exists. Failures are swallowed — a backup problem must never block init.
19
+ *
20
+ * @returns the backup path when a backup was written, otherwise null.
21
+ */
22
+ export declare function backupSettingsFile(settingsPath: string): string | null;
11
23
  /**
12
24
  * Check if a single hook entry belongs to AQE (any variant).
13
25
  * Matches commands containing 'aqe' or 'agentic-qe' in any form.
@@ -23,10 +35,42 @@ export declare function isAqeHookEntry(entry: unknown): boolean;
23
35
  * 3. Preserve any hook types not in the new config
24
36
  */
25
37
  export declare function mergeHooksSmart(existingHooks: Record<string, unknown[]>, newAqeHooks: Record<string, unknown[]>): Record<string, unknown[]>;
38
+ /**
39
+ * Merge AQE's environment variables into a user's existing `env` block WITHOUT
40
+ * clobbering values the user already set — including AQE_-prefixed ones.
41
+ *
42
+ * Re-running `aqe init` fills in any missing AQE env vars but leaves every
43
+ * existing value untouched, so a user who intentionally flipped, say,
44
+ * `AQE_LEARNING_ENABLED=false` keeps their choice. Non-AQE env vars are always
45
+ * preserved. Returns a new object; inputs are not mutated.
46
+ */
47
+ export declare function mergeAqeEnv(existingEnv: Record<string, string> | undefined, aqeEnv: Record<string, string>): Record<string, string>;
26
48
  /**
27
49
  * Generate the full set of AQE environment variables for settings.json.
28
50
  */
29
51
  export declare function generateAqeEnvVars(config: AQEInitConfig): Record<string, string>;
52
+ /**
53
+ * Detect whether a `statusLine` block is one AQE generated (vs. a user's own).
54
+ * AQE's status line invokes the statusline-v3.cjs helper (or falls back to the
55
+ * "Agentic QE v3" banner). Anything else is treated as user-owned and preserved.
56
+ */
57
+ export declare function isAqeStatusLine(statusLine: unknown): boolean;
58
+ /**
59
+ * Apply the generated v3 settings sections onto an existing settings object
60
+ * WITHOUT clobbering configuration the user already set:
61
+ *
62
+ * - `_aqePermissions`: union-merge into `permissions.allow`, preserving the
63
+ * user's existing allow/deny entries (#362).
64
+ * - `statusLine`: generic Claude Code setting — only written when absent or when
65
+ * the existing one is AQE's own (so a user's custom status line is preserved).
66
+ * - `includeCoAuthoredBy`: generic Claude Code setting — only written when the
67
+ * user has not set it explicitly (respects an intentional `false`).
68
+ * - `aqe` / `v3Configuration` / `v3Learning`: AQE-owned sections, deep-merged so
69
+ * AQE values are refreshed while any user-added keys survive.
70
+ *
71
+ * Mutates and returns `settings`.
72
+ */
73
+ export declare function applyV3Sections(settings: Record<string, unknown>, sections: Record<string, unknown>): Record<string, unknown>;
30
74
  /**
31
75
  * Generate v3-specific settings sections for settings.json.
32
76
  * These sections enable the self-learning system, status line, and permissions.
@@ -7,16 +7,49 @@
7
7
  * - Preserves non-AQE hooks from the user's config
8
8
  * - Generates full env vars and v3 settings sections
9
9
  */
10
- // Patterns that identify a hook command as belonging to AQE
10
+ import { existsSync, readFileSync, writeFileSync } from 'fs';
11
+ /**
12
+ * Create a one-time `.backup` of an existing settings.json before AQE modifies
13
+ * it — mirroring the CLAUDE.md backup convention.
14
+ *
15
+ * The backup captures the pristine, pre-AQE file and is NOT overwritten on
16
+ * subsequent re-inits, so the user's original settings are always recoverable.
17
+ * No-op when the file does not exist yet (fresh install) or a backup already
18
+ * exists. Failures are swallowed — a backup problem must never block init.
19
+ *
20
+ * @returns the backup path when a backup was written, otherwise null.
21
+ */
22
+ export function backupSettingsFile(settingsPath) {
23
+ if (!existsSync(settingsPath))
24
+ return null;
25
+ const backupPath = `${settingsPath}.backup`;
26
+ if (existsSync(backupPath))
27
+ return null; // keep the pristine original
28
+ try {
29
+ writeFileSync(backupPath, readFileSync(settingsPath, 'utf-8'), 'utf-8');
30
+ return backupPath;
31
+ }
32
+ catch {
33
+ return null;
34
+ }
35
+ }
36
+ // Patterns that identify a hook command as belonging to AQE.
37
+ //
38
+ // These MUST be specific to AQE's own hooks. They must NOT match hooks that
39
+ // other tools install (e.g. ruflo / claude-flow), otherwise re-running
40
+ // `aqe init` in a project that already ran `ruflo init` would strip the user's
41
+ // ruflo hooks. In particular:
42
+ // - do NOT match on `.claude/helpers/` broadly — ruflo's hook-handler.cjs and
43
+ // auto-memory-hook.mjs live there too (match AQE's own helpers by name)
44
+ // - do NOT match on `ruflo` — those are the user's hooks, preserve them
11
45
  const AQE_COMMAND_PATTERNS = [
12
46
  /\baqe\b/i,
13
47
  /\bagentic-qe\b/i,
14
48
  /\bnpx\s+agentic-qe\b/i,
15
49
  /\bnpx\s+@anthropics\/agentic-qe\b/i,
50
+ /aqe-hook\.cjs/i,
16
51
  /brain-checkpoint\.cjs/i,
17
- /\.claude\/helpers\//i,
18
- /\bruflo\b/i,
19
- /dist\/cli\/bundle\.js/i,
52
+ /statusline-v3\.cjs/i,
20
53
  ];
21
54
  /**
22
55
  * Check if a single hook entry belongs to AQE (any variant).
@@ -62,6 +95,19 @@ export function mergeHooksSmart(existingHooks, newAqeHooks) {
62
95
  }
63
96
  return merged;
64
97
  }
98
+ /**
99
+ * Merge AQE's environment variables into a user's existing `env` block WITHOUT
100
+ * clobbering values the user already set — including AQE_-prefixed ones.
101
+ *
102
+ * Re-running `aqe init` fills in any missing AQE env vars but leaves every
103
+ * existing value untouched, so a user who intentionally flipped, say,
104
+ * `AQE_LEARNING_ENABLED=false` keeps their choice. Non-AQE env vars are always
105
+ * preserved. Returns a new object; inputs are not mutated.
106
+ */
107
+ export function mergeAqeEnv(existingEnv, aqeEnv) {
108
+ // AQE defaults first, then existing values win on any key collision.
109
+ return { ...aqeEnv, ...(existingEnv || {}) };
110
+ }
65
111
  /**
66
112
  * Generate the full set of AQE environment variables for settings.json.
67
113
  */
@@ -85,6 +131,75 @@ export function generateAqeEnvVars(config) {
85
131
  AQE_V3_SUCCESS_RATE_THRESHOLD: String(config.learning?.qualityThreshold ?? 0.7),
86
132
  };
87
133
  }
134
+ /**
135
+ * Detect whether a `statusLine` block is one AQE generated (vs. a user's own).
136
+ * AQE's status line invokes the statusline-v3.cjs helper (or falls back to the
137
+ * "Agentic QE v3" banner). Anything else is treated as user-owned and preserved.
138
+ */
139
+ export function isAqeStatusLine(statusLine) {
140
+ const cmd = statusLine?.command;
141
+ return typeof cmd === 'string' && /statusline-v3\.cjs|Agentic QE v3/.test(cmd);
142
+ }
143
+ /**
144
+ * Deep-merge `source` (AQE-owned values) onto `target` (whatever the user has):
145
+ * plain-object subtrees merge recursively so a user's extra keys survive, while
146
+ * AQE's values win on conflicting leaves. Arrays and primitives are replaced by
147
+ * the AQE value (these sections are AQE-managed).
148
+ */
149
+ function deepMergeOwned(target, source) {
150
+ if (!isPlainObject(target) || !isPlainObject(source))
151
+ return source;
152
+ const out = { ...target };
153
+ for (const [key, value] of Object.entries(source)) {
154
+ out[key] = deepMergeOwned(out[key], value);
155
+ }
156
+ return out;
157
+ }
158
+ function isPlainObject(value) {
159
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
160
+ }
161
+ /**
162
+ * Apply the generated v3 settings sections onto an existing settings object
163
+ * WITHOUT clobbering configuration the user already set:
164
+ *
165
+ * - `_aqePermissions`: union-merge into `permissions.allow`, preserving the
166
+ * user's existing allow/deny entries (#362).
167
+ * - `statusLine`: generic Claude Code setting — only written when absent or when
168
+ * the existing one is AQE's own (so a user's custom status line is preserved).
169
+ * - `includeCoAuthoredBy`: generic Claude Code setting — only written when the
170
+ * user has not set it explicitly (respects an intentional `false`).
171
+ * - `aqe` / `v3Configuration` / `v3Learning`: AQE-owned sections, deep-merged so
172
+ * AQE values are refreshed while any user-added keys survive.
173
+ *
174
+ * Mutates and returns `settings`.
175
+ */
176
+ export function applyV3Sections(settings, sections) {
177
+ for (const [key, value] of Object.entries(sections)) {
178
+ if (key === '_aqePermissions') {
179
+ const existingPerms = settings.permissions || {};
180
+ const existingAllow = existingPerms.allow || [];
181
+ const merged = [...new Set([...existingAllow, ...value])];
182
+ settings.permissions = { ...existingPerms, allow: merged };
183
+ }
184
+ else if (key === 'statusLine') {
185
+ // Preserve a user's (or another tool's) custom status line.
186
+ if (settings.statusLine === undefined || isAqeStatusLine(settings.statusLine)) {
187
+ settings.statusLine = value;
188
+ }
189
+ }
190
+ else if (key === 'includeCoAuthoredBy') {
191
+ // Respect an explicit user choice; only set the default when unset.
192
+ if (settings.includeCoAuthoredBy === undefined) {
193
+ settings.includeCoAuthoredBy = value;
194
+ }
195
+ }
196
+ else {
197
+ // AQE-owned section — deep-merge so user additions are not dropped.
198
+ settings[key] = deepMergeOwned(settings[key], value);
199
+ }
200
+ }
201
+ return settings;
202
+ }
88
203
  /**
89
204
  * Generate v3-specific settings sections for settings.json.
90
205
  * These sections enable the self-learning system, status line, and permissions.