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
|
@@ -52,17 +52,11 @@ export class SecurityAuditorService {
|
|
|
52
52
|
if (!ecosystem) {
|
|
53
53
|
return err(new Error(`Unknown manifest format: ${manifest}`));
|
|
54
54
|
}
|
|
55
|
-
const outdatedPackages = [];
|
|
56
55
|
const { dependencies, preUnchecked } = await this.parseDependenciesForScan(manifest, ecosystem);
|
|
57
56
|
const advisories = await this.checkDependencyAdvisories(dependencies, preUnchecked);
|
|
58
|
-
|
|
59
|
-
const outdated = await this.checkOutdated(dep);
|
|
60
|
-
if (outdated) {
|
|
61
|
-
outdatedPackages.push(outdated);
|
|
62
|
-
}
|
|
63
|
-
}
|
|
57
|
+
const outdated = await this.checkOutdatedPackages(dependencies);
|
|
64
58
|
const summary = this.createDependencySummary(advisories.vulnerabilities, dependencies.length);
|
|
65
|
-
const result = this.toDependencyScanResult(advisories,
|
|
59
|
+
const result = this.toDependencyScanResult(advisories, outdated, summary);
|
|
66
60
|
await this.memory.set(`security:deps:${manifestPath.filename}`, result, { namespace: 'security-compliance', ttl: 86400 });
|
|
67
61
|
return ok(result);
|
|
68
62
|
}
|
|
@@ -73,9 +67,20 @@ export class SecurityAuditorService {
|
|
|
73
67
|
async checkPackage(name, version, ecosystem) {
|
|
74
68
|
try {
|
|
75
69
|
const vulnerabilities = await this.queryVulnerabilityDatabase(name, version, ecosystem);
|
|
76
|
-
|
|
77
|
-
const
|
|
78
|
-
|
|
70
|
+
// #1052: a failed registry lookup is unchecked, never "not deprecated".
|
|
71
|
+
const registry = await this.lookupRegistry(name, ecosystem);
|
|
72
|
+
const unchecked = !registry.ok
|
|
73
|
+
? [`latest version and deprecation: ${registry.reason}`]
|
|
74
|
+
: registry.deprecated === null ? [`deprecation: not reported by the ${ecosystem} registry`] : [];
|
|
75
|
+
return ok({
|
|
76
|
+
name,
|
|
77
|
+
version,
|
|
78
|
+
vulnerabilities,
|
|
79
|
+
latestVersion: registry.ok ? registry.version : null,
|
|
80
|
+
isDeprecated: registry.ok ? registry.deprecated : null,
|
|
81
|
+
status: unchecked.length > 0 ? 'incomplete' : 'complete',
|
|
82
|
+
...(unchecked.length > 0 ? { unchecked } : {}),
|
|
83
|
+
});
|
|
79
84
|
}
|
|
80
85
|
catch (error) {
|
|
81
86
|
return err(toError(error));
|
|
@@ -97,17 +102,27 @@ export class SecurityAuditorService {
|
|
|
97
102
|
for (const [key, vulns] of byPackage) {
|
|
98
103
|
const [ecosystem, name] = key.split(':');
|
|
99
104
|
const currentVersion = vulns[0].location.dependency?.version || 'unknown';
|
|
100
|
-
const
|
|
105
|
+
const registry = await this.lookupRegistry(name, ecosystem);
|
|
101
106
|
const fixedVersions = vulns
|
|
102
107
|
.filter((v) => v.id)
|
|
103
108
|
.map((v) => v.id);
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
109
|
+
// #1052: without a target version the package is unchecked, not "upgrade to unknown".
|
|
110
|
+
recommendations.push(registry.ok
|
|
111
|
+
? {
|
|
112
|
+
package: name,
|
|
113
|
+
fromVersion: currentVersion,
|
|
114
|
+
toVersion: registry.version,
|
|
115
|
+
fixesVulnerabilities: fixedVersions,
|
|
116
|
+
breakingChanges: this.hasBreakingChanges(currentVersion, registry.version),
|
|
117
|
+
}
|
|
118
|
+
: {
|
|
119
|
+
package: name,
|
|
120
|
+
fromVersion: currentVersion,
|
|
121
|
+
toVersion: null,
|
|
122
|
+
fixesVulnerabilities: fixedVersions,
|
|
123
|
+
breakingChanges: null,
|
|
124
|
+
unchecked: registry.reason,
|
|
125
|
+
});
|
|
111
126
|
}
|
|
112
127
|
recommendations.sort((a, b) => b.fixesVulnerabilities.length - a.fixesVulnerabilities.length);
|
|
113
128
|
return ok(recommendations);
|
|
@@ -142,9 +157,26 @@ export class SecurityAuditorService {
|
|
|
142
157
|
const overallRiskScore = calculateOverallRisk(sastResults, dastResults, dependencyResults, secretScanResults);
|
|
143
158
|
const recommendations = generateRecommendations(sastResults, dastResults, dependencyResults, secretScanResults);
|
|
144
159
|
// #1049: an incomplete advisory lookup leaves dependency risk unmeasured.
|
|
160
|
+
const incompleteChecks = [];
|
|
145
161
|
if (dependencyResults && dependencyResults.status !== 'complete') {
|
|
162
|
+
incompleteChecks.push(`Dependency scan ${dependencyResults.status}: ${dependencyResults.error ?? 'advisories could not be checked'}`);
|
|
146
163
|
recommendations.unshift(`${dependencyResults.error ?? 'Dependency advisories could not be checked'}. Dependency risk is unmeasured; re-run the scan when the OSV API is reachable.`);
|
|
147
164
|
}
|
|
165
|
+
// #1221: a package whose latest version could not be looked up is not "up to date".
|
|
166
|
+
if (dependencyResults && dependencyResults.outdatedStatus !== 'complete' && dependencyResults.outdatedStatus !== 'not-run') {
|
|
167
|
+
const unchecked = dependencyResults.outdatedUnchecked;
|
|
168
|
+
const reasons = [...new Set(unchecked.map((p) => p.reason))].slice(0, 3).join('; ') || 'no reason was recorded';
|
|
169
|
+
// A planning entry (the scan itself failed) is not a package.
|
|
170
|
+
const packages = unchecked.filter((p) => p.name !== PLANNING_ENTRY).length;
|
|
171
|
+
const what = packages > 0 ? `latest version unknown for ${packages} package(s)` : 'no latest version was looked up';
|
|
172
|
+
incompleteChecks.push(`Outdated-package check ${dependencyResults.outdatedStatus}: ${what}: ${reasons}`);
|
|
173
|
+
recommendations.unshift(`${packages > 0 ? `Latest versions could not be looked up for ${packages} package(s)` : 'No latest versions were looked up'} (${reasons}). Whether packages are outdated is unknown.`);
|
|
174
|
+
}
|
|
175
|
+
// #1052: a DAST target that could not be (fully) scanned is not a clean target.
|
|
176
|
+
if (dastResults && dastResults.status !== 'complete') {
|
|
177
|
+
incompleteChecks.push(`DAST scan ${dastResults.status}: ${dastResults.error ?? 'the target was not fully scanned'}`);
|
|
178
|
+
recommendations.unshift(`DAST scan ${dastResults.status} (${dastResults.error ?? 'the target was not fully scanned'}). Dynamic risk is unmeasured for what was not scanned.`);
|
|
179
|
+
}
|
|
148
180
|
const report = {
|
|
149
181
|
auditId,
|
|
150
182
|
timestamp,
|
|
@@ -154,6 +186,7 @@ export class SecurityAuditorService {
|
|
|
154
186
|
secretScanResults,
|
|
155
187
|
overallRiskScore,
|
|
156
188
|
recommendations,
|
|
189
|
+
...(incompleteChecks.length > 0 ? { incompleteChecks } : {}),
|
|
157
190
|
};
|
|
158
191
|
await this.memory.set(`security:audit:${auditId}`, report, { namespace: 'security-compliance', persist: true });
|
|
159
192
|
return ok(report);
|
|
@@ -359,10 +392,12 @@ export class SecurityAuditorService {
|
|
|
359
392
|
}),
|
|
360
393
|
};
|
|
361
394
|
}
|
|
362
|
-
toDependencyScanResult(advisories,
|
|
395
|
+
toDependencyScanResult(advisories, outdated, summary) {
|
|
363
396
|
return {
|
|
364
397
|
vulnerabilities: advisories.vulnerabilities,
|
|
365
|
-
outdatedPackages,
|
|
398
|
+
outdatedPackages: outdated.outdatedPackages,
|
|
399
|
+
outdatedStatus: outdated.outdatedStatus,
|
|
400
|
+
outdatedUnchecked: outdated.outdatedUnchecked,
|
|
366
401
|
summary,
|
|
367
402
|
status: advisories.status,
|
|
368
403
|
measured: advisories.status === 'complete',
|
|
@@ -430,18 +465,30 @@ export class SecurityAuditorService {
|
|
|
430
465
|
return 'vulnerable-components';
|
|
431
466
|
return 'vulnerable-components';
|
|
432
467
|
}
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
468
|
+
/**
|
|
469
|
+
* Look up the latest version of each dependency (#1221). A failed lookup is
|
|
470
|
+
* listed in `outdatedUnchecked` with its reason, never counted as up to date.
|
|
471
|
+
*/
|
|
472
|
+
async checkOutdatedPackages(dependencies) {
|
|
473
|
+
const outdatedPackages = [];
|
|
474
|
+
const outdatedUnchecked = [];
|
|
475
|
+
for (const dep of dependencies) {
|
|
476
|
+
const registry = await this.lookupRegistry(dep.name, dep.ecosystem);
|
|
477
|
+
if (!registry.ok) {
|
|
478
|
+
outdatedUnchecked.push({ name: dep.name, version: dep.version, reason: registry.reason });
|
|
479
|
+
}
|
|
480
|
+
else if (registry.version !== dep.version) {
|
|
481
|
+
outdatedPackages.push({
|
|
482
|
+
name: dep.name,
|
|
483
|
+
currentVersion: dep.version,
|
|
484
|
+
latestVersion: registry.version,
|
|
485
|
+
updateType: this.determineUpdateType(dep.version, registry.version),
|
|
486
|
+
});
|
|
487
|
+
}
|
|
443
488
|
}
|
|
444
|
-
|
|
489
|
+
const outdatedStatus = outdatedUnchecked.length === 0 ? 'complete'
|
|
490
|
+
: outdatedUnchecked.length === dependencies.length ? 'failed' : 'incomplete';
|
|
491
|
+
return { outdatedPackages, outdatedStatus, outdatedUnchecked };
|
|
445
492
|
}
|
|
446
493
|
async queryVulnerabilityDatabase(name, version, ecosystem) {
|
|
447
494
|
const outcome = await this.checkDependencyAdvisories([{ name, version, ecosystem }]);
|
|
@@ -450,39 +497,35 @@ export class SecurityAuditorService {
|
|
|
450
497
|
}
|
|
451
498
|
return outcome.vulnerabilities;
|
|
452
499
|
}
|
|
453
|
-
|
|
500
|
+
/**
|
|
501
|
+
* Latest version and deprecation from the package registry (#1052). A failed
|
|
502
|
+
* lookup says why; it never reads as "not deprecated" or a version.
|
|
503
|
+
* `deprecated` is null when the registry does not report deprecation.
|
|
504
|
+
*/
|
|
505
|
+
async lookupRegistry(name, ecosystem) {
|
|
454
506
|
try {
|
|
455
507
|
if (ecosystem === 'npm') {
|
|
456
508
|
const response = await httpGet(`https://registry.npmjs.org/${encodeURIComponent(name)}/latest`);
|
|
457
|
-
if (response.ok
|
|
458
|
-
return response.
|
|
459
|
-
|
|
509
|
+
if (!response.ok)
|
|
510
|
+
return { ok: false, reason: `npm registry returned HTTP ${response.status}` };
|
|
511
|
+
if (!response.data.version)
|
|
512
|
+
return { ok: false, reason: 'npm registry response has no version' };
|
|
513
|
+
return { ok: true, version: response.data.version, deprecated: Boolean(response.data.deprecated) };
|
|
460
514
|
}
|
|
461
|
-
|
|
515
|
+
if (ecosystem === 'pip') {
|
|
462
516
|
const response = await httpGet(`https://pypi.org/pypi/${encodeURIComponent(name)}/json`);
|
|
463
|
-
if (response.ok
|
|
464
|
-
return response.
|
|
465
|
-
|
|
517
|
+
if (!response.ok)
|
|
518
|
+
return { ok: false, reason: `PyPI returned HTTP ${response.status}` };
|
|
519
|
+
if (!response.data.info?.version)
|
|
520
|
+
return { ok: false, reason: 'PyPI response has no version' };
|
|
521
|
+
return { ok: true, version: response.data.info.version, deprecated: null };
|
|
466
522
|
}
|
|
523
|
+
return { ok: false, reason: `no registry lookup for ${ecosystem} packages` };
|
|
467
524
|
}
|
|
468
525
|
catch (error) {
|
|
469
|
-
logger.error(`
|
|
526
|
+
logger.error(`Registry lookup failed for ${name}:`, error instanceof Error ? error : undefined);
|
|
527
|
+
return { ok: false, reason: `registry lookup failed: ${toError(error).message}` };
|
|
470
528
|
}
|
|
471
|
-
return 'unknown';
|
|
472
|
-
}
|
|
473
|
-
async checkDeprecation(name, ecosystem) {
|
|
474
|
-
try {
|
|
475
|
-
if (ecosystem === 'npm') {
|
|
476
|
-
const response = await httpGet(`https://registry.npmjs.org/${encodeURIComponent(name)}/latest`);
|
|
477
|
-
if (response.ok && response.data.deprecated) {
|
|
478
|
-
return true;
|
|
479
|
-
}
|
|
480
|
-
}
|
|
481
|
-
}
|
|
482
|
-
catch (error) {
|
|
483
|
-
logger.error(`Failed to check deprecation for ${name}:`, error instanceof Error ? error : undefined);
|
|
484
|
-
}
|
|
485
|
-
return false;
|
|
486
529
|
}
|
|
487
530
|
determineUpdateType(current, latest) {
|
|
488
531
|
const currentParts = current.split('.').map(Number);
|
|
@@ -534,26 +577,24 @@ export class SecurityAuditorService {
|
|
|
534
577
|
}
|
|
535
578
|
async performDependencyScan() {
|
|
536
579
|
const startTime = Date.now();
|
|
537
|
-
const outdatedPackages = [];
|
|
538
580
|
const manifestPath = path.join(process.cwd(), 'package.json');
|
|
539
581
|
try {
|
|
540
582
|
const { dependencies, preUnchecked } = await this.parseDependenciesForScan(manifestPath, 'npm');
|
|
541
583
|
const advisories = await this.checkDependencyAdvisories(dependencies, preUnchecked);
|
|
542
|
-
|
|
543
|
-
const outdated = await this.checkOutdated(dep);
|
|
544
|
-
if (outdated) {
|
|
545
|
-
outdatedPackages.push(outdated);
|
|
546
|
-
}
|
|
547
|
-
}
|
|
584
|
+
const outdated = await this.checkOutdatedPackages(dependencies);
|
|
548
585
|
const baseSummary = this.createDependencySummary(advisories.vulnerabilities, dependencies.length);
|
|
549
|
-
return this.toDependencyScanResult(advisories,
|
|
586
|
+
return this.toDependencyScanResult(advisories, outdated, { ...baseSummary, scanDurationMs: Date.now() - startTime });
|
|
550
587
|
}
|
|
551
588
|
catch (error) {
|
|
552
589
|
logger.error('Dependency scan failed:', error instanceof Error ? error : undefined);
|
|
553
590
|
// #1049: a scan that could not run is failed, never an empty clean result.
|
|
591
|
+
const reason = `Dependency scan of ${manifestPath} failed: ${toError(error).message}`;
|
|
554
592
|
return {
|
|
555
593
|
vulnerabilities: [],
|
|
556
594
|
outdatedPackages: [],
|
|
595
|
+
outdatedStatus: 'failed',
|
|
596
|
+
// #1221: no package list to look up; the planning entry says why.
|
|
597
|
+
outdatedUnchecked: [{ name: PLANNING_ENTRY, version: 'unknown', reason }],
|
|
557
598
|
summary: {
|
|
558
599
|
critical: 0, high: 0, medium: 0, low: 0, informational: 0,
|
|
559
600
|
totalFiles: 0, scanDurationMs: Date.now() - startTime,
|
|
@@ -562,7 +603,7 @@ export class SecurityAuditorService {
|
|
|
562
603
|
measured: false,
|
|
563
604
|
packagesChecked: 0,
|
|
564
605
|
uncheckedPackages: [],
|
|
565
|
-
error:
|
|
606
|
+
error: reason,
|
|
566
607
|
};
|
|
567
608
|
}
|
|
568
609
|
}
|
|
@@ -126,7 +126,8 @@ export declare class TestExecutionCoordinator extends BaseDomainCoordinator<Test
|
|
|
126
126
|
/**
|
|
127
127
|
* Retry a run's failed tests when retries were requested, and attach what
|
|
128
128
|
* the retries did to the run (#1130). A test that passed on a retry counts
|
|
129
|
-
* as passed and flaky in the run's own counts (#1170).
|
|
129
|
+
* as passed and flaky in the run's own counts (#1170). When that changes
|
|
130
|
+
* the outcome, the run is stored again with it (#1176).
|
|
130
131
|
*/
|
|
131
132
|
private retryFailures;
|
|
132
133
|
/**
|
|
@@ -23,6 +23,17 @@ import { createMinCutTestOptimizer, } from './services/mincut-test-optimizer.js'
|
|
|
23
23
|
export function calculateRetryStrategyConfidence(testCount) {
|
|
24
24
|
return Math.min(1, 0.7 + (testCount / 100));
|
|
25
25
|
}
|
|
26
|
+
/** #1176: TestRunCompleted for a run's final outcome, retries applied. */
|
|
27
|
+
function completedPayload(run) {
|
|
28
|
+
return {
|
|
29
|
+
runId: run.runId,
|
|
30
|
+
passed: run.passed,
|
|
31
|
+
failed: run.failed,
|
|
32
|
+
skipped: run.skipped,
|
|
33
|
+
duration: run.duration,
|
|
34
|
+
...(run.flaky ? { flaky: run.flaky } : {}),
|
|
35
|
+
};
|
|
36
|
+
}
|
|
26
37
|
const DEFAULT_COORDINATOR_CONFIG = {
|
|
27
38
|
simulateForTesting: false,
|
|
28
39
|
enablePrioritization: true,
|
|
@@ -141,32 +152,31 @@ export class TestExecutionCoordinator extends BaseDomainCoordinator {
|
|
|
141
152
|
const timeout = request.timeout ?? Math.max(60000, testsToRun.length * 2000);
|
|
142
153
|
// Use parallel execution by default (unless explicitly disabled)
|
|
143
154
|
if (request.parallel !== false && testsToRun.length > 1) {
|
|
144
|
-
|
|
155
|
+
// #1176: execute/executeParallel run the retries before they record
|
|
156
|
+
// the run, so its events and learning records see the final outcome.
|
|
157
|
+
return this.executeParallel({
|
|
145
158
|
testFiles: testsToRun,
|
|
146
159
|
framework,
|
|
147
160
|
workers,
|
|
148
161
|
timeout,
|
|
162
|
+
retryCount: request.retryCount,
|
|
149
163
|
});
|
|
150
|
-
if (result.success)
|
|
151
|
-
await this.retryFailures(result.value, request.retryCount);
|
|
152
|
-
return result;
|
|
153
164
|
}
|
|
154
165
|
// Sequential execution
|
|
155
|
-
|
|
166
|
+
return this.execute({
|
|
156
167
|
testFiles: testsToRun,
|
|
157
168
|
framework,
|
|
158
169
|
timeout,
|
|
170
|
+
retryCount: request.retryCount,
|
|
159
171
|
});
|
|
160
|
-
if (result.success)
|
|
161
|
-
await this.retryFailures(result.value, request.retryCount);
|
|
162
|
-
return result;
|
|
163
172
|
}
|
|
164
173
|
/**
|
|
165
174
|
* Retry a run's failed tests when retries were requested, and attach what
|
|
166
175
|
* the retries did to the run (#1130). A test that passed on a retry counts
|
|
167
|
-
* as passed and flaky in the run's own counts (#1170).
|
|
176
|
+
* as passed and flaky in the run's own counts (#1170). When that changes
|
|
177
|
+
* the outcome, the run is stored again with it (#1176).
|
|
168
178
|
*/
|
|
169
|
-
async retryFailures(run, retryCount) {
|
|
179
|
+
async retryFailures(run, retryCount, testFiles) {
|
|
170
180
|
if (!retryCount || retryCount <= 0)
|
|
171
181
|
return;
|
|
172
182
|
if (run.failed === 0) {
|
|
@@ -182,6 +192,7 @@ export class TestExecutionCoordinator extends BaseDomainCoordinator {
|
|
|
182
192
|
if (!retried.success)
|
|
183
193
|
return;
|
|
184
194
|
applyRetryOutcome(run, retried.value);
|
|
195
|
+
await this.executor.recordFinalOutcome(run, testFiles);
|
|
185
196
|
}
|
|
186
197
|
/**
|
|
187
198
|
* Detect test framework from file patterns and project configuration
|
|
@@ -244,20 +255,18 @@ export class TestExecutionCoordinator extends BaseDomainCoordinator {
|
|
|
244
255
|
// Remove from active runs
|
|
245
256
|
this.activeRuns.delete(runId);
|
|
246
257
|
if (result.success) {
|
|
258
|
+
// #1176: these first-attempt failures did happen; flaky analysis
|
|
259
|
+
// records them even when a retry then passes.
|
|
260
|
+
const firstAttemptFailures = [...result.value.failedTests];
|
|
261
|
+
await this.retryFailures(result.value, request.retryCount, orderedTestFiles);
|
|
247
262
|
// Record execution results for learning
|
|
248
263
|
if (this.config.enablePrioritization && prioritizationResult) {
|
|
249
264
|
await this.recordExecutionResults(runId, orderedTestFiles, result.value, prioritizationResult);
|
|
250
265
|
}
|
|
251
266
|
// Publish completion event
|
|
252
|
-
await this.publishEvent(TestExecutionEvents.TestRunCompleted,
|
|
253
|
-
runId: result.value.runId,
|
|
254
|
-
passed: result.value.passed,
|
|
255
|
-
failed: result.value.failed,
|
|
256
|
-
skipped: result.value.skipped,
|
|
257
|
-
duration: result.value.duration,
|
|
258
|
-
});
|
|
267
|
+
await this.publishEvent(TestExecutionEvents.TestRunCompleted, completedPayload(result.value));
|
|
259
268
|
// Record failed tests for flaky analysis
|
|
260
|
-
for (const failed of
|
|
269
|
+
for (const failed of firstAttemptFailures) {
|
|
261
270
|
await this.flakyDetector.recordExecution(failed.testId, {
|
|
262
271
|
runId: result.value.runId,
|
|
263
272
|
passed: false,
|
|
@@ -287,7 +296,7 @@ export class TestExecutionCoordinator extends BaseDomainCoordinator {
|
|
|
287
296
|
if (this.config.infraHealing && result.value.failedTests.length > 0) {
|
|
288
297
|
this.feedInfraHealingFromFailures(result.value.failedTests);
|
|
289
298
|
// ADR-057: Attempt automatic recovery and re-run affected tests
|
|
290
|
-
const rerunResult = await this.attemptAutoRecoveryAndRerun(result.value.failedTests, request.framework, { timeout: request.timeout, env: request.env });
|
|
299
|
+
const rerunResult = await this.attemptAutoRecoveryAndRerun(result.value.failedTests, request.framework, { timeout: request.timeout, env: request.env, retryCount: request.retryCount });
|
|
291
300
|
if (rerunResult)
|
|
292
301
|
return rerunResult;
|
|
293
302
|
}
|
|
@@ -357,18 +366,14 @@ export class TestExecutionCoordinator extends BaseDomainCoordinator {
|
|
|
357
366
|
// Remove from active runs
|
|
358
367
|
this.activeRuns.delete(runId);
|
|
359
368
|
if (result.success) {
|
|
369
|
+
// #1176: retries finish before the run is recorded or announced.
|
|
370
|
+
await this.retryFailures(result.value, request.retryCount, orderedTestFiles);
|
|
360
371
|
// Record execution results for learning
|
|
361
372
|
if (this.config.enablePrioritization && prioritizationResult) {
|
|
362
373
|
await this.recordExecutionResults(runId, orderedTestFiles, result.value, prioritizationResult);
|
|
363
374
|
}
|
|
364
375
|
// Publish completion event
|
|
365
|
-
await this.publishEvent(TestExecutionEvents.TestRunCompleted,
|
|
366
|
-
runId: result.value.runId,
|
|
367
|
-
passed: result.value.passed,
|
|
368
|
-
failed: result.value.failed,
|
|
369
|
-
skipped: result.value.skipped,
|
|
370
|
-
duration: result.value.duration,
|
|
371
|
-
});
|
|
376
|
+
await this.publishEvent(TestExecutionEvents.TestRunCompleted, completedPayload(result.value));
|
|
372
377
|
// Check for flaky tests based on history
|
|
373
378
|
for (const failed of result.value.failedTests) {
|
|
374
379
|
const flakinessScore = await this.flakyDetector.getFlakinessScore(failed.testId);
|
|
@@ -402,7 +407,7 @@ export class TestExecutionCoordinator extends BaseDomainCoordinator {
|
|
|
402
407
|
if (this.config.infraHealing && result.value.failedTests.length > 0) {
|
|
403
408
|
this.feedInfraHealingFromFailures(result.value.failedTests);
|
|
404
409
|
// ADR-057: Attempt automatic recovery and re-run affected tests
|
|
405
|
-
const rerunResult = await this.attemptAutoRecoveryAndRerun(result.value.failedTests, request.framework, { timeout: request.timeout, env: request.env });
|
|
410
|
+
const rerunResult = await this.attemptAutoRecoveryAndRerun(result.value.failedTests, request.framework, { timeout: request.timeout, env: request.env, retryCount: request.retryCount });
|
|
406
411
|
if (rerunResult)
|
|
407
412
|
return rerunResult;
|
|
408
413
|
}
|
|
@@ -624,6 +629,7 @@ export class TestExecutionCoordinator extends BaseDomainCoordinator {
|
|
|
624
629
|
framework,
|
|
625
630
|
timeout: originalRequest.timeout,
|
|
626
631
|
env: originalRequest.env,
|
|
632
|
+
retryCount: originalRequest.retryCount,
|
|
627
633
|
});
|
|
628
634
|
}
|
|
629
635
|
/**
|
|
@@ -54,6 +54,11 @@ export interface IExecuteTestsRequest {
|
|
|
54
54
|
timeout?: number;
|
|
55
55
|
env?: Record<string, string>;
|
|
56
56
|
reporters?: string[];
|
|
57
|
+
/**
|
|
58
|
+
* #1176: retries of each failed test. They run before the run is recorded
|
|
59
|
+
* or TestRunCompleted is published, so both carry the final outcome.
|
|
60
|
+
*/
|
|
61
|
+
retryCount?: number;
|
|
57
62
|
}
|
|
58
63
|
export interface IParallelExecutionRequest extends IExecuteTestsRequest {
|
|
59
64
|
workers: number;
|
|
@@ -71,6 +71,12 @@ export declare class TestExecutorService implements ITestExecutionService {
|
|
|
71
71
|
* Execute tests in parallel across multiple workers
|
|
72
72
|
*/
|
|
73
73
|
executeParallel(request: ParallelExecutionRequest): Promise<Result<TestRunResult, Error>>;
|
|
74
|
+
/**
|
|
75
|
+
* #1176: record a run again after its retries changed the outcome, so the
|
|
76
|
+
* stored run, its testsPassing evidence and its coverage runStatus are the
|
|
77
|
+
* final ones rather than the first attempt's.
|
|
78
|
+
*/
|
|
79
|
+
recordFinalOutcome(run: TestRunResult, testFiles?: readonly string[]): Promise<void>;
|
|
74
80
|
/**
|
|
75
81
|
* Get results for a specific run
|
|
76
82
|
*/
|
|
@@ -16,7 +16,7 @@ import { safeJsonParse } from '../../../shared/safe-json.js';
|
|
|
16
16
|
import { secureRandom, secureRandomInt } from '../../../shared/utils/crypto-random.js';
|
|
17
17
|
import { writeTestRunEvidence } from '../../quality-assessment/quality-evidence.js';
|
|
18
18
|
import { istanbulLineHits } from '../../../coordination/handlers/handler-utils.js';
|
|
19
|
-
import { fileCoverageKey } from '../../coverage-analysis/collected-metrics.js';
|
|
19
|
+
import { fileCoverageKey, projectFileCoverageKeys } from '../../coverage-analysis/collected-metrics.js';
|
|
20
20
|
import { mergeTestCases, redactFailedTests, redactFailureText, testCasesFromRunnerReport } from './runner-test-cases.js';
|
|
21
21
|
import { capDiagnostics, getTestRunnerExecutionError, TestRunnerExecutionError } from '../../../shared/test-runner-verdict.js';
|
|
22
22
|
import { createVitestJsonReport } from '../../../shared/vitest-json-report.js';
|
|
@@ -157,6 +157,15 @@ export class TestExecutorService {
|
|
|
157
157
|
return err(toError(error));
|
|
158
158
|
}
|
|
159
159
|
}
|
|
160
|
+
/**
|
|
161
|
+
* #1176: record a run again after its retries changed the outcome, so the
|
|
162
|
+
* stored run, its testsPassing evidence and its coverage runStatus are the
|
|
163
|
+
* final ones rather than the first attempt's.
|
|
164
|
+
*/
|
|
165
|
+
async recordFinalOutcome(run, testFiles) {
|
|
166
|
+
this.runResults.set(run.runId, run);
|
|
167
|
+
await this.storeResults(run.runId, run, testFiles);
|
|
168
|
+
}
|
|
160
169
|
/**
|
|
161
170
|
* Get results for a specific run
|
|
162
171
|
*/
|
|
@@ -1246,11 +1255,14 @@ Provide:
|
|
|
1246
1255
|
}, { persist: true });
|
|
1247
1256
|
// Store per-file coverage via memory.set() (not storeVector) so that
|
|
1248
1257
|
// quality-analyzer's getStoredCoverage() can read it with memory.get()
|
|
1258
|
+
// #1027 N7: one key form — the absolute path. #1030: only files inside
|
|
1259
|
+
// the project, each listed once.
|
|
1260
|
+
const keys = projectFileCoverageKeys((result.fileCoverages ?? []).map(fc => fc.path));
|
|
1249
1261
|
for (const fc of result.fileCoverages ?? []) {
|
|
1250
|
-
|
|
1262
|
+
const key = keys.get(fc.path);
|
|
1263
|
+
if (!key || !Number.isFinite(fc.line))
|
|
1251
1264
|
continue;
|
|
1252
|
-
|
|
1253
|
-
await this.memory.set(`coverage:file:${fileCoverageKey(fc.path)}`, {
|
|
1265
|
+
await this.memory.set(`coverage:file:${key}`, {
|
|
1254
1266
|
line: fc.line,
|
|
1255
1267
|
branch: fc.branch ?? null,
|
|
1256
1268
|
function: fc.function ?? null,
|
|
@@ -298,13 +298,23 @@ export class VisualAccessibilityCoordinator extends BaseDomainCoordinator {
|
|
|
298
298
|
}
|
|
299
299
|
this.addAgentToWorkflow(workflowId, agentResult.value);
|
|
300
300
|
const reports = [];
|
|
301
|
+
const notMeasured = [];
|
|
301
302
|
let totalViolations = 0;
|
|
302
303
|
let criticalViolations = 0;
|
|
303
304
|
let passingUrls = 0;
|
|
304
305
|
for (let i = 0; i < urls.length; i++) {
|
|
305
306
|
const url = urls[i];
|
|
306
307
|
const auditResult = await this.accessibilityTester.audit(url, { wcagLevel: level });
|
|
307
|
-
if (auditResult.success) {
|
|
308
|
+
if (!auditResult.success) {
|
|
309
|
+
notMeasured.push({ url, reason: auditResult.error.message });
|
|
310
|
+
}
|
|
311
|
+
else if (auditResult.value.measured !== true) {
|
|
312
|
+
// #1145: an unmeasured page is reported as such, never as a pass,
|
|
313
|
+
// a fail or a finding, and no audit event is published for it.
|
|
314
|
+
reports.push(auditResult.value);
|
|
315
|
+
notMeasured.push({ url, reason: auditResult.value.notMeasuredReason ?? 'not measured' });
|
|
316
|
+
}
|
|
317
|
+
else {
|
|
308
318
|
const report = auditResult.value;
|
|
309
319
|
reports.push(report);
|
|
310
320
|
totalViolations += report.violations.length;
|
|
@@ -319,12 +329,14 @@ export class VisualAccessibilityCoordinator extends BaseDomainCoordinator {
|
|
|
319
329
|
}
|
|
320
330
|
this.updateWorkflowProgress(workflowId, ((i + 1) / urls.length) * 100);
|
|
321
331
|
}
|
|
322
|
-
//
|
|
323
|
-
const
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
const topIssues = this.identifyTopIssues(
|
|
332
|
+
// Scores and top issues cover measured pages only (#1145)
|
|
333
|
+
const measuredReports = reports.filter((r) => r.measured === true);
|
|
334
|
+
const averageScore = measuredReports.length > 0
|
|
335
|
+
? Math.round(measuredReports.reduce((sum, r) => sum + r.score, 0) / measuredReports.length)
|
|
336
|
+
: -1;
|
|
337
|
+
const topIssues = this.identifyTopIssues(measuredReports);
|
|
338
|
+
const status = notMeasured.length === 0 ? 'measured'
|
|
339
|
+
: measuredReports.length === 0 ? 'not-measured' : 'partial';
|
|
328
340
|
const auditReport = {
|
|
329
341
|
totalUrls: urls.length,
|
|
330
342
|
passingUrls,
|
|
@@ -333,6 +345,14 @@ export class VisualAccessibilityCoordinator extends BaseDomainCoordinator {
|
|
|
333
345
|
averageScore,
|
|
334
346
|
reports,
|
|
335
347
|
topIssues,
|
|
348
|
+
status,
|
|
349
|
+
measuredUrls: measuredReports.length,
|
|
350
|
+
notMeasured,
|
|
351
|
+
...(notMeasured.length > 0 ? {
|
|
352
|
+
message: `Accessibility NOT MEASURED for ${notMeasured.length} of ${urls.length} URL(s); ` +
|
|
353
|
+
'they count as neither passing nor failing and contribute no findings. ' +
|
|
354
|
+
notMeasured.map((n) => `${n.url}: ${n.reason}`).join('; '),
|
|
355
|
+
} : {}),
|
|
336
356
|
};
|
|
337
357
|
this.completeWorkflow(workflowId);
|
|
338
358
|
await this.agentCoordinator.stop(agentResult.value);
|
|
@@ -512,8 +532,9 @@ export class VisualAccessibilityCoordinator extends BaseDomainCoordinator {
|
|
|
512
532
|
return err(result.error);
|
|
513
533
|
}
|
|
514
534
|
const report = result.value.reports[0];
|
|
515
|
-
if (!report) {
|
|
516
|
-
|
|
535
|
+
if (!report || report.measured !== true) {
|
|
536
|
+
// #1145: no measured report is not a clean pass
|
|
537
|
+
return err(new Error(result.value.message ?? `Accessibility NOT MEASURED for ${options.url}`));
|
|
517
538
|
}
|
|
518
539
|
return ok({
|
|
519
540
|
violations: report.violations,
|
|
@@ -562,6 +583,10 @@ export class VisualAccessibilityCoordinator extends BaseDomainCoordinator {
|
|
|
562
583
|
if (!auditResult.success) {
|
|
563
584
|
return err(auditResult.error);
|
|
564
585
|
}
|
|
586
|
+
if (auditResult.value.measured !== true) {
|
|
587
|
+
return err(new Error(`Color contrast NOT MEASURED for ${options.url}: ` +
|
|
588
|
+
`${auditResult.value.notMeasuredReason ?? 'not audited'}. No findings were produced.`));
|
|
589
|
+
}
|
|
565
590
|
// Filter for color contrast violations
|
|
566
591
|
const contrastViolations = auditResult.value.violations.filter((v) => v.id.includes('color-contrast') || v.id.includes('contrast'));
|
|
567
592
|
const issues = contrastViolations.flatMap((violation) => violation.nodes.map((node) => ({
|
|
@@ -319,8 +319,18 @@ export interface AccessibilityReport {
|
|
|
319
319
|
readonly violations: AccessibilityViolation[];
|
|
320
320
|
readonly passes: PassedRule[];
|
|
321
321
|
readonly incomplete: IncompleteCheck[];
|
|
322
|
+
/** 0-100 when measured; -1 when `measured` is false (#1145), never a grade. */
|
|
322
323
|
readonly score: number;
|
|
323
324
|
readonly wcagLevel: 'A' | 'AA' | 'AAA';
|
|
325
|
+
/**
|
|
326
|
+
* True only when a browser loaded the page and ran the checks (#1145).
|
|
327
|
+
* `false` = nothing was measured: violations and passes are empty (or
|
|
328
|
+
* synthetic, in simulation mode), `score` is -1, and the report must not
|
|
329
|
+
* count as a finding, a pass or a fail.
|
|
330
|
+
*/
|
|
331
|
+
readonly measured?: boolean;
|
|
332
|
+
/** Why the page was not measured, when `measured` is false (#1145). */
|
|
333
|
+
readonly notMeasuredReason?: string;
|
|
324
334
|
}
|
|
325
335
|
export interface PassedRule {
|
|
326
336
|
readonly id: string;
|
|
@@ -339,6 +349,10 @@ export interface WCAGValidationResult {
|
|
|
339
349
|
readonly failedCriteria: WCAGCriterion[];
|
|
340
350
|
readonly passedCriteria: WCAGCriterion[];
|
|
341
351
|
readonly score: number;
|
|
352
|
+
/** Always true: an unmeasured page yields an error, never a verdict (#1145). */
|
|
353
|
+
readonly measured?: boolean;
|
|
354
|
+
/** What the verdict does not cover (#1145). */
|
|
355
|
+
readonly limitations?: string[];
|
|
342
356
|
}
|
|
343
357
|
export interface KeyboardNavigationReport {
|
|
344
358
|
readonly url: string;
|
|
@@ -495,9 +509,22 @@ export interface AccessibilityAuditReport {
|
|
|
495
509
|
readonly passingUrls: number;
|
|
496
510
|
readonly totalViolations: number;
|
|
497
511
|
readonly criticalViolations: number;
|
|
512
|
+
/** Mean over measured URLs only; -1 when no URL was measured (#1145). */
|
|
498
513
|
readonly averageScore: number;
|
|
499
514
|
readonly reports: AccessibilityReport[];
|
|
500
515
|
readonly topIssues: TopAccessibilityIssue[];
|
|
516
|
+
/**
|
|
517
|
+
* #1145: `measured` when every URL was audited in a browser, `partial` when
|
|
518
|
+
* some were, `not-measured` when none were. Counts, scores and top issues
|
|
519
|
+
* cover measured URLs only; unmeasured URLs are listed in `notMeasured`.
|
|
520
|
+
*/
|
|
521
|
+
readonly status?: 'measured' | 'partial' | 'not-measured';
|
|
522
|
+
readonly measuredUrls?: number;
|
|
523
|
+
readonly notMeasured?: Array<{
|
|
524
|
+
readonly url: string;
|
|
525
|
+
readonly reason: string;
|
|
526
|
+
}>;
|
|
527
|
+
readonly message?: string;
|
|
501
528
|
}
|
|
502
529
|
export interface TopAccessibilityIssue {
|
|
503
530
|
readonly ruleId: string;
|
|
@@ -480,6 +480,11 @@ export class VisualAccessibilityPlugin extends BaseDomainPlugin {
|
|
|
480
480
|
occurrences: issue.occurrences,
|
|
481
481
|
impact: issue.impact,
|
|
482
482
|
})),
|
|
483
|
+
// #1145: unmeasured URLs are neither passing nor failing
|
|
484
|
+
status: result.value.status,
|
|
485
|
+
measuredUrls: result.value.measuredUrls,
|
|
486
|
+
notMeasured: result.value.notMeasured,
|
|
487
|
+
message: result.value.message,
|
|
483
488
|
});
|
|
484
489
|
}
|
|
485
490
|
return err(result.error);
|