agentic-qe 3.14.4 → 3.14.6
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 +169 -0
- package/assets/skills/skills-manifest.json +1 -1
- package/dist/adapters/ag-ui/event-types.d.ts +1 -1
- package/dist/audit/witness-chain-hash.d.ts +18 -0
- package/dist/audit/witness-chain-hash.js +37 -0
- package/dist/audit/witness-chain-repair.d.ts +71 -0
- package/dist/audit/witness-chain-repair.js +203 -0
- package/dist/audit/witness-chain-verifier.d.ts +152 -0
- package/dist/audit/witness-chain-verifier.js +293 -0
- package/dist/audit/witness-chain.d.ts +10 -43
- package/dist/audit/witness-chain.js +43 -126
- package/dist/audit/witness-findings.js +4 -1
- package/dist/cli/bundle.js +13 -10
- package/dist/cli/chunks/adapter-UYOJPTOX.js +2 -0
- package/dist/cli/chunks/agent-booster-wasm-2YGML6OU.js +2 -0
- package/dist/cli/chunks/{agent-handler-RDNTK4CA.js → agent-handler-D5SSQYNU.js} +2 -2
- package/dist/cli/chunks/{agent-memory-branch-NAAMBWIR.js → agent-memory-branch-YHPLTITV.js} +2 -2
- package/dist/cli/chunks/aqe-learning-engine-JR5AVQXR.js +2 -0
- package/dist/cli/chunks/{arena-KXFHRWX4.js → arena-7BGOXGXO.js} +2 -2
- package/dist/cli/chunks/{arena-HXTWJ5YY.js → arena-MCE6EU7K.js} +4 -4
- package/dist/cli/chunks/audit-BMWTQECB.js +4 -0
- package/dist/cli/chunks/base-DRZ2LS6X.js +2 -0
- package/dist/cli/chunks/{better-sqlite3-UICJZIDG.js → better-sqlite3-PMUNGASU.js} +2 -2
- package/dist/cli/chunks/brain-handler-QPUFYX7F.js +94 -0
- package/dist/cli/chunks/{branch-enumerator-SS7UNVIA.js → branch-enumerator-WKFDGRN4.js} +2 -2
- package/dist/cli/chunks/{browser-77GI6KBE.js → browser-VY5HKH5X.js} +2 -2
- package/dist/cli/chunks/browser-workflow-CJ7T3MXF.js +2 -0
- package/dist/cli/chunks/{chunk-PZJOPURC.js → chunk-257E2A5M.js} +5 -5
- package/dist/cli/chunks/{chunk-55RWDRJD.js → chunk-2JVWITNK.js} +4 -4
- package/dist/cli/chunks/{chunk-BOARZKU3.js → chunk-2NPKIBAZ.js} +2 -2
- package/dist/cli/chunks/chunk-2TMWAQQ3.js +13 -0
- package/dist/cli/chunks/{chunk-M4WJKGVK.js → chunk-2YXGBZWV.js} +1 -1
- package/dist/cli/chunks/{chunk-3VOQRIQM.js → chunk-3EA536JF.js} +2 -2
- package/dist/cli/chunks/{chunk-ZZDIMOOV.js → chunk-3EZOZN25.js} +2 -2
- package/dist/cli/chunks/{chunk-MNW6QGNJ.js → chunk-3HZS4M3O.js} +2 -2
- package/dist/cli/chunks/{chunk-EKQ673SA.js → chunk-3NIG7S5W.js} +1 -1
- package/dist/cli/chunks/{chunk-7D777LTF.js → chunk-4N23RFDU.js} +2 -2
- package/dist/cli/chunks/{chunk-BOZZYWCR.js → chunk-5J6W7SIA.js} +1 -1
- package/dist/cli/chunks/{chunk-HIVA55CJ.js → chunk-5OOMJGFN.js} +1 -1
- package/dist/cli/chunks/{chunk-W7BWUTVV.js → chunk-5QQSIGUA.js} +2 -2
- package/dist/cli/chunks/{chunk-PAWXJ73E.js → chunk-5VFPCSK7.js} +1 -1
- package/dist/cli/chunks/{chunk-KPA7MZ6C.js → chunk-62N4NUJH.js} +2 -2
- package/dist/cli/chunks/chunk-64VGZQLB.js +2 -0
- package/dist/cli/chunks/{chunk-64PFWE2F.js → chunk-66VWCR67.js} +2 -2
- package/dist/cli/chunks/{chunk-XRT2WRMS.js → chunk-6LIHFV7O.js} +2 -2
- package/dist/cli/chunks/{chunk-STJCATGN.js → chunk-6OS76PHI.js} +2 -2
- package/dist/cli/chunks/{chunk-ZNPKDCZR.js → chunk-6RE3X4V5.js} +2 -2
- package/dist/cli/chunks/{chunk-BFP7KO7P.js → chunk-6SH5VZUD.js} +2 -2
- package/dist/cli/chunks/chunk-6SQM2MUX.js +4 -0
- package/dist/cli/chunks/{chunk-IPR4QP3H.js → chunk-6U7LNMWZ.js} +2 -2
- package/dist/cli/chunks/{chunk-MIQTXNBG.js → chunk-72KXSMWI.js} +1 -1
- package/dist/cli/chunks/chunk-7CUQCCMD.js +27 -0
- package/dist/cli/chunks/chunk-7D3V65N5.js +2 -0
- package/dist/cli/chunks/{chunk-JZ3ORVZ3.js → chunk-7J6QC567.js} +3 -3
- package/dist/cli/chunks/{chunk-4OYFXLBK.js → chunk-7LPR6HJG.js} +2 -2
- package/dist/cli/chunks/{chunk-4MHXCAG2.js → chunk-7NITCZWD.js} +1 -1
- package/dist/cli/chunks/{chunk-M5QUBZY6.js → chunk-7Z5LHRC3.js} +2 -2
- package/dist/cli/chunks/{chunk-CSU5NYOX.js → chunk-AHKELLIO.js} +4 -4
- package/dist/cli/chunks/{chunk-DHJPWQBR.js → chunk-AIRGNL55.js} +2 -2
- package/dist/cli/chunks/{chunk-C2WU3533.js → chunk-AJRUJAAK.js} +1 -1
- package/dist/cli/chunks/{chunk-HIYXCDEP.js → chunk-AVBJYI5I.js} +1 -1
- package/dist/cli/chunks/{chunk-U5K45TFH.js → chunk-B6D2CHEH.js} +1 -1
- package/dist/cli/chunks/{chunk-FRH6VAUS.js → chunk-B6MOJC3X.js} +1 -1
- package/dist/cli/chunks/{chunk-HUWNIPZ5.js → chunk-BAMN2CHI.js} +1 -1
- package/dist/cli/chunks/{chunk-ONII3572.js → chunk-BBT64TII.js} +3 -3
- package/dist/cli/chunks/{chunk-KSKEF7LZ.js → chunk-BJTJLJRZ.js} +3 -3
- package/dist/cli/chunks/chunk-BMAPORJ7.js +15 -0
- package/dist/cli/chunks/{chunk-CIZ5JPDC.js → chunk-BPEDWS6O.js} +3 -3
- package/dist/cli/chunks/{chunk-Z3RHREWF.js → chunk-BVR7RMC5.js} +1 -1
- package/dist/cli/chunks/{chunk-HDSAM2RE.js → chunk-C6KWXUFJ.js} +2 -2
- package/dist/cli/chunks/{chunk-ZBAKA4YB.js → chunk-CCK4BF76.js} +1 -1
- package/dist/cli/chunks/{chunk-IFCLB7FJ.js → chunk-CD542DNJ.js} +1 -1
- package/dist/cli/chunks/{chunk-6KJABXAR.js → chunk-CF2ISEOJ.js} +2 -2
- package/dist/cli/chunks/chunk-CM7U6TAX.js +5 -0
- package/dist/cli/chunks/{chunk-3X3DJZJJ.js → chunk-D45SG6CP.js} +1 -1
- package/dist/cli/chunks/{chunk-DAEFDCJ4.js → chunk-D6CJIGRU.js} +89 -83
- package/dist/cli/chunks/{chunk-MVPCNSPY.js → chunk-DBDPRORT.js} +2 -2
- package/dist/cli/chunks/{chunk-AUXFKCQL.js → chunk-DHVX5UB2.js} +2 -2
- package/dist/cli/chunks/{chunk-GPLQ6DOK.js → chunk-DK4XN4CU.js} +2 -2
- package/dist/cli/chunks/{chunk-SRKETSFF.js → chunk-DPYSUDAO.js} +1 -1
- package/dist/cli/chunks/{chunk-CNG6GQEZ.js → chunk-DUYOVM5I.js} +2 -2
- package/dist/cli/chunks/{chunk-VIHTL3U2.js → chunk-DZ3AUAAB.js} +2 -2
- package/dist/cli/chunks/{chunk-CU46J64M.js → chunk-E6G2RD5H.js} +2 -2
- package/dist/cli/chunks/{chunk-5YPYDPBJ.js → chunk-EAY2JMZG.js} +2 -2
- package/dist/cli/chunks/{chunk-V3QLFNA2.js → chunk-ELLBS5RP.js} +4 -4
- package/dist/cli/chunks/chunk-ENGZ4D5V.js +2 -0
- package/dist/cli/chunks/chunk-FBMN7B46.js +4 -0
- package/dist/cli/chunks/{chunk-EDJ3O7RH.js → chunk-FWASDOT2.js} +2 -2
- package/dist/cli/chunks/{chunk-MDWCE7YW.js → chunk-FZOBD67M.js} +1 -1
- package/dist/cli/chunks/{chunk-A4FYONNU.js → chunk-GDSXITFH.js} +2 -2
- package/dist/cli/chunks/{chunk-2JW3BCGG.js → chunk-GGRHV6D7.js} +1 -1
- package/dist/cli/chunks/{chunk-ISDMD6EU.js → chunk-GPYVDFB3.js} +90 -90
- package/dist/cli/chunks/{chunk-CDKG6EI7.js → chunk-GSF6MB64.js} +2 -2
- package/dist/cli/chunks/{chunk-WLG5AJ4N.js → chunk-H52HZ67P.js} +2 -2
- package/dist/cli/chunks/{chunk-FGYMFUE2.js → chunk-H5BS5VH7.js} +2 -2
- package/dist/cli/chunks/{chunk-34WO57CW.js → chunk-H6ZM3PUT.js} +1 -1
- package/dist/cli/chunks/{chunk-6CQN24ZK.js → chunk-HM6ZSCPI.js} +1 -1
- package/dist/cli/chunks/{chunk-DPFRKBOG.js → chunk-HNFVJP4I.js} +2 -2
- package/dist/cli/chunks/{chunk-TPGED2IF.js → chunk-I33ERSGB.js} +2 -2
- package/dist/cli/chunks/{chunk-UEM7ZF5K.js → chunk-IAF6T27S.js} +2 -2
- package/dist/cli/chunks/{chunk-KCZR45PA.js → chunk-IB27QACC.js} +2 -2
- package/dist/cli/chunks/{chunk-SGYJ4NFZ.js → chunk-ICTXTNQZ.js} +1 -1
- package/dist/cli/chunks/chunk-IG5GNEC6.js +4 -0
- package/dist/cli/chunks/{chunk-KHFNNVJA.js → chunk-IQO7UCFR.js} +2 -2
- package/dist/cli/chunks/{chunk-3TW5W5LX.js → chunk-IV5UZOHH.js} +2 -2
- package/dist/cli/chunks/{chunk-7ZIOFPL3.js → chunk-JBTPOIAC.js} +2 -2
- package/dist/cli/chunks/{chunk-ZNEMGX5O.js → chunk-JIXUMYKZ.js} +1 -1
- package/dist/cli/chunks/{chunk-MTZH7AHC.js → chunk-JMONHE4B.js} +1 -1
- package/dist/cli/chunks/{chunk-TDZ53WO2.js → chunk-JVNTSNWU.js} +2 -2
- package/dist/cli/chunks/{chunk-PFR4G3DJ.js → chunk-JXGFRBUO.js} +2 -2
- package/dist/cli/chunks/chunk-JZOS5FCX.js +2 -0
- package/dist/cli/chunks/{chunk-STM3UDNO.js → chunk-KNNISEDY.js} +2 -2
- package/dist/cli/chunks/{chunk-TWAWHOP7.js → chunk-L4RUBPLR.js} +2 -2
- package/dist/cli/chunks/chunk-LL3IGZBI.js +2 -0
- package/dist/cli/chunks/{chunk-CIKSHTEQ.js → chunk-MBRHSU6W.js} +10 -10
- package/dist/cli/chunks/{chunk-G6T45OIC.js → chunk-MJS53PRX.js} +2 -2
- package/dist/cli/chunks/{chunk-PO3IXGMQ.js → chunk-MQROI74N.js} +2 -2
- package/dist/cli/chunks/{chunk-DOTK76IJ.js → chunk-MUOG6QXR.js} +2 -2
- package/dist/cli/chunks/{chunk-MVNP7GIR.js → chunk-MW2GGZZ5.js} +1 -1
- package/dist/cli/chunks/{chunk-FWGOHAAB.js → chunk-NHWGMJAP.js} +2 -2
- package/dist/cli/chunks/{chunk-ZBJ4XOOV.js → chunk-NMAIY4PX.js} +4 -4
- package/dist/cli/chunks/{chunk-CDHQFHRP.js → chunk-NQZ5AR3D.js} +2 -2
- package/dist/cli/chunks/{chunk-FLYOJOKN.js → chunk-P6OYS755.js} +1 -1
- package/dist/cli/chunks/{chunk-BGE6FOLM.js → chunk-PI7TJS62.js} +2 -2
- package/dist/cli/chunks/chunk-PX5YDCRH.js +4 -0
- package/dist/cli/chunks/{chunk-Q5DO24IJ.js → chunk-PZPWRQ2M.js} +3 -3
- package/dist/cli/chunks/{chunk-R4VL6E65.js → chunk-Q5XTSMWR.js} +2 -2
- package/dist/cli/chunks/{chunk-JBNEE5UH.js → chunk-Q7EAGKAE.js} +2 -2
- package/dist/cli/chunks/{chunk-R5NE6B2M.js → chunk-QDFTT3RF.js} +2 -2
- package/dist/cli/chunks/{chunk-DFZCKIGY.js → chunk-QGA55PFM.js} +3 -3
- package/dist/cli/chunks/{chunk-RJCYCLZV.js → chunk-QW6VMTBR.js} +2 -2
- package/dist/cli/chunks/{chunk-6VRA2QGL.js → chunk-QZANMBIT.js} +1 -1
- package/dist/cli/chunks/{chunk-MEGDYJPV.js → chunk-RETBYIAC.js} +4 -4
- package/dist/cli/chunks/{chunk-XJ7QNVI5.js → chunk-RFNPJK6N.js} +3 -3
- package/dist/cli/chunks/{chunk-NJBGXDQ7.js → chunk-RG52OKAM.js} +1 -1
- package/dist/cli/chunks/{chunk-DA5K5754.js → chunk-RSXXCL4A.js} +1 -1
- package/dist/cli/chunks/{chunk-HV2J7KKQ.js → chunk-RTFO5UQH.js} +2 -2
- package/dist/cli/chunks/{chunk-6UWGMOND.js → chunk-RZZCUIAI.js} +2 -2
- package/dist/cli/chunks/chunk-SDRHUMJB.js +2 -0
- package/dist/cli/chunks/{chunk-TSRSV3LD.js → chunk-SE4WIB26.js} +1 -1
- package/dist/cli/chunks/{chunk-ODKLFVYC.js → chunk-SESK3ARK.js} +2 -2
- package/dist/cli/chunks/{chunk-AWWNB2T7.js → chunk-SJUXE4IC.js} +2 -2
- package/dist/cli/chunks/{chunk-QGIU2WRL.js → chunk-SMDN3BQZ.js} +1 -1
- package/dist/cli/chunks/{chunk-VD6QRULW.js → chunk-SNOBH4AZ.js} +2 -2
- package/dist/cli/chunks/{chunk-OSLYSG3B.js → chunk-SPV2VKC5.js} +2 -2
- package/dist/cli/chunks/chunk-TCHGOB2N.js +2 -0
- package/dist/cli/chunks/{chunk-MOBNBMFW.js → chunk-TVYY3OCX.js} +1 -1
- package/dist/cli/chunks/{chunk-UGVHCMUN.js → chunk-UCFQALXO.js} +3 -3
- package/dist/cli/chunks/{chunk-3QHGWY7T.js → chunk-UKA2KOXE.js} +2 -2
- package/dist/cli/chunks/{chunk-MCUJEZT6.js → chunk-UNFFDHER.js} +16 -11
- package/dist/cli/chunks/{chunk-6QYNWR7U.js → chunk-UQ32JHES.js} +2 -2
- package/dist/cli/chunks/{chunk-OULHKEVH.js → chunk-V4DM6ELU.js} +2 -2
- package/dist/cli/chunks/{chunk-M2JBBZQB.js → chunk-VGFFFKGK.js} +2 -2
- package/dist/cli/chunks/{chunk-OCWWP5PL.js → chunk-VMNWDJIZ.js} +2 -2
- package/dist/cli/chunks/chunk-W6HXLH5G.js +180 -0
- package/dist/cli/chunks/{chunk-AIHDEEJO.js → chunk-WCJBU2KI.js} +2 -2
- package/dist/cli/chunks/{chunk-ZBQY5GLF.js → chunk-WGM35YWL.js} +2 -2
- package/dist/cli/chunks/chunk-WO4QMXIG.js +3 -0
- package/dist/cli/chunks/{chunk-3UPAMMCB.js → chunk-XAS3XRYM.js} +1 -1
- package/dist/cli/chunks/chunk-Y3LZ35OG.js +2 -0
- package/dist/cli/chunks/{chunk-5R3QL7WN.js → chunk-Y3UOUNHM.js} +2 -2
- package/dist/cli/chunks/{chunk-ZJ26AQA5.js → chunk-YFBSPLJG.js} +1 -1
- package/dist/cli/chunks/{chunk-BDESSCVR.js → chunk-YHKEDEAA.js} +3 -3
- package/dist/cli/chunks/{chunk-CXQPR5MY.js → chunk-YS4FCTWF.js} +1 -1
- package/dist/cli/chunks/{chunk-CLTMDCSE.js → chunk-YSLL6VSL.js} +2 -2
- package/dist/cli/chunks/chunk-Z6GGIRQQ.js +65 -0
- package/dist/cli/chunks/{chunk-F3SBRQC6.js → chunk-Z7WODOTH.js} +2 -2
- package/dist/cli/chunks/chunk-ZCRTRYXK.js +14 -0
- package/dist/cli/chunks/{chunk-XRYF6JV7.js → chunk-ZEV3YTO7.js} +2 -2
- package/dist/cli/chunks/{chunk-YNXS6CGV.js → chunk-ZL6SYKUK.js} +1 -1
- package/dist/cli/chunks/{chunk-5SJHQ2CO.js → chunk-ZSPU4MOS.js} +2 -2
- package/dist/cli/chunks/{chunk-UDHKLT4C.js → chunk-ZVWVV4EX.js} +1 -1
- package/dist/cli/chunks/{ci-464KPQNP.js → ci-W6K6G2KZ.js} +2 -2
- package/dist/cli/chunks/{ci-output-I7FX2RSO.js → ci-output-LDT24TS3.js} +2 -2
- package/dist/cli/chunks/{circuit-breaker-3FW237WW.js → circuit-breaker-F5V4KITU.js} +2 -2
- package/dist/cli/chunks/claude-flow-setup-DT6WQQVD.js +2 -0
- package/dist/cli/chunks/client-KHWJT6FB.js +2 -0
- package/dist/cli/chunks/{cline-installer-UWFHT6VY.js → cline-installer-G7TJOAEX.js} +2 -2
- package/dist/cli/chunks/{code-KQSUT3FS.js → code-PGE6A42V.js} +3 -3
- package/dist/cli/chunks/{code-index-extractor-PABBNUSC.js → code-index-extractor-RNITH372.js} +2 -2
- package/dist/cli/chunks/codex-installer-LBX77AI3.js +14 -0
- package/dist/cli/chunks/{completions-7RWHAUAR.js → completions-4AWLAARX.js} +2 -2
- package/dist/cli/chunks/{complexity-analyzer-XPOAF33E.js → complexity-analyzer-ZPNSS476.js} +2 -2
- package/dist/cli/chunks/{continuedev-installer-V4F2FIZP.js → continuedev-installer-UAPWX6OA.js} +2 -2
- package/dist/cli/chunks/{copilot-installer-JMICURQB.js → copilot-installer-BJN2YJGI.js} +2 -2
- package/dist/cli/chunks/core-handlers-HING5RRG.js +2 -0
- package/dist/cli/chunks/{cost-tracker-5OFHEYFJ.js → cost-tracker-MHP2VJ63.js} +2 -2
- package/dist/cli/chunks/{coverage-QKN57JDS.js → coverage-PQB4IEFG.js} +3 -3
- package/dist/cli/chunks/cross-domain-router-PQTD6AZN.js +2 -0
- package/dist/cli/chunks/{cursor-installer-GBJ7YXSM.js → cursor-installer-ZXBWYAS3.js} +2 -2
- package/dist/cli/chunks/{daemon-GKP7CMEK.js → daemon-64C7R6OJ.js} +3 -3
- package/dist/cli/chunks/{daemon-IAVSO6HK.js → daemon-N2BEGEFY.js} +4 -4
- package/dist/cli/chunks/{dag-attention-scheduler-S225TCI7.js → dag-attention-scheduler-SPZDAPNL.js} +2 -2
- package/dist/cli/chunks/{detect-IUYH422U.js → detect-LXJBSSZW.js} +2 -2
- package/dist/cli/chunks/{dist-node-2YRE6A7C.js → dist-node-U3TKZ2IZ.js} +2 -2
- package/dist/cli/chunks/{domain-handler-PL2TZC6H.js → domain-handler-3DDWUVSR.js} +2 -2
- package/dist/cli/chunks/{domain-plugins-HCGLXKIT.js → domain-plugins-JJVWI4OQ.js} +2 -2
- package/dist/cli/chunks/domain-transfer-M36KUJ2U.js +2 -0
- package/dist/cli/chunks/dream-WUGRSNCV.js +2 -0
- package/dist/cli/chunks/embed-and-insert-pattern-JPAR7TXX.js +3 -0
- package/dist/cli/chunks/{eval-WCK7KNFN.js → eval-SOLG23EA.js} +2 -2
- package/dist/cli/chunks/{experience-capture-middleware-2MSQWSAR.js → experience-capture-middleware-T7G2VOOD.js} +4 -4
- package/dist/cli/chunks/{fast-paths-VYOSIBKF.js → fast-paths-32N3ELI4.js} +2 -2
- package/dist/cli/chunks/{feature-flags-WCFUKHNQ.js → feature-flags-APJDQ4N7.js} +2 -2
- package/dist/cli/chunks/{feature-flags-UJRHFBRX.js → feature-flags-NAHKLDRN.js} +2 -2
- package/dist/cli/chunks/{file-discovery-JDGL4ZWS.js → file-discovery-YKVM3MDB.js} +2 -2
- package/dist/cli/chunks/{fleet-ROXVMZ2F.js → fleet-55M5CJS4.js} +3 -3
- package/dist/cli/chunks/{gnn-wrapper-NIO4ZCO3.js → gnn-wrapper-UD6E6S6Z.js} +2 -2
- package/dist/cli/chunks/{heartbeat-handler-PI42WD3C.js → heartbeat-handler-OYVW3VSC.js} +4 -4
- package/dist/cli/chunks/heartbeat-scheduler-33XX5XNQ.js +2 -0
- package/dist/cli/chunks/hnsw-adapter-XQPERX3H.js +2 -0
- package/dist/cli/chunks/hnsw-index-2GNXTWHH.js +2 -0
- package/dist/cli/chunks/{hnsw-legacy-bridge-YLC7SPK2.js → hnsw-legacy-bridge-HBYIS3ZW.js} +2 -2
- package/dist/cli/chunks/{hnswlib-node-LG6OS3B7.js → hnswlib-node-EQPM42OU.js} +2 -2
- package/dist/cli/chunks/{hooks-WVALP5GX.js → hooks-5ZSSJWO6.js} +10 -10
- package/dist/cli/chunks/hybrid-backend-CCF7URKI.js +2 -0
- package/dist/cli/chunks/{hypergraph-engine-GJEMW3EG.js → hypergraph-engine-XBGVQ4PD.js} +2 -2
- package/dist/cli/chunks/{hypergraph-handler-BLF6LXEV.js → hypergraph-handler-CAWAQ673.js} +3 -3
- package/dist/cli/chunks/impact-analyzer-HGKAZWIG.js +2 -0
- package/dist/cli/chunks/{init-handler-K25RWRYY.js → init-handler-PRHXSARK.js} +6 -6
- package/dist/cli/chunks/init-wizard-72MFBI3G.js +2 -0
- package/dist/cli/chunks/kernel-BRCBVMSK.js +2 -0
- package/dist/cli/chunks/{kilocode-installer-BXN6WZ7G.js → kilocode-installer-F7LXBM7I.js} +2 -2
- package/dist/cli/chunks/{kiro-installer-PM362DLN.js → kiro-installer-NM723ZRG.js} +2 -2
- package/dist/cli/chunks/knowledge-graph-DG44IPEI.js +2 -0
- package/dist/cli/chunks/{learning-CPERDDRG.js → learning-5QYIDHH3.js} +3 -3
- package/dist/cli/chunks/{llm-router-GOAV5FPI.js → llm-router-43HKWPSX.js} +4 -4
- package/dist/cli/chunks/llm-router-service-24KXFX32.js +2 -0
- package/dist/cli/chunks/{load-2BG6SHAK.js → load-5YDBWSCS.js} +2 -2
- package/dist/cli/chunks/load-test-N4TAYJY3.js +2 -0
- package/dist/cli/chunks/mcp-UMAPMNMY.js +2 -0
- package/dist/cli/chunks/{memory-4NHBYT6S.js → memory-FWCPCQFP.js} +6 -6
- package/dist/cli/chunks/memory-backend-NVYFYVAU.js +2 -0
- package/dist/cli/chunks/memory-handlers-UTWCNCHL.js +2 -0
- package/dist/cli/chunks/multi-model-executor-2XTBGLE4.js +14 -0
- package/dist/cli/chunks/{opencode-installer-ATZLLK74.js → opencode-installer-GIXOJ6NS.js} +2 -2
- package/dist/cli/chunks/orchestrator-VW6BKHLI.js +393 -0
- package/dist/cli/chunks/pattern-null-store-SBPNYDBR.js +2 -0
- package/dist/cli/chunks/{pattern-usage-recorder-7VE4XDAI.js → pattern-usage-recorder-7CEUC3J7.js} +2 -2
- package/dist/cli/chunks/{pipeline-LQZSNDD2.js → pipeline-IGUQPPPO.js} +2 -2
- package/dist/cli/chunks/platform-2P636I7B.js +2 -0
- package/dist/cli/chunks/{plugin-EJ6K2MGU.js → plugin-NY6SWDPE.js} +2 -2
- package/dist/cli/chunks/{prime-radiant-advanced-wasm-OIHTKJMN.js → prime-radiant-advanced-wasm-2UUDTIO2.js} +2 -2
- package/dist/cli/chunks/project-root-IOISG5KX.js +2 -0
- package/dist/cli/chunks/protocol-executor-IBYEII5Q.js +2 -0
- package/dist/cli/chunks/{protocol-handler-NRBROAU7.js → protocol-handler-ZTPCRQ5W.js} +2 -2
- package/dist/cli/chunks/{prove-EJOGEGD3.js → prove-SQX5A3IG.js} +2 -2
- package/dist/cli/chunks/qe-reasoning-bank-7IETWW6W.js +2 -0
- package/dist/cli/chunks/{quality-E55UC73D.js → quality-DROILKRY.js} +2 -2
- package/dist/cli/chunks/{quality-gate-OIQATNT3.js → quality-gate-PWKWDJY2.js} +3 -3
- package/dist/cli/chunks/queen-coordinator-NHUK2MWJ.js +2 -0
- package/dist/cli/chunks/real-embeddings-P5U3MGYC.js +2 -0
- package/dist/cli/chunks/{ref-validation-OPO6J7OL.js → ref-validation-KY73NQXD.js} +2 -2
- package/dist/cli/chunks/{roocode-installer-ODY5KRWU.js → roocode-installer-6JPPRB3W.js} +2 -2
- package/dist/cli/chunks/router-SRSO3IHF.js +2 -0
- package/dist/cli/chunks/routing-feedback-PASRE5HY.js +2 -0
- package/dist/cli/chunks/{routing-handler-KQM6VWLC.js → routing-handler-VTJIVFUO.js} +2 -2
- package/dist/cli/chunks/{ruvector-commands-U2GVV6PF.js → ruvector-commands-C6RPSJJO.js} +2 -2
- package/dist/cli/chunks/rvf-dual-writer-4M4J67OU.js +2 -0
- package/dist/cli/chunks/rvf-migration-adapter-TSXGT5LF.js +2 -0
- package/dist/cli/chunks/rvf-migration-coordinator-R53URRIO.js +2 -0
- package/dist/cli/chunks/rvf-native-adapter-MOF3E7BR.js +2 -0
- package/dist/cli/chunks/{rvf-store-integrity-KMIHD3LP.js → rvf-store-integrity-MMXN5TEJ.js} +2 -2
- package/dist/cli/chunks/safe-db-QJLFO33B.js +2 -0
- package/dist/cli/chunks/schedule-YIVXW5O2.js +2 -0
- package/dist/cli/chunks/scheduler-AON7DWSJ.js +2 -0
- package/dist/cli/chunks/{security-P5NM353C.js → security-3B3R2NL4.js} +3 -3
- package/dist/cli/chunks/shared-rvf-adapter-VIJB7JUS.js +2 -0
- package/dist/cli/chunks/{shared-rvf-dual-writer-2CSG7C4W.js → shared-rvf-dual-writer-UVWGDUWC.js} +2 -2
- package/dist/cli/chunks/sqlite-persistence-75VHKKQB.js +2 -0
- package/dist/cli/chunks/standalone-memory-M4LWAAYZ.js +2 -0
- package/dist/cli/chunks/{status-handler-6TU6O37R.js → status-handler-YYFV6OZL.js} +2 -2
- package/dist/cli/chunks/{structural-health-KBIJSTXJ.js → structural-health-27E6LLKB.js} +2 -2
- package/dist/cli/chunks/sync-26CEGSTC.js +2 -0
- package/dist/cli/chunks/{sync-LNHI5SB7.js → sync-J3LJ56WN.js} +2 -2
- package/dist/cli/chunks/task-handler-4MCEBQZL.js +54 -0
- package/dist/cli/chunks/task-handlers-GYBAWKE2.js +9 -0
- package/dist/cli/chunks/{test-DHAAI3DU.js → test-MPC5HRH5.js} +4 -4
- package/dist/cli/chunks/{test-scheduling-XDBZ3QC2.js → test-scheduling-ZJBFRZ3J.js} +3 -3
- package/dist/cli/chunks/token-bootstrap-2Y2XITBX.js +2 -0
- package/dist/cli/chunks/{token-usage-Q2YG5YQN.js → token-usage-3X5WMTG2.js} +2 -2
- package/dist/cli/chunks/{transformers-F5UQTQCY.js → transformers-MVL4C5IX.js} +2 -2
- package/dist/cli/chunks/tree-sitter-wasm-parser-SLW65ZFO.js +2 -0
- package/dist/cli/chunks/{types-JQ7EQO5Q.js → types-TG5P3CRS.js} +2 -2
- package/dist/cli/chunks/unified-memory-UCQ6AB32.js +2 -0
- package/dist/cli/chunks/unified-memory-hnsw-IXYUMKRR.js +2 -0
- package/dist/cli/chunks/unified-persistence-7E6JQ4FZ.js +2 -0
- package/dist/cli/chunks/{upgrade-TJRVGHGD.js → upgrade-ETBHDEPY.js} +2 -2
- package/dist/cli/chunks/{validate-BWPCVHBN.js → validate-C2A73LZK.js} +2 -2
- package/dist/cli/chunks/{validate-swarm-QVVKCQLP.js → validate-swarm-67XN42ML.js} +2 -2
- package/dist/cli/chunks/{vibium-ZFATIWHO.js → vibium-NILGKHLN.js} +2 -2
- package/dist/cli/chunks/visual-security-4VZXPEVG.js +2 -0
- package/dist/cli/chunks/{web-tree-sitter-KPLY7ONR.js → web-tree-sitter-USJN77P4.js} +2 -2
- package/dist/cli/chunks/{windsurf-installer-H7XM7ISA.js → windsurf-installer-5GGZXGJW.js} +2 -2
- package/dist/cli/chunks/witness-chain-IWS5ZHHL.js +2 -0
- package/dist/cli/chunks/witness-chain-JQA2VPZI.js +2 -0
- package/dist/cli/chunks/witness-chain-repair-4UA7IPS3.js +2 -0
- package/dist/cli/chunks/witness-chain-verifier-3GEADWPE.js +2 -0
- package/dist/cli/chunks/{witness-key-manager-DFRL42GE.js → witness-key-manager-ZWEIK3VJ.js} +2 -2
- package/dist/cli/chunks/{workflow-2ZQO6WYI.js → workflow-KHMVVBBA.js} +4 -4
- package/dist/cli/chunks/workflow-orchestrator-GI5NQH7C.js +2 -0
- package/dist/cli/chunks/wrappers-N6XIK5PT.js +2 -0
- package/dist/cli/commands/audit.d.ts +20 -2
- package/dist/cli/commands/audit.js +158 -16
- package/dist/cli/commands/claude-flow-setup.js +5 -4
- package/dist/cli/commands/mcp.js +6 -0
- package/dist/cli/commands/memory.d.ts +1 -1
- package/dist/cli/commands/memory.js +8 -8
- package/dist/cli/commands/platform.js +15 -2
- package/dist/cli/commands/upgrade.d.ts +3 -3
- package/dist/cli/commands/upgrade.js +3 -3
- package/dist/cli/handlers/init-handler.d.ts +10 -0
- package/dist/cli/handlers/task-handler.js +24 -3
- package/dist/cli/helpers/standalone-memory.d.ts +12 -0
- package/dist/cli/helpers/standalone-memory.js +46 -0
- package/dist/cli/index.js +39 -42
- package/dist/cli/log-gate.d.ts +66 -0
- package/dist/cli/log-gate.js +170 -0
- package/dist/init/agents-installer.d.ts +4 -0
- package/dist/init/agents-installer.js +24 -11
- package/dist/init/codex-installer.js +22 -8
- package/dist/init/idempotent-write.d.ts +53 -0
- package/dist/init/idempotent-write.js +160 -0
- package/dist/init/orchestrator.js +1 -0
- package/dist/init/phases/05-learning.js +3 -1
- package/dist/init/phases/07-hooks.js +32 -16
- package/dist/init/phases/08-mcp.js +4 -2
- package/dist/init/phases/09-assets.d.ts +10 -0
- package/dist/init/phases/09-assets.js +3 -0
- package/dist/init/phases/10-workers.js +7 -5
- package/dist/init/phases/12-verification.js +7 -2
- package/dist/init/project-analyzer.d.ts +9 -0
- package/dist/init/project-analyzer.js +20 -1
- package/dist/init/self-configurator.d.ts +5 -3
- package/dist/init/self-configurator.js +18 -29
- package/dist/init/skills-installer.js +4 -2
- package/dist/init/token-bootstrap.d.ts +1 -1
- package/dist/init/token-bootstrap.js +12 -2
- package/dist/init/types.d.ts +16 -0
- package/dist/init/types.js +20 -24
- package/dist/integrations/coherence/coherence-service.js +84 -24
- package/dist/integrations/coherence/vote-tally.d.ts +38 -0
- package/dist/integrations/coherence/vote-tally.js +39 -0
- package/dist/integrations/ruvector/brain-exporter.js +17 -0
- package/dist/integrations/ruvector/brain-import-audit.d.ts +20 -0
- package/dist/integrations/ruvector/brain-import-audit.js +22 -0
- package/dist/integrations/ruvector/brain-rvf-exporter.js +16 -0
- package/dist/integrations/ruvector/brain-shared.js +1 -1
- package/dist/integrations/ruvector/rvf-dual-writer.js +6 -1
- package/dist/integrations/ruvector/shared-rvf-adapter.d.ts +23 -0
- package/dist/integrations/ruvector/shared-rvf-adapter.js +24 -0
- package/dist/kernel/hybrid-backend.d.ts +6 -0
- package/dist/kernel/hybrid-backend.js +18 -0
- package/dist/kernel/kernel.js +12 -16
- package/dist/kernel/project-root.d.ts +1 -1
- package/dist/kernel/project-root.js +24 -3
- package/dist/learning/embedder-identity-store.js +4 -3
- package/dist/learning/pattern-store.d.ts +11 -0
- package/dist/learning/pattern-store.js +31 -9
- package/dist/learning/qe-patterns.d.ts +6 -0
- package/dist/learning/qe-patterns.js +7 -1
- package/dist/learning/qe-reasoning-bank.js +3 -0
- package/dist/learning/real-embeddings.d.ts +8 -0
- package/dist/learning/real-embeddings.js +16 -0
- package/dist/learning/rvf-pattern-store.js +30 -10
- package/dist/learning/sqlite-persistence.d.ts +8 -1
- package/dist/learning/sqlite-persistence.js +49 -9
- package/dist/logging/console-logger.d.ts +2 -5
- package/dist/logging/console-logger.js +10 -46
- package/dist/logging/index.d.ts +2 -0
- package/dist/logging/index.js +1 -0
- package/dist/logging/redaction.d.ts +27 -0
- package/dist/logging/redaction.js +170 -0
- package/dist/mcp/bundle.js +463 -449
- package/dist/mcp/entry.js +2 -0
- package/dist/mcp/handlers/core-handlers.js +5 -4
- package/dist/mcp/handlers/memory-handlers.d.ts +6 -1
- package/dist/mcp/handlers/memory-handlers.js +44 -22
- package/dist/mcp/handlers/task-handlers.js +14 -1
- package/dist/mcp/protocol-server.js +3 -1
- package/dist/mcp/services/session-store.js +5 -1
- package/dist/mcp/tools/base.d.ts +9 -2
- package/dist/mcp/tools/base.js +7 -0
- package/dist/mcp/tools/coherence/consensus.js +51 -2
- package/dist/mcp/tools/planning/goap-plan.d.ts +20 -7
- package/dist/mcp/tools/planning/goap-plan.js +92 -20
- package/dist/mcp/tools/planning/goap-status.d.ts +37 -12
- package/dist/mcp/tools/planning/goap-status.js +52 -23
- package/dist/mcp/tools/planning/world-state.d.ts +101 -0
- package/dist/mcp/tools/planning/world-state.js +274 -0
- package/dist/mcp/types.d.ts +4 -2
- package/dist/planning/goap-planner.d.ts +60 -4
- package/dist/planning/goap-planner.js +218 -60
- package/dist/planning/index.d.ts +1 -1
- package/dist/planning/index.js +1 -1
- package/dist/planning/plan-executor.d.ts +20 -1
- package/dist/planning/plan-executor.js +209 -100
- package/dist/planning/types.d.ts +16 -0
- package/dist/planning/types.js +17 -0
- package/dist/plugins/cache.d.ts +2 -0
- package/dist/plugins/cache.js +15 -2
- package/dist/plugins/lifecycle.js +15 -2
- package/dist/plugins/manifest.js +7 -5
- package/dist/plugins/resolver.d.ts +13 -22
- package/dist/plugins/resolver.js +169 -61
- package/dist/plugins/version-policy.d.ts +13 -0
- package/dist/plugins/version-policy.js +18 -0
- package/dist/shared/types/index.d.ts +6 -0
- package/dist/shared/types/index.js +8 -0
- package/package.json +2 -1
- package/dist/cli/chunks/adapter-TNNNJRDG.js +0 -2
- package/dist/cli/chunks/agent-booster-wasm-5PC7D2FW.js +0 -2
- package/dist/cli/chunks/aqe-learning-engine-5ZRMYJLB.js +0 -2
- package/dist/cli/chunks/audit-YSGA7UWT.js +0 -3
- package/dist/cli/chunks/base-KWZHOPSH.js +0 -2
- package/dist/cli/chunks/brain-handler-ET6YAP4B.js +0 -90
- package/dist/cli/chunks/browser-workflow-2FZTKDUL.js +0 -2
- package/dist/cli/chunks/chunk-33YYYWBQ.js +0 -4
- package/dist/cli/chunks/chunk-5Z6XZV7K.js +0 -65
- package/dist/cli/chunks/chunk-6J62K3SW.js +0 -2
- package/dist/cli/chunks/chunk-6TPKK7LD.js +0 -15
- package/dist/cli/chunks/chunk-DEYLEDJN.js +0 -27
- package/dist/cli/chunks/chunk-J6GNQS62.js +0 -5
- package/dist/cli/chunks/chunk-KGT36Z42.js +0 -14
- package/dist/cli/chunks/chunk-NA7B2QYB.js +0 -2
- package/dist/cli/chunks/chunk-NDPFGIMJ.js +0 -13
- package/dist/cli/chunks/chunk-OBAP2TXZ.js +0 -2
- package/dist/cli/chunks/chunk-PEPFCPES.js +0 -2
- package/dist/cli/chunks/chunk-T6BVLVI5.js +0 -2
- package/dist/cli/chunks/chunk-TT23RRB7.js +0 -2
- package/dist/cli/chunks/chunk-XC7DYDSY.js +0 -180
- package/dist/cli/chunks/chunk-XWMZ6D6N.js +0 -2
- package/dist/cli/chunks/chunk-Y3MW3YBC.js +0 -3
- package/dist/cli/chunks/claude-flow-setup-6JKMBPGU.js +0 -2
- package/dist/cli/chunks/client-7E4LM2WW.js +0 -2
- package/dist/cli/chunks/codex-installer-CQ24DTP5.js +0 -14
- package/dist/cli/chunks/core-handlers-IFG3757P.js +0 -2
- package/dist/cli/chunks/cross-domain-router-EK7W4PGP.js +0 -2
- package/dist/cli/chunks/domain-transfer-KQJRUPXA.js +0 -2
- package/dist/cli/chunks/dream-NFSCSLY7.js +0 -2
- package/dist/cli/chunks/embed-and-insert-pattern-ZPAG7235.js +0 -3
- package/dist/cli/chunks/heartbeat-scheduler-ZATCDJDK.js +0 -2
- package/dist/cli/chunks/hnsw-adapter-WXQABRCA.js +0 -2
- package/dist/cli/chunks/hnsw-index-TPSWLEA5.js +0 -2
- package/dist/cli/chunks/impact-analyzer-HNIU45P5.js +0 -2
- package/dist/cli/chunks/init-wizard-JUIPBMHG.js +0 -2
- package/dist/cli/chunks/kernel-5BOZQ754.js +0 -2
- package/dist/cli/chunks/knowledge-graph-EWDAENWM.js +0 -2
- package/dist/cli/chunks/llm-router-service-3YT7JGBS.js +0 -2
- package/dist/cli/chunks/load-test-BP2CPLIV.js +0 -2
- package/dist/cli/chunks/mcp-5TTB37DC.js +0 -2
- package/dist/cli/chunks/memory-backend-4PYQBPRM.js +0 -2
- package/dist/cli/chunks/memory-handlers-2B27NITS.js +0 -2
- package/dist/cli/chunks/multi-model-executor-KCWSGCDT.js +0 -14
- package/dist/cli/chunks/orchestrator-RKB7XJRG.js +0 -393
- package/dist/cli/chunks/pattern-null-store-OYOQOV2O.js +0 -2
- package/dist/cli/chunks/platform-OD5H5U6G.js +0 -2
- package/dist/cli/chunks/protocol-executor-3ATJTXWG.js +0 -2
- package/dist/cli/chunks/qe-reasoning-bank-LLMYZT4X.js +0 -2
- package/dist/cli/chunks/queen-coordinator-RN7L6KG5.js +0 -2
- package/dist/cli/chunks/real-embeddings-FPFFNOSZ.js +0 -2
- package/dist/cli/chunks/router-MDHITQ2V.js +0 -2
- package/dist/cli/chunks/routing-feedback-5XLNJ3Y3.js +0 -2
- package/dist/cli/chunks/rvf-dual-writer-JBW4O3II.js +0 -2
- package/dist/cli/chunks/rvf-migration-adapter-BPPQL4XJ.js +0 -2
- package/dist/cli/chunks/rvf-migration-coordinator-V2GHCJKN.js +0 -2
- package/dist/cli/chunks/rvf-native-adapter-S4562CG5.js +0 -2
- package/dist/cli/chunks/safe-db-FIRHSXVF.js +0 -2
- package/dist/cli/chunks/schedule-RVXFB4HK.js +0 -2
- package/dist/cli/chunks/scheduler-IKKAMAOO.js +0 -2
- package/dist/cli/chunks/shared-rvf-adapter-LVIUOO4S.js +0 -2
- package/dist/cli/chunks/sqlite-persistence-SQ3HCUQ7.js +0 -2
- package/dist/cli/chunks/sync-UHOX6RJW.js +0 -2
- package/dist/cli/chunks/task-handler-AVDHMLGI.js +0 -49
- package/dist/cli/chunks/task-handlers-KYK4VTRA.js +0 -9
- package/dist/cli/chunks/token-bootstrap-GUTTLPZX.js +0 -2
- package/dist/cli/chunks/tree-sitter-wasm-parser-DEGOHS6F.js +0 -2
- package/dist/cli/chunks/unified-memory-CXHLHB5I.js +0 -2
- package/dist/cli/chunks/unified-memory-hnsw-I7WAE54M.js +0 -2
- package/dist/cli/chunks/unified-persistence-6CPF65WI.js +0 -2
- package/dist/cli/chunks/visual-security-GNPHME5H.js +0 -2
- package/dist/cli/chunks/witness-chain-RRN6NDCH.js +0 -2
- package/dist/cli/chunks/witness-chain-VT4UHHBR.js +0 -2
- package/dist/cli/chunks/workflow-orchestrator-DB3HIECD.js +0 -2
- package/dist/cli/chunks/wrappers-SUS6XEJD.js +0 -2
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Idempotent file writers for `aqe init` (#778).
|
|
3
|
+
*
|
|
4
|
+
* A repeat `aqe init` on an unchanged project must be a byte-stable
|
|
5
|
+
* convergence step: files whose content would not change are left alone (no
|
|
6
|
+
* rewrite, so the mtime is preserved too), and volatile fields such as
|
|
7
|
+
* generation timestamps are carried over from the existing file unless
|
|
8
|
+
* something else in that file actually changed.
|
|
9
|
+
*/
|
|
10
|
+
import { copyFileSync, existsSync, readFileSync, writeFileSync } from 'fs';
|
|
11
|
+
import { safeJsonParse } from '../shared/safe-json.js';
|
|
12
|
+
/**
|
|
13
|
+
* Write `content` to `path` only when the bytes on disk differ.
|
|
14
|
+
* @returns true when the file was written.
|
|
15
|
+
*/
|
|
16
|
+
export function writeFileIfChanged(path, content) {
|
|
17
|
+
const next = typeof content === 'string' ? Buffer.from(content, 'utf-8') : content;
|
|
18
|
+
try {
|
|
19
|
+
if (existsSync(path) && readFileSync(path).equals(next))
|
|
20
|
+
return false;
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
// Unreadable target — fall through and (re)write it.
|
|
24
|
+
}
|
|
25
|
+
if (typeof content === 'string')
|
|
26
|
+
writeFileSync(path, content, 'utf-8');
|
|
27
|
+
else
|
|
28
|
+
writeFileSync(path, content);
|
|
29
|
+
return true;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Copy `src` to `dest` only when `dest` is missing or its bytes differ.
|
|
33
|
+
* Uses copyFileSync for the actual copy so file-mode semantics are unchanged.
|
|
34
|
+
* @returns true when the file was copied.
|
|
35
|
+
*/
|
|
36
|
+
export function copyFileIfChanged(src, dest) {
|
|
37
|
+
try {
|
|
38
|
+
if (existsSync(dest) && readFileSync(dest).equals(readFileSync(src)))
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
// Unreadable target — fall through and copy.
|
|
43
|
+
}
|
|
44
|
+
copyFileSync(src, dest);
|
|
45
|
+
return true;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Write a text file whose content embeds a volatile line (e.g. a generation
|
|
49
|
+
* timestamp). When the existing file matches `content` on every line except
|
|
50
|
+
* the lines matching `volatileLine`, the file is left untouched.
|
|
51
|
+
* @returns true when the file was written.
|
|
52
|
+
*/
|
|
53
|
+
export function writeTextIfChangedIgnoring(path, content, volatileLine) {
|
|
54
|
+
try {
|
|
55
|
+
if (existsSync(path)) {
|
|
56
|
+
const strip = (text) => text.split('\n').filter((line) => !volatileLine.test(line)).join('\n');
|
|
57
|
+
if (strip(readFileSync(path, 'utf-8')) === strip(content))
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
// Unreadable target — fall through and write.
|
|
63
|
+
}
|
|
64
|
+
writeFileSync(path, content, 'utf-8');
|
|
65
|
+
return true;
|
|
66
|
+
}
|
|
67
|
+
/** The `*Generated by AQE v3 init on <ISO>*` footer of generated index docs. */
|
|
68
|
+
export const GENERATED_ON_LINE = /^\*Generated by AQE v3 init on [^*]+\*$/;
|
|
69
|
+
function isPlainObject(value) {
|
|
70
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
71
|
+
}
|
|
72
|
+
/** JSON serialization with object keys sorted, for order-insensitive comparison. */
|
|
73
|
+
export function canonicalJson(value) {
|
|
74
|
+
return JSON.stringify(value, (_key, v) => {
|
|
75
|
+
if (!isPlainObject(v))
|
|
76
|
+
return v;
|
|
77
|
+
const sorted = {};
|
|
78
|
+
for (const k of Object.keys(v).sort())
|
|
79
|
+
sorted[k] = v[k];
|
|
80
|
+
return sorted;
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
/** Deep structural equality of two JSON values, ignoring object key order. */
|
|
84
|
+
export function jsonEquivalent(a, b) {
|
|
85
|
+
return canonicalJson(a) === canonicalJson(b);
|
|
86
|
+
}
|
|
87
|
+
function getPath(obj, path) {
|
|
88
|
+
let cur = obj;
|
|
89
|
+
for (const key of path) {
|
|
90
|
+
if (!isPlainObject(cur))
|
|
91
|
+
return undefined;
|
|
92
|
+
cur = cur[key];
|
|
93
|
+
}
|
|
94
|
+
return cur;
|
|
95
|
+
}
|
|
96
|
+
function setPath(obj, path, value) {
|
|
97
|
+
let cur = obj;
|
|
98
|
+
for (const key of path.slice(0, -1)) {
|
|
99
|
+
if (!isPlainObject(cur[key]))
|
|
100
|
+
return;
|
|
101
|
+
cur = cur[key];
|
|
102
|
+
}
|
|
103
|
+
const last = path[path.length - 1];
|
|
104
|
+
if (last in cur)
|
|
105
|
+
cur[last] = value;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Carry volatile fields (timestamps) over from `previous` into `next` when
|
|
109
|
+
* `next` is otherwise identical to `previous`.
|
|
110
|
+
*
|
|
111
|
+
* - Unchanged (apart from the volatile fields): `next` is mutated to hold the
|
|
112
|
+
* previous values and `false` is returned — the caller should not write.
|
|
113
|
+
* - Changed, or no previous document: `next` keeps its fresh values and
|
|
114
|
+
* `true` is returned — the caller should write.
|
|
115
|
+
*/
|
|
116
|
+
export function stabilizeVolatileFields(previous, next, volatilePaths) {
|
|
117
|
+
if (!isPlainObject(previous))
|
|
118
|
+
return true;
|
|
119
|
+
const candidate = JSON.parse(JSON.stringify(next));
|
|
120
|
+
for (const path of volatilePaths) {
|
|
121
|
+
const prevValue = getPath(previous, path);
|
|
122
|
+
if (prevValue !== undefined && getPath(candidate, path) !== undefined) {
|
|
123
|
+
setPath(candidate, path, prevValue);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
if (!jsonEquivalent(previous, candidate))
|
|
127
|
+
return true;
|
|
128
|
+
for (const path of volatilePaths) {
|
|
129
|
+
const prevValue = getPath(previous, path);
|
|
130
|
+
if (prevValue !== undefined && getPath(next, path) !== undefined)
|
|
131
|
+
setPath(next, path, prevValue);
|
|
132
|
+
}
|
|
133
|
+
return false;
|
|
134
|
+
}
|
|
135
|
+
/** Read and parse a JSON file, or return undefined when missing/unparseable. */
|
|
136
|
+
export function readJsonIfPresent(path) {
|
|
137
|
+
if (!existsSync(path))
|
|
138
|
+
return undefined;
|
|
139
|
+
try {
|
|
140
|
+
return safeJsonParse(readFileSync(path, 'utf-8'));
|
|
141
|
+
}
|
|
142
|
+
catch {
|
|
143
|
+
return undefined;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Write a generated JSON document (2-space indent) unless it is equivalent to
|
|
148
|
+
* the one already on disk, preserving the existing values of `volatilePaths`
|
|
149
|
+
* (e.g. `[['createdAt']]`) when nothing else changed.
|
|
150
|
+
* @returns true when the file was written.
|
|
151
|
+
*/
|
|
152
|
+
export function writeJsonIfChanged(path, doc, volatilePaths = []) {
|
|
153
|
+
const previous = readJsonIfPresent(path);
|
|
154
|
+
if (previous !== undefined && !stabilizeVolatileFields(previous, doc, volatilePaths)) {
|
|
155
|
+
return false;
|
|
156
|
+
}
|
|
157
|
+
writeFileSync(path, JSON.stringify(doc, null, 2), 'utf-8');
|
|
158
|
+
return true;
|
|
159
|
+
}
|
|
160
|
+
//# sourceMappingURL=idempotent-write.js.map
|
|
@@ -158,6 +158,7 @@ export class ModularInitOrchestrator {
|
|
|
158
158
|
claudeMdGenerated: claudeMdResult?.data?.generated ?? false,
|
|
159
159
|
workersStarted: workersResult?.data?.workersConfigured ?? 0,
|
|
160
160
|
codexGuidance: assetsResult?.data?.codexGuidance,
|
|
161
|
+
codexComponents: assetsResult?.data?.codexComponents,
|
|
161
162
|
},
|
|
162
163
|
totalDurationMs: Date.now() - startTime,
|
|
163
164
|
timestamp: new Date(),
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
* Initializes the learning system with HNSW index and pattern storage
|
|
4
4
|
*/
|
|
5
5
|
import { existsSync, mkdirSync, writeFileSync } from 'fs';
|
|
6
|
+
import { writeJsonIfChanged } from '../idempotent-write.js';
|
|
6
7
|
import { join } from 'path';
|
|
7
8
|
import { BasePhase, } from './phase-interface.js';
|
|
8
9
|
import { getAQEVersion } from '../types.js';
|
|
@@ -54,7 +55,8 @@ export class LearningPhase extends BasePhase {
|
|
|
54
55
|
hnswIndexPath: join(hnswDir, 'index.bin'),
|
|
55
56
|
initialized: new Date().toISOString(),
|
|
56
57
|
};
|
|
57
|
-
|
|
58
|
+
// #778: leave an equivalent file (and its `initialized` stamp) untouched.
|
|
59
|
+
writeJsonIfChanged(learningConfigPath, learningConfig, [['initialized']]);
|
|
58
60
|
// Load pre-trained patterns if available and not skipped
|
|
59
61
|
let patternsLoaded = 0;
|
|
60
62
|
if (config.learning.pretrainedPatterns && !options.skipPatterns) {
|
|
@@ -14,7 +14,10 @@ import { safeJsonParse } from '../../shared/safe-json.js';
|
|
|
14
14
|
const __filename = fileURLToPath(import.meta.url);
|
|
15
15
|
const __dirname = dirname(__filename);
|
|
16
16
|
import { isAqeHookEntry, mergeHooksSmart, generateAqeEnvVars, generateV3SettingsSections, applyV3Sections, mergeAqeEnv, backupSettingsFile, } from '../settings-merge.js';
|
|
17
|
+
import { copyFileIfChanged, stabilizeVolatileFields } from '../idempotent-write.js';
|
|
17
18
|
import { BasePhase, } from './phase-interface.js';
|
|
19
|
+
/** settings.json fields that change on every run without a real change (#778). */
|
|
20
|
+
const SETTINGS_VOLATILE_FIELDS = [['aqe', 'initialized']];
|
|
18
21
|
/**
|
|
19
22
|
* Hooks phase - configures Claude Code hooks
|
|
20
23
|
*/
|
|
@@ -53,13 +56,16 @@ export class HooksPhase extends BasePhase {
|
|
|
53
56
|
if (!existsSync(hooksDir)) {
|
|
54
57
|
mkdirSync(hooksDir, { recursive: true });
|
|
55
58
|
}
|
|
56
|
-
// Load existing settings
|
|
59
|
+
// Load existing settings. `previousSettings` is an untouched parse used to
|
|
60
|
+
// decide whether this run changes anything (#778); `settings` is mutated.
|
|
57
61
|
const settingsPath = join(claudeDir, 'settings.json');
|
|
58
62
|
let settings = {};
|
|
63
|
+
let previousSettings;
|
|
59
64
|
if (existsSync(settingsPath)) {
|
|
60
65
|
try {
|
|
61
66
|
const content = readFileSync(settingsPath, 'utf-8');
|
|
62
67
|
settings = safeJsonParse(content);
|
|
68
|
+
previousSettings = safeJsonParse(content);
|
|
63
69
|
}
|
|
64
70
|
catch {
|
|
65
71
|
settings = {};
|
|
@@ -98,13 +104,23 @@ export class HooksPhase extends BasePhase {
|
|
|
98
104
|
existingMcp.push('agentic-qe');
|
|
99
105
|
}
|
|
100
106
|
settings.enabledMcpjsonServers = existingMcp;
|
|
101
|
-
//
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
107
|
+
// Converge instead of rewriting (#778): keep the original `aqe.initialized`
|
|
108
|
+
// stamp and skip the write (and the backup) entirely when the merged
|
|
109
|
+
// settings are equivalent to what is already on disk. Any real change —
|
|
110
|
+
// a version upgrade, a restored AQE hook, a new flag — still writes, and
|
|
111
|
+
// then records a fresh initialization timestamp.
|
|
112
|
+
const settingsChanged = stabilizeVolatileFields(previousSettings, settings, SETTINGS_VOLATILE_FIELDS);
|
|
113
|
+
if (settingsChanged) {
|
|
114
|
+
// Back up the pristine original settings.json before writing (like CLAUDE.md)
|
|
115
|
+
const backupPath = backupSettingsFile(settingsPath);
|
|
116
|
+
if (backupPath) {
|
|
117
|
+
context.services.log(` Backup created: ${backupPath}`);
|
|
118
|
+
}
|
|
119
|
+
writeFileSync(settingsPath, JSON.stringify(settings, null, 2), 'utf-8');
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
context.services.log(' Settings unchanged — .claude/settings.json left as-is');
|
|
105
123
|
}
|
|
106
|
-
// Write settings
|
|
107
|
-
writeFileSync(settingsPath, JSON.stringify(settings, null, 2), 'utf-8');
|
|
108
124
|
// Write README and install hook assets (bridge script, cross-phase memory)
|
|
109
125
|
this.writeHooksReadme(hooksDir, hookTypes);
|
|
110
126
|
this.installHookAssets(hooksDir, context);
|
|
@@ -250,9 +266,9 @@ export class HooksPhase extends BasePhase {
|
|
|
250
266
|
];
|
|
251
267
|
for (const src of sourcePaths) {
|
|
252
268
|
if (existsSync(src) && src !== destPath) {
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
269
|
+
if (copyFileIfChanged(src, destPath)) {
|
|
270
|
+
context.services.log(' Installed brain-checkpoint.cjs (copied)');
|
|
271
|
+
}
|
|
256
272
|
return;
|
|
257
273
|
}
|
|
258
274
|
}
|
|
@@ -280,9 +296,9 @@ export class HooksPhase extends BasePhase {
|
|
|
280
296
|
];
|
|
281
297
|
for (const src of sourcePaths) {
|
|
282
298
|
if (existsSync(src) && src !== destPath) {
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
299
|
+
if (copyFileIfChanged(src, destPath)) {
|
|
300
|
+
context.services.log(' Installed statusline-v3.cjs (copied)');
|
|
301
|
+
}
|
|
286
302
|
return;
|
|
287
303
|
}
|
|
288
304
|
}
|
|
@@ -312,9 +328,9 @@ export class HooksPhase extends BasePhase {
|
|
|
312
328
|
];
|
|
313
329
|
for (const src of sourcePaths) {
|
|
314
330
|
if (existsSync(src) && src !== destPath) {
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
331
|
+
if (copyFileIfChanged(src, destPath)) {
|
|
332
|
+
context.services.log(' Installed aqe-hook.cjs (copied)');
|
|
333
|
+
}
|
|
318
334
|
return;
|
|
319
335
|
}
|
|
320
336
|
}
|
|
@@ -11,7 +11,8 @@
|
|
|
11
11
|
* walks up looking for .agentic-qe/, .git/, or package.json. This
|
|
12
12
|
* makes the config portable across machines, devcontainers, and CI.
|
|
13
13
|
*/
|
|
14
|
-
import { existsSync, readFileSync
|
|
14
|
+
import { existsSync, readFileSync } from 'fs';
|
|
15
|
+
import { writeFileIfChanged } from '../idempotent-write.js';
|
|
15
16
|
import { join } from 'path';
|
|
16
17
|
import { safeJsonParse } from '../../shared/safe-json.js';
|
|
17
18
|
import { BasePhase, } from './phase-interface.js';
|
|
@@ -85,7 +86,8 @@ export class MCPPhase extends BasePhase {
|
|
|
85
86
|
}
|
|
86
87
|
const rootServers = rootMcpConfig.mcpServers;
|
|
87
88
|
rootServers['agentic-qe'] = aqeServerConfig;
|
|
88
|
-
|
|
89
|
+
// #778: no rewrite (mtime churn) when the merged config is unchanged.
|
|
90
|
+
writeFileIfChanged(rootMcpPath, JSON.stringify(rootMcpConfig, null, 2));
|
|
89
91
|
context.services.log(` MCP config: ${rootMcpPath}`);
|
|
90
92
|
context.services.log(` Server: agentic-qe`);
|
|
91
93
|
if (dbFree) {
|
|
@@ -20,6 +20,16 @@ export interface AssetsResult {
|
|
|
20
20
|
policy: 'full' | 'compact' | 'none';
|
|
21
21
|
ownedBytes: number;
|
|
22
22
|
};
|
|
23
|
+
codexComponents?: {
|
|
24
|
+
hooks: {
|
|
25
|
+
status: string;
|
|
26
|
+
error?: string;
|
|
27
|
+
};
|
|
28
|
+
skills: {
|
|
29
|
+
status: string;
|
|
30
|
+
error?: string;
|
|
31
|
+
};
|
|
32
|
+
};
|
|
23
33
|
}
|
|
24
34
|
/**
|
|
25
35
|
* Assets phase - installs skills and agents
|
|
@@ -37,6 +37,7 @@ export class AssetsPhase extends BasePhase {
|
|
|
37
37
|
let kiroSkills = 0;
|
|
38
38
|
let kiroHooks = 0;
|
|
39
39
|
let codexGuidance;
|
|
40
|
+
let codexComponents;
|
|
40
41
|
if (options.upgrade) {
|
|
41
42
|
context.services.log(` Upgrade mode: overwriting existing files`);
|
|
42
43
|
}
|
|
@@ -303,6 +304,7 @@ export class AssetsPhase extends BasePhase {
|
|
|
303
304
|
});
|
|
304
305
|
const res = await installer.install();
|
|
305
306
|
codexGuidance = { policy: res.guidancePolicy, ownedBytes: res.ownedGuidanceBytes };
|
|
307
|
+
codexComponents = { hooks: res.components.hooks, skills: res.components.skills };
|
|
306
308
|
if (res.mcpConfigured)
|
|
307
309
|
platformsConfigured.push('codex');
|
|
308
310
|
if (res.errors.length > 0)
|
|
@@ -361,6 +363,7 @@ export class AssetsPhase extends BasePhase {
|
|
|
361
363
|
platformsConfigured,
|
|
362
364
|
browserEngine,
|
|
363
365
|
codexGuidance,
|
|
366
|
+
codexComponents,
|
|
364
367
|
};
|
|
365
368
|
}
|
|
366
369
|
/**
|
|
@@ -2,7 +2,8 @@
|
|
|
2
2
|
* Phase 10: Workers
|
|
3
3
|
* Configures background workers for continuous monitoring
|
|
4
4
|
*/
|
|
5
|
-
import { existsSync, mkdirSync
|
|
5
|
+
import { existsSync, mkdirSync } from 'fs';
|
|
6
|
+
import { writeFileIfChanged, writeJsonIfChanged } from '../idempotent-write.js';
|
|
6
7
|
import { join, dirname } from 'path';
|
|
7
8
|
import { fileURLToPath } from 'url';
|
|
8
9
|
import { BasePhase, } from './phase-interface.js';
|
|
@@ -86,7 +87,8 @@ export class WorkersPhase extends BasePhase {
|
|
|
86
87
|
createdAt: new Date().toISOString(),
|
|
87
88
|
daemonPid: null,
|
|
88
89
|
};
|
|
89
|
-
|
|
90
|
+
// #778: an unchanged registry keeps its bytes and original createdAt.
|
|
91
|
+
writeJsonIfChanged(registryPath, registryData, [['createdAt']]);
|
|
90
92
|
// Write individual worker configs
|
|
91
93
|
for (const workerName of config.workers.enabled) {
|
|
92
94
|
const workerConfigPath = join(workersDir, `${workerName}.json`);
|
|
@@ -98,7 +100,7 @@ export class WorkersPhase extends BasePhase {
|
|
|
98
100
|
dataDir: join(projectRoot, '.agentic-qe', 'data'),
|
|
99
101
|
createdAt: new Date().toISOString(),
|
|
100
102
|
};
|
|
101
|
-
|
|
103
|
+
writeJsonIfChanged(workerConfigPath, workerConfig, [['createdAt']]);
|
|
102
104
|
}
|
|
103
105
|
// Write cross-platform daemon startup script
|
|
104
106
|
const daemonScriptPath = join(workersDir, 'start-daemon.cjs');
|
|
@@ -178,7 +180,7 @@ console.log('AQE v3 Worker Daemon started (PID: ' + child.pid + ')');
|
|
|
178
180
|
console.log('Log file: ' + logFile);
|
|
179
181
|
console.log('To stop: node ' + join(workersDir, 'stop-daemon.cjs'));
|
|
180
182
|
`;
|
|
181
|
-
|
|
183
|
+
writeFileIfChanged(daemonScriptPath, daemonScript);
|
|
182
184
|
// Also write a cross-platform stop script
|
|
183
185
|
const stopScriptPath = join(workersDir, 'stop-daemon.cjs');
|
|
184
186
|
const stopScript = `#!/usr/bin/env node
|
|
@@ -205,7 +207,7 @@ try {
|
|
|
205
207
|
try { unlinkSync(pidFile); } catch {}
|
|
206
208
|
}
|
|
207
209
|
`;
|
|
208
|
-
|
|
210
|
+
writeFileIfChanged(stopScriptPath, stopScript);
|
|
209
211
|
context.services.log(` Workers dir: ${workersDir}`);
|
|
210
212
|
context.services.log(` Workers: ${config.workers.enabled.join(', ')}`);
|
|
211
213
|
context.services.log(` Registry: ${registryPath}`);
|
|
@@ -7,9 +7,12 @@
|
|
|
7
7
|
*/
|
|
8
8
|
import { existsSync, readFileSync } from 'fs';
|
|
9
9
|
import { join, dirname } from 'path';
|
|
10
|
-
import { mkdirSync
|
|
10
|
+
import { mkdirSync } from 'fs';
|
|
11
|
+
import { writeTextIfChangedIgnoring } from '../idempotent-write.js';
|
|
11
12
|
import { BasePhase, } from './phase-interface.js';
|
|
12
13
|
import { openDatabase } from '../../shared/safe-db.js';
|
|
14
|
+
/** The `# <ISO timestamp>` header line written by configToYAML(). */
|
|
15
|
+
const CONFIG_TIMESTAMP_LINE = /^# \d{4}-\d{2}-\d{2}T[\d:.]+Z$/;
|
|
13
16
|
/**
|
|
14
17
|
* Verification phase - verifies installation and writes markers
|
|
15
18
|
*/
|
|
@@ -135,7 +138,9 @@ export class VerificationPhase extends BasePhase {
|
|
|
135
138
|
}
|
|
136
139
|
}
|
|
137
140
|
const yaml = this.configToYAML(config);
|
|
138
|
-
|
|
141
|
+
// #778: the header carries a generation timestamp; ignore that line when
|
|
142
|
+
// deciding whether the file actually changed, so a repeat init is a no-op.
|
|
143
|
+
writeTextIfChangedIgnoring(configPath, yaml, CONFIG_TIMESTAMP_LINE);
|
|
139
144
|
}
|
|
140
145
|
/**
|
|
141
146
|
* Load existing config.yaml and parse it
|
|
@@ -5,6 +5,15 @@
|
|
|
5
5
|
* Analyzes a project to detect frameworks, languages, tests, and configuration.
|
|
6
6
|
*/
|
|
7
7
|
import type { ProjectAnalysis, DetectedFramework, DetectedLanguage, ExistingTests, CodeComplexity, CoverageMetrics } from './types.js';
|
|
8
|
+
/**
|
|
9
|
+
* Directories never scanned by the analyzer: build/vendor output plus the
|
|
10
|
+
* tool-generated trees that `aqe init` itself (and the agent platforms it
|
|
11
|
+
* configures) writes into the project. Scanning AQE's own installed skills,
|
|
12
|
+
* helpers and hook scripts made a repeat `aqe init` "see" a different project
|
|
13
|
+
* than the first run (new languages, tests, complexity) and silently change
|
|
14
|
+
* the generated configuration (#778).
|
|
15
|
+
*/
|
|
16
|
+
export declare const ANALYZER_EXCLUDED_DIRS: readonly string[];
|
|
8
17
|
export declare class ProjectAnalyzer {
|
|
9
18
|
private projectRoot;
|
|
10
19
|
constructor(projectRoot: string);
|
|
@@ -165,8 +165,27 @@ function getPackageVersion(root, packageName) {
|
|
|
165
165
|
return undefined;
|
|
166
166
|
return pkg.devDependencies?.[packageName] || pkg.dependencies?.[packageName];
|
|
167
167
|
}
|
|
168
|
+
/**
|
|
169
|
+
* Directories never scanned by the analyzer: build/vendor output plus the
|
|
170
|
+
* tool-generated trees that `aqe init` itself (and the agent platforms it
|
|
171
|
+
* configures) writes into the project. Scanning AQE's own installed skills,
|
|
172
|
+
* helpers and hook scripts made a repeat `aqe init` "see" a different project
|
|
173
|
+
* than the first run (new languages, tests, complexity) and silently change
|
|
174
|
+
* the generated configuration (#778).
|
|
175
|
+
*/
|
|
176
|
+
export const ANALYZER_EXCLUDED_DIRS = [
|
|
177
|
+
// build / vendor output
|
|
178
|
+
'node_modules', '.git', 'dist', 'build', 'coverage', '.next', '__pycache__',
|
|
179
|
+
// AQE-generated state and assets
|
|
180
|
+
'.agentic-qe', '.claude',
|
|
181
|
+
// agent-platform trees written by `aqe init --with-<platform>`
|
|
182
|
+
'.agents', '.codex', '.opencode', '.kiro', '.cursor', '.roo', '.kilocode',
|
|
183
|
+
'.windsurf', '.continue', '.clinerules',
|
|
184
|
+
// companion tooling state (claude-flow / ruflo)
|
|
185
|
+
'.swarm', '.claude-flow', '.hive-mind',
|
|
186
|
+
];
|
|
168
187
|
function walkDir(dir, callback, options = {}) {
|
|
169
|
-
const { maxDepth = 10, exclude =
|
|
188
|
+
const { maxDepth = 10, exclude = ANALYZER_EXCLUDED_DIRS } = options;
|
|
170
189
|
function walk(currentDir, depth) {
|
|
171
190
|
if (depth > maxDepth)
|
|
172
191
|
return;
|
|
@@ -56,9 +56,11 @@ export declare class SelfConfigurator {
|
|
|
56
56
|
/**
|
|
57
57
|
* Recommend enabled domains
|
|
58
58
|
*
|
|
59
|
-
* IMPORTANT: Always enable ALL
|
|
60
|
-
* Limiting domains causes "No factory
|
|
61
|
-
* when MCP tools try to use domains that
|
|
59
|
+
* IMPORTANT: Always enable ALL default domains (init's ALL_DOMAINS, derived
|
|
60
|
+
* from the canonical shared domain list). Limiting domains causes "No factory
|
|
61
|
+
* registered" errors in fleet_init when MCP tools try to use domains that
|
|
62
|
+
* aren't enabled. A hand-maintained copy here previously omitted
|
|
63
|
+
* enterprise-integration, so fresh and repeat inits disagreed (#778).
|
|
62
64
|
*
|
|
63
65
|
* Project analysis is used for prioritization and worker selection,
|
|
64
66
|
* but all domains remain available for users who need them.
|
|
@@ -51,7 +51,7 @@ const configurationRules = [
|
|
|
51
51
|
// Complex code needs more careful testing
|
|
52
52
|
config.autoTuning.parameters.push('complexity.analysisDepth');
|
|
53
53
|
// Enable all quality domains
|
|
54
|
-
config.domains.enabled = ALL_DOMAINS;
|
|
54
|
+
config.domains.enabled = [...ALL_DOMAINS];
|
|
55
55
|
},
|
|
56
56
|
},
|
|
57
57
|
// Low coverage rules
|
|
@@ -136,10 +136,11 @@ const configurationRules = [
|
|
|
136
136
|
// Focus on test generation - but keep ALL domains enabled
|
|
137
137
|
// Limiting domains causes "No factory registered" errors in fleet_init
|
|
138
138
|
config.workers.enabled = ['pattern-consolidator'];
|
|
139
|
-
// Don't override domains.enabled - keep
|
|
140
|
-
//
|
|
141
|
-
|
|
142
|
-
|
|
139
|
+
// Don't override domains.enabled - keep every default domain.
|
|
140
|
+
// Pattern-promotion thresholds are NOT lowered here: the learning
|
|
141
|
+
// runtime always enforces PROMOTION_THRESHOLD / PROMOTION_MIN_SUCCESS_RATE,
|
|
142
|
+
// so a per-project override only made the generated settings misreport
|
|
143
|
+
// the runtime and flip between fresh and repeat inits (#778).
|
|
143
144
|
},
|
|
144
145
|
},
|
|
145
146
|
// Many existing tests
|
|
@@ -222,7 +223,7 @@ export class SelfConfigurator {
|
|
|
222
223
|
* Recommend learning configuration
|
|
223
224
|
*/
|
|
224
225
|
recommendLearning(analysis) {
|
|
225
|
-
const config =
|
|
226
|
+
const config = structuredClone(DEFAULT_LEARNING_CONFIG);
|
|
226
227
|
// Adjust HNSW based on project size
|
|
227
228
|
if (analysis.codeComplexity.totalFiles > 1000) {
|
|
228
229
|
config.hnswConfig = {
|
|
@@ -248,7 +249,7 @@ export class SelfConfigurator {
|
|
|
248
249
|
* Recommend routing configuration
|
|
249
250
|
*/
|
|
250
251
|
recommendRouting(analysis) {
|
|
251
|
-
const config =
|
|
252
|
+
const config = structuredClone(DEFAULT_ROUTING_CONFIG);
|
|
252
253
|
// ML routing for complex projects, rules for simple
|
|
253
254
|
if (analysis.codeComplexity.recommendation === 'simple') {
|
|
254
255
|
config.mode = 'rules';
|
|
@@ -265,7 +266,7 @@ export class SelfConfigurator {
|
|
|
265
266
|
* Recommend workers configuration
|
|
266
267
|
*/
|
|
267
268
|
recommendWorkers(analysis) {
|
|
268
|
-
const config =
|
|
269
|
+
const config = structuredClone(DEFAULT_WORKERS_CONFIG);
|
|
269
270
|
// Always enable core workers
|
|
270
271
|
const workers = new Set(['pattern-consolidator', 'routing-accuracy-monitor']);
|
|
271
272
|
// Add coverage scanner if coverage is low or missing
|
|
@@ -290,7 +291,7 @@ export class SelfConfigurator {
|
|
|
290
291
|
* Recommend hooks configuration
|
|
291
292
|
*/
|
|
292
293
|
recommendHooks(analysis) {
|
|
293
|
-
const config =
|
|
294
|
+
const config = structuredClone(DEFAULT_HOOKS_CONFIG);
|
|
294
295
|
// Enable CI integration if CI is configured
|
|
295
296
|
config.ciIntegration = analysis.hasCIConfig;
|
|
296
297
|
// Enable pre-commit for projects with many tests
|
|
@@ -301,7 +302,7 @@ export class SelfConfigurator {
|
|
|
301
302
|
* Recommend skills configuration
|
|
302
303
|
*/
|
|
303
304
|
recommendSkills(analysis) {
|
|
304
|
-
const config =
|
|
305
|
+
const config = structuredClone(DEFAULT_SKILLS_CONFIG);
|
|
305
306
|
// Always install by default
|
|
306
307
|
config.install = true;
|
|
307
308
|
// Install v2 methodology skills - version-agnostic best practices
|
|
@@ -316,7 +317,7 @@ export class SelfConfigurator {
|
|
|
316
317
|
* Recommend auto-tuning configuration
|
|
317
318
|
*/
|
|
318
319
|
recommendAutoTuning(analysis) {
|
|
319
|
-
const config =
|
|
320
|
+
const config = structuredClone(DEFAULT_AUTO_TUNING_CONFIG);
|
|
320
321
|
// Disable auto-tuning for small projects
|
|
321
322
|
if (analysis.codeComplexity.totalFiles < 20) {
|
|
322
323
|
config.enabled = false;
|
|
@@ -326,30 +327,18 @@ export class SelfConfigurator {
|
|
|
326
327
|
/**
|
|
327
328
|
* Recommend enabled domains
|
|
328
329
|
*
|
|
329
|
-
* IMPORTANT: Always enable ALL
|
|
330
|
-
* Limiting domains causes "No factory
|
|
331
|
-
* when MCP tools try to use domains that
|
|
330
|
+
* IMPORTANT: Always enable ALL default domains (init's ALL_DOMAINS, derived
|
|
331
|
+
* from the canonical shared domain list). Limiting domains causes "No factory
|
|
332
|
+
* registered" errors in fleet_init when MCP tools try to use domains that
|
|
333
|
+
* aren't enabled. A hand-maintained copy here previously omitted
|
|
334
|
+
* enterprise-integration, so fresh and repeat inits disagreed (#778).
|
|
332
335
|
*
|
|
333
336
|
* Project analysis is used for prioritization and worker selection,
|
|
334
337
|
* but all domains remain available for users who need them.
|
|
335
338
|
*/
|
|
336
339
|
recommendDomains(_analysis) {
|
|
337
|
-
// All 12 DDD domains - always enabled to prevent fleet_init failures
|
|
338
340
|
// Users can disable domains manually in config.yaml if needed
|
|
339
|
-
return [
|
|
340
|
-
'test-generation',
|
|
341
|
-
'test-execution',
|
|
342
|
-
'coverage-analysis',
|
|
343
|
-
'quality-assessment',
|
|
344
|
-
'defect-intelligence',
|
|
345
|
-
'requirements-validation',
|
|
346
|
-
'code-intelligence',
|
|
347
|
-
'security-compliance',
|
|
348
|
-
'contract-testing',
|
|
349
|
-
'visual-accessibility',
|
|
350
|
-
'chaos-resilience',
|
|
351
|
-
'learning-optimization',
|
|
352
|
-
];
|
|
341
|
+
return [...ALL_DOMAINS];
|
|
353
342
|
}
|
|
354
343
|
/**
|
|
355
344
|
* Recommend max concurrent agents
|
|
@@ -5,10 +5,11 @@
|
|
|
5
5
|
* Installs AQE skills (both v2 methodology and v3 domain skills) to user projects.
|
|
6
6
|
* Skills are copied from the bundled skills directory to the project's .claude/skills/.
|
|
7
7
|
*/
|
|
8
|
-
import { existsSync, mkdirSync, readdirSync, statSync, readFileSync,
|
|
8
|
+
import { existsSync, mkdirSync, readdirSync, statSync, readFileSync, copyFileSync, unlinkSync, rmdirSync } from 'fs';
|
|
9
9
|
import { join } from 'path';
|
|
10
10
|
import { toErrorMessage } from '../shared/error-utils.js';
|
|
11
11
|
import { findPackageRoot } from './find-package-root.js';
|
|
12
|
+
import { GENERATED_ON_LINE, writeTextIfChangedIgnoring } from './idempotent-write.js';
|
|
12
13
|
// ============================================================================
|
|
13
14
|
// Skill Categories (QE Skills Only - Claude Flow skills are managed separately)
|
|
14
15
|
// ============================================================================
|
|
@@ -472,7 +473,8 @@ See \`.validation/README.md\` for usage instructions.
|
|
|
472
473
|
|
|
473
474
|
*Generated by AQE v3 init on ${new Date().toISOString()}*
|
|
474
475
|
`;
|
|
475
|
-
|
|
476
|
+
// #778: ignore the generation-timestamp footer when deciding to rewrite.
|
|
477
|
+
writeTextIfChangedIgnoring(join(skillsDir, 'README.md'), indexContent, GENERATED_ON_LINE);
|
|
476
478
|
}
|
|
477
479
|
/**
|
|
478
480
|
* Scan the skills directory to get all present skills
|
|
@@ -13,7 +13,7 @@ export interface TokenBootstrapConfig {
|
|
|
13
13
|
enableOptimization: boolean;
|
|
14
14
|
/** Enable persistence (default: true) */
|
|
15
15
|
enablePersistence: boolean;
|
|
16
|
-
/** Storage directory for metrics (default:
|
|
16
|
+
/** Storage directory for metrics (default: <project>/.agentic-qe) */
|
|
17
17
|
storagePath: string;
|
|
18
18
|
/** Auto-save interval in ms (default: 60000 = 1 minute) */
|
|
19
19
|
autoSaveIntervalMs: number;
|