agentic-qe 3.15.6 → 3.15.8
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 +263 -0
- package/README.md +2 -0
- package/assets/skills/skills-manifest.json +1 -1
- package/dist/cli/bundle.js +8 -6
- package/dist/cli/chunks/adapter-FC4EY447.js +2 -0
- package/dist/cli/chunks/{agent-booster-wasm-SY7UCLBL.js → agent-booster-wasm-W3V5P7LE.js} +2 -2
- package/dist/cli/chunks/{agent-handler-KAMYBU3S.js → agent-handler-2NQFHAWE.js} +2 -2
- package/dist/cli/chunks/{agent-memory-branch-2CAW3KUM.js → agent-memory-branch-457ECHHK.js} +2 -2
- package/dist/cli/chunks/aqe-learning-engine-AUAL6UBL.js +2 -0
- package/dist/cli/chunks/{arena-QCCVIOAH.js → arena-IYBQ3GPY.js} +4 -4
- package/dist/cli/chunks/{arena-4OFLJ3R2.js → arena-JV3WSEHU.js} +2 -2
- package/dist/cli/chunks/{audit-RBDQJQJB.js → audit-5OS3T3K6.js} +3 -3
- package/dist/cli/chunks/base-2XML4WH7.js +2 -0
- package/dist/cli/chunks/{better-sqlite3-5JRACCDQ.js → better-sqlite3-IQKBFVAO.js} +2 -2
- package/dist/cli/chunks/{brain-handler-W4QIIRT4.js → brain-handler-KA3SGAFM.js} +3 -3
- package/dist/cli/chunks/{branch-enumerator-IBNGI572.js → branch-enumerator-QZDU2VOQ.js} +2 -2
- package/dist/cli/chunks/{browser-GMSCVAOI.js → browser-ZL7OLKJQ.js} +2 -2
- package/dist/cli/chunks/browser-workflow-2IFEUAAK.js +2 -0
- package/dist/cli/chunks/{chunk-6HWARQWV.js → chunk-22DOS3PM.js} +2 -2
- package/dist/cli/chunks/{chunk-VCONCVSY.js → chunk-2DPHFCMW.js} +2 -2
- package/dist/cli/chunks/{chunk-ALCIUWFC.js → chunk-2GSAAUW3.js} +1 -1
- package/dist/cli/chunks/{chunk-AX26QJ6T.js → chunk-2JCLACCS.js} +2 -2
- package/dist/cli/chunks/{chunk-7XTANLTN.js → chunk-2QRGIEQV.js} +1 -1
- package/dist/cli/chunks/{chunk-MP3FSUNB.js → chunk-2UN4JOTN.js} +2 -2
- package/dist/cli/chunks/{chunk-CR66HNAE.js → chunk-2ZRNXEVI.js} +1 -1
- package/dist/cli/chunks/{chunk-WKDWRRDT.js → chunk-3LFLO2WK.js} +2 -2
- package/dist/cli/chunks/{chunk-QLYO3H7E.js → chunk-3N627QRU.js} +2 -2
- package/dist/cli/chunks/{chunk-VVF337SV.js → chunk-4C3RYBTT.js} +2 -2
- package/dist/cli/chunks/{chunk-MQCTLTGE.js → chunk-4C7KE2EL.js} +2 -2
- package/dist/cli/chunks/{chunk-AUN4FG7V.js → chunk-4GUVVGJX.js} +1 -1
- package/dist/cli/chunks/{chunk-ZOUEQ6DL.js → chunk-4GYFONJB.js} +1 -1
- package/dist/cli/chunks/{chunk-24ZSGYC6.js → chunk-4I35ARWW.js} +1 -1
- package/dist/cli/chunks/{chunk-6MXAJBEA.js → chunk-4NTLGGXO.js} +1 -1
- package/dist/cli/chunks/{chunk-EF5UHDCG.js → chunk-4TZLZRZ4.js} +1 -1
- package/dist/cli/chunks/{chunk-RD5BYLN7.js → chunk-4YUBWU3E.js} +1 -1
- package/dist/cli/chunks/{chunk-7TVIX4WL.js → chunk-52YRSWPS.js} +2 -2
- package/dist/cli/chunks/{chunk-LAY7NCQK.js → chunk-5DZDLOY6.js} +3 -3
- package/dist/cli/chunks/{chunk-34MDMFET.js → chunk-5MBNRTT5.js} +2 -2
- package/dist/cli/chunks/{chunk-VAYZ5QIE.js → chunk-5ONJ7AV6.js} +1 -1
- package/dist/cli/chunks/{chunk-RV6HSMKJ.js → chunk-5YOO5QSE.js} +1 -1
- package/dist/cli/chunks/{chunk-BUTGIVKW.js → chunk-62T7U25U.js} +1 -1
- package/dist/cli/chunks/{chunk-66NW3ZB4.js → chunk-6CKTLVYV.js} +2 -2
- package/dist/cli/chunks/{chunk-TUDENMAE.js → chunk-6E7EOHMN.js} +2 -2
- package/dist/cli/chunks/{chunk-GVRFSXY6.js → chunk-6GIC2263.js} +2 -2
- package/dist/cli/chunks/{chunk-KIDOBLUO.js → chunk-767SR7WH.js} +2 -2
- package/dist/cli/chunks/{chunk-NBUXM5X6.js → chunk-7C6FMLQR.js} +2 -2
- package/dist/cli/chunks/{chunk-4POOJYXA.js → chunk-7CVMT64N.js} +1 -1
- package/dist/cli/chunks/{chunk-R363XXGH.js → chunk-7DHSHD5B.js} +2 -2
- package/dist/cli/chunks/{chunk-IEPWO4XP.js → chunk-7H3GNRNA.js} +2 -2
- package/dist/cli/chunks/{chunk-DQNUPEY5.js → chunk-7SLEUVPZ.js} +2 -2
- package/dist/cli/chunks/{chunk-YNG7E26C.js → chunk-7XGM7Q2N.js} +2 -2
- package/dist/cli/chunks/{chunk-5MT7DMD7.js → chunk-A2UGPKCS.js} +2 -2
- package/dist/cli/chunks/{chunk-2CIDFR2H.js → chunk-A6GCO6ZU.js} +2 -2
- package/dist/cli/chunks/{chunk-XFPQIWEH.js → chunk-BEVWCF3Q.js} +3 -3
- package/dist/cli/chunks/{chunk-LCCTJ2PC.js → chunk-BLZEOGQE.js} +2 -2
- package/dist/cli/chunks/{chunk-6R3FBFCJ.js → chunk-BQUIZ5QT.js} +2 -2
- package/dist/cli/chunks/{chunk-ZUTFHGEO.js → chunk-BTMEOZYY.js} +1 -1
- package/dist/cli/chunks/{chunk-FU7LNUD7.js → chunk-CDLG3Q2O.js} +2 -2
- package/dist/cli/chunks/{chunk-NYS2GUNO.js → chunk-CQ3SBRDP.js} +2 -2
- package/dist/cli/chunks/chunk-CQ5G64EA.js +3 -0
- package/dist/cli/chunks/{chunk-JCE76MPP.js → chunk-CRUQ6RXU.js} +2 -2
- package/dist/cli/chunks/{chunk-XBFQJZWX.js → chunk-D4IBIMWI.js} +2 -2
- package/dist/cli/chunks/{chunk-LZWJ5BMP.js → chunk-D4O3TJI7.js} +2 -2
- package/dist/cli/chunks/{chunk-AUOSHM63.js → chunk-DAFMHM64.js} +2 -2
- package/dist/cli/chunks/{chunk-V3OLS2NG.js → chunk-DCYUHCPK.js} +2 -2
- package/dist/cli/chunks/{chunk-F7A2UBZO.js → chunk-DKFSCJEF.js} +2 -2
- package/dist/cli/chunks/{chunk-5LST62QR.js → chunk-DN3AKAPY.js} +2 -2
- package/dist/cli/chunks/{chunk-OQ4S6B7P.js → chunk-DY37YMMQ.js} +1 -1
- package/dist/cli/chunks/{chunk-XQ53PZEF.js → chunk-EUVSSIGR.js} +3 -3
- package/dist/cli/chunks/{chunk-6WOZUSSN.js → chunk-FAYXES7R.js} +2 -2
- package/dist/cli/chunks/{chunk-GNYOHZVV.js → chunk-FEN2DHFM.js} +1 -1
- package/dist/cli/chunks/{chunk-BAYGQRNP.js → chunk-FEPFXXI7.js} +2 -2
- package/dist/cli/chunks/{chunk-DLSFT6PO.js → chunk-FJAO4UX2.js} +2 -2
- package/dist/cli/chunks/{chunk-22OZIJAD.js → chunk-FWXNFPLS.js} +2 -2
- package/dist/cli/chunks/{chunk-X33F7NXH.js → chunk-G6CLO74Q.js} +3 -3
- package/dist/cli/chunks/{chunk-HAN4MS5T.js → chunk-G77Q22EN.js} +2 -2
- package/dist/cli/chunks/{chunk-5DH5QI7G.js → chunk-GENNJRNK.js} +3 -3
- package/dist/cli/chunks/{chunk-LMAEMVPA.js → chunk-GGSTLKY5.js} +1 -1
- package/dist/cli/chunks/{chunk-EJ4KZFZN.js → chunk-GSOK4M6V.js} +1 -1
- package/dist/cli/chunks/{chunk-DA7DGDTI.js → chunk-HI6OBDDY.js} +2 -2
- package/dist/cli/chunks/{chunk-XZ46CI35.js → chunk-HNGNRIZZ.js} +2 -2
- package/dist/cli/chunks/{chunk-CLAMMGY3.js → chunk-HXCGV5UJ.js} +2 -2
- package/dist/cli/chunks/{chunk-5UPIL62W.js → chunk-I4U7YCXG.js} +3 -3
- package/dist/cli/chunks/{chunk-RFDFET3O.js → chunk-I77D65X5.js} +2 -2
- package/dist/cli/chunks/{chunk-HEGGV2PT.js → chunk-IJSFZO7P.js} +2 -2
- package/dist/cli/chunks/{chunk-GWM4M5NF.js → chunk-IMSRWNWF.js} +1 -1
- package/dist/cli/chunks/{chunk-B7RHBKHL.js → chunk-J6LL25QJ.js} +2 -2
- package/dist/cli/chunks/{chunk-KYVIOC3C.js → chunk-J7FLNP5L.js} +2 -2
- package/dist/cli/chunks/{chunk-YLNYPQDR.js → chunk-J7RCI25Q.js} +1 -1
- package/dist/cli/chunks/{chunk-72MQCZSM.js → chunk-JFWQFB3S.js} +2 -2
- package/dist/cli/chunks/{chunk-SV5BUYHH.js → chunk-JLTGO5BB.js} +2 -2
- package/dist/cli/chunks/{chunk-CCL436IU.js → chunk-JWPYMRIX.js} +14 -6
- package/dist/cli/chunks/{chunk-ONPPBLRB.js → chunk-K4N2MBCE.js} +2 -2
- package/dist/cli/chunks/{chunk-7SAMMQVS.js → chunk-K5R3WUJP.js} +1 -1
- package/dist/cli/chunks/{chunk-GI5HWS4H.js → chunk-KITKQUBX.js} +1 -1
- package/dist/cli/chunks/{chunk-7TJZDRDU.js → chunk-KJNUETCB.js} +1 -1
- package/dist/cli/chunks/{chunk-JYKQVYX2.js → chunk-KMVFBYJO.js} +2 -2
- package/dist/cli/chunks/{chunk-ZSBD4FUX.js → chunk-KMZW2P3R.js} +2 -2
- package/dist/cli/chunks/{chunk-PEMSXSP2.js → chunk-KNHLOANK.js} +2 -2
- package/dist/cli/chunks/{chunk-47Q7JL3V.js → chunk-KNQUHGNY.js} +2 -2
- package/dist/cli/chunks/{chunk-A7ANPS4E.js → chunk-KVMKYUOE.js} +2 -2
- package/dist/cli/chunks/{chunk-XBEI2JBA.js → chunk-LHRVSK44.js} +2 -2
- package/dist/cli/chunks/{chunk-AJT3XDRD.js → chunk-LPSMVBB3.js} +2 -2
- package/dist/cli/chunks/{chunk-ORBODZSO.js → chunk-LVHZK7GW.js} +2 -2
- package/dist/cli/chunks/{chunk-ZTB32K5N.js → chunk-LZWBUVCK.js} +3 -3
- package/dist/cli/chunks/{chunk-OPDZBRIL.js → chunk-MMY52Y6R.js} +2 -2
- package/dist/cli/chunks/{chunk-MQTA6KIO.js → chunk-MUDBF2JC.js} +1 -1
- package/dist/cli/chunks/{chunk-GFB6BZWU.js → chunk-MV4S3TEC.js} +2 -2
- package/dist/cli/chunks/{chunk-UB6DQGWM.js → chunk-NF63NHJH.js} +2 -2
- package/dist/cli/chunks/{chunk-D5N2O5EH.js → chunk-NHOMVBCI.js} +2 -2
- package/dist/cli/chunks/{chunk-3NJ7O3OH.js → chunk-NLYUC63R.js} +2 -2
- package/dist/cli/chunks/{chunk-4CLDYT36.js → chunk-NQDYOF35.js} +2 -2
- package/dist/cli/chunks/{chunk-ORFL3YXB.js → chunk-NW7HTOSN.js} +2 -2
- package/dist/cli/chunks/{chunk-FQ5N666N.js → chunk-NWFBF3KT.js} +1 -1
- package/dist/cli/chunks/{chunk-P7DXVL2S.js → chunk-NZATJ2C6.js} +2 -2
- package/dist/cli/chunks/{chunk-HOEWMEF2.js → chunk-O4RRVTXN.js} +2 -2
- package/dist/cli/chunks/{chunk-4KOVHQXK.js → chunk-OCLAMZJG.js} +2 -2
- package/dist/cli/chunks/{chunk-TLUIO37P.js → chunk-OJWEZYLR.js} +2 -2
- package/dist/cli/chunks/{chunk-A74J23QB.js → chunk-OWBFVAEH.js} +2 -2
- package/dist/cli/chunks/{chunk-6T6AHVLF.js → chunk-P2EA62YS.js} +1 -1
- package/dist/cli/chunks/{chunk-TL5GV3PR.js → chunk-P4UT4LBE.js} +3 -3
- package/dist/cli/chunks/{chunk-IVJIHZSM.js → chunk-PICEGWGB.js} +1 -1
- package/dist/cli/chunks/{chunk-ITIJ23K2.js → chunk-PIEKGKW6.js} +2 -2
- package/dist/cli/chunks/{chunk-2ZTWPMTK.js → chunk-PJGQ2TKN.js} +2 -2
- package/dist/cli/chunks/{chunk-KCB6P463.js → chunk-PPIM7B5G.js} +2 -2
- package/dist/cli/chunks/{chunk-L2TDHJR3.js → chunk-PUYQ6EKC.js} +2 -2
- package/dist/cli/chunks/{chunk-2IWPJUVV.js → chunk-PWA6XBW4.js} +8 -8
- package/dist/cli/chunks/{chunk-XPB5BVU6.js → chunk-PZ7FJ4UG.js} +2 -2
- package/dist/cli/chunks/{chunk-SOSJWM3E.js → chunk-QFYUZYRA.js} +4 -4
- package/dist/cli/chunks/{chunk-RUTO67PT.js → chunk-R2NHGESM.js} +2 -2
- package/dist/cli/chunks/{chunk-K55EAWZ5.js → chunk-RG42LDOB.js} +2 -2
- package/dist/cli/chunks/{chunk-JAPBSSFY.js → chunk-RSMPJWQH.js} +1 -1
- package/dist/cli/chunks/{chunk-46HBVDMU.js → chunk-SFPGLUXS.js} +1 -1
- package/dist/cli/chunks/{chunk-TVLOED6O.js → chunk-SHEVM5PF.js} +2 -2
- package/dist/cli/chunks/{chunk-6RDVY26I.js → chunk-SJMZZMHP.js} +2 -2
- package/dist/cli/chunks/{chunk-3DJNKNBR.js → chunk-ST7ASEJO.js} +57 -57
- package/dist/cli/chunks/{chunk-QS5KZYUZ.js → chunk-SWY6KGMF.js} +2 -2
- package/dist/cli/chunks/{chunk-UHHMAKPE.js → chunk-T2TDTBFV.js} +1 -1
- package/dist/cli/chunks/{chunk-5HAPS6VD.js → chunk-TC52M542.js} +2 -2
- package/dist/cli/chunks/chunk-TMNEK7TP.js +2 -0
- package/dist/cli/chunks/{chunk-ELI4GDQO.js → chunk-U3BWBP6B.js} +2 -2
- package/dist/cli/chunks/{chunk-CZBIREL5.js → chunk-U7CIY3YR.js} +2 -2
- package/dist/cli/chunks/{chunk-X2DR27AY.js → chunk-UDCYQLTD.js} +2 -2
- package/dist/cli/chunks/{chunk-CEXNW5TR.js → chunk-UKKFZJME.js} +1 -1
- package/dist/cli/chunks/{chunk-5NC7QEJ6.js → chunk-UQLAN5TX.js} +4 -4
- package/dist/cli/chunks/{chunk-BIXRTOH3.js → chunk-UTFMMZ57.js} +3 -3
- package/dist/cli/chunks/{chunk-YXU35GGD.js → chunk-UTNKMPTC.js} +1 -1
- package/dist/cli/chunks/{chunk-HZFK2Z2Z.js → chunk-V4QJ3MMT.js} +1 -1
- package/dist/cli/chunks/{chunk-LJCEDTUM.js → chunk-V7VZSNDK.js} +3 -3
- package/dist/cli/chunks/{chunk-RLB7K7QP.js → chunk-VKFVJCIH.js} +1 -1
- package/dist/cli/chunks/{chunk-5GIJU2ZY.js → chunk-VQRBBR27.js} +2 -2
- package/dist/cli/chunks/{chunk-Q2RBOC7V.js → chunk-VVK4ECVJ.js} +2 -2
- package/dist/cli/chunks/{chunk-624QRKQX.js → chunk-VWRNG3UK.js} +1 -1
- package/dist/cli/chunks/{chunk-F3KS3TAB.js → chunk-VWSGWYRB.js} +2 -2
- package/dist/cli/chunks/{chunk-I7WAW7TM.js → chunk-W5A36V3Z.js} +2 -2
- package/dist/cli/chunks/chunk-WAWKAYPY.js +2 -0
- package/dist/cli/chunks/{chunk-NMY4KTWA.js → chunk-WLXGUQOZ.js} +2 -2
- package/dist/cli/chunks/{chunk-7VTKR44N.js → chunk-X3HM7SV4.js} +2 -2
- package/dist/cli/chunks/chunk-X6VYQVUM.js +2 -0
- package/dist/cli/chunks/{chunk-ZL5LJT7D.js → chunk-X7ZQIFES.js} +2 -2
- package/dist/cli/chunks/{chunk-5VUIXDY2.js → chunk-XOOBLZXR.js} +2 -2
- package/dist/cli/chunks/{chunk-L4D3TPFP.js → chunk-XZQVC3GD.js} +1 -1
- package/dist/cli/chunks/{chunk-BO7UFNYV.js → chunk-Y5ZBF7MA.js} +2 -2
- package/dist/cli/chunks/{chunk-ULCHPPW2.js → chunk-YNQPHRUZ.js} +1 -1
- package/dist/cli/chunks/{chunk-ZCP4P6O2.js → chunk-YRH7KMTU.js} +2 -2
- package/dist/cli/chunks/{chunk-QLKUCMZC.js → chunk-YTYS2XSY.js} +1 -1
- package/dist/cli/chunks/{chunk-JPJEAK4G.js → chunk-YUP3APSN.js} +1 -1
- package/dist/cli/chunks/{chunk-BXATKI5S.js → chunk-YVWMJZ6O.js} +2 -2
- package/dist/cli/chunks/{chunk-PS6WFCA4.js → chunk-Z3LDUPLQ.js} +2 -2
- package/dist/cli/chunks/{chunk-FOJRPEIP.js → chunk-ZBI7PJFX.js} +2 -2
- package/dist/cli/chunks/{chunk-NHRF3V4B.js → chunk-ZG7UKWBB.js} +2 -2
- package/dist/cli/chunks/{chunk-7XUB7U6Z.js → chunk-ZOHS32SI.js} +2 -2
- package/dist/cli/chunks/{chunk-RHIQ6QO5.js → chunk-ZOVAZTXE.js} +430 -430
- package/dist/cli/chunks/{chunk-7QVPMH25.js → chunk-ZWMFKZEQ.js} +2 -2
- package/dist/cli/chunks/{ci-GEJCXMBK.js → ci-7NUCRGWO.js} +2 -2
- package/dist/cli/chunks/{ci-config-2ZVV4OXL.js → ci-config-VQVECCFI.js} +2 -2
- package/dist/cli/chunks/{ci-output-E45OGVPR.js → ci-output-P7GQ6TKF.js} +2 -2
- package/dist/cli/chunks/{circuit-breaker-X73ITYZC.js → circuit-breaker-5YP6N6HE.js} +2 -2
- package/dist/cli/chunks/{claude-flow-setup-W4PPH46C.js → claude-flow-setup-W5H7CMU6.js} +2 -2
- package/dist/cli/chunks/client-RFUSQRUZ.js +2 -0
- package/dist/cli/chunks/{cline-installer-NUEPMWDE.js → cline-installer-OYANSZ54.js} +2 -2
- package/dist/cli/chunks/{code-6WQHBS7G.js → code-OMT4UEZI.js} +3 -3
- package/dist/cli/chunks/{code-index-extractor-BXQIFIFT.js → code-index-extractor-M2JEWKNF.js} +2 -2
- package/dist/cli/chunks/{codex-installer-Z337R2KH.js → codex-installer-YBS6N5O3.js} +2 -2
- package/dist/cli/chunks/{completions-F5DMYFHV.js → completions-U7GS5RG6.js} +2 -2
- package/dist/cli/chunks/{complexity-analyzer-W2SYPZDI.js → complexity-analyzer-QSXPIUIU.js} +2 -2
- package/dist/cli/chunks/{continuedev-installer-ZCHUIFTN.js → continuedev-installer-W5TTT743.js} +2 -2
- package/dist/cli/chunks/{copilot-installer-M5JNODXF.js → copilot-installer-KC2RT24C.js} +2 -2
- package/dist/cli/chunks/core-handlers-ZC7QB432.js +2 -0
- package/dist/cli/chunks/{cost-tracker-LSYTHBHV.js → cost-tracker-OQPVR6V4.js} +2 -2
- package/dist/cli/chunks/{coverage-PGMRS5SS.js → coverage-TCO2A2NX.js} +3 -3
- package/dist/cli/chunks/cross-domain-router-GRBK7YFZ.js +2 -0
- package/dist/cli/chunks/{cursor-installer-XPUA73UW.js → cursor-installer-MH7GWD4L.js} +2 -2
- package/dist/cli/chunks/daemon-JER6HE2J.js +12 -0
- package/dist/cli/chunks/{daemon-ITKDIYMW.js → daemon-UJEARJZ2.js} +3 -3
- package/dist/cli/chunks/{dag-attention-scheduler-T55AXLD6.js → dag-attention-scheduler-F3SUJU5O.js} +2 -2
- package/dist/cli/chunks/{detect-DR7J6K4O.js → detect-5QTCRB32.js} +2 -2
- package/dist/cli/chunks/{dist-node-LAJJBOUT.js → dist-node-XKZPHDBO.js} +2 -2
- package/dist/cli/chunks/{domain-handler-OMSHCRMK.js → domain-handler-V3UEADKW.js} +2 -2
- package/dist/cli/chunks/{domain-plugins-EQXSKC5K.js → domain-plugins-7PES4UHZ.js} +2 -2
- package/dist/cli/chunks/{domain-transfer-FKRAGVSW.js → domain-transfer-NF7UJW7B.js} +2 -2
- package/dist/cli/chunks/dream-VALD726W.js +2 -0
- package/dist/cli/chunks/{embed-and-insert-pattern-JZFPCNL3.js → embed-and-insert-pattern-D2HWORHF.js} +2 -2
- package/dist/cli/chunks/{eval-JSNNASBW.js → eval-UF2UBAUC.js} +2 -2
- package/dist/cli/chunks/{experience-capture-middleware-UPD3IZBK.js → experience-capture-middleware-2OUCEHHM.js} +3 -3
- package/dist/cli/chunks/{fast-paths-YNMIBS2E.js → fast-paths-KV5DKKHC.js} +2 -2
- package/dist/cli/chunks/{feature-flags-SRLXDKBI.js → feature-flags-6YWMTNO5.js} +2 -2
- package/dist/cli/chunks/{feature-flags-VIR7O4L7.js → feature-flags-MTW6NMR3.js} +2 -2
- package/dist/cli/chunks/file-discovery-VL73ASNI.js +2 -0
- package/dist/cli/chunks/{fleet-K2ED46EL.js → fleet-GJ66QFXK.js} +3 -3
- package/dist/cli/chunks/{gnn-wrapper-QCU4ZRYW.js → gnn-wrapper-52V6ANOY.js} +2 -2
- package/dist/cli/chunks/{heartbeat-handler-YYQI4WZM.js → heartbeat-handler-X7NHNRC7.js} +4 -4
- package/dist/cli/chunks/heartbeat-scheduler-FSX7A3ZA.js +2 -0
- package/dist/cli/chunks/hnsw-adapter-UX2QT6RL.js +2 -0
- package/dist/cli/chunks/hnsw-index-WRDDAMXH.js +2 -0
- package/dist/cli/chunks/{hnsw-legacy-bridge-C5TJSWTZ.js → hnsw-legacy-bridge-DZBE3KMK.js} +2 -2
- package/dist/cli/chunks/{hnswlib-node-SE3MJJYS.js → hnswlib-node-2AWWUJAZ.js} +2 -2
- package/dist/cli/chunks/{hooks-C572SRDH.js → hooks-XLPVROL3.js} +10 -10
- package/dist/cli/chunks/hybrid-backend-O67NGIB5.js +2 -0
- package/dist/cli/chunks/{hypergraph-engine-35A6G3M5.js → hypergraph-engine-6TI7YP6P.js} +2 -2
- package/dist/cli/chunks/{hypergraph-handler-U2756CWI.js → hypergraph-handler-DBIBBOXS.js} +3 -3
- package/dist/cli/chunks/impact-analyzer-6VXWWYWM.js +2 -0
- package/dist/cli/chunks/init-guard-OSO6MIDD.js +2 -0
- package/dist/cli/chunks/init-handler-7S7IHMUF.js +88 -0
- package/dist/cli/chunks/init-wizard-VH34J4TL.js +2 -0
- package/dist/cli/chunks/kernel-KJD24NO7.js +2 -0
- package/dist/cli/chunks/{kilocode-installer-32PX5YH7.js → kilocode-installer-2KBRFXMA.js} +2 -2
- package/dist/cli/chunks/{kiro-installer-C4ROMMUS.js → kiro-installer-5VFR4OQZ.js} +2 -2
- package/dist/cli/chunks/knowledge-graph-343O2HEZ.js +2 -0
- package/dist/cli/chunks/{learning-GEPVZGJQ.js → learning-G5NHL3DV.js} +20 -20
- package/dist/cli/chunks/{llm-router-XRKTTJTX.js → llm-router-4EAPPMHS.js} +4 -4
- package/dist/cli/chunks/llm-router-service-2M4BT2AO.js +2 -0
- package/dist/cli/chunks/{load-XVH6HW7E.js → load-UYMZPEY6.js} +2 -2
- package/dist/cli/chunks/load-test-OTQ2JQ5F.js +2 -0
- package/dist/cli/chunks/{mcp-IULSTM4Z.js → mcp-NOTDZBW5.js} +2 -2
- package/dist/cli/chunks/{memory-6K7IAU4T.js → memory-QL53YIHP.js} +5 -5
- package/dist/cli/chunks/memory-backend-4QSNRRV6.js +2 -0
- package/dist/cli/chunks/{memory-handlers-CG6DRLAW.js → memory-handlers-YFFYRSM6.js} +2 -2
- package/dist/cli/chunks/{multi-model-executor-VZDUYPLX.js → multi-model-executor-PDDDXF2B.js} +2 -2
- package/dist/cli/chunks/{opencode-installer-QUTXKNH4.js → opencode-installer-75D2SKOT.js} +2 -2
- package/dist/cli/chunks/{orchestrator-PCKKUWOP.js → orchestrator-3WIZBV4T.js} +5 -5
- package/dist/cli/chunks/pattern-null-store-5USH5MNR.js +2 -0
- package/dist/cli/chunks/{pattern-usage-recorder-PX5HQVRL.js → pattern-usage-recorder-TEX2JGHA.js} +2 -2
- package/dist/cli/chunks/{pipeline-O562GTOG.js → pipeline-7ATPA6LU.js} +2 -2
- package/dist/cli/chunks/{platform-PM7Q2AZS.js → platform-WPSKRJE7.js} +2 -2
- package/dist/cli/chunks/{plugin-OTYTFGPY.js → plugin-UUFOVVMU.js} +2 -2
- package/dist/cli/chunks/{prime-radiant-advanced-wasm-6CFXTHC2.js → prime-radiant-advanced-wasm-PDFSYWKZ.js} +2 -2
- package/dist/cli/chunks/project-root-SRTA6TBL.js +2 -0
- package/dist/cli/chunks/protocol-executor-4WYPCNBS.js +2 -0
- package/dist/cli/chunks/{protocol-handler-PPGNSAOS.js → protocol-handler-3VRYRIQB.js} +2 -2
- package/dist/cli/chunks/{prove-WQ3BKRZG.js → prove-2NAUROGF.js} +2 -2
- package/dist/cli/chunks/qe-reasoning-bank-I4D6SFS4.js +2 -0
- package/dist/cli/chunks/{quality-C5WUU3AA.js → quality-ZIEI2WGA.js} +2 -2
- package/dist/cli/chunks/{quality-gate-WSSRKD5U.js → quality-gate-KWJO4SWQ.js} +3 -3
- package/dist/cli/chunks/queen-coordinator-24UMTZTE.js +2 -0
- package/dist/cli/chunks/{real-embeddings-CFQE7IRQ.js → real-embeddings-TSZ4UIAE.js} +2 -2
- package/dist/cli/chunks/{ref-validation-DHKHXVZT.js → ref-validation-DWFFRETJ.js} +2 -2
- package/dist/cli/chunks/{roocode-installer-3PPODABV.js → roocode-installer-XTZHLUBO.js} +2 -2
- package/dist/cli/chunks/router-AUD4GATI.js +2 -0
- package/dist/cli/chunks/routing-feedback-2FE6SIKQ.js +2 -0
- package/dist/cli/chunks/{routing-handler-JNXTGT6T.js → routing-handler-GG525TDM.js} +2 -2
- package/dist/cli/chunks/{ruvector-commands-6YLROPVP.js → ruvector-commands-QKRJDM7Z.js} +2 -2
- package/dist/cli/chunks/rvf-dual-writer-P5LEUF25.js +2 -0
- package/dist/cli/chunks/rvf-migration-adapter-ZCYD5YJS.js +2 -0
- package/dist/cli/chunks/{rvf-migration-coordinator-4DWB4WRK.js → rvf-migration-coordinator-FF52OS6Q.js} +2 -2
- package/dist/cli/chunks/rvf-native-adapter-QGV6BW2W.js +2 -0
- package/dist/cli/chunks/{rvf-store-integrity-YKR2ZNBF.js → rvf-store-integrity-M6DXTAZ4.js} +2 -2
- package/dist/cli/chunks/safe-db-Q6JUKG2A.js +2 -0
- package/dist/cli/chunks/schedule-44OSMGE5.js +2 -0
- package/dist/cli/chunks/scheduler-V3HO2QQT.js +2 -0
- package/dist/cli/chunks/security-EHXSW22U.js +18 -0
- package/dist/cli/chunks/{shared-rvf-adapter-LNRLFP5I.js → shared-rvf-adapter-6EH7UVJL.js} +2 -2
- package/dist/cli/chunks/{shared-rvf-dual-writer-GWU6YQNS.js → shared-rvf-dual-writer-WML274E7.js} +2 -2
- package/dist/cli/chunks/sqlite-persistence-N5T7DWMR.js +2 -0
- package/dist/cli/chunks/{standalone-memory-46KKBSSV.js → standalone-memory-C7QKAXS4.js} +2 -2
- package/dist/cli/chunks/{status-handler-35T5FTDQ.js → status-handler-VLI7MRLM.js} +2 -2
- package/dist/cli/chunks/{structural-health-P7QPQWLO.js → structural-health-3LPG6MQN.js} +2 -2
- package/dist/cli/chunks/{sync-Y43EWBSY.js → sync-4IMMQEPT.js} +2 -2
- package/dist/cli/chunks/{sync-W6Z4R4PL.js → sync-JFJEJBVK.js} +2 -2
- package/dist/cli/chunks/{task-handler-5CX3ZYT7.js → task-handler-IED3K6E4.js} +2 -2
- package/dist/cli/chunks/{task-handlers-DQZGOJNE.js → task-handlers-FH6DNTHW.js} +3 -3
- package/dist/cli/chunks/{test-TPP53VVV.js → test-GPKT3CKZ.js} +4 -4
- package/dist/cli/chunks/{test-scheduling-WBV4UMQH.js → test-scheduling-Z42XXZP6.js} +3 -3
- package/dist/cli/chunks/{token-bootstrap-GIIDXHLC.js → token-bootstrap-HMM3AHXM.js} +2 -2
- package/dist/cli/chunks/{token-usage-AKK37RB7.js → token-usage-6Y2ERYIY.js} +2 -2
- package/dist/cli/chunks/{transformers-7MASPELS.js → transformers-MB63T2XO.js} +2 -2
- package/dist/cli/chunks/{tree-sitter-wasm-parser-YZKD6UGB.js → tree-sitter-wasm-parser-56GDQCMR.js} +2 -2
- package/dist/cli/chunks/{types-AZ3BTXDP.js → types-J4J6QV3I.js} +2 -2
- package/dist/cli/chunks/unified-memory-RQ3Q4CU3.js +2 -0
- package/dist/cli/chunks/unified-memory-hnsw-ZOP5FEYX.js +2 -0
- package/dist/cli/chunks/unified-persistence-72OCJJKK.js +2 -0
- package/dist/cli/chunks/{upgrade-L7OTDKEK.js → upgrade-U4XU7LFM.js} +2 -2
- package/dist/cli/chunks/{validate-O3QVFIGP.js → validate-B57HA4YK.js} +2 -2
- package/dist/cli/chunks/{validate-swarm-2UGBGLTX.js → validate-swarm-UPPA4M6T.js} +2 -2
- package/dist/cli/chunks/visual-security-7F5UV23J.js +2 -0
- package/dist/cli/chunks/{web-tree-sitter-J75IYPRO.js → web-tree-sitter-GDZMUKOZ.js} +2 -2
- package/dist/cli/chunks/{windsurf-installer-FQ5DBFCG.js → windsurf-installer-VJRWCHXP.js} +2 -2
- package/dist/cli/chunks/witness-chain-KZ57QUFE.js +2 -0
- package/dist/cli/chunks/{witness-chain-I7TN4MXZ.js → witness-chain-LFASSMZK.js} +2 -2
- package/dist/cli/chunks/{witness-chain-repair-D3NE3NQK.js → witness-chain-repair-TPHN4DXN.js} +2 -2
- package/dist/cli/chunks/{witness-chain-verifier-RU2WOP5M.js → witness-chain-verifier-Z23FVABW.js} +2 -2
- package/dist/cli/chunks/{witness-key-manager-IHQB2FR5.js → witness-key-manager-745MJ7WO.js} +2 -2
- package/dist/cli/chunks/{workflow-6BWTNVV6.js → workflow-T245QNQM.js} +4 -4
- package/dist/cli/chunks/workflow-orchestrator-ZNWEUYBN.js +2 -0
- package/dist/cli/chunks/{wrappers-URVP25VU.js → wrappers-WCAYIQUX.js} +2 -2
- package/dist/cli/commands/learning.js +3 -2
- package/dist/cli/commands/security.d.ts +16 -0
- package/dist/cli/commands/security.js +76 -9
- package/dist/cli/handlers/init-guard.d.ts +21 -1
- package/dist/cli/handlers/init-guard.js +51 -8
- package/dist/cli/handlers/init-handler.js +57 -56
- package/dist/cli/index.js +11 -0
- package/dist/cli/utils/ci-output.d.ts +5 -0
- package/dist/cli/utils/ci-output.js +8 -0
- package/dist/coordination/handlers/security-handlers.js +22 -6
- package/dist/coordination/protocols/defect-investigation.js +7 -1
- package/dist/coordination/protocols/learning-consolidation.js +6 -12
- package/dist/coordination/protocols/security-audit.js +11 -0
- package/dist/coordination/result-saver.d.ts +9 -0
- package/dist/coordination/result-saver.js +34 -4
- package/dist/domains/coverage-analysis/collected-metrics.d.ts +2 -0
- package/dist/domains/coverage-analysis/collected-metrics.js +8 -1
- package/dist/domains/defect-intelligence/services/defect-predictor.js +9 -6
- package/dist/domains/learning-optimization/active-patterns.d.ts +55 -0
- package/dist/domains/learning-optimization/active-patterns.js +77 -0
- package/dist/domains/learning-optimization/coordinator.js +12 -9
- package/dist/domains/learning-optimization/services/learning-coordinator.js +15 -17
- package/dist/domains/quality-assessment/interfaces.d.ts +4 -0
- package/dist/domains/quality-assessment/quality-evidence.d.ts +1 -1
- package/dist/domains/quality-assessment/services/quality-analyzer.js +7 -5
- package/dist/domains/quality-assessment/services/quality-gate.js +12 -3
- package/dist/domains/security-compliance/dependency-advisory-engine.d.ts +52 -0
- package/dist/domains/security-compliance/dependency-advisory-engine.js +113 -0
- package/dist/domains/security-compliance/interfaces.d.ts +30 -0
- package/dist/domains/security-compliance/plugin.d.ts +7 -1
- package/dist/domains/security-compliance/plugin.js +19 -0
- package/dist/domains/security-compliance/services/scanners/dependency-resolver.d.ts +71 -0
- package/dist/domains/security-compliance/services/scanners/dependency-resolver.js +232 -0
- package/dist/domains/security-compliance/services/scanners/dependency-scanner.d.ts +21 -6
- package/dist/domains/security-compliance/services/scanners/dependency-scanner.js +142 -64
- package/dist/domains/security-compliance/services/scanners/lockfile-versions.d.ts +43 -0
- package/dist/domains/security-compliance/services/scanners/lockfile-versions.js +248 -0
- package/dist/domains/security-compliance/services/scanners/scanner-types.d.ts +30 -2
- package/dist/domains/security-compliance/services/security-auditor.d.ts +19 -6
- package/dist/domains/security-compliance/services/security-auditor.js +133 -92
- package/dist/domains/test-execution/services/retry-handler.js +34 -7
- package/dist/domains/test-execution/services/test-executor.d.ts +1 -0
- package/dist/domains/test-execution/services/test-executor.js +87 -7
- package/dist/kernel/shared-dirs.js +17 -5
- package/dist/learning/dream/dream-engine.d.ts +27 -1
- package/dist/learning/dream/dream-engine.js +56 -2
- package/dist/learning/dream/rvcow-branch-manager.d.ts +8 -0
- package/dist/learning/dream/rvcow-branch-manager.js +8 -0
- package/dist/learning/dream/speculative-dreamer.d.ts +8 -0
- package/dist/learning/dream/speculative-dreamer.js +8 -0
- package/dist/mcp/background-workers.d.ts +15 -0
- package/dist/mcp/background-workers.js +71 -0
- package/dist/mcp/bundle.js +881 -878
- package/dist/mcp/entry.js +4 -49
- package/dist/mcp/handlers/domain-handler-configs.d.ts +4 -0
- package/dist/mcp/handlers/domain-handler-configs.js +5 -1
- package/dist/mcp/protocol-server.js +2 -1
- package/dist/mcp/types.d.ts +6 -0
- package/dist/shared/security/index.d.ts +2 -2
- package/dist/shared/security/index.js +1 -1
- package/dist/shared/security/osv-client.d.ts +79 -132
- package/dist/shared/security/osv-client.js +344 -167
- package/dist/shared/security/osv-lookup.d.ts +124 -0
- package/dist/shared/security/osv-lookup.js +246 -0
- package/dist/shared/security/osv-types.d.ts +119 -0
- package/dist/shared/security/osv-types.js +6 -0
- package/dist/workers/daemon.d.ts +5 -0
- package/dist/workers/daemon.js +16 -2
- package/dist/workers/interfaces.d.ts +6 -1
- package/dist/workers/namespaced-keys.d.ts +16 -0
- package/dist/workers/namespaced-keys.js +24 -0
- package/dist/workers/quality-daemon/persistent-memory.d.ts +1 -1
- package/dist/workers/quality-daemon/persistent-memory.js +2 -2
- package/dist/workers/worker-env.d.ts +45 -0
- package/dist/workers/worker-env.js +76 -0
- package/dist/workers/worker-manager.js +5 -2
- package/dist/workers/workers/defect-predictor.d.ts +25 -8
- package/dist/workers/workers/defect-predictor.js +223 -216
- package/dist/workers/workers/learning-consolidation.d.ts +20 -0
- package/dist/workers/workers/learning-consolidation.js +53 -22
- package/dist/workers/workers/performance-baseline.d.ts +24 -9
- package/dist/workers/workers/performance-baseline.js +187 -230
- package/dist/workers/workers/quality-gate.d.ts +11 -9
- package/dist/workers/workers/quality-gate.js +125 -267
- package/dist/workers/workers/security-scan-records.d.ts +111 -0
- package/dist/workers/workers/security-scan-records.js +128 -0
- package/dist/workers/workers/security-scan.d.ts +25 -7
- package/dist/workers/workers/security-scan.js +187 -164
- package/package.json +2 -2
- package/dist/cli/chunks/adapter-PP3XIXDV.js +0 -2
- package/dist/cli/chunks/aqe-learning-engine-VDUQJKKY.js +0 -2
- package/dist/cli/chunks/base-QSYWWPCE.js +0 -2
- package/dist/cli/chunks/browser-workflow-WXXPBSCM.js +0 -2
- package/dist/cli/chunks/chunk-45MVRQG4.js +0 -2
- package/dist/cli/chunks/chunk-5VZVMO7B.js +0 -3
- package/dist/cli/chunks/chunk-EECF4CMA.js +0 -2
- package/dist/cli/chunks/client-6XKSQ4JT.js +0 -2
- package/dist/cli/chunks/core-handlers-OJYW4Y6M.js +0 -2
- package/dist/cli/chunks/cross-domain-router-QVUPQ2SC.js +0 -2
- package/dist/cli/chunks/daemon-QBYTCIMH.js +0 -10
- package/dist/cli/chunks/dream-3UABDRZJ.js +0 -2
- package/dist/cli/chunks/file-discovery-ZFGZTKZ4.js +0 -2
- package/dist/cli/chunks/heartbeat-scheduler-MJ6MTPDF.js +0 -2
- package/dist/cli/chunks/hnsw-adapter-FQWJCFVW.js +0 -2
- package/dist/cli/chunks/hnsw-index-NJYKJUHC.js +0 -2
- package/dist/cli/chunks/hybrid-backend-SL7RFID7.js +0 -2
- package/dist/cli/chunks/impact-analyzer-5ZJTXPVC.js +0 -2
- package/dist/cli/chunks/init-handler-PCLYQUSB.js +0 -88
- package/dist/cli/chunks/init-wizard-MQMDSIOF.js +0 -2
- package/dist/cli/chunks/kernel-MEJ5GMRH.js +0 -2
- package/dist/cli/chunks/knowledge-graph-XUBZSEZE.js +0 -2
- package/dist/cli/chunks/llm-router-service-QZAPAEPX.js +0 -2
- package/dist/cli/chunks/load-test-OVXIQ3AF.js +0 -2
- package/dist/cli/chunks/memory-backend-TRPOMPK4.js +0 -2
- package/dist/cli/chunks/pattern-null-store-JWYBRBZG.js +0 -2
- package/dist/cli/chunks/project-root-VVSTHIP4.js +0 -2
- package/dist/cli/chunks/protocol-executor-PXZCLZD3.js +0 -2
- package/dist/cli/chunks/qe-reasoning-bank-42FRS5V3.js +0 -2
- package/dist/cli/chunks/queen-coordinator-UI3B7DI6.js +0 -2
- package/dist/cli/chunks/router-HYRPWLAY.js +0 -2
- package/dist/cli/chunks/routing-feedback-BPZ5R6F3.js +0 -2
- package/dist/cli/chunks/rvf-dual-writer-DEKDQ6KO.js +0 -2
- package/dist/cli/chunks/rvf-migration-adapter-L53VBS7I.js +0 -2
- package/dist/cli/chunks/rvf-native-adapter-I6RUGD2D.js +0 -2
- package/dist/cli/chunks/safe-db-KS65XDCP.js +0 -2
- package/dist/cli/chunks/schedule-KD2VN6GB.js +0 -2
- package/dist/cli/chunks/scheduler-ZH3RMUHY.js +0 -2
- package/dist/cli/chunks/security-PWQTGDRU.js +0 -13
- package/dist/cli/chunks/sqlite-persistence-6DTVME5D.js +0 -2
- package/dist/cli/chunks/unified-memory-FCX7NLFZ.js +0 -2
- package/dist/cli/chunks/unified-memory-hnsw-VU5QJK37.js +0 -2
- package/dist/cli/chunks/unified-persistence-FM376LGE.js +0 -2
- package/dist/cli/chunks/visual-security-EU7Y3X46.js +0 -2
- package/dist/cli/chunks/witness-chain-CSEBT52D.js +0 -2
- package/dist/cli/chunks/workflow-orchestrator-ALNKOM3N.js +0 -2
|
@@ -8,17 +8,57 @@ import chalk from 'chalk';
|
|
|
8
8
|
import { discoverSecurityFiles } from '../../domains/security-compliance/scan-discovery.js';
|
|
9
9
|
import { FilePath } from '../../shared/value-objects/index.js';
|
|
10
10
|
import { writeOutput, toJSON, toSARIF, securityToMarkdown } from '../utils/ci-output.js';
|
|
11
|
+
import { runDependencyAdvisoryScan } from '../../domains/security-compliance/dependency-advisory-engine.js';
|
|
12
|
+
import { resolve as resolvePath } from 'node:path';
|
|
13
|
+
/** Name of the CLI check for the OSV dependency advisory scan (#1049). */
|
|
14
|
+
export const DEPENDENCY_CHECK = 'Dependency advisories';
|
|
15
|
+
/** #1049: dependency advisories could not be checked; the dependency result is UNMEASURED (same code as coverage/quality). */
|
|
16
|
+
export const EXIT_DEPENDENCIES_UNMEASURED = 3;
|
|
17
|
+
/**
|
|
18
|
+
* `aqe security` exit contract:
|
|
19
|
+
* 0 = every requested check completed, no medium+ findings
|
|
20
|
+
* 1 = high/critical findings, non-compliance, or a non-dependency check incomplete/failed
|
|
21
|
+
* 2 = medium findings only, every requested check complete
|
|
22
|
+
* 3 = dependency advisories could not be checked (failed or partial OSV lookup) and
|
|
23
|
+
* there are no high/critical findings, non-compliance or other incomplete checks:
|
|
24
|
+
* UNMEASURED, never a clean exit (#1049). Medium findings plus an incomplete
|
|
25
|
+
* dependency scan also exit 3: the result is unmeasured, not a medium-only verdict.
|
|
26
|
+
*/
|
|
27
|
+
export function securityExitCode(result) {
|
|
28
|
+
const checks = result.checks ?? [];
|
|
29
|
+
const highOrCritical = result.vulnerabilities.some(v => v.severity === 'high' || v.severity === 'critical');
|
|
30
|
+
const nonCompliant = result.compliance?.compliant === false;
|
|
31
|
+
if (result.status !== 'complete' || nonCompliant) {
|
|
32
|
+
const dependencyUnmeasured = checks.some(check => check.name === DEPENDENCY_CHECK && check.status !== 'complete');
|
|
33
|
+
const otherIncomplete = checks.some(check => check.name !== DEPENDENCY_CHECK && check.status !== 'complete');
|
|
34
|
+
if (dependencyUnmeasured && !otherIncomplete && !nonCompliant && !highOrCritical)
|
|
35
|
+
return EXIT_DEPENDENCIES_UNMEASURED;
|
|
36
|
+
return 1;
|
|
37
|
+
}
|
|
38
|
+
if (highOrCritical)
|
|
39
|
+
return 1;
|
|
40
|
+
if (result.vulnerabilities.some(v => v.severity === 'medium'))
|
|
41
|
+
return 2;
|
|
42
|
+
return 0;
|
|
43
|
+
}
|
|
11
44
|
export function createSecurityCommand(context, cleanupAndExit, ensureInitialized) {
|
|
12
45
|
const securityCmd = new Command('security')
|
|
13
46
|
.description('Security scanning and URL validation')
|
|
14
47
|
.option('--sast', 'Run SAST scan')
|
|
15
48
|
.option('--dast', 'Run DAST scan')
|
|
49
|
+
.option('--dependencies', 'Check package.json dependencies against OSV advisories (sends package names and versions to the OSV API)')
|
|
16
50
|
.option('--compliance <frameworks>', 'Check compliance (gdpr,hipaa,soc2)', '')
|
|
17
51
|
.option('--url-validate <url>', 'Validate a URL for security threats and PII exposure')
|
|
18
52
|
.option('--no-pii', 'Disable PII scanning when using --url-validate')
|
|
19
53
|
.option('-t, --target <path>', 'Target directory to scan', '.')
|
|
20
54
|
.option('-F, --format <format>', 'Output format (text|json|sarif|markdown)', 'text')
|
|
21
55
|
.option('-o, --output <path>', 'Write output to file')
|
|
56
|
+
.addHelpText('after', `
|
|
57
|
+
Exit codes:
|
|
58
|
+
0 every requested check completed; no medium or higher findings
|
|
59
|
+
1 high/critical findings, non-compliance, or a check failed / is incomplete
|
|
60
|
+
2 medium findings only
|
|
61
|
+
${EXIT_DEPENDENCIES_UNMEASURED} UNMEASURED: dependency advisories could not be checked (OSV unreachable, rate limited, or partial)`)
|
|
22
62
|
.action(async (options) => {
|
|
23
63
|
if (!await ensureInitialized())
|
|
24
64
|
return;
|
|
@@ -86,13 +126,13 @@ export function createSecurityCommand(context, cleanupAndExit, ensureInitialized
|
|
|
86
126
|
return; // Don't fall through to SAST/DAST path
|
|
87
127
|
}
|
|
88
128
|
const format = options.format;
|
|
89
|
-
const runSAST = options.sast || (!options.dast && !options.compliance);
|
|
129
|
+
const runSAST = options.sast || (!options.dast && !options.compliance && !options.dependencies);
|
|
90
130
|
const frameworks = options.compliance
|
|
91
131
|
? options.compliance.split(',').map((value) => value.trim()).filter(Boolean)
|
|
92
132
|
: [];
|
|
93
133
|
const scanResult = {
|
|
94
134
|
vulnerabilities: [], target: options.target,
|
|
95
|
-
scanType: [runSAST && 'SAST', options.dast && 'DAST', frameworks.length > 0 && 'Compliance'].filter(Boolean).join('+'),
|
|
135
|
+
scanType: [runSAST && 'SAST', options.dast && 'DAST', options.dependencies && 'Dependencies', frameworks.length > 0 && 'Compliance'].filter(Boolean).join('+'),
|
|
96
136
|
checks: [], status: 'not-run',
|
|
97
137
|
};
|
|
98
138
|
const checks = scanResult.checks;
|
|
@@ -133,6 +173,18 @@ export function createSecurityCommand(context, cleanupAndExit, ensureInitialized
|
|
|
133
173
|
checks.push({ name: 'Source discovery', status: discovery.status, reason: 'Requested source discovery did not complete; inspect discovery issues.' });
|
|
134
174
|
}
|
|
135
175
|
}
|
|
176
|
+
if (options.dependencies) {
|
|
177
|
+
// #1049: a failed or partial OSV lookup is reported, never a clean dependency scan.
|
|
178
|
+
const outcome = await runDependencyAdvisoryScan({ scanPackageJson: (manifest) => securityAPI.runDependencyScan(manifest) }, resolvePath(options.target));
|
|
179
|
+
scanResult.dependencyScan = outcome.report;
|
|
180
|
+
scanResult.vulnerabilities.push(...outcome.vulnerabilities.map(formatVulnerability));
|
|
181
|
+
const status = outcome.report.status;
|
|
182
|
+
checks.push({
|
|
183
|
+
name: DEPENDENCY_CHECK,
|
|
184
|
+
status: status === 'complete' ? 'complete' : status === 'incomplete' ? 'partial' : status === 'failed' ? 'failed' : 'not-run',
|
|
185
|
+
...(status !== 'complete' ? { reason: outcome.report.message } : {}),
|
|
186
|
+
});
|
|
187
|
+
}
|
|
136
188
|
if (frameworks.length > 0) {
|
|
137
189
|
const issues = [];
|
|
138
190
|
let compliant = true;
|
|
@@ -189,13 +241,7 @@ export function createSecurityCommand(context, cleanupAndExit, ensureInitialized
|
|
|
189
241
|
return cleanupAndExit(1);
|
|
190
242
|
}
|
|
191
243
|
// Incomplete execution never has a clean exit, even if it found no vulnerabilities.
|
|
192
|
-
|
|
193
|
-
return cleanupAndExit(1);
|
|
194
|
-
if (scanResult.vulnerabilities.some(v => v.severity === 'high' || v.severity === 'critical'))
|
|
195
|
-
return cleanupAndExit(1);
|
|
196
|
-
if (scanResult.vulnerabilities.some(v => v.severity === 'medium'))
|
|
197
|
-
return cleanupAndExit(2);
|
|
198
|
-
return cleanupAndExit(0);
|
|
244
|
+
return cleanupAndExit(securityExitCode(scanResult));
|
|
199
245
|
});
|
|
200
246
|
return securityCmd;
|
|
201
247
|
}
|
|
@@ -227,6 +273,7 @@ function formatVulnerability(value) {
|
|
|
227
273
|
severity: value.severity, type: value.title || value.category,
|
|
228
274
|
file: value.location.file, line: value.location.line ?? 1,
|
|
229
275
|
message: value.description,
|
|
276
|
+
...(value.cveId ? { cveId: value.cveId } : {}),
|
|
230
277
|
};
|
|
231
278
|
}
|
|
232
279
|
return value;
|
|
@@ -265,6 +312,26 @@ function printSecurityResult(result) {
|
|
|
265
312
|
...(result.evidence?.files.filter(file => file.status !== 'analyzed' && file.status !== 'excluded').map(file => `${file.path}: ${file.status}${file.reason ? ` (${file.reason})` : ''}`) ?? []),
|
|
266
313
|
...(result.discovery?.issues.map(issue => `${issue.path}: ${issue.reason}`) ?? []),
|
|
267
314
|
];
|
|
315
|
+
if (result.dependencyScan && result.dependencyScan.status !== 'complete') {
|
|
316
|
+
const unchecked = result.dependencyScan.uncheckedPackages;
|
|
317
|
+
console.log(chalk.yellow(` ${result.dependencyScan.message}`));
|
|
318
|
+
for (const pkg of unchecked.slice(0, 10)) {
|
|
319
|
+
const where = `${pkg.member ? `${pkg.member}: ` : ''}${pkg.name}@${pkg.version}${pkg.lockedVersion ? ` (lockfile ${pkg.lockedVersion})` : ''}`;
|
|
320
|
+
console.log(chalk.yellow(` not checked: ${where} (${pkg.reason})`));
|
|
321
|
+
}
|
|
322
|
+
if (unchecked.length > 10)
|
|
323
|
+
console.log(chalk.yellow(` ... and ${unchecked.length - 10} more unchecked package(s)`));
|
|
324
|
+
}
|
|
325
|
+
else if (result.dependencyScan) {
|
|
326
|
+
console.log(` ${result.dependencyScan.message}`);
|
|
327
|
+
}
|
|
328
|
+
if (result.dependencyScan?.localPackages.length) {
|
|
329
|
+
const local = result.dependencyScan.localPackages;
|
|
330
|
+
console.log(` Local packages (not OSV subjects, excluded): ${local.slice(0, 10).map(p => `${p.member ? `${p.member}: ` : ''}${p.name}`).join(', ')}${local.length > 10 ? ` ... and ${local.length - 10} more` : ''}`);
|
|
331
|
+
}
|
|
332
|
+
for (const problem of result.dependencyScan?.resolutionErrors ?? []) {
|
|
333
|
+
console.log(chalk.yellow(` incomplete: ${problem}`));
|
|
334
|
+
}
|
|
268
335
|
for (const limitation of limitations.slice(0, 10))
|
|
269
336
|
console.log(chalk.yellow(` ${limitation}`));
|
|
270
337
|
if (limitations.length > 10)
|
|
@@ -8,6 +8,26 @@
|
|
|
8
8
|
*
|
|
9
9
|
* @module cli/handlers/init-guard
|
|
10
10
|
*/
|
|
11
|
-
/**
|
|
11
|
+
/** The explicit root is also the destination for all init-generated files. */
|
|
12
|
+
export declare function initProjectRoot(cwd?: string, env?: NodeJS.ProcessEnv): string;
|
|
13
|
+
/**
|
|
14
|
+
* Error message when `projectRoot` must not be initialized, otherwise null.
|
|
15
|
+
*
|
|
16
|
+
* An explicit root (`AQE_PROJECT_ROOT`) is refused only when it is a hard-stop
|
|
17
|
+
* directory (OS temp dir, `/`, `/home`, ...), or a sticky world-writable
|
|
18
|
+
* directory WITHOUT `.git`. This mirrors `findProjectRoot`, which keeps a
|
|
19
|
+
* sticky (mode 1777) directory that is itself a repo root as its own root, so
|
|
20
|
+
* the explicit root stays the escape hatch for such a repository. A derived
|
|
21
|
+
* root (the cwd) keeps the stricter rule: any shared directory is refused.
|
|
22
|
+
*/
|
|
23
|
+
export declare function sharedRootInitError(projectRoot: string, explicit: boolean): string | null;
|
|
24
|
+
/** Error message when the selected root must not be initialized, otherwise null. */
|
|
12
25
|
export declare function sharedDirInitError(cwd: string, env?: NodeJS.ProcessEnv): string | null;
|
|
26
|
+
/**
|
|
27
|
+
* Error message when an explicit `AQE_PROJECT_ROOT` is not an existing
|
|
28
|
+
* directory, otherwise null. A typo must not silently create and initialize a
|
|
29
|
+
* new project somewhere else. Must run before anything creates the root (the
|
|
30
|
+
* CLI's token bootstrap does `mkdir -p <root>/.agentic-qe` at startup).
|
|
31
|
+
*/
|
|
32
|
+
export declare function explicitRootError(cwd?: string, env?: NodeJS.ProcessEnv): string | null;
|
|
13
33
|
//# sourceMappingURL=init-guard.d.ts.map
|
|
@@ -8,16 +8,59 @@
|
|
|
8
8
|
*
|
|
9
9
|
* @module cli/handlers/init-guard
|
|
10
10
|
*/
|
|
11
|
-
import { isSharedSystemDir } from '../../kernel/shared-dirs.js';
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
11
|
+
import { isHardStopDir, isSharedSystemDir, isStickyWorldWritable } from '../../kernel/shared-dirs.js';
|
|
12
|
+
import { existsSync, statSync } from 'node:fs';
|
|
13
|
+
import { join, resolve } from 'node:path';
|
|
14
|
+
/** The explicit root is also the destination for all init-generated files. */
|
|
15
|
+
export function initProjectRoot(cwd = process.cwd(), env = process.env) {
|
|
16
|
+
return resolve(cwd, env.AQE_PROJECT_ROOT || '.');
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Error message when `projectRoot` must not be initialized, otherwise null.
|
|
20
|
+
*
|
|
21
|
+
* An explicit root (`AQE_PROJECT_ROOT`) is refused only when it is a hard-stop
|
|
22
|
+
* directory (OS temp dir, `/`, `/home`, ...), or a sticky world-writable
|
|
23
|
+
* directory WITHOUT `.git`. This mirrors `findProjectRoot`, which keeps a
|
|
24
|
+
* sticky (mode 1777) directory that is itself a repo root as its own root, so
|
|
25
|
+
* the explicit root stays the escape hatch for such a repository. A derived
|
|
26
|
+
* root (the cwd) keeps the stricter rule: any shared directory is refused.
|
|
27
|
+
*/
|
|
28
|
+
export function sharedRootInitError(projectRoot, explicit) {
|
|
29
|
+
const shared = explicit
|
|
30
|
+
? isHardStopDir(projectRoot)
|
|
31
|
+
|| (isStickyWorldWritable(projectRoot) && !existsSync(join(projectRoot, '.git')))
|
|
32
|
+
: isSharedSystemDir(projectRoot);
|
|
33
|
+
if (!shared)
|
|
17
34
|
return null;
|
|
18
|
-
return (`Refusing to initialize in "${
|
|
35
|
+
return (`Refusing to initialize in "${projectRoot}": it is a shared temp/system directory, ` +
|
|
19
36
|
'so a store here would be shared by every unrelated project below it and ' +
|
|
20
37
|
'later commands would not use it. Create a project directory first ' +
|
|
21
|
-
'(mkdir my-project && cd my-project) or set AQE_PROJECT_ROOT to
|
|
38
|
+
'(mkdir my-project && cd my-project) or set AQE_PROJECT_ROOT to a project directory.');
|
|
39
|
+
}
|
|
40
|
+
/** Error message when the selected root must not be initialized, otherwise null. */
|
|
41
|
+
export function sharedDirInitError(cwd, env = process.env) {
|
|
42
|
+
return sharedRootInitError(initProjectRoot(cwd, env), Boolean(env.AQE_PROJECT_ROOT));
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Error message when an explicit `AQE_PROJECT_ROOT` is not an existing
|
|
46
|
+
* directory, otherwise null. A typo must not silently create and initialize a
|
|
47
|
+
* new project somewhere else. Must run before anything creates the root (the
|
|
48
|
+
* CLI's token bootstrap does `mkdir -p <root>/.agentic-qe` at startup).
|
|
49
|
+
*/
|
|
50
|
+
export function explicitRootError(cwd = process.cwd(), env = process.env) {
|
|
51
|
+
if (!env.AQE_PROJECT_ROOT)
|
|
52
|
+
return null;
|
|
53
|
+
const root = initProjectRoot(cwd, env);
|
|
54
|
+
let isDir = false;
|
|
55
|
+
try {
|
|
56
|
+
isDir = statSync(root).isDirectory();
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
isDir = false;
|
|
60
|
+
}
|
|
61
|
+
if (isDir)
|
|
62
|
+
return null;
|
|
63
|
+
return (`AQE_PROJECT_ROOT "${root}" is not an existing directory. ` +
|
|
64
|
+
'Create it first (mkdir -p) or correct the path; aqe init does not create the project root.');
|
|
22
65
|
}
|
|
23
66
|
//# sourceMappingURL=init-guard.js.map
|
|
@@ -9,7 +9,7 @@ import { createRequire } from 'node:module';
|
|
|
9
9
|
import { ALL_DOMAINS } from '../../shared/types/index.js';
|
|
10
10
|
import { toErrorMessage } from '../../shared/error-utils.js';
|
|
11
11
|
import { resolveInitFlags } from './init-flags.js';
|
|
12
|
-
import {
|
|
12
|
+
import { initProjectRoot, sharedRootInitError } from './init-guard.js';
|
|
13
13
|
// ============================================================================
|
|
14
14
|
// Init Handler
|
|
15
15
|
// ============================================================================
|
|
@@ -89,9 +89,10 @@ export class InitHandler {
|
|
|
89
89
|
});
|
|
90
90
|
}
|
|
91
91
|
try {
|
|
92
|
+
const projectRoot = initProjectRoot();
|
|
92
93
|
// #1006 (review of #1026 N3): never initialize a store in a shared
|
|
93
94
|
// temp/system dir; later commands would resolve elsewhere and ignore it.
|
|
94
|
-
const sharedDirError =
|
|
95
|
+
const sharedDirError = sharedRootInitError(projectRoot, Boolean(process.env.AQE_PROJECT_ROOT));
|
|
95
96
|
if (sharedDirError) {
|
|
96
97
|
console.error(chalk.red(`\n ${sharedDirError}\n`));
|
|
97
98
|
await this.cleanupAndExit(1);
|
|
@@ -117,11 +118,11 @@ export class InitHandler {
|
|
|
117
118
|
console.log(chalk.blue('\n Agentic QE v3 Initialization\n'));
|
|
118
119
|
// Use modular orchestrator for --auto or --modular
|
|
119
120
|
if (options.auto || options.modular || options.browserEngine) {
|
|
120
|
-
await this.runModularInit(options, context);
|
|
121
|
+
await this.runModularInit(options, context, projectRoot);
|
|
121
122
|
return;
|
|
122
123
|
}
|
|
123
124
|
// Legacy wizard mode using InitOrchestrator
|
|
124
|
-
await this.runLegacyWizard(options, context);
|
|
125
|
+
await this.runLegacyWizard(options, context, projectRoot);
|
|
125
126
|
return;
|
|
126
127
|
}
|
|
127
128
|
// Platform provisioning (--with-opencode, --with-n8n, --with-<editor>, ...)
|
|
@@ -144,7 +145,7 @@ export class InitHandler {
|
|
|
144
145
|
const noStatusLineRequested = flags.noStatusLine;
|
|
145
146
|
if (options.browserEngine || options.modular || platformRequested || databaseFree || noClaudeRequested || noStatusLineRequested) {
|
|
146
147
|
console.log(chalk.blue('\n Agentic QE v3 Initialization\n'));
|
|
147
|
-
await this.runModularInit(options, context);
|
|
148
|
+
await this.runModularInit(options, context, projectRoot);
|
|
148
149
|
return;
|
|
149
150
|
}
|
|
150
151
|
// Standard init without wizard
|
|
@@ -155,7 +156,7 @@ export class InitHandler {
|
|
|
155
156
|
await this.cleanupAndExit(1);
|
|
156
157
|
}
|
|
157
158
|
}
|
|
158
|
-
async runModularInit(options, _context) {
|
|
159
|
+
async runModularInit(options, _context, projectRoot) {
|
|
159
160
|
const isJsonMode = options.json === true;
|
|
160
161
|
// #931/#935: commander maps --no-<name> to options.<name> === false.
|
|
161
162
|
const flags = resolveInitFlags(options);
|
|
@@ -185,7 +186,7 @@ export class InitHandler {
|
|
|
185
186
|
}
|
|
186
187
|
const { createModularInitOrchestrator } = await import('../../init/orchestrator.js');
|
|
187
188
|
const orchestrator = createModularInitOrchestrator({
|
|
188
|
-
projectRoot
|
|
189
|
+
projectRoot,
|
|
189
190
|
autoMode: options.auto,
|
|
190
191
|
upgrade: options.upgrade,
|
|
191
192
|
minimal: options.minimal,
|
|
@@ -256,7 +257,7 @@ export class InitHandler {
|
|
|
256
257
|
try {
|
|
257
258
|
const { setupClaudeFlowIntegration } = await import('../commands/claude-flow-setup.js');
|
|
258
259
|
cfResult = await setupClaudeFlowIntegration({
|
|
259
|
-
projectRoot
|
|
260
|
+
projectRoot,
|
|
260
261
|
force: options.withClaudeFlow,
|
|
261
262
|
});
|
|
262
263
|
if (cfResult.available) {
|
|
@@ -313,11 +314,11 @@ export class InitHandler {
|
|
|
313
314
|
}
|
|
314
315
|
await this.cleanupAndExit(0);
|
|
315
316
|
}
|
|
316
|
-
async runLegacyWizard(options, _context) {
|
|
317
|
+
async runLegacyWizard(options, _context, projectRoot) {
|
|
317
318
|
const flags = resolveInitFlags(options);
|
|
318
319
|
const { InitOrchestrator } = await import('../../init/init-wizard.js');
|
|
319
320
|
const orchestratorOptions = {
|
|
320
|
-
projectRoot
|
|
321
|
+
projectRoot,
|
|
321
322
|
autoMode: options.auto,
|
|
322
323
|
minimal: options.minimal,
|
|
323
324
|
browserEngine: options.browserEngine,
|
|
@@ -455,62 +456,62 @@ export class InitHandler {
|
|
|
455
456
|
}
|
|
456
457
|
}
|
|
457
458
|
getHelp() {
|
|
458
|
-
return `
|
|
459
|
-
Initialize the AQE v3 system with various configuration options.
|
|
460
|
-
|
|
461
|
-
Usage:
|
|
462
|
-
aqe init [options]
|
|
463
|
-
|
|
464
|
-
Options:
|
|
465
|
-
-d, --domains <domains> Comma-separated list of domains to enable (default: all)
|
|
466
|
-
-m, --max-agents <number> Maximum concurrent agents (default: 15)
|
|
467
|
-
--memory <backend> Memory backend: sqlite, agentdb, or hybrid (default: hybrid)
|
|
468
|
-
--lazy Enable lazy loading of domains
|
|
469
|
-
--wizard Run interactive setup wizard
|
|
470
|
-
--auto Auto-configure based on project analysis
|
|
471
|
-
-u, --upgrade Upgrade existing installation (overwrite skills, agents, validation)
|
|
472
|
-
--minimal Minimal configuration (skip optional features)
|
|
473
|
-
--skip-patterns Skip loading pre-trained patterns
|
|
459
|
+
return `
|
|
460
|
+
Initialize the AQE v3 system with various configuration options.
|
|
461
|
+
|
|
462
|
+
Usage:
|
|
463
|
+
aqe init [options]
|
|
464
|
+
|
|
465
|
+
Options:
|
|
466
|
+
-d, --domains <domains> Comma-separated list of domains to enable (default: all)
|
|
467
|
+
-m, --max-agents <number> Maximum concurrent agents (default: 15)
|
|
468
|
+
--memory <backend> Memory backend: sqlite, agentdb, or hybrid (default: hybrid)
|
|
469
|
+
--lazy Enable lazy loading of domains
|
|
470
|
+
--wizard Run interactive setup wizard
|
|
471
|
+
--auto Auto-configure based on project analysis
|
|
472
|
+
-u, --upgrade Upgrade existing installation (overwrite skills, agents, validation)
|
|
473
|
+
--minimal Minimal configuration (skip optional features)
|
|
474
|
+
--skip-patterns Skip loading pre-trained patterns
|
|
474
475
|
--browser-engine Install optional Vibium and browser payload
|
|
475
476
|
--no-browser-engine Skip browser setup (default)
|
|
476
|
-
--with-n8n Install n8n workflow testing agents and skills
|
|
477
|
+
--with-n8n Install n8n workflow testing agents and skills
|
|
477
478
|
--with-opencode Include OpenCode agent/skill provisioning
|
|
478
479
|
--with-codex Include OpenAI Codex hooks, instructions, skills, and MCP
|
|
479
480
|
--codex-guidance <mode> Codex AGENTS.md guidance: full, compact, or none
|
|
480
481
|
--with-ruflo Opt into Ruflo guidance and lifecycle hooks for Codex
|
|
481
|
-
--auto-migrate Automatically migrate from v2 if detected
|
|
482
|
-
--with-claude-flow Force Claude Flow integration setup
|
|
483
|
-
--skip-claude-flow Skip Claude Flow integration
|
|
484
|
-
--no-mcp Skip MCP server config (MCP is enabled by default)
|
|
485
|
-
--with-mcp Add the .mcp.json entry even if the agentic-qe-fleet plugin is enabled
|
|
486
|
-
(--no-mcp and --with-mcp cannot be combined)
|
|
487
|
-
--no-governance Skip governance configuration (ADR-058)
|
|
488
|
-
--modular Use new modular init system
|
|
489
|
-
|
|
490
|
-
MCP Server:
|
|
491
|
-
MCP server configuration is ENABLED BY DEFAULT. It writes .mcp.json
|
|
492
|
-
at the project root so Claude Code auto-discovers the AQE MCP server.
|
|
493
|
-
Use --no-mcp to skip if you only want CLI commands.
|
|
494
|
-
If the agentic-qe-fleet Claude Code plugin is enabled (user, project or
|
|
495
|
-
local settings), init skips the entry because the plugin already provides
|
|
496
|
-
the AQE MCP server. Use --with-mcp to add the project entry anyway.
|
|
497
|
-
|
|
498
|
-
Governance:
|
|
499
|
-
Governance is ENABLED BY DEFAULT. It installs .claude/guidance/ with:
|
|
500
|
-
- constitution.md: 7 unbreakable QE invariants
|
|
501
|
-
- shards/*.shard.md: 12 domain-specific governance rules
|
|
502
|
-
|
|
503
|
-
Use --no-governance to skip, or set GOVERNANCE_*=false env vars for
|
|
504
|
-
fine-grained control over individual gates (ContinueGate, MemoryWriteGate, etc.)
|
|
505
|
-
|
|
482
|
+
--auto-migrate Automatically migrate from v2 if detected
|
|
483
|
+
--with-claude-flow Force Claude Flow integration setup
|
|
484
|
+
--skip-claude-flow Skip Claude Flow integration
|
|
485
|
+
--no-mcp Skip MCP server config (MCP is enabled by default)
|
|
486
|
+
--with-mcp Add the .mcp.json entry even if the agentic-qe-fleet plugin is enabled
|
|
487
|
+
(--no-mcp and --with-mcp cannot be combined)
|
|
488
|
+
--no-governance Skip governance configuration (ADR-058)
|
|
489
|
+
--modular Use new modular init system
|
|
490
|
+
|
|
491
|
+
MCP Server:
|
|
492
|
+
MCP server configuration is ENABLED BY DEFAULT. It writes .mcp.json
|
|
493
|
+
at the project root so Claude Code auto-discovers the AQE MCP server.
|
|
494
|
+
Use --no-mcp to skip if you only want CLI commands.
|
|
495
|
+
If the agentic-qe-fleet Claude Code plugin is enabled (user, project or
|
|
496
|
+
local settings), init skips the entry because the plugin already provides
|
|
497
|
+
the AQE MCP server. Use --with-mcp to add the project entry anyway.
|
|
498
|
+
|
|
499
|
+
Governance:
|
|
500
|
+
Governance is ENABLED BY DEFAULT. It installs .claude/guidance/ with:
|
|
501
|
+
- constitution.md: 7 unbreakable QE invariants
|
|
502
|
+
- shards/*.shard.md: 12 domain-specific governance rules
|
|
503
|
+
|
|
504
|
+
Use --no-governance to skip, or set GOVERNANCE_*=false env vars for
|
|
505
|
+
fine-grained control over individual gates (ContinueGate, MemoryWriteGate, etc.)
|
|
506
|
+
|
|
506
507
|
Examples:
|
|
507
508
|
aqe init --auto # Auto-configure based on project (keeps existing skills)
|
|
508
509
|
aqe init --auto --with-codex --with-ruflo
|
|
509
510
|
# Codex plus optional Ruflo coordination
|
|
510
|
-
aqe init --auto --upgrade # Auto-configure AND update all skills/agents
|
|
511
|
-
aqe init --upgrade # Upgrade existing installation
|
|
512
|
-
aqe init --wizard # Run interactive wizard
|
|
513
|
-
aqe init --domains test-generation,coverage-analysis
|
|
511
|
+
aqe init --auto --upgrade # Auto-configure AND update all skills/agents
|
|
512
|
+
aqe init --upgrade # Upgrade existing installation
|
|
513
|
+
aqe init --wizard # Run interactive wizard
|
|
514
|
+
aqe init --domains test-generation,coverage-analysis
|
|
514
515
|
`;
|
|
515
516
|
}
|
|
516
517
|
}
|
package/dist/cli/index.js
CHANGED
|
@@ -417,6 +417,17 @@ async function main() {
|
|
|
417
417
|
const commandArgs = process.argv.slice(2).filter(arg => arg !== '--');
|
|
418
418
|
const learningSnapshot = commandArgs[0] === 'learning'
|
|
419
419
|
&& (commandArgs[1] === 'backup' || commandArgs[1] === 'restore');
|
|
420
|
+
// `aqe init` must not create a mistyped AQE_PROJECT_ROOT: the token bootstrap
|
|
421
|
+
// below does `mkdir -p <root>/.agentic-qe`, so the check has to run first.
|
|
422
|
+
if (commandArgs[0] === 'init') {
|
|
423
|
+
const { explicitRootError } = await import('./handlers/init-guard.js');
|
|
424
|
+
const rootError = explicitRootError();
|
|
425
|
+
if (rootError) {
|
|
426
|
+
console.error(chalk.red(`\n ${rootError}\n`));
|
|
427
|
+
await cleanupAndExit(1);
|
|
428
|
+
return;
|
|
429
|
+
}
|
|
430
|
+
}
|
|
420
431
|
if (!learningSnapshot) {
|
|
421
432
|
const { bootstrapTokenTracking } = await import('../init/token-bootstrap.js');
|
|
422
433
|
await bootstrapTokenTracking({
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
import type { SecurityCoverage } from '../../domains/security-compliance/interfaces.js';
|
|
8
8
|
import type { SecurityScanEvidence } from '../../domains/security-compliance/scan-evidence.js';
|
|
9
9
|
import type { discoverSecurityFiles } from '../../domains/security-compliance/scan-discovery.js';
|
|
10
|
+
import type { DependencyScanReport } from '../../domains/security-compliance/dependency-advisory-engine.js';
|
|
10
11
|
export type OutputFormat = 'text' | 'json' | 'sarif' | 'junit' | 'markdown';
|
|
11
12
|
export interface CIOutputOptions {
|
|
12
13
|
format: OutputFormat;
|
|
@@ -20,6 +21,8 @@ export interface SecurityVulnerability {
|
|
|
20
21
|
message: string;
|
|
21
22
|
ruleId?: string;
|
|
22
23
|
cweId?: string;
|
|
24
|
+
/** CVE id of a dependency advisory, when the advisory has one (#1049). */
|
|
25
|
+
cveId?: string;
|
|
23
26
|
}
|
|
24
27
|
export interface SecurityScanResult {
|
|
25
28
|
vulnerabilities: SecurityVulnerability[];
|
|
@@ -38,6 +41,8 @@ export interface SecurityScanResult {
|
|
|
38
41
|
coverage?: SecurityCoverage;
|
|
39
42
|
evidence?: SecurityScanEvidence;
|
|
40
43
|
discovery?: Awaited<ReturnType<typeof discoverSecurityFiles>>['discovery'];
|
|
44
|
+
/** #1049: OSV dependency advisory scan; any status but 'complete' is not a clean result. */
|
|
45
|
+
dependencyScan?: DependencyScanReport;
|
|
41
46
|
}
|
|
42
47
|
export type SecurityExecutionStatus = 'complete' | 'partial' | 'none' | 'failed' | 'not-run' | 'unverified';
|
|
43
48
|
export interface SecurityCheckResult {
|
|
@@ -297,6 +297,14 @@ export function securityToMarkdown(result) {
|
|
|
297
297
|
if (result.evidence || result.discovery) {
|
|
298
298
|
md += `## Execution receipts\n\n\`\`\`json\n${toJSON({ evidence: result.evidence, discovery: result.discovery })}\n\`\`\`\n\n`;
|
|
299
299
|
}
|
|
300
|
+
if (result.dependencyScan) {
|
|
301
|
+
md += `## Dependency advisories (OSV)\n\n**Status:** ${result.dependencyScan.status}\n\n${result.dependencyScan.message}\n\n`;
|
|
302
|
+
for (const pkg of result.dependencyScan.uncheckedPackages) {
|
|
303
|
+
md += `- not checked: ${pkg.name}@${pkg.version} (${pkg.reason})\n`;
|
|
304
|
+
}
|
|
305
|
+
if (result.dependencyScan.uncheckedPackages.length > 0)
|
|
306
|
+
md += '\n';
|
|
307
|
+
}
|
|
300
308
|
if (result.vulnerabilities.length > 0) {
|
|
301
309
|
md += `## Vulnerabilities\n\n`;
|
|
302
310
|
md += `| Severity | Type | File | Line | Message |\n`;
|
|
@@ -12,6 +12,7 @@ import { toError } from '../../shared/error-utils.js';
|
|
|
12
12
|
import { FilePath } from '../../shared/value-objects/index.js';
|
|
13
13
|
import { generateSecurityRecommendations } from './handler-utils.js';
|
|
14
14
|
import { discoverSecurityFiles, isSecuritySourceFile } from '../../domains/security-compliance/scan-discovery.js';
|
|
15
|
+
import { runDependencyAdvisoryScan } from '../../domains/security-compliance/dependency-advisory-engine.js';
|
|
15
16
|
export function registerSecurityHandlers(ctx) {
|
|
16
17
|
// Register security scan handler - REAL IMPLEMENTATION
|
|
17
18
|
ctx.registerHandler('scan-security', async (task) => {
|
|
@@ -257,6 +258,13 @@ export function registerSecurityHandlers(ctx) {
|
|
|
257
258
|
status: payload.dast ? 'not-run' : 'disabled', scope: 'url', ruleCoverage: 'unknown',
|
|
258
259
|
errors: payload.dast ? ['DAST was requested without targetUrl.'] : [], limitations: [] });
|
|
259
260
|
}
|
|
261
|
+
// #1049: OSV dependency advisories. A failed or partial lookup is a
|
|
262
|
+
// failed/partial required engine, never a completed scan with no findings.
|
|
263
|
+
let dependencyScan = null;
|
|
264
|
+
if (payload.dependencies === true) {
|
|
265
|
+
dependencyScan = await runDependencyAdvisoryScan(ctx.getSecurityScanner(), targetPath);
|
|
266
|
+
engines.push(dependencyScan.engine);
|
|
267
|
+
}
|
|
260
268
|
if (payload.compliance?.length) {
|
|
261
269
|
engines.push({ id: 'compliance', requested: true, required: true, status: 'not-run',
|
|
262
270
|
scope: 'requested-files', ruleCoverage: 'unknown', errors: [],
|
|
@@ -265,7 +273,7 @@ export function registerSecurityHandlers(ctx) {
|
|
|
265
273
|
const requestedPaths = new Set(filesToScan);
|
|
266
274
|
const analyzedPaths = new Set(fileEvidence.filter(file => file.status === 'analyzed' && requestedPaths.has(file.path)).map(file => file.path));
|
|
267
275
|
const requiredEngines = engines.filter(engine => engine.requested && engine.required);
|
|
268
|
-
const hasExecuted = analyzedPaths.size > 0;
|
|
276
|
+
const hasExecuted = analyzedPaths.size > 0 || (dependencyScan?.report.packagesChecked ?? 0) > 0;
|
|
269
277
|
const complete = hasExecuted && requiredEngines.every(engine => engine.status === 'completed') &&
|
|
270
278
|
(!discoveryResult || discoveryResult.discovery.status === 'complete');
|
|
271
279
|
const evidence = {
|
|
@@ -286,18 +294,21 @@ export function registerSecurityHandlers(ctx) {
|
|
|
286
294
|
low: crossLangVulns.filter(v => v.severity === 'low').length,
|
|
287
295
|
informational: crossLangVulns.filter(v => v.severity === 'informational').length,
|
|
288
296
|
};
|
|
297
|
+
const depVulns = dependencyScan?.vulnerabilities ?? [];
|
|
298
|
+
const depCount = (severity) => depVulns.filter(v => v.severity === severity).length;
|
|
289
299
|
const summary = {
|
|
290
|
-
critical: (sastResult?.summary?.critical || 0) + (dastResult?.summary?.critical || 0) + crossLangSeverityCounts.critical,
|
|
291
|
-
high: (sastResult?.summary?.high || 0) + (dastResult?.summary?.high || 0) + crossLangSeverityCounts.high,
|
|
292
|
-
medium: (sastResult?.summary?.medium || 0) + (dastResult?.summary?.medium || 0) + crossLangSeverityCounts.medium,
|
|
293
|
-
low: (sastResult?.summary?.low || 0) + (dastResult?.summary?.low || 0) + crossLangSeverityCounts.low,
|
|
294
|
-
informational: (sastResult?.summary?.informational || 0) + (dastResult?.summary?.informational || 0) + crossLangSeverityCounts.informational,
|
|
300
|
+
critical: (sastResult?.summary?.critical || 0) + (dastResult?.summary?.critical || 0) + crossLangSeverityCounts.critical + depCount('critical'),
|
|
301
|
+
high: (sastResult?.summary?.high || 0) + (dastResult?.summary?.high || 0) + crossLangSeverityCounts.high + depCount('high'),
|
|
302
|
+
medium: (sastResult?.summary?.medium || 0) + (dastResult?.summary?.medium || 0) + crossLangSeverityCounts.medium + depCount('medium'),
|
|
303
|
+
low: (sastResult?.summary?.low || 0) + (dastResult?.summary?.low || 0) + crossLangSeverityCounts.low + depCount('low'),
|
|
304
|
+
informational: (sastResult?.summary?.informational || 0) + (dastResult?.summary?.informational || 0) + crossLangSeverityCounts.informational + depCount('informational'),
|
|
295
305
|
};
|
|
296
306
|
// Extract top vulnerabilities from all sources
|
|
297
307
|
const allVulns = [
|
|
298
308
|
...(sastResult?.vulnerabilities || []),
|
|
299
309
|
...(dastResult?.vulnerabilities || []),
|
|
300
310
|
...crossLangVulns,
|
|
311
|
+
...depVulns,
|
|
301
312
|
];
|
|
302
313
|
const topVulnerabilities = allVulns
|
|
303
314
|
.sort((a, b) => {
|
|
@@ -316,6 +327,9 @@ export function registerSecurityHandlers(ctx) {
|
|
|
316
327
|
const recommendations = allVulns.length === 0 && evidence.completeness !== 'complete'
|
|
317
328
|
? ['No findings reported; requested analysis is incomplete or unverified. Inspect execution receipts.']
|
|
318
329
|
: generateSecurityRecommendations(allVulns);
|
|
330
|
+
if (dependencyScan && dependencyScan.report.status !== 'complete') {
|
|
331
|
+
recommendations.unshift(dependencyScan.report.message);
|
|
332
|
+
}
|
|
319
333
|
return ok({
|
|
320
334
|
vulnerabilities: allVulns.length,
|
|
321
335
|
critical: summary.critical,
|
|
@@ -329,7 +343,9 @@ export function registerSecurityHandlers(ctx) {
|
|
|
329
343
|
scanTypes: {
|
|
330
344
|
sast: payload.sast !== false,
|
|
331
345
|
dast: payload.dast || false,
|
|
346
|
+
dependencies: payload.dependencies === true,
|
|
332
347
|
},
|
|
348
|
+
...(dependencyScan ? { dependencyScan: dependencyScan.report } : {}),
|
|
333
349
|
status: evidence.completeness === 'complete' ? 'completed' : evidence.completeness === 'partial' ? 'partial' : 'unavailable',
|
|
334
350
|
evidence,
|
|
335
351
|
limitations: evidence.limitations,
|
|
@@ -13,6 +13,7 @@ import { toError } from '../../shared/error-utils.js';
|
|
|
13
13
|
import { LoggerFactory } from '../../logging/index.js';
|
|
14
14
|
import { addToCount } from '../../shared/utils/safe-record.js';
|
|
15
15
|
import { measuredFileCoverage } from '../../domains/quality-assessment/coverage-report-event.js';
|
|
16
|
+
import { fileCoverageLookupKeys } from '../../domains/coverage-analysis/collected-metrics.js';
|
|
16
17
|
const logger = LoggerFactory.create('defect-investigation');
|
|
17
18
|
export const DefectInvestigationEvents = {
|
|
18
19
|
DefectInvestigationStarted: 'coordination.DefectInvestigationStarted',
|
|
@@ -607,7 +608,12 @@ export class DefectInvestigationProtocol {
|
|
|
607
608
|
try {
|
|
608
609
|
// Try per-file coverage (written by coverage-analyzer and test-executor)
|
|
609
610
|
// #1014: only measured records; legacy unstamped estimates are ignored.
|
|
610
|
-
|
|
611
|
+
let coverage = null;
|
|
612
|
+
for (const key of fileCoverageLookupKeys(file)) {
|
|
613
|
+
coverage = measuredFileCoverage(await this.memory.get(key));
|
|
614
|
+
if (coverage)
|
|
615
|
+
break;
|
|
616
|
+
}
|
|
611
617
|
if (!coverage) {
|
|
612
618
|
return null;
|
|
613
619
|
}
|
|
@@ -9,6 +9,7 @@ import { v4 as uuidv4 } from 'uuid';
|
|
|
9
9
|
import { ok, err, ALL_DOMAINS, } from '../../shared/types/index.js';
|
|
10
10
|
import { TimeRange } from '../../shared/value-objects/index.js';
|
|
11
11
|
import { toError } from '../../shared/error-utils.js';
|
|
12
|
+
import { readActivePatterns } from '../../domains/learning-optimization/active-patterns.js';
|
|
12
13
|
const DEFAULT_CONFIG = {
|
|
13
14
|
minPatternsForConsolidation: 5,
|
|
14
15
|
similarityThreshold: 0.85,
|
|
@@ -139,18 +140,11 @@ export class LearningConsolidationProtocol {
|
|
|
139
140
|
* Get patterns for a specific domain
|
|
140
141
|
*/
|
|
141
142
|
async getPatternsForDomain(domain, timeRange) {
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
pattern.domain === domain &&
|
|
148
|
-
!key.includes(':archived:') &&
|
|
149
|
-
(timeRange.contains(pattern.createdAt) || timeRange.contains(pattern.lastUsedAt))) {
|
|
150
|
-
patterns.push(pattern);
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
return patterns;
|
|
143
|
+
// #1055: active patterns only — excludes `:creation:` provenance as well
|
|
144
|
+
// as `:archived:` records, before get() and before the scan cap applies.
|
|
145
|
+
const patterns = await readActivePatterns(this.memory);
|
|
146
|
+
return patterns.filter((pattern) => pattern.domain === domain &&
|
|
147
|
+
(timeRange.contains(pattern.createdAt) || timeRange.contains(pattern.lastUsedAt)));
|
|
154
148
|
}
|
|
155
149
|
/**
|
|
156
150
|
* Calculate statistics for a domain's patterns
|