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
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Agentic QE v3 - Archiving one learned pattern (#1071, #1106)
|
|
2
|
+
* Agentic QE v3 - Archiving one learned pattern (#1071, #1106, #1149)
|
|
3
3
|
*
|
|
4
4
|
* Archiving is a move inside the `learning-optimization` namespace:
|
|
5
5
|
*
|
|
@@ -12,20 +12,67 @@
|
|
|
12
12
|
* - Only the active key of the given pattern is deleted.
|
|
13
13
|
* - The active record must still be that pattern (same id, and the same scores
|
|
14
14
|
* and last use) when the archive runs, or nothing is written or deleted.
|
|
15
|
-
* - The archive copy is
|
|
16
|
-
* failed or partial write
|
|
15
|
+
* - The archive copy is the stored active record. It is read back and compared
|
|
16
|
+
* in full before the active key is deleted, so a failed or partial write
|
|
17
|
+
* never loses the pattern (#1149).
|
|
18
|
+
* - Compare-and-delete: the active key is deleted only while the active record
|
|
19
|
+
* still equals the archive copy. An update made after the copy keeps the
|
|
20
|
+
* pattern active (#1149).
|
|
21
|
+
* - A copy that is not followed by a delete is removed again, so no archive
|
|
22
|
+
* row is left for a pattern that is still active (#1149).
|
|
23
|
+
* - Moves on one backend run one at a time (`withPatternMoveLock`), so two
|
|
24
|
+
* merges of the same patterns cannot both succeed (#1149). The lock is
|
|
25
|
+
* per process; the backend has no transactions to lock across processes.
|
|
17
26
|
*/
|
|
18
27
|
import type { MemoryBackend } from '../../kernel/interfaces.js';
|
|
19
28
|
import type { LearnedPattern } from './interfaces.js';
|
|
20
|
-
|
|
29
|
+
/**
|
|
30
|
+
* Outcome of one move:
|
|
31
|
+
* - `archived`: copied, verified, and removed from the active set
|
|
32
|
+
* - `missing`: the active record is gone; nothing was written
|
|
33
|
+
* - `changed`: the active record changed since it was selected, or during
|
|
34
|
+
* the move; it stays active and no archive copy is kept
|
|
35
|
+
* - `failed`: the archive copy could not be verified; the pattern stays active
|
|
36
|
+
*/
|
|
37
|
+
export type ArchiveOutcome = 'archived' | 'missing' | 'changed' | 'failed';
|
|
38
|
+
/**
|
|
39
|
+
* Outcome of removing the active key after a copy:
|
|
40
|
+
* - `removed`: the active record equalled the archive copy and was deleted
|
|
41
|
+
* - `missing`: the active record was already gone
|
|
42
|
+
* - `changed`: the active record changed after the copy; left active
|
|
43
|
+
* - `failed`: the archive copy is gone or no longer verifies; left active
|
|
44
|
+
*/
|
|
45
|
+
export type RemoveOutcome = 'removed' | 'missing' | 'changed' | 'failed';
|
|
46
|
+
/**
|
|
47
|
+
* JSON with object keys sorted, so two records compare equal exactly when
|
|
48
|
+
* they store the same values. Dates serialize as ISO strings, as they do in
|
|
49
|
+
* the backend.
|
|
50
|
+
*/
|
|
51
|
+
export declare function canonicalJson(value: unknown): string;
|
|
21
52
|
/**
|
|
22
53
|
* Write the archive copy of one pattern and read it back, without touching
|
|
23
|
-
* the active key. `copied` means the copy is verified and the active
|
|
24
|
-
* is still the given pattern.
|
|
54
|
+
* the active key. `copied` means the copy is verified in full and the active
|
|
55
|
+
* record is still the given pattern. On `failed` the unverified copy has been
|
|
56
|
+
* removed again.
|
|
25
57
|
*/
|
|
26
58
|
export declare function copyPatternToArchive(memory: MemoryBackend, pattern: LearnedPattern, archivedAt?: Date): Promise<'copied' | Exclude<ArchiveOutcome, 'archived'>>;
|
|
27
|
-
/**
|
|
28
|
-
|
|
59
|
+
/**
|
|
60
|
+
* Compare-and-delete the active key of a pattern whose archive copy was
|
|
61
|
+
* verified: delete only while the active record still equals the copy.
|
|
62
|
+
*/
|
|
63
|
+
export declare function removeArchivedPattern(memory: MemoryBackend, pattern: LearnedPattern): Promise<RemoveOutcome>;
|
|
64
|
+
/**
|
|
65
|
+
* Remove the archive copy of a pattern that is still active, after a move
|
|
66
|
+
* that did not complete. The copy is kept when the active record is gone, so
|
|
67
|
+
* a pattern is never left without either record.
|
|
68
|
+
*/
|
|
69
|
+
export declare function discardArchiveCopy(memory: MemoryBackend, pattern: LearnedPattern): Promise<boolean>;
|
|
29
70
|
/** Move one pattern to its archive key in the learning namespace. */
|
|
30
71
|
export declare function archiveSelectedPattern(memory: MemoryBackend, pattern: LearnedPattern, archivedAt?: Date): Promise<ArchiveOutcome>;
|
|
72
|
+
/**
|
|
73
|
+
* Run `fn` after every earlier pattern move on the same backend has settled.
|
|
74
|
+
* Not re-entrant: `fn` must not call `withPatternMoveLock` (or
|
|
75
|
+
* `archiveSelectedPattern`) on the same backend.
|
|
76
|
+
*/
|
|
77
|
+
export declare function withPatternMoveLock<T>(memory: MemoryBackend, fn: () => Promise<T>): Promise<T>;
|
|
31
78
|
//# sourceMappingURL=pattern-archive.d.ts.map
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Agentic QE v3 - Archiving one learned pattern (#1071, #1106)
|
|
2
|
+
* Agentic QE v3 - Archiving one learned pattern (#1071, #1106, #1149)
|
|
3
3
|
*
|
|
4
4
|
* Archiving is a move inside the `learning-optimization` namespace:
|
|
5
5
|
*
|
|
@@ -12,38 +12,111 @@
|
|
|
12
12
|
* - Only the active key of the given pattern is deleted.
|
|
13
13
|
* - The active record must still be that pattern (same id, and the same scores
|
|
14
14
|
* and last use) when the archive runs, or nothing is written or deleted.
|
|
15
|
-
* - The archive copy is
|
|
16
|
-
* failed or partial write
|
|
15
|
+
* - The archive copy is the stored active record. It is read back and compared
|
|
16
|
+
* in full before the active key is deleted, so a failed or partial write
|
|
17
|
+
* never loses the pattern (#1149).
|
|
18
|
+
* - Compare-and-delete: the active key is deleted only while the active record
|
|
19
|
+
* still equals the archive copy. An update made after the copy keeps the
|
|
20
|
+
* pattern active (#1149).
|
|
21
|
+
* - A copy that is not followed by a delete is removed again, so no archive
|
|
22
|
+
* row is left for a pattern that is still active (#1149).
|
|
23
|
+
* - Moves on one backend run one at a time (`withPatternMoveLock`), so two
|
|
24
|
+
* merges of the same patterns cannot both succeed (#1149). The lock is
|
|
25
|
+
* per process; the backend has no transactions to lock across processes.
|
|
17
26
|
*/
|
|
18
27
|
import { LEARNING_NS, LEARNING_PATTERN_KEY_PREFIX, isActivePatternKey } from './active-patterns.js';
|
|
28
|
+
const activeKeyOf = (id) => `${LEARNING_PATTERN_KEY_PREFIX}${id}`;
|
|
29
|
+
const archiveKeyOf = (id) => `${LEARNING_PATTERN_KEY_PREFIX}archived:${id}`;
|
|
30
|
+
/**
|
|
31
|
+
* JSON with object keys sorted, so two records compare equal exactly when
|
|
32
|
+
* they store the same values. Dates serialize as ISO strings, as they do in
|
|
33
|
+
* the backend.
|
|
34
|
+
*/
|
|
35
|
+
export function canonicalJson(value) {
|
|
36
|
+
return JSON.stringify(value, (_key, v) => v && typeof v === 'object' && !Array.isArray(v)
|
|
37
|
+
? Object.fromEntries(Object.entries(v).sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0)))
|
|
38
|
+
: v);
|
|
39
|
+
}
|
|
40
|
+
/** The archive copy without its `archivedAt` stamp, i.e. the record that was archived. */
|
|
41
|
+
function archivedRecord(copy) {
|
|
42
|
+
const { archivedAt: _archivedAt, ...record } = copy;
|
|
43
|
+
return record;
|
|
44
|
+
}
|
|
19
45
|
/**
|
|
20
46
|
* Write the archive copy of one pattern and read it back, without touching
|
|
21
|
-
* the active key. `copied` means the copy is verified and the active
|
|
22
|
-
* is still the given pattern.
|
|
47
|
+
* the active key. `copied` means the copy is verified in full and the active
|
|
48
|
+
* record is still the given pattern. On `failed` the unverified copy has been
|
|
49
|
+
* removed again.
|
|
23
50
|
*/
|
|
24
51
|
export async function copyPatternToArchive(memory, pattern, archivedAt = new Date()) {
|
|
25
|
-
const activeKey =
|
|
52
|
+
const activeKey = activeKeyOf(pattern.id);
|
|
26
53
|
if (!isActivePatternKey(activeKey))
|
|
27
54
|
return 'missing';
|
|
28
55
|
const current = await memory.get(activeKey, LEARNING_NS);
|
|
29
|
-
if (!current || current.id !== pattern.id
|
|
56
|
+
if (!current || current.id !== pattern.id)
|
|
30
57
|
return 'missing';
|
|
31
|
-
|
|
32
|
-
|
|
58
|
+
if (changedSinceSelection(current, pattern))
|
|
59
|
+
return 'changed';
|
|
60
|
+
const archiveKey = archiveKeyOf(pattern.id);
|
|
61
|
+
const expected = { ...current, archivedAt };
|
|
62
|
+
await memory.set(archiveKey, expected, { ...LEARNING_NS, persist: true });
|
|
33
63
|
const copy = await memory.get(archiveKey, LEARNING_NS);
|
|
34
|
-
|
|
64
|
+
if (copy && canonicalJson(copy) === canonicalJson(expected))
|
|
65
|
+
return 'copied';
|
|
66
|
+
await discardArchiveCopy(memory, pattern);
|
|
67
|
+
return 'failed';
|
|
35
68
|
}
|
|
36
|
-
/**
|
|
69
|
+
/**
|
|
70
|
+
* Compare-and-delete the active key of a pattern whose archive copy was
|
|
71
|
+
* verified: delete only while the active record still equals the copy.
|
|
72
|
+
*/
|
|
37
73
|
export async function removeArchivedPattern(memory, pattern) {
|
|
38
|
-
|
|
74
|
+
const activeKey = activeKeyOf(pattern.id);
|
|
75
|
+
const active = await memory.get(activeKey, LEARNING_NS);
|
|
76
|
+
if (!active)
|
|
77
|
+
return 'missing';
|
|
78
|
+
const copy = await memory.get(archiveKeyOf(pattern.id), LEARNING_NS);
|
|
79
|
+
if (!copy || typeof copy !== 'object' || copy.id !== pattern.id)
|
|
80
|
+
return 'failed';
|
|
81
|
+
if (canonicalJson(active) !== canonicalJson(archivedRecord(copy)))
|
|
82
|
+
return 'changed';
|
|
83
|
+
await memory.delete(activeKey, LEARNING_NS);
|
|
84
|
+
return 'removed';
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Remove the archive copy of a pattern that is still active, after a move
|
|
88
|
+
* that did not complete. The copy is kept when the active record is gone, so
|
|
89
|
+
* a pattern is never left without either record.
|
|
90
|
+
*/
|
|
91
|
+
export async function discardArchiveCopy(memory, pattern) {
|
|
92
|
+
if (!(await memory.get(activeKeyOf(pattern.id), LEARNING_NS)))
|
|
93
|
+
return false;
|
|
94
|
+
return memory.delete(archiveKeyOf(pattern.id), LEARNING_NS);
|
|
39
95
|
}
|
|
40
96
|
/** Move one pattern to its archive key in the learning namespace. */
|
|
41
97
|
export async function archiveSelectedPattern(memory, pattern, archivedAt = new Date()) {
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
98
|
+
return withPatternMoveLock(memory, async () => {
|
|
99
|
+
const copied = await copyPatternToArchive(memory, pattern, archivedAt);
|
|
100
|
+
if (copied !== 'copied')
|
|
101
|
+
return copied;
|
|
102
|
+
const removed = await removeArchivedPattern(memory, pattern);
|
|
103
|
+
if (removed === 'removed')
|
|
104
|
+
return 'archived';
|
|
105
|
+
await discardArchiveCopy(memory, pattern);
|
|
106
|
+
return removed;
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
const moveQueues = new WeakMap();
|
|
110
|
+
/**
|
|
111
|
+
* Run `fn` after every earlier pattern move on the same backend has settled.
|
|
112
|
+
* Not re-entrant: `fn` must not call `withPatternMoveLock` (or
|
|
113
|
+
* `archiveSelectedPattern`) on the same backend.
|
|
114
|
+
*/
|
|
115
|
+
export function withPatternMoveLock(memory, fn) {
|
|
116
|
+
const previous = moveQueues.get(memory) ?? Promise.resolve();
|
|
117
|
+
const run = previous.then(fn, fn);
|
|
118
|
+
moveQueues.set(memory, run.then(() => undefined, () => undefined));
|
|
119
|
+
return run;
|
|
47
120
|
}
|
|
48
121
|
/** True when the stored record's scores or last use differ from the selected snapshot. */
|
|
49
122
|
function changedSinceSelection(current, selected) {
|
|
@@ -6,12 +6,27 @@
|
|
|
6
6
|
* to predict the merged pattern, so a dry run selects the same trims as a
|
|
7
7
|
* real run.
|
|
8
8
|
*/
|
|
9
|
-
import {
|
|
9
|
+
import { patternEvidenceOf } from './reward-source.js';
|
|
10
10
|
/** Usage-weighted mean of one score (equal weights when nothing was used). */
|
|
11
11
|
function usageWeighted(patterns, score) {
|
|
12
12
|
const totalUsage = patterns.reduce((sum, p) => sum + p.usageCount, 0);
|
|
13
13
|
return patterns.reduce((sum, p) => sum + score(p) * (totalUsage > 0 ? p.usageCount / totalUsage : 1 / patterns.length), 0);
|
|
14
14
|
}
|
|
15
|
+
/**
|
|
16
|
+
* #1147: a merge keeps the most conservative evidence of its sources:
|
|
17
|
+
* `assigned` if any source is, else `pre-1120` if any source is, else
|
|
18
|
+
* `measured`. `pre-1120` has no tag of its own; the merge is left untagged,
|
|
19
|
+
* which `patternEvidenceOf` reads as `pre-1120` (the kept template is a
|
|
20
|
+
* source's, so it is not read as assigned unless a source was).
|
|
21
|
+
*/
|
|
22
|
+
function mergedEvidence(patterns) {
|
|
23
|
+
const evidence = new Set(patterns.map(patternEvidenceOf));
|
|
24
|
+
if (evidence.has('assigned'))
|
|
25
|
+
return 'assigned';
|
|
26
|
+
if (evidence.has('pre-1120'))
|
|
27
|
+
return 'pre-1120';
|
|
28
|
+
return 'measured';
|
|
29
|
+
}
|
|
15
30
|
/** Merge similar patterns: best template, combined contexts, weighted scores. */
|
|
16
31
|
export function buildConsolidatedPattern(patterns, id, now = new Date()) {
|
|
17
32
|
const bestPattern = patterns.reduce((best, current) => current.successRate > best.successRate ? current : best);
|
|
@@ -22,6 +37,7 @@ export function buildConsolidatedPattern(patterns, id, now = new Date()) {
|
|
|
22
37
|
codeContext: bestPattern.context.codeContext,
|
|
23
38
|
tags: [...new Set(patterns.flatMap((p) => p.context.tags))],
|
|
24
39
|
};
|
|
40
|
+
const evidence = mergedEvidence(patterns);
|
|
25
41
|
return {
|
|
26
42
|
id,
|
|
27
43
|
type: bestPattern.type,
|
|
@@ -35,7 +51,7 @@ export function buildConsolidatedPattern(patterns, id, now = new Date()) {
|
|
|
35
51
|
template: bestPattern.template,
|
|
36
52
|
createdAt: now,
|
|
37
53
|
lastUsedAt: now,
|
|
38
|
-
|
|
54
|
+
...(evidence === 'pre-1120' ? {} : { rewardSource: evidence }),
|
|
39
55
|
};
|
|
40
56
|
}
|
|
41
57
|
//# sourceMappingURL=pattern-consolidation.js.map
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agentic QE v3 - Committing one pattern merge (#1106, #1149)
|
|
3
|
+
*
|
|
4
|
+
* `LearningCoordinatorService.consolidatePatterns` builds the consolidated
|
|
5
|
+
* pattern; this module moves the sources out of the active set:
|
|
6
|
+
*
|
|
7
|
+
* 1. Every source pattern's archive copy is written and verified.
|
|
8
|
+
* 2. The consolidated pattern is stored and read back in full.
|
|
9
|
+
* 3. The sources are removed one by one with compare-and-delete.
|
|
10
|
+
*
|
|
11
|
+
* A failure in steps 1-2, or before the first source is removed, rolls the
|
|
12
|
+
* merge back: the consolidated pattern and the archive copies are deleted and
|
|
13
|
+
* every source stays active. A failure after a source was removed keeps the
|
|
14
|
+
* consolidated pattern (it now holds that source's data) and reports each
|
|
15
|
+
* source's real state. Callers run this under `withPatternMoveLock`.
|
|
16
|
+
*/
|
|
17
|
+
import type { MemoryBackend } from '../../kernel/interfaces.js';
|
|
18
|
+
import { type Result } from '../../shared/types/index.js';
|
|
19
|
+
import type { LearnedPattern } from './interfaces.js';
|
|
20
|
+
/**
|
|
21
|
+
* Archive `sources`, store `consolidated` with `store`, then remove the
|
|
22
|
+
* sources. Returns the consolidated pattern only when every source left the
|
|
23
|
+
* active set.
|
|
24
|
+
*/
|
|
25
|
+
export declare function commitPatternMerge(memory: MemoryBackend, sources: readonly LearnedPattern[], consolidated: LearnedPattern, store: (pattern: LearnedPattern) => Promise<void>, archivedAt?: Date): Promise<Result<LearnedPattern>>;
|
|
26
|
+
//# sourceMappingURL=pattern-merge.d.ts.map
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agentic QE v3 - Committing one pattern merge (#1106, #1149)
|
|
3
|
+
*
|
|
4
|
+
* `LearningCoordinatorService.consolidatePatterns` builds the consolidated
|
|
5
|
+
* pattern; this module moves the sources out of the active set:
|
|
6
|
+
*
|
|
7
|
+
* 1. Every source pattern's archive copy is written and verified.
|
|
8
|
+
* 2. The consolidated pattern is stored and read back in full.
|
|
9
|
+
* 3. The sources are removed one by one with compare-and-delete.
|
|
10
|
+
*
|
|
11
|
+
* A failure in steps 1-2, or before the first source is removed, rolls the
|
|
12
|
+
* merge back: the consolidated pattern and the archive copies are deleted and
|
|
13
|
+
* every source stays active. A failure after a source was removed keeps the
|
|
14
|
+
* consolidated pattern (it now holds that source's data) and reports each
|
|
15
|
+
* source's real state. Callers run this under `withPatternMoveLock`.
|
|
16
|
+
*/
|
|
17
|
+
import { err, ok } from '../../shared/types/index.js';
|
|
18
|
+
import { toError } from '../../shared/error-utils.js';
|
|
19
|
+
import { LEARNING_NS, LEARNING_PATTERN_KEY_PREFIX } from './active-patterns.js';
|
|
20
|
+
import { canonicalJson, copyPatternToArchive, discardArchiveCopy, removeArchivedPattern, } from './pattern-archive.js';
|
|
21
|
+
const LEFT_ACTIVE = 'nothing was merged and every source pattern was left active';
|
|
22
|
+
const REMOVE_REASONS = {
|
|
23
|
+
changed: 'changed after its archive copy',
|
|
24
|
+
failed: 'archive copy no longer verifies',
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* Archive `sources`, store `consolidated` with `store`, then remove the
|
|
28
|
+
* sources. Returns the consolidated pattern only when every source left the
|
|
29
|
+
* active set.
|
|
30
|
+
*/
|
|
31
|
+
export async function commitPatternMerge(memory, sources, consolidated, store, archivedAt = new Date()) {
|
|
32
|
+
const copied = [];
|
|
33
|
+
let storeAttempted = false;
|
|
34
|
+
const rollBack = async (reason) => {
|
|
35
|
+
const problems = await undoMerge(memory, copied, storeAttempted ? consolidated : undefined);
|
|
36
|
+
return err(new Error(`${reason}; ${LEFT_ACTIVE}${problems.length ? ` (rollback incomplete: ${problems.join('; ')})` : ''}`));
|
|
37
|
+
};
|
|
38
|
+
try {
|
|
39
|
+
let notCopied = 0;
|
|
40
|
+
for (const source of sources) {
|
|
41
|
+
if ((await copyPatternToArchive(memory, source, archivedAt)) === 'copied')
|
|
42
|
+
copied.push(source);
|
|
43
|
+
else
|
|
44
|
+
notCopied++;
|
|
45
|
+
}
|
|
46
|
+
if (notCopied > 0) {
|
|
47
|
+
return rollBack(`${notCopied} of ${sources.length} source patterns could not be archived (archive copy not verified)`);
|
|
48
|
+
}
|
|
49
|
+
storeAttempted = true;
|
|
50
|
+
await store(consolidated);
|
|
51
|
+
const stored = await memory.get(`${LEARNING_PATTERN_KEY_PREFIX}${consolidated.id}`, LEARNING_NS);
|
|
52
|
+
if (!stored || canonicalJson(stored) !== canonicalJson(consolidated)) {
|
|
53
|
+
return rollBack('Consolidated pattern could not be read back');
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
catch (error) {
|
|
57
|
+
return rollBack(`Merge failed before any source pattern was removed: ${toError(error).message}`);
|
|
58
|
+
}
|
|
59
|
+
const removed = [];
|
|
60
|
+
for (let i = 0; i < sources.length; i++) {
|
|
61
|
+
let reason;
|
|
62
|
+
try {
|
|
63
|
+
const outcome = await removeArchivedPattern(memory, sources[i]);
|
|
64
|
+
if (outcome === 'removed' || outcome === 'missing') {
|
|
65
|
+
removed.push(outcome === 'missing' ? `${sources[i].id} (already gone)` : sources[i].id);
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
reason = REMOVE_REASONS[outcome];
|
|
69
|
+
}
|
|
70
|
+
catch (error) {
|
|
71
|
+
// A delete can fail after it took effect: report what is stored.
|
|
72
|
+
if (await isGone(memory, sources[i])) {
|
|
73
|
+
removed.push(sources[i].id);
|
|
74
|
+
continue;
|
|
75
|
+
}
|
|
76
|
+
reason = `delete failed: ${toError(error).message}`;
|
|
77
|
+
}
|
|
78
|
+
if (removed.length === 0)
|
|
79
|
+
return rollBack(`Source pattern ${sources[i].id} was not removed (${reason})`);
|
|
80
|
+
const leftActive = sources.slice(i);
|
|
81
|
+
const problems = [];
|
|
82
|
+
for (const source of leftActive) {
|
|
83
|
+
try {
|
|
84
|
+
await discardArchiveCopy(memory, source);
|
|
85
|
+
}
|
|
86
|
+
catch (error) {
|
|
87
|
+
problems.push(`archive copy of ${source.id} not removed: ${toError(error).message}`);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
const states = leftActive.map((s, j) => `${s.id} (${j === 0 ? reason : 'not attempted'})`);
|
|
91
|
+
return err(new Error(`Merge partially applied: consolidated pattern ${consolidated.id} is active; ` +
|
|
92
|
+
`removed: ${removed.join(', ')}; left active: ${states.join(', ')}` +
|
|
93
|
+
(problems.length ? `; ${problems.join('; ')}` : '')));
|
|
94
|
+
}
|
|
95
|
+
return ok(consolidated);
|
|
96
|
+
}
|
|
97
|
+
/** True only when the source's active key is confirmed absent. */
|
|
98
|
+
async function isGone(memory, source) {
|
|
99
|
+
try {
|
|
100
|
+
return !(await memory.get(`${LEARNING_PATTERN_KEY_PREFIX}${source.id}`, LEARNING_NS));
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
return false;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
/** Delete the consolidated pattern and the archive copies of sources that are still active. */
|
|
107
|
+
async function undoMerge(memory, copied, consolidated) {
|
|
108
|
+
const problems = [];
|
|
109
|
+
if (consolidated) {
|
|
110
|
+
try {
|
|
111
|
+
await memory.delete(`${LEARNING_PATTERN_KEY_PREFIX}${consolidated.id}`, LEARNING_NS);
|
|
112
|
+
}
|
|
113
|
+
catch (error) {
|
|
114
|
+
problems.push(`consolidated pattern ${consolidated.id} not removed: ${toError(error).message}`);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
for (const source of copied) {
|
|
118
|
+
try {
|
|
119
|
+
await discardArchiveCopy(memory, source);
|
|
120
|
+
}
|
|
121
|
+
catch (error) {
|
|
122
|
+
problems.push(`archive copy of ${source.id} not removed: ${toError(error).message}`);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
return problems;
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=pattern-merge.js.map
|
|
@@ -9,7 +9,8 @@ import { rehydrateDates } from '../../../shared/utils/kv-date-rehydrate.js';
|
|
|
9
9
|
import { toError } from '../../../shared/error-utils.js';
|
|
10
10
|
import { readActivePatterns } from '../active-patterns.js';
|
|
11
11
|
import { isMeasuredPattern, partitionByRewardSource, patternEvidenceOf } from '../reward-source.js';
|
|
12
|
-
import {
|
|
12
|
+
import { withPatternMoveLock } from '../pattern-archive.js';
|
|
13
|
+
import { commitPatternMerge } from '../pattern-merge.js';
|
|
13
14
|
import { buildConsolidatedPattern } from '../pattern-consolidation.js';
|
|
14
15
|
import { createQEFlashAttention, } from '../../../integrations/ruvector/wrappers.js';
|
|
15
16
|
import { getClaudeModelForTier } from '../../../shared/llm/model-registry.js';
|
|
@@ -346,41 +347,26 @@ Provide:
|
|
|
346
347
|
if (patternIds.length < 2) {
|
|
347
348
|
return err(new Error('Need at least 2 patterns to consolidate'));
|
|
348
349
|
}
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
350
|
+
// #1149: one move at a time per backend. A second merge of the same ids
|
|
351
|
+
// reads its sources after the first has removed them, and stops.
|
|
352
|
+
return await withPatternMoveLock(this.memory, async () => {
|
|
353
|
+
const patterns = [];
|
|
354
|
+
for (const id of patternIds) {
|
|
355
|
+
const pattern = await this.memory.get(`learning:pattern:${id}`, LEARNING_NS);
|
|
356
|
+
if (pattern) {
|
|
357
|
+
patterns.push(pattern);
|
|
358
|
+
}
|
|
354
359
|
}
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
const archivedAt = new Date();
|
|
366
|
-
let notCopied = 0;
|
|
367
|
-
for (const pattern of patterns) {
|
|
368
|
-
if (await copyPatternToArchive(this.memory, pattern, archivedAt) !== 'copied')
|
|
369
|
-
notCopied++;
|
|
370
|
-
}
|
|
371
|
-
if (notCopied > 0) {
|
|
372
|
-
return err(new Error(`${notCopied} of ${patterns.length} source patterns could not be archived (archive copy not verified); ` +
|
|
373
|
-
'nothing was merged and every source pattern was left active'));
|
|
374
|
-
}
|
|
375
|
-
await this.storePattern(consolidatedPattern);
|
|
376
|
-
const stored = await this.memory.get(`learning:pattern:${consolidatedPattern.id}`, LEARNING_NS);
|
|
377
|
-
if (!stored || stored.id !== consolidatedPattern.id) {
|
|
378
|
-
return err(new Error('Consolidated pattern could not be read back; nothing was merged and every source pattern was left active'));
|
|
379
|
-
}
|
|
380
|
-
for (const pattern of patterns) {
|
|
381
|
-
await removeArchivedPattern(this.memory, pattern);
|
|
382
|
-
}
|
|
383
|
-
return ok(consolidatedPattern);
|
|
360
|
+
if (patterns.length < 2) {
|
|
361
|
+
return err(new Error('Not enough valid patterns found'));
|
|
362
|
+
}
|
|
363
|
+
// Merge patterns - take best template, combine contexts
|
|
364
|
+
const consolidatedPattern = buildConsolidatedPattern(patterns, uuidv4());
|
|
365
|
+
// #1106/#1149: every source is archived and verified, then the
|
|
366
|
+
// consolidated pattern is stored and verified, then the sources are
|
|
367
|
+
// removed with compare-and-delete; failures roll back (pattern-merge.ts).
|
|
368
|
+
return commitPatternMerge(this.memory, patterns, consolidatedPattern, (p) => this.storePattern(p));
|
|
369
|
+
});
|
|
384
370
|
}
|
|
385
371
|
catch (error) {
|
|
386
372
|
return err(toError(error));
|
|
@@ -131,7 +131,9 @@ export declare class TestExecutionCoordinator extends BaseDomainCoordinator<Test
|
|
|
131
131
|
*/
|
|
132
132
|
private retryFailures;
|
|
133
133
|
/**
|
|
134
|
-
*
|
|
134
|
+
* Fallback framework from file names. With no explicit framework, each
|
|
135
|
+
* runner project's own config still decides between jest and vitest (#1272),
|
|
136
|
+
* and Python files always run with pytest (#1248).
|
|
135
137
|
*/
|
|
136
138
|
private detectFramework;
|
|
137
139
|
/**
|
|
@@ -16,6 +16,7 @@ import { createDomainFinding, } from '../../coordination/consensus/domain-findin
|
|
|
16
16
|
// CQ-002: Base domain coordinator
|
|
17
17
|
import { BaseDomainCoordinator, } from '../base-domain-coordinator.js';
|
|
18
18
|
import { toError } from '../../shared/error-utils.js';
|
|
19
|
+
import { isPythonTestFile } from '../../shared/pytest-junit-report.js';
|
|
19
20
|
import { createMinCutTestOptimizer, } from './services/mincut-test-optimizer.js';
|
|
20
21
|
// ============================================================================
|
|
21
22
|
// Coordinator Configuration
|
|
@@ -146,6 +147,8 @@ export class TestExecutionCoordinator extends BaseDomainCoordinator {
|
|
|
146
147
|
});
|
|
147
148
|
}
|
|
148
149
|
const framework = request.framework ?? this.detectFramework(testsToRun);
|
|
150
|
+
// #1272: without an explicit framework, each runner project's config decides.
|
|
151
|
+
const frameworkFromConfig = request.framework === undefined;
|
|
149
152
|
const workers = request.workers ?? Math.min(4, Math.max(1, testsToRun.length));
|
|
150
153
|
// Batched runners own internal parallelism, so the timeout applies to the
|
|
151
154
|
// whole discovered suite rather than one file.
|
|
@@ -157,6 +160,7 @@ export class TestExecutionCoordinator extends BaseDomainCoordinator {
|
|
|
157
160
|
return this.executeParallel({
|
|
158
161
|
testFiles: testsToRun,
|
|
159
162
|
framework,
|
|
163
|
+
frameworkFromConfig,
|
|
160
164
|
workers,
|
|
161
165
|
timeout,
|
|
162
166
|
retryCount: request.retryCount,
|
|
@@ -167,6 +171,7 @@ export class TestExecutionCoordinator extends BaseDomainCoordinator {
|
|
|
167
171
|
return this.execute({
|
|
168
172
|
testFiles: testsToRun,
|
|
169
173
|
framework,
|
|
174
|
+
frameworkFromConfig,
|
|
170
175
|
timeout,
|
|
171
176
|
retryCount: request.retryCount,
|
|
172
177
|
projectRoot: request.projectRoot,
|
|
@@ -198,9 +203,13 @@ export class TestExecutionCoordinator extends BaseDomainCoordinator {
|
|
|
198
203
|
await this.executor.recordFinalOutcome(run, testFiles);
|
|
199
204
|
}
|
|
200
205
|
/**
|
|
201
|
-
*
|
|
206
|
+
* Fallback framework from file names. With no explicit framework, each
|
|
207
|
+
* runner project's own config still decides between jest and vitest (#1272),
|
|
208
|
+
* and Python files always run with pytest (#1248).
|
|
202
209
|
*/
|
|
203
210
|
detectFramework(testFiles) {
|
|
211
|
+
if (testFiles.every(isPythonTestFile))
|
|
212
|
+
return 'pytest';
|
|
204
213
|
// Check file patterns for common framework indicators
|
|
205
214
|
const hasVitestPattern = testFiles.some(f => f.includes('.test.') || f.includes('.spec.'));
|
|
206
215
|
const hasMochaPattern = testFiles.some(f => f.includes('_test.') || f.includes('.mocha.'));
|
|
@@ -209,7 +218,6 @@ export class TestExecutionCoordinator extends BaseDomainCoordinator {
|
|
|
209
218
|
return 'vitest';
|
|
210
219
|
if (hasMochaPattern)
|
|
211
220
|
return 'mocha';
|
|
212
|
-
// Could add project config detection here (vitest.config.ts, jest.config.js, etc.)
|
|
213
221
|
return 'vitest';
|
|
214
222
|
}
|
|
215
223
|
/**
|
|
@@ -299,7 +307,7 @@ export class TestExecutionCoordinator extends BaseDomainCoordinator {
|
|
|
299
307
|
if (this.config.infraHealing && result.value.failedTests.length > 0) {
|
|
300
308
|
this.feedInfraHealingFromFailures(result.value.failedTests);
|
|
301
309
|
// ADR-057: Attempt automatic recovery and re-run affected tests
|
|
302
|
-
const rerunResult = await this.attemptAutoRecoveryAndRerun(result.value.failedTests, request.framework, { timeout: request.timeout, env: request.env, retryCount: request.retryCount, projectRoot: request.projectRoot });
|
|
310
|
+
const rerunResult = await this.attemptAutoRecoveryAndRerun(result.value.failedTests, request.framework, { timeout: request.timeout, env: request.env, retryCount: request.retryCount, projectRoot: request.projectRoot, frameworkFromConfig: request.frameworkFromConfig });
|
|
303
311
|
if (rerunResult)
|
|
304
312
|
return rerunResult;
|
|
305
313
|
}
|
|
@@ -410,7 +418,7 @@ export class TestExecutionCoordinator extends BaseDomainCoordinator {
|
|
|
410
418
|
if (this.config.infraHealing && result.value.failedTests.length > 0) {
|
|
411
419
|
this.feedInfraHealingFromFailures(result.value.failedTests);
|
|
412
420
|
// ADR-057: Attempt automatic recovery and re-run affected tests
|
|
413
|
-
const rerunResult = await this.attemptAutoRecoveryAndRerun(result.value.failedTests, request.framework, { timeout: request.timeout, env: request.env, retryCount: request.retryCount, projectRoot: request.projectRoot });
|
|
421
|
+
const rerunResult = await this.attemptAutoRecoveryAndRerun(result.value.failedTests, request.framework, { timeout: request.timeout, env: request.env, retryCount: request.retryCount, projectRoot: request.projectRoot, frameworkFromConfig: request.frameworkFromConfig });
|
|
414
422
|
if (rerunResult)
|
|
415
423
|
return rerunResult;
|
|
416
424
|
}
|
|
@@ -631,6 +639,7 @@ export class TestExecutionCoordinator extends BaseDomainCoordinator {
|
|
|
631
639
|
return this.execute({
|
|
632
640
|
testFiles: [...filesToRerun],
|
|
633
641
|
framework,
|
|
642
|
+
frameworkFromConfig: originalRequest.frameworkFromConfig,
|
|
634
643
|
timeout: originalRequest.timeout,
|
|
635
644
|
env: originalRequest.env,
|
|
636
645
|
retryCount: originalRequest.retryCount,
|
|
@@ -56,6 +56,11 @@ export interface ISimpleTestRequest {
|
|
|
56
56
|
export interface IExecuteTestsRequest {
|
|
57
57
|
testFiles: string[];
|
|
58
58
|
framework: string;
|
|
59
|
+
/**
|
|
60
|
+
* #1272: the caller named no framework, so each runner project's own config
|
|
61
|
+
* chooses jest or vitest; `framework` is used where it names neither.
|
|
62
|
+
*/
|
|
63
|
+
frameworkFromConfig?: boolean;
|
|
59
64
|
timeout?: number;
|
|
60
65
|
env?: Record<string, string>;
|
|
61
66
|
reporters?: string[];
|
|
@@ -80,6 +80,8 @@ export class TestExecutionPlugin extends BaseDomainPlugin {
|
|
|
80
80
|
// Simple request format
|
|
81
81
|
const request = {
|
|
82
82
|
testFiles,
|
|
83
|
+
// #1272: an explicit framework wins over the project's config.
|
|
84
|
+
framework: typeof payload.framework === 'string' ? payload.framework : undefined,
|
|
83
85
|
parallel: payload.parallel,
|
|
84
86
|
retryCount: payload.retryCount,
|
|
85
87
|
timeout: payload.timeout,
|
|
@@ -39,7 +39,8 @@ export interface FlakyDetectorConfig {
|
|
|
39
39
|
*/
|
|
40
40
|
testRunnerArgs: string[];
|
|
41
41
|
/**
|
|
42
|
-
* Working directory for test execution.
|
|
42
|
+
* Working directory for test execution. When omitted, each file runs from
|
|
43
|
+
* its nearest runner project, as test_execute_parallel does (#1247, #1272).
|
|
43
44
|
*/
|
|
44
45
|
cwd?: string;
|
|
45
46
|
/**
|
|
@@ -112,6 +113,13 @@ export declare class FlakyDetectorService implements IFlakyTestDetector {
|
|
|
112
113
|
/** Cache TTL for analysis results (1 hour) */
|
|
113
114
|
private readonly ANALYSIS_CACHE_TTL_MS;
|
|
114
115
|
constructor(memory: MemoryBackend, config?: Partial<FlakyDetectorConfig>);
|
|
116
|
+
/** True when the caller chose the runner command; else the project's config picks it. */
|
|
117
|
+
private readonly runnerConfigured;
|
|
118
|
+
/**
|
|
119
|
+
* #1272: the runner command for a run started in `cwd`. A configured command
|
|
120
|
+
* is used as given; the default runs Jest in a project configured for Jest.
|
|
121
|
+
*/
|
|
122
|
+
private runnerCommandIn;
|
|
115
123
|
/**
|
|
116
124
|
* Detect flaky tests by running them multiple times
|
|
117
125
|
*/
|