agentic-qe 3.15.17 → 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 +123 -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-6BUOFQZA.js → agent-booster-wasm-UFNJNF3M.js} +2 -2
- package/dist/cli/chunks/{agent-handler-HPDK3JI3.js → agent-handler-EAYVRJXN.js} +2 -2
- package/dist/cli/chunks/{agent-memory-branch-5QKUTWK5.js → agent-memory-branch-M65C6WAQ.js} +2 -2
- package/dist/cli/chunks/aqe-learning-engine-O6NJBCCM.js +2 -0
- package/dist/cli/chunks/{arena-HZ35LESR.js → arena-2GDICP6R.js} +4 -4
- package/dist/cli/chunks/{arena-7OKPMNHD.js → arena-CG3X67OE.js} +2 -2
- package/dist/cli/chunks/{audit-XI575SVK.js → audit-F4FSPJPL.js} +3 -3
- package/dist/cli/chunks/base-J2FXOE77.js +2 -0
- package/dist/cli/chunks/{better-sqlite3-YO5X7ZJS.js → better-sqlite3-2MCFXW4J.js} +2 -2
- package/dist/cli/chunks/brain-handler-WGTJNYNB.js +95 -0
- package/dist/cli/chunks/{branch-enumerator-N6G44UU2.js → branch-enumerator-KL7C535H.js} +2 -2
- package/dist/cli/chunks/{browser-EVKPTLOI.js → browser-SJEXDVHS.js} +2 -2
- package/dist/cli/chunks/browser-workflow-LXGER6ZD.js +2 -0
- package/dist/cli/chunks/{chunk-VLTDW7XJ.js → chunk-244RKAEP.js} +2 -2
- package/dist/cli/chunks/{chunk-CVPXHDQU.js → chunk-27TUMXPD.js} +1 -1
- package/dist/cli/chunks/{chunk-FBBPRVNF.js → chunk-2MBYDPCP.js} +2 -2
- package/dist/cli/chunks/{chunk-P3D7SEHW.js → chunk-2Q6DTBMT.js} +1 -1
- package/dist/cli/chunks/{chunk-NE3LRUNC.js → chunk-355MI7RV.js} +13 -13
- package/dist/cli/chunks/{chunk-YCVLKU6H.js → chunk-3LX5OKBD.js} +2 -2
- package/dist/cli/chunks/{chunk-74MDUIAZ.js → chunk-3RPDKJGV.js} +1 -1
- package/dist/cli/chunks/{chunk-OWIQR6N2.js → chunk-3YMIT73A.js} +2 -2
- package/dist/cli/chunks/{chunk-VKREKVFI.js → chunk-43KUVBSU.js} +2 -2
- package/dist/cli/chunks/chunk-477FKXSS.js +2 -0
- package/dist/cli/chunks/{chunk-XPTCQKVE.js → chunk-4BIMTRRX.js} +1 -1
- package/dist/cli/chunks/{chunk-HD6W6PHV.js → chunk-4CVNVBX5.js} +2 -2
- package/dist/cli/chunks/{chunk-CQER6IJ5.js → chunk-4HL3SD4A.js} +1 -1
- package/dist/cli/chunks/{chunk-ZNXM6WVL.js → chunk-4PEG4DU2.js} +2 -2
- package/dist/cli/chunks/{chunk-BSIWI4ES.js → chunk-4QSQKFED.js} +2 -2
- package/dist/cli/chunks/chunk-53ZBETYR.js +16 -0
- package/dist/cli/chunks/{chunk-BHQ2DLJU.js → chunk-544KDWL4.js} +1 -1
- package/dist/cli/chunks/chunk-54RCGMLB.js +8 -0
- package/dist/cli/chunks/{chunk-TDZ6N43D.js → chunk-5AGXIZQ5.js} +2 -2
- package/dist/cli/chunks/{chunk-RKCN4B26.js → chunk-5M24X6W7.js} +2 -2
- package/dist/cli/chunks/{chunk-GG7PMTHD.js → chunk-5O5T4LEU.js} +1 -1
- package/dist/cli/chunks/{chunk-OWIZBZLN.js → chunk-5RFXX4IF.js} +2 -2
- package/dist/cli/chunks/{chunk-VQFV2IPV.js → chunk-62MLAQRJ.js} +1 -1
- package/dist/cli/chunks/{chunk-PCL5JRKN.js → chunk-6D6TGL2E.js} +2 -2
- package/dist/cli/chunks/{chunk-WBDWHHKP.js → chunk-6IHZDSDL.js} +2 -2
- package/dist/cli/chunks/{chunk-UOVCTK5L.js → chunk-6P3Y45QL.js} +2 -2
- package/dist/cli/chunks/{chunk-45223KK6.js → chunk-6TEVM3X3.js} +10 -10
- package/dist/cli/chunks/{chunk-K7WAI662.js → chunk-7XTUKKRA.js} +1 -1
- package/dist/cli/chunks/chunk-A3GDX6UF.js +2 -0
- package/dist/cli/chunks/{chunk-GN6OE3JT.js → chunk-A5YTKKNA.js} +1 -1
- package/dist/cli/chunks/{chunk-KR2TAAF6.js → chunk-ADNGZAT2.js} +1 -1
- package/dist/cli/chunks/{chunk-J7Q5TXFZ.js → chunk-AWQAE3SW.js} +2 -2
- package/dist/cli/chunks/{chunk-ZN35XSKF.js → chunk-AXDBQFR4.js} +2 -2
- package/dist/cli/chunks/{chunk-ND72UDVH.js → chunk-AXVD7O3F.js} +2 -2
- package/dist/cli/chunks/{chunk-SAEECT23.js → chunk-B52ULNYO.js} +2 -2
- package/dist/cli/chunks/chunk-B6S4FC7M.js +3 -0
- package/dist/cli/chunks/{chunk-Z7SKUC6P.js → chunk-BDVFSMOQ.js} +1 -1
- package/dist/cli/chunks/{chunk-CXCMATZ6.js → chunk-BGXXMX3Y.js} +2 -2
- package/dist/cli/chunks/{chunk-R3KBOQ3O.js → chunk-BKMQQY5T.js} +2 -2
- package/dist/cli/chunks/{chunk-SAZ4PJBR.js → chunk-BN2FROBQ.js} +2 -2
- package/dist/cli/chunks/{chunk-G2X3OLMN.js → chunk-BO6EQNOC.js} +2 -2
- package/dist/cli/chunks/{chunk-776K4ZLE.js → chunk-BOVAKCDC.js} +2 -2
- package/dist/cli/chunks/{chunk-QSQNXBD2.js → chunk-BSXKZDKO.js} +2 -2
- package/dist/cli/chunks/{chunk-MGZ6XZHU.js → chunk-C5QVJ5XQ.js} +1 -1
- package/dist/cli/chunks/{chunk-LOLSZG5J.js → chunk-CFQLLF3D.js} +2 -2
- package/dist/cli/chunks/{chunk-J6QRNQJF.js → chunk-DUCVLT3F.js} +7 -7
- package/dist/cli/chunks/{chunk-QTQDX4TZ.js → chunk-E4RMJCGA.js} +3 -3
- package/dist/cli/chunks/{chunk-MLMD3I75.js → chunk-EONDCWY4.js} +1 -1
- package/dist/cli/chunks/{chunk-7BSOO3CY.js → chunk-F4AGNKL2.js} +2 -2
- package/dist/cli/chunks/{chunk-IKB3M7OF.js → chunk-F6YD3BOW.js} +1 -1
- package/dist/cli/chunks/{chunk-LIF6UWHV.js → chunk-FQRS7WVA.js} +2 -2
- package/dist/cli/chunks/{chunk-QJSSUBO3.js → chunk-FT24SSDG.js} +2 -2
- package/dist/cli/chunks/chunk-FV4YNSAJ.js +5 -0
- package/dist/cli/chunks/{chunk-VITV7AEC.js → chunk-FVDM3X42.js} +2 -2
- package/dist/cli/chunks/{chunk-LN7NKE3N.js → chunk-FVH7TXWU.js} +2 -2
- package/dist/cli/chunks/{chunk-FBSBXCZS.js → chunk-FWR5QY37.js} +2 -2
- package/dist/cli/chunks/{chunk-X2DWHGCC.js → chunk-FYINK2B7.js} +2 -2
- package/dist/cli/chunks/{chunk-ECKHDHR2.js → chunk-GGISVPOZ.js} +2 -2
- package/dist/cli/chunks/{chunk-SRBCBVSI.js → chunk-GPIJIZJQ.js} +2 -2
- package/dist/cli/chunks/{chunk-YR5QBUHZ.js → chunk-GXEVOT5F.js} +2 -2
- package/dist/cli/chunks/{chunk-ZTP3DQ5M.js → chunk-GZ4VB5RI.js} +1 -1
- package/dist/cli/chunks/{chunk-HWQPMUSN.js → chunk-HBDSCYSK.js} +2 -2
- package/dist/cli/chunks/{chunk-XBTGEYED.js → chunk-HGG4HR7C.js} +2 -2
- package/dist/cli/chunks/{chunk-YD2C6EPN.js → chunk-HSCKWWO2.js} +2 -2
- package/dist/cli/chunks/{chunk-LOMT4UC2.js → chunk-HSQ3GUYJ.js} +2 -2
- package/dist/cli/chunks/{chunk-ZC3KDNJW.js → chunk-HZQBW5EM.js} +3 -3
- package/dist/cli/chunks/{chunk-SUAZ5Z47.js → chunk-IGIYANVT.js} +2 -2
- package/dist/cli/chunks/{chunk-IHQGNDMX.js → chunk-IPWMSXBF.js} +2 -2
- package/dist/cli/chunks/{chunk-6V6BD6PH.js → chunk-IWVNC7VY.js} +1 -1
- package/dist/cli/chunks/{chunk-M2YI5YUR.js → chunk-IZODXKZD.js} +2 -2
- package/dist/cli/chunks/{chunk-LG5PPJT7.js → chunk-J2MT2OJV.js} +1 -1
- package/dist/cli/chunks/{chunk-6LSZCEW2.js → chunk-JKIJVVSP.js} +1 -1
- package/dist/cli/chunks/{chunk-REY52O7J.js → chunk-JMRDT2XK.js} +1 -1
- package/dist/cli/chunks/{chunk-XEYFZLIT.js → chunk-JR2UMTKG.js} +1 -1
- package/dist/cli/chunks/{chunk-DJDVD6RM.js → chunk-K6CH4CFF.js} +2 -2
- package/dist/cli/chunks/{chunk-2PCEMDIX.js → chunk-K7KW5QB5.js} +78 -87
- package/dist/cli/chunks/{chunk-EPVPXHL7.js → chunk-KFCQP434.js} +2 -2
- package/dist/cli/chunks/{chunk-TWBZONKT.js → chunk-KH4T6STG.js} +2 -2
- package/dist/cli/chunks/{chunk-JI33PMPZ.js → chunk-KJBYZO57.js} +1 -1
- package/dist/cli/chunks/{chunk-PK34KJH7.js → chunk-KP4OKOKV.js} +2 -2
- package/dist/cli/chunks/chunk-L2MBKVSE.js +2 -0
- package/dist/cli/chunks/{chunk-JVWZAE2H.js → chunk-L3IPUIT3.js} +2 -2
- package/dist/cli/chunks/{chunk-KT2QCXO6.js → chunk-L7PSU2YN.js} +2 -2
- package/dist/cli/chunks/{chunk-HAQJFUAQ.js → chunk-LA3JPGQA.js} +2 -2
- package/dist/cli/chunks/{chunk-LV7UIK4Q.js → chunk-LC2QRN7V.js} +14 -13
- package/dist/cli/chunks/{chunk-KTORRIX3.js → chunk-LHY7TMTM.js} +2 -2
- package/dist/cli/chunks/{chunk-IJSROBM6.js → chunk-LLQ2UMF6.js} +3 -3
- package/dist/cli/chunks/{chunk-NKUHMA4T.js → chunk-LOJ7OO6W.js} +2 -2
- package/dist/cli/chunks/{chunk-OJIUIEI4.js → chunk-LPUSH3VF.js} +1 -1
- package/dist/cli/chunks/{chunk-WAOEQA3W.js → chunk-LSEC2BU7.js} +2 -2
- package/dist/cli/chunks/{chunk-YMUY3TES.js → chunk-LTGB7OIU.js} +2 -2
- package/dist/cli/chunks/{chunk-CVYPMGUM.js → chunk-LUG7YNVZ.js} +2 -2
- package/dist/cli/chunks/{chunk-YAJOBZE5.js → chunk-LWAFRYKE.js} +2 -2
- package/dist/cli/chunks/{chunk-ZP5AWQRO.js → chunk-M24ZAZ4U.js} +2 -2
- package/dist/cli/chunks/{chunk-HFZD5KLR.js → chunk-MKRKRXTX.js} +1 -1
- package/dist/cli/chunks/{chunk-4YM45Z5B.js → chunk-MNNLONAD.js} +1 -1
- package/dist/cli/chunks/{chunk-CMN7PU2H.js → chunk-MQM37KAR.js} +2 -2
- package/dist/cli/chunks/{chunk-COTQ44YO.js → chunk-MSX2OHYT.js} +2 -2
- package/dist/cli/chunks/{chunk-4UKTIQDT.js → chunk-MVYQRVLP.js} +2 -2
- package/dist/cli/chunks/{chunk-HRUHHHVR.js → chunk-MZC5WM2P.js} +2 -2
- package/dist/cli/chunks/{chunk-YKRLUTK7.js → chunk-MZRBNBB3.js} +2 -2
- package/dist/cli/chunks/{chunk-XEMCHGAJ.js → chunk-N3KQU4UC.js} +2 -2
- package/dist/cli/chunks/{chunk-DS5IFRY6.js → chunk-NKU3FFM4.js} +2 -2
- package/dist/cli/chunks/chunk-O5EWFR76.js +2 -0
- package/dist/cli/chunks/{chunk-J3QFJI2Y.js → chunk-O5RDHD5T.js} +2 -2
- package/dist/cli/chunks/chunk-O6UWIXME.js +3 -0
- package/dist/cli/chunks/{chunk-Q6F3DYZN.js → chunk-OA4EQDC4.js} +2 -2
- package/dist/cli/chunks/{chunk-NQFDJ6BT.js → chunk-OBCXCRXK.js} +1 -1
- package/dist/cli/chunks/{chunk-S3TBOKAZ.js → chunk-OHU5P25N.js} +4 -4
- package/dist/cli/chunks/{chunk-DNVRTJKB.js → chunk-OOSV2RIA.js} +2 -2
- package/dist/cli/chunks/{chunk-NZJVDOUN.js → chunk-OW23N2Y5.js} +2 -2
- package/dist/cli/chunks/{chunk-ZWUF27P4.js → chunk-OXOO3YDL.js} +2 -2
- package/dist/cli/chunks/{chunk-4L6WX5KC.js → chunk-OYGKSSSI.js} +1 -1
- package/dist/cli/chunks/{chunk-DCDSN67A.js → chunk-PGO46IIW.js} +1 -1
- package/dist/cli/chunks/{chunk-C7QLLMYI.js → chunk-PZOYQHWS.js} +1 -1
- package/dist/cli/chunks/{chunk-BKHEQIRZ.js → chunk-Q2BZSG7Z.js} +2 -2
- package/dist/cli/chunks/{chunk-5FSPELOG.js → chunk-Q7V722K5.js} +2 -2
- package/dist/cli/chunks/{chunk-2EQK7B5L.js → chunk-QZU6M5IO.js} +2 -2
- package/dist/cli/chunks/{chunk-HVT7RMGV.js → chunk-R55Y76SJ.js} +1 -1
- package/dist/cli/chunks/{chunk-POPSZDI2.js → chunk-RMEQYJPU.js} +4 -4
- package/dist/cli/chunks/{chunk-H2LHWZRE.js → chunk-RTYXFXTI.js} +2 -2
- package/dist/cli/chunks/{chunk-QN7HP2UW.js → chunk-SJF3O4FX.js} +236 -236
- package/dist/cli/chunks/{chunk-2YWYW7NU.js → chunk-SOUS7Z2H.js} +2 -2
- package/dist/cli/chunks/{chunk-U5SMBJ6F.js → chunk-SRVNR3R3.js} +2 -2
- package/dist/cli/chunks/{chunk-ZAQMRFBB.js → chunk-SU3SXMVG.js} +2 -2
- package/dist/cli/chunks/chunk-SWGPLXWW.js +32 -0
- package/dist/cli/chunks/{chunk-S3DT5TPR.js → chunk-TRB3EVH3.js} +2 -2
- package/dist/cli/chunks/{chunk-IJZFJPHS.js → chunk-TVBDUMKT.js} +2 -2
- package/dist/cli/chunks/{chunk-7SNSI4VY.js → chunk-TWTXPSFU.js} +1 -1
- package/dist/cli/chunks/{chunk-ORQ2YBRR.js → chunk-ULYUVUL2.js} +2 -2
- package/dist/cli/chunks/{chunk-MVVVGQJ6.js → chunk-UNTBVJ5X.js} +2 -2
- package/dist/cli/chunks/{chunk-5WATBVU6.js → chunk-UQAA4PHU.js} +2 -2
- package/dist/cli/chunks/{chunk-5WYZVSL2.js → chunk-UWSJVKTE.js} +1 -1
- package/dist/cli/chunks/{chunk-JHKKIJT2.js → chunk-V2LJ54KP.js} +2 -2
- package/dist/cli/chunks/{chunk-2UUZCQSD.js → chunk-VCCTTKP3.js} +2 -2
- package/dist/cli/chunks/{chunk-P4OB6WDJ.js → chunk-VEGUYUVS.js} +1 -1
- package/dist/cli/chunks/{chunk-WX4PO65Q.js → chunk-VUQPVWNK.js} +2 -2
- package/dist/cli/chunks/{chunk-IQL6XRF5.js → chunk-VVGUE2T2.js} +2 -2
- package/dist/cli/chunks/{chunk-HZ5O7G2P.js → chunk-W5ASDHJQ.js} +1 -1
- package/dist/cli/chunks/{chunk-U4S74IIZ.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-AGCS5GSO.js → chunk-WQNLXUWA.js} +6 -6
- package/dist/cli/chunks/{chunk-LRY6UIRI.js → chunk-WZVRMKG2.js} +2 -2
- package/dist/cli/chunks/{chunk-KPIPVSIP.js → chunk-X27IUWTD.js} +2 -2
- package/dist/cli/chunks/{chunk-VDEKVIP5.js → chunk-X4B345B6.js} +2 -2
- package/dist/cli/chunks/{chunk-ERYADKMZ.js → chunk-X5I2Y4VO.js} +2 -2
- package/dist/cli/chunks/{chunk-EUWG2JG4.js → chunk-X7IQIFTS.js} +2 -2
- package/dist/cli/chunks/chunk-XJN3RKUD.js +3 -0
- package/dist/cli/chunks/{chunk-JRIJM4LE.js → chunk-XQMGXTHJ.js} +3 -3
- package/dist/cli/chunks/{chunk-VYPVU3JF.js → chunk-XTSAMB2Q.js} +2 -2
- package/dist/cli/chunks/{chunk-4NKZU2JZ.js → chunk-XZLIF4O2.js} +2 -2
- package/dist/cli/chunks/{chunk-XFTX3KLE.js → chunk-Y4LSEOZ3.js} +1 -1
- package/dist/cli/chunks/{chunk-ZVMSSCTH.js → chunk-Y4YN2RXR.js} +2 -2
- package/dist/cli/chunks/{chunk-X5QD76IU.js → chunk-YDI56L35.js} +2 -2
- package/dist/cli/chunks/{chunk-LRKLATSH.js → chunk-YFILS5D5.js} +2 -2
- package/dist/cli/chunks/{chunk-AVHYJ3XP.js → chunk-YISDX6WB.js} +2 -2
- package/dist/cli/chunks/{chunk-GPPTRKEM.js → chunk-YP2GHQSV.js} +2 -2
- package/dist/cli/chunks/{chunk-OO2M2QUV.js → chunk-YSX756AM.js} +4 -4
- package/dist/cli/chunks/{chunk-E7XIMOKW.js → chunk-YWANOASW.js} +2 -2
- package/dist/cli/chunks/{chunk-UHJVZEQA.js → chunk-YYIJLG7S.js} +2 -2
- package/dist/cli/chunks/{chunk-LCWEQRZI.js → chunk-Z7SD7LXM.js} +2 -2
- package/dist/cli/chunks/{chunk-TM75GAXG.js → chunk-ZDWD73UF.js} +2 -2
- package/dist/cli/chunks/{chunk-IRHXGCQR.js → chunk-ZFT3RLA4.js} +2 -2
- package/dist/cli/chunks/{chunk-ZGV7L4MW.js → chunk-ZNTHX5G3.js} +1 -1
- package/dist/cli/chunks/{chunk-D75GLKEL.js → chunk-ZS27R7VL.js} +2 -2
- package/dist/cli/chunks/{chunk-INI3Q4CN.js → chunk-ZXHHHR7K.js} +1 -1
- package/dist/cli/chunks/{ci-3RTTTS2D.js → ci-N5MOMNXH.js} +2 -2
- package/dist/cli/chunks/{ci-config-XRUR3I4K.js → ci-config-6L2ROQCW.js} +2 -2
- package/dist/cli/chunks/{ci-output-E5IAMU2U.js → ci-output-DSRBYEIK.js} +2 -2
- package/dist/cli/chunks/{circuit-breaker-SHR2P44P.js → circuit-breaker-VRPTNBL7.js} +2 -2
- package/dist/cli/chunks/{claude-flow-setup-ZDDILFMF.js → claude-flow-setup-4YFG3FU5.js} +2 -2
- package/dist/cli/chunks/client-I3L6BKRQ.js +2 -0
- package/dist/cli/chunks/{cline-installer-BGYVUM6G.js → cline-installer-7RGYJWGN.js} +2 -2
- package/dist/cli/chunks/{code-PJ4MC3MC.js → code-ISC6NW2K.js} +3 -3
- package/dist/cli/chunks/{code-index-extractor-IW2P22YG.js → code-index-extractor-2FID75YV.js} +2 -2
- package/dist/cli/chunks/{codex-installer-A7WZ6OGL.js → codex-installer-DZ7OG6KM.js} +2 -2
- package/dist/cli/chunks/{completions-KS23WD5J.js → completions-SM3LICWK.js} +2 -2
- package/dist/cli/chunks/{complexity-analyzer-Q7GLSR2E.js → complexity-analyzer-ZWD2CTAD.js} +2 -2
- package/dist/cli/chunks/{continuedev-installer-SK55BFW2.js → continuedev-installer-AGASOA26.js} +2 -2
- package/dist/cli/chunks/{copilot-installer-3N5J3WTM.js → copilot-installer-CLPZYTQC.js} +2 -2
- package/dist/cli/chunks/core-handlers-5EFOJ37H.js +2 -0
- package/dist/cli/chunks/{cost-tracker-NENVSO4A.js → cost-tracker-7PIGQYDV.js} +2 -2
- package/dist/cli/chunks/{coverage-5L7UQWDH.js → coverage-T2GEBTYS.js} +9 -9
- package/dist/cli/chunks/cross-domain-router-65WJAKVD.js +2 -0
- package/dist/cli/chunks/{cursor-installer-XXBO2ZE6.js → cursor-installer-KXBID4MB.js} +2 -2
- package/dist/cli/chunks/daemon-43MXIVH3.js +18 -0
- package/dist/cli/chunks/{daemon-CDCQU3LR.js → daemon-VAMJLQJ5.js} +3 -3
- package/dist/cli/chunks/{dag-attention-scheduler-HOMMF7FA.js → dag-attention-scheduler-UBP4VHTA.js} +2 -2
- package/dist/cli/chunks/{detect-FXCOUG6X.js → detect-QWFIQRKI.js} +2 -2
- package/dist/cli/chunks/{dist-node-GXQ7FMTY.js → dist-node-I2GICS3W.js} +2 -2
- package/dist/cli/chunks/{domain-handler-TI3JBAPC.js → domain-handler-Z66ISB2A.js} +2 -2
- package/dist/cli/chunks/{domain-plugins-R7LTUM32.js → domain-plugins-KHMD3FKT.js} +2 -2
- package/dist/cli/chunks/{domain-transfer-LBIAFHIQ.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-HHLWTBF5.js → embedding-space-KHG6TITM.js} +2 -2
- package/dist/cli/chunks/{eval-KDOZMAXJ.js → eval-43OHU7EI.js} +2 -2
- package/dist/cli/chunks/{experience-capture-middleware-X45PECQN.js → experience-capture-middleware-KXD47H6P.js} +3 -3
- package/dist/cli/chunks/{fast-paths-462V6UUB.js → fast-paths-6D75D5KD.js} +2 -2
- package/dist/cli/chunks/{feature-flags-NIRQ4YDM.js → feature-flags-IE35Y55N.js} +2 -2
- package/dist/cli/chunks/{feature-flags-G66OT3AS.js → feature-flags-OYYHY7LS.js} +2 -2
- package/dist/cli/chunks/file-discovery-LGBTY3ID.js +2 -0
- package/dist/cli/chunks/{fleet-PXWGB7CU.js → fleet-AGVJMFGD.js} +16 -16
- package/dist/cli/chunks/{gnn-wrapper-7MUW3M5M.js → gnn-wrapper-5L66A7LW.js} +2 -2
- package/dist/cli/chunks/{heartbeat-handler-5237PB35.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-OSQPW7JP.js → hnsw-legacy-bridge-RYMWFNAH.js} +2 -2
- package/dist/cli/chunks/{hnswlib-node-GX6WG2GB.js → hnswlib-node-GG47HP2P.js} +2 -2
- package/dist/cli/chunks/{hooks-GUWHL7VC.js → hooks-FQNACS24.js} +10 -10
- package/dist/cli/chunks/hybrid-backend-AS2PNHOD.js +2 -0
- package/dist/cli/chunks/{hypergraph-engine-SRWLLCU3.js → hypergraph-engine-6BYNJQEP.js} +2 -2
- package/dist/cli/chunks/{hypergraph-handler-AVOPRHHO.js → hypergraph-handler-CYTAXZKJ.js} +3 -3
- package/dist/cli/chunks/impact-analyzer-Y4OONLFP.js +2 -0
- package/dist/cli/chunks/{init-guard-P4N6EVZS.js → init-guard-METTAV5O.js} +2 -2
- package/dist/cli/chunks/{init-handler-LRGWOJMD.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-7R2EPOQ6.js → kilocode-installer-GZV2D3FF.js} +2 -2
- package/dist/cli/chunks/{kiro-installer-QNM7DPOB.js → kiro-installer-Q4ZXUFC7.js} +2 -2
- package/dist/cli/chunks/knowledge-graph-CNL77CSZ.js +2 -0
- package/dist/cli/chunks/{learning-7OIZBPXZ.js → learning-WA2QEYL7.js} +35 -34
- package/dist/cli/chunks/{llm-router-SIDXES23.js → llm-router-GRTCHWH7.js} +4 -4
- package/dist/cli/chunks/llm-router-service-UIYTYKP6.js +2 -0
- package/dist/cli/chunks/{load-EI2E2C3S.js → load-WXN3Q7Y5.js} +2 -2
- package/dist/cli/chunks/load-test-PXLW4A5B.js +2 -0
- package/dist/cli/chunks/{mcp-IOE5WOCS.js → mcp-LIQCPSJN.js} +2 -2
- package/dist/cli/chunks/{memory-DLYGJAP7.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-WHH4YCHM.js → multi-model-executor-H54DEVRZ.js} +2 -2
- package/dist/cli/chunks/{opencode-installer-63FDZAMS.js → opencode-installer-BSQV6UAT.js} +2 -2
- package/dist/cli/chunks/{orchestrator-3LA776KK.js → orchestrator-TJDPQ4VL.js} +122 -35
- package/dist/cli/chunks/pattern-null-store-BKGTQFNF.js +2 -0
- package/dist/cli/chunks/{pattern-usage-recorder-NW54QUGI.js → pattern-usage-recorder-FOVS4M5L.js} +2 -2
- package/dist/cli/chunks/{pipeline-P3TYX6J6.js → pipeline-4AY2ZIC6.js} +2 -2
- package/dist/cli/chunks/{platform-FNA2WLI6.js → platform-FCSITYMR.js} +2 -2
- package/dist/cli/chunks/{plugin-NJS7BC2S.js → plugin-E56TV5S2.js} +2 -2
- package/dist/cli/chunks/{prime-radiant-advanced-wasm-NIAVL2OT.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-JU5C4JHY.js → protocol-handler-KRVXF4LS.js} +2 -2
- package/dist/cli/chunks/{prove-35VOSLYP.js → prove-KMFPSKGD.js} +2 -2
- package/dist/cli/chunks/qe-reasoning-bank-UEGQ3O7F.js +2 -0
- package/dist/cli/chunks/{quality-ET74X7HN.js → quality-6DBI3HLB.js} +2 -2
- package/dist/cli/chunks/{quality-gate-FEDQISNB.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-DTBPYCEB.js → ref-validation-EYIP7DHW.js} +2 -2
- package/dist/cli/chunks/{roocode-installer-LYQEMR4J.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-DJOJFPII.js → routing-handler-BWNHBYDC.js} +2 -2
- package/dist/cli/chunks/{ruvector-commands-VXYGJDPW.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-GA2ZYOEG.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-MM6YOECX.js → security-DCRGOTWU.js} +3 -3
- package/dist/cli/chunks/{shared-rvf-adapter-6AHPA3V5.js → shared-rvf-adapter-GKD74QUB.js} +2 -2
- package/dist/cli/chunks/{shared-rvf-dual-writer-EYAVY2GZ.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-A3PLB4CZ.js → standalone-memory-O7O2U5N4.js} +2 -2
- package/dist/cli/chunks/{status-handler-OSSFAP4Z.js → status-handler-BQTPJJTL.js} +2 -2
- package/dist/cli/chunks/{structural-health-PGY5XUNO.js → structural-health-4H6J4OHK.js} +2 -2
- package/dist/cli/chunks/sync-DJ4TF6QX.js +2 -0
- package/dist/cli/chunks/{sync-CWEHYGNN.js → sync-WW5TAVYW.js} +2 -2
- package/dist/cli/chunks/{task-handler-LHMQ75W4.js → task-handler-HEM4IEOW.js} +2 -2
- package/dist/cli/chunks/{task-handlers-S2TX5FTR.js → task-handlers-JRA3NXIR.js} +3 -3
- package/dist/cli/chunks/{test-4EGZZ6NJ.js → test-772ZXVG2.js} +4 -4
- package/dist/cli/chunks/test-runner-process-XGF2U3NG.js +2 -0
- package/dist/cli/chunks/{test-scheduling-YJQHH3XE.js → test-scheduling-4TRB7LZ7.js} +3 -3
- package/dist/cli/chunks/token-bootstrap-CICBIJ7T.js +2 -0
- package/dist/cli/chunks/{token-usage-WPNOJR6H.js → token-usage-B7PEKE2G.js} +2 -2
- package/dist/cli/chunks/{transformers-4MRPXCPU.js → transformers-V7X7BDZX.js} +2 -2
- package/dist/cli/chunks/tree-sitter-wasm-parser-OXPFKFZS.js +2 -0
- package/dist/cli/chunks/{types-6P5FB4EB.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-4ICTN63Y.js → upgrade-DZ4DLUQ5.js} +2 -2
- package/dist/cli/chunks/{validate-HQF5GZ7L.js → validate-4DTLIDJE.js} +2 -2
- package/dist/cli/chunks/{validate-swarm-45JYG7VW.js → validate-swarm-A26UFVIS.js} +2 -2
- package/dist/cli/chunks/visual-security-YECYZ27X.js +2 -0
- package/dist/cli/chunks/{web-tree-sitter-UOTWZLNH.js → web-tree-sitter-F2C7QRYT.js} +2 -2
- package/dist/cli/chunks/{windsurf-installer-WDWSBXGN.js → windsurf-installer-OOBTDA6W.js} +2 -2
- package/dist/cli/chunks/{witness-chain-DOYMNPC7.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-JB42X62J.js → witness-chain-verifier-OB7ZZOI3.js} +2 -2
- package/dist/cli/chunks/{witness-key-manager-LXXO6L2G.js → witness-key-manager-YCKGKGQI.js} +2 -2
- package/dist/cli/chunks/{workflow-6ARK47NF.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/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/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/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/services/test-executor.js +6 -2
- package/dist/init/init-wizard-steps.js +3 -1
- package/dist/init/phases/07-hooks.js +97 -10
- 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/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-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 +15 -0
- package/dist/learning/embedding-space-registry.js +50 -11
- 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.js +31 -7
- package/dist/learning/rvf-pattern-store.js +6 -1
- package/dist/mcp/bundle.js +570 -558
- 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/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/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/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/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-OMILP6KH.js +0 -2
- package/dist/cli/chunks/aqe-learning-engine-OXH5CCOS.js +0 -2
- package/dist/cli/chunks/base-MAK2BLTG.js +0 -2
- package/dist/cli/chunks/brain-handler-GCQZFZGQ.js +0 -95
- package/dist/cli/chunks/browser-workflow-IR3VF2TL.js +0 -2
- package/dist/cli/chunks/chunk-4EJLHNER.js +0 -12
- package/dist/cli/chunks/chunk-A4BVDYIL.js +0 -2
- package/dist/cli/chunks/chunk-BE7ZHM34.js +0 -3
- package/dist/cli/chunks/chunk-DHKSPOUQ.js +0 -16
- package/dist/cli/chunks/chunk-FAQ24UHB.js +0 -29
- package/dist/cli/chunks/chunk-IOWEBPXJ.js +0 -5
- package/dist/cli/chunks/chunk-KB34MTFZ.js +0 -3
- package/dist/cli/chunks/chunk-MCXW3DKE.js +0 -8
- package/dist/cli/chunks/chunk-O7VJ3VKD.js +0 -2
- package/dist/cli/chunks/chunk-PIWGKGWP.js +0 -3
- package/dist/cli/chunks/chunk-SFITYZLV.js +0 -7
- package/dist/cli/chunks/chunk-TIVKDIF7.js +0 -2
- package/dist/cli/chunks/client-NO5FOWT4.js +0 -2
- package/dist/cli/chunks/core-handlers-JNAZPXE2.js +0 -2
- package/dist/cli/chunks/cross-domain-router-HEBM767Z.js +0 -2
- package/dist/cli/chunks/daemon-JEBJGEUK.js +0 -18
- package/dist/cli/chunks/dream-GQDCEJMS.js +0 -2
- package/dist/cli/chunks/embed-and-insert-pattern-33KLHDD5.js +0 -3
- package/dist/cli/chunks/file-discovery-33USPLB5.js +0 -2
- package/dist/cli/chunks/heartbeat-scheduler-LIXLC5IH.js +0 -2
- package/dist/cli/chunks/hnsw-adapter-62D5UH27.js +0 -2
- package/dist/cli/chunks/hnsw-index-GSGUMQQC.js +0 -2
- package/dist/cli/chunks/hybrid-backend-FRWP4BOY.js +0 -2
- package/dist/cli/chunks/impact-analyzer-7KF3AQXV.js +0 -2
- package/dist/cli/chunks/init-wizard-XWWAXY25.js +0 -2
- package/dist/cli/chunks/kernel-ZEJPNDBW.js +0 -2
- package/dist/cli/chunks/knowledge-graph-RRZQS7KY.js +0 -2
- package/dist/cli/chunks/llm-router-service-3OSW67LC.js +0 -2
- package/dist/cli/chunks/load-test-7TRIH2WJ.js +0 -2
- package/dist/cli/chunks/memory-backend-G7ZW6Q2B.js +0 -2
- package/dist/cli/chunks/memory-handlers-TPF3KCO5.js +0 -2
- package/dist/cli/chunks/pattern-null-store-OU3ZC3NR.js +0 -2
- package/dist/cli/chunks/project-root-GMOFJEKD.js +0 -2
- package/dist/cli/chunks/protocol-executor-AD345XRO.js +0 -2
- package/dist/cli/chunks/qe-reasoning-bank-NLTP26RC.js +0 -2
- package/dist/cli/chunks/queen-coordinator-2TB4FWS6.js +0 -2
- package/dist/cli/chunks/real-embeddings-II6CXTCI.js +0 -2
- package/dist/cli/chunks/router-PLM3MWME.js +0 -2
- package/dist/cli/chunks/routing-feedback-I7VOX2HU.js +0 -2
- package/dist/cli/chunks/rvf-dual-writer-GQZHFWO2.js +0 -2
- package/dist/cli/chunks/rvf-migration-adapter-3TVKBCAM.js +0 -2
- package/dist/cli/chunks/rvf-migration-coordinator-XUHKLMT6.js +0 -2
- package/dist/cli/chunks/rvf-native-adapter-5GUTYOWS.js +0 -2
- package/dist/cli/chunks/safe-db-RZPQGLGQ.js +0 -2
- package/dist/cli/chunks/schedule-G7JMQDUX.js +0 -2
- package/dist/cli/chunks/scheduler-4SEGPCKD.js +0 -2
- package/dist/cli/chunks/sqlite-persistence-IVE4SQXR.js +0 -2
- package/dist/cli/chunks/sync-PM6D7EQF.js +0 -2
- package/dist/cli/chunks/test-runner-process-72YACW6M.js +0 -2
- package/dist/cli/chunks/token-bootstrap-DJNETMVW.js +0 -2
- package/dist/cli/chunks/tree-sitter-wasm-parser-UVWSDXFR.js +0 -2
- package/dist/cli/chunks/unified-memory-2VMGSGQL.js +0 -2
- package/dist/cli/chunks/unified-memory-hnsw-3KULVD3N.js +0 -2
- package/dist/cli/chunks/unified-persistence-QCSLU2SV.js +0 -2
- package/dist/cli/chunks/visual-security-ZYP2KPH7.js +0 -2
- package/dist/cli/chunks/witness-chain-5QRT7EMX.js +0 -2
- package/dist/cli/chunks/witness-chain-repair-CUF2AFQB.js +0 -2
- package/dist/cli/chunks/workflow-orchestrator-RYDDWIXN.js +0 -2
- package/dist/cli/chunks/wrappers-CYQBOMPL.js +0 -2
|
@@ -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
|
|
@@ -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()) {
|
|
@@ -30,6 +30,8 @@ export interface PredictionResult {
|
|
|
30
30
|
factors: string[];
|
|
31
31
|
/** ADR-051: LLM-enhanced analysis when enabled */
|
|
32
32
|
llmAnalysis?: LLMDefectAnalysis;
|
|
33
|
+
/** #1137: the run was stored, but pruning older runs failed. */
|
|
34
|
+
retention?: 'failed';
|
|
33
35
|
}
|
|
34
36
|
/**
|
|
35
37
|
* ADR-051: LLM-enhanced defect analysis result
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import type { MemoryBackend } from '../../kernel/interfaces.js';
|
|
2
2
|
export declare const MAX_PREDICTION_HISTORY = 32;
|
|
3
|
+
/** Longest `target` a prediction run may name (Linux PATH_MAX) (#1137). */
|
|
4
|
+
export declare const MAX_PREDICTION_TARGET_LENGTH = 4096;
|
|
3
5
|
type RiskLevel = 'critical' | 'high' | 'medium' | 'low' | 'info';
|
|
4
6
|
/** One file prediction as the defect-intelligence predictor recorded it. */
|
|
5
7
|
export interface DomainFilePrediction {
|
|
@@ -12,16 +14,28 @@ export interface DomainFilePrediction {
|
|
|
12
14
|
}[];
|
|
13
15
|
recommendations: string[];
|
|
14
16
|
}
|
|
17
|
+
/**
|
|
18
|
+
* #1137: the target a run for an explicit file list covers. A list too long
|
|
19
|
+
* to store as a target is identified by its digest.
|
|
20
|
+
*/
|
|
21
|
+
export declare function predictionTargetForFiles(files: readonly string[]): string;
|
|
15
22
|
/** A recorded prediction run, or `null` when the record is not a usable one. */
|
|
16
23
|
export declare function parsePredictionRecord(raw: unknown, now: number): {
|
|
17
24
|
id: string;
|
|
18
25
|
timestamp: string;
|
|
19
26
|
predictions: DomainFilePrediction[];
|
|
27
|
+
/** What the run covered; '' for runs recorded before #1137. */
|
|
28
|
+
target: string;
|
|
20
29
|
predictionMethod?: 'static-code-indicators';
|
|
21
30
|
estimated?: true;
|
|
22
31
|
filesSkipped?: number;
|
|
23
32
|
} | null;
|
|
24
|
-
/**
|
|
33
|
+
/**
|
|
34
|
+
* Bound the stored prediction runs: delete runs older than 7 days and usable
|
|
35
|
+
* runs beyond the cap. A row this version cannot parse (stamped ahead by
|
|
36
|
+
* another host's clock, or a riskLevel from a newer release) is left to its
|
|
37
|
+
* TTL rather than deleted on this version's schema (#1137).
|
|
38
|
+
*/
|
|
25
39
|
export declare function prunePredictionHistory(memory: Pick<MemoryBackend, 'search' | 'get' | 'delete'>, modelNamespace?: string): Promise<void>;
|
|
26
40
|
export {};
|
|
27
41
|
//# sourceMappingURL=prediction-history.d.ts.map
|
|
@@ -1,4 +1,7 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
1
2
|
export const MAX_PREDICTION_HISTORY = 32;
|
|
3
|
+
/** Longest `target` a prediction run may name (Linux PATH_MAX) (#1137). */
|
|
4
|
+
export const MAX_PREDICTION_TARGET_LENGTH = 4096;
|
|
2
5
|
const MAX_PREDICTION_AGE_MS = 7 * 24 * 60 * 60 * 1000;
|
|
3
6
|
const NAMESPACE = 'defect-intelligence';
|
|
4
7
|
const RISK_LEVELS = ['critical', 'high', 'medium', 'low', 'info'];
|
|
@@ -21,6 +24,16 @@ function parseFilePrediction(raw) {
|
|
|
21
24
|
: [];
|
|
22
25
|
return { file, probability, riskLevel: riskLevel, factors, recommendations };
|
|
23
26
|
}
|
|
27
|
+
/**
|
|
28
|
+
* #1137: the target a run for an explicit file list covers. A list too long
|
|
29
|
+
* to store as a target is identified by its digest.
|
|
30
|
+
*/
|
|
31
|
+
export function predictionTargetForFiles(files) {
|
|
32
|
+
const target = `files:${[...new Set(files)].sort().join(',')}`;
|
|
33
|
+
return target.length <= MAX_PREDICTION_TARGET_LENGTH
|
|
34
|
+
? target
|
|
35
|
+
: `files-sha256:${createHash('sha256').update(target).digest('hex')}`;
|
|
36
|
+
}
|
|
24
37
|
/** A recorded prediction run, or `null` when the record is not a usable one. */
|
|
25
38
|
export function parsePredictionRecord(raw, now) {
|
|
26
39
|
if (!isRecord(raw) || typeof raw.id !== 'string' || typeof raw.timestamp !== 'string')
|
|
@@ -28,6 +41,8 @@ export function parsePredictionRecord(raw, now) {
|
|
|
28
41
|
const t = Date.parse(raw.timestamp);
|
|
29
42
|
if (!Number.isFinite(t) || t > now + 60_000 || now - t > MAX_PREDICTION_AGE_MS)
|
|
30
43
|
return null;
|
|
44
|
+
if (raw.target !== undefined && (typeof raw.target !== 'string' || raw.target.length > MAX_PREDICTION_TARGET_LENGTH))
|
|
45
|
+
return null;
|
|
31
46
|
if (!Array.isArray(raw.predictions) || raw.predictions.length === 0)
|
|
32
47
|
return null;
|
|
33
48
|
const predictions = raw.predictions.map(parseFilePrediction);
|
|
@@ -35,6 +50,7 @@ export function parsePredictionRecord(raw, now) {
|
|
|
35
50
|
return null;
|
|
36
51
|
return {
|
|
37
52
|
id: raw.id, timestamp: raw.timestamp, predictions: predictions,
|
|
53
|
+
target: raw.target ?? '',
|
|
38
54
|
...(raw.predictionMethod === 'static-code-indicators' ? {
|
|
39
55
|
predictionMethod: 'static-code-indicators', estimated: true,
|
|
40
56
|
filesSkipped: typeof raw.filesSkipped === 'number' && Number.isSafeInteger(raw.filesSkipped) && raw.filesSkipped >= 0
|
|
@@ -42,26 +58,66 @@ export function parsePredictionRecord(raw, now) {
|
|
|
42
58
|
} : {}),
|
|
43
59
|
};
|
|
44
60
|
}
|
|
45
|
-
/**
|
|
61
|
+
/** Milliseconds since the epoch the record claims, or `null` when it names no parseable time. */
|
|
62
|
+
function recordTime(raw) {
|
|
63
|
+
if (!isRecord(raw) || typeof raw.timestamp !== 'string')
|
|
64
|
+
return null;
|
|
65
|
+
const t = Date.parse(raw.timestamp);
|
|
66
|
+
return Number.isFinite(t) ? t : null;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* #1137: the latest run of every target stays (with any run tied with it, so
|
|
70
|
+
* the worker still sees the ambiguity), most recently predicted targets first;
|
|
71
|
+
* the newest other runs fill what is left. Never more than the cap in total.
|
|
72
|
+
*/
|
|
73
|
+
function selectRetained(newestFirst) {
|
|
74
|
+
const latestAt = new Map();
|
|
75
|
+
const latest = [];
|
|
76
|
+
for (const run of newestFirst) {
|
|
77
|
+
const at = latestAt.get(run.target);
|
|
78
|
+
if (at === undefined)
|
|
79
|
+
latestAt.set(run.target, run.timestamp);
|
|
80
|
+
if (at === undefined || at === run.timestamp)
|
|
81
|
+
latest.push(run);
|
|
82
|
+
}
|
|
83
|
+
const keep = new Set(latest.slice(0, MAX_PREDICTION_HISTORY).map((run) => run.key));
|
|
84
|
+
for (const run of newestFirst) {
|
|
85
|
+
if (keep.size >= MAX_PREDICTION_HISTORY)
|
|
86
|
+
break;
|
|
87
|
+
keep.add(run.key);
|
|
88
|
+
}
|
|
89
|
+
return keep;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Bound the stored prediction runs: delete runs older than 7 days and usable
|
|
93
|
+
* runs beyond the cap. A row this version cannot parse (stamped ahead by
|
|
94
|
+
* another host's clock, or a riskLevel from a newer release) is left to its
|
|
95
|
+
* TTL rather than deleted on this version's schema (#1137).
|
|
96
|
+
*/
|
|
46
97
|
export async function prunePredictionHistory(memory, modelNamespace = 'defect-intelligence:predictor') {
|
|
47
98
|
const prefix = `${modelNamespace}:prediction:`;
|
|
48
99
|
const keys = await memory.search(`${prefix}*`, Number.MAX_SAFE_INTEGER, { namespace: NAMESPACE });
|
|
49
100
|
const now = Date.now();
|
|
50
101
|
const records = [];
|
|
51
|
-
const
|
|
102
|
+
const expired = [];
|
|
52
103
|
for (const found of keys) {
|
|
53
104
|
const key = found.startsWith(`${NAMESPACE}:${prefix}`) ? found.slice(NAMESPACE.length + 1) : found;
|
|
54
105
|
if (!key.startsWith(prefix))
|
|
55
106
|
continue;
|
|
56
|
-
const
|
|
107
|
+
const raw = await memory.get(key, { namespace: NAMESPACE });
|
|
108
|
+
const t = recordTime(raw);
|
|
109
|
+
if (t !== null && now - t > MAX_PREDICTION_AGE_MS) {
|
|
110
|
+
expired.push(key);
|
|
111
|
+
continue;
|
|
112
|
+
}
|
|
113
|
+
const parsed = parsePredictionRecord(raw, now);
|
|
57
114
|
if (parsed)
|
|
58
|
-
records.push({ key, timestamp: Date.parse(parsed.timestamp), id: parsed.id });
|
|
59
|
-
else
|
|
60
|
-
invalid.push(key);
|
|
115
|
+
records.push({ key, timestamp: Date.parse(parsed.timestamp), id: parsed.id, target: parsed.target });
|
|
61
116
|
}
|
|
62
117
|
records.sort((a, b) => b.timestamp - a.timestamp || (a.id === b.id ? (a.key === b.key ? 0 : a.key > b.key ? -1 : 1) : a.id > b.id ? -1 : 1));
|
|
118
|
+
const keep = selectRetained(records);
|
|
63
119
|
// Only observed immutable keys are candidates; concurrent new runs are untouched.
|
|
64
|
-
for (const key of [...
|
|
120
|
+
for (const key of [...expired, ...records.filter((record) => !keep.has(record.key)).map((record) => record.key)]) {
|
|
65
121
|
await memory.delete(key, { namespace: NAMESPACE });
|
|
66
122
|
}
|
|
67
123
|
}
|
|
@@ -188,6 +188,7 @@ export declare class DefectPredictorService implements IDefectPredictorService {
|
|
|
188
188
|
private generateTestRecommendations;
|
|
189
189
|
private calculateModelConfidence;
|
|
190
190
|
private calculateVariance;
|
|
191
|
+
/** Records the run; `false` when it was stored but older runs could not be pruned (#1137). */
|
|
191
192
|
private storePrediction;
|
|
192
193
|
private recalculateMetrics;
|
|
193
194
|
}
|