@unbrained/pm-cli 2026.5.18 → 2026.5.27

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 (369) hide show
  1. package/CHANGELOG.md +953 -472
  2. package/README.md +4 -11
  3. package/dist/cli/bootstrap-args.d.ts +18 -1
  4. package/dist/cli/bootstrap-args.js +143 -3
  5. package/dist/cli/bootstrap-args.js.map +1 -1
  6. package/dist/cli/commander-usage.js +147 -10
  7. package/dist/cli/commander-usage.js.map +1 -1
  8. package/dist/cli/commands/annotation-command.d.ts +49 -0
  9. package/dist/cli/commands/annotation-command.js +135 -0
  10. package/dist/cli/commands/annotation-command.js.map +1 -0
  11. package/dist/cli/commands/append.js +5 -8
  12. package/dist/cli/commands/append.js.map +1 -1
  13. package/dist/cli/commands/calendar.js +3 -6
  14. package/dist/cli/commands/calendar.js.map +1 -1
  15. package/dist/cli/commands/claim.js +15 -24
  16. package/dist/cli/commands/claim.js.map +1 -1
  17. package/dist/cli/commands/close.js +63 -10
  18. package/dist/cli/commands/close.js.map +1 -1
  19. package/dist/cli/commands/comments.d.ts +5 -0
  20. package/dist/cli/commands/comments.js +27 -117
  21. package/dist/cli/commands/comments.js.map +1 -1
  22. package/dist/cli/commands/completion.d.ts +2 -2
  23. package/dist/cli/commands/completion.js +203 -63
  24. package/dist/cli/commands/completion.js.map +1 -1
  25. package/dist/cli/commands/config.d.ts +1 -1
  26. package/dist/cli/commands/config.js +82 -4
  27. package/dist/cli/commands/config.js.map +1 -1
  28. package/dist/cli/commands/context.js +4 -10
  29. package/dist/cli/commands/context.js.map +1 -1
  30. package/dist/cli/commands/contracts.js +168 -36
  31. package/dist/cli/commands/contracts.js.map +1 -1
  32. package/dist/cli/commands/create.js +53 -313
  33. package/dist/cli/commands/create.js.map +1 -1
  34. package/dist/cli/commands/dedupe-audit.js +7 -4
  35. package/dist/cli/commands/dedupe-audit.js.map +1 -1
  36. package/dist/cli/commands/delete.d.ts +3 -0
  37. package/dist/cli/commands/delete.js +11 -9
  38. package/dist/cli/commands/delete.js.map +1 -1
  39. package/dist/cli/commands/docs.d.ts +2 -12
  40. package/dist/cli/commands/docs.js +8 -316
  41. package/dist/cli/commands/docs.js.map +1 -1
  42. package/dist/cli/commands/event-validation-messages.d.ts +3 -0
  43. package/dist/cli/commands/event-validation-messages.js +44 -0
  44. package/dist/cli/commands/event-validation-messages.js.map +1 -0
  45. package/dist/cli/commands/extension/bundled-catalog.d.ts +14 -0
  46. package/dist/cli/commands/extension/bundled-catalog.js +268 -0
  47. package/dist/cli/commands/extension/bundled-catalog.js.map +1 -0
  48. package/dist/cli/commands/extension/doctor.d.ts +31 -0
  49. package/dist/cli/commands/extension/doctor.js +345 -0
  50. package/dist/cli/commands/extension/doctor.js.map +1 -0
  51. package/dist/cli/commands/extension/install-sources.d.ts +37 -0
  52. package/dist/cli/commands/extension/install-sources.js +384 -0
  53. package/dist/cli/commands/extension/install-sources.js.map +1 -0
  54. package/dist/cli/commands/extension/managed-state.d.ts +48 -0
  55. package/dist/cli/commands/extension/managed-state.js +172 -0
  56. package/dist/cli/commands/extension/managed-state.js.map +1 -0
  57. package/dist/cli/commands/extension/scaffold.d.ts +14 -0
  58. package/dist/cli/commands/extension/scaffold.js +169 -0
  59. package/dist/cli/commands/extension/scaffold.js.map +1 -0
  60. package/dist/cli/commands/extension/shared.d.ts +14 -0
  61. package/dist/cli/commands/extension/shared.js +106 -0
  62. package/dist/cli/commands/extension/shared.js.map +1 -0
  63. package/dist/cli/commands/extension.d.ts +37 -68
  64. package/dist/cli/commands/extension.js +157 -1319
  65. package/dist/cli/commands/extension.js.map +1 -1
  66. package/dist/cli/commands/files.d.ts +1 -12
  67. package/dist/cli/commands/files.js +14 -318
  68. package/dist/cli/commands/files.js.map +1 -1
  69. package/dist/cli/commands/gc.js +17 -4
  70. package/dist/cli/commands/gc.js.map +1 -1
  71. package/dist/cli/commands/get.d.ts +3 -2
  72. package/dist/cli/commands/get.js +52 -9
  73. package/dist/cli/commands/get.js.map +1 -1
  74. package/dist/cli/commands/health.d.ts +10 -0
  75. package/dist/cli/commands/health.js +269 -76
  76. package/dist/cli/commands/health.js.map +1 -1
  77. package/dist/cli/commands/history-redact.d.ts +8 -0
  78. package/dist/cli/commands/history-redact.js +35 -113
  79. package/dist/cli/commands/history-redact.js.map +1 -1
  80. package/dist/cli/commands/history-repair.d.ts +33 -0
  81. package/dist/cli/commands/history-repair.js +172 -0
  82. package/dist/cli/commands/history-repair.js.map +1 -0
  83. package/dist/cli/commands/history.d.ts +4 -4
  84. package/dist/cli/commands/history.js +10 -88
  85. package/dist/cli/commands/history.js.map +1 -1
  86. package/dist/cli/commands/index.d.ts +3 -1
  87. package/dist/cli/commands/index.js +5 -3
  88. package/dist/cli/commands/index.js.map +1 -1
  89. package/dist/cli/commands/init.d.ts +28 -0
  90. package/dist/cli/commands/init.js +23 -2
  91. package/dist/cli/commands/init.js.map +1 -1
  92. package/dist/cli/commands/learnings.js +20 -119
  93. package/dist/cli/commands/learnings.js.map +1 -1
  94. package/dist/cli/commands/legacy-none-tokens.d.ts +3 -0
  95. package/dist/cli/commands/legacy-none-tokens.js +39 -0
  96. package/dist/cli/commands/legacy-none-tokens.js.map +1 -0
  97. package/dist/cli/commands/linked-artifacts.d.ts +96 -0
  98. package/dist/cli/commands/linked-artifacts.js +335 -0
  99. package/dist/cli/commands/linked-artifacts.js.map +1 -0
  100. package/dist/cli/commands/linked-test-entry.d.ts +3 -0
  101. package/dist/cli/commands/linked-test-entry.js +62 -0
  102. package/dist/cli/commands/linked-test-entry.js.map +1 -0
  103. package/dist/cli/commands/linked-test-parsers.d.ts +28 -0
  104. package/dist/cli/commands/linked-test-parsers.js +192 -0
  105. package/dist/cli/commands/linked-test-parsers.js.map +1 -0
  106. package/dist/cli/commands/list.js +49 -24
  107. package/dist/cli/commands/list.js.map +1 -1
  108. package/dist/cli/commands/normalize.js +4 -3
  109. package/dist/cli/commands/normalize.js.map +1 -1
  110. package/dist/cli/commands/notes.js +20 -119
  111. package/dist/cli/commands/notes.js.map +1 -1
  112. package/dist/cli/commands/plan.d.ts +3 -0
  113. package/dist/cli/commands/plan.js +184 -22
  114. package/dist/cli/commands/plan.js.map +1 -1
  115. package/dist/cli/commands/recurrence-parsers.d.ts +26 -0
  116. package/dist/cli/commands/recurrence-parsers.js +98 -0
  117. package/dist/cli/commands/recurrence-parsers.js.map +1 -0
  118. package/dist/cli/commands/restore.js +24 -56
  119. package/dist/cli/commands/restore.js.map +1 -1
  120. package/dist/cli/commands/schema.d.ts +31 -0
  121. package/dist/cli/commands/schema.js +98 -0
  122. package/dist/cli/commands/schema.js.map +1 -0
  123. package/dist/cli/commands/search.js +154 -42
  124. package/dist/cli/commands/search.js.map +1 -1
  125. package/dist/cli/commands/templates.d.ts +4 -0
  126. package/dist/cli/commands/templates.js +89 -17
  127. package/dist/cli/commands/templates.js.map +1 -1
  128. package/dist/cli/commands/test/linked-command-detection.d.ts +37 -0
  129. package/dist/cli/commands/test/linked-command-detection.js +200 -0
  130. package/dist/cli/commands/test/linked-command-detection.js.map +1 -0
  131. package/dist/cli/commands/test-all.js +4 -8
  132. package/dist/cli/commands/test-all.js.map +1 -1
  133. package/dist/cli/commands/test.d.ts +2 -2
  134. package/dist/cli/commands/test.js +12 -357
  135. package/dist/cli/commands/test.js.map +1 -1
  136. package/dist/cli/commands/update-many.js +6 -9
  137. package/dist/cli/commands/update-many.js.map +1 -1
  138. package/dist/cli/commands/update.js +167 -401
  139. package/dist/cli/commands/update.js.map +1 -1
  140. package/dist/cli/commands/validate.d.ts +3 -1
  141. package/dist/cli/commands/validate.js +23 -71
  142. package/dist/cli/commands/validate.js.map +1 -1
  143. package/dist/cli/error-guidance.d.ts +1 -0
  144. package/dist/cli/error-guidance.js +100 -6
  145. package/dist/cli/error-guidance.js.map +1 -1
  146. package/dist/cli/extension-command-help.d.ts +0 -1
  147. package/dist/cli/extension-command-help.js +2 -13
  148. package/dist/cli/extension-command-help.js.map +1 -1
  149. package/dist/cli/extension-command-options.d.ts +1 -0
  150. package/dist/cli/extension-command-options.js +106 -7
  151. package/dist/cli/extension-command-options.js.map +1 -1
  152. package/dist/cli/help-content.d.ts +0 -1
  153. package/dist/cli/help-content.js +13 -9
  154. package/dist/cli/help-content.js.map +1 -1
  155. package/dist/cli/help-json-payload.d.ts +1 -0
  156. package/dist/cli/help-json-payload.js +33 -3
  157. package/dist/cli/help-json-payload.js.map +1 -1
  158. package/dist/cli/main.d.ts +11 -0
  159. package/dist/cli/main.js +109 -55
  160. package/dist/cli/main.js.map +1 -1
  161. package/dist/cli/register-list-query.d.ts +5 -2
  162. package/dist/cli/register-list-query.js +254 -192
  163. package/dist/cli/register-list-query.js.map +1 -1
  164. package/dist/cli/register-mutation.d.ts +1 -1
  165. package/dist/cli/register-mutation.js +247 -64
  166. package/dist/cli/register-mutation.js.map +1 -1
  167. package/dist/cli/register-operations.js +17 -12
  168. package/dist/cli/register-operations.js.map +1 -1
  169. package/dist/cli/register-setup.js +33 -16
  170. package/dist/cli/register-setup.js.map +1 -1
  171. package/dist/cli/registration-helpers.d.ts +0 -2
  172. package/dist/cli/registration-helpers.js +14 -40
  173. package/dist/cli/registration-helpers.js.map +1 -1
  174. package/dist/cli.js +25 -4
  175. package/dist/cli.js.map +1 -1
  176. package/dist/core/config/positional-value.d.ts +44 -0
  177. package/dist/core/config/positional-value.js +109 -0
  178. package/dist/core/config/positional-value.js.map +1 -0
  179. package/dist/core/extensions/extension-capability-aliases.d.ts +14 -0
  180. package/dist/core/extensions/extension-capability-aliases.js +159 -0
  181. package/dist/core/extensions/extension-capability-aliases.js.map +1 -0
  182. package/dist/core/extensions/extension-hook-runtime.d.ts +13 -0
  183. package/dist/core/extensions/extension-hook-runtime.js +414 -0
  184. package/dist/core/extensions/extension-hook-runtime.js.map +1 -0
  185. package/dist/core/extensions/extension-policy.d.ts +69 -0
  186. package/dist/core/extensions/extension-policy.js +481 -0
  187. package/dist/core/extensions/extension-policy.js.map +1 -0
  188. package/dist/core/extensions/extension-registries.d.ts +8 -0
  189. package/dist/core/extensions/extension-registries.js +52 -0
  190. package/dist/core/extensions/extension-registries.js.map +1 -0
  191. package/dist/core/extensions/extension-runtime-helpers.d.ts +6 -0
  192. package/dist/core/extensions/extension-runtime-helpers.js +29 -0
  193. package/dist/core/extensions/extension-runtime-helpers.js.map +1 -0
  194. package/dist/core/extensions/extension-types.d.ts +13 -39
  195. package/dist/core/extensions/extension-types.js +34 -2
  196. package/dist/core/extensions/extension-types.js.map +1 -1
  197. package/dist/core/extensions/index.d.ts +7 -1
  198. package/dist/core/extensions/index.js +11 -14
  199. package/dist/core/extensions/index.js.map +1 -1
  200. package/dist/core/extensions/loader.d.ts +4 -22
  201. package/dist/core/extensions/loader.js +23 -1146
  202. package/dist/core/extensions/loader.js.map +1 -1
  203. package/dist/core/fs/path-utils.d.ts +1 -0
  204. package/dist/core/fs/path-utils.js +12 -0
  205. package/dist/core/fs/path-utils.js.map +1 -0
  206. package/dist/core/history/drift-scan.d.ts +22 -0
  207. package/dist/core/history/drift-scan.js +149 -0
  208. package/dist/core/history/drift-scan.js.map +1 -0
  209. package/dist/core/history/history-rewrite.d.ts +43 -0
  210. package/dist/core/history/history-rewrite.js +48 -0
  211. package/dist/core/history/history-rewrite.js.map +1 -0
  212. package/dist/core/history/history.js +5 -4
  213. package/dist/core/history/history.js.map +1 -1
  214. package/dist/core/history/replay.d.ts +82 -0
  215. package/dist/core/history/replay.js +250 -0
  216. package/dist/core/history/replay.js.map +1 -0
  217. package/dist/core/item/item-format.js +11 -8
  218. package/dist/core/item/item-format.js.map +1 -1
  219. package/dist/core/item/item-record.d.ts +19 -0
  220. package/dist/core/item/item-record.js +24 -0
  221. package/dist/core/item/item-record.js.map +1 -0
  222. package/dist/core/item/item-type-definition.d.ts +52 -0
  223. package/dist/core/item/item-type-definition.js +123 -0
  224. package/dist/core/item/item-type-definition.js.map +1 -0
  225. package/dist/core/item/parse.js +3 -2
  226. package/dist/core/item/parse.js.map +1 -1
  227. package/dist/core/item/priority.d.ts +23 -0
  228. package/dist/core/item/priority.js +55 -0
  229. package/dist/core/item/priority.js.map +1 -0
  230. package/dist/core/item/status.d.ts +14 -1
  231. package/dist/core/item/status.js +22 -2
  232. package/dist/core/item/status.js.map +1 -1
  233. package/dist/core/item/toon-decode.d.ts +19 -0
  234. package/dist/core/item/toon-decode.js +69 -0
  235. package/dist/core/item/toon-decode.js.map +1 -0
  236. package/dist/core/item/type-registry.js +13 -84
  237. package/dist/core/item/type-registry.js.map +1 -1
  238. package/dist/core/output/mutation-projection.d.ts +31 -0
  239. package/dist/core/output/mutation-projection.js +103 -0
  240. package/dist/core/output/mutation-projection.js.map +1 -0
  241. package/dist/core/output/output.d.ts +2 -0
  242. package/dist/core/output/output.js +5 -3
  243. package/dist/core/output/output.js.map +1 -1
  244. package/dist/core/packages/manifest.js +3 -9
  245. package/dist/core/packages/manifest.js.map +1 -1
  246. package/dist/core/schema/item-types-file.d.ts +85 -0
  247. package/dist/core/schema/item-types-file.js +243 -0
  248. package/dist/core/schema/item-types-file.js.map +1 -0
  249. package/dist/core/schema/runtime-schema.d.ts +2 -1
  250. package/dist/core/schema/runtime-schema.js +17 -45
  251. package/dist/core/schema/runtime-schema.js.map +1 -1
  252. package/dist/core/search/semantic-defaults.js +3 -3
  253. package/dist/core/search/semantic-defaults.js.map +1 -1
  254. package/dist/core/search/vector-stores.js +46 -9
  255. package/dist/core/search/vector-stores.js.map +1 -1
  256. package/dist/core/sentry/helpers.d.ts +1 -1
  257. package/dist/core/sentry/helpers.js +20 -3
  258. package/dist/core/sentry/helpers.js.map +1 -1
  259. package/dist/core/shared/author.d.ts +1 -0
  260. package/dist/core/shared/author.js +9 -0
  261. package/dist/core/shared/author.js.map +1 -0
  262. package/dist/core/shared/command-types.d.ts +1 -0
  263. package/dist/core/shared/command-types.js +2 -2
  264. package/dist/core/shared/command-types.js.map +1 -1
  265. package/dist/core/shared/constants.d.ts +10 -1
  266. package/dist/core/shared/constants.js +56 -58
  267. package/dist/core/shared/constants.js.map +1 -1
  268. package/dist/core/shared/lazy-module.d.ts +1 -0
  269. package/dist/core/shared/lazy-module.js +11 -0
  270. package/dist/core/shared/lazy-module.js.map +1 -0
  271. package/dist/core/shared/option-alias-visibility.d.ts +44 -0
  272. package/dist/core/shared/option-alias-visibility.js +76 -0
  273. package/dist/core/shared/option-alias-visibility.js.map +1 -0
  274. package/dist/core/shared/primitives.d.ts +23 -0
  275. package/dist/core/shared/primitives.js +39 -2
  276. package/dist/core/shared/primitives.js.map +1 -1
  277. package/dist/core/shared/text-normalization.d.ts +0 -1
  278. package/dist/core/shared/text-normalization.js +2 -5
  279. package/dist/core/shared/text-normalization.js.map +1 -1
  280. package/dist/core/store/front-matter-cache.d.ts +16 -2
  281. package/dist/core/store/front-matter-cache.js +99 -33
  282. package/dist/core/store/front-matter-cache.js.map +1 -1
  283. package/dist/core/store/item-store.d.ts +2 -0
  284. package/dist/core/store/item-store.js +76 -110
  285. package/dist/core/store/item-store.js.map +1 -1
  286. package/dist/core/store/settings-validator.d.ts +106 -0
  287. package/dist/core/store/settings-validator.js +279 -0
  288. package/dist/core/store/settings-validator.js.map +1 -0
  289. package/dist/core/store/settings.js +6 -343
  290. package/dist/core/store/settings.js.map +1 -1
  291. package/dist/core/telemetry/runtime.js +5 -3
  292. package/dist/core/telemetry/runtime.js.map +1 -1
  293. package/dist/mcp/server.js +138 -39
  294. package/dist/mcp/server.js.map +1 -1
  295. package/dist/sdk/cli-contracts/enum-contracts.d.ts +20 -0
  296. package/dist/sdk/cli-contracts/enum-contracts.js +156 -0
  297. package/dist/sdk/cli-contracts/enum-contracts.js.map +1 -0
  298. package/dist/sdk/cli-contracts/tool-option-contracts.d.ts +14 -0
  299. package/dist/sdk/cli-contracts/tool-option-contracts.js +243 -0
  300. package/dist/sdk/cli-contracts/tool-option-contracts.js.map +1 -0
  301. package/dist/sdk/cli-contracts/tool-parameter-tables.d.ts +11 -0
  302. package/dist/sdk/cli-contracts/tool-parameter-tables.js +901 -0
  303. package/dist/sdk/cli-contracts/tool-parameter-tables.js.map +1 -0
  304. package/dist/sdk/cli-contracts.d.ts +18 -33
  305. package/dist/sdk/cli-contracts.js +96 -1238
  306. package/dist/sdk/cli-contracts.js.map +1 -1
  307. package/dist/sdk/package-import-adapters.d.ts +74 -0
  308. package/dist/sdk/package-import-adapters.js +186 -0
  309. package/dist/sdk/package-import-adapters.js.map +1 -0
  310. package/dist/sdk/package-runtime-options.d.ts +26 -0
  311. package/dist/sdk/package-runtime-options.js +71 -0
  312. package/dist/sdk/package-runtime-options.js.map +1 -0
  313. package/dist/sdk/runtime.d.ts +27 -1
  314. package/dist/sdk/runtime.js +48 -3
  315. package/dist/sdk/runtime.js.map +1 -1
  316. package/dist/types.d.ts +6 -0
  317. package/dist/types.js +10 -2
  318. package/dist/types.js.map +1 -1
  319. package/docs/AGENT_GUIDE.md +13 -11
  320. package/docs/ARCHITECTURE.md +1 -1
  321. package/docs/CLAUDE_CODE_PLUGIN.md +5 -28
  322. package/docs/CODEX_PLUGIN.md +5 -5
  323. package/docs/COMMANDS.md +58 -9
  324. package/docs/CONFIGURATION.md +16 -1
  325. package/docs/EXTENSIONS.md +4 -63
  326. package/docs/RELEASING.md +12 -8
  327. package/docs/SDK.md +11 -2
  328. package/marketplace.json +7 -3
  329. package/package.json +18 -14
  330. package/packages/pm-beads/extensions/beads/index.js +2 -49
  331. package/packages/pm-beads/extensions/beads/index.ts +2 -54
  332. package/packages/pm-beads/extensions/beads/runtime-loader.js +86 -0
  333. package/packages/pm-beads/extensions/beads/runtime-loader.ts +88 -0
  334. package/packages/pm-beads/extensions/beads/runtime.js +26 -115
  335. package/packages/pm-beads/extensions/beads/runtime.ts +33 -132
  336. package/packages/pm-calendar/README.md +3 -1
  337. package/packages/pm-calendar/extensions/calendar/index.js +66 -2
  338. package/packages/pm-calendar/extensions/calendar/index.ts +71 -2
  339. package/packages/pm-calendar/extensions/calendar/runtime.js +1 -0
  340. package/packages/pm-calendar/extensions/calendar/runtime.ts +1 -0
  341. package/packages/pm-governance-audit/extensions/governance-audit/runtime.js +14 -41
  342. package/packages/pm-governance-audit/extensions/governance-audit/runtime.ts +25 -41
  343. package/packages/pm-guide-shell/extensions/guide-shell/runtime.js +10 -50
  344. package/packages/pm-guide-shell/extensions/guide-shell/runtime.ts +17 -50
  345. package/packages/pm-linked-test-adapters/extensions/linked-test-adapters/runtime.js +8 -40
  346. package/packages/pm-linked-test-adapters/extensions/linked-test-adapters/runtime.ts +10 -40
  347. package/packages/pm-search-advanced/README.md +8 -0
  348. package/packages/pm-search-advanced/extensions/search-advanced/index.js +75 -1
  349. package/packages/pm-search-advanced/extensions/search-advanced/index.ts +74 -0
  350. package/packages/pm-search-advanced/extensions/search-advanced/runtime.js +58 -33
  351. package/packages/pm-search-advanced/extensions/search-advanced/runtime.ts +60 -33
  352. package/packages/pm-templates/extensions/templates/runtime.js +11 -202
  353. package/packages/pm-templates/extensions/templates/runtime.ts +38 -230
  354. package/packages/pm-todos/extensions/todos/index.js +3 -50
  355. package/packages/pm-todos/extensions/todos/index.ts +3 -55
  356. package/packages/pm-todos/extensions/todos/runtime-loader.js +86 -0
  357. package/packages/pm-todos/extensions/todos/runtime-loader.ts +88 -0
  358. package/packages/pm-todos/extensions/todos/runtime.js +24 -117
  359. package/packages/pm-todos/extensions/todos/runtime.ts +32 -129
  360. package/plugins/pm-claude/README.md +2 -2
  361. package/plugins/pm-claude/commands/pm-planner.md +1 -15
  362. package/plugins/pm-claude/scripts/pm-mcp-server.mjs +5 -2
  363. package/plugins/pm-claude/skills/pm-planner/SKILL.md +3 -21
  364. package/plugins/pm-codex/scripts/pm-mcp-server.mjs +15 -6
  365. package/plugins/pm-codex/skills/pm-native/SKILL.md +1 -13
  366. package/PRD.md +0 -1734
  367. package/dist/core/output/command-aware.d.ts +0 -1
  368. package/dist/core/output/command-aware.js +0 -397
  369. package/dist/core/output/command-aware.js.map +0 -1
