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
|
@@ -6,9 +6,18 @@ import { createHash } from 'node:crypto';
|
|
|
6
6
|
import { ok, err } from '../../../shared/types/index.js';
|
|
7
7
|
import { NomicEmbedder, EMBEDDING_CONFIG, } from '../../../shared/embeddings/index.js';
|
|
8
8
|
import { toError } from '../../../shared/error-utils.js';
|
|
9
|
+
/**
|
|
10
|
+
* #1224: the message for a search over an empty index. "No results" is only
|
|
11
|
+
* reported after searching an index that holds code.
|
|
12
|
+
*/
|
|
13
|
+
export const NOTHING_INDEXED_FOR_SEARCH = 'No code is indexed for search yet, so the search was not run. ' +
|
|
14
|
+
'Index the project first (MCP code_index, or `aqe code index <path>`), then search again.';
|
|
15
|
+
/** Upper bound on indexed files one exact/fuzzy search reads. */
|
|
16
|
+
const MAX_INDEXED_FILES_SCANNED = 100_000;
|
|
9
17
|
const DEFAULT_CONFIG = {
|
|
10
18
|
embeddingDimension: EMBEDDING_CONFIG.DIMENSIONS, // 384 for all-MiniLM-L6-v2
|
|
11
19
|
minScore: 0.5,
|
|
20
|
+
minVectorScore: 0.3,
|
|
12
21
|
maxResults: 100,
|
|
13
22
|
namespace: 'code-intelligence:semantic',
|
|
14
23
|
enableCaching: true,
|
|
@@ -26,6 +35,8 @@ export class SemanticAnalyzerService {
|
|
|
26
35
|
analysisCache = new Map();
|
|
27
36
|
embedder = null;
|
|
28
37
|
embedderInitialized = false;
|
|
38
|
+
/** #1224: why no embedder is in use, once initialization has run. */
|
|
39
|
+
embedderUnavailableReason = null;
|
|
29
40
|
constructor(memory, config = {}) {
|
|
30
41
|
this.memory = memory;
|
|
31
42
|
this.config = { ...DEFAULT_CONFIG, ...config };
|
|
@@ -43,9 +54,11 @@ export class SemanticAnalyzerService {
|
|
|
43
54
|
return;
|
|
44
55
|
}
|
|
45
56
|
if (this.config.useNomicEmbeddings) {
|
|
57
|
+
// #1224: no pseudo-embedding fallback. A failed embed throws, and the
|
|
58
|
+
// search reports itself as lexical-only instead.
|
|
46
59
|
const nomicEmbedder = new NomicEmbedder({
|
|
47
|
-
enableFallback: true,
|
|
48
60
|
...this.config.nomicConfig,
|
|
61
|
+
enableFallback: false,
|
|
49
62
|
});
|
|
50
63
|
// Check if Ollama is available
|
|
51
64
|
const isAvailable = await nomicEmbedder.healthCheck();
|
|
@@ -55,6 +68,13 @@ export class SemanticAnalyzerService {
|
|
|
55
68
|
this.config.embeddingDimension =
|
|
56
69
|
EMBEDDING_CONFIG.DIMENSIONS;
|
|
57
70
|
}
|
|
71
|
+
else {
|
|
72
|
+
this.embedderUnavailableReason =
|
|
73
|
+
`no embedding model available (Ollama model '${EMBEDDING_CONFIG.MODEL}' is not reachable)`;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
this.embedderUnavailableReason = 'embeddings are disabled for code search';
|
|
58
78
|
}
|
|
59
79
|
this.embedderInitialized = true;
|
|
60
80
|
}
|
|
@@ -65,11 +85,23 @@ export class SemanticAnalyzerService {
|
|
|
65
85
|
const startTime = Date.now();
|
|
66
86
|
try {
|
|
67
87
|
const { query, type, scope, limit = this.config.maxResults, filters } = request;
|
|
88
|
+
if (type !== 'semantic' && type !== 'exact' && type !== 'fuzzy') {
|
|
89
|
+
return err(new Error(`Unknown search type: ${type}`));
|
|
90
|
+
}
|
|
91
|
+
// #1224: an empty answer from an empty index is not "no results".
|
|
92
|
+
const indexed = await this.memory.search(this.contentKeyPattern(), 1);
|
|
93
|
+
if (indexed.length === 0) {
|
|
94
|
+
return err(new Error(NOTHING_INDEXED_FOR_SEARCH));
|
|
95
|
+
}
|
|
68
96
|
let results;
|
|
97
|
+
let lexicalOnlyReason;
|
|
69
98
|
switch (type) {
|
|
70
|
-
case 'semantic':
|
|
71
|
-
|
|
99
|
+
case 'semantic': {
|
|
100
|
+
const semantic = await this.semanticSearch(query, limit, scope, filters);
|
|
101
|
+
results = semantic.results;
|
|
102
|
+
lexicalOnlyReason = semantic.lexicalOnlyReason;
|
|
72
103
|
break;
|
|
104
|
+
}
|
|
73
105
|
case 'exact':
|
|
74
106
|
results = await this.exactSearch(query, limit, scope, filters);
|
|
75
107
|
break;
|
|
@@ -84,6 +116,11 @@ export class SemanticAnalyzerService {
|
|
|
84
116
|
results,
|
|
85
117
|
total: results.length,
|
|
86
118
|
searchTime,
|
|
119
|
+
...(type === 'semantic'
|
|
120
|
+
? lexicalOnlyReason === undefined
|
|
121
|
+
? { mode: 'vector' }
|
|
122
|
+
: { mode: 'lexical-only', reason: lexicalOnlyReason }
|
|
123
|
+
: {}),
|
|
87
124
|
});
|
|
88
125
|
}
|
|
89
126
|
catch (error) {
|
|
@@ -95,17 +132,20 @@ export class SemanticAnalyzerService {
|
|
|
95
132
|
*/
|
|
96
133
|
async indexCode(file, content) {
|
|
97
134
|
try {
|
|
98
|
-
// Generate embedding for the code
|
|
99
|
-
const embedding = await this.getEmbedding(content);
|
|
100
135
|
// Extract code metadata
|
|
101
136
|
const metadata = this.extractCodeMetadata(file, content);
|
|
102
|
-
//
|
|
103
|
-
|
|
104
|
-
await this.
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
137
|
+
// #1224: store a vector only when a real embedding model produced one;
|
|
138
|
+
// without it the file is still searchable by text.
|
|
139
|
+
const embedded = await this.tryEmbed(content);
|
|
140
|
+
if (embedded.vector) {
|
|
141
|
+
const key = `${this.vectorKeyPrefix()}${this.fileToKey(file)}`;
|
|
142
|
+
await this.memory.storeVector(key, embedded.vector, {
|
|
143
|
+
file,
|
|
144
|
+
...metadata,
|
|
145
|
+
embeddingModel: this.embeddingModelId(),
|
|
146
|
+
indexedAt: new Date().toISOString(),
|
|
147
|
+
});
|
|
148
|
+
}
|
|
109
149
|
// Store content for retrieval.
|
|
110
150
|
// The key is already fully namespace-qualified, so do NOT also pass a
|
|
111
151
|
// {namespace} store option: every read path (semanticSearch/findSimilar/
|
|
@@ -126,13 +166,13 @@ export class SemanticAnalyzerService {
|
|
|
126
166
|
async findSimilar(code, limit = 10) {
|
|
127
167
|
try {
|
|
128
168
|
const embedding = await this.getEmbedding(code);
|
|
129
|
-
const vectorResults = await this.memory.vectorSearch(embedding, limit);
|
|
169
|
+
const vectorResults = await this.memory.vectorSearch(embedding, limit, this.vectorKeyPrefix());
|
|
130
170
|
const results = [];
|
|
131
171
|
for (const vr of vectorResults) {
|
|
132
|
-
if (vr.score < this.config.
|
|
172
|
+
if (vr.score < this.config.minVectorScore)
|
|
133
173
|
continue;
|
|
134
174
|
const metadata = vr.metadata;
|
|
135
|
-
if (!metadata?.file)
|
|
175
|
+
if (!metadata?.file || !this.isCurrentModelVector(metadata))
|
|
136
176
|
continue;
|
|
137
177
|
const contentKey = `${this.config.namespace}:content:${this.fileToKey(metadata.file)}`;
|
|
138
178
|
const stored = await this.memory.get(contentKey);
|
|
@@ -190,8 +230,9 @@ export class SemanticAnalyzerService {
|
|
|
190
230
|
}
|
|
191
231
|
}
|
|
192
232
|
/**
|
|
193
|
-
* Get embedding vector for code
|
|
194
|
-
* Uses Nomic embeddings via Ollama
|
|
233
|
+
* Get embedding vector for code.
|
|
234
|
+
* Uses Nomic embeddings via Ollama (or the injected provider). Throws when
|
|
235
|
+
* neither is available: no pseudo-embedding is substituted (#1224, ADR-097).
|
|
195
236
|
*/
|
|
196
237
|
async getEmbedding(code) {
|
|
197
238
|
// Check cache
|
|
@@ -201,15 +242,10 @@ export class SemanticAnalyzerService {
|
|
|
201
242
|
}
|
|
202
243
|
// Initialize embedder lazily
|
|
203
244
|
await this.initializeEmbedder();
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
if (this.embedder) {
|
|
207
|
-
embedding = await this.embedder.embed(code);
|
|
208
|
-
}
|
|
209
|
-
else {
|
|
210
|
-
// Fallback to pseudo-embedding when Ollama is not available
|
|
211
|
-
embedding = this.generateCodeEmbedding(code);
|
|
245
|
+
if (!this.embedder) {
|
|
246
|
+
throw new Error(`Code embeddings unavailable: ${this.embedderUnavailableReason ?? 'no embedding model'}`);
|
|
212
247
|
}
|
|
248
|
+
const embedding = await this.embedder.embed(code);
|
|
213
249
|
// Cache result
|
|
214
250
|
if (this.config.enableCaching) {
|
|
215
251
|
this.cacheEmbedding(cacheKey, embedding);
|
|
@@ -222,22 +258,67 @@ export class SemanticAnalyzerService {
|
|
|
222
258
|
isUsingNomicEmbeddings() {
|
|
223
259
|
return this.embedder !== null && this.embedder instanceof NomicEmbedder;
|
|
224
260
|
}
|
|
261
|
+
/** #1224: embed `text`, or say why no real embedding is available. */
|
|
262
|
+
async tryEmbed(text) {
|
|
263
|
+
await this.initializeEmbedder();
|
|
264
|
+
if (!this.embedder) {
|
|
265
|
+
return { reason: this.embedderUnavailableReason ?? 'no embedding model available' };
|
|
266
|
+
}
|
|
267
|
+
try {
|
|
268
|
+
return { vector: await this.getEmbedding(text) };
|
|
269
|
+
}
|
|
270
|
+
catch (error) {
|
|
271
|
+
return { reason: `the embedding model failed: ${toError(error).message}` };
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
/** Identifies the model behind stored vectors, so vectors from another model are not compared. */
|
|
275
|
+
embeddingModelId() {
|
|
276
|
+
return this.embedder instanceof NomicEmbedder ? EMBEDDING_CONFIG.MODEL : 'injected-provider';
|
|
277
|
+
}
|
|
278
|
+
isCurrentModelVector(metadata) {
|
|
279
|
+
return metadata.embeddingModel === this.embeddingModelId();
|
|
280
|
+
}
|
|
281
|
+
vectorKeyPrefix() {
|
|
282
|
+
return `${this.config.namespace}:code:`;
|
|
283
|
+
}
|
|
284
|
+
contentKeyPattern() {
|
|
285
|
+
return `${this.config.namespace}:content:*`;
|
|
286
|
+
}
|
|
225
287
|
// ============================================================================
|
|
226
288
|
// Private Search Methods
|
|
227
289
|
// ============================================================================
|
|
290
|
+
/**
|
|
291
|
+
* #1224: vector search when an embedding model is available. Otherwise (or
|
|
292
|
+
* when no indexed file has a vector from that model) it matches query words
|
|
293
|
+
* against the indexed text and says so through `lexicalOnlyReason`; no
|
|
294
|
+
* similarity is invented for those hits.
|
|
295
|
+
*/
|
|
228
296
|
async semanticSearch(query, limit, scope, filters) {
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
297
|
+
const embedded = await this.tryEmbed(query);
|
|
298
|
+
if (!embedded.vector) {
|
|
299
|
+
return {
|
|
300
|
+
results: await this.lexicalSearch(query, limit, scope, filters),
|
|
301
|
+
lexicalOnlyReason: embedded.reason,
|
|
302
|
+
};
|
|
303
|
+
}
|
|
304
|
+
// Only this namespace's vectors, from the model that embedded the query.
|
|
305
|
+
const vectorResults = (await this.memory.vectorSearch(embedded.vector, limit * 2, this.vectorKeyPrefix()))
|
|
306
|
+
.filter((vr) => {
|
|
307
|
+
const metadata = vr.metadata;
|
|
308
|
+
return !!metadata?.file && this.isCurrentModelVector(metadata);
|
|
309
|
+
});
|
|
310
|
+
if (vectorResults.length === 0) {
|
|
311
|
+
return {
|
|
312
|
+
results: await this.lexicalSearch(query, limit, scope, filters),
|
|
313
|
+
lexicalOnlyReason: `no indexed file has an embedding from ${this.embeddingModelId()}; re-index to enable vector search`,
|
|
314
|
+
};
|
|
315
|
+
}
|
|
233
316
|
// Convert to search results with filtering
|
|
234
317
|
const results = [];
|
|
235
318
|
for (const vr of vectorResults) {
|
|
236
|
-
if (vr.score < this.config.
|
|
319
|
+
if (vr.score < this.config.minVectorScore)
|
|
237
320
|
continue;
|
|
238
321
|
const metadata = vr.metadata;
|
|
239
|
-
if (!metadata?.file)
|
|
240
|
-
continue;
|
|
241
322
|
// Apply scope filter
|
|
242
323
|
if (scope && scope.length > 0) {
|
|
243
324
|
const matchesScope = scope.some((s) => metadata.file.includes(s));
|
|
@@ -258,17 +339,23 @@ export class SemanticAnalyzerService {
|
|
|
258
339
|
score: vr.score,
|
|
259
340
|
highlights: this.findSemanticHighlights(stored.content, query),
|
|
260
341
|
metadata: stored.metadata,
|
|
342
|
+
matchType: 'vector',
|
|
261
343
|
});
|
|
262
344
|
if (results.length >= limit)
|
|
263
345
|
break;
|
|
264
346
|
}
|
|
265
347
|
}
|
|
266
|
-
return results;
|
|
348
|
+
return { results };
|
|
349
|
+
}
|
|
350
|
+
/** Word-overlap matching for a semantic query when no vectors can be used. */
|
|
351
|
+
async lexicalSearch(query, limit, scope, filters) {
|
|
352
|
+
const hits = await this.fuzzySearch(query, limit, scope, filters);
|
|
353
|
+
return hits.map((hit) => ({ ...hit, matchType: 'lexical' }));
|
|
267
354
|
}
|
|
268
355
|
async exactSearch(query, limit, scope, filters) {
|
|
269
356
|
const results = [];
|
|
270
|
-
|
|
271
|
-
const keys = await this.memory.search(
|
|
357
|
+
// #1224: scan every indexed file; a cap here hid matches in later files.
|
|
358
|
+
const keys = await this.memory.search(this.contentKeyPattern(), MAX_INDEXED_FILES_SCANNED);
|
|
272
359
|
for (const key of keys) {
|
|
273
360
|
const stored = await this.memory.get(key);
|
|
274
361
|
if (!stored)
|
|
@@ -303,8 +390,7 @@ export class SemanticAnalyzerService {
|
|
|
303
390
|
}
|
|
304
391
|
async fuzzySearch(query, limit, scope, filters) {
|
|
305
392
|
const results = [];
|
|
306
|
-
const
|
|
307
|
-
const keys = await this.memory.search(pattern, limit * 5);
|
|
393
|
+
const keys = await this.memory.search(this.contentKeyPattern(), MAX_INDEXED_FILES_SCANNED);
|
|
308
394
|
const queryTokens = this.tokenize(query.toLowerCase());
|
|
309
395
|
for (const key of keys) {
|
|
310
396
|
const stored = await this.memory.get(key);
|
|
@@ -324,7 +410,7 @@ export class SemanticAnalyzerService {
|
|
|
324
410
|
const contentTokens = this.tokenize(stored.content.toLowerCase());
|
|
325
411
|
const score = this.calculateFuzzyScore(queryTokens, contentTokens);
|
|
326
412
|
if (score >= this.config.minScore) {
|
|
327
|
-
const matchedTokens = queryTokens.filter((t) => contentTokens.some((ct) =>
|
|
413
|
+
const matchedTokens = queryTokens.filter((t) => contentTokens.some((ct) => this.tokensMatch(t, ct)));
|
|
328
414
|
results.push({
|
|
329
415
|
file: stored.file,
|
|
330
416
|
snippet: this.extractSnippet(stored.content, 200),
|
|
@@ -500,38 +586,6 @@ export class SemanticAnalyzerService {
|
|
|
500
586
|
// ============================================================================
|
|
501
587
|
// Private Helper Methods
|
|
502
588
|
// ============================================================================
|
|
503
|
-
generateCodeEmbedding(code) {
|
|
504
|
-
// Fallback: Generate a pseudo-embedding based on code features
|
|
505
|
-
// Used when Ollama/Nomic is not available
|
|
506
|
-
const embedding = new Array(this.config.embeddingDimension).fill(0);
|
|
507
|
-
// Extract tokens and features
|
|
508
|
-
const tokens = this.tokenize(code);
|
|
509
|
-
const concepts = this.extractConcepts(code);
|
|
510
|
-
// Combine token-based and concept-based features
|
|
511
|
-
for (let i = 0; i < tokens.length; i++) {
|
|
512
|
-
const token = tokens[i];
|
|
513
|
-
for (let j = 0; j < token.length && j < embedding.length; j++) {
|
|
514
|
-
embedding[(i + j) % embedding.length] += token.charCodeAt(j) / 1000;
|
|
515
|
-
}
|
|
516
|
-
}
|
|
517
|
-
// Add concept signals
|
|
518
|
-
const conceptIndex = new Map([
|
|
519
|
-
['object-oriented', 0],
|
|
520
|
-
['asynchronous', 1],
|
|
521
|
-
['functional', 2],
|
|
522
|
-
['type-safe', 3],
|
|
523
|
-
['modular', 4],
|
|
524
|
-
]);
|
|
525
|
-
for (const concept of concepts) {
|
|
526
|
-
const idx = conceptIndex.get(concept);
|
|
527
|
-
if (idx !== undefined) {
|
|
528
|
-
embedding[idx] += 0.5;
|
|
529
|
-
}
|
|
530
|
-
}
|
|
531
|
-
// Normalize
|
|
532
|
-
const magnitude = Math.sqrt(embedding.reduce((sum, v) => sum + v * v, 0)) || 1;
|
|
533
|
-
return embedding.map((v) => v / magnitude);
|
|
534
|
-
}
|
|
535
589
|
extractCodeMetadata(file, content) {
|
|
536
590
|
return {
|
|
537
591
|
language: this.detectLanguage(file),
|
|
@@ -564,12 +618,21 @@ export class SemanticAnalyzerService {
|
|
|
564
618
|
return 0;
|
|
565
619
|
let matches = 0;
|
|
566
620
|
for (const qt of queryTokens) {
|
|
567
|
-
if (contentTokens.some((ct) =>
|
|
621
|
+
if (contentTokens.some((ct) => this.tokensMatch(qt, ct))) {
|
|
568
622
|
matches++;
|
|
569
623
|
}
|
|
570
624
|
}
|
|
571
625
|
return matches / queryTokens.length;
|
|
572
626
|
}
|
|
627
|
+
/**
|
|
628
|
+
* A content token matches a query token it contains, or that contains it.
|
|
629
|
+
* #1224: the second direction needs a content token of 3+ characters, so a
|
|
630
|
+
* one-letter variable such as `i` does not match the query "login".
|
|
631
|
+
*/
|
|
632
|
+
tokensMatch(queryToken, contentToken) {
|
|
633
|
+
return contentToken.includes(queryToken) ||
|
|
634
|
+
(contentToken.length >= 3 && queryToken.includes(contentToken));
|
|
635
|
+
}
|
|
573
636
|
matchesFilters(metadata, filters) {
|
|
574
637
|
for (const filter of filters) {
|
|
575
638
|
const value = metadata[filter.field];
|
|
@@ -14,6 +14,32 @@ import type { CoverageSummary, FileCoverage } from './interfaces';
|
|
|
14
14
|
* (or the cwd when none is known), so one file never has two records.
|
|
15
15
|
*/
|
|
16
16
|
export declare function fileCoverageKey(filePath: string, projectRoot?: string): string;
|
|
17
|
+
/** Why a report entry is not a measurement of a project file (#1030, #1219). */
|
|
18
|
+
export type ExcludedCoverageReason = 'outside-project' | 'windows-path' | 'duplicate-spelling';
|
|
19
|
+
/** A report entry left out of per-file records and of the report's summary. */
|
|
20
|
+
export interface ExcludedCoverageEntry {
|
|
21
|
+
/** The path as the report wrote it. */
|
|
22
|
+
path: string;
|
|
23
|
+
reason: ExcludedCoverageReason;
|
|
24
|
+
/** For `duplicate-spelling`: the project file both spellings name. */
|
|
25
|
+
file?: string;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* #1030, #1219: sort the paths of ONE report into project files (with their
|
|
29
|
+
* per-file record key, keyed by the path as the report wrote it) and entries
|
|
30
|
+
* that are not a measurement of a project file: a path that resolves outside
|
|
31
|
+
* the project root (lcov `SF:../../outside.ts`), a Windows absolute path read
|
|
32
|
+
* on POSIX (it would resolve to a junk key), or a file the report lists under
|
|
33
|
+
* two spellings (`./src/a.ts` and `src/a.ts`), so which entry is right is
|
|
34
|
+
* unknown. A path under the root's realpath (macOS `/private/var` for
|
|
35
|
+
* `/var`) is inside.
|
|
36
|
+
*/
|
|
37
|
+
export declare function classifyProjectCoveragePaths(paths: readonly string[], projectRoot?: string): {
|
|
38
|
+
keys: Map<string, string>;
|
|
39
|
+
excluded: ExcludedCoverageEntry[];
|
|
40
|
+
};
|
|
41
|
+
/** #1030: the per-file record key of each project file in ONE report (see `classifyProjectCoveragePaths`). */
|
|
42
|
+
export declare function projectFileCoverageKeys(paths: readonly string[], projectRoot?: string): Map<string, string>;
|
|
17
43
|
/** Read the canonical key first, then a measured legacy relative key if present. */
|
|
18
44
|
export declare function fileCoverageLookupKeys(filePath: string, projectRoot?: string): string[];
|
|
19
45
|
export interface CollectedMetrics {
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
* summary figure is 0 by construction, and must be reported AND persisted as
|
|
7
7
|
* null — never as 0% (a fake low figure) nor as istanbul's 0/0 = 100%.
|
|
8
8
|
*/
|
|
9
|
+
import * as fs from 'fs';
|
|
9
10
|
import * as path from 'path';
|
|
10
11
|
import { findProjectRoot } from '../../kernel/project-root.js';
|
|
11
12
|
/**
|
|
@@ -17,6 +18,59 @@ import { findProjectRoot } from '../../kernel/project-root.js';
|
|
|
17
18
|
export function fileCoverageKey(filePath, projectRoot) {
|
|
18
19
|
return path.isAbsolute(filePath) ? path.normalize(filePath) : path.resolve(projectRoot ?? findProjectRoot(), filePath);
|
|
19
20
|
}
|
|
21
|
+
function isInside(root, key) {
|
|
22
|
+
const relative = path.relative(root, key);
|
|
23
|
+
return relative !== '' && relative !== '..' && !relative.startsWith(`..${path.sep}`) && !path.isAbsolute(relative);
|
|
24
|
+
}
|
|
25
|
+
function realRoot(root) {
|
|
26
|
+
try {
|
|
27
|
+
return fs.realpathSync(root);
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
return root;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* #1030, #1219: sort the paths of ONE report into project files (with their
|
|
35
|
+
* per-file record key, keyed by the path as the report wrote it) and entries
|
|
36
|
+
* that are not a measurement of a project file: a path that resolves outside
|
|
37
|
+
* the project root (lcov `SF:../../outside.ts`), a Windows absolute path read
|
|
38
|
+
* on POSIX (it would resolve to a junk key), or a file the report lists under
|
|
39
|
+
* two spellings (`./src/a.ts` and `src/a.ts`), so which entry is right is
|
|
40
|
+
* unknown. A path under the root's realpath (macOS `/private/var` for
|
|
41
|
+
* `/var`) is inside.
|
|
42
|
+
*/
|
|
43
|
+
export function classifyProjectCoveragePaths(paths, projectRoot) {
|
|
44
|
+
const root = path.resolve(projectRoot ?? findProjectRoot());
|
|
45
|
+
const canonicalRoot = realRoot(root);
|
|
46
|
+
const keys = new Map();
|
|
47
|
+
const excluded = [];
|
|
48
|
+
const spellings = new Map();
|
|
49
|
+
for (const filePath of paths) {
|
|
50
|
+
if (!path.isAbsolute(filePath) && path.win32.isAbsolute(filePath)) {
|
|
51
|
+
excluded.push({ path: filePath, reason: 'windows-path' });
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
const key = fileCoverageKey(filePath, root);
|
|
55
|
+
if (!isInside(root, key) && !isInside(canonicalRoot, key)) {
|
|
56
|
+
excluded.push({ path: filePath, reason: 'outside-project' });
|
|
57
|
+
continue;
|
|
58
|
+
}
|
|
59
|
+
keys.set(filePath, key);
|
|
60
|
+
spellings.set(key, (spellings.get(key) ?? 0) + 1);
|
|
61
|
+
}
|
|
62
|
+
for (const [filePath, key] of keys) {
|
|
63
|
+
if ((spellings.get(key) ?? 0) > 1) {
|
|
64
|
+
keys.delete(filePath);
|
|
65
|
+
excluded.push({ path: filePath, reason: 'duplicate-spelling', file: key });
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return { keys, excluded };
|
|
69
|
+
}
|
|
70
|
+
/** #1030: the per-file record key of each project file in ONE report (see `classifyProjectCoveragePaths`). */
|
|
71
|
+
export function projectFileCoverageKeys(paths, projectRoot) {
|
|
72
|
+
return classifyProjectCoveragePaths(paths, projectRoot).keys;
|
|
73
|
+
}
|
|
20
74
|
/** Read the canonical key first, then a measured legacy relative key if present. */
|
|
21
75
|
export function fileCoverageLookupKeys(filePath, projectRoot) {
|
|
22
76
|
const canonical = `coverage:file:${fileCoverageKey(filePath, projectRoot)}`;
|
|
@@ -11,7 +11,7 @@ import { safeJsonParse } from '../../../shared/safe-json.js';
|
|
|
11
11
|
import { writeQualityEvidence, writeTestRunEvidence } from '../../quality-assessment/quality-evidence.js';
|
|
12
12
|
import { measuredCoverageSummary } from '../../quality-assessment/coverage-report-event.js';
|
|
13
13
|
import { getClaudeModelForTier } from '../../../shared/llm/model-registry.js';
|
|
14
|
-
import { collectedMetrics, collectedSummary,
|
|
14
|
+
import { collectedMetrics, collectedSummary, projectFileCoverageKeys } from '../collected-metrics.js';
|
|
15
15
|
/**
|
|
16
16
|
* Whether an analyze request carries instrumented (measured) coverage (#1008).
|
|
17
17
|
* Fail-closed: an explicit `request.measured` wins; otherwise only data a
|
|
@@ -510,7 +510,11 @@ Provide thoughtful, specific analysis based on the coverage data. Do not include
|
|
|
510
510
|
* (The vector index via storeVector is kept for similarity search.)
|
|
511
511
|
*/
|
|
512
512
|
async storeFileCoverageKV(files, projectRoot, runStatus) {
|
|
513
|
+
const keys = projectFileCoverageKeys(files.map(file => file.path), projectRoot);
|
|
513
514
|
for (const file of files) {
|
|
515
|
+
const key = keys.get(file.path);
|
|
516
|
+
if (!key)
|
|
517
|
+
continue;
|
|
514
518
|
try {
|
|
515
519
|
// #1014: a metric with no data is null (not collected), never 0%.
|
|
516
520
|
const pct = (m) => m.total > 0 ? Math.round((m.covered / m.total) * 10000) / 100 : null;
|
|
@@ -518,12 +522,14 @@ Provide thoughtful, specific analysis based on the coverage data. Do not include
|
|
|
518
522
|
continue;
|
|
519
523
|
// #1014: stamped, so readers can tell it from legacy unstamped
|
|
520
524
|
// estimate records written by <= 3.15.4.
|
|
521
|
-
await this.memory.set(`coverage:file:${
|
|
525
|
+
await this.memory.set(`coverage:file:${key}`, {
|
|
522
526
|
line: pct(file.lines),
|
|
523
527
|
branch: pct(file.branches),
|
|
524
528
|
function: pct(file.functions),
|
|
525
529
|
statement: pct(file.statements),
|
|
526
530
|
measured: true,
|
|
531
|
+
// #1219: the counts behind `line`, so several files can be line-weighted.
|
|
532
|
+
lines: { covered: file.lines.covered, total: file.lines.total },
|
|
527
533
|
...(runStatus ? { runStatus } : {}),
|
|
528
534
|
}, { persist: true });
|
|
529
535
|
}
|
|
@@ -533,11 +539,15 @@ Provide thoughtful, specific analysis based on the coverage data. Do not include
|
|
|
533
539
|
}
|
|
534
540
|
}
|
|
535
541
|
async indexFileCoverageVectors(files, projectRoot) {
|
|
542
|
+
const keys = projectFileCoverageKeys(files.map(file => file.path), projectRoot);
|
|
536
543
|
for (const file of files) {
|
|
544
|
+
const key = keys.get(file.path);
|
|
545
|
+
if (!key)
|
|
546
|
+
continue;
|
|
537
547
|
try {
|
|
538
548
|
// Create a vector representation of the file coverage
|
|
539
549
|
const embedding = this.createCoverageEmbedding(file);
|
|
540
|
-
await this.memory.storeVector(`coverage:file:${
|
|
550
|
+
await this.memory.storeVector(`coverage:file:${key}`, embedding, {
|
|
541
551
|
path: file.path,
|
|
542
552
|
lineCoverage: file.lines.covered / (file.lines.total || 1),
|
|
543
553
|
branchCoverage: file.branches.covered / (file.branches.total || 1),
|
|
@@ -129,6 +129,8 @@ export interface CoverageReport {
|
|
|
129
129
|
files: Map<string, FileCoverageData>;
|
|
130
130
|
/** Summary statistics */
|
|
131
131
|
summary: CoverageSummary;
|
|
132
|
+
/** Parts of the report that could not be attributed and are not in `files` (#1232). */
|
|
133
|
+
warnings?: string[];
|
|
132
134
|
}
|
|
133
135
|
/**
|
|
134
136
|
* Summary statistics for entire coverage report
|
|
@@ -461,12 +461,20 @@ export function parseDotcoverContent(content, projectRoot) {
|
|
|
461
461
|
// Parse <Statement> elements to build per-file coverage
|
|
462
462
|
const stmtPattern = /<Statement\s+FileIndex="(\d+)"\s+Line="(\d+)"\s+Column="\d+"\s+EndLine="\d+"\s+EndColumn="\d+"\s+Covered="(\w+)"\s*\/>/g;
|
|
463
463
|
const fileData = new Map();
|
|
464
|
+
// #1232: statements whose FileIndex is not in the file table, by index; never named after a made-up file.
|
|
465
|
+
const unknownIndices = new Map();
|
|
466
|
+
let statementCount = 0;
|
|
464
467
|
let sm;
|
|
465
468
|
while ((sm = stmtPattern.exec(content)) !== null) {
|
|
469
|
+
statementCount++;
|
|
466
470
|
const fileIdx = sm[1];
|
|
467
471
|
const lineNum = parseInt(sm[2], 10);
|
|
468
472
|
const isCovered = sm[3] === 'True';
|
|
469
|
-
const filePath = fileIndex.get(fileIdx)
|
|
473
|
+
const filePath = fileIndex.get(fileIdx);
|
|
474
|
+
if (!filePath) {
|
|
475
|
+
unknownIndices.set(fileIdx, (unknownIndices.get(fileIdx) ?? 0) + 1);
|
|
476
|
+
continue;
|
|
477
|
+
}
|
|
470
478
|
if (!fileData.has(filePath)) {
|
|
471
479
|
fileData.set(filePath, { lineDetails: new Map(), total: 0, covered: 0 });
|
|
472
480
|
}
|
|
@@ -476,14 +484,21 @@ export function parseDotcoverContent(content, projectRoot) {
|
|
|
476
484
|
if (isCovered)
|
|
477
485
|
data.covered++;
|
|
478
486
|
}
|
|
487
|
+
const warnings = [];
|
|
488
|
+
if (unknownIndices.size > 0) {
|
|
489
|
+
const skipped = [...unknownIndices.values()].reduce((sum, n) => sum + n, 0);
|
|
490
|
+
warnings.push(`dotCover report references FileIndex ${[...unknownIndices.keys()].join(', ')} missing from its file table; ` +
|
|
491
|
+
`${skipped} statement(s) skipped and their coverage is not reported`);
|
|
492
|
+
}
|
|
479
493
|
// If no Statement elements found, parse from CoveredStatements/TotalStatements attributes
|
|
480
|
-
if (
|
|
494
|
+
if (statementCount === 0) {
|
|
481
495
|
const rootPattern = /CoveredStatements="(\d+)"\s+TotalStatements="(\d+)"/;
|
|
482
496
|
const rootMatch = rootPattern.exec(content);
|
|
483
497
|
if (rootMatch) {
|
|
484
498
|
const covered = parseInt(rootMatch[1], 10);
|
|
485
499
|
const total = parseInt(rootMatch[2], 10);
|
|
486
500
|
const filePath = path.join(projectRoot, 'aggregate');
|
|
501
|
+
warnings.push("dotCover report has no per-file statements; report totals are listed under 'aggregate', which is not a project file");
|
|
487
502
|
files.set(filePath, {
|
|
488
503
|
path: filePath,
|
|
489
504
|
relativePath: 'aggregate',
|
|
@@ -526,6 +541,7 @@ export function parseDotcoverContent(content, projectRoot) {
|
|
|
526
541
|
language: 'csharp',
|
|
527
542
|
files,
|
|
528
543
|
summary: calculateSummary(files),
|
|
544
|
+
...(warnings.length > 0 ? { warnings } : {}),
|
|
529
545
|
};
|
|
530
546
|
}
|
|
531
547
|
// ============================================================================
|
|
@@ -16,7 +16,7 @@ import { TypeScriptParser } from '../../../shared/parsers/index.js';
|
|
|
16
16
|
import { toError } from '../../../shared/error-utils.js';
|
|
17
17
|
import { safeJsonParse } from '../../../shared/safe-json.js';
|
|
18
18
|
import { getClaudeModelForTier } from '../../../shared/llm/model-registry.js';
|
|
19
|
-
import {
|
|
19
|
+
import { measuredFileCoverage } from '../../quality-assessment/coverage-report-event.js';
|
|
20
20
|
import { fileCoverageLookupKeys } from '../../coverage-analysis/collected-metrics.js';
|
|
21
21
|
// LLMDefectAnalysis is imported from ../interfaces
|
|
22
22
|
const DEFAULT_CONFIG = {
|
|
@@ -616,11 +616,8 @@ Be specific and actionable. Focus on concrete issues, not generic advice.`,
|
|
|
616
616
|
return 1 - fileCoverage.line / 100;
|
|
617
617
|
}
|
|
618
618
|
}
|
|
619
|
-
//
|
|
620
|
-
|
|
621
|
-
if (summary) {
|
|
622
|
-
return 1 - summary.line / 100;
|
|
623
|
-
}
|
|
619
|
+
// #1219: no fallback to the project-wide summary — it is not this
|
|
620
|
+
// file's coverage. A file with no record of its own gets the prior below.
|
|
624
621
|
}
|
|
625
622
|
catch {
|
|
626
623
|
// Non-critical lookup
|
|
@@ -78,6 +78,11 @@ export class CoherenceGateController {
|
|
|
78
78
|
if (criticalFailure) {
|
|
79
79
|
reasons.push(criticalFailure);
|
|
80
80
|
}
|
|
81
|
+
// Check 7 (#1020): an unmeasured input is never read as passing, so no
|
|
82
|
+
// decision can allow. Measured failures above stay the primary reason.
|
|
83
|
+
if ((lambda.unmeasured?.length ?? 0) > 0) {
|
|
84
|
+
reasons.push('insufficientEvidence');
|
|
85
|
+
}
|
|
81
86
|
// Determine tier based on reasons
|
|
82
87
|
return this.determineDecision(lambda, reasons);
|
|
83
88
|
}
|
|
@@ -92,6 +97,9 @@ export class CoherenceGateController {
|
|
|
92
97
|
*/
|
|
93
98
|
canDeploy(lambda) {
|
|
94
99
|
const decision = this.evaluate(lambda);
|
|
100
|
+
// #1020: allowDeployWhenUnstable never covers missing evidence.
|
|
101
|
+
if ((lambda.unmeasured?.length ?? 0) > 0)
|
|
102
|
+
return false;
|
|
95
103
|
return decision.decision === 'allow' ||
|
|
96
104
|
(decision.decision === 'reduceScope' && this.config.policy.allowDeployWhenUnstable);
|
|
97
105
|
}
|
|
@@ -144,16 +152,16 @@ export class CoherenceGateController {
|
|
|
144
152
|
* Check critical dimensions for failures
|
|
145
153
|
*/
|
|
146
154
|
checkCriticalDimensions(dimensions) {
|
|
147
|
-
// Security is critical
|
|
148
|
-
if (dimensions.security < 0.5) {
|
|
155
|
+
// Security is critical (an absent dimension is unmeasured, see #1020)
|
|
156
|
+
if (dimensions.security !== undefined && dimensions.security < 0.5) {
|
|
149
157
|
return 'securityCritical';
|
|
150
158
|
}
|
|
151
159
|
// Test pass rate is critical
|
|
152
|
-
if (dimensions.passRate < 0.8) {
|
|
160
|
+
if (dimensions.passRate !== undefined && dimensions.passRate < 0.8) {
|
|
153
161
|
return 'testFailureSpike';
|
|
154
162
|
}
|
|
155
163
|
// Coverage drop is concerning (if previously high)
|
|
156
|
-
if (dimensions.coverage < 0.5) {
|
|
164
|
+
if (dimensions.coverage !== undefined && dimensions.coverage < 0.5) {
|
|
157
165
|
return 'coverageDrop';
|
|
158
166
|
}
|
|
159
167
|
return null;
|
|
@@ -328,6 +336,9 @@ export class CoherenceGateController {
|
|
|
328
336
|
const additionalStr = additionalReasons.map(r => this.reasonToString(r)).join(', ');
|
|
329
337
|
parts.push(`Additional concerns: ${additionalStr}.`);
|
|
330
338
|
}
|
|
339
|
+
if (lambda.unmeasured && lambda.unmeasured.length > 0) {
|
|
340
|
+
parts.push(`Not measured: ${lambda.unmeasured.join(', ')}.`);
|
|
341
|
+
}
|
|
331
342
|
// Dimension summary
|
|
332
343
|
const summary = this.getDimensionSummary(lambda.dimensions);
|
|
333
344
|
parts.push(`Quality dimensions: ${summary.healthy} healthy, ${summary.warning} warning, ${summary.critical} critical.`);
|
|
@@ -363,6 +374,7 @@ export class CoherenceGateController {
|
|
|
363
374
|
'securityCritical': 'critical security vulnerability detected',
|
|
364
375
|
'coverageDrop': 'significant test coverage decrease',
|
|
365
376
|
'testFailureSpike': 'sudden increase in test failures',
|
|
377
|
+
'insufficientEvidence': 'one or more quality inputs were not measured',
|
|
366
378
|
};
|
|
367
379
|
return reasonStrings[reason] || reason;
|
|
368
380
|
}
|