@unbrained/pm-cli 2026.7.8 → 2026.7.9

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.
Files changed (170) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/README.md +1 -0
  3. package/dist/cli/commands/close.js +5 -2
  4. package/dist/cli/commands/close.js.map +1 -1
  5. package/dist/cli/commands/completion.js +8 -2
  6. package/dist/cli/commands/completion.js.map +1 -1
  7. package/dist/cli/commands/contracts.d.ts +11 -0
  8. package/dist/cli/commands/contracts.js +112 -15
  9. package/dist/cli/commands/contracts.js.map +1 -1
  10. package/dist/cli/commands/create.js +4 -2
  11. package/dist/cli/commands/create.js.map +1 -1
  12. package/dist/cli/commands/list.d.ts +4 -0
  13. package/dist/cli/commands/list.js +32 -3
  14. package/dist/cli/commands/list.js.map +1 -1
  15. package/dist/cli/commands/update.d.ts +32 -1
  16. package/dist/cli/commands/update.js +19 -2
  17. package/dist/cli/commands/update.js.map +1 -1
  18. package/dist/cli/register-list-query.js +4 -2
  19. package/dist/cli/register-list-query.js.map +1 -1
  20. package/dist/cli/register-operations.js +4 -2
  21. package/dist/cli/register-operations.js.map +1 -1
  22. package/dist/cli/registration-helpers.js +4 -2
  23. package/dist/cli/registration-helpers.js.map +1 -1
  24. package/dist/cli-bundle/chunks/{chunk-D63PEJTB.js → chunk-26MFLA7K.js} +2 -2
  25. package/dist/cli-bundle/chunks/{chunk-HI27UADG.js → chunk-2FKIIQMJ.js} +3 -3
  26. package/dist/cli-bundle/chunks/{chunk-RLHQ3G4M.js → chunk-5RJ4LFD3.js} +30 -3
  27. package/dist/cli-bundle/chunks/chunk-5RJ4LFD3.js.map +7 -0
  28. package/dist/cli-bundle/chunks/{chunk-IYRG5AEC.js → chunk-5ZMZF53A.js} +3 -3
  29. package/dist/cli-bundle/chunks/{chunk-UVFJSKTF.js → chunk-63PZJCKO.js} +7 -4
  30. package/dist/cli-bundle/chunks/chunk-63PZJCKO.js.map +1 -0
  31. package/dist/cli-bundle/chunks/{chunk-TUDAYIO7.js → chunk-ASSVI7FP.js} +5 -3
  32. package/dist/cli-bundle/chunks/{chunk-TUDAYIO7.js.map → chunk-ASSVI7FP.js.map} +1 -1
  33. package/dist/cli-bundle/chunks/{chunk-KMXVZ2P7.js → chunk-BPYVKTZE.js} +112 -17
  34. package/dist/cli-bundle/chunks/chunk-BPYVKTZE.js.map +1 -0
  35. package/dist/cli-bundle/chunks/{chunk-3FRNNVWY.js → chunk-CEX2DQXZ.js} +405 -75
  36. package/dist/cli-bundle/chunks/chunk-CEX2DQXZ.js.map +7 -0
  37. package/dist/cli-bundle/chunks/{chunk-DUBC6TI3.js → chunk-CHSXGTWF.js} +18 -4
  38. package/dist/cli-bundle/chunks/{chunk-DUBC6TI3.js.map → chunk-CHSXGTWF.js.map} +2 -2
  39. package/dist/cli-bundle/chunks/{chunk-G4FKP4ID.js → chunk-DBV5A7FT.js} +6 -4
  40. package/dist/cli-bundle/chunks/chunk-DBV5A7FT.js.map +1 -0
  41. package/dist/cli-bundle/chunks/{chunk-YQEKE4FO.js → chunk-DQLP22K2.js} +3 -3
  42. package/dist/cli-bundle/chunks/{chunk-ZMOPZFVT.js → chunk-GZ365M6E.js} +2 -2
  43. package/dist/cli-bundle/chunks/{chunk-XPSGJ4IV.js → chunk-K2OKKYSO.js} +4 -2
  44. package/dist/cli-bundle/chunks/{chunk-XPSGJ4IV.js.map → chunk-K2OKKYSO.js.map} +2 -2
  45. package/dist/cli-bundle/chunks/{chunk-TR2C6V5T.js → chunk-K4NMHZR3.js} +90 -19
  46. package/dist/cli-bundle/chunks/chunk-K4NMHZR3.js.map +7 -0
  47. package/dist/cli-bundle/chunks/{chunk-MYHFZNBO.js → chunk-KAJNWMBE.js} +2 -2
  48. package/dist/cli-bundle/chunks/{chunk-TU5P744I.js → chunk-MBLHA6LR.js} +2 -2
  49. package/dist/cli-bundle/chunks/{chunk-UCRYCT5M.js → chunk-MCZK7LY6.js} +19 -5
  50. package/dist/cli-bundle/chunks/{chunk-UCRYCT5M.js.map → chunk-MCZK7LY6.js.map} +1 -1
  51. package/dist/cli-bundle/chunks/{chunk-TTCJCKUJ.js → chunk-N4S7BV43.js} +3 -3
  52. package/dist/cli-bundle/chunks/{chunk-ML27MHNM.js → chunk-NBJCIAVV.js} +88 -17
  53. package/dist/cli-bundle/chunks/chunk-NBJCIAVV.js.map +1 -0
  54. package/dist/cli-bundle/chunks/{chunk-ASMRSIDX.js → chunk-NRYZ4QLH.js} +111 -16
  55. package/dist/cli-bundle/chunks/chunk-NRYZ4QLH.js.map +7 -0
  56. package/dist/cli-bundle/chunks/{chunk-RDJXIAJB.js → chunk-NSPSJWGL.js} +6 -3
  57. package/dist/cli-bundle/chunks/chunk-NSPSJWGL.js.map +7 -0
  58. package/dist/cli-bundle/chunks/{chunk-PJPZTE7P.js → chunk-ONADVBMD.js} +5 -3
  59. package/dist/cli-bundle/chunks/chunk-ONADVBMD.js.map +7 -0
  60. package/dist/cli-bundle/chunks/{chunk-GE44TQMC.js → chunk-P5SUMCU5.js} +3 -3
  61. package/dist/cli-bundle/chunks/{chunk-2RADY7IB.js → chunk-PPY3GXFK.js} +405 -75
  62. package/dist/cli-bundle/chunks/chunk-PPY3GXFK.js.map +1 -0
  63. package/dist/cli-bundle/chunks/{chunk-YR5R4FMQ.js → chunk-S7J3GEHL.js} +4 -4
  64. package/dist/cli-bundle/chunks/{chunk-XN5BEN2B.js → chunk-TI7QSUFK.js} +31 -4
  65. package/dist/cli-bundle/chunks/chunk-TI7QSUFK.js.map +1 -0
  66. package/dist/cli-bundle/chunks/{chunk-EYPIUFWJ.js → chunk-VCGHRLJU.js} +4 -4
  67. package/dist/cli-bundle/chunks/{chunk-P2WE5KCU.js → chunk-WDNPNW22.js} +2 -2
  68. package/dist/cli-bundle/chunks/{chunk-SN5X5GTU.js → chunk-XXN2B2MJ.js} +2 -2
  69. package/dist/cli-bundle/chunks/{chunk-GQOKFX2G.js → chunk-Y2736PT5.js} +2 -2
  70. package/dist/cli-bundle/chunks/{chunk-FL625JJM.js → chunk-YHKXNGLA.js} +3 -3
  71. package/dist/cli-bundle/chunks/{chunk-YUCKM3MD.js → chunk-YPE5MFPJ.js} +2 -2
  72. package/dist/cli-bundle/chunks/{close-E3RLZSP2.js → close-5WY6QO5F.js} +2 -2
  73. package/dist/cli-bundle/chunks/{close-K6BFI3OX.js → close-TKTFRL7N.js} +2 -2
  74. package/dist/cli-bundle/chunks/{close-many-6NBL3PM4.js → close-many-HEPL66EG.js} +4 -4
  75. package/dist/cli-bundle/chunks/{close-many-X4YKS3RO.js → close-many-U2KLQ3NL.js} +4 -4
  76. package/dist/cli-bundle/chunks/{create-AMBMYP6F.js → create-KCQM6UYM.js} +2 -2
  77. package/dist/cli-bundle/chunks/{create-TRIBYORN.js → create-LD4SEUD6.js} +2 -2
  78. package/dist/cli-bundle/chunks/{plan-MK2QY3GA.js → plan-B42KBMX7.js} +3 -3
  79. package/dist/cli-bundle/chunks/{plan-CJPKFRBK.js → plan-LUR7C24X.js} +3 -3
  80. package/dist/cli-bundle/chunks/{profile-HTBFINKQ.js → profile-5F75MO5O.js} +3 -3
  81. package/dist/cli-bundle/chunks/{profile-AQNHXOYA.js → profile-JRDMDGT5.js} +3 -3
  82. package/dist/cli-bundle/chunks/{register-list-query-EEF33SUJ.js → register-list-query-GZYRZLQZ.js} +8 -8
  83. package/dist/cli-bundle/chunks/register-list-query-GZYRZLQZ.js.map +1 -0
  84. package/dist/cli-bundle/chunks/{register-list-query-S4FBWIWN.js → register-list-query-W2W7RQJJ.js} +7 -7
  85. package/dist/cli-bundle/chunks/register-list-query-W2W7RQJJ.js.map +7 -0
  86. package/dist/cli-bundle/chunks/{register-mutation-L5Q7AUDN.js → register-mutation-5UDT3WL3.js} +10 -10
  87. package/dist/cli-bundle/chunks/{register-mutation-QFLRBCI7.js → register-mutation-7DMOYDPC.js} +10 -10
  88. package/dist/cli-bundle/chunks/{register-operations-QDU43FCG.js → register-operations-NW43IUPE.js} +12 -11
  89. package/dist/cli-bundle/chunks/register-operations-NW43IUPE.js.map +7 -0
  90. package/dist/cli-bundle/chunks/{register-operations-HDE4FVW4.js → register-operations-Y4E32W4D.js} +13 -12
  91. package/dist/cli-bundle/chunks/register-operations-Y4E32W4D.js.map +1 -0
  92. package/dist/cli-bundle/chunks/{register-setup-EGMTAXDC.js → register-setup-3GVJ7XPE.js} +6 -6
  93. package/dist/cli-bundle/chunks/{register-setup-PNIO3L2P.js → register-setup-MPTTS52V.js} +6 -6
  94. package/dist/cli-bundle/chunks/{update-SDIRJGSY.js → update-76CRUMC7.js} +4 -4
  95. package/dist/cli-bundle/chunks/{update-MP4XLU56.js → update-ZMYVXM77.js} +4 -4
  96. package/dist/cli-bundle/chunks/{update-many-34AIU6W7.js → update-many-QYQRGNPU.js} +6 -6
  97. package/dist/cli-bundle/chunks/{update-many-JUPCNOKV.js → update-many-U4CEQWI4.js} +6 -6
  98. package/dist/cli-bundle/main.js +7 -7
  99. package/dist/cli-bundle/sdk-runtime.js +81 -17
  100. package/dist/cli-bundle/sdk.js +84 -20
  101. package/dist/cli-bundle/sdk.js.map +3 -3
  102. package/dist/sdk/cli-contracts/flag-contracts.js +5 -2
  103. package/dist/sdk/cli-contracts/flag-contracts.js.map +1 -1
  104. package/dist/sdk/cli-contracts/tool-option-contracts.js +10 -5
  105. package/dist/sdk/cli-contracts/tool-option-contracts.js.map +1 -1
  106. package/dist/sdk/cli-contracts/tool-parameter-tables.js +12 -4
  107. package/dist/sdk/cli-contracts/tool-parameter-tables.js.map +1 -1
  108. package/dist/sdk/cli-contracts/tool-schema.d.ts +4 -0
  109. package/dist/sdk/cli-contracts/tool-schema.js +66 -11
  110. package/dist/sdk/cli-contracts/tool-schema.js.map +1 -1
  111. package/dist/sdk/index.d.ts +1 -1
  112. package/dist/sdk/index.js +3 -3
  113. package/dist/sdk/index.js.map +1 -1
  114. package/dist/sdk/runtime.d.ts +340 -25
  115. package/dist/sdk/runtime.js +413 -25
  116. package/dist/sdk/runtime.js.map +1 -1
  117. package/docs/AGENT_GUIDE.md +3 -0
  118. package/docs/COMMANDS.md +10 -1
  119. package/docs/SDK.md +37 -0
  120. package/package.json +1 -1
  121. package/dist/cli-bundle/chunks/chunk-2RADY7IB.js.map +0 -1
  122. package/dist/cli-bundle/chunks/chunk-3FRNNVWY.js.map +0 -7
  123. package/dist/cli-bundle/chunks/chunk-ASMRSIDX.js.map +0 -7
  124. package/dist/cli-bundle/chunks/chunk-G4FKP4ID.js.map +0 -1
  125. package/dist/cli-bundle/chunks/chunk-KMXVZ2P7.js.map +0 -1
  126. package/dist/cli-bundle/chunks/chunk-ML27MHNM.js.map +0 -1
  127. package/dist/cli-bundle/chunks/chunk-PJPZTE7P.js.map +0 -7
  128. package/dist/cli-bundle/chunks/chunk-RDJXIAJB.js.map +0 -7
  129. package/dist/cli-bundle/chunks/chunk-RLHQ3G4M.js.map +0 -7
  130. package/dist/cli-bundle/chunks/chunk-TR2C6V5T.js.map +0 -7
  131. package/dist/cli-bundle/chunks/chunk-UVFJSKTF.js.map +0 -1
  132. package/dist/cli-bundle/chunks/chunk-XN5BEN2B.js.map +0 -1
  133. package/dist/cli-bundle/chunks/register-list-query-EEF33SUJ.js.map +0 -1
  134. package/dist/cli-bundle/chunks/register-list-query-S4FBWIWN.js.map +0 -7
  135. package/dist/cli-bundle/chunks/register-operations-HDE4FVW4.js.map +0 -1
  136. package/dist/cli-bundle/chunks/register-operations-QDU43FCG.js.map +0 -7
  137. /package/dist/cli-bundle/chunks/{chunk-D63PEJTB.js.map → chunk-26MFLA7K.js.map} +0 -0
  138. /package/dist/cli-bundle/chunks/{chunk-HI27UADG.js.map → chunk-2FKIIQMJ.js.map} +0 -0
  139. /package/dist/cli-bundle/chunks/{chunk-IYRG5AEC.js.map → chunk-5ZMZF53A.js.map} +0 -0
  140. /package/dist/cli-bundle/chunks/{chunk-YQEKE4FO.js.map → chunk-DQLP22K2.js.map} +0 -0
  141. /package/dist/cli-bundle/chunks/{chunk-ZMOPZFVT.js.map → chunk-GZ365M6E.js.map} +0 -0
  142. /package/dist/cli-bundle/chunks/{chunk-MYHFZNBO.js.map → chunk-KAJNWMBE.js.map} +0 -0
  143. /package/dist/cli-bundle/chunks/{chunk-TU5P744I.js.map → chunk-MBLHA6LR.js.map} +0 -0
  144. /package/dist/cli-bundle/chunks/{chunk-TTCJCKUJ.js.map → chunk-N4S7BV43.js.map} +0 -0
  145. /package/dist/cli-bundle/chunks/{chunk-GE44TQMC.js.map → chunk-P5SUMCU5.js.map} +0 -0
  146. /package/dist/cli-bundle/chunks/{chunk-YR5R4FMQ.js.map → chunk-S7J3GEHL.js.map} +0 -0
  147. /package/dist/cli-bundle/chunks/{chunk-EYPIUFWJ.js.map → chunk-VCGHRLJU.js.map} +0 -0
  148. /package/dist/cli-bundle/chunks/{chunk-P2WE5KCU.js.map → chunk-WDNPNW22.js.map} +0 -0
  149. /package/dist/cli-bundle/chunks/{chunk-SN5X5GTU.js.map → chunk-XXN2B2MJ.js.map} +0 -0
  150. /package/dist/cli-bundle/chunks/{chunk-GQOKFX2G.js.map → chunk-Y2736PT5.js.map} +0 -0
  151. /package/dist/cli-bundle/chunks/{chunk-FL625JJM.js.map → chunk-YHKXNGLA.js.map} +0 -0
  152. /package/dist/cli-bundle/chunks/{chunk-YUCKM3MD.js.map → chunk-YPE5MFPJ.js.map} +0 -0
  153. /package/dist/cli-bundle/chunks/{close-E3RLZSP2.js.map → close-5WY6QO5F.js.map} +0 -0
  154. /package/dist/cli-bundle/chunks/{close-K6BFI3OX.js.map → close-TKTFRL7N.js.map} +0 -0
  155. /package/dist/cli-bundle/chunks/{close-many-6NBL3PM4.js.map → close-many-HEPL66EG.js.map} +0 -0
  156. /package/dist/cli-bundle/chunks/{close-many-X4YKS3RO.js.map → close-many-U2KLQ3NL.js.map} +0 -0
  157. /package/dist/cli-bundle/chunks/{create-AMBMYP6F.js.map → create-KCQM6UYM.js.map} +0 -0
  158. /package/dist/cli-bundle/chunks/{create-TRIBYORN.js.map → create-LD4SEUD6.js.map} +0 -0
  159. /package/dist/cli-bundle/chunks/{plan-MK2QY3GA.js.map → plan-B42KBMX7.js.map} +0 -0
  160. /package/dist/cli-bundle/chunks/{plan-CJPKFRBK.js.map → plan-LUR7C24X.js.map} +0 -0
  161. /package/dist/cli-bundle/chunks/{profile-HTBFINKQ.js.map → profile-5F75MO5O.js.map} +0 -0
  162. /package/dist/cli-bundle/chunks/{profile-AQNHXOYA.js.map → profile-JRDMDGT5.js.map} +0 -0
  163. /package/dist/cli-bundle/chunks/{register-mutation-L5Q7AUDN.js.map → register-mutation-5UDT3WL3.js.map} +0 -0
  164. /package/dist/cli-bundle/chunks/{register-mutation-QFLRBCI7.js.map → register-mutation-7DMOYDPC.js.map} +0 -0
  165. /package/dist/cli-bundle/chunks/{register-setup-EGMTAXDC.js.map → register-setup-3GVJ7XPE.js.map} +0 -0
  166. /package/dist/cli-bundle/chunks/{register-setup-PNIO3L2P.js.map → register-setup-MPTTS52V.js.map} +0 -0
  167. /package/dist/cli-bundle/chunks/{update-SDIRJGSY.js.map → update-76CRUMC7.js.map} +0 -0
  168. /package/dist/cli-bundle/chunks/{update-MP4XLU56.js.map → update-ZMYVXM77.js.map} +0 -0
  169. /package/dist/cli-bundle/chunks/{update-many-34AIU6W7.js.map → update-many-QYQRGNPU.js.map} +0 -0
  170. /package/dist/cli-bundle/chunks/{update-many-JUPCNOKV.js.map → update-many-U4CEQWI4.js.map} +0 -0