@@ -1,11 +1,14 @@
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]="98e2bc37-91cc-5340-b212-da1076fc5857")}catch(e){}}();
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]="94e19c77-3288-5a43-a8b2-6b9f15d4f234")}catch(e){}}();
3
3
  import { pathExists } from "../../core/fs/fs-utils.js";
4
4
  import { canonicalizeCommandOptionKey, commandOptionFlagLabel, resolveItemTypeRegistry, resolveCommandOptionPolicyState, resolveTypeDefinition, resolveTypeName, validateTypeOptions, } from "../../core/item/type-registry.js";
5
5
  import { normalizeItemId } from "../../core/item/id.js";
6
+ import { toItemRecord } from "../../core/item/item-record.js";
7
+ import { buildInvalidTypeError } from "../../core/schema/item-types-file.js";
6
8
  import { normalizeParentReferenceValue, validateMissingParentReference, } from "../../core/item/parent-reference-policy.js";
7
9
  import { validateSprintOrReleaseValue } from "../../core/item/sprint-release-format.js";
8
10
  import { createStdinTokenResolver, parseCsvKv, parseOptionalNumber, parseTags } from "../../core/item/parse.js";
11
+ import { resolvePriority } from "../../core/item/priority.js";
9
12
  import { normalizeStatusInput } from "../../core/item/status.js";
