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
|
@@ -7,48 +7,47 @@
|
|
|
7
7
|
import * as fs from 'fs/promises';
|
|
8
8
|
import * as path from 'path';
|
|
9
9
|
import { ok, err } from '../../shared/types/index.js';
|
|
10
|
+
import { createHash } from 'node:crypto';
|
|
10
11
|
import { toError } from '../../shared/error-utils.js';
|
|
11
12
|
import { FilePath } from '../../shared/value-objects/index.js';
|
|
12
|
-
import {
|
|
13
|
+
import { generateSecurityRecommendations } from './handler-utils.js';
|
|
14
|
+
import { discoverSecurityFiles, isSecuritySourceFile } from '../../domains/security-compliance/scan-discovery.js';
|
|
13
15
|
export function registerSecurityHandlers(ctx) {
|
|
14
16
|
// Register security scan handler - REAL IMPLEMENTATION
|
|
15
17
|
ctx.registerHandler('scan-security', async (task) => {
|
|
16
18
|
const payload = task.payload;
|
|
17
19
|
try {
|
|
18
|
-
const
|
|
19
|
-
const
|
|
20
|
-
|
|
21
|
-
const filesToScan =
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
informational: 0,
|
|
30
|
-
topVulnerabilities: [],
|
|
31
|
-
recommendations: ['No source files found to scan'],
|
|
32
|
-
scanTypes: {
|
|
33
|
-
sast: payload.sast !== false,
|
|
34
|
-
dast: payload.dast || false,
|
|
35
|
-
},
|
|
36
|
-
warning: `No source files found in ${targetPath}`,
|
|
37
|
-
});
|
|
38
|
-
}
|
|
20
|
+
const targetPath = path.resolve(payload.target || process.cwd());
|
|
21
|
+
const sastRequested = payload.sast !== false;
|
|
22
|
+
const discoveryResult = sastRequested ? await discoverSecurityFiles(targetPath) : undefined;
|
|
23
|
+
const filesToScan = discoveryResult?.files ?? [];
|
|
24
|
+
const fileEvidence = [];
|
|
25
|
+
const engines = [];
|
|
26
|
+
const genericRules = new Map();
|
|
27
|
+
const genericErrors = [];
|
|
28
|
+
const manifestErrors = [];
|
|
29
|
+
const manifestRules = new Map();
|
|
30
|
+
const limitations = [];
|
|
39
31
|
// Separate files by language capability
|
|
40
|
-
const jstsFiles = filesToScan.filter(f => /\.(ts|tsx|js|jsx|mjs|cjs)
|
|
41
|
-
const otherFiles = filesToScan.filter(f => !/\.(ts|tsx|js|jsx|mjs|cjs)
|
|
32
|
+
const jstsFiles = filesToScan.filter(f => /\.(ts|tsx|js|jsx|mjs|cjs)$/i.test(f));
|
|
33
|
+
const otherFiles = filesToScan.filter(f => !/\.(ts|tsx|js|jsx|mjs|cjs)$/i.test(f));
|
|
42
34
|
// Run basic cross-language security patterns on non-JS/TS files
|
|
43
35
|
const crossLangVulns = [];
|
|
44
36
|
// Run secret/CORS patterns on ALL files (not just otherFiles) to catch JS/TS secrets too
|
|
45
37
|
for (const filePath of filesToScan) {
|
|
38
|
+
if (!isSecuritySourceFile(filePath)) {
|
|
39
|
+
fileEvidence.push({ path: filePath, engineId: 'generic-patterns', status: 'unsupported',
|
|
40
|
+
readLines: 0, analyzedLines: 0, reason: 'Outside the declared source-language policy.' });
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
46
43
|
try {
|
|
47
|
-
const
|
|
44
|
+
const source = await fs.readFile(filePath);
|
|
45
|
+
const content = source.toString('utf-8');
|
|
48
46
|
const lines = content.split('\n');
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
:
|
|
47
|
+
fileEvidence.push({ path: filePath, engineId: 'generic-patterns', status: 'analyzed',
|
|
48
|
+
sourceDigest: createHash('sha256').update(source).digest('hex'),
|
|
49
|
+
readLines: lines.length, analyzedLines: lines.length });
|
|
50
|
+
const relPath = path.relative(targetPath, filePath) || path.basename(filePath);
|
|
52
51
|
// Pattern: Hardcoded secrets/keys
|
|
53
52
|
// Fix #287: Use \w* around keywords to match SECRET_KEY, JWT_SECRET, API_TOKEN, etc.
|
|
54
53
|
const secretPatterns = [
|
|
@@ -56,7 +55,8 @@ export function registerSecurityHandlers(ctx) {
|
|
|
56
55
|
{ regex: /\w*(?:token|auth_token|access_key|secret_key)\w*\s*[=:]\s*['"][^'"]{8,}['"]/gi, title: 'Hardcoded credential', severity: 'critical' },
|
|
57
56
|
{ regex: /(?:AWS_SECRET|GITHUB_TOKEN|SLACK_TOKEN|OPENAI_API_KEY)\s*[=:]\s*['"][^'"]+['"]/gi, title: 'Hardcoded cloud credential', severity: 'critical' },
|
|
58
57
|
];
|
|
59
|
-
for (const pattern of secretPatterns) {
|
|
58
|
+
for (const [index, pattern] of secretPatterns.entries()) {
|
|
59
|
+
genericRules.set(`secret-${index}`, pattern.regex.toString());
|
|
60
60
|
for (let i = 0; i < lines.length; i++) {
|
|
61
61
|
// Use matchAll to find ALL secrets on a single line (not just first)
|
|
62
62
|
const matches = [...lines[i].matchAll(pattern.regex)];
|
|
@@ -73,6 +73,7 @@ export function registerSecurityHandlers(ctx) {
|
|
|
73
73
|
}
|
|
74
74
|
// Pattern: SQL injection risks
|
|
75
75
|
const sqlPatterns = /(?:execute|query|cursor\.execute)\s*\(\s*(?:f['"]|['"].*%s|['"].*\+\s*\w)/gi;
|
|
76
|
+
genericRules.set('sql-interpolation', sqlPatterns.toString());
|
|
76
77
|
for (let i = 0; i < lines.length; i++) {
|
|
77
78
|
if (sqlPatterns.test(lines[i])) {
|
|
78
79
|
crossLangVulns.push({
|
|
@@ -93,7 +94,8 @@ export function registerSecurityHandlers(ctx) {
|
|
|
93
94
|
/@CrossOrigin\(\s*origins?\s*=\s*["']\*["']/i, // Spring Boot
|
|
94
95
|
/\.Header\(\)\.Set\(["']Access-Control-Allow-Origin["'],\s*["']\*["']/i, // Go
|
|
95
96
|
];
|
|
96
|
-
for (const corsPattern of corsPatterns) {
|
|
97
|
+
for (const [index, corsPattern] of corsPatterns.entries()) {
|
|
98
|
+
genericRules.set(`cors-${index}`, corsPattern.toString());
|
|
97
99
|
if (corsPattern.test(content)) {
|
|
98
100
|
crossLangVulns.push({
|
|
99
101
|
title: 'CORS wildcard origin',
|
|
@@ -106,6 +108,7 @@ export function registerSecurityHandlers(ctx) {
|
|
|
106
108
|
}
|
|
107
109
|
}
|
|
108
110
|
// Pattern: Debug/development mode enabled
|
|
111
|
+
genericRules.set('debug-mode', /(?:DEBUG|debug)\s*[=:]\s*(?:True|true|1)/i.toString());
|
|
109
112
|
if (/(?:DEBUG|debug)\s*[=:]\s*(?:True|true|1)/i.test(content)) {
|
|
110
113
|
crossLangVulns.push({
|
|
111
114
|
title: 'Debug mode enabled',
|
|
@@ -116,6 +119,7 @@ export function registerSecurityHandlers(ctx) {
|
|
|
116
119
|
});
|
|
117
120
|
}
|
|
118
121
|
// Pattern: Eval/exec usage
|
|
122
|
+
genericRules.set('eval-exec', /\b(?:eval|exec)\s*\(/i.toString());
|
|
119
123
|
if (/\b(?:eval|exec)\s*\(/i.test(content)) {
|
|
120
124
|
crossLangVulns.push({
|
|
121
125
|
title: 'Dangerous eval/exec usage',
|
|
@@ -126,16 +130,24 @@ export function registerSecurityHandlers(ctx) {
|
|
|
126
130
|
});
|
|
127
131
|
}
|
|
128
132
|
}
|
|
129
|
-
catch {
|
|
130
|
-
|
|
133
|
+
catch (error) {
|
|
134
|
+
const reason = `Source read failed: ${safeErrorCode(error)}`;
|
|
135
|
+
genericErrors.push(`${filePath}: ${reason}`);
|
|
136
|
+
fileEvidence.push({ path: filePath, engineId: 'generic-patterns', status: 'unreadable',
|
|
137
|
+
readLines: 0, analyzedLines: 0, reason });
|
|
131
138
|
}
|
|
132
139
|
}
|
|
133
140
|
// Also check dependency manifests for known vulnerable packages
|
|
134
141
|
const depManifests = ['requirements.txt', 'pyproject.toml', 'Gemfile', 'go.mod', 'Cargo.toml'];
|
|
135
|
-
for (const manifest of depManifests) {
|
|
142
|
+
for (const manifest of sastRequested ? depManifests : []) {
|
|
136
143
|
const manifestPath = path.join(targetPath, manifest);
|
|
137
144
|
try {
|
|
138
|
-
const
|
|
145
|
+
const manifestSource = await fs.readFile(manifestPath);
|
|
146
|
+
const manifestContent = manifestSource.toString('utf-8');
|
|
147
|
+
const manifestLines = manifestContent.split('\n').length;
|
|
148
|
+
fileEvidence.push({ path: manifestPath, engineId: 'dependency-manifest-patterns', status: 'analyzed',
|
|
149
|
+
sourceDigest: createHash('sha256').update(manifestSource).digest('hex'), readLines: manifestLines, analyzedLines: manifestLines });
|
|
150
|
+
manifestRules.set('dependency-audit-advisory', 'Presence of a supported dependency manifest');
|
|
139
151
|
crossLangVulns.push({
|
|
140
152
|
title: 'Dependency audit recommended',
|
|
141
153
|
severity: 'informational',
|
|
@@ -151,6 +163,7 @@ export function registerSecurityHandlers(ctx) {
|
|
|
151
163
|
{ pkg: 'python-multipart', pattern: /python-multipart/i, cve: 'CVE-2026-24486', severity: 'critical', title: 'python-multipart DoS (CVE-2026-24486)', description: 'python-multipart denial of service via crafted multipart data — upgrade to >=0.0.18' },
|
|
152
164
|
];
|
|
153
165
|
for (const known of knownCVEs) {
|
|
166
|
+
manifestRules.set(known.cve, known.pattern.toString());
|
|
154
167
|
if (known.pattern.test(manifestContent)) {
|
|
155
168
|
crossLangVulns.push({
|
|
156
169
|
title: known.title,
|
|
@@ -163,32 +176,108 @@ export function registerSecurityHandlers(ctx) {
|
|
|
163
176
|
}
|
|
164
177
|
}
|
|
165
178
|
}
|
|
166
|
-
catch {
|
|
167
|
-
|
|
179
|
+
catch (error) {
|
|
180
|
+
const code = error.code;
|
|
181
|
+
if (code !== 'ENOENT' && code !== 'ENOTDIR') {
|
|
182
|
+
const reason = `Manifest read failed: ${safeErrorCode(error)}`;
|
|
183
|
+
manifestErrors.push(`${manifestPath}: ${reason}`);
|
|
184
|
+
fileEvidence.push({ path: manifestPath, engineId: 'dependency-manifest-patterns', status: 'unreadable',
|
|
185
|
+
readLines: 0, analyzedLines: 0, reason });
|
|
186
|
+
}
|
|
168
187
|
}
|
|
169
188
|
}
|
|
189
|
+
const genericAnalyzed = fileEvidence.filter(file => file.engineId === 'generic-patterns' && file.status === 'analyzed').length;
|
|
190
|
+
const manifestsAnalyzed = fileEvidence.filter(file => file.engineId === 'dependency-manifest-patterns' && file.status === 'analyzed').length;
|
|
191
|
+
engines.push({ id: 'dependency-manifest-patterns', requested: sastRequested, required: false,
|
|
192
|
+
status: !sastRequested ? 'disabled' : manifestErrors.length > 0 ? (manifestsAnalyzed > 0 ? 'partial' : 'failed') : manifestsAnalyzed > 0 ? 'completed' : 'not-run',
|
|
193
|
+
scope: 'parent-directory', target: targetPath, analyzedFiles: manifestsAnalyzed,
|
|
194
|
+
ruleIds: [...manifestRules.keys()].sort(), rulesetDigest: createHash('sha256').update(JSON.stringify([...manifestRules.entries()].sort())).digest('hex'),
|
|
195
|
+
ruleCoverage: 'known', errors: manifestErrors, limitations: ['Manifest name patterns are advisories, not a resolved dependency or version audit.'] });
|
|
196
|
+
const genericLimitations = ['Generic text patterns do not establish language-specific or dependency vulnerability coverage.'];
|
|
197
|
+
engines.push({ id: 'generic-patterns', requested: sastRequested, required: sastRequested,
|
|
198
|
+
status: !sastRequested ? 'disabled' : genericErrors.length > 0 ? (genericAnalyzed > 0 ? 'partial' : 'failed')
|
|
199
|
+
: genericAnalyzed === filesToScan.length && genericAnalyzed > 0 ? 'completed'
|
|
200
|
+
: genericAnalyzed > 0 ? 'partial' : filesToScan.length > 0 ? 'unavailable' : 'not-run',
|
|
201
|
+
scope: 'requested-files', analyzedFiles: genericAnalyzed,
|
|
202
|
+
ruleIds: [...genericRules.keys()].sort(),
|
|
203
|
+
rulesetDigest: createHash('sha256').update(JSON.stringify([...genericRules.entries()].sort())).digest('hex'),
|
|
204
|
+
ruleCoverage: 'known', errors: genericErrors, limitations: genericLimitations });
|
|
170
205
|
// Convert JS/TS file paths to FilePath value objects for the SAST scanner
|
|
171
206
|
const filePathObjects = jstsFiles.map(filePath => FilePath.create(filePath));
|
|
172
|
-
//
|
|
207
|
+
// Only returned execution receipts can establish SAST coverage.
|
|
173
208
|
let sastResult = null;
|
|
174
|
-
if (
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
209
|
+
if (sastRequested && filePathObjects.length > 0) {
|
|
210
|
+
try {
|
|
211
|
+
const result = await ctx.getSecurityScanner().scanFiles(filePathObjects);
|
|
212
|
+
if (result.success) {
|
|
213
|
+
sastResult = result.value;
|
|
214
|
+
if (sastResult.evidence) {
|
|
215
|
+
fileEvidence.push(...sastResult.evidence.files);
|
|
216
|
+
engines.push(...sastResult.evidence.engines);
|
|
217
|
+
limitations.push(...sastResult.evidence.limitations);
|
|
218
|
+
}
|
|
219
|
+
else {
|
|
220
|
+
engines.push(unverifiedEngine('sast', 'requested-files'));
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
else {
|
|
224
|
+
engines.push(failedEngine('sast', 'requested-files', result.error));
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
catch (error) {
|
|
228
|
+
engines.push(failedEngine('sast', 'requested-files', error));
|
|
178
229
|
}
|
|
179
230
|
}
|
|
180
|
-
|
|
231
|
+
else {
|
|
232
|
+
engines.push({ id: 'sast', requested: sastRequested, required: false,
|
|
233
|
+
status: sastRequested ? 'not-run' : 'disabled', scope: 'requested-files', analyzedFiles: 0,
|
|
234
|
+
ruleCoverage: 'unknown', errors: [], limitations: sastRequested ? ['No JS/TS files were available for language-specific SAST.'] : [] });
|
|
235
|
+
}
|
|
181
236
|
let dastResult = null;
|
|
182
237
|
if (payload.dast && payload.targetUrl) {
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
238
|
+
try {
|
|
239
|
+
const result = await ctx.getSecurityScanner().scanUrl(payload.targetUrl, {
|
|
240
|
+
activeScanning: true, maxDepth: 3, timeout: 30000,
|
|
241
|
+
});
|
|
242
|
+
if (result.success) {
|
|
243
|
+
dastResult = result.value;
|
|
244
|
+
// Legacy DAST results contain findings, but no execution coverage receipt.
|
|
245
|
+
engines.push({ ...unverifiedEngine('dast', 'url'), target: payload.targetUrl });
|
|
246
|
+
}
|
|
247
|
+
else {
|
|
248
|
+
engines.push({ ...failedEngine('dast', 'url', result.error), target: payload.targetUrl });
|
|
249
|
+
}
|
|
190
250
|
}
|
|
251
|
+
catch (error) {
|
|
252
|
+
engines.push({ ...failedEngine('dast', 'url', error), target: payload.targetUrl });
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
else {
|
|
256
|
+
engines.push({ id: 'dast', requested: payload.dast === true, required: payload.dast === true,
|
|
257
|
+
status: payload.dast ? 'not-run' : 'disabled', scope: 'url', ruleCoverage: 'unknown',
|
|
258
|
+
errors: payload.dast ? ['DAST was requested without targetUrl.'] : [], limitations: [] });
|
|
191
259
|
}
|
|
260
|
+
if (payload.compliance?.length) {
|
|
261
|
+
engines.push({ id: 'compliance', requested: true, required: true, status: 'not-run',
|
|
262
|
+
scope: 'requested-files', ruleCoverage: 'unknown', errors: [],
|
|
263
|
+
limitations: ['Requested compliance checks are not executed by this task handler.'] });
|
|
264
|
+
}
|
|
265
|
+
const requestedPaths = new Set(filesToScan);
|
|
266
|
+
const analyzedPaths = new Set(fileEvidence.filter(file => file.status === 'analyzed' && requestedPaths.has(file.path)).map(file => file.path));
|
|
267
|
+
const requiredEngines = engines.filter(engine => engine.requested && engine.required);
|
|
268
|
+
const hasExecuted = analyzedPaths.size > 0;
|
|
269
|
+
const complete = hasExecuted && requiredEngines.every(engine => engine.status === 'completed') &&
|
|
270
|
+
(!discoveryResult || discoveryResult.discovery.status === 'complete');
|
|
271
|
+
const evidence = {
|
|
272
|
+
schemaVersion: 1, completeness: complete ? 'complete' : hasExecuted ? 'partial' : 'none',
|
|
273
|
+
requestedFiles: filesToScan.length, requestedPaths: filesToScan, duplicateInputs: 0,
|
|
274
|
+
files: fileEvidence, engines,
|
|
275
|
+
limitations: [...new Set([...limitations, ...engines.flatMap(engine => [...engine.limitations, ...engine.errors]),
|
|
276
|
+
...(discoveryResult?.discovery.issues.map(issue => `${issue.path}: ${issue.reason}`) ?? [])])],
|
|
277
|
+
...(discoveryResult ? { discovery: discoveryResult.discovery } : {}),
|
|
278
|
+
};
|
|
279
|
+
const deepAnalysisPerformed = Boolean(sastResult?.evidence?.engines.some(engine => engine.id === 'patterns' && (engine.status === 'completed' || engine.status === 'partial') &&
|
|
280
|
+
(engine.analyzedFiles ?? 0) > 0));
|
|
192
281
|
// Combine results from all scan sources - SAST, DAST, and cross-language patterns
|
|
193
282
|
const crossLangSeverityCounts = {
|
|
194
283
|
critical: crossLangVulns.filter(v => v.severity === 'critical').length,
|
|
@@ -224,7 +313,9 @@ export function registerSecurityHandlers(ctx) {
|
|
|
224
313
|
description: v.description,
|
|
225
314
|
}));
|
|
226
315
|
// Generate recommendations based on findings
|
|
227
|
-
const recommendations =
|
|
316
|
+
const recommendations = allVulns.length === 0 && evidence.completeness !== 'complete'
|
|
317
|
+
? ['No findings reported; requested analysis is incomplete or unverified. Inspect execution receipts.']
|
|
318
|
+
: generateSecurityRecommendations(allVulns);
|
|
228
319
|
return ok({
|
|
229
320
|
vulnerabilities: allVulns.length,
|
|
230
321
|
critical: summary.critical,
|
|
@@ -233,33 +324,24 @@ export function registerSecurityHandlers(ctx) {
|
|
|
233
324
|
low: summary.low,
|
|
234
325
|
informational: summary.informational,
|
|
235
326
|
topVulnerabilities,
|
|
327
|
+
findings: allVulns,
|
|
236
328
|
recommendations,
|
|
237
329
|
scanTypes: {
|
|
238
330
|
sast: payload.sast !== false,
|
|
239
331
|
dast: payload.dast || false,
|
|
240
332
|
},
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
...(jstsFiles.length === 0 ? {
|
|
254
|
-
note: otherFiles.length > 0
|
|
255
|
-
? 'NO LANGUAGE-SPECIFIC ANALYSIS RAN. Only cross-language pattern matching ' +
|
|
256
|
-
'(secrets, CORS, eval/exec) was applied to these files — full SAST is ' +
|
|
257
|
-
'implemented for JS/TS only. A zero-finding result here means "nothing ' +
|
|
258
|
-
'matched a generic pattern", NOT "no vulnerabilities". Run a ' +
|
|
259
|
-
'language-specific tool (cargo audit / clippy, bandit, gosec, semgrep) ' +
|
|
260
|
-
'for real coverage of this codebase.'
|
|
261
|
-
: 'No source files were analyzed.',
|
|
262
|
-
} : {}),
|
|
333
|
+
status: evidence.completeness === 'complete' ? 'completed' : evidence.completeness === 'partial' ? 'partial' : 'unavailable',
|
|
334
|
+
evidence,
|
|
335
|
+
limitations: evidence.limitations,
|
|
336
|
+
filesScanned: analyzedPaths.size,
|
|
337
|
+
jstsFilesScanned: jstsFiles.filter(file => analyzedPaths.has(file)).length,
|
|
338
|
+
otherFilesScanned: otherFiles.filter(file => analyzedPaths.has(file)).length,
|
|
339
|
+
...(sastResult?.evidence ? { coverage: sastResult.coverage } : {}),
|
|
340
|
+
deepAnalysisPerformed,
|
|
341
|
+
analysisDepth: deepAnalysisPerformed
|
|
342
|
+
? (otherFiles.length > 0 ? 'sast-patterns-on-js-ts; generic-patterns-on-other-languages' : 'sast-patterns')
|
|
343
|
+
: genericAnalyzed > 0 ? 'pattern-matching-only' : 'none',
|
|
344
|
+
...(!deepAnalysisPerformed ? { note: 'No verified language-specific SAST ran. Generic pattern matches and partial findings do not establish that the target is free of vulnerabilities.' } : {}),
|
|
263
345
|
});
|
|
264
346
|
}
|
|
265
347
|
catch (error) {
|
|
@@ -267,4 +349,18 @@ export function registerSecurityHandlers(ctx) {
|
|
|
267
349
|
}
|
|
268
350
|
});
|
|
269
351
|
}
|
|
352
|
+
function failedEngine(id, scope, error) {
|
|
353
|
+
const reason = id === 'sast' && error instanceof Error && error.message.startsWith('No valid rule sets found:')
|
|
354
|
+
? 'No valid rule sets configured.' : `${id} execution failed (${safeErrorCode(error)}).`;
|
|
355
|
+
return { id, requested: true, required: true, status: 'failed', scope,
|
|
356
|
+
ruleCoverage: 'unknown', errors: [reason], limitations: [] };
|
|
357
|
+
}
|
|
358
|
+
function safeErrorCode(error) {
|
|
359
|
+
const code = error?.code;
|
|
360
|
+
return typeof code === 'string' && /^[A-Z0-9_]{1,32}$/.test(code) ? code : 'UNKNOWN';
|
|
361
|
+
}
|
|
362
|
+
function unverifiedEngine(id, scope) {
|
|
363
|
+
return { id, requested: true, required: true, status: 'unverified', scope,
|
|
364
|
+
ruleCoverage: 'unknown', errors: [], limitations: [`${id} returned no execution receipt; coverage is unverified.`] };
|
|
365
|
+
}
|
|
270
366
|
//# sourceMappingURL=security-handlers.js.map
|
|
@@ -8,6 +8,8 @@ import { v4 as uuidv4 } from 'uuid';
|
|
|
8
8
|
import * as fs from 'fs/promises';
|
|
9
9
|
import { ok, err } from '../../shared/types/index.js';
|
|
10
10
|
import { toError } from '../../shared/error-utils.js';
|
|
11
|
+
import { getTestRunnerExecutionError, TestRunnerExecutionError } from '../../shared/test-runner-verdict.js';
|
|
12
|
+
import { createVitestJsonReport } from '../../shared/vitest-json-report.js';
|
|
11
13
|
function escapeRegExp(s) {
|
|
12
14
|
return s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
13
15
|
}
|
|
@@ -160,73 +162,65 @@ export function registerTestExecutionHandlers(ctx) {
|
|
|
160
162
|
return err(toError(error));
|
|
161
163
|
}
|
|
162
164
|
});
|
|
165
|
+
// execute-tests accepts a nonempty list of concrete paths; callers expand globs.
|
|
163
166
|
// Register test execution handler - runs real tests via child process
|
|
164
167
|
ctx.registerHandler('execute-tests', async (task) => {
|
|
165
168
|
const payload = task.payload;
|
|
166
169
|
try {
|
|
167
170
|
const testFiles = payload.testFiles || [];
|
|
168
171
|
if (testFiles.length === 0) {
|
|
169
|
-
return
|
|
170
|
-
total: 0, passed: 0, failed: 0, skipped: 0,
|
|
171
|
-
duration: 0, coverage: 0, failedTests: [],
|
|
172
|
-
warning: 'No test files specified. Provide testFiles array with paths to test files.',
|
|
173
|
-
});
|
|
172
|
+
return err(new TestRunnerExecutionError('No test files specified. Provide testFiles array with paths to test files.'));
|
|
174
173
|
}
|
|
175
|
-
//
|
|
176
|
-
const
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
const safePathPattern = /^[a-zA-Z0-9_.\/\-@]+$/;
|
|
180
|
-
const safeFiles = testFiles.filter(f => safePathPattern.test(f));
|
|
181
|
-
if (safeFiles.length !== testFiles.length) {
|
|
182
|
-
return ok({
|
|
183
|
-
total: 0, passed: 0, failed: 0, skipped: 0,
|
|
184
|
-
duration: 0, coverage: 0, failedTests: [],
|
|
185
|
-
warning: 'Some test file paths contain invalid characters and were rejected.',
|
|
186
|
-
});
|
|
174
|
+
// Validate test file paths before invoking a runner.
|
|
175
|
+
const safePathPattern = /^[a-zA-Z0-9_./@-]+$/;
|
|
176
|
+
if (testFiles.some(file => !safePathPattern.test(file))) {
|
|
177
|
+
return err(new TestRunnerExecutionError('Some test file paths contain invalid characters and were rejected. Provide concrete paths; expand glob patterns before calling.'));
|
|
187
178
|
}
|
|
179
|
+
const { spawnSync } = await import('child_process');
|
|
180
|
+
const options = { cwd: process.cwd(), timeout: 120000, encoding: 'utf-8' };
|
|
181
|
+
let runner = 'vitest';
|
|
182
|
+
// Vitest 5 writes the JSON report to a file rather than stdout; an explicit
|
|
183
|
+
// --outputFile gives Vitest 4 and 5 the same contract.
|
|
184
|
+
const report = createVitestJsonReport();
|
|
185
|
+
let execution;
|
|
186
|
+
let output;
|
|
188
187
|
try {
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
output = vitestResult.stdout || '';
|
|
195
|
-
// If vitest failed (not just test failures), try jest
|
|
196
|
-
if (!output.includes('{') && vitestResult.status !== 0) {
|
|
197
|
-
const jestResult = spawnSync('npx', ['jest', ...safeFiles, '--json'], {
|
|
198
|
-
cwd, timeout: 120000, encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'],
|
|
199
|
-
});
|
|
200
|
-
output = jestResult.stdout || '';
|
|
201
|
-
}
|
|
188
|
+
execution = spawnSync('npx', ['vitest', 'run', ...testFiles, '--reporter=json', ...report.args], options);
|
|
189
|
+
output = report.read(execution.stdout || '');
|
|
190
|
+
}
|
|
191
|
+
finally {
|
|
192
|
+
report.cleanup();
|
|
202
193
|
}
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
194
|
+
// Preserve the existing Jest fallback when Vitest cannot produce a report.
|
|
195
|
+
if (!output.includes('{') && execution.status !== 0) {
|
|
196
|
+
runner = 'jest';
|
|
197
|
+
execution = spawnSync('npx', ['jest', ...testFiles, '--json'], options);
|
|
198
|
+
output = execution.stdout || '';
|
|
199
|
+
}
|
|
200
|
+
const diagnostics = [execution.error?.message, execution.stderr, output].filter(Boolean).join('\n');
|
|
201
|
+
if (execution.error) {
|
|
202
|
+
return err(new TestRunnerExecutionError(`${runner} could not complete: ${diagnostics.slice(0, 4000)}`));
|
|
206
203
|
}
|
|
207
|
-
// Try to parse JSON output from test runner
|
|
208
204
|
try {
|
|
209
205
|
const jsonStart = output.indexOf('{');
|
|
210
206
|
if (jsonStart >= 0) {
|
|
211
207
|
const json = JSON.parse(output.slice(jsonStart));
|
|
212
|
-
// vitest format
|
|
213
208
|
if (json.testResults) {
|
|
214
209
|
const total = json.numTotalTests || 0;
|
|
215
210
|
const passed = json.numPassedTests || 0;
|
|
216
211
|
const failed = json.numFailedTests || 0;
|
|
217
|
-
|
|
212
|
+
const skipped = total - passed - failed;
|
|
213
|
+
const executionError = getTestRunnerExecutionError(runner, testFiles.join(', '), execution.status, { passed, failed, skipped }, diagnostics, json);
|
|
214
|
+
if (executionError)
|
|
215
|
+
return err(executionError);
|
|
216
|
+
return ok({ total, passed, failed, skipped, duration: 0, coverage: 0, failedTests: [] });
|
|
218
217
|
}
|
|
219
218
|
}
|
|
220
219
|
}
|
|
221
220
|
catch {
|
|
222
|
-
//
|
|
221
|
+
// A malformed report cannot establish that the requested tests completed.
|
|
223
222
|
}
|
|
224
|
-
return
|
|
225
|
-
total: testFiles.length, passed: 0, failed: 0, skipped: 0,
|
|
226
|
-
duration: 0, coverage: 0, failedTests: [],
|
|
227
|
-
warning: 'Could not parse test runner output. Check that vitest or jest is installed.',
|
|
228
|
-
rawOutput: output.slice(0, 500),
|
|
229
|
-
});
|
|
223
|
+
return err(new TestRunnerExecutionError(`Could not parse ${runner} results (exit code ${execution.status ?? 'unknown'}):\n${diagnostics.slice(0, 4000)}`));
|
|
230
224
|
}
|
|
231
225
|
catch (error) {
|
|
232
226
|
return err(toError(error));
|
|
@@ -61,6 +61,8 @@ export interface SecurityAuditResult {
|
|
|
61
61
|
readonly overallRiskScore: RiskScore;
|
|
62
62
|
readonly recommendations: string[];
|
|
63
63
|
readonly deploymentDecision: DeploymentDecision;
|
|
64
|
+
/** Requested checks without complete execution evidence; findings remain usable. */
|
|
65
|
+
readonly incompleteChecks?: readonly string[];
|
|
64
66
|
}
|
|
65
67
|
/**
|
|
66
68
|
* Triaged vulnerability findings
|
|
@@ -219,6 +221,7 @@ export declare class SecurityAuditProtocol {
|
|
|
219
221
|
private cleanupAgents;
|
|
220
222
|
private getAuditOptionsForTrigger;
|
|
221
223
|
private updatePhase;
|
|
224
|
+
private recordIncompleteCheck;
|
|
222
225
|
private createEmptyTriagedFindings;
|
|
223
226
|
private calculateSummary;
|
|
224
227
|
private calculateRiskValue;
|