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
|
@@ -14,6 +14,7 @@ import { safeJsonParse } from '../../../shared/safe-json.js';
|
|
|
14
14
|
import { getTestRunnerExecutionError } from '../../../shared/test-runner-verdict.js';
|
|
15
15
|
import { createVitestJsonReport, needsVitestJsonReportFile } from '../../../shared/vitest-json-report.js';
|
|
16
16
|
import { isJestCommand, jestExactPathPattern, runnerFilePath } from '../../../shared/test-runner-args.js';
|
|
17
|
+
import { runnerCwdFor, runnerFrameworkFor } from '../../../shared/test-runner-project.js';
|
|
17
18
|
import { secureRandom } from '../../../shared/utils/crypto-random.js';
|
|
18
19
|
import { redactFailureText } from './runner-test-cases.js';
|
|
19
20
|
const DEFAULT_FLAKY_CONFIG = {
|
|
@@ -41,6 +42,19 @@ export class FlakyDetectorService {
|
|
|
41
42
|
constructor(memory, config = {}) {
|
|
42
43
|
this.memory = memory;
|
|
43
44
|
this.config = { ...DEFAULT_FLAKY_CONFIG, ...config };
|
|
45
|
+
this.runnerConfigured = config.testRunner !== undefined || config.testRunnerArgs !== undefined;
|
|
46
|
+
}
|
|
47
|
+
/** True when the caller chose the runner command; else the project's config picks it. */
|
|
48
|
+
runnerConfigured;
|
|
49
|
+
/**
|
|
50
|
+
* #1272: the runner command for a run started in `cwd`. A configured command
|
|
51
|
+
* is used as given; the default runs Jest in a project configured for Jest.
|
|
52
|
+
*/
|
|
53
|
+
runnerCommandIn(cwd) {
|
|
54
|
+
if (!this.runnerConfigured && runnerFrameworkFor(cwd) === 'jest') {
|
|
55
|
+
return { runner: 'npx', runnerArgs: ['jest', '--json'] };
|
|
56
|
+
}
|
|
57
|
+
return { runner: this.config.testRunner, runnerArgs: this.config.testRunnerArgs };
|
|
44
58
|
}
|
|
45
59
|
/**
|
|
46
60
|
* Detect flaky tests by running them multiple times
|
|
@@ -259,20 +273,24 @@ export class FlakyDetectorService {
|
|
|
259
273
|
const runId = uuidv4();
|
|
260
274
|
const startTime = Date.now();
|
|
261
275
|
return new Promise((resolve, reject) => {
|
|
262
|
-
const
|
|
276
|
+
const fileBase = this.config.cwd ?? process.cwd();
|
|
277
|
+
// #1272: a runner loads the config of the directory it starts in, so the
|
|
278
|
+
// file runs from its own runner project (the file path stays absolute).
|
|
279
|
+
const cwd = this.config.cwd ?? runnerCwdFor(file);
|
|
280
|
+
const { runner, runnerArgs } = this.runnerCommandIn(cwd);
|
|
263
281
|
// #909: pass an absolute path (never read as a flag); Jest reads it as a
|
|
264
282
|
// regex, so escape and anchor it to select exactly this file.
|
|
265
|
-
const fileArg = isJestCommand([
|
|
266
|
-
? jestExactPathPattern(file,
|
|
267
|
-
: runnerFilePath(file,
|
|
268
|
-
const baseArgs = [...
|
|
283
|
+
const fileArg = isJestCommand([runner, ...runnerArgs])
|
|
284
|
+
? jestExactPathPattern(file, fileBase)
|
|
285
|
+
: runnerFilePath(file, fileBase);
|
|
286
|
+
const baseArgs = [...runnerArgs, fileArg];
|
|
269
287
|
// Vitest 5 writes --reporter=json output to a file, not stdout. Detect
|
|
270
288
|
// Vitest from the runner command too (testRunner: 'vitest', args: ['run', ...]).
|
|
271
|
-
const report = needsVitestJsonReportFile([
|
|
289
|
+
const report = needsVitestJsonReportFile([runner, ...baseArgs])
|
|
272
290
|
? createVitestJsonReport()
|
|
273
291
|
: undefined;
|
|
274
292
|
const args = report ? [...baseArgs, ...report.args] : baseArgs;
|
|
275
|
-
const child = spawn(
|
|
293
|
+
const child = spawn(runner, args, {
|
|
276
294
|
cwd,
|
|
277
295
|
env: { ...process.env, ...this.config.env },
|
|
278
296
|
stdio: ['ignore', 'pipe', 'pipe'],
|
|
@@ -295,7 +313,7 @@ export class FlakyDetectorService {
|
|
|
295
313
|
clearTimeout(timeout);
|
|
296
314
|
report?.cleanup();
|
|
297
315
|
reject(new Error(`Failed to execute test runner: ${error.message}. ` +
|
|
298
|
-
`Ensure ${
|
|
316
|
+
`Ensure ${[runner, ...runnerArgs.slice(0, 1)].join(' ')} is installed and accessible.`));
|
|
299
317
|
});
|
|
300
318
|
child.on('close', (code) => {
|
|
301
319
|
clearTimeout(timeout);
|
|
@@ -8,7 +8,7 @@ import { MemoryBackend } from '../../../kernel/interfaces';
|
|
|
8
8
|
/**
|
|
9
9
|
* Supported test runners for retry execution
|
|
10
10
|
*/
|
|
11
|
-
export type TestRunner = 'vitest' | 'jest' | 'mocha' | 'auto';
|
|
11
|
+
export type TestRunner = 'vitest' | 'jest' | 'mocha' | 'pytest' | 'auto';
|
|
12
12
|
/**
|
|
13
13
|
* Configuration for the retry handler service
|
|
14
14
|
*/
|
|
@@ -159,6 +159,12 @@ export declare class RetryHandlerService implements IRetryHandler {
|
|
|
159
159
|
* Spawn a test process and parse the result
|
|
160
160
|
*/
|
|
161
161
|
private spawnTestProcess;
|
|
162
|
+
/**
|
|
163
|
+
* #1248: a pytest retry passes only when its JUnit report shows the test
|
|
164
|
+
* passed. A node id pytest cannot find (exit code 4) or no collected test
|
|
165
|
+
* (exit code 5) reran nothing.
|
|
166
|
+
*/
|
|
167
|
+
private parsePytestRetry;
|
|
162
168
|
/**
|
|
163
169
|
* Parse test runner output to determine pass/fail status
|
|
164
170
|
*/
|
|
@@ -7,6 +7,7 @@ import { spawn } from 'node:child_process';
|
|
|
7
7
|
import { createVitestJsonReport } from '../../../shared/vitest-json-report.js';
|
|
8
8
|
import { jestExactPathPattern, nameFilterArg, runnerFilePath } from '../../../shared/test-runner-args.js';
|
|
9
9
|
import { runnerCwdFor } from '../../../shared/test-runner-project.js';
|
|
10
|
+
import { createPytestJunitReport, isPythonTestFile, parsePytestJunitXml, pytestCommand, PYTEST_ENV, } from '../../../shared/pytest-junit-report.js';
|
|
10
11
|
import { existsSync, readFileSync, realpathSync } from 'node:fs';
|
|
11
12
|
import { resolve as resolvePath } from 'node:path';
|
|
12
13
|
import { ok, err } from '../../../shared/types/index.js';
|
|
@@ -300,8 +301,8 @@ export class RetryHandlerService {
|
|
|
300
301
|
// projectRoot, else a configured directory, else the file's runner
|
|
301
302
|
// project. The file path stays relative to `cwd`.
|
|
302
303
|
const runCwd = projectRoot ?? this.config.cwd ?? runnerCwdFor(testFile);
|
|
303
|
-
// Detect or use configured test runner
|
|
304
|
-
const runner = await this.detectTestRunner(runCwd);
|
|
304
|
+
// Detect or use configured test runner. #1248: a Python file is pytest's.
|
|
305
|
+
const runner = isPythonTestFile(testFile) ? 'pytest' : await this.detectTestRunner(runCwd);
|
|
305
306
|
if (!runner) {
|
|
306
307
|
throw new Error(`No test runner detected or configured. Install vitest, jest, or mocha, ` +
|
|
307
308
|
`or configure testRunner in RetryHandlerConfig. Cannot execute retry for: ${testFile}`);
|
|
@@ -309,7 +310,7 @@ export class RetryHandlerService {
|
|
|
309
310
|
// Build command based on runner
|
|
310
311
|
const { command, args, report } = this.buildTestCommand(runner, testFile, testName, cwd);
|
|
311
312
|
// Execute the test
|
|
312
|
-
return this.spawnTestProcess(command, args, runCwd, report, runner === 'vitest' ? testFile : undefined);
|
|
313
|
+
return this.spawnTestProcess(command, args, runCwd, report, runner === 'vitest' ? testFile : undefined, runner === 'pytest' ? (code, reportText, output) => this.parsePytestRetry(code, reportText, output) : undefined);
|
|
313
314
|
}
|
|
314
315
|
/**
|
|
315
316
|
* Detect which test runner is available in the project
|
|
@@ -415,6 +416,13 @@ export class RetryHandlerService {
|
|
|
415
416
|
mochaArgs.push(nameFilterArg('mocha', testName));
|
|
416
417
|
return { command: npx, args: mochaArgs };
|
|
417
418
|
}
|
|
419
|
+
case 'pytest':
|
|
420
|
+
// #1248: the failed test's node id is <file>::<name> (name from the run).
|
|
421
|
+
{
|
|
422
|
+
const report = createPytestJunitReport();
|
|
423
|
+
const file = runnerFilePath(testFile, cwd);
|
|
424
|
+
return { ...pytestCommand([filterByName ? `${file}::${testName}` : file], report.path), report };
|
|
425
|
+
}
|
|
418
426
|
default:
|
|
419
427
|
throw new Error(`Unsupported test runner: ${runner}`);
|
|
420
428
|
}
|
|
@@ -422,7 +430,7 @@ export class RetryHandlerService {
|
|
|
422
430
|
/**
|
|
423
431
|
* Spawn a test process and parse the result
|
|
424
432
|
*/
|
|
425
|
-
spawnTestProcess(command, args, cwd, report, targetFile) {
|
|
433
|
+
spawnTestProcess(command, args, cwd, report, targetFile, parseReport) {
|
|
426
434
|
return new Promise((resolve, reject) => {
|
|
427
435
|
const timeout = this.config.testTimeout;
|
|
428
436
|
let stdout = '';
|
|
@@ -439,7 +447,7 @@ export class RetryHandlerService {
|
|
|
439
447
|
const proc = spawn(command, args, {
|
|
440
448
|
cwd,
|
|
441
449
|
detached: process.platform !== 'win32',
|
|
442
|
-
env: { ...process.env, FORCE_COLOR: '0', CI: 'true' },
|
|
450
|
+
env: { ...process.env, FORCE_COLOR: '0', CI: 'true', ...PYTEST_ENV },
|
|
443
451
|
});
|
|
444
452
|
const untrackExit = trackTestRunnerExit(proc);
|
|
445
453
|
const timeoutHandle = setTimeout(() => {
|
|
@@ -470,6 +478,10 @@ export class RetryHandlerService {
|
|
|
470
478
|
// report to the --outputFile; read it back rather than trusting stdout).
|
|
471
479
|
try {
|
|
472
480
|
const reportText = report ? report.read(stdout) : stdout;
|
|
481
|
+
if (parseReport) {
|
|
482
|
+
settle(resolve, parseReport(code, reportText, `${stderr}\n${stdout}`.trim()));
|
|
483
|
+
return;
|
|
484
|
+
}
|
|
473
485
|
if (reportText === undefined) {
|
|
474
486
|
throw new Error('The current Vitest JSON report is missing for the retry run.');
|
|
475
487
|
}
|
|
@@ -489,6 +501,33 @@ export class RetryHandlerService {
|
|
|
489
501
|
});
|
|
490
502
|
});
|
|
491
503
|
}
|
|
504
|
+
/**
|
|
505
|
+
* #1248: a pytest retry passes only when its JUnit report shows the test
|
|
506
|
+
* passed. A node id pytest cannot find (exit code 4) or no collected test
|
|
507
|
+
* (exit code 5) reran nothing.
|
|
508
|
+
*/
|
|
509
|
+
parsePytestRetry(exitCode, report, output) {
|
|
510
|
+
const failure = (text) => ({
|
|
511
|
+
passed: false,
|
|
512
|
+
error: redactFailureText(text || `pytest exited with code ${exitCode}`).substring(0, 1000),
|
|
513
|
+
});
|
|
514
|
+
if (exitCode === 4 || exitCode === 5)
|
|
515
|
+
return UNMATCHED;
|
|
516
|
+
if (report === undefined)
|
|
517
|
+
return failure(output);
|
|
518
|
+
try {
|
|
519
|
+
const cases = parsePytestJunitXml(report);
|
|
520
|
+
if (cases.length === 0)
|
|
521
|
+
return UNMATCHED;
|
|
522
|
+
const failed = cases.find(c => c.status === 'failed' || c.status === 'error');
|
|
523
|
+
if (exitCode === 0 && !failed && cases.some(c => c.status === 'passed'))
|
|
524
|
+
return { passed: true };
|
|
525
|
+
return failure(failed ? [failed.message, failed.details].filter(Boolean).join('\n') : output);
|
|
526
|
+
}
|
|
527
|
+
catch {
|
|
528
|
+
return failure(output);
|
|
529
|
+
}
|
|
530
|
+
}
|
|
492
531
|
/**
|
|
493
532
|
* Parse test runner output to determine pass/fail status
|
|
494
533
|
*/
|
|
@@ -6,6 +6,8 @@
|
|
|
6
6
|
* derived from aggregate counts.
|
|
7
7
|
*/
|
|
8
8
|
import type { ITestCaseResult } from '../interfaces';
|
|
9
|
+
/** A test case's failure text: redacted (#1122) and capped. */
|
|
10
|
+
export declare function testCaseFailureMessage(text: string): string | undefined;
|
|
9
11
|
/**
|
|
10
12
|
* #1122: failure text goes back over MCP and into saved results, so
|
|
11
13
|
* credential-shaped values (e.g. a connection string) are redacted first.
|
|
@@ -12,10 +12,14 @@ const MAX_FAILURE_MESSAGE_LENGTH = 4000;
|
|
|
12
12
|
function failureMessageOf(assertion) {
|
|
13
13
|
if (!Array.isArray(assertion.failureMessages))
|
|
14
14
|
return undefined;
|
|
15
|
-
|
|
16
|
-
|
|
15
|
+
return testCaseFailureMessage(assertion.failureMessages.filter((m) => typeof m === 'string').join('\n'));
|
|
16
|
+
}
|
|
17
|
+
/** A test case's failure text: redacted (#1122) and capped. */
|
|
18
|
+
export function testCaseFailureMessage(text) {
|
|
19
|
+
const trimmed = text.trim();
|
|
20
|
+
if (!trimmed)
|
|
17
21
|
return undefined;
|
|
18
|
-
const message = redactFailureText(
|
|
22
|
+
const message = redactFailureText(trimmed);
|
|
19
23
|
return message.length > MAX_FAILURE_MESSAGE_LENGTH
|
|
20
24
|
? `${message.slice(0, MAX_FAILURE_MESSAGE_LENGTH)}… [truncated]`
|
|
21
25
|
: message;
|
|
@@ -115,7 +115,7 @@ export declare class TestExecutorService implements ITestExecutionService {
|
|
|
115
115
|
private executeTestFiles;
|
|
116
116
|
private executeProjectFiles;
|
|
117
117
|
/**
|
|
118
|
-
* Spawn actual test runner process (vitest, jest, mocha)
|
|
118
|
+
* Spawn actual test runner process (vitest, jest, mocha, node:test, pytest)
|
|
119
119
|
*/
|
|
120
120
|
private spawnTestRunner;
|
|
121
121
|
/**
|
|
@@ -126,6 +126,10 @@ export declare class TestExecutorService implements ITestExecutionService {
|
|
|
126
126
|
* Parse test runner output to extract results
|
|
127
127
|
*/
|
|
128
128
|
private parseTestOutput;
|
|
129
|
+
/**
|
|
130
|
+
* #1248: a pytest run from its JUnit report (undefined when pytest wrote none).
|
|
131
|
+
*/
|
|
132
|
+
private parsePytestOutput;
|
|
129
133
|
/**
|
|
130
134
|
* Parse the TAP or spec summary emitted by Node's built-in test runner.
|
|
131
135
|
*/
|
|
@@ -11,17 +11,18 @@ import { isDeepStrictEqual } from 'node:util';
|
|
|
11
11
|
import { v4 as uuidv4 } from 'uuid';
|
|
12
12
|
import { ok, err } from '../../../shared/types/index.js';
|
|
13
13
|
import { TEST_EXECUTION_CONSTANTS, LLM_ANALYSIS_CONSTANTS } from '../../constants.js';
|
|
14
|
-
import { toErrorMessage, toError } from '../../../shared/error-utils.js';
|
|
14
|
+
import { CallerInputError, isCallerInputError, toErrorMessage, toError } from '../../../shared/error-utils.js';
|
|
15
15
|
import { safeJsonParse } from '../../../shared/safe-json.js';
|
|
16
16
|
import { secureRandom, secureRandomInt } from '../../../shared/utils/crypto-random.js';
|
|
17
17
|
import { writeTestRunEvidence } from '../../quality-assessment/quality-evidence.js';
|
|
18
18
|
import { istanbulLineHits } from '../../../coordination/handlers/handler-utils.js';
|
|
19
19
|
import { fileCoverageKey, projectFileCoverageKeys } from '../../coverage-analysis/collected-metrics.js';
|
|
20
|
-
import { mergeTestCases, redactFailedTests, redactFailureText, testCasesFromRunnerReport } from './runner-test-cases.js';
|
|
20
|
+
import { mergeTestCases, redactFailedTests, redactFailureText, testCaseFailureMessage, testCasesFromRunnerReport } from './runner-test-cases.js';
|
|
21
21
|
import { capDiagnostics, getTestRunnerExecutionError, TestRunnerExecutionError } from '../../../shared/test-runner-verdict.js';
|
|
22
22
|
import { createVitestJsonReport } from '../../../shared/vitest-json-report.js';
|
|
23
|
+
import { createPytestJunitReport, isPythonTestFile, pytestCommand, pytestRunFromReport, PYTEST_ENV } from '../../../shared/pytest-junit-report.js';
|
|
23
24
|
import { jestExactPathPattern, runnerFilePath } from '../../../shared/test-runner-args.js';
|
|
24
|
-
import { groupByRunnerProject } from '../../../shared/test-runner-project.js';
|
|
25
|
+
import { groupByRunnerProject, runnerFrameworkFor } from '../../../shared/test-runner-project.js';
|
|
25
26
|
import { getClaudeModelForTier } from '../../../shared/llm/model-registry.js';
|
|
26
27
|
import { terminateTestRunner, trackTestRunnerExit } from '../../../shared/test-runner-process.js';
|
|
27
28
|
const DEFAULT_CONFIG = {
|
|
@@ -315,7 +316,7 @@ Provide:
|
|
|
315
316
|
return ok(undefined);
|
|
316
317
|
}
|
|
317
318
|
async runTests(request) {
|
|
318
|
-
const { testFiles, framework, timeout = 30000, projectRoot } = request;
|
|
319
|
+
const { testFiles, framework, timeout = 30000, projectRoot, frameworkFromConfig } = request;
|
|
319
320
|
const failedTests = [];
|
|
320
321
|
const coverages = [];
|
|
321
322
|
const allFileCoverages = [];
|
|
@@ -324,7 +325,7 @@ Provide:
|
|
|
324
325
|
let failed = 0;
|
|
325
326
|
let skipped = 0;
|
|
326
327
|
for (const file of testFiles) {
|
|
327
|
-
const result = await this.executeTestFile(file, framework, timeout, projectRoot);
|
|
328
|
+
const result = await this.executeTestFile(file, framework, timeout, projectRoot, frameworkFromConfig);
|
|
328
329
|
executionResults.push(result);
|
|
329
330
|
passed += result.passed;
|
|
330
331
|
failed += result.failed;
|
|
@@ -394,25 +395,40 @@ Provide:
|
|
|
394
395
|
const coverage = this.extractCoverageFromJson({ coverageMap: merged });
|
|
395
396
|
return coverage.summary ? { summary: coverage.summary, perFile: coverage.perFile } : undefined;
|
|
396
397
|
}
|
|
397
|
-
async executeTestFile(file, framework, timeout, projectRoot) {
|
|
398
|
-
return this.executeTestFiles([file], framework, timeout, projectRoot);
|
|
398
|
+
async executeTestFile(file, framework, timeout, projectRoot, frameworkFromConfig = false) {
|
|
399
|
+
return this.executeTestFiles([file], framework, timeout, projectRoot, frameworkFromConfig);
|
|
399
400
|
}
|
|
400
|
-
async executeTestFiles(files, framework, timeout, projectRoot) {
|
|
401
|
+
async executeTestFiles(files, framework, timeout, projectRoot, frameworkFromConfig = false) {
|
|
401
402
|
// In simulation mode (for unit testing), use random behavior
|
|
402
403
|
if (this.config.simulateForTesting) {
|
|
403
404
|
return this.aggregateResults(files.map(file => this.simulateTestExecution(file)));
|
|
404
405
|
}
|
|
405
406
|
// #1247: a runner loads the config of the directory it starts in, so each
|
|
406
407
|
// file runs from its own runner project (or the caller's projectRoot).
|
|
408
|
+
// #1248: Python files run apart from the others, with pytest.
|
|
407
409
|
const groups = projectRoot
|
|
408
|
-
? [
|
|
410
|
+
? [files.filter(isPythonTestFile), files.filter(file => !isPythonTestFile(file))]
|
|
411
|
+
.filter(group => group.length > 0)
|
|
412
|
+
.map(group => ({ cwd: projectRoot, files: group }))
|
|
409
413
|
: groupByRunnerProject(files);
|
|
414
|
+
// #1272: an explicit framework wins; otherwise the project's config decides.
|
|
415
|
+
// #1248: Python files run with pytest, never with a JavaScript runner.
|
|
416
|
+
const frameworkIn = (group) => {
|
|
417
|
+
if (group.files.some(isPythonTestFile)) {
|
|
418
|
+
if (frameworkFromConfig || framework.toLowerCase() === 'pytest')
|
|
419
|
+
return 'pytest';
|
|
420
|
+
throw new TestRunnerExecutionError(`Python test files cannot run with ${framework}: ${group.files.filter(isPythonTestFile).join(', ')}. ` +
|
|
421
|
+
`Use framework 'pytest', or leave the framework unset.`);
|
|
422
|
+
}
|
|
423
|
+
return (frameworkFromConfig ? runnerFrameworkFor(group.cwd) : undefined) ?? framework;
|
|
424
|
+
};
|
|
410
425
|
if (groups.length === 1) {
|
|
411
|
-
return this.executeProjectFiles(groups[0].files,
|
|
426
|
+
return this.executeProjectFiles(groups[0].files, frameworkIn(groups[0]), timeout, groups[0].cwd);
|
|
412
427
|
}
|
|
413
428
|
// Each project gets its own runner and timeout. Their coverage maps are
|
|
414
429
|
// merged from raw counters, or left unmeasured (#1030).
|
|
415
|
-
const
|
|
430
|
+
const frameworks = groups.map(frameworkIn);
|
|
431
|
+
const results = await Promise.all(groups.map((group, index) => this.executeProjectFiles(group.files, frameworks[index], timeout, group.cwd)));
|
|
416
432
|
const combined = this.aggregateResults(results);
|
|
417
433
|
const merged = this.mergeSequentialCoverage(results);
|
|
418
434
|
combined.coverage = merged?.summary;
|
|
@@ -426,6 +442,10 @@ Provide:
|
|
|
426
442
|
// Runner/suite errors have no trustworthy assertion receipt to aggregate.
|
|
427
443
|
if (result.error instanceof TestRunnerExecutionError)
|
|
428
444
|
throw result.error;
|
|
445
|
+
// #1147: the caller's input (a test file that does not exist) is not a
|
|
446
|
+
// failed test, so it is never counted as a measured failure.
|
|
447
|
+
if (isCallerInputError(result.error))
|
|
448
|
+
throw result.error;
|
|
429
449
|
// Return as a failed test rather than throwing — allows other files to still run
|
|
430
450
|
return {
|
|
431
451
|
total: files.length,
|
|
@@ -445,13 +465,13 @@ Provide:
|
|
|
445
465
|
return result.value;
|
|
446
466
|
}
|
|
447
467
|
/**
|
|
448
|
-
* Spawn actual test runner process (vitest, jest, mocha)
|
|
468
|
+
* Spawn actual test runner process (vitest, jest, mocha, node:test, pytest)
|
|
449
469
|
*/
|
|
450
470
|
async spawnTestRunner(files, framework, timeout, cwd = process.cwd()) {
|
|
451
471
|
// Verify test file exists
|
|
452
472
|
const missingFile = files.find(file => !existsSync(file));
|
|
453
473
|
if (missingFile) {
|
|
454
|
-
return err(new
|
|
474
|
+
return err(new CallerInputError(`Test file not found: ${missingFile}`));
|
|
455
475
|
}
|
|
456
476
|
// Build command based on framework
|
|
457
477
|
const { command, args, report, coverageDirectory } = this.buildTestCommand(files, framework);
|
|
@@ -490,6 +510,7 @@ Provide:
|
|
|
490
510
|
env: {
|
|
491
511
|
...process.env,
|
|
492
512
|
FORCE_COLOR: '0', // Disable color codes for easier parsing
|
|
513
|
+
...PYTEST_ENV, // pytest reads any FORCE_COLOR as "force colour" (#1248)
|
|
493
514
|
CI: 'true', // Enable CI mode for consistent output
|
|
494
515
|
},
|
|
495
516
|
});
|
|
@@ -534,11 +555,15 @@ Provide:
|
|
|
534
555
|
finish(err(toError(error)));
|
|
535
556
|
return;
|
|
536
557
|
}
|
|
537
|
-
|
|
558
|
+
// #1248: pytest reports its own missing report (pytest not installed).
|
|
559
|
+
const pytest = framework.toLowerCase() === 'pytest';
|
|
560
|
+
if (reportText === undefined && !pytest) {
|
|
538
561
|
finish(err(new TestRunnerExecutionError(`The current Vitest JSON report is missing for ${fileLabel}.`)));
|
|
539
562
|
return;
|
|
540
563
|
}
|
|
541
|
-
const parseResult =
|
|
564
|
+
const parseResult = pytest
|
|
565
|
+
? this.parsePytestOutput(reportText, `${stderr}\n${stdout}`, files, code, command)
|
|
566
|
+
: this.parseTestOutput(reportText ?? '', stderr, fileLabel, framework, code);
|
|
542
567
|
// Read only this invocation's coverage artifacts. A previous or
|
|
543
568
|
// concurrent run's project coverage directory is not evidence.
|
|
544
569
|
if (parseResult.success && coverageDirectory) {
|
|
@@ -611,8 +636,14 @@ Provide:
|
|
|
611
636
|
command: process.execPath,
|
|
612
637
|
args: ['--test', ...files],
|
|
613
638
|
};
|
|
639
|
+
case 'pytest': {
|
|
640
|
+
// #1248: results come from the JUnit report file; no coverage is collected.
|
|
641
|
+
const report = createPytestJunitReport();
|
|
642
|
+
return { ...pytestCommand(files, report.path), report };
|
|
643
|
+
}
|
|
614
644
|
default: {
|
|
615
|
-
// Default to vitest
|
|
645
|
+
// Default to vitest. Python files never get here: executeTestFiles
|
|
646
|
+
// sends them to pytest or refuses the run (#1248).
|
|
616
647
|
const coverageDirectory = createCoverageDirectory();
|
|
617
648
|
let report;
|
|
618
649
|
try {
|
|
@@ -655,6 +686,43 @@ Provide:
|
|
|
655
686
|
`stdout: ${capDiagnostics(stdout, 500)}\nstderr: ${capDiagnostics(stderr, 500)}`));
|
|
656
687
|
}
|
|
657
688
|
}
|
|
689
|
+
/**
|
|
690
|
+
* #1248: a pytest run from its JUnit report (undefined when pytest wrote none).
|
|
691
|
+
*/
|
|
692
|
+
parsePytestOutput(report, output, files, exitCode, python) {
|
|
693
|
+
const run = pytestRunFromReport(report, files, exitCode, output, python);
|
|
694
|
+
if (!run.success)
|
|
695
|
+
return run;
|
|
696
|
+
const failedTests = run.value.tests
|
|
697
|
+
.filter(test => test.status === 'failed')
|
|
698
|
+
.map(test => ({
|
|
699
|
+
testId: uuidv4(),
|
|
700
|
+
testName: test.name,
|
|
701
|
+
file: test.file,
|
|
702
|
+
error: test.failureMessage ?? 'Test failed',
|
|
703
|
+
stack: test.failureMessage ?? '',
|
|
704
|
+
duration: test.duration ?? 0,
|
|
705
|
+
}));
|
|
706
|
+
const testCases = run.value.tests.map(test => {
|
|
707
|
+
const failureMessage = test.failureMessage && testCaseFailureMessage(test.failureMessage);
|
|
708
|
+
return {
|
|
709
|
+
name: test.name,
|
|
710
|
+
file: test.file,
|
|
711
|
+
status: test.status,
|
|
712
|
+
...(test.duration !== undefined ? { duration: test.duration } : {}),
|
|
713
|
+
...(failureMessage ? { failureMessage } : {}),
|
|
714
|
+
};
|
|
715
|
+
});
|
|
716
|
+
return ok({
|
|
717
|
+
total: run.value.total,
|
|
718
|
+
passed: run.value.passed,
|
|
719
|
+
failed: run.value.failed,
|
|
720
|
+
skipped: run.value.skipped,
|
|
721
|
+
failedTests,
|
|
722
|
+
testCases,
|
|
723
|
+
coverage: undefined,
|
|
724
|
+
});
|
|
725
|
+
}
|
|
658
726
|
/**
|
|
659
727
|
* Parse the TAP or spec summary emitted by Node's built-in test runner.
|
|
660
728
|
*/
|
|
@@ -1018,7 +1086,7 @@ Provide:
|
|
|
1018
1086
|
return shards;
|
|
1019
1087
|
}
|
|
1020
1088
|
async executeWorker(files, _workerIndex, _isolation, request) {
|
|
1021
|
-
return this.executeTestFiles(files, request.framework, request.timeout ?? 30000, request.projectRoot);
|
|
1089
|
+
return this.executeTestFiles(files, request.framework, request.timeout ?? 30000, request.projectRoot, request.frameworkFromConfig);
|
|
1022
1090
|
}
|
|
1023
1091
|
aggregateResults(results) {
|
|
1024
1092
|
const aggregated = {
|
|
@@ -29,6 +29,12 @@ export declare class CopilotInstaller {
|
|
|
29
29
|
private generator;
|
|
30
30
|
constructor(options: CopilotInstallerOptions);
|
|
31
31
|
install(): Promise<CopilotInstallResult>;
|
|
32
|
+
/**
|
|
33
|
+
* Replace AQE's server entry in an existing config, keeping everything else.
|
|
34
|
+
* Returns null when the file cannot be merged safely (e.g. JSONC comments,
|
|
35
|
+
* which VS Code accepts but JSON.parse does not) so the user's file is never
|
|
36
|
+
* clobbered wholesale.
|
|
37
|
+
*/
|
|
32
38
|
private mergeExistingConfig;
|
|
33
39
|
}
|
|
34
40
|
export declare function createCopilotInstaller(options: CopilotInstallerOptions): CopilotInstaller;
|
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs';
|
|
9
9
|
import { join, dirname } from 'path';
|
|
10
10
|
import { toErrorMessage } from '../shared/error-utils.js';
|
|
11
|
+
import { writeFileIfChanged } from './idempotent-write.js';
|
|
11
12
|
import { createPlatformConfigGenerator, } from './platform-config-generator.js';
|
|
12
13
|
// ============================================================================
|
|
13
14
|
// Copilot Installer Class
|
|
@@ -37,20 +38,28 @@ export class CopilotInstaller {
|
|
|
37
38
|
const mcpConfig = this.generator.generateMcpConfig('copilot', { memoryBackend: this.options.memoryBackend });
|
|
38
39
|
const configPath = join(this.projectRoot, mcpConfig.path);
|
|
39
40
|
result.configPath = configPath;
|
|
40
|
-
|
|
41
|
+
// AQE's own server entry is refreshed on every init, independent of
|
|
42
|
+
// `overwrite` (#1269): its launch config is version-pinned, and a stale one
|
|
43
|
+
// leaves VS Code serving tool schemas cached from an older server. Other
|
|
44
|
+
// servers and top-level keys in the file are preserved.
|
|
45
|
+
if (!existsSync(configPath)) {
|
|
41
46
|
const configDir = dirname(configPath);
|
|
42
47
|
if (!existsSync(configDir)) {
|
|
43
48
|
mkdirSync(configDir, { recursive: true });
|
|
44
49
|
}
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
50
|
+
writeFileSync(configPath, mcpConfig.content);
|
|
51
|
+
result.mcpConfigured = true;
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
const merged = this.mergeExistingConfig(configPath, mcpConfig.content);
|
|
55
|
+
if (merged === null) {
|
|
56
|
+
result.errors.push(`${configPath} is not plain JSON (comments?) and was left unchanged; ` +
|
|
57
|
+
`update its "agentic-qe" server entry by hand`);
|
|
49
58
|
}
|
|
50
59
|
else {
|
|
51
|
-
|
|
60
|
+
writeFileIfChanged(configPath, merged);
|
|
61
|
+
result.mcpConfigured = true;
|
|
52
62
|
}
|
|
53
|
-
result.mcpConfigured = true;
|
|
54
63
|
}
|
|
55
64
|
// Generate behavioral rules
|
|
56
65
|
const rules = this.generator.generateBehavioralRules('copilot');
|
|
@@ -71,23 +80,34 @@ export class CopilotInstaller {
|
|
|
71
80
|
}
|
|
72
81
|
return result;
|
|
73
82
|
}
|
|
83
|
+
/**
|
|
84
|
+
* Replace AQE's server entry in an existing config, keeping everything else.
|
|
85
|
+
* Returns null when the file cannot be merged safely (e.g. JSONC comments,
|
|
86
|
+
* which VS Code accepts but JSON.parse does not) so the user's file is never
|
|
87
|
+
* clobbered wholesale.
|
|
88
|
+
*/
|
|
74
89
|
mergeExistingConfig(configPath, newContent) {
|
|
90
|
+
let existing;
|
|
75
91
|
try {
|
|
76
|
-
|
|
77
|
-
const incoming = JSON.parse(newContent);
|
|
78
|
-
// Merge servers
|
|
79
|
-
if (!existing.servers) {
|
|
80
|
-
existing.servers = {};
|
|
81
|
-
}
|
|
82
|
-
Object.assign(existing.servers, incoming.servers);
|
|
83
|
-
return JSON.stringify(existing, null, 2) + '\n';
|
|
92
|
+
existing = JSON.parse(readFileSync(configPath, 'utf-8'));
|
|
84
93
|
}
|
|
85
94
|
catch {
|
|
86
|
-
|
|
87
|
-
return newContent;
|
|
95
|
+
return null;
|
|
88
96
|
}
|
|
97
|
+
if (!isPlainObject(existing))
|
|
98
|
+
return null;
|
|
99
|
+
if (existing.servers === undefined)
|
|
100
|
+
existing.servers = {};
|
|
101
|
+
if (!isPlainObject(existing.servers))
|
|
102
|
+
return null;
|
|
103
|
+
const incoming = JSON.parse(newContent);
|
|
104
|
+
Object.assign(existing.servers, incoming.servers);
|
|
105
|
+
return JSON.stringify(existing, null, 2) + '\n';
|
|
89
106
|
}
|
|
90
107
|
}
|
|
108
|
+
function isPlainObject(value) {
|
|
109
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
110
|
+
}
|
|
91
111
|
// ============================================================================
|
|
92
112
|
// Factory Function
|
|
93
113
|
// ============================================================================
|
|
@@ -13,6 +13,7 @@ import { createN8nInstaller } from './n8n-installer.js';
|
|
|
13
13
|
import { toErrorMessage } from '../shared/error-utils.js';
|
|
14
14
|
import { isNativeModuleLoadFailure, withNativeModuleRemedy } from '../shared/native-module-errors.js';
|
|
15
15
|
import { openDatabase } from '../shared/safe-db.js';
|
|
16
|
+
import { setJournalModeWithRetry } from '../shared/sqlite-journal-mode.js';
|
|
16
17
|
import { safeJsonParse } from '../shared/safe-json.js';
|
|
17
18
|
// ============================================================================
|
|
18
19
|
// Version Management
|
|
@@ -128,8 +129,9 @@ export async function initializePersistenceDatabase(projectRoot) {
|
|
|
128
129
|
const dbPath = join(dataDir, 'memory.db');
|
|
129
130
|
try {
|
|
130
131
|
const db = new Database(dbPath);
|
|
131
|
-
|
|
132
|
+
// busy_timeout first; the WAL switch retries within it (#1164).
|
|
132
133
|
db.pragma('busy_timeout = 5000');
|
|
134
|
+
setJournalModeWithRetry(db, 'WAL', 5000);
|
|
133
135
|
db.exec(`
|
|
134
136
|
CREATE TABLE IF NOT EXISTS kv_store (
|
|
135
137
|
key TEXT NOT NULL,
|