10
13
  import { collectRuntimeUpdateFieldValues } from "../../core/schema/runtime-field-values.js";
11
14
  import { resolveRuntimeFieldRegistry, resolveRuntimeStatusRegistry, } from "../../core/schema/runtime-schema.js";
@@ -19,9 +22,11 @@ import { getSettingsPath, resolvePmRoot } from "../../core/store/paths.js";
19
22
  import { readSettings } from "../../core/store/settings.js";
20
23
  import { runClose } from "./close.js";
21
24
  import { normalizeRiskInput, normalizeSeverityInput, parseConfidenceInput, parseRegressionInput, } from "./metadata-normalizers.js";
22
- import { DEPENDENCY_KIND_VALUES, ISSUE_SEVERITY_VALUES, RECURRENCE_FREQUENCY_VALUES, RECURRENCE_WEEKDAY_VALUES, RISK_VALUES, } from "../../types/index.js";
25
+ import { resolveEventEndAt } from "./event-validation-messages.js";
26
+ import { assertNoLegacyNoneToken, assertNoLegacyNoneTokens, isLegacyNoneToken } from "./legacy-none-tokens.js";
27
+ import { ensureEnumValue as ensureEnum, parseEventBoolean, parseRecurrenceRule } from "./recurrence-parsers.js";
28
+ import { DEPENDENCY_KIND_VALUES, ISSUE_SEVERITY_VALUES, RISK_VALUES, } from "../../types/index.js";
23
29
  import { parseDocs, parseFiles, parseLogSeed, parseTests } from "./create.js";
