@unbrained/pm-cli 2026.6.5 → 2026.6.7
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/CHANGELOG.md +77 -0
- package/CONTRIBUTING.md +1 -0
- package/README.md +17 -5
- package/dist/cli/commander-usage.js +74 -4
- package/dist/cli/commander-usage.js.map +1 -1
- package/dist/cli/commands/aggregate.d.ts +8 -0
- package/dist/cli/commands/aggregate.js +84 -7
- package/dist/cli/commands/aggregate.js.map +1 -1
- package/dist/cli/commands/calendar.js +10 -3
- package/dist/cli/commands/calendar.js.map +1 -1
- package/dist/cli/commands/close-many.js +13 -10
- package/dist/cli/commands/close-many.js.map +1 -1
- package/dist/cli/commands/close.d.ts +1 -1
- package/dist/cli/commands/close.js +20 -10
- package/dist/cli/commands/close.js.map +1 -1
- package/dist/cli/commands/completion.js +87 -18
- package/dist/cli/commands/completion.js.map +1 -1
- package/dist/cli/commands/config.d.ts +5 -4
- package/dist/cli/commands/config.js +50 -2
- package/dist/cli/commands/config.js.map +1 -1
- package/dist/cli/commands/contracts.js +6 -3
- package/dist/cli/commands/contracts.js.map +1 -1
- package/dist/cli/commands/copy.d.ts +14 -0
- package/dist/cli/commands/copy.js +153 -0
- package/dist/cli/commands/copy.js.map +1 -0
- package/dist/cli/commands/extension/doctor.js +62 -2
- package/dist/cli/commands/extension/doctor.js.map +1 -1
- package/dist/cli/commands/extension/install-sources.d.ts +8 -0
- package/dist/cli/commands/extension/install-sources.js +82 -2
- package/dist/cli/commands/extension/install-sources.js.map +1 -1
- package/dist/cli/commands/extension.d.ts +29 -0
- package/dist/cli/commands/extension.js +61 -2
- package/dist/cli/commands/extension.js.map +1 -1
- package/dist/cli/commands/gc.d.ts +8 -1
- package/dist/cli/commands/gc.js +26 -3
- package/dist/cli/commands/gc.js.map +1 -1
- package/dist/cli/commands/get.d.ts +9 -0
- package/dist/cli/commands/get.js +23 -2
- package/dist/cli/commands/get.js.map +1 -1
- package/dist/cli/commands/health.js +15 -2
- package/dist/cli/commands/health.js.map +1 -1
- package/dist/cli/commands/history-compact.d.ts +39 -0
- package/dist/cli/commands/history-compact.js +262 -0
- package/dist/cli/commands/history-compact.js.map +1 -0
- package/dist/cli/commands/history.d.ts +4 -1
- package/dist/cli/commands/history.js +12 -24
- package/dist/cli/commands/history.js.map +1 -1
- package/dist/cli/commands/index.d.ts +3 -0
- package/dist/cli/commands/index.js +5 -2
- package/dist/cli/commands/index.js.map +1 -1
- package/dist/cli/commands/list.d.ts +2 -0
- package/dist/cli/commands/list.js +87 -9
- package/dist/cli/commands/list.js.map +1 -1
- package/dist/cli/commands/reindex.js +8 -4
- package/dist/cli/commands/reindex.js.map +1 -1
- package/dist/cli/commands/search.d.ts +1 -0
- package/dist/cli/commands/search.js +232 -35
- package/dist/cli/commands/search.js.map +1 -1
- package/dist/cli/commands/stats.d.ts +8 -1
- package/dist/cli/commands/stats.js +18 -17
- package/dist/cli/commands/stats.js.map +1 -1
- package/dist/cli/commands/telemetry.d.ts +8 -0
- package/dist/cli/commands/telemetry.js +253 -0
- package/dist/cli/commands/telemetry.js.map +1 -0
- package/dist/cli/error-guidance.js +26 -2
- package/dist/cli/error-guidance.js.map +1 -1
- package/dist/cli/extension-command-help.d.ts +1 -0
- package/dist/cli/extension-command-help.js +3 -2
- package/dist/cli/extension-command-help.js.map +1 -1
- package/dist/cli/help-content.js +19 -2
- package/dist/cli/help-content.js.map +1 -1
- package/dist/cli/main.d.ts +3 -0
- package/dist/cli/main.js +13 -21
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/register-list-query.js +24 -6
- package/dist/cli/register-list-query.js.map +1 -1
- package/dist/cli/register-mutation.js +52 -17
- package/dist/cli/register-mutation.js.map +1 -1
- package/dist/cli/register-operations.js +55 -8
- package/dist/cli/register-operations.js.map +1 -1
- package/dist/cli/register-setup.js +5 -5
- package/dist/cli/register-setup.js.map +1 -1
- package/dist/cli/registration-helpers.js +21 -3
- package/dist/cli/registration-helpers.js.map +1 -1
- package/dist/cli-bundle/chunks/activity-5UROHJ3D.js +16 -0
- package/dist/cli-bundle/chunks/{activity-3RWRRNOW.js → activity-YVB3QRTE.js} +11 -11
- package/dist/cli-bundle/chunks/{aggregate-OOAGKWRG.js → aggregate-LH66F75F.js} +87 -17
- package/dist/cli-bundle/chunks/aggregate-LH66F75F.js.map +7 -0
- package/dist/cli-bundle/chunks/{aggregate-J35K7WZB.js → aggregate-OHSWFQJM.js} +88 -18
- package/dist/cli-bundle/chunks/aggregate-OHSWFQJM.js.map +1 -0
- package/dist/cli-bundle/chunks/{append-PNN6UIBZ.js → append-2PPYFAG5.js} +8 -8
- package/dist/cli-bundle/chunks/{append-5JE3YGXU.js → append-AUGT5W6J.js} +8 -8
- package/dist/cli-bundle/chunks/{chunk-26KTVXJW.js → chunk-2IF7WLB7.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-KA24HME7.js → chunk-2IXCHCLM.js} +5 -6
- package/dist/cli-bundle/chunks/chunk-2IXCHCLM.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-XX5LRINW.js → chunk-2OJHLWBZ.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-ASQM3IF5.js → chunk-3A2CMEM7.js} +5 -4
- package/dist/cli-bundle/chunks/{chunk-S3CV7JGJ.js → chunk-3EOBJOF4.js} +5 -4
- package/dist/cli-bundle/chunks/{chunk-N5YF3VFN.js → chunk-42LOFGJS.js} +91 -16
- package/dist/cli-bundle/chunks/chunk-42LOFGJS.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-WIKR7KFL.js → chunk-4CHEG6UK.js} +108 -21
- package/dist/cli-bundle/chunks/chunk-4CHEG6UK.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-4QCR4QW3.js → chunk-4GHZR3BA.js} +56 -28
- package/dist/cli-bundle/chunks/chunk-4GHZR3BA.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-B3N4TKNL.js → chunk-5AXMRKN5.js} +8 -8
- package/dist/cli-bundle/chunks/{chunk-JQI2HE55.js → chunk-6J4K6JLA.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-V3JQ4IPL.js → chunk-6RZXO5M2.js} +102 -22
- package/dist/cli-bundle/chunks/chunk-6RZXO5M2.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-BNL6S7QH.js → chunk-AVJD6VTA.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-NQP3ECKF.js → chunk-B2KZGPM2.js} +39 -8
- package/dist/cli-bundle/chunks/chunk-B2KZGPM2.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-RQAWLSUU.js → chunk-B5RF3IP7.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-UFCG3SWR.js → chunk-C5W2UH56.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-3OH4DAEB.js → chunk-CKLBZHS7.js} +6 -6
- package/dist/cli-bundle/chunks/{chunk-GNHVV4SY.js → chunk-CLD3XNCH.js} +124 -20
- package/dist/cli-bundle/chunks/chunk-CLD3XNCH.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-RANZIID5.js → chunk-FHHBD7PN.js} +38 -7
- package/dist/cli-bundle/chunks/chunk-FHHBD7PN.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-GFWHHMVV.js → chunk-FY6Z3FYY.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-CCUFLH4J.js → chunk-GNIUOLZ2.js} +7 -7
- package/dist/cli-bundle/chunks/{chunk-ZRVSMOMR.js → chunk-GPXQBR3H.js} +12 -12
- package/dist/cli-bundle/chunks/{chunk-SZQCER6S.js → chunk-GUZBNB3G.js} +27 -5
- package/dist/cli-bundle/chunks/chunk-GUZBNB3G.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-GPGAYASV.js → chunk-H7EO3QA3.js} +5 -5
- package/dist/cli-bundle/chunks/{chunk-MISYRLEP.js → chunk-HLC3KTLP.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-KK6YPGH3.js → chunk-HMMMWBK2.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-4PJQSECJ.js → chunk-HRMHZ4RV.js} +26 -4
- package/dist/cli-bundle/chunks/chunk-HRMHZ4RV.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-CJDQB2ED.js → chunk-HV5SSZXF.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-ATBVS6WW.js → chunk-IMCJBN2Q.js} +23 -14
- package/dist/cli-bundle/chunks/chunk-IMCJBN2Q.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-FVXM3GKS.js → chunk-KNGVP5WJ.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-OIQIXTNB.js → chunk-KR6R465K.js} +304 -215
- package/dist/cli-bundle/chunks/chunk-KR6R465K.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-UOVLWB47.js → chunk-LI65XLJR.js} +8 -8
- package/dist/cli-bundle/chunks/{chunk-AXXKLVTW.js → chunk-LIN2BPJ7.js} +2 -2
- package/dist/cli-bundle/chunks/chunk-LMTOY5HE.js +112 -0
- package/dist/cli-bundle/chunks/chunk-LMTOY5HE.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-Y2AKE2HS.js → chunk-LQHBENVW.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-D5X7N6FI.js → chunk-LXO6V66E.js} +14 -14
- package/dist/cli-bundle/chunks/{chunk-TK633IVD.js → chunk-M2PW7EZU.js} +26 -7
- package/dist/cli-bundle/chunks/chunk-M2PW7EZU.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-DFIZGAI5.js → chunk-MOYM2C3J.js} +9 -9
- package/dist/cli-bundle/chunks/{chunk-ZQ4F6EC4.js → chunk-MWRS7Z4P.js} +127 -23
- package/dist/cli-bundle/chunks/chunk-MWRS7Z4P.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-5PAOPUZX.js → chunk-NHR2QXXZ.js} +24 -15
- package/dist/cli-bundle/chunks/chunk-NHR2QXXZ.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-OUF3ARDX.js → chunk-NQL32HQ5.js} +12 -12
- package/dist/cli-bundle/chunks/{chunk-TBQVUNVH.js → chunk-O7HSSFCC.js} +65 -16
- package/dist/cli-bundle/chunks/chunk-O7HSSFCC.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-GCAVRLGE.js → chunk-OKSKJKHX.js} +9 -9
- package/dist/cli-bundle/chunks/chunk-QQL5QSTZ.js +1572 -0
- package/dist/cli-bundle/chunks/chunk-QQL5QSTZ.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-A6PEXMYN.js → chunk-R3V3YCMH.js} +9 -9
- package/dist/cli-bundle/chunks/{chunk-T2ORWB6D.js → chunk-RVPTZKBC.js} +9 -9
- package/dist/cli-bundle/chunks/{chunk-K47WAYQV.js → chunk-SFFVGNHC.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-DFUSXJDE.js → chunk-SQPKRA54.js} +14 -14
- package/dist/cli-bundle/chunks/chunk-THDEID2Z.js +115 -0
- package/dist/cli-bundle/chunks/chunk-THDEID2Z.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-G5BACLYH.js → chunk-TINUJMWN.js} +92 -17
- package/dist/cli-bundle/chunks/chunk-TINUJMWN.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-JB4RGL4V.js → chunk-TNPBPNII.js} +7 -7
- package/dist/cli-bundle/chunks/{chunk-XG7RJYHV.js → chunk-TP4DDY27.js} +6 -6
- package/dist/cli-bundle/chunks/{chunk-ORTLYVA4.js → chunk-TYJJOTUA.js} +6 -6
- package/dist/cli-bundle/chunks/{chunk-HZOS2UG5.js → chunk-UAQOQ7IE.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-D3WUNETC.js → chunk-UEWA73ZZ.js} +5 -5
- package/dist/cli-bundle/chunks/{chunk-O5IBJE6S.js → chunk-UIIQC5YO.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-SRVKTWPR.js → chunk-UJUT6AHZ.js} +314 -39
- package/dist/cli-bundle/chunks/chunk-UJUT6AHZ.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-SSFMJCPF.js → chunk-UT6WFXW2.js} +6 -7
- package/dist/cli-bundle/chunks/chunk-UT6WFXW2.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-KBG47ZOY.js → chunk-UYQ7HXH4.js} +10 -6
- package/dist/cli-bundle/chunks/chunk-UYQ7HXH4.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-LDJK7SHN.js → chunk-V6EYFTRL.js} +7 -7
- package/dist/cli-bundle/chunks/{chunk-5IRA6IYD.js → chunk-WAA7UI6M.js} +58 -30
- package/dist/cli-bundle/chunks/chunk-WAA7UI6M.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-HPH6X4ZZ.js → chunk-WCQZBDDH.js} +10 -6
- package/dist/cli-bundle/chunks/{chunk-HPH6X4ZZ.js.map → chunk-WCQZBDDH.js.map} +2 -2
- package/dist/cli-bundle/chunks/chunk-WR5567FH.js +1582 -0
- package/dist/cli-bundle/chunks/chunk-WR5567FH.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-TQ3ZK6VD.js → chunk-WYEXLDDY.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-4LTBNUYT.js → chunk-X4IZKYHP.js} +307 -32
- package/dist/cli-bundle/chunks/chunk-X4IZKYHP.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-KCMIYKTA.js → chunk-X7UHMKPE.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-7K24QB23.js → chunk-XS3O2TFJ.js} +27 -8
- package/dist/cli-bundle/chunks/chunk-XS3O2TFJ.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-EHXPIKKP.js → chunk-XYNT7UFP.js} +303 -207
- package/dist/cli-bundle/chunks/chunk-XYNT7UFP.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-CWT53EYT.js → chunk-YBZW2QQ7.js} +6 -6
- package/dist/cli-bundle/chunks/{chunk-VGO2T3TY.js → chunk-YO3THIJF.js} +7 -7
- package/dist/cli-bundle/chunks/{chunk-5KB4X7YY.js → chunk-YPH4ESA2.js} +66 -17
- package/dist/cli-bundle/chunks/chunk-YPH4ESA2.js.map +1 -0
- package/dist/cli-bundle/chunks/{claim-ZFA7HKU4.js → claim-BJ4QMPJC.js} +10 -10
- package/dist/cli-bundle/chunks/{claim-AZLP7YFO.js → claim-KW743OSW.js} +10 -10
- package/dist/cli-bundle/chunks/close-P4ZBKODL.js +13 -0
- package/dist/cli-bundle/chunks/{close-65DFYAVS.js → close-SYHSRZDC.js} +8 -8
- package/dist/cli-bundle/chunks/{close-many-UKZSQGM7.js → close-many-DBLEYFOY.js} +29 -26
- package/dist/cli-bundle/chunks/close-many-DBLEYFOY.js.map +7 -0
- package/dist/cli-bundle/chunks/{close-many-AKPZNSGI.js → close-many-LAC5VR4G.js} +30 -27
- package/dist/cli-bundle/chunks/close-many-LAC5VR4G.js.map +1 -0
- package/dist/cli-bundle/chunks/{comments-AGBNSJJH.js → comments-JEO6HHVM.js} +10 -10
- package/dist/cli-bundle/chunks/{comments-CJWXQI7X.js → comments-YT2PQ5DD.js} +10 -10
- package/dist/cli-bundle/chunks/{config-DDPYIA6J.js → config-RZRVS3ZV.js} +127 -11
- package/dist/cli-bundle/chunks/config-RZRVS3ZV.js.map +1 -0
- package/dist/cli-bundle/chunks/{config-5ON3ADRH.js → config-YJSAAADD.js} +128 -12
- package/dist/cli-bundle/chunks/config-YJSAAADD.js.map +7 -0
- package/dist/cli-bundle/chunks/{context-E6U3DWVM.js → context-LGYEEKAW.js} +14 -14
- package/dist/cli-bundle/chunks/{context-E6U3DWVM.js.map → context-LGYEEKAW.js.map} +2 -2
- package/dist/cli-bundle/chunks/{context-ZOJEN5VT.js → context-ZUH5IOOI.js} +15 -15
- package/dist/cli-bundle/chunks/context-ZUH5IOOI.js.map +1 -0
- package/dist/cli-bundle/chunks/{contracts-CXSFM45B.js → contracts-YXJ6NXKH.js} +11 -5
- package/dist/cli-bundle/chunks/contracts-YXJ6NXKH.js.map +7 -0
- package/dist/cli-bundle/chunks/{contracts-LCSX5R53.js → contracts-ZIBXROPE.js} +12 -6
- package/dist/cli-bundle/chunks/contracts-ZIBXROPE.js.map +1 -0
- package/dist/cli-bundle/chunks/copy-BZALX5MQ.js +182 -0
- package/dist/cli-bundle/chunks/copy-BZALX5MQ.js.map +1 -0
- package/dist/cli-bundle/chunks/copy-YPWEIAPD.js +185 -0
- package/dist/cli-bundle/chunks/copy-YPWEIAPD.js.map +7 -0
- package/dist/cli-bundle/chunks/create-4DS2QWQC.js +27 -0
- package/dist/cli-bundle/chunks/{create-WYFKN2U4.js → create-CF7EVRX7.js} +13 -13
- package/dist/cli-bundle/chunks/{delete-ZXWC56WO.js → delete-KR4VBWVE.js} +7 -7
- package/dist/cli-bundle/chunks/{delete-RONNH4F4.js → delete-XLZRTRKR.js} +7 -7
- package/dist/cli-bundle/chunks/{deps-WII3O4HB.js → deps-2YTXD3VM.js} +7 -7
- package/dist/cli-bundle/chunks/{deps-EHXIFOZR.js → deps-GZMFMTGS.js} +7 -7
- package/dist/cli-bundle/chunks/{docs-PDREIMLS.js → docs-SLROFEQ4.js} +9 -9
- package/dist/cli-bundle/chunks/{docs-JMVCFNHH.js → docs-ZHISRR2D.js} +9 -9
- package/dist/cli-bundle/chunks/{extension-G6UXSM5S.js → extension-3C7OOI4F.js} +8 -6
- package/dist/cli-bundle/chunks/{extension-B4ROVWJD.js → extension-XYCUXICD.js} +8 -6
- package/dist/cli-bundle/chunks/{files-2PN7UM2D.js → files-FUWF2FYJ.js} +9 -9
- package/dist/cli-bundle/chunks/{files-MXYS5W4M.js → files-J4I5IU4O.js} +9 -9
- package/dist/cli-bundle/chunks/gc-34NXSNSN.js +362 -0
- package/dist/cli-bundle/chunks/gc-34NXSNSN.js.map +1 -0
- package/dist/cli-bundle/chunks/gc-SPIIZX3A.js +372 -0
- package/dist/cli-bundle/chunks/gc-SPIIZX3A.js.map +7 -0
- package/dist/cli-bundle/chunks/{get-WXMLRG7M.js → get-SZKNRHMA.js} +34 -12
- package/dist/cli-bundle/chunks/get-SZKNRHMA.js.map +1 -0
- package/dist/cli-bundle/chunks/{get-CINFEUIY.js → get-VITKYP6S.js} +33 -11
- package/dist/cli-bundle/chunks/get-VITKYP6S.js.map +7 -0
- package/dist/cli-bundle/chunks/{health-IT5DBPRJ.js → health-4SNTA2TF.js} +27 -13
- package/dist/cli-bundle/chunks/health-4SNTA2TF.js.map +7 -0
- package/dist/cli-bundle/chunks/{health-5VPOJQ53.js → health-7G3EPM57.js} +28 -14
- package/dist/cli-bundle/chunks/health-7G3EPM57.js.map +1 -0
- package/dist/cli-bundle/chunks/{history-FLZIP7PM.js → history-SDAWYZR3.js} +10 -10
- package/dist/cli-bundle/chunks/history-YDUEILKP.js +20 -0
- package/dist/cli-bundle/chunks/history-compact-DMW536VH.js +287 -0
- package/dist/cli-bundle/chunks/history-compact-DMW536VH.js.map +1 -0
- package/dist/cli-bundle/chunks/history-compact-POTZGG7K.js +290 -0
- package/dist/cli-bundle/chunks/history-compact-POTZGG7K.js.map +7 -0
- package/dist/cli-bundle/chunks/{history-redact-SSZBAD76.js → history-redact-EPJ7GENL.js} +11 -11
- package/dist/cli-bundle/chunks/history-redact-KASLLPE7.js +19 -0
- package/dist/cli-bundle/chunks/{history-repair-X7CO5JJZ.js → history-repair-IJ7LLBET.js} +11 -11
- package/dist/cli-bundle/chunks/{history-repair-KC5ZOJRZ.js → history-repair-YNESJRT6.js} +11 -11
- package/dist/cli-bundle/chunks/init-IGSS4GNH.js +17 -0
- package/dist/cli-bundle/chunks/{init-6MRFVOLH.js → init-YHVBTEET.js} +9 -8
- package/dist/cli-bundle/chunks/{learnings-DCX55BNX.js → learnings-4YBMIVCZ.js} +10 -10
- package/dist/cli-bundle/chunks/{learnings-A3CLB5CO.js → learnings-T4PF24YN.js} +10 -10
- package/dist/cli-bundle/chunks/{list-DBRECOG4.js → list-3KEVBOYW.js} +10 -10
- package/dist/cli-bundle/chunks/list-E44O2K64.js +20 -0
- package/dist/cli-bundle/chunks/{notes-42LIC3UE.js → notes-FLUCNJSH.js} +10 -10
- package/dist/cli-bundle/chunks/{notes-P5O3VMQ3.js → notes-GJKALVZM.js} +10 -10
- package/dist/cli-bundle/chunks/{plan-HDQXEUKD.js → plan-T5MMZLI3.js} +13 -13
- package/dist/cli-bundle/chunks/{plan-IGTE3WOJ.js → plan-YYMIL3HV.js} +13 -13
- package/dist/cli-bundle/chunks/{register-list-query-EMNSIUO4.js → register-list-query-I65EZ3HB.js} +33 -27
- package/dist/cli-bundle/chunks/register-list-query-I65EZ3HB.js.map +1 -0
- package/dist/cli-bundle/chunks/{register-list-query-AG3XKXWL.js → register-list-query-OECMHO4G.js} +32 -26
- package/dist/cli-bundle/chunks/register-list-query-OECMHO4G.js.map +7 -0
- package/dist/cli-bundle/chunks/{register-mutation-M3YS6XDO.js → register-mutation-2FLXORLR.js} +65 -47
- package/dist/cli-bundle/chunks/register-mutation-2FLXORLR.js.map +1 -0
- package/dist/cli-bundle/chunks/{register-mutation-RSMT6DPK.js → register-mutation-5GPDEKHR.js} +64 -46
- package/dist/cli-bundle/chunks/register-mutation-5GPDEKHR.js.map +7 -0
- package/dist/cli-bundle/chunks/{register-operations-KYUOOOOD.js → register-operations-BNGAUMGK.js} +71 -35
- package/dist/cli-bundle/chunks/register-operations-BNGAUMGK.js.map +1 -0
- package/dist/cli-bundle/chunks/{register-operations-Q54JQZUN.js → register-operations-GQKT35H5.js} +70 -34
- package/dist/cli-bundle/chunks/register-operations-GQKT35H5.js.map +7 -0
- package/dist/cli-bundle/chunks/{register-setup-DI6P7X75.js → register-setup-DNDCGZ4O.js} +18 -18
- package/dist/cli-bundle/chunks/{register-setup-DI6P7X75.js.map → register-setup-DNDCGZ4O.js.map} +1 -1
- package/dist/cli-bundle/chunks/{register-setup-YJKIQRKA.js → register-setup-EJY44FPH.js} +17 -17
- package/dist/cli-bundle/chunks/{register-setup-YJKIQRKA.js.map → register-setup-EJY44FPH.js.map} +2 -2
- package/dist/cli-bundle/chunks/{restore-2XVTBLKQ.js → restore-DDJGVZIN.js} +11 -11
- package/dist/cli-bundle/chunks/restore-SJSASGZP.js +17 -0
- package/dist/cli-bundle/chunks/{schema-V6BX65Q2.js → schema-B7NQ6XVP.js} +8 -8
- package/dist/cli-bundle/chunks/{schema-LVXZWFGY.js → schema-HEGYH6CE.js} +8 -8
- package/dist/cli-bundle/chunks/{search-C7NPB7G7.js → search-DVVQ4UO2.js} +421 -42
- package/dist/cli-bundle/chunks/search-DVVQ4UO2.js.map +1 -0
- package/dist/cli-bundle/chunks/{search-5A3BMFA7.js → search-JNEZJV7H.js} +427 -41
- package/dist/cli-bundle/chunks/search-JNEZJV7H.js.map +7 -0
- package/dist/cli-bundle/chunks/stats-7JDIJRDH.js +202 -0
- package/dist/cli-bundle/chunks/stats-7JDIJRDH.js.map +1 -0
- package/dist/cli-bundle/chunks/stats-SYTJRR4Z.js +212 -0
- package/dist/cli-bundle/chunks/stats-SYTJRR4Z.js.map +7 -0
- package/dist/cli-bundle/chunks/telemetry-4HHWD5Y7.js +251 -0
- package/dist/cli-bundle/chunks/telemetry-4HHWD5Y7.js.map +7 -0
- package/dist/cli-bundle/chunks/telemetry-EGWP7ZUX.js +248 -0
- package/dist/cli-bundle/chunks/telemetry-EGWP7ZUX.js.map +1 -0
- package/dist/cli-bundle/chunks/{test-OFYONO3C.js → test-IIELLSZX.js} +14 -13
- package/dist/cli-bundle/chunks/test-ML5RLWXE.js +32 -0
- package/dist/cli-bundle/chunks/{test-all-EEMKNTGU.js → test-all-7DNCMML7.js} +14 -13
- package/dist/cli-bundle/chunks/{test-all-EEMKNTGU.js.map → test-all-7DNCMML7.js.map} +1 -1
- package/dist/cli-bundle/chunks/{test-all-OJE6CIO7.js → test-all-IHTUJRRC.js} +16 -15
- package/dist/cli-bundle/chunks/{test-all-OJE6CIO7.js.map → test-all-IHTUJRRC.js.map} +1 -1
- package/dist/cli-bundle/chunks/{test-runs-IPOPFOAF.js → test-runs-5FEMBV3A.js} +5 -5
- package/dist/cli-bundle/chunks/{test-runs-L2M7WKH7.js → test-runs-RNKZ37PS.js} +5 -5
- package/dist/cli-bundle/chunks/update-6C67X4KS.js +21 -0
- package/dist/cli-bundle/chunks/update-VF26YPT3.js +25 -0
- package/dist/cli-bundle/chunks/{update-many-322CCH2L.js → update-many-BSZZZYXY.js} +22 -22
- package/dist/cli-bundle/chunks/{update-many-DYWGW57M.js → update-many-BWKJJEBF.js} +22 -22
- package/dist/cli-bundle/chunks/{upgrade-3W3RVSNM.js → upgrade-RSE5PC44.js} +7 -6
- package/dist/cli-bundle/chunks/{upgrade-3W3RVSNM.js.map → upgrade-RSE5PC44.js.map} +1 -1
- package/dist/cli-bundle/chunks/{upgrade-2U727SAM.js → upgrade-YWI5DJFA.js} +5 -4
- package/dist/cli-bundle/chunks/{upgrade-2U727SAM.js.map → upgrade-YWI5DJFA.js.map} +1 -1
- package/dist/cli-bundle/chunks/{validate-ZFVWPEEN.js → validate-NK3WKB7C.js} +18 -17
- package/dist/cli-bundle/chunks/{validate-ZFVWPEEN.js.map → validate-NK3WKB7C.js.map} +1 -1
- package/dist/cli-bundle/chunks/{validate-GZ24NYHO.js → validate-UCEOB7S6.js} +20 -19
- package/dist/cli-bundle/chunks/{validate-GZ24NYHO.js.map → validate-UCEOB7S6.js.map} +1 -1
- package/dist/cli-bundle/main.js +198 -1523
- package/dist/cli-bundle/main.js.map +4 -4
- package/dist/core/config/nested-settings.d.ts +8 -6
- package/dist/core/config/nested-settings.js +71 -5
- package/dist/core/config/nested-settings.js.map +1 -1
- package/dist/core/config/positional-value.js +4 -2
- package/dist/core/config/positional-value.js.map +1 -1
- package/dist/core/extensions/extension-types.d.ts +36 -0
- package/dist/core/extensions/extension-types.js +2 -2
- package/dist/core/extensions/extension-types.js.map +1 -1
- package/dist/core/extensions/loader.js +46 -5
- package/dist/core/extensions/loader.js.map +1 -1
- package/dist/core/history/drift-scan.d.ts +3 -4
- package/dist/core/history/drift-scan.js +71 -18
- package/dist/core/history/drift-scan.js.map +1 -1
- package/dist/core/history/history-diff.d.ts +47 -0
- package/dist/core/history/history-diff.js +152 -0
- package/dist/core/history/history-diff.js.map +1 -0
- package/dist/core/history/history-storage-stats.d.ts +31 -0
- package/dist/core/history/history-storage-stats.js +101 -0
- package/dist/core/history/history-storage-stats.js.map +1 -0
- package/dist/core/item/id.js +4 -5
- package/dist/core/item/id.js.map +1 -1
- package/dist/core/item/item-format.js +7 -3
- package/dist/core/item/item-format.js.map +1 -1
- package/dist/core/item/toon-decode.d.ts +7 -0
- package/dist/core/item/toon-decode.js +11 -2
- package/dist/core/item/toon-decode.js.map +1 -1
- package/dist/core/item/type-registry.js +25 -7
- package/dist/core/item/type-registry.js.map +1 -1
- package/dist/core/lock/lock-gc.d.ts +46 -0
- package/dist/core/lock/lock-gc.js +194 -0
- package/dist/core/lock/lock-gc.js.map +1 -0
- package/dist/core/search/cache.js +5 -3
- package/dist/core/search/cache.js.map +1 -1
- package/dist/core/search/corpus.d.ts +6 -0
- package/dist/core/search/corpus.js +22 -9
- package/dist/core/search/corpus.js.map +1 -1
- package/dist/core/search/embedding-batches.js +10 -7
- package/dist/core/search/embedding-batches.js.map +1 -1
- package/dist/core/search/relevance.d.ts +29 -0
- package/dist/core/search/relevance.js +226 -0
- package/dist/core/search/relevance.js.map +1 -0
- package/dist/core/search/vector-stores.d.ts +3 -0
- package/dist/core/search/vector-stores.js +23 -10
- package/dist/core/search/vector-stores.js.map +1 -1
- package/dist/core/shared/constants.js +15 -2
- package/dist/core/shared/constants.js.map +1 -1
- package/dist/core/shared/errors.d.ts +6 -0
- package/dist/core/shared/errors.js +2 -2
- package/dist/core/shared/errors.js.map +1 -1
- package/dist/core/shared/primitives.d.ts +8 -0
- package/dist/core/shared/primitives.js +29 -2
- package/dist/core/shared/primitives.js.map +1 -1
- package/dist/core/shared/serial-queue.d.ts +12 -0
- package/dist/core/shared/serial-queue.js +43 -0
- package/dist/core/shared/serial-queue.js.map +1 -0
- package/dist/core/shared/time.js +42 -6
- package/dist/core/shared/time.js.map +1 -1
- package/dist/core/store/paths.js +25 -7
- package/dist/core/store/paths.js.map +1 -1
- package/dist/core/store/settings-validator.d.ts +11 -0
- package/dist/core/store/settings-validator.js +14 -2
- package/dist/core/store/settings-validator.js.map +1 -1
- package/dist/core/store/settings.d.ts +19 -1
- package/dist/core/store/settings.js +199 -17
- package/dist/core/store/settings.js.map +1 -1
- package/dist/core/telemetry/observability.js +3 -3
- package/dist/core/telemetry/observability.js.map +1 -1
- package/dist/core/telemetry/runtime.js +99 -6
- package/dist/core/telemetry/runtime.js.map +1 -1
- package/dist/mcp/server.d.ts +1 -0
- package/dist/mcp/server.js +187 -42
- package/dist/mcp/server.js.map +1 -1
- package/dist/sdk/cli-contracts/commander-types.d.ts +1 -0
- package/dist/sdk/cli-contracts/commander-types.js +13 -2
- package/dist/sdk/cli-contracts/commander-types.js.map +1 -1
- package/dist/sdk/cli-contracts/enum-contracts.d.ts +2 -2
- package/dist/sdk/cli-contracts/enum-contracts.js +8 -2
- package/dist/sdk/cli-contracts/enum-contracts.js.map +1 -1
- package/dist/sdk/cli-contracts/tool-option-contracts.js +7 -2
- package/dist/sdk/cli-contracts/tool-option-contracts.js.map +1 -1
- package/dist/sdk/cli-contracts/tool-parameter-tables.js +39 -7
- package/dist/sdk/cli-contracts/tool-parameter-tables.js.map +1 -1
- package/dist/sdk/cli-contracts.d.ts +26 -1
- package/dist/sdk/cli-contracts.js +75 -11
- package/dist/sdk/cli-contracts.js.map +1 -1
- package/dist/sdk/index.d.ts +2 -2
- package/dist/sdk/index.js +3 -3
- package/dist/sdk/index.js.map +1 -1
- package/dist/sdk/testing.d.ts +51 -1
- package/dist/sdk/testing.js +93 -2
- package/dist/sdk/testing.js.map +1 -1
- package/dist/types.d.ts +14 -0
- package/dist/types.js +2 -2
- package/dist/types.js.map +1 -1
- package/docs/AGENT_GUIDE.md +1 -1
- package/docs/ARCHITECTURE.md +11 -1
- package/docs/CLAUDE_CODE_PLUGIN.md +4 -4
- package/docs/CODEX_PLUGIN.md +1 -1
- package/docs/COMMANDS.md +42 -4
- package/docs/CONFIGURATION.md +31 -2
- package/docs/EXTENSIONS.md +28 -8
- package/docs/EXTENSION_AUTHOR_CONTRACTS.md +73 -0
- package/docs/ONBOARDING.md +165 -0
- package/docs/QUICKSTART.md +2 -2
- package/docs/README.md +12 -4
- package/docs/RELEASING.md +36 -1
- package/docs/SDK.md +66 -0
- package/docs/TESTING.md +33 -1
- package/package.json +6 -2
- package/packages/pm-governance-audit/README.md +14 -0
- package/packages/pm-governance-audit/extensions/governance-audit/index.js +39 -1
- package/packages/pm-governance-audit/extensions/governance-audit/index.ts +40 -2
- package/packages/pm-governance-audit/extensions/governance-audit/manifest.json +1 -1
- package/packages/pm-governance-audit/package.json +4 -2
- package/packages/pm-lifecycle-hooks/README.md +21 -0
- package/packages/pm-search-advanced/README.md +38 -0
- package/packages/pm-search-advanced/extensions/search-advanced/index.js +17 -0
- package/packages/pm-search-advanced/extensions/search-advanced/index.ts +17 -0
- package/packages/pm-search-advanced/extensions/search-advanced/runtime.js +216 -1
- package/packages/pm-search-advanced/extensions/search-advanced/runtime.ts +271 -2
- package/plugins/pm-claude/.claude-plugin/plugin.json +1 -1
- package/plugins/pm-claude/README.md +11 -8
- package/plugins/pm-claude/agents/pm-coordinator.md +1 -1
- package/plugins/pm-claude/commands/pm-init.md +1 -1
- package/plugins/pm-codex/README.md +1 -1
- package/dist/cli-bundle/chunks/activity-P5BUMWP3.js +0 -16
- package/dist/cli-bundle/chunks/aggregate-J35K7WZB.js.map +0 -1
- package/dist/cli-bundle/chunks/aggregate-OOAGKWRG.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-4LTBNUYT.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-4PJQSECJ.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-4QCR4QW3.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-5IRA6IYD.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-5KB4X7YY.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-5PAOPUZX.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-7K24QB23.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-ATBVS6WW.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-EHXPIKKP.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-G5BACLYH.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-GNHVV4SY.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-KA24HME7.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-KBG47ZOY.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-N5YF3VFN.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-NQP3ECKF.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-OIQIXTNB.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-RANZIID5.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-SRVKTWPR.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-SSFMJCPF.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-SZQCER6S.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-TBQVUNVH.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-TK633IVD.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-V3JQ4IPL.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-WIKR7KFL.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-ZQ4F6EC4.js.map +0 -7
- package/dist/cli-bundle/chunks/close-RMHQ3KWH.js +0 -13
- package/dist/cli-bundle/chunks/close-many-AKPZNSGI.js.map +0 -1
- package/dist/cli-bundle/chunks/close-many-UKZSQGM7.js.map +0 -7
- package/dist/cli-bundle/chunks/config-5ON3ADRH.js.map +0 -7
- package/dist/cli-bundle/chunks/config-DDPYIA6J.js.map +0 -1
- package/dist/cli-bundle/chunks/context-ZOJEN5VT.js.map +0 -1
- package/dist/cli-bundle/chunks/contracts-CXSFM45B.js.map +0 -7
- package/dist/cli-bundle/chunks/contracts-LCSX5R53.js.map +0 -1
- package/dist/cli-bundle/chunks/create-ATONSAZW.js +0 -27
- package/dist/cli-bundle/chunks/gc-GT552UJH.js +0 -178
- package/dist/cli-bundle/chunks/gc-GT552UJH.js.map +0 -1
- package/dist/cli-bundle/chunks/gc-QNBRJG6H.js +0 -181
- package/dist/cli-bundle/chunks/gc-QNBRJG6H.js.map +0 -7
- package/dist/cli-bundle/chunks/get-CINFEUIY.js.map +0 -7
- package/dist/cli-bundle/chunks/get-WXMLRG7M.js.map +0 -1
- package/dist/cli-bundle/chunks/health-5VPOJQ53.js.map +0 -1
- package/dist/cli-bundle/chunks/health-IT5DBPRJ.js.map +0 -7
- package/dist/cli-bundle/chunks/history-6FC4H6HI.js +0 -20
- package/dist/cli-bundle/chunks/history-redact-XKYEZDBL.js +0 -19
- package/dist/cli-bundle/chunks/init-KHX3FEEM.js +0 -16
- package/dist/cli-bundle/chunks/list-53LZ2AEO.js +0 -20
- package/dist/cli-bundle/chunks/register-list-query-AG3XKXWL.js.map +0 -7
- package/dist/cli-bundle/chunks/register-list-query-EMNSIUO4.js.map +0 -1
- package/dist/cli-bundle/chunks/register-mutation-M3YS6XDO.js.map +0 -1
- package/dist/cli-bundle/chunks/register-mutation-RSMT6DPK.js.map +0 -7
- package/dist/cli-bundle/chunks/register-operations-KYUOOOOD.js.map +0 -1
- package/dist/cli-bundle/chunks/register-operations-Q54JQZUN.js.map +0 -7
- package/dist/cli-bundle/chunks/restore-JL5QIH7H.js +0 -17
- package/dist/cli-bundle/chunks/search-5A3BMFA7.js.map +0 -7
- package/dist/cli-bundle/chunks/search-C7NPB7G7.js.map +0 -1
- package/dist/cli-bundle/chunks/stats-FNLYVXTB.js +0 -120
- package/dist/cli-bundle/chunks/stats-FNLYVXTB.js.map +0 -1
- package/dist/cli-bundle/chunks/stats-Y2CBTZSL.js +0 -123
- package/dist/cli-bundle/chunks/stats-Y2CBTZSL.js.map +0 -7
- package/dist/cli-bundle/chunks/test-RJ4ZF35X.js +0 -31
- package/dist/cli-bundle/chunks/update-6YEHPVXH.js +0 -25
- package/dist/cli-bundle/chunks/update-PYLVHMRD.js +0 -21
- /package/dist/cli-bundle/chunks/{activity-P5BUMWP3.js.map → activity-5UROHJ3D.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{activity-3RWRRNOW.js.map → activity-YVB3QRTE.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{append-PNN6UIBZ.js.map → append-2PPYFAG5.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{append-5JE3YGXU.js.map → append-AUGT5W6J.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-26KTVXJW.js.map → chunk-2IF7WLB7.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-XX5LRINW.js.map → chunk-2OJHLWBZ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-ASQM3IF5.js.map → chunk-3A2CMEM7.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-S3CV7JGJ.js.map → chunk-3EOBJOF4.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-B3N4TKNL.js.map → chunk-5AXMRKN5.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-JQI2HE55.js.map → chunk-6J4K6JLA.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-BNL6S7QH.js.map → chunk-AVJD6VTA.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-RQAWLSUU.js.map → chunk-B5RF3IP7.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-UFCG3SWR.js.map → chunk-C5W2UH56.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-3OH4DAEB.js.map → chunk-CKLBZHS7.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-GFWHHMVV.js.map → chunk-FY6Z3FYY.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-CCUFLH4J.js.map → chunk-GNIUOLZ2.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-ZRVSMOMR.js.map → chunk-GPXQBR3H.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-GPGAYASV.js.map → chunk-H7EO3QA3.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-MISYRLEP.js.map → chunk-HLC3KTLP.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-KK6YPGH3.js.map → chunk-HMMMWBK2.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-CJDQB2ED.js.map → chunk-HV5SSZXF.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-FVXM3GKS.js.map → chunk-KNGVP5WJ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-UOVLWB47.js.map → chunk-LI65XLJR.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-AXXKLVTW.js.map → chunk-LIN2BPJ7.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-Y2AKE2HS.js.map → chunk-LQHBENVW.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-D5X7N6FI.js.map → chunk-LXO6V66E.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-DFIZGAI5.js.map → chunk-MOYM2C3J.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-OUF3ARDX.js.map → chunk-NQL32HQ5.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-GCAVRLGE.js.map → chunk-OKSKJKHX.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-A6PEXMYN.js.map → chunk-R3V3YCMH.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-T2ORWB6D.js.map → chunk-RVPTZKBC.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-K47WAYQV.js.map → chunk-SFFVGNHC.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-DFUSXJDE.js.map → chunk-SQPKRA54.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-JB4RGL4V.js.map → chunk-TNPBPNII.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-XG7RJYHV.js.map → chunk-TP4DDY27.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-ORTLYVA4.js.map → chunk-TYJJOTUA.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-HZOS2UG5.js.map → chunk-UAQOQ7IE.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-D3WUNETC.js.map → chunk-UEWA73ZZ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-O5IBJE6S.js.map → chunk-UIIQC5YO.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-LDJK7SHN.js.map → chunk-V6EYFTRL.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-TQ3ZK6VD.js.map → chunk-WYEXLDDY.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-KCMIYKTA.js.map → chunk-X7UHMKPE.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-CWT53EYT.js.map → chunk-YBZW2QQ7.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-VGO2T3TY.js.map → chunk-YO3THIJF.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{claim-ZFA7HKU4.js.map → claim-BJ4QMPJC.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{claim-AZLP7YFO.js.map → claim-KW743OSW.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{close-RMHQ3KWH.js.map → close-P4ZBKODL.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{close-65DFYAVS.js.map → close-SYHSRZDC.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{comments-AGBNSJJH.js.map → comments-JEO6HHVM.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{comments-CJWXQI7X.js.map → comments-YT2PQ5DD.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{create-ATONSAZW.js.map → create-4DS2QWQC.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{create-WYFKN2U4.js.map → create-CF7EVRX7.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{delete-ZXWC56WO.js.map → delete-KR4VBWVE.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{delete-RONNH4F4.js.map → delete-XLZRTRKR.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{deps-WII3O4HB.js.map → deps-2YTXD3VM.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{deps-EHXIFOZR.js.map → deps-GZMFMTGS.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{docs-PDREIMLS.js.map → docs-SLROFEQ4.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{docs-JMVCFNHH.js.map → docs-ZHISRR2D.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{extension-G6UXSM5S.js.map → extension-3C7OOI4F.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{extension-B4ROVWJD.js.map → extension-XYCUXICD.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{files-2PN7UM2D.js.map → files-FUWF2FYJ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{files-MXYS5W4M.js.map → files-J4I5IU4O.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{history-FLZIP7PM.js.map → history-SDAWYZR3.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{history-6FC4H6HI.js.map → history-YDUEILKP.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{history-redact-SSZBAD76.js.map → history-redact-EPJ7GENL.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{history-redact-XKYEZDBL.js.map → history-redact-KASLLPE7.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{history-repair-X7CO5JJZ.js.map → history-repair-IJ7LLBET.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{history-repair-KC5ZOJRZ.js.map → history-repair-YNESJRT6.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{init-KHX3FEEM.js.map → init-IGSS4GNH.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{init-6MRFVOLH.js.map → init-YHVBTEET.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{learnings-DCX55BNX.js.map → learnings-4YBMIVCZ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{learnings-A3CLB5CO.js.map → learnings-T4PF24YN.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{list-DBRECOG4.js.map → list-3KEVBOYW.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{list-53LZ2AEO.js.map → list-E44O2K64.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{notes-42LIC3UE.js.map → notes-FLUCNJSH.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{notes-P5O3VMQ3.js.map → notes-GJKALVZM.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{plan-HDQXEUKD.js.map → plan-T5MMZLI3.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{plan-IGTE3WOJ.js.map → plan-YYMIL3HV.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{restore-2XVTBLKQ.js.map → restore-DDJGVZIN.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{restore-JL5QIH7H.js.map → restore-SJSASGZP.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{schema-V6BX65Q2.js.map → schema-B7NQ6XVP.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{schema-LVXZWFGY.js.map → schema-HEGYH6CE.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{test-OFYONO3C.js.map → test-IIELLSZX.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{test-RJ4ZF35X.js.map → test-ML5RLWXE.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{test-runs-IPOPFOAF.js.map → test-runs-5FEMBV3A.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{test-runs-L2M7WKH7.js.map → test-runs-RNKZ37PS.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{update-PYLVHMRD.js.map → update-6C67X4KS.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{update-6YEHPVXH.js.map → update-VF26YPT3.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{update-many-322CCH2L.js.map → update-many-BSZZZYXY.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{update-many-DYWGW57M.js.map → update-many-BWKJJEBF.js.map} +0 -0
|
@@ -11,6 +11,27 @@ Transition-aware packages can inspect `afterCommand`'s optional `affected`
|
|
|
11
11
|
entries for item mutations. Each entry includes the item id, operation,
|
|
12
12
|
previous/current status, changed fields, and compact front matter snapshots.
|
|
13
13
|
|
|
14
|
+
Copy this pattern when a package needs command-level notifications without
|
|
15
|
+
parsing command results or reading item files:
|
|
16
|
+
|
|
17
|
+
```ts
|
|
18
|
+
api.hooks.afterCommand((event) => {
|
|
19
|
+
const transitions = event.affected?.filter(
|
|
20
|
+
(item) => item.previous_status !== item.status && item.status !== undefined,
|
|
21
|
+
);
|
|
22
|
+
|
|
23
|
+
if (!transitions?.length) {
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
// Notify, enqueue, or cache based on item.id, item.previous_status,
|
|
28
|
+
// item.status, item.changed_fields, and item.current.
|
|
29
|
+
});
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
Use `afterCommand` for command-level context such as notifications. Use
|
|
33
|
+
`onWrite` when a package needs file-level sync or audit behavior.
|
|
34
|
+
|
|
14
35
|
## Capabilities
|
|
15
36
|
|
|
16
37
|
- `hooks`
|
|
@@ -16,6 +16,8 @@ First-party package that restores optional advanced search surfaces in bare-core
|
|
|
16
16
|
- Adds `pm reindex` with:
|
|
17
17
|
- `--mode keyword|semantic|hybrid`
|
|
18
18
|
- `--progress`
|
|
19
|
+
- `--eval`
|
|
20
|
+
- `--eval-fixtures <path>`
|
|
19
21
|
|
|
20
22
|
## Install
|
|
21
23
|
|
|
@@ -30,6 +32,42 @@ pm search-advanced "vector cache" --mode hybrid --limit 5 --json
|
|
|
30
32
|
pm search-advanced --hybrid "vector cache" --limit 5 --json
|
|
31
33
|
pm search-advanced "calendar package" --mode keyword --fields id,title,score --compact --json
|
|
32
34
|
pm reindex --mode hybrid --progress --json
|
|
35
|
+
pm reindex --mode keyword --eval --eval-fixtures tests/search-eval/golden-queries.json --json
|
|
33
36
|
```
|
|
34
37
|
|
|
35
38
|
Without `--mode`, `--semantic`, or `--hybrid`, `search-advanced` stays keyword-first for fast agent reads.
|
|
39
|
+
|
|
40
|
+
## Reindex eval harness
|
|
41
|
+
|
|
42
|
+
`pm reindex --eval` runs a golden-query relevance harness after the reindex pass and appends a deterministic `eval` object to JSON output:
|
|
43
|
+
|
|
44
|
+
- per-fixture pass/fail verdicts
|
|
45
|
+
- `ndcg_at_5` score for each fixture
|
|
46
|
+
- aggregate `average_ndcg_at_5`, pass/fail counts, and overall status
|
|
47
|
+
|
|
48
|
+
The default fixture file is `tests/search-eval/golden-queries.json`. Override with `--eval-fixtures <path>`.
|
|
49
|
+
|
|
50
|
+
### Fixture schema
|
|
51
|
+
|
|
52
|
+
Fixtures can be either a top-level array or an object with a `fixtures` array:
|
|
53
|
+
|
|
54
|
+
```json
|
|
55
|
+
{
|
|
56
|
+
"fixtures": [
|
|
57
|
+
{
|
|
58
|
+
"name": "search-eval-task",
|
|
59
|
+
"query": "pm-22x2 search relevance evaluation harness",
|
|
60
|
+
"mode": "keyword",
|
|
61
|
+
"expected_top_ids": ["pm-22x2", "pm-fhsg"],
|
|
62
|
+
"min_ndcg_at_5": 0.8
|
|
63
|
+
}
|
|
64
|
+
]
|
|
65
|
+
}
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
Rules:
|
|
69
|
+
|
|
70
|
+
- `query` is required and must be non-empty.
|
|
71
|
+
- `mode` is optional (`keyword`, `semantic`, `hybrid`), default `keyword`.
|
|
72
|
+
- `expected_top_ids` is required and defines the ideal ranking for nDCG@5.
|
|
73
|
+
- `min_ndcg_at_5` is optional (`0..1`), default `0.7`.
|
|
@@ -200,6 +200,23 @@ const reindexFlags = [
|
|
|
200
200
|
value_type: "boolean",
|
|
201
201
|
description: "Emit non-interactive progress lines to stderr.",
|
|
202
202
|
},
|
|
203
|
+
{
|
|
204
|
+
long: "--eval",
|
|
205
|
+
value_type: "boolean",
|
|
206
|
+
description: "Run golden-query relevance eval and append nDCG@5 summary output.",
|
|
207
|
+
},
|
|
208
|
+
{
|
|
209
|
+
long: "--eval-fixtures",
|
|
210
|
+
value_name: "path",
|
|
211
|
+
value_type: "string",
|
|
212
|
+
description: "Path to reindex eval fixtures JSON (default: tests/search-eval/golden-queries.json).",
|
|
213
|
+
},
|
|
214
|
+
{
|
|
215
|
+
long: "--eval_fixtures",
|
|
216
|
+
value_name: "path",
|
|
217
|
+
value_type: "string",
|
|
218
|
+
description: "Alias for --eval-fixtures.",
|
|
219
|
+
},
|
|
203
220
|
];
|
|
204
221
|
|
|
205
222
|
function searchAdvancedCommand() {
|
|
@@ -222,6 +222,23 @@ const reindexFlags = [
|
|
|
222
222
|
value_type: "boolean",
|
|
223
223
|
description: "Emit non-interactive progress lines to stderr.",
|
|
224
224
|
},
|
|
225
|
+
{
|
|
226
|
+
long: "--eval",
|
|
227
|
+
value_type: "boolean",
|
|
228
|
+
description: "Run golden-query relevance eval and append nDCG@5 summary output.",
|
|
229
|
+
},
|
|
230
|
+
{
|
|
231
|
+
long: "--eval-fixtures",
|
|
232
|
+
value_name: "path",
|
|
233
|
+
value_type: "string",
|
|
234
|
+
description: "Path to reindex eval fixtures JSON (default: tests/search-eval/golden-queries.json).",
|
|
235
|
+
},
|
|
236
|
+
{
|
|
237
|
+
long: "--eval_fixtures",
|
|
238
|
+
value_name: "path",
|
|
239
|
+
value_type: "string",
|
|
240
|
+
description: "Alias for --eval-fixtures.",
|
|
241
|
+
},
|
|
225
242
|
] as const;
|
|
226
243
|
|
|
227
244
|
function searchAdvancedCommand(): CommandDefinition {
|
|
@@ -1,7 +1,13 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
1
2
|
import path from "node:path";
|
|
2
3
|
import { pathToFileURL } from "node:url";
|
|
3
4
|
|
|
4
5
|
const PM_PACKAGE_ROOT_ENV = "PM_CLI_PACKAGE_ROOT";
|
|
6
|
+
const DEFAULT_EVAL_FIXTURES_PATH = path.join("tests", "search-eval", "golden-queries.json");
|
|
7
|
+
const DEFAULT_EVAL_MIN_NDCG_AT_5 = 0.7;
|
|
8
|
+
const EVAL_RANK_CUTOFF = 5;
|
|
9
|
+
const VALID_EVAL_SEARCH_MODES = new Set(["keyword", "semantic", "hybrid"]);
|
|
10
|
+
|
|
5
11
|
const sdk = await loadSearchSdkModule();
|
|
6
12
|
const {
|
|
7
13
|
EXIT_CODE,
|
|
@@ -136,10 +142,219 @@ function normalizeReindexOptions(rawOptions) {
|
|
|
136
142
|
};
|
|
137
143
|
}
|
|
138
144
|
|
|
145
|
+
function normalizeEvalFixturePath(rawPath) {
|
|
146
|
+
const candidate = typeof rawPath === "string" ? rawPath : DEFAULT_EVAL_FIXTURES_PATH;
|
|
147
|
+
return path.resolve(process.cwd(), candidate);
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
function normalizeReindexRuntimeOptions(rawOptions) {
|
|
151
|
+
const reindex = normalizeReindexOptions(rawOptions);
|
|
152
|
+
const evalEnabled = readBooleanOption(rawOptions, "eval") === true;
|
|
153
|
+
const evalFixturePath = readStringOption(rawOptions, "evalFixtures", ["eval_fixtures"]);
|
|
154
|
+
if (!evalEnabled) {
|
|
155
|
+
if (typeof evalFixturePath === "string" && evalFixturePath.trim().length > 0) {
|
|
156
|
+
throw new PmCliError("`--eval-fixtures` requires `--eval`.", EXIT_CODE.USAGE);
|
|
157
|
+
}
|
|
158
|
+
return { reindex };
|
|
159
|
+
}
|
|
160
|
+
return {
|
|
161
|
+
reindex,
|
|
162
|
+
eval: {
|
|
163
|
+
fixturesPath: normalizeEvalFixturePath(evalFixturePath),
|
|
164
|
+
},
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
function toScoreAtRank(relevance, rankIndex) {
|
|
169
|
+
if (relevance <= 0) {
|
|
170
|
+
return 0;
|
|
171
|
+
}
|
|
172
|
+
return (2 ** relevance - 1) / Math.log2(rankIndex + 2);
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
function roundMetric(value) {
|
|
176
|
+
return Math.round(value * 10_000) / 10_000;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
function toCompactExpectedIds(value, fixtureLabel, fixturesPath) {
|
|
180
|
+
if (!Array.isArray(value) || value.length === 0) {
|
|
181
|
+
throw new PmCliError(
|
|
182
|
+
`Reindex eval fixture ${fixtureLabel} in ${fixturesPath} must provide a non-empty expected_top_ids array.`,
|
|
183
|
+
EXIT_CODE.USAGE,
|
|
184
|
+
);
|
|
185
|
+
}
|
|
186
|
+
const expectedIds = value
|
|
187
|
+
.filter((entry) => typeof entry === "string")
|
|
188
|
+
.map((entry) => entry.trim())
|
|
189
|
+
.filter((entry) => entry.length > 0);
|
|
190
|
+
if (expectedIds.length === 0) {
|
|
191
|
+
throw new PmCliError(
|
|
192
|
+
`Reindex eval fixture ${fixtureLabel} in ${fixturesPath} must provide at least one non-empty expected_top_ids value.`,
|
|
193
|
+
EXIT_CODE.USAGE,
|
|
194
|
+
);
|
|
195
|
+
}
|
|
196
|
+
return [...new Set(expectedIds)];
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
function normalizeFixtureMode(rawMode, fixtureLabel, fixturesPath) {
|
|
200
|
+
if (rawMode === undefined) {
|
|
201
|
+
return "keyword";
|
|
202
|
+
}
|
|
203
|
+
const normalized = typeof rawMode === "string" ? rawMode.trim().toLowerCase() : "";
|
|
204
|
+
if (VALID_EVAL_SEARCH_MODES.has(normalized)) {
|
|
205
|
+
return normalized;
|
|
206
|
+
}
|
|
207
|
+
throw new PmCliError(
|
|
208
|
+
`Reindex eval fixture ${fixtureLabel} in ${fixturesPath} has unsupported mode "${String(rawMode)}". Expected keyword|semantic|hybrid.`,
|
|
209
|
+
EXIT_CODE.USAGE,
|
|
210
|
+
);
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
function normalizeFixtureThreshold(rawValue, fixtureLabel, fixturesPath) {
|
|
214
|
+
if (rawValue === undefined) {
|
|
215
|
+
return DEFAULT_EVAL_MIN_NDCG_AT_5;
|
|
216
|
+
}
|
|
217
|
+
const parsed = typeof rawValue === "number" ? rawValue : Number.NaN;
|
|
218
|
+
if (!Number.isFinite(parsed) || parsed < 0 || parsed > 1) {
|
|
219
|
+
throw new PmCliError(
|
|
220
|
+
`Reindex eval fixture ${fixtureLabel} in ${fixturesPath} has invalid min_ndcg_at_5; expected a number between 0 and 1.`,
|
|
221
|
+
EXIT_CODE.USAGE,
|
|
222
|
+
);
|
|
223
|
+
}
|
|
224
|
+
return parsed;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
function normalizeFixtureEntry(rawFixture, index, fixturesPath) {
|
|
228
|
+
if (!rawFixture || typeof rawFixture !== "object") {
|
|
229
|
+
throw new PmCliError(
|
|
230
|
+
`Reindex eval fixture at index ${index + 1} in ${fixturesPath} must be an object.`,
|
|
231
|
+
EXIT_CODE.USAGE,
|
|
232
|
+
);
|
|
233
|
+
}
|
|
234
|
+
const rawQuery = typeof rawFixture.query === "string" ? rawFixture.query.trim() : "";
|
|
235
|
+
if (rawQuery.length === 0) {
|
|
236
|
+
throw new PmCliError(
|
|
237
|
+
`Reindex eval fixture at index ${index + 1} in ${fixturesPath} must provide a non-empty query.`,
|
|
238
|
+
EXIT_CODE.USAGE,
|
|
239
|
+
);
|
|
240
|
+
}
|
|
241
|
+
const fallbackName = `fixture-${index + 1}`;
|
|
242
|
+
const fixtureName =
|
|
243
|
+
typeof rawFixture.name === "string" && rawFixture.name.trim().length > 0 ? rawFixture.name.trim() : fallbackName;
|
|
244
|
+
return {
|
|
245
|
+
name: fixtureName,
|
|
246
|
+
query: rawQuery,
|
|
247
|
+
mode: normalizeFixtureMode(rawFixture.mode, fixtureName, fixturesPath),
|
|
248
|
+
expected_top_ids: toCompactExpectedIds(rawFixture.expected_top_ids, fixtureName, fixturesPath),
|
|
249
|
+
min_ndcg_at_5: normalizeFixtureThreshold(rawFixture.min_ndcg_at_5, fixtureName, fixturesPath),
|
|
250
|
+
};
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
function normalizeFixtureCollection(parsed, fixturesPath) {
|
|
254
|
+
const parsedObject = parsed && typeof parsed === "object" ? parsed : null;
|
|
255
|
+
const candidateFixtures = Array.isArray(parsed)
|
|
256
|
+
? parsed
|
|
257
|
+
: parsedObject && Array.isArray(parsedObject.fixtures)
|
|
258
|
+
? parsedObject.fixtures
|
|
259
|
+
: null;
|
|
260
|
+
if (!candidateFixtures) {
|
|
261
|
+
throw new PmCliError(
|
|
262
|
+
`Reindex eval fixtures at ${fixturesPath} must be an array or an object with a fixtures array.`,
|
|
263
|
+
EXIT_CODE.USAGE,
|
|
264
|
+
);
|
|
265
|
+
}
|
|
266
|
+
if (candidateFixtures.length === 0) {
|
|
267
|
+
throw new PmCliError(`Reindex eval fixtures at ${fixturesPath} must contain at least one fixture.`, EXIT_CODE.USAGE);
|
|
268
|
+
}
|
|
269
|
+
return candidateFixtures.map((entry, index) => normalizeFixtureEntry(entry, index, fixturesPath));
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
async function loadEvalFixtures(fixturesPath) {
|
|
273
|
+
let rawText = "";
|
|
274
|
+
try {
|
|
275
|
+
rawText = await readFile(fixturesPath, "utf8");
|
|
276
|
+
} catch {
|
|
277
|
+
throw new PmCliError(`Unable to read reindex eval fixtures at ${fixturesPath}.`, EXIT_CODE.USAGE);
|
|
278
|
+
}
|
|
279
|
+
let parsed;
|
|
280
|
+
try {
|
|
281
|
+
parsed = JSON.parse(rawText);
|
|
282
|
+
} catch {
|
|
283
|
+
throw new PmCliError(`Reindex eval fixtures at ${fixturesPath} must be valid JSON.`, EXIT_CODE.USAGE);
|
|
284
|
+
}
|
|
285
|
+
return normalizeFixtureCollection(parsed, fixturesPath);
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
function computeNdcgAt5(actualIds, expectedIds) {
|
|
289
|
+
const expectedTop = expectedIds.slice(0, EVAL_RANK_CUTOFF);
|
|
290
|
+
const relevanceById = new Map();
|
|
291
|
+
for (let index = 0; index < expectedTop.length; index += 1) {
|
|
292
|
+
relevanceById.set(expectedTop[index], expectedTop.length - index);
|
|
293
|
+
}
|
|
294
|
+
const dcg = actualIds.slice(0, EVAL_RANK_CUTOFF).reduce((sum, id, index) => {
|
|
295
|
+
const relevance = relevanceById.get(id) ?? 0;
|
|
296
|
+
return sum + toScoreAtRank(relevance, index);
|
|
297
|
+
}, 0);
|
|
298
|
+
const idealDcg = expectedTop.reduce((sum, _id, index) => sum + toScoreAtRank(expectedTop.length - index, index), 0);
|
|
299
|
+
return dcg / idealDcg;
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
async function runFixtureEvaluation(fixture, global) {
|
|
303
|
+
const searchResult = await runSearch(
|
|
304
|
+
fixture.query,
|
|
305
|
+
{
|
|
306
|
+
mode: fixture.mode,
|
|
307
|
+
limit: String(EVAL_RANK_CUTOFF),
|
|
308
|
+
fields: "id,score",
|
|
309
|
+
},
|
|
310
|
+
global,
|
|
311
|
+
);
|
|
312
|
+
const actualTopIds = searchResult.items.map((item) => item.id).slice(0, EVAL_RANK_CUTOFF);
|
|
313
|
+
const ndcgAt5 = roundMetric(computeNdcgAt5(actualTopIds, fixture.expected_top_ids));
|
|
314
|
+
const minNdcgAt5 = roundMetric(fixture.min_ndcg_at_5);
|
|
315
|
+
return {
|
|
316
|
+
fixture: fixture.name,
|
|
317
|
+
query: fixture.query,
|
|
318
|
+
requested_mode: fixture.mode,
|
|
319
|
+
resolved_mode: searchResult.mode,
|
|
320
|
+
expected_top_ids: fixture.expected_top_ids,
|
|
321
|
+
actual_top_ids: actualTopIds,
|
|
322
|
+
ndcg_at_5: ndcgAt5,
|
|
323
|
+
min_ndcg_at_5: minNdcgAt5,
|
|
324
|
+
passed: ndcgAt5 >= minNdcgAt5,
|
|
325
|
+
warnings: searchResult.warnings ?? [],
|
|
326
|
+
};
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
async function runReindexEvaluation(fixturesPath, global) {
|
|
330
|
+
const fixtures = await loadEvalFixtures(fixturesPath);
|
|
331
|
+
const results = await Promise.all(fixtures.map((fixture) => runFixtureEvaluation(fixture, global)));
|
|
332
|
+
const passCount = results.filter((result) => result.passed).length;
|
|
333
|
+
const averageNdcg = roundMetric(results.reduce((sum, result) => sum + result.ndcg_at_5, 0) / results.length);
|
|
334
|
+
return {
|
|
335
|
+
enabled: true,
|
|
336
|
+
fixtures_path: fixturesPath,
|
|
337
|
+
k: EVAL_RANK_CUTOFF,
|
|
338
|
+
fixture_count: results.length,
|
|
339
|
+
pass_count: passCount,
|
|
340
|
+
fail_count: results.length - passCount,
|
|
341
|
+
average_ndcg_at_5: averageNdcg,
|
|
342
|
+
passed: passCount === results.length,
|
|
343
|
+
results,
|
|
344
|
+
evaluated_at: new Date().toISOString(),
|
|
345
|
+
};
|
|
346
|
+
}
|
|
347
|
+
|
|
139
348
|
export async function runAdvancedSearchPackage(args, rawOptions, global) {
|
|
140
349
|
return runSearch(resolveSearchQuery(args), normalizeAdvancedSearchOptions(rawOptions, args), global);
|
|
141
350
|
}
|
|
142
351
|
|
|
143
352
|
export async function runAdvancedReindexPackage(rawOptions, global) {
|
|
144
|
-
|
|
353
|
+
const options = normalizeReindexRuntimeOptions(rawOptions);
|
|
354
|
+
const reindexResult = await runReindex(options.reindex, global);
|
|
355
|
+
if (!options.eval) {
|
|
356
|
+
return reindexResult;
|
|
357
|
+
}
|
|
358
|
+
const evalSummary = await runReindexEvaluation(options.eval.fixturesPath, global);
|
|
359
|
+
return { ...reindexResult, eval: evalSummary };
|
|
145
360
|
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
1
2
|
import path from "node:path";
|
|
2
3
|
import { pathToFileURL } from "node:url";
|
|
3
4
|
import type {
|
|
@@ -9,6 +10,12 @@ import type {
|
|
|
9
10
|
} from "../../../../src/sdk/runtime.js";
|
|
10
11
|
|
|
11
12
|
const PM_PACKAGE_ROOT_ENV = "PM_CLI_PACKAGE_ROOT";
|
|
13
|
+
const DEFAULT_EVAL_FIXTURES_PATH = path.join("tests", "search-eval", "golden-queries.json");
|
|
14
|
+
const DEFAULT_EVAL_MIN_NDCG_AT_5 = 0.7;
|
|
15
|
+
const EVAL_RANK_CUTOFF = 5;
|
|
16
|
+
const VALID_EVAL_SEARCH_MODES = new Set(["keyword", "semantic", "hybrid"] as const);
|
|
17
|
+
|
|
18
|
+
type EvalSearchMode = "keyword" | "semantic" | "hybrid";
|
|
12
19
|
|
|
13
20
|
interface SearchRuntimeSdkModule {
|
|
14
21
|
EXIT_CODE: {
|
|
@@ -31,6 +38,59 @@ const {
|
|
|
31
38
|
readBooleanOption,
|
|
32
39
|
} = sdk;
|
|
33
40
|
|
|
41
|
+
interface SearchEvalFixtureInput {
|
|
42
|
+
query?: unknown;
|
|
43
|
+
mode?: unknown;
|
|
44
|
+
expected_top_ids?: unknown;
|
|
45
|
+
min_ndcg_at_5?: unknown;
|
|
46
|
+
name?: unknown;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
interface SearchEvalFixture {
|
|
50
|
+
name: string;
|
|
51
|
+
query: string;
|
|
52
|
+
mode: EvalSearchMode;
|
|
53
|
+
expected_top_ids: string[];
|
|
54
|
+
min_ndcg_at_5: number;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
interface SearchEvalResult {
|
|
58
|
+
fixture: string;
|
|
59
|
+
query: string;
|
|
60
|
+
requested_mode: EvalSearchMode;
|
|
61
|
+
resolved_mode: SearchResult["mode"];
|
|
62
|
+
expected_top_ids: string[];
|
|
63
|
+
actual_top_ids: string[];
|
|
64
|
+
ndcg_at_5: number;
|
|
65
|
+
min_ndcg_at_5: number;
|
|
66
|
+
passed: boolean;
|
|
67
|
+
warnings: string[];
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
interface ReindexEvalSummary {
|
|
71
|
+
enabled: true;
|
|
72
|
+
fixtures_path: string;
|
|
73
|
+
k: number;
|
|
74
|
+
fixture_count: number;
|
|
75
|
+
pass_count: number;
|
|
76
|
+
fail_count: number;
|
|
77
|
+
average_ndcg_at_5: number;
|
|
78
|
+
passed: boolean;
|
|
79
|
+
results: SearchEvalResult[];
|
|
80
|
+
evaluated_at: string;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
interface ReindexResultWithEval extends ReindexResult {
|
|
84
|
+
eval?: ReindexEvalSummary;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
interface ReindexRuntimeOptions {
|
|
88
|
+
reindex: ReindexOptions;
|
|
89
|
+
eval?: {
|
|
90
|
+
fixturesPath: string;
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
|
|
34
94
|
async function loadSearchSdkModule(): Promise<SearchRuntimeSdkModule> {
|
|
35
95
|
const envRoot = process.env[PM_PACKAGE_ROOT_ENV];
|
|
36
96
|
if (typeof envRoot !== "string" || envRoot.trim().length === 0) {
|
|
@@ -155,6 +215,209 @@ function normalizeReindexOptions(rawOptions: Record<string, unknown>): ReindexOp
|
|
|
155
215
|
};
|
|
156
216
|
}
|
|
157
217
|
|
|
218
|
+
function normalizeEvalFixturePath(rawPath: string | undefined): string {
|
|
219
|
+
const candidate = typeof rawPath === "string" ? rawPath : DEFAULT_EVAL_FIXTURES_PATH;
|
|
220
|
+
return path.resolve(process.cwd(), candidate);
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
function normalizeReindexRuntimeOptions(rawOptions: Record<string, unknown>): ReindexRuntimeOptions {
|
|
224
|
+
const reindex = normalizeReindexOptions(rawOptions);
|
|
225
|
+
const evalEnabled = readBooleanOption(rawOptions, "eval") === true;
|
|
226
|
+
const evalFixturePath = readStringOption(rawOptions, "evalFixtures", ["eval_fixtures"]);
|
|
227
|
+
if (!evalEnabled) {
|
|
228
|
+
if (typeof evalFixturePath === "string" && evalFixturePath.trim().length > 0) {
|
|
229
|
+
throw new PmCliError("`--eval-fixtures` requires `--eval`.", EXIT_CODE.USAGE);
|
|
230
|
+
}
|
|
231
|
+
return { reindex };
|
|
232
|
+
}
|
|
233
|
+
return {
|
|
234
|
+
reindex,
|
|
235
|
+
eval: {
|
|
236
|
+
fixturesPath: normalizeEvalFixturePath(evalFixturePath),
|
|
237
|
+
},
|
|
238
|
+
};
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
function toScoreAtRank(relevance: number, rankIndex: number): number {
|
|
242
|
+
if (relevance <= 0) {
|
|
243
|
+
return 0;
|
|
244
|
+
}
|
|
245
|
+
return (2 ** relevance - 1) / Math.log2(rankIndex + 2);
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
function roundMetric(value: number): number {
|
|
249
|
+
return Math.round(value * 10_000) / 10_000;
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
function toCompactExpectedIds(value: unknown, fixtureLabel: string, fixturesPath: string): string[] {
|
|
253
|
+
if (!Array.isArray(value) || value.length === 0) {
|
|
254
|
+
throw new PmCliError(
|
|
255
|
+
`Reindex eval fixture ${fixtureLabel} in ${fixturesPath} must provide a non-empty expected_top_ids array.`,
|
|
256
|
+
EXIT_CODE.USAGE,
|
|
257
|
+
);
|
|
258
|
+
}
|
|
259
|
+
const expectedIds = value
|
|
260
|
+
.filter((entry): entry is string => typeof entry === "string")
|
|
261
|
+
.map((entry) => entry.trim())
|
|
262
|
+
.filter((entry) => entry.length > 0);
|
|
263
|
+
if (expectedIds.length === 0) {
|
|
264
|
+
throw new PmCliError(
|
|
265
|
+
`Reindex eval fixture ${fixtureLabel} in ${fixturesPath} must provide at least one non-empty expected_top_ids value.`,
|
|
266
|
+
EXIT_CODE.USAGE,
|
|
267
|
+
);
|
|
268
|
+
}
|
|
269
|
+
return [...new Set(expectedIds)];
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
function normalizeFixtureMode(rawMode: unknown, fixtureLabel: string, fixturesPath: string): EvalSearchMode {
|
|
273
|
+
if (rawMode === undefined) {
|
|
274
|
+
return "keyword";
|
|
275
|
+
}
|
|
276
|
+
const normalized = typeof rawMode === "string" ? rawMode.trim().toLowerCase() : "";
|
|
277
|
+
if (VALID_EVAL_SEARCH_MODES.has(normalized as EvalSearchMode)) {
|
|
278
|
+
return normalized as EvalSearchMode;
|
|
279
|
+
}
|
|
280
|
+
throw new PmCliError(
|
|
281
|
+
`Reindex eval fixture ${fixtureLabel} in ${fixturesPath} has unsupported mode "${String(rawMode)}". Expected keyword|semantic|hybrid.`,
|
|
282
|
+
EXIT_CODE.USAGE,
|
|
283
|
+
);
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
function normalizeFixtureThreshold(rawValue: unknown, fixtureLabel: string, fixturesPath: string): number {
|
|
287
|
+
if (rawValue === undefined) {
|
|
288
|
+
return DEFAULT_EVAL_MIN_NDCG_AT_5;
|
|
289
|
+
}
|
|
290
|
+
const parsed = typeof rawValue === "number" ? rawValue : Number.NaN;
|
|
291
|
+
if (!Number.isFinite(parsed) || parsed < 0 || parsed > 1) {
|
|
292
|
+
throw new PmCliError(
|
|
293
|
+
`Reindex eval fixture ${fixtureLabel} in ${fixturesPath} has invalid min_ndcg_at_5; expected a number between 0 and 1.`,
|
|
294
|
+
EXIT_CODE.USAGE,
|
|
295
|
+
);
|
|
296
|
+
}
|
|
297
|
+
return parsed;
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
function normalizeFixtureEntry(rawFixture: unknown, index: number, fixturesPath: string): SearchEvalFixture {
|
|
301
|
+
if (!rawFixture || typeof rawFixture !== "object") {
|
|
302
|
+
throw new PmCliError(
|
|
303
|
+
`Reindex eval fixture at index ${index + 1} in ${fixturesPath} must be an object.`,
|
|
304
|
+
EXIT_CODE.USAGE,
|
|
305
|
+
);
|
|
306
|
+
}
|
|
307
|
+
const fixture = rawFixture as SearchEvalFixtureInput;
|
|
308
|
+
const rawQuery = typeof fixture.query === "string" ? fixture.query.trim() : "";
|
|
309
|
+
if (rawQuery.length === 0) {
|
|
310
|
+
throw new PmCliError(
|
|
311
|
+
`Reindex eval fixture at index ${index + 1} in ${fixturesPath} must provide a non-empty query.`,
|
|
312
|
+
EXIT_CODE.USAGE,
|
|
313
|
+
);
|
|
314
|
+
}
|
|
315
|
+
const fallbackName = `fixture-${index + 1}`;
|
|
316
|
+
const fixtureName = typeof fixture.name === "string" && fixture.name.trim().length > 0 ? fixture.name.trim() : fallbackName;
|
|
317
|
+
return {
|
|
318
|
+
name: fixtureName,
|
|
319
|
+
query: rawQuery,
|
|
320
|
+
mode: normalizeFixtureMode(fixture.mode, fixtureName, fixturesPath),
|
|
321
|
+
expected_top_ids: toCompactExpectedIds(fixture.expected_top_ids, fixtureName, fixturesPath),
|
|
322
|
+
min_ndcg_at_5: normalizeFixtureThreshold(fixture.min_ndcg_at_5, fixtureName, fixturesPath),
|
|
323
|
+
};
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
function normalizeFixtureCollection(parsed: unknown, fixturesPath: string): SearchEvalFixture[] {
|
|
327
|
+
const parsedObject = parsed as { fixtures?: unknown } | null;
|
|
328
|
+
const candidateFixtures = Array.isArray(parsed)
|
|
329
|
+
? parsed
|
|
330
|
+
: parsedObject && Array.isArray(parsedObject.fixtures)
|
|
331
|
+
? parsedObject.fixtures
|
|
332
|
+
: null;
|
|
333
|
+
if (!candidateFixtures) {
|
|
334
|
+
throw new PmCliError(
|
|
335
|
+
`Reindex eval fixtures at ${fixturesPath} must be an array or an object with a fixtures array.`,
|
|
336
|
+
EXIT_CODE.USAGE,
|
|
337
|
+
);
|
|
338
|
+
}
|
|
339
|
+
if (candidateFixtures.length === 0) {
|
|
340
|
+
throw new PmCliError(`Reindex eval fixtures at ${fixturesPath} must contain at least one fixture.`, EXIT_CODE.USAGE);
|
|
341
|
+
}
|
|
342
|
+
return candidateFixtures.map((entry, index) => normalizeFixtureEntry(entry, index, fixturesPath));
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
async function loadEvalFixtures(fixturesPath: string): Promise<SearchEvalFixture[]> {
|
|
346
|
+
let rawText = "";
|
|
347
|
+
try {
|
|
348
|
+
rawText = await readFile(fixturesPath, "utf8");
|
|
349
|
+
} catch {
|
|
350
|
+
throw new PmCliError(`Unable to read reindex eval fixtures at ${fixturesPath}.`, EXIT_CODE.USAGE);
|
|
351
|
+
}
|
|
352
|
+
let parsed: unknown;
|
|
353
|
+
try {
|
|
354
|
+
parsed = JSON.parse(rawText);
|
|
355
|
+
} catch {
|
|
356
|
+
throw new PmCliError(`Reindex eval fixtures at ${fixturesPath} must be valid JSON.`, EXIT_CODE.USAGE);
|
|
357
|
+
}
|
|
358
|
+
return normalizeFixtureCollection(parsed, fixturesPath);
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
function computeNdcgAt5(actualIds: readonly string[], expectedIds: readonly string[]): number {
|
|
362
|
+
const expectedTop = expectedIds.slice(0, EVAL_RANK_CUTOFF);
|
|
363
|
+
const relevanceById = new Map<string, number>();
|
|
364
|
+
for (let index = 0; index < expectedTop.length; index += 1) {
|
|
365
|
+
relevanceById.set(expectedTop[index], expectedTop.length - index);
|
|
366
|
+
}
|
|
367
|
+
const dcg = actualIds.slice(0, EVAL_RANK_CUTOFF).reduce((sum, id, index) => {
|
|
368
|
+
const relevance = relevanceById.get(id) ?? 0;
|
|
369
|
+
return sum + toScoreAtRank(relevance, index);
|
|
370
|
+
}, 0);
|
|
371
|
+
const idealDcg = expectedTop.reduce((sum, _id, index) => sum + toScoreAtRank(expectedTop.length - index, index), 0);
|
|
372
|
+
return dcg / idealDcg;
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
async function runFixtureEvaluation(fixture: SearchEvalFixture, global: GlobalOptions): Promise<SearchEvalResult> {
|
|
376
|
+
const searchResult = await runSearch(
|
|
377
|
+
fixture.query,
|
|
378
|
+
{
|
|
379
|
+
mode: fixture.mode,
|
|
380
|
+
limit: String(EVAL_RANK_CUTOFF),
|
|
381
|
+
fields: "id,score",
|
|
382
|
+
},
|
|
383
|
+
global,
|
|
384
|
+
);
|
|
385
|
+
const actualTopIds = searchResult.items.map((item) => (item as { id: string }).id).slice(0, EVAL_RANK_CUTOFF);
|
|
386
|
+
const ndcgAt5 = roundMetric(computeNdcgAt5(actualTopIds, fixture.expected_top_ids));
|
|
387
|
+
const minNdcgAt5 = roundMetric(fixture.min_ndcg_at_5);
|
|
388
|
+
return {
|
|
389
|
+
fixture: fixture.name,
|
|
390
|
+
query: fixture.query,
|
|
391
|
+
requested_mode: fixture.mode,
|
|
392
|
+
resolved_mode: searchResult.mode,
|
|
393
|
+
expected_top_ids: fixture.expected_top_ids,
|
|
394
|
+
actual_top_ids: actualTopIds,
|
|
395
|
+
ndcg_at_5: ndcgAt5,
|
|
396
|
+
min_ndcg_at_5: minNdcgAt5,
|
|
397
|
+
passed: ndcgAt5 >= minNdcgAt5,
|
|
398
|
+
warnings: searchResult.warnings ?? [],
|
|
399
|
+
};
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
async function runReindexEvaluation(fixturesPath: string, global: GlobalOptions): Promise<ReindexEvalSummary> {
|
|
403
|
+
const fixtures = await loadEvalFixtures(fixturesPath);
|
|
404
|
+
const results: SearchEvalResult[] = await Promise.all(fixtures.map((fixture) => runFixtureEvaluation(fixture, global)));
|
|
405
|
+
const passCount = results.filter((result) => result.passed).length;
|
|
406
|
+
const averageNdcg = roundMetric(results.reduce((sum, result) => sum + result.ndcg_at_5, 0) / results.length);
|
|
407
|
+
return {
|
|
408
|
+
enabled: true,
|
|
409
|
+
fixtures_path: fixturesPath,
|
|
410
|
+
k: EVAL_RANK_CUTOFF,
|
|
411
|
+
fixture_count: results.length,
|
|
412
|
+
pass_count: passCount,
|
|
413
|
+
fail_count: results.length - passCount,
|
|
414
|
+
average_ndcg_at_5: averageNdcg,
|
|
415
|
+
passed: passCount === results.length,
|
|
416
|
+
results,
|
|
417
|
+
evaluated_at: new Date().toISOString(),
|
|
418
|
+
};
|
|
419
|
+
}
|
|
420
|
+
|
|
158
421
|
export async function runAdvancedSearchPackage(
|
|
159
422
|
args: string[],
|
|
160
423
|
rawOptions: Record<string, unknown>,
|
|
@@ -166,6 +429,12 @@ export async function runAdvancedSearchPackage(
|
|
|
166
429
|
export async function runAdvancedReindexPackage(
|
|
167
430
|
rawOptions: Record<string, unknown>,
|
|
168
431
|
global: GlobalOptions,
|
|
169
|
-
): Promise<
|
|
170
|
-
|
|
432
|
+
): Promise<ReindexResultWithEval> {
|
|
433
|
+
const options = normalizeReindexRuntimeOptions(rawOptions);
|
|
434
|
+
const reindexResult = await runReindex(options.reindex, global);
|
|
435
|
+
if (!options.eval) {
|
|
436
|
+
return reindexResult;
|
|
437
|
+
}
|
|
438
|
+
const evalSummary = await runReindexEvaluation(options.eval.fixturesPath, global);
|
|
439
|
+
return { ...reindexResult, eval: evalSummary };
|
|
171
440
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "pm-claude",
|
|
3
|
-
"description": "Native pm CLI integration for Claude Code —
|
|
3
|
+
"description": "Native pm CLI integration for Claude Code — 21 MCP tools, 5 workflow skills, 14 slash commands, 3 subagents (coordinator, triage, verification), hybrid TUI task tracking (pm as persistent store + Claude Code task panel as live view), session context injection, and full git-based project management without leaving Claude Code.",
|
|
4
4
|
"version": "1.4.0",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "unbrained",
|