package/CHANGELOG.md CHANGED
@@ -1,5 +1,12 @@
1
1
  # Changelog
2
2
 
3
+ ## 2026.7.9 - 2026-07-09
4
+
5
+ ### Added
6
+
7
+ - GH-442: lean pm contracts --summary mode for cheap agent bootstrap (25KB -\> 1-3KB) ([pm-vxxm](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/features/pm-vxxm.toon))
8
+ - GH-470: pm list --today and --recent shorthand filters for recently active items ([pm-bfma](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/features/pm-bfma.toon))
9
+
3
10
  ## 2026.7.8 - 2026-07-08
4
11
 
5
12
  ### Added
package/README.md CHANGED
@@ -5,6 +5,7 @@
5
5
  [![CodeFactor](https://www.codefactor.io/repository/github/unbraind/pm-cli/badge)](https://www.codefactor.io/repository/github/unbraind/pm-cli)
6
6
  [![npm version](https://img.shields.io/npm/v/%40unbrained%2Fpm-cli)](https://www.npmjs.com/package/%40unbrained%2Fpm-cli)
7
7
  [![Node >=22.18](https://img.shields.io/node/v/%40unbrained%2Fpm-cli)](https://nodejs.org)
8
+ ![NPM Downloads](https://img.shields.io/npm/d18m/%40unbrained%2Fpm-cli)
8
9
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)
9
10
 
10
11
  [![pm total](https://pm-cli.unbrained.dev/badges/svg?repo=unbraind/pm-cli&metric=items&style=flat&rt=2)](https://pm-cli.unbrained.dev/badges)
@@ -4,7 +4,7 @@
4
4
  * Implements the pm close command surface and its agent-facing runtime behavior.
5
5
  */
6
6
 
7
- !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]="19dbc992-675b-554c-83bd-4aa14b766810")}catch(e){}}();
7
+ !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]="e37ebda3-1d83-5476-b2bf-d1cce94fe5d3")}catch(e){}}();
8
8
  import { pathExists } from "../../core/fs/fs-utils.js";