24
- const LEGACY_NONE_TOKENS = new Set(["none", "null"]);
25
30
  const UPDATE_UNSET_FIELD_DEFINITIONS = [
26
31
  { canonical: "tags", aliases: ["tags"], optionKey: "tags", frontMatterKey: "tags" },
27
32
  { canonical: "close-reason", aliases: ["close_reason", "close-reason"], optionKey: "closeReason", frontMatterKey: "close_reason" },
@@ -167,30 +172,6 @@ function toAuthor(candidate, defaultAuthor) {
167
172
  const trimmed = resolved.trim();
168
173
  return trimmed || "unknown";
169
174
  }
170
- function isLegacyNoneToken(value) {
171
- if (value === undefined) {
172
- return false;
173
- }
174
- return LEGACY_NONE_TOKENS.has(value.trim().toLowerCase());
175
- }
176
- function assertNoLegacyNoneToken(value, flag, replacementHint) {
177
- if (!isLegacyNoneToken(value)) {
178
- return;
179
- }
180
- const suffix = replacementHint ? ` ${replacementHint}` : "";
181
- throw new PmCliError(`${flag} no longer accepts "none" or "null".${suffix}`.trim(), EXIT_CODE.USAGE);
182
- }
183
- function assertNoLegacyNoneTokens(values, flag, replacementHint) {
184
- if (!values || values.length === 0) {
185
- return;
186
- }
187
- const hasLegacyToken = values.some((value) => isLegacyNoneToken(value));
188
- if (!hasLegacyToken) {
189
- return;
190
- }
191
- const suffix = replacementHint ? ` ${replacementHint}` : "";
192
- throw new PmCliError(`${flag} no longer accepts "none" or "null".${suffix}`.trim(), EXIT_CODE.USAGE);
193
- }
194
175
  const UPDATE_LEGACY_NONE_COLLECTION_NORMALIZERS = [
195
176
  { optionKey: "dep", clearFlagKey: "clearDeps", valueFlag: "--dep", clearFlag: "--clear-deps", disableReplaceFlagKey: "replaceDeps" },
196
177
  { optionKey: "comment", clearFlagKey: "clearComments", valueFlag: "--comment", clearFlag: "--clear-comments" },
@@ -478,12 +459,6 @@ function enforceAllowAuditUpdateScope(options, clearFrontMatterKeys) {
478
459
  throw new PmCliError(`--allow-audit-update only supports non-lifecycle metadata fields. Remove restricted options: ${disallowedFlags.join(", ")}`, EXIT_CODE.USAGE);
479
460
  }
480
461
  }
481
- function ensureEnum(value, allowed, label) {
482
- if (!allowed.includes(value)) {
483
- throw new PmCliError(`Invalid ${label} value "${value}"`, EXIT_CODE.USAGE);
484
- }
485
- return value;
486
- }
487
462
  function parseStatus(value, statusRegistry) {
488
463
  const normalized = normalizeStatusInput(value, statusRegistry);
489
464
  if (!normalized) {
@@ -492,16 +467,13 @@ function parseStatus(value, statusRegistry) {
492
467
  }
493
468
  return normalized;
494
469
  }
495
- function weekdayOrderIndex(value) {
496
- return RECURRENCE_WEEKDAY_VALUES.indexOf(value);
497
- }
498
470
  function parseReminderEntries(raw, nowValue) {
499
471
  return raw.map((entry) => {
500
472
  const kv = parseCsvKv(entry, "--reminder");
501
- const atRaw = kv.at?.trim();
502
- const textRaw = kv.text?.trim();
473
+ const atRaw = (kv.at ?? kv.date)?.trim();
474
+ const textRaw = (kv.text ?? kv.title)?.trim();
503
475
  if (!atRaw || !textRaw) {
504
- throw new PmCliError("--reminder requires at=<iso|relative> and text=<value>", EXIT_CODE.USAGE);
476
+ throw new PmCliError("--reminder requires at=<iso|relative> or date=<iso|relative>, plus text=<value> or title=<value>", EXIT_CODE.USAGE);
505
477
  }
506
478
  return {
507
479
  at: resolveIsoOrRelative(atRaw, nowValue, "reminder.at"),
@@ -509,75 +481,6 @@ function parseReminderEntries(raw, nowValue) {
509
481
  };
510
482
  });
511
483
  }
512
- function parseEventBoolean(value, flag) {
513
- const normalized = value.trim().toLowerCase();
514
- if (normalized === "true" || normalized === "1" || normalized === "yes") {
515
- return true;
516
- }
517
- if (normalized === "false" || normalized === "0" || normalized === "no") {
518
- return false;
519
- }
520
- throw new PmCliError(`${flag} must be one of true|false|1|0|yes|no`, EXIT_CODE.USAGE);
521
- }
522
- function parseDelimitedList(raw) {
523
- if (!raw) {
524
- return [];
525
- }
526
- return raw
527
- .split("|")
528
- .map((value) => value.trim())
529
- .filter((value) => value.length > 0);
530
- }
531
- function parseRecurrenceRule(kv, startAt, nowValue) {
532
- const freqRaw = kv.recur_freq?.trim();
533
- const intervalRaw = kv.recur_interval?.trim();
534
- const countRaw = kv.recur_count?.trim();
535
- const untilRaw = kv.recur_until?.trim();
536
- const byWeekdayRaw = kv.recur_by_weekday?.trim();
537
- const byMonthDayRaw = kv.recur_by_month_day?.trim();
538
- const exdatesRaw = kv.recur_exdates?.trim();
539
- const recurrenceInputsProvided = [freqRaw, intervalRaw, countRaw, untilRaw, byWeekdayRaw, byMonthDayRaw, exdatesRaw].some((value) => value !== undefined);
540
- if (!recurrenceInputsProvided) {
541
- return undefined;
542
- }
543
- if (!freqRaw) {
544
- throw new PmCliError("--event recurrence fields require recur_freq=<daily|weekly|monthly|yearly>", EXIT_CODE.USAGE);
545
- }
546
- const freq = ensureEnum(freqRaw.toLowerCase(), RECURRENCE_FREQUENCY_VALUES, "event recurrence frequency");
547
- const interval = intervalRaw ? parseOptionalNumber(intervalRaw, "event recur_interval") : undefined;
548
- if (interval !== undefined && (!Number.isInteger(interval) || interval < 1)) {
549
- throw new PmCliError("--event recur_interval must be an integer >= 1", EXIT_CODE.USAGE);
550
- }
551
- const count = countRaw ? parseOptionalNumber(countRaw, "event recur_count") : undefined;
552
- if (count !== undefined && (!Number.isInteger(count) || count < 1)) {
553
- throw new PmCliError("--event recur_count must be an integer >= 1", EXIT_CODE.USAGE);
554
- }
555
- const until = untilRaw ? resolveIsoOrRelative(untilRaw, nowValue, "event.recur_until") : undefined;
556
- if (until && until < startAt) {
557
- throw new PmCliError("--event recur_until must be at or after start", EXIT_CODE.USAGE);
558
- }
559
- const byWeekday = Array.from(new Set(parseDelimitedList(byWeekdayRaw)
560
- .map((value) => ensureEnum(value.toLowerCase(), RECURRENCE_WEEKDAY_VALUES, "event weekday")))).sort((left, right) => weekdayOrderIndex(left) -
561
- weekdayOrderIndex(right));
562
- const byMonthDay = Array.from(new Set(parseDelimitedList(byMonthDayRaw)
563
- .map((value) => {
564
- const day = parseOptionalNumber(value, "event recur_by_month_day");
565
- if (!Number.isInteger(day) || day < 1 || day > 31) {
566
- throw new PmCliError("--event recur_by_month_day values must be integers 1..31", EXIT_CODE.USAGE);
567
- }
568
- return day;
569
- }))).sort((left, right) => left - right);
570
- const exdates = Array.from(new Set(parseDelimitedList(exdatesRaw).map((value) => resolveIsoOrRelative(value, nowValue, "event.recur_exdates")))).sort((left, right) => left.localeCompare(right));
571
- return {
572
- freq,
573
- interval,
574
- count,
575
- until,
576
- by_weekday: byWeekday.length > 0 ? byWeekday : undefined,
577
- by_month_day: byMonthDay.length > 0 ? byMonthDay : undefined,
578
- exdates: exdates.length > 0 ? exdates : undefined,
579
- };
580
- }
581
484
  function parseEventEntries(raw, nowValue) {
582
485
  return raw.map((entry) => {
583
486
  const kv = parseCsvKv(entry, "--event");
@@ -587,10 +490,8 @@ function parseEventEntries(raw, nowValue) {
587
490
  }
588
491
  const startAt = resolveIsoOrRelative(startRaw, nowValue, "event.start");
589
492
  const endRaw = kv.end?.trim();
590
- const endAt = endRaw ? resolveIsoOrRelative(endRaw, nowValue, "event.end") : undefined;
591
- if (endAt && endAt <= startAt) {
592
- throw new PmCliError("--event end must be after start", EXIT_CODE.USAGE);
593
- }
493
+ const durationRaw = kv.duration?.trim();
494
+ const endAt = resolveEventEndAt(startAt, endRaw, durationRaw, nowValue);
594
495
  const titleRaw = kv.title;
595
496
  const descriptionRaw = kv.description;
596
497
  const locationRaw = kv.location;
@@ -612,7 +513,7 @@ function parseEventEntries(raw, nowValue) {
612
513
  throw new PmCliError("--event timezone must not be empty", EXIT_CODE.USAGE);
613
514
  }
614
515
  const allDayRaw = kv.all_day?.trim();
615
- const recurrence = parseRecurrenceRule(kv, startAt, nowValue);
516
+ const recurrence = parseRecurrenceRule(kv, startAt, nowValue, "truthy");
616
517
  return {
617
518
  start_at: startAt,
618
519
  end_at: endAt,
@@ -750,6 +651,63 @@ function parseDependencyRemovals(raw, prefix) {
750
651
  function dependencyKey(value) {
751
652
  return `${value.id}::${value.kind}::${value.source_kind ?? ""}`;
752
653
  }
654
+ // pm-kyd6: `--blocked-by` writes the `blocked_by` scalar, but the dependency
655
+ // graph (`pm deps`) is built only from the `dependencies` array. Mirror the
656
+ // behaviour create.ts already has so the metadata and the graph agree: a
657
+ // resolvable blocker also gets a `blocked_by` dependency edge, clearing the
658
+ // scalar removes that edge, and re-pointing it replaces the prior edge.
659
+ function reconcileBlockedByDependency(current, nextBlockedById, nowIsoValue, author) {
660
+ let next = [...(current ?? [])];
661
+ let changed = false;
662
+ const filtered = next.filter((dep) => dep.kind !== "blocked_by" || dep.id === nextBlockedById);
663
+ if (filtered.length !== next.length) {
664
+ next = filtered;
665
+ changed = true;
666
+ }
667
+ if (nextBlockedById && !next.some((dep) => dep.kind === "blocked_by" && dep.id === nextBlockedById)) {
668
+ next.push({ id: nextBlockedById, kind: "blocked_by", created_at: nowIsoValue, author });
669
+ changed = true;
670
+ }
671
+ if (!changed) {
672
+ return { dependencies: current, changed: false };
673
+ }
674
+ return { dependencies: next.length > 0 ? next : undefined, changed: true };
675
+ }
676
+ // pm-kyd6: resolve the --blocked-by target before the synchronous mutate
677
+ // callback so a real blocker can also become a `blocked_by` dependency edge.
678
+ // `id` is set when the target resolves; `unresolved` carries the raw value when
679
+ // --blocked-by points at an item that does not exist (the scalar is still set,
680
+ // mirroring create.ts and the never-block missing-parent behaviour, but the
681
+ // caller surfaces a warning so the metadata/graph mismatch is visible).
682
+ async function resolveBlockedByDependencyTarget(blockedByOption, blockedByCleared, pmRoot, idPrefix, itemFormat, typeToFolder) {
683
+ if (blockedByOption === undefined || blockedByCleared) {
684
+ return {};
685
+ }
686
+ const blockedByValue = blockedByOption.trim();
687
+ if (blockedByValue.length === 0) {
688
+ return {};
689
+ }
690
+ const located = await locateItem(pmRoot, normalizeItemId(blockedByValue, idPrefix), idPrefix, itemFormat, typeToFolder);
691
+ return located ? { id: located.id } : { unresolved: blockedByValue };
692
+ }
693
+ // pm-kyd6: apply the reconciled blocked_by dependency edge to the item metadata
694
+ // and record the `dependencies` change. Kept out of the mutate callback so the
695
+ // large runUpdate function stays under the static-quality complexity budget.
696
+ function applyBlockedByDependencyEdge(metadata, resolvedBlockedById, nowIsoValue, author, changedFields) {
697
+ const reconciled = reconcileBlockedByDependency(metadata.dependencies, resolvedBlockedById, nowIsoValue, author);
698
+ if (!reconciled.changed) {
699
+ return;
700
+ }
701
+ if (reconciled.dependencies === undefined) {
702
+ delete metadata.dependencies;
703
+ }
704
+ else {
705
+ metadata.dependencies = reconciled.dependencies;
706
+ }
707
+ if (!changedFields.includes("dependencies")) {
708
+ changedFields.push("dependencies");
709
+ }
710
+ }
753
711
  function fileKey(value) {
754
712
  return `${value.path}::${value.scope}`;
755
713
  }
@@ -772,11 +730,7 @@ function matchesDependencySelector(value, selector) {
772
730
  return true;
773
731
  }
774
732
  function ensurePriority(raw) {
775
- const parsed = parseOptionalNumber(raw, "priority (expected 0..4: 0=critical, 1=high, 2=medium, 3=low, 4=minimal)");
776
- if (![0, 1, 2, 3, 4].includes(parsed)) {
777
- throw new PmCliError("Priority must be 0..4 (0=critical, 1=high, 2=medium, 3=low, 4=minimal)", EXIT_CODE.USAGE);
778
- }
779
- return parsed;
733
+ return resolvePriority(raw);
780
734
  }
781
735
  function normalizeUpdatePolicyOptionKey(raw, typeName) {
782
736
  const canonical = canonicalizeCommandOptionKey("update", raw);
@@ -1134,6 +1088,13 @@ export async function runUpdate(id, options, global) {
1134
1088
  parentReferenceWarnings.push(...validateMissingParentReference(normalizedParentId, parentReferencePolicy).warnings);
1135
1089
  }
1136
1090
  }
1091
+ // pm-kyd6: resolve the --blocked-by target up front (async) so the sync
1092
+ // mutate callback can mirror create.ts and add a `blocked_by` dependency edge.
1093
+ const blockedByResolution = await resolveBlockedByDependencyTarget(options.blockedBy, clearFrontMatterKeys.has("blocked_by"), pmRoot, settings.id_prefix, settings.item_format, typeRegistry.type_to_folder);
1094
+ const resolvedBlockedByDependencyId = blockedByResolution.id;
1095
+ if (blockedByResolution.unresolved !== undefined) {
1096
+ parentReferenceWarnings.push(`blocked_by_unresolved:${blockedByResolution.unresolved}`);
1097
+ }
1137
1098
  const fieldFlags = {
1138
1099
  title: options.title !== undefined,
1139
1100
  description: options.description !== undefined,
@@ -1210,37 +1171,47 @@ export async function runUpdate(id, options, global) {
1210
1171
  }
1211
1172
  const { document } = await readLocatedItem(located, { schema: settings.schema });
1212
1173
  return {
1213
- item: document.metadata,
1174
+ item: toItemRecord(document.metadata),
1214
1175
  changed_fields: [],
1215
1176
  warnings: ["noop_no_update_fields"],
1216
1177
  };
1217
1178
  }
1218
- if (fieldFlags.status && fieldFlags.closeReason) {
1179
+ // `pm update --status <close_status>` always routes to the auditable close
1180
+ // workflow so agents are never blocked by close-through-update errors. Any
1181
+ // other field updates in the same call are applied first, then the item is
1182
+ // closed with the supplied --close-reason (or a derived default when omitted).
1183
+ if (fieldFlags.status) {
1219
1184
  const targetStatus = normalizeStatusInput(options.status, statusRegistry);
1220
1185
  if (targetStatus === statusRegistry.close_status) {
1221
- const otherFieldsChanged = Object.entries(fieldFlags).some(([key, value]) => value && key !== "status" && key !== "closeReason");
1222
- if (otherFieldsChanged) {
1223
- throw new PmCliError(`Cannot combine other field updates with --status ${statusRegistry.close_status} --close-reason. Run pm update for non-close fields, then pm close <id> "<reason>" separately.`, EXIT_CODE.USAGE, {
1224
- code: "close_through_update",
1225
- why: "Closing requires explicit pm close to capture validation; combining other field updates in the same call would mask the close audit trail.",
1226
- examples: [
1227
- `pm update ${id} --title "<title>"`,
1228
- `pm close ${id} "${options.closeReason}" --author "${author}"`,
1229
- ],
1230
- nextSteps: [
1231
- "Split into two commands: pm update <id> --<field> <value>; pm close <id> \"<reason>\".",
1232
- ],
1233
- });
1186
+ const otherFieldKeys = Object.entries(fieldFlags)
1187
+ .filter(([key, value]) => value && key !== "status" && key !== "closeReason")
1188
+ .map(([key]) => key);
1189
+ const routeWarnings = [];
1190
+ let preChangedFields = [];
1191
+ if (otherFieldKeys.length > 0) {
1192
+ const preUpdate = await runUpdate(id, { ...options, status: undefined, closeReason: undefined, message: undefined }, global);
1193
+ preChangedFields = preUpdate.changed_fields;
1194
+ routeWarnings.push(...preUpdate.warnings);
1234
1195
  }
1235
- const closeResult = await runClose(id, options.closeReason, {
1196
+ const explicitReason = typeof options.closeReason === "string" ? options.closeReason.trim() : "";
1197
+ const fallbackMessage = typeof options.message === "string" ? options.message.trim() : "";
1198
+ const closeReason = explicitReason || fallbackMessage || "Closed via pm update";
1199
+ // Only flag a defaulted reason when neither --close-reason nor --message
1200
+ // supplied any text and we had to invent the generic placeholder.
1201
+ const reasonDefaulted = explicitReason.length === 0 && fallbackMessage.length === 0;
1202
+ const closeResult = await runClose(id, closeReason, {
1236
1203
  author: options.author,
1237
1204
  message: options.message,
1238
1205
  force: options.force,
1239
1206
  }, global);
1207
+ const warnings = [...routeWarnings, ...closeResult.warnings, "auto_routed_from_update_to_close"];
1208
+ if (reasonDefaulted) {
1209
+ warnings.push("close_reason_defaulted");
1210
+ }
1240
1211
  return {
1241
1212
  item: closeResult.item,
1242
- changed_fields: closeResult.changed_fields,
1243
- warnings: [...closeResult.warnings, "auto_routed_from_update_to_close"],
1213
+ changed_fields: [...preChangedFields, ...closeResult.changed_fields],
1214
+ warnings,
1244
1215
  };
1245
1216
  }
1246
1217
  }
@@ -1261,6 +1232,27 @@ export async function runUpdate(id, options, global) {
1261
1232
  const changedFields = [];
1262
1233
  const warnings = [];
1263
1234
  let activeTypeName = resolveTypeName(document.metadata.type, typeRegistry) ?? document.metadata.type;
1235
+ // Declarative set-or-clear helpers for the many string scalar fields that
1236
+ // share an identical shape: set from `--flag` (optionally transformed) or
1237
+ // delete when `--unset <field>` was requested, then record the change.
1238
+ // Each call is placed in the same position the inline block occupied so
1239
+ // the order of `changedFields` is preserved exactly (pm-why9).
1240
+ const metadataRecord = toItemRecord(document.metadata);
1241
+ const setOrClearScalar = (optionValue, metadataKey, transform) => {
1242
+ if (optionValue === undefined && !clearFrontMatterKeys.has(metadataKey)) {
1243
+ return;
1244
+ }
1245
+ if (clearFrontMatterKeys.has(metadataKey)) {
1246
+ delete metadataRecord[metadataKey];
1247
+ }
1248
+ else {
1249
+ metadataRecord[metadataKey] = transform(optionValue);
1250
+ }
1251
+ changedFields.push(metadataKey);
1252
+ };
1253
+ const setOrClearTrimScalar = (optionValue, metadataKey) => {
1254
+ setOrClearScalar(optionValue, metadataKey, (value) => value.trim());
1255
+ };
1264
1256
  if (options.title !== undefined) {
1265
1257
  document.metadata.title = options.title;
1266
1258
  changedFields.push("title");
@@ -1276,21 +1268,9 @@ export async function runUpdate(id, options, global) {
1276
1268
  const previousStatus = document.metadata.status;
1277
1269
  const previousStatusNormalized = normalizeStatusInput(previousStatus, statusRegistry) ?? previousStatus;
1278
1270
  if (options.status !== undefined) {
1271
+ // Close-status routing (with reason + audit) is handled before mutateItem
1272
+ // by the close gate above, so only non-close transitions reach this path.
1279
1273
  const status = parseStatus(options.status, statusRegistry);
1280
- if (status === statusRegistry.close_status) {
1281
- throw new PmCliError(`Invalid --status value "${statusRegistry.close_status}". Use "pm close <ID> <TEXT>" to close an item.`, EXIT_CODE.USAGE, {
1282
- code: "close_through_update",
1283
- why: "Closing requires a close reason and optional validation checks that pm update cannot enforce. Use pm close for auditable close workflows.",
1284
- examples: [
1285
- `pm close ${id} "All acceptance criteria met" --author "${author}" --message "Close: verified"`,
1286
- `pm close ${id} "Resolved" --validate-close warn --author "${author}"`,
1287
- ],
1288
- nextSteps: [
1289
- 'Use "pm close <ID> <reason>" to close with required close reason and optional --validate-close.',
1290
- 'To cancel instead, use "pm update <ID> --status canceled".',
1291
- ],
1292
- });
1293
- }
1294
1274
  document.metadata.status = status;
1295
1275
  if (status === statusRegistry.canceled_status) {
1296
1276
  delete document.metadata.assignee;
@@ -1324,7 +1304,7 @@ export async function runUpdate(id, options, global) {
1324
1304
  if (options.type !== undefined) {
1325
1305
  const resolvedTypeName = resolveTypeName(options.type, typeRegistry);
1326
1306
  if (!resolvedTypeName) {
1327
- throw new PmCliError(`Invalid type value "${options.type}". Allowed: ${typeRegistry.types.join(", ")}`, EXIT_CODE.USAGE);
1307
+ throw new PmCliError(buildInvalidTypeError(options.type, typeRegistry.types), EXIT_CODE.USAGE);
1328
1308
  }
1329
1309
  document.metadata.type = resolvedTypeName;
1330
1310
  activeTypeName = resolvedTypeName;
@@ -1482,42 +1462,10 @@ export async function runUpdate(id, options, global) {
1482
1462
  document.metadata.tags = clearFrontMatterKeys.has("tags") ? [] : parseTags(options.tags);
1483
1463
  changedFields.push("tags");
1484
1464
  }
1485
- if (options.deadline !== undefined || clearFrontMatterKeys.has("deadline")) {
1486
- if (clearFrontMatterKeys.has("deadline")) {
1487
- delete document.metadata.deadline;
1488
- }
1489
- else {
1490
- document.metadata.deadline = resolveIsoOrRelative(options.deadline, new Date(), "deadline");
1491
- }
1492
- changedFields.push("deadline");
1493
- }
1494
- if (options.estimatedMinutes !== undefined || clearFrontMatterKeys.has("estimated_minutes")) {
1495
- if (clearFrontMatterKeys.has("estimated_minutes")) {
1496
- delete document.metadata.estimated_minutes;
1497
- }
1498
- else {
1499
- document.metadata.estimated_minutes = parseOptionalNumber(options.estimatedMinutes, "estimated-minutes");
1500
- }
1501
- changedFields.push("estimated_minutes");
1502
- }
1503
- if (options.acceptanceCriteria !== undefined || clearFrontMatterKeys.has("acceptance_criteria")) {
1504
- if (clearFrontMatterKeys.has("acceptance_criteria")) {
1505
- delete document.metadata.acceptance_criteria;
1506
- }
1507
- else {
1508
- document.metadata.acceptance_criteria = options.acceptanceCriteria;
1509
- }
1510
- changedFields.push("acceptance_criteria");
1511
- }
1512
- if (options.definitionOfReady !== undefined || clearFrontMatterKeys.has("definition_of_ready")) {
1513
- if (clearFrontMatterKeys.has("definition_of_ready")) {
1514
- delete document.metadata.definition_of_ready;
1515
- }
1516
- else {
1517
- document.metadata.definition_of_ready = options.definitionOfReady.trim();
1518
- }
1519
- changedFields.push("definition_of_ready");
1520
- }
1465
+ setOrClearScalar(options.deadline, "deadline", (value) => resolveIsoOrRelative(value, nowValue, "deadline"));
1466
+ setOrClearScalar(options.estimatedMinutes, "estimated_minutes", (value) => parseOptionalNumber(value, "estimated-minutes"));
1467
+ setOrClearScalar(options.acceptanceCriteria, "acceptance_criteria", (value) => value);
1468
+ setOrClearTrimScalar(options.definitionOfReady, "definition_of_ready");
1521
1469
  const orderRaw = options.order ?? options.rank;
1522
1470
  if (orderRaw !== undefined || clearFrontMatterKeys.has("order")) {
1523
1471
  if (clearFrontMatterKeys.has("order")) {
@@ -1532,60 +1480,12 @@ export async function runUpdate(id, options, global) {
1532
1480
  }
1533
1481
  changedFields.push("order");
1534
1482
  }
1535
- if (options.goal !== undefined || clearFrontMatterKeys.has("goal")) {
1536
- if (clearFrontMatterKeys.has("goal")) {
1537
- delete document.metadata.goal;
1538
- }
1539
- else {
1540
- document.metadata.goal = options.goal.trim();
1541
- }
1542
- changedFields.push("goal");
1543
- }
1544
- if (options.objective !== undefined || clearFrontMatterKeys.has("objective")) {
1545
- if (clearFrontMatterKeys.has("objective")) {
1546
- delete document.metadata.objective;
1547
- }
1548
- else {
1549
- document.metadata.objective = options.objective.trim();
1550
- }
1551
- changedFields.push("objective");
1552
- }
1553
- if (options.value !== undefined || clearFrontMatterKeys.has("value")) {
1554
- if (clearFrontMatterKeys.has("value")) {
1555
- delete document.metadata.value;
1556
- }
1557
- else {
1558
- document.metadata.value = options.value.trim();
1559
- }
1560
- changedFields.push("value");
1561
- }
1562
- if (options.impact !== undefined || clearFrontMatterKeys.has("impact")) {
1563
- if (clearFrontMatterKeys.has("impact")) {
1564
- delete document.metadata.impact;
1565
- }
1566
- else {
1567
- document.metadata.impact = options.impact.trim();
1568
- }
1569
- changedFields.push("impact");
1570
- }
1571
- if (options.outcome !== undefined || clearFrontMatterKeys.has("outcome")) {
1572
- if (clearFrontMatterKeys.has("outcome")) {
1573
- delete document.metadata.outcome;
1574
- }
1575
- else {
1576
- document.metadata.outcome = options.outcome.trim();
1577
- }
1578
- changedFields.push("outcome");
1579
- }
1580
- if (options.whyNow !== undefined || clearFrontMatterKeys.has("why_now")) {
1581
- if (clearFrontMatterKeys.has("why_now")) {
1582
- delete document.metadata.why_now;
1583
- }
1584
- else {
1585
- document.metadata.why_now = options.whyNow.trim();
1586
- }
1587
- changedFields.push("why_now");
1588
- }
1483
+ setOrClearTrimScalar(options.goal, "goal");
1484
+ setOrClearTrimScalar(options.objective, "objective");
1485
+ setOrClearTrimScalar(options.value, "value");
1486
+ setOrClearTrimScalar(options.impact, "impact");
1487
+ setOrClearTrimScalar(options.outcome, "outcome");
1488
+ setOrClearTrimScalar(options.whyNow, "why_now");
1589
1489
  if (options.assignee !== undefined || clearFrontMatterKeys.has("assignee")) {
1590
1490
  if (clearFrontMatterKeys.has("assignee")) {
1591
1491
  delete document.metadata.assignee;
@@ -1607,33 +1507,9 @@ export async function runUpdate(id, options, global) {
1607
1507
  }
1608
1508
  changedFields.push("parent");
1609
1509
  }
1610
- if (options.reviewer !== undefined || clearFrontMatterKeys.has("reviewer")) {
1611
- if (clearFrontMatterKeys.has("reviewer")) {
1612
- delete document.metadata.reviewer;
1613
- }
1614
- else {
1615
- document.metadata.reviewer = options.reviewer.trim();
1616
- }
1617
- changedFields.push("reviewer");
1618
- }
1619
- if (options.risk !== undefined || clearFrontMatterKeys.has("risk")) {
1620
- if (clearFrontMatterKeys.has("risk")) {
1621
- delete document.metadata.risk;
1622
- }
1623
- else {
1624
- document.metadata.risk = ensureEnum(normalizeRiskInput(options.risk), RISK_VALUES, "risk");
1625
- }
1626
- changedFields.push("risk");
1627
- }
1628
- if (options.confidence !== undefined || clearFrontMatterKeys.has("confidence")) {
1629
- if (clearFrontMatterKeys.has("confidence")) {
1630
- delete document.metadata.confidence;
1631
- }
1632
- else {
1633
- document.metadata.confidence = parseConfidenceInput(options.confidence);
1634
- }
1635
- changedFields.push("confidence");
1636
- }
1510
+ setOrClearTrimScalar(options.reviewer, "reviewer");
1511
+ setOrClearScalar(options.risk, "risk", (value) => ensureEnum(normalizeRiskInput(value), RISK_VALUES, "risk"));
1512
+ setOrClearScalar(options.confidence, "confidence", (value) => parseConfidenceInput(value));
1637
1513
  if (options.sprint !== undefined || clearFrontMatterKeys.has("sprint")) {
1638
1514
  if (clearFrontMatterKeys.has("sprint")) {
1639
1515
  delete document.metadata.sprint;
@@ -1664,133 +1540,23 @@ export async function runUpdate(id, options, global) {
1664
1540
  document.metadata.blocked_by = options.blockedBy.trim();
1665
1541
  }
1666
1542
  changedFields.push("blocked_by");
1543
+ // pm-kyd6: keep the dependency graph in sync with the blocked_by scalar.
1544
+ applyBlockedByDependencyEdge(document.metadata, resolvedBlockedByDependencyId, nowIso, author, changedFields);
1667
1545
  }
1668
- if (options.blockedReason !== undefined || clearFrontMatterKeys.has("blocked_reason")) {
1669
- if (clearFrontMatterKeys.has("blocked_reason")) {
1670
- delete document.metadata.blocked_reason;
1671
- }
1672
- else {
1673
- document.metadata.blocked_reason = options.blockedReason.trim();
1674
- }
1675
- changedFields.push("blocked_reason");
1676
- }
1677
- if (options.unblockNote !== undefined || clearFrontMatterKeys.has("unblock_note")) {
1678
- if (clearFrontMatterKeys.has("unblock_note")) {
1679
- delete document.metadata.unblock_note;
1680
- }
1681
- else {
1682
- document.metadata.unblock_note = options.unblockNote.trim();
1683
- }
1684
- changedFields.push("unblock_note");
1685
- }
1686
- if (options.reporter !== undefined || clearFrontMatterKeys.has("reporter")) {
1687
- if (clearFrontMatterKeys.has("reporter")) {
1688
- delete document.metadata.reporter;
1689
- }
1690
- else {
1691
- document.metadata.reporter = options.reporter.trim();
1692
- }
1693
- changedFields.push("reporter");
1694
- }
1695
- if (options.severity !== undefined || clearFrontMatterKeys.has("severity")) {
1696
- if (clearFrontMatterKeys.has("severity")) {
1697
- delete document.metadata.severity;
1698
- }
1699
- else {
1700
- document.metadata.severity = ensureEnum(normalizeSeverityInput(options.severity), ISSUE_SEVERITY_VALUES, "severity");
1701
- }
1702
- changedFields.push("severity");
1703
- }
1704
- if (options.environment !== undefined || clearFrontMatterKeys.has("environment")) {
1705
- if (clearFrontMatterKeys.has("environment")) {
1706
- delete document.metadata.environment;
1707
- }
1708
- else {
1709
- document.metadata.environment = options.environment.trim();
1710
- }
1711
- changedFields.push("environment");
1712
- }
1713
- if (options.reproSteps !== undefined || clearFrontMatterKeys.has("repro_steps")) {
1714
- if (clearFrontMatterKeys.has("repro_steps")) {
1715
- delete document.metadata.repro_steps;
1716
- }
1717
- else {
1718
- document.metadata.repro_steps = options.reproSteps.trim();
1719
- }
1720
- changedFields.push("repro_steps");
1721
- }
1722
- if (options.resolution !== undefined || clearFrontMatterKeys.has("resolution")) {
1723
- if (clearFrontMatterKeys.has("resolution")) {
1724
- delete document.metadata.resolution;
1725
- }
1726
- else {
1727
- document.metadata.resolution = options.resolution.trim();
1728
- }
1729
- changedFields.push("resolution");
1730
- }
1731
- if (options.expectedResult !== undefined || clearFrontMatterKeys.has("expected_result")) {
1732
- if (clearFrontMatterKeys.has("expected_result")) {
1733
- delete document.metadata.expected_result;
1734
- }
1735
- else {
1736
- document.metadata.expected_result = options.expectedResult.trim();
1737
- }
1738
- changedFields.push("expected_result");
1739
- }
1740
- if (options.actualResult !== undefined || clearFrontMatterKeys.has("actual_result")) {
1741
- if (clearFrontMatterKeys.has("actual_result")) {
1742
- delete document.metadata.actual_result;
1743
- }
1744
- else {
1745
- document.metadata.actual_result = options.actualResult.trim();
1746
- }
1747
- changedFields.push("actual_result");
1748
- }
1749
- if (options.affectedVersion !== undefined || clearFrontMatterKeys.has("affected_version")) {
1750
- if (clearFrontMatterKeys.has("affected_version")) {
1751
- delete document.metadata.affected_version;
1752
- }
1753
- else {
1754
- document.metadata.affected_version = options.affectedVersion.trim();
1755
- }
1756
- changedFields.push("affected_version");
1757
- }
1758
- if (options.fixedVersion !== undefined || clearFrontMatterKeys.has("fixed_version")) {
1759
- if (clearFrontMatterKeys.has("fixed_version")) {
1760
- delete document.metadata.fixed_version;
1761
- }
1762
- else {
1763
- document.metadata.fixed_version = options.fixedVersion.trim();
1764
- }
1765
- changedFields.push("fixed_version");
1766
- }
1767
- if (options.component !== undefined || clearFrontMatterKeys.has("component")) {
1768
- if (clearFrontMatterKeys.has("component")) {
1769
- delete document.metadata.component;
1770
- }
1771
- else {
1772
- document.metadata.component = options.component.trim();
1773
- }
1774
- changedFields.push("component");
1775
- }
1776
- if (options.regression !== undefined || clearFrontMatterKeys.has("regression")) {
1777
- if (clearFrontMatterKeys.has("regression")) {
1778
- delete document.metadata.regression;
1779
- }
1780
- else {
1781
- document.metadata.regression = parseRegressionInput(options.regression);
1782
- }
1783
- changedFields.push("regression");
1784
- }
1785
- if (options.customerImpact !== undefined || clearFrontMatterKeys.has("customer_impact")) {
1786
- if (clearFrontMatterKeys.has("customer_impact")) {
1787
- delete document.metadata.customer_impact;
1788
- }
1789
- else {
1790
- document.metadata.customer_impact = options.customerImpact.trim();
1791
- }
1792
- changedFields.push("customer_impact");
1793
- }
1546
+ setOrClearTrimScalar(options.blockedReason, "blocked_reason");
1547
+ setOrClearTrimScalar(options.unblockNote, "unblock_note");
1548
+ setOrClearTrimScalar(options.reporter, "reporter");
1549
+ setOrClearScalar(options.severity, "severity", (value) => ensureEnum(normalizeSeverityInput(value), ISSUE_SEVERITY_VALUES, "severity"));
1550
+ setOrClearTrimScalar(options.environment, "environment");
1551
+ setOrClearTrimScalar(options.reproSteps, "repro_steps");
1552
+ setOrClearTrimScalar(options.resolution, "resolution");
1553
+ setOrClearTrimScalar(options.expectedResult, "expected_result");
1554
+ setOrClearTrimScalar(options.actualResult, "actual_result");
1555
+ setOrClearTrimScalar(options.affectedVersion, "affected_version");
1556
+ setOrClearTrimScalar(options.fixedVersion, "fixed_version");
1557
+ setOrClearTrimScalar(options.component, "component");
1558
+ setOrClearScalar(options.regression, "regression", (value) => parseRegressionInput(value));
1559
+ setOrClearTrimScalar(options.customerImpact, "customer_impact");
1794
1560
  if (options.reminder !== undefined || clearFrontMatterKeys.has("reminders")) {
1795
1561
  if (clearFrontMatterKeys.has("reminders")) {
1796
1562
  delete document.metadata.reminders;
@@ -1813,10 +1579,10 @@ export async function runUpdate(id, options, global) {
1813
1579
  if (!clearFrontMatterKeys.has(definition.metadata_key)) {
1814
1580
  continue;
1815
1581
  }
1816
- if (document.metadata[definition.metadata_key] === undefined) {
1582
+ if (metadataRecord[definition.metadata_key] === undefined) {
1817
1583
  continue;
1818
1584
  }
1819
- delete document.metadata[definition.metadata_key];
1585
+ delete metadataRecord[definition.metadata_key];
1820
1586
  changedFields.push(definition.metadata_key);
1821
1587
  }
1822
1588
  const runtimeFieldUpdates = collectRuntimeUpdateFieldValues(options, runtimeFieldRegistry);
@@ -1824,14 +1590,14 @@ export async function runUpdate(id, options, global) {
1824
1590
  if (clearFrontMatterKeys.has(fieldKey)) {
1825
1591
  continue;
1826
1592
  }
1827
- if (JSON.stringify(document.metadata[fieldKey]) === JSON.stringify(fieldValue)) {
1593
+ if (JSON.stringify(metadataRecord[fieldKey]) === JSON.stringify(fieldValue)) {
1828
1594
  continue;
1829
1595
  }
1830
- document.metadata[fieldKey] = fieldValue;
1596
+ metadataRecord[fieldKey] = fieldValue;
1831
1597
  changedFields.push(fieldKey);
1832
1598
  }
1833
1599
  try {
1834
- applyRegisteredItemFieldDefaultsAndValidation(document.metadata, getActiveExtensionRegistrations());
1600
+ applyRegisteredItemFieldDefaultsAndValidation(metadataRecord, getActiveExtensionRegistrations());
1835
1601
  }
1836
1602
  catch (error) {
1837
1603
  throw new PmCliError(error instanceof Error ? error.message : "Invalid extension item field values", EXIT_CODE.USAGE);
@@ -1840,11 +1606,11 @@ export async function runUpdate(id, options, global) {
1840
1606
  },
1841
1607
  });
1842
1608
  return {
1843
- item: result.item,
1609
+ item: toItemRecord(result.item),
1844
1610
  changed_fields: result.changedFields,
1845
1611
  warnings: [...parentReferenceWarnings, ...result.warnings],
1846
1612
  ...(options.allowAuditUpdate === true || options.allowAuditDepUpdate === true ? { audit_update: true } : {}),
1847
1613
  };
1848
1614
  }
1849
1615
  //# sourceMappingURL=update.js.map
1850
- //# debugId=98e2bc37-91cc-5340-b212-da1076fc5857
1616
+ //# debugId=94e19c77-3288-5a43-a8b2-6b9f15d4f234