agentic-qe 3.15.6 → 3.15.7
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 +141 -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-PEOUNYXJ.js +2 -0
- package/dist/cli/chunks/{agent-booster-wasm-SY7UCLBL.js → agent-booster-wasm-OS5G7KMQ.js} +2 -2
- package/dist/cli/chunks/{agent-handler-KAMYBU3S.js → agent-handler-PI4I7PME.js} +2 -2
- package/dist/cli/chunks/{agent-memory-branch-2CAW3KUM.js → agent-memory-branch-J7TXHX4U.js} +2 -2
- package/dist/cli/chunks/aqe-learning-engine-DHKZI5RX.js +2 -0
- package/dist/cli/chunks/{arena-QCCVIOAH.js → arena-FXESDCFR.js} +4 -4
- package/dist/cli/chunks/{arena-4OFLJ3R2.js → arena-OWUGXKNT.js} +2 -2
- package/dist/cli/chunks/{audit-RBDQJQJB.js → audit-EPAWLYIZ.js} +3 -3
- package/dist/cli/chunks/base-QZWK3D5P.js +2 -0
- package/dist/cli/chunks/{better-sqlite3-5JRACCDQ.js → better-sqlite3-IYVR5EQY.js} +2 -2
- package/dist/cli/chunks/{brain-handler-W4QIIRT4.js → brain-handler-3W2E6TC6.js} +3 -3
- package/dist/cli/chunks/{branch-enumerator-IBNGI572.js → branch-enumerator-HU7VACJ4.js} +2 -2
- package/dist/cli/chunks/{browser-GMSCVAOI.js → browser-72XOR6E2.js} +2 -2
- package/dist/cli/chunks/browser-workflow-ITPX72RX.js +2 -0
- package/dist/cli/chunks/{chunk-CR66HNAE.js → chunk-2423JAA5.js} +1 -1
- package/dist/cli/chunks/{chunk-LAY7NCQK.js → chunk-24CENUT4.js} +3 -3
- package/dist/cli/chunks/{chunk-PEMSXSP2.js → chunk-2AYBYXOA.js} +2 -2
- package/dist/cli/chunks/{chunk-TUDENMAE.js → chunk-2E3XWKEU.js} +2 -2
- package/dist/cli/chunks/{chunk-KIDOBLUO.js → chunk-2RJYA6WK.js} +2 -2
- package/dist/cli/chunks/{chunk-2IWPJUVV.js → chunk-2YVJ5OUL.js} +5 -5
- package/dist/cli/chunks/{chunk-34MDMFET.js → chunk-34JLY3U6.js} +2 -2
- package/dist/cli/chunks/{chunk-SV5BUYHH.js → chunk-3JD2USUH.js} +2 -2
- package/dist/cli/chunks/{chunk-EF5UHDCG.js → chunk-3RM46XFP.js} +1 -1
- package/dist/cli/chunks/{chunk-7XTANLTN.js → chunk-44DPYNPE.js} +1 -1
- package/dist/cli/chunks/{chunk-ONPPBLRB.js → chunk-4DIZ5BT6.js} +2 -2
- package/dist/cli/chunks/{chunk-22OZIJAD.js → chunk-4G2VNW4C.js} +2 -2
- package/dist/cli/chunks/{chunk-LJCEDTUM.js → chunk-56ZKQYZY.js} +3 -3
- package/dist/cli/chunks/{chunk-HOEWMEF2.js → chunk-5KCBX225.js} +2 -2
- package/dist/cli/chunks/{chunk-V3OLS2NG.js → chunk-5KS7HA37.js} +2 -2
- package/dist/cli/chunks/{chunk-MQCTLTGE.js → chunk-5PBRBS7D.js} +2 -2
- package/dist/cli/chunks/{chunk-TVLOED6O.js → chunk-5Q22XPTH.js} +2 -2
- package/dist/cli/chunks/{chunk-B7RHBKHL.js → chunk-634D2ENF.js} +2 -2
- package/dist/cli/chunks/{chunk-7TVIX4WL.js → chunk-6AYRAOCA.js} +2 -2
- package/dist/cli/chunks/{chunk-4KOVHQXK.js → chunk-6BO3WCK7.js} +2 -2
- package/dist/cli/chunks/{chunk-5HAPS6VD.js → chunk-6FEQ73BF.js} +2 -2
- package/dist/cli/chunks/{chunk-FQ5N666N.js → chunk-6JT73S5B.js} +1 -1
- package/dist/cli/chunks/{chunk-6MXAJBEA.js → chunk-6OS7HREG.js} +1 -1
- package/dist/cli/chunks/{chunk-6R3FBFCJ.js → chunk-6PKCQXEW.js} +2 -2
- package/dist/cli/chunks/{chunk-DQNUPEY5.js → chunk-7EX4DEQR.js} +2 -2
- package/dist/cli/chunks/{chunk-KCB6P463.js → chunk-7UCVYYWL.js} +2 -2
- package/dist/cli/chunks/{chunk-RLB7K7QP.js → chunk-AAA4SHEG.js} +1 -1
- package/dist/cli/chunks/{chunk-ITIJ23K2.js → chunk-AXO7OOOA.js} +2 -2
- package/dist/cli/chunks/{chunk-6RDVY26I.js → chunk-B7M323VL.js} +2 -2
- package/dist/cli/chunks/{chunk-EJ4KZFZN.js → chunk-BB7OLQKO.js} +1 -1
- package/dist/cli/chunks/{chunk-5NC7QEJ6.js → chunk-BTIBXGVQ.js} +4 -4
- package/dist/cli/chunks/{chunk-RD5BYLN7.js → chunk-BTYKGVJ5.js} +1 -1
- package/dist/cli/chunks/{chunk-YXU35GGD.js → chunk-C2CUPJGR.js} +1 -1
- package/dist/cli/chunks/{chunk-XFPQIWEH.js → chunk-C2MDBBFF.js} +3 -3
- package/dist/cli/chunks/{chunk-QLKUCMZC.js → chunk-CG5DZCOZ.js} +1 -1
- package/dist/cli/chunks/{chunk-YLNYPQDR.js → chunk-CIFWOMNX.js} +1 -1
- package/dist/cli/chunks/{chunk-ORBODZSO.js → chunk-CWPRU7ZI.js} +2 -2
- package/dist/cli/chunks/{chunk-WKDWRRDT.js → chunk-CXTJ47QS.js} +2 -2
- package/dist/cli/chunks/{chunk-SOSJWM3E.js → chunk-DCJW2DPL.js} +4 -4
- package/dist/cli/chunks/{chunk-GVRFSXY6.js → chunk-DGK6GQMO.js} +2 -2
- package/dist/cli/chunks/{chunk-X33F7NXH.js → chunk-DVPGBDBP.js} +3 -3
- package/dist/cli/chunks/chunk-EB2PP6X2.js +2 -0
- package/dist/cli/chunks/{chunk-HZFK2Z2Z.js → chunk-ECSLJJOQ.js} +1 -1
- package/dist/cli/chunks/{chunk-JCE76MPP.js → chunk-ED32XJ5R.js} +2 -2
- package/dist/cli/chunks/{chunk-ULCHPPW2.js → chunk-EDU72RTW.js} +1 -1
- package/dist/cli/chunks/{chunk-ZOUEQ6DL.js → chunk-EL75G2A3.js} +1 -1
- package/dist/cli/chunks/{chunk-GNYOHZVV.js → chunk-EV2BYY6T.js} +1 -1
- package/dist/cli/chunks/{chunk-RUTO67PT.js → chunk-F62EKVVC.js} +2 -2
- package/dist/cli/chunks/{chunk-IVJIHZSM.js → chunk-FTTFJ7SJ.js} +1 -1
- package/dist/cli/chunks/{chunk-NYS2GUNO.js → chunk-FVBFASOD.js} +2 -2
- package/dist/cli/chunks/{chunk-5DH5QI7G.js → chunk-G762PEFO.js} +3 -3
- package/dist/cli/chunks/{chunk-JPJEAK4G.js → chunk-G7YTZTGU.js} +1 -1
- package/dist/cli/chunks/{chunk-5VUIXDY2.js → chunk-GY2SAIXP.js} +2 -2
- package/dist/cli/chunks/{chunk-7XUB7U6Z.js → chunk-H4WHDFB5.js} +2 -2
- package/dist/cli/chunks/{chunk-72MQCZSM.js → chunk-HLZATDD2.js} +2 -2
- package/dist/cli/chunks/{chunk-AX26QJ6T.js → chunk-HPG7354V.js} +2 -2
- package/dist/cli/chunks/{chunk-7SAMMQVS.js → chunk-HSDOOFV7.js} +1 -1
- package/dist/cli/chunks/{chunk-K55EAWZ5.js → chunk-HTWIGQL4.js} +2 -2
- package/dist/cli/chunks/{chunk-BXATKI5S.js → chunk-HXBAQKMH.js} +2 -2
- package/dist/cli/chunks/{chunk-46HBVDMU.js → chunk-HZFT3P5B.js} +1 -1
- package/dist/cli/chunks/{chunk-RFDFET3O.js → chunk-I7H4IP7T.js} +2 -2
- package/dist/cli/chunks/{chunk-AJT3XDRD.js → chunk-IARSGAG7.js} +2 -2
- package/dist/cli/chunks/{chunk-TL5GV3PR.js → chunk-IC2WSSD5.js} +3 -3
- package/dist/cli/chunks/{chunk-TLUIO37P.js → chunk-ICPALF4Q.js} +2 -2
- package/dist/cli/chunks/{chunk-ZSBD4FUX.js → chunk-IWQQIXHO.js} +2 -2
- package/dist/cli/chunks/{chunk-AUOSHM63.js → chunk-IYQ7XNE5.js} +2 -2
- package/dist/cli/chunks/{chunk-RHIQ6QO5.js → chunk-J26GADQE.js} +281 -281
- package/dist/cli/chunks/{chunk-AUN4FG7V.js → chunk-J43DV3ME.js} +1 -1
- package/dist/cli/chunks/{chunk-ALCIUWFC.js → chunk-JFPXCQNP.js} +1 -1
- package/dist/cli/chunks/{chunk-R363XXGH.js → chunk-JK6B3ULP.js} +2 -2
- package/dist/cli/chunks/{chunk-7VTKR44N.js → chunk-JPHDMHFG.js} +2 -2
- package/dist/cli/chunks/{chunk-FOJRPEIP.js → chunk-JVYPXW6Y.js} +2 -2
- package/dist/cli/chunks/{chunk-ZUTFHGEO.js → chunk-JY4AIEZ7.js} +1 -1
- package/dist/cli/chunks/{chunk-47Q7JL3V.js → chunk-JY4WLN3K.js} +2 -2
- package/dist/cli/chunks/{chunk-IEPWO4XP.js → chunk-JYXOFN3E.js} +2 -2
- package/dist/cli/chunks/{chunk-2CIDFR2H.js → chunk-K7W55B7Q.js} +2 -2
- package/dist/cli/chunks/{chunk-D5N2O5EH.js → chunk-KPOPBUUJ.js} +2 -2
- package/dist/cli/chunks/{chunk-OQ4S6B7P.js → chunk-LDXQRNTT.js} +1 -1
- package/dist/cli/chunks/{chunk-6T6AHVLF.js → chunk-LDZWIV2O.js} +1 -1
- package/dist/cli/chunks/{chunk-A7ANPS4E.js → chunk-LGBN7TKC.js} +2 -2
- package/dist/cli/chunks/{chunk-X2DR27AY.js → chunk-LMEU64TR.js} +2 -2
- package/dist/cli/chunks/{chunk-GI5HWS4H.js → chunk-LP4AS2E4.js} +1 -1
- package/dist/cli/chunks/{chunk-VVF337SV.js → chunk-LQOVA4YX.js} +2 -2
- package/dist/cli/chunks/{chunk-KYVIOC3C.js → chunk-LVEX4GID.js} +2 -2
- package/dist/cli/chunks/{chunk-BO7UFNYV.js → chunk-M63QB466.js} +2 -2
- package/dist/cli/chunks/{chunk-UHHMAKPE.js → chunk-MDC4G323.js} +1 -1
- package/dist/cli/chunks/{chunk-4CLDYT36.js → chunk-MHZPC4HJ.js} +2 -2
- package/dist/cli/chunks/{chunk-24ZSGYC6.js → chunk-MJJC6HUK.js} +1 -1
- package/dist/cli/chunks/{chunk-ZL5LJT7D.js → chunk-MKFQNCXI.js} +2 -2
- package/dist/cli/chunks/{chunk-XZ46CI35.js → chunk-MMXG3LL6.js} +2 -2
- package/dist/cli/chunks/{chunk-OPDZBRIL.js → chunk-MNCF643K.js} +2 -2
- package/dist/cli/chunks/{chunk-CEXNW5TR.js → chunk-MNZFEIE5.js} +1 -1
- package/dist/cli/chunks/{chunk-L4D3TPFP.js → chunk-MQ6OF6DU.js} +1 -1
- package/dist/cli/chunks/{chunk-UB6DQGWM.js → chunk-MRHM4COP.js} +2 -2
- package/dist/cli/chunks/{chunk-CLAMMGY3.js → chunk-N4PMPSJJ.js} +2 -2
- package/dist/cli/chunks/{chunk-XQ53PZEF.js → chunk-NZQPP533.js} +3 -3
- package/dist/cli/chunks/{chunk-FU7LNUD7.js → chunk-OA4GR3EZ.js} +2 -2
- package/dist/cli/chunks/{chunk-ORFL3YXB.js → chunk-OJEZNLB6.js} +2 -2
- package/dist/cli/chunks/{chunk-5LST62QR.js → chunk-ONVALAZN.js} +2 -2
- package/dist/cli/chunks/{chunk-DA7DGDTI.js → chunk-PEKDSJBC.js} +2 -2
- package/dist/cli/chunks/{chunk-3DJNKNBR.js → chunk-PG64YV6C.js} +57 -57
- package/dist/cli/chunks/{chunk-2ZTWPMTK.js → chunk-PQV7E7XH.js} +2 -2
- package/dist/cli/chunks/chunk-PTK66HEY.js +2 -0
- package/dist/cli/chunks/{chunk-CZBIREL5.js → chunk-PUECC4WI.js} +2 -2
- package/dist/cli/chunks/{chunk-JYKQVYX2.js → chunk-PXZKPUW6.js} +2 -2
- package/dist/cli/chunks/{chunk-I7WAW7TM.js → chunk-PYHYOKYT.js} +2 -2
- package/dist/cli/chunks/{chunk-LCCTJ2PC.js → chunk-PZG3542B.js} +2 -2
- package/dist/cli/chunks/{chunk-F7A2UBZO.js → chunk-Q2T5FXEA.js} +2 -2
- package/dist/cli/chunks/{chunk-PS6WFCA4.js → chunk-QJE6ZW2X.js} +2 -2
- package/dist/cli/chunks/{chunk-LZWJ5BMP.js → chunk-QNQSM2OG.js} +2 -2
- package/dist/cli/chunks/{chunk-QLYO3H7E.js → chunk-QQT6QENQ.js} +2 -2
- package/dist/cli/chunks/{chunk-VCONCVSY.js → chunk-QVG4ZDXX.js} +2 -2
- package/dist/cli/chunks/{chunk-NMY4KTWA.js → chunk-QWLTHFZW.js} +2 -2
- package/dist/cli/chunks/{chunk-NBUXM5X6.js → chunk-RCYLCA7E.js} +2 -2
- package/dist/cli/chunks/{chunk-P7DXVL2S.js → chunk-REEIFA6A.js} +2 -2
- package/dist/cli/chunks/{chunk-5MT7DMD7.js → chunk-RNYX4CPI.js} +2 -2
- package/dist/cli/chunks/{chunk-HAN4MS5T.js → chunk-RORZ5O5Z.js} +2 -2
- package/dist/cli/chunks/{chunk-ZCP4P6O2.js → chunk-RRPYWBFX.js} +2 -2
- package/dist/cli/chunks/{chunk-3NJ7O3OH.js → chunk-RXAFLK34.js} +2 -2
- package/dist/cli/chunks/{chunk-VAYZ5QIE.js → chunk-SQHLC6I5.js} +1 -1
- package/dist/cli/chunks/{chunk-Q2RBOC7V.js → chunk-SSP2B2WR.js} +2 -2
- package/dist/cli/chunks/{chunk-CCL436IU.js → chunk-SX2YSHE7.js} +14 -6
- package/dist/cli/chunks/{chunk-ZTB32K5N.js → chunk-T3ZDVU6F.js} +3 -3
- package/dist/cli/chunks/{chunk-624QRKQX.js → chunk-T6W5APYP.js} +1 -1
- package/dist/cli/chunks/{chunk-BAYGQRNP.js → chunk-TU4LIIOP.js} +2 -2
- package/dist/cli/chunks/{chunk-L2TDHJR3.js → chunk-UBYCR3O4.js} +2 -2
- package/dist/cli/chunks/{chunk-JAPBSSFY.js → chunk-UCLN6AME.js} +1 -1
- package/dist/cli/chunks/{chunk-66NW3ZB4.js → chunk-UIYKR2SA.js} +2 -2
- package/dist/cli/chunks/{chunk-BIXRTOH3.js → chunk-UUHIEM2M.js} +3 -3
- package/dist/cli/chunks/{chunk-ELI4GDQO.js → chunk-UY3REQOK.js} +2 -2
- package/dist/cli/chunks/{chunk-BUTGIVKW.js → chunk-V2SAEMZY.js} +1 -1
- package/dist/cli/chunks/{chunk-6WOZUSSN.js → chunk-V5NGBQAQ.js} +2 -2
- package/dist/cli/chunks/{chunk-7TJZDRDU.js → chunk-VCA6YYII.js} +1 -1
- package/dist/cli/chunks/chunk-VJRZFWR5.js +2 -0
- package/dist/cli/chunks/{chunk-5GIJU2ZY.js → chunk-VKPKYMCT.js} +2 -2
- package/dist/cli/chunks/{chunk-XPB5BVU6.js → chunk-VNW5Q2CX.js} +2 -2
- package/dist/cli/chunks/{chunk-7QVPMH25.js → chunk-VUFRTGML.js} +2 -2
- package/dist/cli/chunks/{chunk-MP3FSUNB.js → chunk-W4X2VTIY.js} +2 -2
- package/dist/cli/chunks/{chunk-GWM4M5NF.js → chunk-WTLIEBDH.js} +1 -1
- package/dist/cli/chunks/{chunk-QS5KZYUZ.js → chunk-WUV5RZUI.js} +2 -2
- package/dist/cli/chunks/{chunk-HEGGV2PT.js → chunk-WXI2STKQ.js} +2 -2
- package/dist/cli/chunks/{chunk-GFB6BZWU.js → chunk-XEWXYGJI.js} +2 -2
- package/dist/cli/chunks/{chunk-NHRF3V4B.js → chunk-XNSQZ3O7.js} +2 -2
- package/dist/cli/chunks/{chunk-4POOJYXA.js → chunk-XTJMY3KS.js} +1 -1
- package/dist/cli/chunks/{chunk-LMAEMVPA.js → chunk-XXAVQACL.js} +1 -1
- package/dist/cli/chunks/{chunk-RV6HSMKJ.js → chunk-Y4SAWE45.js} +1 -1
- package/dist/cli/chunks/{chunk-DLSFT6PO.js → chunk-Y6A46M3B.js} +2 -2
- package/dist/cli/chunks/{chunk-5UPIL62W.js → chunk-YDZJWDR6.js} +3 -3
- package/dist/cli/chunks/{chunk-F3KS3TAB.js → chunk-YFOBQSOW.js} +2 -2
- package/dist/cli/chunks/{chunk-XBEI2JBA.js → chunk-YK3NOC2R.js} +2 -2
- package/dist/cli/chunks/{chunk-MQTA6KIO.js → chunk-YUC7RJGR.js} +1 -1
- package/dist/cli/chunks/{chunk-A74J23QB.js → chunk-Z3VJLWRR.js} +2 -2
- package/dist/cli/chunks/{chunk-YNG7E26C.js → chunk-ZLVQSEZK.js} +2 -2
- package/dist/cli/chunks/{chunk-6HWARQWV.js → chunk-ZRLNACPY.js} +2 -2
- package/dist/cli/chunks/{chunk-XBFQJZWX.js → chunk-ZTMZFF25.js} +2 -2
- package/dist/cli/chunks/chunk-ZUMDDMDE.js +3 -0
- package/dist/cli/chunks/{ci-GEJCXMBK.js → ci-5HEXJZ2C.js} +2 -2
- package/dist/cli/chunks/{ci-config-2ZVV4OXL.js → ci-config-WU4NPDAM.js} +2 -2
- package/dist/cli/chunks/{ci-output-E45OGVPR.js → ci-output-BJQVXX5E.js} +2 -2
- package/dist/cli/chunks/{circuit-breaker-X73ITYZC.js → circuit-breaker-3BMGTQCB.js} +2 -2
- package/dist/cli/chunks/{claude-flow-setup-W4PPH46C.js → claude-flow-setup-GVDGJWMU.js} +2 -2
- package/dist/cli/chunks/client-S7GNYTZ5.js +2 -0
- package/dist/cli/chunks/{cline-installer-NUEPMWDE.js → cline-installer-V4MRGWVA.js} +2 -2
- package/dist/cli/chunks/{code-6WQHBS7G.js → code-A3TGQPEO.js} +3 -3
- package/dist/cli/chunks/{code-index-extractor-BXQIFIFT.js → code-index-extractor-YJQSYWD3.js} +2 -2
- package/dist/cli/chunks/{codex-installer-Z337R2KH.js → codex-installer-7N7UQPAH.js} +2 -2
- package/dist/cli/chunks/{completions-F5DMYFHV.js → completions-PPGVYLZS.js} +2 -2
- package/dist/cli/chunks/{complexity-analyzer-W2SYPZDI.js → complexity-analyzer-XZTFLYV5.js} +2 -2
- package/dist/cli/chunks/{continuedev-installer-ZCHUIFTN.js → continuedev-installer-Z5I57RAH.js} +2 -2
- package/dist/cli/chunks/{copilot-installer-M5JNODXF.js → copilot-installer-F5YZ6BHB.js} +2 -2
- package/dist/cli/chunks/core-handlers-CUEPOQIO.js +2 -0
- package/dist/cli/chunks/{cost-tracker-LSYTHBHV.js → cost-tracker-GO33ZQAP.js} +2 -2
- package/dist/cli/chunks/{coverage-PGMRS5SS.js → coverage-GSHKLY74.js} +3 -3
- package/dist/cli/chunks/cross-domain-router-CXN5QFEV.js +2 -0
- package/dist/cli/chunks/{cursor-installer-XPUA73UW.js → cursor-installer-JJ7IVJZB.js} +2 -2
- package/dist/cli/chunks/daemon-3DQCKRYO.js +10 -0
- package/dist/cli/chunks/{daemon-ITKDIYMW.js → daemon-IRL7QRNE.js} +3 -3
- package/dist/cli/chunks/{dag-attention-scheduler-T55AXLD6.js → dag-attention-scheduler-ORXSUHPA.js} +2 -2
- package/dist/cli/chunks/{detect-DR7J6K4O.js → detect-RHU62KRI.js} +2 -2
- package/dist/cli/chunks/{dist-node-LAJJBOUT.js → dist-node-3VKV4Z6C.js} +2 -2
- package/dist/cli/chunks/{domain-handler-OMSHCRMK.js → domain-handler-SFIML4FK.js} +2 -2
- package/dist/cli/chunks/{domain-plugins-EQXSKC5K.js → domain-plugins-CJ4FA3OC.js} +2 -2
- package/dist/cli/chunks/{domain-transfer-FKRAGVSW.js → domain-transfer-BCRKPCAA.js} +2 -2
- package/dist/cli/chunks/dream-5AUNJW24.js +2 -0
- package/dist/cli/chunks/{embed-and-insert-pattern-JZFPCNL3.js → embed-and-insert-pattern-VL3HFLPV.js} +2 -2
- package/dist/cli/chunks/{eval-JSNNASBW.js → eval-GGKRI4P5.js} +2 -2
- package/dist/cli/chunks/{experience-capture-middleware-UPD3IZBK.js → experience-capture-middleware-F72TIRQY.js} +3 -3
- package/dist/cli/chunks/{fast-paths-YNMIBS2E.js → fast-paths-7KOOF3MA.js} +2 -2
- package/dist/cli/chunks/{feature-flags-SRLXDKBI.js → feature-flags-FNHBTHBH.js} +2 -2
- package/dist/cli/chunks/{feature-flags-VIR7O4L7.js → feature-flags-IOZEWWFU.js} +2 -2
- package/dist/cli/chunks/file-discovery-AYWF357I.js +2 -0
- package/dist/cli/chunks/{fleet-K2ED46EL.js → fleet-QX5KXTRC.js} +3 -3
- package/dist/cli/chunks/{gnn-wrapper-QCU4ZRYW.js → gnn-wrapper-OH2DOQP7.js} +2 -2
- package/dist/cli/chunks/{heartbeat-handler-YYQI4WZM.js → heartbeat-handler-W67NXTNE.js} +4 -4
- package/dist/cli/chunks/heartbeat-scheduler-7ZIDVXIP.js +2 -0
- package/dist/cli/chunks/hnsw-adapter-P77OC7FM.js +2 -0
- package/dist/cli/chunks/hnsw-index-3LBOTQAW.js +2 -0
- package/dist/cli/chunks/{hnsw-legacy-bridge-C5TJSWTZ.js → hnsw-legacy-bridge-6MLLOGOE.js} +2 -2
- package/dist/cli/chunks/{hnswlib-node-SE3MJJYS.js → hnswlib-node-4UDISJ3G.js} +2 -2
- package/dist/cli/chunks/{hooks-C572SRDH.js → hooks-NOQJWQ4P.js} +10 -10
- package/dist/cli/chunks/hybrid-backend-LOM54PDD.js +2 -0
- package/dist/cli/chunks/{hypergraph-engine-35A6G3M5.js → hypergraph-engine-2OD3APVP.js} +2 -2
- package/dist/cli/chunks/{hypergraph-handler-U2756CWI.js → hypergraph-handler-5AZGMBUM.js} +3 -3
- package/dist/cli/chunks/impact-analyzer-QSDJVBPS.js +2 -0
- package/dist/cli/chunks/init-guard-SMGJ45PW.js +2 -0
- package/dist/cli/chunks/init-handler-5T4MP2NM.js +88 -0
- package/dist/cli/chunks/init-wizard-MK2325JJ.js +2 -0
- package/dist/cli/chunks/kernel-2NJQQ2KT.js +2 -0
- package/dist/cli/chunks/{kilocode-installer-32PX5YH7.js → kilocode-installer-RLZYLVQJ.js} +2 -2
- package/dist/cli/chunks/{kiro-installer-C4ROMMUS.js → kiro-installer-LFZOC7VD.js} +2 -2
- package/dist/cli/chunks/knowledge-graph-SDISHO62.js +2 -0
- package/dist/cli/chunks/{learning-GEPVZGJQ.js → learning-XRPGLUWR.js} +20 -20
- package/dist/cli/chunks/{llm-router-XRKTTJTX.js → llm-router-OMK5HYPH.js} +4 -4
- package/dist/cli/chunks/llm-router-service-YTCMRBAN.js +2 -0
- package/dist/cli/chunks/{load-XVH6HW7E.js → load-XADC7KCU.js} +2 -2
- package/dist/cli/chunks/load-test-RPKHLBCC.js +2 -0
- package/dist/cli/chunks/{mcp-IULSTM4Z.js → mcp-PIBKSSVU.js} +2 -2
- package/dist/cli/chunks/{memory-6K7IAU4T.js → memory-AP7EZERS.js} +5 -5
- package/dist/cli/chunks/memory-backend-BZXFO4JZ.js +2 -0
- package/dist/cli/chunks/{memory-handlers-CG6DRLAW.js → memory-handlers-MOFDNB6E.js} +2 -2
- package/dist/cli/chunks/{multi-model-executor-VZDUYPLX.js → multi-model-executor-7JJ2FZ33.js} +2 -2
- package/dist/cli/chunks/{opencode-installer-QUTXKNH4.js → opencode-installer-ZZZ6EBYJ.js} +2 -2
- package/dist/cli/chunks/{orchestrator-PCKKUWOP.js → orchestrator-2H2YKSGJ.js} +5 -5
- package/dist/cli/chunks/pattern-null-store-4PRPIOR6.js +2 -0
- package/dist/cli/chunks/{pattern-usage-recorder-PX5HQVRL.js → pattern-usage-recorder-7MJJWC2Z.js} +2 -2
- package/dist/cli/chunks/{pipeline-O562GTOG.js → pipeline-LIE5BWQY.js} +2 -2
- package/dist/cli/chunks/{platform-PM7Q2AZS.js → platform-SMYUNLGX.js} +2 -2
- package/dist/cli/chunks/{plugin-OTYTFGPY.js → plugin-LJDIXQNT.js} +2 -2
- package/dist/cli/chunks/{prime-radiant-advanced-wasm-6CFXTHC2.js → prime-radiant-advanced-wasm-RIDNE5D2.js} +2 -2
- package/dist/cli/chunks/project-root-NBIQF63D.js +2 -0
- package/dist/cli/chunks/protocol-executor-BRPGIYWQ.js +2 -0
- package/dist/cli/chunks/{protocol-handler-PPGNSAOS.js → protocol-handler-YVM66DLI.js} +2 -2
- package/dist/cli/chunks/{prove-WQ3BKRZG.js → prove-ZBDT52GD.js} +2 -2
- package/dist/cli/chunks/qe-reasoning-bank-GDZACWKW.js +2 -0
- package/dist/cli/chunks/{quality-C5WUU3AA.js → quality-DUKXGDDO.js} +2 -2
- package/dist/cli/chunks/{quality-gate-WSSRKD5U.js → quality-gate-SM3RXF4V.js} +3 -3
- package/dist/cli/chunks/queen-coordinator-LDKLBPD5.js +2 -0
- package/dist/cli/chunks/{real-embeddings-CFQE7IRQ.js → real-embeddings-4QLQZDB5.js} +2 -2
- package/dist/cli/chunks/{ref-validation-DHKHXVZT.js → ref-validation-M3EO32YQ.js} +2 -2
- package/dist/cli/chunks/{roocode-installer-3PPODABV.js → roocode-installer-S6Q5OLV5.js} +2 -2
- package/dist/cli/chunks/router-H5YSIRH2.js +2 -0
- package/dist/cli/chunks/routing-feedback-5R36TJDH.js +2 -0
- package/dist/cli/chunks/{routing-handler-JNXTGT6T.js → routing-handler-55FMUACP.js} +2 -2
- package/dist/cli/chunks/{ruvector-commands-6YLROPVP.js → ruvector-commands-QATKAAPK.js} +2 -2
- package/dist/cli/chunks/rvf-dual-writer-TT2DBQQQ.js +2 -0
- package/dist/cli/chunks/rvf-migration-adapter-BCLFJKSK.js +2 -0
- package/dist/cli/chunks/{rvf-migration-coordinator-4DWB4WRK.js → rvf-migration-coordinator-RFXFU6JD.js} +2 -2
- package/dist/cli/chunks/rvf-native-adapter-UXI66OQJ.js +2 -0
- package/dist/cli/chunks/{rvf-store-integrity-YKR2ZNBF.js → rvf-store-integrity-PKDVXQAW.js} +2 -2
- package/dist/cli/chunks/safe-db-MSTD2GDH.js +2 -0
- package/dist/cli/chunks/schedule-KST6KIFD.js +2 -0
- package/dist/cli/chunks/scheduler-FTQS6YK3.js +2 -0
- package/dist/cli/chunks/security-CMRB6WA3.js +18 -0
- package/dist/cli/chunks/{shared-rvf-adapter-LNRLFP5I.js → shared-rvf-adapter-YHLLNFHF.js} +2 -2
- package/dist/cli/chunks/{shared-rvf-dual-writer-GWU6YQNS.js → shared-rvf-dual-writer-4BGDVPQ7.js} +2 -2
- package/dist/cli/chunks/sqlite-persistence-ZX5QFDMR.js +2 -0
- package/dist/cli/chunks/{standalone-memory-46KKBSSV.js → standalone-memory-LUHKQAGM.js} +2 -2
- package/dist/cli/chunks/{status-handler-35T5FTDQ.js → status-handler-S6S5PNR7.js} +2 -2
- package/dist/cli/chunks/{structural-health-P7QPQWLO.js → structural-health-PQ7NZAJ4.js} +2 -2
- package/dist/cli/chunks/{sync-W6Z4R4PL.js → sync-Q6KRQXU6.js} +2 -2
- package/dist/cli/chunks/{sync-Y43EWBSY.js → sync-S744AEJC.js} +2 -2
- package/dist/cli/chunks/{task-handler-5CX3ZYT7.js → task-handler-GAMGEHUW.js} +2 -2
- package/dist/cli/chunks/{task-handlers-DQZGOJNE.js → task-handlers-6CRDEELN.js} +3 -3
- package/dist/cli/chunks/{test-TPP53VVV.js → test-FNH67DBK.js} +4 -4
- package/dist/cli/chunks/{test-scheduling-WBV4UMQH.js → test-scheduling-NZA5SHK6.js} +3 -3
- package/dist/cli/chunks/{token-bootstrap-GIIDXHLC.js → token-bootstrap-CXKG55JD.js} +2 -2
- package/dist/cli/chunks/{token-usage-AKK37RB7.js → token-usage-M7WWEDJX.js} +2 -2
- package/dist/cli/chunks/{transformers-7MASPELS.js → transformers-2IFMCK6A.js} +2 -2
- package/dist/cli/chunks/{tree-sitter-wasm-parser-YZKD6UGB.js → tree-sitter-wasm-parser-NMNA6RJC.js} +2 -2
- package/dist/cli/chunks/{types-AZ3BTXDP.js → types-N7FWTOLD.js} +2 -2
- package/dist/cli/chunks/unified-memory-2Z2F446J.js +2 -0
- package/dist/cli/chunks/unified-memory-hnsw-A4EWYPJQ.js +2 -0
- package/dist/cli/chunks/unified-persistence-Z6N6JZFA.js +2 -0
- package/dist/cli/chunks/{upgrade-L7OTDKEK.js → upgrade-KDB5RGL7.js} +2 -2
- package/dist/cli/chunks/{validate-O3QVFIGP.js → validate-KMUV5FUA.js} +2 -2
- package/dist/cli/chunks/{validate-swarm-2UGBGLTX.js → validate-swarm-ANZWRCJU.js} +2 -2
- package/dist/cli/chunks/visual-security-GXYZV7KR.js +2 -0
- package/dist/cli/chunks/{web-tree-sitter-J75IYPRO.js → web-tree-sitter-SXXC4NMS.js} +2 -2
- package/dist/cli/chunks/{windsurf-installer-FQ5DBFCG.js → windsurf-installer-2LWSKMBU.js} +2 -2
- package/dist/cli/chunks/witness-chain-52PEIEGK.js +2 -0
- package/dist/cli/chunks/{witness-chain-I7TN4MXZ.js → witness-chain-JJMSJFZP.js} +2 -2
- package/dist/cli/chunks/{witness-chain-repair-D3NE3NQK.js → witness-chain-repair-OX7VFW6T.js} +2 -2
- package/dist/cli/chunks/{witness-chain-verifier-RU2WOP5M.js → witness-chain-verifier-QLSMXHAZ.js} +2 -2
- package/dist/cli/chunks/{witness-key-manager-IHQB2FR5.js → witness-key-manager-3DS4L7LE.js} +2 -2
- package/dist/cli/chunks/{workflow-6BWTNVV6.js → workflow-ARWAMHD3.js} +4 -4
- package/dist/cli/chunks/workflow-orchestrator-DORMQMG7.js +2 -0
- package/dist/cli/chunks/{wrappers-URVP25VU.js → wrappers-J6KGTUSJ.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/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 +6 -0
- package/dist/domains/defect-intelligence/services/defect-predictor.js +9 -6
- 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 +17 -6
- 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/mcp/bundle.js +874 -874
- 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/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-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/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
|
@@ -2,13 +2,18 @@
|
|
|
2
2
|
* Agentic QE v3 - Quality Gate Worker
|
|
3
3
|
* ADR-014: Background Workers for QE Monitoring
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
5
|
+
* Continuously evaluates the measured quality gate and tracks its verdict.
|
|
6
|
+
*
|
|
7
|
+
* #1043: the gate is the canonical measured gate — the same evidence
|
|
8
|
+
* validation (`inspectQualityEvidence`) and thresholds
|
|
9
|
+
* (`evaluateQualityEvidence` / `resolveQualityThresholds`) the quality_assess
|
|
10
|
+
* tool uses. When any metric lacks usable evidence (absent, stale, malformed)
|
|
11
|
+
* the gate is not evaluated: nothing is stored and an info finding names the
|
|
12
|
+
* unmeasured metrics. A status without the measured stamp (the invented one
|
|
13
|
+
* written by <= 3.15.6) is ignored and replaced by the next measured verdict.
|
|
10
14
|
*/
|
|
11
15
|
import { BaseWorker } from '../base-worker.js';
|
|
16
|
+
import { INSUFFICIENT_EVIDENCE, QUALITY_METRICS, describeMissingMetrics, evaluateQualityEvidence, inspectQualityEvidence, } from '../../domains/quality-assessment/quality-evidence.js';
|
|
12
17
|
const CONFIG = {
|
|
13
18
|
id: 'quality-gate',
|
|
14
19
|
name: 'Quality Gate Evaluator',
|
|
@@ -21,6 +26,21 @@ const CONFIG = {
|
|
|
21
26
|
retryCount: 2,
|
|
22
27
|
retryDelayMs: 5000,
|
|
23
28
|
};
|
|
29
|
+
const CURRENT_KEY = 'quality-gate:current';
|
|
30
|
+
const HISTORY_KEY = 'quality-gate:history';
|
|
31
|
+
const SCHEMA_VERSION = 1;
|
|
32
|
+
const MAX_HISTORY = 100;
|
|
33
|
+
/** The stored status when it is a measured verdict, else `null`. */
|
|
34
|
+
function measuredStatus(raw) {
|
|
35
|
+
if (!raw || typeof raw !== 'object')
|
|
36
|
+
return null;
|
|
37
|
+
const r = raw;
|
|
38
|
+
if (r.measured !== true || r.schemaVersion !== SCHEMA_VERSION || typeof r.passed !== 'boolean'
|
|
39
|
+
|| !Array.isArray(r.checks))
|
|
40
|
+
return null;
|
|
41
|
+
return r;
|
|
42
|
+
}
|
|
43
|
+
const comparator = (check) => (check.direction === 'min' ? '>=' : '<=');
|
|
24
44
|
export class QualityGateWorker extends BaseWorker {
|
|
25
45
|
constructor() {
|
|
26
46
|
super(CONFIG);
|
|
@@ -30,318 +50,156 @@ export class QualityGateWorker extends BaseWorker {
|
|
|
30
50
|
context.logger.info('Starting quality gate evaluation');
|
|
31
51
|
const findings = [];
|
|
32
52
|
const recommendations = [];
|
|
33
|
-
|
|
34
|
-
const
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
53
|
+
const { values, problems } = await inspectQualityEvidence(context.memory);
|
|
54
|
+
const measuredValues = Object.fromEntries(QUALITY_METRICS.map((m) => [m, values[m] ?? 'unmeasured']));
|
|
55
|
+
if (problems.length > 0) {
|
|
56
|
+
const unmeasured = problems.map((p) => p.metric);
|
|
57
|
+
findings.push({
|
|
58
|
+
type: 'quality-gate-insufficient-evidence',
|
|
59
|
+
severity: 'info',
|
|
60
|
+
domain: 'quality-assessment',
|
|
61
|
+
title: 'Quality Gate Not Evaluated: Insufficient Evidence',
|
|
62
|
+
description: `${unmeasured.length} of ${QUALITY_METRICS.length} gate metrics have no usable measured evidence ` +
|
|
63
|
+
`(${unmeasured.join(', ')}), so no verdict was reached and nothing was stored.`,
|
|
64
|
+
context: { status: INSUFFICIENT_EVIDENCE, unmeasured, problems },
|
|
65
|
+
});
|
|
66
|
+
for (const advice of describeMissingMetrics(unmeasured)) {
|
|
67
|
+
recommendations.push({
|
|
68
|
+
priority: 'p3',
|
|
69
|
+
domain: 'quality-assessment',
|
|
70
|
+
action: 'Record Measured Quality Evidence',
|
|
71
|
+
description: advice,
|
|
72
|
+
estimatedImpact: 'medium',
|
|
73
|
+
effort: 'low',
|
|
74
|
+
autoFixable: false,
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
context.logger.info('Quality gate evaluation complete', { status: INSUFFICIENT_EVIDENCE, unmeasured });
|
|
78
|
+
return this.createResult(Date.now() - startTime, {
|
|
79
|
+
itemsAnalyzed: 0,
|
|
80
|
+
issuesFound: 0,
|
|
81
|
+
healthScore: 100,
|
|
82
|
+
trend: 'stable',
|
|
83
|
+
domainMetrics: {
|
|
84
|
+
gateStatus: INSUFFICIENT_EVIDENCE,
|
|
85
|
+
gatePassed: 'unmeasured',
|
|
86
|
+
releaseReady: 'unmeasured',
|
|
87
|
+
unmeasuredMetrics: unmeasured.length,
|
|
88
|
+
...measuredValues,
|
|
89
|
+
},
|
|
90
|
+
}, findings, recommendations);
|
|
91
|
+
}
|
|
92
|
+
const evaluation = evaluateQualityEvidence(values);
|
|
93
|
+
const failed = evaluation.checks.filter((c) => !c.passed);
|
|
94
|
+
const status = {
|
|
95
|
+
measured: true,
|
|
96
|
+
schemaVersion: SCHEMA_VERSION,
|
|
97
|
+
evaluatedAt: new Date().toISOString(),
|
|
98
|
+
passed: evaluation.passed,
|
|
99
|
+
passedChecks: evaluation.checks.length - failed.length,
|
|
100
|
+
failedChecks: failed.length,
|
|
101
|
+
checks: evaluation.checks,
|
|
102
|
+
};
|
|
103
|
+
this.analyzeGateResults(status, findings, recommendations);
|
|
104
|
+
await this.compareToPrevious(context, status, findings);
|
|
105
|
+
await context.memory.set(CURRENT_KEY, status);
|
|
106
|
+
await context.memory.set('quality-gate:lastCheck', status.evaluatedAt);
|
|
107
|
+
const stored = await context.memory.get(HISTORY_KEY);
|
|
108
|
+
const history = Array.isArray(stored) ? stored : [];
|
|
109
|
+
history.push(status);
|
|
110
|
+
while (history.length > MAX_HISTORY)
|
|
48
111
|
history.shift();
|
|
49
|
-
await context.memory.set(
|
|
50
|
-
const healthScore = this.calculateHealthScore(
|
|
112
|
+
await context.memory.set(HISTORY_KEY, history);
|
|
113
|
+
const healthScore = this.calculateHealthScore(status);
|
|
51
114
|
context.logger.info('Quality gate evaluation complete', {
|
|
52
115
|
healthScore,
|
|
53
|
-
passed:
|
|
54
|
-
|
|
55
|
-
blockers: gateStatus.blockers,
|
|
116
|
+
passed: status.passed,
|
|
117
|
+
failedChecks: status.failedChecks,
|
|
56
118
|
});
|
|
57
119
|
return this.createResult(Date.now() - startTime, {
|
|
58
|
-
itemsAnalyzed:
|
|
59
|
-
issuesFound:
|
|
120
|
+
itemsAnalyzed: status.checks.length,
|
|
121
|
+
issuesFound: status.failedChecks,
|
|
60
122
|
healthScore,
|
|
61
123
|
trend: 'stable',
|
|
62
124
|
domainMetrics: {
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
125
|
+
gateStatus: 'evaluated',
|
|
126
|
+
gatePassed: status.passed ? 'YES' : 'NO',
|
|
127
|
+
releaseReady: status.passed ? 'YES' : 'NO',
|
|
128
|
+
passedChecks: status.passedChecks,
|
|
129
|
+
failedChecks: status.failedChecks,
|
|
130
|
+
...measuredValues,
|
|
69
131
|
},
|
|
70
132
|
}, findings, recommendations);
|
|
71
133
|
}
|
|
72
|
-
async evaluateQualityGates(_context) {
|
|
73
|
-
// Define quality gate rules
|
|
74
|
-
const rules = [
|
|
75
|
-
// Coverage rules
|
|
76
|
-
{
|
|
77
|
-
id: 'coverage-line',
|
|
78
|
-
name: 'Line Coverage',
|
|
79
|
-
category: 'coverage',
|
|
80
|
-
threshold: 80,
|
|
81
|
-
operator: 'gte',
|
|
82
|
-
currentValue: 78.5,
|
|
83
|
-
unit: '%',
|
|
84
|
-
blocking: true,
|
|
85
|
-
},
|
|
86
|
-
{
|
|
87
|
-
id: 'coverage-branch',
|
|
88
|
-
name: 'Branch Coverage',
|
|
89
|
-
category: 'coverage',
|
|
90
|
-
threshold: 70,
|
|
91
|
-
operator: 'gte',
|
|
92
|
-
currentValue: 65.2,
|
|
93
|
-
unit: '%',
|
|
94
|
-
blocking: false,
|
|
95
|
-
},
|
|
96
|
-
// Reliability rules
|
|
97
|
-
{
|
|
98
|
-
id: 'reliability-test-pass-rate',
|
|
99
|
-
name: 'Test Pass Rate',
|
|
100
|
-
category: 'reliability',
|
|
101
|
-
threshold: 95,
|
|
102
|
-
operator: 'gte',
|
|
103
|
-
currentValue: 98.2,
|
|
104
|
-
unit: '%',
|
|
105
|
-
blocking: true,
|
|
106
|
-
},
|
|
107
|
-
{
|
|
108
|
-
id: 'reliability-flaky-tests',
|
|
109
|
-
name: 'Flaky Test Count',
|
|
110
|
-
category: 'reliability',
|
|
111
|
-
threshold: 5,
|
|
112
|
-
operator: 'lte',
|
|
113
|
-
currentValue: 3,
|
|
114
|
-
unit: 'tests',
|
|
115
|
-
blocking: false,
|
|
116
|
-
},
|
|
117
|
-
// Security rules
|
|
118
|
-
{
|
|
119
|
-
id: 'security-critical-vulns',
|
|
120
|
-
name: 'Critical Vulnerabilities',
|
|
121
|
-
category: 'security',
|
|
122
|
-
threshold: 0,
|
|
123
|
-
operator: 'eq',
|
|
124
|
-
currentValue: 1,
|
|
125
|
-
unit: 'issues',
|
|
126
|
-
blocking: true,
|
|
127
|
-
},
|
|
128
|
-
{
|
|
129
|
-
id: 'security-high-vulns',
|
|
130
|
-
name: 'High Vulnerabilities',
|
|
131
|
-
category: 'security',
|
|
132
|
-
threshold: 3,
|
|
133
|
-
operator: 'lte',
|
|
134
|
-
currentValue: 2,
|
|
135
|
-
unit: 'issues',
|
|
136
|
-
blocking: false,
|
|
137
|
-
},
|
|
138
|
-
// Maintainability rules
|
|
139
|
-
{
|
|
140
|
-
id: 'maintainability-complexity',
|
|
141
|
-
name: 'Average Complexity',
|
|
142
|
-
category: 'maintainability',
|
|
143
|
-
threshold: 15,
|
|
144
|
-
operator: 'lte',
|
|
145
|
-
currentValue: 12,
|
|
146
|
-
unit: 'score',
|
|
147
|
-
blocking: false,
|
|
148
|
-
},
|
|
149
|
-
{
|
|
150
|
-
id: 'maintainability-duplication',
|
|
151
|
-
name: 'Code Duplication',
|
|
152
|
-
category: 'maintainability',
|
|
153
|
-
threshold: 5,
|
|
154
|
-
operator: 'lte',
|
|
155
|
-
currentValue: 3.2,
|
|
156
|
-
unit: '%',
|
|
157
|
-
blocking: false,
|
|
158
|
-
},
|
|
159
|
-
// Performance rules
|
|
160
|
-
{
|
|
161
|
-
id: 'performance-test-duration',
|
|
162
|
-
name: 'Avg Test Duration',
|
|
163
|
-
category: 'performance',
|
|
164
|
-
threshold: 500,
|
|
165
|
-
operator: 'lte',
|
|
166
|
-
currentValue: 245,
|
|
167
|
-
unit: 'ms',
|
|
168
|
-
blocking: false,
|
|
169
|
-
},
|
|
170
|
-
];
|
|
171
|
-
// Evaluate each rule
|
|
172
|
-
let passedRules = 0;
|
|
173
|
-
let failedRules = 0;
|
|
174
|
-
let blockers = 0;
|
|
175
|
-
let warnings = 0;
|
|
176
|
-
for (const rule of rules) {
|
|
177
|
-
const passed = this.evaluateRule(rule);
|
|
178
|
-
if (passed) {
|
|
179
|
-
passedRules++;
|
|
180
|
-
}
|
|
181
|
-
else {
|
|
182
|
-
failedRules++;
|
|
183
|
-
if (rule.blocking) {
|
|
184
|
-
blockers++;
|
|
185
|
-
}
|
|
186
|
-
else {
|
|
187
|
-
warnings++;
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
return {
|
|
192
|
-
passed: blockers === 0,
|
|
193
|
-
passedRules,
|
|
194
|
-
failedRules,
|
|
195
|
-
blockers,
|
|
196
|
-
warnings,
|
|
197
|
-
releaseReady: blockers === 0 && warnings <= 2,
|
|
198
|
-
rules,
|
|
199
|
-
};
|
|
200
|
-
}
|
|
201
|
-
evaluateRule(rule) {
|
|
202
|
-
switch (rule.operator) {
|
|
203
|
-
case 'gte':
|
|
204
|
-
return rule.currentValue >= rule.threshold;
|
|
205
|
-
case 'lte':
|
|
206
|
-
return rule.currentValue <= rule.threshold;
|
|
207
|
-
case 'eq':
|
|
208
|
-
return rule.currentValue === rule.threshold;
|
|
209
|
-
default:
|
|
210
|
-
return false;
|
|
211
|
-
}
|
|
212
|
-
}
|
|
213
134
|
analyzeGateResults(status, findings, recommendations) {
|
|
214
|
-
|
|
215
|
-
for (const
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
type: 'quality-gate-failure',
|
|
220
|
-
severity,
|
|
221
|
-
domain: 'quality-assessment',
|
|
222
|
-
title: `Quality Gate Failed: ${rule.name}`,
|
|
223
|
-
description: `${rule.name} is ${rule.currentValue}${rule.unit}, threshold is ${rule.operator === 'gte' ? '>=' : rule.operator === 'lte' ? '<=' : '='} ${rule.threshold}${rule.unit}`,
|
|
224
|
-
context: {
|
|
225
|
-
ruleId: rule.id,
|
|
226
|
-
category: rule.category,
|
|
227
|
-
currentValue: rule.currentValue,
|
|
228
|
-
threshold: rule.threshold,
|
|
229
|
-
blocking: rule.blocking,
|
|
230
|
-
},
|
|
231
|
-
});
|
|
232
|
-
}
|
|
233
|
-
}
|
|
234
|
-
// Category-specific recommendations
|
|
235
|
-
const coverageFailures = status.rules
|
|
236
|
-
.filter(r => r.category === 'coverage' && !this.evaluateRule(r));
|
|
237
|
-
if (coverageFailures.length > 0) {
|
|
238
|
-
recommendations.push({
|
|
239
|
-
priority: coverageFailures.some(r => r.blocking) ? 'p0' : 'p2',
|
|
240
|
-
domain: 'quality-assessment',
|
|
241
|
-
action: 'Improve Test Coverage',
|
|
242
|
-
description: `${coverageFailures.length} coverage gates are failing. Add tests to increase coverage.`,
|
|
243
|
-
estimatedImpact: 'high',
|
|
244
|
-
effort: 'medium',
|
|
245
|
-
autoFixable: true,
|
|
246
|
-
});
|
|
247
|
-
}
|
|
248
|
-
const securityFailures = status.rules
|
|
249
|
-
.filter(r => r.category === 'security' && !this.evaluateRule(r));
|
|
250
|
-
if (securityFailures.length > 0) {
|
|
251
|
-
recommendations.push({
|
|
252
|
-
priority: 'p0',
|
|
135
|
+
const failed = status.checks.filter((c) => !c.passed);
|
|
136
|
+
for (const check of failed) {
|
|
137
|
+
findings.push({
|
|
138
|
+
type: 'quality-gate-failure',
|
|
139
|
+
severity: check.severity,
|
|
253
140
|
domain: 'quality-assessment',
|
|
254
|
-
|
|
255
|
-
description:
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
141
|
+
title: `Quality Gate Failed: ${check.name}`,
|
|
142
|
+
description: `Measured ${check.name} is ${check.value}, threshold is ${comparator(check)} ${check.threshold}`,
|
|
143
|
+
context: {
|
|
144
|
+
metric: check.name,
|
|
145
|
+
value: check.value,
|
|
146
|
+
threshold: check.threshold,
|
|
147
|
+
direction: check.direction,
|
|
148
|
+
},
|
|
259
149
|
});
|
|
260
150
|
}
|
|
261
|
-
|
|
262
|
-
checkBlockers(status, findings, recommendations) {
|
|
263
|
-
if (status.blockers > 0) {
|
|
151
|
+
if (failed.length > 0) {
|
|
264
152
|
findings.push({
|
|
265
153
|
type: 'release-blocked',
|
|
266
|
-
severity: 'critical',
|
|
154
|
+
severity: failed.some((c) => c.severity === 'critical') ? 'critical' : 'high',
|
|
267
155
|
domain: 'quality-assessment',
|
|
268
156
|
title: 'Release Blocked',
|
|
269
|
-
description: `${
|
|
270
|
-
context: {
|
|
271
|
-
blockers: status.blockers,
|
|
272
|
-
blockingRules: status.rules
|
|
273
|
-
.filter(r => r.blocking && !this.evaluateRule(r))
|
|
274
|
-
.map(r => r.name),
|
|
275
|
-
},
|
|
157
|
+
description: `${failed.length} measured quality checks fail the gate`,
|
|
158
|
+
context: { failingMetrics: failed.map((c) => c.name) },
|
|
276
159
|
});
|
|
277
160
|
recommendations.push({
|
|
278
161
|
priority: 'p0',
|
|
279
162
|
domain: 'quality-assessment',
|
|
280
|
-
action: 'Resolve
|
|
281
|
-
description:
|
|
163
|
+
action: 'Resolve Failing Quality Checks',
|
|
164
|
+
description: `Fix ${failed.map((c) => c.name).join(', ')} before proceeding with release.`,
|
|
282
165
|
estimatedImpact: 'high',
|
|
283
166
|
effort: 'medium',
|
|
284
167
|
autoFixable: false,
|
|
285
168
|
});
|
|
286
169
|
}
|
|
287
|
-
else if (!status.releaseReady) {
|
|
288
|
-
findings.push({
|
|
289
|
-
type: 'release-warning',
|
|
290
|
-
severity: 'medium',
|
|
291
|
-
domain: 'quality-assessment',
|
|
292
|
-
title: 'Release Not Recommended',
|
|
293
|
-
description: `No blockers, but ${status.warnings} warnings suggest caution`,
|
|
294
|
-
context: { warnings: status.warnings },
|
|
295
|
-
});
|
|
296
|
-
}
|
|
297
170
|
}
|
|
298
|
-
|
|
299
|
-
|
|
171
|
+
/** Compare with the previous verdict — only a measured one (#1043). */
|
|
172
|
+
async compareToPrevious(context, current, findings) {
|
|
173
|
+
const previous = measuredStatus(await context.memory.get(CURRENT_KEY));
|
|
300
174
|
if (!previous)
|
|
301
175
|
return;
|
|
302
|
-
// Check for regression
|
|
303
176
|
if (previous.passed && !current.passed) {
|
|
304
177
|
findings.push({
|
|
305
178
|
type: 'quality-gate-regression',
|
|
306
179
|
severity: 'high',
|
|
307
180
|
domain: 'quality-assessment',
|
|
308
181
|
title: 'Quality Gate Regression',
|
|
309
|
-
description: '
|
|
310
|
-
context: {
|
|
311
|
-
previousBlockers: previous.blockers,
|
|
312
|
-
currentBlockers: current.blockers,
|
|
313
|
-
},
|
|
182
|
+
description: 'The measured quality gate was passing previously but is now failing',
|
|
183
|
+
context: { previousEvaluatedAt: previous.evaluatedAt, currentFailedChecks: current.failedChecks },
|
|
314
184
|
});
|
|
315
185
|
}
|
|
316
|
-
// Check for improvement
|
|
317
186
|
if (!previous.passed && current.passed) {
|
|
318
187
|
findings.push({
|
|
319
188
|
type: 'quality-gate-improvement',
|
|
320
189
|
severity: 'info',
|
|
321
190
|
domain: 'quality-assessment',
|
|
322
|
-
title: 'Quality
|
|
323
|
-
description: '
|
|
324
|
-
context: {
|
|
325
|
-
previousFailures: previous.failedRules,
|
|
326
|
-
currentFailures: current.failedRules,
|
|
327
|
-
},
|
|
191
|
+
title: 'Quality Gate Now Passing',
|
|
192
|
+
description: 'The measured quality gate is now passing after previous failures',
|
|
193
|
+
context: { previousEvaluatedAt: previous.evaluatedAt },
|
|
328
194
|
});
|
|
329
195
|
}
|
|
330
196
|
}
|
|
331
197
|
calculateHealthScore(status) {
|
|
332
|
-
if (status.
|
|
198
|
+
if (status.checks.length === 0)
|
|
333
199
|
return 100;
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
let score = passRate * 70;
|
|
337
|
-
// Penalty for blockers
|
|
338
|
-
score -= status.blockers * 15;
|
|
339
|
-
// Penalty for warnings
|
|
340
|
-
score -= status.warnings * 5;
|
|
341
|
-
// Bonus for release readiness
|
|
342
|
-
if (status.releaseReady) {
|
|
200
|
+
let score = (status.passedChecks / status.checks.length) * 90;
|
|
201
|
+
if (status.passed)
|
|
343
202
|
score += 10;
|
|
344
|
-
}
|
|
345
203
|
return Math.max(0, Math.min(100, Math.round(score)));
|
|
346
204
|
}
|
|
347
205
|
}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agentic QE v3 - security-scan worker: recorded scan parsing (#1043, #1049)
|
|
3
|
+
*
|
|
4
|
+
* Parses the `security:scan:<id>` records the security-compliance domain writes
|
|
5
|
+
* (OSV dependency scans and SAST scans) into what the security-scan worker
|
|
6
|
+
* reports. Nothing is filled in: a field a record does not carry stays absent.
|
|
7
|
+
*/
|
|
8
|
+
export declare const SCHEMA_VERSION = 1;
|
|
9
|
+
/** The dependency scanner keeps its records for 7 days; nothing older is current. */
|
|
10
|
+
export declare const MAX_SCAN_AGE_MS: number;
|
|
11
|
+
export type Severity = 'critical' | 'high' | 'medium' | 'low' | 'informational';
|
|
12
|
+
export declare const SEVERITIES: readonly Severity[];
|
|
13
|
+
export declare const CVE_ID: RegExp;
|
|
14
|
+
export interface ScanCounts {
|
|
15
|
+
critical: number;
|
|
16
|
+
high: number;
|
|
17
|
+
medium: number;
|
|
18
|
+
low: number;
|
|
19
|
+
informational: number;
|
|
20
|
+
}
|
|
21
|
+
/** A vulnerability as a recorded scan reported it; nothing is filled in. */
|
|
22
|
+
export interface ReportedVulnerability {
|
|
23
|
+
severity: Severity;
|
|
24
|
+
title: string;
|
|
25
|
+
description: string;
|
|
26
|
+
category: string;
|
|
27
|
+
/** Dependency name (dependency scan) — only when the record names it. */
|
|
28
|
+
package?: string;
|
|
29
|
+
/** `file:line` (SAST) — only when the record locates it. */
|
|
30
|
+
location?: string;
|
|
31
|
+
/** CVE id exactly as the advisory carried it; absent when it carried none. */
|
|
32
|
+
cve?: string;
|
|
33
|
+
fixedIn?: string;
|
|
34
|
+
references: string[];
|
|
35
|
+
}
|
|
36
|
+
export interface RecordedScan {
|
|
37
|
+
scanId: string;
|
|
38
|
+
scannedAt: string;
|
|
39
|
+
summary: ScanCounts;
|
|
40
|
+
/** Vulnerabilities the record lists (SAST keeps only critical/high). */
|
|
41
|
+
vulnerabilities: ReportedVulnerability[];
|
|
42
|
+
/** Total the scan found, including ones the record does not list. */
|
|
43
|
+
total: number;
|
|
44
|
+
}
|
|
45
|
+
/** A package the OSV lookup could not check (#1049 record contract). */
|
|
46
|
+
export interface UncheckedPackage {
|
|
47
|
+
name: string;
|
|
48
|
+
version: string;
|
|
49
|
+
reason: string;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* A dependency scan whose OSV lookup was not complete (#1049): `incomplete`,
|
|
53
|
+
* `failed`, or a pre-#1049 record without `status` — which cannot be told
|
|
54
|
+
* apart from a failed lookup recorded as clean. Never "0 vulnerabilities".
|
|
55
|
+
*/
|
|
56
|
+
export interface IncompleteDependencyScan {
|
|
57
|
+
scan: RecordedScan;
|
|
58
|
+
status: 'incomplete' | 'failed' | 'unknown';
|
|
59
|
+
error?: string;
|
|
60
|
+
uncheckedPackages: UncheckedPackage[];
|
|
61
|
+
/** Packages the lookup did check, when the record states it. */
|
|
62
|
+
packagesChecked?: number;
|
|
63
|
+
}
|
|
64
|
+
/** The `security:lastScan` record: only scans that actually ran (#1043). */
|
|
65
|
+
export interface MeasuredSecurityScan {
|
|
66
|
+
measured: true;
|
|
67
|
+
schemaVersion: typeof SCHEMA_VERSION;
|
|
68
|
+
evaluatedAt: string;
|
|
69
|
+
dependency: (RecordedScan & {
|
|
70
|
+
source: 'osv';
|
|
71
|
+
}) | null;
|
|
72
|
+
code: (RecordedScan & {
|
|
73
|
+
source: 'sast';
|
|
74
|
+
}) | null;
|
|
75
|
+
}
|
|
76
|
+
export declare const isCount: (v: unknown) => v is number;
|
|
77
|
+
export declare const isRecord: (v: unknown) => v is Record<string, unknown>;
|
|
78
|
+
export declare function parseCounts(raw: unknown): ScanCounts | null;
|
|
79
|
+
/** `scannedAt` when the record's timestamp is valid, not in the future and within the scanner's retention. */
|
|
80
|
+
export declare function parseScannedAt(raw: unknown, now: number): string | null;
|
|
81
|
+
export declare function parseVulnerability(raw: unknown, kind: 'dependency' | 'sast'): ReportedVulnerability | null;
|
|
82
|
+
export declare function parseUnchecked(raw: unknown): UncheckedPackage[];
|
|
83
|
+
/**
|
|
84
|
+
* #1049: a dependency scan is a measurement only when its OSV lookup checked
|
|
85
|
+
* every requested package (`measured: true` and `status: 'complete'`).
|
|
86
|
+
*/
|
|
87
|
+
export declare function dependencyCompleteness(raw: Record<string, unknown>): {
|
|
88
|
+
complete: true;
|
|
89
|
+
} | {
|
|
90
|
+
complete: false;
|
|
91
|
+
status: IncompleteDependencyScan['status'];
|
|
92
|
+
error?: string;
|
|
93
|
+
uncheckedPackages: UncheckedPackage[];
|
|
94
|
+
packagesChecked?: number;
|
|
95
|
+
};
|
|
96
|
+
export declare const SEVERITY_LABEL: Record<Severity, string>;
|
|
97
|
+
/** Health penalty for the real critical/high advisories of a partial dependency scan (#1049). */
|
|
98
|
+
export declare function partialDependencyPenalty(incomplete: IncompleteDependencyScan | null): number;
|
|
99
|
+
/** What a partial dependency scan did check; the dependency totals stay 'unmeasured' (#1049). */
|
|
100
|
+
export declare function partialDependencyMetrics(incomplete: IncompleteDependencyScan | null): Record<string, number>;
|
|
101
|
+
export type ParsedScan = {
|
|
102
|
+
kind: 'sast';
|
|
103
|
+
scan: RecordedScan;
|
|
104
|
+
} | {
|
|
105
|
+
kind: 'dependency';
|
|
106
|
+
scan: RecordedScan;
|
|
107
|
+
completeness: ReturnType<typeof dependencyCompleteness>;
|
|
108
|
+
};
|
|
109
|
+
/** A recorded dependency (OSV) or SAST scan, or `null` when the record is not one. */
|
|
110
|
+
export declare function parseRecordedScan(raw: unknown, now: number): ParsedScan | null;
|
|
111
|
+
//# sourceMappingURL=security-scan-records.d.ts.map
|