agentic-qe 3.15.2 → 3.15.3
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/helpers/brain-checkpoint.cjs +46 -6
- package/.claude/hooks/aqe-hook.cjs +280 -51
- package/.claude/skills/skills-manifest.json +1 -1
- package/CHANGELOG.md +86 -0
- package/assets/skills/skills-manifest.json +1 -1
- package/dist/adapters/ag-ui/state-delta-cache.js +14 -5
- package/dist/adapters/trajectory-adapter.js +3 -1
- package/dist/cli/bundle.js +5 -5
- package/dist/cli/chunks/adapter-WQSFQES5.js +2 -0
- package/dist/cli/chunks/{agent-booster-wasm-664M7426.js → agent-booster-wasm-CYG3PKHH.js} +2 -2
- package/dist/cli/chunks/{agent-handler-E47ITH45.js → agent-handler-WTFYFZKL.js} +2 -2
- package/dist/cli/chunks/{agent-memory-branch-CFWVOJX3.js → agent-memory-branch-G6WE3ZXU.js} +2 -2
- package/dist/cli/chunks/aqe-learning-engine-TDHBBADE.js +2 -0
- package/dist/cli/chunks/{arena-JM3OY263.js → arena-S72QW44C.js} +4 -4
- package/dist/cli/chunks/{arena-ZU5CGBGH.js → arena-ZFXQEVUQ.js} +2 -2
- package/dist/cli/chunks/{audit-HVBRC5AS.js → audit-KPYIEQJ3.js} +3 -3
- package/dist/cli/chunks/base-CZSB27VO.js +2 -0
- package/dist/cli/chunks/{better-sqlite3-45JLBQX3.js → better-sqlite3-L2M3TI5D.js} +2 -2
- package/dist/cli/chunks/{brain-handler-FKDONZYA.js → brain-handler-FHKLQTB4.js} +3 -3
- package/dist/cli/chunks/{branch-enumerator-M3DPS3D5.js → branch-enumerator-3BSHOPOK.js} +2 -2
- package/dist/cli/chunks/{browser-TG2TV6NR.js → browser-JUIJPL6Y.js} +2 -2
- package/dist/cli/chunks/browser-workflow-AEMIS6PA.js +2 -0
- package/dist/cli/chunks/{chunk-3KTAMNKI.js → chunk-2GJJGO5D.js} +2 -2
- package/dist/cli/chunks/{chunk-HSXLHNSS.js → chunk-2M75CW5Q.js} +2 -2
- package/dist/cli/chunks/{chunk-MEUJWTOX.js → chunk-2MEWIXW4.js} +2 -2
- package/dist/cli/chunks/{chunk-SKQTRYE7.js → chunk-2TBHPYOU.js} +2 -2
- package/dist/cli/chunks/{chunk-PZK7O445.js → chunk-34Y4CIHD.js} +2 -2
- package/dist/cli/chunks/{chunk-RO6HAZLV.js → chunk-35VDOH4Y.js} +1 -1
- package/dist/cli/chunks/{chunk-KQMCCHPO.js → chunk-366IBPZB.js} +2 -2
- package/dist/cli/chunks/{chunk-GJTH6VBH.js → chunk-3MNKYCLH.js} +1 -1
- package/dist/cli/chunks/{chunk-6KEYA4EH.js → chunk-3UUMGWHW.js} +4 -4
- package/dist/cli/chunks/{chunk-EQG3JYSV.js → chunk-3Y4GX5FL.js} +2 -2
- package/dist/cli/chunks/{chunk-BKZSTZDB.js → chunk-3ZTBV6M3.js} +1 -1
- package/dist/cli/chunks/{chunk-UZL4JYVW.js → chunk-4IYHYHTG.js} +2 -2
- package/dist/cli/chunks/{chunk-56CE7UO4.js → chunk-4JVVVKAX.js} +6 -6
- package/dist/cli/chunks/chunk-4N7YXTV3.js +4 -0
- package/dist/cli/chunks/{chunk-N653RGT3.js → chunk-4TM5K6EZ.js} +2 -2
- package/dist/cli/chunks/{chunk-IAOB2G3X.js → chunk-5LEUEWJY.js} +2 -2
- package/dist/cli/chunks/{chunk-LRVR56PD.js → chunk-5QUOM357.js} +1 -1
- package/dist/cli/chunks/{chunk-NBV37CEK.js → chunk-5WOBFN2T.js} +2 -2
- package/dist/cli/chunks/{chunk-I7J2ESGR.js → chunk-6AKJ73X3.js} +2 -2
- package/dist/cli/chunks/{chunk-L77Z3Q6L.js → chunk-6EQDA4EC.js} +2 -2
- package/dist/cli/chunks/{chunk-3DCRAW43.js → chunk-6TYTBQPV.js} +2 -2
- package/dist/cli/chunks/{chunk-IQB5ZBYO.js → chunk-6V6XVGCL.js} +3 -3
- package/dist/cli/chunks/{chunk-DHSGCI6H.js → chunk-6W6GZHQA.js} +6 -6
- package/dist/cli/chunks/{chunk-MY2XZHW3.js → chunk-7IJVCDDC.js} +1 -1
- package/dist/cli/chunks/{chunk-AS27JP67.js → chunk-7PDC4SKR.js} +1 -1
- package/dist/cli/chunks/{chunk-3KXKJSKS.js → chunk-7SWHW5AC.js} +20 -20
- package/dist/cli/chunks/{chunk-FH6N2LKG.js → chunk-7TW5UGDP.js} +2 -2
- package/dist/cli/chunks/{chunk-SZYK5JL7.js → chunk-7UUSV2SK.js} +1 -1
- package/dist/cli/chunks/{chunk-HFF5ERIE.js → chunk-A3IQU2ND.js} +2 -2
- package/dist/cli/chunks/{chunk-RIAKRZCZ.js → chunk-A5H7TF7C.js} +2 -2
- package/dist/cli/chunks/{chunk-ATGIGJSL.js → chunk-A6PII4R4.js} +1 -1
- package/dist/cli/chunks/{chunk-X4CADOSD.js → chunk-AEL4XJGJ.js} +2 -2
- package/dist/cli/chunks/{chunk-JCB6K24D.js → chunk-AOZJ6UUZ.js} +2 -2
- package/dist/cli/chunks/chunk-APV5UWTU.js +15 -0
- package/dist/cli/chunks/{chunk-QJN5RW2U.js → chunk-AQTQ24SK.js} +3 -3
- package/dist/cli/chunks/{chunk-GDSLQTJC.js → chunk-AS54N3H7.js} +2 -2
- package/dist/cli/chunks/chunk-ASUXS4N4.js +2 -0
- package/dist/cli/chunks/{chunk-HS3O763N.js → chunk-B23ROYST.js} +3 -3
- package/dist/cli/chunks/{chunk-IHKRKRAV.js → chunk-BDKQSEEY.js} +1 -1
- package/dist/cli/chunks/{chunk-2B2MGJ2W.js → chunk-BO43BGHX.js} +2 -2
- package/dist/cli/chunks/{chunk-MDDECCAC.js → chunk-CF3BPD2R.js} +161 -159
- package/dist/cli/chunks/{chunk-ANI3KPB7.js → chunk-CFXROOIU.js} +2 -2
- package/dist/cli/chunks/{chunk-3RC5UMRJ.js → chunk-CNQUU6CF.js} +2 -2
- package/dist/cli/chunks/{chunk-NKWMTXBL.js → chunk-D5V6C3XG.js} +3 -3
- package/dist/cli/chunks/{chunk-ZIKH7U5A.js → chunk-D6PUDLJ4.js} +2 -2
- package/dist/cli/chunks/{chunk-FNPZINHV.js → chunk-DE3QNPTG.js} +1 -1
- package/dist/cli/chunks/{chunk-VTGAPHJE.js → chunk-DH5NWHH2.js} +2 -2
- package/dist/cli/chunks/{chunk-OWZ3F7DJ.js → chunk-DLA3EHKJ.js} +1 -1
- package/dist/cli/chunks/{chunk-7UA7SMM4.js → chunk-DWG4TN6A.js} +1 -1
- package/dist/cli/chunks/{chunk-4MCO43NX.js → chunk-EBIMVSPH.js} +4 -4
- package/dist/cli/chunks/{chunk-WMNVFCKY.js → chunk-ED5HUPUR.js} +2 -2
- package/dist/cli/chunks/{chunk-Y5VPLOA7.js → chunk-EQGT4VLC.js} +1 -1
- package/dist/cli/chunks/{chunk-ZVQSIH7Y.js → chunk-F5BREV2Q.js} +8 -8
- package/dist/cli/chunks/{chunk-CV7E627D.js → chunk-FPFGN2Z5.js} +2 -2
- package/dist/cli/chunks/{chunk-GJ7DON5S.js → chunk-FTUNC4EI.js} +3 -3
- package/dist/cli/chunks/chunk-FXTZXZCU.js +54 -0
- package/dist/cli/chunks/{chunk-6UO5YSNN.js → chunk-GJB3LPCS.js} +2 -2
- package/dist/cli/chunks/{chunk-6WVEICL2.js → chunk-GPZH6OPP.js} +4 -4
- package/dist/cli/chunks/{chunk-T5N2PIPS.js → chunk-HR7RL4PB.js} +2 -2
- package/dist/cli/chunks/{chunk-IT753IPZ.js → chunk-HSR53REE.js} +2 -2
- package/dist/cli/chunks/{chunk-DNS37AHW.js → chunk-HU474NXP.js} +1 -1
- package/dist/cli/chunks/{chunk-NP2WWIZ3.js → chunk-HV3ZVUHO.js} +1 -1
- package/dist/cli/chunks/{chunk-ITM26I6O.js → chunk-HVIFA73X.js} +2 -2
- package/dist/cli/chunks/{chunk-Q32UGPWK.js → chunk-HW4V7BVV.js} +2 -2
- package/dist/cli/chunks/{chunk-5DFPAJ5O.js → chunk-I5VJ3FBC.js} +2 -2
- package/dist/cli/chunks/{chunk-AR5V7VNC.js → chunk-IARE5VGI.js} +1 -1
- package/dist/cli/chunks/chunk-INVDDFJC.js +2 -0
- package/dist/cli/chunks/{chunk-M36DAETL.js → chunk-JJBTM4JO.js} +2 -2
- package/dist/cli/chunks/chunk-JVQK6NGI.js +14 -0
- package/dist/cli/chunks/{chunk-TMYGGYRY.js → chunk-K65X6CQA.js} +1 -1
- package/dist/cli/chunks/{chunk-HBMBO4FD.js → chunk-KCBCYF7M.js} +2 -2
- package/dist/cli/chunks/{chunk-V67UQRQN.js → chunk-KGS6H2HB.js} +2 -2
- package/dist/cli/chunks/{chunk-JSTKSPYT.js → chunk-L6OSEWOS.js} +1 -1
- package/dist/cli/chunks/{chunk-LH3H4V7C.js → chunk-LEB6O2IN.js} +2 -2
- package/dist/cli/chunks/{chunk-JIRX6KUR.js → chunk-LPZAB3N2.js} +3 -3
- package/dist/cli/chunks/{chunk-A6L2OCMO.js → chunk-M3ACHBC7.js} +2 -2
- package/dist/cli/chunks/{chunk-WBZIOTY6.js → chunk-M3ONCPSU.js} +2 -2
- package/dist/cli/chunks/{chunk-EATZW5T2.js → chunk-MUSYQF53.js} +2 -2
- package/dist/cli/chunks/{chunk-GSC6JXDE.js → chunk-MZDUBFLP.js} +1 -1
- package/dist/cli/chunks/{chunk-2Q4Y3VQ6.js → chunk-NT6FYFJA.js} +2 -2
- package/dist/cli/chunks/{chunk-HADOG2PT.js → chunk-O66D4NEJ.js} +2 -2
- package/dist/cli/chunks/{chunk-QZNFZ5IQ.js → chunk-OGARNKLS.js} +2 -2
- package/dist/cli/chunks/{chunk-QGCFMACF.js → chunk-OKNMZLGB.js} +2 -2
- package/dist/cli/chunks/{chunk-TC4B5D4Z.js → chunk-OMHISPPF.js} +1 -1
- package/dist/cli/chunks/{chunk-DGKPGRBT.js → chunk-OT6SOPAL.js} +2 -2
- package/dist/cli/chunks/{chunk-W6PLBRRS.js → chunk-OTTTHNIT.js} +1 -1
- package/dist/cli/chunks/{chunk-JFFVYCTV.js → chunk-P36IODAM.js} +2 -2
- package/dist/cli/chunks/{chunk-EDRIROCG.js → chunk-P6EGRAQG.js} +2 -2
- package/dist/cli/chunks/{chunk-HOBBYORR.js → chunk-PBUWNMZ2.js} +1 -1
- package/dist/cli/chunks/{chunk-Z3PANQUT.js → chunk-POTVF6BY.js} +1 -1
- package/dist/cli/chunks/{chunk-SVHFSOGT.js → chunk-POVP6O6K.js} +1 -1
- package/dist/cli/chunks/{chunk-LVDZ25VX.js → chunk-PPA53NJB.js} +2 -2
- package/dist/cli/chunks/{chunk-GHXNRF63.js → chunk-PUPEKA2J.js} +2 -2
- package/dist/cli/chunks/{chunk-RLQ4MYB6.js → chunk-QDQLL2QB.js} +2 -2
- package/dist/cli/chunks/{chunk-O6QTCUSL.js → chunk-QSVNVDA5.js} +1 -1
- package/dist/cli/chunks/{chunk-UKRK3IE3.js → chunk-QUXX2DP7.js} +2 -2
- package/dist/cli/chunks/{chunk-T75PWWK4.js → chunk-QVNMTMDJ.js} +2 -2
- package/dist/cli/chunks/{chunk-3XF7YTQC.js → chunk-QZBFMXO5.js} +52 -52
- package/dist/cli/chunks/{chunk-BT6TZTCL.js → chunk-RDTR43YN.js} +2 -2
- package/dist/cli/chunks/{chunk-55T7PDYP.js → chunk-RGD2CG23.js} +2 -2
- package/dist/cli/chunks/{chunk-NWYAV2UG.js → chunk-RQUSJEON.js} +2 -2
- package/dist/cli/chunks/{chunk-2AOAEMJG.js → chunk-RRSZ27A7.js} +2 -2
- package/dist/cli/chunks/{chunk-6XLCFDIB.js → chunk-RWLOERKK.js} +2 -2
- package/dist/cli/chunks/{chunk-5YS2DF5G.js → chunk-RWQDRPN5.js} +2 -2
- package/dist/cli/chunks/{chunk-CFDIYZGA.js → chunk-S7D4GD7H.js} +2 -2
- package/dist/cli/chunks/{chunk-NLY5NUHZ.js → chunk-SKHP5WUP.js} +2 -2
- package/dist/cli/chunks/{chunk-HMDSBWF6.js → chunk-SP2JO53K.js} +2 -2
- package/dist/cli/chunks/{chunk-WJ7657IX.js → chunk-SRDECRTL.js} +2 -2
- package/dist/cli/chunks/{chunk-CRYZXTSQ.js → chunk-TBVPNN65.js} +2 -2
- package/dist/cli/chunks/{chunk-UX4BOI6K.js → chunk-U5AVZ3T2.js} +1 -1
- package/dist/cli/chunks/{chunk-ZSKQPXRW.js → chunk-UCSGZVJX.js} +1 -1
- package/dist/cli/chunks/{chunk-URWT3EQT.js → chunk-UGNTLSBL.js} +2 -2
- package/dist/cli/chunks/{chunk-IM67YHDK.js → chunk-UTALYUMW.js} +2 -2
- package/dist/cli/chunks/{chunk-FCMCQ6OX.js → chunk-UZDTRCVU.js} +2 -2
- package/dist/cli/chunks/{chunk-WUSSZ2S6.js → chunk-V5NYGDSX.js} +2 -2
- package/dist/cli/chunks/{chunk-KTLYL3BS.js → chunk-VGN46ZT4.js} +2 -2
- package/dist/cli/chunks/{chunk-MOSXT6AO.js → chunk-VHBZADYK.js} +2 -2
- package/dist/cli/chunks/{chunk-6OL2WES5.js → chunk-VOKIUF7I.js} +1 -1
- package/dist/cli/chunks/{chunk-HYWW4A2E.js → chunk-VRT736E3.js} +2 -2
- package/dist/cli/chunks/{chunk-Z7XCXHEB.js → chunk-VUBLJBHQ.js} +2 -2
- package/dist/cli/chunks/{chunk-6O4KVU4K.js → chunk-VX7CQUO7.js} +2 -2
- package/dist/cli/chunks/{chunk-YYVLMW65.js → chunk-W7EHNX3Y.js} +2 -2
- package/dist/cli/chunks/{chunk-J4EJMAH3.js → chunk-WI7I6LMM.js} +1 -1
- package/dist/cli/chunks/{chunk-5TEPPW4J.js → chunk-WLOHTLHO.js} +2 -2
- package/dist/cli/chunks/{chunk-WBCE6V2N.js → chunk-WQZBKLAG.js} +1 -1
- package/dist/cli/chunks/{chunk-YH7VOLBP.js → chunk-WSND64RL.js} +2 -2
- package/dist/cli/chunks/{chunk-D75HDHX3.js → chunk-WSUYEVSY.js} +1 -1
- package/dist/cli/chunks/{chunk-HXT4XDQO.js → chunk-WTMLRMKW.js} +2 -2
- package/dist/cli/chunks/{chunk-FRZVLRVR.js → chunk-WW4RJ6BH.js} +2 -2
- package/dist/cli/chunks/{chunk-QR5ILM34.js → chunk-X335K4SU.js} +2 -2
- package/dist/cli/chunks/{chunk-326V7N25.js → chunk-X33LID2T.js} +1 -1
- package/dist/cli/chunks/{chunk-NL6HKEPR.js → chunk-XTGVGZ4J.js} +3 -3
- package/dist/cli/chunks/{chunk-AXJ75X6I.js → chunk-XV2TIODR.js} +1 -1
- package/dist/cli/chunks/{chunk-2JEPRQMT.js → chunk-XXW4KFBB.js} +1 -1
- package/dist/cli/chunks/{chunk-TZH2QAFZ.js → chunk-YCGU2LI7.js} +2 -2
- package/dist/cli/chunks/chunk-YGEC3PSD.js +2 -0
- package/dist/cli/chunks/{chunk-W7P7EOJ4.js → chunk-YGKU2QRC.js} +1 -1
- package/dist/cli/chunks/{chunk-XQBH3366.js → chunk-YHZGFWJE.js} +2 -2
- package/dist/cli/chunks/{chunk-E6GANSLP.js → chunk-YJH7UFA2.js} +2 -2
- package/dist/cli/chunks/{chunk-IBAXNCR2.js → chunk-YQ3ZW47V.js} +2 -2
- package/dist/cli/chunks/{chunk-MYDZBABD.js → chunk-YTRGMILO.js} +2 -2
- package/dist/cli/chunks/chunk-YW4GM36K.js +2 -0
- package/dist/cli/chunks/{chunk-W5EKSBS4.js → chunk-Z7JPWXW2.js} +2 -2
- package/dist/cli/chunks/{chunk-2AWU2E6R.js → chunk-Z7UGEQ4G.js} +1 -1
- package/dist/cli/chunks/{chunk-B4H66LPR.js → chunk-ZATQLTYL.js} +1 -1
- package/dist/cli/chunks/{chunk-N4MNSEKY.js → chunk-ZI6NJEBY.js} +1 -1
- package/dist/cli/chunks/{chunk-YJSKT6G6.js → chunk-ZJW4HRUA.js} +1 -1
- package/dist/cli/chunks/{chunk-QB7H62A4.js → chunk-ZL2GYU7H.js} +2 -2
- package/dist/cli/chunks/{ci-JNBOR6FP.js → ci-JPISJ25U.js} +3 -3
- package/dist/cli/chunks/{ci-output-FYNKONEQ.js → ci-output-DPHTFIGX.js} +2 -2
- package/dist/cli/chunks/{circuit-breaker-KOIXRDAD.js → circuit-breaker-PQ65VU2M.js} +2 -2
- package/dist/cli/chunks/{claude-flow-setup-4CO7KHRN.js → claude-flow-setup-GKHVO7AD.js} +2 -2
- package/dist/cli/chunks/client-BS7I637W.js +2 -0
- package/dist/cli/chunks/{cline-installer-CMYAPKK5.js → cline-installer-HWMQZJ64.js} +2 -2
- package/dist/cli/chunks/{code-WFIAEP3H.js → code-OTY7BF3D.js} +3 -3
- package/dist/cli/chunks/{code-index-extractor-IYM6HWJN.js → code-index-extractor-FG3TMHHR.js} +2 -2
- package/dist/cli/chunks/{codex-installer-DORVWRSU.js → codex-installer-63JARKKS.js} +2 -2
- package/dist/cli/chunks/{completions-54VM2MX2.js → completions-4ZHONFML.js} +2 -2
- package/dist/cli/chunks/{complexity-analyzer-EGZDP5N4.js → complexity-analyzer-FYHTJW5Y.js} +2 -2
- package/dist/cli/chunks/{continuedev-installer-4SDVDD4T.js → continuedev-installer-ZAWDSUR3.js} +2 -2
- package/dist/cli/chunks/{copilot-installer-7FJQ7PCL.js → copilot-installer-5QK565JX.js} +2 -2
- package/dist/cli/chunks/core-handlers-UG7RMTK5.js +2 -0
- package/dist/cli/chunks/cost-tracker-AWWMPPBJ.js +2 -0
- package/dist/cli/chunks/{coverage-DI5LDRJ7.js → coverage-SMFQEGKE.js} +3 -3
- package/dist/cli/chunks/cross-domain-router-NX7F6TOF.js +2 -0
- package/dist/cli/chunks/{cursor-installer-RTSZP5YD.js → cursor-installer-3BL7JACV.js} +2 -2
- package/dist/cli/chunks/{daemon-LM7LETPV.js → daemon-OJ624POF.js} +4 -4
- package/dist/cli/chunks/{daemon-SP3APEZY.js → daemon-R6ULBHHF.js} +3 -3
- package/dist/cli/chunks/{dag-attention-scheduler-C3QBODFE.js → dag-attention-scheduler-J6I3LTMY.js} +2 -2
- package/dist/cli/chunks/{detect-I4RBUFFJ.js → detect-5Q5W33UR.js} +2 -2
- package/dist/cli/chunks/{dist-node-PT6TCBCO.js → dist-node-GJNW56NA.js} +2 -2
- package/dist/cli/chunks/{domain-handler-MJMTMB5X.js → domain-handler-IZQY2G44.js} +2 -2
- package/dist/cli/chunks/{domain-plugins-Y4A2WYJW.js → domain-plugins-PIGO3KI2.js} +2 -2
- package/dist/cli/chunks/{domain-transfer-DUO42TLA.js → domain-transfer-NU3B4FQG.js} +2 -2
- package/dist/cli/chunks/dream-GYEH57FW.js +2 -0
- package/dist/cli/chunks/{embed-and-insert-pattern-66ZQK4AI.js → embed-and-insert-pattern-5QDDRPWV.js} +2 -2
- package/dist/cli/chunks/{eval-NQ7H27UF.js → eval-TB5HOAUY.js} +2 -2
- package/dist/cli/chunks/{experience-capture-middleware-MHEYPTIG.js → experience-capture-middleware-SIYVLKDE.js} +3 -3
- package/dist/cli/chunks/{fast-paths-YYDGN6ZC.js → fast-paths-T7QELS6D.js} +2 -2
- package/dist/cli/chunks/{feature-flags-YFGUORHY.js → feature-flags-T3CNNYMJ.js} +2 -2
- package/dist/cli/chunks/{feature-flags-FY4DOYS2.js → feature-flags-TNZ7ZAJV.js} +2 -2
- package/dist/cli/chunks/{file-discovery-TOMDY7TK.js → file-discovery-M45P2ZCY.js} +2 -2
- package/dist/cli/chunks/{fleet-MO3UCWB4.js → fleet-DSBZPHBZ.js} +3 -3
- package/dist/cli/chunks/{gnn-wrapper-SLW4PPXQ.js → gnn-wrapper-EHODCF32.js} +2 -2
- package/dist/cli/chunks/{heartbeat-handler-36RFCP4E.js → heartbeat-handler-V5DBVF7V.js} +4 -4
- package/dist/cli/chunks/heartbeat-scheduler-4TJ3T7LR.js +2 -0
- package/dist/cli/chunks/hnsw-adapter-PHFK4EAP.js +2 -0
- package/dist/cli/chunks/hnsw-index-434XDDBH.js +2 -0
- package/dist/cli/chunks/{hnsw-legacy-bridge-BJLWBKHE.js → hnsw-legacy-bridge-IYKDYA2F.js} +2 -2
- package/dist/cli/chunks/{hnswlib-node-RAYNVJCJ.js → hnswlib-node-DKG4LW3X.js} +2 -2
- package/dist/cli/chunks/{hooks-JMHFWVEQ.js → hooks-VKNMAILY.js} +10 -10
- package/dist/cli/chunks/hybrid-backend-DYVJQENQ.js +2 -0
- package/dist/cli/chunks/{hypergraph-engine-JUDBKPOX.js → hypergraph-engine-AXZVP7A7.js} +2 -2
- package/dist/cli/chunks/{hypergraph-handler-AXTWXOZU.js → hypergraph-handler-6EO6JN4Z.js} +3 -3
- package/dist/cli/chunks/impact-analyzer-CBAST6M2.js +2 -0
- package/dist/cli/chunks/{init-handler-PARJNZFF.js → init-handler-N3NG3RHN.js} +6 -6
- package/dist/cli/chunks/init-wizard-DWIJW7HY.js +2 -0
- package/dist/cli/chunks/kernel-AQGCS4X2.js +2 -0
- package/dist/cli/chunks/{kilocode-installer-22HX2E4V.js → kilocode-installer-JICGAHLM.js} +2 -2
- package/dist/cli/chunks/{kiro-installer-OVPBLY7J.js → kiro-installer-VYBFP6ZH.js} +2 -2
- package/dist/cli/chunks/knowledge-graph-2ICXFUUV.js +2 -0
- package/dist/cli/chunks/{learning-DWXPJ3R6.js → learning-3BHEZEPK.js} +3 -3
- package/dist/cli/chunks/{llm-router-7PPVVKNG.js → llm-router-GPTEZCUN.js} +4 -4
- package/dist/cli/chunks/llm-router-service-C47RGTH6.js +2 -0
- package/dist/cli/chunks/{load-VI5XHNZA.js → load-W5BIRPU4.js} +2 -2
- package/dist/cli/chunks/load-test-LRDAW3N6.js +2 -0
- package/dist/cli/chunks/{mcp-UW4Z3Z64.js → mcp-EBV4DZPG.js} +2 -2
- package/dist/cli/chunks/{memory-UD2KCB5M.js → memory-7F6YYKNL.js} +5 -5
- package/dist/cli/chunks/memory-backend-UFBAYPQ6.js +2 -0
- package/dist/cli/chunks/memory-handlers-OGLJHAAJ.js +2 -0
- package/dist/cli/chunks/{multi-model-executor-5O4WWU5Z.js → multi-model-executor-3ZIA2YOL.js} +2 -2
- package/dist/cli/chunks/{opencode-installer-DTRFDGM7.js → opencode-installer-2XRZUTLR.js} +2 -2
- package/dist/cli/chunks/{orchestrator-ENJIKV6Z.js → orchestrator-VSZVJUJW.js} +85 -26
- package/dist/cli/chunks/pattern-null-store-27FCITT3.js +2 -0
- package/dist/cli/chunks/{pattern-usage-recorder-QPNIU5PD.js → pattern-usage-recorder-I2IGVHRL.js} +2 -2
- package/dist/cli/chunks/{pipeline-G3JYDNPE.js → pipeline-5G3O6WBY.js} +2 -2
- package/dist/cli/chunks/{platform-P4WR6N3D.js → platform-6GUFDIA3.js} +2 -2
- package/dist/cli/chunks/{plugin-C7763Q5W.js → plugin-GYXE4CIC.js} +2 -2
- package/dist/cli/chunks/{prime-radiant-advanced-wasm-DH6R3XSZ.js → prime-radiant-advanced-wasm-THX6JLGZ.js} +2 -2
- package/dist/cli/chunks/{project-root-7DTXDLEG.js → project-root-QJRBKZQU.js} +2 -2
- package/dist/cli/chunks/protocol-executor-XWXXTMEW.js +2 -0
- package/dist/cli/chunks/{protocol-handler-EODULGOZ.js → protocol-handler-B54LRU26.js} +2 -2
- package/dist/cli/chunks/{prove-A7G3SIOF.js → prove-PCY2WQOD.js} +2 -2
- package/dist/cli/chunks/qe-reasoning-bank-3RMYXENE.js +2 -0
- package/dist/cli/chunks/{quality-JTURFUX3.js → quality-LPVDZC7U.js} +2 -2
- package/dist/cli/chunks/{quality-gate-M2EI754V.js → quality-gate-L3KXL6WE.js} +3 -3
- package/dist/cli/chunks/queen-coordinator-AS6DZ7UJ.js +2 -0
- package/dist/cli/chunks/{real-embeddings-DI7JMCG7.js → real-embeddings-N3H523PJ.js} +2 -2
- package/dist/cli/chunks/{ref-validation-MSFMNKDR.js → ref-validation-6BKDPHZ7.js} +2 -2
- package/dist/cli/chunks/{roocode-installer-XIMFFHOH.js → roocode-installer-NSGGTWXE.js} +2 -2
- package/dist/cli/chunks/router-OVNLNGHO.js +2 -0
- package/dist/cli/chunks/routing-feedback-TBOWEB6H.js +2 -0
- package/dist/cli/chunks/{routing-handler-MCDKNBQW.js → routing-handler-SRQNUBG3.js} +2 -2
- package/dist/cli/chunks/{ruvector-commands-OBSYAK2X.js → ruvector-commands-2IGULGDE.js} +2 -2
- package/dist/cli/chunks/rvf-dual-writer-YJYRCYGT.js +2 -0
- package/dist/cli/chunks/rvf-migration-adapter-VMRQ2SFO.js +2 -0
- package/dist/cli/chunks/{rvf-migration-coordinator-4DTRIHY6.js → rvf-migration-coordinator-ZD6WK5CK.js} +2 -2
- package/dist/cli/chunks/rvf-native-adapter-B75L3ALW.js +2 -0
- package/dist/cli/chunks/{rvf-store-integrity-CWAVMRC4.js → rvf-store-integrity-QULKUBBI.js} +2 -2
- package/dist/cli/chunks/safe-db-CRQHMCV6.js +2 -0
- package/dist/cli/chunks/schedule-L3DKJRXU.js +2 -0
- package/dist/cli/chunks/scheduler-VRHYUGY5.js +2 -0
- package/dist/cli/chunks/{security-74TWSO74.js → security-JW4EBARW.js} +3 -3
- package/dist/cli/chunks/{shared-rvf-adapter-ZHNAGE5H.js → shared-rvf-adapter-VQ7NJTGY.js} +2 -2
- package/dist/cli/chunks/{shared-rvf-dual-writer-BS5WAVCC.js → shared-rvf-dual-writer-SKTS52HK.js} +2 -2
- package/dist/cli/chunks/sqlite-persistence-JVAZETTL.js +2 -0
- package/dist/cli/chunks/{standalone-memory-3HGHTE7S.js → standalone-memory-3N4YJCSY.js} +2 -2
- package/dist/cli/chunks/{status-handler-XWEEGNGH.js → status-handler-5BQ2IIDG.js} +2 -2
- package/dist/cli/chunks/{structural-health-TB5JGMVS.js → structural-health-WGYR2RJB.js} +2 -2
- package/dist/cli/chunks/{sync-T4VLBURM.js → sync-DLKSXTIR.js} +2 -2
- package/dist/cli/chunks/sync-R5OKUBTQ.js +2 -0
- package/dist/cli/chunks/{task-handler-RQ65QKXX.js → task-handler-Z5KNTSUX.js} +2 -2
- package/dist/cli/chunks/{task-handlers-USYWJ4H2.js → task-handlers-RZFMYFSC.js} +3 -3
- package/dist/cli/chunks/test-LHWKZJRN.js +34 -0
- package/dist/cli/chunks/test-scheduling-EN7WXUMS.js +15 -0
- package/dist/cli/chunks/token-bootstrap-4V3OO4EC.js +2 -0
- package/dist/cli/chunks/{token-usage-CISTB5K5.js → token-usage-PFC2BYBS.js} +2 -2
- package/dist/cli/chunks/{transformers-C7LV763N.js → transformers-VZCC4SHC.js} +2 -2
- package/dist/cli/chunks/{tree-sitter-wasm-parser-P26JC3YV.js → tree-sitter-wasm-parser-ZYDQXGKN.js} +2 -2
- package/dist/cli/chunks/{types-YMVMKIWB.js → types-I6AWHZZQ.js} +2 -2
- package/dist/cli/chunks/unified-memory-WOOCCIUM.js +2 -0
- package/dist/cli/chunks/unified-memory-hnsw-PDDHFLUB.js +2 -0
- package/dist/cli/chunks/unified-persistence-6ETD3JSC.js +2 -0
- package/dist/cli/chunks/{upgrade-U2REOPAW.js → upgrade-T7SG75PA.js} +2 -2
- package/dist/cli/chunks/{validate-NDTCKN7P.js → validate-YLYEHTY3.js} +2 -2
- package/dist/cli/chunks/{validate-swarm-OJUGVH5Q.js → validate-swarm-VTLTRUE3.js} +2 -2
- package/dist/cli/chunks/visual-security-O4OT2YPY.js +2 -0
- package/dist/cli/chunks/{web-tree-sitter-2CLRSA7K.js → web-tree-sitter-JUM7ZY5M.js} +2 -2
- package/dist/cli/chunks/{windsurf-installer-DSUJJ4PG.js → windsurf-installer-4KS2466T.js} +2 -2
- package/dist/cli/chunks/witness-chain-67JHPDCN.js +2 -0
- package/dist/cli/chunks/{witness-chain-TEGL4ZWB.js → witness-chain-E4X6TOCT.js} +2 -2
- package/dist/cli/chunks/witness-chain-repair-MB53OZO6.js +2 -0
- package/dist/cli/chunks/{witness-chain-verifier-SPXKFC67.js → witness-chain-verifier-LBWJHO7Y.js} +2 -2
- package/dist/cli/chunks/{witness-key-manager-EALOV4OV.js → witness-key-manager-5IHVMXHJ.js} +2 -2
- package/dist/cli/chunks/{workflow-PYI6HCAG.js → workflow-XUQXIRNE.js} +4 -4
- package/dist/cli/chunks/workflow-orchestrator-ZVFSNRYZ.js +2 -0
- package/dist/cli/chunks/wrappers-YVF5SQUN.js +2 -0
- package/dist/cli/commands/test.js +30 -12
- package/dist/cli/utils/generated-test-writer.d.ts +35 -0
- package/dist/cli/utils/generated-test-writer.js +44 -0
- package/dist/context/compiler.js +4 -1
- package/dist/coordination/consensus/providers/ollama-provider.js +16 -27
- package/dist/coordination/consensus/providers/openrouter-provider.js +13 -24
- package/dist/coordination/handlers/test-execution-handlers.js +4 -2
- package/dist/coordination/protocols/defect-investigation.js +4 -1
- package/dist/domains/code-intelligence/services/metric-collector/test-counter.js +3 -3
- package/dist/domains/coverage-analysis/services/gap-detector.js +3 -1
- package/dist/domains/learning-optimization/services/learning-coordinator.js +4 -2
- package/dist/domains/test-execution/services/flaky-detector.js +8 -2
- package/dist/domains/test-execution/services/retry-handler.js +23 -20
- package/dist/domains/test-execution/services/test-executor.js +5 -2
- package/dist/domains/test-generation/services/test-generator.js +5 -2
- package/dist/governance/compliance-reporter.js +8 -7
- package/dist/governance/proof-envelope-integration.js +3 -1
- package/dist/init/phases/07-hooks.js +30 -4
- package/dist/init/phases/10-workers.js +42 -6
- package/dist/integrations/agentic-flow/onnx-embeddings/embedding-generator.d.ts +4 -1
- package/dist/integrations/agentic-flow/onnx-embeddings/embedding-generator.js +6 -2
- package/dist/integrations/browser/qe-dashboard/wasm-vector-store.js +2 -1
- package/dist/integrations/ruvector/coverage-router.d.ts +3 -1
- package/dist/integrations/ruvector/coverage-router.js +7 -6
- package/dist/integrations/ruvector/diff-risk-classifier.js +5 -4
- package/dist/integrations/ruvector/rvf-dual-writer.js +10 -1
- package/dist/integrations/vibium/runtime.js +2 -6
- package/dist/learning/dream/dream-engine.d.ts +5 -0
- package/dist/learning/dream/dream-engine.js +20 -3
- package/dist/learning/embedding-space.d.ts +18 -0
- package/dist/learning/embedding-space.js +33 -0
- package/dist/learning/rvf-pattern-store.js +19 -5
- package/dist/mcp/bundle.js +443 -441
- package/dist/mcp/handlers/handler-factory.js +3 -1
- package/dist/mcp/handlers/save-results-option.d.ts +62 -0
- package/dist/mcp/handlers/save-results-option.js +35 -0
- package/dist/mcp/protocol-server.js +22 -11
- package/dist/mcp/security/rate-limiter.d.ts +8 -1
- package/dist/mcp/security/rate-limiter.js +33 -4
- package/dist/mcp/services/session-resume.js +11 -0
- package/dist/mcp/services/session-store.d.ts +31 -2
- package/dist/mcp/services/session-store.js +84 -15
- package/dist/mcp/services/session-write-buffer.d.ts +55 -0
- package/dist/mcp/services/session-write-buffer.js +144 -0
- package/dist/memory/crdt/g-counter.js +10 -8
- package/dist/shared/embeddings/ollama-client.d.ts +1 -1
- package/dist/shared/embeddings/ollama-client.js +30 -31
- package/dist/shared/git/git-analyzer.d.ts +4 -1
- package/dist/shared/git/git-analyzer.js +9 -4
- package/dist/shared/llm/cost-tracker.js +8 -6
- package/dist/shared/llm/providers/azure-openai.js +5 -21
- package/dist/shared/llm/providers/bedrock.js +5 -21
- package/dist/shared/llm/providers/claude.js +5 -21
- package/dist/shared/llm/providers/cognitum.js +5 -17
- package/dist/shared/llm/providers/gemini.js +9 -23
- package/dist/shared/llm/providers/ollama.js +5 -21
- package/dist/shared/llm/providers/openai.js +5 -21
- package/dist/shared/llm/providers/openrouter.js +9 -23
- package/dist/shared/llm/providers/response-deadline.d.ts +3 -0
- package/dist/shared/llm/providers/response-deadline.js +100 -0
- package/dist/shared/llm/spend-ledger.js +3 -2
- package/dist/shared/metrics/code-metrics.d.ts +1 -0
- package/dist/shared/metrics/code-metrics.js +3 -44
- package/dist/shared/metrics/cognitive-complexity.d.ts +17 -0
- package/dist/shared/metrics/cognitive-complexity.js +108 -0
- package/dist/shared/npm-cli-invocation.d.ts +21 -0
- package/dist/shared/npm-cli-invocation.js +28 -0
- package/dist/shared/optional-module.js +24 -0
- package/dist/shared/test-runner-args.d.ts +42 -0
- package/dist/shared/test-runner-args.js +74 -0
- package/dist/shared/utils/safe-record.d.ts +18 -0
- package/dist/shared/utils/safe-record.js +28 -0
- package/dist/test-scheduling/executors/vitest-executor.js +23 -5
- package/dist/workers/quality-daemon/git-watcher.js +5 -0
- package/package.json +1 -1
- package/dist/adapters/ag-ui/json-patch-utils.d.ts +0 -136
- package/dist/adapters/ag-ui/json-patch-utils.js +0 -575
- package/dist/cli/chunks/adapter-EUIELRLI.js +0 -2
- package/dist/cli/chunks/aqe-learning-engine-LXRKHASR.js +0 -2
- package/dist/cli/chunks/base-4DSLX33Y.js +0 -2
- package/dist/cli/chunks/browser-workflow-AWCQLQZK.js +0 -2
- package/dist/cli/chunks/chunk-E2QHUMCR.js +0 -2
- package/dist/cli/chunks/chunk-I7ECEOFV.js +0 -2
- package/dist/cli/chunks/chunk-LW4BCFIV.js +0 -15
- package/dist/cli/chunks/chunk-QJGKL67W.js +0 -54
- package/dist/cli/chunks/chunk-X43HA3RF.js +0 -14
- package/dist/cli/chunks/chunk-Z3K4JZXQ.js +0 -4
- package/dist/cli/chunks/client-UJVHZXNQ.js +0 -2
- package/dist/cli/chunks/core-handlers-AFXZOSH3.js +0 -2
- package/dist/cli/chunks/cost-tracker-D6YSKTQC.js +0 -2
- package/dist/cli/chunks/cross-domain-router-ZLNVKLIR.js +0 -2
- package/dist/cli/chunks/dream-4OPJXXEG.js +0 -2
- package/dist/cli/chunks/heartbeat-scheduler-J5KLHO6C.js +0 -2
- package/dist/cli/chunks/hnsw-adapter-56P6XSFR.js +0 -2
- package/dist/cli/chunks/hnsw-index-GFZ6XCEW.js +0 -2
- package/dist/cli/chunks/hybrid-backend-TUBWJDDN.js +0 -2
- package/dist/cli/chunks/impact-analyzer-FXVGKS6B.js +0 -2
- package/dist/cli/chunks/init-wizard-LK73HQ7W.js +0 -2
- package/dist/cli/chunks/kernel-TCZDKRSI.js +0 -2
- package/dist/cli/chunks/knowledge-graph-TWMB2GH2.js +0 -2
- package/dist/cli/chunks/llm-router-service-HPDH3P77.js +0 -2
- package/dist/cli/chunks/load-test-HTYOUYSN.js +0 -2
- package/dist/cli/chunks/memory-backend-X5BE2MPK.js +0 -2
- package/dist/cli/chunks/memory-handlers-SQXMFX5X.js +0 -2
- package/dist/cli/chunks/pattern-null-store-OCQGQZU6.js +0 -2
- package/dist/cli/chunks/protocol-executor-CYEQHQCL.js +0 -2
- package/dist/cli/chunks/qe-reasoning-bank-GSTA5WJ4.js +0 -2
- package/dist/cli/chunks/queen-coordinator-Y2Q5RQL7.js +0 -2
- package/dist/cli/chunks/router-4QB5L4IW.js +0 -2
- package/dist/cli/chunks/routing-feedback-YBVHJY5L.js +0 -2
- package/dist/cli/chunks/rvf-dual-writer-T5B456SW.js +0 -2
- package/dist/cli/chunks/rvf-migration-adapter-2O2NL7ZF.js +0 -2
- package/dist/cli/chunks/rvf-native-adapter-RDB3GWTW.js +0 -2
- package/dist/cli/chunks/safe-db-YXVMLFU4.js +0 -2
- package/dist/cli/chunks/schedule-K6XWCCSK.js +0 -2
- package/dist/cli/chunks/scheduler-4MW22D6Q.js +0 -2
- package/dist/cli/chunks/sqlite-persistence-UVDHUSAU.js +0 -2
- package/dist/cli/chunks/sync-LSPNSVDI.js +0 -2
- package/dist/cli/chunks/test-M2XTKD62.js +0 -33
- package/dist/cli/chunks/test-scheduling-GYXJQHJL.js +0 -15
- package/dist/cli/chunks/token-bootstrap-OTEMRUFR.js +0 -2
- package/dist/cli/chunks/unified-memory-UUK77NSE.js +0 -2
- package/dist/cli/chunks/unified-memory-hnsw-JOUE6WNF.js +0 -2
- package/dist/cli/chunks/unified-persistence-3DRJGNQE.js +0 -2
- package/dist/cli/chunks/visual-security-EM7FQG5X.js +0 -2
- package/dist/cli/chunks/witness-chain-7NZ6IIUN.js +0 -2
- package/dist/cli/chunks/witness-chain-repair-ZWS5WXFL.js +0 -2
- package/dist/cli/chunks/workflow-orchestrator-3C3S5FIM.js +0 -2
- package/dist/cli/chunks/wrappers-NXJHGK3W.js +0 -2
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import{createRequire as __cr}from"module";const require=__cr(import.meta.url);if(process.argv.includes('--version')||process.argv.includes('-v')){console.log("3.15.
|
|
2
|
-
import"./chunk-
|
|
1
|
+
import{createRequire as __cr}from"module";const require=__cr(import.meta.url);if(process.argv.includes('--version')||process.argv.includes('-v')){console.log("3.15.3");process.exit(0)}
|
|
2
|
+
import"./chunk-M3ACHBC7.js";import{b as $}from"./chunk-A6PII4R4.js";import{a as k,b as W,c as v,g as C}from"./chunk-QDQLL2QB.js";import{c as b}from"./chunk-UGNTLSBL.js";import"./chunk-Z7UGEQ4G.js";import"./chunk-2GJJGO5D.js";import"./chunk-WSUYEVSY.js";import{Command as D}from"commander";import o from"chalk";function O(w,i){let h=w.indexOf("=");return h>0&&(i[w.substring(0,h)]=w.substring(h+1)),i}function V(w,i,h){let m=new D("workflow").description("Manage QE workflows and pipelines (ADR-041)");return m.command("run <file>").description("Execute a QE pipeline from YAML file").option("-w, --watch","Watch execution progress").option("-v, --verbose","Show detailed output").option("--params <json>","Additional parameters as JSON","{}").action(async(n,t)=>{if(!await h())return;let u=(await import("path")).resolve(n);try{console.log(o.blue(`
|
|
3
3
|
Running workflow from: ${n}
|
|
4
4
|
`));let l=k(u);if(!l.success||!l.workflow){console.log(o.red("Failed to parse pipeline:"));for(let g of l.errors)console.log(o.red(` ${g}`));await i(1)}let f={...b(t.params,"params")};if(l.pipeline){for(let g of l.pipeline.stages)if(g.params)for(let[y,p]of Object.entries(g.params))f[y]=p}if(!w.workflowOrchestrator.getWorkflow(l.workflow.id)){let g=w.workflowOrchestrator.registerWorkflow(l.workflow);g.success||(console.log(o.red(`Failed to register workflow: ${g.error.message}`)),await i(1))}let c=await w.workflowOrchestrator.executeWorkflow(l.workflow.id,f);if(!c.success){console.log(o.red(`Failed to start workflow: ${c.error.message}`)),await i(1);return}let a=c.value;if(console.log(o.cyan(` Execution ID: ${a}`)),console.log(o.gray(` Workflow: ${l.workflow.name}`)),console.log(o.gray(` Stages: ${l.workflow.steps.length}`)),console.log(""),t.watch){console.log(o.blue(`Workflow Progress:
|
|
5
5
|
`));let g,y=Date.now();for(;;){let d=w.workflowOrchestrator.getWorkflowStatus(a);if(!d)break;if(!g||g.progress!==d.progress||g.status!==d.status||JSON.stringify(g.currentSteps)!==JSON.stringify(d.currentSteps)){process.stdout.write("\r\x1B[K");let S="\u2588".repeat(Math.floor(d.progress/5))+"\u2591".repeat(20-Math.floor(d.progress/5)),R=d.status==="completed"?o.green:d.status==="failed"?o.red:d.status==="running"?o.yellow:o.gray;console.log(` [${S}] ${d.progress}% - ${R(d.status)}`),d.currentSteps.length>0&&t.verbose&&console.log(o.gray(` Running: ${d.currentSteps.join(", ")}`)),g=d}if(d.status==="completed"||d.status==="failed"||d.status==="cancelled")break;await new Promise(S=>setTimeout(S,500))}let p=w.workflowOrchestrator.getWorkflowStatus(a);if(p){console.log("");let d=p.duration||Date.now()-y;p.status==="completed"?(console.log(o.green("Workflow completed successfully")),console.log(o.gray(` Duration: ${$(d)}`)),console.log(o.gray(` Completed: ${p.completedSteps.length} stages`)),p.skippedSteps.length>0&&console.log(o.yellow(` Skipped: ${p.skippedSteps.length} stages`))):p.status==="failed"?(console.log(o.red("Workflow failed")),console.log(o.red(` Error: ${p.error}`)),console.log(o.gray(` Failed stages: ${p.failedSteps.join(", ")}`))):console.log(o.yellow(`Workflow ${p.status}`))}console.log(""),await i(p?.status==="completed"?0:1);return}else console.log(o.green("Workflow execution started")),console.log(o.gray(` Use 'aqe workflow status ${a}' to check progress`));console.log(""),await i(0)}catch(l){console.error(o.red(`
|
|
@@ -35,10 +35,10 @@ Workflow cancelled: ${n}
|
|
|
35
35
|
`)):console.log(o.red(`
|
|
36
36
|
Failed to cancel workflow: ${t.error.message}
|
|
37
37
|
`)),await i(t.success?0:1)}catch(t){console.error(o.red(`
|
|
38
|
-
Failed to cancel workflow:`),t),await i(1)}}),m.command("browser-list").description("List available browser workflow templates").action(async()=>{try{let{BrowserWorkflowTool:n}=await import("./browser-workflow-
|
|
38
|
+
Failed to cancel workflow:`),t),await i(1)}}),m.command("browser-list").description("List available browser workflow templates").action(async()=>{try{let{BrowserWorkflowTool:n}=await import("./browser-workflow-AEMIS6PA.js"),e=await new n().invoke({});if(e.success&&e.data){console.log(o.blue(`
|
|
39
39
|
Browser Workflow Templates:
|
|
40
40
|
`));for(let u of e.data.availableTemplates)console.log(` ${o.cyan(u)}`);console.log("")}else console.log(o.red(`Failed: ${e.error||"Unknown error"}`));await i(0)}catch(n){console.error(o.red(`
|
|
41
|
-
Failed:`),n),await i(1)}}),m.command("browser-load [template]").description("Load and validate a browser workflow template or inline YAML").option("--yaml <yaml>","Inline YAML workflow definition").option("-v, --var <key=value>","Variable override (repeatable)",O,{}).option("-F, --format <format>","Output format (text|json)","text").option("-o, --output <path>","Write output to file").action(async(n,t)=>{try{let{BrowserWorkflowTool:e}=await import("./browser-workflow-
|
|
41
|
+
Failed:`),n),await i(1)}}),m.command("browser-load [template]").description("Load and validate a browser workflow template or inline YAML").option("--yaml <yaml>","Inline YAML workflow definition").option("-v, --var <key=value>","Variable override (repeatable)",O,{}).option("-F, --format <format>","Output format (text|json)","text").option("-o, --output <path>","Write output to file").action(async(n,t)=>{try{let{BrowserWorkflowTool:e}=await import("./browser-workflow-AEMIS6PA.js"),{writeOutput:u,toJSON:l}=await import("./ci-output-DPHTFIGX.js"),s=new e,f={variables:t.var||{}};if(t.yaml)f.workflowYaml=t.yaml;else if(n)if(n.endsWith(".yaml")||n.endsWith(".yml")){let c=await import("fs"),g=(await import("path")).resolve(n);c.existsSync(g)||(console.log(o.red(`
|
|
42
42
|
File not found: ${g}
|
|
43
43
|
`)),await i(1)),f.workflowYaml=c.readFileSync(g,"utf-8")}else f.templateName=n;else console.log(o.red(`
|
|
44
44
|
Provide a template name or --yaml. Use "workflow browser-list" to see templates.
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{createRequire as __cr}from"module";const require=__cr(import.meta.url);if(process.argv.includes('--version')||process.argv.includes('-v')){console.log("3.15.3");process.exit(0)}
|
|
2
|
+
import{a,b,c,d}from"./chunk-AEL4XJGJ.js";import"./chunk-DH5NWHH2.js";import"./chunk-7SWHW5AC.js";import"./chunk-OGARNKLS.js";import"./chunk-UGNTLSBL.js";import"./chunk-ASUXS4N4.js";import"./chunk-UTALYUMW.js";import"./chunk-NT6FYFJA.js";import"./chunk-7TW5UGDP.js";import"./chunk-D6PUDLJ4.js";import"./chunk-M3ONCPSU.js";import"./chunk-HVIFA73X.js";import"./chunk-CNQUU6CF.js";import"./chunk-POTVF6BY.js";import"./chunk-Z7UGEQ4G.js";import"./chunk-WSND64RL.js";import"./chunk-INVDDFJC.js";import"./chunk-FPFGN2Z5.js";import"./chunk-WLOHTLHO.js";import"./chunk-2GJJGO5D.js";import"./chunk-6TYTBQPV.js";import"./chunk-YTRGMILO.js";import"./chunk-Z7JPWXW2.js";import"./chunk-34Y4CIHD.js";import"./chunk-WSUYEVSY.js";export{b as DEFAULT_WORKFLOW_CONFIG,a as WorkflowEvents,c as WorkflowOrchestrator,d as createWorkflowOrchestrator};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{createRequire as __cr}from"module";const require=__cr(import.meta.url);if(process.argv.includes('--version')||process.argv.includes('-v')){console.log("3.15.3");process.exit(0)}
|
|
2
|
+
import{a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v as L,w as M,x as N}from"./chunk-YQ3ZW47V.js";import{a as v,b as w,c as x,d as y,e as z,f as A,g as B,h as C,i as D,j as E,k as F,l as G,m as H,n as I,o as J,p as K}from"./chunk-WTMLRMKW.js";import"./chunk-7SWHW5AC.js";import"./chunk-OGARNKLS.js";import"./chunk-UGNTLSBL.js";import"./chunk-ASUXS4N4.js";import"./chunk-UTALYUMW.js";import"./chunk-NT6FYFJA.js";import"./chunk-7TW5UGDP.js";import"./chunk-D6PUDLJ4.js";import"./chunk-M3ONCPSU.js";import"./chunk-HVIFA73X.js";import"./chunk-CNQUU6CF.js";import"./chunk-WSND64RL.js";import"./chunk-INVDDFJC.js";import"./chunk-FPFGN2Z5.js";import"./chunk-WLOHTLHO.js";import"./chunk-2GJJGO5D.js";import"./chunk-6TYTBQPV.js";import"./chunk-YTRGMILO.js";import"./chunk-Z7JPWXW2.js";import"./chunk-34Y4CIHD.js";import"./chunk-WSUYEVSY.js";export{z as GNNLayerFactory,i as QEFlashAttention,x as QEGNNEmbeddingIndex,y as QEGNNIndexFactory,a as QESONA,e as QE_FLASH_ATTENTION_CONFIG,g as QE_PERFORMANCE_TARGETS,f as QE_SONA_CONFIG,A as TensorCompressionFactory,u as batchComputeAttention,K as batchDifferentiableSearch,M as checkRuvectorPackagesAvailable,c as createDomainQESONA,j as createQEFlashAttention,b as createQESONA,D as getDifferentiableSearch,F as getGetCompressionLevel,E as getHierarchicalForward,G as getInit,h as getOptimalBlockConfig,k as getQEFlashAttentionConfig,n as getRuvectorDotProductAttention,m as getRuvectorFlashAttention,p as getRuvectorHyperbolicAttention,B as getRuvectorLayer,q as getRuvectorLinearAttention,r as getRuvectorMoEAttention,o as getRuvectorMultiHeadAttention,L as getRuvectorPackageVersions,C as getTensorCompress,l as getWorkloadTypes,N as initAllRuvectorPackages,w as initGNN,d as isAttentionAvailable,v as isGNNAvailable,s as toFloat32Array,H as toFloat32ArrayGNN,J as toIEmbedding,t as toNumberArrayAttn,I as toNumberArrayGNN};
|
|
@@ -9,6 +9,8 @@ import { filterTestFilesForFramework, walkSourceFiles } from '../utils/file-disc
|
|
|
9
9
|
import { writeOutput, toJSON, toJUnit, testRunToMarkdown } from '../utils/ci-output.js';
|
|
10
10
|
import { writeQualityEvidence } from '../../domains/quality-assessment/quality-evidence.js';
|
|
11
11
|
import { validateBehaviorExamples } from '../../domains/test-generation/services/behavior-example-validation.js';
|
|
12
|
+
import { findProjectRoot } from '../../kernel/project-root.js';
|
|
13
|
+
import { writeGeneratedTestFile } from '../utils/generated-test-writer.js';
|
|
12
14
|
export function createTestCommand(context, cleanupAndExit, ensureInitialized) {
|
|
13
15
|
const testCmd = new Command('test')
|
|
14
16
|
.description('Test generation, execution, scheduling, and load testing')
|
|
@@ -20,6 +22,7 @@ export function createTestCommand(context, cleanupAndExit, ensureInitialized) {
|
|
|
20
22
|
.option('-F, --format <format>', 'Output format (text|json|junit|markdown)', 'text')
|
|
21
23
|
.option('-o, --output <path>', 'Write output to file')
|
|
22
24
|
.option('--no-save', 'generate action: print the generated test code instead of writing test files beside the source (#925)')
|
|
25
|
+
.option('--force', 'generate action: overwrite existing test files instead of skipping them')
|
|
23
26
|
.option('--git-ref <ref>', 'Git ref for schedule action (e.g., main, HEAD~3)')
|
|
24
27
|
.option('--no-git-aware', 'Disable git-aware test selection (schedule action)')
|
|
25
28
|
.option('--no-flaky', 'Disable flaky test tracking (schedule action)')
|
|
@@ -96,11 +99,16 @@ export function createTestCommand(context, cleanupAndExit, ensureInitialized) {
|
|
|
96
99
|
// Default text output
|
|
97
100
|
console.log(chalk.green(`Generated ${generated.tests.length} tests\n`));
|
|
98
101
|
console.log(chalk.cyan(' Tests:'));
|
|
99
|
-
// #925:
|
|
100
|
-
//
|
|
102
|
+
// #925/#936: every generated test is handled, with or without
|
|
103
|
+
// --no-save. A cap here used to drop tests past the 10th
|
|
104
|
+
// without writing or printing them.
|
|
101
105
|
const noSave = options.save === false;
|
|
102
|
-
|
|
103
|
-
|
|
106
|
+
// Files may only be written inside the project that owns the target.
|
|
107
|
+
const fs = await import('fs');
|
|
108
|
+
const projectRoot = findProjectRoot(fs.statSync(targetPath).isDirectory() ? targetPath : path.dirname(targetPath));
|
|
109
|
+
let written = 0;
|
|
110
|
+
let skipped = 0;
|
|
111
|
+
for (const test of generated.tests) {
|
|
104
112
|
console.log(` ${chalk.white(test.name)}`);
|
|
105
113
|
console.log(chalk.gray(` Source: ${path.basename(test.sourceFile)}`));
|
|
106
114
|
console.log(chalk.gray(` Assertions: ${test.assertions}`));
|
|
@@ -113,16 +121,26 @@ export function createTestCommand(context, cleanupAndExit, ensureInitialized) {
|
|
|
113
121
|
continue;
|
|
114
122
|
}
|
|
115
123
|
console.log(chalk.gray(` Test File: ${test.testFile}`));
|
|
116
|
-
// Bug #295 fix: Write generated test code to disk
|
|
117
|
-
|
|
118
|
-
const
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
124
|
+
// Bug #295 fix: Write generated test code to disk, but never
|
|
125
|
+
// outside the project or over an existing file without --force.
|
|
126
|
+
const outcome = writeGeneratedTestFile(test.testFile, test.testCode, { projectRoot, force: options.force === true });
|
|
127
|
+
if (outcome.status === 'written') {
|
|
128
|
+
console.log(chalk.green(` Written to: ${outcome.path}`));
|
|
129
|
+
written++;
|
|
130
|
+
}
|
|
131
|
+
else if (outcome.status === 'exists') {
|
|
132
|
+
console.log(chalk.yellow(` ${outcome.path} exists, skipped (use --force to overwrite)`));
|
|
133
|
+
skipped++;
|
|
134
|
+
}
|
|
135
|
+
else {
|
|
136
|
+
console.log(chalk.red(` ${outcome.path} is outside the project root ${projectRoot}, skipped (not written)`));
|
|
137
|
+
skipped++;
|
|
138
|
+
}
|
|
122
139
|
}
|
|
123
140
|
}
|
|
124
|
-
if (!noSave
|
|
125
|
-
|
|
141
|
+
if (!noSave) {
|
|
142
|
+
const skippedNote = skipped > 0 ? ` (${skipped} skipped)` : '';
|
|
143
|
+
console.log(chalk.gray(`\n Wrote ${written} of ${generated.tests.length} generated test files${skippedNote}.`));
|
|
126
144
|
}
|
|
127
145
|
console.log(`\n Coverage Estimate: ${chalk.yellow(generated.coverageEstimate == null ? 'Unmeasured' : generated.coverageEstimate + '%')}`);
|
|
128
146
|
if (generated.patternsUsed.length > 0) {
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agentic QE v3 - Generated test file writer (#936 follow-up)
|
|
3
|
+
*
|
|
4
|
+
* `aqe test generate` writes each generated test beside its source. This
|
|
5
|
+
* module decides whether a single write is safe:
|
|
6
|
+
* - the resolved path must stay inside the project root, so a bad path
|
|
7
|
+
* (for example from a directory named `my.ts-app`) can never create files
|
|
8
|
+
* outside the project;
|
|
9
|
+
* - an existing file is never replaced unless the caller passed --force,
|
|
10
|
+
* because generated files carry no marker that tells them apart from
|
|
11
|
+
* hand-written tests.
|
|
12
|
+
*
|
|
13
|
+
* @module cli/utils/generated-test-writer
|
|
14
|
+
*/
|
|
15
|
+
export type GeneratedTestWriteStatus = 'written' | 'exists' | 'outside-project';
|
|
16
|
+
export interface GeneratedTestWriteResult {
|
|
17
|
+
status: GeneratedTestWriteStatus;
|
|
18
|
+
/** Absolute path that was (or would have been) written. */
|
|
19
|
+
path: string;
|
|
20
|
+
}
|
|
21
|
+
export interface GeneratedTestWriteOptions {
|
|
22
|
+
/** Directory every written file must stay inside. */
|
|
23
|
+
projectRoot: string;
|
|
24
|
+
/** Overwrite an existing file instead of skipping it. */
|
|
25
|
+
force?: boolean;
|
|
26
|
+
}
|
|
27
|
+
/** True when `file` is inside `root` (never equal to it). */
|
|
28
|
+
export declare function isInsideRoot(file: string, root: string): boolean;
|
|
29
|
+
/**
|
|
30
|
+
* Write one generated test file if it is safe to do so.
|
|
31
|
+
*
|
|
32
|
+
* @returns what happened; nothing is written unless status is 'written'.
|
|
33
|
+
*/
|
|
34
|
+
export declare function writeGeneratedTestFile(testFile: string, testCode: string, options: GeneratedTestWriteOptions): GeneratedTestWriteResult;
|
|
35
|
+
//# sourceMappingURL=generated-test-writer.d.ts.map
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agentic QE v3 - Generated test file writer (#936 follow-up)
|
|
3
|
+
*
|
|
4
|
+
* `aqe test generate` writes each generated test beside its source. This
|
|
5
|
+
* module decides whether a single write is safe:
|
|
6
|
+
* - the resolved path must stay inside the project root, so a bad path
|
|
7
|
+
* (for example from a directory named `my.ts-app`) can never create files
|
|
8
|
+
* outside the project;
|
|
9
|
+
* - an existing file is never replaced unless the caller passed --force,
|
|
10
|
+
* because generated files carry no marker that tells them apart from
|
|
11
|
+
* hand-written tests.
|
|
12
|
+
*
|
|
13
|
+
* @module cli/utils/generated-test-writer
|
|
14
|
+
*/
|
|
15
|
+
import * as fs from 'fs';
|
|
16
|
+
import * as path from 'path';
|
|
17
|
+
/** True when `file` is inside `root` (never equal to it). */
|
|
18
|
+
export function isInsideRoot(file, root) {
|
|
19
|
+
const rel = path.relative(path.resolve(root), path.resolve(file));
|
|
20
|
+
return rel !== '' && !rel.startsWith('..') && !path.isAbsolute(rel);
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Write one generated test file if it is safe to do so.
|
|
24
|
+
*
|
|
25
|
+
* @returns what happened; nothing is written unless status is 'written'.
|
|
26
|
+
*/
|
|
27
|
+
export function writeGeneratedTestFile(testFile, testCode, options) {
|
|
28
|
+
const target = path.resolve(testFile);
|
|
29
|
+
if (!isInsideRoot(target, options.projectRoot)) {
|
|
30
|
+
return { status: 'outside-project', path: target };
|
|
31
|
+
}
|
|
32
|
+
fs.mkdirSync(path.dirname(target), { recursive: true });
|
|
33
|
+
try {
|
|
34
|
+
// 'wx' fails if the file exists, so the check and the write are atomic.
|
|
35
|
+
fs.writeFileSync(target, testCode, { encoding: 'utf-8', flag: options.force ? 'w' : 'wx' });
|
|
36
|
+
}
|
|
37
|
+
catch (error) {
|
|
38
|
+
if (error.code === 'EEXIST')
|
|
39
|
+
return { status: 'exists', path: target };
|
|
40
|
+
throw error;
|
|
41
|
+
}
|
|
42
|
+
return { status: 'written', path: target };
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=generated-test-writer.js.map
|
package/dist/context/compiler.js
CHANGED
|
@@ -116,7 +116,10 @@ export class ContextCompiler {
|
|
|
116
116
|
return { size: this.cache.size, ttlMs: this.cacheTtl };
|
|
117
117
|
}
|
|
118
118
|
buildCacheKey(request) {
|
|
119
|
-
|
|
119
|
+
// JSON tuple: a ',' or ':' in a file name or agent type cannot shift fields (#914).
|
|
120
|
+
// Sort a copy so the caller's targetFiles array is not reordered.
|
|
121
|
+
const files = [...request.targetFiles].sort();
|
|
122
|
+
return JSON.stringify([request.agentType, files, request.taskDescription.slice(0, 100)]);
|
|
120
123
|
}
|
|
121
124
|
generateSummary(request, fragments, sources) {
|
|
122
125
|
return [
|
|
@@ -12,6 +12,7 @@ import { BaseModelProvider } from '../model-provider.js';
|
|
|
12
12
|
import { CONSENSUS_CONSTANTS, OLLAMA_CONSTANTS } from '../../constants.js';
|
|
13
13
|
import { toErrorMessage, toError } from '../../../shared/error-utils.js';
|
|
14
14
|
import { resolveOllamaBaseUrl } from '../../../shared/llm/ollama-url.js';
|
|
15
|
+
import { fetchWithResponseDeadline } from '../../../shared/llm/providers/response-deadline.js';
|
|
15
16
|
// ============================================================================
|
|
16
17
|
// Model Information
|
|
17
18
|
// ============================================================================
|
|
@@ -102,13 +103,9 @@ export class OllamaModelProvider extends BaseModelProvider {
|
|
|
102
103
|
*/
|
|
103
104
|
async listModels() {
|
|
104
105
|
try {
|
|
105
|
-
|
|
106
|
-
const
|
|
107
|
-
const response = await
|
|
108
|
-
method: 'GET',
|
|
109
|
-
signal: controller.signal,
|
|
110
|
-
});
|
|
111
|
-
clearTimeout(timeoutId);
|
|
106
|
+
// The deadline stays armed until the body is read (issue #961).
|
|
107
|
+
const timeoutMs = CONSENSUS_CONSTANTS.OLLAMA_CONNECTION_TEST_TIMEOUT_MS;
|
|
108
|
+
const response = await fetchWithResponseDeadline(`${this.config.baseUrl}/api/tags`, { method: 'GET' }, timeoutMs, () => new Error(`Ollama list models timed out after ${timeoutMs}ms`));
|
|
112
109
|
if (!response.ok) {
|
|
113
110
|
throw new Error(`Failed to list models: ${response.status}`);
|
|
114
111
|
}
|
|
@@ -233,27 +230,19 @@ export class OllamaModelProvider extends BaseModelProvider {
|
|
|
233
230
|
* Make a request to Ollama API
|
|
234
231
|
*/
|
|
235
232
|
async makeRequest(request, timeout) {
|
|
236
|
-
|
|
237
|
-
const
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
});
|
|
247
|
-
clearTimeout(timeoutId);
|
|
248
|
-
if (!response.ok) {
|
|
249
|
-
const errorBody = await response.text();
|
|
250
|
-
throw new Error(`Ollama API error: ${response.status} - ${errorBody}`);
|
|
251
|
-
}
|
|
252
|
-
return (await response.json());
|
|
253
|
-
}
|
|
254
|
-
finally {
|
|
255
|
-
clearTimeout(timeoutId);
|
|
233
|
+
// One deadline covers headers and the whole body, error bodies included (issue #961).
|
|
234
|
+
const response = await fetchWithResponseDeadline(`${this.config.baseUrl}/api/chat`, {
|
|
235
|
+
method: 'POST',
|
|
236
|
+
headers: {
|
|
237
|
+
'Content-Type': 'application/json',
|
|
238
|
+
},
|
|
239
|
+
body: JSON.stringify(request),
|
|
240
|
+
}, timeout, () => new Error(`Ollama request timed out after ${timeout}ms`));
|
|
241
|
+
if (!response.ok) {
|
|
242
|
+
const errorBody = await response.text();
|
|
243
|
+
throw new Error(`Ollama API error: ${response.status} - ${errorBody}`);
|
|
256
244
|
}
|
|
245
|
+
return (await response.json());
|
|
257
246
|
}
|
|
258
247
|
/**
|
|
259
248
|
* Check if an error is non-retryable
|
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
import { BaseModelProvider } from '../model-provider.js';
|
|
12
12
|
import { toErrorMessage, toError } from '../../../shared/error-utils.js';
|
|
13
13
|
import { resolveModelPricing } from '../../../shared/llm/cost-tracker.js';
|
|
14
|
+
import { fetchWithResponseDeadline } from '../../../shared/llm/providers/response-deadline.js';
|
|
14
15
|
// ============================================================================
|
|
15
16
|
// Model Cost and Tier Information
|
|
16
17
|
// ============================================================================
|
|
@@ -286,31 +287,19 @@ export class OpenRouterModelProvider extends BaseModelProvider {
|
|
|
286
287
|
* Make a request to OpenRouter API
|
|
287
288
|
*/
|
|
288
289
|
async makeRequest(request, timeout) {
|
|
289
|
-
const
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
const
|
|
299
|
-
|
|
300
|
-
headers,
|
|
301
|
-
body: JSON.stringify(request),
|
|
302
|
-
signal: controller.signal,
|
|
303
|
-
});
|
|
304
|
-
clearTimeout(timeoutId);
|
|
305
|
-
if (!response.ok) {
|
|
306
|
-
const errorBody = await response.text();
|
|
307
|
-
throw new Error(`OpenRouter API error: ${response.status} - ${errorBody}`);
|
|
308
|
-
}
|
|
309
|
-
return (await response.json());
|
|
310
|
-
}
|
|
311
|
-
finally {
|
|
312
|
-
clearTimeout(timeoutId);
|
|
290
|
+
const headers = {
|
|
291
|
+
Authorization: `Bearer ${this.config.apiKey}`,
|
|
292
|
+
'Content-Type': 'application/json',
|
|
293
|
+
'HTTP-Referer': this.config.siteUrl || 'https://github.com/agentic-qe',
|
|
294
|
+
'X-Title': this.config.appName || 'Agentic QE',
|
|
295
|
+
};
|
|
296
|
+
// One deadline covers headers and the whole body, error bodies included (issue #961).
|
|
297
|
+
const response = await fetchWithResponseDeadline('https://openrouter.ai/api/v1/chat/completions', { method: 'POST', headers, body: JSON.stringify(request) }, timeout, () => new Error(`OpenRouter request timed out after ${timeout}ms`));
|
|
298
|
+
if (!response.ok) {
|
|
299
|
+
const errorBody = await response.text();
|
|
300
|
+
throw new Error(`OpenRouter API error: ${response.status} - ${errorBody}`);
|
|
313
301
|
}
|
|
302
|
+
return (await response.json());
|
|
314
303
|
}
|
|
315
304
|
/**
|
|
316
305
|
* Check if an error is non-retryable
|
|
@@ -10,6 +10,7 @@ import { ok, err } from '../../shared/types/index.js';
|
|
|
10
10
|
import { toError } from '../../shared/error-utils.js';
|
|
11
11
|
import { getTestRunnerExecutionError, TestRunnerExecutionError } from '../../shared/test-runner-verdict.js';
|
|
12
12
|
import { createVitestJsonReport } from '../../shared/vitest-json-report.js';
|
|
13
|
+
import { jestExactPathPattern, runnerFilePath } from '../../shared/test-runner-args.js';
|
|
13
14
|
function escapeRegExp(s) {
|
|
14
15
|
return s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
15
16
|
}
|
|
@@ -190,7 +191,8 @@ export function registerTestExecutionHandlers(ctx) {
|
|
|
190
191
|
let execution;
|
|
191
192
|
let output;
|
|
192
193
|
try {
|
|
193
|
-
|
|
194
|
+
// #909: absolute paths cannot be read as flags (e.g. a "--watch" entry).
|
|
195
|
+
execution = spawnSync('npx', ['vitest', 'run', ...testFiles.map(file => runnerFilePath(file, options.cwd)), '--reporter=json', ...report.args], options);
|
|
194
196
|
output = execution.error || execution.signal
|
|
195
197
|
? ''
|
|
196
198
|
: report.read(execution.stdout || '') ?? '';
|
|
@@ -201,7 +203,7 @@ export function registerTestExecutionHandlers(ctx) {
|
|
|
201
203
|
// Preserve the existing Jest fallback when Vitest cannot produce a report.
|
|
202
204
|
if (!output.includes('{') && execution.status !== 0 && !execution.error && !execution.signal) {
|
|
203
205
|
runner = 'jest';
|
|
204
|
-
execution = spawnSync('npx', ['jest', ...testFiles, '--json'], options);
|
|
206
|
+
execution = spawnSync('npx', ['jest', ...testFiles.map(file => jestExactPathPattern(file, options.cwd)), '--json'], options);
|
|
205
207
|
output = execution.stdout || '';
|
|
206
208
|
}
|
|
207
209
|
const diagnostics = [execution.error?.message, execution.signal && `Terminated by ${execution.signal}`, execution.stderr, output].filter(Boolean).join('\n');
|
|
@@ -11,6 +11,7 @@ import { ok, err, } from '../../shared/types/index.js';
|
|
|
11
11
|
import { createEvent } from '../../shared/events/domain-events.js';
|
|
12
12
|
import { toError } from '../../shared/error-utils.js';
|
|
13
13
|
import { LoggerFactory } from '../../logging/index.js';
|
|
14
|
+
import { addToCount } from '../../shared/utils/safe-record.js';
|
|
14
15
|
const logger = LoggerFactory.create('defect-investigation');
|
|
15
16
|
export const DefectInvestigationEvents = {
|
|
16
17
|
DefectInvestigationStarted: 'coordination.DefectInvestigationStarted',
|
|
@@ -351,7 +352,9 @@ export class DefectInvestigationProtocol {
|
|
|
351
352
|
totalInvestigations: 0,
|
|
352
353
|
};
|
|
353
354
|
const pattern = result.rootCause.rootCause;
|
|
354
|
-
|
|
355
|
+
// Root causes are free text and stats come back from storage as plain
|
|
356
|
+
// objects, so read and write own properties only (#914).
|
|
357
|
+
addToCount(stats.patterns, pattern);
|
|
355
358
|
stats.totalInvestigations += 1;
|
|
356
359
|
await this.memory.set(patternKey, stats, {
|
|
357
360
|
namespace: this.config.namespace,
|
|
@@ -274,10 +274,10 @@ function countCargoTests(projectPath, config) {
|
|
|
274
274
|
// Count lines ending with ": test"
|
|
275
275
|
const testLines = output.split('\n').filter(line => line.endsWith(': test'));
|
|
276
276
|
const total = testLines.length;
|
|
277
|
-
//
|
|
278
|
-
const unit = testLines.filter(t => !t.includes('integration') && !t.includes('e2e')).length;
|
|
279
|
-
const integration = testLines.filter(t => t.includes('integration')).length;
|
|
277
|
+
// Disjoint categories, e2e before integration: `tests::integration::e2e_x` counts once.
|
|
280
278
|
const e2e = testLines.filter(t => t.includes('e2e')).length;
|
|
279
|
+
const integration = testLines.filter(t => !t.includes('e2e') && t.includes('integration')).length;
|
|
280
|
+
const unit = total - integration - e2e;
|
|
281
281
|
return {
|
|
282
282
|
total,
|
|
283
283
|
unit,
|
|
@@ -9,6 +9,7 @@ import { ok, err } from '../../../shared/types/index.js';
|
|
|
9
9
|
import { toError } from '../../../shared/error-utils.js';
|
|
10
10
|
import { safeJsonParse } from '../../../shared/safe-json.js';
|
|
11
11
|
import { getClaudeModelForTier } from '../../../shared/llm/model-registry.js';
|
|
12
|
+
import { createSafeRecord } from '../../../shared/utils/safe-record.js';
|
|
12
13
|
const DEFAULT_CONFIG = {
|
|
13
14
|
minCoverage: 80,
|
|
14
15
|
enableLLMAnalysis: true, // On by default - opt-out
|
|
@@ -212,7 +213,8 @@ Return JSON in this exact format:
|
|
|
212
213
|
* Calculate effort breakdown by file
|
|
213
214
|
*/
|
|
214
215
|
calculateEffortBreakdown(gaps) {
|
|
215
|
-
|
|
216
|
+
// File paths are data, so the buckets must not inherit from Object.prototype (#914).
|
|
217
|
+
const breakdown = createSafeRecord();
|
|
216
218
|
for (const gap of gaps) {
|
|
217
219
|
const effort = Math.ceil(gap.lines.length / 15);
|
|
218
220
|
breakdown[gap.file] = (breakdown[gap.file] || 0) + effort;
|
|
@@ -9,6 +9,7 @@ import { rehydrateDates } from '../../../shared/utils/kv-date-rehydrate.js';
|
|
|
9
9
|
import { toError } from '../../../shared/error-utils.js';
|
|
10
10
|
import { createQEFlashAttention, } from '../../../integrations/ruvector/wrappers.js';
|
|
11
11
|
import { getClaudeModelForTier } from '../../../shared/llm/model-registry.js';
|
|
12
|
+
import { createSafeRecord } from '../../../shared/utils/safe-record.js';
|
|
12
13
|
const DEFAULT_CONFIG = {
|
|
13
14
|
minExperiencesForPattern: 5,
|
|
14
15
|
patternConfidenceThreshold: 0.7,
|
|
@@ -943,8 +944,9 @@ Provide:
|
|
|
943
944
|
return false;
|
|
944
945
|
}
|
|
945
946
|
calculateCentroid(experiences) {
|
|
946
|
-
|
|
947
|
-
const
|
|
947
|
+
// Metric names come from stored experiences (#914).
|
|
948
|
+
const avgMetrics = createSafeRecord();
|
|
949
|
+
const metricCounts = createSafeRecord();
|
|
948
950
|
for (const exp of experiences) {
|
|
949
951
|
for (const [key, value] of Object.entries(exp.state.metrics)) {
|
|
950
952
|
avgMetrics[key] = (avgMetrics[key] || 0) + value;
|
|
@@ -13,6 +13,7 @@ import { toError } from '../../../shared/error-utils.js';
|
|
|
13
13
|
import { safeJsonParse } from '../../../shared/safe-json.js';
|
|
14
14
|
import { getTestRunnerExecutionError } from '../../../shared/test-runner-verdict.js';
|
|
15
15
|
import { createVitestJsonReport, needsVitestJsonReportFile } from '../../../shared/vitest-json-report.js';
|
|
16
|
+
import { isJestCommand, jestExactPathPattern, runnerFilePath } from '../../../shared/test-runner-args.js';
|
|
16
17
|
import { secureRandom } from '../../../shared/utils/crypto-random.js';
|
|
17
18
|
const DEFAULT_FLAKY_CONFIG = {
|
|
18
19
|
simulateForTesting: false,
|
|
@@ -256,14 +257,19 @@ export class FlakyDetectorService {
|
|
|
256
257
|
const runId = uuidv4();
|
|
257
258
|
const startTime = Date.now();
|
|
258
259
|
return new Promise((resolve, reject) => {
|
|
259
|
-
const
|
|
260
|
+
const cwd = this.config.cwd ?? process.cwd();
|
|
261
|
+
// #909: pass an absolute path (never read as a flag); Jest reads it as a
|
|
262
|
+
// regex, so escape and anchor it to select exactly this file.
|
|
263
|
+
const fileArg = isJestCommand([this.config.testRunner, ...this.config.testRunnerArgs])
|
|
264
|
+
? jestExactPathPattern(file, cwd)
|
|
265
|
+
: runnerFilePath(file, cwd);
|
|
266
|
+
const baseArgs = [...this.config.testRunnerArgs, fileArg];
|
|
260
267
|
// Vitest 5 writes --reporter=json output to a file, not stdout. Detect
|
|
261
268
|
// Vitest from the runner command too (testRunner: 'vitest', args: ['run', ...]).
|
|
262
269
|
const report = needsVitestJsonReportFile([this.config.testRunner, ...baseArgs])
|
|
263
270
|
? createVitestJsonReport()
|
|
264
271
|
: undefined;
|
|
265
272
|
const args = report ? [...baseArgs, ...report.args] : baseArgs;
|
|
266
|
-
const cwd = this.config.cwd ?? process.cwd();
|
|
267
273
|
const child = spawn(this.config.testRunner, args, {
|
|
268
274
|
cwd,
|
|
269
275
|
env: { ...process.env, ...this.config.env },
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
import { LoggerFactory } from '../../../logging/index.js';
|
|
6
6
|
import { spawn } from 'node:child_process';
|
|
7
7
|
import { createVitestJsonReport } from '../../../shared/vitest-json-report.js';
|
|
8
|
+
import { jestExactPathPattern, nameFilterArg, runnerFilePath } from '../../../shared/test-runner-args.js';
|
|
8
9
|
import { existsSync, readFileSync } from 'node:fs';
|
|
9
10
|
import { ok, err } from '../../../shared/types/index.js';
|
|
10
11
|
import { TEST_EXECUTION_CONSTANTS, RETRY_CONSTANTS } from '../../constants.js';
|
|
@@ -264,7 +265,7 @@ export class RetryHandlerService {
|
|
|
264
265
|
`or configure testRunner in RetryHandlerConfig. Cannot execute retry for: ${testFile}`);
|
|
265
266
|
}
|
|
266
267
|
// Build command based on runner
|
|
267
|
-
const { command, args, report } = this.buildTestCommand(runner, testFile, testName);
|
|
268
|
+
const { command, args, report } = this.buildTestCommand(runner, testFile, testName, cwd);
|
|
268
269
|
// Execute the test
|
|
269
270
|
return this.spawnTestProcess(command, args, cwd, report);
|
|
270
271
|
}
|
|
@@ -334,40 +335,42 @@ export class RetryHandlerService {
|
|
|
334
335
|
/**
|
|
335
336
|
* Build the command and arguments for the test runner
|
|
336
337
|
*/
|
|
337
|
-
buildTestCommand(runner, testFile, testName) {
|
|
338
|
+
buildTestCommand(runner, testFile, testName, cwd = this.config.cwd ?? process.cwd()) {
|
|
338
339
|
const npx = this.config.npxPath;
|
|
339
|
-
//
|
|
340
|
-
//
|
|
341
|
-
|
|
340
|
+
// A FailedTest holds the literal assertion name and path from the previous
|
|
341
|
+
// run. Name filters are regex-escaped and passed as --flag=value; file
|
|
342
|
+
// filters are absolute (Jest: escaped and anchored), so neither can be
|
|
343
|
+
// misread as a regex or as a flag when it starts with '-' (#886, #909).
|
|
344
|
+
const filterByName = Boolean(testName) && testName !== testFile;
|
|
342
345
|
switch (runner) {
|
|
343
346
|
case 'vitest':
|
|
344
|
-
// vitest run --reporter=json
|
|
347
|
+
// vitest run --reporter=json <abs file> --testNamePattern=<name>
|
|
345
348
|
// --outputFile: Vitest 5 no longer prints the JSON report to stdout.
|
|
346
349
|
{
|
|
347
350
|
const report = createVitestJsonReport();
|
|
348
|
-
const vitestArgs = ['vitest', 'run', '--reporter=json', testFile];
|
|
349
|
-
if (
|
|
350
|
-
vitestArgs.push('
|
|
351
|
-
}
|
|
351
|
+
const vitestArgs = ['vitest', 'run', '--reporter=json', runnerFilePath(testFile, cwd)];
|
|
352
|
+
if (filterByName)
|
|
353
|
+
vitestArgs.push(nameFilterArg('vitest', testName));
|
|
352
354
|
vitestArgs.push(...report.args);
|
|
353
355
|
return { command: npx, args: vitestArgs, report };
|
|
354
356
|
}
|
|
355
357
|
case 'jest':
|
|
356
|
-
// jest --json
|
|
358
|
+
// jest --json --testNamePattern=<name> ^<escaped abs file>$
|
|
359
|
+
// Positional TestPathPatterns work on Jest 29 and 30 (Jest 30 rejects
|
|
360
|
+
// the old --testPathPattern flag).
|
|
357
361
|
{
|
|
358
|
-
const jestArgs = ['jest', '--json'
|
|
359
|
-
if (
|
|
360
|
-
jestArgs.push('
|
|
361
|
-
|
|
362
|
+
const jestArgs = ['jest', '--json'];
|
|
363
|
+
if (filterByName)
|
|
364
|
+
jestArgs.push(nameFilterArg('jest', testName));
|
|
365
|
+
jestArgs.push(jestExactPathPattern(testFile, cwd));
|
|
362
366
|
return { command: npx, args: jestArgs };
|
|
363
367
|
}
|
|
364
368
|
case 'mocha':
|
|
365
|
-
// mocha --reporter json
|
|
369
|
+
// mocha --reporter json <abs file> --grep=<name>
|
|
366
370
|
{
|
|
367
|
-
const mochaArgs = ['mocha', '--reporter', 'json', testFile];
|
|
368
|
-
if (
|
|
369
|
-
mochaArgs.push('
|
|
370
|
-
}
|
|
371
|
+
const mochaArgs = ['mocha', '--reporter', 'json', runnerFilePath(testFile, cwd)];
|
|
372
|
+
if (filterByName)
|
|
373
|
+
mochaArgs.push(nameFilterArg('mocha', testName));
|
|
371
374
|
return { command: npx, args: mochaArgs };
|
|
372
375
|
}
|
|
373
376
|
default:
|
|
@@ -16,6 +16,7 @@ import { secureRandom, secureRandomInt } from '../../../shared/utils/crypto-rand
|
|
|
16
16
|
import { writeQualityEvidence } from '../../quality-assessment/quality-evidence.js';
|
|
17
17
|
import { getTestRunnerExecutionError, TestRunnerExecutionError } from '../../../shared/test-runner-verdict.js';
|
|
18
18
|
import { createVitestJsonReport } from '../../../shared/vitest-json-report.js';
|
|
19
|
+
import { jestExactPathPattern, runnerFilePath } from '../../../shared/test-runner-args.js';
|
|
19
20
|
import { getClaudeModelForTier } from '../../../shared/llm/model-registry.js';
|
|
20
21
|
import { terminateTestRunner, trackTestRunnerExit } from '../../../shared/test-runner-process.js';
|
|
21
22
|
const DEFAULT_CONFIG = {
|
|
@@ -481,7 +482,9 @@ Provide:
|
|
|
481
482
|
* Build test command based on framework
|
|
482
483
|
*/
|
|
483
484
|
buildTestCommand(fileOrFiles, framework) {
|
|
484
|
-
|
|
485
|
+
// #909: absolute paths never start with '-', so a file cannot be read as a
|
|
486
|
+
// flag; Jest's positional patterns are regexes, so escape and anchor them.
|
|
487
|
+
const files = (Array.isArray(fileOrFiles) ? fileOrFiles : [fileOrFiles]).map(file => runnerFilePath(file));
|
|
485
488
|
const createCoverageDirectory = () => mkdtempSync(join(tmpdir(), 'aqe-test-coverage-'));
|
|
486
489
|
switch (framework.toLowerCase()) {
|
|
487
490
|
case 'vitest': {
|
|
@@ -507,7 +510,7 @@ Provide:
|
|
|
507
510
|
const coverageDirectory = createCoverageDirectory();
|
|
508
511
|
return {
|
|
509
512
|
command: 'npx',
|
|
510
|
-
args: ['jest', ...files, '--json', '--no-colors', '--testLocationInResults', `--coverageDirectory=${coverageDirectory}`],
|
|
513
|
+
args: ['jest', ...files.map(file => jestExactPathPattern(file)), '--json', '--no-colors', '--testLocationInResults', `--coverageDirectory=${coverageDirectory}`],
|
|
511
514
|
coverageDirectory,
|
|
512
515
|
};
|
|
513
516
|
}
|
|
@@ -993,8 +993,11 @@ Return a JSON array of test suggestions, each with: { "name": "test name", "desc
|
|
|
993
993
|
if (lang && lang !== 'typescript' && lang !== 'javascript') {
|
|
994
994
|
return resolveTestFilePath(sourceFile, lang);
|
|
995
995
|
}
|
|
996
|
-
|
|
997
|
-
|
|
996
|
+
// #936 follow-up: strip only the trailing extension. A first-match
|
|
997
|
+
// replace turned /home/u/my.ts-app/src/a.ts into /home/u/my-app/src/a.ts,
|
|
998
|
+
// pointing the test file at a sibling directory outside the project.
|
|
999
|
+
const ext = fileExt ? fileExt.slice(1) : 'ts';
|
|
1000
|
+
const base = fileExt ? sourceFile.slice(0, -fileExt.length) : sourceFile;
|
|
998
1001
|
if (framework === 'pytest') {
|
|
999
1002
|
return `test_${base.split('/').pop()}.py`;
|
|
1000
1003
|
}
|