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
|
@@ -5,10 +5,10 @@
|
|
|
5
5
|
* Covers: index-code, predict-defects
|
|
6
6
|
*/
|
|
7
7
|
import { randomUUID } from 'node:crypto';
|
|
8
|
-
import { prunePredictionHistory } from '../../domains/defect-intelligence/prediction-history.js';
|
|
8
|
+
import { MAX_PREDICTION_TARGET_LENGTH, prunePredictionHistory } from '../../domains/defect-intelligence/prediction-history.js';
|
|
9
9
|
import * as path from 'path';
|
|
10
10
|
import { ok, err } from '../../shared/types/index.js';
|
|
11
|
-
import { toError } from '../../shared/error-utils.js';
|
|
11
|
+
import { CallerInputError, toError, toErrorMessage } from '../../shared/error-utils.js';
|
|
12
12
|
import { discoverSourceFiles } from './handler-utils.js';
|
|
13
13
|
import { resolveProjectRootFromPaths } from '../../domains/code-intelligence/project-root-resolver.js';
|
|
14
14
|
import { nothingIndexedError } from '../../domains/code-intelligence/index-path-guard.js';
|
|
@@ -50,6 +50,10 @@ async function collectProjectMetricsForTarget(ctx, targetPath, indexedFiles) {
|
|
|
50
50
|
async function confineTarget(taskType, target) {
|
|
51
51
|
if (!target || target === '.')
|
|
52
52
|
return ok(undefined);
|
|
53
|
+
// #1137: no path is longer than PATH_MAX; refuse before resolving, echoing or storing it.
|
|
54
|
+
if (typeof target === 'string' && target.length > MAX_PREDICTION_TARGET_LENGTH) {
|
|
55
|
+
return err(new CallerInputError(`Invalid ${taskType} payload: 'target' is ${target.length} characters; the limit is ${MAX_PREDICTION_TARGET_LENGTH}`));
|
|
56
|
+
}
|
|
53
57
|
return requirePayloadPath(taskType, 'target', target, { allowDirectory: true, allowMissing: true });
|
|
54
58
|
}
|
|
55
59
|
/**
|
|
@@ -284,6 +288,7 @@ export function registerCodeIntelligenceHandlers(ctx) {
|
|
|
284
288
|
const id = randomUUID();
|
|
285
289
|
await ctx.memory.set(`defect-intelligence:predictor:prediction:${id}`, {
|
|
286
290
|
id,
|
|
291
|
+
target: targetPath,
|
|
287
292
|
timestamp: new Date().toISOString(),
|
|
288
293
|
predictions,
|
|
289
294
|
predictionMethod: 'static-code-indicators',
|
|
@@ -291,7 +296,15 @@ export function registerCodeIntelligenceHandlers(ctx) {
|
|
|
291
296
|
filesSkipped,
|
|
292
297
|
scanStatus: filesSkipped > 0 ? 'partial' : 'complete',
|
|
293
298
|
}, { namespace: 'defect-intelligence', ttl: 86400 * 7 });
|
|
294
|
-
|
|
299
|
+
// #1137: the run is stored; a retention failure must not report it lost.
|
|
300
|
+
let retentionError;
|
|
301
|
+
try {
|
|
302
|
+
await prunePredictionHistory(ctx.memory);
|
|
303
|
+
}
|
|
304
|
+
catch (error) {
|
|
305
|
+
retentionError = toErrorMessage(error);
|
|
306
|
+
logger.warn('Defect prediction stored, but pruning older runs failed', { error: retentionError });
|
|
307
|
+
}
|
|
295
308
|
// Sort by probability descending
|
|
296
309
|
predictedDefects.sort((a, b) => b.probability - a.probability);
|
|
297
310
|
// Calculate overall risk score
|
|
@@ -326,6 +339,7 @@ export function registerCodeIntelligenceHandlers(ctx) {
|
|
|
326
339
|
scanStatus: filesSkipped > 0 ? 'partial' : 'complete',
|
|
327
340
|
predictionMethod: 'static-code-indicators',
|
|
328
341
|
estimated: true,
|
|
342
|
+
...(retentionError ? { retention: 'failed', retentionError } : {}),
|
|
329
343
|
});
|
|
330
344
|
}
|
|
331
345
|
catch (error) {
|
|
@@ -8,7 +8,7 @@ import { ok, err } from '../../shared/types/index.js';
|
|
|
8
8
|
import { toError } from '../../shared/error-utils.js';
|
|
9
9
|
import { requirePayloadPath } from '../../shared/io/payload-path-guard.js';
|
|
10
10
|
import { buildEstimatedCoverage, collectRustCoverage, findCargoRoot, isCoverageExecDisabled, isRustProject, } from './coverage-collection.js';
|
|
11
|
-
import { describeNoData, evaluateCoverageForTarget, isUnmeasured, packageFilterForTarget, resolveExistingCoverage, scopeCoverageToTarget, reconcileRecommendations, thresholdVerdict, } from './coverage-target.js';
|
|
11
|
+
import { describeNoData, describeRefusedReports, evaluateCoverageForTarget, isUnmeasured, packageFilterForTarget, resolveExistingCoverage, scopeCoverageToTarget, reconcileRecommendations, thresholdVerdict, } from './coverage-target.js';
|
|
12
12
|
import { describeEvidence, describeExcludedEntries } from './coverage-evidence.js';
|
|
13
13
|
import { randomUUID } from 'crypto';
|
|
14
14
|
import * as path from 'path';
|
|
@@ -56,7 +56,10 @@ function instrumented(files) {
|
|
|
56
56
|
function fromEvaluation(evaluation, ranTests, projectRoot) {
|
|
57
57
|
return evaluation.status === 'measured'
|
|
58
58
|
? { collected: instrumented(evaluation.files), ranTests, projectRoot, evidence: evaluation.evidence }
|
|
59
|
-
: {
|
|
59
|
+
: {
|
|
60
|
+
collected: null, ranTests, noData: evaluation.reason, projectRoot,
|
|
61
|
+
...(evaluation.refused ? { refused: evaluation.refused } : {}),
|
|
62
|
+
};
|
|
60
63
|
}
|
|
61
64
|
/**
|
|
62
65
|
* Collect coverage for a target, preferring real measurement over estimation
|
|
@@ -83,8 +86,13 @@ async function collectCoverage(targetPath) {
|
|
|
83
86
|
if (existing.status === 'evaluated') {
|
|
84
87
|
return fromEvaluation(existing.evaluation, false, existing.projectRoot);
|
|
85
88
|
}
|
|
86
|
-
|
|
87
|
-
|
|
89
|
+
// #1186: a report that exists but was refused is named in the result,
|
|
90
|
+
// whatever the run or estimate below produces.
|
|
91
|
+
const result = await collectWithoutReport(existing.target, existing.projectRoot);
|
|
92
|
+
return existing.refused.length > 0 ? { ...result, refused: existing.refused } : result;
|
|
93
|
+
}
|
|
94
|
+
/** Steps 2-3 of the cascade: no usable report exists at the project root. */
|
|
95
|
+
async function collectWithoutReport(target, projectRoot) {
|
|
88
96
|
// #569 work item 1: delegate to real instrumentation where available.
|
|
89
97
|
if (isRustProject(target)) {
|
|
90
98
|
const rust = await collectRustCoverage(target);
|
|
@@ -171,9 +179,9 @@ async function collectCoverage(targetPath) {
|
|
|
171
179
|
};
|
|
172
180
|
}
|
|
173
181
|
/** Caller-facing explanation for a result with no coverage figures. */
|
|
174
|
-
function noDataWarning(reason, ranTests, targetPath, projectRoot) {
|
|
182
|
+
function noDataWarning(reason, ranTests, targetPath, projectRoot, refused = []) {
|
|
175
183
|
if (reason)
|
|
176
|
-
return describeNoData(reason, targetPath, projectRoot);
|
|
184
|
+
return describeNoData(reason, targetPath, projectRoot, refused);
|
|
177
185
|
return ranTests
|
|
178
186
|
? 'Tests ran but no coverage output was generated. Ensure a coverage provider is configured (e.g., @vitest/coverage-v8, istanbul).'
|
|
179
187
|
: 'No coverage data found and could not run tests automatically. ' + estimationGuidance(targetPath);
|
|
@@ -213,7 +221,9 @@ export function registerCoverageHandlers(ctx) {
|
|
|
213
221
|
}
|
|
214
222
|
const analyzer = ctx.getCoverageAnalyzer();
|
|
215
223
|
const threshold = payload.threshold || 80;
|
|
216
|
-
const { collected, ranTests, noData, projectRoot, notes, runStatus, testRun, evidence } = await collectCoverage(targetPath);
|
|
224
|
+
const { collected, ranTests, noData, projectRoot, notes, runStatus, testRun, evidence, refused } = await collectCoverage(targetPath);
|
|
225
|
+
// #1186: a refused report is named, never reported as a missing one.
|
|
226
|
+
const refusedNote = refused?.length && noData !== 'refused-report' ? [describeRefusedReports(refused)] : [];
|
|
217
227
|
// #995 review N5: say so plainly instead of "no coverage data found".
|
|
218
228
|
if (noData === 'target-missing') {
|
|
219
229
|
return err(new Error(describeNoData('target-missing', targetPath, null)));
|
|
@@ -234,7 +244,10 @@ export function registerCoverageHandlers(ctx) {
|
|
|
234
244
|
// #995(d): "no measurement exists for this target", distinct from 0%.
|
|
235
245
|
...(unmeasured ? { unmeasured: true } : {}),
|
|
236
246
|
algorithm: 'sublinear-O(log n)',
|
|
237
|
-
warning:
|
|
247
|
+
warning: [
|
|
248
|
+
...refusedNote,
|
|
249
|
+
notes?.length ? notes.join(' ') : noDataWarning(noData, ranTests, targetPath, projectRoot, refused),
|
|
250
|
+
].join(' '),
|
|
238
251
|
});
|
|
239
252
|
}
|
|
240
253
|
const { data: coverageData, provenance } = collected;
|
|
@@ -283,7 +296,7 @@ export function registerCoverageHandlers(ctx) {
|
|
|
283
296
|
// sources, leave the evidence insufficient: the figures stand for the
|
|
284
297
|
// measured files only, and the threshold is not met on them.
|
|
285
298
|
const evidenceReasons = describeEvidence(evidence, projectRoot ?? targetPath);
|
|
286
|
-
const warnings = [...provenance.notes, ...(notes ?? [])];
|
|
299
|
+
const warnings = [...refusedNote, ...provenance.notes, ...(notes ?? [])];
|
|
287
300
|
if (provenance.estimated)
|
|
288
301
|
warnings.push(estimationGuidance(targetPath));
|
|
289
302
|
if (evidenceReasons.length > 0) {
|
|
@@ -19,6 +19,7 @@
|
|
|
19
19
|
* and the CLI `coverage` command can share it.
|
|
20
20
|
*/
|
|
21
21
|
import type { CoverageData, FileCoverage } from '../../domains/coverage-analysis/interfaces';
|
|
22
|
+
import { type RefusedCoverageReport } from './handler-utils';
|
|
22
23
|
import { type CoverageEvidence } from './coverage-evidence';
|
|
23
24
|
/**
|
|
24
25
|
* Walk up from a target to the nearest directory that holds a project marker.
|
|
@@ -52,6 +53,14 @@ export declare function isCoverageReportFile(filePath: string): boolean;
|
|
|
52
53
|
* can't be parsed, or lists no files.
|
|
53
54
|
*/
|
|
54
55
|
export declare function loadCoverageReportFile(filePath: string): Promise<CoverageData | null>;
|
|
56
|
+
/**
|
|
57
|
+
* `loadCoverageReportFile`, plus why the report was refused unread when it
|
|
58
|
+
* was (#1186), so a refused report is not described as an unparseable one.
|
|
59
|
+
*/
|
|
60
|
+
export declare function readCoverageReportFile(filePath: string): Promise<{
|
|
61
|
+
data: CoverageData | null;
|
|
62
|
+
refused?: RefusedCoverageReport;
|
|
63
|
+
}>;
|
|
55
64
|
/**
|
|
56
65
|
* Keep only the report entries that lie under `target`.
|
|
57
66
|
*
|
|
@@ -67,6 +76,8 @@ export type NoDataReason =
|
|
|
67
76
|
'target-missing'
|
|
68
77
|
/** A coverage report was given but cannot be parsed (malformed, raw V8, empty). */
|
|
69
78
|
| 'unreadable-report'
|
|
79
|
+
/** A coverage report exists but was refused unread (#1186): see `refused`. */
|
|
80
|
+
| 'refused-report'
|
|
70
81
|
/** The report lists only test files. */
|
|
71
82
|
| 'test-only-report'
|
|
72
83
|
/** The report has no entries under the target — it did not measure it. */
|
|
@@ -80,6 +91,7 @@ export type CoverageEvaluation = {
|
|
|
80
91
|
} | {
|
|
81
92
|
status: 'no-data';
|
|
82
93
|
reason: NoDataReason;
|
|
94
|
+
refused?: RefusedCoverageReport[];
|
|
83
95
|
};
|
|
84
96
|
/**
|
|
85
97
|
* Decide what a report says about `target`. Shared by the MCP handler and the
|
|
@@ -104,10 +116,13 @@ export declare function evaluateCoverageForTarget(report: CoverageData, projectR
|
|
|
104
116
|
export type ExistingCoverage = {
|
|
105
117
|
status: 'target-missing';
|
|
106
118
|
target: string;
|
|
107
|
-
}
|
|
119
|
+
}
|
|
120
|
+
/** `refused`: reports that exist but were not read (#1186); empty when none exists. */
|
|
121
|
+
| {
|
|
108
122
|
status: 'no-report';
|
|
109
123
|
target: string;
|
|
110
124
|
projectRoot: string;
|
|
125
|
+
refused: RefusedCoverageReport[];
|
|
111
126
|
} | {
|
|
112
127
|
status: 'evaluated';
|
|
113
128
|
target: string;
|
|
@@ -159,6 +174,11 @@ export declare function reconcileRecommendations(recommendations: string[], verd
|
|
|
159
174
|
}): string[];
|
|
160
175
|
/** Is this verdict "no measurement exists" (as opposed to an error or test-only report)? */
|
|
161
176
|
export declare function isUnmeasured(reason: NoDataReason): boolean;
|
|
177
|
+
/**
|
|
178
|
+
* Why existing coverage reports were not used (#1186). A refused report is
|
|
179
|
+
* named with its reason, never described as a missing one. Shared by MCP and CLI.
|
|
180
|
+
*/
|
|
181
|
+
export declare function describeRefusedReports(refused: readonly RefusedCoverageReport[]): string;
|
|
162
182
|
/** Caller-facing explanation of a no-data verdict. Shared by MCP and CLI. */
|
|
163
|
-
export declare function describeNoData(reason: NoDataReason, target: string, projectRoot: string | null): string;
|
|
183
|
+
export declare function describeNoData(reason: NoDataReason, target: string, projectRoot: string | null, refused?: readonly RefusedCoverageReport[]): string;
|
|
164
184
|
//# sourceMappingURL=coverage-target.d.ts.map
|
|
@@ -19,10 +19,10 @@
|
|
|
19
19
|
* and the CLI `coverage` command can share it.
|
|
20
20
|
*/
|
|
21
21
|
import * as fs from 'fs';
|
|
22
|
-
import { readConfinedText, readConfinedTextSync } from '../../shared/io/confined-read.js';
|
|
22
|
+
import { ConfinedReadError, readConfinedText, readConfinedTextSync } from '../../shared/io/confined-read.js';
|
|
23
23
|
import * as os from 'os';
|
|
24
24
|
import * as path from 'path';
|
|
25
|
-
import {
|
|
25
|
+
import { findCoverageReport, parseCoberturaXml, parseCoverageJson, parseCoverageSummaryJson, parseLcovInfo, } from './handler-utils.js';
|
|
26
26
|
import { isTestPath } from './coverage-collection.js';
|
|
27
27
|
import { assessCoverageEvidence } from './coverage-evidence.js';
|
|
28
28
|
import { findProjectRoot } from '../../kernel/project-root.js';
|
|
@@ -327,15 +327,28 @@ export function isCoverageReportFile(filePath) {
|
|
|
327
327
|
* can't be parsed, or lists no files.
|
|
328
328
|
*/
|
|
329
329
|
export async function loadCoverageReportFile(filePath) {
|
|
330
|
+
return (await readCoverageReportFile(filePath)).data;
|
|
331
|
+
}
|
|
332
|
+
/**
|
|
333
|
+
* `loadCoverageReportFile`, plus why the report was refused unread when it
|
|
334
|
+
* was (#1186), so a refused report is not described as an unparseable one.
|
|
335
|
+
*/
|
|
336
|
+
export async function readCoverageReportFile(filePath) {
|
|
330
337
|
let content;
|
|
331
338
|
try {
|
|
332
339
|
// #1161: read from the validated descriptor, not the name checked earlier;
|
|
333
340
|
// a report linked out of the project, or to a device, is not read.
|
|
334
341
|
content = await readConfinedText(filePath, { outsideRoot: 'allow' });
|
|
335
342
|
}
|
|
336
|
-
catch {
|
|
337
|
-
|
|
343
|
+
catch (error) {
|
|
344
|
+
if (error instanceof ConfinedReadError && error.reason !== 'not-found') {
|
|
345
|
+
return { data: null, refused: { path: filePath, reason: error.reason } };
|
|
346
|
+
}
|
|
347
|
+
return { data: null };
|
|
338
348
|
}
|
|
349
|
+
return { data: parseCoverageReportContent(filePath, content) };
|
|
350
|
+
}
|
|
351
|
+
function parseCoverageReportContent(filePath, content) {
|
|
339
352
|
if (content.trim().length === 0)
|
|
340
353
|
return null;
|
|
341
354
|
try {
|
|
@@ -469,17 +482,19 @@ export async function resolveExistingCoverage(targetPath) {
|
|
|
469
482
|
const reportDir = path.dirname(target);
|
|
470
483
|
const projectRoot = findCoverageProjectRoot(reportDir)
|
|
471
484
|
?? (path.basename(reportDir) === 'coverage' ? path.dirname(reportDir) : reportDir);
|
|
472
|
-
const report = await
|
|
485
|
+
const { data: report, refused } = await readCoverageReportFile(target);
|
|
473
486
|
// The report itself is the target: judged whole, but still checked for staleness.
|
|
474
487
|
const evaluation = report
|
|
475
488
|
? evaluateCoverageForTarget(report, projectRoot, projectRoot, { reportPath: target, checkCompleteness: false })
|
|
476
|
-
:
|
|
489
|
+
: refused
|
|
490
|
+
? { status: 'no-data', reason: 'refused-report', refused: [refused] }
|
|
491
|
+
: { status: 'no-data', reason: 'unreadable-report' };
|
|
477
492
|
return { status: 'evaluated', target, projectRoot, source: 'report-file', evaluation };
|
|
478
493
|
}
|
|
479
494
|
const projectRoot = findCoverageProjectRoot(target) ?? (stat.isDirectory() ? target : path.dirname(target));
|
|
480
|
-
const existing = await
|
|
495
|
+
const { report: existing, refused } = await findCoverageReport(projectRoot);
|
|
481
496
|
if (!existing)
|
|
482
|
-
return { status: 'no-report', target, projectRoot };
|
|
497
|
+
return { status: 'no-report', target, projectRoot, refused };
|
|
483
498
|
return {
|
|
484
499
|
status: 'evaluated', target, projectRoot, source: 'project-report',
|
|
485
500
|
evaluation: evaluateCoverageForTarget(existing.data, projectRoot, target, { reportPath: existing.path }),
|
|
@@ -526,11 +541,32 @@ export function reconcileRecommendations(recommendations, verdict, threshold, co
|
|
|
526
541
|
export function isUnmeasured(reason) {
|
|
527
542
|
return reason === 'target-not-covered' || reason === 'no-tests-ran';
|
|
528
543
|
}
|
|
544
|
+
const REFUSAL_EXPLANATIONS = {
|
|
545
|
+
'outside-project-root': 'it resolves outside the project (a symlink pointing out of it)',
|
|
546
|
+
'not-a-file': 'it is not a regular file (a FIFO, device or directory)',
|
|
547
|
+
'too-large': 'it is over the read size limit',
|
|
548
|
+
'changed-during-read': 'it was replaced or removed while it was being read',
|
|
549
|
+
'hardlinked': 'it has more than one hardlink',
|
|
550
|
+
'unreadable': 'it could not be opened (permissions)',
|
|
551
|
+
};
|
|
552
|
+
/**
|
|
553
|
+
* Why existing coverage reports were not used (#1186). A refused report is
|
|
554
|
+
* named with its reason, never described as a missing one. Shared by MCP and CLI.
|
|
555
|
+
*/
|
|
556
|
+
export function describeRefusedReports(refused) {
|
|
557
|
+
const items = refused.map(r => `${r.path} (${r.reason}: ${Object.hasOwn(REFUSAL_EXPLANATIONS, r.reason) ? REFUSAL_EXPLANATIONS[r.reason] : r.reason})`);
|
|
558
|
+
return `Coverage report refused and not read: ${items.join('; ')}. ` +
|
|
559
|
+
'Write the report as a regular file inside the project, or pass a report file inside the project as the target.';
|
|
560
|
+
}
|
|
529
561
|
/** Caller-facing explanation of a no-data verdict. Shared by MCP and CLI. */
|
|
530
|
-
export function describeNoData(reason, target, projectRoot) {
|
|
562
|
+
export function describeNoData(reason, target, projectRoot, refused = []) {
|
|
531
563
|
switch (reason) {
|
|
532
564
|
case 'target-missing':
|
|
533
565
|
return `Target does not exist: ${target}`;
|
|
566
|
+
case 'refused-report':
|
|
567
|
+
return refused.length > 0
|
|
568
|
+
? describeRefusedReports(refused)
|
|
569
|
+
: `Coverage report refused and not read: ${target}.`;
|
|
534
570
|
case 'unreadable-report':
|
|
535
571
|
return `Unreadable coverage report: ${target}. It could not be parsed or lists no files. ` +
|
|
536
572
|
'Supported: lcov.info, istanbul coverage-final.json / coverage-summary.json, Cobertura XML. ' +
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
* These were originally module-level helpers in task-executor.ts and are
|
|
5
5
|
* now co-located with the handlers that use them.
|
|
6
6
|
*/
|
|
7
|
+
import { type ConfinedReadReason } from '../../shared/io/confined-read.js';
|
|
7
8
|
import type { CoverageData } from '../../domains/coverage-analysis';
|
|
8
9
|
/**
|
|
9
10
|
* Istanbul/nyc coverage-final.json file data structure
|
|
@@ -79,6 +80,24 @@ export declare function loadCoverageReport(targetPath: string): Promise<{
|
|
|
79
80
|
data: CoverageData;
|
|
80
81
|
path: string;
|
|
81
82
|
} | null>;
|
|
83
|
+
/** A coverage report that exists but was refused unread (#1186). */
|
|
84
|
+
export interface RefusedCoverageReport {
|
|
85
|
+
path: string;
|
|
86
|
+
reason: ConfinedReadReason;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* `loadCoverageReport` plus the reports that were refused unread (#1186): a
|
|
90
|
+
* report linked out of the project, a FIFO or device, or one over the size
|
|
91
|
+
* limit is not a missing report, and the caller must be able to say why it
|
|
92
|
+
* was not used.
|
|
93
|
+
*/
|
|
94
|
+
export declare function findCoverageReport(targetPath: string): Promise<{
|
|
95
|
+
report: {
|
|
96
|
+
data: CoverageData;
|
|
97
|
+
path: string;
|
|
98
|
+
} | null;
|
|
99
|
+
refused: RefusedCoverageReport[];
|
|
100
|
+
}>;
|
|
82
101
|
/**
|
|
83
102
|
* Per-line hit counts of one istanbul file entry, computed the way istanbul's
|
|
84
103
|
* own `FileCoverage#getLineCoverage` (and therefore coverage-summary.json
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* now co-located with the handlers that use them.
|
|
6
6
|
*/
|
|
7
7
|
import * as fs from 'fs/promises';
|
|
8
|
-
import { readConfinedText } from '../../shared/io/confined-read.js';
|
|
8
|
+
import { ConfinedReadError, readConfinedText } from '../../shared/io/confined-read.js';
|
|
9
9
|
import * as path from 'path';
|
|
10
10
|
import { isAqeManagedDir } from '../../shared/aqe-managed-dirs.js';
|
|
11
11
|
import { safeJsonParse } from '../../shared/safe-json.js';
|
|
@@ -20,6 +20,16 @@ export async function loadCoverageData(targetPath) {
|
|
|
20
20
|
}
|
|
21
21
|
/** `loadCoverageData` plus the path of the report it read (#1154: staleness needs it). */
|
|
22
22
|
export async function loadCoverageReport(targetPath) {
|
|
23
|
+
return (await findCoverageReport(targetPath)).report;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* `loadCoverageReport` plus the reports that were refused unread (#1186): a
|
|
27
|
+
* report linked out of the project, a FIFO or device, or one over the size
|
|
28
|
+
* limit is not a missing report, and the caller must be able to say why it
|
|
29
|
+
* was not used.
|
|
30
|
+
*/
|
|
31
|
+
export async function findCoverageReport(targetPath) {
|
|
32
|
+
const refused = [];
|
|
23
33
|
// Try various coverage file locations (JS, Python, Java, etc.)
|
|
24
34
|
const coverageLocations = [
|
|
25
35
|
// JavaScript/TypeScript (Istanbul/nyc/vitest)
|
|
@@ -40,23 +50,27 @@ export async function loadCoverageReport(targetPath) {
|
|
|
40
50
|
// #1161: a report linked out of the project, or to a device, is not read.
|
|
41
51
|
const content = await readConfinedText(coveragePath, { outsideRoot: 'allow' });
|
|
42
52
|
if (coveragePath.endsWith('coverage-summary.json')) {
|
|
43
|
-
return { data: parseCoverageSummaryJson(content), path: coveragePath };
|
|
53
|
+
return { report: { data: parseCoverageSummaryJson(content), path: coveragePath }, refused };
|
|
44
54
|
}
|
|
45
55
|
else if (coveragePath.endsWith('.json')) {
|
|
46
|
-
return { data: parseCoverageJson(content), path: coveragePath };
|
|
56
|
+
return { report: { data: parseCoverageJson(content), path: coveragePath }, refused };
|
|
47
57
|
}
|
|
48
58
|
else if (coveragePath.endsWith('.info')) {
|
|
49
|
-
return { data: parseLcovInfo(content), path: coveragePath };
|
|
59
|
+
return { report: { data: parseLcovInfo(content), path: coveragePath }, refused };
|
|
50
60
|
}
|
|
51
61
|
else if (coveragePath.endsWith('.xml')) {
|
|
52
|
-
return { data: parseCoberturaXml(content), path: coveragePath };
|
|
62
|
+
return { report: { data: parseCoberturaXml(content), path: coveragePath }, refused };
|
|
53
63
|
}
|
|
54
64
|
}
|
|
55
|
-
catch {
|
|
56
|
-
//
|
|
65
|
+
catch (error) {
|
|
66
|
+
// Not found (or unparseable): try the next location. A refused report
|
|
67
|
+
// is recorded so it is not reported as a missing one.
|
|
68
|
+
if (error instanceof ConfinedReadError && error.reason !== 'not-found') {
|
|
69
|
+
refused.push({ path: coveragePath, reason: error.reason });
|
|
70
|
+
}
|
|
57
71
|
}
|
|
58
72
|
}
|
|
59
|
-
return null;
|
|
73
|
+
return { report: null, refused };
|
|
60
74
|
}
|
|
61
75
|
/**
|
|
62
76
|
* Per-line hit counts of one istanbul file entry, computed the way istanbul's
|
|
@@ -11,10 +11,11 @@ import { toError } from '../../shared/error-utils.js';
|
|
|
11
11
|
import { capDiagnostics, getTestRunnerExecutionError, TestRunnerExecutionError } from '../../shared/test-runner-verdict.js';
|
|
12
12
|
import { createVitestJsonReport } from '../../shared/vitest-json-report.js';
|
|
13
13
|
import { jestExactPathPattern, runnerFilePath } from '../../shared/test-runner-args.js';
|
|
14
|
-
import { testCasesFromRunnerReport } from '../../domains/test-execution/services/runner-test-cases.js';
|
|
14
|
+
import { testCaseFailureMessage, testCasesFromRunnerReport } from '../../domains/test-execution/services/runner-test-cases.js';
|
|
15
|
+
import { createPytestJunitReport, isPythonTestFile, pytestCommand, pytestRunFromReport, PYTEST_ENV } from '../../shared/pytest-junit-report.js';
|
|
15
16
|
import { runTestRunnerProcess } from '../../shared/test-runner-process.js';
|
|
16
17
|
import { MAX_PAYLOAD_FILE_BYTES, requirePayloadFiles } from '../../shared/io/payload-path-guard.js';
|
|
17
|
-
import { groupByRunnerProject, requireTestRunTargets } from '../../shared/test-runner-project.js';
|
|
18
|
+
import { groupByRunnerProject, requireTestRunTargets, runnerFrameworkFor } from '../../shared/test-runner-project.js';
|
|
18
19
|
function escapeRegExp(s) {
|
|
19
20
|
return s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
20
21
|
}
|
|
@@ -58,36 +59,76 @@ export function rewriteTempPathsInGeneratedTest(testCode, sourceFile, tempPath,
|
|
|
58
59
|
const newRef = sourceFile === tempPath ? (originalFilePath || sourceFile) : sourceFile;
|
|
59
60
|
return { testCode: newCode, sourceFile: newRef };
|
|
60
61
|
}
|
|
62
|
+
/** #1248: run Python test files with pytest, reading its JUnit report. */
|
|
63
|
+
async function runPytestTests(testFiles, cwd) {
|
|
64
|
+
const report = createPytestJunitReport();
|
|
65
|
+
try {
|
|
66
|
+
const { command, args } = pytestCommand(testFiles.map(file => runnerFilePath(file)), report.path);
|
|
67
|
+
const execution = await runTestRunnerProcess(command, args, { cwd, timeout: 120000, env: { ...process.env, ...PYTEST_ENV } });
|
|
68
|
+
const output = [execution.stderr, execution.stdout].filter(Boolean).join('\n');
|
|
69
|
+
if (execution.error || execution.signal) {
|
|
70
|
+
const reason = execution.error?.message ?? `Terminated by ${execution.signal}`;
|
|
71
|
+
return err(new TestRunnerExecutionError(`pytest could not complete: ${capDiagnostics(`${reason}\n${output}`)}`));
|
|
72
|
+
}
|
|
73
|
+
const run = pytestRunFromReport(report.read(), testFiles, execution.status, output, command);
|
|
74
|
+
if (!run.success)
|
|
75
|
+
return run;
|
|
76
|
+
const testCases = run.value.tests.map(test => {
|
|
77
|
+
const failureMessage = test.failureMessage && testCaseFailureMessage(test.failureMessage);
|
|
78
|
+
return {
|
|
79
|
+
name: test.name, file: test.file, status: test.status,
|
|
80
|
+
...(test.duration !== undefined ? { duration: test.duration } : {}),
|
|
81
|
+
...(failureMessage ? { failureMessage } : {}),
|
|
82
|
+
};
|
|
83
|
+
});
|
|
84
|
+
const { total, passed, failed, skipped } = run.value;
|
|
85
|
+
return ok({ total, passed, failed, skipped, testCases });
|
|
86
|
+
}
|
|
87
|
+
finally {
|
|
88
|
+
report.cleanup();
|
|
89
|
+
}
|
|
90
|
+
}
|
|
61
91
|
/**
|
|
62
92
|
* Run `testFiles` (paths relative to the process cwd, or absolute) with the
|
|
63
93
|
* runner started in `cwd`.
|
|
64
94
|
*/
|
|
65
95
|
async function runProjectTests(testFiles, cwd) {
|
|
96
|
+
if (testFiles.some(isPythonTestFile))
|
|
97
|
+
return runPytestTests(testFiles, cwd);
|
|
66
98
|
// #1074: run the runner asynchronously so the MCP server keeps serving
|
|
67
99
|
// other requests (task_status, task_cancel, ...) during the test run.
|
|
68
100
|
const options = { cwd, timeout: 120000 };
|
|
101
|
+
const runJest = () => runTestRunnerProcess('npx', ['jest', ...testFiles.map(file => jestExactPathPattern(file)), '--json'], options);
|
|
69
102
|
let runner = 'vitest';
|
|
70
|
-
// Vitest 5 writes the JSON report to a file rather than stdout; an explicit
|
|
71
|
-
// --outputFile gives Vitest 4 and 5 the same contract.
|
|
72
|
-
const report = createVitestJsonReport();
|
|
73
103
|
let execution;
|
|
74
|
-
let output;
|
|
75
|
-
|
|
76
|
-
// #
|
|
77
|
-
execution = await runTestRunnerProcess('npx', ['vitest', 'run', ...testFiles.map(file => runnerFilePath(file)), '--reporter=json', ...report.args], options);
|
|
78
|
-
output = execution.error || execution.signal
|
|
79
|
-
? ''
|
|
80
|
-
: report.read(execution.stdout || '') ?? '';
|
|
81
|
-
}
|
|
82
|
-
finally {
|
|
83
|
-
report.cleanup();
|
|
84
|
-
}
|
|
85
|
-
// Preserve the existing Jest fallback when Vitest cannot produce a report.
|
|
86
|
-
if (!output.includes('{') && execution.status !== 0 && !execution.error && !execution.signal) {
|
|
104
|
+
let output = '';
|
|
105
|
+
if (runnerFrameworkFor(cwd) === 'jest') {
|
|
106
|
+
// #1272: a project configured for Jest runs with Jest, never Vitest first.
|
|
87
107
|
runner = 'jest';
|
|
88
|
-
execution = await
|
|
108
|
+
execution = await runJest();
|
|
89
109
|
output = execution.stdout || '';
|
|
90
110
|
}
|
|
111
|
+
else {
|
|
112
|
+
// Vitest 5 writes the JSON report to a file rather than stdout; an explicit
|
|
113
|
+
// --outputFile gives Vitest 4 and 5 the same contract.
|
|
114
|
+
const report = createVitestJsonReport();
|
|
115
|
+
try {
|
|
116
|
+
// #909: absolute paths cannot be read as flags (e.g. a "--watch" entry).
|
|
117
|
+
execution = await runTestRunnerProcess('npx', ['vitest', 'run', ...testFiles.map(file => runnerFilePath(file)), '--reporter=json', ...report.args], options);
|
|
118
|
+
output = execution.error || execution.signal
|
|
119
|
+
? ''
|
|
120
|
+
: report.read(execution.stdout || '') ?? '';
|
|
121
|
+
}
|
|
122
|
+
finally {
|
|
123
|
+
report.cleanup();
|
|
124
|
+
}
|
|
125
|
+
// Preserve the existing Jest fallback when Vitest cannot produce a report.
|
|
126
|
+
if (!output.includes('{') && execution.status !== 0 && !execution.error && !execution.signal) {
|
|
127
|
+
runner = 'jest';
|
|
128
|
+
execution = await runJest();
|
|
129
|
+
output = execution.stdout || '';
|
|
130
|
+
}
|
|
131
|
+
}
|
|
91
132
|
const diagnostics = [execution.error?.message, execution.signal && `Terminated by ${execution.signal}`, execution.stderr, output].filter(Boolean).join('\n');
|
|
92
133
|
if (execution.error) {
|
|
93
134
|
return err(new TestRunnerExecutionError(`${runner} could not complete: ${capDiagnostics(diagnostics)}`));
|
|
@@ -286,8 +327,11 @@ export function registerTestExecutionHandlers(ctx) {
|
|
|
286
327
|
}
|
|
287
328
|
// #1247: a runner loads the config of the directory it starts in, so
|
|
288
329
|
// each runner project's files run from that project (or projectRoot).
|
|
330
|
+
// #1248: Python files run apart from the others, with pytest.
|
|
289
331
|
const groups = projectRoot
|
|
290
|
-
? [
|
|
332
|
+
? [testFiles.filter(isPythonTestFile), testFiles.filter(file => !isPythonTestFile(file))]
|
|
333
|
+
.filter(files => files.length > 0)
|
|
334
|
+
.map(files => ({ cwd: projectRoot, files }))
|
|
291
335
|
: groupByRunnerProject(testFiles);
|
|
292
336
|
const totals = { total: 0, passed: 0, failed: 0, skipped: 0 };
|
|
293
337
|
const testCases = [];
|
|
@@ -217,11 +217,14 @@ export class CodeIntelligenceIndexProtocol {
|
|
|
217
217
|
if (uncommittedFiles.length > 0) {
|
|
218
218
|
changedFiles.push(...uncommittedFiles);
|
|
219
219
|
}
|
|
220
|
-
// Then, get committed changes since last index
|
|
220
|
+
// Then, get committed changes since last index. #1165: a git failure or
|
|
221
|
+
// timeout fails the detection; indexing without the committed changes
|
|
222
|
+
// would record a new last-index time and skip them for good.
|
|
221
223
|
const gitChanges = await this.detectGitChanges(lastIndexTime);
|
|
222
|
-
if (gitChanges.success) {
|
|
223
|
-
|
|
224
|
+
if (!gitChanges.success) {
|
|
225
|
+
return gitChanges;
|
|
224
226
|
}
|
|
227
|
+
changedFiles.push(...gitChanges.value);
|
|
225
228
|
// Deduplicate
|
|
226
229
|
const uniqueFiles = [...new Set(changedFiles)];
|
|
227
230
|
return ok(uniqueFiles);
|
|
@@ -12,8 +12,9 @@
|
|
|
12
12
|
* - The active record must still be the selected pattern (same id, and the
|
|
13
13
|
* same scores and last use) when the archive runs, or nothing is written or
|
|
14
14
|
* deleted. A pattern used or re-scored since it was selected is left active.
|
|
15
|
-
* - The archive copy is read back
|
|
16
|
-
* failed write never loses the pattern
|
|
15
|
+
* - The archive copy is read back and compared in full before the active
|
|
16
|
+
* key is deleted, so a failed write never loses the pattern; the delete is
|
|
17
|
+
* a compare-and-delete against that copy (#1149).
|
|
17
18
|
* The move is implemented in domains/learning-optimization/pattern-archive.ts.
|
|
18
19
|
*/
|
|
19
20
|
import type { LearnedPattern } from '../../domains/learning-optimization/interfaces.js';
|
|
@@ -24,8 +25,10 @@ export interface ArchiveCounts {
|
|
|
24
25
|
selected: number;
|
|
25
26
|
/** Selected patterns moved to `:archived:` and removed from the active set. */
|
|
26
27
|
archived: number;
|
|
27
|
-
/** Selected patterns whose active record was gone
|
|
28
|
+
/** Selected patterns whose active record was gone; nothing written. */
|
|
28
29
|
missing: number;
|
|
30
|
+
/** Selected patterns changed since selection or during the move; left active (#1149). */
|
|
31
|
+
changed: number;
|
|
29
32
|
/** Selected patterns whose archive copy could not be verified; left active. */
|
|
30
33
|
failed: number;
|
|
31
34
|
}
|
|
@@ -12,15 +12,16 @@
|
|
|
12
12
|
* - The active record must still be the selected pattern (same id, and the
|
|
13
13
|
* same scores and last use) when the archive runs, or nothing is written or
|
|
14
14
|
* deleted. A pattern used or re-scored since it was selected is left active.
|
|
15
|
-
* - The archive copy is read back
|
|
16
|
-
* failed write never loses the pattern
|
|
15
|
+
* - The archive copy is read back and compared in full before the active
|
|
16
|
+
* key is deleted, so a failed write never loses the pattern; the delete is
|
|
17
|
+
* a compare-and-delete against that copy (#1149).
|
|
17
18
|
* The move is implemented in domains/learning-optimization/pattern-archive.ts.
|
|
18
19
|
*/
|
|
19
20
|
// The move itself lives with the patterns, so the merge path in
|
|
20
21
|
// LearningCoordinatorService uses the same read-back rule (#1106).
|
|
21
22
|
export { archiveSelectedPattern } from '../../domains/learning-optimization/pattern-archive.js';
|
|
22
23
|
export function emptyArchiveCounts() {
|
|
23
|
-
return { selected: 0, archived: 0, missing: 0, failed: 0 };
|
|
24
|
+
return { selected: 0, archived: 0, missing: 0, changed: 0, failed: 0 };
|
|
24
25
|
}
|
|
25
26
|
/** True when the pattern was created less than `graceDays` days ago. */
|
|
26
27
|
export function isWithinRetentionGrace(pattern, graceDays, now = Date.now()) {
|
|
@@ -164,15 +164,20 @@ export declare class SemanticAnalyzerService implements ISemanticAnalyzerService
|
|
|
164
164
|
* vector, so vector search cannot rank them. Match those by text, label the
|
|
165
165
|
* hits 'lexical', and report the result as 'partial-vector' with the counts.
|
|
166
166
|
* Cosine and text-match scores are not comparable, so vector hits come
|
|
167
|
-
* first (by cosine), then lexical hits (by share of query words found
|
|
168
|
-
* reason says how many text matches the
|
|
167
|
+
* first (by cosine), then lexical hits (by share of query words found, ties
|
|
168
|
+
* by text relevance, #1287); the reason says how many text matches the
|
|
169
|
+
* limit left out.
|
|
169
170
|
*/
|
|
170
171
|
private withVectorlessFiles;
|
|
171
172
|
/** Word-overlap matching for a semantic query when no vectors can be used. */
|
|
172
173
|
private lexicalSearch;
|
|
173
174
|
private exactSearch;
|
|
174
175
|
private fuzzySearch;
|
|
175
|
-
/**
|
|
176
|
+
/**
|
|
177
|
+
* Token-overlap match of one indexed file, or null when it is filtered out or
|
|
178
|
+
* scores too low. The score is the share of query words found; `relevance`
|
|
179
|
+
* only orders equal scores (#1287).
|
|
180
|
+
*/
|
|
176
181
|
private fuzzyMatch;
|
|
177
182
|
private extractConcepts;
|
|
178
183
|
private detectPatterns;
|