agentic-qe 3.15.12 → 3.15.13
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 +118 -0
- package/assets/skills/skills-manifest.json +1 -1
- package/dist/cli/bundle.js +6 -6
- package/dist/cli/chunks/adapter-KCQDVYY2.js +2 -0
- package/dist/cli/chunks/{agent-booster-wasm-5VZCKTIJ.js → agent-booster-wasm-6RRQWMNE.js} +2 -2
- package/dist/cli/chunks/{agent-handler-K3C6CQCD.js → agent-handler-AOH6TV7W.js} +2 -2
- package/dist/cli/chunks/{agent-memory-branch-NVFQ25WS.js → agent-memory-branch-2P54SF5N.js} +2 -2
- package/dist/cli/chunks/aqe-learning-engine-SAQOHSGN.js +2 -0
- package/dist/cli/chunks/{arena-QGWIJADQ.js → arena-NSVFCAF5.js} +2 -2
- package/dist/cli/chunks/{arena-TSZVDSXS.js → arena-X6MOGQHA.js} +4 -4
- package/dist/cli/chunks/{audit-KIEE2SHJ.js → audit-27DJLQNM.js} +3 -3
- package/dist/cli/chunks/base-WCACU3FN.js +2 -0
- package/dist/cli/chunks/{better-sqlite3-BNB32NW3.js → better-sqlite3-BU5GXILS.js} +2 -2
- package/dist/cli/chunks/{brain-handler-MPC5SPYI.js → brain-handler-GTQNHHZS.js} +3 -3
- package/dist/cli/chunks/{branch-enumerator-LZ7UXKAY.js → branch-enumerator-5CLULOCU.js} +2 -2
- package/dist/cli/chunks/{browser-VDHAW4RK.js → browser-R4DMU3LN.js} +2 -2
- package/dist/cli/chunks/browser-workflow-G6IASEAP.js +2 -0
- package/dist/cli/chunks/{chunk-QUJJYTJH.js → chunk-2G7TVT6W.js} +2 -2
- package/dist/cli/chunks/{chunk-FAGKBOX2.js → chunk-32ZMWEP3.js} +2 -2
- package/dist/cli/chunks/{chunk-FNUFTWEO.js → chunk-3AN5TNGD.js} +3 -3
- package/dist/cli/chunks/{chunk-JOWUS2X5.js → chunk-3LJ7LQMV.js} +1 -1
- package/dist/cli/chunks/{chunk-O4QJMANM.js → chunk-3QZEGE67.js} +1 -1
- package/dist/cli/chunks/{chunk-ICKUINKD.js → chunk-3RZV5DGO.js} +2 -2
- package/dist/cli/chunks/{chunk-W4II6SIH.js → chunk-3Y2ROSCL.js} +2 -2
- package/dist/cli/chunks/{chunk-L7NGKANW.js → chunk-3Y7TJFHU.js} +2 -2
- package/dist/cli/chunks/{chunk-UUZZXHUF.js → chunk-3YNLWPBF.js} +2 -2
- package/dist/cli/chunks/{chunk-JR6CUKAI.js → chunk-42J34YG4.js} +2 -2
- package/dist/cli/chunks/{chunk-65TH6RPD.js → chunk-4OVC4RIL.js} +1 -1
- package/dist/cli/chunks/{chunk-DRCBRUGN.js → chunk-526QYFJU.js} +2 -2
- package/dist/cli/chunks/{chunk-MCPXNUDK.js → chunk-5FKWCZNF.js} +2 -2
- package/dist/cli/chunks/{chunk-NX4BCSOZ.js → chunk-5K26BEYB.js} +2 -2
- package/dist/cli/chunks/{chunk-MCPEC6OO.js → chunk-5MDERQH3.js} +1 -1
- package/dist/cli/chunks/{chunk-7JFDLL2F.js → chunk-5VMAV6T6.js} +1 -1
- package/dist/cli/chunks/{chunk-5TAEW5OV.js → chunk-5ZGM3RMH.js} +1 -1
- package/dist/cli/chunks/{chunk-SG2TX72G.js → chunk-6KATY3KS.js} +2 -2
- package/dist/cli/chunks/{chunk-KA5SHLMW.js → chunk-6Z7PRBSG.js} +2 -2
- package/dist/cli/chunks/{chunk-LFBA735S.js → chunk-72ASBE35.js} +3 -3
- package/dist/cli/chunks/{chunk-TOWOJGEI.js → chunk-756CGMEH.js} +1 -1
- package/dist/cli/chunks/{chunk-IVTQF55W.js → chunk-75RDHBAX.js} +3 -3
- package/dist/cli/chunks/{chunk-66PXR3NI.js → chunk-7CMTY45A.js} +2 -2
- package/dist/cli/chunks/{chunk-WLRU6ESI.js → chunk-7JUC2MVZ.js} +2 -2
- package/dist/cli/chunks/{chunk-SBHM5X2S.js → chunk-7NA7JXNB.js} +2 -2
- package/dist/cli/chunks/{chunk-HZBXJFGN.js → chunk-7PLIEBY7.js} +2 -2
- package/dist/cli/chunks/{chunk-2ASQRBK2.js → chunk-7YTGHGK4.js} +2 -2
- package/dist/cli/chunks/{chunk-SQVZ3TRU.js → chunk-A64JFBWI.js} +2 -2
- package/dist/cli/chunks/{chunk-2PPSS4JD.js → chunk-AL6FBH3E.js} +2 -2
- package/dist/cli/chunks/{chunk-3IU4LDZR.js → chunk-AQSVJNEH.js} +2 -2
- package/dist/cli/chunks/{chunk-C74M4WUI.js → chunk-ARJW4I2O.js} +2 -2
- package/dist/cli/chunks/{chunk-VF7FTD64.js → chunk-ASQYASNV.js} +1 -1
- package/dist/cli/chunks/{chunk-HLGFHHWV.js → chunk-BEGR4D6N.js} +2 -2
- package/dist/cli/chunks/{chunk-EN7GRVEQ.js → chunk-BK577VL7.js} +2 -2
- package/dist/cli/chunks/{chunk-KGA7VAI4.js → chunk-BLSLEVDI.js} +2 -2
- package/dist/cli/chunks/{chunk-HM3LSFTY.js → chunk-BTVEYBW2.js} +2 -2
- package/dist/cli/chunks/{chunk-J7Y7ZBIT.js → chunk-C6JTLKG7.js} +5 -5
- package/dist/cli/chunks/{chunk-PTBOLBM4.js → chunk-C7JM7CD3.js} +2 -2
- package/dist/cli/chunks/{chunk-IL7GQNNE.js → chunk-CCMKSHAT.js} +2 -2
- package/dist/cli/chunks/{chunk-23PQF7NN.js → chunk-CE7B5LU7.js} +1 -1
- package/dist/cli/chunks/{chunk-BMG2JLSQ.js → chunk-CM4LSLKR.js} +2 -2
- package/dist/cli/chunks/chunk-CRWPZT74.js +62 -0
- package/dist/cli/chunks/{chunk-4HWUECVD.js → chunk-CT6SAVXQ.js} +2 -2
- package/dist/cli/chunks/chunk-CV77DMDQ.js +2 -0
- package/dist/cli/chunks/{chunk-CU36D7TN.js → chunk-DFUASIKA.js} +2 -2
- package/dist/cli/chunks/{chunk-T4EN5VVK.js → chunk-DLD7RUZ4.js} +2 -2
- package/dist/cli/chunks/{chunk-IA55PFLG.js → chunk-DNDL7SOS.js} +2 -2
- package/dist/cli/chunks/{chunk-6QRI3JVE.js → chunk-DVGRPK7A.js} +2 -2
- package/dist/cli/chunks/{chunk-UREDS662.js → chunk-E56B6IDX.js} +2 -2
- package/dist/cli/chunks/{chunk-ZGROHCOW.js → chunk-E7CLYGS7.js} +1 -1
- package/dist/cli/chunks/{chunk-YNVEDFPQ.js → chunk-EXGMJFAT.js} +1 -1
- package/dist/cli/chunks/{chunk-JRYWLOBD.js → chunk-F3YS57NF.js} +2 -2
- package/dist/cli/chunks/{chunk-ZYOYR3UR.js → chunk-FZ76G4QJ.js} +1 -1
- package/dist/cli/chunks/{chunk-UIKQPO4Y.js → chunk-G2Q66Z23.js} +2 -2
- package/dist/cli/chunks/{chunk-5S4UIDFK.js → chunk-G6WDYBLQ.js} +1 -1
- package/dist/cli/chunks/{chunk-4SA7M34P.js → chunk-G77ERMUD.js} +1 -1
- package/dist/cli/chunks/{chunk-ADUAJIAU.js → chunk-GB6HBNH2.js} +2 -2
- package/dist/cli/chunks/{chunk-IETBWYHW.js → chunk-GHM6MQNK.js} +2 -2
- package/dist/cli/chunks/{chunk-QWG3SILX.js → chunk-GHY6Z6KO.js} +5 -5
- package/dist/cli/chunks/{chunk-AJEXPFAB.js → chunk-GII6UM3F.js} +1 -1
- package/dist/cli/chunks/{chunk-SDRJJUPO.js → chunk-GU5HNCWI.js} +1 -1
- package/dist/cli/chunks/{chunk-ULCW6IVQ.js → chunk-H4GG2NLO.js} +2 -2
- package/dist/cli/chunks/{chunk-7TA5MUPW.js → chunk-H4H2YSFH.js} +1 -1
- package/dist/cli/chunks/{chunk-5A66EGEW.js → chunk-HD7YIFOI.js} +2 -2
- package/dist/cli/chunks/{chunk-CDA5Z74H.js → chunk-HOAJUIBQ.js} +2 -2
- package/dist/cli/chunks/{chunk-4KUOYDY2.js → chunk-HQZGPJYG.js} +2 -2
- package/dist/cli/chunks/{chunk-G3AABG4Q.js → chunk-HZ5NXFXH.js} +2 -2
- package/dist/cli/chunks/{chunk-U6IXYQO4.js → chunk-I3C7JOXC.js} +2 -2
- package/dist/cli/chunks/{chunk-MAJXZYGK.js → chunk-IC3TQEOA.js} +1 -1
- package/dist/cli/chunks/{chunk-RYHG3I7J.js → chunk-IJUHSJ2U.js} +2 -2
- package/dist/cli/chunks/{chunk-DZGPUGUG.js → chunk-J2ZIFFM6.js} +2 -2
- package/dist/cli/chunks/{chunk-NA3F6FEO.js → chunk-JGZ722G3.js} +2 -2
- package/dist/cli/chunks/{chunk-PX5OPXY6.js → chunk-JQGMW45H.js} +1 -1
- package/dist/cli/chunks/{chunk-WGTEZT7G.js → chunk-JRRXCODW.js} +2 -2
- package/dist/cli/chunks/{chunk-4Y6OEBJZ.js → chunk-K3TLLJMX.js} +1 -1
- package/dist/cli/chunks/{chunk-RCOLPF3B.js → chunk-K4CZA77U.js} +2 -2
- package/dist/cli/chunks/{chunk-YIDAXOUX.js → chunk-K65CGKLD.js} +2 -2
- package/dist/cli/chunks/{chunk-5ADXFUMO.js → chunk-KADFXPPN.js} +2 -2
- package/dist/cli/chunks/{chunk-P5E26N2X.js → chunk-KB56CPU4.js} +2 -2
- package/dist/cli/chunks/{chunk-YLKIXEPP.js → chunk-KCW47QR5.js} +1 -1
- package/dist/cli/chunks/{chunk-SPC4RBLF.js → chunk-KDNJ4F3P.js} +2 -2
- package/dist/cli/chunks/{chunk-P7UFJ6DO.js → chunk-KDVZND5Q.js} +1 -1
- package/dist/cli/chunks/{chunk-TLRHAMX5.js → chunk-KUAKV3IW.js} +1 -1
- package/dist/cli/chunks/{chunk-ZROAMFX2.js → chunk-KV4T4MXK.js} +2 -2
- package/dist/cli/chunks/{chunk-UZED4YZ5.js → chunk-KWYH3FI4.js} +1 -1
- package/dist/cli/chunks/{chunk-33I2ZP6E.js → chunk-LFJALJOA.js} +2 -2
- package/dist/cli/chunks/{chunk-TXEUVUMO.js → chunk-LL7LDPXS.js} +1 -1
- package/dist/cli/chunks/{chunk-W5HQIYQU.js → chunk-LUZNKJE6.js} +3 -3
- package/dist/cli/chunks/{chunk-GKFV6CUD.js → chunk-LWR3FV3Y.js} +2 -2
- package/dist/cli/chunks/{chunk-TVA5GRIU.js → chunk-LZYQHVD4.js} +2 -2
- package/dist/cli/chunks/{chunk-2JYUA27M.js → chunk-M6AAGIG7.js} +1 -1
- package/dist/cli/chunks/{chunk-PT2NXS43.js → chunk-MAMQA43L.js} +1 -1
- package/dist/cli/chunks/chunk-MB46UBGY.js +3 -0
- package/dist/cli/chunks/{chunk-ZPVGX4DI.js → chunk-MFW5HSG4.js} +2 -2
- package/dist/cli/chunks/{chunk-47RMGDG4.js → chunk-MGZ5FJUW.js} +2 -2
- package/dist/cli/chunks/{chunk-G24SWTAX.js → chunk-MVVB7C2E.js} +410 -410
- package/dist/cli/chunks/{chunk-XZOYKB22.js → chunk-N4CYAKOX.js} +2 -2
- package/dist/cli/chunks/{chunk-QCPVUNN3.js → chunk-NT4DBXSX.js} +2 -2
- package/dist/cli/chunks/{chunk-3EWQN37E.js → chunk-NU3W5WFT.js} +2 -2
- package/dist/cli/chunks/{chunk-VZBC6DP7.js → chunk-NURIILUB.js} +1 -1
- package/dist/cli/chunks/{chunk-6E6HB4N4.js → chunk-NW7IBHJA.js} +4 -4
- package/dist/cli/chunks/{chunk-K3A3NWT3.js → chunk-NZ3GUMB2.js} +2 -2
- package/dist/cli/chunks/{chunk-GJKZ7UQO.js → chunk-NZD4DPSU.js} +2 -2
- package/dist/cli/chunks/{chunk-7QEUHNKO.js → chunk-O6FGXMHD.js} +1 -1
- package/dist/cli/chunks/{chunk-YVJEUX3I.js → chunk-OCAEXYFA.js} +2 -2
- package/dist/cli/chunks/{chunk-BOSMELJX.js → chunk-OFACHK5O.js} +2 -2
- package/dist/cli/chunks/{chunk-PGSJBXTD.js → chunk-P7A4NKTZ.js} +2 -2
- package/dist/cli/chunks/{chunk-HSA5IGGW.js → chunk-PB6J6HAA.js} +2 -2
- package/dist/cli/chunks/{chunk-TGMXUZZC.js → chunk-PHP5UBT4.js} +2 -2
- package/dist/cli/chunks/{chunk-NV74SICL.js → chunk-PIDQVU3L.js} +2 -2
- package/dist/cli/chunks/{chunk-TSOQ2QLT.js → chunk-PSFSPGUD.js} +2 -2
- package/dist/cli/chunks/{chunk-4A76VPU4.js → chunk-PT4FMJPQ.js} +2 -2
- package/dist/cli/chunks/{chunk-U7ZHDGXG.js → chunk-Q3UDLV5Z.js} +1 -1
- package/dist/cli/chunks/{chunk-BYRCB5JT.js → chunk-QDEJ4CI2.js} +2 -2
- package/dist/cli/chunks/{chunk-CA5UNWQF.js → chunk-QPNG5ZN2.js} +2 -2
- package/dist/cli/chunks/{chunk-W7H55PY4.js → chunk-R7SYRCRP.js} +1 -1
- package/dist/cli/chunks/{chunk-4LWMAAWK.js → chunk-RF7HWBHN.js} +2 -2
- package/dist/cli/chunks/{chunk-MMEALJ4D.js → chunk-RFNW2LGD.js} +2 -2
- package/dist/cli/chunks/{chunk-UCSK2RMI.js → chunk-S5AZCIZS.js} +2 -2
- package/dist/cli/chunks/{chunk-JW5PDJ5O.js → chunk-SE4VNN4I.js} +3 -3
- package/dist/cli/chunks/{chunk-URSTP3WI.js → chunk-SG3NX7QE.js} +2 -2
- package/dist/cli/chunks/{chunk-N7O3PF6Y.js → chunk-SSU73QAX.js} +2 -2
- package/dist/cli/chunks/{chunk-7DNR4KKR.js → chunk-SVLQRAMF.js} +1 -1
- package/dist/cli/chunks/{chunk-BC4T6SCV.js → chunk-SYV2V3PL.js} +4 -4
- package/dist/cli/chunks/{chunk-4CB3QPZM.js → chunk-T3PGQFDI.js} +2 -2
- package/dist/cli/chunks/{chunk-OHVYINGM.js → chunk-TCBBNUBP.js} +3 -3
- package/dist/cli/chunks/{chunk-YWWMNTBF.js → chunk-TOQWL2ZF.js} +2 -2
- package/dist/cli/chunks/{chunk-SITL5YZV.js → chunk-TSQC2KKZ.js} +2 -2
- package/dist/cli/chunks/{chunk-YUA6ZKKY.js → chunk-TWDW32W2.js} +2 -2
- package/dist/cli/chunks/{chunk-SUX5XB2Z.js → chunk-TWJTK4CC.js} +2 -2
- package/dist/cli/chunks/{chunk-32UTHIY5.js → chunk-U2FUXDDJ.js} +3 -3
- package/dist/cli/chunks/{chunk-ENGL7FIJ.js → chunk-UDQSYWVF.js} +1 -1
- package/dist/cli/chunks/{chunk-7OEFBWAG.js → chunk-UOC3O6RP.js} +2 -2
- package/dist/cli/chunks/chunk-UT2VZ33P.js +2 -0
- package/dist/cli/chunks/{chunk-MYF5CNGV.js → chunk-UTRV7T2N.js} +2 -2
- package/dist/cli/chunks/{chunk-KJDI5CHX.js → chunk-UXZSUMEA.js} +2 -2
- package/dist/cli/chunks/{chunk-DAUEK66C.js → chunk-VRHRBAEM.js} +1 -1
- package/dist/cli/chunks/{chunk-FZJCBSN4.js → chunk-VRVMIPTM.js} +2 -2
- package/dist/cli/chunks/{chunk-26672ISV.js → chunk-VTDFVFST.js} +2 -2
- package/dist/cli/chunks/{chunk-WTAUF6O4.js → chunk-VTOBUZL6.js} +2 -2
- package/dist/cli/chunks/{chunk-4PU5GTZW.js → chunk-VU5TBX2V.js} +2 -2
- package/dist/cli/chunks/{chunk-C3YOVASQ.js → chunk-W26B7ERY.js} +1 -1
- package/dist/cli/chunks/{chunk-CPIBIR3X.js → chunk-W2QWSQVE.js} +2 -2
- package/dist/cli/chunks/{chunk-L3PV7VXK.js → chunk-W3INMZZ6.js} +1 -1
- package/dist/cli/chunks/{chunk-5Z23ZMXZ.js → chunk-W3PPFHI5.js} +54 -54
- package/dist/cli/chunks/{chunk-NVRYELCY.js → chunk-WKGTGOYS.js} +3 -3
- package/dist/cli/chunks/{chunk-35NW676P.js → chunk-WNQS4WTS.js} +2 -2
- package/dist/cli/chunks/{chunk-O3IM4WRZ.js → chunk-WO274FRI.js} +2 -2
- package/dist/cli/chunks/{chunk-35MIUSXQ.js → chunk-WOCGL4QP.js} +2 -2
- package/dist/cli/chunks/{chunk-EF6OERRR.js → chunk-WQL7WCIZ.js} +1 -1
- package/dist/cli/chunks/{chunk-INZARYUD.js → chunk-X2Z7F4EU.js} +2 -2
- package/dist/cli/chunks/{chunk-2E2QO44T.js → chunk-X7N2JF2X.js} +2 -2
- package/dist/cli/chunks/{chunk-2IVE5AR3.js → chunk-XEAEYC6Y.js} +1 -1
- package/dist/cli/chunks/{chunk-IPA7K556.js → chunk-XNBOGCF3.js} +2 -2
- package/dist/cli/chunks/{chunk-A2JCRXTK.js → chunk-XPRVF4YE.js} +2 -2
- package/dist/cli/chunks/{chunk-VUR5THML.js → chunk-YBQH2VOP.js} +2 -2
- package/dist/cli/chunks/{chunk-A5Y7DAVQ.js → chunk-YQFLQE53.js} +2 -2
- package/dist/cli/chunks/{chunk-JGIJPDGD.js → chunk-YSZ5OE3Z.js} +2 -2
- package/dist/cli/chunks/{chunk-JNXK47OL.js → chunk-YXRASAPI.js} +2 -2
- package/dist/cli/chunks/{chunk-MYUMJ2ZI.js → chunk-YZEXYO4W.js} +1 -1
- package/dist/cli/chunks/{chunk-NNBQZR73.js → chunk-YZWBNBTW.js} +2 -2
- package/dist/cli/chunks/{chunk-WDEXOLK2.js → chunk-ZAKQLAHT.js} +1 -1
- package/dist/cli/chunks/{ci-BZNWW3I3.js → ci-ENOASTYB.js} +2 -2
- package/dist/cli/chunks/{ci-config-LOHNXOKV.js → ci-config-B26OXHQM.js} +2 -2
- package/dist/cli/chunks/{ci-output-LCOQBSJL.js → ci-output-JTCLLNOQ.js} +2 -2
- package/dist/cli/chunks/{circuit-breaker-7LRXTLFE.js → circuit-breaker-23JMFNM5.js} +2 -2
- package/dist/cli/chunks/{claude-flow-setup-HBU4VWC3.js → claude-flow-setup-ON6L462G.js} +2 -2
- package/dist/cli/chunks/client-TV3V2YZ5.js +2 -0
- package/dist/cli/chunks/{cline-installer-CO6MLH6X.js → cline-installer-OWQ4D2FQ.js} +2 -2
- package/dist/cli/chunks/{code-SIXBS6JM.js → code-2ZRL7SEU.js} +19 -18
- package/dist/cli/chunks/{code-index-extractor-GWJKZ2IQ.js → code-index-extractor-JXSQVM67.js} +2 -2
- package/dist/cli/chunks/{codex-installer-6NINVWXJ.js → codex-installer-7LXZYBSQ.js} +2 -2
- package/dist/cli/chunks/{completions-7VIX3GML.js → completions-C2LR623C.js} +2 -2
- package/dist/cli/chunks/{complexity-analyzer-FBQR6ZP2.js → complexity-analyzer-TGQLHCYJ.js} +2 -2
- package/dist/cli/chunks/{continuedev-installer-VA7RIXW5.js → continuedev-installer-RUGD24D2.js} +2 -2
- package/dist/cli/chunks/{copilot-installer-4QEBC4MU.js → copilot-installer-ZLFVLEJP.js} +2 -2
- package/dist/cli/chunks/core-handlers-PZT4OLWR.js +2 -0
- package/dist/cli/chunks/{cost-tracker-GRYKHPWL.js → cost-tracker-RT4QL745.js} +2 -2
- package/dist/cli/chunks/{coverage-USPMNKOU.js → coverage-NV3C4IMM.js} +3 -3
- package/dist/cli/chunks/cross-domain-router-QOFCZ7G4.js +2 -0
- package/dist/cli/chunks/{cursor-installer-ZXIPSZVH.js → cursor-installer-LJKLNFF6.js} +2 -2
- package/dist/cli/chunks/{daemon-D7F3RGI5.js → daemon-BMDXCQT5.js} +3 -3
- package/dist/cli/chunks/{daemon-N2VRHPSJ.js → daemon-FBH3IRYN.js} +4 -4
- package/dist/cli/chunks/{dag-attention-scheduler-NL6BA7BY.js → dag-attention-scheduler-JGDED55I.js} +2 -2
- package/dist/cli/chunks/{detect-XC2HCIIT.js → detect-SZIHIVCJ.js} +2 -2
- package/dist/cli/chunks/{dist-node-A3Y26MEI.js → dist-node-FV3KWXQ6.js} +2 -2
- package/dist/cli/chunks/{domain-handler-WV6SFXRB.js → domain-handler-GI5JWQOV.js} +2 -2
- package/dist/cli/chunks/{domain-plugins-KJIF6Z2B.js → domain-plugins-BUWY36TL.js} +2 -2
- package/dist/cli/chunks/domain-transfer-GCY7W5DA.js +2 -0
- package/dist/cli/chunks/dream-TRFBGDSQ.js +2 -0
- package/dist/cli/chunks/{embed-and-insert-pattern-PA3Y4KGO.js → embed-and-insert-pattern-GPRR3ZGD.js} +2 -2
- package/dist/cli/chunks/{eval-YGEZNUVE.js → eval-XPB3IGAP.js} +2 -2
- package/dist/cli/chunks/{experience-capture-middleware-D4T7NW6B.js → experience-capture-middleware-2E554UB3.js} +3 -3
- package/dist/cli/chunks/{fast-paths-6JYK7RYQ.js → fast-paths-ZSMWZPUC.js} +2 -2
- package/dist/cli/chunks/{feature-flags-RBH2GDSR.js → feature-flags-GIWVDVVC.js} +2 -2
- package/dist/cli/chunks/{feature-flags-DKXMDVPE.js → feature-flags-N7EOGE5P.js} +2 -2
- package/dist/cli/chunks/file-discovery-WCKGMSPZ.js +2 -0
- package/dist/cli/chunks/fleet-HCHDOUCX.js +44 -0
- package/dist/cli/chunks/{gnn-wrapper-MV54UC4C.js → gnn-wrapper-CZNCNXXZ.js} +2 -2
- package/dist/cli/chunks/{heartbeat-handler-7DKMVQQH.js → heartbeat-handler-6YUIF2YQ.js} +4 -4
- package/dist/cli/chunks/heartbeat-scheduler-P44A2OX3.js +2 -0
- package/dist/cli/chunks/hnsw-adapter-ZJQIQJKC.js +2 -0
- package/dist/cli/chunks/hnsw-index-HMG2GH3Z.js +2 -0
- package/dist/cli/chunks/{hnsw-legacy-bridge-6IWREDQC.js → hnsw-legacy-bridge-J3M3IK24.js} +2 -2
- package/dist/cli/chunks/{hnswlib-node-5BIESSCK.js → hnswlib-node-ULGTGDZW.js} +2 -2
- package/dist/cli/chunks/{hooks-3EETRM62.js → hooks-C4BUGYUQ.js} +10 -10
- package/dist/cli/chunks/hybrid-backend-B7M74PZG.js +2 -0
- package/dist/cli/chunks/{hypergraph-engine-RSWCB2D3.js → hypergraph-engine-WINGVMPG.js} +2 -2
- package/dist/cli/chunks/{hypergraph-handler-552LXKL3.js → hypergraph-handler-GADMWKAU.js} +3 -3
- package/dist/cli/chunks/impact-analyzer-PZYOVKQO.js +2 -0
- package/dist/cli/chunks/{init-guard-OTDBJ5HD.js → init-guard-K2T4QWAO.js} +2 -2
- package/dist/cli/chunks/{init-handler-3FK3TKEA.js → init-handler-PCZTDZYI.js} +6 -6
- package/dist/cli/chunks/init-wizard-TZDJQK3U.js +2 -0
- package/dist/cli/chunks/kernel-Y6RRIOKW.js +2 -0
- package/dist/cli/chunks/{kilocode-installer-KZ2O4LF3.js → kilocode-installer-XENXNEIU.js} +2 -2
- package/dist/cli/chunks/{kiro-installer-MLCCXRF7.js → kiro-installer-3PG2TJ67.js} +2 -2
- package/dist/cli/chunks/knowledge-graph-BVD5Z66M.js +2 -0
- package/dist/cli/chunks/{learning-QUCMBD77.js → learning-6KDH7FK4.js} +3 -3
- package/dist/cli/chunks/{llm-router-PDEV3UP2.js → llm-router-RKVDEWU2.js} +4 -4
- package/dist/cli/chunks/llm-router-service-KHCAMSUU.js +2 -0
- package/dist/cli/chunks/{load-XFVVLO7E.js → load-ITHC564X.js} +2 -2
- package/dist/cli/chunks/load-test-RUF7DZA5.js +2 -0
- package/dist/cli/chunks/{mcp-74G3CL2S.js → mcp-TCL5UW3N.js} +2 -2
- package/dist/cli/chunks/{memory-XIFM6JNX.js → memory-BKDAY2N2.js} +5 -5
- package/dist/cli/chunks/memory-backend-7ZLFOVGG.js +2 -0
- package/dist/cli/chunks/{memory-handlers-ZCKURV6S.js → memory-handlers-WN4FXFOA.js} +2 -2
- package/dist/cli/chunks/{multi-model-executor-7L4W3O2Q.js → multi-model-executor-VHAT7ZPF.js} +2 -2
- package/dist/cli/chunks/{opencode-installer-BPG422LF.js → opencode-installer-E3VM3EEY.js} +2 -2
- package/dist/cli/chunks/{orchestrator-OEAFLAEV.js → orchestrator-BMQ6X762.js} +5 -5
- package/dist/cli/chunks/pattern-null-store-RY6CVYHP.js +2 -0
- package/dist/cli/chunks/{pattern-usage-recorder-LOPNCULT.js → pattern-usage-recorder-GOOR2BV5.js} +2 -2
- package/dist/cli/chunks/{pipeline-VWTYUZB7.js → pipeline-5NSFQQIX.js} +2 -2
- package/dist/cli/chunks/{platform-WFJJ3X2E.js → platform-SQM34J5G.js} +2 -2
- package/dist/cli/chunks/{plugin-744TPUSG.js → plugin-UQJZRMZG.js} +2 -2
- package/dist/cli/chunks/{prime-radiant-advanced-wasm-BD5BLNDR.js → prime-radiant-advanced-wasm-WMDJOL4S.js} +2 -2
- package/dist/cli/chunks/project-root-IO5KRNGL.js +2 -0
- package/dist/cli/chunks/protocol-executor-U2CUDWDE.js +2 -0
- package/dist/cli/chunks/{protocol-handler-JIBILI74.js → protocol-handler-OBDCVY6X.js} +2 -2
- package/dist/cli/chunks/{prove-MNOL5FYW.js → prove-XDC7I4XT.js} +2 -2
- package/dist/cli/chunks/qe-reasoning-bank-DQSSX2IP.js +2 -0
- package/dist/cli/chunks/{quality-JEGBDGGX.js → quality-L4GQ6WX4.js} +2 -2
- package/dist/cli/chunks/{quality-gate-SYJ6ROMI.js → quality-gate-MJG66LKN.js} +3 -3
- package/dist/cli/chunks/queen-coordinator-6FN4BZIX.js +2 -0
- package/dist/cli/chunks/{real-embeddings-ZWXS5ZFV.js → real-embeddings-HW4G2LWL.js} +2 -2
- package/dist/cli/chunks/{ref-validation-RRHUFW2N.js → ref-validation-FC7JOJ2C.js} +2 -2
- package/dist/cli/chunks/{roocode-installer-XFO6JSVN.js → roocode-installer-KWS4CEIC.js} +2 -2
- package/dist/cli/chunks/router-YUO3I7RU.js +2 -0
- package/dist/cli/chunks/routing-feedback-36SLQGJE.js +2 -0
- package/dist/cli/chunks/{routing-handler-L2K3JASE.js → routing-handler-QF4WVB2S.js} +2 -2
- package/dist/cli/chunks/{ruvector-commands-A6CINHGM.js → ruvector-commands-2MTCOUK6.js} +2 -2
- package/dist/cli/chunks/rvf-dual-writer-FRYZH3WZ.js +2 -0
- package/dist/cli/chunks/rvf-migration-adapter-XXNITL5I.js +2 -0
- package/dist/cli/chunks/{rvf-migration-coordinator-T4RY7L53.js → rvf-migration-coordinator-BREJCXWN.js} +2 -2
- package/dist/cli/chunks/rvf-native-adapter-D2WWKJIV.js +2 -0
- package/dist/cli/chunks/{rvf-store-integrity-IR33TGQS.js → rvf-store-integrity-KKC6HOJD.js} +2 -2
- package/dist/cli/chunks/safe-db-4RRIGRXD.js +2 -0
- package/dist/cli/chunks/schedule-25RTO4DQ.js +2 -0
- package/dist/cli/chunks/scheduler-BPIOJZ5P.js +2 -0
- package/dist/cli/chunks/{security-Z5GDE2IH.js → security-OSAE7VAP.js} +3 -3
- package/dist/cli/chunks/{shared-rvf-adapter-SIZMEHPM.js → shared-rvf-adapter-COUOS665.js} +2 -2
- package/dist/cli/chunks/{shared-rvf-dual-writer-HLM65RDS.js → shared-rvf-dual-writer-YXMPZKQE.js} +2 -2
- package/dist/cli/chunks/sqlite-persistence-EDF47DDX.js +2 -0
- package/dist/cli/chunks/{standalone-memory-SKSZG7P5.js → standalone-memory-E6JBMOIL.js} +2 -2
- package/dist/cli/chunks/{status-handler-766YOOMJ.js → status-handler-AFTCIYIX.js} +2 -2
- package/dist/cli/chunks/{structural-health-M45FNOLT.js → structural-health-2FROCEI4.js} +2 -2
- package/dist/cli/chunks/{sync-B2U366I3.js → sync-VAYTOWDC.js} +2 -2
- package/dist/cli/chunks/{sync-6CJ24B5T.js → sync-YIQYOFGW.js} +2 -2
- package/dist/cli/chunks/task-handler-KVQHDEX3.js +62 -0
- package/dist/cli/chunks/task-handlers-MVVECQA6.js +9 -0
- package/dist/cli/chunks/{test-TODH7KRF.js → test-5JSVTOMY.js} +4 -4
- package/dist/cli/chunks/test-runner-process-LEPF2OSS.js +2 -0
- package/dist/cli/chunks/{test-scheduling-VMVMVRHT.js → test-scheduling-HBOHVLI3.js} +3 -3
- package/dist/cli/chunks/{token-bootstrap-XQW7BMCK.js → token-bootstrap-5VEPTPFA.js} +2 -2
- package/dist/cli/chunks/{token-usage-JCZEIRKO.js → token-usage-TBJHDLY6.js} +2 -2
- package/dist/cli/chunks/{transformers-U2ML3OHE.js → transformers-VAWYMHMZ.js} +2 -2
- package/dist/cli/chunks/tree-sitter-wasm-parser-TSZTCMFV.js +2 -0
- package/dist/cli/chunks/{types-GGEPCHP6.js → types-R5SDZU2E.js} +2 -2
- package/dist/cli/chunks/unified-memory-TLGSSLMI.js +2 -0
- package/dist/cli/chunks/unified-memory-hnsw-MSUR7ZOO.js +2 -0
- package/dist/cli/chunks/unified-persistence-VFFOTWK7.js +2 -0
- package/dist/cli/chunks/{upgrade-T5GRM7HS.js → upgrade-K5PIHXRB.js} +2 -2
- package/dist/cli/chunks/{validate-XMUJPLP3.js → validate-RPTS7RYJ.js} +2 -2
- package/dist/cli/chunks/{validate-swarm-KJLF7JEH.js → validate-swarm-B2ZL556X.js} +2 -2
- package/dist/cli/chunks/visual-security-6Q44XNLB.js +2 -0
- package/dist/cli/chunks/{web-tree-sitter-LOHVZ7G5.js → web-tree-sitter-K4DUJC32.js} +2 -2
- package/dist/cli/chunks/{windsurf-installer-33FBTXJU.js → windsurf-installer-OK2AJN35.js} +2 -2
- package/dist/cli/chunks/witness-chain-KDOMXDQX.js +2 -0
- package/dist/cli/chunks/witness-chain-N3OY2RMH.js +2 -0
- package/dist/cli/chunks/{witness-chain-repair-VWBO4NXE.js → witness-chain-repair-L6Y5RFXR.js} +2 -2
- package/dist/cli/chunks/{witness-chain-verifier-BHJ3ZAEK.js → witness-chain-verifier-N4CW7FZX.js} +2 -2
- package/dist/cli/chunks/{witness-key-manager-WNVPH2Z3.js → witness-key-manager-TDNPS3WD.js} +2 -2
- package/dist/cli/chunks/{workflow-6QR5MQTO.js → workflow-XRZA3YCY.js} +4 -4
- package/dist/cli/chunks/workflow-orchestrator-CVNNT2RJ.js +2 -0
- package/dist/cli/chunks/{wrappers-EHOL62TS.js → wrappers-5JIFWKN6.js} +2 -2
- package/dist/cli/commands/code.js +6 -0
- package/dist/cli/commands/fleet-run.d.ts +12 -0
- package/dist/cli/commands/fleet-run.js +175 -0
- package/dist/cli/commands/fleet.js +2 -117
- package/dist/cli/handlers/task-handler.d.ts +5 -0
- package/dist/cli/handlers/task-handler.js +20 -0
- package/dist/cli/utils/fleet-operation.d.ts +5 -2
- package/dist/cli/utils/fleet-operation.js +13 -2
- package/dist/cli/utils/fleet-result.d.ts +16 -2
- package/dist/cli/utils/fleet-result.js +26 -21
- package/dist/cli/utils/fleet-shard.d.ts +36 -0
- package/dist/cli/utils/fleet-shard.js +110 -0
- package/dist/coordination/handlers/code-intelligence-handlers.js +21 -1
- package/dist/coordination/handlers/handler-types.d.ts +2 -2
- package/dist/coordination/handlers/handler-utils.d.ts +6 -0
- package/dist/coordination/handlers/handler-utils.js +14 -4
- package/dist/coordination/handlers/misc-handlers.js +5 -2
- package/dist/coordination/handlers/quality-handlers.js +2 -2
- package/dist/coordination/handlers/security-handlers.js +12 -2
- package/dist/coordination/protocols/security-audit.js +11 -1
- package/dist/coordination/task-executor.js +7 -2
- package/dist/domains/code-intelligence/coordinator-gnn.d.ts +2 -16
- package/dist/domains/code-intelligence/coordinator-gnn.js +1 -62
- package/dist/domains/code-intelligence/coordinator.d.ts +12 -6
- package/dist/domains/code-intelligence/coordinator.js +24 -27
- package/dist/domains/code-intelligence/interfaces.d.ts +9 -0
- package/dist/domains/code-intelligence/services/semantic-analyzer.d.ts +43 -5
- package/dist/domains/code-intelligence/services/semantic-analyzer.js +134 -71
- package/dist/domains/coverage-analysis/collected-metrics.d.ts +10 -0
- package/dist/domains/coverage-analysis/collected-metrics.js +29 -0
- package/dist/domains/coverage-analysis/services/coverage-analyzer.js +11 -3
- package/dist/domains/coverage-analysis/services/coverage-parser.d.ts +2 -0
- package/dist/domains/coverage-analysis/services/coverage-parser.js +18 -2
- package/dist/domains/quality-assessment/coherence/gate-controller.js +16 -4
- package/dist/domains/quality-assessment/coherence/lambda-calculator.d.ts +8 -0
- package/dist/domains/quality-assessment/coherence/lambda-calculator.js +57 -14
- package/dist/domains/quality-assessment/coherence/types.d.ts +12 -7
- package/dist/domains/quality-assessment/coordinator-gate-evaluation.js +3 -1
- package/dist/domains/quality-assessment/coordinator-reports.d.ts +30 -10
- package/dist/domains/quality-assessment/coordinator-reports.js +93 -57
- package/dist/domains/quality-assessment/coordinator.d.ts +14 -40
- package/dist/domains/quality-assessment/coordinator.js +10 -4
- package/dist/domains/quality-assessment/interfaces.d.ts +2 -0
- package/dist/domains/quality-assessment/services/coherence-gate.js +15 -2
- package/dist/domains/quality-assessment/services/quality-gate.js +6 -4
- package/dist/domains/security-compliance/index.d.ts +1 -1
- package/dist/domains/security-compliance/interfaces.d.ts +46 -5
- package/dist/domains/security-compliance/services/scanners/dast-auth-testing.d.ts +3 -3
- package/dist/domains/security-compliance/services/scanners/dast-auth-testing.js +15 -14
- package/dist/domains/security-compliance/services/scanners/dast-helpers.d.ts +8 -9
- package/dist/domains/security-compliance/services/scanners/dast-helpers.js +19 -44
- package/dist/domains/security-compliance/services/scanners/dast-injection-testing.d.ts +3 -3
- package/dist/domains/security-compliance/services/scanners/dast-injection-testing.js +13 -9
- package/dist/domains/security-compliance/services/scanners/dast-requests.d.ts +54 -0
- package/dist/domains/security-compliance/services/scanners/dast-requests.js +125 -0
- package/dist/domains/security-compliance/services/scanners/dast-scanner.d.ts +5 -1
- package/dist/domains/security-compliance/services/scanners/dast-scanner.js +125 -155
- package/dist/domains/security-compliance/services/scanners/index.d.ts +1 -1
- package/dist/domains/security-compliance/services/scanners/index.js +1 -1
- package/dist/domains/security-compliance/services/scanners/scanner-types.d.ts +2 -2
- package/dist/domains/security-compliance/services/security-auditor-dast.js +183 -212
- package/dist/domains/security-compliance/services/security-auditor-reports.js +5 -1
- package/dist/domains/security-compliance/services/security-auditor.d.ts +11 -3
- package/dist/domains/security-compliance/services/security-auditor.js +106 -65
- package/dist/domains/test-execution/coordinator.d.ts +2 -1
- package/dist/domains/test-execution/coordinator.js +33 -27
- package/dist/domains/test-execution/interfaces.d.ts +5 -0
- package/dist/domains/test-execution/services/test-executor.d.ts +6 -0
- package/dist/domains/test-execution/services/test-executor.js +16 -4
- package/dist/domains/visual-accessibility/coordinator.js +34 -9
- package/dist/domains/visual-accessibility/interfaces.d.ts +27 -0
- package/dist/domains/visual-accessibility/plugin.js +5 -0
- package/dist/domains/visual-accessibility/services/accessibility-tester-heuristics.d.ts +13 -21
- package/dist/domains/visual-accessibility/services/accessibility-tester-heuristics.js +13 -297
- package/dist/domains/visual-accessibility/services/accessibility-tester.d.ts +13 -5
- package/dist/domains/visual-accessibility/services/accessibility-tester.js +96 -73
- package/dist/integrations/embeddings/index/HNSWIndex.js +8 -4
- package/dist/integrations/ruvector/transfer-coherence-stub.js +5 -10
- package/dist/mcp/bundle.js +480 -480
- package/dist/mcp/handlers/domain-handler-configs.d.ts +8 -0
- package/dist/mcp/handlers/domain-handler-configs.js +9 -2
- package/dist/mcp/handlers/handler-factory.js +3 -0
- package/dist/mcp/handlers/model-route-handlers.d.ts +107 -0
- package/dist/mcp/handlers/model-route-handlers.js +139 -0
- package/dist/mcp/handlers/orchestrate-routes.js +41 -3
- package/dist/mcp/handlers/task-handlers.d.ts +3 -251
- package/dist/mcp/handlers/task-handlers.js +6 -828
- package/dist/mcp/handlers/task-inference.d.ts +26 -0
- package/dist/mcp/handlers/task-inference.js +156 -0
- package/dist/mcp/handlers/task-learning-handlers.d.ts +92 -0
- package/dist/mcp/handlers/task-learning-handlers.js +230 -0
- package/dist/mcp/handlers/task-orchestrate-handler.d.ts +73 -0
- package/dist/mcp/handlers/task-orchestrate-handler.js +361 -0
- package/dist/mcp/protocol-server.js +12 -2
- package/dist/mcp/tools/code-intelligence/analyze.js +3 -6
- package/dist/mcp/tools/coverage-analysis/index.d.ts +4 -0
- package/dist/mcp/tools/coverage-analysis/index.js +8 -2
- package/dist/mcp/tools/visual-accessibility/index.d.ts +7 -0
- package/dist/mcp/tools/visual-accessibility/index.js +29 -13
- package/dist/shared/events/domain-events.d.ts +2 -0
- package/dist/shared/metrics/code-metrics.js +21 -3
- package/dist/shared/parsers/typescript-parser.d.ts +6 -0
- package/dist/shared/parsers/typescript-parser.js +13 -1
- package/package.json +1 -1
- package/dist/cli/chunks/adapter-HL7MOCQN.js +0 -2
- package/dist/cli/chunks/aqe-learning-engine-OZ2DXB4G.js +0 -2
- package/dist/cli/chunks/base-WIM7G3HC.js +0 -2
- package/dist/cli/chunks/browser-workflow-QRKCFVR3.js +0 -2
- package/dist/cli/chunks/chunk-QSGEBCDB.js +0 -62
- package/dist/cli/chunks/chunk-UJNGGFGX.js +0 -2
- package/dist/cli/chunks/chunk-VXVTFKRA.js +0 -2
- package/dist/cli/chunks/chunk-XCNSGSKV.js +0 -3
- package/dist/cli/chunks/client-4PNYDFYS.js +0 -2
- package/dist/cli/chunks/core-handlers-ODO6LUWQ.js +0 -2
- package/dist/cli/chunks/cross-domain-router-DT4MHJKK.js +0 -2
- package/dist/cli/chunks/domain-transfer-L3F6AES2.js +0 -2
- package/dist/cli/chunks/dream-QOB3JCOM.js +0 -2
- package/dist/cli/chunks/file-discovery-BN76S2PR.js +0 -2
- package/dist/cli/chunks/fleet-43YMXACN.js +0 -46
- package/dist/cli/chunks/heartbeat-scheduler-3NNP4WCP.js +0 -2
- package/dist/cli/chunks/hnsw-adapter-MZR7Y4WF.js +0 -2
- package/dist/cli/chunks/hnsw-index-HE4AX22U.js +0 -2
- package/dist/cli/chunks/hybrid-backend-IHUHB3Y2.js +0 -2
- package/dist/cli/chunks/impact-analyzer-FI6GI6PD.js +0 -2
- package/dist/cli/chunks/init-wizard-WLQKH5Y5.js +0 -2
- package/dist/cli/chunks/kernel-2WZOQEZS.js +0 -2
- package/dist/cli/chunks/knowledge-graph-G3LVKK6P.js +0 -2
- package/dist/cli/chunks/llm-router-service-MM75HKWJ.js +0 -2
- package/dist/cli/chunks/load-test-BEWEE44J.js +0 -2
- package/dist/cli/chunks/memory-backend-NYKBBKZR.js +0 -2
- package/dist/cli/chunks/pattern-null-store-QGPUIV6M.js +0 -2
- package/dist/cli/chunks/project-root-C7ELXZRK.js +0 -2
- package/dist/cli/chunks/protocol-executor-SUVE33BM.js +0 -2
- package/dist/cli/chunks/qe-reasoning-bank-YWZMMGJB.js +0 -2
- package/dist/cli/chunks/queen-coordinator-ZFAKXRN7.js +0 -2
- package/dist/cli/chunks/router-4FTAVYLJ.js +0 -2
- package/dist/cli/chunks/routing-feedback-IO2KOWMJ.js +0 -2
- package/dist/cli/chunks/rvf-dual-writer-KCIRNE7C.js +0 -2
- package/dist/cli/chunks/rvf-migration-adapter-MFC5WTJU.js +0 -2
- package/dist/cli/chunks/rvf-native-adapter-I3KWHE7X.js +0 -2
- package/dist/cli/chunks/safe-db-QXDZ6QY3.js +0 -2
- package/dist/cli/chunks/schedule-CZKD6RIY.js +0 -2
- package/dist/cli/chunks/scheduler-BLA3Q4CH.js +0 -2
- package/dist/cli/chunks/sqlite-persistence-XIUYDJC4.js +0 -2
- package/dist/cli/chunks/task-handler-P6IFLCKP.js +0 -62
- package/dist/cli/chunks/task-handlers-DPWMUKFC.js +0 -9
- package/dist/cli/chunks/test-runner-process-46IPK3GH.js +0 -2
- package/dist/cli/chunks/tree-sitter-wasm-parser-MOI2WWNJ.js +0 -2
- package/dist/cli/chunks/unified-memory-FL26RTV3.js +0 -2
- package/dist/cli/chunks/unified-memory-hnsw-E2BPTH3U.js +0 -2
- package/dist/cli/chunks/unified-persistence-5ZOUPKHF.js +0 -2
- package/dist/cli/chunks/visual-security-IJVPO5FA.js +0 -2
- package/dist/cli/chunks/witness-chain-5FAFCQKP.js +0 -2
- package/dist/cli/chunks/witness-chain-V2M32W5D.js +0 -2
- package/dist/cli/chunks/workflow-orchestrator-3JLF3IX7.js +0 -2
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
* Based on ruvector-mincut-gated-transformer's coherence calculation patterns.
|
|
7
7
|
*/
|
|
8
8
|
import { QualityLambdaFlags, DEFAULT_COHERENCE_GATE_POLICY, } from './types.js';
|
|
9
|
+
import { isMeasuredMetricValue } from '../evidence-sufficiency.js';
|
|
9
10
|
/**
|
|
10
11
|
* Default dimension weights
|
|
11
12
|
*/
|
|
@@ -62,38 +63,80 @@ export class LambdaCalculator {
|
|
|
62
63
|
flags,
|
|
63
64
|
calculatedAt: new Date(),
|
|
64
65
|
dimensions,
|
|
66
|
+
unmeasured: this.findUnmeasuredInputs(metrics),
|
|
65
67
|
};
|
|
66
68
|
}
|
|
69
|
+
/**
|
|
70
|
+
* #1020: inputs with no measured value — missing, negative or non-finite.
|
|
71
|
+
* highVulns, mediumVulns and flakyTestRatio feed the always-scored security
|
|
72
|
+
* and reliability dimensions, so leaving them out is missing evidence, not
|
|
73
|
+
* "none". Optional dimensions (technical debt, duplication, branch coverage)
|
|
74
|
+
* count only when supplied.
|
|
75
|
+
*/
|
|
76
|
+
findUnmeasuredInputs(metrics) {
|
|
77
|
+
const unmeasured = [];
|
|
78
|
+
const required = [
|
|
79
|
+
'lineCoverage', 'testPassRate', 'criticalVulns', 'highVulns', 'mediumVulns',
|
|
80
|
+
'maintainabilityIndex', 'flakyTestRatio',
|
|
81
|
+
];
|
|
82
|
+
if (!(metrics.targetLatency <= 0))
|
|
83
|
+
required.push('p95Latency', 'targetLatency');
|
|
84
|
+
for (const name of required) {
|
|
85
|
+
if (!isMeasuredMetricValue(metrics[name]))
|
|
86
|
+
unmeasured.push(name);
|
|
87
|
+
}
|
|
88
|
+
const optional = ['branchCoverage', 'technicalDebtHours', 'duplicationPercent'];
|
|
89
|
+
for (const name of optional) {
|
|
90
|
+
if (metrics[name] !== undefined && !isMeasuredMetricValue(metrics[name]))
|
|
91
|
+
unmeasured.push(name);
|
|
92
|
+
}
|
|
93
|
+
return unmeasured;
|
|
94
|
+
}
|
|
67
95
|
/**
|
|
68
96
|
* Normalize raw metrics to 0-1 scale dimensions
|
|
69
97
|
*/
|
|
70
98
|
normalizeMetrics(metrics) {
|
|
99
|
+
// #1020: a dimension whose inputs are unmeasured (missing, negative,
|
|
100
|
+
// non-finite) is left out, never filled with a passing value; the inputs
|
|
101
|
+
// are listed in `unmeasured` and the gate never allows on them.
|
|
102
|
+
const measured = isMeasuredMetricValue;
|
|
71
103
|
// Coverage: Direct percentage to 0-1
|
|
72
|
-
const coverage = Math.min(
|
|
104
|
+
const coverage = measured(metrics.lineCoverage) ? Math.min(metrics.lineCoverage / 100, 1) : undefined;
|
|
73
105
|
// Pass rate: Direct percentage to 0-1
|
|
74
|
-
const passRate = Math.min(
|
|
106
|
+
const passRate = measured(metrics.testPassRate) ? Math.min(metrics.testPassRate / 100, 1) : undefined;
|
|
75
107
|
// Security: Inverse of vulnerability count, capped at 5 critical vulns
|
|
76
|
-
// 0 vulns = 1.0, 5+ critical vulns = 0.0
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
108
|
+
// 0 vulns = 1.0, 5+ critical vulns = 0.0. Unmeasured high/medium counts can
|
|
109
|
+
// only lower it further, so the score is then an upper bound: a failing
|
|
110
|
+
// value is conclusive, a passing one is not (they are listed as unmeasured).
|
|
111
|
+
let security;
|
|
112
|
+
if (measured(metrics.criticalVulns)) {
|
|
113
|
+
const criticalImpact = Math.min(metrics.criticalVulns / 5, 1);
|
|
114
|
+
const highImpact = measured(metrics.highVulns) ? Math.min(metrics.highVulns / 10, 0.3) : 0;
|
|
115
|
+
const mediumImpact = measured(metrics.mediumVulns) ? Math.min(metrics.mediumVulns / 20, 0.1) : 0;
|
|
116
|
+
security = Math.max(1 - criticalImpact - highImpact - mediumImpact, 0);
|
|
117
|
+
}
|
|
81
118
|
// Performance: Ratio of target to actual P95 latency, capped at 1
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
119
|
+
// (a target of 0 means no latency target is set)
|
|
120
|
+
let performance = 1;
|
|
121
|
+
if (!(metrics.targetLatency <= 0)) {
|
|
122
|
+
performance = measured(metrics.targetLatency) && measured(metrics.p95Latency)
|
|
123
|
+
? Math.min(metrics.targetLatency / Math.max(metrics.p95Latency, 1), 1)
|
|
124
|
+
: undefined;
|
|
125
|
+
}
|
|
85
126
|
// Maintainability: Direct index to 0-1
|
|
86
|
-
const maintainability =
|
|
127
|
+
const maintainability = measured(metrics.maintainabilityIndex)
|
|
128
|
+
? Math.min(metrics.maintainabilityIndex / 100, 1)
|
|
129
|
+
: undefined;
|
|
87
130
|
// Reliability: Inverse of flaky test ratio
|
|
88
|
-
const reliability = 1 -
|
|
131
|
+
const reliability = measured(metrics.flakyTestRatio) ? Math.max(1 - metrics.flakyTestRatio, 0) : undefined;
|
|
89
132
|
// Technical debt: Inverse ratio of debt to max acceptable
|
|
90
133
|
let technicalDebt;
|
|
91
|
-
if (metrics.technicalDebtHours
|
|
134
|
+
if (isMeasuredMetricValue(metrics.technicalDebtHours) && metrics.maxAcceptableDebtHours) {
|
|
92
135
|
technicalDebt = Math.max(1 - metrics.technicalDebtHours / metrics.maxAcceptableDebtHours, 0);
|
|
93
136
|
}
|
|
94
137
|
// Duplication: Inverse of duplication percentage (capped at 20%)
|
|
95
138
|
let duplication;
|
|
96
|
-
if (metrics.duplicationPercent
|
|
139
|
+
if (isMeasuredMetricValue(metrics.duplicationPercent)) {
|
|
97
140
|
duplication = Math.max(1 - metrics.duplicationPercent / 20, 0);
|
|
98
141
|
}
|
|
99
142
|
return {
|
|
@@ -25,23 +25,28 @@ export interface QualityLambda {
|
|
|
25
25
|
calculatedAt: Date;
|
|
26
26
|
/** Individual dimension values (normalized 0-1) */
|
|
27
27
|
dimensions: QualityDimensions;
|
|
28
|
+
/**
|
|
29
|
+
* #1020: inputs with no measured value (missing, negative or non-finite).
|
|
30
|
+
* While any is listed the gate never allows.
|
|
31
|
+
*/
|
|
32
|
+
unmeasured?: string[];
|
|
28
33
|
}
|
|
29
34
|
/**
|
|
30
35
|
* Quality dimensions normalized to 0-1 scale
|
|
31
36
|
*/
|
|
32
37
|
export interface QualityDimensions {
|
|
33
38
|
/** Line/statement coverage (0-1) */
|
|
34
|
-
coverage
|
|
39
|
+
coverage?: number;
|
|
35
40
|
/** Test pass rate (0-1) */
|
|
36
|
-
passRate
|
|
41
|
+
passRate?: number;
|
|
37
42
|
/** Security score (0-1, where 1 = no vulnerabilities) */
|
|
38
|
-
security
|
|
43
|
+
security?: number;
|
|
39
44
|
/** Performance score (0-1, based on P95 latency vs target) */
|
|
40
|
-
performance
|
|
45
|
+
performance?: number;
|
|
41
46
|
/** Maintainability index (0-1) */
|
|
42
|
-
maintainability
|
|
47
|
+
maintainability?: number;
|
|
43
48
|
/** Reliability score (0-1, based on flaky test ratio) */
|
|
44
|
-
reliability
|
|
49
|
+
reliability?: number;
|
|
45
50
|
/** Technical debt ratio (0-1, where 1 = no debt) */
|
|
46
51
|
technicalDebt?: number;
|
|
47
52
|
/** Code duplication score (0-1, where 1 = no duplication) */
|
|
@@ -116,7 +121,7 @@ export declare enum QualityTier {
|
|
|
116
121
|
/**
|
|
117
122
|
* Reason for quality gate decision
|
|
118
123
|
*/
|
|
119
|
-
export type QualityGateReason = 'none' | 'lambdaBelowMin' | 'lambdaDroppedFast' | 'boundarySpike' | 'boundaryConcentrationSpike' | 'partitionDrift' | 'forcedByFlag' | 'securityCritical' | 'coverageDrop' | 'testFailureSpike';
|
|
124
|
+
export type QualityGateReason = 'none' | 'lambdaBelowMin' | 'lambdaDroppedFast' | 'boundarySpike' | 'boundaryConcentrationSpike' | 'partitionDrift' | 'forcedByFlag' | 'securityCritical' | 'coverageDrop' | 'testFailureSpike' | 'insufficientEvidence';
|
|
120
125
|
/**
|
|
121
126
|
* Quality actions to take based on decision
|
|
122
127
|
*/
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
import { LoggerFactory } from '../../logging/index.js';
|
|
8
8
|
import { v4 as uuidv4 } from 'uuid';
|
|
9
9
|
import { createDomainFinding, } from '../../coordination/consensus/domain-findings.js';
|
|
10
|
+
import { isMeasuredMetricValue } from './evidence-sufficiency.js';
|
|
10
11
|
/**
|
|
11
12
|
* Check if a gate result is a borderline case.
|
|
12
13
|
* A borderline case is when any metric is within the configured margin of its threshold.
|
|
@@ -26,7 +27,8 @@ export function isBorderlineGateResult(metrics, thresholds, _result, borderlineM
|
|
|
26
27
|
for (const { metricKey, thresholdKey, isMin } of metricsToCheck) {
|
|
27
28
|
const metricValue = metrics[metricKey];
|
|
28
29
|
const thresholdConfig = thresholds[thresholdKey];
|
|
29
|
-
|
|
30
|
+
// #1020: an unmeasured value is not near any threshold.
|
|
31
|
+
if (thresholdConfig === undefined || !isMeasuredMetricValue(metricValue))
|
|
30
32
|
continue;
|
|
31
33
|
const threshold = isMin
|
|
32
34
|
? thresholdConfig.min
|
|
@@ -7,14 +7,28 @@
|
|
|
7
7
|
import { Result } from '../../shared/types';
|
|
8
8
|
import type { MemoryBackend } from '../../kernel/interfaces';
|
|
9
9
|
import type { QualityMetrics, GateEvaluationRequest } from './interfaces';
|
|
10
|
+
import { type StaticEvidenceStatus } from './evidence-sufficiency.js';
|
|
11
|
+
import { INSUFFICIENT_EVIDENCE, type QualityMetricName } from './quality-evidence.js';
|
|
10
12
|
/**
|
|
11
|
-
*
|
|
13
|
+
* #1020: the canonical quality metrics as measured. A metric without fresh,
|
|
14
|
+
* well-formed evidence is `-1` and listed in `unmeasured`; it is never
|
|
15
|
+
* replaced by a passing default.
|
|
12
16
|
*/
|
|
13
|
-
export
|
|
17
|
+
export interface MeasuredQualityMetrics {
|
|
18
|
+
metrics: QualityMetrics;
|
|
19
|
+
unmeasured: QualityMetricName[];
|
|
20
|
+
}
|
|
21
|
+
/** Evidence state of the metrics one result was computed from. */
|
|
22
|
+
export interface MetricEvidence {
|
|
23
|
+
evidenceStatus: StaticEvidenceStatus;
|
|
24
|
+
/** Metrics this result needed but has no measured value for. */
|
|
25
|
+
unmeasured: QualityMetricName[];
|
|
26
|
+
}
|
|
14
27
|
/**
|
|
15
|
-
*
|
|
28
|
+
* #1020: read the measured quality evidence (the same records the measured
|
|
29
|
+
* gate uses). Unmeasured metrics are `-1`, never a default.
|
|
16
30
|
*/
|
|
17
|
-
export declare function
|
|
31
|
+
export declare function getMeasuredMetrics(memory: MemoryBackend): Promise<MeasuredQualityMetrics>;
|
|
18
32
|
/**
|
|
19
33
|
* Generate a quality report
|
|
20
34
|
*/
|
|
@@ -24,15 +38,16 @@ export declare function generateReport(memory: MemoryBackend, options: {
|
|
|
24
38
|
}): Promise<Result<{
|
|
25
39
|
content: string;
|
|
26
40
|
format: string;
|
|
27
|
-
}, Error>>;
|
|
41
|
+
} & MetricEvidence, Error>>;
|
|
28
42
|
/**
|
|
29
43
|
* Get quality dashboard overview
|
|
30
44
|
*/
|
|
31
45
|
export declare function getQualityDashboard(memory: MemoryBackend): Promise<Result<{
|
|
46
|
+
/** 0-100; -1 when any metric is unmeasured (#1020). */
|
|
32
47
|
overallScore: number;
|
|
33
48
|
metrics: QualityMetrics;
|
|
34
49
|
trends: Record<string, number>;
|
|
35
|
-
}, Error>>;
|
|
50
|
+
} & MetricEvidence, Error>>;
|
|
36
51
|
/**
|
|
37
52
|
* Analyze project risks
|
|
38
53
|
*/
|
|
@@ -46,8 +61,9 @@ export declare function analyzeRisks(memory: MemoryBackend, options: {
|
|
|
46
61
|
description: string;
|
|
47
62
|
category: string;
|
|
48
63
|
}>;
|
|
49
|
-
|
|
50
|
-
|
|
64
|
+
/** #1020: `insufficient-evidence` unless a measured risk is already critical. */
|
|
65
|
+
overallRiskLevel: 'low' | 'medium' | 'high' | 'critical' | typeof INSUFFICIENT_EVIDENCE;
|
|
66
|
+
} & MetricEvidence, Error>>;
|
|
51
67
|
/**
|
|
52
68
|
* Evaluate a quality gate (simplified API)
|
|
53
69
|
*/
|
|
@@ -62,14 +78,16 @@ export declare function assessDeploymentReadiness(memory: MemoryBackend, options
|
|
|
62
78
|
environment: 'development' | 'staging' | 'production';
|
|
63
79
|
changeSet: string[];
|
|
64
80
|
}): Promise<Result<{
|
|
81
|
+
/** #1020: never true while an input is unmeasured. */
|
|
65
82
|
ready: boolean;
|
|
66
83
|
risks: Array<{
|
|
67
84
|
id: string;
|
|
68
85
|
severity: string;
|
|
69
86
|
description: string;
|
|
70
87
|
}>;
|
|
88
|
+
/** 0-100; -1 when a score input is unmeasured (#1020). */
|
|
71
89
|
score: number;
|
|
72
|
-
}, Error>>;
|
|
90
|
+
} & MetricEvidence, Error>>;
|
|
73
91
|
/**
|
|
74
92
|
* Analyze technical debt
|
|
75
93
|
*/
|
|
@@ -77,6 +95,7 @@ export declare function analyzeTechnicalDebt(memory: MemoryBackend, options: {
|
|
|
77
95
|
projectPath: string;
|
|
78
96
|
includeCodeSmells?: boolean;
|
|
79
97
|
}): Promise<Result<{
|
|
98
|
+
/** -1 when technical debt is unmeasured (#1020). */
|
|
80
99
|
totalDebt: number;
|
|
81
100
|
items: Array<{
|
|
82
101
|
file: string;
|
|
@@ -84,7 +103,8 @@ export declare function analyzeTechnicalDebt(memory: MemoryBackend, options: {
|
|
|
84
103
|
effort: number;
|
|
85
104
|
description: string;
|
|
86
105
|
}>;
|
|
106
|
+
/** -1 when technical debt is unmeasured (#1020). */
|
|
87
107
|
debtRatio: number;
|
|
88
|
-
}, Error>>;
|
|
108
|
+
} & MetricEvidence, Error>>;
|
|
89
109
|
export declare function generateRecommendations(metrics: QualityMetrics): string[];
|
|
90
110
|
//# sourceMappingURL=coordinator-reports.d.ts.map
|
|
@@ -6,38 +6,55 @@
|
|
|
6
6
|
*/
|
|
7
7
|
import { ok, err } from '../../shared/types/index.js';
|
|
8
8
|
import { toError } from '../../shared/error-utils.js';
|
|
9
|
+
import { isMeasuredMetricValue } from './evidence-sufficiency.js';
|
|
10
|
+
import { INSUFFICIENT_EVIDENCE, QUALITY_METRICS, describeMissingMetrics, inspectQualityEvidence, } from './quality-evidence.js';
|
|
11
|
+
/** #996: the sentinel for a metric with no measured value. */
|
|
12
|
+
const UNMEASURED = -1;
|
|
9
13
|
/**
|
|
10
|
-
*
|
|
14
|
+
* #1020: read the measured quality evidence (the same records the measured
|
|
15
|
+
* gate uses). Unmeasured metrics are `-1`, never a default.
|
|
11
16
|
*/
|
|
12
|
-
export function
|
|
17
|
+
export async function getMeasuredMetrics(memory) {
|
|
18
|
+
const { values } = await inspectQualityEvidence(memory);
|
|
19
|
+
const metrics = {};
|
|
20
|
+
const unmeasured = [];
|
|
21
|
+
for (const metric of QUALITY_METRICS) {
|
|
22
|
+
const value = values[metric];
|
|
23
|
+
if (isMeasuredMetricValue(value)) {
|
|
24
|
+
metrics[metric] = value;
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
metrics[metric] = UNMEASURED;
|
|
28
|
+
unmeasured.push(metric);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return { metrics, unmeasured };
|
|
32
|
+
}
|
|
33
|
+
/** Evidence state of `inputs` within `metrics`. */
|
|
34
|
+
function evidenceFor(metrics, inputs) {
|
|
35
|
+
const unmeasured = inputs.filter((metric) => !isMeasuredMetricValue(metrics[metric]));
|
|
13
36
|
return {
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
criticalBugs: 0,
|
|
17
|
-
codeSmells: 5,
|
|
18
|
-
securityVulnerabilities: 0,
|
|
19
|
-
technicalDebt: 10,
|
|
20
|
-
duplications: 3,
|
|
37
|
+
evidenceStatus: unmeasured.length === 0 ? 'measured' : INSUFFICIENT_EVIDENCE,
|
|
38
|
+
unmeasured,
|
|
21
39
|
};
|
|
22
40
|
}
|
|
23
|
-
/**
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
export async function getStoredOrDefaultMetrics(memory) {
|
|
27
|
-
const storedMetrics = await memory.get('quality-assessment:current-metrics');
|
|
28
|
-
return storedMetrics ?? getDefaultMetrics();
|
|
41
|
+
/** True when `metric` has a measured value. */
|
|
42
|
+
function measured(metrics, metric) {
|
|
43
|
+
return isMeasuredMetricValue(metrics[metric]);
|
|
29
44
|
}
|
|
30
45
|
/**
|
|
31
46
|
* Generate a quality report
|
|
32
47
|
*/
|
|
33
48
|
export async function generateReport(memory, options) {
|
|
34
49
|
try {
|
|
35
|
-
const metrics = await
|
|
50
|
+
const { metrics } = await getMeasuredMetrics(memory);
|
|
51
|
+
const evidence = evidenceFor(metrics, QUALITY_METRICS);
|
|
36
52
|
const reportData = {
|
|
37
53
|
timestamp: new Date().toISOString(),
|
|
54
|
+
...evidence,
|
|
38
55
|
metrics,
|
|
39
56
|
recommendations: options.includeRecommendations
|
|
40
|
-
? generateRecommendations(metrics)
|
|
57
|
+
? [...generateRecommendations(metrics), ...describeMissingMetrics(evidence.unmeasured)]
|
|
41
58
|
: undefined,
|
|
42
59
|
};
|
|
43
60
|
let content;
|
|
@@ -54,7 +71,7 @@ export async function generateReport(memory, options) {
|
|
|
54
71
|
default:
|
|
55
72
|
content = JSON.stringify(reportData, null, 2);
|
|
56
73
|
}
|
|
57
|
-
return ok({ content, format: options.format });
|
|
74
|
+
return ok({ content, format: options.format, ...evidence });
|
|
58
75
|
}
|
|
59
76
|
catch (error) {
|
|
60
77
|
return err(toError(error));
|
|
@@ -65,14 +82,16 @@ export async function generateReport(memory, options) {
|
|
|
65
82
|
*/
|
|
66
83
|
export async function getQualityDashboard(memory) {
|
|
67
84
|
try {
|
|
68
|
-
const metrics = await
|
|
69
|
-
const
|
|
85
|
+
const { metrics } = await getMeasuredMetrics(memory);
|
|
86
|
+
const evidence = evidenceFor(metrics, QUALITY_METRICS);
|
|
87
|
+
const overallScore = evidence.unmeasured.length > 0 ? UNMEASURED : Math.round((metrics.coverage * 0.3) +
|
|
70
88
|
(metrics.testsPassing * 0.3) +
|
|
71
89
|
((100 - Math.min(100, metrics.codeSmells)) * 0.2) +
|
|
72
90
|
((100 - Math.min(100, metrics.securityVulnerabilities * 10)) * 0.2));
|
|
73
91
|
return ok({
|
|
74
92
|
overallScore,
|
|
75
93
|
metrics,
|
|
94
|
+
...evidence,
|
|
76
95
|
trends: {
|
|
77
96
|
coverage: 0,
|
|
78
97
|
quality: 0,
|
|
@@ -89,9 +108,13 @@ export async function getQualityDashboard(memory) {
|
|
|
89
108
|
*/
|
|
90
109
|
export async function analyzeRisks(memory, options) {
|
|
91
110
|
try {
|
|
92
|
-
const metrics = await
|
|
111
|
+
const { metrics } = await getMeasuredMetrics(memory);
|
|
112
|
+
const inputs = ['coverage', 'technicalDebt'];
|
|
113
|
+
if (options.includeSecurityRisks)
|
|
114
|
+
inputs.push('securityVulnerabilities');
|
|
115
|
+
const evidence = evidenceFor(metrics, inputs);
|
|
93
116
|
const risks = [];
|
|
94
|
-
if (metrics.coverage < 50) {
|
|
117
|
+
if (measured(metrics, 'coverage') && metrics.coverage < 50) {
|
|
95
118
|
risks.push({
|
|
96
119
|
id: 'risk-coverage-critical',
|
|
97
120
|
severity: 'critical',
|
|
@@ -99,7 +122,7 @@ export async function analyzeRisks(memory, options) {
|
|
|
99
122
|
category: 'quality',
|
|
100
123
|
});
|
|
101
124
|
}
|
|
102
|
-
else if (metrics.coverage < 70) {
|
|
125
|
+
else if (measured(metrics, 'coverage') && metrics.coverage < 70) {
|
|
103
126
|
risks.push({
|
|
104
127
|
id: 'risk-coverage-high',
|
|
105
128
|
severity: 'high',
|
|
@@ -107,7 +130,7 @@ export async function analyzeRisks(memory, options) {
|
|
|
107
130
|
category: 'quality',
|
|
108
131
|
});
|
|
109
132
|
}
|
|
110
|
-
if (options.includeSecurityRisks && metrics.securityVulnerabilities > 0) {
|
|
133
|
+
if (options.includeSecurityRisks && measured(metrics, 'securityVulnerabilities') && metrics.securityVulnerabilities > 0) {
|
|
111
134
|
risks.push({
|
|
112
135
|
id: 'risk-security',
|
|
113
136
|
severity: metrics.securityVulnerabilities > 5 ? 'critical' : 'high',
|
|
@@ -115,7 +138,7 @@ export async function analyzeRisks(memory, options) {
|
|
|
115
138
|
category: 'security',
|
|
116
139
|
});
|
|
117
140
|
}
|
|
118
|
-
if (metrics.technicalDebt > 40) {
|
|
141
|
+
if (measured(metrics, 'technicalDebt') && metrics.technicalDebt > 40) {
|
|
119
142
|
risks.push({
|
|
120
143
|
id: 'risk-debt-critical',
|
|
121
144
|
severity: 'high',
|
|
@@ -129,13 +152,17 @@ export async function analyzeRisks(memory, options) {
|
|
|
129
152
|
if (criticalCount > 0) {
|
|
130
153
|
overallRiskLevel = 'critical';
|
|
131
154
|
}
|
|
155
|
+
else if (evidence.unmeasured.length > 0) {
|
|
156
|
+
// An unmeasured input could hide any risk: no level below critical is known.
|
|
157
|
+
overallRiskLevel = INSUFFICIENT_EVIDENCE;
|
|
158
|
+
}
|
|
132
159
|
else if (highCount > 1) {
|
|
133
160
|
overallRiskLevel = 'high';
|
|
134
161
|
}
|
|
135
162
|
else if (highCount > 0 || risks.length > 2) {
|
|
136
163
|
overallRiskLevel = 'medium';
|
|
137
164
|
}
|
|
138
|
-
return ok({ risks, overallRiskLevel });
|
|
165
|
+
return ok({ risks, overallRiskLevel, ...evidence });
|
|
139
166
|
}
|
|
140
167
|
catch (error) {
|
|
141
168
|
return err(toError(error));
|
|
@@ -145,15 +172,12 @@ export async function analyzeRisks(memory, options) {
|
|
|
145
172
|
* Evaluate a quality gate (simplified API)
|
|
146
173
|
*/
|
|
147
174
|
export function buildFullGateRequest(options) {
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
technicalDebt: options.metrics.technicalDebt ?? 10,
|
|
155
|
-
duplications: options.metrics.duplications ?? 3,
|
|
156
|
-
};
|
|
175
|
+
// #1020: a metric the caller did not supply is unmeasured (-1), never a
|
|
176
|
+
// passing default; the gate reports it as insufficient evidence.
|
|
177
|
+
const fullMetrics = {};
|
|
178
|
+
for (const metric of QUALITY_METRICS) {
|
|
179
|
+
fullMetrics[metric] = options.metrics[metric] ?? UNMEASURED;
|
|
180
|
+
}
|
|
157
181
|
return {
|
|
158
182
|
gateName: options.gateId,
|
|
159
183
|
metrics: fullMetrics,
|
|
@@ -171,24 +195,26 @@ export function buildFullGateRequest(options) {
|
|
|
171
195
|
*/
|
|
172
196
|
export async function assessDeploymentReadiness(memory, options) {
|
|
173
197
|
try {
|
|
174
|
-
const metrics = await
|
|
198
|
+
const { metrics } = await getMeasuredMetrics(memory);
|
|
199
|
+
const scoreInputs = ['coverage', 'testsPassing', 'securityVulnerabilities'];
|
|
200
|
+
const evidence = evidenceFor(metrics, options.environment === 'production' ? [...scoreInputs, 'criticalBugs'] : scoreInputs);
|
|
175
201
|
const risks = [];
|
|
176
202
|
if (options.environment === 'production') {
|
|
177
|
-
if (metrics.coverage < 70) {
|
|
203
|
+
if (measured(metrics, 'coverage') && metrics.coverage < 70) {
|
|
178
204
|
risks.push({
|
|
179
205
|
id: 'risk-coverage',
|
|
180
206
|
severity: 'high',
|
|
181
207
|
description: 'Coverage below recommended threshold for production',
|
|
182
208
|
});
|
|
183
209
|
}
|
|
184
|
-
if (metrics.securityVulnerabilities > 0) {
|
|
210
|
+
if (measured(metrics, 'securityVulnerabilities') && metrics.securityVulnerabilities > 0) {
|
|
185
211
|
risks.push({
|
|
186
212
|
id: 'risk-security',
|
|
187
213
|
severity: 'critical',
|
|
188
214
|
description: 'Security vulnerabilities must be resolved before production deployment',
|
|
189
215
|
});
|
|
190
216
|
}
|
|
191
|
-
if (metrics.criticalBugs > 0) {
|
|
217
|
+
if (measured(metrics, 'criticalBugs') && metrics.criticalBugs > 0) {
|
|
192
218
|
risks.push({
|
|
193
219
|
id: 'risk-bugs',
|
|
194
220
|
severity: 'critical',
|
|
@@ -196,11 +222,14 @@ export async function assessDeploymentReadiness(memory, options) {
|
|
|
196
222
|
});
|
|
197
223
|
}
|
|
198
224
|
}
|
|
199
|
-
const score =
|
|
200
|
-
(metrics.
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
225
|
+
const score = scoreInputs.every((metric) => measured(metrics, metric))
|
|
226
|
+
? Math.round((metrics.coverage * 0.4) +
|
|
227
|
+
(metrics.testsPassing * 0.3) +
|
|
228
|
+
((100 - Math.min(100, metrics.securityVulnerabilities * 20)) * 0.3))
|
|
229
|
+
: UNMEASURED;
|
|
230
|
+
const ready = evidence.unmeasured.length === 0
|
|
231
|
+
&& risks.filter((r) => r.severity === 'critical').length === 0 && score >= 70;
|
|
232
|
+
return ok({ ready, risks, score, ...evidence });
|
|
204
233
|
}
|
|
205
234
|
catch (error) {
|
|
206
235
|
return err(toError(error));
|
|
@@ -211,27 +240,33 @@ export async function assessDeploymentReadiness(memory, options) {
|
|
|
211
240
|
*/
|
|
212
241
|
export async function analyzeTechnicalDebt(memory, options) {
|
|
213
242
|
try {
|
|
214
|
-
const metrics = await
|
|
243
|
+
const { metrics } = await getMeasuredMetrics(memory);
|
|
244
|
+
const inputs = ['technicalDebt', 'duplications'];
|
|
245
|
+
if (options.includeCodeSmells)
|
|
246
|
+
inputs.push('codeSmells');
|
|
247
|
+
const evidence = evidenceFor(metrics, inputs);
|
|
248
|
+
// #1020: the metrics are project-wide counts, so the items name the
|
|
249
|
+
// project, not invented file paths.
|
|
215
250
|
const items = [];
|
|
216
|
-
if (metrics.duplications > 0) {
|
|
251
|
+
if (measured(metrics, 'duplications') && metrics.duplications > 0) {
|
|
217
252
|
items.push({
|
|
218
|
-
file:
|
|
253
|
+
file: options.projectPath,
|
|
219
254
|
type: 'duplication',
|
|
220
255
|
effort: metrics.duplications * 30,
|
|
221
|
-
description:
|
|
256
|
+
description: `Measured duplication of ${metrics.duplications}% across the project should be refactored`,
|
|
222
257
|
});
|
|
223
258
|
}
|
|
224
|
-
if (options.includeCodeSmells && metrics.codeSmells > 0) {
|
|
259
|
+
if (options.includeCodeSmells && measured(metrics, 'codeSmells') && metrics.codeSmells > 0) {
|
|
225
260
|
items.push({
|
|
226
|
-
file:
|
|
261
|
+
file: options.projectPath,
|
|
227
262
|
type: 'code-smell',
|
|
228
263
|
effort: metrics.codeSmells * 15,
|
|
229
|
-
description:
|
|
264
|
+
description: `${metrics.codeSmells} measured code smells impact maintainability`,
|
|
230
265
|
});
|
|
231
266
|
}
|
|
232
267
|
const totalDebt = metrics.technicalDebt;
|
|
233
|
-
const debtRatio = totalDebt / 100;
|
|
234
|
-
return ok({ totalDebt, items, debtRatio });
|
|
268
|
+
const debtRatio = measured(metrics, 'technicalDebt') ? totalDebt / 100 : UNMEASURED;
|
|
269
|
+
return ok({ totalDebt, items, debtRatio, ...evidence });
|
|
235
270
|
}
|
|
236
271
|
catch (error) {
|
|
237
272
|
return err(toError(error));
|
|
@@ -242,16 +277,17 @@ export async function analyzeTechnicalDebt(memory, options) {
|
|
|
242
277
|
// ============================================================================
|
|
243
278
|
export function generateRecommendations(metrics) {
|
|
244
279
|
const recommendations = [];
|
|
245
|
-
|
|
280
|
+
// #1020: only measured values support a recommendation; -1 is not "low".
|
|
281
|
+
if (measured(metrics, 'coverage') && metrics.coverage < 80) {
|
|
246
282
|
recommendations.push('Increase test coverage to at least 80%');
|
|
247
283
|
}
|
|
248
|
-
if (metrics.codeSmells > 10) {
|
|
284
|
+
if (measured(metrics, 'codeSmells') && metrics.codeSmells > 10) {
|
|
249
285
|
recommendations.push('Refactor complex code to improve maintainability');
|
|
250
286
|
}
|
|
251
|
-
if (metrics.technicalDebt > 20) {
|
|
287
|
+
if (measured(metrics, 'technicalDebt') && metrics.technicalDebt > 20) {
|
|
252
288
|
recommendations.push('Allocate time to reduce technical debt');
|
|
253
289
|
}
|
|
254
|
-
if (metrics.securityVulnerabilities > 0) {
|
|
290
|
+
if (measured(metrics, 'securityVulnerabilities') && metrics.securityVulnerabilities > 0) {
|
|
255
291
|
recommendations.push('Address security vulnerabilities urgently');
|
|
256
292
|
}
|
|
257
293
|
return recommendations;
|