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.
- package/.claude/skills/skills-manifest.json +1 -1
- package/CHANGELOG.md +83 -0
- package/assets/skills/skills-manifest.json +1 -1
- package/dist/cli/bundle.js +5 -5
- package/dist/cli/chunks/adapter-RL6GNUOS.js +2 -0
- package/dist/cli/chunks/{agent-booster-wasm-IO54X6IQ.js → agent-booster-wasm-3KYNICBC.js} +2 -2
- package/dist/cli/chunks/{agent-handler-A57SZUCW.js → agent-handler-NGPTMI6E.js} +2 -2
- package/dist/cli/chunks/{agent-memory-branch-BX7LRFGN.js → agent-memory-branch-GNTQKQMG.js} +2 -2
- package/dist/cli/chunks/aqe-learning-engine-UEEW6AQG.js +2 -0
- package/dist/cli/chunks/{arena-UTC4YY6Y.js → arena-HQEP2NWI.js} +4 -4
- package/dist/cli/chunks/{arena-Y3XTX6O7.js → arena-PA7VIYD4.js} +2 -2
- package/dist/cli/chunks/{audit-L4RL2AOY.js → audit-XSDM57GC.js} +3 -3
- package/dist/cli/chunks/base-JQA5YULE.js +2 -0
- package/dist/cli/chunks/{hnswlib-node-VS6L5VUG.js → better-sqlite3-RQCOOAZC.js} +2 -2
- package/dist/cli/chunks/{brain-handler-OHDPI5TQ.js → brain-handler-T7RDPKNM.js} +3 -3
- package/dist/cli/chunks/{branch-enumerator-ZRXE2CQ7.js → branch-enumerator-ZW7RNMUF.js} +2 -2
- package/dist/cli/chunks/{browser-NT33FG76.js → browser-4LU22CPP.js} +2 -2
- package/dist/cli/chunks/browser-workflow-XTKUHTIT.js +2 -0
- package/dist/cli/chunks/{chunk-XEYW3V5I.js → chunk-2L7K2J2T.js} +2 -2
- package/dist/cli/chunks/{chunk-VWJSWXHG.js → chunk-2R7J4ZGT.js} +1 -1
- package/dist/cli/chunks/{chunk-KZMRU7DL.js → chunk-2R7XZ2WP.js} +2 -2
- package/dist/cli/chunks/{chunk-2AR4B3DI.js → chunk-327YEKBU.js} +2 -2
- package/dist/cli/chunks/{chunk-HDJMD6UH.js → chunk-3AJUJAUJ.js} +1 -1
- package/dist/cli/chunks/{chunk-JOBCMNTP.js → chunk-3LELACAQ.js} +2 -2
- package/dist/cli/chunks/{chunk-JYX7AZHE.js → chunk-4FHJYJCH.js} +2 -2
- package/dist/cli/chunks/{chunk-KJWQ7ENF.js → chunk-4KEOBDEI.js} +2 -2
- package/dist/cli/chunks/{chunk-G6LR7FK7.js → chunk-56MXYSYY.js} +2 -2
- package/dist/cli/chunks/{chunk-5YGESYBC.js → chunk-5CGTBAVF.js} +1 -1
- package/dist/cli/chunks/{chunk-RZDNCTOA.js → chunk-5SM57X4D.js} +2 -2
- package/dist/cli/chunks/{chunk-O3C5RRDQ.js → chunk-5YLY2WT2.js} +3 -3
- package/dist/cli/chunks/{chunk-PQMLIVGV.js → chunk-6FBXYS6X.js} +2 -2
- package/dist/cli/chunks/{chunk-GGMQOEZZ.js → chunk-6N62KS3C.js} +2 -2
- package/dist/cli/chunks/{chunk-BB4OVXWF.js → chunk-6SWR2BN7.js} +1 -1
- package/dist/cli/chunks/{chunk-7HJHXSYT.js → chunk-6X65BGGK.js} +2 -2
- package/dist/cli/chunks/{chunk-P52YORQG.js → chunk-7DV42KFP.js} +2 -2
- package/dist/cli/chunks/{chunk-EZE2HRQB.js → chunk-7KMYBRKJ.js} +2 -2
- package/dist/cli/chunks/{chunk-335GHVJV.js → chunk-7OD6HFCP.js} +3 -3
- package/dist/cli/chunks/chunk-ABHKXMOJ.js +2 -0
- package/dist/cli/chunks/{chunk-L5ZLOW3K.js → chunk-ACDZ2CRV.js} +2 -2
- package/dist/cli/chunks/{chunk-NW7G57NR.js → chunk-ADZTWGEB.js} +2 -2
- package/dist/cli/chunks/{chunk-CC5G3K4X.js → chunk-AJ6DZXKK.js} +2 -2
- package/dist/cli/chunks/{chunk-SSXAW3ER.js → chunk-AL5QT6OX.js} +2 -2
- package/dist/cli/chunks/{chunk-FKPUPQQT.js → chunk-AMPYON7M.js} +2 -2
- package/dist/cli/chunks/{chunk-C4SZSPXY.js → chunk-APVXTHTA.js} +2 -2
- package/dist/cli/chunks/{chunk-FEEMJDUF.js → chunk-B7DI76SY.js} +2 -2
- package/dist/cli/chunks/{chunk-Q5YRPS4P.js → chunk-BDVOXGY5.js} +1 -1
- package/dist/cli/chunks/{chunk-VMP4M5PB.js → chunk-BDX54WJV.js} +1 -1
- package/dist/cli/chunks/{chunk-G5JQLUUO.js → chunk-BMRR3MBR.js} +2 -2
- package/dist/cli/chunks/{chunk-2UMCB7AH.js → chunk-BOR5MME3.js} +1 -1
- package/dist/cli/chunks/{chunk-HW62TB4T.js → chunk-BPSEFLJ6.js} +1 -1
- package/dist/cli/chunks/{chunk-DTOE3NYW.js → chunk-BUKGW63B.js} +12 -12
- package/dist/cli/chunks/{chunk-V2MD5EDD.js → chunk-C7VNQ4PY.js} +2 -2
- package/dist/cli/chunks/{chunk-W766S4SK.js → chunk-CDMAVNV5.js} +1 -1
- package/dist/cli/chunks/{chunk-K5SN66B4.js → chunk-CKFZOPZN.js} +2 -2
- package/dist/cli/chunks/{chunk-Y2MCIIJD.js → chunk-CMKCPRWX.js} +1 -1
- package/dist/cli/chunks/{chunk-DR7PCO3S.js → chunk-CQKEVUMO.js} +2 -2
- package/dist/cli/chunks/{chunk-2KHDGC7N.js → chunk-CTFW7CMI.js} +2 -2
- package/dist/cli/chunks/{chunk-5FR5GBUT.js → chunk-DGOZ3CGB.js} +2 -2
- package/dist/cli/chunks/{chunk-ZVPAFX4I.js → chunk-DTXHRALB.js} +2 -2
- package/dist/cli/chunks/{chunk-IJUYHIKN.js → chunk-E5XWCGSX.js} +2 -2
- package/dist/cli/chunks/{chunk-7ZIVDGSN.js → chunk-EGU54SNK.js} +1 -1
- package/dist/cli/chunks/{chunk-KI5BP4X5.js → chunk-EKTWIEEO.js} +2 -2
- package/dist/cli/chunks/{chunk-TJ6N4CCX.js → chunk-ERQL3D2O.js} +2 -2
- package/dist/cli/chunks/{chunk-CHO54B34.js → chunk-EZ3JVN6S.js} +2 -2
- package/dist/cli/chunks/{chunk-5VBPIJUZ.js → chunk-F3CKOVZM.js} +4 -4
- package/dist/cli/chunks/{chunk-RQN4HWGV.js → chunk-FKUH33L3.js} +2 -2
- package/dist/cli/chunks/{chunk-WNASEUBW.js → chunk-FTG4ZVTX.js} +11 -11
- package/dist/cli/chunks/{chunk-CMGYUCM7.js → chunk-FUBN5GPY.js} +1 -1
- package/dist/cli/chunks/{chunk-I6WHYRWB.js → chunk-GCQATSMK.js} +2 -2
- package/dist/cli/chunks/{chunk-TED4KOSK.js → chunk-GECWGFRR.js} +2 -2
- package/dist/cli/chunks/{chunk-BA6U7NSR.js → chunk-GP7IXYOY.js} +1 -1
- package/dist/cli/chunks/{chunk-CSEEGX5T.js → chunk-GUGUYFU5.js} +2 -2
- package/dist/cli/chunks/{chunk-KZ37VHMJ.js → chunk-HH5Y4NCR.js} +2 -2
- package/dist/cli/chunks/{chunk-DXOMRWDC.js → chunk-HNU32LN3.js} +1 -1
- package/dist/cli/chunks/{chunk-3AFNXU45.js → chunk-HU6ETNA7.js} +1 -1
- package/dist/cli/chunks/{chunk-KN5GOEYK.js → chunk-IKIKIHFQ.js} +2 -2
- package/dist/cli/chunks/{chunk-UGJQJSPB.js → chunk-ILNQPPKB.js} +1 -1
- package/dist/cli/chunks/{chunk-MJPYNGZ7.js → chunk-IQ56KMMH.js} +1 -1
- package/dist/cli/chunks/{chunk-SCMXIBI7.js → chunk-J6EFAKDQ.js} +2 -2
- package/dist/cli/chunks/{chunk-RMFRFING.js → chunk-K43YXI7C.js} +2 -2
- package/dist/cli/chunks/{chunk-FOPS6DRZ.js → chunk-KBAXD6PH.js} +1 -1
- package/dist/cli/chunks/{chunk-VS4GMNJK.js → chunk-KBXW7S3W.js} +3 -3
- package/dist/cli/chunks/{chunk-QJ6H2HQQ.js → chunk-KDGLNJPB.js} +1 -1
- package/dist/cli/chunks/{chunk-VA7TEOPM.js → chunk-KJJP446A.js} +1 -1
- package/dist/cli/chunks/{chunk-TC2JE5OK.js → chunk-KNOO6TFO.js} +3 -3
- package/dist/cli/chunks/{chunk-HAEUPIKW.js → chunk-KPV4N4KT.js} +2 -2
- package/dist/cli/chunks/{chunk-IKVNYK7Y.js → chunk-KV5OZ6T3.js} +2 -2
- package/dist/cli/chunks/{chunk-RG552ROA.js → chunk-LGEPR7MH.js} +3 -3
- package/dist/cli/chunks/{chunk-7WX3MKRS.js → chunk-LIAW5FD7.js} +2 -2
- package/dist/cli/chunks/{chunk-MUV56BPK.js → chunk-LOZAUP6L.js} +2 -2
- package/dist/cli/chunks/{chunk-BUYPRUNY.js → chunk-LWVUNBZO.js} +2 -2
- package/dist/cli/chunks/{chunk-FZRU73M4.js → chunk-M4XVEUUM.js} +2 -2
- package/dist/cli/chunks/{chunk-ICK3B24H.js → chunk-MALFTRCT.js} +2 -2
- package/dist/cli/chunks/{chunk-MBF3Q7FQ.js → chunk-MF4FULAI.js} +1 -1
- package/dist/cli/chunks/{chunk-7F7U2HUH.js → chunk-MNHGBG4D.js} +1 -1
- package/dist/cli/chunks/{chunk-XIFPIVZI.js → chunk-MNNNA57O.js} +2 -2
- package/dist/cli/chunks/{chunk-BZPF6GTL.js → chunk-N57BKUVE.js} +1 -1
- package/dist/cli/chunks/{chunk-TO5PQSDD.js → chunk-NDAJWCXN.js} +2 -2
- package/dist/cli/chunks/{chunk-NLHISTL2.js → chunk-OELLHV7S.js} +2 -2
- package/dist/cli/chunks/{chunk-PM566XEO.js → chunk-OEZNUXY7.js} +1 -1
- package/dist/cli/chunks/{chunk-4GU656WM.js → chunk-OIUIVV2N.js} +1 -1
- package/dist/cli/chunks/{chunk-CVGXB7IX.js → chunk-OMIGKGJJ.js} +2 -2
- package/dist/cli/chunks/{chunk-62RELCU6.js → chunk-OSAPKOGN.js} +1 -1
- package/dist/cli/chunks/{chunk-72VZGAMJ.js → chunk-P2FYRAC5.js} +1 -1
- package/dist/cli/chunks/{chunk-W2OMW6UU.js → chunk-P65S7AZA.js} +2 -2
- package/dist/cli/chunks/{chunk-VZ67ZDB3.js → chunk-PHIEJAQK.js} +3 -3
- package/dist/cli/chunks/chunk-PSA2SOON.js +18 -0
- package/dist/cli/chunks/{chunk-USB44IHJ.js → chunk-PXKVW6PT.js} +2 -2
- package/dist/cli/chunks/{chunk-64M3FFM4.js → chunk-QYST2TZW.js} +2 -2
- package/dist/cli/chunks/{chunk-MUAHFGIX.js → chunk-R554WVIG.js} +2 -2
- package/dist/cli/chunks/{chunk-TJEJ4UVX.js → chunk-R5HC6JVJ.js} +2 -2
- package/dist/cli/chunks/{chunk-6X3RJBA3.js → chunk-R6LDR3IO.js} +2 -2
- package/dist/cli/chunks/{chunk-OPIWFXME.js → chunk-RFQIC6ZF.js} +1 -1
- package/dist/cli/chunks/{chunk-EM2JIIAQ.js → chunk-RXEQB4OT.js} +2 -2
- package/dist/cli/chunks/{chunk-BGRJZH5Q.js → chunk-RXH2TC2K.js} +2 -2
- package/dist/cli/chunks/{chunk-DQDFACYW.js → chunk-SVUWAV6Y.js} +1 -1
- package/dist/cli/chunks/{chunk-POKMJTD2.js → chunk-SYLTJKN2.js} +1 -1
- package/dist/cli/chunks/{chunk-WJYTLRA5.js → chunk-T6TQPF5P.js} +3 -3
- package/dist/cli/chunks/{chunk-FI5SSLEF.js → chunk-T75VH6NT.js} +2 -2
- package/dist/cli/chunks/{chunk-EGH3H7QO.js → chunk-TERRRQVY.js} +1 -1
- package/dist/cli/chunks/{chunk-2ALNNXFF.js → chunk-TFVWUR2U.js} +2 -2
- package/dist/cli/chunks/{chunk-MK3J7JVZ.js → chunk-TLYZPOA7.js} +2 -2
- package/dist/cli/chunks/{chunk-RYUSZ43T.js → chunk-TMQ3S7HR.js} +1 -1
- package/dist/cli/chunks/{chunk-Z3W3R4CW.js → chunk-TQNNKW7K.js} +2 -2
- package/dist/cli/chunks/{chunk-PT3FTGKZ.js → chunk-TRHUH24V.js} +2 -2
- package/dist/cli/chunks/{chunk-5XFX25AJ.js → chunk-UEIIIDBJ.js} +2 -2
- package/dist/cli/chunks/{chunk-YKOTOCO6.js → chunk-UF3YOGHV.js} +2 -2
- package/dist/cli/chunks/{chunk-UUOXV3NS.js → chunk-UFPCNUJA.js} +10 -10
- package/dist/cli/chunks/{chunk-FZIHOMGY.js → chunk-V2QYW5KW.js} +2 -2
- package/dist/cli/chunks/{chunk-AAATFEIL.js → chunk-VHYACXLN.js} +2 -2
- package/dist/cli/chunks/chunk-VM6VBRRU.js +43 -0
- package/dist/cli/chunks/{chunk-ZT2WHCVM.js → chunk-VOHYQ6MX.js} +2 -2
- package/dist/cli/chunks/{chunk-C6GYLCTX.js → chunk-VQU2JXTK.js} +3 -3
- package/dist/cli/chunks/{chunk-FU5RNEXV.js → chunk-W7LBT3BF.js} +2 -2
- package/dist/cli/chunks/{chunk-GCF42L7M.js → chunk-WC5PM33J.js} +3 -3
- package/dist/cli/chunks/{chunk-WT4ZDDFM.js → chunk-WE5QHYL7.js} +1 -1
- package/dist/cli/chunks/chunk-WKWIUS5G.js +3 -0
- package/dist/cli/chunks/chunk-WL5VMIO4.js +2 -0
- package/dist/cli/chunks/{chunk-OHSVDMF7.js → chunk-WMNGPIP3.js} +1 -1
- package/dist/cli/chunks/{chunk-UVVKFBF7.js → chunk-WRMUQVKY.js} +2 -2
- package/dist/cli/chunks/{chunk-NNGCUJWQ.js → chunk-WY5CX3VH.js} +2 -2
- package/dist/cli/chunks/{chunk-36MPDANH.js → chunk-WYFEVPLO.js} +1 -1
- package/dist/cli/chunks/{chunk-RHC7TFPU.js → chunk-X47GHZY3.js} +2 -2
- package/dist/cli/chunks/{chunk-TR5GOGH3.js → chunk-XNNYHQLW.js} +5 -5
- package/dist/cli/chunks/{chunk-27JCWG5J.js → chunk-YDZIPP3Y.js} +2 -2
- package/dist/cli/chunks/{chunk-KDLYTJ5C.js → chunk-YRO7HNS4.js} +2 -2
- package/dist/cli/chunks/{chunk-SPEUF7ZL.js → chunk-YSCEUK55.js} +2 -2
- package/dist/cli/chunks/chunk-YY4KXDI6.js +2 -0
- package/dist/cli/chunks/{chunk-ZWC6CM4R.js → chunk-YYV3FYVB.js} +1 -1
- package/dist/cli/chunks/{chunk-AEX75YGI.js → chunk-YZ44FUVJ.js} +2 -2
- package/dist/cli/chunks/chunk-Z3FA5KR6.js +316 -0
- package/dist/cli/chunks/{chunk-G6RKUEGL.js → chunk-Z63IOTDW.js} +2 -2
- package/dist/cli/chunks/{chunk-6JNNZGI2.js → chunk-ZBYMF2QJ.js} +1 -1
- package/dist/cli/chunks/{chunk-JYXSVSH2.js → chunk-ZF65VOQH.js} +2 -2
- package/dist/cli/chunks/{chunk-4SALW7OT.js → chunk-ZHWXI4SK.js} +2 -2
- package/dist/cli/chunks/{chunk-LMJUQWR7.js → chunk-ZL7ZOIHO.js} +1 -1
- package/dist/cli/chunks/{ci-RJH5LAL3.js → ci-NT4DUGQ4.js} +2 -2
- package/dist/cli/chunks/{ci-output-62SGMGB2.js → ci-output-PXBD2QPH.js} +2 -2
- package/dist/cli/chunks/{circuit-breaker-QXTS5ZAW.js → circuit-breaker-ZPCCEEDX.js} +2 -2
- package/dist/cli/chunks/{claude-flow-setup-BBCCT5WV.js → claude-flow-setup-CZCDFZOE.js} +2 -2
- package/dist/cli/chunks/client-S7DIRNFJ.js +2 -0
- package/dist/cli/chunks/{cline-installer-IZCUJJ3I.js → cline-installer-6J2S7GLM.js} +2 -2
- package/dist/cli/chunks/{code-AWNVOZ7S.js → code-UTERK5AP.js} +2 -2
- package/dist/cli/chunks/{code-index-extractor-MX65BKMI.js → code-index-extractor-O3MJTOS2.js} +2 -2
- package/dist/cli/chunks/{codex-installer-EQT6JVLM.js → codex-installer-AZJIVXJR.js} +2 -2
- package/dist/cli/chunks/{completions-WOJAM45W.js → completions-A6ANQSZN.js} +2 -2
- package/dist/cli/chunks/{complexity-analyzer-3DJB7V3K.js → complexity-analyzer-MRSN7VUP.js} +2 -2
- package/dist/cli/chunks/{continuedev-installer-P4KWUTCJ.js → continuedev-installer-6LMKQRUI.js} +2 -2
- package/dist/cli/chunks/{copilot-installer-FFZWTMWQ.js → copilot-installer-KP3TWUNO.js} +2 -2
- package/dist/cli/chunks/core-handlers-NM2KCI6Z.js +2 -0
- package/dist/cli/chunks/{cost-tracker-CYBOV3NI.js → cost-tracker-R3C5IQPZ.js} +2 -2
- package/dist/cli/chunks/{coverage-GTZJBSC4.js → coverage-MR4QA2NM.js} +3 -3
- package/dist/cli/chunks/cross-domain-router-3TSZMCBM.js +2 -0
- package/dist/cli/chunks/{cursor-installer-WZIVXGGB.js → cursor-installer-LPZ7NGOS.js} +2 -2
- package/dist/cli/chunks/{daemon-JWMHEJEN.js → daemon-K3KW2UDV.js} +4 -4
- package/dist/cli/chunks/{daemon-MSFN2LXY.js → daemon-X5KXHRY3.js} +3 -3
- package/dist/cli/chunks/{dag-attention-scheduler-4TWOTTQE.js → dag-attention-scheduler-J4FJSGNN.js} +2 -2
- package/dist/cli/chunks/{detect-YZ6AGQPB.js → detect-22TX2NCA.js} +2 -2
- package/dist/cli/chunks/{dist-node-3EM2XH54.js → dist-node-QI4I4QPS.js} +2 -2
- package/dist/cli/chunks/{domain-handler-4XU5BINU.js → domain-handler-ZYZGPNOQ.js} +2 -2
- package/dist/cli/chunks/{domain-transfer-HUFC7I52.js → domain-transfer-2EEQTNIU.js} +2 -2
- package/dist/cli/chunks/dream-QIIJONYI.js +2 -0
- package/dist/cli/chunks/{embed-and-insert-pattern-J5ZFM6YX.js → embed-and-insert-pattern-LYCTU5BS.js} +2 -2
- package/dist/cli/chunks/eval-SOA72GUX.js +17 -0
- package/dist/cli/chunks/{experience-capture-middleware-E3RYQB6Z.js → experience-capture-middleware-AFFYOMYM.js} +3 -3
- package/dist/cli/chunks/{fast-paths-DKIYN2YS.js → fast-paths-WNMHOSUH.js} +2 -2
- package/dist/cli/chunks/{feature-flags-ZB63Z7N5.js → feature-flags-FT4YBZH4.js} +2 -2
- package/dist/cli/chunks/{feature-flags-S2RNZATS.js → feature-flags-HAP5IAAY.js} +2 -2
- package/dist/cli/chunks/{file-discovery-USJJLYQU.js → file-discovery-B4FFOH3Z.js} +2 -2
- package/dist/cli/chunks/{fleet-4MUPHSF5.js → fleet-2ICPYV3J.js} +3 -3
- package/dist/cli/chunks/{gnn-wrapper-PYOQZKX6.js → gnn-wrapper-XIBJAHMW.js} +2 -2
- package/dist/cli/chunks/{heartbeat-handler-HLO5XCG7.js → heartbeat-handler-NSLSKDOI.js} +4 -4
- package/dist/cli/chunks/heartbeat-scheduler-CDNGLJJO.js +2 -0
- package/dist/cli/chunks/hnsw-adapter-CR7Y4OAM.js +2 -0
- package/dist/cli/chunks/hnsw-index-TEDO4MQC.js +2 -0
- package/dist/cli/chunks/{hnsw-legacy-bridge-FZEH2KLM.js → hnsw-legacy-bridge-FTV4CCBB.js} +2 -2
- package/dist/cli/chunks/{better-sqlite3-LRDXKYOJ.js → hnswlib-node-BCASOCNU.js} +2 -2
- package/dist/cli/chunks/{hooks-R2757K57.js → hooks-SM4EU52N.js} +10 -10
- package/dist/cli/chunks/hybrid-router-O24ZDIP5.js +2 -0
- package/dist/cli/chunks/{hypergraph-engine-EAV3GJ5D.js → hypergraph-engine-RRMX4N3L.js} +2 -2
- package/dist/cli/chunks/{hypergraph-handler-5ERXAVGH.js → hypergraph-handler-MNFGDKAP.js} +3 -3
- package/dist/cli/chunks/impact-analyzer-PDM4SDB6.js +2 -0
- package/dist/cli/chunks/{init-handler-RXUSEMG7.js → init-handler-BNHIJ5TX.js} +6 -6
- package/dist/cli/chunks/init-wizard-F4KODPNW.js +2 -0
- package/dist/cli/chunks/kernel-77UM35L6.js +2 -0
- package/dist/cli/chunks/{kilocode-installer-ZUBVBHGT.js → kilocode-installer-GFKUKPLY.js} +2 -2
- package/dist/cli/chunks/{kiro-installer-TRTRQDGL.js → kiro-installer-YBIYKODN.js} +2 -2
- package/dist/cli/chunks/knowledge-graph-R6ZWWV2K.js +2 -0
- package/dist/cli/chunks/{learning-UYXWAU5D.js → learning-QEWUPCK6.js} +3 -3
- package/dist/cli/chunks/{llm-router-TB5OJPEV.js → llm-router-D5FQIMVQ.js} +5 -5
- package/dist/cli/chunks/llm-router-service-7QYCZ66H.js +2 -0
- package/dist/cli/chunks/{load-ELPSUIPV.js → load-CLBUCKZQ.js} +2 -2
- package/dist/cli/chunks/load-test-AWVA3CAQ.js +2 -0
- package/dist/cli/chunks/{mcp-UX7TK3XV.js → mcp-VOMG5DPV.js} +2 -2
- package/dist/cli/chunks/{memory-W3LG6H6N.js → memory-WZO63VSC.js} +5 -5
- package/dist/cli/chunks/memory-backend-YESSIHFW.js +2 -0
- package/dist/cli/chunks/memory-handlers-EOOWSUHI.js +2 -0
- package/dist/cli/chunks/{multi-model-executor-227LWZRY.js → multi-model-executor-7UKW43VV.js} +2 -2
- package/dist/cli/chunks/{opencode-installer-F4WKVWDL.js → opencode-installer-MLFPRRL2.js} +2 -2
- package/dist/cli/chunks/{orchestrator-V4DBMGK6.js → orchestrator-XNYDBGIN.js} +18 -18
- package/dist/cli/chunks/pattern-null-store-X3UXLJNL.js +2 -0
- package/dist/cli/chunks/{pattern-usage-recorder-BY3HEWSU.js → pattern-usage-recorder-ZAP7ASQI.js} +2 -2
- package/dist/cli/chunks/{pipeline-3F5RIESX.js → pipeline-4EJYOPBC.js} +2 -2
- package/dist/cli/chunks/{platform-KCGXTZO3.js → platform-ALPOWCOH.js} +2 -2
- package/dist/cli/chunks/{plugin-2H552KOV.js → plugin-S2RX3KHR.js} +2 -2
- package/dist/cli/chunks/{prime-radiant-advanced-wasm-EFKVL7VN.js → prime-radiant-advanced-wasm-P2JB73XX.js} +2 -2
- package/dist/cli/chunks/protocol-executor-KXDCTMWI.js +2 -0
- package/dist/cli/chunks/{protocol-handler-ELGYV7D2.js → protocol-handler-ZBJXSESA.js} +2 -2
- package/dist/cli/chunks/{prove-AYJCQYNI.js → prove-MYJ5YV45.js} +2 -2
- package/dist/cli/chunks/provider-manager-XJZVHYI6.js +2 -0
- package/dist/cli/chunks/qe-reasoning-bank-DPHPNIC6.js +2 -0
- package/dist/cli/chunks/{quality-HH7L5A7V.js → quality-NIACQC4M.js} +2 -2
- package/dist/cli/chunks/{quality-gate-NAQLXE4C.js → quality-gate-OAZ23ON5.js} +3 -3
- package/dist/cli/chunks/queen-coordinator-EVGWME5C.js +2 -0
- package/dist/cli/chunks/{real-embeddings-IO3F4ZFR.js → real-embeddings-6I4LP7PL.js} +2 -2
- package/dist/cli/chunks/{roocode-installer-X4TU5HO4.js → roocode-installer-LRQHP6MK.js} +2 -2
- package/dist/cli/chunks/router-R2N7TMAS.js +2 -0
- package/dist/cli/chunks/routing-feedback-G6W3H26L.js +2 -0
- package/dist/cli/chunks/{routing-handler-ZJKGDDMT.js → routing-handler-A7BW7MV4.js} +2 -2
- package/dist/cli/chunks/{ruvector-commands-NXCSUBN2.js → ruvector-commands-ZDRRFSJS.js} +2 -2
- package/dist/cli/chunks/{rvf-dual-writer-JMA74SKP.js → rvf-dual-writer-QWE3Z6BB.js} +2 -2
- package/dist/cli/chunks/{rvf-migration-adapter-BNTGH2KU.js → rvf-migration-adapter-6UDAP7QB.js} +2 -2
- package/dist/cli/chunks/{rvf-migration-coordinator-7T2HHUOH.js → rvf-migration-coordinator-FEW2N4R4.js} +2 -2
- package/dist/cli/chunks/rvf-native-adapter-D7R2GWXK.js +2 -0
- package/dist/cli/chunks/safe-db-CQZGF2KA.js +2 -0
- package/dist/cli/chunks/schedule-UP7E3LRC.js +2 -0
- package/dist/cli/chunks/scheduler-ENIZHYSL.js +2 -0
- package/dist/cli/chunks/{security-XSK2QHB3.js → security-KFXBV65O.js} +3 -3
- package/dist/cli/chunks/{shared-rvf-adapter-WLRKI7RY.js → shared-rvf-adapter-HDDCXCHY.js} +2 -2
- package/dist/cli/chunks/{shared-rvf-dual-writer-SZW3J7ZK.js → shared-rvf-dual-writer-CXXTB7CU.js} +2 -2
- package/dist/cli/chunks/sqlite-persistence-CEVJVWS5.js +2 -0
- package/dist/cli/chunks/status-handler-CXSVM236.js +47 -0
- package/dist/cli/chunks/{structural-health-4SJCFX63.js → structural-health-LMHSM7MJ.js} +2 -2
- package/dist/cli/chunks/{sync-7WAVNZGL.js → sync-DMOUY2EY.js} +2 -2
- package/dist/cli/chunks/{sync-ATR4DUSA.js → sync-REEFKICL.js} +2 -2
- package/dist/cli/chunks/{task-handler-O6REL34Y.js → task-handler-DMSNFIH3.js} +2 -2
- package/dist/cli/chunks/{task-handlers-WFV2ZYWW.js → task-handlers-3Z3QV7X7.js} +3 -3
- package/dist/cli/chunks/{test-4LXUVHEU.js → test-U6CGMDLN.js} +4 -4
- package/dist/cli/chunks/{test-scheduling-OTN3DMKY.js → test-scheduling-YHYA3BP5.js} +3 -3
- package/dist/cli/chunks/{token-bootstrap-VA7T4P42.js → token-bootstrap-MQCTJURQ.js} +2 -2
- package/dist/cli/chunks/{token-usage-TLT6OXXR.js → token-usage-EOOTM7Q3.js} +2 -2
- package/dist/cli/chunks/{transformers-JI7LZRQ3.js → transformers-EKDJW2H6.js} +2 -2
- package/dist/cli/chunks/{tree-sitter-wasm-parser-QNIMHB4K.js → tree-sitter-wasm-parser-HTGAXDQA.js} +2 -2
- package/dist/cli/chunks/{types-DJNWOAC6.js → types-GLRXY4RY.js} +2 -2
- package/dist/cli/chunks/unified-memory-PXOQ4N53.js +2 -0
- package/dist/cli/chunks/unified-memory-hnsw-VEXD6ASE.js +2 -0
- package/dist/cli/chunks/unified-persistence-46G6MZYC.js +2 -0
- package/dist/cli/chunks/{upgrade-VEW4FL23.js → upgrade-KU55H77X.js} +2 -2
- package/dist/cli/chunks/{validate-O3P6PF7B.js → validate-26VSBOJN.js} +2 -2
- package/dist/cli/chunks/{validate-swarm-M2HXHZVC.js → validate-swarm-OIALRDKF.js} +2 -2
- package/dist/cli/chunks/{vibium-GOU55LUO.js → vibium-LOTWW25P.js} +2 -2
- package/dist/cli/chunks/visual-security-4X3T3MFL.js +2 -0
- package/dist/cli/chunks/{web-tree-sitter-MXOI4GH3.js → web-tree-sitter-6LWPPBYU.js} +2 -2
- package/dist/cli/chunks/{windsurf-installer-6GKT53IH.js → windsurf-installer-ILOQYENG.js} +2 -2
- package/dist/cli/chunks/witness-chain-XW4S3LVW.js +2 -0
- package/dist/cli/chunks/{witness-chain-OXGQGL26.js → witness-chain-YBS6OHS4.js} +2 -2
- package/dist/cli/chunks/{witness-key-manager-PGFSQXUJ.js → witness-key-manager-SI3WV3ZQ.js} +2 -2
- package/dist/cli/chunks/{workflow-ENBWRMBA.js → workflow-GY6SJRQW.js} +4 -4
- package/dist/cli/chunks/workflow-orchestrator-IIVV6TCP.js +2 -0
- package/dist/cli/chunks/{wrappers-MHLNYANQ.js → wrappers-MMO5YKOZ.js} +2 -2
- package/dist/cli/commands/eval.js +73 -3
- package/dist/cli/commands/llm-router.js +2 -0
- package/dist/cli/handlers/status-handler.d.ts +5 -0
- package/dist/cli/handlers/status-handler.js +35 -0
- package/dist/coordination/consensus/providers/index.js +11 -0
- package/dist/init/init-wizard-hooks.js +11 -25
- package/dist/init/phases/07-hooks.js +15 -25
- package/dist/init/settings-merge.d.ts +44 -0
- package/dist/init/settings-merge.js +119 -4
- package/dist/mcp/bundle.js +412 -393
- package/dist/shared/llm/billing-modes.d.ts +24 -0
- package/dist/shared/llm/billing-modes.js +56 -0
- package/dist/shared/llm/cost-tracker.js +2 -0
- package/dist/shared/llm/interfaces.d.ts +61 -3
- package/dist/shared/llm/provider-manager.d.ts +34 -0
- package/dist/shared/llm/provider-manager.js +152 -3
- package/dist/shared/llm/providers/claude-code.d.ts +57 -0
- package/dist/shared/llm/providers/claude-code.js +312 -0
- package/dist/shared/llm/providers/cognitum.d.ts +64 -0
- package/dist/shared/llm/providers/cognitum.js +369 -0
- package/dist/shared/llm/providers/index.d.ts +2 -0
- package/dist/shared/llm/providers/index.js +2 -0
- package/dist/shared/llm/router/config-store.d.ts +31 -11
- package/dist/shared/llm/router/config-store.js +82 -12
- package/dist/shared/llm/router/hybrid-router.js +16 -0
- package/dist/shared/llm/router/types.js +7 -0
- package/dist/shared/llm/spend-ledger.d.ts +64 -0
- package/dist/shared/llm/spend-ledger.js +115 -0
- package/dist/shared/llm/translation/message-formatter.js +2 -0
- package/dist/shared/llm/translation/prompt-translator.js +2 -0
- package/dist/shared/llm/translation/tool-translator.js +2 -0
- package/dist/validation/index.d.ts +1 -0
- package/dist/validation/index.js +2 -0
- package/dist/validation/provider-llm-executor.d.ts +45 -0
- package/dist/validation/provider-llm-executor.js +98 -0
- package/package.json +1 -1
- package/dist/cli/chunks/adapter-6IWRIHF3.js +0 -2
- package/dist/cli/chunks/aqe-learning-engine-FSF5U67K.js +0 -2
- package/dist/cli/chunks/base-2CKCJU3O.js +0 -2
- package/dist/cli/chunks/browser-workflow-UGYJE64S.js +0 -2
- package/dist/cli/chunks/chunk-2AOOIAW3.js +0 -316
- package/dist/cli/chunks/chunk-3B4XXFKD.js +0 -18
- package/dist/cli/chunks/chunk-BBC526PL.js +0 -24
- package/dist/cli/chunks/chunk-ESDGCTC4.js +0 -2
- package/dist/cli/chunks/chunk-IDLNLSQI.js +0 -3
- package/dist/cli/chunks/chunk-MDT3LIXS.js +0 -2
- package/dist/cli/chunks/client-E2XUBCLK.js +0 -2
- package/dist/cli/chunks/core-handlers-46Z5VOO6.js +0 -2
- package/dist/cli/chunks/cross-domain-router-SXQ3HFRY.js +0 -2
- package/dist/cli/chunks/dream-R6MQQQ3N.js +0 -2
- package/dist/cli/chunks/eval-XYOA3EH2.js +0 -15
- package/dist/cli/chunks/heartbeat-scheduler-OSDPJT6A.js +0 -2
- package/dist/cli/chunks/hnsw-adapter-KMGSHBIN.js +0 -2
- package/dist/cli/chunks/hnsw-index-IMFRAOPE.js +0 -2
- package/dist/cli/chunks/hybrid-router-57QSWSWC.js +0 -2
- package/dist/cli/chunks/impact-analyzer-OC4MPBGA.js +0 -2
- package/dist/cli/chunks/init-wizard-CDBRL4PO.js +0 -2
- package/dist/cli/chunks/kernel-CQ7R3AAV.js +0 -2
- package/dist/cli/chunks/knowledge-graph-UXNH7RY4.js +0 -2
- package/dist/cli/chunks/llm-router-service-UV34YXBE.js +0 -2
- package/dist/cli/chunks/load-test-2VEN3PQZ.js +0 -2
- package/dist/cli/chunks/memory-backend-TZL5U6F3.js +0 -2
- package/dist/cli/chunks/memory-handlers-BNXAYS2P.js +0 -2
- package/dist/cli/chunks/pattern-null-store-KLX2RNHM.js +0 -2
- package/dist/cli/chunks/protocol-executor-5HJKW6MC.js +0 -2
- package/dist/cli/chunks/provider-manager-TRZSBXD3.js +0 -2
- package/dist/cli/chunks/qe-reasoning-bank-RCEYSLVV.js +0 -2
- package/dist/cli/chunks/queen-coordinator-6JFZD54W.js +0 -2
- package/dist/cli/chunks/router-KRLC46NS.js +0 -2
- package/dist/cli/chunks/routing-feedback-WW26H6SA.js +0 -2
- package/dist/cli/chunks/rvf-native-adapter-OVQKPQUH.js +0 -2
- package/dist/cli/chunks/safe-db-UQOCQIH2.js +0 -2
- package/dist/cli/chunks/schedule-EUX7ZQUK.js +0 -2
- package/dist/cli/chunks/scheduler-MALHQKNR.js +0 -2
- package/dist/cli/chunks/sqlite-persistence-OBCLRP4L.js +0 -2
- package/dist/cli/chunks/status-handler-HGCKYJX2.js +0 -46
- package/dist/cli/chunks/unified-memory-A5BS3LGX.js +0 -2
- package/dist/cli/chunks/unified-memory-hnsw-WJLJO5MY.js +0 -2
- package/dist/cli/chunks/unified-persistence-CFC2BKI5.js +0 -2
- package/dist/cli/chunks/visual-security-VPB6KVYJ.js +0 -2
- package/dist/cli/chunks/witness-chain-ZZAUAXDY.js +0 -2
- 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.
|
|
2
|
-
import"./chunk-
|
|
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-
|
|
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-
|
|
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.
|
|
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-
|
|
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
|
-
//
|
|
187
|
-
|
|
188
|
-
settings.env
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
//
|
|
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
|
-
|
|
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
|
-
//
|
|
80
|
-
|
|
81
|
-
settings.env
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
//
|
|
86
|
-
//
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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.
|