agentic-qe 3.15.16 → 3.15.18
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 +107 -10
- package/.claude/skills/agentic-quality-engineering/SKILL.md +67 -44
- package/.claude/skills/brutal-honesty-review/SKILL.md +12 -7
- package/.claude/skills/brutal-honesty-review/evals/brutal-honesty-review.yaml +120 -0
- package/.claude/skills/brutal-honesty-review/schemas/output.json +9 -3
- package/.claude/skills/code-review-quality/SKILL.md +2 -2
- package/.claude/skills/holistic-testing-pact/SKILL.md +11 -11
- package/.claude/skills/sherlock-review/SKILL.md +4 -2
- package/.claude/skills/sherlock-review/evals/sherlock-review.yaml +124 -0
- package/.claude/skills/skills-manifest.json +1 -1
- package/.claude/skills/technical-writing/SKILL.md +12 -6
- package/.claude/skills/technical-writing/evals/technical-writing.yaml +96 -0
- package/.opencode/skills/qe-agentic-quality-engineering.yaml +2 -2
- package/.opencode/skills/qe-holistic-testing-pact.yaml +2 -2
- package/CHANGELOG.md +201 -0
- package/assets/skills/agentic-quality-engineering/SKILL.md +67 -44
- package/assets/skills/brutal-honesty-review/SKILL.md +12 -8
- package/assets/skills/brutal-honesty-review/evals/brutal-honesty-review.yaml +120 -0
- package/assets/skills/brutal-honesty-review/schemas/output.json +9 -3
- package/assets/skills/code-review-quality/SKILL.md +2 -2
- package/assets/skills/holistic-testing-pact/SKILL.md +11 -11
- package/assets/skills/sherlock-review/SKILL.md +4 -3
- package/assets/skills/sherlock-review/evals/sherlock-review.yaml +124 -0
- package/assets/skills/skills-manifest.json +1 -1
- package/assets/skills/technical-writing/SKILL.md +12 -6
- package/assets/skills/technical-writing/evals/technical-writing.yaml +96 -0
- package/dist/cli/brain-commands.d.ts +5 -0
- package/dist/cli/brain-commands.js +4 -0
- package/dist/cli/bundle.js +6 -6
- package/dist/cli/chunks/adapter-WRSDXLOT.js +2 -0
- package/dist/cli/chunks/{agent-booster-wasm-45NWEKVS.js → agent-booster-wasm-UFNJNF3M.js} +2 -2
- package/dist/cli/chunks/{agent-handler-LVHMYFEF.js → agent-handler-EAYVRJXN.js} +2 -2
- package/dist/cli/chunks/{agent-memory-branch-YDWOJFEQ.js → agent-memory-branch-M65C6WAQ.js} +2 -2
- package/dist/cli/chunks/aqe-learning-engine-O6NJBCCM.js +2 -0
- package/dist/cli/chunks/{arena-ELDZH3CZ.js → arena-2GDICP6R.js} +4 -4
- package/dist/cli/chunks/{arena-CZKHXDDS.js → arena-CG3X67OE.js} +2 -2
- package/dist/cli/chunks/{audit-5MT4T47Z.js → audit-F4FSPJPL.js} +3 -3
- package/dist/cli/chunks/base-J2FXOE77.js +2 -0
- package/dist/cli/chunks/{better-sqlite3-6TGYPC2B.js → better-sqlite3-2MCFXW4J.js} +2 -2
- package/dist/cli/chunks/brain-handler-WGTJNYNB.js +95 -0
- package/dist/cli/chunks/{branch-enumerator-WVILM4SO.js → branch-enumerator-KL7C535H.js} +2 -2
- package/dist/cli/chunks/{browser-RX5ALU3H.js → browser-SJEXDVHS.js} +2 -2
- package/dist/cli/chunks/browser-workflow-LXGER6ZD.js +2 -0
- package/dist/cli/chunks/{chunk-2H4XH6FT.js → chunk-244RKAEP.js} +2 -2
- package/dist/cli/chunks/{chunk-SI6DPU5D.js → chunk-27TUMXPD.js} +1 -1
- package/dist/cli/chunks/{chunk-YNMJEDN5.js → chunk-2MBYDPCP.js} +2 -2
- package/dist/cli/chunks/{chunk-24QHCVX6.js → chunk-2Q6DTBMT.js} +1 -1
- package/dist/cli/chunks/{chunk-XWUWX7BV.js → chunk-355MI7RV.js} +13 -13
- package/dist/cli/chunks/{chunk-NQXXI77K.js → chunk-3LX5OKBD.js} +2 -2
- package/dist/cli/chunks/{chunk-63GMRQ25.js → chunk-3RPDKJGV.js} +1 -1
- package/dist/cli/chunks/chunk-3YMIT73A.js +4 -0
- package/dist/cli/chunks/{chunk-P3EYRILV.js → chunk-43KUVBSU.js} +2 -2
- package/dist/cli/chunks/chunk-477FKXSS.js +2 -0
- package/dist/cli/chunks/{chunk-HGWXF45W.js → chunk-4BIMTRRX.js} +1 -1
- package/dist/cli/chunks/{chunk-SSUAAX3F.js → chunk-4CVNVBX5.js} +2 -2
- package/dist/cli/chunks/{chunk-5V3TI2LG.js → chunk-4HL3SD4A.js} +1 -1
- package/dist/cli/chunks/{chunk-KKU2QGSJ.js → chunk-4PEG4DU2.js} +2 -2
- package/dist/cli/chunks/{chunk-J4ELZNLY.js → chunk-4QSQKFED.js} +2 -2
- package/dist/cli/chunks/chunk-53ZBETYR.js +16 -0
- package/dist/cli/chunks/{chunk-7TE5ONQQ.js → chunk-544KDWL4.js} +1 -1
- package/dist/cli/chunks/chunk-54RCGMLB.js +8 -0
- package/dist/cli/chunks/{chunk-KU2AUFGX.js → chunk-5AGXIZQ5.js} +2 -2
- package/dist/cli/chunks/{chunk-LQLPB2T6.js → chunk-5M24X6W7.js} +2 -2
- package/dist/cli/chunks/{chunk-YU2BDRSD.js → chunk-5O5T4LEU.js} +1 -1
- package/dist/cli/chunks/{chunk-NAEWCFQT.js → chunk-5RFXX4IF.js} +2 -2
- package/dist/cli/chunks/{chunk-MD43XRX5.js → chunk-62MLAQRJ.js} +1 -1
- package/dist/cli/chunks/{chunk-PEQDY4BO.js → chunk-6D6TGL2E.js} +2 -2
- package/dist/cli/chunks/{chunk-IOYG4VFL.js → chunk-6IHZDSDL.js} +2 -2
- package/dist/cli/chunks/{chunk-C5FP5GW3.js → chunk-6P3Y45QL.js} +2 -2
- package/dist/cli/chunks/{chunk-4LQFBY5L.js → chunk-6TEVM3X3.js} +10 -10
- package/dist/cli/chunks/{chunk-YPBSUGMI.js → chunk-7XTUKKRA.js} +1 -1
- package/dist/cli/chunks/chunk-A3GDX6UF.js +2 -0
- package/dist/cli/chunks/{chunk-HLUXXCHF.js → chunk-A5YTKKNA.js} +1 -1
- package/dist/cli/chunks/{chunk-Y4PFUMOU.js → chunk-ADNGZAT2.js} +1 -1
- package/dist/cli/chunks/{chunk-KNSRL6NO.js → chunk-AWQAE3SW.js} +2 -2
- package/dist/cli/chunks/{chunk-BY5OF7OH.js → chunk-AXDBQFR4.js} +2 -2
- package/dist/cli/chunks/{chunk-525CFDUE.js → chunk-AXVD7O3F.js} +2 -2
- package/dist/cli/chunks/{chunk-JHQCRRJI.js → chunk-B52ULNYO.js} +2 -2
- package/dist/cli/chunks/chunk-B6S4FC7M.js +3 -0
- package/dist/cli/chunks/{chunk-AJMJNQMP.js → chunk-BDVFSMOQ.js} +1 -1
- package/dist/cli/chunks/{chunk-DXD6K2ZP.js → chunk-BGXXMX3Y.js} +2 -2
- package/dist/cli/chunks/{chunk-EK7OLYOZ.js → chunk-BKMQQY5T.js} +2 -2
- package/dist/cli/chunks/{chunk-VWPM27GU.js → chunk-BN2FROBQ.js} +2 -2
- package/dist/cli/chunks/{chunk-J7I6PABJ.js → chunk-BO6EQNOC.js} +2 -2
- package/dist/cli/chunks/{chunk-4D4DENG6.js → chunk-BOVAKCDC.js} +2 -2
- package/dist/cli/chunks/{chunk-ZFL436FN.js → chunk-BSXKZDKO.js} +2 -2
- package/dist/cli/chunks/{chunk-J442IZLE.js → chunk-C5QVJ5XQ.js} +1 -1
- package/dist/cli/chunks/{chunk-ZB3LEFYG.js → chunk-CFQLLF3D.js} +2 -2
- package/dist/cli/chunks/{chunk-UHEOGZLX.js → chunk-DUCVLT3F.js} +7 -7
- package/dist/cli/chunks/{chunk-TVGI32MB.js → chunk-E4RMJCGA.js} +3 -3
- package/dist/cli/chunks/{chunk-TIUKLYAI.js → chunk-EONDCWY4.js} +1 -1
- package/dist/cli/chunks/{chunk-ZJH5MU2I.js → chunk-F4AGNKL2.js} +2 -2
- package/dist/cli/chunks/{chunk-N7HL5PHH.js → chunk-F6YD3BOW.js} +1 -1
- package/dist/cli/chunks/{chunk-5VZL4UVN.js → chunk-FQRS7WVA.js} +2 -2
- package/dist/cli/chunks/{chunk-SHKOCGNK.js → chunk-FT24SSDG.js} +2 -2
- package/dist/cli/chunks/chunk-FV4YNSAJ.js +5 -0
- package/dist/cli/chunks/{chunk-KXCLACFG.js → chunk-FVDM3X42.js} +2 -2
- package/dist/cli/chunks/{chunk-32BPDLRZ.js → chunk-FVH7TXWU.js} +2 -2
- package/dist/cli/chunks/{chunk-72XSEQMW.js → chunk-FWR5QY37.js} +2 -2
- package/dist/cli/chunks/chunk-FYINK2B7.js +6 -0
- package/dist/cli/chunks/{chunk-5JZRZI4S.js → chunk-GGISVPOZ.js} +2 -2
- package/dist/cli/chunks/{chunk-5LAVKGLH.js → chunk-GPIJIZJQ.js} +2 -2
- package/dist/cli/chunks/{chunk-5QO3R3TU.js → chunk-GXEVOT5F.js} +2 -2
- package/dist/cli/chunks/{chunk-IHRXZZQM.js → chunk-GZ4VB5RI.js} +1 -1
- package/dist/cli/chunks/chunk-HBDSCYSK.js +2 -0
- package/dist/cli/chunks/{chunk-GSKMOPL7.js → chunk-HGG4HR7C.js} +2 -2
- package/dist/cli/chunks/{chunk-AR67RJPY.js → chunk-HSCKWWO2.js} +2 -2
- package/dist/cli/chunks/{chunk-6XXZDV2C.js → chunk-HSQ3GUYJ.js} +2 -2
- package/dist/cli/chunks/{chunk-AAMLQ2LF.js → chunk-HZQBW5EM.js} +3 -3
- package/dist/cli/chunks/{chunk-O5W3FIO6.js → chunk-IGIYANVT.js} +2 -2
- package/dist/cli/chunks/{chunk-C6D5AHBO.js → chunk-IPWMSXBF.js} +2 -2
- package/dist/cli/chunks/{chunk-NDJ7P2EP.js → chunk-IWVNC7VY.js} +1 -1
- package/dist/cli/chunks/{chunk-FDDC72IA.js → chunk-IZODXKZD.js} +2 -2
- package/dist/cli/chunks/{chunk-NO3IV5Q5.js → chunk-J2MT2OJV.js} +1 -1
- package/dist/cli/chunks/{chunk-GQ6TUIKY.js → chunk-JKIJVVSP.js} +1 -1
- package/dist/cli/chunks/{chunk-LE4QJREF.js → chunk-JMRDT2XK.js} +1 -1
- package/dist/cli/chunks/{chunk-2YZ4G6NW.js → chunk-JR2UMTKG.js} +1 -1
- package/dist/cli/chunks/{chunk-RJIEG3NA.js → chunk-K6CH4CFF.js} +2 -2
- package/dist/cli/chunks/{chunk-5NNNEWLS.js → chunk-K7KW5QB5.js} +81 -88
- package/dist/cli/chunks/chunk-KFCQP434.js +2 -0
- package/dist/cli/chunks/{chunk-A5GBXCP5.js → chunk-KH4T6STG.js} +2 -2
- package/dist/cli/chunks/{chunk-VMDFFTCK.js → chunk-KJBYZO57.js} +1 -1
- package/dist/cli/chunks/{chunk-GJYHWYXR.js → chunk-KP4OKOKV.js} +2 -2
- package/dist/cli/chunks/chunk-L2MBKVSE.js +2 -0
- package/dist/cli/chunks/{chunk-XIQW7EFL.js → chunk-L3IPUIT3.js} +2 -2
- package/dist/cli/chunks/{chunk-W5HQUIML.js → chunk-L7PSU2YN.js} +2 -2
- package/dist/cli/chunks/{chunk-6DPYNAOK.js → chunk-LA3JPGQA.js} +2 -2
- package/dist/cli/chunks/{chunk-5PBLPQ5T.js → chunk-LC2QRN7V.js} +14 -13
- package/dist/cli/chunks/{chunk-SSYAQZXA.js → chunk-LHY7TMTM.js} +2 -2
- package/dist/cli/chunks/{chunk-QQWBWEJS.js → chunk-LLQ2UMF6.js} +3 -3
- package/dist/cli/chunks/{chunk-DTMAS2GB.js → chunk-LOJ7OO6W.js} +2 -2
- package/dist/cli/chunks/{chunk-32GN3JKR.js → chunk-LPUSH3VF.js} +1 -1
- package/dist/cli/chunks/{chunk-SDLWKRVL.js → chunk-LSEC2BU7.js} +2 -2
- package/dist/cli/chunks/{chunk-IOKYCMTJ.js → chunk-LTGB7OIU.js} +2 -2
- package/dist/cli/chunks/{chunk-6ZBXSOX6.js → chunk-LUG7YNVZ.js} +2 -2
- package/dist/cli/chunks/{chunk-CAKMOVZ6.js → chunk-LWAFRYKE.js} +2 -2
- package/dist/cli/chunks/{chunk-FLNAW7C4.js → chunk-M24ZAZ4U.js} +2 -2
- package/dist/cli/chunks/{chunk-L2DWPVNJ.js → chunk-MKRKRXTX.js} +1 -1
- package/dist/cli/chunks/{chunk-YTHTQPWR.js → chunk-MNNLONAD.js} +1 -1
- package/dist/cli/chunks/{chunk-V5NHZV7S.js → chunk-MQM37KAR.js} +2 -2
- package/dist/cli/chunks/{chunk-PPUZWYUG.js → chunk-MSX2OHYT.js} +2 -2
- package/dist/cli/chunks/{chunk-YRAX7SFJ.js → chunk-MVYQRVLP.js} +2 -2
- package/dist/cli/chunks/{chunk-QVDCVD5D.js → chunk-MZC5WM2P.js} +2 -2
- package/dist/cli/chunks/{chunk-S75SOOZL.js → chunk-MZRBNBB3.js} +2 -2
- package/dist/cli/chunks/{chunk-FL64OUBA.js → chunk-N3KQU4UC.js} +2 -2
- package/dist/cli/chunks/{chunk-G5RHFBAY.js → chunk-NKU3FFM4.js} +2 -2
- package/dist/cli/chunks/chunk-O5EWFR76.js +2 -0
- package/dist/cli/chunks/{chunk-63ZKI4PX.js → chunk-O5RDHD5T.js} +2 -2
- package/dist/cli/chunks/chunk-O6UWIXME.js +3 -0
- package/dist/cli/chunks/{chunk-HCH4Y6XX.js → chunk-OA4EQDC4.js} +2 -2
- package/dist/cli/chunks/{chunk-QPEOLAAS.js → chunk-OBCXCRXK.js} +1 -1
- package/dist/cli/chunks/{chunk-6ICX3FEG.js → chunk-OHU5P25N.js} +22 -22
- package/dist/cli/chunks/{chunk-GFWHUQSF.js → chunk-OOSV2RIA.js} +2 -2
- package/dist/cli/chunks/{chunk-MO55CVMT.js → chunk-OW23N2Y5.js} +14 -14
- package/dist/cli/chunks/{chunk-M7WJCTG3.js → chunk-OXOO3YDL.js} +2 -2
- package/dist/cli/chunks/{chunk-KQYJ4VQ5.js → chunk-OYGKSSSI.js} +1 -1
- package/dist/cli/chunks/chunk-PGO46IIW.js +2 -0
- package/dist/cli/chunks/{chunk-NVEWF4JV.js → chunk-PZOYQHWS.js} +1 -1
- package/dist/cli/chunks/{chunk-IESR7TNB.js → chunk-Q2BZSG7Z.js} +2 -2
- package/dist/cli/chunks/{chunk-XIIQ5QTT.js → chunk-Q7V722K5.js} +2 -2
- package/dist/cli/chunks/{chunk-F742SZAX.js → chunk-QZU6M5IO.js} +2 -2
- package/dist/cli/chunks/{chunk-PINSJCM3.js → chunk-R55Y76SJ.js} +1 -1
- package/dist/cli/chunks/{chunk-5B5QPCNU.js → chunk-RMEQYJPU.js} +4 -4
- package/dist/cli/chunks/{chunk-ZQ2XW3IP.js → chunk-RTYXFXTI.js} +2 -2
- package/dist/cli/chunks/{chunk-DVYHMDFR.js → chunk-SJF3O4FX.js} +374 -371
- package/dist/cli/chunks/{chunk-AG2EWGXS.js → chunk-SOUS7Z2H.js} +2 -2
- package/dist/cli/chunks/{chunk-3HD7E6HN.js → chunk-SRVNR3R3.js} +2 -2
- package/dist/cli/chunks/{chunk-KITOPKRG.js → chunk-SU3SXMVG.js} +2 -2
- package/dist/cli/chunks/chunk-SWGPLXWW.js +32 -0
- package/dist/cli/chunks/{chunk-ZR2TKVXQ.js → chunk-TRB3EVH3.js} +2 -2
- package/dist/cli/chunks/{chunk-OCV2XEWQ.js → chunk-TVBDUMKT.js} +2 -2
- package/dist/cli/chunks/{chunk-IOQ6ZQ5W.js → chunk-TWTXPSFU.js} +1 -1
- package/dist/cli/chunks/{chunk-CJSHWQXP.js → chunk-ULYUVUL2.js} +2 -2
- package/dist/cli/chunks/{chunk-PHT5N7SC.js → chunk-UNTBVJ5X.js} +2 -2
- package/dist/cli/chunks/{chunk-LKTTUHLF.js → chunk-UQAA4PHU.js} +2 -2
- package/dist/cli/chunks/{chunk-SR52XP5F.js → chunk-UWSJVKTE.js} +1 -1
- package/dist/cli/chunks/{chunk-L6QSTQME.js → chunk-V2LJ54KP.js} +2 -2
- package/dist/cli/chunks/{chunk-FBDVGRSC.js → chunk-VCCTTKP3.js} +7 -7
- package/dist/cli/chunks/{chunk-YLMNVLDK.js → chunk-VEGUYUVS.js} +1 -1
- package/dist/cli/chunks/{chunk-ASEOFRIG.js → chunk-VUQPVWNK.js} +2 -2
- package/dist/cli/chunks/{chunk-VXFLJNCA.js → chunk-VVGUE2T2.js} +2 -2
- package/dist/cli/chunks/{chunk-4NFQLP6R.js → chunk-W5ASDHJQ.js} +1 -1
- package/dist/cli/chunks/{chunk-I7MQIM2U.js → chunk-WGXT5NWQ.js} +1 -1
- package/dist/cli/chunks/chunk-WJN3V7QB.js +7 -0
- package/dist/cli/chunks/chunk-WPCRQIIF.js +29 -0
- package/dist/cli/chunks/{chunk-SASBO5Y5.js → chunk-WQNLXUWA.js} +6 -6
- package/dist/cli/chunks/{chunk-5SPCGMBB.js → chunk-WZVRMKG2.js} +2 -2
- package/dist/cli/chunks/{chunk-MI5MFHRA.js → chunk-X27IUWTD.js} +2 -2
- package/dist/cli/chunks/{chunk-HJ6ZGVTB.js → chunk-X4B345B6.js} +2 -2
- package/dist/cli/chunks/{chunk-HVRRLYX6.js → chunk-X5I2Y4VO.js} +2 -2
- package/dist/cli/chunks/{chunk-SUDMM5SO.js → chunk-X7IQIFTS.js} +2 -2
- package/dist/cli/chunks/chunk-XJN3RKUD.js +3 -0
- package/dist/cli/chunks/{chunk-E3D4GPLP.js → chunk-XQMGXTHJ.js} +3 -3
- package/dist/cli/chunks/{chunk-67Z5R7RJ.js → chunk-XTSAMB2Q.js} +2 -2
- package/dist/cli/chunks/{chunk-KVF4NXGQ.js → chunk-XZLIF4O2.js} +2 -2
- package/dist/cli/chunks/{chunk-EA4YQVKS.js → chunk-Y4LSEOZ3.js} +1 -1
- package/dist/cli/chunks/{chunk-OAEE6JWQ.js → chunk-Y4YN2RXR.js} +2 -2
- package/dist/cli/chunks/{chunk-CEYSYSK5.js → chunk-YDI56L35.js} +2 -2
- package/dist/cli/chunks/{chunk-JDIYMZCQ.js → chunk-YFILS5D5.js} +2 -2
- package/dist/cli/chunks/{chunk-GAHNO6JJ.js → chunk-YISDX6WB.js} +2 -2
- package/dist/cli/chunks/{chunk-AGRV5B3T.js → chunk-YP2GHQSV.js} +2 -2
- package/dist/cli/chunks/{chunk-UNGBRZDK.js → chunk-YSX756AM.js} +4 -4
- package/dist/cli/chunks/{chunk-BEKDKVQT.js → chunk-YWANOASW.js} +2 -2
- package/dist/cli/chunks/{chunk-JQ3DYUMS.js → chunk-YYIJLG7S.js} +2 -2
- package/dist/cli/chunks/{chunk-CRPIYUTJ.js → chunk-Z7SD7LXM.js} +2 -2
- package/dist/cli/chunks/{chunk-U2A7NHZA.js → chunk-ZDWD73UF.js} +2 -2
- package/dist/cli/chunks/{chunk-WP4RETKG.js → chunk-ZFT3RLA4.js} +2 -2
- package/dist/cli/chunks/{chunk-VJCIEHEF.js → chunk-ZNTHX5G3.js} +1 -1
- package/dist/cli/chunks/{chunk-PF7RBAYL.js → chunk-ZS27R7VL.js} +2 -2
- package/dist/cli/chunks/{chunk-24OX5TQJ.js → chunk-ZXHHHR7K.js} +1 -1
- package/dist/cli/chunks/{ci-MFUR4CWV.js → ci-N5MOMNXH.js} +2 -2
- package/dist/cli/chunks/{ci-config-PNDLQ6XV.js → ci-config-6L2ROQCW.js} +2 -2
- package/dist/cli/chunks/{ci-output-PFZ4M7NC.js → ci-output-DSRBYEIK.js} +2 -2
- package/dist/cli/chunks/{circuit-breaker-5HH6NLZN.js → circuit-breaker-VRPTNBL7.js} +2 -2
- package/dist/cli/chunks/{claude-flow-setup-QCKYLGLC.js → claude-flow-setup-4YFG3FU5.js} +2 -2
- package/dist/cli/chunks/client-I3L6BKRQ.js +2 -0
- package/dist/cli/chunks/{cline-installer-EASVPFXR.js → cline-installer-7RGYJWGN.js} +2 -2
- package/dist/cli/chunks/{code-UJXDVYRK.js → code-ISC6NW2K.js} +3 -3
- package/dist/cli/chunks/{code-index-extractor-BZJ3UDP4.js → code-index-extractor-2FID75YV.js} +2 -2
- package/dist/cli/chunks/{codex-installer-XSQZUVOZ.js → codex-installer-DZ7OG6KM.js} +2 -2
- package/dist/cli/chunks/{completions-OWOOJFI2.js → completions-SM3LICWK.js} +2 -2
- package/dist/cli/chunks/{complexity-analyzer-KP5TOHDT.js → complexity-analyzer-ZWD2CTAD.js} +2 -2
- package/dist/cli/chunks/{continuedev-installer-IFKQXLHM.js → continuedev-installer-AGASOA26.js} +2 -2
- package/dist/cli/chunks/copilot-installer-CLPZYTQC.js +3 -0
- package/dist/cli/chunks/core-handlers-5EFOJ37H.js +2 -0
- package/dist/cli/chunks/{cost-tracker-MMDDNKZB.js → cost-tracker-7PIGQYDV.js} +2 -2
- package/dist/cli/chunks/{coverage-LUH2B7NT.js → coverage-T2GEBTYS.js} +9 -9
- package/dist/cli/chunks/cross-domain-router-65WJAKVD.js +2 -0
- package/dist/cli/chunks/{cursor-installer-4YLM5GWM.js → cursor-installer-KXBID4MB.js} +2 -2
- package/dist/cli/chunks/daemon-43MXIVH3.js +18 -0
- package/dist/cli/chunks/{daemon-MZKVM4CJ.js → daemon-VAMJLQJ5.js} +3 -3
- package/dist/cli/chunks/{dag-attention-scheduler-X4CYW665.js → dag-attention-scheduler-UBP4VHTA.js} +2 -2
- package/dist/cli/chunks/{detect-7BM2XINO.js → detect-QWFIQRKI.js} +2 -2
- package/dist/cli/chunks/{dist-node-Y5APLEYB.js → dist-node-I2GICS3W.js} +2 -2
- package/dist/cli/chunks/{domain-handler-X3ZRJNAH.js → domain-handler-Z66ISB2A.js} +2 -2
- package/dist/cli/chunks/{domain-plugins-2UW5KQJB.js → domain-plugins-KHMD3FKT.js} +2 -2
- package/dist/cli/chunks/{domain-transfer-35W4CIBV.js → domain-transfer-JWGNNA6K.js} +2 -2
- package/dist/cli/chunks/dream-VQ2PZCVR.js +2 -0
- package/dist/cli/chunks/embed-and-insert-pattern-F5P5B6JX.js +3 -0
- package/dist/cli/chunks/{embedding-space-SBM2MZD2.js → embedding-space-KHG6TITM.js} +2 -2
- package/dist/cli/chunks/{eval-4QA2SROK.js → eval-43OHU7EI.js} +2 -2
- package/dist/cli/chunks/{experience-capture-middleware-Z6BF6KYM.js → experience-capture-middleware-KXD47H6P.js} +3 -3
- package/dist/cli/chunks/{fast-paths-FIORX6GN.js → fast-paths-6D75D5KD.js} +2 -2
- package/dist/cli/chunks/{feature-flags-6LYI2T4G.js → feature-flags-IE35Y55N.js} +2 -2
- package/dist/cli/chunks/{feature-flags-ZOO7LMIC.js → feature-flags-OYYHY7LS.js} +2 -2
- package/dist/cli/chunks/file-discovery-LGBTY3ID.js +2 -0
- package/dist/cli/chunks/{fleet-7WF53H4F.js → fleet-AGVJMFGD.js} +16 -16
- package/dist/cli/chunks/{gnn-wrapper-KJ6B7BRM.js → gnn-wrapper-5L66A7LW.js} +2 -2
- package/dist/cli/chunks/{heartbeat-handler-DEKKMOVW.js → heartbeat-handler-2BY6YYOT.js} +5 -5
- package/dist/cli/chunks/heartbeat-scheduler-3DU3M5AT.js +2 -0
- package/dist/cli/chunks/hnsw-adapter-N2IMSRPV.js +2 -0
- package/dist/cli/chunks/hnsw-index-DVU7TTJE.js +2 -0
- package/dist/cli/chunks/{hnsw-legacy-bridge-L27WS27N.js → hnsw-legacy-bridge-RYMWFNAH.js} +2 -2
- package/dist/cli/chunks/{hnswlib-node-4YOQC6L4.js → hnswlib-node-GG47HP2P.js} +2 -2
- package/dist/cli/chunks/{hooks-TAOKV4EJ.js → hooks-FQNACS24.js} +10 -10
- package/dist/cli/chunks/hybrid-backend-AS2PNHOD.js +2 -0
- package/dist/cli/chunks/{hypergraph-engine-BODRJLHL.js → hypergraph-engine-6BYNJQEP.js} +2 -2
- package/dist/cli/chunks/{hypergraph-handler-RKMYJNTU.js → hypergraph-handler-CYTAXZKJ.js} +3 -3
- package/dist/cli/chunks/impact-analyzer-Y4OONLFP.js +2 -0
- package/dist/cli/chunks/{init-guard-MXHSLSB2.js → init-guard-METTAV5O.js} +2 -2
- package/dist/cli/chunks/{init-handler-HUE57IFW.js → init-handler-GFT74U5Y.js} +6 -6
- package/dist/cli/chunks/init-wizard-HLNUBJQN.js +2 -0
- package/dist/cli/chunks/kernel-XKFWCL7Y.js +2 -0
- package/dist/cli/chunks/{kilocode-installer-S333IKYQ.js → kilocode-installer-GZV2D3FF.js} +2 -2
- package/dist/cli/chunks/{kiro-installer-WM5DLQWC.js → kiro-installer-Q4ZXUFC7.js} +2 -2
- package/dist/cli/chunks/knowledge-graph-CNL77CSZ.js +2 -0
- package/dist/cli/chunks/{learning-LNHMQLH5.js → learning-WA2QEYL7.js} +35 -34
- package/dist/cli/chunks/{llm-router-EWFXYZZR.js → llm-router-GRTCHWH7.js} +4 -4
- package/dist/cli/chunks/llm-router-service-UIYTYKP6.js +2 -0
- package/dist/cli/chunks/{load-FGYGWVDK.js → load-WXN3Q7Y5.js} +2 -2
- package/dist/cli/chunks/load-test-PXLW4A5B.js +2 -0
- package/dist/cli/chunks/{mcp-2FHNAAOM.js → mcp-LIQCPSJN.js} +2 -2
- package/dist/cli/chunks/{memory-DZMQ73AB.js → memory-OP6CHRFH.js} +5 -5
- package/dist/cli/chunks/memory-backend-XYOSO73Q.js +2 -0
- package/dist/cli/chunks/memory-handlers-PQFYVNVG.js +2 -0
- package/dist/cli/chunks/{multi-model-executor-6F2UAEUW.js → multi-model-executor-H54DEVRZ.js} +2 -2
- package/dist/cli/chunks/{opencode-installer-XY3BGOTZ.js → opencode-installer-BSQV6UAT.js} +2 -2
- package/dist/cli/chunks/{orchestrator-B4CNKUOS.js → orchestrator-TJDPQ4VL.js} +122 -35
- package/dist/cli/chunks/pattern-null-store-BKGTQFNF.js +2 -0
- package/dist/cli/chunks/{pattern-usage-recorder-R4GUFNMD.js → pattern-usage-recorder-FOVS4M5L.js} +2 -2
- package/dist/cli/chunks/{pipeline-FG5RKVRO.js → pipeline-4AY2ZIC6.js} +2 -2
- package/dist/cli/chunks/{platform-3BT4KEVJ.js → platform-FCSITYMR.js} +2 -2
- package/dist/cli/chunks/{plugin-WI4RIN7O.js → plugin-E56TV5S2.js} +2 -2
- package/dist/cli/chunks/{prime-radiant-advanced-wasm-7ECDNQFS.js → prime-radiant-advanced-wasm-ACOPC533.js} +2 -2
- package/dist/cli/chunks/project-root-MPX7CN2C.js +2 -0
- package/dist/cli/chunks/protocol-executor-CRQOCC4A.js +2 -0
- package/dist/cli/chunks/{protocol-handler-WNODKPGW.js → protocol-handler-KRVXF4LS.js} +2 -2
- package/dist/cli/chunks/{prove-5RHAEPYZ.js → prove-KMFPSKGD.js} +2 -2
- package/dist/cli/chunks/qe-reasoning-bank-UEGQ3O7F.js +2 -0
- package/dist/cli/chunks/{quality-WPHR7BGQ.js → quality-6DBI3HLB.js} +2 -2
- package/dist/cli/chunks/{quality-gate-4RKTEZMX.js → quality-gate-3ROZMEIL.js} +3 -3
- package/dist/cli/chunks/queen-coordinator-32574XSG.js +2 -0
- package/dist/cli/chunks/real-embeddings-MIGZNKK3.js +2 -0
- package/dist/cli/chunks/{ref-validation-TPAWHOHH.js → ref-validation-EYIP7DHW.js} +2 -2
- package/dist/cli/chunks/{roocode-installer-7AVHFNDI.js → roocode-installer-IGGZHR2Y.js} +2 -2
- package/dist/cli/chunks/router-CZJY5WX6.js +2 -0
- package/dist/cli/chunks/routing-feedback-RC3UBNFX.js +2 -0
- package/dist/cli/chunks/{routing-handler-YKEDVJSH.js → routing-handler-BWNHBYDC.js} +2 -2
- package/dist/cli/chunks/{ruvector-commands-JUAMM354.js → ruvector-commands-PXIHF432.js} +2 -2
- package/dist/cli/chunks/rvf-dual-writer-OG7OV2AK.js +2 -0
- package/dist/cli/chunks/rvf-migration-adapter-THYMW7ZO.js +2 -0
- package/dist/cli/chunks/rvf-migration-coordinator-3H6CLFU7.js +2 -0
- package/dist/cli/chunks/rvf-native-adapter-6JQJIKKW.js +2 -0
- package/dist/cli/chunks/{rvf-store-integrity-VJDUIRTX.js → rvf-store-integrity-CVB3NMSL.js} +2 -2
- package/dist/cli/chunks/safe-db-QFKCVTIJ.js +2 -0
- package/dist/cli/chunks/schedule-6JLVMMYB.js +2 -0
- package/dist/cli/chunks/scheduler-3MPZRMJD.js +2 -0
- package/dist/cli/chunks/{security-ORDN3RD2.js → security-DCRGOTWU.js} +3 -3
- package/dist/cli/chunks/{shared-rvf-adapter-CF4BCIO7.js → shared-rvf-adapter-GKD74QUB.js} +2 -2
- package/dist/cli/chunks/{shared-rvf-dual-writer-C32UBR6D.js → shared-rvf-dual-writer-HVAAVEOH.js} +2 -2
- package/dist/cli/chunks/sqlite-persistence-LGTIKAEX.js +2 -0
- package/dist/cli/chunks/{standalone-memory-OXRJYZXN.js → standalone-memory-O7O2U5N4.js} +2 -2
- package/dist/cli/chunks/{status-handler-BCX5D4HY.js → status-handler-BQTPJJTL.js} +2 -2
- package/dist/cli/chunks/{structural-health-LFG7RUU6.js → structural-health-4H6J4OHK.js} +2 -2
- package/dist/cli/chunks/sync-DJ4TF6QX.js +2 -0
- package/dist/cli/chunks/{sync-YJEE2K2L.js → sync-WW5TAVYW.js} +2 -2
- package/dist/cli/chunks/{task-handler-6LXKPTXJ.js → task-handler-HEM4IEOW.js} +2 -2
- package/dist/cli/chunks/{task-handlers-CILP36I7.js → task-handlers-JRA3NXIR.js} +3 -3
- package/dist/cli/chunks/test-772ZXVG2.js +34 -0
- package/dist/cli/chunks/test-runner-process-XGF2U3NG.js +2 -0
- package/dist/cli/chunks/{test-scheduling-ISI2O4Q5.js → test-scheduling-4TRB7LZ7.js} +3 -3
- package/dist/cli/chunks/token-bootstrap-CICBIJ7T.js +2 -0
- package/dist/cli/chunks/{token-usage-XOC5KG7S.js → token-usage-B7PEKE2G.js} +2 -2
- package/dist/cli/chunks/{transformers-LSLQAARK.js → transformers-V7X7BDZX.js} +2 -2
- package/dist/cli/chunks/tree-sitter-wasm-parser-OXPFKFZS.js +2 -0
- package/dist/cli/chunks/{types-5BLCGLCR.js → types-AHHTUY3I.js} +2 -2
- package/dist/cli/chunks/unified-memory-GUR3IUI6.js +2 -0
- package/dist/cli/chunks/unified-memory-hnsw-NJP2F2RY.js +2 -0
- package/dist/cli/chunks/unified-persistence-NILBWXDP.js +2 -0
- package/dist/cli/chunks/{upgrade-RQJYLK3J.js → upgrade-DZ4DLUQ5.js} +2 -2
- package/dist/cli/chunks/{validate-QBHWXXCK.js → validate-4DTLIDJE.js} +2 -2
- package/dist/cli/chunks/{validate-swarm-IKXBKFB5.js → validate-swarm-A26UFVIS.js} +2 -2
- package/dist/cli/chunks/visual-security-YECYZ27X.js +2 -0
- package/dist/cli/chunks/{web-tree-sitter-ZF6FIE5R.js → web-tree-sitter-F2C7QRYT.js} +2 -2
- package/dist/cli/chunks/{windsurf-installer-HQGDZT5D.js → windsurf-installer-OOBTDA6W.js} +2 -2
- package/dist/cli/chunks/{witness-chain-DCHCAMSQ.js → witness-chain-KGFZJP32.js} +2 -2
- package/dist/cli/chunks/witness-chain-LYBXFLJB.js +2 -0
- package/dist/cli/chunks/witness-chain-repair-CNTXOGPN.js +2 -0
- package/dist/cli/chunks/{witness-chain-verifier-PX2OQ6XT.js → witness-chain-verifier-OB7ZZOI3.js} +2 -2
- package/dist/cli/chunks/{witness-key-manager-RXYQNFJB.js → witness-key-manager-YCKGKGQI.js} +2 -2
- package/dist/cli/chunks/{workflow-FBKCA4H6.js → workflow-PRERHWKY.js} +4 -4
- package/dist/cli/chunks/workflow-orchestrator-UIBGWCU3.js +2 -0
- package/dist/cli/chunks/wrappers-L4UY4V63.js +2 -0
- package/dist/cli/commands/coverage.js +4 -1
- package/dist/cli/commands/learning-prune.js +9 -1
- package/dist/cli/commands/test.js +26 -4
- package/dist/cli/handlers/brain-handler.js +32 -2
- package/dist/cli/handlers/heartbeat-handler.js +3 -1
- package/dist/cli/utils/coverage-data.js +5 -1
- package/dist/cli/utils/coverage-verdict.d.ts +10 -2
- package/dist/cli/utils/coverage-verdict.js +23 -8
- package/dist/cli/utils/fleet-operation.js +9 -3
- package/dist/coordination/handlers/code-intelligence-handlers.js +17 -3
- package/dist/coordination/handlers/coverage-handlers.js +22 -9
- package/dist/coordination/handlers/coverage-target.d.ts +22 -2
- package/dist/coordination/handlers/coverage-target.js +45 -9
- package/dist/coordination/handlers/handler-utils.d.ts +19 -0
- package/dist/coordination/handlers/handler-utils.js +22 -8
- package/dist/coordination/handlers/test-execution-handlers.js +64 -20
- package/dist/coordination/protocols/code-intelligence-index.js +6 -3
- package/dist/coordination/protocols/learning-consolidation-archive.d.ts +6 -3
- package/dist/coordination/protocols/learning-consolidation-archive.js +4 -3
- package/dist/coordination/workflow-builtin.js +1 -0
- package/dist/domains/code-intelligence/services/semantic-analyzer.d.ts +8 -3
- package/dist/domains/code-intelligence/services/semantic-analyzer.js +39 -25
- package/dist/domains/code-intelligence/services/text-relevance.d.ts +32 -0
- package/dist/domains/code-intelligence/services/text-relevance.js +63 -0
- package/dist/domains/defect-intelligence/interfaces.d.ts +2 -0
- package/dist/domains/defect-intelligence/prediction-history.d.ts +15 -1
- package/dist/domains/defect-intelligence/prediction-history.js +63 -7
- package/dist/domains/defect-intelligence/services/defect-predictor.d.ts +1 -0
- package/dist/domains/defect-intelligence/services/defect-predictor.js +33 -13
- package/dist/domains/learning-optimization/coordinator.js +17 -10
- package/dist/domains/learning-optimization/domain-ranking.d.ts +26 -0
- package/dist/domains/learning-optimization/domain-ranking.js +28 -0
- package/dist/domains/learning-optimization/interfaces.d.ts +5 -0
- package/dist/domains/learning-optimization/pattern-archive.d.ts +55 -8
- package/dist/domains/learning-optimization/pattern-archive.js +90 -17
- package/dist/domains/learning-optimization/pattern-consolidation.js +18 -2
- package/dist/domains/learning-optimization/pattern-merge.d.ts +26 -0
- package/dist/domains/learning-optimization/pattern-merge.js +127 -0
- package/dist/domains/learning-optimization/services/learning-coordinator.js +21 -35
- package/dist/domains/test-execution/coordinator.d.ts +3 -1
- package/dist/domains/test-execution/coordinator.js +13 -4
- package/dist/domains/test-execution/interfaces.d.ts +5 -0
- package/dist/domains/test-execution/plugin.js +2 -0
- package/dist/domains/test-execution/services/flaky-detector.d.ts +9 -1
- package/dist/domains/test-execution/services/flaky-detector.js +26 -8
- package/dist/domains/test-execution/services/retry-handler.d.ts +7 -1
- package/dist/domains/test-execution/services/retry-handler.js +44 -5
- package/dist/domains/test-execution/services/runner-test-cases.d.ts +2 -0
- package/dist/domains/test-execution/services/runner-test-cases.js +7 -3
- package/dist/domains/test-execution/services/test-executor.d.ts +5 -1
- package/dist/domains/test-execution/services/test-executor.js +85 -17
- package/dist/init/copilot-installer.d.ts +6 -0
- package/dist/init/copilot-installer.js +37 -17
- package/dist/init/init-wizard-steps.js +3 -1
- package/dist/init/phases/07-hooks.js +97 -10
- package/dist/init/platform-config-generator.d.ts +10 -0
- package/dist/init/platform-config-generator.js +26 -1
- package/dist/integrations/embeddings/cache/EmbeddingCache.js +1 -1
- package/dist/integrations/ruvector/brain-rvf-exporter.d.ts +16 -1
- package/dist/integrations/ruvector/brain-rvf-exporter.js +18 -32
- package/dist/integrations/ruvector/brain-rvf-richness.d.ts +75 -0
- package/dist/integrations/ruvector/brain-rvf-richness.js +127 -0
- package/dist/kernel/unified-memory-migration.js +1 -1
- package/dist/kernel/unified-memory.d.ts +8 -0
- package/dist/kernel/unified-memory.js +13 -0
- package/dist/learning/checkpoint-shrink-ack.d.ts +25 -0
- package/dist/learning/checkpoint-shrink-ack.js +57 -0
- package/dist/learning/dream/dream-engine.d.ts +44 -3
- package/dist/learning/dream/dream-engine.js +6 -2
- package/dist/learning/embedder-endpoint-client.d.ts +45 -0
- package/dist/learning/embedder-endpoint-client.js +98 -3
- package/dist/learning/embedder-identity-store.js +3 -1
- package/dist/learning/embedding-space-legacy-adoption.d.ts +53 -0
- package/dist/learning/embedding-space-legacy-adoption.js +115 -0
- package/dist/learning/embedding-space-registry.d.ts +90 -0
- package/dist/learning/embedding-space-registry.js +181 -0
- package/dist/learning/experience-capture.d.ts +3 -1
- package/dist/learning/experience-capture.js +15 -5
- package/dist/learning/experience-space-verification.d.ts +2 -0
- package/dist/learning/experience-space-verification.js +3 -2
- package/dist/learning/learning-retention.js +4 -0
- package/dist/learning/pattern-promotion.d.ts +7 -0
- package/dist/learning/pattern-promotion.js +64 -12
- package/dist/learning/real-embeddings.d.ts +3 -0
- package/dist/learning/real-embeddings.js +73 -11
- package/dist/learning/rvf-pattern-store.js +6 -1
- package/dist/mcp/bundle.js +558 -537
- package/dist/mcp/handlers/domain-handler-configs.d.ts +3 -0
- package/dist/mcp/handlers/domain-handler-configs.js +1 -0
- package/dist/mcp/handlers/heartbeat-handlers.d.ts +4 -2
- package/dist/mcp/protocol-server.js +1 -1
- package/dist/mcp/tools/learning-optimization/optimize.d.ts +6 -1
- package/dist/mcp/tools/learning-optimization/optimize.js +20 -11
- package/dist/planning/goap-planner.js +4 -0
- package/dist/planning/plan-executor.js +6 -2
- package/dist/shared/embeddings/index.d.ts +2 -2
- package/dist/shared/embeddings/index.js +1 -1
- package/dist/shared/embeddings/nomic-embedder.d.ts +8 -2
- package/dist/shared/embeddings/nomic-embedder.js +19 -11
- package/dist/shared/embeddings/ollama-client.d.ts +28 -2
- package/dist/shared/embeddings/ollama-client.js +84 -22
- package/dist/shared/embeddings/types.d.ts +15 -0
- package/dist/shared/embeddings/types.js +4 -0
- package/dist/shared/git/git-analyzer.d.ts +30 -11
- package/dist/shared/git/git-analyzer.js +95 -48
- package/dist/shared/io/confined-read.d.ts +32 -7
- package/dist/shared/io/confined-read.js +58 -25
- package/dist/shared/io/file-reader.js +4 -1
- package/dist/shared/pytest-junit-report.d.ts +93 -0
- package/dist/shared/pytest-junit-report.js +241 -0
- package/dist/shared/safe-db.d.ts +1 -1
- package/dist/shared/safe-db.js +20 -5
- package/dist/shared/sqlite-journal-mode.d.ts +39 -0
- package/dist/shared/sqlite-journal-mode.js +53 -0
- package/dist/shared/test-runner-project.d.ts +51 -1
- package/dist/shared/test-runner-project.js +140 -25
- package/dist/sync/claude-flow-bridge.js +1 -1
- package/dist/sync/readers/sqlite-reader.js +3 -4
- package/dist/sync/writers/sqlite-writer.js +1 -1
- package/dist/workers/interfaces.d.ts +2 -2
- package/dist/workers/quality-daemon/git-watcher.d.ts +8 -0
- package/dist/workers/quality-daemon/git-watcher.js +54 -12
- package/dist/workers/quality-daemon/index.js +1 -1
- package/dist/workers/quality-daemon/priority-queue.d.ts +2 -1
- package/dist/workers/workers/defect-predictor.d.ts +9 -4
- package/dist/workers/workers/defect-predictor.js +98 -37
- package/package.json +1 -1
- package/dist/cli/chunks/adapter-6CQ2PIP5.js +0 -2
- package/dist/cli/chunks/aqe-learning-engine-73RR52VS.js +0 -2
- package/dist/cli/chunks/base-SMCMMVGP.js +0 -2
- package/dist/cli/chunks/brain-handler-HQWZFO52.js +0 -95
- package/dist/cli/chunks/browser-workflow-A2MEZ66K.js +0 -2
- package/dist/cli/chunks/chunk-CGGUM2YJ.js +0 -3
- package/dist/cli/chunks/chunk-D6COXLYE.js +0 -8
- package/dist/cli/chunks/chunk-EGYE5UPQ.js +0 -2
- package/dist/cli/chunks/chunk-IUBJVHNB.js +0 -3
- package/dist/cli/chunks/chunk-KL7OKSU2.js +0 -4
- package/dist/cli/chunks/chunk-KPRCB5LT.js +0 -7
- package/dist/cli/chunks/chunk-LRSX2FJM.js +0 -2
- package/dist/cli/chunks/chunk-M4FRQ4TE.js +0 -12
- package/dist/cli/chunks/chunk-MAFQV4U4.js +0 -16
- package/dist/cli/chunks/chunk-NZU4ACBZ.js +0 -2
- package/dist/cli/chunks/chunk-RV74I3YO.js +0 -3
- package/dist/cli/chunks/chunk-SJ6Y4725.js +0 -5
- package/dist/cli/chunks/chunk-UE5ZOZR2.js +0 -2
- package/dist/cli/chunks/chunk-VSIKHWZ4.js +0 -29
- package/dist/cli/chunks/chunk-YAPLJR7K.js +0 -2
- package/dist/cli/chunks/client-MHQRTZM4.js +0 -2
- package/dist/cli/chunks/copilot-installer-IGJ6KGQY.js +0 -3
- package/dist/cli/chunks/core-handlers-UAK3LLJE.js +0 -2
- package/dist/cli/chunks/cross-domain-router-WTRZQPNQ.js +0 -2
- package/dist/cli/chunks/daemon-CAVZ7OFV.js +0 -18
- package/dist/cli/chunks/dream-EJY24JN6.js +0 -2
- package/dist/cli/chunks/embed-and-insert-pattern-COG4C7ZI.js +0 -3
- package/dist/cli/chunks/file-discovery-UZSFSS4V.js +0 -2
- package/dist/cli/chunks/heartbeat-scheduler-NVR356I7.js +0 -2
- package/dist/cli/chunks/hnsw-adapter-LFMPLUJU.js +0 -2
- package/dist/cli/chunks/hnsw-index-POCPMVJH.js +0 -2
- package/dist/cli/chunks/hybrid-backend-4STAO7CV.js +0 -2
- package/dist/cli/chunks/impact-analyzer-3VIIISBQ.js +0 -2
- package/dist/cli/chunks/init-wizard-PL6QN6RQ.js +0 -2
- package/dist/cli/chunks/kernel-CCDWT7KS.js +0 -2
- package/dist/cli/chunks/knowledge-graph-KFOMEN3H.js +0 -2
- package/dist/cli/chunks/llm-router-service-7NBE2EX6.js +0 -2
- package/dist/cli/chunks/load-test-UNZUWY3F.js +0 -2
- package/dist/cli/chunks/memory-backend-DFGKWA2Q.js +0 -2
- package/dist/cli/chunks/memory-handlers-MP426XRJ.js +0 -2
- package/dist/cli/chunks/pattern-null-store-SSVF5TE5.js +0 -2
- package/dist/cli/chunks/project-root-BEANNYWU.js +0 -2
- package/dist/cli/chunks/protocol-executor-FQVIHXZ7.js +0 -2
- package/dist/cli/chunks/qe-reasoning-bank-5TFYSE24.js +0 -2
- package/dist/cli/chunks/queen-coordinator-Y2OUL7IN.js +0 -2
- package/dist/cli/chunks/real-embeddings-OXLYU7JW.js +0 -2
- package/dist/cli/chunks/router-EP34O3KB.js +0 -2
- package/dist/cli/chunks/routing-feedback-FJCRKXNG.js +0 -2
- package/dist/cli/chunks/rvf-dual-writer-ILITJSFG.js +0 -2
- package/dist/cli/chunks/rvf-migration-adapter-XF6W4C2N.js +0 -2
- package/dist/cli/chunks/rvf-migration-coordinator-CMKG56AR.js +0 -2
- package/dist/cli/chunks/rvf-native-adapter-7YFW6S4Y.js +0 -2
- package/dist/cli/chunks/safe-db-TCAU4FUT.js +0 -2
- package/dist/cli/chunks/schedule-NB5KV435.js +0 -2
- package/dist/cli/chunks/scheduler-JKXGKVK6.js +0 -2
- package/dist/cli/chunks/sqlite-persistence-IXCNZRTW.js +0 -2
- package/dist/cli/chunks/sync-OSF7C2NL.js +0 -2
- package/dist/cli/chunks/test-SD457QJ6.js +0 -34
- package/dist/cli/chunks/test-runner-process-VKD65QQU.js +0 -2
- package/dist/cli/chunks/token-bootstrap-VUELSBOS.js +0 -2
- package/dist/cli/chunks/tree-sitter-wasm-parser-YAIPHRIL.js +0 -2
- package/dist/cli/chunks/unified-memory-GI76TXFV.js +0 -2
- package/dist/cli/chunks/unified-memory-hnsw-GXJ5BTZO.js +0 -2
- package/dist/cli/chunks/unified-persistence-OP7FDQPD.js +0 -2
- package/dist/cli/chunks/visual-security-GZ2MOKWB.js +0 -2
- package/dist/cli/chunks/witness-chain-P3XXXA62.js +0 -2
- package/dist/cli/chunks/witness-chain-repair-PUX2NFDL.js +0 -2
- package/dist/cli/chunks/workflow-orchestrator-P2APAJAA.js +0 -2
- package/dist/cli/chunks/wrappers-TWSKBTWD.js +0 -2
|
@@ -6,12 +6,15 @@ 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
|
+
import { compareTextRelevance, textRelevance } from './text-relevance.js';
|
|
9
10
|
/**
|
|
10
11
|
* #1224: the message for a search over an empty index. "No results" is only
|
|
11
12
|
* reported after searching an index that holds code.
|
|
12
13
|
*/
|
|
13
14
|
export const NOTHING_INDEXED_FOR_SEARCH = 'No code is indexed for search yet, so the search was not run. ' +
|
|
14
15
|
'Index the project first (MCP code_index, or `aqe code index <path>`), then search again.';
|
|
16
|
+
/** Highest score first; equal scores by text relevance (#1287). */
|
|
17
|
+
const byScoreThenRelevance = (a, b) => b.hit.score - a.hit.score || compareTextRelevance(a.relevance, b.relevance);
|
|
15
18
|
/** Upper bound on indexed files one exact/fuzzy search reads. */
|
|
16
19
|
const MAX_INDEXED_FILES_SCANNED = 100_000;
|
|
17
20
|
const DEFAULT_CONFIG = {
|
|
@@ -60,17 +63,17 @@ export class SemanticAnalyzerService {
|
|
|
60
63
|
...this.config.nomicConfig,
|
|
61
64
|
enableFallback: false,
|
|
62
65
|
});
|
|
63
|
-
//
|
|
64
|
-
|
|
65
|
-
|
|
66
|
+
// #1229: Ollama lists the model under its own name (all-minilm:22m);
|
|
67
|
+
// the reason says whether Ollama is down or lacks the model.
|
|
68
|
+
const check = await nomicEmbedder.checkModel();
|
|
69
|
+
if (check.status === 'available') {
|
|
66
70
|
this.embedder = nomicEmbedder;
|
|
67
71
|
// Update dimension to match Nomic's output
|
|
68
72
|
this.config.embeddingDimension =
|
|
69
73
|
EMBEDDING_CONFIG.DIMENSIONS;
|
|
70
74
|
}
|
|
71
75
|
else {
|
|
72
|
-
this.embedderUnavailableReason =
|
|
73
|
-
`no embedding model available (Ollama model '${EMBEDDING_CONFIG.MODEL}' is not reachable)`;
|
|
76
|
+
this.embedderUnavailableReason = `no embedding model available (${check.reason})`;
|
|
74
77
|
}
|
|
75
78
|
}
|
|
76
79
|
else {
|
|
@@ -276,7 +279,7 @@ export class SemanticAnalyzerService {
|
|
|
276
279
|
}
|
|
277
280
|
/** Identifies the model behind stored vectors, so vectors from another model are not compared. */
|
|
278
281
|
embeddingModelId() {
|
|
279
|
-
return this.embedder instanceof NomicEmbedder ?
|
|
282
|
+
return this.embedder instanceof NomicEmbedder ? this.embedder.getModelId() : 'injected-provider';
|
|
280
283
|
}
|
|
281
284
|
isCurrentModelVector(metadata) {
|
|
282
285
|
return metadata.embeddingModel === this.embeddingModelId();
|
|
@@ -366,8 +369,9 @@ export class SemanticAnalyzerService {
|
|
|
366
369
|
* vector, so vector search cannot rank them. Match those by text, label the
|
|
367
370
|
* hits 'lexical', and report the result as 'partial-vector' with the counts.
|
|
368
371
|
* Cosine and text-match scores are not comparable, so vector hits come
|
|
369
|
-
* first (by cosine), then lexical hits (by share of query words found
|
|
370
|
-
* reason says how many text matches the
|
|
372
|
+
* first (by cosine), then lexical hits (by share of query words found, ties
|
|
373
|
+
* by text relevance, #1287); the reason says how many text matches the
|
|
374
|
+
* limit left out.
|
|
371
375
|
*/
|
|
372
376
|
async withVectorlessFiles(query, vectorHits, limit, scope, filters) {
|
|
373
377
|
const model = this.embeddingModelId();
|
|
@@ -383,16 +387,19 @@ export class SemanticAnalyzerService {
|
|
|
383
387
|
withoutVector++;
|
|
384
388
|
if (vectorFiles.has(stored.file))
|
|
385
389
|
return;
|
|
386
|
-
const
|
|
387
|
-
if (
|
|
388
|
-
lexicalHits.push({ ...hit, matchType: 'lexical' });
|
|
390
|
+
const match = this.fuzzyMatch(query, queryTokens, stored, scope, filters);
|
|
391
|
+
if (match)
|
|
392
|
+
lexicalHits.push({ ...match, hit: { ...match.hit, matchType: 'lexical' } });
|
|
389
393
|
});
|
|
390
394
|
const coverage = { indexedFiles, filesWithVector: indexedFiles - withoutVector };
|
|
391
395
|
if (withoutVector === 0) {
|
|
392
396
|
return { results: vectorHits, mode: 'vector', coverage };
|
|
393
397
|
}
|
|
394
398
|
const byScore = (a, b) => b.score - a.score;
|
|
395
|
-
const results = [
|
|
399
|
+
const results = [
|
|
400
|
+
...[...vectorHits].sort(byScore),
|
|
401
|
+
...lexicalHits.sort(byScoreThenRelevance).map((match) => match.hit),
|
|
402
|
+
].slice(0, limit);
|
|
396
403
|
const droppedLexical = vectorHits.length + lexicalHits.length - results.length;
|
|
397
404
|
return {
|
|
398
405
|
results,
|
|
@@ -449,18 +456,22 @@ export class SemanticAnalyzerService {
|
|
|
449
456
|
return results;
|
|
450
457
|
}
|
|
451
458
|
async fuzzySearch(query, limit, scope, filters) {
|
|
452
|
-
const
|
|
459
|
+
const matches = [];
|
|
453
460
|
const queryTokens = this.tokenize(query.toLowerCase());
|
|
454
461
|
await this.forEachIndexed((stored) => {
|
|
455
|
-
const
|
|
456
|
-
if (
|
|
457
|
-
|
|
462
|
+
const match = this.fuzzyMatch(query, queryTokens, stored, scope, filters);
|
|
463
|
+
if (match)
|
|
464
|
+
matches.push(match);
|
|
458
465
|
});
|
|
459
|
-
// Sort by score and limit
|
|
460
|
-
return
|
|
466
|
+
// Sort by score, ties by relevance (#1287), and limit
|
|
467
|
+
return matches.sort(byScoreThenRelevance).slice(0, limit).map((match) => match.hit);
|
|
461
468
|
}
|
|
462
|
-
/**
|
|
463
|
-
|
|
469
|
+
/**
|
|
470
|
+
* Token-overlap match of one indexed file, or null when it is filtered out or
|
|
471
|
+
* scores too low. The score is the share of query words found; `relevance`
|
|
472
|
+
* only orders equal scores (#1287).
|
|
473
|
+
*/
|
|
474
|
+
fuzzyMatch(query, queryTokens, stored, scope, filters) {
|
|
464
475
|
// Apply scope filter
|
|
465
476
|
if (scope && scope.length > 0 && !scope.some((s) => stored.file.includes(s))) {
|
|
466
477
|
return null;
|
|
@@ -475,11 +486,14 @@ export class SemanticAnalyzerService {
|
|
|
475
486
|
if (score < this.config.minScore)
|
|
476
487
|
return null;
|
|
477
488
|
return {
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
489
|
+
hit: {
|
|
490
|
+
file: stored.file,
|
|
491
|
+
snippet: this.extractSnippet(stored.content, 200),
|
|
492
|
+
score,
|
|
493
|
+
highlights: queryTokens.filter((t) => contentTokens.some((ct) => this.tokensMatch(t, ct))),
|
|
494
|
+
metadata: stored.metadata,
|
|
495
|
+
},
|
|
496
|
+
relevance: textRelevance(query, stored.content),
|
|
483
497
|
};
|
|
484
498
|
}
|
|
485
499
|
// ============================================================================
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agentic QE v3 - Text match relevance (#1287)
|
|
3
|
+
*
|
|
4
|
+
* Text matching scores a file by the share of query words it contains, so
|
|
5
|
+
* every file containing all of them scores 1.0. This ranks those ties by how
|
|
6
|
+
* well the file matches the query, without changing the score itself.
|
|
7
|
+
*/
|
|
8
|
+
/** How well one file's text matches a query. Higher fields rank first, in this order. */
|
|
9
|
+
export interface TextRelevance {
|
|
10
|
+
/**
|
|
11
|
+
* 2: an identifier is exactly the query words (`processOrder`, `process_order`
|
|
12
|
+
* for "process order"); 1: the query words appear next to each other
|
|
13
|
+
* (`process the order` does not, `process order` and `processOrderItems` do);
|
|
14
|
+
* 0: scattered, or the query is a single word.
|
|
15
|
+
*/
|
|
16
|
+
adjacency: number;
|
|
17
|
+
/** Share of query words found as a whole word (`order`), not only inside one (`orders`, `reorder`). */
|
|
18
|
+
exactWords: number;
|
|
19
|
+
/** Number of words in the file that contain a query word. */
|
|
20
|
+
occurrences: number;
|
|
21
|
+
}
|
|
22
|
+
/** Splits an identifier into lowercase words: `processOrder`, `process_order`, `PROCESS_ORDER` → process, order. */
|
|
23
|
+
export declare function identifierWords(identifier: string): string[];
|
|
24
|
+
/**
|
|
25
|
+
* Relevance of `content` to `query`. Words are compared case-insensitively,
|
|
26
|
+
* and identifiers are split into words, so the query `process order` matches
|
|
27
|
+
* the identifier `processOrder` as adjacent whole words.
|
|
28
|
+
*/
|
|
29
|
+
export declare function textRelevance(query: string, content: string): TextRelevance;
|
|
30
|
+
/** Sort comparator: more relevant first. */
|
|
31
|
+
export declare function compareTextRelevance(a: TextRelevance, b: TextRelevance): number;
|
|
32
|
+
//# sourceMappingURL=text-relevance.d.ts.map
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agentic QE v3 - Text match relevance (#1287)
|
|
3
|
+
*
|
|
4
|
+
* Text matching scores a file by the share of query words it contains, so
|
|
5
|
+
* every file containing all of them scores 1.0. This ranks those ties by how
|
|
6
|
+
* well the file matches the query, without changing the score itself.
|
|
7
|
+
*/
|
|
8
|
+
/** Splits an identifier into lowercase words: `processOrder`, `process_order`, `PROCESS_ORDER` → process, order. */
|
|
9
|
+
export function identifierWords(identifier) {
|
|
10
|
+
return identifier
|
|
11
|
+
.replace(/([a-z0-9])([A-Z])/g, '$1 $2')
|
|
12
|
+
.replace(/([A-Z]+)([A-Z][a-z])/g, '$1 $2')
|
|
13
|
+
.split(/[^A-Za-z0-9]+/)
|
|
14
|
+
.filter((word) => word.length > 0)
|
|
15
|
+
.map((word) => word.toLowerCase());
|
|
16
|
+
}
|
|
17
|
+
function identifiers(text) {
|
|
18
|
+
return text.split(/[^\w]+/).filter((token) => token.length > 0);
|
|
19
|
+
}
|
|
20
|
+
/** Whether `words` appears in `stream` as consecutive entries. */
|
|
21
|
+
function containsRun(stream, words) {
|
|
22
|
+
outer: for (let i = 0; i + words.length <= stream.length; i++) {
|
|
23
|
+
for (let j = 0; j < words.length; j++) {
|
|
24
|
+
if (stream[i + j] !== words[j])
|
|
25
|
+
continue outer;
|
|
26
|
+
}
|
|
27
|
+
return true;
|
|
28
|
+
}
|
|
29
|
+
return false;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Relevance of `content` to `query`. Words are compared case-insensitively,
|
|
33
|
+
* and identifiers are split into words, so the query `process order` matches
|
|
34
|
+
* the identifier `processOrder` as adjacent whole words.
|
|
35
|
+
*/
|
|
36
|
+
export function textRelevance(query, content) {
|
|
37
|
+
const queryWords = identifiers(query).flatMap(identifierWords);
|
|
38
|
+
const contentIdentifiers = identifiers(content);
|
|
39
|
+
const lowerIdentifiers = contentIdentifiers.map((token) => token.toLowerCase());
|
|
40
|
+
const splitIdentifiers = contentIdentifiers.map(identifierWords);
|
|
41
|
+
const contentWords = new Set([...lowerIdentifiers, ...splitIdentifiers.flat()]);
|
|
42
|
+
const queryTokens = identifiers(query.toLowerCase());
|
|
43
|
+
let adjacency = 0;
|
|
44
|
+
if (queryWords.length > 1) {
|
|
45
|
+
const phrase = queryWords.join(' ');
|
|
46
|
+
if (splitIdentifiers.some((words) => words.join(' ') === phrase))
|
|
47
|
+
adjacency = 2;
|
|
48
|
+
else if (containsRun(splitIdentifiers.flat(), queryWords))
|
|
49
|
+
adjacency = 1;
|
|
50
|
+
}
|
|
51
|
+
return {
|
|
52
|
+
adjacency,
|
|
53
|
+
exactWords: queryWords.length === 0
|
|
54
|
+
? 0
|
|
55
|
+
: queryWords.filter((word) => contentWords.has(word)).length / queryWords.length,
|
|
56
|
+
occurrences: lowerIdentifiers.filter((token) => queryTokens.some((qt) => token.includes(qt))).length,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
/** Sort comparator: more relevant first. */
|
|
60
|
+
export function compareTextRelevance(a, b) {
|
|
61
|
+
return b.adjacency - a.adjacency || b.exactWords - a.exactWords || b.occurrences - a.occurrences;
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=text-relevance.js.map
|
|
@@ -30,6 +30,8 @@ export interface PredictionResult {
|
|
|
30
30
|
factors: string[];
|
|
31
31
|
/** ADR-051: LLM-enhanced analysis when enabled */
|
|
32
32
|
llmAnalysis?: LLMDefectAnalysis;
|
|
33
|
+
/** #1137: the run was stored, but pruning older runs failed. */
|
|
34
|
+
retention?: 'failed';
|
|
33
35
|
}
|
|
34
36
|
/**
|
|
35
37
|
* ADR-051: LLM-enhanced defect analysis result
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import type { MemoryBackend } from '../../kernel/interfaces.js';
|
|
2
2
|
export declare const MAX_PREDICTION_HISTORY = 32;
|
|
3
|
+
/** Longest `target` a prediction run may name (Linux PATH_MAX) (#1137). */
|
|
4
|
+
export declare const MAX_PREDICTION_TARGET_LENGTH = 4096;
|
|
3
5
|
type RiskLevel = 'critical' | 'high' | 'medium' | 'low' | 'info';
|
|
4
6
|
/** One file prediction as the defect-intelligence predictor recorded it. */
|
|
5
7
|
export interface DomainFilePrediction {
|
|
@@ -12,16 +14,28 @@ export interface DomainFilePrediction {
|
|
|
12
14
|
}[];
|
|
13
15
|
recommendations: string[];
|
|
14
16
|
}
|
|
17
|
+
/**
|
|
18
|
+
* #1137: the target a run for an explicit file list covers. A list too long
|
|
19
|
+
* to store as a target is identified by its digest.
|
|
20
|
+
*/
|
|
21
|
+
export declare function predictionTargetForFiles(files: readonly string[]): string;
|
|
15
22
|
/** A recorded prediction run, or `null` when the record is not a usable one. */
|
|
16
23
|
export declare function parsePredictionRecord(raw: unknown, now: number): {
|
|
17
24
|
id: string;
|
|
18
25
|
timestamp: string;
|
|
19
26
|
predictions: DomainFilePrediction[];
|
|
27
|
+
/** What the run covered; '' for runs recorded before #1137. */
|
|
28
|
+
target: string;
|
|
20
29
|
predictionMethod?: 'static-code-indicators';
|
|
21
30
|
estimated?: true;
|
|
22
31
|
filesSkipped?: number;
|
|
23
32
|
} | null;
|
|
24
|
-
/**
|
|
33
|
+
/**
|
|
34
|
+
* Bound the stored prediction runs: delete runs older than 7 days and usable
|
|
35
|
+
* runs beyond the cap. A row this version cannot parse (stamped ahead by
|
|
36
|
+
* another host's clock, or a riskLevel from a newer release) is left to its
|
|
37
|
+
* TTL rather than deleted on this version's schema (#1137).
|
|
38
|
+
*/
|
|
25
39
|
export declare function prunePredictionHistory(memory: Pick<MemoryBackend, 'search' | 'get' | 'delete'>, modelNamespace?: string): Promise<void>;
|
|
26
40
|
export {};
|
|
27
41
|
//# sourceMappingURL=prediction-history.d.ts.map
|
|
@@ -1,4 +1,7 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
1
2
|
export const MAX_PREDICTION_HISTORY = 32;
|
|
3
|
+
/** Longest `target` a prediction run may name (Linux PATH_MAX) (#1137). */
|
|
4
|
+
export const MAX_PREDICTION_TARGET_LENGTH = 4096;
|
|
2
5
|
const MAX_PREDICTION_AGE_MS = 7 * 24 * 60 * 60 * 1000;
|
|
3
6
|
const NAMESPACE = 'defect-intelligence';
|
|
4
7
|
const RISK_LEVELS = ['critical', 'high', 'medium', 'low', 'info'];
|
|
@@ -21,6 +24,16 @@ function parseFilePrediction(raw) {
|
|
|
21
24
|
: [];
|
|
22
25
|
return { file, probability, riskLevel: riskLevel, factors, recommendations };
|
|
23
26
|
}
|
|
27
|
+
/**
|
|
28
|
+
* #1137: the target a run for an explicit file list covers. A list too long
|
|
29
|
+
* to store as a target is identified by its digest.
|
|
30
|
+
*/
|
|
31
|
+
export function predictionTargetForFiles(files) {
|
|
32
|
+
const target = `files:${[...new Set(files)].sort().join(',')}`;
|
|
33
|
+
return target.length <= MAX_PREDICTION_TARGET_LENGTH
|
|
34
|
+
? target
|
|
35
|
+
: `files-sha256:${createHash('sha256').update(target).digest('hex')}`;
|
|
36
|
+
}
|
|
24
37
|
/** A recorded prediction run, or `null` when the record is not a usable one. */
|
|
25
38
|
export function parsePredictionRecord(raw, now) {
|
|
26
39
|
if (!isRecord(raw) || typeof raw.id !== 'string' || typeof raw.timestamp !== 'string')
|
|
@@ -28,6 +41,8 @@ export function parsePredictionRecord(raw, now) {
|
|
|
28
41
|
const t = Date.parse(raw.timestamp);
|
|
29
42
|
if (!Number.isFinite(t) || t > now + 60_000 || now - t > MAX_PREDICTION_AGE_MS)
|
|
30
43
|
return null;
|
|
44
|
+
if (raw.target !== undefined && (typeof raw.target !== 'string' || raw.target.length > MAX_PREDICTION_TARGET_LENGTH))
|
|
45
|
+
return null;
|
|
31
46
|
if (!Array.isArray(raw.predictions) || raw.predictions.length === 0)
|
|
32
47
|
return null;
|
|
33
48
|
const predictions = raw.predictions.map(parseFilePrediction);
|
|
@@ -35,6 +50,7 @@ export function parsePredictionRecord(raw, now) {
|
|
|
35
50
|
return null;
|
|
36
51
|
return {
|
|
37
52
|
id: raw.id, timestamp: raw.timestamp, predictions: predictions,
|
|
53
|
+
target: raw.target ?? '',
|
|
38
54
|
...(raw.predictionMethod === 'static-code-indicators' ? {
|
|
39
55
|
predictionMethod: 'static-code-indicators', estimated: true,
|
|
40
56
|
filesSkipped: typeof raw.filesSkipped === 'number' && Number.isSafeInteger(raw.filesSkipped) && raw.filesSkipped >= 0
|
|
@@ -42,26 +58,66 @@ export function parsePredictionRecord(raw, now) {
|
|
|
42
58
|
} : {}),
|
|
43
59
|
};
|
|
44
60
|
}
|
|
45
|
-
/**
|
|
61
|
+
/** Milliseconds since the epoch the record claims, or `null` when it names no parseable time. */
|
|
62
|
+
function recordTime(raw) {
|
|
63
|
+
if (!isRecord(raw) || typeof raw.timestamp !== 'string')
|
|
64
|
+
return null;
|
|
65
|
+
const t = Date.parse(raw.timestamp);
|
|
66
|
+
return Number.isFinite(t) ? t : null;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* #1137: the latest run of every target stays (with any run tied with it, so
|
|
70
|
+
* the worker still sees the ambiguity), most recently predicted targets first;
|
|
71
|
+
* the newest other runs fill what is left. Never more than the cap in total.
|
|
72
|
+
*/
|
|
73
|
+
function selectRetained(newestFirst) {
|
|
74
|
+
const latestAt = new Map();
|
|
75
|
+
const latest = [];
|
|
76
|
+
for (const run of newestFirst) {
|
|
77
|
+
const at = latestAt.get(run.target);
|
|
78
|
+
if (at === undefined)
|
|
79
|
+
latestAt.set(run.target, run.timestamp);
|
|
80
|
+
if (at === undefined || at === run.timestamp)
|
|
81
|
+
latest.push(run);
|
|
82
|
+
}
|
|
83
|
+
const keep = new Set(latest.slice(0, MAX_PREDICTION_HISTORY).map((run) => run.key));
|
|
84
|
+
for (const run of newestFirst) {
|
|
85
|
+
if (keep.size >= MAX_PREDICTION_HISTORY)
|
|
86
|
+
break;
|
|
87
|
+
keep.add(run.key);
|
|
88
|
+
}
|
|
89
|
+
return keep;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Bound the stored prediction runs: delete runs older than 7 days and usable
|
|
93
|
+
* runs beyond the cap. A row this version cannot parse (stamped ahead by
|
|
94
|
+
* another host's clock, or a riskLevel from a newer release) is left to its
|
|
95
|
+
* TTL rather than deleted on this version's schema (#1137).
|
|
96
|
+
*/
|
|
46
97
|
export async function prunePredictionHistory(memory, modelNamespace = 'defect-intelligence:predictor') {
|
|
47
98
|
const prefix = `${modelNamespace}:prediction:`;
|
|
48
99
|
const keys = await memory.search(`${prefix}*`, Number.MAX_SAFE_INTEGER, { namespace: NAMESPACE });
|
|
49
100
|
const now = Date.now();
|
|
50
101
|
const records = [];
|
|
51
|
-
const
|
|
102
|
+
const expired = [];
|
|
52
103
|
for (const found of keys) {
|
|
53
104
|
const key = found.startsWith(`${NAMESPACE}:${prefix}`) ? found.slice(NAMESPACE.length + 1) : found;
|
|
54
105
|
if (!key.startsWith(prefix))
|
|
55
106
|
continue;
|
|
56
|
-
const
|
|
107
|
+
const raw = await memory.get(key, { namespace: NAMESPACE });
|
|
108
|
+
const t = recordTime(raw);
|
|
109
|
+
if (t !== null && now - t > MAX_PREDICTION_AGE_MS) {
|
|
110
|
+
expired.push(key);
|
|
111
|
+
continue;
|
|
112
|
+
}
|
|
113
|
+
const parsed = parsePredictionRecord(raw, now);
|
|
57
114
|
if (parsed)
|
|
58
|
-
records.push({ key, timestamp: Date.parse(parsed.timestamp), id: parsed.id });
|
|
59
|
-
else
|
|
60
|
-
invalid.push(key);
|
|
115
|
+
records.push({ key, timestamp: Date.parse(parsed.timestamp), id: parsed.id, target: parsed.target });
|
|
61
116
|
}
|
|
62
117
|
records.sort((a, b) => b.timestamp - a.timestamp || (a.id === b.id ? (a.key === b.key ? 0 : a.key > b.key ? -1 : 1) : a.id > b.id ? -1 : 1));
|
|
118
|
+
const keep = selectRetained(records);
|
|
63
119
|
// Only observed immutable keys are candidates; concurrent new runs are untouched.
|
|
64
|
-
for (const key of [...
|
|
120
|
+
for (const key of [...expired, ...records.filter((record) => !keep.has(record.key)).map((record) => record.key)]) {
|
|
65
121
|
await memory.delete(key, { namespace: NAMESPACE });
|
|
66
122
|
}
|
|
67
123
|
}
|
|
@@ -188,6 +188,7 @@ export declare class DefectPredictorService implements IDefectPredictorService {
|
|
|
188
188
|
private generateTestRecommendations;
|
|
189
189
|
private calculateModelConfidence;
|
|
190
190
|
private calculateVariance;
|
|
191
|
+
/** Records the run; `false` when it was stored but older runs could not be pruned (#1137). */
|
|
191
192
|
private storePrediction;
|
|
192
193
|
private recalculateMetrics;
|
|
193
194
|
}
|
|
@@ -6,14 +6,14 @@
|
|
|
6
6
|
* ADR-051: LLM enhancement for AI-powered defect risk analysis
|
|
7
7
|
*/
|
|
8
8
|
import { v4 as uuidv4 } from 'uuid';
|
|
9
|
-
import { prunePredictionHistory } from '../prediction-history.js';
|
|
9
|
+
import { predictionTargetForFiles, prunePredictionHistory } from '../prediction-history.js';
|
|
10
10
|
import { LoggerFactory } from '../../../logging/index.js';
|
|
11
11
|
import { ok, err } from '../../../shared/types/index.js';
|
|
12
12
|
import { GitAnalyzer } from '../../../shared/git/index.js';
|
|
13
13
|
import { FileReader } from '../../../shared/io/index.js';
|
|
14
14
|
import { findProjectRoot } from '../../../kernel/project-root.js';
|
|
15
15
|
import { TypeScriptParser } from '../../../shared/parsers/index.js';
|
|
16
|
-
import { toError } from '../../../shared/error-utils.js';
|
|
16
|
+
import { toError, toErrorMessage } 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
19
|
import { measuredFileCoverage } from '../../quality-assessment/coverage-report-event.js';
|
|
@@ -55,8 +55,8 @@ const DEFAULT_FEATURES = [
|
|
|
55
55
|
* ADR-051: Added LLM enhancement for AI-powered defect risk analysis
|
|
56
56
|
*/
|
|
57
57
|
const logger = LoggerFactory.create('defect-intelligence/defect-predictor');
|
|
58
|
-
const GIT_TIMEOUT_WARNING = 'Git history timed out for this file: change frequency, developer experience,
|
|
59
|
-
'use their "no git data" defaults, so this prediction is incomplete.';
|
|
58
|
+
const GIT_TIMEOUT_WARNING = 'Git history timed out or was too large to read for this file: change frequency, developer experience, ' +
|
|
59
|
+
'code age and bug history use their "no git data" defaults, so this prediction is incomplete.';
|
|
60
60
|
export class DefectPredictorService {
|
|
61
61
|
config;
|
|
62
62
|
memory;
|
|
@@ -298,7 +298,7 @@ Be specific and actionable. Focus on concrete issues, not generic advice.`,
|
|
|
298
298
|
}
|
|
299
299
|
}
|
|
300
300
|
// Store prediction for potential feedback
|
|
301
|
-
await this.storePrediction(predictions);
|
|
301
|
+
const retained = await this.storePrediction(predictions, files);
|
|
302
302
|
// Update metrics
|
|
303
303
|
this.modelMetrics.totalPredictions += predictions.length;
|
|
304
304
|
this.modelMetrics.lastUpdated = new Date();
|
|
@@ -308,6 +308,7 @@ Be specific and actionable. Focus on concrete issues, not generic advice.`,
|
|
|
308
308
|
factors: Array.from(factors),
|
|
309
309
|
// ADR-051: Include LLM analysis in result if available
|
|
310
310
|
llmAnalysis: llmAnalysis ?? undefined,
|
|
311
|
+
...(retained ? {} : { retention: 'failed' }),
|
|
311
312
|
});
|
|
312
313
|
}
|
|
313
314
|
catch (error) {
|
|
@@ -477,13 +478,17 @@ Be specific and actionable. Focus on concrete issues, not generic advice.`,
|
|
|
477
478
|
codeAge: await this.getCodeAge(file),
|
|
478
479
|
bugHistory: await this.getBugHistory(file),
|
|
479
480
|
});
|
|
480
|
-
// #1115: the git-based metrics of one file share one deadline.
|
|
481
|
-
const metrics = this.gitAnalyzer.withFileDeadline
|
|
482
|
-
? await this.gitAnalyzer.withFileDeadline(file, measure)
|
|
483
|
-
: await measure();
|
|
484
481
|
// #1115: a git timeout left defaults in the git-based metrics; do not
|
|
485
|
-
// cache them as this file's measured metrics.
|
|
486
|
-
|
|
482
|
+
// cache them as this file's measured metrics. #1165: read the flag inside
|
|
483
|
+
// the deadline call, so another prediction on the same file cannot take it.
|
|
484
|
+
const measureOnce = async () => ({
|
|
485
|
+
metrics: await measure(),
|
|
486
|
+
gitTimedOut: this.gitAnalyzer.consumeTimeout?.(file) === true,
|
|
487
|
+
});
|
|
488
|
+
// #1115: the git-based metrics of one file share one deadline.
|
|
489
|
+
const { metrics, gitTimedOut } = this.gitAnalyzer.withFileDeadline
|
|
490
|
+
? await this.gitAnalyzer.withFileDeadline(file, measureOnce)
|
|
491
|
+
: await measureOnce();
|
|
487
492
|
if (!gitTimedOut) {
|
|
488
493
|
await this.memory.set(`${this.config.modelNamespace}:file-metrics:${file}`, metrics, { namespace: 'defect-intelligence', ttl: 3600 } // 1 hour cache
|
|
489
494
|
);
|
|
@@ -899,6 +904,11 @@ Be specific and actionable. Focus on concrete issues, not generic advice.`,
|
|
|
899
904
|
// More predictions generally mean better confidence
|
|
900
905
|
if (predictions.length > 10)
|
|
901
906
|
confidence *= 1.05;
|
|
907
|
+
// #1165: git defaults stand in for most features of a prediction whose
|
|
908
|
+
// git history timed out; such predictions halve their share of confidence.
|
|
909
|
+
const incomplete = predictions.filter((p) => p.warnings?.includes(GIT_TIMEOUT_WARNING)).length;
|
|
910
|
+
if (predictions.length > 0)
|
|
911
|
+
confidence *= 1 - incomplete / predictions.length / 2;
|
|
902
912
|
return Math.min(1, Math.max(0, confidence));
|
|
903
913
|
}
|
|
904
914
|
calculateVariance(values) {
|
|
@@ -908,15 +918,25 @@ Be specific and actionable. Focus on concrete issues, not generic advice.`,
|
|
|
908
918
|
const squareDiffs = values.map((v) => Math.pow(v - mean, 2));
|
|
909
919
|
return squareDiffs.reduce((a, b) => a + b, 0) / values.length;
|
|
910
920
|
}
|
|
911
|
-
|
|
921
|
+
/** Records the run; `false` when it was stored but older runs could not be pruned (#1137). */
|
|
922
|
+
async storePrediction(predictions, files) {
|
|
912
923
|
const predictionId = uuidv4();
|
|
913
924
|
await this.memory.set(`${this.config.modelNamespace}:prediction:${predictionId}`, {
|
|
914
925
|
id: predictionId,
|
|
926
|
+
target: predictionTargetForFiles(files),
|
|
915
927
|
predictions,
|
|
916
928
|
timestamp: new Date().toISOString(),
|
|
917
929
|
}, { namespace: 'defect-intelligence', ttl: 86400 * 7 } // 7 days
|
|
918
930
|
);
|
|
919
|
-
|
|
931
|
+
try {
|
|
932
|
+
await prunePredictionHistory(this.memory, this.config.modelNamespace);
|
|
933
|
+
return true;
|
|
934
|
+
}
|
|
935
|
+
catch (error) {
|
|
936
|
+
// The run is stored; retention catches up on the next run or the TTL.
|
|
937
|
+
logger.warn('Defect prediction stored, but pruning older runs failed', { error: toErrorMessage(error) });
|
|
938
|
+
return false;
|
|
939
|
+
}
|
|
920
940
|
}
|
|
921
941
|
async recalculateMetrics(feedback) {
|
|
922
942
|
// Simple online update of accuracy
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
import { LoggerFactory } from '../../logging/index.js';
|
|
6
6
|
import { readActivePatterns, LEARNING_NS } from './active-patterns.js';
|
|
7
7
|
import { partitionByRewardSource } from './reward-source.js';
|
|
8
|
+
import { measuredSuccessRate, rankTopPerformingDomains } from './domain-ranking.js';
|
|
8
9
|
import { searchAllKeys } from '../../shared/utils/namespaced-search.js';
|
|
9
10
|
import { v4 as uuidv4 } from 'uuid';
|
|
10
11
|
import { toError } from '../../shared/error-utils.js';
|
|
@@ -362,6 +363,7 @@ export class LearningOptimizationCoordinator extends BaseDomainCoordinator {
|
|
|
362
363
|
let knowledgeShared = 0;
|
|
363
364
|
const domainsUpdated = [];
|
|
364
365
|
let newPatternsCreated = 0;
|
|
366
|
+
const mergeFailures = [];
|
|
365
367
|
let totalTransfers = 0;
|
|
366
368
|
let successfulTransfers = 0;
|
|
367
369
|
// Get all knowledge items
|
|
@@ -404,6 +406,12 @@ export class LearningOptimizationCoordinator extends BaseDomainCoordinator {
|
|
|
404
406
|
if (consolidateResult.success) {
|
|
405
407
|
newPatternsCreated++;
|
|
406
408
|
}
|
|
409
|
+
else {
|
|
410
|
+
// #1149: a merge failure is reported, never dropped.
|
|
411
|
+
const failure = { sourcePatternIds: group.map((p) => p.id), error: consolidateResult.error.message };
|
|
412
|
+
mergeFailures.push(failure);
|
|
413
|
+
logger.warn('Pattern merge failed during cross-domain sharing', failure);
|
|
414
|
+
}
|
|
407
415
|
}
|
|
408
416
|
}
|
|
409
417
|
}
|
|
@@ -415,6 +423,7 @@ export class LearningOptimizationCoordinator extends BaseDomainCoordinator {
|
|
|
415
423
|
// #1121: with no transfer attempted there is no rate, not 100%.
|
|
416
424
|
transferSuccessRate: totalTransfers > 0 ? successfulTransfers / totalTransfers : null,
|
|
417
425
|
newPatternsCreated,
|
|
426
|
+
...(mergeFailures.length > 0 ? { mergeFailures } : {}),
|
|
418
427
|
};
|
|
419
428
|
// Publish event
|
|
420
429
|
if (this.config.publishEvents && knowledgeShared > 0) {
|
|
@@ -447,10 +456,14 @@ export class LearningOptimizationCoordinator extends BaseDomainCoordinator {
|
|
|
447
456
|
// Get experiences from last 24h
|
|
448
457
|
const timeRange = TimeRange.lastNDays(1);
|
|
449
458
|
let experiencesLast24h = 0;
|
|
459
|
+
const domainRates = [];
|
|
450
460
|
for (const domain of ALL_DOMAINS) {
|
|
451
|
-
|
|
461
|
+
// #1147: read through the learning service, which reads the
|
|
462
|
+
// learning-optimization namespace the experiences are stored in.
|
|
463
|
+
const expResult = await this.learningService.getExperiences(domain, timeRange);
|
|
452
464
|
if (expResult.success) {
|
|
453
465
|
experiencesLast24h += expResult.value.length;
|
|
466
|
+
domainRates.push({ domain, successRate: measuredSuccessRate(expResult.value) });
|
|
454
467
|
}
|
|
455
468
|
}
|
|
456
469
|
// Get production health for trends
|
|
@@ -467,15 +480,9 @@ export class LearningOptimizationCoordinator extends BaseDomainCoordinator {
|
|
|
467
480
|
const overallLearningRate = patternStats && patternStats.totalPatterns > 0
|
|
468
481
|
? patternStats.avgSuccessRate * 0.6 + (patternStats.avgConfidence * 0.4)
|
|
469
482
|
: null;
|
|
470
|
-
//
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
const domainScores = Object.entries(patternStats.byDomain)
|
|
474
|
-
.filter(([_, count]) => count > 0)
|
|
475
|
-
.map(([domain, count]) => ({ domain: domain, score: count }))
|
|
476
|
-
.sort((a, b) => b.score - a.score);
|
|
477
|
-
topPerformingDomains.push(...domainScores.slice(0, 3).map((d) => d.domain));
|
|
478
|
-
}
|
|
483
|
+
// #1147: rank by measured success over the same 24h, not by pattern
|
|
484
|
+
// count; a domain with no measured outcome or at 0% is left out.
|
|
485
|
+
const { topPerformingDomains } = rankTopPerformingDomains(domainRates);
|
|
479
486
|
const dashboard = {
|
|
480
487
|
overallLearningRate,
|
|
481
488
|
totalPatterns: patternStats?.totalPatterns || 0,
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agentic QE v3 - Ranking domains by measured success (#1147)
|
|
3
|
+
*
|
|
4
|
+
* Pure: no reads or writes. Both learning dashboards (the MCP
|
|
5
|
+
* `qe/learning/optimize` tool and the domain coordinator) rank domains with
|
|
6
|
+
* this one rule:
|
|
7
|
+
* - a domain with no measured outcome has no rate and is left out;
|
|
8
|
+
* - a domain whose measured runs all failed (0%) is not top-performing;
|
|
9
|
+
* - the rest are ordered by measured success rate, highest first.
|
|
10
|
+
*/
|
|
11
|
+
import type { DomainName } from '../../shared/types/index.js';
|
|
12
|
+
import type { Experience } from './interfaces.js';
|
|
13
|
+
export interface DomainSuccessRate {
|
|
14
|
+
readonly domain: DomainName;
|
|
15
|
+
/** Measured success rate, or null when the domain has no measured outcome. */
|
|
16
|
+
readonly successRate: number | null;
|
|
17
|
+
}
|
|
18
|
+
export interface TopPerformingDomains {
|
|
19
|
+
readonly topPerformingDomains: DomainName[];
|
|
20
|
+
/** Domains with at least one measured outcome (ranked or not). */
|
|
21
|
+
readonly measuredDomains: number;
|
|
22
|
+
}
|
|
23
|
+
/** Measured success rate of a domain's experiences; null when none is measured. */
|
|
24
|
+
export declare function measuredSuccessRate(experiences: readonly Experience[]): number | null;
|
|
25
|
+
export declare function rankTopPerformingDomains(rates: readonly DomainSuccessRate[], limit?: number): TopPerformingDomains;
|
|
26
|
+
//# sourceMappingURL=domain-ranking.d.ts.map
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agentic QE v3 - Ranking domains by measured success (#1147)
|
|
3
|
+
*
|
|
4
|
+
* Pure: no reads or writes. Both learning dashboards (the MCP
|
|
5
|
+
* `qe/learning/optimize` tool and the domain coordinator) rank domains with
|
|
6
|
+
* this one rule:
|
|
7
|
+
* - a domain with no measured outcome has no rate and is left out;
|
|
8
|
+
* - a domain whose measured runs all failed (0%) is not top-performing;
|
|
9
|
+
* - the rest are ordered by measured success rate, highest first.
|
|
10
|
+
*/
|
|
11
|
+
import { partitionByRewardSource } from './reward-source.js';
|
|
12
|
+
/** Measured success rate of a domain's experiences; null when none is measured. */
|
|
13
|
+
export function measuredSuccessRate(experiences) {
|
|
14
|
+
const { measured } = partitionByRewardSource(experiences);
|
|
15
|
+
if (measured.length === 0)
|
|
16
|
+
return null;
|
|
17
|
+
return measured.filter((e) => e.result.success).length / measured.length;
|
|
18
|
+
}
|
|
19
|
+
export function rankTopPerformingDomains(rates, limit = 3) {
|
|
20
|
+
const measured = rates.filter((r) => r.successRate !== null);
|
|
21
|
+
const topPerformingDomains = measured
|
|
22
|
+
.filter((r) => r.successRate > 0)
|
|
23
|
+
.sort((a, b) => b.successRate - a.successRate)
|
|
24
|
+
.slice(0, limit)
|
|
25
|
+
.map((r) => r.domain);
|
|
26
|
+
return { topPerformingDomains, measuredDomains: measured.length };
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=domain-ranking.js.map
|
|
@@ -493,6 +493,11 @@ export interface CrossDomainSharingReport {
|
|
|
493
493
|
/** Null when no transfer was attempted (#1121). */
|
|
494
494
|
readonly transferSuccessRate: number | null;
|
|
495
495
|
readonly newPatternsCreated: number;
|
|
496
|
+
/** Pattern merges that failed; absent when none did (#1149). */
|
|
497
|
+
readonly mergeFailures?: ReadonlyArray<{
|
|
498
|
+
readonly sourcePatternIds: string[];
|
|
499
|
+
readonly error: string;
|
|
500
|
+
}>;
|
|
496
501
|
}
|
|
497
502
|
export interface LearningDashboard {
|
|
498
503
|
/** Null when pattern stats are unavailable or no measured pattern exists (#1121). */
|