agentic-qe 3.14.2 → 3.14.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/skills/skills-manifest.json +1 -1
- package/CHANGELOG.md +72 -0
- package/assets/skills/skills-manifest.json +1 -1
- package/dist/cli/bundle.js +5 -5
- package/dist/cli/chunks/adapter-AKQYU6UH.js +2 -0
- package/dist/cli/chunks/{agent-booster-wasm-SD5N32MX.js → agent-booster-wasm-TQOMLWWX.js} +2 -2
- package/dist/cli/chunks/{agent-handler-OZRSJM7F.js → agent-handler-Q3SEMMI2.js} +2 -2
- package/dist/cli/chunks/{agent-memory-branch-NYTRANRN.js → agent-memory-branch-SJXAQSZI.js} +2 -2
- package/dist/cli/chunks/aqe-learning-engine-MICRPL3N.js +2 -0
- package/dist/cli/chunks/{arena-EX3SC2DP.js → arena-7RC7TBGW.js} +4 -4
- package/dist/cli/chunks/{arena-FOTVSRK4.js → arena-UPB7TKUY.js} +2 -2
- package/dist/cli/chunks/{audit-Q5GHSUQY.js → audit-IXN5R4WB.js} +3 -3
- package/dist/cli/chunks/base-DZK36ITB.js +2 -0
- package/dist/cli/chunks/{better-sqlite3-S7M5R2HS.js → better-sqlite3-RP4DEGK3.js} +2 -2
- package/dist/cli/chunks/{brain-handler-5FSA46R5.js → brain-handler-H5OVZ22L.js} +3 -3
- package/dist/cli/chunks/{branch-enumerator-RWAXTGEU.js → branch-enumerator-VPRWDGFJ.js} +2 -2
- package/dist/cli/chunks/{browser-IGDESJGF.js → browser-B6E7JPPJ.js} +2 -2
- package/dist/cli/chunks/browser-workflow-ADK54DOE.js +2 -0
- package/dist/cli/chunks/{chunk-E3Q7WNJD.js → chunk-26GM5CWD.js} +3 -3
- package/dist/cli/chunks/{chunk-BWRHOIYC.js → chunk-2GNRW3OD.js} +2 -2
- package/dist/cli/chunks/{chunk-ZCDXJ27H.js → chunk-2IGT5WNQ.js} +1 -1
- package/dist/cli/chunks/{chunk-7SK6IMGZ.js → chunk-2WT7AKKK.js} +2 -2
- package/dist/cli/chunks/{chunk-DVHWLAEO.js → chunk-33VPWGCM.js} +3 -3
- package/dist/cli/chunks/{chunk-NAZVPZJS.js → chunk-37BASGWC.js} +2 -2
- package/dist/cli/chunks/{chunk-Q335R4MR.js → chunk-3ABRGG3C.js} +2 -2
- package/dist/cli/chunks/{chunk-IWFL6EFI.js → chunk-3P6NCFI2.js} +2 -2
- package/dist/cli/chunks/{chunk-4AKGBUYD.js → chunk-42VSQ2MX.js} +3 -3
- package/dist/cli/chunks/{chunk-2LKAMMMI.js → chunk-44WISFTU.js} +2 -2
- package/dist/cli/chunks/{chunk-RFNEHNJV.js → chunk-4C6UJIHB.js} +1 -1
- package/dist/cli/chunks/{chunk-CTCQOYBS.js → chunk-4JBFJTHJ.js} +1 -1
- package/dist/cli/chunks/{chunk-GJAWEUIN.js → chunk-4OUPCTBS.js} +2 -2
- package/dist/cli/chunks/{chunk-2EHFEMRU.js → chunk-4Q35TI6Z.js} +2 -2
- package/dist/cli/chunks/{chunk-N3RN4QTC.js → chunk-4RP5VUBI.js} +2 -2
- package/dist/cli/chunks/{chunk-ZYLSOBOR.js → chunk-4TXAP3YH.js} +1 -1
- package/dist/cli/chunks/{chunk-KZOBLLXW.js → chunk-4UDZLD42.js} +2 -2
- package/dist/cli/chunks/{chunk-UYTWDS2R.js → chunk-4W7QVUNO.js} +2 -2
- package/dist/cli/chunks/{chunk-4ZUZDFAA.js → chunk-4XPPMADQ.js} +2 -2
- package/dist/cli/chunks/{chunk-TENYL5TI.js → chunk-527HQAY7.js} +2 -2
- package/dist/cli/chunks/chunk-5BLFXQEB.js +96 -0
- package/dist/cli/chunks/{chunk-OX6T26CD.js → chunk-5DFHE4H5.js} +3 -3
- package/dist/cli/chunks/{chunk-T46LOLW3.js → chunk-5F6DWHQG.js} +2 -2
- package/dist/cli/chunks/{chunk-FVGTINVR.js → chunk-5FOZO7KM.js} +81 -65
- package/dist/cli/chunks/{chunk-T4C56HBW.js → chunk-5IAB5NRZ.js} +2 -2
- package/dist/cli/chunks/{chunk-4MH22236.js → chunk-5P3G6ZW4.js} +1 -1
- package/dist/cli/chunks/{chunk-7AFBNU6K.js → chunk-5Y5TC6BY.js} +2 -2
- package/dist/cli/chunks/{chunk-VSYBMNIR.js → chunk-6F2RM6X2.js} +1 -1
- package/dist/cli/chunks/{chunk-ICKLBATY.js → chunk-72UJXEKQ.js} +2 -2
- package/dist/cli/chunks/{chunk-A7N3YUDJ.js → chunk-74PK3NEW.js} +2 -2
- package/dist/cli/chunks/{chunk-PMUBG2RU.js → chunk-7BUERZYL.js} +2 -2
- package/dist/cli/chunks/{chunk-HZMLNM2T.js → chunk-7FYMDKQH.js} +174 -169
- package/dist/cli/chunks/{chunk-67A6PEZM.js → chunk-7G6UX2QN.js} +2 -2
- package/dist/cli/chunks/{chunk-G2CLZVYI.js → chunk-7JQHPANT.js} +3 -3
- package/dist/cli/chunks/{chunk-TLPL3EQY.js → chunk-7SLAZAVU.js} +2 -2
- package/dist/cli/chunks/{chunk-4UCMTYFQ.js → chunk-7Y2CEXRS.js} +4 -4
- package/dist/cli/chunks/{chunk-2H5YJ5ZK.js → chunk-AB4U6ZNI.js} +2 -2
- package/dist/cli/chunks/chunk-AWNYEAGB.js +2 -0
- package/dist/cli/chunks/chunk-B2ZONZPZ.js +5 -0
- package/dist/cli/chunks/{chunk-6F4WHN7D.js → chunk-B5XFDFBT.js} +1 -1
- package/dist/cli/chunks/{chunk-5EHLGOWW.js → chunk-B7SWW5A6.js} +2 -2
- package/dist/cli/chunks/{chunk-P64DMQ2C.js → chunk-BN7DKW5D.js} +1 -1
- package/dist/cli/chunks/{chunk-CIESXO73.js → chunk-C46DMCWF.js} +1 -1
- package/dist/cli/chunks/{chunk-HZ6NEJMO.js → chunk-CB5JPRIZ.js} +2 -2
- package/dist/cli/chunks/{chunk-SEHCX4NH.js → chunk-CBOPBYPU.js} +1 -1
- package/dist/cli/chunks/{chunk-LWUJQGCS.js → chunk-CR3QGHVN.js} +2 -2
- package/dist/cli/chunks/{chunk-NHHWLJQF.js → chunk-D4Z2N74A.js} +1 -1
- package/dist/cli/chunks/{chunk-4K27ESCA.js → chunk-DBA3N742.js} +1 -1
- package/dist/cli/chunks/{chunk-2TG24LYQ.js → chunk-DX3C5HPN.js} +1 -1
- package/dist/cli/chunks/{chunk-S4MR6RTE.js → chunk-E3FBW6G2.js} +1 -1
- package/dist/cli/chunks/{chunk-GHUPID5E.js → chunk-ELU4IC3I.js} +1 -1
- package/dist/cli/chunks/{chunk-C7AXRI7E.js → chunk-EY4OQHU3.js} +1 -1
- package/dist/cli/chunks/{chunk-6LMLN5R2.js → chunk-F67AV5P2.js} +2 -2
- package/dist/cli/chunks/chunk-FD2JFEQC.js +2 -0
- package/dist/cli/chunks/chunk-FKG5OQFT.js +2 -0
- package/dist/cli/chunks/{chunk-UIGEUEBT.js → chunk-FUE6LL72.js} +2 -2
- package/dist/cli/chunks/{chunk-4RT7I7PI.js → chunk-G5C2XVZC.js} +1 -1
- package/dist/cli/chunks/{chunk-WVY22NHZ.js → chunk-G6DCESPU.js} +2 -2
- package/dist/cli/chunks/{chunk-3DFFFXXO.js → chunk-G6ZHTF42.js} +2 -2
- package/dist/cli/chunks/{chunk-CH2TQCV5.js → chunk-GNTVFN7D.js} +1 -1
- package/dist/cli/chunks/{chunk-WMW47QMR.js → chunk-H5ZRV5K5.js} +2 -2
- package/dist/cli/chunks/{chunk-4M6A3PVJ.js → chunk-H6XBM2LY.js} +2 -2
- package/dist/cli/chunks/{chunk-4N44UJGI.js → chunk-HOQQCY2K.js} +2 -2
- package/dist/cli/chunks/{chunk-D4RCV4LY.js → chunk-HRUU7E3D.js} +2 -2
- package/dist/cli/chunks/{chunk-EAJK25IS.js → chunk-HXE5NBJG.js} +1 -1
- package/dist/cli/chunks/{chunk-IUNMW454.js → chunk-I4NDQGKP.js} +2 -2
- package/dist/cli/chunks/{chunk-CJHVOBJY.js → chunk-IFFZR6GY.js} +1 -1
- package/dist/cli/chunks/{chunk-YN6W2XIT.js → chunk-IKIITGU5.js} +3 -3
- package/dist/cli/chunks/{chunk-JIUF6NV6.js → chunk-IP7NSFQQ.js} +2 -2
- package/dist/cli/chunks/{chunk-3C2K4YMS.js → chunk-IQEJGZV6.js} +3 -3
- package/dist/cli/chunks/{chunk-RGH3WGWD.js → chunk-IU4EBTA2.js} +3 -3
- package/dist/cli/chunks/{chunk-QW4LN5NK.js → chunk-JBB7E26R.js} +2 -2
- package/dist/cli/chunks/{chunk-RYJHREYS.js → chunk-JRYZKBY2.js} +2 -2
- package/dist/cli/chunks/{chunk-6EHN7Q2Q.js → chunk-JV4FZUE7.js} +2 -2
- package/dist/cli/chunks/{chunk-PZKZY6PB.js → chunk-KF63AYXD.js} +2 -2
- package/dist/cli/chunks/{chunk-ZFGND4QK.js → chunk-KPMGTVB4.js} +1 -1
- package/dist/cli/chunks/chunk-L2GKMBDP.js +2 -0
- package/dist/cli/chunks/{chunk-7FWP7CZY.js → chunk-LHGNNZ76.js} +3 -3
- package/dist/cli/chunks/{chunk-HSJ5FQCF.js → chunk-LKN7JQTW.js} +2 -2
- package/dist/cli/chunks/{chunk-EH5OCHAJ.js → chunk-LLVGTEHU.js} +1 -1
- package/dist/cli/chunks/{chunk-TYVQNYXX.js → chunk-LS3EUMBP.js} +6 -6
- package/dist/cli/chunks/{chunk-F2KRT2II.js → chunk-LTBCAFTZ.js} +3 -3
- package/dist/cli/chunks/{chunk-PVHO6KLB.js → chunk-LVLBIKJD.js} +1 -1
- package/dist/cli/chunks/{chunk-5WJUNRTY.js → chunk-MDZ6RRLX.js} +2 -2
- package/dist/cli/chunks/{chunk-W4OQYLYO.js → chunk-MWWAMDHI.js} +1 -1
- package/dist/cli/chunks/{chunk-N5ZRUOMR.js → chunk-MXMFGSWR.js} +2 -2
- package/dist/cli/chunks/{chunk-L2F7FVIU.js → chunk-N4H2QOT5.js} +2 -2
- package/dist/cli/chunks/{chunk-R5RNOLHI.js → chunk-NBWQBQO5.js} +1 -1
- package/dist/cli/chunks/{chunk-IVGVOGIZ.js → chunk-NN76NTOX.js} +1 -1
- package/dist/cli/chunks/{chunk-OBCKP3G4.js → chunk-NTSXHZTC.js} +2 -2
- package/dist/cli/chunks/{chunk-YF5OP6CR.js → chunk-OV5EZO3U.js} +2 -2
- package/dist/cli/chunks/{chunk-JQ2ZD3WO.js → chunk-OVDKWCD7.js} +2 -2
- package/dist/cli/chunks/{chunk-WBH4C4BG.js → chunk-OVPJQWHW.js} +2 -2
- package/dist/cli/chunks/{chunk-6SZKLWZT.js → chunk-OY7MLMEX.js} +5 -5
- package/dist/cli/chunks/{chunk-NG2UVPTW.js → chunk-OYMLHX2B.js} +1 -1
- package/dist/cli/chunks/{chunk-RVCWSAXI.js → chunk-PI74GOE4.js} +2 -2
- package/dist/cli/chunks/{chunk-42WUDDUU.js → chunk-PZTVH2AS.js} +2 -2
- package/dist/cli/chunks/{chunk-4PH7O5ZH.js → chunk-QLWNXBRU.js} +2 -2
- package/dist/cli/chunks/{chunk-FPHPP5TQ.js → chunk-R2AFVFRF.js} +1 -1
- package/dist/cli/chunks/{chunk-MWQTACNA.js → chunk-RKJZWWB7.js} +2 -2
- package/dist/cli/chunks/{chunk-FREF6Y4L.js → chunk-ROX7NLS4.js} +2 -2
- package/dist/cli/chunks/{chunk-K574FLVB.js → chunk-RTJ2M6V6.js} +2 -2
- package/dist/cli/chunks/{chunk-NWFIJNEB.js → chunk-SG47AXJG.js} +1 -1
- package/dist/cli/chunks/{chunk-UHTAI4ZB.js → chunk-SGXSB7YO.js} +1 -1
- package/dist/cli/chunks/{chunk-PWEIDHT7.js → chunk-SHGKY3QB.js} +2 -2
- package/dist/cli/chunks/{chunk-MH73D5TN.js → chunk-SJPZSCZP.js} +2 -2
- package/dist/cli/chunks/{chunk-3WV4H33V.js → chunk-SQ3PPISY.js} +1 -1
- package/dist/cli/chunks/{chunk-RCI64RIJ.js → chunk-STRDSVH3.js} +2 -2
- package/dist/cli/chunks/{chunk-GHQ5PUOV.js → chunk-T35GZXTU.js} +2 -2
- package/dist/cli/chunks/{chunk-DRO5NJZA.js → chunk-T62DH4GG.js} +2 -2
- package/dist/cli/chunks/{chunk-W2FLULF4.js → chunk-TFHQE6NK.js} +2 -2
- package/dist/cli/chunks/{chunk-LML5VTFK.js → chunk-TGLAWI62.js} +1 -1
- package/dist/cli/chunks/{chunk-KFXZDQ5J.js → chunk-TISSZFHO.js} +1 -1
- package/dist/cli/chunks/{chunk-KPFG4OIM.js → chunk-TJEIOE7F.js} +1 -1
- package/dist/cli/chunks/{chunk-57TNBR2P.js → chunk-TTMHIOQ3.js} +2 -2
- package/dist/cli/chunks/{chunk-ARMZYHYL.js → chunk-UHQY3GK7.js} +2 -2
- package/dist/cli/chunks/{chunk-ADK7DF3G.js → chunk-UMENRGHK.js} +2 -2
- package/dist/cli/chunks/{chunk-ZWRQ5VAU.js → chunk-UMNYF5EZ.js} +2 -2
- package/dist/cli/chunks/{chunk-G6AV2HGY.js → chunk-UTVRQEZM.js} +3 -3
- package/dist/cli/chunks/{chunk-VOYJJ3KA.js → chunk-UYJHYMEQ.js} +2 -2
- package/dist/cli/chunks/{chunk-KEEBUVGV.js → chunk-V4AOVDCJ.js} +2 -2
- package/dist/cli/chunks/{chunk-HBTC4L53.js → chunk-VIDBBB6F.js} +2 -2
- package/dist/cli/chunks/{chunk-PFXX5Q32.js → chunk-VWNHKYK7.js} +2 -2
- package/dist/cli/chunks/{chunk-DW6ZMNMR.js → chunk-WYMGK5DX.js} +2 -2
- package/dist/cli/chunks/{chunk-CJCT452S.js → chunk-XA7CG3LH.js} +2 -2
- package/dist/cli/chunks/{chunk-QFUX7ELG.js → chunk-XX7HUSX2.js} +2 -2
- package/dist/cli/chunks/{chunk-WXMSRBQF.js → chunk-XXCYQXK3.js} +2 -2
- package/dist/cli/chunks/{chunk-6VKJAMZY.js → chunk-Y2DVFVGI.js} +1 -1
- package/dist/cli/chunks/{chunk-JDXLCNKV.js → chunk-Y5SQBI2F.js} +2 -2
- package/dist/cli/chunks/{chunk-QXTW7XCS.js → chunk-YAKS3CAB.js} +2 -2
- package/dist/cli/chunks/{chunk-Q3JHS3UD.js → chunk-YCBDE2N7.js} +2 -2
- package/dist/cli/chunks/{chunk-VNAKBHJI.js → chunk-YDNSLLBS.js} +2 -2
- package/dist/cli/chunks/{chunk-S7N4BKI3.js → chunk-YEXPFHV6.js} +2 -2
- package/dist/cli/chunks/{chunk-CG2MUD7U.js → chunk-YGB6R5DW.js} +1 -1
- package/dist/cli/chunks/{chunk-NNOMDM4N.js → chunk-YL7T3VV7.js} +2 -2
- package/dist/cli/chunks/{chunk-U54OOA24.js → chunk-ZHXWGNYM.js} +1 -1
- package/dist/cli/chunks/{chunk-NRR23SJV.js → chunk-ZK5JKHP4.js} +1 -1
- package/dist/cli/chunks/{chunk-XPLSLHRB.js → chunk-ZN3J6TZD.js} +1 -1
- package/dist/cli/chunks/{chunk-RHJVDCLV.js → chunk-ZUG5MOUB.js} +2 -2
- package/dist/cli/chunks/{ci-NTRH7PAW.js → ci-YVKDQWIX.js} +2 -2
- package/dist/cli/chunks/ci-output-LK3MBXLZ.js +2 -0
- package/dist/cli/chunks/{circuit-breaker-4WST3QSA.js → circuit-breaker-7AIXACR7.js} +2 -2
- package/dist/cli/chunks/{claude-flow-setup-KB4TKMYI.js → claude-flow-setup-UA7EO6VN.js} +2 -2
- package/dist/cli/chunks/client-M72GXFVQ.js +2 -0
- package/dist/cli/chunks/{cline-installer-W2ZHQ6WM.js → cline-installer-YDDCKKEV.js} +2 -2
- package/dist/cli/chunks/{code-TF2AVR5D.js → code-URB7UAKW.js} +2 -2
- package/dist/cli/chunks/{code-index-extractor-RMDRUVQJ.js → code-index-extractor-BL6HWH4Q.js} +2 -2
- package/dist/cli/chunks/{codex-installer-VSTRHJHV.js → codex-installer-2AVEO4EA.js} +2 -2
- package/dist/cli/chunks/{completions-3Q37QVFR.js → completions-RCKBSSSS.js} +2 -2
- package/dist/cli/chunks/{complexity-analyzer-3FNFLACD.js → complexity-analyzer-LEDG62YK.js} +2 -2
- package/dist/cli/chunks/{continuedev-installer-VTEXM455.js → continuedev-installer-VOTCEBFH.js} +2 -2
- package/dist/cli/chunks/{copilot-installer-AGY7DQUS.js → copilot-installer-NVTGLZX3.js} +2 -2
- package/dist/cli/chunks/core-handlers-C32RAMVI.js +2 -0
- package/dist/cli/chunks/{cost-tracker-LTZAQBX7.js → cost-tracker-GJIFB2BM.js} +2 -2
- package/dist/cli/chunks/{coverage-TT64IOS4.js → coverage-ZTPJWXWE.js} +3 -3
- package/dist/cli/chunks/cross-domain-router-UGFUCPKC.js +2 -0
- package/dist/cli/chunks/{cursor-installer-OVOJIOHN.js → cursor-installer-CMGJQMHX.js} +2 -2
- package/dist/cli/chunks/{daemon-DMFZMXKA.js → daemon-V456IWR3.js} +3 -3
- package/dist/cli/chunks/{daemon-XCULEHWY.js → daemon-Y2I3YVIU.js} +4 -4
- package/dist/cli/chunks/{dag-attention-scheduler-WW2RX4B5.js → dag-attention-scheduler-ZCBBOD3D.js} +2 -2
- package/dist/cli/chunks/{detect-QNWIM232.js → detect-2GHEA4A3.js} +2 -2
- package/dist/cli/chunks/{dist-node-6GQIY3CG.js → dist-node-44AGYJCH.js} +2 -2
- package/dist/cli/chunks/{domain-handler-6RJPDELX.js → domain-handler-IDLIEP6X.js} +2 -2
- package/dist/cli/chunks/{domain-transfer-WK524LBS.js → domain-transfer-KLEXGIRF.js} +2 -2
- package/dist/cli/chunks/dream-UFBBXY5W.js +2 -0
- package/dist/cli/chunks/{embed-and-insert-pattern-SO6GWJW7.js → embed-and-insert-pattern-DUW6K35A.js} +2 -2
- package/dist/cli/chunks/{eval-GL544IPO.js → eval-PR6YWDFM.js} +2 -2
- package/dist/cli/chunks/{experience-capture-middleware-BCCJ35OX.js → experience-capture-middleware-CJJJN7CF.js} +3 -3
- package/dist/cli/chunks/{fast-paths-CATDDBEU.js → fast-paths-LGLLKX6P.js} +2 -2
- package/dist/cli/chunks/{feature-flags-BUXNAORY.js → feature-flags-33D3I4DD.js} +2 -2
- package/dist/cli/chunks/{feature-flags-KNNWWP5G.js → feature-flags-QL4NCEGW.js} +2 -2
- package/dist/cli/chunks/{file-discovery-S4HF3O7D.js → file-discovery-GKCYJPFZ.js} +2 -2
- package/dist/cli/chunks/{fleet-DQVQQONW.js → fleet-QNT6X2YI.js} +3 -3
- package/dist/cli/chunks/{gnn-wrapper-G7ABZUG7.js → gnn-wrapper-ELSGT67Z.js} +2 -2
- package/dist/cli/chunks/{heartbeat-handler-UFMELIWT.js → heartbeat-handler-ZUI3DOOP.js} +4 -4
- package/dist/cli/chunks/heartbeat-scheduler-VQWHSGTY.js +2 -0
- package/dist/cli/chunks/hnsw-adapter-BS3NXWGU.js +2 -0
- package/dist/cli/chunks/hnsw-index-JP26B4HW.js +2 -0
- package/dist/cli/chunks/{hnsw-legacy-bridge-YIILSRXI.js → hnsw-legacy-bridge-EZMM5JWL.js} +2 -2
- package/dist/cli/chunks/{hnswlib-node-TSVRMXDH.js → hnswlib-node-G4CE3EOS.js} +2 -2
- package/dist/cli/chunks/{hooks-OHQPNK74.js → hooks-LCVXXA55.js} +10 -10
- package/dist/cli/chunks/{hypergraph-engine-LY7PJDSL.js → hypergraph-engine-6Z7RQ3HI.js} +2 -2
- package/dist/cli/chunks/{hypergraph-handler-YGDYZO6H.js → hypergraph-handler-PLI2GYPK.js} +3 -3
- package/dist/cli/chunks/impact-analyzer-WRE4CWPJ.js +2 -0
- package/dist/cli/chunks/{init-handler-MTK65LI3.js → init-handler-7VH3QJ5Y.js} +6 -6
- package/dist/cli/chunks/init-wizard-OFOEYB75.js +2 -0
- package/dist/cli/chunks/kernel-MXNFWNUD.js +2 -0
- package/dist/cli/chunks/{kilocode-installer-3IICU4RS.js → kilocode-installer-U3MW62DE.js} +2 -2
- package/dist/cli/chunks/{kiro-installer-MXOVQYQA.js → kiro-installer-PPEAC44T.js} +2 -2
- package/dist/cli/chunks/knowledge-graph-7JE2TVKJ.js +2 -0
- package/dist/cli/chunks/{learning-EV5LSOOM.js → learning-7B5NITDV.js} +3 -3
- package/dist/cli/chunks/{llm-router-7LYDJUOT.js → llm-router-BNEPT5OB.js} +4 -4
- package/dist/cli/chunks/llm-router-service-GTDVDKSU.js +2 -0
- package/dist/cli/chunks/{load-F4PVAMXQ.js → load-VO7ABNHV.js} +2 -2
- package/dist/cli/chunks/load-test-JZ4CLSBF.js +2 -0
- package/dist/cli/chunks/{mcp-DUYJUEME.js → mcp-THXEINCL.js} +2 -2
- package/dist/cli/chunks/{memory-XTTYORAS.js → memory-FZTT7ADM.js} +5 -5
- package/dist/cli/chunks/memory-backend-Q54CC5A5.js +2 -0
- package/dist/cli/chunks/memory-handlers-IIBJXKHZ.js +2 -0
- package/dist/cli/chunks/{multi-model-executor-R6XCTMCF.js → multi-model-executor-HEDVOZ6X.js} +2 -2
- package/dist/cli/chunks/{opencode-installer-33ULBU2F.js → opencode-installer-GQ7J5SBG.js} +2 -2
- package/dist/cli/chunks/{orchestrator-34ZJEKTJ.js → orchestrator-66JK2OS5.js} +5 -5
- package/dist/cli/chunks/pattern-null-store-W33O7FYO.js +2 -0
- package/dist/cli/chunks/{pattern-usage-recorder-GZ2M3F2E.js → pattern-usage-recorder-O6XHM2G5.js} +2 -2
- package/dist/cli/chunks/{pipeline-SR5OTY45.js → pipeline-UOG6UO6D.js} +2 -2
- package/dist/cli/chunks/{platform-VKJFJIAW.js → platform-Q7UH7FZQ.js} +2 -2
- package/dist/cli/chunks/{plugin-5C5UBQUQ.js → plugin-7OFLNGOS.js} +2 -2
- package/dist/cli/chunks/{prime-radiant-advanced-wasm-KO2PQI3D.js → prime-radiant-advanced-wasm-OSRDK2FW.js} +2 -2
- package/dist/cli/chunks/protocol-executor-VGN4M7XY.js +2 -0
- package/dist/cli/chunks/{protocol-handler-ZF74NIKA.js → protocol-handler-WLYTX6FS.js} +2 -2
- package/dist/cli/chunks/{prove-MO5TQQU4.js → prove-QVNE4V3J.js} +2 -2
- package/dist/cli/chunks/qe-reasoning-bank-7VB5LJGS.js +2 -0
- package/dist/cli/chunks/{quality-EYIN6AER.js → quality-DNE2RKE5.js} +2 -2
- package/dist/cli/chunks/{quality-gate-V6OQM57O.js → quality-gate-2K35GCSI.js} +3 -3
- package/dist/cli/chunks/queen-coordinator-HIDMJMMG.js +2 -0
- package/dist/cli/chunks/{real-embeddings-AR7TZX7U.js → real-embeddings-SF42ML7G.js} +2 -2
- package/dist/cli/chunks/{roocode-installer-46E626VZ.js → roocode-installer-NCEZPF5L.js} +2 -2
- package/dist/cli/chunks/router-CTIJS4D7.js +2 -0
- package/dist/cli/chunks/routing-feedback-LFYYZS5J.js +2 -0
- package/dist/cli/chunks/{routing-handler-ZNRVW6QW.js → routing-handler-4MXXZRYP.js} +2 -2
- package/dist/cli/chunks/{ruvector-commands-4L2CQMWS.js → ruvector-commands-WDFMMCMK.js} +2 -2
- package/dist/cli/chunks/rvf-dual-writer-MNPMIWVM.js +2 -0
- package/dist/cli/chunks/rvf-migration-adapter-DXOKSSNW.js +2 -0
- package/dist/cli/chunks/{rvf-migration-coordinator-H4RVGBIA.js → rvf-migration-coordinator-JT7ZCJY7.js} +2 -2
- package/dist/cli/chunks/rvf-native-adapter-PZKUKA7R.js +2 -0
- package/dist/cli/chunks/{rvf-store-integrity-OJGWWPLL.js → rvf-store-integrity-Q3FGYKFT.js} +2 -2
- package/dist/cli/chunks/safe-db-73BLFV2C.js +2 -0
- package/dist/cli/chunks/schedule-YVTGTTI4.js +2 -0
- package/dist/cli/chunks/scheduler-5DSAFIRQ.js +2 -0
- package/dist/cli/chunks/security-CJJ3WJSB.js +13 -0
- package/dist/cli/chunks/{shared-rvf-adapter-M6NNIZ5W.js → shared-rvf-adapter-6RGCTLHD.js} +2 -2
- package/dist/cli/chunks/{shared-rvf-dual-writer-LHMFCYVE.js → shared-rvf-dual-writer-KIA6Q6MT.js} +2 -2
- package/dist/cli/chunks/sqlite-persistence-LRG4IPCU.js +2 -0
- package/dist/cli/chunks/{status-handler-GMIOXQIE.js → status-handler-BADQV2KA.js} +2 -2
- package/dist/cli/chunks/{structural-health-YZXHVHM6.js → structural-health-VMYEYRZG.js} +2 -2
- package/dist/cli/chunks/{sync-GMPCPV5L.js → sync-PXLROLHB.js} +2 -2
- package/dist/cli/chunks/{sync-N56UQGCS.js → sync-ULY7T5II.js} +2 -2
- package/dist/cli/chunks/{task-handler-VTNRGAXP.js → task-handler-L7E2I267.js} +2 -2
- package/dist/cli/chunks/{task-handlers-FYSDH55N.js → task-handlers-6DPKE4AK.js} +3 -3
- package/dist/cli/chunks/{test-GQNCKRSP.js → test-WCLURQUT.js} +11 -11
- package/dist/cli/chunks/test-scheduling-4CNJA6TW.js +15 -0
- package/dist/cli/chunks/{token-bootstrap-76SRNXGG.js → token-bootstrap-GTI24JAL.js} +2 -2
- package/dist/cli/chunks/{token-usage-O7CZDP5Q.js → token-usage-DRVG6PKO.js} +2 -2
- package/dist/cli/chunks/{transformers-LTU4LSSC.js → transformers-IMDDAMYQ.js} +2 -2
- package/dist/cli/chunks/{tree-sitter-wasm-parser-NQSQCMBM.js → tree-sitter-wasm-parser-WBZIHVFA.js} +2 -2
- package/dist/cli/chunks/{types-OP6IWE6N.js → types-TXMY5M2K.js} +2 -2
- package/dist/cli/chunks/unified-memory-VBQ572X4.js +2 -0
- package/dist/cli/chunks/unified-memory-hnsw-J3L74ZRY.js +2 -0
- package/dist/cli/chunks/unified-persistence-EM2VYRTQ.js +2 -0
- package/dist/cli/chunks/{upgrade-OQWRBZ3R.js → upgrade-6ALSDWDD.js} +2 -2
- package/dist/cli/chunks/{validate-TH5SRP3E.js → validate-XF4ZG3LC.js} +2 -2
- package/dist/cli/chunks/{validate-swarm-UITL2JUS.js → validate-swarm-P5TAFRDA.js} +2 -2
- package/dist/cli/chunks/{vibium-O6PRAG4J.js → vibium-2XDXKNKZ.js} +2 -2
- package/dist/cli/chunks/visual-security-GX4S7K6O.js +2 -0
- package/dist/cli/chunks/{web-tree-sitter-XBFBY4OF.js → web-tree-sitter-4JVRQPX5.js} +2 -2
- package/dist/cli/chunks/{windsurf-installer-DVT5NRNY.js → windsurf-installer-WYJXVDO5.js} +2 -2
- package/dist/cli/chunks/witness-chain-QGKMHCNW.js +2 -0
- package/dist/cli/chunks/{witness-chain-VRSH2F36.js → witness-chain-RPZ2SE2V.js} +2 -2
- package/dist/cli/chunks/{witness-key-manager-GFHRDKQ4.js → witness-key-manager-LXG2VBQQ.js} +2 -2
- package/dist/cli/chunks/{workflow-HAZ6YKOG.js → workflow-2OYNO7UU.js} +4 -4
- package/dist/cli/chunks/workflow-orchestrator-KWHIJMFV.js +2 -0
- package/dist/cli/chunks/{wrappers-5LLLT7GM.js → wrappers-DIJNNFU6.js} +2 -2
- package/dist/cli/commands/security.js +167 -100
- package/dist/cli/commands/test.js +1 -0
- package/dist/cli/utils/ci-output.d.ts +17 -0
- package/dist/cli/utils/ci-output.js +34 -2
- package/dist/coordination/handlers/handler-types.d.ts +3 -0
- package/dist/coordination/handlers/quality-handlers.js +10 -0
- package/dist/coordination/handlers/security-handlers.js +168 -72
- package/dist/coordination/handlers/test-execution-handlers.js +37 -43
- package/dist/coordination/protocols/security-audit.d.ts +3 -0
- package/dist/coordination/protocols/security-audit.js +61 -39
- package/dist/coordination/result-saver.js +36 -5
- package/dist/coordination/task-executor.d.ts +3 -1
- package/dist/coordination/task-executor.js +4 -0
- package/dist/domains/security-compliance/interfaces.d.ts +5 -0
- package/dist/domains/security-compliance/interfaces.js +0 -6
- package/dist/domains/security-compliance/scan-discovery.d.ts +12 -0
- package/dist/domains/security-compliance/scan-discovery.js +105 -0
- package/dist/domains/security-compliance/scan-evidence.d.ts +57 -0
- package/dist/domains/security-compliance/scan-evidence.js +2 -0
- package/dist/domains/security-compliance/services/scanners/sast-scanner.d.ts +3 -2
- package/dist/domains/security-compliance/services/scanners/sast-scanner.js +109 -65
- package/dist/domains/security-compliance/services/semgrep-integration.d.ts +9 -2
- package/dist/domains/security-compliance/services/semgrep-integration.js +68 -20
- package/dist/domains/test-execution/services/flaky-detector.js +14 -3
- package/dist/domains/test-execution/services/retry-handler.js +18 -8
- package/dist/domains/test-execution/services/test-executor.js +46 -12
- package/dist/init/init-wizard-hooks.js +2 -2
- package/dist/integrations/agentic-flow/reasoning-bank/index.js +3 -20
- package/dist/integrations/coherence/engines/cohomology-adapter.js +100 -30
- package/dist/mcp/bundle.js +499 -478
- package/dist/mcp/handlers/domain-handler-configs.d.ts +22 -1
- package/dist/mcp/handlers/domain-handler-configs.js +50 -19
- package/dist/mcp/handlers/domain-handlers.d.ts +7 -5
- package/dist/mcp/handlers/domain-handlers.js +7 -5
- package/dist/mcp/protocol-server.js +9 -5
- package/dist/mcp/types.d.ts +5 -0
- package/dist/shared/llm/router/hybrid-router.d.ts +4 -0
- package/dist/shared/llm/router/hybrid-router.js +74 -26
- package/dist/shared/llm/router/types.d.ts +9 -2
- package/dist/shared/test-runner-verdict.d.ts +29 -0
- package/dist/shared/test-runner-verdict.js +43 -0
- package/dist/shared/vitest-json-report.d.ts +45 -0
- package/dist/shared/vitest-json-report.js +71 -0
- package/dist/test-scheduling/executors/vitest-executor.js +18 -6
- package/dist/validation/frontier-judge.d.ts +7 -4
- package/dist/validation/frontier-judge.js +11 -6
- package/package.json +6 -6
- package/dist/cli/chunks/adapter-OJF6LAJV.js +0 -2
- package/dist/cli/chunks/aqe-learning-engine-FGT474XB.js +0 -2
- package/dist/cli/chunks/base-HH765JFV.js +0 -2
- package/dist/cli/chunks/browser-workflow-NPM4FUPI.js +0 -2
- package/dist/cli/chunks/chunk-OC2CKU7I.js +0 -2
- package/dist/cli/chunks/chunk-PHHXHG2W.js +0 -2
- package/dist/cli/chunks/chunk-U2AY57XZ.js +0 -5
- package/dist/cli/chunks/chunk-WBMRADQP.js +0 -81
- package/dist/cli/chunks/ci-output-F57RSD35.js +0 -2
- package/dist/cli/chunks/client-GPZEC54E.js +0 -2
- package/dist/cli/chunks/core-handlers-YMGHYIBR.js +0 -2
- package/dist/cli/chunks/cross-domain-router-ECBNTGYJ.js +0 -2
- package/dist/cli/chunks/dream-EHGKCFWH.js +0 -2
- package/dist/cli/chunks/heartbeat-scheduler-UFEL2CBW.js +0 -2
- package/dist/cli/chunks/hnsw-adapter-BLSD45CX.js +0 -2
- package/dist/cli/chunks/hnsw-index-A3RZODEN.js +0 -2
- package/dist/cli/chunks/impact-analyzer-OXHD3FOH.js +0 -2
- package/dist/cli/chunks/init-wizard-PKZL7QBU.js +0 -2
- package/dist/cli/chunks/kernel-XWPM72UJ.js +0 -2
- package/dist/cli/chunks/knowledge-graph-FRKR5XWI.js +0 -2
- package/dist/cli/chunks/llm-router-service-R7A5HHDM.js +0 -2
- package/dist/cli/chunks/load-test-5IKDWSYL.js +0 -2
- package/dist/cli/chunks/memory-backend-7VW5QCMO.js +0 -2
- package/dist/cli/chunks/memory-handlers-VZH3R2TQ.js +0 -2
- package/dist/cli/chunks/pattern-null-store-BU6LCB2W.js +0 -2
- package/dist/cli/chunks/protocol-executor-BSP5LWJN.js +0 -2
- package/dist/cli/chunks/qe-reasoning-bank-J2RC7P25.js +0 -2
- package/dist/cli/chunks/queen-coordinator-XI5AJV2V.js +0 -2
- package/dist/cli/chunks/router-VXQYYA3D.js +0 -2
- package/dist/cli/chunks/routing-feedback-HZQTASFF.js +0 -2
- package/dist/cli/chunks/rvf-dual-writer-BDTLLJER.js +0 -2
- package/dist/cli/chunks/rvf-migration-adapter-IB343MDN.js +0 -2
- package/dist/cli/chunks/rvf-native-adapter-Y7SN7LHU.js +0 -2
- package/dist/cli/chunks/safe-db-2VTKKBJU.js +0 -2
- package/dist/cli/chunks/schedule-QJ4CFGJY.js +0 -2
- package/dist/cli/chunks/scheduler-2NHDQPC3.js +0 -2
- package/dist/cli/chunks/security-JF3BVNRO.js +0 -14
- package/dist/cli/chunks/sqlite-persistence-NVVAPZN3.js +0 -2
- package/dist/cli/chunks/test-scheduling-GPRXSIRP.js +0 -15
- package/dist/cli/chunks/unified-memory-DSTIEDSH.js +0 -2
- package/dist/cli/chunks/unified-memory-hnsw-KBV3P4OS.js +0 -2
- package/dist/cli/chunks/unified-persistence-XKCOUBKY.js +0 -2
- package/dist/cli/chunks/visual-security-TTWSPZTZ.js +0 -2
- package/dist/cli/chunks/witness-chain-2KY73HPN.js +0 -2
- package/dist/cli/chunks/workflow-orchestrator-UK56AVOT.js +0 -2
|
@@ -8,7 +8,10 @@
|
|
|
8
8
|
*/
|
|
9
9
|
import { DomainHandlerConfig } from './handler-factory';
|
|
10
10
|
import { TestGenerateParams, TestGenerateResult, TestExecuteParams, CoverageAnalyzeParams, CoverageAnalyzeResult, QualityAssessParams, SecurityScanParams, ContractValidateParams, AccessibilityTestParams, ChaosTestParams } from '../types';
|
|
11
|
+
import type { SecurityScanEvidence } from '../../domains/security-compliance/scan-evidence.js';
|
|
12
|
+
import type { SecurityCoverage } from '../../domains/security-compliance/interfaces.js';
|
|
11
13
|
import { type RiskDecision } from '../../contracts/verdicts.js';
|
|
14
|
+
import type { EvaluatedQualityCheck } from '../../domains/quality-assessment/quality-evidence.js';
|
|
12
15
|
export interface TestExecuteResult {
|
|
13
16
|
taskId: string;
|
|
14
17
|
status: string;
|
|
@@ -27,7 +30,10 @@ export interface TestExecuteResult {
|
|
|
27
30
|
export interface QualityAssessResult {
|
|
28
31
|
taskId: string;
|
|
29
32
|
status: string;
|
|
30
|
-
|
|
33
|
+
/** Static analysis score; omitted for measured gates, which have no aggregate score. */
|
|
34
|
+
qualityScore?: number;
|
|
35
|
+
/** Canonical measured checks, present when runGate is true. */
|
|
36
|
+
checks?: EvaluatedQualityCheck[];
|
|
31
37
|
passed: boolean;
|
|
32
38
|
metrics: Record<string, number>;
|
|
33
39
|
recommendations: string[];
|
|
@@ -45,9 +51,24 @@ export interface SecurityScanResult {
|
|
|
45
51
|
medium: number;
|
|
46
52
|
low: number;
|
|
47
53
|
topVulnerabilities: unknown[];
|
|
54
|
+
findings?: unknown[];
|
|
48
55
|
recommendations: string[];
|
|
49
56
|
duration: number;
|
|
50
57
|
savedFiles?: string[];
|
|
58
|
+
informational?: number;
|
|
59
|
+
evidence?: SecurityScanEvidence;
|
|
60
|
+
limitations?: readonly string[];
|
|
61
|
+
coverage?: SecurityCoverage;
|
|
62
|
+
filesScanned?: number;
|
|
63
|
+
jstsFilesScanned?: number;
|
|
64
|
+
otherFilesScanned?: number;
|
|
65
|
+
deepAnalysisPerformed?: boolean;
|
|
66
|
+
analysisDepth?: string;
|
|
67
|
+
scanTypes?: {
|
|
68
|
+
sast: boolean;
|
|
69
|
+
dast: boolean;
|
|
70
|
+
};
|
|
71
|
+
note?: string;
|
|
51
72
|
}
|
|
52
73
|
export interface ContractValidateResult {
|
|
53
74
|
taskId: string;
|
|
@@ -406,14 +406,19 @@ export const qualityAssessConfig = {
|
|
|
406
406
|
priority: 'p0',
|
|
407
407
|
defaultTimeout: 180000,
|
|
408
408
|
buildTaskDescription: (params) => `Assess quality with ${params.runGate ? 'quality gate' : 'metrics analysis'}`,
|
|
409
|
-
mapToPayload: (params, routingResult) =>
|
|
410
|
-
runGate
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
409
|
+
mapToPayload: (params, routingResult) => {
|
|
410
|
+
if (params.runGate !== undefined && typeof params.runGate !== 'boolean') {
|
|
411
|
+
throw new Error('runGate must be a boolean.');
|
|
412
|
+
}
|
|
413
|
+
return {
|
|
414
|
+
runGate: params.runGate ?? false,
|
|
415
|
+
threshold: params.threshold || 80,
|
|
416
|
+
metrics: params.metrics || ['coverage', 'complexity', 'maintainability'],
|
|
417
|
+
routingTier: routingResult?.decision.tier,
|
|
418
|
+
useAgentBooster: routingResult?.useAgentBooster,
|
|
419
|
+
compiledContext: routingResult?.compiledContext,
|
|
420
|
+
};
|
|
421
|
+
},
|
|
417
422
|
mapToResult: (taskId, data, duration, savedFiles) => {
|
|
418
423
|
// ADR-103: attach a schema-validated RiskDecision envelope at the MCP
|
|
419
424
|
// boundary (additive — existing fields unchanged). Omit rather than
|
|
@@ -426,7 +431,8 @@ export const qualityAssessConfig = {
|
|
|
426
431
|
return {
|
|
427
432
|
taskId,
|
|
428
433
|
status: 'completed',
|
|
429
|
-
qualityScore: data.qualityScore
|
|
434
|
+
...(typeof data.qualityScore === 'number' ? { qualityScore: data.qualityScore } : {}),
|
|
435
|
+
...(Array.isArray(data.checks) ? { checks: data.checks } : {}),
|
|
430
436
|
passed: data.passed || false,
|
|
431
437
|
metrics: data.metrics || {},
|
|
432
438
|
recommendations: data.recommendations || [],
|
|
@@ -452,25 +458,50 @@ export const securityScanConfig = {
|
|
|
452
458
|
scanTypes.push('DAST');
|
|
453
459
|
return `Security scan (${scanTypes.join(', ')}) for ${params.target || 'project'}`;
|
|
454
460
|
},
|
|
455
|
-
mapToPayload: (params, routingResult) =>
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
461
|
+
mapToPayload: (params, routingResult) => {
|
|
462
|
+
for (const name of ['sast', 'dast']) {
|
|
463
|
+
if (params[name] !== undefined && typeof params[name] !== 'boolean') {
|
|
464
|
+
throw new Error(`${name} must be a boolean`);
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
return {
|
|
468
|
+
sast: params.sast !== false,
|
|
469
|
+
dast: params.dast || false,
|
|
470
|
+
compliance: params.compliance || [],
|
|
471
|
+
target: params.target || '.',
|
|
472
|
+
targetUrl: params.targetUrl,
|
|
473
|
+
routingTier: routingResult?.decision.tier,
|
|
474
|
+
useAgentBooster: routingResult?.useAgentBooster,
|
|
475
|
+
compiledContext: routingResult?.compiledContext,
|
|
476
|
+
};
|
|
477
|
+
},
|
|
464
478
|
mapToResult: (taskId, data, duration, savedFiles) => ({
|
|
465
479
|
taskId,
|
|
466
|
-
|
|
480
|
+
// Legacy task results without receipts cannot establish scan completeness.
|
|
481
|
+
status: data.evidence?.completeness === 'complete' ? 'completed'
|
|
482
|
+
: data.evidence?.completeness === 'partial' ? 'partial'
|
|
483
|
+
: data.evidence ? 'unavailable' : 'unverified',
|
|
467
484
|
vulnerabilities: data.vulnerabilities || 0,
|
|
468
485
|
critical: data.critical || 0,
|
|
469
486
|
high: data.high || 0,
|
|
470
487
|
medium: data.medium || 0,
|
|
471
488
|
low: data.low || 0,
|
|
489
|
+
informational: data.informational || 0,
|
|
472
490
|
topVulnerabilities: data.topVulnerabilities || [],
|
|
491
|
+
findings: data.findings,
|
|
473
492
|
recommendations: data.recommendations || [],
|
|
493
|
+
evidence: data.evidence,
|
|
494
|
+
limitations: data.limitations || ['Execution receipts unavailable; scan completeness is unverified.'],
|
|
495
|
+
...(data.evidence ? {
|
|
496
|
+
filesScanned: data.filesScanned,
|
|
497
|
+
jstsFilesScanned: data.jstsFilesScanned,
|
|
498
|
+
otherFilesScanned: data.otherFilesScanned,
|
|
499
|
+
coverage: data.coverage,
|
|
500
|
+
} : {}),
|
|
501
|
+
deepAnalysisPerformed: Boolean(data.evidence && data.deepAnalysisPerformed === true),
|
|
502
|
+
analysisDepth: data.analysisDepth,
|
|
503
|
+
scanTypes: data.scanTypes,
|
|
504
|
+
note: data.note,
|
|
474
505
|
duration,
|
|
475
506
|
savedFiles,
|
|
476
507
|
}),
|
|
@@ -35,12 +35,13 @@ export declare function resetTaskExecutor(): void;
|
|
|
35
35
|
*/
|
|
36
36
|
export declare const handleTestGenerate: (params: TestGenerateParams) => Promise<ToolResult<TestGenerateResult>>;
|
|
37
37
|
/**
|
|
38
|
-
* Handle test execution tasks
|
|
38
|
+
* Handle test execution tasks using a nonempty list of concrete file paths.
|
|
39
|
+
* Expand glob patterns before calling; the task handler rejects them.
|
|
39
40
|
*
|
|
40
41
|
* @example
|
|
41
42
|
* ```typescript
|
|
42
43
|
* const result = await handleTestExecute({
|
|
43
|
-
* testFiles: ['tests/unit
|
|
44
|
+
* testFiles: ['tests/unit/auth.test.ts', 'tests/unit/session.test.ts'],
|
|
44
45
|
* parallel: true,
|
|
45
46
|
* parallelism: 4,
|
|
46
47
|
* });
|
|
@@ -61,14 +62,15 @@ export declare const handleTestExecute: (params: TestExecuteParams) => Promise<T
|
|
|
61
62
|
*/
|
|
62
63
|
export declare const handleCoverageAnalyze: (params: CoverageAnalyzeParams) => Promise<ToolResult<CoverageAnalyzeResult>>;
|
|
63
64
|
/**
|
|
64
|
-
* Handle quality assessment tasks
|
|
65
|
+
* Handle quality assessment tasks. With runGate:true, require fresh canonical
|
|
66
|
+
* evidence and return individual measured checks, without a static aggregate
|
|
67
|
+
* score. Missing, stale, or malformed evidence returns an error. threshold and
|
|
68
|
+
* metrics customize analysis-only requests; gate thresholds match the CLI.
|
|
65
69
|
*
|
|
66
70
|
* @example
|
|
67
71
|
* ```typescript
|
|
68
72
|
* const result = await handleQualityAssess({
|
|
69
73
|
* runGate: true,
|
|
70
|
-
* threshold: 80,
|
|
71
|
-
* metrics: ['coverage', 'complexity'],
|
|
72
74
|
* });
|
|
73
75
|
* ```
|
|
74
76
|
*/
|
|
@@ -42,12 +42,13 @@ export function resetTaskExecutor() {
|
|
|
42
42
|
*/
|
|
43
43
|
export const handleTestGenerate = createDomainHandler(testGenerateConfig);
|
|
44
44
|
/**
|
|
45
|
-
* Handle test execution tasks
|
|
45
|
+
* Handle test execution tasks using a nonempty list of concrete file paths.
|
|
46
|
+
* Expand glob patterns before calling; the task handler rejects them.
|
|
46
47
|
*
|
|
47
48
|
* @example
|
|
48
49
|
* ```typescript
|
|
49
50
|
* const result = await handleTestExecute({
|
|
50
|
-
* testFiles: ['tests/unit
|
|
51
|
+
* testFiles: ['tests/unit/auth.test.ts', 'tests/unit/session.test.ts'],
|
|
51
52
|
* parallel: true,
|
|
52
53
|
* parallelism: 4,
|
|
53
54
|
* });
|
|
@@ -68,14 +69,15 @@ export const handleTestExecute = createDomainHandler(testExecuteConfig);
|
|
|
68
69
|
*/
|
|
69
70
|
export const handleCoverageAnalyze = createDomainHandler(coverageAnalyzeConfig);
|
|
70
71
|
/**
|
|
71
|
-
* Handle quality assessment tasks
|
|
72
|
+
* Handle quality assessment tasks. With runGate:true, require fresh canonical
|
|
73
|
+
* evidence and return individual measured checks, without a static aggregate
|
|
74
|
+
* score. Missing, stale, or malformed evidence returns an error. threshold and
|
|
75
|
+
* metrics customize analysis-only requests; gate thresholds match the CLI.
|
|
72
76
|
*
|
|
73
77
|
* @example
|
|
74
78
|
* ```typescript
|
|
75
79
|
* const result = await handleQualityAssess({
|
|
76
80
|
* runGate: true,
|
|
77
|
-
* threshold: 80,
|
|
78
|
-
* metrics: ['coverage', 'complexity'],
|
|
79
81
|
* });
|
|
80
82
|
* ```
|
|
81
83
|
*/
|
|
@@ -434,7 +434,10 @@ export class MCPProtocolServer {
|
|
|
434
434
|
// the same output, so we can short-circuit repeated calls with an O(1)
|
|
435
435
|
// fingerprint lookup. Tools without isConcurrencySafe (writes, scans,
|
|
436
436
|
// executions) always re-run.
|
|
437
|
-
|
|
437
|
+
// Explicit quality gates depend on current measured evidence and its age,
|
|
438
|
+
// not just arguments. A cached approval can outlive or contradict evidence.
|
|
439
|
+
const measuredQualityGate = name === 'quality_assess' && processedCtx.params?.runGate === true;
|
|
440
|
+
const cacheable = tool.definition.isConcurrencySafe === true && !measuredQualityGate;
|
|
438
441
|
let cacheFingerprint = null;
|
|
439
442
|
if (cacheable && process.env.AQE_SESSION_CACHE !== 'off') {
|
|
440
443
|
try {
|
|
@@ -821,7 +824,7 @@ export class MCPProtocolServer {
|
|
|
821
824
|
description: 'Execute test files in parallel with automatic retry on flaky failures. Example: test_execute_parallel({ testFiles: ["tests/auth.test.ts"], parallel: true })',
|
|
822
825
|
category: 'domain',
|
|
823
826
|
parameters: [
|
|
824
|
-
{ name: 'testFiles', type: 'array', description: '
|
|
827
|
+
{ name: 'testFiles', type: 'array', description: 'Nonempty list of concrete test file paths (relative to the project working directory or absolute). Expand glob patterns before calling; glob patterns are rejected.' },
|
|
825
828
|
{ name: 'parallel', type: 'boolean', description: 'Enable parallel execution', default: true },
|
|
826
829
|
],
|
|
827
830
|
},
|
|
@@ -849,7 +852,7 @@ export class MCPProtocolServer {
|
|
|
849
852
|
category: 'domain',
|
|
850
853
|
isConcurrencySafe: true,
|
|
851
854
|
parameters: [
|
|
852
|
-
{ name: 'runGate', type: 'boolean', description: '
|
|
855
|
+
{ name: 'runGate', type: 'boolean', description: 'Evaluate all seven canonical measured quality checks; requires complete, valid evidence from the last 24 hours. Returns individual checks, not a static aggregate score.', default: false },
|
|
853
856
|
],
|
|
854
857
|
},
|
|
855
858
|
handler: (params) => handleQualityAssess(params),
|
|
@@ -858,12 +861,13 @@ export class MCPProtocolServer {
|
|
|
858
861
|
this.registerTool({
|
|
859
862
|
definition: {
|
|
860
863
|
name: 'security_scan_comprehensive',
|
|
861
|
-
description: 'Run
|
|
864
|
+
description: 'Run security scans with execution evidence and explicit coverage limitations. Complete means the declared required scope ran, not that all vulnerabilities are absent. Example: security_scan_comprehensive({ target: "src/", sast: true })',
|
|
862
865
|
category: 'domain',
|
|
863
866
|
parameters: [
|
|
864
867
|
{ name: 'sast', type: 'boolean', description: 'Run SAST scan', default: true },
|
|
865
868
|
{ name: 'dast', type: 'boolean', description: 'Run DAST scan', default: false },
|
|
866
|
-
{ name: 'target', type: 'string', description: '
|
|
869
|
+
{ name: 'target', type: 'string', description: 'Source file or directory for SAST' },
|
|
870
|
+
{ name: 'targetUrl', type: 'string', description: 'URL for a requested DAST scan' },
|
|
867
871
|
],
|
|
868
872
|
},
|
|
869
873
|
handler: (params) => handleSecurityScan(params),
|
package/dist/mcp/types.d.ts
CHANGED
|
@@ -176,6 +176,9 @@ export interface TestGenerateParams {
|
|
|
176
176
|
* Test execution parameters
|
|
177
177
|
*/
|
|
178
178
|
export interface TestExecuteParams {
|
|
179
|
+
/** Concrete test file paths for test_execute_parallel; provide a nonempty list.
|
|
180
|
+
* Expand glob patterns before calling. The task handler does not expand them.
|
|
181
|
+
*/
|
|
179
182
|
testFiles?: string[];
|
|
180
183
|
testSuites?: string[];
|
|
181
184
|
parallel?: boolean;
|
|
@@ -211,6 +214,8 @@ export interface SecurityScanParams {
|
|
|
211
214
|
dast?: boolean;
|
|
212
215
|
compliance?: string[];
|
|
213
216
|
target?: string;
|
|
217
|
+
/** URL for explicitly requested dynamic scanning. */
|
|
218
|
+
targetUrl?: string;
|
|
214
219
|
}
|
|
215
220
|
/**
|
|
216
221
|
* Contract validation parameters
|
|
@@ -113,6 +113,8 @@ export declare class HybridRouter {
|
|
|
113
113
|
* Clear decision cache
|
|
114
114
|
*/
|
|
115
115
|
clearCache(): void;
|
|
116
|
+
/** Select an explicitly pinned model without rules, shared cache, or fallback. */
|
|
117
|
+
private selectStrict;
|
|
116
118
|
/**
|
|
117
119
|
* Manual selection - use preferredProvider or default
|
|
118
120
|
*/
|
|
@@ -133,6 +135,8 @@ export declare class HybridRouter {
|
|
|
133
135
|
* Execute request with fallback chain
|
|
134
136
|
*/
|
|
135
137
|
private executeWithFallback;
|
|
138
|
+
/** Compare identity independently of the API transport hosting the model. */
|
|
139
|
+
private isSameModel;
|
|
136
140
|
/**
|
|
137
141
|
* Create a routing decision with proper model ID normalization (ADR-043)
|
|
138
142
|
*/
|
|
@@ -139,8 +139,11 @@ export class HybridRouter {
|
|
|
139
139
|
async selectProvider(params) {
|
|
140
140
|
await this.ensureInitialized();
|
|
141
141
|
const startTime = Date.now();
|
|
142
|
+
// Strict requests carry their own execution identity. They must neither
|
|
143
|
+
// consume an ordinary cached decision nor replace one used by other callers.
|
|
144
|
+
const cacheDecision = this.config.cacheDecisions && !params.strictModel;
|
|
142
145
|
// Check cache first
|
|
143
|
-
if (
|
|
146
|
+
if (cacheDecision) {
|
|
144
147
|
const cacheKey = this.generateCacheKey(params);
|
|
145
148
|
const cached = this.decisionCache.get(cacheKey);
|
|
146
149
|
if (cached) {
|
|
@@ -152,26 +155,31 @@ export class HybridRouter {
|
|
|
152
155
|
this.routerMetrics.recordCacheMiss();
|
|
153
156
|
}
|
|
154
157
|
let decision;
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
158
|
+
if (params.strictModel) {
|
|
159
|
+
decision = this.selectStrict(params);
|
|
160
|
+
}
|
|
161
|
+
else {
|
|
162
|
+
switch (this.config.mode) {
|
|
163
|
+
case 'manual':
|
|
164
|
+
decision = await this.selectManual(params);
|
|
165
|
+
break;
|
|
166
|
+
case 'rule-based':
|
|
167
|
+
decision = await this.selectRuleBased(params);
|
|
168
|
+
break;
|
|
169
|
+
case 'cost-optimized':
|
|
170
|
+
decision = await this.selectCostOptimized(params);
|
|
171
|
+
break;
|
|
172
|
+
case 'performance-optimized':
|
|
173
|
+
decision = await this.selectPerformanceOptimized(params);
|
|
174
|
+
break;
|
|
175
|
+
default:
|
|
176
|
+
decision = await this.selectRuleBased(params);
|
|
177
|
+
}
|
|
170
178
|
}
|
|
171
179
|
// Update decision time
|
|
172
180
|
decision.metadata.decisionTimeMs = Date.now() - startTime;
|
|
173
181
|
// Cache the decision
|
|
174
|
-
if (
|
|
182
|
+
if (cacheDecision) {
|
|
175
183
|
const cacheKey = this.generateCacheKey(params);
|
|
176
184
|
this.decisionCache.set(cacheKey, decision);
|
|
177
185
|
}
|
|
@@ -194,6 +202,9 @@ export class HybridRouter {
|
|
|
194
202
|
// applies the same pin independently for advisor escalations.
|
|
195
203
|
const agentName = params.agentType ?? '';
|
|
196
204
|
if (shouldCyberPin(agentName) && (isOpus47(decision.model) || isOpus47(decision.providerModelId))) {
|
|
205
|
+
if (params.strictModel) {
|
|
206
|
+
throw createLLMError(`Strict model request for ${decision.model} conflicts with the cyber verification pin for ${agentName}`, 'MODEL_NOT_FOUND', { provider: decision.providerType, model: decision.model, retryable: false });
|
|
207
|
+
}
|
|
197
208
|
const originalModel = decision.model;
|
|
198
209
|
const originalProviderModelId = decision.providerModelId;
|
|
199
210
|
decision.model = applyCyberPin(agentName, decision.model, CYBER_PIN_CHAT_FALLBACK);
|
|
@@ -313,6 +324,18 @@ export class HybridRouter {
|
|
|
313
324
|
// ============================================================================
|
|
314
325
|
// Provider Selection Methods
|
|
315
326
|
// ============================================================================
|
|
327
|
+
/** Select an explicitly pinned model without rules, shared cache, or fallback. */
|
|
328
|
+
selectStrict(params) {
|
|
329
|
+
if (!params.model?.trim()) {
|
|
330
|
+
throw createLLMError('strictModel requires an explicit nonempty model', 'MODEL_NOT_FOUND', { retryable: false });
|
|
331
|
+
}
|
|
332
|
+
const providerType = (params.preferredProvider ?? this.config.defaultProvider);
|
|
333
|
+
const provider = this.providerManager.getProvider(providerType);
|
|
334
|
+
if (!provider) {
|
|
335
|
+
throw createLLMError(`Strict model provider ${providerType} is unavailable`, 'PROVIDER_UNAVAILABLE', { provider: providerType, model: params.model, retryable: false });
|
|
336
|
+
}
|
|
337
|
+
return this.createDecision(provider, providerType, params.model, 'manual');
|
|
338
|
+
}
|
|
316
339
|
/**
|
|
317
340
|
* Manual selection - use preferredProvider or default
|
|
318
341
|
*/
|
|
@@ -452,7 +475,7 @@ export class HybridRouter {
|
|
|
452
475
|
// surfaced by the rule-based E2E test in
|
|
453
476
|
// tests/e2e/llm-router-real-providers.test.ts.
|
|
454
477
|
const defaultProviderType = this.config.defaultProvider;
|
|
455
|
-
if (defaultProviderType && defaultProviderType !== decision.providerType) {
|
|
478
|
+
if (!params.strictModel && defaultProviderType && defaultProviderType !== decision.providerType) {
|
|
456
479
|
executionOrder.push({
|
|
457
480
|
provider: defaultProviderType,
|
|
458
481
|
model: this.config.defaultModel,
|
|
@@ -464,13 +487,15 @@ export class HybridRouter {
|
|
|
464
487
|
// openrouter/gemini/azure-openai/bedrock from ADR-043) and
|
|
465
488
|
// ProviderManager.createProvider() builds all of them. The narrower
|
|
466
489
|
// list silently excluded users' actual fallback providers.
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
490
|
+
if (!params.strictModel) {
|
|
491
|
+
for (const entry of fallbackChain.entries) {
|
|
492
|
+
if (!entry.enabled)
|
|
493
|
+
continue;
|
|
494
|
+
if (entry.provider === decision.providerType)
|
|
495
|
+
continue;
|
|
496
|
+
for (const model of entry.models) {
|
|
497
|
+
executionOrder.push({ provider: entry.provider, model });
|
|
498
|
+
}
|
|
474
499
|
}
|
|
475
500
|
}
|
|
476
501
|
// Capability-aware guard: when the request needs tools, drop any candidate
|
|
@@ -520,6 +545,17 @@ export class HybridRouter {
|
|
|
520
545
|
// ADR-123: persist the charge to the cross-process ledger so budgets
|
|
521
546
|
// hold across a fleet of processes. ADR-124 M2.3: attribute to the agent.
|
|
522
547
|
this.providerManager.recordResponseSpend(response, params.agentType);
|
|
548
|
+
// A provider can return an unexpected model even when its request was
|
|
549
|
+
// pinned. Account for the completed call, but do not accept that answer
|
|
550
|
+
// as evidence from the requested model (e.g. a frontier quality judge).
|
|
551
|
+
if (params.strictModel) {
|
|
552
|
+
if (response.provider !== providerType) {
|
|
553
|
+
throw createLLMError(`Strict model provider mismatch: expected ${providerType}, received ${response.provider}`, 'PROVIDER_UNAVAILABLE', { provider: providerType, model, retryable: false });
|
|
554
|
+
}
|
|
555
|
+
if (!this.isSameModel(decision.model, response.model)) {
|
|
556
|
+
throw createLLMError(`Strict model mismatch: expected ${decision.model}, received ${response.model}`, 'MODEL_NOT_FOUND', { provider: providerType, model, retryable: false });
|
|
557
|
+
}
|
|
558
|
+
}
|
|
523
559
|
const callLatency = Date.now() - callStartTime;
|
|
524
560
|
// Record success in legacy tracker
|
|
525
561
|
this.metrics.recordSuccess(providerType);
|
|
@@ -585,7 +621,7 @@ export class HybridRouter {
|
|
|
585
621
|
// delay (because no need to wait) but DOES continue to the next
|
|
586
622
|
// entry in executionOrder. Only retryable errors get the delay.
|
|
587
623
|
const nonRetryable = isLLMError(error) && !error.retryable;
|
|
588
|
-
if (!nonRetryable && attempts < fallbackBehavior.maxAttempts) {
|
|
624
|
+
if (!params.strictModel && !nonRetryable && attempts < fallbackBehavior.maxAttempts) {
|
|
589
625
|
await this.delay(fallbackBehavior.delayMs);
|
|
590
626
|
}
|
|
591
627
|
}
|
|
@@ -595,6 +631,18 @@ export class HybridRouter {
|
|
|
595
631
|
// ============================================================================
|
|
596
632
|
// Helper Methods
|
|
597
633
|
// ============================================================================
|
|
634
|
+
/** Compare identity independently of the API transport hosting the model. */
|
|
635
|
+
isSameModel(expected, actual) {
|
|
636
|
+
if (expected === actual)
|
|
637
|
+
return true;
|
|
638
|
+
try {
|
|
639
|
+
return normalizeModelId(expected) === normalizeModelId(actual);
|
|
640
|
+
}
|
|
641
|
+
catch {
|
|
642
|
+
// Unregistered model IDs are only equivalent when they match exactly.
|
|
643
|
+
return false;
|
|
644
|
+
}
|
|
645
|
+
}
|
|
598
646
|
/**
|
|
599
647
|
* Create a routing decision with proper model ID normalization (ADR-043)
|
|
600
648
|
*/
|
|
@@ -686,9 +686,16 @@ export interface ChatParams {
|
|
|
686
686
|
agentType?: string;
|
|
687
687
|
/** Task complexity hint */
|
|
688
688
|
complexity?: TaskComplexity;
|
|
689
|
-
/** Specific model to use (for manual mode) - canonical or provider-specific ID */
|
|
689
|
+
/** Specific model to use (for manual mode or strictModel) - canonical or provider-specific ID */
|
|
690
690
|
model?: string;
|
|
691
|
-
/**
|
|
691
|
+
/**
|
|
692
|
+
* Require the explicit model on preferredProvider (or the configured default).
|
|
693
|
+
* Bypasses routing rules and decision caching, disallows provider/model
|
|
694
|
+
* fallback, and rejects responses from a different provider or model.
|
|
695
|
+
* Equivalent canonical and provider-specific model IDs are accepted.
|
|
696
|
+
*/
|
|
697
|
+
strictModel?: boolean;
|
|
698
|
+
/** Preferred provider (for manual mode or strictModel) - supports extended providers */
|
|
692
699
|
preferredProvider?: ExtendedProviderType;
|
|
693
700
|
/** Required capabilities (legacy) */
|
|
694
701
|
requiredCapabilities?: string[];
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/** A runner or suite error is not an assertion result. */
|
|
2
|
+
export declare class TestRunnerExecutionError extends Error {
|
|
3
|
+
constructor(message: string);
|
|
4
|
+
}
|
|
5
|
+
interface RunnerCounts {
|
|
6
|
+
passed: number;
|
|
7
|
+
failed: number;
|
|
8
|
+
skipped: number;
|
|
9
|
+
}
|
|
10
|
+
interface RunnerReport {
|
|
11
|
+
success?: boolean;
|
|
12
|
+
numFailedTestSuites?: number;
|
|
13
|
+
numRuntimeErrorTestSuites?: number;
|
|
14
|
+
testResults?: Array<{
|
|
15
|
+
status?: string;
|
|
16
|
+
message?: string;
|
|
17
|
+
assertionResults?: Array<{
|
|
18
|
+
status?: string;
|
|
19
|
+
}>;
|
|
20
|
+
}>;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Preserve ordinary assertion failures, but reject incomplete/failed execution
|
|
24
|
+
* that assertion counts cannot represent. Process status is authoritative even
|
|
25
|
+
* when a runner emits success=true (for example, Vitest unhandled rejections).
|
|
26
|
+
*/
|
|
27
|
+
export declare function getTestRunnerExecutionError(runner: string, files: string, exitCode: number | null, counts: RunnerCounts, output: string, report?: RunnerReport): TestRunnerExecutionError | undefined;
|
|
28
|
+
export {};
|
|
29
|
+
//# sourceMappingURL=test-runner-verdict.d.ts.map
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/** A runner or suite error is not an assertion result. */
|
|
2
|
+
export class TestRunnerExecutionError extends Error {
|
|
3
|
+
constructor(message) {
|
|
4
|
+
super(message);
|
|
5
|
+
this.name = 'TestRunnerExecutionError';
|
|
6
|
+
}
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Preserve ordinary assertion failures, but reject incomplete/failed execution
|
|
10
|
+
* that assertion counts cannot represent. Process status is authoritative even
|
|
11
|
+
* when a runner emits success=true (for example, Vitest unhandled rejections).
|
|
12
|
+
*/
|
|
13
|
+
export function getTestRunnerExecutionError(runner, files, exitCode, counts, output, report) {
|
|
14
|
+
const suites = report?.testResults ?? [];
|
|
15
|
+
const suiteErrors = suites.filter(suite => suite.status === 'failed' && (
|
|
16
|
+
// Jest also uses message for ordinary assertion failures; Vitest reserves
|
|
17
|
+
// it for suite errors such as collection and afterAll failures.
|
|
18
|
+
(runner === 'vitest' && suite.message)
|
|
19
|
+
|| !suite.assertionResults?.some(assertion => assertion.status === 'failed')));
|
|
20
|
+
let reason;
|
|
21
|
+
if (exitCode === null) {
|
|
22
|
+
reason = 'terminated without an exit code';
|
|
23
|
+
}
|
|
24
|
+
else if (counts.passed + counts.failed + counts.skipped === 0) {
|
|
25
|
+
reason = 'reported zero tests';
|
|
26
|
+
}
|
|
27
|
+
else if (suiteErrors.length > 0 || (report?.numRuntimeErrorTestSuites ?? 0) > 0
|
|
28
|
+
|| ((report?.numFailedTestSuites ?? 0) > 0 && counts.failed === 0)) {
|
|
29
|
+
reason = 'reported a suite execution error';
|
|
30
|
+
}
|
|
31
|
+
else if ((exitCode !== 0 || report?.success === false) && counts.failed === 0) {
|
|
32
|
+
reason = 'failed without a failed assertion';
|
|
33
|
+
}
|
|
34
|
+
if (!reason)
|
|
35
|
+
return undefined;
|
|
36
|
+
const diagnostics = [
|
|
37
|
+
...suiteErrors.map(suite => suite.message).filter(Boolean),
|
|
38
|
+
output.trim(),
|
|
39
|
+
].filter(Boolean).join('\n').slice(0, 4000);
|
|
40
|
+
return new TestRunnerExecutionError(`${runner} ${reason} for ${files} (exit code ${exitCode ?? 'unknown'}).` +
|
|
41
|
+
(diagnostics ? `\n${diagnostics}` : ''));
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=test-runner-verdict.js.map
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vitest JSON report handling that works on Vitest 4 and 5.
|
|
3
|
+
*
|
|
4
|
+
* Vitest 5 no longer prints the `--reporter=json` document to stdout; it
|
|
5
|
+
* writes `.vitest/json/output.json` and prints only
|
|
6
|
+
* `JSON report written to <path>`. Vitest 4 prints the document to stdout
|
|
7
|
+
* unless `--outputFile` is given, in which case it behaves like Vitest 5.
|
|
8
|
+
*
|
|
9
|
+
* Passing an explicit `--outputFile` therefore gives one contract on both
|
|
10
|
+
* majors: the report is always in a file we own. Every runner integration
|
|
11
|
+
* that spawns `vitest run --reporter=json` must go through this module
|
|
12
|
+
* instead of parsing stdout directly.
|
|
13
|
+
*/
|
|
14
|
+
export interface VitestJsonReport {
|
|
15
|
+
/** Absolute path the report will be written to. */
|
|
16
|
+
readonly path: string;
|
|
17
|
+
/** CLI arguments to append to `vitest run --reporter=json`. */
|
|
18
|
+
readonly args: readonly string[];
|
|
19
|
+
/**
|
|
20
|
+
* Return the text that carries the JSON document: the report file when the
|
|
21
|
+
* runner wrote one, otherwise the captured stdout (older runners, or a run
|
|
22
|
+
* that died before reporting).
|
|
23
|
+
*/
|
|
24
|
+
read(stdout: string): string;
|
|
25
|
+
/** Remove the temporary report directory. Safe to call more than once. */
|
|
26
|
+
cleanup(): void;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Resolve the JSON document text for a finished Vitest run.
|
|
30
|
+
* Exported separately so the precedence rule is unit-testable without spawning.
|
|
31
|
+
*/
|
|
32
|
+
export declare function resolveVitestJsonOutput(stdout: string, reportPath: string | undefined): string;
|
|
33
|
+
/**
|
|
34
|
+
* Create a per-run report location. The directory is unique per call so
|
|
35
|
+
* concurrent runs never read each other's output.
|
|
36
|
+
*/
|
|
37
|
+
export declare function createVitestJsonReport(): VitestJsonReport;
|
|
38
|
+
/**
|
|
39
|
+
* True when a command vector (runner command plus arguments) is a
|
|
40
|
+
* `vitest ... --reporter=json` invocation that has not already been given an
|
|
41
|
+
* output file. Pass the runner command as the first element when the caller
|
|
42
|
+
* configures it separately (for example `testRunner: 'vitest'`).
|
|
43
|
+
*/
|
|
44
|
+
export declare function needsVitestJsonReportFile(args: readonly string[]): boolean;
|
|
45
|
+
//# sourceMappingURL=vitest-json-report.d.ts.map
|