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
|
@@ -137,6 +137,12 @@ export class SecurityAuditProtocol {
|
|
|
137
137
|
if (depResult.success) {
|
|
138
138
|
this.currentAudit = { ...this.currentAudit, dependencyResult: depResult.value };
|
|
139
139
|
await this.publishDependencyVulnerabilities(depResult.value.vulnerabilities);
|
|
140
|
+
// #1049: a failed or partial advisory lookup (or a result without a
|
|
141
|
+
// status, which cannot show it was complete) is not a clean dependency scan.
|
|
142
|
+
if (depResult.value.status !== 'complete') {
|
|
143
|
+
this.recordIncompleteCheck(depResult.value.error
|
|
144
|
+
?? `Dependency advisories could not be checked for ${depResult.value.uncheckedPackages?.length ?? 'unknown number of'} package(s)`);
|
|
145
|
+
}
|
|
140
146
|
}
|
|
141
147
|
else {
|
|
142
148
|
this.recordIncompleteCheck('Dependency scan did not complete');
|
|
@@ -280,6 +286,11 @@ export class SecurityAuditProtocol {
|
|
|
280
286
|
vulnerabilities: scanResult.value.vulnerabilities,
|
|
281
287
|
outdatedPackages: [],
|
|
282
288
|
summary: scanResult.value.summary,
|
|
289
|
+
status: scanResult.value.status,
|
|
290
|
+
measured: scanResult.value.measured,
|
|
291
|
+
packagesChecked: scanResult.value.packagesChecked,
|
|
292
|
+
uncheckedPackages: scanResult.value.uncheckedPackages,
|
|
293
|
+
...(scanResult.value.error ? { error: scanResult.value.error } : {}),
|
|
283
294
|
});
|
|
284
295
|
}
|
|
285
296
|
}
|
|
@@ -88,6 +88,15 @@ export declare class ResultSaver {
|
|
|
88
88
|
* `name-1.ext`, `name-2.ext`, … instead of replacing the earlier file (#1007).
|
|
89
89
|
*/
|
|
90
90
|
private writeNewFile;
|
|
91
|
+
/**
|
|
92
|
+
* File name for a generated test source: the sanitized name capped at
|
|
93
|
+
* MAX_GENERATED_STEM_LENGTH characters (a long source file name would
|
|
94
|
+
* otherwise exceed the filesystem's 255-byte limit once the temp-file suffix
|
|
95
|
+
* is added) plus a short hash of the source path and full name. The hash keeps
|
|
96
|
+
* `src/one/math.ts` and `src/two/math.ts` (or a truncated long name) from
|
|
97
|
+
* overwriting each other, while the same test still maps to the same file.
|
|
98
|
+
*/
|
|
99
|
+
private generatedTestFilename;
|
|
91
100
|
private sanitizeFilename;
|
|
92
101
|
private getTestExtension;
|
|
93
102
|
private createFileEntry;
|
|
@@ -7,6 +7,8 @@ import * as path from 'path';
|
|
|
7
7
|
import { createHash, randomBytes } from 'crypto';
|
|
8
8
|
import { safeJsonParse } from '../shared/safe-json.js';
|
|
9
9
|
import { getProjectStorePath } from '../kernel/project-root.js';
|
|
10
|
+
/** Cap on the sanitized stem of a generated test file name (see generatedTestFilename). */
|
|
11
|
+
const MAX_GENERATED_STEM_LENGTH = 100;
|
|
10
12
|
function securityReportExecution(data) {
|
|
11
13
|
return data.evidence?.completeness === 'complete' ? 'completed'
|
|
12
14
|
: data.evidence?.completeness === 'partial' ? 'partial'
|
|
@@ -174,14 +176,26 @@ export class ResultSaver {
|
|
|
174
176
|
// Save individual test files if code is provided
|
|
175
177
|
if (data.tests) {
|
|
176
178
|
for (const test of data.tests) {
|
|
177
|
-
|
|
179
|
+
// The test-generation domain returns `testCode`; retain `code` for
|
|
180
|
+
// older callers of ResultSaver that already use that field.
|
|
181
|
+
const code = test.testCode ?? test.code;
|
|
182
|
+
if (code) {
|
|
178
183
|
const ext = this.getTestExtension(options.language || 'typescript', options.framework || 'vitest');
|
|
179
|
-
const testFilename = this.
|
|
184
|
+
const testFilename = this.generatedTestFilename(test, ext);
|
|
180
185
|
const testPath = path.join(testDir, testFilename);
|
|
181
186
|
// Review of #1026 N7: a generated test keeps one file per test name
|
|
182
187
|
// (replaced atomically), unlike reports, so numbered copies never
|
|
183
188
|
// pile up for a test runner to collect.
|
|
184
|
-
|
|
189
|
+
//
|
|
190
|
+
// One unwritable source file (e.g. a name the filesystem rejects)
|
|
191
|
+
// must not discard the manifest and report, so a per-file failure is
|
|
192
|
+
// skipped; `files` then lists only what is actually on disk.
|
|
193
|
+
try {
|
|
194
|
+
files.push(await this.replaceFile(testPath, code, 'source'));
|
|
195
|
+
}
|
|
196
|
+
catch (error) {
|
|
197
|
+
console.warn(`ResultSaver: could not write generated test ${testFilename}: ${error.message}`);
|
|
198
|
+
}
|
|
185
199
|
}
|
|
186
200
|
}
|
|
187
201
|
}
|
|
@@ -504,7 +518,7 @@ ${data.recommendations.length === 0 ? noRecommendations : data.recommendations.m
|
|
|
504
518
|
// ==========================================================================
|
|
505
519
|
// Utilities
|
|
506
520
|
// ==========================================================================
|
|
507
|
-
async ensureDirectories(
|
|
521
|
+
async ensureDirectories(_taskType) {
|
|
508
522
|
const dirs = [
|
|
509
523
|
this.resultsDir,
|
|
510
524
|
path.join(this.resultsDir, 'security'),
|
|
@@ -563,6 +577,22 @@ ${data.recommendations.length === 0 ? noRecommendations : data.recommendations.m
|
|
|
563
577
|
}
|
|
564
578
|
throw new Error(`ResultSaver: no free file name for ${filePath}`);
|
|
565
579
|
}
|
|
580
|
+
/**
|
|
581
|
+
* File name for a generated test source: the sanitized name capped at
|
|
582
|
+
* MAX_GENERATED_STEM_LENGTH characters (a long source file name would
|
|
583
|
+
* otherwise exceed the filesystem's 255-byte limit once the temp-file suffix
|
|
584
|
+
* is added) plus a short hash of the source path and full name. The hash keeps
|
|
585
|
+
* `src/one/math.ts` and `src/two/math.ts` (or a truncated long name) from
|
|
586
|
+
* overwriting each other, while the same test still maps to the same file.
|
|
587
|
+
*/
|
|
588
|
+
generatedTestFilename(test, ext) {
|
|
589
|
+
const stem = this.sanitizeFilename(test.name).slice(0, MAX_GENERATED_STEM_LENGTH) || 'test';
|
|
590
|
+
const hash = createHash('sha256')
|
|
591
|
+
.update(`${test.file ?? ''}\0${test.name}`)
|
|
592
|
+
.digest('hex')
|
|
593
|
+
.slice(0, 8);
|
|
594
|
+
return `${stem}-${hash}${ext}`;
|
|
595
|
+
}
|
|
566
596
|
sanitizeFilename(name) {
|
|
567
597
|
return name.replace(/[^a-zA-Z0-9_-]/g, '_').toLowerCase();
|
|
568
598
|
}
|
|
@@ -14,6 +14,8 @@ import type { CoverageSummary, FileCoverage } from './interfaces';
|
|
|
14
14
|
* (or the cwd when none is known), so one file never has two records.
|
|
15
15
|
*/
|
|
16
16
|
export declare function fileCoverageKey(filePath: string, projectRoot?: string): string;
|
|
17
|
+
/** Read the canonical key first, then a measured legacy relative key if present. */
|
|
18
|
+
export declare function fileCoverageLookupKeys(filePath: string, projectRoot?: string): string[];
|
|
17
19
|
export interface CollectedMetrics {
|
|
18
20
|
branch: boolean;
|
|
19
21
|
function: boolean;
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
* null — never as 0% (a fake low figure) nor as istanbul's 0/0 = 100%.
|
|
8
8
|
*/
|
|
9
9
|
import * as path from 'path';
|
|
10
|
+
import { findProjectRoot } from '../../kernel/project-root.js';
|
|
10
11
|
/**
|
|
11
12
|
* The ONE key form for per-file coverage records (#1027 N7): the absolute
|
|
12
13
|
* path. Reports write absolute (istanbul) or project-relative (lcov
|
|
@@ -14,7 +15,13 @@ import * as path from 'path';
|
|
|
14
15
|
* (or the cwd when none is known), so one file never has two records.
|
|
15
16
|
*/
|
|
16
17
|
export function fileCoverageKey(filePath, projectRoot) {
|
|
17
|
-
return path.isAbsolute(filePath) ? path.normalize(filePath) : path.resolve(projectRoot ??
|
|
18
|
+
return path.isAbsolute(filePath) ? path.normalize(filePath) : path.resolve(projectRoot ?? findProjectRoot(), filePath);
|
|
19
|
+
}
|
|
20
|
+
/** Read the canonical key first, then a measured legacy relative key if present. */
|
|
21
|
+
export function fileCoverageLookupKeys(filePath, projectRoot) {
|
|
22
|
+
const canonical = `coverage:file:${fileCoverageKey(filePath, projectRoot)}`;
|
|
23
|
+
const legacy = `coverage:file:${filePath}`;
|
|
24
|
+
return canonical === legacy ? [canonical] : [canonical, legacy];
|
|
18
25
|
}
|
|
19
26
|
/** Which optional metrics the files carry. Line coverage is always collected. */
|
|
20
27
|
export function collectedMetrics(files) {
|
|
@@ -15,6 +15,7 @@ import { toError } from '../../../shared/error-utils.js';
|
|
|
15
15
|
import { safeJsonParse } from '../../../shared/safe-json.js';
|
|
16
16
|
import { getClaudeModelForTier } from '../../../shared/llm/model-registry.js';
|
|
17
17
|
import { measuredCoverageSummary, measuredFileCoverage } from '../../quality-assessment/coverage-report-event.js';
|
|
18
|
+
import { fileCoverageLookupKeys } from '../../coverage-analysis/collected-metrics.js';
|
|
18
19
|
// LLMDefectAnalysis is imported from ../interfaces
|
|
19
20
|
const DEFAULT_CONFIG = {
|
|
20
21
|
defaultThreshold: 0.5,
|
|
@@ -161,7 +162,7 @@ Be specific and actionable. Focus on concrete issues, not generic advice.`,
|
|
|
161
162
|
}
|
|
162
163
|
return null;
|
|
163
164
|
}
|
|
164
|
-
catch
|
|
165
|
+
catch {
|
|
165
166
|
logger.warn('LLM analysis failed, using heuristics only');
|
|
166
167
|
return null;
|
|
167
168
|
}
|
|
@@ -498,7 +499,7 @@ Be specific and actionable. Focus on concrete issues, not generic advice.`,
|
|
|
498
499
|
// Count complexity indicators in code
|
|
499
500
|
const content = fileResult.value;
|
|
500
501
|
const ifCount = (content.match(/\bif\s*\(/g) || []).length;
|
|
501
|
-
const loopCount = (content.match(/\b(for|while|do)\s*[
|
|
502
|
+
const loopCount = (content.match(/\b(for|while|do)\s*[{(]/g) || []).length;
|
|
502
503
|
const switchCount = (content.match(/\bswitch\s*\(/g) || []).length;
|
|
503
504
|
const catchCount = (content.match(/\bcatch\s*\(/g) || []).length;
|
|
504
505
|
const ternaryCount = (content.match(/\?[^?:]+:/g) || []).length;
|
|
@@ -592,10 +593,12 @@ Be specific and actionable. Focus on concrete issues, not generic advice.`,
|
|
|
592
593
|
try {
|
|
593
594
|
// Try per-file coverage (written by coverage-analyzer and test-executor)
|
|
594
595
|
// #1014: only measured records; legacy unstamped estimates are ignored.
|
|
595
|
-
const
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
596
|
+
for (const key of fileCoverageLookupKeys(file)) {
|
|
597
|
+
const fileCoverage = measuredFileCoverage(await this.memory.get(key));
|
|
598
|
+
if (fileCoverage) {
|
|
599
|
+
// Invert: low coverage = high defect risk
|
|
600
|
+
return 1 - fileCoverage.line / 100;
|
|
601
|
+
}
|
|
599
602
|
}
|
|
600
603
|
// Fall back to project-wide coverage
|
|
601
604
|
const summary = measuredCoverageSummary(await this.memory.get('coverage:latest'));
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agentic QE v3 - Active learned-pattern reads (#1055)
|
|
3
|
+
*
|
|
4
|
+
* Active learned patterns live at `learning:pattern:<id>`. The same prefix
|
|
5
|
+
* also holds records that are NOT active patterns:
|
|
6
|
+
*
|
|
7
|
+
* - `learning:pattern:creation:<id>`: creation provenance written by
|
|
8
|
+
* `LearningCoordinatorService.recordPatternCreation()` (no `context`)
|
|
9
|
+
* - `learning:pattern:archived:<id>`: archived patterns written by
|
|
10
|
+
* `LearningCoordinatorService.archivePattern()` and the
|
|
11
|
+
* learning-consolidation protocol (full pattern shape)
|
|
12
|
+
*
|
|
13
|
+
* Every reader of active patterns must go through this module so that
|
|
14
|
+
* provenance and archives are excluded before `get()`, and so that those rows
|
|
15
|
+
* cannot use up the search cap and push active patterns out. Records stay
|
|
16
|
+
* untouched; this is read-side classification only.
|
|
17
|
+
*/
|
|
18
|
+
import type { MemoryBackend, RetrieveOptions } from '../../kernel/interfaces.js';
|
|
19
|
+
import type { LearnedPattern } from './interfaces.js';
|
|
20
|
+
export declare const LEARNING_PATTERN_KEY_PREFIX = "learning:pattern:";
|
|
21
|
+
/** Sub-key families under the pattern prefix that are not active patterns. */
|
|
22
|
+
export declare const NON_ACTIVE_PATTERN_SEGMENTS: readonly string[];
|
|
23
|
+
/**
|
|
24
|
+
* Key-scan cap for active pattern reads. Keys are cheap to list, and only
|
|
25
|
+
* active keys are fetched, so the cap is set well above realistic store
|
|
26
|
+
* sizes. When it is reached, `onTruncated` is called.
|
|
27
|
+
*/
|
|
28
|
+
export declare const ACTIVE_PATTERN_KEY_SCAN_LIMIT = 10000;
|
|
29
|
+
/**
|
|
30
|
+
* True when the key is in the active pattern key family
|
|
31
|
+
* (`learning:pattern:<id>`), false for provenance, archives and any other
|
|
32
|
+
* non-active sub-key.
|
|
33
|
+
*/
|
|
34
|
+
export declare function isActivePatternKey(key: string): boolean;
|
|
35
|
+
/**
|
|
36
|
+
* Shape guard for a record read from an active key: it must be an object
|
|
37
|
+
* whose own id maps back to that key, and it must carry a `context` object.
|
|
38
|
+
*/
|
|
39
|
+
export declare function isActivePatternRecord(key: string, value: unknown): value is LearnedPattern;
|
|
40
|
+
export interface ReadActivePatternsOptions {
|
|
41
|
+
/** Namespace passed to `search()` and `get()`. Omit for the backend default. */
|
|
42
|
+
retrieve?: RetrieveOptions;
|
|
43
|
+
/** Override the key-scan cap (tests). */
|
|
44
|
+
scanLimit?: number;
|
|
45
|
+
/** Called when the key scan hit the cap, so results may be incomplete. */
|
|
46
|
+
onTruncated?: (scanned: number) => void;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Read every active learned pattern: list keys, drop non-active key families
|
|
50
|
+
* before `get()`, then drop records that fail the shape guard. Date fields
|
|
51
|
+
* come back from kv as ISO strings and are rehydrated (#491 Bug 3), so
|
|
52
|
+
* `TimeRange.contains(pattern.createdAt)` works for every reader.
|
|
53
|
+
*/
|
|
54
|
+
export declare function readActivePatterns(memory: MemoryBackend, options?: ReadActivePatternsOptions): Promise<LearnedPattern[]>;
|
|
55
|
+
//# sourceMappingURL=active-patterns.d.ts.map
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agentic QE v3 - Active learned-pattern reads (#1055)
|
|
3
|
+
*
|
|
4
|
+
* Active learned patterns live at `learning:pattern:<id>`. The same prefix
|
|
5
|
+
* also holds records that are NOT active patterns:
|
|
6
|
+
*
|
|
7
|
+
* - `learning:pattern:creation:<id>`: creation provenance written by
|
|
8
|
+
* `LearningCoordinatorService.recordPatternCreation()` (no `context`)
|
|
9
|
+
* - `learning:pattern:archived:<id>`: archived patterns written by
|
|
10
|
+
* `LearningCoordinatorService.archivePattern()` and the
|
|
11
|
+
* learning-consolidation protocol (full pattern shape)
|
|
12
|
+
*
|
|
13
|
+
* Every reader of active patterns must go through this module so that
|
|
14
|
+
* provenance and archives are excluded before `get()`, and so that those rows
|
|
15
|
+
* cannot use up the search cap and push active patterns out. Records stay
|
|
16
|
+
* untouched; this is read-side classification only.
|
|
17
|
+
*/
|
|
18
|
+
import { rehydrateDates } from '../../shared/utils/kv-date-rehydrate.js';
|
|
19
|
+
export const LEARNING_PATTERN_KEY_PREFIX = 'learning:pattern:';
|
|
20
|
+
/** Sub-key families under the pattern prefix that are not active patterns. */
|
|
21
|
+
export const NON_ACTIVE_PATTERN_SEGMENTS = ['creation', 'archived'];
|
|
22
|
+
/**
|
|
23
|
+
* Key-scan cap for active pattern reads. Keys are cheap to list, and only
|
|
24
|
+
* active keys are fetched, so the cap is set well above realistic store
|
|
25
|
+
* sizes. When it is reached, `onTruncated` is called.
|
|
26
|
+
*/
|
|
27
|
+
export const ACTIVE_PATTERN_KEY_SCAN_LIMIT = 10_000;
|
|
28
|
+
/**
|
|
29
|
+
* True when the key is in the active pattern key family
|
|
30
|
+
* (`learning:pattern:<id>`), false for provenance, archives and any other
|
|
31
|
+
* non-active sub-key.
|
|
32
|
+
*/
|
|
33
|
+
export function isActivePatternKey(key) {
|
|
34
|
+
if (!key.startsWith(LEARNING_PATTERN_KEY_PREFIX))
|
|
35
|
+
return false;
|
|
36
|
+
const rest = key.slice(LEARNING_PATTERN_KEY_PREFIX.length);
|
|
37
|
+
if (rest.length === 0)
|
|
38
|
+
return false;
|
|
39
|
+
const firstSegment = rest.split(':', 1)[0];
|
|
40
|
+
return !NON_ACTIVE_PATTERN_SEGMENTS.includes(firstSegment);
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Shape guard for a record read from an active key: it must be an object
|
|
44
|
+
* whose own id maps back to that key, and it must carry a `context` object.
|
|
45
|
+
*/
|
|
46
|
+
export function isActivePatternRecord(key, value) {
|
|
47
|
+
if (!value || typeof value !== 'object')
|
|
48
|
+
return false;
|
|
49
|
+
const record = value;
|
|
50
|
+
if (typeof record.id !== 'string' || key !== `${LEARNING_PATTERN_KEY_PREFIX}${record.id}`) {
|
|
51
|
+
return false;
|
|
52
|
+
}
|
|
53
|
+
return !!record.context && typeof record.context === 'object';
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Read every active learned pattern: list keys, drop non-active key families
|
|
57
|
+
* before `get()`, then drop records that fail the shape guard. Date fields
|
|
58
|
+
* come back from kv as ISO strings and are rehydrated (#491 Bug 3), so
|
|
59
|
+
* `TimeRange.contains(pattern.createdAt)` works for every reader.
|
|
60
|
+
*/
|
|
61
|
+
export async function readActivePatterns(memory, options = {}) {
|
|
62
|
+
const limit = options.scanLimit ?? ACTIVE_PATTERN_KEY_SCAN_LIMIT;
|
|
63
|
+
const keys = await memory.search(`${LEARNING_PATTERN_KEY_PREFIX}*`, limit, options.retrieve);
|
|
64
|
+
if (keys.length >= limit)
|
|
65
|
+
options.onTruncated?.(keys.length);
|
|
66
|
+
const patterns = [];
|
|
67
|
+
for (const key of keys) {
|
|
68
|
+
if (!isActivePatternKey(key))
|
|
69
|
+
continue;
|
|
70
|
+
const value = await memory.get(key, options.retrieve);
|
|
71
|
+
if (isActivePatternRecord(key, value)) {
|
|
72
|
+
patterns.push(rehydrateDates(value, ['createdAt', 'lastUsedAt']));
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return patterns;
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=active-patterns.js.map
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
* Orchestrates learning workflows across all QE domains
|
|
4
4
|
*/
|
|
5
5
|
import { LoggerFactory } from '../../logging/index.js';
|
|
6
|
+
import { readActivePatterns } from './active-patterns.js';
|
|
6
7
|
import { v4 as uuidv4 } from 'uuid';
|
|
7
8
|
import { toError } from '../../shared/error-utils.js';
|
|
8
9
|
import { rehydrateDates } from '../../shared/utils/kv-date-rehydrate.js';
|
|
@@ -739,17 +740,19 @@ export class LearningOptimizationCoordinator extends BaseDomainCoordinator {
|
|
|
739
740
|
const patterns = [];
|
|
740
741
|
const knowledge = [];
|
|
741
742
|
const strategies = [];
|
|
742
|
-
// Export patterns
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
743
|
+
// Export patterns (#1055: active patterns only — creation provenance
|
|
744
|
+
// and archives share the `learning:pattern:` prefix). One read covers
|
|
745
|
+
// every target domain; the previous per-domain loop exported each
|
|
746
|
+
// pattern once per target domain.
|
|
747
|
+
const activePatterns = await readActivePatterns(this.memory, {
|
|
748
|
+
onTruncated: (scanned) => logger.warn('Pattern export key scan hit its cap; export may be incomplete', { scanned }),
|
|
749
|
+
});
|
|
750
|
+
for (const pattern of activePatterns) {
|
|
751
|
+
if (targetDomains.includes(pattern.domain)) {
|
|
752
|
+
patterns.push(pattern);
|
|
750
753
|
}
|
|
751
|
-
this.updateWorkflowProgress(workflowId, Math.round((patterns.length / 100) * 30));
|
|
752
754
|
}
|
|
755
|
+
this.updateWorkflowProgress(workflowId, 30);
|
|
753
756
|
// Export knowledge
|
|
754
757
|
const knowledgeResult = await this.transferService.queryKnowledge({
|
|
755
758
|
limit: 1000,
|
|
@@ -7,6 +7,7 @@ import { v4 as uuidv4 } from 'uuid';
|
|
|
7
7
|
import { ok, err } from '../../../shared/types/index.js';
|
|
8
8
|
import { rehydrateDates } from '../../../shared/utils/kv-date-rehydrate.js';
|
|
9
9
|
import { toError } from '../../../shared/error-utils.js';
|
|
10
|
+
import { readActivePatterns } from '../active-patterns.js';
|
|
10
11
|
import { createQEFlashAttention, } from '../../../integrations/ruvector/wrappers.js';
|
|
11
12
|
import { getClaudeModelForTier } from '../../../shared/llm/model-registry.js';
|
|
12
13
|
import { createSafeRecord } from '../../../shared/utils/safe-record.js';
|
|
@@ -33,6 +34,16 @@ const logger = LoggerFactory.create('learning-optimization/learning-coordinator'
|
|
|
33
34
|
* domain even on installs with hundreds of indexed experiences.
|
|
34
35
|
*/
|
|
35
36
|
const LEARNING_NS = { namespace: 'learning-optimization' };
|
|
37
|
+
/**
|
|
38
|
+
* #1055: active patterns only. `learning:pattern:*` also holds creation
|
|
39
|
+
* provenance and archived patterns written by this service.
|
|
40
|
+
*/
|
|
41
|
+
function readActiveLearnedPatterns(memory) {
|
|
42
|
+
return readActivePatterns(memory, {
|
|
43
|
+
retrieve: LEARNING_NS,
|
|
44
|
+
onTruncated: (scanned) => logger.warn('Active pattern key scan hit its cap; results may be incomplete', { scanned }),
|
|
45
|
+
});
|
|
46
|
+
}
|
|
36
47
|
export class LearningCoordinatorService {
|
|
37
48
|
config;
|
|
38
49
|
memory;
|
|
@@ -251,14 +262,7 @@ Provide:
|
|
|
251
262
|
*/
|
|
252
263
|
async findMatchingPatterns(context, limit = 10) {
|
|
253
264
|
try {
|
|
254
|
-
const patterns =
|
|
255
|
-
const keys = await this.memory.search('learning:pattern:*', 100, LEARNING_NS);
|
|
256
|
-
for (const key of keys) {
|
|
257
|
-
const pattern = await this.memory.get(key, LEARNING_NS);
|
|
258
|
-
if (pattern && this.matchesContext(pattern, context)) {
|
|
259
|
-
patterns.push(pattern);
|
|
260
|
-
}
|
|
261
|
-
}
|
|
265
|
+
const patterns = (await readActiveLearnedPatterns(this.memory)).filter((pattern) => this.matchesContext(pattern, context));
|
|
262
266
|
// Sort by confidence and usage
|
|
263
267
|
patterns.sort((a, b) => {
|
|
264
268
|
const scoreA = a.confidence * 0.6 + (a.successRate * 0.4);
|
|
@@ -384,14 +388,7 @@ Provide:
|
|
|
384
388
|
*/
|
|
385
389
|
async getPatternStats(domain) {
|
|
386
390
|
try {
|
|
387
|
-
const
|
|
388
|
-
const patterns = [];
|
|
389
|
-
for (const key of keys) {
|
|
390
|
-
const pattern = await this.memory.get(key, LEARNING_NS);
|
|
391
|
-
if (pattern && (!domain || pattern.domain === domain)) {
|
|
392
|
-
patterns.push(pattern);
|
|
393
|
-
}
|
|
394
|
-
}
|
|
391
|
+
const patterns = (await readActiveLearnedPatterns(this.memory)).filter((pattern) => !domain || pattern.domain === domain);
|
|
395
392
|
const byType = {
|
|
396
393
|
'test-pattern': 0,
|
|
397
394
|
'fix-pattern': 0,
|
|
@@ -761,7 +758,8 @@ Provide:
|
|
|
761
758
|
return false;
|
|
762
759
|
}
|
|
763
760
|
if (context.tags.length > 0) {
|
|
764
|
-
const
|
|
761
|
+
const patternTags = Array.isArray(pattern.context.tags) ? pattern.context.tags : [];
|
|
762
|
+
const hasMatchingTag = context.tags.some((tag) => patternTags.includes(tag));
|
|
765
763
|
if (!hasMatchingTag) {
|
|
766
764
|
return false;
|
|
767
765
|
}
|
|
@@ -56,6 +56,10 @@ export interface GateResult {
|
|
|
56
56
|
checks: GateCheck[];
|
|
57
57
|
overallScore: number;
|
|
58
58
|
failedChecks: string[];
|
|
59
|
+
/** Gate service evidence state; absent for other gate implementations. */
|
|
60
|
+
evidenceStatus?: 'measured' | 'insufficient-evidence';
|
|
61
|
+
/** Configured checks whose input was missing, negative, or non-finite. */
|
|
62
|
+
unmeasured?: string[];
|
|
59
63
|
}
|
|
60
64
|
export interface GateCheck {
|
|
61
65
|
name: string;
|
|
@@ -98,7 +98,7 @@ export declare class InsufficientQualityEvidenceError extends Error {
|
|
|
98
98
|
* Inspect every canonical metric with the same validation, collecting each
|
|
99
99
|
* absent, stale, future-dated or malformed record instead of stopping at the first.
|
|
100
100
|
*/
|
|
101
|
-
export declare function inspectQualityEvidence(memory: MemoryBackend, options?: {
|
|
101
|
+
export declare function inspectQualityEvidence(memory: Pick<MemoryBackend, 'get'>, options?: {
|
|
102
102
|
now?: number;
|
|
103
103
|
maxAgeMs?: number;
|
|
104
104
|
}): Promise<{
|
|
@@ -10,6 +10,7 @@ import { toError } from '../../../shared/error-utils.js';
|
|
|
10
10
|
import { safeJsonParse } from '../../../shared/safe-json.js';
|
|
11
11
|
import { getClaudeModelForTier } from '../../../shared/llm/model-registry.js';
|
|
12
12
|
import { measuredCoverageSummary, measuredFileCoverage } from '../coverage-report-event.js';
|
|
13
|
+
import { fileCoverageLookupKeys } from '../../coverage-analysis/collected-metrics.js';
|
|
13
14
|
/** Metrics the static analyzer produces when the caller asks for all of them. */
|
|
14
15
|
const ANALYZER_METRICS = ['coverage', 'complexity', 'maintainability', 'duplication', 'testability'];
|
|
15
16
|
/** Metrics computed from parsing each source file. */
|
|
@@ -157,7 +158,7 @@ Focus on:
|
|
|
157
158
|
}
|
|
158
159
|
return null;
|
|
159
160
|
}
|
|
160
|
-
catch
|
|
161
|
+
catch {
|
|
161
162
|
logger.warn('LLM insights generation failed:');
|
|
162
163
|
return null;
|
|
163
164
|
}
|
|
@@ -226,7 +227,7 @@ Focus on:
|
|
|
226
227
|
}
|
|
227
228
|
return null;
|
|
228
229
|
}
|
|
229
|
-
catch
|
|
230
|
+
catch {
|
|
230
231
|
logger.warn('Failed to parse LLM insights response:');
|
|
231
232
|
return null;
|
|
232
233
|
}
|
|
@@ -508,9 +509,10 @@ Focus on:
|
|
|
508
509
|
// 1. Try per-file coverage stored by test executor
|
|
509
510
|
// #1014: only measured records count. Legacy unstamped estimate
|
|
510
511
|
// records (written by <= 3.15.4, never expiring) are ignored.
|
|
511
|
-
const
|
|
512
|
-
|
|
513
|
-
|
|
512
|
+
for (const key of fileCoverageLookupKeys(file)) {
|
|
513
|
+
const fileCoverage = measuredFileCoverage(await this.memory.get(key));
|
|
514
|
+
if (fileCoverage)
|
|
515
|
+
return fileCoverage.line;
|
|
514
516
|
}
|
|
515
517
|
// 2. Fall back to project-wide summary from coverage-analyzer
|
|
516
518
|
const summary = measuredCoverageSummary(await this.memory.get('coverage:latest'));
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
import { v4 as uuidv4 } from 'uuid';
|
|
6
6
|
import { ok, err } from '../../../shared/types/index.js';
|
|
7
7
|
import { toError } from '../../../shared/error-utils.js';
|
|
8
|
+
import { isMeasuredMetricValue } from '../evidence-sufficiency.js';
|
|
8
9
|
const DEFAULT_CONFIG = {
|
|
9
10
|
strictMode: false,
|
|
10
11
|
enableWarnings: true,
|
|
@@ -80,6 +81,12 @@ export class QualityGateService {
|
|
|
80
81
|
// Evaluate each threshold
|
|
81
82
|
checks.push(...this.evaluateMinThresholds(metrics, thresholds));
|
|
82
83
|
checks.push(...this.evaluateMaxThresholds(metrics, thresholds));
|
|
84
|
+
if (checks.length === 0) {
|
|
85
|
+
return err(new Error('No thresholds configured for gate evaluation'));
|
|
86
|
+
}
|
|
87
|
+
const unmeasured = checks
|
|
88
|
+
.filter((check) => !isMeasuredMetricValue(check.value))
|
|
89
|
+
.map((check) => check.name);
|
|
83
90
|
// Collect failed checks
|
|
84
91
|
for (const check of checks) {
|
|
85
92
|
if (!check.passed) {
|
|
@@ -89,13 +96,15 @@ export class QualityGateService {
|
|
|
89
96
|
// Calculate overall score (0-100)
|
|
90
97
|
const overallScore = this.calculateOverallScore(checks);
|
|
91
98
|
// Determine pass/fail based on critical checks
|
|
92
|
-
const passed = this.determineGateStatus(checks);
|
|
99
|
+
const passed = unmeasured.length === 0 && this.determineGateStatus(checks);
|
|
93
100
|
const result = {
|
|
94
101
|
gateName,
|
|
95
102
|
passed,
|
|
96
103
|
checks,
|
|
97
104
|
overallScore,
|
|
98
105
|
failedChecks,
|
|
106
|
+
evidenceStatus: unmeasured.length === 0 ? 'measured' : 'insufficient-evidence',
|
|
107
|
+
unmeasured,
|
|
99
108
|
};
|
|
100
109
|
// Store evaluation result in memory
|
|
101
110
|
await this.storeEvaluationResult(result);
|
|
@@ -188,9 +197,9 @@ export class QualityGateService {
|
|
|
188
197
|
return checks;
|
|
189
198
|
}
|
|
190
199
|
createCheck(name, value, threshold, type, severity) {
|
|
191
|
-
const passed = type === 'min'
|
|
200
|
+
const passed = isMeasuredMetricValue(value) && (type === 'min'
|
|
192
201
|
? value >= threshold
|
|
193
|
-
: value <= threshold;
|
|
202
|
+
: value <= threshold);
|
|
194
203
|
return {
|
|
195
204
|
name,
|
|
196
205
|
passed,
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dependency advisory (OSV) engine for the scan-security task (#1049).
|
|
3
|
+
*
|
|
4
|
+
* Runs the security-compliance DependencyScanner on the project's package.json
|
|
5
|
+
* and turns its outcome into an execution receipt. A failed or partial OSV
|
|
6
|
+
* lookup is a failed/partial engine with the unchecked packages listed, never
|
|
7
|
+
* a completed engine with zero findings.
|
|
8
|
+
*/
|
|
9
|
+
import type { SecurityEngineEvidence } from './scan-evidence.js';
|
|
10
|
+
import type { Vulnerability, UncheckedDependency, LocalDependency } from './interfaces.js';
|
|
11
|
+
import type { DependencyScanResult } from './services/scanners/scanner-types.js';
|
|
12
|
+
import type { Result } from '../../shared/types/index.js';
|
|
13
|
+
export declare const DEPENDENCY_ADVISORY_ENGINE_ID = "osv-dependency-advisories";
|
|
14
|
+
/** The dependency scan as reported to MCP and CLI consumers. */
|
|
15
|
+
export interface DependencyScanReport {
|
|
16
|
+
status: 'complete' | 'incomplete' | 'failed' | 'not-run';
|
|
17
|
+
measured: boolean;
|
|
18
|
+
manifest?: string;
|
|
19
|
+
/** Lockfile the checked versions were resolved from, or null (exact specs only). */
|
|
20
|
+
lockfile?: string | null;
|
|
21
|
+
packagesRequested: number;
|
|
22
|
+
packagesChecked: number;
|
|
23
|
+
uncheckedPackages: UncheckedDependency[];
|
|
24
|
+
/** Local workspace / linked packages: not OSV subjects, excluded from the counts. */
|
|
25
|
+
localPackages: LocalDependency[];
|
|
26
|
+
/** Why the scan is not complete beyond individual packages (malformed lockfile, workspace root #1057). */
|
|
27
|
+
resolutionErrors: string[];
|
|
28
|
+
/** Only direct dependencies are checked; transitive dependencies are not. */
|
|
29
|
+
scope: 'direct';
|
|
30
|
+
vulnerabilities: number;
|
|
31
|
+
scanId?: string;
|
|
32
|
+
error?: string;
|
|
33
|
+
/** One plain sentence for humans; says when advisories could not be checked. */
|
|
34
|
+
message: string;
|
|
35
|
+
}
|
|
36
|
+
export interface DependencyAdvisoryOutcome {
|
|
37
|
+
engine: SecurityEngineEvidence;
|
|
38
|
+
vulnerabilities: Vulnerability[];
|
|
39
|
+
report: DependencyScanReport;
|
|
40
|
+
}
|
|
41
|
+
interface PackageJsonScanner {
|
|
42
|
+
scanPackageJson(packageJsonPath: string): Promise<Result<DependencyScanResult>>;
|
|
43
|
+
}
|
|
44
|
+
/** The package.json for a scan target: the target directory's, else the project root's. */
|
|
45
|
+
export declare function findPackageJson(targetPath: string, env?: NodeJS.ProcessEnv): Promise<string | null>;
|
|
46
|
+
/** Human message for a dependency scan outcome. */
|
|
47
|
+
export declare const DEPENDENCY_SCOPE_NOTE = "direct dependencies of this package.json only; workspace members and transitive dependencies are not checked";
|
|
48
|
+
export declare function dependencyScanMessage(report: Omit<DependencyScanReport, 'message'>): string;
|
|
49
|
+
/** Run the OSV dependency scan for a target and describe it as an engine receipt. */
|
|
50
|
+
export declare function runDependencyAdvisoryScan(scanner: PackageJsonScanner, targetPath: string): Promise<DependencyAdvisoryOutcome>;
|
|
51
|
+
export {};
|
|
52
|
+
//# sourceMappingURL=dependency-advisory-engine.d.ts.map
|