agentic-qe 3.15.12 → 3.15.14
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/helpers/brain-checkpoint.cjs +124 -5
- package/.claude/skills/skills-manifest.json +1 -1
- package/CHANGELOG.md +196 -0
- package/assets/skills/skills-manifest.json +1 -1
- package/dist/cli/bundle.js +6 -6
- package/dist/cli/chunks/adapter-23KA2YW7.js +2 -0
- package/dist/cli/chunks/{agent-booster-wasm-5VZCKTIJ.js → agent-booster-wasm-2DLAEZK6.js} +2 -2
- package/dist/cli/chunks/{agent-handler-K3C6CQCD.js → agent-handler-P3IY7XEE.js} +2 -2
- package/dist/cli/chunks/{agent-memory-branch-NVFQ25WS.js → agent-memory-branch-WWKC2H3G.js} +2 -2
- package/dist/cli/chunks/aqe-learning-engine-MUICAXW5.js +2 -0
- package/dist/cli/chunks/{arena-TSZVDSXS.js → arena-4BMFF6BS.js} +4 -4
- package/dist/cli/chunks/{arena-QGWIJADQ.js → arena-EIV5OALF.js} +2 -2
- package/dist/cli/chunks/{audit-KIEE2SHJ.js → audit-DNTI453H.js} +3 -3
- package/dist/cli/chunks/base-XPWGYDKD.js +2 -0
- package/dist/cli/chunks/{better-sqlite3-BNB32NW3.js → better-sqlite3-TQBQGNC6.js} +2 -2
- package/dist/cli/chunks/brain-handler-HY57CNAO.js +95 -0
- package/dist/cli/chunks/{branch-enumerator-LZ7UXKAY.js → branch-enumerator-THPMZPHQ.js} +2 -2
- package/dist/cli/chunks/{browser-VDHAW4RK.js → browser-O6JJOZCK.js} +2 -2
- package/dist/cli/chunks/browser-workflow-UMQVBVGK.js +2 -0
- package/dist/cli/chunks/{chunk-4PU5GTZW.js → chunk-2HPNGK7A.js} +2 -2
- package/dist/cli/chunks/{chunk-MCPXNUDK.js → chunk-2IJO3657.js} +2 -2
- package/dist/cli/chunks/{chunk-4Y6OEBJZ.js → chunk-2QLE6NDW.js} +1 -1
- package/dist/cli/chunks/{chunk-DZGPUGUG.js → chunk-2UZBLC5H.js} +2 -2
- package/dist/cli/chunks/{chunk-5A66EGEW.js → chunk-2W5MQDHM.js} +2 -2
- package/dist/cli/chunks/{chunk-JRYWLOBD.js → chunk-3FITMWWJ.js} +2 -2
- package/dist/cli/chunks/{chunk-RCOLPF3B.js → chunk-3TF27MG5.js} +2 -2
- package/dist/cli/chunks/{chunk-KGA7VAI4.js → chunk-3XACRXBY.js} +2 -2
- package/dist/cli/chunks/{chunk-SQVZ3TRU.js → chunk-43XHGWYH.js} +2 -2
- package/dist/cli/chunks/{chunk-JR6CUKAI.js → chunk-4RPBODN5.js} +2 -2
- package/dist/cli/chunks/{chunk-C3YOVASQ.js → chunk-4T7XV5KQ.js} +1 -1
- package/dist/cli/chunks/{chunk-N7O3PF6Y.js → chunk-4WLIOPHX.js} +2 -2
- package/dist/cli/chunks/{chunk-PGSJBXTD.js → chunk-52KOPIMI.js} +2 -2
- package/dist/cli/chunks/{chunk-4KUOYDY2.js → chunk-56NSE3LJ.js} +2 -2
- package/dist/cli/chunks/{chunk-3IU4LDZR.js → chunk-57DRT6UA.js} +2 -2
- package/dist/cli/chunks/{chunk-2JYUA27M.js → chunk-57FX3GP6.js} +1 -1
- package/dist/cli/chunks/{chunk-7QEUHNKO.js → chunk-5PLBQZ5J.js} +1 -1
- package/dist/cli/chunks/{chunk-VF7FTD64.js → chunk-5Y7UFHJD.js} +1 -1
- package/dist/cli/chunks/{chunk-7JFDLL2F.js → chunk-5Z4MO2F3.js} +1 -1
- package/dist/cli/chunks/chunk-65EE2EST.js +8 -0
- package/dist/cli/chunks/{chunk-66PXR3NI.js → chunk-6NIGSY5L.js} +2 -2
- package/dist/cli/chunks/chunk-6O63ZTVX.js +3 -0
- package/dist/cli/chunks/{chunk-ZYOYR3UR.js → chunk-6OI5SK7M.js} +1 -1
- package/dist/cli/chunks/{chunk-5TAEW5OV.js → chunk-6P4Q4RTC.js} +1 -1
- package/dist/cli/chunks/{chunk-W5HQIYQU.js → chunk-7724KXM2.js} +3 -3
- package/dist/cli/chunks/{chunk-A2JCRXTK.js → chunk-7MISCSL5.js} +2 -2
- package/dist/cli/chunks/{chunk-OHVYINGM.js → chunk-7MUO4DEH.js} +3 -3
- package/dist/cli/chunks/{chunk-QCPVUNN3.js → chunk-7QUSNBAA.js} +2 -2
- package/dist/cli/chunks/{chunk-YUA6ZKKY.js → chunk-7SQTLUEN.js} +2 -2
- package/dist/cli/chunks/{chunk-CA5UNWQF.js → chunk-7T6L3LFN.js} +2 -2
- package/dist/cli/chunks/{chunk-UREDS662.js → chunk-7TH4PJSU.js} +2 -2
- package/dist/cli/chunks/{chunk-TVA5GRIU.js → chunk-7Y3LXH57.js} +2 -2
- package/dist/cli/chunks/{chunk-A5Y7DAVQ.js → chunk-A2T56XVL.js} +2 -2
- package/dist/cli/chunks/{chunk-ZROAMFX2.js → chunk-AJVLVF7V.js} +2 -2
- package/dist/cli/chunks/{chunk-26672ISV.js → chunk-ARRBXCII.js} +2 -2
- package/dist/cli/chunks/{chunk-5S4UIDFK.js → chunk-AYLEH2UF.js} +1 -1
- package/dist/cli/chunks/{chunk-DRCBRUGN.js → chunk-BBYJBZHG.js} +2 -2
- package/dist/cli/chunks/{chunk-BMG2JLSQ.js → chunk-BM3EJLMV.js} +2 -2
- package/dist/cli/chunks/{chunk-6QRI3JVE.js → chunk-BNG4J3CE.js} +2 -2
- package/dist/cli/chunks/{chunk-EN7GRVEQ.js → chunk-BPDAQB3F.js} +2 -2
- package/dist/cli/chunks/{chunk-J7Y7ZBIT.js → chunk-BQJ7CV53.js} +9 -9
- package/dist/cli/chunks/{chunk-ADUAJIAU.js → chunk-C3OIBFAA.js} +2 -2
- package/dist/cli/chunks/{chunk-4LWMAAWK.js → chunk-CAZM63TP.js} +2 -2
- package/dist/cli/chunks/{chunk-UZED4YZ5.js → chunk-CIINJHOX.js} +1 -1
- package/dist/cli/chunks/{chunk-C74M4WUI.js → chunk-CPPYZYXC.js} +2 -2
- package/dist/cli/chunks/chunk-D3ZZ2NLL.js +62 -0
- package/dist/cli/chunks/{chunk-U7ZHDGXG.js → chunk-D5GB5PUU.js} +1 -1
- package/dist/cli/chunks/{chunk-HZBXJFGN.js → chunk-DLTB5KCR.js} +2 -2
- package/dist/cli/chunks/{chunk-NNBQZR73.js → chunk-DRLSJJIC.js} +2 -2
- package/dist/cli/chunks/{chunk-HLGFHHWV.js → chunk-DSQESXL4.js} +2 -2
- package/dist/cli/chunks/{chunk-LFBA735S.js → chunk-E2JLAW3U.js} +3 -3
- package/dist/cli/chunks/{chunk-PT2NXS43.js → chunk-E3QIQMMN.js} +1 -1
- package/dist/cli/chunks/{chunk-35MIUSXQ.js → chunk-E7OR6V3V.js} +2 -2
- package/dist/cli/chunks/{chunk-G24SWTAX.js → chunk-E7QTWGPI.js} +413 -413
- package/dist/cli/chunks/{chunk-PX5OPXY6.js → chunk-EC65UZ77.js} +1 -1
- package/dist/cli/chunks/{chunk-JNXK47OL.js → chunk-EIEEST4T.js} +2 -2
- package/dist/cli/chunks/{chunk-2PPSS4JD.js → chunk-FHPNWHY7.js} +2 -2
- package/dist/cli/chunks/{chunk-PTBOLBM4.js → chunk-FJOIBZUB.js} +2 -2
- package/dist/cli/chunks/{chunk-TXEUVUMO.js → chunk-FTYRPEJS.js} +1 -1
- package/dist/cli/chunks/{chunk-ZPVGX4DI.js → chunk-G7HGUQAE.js} +2 -2
- package/dist/cli/chunks/{chunk-EF6OERRR.js → chunk-GY4P7KAI.js} +1 -1
- package/dist/cli/chunks/{chunk-UUZZXHUF.js → chunk-H3C5FJRH.js} +2 -2
- package/dist/cli/chunks/{chunk-L3PV7VXK.js → chunk-H4LYXLAT.js} +1 -1
- package/dist/cli/chunks/{chunk-5Z23ZMXZ.js → chunk-HAYKLXCT.js} +63 -61
- package/dist/cli/chunks/{chunk-IPA7K556.js → chunk-HEDGFKC5.js} +2 -2
- package/dist/cli/chunks/{chunk-BC4T6SCV.js → chunk-HHBF2BZC.js} +4 -4
- package/dist/cli/chunks/{chunk-IVTQF55W.js → chunk-HSDWPQQY.js} +3 -3
- package/dist/cli/chunks/{chunk-SG2TX72G.js → chunk-HTVGHHX2.js} +2 -2
- package/dist/cli/chunks/{chunk-FZJCBSN4.js → chunk-HV43NX4A.js} +2 -2
- package/dist/cli/chunks/{chunk-MMEALJ4D.js → chunk-IDBA5GK2.js} +2 -2
- package/dist/cli/chunks/{chunk-IA55PFLG.js → chunk-INGXD5IX.js} +2 -2
- package/dist/cli/chunks/{chunk-RYHG3I7J.js → chunk-IQRPR4KB.js} +2 -2
- package/dist/cli/chunks/{chunk-7OEFBWAG.js → chunk-IRPNEXOU.js} +2 -2
- package/dist/cli/chunks/{chunk-P7UFJ6DO.js → chunk-J35JWDJE.js} +1 -1
- package/dist/cli/chunks/chunk-J6ASX536.js +2 -0
- package/dist/cli/chunks/{chunk-2ASQRBK2.js → chunk-JAOCHPYX.js} +2 -2
- package/dist/cli/chunks/{chunk-G3AABG4Q.js → chunk-JB7R77SH.js} +2 -2
- package/dist/cli/chunks/{chunk-HSA5IGGW.js → chunk-JI67T6Q2.js} +2 -2
- package/dist/cli/chunks/{chunk-ZGROHCOW.js → chunk-JJHLGGPP.js} +1 -1
- package/dist/cli/chunks/{chunk-L7NGKANW.js → chunk-JK6PMLQQ.js} +2 -2
- package/dist/cli/chunks/{chunk-IL7GQNNE.js → chunk-JO26SG47.js} +2 -2
- package/dist/cli/chunks/{chunk-3EWQN37E.js → chunk-JSSU4RIK.js} +2 -2
- package/dist/cli/chunks/{chunk-TOWOJGEI.js → chunk-K2SMP4OD.js} +1 -1
- package/dist/cli/chunks/{chunk-YVJEUX3I.js → chunk-K7GFYFBO.js} +2 -2
- package/dist/cli/chunks/{chunk-DAUEK66C.js → chunk-K7RT6ITZ.js} +1 -1
- package/dist/cli/chunks/{chunk-33I2ZP6E.js → chunk-KJ5A54ZH.js} +2 -2
- package/dist/cli/chunks/{chunk-W4II6SIH.js → chunk-L5VSLPMW.js} +2 -2
- package/dist/cli/chunks/{chunk-NVRYELCY.js → chunk-L752CNG3.js} +3 -3
- package/dist/cli/chunks/{chunk-MAJXZYGK.js → chunk-L7PC675Y.js} +1 -1
- package/dist/cli/chunks/{chunk-YWWMNTBF.js → chunk-LTGQJYYO.js} +2 -2
- package/dist/cli/chunks/{chunk-7DNR4KKR.js → chunk-M2TG7VDK.js} +1 -1
- package/dist/cli/chunks/{chunk-2E2QO44T.js → chunk-M5JEA6ZY.js} +2 -2
- package/dist/cli/chunks/{chunk-IETBWYHW.js → chunk-MB4UKUBV.js} +2 -2
- package/dist/cli/chunks/{chunk-W7H55PY4.js → chunk-MKYOE7NE.js} +1 -1
- package/dist/cli/chunks/{chunk-FNUFTWEO.js → chunk-MQXWG55U.js} +3 -3
- package/dist/cli/chunks/{chunk-O4QJMANM.js → chunk-MR2OPUSA.js} +1 -1
- package/dist/cli/chunks/{chunk-KA5SHLMW.js → chunk-N736GLWZ.js} +2 -2
- package/dist/cli/chunks/{chunk-NV74SICL.js → chunk-NHEG2DLN.js} +2 -2
- package/dist/cli/chunks/chunk-NKOLILT7.js +86 -0
- package/dist/cli/chunks/{chunk-KJDI5CHX.js → chunk-NPCXGX7N.js} +2 -2
- package/dist/cli/chunks/{chunk-2IVE5AR3.js → chunk-NZQYJCO6.js} +1 -1
- package/dist/cli/chunks/{chunk-4SA7M34P.js → chunk-O2AAYJUV.js} +1 -1
- package/dist/cli/chunks/{chunk-ULCW6IVQ.js → chunk-O32BFQV4.js} +2 -2
- package/dist/cli/chunks/{chunk-JOWUS2X5.js → chunk-O3ERGUXH.js} +1 -1
- package/dist/cli/chunks/{chunk-BYRCB5JT.js → chunk-O5CEL447.js} +2 -2
- package/dist/cli/chunks/{chunk-CPIBIR3X.js → chunk-O756AOUX.js} +2 -2
- package/dist/cli/chunks/{chunk-TSOQ2QLT.js → chunk-OCN53CCK.js} +2 -2
- package/dist/cli/chunks/{chunk-YLKIXEPP.js → chunk-OGEIHS76.js} +1 -1
- package/dist/cli/chunks/{chunk-ICKUINKD.js → chunk-OLUOVNUF.js} +2 -2
- package/dist/cli/chunks/{chunk-5ADXFUMO.js → chunk-P2TPH3TC.js} +2 -2
- package/dist/cli/chunks/{chunk-SBHM5X2S.js → chunk-PCQZIAXB.js} +2 -2
- package/dist/cli/chunks/{chunk-CDA5Z74H.js → chunk-PGN4TARY.js} +2 -2
- package/dist/cli/chunks/{chunk-P5E26N2X.js → chunk-PNRPVQGI.js} +2 -2
- package/dist/cli/chunks/{chunk-23PQF7NN.js → chunk-PWQWKYBG.js} +1 -1
- package/dist/cli/chunks/{chunk-T4EN5VVK.js → chunk-QNQE3EOH.js} +2 -2
- package/dist/cli/chunks/chunk-QP2HLKTS.js +2 -0
- package/dist/cli/chunks/{chunk-7TA5MUPW.js → chunk-QP6GL3O5.js} +1 -1
- package/dist/cli/chunks/{chunk-GKFV6CUD.js → chunk-QUZ745UQ.js} +2 -2
- package/dist/cli/chunks/{chunk-INZARYUD.js → chunk-R5RRWLRI.js} +2 -2
- package/dist/cli/chunks/{chunk-VZBC6DP7.js → chunk-RE6JTSDM.js} +1 -1
- package/dist/cli/chunks/{chunk-JGIJPDGD.js → chunk-TOJF3ZG4.js} +2 -2
- package/dist/cli/chunks/{chunk-WLRU6ESI.js → chunk-TSP6SU5V.js} +2 -2
- package/dist/cli/chunks/{chunk-6E6HB4N4.js → chunk-TW6Z6W4X.js} +4 -4
- package/dist/cli/chunks/{chunk-ENGL7FIJ.js → chunk-TWOV3I3A.js} +1 -1
- package/dist/cli/chunks/chunk-U4TML2VD.js +3 -0
- package/dist/cli/chunks/{chunk-O3IM4WRZ.js → chunk-U6IOQKCT.js} +2 -2
- package/dist/cli/chunks/{chunk-SPC4RBLF.js → chunk-UDSB3XCG.js} +2 -2
- package/dist/cli/chunks/{chunk-URSTP3WI.js → chunk-UFP7SN5V.js} +2 -2
- package/dist/cli/chunks/{chunk-MYF5CNGV.js → chunk-UMHFTQTR.js} +2 -2
- package/dist/cli/chunks/{chunk-65TH6RPD.js → chunk-UNYTHZDZ.js} +1 -1
- package/dist/cli/chunks/{chunk-FAGKBOX2.js → chunk-UPWLMIDY.js} +2 -2
- package/dist/cli/chunks/{chunk-4CB3QPZM.js → chunk-USAKCGHC.js} +2 -2
- package/dist/cli/chunks/{chunk-QUJJYTJH.js → chunk-V3MGY76S.js} +2 -2
- package/dist/cli/chunks/{chunk-WDEXOLK2.js → chunk-V6SE2ZU2.js} +1 -1
- package/dist/cli/chunks/{chunk-JW5PDJ5O.js → chunk-VCVRZD4Y.js} +3 -3
- package/dist/cli/chunks/{chunk-TGMXUZZC.js → chunk-VG32EEUG.js} +2 -2
- package/dist/cli/chunks/{chunk-MYUMJ2ZI.js → chunk-VGZOPQQY.js} +1 -1
- package/dist/cli/chunks/{chunk-BOSMELJX.js → chunk-VJBJRFUO.js} +2 -2
- package/dist/cli/chunks/{chunk-K3A3NWT3.js → chunk-WBC6WB32.js} +2 -2
- package/dist/cli/chunks/{chunk-QWG3SILX.js → chunk-WCM6WE7G.js} +5 -5
- package/dist/cli/chunks/{chunk-GJKZ7UQO.js → chunk-WCPSR4MJ.js} +2 -2
- package/dist/cli/chunks/{chunk-U6IXYQO4.js → chunk-WKI46WWN.js} +2 -2
- package/dist/cli/chunks/{chunk-NX4BCSOZ.js → chunk-WM2QRIRD.js} +2 -2
- package/dist/cli/chunks/{chunk-32UTHIY5.js → chunk-WRC3HLUY.js} +3 -3
- package/dist/cli/chunks/{chunk-AJEXPFAB.js → chunk-WUGXXNK4.js} +1 -1
- package/dist/cli/chunks/{chunk-NA3F6FEO.js → chunk-WZQADC5R.js} +2 -2
- package/dist/cli/chunks/{chunk-SDRJJUPO.js → chunk-X6NJOT3V.js} +1 -1
- package/dist/cli/chunks/{chunk-CU36D7TN.js → chunk-X6Q2N5S5.js} +2 -2
- package/dist/cli/chunks/{chunk-UIKQPO4Y.js → chunk-X7CUI7KH.js} +2 -2
- package/dist/cli/chunks/{chunk-MCPEC6OO.js → chunk-XMCSKYDE.js} +1 -1
- package/dist/cli/chunks/{chunk-WTAUF6O4.js → chunk-XN3KCKAM.js} +2 -2
- package/dist/cli/chunks/{chunk-TLRHAMX5.js → chunk-XSPMLJCQ.js} +1 -1
- package/dist/cli/chunks/{chunk-VUR5THML.js → chunk-XTZGAG6P.js} +2 -2
- package/dist/cli/chunks/{chunk-47RMGDG4.js → chunk-YE54T2NQ.js} +2 -2
- package/dist/cli/chunks/{chunk-HM3LSFTY.js → chunk-YEFTK4HD.js} +2 -2
- package/dist/cli/chunks/{chunk-4HWUECVD.js → chunk-YGC5QKQ4.js} +2 -2
- package/dist/cli/chunks/{chunk-SUX5XB2Z.js → chunk-YGOSSVY5.js} +2 -2
- package/dist/cli/chunks/{chunk-UJNGGFGX.js → chunk-YKQWIXUY.js} +2 -2
- package/dist/cli/chunks/{chunk-SITL5YZV.js → chunk-Z2S7DNFP.js} +2 -2
- package/dist/cli/chunks/{chunk-WGTEZT7G.js → chunk-Z54G2YOL.js} +2 -2
- package/dist/cli/chunks/{chunk-YNVEDFPQ.js → chunk-ZJGFQK27.js} +1 -1
- package/dist/cli/chunks/{chunk-35NW676P.js → chunk-ZUE524JL.js} +2 -2
- package/dist/cli/chunks/{ci-BZNWW3I3.js → ci-UMA2SMNW.js} +2 -2
- package/dist/cli/chunks/{ci-config-LOHNXOKV.js → ci-config-UQSILJFQ.js} +2 -2
- package/dist/cli/chunks/{ci-output-LCOQBSJL.js → ci-output-U6YZLLKH.js} +2 -2
- package/dist/cli/chunks/{circuit-breaker-7LRXTLFE.js → circuit-breaker-ATYQP6X2.js} +2 -2
- package/dist/cli/chunks/{claude-flow-setup-HBU4VWC3.js → claude-flow-setup-6YHFD7AN.js} +2 -2
- package/dist/cli/chunks/client-E43GWLQH.js +2 -0
- package/dist/cli/chunks/{cline-installer-CO6MLH6X.js → cline-installer-EPE7IOZE.js} +2 -2
- package/dist/cli/chunks/{code-SIXBS6JM.js → code-NUEJ4XYO.js} +19 -18
- package/dist/cli/chunks/{code-index-extractor-GWJKZ2IQ.js → code-index-extractor-D4DBT6OL.js} +2 -2
- package/dist/cli/chunks/{codex-installer-6NINVWXJ.js → codex-installer-633SM4LR.js} +2 -2
- package/dist/cli/chunks/{completions-7VIX3GML.js → completions-WUKVIW3L.js} +2 -2
- package/dist/cli/chunks/{complexity-analyzer-FBQR6ZP2.js → complexity-analyzer-F73ACR5H.js} +2 -2
- package/dist/cli/chunks/{continuedev-installer-VA7RIXW5.js → continuedev-installer-QH42TKMS.js} +2 -2
- package/dist/cli/chunks/{copilot-installer-4QEBC4MU.js → copilot-installer-Y3XC7BTT.js} +2 -2
- package/dist/cli/chunks/core-handlers-R5A3SQDY.js +2 -0
- package/dist/cli/chunks/{cost-tracker-GRYKHPWL.js → cost-tracker-57QPV7E3.js} +2 -2
- package/dist/cli/chunks/coverage-IBCHMBCR.js +51 -0
- package/dist/cli/chunks/cross-domain-router-LLYVPZF6.js +2 -0
- package/dist/cli/chunks/{cursor-installer-ZXIPSZVH.js → cursor-installer-F4UYQHIN.js} +2 -2
- package/dist/cli/chunks/{daemon-N2VRHPSJ.js → daemon-BYYPIJ7G.js} +4 -4
- package/dist/cli/chunks/{daemon-D7F3RGI5.js → daemon-XR4Q6YZF.js} +3 -3
- package/dist/cli/chunks/{dag-attention-scheduler-NL6BA7BY.js → dag-attention-scheduler-ZR5ZD3TW.js} +2 -2
- package/dist/cli/chunks/{detect-XC2HCIIT.js → detect-GEGYURLL.js} +2 -2
- package/dist/cli/chunks/{dist-node-A3Y26MEI.js → dist-node-JU3KT2JO.js} +2 -2
- package/dist/cli/chunks/{domain-handler-WV6SFXRB.js → domain-handler-7QI3FJGE.js} +2 -2
- package/dist/cli/chunks/{domain-plugins-KJIF6Z2B.js → domain-plugins-O2YRM2PD.js} +2 -2
- package/dist/cli/chunks/domain-transfer-7J3S2OS6.js +2 -0
- package/dist/cli/chunks/dream-6C4NURSE.js +2 -0
- package/dist/cli/chunks/{embed-and-insert-pattern-PA3Y4KGO.js → embed-and-insert-pattern-URES5Q6J.js} +2 -2
- package/dist/cli/chunks/{eval-YGEZNUVE.js → eval-RVMCIUOR.js} +2 -2
- package/dist/cli/chunks/{experience-capture-middleware-D4T7NW6B.js → experience-capture-middleware-SYJQSBKE.js} +3 -3
- package/dist/cli/chunks/{fast-paths-6JYK7RYQ.js → fast-paths-QUKPKWKZ.js} +2 -2
- package/dist/cli/chunks/{feature-flags-DKXMDVPE.js → feature-flags-5JCSKL2P.js} +2 -2
- package/dist/cli/chunks/{feature-flags-RBH2GDSR.js → feature-flags-K7JXNKJI.js} +2 -2
- package/dist/cli/chunks/file-discovery-J5IE5KP7.js +2 -0
- package/dist/cli/chunks/fleet-II4Q6HXK.js +44 -0
- package/dist/cli/chunks/{gnn-wrapper-MV54UC4C.js → gnn-wrapper-M7VO2EMS.js} +2 -2
- package/dist/cli/chunks/{heartbeat-handler-7DKMVQQH.js → heartbeat-handler-ND5CY26N.js} +4 -4
- package/dist/cli/chunks/heartbeat-scheduler-FC5PBTMN.js +2 -0
- package/dist/cli/chunks/hnsw-adapter-47UIVOBG.js +2 -0
- package/dist/cli/chunks/hnsw-index-3AKVLOZQ.js +2 -0
- package/dist/cli/chunks/{hnsw-legacy-bridge-6IWREDQC.js → hnsw-legacy-bridge-N3AUUUU7.js} +2 -2
- package/dist/cli/chunks/{hnswlib-node-5BIESSCK.js → hnswlib-node-NZY3E5EN.js} +2 -2
- package/dist/cli/chunks/{hooks-3EETRM62.js → hooks-QVJDTII5.js} +10 -10
- package/dist/cli/chunks/hybrid-backend-YAOSNX47.js +2 -0
- package/dist/cli/chunks/{hypergraph-engine-RSWCB2D3.js → hypergraph-engine-ZRY6MTDV.js} +2 -2
- package/dist/cli/chunks/{hypergraph-handler-552LXKL3.js → hypergraph-handler-56DO4XZQ.js} +3 -3
- package/dist/cli/chunks/impact-analyzer-4FMJXM4M.js +2 -0
- package/dist/cli/chunks/{init-guard-OTDBJ5HD.js → init-guard-DTF4EVUY.js} +2 -2
- package/dist/cli/chunks/{init-handler-3FK3TKEA.js → init-handler-M6CNQHMX.js} +6 -6
- package/dist/cli/chunks/init-wizard-RTLCRWDT.js +2 -0
- package/dist/cli/chunks/kernel-2OWIGGGT.js +2 -0
- package/dist/cli/chunks/{kilocode-installer-KZ2O4LF3.js → kilocode-installer-IJN7XKBH.js} +2 -2
- package/dist/cli/chunks/{kiro-installer-MLCCXRF7.js → kiro-installer-UKKPGPDC.js} +2 -2
- package/dist/cli/chunks/knowledge-graph-25XXKDJN.js +2 -0
- package/dist/cli/chunks/learning-W2HETWQ4.js +131 -0
- package/dist/cli/chunks/{llm-router-PDEV3UP2.js → llm-router-Y546K4VX.js} +4 -4
- package/dist/cli/chunks/llm-router-service-G3EIN4UB.js +2 -0
- package/dist/cli/chunks/{load-XFVVLO7E.js → load-MKAB2AXE.js} +2 -2
- package/dist/cli/chunks/load-test-D6QYNIVT.js +2 -0
- package/dist/cli/chunks/{mcp-74G3CL2S.js → mcp-AZKUS6K3.js} +2 -2
- package/dist/cli/chunks/{memory-XIFM6JNX.js → memory-ZDOQN2KU.js} +5 -5
- package/dist/cli/chunks/memory-backend-LDFFZMEQ.js +2 -0
- package/dist/cli/chunks/{memory-handlers-ZCKURV6S.js → memory-handlers-3SQVY7FE.js} +2 -2
- package/dist/cli/chunks/{multi-model-executor-7L4W3O2Q.js → multi-model-executor-WWVXDHG4.js} +2 -2
- package/dist/cli/chunks/{opencode-installer-BPG422LF.js → opencode-installer-YUJNXXWS.js} +2 -2
- package/dist/cli/chunks/{orchestrator-OEAFLAEV.js → orchestrator-Z6PWPLRE.js} +109 -25
- package/dist/cli/chunks/pattern-null-store-KDVRM7PW.js +2 -0
- package/dist/cli/chunks/{pattern-usage-recorder-LOPNCULT.js → pattern-usage-recorder-TPWPX32U.js} +2 -2
- package/dist/cli/chunks/{pipeline-VWTYUZB7.js → pipeline-4BBGTE4M.js} +2 -2
- package/dist/cli/chunks/{platform-WFJJ3X2E.js → platform-5GSHXCV5.js} +2 -2
- package/dist/cli/chunks/{plugin-744TPUSG.js → plugin-OFDVF5HS.js} +2 -2
- package/dist/cli/chunks/{prime-radiant-advanced-wasm-BD5BLNDR.js → prime-radiant-advanced-wasm-NC6MUYGJ.js} +2 -2
- package/dist/cli/chunks/project-root-DDGBWDP6.js +2 -0
- package/dist/cli/chunks/protocol-executor-KBOLLCWA.js +2 -0
- package/dist/cli/chunks/{protocol-handler-JIBILI74.js → protocol-handler-MPOAAEPA.js} +2 -2
- package/dist/cli/chunks/{prove-MNOL5FYW.js → prove-CDKMAIVM.js} +2 -2
- package/dist/cli/chunks/qe-reasoning-bank-GRXBT7FC.js +2 -0
- package/dist/cli/chunks/{quality-JEGBDGGX.js → quality-ZH4F7R7R.js} +2 -2
- package/dist/cli/chunks/{quality-gate-SYJ6ROMI.js → quality-gate-IDRMW6OE.js} +3 -3
- package/dist/cli/chunks/queen-coordinator-L2QWMJ5Q.js +2 -0
- package/dist/cli/chunks/{real-embeddings-ZWXS5ZFV.js → real-embeddings-I2UVNNB3.js} +2 -2
- package/dist/cli/chunks/{ref-validation-RRHUFW2N.js → ref-validation-Z5GCGVXK.js} +2 -2
- package/dist/cli/chunks/{roocode-installer-XFO6JSVN.js → roocode-installer-IZ2S7PH2.js} +2 -2
- package/dist/cli/chunks/router-FT5WJPUH.js +2 -0
- package/dist/cli/chunks/routing-feedback-EO2MKOUX.js +2 -0
- package/dist/cli/chunks/{routing-handler-L2K3JASE.js → routing-handler-NAX35VUW.js} +2 -2
- package/dist/cli/chunks/{ruvector-commands-A6CINHGM.js → ruvector-commands-5YW2SOFF.js} +2 -2
- package/dist/cli/chunks/rvf-dual-writer-WHBFQJVU.js +2 -0
- package/dist/cli/chunks/rvf-migration-adapter-YT3APF2I.js +2 -0
- package/dist/cli/chunks/{rvf-migration-coordinator-T4RY7L53.js → rvf-migration-coordinator-VUIZHTVG.js} +2 -2
- package/dist/cli/chunks/rvf-native-adapter-37PUFKQD.js +2 -0
- package/dist/cli/chunks/{rvf-store-integrity-IR33TGQS.js → rvf-store-integrity-IPGCAT6C.js} +2 -2
- package/dist/cli/chunks/safe-db-TDZKUOZJ.js +2 -0
- package/dist/cli/chunks/schedule-CRKTRY2A.js +2 -0
- package/dist/cli/chunks/scheduler-6ZBDVQWN.js +2 -0
- package/dist/cli/chunks/{security-Z5GDE2IH.js → security-3IH4BO5Z.js} +3 -3
- package/dist/cli/chunks/{shared-rvf-adapter-SIZMEHPM.js → shared-rvf-adapter-ABY7PAY2.js} +2 -2
- package/dist/cli/chunks/{shared-rvf-dual-writer-HLM65RDS.js → shared-rvf-dual-writer-6KENLN2W.js} +2 -2
- package/dist/cli/chunks/sqlite-persistence-FFJQAIKW.js +2 -0
- package/dist/cli/chunks/{standalone-memory-SKSZG7P5.js → standalone-memory-RLFAUGOW.js} +2 -2
- package/dist/cli/chunks/{status-handler-766YOOMJ.js → status-handler-FCOZBPE5.js} +2 -2
- package/dist/cli/chunks/{structural-health-M45FNOLT.js → structural-health-4RDA5UUM.js} +2 -2
- package/dist/cli/chunks/{sync-B2U366I3.js → sync-54LUAUTK.js} +2 -2
- package/dist/cli/chunks/{sync-6CJ24B5T.js → sync-KGEEXXCC.js} +2 -2
- package/dist/cli/chunks/task-handler-K3OXHYKU.js +62 -0
- package/dist/cli/chunks/task-handlers-6H7L2UT4.js +9 -0
- package/dist/cli/chunks/{test-TODH7KRF.js → test-S7IG6EIX.js} +4 -4
- package/dist/cli/chunks/test-runner-process-OTQDAJLN.js +2 -0
- package/dist/cli/chunks/{test-scheduling-VMVMVRHT.js → test-scheduling-7XYXI4L2.js} +3 -3
- package/dist/cli/chunks/{token-bootstrap-XQW7BMCK.js → token-bootstrap-3QMABE45.js} +2 -2
- package/dist/cli/chunks/{token-usage-JCZEIRKO.js → token-usage-Y2YTPOFE.js} +2 -2
- package/dist/cli/chunks/{transformers-U2ML3OHE.js → transformers-UCJ3HHHC.js} +2 -2
- package/dist/cli/chunks/tree-sitter-wasm-parser-D6JTTHTP.js +2 -0
- package/dist/cli/chunks/{types-GGEPCHP6.js → types-6CMFPETH.js} +2 -2
- package/dist/cli/chunks/unified-memory-QARWQKJ2.js +2 -0
- package/dist/cli/chunks/unified-memory-hnsw-LHY3DXCP.js +2 -0
- package/dist/cli/chunks/unified-persistence-WEYYGLHM.js +2 -0
- package/dist/cli/chunks/{upgrade-T5GRM7HS.js → upgrade-K25DN6WU.js} +2 -2
- package/dist/cli/chunks/{validate-XMUJPLP3.js → validate-T4V3TBY3.js} +2 -2
- package/dist/cli/chunks/{validate-swarm-KJLF7JEH.js → validate-swarm-XSRC576T.js} +2 -2
- package/dist/cli/chunks/visual-security-O4ALMCXQ.js +2 -0
- package/dist/cli/chunks/{web-tree-sitter-LOHVZ7G5.js → web-tree-sitter-YOZXHRTN.js} +2 -2
- package/dist/cli/chunks/{windsurf-installer-33FBTXJU.js → windsurf-installer-ITPU2IYL.js} +2 -2
- package/dist/cli/chunks/witness-chain-B3YW5NMS.js +2 -0
- package/dist/cli/chunks/witness-chain-PIYR72HJ.js +2 -0
- package/dist/cli/chunks/{witness-chain-repair-VWBO4NXE.js → witness-chain-repair-YUG7E3UX.js} +2 -2
- package/dist/cli/chunks/{witness-chain-verifier-BHJ3ZAEK.js → witness-chain-verifier-DTDSVKOG.js} +2 -2
- package/dist/cli/chunks/{witness-key-manager-WNVPH2Z3.js → witness-key-manager-EWACWGAW.js} +2 -2
- package/dist/cli/chunks/{workflow-6QR5MQTO.js → workflow-ZIQ4FV42.js} +4 -4
- package/dist/cli/chunks/workflow-orchestrator-3ZN2BCGY.js +2 -0
- package/dist/cli/chunks/{wrappers-EHOL62TS.js → wrappers-PW2O27LL.js} +2 -2
- package/dist/cli/commands/code.js +6 -0
- package/dist/cli/commands/coverage.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/commands/learning-prune.d.ts +14 -0
- package/dist/cli/commands/learning-prune.js +105 -0
- package/dist/cli/commands/learning.js +9 -0
- package/dist/cli/handlers/brain-handler.js +12 -1
- package/dist/cli/handlers/task-handler.d.ts +5 -0
- package/dist/cli/handlers/task-handler.js +20 -0
- package/dist/cli/utils/coverage-verdict.js +14 -3
- 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/context/compaction/index.d.ts +7 -0
- package/dist/context/compaction/index.js +30 -6
- package/dist/coordination/handlers/code-intelligence-handlers.js +21 -1
- package/dist/coordination/handlers/coverage-evidence.d.ts +19 -0
- package/dist/coordination/handlers/coverage-evidence.js +31 -2
- package/dist/coordination/handlers/coverage-handlers.js +5 -1
- package/dist/coordination/handlers/coverage-target.js +8 -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 +11 -3
- package/dist/coordination/handlers/security-handlers.js +12 -2
- package/dist/coordination/protocols/security-audit.js +11 -1
- package/dist/coordination/result-saver-adapters.js +1 -0
- package/dist/coordination/result-saver.js +9 -5
- package/dist/coordination/task-executor.js +7 -2
- package/dist/domains/chaos-resilience/services/chaos-engineer.d.ts +1 -0
- package/dist/domains/chaos-resilience/services/chaos-engineer.js +23 -45
- 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 +26 -0
- package/dist/domains/coverage-analysis/collected-metrics.js +54 -0
- package/dist/domains/coverage-analysis/services/coverage-analyzer.js +13 -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/defect-intelligence/services/defect-predictor.js +3 -6
- 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/coverage-report-event.d.ts +8 -0
- package/dist/domains/quality-assessment/coverage-report-event.js +22 -1
- package/dist/domains/quality-assessment/interfaces.d.ts +8 -0
- package/dist/domains/quality-assessment/services/coherence-gate.js +15 -2
- package/dist/domains/quality-assessment/services/quality-analyzer.d.ts +4 -0
- package/dist/domains/quality-assessment/services/quality-analyzer.js +63 -17
- 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 +10 -0
- package/dist/domains/test-execution/services/test-executor.d.ts +6 -0
- package/dist/domains/test-execution/services/test-executor.js +22 -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/init/phases/07-hooks.js +90 -6
- package/dist/integrations/embeddings/index/HNSWIndex.js +8 -4
- package/dist/integrations/ruvector/brain-rvf-exporter.d.ts +25 -0
- package/dist/integrations/ruvector/brain-rvf-exporter.js +154 -61
- package/dist/integrations/ruvector/transfer-coherence-stub.js +5 -10
- package/dist/learning/dream/dream-engine.d.ts +24 -1
- package/dist/learning/dream/dream-engine.js +57 -6
- package/dist/learning/learning-retention.d.ts +103 -0
- package/dist/learning/learning-retention.js +213 -0
- package/dist/mcp/bundle.js +508 -503
- package/dist/mcp/handlers/domain-handler-configs.d.ts +17 -1
- package/dist/mcp/handlers/domain-handler-configs.js +33 -16
- 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 +13 -3
- package/dist/mcp/tools/chaos-resilience/inject.d.ts +3 -4
- package/dist/mcp/tools/chaos-resilience/inject.js +11 -81
- 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/learning-optimization/dream.d.ts +8 -0
- package/dist/mcp/tools/learning-optimization/dream.js +4 -0
- 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/brain-handler-MPC5SPYI.js +0 -94
- package/dist/cli/chunks/browser-workflow-QRKCFVR3.js +0 -2
- package/dist/cli/chunks/chunk-4A76VPU4.js +0 -3
- package/dist/cli/chunks/chunk-QSGEBCDB.js +0 -62
- package/dist/cli/chunks/chunk-UCSK2RMI.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/chunk-XZOYKB22.js +0 -79
- package/dist/cli/chunks/chunk-YIDAXOUX.js +0 -8
- package/dist/cli/chunks/client-4PNYDFYS.js +0 -2
- package/dist/cli/chunks/core-handlers-ODO6LUWQ.js +0 -2
- package/dist/cli/chunks/coverage-USPMNKOU.js +0 -50
- 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/learning-QUCMBD77.js +0 -122
- 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;
|
|
@@ -123,6 +128,11 @@ export interface IFileCoverageData {
|
|
|
123
128
|
/** `null` = no functions in the file (istanbul 0/0): not collected, not 100% (#1015). */
|
|
124
129
|
function: number | null;
|
|
125
130
|
statement: number | null;
|
|
131
|
+
/** #1219: the line counts behind `line`, when the report has them. */
|
|
132
|
+
lines?: {
|
|
133
|
+
covered: number;
|
|
134
|
+
total: number;
|
|
135
|
+
};
|
|
126
136
|
}
|
|
127
137
|
export interface IFailedTest {
|
|
128
138
|
testId: string;
|
|
@@ -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
|
*/
|
|
@@ -1105,6 +1114,7 @@ Provide:
|
|
|
1105
1114
|
branch: ratio(branches),
|
|
1106
1115
|
function: ratio(fns),
|
|
1107
1116
|
statement: ratio(statements),
|
|
1117
|
+
lines: { covered: lines[0], total: lines[1] },
|
|
1108
1118
|
});
|
|
1109
1119
|
for (const [key, [covered, count]] of [['line', lines], ['branch', branches], ['function', fns], ['statement', statements]]) {
|
|
1110
1120
|
totals[key][0] += covered;
|
|
@@ -1162,12 +1172,15 @@ Provide:
|
|
|
1162
1172
|
const line = summaryPct(entry?.lines);
|
|
1163
1173
|
if (line !== null) {
|
|
1164
1174
|
// #1015: a metric with total 0 is not collected (null), not its 100 pct.
|
|
1175
|
+
const counts = entry.lines;
|
|
1165
1176
|
perFile.push({
|
|
1166
1177
|
path: normalizedPath,
|
|
1167
1178
|
line,
|
|
1168
1179
|
branch: summaryPct(entry.branches),
|
|
1169
1180
|
function: summaryPct(entry.functions),
|
|
1170
1181
|
statement: summaryPct(entry.statements),
|
|
1182
|
+
...(typeof counts?.covered === 'number' && typeof counts.total === 'number'
|
|
1183
|
+
? { lines: { covered: counts.covered, total: counts.total } } : {}),
|
|
1171
1184
|
});
|
|
1172
1185
|
}
|
|
1173
1186
|
}
|
|
@@ -1246,16 +1259,21 @@ Provide:
|
|
|
1246
1259
|
}, { persist: true });
|
|
1247
1260
|
// Store per-file coverage via memory.set() (not storeVector) so that
|
|
1248
1261
|
// quality-analyzer's getStoredCoverage() can read it with memory.get()
|
|
1262
|
+
// #1027 N7: one key form — the absolute path. #1030: only files inside
|
|
1263
|
+
// the project, each listed once.
|
|
1264
|
+
const keys = projectFileCoverageKeys((result.fileCoverages ?? []).map(fc => fc.path));
|
|
1249
1265
|
for (const fc of result.fileCoverages ?? []) {
|
|
1250
|
-
|
|
1266
|
+
const key = keys.get(fc.path);
|
|
1267
|
+
if (!key || !Number.isFinite(fc.line))
|
|
1251
1268
|
continue;
|
|
1252
|
-
|
|
1253
|
-
await this.memory.set(`coverage:file:${fileCoverageKey(fc.path)}`, {
|
|
1269
|
+
await this.memory.set(`coverage:file:${key}`, {
|
|
1254
1270
|
line: fc.line,
|
|
1255
1271
|
branch: fc.branch ?? null,
|
|
1256
1272
|
function: fc.function ?? null,
|
|
1257
1273
|
statement: fc.statement ?? null,
|
|
1258
1274
|
measured: true,
|
|
1275
|
+
// #1219: the counts behind `line`, so several files can be line-weighted.
|
|
1276
|
+
...(fc.lines ? { lines: fc.lines } : {}),
|
|
1259
1277
|
runStatus,
|
|
1260
1278
|
}, { persist: true });
|
|
1261
1279
|
}
|
|
@@ -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) => ({
|