9
9
  import { collectBlockedByIds } from "../../core/item/actionability.js";
10
10
  import { toItemRecord } from "../../core/item/item-record.js";
@@ -361,8 +361,10 @@ function mutateCloseMetadata(metadata, context) {
361
361
  const duplicateFallbackFields = applyDuplicateCloseMetadata(metadata, context.duplicateOf);
362
362
  const mutationWarnings = collectCloseValidationWarnings(metadata, context.validateCloseMode, context.activeChildIds);
363
363
  metadata.status = context.statusRegistry.close_status;
364
+ metadata.closed_at = context.closedAt;
364
365
  const changedFields = [
365
366
  "status",
367
+ "closed_at",
366
368
  ...applyCloseReason(metadata, context.closeReason),
367
369
  ...inlineChangedFields,
368
370
  ];
@@ -454,6 +456,7 @@ export async function runClose(id, closeReasonText, options, global) {
454
456
  validateCloseMode,
455
457
  activeChildIds,
456
458
  closeReason,
459
+ closedAt: new Date().toISOString(),
457
460
  });
458
461
  },
459
462
  });
@@ -467,4 +470,4 @@ export async function runClose(id, closeReasonText, options, global) {
467
470
  };
468
471
  }
469
472
  //# sourceMappingURL=close.js.map
