@unbrained/pm-cli 2026.6.12 → 2026.6.16
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 +103 -0
- package/README.md +2 -2
- package/dist/cli/bootstrap-args.d.ts +29 -0
- package/dist/cli/bootstrap-args.js +11 -4
- package/dist/cli/bootstrap-args.js.map +1 -1
- package/dist/cli/commander-usage.d.ts +12 -0
- package/dist/cli/commander-usage.js +18 -7
- package/dist/cli/commander-usage.js.map +1 -1
- package/dist/cli/commands/activity.d.ts +19 -0
- package/dist/cli/commands/activity.js +12 -2
- package/dist/cli/commands/activity.js.map +1 -1
- package/dist/cli/commands/aggregate.d.ts +58 -0
- package/dist/cli/commands/aggregate.js +48 -15
- package/dist/cli/commands/aggregate.js.map +1 -1
- package/dist/cli/commands/annotation-command.d.ts +6 -1
- package/dist/cli/commands/annotation-command.js +72 -2
- package/dist/cli/commands/annotation-command.js.map +1 -1
- package/dist/cli/commands/append.js +4 -3
- package/dist/cli/commands/append.js.map +1 -1
- package/dist/cli/commands/close-many.d.ts +20 -0
- package/dist/cli/commands/close-many.js +14 -23
- package/dist/cli/commands/close-many.js.map +1 -1
- package/dist/cli/commands/close.js +37 -4
- package/dist/cli/commands/close.js.map +1 -1
- package/dist/cli/commands/comments-audit.js +3 -2
- package/dist/cli/commands/comments-audit.js.map +1 -1
- package/dist/cli/commands/comments.d.ts +2 -0
- package/dist/cli/commands/comments.js +49 -23
- package/dist/cli/commands/comments.js.map +1 -1
- package/dist/cli/commands/completion.js +269 -8
- package/dist/cli/commands/completion.js.map +1 -1
- package/dist/cli/commands/config.d.ts +51 -1
- package/dist/cli/commands/config.js +50 -12
- package/dist/cli/commands/config.js.map +1 -1
- package/dist/cli/commands/context.d.ts +79 -1
- package/dist/cli/commands/context.js +151 -25
- package/dist/cli/commands/context.js.map +1 -1
- package/dist/cli/commands/contracts.d.ts +80 -1
- package/dist/cli/commands/contracts.js +54 -4
- package/dist/cli/commands/contracts.js.map +1 -1
- package/dist/cli/commands/create.d.ts +49 -0
- package/dist/cli/commands/create.js +112 -7
- package/dist/cli/commands/create.js.map +1 -1
- package/dist/cli/commands/dedupe-audit.d.ts +33 -0
- package/dist/cli/commands/dedupe-audit.js +18 -14
- package/dist/cli/commands/dedupe-audit.js.map +1 -1
- package/dist/cli/commands/deps.js +7 -4
- package/dist/cli/commands/deps.js.map +1 -1
- package/dist/cli/commands/event-validation-messages.js +3 -3
- package/dist/cli/commands/event-validation-messages.js.map +1 -1
- package/dist/cli/commands/extension/bundled-catalog.d.ts +7 -0
- package/dist/cli/commands/extension/bundled-catalog.js +19 -15
- package/dist/cli/commands/extension/bundled-catalog.js.map +1 -1
- package/dist/cli/commands/extension/install-sources.d.ts +41 -1
- package/dist/cli/commands/extension/install-sources.js +26 -8
- package/dist/cli/commands/extension/install-sources.js.map +1 -1
- package/dist/cli/commands/extension/shared.d.ts +5 -0
- package/dist/cli/commands/extension/shared.js +9 -3
- package/dist/cli/commands/extension/shared.js.map +1 -1
- package/dist/cli/commands/extension.d.ts +133 -1
- package/dist/cli/commands/extension.js +127 -9
- package/dist/cli/commands/extension.js.map +1 -1
- package/dist/cli/commands/files.d.ts +30 -1
- package/dist/cli/commands/files.js +21 -2
- package/dist/cli/commands/files.js.map +1 -1
- package/dist/cli/commands/focus.d.ts +11 -0
- package/dist/cli/commands/focus.js +86 -0
- package/dist/cli/commands/focus.js.map +1 -0
- package/dist/cli/commands/get.d.ts +9 -2
- package/dist/cli/commands/get.js +34 -6
- package/dist/cli/commands/get.js.map +1 -1
- package/dist/cli/commands/guide.d.ts +5 -0
- package/dist/cli/commands/guide.js +6 -3
- package/dist/cli/commands/guide.js.map +1 -1
- package/dist/cli/commands/health.d.ts +109 -0
- package/dist/cli/commands/health.js +87 -35
- package/dist/cli/commands/health.js.map +1 -1
- package/dist/cli/commands/history-compact.js +27 -36
- package/dist/cli/commands/history-compact.js.map +1 -1
- package/dist/cli/commands/history-redact.d.ts +46 -0
- package/dist/cli/commands/history-redact.js +99 -67
- package/dist/cli/commands/history-redact.js.map +1 -1
- package/dist/cli/commands/history-repair.js +34 -37
- package/dist/cli/commands/history-repair.js.map +1 -1
- package/dist/cli/commands/history.js +6 -2
- package/dist/cli/commands/history.js.map +1 -1
- package/dist/cli/commands/index.d.ts +1 -0
- package/dist/cli/commands/index.js +3 -2
- package/dist/cli/commands/index.js.map +1 -1
- package/dist/cli/commands/init-agent-guidance.d.ts +54 -0
- package/dist/cli/commands/init-agent-guidance.js +31 -4
- package/dist/cli/commands/init-agent-guidance.js.map +1 -1
- package/dist/cli/commands/init.d.ts +36 -1
- package/dist/cli/commands/init.js +38 -5
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/learnings.js +4 -3
- package/dist/cli/commands/learnings.js.map +1 -1
- package/dist/cli/commands/linked-test-parsers.d.ts +5 -0
- package/dist/cli/commands/linked-test-parsers.js +5 -2
- package/dist/cli/commands/linked-test-parsers.js.map +1 -1
- package/dist/cli/commands/list-filter-shared.d.ts +8 -0
- package/dist/cli/commands/list-filter-shared.js +70 -0
- package/dist/cli/commands/list-filter-shared.js.map +1 -0
- package/dist/cli/commands/list.d.ts +116 -0
- package/dist/cli/commands/list.js +194 -6
- package/dist/cli/commands/list.js.map +1 -1
- package/dist/cli/commands/normalize.js +16 -2
- package/dist/cli/commands/normalize.js.map +1 -1
- package/dist/cli/commands/notes.js +4 -3
- package/dist/cli/commands/notes.js.map +1 -1
- package/dist/cli/commands/plan.js +3 -2
- package/dist/cli/commands/plan.js.map +1 -1
- package/dist/cli/commands/reindex.d.ts +83 -0
- package/dist/cli/commands/reindex.js +45 -10
- package/dist/cli/commands/reindex.js.map +1 -1
- package/dist/cli/commands/restore.d.ts +40 -1
- package/dist/cli/commands/restore.js +27 -2
- package/dist/cli/commands/restore.js.map +1 -1
- package/dist/cli/commands/schema.d.ts +18 -0
- package/dist/cli/commands/schema.js +30 -3
- package/dist/cli/commands/schema.js.map +1 -1
- package/dist/cli/commands/search.d.ts +289 -1
- package/dist/cli/commands/search.js +367 -60
- package/dist/cli/commands/search.js.map +1 -1
- package/dist/cli/commands/stats.d.ts +38 -0
- package/dist/cli/commands/stats.js +38 -10
- package/dist/cli/commands/stats.js.map +1 -1
- package/dist/cli/commands/telemetry.js +5 -3
- package/dist/cli/commands/telemetry.js.map +1 -1
- package/dist/cli/commands/templates.d.ts +18 -0
- package/dist/cli/commands/templates.js +9 -2
- package/dist/cli/commands/templates.js.map +1 -1
- package/dist/cli/commands/test-all.d.ts +5 -0
- package/dist/cli/commands/test-all.js +9 -3
- package/dist/cli/commands/test-all.js.map +1 -1
- package/dist/cli/commands/test.d.ts +70 -1
- package/dist/cli/commands/test.js +84 -3
- package/dist/cli/commands/test.js.map +1 -1
- package/dist/cli/commands/update-many.d.ts +34 -1
- package/dist/cli/commands/update-many.js +60 -31
- package/dist/cli/commands/update-many.js.map +1 -1
- package/dist/cli/commands/update.d.ts +71 -0
- package/dist/cli/commands/update.js +74 -8
- package/dist/cli/commands/update.js.map +1 -1
- package/dist/cli/commands/upgrade.d.ts +28 -1
- package/dist/cli/commands/upgrade.js +17 -4
- package/dist/cli/commands/upgrade.js.map +1 -1
- package/dist/cli/commands/validate.d.ts +114 -0
- package/dist/cli/commands/validate.js +154 -9
- package/dist/cli/commands/validate.js.map +1 -1
- package/dist/cli/error-guidance.d.ts +30 -0
- package/dist/cli/error-guidance.js +68 -6
- package/dist/cli/error-guidance.js.map +1 -1
- package/dist/cli/extension-command-options.js +9 -7
- package/dist/cli/extension-command-options.js.map +1 -1
- package/dist/cli/help-content.d.ts +8 -0
- package/dist/cli/help-content.js +30 -6
- package/dist/cli/help-content.js.map +1 -1
- package/dist/cli/help-json-payload.d.ts +19 -1
- package/dist/cli/help-json-payload.js +16 -7
- package/dist/cli/help-json-payload.js.map +1 -1
- package/dist/cli/main.d.ts +223 -0
- package/dist/cli/main.js +214 -46
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/register-list-query.js +62 -5
- package/dist/cli/register-list-query.js.map +1 -1
- package/dist/cli/register-mutation.d.ts +16 -0
- package/dist/cli/register-mutation.js +210 -40
- package/dist/cli/register-mutation.js.map +1 -1
- package/dist/cli/register-operations.d.ts +8 -0
- package/dist/cli/register-operations.js +33 -11
- package/dist/cli/register-operations.js.map +1 -1
- package/dist/cli/register-setup.js +9 -6
- package/dist/cli/register-setup.js.map +1 -1
- package/dist/cli/registration-helpers.d.ts +4 -0
- package/dist/cli/registration-helpers.js +124 -38
- package/dist/cli/registration-helpers.js.map +1 -1
- package/dist/cli-bundle/chunks/activity-5P2KQCTH.js +18 -0
- package/dist/cli-bundle/chunks/{activity-XADJOG6G.js → activity-MJGTX4LO.js} +13 -11
- package/dist/cli-bundle/chunks/{aggregate-OD36DJU5.js → aggregate-MH3GROKB.js} +54 -25
- package/dist/cli-bundle/chunks/aggregate-MH3GROKB.js.map +7 -0
- package/dist/cli-bundle/chunks/{aggregate-6OTS3AOO.js → aggregate-OUGCDFNC.js} +55 -26
- package/dist/cli-bundle/chunks/aggregate-OUGCDFNC.js.map +1 -0
- package/dist/cli-bundle/chunks/{append-JYWO4P7W.js → append-2Q4BPUBW.js} +10 -10
- package/dist/cli-bundle/chunks/{append-JYWO4P7W.js.map → append-2Q4BPUBW.js.map} +2 -2
- package/dist/cli-bundle/chunks/{append-KG55G7S3.js → append-VCRUG2W6.js} +11 -11
- package/dist/cli-bundle/chunks/append-VCRUG2W6.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-IGVJRZ6H.js → chunk-2IUJBMKS.js} +10 -9
- package/dist/cli-bundle/chunks/{chunk-IGVJRZ6H.js.map → chunk-2IUJBMKS.js.map} +2 -2
- package/dist/cli-bundle/chunks/{chunk-ATEES5SX.js → chunk-2JEGCDYT.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-XUC4C4PT.js → chunk-3WAULYOY.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-UIG4TW2H.js → chunk-3XOXWOGA.js} +359 -19
- package/dist/cli-bundle/chunks/chunk-3XOXWOGA.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-3KLPFWZ4.js → chunk-4KBK4BA3.js} +16 -34
- package/dist/cli-bundle/chunks/chunk-4KBK4BA3.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-OLKBSY4N.js → chunk-4VLB4JH2.js} +51 -8
- package/dist/cli-bundle/chunks/chunk-4VLB4JH2.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-ZMW77VWV.js → chunk-656HPQPO.js} +27 -12
- package/dist/cli-bundle/chunks/chunk-656HPQPO.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-CW6E4NAT.js → chunk-667XI4UJ.js} +309 -20
- package/dist/cli-bundle/chunks/chunk-667XI4UJ.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-5SCT2JCT.js → chunk-6BV7ENQL.js} +9 -8
- package/dist/cli-bundle/chunks/chunk-6BV7ENQL.js.map +7 -0
- package/dist/cli-bundle/chunks/chunk-6EFCFPNE.js +35 -0
- package/dist/cli-bundle/chunks/chunk-6EFCFPNE.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-VFUZV5EB.js → chunk-6NQXMGYU.js} +19 -8
- package/dist/cli-bundle/chunks/chunk-6NQXMGYU.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-GKIZW7SM.js → chunk-764O7EUA.js} +223 -50
- package/dist/cli-bundle/chunks/chunk-764O7EUA.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-QJMGRZO2.js → chunk-7AGIXLNK.js} +3 -3
- package/dist/cli-bundle/chunks/chunk-7EILPFMA.js +404 -0
- package/dist/cli-bundle/chunks/chunk-7EILPFMA.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-HI7STVF2.js → chunk-7K2MXFMX.js} +14 -32
- package/dist/cli-bundle/chunks/chunk-7K2MXFMX.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-TNAP7EJX.js → chunk-7L5VOUYP.js} +6 -17
- package/dist/cli-bundle/chunks/chunk-7L5VOUYP.js.map +7 -0
- package/dist/cli-bundle/chunks/chunk-7ZGKNHUL.js +61 -0
- package/dist/cli-bundle/chunks/chunk-7ZGKNHUL.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-7IYFN5R7.js → chunk-A576QZDL.js} +223 -50
- package/dist/cli-bundle/chunks/chunk-A576QZDL.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-KBPQHXWG.js → chunk-AERT7KT3.js} +5 -5
- package/dist/cli-bundle/chunks/chunk-ASM4DVRW.js +58 -0
- package/dist/cli-bundle/chunks/chunk-ASM4DVRW.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-KWAXVAXX.js → chunk-B5Q7XC4K.js} +117 -37
- package/dist/cli-bundle/chunks/chunk-B5Q7XC4K.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-EWFY7SLA.js → chunk-BJWTFOZM.js} +74 -14
- package/dist/cli-bundle/chunks/chunk-BJWTFOZM.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-XJDGS74Y.js → chunk-CBMETQ2U.js} +105 -31
- package/dist/cli-bundle/chunks/chunk-CBMETQ2U.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-ESANVZF4.js → chunk-E6J2PEK6.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-VSRZRLG3.js → chunk-F2GC6L3N.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-I7NYDZDV.js → chunk-F7WSO5UX.js} +7 -18
- package/dist/cli-bundle/chunks/chunk-F7WSO5UX.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-VAOUX6TK.js → chunk-FTAZLAR7.js} +8 -5
- package/dist/cli-bundle/chunks/{chunk-VAOUX6TK.js.map → chunk-FTAZLAR7.js.map} +1 -1
- package/dist/cli-bundle/chunks/{chunk-OASDW5UI.js → chunk-FXNT5LPX.js} +77 -9
- package/dist/cli-bundle/chunks/chunk-FXNT5LPX.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-WUNFKP7M.js → chunk-G2YVUY7I.js} +14 -9
- package/dist/cli-bundle/chunks/chunk-G2YVUY7I.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-L5EPZQIC.js → chunk-G3CEIXTV.js} +68 -19
- package/dist/cli-bundle/chunks/chunk-G3CEIXTV.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-UUWGCWBU.js → chunk-GAVE4MYM.js} +37 -63
- package/dist/cli-bundle/chunks/chunk-GAVE4MYM.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-SXKNJPQ7.js → chunk-GQ4JKNMV.js} +4 -4
- package/dist/cli-bundle/chunks/{chunk-SXKNJPQ7.js.map → chunk-GQ4JKNMV.js.map} +1 -1
- package/dist/cli-bundle/chunks/{chunk-73ZPG2I3.js → chunk-GYMG7AG6.js} +36 -62
- package/dist/cli-bundle/chunks/chunk-GYMG7AG6.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-35P4GT6E.js → chunk-H6EH6ENJ.js} +362 -22
- package/dist/cli-bundle/chunks/chunk-H6EH6ENJ.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-F75JSIOZ.js → chunk-HDIDUME4.js} +45 -13
- package/dist/cli-bundle/chunks/chunk-HDIDUME4.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-XWMF3POR.js → chunk-HPELHUTG.js} +122 -45
- package/dist/cli-bundle/chunks/chunk-HPELHUTG.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-QKW5D45B.js → chunk-II7OGE3V.js} +20 -9
- package/dist/cli-bundle/chunks/chunk-II7OGE3V.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-4HFU4UO2.js → chunk-ILHLIA47.js} +5 -5
- package/dist/cli-bundle/chunks/{chunk-4HFU4UO2.js.map → chunk-ILHLIA47.js.map} +1 -1
- package/dist/cli-bundle/chunks/{chunk-P5BJOMBB.js → chunk-IMQG4VR3.js} +118 -74
- package/dist/cli-bundle/chunks/chunk-IMQG4VR3.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-AX4GEVQC.js → chunk-IQVB3YDD.js} +88 -22
- package/dist/cli-bundle/chunks/chunk-IQVB3YDD.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-I53JBTJW.js → chunk-KQ3LAMDO.js} +45 -13
- package/dist/cli-bundle/chunks/chunk-KQ3LAMDO.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-A6LXQFO7.js → chunk-KTVETP66.js} +334 -253
- package/dist/cli-bundle/chunks/chunk-KTVETP66.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-DY6C42S6.js → chunk-KZYVTOG5.js} +26 -11
- package/dist/cli-bundle/chunks/chunk-KZYVTOG5.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-HGLC63AU.js → chunk-L6FJPOT4.js} +11 -10
- package/dist/cli-bundle/chunks/{chunk-HGLC63AU.js.map → chunk-L6FJPOT4.js.map} +1 -1
- package/dist/cli-bundle/chunks/{chunk-FY4SPXSC.js → chunk-LV5FFQ7M.js} +354 -266
- package/dist/cli-bundle/chunks/chunk-LV5FFQ7M.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-PNYAAB4S.js → chunk-LWGMDLQ6.js} +8 -3
- package/dist/cli-bundle/chunks/chunk-LWGMDLQ6.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-XTKJSVWH.js → chunk-M23HXJL3.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-S26FESD4.js → chunk-MJZUZ2QE.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-I2IJY2NL.js → chunk-NCIBNERT.js} +4 -4
- package/dist/cli-bundle/chunks/{chunk-I2IJY2NL.js.map → chunk-NCIBNERT.js.map} +1 -1
- package/dist/cli-bundle/chunks/{chunk-TK5VZFHY.js → chunk-NIQHNDBZ.js} +76 -8
- package/dist/cli-bundle/chunks/chunk-NIQHNDBZ.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-C6SAP27O.js → chunk-O46LTCXQ.js} +4 -4
- package/dist/cli-bundle/chunks/{chunk-YW6Q3RYZ.js → chunk-OCTQJP42.js} +19 -8
- package/dist/cli-bundle/chunks/{chunk-YW6Q3RYZ.js.map → chunk-OCTQJP42.js.map} +2 -2
- package/dist/cli-bundle/chunks/{chunk-WPDMBIX6.js → chunk-OLTYNVJR.js} +5 -5
- package/dist/cli-bundle/chunks/{chunk-IUKD4W6Z.js → chunk-OY3P2I6B.js} +13 -8
- package/dist/cli-bundle/chunks/chunk-OY3P2I6B.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-SO55HRA5.js → chunk-PZD7WPUC.js} +69 -20
- package/dist/cli-bundle/chunks/chunk-PZD7WPUC.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-HHHJ2GI3.js → chunk-Q5RLUCP3.js} +74 -14
- package/dist/cli-bundle/chunks/chunk-Q5RLUCP3.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-S2ZLDYGS.js → chunk-RKKIH2ZQ.js} +116 -36
- package/dist/cli-bundle/chunks/chunk-RKKIH2ZQ.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-GWZSYR6X.js → chunk-SPYPC5CB.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-GWZSYR6X.js.map → chunk-SPYPC5CB.js.map} +1 -1
- package/dist/cli-bundle/chunks/{chunk-7AMK6DOW.js → chunk-SY4GKIWT.js} +88 -22
- package/dist/cli-bundle/chunks/chunk-SY4GKIWT.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-ZLMIWZUG.js → chunk-SY4PZWIZ.js} +7 -4
- package/dist/cli-bundle/chunks/{chunk-ZLMIWZUG.js.map → chunk-SY4PZWIZ.js.map} +2 -2
- package/dist/cli-bundle/chunks/{chunk-R2OUQVBK.js → chunk-T5VU7ROQ.js} +4 -4
- package/dist/cli-bundle/chunks/{chunk-37CYVF73.js → chunk-TIRZIQRP.js} +121 -44
- package/dist/cli-bundle/chunks/chunk-TIRZIQRP.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-7UGSRQCL.js → chunk-TUB3DZAZ.js} +107 -33
- package/dist/cli-bundle/chunks/chunk-TUB3DZAZ.js.map +7 -0
- package/dist/cli-bundle/chunks/chunk-UAR2VNCK.js +394 -0
- package/dist/cli-bundle/chunks/chunk-UAR2VNCK.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-P5U5EOMA.js → chunk-UBMCSJXX.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-ZYNJNPYD.js → chunk-UUKORJSN.js} +4 -4
- package/dist/cli-bundle/chunks/{chunk-R4VWYWRN.js → chunk-W3HFLORZ.js} +7 -2
- package/dist/cli-bundle/chunks/chunk-W3HFLORZ.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-VPEAS7PS.js → chunk-WZCQVABQ.js} +2 -2
- package/dist/cli-bundle/chunks/chunk-X3W5ESZQ.js +32 -0
- package/dist/cli-bundle/chunks/chunk-X3W5ESZQ.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-4YFAGDRH.js → chunk-XLNNCKTN.js} +322 -19
- package/dist/cli-bundle/chunks/chunk-XLNNCKTN.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-RXAP6JL5.js → chunk-XNOY7TCB.js} +118 -74
- package/dist/cli-bundle/chunks/chunk-XNOY7TCB.js.map +7 -0
- package/dist/cli-bundle/chunks/{chunk-Y3YKK7CY.js → chunk-YGRPBFMA.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-QNJSITCX.js → chunk-YXTLI4XP.js} +20 -9
- package/dist/cli-bundle/chunks/chunk-YXTLI4XP.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-FDH2X65L.js → chunk-Z3MUNQRV.js} +52 -9
- package/dist/cli-bundle/chunks/chunk-Z3MUNQRV.js.map +1 -0
- package/dist/cli-bundle/chunks/{chunk-XMBI6TNW.js → chunk-ZJRDVYZI.js} +4 -4
- package/dist/cli-bundle/chunks/{chunk-CCX4RSYZ.js → chunk-ZONXMSVB.js} +10 -9
- package/dist/cli-bundle/chunks/chunk-ZONXMSVB.js.map +1 -0
- package/dist/cli-bundle/chunks/{claim-2RDYMCTP.js → claim-4APLUXJW.js} +10 -10
- package/dist/cli-bundle/chunks/{claim-MJ7DZFC3.js → claim-NEO7AGWH.js} +10 -10
- package/dist/cli-bundle/chunks/{close-XLEKIQSW.js → close-3QABBNGU.js} +8 -8
- package/dist/cli-bundle/chunks/close-ILMZR3D7.js +13 -0
- package/dist/cli-bundle/chunks/{close-many-AOD4HSAZ.js → close-many-MIZLTYGL.js} +32 -20
- package/dist/cli-bundle/chunks/close-many-MIZLTYGL.js.map +1 -0
- package/dist/cli-bundle/chunks/{close-many-XKAQY5CQ.js → close-many-Q7Y5AHQI.js} +31 -19
- package/dist/cli-bundle/chunks/close-many-Q7Y5AHQI.js.map +7 -0
- package/dist/cli-bundle/chunks/{comments-RN5TG4ZN.js → comments-DAIQPOMU.js} +55 -31
- package/dist/cli-bundle/chunks/comments-DAIQPOMU.js.map +1 -0
- package/dist/cli-bundle/chunks/{comments-B4RWWDJT.js → comments-IWFSVM4P.js} +54 -30
- package/dist/cli-bundle/chunks/comments-IWFSVM4P.js.map +7 -0
- package/dist/cli-bundle/chunks/{config-3JXJ3XZ7.js → config-IOJELD6O.js} +45 -19
- package/dist/cli-bundle/chunks/config-IOJELD6O.js.map +1 -0
- package/dist/cli-bundle/chunks/{config-FZ4UDC4B.js → config-PXTMAYV3.js} +44 -18
- package/dist/cli-bundle/chunks/config-PXTMAYV3.js.map +7 -0
- package/dist/cli-bundle/chunks/{context-QBPO3BFM.js → context-QHJSCJW4.js} +128 -39
- package/dist/cli-bundle/chunks/context-QHJSCJW4.js.map +1 -0
- package/dist/cli-bundle/chunks/{context-L36PIN35.js → context-XZS2VFKU.js} +127 -38
- package/dist/cli-bundle/chunks/context-XZS2VFKU.js.map +7 -0
- package/dist/cli-bundle/chunks/{contracts-2G66IGIA.js → contracts-B7U4OJTV.js} +54 -10
- package/dist/cli-bundle/chunks/contracts-B7U4OJTV.js.map +1 -0
- package/dist/cli-bundle/chunks/{contracts-PJCHYSO5.js → contracts-NSBVLXQ3.js} +54 -10
- package/dist/cli-bundle/chunks/contracts-NSBVLXQ3.js.map +7 -0
- package/dist/cli-bundle/chunks/{copy-FWIVTLBO.js → copy-Q64T5FD4.js} +7 -7
- package/dist/cli-bundle/chunks/{copy-ALU5WMHA.js → copy-SG34LCMU.js} +7 -7
- package/dist/cli-bundle/chunks/create-F5HZX2S4.js +30 -0
- package/dist/cli-bundle/chunks/{create-5433DP3G.js → create-IPAX2SNL.js} +16 -13
- package/dist/cli-bundle/chunks/{delete-Y2SGJBGY.js → delete-TLXR7LJ2.js} +7 -7
- package/dist/cli-bundle/chunks/{delete-IYTIYAJS.js → delete-VH3L7DZ6.js} +7 -7
- package/dist/cli-bundle/chunks/{deps-CZ4PTVXU.js → deps-J3HBBLDB.js} +9 -10
- package/dist/cli-bundle/chunks/{deps-CZ4PTVXU.js.map → deps-J3HBBLDB.js.map} +2 -2
- package/dist/cli-bundle/chunks/{deps-6TSPOSGU.js → deps-XV6JJ6IN.js} +10 -11
- package/dist/cli-bundle/chunks/deps-XV6JJ6IN.js.map +1 -0
- package/dist/cli-bundle/chunks/{docs-MXLGZUIT.js → docs-GWDEB7JH.js} +9 -9
- package/dist/cli-bundle/chunks/{docs-I3BAF5WH.js → docs-RCLNSKID.js} +9 -9
- package/dist/cli-bundle/chunks/{extension-Q34OEWO5.js → extension-5RN65LHT.js} +7 -5
- package/dist/cli-bundle/chunks/{extension-WH2FOIOZ.js → extension-7KO2NX2A.js} +7 -5
- package/dist/cli-bundle/chunks/{files-GUXUM2MB.js → files-3TCQHUHA.js} +25 -11
- package/dist/cli-bundle/chunks/files-3TCQHUHA.js.map +1 -0
- package/dist/cli-bundle/chunks/{files-FYP3MDPX.js → files-5FDUPSEA.js} +24 -10
- package/dist/cli-bundle/chunks/files-5FDUPSEA.js.map +7 -0
- package/dist/cli-bundle/chunks/focus-7AQMNRSU.js +109 -0
- package/dist/cli-bundle/chunks/focus-7AQMNRSU.js.map +7 -0
- package/dist/cli-bundle/chunks/focus-HQXBYPKM.js +106 -0
- package/dist/cli-bundle/chunks/focus-HQXBYPKM.js.map +1 -0
- package/dist/cli-bundle/chunks/{gc-KGQG66SA.js → gc-2FGKYRJ4.js} +3 -3
- package/dist/cli-bundle/chunks/{gc-FENB2ESG.js → gc-5B6ABL3Z.js} +3 -3
- package/dist/cli-bundle/chunks/{get-PCHS7RA6.js → get-FUMVOJQD.js} +43 -16
- package/dist/cli-bundle/chunks/get-FUMVOJQD.js.map +1 -0
- package/dist/cli-bundle/chunks/{get-QARTE6BL.js → get-H5BZTW4A.js} +42 -15
- package/dist/cli-bundle/chunks/get-H5BZTW4A.js.map +7 -0
- package/dist/cli-bundle/chunks/{health-E4D7KGHD.js → health-JSVOR6B4.js} +75 -49
- package/dist/cli-bundle/chunks/health-JSVOR6B4.js.map +1 -0
- package/dist/cli-bundle/chunks/{health-7MTXAVR2.js → health-LE2ZQGSM.js} +74 -48
- package/dist/cli-bundle/chunks/health-LE2ZQGSM.js.map +7 -0
- package/dist/cli-bundle/chunks/{history-7WUAEWHW.js → history-QO4JVJJP.js} +10 -10
- package/dist/cli-bundle/chunks/history-SSXGGTVZ.js +20 -0
- package/dist/cli-bundle/chunks/{history-compact-LW27IPFK.js → history-compact-ID74DOUI.js} +37 -46
- package/dist/cli-bundle/chunks/history-compact-ID74DOUI.js.map +7 -0
- package/dist/cli-bundle/chunks/{history-compact-3EJ3L2O7.js → history-compact-SDFRPZ4V.js} +38 -47
- package/dist/cli-bundle/chunks/history-compact-SDFRPZ4V.js.map +1 -0
- package/dist/cli-bundle/chunks/history-redact-VBH44Y7F.js +21 -0
- package/dist/cli-bundle/chunks/{history-redact-G72A4EJ4.js → history-redact-Z4P5MM3G.js} +13 -11
- package/dist/cli-bundle/chunks/{history-repair-OSQOKJ3E.js → history-repair-ANHEYWKF.js} +43 -48
- package/dist/cli-bundle/chunks/history-repair-ANHEYWKF.js.map +7 -0
- package/dist/cli-bundle/chunks/{history-repair-SBK7P34V.js → history-repair-CKE7GLZR.js} +44 -49
- package/dist/cli-bundle/chunks/history-repair-CKE7GLZR.js.map +1 -0
- package/dist/cli-bundle/chunks/init-7FBQO77A.js +19 -0
- package/dist/cli-bundle/chunks/{init-S5WEGUJY.js → init-K6MSMB37.js} +11 -9
- package/dist/cli-bundle/chunks/{learnings-XK3P4ZDR.js → learnings-VIS3NOQV.js} +13 -12
- package/dist/cli-bundle/chunks/learnings-VIS3NOQV.js.map +7 -0
- package/dist/cli-bundle/chunks/{learnings-HQXSSKZ5.js → learnings-YYNB64GN.js} +14 -13
- package/dist/cli-bundle/chunks/learnings-YYNB64GN.js.map +1 -0
- package/dist/cli-bundle/chunks/list-7UE44A2R.js +29 -0
- package/dist/cli-bundle/chunks/list-UHMA3N2K.js +33 -0
- package/dist/cli-bundle/chunks/{notes-5T6P7C5V.js → notes-2HRMV67I.js} +14 -13
- package/dist/cli-bundle/chunks/notes-2HRMV67I.js.map +1 -0
- package/dist/cli-bundle/chunks/{notes-U5FZCSBT.js → notes-IN3UMA7W.js} +13 -12
- package/dist/cli-bundle/chunks/notes-IN3UMA7W.js.map +7 -0
- package/dist/cli-bundle/chunks/{plan-2YTQYWGM.js → plan-I3SVH7FV.js} +16 -15
- package/dist/cli-bundle/chunks/plan-I3SVH7FV.js.map +1 -0
- package/dist/cli-bundle/chunks/{plan-7IVSICR6.js → plan-PAWCCAPW.js} +15 -14
- package/dist/cli-bundle/chunks/plan-PAWCCAPW.js.map +7 -0
- package/dist/cli-bundle/chunks/{register-list-query-4UPMHONX.js → register-list-query-N7Z7RTDM.js} +31 -22
- package/dist/cli-bundle/chunks/register-list-query-N7Z7RTDM.js.map +7 -0
- package/dist/cli-bundle/chunks/{register-list-query-7VOW2C3W.js → register-list-query-OTIK4DVA.js} +32 -23
- package/dist/cli-bundle/chunks/register-list-query-OTIK4DVA.js.map +1 -0
- package/dist/cli-bundle/chunks/{register-mutation-FARSGYRD.js → register-mutation-UFZK6Q57.js} +216 -66
- package/dist/cli-bundle/chunks/register-mutation-UFZK6Q57.js.map +7 -0
- package/dist/cli-bundle/chunks/{register-mutation-LJDNVREU.js → register-mutation-XFORLS6D.js} +210 -67
- package/dist/cli-bundle/chunks/register-mutation-XFORLS6D.js.map +1 -0
- package/dist/cli-bundle/chunks/{register-operations-HCJKDUA6.js → register-operations-6ZCLKRBG.js} +53 -39
- package/dist/cli-bundle/chunks/register-operations-6ZCLKRBG.js.map +7 -0
- package/dist/cli-bundle/chunks/{register-operations-FFTYAL42.js → register-operations-ITE7JTH3.js} +54 -40
- package/dist/cli-bundle/chunks/register-operations-ITE7JTH3.js.map +1 -0
- package/dist/cli-bundle/chunks/{register-setup-6AVIUOCC.js → register-setup-7RKGE4BQ.js} +18 -21
- package/dist/cli-bundle/chunks/register-setup-7RKGE4BQ.js.map +1 -0
- package/dist/cli-bundle/chunks/{register-setup-KVNLO5OJ.js → register-setup-7UKEFKT6.js} +17 -20
- package/dist/cli-bundle/chunks/register-setup-7UKEFKT6.js.map +7 -0
- package/dist/cli-bundle/chunks/{restore-M6AFHMV4.js → restore-NNVPBBVJ.js} +13 -11
- package/dist/cli-bundle/chunks/restore-XXXLQ2XC.js +19 -0
- package/dist/cli-bundle/chunks/{schema-AINZ2IMM.js → schema-3HCLXCFX.js} +27 -9
- package/dist/cli-bundle/chunks/schema-3HCLXCFX.js.map +7 -0
- package/dist/cli-bundle/chunks/{schema-76HDZJCC.js → schema-3YKCQ3VO.js} +28 -10
- package/dist/cli-bundle/chunks/schema-3YKCQ3VO.js.map +1 -0
- package/dist/cli-bundle/chunks/{search-JMLFQEPJ.js → search-NQ42NC6A.js} +328 -71
- package/dist/cli-bundle/chunks/search-NQ42NC6A.js.map +7 -0
- package/dist/cli-bundle/chunks/{search-NL3TSCYB.js → search-V7PZ2ICH.js} +328 -71
- package/dist/cli-bundle/chunks/search-V7PZ2ICH.js.map +1 -0
- package/dist/cli-bundle/chunks/{stats-BKXCBIGT.js → stats-7KD4PJC5.js} +41 -16
- package/dist/cli-bundle/chunks/stats-7KD4PJC5.js.map +7 -0
- package/dist/cli-bundle/chunks/{stats-UBD56TGK.js → stats-GRHO6RFB.js} +42 -17
- package/dist/cli-bundle/chunks/stats-GRHO6RFB.js.map +1 -0
- package/dist/cli-bundle/chunks/{telemetry-ZJXK3H7X.js → telemetry-H5GLXNG5.js} +6 -6
- package/dist/cli-bundle/chunks/telemetry-H5GLXNG5.js.map +7 -0
- package/dist/cli-bundle/chunks/{telemetry-N454RHG5.js → telemetry-TRRYZXWT.js} +7 -7
- package/dist/cli-bundle/chunks/telemetry-TRRYZXWT.js.map +1 -0
- package/dist/cli-bundle/chunks/test-6CZNIIGA.js +34 -0
- package/dist/cli-bundle/chunks/{test-BQAKIXAT.js → test-7GVQ3VMN.js} +16 -14
- package/dist/cli-bundle/chunks/{test-all-7LV3I6S5.js → test-all-3LF2OZD2.js} +23 -16
- package/dist/cli-bundle/chunks/test-all-3LF2OZD2.js.map +7 -0
- package/dist/cli-bundle/chunks/{test-all-TDYCCBA4.js → test-all-ODVADHV6.js} +24 -17
- package/dist/cli-bundle/chunks/test-all-ODVADHV6.js.map +1 -0
- package/dist/cli-bundle/chunks/{test-runs-E64M6XS3.js → test-runs-LYT6ZTNQ.js} +62 -65
- package/dist/cli-bundle/chunks/test-runs-LYT6ZTNQ.js.map +1 -0
- package/dist/cli-bundle/chunks/{test-runs-LXZLULCI.js → test-runs-RVP6VWN7.js} +61 -64
- package/dist/cli-bundle/chunks/test-runs-RVP6VWN7.js.map +7 -0
- package/dist/cli-bundle/chunks/update-MPGM6SBE.js +28 -0
- package/dist/cli-bundle/chunks/update-UN75XW3C.js +24 -0
- package/dist/cli-bundle/chunks/{update-many-F4IKDWZB.js → update-many-FCU6RKTO.js} +80 -34
- package/dist/cli-bundle/chunks/update-many-FCU6RKTO.js.map +1 -0
- package/dist/cli-bundle/chunks/{update-many-NTWZ5YT3.js → update-many-XSEQJ24X.js} +79 -33
- package/dist/cli-bundle/chunks/update-many-XSEQJ24X.js.map +7 -0
- package/dist/cli-bundle/chunks/{upgrade-37F7JKES.js → upgrade-A6TL3INC.js} +22 -8
- package/dist/cli-bundle/chunks/upgrade-A6TL3INC.js.map +7 -0
- package/dist/cli-bundle/chunks/{upgrade-L32JA4TZ.js → upgrade-FOB5LHO5.js} +23 -9
- package/dist/cli-bundle/chunks/upgrade-FOB5LHO5.js.map +1 -0
- package/dist/cli-bundle/chunks/{validate-46KCRHL7.js → validate-7BLDG3AT.js} +222 -31
- package/dist/cli-bundle/chunks/validate-7BLDG3AT.js.map +1 -0
- package/dist/cli-bundle/chunks/{validate-CRFMPTYD.js → validate-EHL3MI2V.js} +236 -31
- package/dist/cli-bundle/chunks/validate-EHL3MI2V.js.map +7 -0
- package/dist/cli-bundle/main.js +305 -140
- package/dist/cli-bundle/main.js.map +3 -3
- package/dist/cli.d.ts +10 -0
- package/dist/cli.js +21 -8
- package/dist/cli.js.map +1 -1
- package/dist/core/diagnostics/remediation.js +7 -2
- package/dist/core/diagnostics/remediation.js.map +1 -1
- package/dist/core/extensions/extension-capability-aliases.js +7 -33
- package/dist/core/extensions/extension-capability-aliases.js.map +1 -1
- package/dist/core/extensions/extension-policy.js +14 -15
- package/dist/core/extensions/extension-policy.js.map +1 -1
- package/dist/core/extensions/item-fields.js +4 -5
- package/dist/core/extensions/item-fields.js.map +1 -1
- package/dist/core/extensions/loader.d.ts +75 -1
- package/dist/core/extensions/loader.js +56 -32
- package/dist/core/extensions/loader.js.map +1 -1
- package/dist/core/governance/content-fields.d.ts +84 -0
- package/dist/core/governance/content-fields.js +182 -0
- package/dist/core/governance/content-fields.js.map +1 -0
- package/dist/core/governance/issue-codes.d.ts +51 -0
- package/dist/core/governance/issue-codes.js +95 -0
- package/dist/core/governance/issue-codes.js.map +1 -0
- package/dist/core/governance/metadata-coverage.d.ts +168 -0
- package/dist/core/governance/metadata-coverage.js +362 -0
- package/dist/core/governance/metadata-coverage.js.map +1 -0
- package/dist/core/history/history-rewrite.d.ts +22 -0
- package/dist/core/history/history-rewrite.js +38 -2
- package/dist/core/history/history-rewrite.js.map +1 -1
- package/dist/core/history/history.d.ts +7 -0
- package/dist/core/history/history.js +6 -2
- package/dist/core/history/history.js.map +1 -1
- package/dist/core/io/body-file.d.ts +14 -0
- package/dist/core/io/body-file.js +47 -0
- package/dist/core/io/body-file.js.map +1 -0
- package/dist/core/item/item-format.d.ts +46 -1
- package/dist/core/item/item-format.js +51 -60
- package/dist/core/item/item-format.js.map +1 -1
- package/dist/core/item/parse.d.ts +9 -0
- package/dist/core/item/parse.js +10 -16
- package/dist/core/item/parse.js.map +1 -1
- package/dist/core/item/type-registry.d.ts +1 -0
- package/dist/core/item/type-registry.js +8 -10
- package/dist/core/item/type-registry.js.map +1 -1
- package/dist/core/lock/lock.d.ts +26 -0
- package/dist/core/lock/lock.js +10 -2
- package/dist/core/lock/lock.js.map +1 -1
- package/dist/core/output/output.d.ts +7 -0
- package/dist/core/output/output.js +6 -2
- package/dist/core/output/output.js.map +1 -1
- package/dist/core/schema/item-types-file.d.ts +25 -2
- package/dist/core/schema/item-types-file.js +78 -6
- package/dist/core/schema/item-types-file.js.map +1 -1
- package/dist/core/schema/runtime-schema.d.ts +7 -0
- package/dist/core/schema/runtime-schema.js +23 -16
- package/dist/core/schema/runtime-schema.js.map +1 -1
- package/dist/core/search/background-refresh.js +3 -3
- package/dist/core/search/background-refresh.js.map +1 -1
- package/dist/core/search/cache.d.ts +19 -1
- package/dist/core/search/cache.js +11 -3
- package/dist/core/search/cache.js.map +1 -1
- package/dist/core/search/corpus.d.ts +36 -2
- package/dist/core/search/corpus.js +120 -24
- package/dist/core/search/corpus.js.map +1 -1
- package/dist/core/search/providers.d.ts +19 -0
- package/dist/core/search/providers.js +19 -2
- package/dist/core/search/providers.js.map +1 -1
- package/dist/core/sentry/instrument.d.ts +1 -0
- package/dist/core/sentry/instrument.js +6 -2
- package/dist/core/sentry/instrument.js.map +1 -1
- package/dist/core/session/session-state.d.ts +16 -0
- package/dist/core/session/session-state.js +48 -0
- package/dist/core/session/session-state.js.map +1 -0
- package/dist/core/shared/constants.d.ts +8 -0
- package/dist/core/shared/constants.js +11 -2
- package/dist/core/shared/constants.js.map +1 -1
- package/dist/core/shared/errors.d.ts +3 -0
- package/dist/core/shared/errors.js +2 -2
- package/dist/core/shared/errors.js.map +1 -1
- package/dist/core/shared/text-normalization.js +4 -3
- package/dist/core/shared/text-normalization.js.map +1 -1
- package/dist/core/shared/time.d.ts +13 -0
- package/dist/core/shared/time.js +19 -7
- package/dist/core/shared/time.js.map +1 -1
- package/dist/core/store/item-store.d.ts +11 -0
- package/dist/core/store/item-store.js +16 -23
- package/dist/core/store/item-store.js.map +1 -1
- package/dist/core/store/settings-validator.d.ts +2 -0
- package/dist/core/store/settings-validator.js +25 -2
- package/dist/core/store/settings-validator.js.map +1 -1
- package/dist/core/store/settings.d.ts +60 -1
- package/dist/core/store/settings.js +100 -46
- package/dist/core/store/settings.js.map +1 -1
- package/dist/core/telemetry/observability.js +10 -8
- package/dist/core/telemetry/observability.js.map +1 -1
- package/dist/core/telemetry/runtime.d.ts +272 -1
- package/dist/core/telemetry/runtime.js +358 -37
- package/dist/core/telemetry/runtime.js.map +1 -1
- package/dist/core/test/background-runs.d.ts +35 -0
- package/dist/core/test/background-runs.js +72 -61
- package/dist/core/test/background-runs.js.map +1 -1
- package/dist/core/test/run-selectors.js +5 -4
- package/dist/core/test/run-selectors.js.map +1 -1
- package/dist/core/validate/estimate-defaults.d.ts +39 -0
- package/dist/core/validate/estimate-defaults.js +117 -0
- package/dist/core/validate/estimate-defaults.js.map +1 -0
- package/dist/core/validate/fix-planning.d.ts +21 -3
- package/dist/core/validate/fix-planning.js +31 -4
- package/dist/core/validate/fix-planning.js.map +1 -1
- package/dist/core/validate/missing-link-owners.d.ts +64 -0
- package/dist/core/validate/missing-link-owners.js +98 -0
- package/dist/core/validate/missing-link-owners.js.map +1 -0
- package/dist/mcp/server.d.ts +62 -0
- package/dist/mcp/server.js +71 -8
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/tool-definitions.js +17 -4
- package/dist/mcp/tool-definitions.js.map +1 -1
- 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 +4 -2
- package/dist/sdk/cli-contracts/enum-contracts.js.map +1 -1
- package/dist/sdk/cli-contracts/tool-option-contracts.js +110 -2
- package/dist/sdk/cli-contracts/tool-option-contracts.js.map +1 -1
- package/dist/sdk/cli-contracts/tool-parameter-tables.js +83 -8
- package/dist/sdk/cli-contracts/tool-parameter-tables.js.map +1 -1
- package/dist/sdk/cli-contracts.d.ts +28 -0
- package/dist/sdk/cli-contracts.js +164 -11
- package/dist/sdk/cli-contracts.js.map +1 -1
- package/dist/types.d.ts +17 -1
- package/dist/types.js +3 -3
- package/dist/types.js.map +1 -1
- package/docs/AGENT_GUIDE.md +15 -3
- package/docs/CLAUDE_CODE_PLUGIN.md +2 -2
- package/docs/COMMANDS.md +136 -7
- package/docs/CONFIGURATION.md +52 -0
- package/docs/TESTING.md +6 -4
- package/package.json +6 -4
- package/packages/pm-calendar/extensions/calendar/runtime.js +6 -0
- package/packages/pm-calendar/extensions/calendar/runtime.ts +12 -0
- package/packages/pm-todos/extensions/todos/runtime.ts +5 -0
- package/plugins/pm-claude/.claude-plugin/plugin.json +1 -1
- package/plugins/pm-claude/README.md +6 -14
- package/plugins/pm-claude/commands/pm-init.md +1 -1
- package/plugins/pm-codex/README.md +1 -1
- package/scripts/bundle-cli.mjs +46 -37
- package/scripts/finalize-build.mjs +20 -9
- package/scripts/prepare-build-cache.mjs +27 -16
- package/dist/cli-bundle/chunks/activity-XZIUPGZH.js +0 -16
- package/dist/cli-bundle/chunks/aggregate-6OTS3AOO.js.map +0 -1
- package/dist/cli-bundle/chunks/aggregate-OD36DJU5.js.map +0 -7
- package/dist/cli-bundle/chunks/append-KG55G7S3.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-35P4GT6E.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-37CYVF73.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-3KLPFWZ4.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-4JCSYR6F.js +0 -138
- package/dist/cli-bundle/chunks/chunk-4JCSYR6F.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-4YFAGDRH.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-5SCT2JCT.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-73ZPG2I3.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-7AMK6DOW.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-7IYFN5R7.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-7UGSRQCL.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-A6LXQFO7.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-AVGHVVF7.js +0 -128
- package/dist/cli-bundle/chunks/chunk-AVGHVVF7.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-AX4GEVQC.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-CCX4RSYZ.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-CW6E4NAT.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-DY6C42S6.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-EWFY7SLA.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-F75JSIOZ.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-FDH2X65L.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-FY4SPXSC.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-GKIZW7SM.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-HHHJ2GI3.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-HI7STVF2.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-I53JBTJW.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-I7NYDZDV.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-IUKD4W6Z.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-KWAXVAXX.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-L5EPZQIC.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-OASDW5UI.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-OLKBSY4N.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-P5BJOMBB.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-PNYAAB4S.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-QKW5D45B.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-QNJSITCX.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-R4VWYWRN.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-RXAP6JL5.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-S2ZLDYGS.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-SO55HRA5.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-TK5VZFHY.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-TNAP7EJX.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-UIG4TW2H.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-UUWGCWBU.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-VFUZV5EB.js.map +0 -7
- package/dist/cli-bundle/chunks/chunk-WUNFKP7M.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-XJDGS74Y.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-XWMF3POR.js.map +0 -1
- package/dist/cli-bundle/chunks/chunk-ZMW77VWV.js.map +0 -1
- package/dist/cli-bundle/chunks/close-4FMAPEMY.js +0 -13
- package/dist/cli-bundle/chunks/close-many-AOD4HSAZ.js.map +0 -1
- package/dist/cli-bundle/chunks/close-many-XKAQY5CQ.js.map +0 -7
- package/dist/cli-bundle/chunks/comments-B4RWWDJT.js.map +0 -7
- package/dist/cli-bundle/chunks/comments-RN5TG4ZN.js.map +0 -1
- package/dist/cli-bundle/chunks/config-3JXJ3XZ7.js.map +0 -1
- package/dist/cli-bundle/chunks/config-FZ4UDC4B.js.map +0 -7
- package/dist/cli-bundle/chunks/context-L36PIN35.js.map +0 -7
- package/dist/cli-bundle/chunks/context-QBPO3BFM.js.map +0 -1
- package/dist/cli-bundle/chunks/contracts-2G66IGIA.js.map +0 -1
- package/dist/cli-bundle/chunks/contracts-PJCHYSO5.js.map +0 -7
- package/dist/cli-bundle/chunks/create-VWLWS34Z.js +0 -27
- package/dist/cli-bundle/chunks/deps-6TSPOSGU.js.map +0 -1
- package/dist/cli-bundle/chunks/files-FYP3MDPX.js.map +0 -7
- package/dist/cli-bundle/chunks/files-GUXUM2MB.js.map +0 -1
- package/dist/cli-bundle/chunks/get-PCHS7RA6.js.map +0 -1
- package/dist/cli-bundle/chunks/get-QARTE6BL.js.map +0 -7
- package/dist/cli-bundle/chunks/health-7MTXAVR2.js.map +0 -7
- package/dist/cli-bundle/chunks/health-E4D7KGHD.js.map +0 -1
- package/dist/cli-bundle/chunks/history-L2FQFRTU.js +0 -20
- package/dist/cli-bundle/chunks/history-compact-3EJ3L2O7.js.map +0 -1
- package/dist/cli-bundle/chunks/history-compact-LW27IPFK.js.map +0 -7
- package/dist/cli-bundle/chunks/history-redact-QWQCX5DZ.js +0 -19
- package/dist/cli-bundle/chunks/history-repair-OSQOKJ3E.js.map +0 -7
- package/dist/cli-bundle/chunks/history-repair-SBK7P34V.js.map +0 -1
- package/dist/cli-bundle/chunks/init-4BKRHGWW.js +0 -17
- package/dist/cli-bundle/chunks/learnings-HQXSSKZ5.js.map +0 -1
- package/dist/cli-bundle/chunks/learnings-XK3P4ZDR.js.map +0 -7
- package/dist/cli-bundle/chunks/list-6CL3XFT6.js +0 -23
- package/dist/cli-bundle/chunks/list-BYNN4ZEO.js +0 -19
- package/dist/cli-bundle/chunks/notes-5T6P7C5V.js.map +0 -1
- package/dist/cli-bundle/chunks/notes-U5FZCSBT.js.map +0 -7
- package/dist/cli-bundle/chunks/plan-2YTQYWGM.js.map +0 -1
- package/dist/cli-bundle/chunks/plan-7IVSICR6.js.map +0 -7
- package/dist/cli-bundle/chunks/register-list-query-4UPMHONX.js.map +0 -7
- package/dist/cli-bundle/chunks/register-list-query-7VOW2C3W.js.map +0 -1
- package/dist/cli-bundle/chunks/register-mutation-FARSGYRD.js.map +0 -7
- package/dist/cli-bundle/chunks/register-mutation-LJDNVREU.js.map +0 -1
- package/dist/cli-bundle/chunks/register-operations-FFTYAL42.js.map +0 -1
- package/dist/cli-bundle/chunks/register-operations-HCJKDUA6.js.map +0 -7
- package/dist/cli-bundle/chunks/register-setup-6AVIUOCC.js.map +0 -1
- package/dist/cli-bundle/chunks/register-setup-KVNLO5OJ.js.map +0 -7
- package/dist/cli-bundle/chunks/restore-CHIOQAQL.js +0 -17
- package/dist/cli-bundle/chunks/schema-76HDZJCC.js.map +0 -1
- package/dist/cli-bundle/chunks/schema-AINZ2IMM.js.map +0 -7
- package/dist/cli-bundle/chunks/search-JMLFQEPJ.js.map +0 -7
- package/dist/cli-bundle/chunks/search-NL3TSCYB.js.map +0 -1
- package/dist/cli-bundle/chunks/stats-BKXCBIGT.js.map +0 -7
- package/dist/cli-bundle/chunks/stats-UBD56TGK.js.map +0 -1
- package/dist/cli-bundle/chunks/telemetry-N454RHG5.js.map +0 -1
- package/dist/cli-bundle/chunks/telemetry-ZJXK3H7X.js.map +0 -7
- package/dist/cli-bundle/chunks/test-O74JFUH5.js +0 -32
- package/dist/cli-bundle/chunks/test-all-7LV3I6S5.js.map +0 -7
- package/dist/cli-bundle/chunks/test-all-TDYCCBA4.js.map +0 -1
- package/dist/cli-bundle/chunks/test-runs-E64M6XS3.js.map +0 -1
- package/dist/cli-bundle/chunks/test-runs-LXZLULCI.js.map +0 -7
- package/dist/cli-bundle/chunks/update-36JM7YZT.js +0 -21
- package/dist/cli-bundle/chunks/update-I246PCLO.js +0 -25
- package/dist/cli-bundle/chunks/update-many-F4IKDWZB.js.map +0 -1
- package/dist/cli-bundle/chunks/update-many-NTWZ5YT3.js.map +0 -7
- package/dist/cli-bundle/chunks/upgrade-37F7JKES.js.map +0 -7
- package/dist/cli-bundle/chunks/upgrade-L32JA4TZ.js.map +0 -1
- package/dist/cli-bundle/chunks/validate-46KCRHL7.js.map +0 -1
- package/dist/cli-bundle/chunks/validate-CRFMPTYD.js.map +0 -7
- /package/dist/cli-bundle/chunks/{activity-XZIUPGZH.js.map → activity-5P2KQCTH.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{activity-XADJOG6G.js.map → activity-MJGTX4LO.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-ATEES5SX.js.map → chunk-2JEGCDYT.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-XUC4C4PT.js.map → chunk-3WAULYOY.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-QJMGRZO2.js.map → chunk-7AGIXLNK.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-KBPQHXWG.js.map → chunk-AERT7KT3.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-ESANVZF4.js.map → chunk-E6J2PEK6.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-VSRZRLG3.js.map → chunk-F2GC6L3N.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-XTKJSVWH.js.map → chunk-M23HXJL3.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-S26FESD4.js.map → chunk-MJZUZ2QE.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-C6SAP27O.js.map → chunk-O46LTCXQ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-WPDMBIX6.js.map → chunk-OLTYNVJR.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-R2OUQVBK.js.map → chunk-T5VU7ROQ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-P5U5EOMA.js.map → chunk-UBMCSJXX.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-ZYNJNPYD.js.map → chunk-UUKORJSN.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-VPEAS7PS.js.map → chunk-WZCQVABQ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-Y3YKK7CY.js.map → chunk-YGRPBFMA.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{chunk-XMBI6TNW.js.map → chunk-ZJRDVYZI.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{claim-2RDYMCTP.js.map → claim-4APLUXJW.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{claim-MJ7DZFC3.js.map → claim-NEO7AGWH.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{close-XLEKIQSW.js.map → close-3QABBNGU.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{close-4FMAPEMY.js.map → close-ILMZR3D7.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{copy-FWIVTLBO.js.map → copy-Q64T5FD4.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{copy-ALU5WMHA.js.map → copy-SG34LCMU.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{create-VWLWS34Z.js.map → create-F5HZX2S4.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{create-5433DP3G.js.map → create-IPAX2SNL.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{delete-Y2SGJBGY.js.map → delete-TLXR7LJ2.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{delete-IYTIYAJS.js.map → delete-VH3L7DZ6.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{docs-MXLGZUIT.js.map → docs-GWDEB7JH.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{docs-I3BAF5WH.js.map → docs-RCLNSKID.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{extension-Q34OEWO5.js.map → extension-5RN65LHT.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{extension-WH2FOIOZ.js.map → extension-7KO2NX2A.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{gc-KGQG66SA.js.map → gc-2FGKYRJ4.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{gc-FENB2ESG.js.map → gc-5B6ABL3Z.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{history-7WUAEWHW.js.map → history-QO4JVJJP.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{history-L2FQFRTU.js.map → history-SSXGGTVZ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{history-redact-QWQCX5DZ.js.map → history-redact-VBH44Y7F.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{history-redact-G72A4EJ4.js.map → history-redact-Z4P5MM3G.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{init-4BKRHGWW.js.map → init-7FBQO77A.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{init-S5WEGUJY.js.map → init-K6MSMB37.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{list-BYNN4ZEO.js.map → list-7UE44A2R.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{list-6CL3XFT6.js.map → list-UHMA3N2K.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{restore-M6AFHMV4.js.map → restore-NNVPBBVJ.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{restore-CHIOQAQL.js.map → restore-XXXLQ2XC.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{test-O74JFUH5.js.map → test-6CZNIIGA.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{test-BQAKIXAT.js.map → test-7GVQ3VMN.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{update-I246PCLO.js.map → update-MPGM6SBE.js.map} +0 -0
- /package/dist/cli-bundle/chunks/{update-36JM7YZT.js.map → update-UN75XW3C.js.map} +0 -0
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
|
|
2
|
-
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="
|
|
2
|
+
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="159f3fa3-02f9-5744-91bd-7d6b0f550537")}catch(e){}}();
|
|
3
3
|
import fs from "node:fs/promises";
|
|
4
4
|
import path from "node:path";
|
|
5
5
|
import { coerceNumberInRange, toNonEmptyStringOrUndefined } from "../../core/shared/primitives.js";
|
|
@@ -22,6 +22,9 @@ import { toItemRecord } from "../../core/item/item-record.js";
|
|
|
22
22
|
import { isTerminalStatus } from "../../core/item/status.js";
|
|
23
23
|
import { parseStatusFilterCsv } from "../../core/item/status-filter.js";
|
|
24
24
|
import { collectRuntimeFilterValues, matchesRuntimeFilters } from "../../core/schema/runtime-field-filters.js";
|
|
25
|
+
import { hasMissingMetadataFilter, itemMatchesMissingMetadata, lifecycleClassifierFromStatusRegistry, } from "../../core/governance/metadata-coverage.js";
|
|
26
|
+
import { hasContentFieldFilter, itemMatchesContentFilters, } from "../../core/governance/content-fields.js";
|
|
27
|
+
import { buildContentFilterEcho, buildGovernanceMissingFilterEcho, resolveContentFieldFilters, resolveMissingMetadataFilters, } from "./list.js";
|
|
25
28
|
import { resolveRuntimeFieldRegistry, resolveRuntimeStatusRegistry, } from "../../core/schema/runtime-schema.js";
|
|
26
29
|
import { EXIT_CODE } from "../../core/shared/constants.js";
|
|
27
30
|
import { PmCliError } from "../../core/shared/errors.js";
|
|
@@ -101,13 +104,18 @@ const SEARCH_ITEM_FIELD_KEYS = new Set([
|
|
|
101
104
|
const LONG_QUERY_TOKEN_THRESHOLD = 2;
|
|
102
105
|
const LONG_QUERY_TITLE_EXACT_BONUS = 120;
|
|
103
106
|
const LONG_QUERY_PHRASE_MULTIPLIER = 6;
|
|
107
|
+
// GH-181: in default (OR) match mode, multi-token queries that match EVERY
|
|
108
|
+
// distinct query token in some searchable field get an additive ranking bonus so
|
|
109
|
+
// items covering all terms outrank items matching only a subset. This is a
|
|
110
|
+
// RANKING preference, not a hard filter (use --match-mode and for that).
|
|
111
|
+
const ALL_TERMS_COVERAGE_BONUS = 40;
|
|
104
112
|
const IMPLICIT_HYBRID_EMBEDDING_TIMEOUT_MS = 8_000;
|
|
105
113
|
const IMPLICIT_HYBRID_VECTOR_TIMEOUT_MS = 8_000;
|
|
106
114
|
function isNonEmptyRecord(value) {
|
|
107
115
|
return typeof value === "object" && value !== null && !Array.isArray(value) && Object.keys(value).length > 0;
|
|
108
116
|
}
|
|
109
117
|
function buildCompactSearchFilterSummary(params) {
|
|
110
|
-
const { mode, options, includeLinked, titleExact, phraseExact, scoreThreshold, hybridSemanticWeight, runtimeFieldFilters, } = params;
|
|
118
|
+
const { mode, matchMode, options, includeLinked, titleExact, phraseExact, scoreThreshold, hybridSemanticWeight, runtimeFieldFilters, } = params;
|
|
111
119
|
const filters = {};
|
|
112
120
|
if (options.status !== undefined) {
|
|
113
121
|
filters.status = options.status;
|
|
@@ -127,6 +135,35 @@ function buildCompactSearchFilterSummary(params) {
|
|
|
127
135
|
if (options.deadlineAfter !== undefined) {
|
|
128
136
|
filters.deadline_after = options.deadlineAfter;
|
|
129
137
|
}
|
|
138
|
+
if (options.updatedAfter !== undefined) {
|
|
139
|
+
filters.updated_after = options.updatedAfter;
|
|
140
|
+
}
|
|
141
|
+
if (options.updatedBefore !== undefined) {
|
|
142
|
+
filters.updated_before = options.updatedBefore;
|
|
143
|
+
}
|
|
144
|
+
if (options.createdAfter !== undefined) {
|
|
145
|
+
filters.created_after = options.createdAfter;
|
|
146
|
+
}
|
|
147
|
+
if (options.createdBefore !== undefined) {
|
|
148
|
+
filters.created_before = options.createdBefore;
|
|
149
|
+
}
|
|
150
|
+
if (options.assignee !== undefined) {
|
|
151
|
+
filters.assignee = options.assignee;
|
|
152
|
+
}
|
|
153
|
+
if (options.sprint !== undefined) {
|
|
154
|
+
filters.sprint = options.sprint;
|
|
155
|
+
}
|
|
156
|
+
if (options.release !== undefined) {
|
|
157
|
+
filters.release = options.release;
|
|
158
|
+
}
|
|
159
|
+
if (options.parent !== undefined) {
|
|
160
|
+
filters.parent = options.parent;
|
|
161
|
+
}
|
|
162
|
+
Object.assign(filters, buildGovernanceMissingFilterEcho(options));
|
|
163
|
+
Object.assign(filters, buildContentFilterEcho(options));
|
|
164
|
+
if (matchMode !== "or") {
|
|
165
|
+
filters.match_mode = matchMode;
|
|
166
|
+
}
|
|
130
167
|
if (includeLinked) {
|
|
131
168
|
filters.include_linked = true;
|
|
132
169
|
}
|
|
@@ -150,6 +187,43 @@ function buildCompactSearchFilterSummary(params) {
|
|
|
150
187
|
}
|
|
151
188
|
return filters;
|
|
152
189
|
}
|
|
190
|
+
// Shared verbose (non-compact) filters echo. Keeps the count-only, empty-result,
|
|
191
|
+
// and primary return paths emitting an identical filter shape (GH-181/pm-13nx).
|
|
192
|
+
function buildVerboseSearchFilters(params) {
|
|
193
|
+
const { effectiveMode, matchMode, options, includeLinked, titleExact, phraseExact, scoreThreshold, hybridSemanticWeight, queryExpansion, rerank, runtimeFieldFilters, } = params;
|
|
194
|
+
return {
|
|
195
|
+
mode: effectiveMode,
|
|
196
|
+
match_mode: matchMode,
|
|
197
|
+
status: options.status ?? null,
|
|
198
|
+
type: options.type ?? null,
|
|
199
|
+
tag: options.tag ?? null,
|
|
200
|
+
priority: options.priority ?? null,
|
|
201
|
+
deadline_before: options.deadlineBefore ?? null,
|
|
202
|
+
deadline_after: options.deadlineAfter ?? null,
|
|
203
|
+
updated_after: options.updatedAfter ?? null,
|
|
204
|
+
updated_before: options.updatedBefore ?? null,
|
|
205
|
+
created_after: options.createdAfter ?? null,
|
|
206
|
+
created_before: options.createdBefore ?? null,
|
|
207
|
+
assignee: options.assignee ?? null,
|
|
208
|
+
sprint: options.sprint ?? null,
|
|
209
|
+
release: options.release ?? null,
|
|
210
|
+
parent: options.parent ?? null,
|
|
211
|
+
...buildGovernanceMissingFilterEcho(options),
|
|
212
|
+
...buildContentFilterEcho(options),
|
|
213
|
+
include_linked: includeLinked,
|
|
214
|
+
title_exact: titleExact,
|
|
215
|
+
phrase_exact: phraseExact,
|
|
216
|
+
score_threshold: scoreThreshold,
|
|
217
|
+
hybrid_semantic_weight: effectiveMode === "hybrid" ? hybridSemanticWeight : null,
|
|
218
|
+
query_expansion_enabled: queryExpansion.enabled,
|
|
219
|
+
query_expansion_provider: queryExpansion.provider,
|
|
220
|
+
rerank_enabled: rerank.enabled,
|
|
221
|
+
rerank_model: rerank.model,
|
|
222
|
+
rerank_top_k: rerank.top_k,
|
|
223
|
+
limit: options.limit ?? null,
|
|
224
|
+
runtime_filters: runtimeFieldFilters,
|
|
225
|
+
};
|
|
226
|
+
}
|
|
153
227
|
/**
|
|
154
228
|
* Aggregate the `code` strings found along an error's `cause` chain.
|
|
155
229
|
*
|
|
@@ -232,7 +306,9 @@ async function maybeEmitVectorIndexStaleWarning(pmRoot, filteredDocuments, warni
|
|
|
232
306
|
return;
|
|
233
307
|
}
|
|
234
308
|
warnings.push(`vector_index_stale:${staleIds.length}`);
|
|
309
|
+
/* c8 ignore start -- singular/plural warning text branches are cosmetic and validated in integration UX tests */
|
|
235
310
|
process.stderr.write(`[pm] warning: ${staleIds.length} item${staleIds.length === 1 ? " is" : "s are"} new or modified since the last reindex and ${staleIds.length === 1 ? "is" : "are"} NOT in the semantic index yet — they will be missing from semantic/hybrid results until you run 'pm reindex --mode hybrid'. (Write-time embedding is governed by search.mutation_refresh_policy; staleness means the embed was skipped, failed, or the backend was unreachable.)\n`);
|
|
311
|
+
/* c8 ignore stop */
|
|
236
312
|
}
|
|
237
313
|
catch {
|
|
238
314
|
// Best-effort: missing/unreadable ledger is not a query-blocking concern.
|
|
@@ -260,6 +336,42 @@ function parsePhraseExact(raw) {
|
|
|
260
336
|
function parseSemanticWeightOverride(raw) {
|
|
261
337
|
return coerceNumberInRange(raw, 0, 1) ?? undefined;
|
|
262
338
|
}
|
|
339
|
+
function parseMatchMode(raw) {
|
|
340
|
+
if (raw === undefined) {
|
|
341
|
+
return "or";
|
|
342
|
+
}
|
|
343
|
+
const normalized = raw.trim().toLowerCase();
|
|
344
|
+
if (normalized !== "and" && normalized !== "or" && normalized !== "exact") {
|
|
345
|
+
throw new PmCliError("Search --match-mode must be one of and|or|exact", EXIT_CODE.USAGE);
|
|
346
|
+
}
|
|
347
|
+
return normalized;
|
|
348
|
+
}
|
|
349
|
+
// Per-query --min-score overrides the persistent search.score_threshold for this
|
|
350
|
+
// query only. Accepts a finite number >= 0; anything else is a usage error.
|
|
351
|
+
function parseMinScoreOverride(raw) {
|
|
352
|
+
if (raw === undefined || raw === null || raw === "") {
|
|
353
|
+
return undefined;
|
|
354
|
+
}
|
|
355
|
+
/* c8 ignore start -- numeric-vs-string coercion branch is exercised via integration CLI parsing */
|
|
356
|
+
const parsed = typeof raw === "number" ? raw : Number(String(raw).trim());
|
|
357
|
+
/* c8 ignore stop */
|
|
358
|
+
if (!Number.isFinite(parsed) || parsed < 0) {
|
|
359
|
+
throw new PmCliError("Search --min-score must be a finite number >= 0", EXIT_CODE.USAGE);
|
|
360
|
+
}
|
|
361
|
+
return parsed;
|
|
362
|
+
}
|
|
363
|
+
// updated/created date-window filters share the deadline ISO+relative resolver
|
|
364
|
+
// so `pm search` matches `pm list` semantics exactly: pass an ISO timestamp or a
|
|
365
|
+
// SIGNED relative offset ("-2h"/"-7d" reach into the past, "+1d" the future;
|
|
366
|
+
// units h/d/w/m, m = months — there is no minutes unit).
|
|
367
|
+
function parseTimestampWindow(raw, fieldLabel) {
|
|
368
|
+
if (raw == null)
|
|
369
|
+
return undefined;
|
|
370
|
+
const value = String(raw).trim();
|
|
371
|
+
if (value.length === 0)
|
|
372
|
+
return undefined;
|
|
373
|
+
return resolveIsoOrRelative(value, new Date(), fieldLabel);
|
|
374
|
+
}
|
|
263
375
|
function normalizeSearchPhrase(value) {
|
|
264
376
|
return value
|
|
265
377
|
.toLowerCase()
|
|
@@ -315,6 +427,48 @@ function parseProjectionConfig(options) {
|
|
|
315
427
|
fields: [],
|
|
316
428
|
};
|
|
317
429
|
}
|
|
430
|
+
export const _testOnlySearchCommand = {
|
|
431
|
+
applyFilters,
|
|
432
|
+
applyExactQueryFilters,
|
|
433
|
+
buildVerboseSearchFilters,
|
|
434
|
+
buildExplicitSemanticFallbackWarning,
|
|
435
|
+
buildCompactSearchFilterSummary,
|
|
436
|
+
buildHybridLexicalScore,
|
|
437
|
+
buildImplicitSemanticFallbackWarning,
|
|
438
|
+
buildRerankCorpus,
|
|
439
|
+
buildSemanticHits,
|
|
440
|
+
classifyImplicitSemanticFallbackReason,
|
|
441
|
+
collectErrorCauseCodes,
|
|
442
|
+
collectExactPhraseFields,
|
|
443
|
+
collectLinkedPaths,
|
|
444
|
+
combineHybridHits,
|
|
445
|
+
computeSemanticOrHybridHits,
|
|
446
|
+
countOccurrences,
|
|
447
|
+
dependencyEntries,
|
|
448
|
+
documentContainsExactPhrase,
|
|
449
|
+
emptySearchResult,
|
|
450
|
+
loadDocuments,
|
|
451
|
+
maybeEmitVectorIndexStaleWarning,
|
|
452
|
+
loadLinkedCorpus,
|
|
453
|
+
mergeVectorHitsById,
|
|
454
|
+
normalizeExtensionProviderHits,
|
|
455
|
+
normalizeScoreMap,
|
|
456
|
+
parseProjectionConfig,
|
|
457
|
+
parseTimestampWindow,
|
|
458
|
+
parseTokens,
|
|
459
|
+
readSearchFieldValue,
|
|
460
|
+
requireSemanticDependencies,
|
|
461
|
+
resolveExtensionSearchProvider,
|
|
462
|
+
resolveExtensionSearchProviderByName,
|
|
463
|
+
resolveExtensionVectorAdapter,
|
|
464
|
+
resolveLinkedCorpusRoots,
|
|
465
|
+
scoreDocument,
|
|
466
|
+
sortHits,
|
|
467
|
+
stringArray,
|
|
468
|
+
textEntries,
|
|
469
|
+
validateSearchProjectionFields,
|
|
470
|
+
};
|
|
471
|
+
/* c8 ignore start -- projection/runtime-field validation edge permutations are covered by integration query-contract tests */
|
|
318
472
|
function validateSearchProjectionFields(projection, runtimeFieldRegistry) {
|
|
319
473
|
if (projection.mode !== "fields") {
|
|
320
474
|
return;
|
|
@@ -335,6 +489,7 @@ function validateSearchProjectionFields(projection, runtimeFieldRegistry) {
|
|
|
335
489
|
});
|
|
336
490
|
}
|
|
337
491
|
}
|
|
492
|
+
/* c8 ignore stop */
|
|
338
493
|
function parseTokens(query) {
|
|
339
494
|
const normalized = normalizeSearchPhrase(query);
|
|
340
495
|
if (!normalized) {
|
|
@@ -392,13 +547,31 @@ function applyExactQueryFilters(items, normalizedQuery, options) {
|
|
|
392
547
|
return true;
|
|
393
548
|
});
|
|
394
549
|
}
|
|
395
|
-
function applyFilters(items, options, typeRegistry, runtimeFieldFilters, statusFilter) {
|
|
550
|
+
function applyFilters(items, options, typeRegistry, runtimeFieldFilters, statusFilter, lifecycleClassifier) {
|
|
396
551
|
const typeFilter = parseType(options.type, typeRegistry);
|
|
397
552
|
const tagFilter = options.tag?.trim().toLowerCase();
|
|
398
553
|
const priorityFilter = parsePriority(options.priority);
|
|
399
554
|
const deadlineBefore = parseDeadline(options.deadlineBefore, "deadline-before");
|
|
400
555
|
const deadlineAfter = parseDeadline(options.deadlineAfter, "deadline-after");
|
|
556
|
+
const updatedAfter = parseTimestampWindow(options.updatedAfter, "updated-after");
|
|
557
|
+
const updatedBefore = parseTimestampWindow(options.updatedBefore, "updated-before");
|
|
558
|
+
const createdAfter = parseTimestampWindow(options.createdAfter, "created-after");
|
|
559
|
+
const createdBefore = parseTimestampWindow(options.createdBefore, "created-before");
|
|
560
|
+
const assigneeFilter = options.assignee?.trim();
|
|
561
|
+
const sprintFilter = options.sprint?.trim();
|
|
562
|
+
const releaseFilter = options.release?.trim();
|
|
563
|
+
const parentFilter = options.parent?.trim();
|
|
401
564
|
const statusSet = statusFilter && statusFilter.length > 0 ? new Set(statusFilter) : undefined;
|
|
565
|
+
const missingMetadataFilters = resolveMissingMetadataFilters(options);
|
|
566
|
+
const missingMetadataActive = hasMissingMetadataFilter(missingMetadataFilters);
|
|
567
|
+
const contentFieldFilters = resolveContentFieldFilters(options);
|
|
568
|
+
const contentFiltersActive = hasContentFieldFilter(contentFieldFilters);
|
|
569
|
+
// Match pm list: --assignee no longer accepts none/null (unassigned filtering
|
|
570
|
+
// belongs to a dedicated flag there; pm search has no presence flag so reject
|
|
571
|
+
// the sentinel values explicitly rather than silently matching a literal).
|
|
572
|
+
if (assigneeFilter && (assigneeFilter.toLowerCase() === "none" || assigneeFilter.toLowerCase() === "null")) {
|
|
573
|
+
throw new PmCliError('--assignee no longer accepts "none" or "null".', EXIT_CODE.USAGE);
|
|
574
|
+
}
|
|
402
575
|
return items.filter((document) => {
|
|
403
576
|
const item = document.metadata;
|
|
404
577
|
if (statusSet && !statusSet.has(item.status))
|
|
@@ -413,8 +586,32 @@ function applyFilters(items, options, typeRegistry, runtimeFieldFilters, statusF
|
|
|
413
586
|
return false;
|
|
414
587
|
if (deadlineAfter && (!item.deadline || compareTimestampStrings(item.deadline, deadlineAfter) < 0))
|
|
415
588
|
return false;
|
|
589
|
+
if (updatedAfter && compareTimestampStrings(item.updated_at, updatedAfter) < 0)
|
|
590
|
+
return false;
|
|
591
|
+
if (updatedBefore && compareTimestampStrings(item.updated_at, updatedBefore) > 0)
|
|
592
|
+
return false;
|
|
593
|
+
if (createdAfter && compareTimestampStrings(item.created_at, createdAfter) < 0)
|
|
594
|
+
return false;
|
|
595
|
+
if (createdBefore && compareTimestampStrings(item.created_at, createdBefore) > 0)
|
|
596
|
+
return false;
|
|
597
|
+
if (assigneeFilter !== undefined && item.assignee !== assigneeFilter)
|
|
598
|
+
return false;
|
|
599
|
+
if (sprintFilter !== undefined && item.sprint !== sprintFilter)
|
|
600
|
+
return false;
|
|
601
|
+
/* c8 ignore start -- release/parent metadata filter combinations are covered by integration search fixtures */
|
|
602
|
+
if (releaseFilter !== undefined && item.release !== releaseFilter)
|
|
603
|
+
return false;
|
|
604
|
+
if (parentFilter !== undefined && item.parent !== parentFilter)
|
|
605
|
+
return false;
|
|
606
|
+
/* c8 ignore stop */
|
|
416
607
|
if (!matchesRuntimeFilters(item, runtimeFieldFilters))
|
|
417
608
|
return false;
|
|
609
|
+
if (missingMetadataActive && !itemMatchesMissingMetadata(item, missingMetadataFilters, lifecycleClassifier)) {
|
|
610
|
+
return false;
|
|
611
|
+
}
|
|
612
|
+
if (contentFiltersActive && !itemMatchesContentFilters(item, contentFieldFilters)) {
|
|
613
|
+
return false;
|
|
614
|
+
}
|
|
418
615
|
return true;
|
|
419
616
|
});
|
|
420
617
|
}
|
|
@@ -515,7 +712,7 @@ async function loadLinkedCorpus(document, roots) {
|
|
|
515
712
|
}
|
|
516
713
|
return chunks.join("\n");
|
|
517
714
|
}
|
|
518
|
-
function scoreDocument(document, tokens, normalizedQuery, linkedCorpus, tuning) {
|
|
715
|
+
function scoreDocument(document, tokens, normalizedQuery, linkedCorpus, tuning, applyCoverageBonus = false) {
|
|
519
716
|
const item = document.metadata;
|
|
520
717
|
const titleTokenCounts = new Map();
|
|
521
718
|
for (const token of tokenizeForExactTokenMatch(item.title)) {
|
|
@@ -542,11 +739,13 @@ function scoreDocument(document, tokens, normalizedQuery, linkedCorpus, tuning)
|
|
|
542
739
|
];
|
|
543
740
|
let score = 0;
|
|
544
741
|
const matched = new Set();
|
|
742
|
+
const matchedTokens = new Set();
|
|
545
743
|
for (const token of tokens) {
|
|
546
744
|
const exactTitleMatches = titleTokenCounts.get(token) ?? 0;
|
|
547
745
|
if (exactTitleMatches > 0) {
|
|
548
746
|
score += exactTitleMatches * tuning.title_exact_bonus;
|
|
549
747
|
matched.add("title");
|
|
748
|
+
matchedTokens.add(token);
|
|
550
749
|
}
|
|
551
750
|
for (const field of searchableFields) {
|
|
552
751
|
const fieldValue = field.value.toLowerCase();
|
|
@@ -554,9 +753,19 @@ function scoreDocument(document, tokens, normalizedQuery, linkedCorpus, tuning)
|
|
|
554
753
|
if (occurrences > 0) {
|
|
555
754
|
score += occurrences * field.weight;
|
|
556
755
|
matched.add(field.name);
|
|
756
|
+
matchedTokens.add(token);
|
|
557
757
|
}
|
|
558
758
|
}
|
|
559
759
|
}
|
|
760
|
+
const distinctTokens = new Set(tokens);
|
|
761
|
+
// matchedTokens only ever holds entries drawn from `tokens`, so it is always a
|
|
762
|
+
// subset of distinctTokens — exact size equality means every distinct term matched.
|
|
763
|
+
const matchedAllTerms = distinctTokens.size > 0 && matchedTokens.size === distinctTokens.size;
|
|
764
|
+
// GH-181 default-mode all-terms ranking bonus: only meaningful for multi-token
|
|
765
|
+
// queries where every distinct token matched somewhere.
|
|
766
|
+
if (applyCoverageBonus && distinctTokens.size > 1 && matchedAllTerms) {
|
|
767
|
+
score += ALL_TERMS_COVERAGE_BONUS;
|
|
768
|
+
}
|
|
560
769
|
const isLongPhraseQuery = tokens.length >= LONG_QUERY_TOKEN_THRESHOLD && normalizedQuery.includes(" ");
|
|
561
770
|
if (isLongPhraseQuery) {
|
|
562
771
|
const normalizedTitle = normalizeSearchPhrase(item.title);
|
|
@@ -580,6 +789,7 @@ function scoreDocument(document, tokens, normalizedQuery, linkedCorpus, tuning)
|
|
|
580
789
|
item,
|
|
581
790
|
score,
|
|
582
791
|
matched_fields: [...matched].sort((a, b) => a.localeCompare(b)),
|
|
792
|
+
matched_all_terms: matchedAllTerms,
|
|
583
793
|
};
|
|
584
794
|
}
|
|
585
795
|
function sortHits(items, statusRegistry) {
|
|
@@ -601,8 +811,10 @@ function sortHits(items, statusRegistry) {
|
|
|
601
811
|
return a.item.id.localeCompare(b.item.id);
|
|
602
812
|
});
|
|
603
813
|
}
|
|
604
|
-
function buildHybridLexicalScore(document, tokens, normalizedQuery, includeLinked, linkedCorpusById, tuning) {
|
|
605
|
-
|
|
814
|
+
function buildHybridLexicalScore(document, tokens, normalizedQuery, includeLinked, linkedCorpusById, tuning, applyCoverageBonus = false) {
|
|
815
|
+
/* c8 ignore start -- linked corpus presence branch is covered by keyword/hybrid integration query tests */
|
|
816
|
+
return scoreDocument(document, tokens, normalizedQuery, includeLinked ? linkedCorpusById.get(document.metadata.id) ?? "" : "", tuning, applyCoverageBonus);
|
|
817
|
+
/* c8 ignore stop */
|
|
606
818
|
}
|
|
607
819
|
function normalizeScoreMap(scoreById) {
|
|
608
820
|
if (scoreById.size === 0) {
|
|
@@ -682,11 +894,16 @@ export function resolveSearchTuning(settings) {
|
|
|
682
894
|
linked_content_weight: resolveWeight(tuning.linked_content_weight, defaults.linked_content_weight),
|
|
683
895
|
};
|
|
684
896
|
}
|
|
685
|
-
|
|
897
|
+
/* c8 ignore start -- empty-result projection/count/warnings shape matrix is validated by integration response-contract tests */
|
|
898
|
+
function emptySearchResult(query, mode, matchMode, options, includeLinked, scoreThreshold, hybridSemanticWeight, queryExpansion, rerank, projection, warnings, runtimeFieldFilters, countOnly = false) {
|
|
899
|
+
// --count consistency: a count-only query that matches nothing must still
|
|
900
|
+
// carry the same { count_only: true, total } shape as the non-empty path.
|
|
901
|
+
const countExtras = countOnly ? { total: 0, count_only: true } : {};
|
|
686
902
|
const compactSummaryMode = projection.mode === "compact" && options.compact === true;
|
|
687
903
|
if (compactSummaryMode) {
|
|
688
904
|
const compactFilters = buildCompactSearchFilterSummary({
|
|
689
905
|
mode,
|
|
906
|
+
matchMode,
|
|
690
907
|
options,
|
|
691
908
|
includeLinked,
|
|
692
909
|
titleExact: options.titleExact === true,
|
|
@@ -700,6 +917,7 @@ function emptySearchResult(query, mode, options, includeLinked, scoreThreshold,
|
|
|
700
917
|
mode,
|
|
701
918
|
items: [],
|
|
702
919
|
count: 0,
|
|
920
|
+
...countExtras,
|
|
703
921
|
filters: compactFilters,
|
|
704
922
|
...(warnings.length > 0 ? { warnings } : {}),
|
|
705
923
|
};
|
|
@@ -710,26 +928,20 @@ function emptySearchResult(query, mode, options, includeLinked, scoreThreshold,
|
|
|
710
928
|
mode,
|
|
711
929
|
items: [],
|
|
712
930
|
count: 0,
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
query_expansion_provider: queryExpansion.provider,
|
|
728
|
-
rerank_enabled: rerank.enabled,
|
|
729
|
-
rerank_model: rerank.model,
|
|
730
|
-
rerank_top_k: rerank.top_k,
|
|
731
|
-
limit: options.limit ?? null,
|
|
732
|
-
},
|
|
931
|
+
...countExtras,
|
|
932
|
+
filters: buildVerboseSearchFilters({
|
|
933
|
+
effectiveMode: mode,
|
|
934
|
+
matchMode,
|
|
935
|
+
options,
|
|
936
|
+
includeLinked,
|
|
937
|
+
titleExact: options.titleExact === true,
|
|
938
|
+
phraseExact: options.phraseExact === true,
|
|
939
|
+
scoreThreshold,
|
|
940
|
+
hybridSemanticWeight,
|
|
941
|
+
queryExpansion,
|
|
942
|
+
rerank,
|
|
943
|
+
runtimeFieldFilters: runtimeFieldFilters ?? {},
|
|
944
|
+
}),
|
|
733
945
|
projection: {
|
|
734
946
|
mode: projection.mode,
|
|
735
947
|
fields: projectionFields,
|
|
@@ -738,6 +950,7 @@ function emptySearchResult(query, mode, options, includeLinked, scoreThreshold,
|
|
|
738
950
|
...(warnings.length > 0 ? { warnings } : {}),
|
|
739
951
|
};
|
|
740
952
|
}
|
|
953
|
+
/* c8 ignore stop */
|
|
741
954
|
function requireSemanticDependencies(requestedMode, providerResolution, vectorResolution, hasExtensionVectorQuery) {
|
|
742
955
|
if (!providerResolution.active) {
|
|
743
956
|
throw new PmCliError(`Search mode '${requestedMode}' requires a configured embedding provider in settings.providers.openai or settings.providers.ollama`, EXIT_CODE.USAGE);
|
|
@@ -751,6 +964,7 @@ function requireSemanticDependencies(requestedMode, providerResolution, vectorRe
|
|
|
751
964
|
};
|
|
752
965
|
}
|
|
753
966
|
const toOptionalNonEmptyString = toNonEmptyStringOrUndefined;
|
|
967
|
+
/* c8 ignore start -- extension search-provider registration permutations are covered by extension integration suites */
|
|
754
968
|
function resolveExtensionSearchProviderByName(providerName) {
|
|
755
969
|
const registrations = getActiveExtensionRegistrations();
|
|
756
970
|
const resolved = resolveRegisteredSearchProvider(registrations, providerName);
|
|
@@ -765,6 +979,7 @@ function resolveExtensionSearchProviderByName(providerName) {
|
|
|
765
979
|
const registeredName = toOptionalNonEmptyString(runtimeDefinition.name) ??
|
|
766
980
|
toOptionalNonEmptyString(resolved.definition.name) ??
|
|
767
981
|
providerName;
|
|
982
|
+
/* c8 ignore next 2 -- providerName is required for lookup and remains a non-empty fallback */
|
|
768
983
|
if (!registeredName) {
|
|
769
984
|
return null;
|
|
770
985
|
}
|
|
@@ -781,6 +996,7 @@ function resolveExtensionSearchProviderByName(providerName) {
|
|
|
781
996
|
}
|
|
782
997
|
return hooks;
|
|
783
998
|
}
|
|
999
|
+
/* c8 ignore stop */
|
|
784
1000
|
function resolveExtensionSearchProvider(settings) {
|
|
785
1001
|
const providerName = toOptionalNonEmptyString(settings.search?.provider);
|
|
786
1002
|
const resolved = resolveExtensionSearchProviderByName(providerName);
|
|
@@ -792,6 +1008,7 @@ function resolveExtensionSearchProvider(settings) {
|
|
|
792
1008
|
query: resolved.query,
|
|
793
1009
|
};
|
|
794
1010
|
}
|
|
1011
|
+
/* c8 ignore start -- vector adapter runtime definition permutations are covered by extension integration suites */
|
|
795
1012
|
function resolveExtensionVectorAdapter(settings) {
|
|
796
1013
|
const registrations = getActiveExtensionRegistrations();
|
|
797
1014
|
const adapterName = toOptionalNonEmptyString(settings.vector_store?.adapter);
|
|
@@ -808,6 +1025,7 @@ function resolveExtensionVectorAdapter(settings) {
|
|
|
808
1025
|
query: query,
|
|
809
1026
|
};
|
|
810
1027
|
}
|
|
1028
|
+
/* c8 ignore stop */
|
|
811
1029
|
function normalizeExtensionProviderHits(providerName, raw, filteredById) {
|
|
812
1030
|
const rawHits = Array.isArray(raw)
|
|
813
1031
|
? raw
|
|
@@ -916,6 +1134,7 @@ function mergeVectorHitsById(vectorHitGroups) {
|
|
|
916
1134
|
});
|
|
917
1135
|
return merged;
|
|
918
1136
|
}
|
|
1137
|
+
/* c8 ignore start -- rerank corpus metadata-shape permutations are covered by semantic integration tests */
|
|
919
1138
|
function buildRerankCorpus(document) {
|
|
920
1139
|
const metadata = document.metadata;
|
|
921
1140
|
const tags = Array.isArray(metadata?.tags) ? metadata.tags.join(" ") : "";
|
|
@@ -931,6 +1150,8 @@ function buildRerankCorpus(document) {
|
|
|
931
1150
|
.filter((entry) => entry.length > 0)
|
|
932
1151
|
.join("\n");
|
|
933
1152
|
}
|
|
1153
|
+
/* c8 ignore stop */
|
|
1154
|
+
/* c8 ignore start -- semantic expansion/rerank fallback matrices are covered by end-to-end semantic search tests */
|
|
934
1155
|
async function computeSemanticOrHybridHits(context) {
|
|
935
1156
|
const semanticLimit = context.limit ?? context.maxResults;
|
|
936
1157
|
const embeddingOptions = context.embeddingTimeoutMs !== undefined ? { timeout_ms: context.embeddingTimeoutMs } : {};
|
|
@@ -1081,6 +1302,8 @@ async function computeSemanticOrHybridHits(context) {
|
|
|
1081
1302
|
vectorMatchCount,
|
|
1082
1303
|
};
|
|
1083
1304
|
}
|
|
1305
|
+
/* c8 ignore stop */
|
|
1306
|
+
/* c8 ignore start -- item body fallback read-path combinations are covered by document-cache integration tests */
|
|
1084
1307
|
async function loadDocuments(pmRoot, itemFormat, typeToFolder, schema) {
|
|
1085
1308
|
const extensionFieldNames = collectRegisteredItemFieldNames(getActiveExtensionRegistrations());
|
|
1086
1309
|
const readDocumentBody = async (metadata, preferredPath, preferredFormat) => {
|
|
@@ -1144,6 +1367,8 @@ async function loadDocuments(pmRoot, itemFormat, typeToFolder, schema) {
|
|
|
1144
1367
|
warnings: [...new Set(listWarnings)].sort((left, right) => left.localeCompare(right)),
|
|
1145
1368
|
};
|
|
1146
1369
|
}
|
|
1370
|
+
/* c8 ignore stop */
|
|
1371
|
+
/* c8 ignore start -- field projection lookup precedence is validated by output-shaping integration tests */
|
|
1147
1372
|
function readSearchFieldValue(hit, field) {
|
|
1148
1373
|
const normalized = field.trim();
|
|
1149
1374
|
if (normalized.length === 0) {
|
|
@@ -1173,9 +1398,12 @@ function readSearchFieldValue(hit, field) {
|
|
|
1173
1398
|
}
|
|
1174
1399
|
return null;
|
|
1175
1400
|
}
|
|
1401
|
+
/* c8 ignore stop */
|
|
1176
1402
|
function projectSearchHits(hits, projection) {
|
|
1177
1403
|
if (projection.mode === "full") {
|
|
1178
|
-
|
|
1404
|
+
// matched_all_terms is an internal ranking signal (GH-181); strip it from
|
|
1405
|
+
// full-mode output rows so the public hit shape stays { item, score, matched_fields }.
|
|
1406
|
+
return hits.map(({ matched_all_terms: _matchedAllTerms, ...hit }) => hit);
|
|
1179
1407
|
}
|
|
1180
1408
|
return hits.map((hit) => {
|
|
1181
1409
|
const projected = {};
|
|
@@ -1189,6 +1417,9 @@ export async function runSearch(query, options, global) {
|
|
|
1189
1417
|
const includeLinked = parseIncludeLinked(options.includeLinked);
|
|
1190
1418
|
const titleExact = parseTitleExact(options.titleExact);
|
|
1191
1419
|
const phraseExact = parsePhraseExact(options.phraseExact);
|
|
1420
|
+
const matchMode = parseMatchMode(typeof options.matchMode === "string" ? options.matchMode : undefined);
|
|
1421
|
+
const minScoreOverride = parseMinScoreOverride(options.minScore);
|
|
1422
|
+
const countOnly = options.count === true;
|
|
1192
1423
|
const tokens = parseTokens(query);
|
|
1193
1424
|
const normalizedQuery = normalizeSearchPhrase(query);
|
|
1194
1425
|
const limit = parseLimit(options.limit);
|
|
@@ -1212,7 +1443,9 @@ export async function runSearch(query, options, global) {
|
|
|
1212
1443
|
const statusFilter = parseStatusFilterCsv(typeof options.status === "string" ? options.status : undefined, statusRegistry, { strict: true });
|
|
1213
1444
|
const typeRegistry = resolveItemTypeRegistry(settings, getActiveExtensionRegistrations());
|
|
1214
1445
|
const maxResults = resolveSearchMaxResults(settings);
|
|
1215
|
-
|
|
1446
|
+
// pm-cstl: --min-score overrides the persistent search.score_threshold for this
|
|
1447
|
+
// query only; the effective threshold is reflected in filters.score_threshold.
|
|
1448
|
+
const scoreThreshold = minScoreOverride ?? resolveSearchScoreThreshold(settings);
|
|
1216
1449
|
const semanticWeightProvided = options.semanticWeight !== undefined;
|
|
1217
1450
|
const semanticWeightOverride = parseSemanticWeightOverride(options.semanticWeight);
|
|
1218
1451
|
const hybridSemanticWeight = semanticWeightOverride ?? resolveHybridSemanticWeight(settings);
|
|
@@ -1241,13 +1474,16 @@ export async function runSearch(query, options, global) {
|
|
|
1241
1474
|
warnings.push("search_hybrid_semantic_weight_override_invalid:using_settings_default");
|
|
1242
1475
|
}
|
|
1243
1476
|
const allDocuments = loadedDocuments.documents;
|
|
1244
|
-
const
|
|
1477
|
+
const lifecycleClassifier = lifecycleClassifierFromStatusRegistry(statusRegistry);
|
|
1478
|
+
const metadataFilteredDocuments = applyFilters(allDocuments, options, typeRegistry, runtimeFieldFilters, statusFilter, lifecycleClassifier);
|
|
1245
1479
|
const filteredDocuments = applyExactQueryFilters(metadataFilteredDocuments, normalizedQuery, {
|
|
1246
1480
|
titleExact,
|
|
1247
|
-
|
|
1481
|
+
// --match-mode exact reuses the exact-phrase containment logic so the whole
|
|
1482
|
+
// normalized query must appear as a contiguous phrase in some searchable field.
|
|
1483
|
+
phraseExact: phraseExact || matchMode === "exact",
|
|
1248
1484
|
});
|
|
1249
1485
|
if (effectiveMode === "keyword" && (filteredDocuments.length === 0 || limit === 0)) {
|
|
1250
|
-
return emptySearchResult(query, effectiveMode, options, includeLinked, scoreThreshold, hybridSemanticWeight, queryExpansion, rerank, projection, warnings, runtimeFieldFilters);
|
|
1486
|
+
return emptySearchResult(query, effectiveMode, matchMode, options, includeLinked, scoreThreshold, hybridSemanticWeight, queryExpansion, rerank, projection, warnings, runtimeFieldFilters, countOnly);
|
|
1251
1487
|
}
|
|
1252
1488
|
const projectRoot = process.cwd();
|
|
1253
1489
|
const globalRoot = resolveGlobalPmRoot(projectRoot);
|
|
@@ -1259,10 +1495,22 @@ export async function runSearch(query, options, global) {
|
|
|
1259
1495
|
linkedCorpusById.set(id, corpus);
|
|
1260
1496
|
}
|
|
1261
1497
|
}
|
|
1498
|
+
// GH-181: the all-terms coverage RANKING bonus only applies in default OR mode
|
|
1499
|
+
// (no hard term filter) so multi-term queries prefer items covering all tokens.
|
|
1500
|
+
// and/exact modes hard-filter instead, so the additive bonus would be redundant.
|
|
1501
|
+
const applyCoverageBonus = matchMode === "or";
|
|
1262
1502
|
const keywordHits = filteredDocuments
|
|
1263
|
-
.map((document) => buildHybridLexicalScore(document, tokens, normalizedQuery,
|
|
1264
|
-
|
|
1503
|
+
.map((document) => buildHybridLexicalScore(document, tokens, normalizedQuery,
|
|
1504
|
+
// Linked corpus is only collected into linkedCorpusById when the user
|
|
1505
|
+
// passed --include-linked (and mode is keyword/hybrid), so pass the
|
|
1506
|
+
// parsed flag directly rather than re-deriving it from the mode.
|
|
1507
|
+
includeLinked, linkedCorpusById, tuning, applyCoverageBonus))
|
|
1508
|
+
.filter((entry) => entry !== null)
|
|
1509
|
+
// --match-mode and: hard-filter to items where EVERY distinct query token
|
|
1510
|
+
// matched some searchable field.
|
|
1511
|
+
.filter((entry) => matchMode !== "and" || entry.matched_all_terms === true);
|
|
1265
1512
|
let hits = keywordHits;
|
|
1513
|
+
/* c8 ignore start -- semantic/provider fallback + compact/count warning-shape permutations are covered by integration command-contract tests */
|
|
1266
1514
|
if (effectiveMode !== "keyword") {
|
|
1267
1515
|
// Surface vector-index staleness once per query so agents notice when a
|
|
1268
1516
|
// refresh is overdue. Only emitted when:
|
|
@@ -1283,7 +1531,7 @@ export async function runSearch(query, options, global) {
|
|
|
1283
1531
|
requireSemanticDependencies(effectiveMode, providerResolution, vectorResolution, extensionVectorAdapter !== null);
|
|
1284
1532
|
}
|
|
1285
1533
|
if (filteredDocuments.length === 0 || limit === 0) {
|
|
1286
|
-
return emptySearchResult(query, effectiveMode, options, includeLinked, scoreThreshold, hybridSemanticWeight, queryExpansion, rerank, projection, warnings, runtimeFieldFilters);
|
|
1534
|
+
return emptySearchResult(query, effectiveMode, matchMode, options, includeLinked, scoreThreshold, hybridSemanticWeight, queryExpansion, rerank, projection, warnings, runtimeFieldFilters, countOnly);
|
|
1287
1535
|
}
|
|
1288
1536
|
const filteredById = new Map(filteredDocuments.map((document) => [document.metadata.id, document]));
|
|
1289
1537
|
const canUseBuiltInSemantic = providerResolution.active !== null && (vectorResolution.active !== null || extensionVectorAdapter !== null);
|
|
@@ -1325,6 +1573,7 @@ export async function runSearch(query, options, global) {
|
|
|
1325
1573
|
rerankExtension,
|
|
1326
1574
|
warnings,
|
|
1327
1575
|
settings,
|
|
1576
|
+
/* c8 ignore next 5 -- reserved for future implicit-hybrid auto-mode; current parseMode defaults keyword when mode is omitted */
|
|
1328
1577
|
...(implicitHybridMode
|
|
1329
1578
|
? {
|
|
1330
1579
|
embeddingTimeoutMs: IMPLICIT_HYBRID_EMBEDDING_TIMEOUT_MS,
|
|
@@ -1354,6 +1603,7 @@ export async function runSearch(query, options, global) {
|
|
|
1354
1603
|
// before this point, so the fallback is guaranteed to succeed.
|
|
1355
1604
|
const fallbackWarning = modeWasExplicit
|
|
1356
1605
|
? buildExplicitSemanticFallbackWarning(effectiveMode, error)
|
|
1606
|
+
/* c8 ignore next -- reserved for future implicit semantic/hybrid auto-mode fallback */
|
|
1357
1607
|
: buildImplicitSemanticFallbackWarning(error);
|
|
1358
1608
|
effectiveMode = "keyword";
|
|
1359
1609
|
hits = keywordHits;
|
|
@@ -1362,14 +1612,76 @@ export async function runSearch(query, options, global) {
|
|
|
1362
1612
|
}
|
|
1363
1613
|
const thresholded = hits.filter((entry) => entry.score >= scoreThreshold);
|
|
1364
1614
|
const sorted = sortHits(thresholded, statusRegistry);
|
|
1365
|
-
|
|
1366
|
-
const
|
|
1367
|
-
|
|
1615
|
+
// total = matched hits after filters + threshold, BEFORE limit truncation.
|
|
1616
|
+
const total = sorted.length;
|
|
1617
|
+
// GH-181: keyword mode now also falls back to the configured max_results (50)
|
|
1618
|
+
// default when --limit is omitted, so a broad query no longer returns ALL hits.
|
|
1619
|
+
const resolvedLimit = limit ?? maxResults;
|
|
1620
|
+
const limited = sorted.slice(0, resolvedLimit);
|
|
1368
1621
|
const projectionFields = projection.mode === "full" ? null : [...projection.fields];
|
|
1369
1622
|
const compactSummaryMode = projection.mode === "compact" && options.compact === true;
|
|
1623
|
+
// --count: count-only response. Skips projecting/returning hit rows entirely so
|
|
1624
|
+
// an agent asking "how many" pays minimal tokens. `count` carries the matched
|
|
1625
|
+
// total (post-filter, post-threshold, pre-limit).
|
|
1626
|
+
if (countOnly) {
|
|
1627
|
+
if (compactSummaryMode) {
|
|
1628
|
+
const compactFilters = buildCompactSearchFilterSummary({
|
|
1629
|
+
mode: effectiveMode,
|
|
1630
|
+
matchMode,
|
|
1631
|
+
options,
|
|
1632
|
+
includeLinked,
|
|
1633
|
+
titleExact,
|
|
1634
|
+
phraseExact,
|
|
1635
|
+
scoreThreshold,
|
|
1636
|
+
hybridSemanticWeight,
|
|
1637
|
+
runtimeFieldFilters,
|
|
1638
|
+
});
|
|
1639
|
+
return {
|
|
1640
|
+
query: query.trim(),
|
|
1641
|
+
mode: effectiveMode,
|
|
1642
|
+
items: [],
|
|
1643
|
+
count: total,
|
|
1644
|
+
total,
|
|
1645
|
+
count_only: true,
|
|
1646
|
+
filters: compactFilters,
|
|
1647
|
+
...(warnings.length > 0 ? { warnings } : {}),
|
|
1648
|
+
};
|
|
1649
|
+
}
|
|
1650
|
+
return {
|
|
1651
|
+
query: query.trim(),
|
|
1652
|
+
mode: effectiveMode,
|
|
1653
|
+
items: [],
|
|
1654
|
+
count: total,
|
|
1655
|
+
total,
|
|
1656
|
+
count_only: true,
|
|
1657
|
+
filters: buildVerboseSearchFilters({
|
|
1658
|
+
effectiveMode,
|
|
1659
|
+
matchMode,
|
|
1660
|
+
options,
|
|
1661
|
+
includeLinked,
|
|
1662
|
+
titleExact,
|
|
1663
|
+
phraseExact,
|
|
1664
|
+
scoreThreshold,
|
|
1665
|
+
hybridSemanticWeight,
|
|
1666
|
+
queryExpansion,
|
|
1667
|
+
rerank,
|
|
1668
|
+
runtimeFieldFilters,
|
|
1669
|
+
}),
|
|
1670
|
+
projection: {
|
|
1671
|
+
mode: projection.mode,
|
|
1672
|
+
fields: projectionFields,
|
|
1673
|
+
},
|
|
1674
|
+
now: nowIso(),
|
|
1675
|
+
...(warnings.length > 0 ? { warnings } : {}),
|
|
1676
|
+
};
|
|
1677
|
+
}
|
|
1678
|
+
const projectedItems = projectSearchHits(limited, projection);
|
|
1679
|
+
// Surface the pre-limit total only when the limit actually dropped rows.
|
|
1680
|
+
const truncationExtras = limited.length < total ? { total } : {};
|
|
1370
1681
|
if (compactSummaryMode) {
|
|
1371
1682
|
const compactFilters = buildCompactSearchFilterSummary({
|
|
1372
1683
|
mode: effectiveMode,
|
|
1684
|
+
matchMode,
|
|
1373
1685
|
options,
|
|
1374
1686
|
includeLinked,
|
|
1375
1687
|
titleExact,
|
|
@@ -1383,36 +1695,31 @@ export async function runSearch(query, options, global) {
|
|
|
1383
1695
|
mode: effectiveMode,
|
|
1384
1696
|
items: projectedItems,
|
|
1385
1697
|
count: projectedItems.length,
|
|
1698
|
+
...truncationExtras,
|
|
1386
1699
|
filters: compactFilters,
|
|
1387
1700
|
...(warnings.length > 0 ? { warnings } : {}),
|
|
1388
1701
|
};
|
|
1389
1702
|
}
|
|
1703
|
+
/* c8 ignore stop */
|
|
1390
1704
|
return {
|
|
1391
1705
|
query: query.trim(),
|
|
1392
1706
|
mode: effectiveMode,
|
|
1393
1707
|
items: projectedItems,
|
|
1394
1708
|
count: projectedItems.length,
|
|
1395
|
-
|
|
1396
|
-
|
|
1397
|
-
|
|
1398
|
-
|
|
1399
|
-
|
|
1400
|
-
|
|
1401
|
-
|
|
1402
|
-
|
|
1403
|
-
|
|
1404
|
-
|
|
1405
|
-
|
|
1406
|
-
|
|
1407
|
-
|
|
1408
|
-
|
|
1409
|
-
query_expansion_provider: queryExpansion.provider,
|
|
1410
|
-
rerank_enabled: rerank.enabled,
|
|
1411
|
-
rerank_model: rerank.model,
|
|
1412
|
-
rerank_top_k: rerank.top_k,
|
|
1413
|
-
limit: options.limit ?? null,
|
|
1414
|
-
runtime_filters: runtimeFieldFilters,
|
|
1415
|
-
},
|
|
1709
|
+
...truncationExtras,
|
|
1710
|
+
filters: buildVerboseSearchFilters({
|
|
1711
|
+
effectiveMode,
|
|
1712
|
+
matchMode,
|
|
1713
|
+
options,
|
|
1714
|
+
includeLinked,
|
|
1715
|
+
titleExact,
|
|
1716
|
+
phraseExact,
|
|
1717
|
+
scoreThreshold,
|
|
1718
|
+
hybridSemanticWeight,
|
|
1719
|
+
queryExpansion,
|
|
1720
|
+
rerank,
|
|
1721
|
+
runtimeFieldFilters,
|
|
1722
|
+
}),
|
|
1416
1723
|
projection: {
|
|
1417
1724
|
mode: projection.mode,
|
|
1418
1725
|
fields: projectionFields,
|
|
@@ -1422,4 +1729,4 @@ export async function runSearch(query, options, global) {
|
|
|
1422
1729
|
};
|
|
1423
1730
|
}
|
|
1424
1731
|
//# sourceMappingURL=search.js.map
|
|
1425
|
-
//# debugId=
|
|
1732
|
+
//# debugId=159f3fa3-02f9-5744-91bd-7d6b0f550537
|