agentic-qe 3.14.6 → 3.14.7
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 +74 -0
- package/assets/skills/skills-manifest.json +1 -1
- package/dist/cli/bundle.js +8 -8
- package/dist/cli/chunks/adapter-TVQKH65T.js +2 -0
- package/dist/cli/chunks/{agent-booster-wasm-2YGML6OU.js → agent-booster-wasm-AK2W76RG.js} +2 -2
- package/dist/cli/chunks/{agent-handler-D5SSQYNU.js → agent-handler-MGZCWHIY.js} +2 -2
- package/dist/cli/chunks/{agent-memory-branch-YHPLTITV.js → agent-memory-branch-JZ54MCSP.js} +2 -2
- package/dist/cli/chunks/aqe-learning-engine-ULGTVVWE.js +2 -0
- package/dist/cli/chunks/{arena-7BGOXGXO.js → arena-CUVH3V7H.js} +2 -2
- package/dist/cli/chunks/{arena-MCE6EU7K.js → arena-YSWTKBCL.js} +4 -4
- package/dist/cli/chunks/{audit-BMWTQECB.js → audit-LVU76QGA.js} +3 -3
- package/dist/cli/chunks/base-W42BURDL.js +2 -0
- package/dist/cli/chunks/{better-sqlite3-PMUNGASU.js → better-sqlite3-DB3LOJQU.js} +2 -2
- package/dist/cli/chunks/{brain-handler-QPUFYX7F.js → brain-handler-SD63KOQ6.js} +3 -3
- package/dist/cli/chunks/{branch-enumerator-WKFDGRN4.js → branch-enumerator-4MNOPUC7.js} +2 -2
- package/dist/cli/chunks/{browser-VY5HKH5X.js → browser-OLPNTWQE.js} +2 -2
- package/dist/cli/chunks/browser-workflow-HKGHFFFT.js +2 -0
- package/dist/cli/chunks/{chunk-62N4NUJH.js → chunk-23CX7JNL.js} +2 -2
- package/dist/cli/chunks/{chunk-MW2GGZZ5.js → chunk-25P6JA6V.js} +1 -1
- package/dist/cli/chunks/{chunk-RSXXCL4A.js → chunk-2G63VIJE.js} +1 -1
- package/dist/cli/chunks/{chunk-3NIG7S5W.js → chunk-2IMSJ7IO.js} +1 -1
- package/dist/cli/chunks/{chunk-I33ERSGB.js → chunk-36VKMAMN.js} +2 -2
- package/dist/cli/chunks/{chunk-2TMWAQQ3.js → chunk-3M7J4U74.js} +3 -3
- package/dist/cli/chunks/{chunk-CM7U6TAX.js → chunk-3QJU4Q4R.js} +2 -2
- package/dist/cli/chunks/{chunk-H5BS5VH7.js → chunk-4EKV7PHB.js} +2 -2
- package/dist/cli/chunks/{chunk-IG5GNEC6.js → chunk-4INST4ZL.js} +1 -1
- package/dist/cli/chunks/{chunk-YHKEDEAA.js → chunk-53BXTTRO.js} +3 -3
- package/dist/cli/chunks/{chunk-ENGZ4D5V.js → chunk-5D7ZFWDS.js} +2 -2
- package/dist/cli/chunks/{chunk-DZ3AUAAB.js → chunk-5FSLMYAC.js} +2 -2
- package/dist/cli/chunks/{chunk-FBMN7B46.js → chunk-5GFKTJ65.js} +2 -2
- package/dist/cli/chunks/{chunk-NMAIY4PX.js → chunk-5U6N4V5M.js} +11 -11
- package/dist/cli/chunks/{chunk-B6D2CHEH.js → chunk-6EGS77BB.js} +1 -1
- package/dist/cli/chunks/{chunk-NQZ5AR3D.js → chunk-6PJPQGF4.js} +2 -2
- package/dist/cli/chunks/{chunk-ICTXTNQZ.js → chunk-6RD44SCE.js} +1 -1
- package/dist/cli/chunks/{chunk-2NPKIBAZ.js → chunk-74IOEOMH.js} +2 -2
- package/dist/cli/chunks/{chunk-RTFO5UQH.js → chunk-77QZHIVX.js} +2 -2
- package/dist/cli/chunks/{chunk-D45SG6CP.js → chunk-7EZ2Z2CK.js} +1 -1
- package/dist/cli/chunks/{chunk-UNFFDHER.js → chunk-7MIOK72I.js} +10 -32
- package/dist/cli/chunks/{chunk-HNFVJP4I.js → chunk-7QYOTUOX.js} +2 -2
- package/dist/cli/chunks/{chunk-Q7EAGKAE.js → chunk-A2VUCUTT.js} +2 -2
- package/dist/cli/chunks/{chunk-TVYY3OCX.js → chunk-A3DK3XNZ.js} +1 -1
- package/dist/cli/chunks/{chunk-RETBYIAC.js → chunk-A5MA7A23.js} +4 -4
- package/dist/cli/chunks/{chunk-DUYOVM5I.js → chunk-AEUEMVJK.js} +2 -2
- package/dist/cli/chunks/{chunk-6U7LNMWZ.js → chunk-AJUBT4NP.js} +2 -2
- package/dist/cli/chunks/{chunk-7CUQCCMD.js → chunk-B2YGVSOP.js} +2 -2
- package/dist/cli/chunks/{chunk-SNOBH4AZ.js → chunk-B4I43GE2.js} +2 -2
- package/dist/cli/chunks/{chunk-VMNWDJIZ.js → chunk-BD7FEUN3.js} +2 -2
- package/dist/cli/chunks/{chunk-HM6ZSCPI.js → chunk-BE4KALTE.js} +1 -1
- package/dist/cli/chunks/{chunk-WGM35YWL.js → chunk-BEFTQVEW.js} +2 -2
- package/dist/cli/chunks/{chunk-SMDN3BQZ.js → chunk-BLG7SH4A.js} +1 -1
- package/dist/cli/chunks/{chunk-AJRUJAAK.js → chunk-C3FXFU2T.js} +1 -1
- package/dist/cli/chunks/{chunk-IQO7UCFR.js → chunk-CBONQM5D.js} +2 -2
- package/dist/cli/chunks/{chunk-L4RUBPLR.js → chunk-CQNMGK6Y.js} +2 -2
- package/dist/cli/chunks/{chunk-NHWGMJAP.js → chunk-CVOQ6ESD.js} +2 -2
- package/dist/cli/chunks/{chunk-P6OYS755.js → chunk-DOBKEXMJ.js} +1 -1
- package/dist/cli/chunks/{chunk-QZANMBIT.js → chunk-DYTQHRUS.js} +1 -1
- package/dist/cli/chunks/{chunk-FZOBD67M.js → chunk-EADSQN5T.js} +1 -1
- package/dist/cli/chunks/{chunk-DHVX5UB2.js → chunk-EGOIIUBD.js} +2 -2
- package/dist/cli/chunks/{chunk-6OS76PHI.js → chunk-EIGRV3J6.js} +2 -2
- package/dist/cli/chunks/{chunk-CD542DNJ.js → chunk-EJ6MMYLK.js} +1 -1
- package/dist/cli/chunks/{chunk-ELLBS5RP.js → chunk-ENK44A6Q.js} +2 -2
- package/dist/cli/chunks/{chunk-VGFFFKGK.js → chunk-EYXE2XKP.js} +2 -2
- package/dist/cli/chunks/{chunk-72KXSMWI.js → chunk-F2OPFVQH.js} +1 -1
- package/dist/cli/chunks/{chunk-DK4XN4CU.js → chunk-FBZC4IGB.js} +2 -2
- package/dist/cli/chunks/{chunk-MUOG6QXR.js → chunk-FSSR6WBE.js} +2 -2
- package/dist/cli/chunks/{chunk-DPYSUDAO.js → chunk-FW4DJ4FJ.js} +1 -1
- package/dist/cli/chunks/{chunk-ZVWVV4EX.js → chunk-FYPX5WBJ.js} +1 -1
- package/dist/cli/chunks/{chunk-7J6QC567.js → chunk-G367W7XR.js} +3 -3
- package/dist/cli/chunks/{chunk-IAF6T27S.js → chunk-GLGKQX2V.js} +2 -2
- package/dist/cli/chunks/{chunk-JXGFRBUO.js → chunk-GV4DYPJP.js} +2 -2
- package/dist/cli/chunks/{chunk-BPEDWS6O.js → chunk-GVVFTFMB.js} +2 -2
- package/dist/cli/chunks/{chunk-CF2ISEOJ.js → chunk-H5RQPO3X.js} +2 -2
- package/dist/cli/chunks/{chunk-GSF6MB64.js → chunk-HPWWYT67.js} +2 -2
- package/dist/cli/chunks/{chunk-RG52OKAM.js → chunk-HXXHMLJ5.js} +1 -1
- package/dist/cli/chunks/{chunk-SESK3ARK.js → chunk-HYFQUWNB.js} +2 -2
- package/dist/cli/chunks/{chunk-7D3V65N5.js → chunk-HYOPJHHW.js} +1 -1
- package/dist/cli/chunks/{chunk-7LPR6HJG.js → chunk-HZY42OVU.js} +2 -2
- package/dist/cli/chunks/{chunk-SDRHUMJB.js → chunk-IAENZ2DR.js} +2 -2
- package/dist/cli/chunks/{chunk-B6MOJC3X.js → chunk-IEJ7ZV3M.js} +1 -1
- package/dist/cli/chunks/{chunk-UCFQALXO.js → chunk-IWFFO6VT.js} +2 -2
- package/dist/cli/chunks/chunk-J7AQZLIH.js +21 -0
- package/dist/cli/chunks/{chunk-H52HZ67P.js → chunk-JHJUSSAU.js} +2 -2
- package/dist/cli/chunks/{chunk-2YXGBZWV.js → chunk-JOZ47MV6.js} +1 -1
- package/dist/cli/chunks/{chunk-EAY2JMZG.js → chunk-JZT7BU44.js} +2 -2
- package/dist/cli/chunks/{chunk-BVR7RMC5.js → chunk-KD2BLA5Y.js} +1 -1
- package/dist/cli/chunks/{chunk-BAMN2CHI.js → chunk-KUHLTVWC.js} +1 -1
- package/dist/cli/chunks/{chunk-5QQSIGUA.js → chunk-LU2EDWQK.js} +2 -2
- package/dist/cli/chunks/{chunk-D6CJIGRU.js → chunk-LXZMP3VX.js} +54 -54
- package/dist/cli/chunks/{chunk-GPYVDFB3.js → chunk-LY7MFGBD.js} +196 -187
- package/dist/cli/chunks/{chunk-W6HXLH5G.js → chunk-MM56VPNE.js} +2 -2
- package/dist/cli/chunks/{chunk-E6G2RD5H.js → chunk-MNQN7UZX.js} +2 -2
- package/dist/cli/chunks/{chunk-ZCRTRYXK.js → chunk-MQZ53OR3.js} +2 -2
- package/dist/cli/chunks/{chunk-3HZS4M3O.js → chunk-MT7UNBZ7.js} +2 -2
- package/dist/cli/chunks/{chunk-XAS3XRYM.js → chunk-MZB2UV2O.js} +1 -1
- package/dist/cli/chunks/{chunk-GDSXITFH.js → chunk-MZMG6CUJ.js} +2 -2
- package/dist/cli/chunks/{chunk-6SQM2MUX.js → chunk-N5XOXPHZ.js} +2 -2
- package/dist/cli/chunks/{chunk-5OOMJGFN.js → chunk-NBLDBVAW.js} +1 -1
- package/dist/cli/chunks/{chunk-PI7TJS62.js → chunk-ND4QTZOL.js} +2 -2
- package/dist/cli/chunks/{chunk-H6ZM3PUT.js → chunk-NHUGHAY6.js} +1 -1
- package/dist/cli/chunks/{chunk-5VFPCSK7.js → chunk-NOHWJOBS.js} +1 -1
- package/dist/cli/chunks/{chunk-DBDPRORT.js → chunk-O5V7RHVG.js} +2 -2
- package/dist/cli/chunks/{chunk-UQ32JHES.js → chunk-O6MO5KMR.js} +2 -2
- package/dist/cli/chunks/{chunk-WO4QMXIG.js → chunk-OAZX6WFU.js} +2 -2
- package/dist/cli/chunks/{chunk-GGRHV6D7.js → chunk-OEPNNLR4.js} +1 -1
- package/dist/cli/chunks/{chunk-AIRGNL55.js → chunk-OIDWDGLG.js} +2 -2
- package/dist/cli/chunks/{chunk-V4DM6ELU.js → chunk-ON2UTP2U.js} +2 -2
- package/dist/cli/chunks/{chunk-MBRHSU6W.js → chunk-ONR2NXXD.js} +10 -10
- package/dist/cli/chunks/{chunk-WCJBU2KI.js → chunk-OXHF3L2T.js} +2 -2
- package/dist/cli/chunks/{chunk-AVBJYI5I.js → chunk-OZGIOKEA.js} +1 -1
- package/dist/cli/chunks/{chunk-YFBSPLJG.js → chunk-P2UPYSDJ.js} +1 -1
- package/dist/cli/chunks/{chunk-C6KWXUFJ.js → chunk-P7XSPP5D.js} +2 -2
- package/dist/cli/chunks/{chunk-QDFTT3RF.js → chunk-PCJQCEBA.js} +2 -2
- package/dist/cli/chunks/chunk-PELENDDQ.js +2 -0
- package/dist/cli/chunks/{chunk-257E2A5M.js → chunk-PYKY22GC.js} +5 -5
- package/dist/cli/chunks/{chunk-LL3IGZBI.js → chunk-Q3NSU24F.js} +2 -2
- package/dist/cli/chunks/{chunk-Y3LZ35OG.js → chunk-Q6NTEICT.js} +2 -2
- package/dist/cli/chunks/chunk-QFETNCNN.js +12 -0
- package/dist/cli/chunks/{chunk-SE4WIB26.js → chunk-QGOWNVVG.js} +1 -1
- package/dist/cli/chunks/{chunk-6RE3X4V5.js → chunk-QPLSYEWJ.js} +2 -2
- package/dist/cli/chunks/{chunk-FWASDOT2.js → chunk-QQFQDEUE.js} +2 -2
- package/dist/cli/chunks/{chunk-2JVWITNK.js → chunk-QUORH2MG.js} +55 -79
- package/dist/cli/chunks/{chunk-5J6W7SIA.js → chunk-QVH5Y7AP.js} +1 -1
- package/dist/cli/chunks/{chunk-YSLL6VSL.js → chunk-RC2A4JZ5.js} +2 -2
- package/dist/cli/chunks/{chunk-IB27QACC.js → chunk-RDGPXENG.js} +2 -2
- package/dist/cli/chunks/{chunk-PX5YDCRH.js → chunk-RKI3IQKQ.js} +2 -2
- package/dist/cli/chunks/{chunk-BMAPORJ7.js → chunk-RKUAWQOF.js} +2 -2
- package/dist/cli/chunks/chunk-RLW25X66.js +2 -0
- package/dist/cli/chunks/{chunk-RFNPJK6N.js → chunk-ROVZSZCS.js} +3 -3
- package/dist/cli/chunks/{chunk-MQROI74N.js → chunk-RT6O2HW2.js} +2 -2
- package/dist/cli/chunks/{chunk-Y3UOUNHM.js → chunk-SM2YJ2AL.js} +2 -2
- package/dist/cli/chunks/{chunk-BBT64TII.js → chunk-SRPLERER.js} +3 -3
- package/dist/cli/chunks/{chunk-YS4FCTWF.js → chunk-T77GZF4B.js} +1 -1
- package/dist/cli/chunks/{chunk-IV5UZOHH.js → chunk-TFK2AYIN.js} +2 -2
- package/dist/cli/chunks/chunk-TW3SR4TS.js +2 -0
- package/dist/cli/chunks/{chunk-7Z5LHRC3.js → chunk-TXSPBLBT.js} +2 -2
- package/dist/cli/chunks/chunk-UA7TDVL7.js +12 -0
- package/dist/cli/chunks/{chunk-3EZOZN25.js → chunk-UBJG3IHT.js} +2 -2
- package/dist/cli/chunks/{chunk-QW6VMTBR.js → chunk-UFSVUBTR.js} +2 -2
- package/dist/cli/chunks/{chunk-ZEV3YTO7.js → chunk-UOI6ULCH.js} +2 -2
- package/dist/cli/chunks/{chunk-JZOS5FCX.js → chunk-UYUJT6QO.js} +2 -2
- package/dist/cli/chunks/{chunk-3EA536JF.js → chunk-V5AK56DA.js} +2 -2
- package/dist/cli/chunks/{chunk-UKA2KOXE.js → chunk-V6RE4YRQ.js} +2 -2
- package/dist/cli/chunks/{chunk-RZZCUIAI.js → chunk-VW6FRMLW.js} +2 -2
- package/dist/cli/chunks/chunk-VXKWNRGA.js +2 -0
- package/dist/cli/chunks/{chunk-6SH5VZUD.js → chunk-VYDVI6FZ.js} +2 -2
- package/dist/cli/chunks/{chunk-BJTJLJRZ.js → chunk-WF6UISKW.js} +3 -3
- package/dist/cli/chunks/{chunk-ZL6SYKUK.js → chunk-WIH522AP.js} +1 -1
- package/dist/cli/chunks/{chunk-JIXUMYKZ.js → chunk-WOV6XI3A.js} +1 -1
- package/dist/cli/chunks/{chunk-JBTPOIAC.js → chunk-X7ADKL7T.js} +2 -2
- package/dist/cli/chunks/{chunk-JVNTSNWU.js → chunk-XBYQ2BS4.js} +2 -2
- package/dist/cli/chunks/{chunk-Z7WODOTH.js → chunk-XL5KIYE3.js} +2 -2
- package/dist/cli/chunks/{chunk-JMONHE4B.js → chunk-XWYELBZS.js} +1 -1
- package/dist/cli/chunks/{chunk-SJUXE4IC.js → chunk-XYLQZWF6.js} +2 -2
- package/dist/cli/chunks/{chunk-KNNISEDY.js → chunk-Y6AKKQIQ.js} +1 -1
- package/dist/cli/chunks/{chunk-CCK4BF76.js → chunk-YMW57PEL.js} +1 -1
- package/dist/cli/chunks/{chunk-64VGZQLB.js → chunk-YO4ESCB4.js} +1 -1
- package/dist/cli/chunks/{chunk-ZSPU4MOS.js → chunk-YRHTQZU4.js} +2 -2
- package/dist/cli/chunks/chunk-Z4Q5PCRZ.js +65 -0
- package/dist/cli/chunks/{chunk-Q5XTSMWR.js → chunk-ZELWDJXT.js} +2 -2
- package/dist/cli/chunks/{chunk-SPV2VKC5.js → chunk-ZQZD55MN.js} +2 -2
- package/dist/cli/chunks/{chunk-66VWCR67.js → chunk-ZS4XVJGV.js} +2 -2
- package/dist/cli/chunks/{chunk-6LIHFV7O.js → chunk-ZUB5YOCM.js} +2 -2
- package/dist/cli/chunks/chunk-ZUOVNFXK.js +2 -0
- package/dist/cli/chunks/{chunk-7NITCZWD.js → chunk-ZWEKAEEV.js} +1 -1
- package/dist/cli/chunks/{ci-W6K6G2KZ.js → ci-J3TDK5RA.js} +8 -8
- package/dist/cli/chunks/{ci-output-LDT24TS3.js → ci-output-RLS32FUY.js} +2 -2
- package/dist/cli/chunks/{circuit-breaker-F5V4KITU.js → circuit-breaker-MRCC7WCM.js} +2 -2
- package/dist/cli/chunks/{claude-flow-setup-DT6WQQVD.js → claude-flow-setup-LIZCEKDF.js} +2 -2
- package/dist/cli/chunks/client-3BD2DI4N.js +2 -0
- package/dist/cli/chunks/{cline-installer-G7TJOAEX.js → cline-installer-T7H6R2RC.js} +2 -2
- package/dist/cli/chunks/{code-PGE6A42V.js → code-XMBLI7OF.js} +3 -3
- package/dist/cli/chunks/{code-index-extractor-RNITH372.js → code-index-extractor-QS7BYLEX.js} +2 -2
- package/dist/cli/chunks/{codex-installer-LBX77AI3.js → codex-installer-6PGT5FM6.js} +2 -2
- package/dist/cli/chunks/{completions-4AWLAARX.js → completions-2A3WRXY2.js} +2 -2
- package/dist/cli/chunks/{complexity-analyzer-ZPNSS476.js → complexity-analyzer-23HOOGJ7.js} +2 -2
- package/dist/cli/chunks/{continuedev-installer-UAPWX6OA.js → continuedev-installer-4FSF7B3N.js} +2 -2
- package/dist/cli/chunks/{copilot-installer-BJN2YJGI.js → copilot-installer-A5GRQQUU.js} +2 -2
- package/dist/cli/chunks/core-handlers-C3H2ZCS2.js +2 -0
- package/dist/cli/chunks/{cost-tracker-MHP2VJ63.js → cost-tracker-Z4STQ5VB.js} +2 -2
- package/dist/cli/chunks/{coverage-PQB4IEFG.js → coverage-NUPP6KZZ.js} +3 -3
- package/dist/cli/chunks/cross-domain-router-JCQ7SWDP.js +2 -0
- package/dist/cli/chunks/{cursor-installer-ZXBWYAS3.js → cursor-installer-FVJ7ROPJ.js} +2 -2
- package/dist/cli/chunks/{daemon-N2BEGEFY.js → daemon-7ZZA2MMN.js} +4 -4
- package/dist/cli/chunks/{daemon-64C7R6OJ.js → daemon-D662EX5N.js} +3 -3
- package/dist/cli/chunks/{dag-attention-scheduler-SPZDAPNL.js → dag-attention-scheduler-IB4TQ2KA.js} +2 -2
- package/dist/cli/chunks/{detect-LXJBSSZW.js → detect-LGLBZN4I.js} +2 -2
- package/dist/cli/chunks/{dist-node-U3TKZ2IZ.js → dist-node-Z3OL42YE.js} +2 -2
- package/dist/cli/chunks/{domain-handler-3DDWUVSR.js → domain-handler-L3CLNL7U.js} +2 -2
- package/dist/cli/chunks/{domain-plugins-JJVWI4OQ.js → domain-plugins-GQ3V5X6L.js} +2 -2
- package/dist/cli/chunks/{domain-transfer-M36KUJ2U.js → domain-transfer-MFCI76IY.js} +2 -2
- package/dist/cli/chunks/dream-FTP33IJB.js +2 -0
- package/dist/cli/chunks/{embed-and-insert-pattern-JPAR7TXX.js → embed-and-insert-pattern-UGD6USYH.js} +2 -2
- package/dist/cli/chunks/{eval-SOLG23EA.js → eval-3B7UIYGY.js} +2 -2
- package/dist/cli/chunks/{experience-capture-middleware-T7G2VOOD.js → experience-capture-middleware-3RQ4NYY3.js} +3 -3
- package/dist/cli/chunks/{fast-paths-32N3ELI4.js → fast-paths-QOSAEPYD.js} +2 -2
- package/dist/cli/chunks/{feature-flags-NAHKLDRN.js → feature-flags-3S5TH6P4.js} +2 -2
- package/dist/cli/chunks/{feature-flags-APJDQ4N7.js → feature-flags-TLF4NKOH.js} +2 -2
- package/dist/cli/chunks/{file-discovery-YKVM3MDB.js → file-discovery-AEVMJRNB.js} +2 -2
- package/dist/cli/chunks/{fleet-55M5CJS4.js → fleet-E6WTXWFL.js} +3 -3
- package/dist/cli/chunks/{gnn-wrapper-UD6E6S6Z.js → gnn-wrapper-MCKH3AUU.js} +2 -2
- package/dist/cli/chunks/{heartbeat-handler-OYVW3VSC.js → heartbeat-handler-U7XENHRR.js} +4 -4
- package/dist/cli/chunks/heartbeat-scheduler-HXBJVJL2.js +2 -0
- package/dist/cli/chunks/hnsw-adapter-TU6WG2ME.js +2 -0
- package/dist/cli/chunks/hnsw-index-MS5KODD7.js +2 -0
- package/dist/cli/chunks/{hnsw-legacy-bridge-HBYIS3ZW.js → hnsw-legacy-bridge-5GW4SAEI.js} +2 -2
- package/dist/cli/chunks/{hnswlib-node-EQPM42OU.js → hnswlib-node-7BLZBK5T.js} +2 -2
- package/dist/cli/chunks/{hooks-5ZSSJWO6.js → hooks-F3O2SB6H.js} +10 -10
- package/dist/cli/chunks/hybrid-backend-HT45LBHC.js +2 -0
- package/dist/cli/chunks/{hypergraph-engine-XBGVQ4PD.js → hypergraph-engine-PV4EKXHB.js} +2 -2
- package/dist/cli/chunks/{hypergraph-handler-CAWAQ673.js → hypergraph-handler-VOWO5ZTW.js} +3 -3
- package/dist/cli/chunks/impact-analyzer-AP4AGTG5.js +2 -0
- package/dist/cli/chunks/{init-handler-PRHXSARK.js → init-handler-ENJ5ONJX.js} +16 -14
- package/dist/cli/chunks/init-wizard-I5DFZUQL.js +2 -0
- package/dist/cli/chunks/kernel-MISPSPPA.js +2 -0
- package/dist/cli/chunks/{kilocode-installer-F7LXBM7I.js → kilocode-installer-HNNJOOPE.js} +2 -2
- package/dist/cli/chunks/{kiro-installer-NM723ZRG.js → kiro-installer-UZBIQ3IC.js} +2 -2
- package/dist/cli/chunks/knowledge-graph-L26JESGE.js +2 -0
- package/dist/cli/chunks/{learning-5QYIDHH3.js → learning-YMLCVFUT.js} +3 -3
- package/dist/cli/chunks/{llm-router-43HKWPSX.js → llm-router-YWTARCCT.js} +4 -4
- package/dist/cli/chunks/llm-router-service-MWGC43ZA.js +2 -0
- package/dist/cli/chunks/{load-5YDBWSCS.js → load-DKE3F3IP.js} +2 -2
- package/dist/cli/chunks/load-test-H5ISNNM5.js +2 -0
- package/dist/cli/chunks/{mcp-UMAPMNMY.js → mcp-5PSGIUCW.js} +2 -2
- package/dist/cli/chunks/{memory-FWCPCQFP.js → memory-3L3O6JMM.js} +5 -5
- package/dist/cli/chunks/memory-backend-HWDNOBKW.js +2 -0
- package/dist/cli/chunks/memory-handlers-ZFDVQZM5.js +2 -0
- package/dist/cli/chunks/{multi-model-executor-2XTBGLE4.js → multi-model-executor-AEEO7IA4.js} +2 -2
- package/dist/cli/chunks/{opencode-installer-GIXOJ6NS.js → opencode-installer-ABBO355U.js} +2 -2
- package/dist/cli/chunks/{orchestrator-VW6BKHLI.js → orchestrator-E36Q7MKE.js} +17 -17
- package/dist/cli/chunks/pattern-null-store-GQP6ICWK.js +2 -0
- package/dist/cli/chunks/{pattern-usage-recorder-7CEUC3J7.js → pattern-usage-recorder-H4XKSID4.js} +2 -2
- package/dist/cli/chunks/{pipeline-IGUQPPPO.js → pipeline-BGFEHXIN.js} +2 -2
- package/dist/cli/chunks/{platform-2P636I7B.js → platform-GK7ZVDJI.js} +2 -2
- package/dist/cli/chunks/{plugin-NY6SWDPE.js → plugin-CAH2CKI6.js} +2 -2
- package/dist/cli/chunks/{prime-radiant-advanced-wasm-2UUDTIO2.js → prime-radiant-advanced-wasm-M5EYRONA.js} +2 -2
- package/dist/cli/chunks/{project-root-IOISG5KX.js → project-root-BSNZC243.js} +2 -2
- package/dist/cli/chunks/protocol-executor-AD5A4DAI.js +2 -0
- package/dist/cli/chunks/{protocol-handler-ZTPCRQ5W.js → protocol-handler-JDSSC2SF.js} +2 -2
- package/dist/cli/chunks/{prove-SQX5A3IG.js → prove-ANPTOZJE.js} +2 -2
- package/dist/cli/chunks/qe-reasoning-bank-W3Z2PKTR.js +2 -0
- package/dist/cli/chunks/{quality-DROILKRY.js → quality-SXWGYRQR.js} +2 -2
- package/dist/cli/chunks/{quality-gate-PWKWDJY2.js → quality-gate-GYNCA4ZY.js} +3 -3
- package/dist/cli/chunks/queen-coordinator-HQRHLIJX.js +2 -0
- package/dist/cli/chunks/{real-embeddings-P5U3MGYC.js → real-embeddings-WSRYAOZM.js} +2 -2
- package/dist/cli/chunks/{ref-validation-KY73NQXD.js → ref-validation-AZ3LRWEK.js} +2 -2
- package/dist/cli/chunks/{roocode-installer-6JPPRB3W.js → roocode-installer-2QKGFIEU.js} +2 -2
- package/dist/cli/chunks/router-MTP5LH4H.js +2 -0
- package/dist/cli/chunks/routing-feedback-GWETVB4L.js +2 -0
- package/dist/cli/chunks/{routing-handler-VTJIVFUO.js → routing-handler-UYDC5MMD.js} +2 -2
- package/dist/cli/chunks/{ruvector-commands-C6RPSJJO.js → ruvector-commands-QXADPVEY.js} +2 -2
- package/dist/cli/chunks/rvf-dual-writer-4UE5S7WP.js +2 -0
- package/dist/cli/chunks/rvf-migration-adapter-PHH3HF4Q.js +2 -0
- package/dist/cli/chunks/{rvf-migration-coordinator-R53URRIO.js → rvf-migration-coordinator-GD4NBFKT.js} +2 -2
- package/dist/cli/chunks/rvf-native-adapter-KTLZBUWV.js +2 -0
- package/dist/cli/chunks/{rvf-store-integrity-MMXN5TEJ.js → rvf-store-integrity-7SXG66IL.js} +2 -2
- package/dist/cli/chunks/safe-db-FWWGAPVE.js +2 -0
- package/dist/cli/chunks/schedule-TPA4V4D5.js +2 -0
- package/dist/cli/chunks/scheduler-5ZTEPNDD.js +2 -0
- package/dist/cli/chunks/{security-3B3R2NL4.js → security-YKB622PK.js} +3 -3
- package/dist/cli/chunks/{shared-rvf-adapter-VIJB7JUS.js → shared-rvf-adapter-KMLAV7JK.js} +2 -2
- package/dist/cli/chunks/{shared-rvf-dual-writer-UVWGDUWC.js → shared-rvf-dual-writer-OYY27DFV.js} +2 -2
- package/dist/cli/chunks/sqlite-persistence-HPTT624C.js +2 -0
- package/dist/cli/chunks/{standalone-memory-M4LWAAYZ.js → standalone-memory-2DOABVLC.js} +2 -2
- package/dist/cli/chunks/{status-handler-YYFV6OZL.js → status-handler-EXRKETV7.js} +2 -2
- package/dist/cli/chunks/{structural-health-27E6LLKB.js → structural-health-2SKK6DU6.js} +2 -2
- package/dist/cli/chunks/sync-DQ2YUNI6.js +2 -0
- package/dist/cli/chunks/{sync-J3LJ56WN.js → sync-UW7SX7GO.js} +2 -2
- package/dist/cli/chunks/{task-handler-4MCEBQZL.js → task-handler-LYQ6WYUY.js} +2 -2
- package/dist/cli/chunks/task-handlers-DIJO232S.js +9 -0
- package/dist/cli/chunks/test-WRHZMUCW.js +33 -0
- package/dist/cli/chunks/{test-scheduling-ZJBFRZ3J.js → test-scheduling-HI23RXFK.js} +3 -3
- package/dist/cli/chunks/token-bootstrap-23SA6SWZ.js +2 -0
- package/dist/cli/chunks/{token-usage-3X5WMTG2.js → token-usage-M7RRDPXO.js} +2 -2
- package/dist/cli/chunks/{transformers-MVL4C5IX.js → transformers-4TC35KKS.js} +2 -2
- package/dist/cli/chunks/{tree-sitter-wasm-parser-SLW65ZFO.js → tree-sitter-wasm-parser-F4LTKAWD.js} +2 -2
- package/dist/cli/chunks/{types-TG5P3CRS.js → types-NBXV6LXQ.js} +2 -2
- package/dist/cli/chunks/unified-memory-OVFEPRPS.js +2 -0
- package/dist/cli/chunks/unified-memory-hnsw-KKRSCZHR.js +2 -0
- package/dist/cli/chunks/unified-persistence-7GLR4RI3.js +2 -0
- package/dist/cli/chunks/{upgrade-ETBHDEPY.js → upgrade-4BGOU5RM.js} +2 -2
- package/dist/cli/chunks/{validate-C2A73LZK.js → validate-EDWAR63H.js} +2 -2
- package/dist/cli/chunks/{validate-swarm-67XN42ML.js → validate-swarm-VI72CPR7.js} +2 -2
- package/dist/cli/chunks/visual-security-2FUM5GLI.js +2 -0
- package/dist/cli/chunks/{web-tree-sitter-USJN77P4.js → web-tree-sitter-Y5XBRQXF.js} +2 -2
- package/dist/cli/chunks/{windsurf-installer-5GGZXGJW.js → windsurf-installer-VEX23WAF.js} +2 -2
- package/dist/cli/chunks/{witness-chain-IWS5ZHHL.js → witness-chain-3YNL6YGY.js} +2 -2
- package/dist/cli/chunks/witness-chain-MH6GA5L6.js +2 -0
- package/dist/cli/chunks/witness-chain-repair-MJZGZRWT.js +2 -0
- package/dist/cli/chunks/{witness-chain-verifier-3GEADWPE.js → witness-chain-verifier-TTJYXTBE.js} +2 -2
- package/dist/cli/chunks/{witness-key-manager-ZWEIK3VJ.js → witness-key-manager-EM6YXYOY.js} +2 -2
- package/dist/cli/chunks/{workflow-KHMVVBBA.js → workflow-2RBDOM7V.js} +4 -4
- package/dist/cli/chunks/workflow-orchestrator-H6G65YKU.js +2 -0
- package/dist/cli/chunks/wrappers-5OTAVVOV.js +2 -0
- package/dist/cli/commands/ci.js +1 -1
- package/dist/cli/commands/test.js +18 -3
- package/dist/cli/handlers/init-handler.d.ts +2 -0
- package/dist/cli/handlers/init-handler.js +8 -2
- package/dist/cli/index.js +8 -0
- package/dist/coordination/handlers/test-execution-handlers.js +13 -8
- package/dist/coordination/index.d.ts +1 -1
- package/dist/coordination/queen-event-handlers.js +9 -6
- package/dist/coordination/result-saver.js +1 -1
- package/dist/coordination/services/index.d.ts +1 -1
- package/dist/coordination/services/task-audit-logger.d.ts +38 -13
- package/dist/coordination/services/task-audit-logger.js +33 -5
- package/dist/coordination/task-executor.d.ts +5 -0
- package/dist/coordination/task-executor.js +10 -5
- package/dist/domains/test-generation/coordinator.js +6 -5
- package/dist/domains/test-generation/interfaces.d.ts +11 -1
- package/dist/domains/test-generation/services/behavior-example-validation.d.ts +36 -0
- package/dist/domains/test-generation/services/behavior-example-validation.js +89 -0
- package/dist/domains/test-generation/services/behavior-examples.d.ts +8 -0
- package/dist/domains/test-generation/services/behavior-examples.js +65 -0
- package/dist/domains/test-generation/services/test-generator.d.ts +1 -1
- package/dist/domains/test-generation/services/test-generator.js +59 -30
- package/dist/domains/visual-accessibility/services/axe-core-audit.d.ts +0 -15
- package/dist/domains/visual-accessibility/services/axe-core-audit.js +12 -10
- package/dist/init/browser-engine-installer.d.ts +5 -5
- package/dist/init/browser-engine-installer.js +28 -6
- package/dist/init/init-wizard.d.ts +2 -0
- package/dist/init/orchestrator.js +1 -0
- package/dist/init/phases/09-assets.js +8 -18
- package/dist/init/phases/phase-interface.d.ts +2 -0
- package/dist/integrations/agentic-flow/reasoning-bank/index.d.ts +2 -5
- package/dist/integrations/vibium/client.d.ts +1 -0
- package/dist/integrations/vibium/client.js +24 -11
- package/dist/integrations/vibium/runtime.d.ts +14 -0
- package/dist/integrations/vibium/runtime.js +94 -0
- package/dist/kernel/pattern-fts-self-heal.d.ts +63 -0
- package/dist/kernel/pattern-fts-self-heal.js +193 -0
- package/dist/kernel/process-lifecycle.d.ts +60 -0
- package/dist/kernel/process-lifecycle.js +91 -0
- package/dist/kernel/unified-memory-schemas.d.ts +15 -1
- package/dist/kernel/unified-memory-schemas.js +53 -25
- package/dist/kernel/unified-memory.js +31 -34
- package/dist/kernel/unified-persistence.js +12 -6
- package/dist/learning/experience-capture.d.ts +2 -1
- package/dist/learning/experience-capture.js +23 -8
- package/dist/learning/pattern-store.d.ts +1 -1
- package/dist/learning/pattern-store.js +27 -30
- package/dist/learning/qe-patterns.d.ts +6 -0
- package/dist/learning/qe-reasoning-bank.d.ts +1 -0
- package/dist/learning/qe-reasoning-bank.js +14 -4
- package/dist/learning/real-qe-reasoning-bank.d.ts +9 -4
- package/dist/learning/real-qe-reasoning-bank.js +28 -4
- package/dist/learning/rvf-pattern-store.js +19 -19
- package/dist/learning/sqlite-persistence.js +9 -24
- package/dist/mcp/bundle.js +508 -545
- package/dist/mcp/entry.js +52 -6
- package/dist/mcp/handlers/domain-handler-configs.js +12 -4
- package/dist/mcp/handlers/task-handlers.js +11 -7
- package/dist/mcp/protocol-server.js +18 -3
- package/dist/mcp/services/reasoning-bank-service.d.ts +6 -1
- package/dist/mcp/services/reasoning-bank-service.js +5 -1
- package/dist/mcp/tools/test-execution/e2e-execute.js +9 -1
- package/dist/mcp/tools/test-generation/generate.d.ts +6 -1
- package/dist/mcp/tools/test-generation/generate.js +8 -0
- package/dist/mcp/types.d.ts +6 -2
- package/dist/shared/error-utils.d.ts +15 -0
- package/dist/shared/error-utils.js +21 -0
- package/dist/shared/events/domain-events.d.ts +2 -1
- package/package.json +10 -6
- package/dist/cli/chunks/adapter-UYOJPTOX.js +0 -2
- package/dist/cli/chunks/aqe-learning-engine-JR5AVQXR.js +0 -2
- package/dist/cli/chunks/base-DRZ2LS6X.js +0 -2
- package/dist/cli/chunks/browser-workflow-CJ7T3MXF.js +0 -2
- package/dist/cli/chunks/chunk-4N23RFDU.js +0 -2
- package/dist/cli/chunks/chunk-AHKELLIO.js +0 -12
- package/dist/cli/chunks/chunk-MJS53PRX.js +0 -2
- package/dist/cli/chunks/chunk-PZPWRQ2M.js +0 -21
- package/dist/cli/chunks/chunk-QGA55PFM.js +0 -12
- package/dist/cli/chunks/chunk-TCHGOB2N.js +0 -2
- package/dist/cli/chunks/chunk-Z6GGIRQQ.js +0 -65
- package/dist/cli/chunks/client-KHWJT6FB.js +0 -2
- package/dist/cli/chunks/core-handlers-HING5RRG.js +0 -2
- package/dist/cli/chunks/cross-domain-router-PQTD6AZN.js +0 -2
- package/dist/cli/chunks/dream-WUGRSNCV.js +0 -2
- package/dist/cli/chunks/heartbeat-scheduler-33XX5XNQ.js +0 -2
- package/dist/cli/chunks/hnsw-adapter-XQPERX3H.js +0 -2
- package/dist/cli/chunks/hnsw-index-2GNXTWHH.js +0 -2
- package/dist/cli/chunks/hybrid-backend-CCF7URKI.js +0 -2
- package/dist/cli/chunks/impact-analyzer-HGKAZWIG.js +0 -2
- package/dist/cli/chunks/init-wizard-72MFBI3G.js +0 -2
- package/dist/cli/chunks/kernel-BRCBVMSK.js +0 -2
- package/dist/cli/chunks/knowledge-graph-DG44IPEI.js +0 -2
- package/dist/cli/chunks/llm-router-service-24KXFX32.js +0 -2
- package/dist/cli/chunks/load-test-N4TAYJY3.js +0 -2
- package/dist/cli/chunks/memory-backend-NVYFYVAU.js +0 -2
- package/dist/cli/chunks/memory-handlers-UTWCNCHL.js +0 -2
- package/dist/cli/chunks/pattern-null-store-SBPNYDBR.js +0 -2
- package/dist/cli/chunks/protocol-executor-IBYEII5Q.js +0 -2
- package/dist/cli/chunks/qe-reasoning-bank-7IETWW6W.js +0 -2
- package/dist/cli/chunks/queen-coordinator-NHUK2MWJ.js +0 -2
- package/dist/cli/chunks/router-SRSO3IHF.js +0 -2
- package/dist/cli/chunks/routing-feedback-PASRE5HY.js +0 -2
- package/dist/cli/chunks/rvf-dual-writer-4M4J67OU.js +0 -2
- package/dist/cli/chunks/rvf-migration-adapter-TSXGT5LF.js +0 -2
- package/dist/cli/chunks/rvf-native-adapter-MOF3E7BR.js +0 -2
- package/dist/cli/chunks/safe-db-QJLFO33B.js +0 -2
- package/dist/cli/chunks/schedule-YIVXW5O2.js +0 -2
- package/dist/cli/chunks/scheduler-AON7DWSJ.js +0 -2
- package/dist/cli/chunks/sqlite-persistence-75VHKKQB.js +0 -2
- package/dist/cli/chunks/sync-26CEGSTC.js +0 -2
- package/dist/cli/chunks/task-handlers-GYBAWKE2.js +0 -9
- package/dist/cli/chunks/test-MPC5HRH5.js +0 -33
- package/dist/cli/chunks/token-bootstrap-2Y2XITBX.js +0 -2
- package/dist/cli/chunks/unified-memory-UCQ6AB32.js +0 -2
- package/dist/cli/chunks/unified-memory-hnsw-IXYUMKRR.js +0 -2
- package/dist/cli/chunks/unified-persistence-7E6JQ4FZ.js +0 -2
- package/dist/cli/chunks/vibium-NILGKHLN.js +0 -2
- package/dist/cli/chunks/visual-security-4VZXPEVG.js +0 -2
- package/dist/cli/chunks/witness-chain-JQA2VPZI.js +0 -2
- package/dist/cli/chunks/witness-chain-repair-4UA7IPS3.js +0 -2
- package/dist/cli/chunks/workflow-orchestrator-GI5NQH7C.js +0 -2
- package/dist/cli/chunks/wrappers-N6XIK5PT.js +0 -2
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import ts from 'typescript';
|
|
2
|
+
import { CallerInputError } from '../../../shared/error-utils.js';
|
|
3
|
+
import { assertBehaviorJsonValue, validateBehaviorExamples } from './behavior-example-validation.js';
|
|
4
|
+
/** JSON-only data is emitted as a parsed string, never interpolated as source. */
|
|
5
|
+
function literal(value) {
|
|
6
|
+
assertBehaviorJsonValue(value);
|
|
7
|
+
return `JSON.parse(${JSON.stringify(JSON.stringify(value))})`;
|
|
8
|
+
}
|
|
9
|
+
export function generateBehaviorExamples(source, sourceFile, importPath, framework, examples, testType) {
|
|
10
|
+
const supported = ['vitest', 'jest', 'node-test'].includes(framework) && testType === 'unit';
|
|
11
|
+
const ast = ts.createSourceFile(sourceFile, source, ts.ScriptTarget.Latest, true);
|
|
12
|
+
const diagnostics = ast.parseDiagnostics;
|
|
13
|
+
if (diagnostics.length)
|
|
14
|
+
throw new CallerInputError('Cannot generate behavior examples from syntactically invalid source');
|
|
15
|
+
const exports = new Map();
|
|
16
|
+
for (const node of ast.statements) {
|
|
17
|
+
if (!ts.canHaveModifiers(node) || !ts.getModifiers(node)?.some(m => m.kind === ts.SyntaxKind.ExportKeyword))
|
|
18
|
+
continue;
|
|
19
|
+
if (ts.getModifiers(node)?.some(m => m.kind === ts.SyntaxKind.DefaultKeyword))
|
|
20
|
+
continue;
|
|
21
|
+
const add = (name, fn) => {
|
|
22
|
+
if (fn.body && !fn.asteriskToken && fn.parameters.every(p => ts.isIdentifier(p.name) && p.name.text !== 'this' && !p.dotDotDotToken && !p.questionToken && !p.initializer))
|
|
23
|
+
exports.set(name, fn.parameters.length);
|
|
24
|
+
};
|
|
25
|
+
if (ts.isFunctionDeclaration(node) && node.name)
|
|
26
|
+
add(node.name.text, node);
|
|
27
|
+
if (ts.isVariableStatement(node))
|
|
28
|
+
for (const decl of node.declarationList.declarations) {
|
|
29
|
+
if (ts.isIdentifier(decl.name) && decl.initializer && (ts.isArrowFunction(decl.initializer) || ts.isFunctionExpression(decl.initializer)))
|
|
30
|
+
add(decl.name.text, decl.initializer);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
validateBehaviorExamples(examples);
|
|
34
|
+
if (examples?.length && !supported)
|
|
35
|
+
throw new CallerInputError('Behavior examples support unit tests with vitest, jest, or node-test only');
|
|
36
|
+
const limits = [];
|
|
37
|
+
if (importPath === './module-under-test')
|
|
38
|
+
limits.push('Inline source: save the source and replace ./module-under-test with its real import path before running.');
|
|
39
|
+
const lines = [framework === 'node-test' ? "import { test } from 'node:test';\nimport assert from 'node:assert/strict';" : framework === 'vitest' ? "import { test, expect } from 'vitest';" : "import { test, expect } from '@jest/globals';"];
|
|
40
|
+
if (!examples?.length) {
|
|
41
|
+
limits.push('Scaffolding only: supply behaviorExamples from a specification or trusted fixtures. No behavior or coverage has been verified.');
|
|
42
|
+
lines.push(`test.skip('Scaffolding: behaviorExamples required for ${exports.size} supported named exports', () => {});`);
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
lines.push(`import * as subject from ${JSON.stringify(importPath)};`);
|
|
46
|
+
for (const [index, example] of examples.entries()) {
|
|
47
|
+
if (!example || typeof example.functionName !== 'string' || !exports.has(example.functionName))
|
|
48
|
+
throw new CallerInputError(`Behavior example ${index + 1} must target a named exported function with required simple parameters; '${String(example?.functionName)}' is not one (supported: ${[...exports.keys()].join(', ') || 'none'})`);
|
|
49
|
+
if (!Array.isArray(example.args) || example.args.length !== exports.get(example.functionName))
|
|
50
|
+
throw new CallerInputError(`Behavior example argument count does not match ${example.functionName}`);
|
|
51
|
+
if (!Object.prototype.hasOwnProperty.call(example, 'expected'))
|
|
52
|
+
throw new CallerInputError('Behavior example requires an explicit expected value');
|
|
53
|
+
const call = `await subject[${JSON.stringify(example.functionName)}](${Array.from(example.args).map(a => literal(a)).join(', ')})`;
|
|
54
|
+
const assertion = framework === 'node-test' ? `assert.deepStrictEqual(${call}, ${literal(example.expected)});` : `expect(${call}).toStrictEqual(${literal(example.expected)});`;
|
|
55
|
+
lines.push(`test(${JSON.stringify(`${example.functionName}: specification example ${index + 1}`)}, async () => { ${assertion} });`);
|
|
56
|
+
}
|
|
57
|
+
const uncovered = [...exports.keys()].filter(name => !examples.some(e => e.functionName === name));
|
|
58
|
+
if (uncovered.length)
|
|
59
|
+
limits.push(`No supplied behavior examples for: ${uncovered.join(', ')}`);
|
|
60
|
+
limits.push('Only supplied examples are asserted; coverage is unmeasured. Re-exports, default exports, classes, rest/default/destructured/optional parameters and thrown-error specifications are unsupported.');
|
|
61
|
+
}
|
|
62
|
+
return { code: `// ${limits.join('\n// ')}\n${lines.join('\n')}\n`, limits, assertions: examples?.length ?? 0,
|
|
63
|
+
mode: examples?.length ? 'behavior-examples' : 'scaffolding' };
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=behavior-examples.js.map
|
|
@@ -70,6 +70,7 @@ export declare class TestGeneratorService implements ITestGenerationService {
|
|
|
70
70
|
private readonly config;
|
|
71
71
|
private readonly memory;
|
|
72
72
|
private readonly generatorFactory;
|
|
73
|
+
private readonly usesDefaultGenerator;
|
|
73
74
|
private readonly tddGenerator;
|
|
74
75
|
private readonly propertyTestGenerator;
|
|
75
76
|
private readonly testDataGenerator;
|
|
@@ -164,7 +165,6 @@ export declare class TestGeneratorService implements ITestGenerationService {
|
|
|
164
165
|
private extractModuleName;
|
|
165
166
|
private getImportPath;
|
|
166
167
|
private countAssertions;
|
|
167
|
-
private estimateCoverage;
|
|
168
168
|
private storeGenerationMetadata;
|
|
169
169
|
}
|
|
170
170
|
/**
|
|
@@ -6,13 +6,15 @@
|
|
|
6
6
|
* Uses TypeScript AST parser for code analysis
|
|
7
7
|
* Delegates to specialized services for TDD, property tests, and test data
|
|
8
8
|
*/
|
|
9
|
+
import { generateBehaviorExamples } from './behavior-examples.js';
|
|
10
|
+
import { validateBehaviorExamples } from './behavior-example-validation.js';
|
|
9
11
|
import { LoggerFactory } from '../../../logging/index.js';
|
|
10
12
|
import { v4 as uuidv4 } from 'uuid';
|
|
11
13
|
import * as fs from 'fs';
|
|
12
14
|
import * as path from 'path';
|
|
13
15
|
import ts from 'typescript';
|
|
14
16
|
import { ok, err } from '../../../shared/types/index.js';
|
|
15
|
-
import { toErrorMessage } from '../../../shared/error-utils.js';
|
|
17
|
+
import { CallerInputError, toErrorMessage } from '../../../shared/error-utils.js';
|
|
16
18
|
import { TestGeneratorFactory } from '../factories/test-generator-factory.js';
|
|
17
19
|
import { TDDGeneratorService } from './tdd-generator.js';
|
|
18
20
|
import { PropertyTestGeneratorService } from './property-test-generator.js';
|
|
@@ -83,6 +85,7 @@ export class TestGeneratorService {
|
|
|
83
85
|
config;
|
|
84
86
|
memory;
|
|
85
87
|
generatorFactory;
|
|
88
|
+
usesDefaultGenerator;
|
|
86
89
|
tddGenerator;
|
|
87
90
|
propertyTestGenerator;
|
|
88
91
|
testDataGenerator;
|
|
@@ -92,6 +95,7 @@ export class TestGeneratorService {
|
|
|
92
95
|
constructor(dependencies, config = {}) {
|
|
93
96
|
this.config = { ...DEFAULT_CONFIG, ...config };
|
|
94
97
|
this.memory = dependencies.memory;
|
|
98
|
+
this.usesDefaultGenerator = !dependencies.generatorFactory;
|
|
95
99
|
this.generatorFactory = dependencies.generatorFactory || new TestGeneratorFactory();
|
|
96
100
|
this.tddGenerator = dependencies.tddGenerator || new TDDGeneratorService();
|
|
97
101
|
this.propertyTestGenerator = dependencies.propertyTestGenerator || new PropertyTestGeneratorService();
|
|
@@ -123,11 +127,11 @@ export class TestGeneratorService {
|
|
|
123
127
|
* Enhance generated test code using LLM
|
|
124
128
|
* Adds edge cases, improves assertions, and adds documentation
|
|
125
129
|
*/
|
|
126
|
-
async enhanceTestWithLLM(testCode, sourceCode, analysis, sourceFilePath, context) {
|
|
130
|
+
async enhanceTestWithLLM(testCode, sourceCode, analysis, sourceFilePath, context, showSourcePath = true) {
|
|
127
131
|
if (!this.llmRouter)
|
|
128
132
|
return { code: testCode, enhanced: false };
|
|
129
133
|
try {
|
|
130
|
-
let prompt = this.buildTestEnhancementPrompt(testCode, sourceCode, analysis);
|
|
134
|
+
let prompt = this.buildTestEnhancementPrompt(testCode, sourceCode, analysis, showSourcePath ? sourceFilePath : undefined, context?.importPath);
|
|
131
135
|
// Prepend historical edge case patterns if injector is available (loki-mode Item 5)
|
|
132
136
|
if (this.edgeCaseInjector) {
|
|
133
137
|
try {
|
|
@@ -223,8 +227,17 @@ Return ONLY the enhanced test code, no explanations.`,
|
|
|
223
227
|
/**
|
|
224
228
|
* Build prompt for test enhancement
|
|
225
229
|
*/
|
|
226
|
-
buildTestEnhancementPrompt(testCode, sourceCode, analysis) {
|
|
227
|
-
let prompt =
|
|
230
|
+
buildTestEnhancementPrompt(testCode, sourceCode, analysis, sourceFilePath, importPath) {
|
|
231
|
+
let prompt = '';
|
|
232
|
+
if (sourceFilePath || importPath) {
|
|
233
|
+
prompt += '## Module Under Test:\n';
|
|
234
|
+
if (sourceFilePath)
|
|
235
|
+
prompt += `- Source file: ${sourceFilePath}\n`;
|
|
236
|
+
if (importPath)
|
|
237
|
+
prompt += `- Import it in the tests from: '${importPath}'\n`;
|
|
238
|
+
prompt += '\n';
|
|
239
|
+
}
|
|
240
|
+
prompt += `## Source Code to Test:\n\`\`\`typescript\n${sourceCode}\n\`\`\`\n\n`;
|
|
228
241
|
prompt += `## Current Test Code:\n\`\`\`typescript\n${testCode}\n\`\`\`\n\n`;
|
|
229
242
|
if (analysis) {
|
|
230
243
|
if (analysis.functions.length > 0) {
|
|
@@ -303,6 +316,8 @@ Return a JSON array of test suggestions, each with: { "name": "test name", "desc
|
|
|
303
316
|
*/
|
|
304
317
|
async generateTests(request) {
|
|
305
318
|
try {
|
|
319
|
+
// Throws CallerInputError (caught below) for malformed examples.
|
|
320
|
+
validateBehaviorExamples(request.behaviorExamples);
|
|
306
321
|
// Auto-detect language and framework if not provided (ADR-078)
|
|
307
322
|
const resolved = resolveRequest({
|
|
308
323
|
sourceFiles: request.sourceFiles,
|
|
@@ -312,7 +327,10 @@ Return a JSON array of test suggestions, each with: { "name": "test name", "desc
|
|
|
312
327
|
});
|
|
313
328
|
const effectiveFramework = (request.framework || resolved?.framework || 'vitest');
|
|
314
329
|
const effectiveLanguage = request.language || resolved?.language;
|
|
315
|
-
const { sourceFiles, testType,
|
|
330
|
+
const { sourceFiles, testType, patterns = [], } = request;
|
|
331
|
+
if (request.behaviorExamples?.length && sourceFiles.length !== 1) {
|
|
332
|
+
return err(new CallerInputError('behaviorExamples requires exactly one source file'));
|
|
333
|
+
}
|
|
316
334
|
if (sourceFiles.length === 0) {
|
|
317
335
|
return err(new Error('No source files provided'));
|
|
318
336
|
}
|
|
@@ -335,7 +353,9 @@ Return a JSON array of test suggestions, each with: { "name": "test name", "desc
|
|
|
335
353
|
}
|
|
336
354
|
}
|
|
337
355
|
}
|
|
338
|
-
|
|
356
|
+
// Generation does not execute or instrument the source. Assertion counts
|
|
357
|
+
// are not coverage evidence, including LLM-generated and empty results.
|
|
358
|
+
const coverageEstimate = null;
|
|
339
359
|
await this.storeGenerationMetadata(tests, patternsUsed);
|
|
340
360
|
return ok({
|
|
341
361
|
tests,
|
|
@@ -458,16 +478,41 @@ Return a JSON array of test suggestions, each with: { "name": "test name", "desc
|
|
|
458
478
|
dependencies,
|
|
459
479
|
similarCode,
|
|
460
480
|
};
|
|
461
|
-
|
|
462
|
-
|
|
481
|
+
const hasExamples = (originalRequest?.behaviorExamples?.length ?? 0) > 0;
|
|
482
|
+
const jsSource = /\.(?:[cm]?[jt]s|[jt]sx)$/i.test(sourceFile);
|
|
483
|
+
const deterministicEligible = (this.usesDefaultGenerator || hasExamples)
|
|
484
|
+
&& testType === 'unit' && jsSource && ['vitest', 'jest', 'node-test'].includes(framework);
|
|
485
|
+
if (hasExamples && !deterministicEligible) {
|
|
486
|
+
throw new CallerInputError('Behavior examples require JavaScript/TypeScript and vitest, jest, or node-test');
|
|
487
|
+
}
|
|
488
|
+
const buildDeterministic = () => generateBehaviorExamples(sourceContent, sourceFile, originalRequest?.importPathOverrides?.[sourceFile] ?? path.resolve(sourceFile), framework, originalRequest?.behaviorExamples, testType);
|
|
489
|
+
// ADR-051: Enhance with LLM if enabled and available. Caller-supplied
|
|
490
|
+
// behavior examples are the oracle, so they are never rewritten by an LLM.
|
|
463
491
|
// #567: `llmEnhanced` reflects whether the LLM actually produced the code,
|
|
464
492
|
// not merely whether a router was configured — a broken provider must not
|
|
465
493
|
// report AI-enhanced output it did not produce.
|
|
494
|
+
const willEnhance = this.isLLMEnhancementAvailable() && !!sourceContent && !hasExamples;
|
|
495
|
+
// #795: without fixtures the LLM must start from the framework template,
|
|
496
|
+
// which carries the real import line for the module under test. The
|
|
497
|
+
// zero-assertion scaffold is only emitted when no LLM output is used.
|
|
498
|
+
let deterministic = deterministicEligible && !willEnhance ? buildDeterministic() : undefined;
|
|
499
|
+
let testCode = deterministic?.code ?? generator.generateTests(context);
|
|
466
500
|
let llmEnhanced = false;
|
|
467
|
-
if (
|
|
468
|
-
|
|
469
|
-
|
|
501
|
+
if (willEnhance) {
|
|
502
|
+
// An import override means `sourceFile` is a stand-in (the MCP handler's
|
|
503
|
+
// /tmp/aqe-temp-* copy of inline source). Do not show the LLM that path:
|
|
504
|
+
// it could echo it into the test in a form the temp-path rewrite misses.
|
|
505
|
+
const result = await this.enhanceTestWithLLM(testCode, sourceContent, codeAnalysis, sourceFile, context, originalRequest?.importPathOverrides?.[sourceFile] === undefined);
|
|
470
506
|
llmEnhanced = result.enhanced;
|
|
507
|
+
if (llmEnhanced) {
|
|
508
|
+
testCode = result.code;
|
|
509
|
+
}
|
|
510
|
+
else if (deterministicEligible) {
|
|
511
|
+
// The LLM produced nothing usable: fall back to the honest scaffold,
|
|
512
|
+
// never to template assertions with guessed expected values (#787).
|
|
513
|
+
deterministic = buildDeterministic();
|
|
514
|
+
testCode = deterministic.code;
|
|
515
|
+
}
|
|
471
516
|
}
|
|
472
517
|
const test = {
|
|
473
518
|
id: uuidv4(),
|
|
@@ -476,7 +521,8 @@ Return a JSON array of test suggestions, each with: { "name": "test name", "desc
|
|
|
476
521
|
testFile,
|
|
477
522
|
testCode,
|
|
478
523
|
type: testType,
|
|
479
|
-
assertions: this.countAssertions(testCode),
|
|
524
|
+
assertions: deterministic && !llmEnhanced ? deterministic.assertions : this.countAssertions(testCode),
|
|
525
|
+
...(!llmEnhanced && deterministic ? { generationMode: deterministic.mode, generationLimits: deterministic.limits } : {}),
|
|
480
526
|
// ADR-078: Include detected language and framework
|
|
481
527
|
language: effectiveLanguage,
|
|
482
528
|
framework: framework,
|
|
@@ -976,23 +1022,6 @@ Return a JSON array of test suggestions, each with: { "name": "test name", "desc
|
|
|
976
1022
|
}
|
|
977
1023
|
return Math.max(1, count);
|
|
978
1024
|
}
|
|
979
|
-
estimateCoverage(tests, target) {
|
|
980
|
-
const totalAssertions = tests.reduce((sum, t) => sum + t.assertions, 0);
|
|
981
|
-
const totalTests = tests.length;
|
|
982
|
-
const testBasedCoverage = totalTests * 4;
|
|
983
|
-
const assertionCoverage = totalAssertions * 1.5;
|
|
984
|
-
const typeMultiplier = tests.reduce((mult, t) => {
|
|
985
|
-
if (t.type === 'integration')
|
|
986
|
-
return mult + 0.1;
|
|
987
|
-
if (t.type === 'e2e')
|
|
988
|
-
return mult + 0.15;
|
|
989
|
-
return mult;
|
|
990
|
-
}, 1);
|
|
991
|
-
const rawEstimate = (testBasedCoverage + assertionCoverage) * typeMultiplier;
|
|
992
|
-
const diminishedEstimate = rawEstimate * (1 - rawEstimate / 200);
|
|
993
|
-
const estimatedCoverage = Math.min(target, Math.max(0, diminishedEstimate));
|
|
994
|
-
return Math.round(estimatedCoverage * 10) / 10;
|
|
995
|
-
}
|
|
996
1025
|
async storeGenerationMetadata(tests, patterns) {
|
|
997
1026
|
const metadata = {
|
|
998
1027
|
generatedAt: new Date().toISOString(),
|
|
@@ -1,18 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Agentic QE v3 - Axe-Core Accessibility Audit
|
|
3
|
-
*
|
|
4
|
-
* Lightweight implementation using vibium + axe-core for accessibility testing.
|
|
5
|
-
* Vibium provides browser automation via WebDriver BiDi (~202KB),
|
|
6
|
-
* axe-core provides accessibility rules (~3MB).
|
|
7
|
-
*
|
|
8
|
-
* Features:
|
|
9
|
-
* - WCAG 2.0/2.1/2.2 compliance testing
|
|
10
|
-
* - Section 508 compliance
|
|
11
|
-
* - Best practices validation
|
|
12
|
-
* - Custom rule configuration
|
|
13
|
-
*
|
|
14
|
-
* @module visual-accessibility/axe-core-audit
|
|
15
|
-
*/
|
|
16
1
|
/**
|
|
17
2
|
* WCAG conformance levels
|
|
18
3
|
*/
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { loadVibium, isVibiumReady, VIBIUM_SETUP } from '../../../integrations/vibium/runtime.js';
|
|
1
2
|
/**
|
|
2
3
|
* Agentic QE v3 - Axe-Core Accessibility Audit
|
|
3
4
|
*
|
|
@@ -83,8 +84,8 @@ export class AccessibilityAuditor {
|
|
|
83
84
|
}
|
|
84
85
|
// Check for vibium
|
|
85
86
|
try {
|
|
86
|
-
await
|
|
87
|
-
this.toolsAvailable.vibium =
|
|
87
|
+
await loadVibium();
|
|
88
|
+
this.toolsAvailable.vibium = isVibiumReady();
|
|
88
89
|
}
|
|
89
90
|
catch {
|
|
90
91
|
this.toolsAvailable.vibium = false;
|
|
@@ -138,11 +139,12 @@ export class AccessibilityAuditor {
|
|
|
138
139
|
* Run actual axe-core audit using vibium
|
|
139
140
|
*/
|
|
140
141
|
async runAxeCoreAudit(startTime) {
|
|
141
|
-
const { browser } = await
|
|
142
|
-
let
|
|
142
|
+
const { browser } = await loadVibium();
|
|
143
|
+
let instance = null;
|
|
143
144
|
try {
|
|
144
145
|
// Launch browser
|
|
145
|
-
|
|
146
|
+
instance = await browser.start({ headless: true });
|
|
147
|
+
const vibe = await instance.page();
|
|
146
148
|
// Navigate to URL
|
|
147
149
|
await vibe.go(this.config.url);
|
|
148
150
|
// Wait for selector if configured
|
|
@@ -153,12 +155,12 @@ export class AccessibilityAuditor {
|
|
|
153
155
|
}
|
|
154
156
|
// Inject axe-core library
|
|
155
157
|
const axeSource = loadAxeCoreSource();
|
|
156
|
-
await vibe.
|
|
158
|
+
await vibe.addScript(axeSource);
|
|
157
159
|
// Build axe configuration
|
|
158
160
|
const axeConfig = this.buildAxeConfig();
|
|
159
161
|
// Run axe-core audit
|
|
160
162
|
const axeScript = `
|
|
161
|
-
|
|
163
|
+
axe.run(${this.config.context ? JSON.stringify(this.config.context) : 'document'}, ${JSON.stringify(axeConfig)})
|
|
162
164
|
`;
|
|
163
165
|
const results = await vibe.evaluate(axeScript);
|
|
164
166
|
// Convert results
|
|
@@ -188,8 +190,8 @@ export class AccessibilityAuditor {
|
|
|
188
190
|
};
|
|
189
191
|
}
|
|
190
192
|
finally {
|
|
191
|
-
if (
|
|
192
|
-
await
|
|
193
|
+
if (instance) {
|
|
194
|
+
await instance.stop();
|
|
193
195
|
}
|
|
194
196
|
}
|
|
195
197
|
}
|
|
@@ -218,7 +220,7 @@ export class AccessibilityAuditor {
|
|
|
218
220
|
createFallbackResult(startTime) {
|
|
219
221
|
const errors = [];
|
|
220
222
|
if (!this.toolsAvailable.vibium) {
|
|
221
|
-
errors.push(
|
|
223
|
+
errors.push(`Vibium runtime or browser payload unavailable; run ${VIBIUM_SETUP}`);
|
|
222
224
|
}
|
|
223
225
|
if (!this.toolsAvailable.axeCore) {
|
|
224
226
|
errors.push('axe-core is not installed. Install with: npm install axe-core');
|
|
@@ -9,13 +9,13 @@
|
|
|
9
9
|
* Design goals:
|
|
10
10
|
* - Graceful: never fail init if Vibium install fails; report and continue.
|
|
11
11
|
* - Idempotent: skip if Vibium is already on PATH.
|
|
12
|
-
* - Opt-
|
|
12
|
+
* - Opt-in only: called by init only with --browser-engine.
|
|
13
13
|
* - No new runtime deps: shells out to `npm install -g vibium` via child_process.
|
|
14
14
|
*/
|
|
15
15
|
import { type SpawnSyncReturns } from 'node:child_process';
|
|
16
16
|
/**
|
|
17
|
-
* Default Vibium npm spec. Major-line pin via caret (`^26.
|
|
18
|
-
* semver will accept any 26.x.y >= 26.
|
|
17
|
+
* Default Vibium npm spec. Major-line pin via caret (`^26.8.21`) — npm
|
|
18
|
+
* semver will accept any 26.x.y >= 26.8.21 but reject 27.0.0+. The intent
|
|
19
19
|
* is to auto-receive security patches and additive minor features while
|
|
20
20
|
* blocking breaking-change major bumps, which is where Vibium's CLI
|
|
21
21
|
* contract (`go`, `--headless`, `viewport`, exit codes) can change.
|
|
@@ -27,7 +27,7 @@ import { type SpawnSyncReturns } from 'node:child_process';
|
|
|
27
27
|
* Bump procedure: update this constant (e.g. to ^27.0.0 at a major), run
|
|
28
28
|
* scripts/smoke-test.sh against the new version, then land the bump.
|
|
29
29
|
*/
|
|
30
|
-
export declare const DEFAULT_VIBIUM_SPEC = "vibium@^26.
|
|
30
|
+
export declare const DEFAULT_VIBIUM_SPEC = "vibium@^26.8.21";
|
|
31
31
|
/**
|
|
32
32
|
* Spawner injected into {@link installBrowserEngine} so tests can mock the
|
|
33
33
|
* shell-out without monkey-patching the child_process module (ESM namespaces
|
|
@@ -66,7 +66,7 @@ export interface BrowserEngineInstallResult {
|
|
|
66
66
|
*/
|
|
67
67
|
platformHint?: PlatformHint;
|
|
68
68
|
}
|
|
69
|
-
export type BrowserEngineDetectionStatus = 'ready' | 'cli-missing' | 'payload-missing';
|
|
69
|
+
export type BrowserEngineDetectionStatus = 'ready' | 'cli-missing' | 'payload-missing' | 'unsupported-version';
|
|
70
70
|
export interface BrowserEngineDetectionResult {
|
|
71
71
|
status: BrowserEngineDetectionStatus;
|
|
72
72
|
version?: string;
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
* Design goals:
|
|
10
10
|
* - Graceful: never fail init if Vibium install fails; report and continue.
|
|
11
11
|
* - Idempotent: skip if Vibium is already on PATH.
|
|
12
|
-
* - Opt-
|
|
12
|
+
* - Opt-in only: called by init only with --browser-engine.
|
|
13
13
|
* - No new runtime deps: shells out to `npm install -g vibium` via child_process.
|
|
14
14
|
*/
|
|
15
15
|
import { spawnSync as realSpawnSync } from 'node:child_process';
|
|
@@ -17,8 +17,8 @@ import * as os from 'node:os';
|
|
|
17
17
|
import * as fs from 'node:fs';
|
|
18
18
|
import { toErrorMessage } from '../shared/error-utils.js';
|
|
19
19
|
/**
|
|
20
|
-
* Default Vibium npm spec. Major-line pin via caret (`^26.
|
|
21
|
-
* semver will accept any 26.x.y >= 26.
|
|
20
|
+
* Default Vibium npm spec. Major-line pin via caret (`^26.8.21`) — npm
|
|
21
|
+
* semver will accept any 26.x.y >= 26.8.21 but reject 27.0.0+. The intent
|
|
22
22
|
* is to auto-receive security patches and additive minor features while
|
|
23
23
|
* blocking breaking-change major bumps, which is where Vibium's CLI
|
|
24
24
|
* contract (`go`, `--headless`, `viewport`, exit codes) can change.
|
|
@@ -30,7 +30,7 @@ import { toErrorMessage } from '../shared/error-utils.js';
|
|
|
30
30
|
* Bump procedure: update this constant (e.g. to ^27.0.0 at a major), run
|
|
31
31
|
* scripts/smoke-test.sh against the new version, then land the bump.
|
|
32
32
|
*/
|
|
33
|
-
export const DEFAULT_VIBIUM_SPEC = 'vibium@^26.
|
|
33
|
+
export const DEFAULT_VIBIUM_SPEC = 'vibium@^26.8.21';
|
|
34
34
|
const defaultPlatformProbe = {
|
|
35
35
|
platform: () => os.platform(),
|
|
36
36
|
arch: () => os.arch(),
|
|
@@ -109,7 +109,7 @@ export function detectVibium(spawner = defaultSpawner, timeoutMs = 5_000) {
|
|
|
109
109
|
const raw = stdout || stderr;
|
|
110
110
|
if (!raw)
|
|
111
111
|
return 'unknown';
|
|
112
|
-
// Extract first semver-looking token if present (e.g. "vibium version 26.
|
|
112
|
+
// Extract first semver-looking token if present (e.g. "vibium version 26.8.21" → "26.8.21")
|
|
113
113
|
const match = raw.match(/v?(\d+\.\d+\.\d+(?:[-+][\w.]+)?)/);
|
|
114
114
|
return match ? match[1] : raw.split(/\s+/)[0] || 'unknown';
|
|
115
115
|
}
|
|
@@ -121,6 +121,15 @@ export function detectBrowserEngine(spawner = defaultSpawner, timeoutMs = 5_000)
|
|
|
121
121
|
const version = detectVibium(spawner, timeoutMs);
|
|
122
122
|
if (!version)
|
|
123
123
|
return { status: 'cli-missing' };
|
|
124
|
+
// The modern JS adapter is supported only by stable 26.x releases >= 26.8.21.
|
|
125
|
+
const semver = /^(\d+)\.(\d+)\.(\d+)(?:\+[\w.]+)?$/.exec(version);
|
|
126
|
+
if (!semver || Number(semver[1]) !== 26 ||
|
|
127
|
+
Number(semver[2]) < 8 || (Number(semver[2]) === 8 && Number(semver[3]) < 21)) {
|
|
128
|
+
return {
|
|
129
|
+
status: 'unsupported-version', version,
|
|
130
|
+
message: `Vibium ${version} is unsupported; install ${DEFAULT_VIBIUM_SPEC} for the browser.start() API`,
|
|
131
|
+
};
|
|
132
|
+
}
|
|
124
133
|
const payload = tryRun(spawner, 'vibium', ['is-installed'], timeoutMs);
|
|
125
134
|
if (payload.status === 0)
|
|
126
135
|
return { status: 'ready', version };
|
|
@@ -176,7 +185,20 @@ export function installBrowserEngine(options = {}) {
|
|
|
176
185
|
'unknown npm install failure',
|
|
177
186
|
};
|
|
178
187
|
}
|
|
179
|
-
|
|
188
|
+
let verified = detectBrowserEngine(spawner);
|
|
189
|
+
if (verified.status === 'payload-missing') {
|
|
190
|
+
// Reinstalling an already-current npm package may not rerun postinstall.
|
|
191
|
+
// This installer is explicitly requested, so provision the payload directly.
|
|
192
|
+
const payloadInstall = tryRun(spawner, 'vibium', ['install'], timeoutMs);
|
|
193
|
+
if (payloadInstall.status !== 0) {
|
|
194
|
+
return {
|
|
195
|
+
status: 'install-failed', packageSpec, platformHint,
|
|
196
|
+
message: `Browser payload installation failed: ${payloadInstall.stderr?.trim() ||
|
|
197
|
+
payloadInstall.stdout?.trim() || 'vibium install failed'}. Run \`vibium install\` and verify with \`vibium is-installed\`.`,
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
verified = detectBrowserEngine(spawner);
|
|
201
|
+
}
|
|
180
202
|
if (verified.status !== 'ready') {
|
|
181
203
|
const reason = verified.message ? `: ${verified.message}` : '';
|
|
182
204
|
return {
|
|
@@ -16,6 +16,8 @@ export interface InitOrchestratorOptions {
|
|
|
16
16
|
autoMode?: boolean;
|
|
17
17
|
/** Skip pattern loading */
|
|
18
18
|
skipPatterns?: boolean;
|
|
19
|
+
/** Explicitly install the optional browser engine and browser payload. */
|
|
20
|
+
browserEngine?: boolean;
|
|
19
21
|
/** Minimal configuration */
|
|
20
22
|
minimal?: boolean;
|
|
21
23
|
/** Pre-trained patterns library */
|
|
@@ -33,6 +33,7 @@ export class ModularInitOrchestrator {
|
|
|
33
33
|
skipPatterns: options.skipPatterns,
|
|
34
34
|
skipCodeIndex: options.skipCodeIndex,
|
|
35
35
|
minimal: options.minimal,
|
|
36
|
+
browserEngine: options.browserEngine,
|
|
36
37
|
withN8n: options.withN8n,
|
|
37
38
|
withOpenCode: options.withOpenCode,
|
|
38
39
|
withKiro: options.withKiro,
|
|
@@ -79,19 +79,9 @@ export class AssetsPhase extends BasePhase {
|
|
|
79
79
|
// Initialize overlay configs in agent registry for runtime use
|
|
80
80
|
initializeOverlays(projectRoot);
|
|
81
81
|
}
|
|
82
|
-
//
|
|
83
|
-
// Graceful — never fails init if Vibium cannot be installed.
|
|
84
|
-
// Skipped in --minimal mode per ADR-086 minimal-footprint guidance.
|
|
85
|
-
//
|
|
86
|
-
// H6 (devil's-advocate finding): the install can take up to 3 minutes
|
|
87
|
-
// on cold caches because npm downloads Vibium AND lazily downloads a
|
|
88
|
-
// Chrome for Testing binary. spawnSync blocks the event loop, so the
|
|
89
|
-
// user sees no output for the entire duration. We log a clear pre-spawn
|
|
90
|
-
// message so users don't Ctrl-C thinking init hung. Future work: move
|
|
91
|
-
// this to a lazy/on-first-use install path so non-browser users never
|
|
92
|
-
// pay the cost.
|
|
82
|
+
// Browser setup is explicitly requested; normal init never downloads a browser.
|
|
93
83
|
let browserEngine;
|
|
94
|
-
if (!options.minimal) {
|
|
84
|
+
if (options.browserEngine === true && !options.minimal) {
|
|
95
85
|
try {
|
|
96
86
|
// Pre-flight check: if vibium is already on PATH, skip the loud
|
|
97
87
|
// banner so we don't scare users on the common path.
|
|
@@ -108,7 +98,7 @@ export class AssetsPhase extends BasePhase {
|
|
|
108
98
|
else {
|
|
109
99
|
// Not installed → we're about to spawn `npm install -g vibium`
|
|
110
100
|
// which can take 1–3 minutes on a cold cache. Tell the user.
|
|
111
|
-
context.services.log(' Browser engine: installing vibium via npm (this can take 1–3 minutes on first run; downloads Chrome for Testing
|
|
101
|
+
context.services.log(' Browser engine: installing vibium via npm (this can take 1–3 minutes on first run; downloads Chrome for Testing)…');
|
|
112
102
|
browserEngine = installBrowserEngine({ skip: false });
|
|
113
103
|
switch (browserEngine.status) {
|
|
114
104
|
case 'installed':
|
|
@@ -118,10 +108,10 @@ export class AssetsPhase extends BasePhase {
|
|
|
118
108
|
context.services.log(' Browser engine: skipped');
|
|
119
109
|
break;
|
|
120
110
|
case 'install-failed':
|
|
121
|
-
context.services.warn(`Browser engine install failed (qe-browser skill will be unavailable until you run \`
|
|
111
|
+
context.services.warn(`Browser engine install failed (qe-browser skill will be unavailable until you run \`aqe init --browser-engine\`): ${browserEngine.message || 'unknown'}`);
|
|
122
112
|
break;
|
|
123
113
|
case 'npm-unavailable':
|
|
124
|
-
context.services.warn('Browser engine: npm not on PATH — install Node.js + npm, then `
|
|
114
|
+
context.services.warn('Browser engine: npm not on PATH — install Node.js + npm, then `aqe init --browser-engine` to enable qe-browser');
|
|
125
115
|
break;
|
|
126
116
|
// 'already-installed' handled by the pre-flight branch above
|
|
127
117
|
}
|
|
@@ -141,12 +131,12 @@ export class AssetsPhase extends BasePhase {
|
|
|
141
131
|
const msg = error instanceof Error ? error.message : String(error);
|
|
142
132
|
context.services.warn(`Browser engine install error: ${msg}\n` +
|
|
143
133
|
` qe-browser fleet skill will be unavailable until you run:\n` +
|
|
144
|
-
` npm install -g
|
|
145
|
-
` Then re-run \`aqe init\` to verify. The rest of the AQE install will continue.`);
|
|
134
|
+
` npm install -g ${DEFAULT_VIBIUM_SPEC}\n` +
|
|
135
|
+
` Then re-run \`aqe init --browser-engine\` to verify. The rest of the AQE install will continue.`);
|
|
146
136
|
}
|
|
147
137
|
}
|
|
148
138
|
else {
|
|
149
|
-
browserEngine = { status: 'skipped', packageSpec: DEFAULT_VIBIUM_SPEC, message: 'minimal mode' };
|
|
139
|
+
browserEngine = { status: 'skipped', packageSpec: DEFAULT_VIBIUM_SPEC, message: options.minimal ? 'minimal mode' : 'browser setup not requested; run aqe init --browser-engine' };
|
|
150
140
|
}
|
|
151
141
|
// Install n8n platform (optional)
|
|
152
142
|
if (options.withN8n) {
|
|
@@ -92,6 +92,8 @@ export interface InitOptions {
|
|
|
92
92
|
*/
|
|
93
93
|
skipCodeIndex?: boolean;
|
|
94
94
|
/** Minimal configuration (no skills, patterns, workers) */
|
|
95
|
+
/** Explicitly install the optional browser engine and browser payload. */
|
|
96
|
+
browserEngine?: boolean;
|
|
95
97
|
minimal?: boolean;
|
|
96
98
|
/** Automatically migrate from v2 if detected */
|
|
97
99
|
/** Install n8n workflow testing platform */
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
* - Automatic strategy recommendations
|
|
16
16
|
* - Pattern quality improvement over time
|
|
17
17
|
*/
|
|
18
|
-
import { RealQEReasoningBank, type RealQEReasoningBankConfig, type RealQERoutingRequest, type RealQERoutingResult, type LearningOutcome } from '../../../learning/real-qe-reasoning-bank.js';
|
|
18
|
+
import { RealQEReasoningBank, type RealQEReasoningBankConfig, type RealQEPatternSearchResult, type RealQERoutingRequest, type RealQERoutingResult, type LearningOutcome } from '../../../learning/real-qe-reasoning-bank.js';
|
|
19
19
|
import { TrajectoryTracker, type Trajectory, type TrajectoryStep, type TrajectoryOptions, type TrajectoryTrackerConfig } from './trajectory-tracker.js';
|
|
20
20
|
import { ExperienceReplay, type ExperienceGuidance, type ExperienceReplayConfig } from './experience-replay.js';
|
|
21
21
|
import { PatternEvolution, type PatternVersion, type DriftDetectionResult, type MergeCandidate, type PatternEvolutionConfig } from './pattern-evolution.js';
|
|
@@ -182,10 +182,7 @@ export declare class EnhancedReasoningBankAdapter {
|
|
|
182
182
|
limit?: number;
|
|
183
183
|
domain?: QEDomain;
|
|
184
184
|
minSimilarity?: number;
|
|
185
|
-
}): Promise<Result<
|
|
186
|
-
pattern: QEPattern;
|
|
187
|
-
similarity: number;
|
|
188
|
-
}>>>;
|
|
185
|
+
}): Promise<Result<RealQEPatternSearchResult[]>>;
|
|
189
186
|
/**
|
|
190
187
|
* Record a pattern outcome with evolution tracking
|
|
191
188
|
*/
|