470
- //# debugId=19dbc992-675b-554c-83bd-4aa14b766810
473
+ //# debugId=e37ebda3-1d83-5476-b2bf-d1cce94fe5d3
@@ -1 +1 @@
1
- {"version":3,"file":"close.js","sources":["cli/commands/close.ts"],"sourceRoot":"/","sourcesContent":["/**\n * @module cli/commands/close\n *\n * Implements the pm close command surface and its agent-facing runtime behavior.\n */\nimport { pathExists } from \"../../core/fs/fs-utils.js\";\nimport { collectBlockedByIds } from \"../../core/item/actionability.js\";\nimport { toItemRecord } from \"../../core/item/item-record.js\";\nimport { isTerminalStatus } from \"../../core/item/status.js\";\nimport { resolveItemTypeRegistry } from \"../../core/item/type-registry.js\";\nimport { resolveRuntimeStatusRegistry, type RuntimeStatusRegistry } from \"../../core/schema/runtime-schema.js\";\nimport { EXIT_CODE } from \"../../core/shared/constants.js\";\nimport type { GlobalOptions } from \"../../core/shared/command-types.js\";\nimport { PmCliError } from \"../../core/shared/errors.js\";\nimport {\n buildItemNotFoundError,\n listAllFrontMatterLight,\n locateItem,\n mutateItem,\n readLocatedItem,\n} from \"../../core/store/item-store.js\";\nimport { getSettingsPath, resolvePmRoot } from \"../../core/store/paths.js\";\nimport { readSettings } from \"../../core/store/settings.js\";\nimport type { ItemFrontMatter } from \"../../types/index.js\";\n\n/**\n * Documents the close command options payload exchanged by command, SDK, and package integrations.\n */\nexport interface CloseCommandOptions {\n author?: string;\n message?: string;\n validateClose?: string;\n force?: boolean;\n // pm-fl0c #11 (2026-05-28): allow setting the three closure validation\n // fields inline on `pm close` so agents do not have to issue a prior\n // `pm update` just to satisfy --validate-close warn|strict. These map 1:1\n // to ItemFrontMatter.{resolution,expected_result,actual_result}.\n resolution?: string;\n expectedResult?: string;\n actualResult?: string;\n duplicateOf?: string;\n}\n\n/**\n * Documents the close result payload exchanged by command, SDK, and package integrations.\n */\nexport interface CloseResult {\n item: Record<string, unknown>;\n changed_fields: string[];\n warnings: string[];\n}\n\ninterface AutoUnblockCandidate {\n id: string;\n blocker_ids: string[];\n}\n\ntype CloseInlineFieldKey = \"resolution\" | \"expected_result\" | \"actual_result\";\n\ninterface CloseMutationContext {\n statusRegistry: RuntimeStatusRegistry;\n force: boolean | undefined;\n options: CloseCommandOptions;\n duplicateOf: string | undefined;\n validateCloseMode: ValidateCloseMode;\n activeChildIds: string[];\n closeReason: string | undefined;\n}\n\nfunction toAuthor(candidate: string | undefined, defaultAuthor: string): string {\n const resolved = candidate ?? process.env.PM_AUTHOR ?? defaultAuthor;\n const trimmed = resolved.trim();\n return trimmed || \"unknown\";\n}\n\nfunction normalizeCloseReason(reasonText: string | undefined, required: boolean): string | undefined {\n const reason = (reasonText ?? \"\").trim();\n if (reason.length > 0) {\n return reason;\n }\n if (required) {\n throw new PmCliError(\n \"Close reason text is required because governance.require_close_reason is enabled\",\n EXIT_CODE.USAGE,\n {\n code: \"close_reason_required\",\n required: \"Provide a one-line closing summary as the positional text, --reason, or --message.\",\n why: \"governance.require_close_reason is enabled, so every close must record why the item is done.\",\n examples: [\n 'pm close <id> \"Done: <what changed and why>\"',\n 'pm close <id> --reason \"<closing summary>\"',\n 'pm close <id> -m \"<closing summary>\"',\n \"pm close <id> --duplicate-of <canonical-id>\",\n ],\n nextSteps: [\n \"Re-run the close with a closing summary.\",\n 'When closing as a duplicate, --duplicate-of <id> auto-fills the close reason as \"Duplicate of <id>\".',\n \"To stop requiring reasons, run: pm config set governance-require-close-reason --policy disabled\",\n ],\n },\n );\n }\n return undefined;\n}\n\ntype ValidateCloseMode = \"off\" | \"warn\" | \"strict\";\n\ninterface CloseReasonFallbackInput {\n closeReasonText: string | undefined;\n duplicateOf: string | undefined;\n resolution: string | undefined;\n message: string | undefined;\n requireCloseReason: boolean;\n}\n\nfunction resolveEffectiveCloseReasonText(input: CloseReasonFallbackInput): string | undefined {\n if ((input.closeReasonText ?? \"\").trim().length > 0) {\n return input.closeReasonText;\n }\n if (input.duplicateOf !== undefined) {\n return `Duplicate of ${input.duplicateOf}`;\n }\n const trimmedResolution = typeof input.resolution === \"string\" ? input.resolution.trim() : \"\";\n if (trimmedResolution.length > 0) {\n return trimmedResolution;\n }\n const trimmedMessage = typeof input.message === \"string\" ? input.message.trim() : \"\";\n if (input.requireCloseReason && trimmedMessage.length > 0) {\n return trimmedMessage;\n }\n return input.closeReasonText;\n}\n\nconst CLOSE_VALIDATION_FIELDS: Array<{ key: keyof Pick<ItemFrontMatter, \"resolution\" | \"expected_result\" | \"actual_result\">; label: string }> = [\n { key: \"resolution\", label: \"resolution\" },\n { key: \"expected_result\", label: \"expected_result\" },\n { key: \"actual_result\", label: \"actual_result\" },\n];\n\nfunction parseValidateCloseMode(raw: string | undefined): ValidateCloseMode | undefined {\n if (raw === undefined) {\n return undefined;\n }\n const normalized = raw.trim().toLowerCase();\n if (normalized.length === 0 || normalized === \"warn\") {\n return \"warn\";\n }\n if (normalized === \"off\" || normalized === \"none\" || normalized === \"disabled\") {\n return \"off\";\n }\n if (normalized === \"strict\") {\n return \"strict\";\n }\n throw new PmCliError(`Invalid --validate-close mode \"${raw}\" (expected \"off\", \"warn\", or \"strict\")`, EXIT_CODE.USAGE);\n}\n\nfunction findMissingCloseValidationFields(frontMatter: ItemFrontMatter): string[] {\n const missing: string[] = [];\n for (const field of CLOSE_VALIDATION_FIELDS) {\n const rawValue = frontMatter[field.key];\n if (typeof rawValue !== \"string\" || rawValue.trim().length === 0) {\n missing.push(field.label);\n }\n }\n return missing;\n}\n\nasync function duplicateChainReferencesClosingItem(\n loadItemById: (id: string) => Promise<ItemFrontMatter | null>,\n initialDuplicateOf: unknown,\n closingId: string,\n): Promise<boolean> {\n const visited = new Set<string>();\n let current = initialDuplicateOf;\n while (typeof current === \"string\" && current.trim().length > 0) {\n const currentId = current.trim();\n if (currentId === closingId) {\n return true;\n }\n if (visited.has(currentId)) {\n return false;\n }\n visited.add(currentId);\n current = (await loadItemById(currentId))?.duplicate_of;\n }\n return false;\n}\n\nfunction shouldApplyDuplicateFallback(value: unknown): boolean {\n return typeof value !== \"string\" || value.trim().length === 0;\n}\n\nasync function assertDuplicateTargetExists(\n pmRoot: string,\n settings: Awaited<ReturnType<typeof readSettings>>,\n duplicateOf: string | undefined,\n closingId: string,\n): Promise<string | undefined> {\n const rawTarget = duplicateOf?.trim();\n if (!rawTarget) {\n return undefined;\n }\n if (rawTarget === closingId) {\n throw new PmCliError(\"An item cannot be closed as a duplicate of itself.\", EXIT_CODE.USAGE, {\n code: \"duplicate_target_self\",\n why: \"--duplicate-of must identify the canonical item that should remain open or already represent the work.\",\n });\n }\n const typeRegistry = resolveItemTypeRegistry(settings);\n const itemCache = new Map<string, ItemFrontMatter | null>();\n const loadItemById = async (id: string): Promise<ItemFrontMatter | null> => {\n if (itemCache.has(id)) {\n return itemCache.get(id) ?? null;\n }\n const located = await locateItem(pmRoot, id, settings.id_prefix, settings.item_format, typeRegistry.type_to_folder);\n if (!located) {\n itemCache.set(id, null);\n return null;\n }\n const { document } = await readLocatedItem(located, { schema: settings.schema });\n itemCache.set(id, document.metadata);\n return document.metadata;\n };\n const target = await loadItemById(rawTarget);\n if (!target) {\n throw new PmCliError(`Duplicate target \"${rawTarget}\" was not found. Create or locate the canonical item first.`, EXIT_CODE.USAGE, {\n code: \"duplicate_target_missing\",\n why: \"Duplicate closure should point at a real canonical pm item so future dedupe and changelog tooling can trace the relationship.\",\n examples: [`pm close ${closingId} \"Duplicate of ${rawTarget}\" --duplicate-of ${rawTarget}`],\n nextSteps: [\"Run pm search/list to find the canonical item, then retry with --duplicate-of <id>.\"],\n });\n }\n if (await duplicateChainReferencesClosingItem(loadItemById, target.duplicate_of, closingId)) {\n throw new PmCliError(`Circular duplicate reference detected. Target \"${rawTarget}\" points back to \"${closingId}\".`, EXIT_CODE.USAGE, {\n code: \"duplicate_target_circular\",\n why: \"Circular duplicate relationships create loops for dedupe and status propagation tooling.\",\n nextSteps: [\"Choose the existing canonical item, or clear the target duplicate_of metadata before closing this item as a duplicate.\"],\n });\n }\n if (typeof target.duplicate_of === \"string\" && target.duplicate_of.trim().length > 0) {\n throw new PmCliError(`Duplicate target \"${rawTarget}\" is already marked as a duplicate of \"${target.duplicate_of.trim()}\".`, EXIT_CODE.USAGE, {\n code: \"duplicate_target_is_duplicate\",\n why: \"Duplicate closure should point directly at the canonical item, not another duplicate.\",\n examples: [`pm close ${closingId} \"Duplicate of ${target.duplicate_of.trim()}\" --duplicate-of ${target.duplicate_of.trim()}`],\n nextSteps: [\"Use the canonical item referenced by duplicate_of as the --duplicate-of target.\"],\n });\n }\n return target.id;\n}\n\nasync function findActiveChildIds(\n pmRoot: string,\n settings: Awaited<ReturnType<typeof readSettings>>,\n parentId: string,\n statusRegistry: RuntimeStatusRegistry,\n): Promise<string[]> {\n const typeRegistry = resolveItemTypeRegistry(settings);\n const items = await listAllFrontMatterLight(\n pmRoot,\n settings.item_format,\n typeRegistry.type_to_folder,\n undefined,\n settings.schema,\n );\n return items\n .filter((item) => item.parent === parentId && !isTerminalStatus(item.status, statusRegistry))\n .map((item) => item.id)\n .sort((left, right) => left.localeCompare(right));\n}\n\nasync function findAutoUnblockCandidates(\n pmRoot: string,\n settings: Awaited<ReturnType<typeof readSettings>>,\n closedId: string,\n statusRegistry: RuntimeStatusRegistry,\n): Promise<AutoUnblockCandidate[]> {\n const typeRegistry = resolveItemTypeRegistry(settings);\n const items = await listAllFrontMatterLight(\n pmRoot,\n settings.item_format,\n typeRegistry.type_to_folder,\n undefined,\n settings.schema,\n );\n const itemsById = new Map(items.map((item) => [item.id, item]));\n const blockedStatuses = statusRegistry.blocked_statuses;\n return items\n .filter((item) => blockedStatuses.has(item.status))\n .map((item) => ({ item, blockerIds: collectBlockedByIds(item) }))\n .filter(({ blockerIds }) => blockerIds.includes(closedId))\n .filter(({ blockerIds }) =>\n blockerIds.every((blockerId) => {\n const blocker = itemsById.get(blockerId);\n return blocker !== undefined && isTerminalStatus(blocker.status, statusRegistry);\n }),\n )\n .map(({ item, blockerIds }) => ({ id: item.id, blocker_ids: blockerIds }))\n .sort((left, right) => left.id.localeCompare(right.id));\n}\n\nasync function autoUnblockResolvedDependents(\n pmRoot: string,\n settings: Awaited<ReturnType<typeof readSettings>>,\n closedId: string,\n author: string,\n statusRegistry: RuntimeStatusRegistry,\n): Promise<string[]> {\n const candidates = await findAutoUnblockCandidates(pmRoot, settings, closedId, statusRegistry);\n const warnings: string[] = [];\n for (const candidate of candidates) {\n try {\n const unblocked = await mutateItem({\n pmRoot,\n settings,\n id: candidate.id,\n op: \"update\",\n author,\n message: `Auto-unblocked after blocker ${closedId} closed`,\n mutate(document) {\n /* c8 ignore start -- normal auto-unblock candidates carry dependency metadata; fallback preserves hand-edited scalar-only blockers. */\n const dependencies = document.metadata.dependencies ?? [];\n /* c8 ignore stop */\n const remainingDependencies = dependencies.filter((dependency) => {\n const dependencyId = dependency.id.trim();\n return dependency.kind !== \"blocked_by\" || !candidate.blocker_ids.includes(dependencyId);\n });\n document.metadata.status = statusRegistry.open_status;\n delete document.metadata.blocked_by;\n delete document.metadata.blocked_reason;\n document.metadata.unblock_note = `Auto-unblocked after blocker ${closedId} closed; all blockers resolved (${candidate.blocker_ids.join(\", \")}).`;\n if (remainingDependencies.length > 0) {\n document.metadata.dependencies = remainingDependencies;\n } else {\n delete document.metadata.dependencies;\n }\n const changedFields = [\"status\", \"blocked_by\", \"blocked_reason\", \"unblock_note\"];\n if (remainingDependencies.length !== dependencies.length) {\n changedFields.push(\"dependencies\");\n }\n return {\n changedFields,\n };\n },\n });\n warnings.push(`auto_unblocked:${unblocked.item.id}:resolved_blockers=${candidate.blocker_ids.join(\",\")}`);\n /* c8 ignore start -- defensive fan-out failure path; normal lock/claim state is auditable and still unblocks. */\n } catch (error) {\n const reason = error instanceof Error ? error.message.replace(/\\s+/g, \" \").trim() : \"unknown\";\n warnings.push(`auto_unblock_failed:${candidate.id}:${reason}`);\n }\n /* c8 ignore stop */\n }\n return warnings;\n}\n\nfunction applyInlineCloseFields(metadata: ItemFrontMatter, options: CloseCommandOptions): CloseInlineFieldKey[] {\n const changedFields: CloseInlineFieldKey[] = [];\n const inlineCloseFields: Array<{ option: string | undefined; key: CloseInlineFieldKey }> = [\n { option: options.resolution, key: \"resolution\" },\n { option: options.expectedResult, key: \"expected_result\" },\n { option: options.actualResult, key: \"actual_result\" },\n ];\n for (const { option, key } of inlineCloseFields) {\n if (typeof option !== \"string\") {\n continue;\n }\n const trimmed = option.trim();\n if (trimmed.length === 0) {\n continue;\n }\n metadata[key] = trimmed;\n changedFields.push(key);\n }\n return changedFields;\n}\n\nfunction applyDuplicateCloseMetadata(metadata: ItemFrontMatter, duplicateOf: string | undefined): CloseInlineFieldKey[] {\n if (duplicateOf === undefined) {\n return [];\n }\n metadata.duplicate_of = duplicateOf;\n const duplicateFallbackFields: CloseInlineFieldKey[] = [];\n const fallbackValues: Array<{ key: CloseInlineFieldKey; value: string }> = [\n { key: \"resolution\", value: `Duplicate of ${duplicateOf}` },\n { key: \"expected_result\", value: `Canonical item ${duplicateOf} tracks the work.` },\n { key: \"actual_result\", value: `Closed as duplicate of ${duplicateOf}.` },\n ];\n for (const { key, value } of fallbackValues) {\n if (shouldApplyDuplicateFallback(metadata[key])) {\n metadata[key] = value;\n duplicateFallbackFields.push(key);\n }\n }\n return duplicateFallbackFields;\n}\n\nfunction collectCloseValidationWarnings(\n metadata: ItemFrontMatter,\n validateCloseMode: ValidateCloseMode,\n activeChildIds: string[],\n): string[] {\n const warnings: string[] = [];\n if (validateCloseMode !== \"off\") {\n const missingFields = findMissingCloseValidationFields(metadata);\n if (missingFields.length > 0) {\n if (validateCloseMode === \"strict\") {\n throw new PmCliError(\n `Cannot close item ${metadata.id}: missing ${missingFields.join(\", \")}. Populate fields or use --validate-close warn.`,\n EXIT_CODE.USAGE,\n );\n }\n warnings.push(`close_validation_missing_fields:${metadata.id}:${missingFields.join(\",\")}`);\n }\n if (activeChildIds.length > 0) {\n if (validateCloseMode === \"strict\") {\n throw new PmCliError(\n `Cannot close item ${metadata.id}: active child items remain open (${activeChildIds.join(\", \")}). Close, cancel, or re-parent them first, or use --validate-close warn.`,\n EXIT_CODE.USAGE,\n );\n }\n warnings.push(`close_validation_active_children:${metadata.id}:${activeChildIds.join(\",\")}`);\n }\n return warnings;\n }\n if (activeChildIds.length > 0) {\n warnings.push(`closed_with_active_children:${metadata.id}:${activeChildIds.join(\",\")}`);\n }\n return warnings;\n}\n\nfunction applyCloseReason(metadata: ItemFrontMatter, closeReason: string | undefined): string[] {\n if (closeReason !== undefined) {\n metadata.close_reason = closeReason;\n return [\"close_reason\"];\n }\n if (metadata.close_reason !== undefined) {\n delete metadata.close_reason;\n return [\"close_reason\"];\n }\n return [];\n}\n\nfunction clearCloseAssignee(metadata: ItemFrontMatter): string[] {\n if (metadata.assignee === undefined) {\n return [];\n }\n delete metadata.assignee;\n return [\"assignee\"];\n}\n\nfunction clearClosedBlockerSignals(metadata: ItemFrontMatter): { changedFields: string[]; warnings: string[] } {\n const previousBlockedBy = typeof metadata.blocked_by === \"string\" ? metadata.blocked_by.trim() : \"\";\n const existingDeps = metadata.dependencies ?? [];\n const blockedByEdge = existingDeps.find((dep) => dep.kind === \"blocked_by\");\n const hadBlockedReason = metadata.blocked_reason !== undefined;\n if (previousBlockedBy.length === 0 && blockedByEdge === undefined && !hadBlockedReason) {\n return { changedFields: [], warnings: [] };\n }\n const changedFields: string[] = [];\n if (previousBlockedBy.length > 0) {\n delete metadata.blocked_by;\n changedFields.push(\"blocked_by\");\n }\n if (hadBlockedReason) {\n delete metadata.blocked_reason;\n changedFields.push(\"blocked_reason\");\n }\n if (blockedByEdge !== undefined) {\n const remainingDeps = existingDeps.filter((dep) => dep.kind !== \"blocked_by\");\n if (remainingDeps.length > 0) {\n metadata.dependencies = remainingDeps;\n } else {\n delete metadata.dependencies;\n }\n changedFields.push(\"dependencies\");\n }\n // A stale reason-only close has no blocker identity; omit the blocker-clear warning instead of inventing one.\n const reportedBlocker = previousBlockedBy || blockedByEdge?.id;\n return {\n changedFields,\n warnings: reportedBlocker ? [`closed_cleared_blocked_by:${metadata.id}:${reportedBlocker}`] : [],\n };\n}\n\nfunction mutateCloseMetadata(metadata: ItemFrontMatter, context: CloseMutationContext): { changedFields: string[]; warnings?: string[] } {\n if (isTerminalStatus(metadata.status, context.statusRegistry) && !context.force) {\n throw new PmCliError(`Item ${metadata.id} is already terminal; use --force to close again.`, EXIT_CODE.CONFLICT);\n }\n const inlineChangedFields = applyInlineCloseFields(metadata, context.options);\n const duplicateFallbackFields = applyDuplicateCloseMetadata(metadata, context.duplicateOf);\n const mutationWarnings = collectCloseValidationWarnings(metadata, context.validateCloseMode, context.activeChildIds);\n metadata.status = context.statusRegistry.close_status;\n const changedFields = [\n \"status\",\n ...applyCloseReason(metadata, context.closeReason),\n ...inlineChangedFields,\n ];\n if (context.duplicateOf !== undefined) {\n changedFields.push(\"duplicate_of\");\n for (const key of duplicateFallbackFields) {\n /* v8 ignore start -- duplicate fallback keys are already pre-deduped by applyDuplicateCloseMetadata in covered close paths */\n if (!changedFields.includes(key)) {\n changedFields.push(key);\n }\n /* v8 ignore stop */\n }\n }\n changedFields.push(...clearCloseAssignee(metadata));\n const blockerCleanup = clearClosedBlockerSignals(metadata);\n changedFields.push(...blockerCleanup.changedFields);\n mutationWarnings.push(...blockerCleanup.warnings);\n return {\n changedFields,\n ...(mutationWarnings.length > 0 ? { warnings: mutationWarnings } : {}),\n };\n}\n\nexport const _testOnlyCloseCommand = {\n blockedByIds: collectBlockedByIds,\n};\n\n/**\n * Implements run close for the public runtime surface of this module.\n */\nexport async function runClose(\n id: string,\n closeReasonText: string | undefined,\n options: CloseCommandOptions,\n global: GlobalOptions,\n): Promise<CloseResult> {\n const pmRoot = resolvePmRoot(process.cwd(), global.path);\n if (!(await pathExists(getSettingsPath(pmRoot)))) {\n throw new PmCliError(`Tracker is not initialized at ${pmRoot}. Run pm init first.`, EXIT_CODE.NOT_FOUND);\n }\n\n const settings = await readSettings(pmRoot);\n const statusRegistry = resolveRuntimeStatusRegistry(settings.schema);\n const author = toAuthor(options.author, settings.author_default);\n // GH-250: verify the target item EXISTS before the governance close-reason\n // gate fires. Otherwise closing a typo'd id with no reason reports\n // \"Close reason text is required\" and hides the real cause (bad id) until a\n // reason is supplied. Existence is the more fundamental precondition, so it\n // is validated first regardless of whether a reason was provided.\n const typeToFolder = resolveItemTypeRegistry(settings).type_to_folder;\n const located = await locateItem(pmRoot, id, settings.id_prefix, settings.item_format, typeToFolder);\n if (!located) {\n throw await buildItemNotFoundError(pmRoot, id, settings.id_prefix, typeToFolder);\n }\n // GH-204: resolve the duplicate target BEFORE reason validation so\n // `pm close <id> --duplicate-of <canonical>` succeeds under\n // governance.require_close_reason without a manual reason — when no\n // positional/--reason text is provided the reason defaults to\n // \"Duplicate of <id>\" (mirroring the auto-filled closure metadata).\n // Explicit reason text still wins.\n const duplicateOf = await assertDuplicateTargetExists(pmRoot, settings, options.duplicateOf, id);\n // pm-7x8d / pm-9hry / GH-204: when no explicit positional/--reason text is given, derive\n // the close reason from the next-best closure signal instead of hard-blocking\n // under governance.require_close_reason. Precedence: explicit reason text >\n // --duplicate-of (\"Duplicate of <id>\") > --resolution summary > --message.\n // Resolution still writes metadata.resolution below; message still writes the\n // history entry through mutateItem. Reusing either as the close reason just lets\n // a single agent-authored close command succeed when it already supplied a\n // closure summary through another structured option.\n const effectiveCloseReasonText = resolveEffectiveCloseReasonText({\n closeReasonText,\n duplicateOf,\n resolution: options.resolution,\n message: options.message,\n requireCloseReason: settings.governance.require_close_reason,\n });\n const closeReason = normalizeCloseReason(effectiveCloseReasonText, settings.governance.require_close_reason);\n const validateCloseMode = parseValidateCloseMode(options.validateClose) ?? settings.governance.close_validation_default;\n // C3 (pm-fu5d): scan for active children even under minimal governance so\n // closing a parent is never silently orphaning — off mode emits an\n // informational note instead of the warn/strict validation warning.\n const activeChildIds = await findActiveChildIds(pmRoot, settings, id, statusRegistry);\n\n const result = await mutateItem({\n pmRoot,\n settings,\n id,\n op: \"close\",\n author,\n message: options.message,\n force: options.force,\n mutate(document) {\n return mutateCloseMetadata(document.metadata, {\n statusRegistry,\n force: options.force,\n options,\n duplicateOf,\n validateCloseMode,\n activeChildIds,\n closeReason,\n });\n },\n });\n\n return {\n item: toItemRecord(result.item),\n changed_fields: result.changedFields,\n warnings: [\n ...result.warnings,\n ...(await autoUnblockResolvedDependents(pmRoot, settings, located.id, author, statusRegistry)),\n ],\n };\n}\n"],"names":[],"mappings":"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","debugId":"19dbc992-675b-554c-83bd-4aa14b766810"}
1
+ {"version":3,"file":"close.js","sources":["cli/commands/close.ts"],"sourceRoot":"/","sourcesContent":["/**\n * @module cli/commands/close\n *\n * Implements the pm close command surface and its agent-facing runtime behavior.\n */\nimport { pathExists } from \"../../core/fs/fs-utils.js\";\nimport { collectBlockedByIds } from \"../../core/item/actionability.js\";\nimport { toItemRecord } from \"../../core/item/item-record.js\";\nimport { isTerminalStatus } from \"../../core/item/status.js\";\nimport { resolveItemTypeRegistry } from \"../../core/item/type-registry.js\";\nimport { resolveRuntimeStatusRegistry, type RuntimeStatusRegistry } from \"../../core/schema/runtime-schema.js\";\nimport { EXIT_CODE } from \"../../core/shared/constants.js\";\nimport type { GlobalOptions } from \"../../core/shared/command-types.js\";\nimport { PmCliError } from \"../../core/shared/errors.js\";\nimport {\n buildItemNotFoundError,\n listAllFrontMatterLight,\n locateItem,\n mutateItem,\n readLocatedItem,\n} from \"../../core/store/item-store.js\";\nimport { getSettingsPath, resolvePmRoot } from \"../../core/store/paths.js\";\nimport { readSettings } from \"../../core/store/settings.js\";\nimport type { ItemFrontMatter } from \"../../types/index.js\";\n\n/**\n * Documents the close command options payload exchanged by command, SDK, and package integrations.\n */\nexport interface CloseCommandOptions {\n author?: string;\n message?: string;\n validateClose?: string;\n force?: boolean;\n // pm-fl0c #11 (2026-05-28): allow setting the three closure validation\n // fields inline on `pm close` so agents do not have to issue a prior\n // `pm update` just to satisfy --validate-close warn|strict. These map 1:1\n // to ItemFrontMatter.{resolution,expected_result,actual_result}.\n resolution?: string;\n expectedResult?: string;\n actualResult?: string;\n duplicateOf?: string;\n}\n\n/**\n * Documents the close result payload exchanged by command, SDK, and package integrations.\n */\nexport interface CloseResult {\n item: Record<string, unknown>;\n changed_fields: string[];\n warnings: string[];\n}\n\ninterface AutoUnblockCandidate {\n id: string;\n blocker_ids: string[];\n}\n\ntype CloseInlineFieldKey = \"resolution\" | \"expected_result\" | \"actual_result\";\n\ninterface CloseMutationContext {\n statusRegistry: RuntimeStatusRegistry;\n force: boolean | undefined;\n options: CloseCommandOptions;\n duplicateOf: string | undefined;\n validateCloseMode: ValidateCloseMode;\n activeChildIds: string[];\n closeReason: string | undefined;\n closedAt: string;\n}\n\nfunction toAuthor(candidate: string | undefined, defaultAuthor: string): string {\n const resolved = candidate ?? process.env.PM_AUTHOR ?? defaultAuthor;\n const trimmed = resolved.trim();\n return trimmed || \"unknown\";\n}\n\nfunction normalizeCloseReason(reasonText: string | undefined, required: boolean): string | undefined {\n const reason = (reasonText ?? \"\").trim();\n if (reason.length > 0) {\n return reason;\n }\n if (required) {\n throw new PmCliError(\n \"Close reason text is required because governance.require_close_reason is enabled\",\n EXIT_CODE.USAGE,\n {\n code: \"close_reason_required\",\n required: \"Provide a one-line closing summary as the positional text, --reason, or --message.\",\n why: \"governance.require_close_reason is enabled, so every close must record why the item is done.\",\n examples: [\n 'pm close <id> \"Done: <what changed and why>\"',\n 'pm close <id> --reason \"<closing summary>\"',\n 'pm close <id> -m \"<closing summary>\"',\n \"pm close <id> --duplicate-of <canonical-id>\",\n ],\n nextSteps: [\n \"Re-run the close with a closing summary.\",\n 'When closing as a duplicate, --duplicate-of <id> auto-fills the close reason as \"Duplicate of <id>\".',\n \"To stop requiring reasons, run: pm config set governance-require-close-reason --policy disabled\",\n ],\n },\n );\n }\n return undefined;\n}\n\ntype ValidateCloseMode = \"off\" | \"warn\" | \"strict\";\n\ninterface CloseReasonFallbackInput {\n closeReasonText: string | undefined;\n duplicateOf: string | undefined;\n resolution: string | undefined;\n message: string | undefined;\n requireCloseReason: boolean;\n}\n\nfunction resolveEffectiveCloseReasonText(input: CloseReasonFallbackInput): string | undefined {\n if ((input.closeReasonText ?? \"\").trim().length > 0) {\n return input.closeReasonText;\n }\n if (input.duplicateOf !== undefined) {\n return `Duplicate of ${input.duplicateOf}`;\n }\n const trimmedResolution = typeof input.resolution === \"string\" ? input.resolution.trim() : \"\";\n if (trimmedResolution.length > 0) {\n return trimmedResolution;\n }\n const trimmedMessage = typeof input.message === \"string\" ? input.message.trim() : \"\";\n if (input.requireCloseReason && trimmedMessage.length > 0) {\n return trimmedMessage;\n }\n return input.closeReasonText;\n}\n\nconst CLOSE_VALIDATION_FIELDS: Array<{ key: keyof Pick<ItemFrontMatter, \"resolution\" | \"expected_result\" | \"actual_result\">; label: string }> = [\n { key: \"resolution\", label: \"resolution\" },\n { key: \"expected_result\", label: \"expected_result\" },\n { key: \"actual_result\", label: \"actual_result\" },\n];\n\nfunction parseValidateCloseMode(raw: string | undefined): ValidateCloseMode | undefined {\n if (raw === undefined) {\n return undefined;\n }\n const normalized = raw.trim().toLowerCase();\n if (normalized.length === 0 || normalized === \"warn\") {\n return \"warn\";\n }\n if (normalized === \"off\" || normalized === \"none\" || normalized === \"disabled\") {\n return \"off\";\n }\n if (normalized === \"strict\") {\n return \"strict\";\n }\n throw new PmCliError(`Invalid --validate-close mode \"${raw}\" (expected \"off\", \"warn\", or \"strict\")`, EXIT_CODE.USAGE);\n}\n\nfunction findMissingCloseValidationFields(frontMatter: ItemFrontMatter): string[] {\n const missing: string[] = [];\n for (const field of CLOSE_VALIDATION_FIELDS) {\n const rawValue = frontMatter[field.key];\n if (typeof rawValue !== \"string\" || rawValue.trim().length === 0) {\n missing.push(field.label);\n }\n }\n return missing;\n}\n\nasync function duplicateChainReferencesClosingItem(\n loadItemById: (id: string) => Promise<ItemFrontMatter | null>,\n initialDuplicateOf: unknown,\n closingId: string,\n): Promise<boolean> {\n const visited = new Set<string>();\n let current = initialDuplicateOf;\n while (typeof current === \"string\" && current.trim().length > 0) {\n const currentId = current.trim();\n if (currentId === closingId) {\n return true;\n }\n if (visited.has(currentId)) {\n return false;\n }\n visited.add(currentId);\n current = (await loadItemById(currentId))?.duplicate_of;\n }\n return false;\n}\n\nfunction shouldApplyDuplicateFallback(value: unknown): boolean {\n return typeof value !== \"string\" || value.trim().length === 0;\n}\n\nasync function assertDuplicateTargetExists(\n pmRoot: string,\n settings: Awaited<ReturnType<typeof readSettings>>,\n duplicateOf: string | undefined,\n closingId: string,\n): Promise<string | undefined> {\n const rawTarget = duplicateOf?.trim();\n if (!rawTarget) {\n return undefined;\n }\n if (rawTarget === closingId) {\n throw new PmCliError(\"An item cannot be closed as a duplicate of itself.\", EXIT_CODE.USAGE, {\n code: \"duplicate_target_self\",\n why: \"--duplicate-of must identify the canonical item that should remain open or already represent the work.\",\n });\n }\n const typeRegistry = resolveItemTypeRegistry(settings);\n const itemCache = new Map<string, ItemFrontMatter | null>();\n const loadItemById = async (id: string): Promise<ItemFrontMatter | null> => {\n if (itemCache.has(id)) {\n return itemCache.get(id) ?? null;\n }\n const located = await locateItem(pmRoot, id, settings.id_prefix, settings.item_format, typeRegistry.type_to_folder);\n if (!located) {\n itemCache.set(id, null);\n return null;\n }\n const { document } = await readLocatedItem(located, { schema: settings.schema });\n itemCache.set(id, document.metadata);\n return document.metadata;\n };\n const target = await loadItemById(rawTarget);\n if (!target) {\n throw new PmCliError(`Duplicate target \"${rawTarget}\" was not found. Create or locate the canonical item first.`, EXIT_CODE.USAGE, {\n code: \"duplicate_target_missing\",\n why: \"Duplicate closure should point at a real canonical pm item so future dedupe and changelog tooling can trace the relationship.\",\n examples: [`pm close ${closingId} \"Duplicate of ${rawTarget}\" --duplicate-of ${rawTarget}`],\n nextSteps: [\"Run pm search/list to find the canonical item, then retry with --duplicate-of <id>.\"],\n });\n }\n if (await duplicateChainReferencesClosingItem(loadItemById, target.duplicate_of, closingId)) {\n throw new PmCliError(`Circular duplicate reference detected. Target \"${rawTarget}\" points back to \"${closingId}\".`, EXIT_CODE.USAGE, {\n code: \"duplicate_target_circular\",\n why: \"Circular duplicate relationships create loops for dedupe and status propagation tooling.\",\n nextSteps: [\"Choose the existing canonical item, or clear the target duplicate_of metadata before closing this item as a duplicate.\"],\n });\n }\n if (typeof target.duplicate_of === \"string\" && target.duplicate_of.trim().length > 0) {\n throw new PmCliError(`Duplicate target \"${rawTarget}\" is already marked as a duplicate of \"${target.duplicate_of.trim()}\".`, EXIT_CODE.USAGE, {\n code: \"duplicate_target_is_duplicate\",\n why: \"Duplicate closure should point directly at the canonical item, not another duplicate.\",\n examples: [`pm close ${closingId} \"Duplicate of ${target.duplicate_of.trim()}\" --duplicate-of ${target.duplicate_of.trim()}`],\n nextSteps: [\"Use the canonical item referenced by duplicate_of as the --duplicate-of target.\"],\n });\n }\n return target.id;\n}\n\nasync function findActiveChildIds(\n pmRoot: string,\n settings: Awaited<ReturnType<typeof readSettings>>,\n parentId: string,\n statusRegistry: RuntimeStatusRegistry,\n): Promise<string[]> {\n const typeRegistry = resolveItemTypeRegistry(settings);\n const items = await listAllFrontMatterLight(\n pmRoot,\n settings.item_format,\n typeRegistry.type_to_folder,\n undefined,\n settings.schema,\n );\n return items\n .filter((item) => item.parent === parentId && !isTerminalStatus(item.status, statusRegistry))\n .map((item) => item.id)\n .sort((left, right) => left.localeCompare(right));\n}\n\nasync function findAutoUnblockCandidates(\n pmRoot: string,\n settings: Awaited<ReturnType<typeof readSettings>>,\n closedId: string,\n statusRegistry: RuntimeStatusRegistry,\n): Promise<AutoUnblockCandidate[]> {\n const typeRegistry = resolveItemTypeRegistry(settings);\n const items = await listAllFrontMatterLight(\n pmRoot,\n settings.item_format,\n typeRegistry.type_to_folder,\n undefined,\n settings.schema,\n );\n const itemsById = new Map(items.map((item) => [item.id, item]));\n const blockedStatuses = statusRegistry.blocked_statuses;\n return items\n .filter((item) => blockedStatuses.has(item.status))\n .map((item) => ({ item, blockerIds: collectBlockedByIds(item) }))\n .filter(({ blockerIds }) => blockerIds.includes(closedId))\n .filter(({ blockerIds }) =>\n blockerIds.every((blockerId) => {\n const blocker = itemsById.get(blockerId);\n return blocker !== undefined && isTerminalStatus(blocker.status, statusRegistry);\n }),\n )\n .map(({ item, blockerIds }) => ({ id: item.id, blocker_ids: blockerIds }))\n .sort((left, right) => left.id.localeCompare(right.id));\n}\n\nasync function autoUnblockResolvedDependents(\n pmRoot: string,\n settings: Awaited<ReturnType<typeof readSettings>>,\n closedId: string,\n author: string,\n statusRegistry: RuntimeStatusRegistry,\n): Promise<string[]> {\n const candidates = await findAutoUnblockCandidates(pmRoot, settings, closedId, statusRegistry);\n const warnings: string[] = [];\n for (const candidate of candidates) {\n try {\n const unblocked = await mutateItem({\n pmRoot,\n settings,\n id: candidate.id,\n op: \"update\",\n author,\n message: `Auto-unblocked after blocker ${closedId} closed`,\n mutate(document) {\n /* c8 ignore start -- normal auto-unblock candidates carry dependency metadata; fallback preserves hand-edited scalar-only blockers. */\n const dependencies = document.metadata.dependencies ?? [];\n /* c8 ignore stop */\n const remainingDependencies = dependencies.filter((dependency) => {\n const dependencyId = dependency.id.trim();\n return dependency.kind !== \"blocked_by\" || !candidate.blocker_ids.includes(dependencyId);\n });\n document.metadata.status = statusRegistry.open_status;\n delete document.metadata.blocked_by;\n delete document.metadata.blocked_reason;\n document.metadata.unblock_note = `Auto-unblocked after blocker ${closedId} closed; all blockers resolved (${candidate.blocker_ids.join(\", \")}).`;\n if (remainingDependencies.length > 0) {\n document.metadata.dependencies = remainingDependencies;\n } else {\n delete document.metadata.dependencies;\n }\n const changedFields = [\"status\", \"blocked_by\", \"blocked_reason\", \"unblock_note\"];\n if (remainingDependencies.length !== dependencies.length) {\n changedFields.push(\"dependencies\");\n }\n return {\n changedFields,\n };\n },\n });\n warnings.push(`auto_unblocked:${unblocked.item.id}:resolved_blockers=${candidate.blocker_ids.join(\",\")}`);\n /* c8 ignore start -- defensive fan-out failure path; normal lock/claim state is auditable and still unblocks. */\n } catch (error) {\n const reason = error instanceof Error ? error.message.replace(/\\s+/g, \" \").trim() : \"unknown\";\n warnings.push(`auto_unblock_failed:${candidate.id}:${reason}`);\n }\n /* c8 ignore stop */\n }\n return warnings;\n}\n\nfunction applyInlineCloseFields(metadata: ItemFrontMatter, options: CloseCommandOptions): CloseInlineFieldKey[] {\n const changedFields: CloseInlineFieldKey[] = [];\n const inlineCloseFields: Array<{ option: string | undefined; key: CloseInlineFieldKey }> = [\n { option: options.resolution, key: \"resolution\" },\n { option: options.expectedResult, key: \"expected_result\" },\n { option: options.actualResult, key: \"actual_result\" },\n ];\n for (const { option, key } of inlineCloseFields) {\n if (typeof option !== \"string\") {\n continue;\n }\n const trimmed = option.trim();\n if (trimmed.length === 0) {\n continue;\n }\n metadata[key] = trimmed;\n changedFields.push(key);\n }\n return changedFields;\n}\n\nfunction applyDuplicateCloseMetadata(metadata: ItemFrontMatter, duplicateOf: string | undefined): CloseInlineFieldKey[] {\n if (duplicateOf === undefined) {\n return [];\n }\n metadata.duplicate_of = duplicateOf;\n const duplicateFallbackFields: CloseInlineFieldKey[] = [];\n const fallbackValues: Array<{ key: CloseInlineFieldKey; value: string }> = [\n { key: \"resolution\", value: `Duplicate of ${duplicateOf}` },\n { key: \"expected_result\", value: `Canonical item ${duplicateOf} tracks the work.` },\n { key: \"actual_result\", value: `Closed as duplicate of ${duplicateOf}.` },\n ];\n for (const { key, value } of fallbackValues) {\n if (shouldApplyDuplicateFallback(metadata[key])) {\n metadata[key] = value;\n duplicateFallbackFields.push(key);\n }\n }\n return duplicateFallbackFields;\n}\n\nfunction collectCloseValidationWarnings(\n metadata: ItemFrontMatter,\n validateCloseMode: ValidateCloseMode,\n activeChildIds: string[],\n): string[] {\n const warnings: string[] = [];\n if (validateCloseMode !== \"off\") {\n const missingFields = findMissingCloseValidationFields(metadata);\n if (missingFields.length > 0) {\n if (validateCloseMode === \"strict\") {\n throw new PmCliError(\n `Cannot close item ${metadata.id}: missing ${missingFields.join(\", \")}. Populate fields or use --validate-close warn.`,\n EXIT_CODE.USAGE,\n );\n }\n warnings.push(`close_validation_missing_fields:${metadata.id}:${missingFields.join(\",\")}`);\n }\n if (activeChildIds.length > 0) {\n if (validateCloseMode === \"strict\") {\n throw new PmCliError(\n `Cannot close item ${metadata.id}: active child items remain open (${activeChildIds.join(\", \")}). Close, cancel, or re-parent them first, or use --validate-close warn.`,\n EXIT_CODE.USAGE,\n );\n }\n warnings.push(`close_validation_active_children:${metadata.id}:${activeChildIds.join(\",\")}`);\n }\n return warnings;\n }\n if (activeChildIds.length > 0) {\n warnings.push(`closed_with_active_children:${metadata.id}:${activeChildIds.join(\",\")}`);\n }\n return warnings;\n}\n\nfunction applyCloseReason(metadata: ItemFrontMatter, closeReason: string | undefined): string[] {\n if (closeReason !== undefined) {\n metadata.close_reason = closeReason;\n return [\"close_reason\"];\n }\n if (metadata.close_reason !== undefined) {\n delete metadata.close_reason;\n return [\"close_reason\"];\n }\n return [];\n}\n\nfunction clearCloseAssignee(metadata: ItemFrontMatter): string[] {\n if (metadata.assignee === undefined) {\n return [];\n }\n delete metadata.assignee;\n return [\"assignee\"];\n}\n\nfunction clearClosedBlockerSignals(metadata: ItemFrontMatter): { changedFields: string[]; warnings: string[] } {\n const previousBlockedBy = typeof metadata.blocked_by === \"string\" ? metadata.blocked_by.trim() : \"\";\n const existingDeps = metadata.dependencies ?? [];\n const blockedByEdge = existingDeps.find((dep) => dep.kind === \"blocked_by\");\n const hadBlockedReason = metadata.blocked_reason !== undefined;\n if (previousBlockedBy.length === 0 && blockedByEdge === undefined && !hadBlockedReason) {\n return { changedFields: [], warnings: [] };\n }\n const changedFields: string[] = [];\n if (previousBlockedBy.length > 0) {\n delete metadata.blocked_by;\n changedFields.push(\"blocked_by\");\n }\n if (hadBlockedReason) {\n delete metadata.blocked_reason;\n changedFields.push(\"blocked_reason\");\n }\n if (blockedByEdge !== undefined) {\n const remainingDeps = existingDeps.filter((dep) => dep.kind !== \"blocked_by\");\n if (remainingDeps.length > 0) {\n metadata.dependencies = remainingDeps;\n } else {\n delete metadata.dependencies;\n }\n changedFields.push(\"dependencies\");\n }\n // A stale reason-only close has no blocker identity; omit the blocker-clear warning instead of inventing one.\n const reportedBlocker = previousBlockedBy || blockedByEdge?.id;\n return {\n changedFields,\n warnings: reportedBlocker ? [`closed_cleared_blocked_by:${metadata.id}:${reportedBlocker}`] : [],\n };\n}\n\nfunction mutateCloseMetadata(metadata: ItemFrontMatter, context: CloseMutationContext): { changedFields: string[]; warnings?: string[] } {\n if (isTerminalStatus(metadata.status, context.statusRegistry) && !context.force) {\n throw new PmCliError(`Item ${metadata.id} is already terminal; use --force to close again.`, EXIT_CODE.CONFLICT);\n }\n const inlineChangedFields = applyInlineCloseFields(metadata, context.options);\n const duplicateFallbackFields = applyDuplicateCloseMetadata(metadata, context.duplicateOf);\n const mutationWarnings = collectCloseValidationWarnings(metadata, context.validateCloseMode, context.activeChildIds);\n metadata.status = context.statusRegistry.close_status;\n metadata.closed_at = context.closedAt;\n const changedFields = [\n \"status\",\n \"closed_at\",\n ...applyCloseReason(metadata, context.closeReason),\n ...inlineChangedFields,\n ];\n if (context.duplicateOf !== undefined) {\n changedFields.push(\"duplicate_of\");\n for (const key of duplicateFallbackFields) {\n /* v8 ignore start -- duplicate fallback keys are already pre-deduped by applyDuplicateCloseMetadata in covered close paths */\n if (!changedFields.includes(key)) {\n changedFields.push(key);\n }\n /* v8 ignore stop */\n }\n }\n changedFields.push(...clearCloseAssignee(metadata));\n const blockerCleanup = clearClosedBlockerSignals(metadata);\n changedFields.push(...blockerCleanup.changedFields);\n mutationWarnings.push(...blockerCleanup.warnings);\n return {\n changedFields,\n ...(mutationWarnings.length > 0 ? { warnings: mutationWarnings } : {}),\n };\n}\n\nexport const _testOnlyCloseCommand = {\n blockedByIds: collectBlockedByIds,\n};\n\n/**\n * Implements run close for the public runtime surface of this module.\n */\nexport async function runClose(\n id: string,\n closeReasonText: string | undefined,\n options: CloseCommandOptions,\n global: GlobalOptions,\n): Promise<CloseResult> {\n const pmRoot = resolvePmRoot(process.cwd(), global.path);\n if (!(await pathExists(getSettingsPath(pmRoot)))) {\n throw new PmCliError(`Tracker is not initialized at ${pmRoot}. Run pm init first.`, EXIT_CODE.NOT_FOUND);\n }\n\n const settings = await readSettings(pmRoot);\n const statusRegistry = resolveRuntimeStatusRegistry(settings.schema);\n const author = toAuthor(options.author, settings.author_default);\n // GH-250: verify the target item EXISTS before the governance close-reason\n // gate fires. Otherwise closing a typo'd id with no reason reports\n // \"Close reason text is required\" and hides the real cause (bad id) until a\n // reason is supplied. Existence is the more fundamental precondition, so it\n // is validated first regardless of whether a reason was provided.\n const typeToFolder = resolveItemTypeRegistry(settings).type_to_folder;\n const located = await locateItem(pmRoot, id, settings.id_prefix, settings.item_format, typeToFolder);\n if (!located) {\n throw await buildItemNotFoundError(pmRoot, id, settings.id_prefix, typeToFolder);\n }\n // GH-204: resolve the duplicate target BEFORE reason validation so\n // `pm close <id> --duplicate-of <canonical>` succeeds under\n // governance.require_close_reason without a manual reason — when no\n // positional/--reason text is provided the reason defaults to\n // \"Duplicate of <id>\" (mirroring the auto-filled closure metadata).\n // Explicit reason text still wins.\n const duplicateOf = await assertDuplicateTargetExists(pmRoot, settings, options.duplicateOf, id);\n // pm-7x8d / pm-9hry / GH-204: when no explicit positional/--reason text is given, derive\n // the close reason from the next-best closure signal instead of hard-blocking\n // under governance.require_close_reason. Precedence: explicit reason text >\n // --duplicate-of (\"Duplicate of <id>\") > --resolution summary > --message.\n // Resolution still writes metadata.resolution below; message still writes the\n // history entry through mutateItem. Reusing either as the close reason just lets\n // a single agent-authored close command succeed when it already supplied a\n // closure summary through another structured option.\n const effectiveCloseReasonText = resolveEffectiveCloseReasonText({\n closeReasonText,\n duplicateOf,\n resolution: options.resolution,\n message: options.message,\n requireCloseReason: settings.governance.require_close_reason,\n });\n const closeReason = normalizeCloseReason(effectiveCloseReasonText, settings.governance.require_close_reason);\n const validateCloseMode = parseValidateCloseMode(options.validateClose) ?? settings.governance.close_validation_default;\n // C3 (pm-fu5d): scan for active children even under minimal governance so\n // closing a parent is never silently orphaning — off mode emits an\n // informational note instead of the warn/strict validation warning.\n const activeChildIds = await findActiveChildIds(pmRoot, settings, id, statusRegistry);\n\n const result = await mutateItem({\n pmRoot,\n settings,\n id,\n op: \"close\",\n author,\n message: options.message,\n force: options.force,\n mutate(document) {\n return mutateCloseMetadata(document.metadata, {\n statusRegistry,\n force: options.force,\n options,\n duplicateOf,\n validateCloseMode,\n activeChildIds,\n closeReason,\n closedAt: new Date().toISOString(),\n });\n },\n });\n\n return {\n item: toItemRecord(result.item),\n changed_fields: result.changedFields,\n warnings: [\n ...result.warnings,\n ...(await autoUnblockResolvedDependents(pmRoot, settings, located.id, author, statusRegistry)),\n ],\n };\n}\n"],"names":[],"mappings":"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","debugId":"e37ebda3-1d83-5476-b2bf-d1cce94fe5d3"}
@@ -4,7 +4,7 @@
4
4
  * Implements the pm completion command surface and its agent-facing runtime behavior.
