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
|
@@ -19,6 +19,7 @@ import { EventBus, MemoryBackend, AgentCoordinator } from '../../kernel/interfac
|
|
|
19
19
|
import type { HybridRouter } from '../../shared/llm/router/hybrid-router.js';
|
|
20
20
|
import { QualityAssessmentAPI, GateEvaluationRequest, GateResult, QualityAnalysisRequest, QualityReport, DeploymentRequest, DeploymentAdvice, ComplexityRequest, ComplexityReport, QualityMetrics } from './interfaces';
|
|
21
21
|
import { ClaimVerifierService } from '../../agents/claim-verifier/index.js';
|
|
22
|
+
import * as ReportHelpers from './coordinator-reports.js';
|
|
22
23
|
import type { QueenMinCutBridge } from '../../coordination/mincut/queen-integration';
|
|
23
24
|
import type { ConsensusStats } from '../../coordination/consensus';
|
|
24
25
|
import { BaseDomainCoordinator, type BaseDomainCoordinatorConfig } from '../base-domain-coordinator.js';
|
|
@@ -154,19 +155,13 @@ export declare class QualityAssessmentCoordinator extends BaseDomainCoordinator<
|
|
|
154
155
|
generateReport(options: {
|
|
155
156
|
format: 'json' | 'html' | 'markdown';
|
|
156
157
|
includeRecommendations?: boolean;
|
|
157
|
-
}):
|
|
158
|
-
content: string;
|
|
159
|
-
format: string;
|
|
160
|
-
}, Error>>;
|
|
158
|
+
}): ReturnType<typeof ReportHelpers.generateReport>;
|
|
161
159
|
/**
|
|
162
|
-
* Get quality dashboard overview
|
|
160
|
+
* Get quality dashboard overview. #1020: built from measured evidence only;
|
|
161
|
+
* unmeasured metrics are -1 and listed in `unmeasured`.
|
|
163
162
|
* @returns Result containing dashboard data
|
|
164
163
|
*/
|
|
165
|
-
getQualityDashboard():
|
|
166
|
-
overallScore: number;
|
|
167
|
-
metrics: QualityMetrics;
|
|
168
|
-
trends: Record<string, number>;
|
|
169
|
-
}, Error>>;
|
|
164
|
+
getQualityDashboard(): ReturnType<typeof ReportHelpers.getQualityDashboard>;
|
|
170
165
|
/**
|
|
171
166
|
* Analyze project risks
|
|
172
167
|
* @param options - Risk analysis options
|
|
@@ -175,17 +170,10 @@ export declare class QualityAssessmentCoordinator extends BaseDomainCoordinator<
|
|
|
175
170
|
analyzeRisks(options: {
|
|
176
171
|
scope: 'project' | 'module' | 'file';
|
|
177
172
|
includeSecurityRisks?: boolean;
|
|
178
|
-
}):
|
|
179
|
-
risks: Array<{
|
|
180
|
-
id: string;
|
|
181
|
-
severity: string;
|
|
182
|
-
description: string;
|
|
183
|
-
category: string;
|
|
184
|
-
}>;
|
|
185
|
-
overallRiskLevel: 'low' | 'medium' | 'high' | 'critical';
|
|
186
|
-
}, Error>>;
|
|
173
|
+
}): ReturnType<typeof ReportHelpers.analyzeRisks>;
|
|
187
174
|
/**
|
|
188
|
-
* Evaluate a quality gate (simplified API)
|
|
175
|
+
* Evaluate a quality gate (simplified API). #1020: a metric the caller does
|
|
176
|
+
* not supply is unmeasured, so the gate cannot pass on it.
|
|
189
177
|
* @param options - Quality gate evaluation options
|
|
190
178
|
* @returns Result containing gate evaluation
|
|
191
179
|
*/
|
|
@@ -194,26 +182,21 @@ export declare class QualityAssessmentCoordinator extends BaseDomainCoordinator<
|
|
|
194
182
|
metrics: Partial<QualityMetrics>;
|
|
195
183
|
}): Promise<Result<{
|
|
196
184
|
passed: boolean;
|
|
185
|
+
/** 0-100; -1 when a configured check is unmeasured. */
|
|
197
186
|
score: number;
|
|
198
187
|
violations: string[];
|
|
188
|
+
evidenceStatus?: GateResult['evidenceStatus'];
|
|
189
|
+
unmeasured?: string[];
|
|
199
190
|
}, Error>>;
|
|
200
191
|
/**
|
|
201
|
-
* Assess deployment readiness
|
|
192
|
+
* Assess deployment readiness. #1020: never ready while an input is unmeasured.
|
|
202
193
|
* @param options - Deployment readiness options
|
|
203
194
|
* @returns Result containing readiness assessment
|
|
204
195
|
*/
|
|
205
196
|
assessDeploymentReadiness(options: {
|
|
206
197
|
environment: 'development' | 'staging' | 'production';
|
|
207
198
|
changeSet: string[];
|
|
208
|
-
}):
|
|
209
|
-
ready: boolean;
|
|
210
|
-
risks: Array<{
|
|
211
|
-
id: string;
|
|
212
|
-
severity: string;
|
|
213
|
-
description: string;
|
|
214
|
-
}>;
|
|
215
|
-
score: number;
|
|
216
|
-
}, Error>>;
|
|
199
|
+
}): ReturnType<typeof ReportHelpers.assessDeploymentReadiness>;
|
|
217
200
|
/**
|
|
218
201
|
* Analyze technical debt
|
|
219
202
|
* @param options - Technical debt analysis options
|
|
@@ -222,16 +205,7 @@ export declare class QualityAssessmentCoordinator extends BaseDomainCoordinator<
|
|
|
222
205
|
analyzeTechnicalDebt(options: {
|
|
223
206
|
projectPath: string;
|
|
224
207
|
includeCodeSmells?: boolean;
|
|
225
|
-
}):
|
|
226
|
-
totalDebt: number;
|
|
227
|
-
items: Array<{
|
|
228
|
-
file: string;
|
|
229
|
-
type: string;
|
|
230
|
-
effort: number;
|
|
231
|
-
description: string;
|
|
232
|
-
}>;
|
|
233
|
-
debtRatio: number;
|
|
234
|
-
}, Error>>;
|
|
208
|
+
}): ReturnType<typeof ReportHelpers.analyzeTechnicalDebt>;
|
|
235
209
|
private spawnQualityGateAgent;
|
|
236
210
|
private spawnQualityAnalyzerAgent;
|
|
237
211
|
private spawnDeploymentAdvisorAgent;
|
|
@@ -236,7 +236,9 @@ export class QualityAssessmentCoordinator extends BaseDomainCoordinator {
|
|
|
236
236
|
// V3 Integration: Use consensus for borderline cases (CONSENSUS-MIXIN-001)
|
|
237
237
|
// Borderline cases are pass/fail decisions where metrics are close to thresholds
|
|
238
238
|
let finalResult = result.value;
|
|
239
|
-
|
|
239
|
+
// #1020: a verdict on missing evidence is not borderline; it is not a verdict.
|
|
240
|
+
if (this.config.enableConsensus && result.value.evidenceStatus !== 'insufficient-evidence'
|
|
241
|
+
&& this.isBorderlineGateResult(request.metrics, request.thresholds, result.value)) {
|
|
240
242
|
const consensusResult = await this.verifyGateVerdictWithConsensus(effectiveRequest, result.value);
|
|
241
243
|
if (consensusResult) {
|
|
242
244
|
finalResult = consensusResult;
|
|
@@ -544,7 +546,8 @@ export class QualityAssessmentCoordinator extends BaseDomainCoordinator {
|
|
|
544
546
|
return ReportHelpers.generateReport(this.memory, options);
|
|
545
547
|
}
|
|
546
548
|
/**
|
|
547
|
-
* Get quality dashboard overview
|
|
549
|
+
* Get quality dashboard overview. #1020: built from measured evidence only;
|
|
550
|
+
* unmeasured metrics are -1 and listed in `unmeasured`.
|
|
548
551
|
* @returns Result containing dashboard data
|
|
549
552
|
*/
|
|
550
553
|
async getQualityDashboard() {
|
|
@@ -559,7 +562,8 @@ export class QualityAssessmentCoordinator extends BaseDomainCoordinator {
|
|
|
559
562
|
return ReportHelpers.analyzeRisks(this.memory, options);
|
|
560
563
|
}
|
|
561
564
|
/**
|
|
562
|
-
* Evaluate a quality gate (simplified API)
|
|
565
|
+
* Evaluate a quality gate (simplified API). #1020: a metric the caller does
|
|
566
|
+
* not supply is unmeasured, so the gate cannot pass on it.
|
|
563
567
|
* @param options - Quality gate evaluation options
|
|
564
568
|
* @returns Result containing gate evaluation
|
|
565
569
|
*/
|
|
@@ -573,10 +577,12 @@ export class QualityAssessmentCoordinator extends BaseDomainCoordinator {
|
|
|
573
577
|
passed: result.value.passed,
|
|
574
578
|
score: result.value.overallScore,
|
|
575
579
|
violations: result.value.failedChecks,
|
|
580
|
+
...(result.value.evidenceStatus ? { evidenceStatus: result.value.evidenceStatus } : {}),
|
|
581
|
+
...(result.value.unmeasured ? { unmeasured: result.value.unmeasured } : {}),
|
|
576
582
|
});
|
|
577
583
|
}
|
|
578
584
|
/**
|
|
579
|
-
* Assess deployment readiness
|
|
585
|
+
* Assess deployment readiness. #1020: never ready while an input is unmeasured.
|
|
580
586
|
* @param options - Deployment readiness options
|
|
581
587
|
* @returns Result containing readiness assessment
|
|
582
588
|
*/
|
|
@@ -34,6 +34,14 @@ export interface MeasuredFileCoverage {
|
|
|
34
34
|
function: number | null;
|
|
35
35
|
statement: number | null;
|
|
36
36
|
measured: true;
|
|
37
|
+
/**
|
|
38
|
+
* #1219: the line counts behind `line`, so a reader can weight several
|
|
39
|
+
* files by size. Absent on records written before 3.15.13.
|
|
40
|
+
*/
|
|
41
|
+
lines?: {
|
|
42
|
+
covered: number;
|
|
43
|
+
total: number;
|
|
44
|
+
};
|
|
37
45
|
}
|
|
38
46
|
/**
|
|
39
47
|
* Return the measured summary to store, or `null` when the payload is not
|
|
@@ -53,6 +53,27 @@ export function measuredFileCoverage(record) {
|
|
|
53
53
|
if (r.measured !== true || !isPercent(r.line))
|
|
54
54
|
return null;
|
|
55
55
|
const opt = (v) => (isPercent(v) ? v : null);
|
|
56
|
-
|
|
56
|
+
const lines = lineCounts(r.lines, r.line);
|
|
57
|
+
return {
|
|
58
|
+
line: r.line, branch: opt(r.branch), function: opt(r.function), statement: opt(r.statement), measured: true,
|
|
59
|
+
...(lines ? { lines } : {}),
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* #1219: whole, consistent line counts (`covered / total` within rounding of
|
|
64
|
+
* the stored percentage), or `undefined` when the record has none or they do
|
|
65
|
+
* not describe its own percentage.
|
|
66
|
+
*/
|
|
67
|
+
function lineCounts(value, line) {
|
|
68
|
+
if (!value || typeof value !== 'object')
|
|
69
|
+
return undefined;
|
|
70
|
+
const { covered, total } = value;
|
|
71
|
+
if (!Number.isSafeInteger(covered) || !Number.isSafeInteger(total))
|
|
72
|
+
return undefined;
|
|
73
|
+
const c = covered;
|
|
74
|
+
const t = total;
|
|
75
|
+
if (t <= 0 || c < 0 || c > t || Math.abs((c / t) * 100 - line) > 0.01)
|
|
76
|
+
return undefined;
|
|
77
|
+
return { covered: c, total: t };
|
|
57
78
|
}
|
|
58
79
|
//# sourceMappingURL=coverage-report-event.js.map
|
|
@@ -54,7 +54,9 @@ export interface GateResult {
|
|
|
54
54
|
gateName: string;
|
|
55
55
|
passed: boolean;
|
|
56
56
|
checks: GateCheck[];
|
|
57
|
+
/** 0-100; -1 when any configured check is unmeasured (#1020). */
|
|
57
58
|
overallScore: number;
|
|
59
|
+
/** Measured checks that failed their threshold; unmeasured checks are not listed (#1020). */
|
|
58
60
|
failedChecks: string[];
|
|
59
61
|
/** Gate service evidence state; absent for other gate implementations. */
|
|
60
62
|
evidenceStatus?: 'measured' | 'insufficient-evidence';
|
|
@@ -101,6 +103,12 @@ export interface QualityReport {
|
|
|
101
103
|
* value covers `analysedFiles` of `totalFiles`; `failed` lists the gaps.
|
|
102
104
|
*/
|
|
103
105
|
partial?: PartialQualityMetric[];
|
|
106
|
+
/**
|
|
107
|
+
* The weighted score over the measured metrics only, present when a
|
|
108
|
+
* requested metric is unmeasured. `score.overall` is then -1: a score that
|
|
109
|
+
* leaves out unmeasured metrics is not the overall score (#1223 convention).
|
|
110
|
+
*/
|
|
111
|
+
subsetScore?: number;
|
|
104
112
|
}
|
|
105
113
|
/** #1021: a file excluded from static analysis, with the reason. */
|
|
106
114
|
export interface ExcludedQualityFile {
|
|
@@ -11,7 +11,10 @@ import { QualityTier, DEFAULT_COHERENCE_GATE_POLICY, } from '../coherence/index.
|
|
|
11
11
|
import { createLambdaCalculator, } from '../coherence/lambda-calculator.js';
|
|
12
12
|
import { createCoherenceGateController, } from '../coherence/gate-controller.js';
|
|
13
13
|
import { toError } from '../../../shared/error-utils.js';
|
|
14
|
+
import { isMeasuredMetricValue } from '../evidence-sufficiency.js';
|
|
14
15
|
import { createPartitionDetector, } from '../coherence/partition-detector.js';
|
|
16
|
+
/** #996: the sentinel for an input with no measured value. */
|
|
17
|
+
const UNMEASURED = -1;
|
|
15
18
|
/**
|
|
16
19
|
* Default service configuration
|
|
17
20
|
*/
|
|
@@ -175,13 +178,23 @@ export class CoherenceGateService extends QualityGateService {
|
|
|
175
178
|
* Convert QualityMetrics to coherence input format
|
|
176
179
|
*/
|
|
177
180
|
convertToCoherenceMetrics(metrics, previousLambda) {
|
|
181
|
+
// #1020: QualityMetrics carries no latency or flaky-test data, so those
|
|
182
|
+
// inputs are unmeasured (-1) instead of an invented "fast, not flaky"
|
|
183
|
+
// value. The total vulnerability count is weighted as critical, so the
|
|
184
|
+
// high/medium breakdown adds nothing when the total was measured.
|
|
185
|
+
const vulns = isMeasuredMetricValue(metrics.securityVulnerabilities) ? 0 : UNMEASURED;
|
|
178
186
|
return {
|
|
179
187
|
lineCoverage: metrics.coverage,
|
|
180
188
|
testPassRate: metrics.testsPassing,
|
|
181
189
|
criticalVulns: metrics.securityVulnerabilities,
|
|
182
|
-
|
|
190
|
+
highVulns: vulns,
|
|
191
|
+
mediumVulns: vulns,
|
|
192
|
+
p95Latency: UNMEASURED,
|
|
183
193
|
targetLatency: 200, // Default target
|
|
184
|
-
maintainabilityIndex:
|
|
194
|
+
maintainabilityIndex: isMeasuredMetricValue(metrics.technicalDebt)
|
|
195
|
+
? 100 - metrics.technicalDebt * 10 // Convert debt hours to index
|
|
196
|
+
: UNMEASURED,
|
|
197
|
+
flakyTestRatio: UNMEASURED,
|
|
185
198
|
duplicationPercent: metrics.duplications,
|
|
186
199
|
previousLambda,
|
|
187
200
|
};
|
|
@@ -126,6 +126,10 @@ export declare class QualityAnalyzerService implements IQualityAnalyzerService {
|
|
|
126
126
|
* Never a fixed fallback value.
|
|
127
127
|
*/
|
|
128
128
|
private collectFileMetrics;
|
|
129
|
+
/**
|
|
130
|
+
* The file's own measured coverage record, or `null`. #1219: never the
|
|
131
|
+
* project-wide `coverage:latest` summary — that is not this file's coverage.
|
|
132
|
+
*/
|
|
129
133
|
private getStoredCoverage;
|
|
130
134
|
private aggregateMetrics;
|
|
131
135
|
private calculateQualityScore;
|
|
@@ -9,7 +9,7 @@ import { getCodeMetricsAnalyzer } from '../../../shared/metrics/index.js';
|
|
|
9
9
|
import { toError } from '../../../shared/error-utils.js';
|
|
10
10
|
import { safeJsonParse } from '../../../shared/safe-json.js';
|
|
11
11
|
import { getClaudeModelForTier } from '../../../shared/llm/model-registry.js';
|
|
12
|
-
import {
|
|
12
|
+
import { measuredFileCoverage } from '../coverage-report-event.js';
|
|
13
13
|
import { fileCoverageLookupKeys } from '../../coverage-analysis/collected-metrics.js';
|
|
14
14
|
/** Metrics the static analyzer produces when the caller asks for all of them. */
|
|
15
15
|
const ANALYZER_METRICS = ['coverage', 'complexity', 'maintainability', 'duplication', 'testability'];
|
|
@@ -25,6 +25,22 @@ const PARSED_METRICS = new Set(['complexity', 'maintainability', 'testability'])
|
|
|
25
25
|
export const MIN_ANALYSED_SHARE = 0.95;
|
|
26
26
|
/** #1011: the sentinel for "not measured" in score and complexity fields. */
|
|
27
27
|
const UNMEASURED = -1;
|
|
28
|
+
/**
|
|
29
|
+
* #1219: covered lines over total lines across the files, or `null` when a
|
|
30
|
+
* record has no line counts (a mean of percentages would weight a 10-line
|
|
31
|
+
* file like a 1000-line one).
|
|
32
|
+
*/
|
|
33
|
+
function lineWeightedCoverage(records) {
|
|
34
|
+
let covered = 0;
|
|
35
|
+
let total = 0;
|
|
36
|
+
for (const record of records) {
|
|
37
|
+
if (!record.lines)
|
|
38
|
+
return null;
|
|
39
|
+
covered += record.lines.covered;
|
|
40
|
+
total += record.lines.total;
|
|
41
|
+
}
|
|
42
|
+
return total > 0 ? (covered / total) * 100 : null;
|
|
43
|
+
}
|
|
28
44
|
/** First reasons of a failure list, for a one-line explanation. */
|
|
29
45
|
function summariseFailures(failures) {
|
|
30
46
|
return failures.slice(0, 3).map((f) => f.reason).join('; ')
|
|
@@ -262,11 +278,16 @@ Focus on:
|
|
|
262
278
|
return err(new Error('No source files provided for analysis'));
|
|
263
279
|
}
|
|
264
280
|
// Analyze metrics for each file; failures become unmeasured (#1011)
|
|
265
|
-
const { fileMetrics, unmeasured, excluded, partial } = await this.collectFileMetrics(sourceFiles, includeMetrics, request.explicitFiles ?? []);
|
|
281
|
+
const { fileMetrics, scopeValues, unmeasured, excluded, partial } = await this.collectFileMetrics(sourceFiles, includeMetrics, request.explicitFiles ?? []);
|
|
266
282
|
// Calculate aggregated metrics
|
|
267
|
-
const metricDetails = this.aggregateMetrics(fileMetrics);
|
|
268
|
-
// Calculate overall quality score
|
|
269
|
-
|
|
283
|
+
const metricDetails = this.aggregateMetrics(fileMetrics, scopeValues);
|
|
284
|
+
// Calculate overall quality score. With a requested metric unmeasured
|
|
285
|
+
// there is no overall score (-1, as the gate's overallScore since
|
|
286
|
+
// #1223); the score over the measured metrics is kept as subsetScore.
|
|
287
|
+
const computed = this.calculateQualityScore(metricDetails);
|
|
288
|
+
const insufficient = unmeasured.length > 0;
|
|
289
|
+
const score = insufficient ? { ...computed, overall: UNMEASURED } : computed;
|
|
290
|
+
const subsetScore = insufficient && computed.overall >= 0 ? computed.overall : undefined;
|
|
270
291
|
// Generate trends if enabled
|
|
271
292
|
const trends = this.config.enableTrendAnalysis
|
|
272
293
|
? await this.generateTrends(metricDetails, compareBaseline)
|
|
@@ -290,6 +311,7 @@ Focus on:
|
|
|
290
311
|
unmeasured,
|
|
291
312
|
excluded,
|
|
292
313
|
partial,
|
|
314
|
+
...(subsetScore !== undefined ? { subsetScore } : {}),
|
|
293
315
|
};
|
|
294
316
|
// Store the report
|
|
295
317
|
await this.storeReport(report, sourceFiles);
|
|
@@ -395,6 +417,8 @@ Focus on:
|
|
|
395
417
|
const unreadable = [];
|
|
396
418
|
const readable = [];
|
|
397
419
|
const missingCoverage = [];
|
|
420
|
+
const coverageRecords = [];
|
|
421
|
+
const scopeValues = {};
|
|
398
422
|
const explicit = new Set(explicitFiles);
|
|
399
423
|
const needsAnalysis = requested.some((m) => PARSED_METRICS.has(m) || m === 'duplication');
|
|
400
424
|
for (const file of files) {
|
|
@@ -430,7 +454,8 @@ Focus on:
|
|
|
430
454
|
// Coverage requires external data (from test runners) — never fabricate a number
|
|
431
455
|
const storedCoverage = await this.getStoredCoverage(file);
|
|
432
456
|
if (storedCoverage !== null) {
|
|
433
|
-
metrics.coverage = storedCoverage;
|
|
457
|
+
metrics.coverage = storedCoverage.line;
|
|
458
|
+
coverageRecords.push(storedCoverage);
|
|
434
459
|
}
|
|
435
460
|
else {
|
|
436
461
|
missingCoverage.push(file);
|
|
@@ -442,11 +467,33 @@ Focus on:
|
|
|
442
467
|
if (missingCoverage.length > 0) {
|
|
443
468
|
for (const metrics of fileMetrics.values())
|
|
444
469
|
delete metrics.coverage;
|
|
470
|
+
// #1219: the project-wide summary is not a measurement of these files.
|
|
445
471
|
unmeasured.push({
|
|
446
472
|
metric: 'coverage',
|
|
447
|
-
reason: `no measured coverage recorded for ${missingCoverage.length} of ${total} file(s)
|
|
473
|
+
reason: `no measured coverage recorded for ${missingCoverage.length} of ${total} file(s) `
|
|
474
|
+
+ `(${missingCoverage.slice(0, 3).join(', ')}${missingCoverage.length > 3 ? ', …' : ''}); `
|
|
475
|
+
+ 'a project-wide coverage figure is not a measurement of these files',
|
|
476
|
+
files: missingCoverage,
|
|
448
477
|
});
|
|
449
478
|
}
|
|
479
|
+
else if (coverageRecords.length > 1) {
|
|
480
|
+
const weighted = lineWeightedCoverage(coverageRecords);
|
|
481
|
+
if (weighted === null) {
|
|
482
|
+
for (const metrics of fileMetrics.values())
|
|
483
|
+
delete metrics.coverage;
|
|
484
|
+
const legacy = coverageRecords.filter((r) => !r.lines).length;
|
|
485
|
+
// #1219: a plain mean of per-file percentages is not the scope's coverage.
|
|
486
|
+
unmeasured.push({
|
|
487
|
+
metric: 'coverage',
|
|
488
|
+
reason: `${legacy} of ${coverageRecords.length} per-file coverage record(s) carry no line counts `
|
|
489
|
+
+ '(written before 3.15.13), so the files cannot be weighted by size and a mean of their '
|
|
490
|
+
+ 'percentages is not the coverage of the scope; re-run coverage to record line counts',
|
|
491
|
+
});
|
|
492
|
+
}
|
|
493
|
+
else {
|
|
494
|
+
scopeValues.coverage = weighted;
|
|
495
|
+
}
|
|
496
|
+
}
|
|
450
497
|
/** Decide whether a metric with these failures is measured, partial or unmeasured. */
|
|
451
498
|
const judge = (metric, failures) => {
|
|
452
499
|
const analysed = total - failures.length;
|
|
@@ -502,8 +549,12 @@ Focus on:
|
|
|
502
549
|
unmeasured.push({ metric: 'duplication', reason: `duplication detection failed: ${toError(error).message}` });
|
|
503
550
|
}
|
|
504
551
|
}
|
|
505
|
-
return { fileMetrics, unmeasured, excluded, partial };
|
|
552
|
+
return { fileMetrics, scopeValues, unmeasured, excluded, partial };
|
|
506
553
|
}
|
|
554
|
+
/**
|
|
555
|
+
* The file's own measured coverage record, or `null`. #1219: never the
|
|
556
|
+
* project-wide `coverage:latest` summary — that is not this file's coverage.
|
|
557
|
+
*/
|
|
507
558
|
async getStoredCoverage(file) {
|
|
508
559
|
try {
|
|
509
560
|
// 1. Try per-file coverage stored by test executor
|
|
@@ -512,21 +563,16 @@ Focus on:
|
|
|
512
563
|
for (const key of fileCoverageLookupKeys(file)) {
|
|
513
564
|
const fileCoverage = measuredFileCoverage(await this.memory.get(key));
|
|
514
565
|
if (fileCoverage)
|
|
515
|
-
return fileCoverage
|
|
516
|
-
}
|
|
517
|
-
// 2. Fall back to project-wide summary from coverage-analyzer
|
|
518
|
-
const summary = measuredCoverageSummary(await this.memory.get('coverage:latest'));
|
|
519
|
-
if (summary) {
|
|
520
|
-
return summary.line;
|
|
566
|
+
return fileCoverage;
|
|
521
567
|
}
|
|
522
|
-
// No coverage data
|
|
568
|
+
// No coverage data for this file — return null (never fabricate)
|
|
523
569
|
return null;
|
|
524
570
|
}
|
|
525
571
|
catch {
|
|
526
572
|
return null;
|
|
527
573
|
}
|
|
528
574
|
}
|
|
529
|
-
aggregateMetrics(fileMetrics) {
|
|
575
|
+
aggregateMetrics(fileMetrics, scopeValues = {}) {
|
|
530
576
|
const aggregated = new Map();
|
|
531
577
|
// Collect all values per metric
|
|
532
578
|
for (const metrics of fileMetrics.values()) {
|
|
@@ -539,7 +585,7 @@ Focus on:
|
|
|
539
585
|
// Calculate averages and generate details
|
|
540
586
|
const details = [];
|
|
541
587
|
for (const [name, values] of aggregated.entries()) {
|
|
542
|
-
const average = values.reduce((a, b) => a + b, 0) / values.length;
|
|
588
|
+
const average = scopeValues[name] ?? values.reduce((a, b) => a + b, 0) / values.length;
|
|
543
589
|
const rating = this.getMetricRating(average, name);
|
|
544
590
|
const trend = this.estimateTrend(values);
|
|
545
591
|
details.push({
|
|
@@ -87,14 +87,16 @@ export class QualityGateService {
|
|
|
87
87
|
const unmeasured = checks
|
|
88
88
|
.filter((check) => !isMeasuredMetricValue(check.value))
|
|
89
89
|
.map((check) => check.name);
|
|
90
|
-
// Collect failed checks
|
|
90
|
+
// Collect failed checks. #1020: an unmeasured check did not fail a
|
|
91
|
+
// threshold; it is listed in `unmeasured` only.
|
|
91
92
|
for (const check of checks) {
|
|
92
|
-
if (!check.passed) {
|
|
93
|
+
if (!check.passed && isMeasuredMetricValue(check.value)) {
|
|
93
94
|
failedChecks.push(check.name);
|
|
94
95
|
}
|
|
95
96
|
}
|
|
96
|
-
// Calculate overall score (0-100)
|
|
97
|
-
|
|
97
|
+
// Calculate overall score (0-100). #1020: -1 = no measured score, the
|
|
98
|
+
// same sentinel quality_assess uses; never a score over partial data.
|
|
99
|
+
const overallScore = unmeasured.length === 0 ? this.calculateOverallScore(checks) : -1;
|
|
98
100
|
// Determine pass/fail based on critical checks
|
|
99
101
|
const passed = unmeasured.length === 0 && this.determineGateStatus(checks);
|
|
100
102
|
const result = {
|
|
@@ -9,5 +9,5 @@ export { SecurityComplianceCoordinator, type IExtendedSecurityComplianceCoordina
|
|
|
9
9
|
export { SecurityScannerService, type ISecurityScannerService, type SecurityScannerConfig, type FullScanResult, } from './services/security-scanner.js';
|
|
10
10
|
export { SecurityAuditorService, type ISecurityAuditorService, type SecurityAuditorConfig, type SecurityPostureSummary, type TriagedVulnerabilities, } from './services/security-auditor.js';
|
|
11
11
|
export { ComplianceValidatorService, type IExtendedComplianceValidationService, type ComplianceValidatorConfig, type MultiStandardReport, type DataType, type DataHandlingReport, type DataLocation, type ComplianceEvidence, type ControlEvidence, } from './services/compliance-validator.js';
|
|
12
|
-
export type { Vulnerability, VulnerabilitySeverity, VulnerabilityCategory, VulnerabilityLocation, DependencyInfo, RemediationAdvice, ComplianceStandard, ComplianceRule, ComplianceViolation, ComplianceContext, ComplianceReport, GapAnalysis, ComplianceGap, RemediationAction, SASTResult, DASTResult, DASTOptions, DependencyScanResult, SecretScanResult, DetectedSecret, ScanSummary, ScanStatus, RuleSet, FalsePositiveCheck, SecurityCoverage, AuthCredentials, PackageSecurityInfo, OutdatedPackage, UpgradeRecommendation, SecurityAuditOptions, SecurityAuditReport, SecurityPosture, ISASTService, IDASTService, IDependencySecurityService, IComplianceValidationService, ISecurityComplianceCoordinator, IVulnerabilityRepository, IComplianceReportRepository, SecurityScanCompletedEvent, VulnerabilityDetectedEvent, ComplianceCheckCompletedEvent, } from './interfaces.js';
|
|
12
|
+
export type { Vulnerability, VulnerabilitySeverity, VulnerabilityCategory, VulnerabilityLocation, DependencyInfo, RemediationAdvice, ComplianceStandard, ComplianceRule, ComplianceViolation, ComplianceContext, ComplianceReport, GapAnalysis, ComplianceGap, RemediationAction, SASTResult, DASTResult, DASTScanStatus, DASTRequestFailure, DASTOptions, DependencyScanResult, SecretScanResult, DetectedSecret, ScanSummary, ScanStatus, RuleSet, FalsePositiveCheck, SecurityCoverage, AuthCredentials, PackageSecurityInfo, OutdatedPackage, UpgradeRecommendation, SecurityAuditOptions, SecurityAuditReport, SecurityPosture, ISASTService, IDASTService, IDependencySecurityService, IComplianceValidationService, ISecurityComplianceCoordinator, IVulnerabilityRepository, IComplianceReportRepository, SecurityScanCompletedEvent, VulnerabilityDetectedEvent, ComplianceCheckCompletedEvent, } from './interfaces.js';
|
|
13
13
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -179,12 +179,32 @@ export interface DASTOptions {
|
|
|
179
179
|
readonly activeScanning?: boolean;
|
|
180
180
|
readonly timeout?: number;
|
|
181
181
|
}
|
|
182
|
+
/**
|
|
183
|
+
* Completeness of a DAST scan (#1135), on the model of DependencyScanStatus (#1049).
|
|
184
|
+
* - complete: every planned request was answered; the findings (or none) are a measurement.
|
|
185
|
+
* - incomplete: the target answered, some probes did not; the findings are real, the rest is unmeasured.
|
|
186
|
+
* - failed: the target could not be scanned. Never read as "no findings".
|
|
187
|
+
*/
|
|
188
|
+
export type DASTScanStatus = 'complete' | 'incomplete' | 'failed';
|
|
189
|
+
/** A DAST request the target did not answer (#1135). */
|
|
190
|
+
export interface DASTRequestFailure {
|
|
191
|
+
/** Origin and path of the request; query strings and credentials are not kept. */
|
|
192
|
+
readonly url: string;
|
|
193
|
+
/** DAST_REQUEST_FAILED, DAST_REQUEST_TIMEOUT, DAST_TLS_FAILED, DAST_RATE_LIMITED, ... */
|
|
194
|
+
readonly code: string;
|
|
195
|
+
readonly reason: string;
|
|
196
|
+
}
|
|
182
197
|
export interface DASTResult {
|
|
183
198
|
readonly scanId: string;
|
|
184
199
|
readonly targetUrl: string;
|
|
185
200
|
readonly vulnerabilities: Vulnerability[];
|
|
186
201
|
readonly summary: ScanSummary;
|
|
187
202
|
readonly crawledUrls: number;
|
|
203
|
+
readonly status: DASTScanStatus;
|
|
204
|
+
/** Requests the target did not answer; non-empty means the scan is not complete. */
|
|
205
|
+
readonly failedRequests: DASTRequestFailure[];
|
|
206
|
+
/** Why the scan is incomplete/failed; absent when complete. */
|
|
207
|
+
readonly error?: string;
|
|
188
208
|
}
|
|
189
209
|
export interface AuthCredentials {
|
|
190
210
|
readonly type: 'basic' | 'bearer' | 'cookie' | 'oauth';
|
|
@@ -213,6 +233,16 @@ export interface IDependencySecurityService {
|
|
|
213
233
|
export interface DependencyScanResult {
|
|
214
234
|
readonly vulnerabilities: Vulnerability[];
|
|
215
235
|
readonly outdatedPackages: OutdatedPackage[];
|
|
236
|
+
/**
|
|
237
|
+
* #1221: whether the latest version of every dependency was looked up. Only
|
|
238
|
+
* 'complete' means `outdatedPackages` is the full list; 'incomplete' and
|
|
239
|
+
* 'failed' list the packages not checked in `outdatedUnchecked`, and
|
|
240
|
+
* 'not-run' means this scan does not look up latest versions. An empty
|
|
241
|
+
* `outdatedPackages` is "up to date" only when this is 'complete'.
|
|
242
|
+
*/
|
|
243
|
+
readonly outdatedStatus: 'complete' | 'incomplete' | 'failed' | 'not-run';
|
|
244
|
+
/** #1221: dependencies whose latest version could not be looked up, and why. */
|
|
245
|
+
readonly outdatedUnchecked: UncheckedDependency[];
|
|
216
246
|
readonly summary: ScanSummary;
|
|
217
247
|
/**
|
|
218
248
|
* #1049: whether the advisory lookup covered every dependency. Only
|
|
@@ -227,7 +257,7 @@ export interface DependencyScanResult {
|
|
|
227
257
|
/** Why the scan is incomplete/failed; absent when complete. */
|
|
228
258
|
readonly error?: string;
|
|
229
259
|
}
|
|
230
|
-
/** A dependency whose advisories could not be checked, and why
|
|
260
|
+
/** A dependency whose advisories (#1049) or latest version (#1221) could not be checked, and why. */
|
|
231
261
|
export interface UncheckedDependency {
|
|
232
262
|
readonly name: string;
|
|
233
263
|
/** The spec as declared in the manifest. */
|
|
@@ -249,8 +279,13 @@ export interface PackageSecurityInfo {
|
|
|
249
279
|
readonly name: string;
|
|
250
280
|
readonly version: string;
|
|
251
281
|
readonly vulnerabilities: Vulnerability[];
|
|
252
|
-
|
|
253
|
-
readonly
|
|
282
|
+
/** null when the registry lookup failed (#1052). */
|
|
283
|
+
readonly latestVersion: string | null;
|
|
284
|
+
/** null when deprecation could not be checked, never `false` (#1052). */
|
|
285
|
+
readonly isDeprecated: boolean | null;
|
|
286
|
+
/** incomplete when a registry lookup failed; `unchecked` says which and why. */
|
|
287
|
+
readonly status: 'complete' | 'incomplete';
|
|
288
|
+
readonly unchecked?: string[];
|
|
254
289
|
}
|
|
255
290
|
export interface OutdatedPackage {
|
|
256
291
|
readonly name: string;
|
|
@@ -261,9 +296,13 @@ export interface OutdatedPackage {
|
|
|
261
296
|
export interface UpgradeRecommendation {
|
|
262
297
|
readonly package: string;
|
|
263
298
|
readonly fromVersion: string;
|
|
264
|
-
|
|
299
|
+
/** null when the registry lookup failed; see `unchecked` (#1052). */
|
|
300
|
+
readonly toVersion: string | null;
|
|
265
301
|
readonly fixesVulnerabilities: string[];
|
|
266
|
-
|
|
302
|
+
/** null when the target version is unknown. */
|
|
303
|
+
readonly breakingChanges: boolean | null;
|
|
304
|
+
/** Why no target version could be looked up; absent when it was. */
|
|
305
|
+
readonly unchecked?: string;
|
|
267
306
|
}
|
|
268
307
|
/**
|
|
269
308
|
* Compliance Validation Service
|
|
@@ -358,6 +397,8 @@ export interface SecurityAuditReport {
|
|
|
358
397
|
readonly secretScanResults?: SecretScanResult;
|
|
359
398
|
readonly overallRiskScore: RiskScore;
|
|
360
399
|
readonly recommendations: string[];
|
|
400
|
+
/** Checks that ran but could not complete (#1052); absent when every included check completed. */
|
|
401
|
+
readonly incompleteChecks?: string[];
|
|
361
402
|
}
|
|
362
403
|
export interface SecretScanResult {
|
|
363
404
|
readonly secretsFound: DetectedSecret[];
|
|
@@ -2,15 +2,15 @@
|
|
|
2
2
|
* Agentic QE v3 - DAST Authorization Testing
|
|
3
3
|
* Authorization bypass and IDOR testing utilities
|
|
4
4
|
*/
|
|
5
|
-
import type { Vulnerability, AuthCredentials } from './scanner-types.js';
|
|
5
|
+
import type { Vulnerability, AuthCredentials, DASTRequestFailure } from './scanner-types.js';
|
|
6
6
|
/**
|
|
7
7
|
* Test for authorization bypass on protected endpoints
|
|
8
8
|
*/
|
|
9
|
-
export declare function testAuthorizationBypass(parsedUrl: URL, authHeaders: Record<string, string>, crawledUrls: number, maxDepth: number, vulnerabilities: Vulnerability[]): Promise<number>;
|
|
9
|
+
export declare function testAuthorizationBypass(parsedUrl: URL, authHeaders: Record<string, string>, crawledUrls: number, maxDepth: number, vulnerabilities: Vulnerability[], failures?: DASTRequestFailure[]): Promise<number>;
|
|
10
10
|
/**
|
|
11
11
|
* Test for Insecure Direct Object References (IDOR)
|
|
12
12
|
*/
|
|
13
|
-
export declare function testIDOR(parsedUrl: URL, authHeaders: Record<string, string>, crawledUrls: number, maxDepth: number, vulnerabilities: Vulnerability[]): Promise<number>;
|
|
13
|
+
export declare function testIDOR(parsedUrl: URL, authHeaders: Record<string, string>, crawledUrls: number, maxDepth: number, vulnerabilities: Vulnerability[], failures?: DASTRequestFailure[]): Promise<number>;
|
|
14
14
|
/**
|
|
15
15
|
* Validate authentication credentials
|
|
16
16
|
*/
|
|
@@ -3,13 +3,14 @@
|
|
|
3
3
|
* Authorization bypass and IDOR testing utilities
|
|
4
4
|
*/
|
|
5
5
|
import { v4 as uuidv4 } from 'uuid';
|
|
6
|
+
import { probe } from './dast-requests.js';
|
|
6
7
|
// ============================================================================
|
|
7
8
|
// Authorization Testing
|
|
8
9
|
// ============================================================================
|
|
9
10
|
/**
|
|
10
11
|
* Test for authorization bypass on protected endpoints
|
|
11
12
|
*/
|
|
12
|
-
export async function testAuthorizationBypass(parsedUrl, authHeaders, crawledUrls, maxDepth, vulnerabilities) {
|
|
13
|
+
export async function testAuthorizationBypass(parsedUrl, authHeaders, crawledUrls, maxDepth, vulnerabilities, failures) {
|
|
13
14
|
const protectedEndpoints = [
|
|
14
15
|
'/admin',
|
|
15
16
|
'/dashboard',
|
|
@@ -23,21 +24,21 @@ export async function testAuthorizationBypass(parsedUrl, authHeaders, crawledUrl
|
|
|
23
24
|
break;
|
|
24
25
|
const testUrl = new URL(endpoint, parsedUrl.origin).toString();
|
|
25
26
|
// Try with authentication
|
|
26
|
-
const authResponse = await
|
|
27
|
+
const authResponse = await probe(testUrl, {
|
|
27
28
|
method: 'GET',
|
|
28
29
|
headers: { ...authHeaders },
|
|
29
30
|
signal: AbortSignal.timeout(5000),
|
|
30
|
-
});
|
|
31
|
-
if (authResponse
|
|
31
|
+
}, failures);
|
|
32
|
+
if (authResponse?.ok) {
|
|
32
33
|
crawledUrls++;
|
|
33
34
|
// Try without authentication
|
|
34
|
-
const unauthResponse = await
|
|
35
|
+
const unauthResponse = await probe(testUrl, {
|
|
35
36
|
method: 'GET',
|
|
36
37
|
signal: AbortSignal.timeout(5000),
|
|
37
|
-
});
|
|
38
|
-
if (unauthResponse
|
|
39
|
-
const authText =
|
|
40
|
-
const unauthText =
|
|
38
|
+
}, failures);
|
|
39
|
+
if (unauthResponse?.ok && unauthResponse.status === 200) {
|
|
40
|
+
const authText = authResponse.text;
|
|
41
|
+
const unauthText = unauthResponse.text;
|
|
41
42
|
if (authText.length > 100 && unauthText.length > 100 &&
|
|
42
43
|
Math.abs(authText.length - unauthText.length) < authText.length * 0.1) {
|
|
43
44
|
vulnerabilities.push({
|
|
@@ -59,7 +60,7 @@ export async function testAuthorizationBypass(parsedUrl, authHeaders, crawledUrl
|
|
|
59
60
|
/**
|
|
60
61
|
* Test for Insecure Direct Object References (IDOR)
|
|
61
62
|
*/
|
|
62
|
-
export async function testIDOR(parsedUrl, authHeaders, crawledUrls, maxDepth, vulnerabilities) {
|
|
63
|
+
export async function testIDOR(parsedUrl, authHeaders, crawledUrls, maxDepth, vulnerabilities, failures) {
|
|
63
64
|
const idorEndpoints = [
|
|
64
65
|
'/api/users/1',
|
|
65
66
|
'/api/users/2',
|
|
@@ -70,14 +71,14 @@ export async function testIDOR(parsedUrl, authHeaders, crawledUrls, maxDepth, vu
|
|
|
70
71
|
if (crawledUrls >= maxDepth * 15)
|
|
71
72
|
break;
|
|
72
73
|
const testUrl = new URL(endpoint, parsedUrl.origin).toString();
|
|
73
|
-
const response = await
|
|
74
|
+
const response = await probe(testUrl, {
|
|
74
75
|
method: 'GET',
|
|
75
76
|
headers: { ...authHeaders },
|
|
76
77
|
signal: AbortSignal.timeout(5000),
|
|
77
|
-
});
|
|
78
|
-
if (response
|
|
78
|
+
}, failures);
|
|
79
|
+
if (response?.ok) {
|
|
79
80
|
crawledUrls++;
|
|
80
|
-
const text =
|
|
81
|
+
const text = response.text;
|
|
81
82
|
if (text.includes('email') || text.includes('password') || text.includes('phone')) {
|
|
82
83
|
vulnerabilities.push({
|
|
83
84
|
id: uuidv4(),
|