5
5
  */
6
6
 
7
- !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]="6aac8389-5103-50a6-98bd-fde0720289ba")}catch(e){}}();
7
+ !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]="470e1fde-dbda-54fe-b821-9175c37b1cd3")}catch(e){}}();
8
8
  import { EXIT_CODE } from "../../core/shared/constants.js";
9
9
  import { PmCliError } from "../../core/shared/errors.js";
10
10
  import { SCAFFOLD_CAPABILITIES } from "./extension/scaffold.js";
@@ -723,6 +723,8 @@ _pm() {
723
723
  '--priority[Filter by priority]:(0 1 2 3 4)' \\
724
724
  '--deadline-before[Filter by deadline upper bound (ISO/date string or relative)]:date' \\
725
725
  '--deadline-after[Filter by deadline lower bound (ISO/date string or relative)]:date' \\
726
+ '--today[Filter to items updated since local midnight today]' \\
727
+ '--recent[Filter to items updated in the last 7 days]' \\
726
728
  '--updated-after[Filter by updated_at lower bound (ISO/relative)]:timestamp' \\
727
729
  '--updated-before[Filter by updated_at upper bound (ISO/relative)]:timestamp' \\
728
730
  '--created-after[Filter by created_at lower bound (ISO/relative)]:timestamp' \\
@@ -1225,6 +1227,7 @@ ${zshSearchRuntimeFieldFlags} '--json[Output JSON]' \\
1225
1227
  _arguments \\
1226
1228
  '--action[Filter schema by tool action]:action' \\
1227
1229
  '--command[Scope output to one command (narrow-by-default)]:command' \\
1230
+ '--summary[Return compact command intent summary]' \\
1228
1231
  '--schema-only[Return schema-only payload]' \\
1229
1232
  '--flags-only[Return command flag contracts only]' \\
1230
1233
  '--availability-only[Return action availability only]' \\
@@ -1703,6 +1706,8 @@ for list_cmd in ${listCmds}
1703
1706
  complete -c pm -n "__fish_seen_subcommand_from $list_cmd" -l stream -d 'Emit line-delimited JSON rows (requires --json)'
1704
1707
  complete -c pm -n "__fish_seen_subcommand_from $list_cmd" -l deadline-before -d 'Filter by deadline upper bound (ISO/date string or relative)' -r
1705
1708
  complete -c pm -n "__fish_seen_subcommand_from $list_cmd" -l deadline-after -d 'Filter by deadline lower bound (ISO/date string or relative)' -r
1709
+ complete -c pm -n "__fish_seen_subcommand_from $list_cmd" -l today -d 'Filter to items updated since local midnight today'
1710
+ complete -c pm -n "__fish_seen_subcommand_from $list_cmd" -l recent -d 'Filter to items updated in the last 7 days'
1706
1711
  complete -c pm -n "__fish_seen_subcommand_from $list_cmd" -l updated-after -d 'Filter by updated_at lower bound (ISO/relative)' -r
1707
1712
  complete -c pm -n "__fish_seen_subcommand_from $list_cmd" -l updated-before -d 'Filter by updated_at upper bound (ISO/relative)' -r
1708
1713
  complete -c pm -n "__fish_seen_subcommand_from $list_cmd" -l created-after -d 'Filter by created_at lower bound (ISO/relative)' -r
@@ -2197,6 +2202,7 @@ complete -c pm -n '__fish_seen_subcommand_from activity' -l full -d 'Show full a
2197
2202
  complete -c pm -n '__fish_seen_subcommand_from activity' -l stream -d 'Emit line-delimited JSON rows'
2198
2203
  complete -c pm -n '__fish_seen_subcommand_from contracts' -l action -d 'Filter schema by tool action' -r
2199
2204
  complete -c pm -n '__fish_seen_subcommand_from contracts' -l command -d 'Scope output to one command (narrow-by-default)' -r
2205
+ complete -c pm -n '__fish_seen_subcommand_from contracts' -l summary -d 'Return compact command intent summary'
2200
2206
  complete -c pm -n '__fish_seen_subcommand_from contracts' -l schema-only -d 'Return schema-only payload'
2201
2207
  complete -c pm -n '__fish_seen_subcommand_from contracts' -l flags-only -d 'Return command flag contracts only'
2202
2208
  complete -c pm -n '__fish_seen_subcommand_from contracts' -l availability-only -d 'Return action availability only'
@@ -2553,4 +2559,4 @@ export function runCompletion(shell, itemTypes = [], tags = [], eagerTagExpansio
2553
2559
  };
2554
2560
  }
2555
2561
  //# sourceMappingURL=completion.js.map
2556
- //# debugId=6aac8389-5103-50a6-98bd-fde0720289ba
2562
+ //# debugId=470e1fde-dbda-54fe-b821-9175c37b1cd3