@unbrained/pm-cli 2026.10.4 → 2026.10.5

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 (732) hide show
  1. package/.claude-plugin/marketplace.json +2 -2
  2. package/CHANGELOG.md +11 -0
  3. package/dist/cli/after-command-context-usage.js +1 -1
  4. package/dist/cli/argv-utils.js +1 -1
  5. package/dist/cli/bootstrap-args.js +1 -1
  6. package/dist/cli/bundle-integrity.js +2 -2
  7. package/dist/cli/command-namespaces.js +1 -1
  8. package/dist/cli/commander-usage.d.ts +1 -1
  9. package/dist/cli/commander-usage.js +7 -4
  10. package/dist/cli/commands/annotations/comments.js +1 -1
  11. package/dist/cli/commands/annotations/docs.js +1 -1
  12. package/dist/cli/commands/annotations/files.js +1 -1
  13. package/dist/cli/commands/annotations/learnings.js +1 -1
  14. package/dist/cli/commands/annotations/notes.js +1 -1
  15. package/dist/cli/commands/extension/describe.js +1 -1
  16. package/dist/cli/commands/extension/extension.js +1 -1
  17. package/dist/cli/commands/extension/scaffold.js +1 -1
  18. package/dist/cli/commands/extension/shared.js +1 -1
  19. package/dist/cli/commands/governance/gc.js +1 -1
  20. package/dist/cli/commands/governance/health.js +1 -1
  21. package/dist/cli/commands/governance/telemetry.js +1 -1
  22. package/dist/cli/commands/governance/validate.js +1 -1
  23. package/dist/cli/commands/history/activity.js +1 -1
  24. package/dist/cli/commands/history/history-compact.js +1 -1
  25. package/dist/cli/commands/history/history-redact.js +1 -1
  26. package/dist/cli/commands/history/history-repair.js +1 -1
  27. package/dist/cli/commands/history/history.js +1 -1
  28. package/dist/cli/commands/history/restore.js +1 -1
  29. package/dist/cli/commands/lifecycle/append.js +1 -1
  30. package/dist/cli/commands/lifecycle/claim.js +1 -1
  31. package/dist/cli/commands/lifecycle/close-many.js +1 -1
  32. package/dist/cli/commands/lifecycle/close.js +1 -1
  33. package/dist/cli/commands/lifecycle/copy.js +1 -1
  34. package/dist/cli/commands/lifecycle/create.js +1 -1
  35. package/dist/cli/commands/lifecycle/delete.js +1 -1
  36. package/dist/cli/commands/lifecycle/focus.js +1 -1
  37. package/dist/cli/commands/lifecycle/plan.js +1 -1
  38. package/dist/cli/commands/lifecycle/update-many.js +1 -1
  39. package/dist/cli/commands/lifecycle/update.js +1 -1
  40. package/dist/cli/commands/query/aggregate.js +1 -1
  41. package/dist/cli/commands/query/context.js +1 -1
  42. package/dist/cli/commands/query/deps.js +1 -1
  43. package/dist/cli/commands/query/duplicates.js +1 -1
  44. package/dist/cli/commands/query/eval.js +1 -1
  45. package/dist/cli/commands/query/get.js +1 -1
  46. package/dist/cli/commands/query/graph.js +1 -1
  47. package/dist/cli/commands/query/list.js +1 -1
  48. package/dist/cli/commands/query/next.js +1 -1
  49. package/dist/cli/commands/query/search.js +1 -1
  50. package/dist/cli/commands/query/stats.js +1 -1
  51. package/dist/cli/commands/test/test-all.js +1 -1
  52. package/dist/cli/commands/test/test-runs.js +1 -1
  53. package/dist/cli/commands/test/test.js +1 -1
  54. package/dist/cli/commands/workspace/config.js +1 -1
  55. package/dist/cli/commands/workspace/contracts.js +1 -1
  56. package/dist/cli/commands/workspace/init.js +1 -1
  57. package/dist/cli/commands/workspace/merge.js +1 -1
  58. package/dist/cli/commands/workspace/profile.js +1 -1
  59. package/dist/cli/commands/workspace/schema.js +1 -1
  60. package/dist/cli/commands/workspace/upgrade.js +1 -1
  61. package/dist/cli/context-intent-invocation.js +1 -1
  62. package/dist/cli/description-stdin.js +1 -1
  63. package/dist/cli/error-guidance.js +3 -1
  64. package/dist/cli/extension-command-help.js +5 -3
  65. package/dist/cli/extension-command-options.js +1 -1
  66. package/dist/cli/extension-recovery.js +1 -1
  67. package/dist/cli/help-content.js +5 -2
  68. package/dist/cli/help-json-payload.js +6 -3
  69. package/dist/cli/invocation-profile.js +2 -2
  70. package/dist/cli/main.js +5 -5
  71. package/dist/cli/migration-gates.js +1 -1
  72. package/dist/cli/option-values.js +1 -1
  73. package/dist/cli/public.js +1 -1
  74. package/dist/cli/register-annotations.js +1 -1
  75. package/dist/cli/register-assurance.js +1 -1
  76. package/dist/cli/register-files-lookup.js +1 -1
  77. package/dist/cli/register-history-activity.js +1 -1
  78. package/dist/cli/register-history-author.js +1 -1
  79. package/dist/cli/register-history-maintenance.js +2 -2
  80. package/dist/cli/register-list-query.js +10 -10
  81. package/dist/cli/register-mutation-options.js +1 -1
  82. package/dist/cli/register-mutation.js +2 -2
  83. package/dist/cli/register-operations.js +1 -1
  84. package/dist/cli/register-setup.js +1 -1
  85. package/dist/cli/register-structured-mutation.js +1 -1
  86. package/dist/cli/registration-helpers.js +1 -1
  87. package/dist/cli/runtime/activation.js +1 -1
  88. package/dist/cli/runtime/invocation-options.js +1 -1
  89. package/dist/cli/runtime/projection-retry.js +1 -1
  90. package/dist/cli/runtime/selection.js +1 -1
  91. package/dist/cli/runtime/telemetry-outcome.js +1 -1
  92. package/dist/cli/runtime-compatibility-boundary.js +4 -4
  93. package/dist/cli/schema/registration.js +2 -2
  94. package/dist/cli/schema-registration-helpers.js +1 -1
  95. package/dist/cli/search-refresh.js +1 -1
  96. package/dist/cli/stats-analytics-json.js +1 -1
  97. package/dist/cli/telemetry-flush.js +1 -1
  98. package/dist/cli-bundle/bundle-manifest.json +163 -163
  99. package/dist/cli-bundle/chunks/chunk-3CYOBJUK.js +3 -0
  100. package/dist/cli-bundle/chunks/chunk-5MNOWZPN.js +3 -0
  101. package/dist/cli-bundle/chunks/chunk-AJ7H6XUF.js +20 -0
  102. package/dist/cli-bundle/chunks/chunk-D332RXZ7.js +80 -0
  103. package/dist/cli-bundle/chunks/chunk-HRJ6G6ZG.js +31 -0
  104. package/dist/cli-bundle/chunks/chunk-KRVI56QE.js +6 -0
  105. package/dist/cli-bundle/chunks/chunk-N4YGSG6F.js +238 -0
  106. package/dist/cli-bundle/chunks/{chunk-7CE2DJMA.js → chunk-OOLYASYJ.js} +2 -2
  107. package/dist/cli-bundle/chunks/chunk-R7CG2DB7.js +2 -0
  108. package/dist/cli-bundle/chunks/chunk-TGMONGWX.js +2 -0
  109. package/dist/cli-bundle/chunks/chunk-UZ7BIUCI.js +2 -0
  110. package/dist/cli-bundle/chunks/{chunk-GZMWISWW.js → chunk-VZ63DEVJ.js} +3 -3
  111. package/dist/cli-bundle/chunks/chunk-WFZ4UEOB.js +2 -0
  112. package/dist/cli-bundle/chunks/chunk-YVBRASXO.js +8 -0
  113. package/dist/cli-bundle/chunks/{chunk-SMKHR6BM.js → chunk-Z66DWDAU.js} +87 -87
  114. package/dist/cli-bundle/chunks/{register-list-query-QBGXO5JJ.js → register-list-query-75QXHIFH.js} +11 -11
  115. package/dist/cli-bundle/chunks/register-mutation-YS54SCHG.js +20 -0
  116. package/dist/cli-bundle/chunks/register-operations-6KHZQSYJ.js +2 -0
  117. package/dist/cli-bundle/chunks/register-setup-RTATEN2M.js +2 -0
  118. package/dist/cli-bundle/focused-chunks/{chunk-Q6DJ5DFQ.js → chunk-2CVX3KR3.js} +2 -2
  119. package/dist/cli-bundle/focused-chunks/chunk-5C3IDDW7.js +2 -0
  120. package/dist/cli-bundle/focused-chunks/{chunk-467EW5RL.js → chunk-ABV67XCC.js} +3 -3
  121. package/dist/cli-bundle/focused-chunks/chunk-B5RSLVE6.js +3 -0
  122. package/dist/cli-bundle/focused-chunks/chunk-C224METM.js +20 -0
  123. package/dist/cli-bundle/focused-chunks/chunk-CLDPTMQY.js +6 -0
  124. package/dist/cli-bundle/focused-chunks/chunk-DDRN42PB.js +8 -0
  125. package/dist/cli-bundle/focused-chunks/{chunk-7O4NUJVO.js → chunk-DOVTUKJQ.js} +2 -2
  126. package/dist/cli-bundle/focused-chunks/chunk-ECBOPEJE.js +75 -0
  127. package/dist/cli-bundle/focused-chunks/chunk-GITOYRUW.js +165 -0
  128. package/dist/cli-bundle/focused-chunks/chunk-GUIF3WVC.js +30 -0
  129. package/dist/cli-bundle/focused-chunks/chunk-LE4JUCRR.js +3 -0
  130. package/dist/cli-bundle/focused-chunks/{chunk-HFAW3FJQ.js → chunk-PSXFFQFT.js} +2 -2
  131. package/dist/cli-bundle/focused-chunks/chunk-RHIH6XIW.js +12 -0
  132. package/dist/cli-bundle/focused-chunks/chunk-UDYRVBOZ.js +2 -0
  133. package/dist/cli-bundle/focused-chunks/chunk-XV5RV4ZT.js +2 -0
  134. package/dist/cli-bundle/focused-chunks/{chunk-JCVMOSWQ.js → chunk-YMU42COG.js} +2 -2
  135. package/dist/cli-bundle/main.js +27 -27
  136. package/dist/cli-bundle/sdk-authoring.js +1 -1
  137. package/dist/cli-bundle/sdk-contracts.js +2 -2
  138. package/dist/cli-bundle/sdk-core.js +32 -32
  139. package/dist/cli-bundle/sdk-governance.js +1 -1
  140. package/dist/cli-bundle/sdk-graph.js +1 -1
  141. package/dist/cli-bundle/sdk-merge.js +55 -55
  142. package/dist/cli-bundle/sdk-query.js +1 -1
  143. package/dist/cli-bundle/sdk-runtime.js +1 -1
  144. package/dist/cli-bundle/sdk-testing.js +1 -1
  145. package/dist/cli-bundle/sdk.js +10 -10
  146. package/dist/cli.js +1 -1
  147. package/dist/core/checkpoint/checkpoint-gc.js +1 -1
  148. package/dist/core/checkpoint/mutation-checkpoint.js +2 -2
  149. package/dist/core/config/nested-settings.js +1 -1
  150. package/dist/core/config/positional-value.js +1 -1
  151. package/dist/core/diagnostics/remediation.js +1 -1
  152. package/dist/core/extensions/activation-summary-markdown.js +2 -1
  153. package/dist/core/extensions/activation-summary.js +1 -1
  154. package/dist/core/extensions/activation-transaction.js +1 -1
  155. package/dist/core/extensions/capability-usage.js +1 -1
  156. package/dist/core/extensions/command-hook-context.js +1 -1
  157. package/dist/core/extensions/command-metadata-contract.js +1 -1
  158. package/dist/core/extensions/command-visibility-tier.js +1 -1
  159. package/dist/core/extensions/contribution-inventory.js +1 -1
  160. package/dist/core/extensions/exporter-output-contract.js +1 -1
  161. package/dist/core/extensions/extension-candidate.js +1 -1
  162. package/dist/core/extensions/extension-capability-aliases.js +1 -1
  163. package/dist/core/extensions/extension-hook-runtime.js +1 -1
  164. package/dist/core/extensions/extension-policy.js +1 -1
  165. package/dist/core/extensions/extension-registries.js +1 -1
  166. package/dist/core/extensions/extension-runtime-helpers.js +1 -1
  167. package/dist/core/extensions/extension-types.js +1 -1
  168. package/dist/core/extensions/flag-definition-validation.js +1 -1
  169. package/dist/core/extensions/flag-value-types.js +1 -1
  170. package/dist/core/extensions/index.js +1 -1
  171. package/dist/core/extensions/item-field-types.js +1 -1
  172. package/dist/core/extensions/item-fields.js +1 -1
  173. package/dist/core/extensions/loader.js +1 -1
  174. package/dist/core/extensions/manifest-parser.js +1 -1
  175. package/dist/core/extensions/manifest-schema.js +1 -1
  176. package/dist/core/extensions/module-graph-snapshot.js +1 -1
  177. package/dist/core/extensions/preflight-ownership.js +1 -1
  178. package/dist/core/extensions/registration-contracts.js +1 -1
  179. package/dist/core/extensions/registration-validation.js +1 -1
  180. package/dist/core/extensions/registration-values.js +1 -1
  181. package/dist/core/extensions/reserved-host-flags.js +1 -1
  182. package/dist/core/extensions/runtime-registrations.js +1 -1
  183. package/dist/core/extensions/service-ownership.js +1 -1
  184. package/dist/core/extensions/version-compat.js +1 -1
  185. package/dist/core/fs/atomic-create.js +1 -1
  186. package/dist/core/fs/fs-utils.js +2 -2
  187. package/dist/core/fs/host-environment-errors.js +1 -1
  188. package/dist/core/fs/index.js +1 -1
  189. package/dist/core/fs/path-utils.js +1 -1
  190. package/dist/core/governance/content-fields.js +1 -1
  191. package/dist/core/governance/issue-codes.js +1 -1
  192. package/dist/core/governance/metadata-coverage.js +1 -1
  193. package/dist/core/history/digest.js +1 -1
  194. package/dist/core/history/drift-cache.js +3 -3
  195. package/dist/core/history/drift-scan.d.ts +4 -0
  196. package/dist/core/history/drift-scan.js +1 -1
  197. package/dist/core/history/event-classification.js +1 -1
  198. package/dist/core/history/event-index.js +8 -7
  199. package/dist/core/history/history-compact-bulk.js +1 -1
  200. package/dist/core/history/history-diff.js +1 -1
  201. package/dist/core/history/history-rewrite.js +1 -1
  202. package/dist/core/history/history-storage-stats.js +1 -1
  203. package/dist/core/history/history-stream-policy.js +1 -1
  204. package/dist/core/history/history.js +2 -2
  205. package/dist/core/history/identity.js +1 -1
  206. package/dist/core/history/index.js +1 -1
  207. package/dist/core/history/operation-contract.js +1 -1
  208. package/dist/core/history/projection.js +1 -1
  209. package/dist/core/history/read.js +1 -1
  210. package/dist/core/history/replay.js +2 -1
  211. package/dist/core/history/tombstone.js +1 -1
  212. package/dist/core/history/version-address.js +1 -1
  213. package/dist/core/history/workspace-history.js +2 -2
  214. package/dist/core/io/body-file.js +1 -1
  215. package/dist/core/io/bulk-ids-input.js +2 -1
  216. package/dist/core/item/actionability.js +1 -1
  217. package/dist/core/item/dependency-reference.js +1 -1
  218. package/dist/core/item/id.js +1 -1
  219. package/dist/core/item/index.js +1 -1
  220. package/dist/core/item/item-format-version.js +1 -1
  221. package/dist/core/item/item-format.js +6 -4
  222. package/dist/core/item/item-record.js +1 -1
  223. package/dist/core/item/item-type-definition.js +1 -1
  224. package/dist/core/item/parent-reference-policy.js +1 -1
  225. package/dist/core/item/parse.js +8 -2
  226. package/dist/core/item/plan-lifecycle.js +1 -1
  227. package/dist/core/item/priority.js +1 -1
  228. package/dist/core/item/sprint-release-format.js +1 -1
  229. package/dist/core/item/status-filter.js +1 -1
  230. package/dist/core/item/status.js +1 -1
  231. package/dist/core/item/toon-decode.js +1 -1
  232. package/dist/core/item/type-registry.js +1 -1
  233. package/dist/core/item/type-synonyms.js +1 -1
  234. package/dist/core/lock/index.js +1 -1
  235. package/dist/core/lock/lock-gc.js +1 -1
  236. package/dist/core/lock/lock.js +3 -3
  237. package/dist/core/output/mutation-projection.js +1 -1
  238. package/dist/core/output/output-control.js +1 -1
  239. package/dist/core/output/output.js +22 -10
  240. package/dist/core/output/query-summary.js +1 -1
  241. package/dist/core/output/tabular.js +3 -1
  242. package/dist/core/packages/manifest.js +1 -1
  243. package/dist/core/packages/root.js +1 -1
  244. package/dist/core/policy/workflow-policy-schema.js +1 -1
  245. package/dist/core/policy/workflow-policy-store.js +1 -1
  246. package/dist/core/policy/workflow-policy.js +1 -1
  247. package/dist/core/profile/profile-describe.js +1 -1
  248. package/dist/core/profile/profile-lint.js +1 -1
  249. package/dist/core/profile/profile-plan.js +1 -1
  250. package/dist/core/profile/profile-presets.js +25 -1
  251. package/dist/core/reproducibility/context.js +1 -1
  252. package/dist/core/schema/fields-file.js +2 -2
  253. package/dist/core/schema/item-types-file.js +2 -2
  254. package/dist/core/schema/runtime-field-filters.js +1 -1
  255. package/dist/core/schema/runtime-field-values.js +1 -1
  256. package/dist/core/schema/runtime-schema.js +2 -2
  257. package/dist/core/schema/status-defs-file.js +2 -2
  258. package/dist/core/schema/status-token.js +1 -1
  259. package/dist/core/schema/type-inference.js +1 -1
  260. package/dist/core/schema/type-presets.js +1 -1
  261. package/dist/core/schema/type-workflows.js +1 -1
  262. package/dist/core/search/background-refresh.js +2 -2
  263. package/dist/core/search/bm25.js +1 -1
  264. package/dist/core/search/cache.js +2 -2
  265. package/dist/core/search/corpus.js +1 -1
  266. package/dist/core/search/embedding-batches.js +1 -1
  267. package/dist/core/search/eval-thresholds.js +1 -1
  268. package/dist/core/search/eval.js +1 -1
  269. package/dist/core/search/http-client.js +1 -1
  270. package/dist/core/search/providers.js +1 -1
  271. package/dist/core/search/relevance.js +1 -1
  272. package/dist/core/search/semantic-defaults.js +1 -1
  273. package/dist/core/search/staleness.js +1 -1
  274. package/dist/core/search/vector-stores.js +2 -2
  275. package/dist/core/search/vectorization-metadata.js +1 -1
  276. package/dist/core/sentry/helpers.js +1 -1
  277. package/dist/core/sentry/instrument.js +1 -1
  278. package/dist/core/session/session-state.js +1 -1
  279. package/dist/core/shared/agent-session-context.js +1 -1
  280. package/dist/core/shared/author.js +5 -1
  281. package/dist/core/shared/command-line.js +1 -1
  282. package/dist/core/shared/command-types.js +1 -1
  283. package/dist/core/shared/conflict-markers.js +1 -1
  284. package/dist/core/shared/constants.js +1 -1
  285. package/dist/core/shared/errors.js +1 -1
  286. package/dist/core/shared/html-entity-decode.js +1 -1
  287. package/dist/core/shared/index.js +1 -1
  288. package/dist/core/shared/item-metadata-contract.js +1 -1
  289. package/dist/core/shared/lazy-module.js +1 -1
  290. package/dist/core/shared/levenshtein.js +1 -1
  291. package/dist/core/shared/memo.js +1 -1
  292. package/dist/core/shared/numeric-parsers.js +1 -1
  293. package/dist/core/shared/option-alias-visibility.js +1 -1
  294. package/dist/core/shared/primitives.js +1 -1
  295. package/dist/core/shared/secret-rules.js +1 -1
  296. package/dist/core/shared/serial-queue.js +1 -1
  297. package/dist/core/shared/serialization.js +1 -1
  298. package/dist/core/shared/split-comma-list.js +1 -1
  299. package/dist/core/shared/text-normalization.js +1 -1
  300. package/dist/core/shared/time.js +2 -1
  301. package/dist/core/store/index.js +1 -1
  302. package/dist/core/store/item-format-migration.js +1 -1
  303. package/dist/core/store/item-metadata-cache.js +1 -1
  304. package/dist/core/store/item-metadata-query-index.js +7 -7
  305. package/dist/core/store/item-metadata-read-work.js +1 -1
  306. package/dist/core/store/item-store.js +1 -1
  307. package/dist/core/store/paths.js +1 -1
  308. package/dist/core/store/settings-concurrency.js +1 -1
  309. package/dist/core/store/settings-read-cache.js +1 -1
  310. package/dist/core/store/settings-validator.js +1 -1
  311. package/dist/core/store/settings.js +3 -3
  312. package/dist/core/store/tracker-preflight.js +1 -1
  313. package/dist/core/telemetry/consent.js +2 -2
  314. package/dist/core/telemetry/observability.js +1 -1
  315. package/dist/core/telemetry/policy.js +1 -1
  316. package/dist/core/telemetry/read-sampling.js +2 -2
  317. package/dist/core/telemetry/runtime.js +9 -5
  318. package/dist/core/test/background-runs.js +3 -3
  319. package/dist/core/test/item-test-run-tracking.js +1 -1
  320. package/dist/core/test/run-selectors.js +1 -1
  321. package/dist/core/validate/estimate-defaults.js +1 -1
  322. package/dist/core/validate/fix-planning.js +1 -1
  323. package/dist/core/validate/linked-artifact-reference.js +1 -1
  324. package/dist/core/validate/missing-by-type.js +1 -1
  325. package/dist/core/validate/missing-link-owners.js +1 -1
  326. package/dist/core/validate/stale-file-classification.js +1 -1
  327. package/dist/mcp/http-server.js +6 -4
  328. package/dist/mcp/legacy-adapter.js +1 -1
  329. package/dist/mcp/runtime-capabilities.js +1 -1
  330. package/dist/mcp/server.js +4 -4
  331. package/dist/mcp/tool-definitions.js +1 -1
  332. package/dist/sdk/actionability.js +1 -1
  333. package/dist/sdk/agent/closed-domain-contracts.js +1 -1
  334. package/dist/sdk/agent/command-recovery.js +1 -1
  335. package/dist/sdk/agent/command-suggestions.js +1 -1
  336. package/dist/sdk/agent/create-option-policy.js +1 -1
  337. package/dist/sdk/agent/identity-config.js +1 -1
  338. package/dist/sdk/agent/item-addressing.js +1 -1
  339. package/dist/sdk/agent/refusal-closure-census.js +2 -1
  340. package/dist/sdk/agent/refusal-closure.js +1 -1
  341. package/dist/sdk/agent/refusal-corpus-contracts.js +1 -1
  342. package/dist/sdk/agent/refusal-reachability.js +3 -1
  343. package/dist/sdk/agent/subcommand-recovery.js +1 -1
  344. package/dist/sdk/agent/task-transcript-contracts.js +1 -1
  345. package/dist/sdk/agent/tracker-preflight-contracts.js +1 -1
  346. package/dist/sdk/agent-capability-contracts.js +3 -1
  347. package/dist/sdk/agent-session-context.js +1 -1
  348. package/dist/sdk/annotations.js +1 -1
  349. package/dist/sdk/author-attribution.js +1 -1
  350. package/dist/sdk/authoring.js +1 -1
  351. package/dist/sdk/cli-bootstrap.js +1 -1
  352. package/dist/sdk/cli-contracts/agent-output-contracts.js +5 -3
  353. package/dist/sdk/cli-contracts/bootstrap-command-scanner.js +1 -1
  354. package/dist/sdk/cli-contracts/command-aliases.js +1 -1
  355. package/dist/sdk/cli-contracts/command-exit-contracts.js +1 -1
  356. package/dist/sdk/cli-contracts/commander-mutation-options.js +1 -1
  357. package/dist/sdk/cli-contracts/commander-types.js +1 -1
  358. package/dist/sdk/cli-contracts/completeness.js +1 -1
  359. package/dist/sdk/cli-contracts/enum-contracts.js +1 -1
  360. package/dist/sdk/cli-contracts/flag-contracts.js +1 -1
  361. package/dist/sdk/cli-contracts/flag-lexicon-contracts.js +2 -1
  362. package/dist/sdk/cli-contracts/grammar-contracts.js +1 -1
  363. package/dist/sdk/cli-contracts/registration-helpers.js +7 -7
  364. package/dist/sdk/cli-contracts/runtime-contracts.js +1 -1
  365. package/dist/sdk/cli-contracts/schemas/assurance-definition.js +1 -1
  366. package/dist/sdk/cli-contracts/string-lists.js +1 -1
  367. package/dist/sdk/cli-contracts/tool-option-contracts.js +1 -1
  368. package/dist/sdk/cli-contracts/tool-parameter-tables.js +1 -1
  369. package/dist/sdk/cli-contracts/tool-schema.js +1 -1
  370. package/dist/sdk/cli-contracts/typed-action-inputs.js +1 -1
  371. package/dist/sdk/cli-contracts.js +1 -1
  372. package/dist/sdk/cli-program.js +1 -1
  373. package/dist/sdk/command-line.js +1 -1
  374. package/dist/sdk/comments.js +1 -1
  375. package/dist/sdk/compile-cache.js +1 -1
  376. package/dist/sdk/completion/bash.js +2 -1
  377. package/dist/sdk/completion/fish.js +13 -7
  378. package/dist/sdk/completion/shared.js +1 -1
  379. package/dist/sdk/completion/zsh.js +14 -8
  380. package/dist/sdk/completion.js +1 -1
  381. package/dist/sdk/compose.js +1 -1
  382. package/dist/sdk/config.js +1 -1
  383. package/dist/sdk/context/recency.js +1 -1
  384. package/dist/sdk/context/semantic-session-attribution.js +1 -1
  385. package/dist/sdk/context/usage-egress.js +1 -1
  386. package/dist/sdk/context/usage-ledger.js +6 -3
  387. package/dist/sdk/context-intent-contracts.js +1 -1
  388. package/dist/sdk/context-intent-runtime.js +1 -1
  389. package/dist/sdk/context-packing.js +1 -1
  390. package/dist/sdk/context-relevance.js +1 -1
  391. package/dist/sdk/context-signal-store.js +2 -2
  392. package/dist/sdk/context-usage.js +1 -1
  393. package/dist/sdk/contracts.js +1 -1
  394. package/dist/sdk/core-governance.js +1 -1
  395. package/dist/sdk/core.js +1 -1
  396. package/dist/sdk/corpus-shape.js +1 -1
  397. package/dist/sdk/define.js +1 -1
  398. package/dist/sdk/dependencies.js +1 -1
  399. package/dist/sdk/dependency-flag-validation.js +1 -1
  400. package/dist/sdk/dependency-provenance.js +1 -1
  401. package/dist/sdk/docs.js +1 -1
  402. package/dist/sdk/duplicates.js +1 -1
  403. package/dist/sdk/environment/agent-environment.js +1 -1
  404. package/dist/sdk/environment/host-environment-errors.js +1 -1
  405. package/dist/sdk/environment/project-runtime-compatibility.js +2 -1
  406. package/dist/sdk/environment/source-context.js +1 -1
  407. package/dist/sdk/environment/tracker-preflight.js +1 -1
  408. package/dist/sdk/error-code-catalog.js +1 -1
  409. package/dist/sdk/error-runtime.js +1 -1
  410. package/dist/sdk/errors.js +1 -1
  411. package/dist/sdk/eval.js +1 -1
  412. package/dist/sdk/extension/author-manifest.js +1 -1
  413. package/dist/sdk/extension/bundled-catalog.js +1 -1
  414. package/dist/sdk/extension/concurrency.js +1 -1
  415. package/dist/sdk/extension/copy-scope.js +1 -1
  416. package/dist/sdk/extension/custom-field-collisions.js +1 -1
  417. package/dist/sdk/extension/describe.js +4 -2
  418. package/dist/sdk/extension/doctor.js +1 -1
  419. package/dist/sdk/extension/install-plan.js +1 -1
  420. package/dist/sdk/extension/install-receipts.js +1 -1
  421. package/dist/sdk/extension/install-runtime.js +3 -3
  422. package/dist/sdk/extension/install-snapshot.js +1 -1
  423. package/dist/sdk/extension/install-sources.js +5 -5
  424. package/dist/sdk/extension/managed-state.js +2 -2
  425. package/dist/sdk/extension/migrations.js +2 -2
  426. package/dist/sdk/extension/output-ownership.js +1 -1
  427. package/dist/sdk/extension/runtime-summary.js +1 -1
  428. package/dist/sdk/extension/scaffold.js +11 -4
  429. package/dist/sdk/extension/shared.js +1 -1
  430. package/dist/sdk/extension/source-resolution.js +1 -1
  431. package/dist/sdk/extension/static-inventory.js +1 -1
  432. package/dist/sdk/extension/update-check.js +1 -1
  433. package/dist/sdk/extension-command-context.js +1 -1
  434. package/dist/sdk/extension-contracts.js +1 -1
  435. package/dist/sdk/extension.js +1 -1
  436. package/dist/sdk/files.js +1 -1
  437. package/dist/sdk/flag-invocation-contracts.js +1 -1
  438. package/dist/sdk/generated/generated-error-code-catalog-part-1.js +1 -1
  439. package/dist/sdk/generated/generated-error-code-catalog-part-2.js +1 -1
  440. package/dist/sdk/generated-error-code-catalog.js +1 -1
  441. package/dist/sdk/governance/assurance-action-contracts.js +1 -1
  442. package/dist/sdk/governance/assurance-action.js +1 -1
  443. package/dist/sdk/governance/assurance-limits.js +1 -1
  444. package/dist/sdk/governance/assurance-mutation-error.js +1 -1
  445. package/dist/sdk/governance/assurance-presets.js +1 -1
  446. package/dist/sdk/governance/assurance-runtime.js +1 -1
  447. package/dist/sdk/governance/assurance.js +4 -4
  448. package/dist/sdk/governance/boundary-fixtures.js +1 -1
  449. package/dist/sdk/governance/closure-timestamps.js +1 -1
  450. package/dist/sdk/governance/coverage-assurance.js +1 -1
  451. package/dist/sdk/governance/defect-recurrence-coverage.js +1 -1
  452. package/dist/sdk/governance/defect-recurrence-graph.js +1 -1
  453. package/dist/sdk/governance/defect-recurrence-signals.js +1 -1
  454. package/dist/sdk/governance/defect-recurrence.js +1 -1
  455. package/dist/sdk/governance/extension-host-version.js +1 -1
  456. package/dist/sdk/governance/gc.js +1 -1
  457. package/dist/sdk/governance/health-merge-evidence.js +1 -1
  458. package/dist/sdk/governance/health.js +2 -1
  459. package/dist/sdk/governance/hierarchy-validation.js +1 -1
  460. package/dist/sdk/governance/linked-file-report.js +1 -1
  461. package/dist/sdk/governance/merge-receipt-history.js +1 -1
  462. package/dist/sdk/governance/provenance-health.js +4 -1
  463. package/dist/sdk/governance/reindex.js +5 -4
  464. package/dist/sdk/governance/stale-work.js +1 -1
  465. package/dist/sdk/governance/status-role-diagnostics.js +1 -1
  466. package/dist/sdk/governance/storage-integrity.js +1 -1
  467. package/dist/sdk/governance/tracked-runtime-cache.js +1 -1
  468. package/dist/sdk/governance/upgrade.js +2 -2
  469. package/dist/sdk/governance/validate-history-drift.js +1 -1
  470. package/dist/sdk/governance/validate-item-reader.js +1 -1
  471. package/dist/sdk/governance/validate-normalization.js +1 -1
  472. package/dist/sdk/governance/validate.js +1 -1
  473. package/dist/sdk/governance/workflow-completeness.js +1 -1
  474. package/dist/sdk/governance/workflow-policy.js +3 -3
  475. package/dist/sdk/governance/workspace-position.js +2 -1
  476. package/dist/sdk/governance.js +1 -1
  477. package/dist/sdk/graph/adapter.js +1 -1
  478. package/dist/sdk/graph/analytics.js +1 -1
  479. package/dist/sdk/graph/assembly.js +1 -1
  480. package/dist/sdk/graph/cache.js +1 -1
  481. package/dist/sdk/graph/centrality.js +1 -1
  482. package/dist/sdk/graph/conformance.js +1 -1
  483. package/dist/sdk/graph/deadline-scheduling.js +1 -1
  484. package/dist/sdk/graph/durable-cache.js +1 -1
  485. package/dist/sdk/graph/governance-contracts.js +1 -1
  486. package/dist/sdk/graph/governance.js +1 -1
  487. package/dist/sdk/graph/hierarchy-integrity.js +1 -1
  488. package/dist/sdk/graph/index.js +1 -1
  489. package/dist/sdk/graph/lifecycle-coverage.js +1 -1
  490. package/dist/sdk/graph/mutation-advisory.js +1 -1
  491. package/dist/sdk/graph/query-contracts.js +1 -1
  492. package/dist/sdk/graph/remediation.js +1 -1
  493. package/dist/sdk/graph/run.js +1 -1
  494. package/dist/sdk/graph/scheduling.js +1 -1
  495. package/dist/sdk/graph/traversal.js +1 -1
  496. package/dist/sdk/graph/workspace-relationship-kind-registry.js +1 -1
  497. package/dist/sdk/graph.js +1 -1
  498. package/dist/sdk/guide-topics.js +1 -1
  499. package/dist/sdk/guide.js +8 -1
  500. package/dist/sdk/history/attestation-command.js +1 -1
  501. package/dist/sdk/history/attestation-contract.js +1 -1
  502. package/dist/sdk/history/attestation-scan.js +1 -1
  503. package/dist/sdk/history/attestation.js +1 -1
  504. package/dist/sdk/history/maintenance.js +1 -1
  505. package/dist/sdk/history/salvage.js +3 -2
  506. package/dist/sdk/history/subject.js +1 -1
  507. package/dist/sdk/history-analytics.js +1 -1
  508. package/dist/sdk/history-compact.js +1 -1
  509. package/dist/sdk/history-mcp.js +1 -1
  510. package/dist/sdk/history-provenance.js +1 -1
  511. package/dist/sdk/history-read.js +1 -1
  512. package/dist/sdk/history-redact.js +1 -1
  513. package/dist/sdk/history-repair.js +1 -1
  514. package/dist/sdk/improvement-ledger-validation.js +1 -1
  515. package/dist/sdk/improvement-ledger.js +2 -2
  516. package/dist/sdk/index.js +1 -1
  517. package/dist/sdk/init-agent-guidance.js +16 -2
  518. package/dist/sdk/init.js +16 -2
  519. package/dist/sdk/invocation-author.js +1 -1
  520. package/dist/sdk/item-children.js +1 -1
  521. package/dist/sdk/item-metadata-index.js +1 -1
  522. package/dist/sdk/item-schedule.js +1 -1
  523. package/dist/sdk/item-transaction.js +1 -1
  524. package/dist/sdk/learnings.js +1 -1
  525. package/dist/sdk/lifecycle/append.js +4 -2
  526. package/dist/sdk/lifecycle/claim.js +1 -1
  527. package/dist/sdk/lifecycle/close-many.js +1 -1
  528. package/dist/sdk/lifecycle/close.js +1 -1
  529. package/dist/sdk/lifecycle/copy.js +1 -1
  530. package/dist/sdk/lifecycle/create.js +1 -1
  531. package/dist/sdk/lifecycle/delete.js +1 -1
  532. package/dist/sdk/lifecycle/event-validation-messages.js +1 -1
  533. package/dist/sdk/lifecycle/focus.js +1 -1
  534. package/dist/sdk/lifecycle/hierarchy-mutation-lock.js +1 -1
  535. package/dist/sdk/lifecycle/legacy-none-tokens.js +1 -1
  536. package/dist/sdk/lifecycle/lifecycle-transitions.js +1 -1
  537. package/dist/sdk/lifecycle/mcp-actions.js +1 -1
  538. package/dist/sdk/lifecycle/metadata-normalizers.js +1 -1
  539. package/dist/sdk/lifecycle/mutation-command-options.js +1 -1
  540. package/dist/sdk/lifecycle/plan-mutation-receipt.js +1 -1
  541. package/dist/sdk/lifecycle/plan.js +1 -1
  542. package/dist/sdk/lifecycle/recurrence-parsers.js +1 -1
  543. package/dist/sdk/lifecycle/reopen.js +1 -1
  544. package/dist/sdk/lifecycle/repeatable-metadata-parsers.js +2 -1
  545. package/dist/sdk/lifecycle/restore.js +1 -1
  546. package/dist/sdk/lifecycle/shared-unset-fields.js +1 -1
  547. package/dist/sdk/lifecycle/task-composition.js +1 -1
  548. package/dist/sdk/lifecycle/update-many.js +1 -1
  549. package/dist/sdk/lifecycle/update.js +2 -1
  550. package/dist/sdk/lifecycle-completion.js +1 -1
  551. package/dist/sdk/lifecycle-policy.js +1 -1
  552. package/dist/sdk/linked-artifacts.js +2 -1
  553. package/dist/sdk/mcp/apps.js +1 -1
  554. package/dist/sdk/mcp/authorization.js +1 -1
  555. package/dist/sdk/mcp/discovery.js +1 -1
  556. package/dist/sdk/mcp/interactions.js +1 -1
  557. package/dist/sdk/mcp/protocol.js +1 -1
  558. package/dist/sdk/mcp/skills.js +3 -1
  559. package/dist/sdk/mcp/subscriptions.js +1 -1
  560. package/dist/sdk/mcp/tasks.js +2 -2
  561. package/dist/sdk/mcp/transport.js +1 -1
  562. package/dist/sdk/merge/abandoned-receipts.js +1 -1
  563. package/dist/sdk/merge/driver.js +1 -1
  564. package/dist/sdk/merge/index.js +1 -1
  565. package/dist/sdk/merge/install.js +4 -2
  566. package/dist/sdk/merge/receipt-file-boundary.js +1 -1
  567. package/dist/sdk/merge/receipt-operation.js +1 -1
  568. package/dist/sdk/merge/receipt-schema.js +1 -1
  569. package/dist/sdk/merge/receipts.js +4 -4
  570. package/dist/sdk/merge/reconcile.js +1 -1
  571. package/dist/sdk/merge/three-way.js +3 -2
  572. package/dist/sdk/merge/worktree-config.js +1 -1
  573. package/dist/sdk/merge.js +1 -1
  574. package/dist/sdk/mutation-events.js +1 -1
  575. package/dist/sdk/mutation-guard.js +1 -1
  576. package/dist/sdk/notes.js +1 -1
  577. package/dist/sdk/output-contracts.js +1 -1
  578. package/dist/sdk/output-projection.js +1 -1
  579. package/dist/sdk/output-token-accounting.js +1 -1
  580. package/dist/sdk/output.js +2 -1
  581. package/dist/sdk/ownership-source.js +1 -1
  582. package/dist/sdk/package-import-adapters.js +1 -1
  583. package/dist/sdk/package-migrations.js +1 -1
  584. package/dist/sdk/package-runtime-options.js +1 -1
  585. package/dist/sdk/pagination.js +1 -1
  586. package/dist/sdk/profile.js +5 -1
  587. package/dist/sdk/provenance.js +1 -1
  588. package/dist/sdk/public-surface.json +1 -1
  589. package/dist/sdk/query/activity.js +1 -1
  590. package/dist/sdk/query/aggregate.js +1 -1
  591. package/dist/sdk/query/calendar.js +4 -1
  592. package/dist/sdk/query/complete-list.js +1 -1
  593. package/dist/sdk/query/context.js +2 -1
  594. package/dist/sdk/query/duplicate-candidates.js +1 -1
  595. package/dist/sdk/query/get.d.ts +14 -2
  596. package/dist/sdk/query/get.js +1 -1
  597. package/dist/sdk/query/history.js +1 -1
  598. package/dist/sdk/query/item-filter-options.js +1 -1
  599. package/dist/sdk/query/light-metadata.js +1 -1
  600. package/dist/sdk/query/list-filter-shared.js +1 -1
  601. package/dist/sdk/query/list.js +1 -1
  602. package/dist/sdk/query/multi-value-filters.js +1 -1
  603. package/dist/sdk/query/next-ready-budget.js +1 -1
  604. package/dist/sdk/query/next.js +2 -1
  605. package/dist/sdk/query/parsers.js +1 -1
  606. package/dist/sdk/query/projection-contracts.js +1 -1
  607. package/dist/sdk/query/search/corpus.js +2 -1
  608. package/dist/sdk/query/search/filters.js +1 -1
  609. package/dist/sdk/query/search/input.js +1 -1
  610. package/dist/sdk/query/search/lexical.js +1 -1
  611. package/dist/sdk/query/search/response.js +1 -1
  612. package/dist/sdk/query/search/semantic.js +3 -2
  613. package/dist/sdk/query/search/types.js +1 -1
  614. package/dist/sdk/query/search-contracts.js +1 -1
  615. package/dist/sdk/query/search-pagination.js +1 -1
  616. package/dist/sdk/query/search-rendering.js +1 -1
  617. package/dist/sdk/query/search.js +1 -1
  618. package/dist/sdk/query/workspace-contracts.js +1 -1
  619. package/dist/sdk/query.js +1 -1
  620. package/dist/sdk/read-output/continuation.js +1 -1
  621. package/dist/sdk/read-output/options.js +1 -1
  622. package/dist/sdk/read-output/provenance.js +1 -1
  623. package/dist/sdk/read-output-budget.js +1 -1
  624. package/dist/sdk/read-output-contracts.js +1 -1
  625. package/dist/sdk/read-output-rows.js +1 -1
  626. package/dist/sdk/read-output-session.js +1 -1
  627. package/dist/sdk/relationship-analytics.js +1 -1
  628. package/dist/sdk/relationship-context.js +1 -1
  629. package/dist/sdk/relationship-history.js +7 -4
  630. package/dist/sdk/relationship-kinds/contract.js +1 -1
  631. package/dist/sdk/relationship-migration.js +1 -1
  632. package/dist/sdk/relationships.js +1 -1
  633. package/dist/sdk/reproducibility/process.js +1 -1
  634. package/dist/sdk/runtime/actions.js +1 -1
  635. package/dist/sdk/runtime/context.js +1 -1
  636. package/dist/sdk/runtime/schema-preview.js +1 -1
  637. package/dist/sdk/runtime/schema.js +1 -1
  638. package/dist/sdk/runtime-action-aliases.js +1 -1
  639. package/dist/sdk/runtime-extended-actions.js +1 -1
  640. package/dist/sdk/runtime-input.js +1 -1
  641. package/dist/sdk/runtime-primitives.js +1 -1
  642. package/dist/sdk/runtime-public-contracts.js +1 -1
  643. package/dist/sdk/runtime-stats-options.js +1 -1
  644. package/dist/sdk/runtime.js +1 -1
  645. package/dist/sdk/scheduling-shortcuts.js +1 -1
  646. package/dist/sdk/schema-migration.js +4 -3
  647. package/dist/sdk/schema.js +7 -1
  648. package/dist/sdk/search-refresh-worker.js +1 -1
  649. package/dist/sdk/similarity-scoring.js +1 -1
  650. package/dist/sdk/similarity.js +1 -1
  651. package/dist/sdk/start-task-status.js +1 -1
  652. package/dist/sdk/stats.js +1 -1
  653. package/dist/sdk/structured-mutations.js +1 -1
  654. package/dist/sdk/telemetry-flush.js +1 -1
  655. package/dist/sdk/telemetry.js +4 -3
  656. package/dist/sdk/templates.js +26 -2
  657. package/dist/sdk/test/batch.js +2 -2
  658. package/dist/sdk/test/entry.js +1 -1
  659. package/dist/sdk/test/execution.js +6 -5
  660. package/dist/sdk/test/json-path.js +1 -1
  661. package/dist/sdk/test/linked-command-detection.js +1 -1
  662. package/dist/sdk/test/measurements.js +1 -1
  663. package/dist/sdk/test/parsers.js +1 -1
  664. package/dist/sdk/test/runs.js +1 -1
  665. package/dist/sdk/test/trust.js +2 -2
  666. package/dist/sdk/test/workspace-snapshot.js +1 -1
  667. package/dist/sdk/testing.js +7 -4
  668. package/dist/sdk/traceability/runtime-files-lookup.js +1 -1
  669. package/dist/sdk/traceability/source-traceability.js +2 -1
  670. package/dist/sdk/tracker-root-discovery.js +1 -1
  671. package/dist/sdk/workspace-contracts-cache.js +1 -1
  672. package/dist/sdk/workspace-contracts.js +1 -1
  673. package/dist/sdk/workspace-memory.js +2 -2
  674. package/dist/sdk/workspace-recipe.js +1 -1
  675. package/dist/sdk/workspace-snapshot.js +5 -4
  676. package/dist/sdk/workspace-transaction-gc.js +1 -1
  677. package/dist/sdk/workspace-transaction.js +2 -2
  678. package/dist/sdk/workspace.js +3 -2
  679. package/dist/types/index.js +1 -1
  680. package/dist/types.js +1 -1
  681. package/docs/AGENT_EVIDENCE_CONSISTENCY.md +88 -0
  682. package/docs/GET_READ_EVIDENCE.md +68 -0
  683. package/docs/README.md +2 -0
  684. package/marketplace.json +2 -2
  685. package/package.json +1 -1
  686. package/packages/pm-beads/package.json +1 -1
  687. package/packages/pm-calendar/package.json +1 -1
  688. package/packages/pm-command-kit/package.json +1 -1
  689. package/packages/pm-digital-twin/package.json +1 -1
  690. package/packages/pm-governance-audit/package.json +1 -1
  691. package/packages/pm-guide-shell/package.json +1 -1
  692. package/packages/pm-kanban/package.json +1 -1
  693. package/packages/pm-lifecycle-hooks/package.json +1 -1
  694. package/packages/pm-linked-test-adapters/package.json +1 -1
  695. package/packages/pm-search-advanced/package.json +1 -1
  696. package/packages/pm-templates/package.json +1 -1
  697. package/packages/pm-todos/package.json +1 -1
  698. package/packages/pm-vcs/extensions/vcs/index.ts +4 -2
  699. package/packages/pm-vcs/package.json +1 -1
  700. package/plugins/pm-claude/.claude-plugin/plugin.json +1 -1
  701. package/plugins/pm-claude/package.json +2 -2
  702. package/plugins/pm-codex/.codex-plugin/plugin.json +1 -1
  703. package/plugins/pm-codex/package.json +2 -2
  704. package/plugins/pm-codex/plugin.json +1 -1
  705. package/scripts/finalize-build.mjs +3 -2
  706. package/dist/cli-bundle/chunks/chunk-7UVXKI7K.js +0 -2
  707. package/dist/cli-bundle/chunks/chunk-D7Z2ZMJL.js +0 -3
  708. package/dist/cli-bundle/chunks/chunk-DEZPZOQ7.js +0 -2
  709. package/dist/cli-bundle/chunks/chunk-J52QIRRZ.js +0 -80
  710. package/dist/cli-bundle/chunks/chunk-JDKD3WGG.js +0 -6
  711. package/dist/cli-bundle/chunks/chunk-JQ7DW663.js +0 -2
  712. package/dist/cli-bundle/chunks/chunk-QXIDOOWT.js +0 -20
  713. package/dist/cli-bundle/chunks/chunk-SGFQQXFD.js +0 -2
  714. package/dist/cli-bundle/chunks/chunk-V3U77H3V.js +0 -31
  715. package/dist/cli-bundle/chunks/chunk-XZDWAYJC.js +0 -3
  716. package/dist/cli-bundle/chunks/chunk-Y6VRBTP3.js +0 -238
  717. package/dist/cli-bundle/chunks/chunk-YAAFYFS4.js +0 -8
  718. package/dist/cli-bundle/chunks/register-mutation-53ZLT4RX.js +0 -20
  719. package/dist/cli-bundle/chunks/register-operations-OBK2FXUU.js +0 -2
  720. package/dist/cli-bundle/chunks/register-setup-HM3OCBH2.js +0 -2
  721. package/dist/cli-bundle/focused-chunks/chunk-2JFYR56O.js +0 -2
  722. package/dist/cli-bundle/focused-chunks/chunk-32EVUSS4.js +0 -8
  723. package/dist/cli-bundle/focused-chunks/chunk-5GUSO2P4.js +0 -20
  724. package/dist/cli-bundle/focused-chunks/chunk-6XBRADQQ.js +0 -3
  725. package/dist/cli-bundle/focused-chunks/chunk-CURTIIQT.js +0 -2
  726. package/dist/cli-bundle/focused-chunks/chunk-IJUWEEEB.js +0 -6
  727. package/dist/cli-bundle/focused-chunks/chunk-JMJK2L4Z.js +0 -3
  728. package/dist/cli-bundle/focused-chunks/chunk-KG3H4UZZ.js +0 -30
  729. package/dist/cli-bundle/focused-chunks/chunk-MHQ2XICU.js +0 -2
  730. package/dist/cli-bundle/focused-chunks/chunk-RJV6QVJE.js +0 -75
  731. package/dist/cli-bundle/focused-chunks/chunk-ZE2JZ7R6.js +0 -12
  732. package/dist/cli-bundle/focused-chunks/chunk-ZLEN4HZD.js +0 -165
@@ -1,2 +1,3 @@
1
- !(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]="c088edd0-4756-5c13-abac-468cf6a008df")}catch(e2){}})();import{assertInitializedTracker}from"../environment/tracker-preflight.js";import{resolveMutationStdinTokenFields}from"../../core/item/parse.js";import{COMMON_MUTATION_COMMAND_OPTION_KEYS,canonicalizeCommandOptionKey,commandOptionFlagLabel,resolveItemTypeRegistry,resolveCommandOptionPolicyState,resolveTypeDefinition,resolveTypeName,validateTypeOptions,normalizeItemId,toItemRecord,buildInvalidTypeError,assertParentReferenceIsNotSelf,normalizeParentReferenceValue,validateMissingParentReference,validateSprintOrReleaseValue,applyAcceptanceCriteriaMutations,applyTagRemovals,assertNoUnknownCsvKeys,looksLikeGenericKeyValueEntry,mergeAdditiveTags,parseCsvKv,parseOptionalNonNegativeInteger,parseOptionalNumber,parseTags,shouldResolveMutationStdinTokens,transferMutationStdinTokenPolicy,splitAcceptanceCriteria,resolvePriority,normalizeStatusInput,isTerminalStatus,collectRuntimeUpdateFieldValues,resolveItemTypesFilePath,resolveRuntimeFieldRegistry,resolveRuntimeStatusRegistry,describeAllowedTransitions,evaluateTransition,resolveTypeWorkflows,EXIT_CODE,PmCliError,stableValueEquals,resolveIsoOrRelative,getActiveExtensionRegistrations,collectRegisteredItemFieldNames,applyRegisteredItemFieldDefaultsAndValidation,parseRegisteredItemFieldAssignments,buildItemNotFoundError,listAllItemMetadataLight,locateItem,readLocatedItem,resolvePmRoot,readSettings,resolveAuthor}from"../runtime-primitives.js";import{mutateItemWithHistoryContextResolver}from"../../core/store/item-store.js";import{runClose}from"./close.js";import{normalizeRiskInput,normalizeSeverityInput,parseConfidenceInput,parseRegressionInput}from"./metadata-normalizers.js";import{applyLegacyNoneCollectionNormalizers,createLegacyNoneCollectionNormalizers,assertNoLegacyNoneToken,assertNoLegacyNoneTokens,isLegacyNoneToken}from"./legacy-none-tokens.js";import{ensureEnumValue as ensureEnum}from"./recurrence-parsers.js";import{parseEventEntries,parseReminderEntries,parseTypeOptionEntries}from"./repeatable-metadata-parsers.js";import{assertDependencyEdgesAllowed,assertDependencyTargetsResolvable,assertValidBareDependencyFlagValue}from"../dependency-flag-validation.js";import{normalizeDependencySeedId,normalizeItemReference,isExternalDependencyReference,normalizeDependencySourceKind}from"../dependency-provenance.js";import{resolveCanonicalRelationshipKind}from"../relationships.js";import{collectNewOrderingCycleWarnings}from"../graph/mutation-advisory.js";import{assertHierarchyMutationAllowed}from"../graph/hierarchy-integrity.js";import{resolveWorkspaceRelationshipKindRegistry}from"../graph/assembly.js";import{acquireHierarchyMutationLock}from"./hierarchy-mutation-lock.js";import{DEPENDENCY_KIND_VALUES,ISSUE_SEVERITY_VALUES,RISK_VALUES}from"../../types/index.js";import{parseDocs,parseFiles,parseLogSeed,parseTests,requireStringOption}from"./create.js";import{attachLinkedTestMutationProvenance}from"../test/trust.js";import{COMMON_UNSET_FIELD_DEFINITIONS_AFTER_CLOSE_REASON_BEFORE_AUTHOR,COMMON_UNSET_FIELD_DEFINITIONS_AFTER_AUTHOR,COMMON_UNSET_FIELD_DEFINITIONS_BEFORE_CLOSE_REASON,parseCommandUnsetTargets,resolveRuntimeUnsetFieldDefinition}from"./shared-unset-fields.js";const UPDATE_UNSET_FIELD_DEFINITIONS=[...COMMON_UNSET_FIELD_DEFINITIONS_BEFORE_CLOSE_REASON,{canonical:"close-reason",aliases:["close_reason","close-reason"],optionKey:"closeReason",metadataKey:"close_reason"},...COMMON_UNSET_FIELD_DEFINITIONS_AFTER_CLOSE_REASON_BEFORE_AUTHOR,...COMMON_UNSET_FIELD_DEFINITIONS_AFTER_AUTHOR];const UPDATE_UNSET_ALIAS_MAP=(()=>{const map=new Map;for(const definition of UPDATE_UNSET_FIELD_DEFINITIONS){for(const alias of definition.aliases){map.set(alias,{optionKey:definition.optionKey,metadataKey:definition.metadataKey})}}return map})();const UPDATE_OPTION_KEY_TO_UNSET_CANONICAL=new Map(UPDATE_UNSET_FIELD_DEFINITIONS.map(definition=>[definition.optionKey,definition.canonical]));const UPDATE_UNSET_SUPPORTED_CANONICAL_FIELDS=UPDATE_UNSET_FIELD_DEFINITIONS.map(definition=>definition.canonical).sort((left,right)=>left.localeCompare(right)).join(", ");const OWNERSHIP_BYPASS_DISALLOWED_UNSET_ITEM_METADATA_KEYS=new Set(["close_reason","assignee","parent","blocked_by","blocked_reason","unblock_note","dependencies","comments","notes","learnings","files","tests","docs","reminders","events"]);const UPDATE_LEGACY_NONE_COLLECTION_NORMALIZERS=createLegacyNoneCollectionNormalizers({depDisableFlagKey:"replaceDeps",fileDisableFlagKey:"replaceFiles",testDisableFlagKey:"replaceTests",docDisableFlagKey:"replaceDocs"});function normalizeLegacyNoneUpdateOptions(options){const normalized={...options,unset:options.unset?[...options.unset]:void 0};const appendUnsetTarget=value=>{const current=normalized.unset?[...normalized.unset]:[];if(!current.includes(value)){current.push(value)}normalized.unset=current};const scalarOptionKeys=new Set([...UPDATE_OPTION_KEY_TO_UNSET_CANONICAL.keys(),"rank"]);for(const optionKey of scalarOptionKeys){const candidate=normalized[optionKey];if(typeof candidate!=="string"||!isLegacyNoneToken(candidate)){continue}const canonicalUnset=optionKey==="rank"?"order":UPDATE_OPTION_KEY_TO_UNSET_CANONICAL.get(optionKey)??optionKey;appendUnsetTarget(canonicalUnset);normalized[optionKey]=void 0}return transferMutationStdinTokenPolicy(options,applyLegacyNoneCollectionNormalizers(normalized,UPDATE_LEGACY_NONE_COLLECTION_NORMALIZERS))}function parseUpdateUnsetTargets(raw,runtimeFieldRegistry,extensionFieldNames=[]){return parseCommandUnsetTargets({raw,supportedFields:UPDATE_UNSET_SUPPORTED_CANONICAL_FIELDS,resolveDefinition:trimmed=>{const extensionFieldName=extensionFieldNames.find(fieldName=>{const normalizedFieldName=fieldName.toLowerCase();return normalizedFieldName===trimmed||normalizedFieldName.replaceAll("_","-")===trimmed||normalizedFieldName.replaceAll("-","_")===trimmed});const definition=UPDATE_UNSET_ALIAS_MAP.get(trimmed)??resolveRuntimeUnsetFieldDefinition(trimmed,"update",runtimeFieldRegistry)??(extensionFieldName?{optionKey:"field",metadataKey:extensionFieldName}:void 0);return definition}})}const OWNERSHIP_BYPASS_RESTRICTED_FLAG_REPLACEMENTS=new Map([["--comment",id=>`pm comments ${id} --add "<text>" --force`],["--file",id=>`pm files ${id} --add "path=<path>,scope=<scope>,note=<note>" --force`],["--doc",id=>`pm docs ${id} --add "path=<path>,scope=<scope>,note=<note>" --force`]]);function buildOwnershipBypassRestrictedOptionsError(params){const replacementCommands=params.disallowedFlags.flatMap(flag=>{const replacement=OWNERSHIP_BYPASS_RESTRICTED_FLAG_REPLACEMENTS.get(flag);return replacement?[replacement(params.id)]:[]});const replacementSteps=params.disallowedFlags.flatMap(flag=>{const replacement=OWNERSHIP_BYPASS_RESTRICTED_FLAG_REPLACEMENTS.get(flag);return replacement?[`Replace ${flag} with: ${replacement(params.id)}`]:[]});return new PmCliError(params.message,EXIT_CODE.USAGE,{code:params.code,required:params.required,why:params.why,...replacementCommands.length>0?{examples:replacementCommands}:{},nextSteps:[`Re-run without: ${params.disallowedFlags.join(", ")}`,...replacementSteps]})}function enforceOwnershipBypassScope(id,options,clearItemMetadataKeys){const ownershipMetadataBypass=options.ownershipMetadataBypass===true;const ownershipDependencyBypass=options.ownershipDependencyBypass===true;if(!ownershipMetadataBypass&&!ownershipDependencyBypass){return}if(ownershipMetadataBypass&&ownershipDependencyBypass){throw new PmCliError("Choose only one package-provided ownership bypass mode.",EXIT_CODE.USAGE)}const pushIf=(condition,flag,list)=>{if(condition){list.push(flag)}};if(ownershipDependencyBypass){const disallowedFlags2=[];pushIf(options.title!==void 0,"--title",disallowedFlags2);pushIf(options.description!==void 0,"--description",disallowedFlags2);pushIf(options.body!==void 0,"--body",disallowedFlags2);pushIf(options.status!==void 0,"--status",disallowedFlags2);pushIf(options.closeReason!==void 0,"--close-reason",disallowedFlags2);pushIf(options.priority!==void 0,"--priority",disallowedFlags2);pushIf(options.type!==void 0,"--type",disallowedFlags2);pushIf(options.tags!==void 0,"--tags",disallowedFlags2);pushIf(Array.isArray(options.addTags)&&options.addTags.length>0,"--add-tags",disallowedFlags2);pushIf(Array.isArray(options.removeTags)&&options.removeTags.length>0,"--remove-tags",disallowedFlags2);pushIf(options.deadline!==void 0,"--deadline",disallowedFlags2);pushIf(options.estimatedMinutes!==void 0,"--estimate",disallowedFlags2);pushIf(options.acceptanceCriteria!==void 0,"--acceptance-criteria",disallowedFlags2);pushIf(Array.isArray(options.addAc)&&options.addAc.length>0,"--add-ac",disallowedFlags2);pushIf(Array.isArray(options.removeAc)&&options.removeAc.length>0,"--remove-ac",disallowedFlags2);pushIf(options.definitionOfReady!==void 0,"--definition-of-ready",disallowedFlags2);pushIf(options.order!==void 0||options.rank!==void 0,"--order/--rank",disallowedFlags2);pushIf(options.goal!==void 0,"--goal",disallowedFlags2);pushIf(options.objective!==void 0,"--objective",disallowedFlags2);pushIf(options.value!==void 0,"--value",disallowedFlags2);pushIf(options.impact!==void 0,"--impact",disallowedFlags2);pushIf(options.outcome!==void 0,"--outcome",disallowedFlags2);pushIf(options.whyNow!==void 0,"--why-now",disallowedFlags2);pushIf(options.assignee!==void 0,"--assignee",disallowedFlags2);pushIf(options.parent!==void 0,"--parent",disallowedFlags2);pushIf(options.reviewer!==void 0,"--reviewer",disallowedFlags2);pushIf(options.risk!==void 0,"--risk",disallowedFlags2);pushIf(options.confidence!==void 0,"--confidence",disallowedFlags2);pushIf(options.sprint!==void 0,"--sprint",disallowedFlags2);pushIf(options.release!==void 0,"--release",disallowedFlags2);pushIf(options.blockedBy!==void 0,"--blocked-by",disallowedFlags2);pushIf(options.blockedReason!==void 0,"--blocked-reason",disallowedFlags2);pushIf(options.unblockNote!==void 0,"--unblock-note",disallowedFlags2);pushIf(options.reporter!==void 0,"--reporter",disallowedFlags2);pushIf(options.severity!==void 0,"--severity",disallowedFlags2);pushIf(options.environment!==void 0,"--environment",disallowedFlags2);pushIf(options.reproSteps!==void 0,"--repro-steps",disallowedFlags2);pushIf(options.resolution!==void 0,"--resolution",disallowedFlags2);pushIf(options.expectedResult!==void 0,"--expected-result",disallowedFlags2);pushIf(options.actualResult!==void 0,"--actual-result",disallowedFlags2);pushIf(options.affectedVersion!==void 0,"--affected-version",disallowedFlags2);pushIf(options.fixedVersion!==void 0,"--fixed-version",disallowedFlags2);pushIf(options.component!==void 0,"--component",disallowedFlags2);pushIf(options.regression!==void 0,"--regression",disallowedFlags2);pushIf(options.customerImpact!==void 0,"--customer-impact",disallowedFlags2);pushIf(options.depRemove!==void 0,"--dep-remove",disallowedFlags2);pushIf(options.replaceDeps===true,"--replace-deps",disallowedFlags2);pushIf(options.replaceTests===true,"--replace-tests",disallowedFlags2);pushIf(options.replaceFiles===true,"--replace-files",disallowedFlags2);pushIf(options.replaceDocs===true,"--replace-docs",disallowedFlags2);pushIf(options.comment!==void 0,"--comment",disallowedFlags2);pushIf(options.note!==void 0,"--note",disallowedFlags2);pushIf(options.learning!==void 0,"--learning",disallowedFlags2);pushIf(options.file!==void 0,"--file",disallowedFlags2);pushIf(options.test!==void 0,"--test",disallowedFlags2);pushIf(options.doc!==void 0,"--doc",disallowedFlags2);pushIf(options.reminder!==void 0,"--reminder",disallowedFlags2);pushIf(options.event!==void 0,"--event",disallowedFlags2);pushIf(options.typeOption!==void 0,"--type-option",disallowedFlags2);pushIf(options.clearDeps===true,"--clear-deps",disallowedFlags2);pushIf(options.clearComments===true,"--clear-comments",disallowedFlags2);pushIf(options.clearNotes===true,"--clear-notes",disallowedFlags2);pushIf(options.clearLearnings===true,"--clear-learnings",disallowedFlags2);pushIf(options.clearFiles===true,"--clear-files",disallowedFlags2);pushIf(options.clearTests===true,"--clear-tests",disallowedFlags2);pushIf(options.clearDocs===true,"--clear-docs",disallowedFlags2);pushIf(options.clearReminders===true,"--clear-reminders",disallowedFlags2);pushIf(options.clearEvents===true,"--clear-events",disallowedFlags2);pushIf(options.clearTypeOptions===true,"--clear-type-options",disallowedFlags2);pushIf(options.force===true,"--force",disallowedFlags2);pushIf(clearItemMetadataKeys.size>0,"--unset",disallowedFlags2);if(options.dep===void 0||options.dep.length===0){throw new PmCliError("The dependency ownership bypass requires at least one --dep value",EXIT_CODE.USAGE)}if(disallowedFlags2.length>0){throw buildOwnershipBypassRestrictedOptionsError({id,code:"ownership_dependency_bypass_restricted_options",message:`The dependency ownership bypass supports append-only dependency additions via --dep. Remove restricted options: ${disallowedFlags2.join(", ")}`,required:"Pass only --dep additions (plus --message/--author) with the dependency ownership bypass.",why:"the dependency ownership bypass is a narrow non-owner override scoped to append-only dependency additions; every other mutation keeps its normal ownership rules.",disallowedFlags:disallowedFlags2})}return}const disallowedFlags=[];pushIf(options.status!==void 0,"--status",disallowedFlags);pushIf(options.closeReason!==void 0,"--close-reason",disallowedFlags);pushIf(options.assignee!==void 0,"--assignee",disallowedFlags);pushIf(options.parent!==void 0,"--parent",disallowedFlags);pushIf(options.blockedBy!==void 0,"--blocked-by",disallowedFlags);pushIf(options.blockedReason!==void 0,"--blocked-reason",disallowedFlags);pushIf(options.unblockNote!==void 0,"--unblock-note",disallowedFlags);pushIf(options.dep!==void 0,"--dep",disallowedFlags);pushIf(options.depRemove!==void 0,"--dep-remove",disallowedFlags);pushIf(options.replaceDeps===true,"--replace-deps",disallowedFlags);pushIf(options.replaceTests===true,"--replace-tests",disallowedFlags);pushIf(options.replaceFiles===true,"--replace-files",disallowedFlags);pushIf(options.replaceDocs===true,"--replace-docs",disallowedFlags);pushIf(options.note!==void 0,"--note",disallowedFlags);pushIf(options.learning!==void 0,"--learning",disallowedFlags);pushIf(options.test!==void 0,"--test",disallowedFlags);pushIf(options.reminder!==void 0,"--reminder",disallowedFlags);pushIf(options.event!==void 0,"--event",disallowedFlags);pushIf(options.clearDeps===true,"--clear-deps",disallowedFlags);pushIf(options.clearComments===true,"--clear-comments",disallowedFlags);pushIf(options.clearNotes===true,"--clear-notes",disallowedFlags);pushIf(options.clearLearnings===true,"--clear-learnings",disallowedFlags);pushIf(options.clearFiles===true,"--clear-files",disallowedFlags);pushIf(options.clearTests===true,"--clear-tests",disallowedFlags);pushIf(options.clearDocs===true,"--clear-docs",disallowedFlags);pushIf(options.clearReminders===true,"--clear-reminders",disallowedFlags);pushIf(options.clearEvents===true,"--clear-events",disallowedFlags);const disallowedUnset=[...clearItemMetadataKeys].filter(field=>OWNERSHIP_BYPASS_DISALLOWED_UNSET_ITEM_METADATA_KEYS.has(field)).sort((left,right)=>left.localeCompare(right)).map(field=>`--unset ${field.replaceAll("_","-")}`);disallowedFlags.push(...disallowedUnset);if(disallowedFlags.length>0){throw buildOwnershipBypassRestrictedOptionsError({id,code:"ownership_metadata_bypass_restricted_options",message:`The metadata ownership bypass only supports non-lifecycle metadata fields and evidence appends. Remove restricted options: ${disallowedFlags.join(", ")}`,required:"Limit the metadata ownership bypass to non-lifecycle metadata fields plus append-only --comment/--file/--doc evidence; route restricted appends and lifecycle changes through their dedicated commands.",why:"the metadata ownership bypass is a non-owner override scoped to metadata maintenance and append-only evidence; lifecycle, ownership, dependency mutations, restricted append fields, and clear/replace operations keep their normal ownership rules.",disallowedFlags})}}function parseStatus(value,statusRegistry){const normalized=normalizeStatusInput(value,statusRegistry);if(!normalized){const allowedStatuses=statusRegistry.definitions.map(definition=>definition.id);throw new PmCliError(`Invalid --status value "${value}". Allowed: ${allowedStatuses.join(", ")}`,EXIT_CODE.USAGE)}return normalized}function enforceTypeWorkflowTransition(params){if(params.enforcement==="off"||params.typeWorkflows.length===0){return void 0}const result=evaluateTransition({typeName:params.typeName,fromStatus:params.fromStatus,toStatus:params.toStatus,typeWorkflows:params.typeWorkflows,statusRegistry:params.statusRegistry});if(!result.hasRule||result.allowed){return void 0}const normalizedFrom=normalizeStatusInput(params.fromStatus,params.statusRegistry)??params.fromStatus;const normalizedTo=normalizeStatusInput(params.toStatus,params.statusRegistry)??params.toStatus;const message=`Disallowed transition for type "${params.typeName}": ${normalizedFrom} -> ${normalizedTo}. Allowed transitions: ${describeAllowedTransitions(result.allowedTransitions)}.`;if(params.enforcement==="strict"){throw new PmCliError(message,EXIT_CODE.USAGE)}return`workflow_transition_not_allowed: ${message}`}function parseDependencyCreatedAt(value,currentIso){if(!value||value.trim()===""||value.trim().toLowerCase()==="now"){return currentIso}return normalizeDependencyTimestamp(value)}function normalizeDependencyTimestamp(value){const parsed=Date.parse(value);if(!Number.isFinite(parsed)){throw new PmCliError(`Invalid dependency created_at timestamp "${value}"`,EXIT_CODE.USAGE)}return new Date(parsed).toISOString()}function parseOptionalDependencyString(value){if(value===void 0)return void 0;const trimmed=value.trim();return trimmed.length>0?trimmed:void 0}const DEP_ADDITION_KEYS=["id","kind","type","author","created_at","source_kind"];const DEP_REMOVE_KEYS=["id","kind","type","author","created_at","source_kind"];function looksLikeStructuredDependencyEntry(raw){if(raw.startsWith("```")||raw.includes("\n")){return true}if(/^(?:[-*+]\s+)?(?:id|kind|type|author|created_at|source_kind)\s*[:=]/i.test(raw)){return true}return looksLikeGenericKeyValueEntry(raw)}function normalizeDependencyKindInput(raw){return typeof raw==="string"?resolveCanonicalRelationshipKind(raw)??raw.trim():raw}function parseDependencyAdditions(raw,prefix,nowIso,fallbackAuthor){if(!raw){return{additions:[]}}assertNoLegacyNoneTokens(raw,"--dep","Use --clear-deps to clear dependencies.");const additions=raw.map(entry=>{const trimmedEntry=entry.trim();const isStructured=looksLikeStructuredDependencyEntry(trimmedEntry);assertValidBareDependencyFlagValue(trimmedEntry,isStructured);const kv=isStructured?parseCsvKv(entry,"--dep"):{id:trimmedEntry,kind:"related"};if(isStructured){assertNoUnknownCsvKeys(kv,"--dep",DEP_ADDITION_KEYS)}const id=kv.id?.trim();const kind=normalizeDependencyKindInput((kv.kind??kv.type)?.trim());if(!id||!kind){throw new PmCliError("--dep requires id and kind, or a bare item id to add a related dependency",EXIT_CODE.USAGE)}if(id.toLowerCase()==="undefined"){throw new PmCliError(`--dep id must not use placeholder token "${id}". Use --clear-deps to clear dependencies.`,EXIT_CODE.USAGE)}const sourceKind=normalizeDependencySourceKind(parseOptionalDependencyString(kv.source_kind));const explicitAuthor=parseOptionalDependencyString(kv.author);return{id:normalizeDependencySeedId(id,prefix,sourceKind),kind:ensureEnum(kind,DEPENDENCY_KIND_VALUES,"dependency kind","kind"),created_at:parseDependencyCreatedAt(kv.created_at,nowIso),author:explicitAuthor??fallbackAuthor,source_kind:sourceKind??"cli:update:dep",author_source:explicitAuthor?"asserted":"detected"}});return{additions}}function parseDependencyRemovals(raw,prefix){if(!raw){return[]}assertNoLegacyNoneTokens(raw,"--dep-remove");return raw.map(entry=>{const trimmed=entry.trim();if(!trimmed){throw new PmCliError("--dep-remove requires id or key/value selectors",EXIT_CODE.USAGE)}const isStructured=looksLikeStructuredDependencyEntry(trimmed);assertValidBareDependencyFlagValue(trimmed,isStructured,"--dep-remove");if(isStructured){const kv=parseCsvKv(trimmed,"--dep-remove");assertNoUnknownCsvKeys(kv,"--dep-remove",DEP_REMOVE_KEYS);const idRaw=kv.id?.trim();if(!idRaw){throw new PmCliError("--dep-remove key/value form requires id=<value>",EXIT_CODE.USAGE)}if(idRaw.toLowerCase()==="undefined"){throw new PmCliError(`--dep-remove id must not use placeholder token "${idRaw}"`,EXIT_CODE.USAGE)}const kindRaw=normalizeDependencyKindInput(parseOptionalDependencyString(kv.kind??kv.type));const sourceKind=normalizeDependencySourceKind(parseOptionalDependencyString(kv.source_kind));const author=parseOptionalDependencyString(kv.author);const createdAt=parseOptionalDependencyString(kv.created_at);return{id:normalizeDependencySeedId(idRaw,prefix,sourceKind),kind:kindRaw?ensureEnum(kindRaw,DEPENDENCY_KIND_VALUES,"dependency kind","kind"):void 0,source_kind:sourceKind,author,created_at:createdAt?normalizeDependencyTimestamp(createdAt):void 0}}if(trimmed.toLowerCase()==="undefined"){throw new PmCliError(`--dep-remove id must not use placeholder token "${trimmed}"`,EXIT_CODE.USAGE)}return{id:normalizeItemId(trimmed,prefix)}})}function dependencyKey(value){const sourceKind=value.source_kind?.trim().toLowerCase()??"";return[value.id.trim().toLowerCase(),value.kind,sourceKind].join("\0")}function storedDependencyIdentityKey(value){const sourceKind=value.source_kind?.trim().toLowerCase()??"";const author=value.author?.trim().toLowerCase()??"";const rawCreatedAt=value.created_at?.trim()??"";const parsedCreatedAt=Date.parse(rawCreatedAt);const createdAt=Number.isFinite(parsedCreatedAt)?new Date(parsedCreatedAt).toISOString():rawCreatedAt;return[value.id.trim().toLowerCase(),value.kind,sourceKind,author,createdAt].join("\0")}function reconcileBlockedByDependency(current,nextBlockedById,nowIsoValue,author){let next=[...current??[]];let changed=false;if(nextBlockedById===void 0){const filtered=next.filter(dep=>dep.kind!=="blocked_by");if(filtered.length!==next.length){next=filtered;changed=true}if(!changed){return{dependencies:current,changed:false}}return{dependencies:next.length>0?next:void 0,changed:true}}if(!next.some(dep=>dep.kind==="blocked_by"&&dep.id===nextBlockedById)){next.push({id:nextBlockedById,kind:"blocked_by",created_at:nowIsoValue,author,source_kind:"cli:update:blocked_by",author_source:"detected"});changed=true}if(!changed){return{dependencies:current,changed:false}}return{dependencies:next.length>0?next:void 0,changed:true}}async function resolveBlockedByDependencyTarget(blockedByOption,blockedByCleared,pmRoot,idPrefix,itemFormat,typeToFolder){if(blockedByOption===void 0||blockedByCleared){return{}}const blockedByValue=blockedByOption.trim();if(blockedByValue.length===0){return{}}const located=await locateItem(pmRoot,normalizeItemId(blockedByValue,idPrefix),idPrefix,itemFormat,typeToFolder);return located?{id:located.id}:{unresolved:blockedByValue}}function applyBlockedByDependencyEdge(metadata,resolvedBlockedById,nowIsoValue,author,changedFields){const reconciled=reconcileBlockedByDependency(metadata.dependencies,resolvedBlockedById,nowIsoValue,author);if(!reconciled.changed){return}if(reconciled.dependencies===void 0){delete metadata.dependencies}else{metadata.dependencies=reconciled.dependencies}if(!changedFields.includes("dependencies")){changedFields.push("dependencies")}}function fileKey(value){return`${value.path}::${value.scope}`}function docKey(value){return`${value.path}::${value.scope}`}function testKey(value){return`${value.command}::${value.path??""}::${value.scope}::${value.pm_context_mode??""}::${value.workspace_context_mode??""}`}function matchesDependencySelector(value,selector){if(value.id.trim().toLowerCase()!==selector.id.trim().toLowerCase()){return false}if(selector.kind&&value.kind!==selector.kind){return false}if(selector.source_kind!==void 0&&value.source_kind?.trim().toLowerCase()!==selector.source_kind.trim().toLowerCase()){return false}if(selector.author!==void 0&&value.author?.trim().toLowerCase()!==selector.author.trim().toLowerCase()){return false}if(selector.created_at!==void 0&&(value.created_at===void 0||!Number.isFinite(Date.parse(value.created_at))||new Date(Date.parse(value.created_at)).toISOString()!==selector.created_at)){return false}return true}function normalizeUpdatePolicyOptionKey(raw,typeName){const canonical=canonicalizeCommandOptionKey("update",raw);if(!canonical){throw new PmCliError(`Unsupported command_option_policies option "${raw}" for update command on type "${typeName}"`,EXIT_CODE.CONFLICT)}return canonical}function collectProvidedUpdatePolicyOptions(options,runtimeFieldRegistry,extensionFieldNames){const provided=new Set;const mark=(optionKey,isProvided)=>{if(isProvided){provided.add(optionKey)}};mark("title",options.title!==void 0);mark("description",options.description!==void 0);mark("body",options.body!==void 0);mark("status",options.status!==void 0);mark("closeReason",options.closeReason!==void 0);mark("priority",options.priority!==void 0);mark("type",options.type!==void 0);mark("tags",options.tags!==void 0||Array.isArray(options.addTags)&&options.addTags.length>0||Array.isArray(options.removeTags)&&options.removeTags.length>0);mark("deadline",options.deadline!==void 0);mark("estimatedMinutes",options.estimatedMinutes!==void 0);mark("acceptanceCriteria",options.acceptanceCriteria!==void 0||Array.isArray(options.addAc)&&options.addAc.length>0||Array.isArray(options.removeAc)&&options.removeAc.length>0);mark("definitionOfReady",options.definitionOfReady!==void 0);mark("order",options.order!==void 0||options.rank!==void 0);mark("goal",options.goal!==void 0);mark("objective",options.objective!==void 0);mark("value",options.value!==void 0);mark("impact",options.impact!==void 0);mark("outcome",options.outcome!==void 0);mark("whyNow",options.whyNow!==void 0);mark("author",options.author!==void 0);mark("message",options.message!==void 0);mark("assignee",options.assignee!==void 0);mark("parent",options.parent!==void 0);mark("reviewer",options.reviewer!==void 0);mark("risk",options.risk!==void 0);mark("confidence",options.confidence!==void 0);mark("sprint",options.sprint!==void 0);mark("release",options.release!==void 0);mark("blockedBy",options.blockedBy!==void 0);mark("blockedReason",options.blockedReason!==void 0);mark("unblockNote",options.unblockNote!==void 0);mark("reporter",options.reporter!==void 0);mark("severity",options.severity!==void 0);mark("environment",options.environment!==void 0);mark("reproSteps",options.reproSteps!==void 0);mark("resolution",options.resolution!==void 0);mark("expectedResult",options.expectedResult!==void 0);mark("actualResult",options.actualResult!==void 0);mark("affectedVersion",options.affectedVersion!==void 0);mark("fixedVersion",options.fixedVersion!==void 0);mark("component",options.component!==void 0);mark("regression",options.regression!==void 0);mark("customerImpact",options.customerImpact!==void 0);mark("dep",options.dep!==void 0);mark("depRemove",options.depRemove!==void 0);mark("dep",options.replaceDeps===true);mark("comment",options.comment!==void 0);mark("note",options.note!==void 0);mark("learning",options.learning!==void 0);mark("file",options.file!==void 0);mark("test",options.test!==void 0);mark("test",options.replaceTests===true);mark("file",options.replaceFiles===true);mark("doc",options.replaceDocs===true);mark("doc",options.doc!==void 0);mark("reminder",options.reminder!==void 0);mark("event",options.event!==void 0);mark("typeOption",options.typeOption!==void 0);mark("field",options.field!==void 0);mark("force",options.force===true);mark("ownershipMetadataBypass",options.ownershipMetadataBypass===true);mark("ownershipDependencyBypass",options.ownershipDependencyBypass===true);mark("dep",options.clearDeps===true);mark("comment",options.clearComments===true);mark("note",options.clearNotes===true);mark("learning",options.clearLearnings===true);mark("file",options.clearFiles===true);mark("test",options.clearTests===true);mark("doc",options.clearDocs===true);mark("reminder",options.clearReminders===true);mark("event",options.clearEvents===true);mark("typeOption",options.clearTypeOptions===true);if(options.unset&&options.unset.length>0){const unsetTargets=parseUpdateUnsetTargets(options.unset,runtimeFieldRegistry,extensionFieldNames);for(const optionKey of unsetTargets.optionKeys){mark(optionKey,true)}}return provided}function enforceUpdateOptionsByType(typeName,options,typeRegistry,runtimeFieldRegistry,extensionFieldNames){const typeDefinition=resolveTypeDefinition(typeName,typeRegistry);if(!typeDefinition){throw new PmCliError(`Invalid type value "${typeName}"`,EXIT_CODE.USAGE)}const policyState=resolveCommandOptionPolicyState(typeDefinition,"update",[]);if(policyState.errors.length>0){throw new PmCliError(policyState.errors.join("; "),EXIT_CODE.CONFLICT)}const provided=collectProvidedUpdatePolicyOptions(options,runtimeFieldRegistry,extensionFieldNames);for(const disabled of policyState.disabled){if(provided.has(normalizeUpdatePolicyOptionKey(disabled,typeName))){throw new PmCliError(`Option ${commandOptionFlagLabel("update",disabled)} is disabled for type "${typeName}" by command_option_policies`,EXIT_CODE.USAGE)}}for(const required of policyState.required){if(!provided.has(normalizeUpdatePolicyOptionKey(required,typeName))){throw new PmCliError(`Missing required option ${commandOptionFlagLabel("update",required)} for type "${typeName}"`,EXIT_CODE.USAGE)}}}const UPDATE_LEGACY_COMMON_SCALAR_OPTION_EXCLUSIONS=new Set(["order","rank"]);const UPDATE_LEGACY_COMMON_SCALAR_OPTION_KEYS=COMMON_MUTATION_COMMAND_OPTION_KEYS.filter(key=>!UPDATE_LEGACY_COMMON_SCALAR_OPTION_EXCLUSIONS.has(key));const UPDATE_LEGACY_SCALAR_OPTION_KEYS=["tags","closeReason",...UPDATE_LEGACY_COMMON_SCALAR_OPTION_KEYS];const UPDATE_SIMPLE_FIELD_FLAG_KEYS=["title","description","body","status","closeReason","completedAt","priority","type",...COMMON_MUTATION_COMMAND_OPTION_KEYS,"dep","depRemove","comment","note","learning","file","test","doc","reminder","event","typeOption","field"];const UPDATE_POST_TAG_SCALAR_MUTATIONS=[{optionKey:"deadline",metadataKey:"deadline",transform:(value,context)=>resolveIsoOrRelative(value,context.nowValue,"deadline")},{optionKey:"estimatedMinutes",metadataKey:"estimated_minutes",transform:value=>parseOptionalNonNegativeInteger(value,"estimated-minutes")},{optionKey:"acceptanceCriteria",metadataKey:"acceptance_criteria",transform:value=>value},{optionKey:"definitionOfReady",metadataKey:"definition_of_ready"},{optionKey:"goal",metadataKey:"goal"},{optionKey:"objective",metadataKey:"objective"},{optionKey:"value",metadataKey:"value"},{optionKey:"impact",metadataKey:"impact"},{optionKey:"outcome",metadataKey:"outcome"},{optionKey:"whyNow",metadataKey:"why_now"}];const UPDATE_STAKEHOLDER_SCALAR_MUTATIONS=[{optionKey:"reviewer",metadataKey:"reviewer"},{optionKey:"risk",metadataKey:"risk",transform:value=>ensureEnum(normalizeRiskInput(value),RISK_VALUES,"risk")},{optionKey:"confidence",metadataKey:"confidence",transform:value=>parseConfidenceInput(value)}];const UPDATE_ISSUE_SCALAR_MUTATIONS=[{optionKey:"blockedReason",metadataKey:"blocked_reason"},{optionKey:"unblockNote",metadataKey:"unblock_note"},{optionKey:"reporter",metadataKey:"reporter"},{optionKey:"severity",metadataKey:"severity",transform:value=>ensureEnum(normalizeSeverityInput(value),ISSUE_SEVERITY_VALUES,"severity")},{optionKey:"environment",metadataKey:"environment"},{optionKey:"reproSteps",metadataKey:"repro_steps"},{optionKey:"resolution",metadataKey:"resolution"},{optionKey:"expectedResult",metadataKey:"expected_result"},{optionKey:"actualResult",metadataKey:"actual_result"},{optionKey:"affectedVersion",metadataKey:"affected_version"},{optionKey:"fixedVersion",metadataKey:"fixed_version"},{optionKey:"component",metadataKey:"component"},{optionKey:"regression",metadataKey:"regression",transform:value=>parseRegressionInput(value)},{optionKey:"customerImpact",metadataKey:"customer_impact"}];function applyUpdateScalarMutations(definitions,options,context){for(const definition of definitions){const optionValue=options[definition.optionKey];const shouldClear=context.clearItemMetadataKeys.has(definition.metadataKey);if(optionValue===void 0&&!shouldClear){continue}if(shouldClear){delete context.metadataRecord[definition.metadataKey];context.changedFields.push(definition.metadataKey);continue}if(typeof optionValue!=="string"){throw new PmCliError(`${commandOptionFlagLabel("update",String(definition.optionKey))} must be a string value`,EXIT_CODE.USAGE)}context.metadataRecord[definition.metadataKey]=definition.transform?definition.transform(optionValue,context):optionValue.trim();context.changedFields.push(definition.metadataKey)}}async function resolveStdinUpdateOptions(options){const scalarFields=[["body","--body"],["description","--description"]];const listFields=[["dep","--dep"],["depRemove","--dep-remove"],["comment","--comment"],["note","--note"],["learning","--learning"],["file","--file"],["test","--test"],["doc","--doc"],["reminder","--reminder"],["event","--event"],["typeOption","--type-option"],["field","--field"]];return normalizeLegacyNoneUpdateOptions(await resolveMutationStdinTokenFields(options,scalarFields,listFields))}async function resolveUpdateTransportOptions(options){return shouldResolveMutationStdinTokens(options)?await resolveStdinUpdateOptions(options):normalizeLegacyNoneUpdateOptions(options)}function buildClearCollectionDefinitions(options){return[{enabled:options.clearDeps||options.replaceDeps,optionKey:"dep",clearFlag:"--clear-deps",valueFlag:"--dep",values:options.dep,metadataKey:"dependencies"},{enabled:options.clearComments,optionKey:"comment",clearFlag:"--clear-comments",valueFlag:"--comment",values:options.comment,metadataKey:"comments"},{enabled:options.clearNotes,optionKey:"note",clearFlag:"--clear-notes",valueFlag:"--note",values:options.note,metadataKey:"notes"},{enabled:options.clearLearnings,optionKey:"learning",clearFlag:"--clear-learnings",valueFlag:"--learning",values:options.learning,metadataKey:"learnings"},{enabled:options.clearFiles||options.replaceFiles,optionKey:"file",clearFlag:"--clear-files",valueFlag:"--file",values:options.file,metadataKey:"files"},{enabled:options.clearTests||options.replaceTests,optionKey:"test",clearFlag:"--clear-tests",valueFlag:"--test",values:options.test,metadataKey:"tests"},{enabled:options.clearDocs||options.replaceDocs,optionKey:"doc",clearFlag:"--clear-docs",valueFlag:"--doc",values:options.doc,metadataKey:"docs"},{enabled:options.clearReminders,optionKey:"reminder",clearFlag:"--clear-reminders",valueFlag:"--reminder",values:options.reminder,metadataKey:"reminders"},{enabled:options.clearEvents,optionKey:"event",clearFlag:"--clear-events",valueFlag:"--event",values:options.event,metadataKey:"events"},{enabled:options.clearTypeOptions,optionKey:"typeOption",clearFlag:"--clear-type-options",valueFlag:"--type-option",values:options.typeOption,metadataKey:"type_options"}]}function validateLinkedArtifactReplacement(params){if(params.enabled&&(!params.values||params.values.length===0)){throw new PmCliError(`${params.replaceFlag} requires at least one ${params.valueFlag} entry`,EXIT_CODE.USAGE)}if(params.enabled&&params.clearEnabled){throw new PmCliError(`${params.replaceFlag} cannot be combined with ${params.clearFlag}`,EXIT_CODE.USAGE)}}function assertUpdateMutationOptionCombinations(options){const hasAdditiveAcceptanceCriteriaMutation=(options.addAc?.length??0)>0||(options.removeAc?.length??0)>0;if(options.acceptanceCriteria!==void 0&&hasAdditiveAcceptanceCriteriaMutation){throw new PmCliError("Cannot combine --acceptance-criteria replacement with --add-ac or --remove-ac. Use --remove-ac and --add-ac together for an atomic one-entry repair.",EXIT_CODE.USAGE,{code:"acceptance_criteria_mutation_conflict",reason:"replacement_and_additive_mutation_combined",nextSteps:["Use --acceptance-criteria alone to replace the complete list.","Use --remove-ac <old> --add-ac <new> to repair one criterion without replacing unrelated entries."]})}if(options.replaceDeps===true&&(options.dep===void 0||options.dep.length===0)){throw new PmCliError("--replace-deps requires at least one --dep entry",EXIT_CODE.USAGE)}if(options.replaceDeps===true&&options.depRemove!==void 0&&options.depRemove.length>0){throw new PmCliError("--replace-deps cannot be combined with --dep-remove",EXIT_CODE.USAGE)}validateLinkedArtifactReplacement({enabled:options.replaceTests===true,values:options.test,replaceFlag:"--replace-tests",clearEnabled:options.clearTests===true,clearFlag:"--clear-tests",valueFlag:"--test"});validateLinkedArtifactReplacement({enabled:options.replaceFiles===true,values:options.file,replaceFlag:"--replace-files",clearEnabled:options.clearFiles===true,clearFlag:"--clear-files",valueFlag:"--file"});validateLinkedArtifactReplacement({enabled:options.replaceDocs===true,values:options.doc,replaceFlag:"--replace-docs",clearEnabled:options.clearDocs===true,clearFlag:"--clear-docs",valueFlag:"--doc"})}function applyClearCollectionDefinitions(params){for(const definition of params.definitions){if(!definition.enabled){continue}const isReplacement=definition.optionKey==="dep"&&params.options.replaceDeps===true||definition.optionKey==="test"&&params.options.replaceTests===true||definition.optionKey==="file"&&params.options.replaceFiles===true||definition.optionKey==="doc"&&params.options.replaceDocs===true;if(definition.values&&definition.values.length>0&&!isReplacement){throw new PmCliError(`Cannot combine ${definition.clearFlag} with ${definition.valueFlag}`,EXIT_CODE.USAGE)}params.clearOptionKeys.add(definition.optionKey);params.clearItemMetadataKeys.add(definition.metadataKey)}}function buildScalarOptionPresence(options){const presence={};for(const key of UPDATE_LEGACY_SCALAR_OPTION_KEYS){presence[String(key)]=options[key]!==void 0}presence.order=options.order!==void 0||options.rank!==void 0;return presence}function rejectUnsetScalarConflicts(options,unsetTargets){const scalarOptionPresence=buildScalarOptionPresence(options);for(const[optionKey,hasValue]of Object.entries(scalarOptionPresence)){if(!hasValue||!unsetTargets.optionKeys.has(optionKey)){continue}const unsetField=UPDATE_OPTION_KEY_TO_UNSET_CANONICAL.get(optionKey)??optionKey;throw new PmCliError(`Cannot combine --unset ${unsetField} with ${commandOptionFlagLabel("update",optionKey)}`,EXIT_CODE.USAGE)}if(unsetTargets.metadataKeys.has("acceptance_criteria")){if(Array.isArray(options.addAc)&&options.addAc.length>0){throw new PmCliError("Cannot combine --unset acceptance-criteria with --add-ac",EXIT_CODE.USAGE)}if(Array.isArray(options.removeAc)&&options.removeAc.length>0){throw new PmCliError("Cannot combine --unset acceptance-criteria with --remove-ac",EXIT_CODE.USAGE)}}if(!unsetTargets.metadataKeys.has("tags")){return}if(Array.isArray(options.addTags)&&options.addTags.length>0){throw new PmCliError("Cannot combine --unset tags with --add-tags",EXIT_CODE.USAGE)}if(Array.isArray(options.removeTags)&&options.removeTags.length>0){throw new PmCliError("Cannot combine --unset tags with --remove-tags",EXIT_CODE.USAGE)}}function rejectLegacyScalarTokens(options){const assertNoLegacyScalarToken=(value,optionKey)=>{const unsetField=UPDATE_OPTION_KEY_TO_UNSET_CANONICAL.get(optionKey);const hint=unsetField?`Use --unset ${unsetField} to clear this field.`:void 0;assertNoLegacyNoneToken(value,commandOptionFlagLabel("update",optionKey),hint)};for(const key of UPDATE_LEGACY_SCALAR_OPTION_KEYS){assertNoLegacyScalarToken(options[key],String(key))}assertNoLegacyScalarToken(options.order??options.rank,"order");assertNoLegacyNoneTokens(options.reminder,"--reminder","Use --clear-reminders to clear reminders.");assertNoLegacyNoneTokens(options.event,"--event","Use --clear-events to clear linked events.")}function buildUpdateFieldFlags(options,runtimeFieldUpdates){const flags={};for(const key of UPDATE_SIMPLE_FIELD_FLAG_KEYS){flags[String(key)]=options[key]!==void 0}flags.tags=options.tags!==void 0;flags.addTags=Array.isArray(options.addTags)&&options.addTags.length>0;flags.removeTags=Array.isArray(options.removeTags)&&options.removeTags.length>0;flags.addAc=Array.isArray(options.addAc)&&options.addAc.length>0;flags.removeAc=Array.isArray(options.removeAc)&&options.removeAc.length>0;flags.order=options.order!==void 0;flags.rank=options.rank!==void 0;flags.replaceDeps=options.replaceDeps===true;flags.replaceTests=options.replaceTests===true;flags.replaceFiles=options.replaceFiles===true;flags.replaceDocs=options.replaceDocs===true;flags.unset=options.unset!==void 0&&options.unset.length>0;flags.clearDeps=options.clearDeps===true;flags.clearComments=options.clearComments===true;flags.clearNotes=options.clearNotes===true;flags.clearLearnings=options.clearLearnings===true;flags.clearFiles=options.clearFiles===true;flags.clearTests=options.clearTests===true;flags.clearDocs=options.clearDocs===true;flags.clearReminders=options.clearReminders===true;flags.clearEvents=options.clearEvents===true;flags.clearTypeOptions=options.clearTypeOptions===true;flags.documentAnnotationSnapshot=options.documentAnnotationSnapshot!==void 0;flags.runtimeFields=Object.keys(runtimeFieldUpdates).length>0;return flags}async function buildNoopUpdateResult(params){const located=await locateItem(params.pmRoot,params.id,params.settings.id_prefix,params.settings.item_format,params.typeRegistry.type_to_folder);if(!located){throw await buildItemNotFoundError(params.pmRoot,params.id,params.settings.id_prefix,params.typeRegistry.type_to_folder)}const{document}=await readLocatedItem(located,{schema:params.settings.schema});return{item:toItemRecord(document.metadata),changed_fields:[],warnings:["noop_no_update_fields"]}}async function loadUpdateRelationshipGraph(params){if(!params.fieldFlags.dep&&!params.fieldFlags.blockedBy&&!params.fieldFlags.parent&&!params.clearedMetadataKeys.has("parent"))return void 0;return listAllItemMetadataLight(params.pmRoot,params.settings.item_format,params.typeToFolder,void 0,params.settings.schema)}function assertUpdateHierarchyIntegrity(params){if(!params.before)return;assertHierarchyMutationAllowed(params.before,params.before.map(item=>item.id===params.document.metadata.id?params.document.metadata:item),params.document.metadata.id,status=>isTerminalStatus(status,params.statusRegistry),resolveWorkspaceRelationshipKindRegistry())}function assertMatchingOrderRank(options){if(options.order!==void 0&&options.rank!==void 0&&options.order!==options.rank){throw new PmCliError("--order and --rank must match when both are provided",EXIT_CODE.USAGE)}}async function resolveParentReferenceForUpdate(params){if(params.options.parent===void 0||params.unsetTargets.metadataKeys.has("parent")){return{resolvedParentValue:void 0,warnings:[]}}const resolvedParentValue=normalizeItemReference(normalizeParentReferenceValue(params.options.parent),params.settings.id_prefix);if(isExternalDependencyReference(resolvedParentValue)){return{resolvedParentValue,warnings:[]}}assertParentReferenceIsNotSelf(params.id,resolvedParentValue,params.settings.id_prefix);const parentLocated=await locateItem(params.pmRoot,resolvedParentValue,params.settings.id_prefix,params.settings.item_format,params.typeRegistry.type_to_folder);if(parentLocated){return{resolvedParentValue,warnings:[]}}const normalizedParentId=normalizeItemId(resolvedParentValue,params.settings.id_prefix);return{resolvedParentValue,warnings:validateMissingParentReference(normalizedParentId,params.parentReferencePolicy).warnings}}function blockedByResolutionWarnings(resolution){return resolution.unresolved===void 0?[]:[`blocked_by_unresolved:${resolution.unresolved}`]}async function collectWorkflowTransitionWarnings(params){if(params.workflowEnforcement==="off"||params.typeWorkflows.length===0||!params.fieldFlags.status||params.options.status===void 0){return[]}const located=await locateItem(params.pmRoot,params.id,params.settings.id_prefix,params.settings.item_format,params.typeRegistry.type_to_folder);if(!located){throw await buildItemNotFoundError(params.pmRoot,params.id,params.settings.id_prefix,params.typeRegistry.type_to_folder)}const{document}=await readLocatedItem(located,{schema:params.settings.schema});const effectiveType=params.options.type!==void 0?resolveTypeName(params.options.type,params.typeRegistry)??params.options.type:document.metadata?.type??"";const warning=enforceTypeWorkflowTransition({enforcement:params.workflowEnforcement,typeWorkflows:params.typeWorkflows,statusRegistry:params.statusRegistry,typeName:effectiveType,fromStatus:document.metadata?.status??"",toStatus:params.options.status});return warning?[warning]:[]}async function routeCloseStatusUpdate(context){if(!context.fieldFlags.status){return void 0}const targetStatus=normalizeStatusInput(context.options.status,context.statusRegistry);if(targetStatus!==context.statusRegistry.close_status){return void 0}const otherFieldKeys=Object.entries(context.fieldFlags).filter(([key,value])=>value&&key!=="status"&&key!=="closeReason"&&key!=="completedAt").map(([key])=>key);const routeWarnings=[];let preChangedFields=[];if(otherFieldKeys.length>0){const preUpdateOptions=transferMutationStdinTokenPolicy(context.options,{...context.options,status:void 0,closeReason:void 0,message:void 0});const preUpdate=await runUpdate(context.id,preUpdateOptions,context.global);preChangedFields=preUpdate.changed_fields;routeWarnings.push(...preUpdate.warnings)}const closeResult=await runClose(context.id,context.options.closeReason,{author:context.options.author,message:context.options.message,force:context.options.force,completedAt:context.options.completedAt},context.global);const warnings=[...context.workflowTransitionWarnings,...routeWarnings,...closeResult.warnings,"auto_routed_from_update_to_close"];return{item:closeResult.item,changed_fields:[...preChangedFields,...closeResult.changed_fields],warnings}}function applySimpleItemMutations(document,options,statusRegistry,changedFields){if(options.title!==void 0){document.metadata.title=requireStringOption(options.title,"--title");changedFields.push("title")}if(options.description!==void 0){document.metadata.description=options.description;changedFields.push("description")}if(options.body!==void 0){document.body=options.body;changedFields.push("body")}return normalizeStatusInput(document.metadata.status,statusRegistry)??document.metadata.status}const TERMINAL_EVIDENCE_METADATA_KEYS=["closed_at","completed_at","close_reason","resolution","expected_result","actual_result","fixed_version"];function clearTerminalEvidence(metadata,changedFields){for(const key of TERMINAL_EVIDENCE_METADATA_KEYS){if(metadata[key]===void 0){continue}delete metadata[key];changedFields.push(key)}}function applyStatusMutation(document,context,statusInput,previousStatusNormalized,changedFields){const status=parseStatus(statusInput,context.statusRegistry);document.metadata.status=status;changedFields.push("status");if(status===context.statusRegistry.close_status&&(document.metadata.closed_at===void 0||document.metadata.closed_at===null)){document.metadata.closed_at=context.nowIso;document.metadata.completed_at=context.nowIso;changedFields.push("closed_at","completed_at");return}if(!isTerminalStatus(status,context.statusRegistry)&&isTerminalStatus(previousStatusNormalized,context.statusRegistry)){clearTerminalEvidence(document.metadata,changedFields)}}function applyStatusAndCompletionMutations(document,context,previousStatusNormalized,changedFields){if(context.options.status!==void 0){applyStatusMutation(document,context,context.options.status,previousStatusNormalized,changedFields)}if(context.options.completedAt!==void 0){if(!isTerminalStatus(document.metadata.status,context.statusRegistry)){throw new PmCliError("--completed-at can only be set on a terminal item",EXIT_CODE.USAGE)}document.metadata.completed_at=resolveIsoOrRelative(context.options.completedAt,new Date(context.nowIso),"completed-at");changedFields.push("completed_at")}}function applyCloseReasonMutations(document,context,previousStatusNormalized,changedFields){if(context.options.closeReason!==void 0||context.clearItemMetadataKeys.has("close_reason")){if(context.clearItemMetadataKeys.has("close_reason")){delete document.metadata.close_reason}else{const closeReason=context.options.closeReason?.trim()??"";if(closeReason.length===0){throw new PmCliError("--close-reason must not be empty",EXIT_CODE.USAGE)}document.metadata.close_reason=closeReason}changedFields.push("close_reason");return}if(context.options.status!==void 0&&isTerminalStatus(previousStatusNormalized,context.statusRegistry)&&!isTerminalStatus(document.metadata.status,context.statusRegistry)&&document.metadata.close_reason!==void 0){delete document.metadata.close_reason;changedFields.push("close_reason")}}function applyStatusAndCloseReasonMutations(document,context,previousStatusNormalized,changedFields){applyStatusAndCompletionMutations(document,context,previousStatusNormalized,changedFields);applyCloseReasonMutations(document,context,previousStatusNormalized,changedFields)}function applyPriorityTypeAndOptions(document,context,changedFields){let activeTypeName=resolveTypeName(document.metadata.type,context.typeRegistry)??document.metadata.type;if(context.options.priority!==void 0){document.metadata.priority=resolvePriority(context.options.priority);changedFields.push("priority")}if(context.options.type!==void 0){const resolvedTypeName=resolveTypeName(context.options.type,context.typeRegistry);if(!resolvedTypeName){throw new PmCliError(buildInvalidTypeError(context.options.type,context.typeRegistry.types,resolveItemTypesFilePath(context.pmRoot,context.settings.schema)),EXIT_CODE.USAGE)}document.metadata.type=resolvedTypeName;activeTypeName=resolvedTypeName;changedFields.push("type")}enforceUpdateOptionsByType(activeTypeName,context.options,context.typeRegistry,context.runtimeFieldRegistry,context.extensionFieldNames);applyTypeOptionMutation(document,context,activeTypeName,changedFields);return activeTypeName}function applyTypeOptionMutation(document,context,activeTypeName,changedFields){if(context.options.typeOption!==void 0||context.clearItemMetadataKeys.has("type_options")){if(context.clearItemMetadataKeys.has("type_options")){delete document.metadata.type_options}else{const parsedTypeOptions=parseTypeOptionEntries(context.options.typeOption??[]);const validation2=validateTypeOptions(activeTypeName,parsedTypeOptions,context.typeRegistry);if(validation2.errors.length>0){throw new PmCliError(validation2.errors.join("; "),EXIT_CODE.USAGE)}document.metadata.type_options=validation2.normalized}changedFields.push("type_options");return}if(context.options.type===void 0||document.metadata.type_options===void 0){return}const validation=validateTypeOptions(activeTypeName,document.metadata.type_options,context.typeRegistry);if(validation.errors.length>0){throw new PmCliError(`Current type options are incompatible with type "${activeTypeName}". ${validation.errors.join("; ")}. Use --clear-type-options to clear them.`,EXIT_CODE.USAGE)}document.metadata.type_options=validation.normalized}function normalizeTouchedDependencyIdentities(current,additions){const touchedKeys=new Set(additions.map(entry=>dependencyKey(entry)));const retainedStoredIdentities=new Set;return current.filter(entry=>{if(!touchedKeys.has(dependencyKey(entry))){return true}const storedIdentity=storedDependencyIdentityKey(entry);if(retainedStoredIdentities.has(storedIdentity)){return false}retainedStoredIdentities.add(storedIdentity);return true})}function assertDependencyRemovalSelectorsMatch(current,selectors,itemId){const unmatchedSelectors=selectors.filter(selector=>!current.some(entry=>matchesDependencySelector(entry,selector)));if(unmatchedSelectors.length===0){return}throw new PmCliError(`Dependency removal did not match ${unmatchedSelectors.length===1?"a stored edge":"stored edges"}.`,EXIT_CODE.NOT_FOUND,{code:"dependency_remove_no_match",reason:"selector_not_found",unmatched_selectors:unmatchedSelectors,available_dependencies:current.map(entry=>({id:entry.id,kind:entry.kind,source_kind:entry.source_kind,author:entry.author,created_at:entry.created_at})),why:"Failing on a zero-match selector prevents a mistyped dependency removal from being reported as successful.",nextSteps:[`Inspect the current item with: pm get ${itemId} --full`,"Retry --dep-remove with the exact id plus any kind, source_kind, author, or created_at selectors needed to identify one stored row."]})}function applyDependencyMutations(document,context,changedFields){if(context.options.dep===void 0&&context.options.depRemove===void 0&&!context.clearItemMetadataKeys.has("dependencies")){return}let nextDependencies=context.clearItemMetadataKeys.has("dependencies")?[]:[...document.metadata.dependencies??[]];if(context.dependencyUpdates.additions.length>0){nextDependencies=normalizeTouchedDependencyIdentities(nextDependencies,context.dependencyUpdates.additions);const seen=new Set(nextDependencies.map(entry=>dependencyKey(entry)));for(const addition of context.dependencyUpdates.additions){const key=dependencyKey(addition);if(!seen.has(key)){nextDependencies.push(addition);seen.add(key)}}}if(context.dependencyRemovals.length>0){assertDependencyRemovalSelectorsMatch(nextDependencies,context.dependencyRemovals,document.metadata.id);nextDependencies=nextDependencies.filter(entry=>!context.dependencyRemovals.some(selector=>matchesDependencySelector(entry,selector)))}if(nextDependencies.length===0){delete document.metadata.dependencies}else{document.metadata.dependencies=nextDependencies}changedFields.push("dependencies")}function applyLogCollectionMutations(document,context,changedFields){applyLogCollectionMutation(document,"comments",context.options.comment,context.commentUpdates.values,context.clearItemMetadataKeys,changedFields);applyLogCollectionMutation(document,"notes",context.options.note,context.noteUpdates.values,context.clearItemMetadataKeys,changedFields);applyLogCollectionMutation(document,"learnings",context.options.learning,context.learningUpdates.values,context.clearItemMetadataKeys,changedFields)}function applyLogCollectionMutation(document,key,optionValue,values,clearItemMetadataKeys,changedFields){if(optionValue===void 0&&!clearItemMetadataKeys.has(key)){return}if(clearItemMetadataKeys.has(key)||!values||values.length===0){delete document.metadata[key]}else{document.metadata[key]=[...document.metadata[key]??[],...values]}changedFields.push(key)}function applyEvidenceCollectionMutations(document,context,changedFields){applyUniqueLinkedCollectionMutation(document,"files",context.options.file,context.fileUpdates.values,fileKey,context.options.replaceFiles===true,context.clearItemMetadataKeys,changedFields);applyTestCollectionMutation(document,context,changedFields);applyUniqueLinkedCollectionMutation(document,"docs",context.options.doc,context.docUpdates.values,docKey,context.options.replaceDocs===true,context.clearItemMetadataKeys,changedFields)}function applyUniqueLinkedCollectionMutation(document,key,optionValue,values,keyOf,replace,clearItemMetadataKeys,changedFields){if(optionValue===void 0&&!clearItemMetadataKeys.has(key)){return}if(replace){document.metadata[key]=values}else if(clearItemMetadataKeys.has(key)||!values||values.length===0){delete document.metadata[key]}else{const next=[...document.metadata[key]??[]];const seen=new Set(next.map(entry=>keyOf(entry)));for(const entry of values){const keyValue=keyOf(entry);if(!seen.has(keyValue)){next.push(entry);seen.add(keyValue)}}document.metadata[key]=next}changedFields.push(key)}function applyTestCollectionMutation(document,context,changedFields){if(context.options.test===void 0&&!context.clearItemMetadataKeys.has("tests")){return}if(context.clearItemMetadataKeys.has("tests")&&context.options.replaceTests===true){document.metadata.tests=dedupeLinkedTests(context.testUpdates.values)??[]}else if(context.clearItemMetadataKeys.has("tests")||!context.testUpdates.values||context.testUpdates.values.length===0){delete document.metadata.tests}else{document.metadata.tests=dedupeLinkedTests([...document.metadata.tests??[],...context.testUpdates.values])}if(document.metadata.tests!==void 0&&document.metadata.tests.length===0){delete document.metadata.tests}changedFields.push("tests")}function dedupeLinkedTests(values){if(!values||values.length===0){return void 0}const next=[];const seen=new Set;for(const entry of values){const key=testKey(entry);if(!seen.has(key)){next.push(entry);seen.add(key)}}return next}function applyTagsAndPlanningMutations(document,context,scalarMutationContext){const addTagsValues=context.options.addTags;const removeTagsValues=context.options.removeTags;const hasAdditiveTagMutation=Array.isArray(addTagsValues)&&addTagsValues.length>0||Array.isArray(removeTagsValues)&&removeTagsValues.length>0;if(context.options.tags!==void 0||context.clearItemMetadataKeys.has("tags")||hasAdditiveTagMutation){const baseTags=context.clearItemMetadataKeys.has("tags")?[]:context.options.tags!==void 0?parseTags(context.options.tags):Array.isArray(document.metadata.tags)?[...document.metadata.tags]:[];document.metadata.tags=applyTagRemovals(mergeAdditiveTags(baseTags,addTagsValues),removeTagsValues);scalarMutationContext.changedFields.push("tags")}applyUpdateScalarMutations(UPDATE_POST_TAG_SCALAR_MUTATIONS,context.options,scalarMutationContext);applyOrderMutation(document,context,scalarMutationContext.changedFields)}function applyAcceptanceCriteriaAdditiveMutation(document,context,scalarMutationContext){const addValues=context.options.addAc;const removeValues=context.options.removeAc;if(!(Array.isArray(addValues)&&addValues.length>0)&&!(Array.isArray(removeValues)&&removeValues.length>0)){return}const mutation=applyAcceptanceCriteriaMutations(splitAcceptanceCriteria(document.metadata.acceptance_criteria),addValues,removeValues);if(mutation.unmatchedRemovals.length>0){throw new PmCliError(`Acceptance criteria removal did not match: ${mutation.unmatchedRemovals.join(", ")}`,EXIT_CODE.NOT_FOUND,{code:"acceptance_criteria_remove_unmatched",reason:"exact_match_not_found",field:"acceptance_criteria",unmatched:mutation.unmatchedRemovals,why:"Lossless removal fails instead of silently applying the remaining mutations when an exact selector is wrong.",nextSteps:["Read the current acceptance_criteria value and retry with the exact criterion text.","Use --acceptance-criteria alone only when replacing the complete list is intentional."]})}const nextValue=mutation.criteria.join("; ");if(document.metadata.acceptance_criteria===nextValue){return}if(nextValue===""&&document.metadata.acceptance_criteria===void 0){return}document.metadata.acceptance_criteria=nextValue;if(!scalarMutationContext.changedFields.includes("acceptance_criteria")){scalarMutationContext.changedFields.push("acceptance_criteria")}}function applyOrderMutation(document,context,changedFields){const orderRaw=context.options.order??context.options.rank;if(orderRaw===void 0&&!context.clearItemMetadataKeys.has("order")){return}if(context.clearItemMetadataKeys.has("order")){delete document.metadata.order}else{const parsedOrder=parseOptionalNumber(orderRaw??"","order");if(!Number.isInteger(parsedOrder)){throw new PmCliError("Order must be an integer",EXIT_CODE.USAGE)}document.metadata.order=parsedOrder}changedFields.push("order")}function applyOwnershipAndIssueMutations(document,context,scalarMutationContext,warnings){applyAssigneeMutation(document,context,scalarMutationContext.changedFields);applyParentMutation(document,context,scalarMutationContext.changedFields);applyUpdateScalarMutations(UPDATE_STAKEHOLDER_SCALAR_MUTATIONS,context.options,scalarMutationContext);applySprintReleaseMutation(document,context,"sprint",warnings,scalarMutationContext.changedFields);applySprintReleaseMutation(document,context,"release",warnings,scalarMutationContext.changedFields);applyBlockedByMutation(document,context,scalarMutationContext.changedFields);applyUpdateScalarMutations(UPDATE_ISSUE_SCALAR_MUTATIONS,context.options,scalarMutationContext)}function applyAssigneeMutation(document,context,changedFields){if(context.options.assignee===void 0&&!context.clearItemMetadataKeys.has("assignee")){return}if(context.clearItemMetadataKeys.has("assignee")){delete document.metadata.assignee}else{const assignee=context.options.assignee?.trim()??"";if(assignee===""){throw new PmCliError("--assignee must not be empty. Use --unset assignee to clear it.",EXIT_CODE.USAGE)}document.metadata.assignee=assignee}changedFields.push("assignee")}function applyParentMutation(document,context,changedFields){if(context.options.parent===void 0&&!context.clearItemMetadataKeys.has("parent")){return}if(context.clearItemMetadataKeys.has("parent")){delete document.metadata.parent}else{document.metadata.parent=context.resolvedParentValue??""}changedFields.push("parent")}function applySprintReleaseMutation(document,context,key,warnings,changedFields){if(context.options[key]===void 0&&!context.clearItemMetadataKeys.has(key)){return}if(context.clearItemMetadataKeys.has(key)){delete document.metadata[key]}else{const validation=validateSprintOrReleaseValue(key,context.options[key]??"",context.settings.validation.sprint_release_format);document.metadata[key]=validation.value;warnings.push(...validation.warnings)}changedFields.push(key)}function applyBlockedByMutation(document,context,changedFields){if(context.options.blockedBy===void 0&&!context.clearItemMetadataKeys.has("blocked_by")){return}if(context.clearItemMetadataKeys.has("blocked_by")){delete document.metadata.blocked_by}else{document.metadata.blocked_by=context.options.blockedBy?.trim()??""}changedFields.push("blocked_by");if(context.clearItemMetadataKeys.has("blocked_by")||context.resolvedBlockedByDependencyId!==void 0){applyBlockedByDependencyEdge(document.metadata,context.resolvedBlockedByDependencyId,context.nowIso,context.author,changedFields)}}function applyScheduleMutations(document,context,changedFields){if(context.options.reminder!==void 0||context.clearItemMetadataKeys.has("reminders")){if(context.clearItemMetadataKeys.has("reminders")){delete document.metadata.reminders}else{document.metadata.reminders=parseReminderEntries(context.options.reminder??[],context.nowValue,{valueMode:"trimmed"})}changedFields.push("reminders")}if(context.options.event!==void 0||context.clearItemMetadataKeys.has("events")){if(context.clearItemMetadataKeys.has("events")){delete document.metadata.events}else{document.metadata.events=parseEventEntries(context.options.event??[],context.nowValue,{allDayEmptyGuard:"truthy",recurrenceEmptyNumericGuard:"truthy"})}changedFields.push("events")}}function applyRuntimeAndRegisteredFieldMutations(metadataRecord,context,changedFields){clearDynamicFields(metadataRecord,context.runtimeFieldRegistry.definitions.map(definition=>definition.metadata_key),context.clearItemMetadataKeys,changedFields);clearDynamicFields(metadataRecord,context.extensionFieldNames,context.clearItemMetadataKeys,changedFields);for(const[fieldKey,fieldValue]of Object.entries(context.runtimeFieldUpdates)){if(context.clearItemMetadataKeys.has(fieldKey)){const fieldFlag=fieldKey.replaceAll("_","-");const definition=context.runtimeFieldRegistry.definitions.find(candidate=>candidate.metadata_key===fieldKey);const updateFlag=definition?.cli_flag??fieldFlag;throw new PmCliError(`Cannot combine --unset ${fieldFlag} with --${updateFlag}`,EXIT_CODE.USAGE)}if(stableValueEquals(metadataRecord[fieldKey],fieldValue)){continue}metadataRecord[fieldKey]=fieldValue;changedFields.push(fieldKey)}const registeredItemFieldUpdates=parseRegisteredItemFieldAssignments(context.options.field,context.extensionRegistrations);for(const fieldKey of Object.keys(registeredItemFieldUpdates)){if(context.clearItemMetadataKeys.has(fieldKey)){throw new PmCliError(`Cannot combine --unset ${fieldKey.replaceAll("_","-")} with --field ${fieldKey}=...`,EXIT_CODE.USAGE)}}for(const[fieldKey,fieldValue]of Object.entries(registeredItemFieldUpdates)){if(!stableValueEquals(metadataRecord[fieldKey],fieldValue)){metadataRecord[fieldKey]=fieldValue;changedFields.push(fieldKey)}}}function clearDynamicFields(metadataRecord,fieldKeys,clearItemMetadataKeys,changedFields){for(const fieldKey of fieldKeys){if(!clearItemMetadataKeys.has(fieldKey)||metadataRecord[fieldKey]===void 0){continue}delete metadataRecord[fieldKey];changedFields.push(fieldKey)}}function assertPersistedAnnotationSnapshot(document,snapshot){if(snapshot===void 0)return;const current=toItemRecord(document.metadata);const key=["comments","notes","learnings"].find(field=>{const submitted=snapshot[field];return submitted!==void 0&&(!Array.isArray(submitted)||!stableValueEquals(submitted,current[field]??[]))});if(key===void 0)return;throw new PmCliError(`Full-item --stdin-json update changed persisted ${key}; no item fields were written.`,EXIT_CODE.USAGE,{code:"stdin_json_persisted_annotation_changed",reason:`${key}_requires_annotation_command`,required:`Use pm ${key} ${document.metadata.id} --edit <index> --add <text> to correct an existing entry.`,why:"Full-item update appends new annotations but cannot replace or remove existing audit entries.",nextSteps:[`Inspect the current ${key} with pm ${key} ${document.metadata.id}.`,`Apply the correction with pm ${key} ${document.metadata.id} --edit <index> --add <text>.`]})}function mutateUpdateDocument(document,context){assertPersistedAnnotationSnapshot(document,context.options.documentAnnotationSnapshot);const beforeMetadata=structuredClone(toItemRecord(document.metadata));const beforeBody=document.body;const changedFields=[];const warnings=[];const previousStatusNormalized=applySimpleItemMutations(document,context.options,context.statusRegistry,changedFields);const metadataRecord=toItemRecord(document.metadata);const scalarMutationContext={metadataRecord,clearItemMetadataKeys:context.clearItemMetadataKeys,changedFields,nowValue:context.nowValue};applyStatusAndCloseReasonMutations(document,context,previousStatusNormalized,changedFields);applyPriorityTypeAndOptions(document,context,changedFields);applyDependencyMutations(document,context,changedFields);applyLogCollectionMutations(document,context,changedFields);applyEvidenceCollectionMutations(document,context,changedFields);applyTagsAndPlanningMutations(document,context,scalarMutationContext);applyAcceptanceCriteriaAdditiveMutation(document,context,scalarMutationContext);applyOwnershipAndIssueMutations(document,context,scalarMutationContext,warnings);if(context.options.dep!==void 0||context.options.depRemove!==void 0||context.options.blockedBy!==void 0||context.clearItemMetadataKeys.has("dependencies")||context.clearItemMetadataKeys.has("blocked_by")){assertDependencyEdgesAllowed(document.metadata.id,document.metadata.dependencies)}if(normalizeStatusInput(document.metadata.status,context.statusRegistry)===context.statusRegistry.canceled_status&&document.metadata.assignee!==void 0){delete document.metadata.assignee;if(!changedFields.includes("assignee")){changedFields.push("assignee")}}applyScheduleMutations(document,context,changedFields);applyRuntimeAndRegisteredFieldMutations(metadataRecord,context,changedFields);try{applyRegisteredItemFieldDefaultsAndValidation(metadataRecord,context.extensionRegistrations,{skipDefaultFields:context.clearItemMetadataKeys})}catch(error){throw new PmCliError(error instanceof Error?error.message:"Invalid extension item field values",EXIT_CODE.USAGE)}const afterMetadata=toItemRecord(document.metadata);const actualChangedFields=[...new Set(changedFields)].filter(field=>field==="body"?document.body!==beforeBody:!stableValueEquals(beforeMetadata[field],afterMetadata[field]));if(context.options.acceptanceCriteria!==void 0&&actualChangedFields.includes("acceptance_criteria")){warnings.push(`acceptance_criteria_replaced:${splitAcceptanceCriteria(beforeMetadata.acceptance_criteria).length}:${splitAcceptanceCriteria(afterMetadata.acceptance_criteria).length}`)}return{changedFields:actualChangedFields,warnings}}async function runUpdateWithContext(id,options,global2,execution={}){options=await resolveUpdateTransportOptions(options);const pmRoot=resolvePmRoot(process.cwd(),global2.path);await assertInitializedTracker(pmRoot);const settings=await readSettings(pmRoot);const statusRegistry=resolveRuntimeStatusRegistry(settings.schema);const runtimeFieldRegistry=resolveRuntimeFieldRegistry(settings.schema);const extensionRegistrations=getActiveExtensionRegistrations();const extensionFieldNames=collectRegisteredItemFieldNames(extensionRegistrations);const typeRegistry=resolveItemTypeRegistry(settings,extensionRegistrations);const workflowEnforcement=settings.governance.workflow_enforcement??"off";const typeWorkflows=workflowEnforcement==="off"?[]:resolveTypeWorkflows(settings.schema);const parentReferencePolicy=[{strict_error:"strict_error",warn:"warn",off:"off"},{strict_error:"warn",warn:"warn",off:"off"}][Number(options.allowMissingParent===true)][settings.validation.parent_reference];const unsetTargets=parseUpdateUnsetTargets(options.unset,runtimeFieldRegistry,extensionFieldNames);const clearOptionKeys=new Set(unsetTargets.optionKeys);const clearItemMetadataKeys=new Set(unsetTargets.metadataKeys);assertUpdateMutationOptionCombinations(options);applyClearCollectionDefinitions({definitions:buildClearCollectionDefinitions(options),options,clearOptionKeys,clearItemMetadataKeys});enforceOwnershipBypassScope(id,options,clearItemMetadataKeys);rejectUnsetScalarConflicts(options,unsetTargets);rejectLegacyScalarTokens(options);const author=resolveAuthor(options.author,settings.author_default);const nowValue=new Date;const nowIso=nowValue.toISOString();const dependencyUpdates=parseDependencyAdditions(options.dep,settings.id_prefix,nowIso,author);assertDependencyEdgesAllowed(id,dependencyUpdates.additions);const dependencyTargetWarnings=await assertDependencyTargetsResolvable({pmRoot,dependencies:dependencyUpdates.additions,idPrefix:settings.id_prefix,itemFormat:settings.item_format,typeToFolder:typeRegistry.type_to_folder,allowUnresolved:options.allowUnresolvedDeps,holders:[{id}],schema:settings.schema});const dependencyRemovals=parseDependencyRemovals(options.depRemove,settings.id_prefix);const parsedCommentUpdates=parseLogSeed("--comment",options.comment,nowIso,author);const commentUpdates=options.ownershipMetadataBypass===true&&parsedCommentUpdates.values?{...parsedCommentUpdates,values:parsedCommentUpdates.values.map(entry=>({...entry,author}))}:parsedCommentUpdates;const noteUpdates=parseLogSeed("--note",options.note,nowIso,author);const learningUpdates=parseLogSeed("--learning",options.learning,nowIso,author);const fileUpdates=parseFiles(options.file);const testUpdates=parseTests(options.test);testUpdates.values=await attachLinkedTestMutationProvenance(testUpdates.values,author,nowIso);const docUpdates=parseDocs(options.doc);const workflowTransitionWarnings=[];const parentReference=await resolveParentReferenceForUpdate({id,options,unsetTargets,pmRoot,settings,typeRegistry,parentReferencePolicy});const blockedByResolution=await resolveBlockedByDependencyTarget(options.blockedBy,clearItemMetadataKeys.has("blocked_by"),pmRoot,settings.id_prefix,settings.item_format,typeRegistry.type_to_folder);const resolvedBlockedByDependencyId=blockedByResolution.id;const parentReferenceWarnings=[...parentReference.warnings,...blockedByResolutionWarnings(blockedByResolution)];const runtimeFieldUpdates=collectRuntimeUpdateFieldValues(options,runtimeFieldRegistry,options.runtimeFieldCommands);const fieldFlags=buildUpdateFieldFlags(options,runtimeFieldUpdates);const changedFlags=Object.values(fieldFlags).some(Boolean);if(!changedFlags){return buildNoopUpdateResult({pmRoot,id,settings,typeRegistry})}workflowTransitionWarnings.push(...await collectWorkflowTransitionWarnings({options,fieldFlags,workflowEnforcement,typeWorkflows,statusRegistry,typeRegistry,pmRoot,id,settings}));const routedClose=await routeCloseStatusUpdate({options,fieldFlags,statusRegistry,workflowTransitionWarnings,global:global2,id});if(routedClose){return routedClose}assertMatchingOrderRank(options);const relationshipRegistry=resolveWorkspaceRelationshipKindRegistry();const hierarchyMutationRequired=fieldFlags.parent&&!clearItemMetadataKeys.has("parent")||dependencyUpdates.additions.some(dependency=>relationshipRegistry.resolve(dependency.kind)?.hierarchy);const releaseHierarchyMutationLock=await acquireHierarchyMutationLock({pmRoot,author,ttlSeconds:settings.locks.ttl_seconds,waitMs:settings.locks.wait_ms,required:hierarchyMutationRequired});try{let graphBeforeUpdate=await loadUpdateRelationshipGraph({fieldFlags,clearedMetadataKeys:clearItemMetadataKeys,pmRoot,settings,typeToFolder:typeRegistry.type_to_folder});let lifecycleTransition;let recurrenceHistoryContext;const result=await mutateItemWithHistoryContextResolver({pmRoot,settings,typeToFolder:typeRegistry.type_to_folder,id,op:resolveUpdateHistoryOperation(options,execution),author,message:options.message,resolveHistoryContext:()=>recurrenceHistoryContext,force:options.force,bypassAssigneeConflict:options.ownershipMetadataBypass===true||options.ownershipDependencyBypass===true,extensionFieldNames,skipNoop:true,mutate(document){lifecycleTransition=prepareRecurrenceTransition({document,recurrenceReason:execution.recurrenceReason,requestedStatus:options.status,statusRegistry});recurrenceHistoryContext=lifecycleTransition?{recurrence:lifecycleTransition}:void 0;graphBeforeUpdate=graphBeforeUpdate?.map(item=>item.id===document.metadata.id?structuredClone(document.metadata):item);const mutation=mutateUpdateDocument(document,{options,settings,typeRegistry,statusRegistry,runtimeFieldRegistry,extensionRegistrations,extensionFieldNames,clearItemMetadataKeys,dependencyUpdates,dependencyRemovals,commentUpdates,noteUpdates,learningUpdates,fileUpdates,testUpdates,docUpdates,resolvedParentValue:parentReference.resolvedParentValue,resolvedBlockedByDependencyId,runtimeFieldUpdates,nowValue,nowIso,author,pmRoot});assertUpdateHierarchyIntegrity({before:graphBeforeUpdate,document,statusRegistry});return mutation}});await releaseHierarchyMutationLock();const orderingCycleWarnings=graphBeforeUpdate?collectNewOrderingCycleWarnings(graphBeforeUpdate,graphBeforeUpdate.map(item=>item.id===result.item.id?result.item:item),result.item.id):[];return{item:toItemRecord(result.item),changed_fields:result.changedFields,warnings:[...workflowTransitionWarnings,...parentReferenceWarnings,...dependencyTargetWarnings,...orderingCycleWarnings,...result.warnings],...lifecycleTransition===void 0?{}:{lifecycle_transition:lifecycleTransition}}}finally{await releaseHierarchyMutationLock()}}function resolveUpdateHistoryOperation(options,execution){if(options.ownershipMetadataBypass===true||options.ownershipDependencyBypass===true){return"update_ownership_bypass"}return execution.recurrenceReason===void 0?"update":"reopen"}function prepareRecurrenceTransition(params){if(params.recurrenceReason===void 0){return void 0}const fromStatus=normalizeStatusInput(params.document.metadata.status,params.statusRegistry)??params.document.metadata.status;if(!isTerminalStatus(fromStatus,params.statusRegistry)){throw new PmCliError(`Item ${params.document.metadata.id} is already active with status ${fromStatus}; recurrence transitions require a terminal item.`,EXIT_CODE.CONFLICT,{code:"item_already_active",reason:"recurrence_requires_terminal_item",required:"Use item reopen only for a terminal item whose work has recurred.",why:"Appending a recurrence event to active work would corrupt lifecycle history.",recovery:{suggested_retry:`pm get ${params.document.metadata.id} --full`,suggested_retry_args:["get",params.document.metadata.id,"--full"]},nextSteps:[`Inspect the active item with: pm get ${params.document.metadata.id} --full`,`Continue the existing work with: pm update ${params.document.metadata.id} ...`]})}const requestedStatus=params.requestedStatus??params.statusRegistry.open_status;const toStatus=normalizeStatusInput(requestedStatus,params.statusRegistry)??requestedStatus;const metadata=toItemRecord(params.document.metadata);const previousTerminal=Object.fromEntries(["close_reason","resolution","expected_result","actual_result","fixed_version"].flatMap(key=>{const value=metadata[key];return typeof value==="string"?[[key,value]]:[]}));return{reason:params.recurrenceReason,from_status:fromStatus,to_status:toStatus,previous_terminal:previousTerminal}}async function runUpdate(id,options,global2){return runUpdateWithContext(id,options,global2)}async function runReopenUpdate(id,options,global2,recurrenceReason){const result=await runUpdateWithContext(id,options,global2,{recurrenceReason});if(result.lifecycle_transition===void 0){throw new PmCliError(`Item ${id} did not produce the required recurrence receipt.`,EXIT_CODE.GENERIC_FAILURE,{code:"reopen_receipt_missing",reason:"recurrence_transition_not_recorded",required:"A successful reopen must return the terminal-to-active lifecycle transition recorded in immutable history."})}return{...result,lifecycle_transition:result.lifecycle_transition}}const _testOnlyUpdateCommand={applyStatusAndCloseReasonMutations,collectProvidedUpdatePolicyOptions,buildOwnershipBypassRestrictedOptionsError,enforceOwnershipBypassScope,enforceTypeWorkflowTransition,matchesDependencySelector,normalizeLegacyNoneUpdateOptions,normalizeUpdatePolicyOptionKey,parseDependencyAdditions,parseDependencyRemovals,parseUpdateUnsetTargets,reconcileBlockedByDependency,resolveRuntimeUnsetDefinition:(token,registry)=>resolveRuntimeUnsetFieldDefinition(token,"update",registry)};export{_testOnlyUpdateCommand,assertUpdateMutationOptionCombinations,parseDependencyAdditions,resolveUpdateTransportOptions,runReopenUpdate,runUpdate};
1
+ (function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},n=new e.Error().stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="9ee587b5-5aa8-5d10-89d7-acc4a5edb53f")}catch{}})();import{assertInitializedTracker}from"../environment/tracker-preflight.js";import{resolveMutationStdinTokenFields}from"../../core/item/parse.js";import{COMMON_MUTATION_COMMAND_OPTION_KEYS,canonicalizeCommandOptionKey,commandOptionFlagLabel,resolveItemTypeRegistry,resolveCommandOptionPolicyState,resolveTypeDefinition,resolveTypeName,validateTypeOptions,normalizeItemId,toItemRecord,buildInvalidTypeError,assertParentReferenceIsNotSelf,normalizeParentReferenceValue,validateMissingParentReference,validateSprintOrReleaseValue,applyAcceptanceCriteriaMutations,applyTagRemovals,assertNoUnknownCsvKeys,looksLikeGenericKeyValueEntry,mergeAdditiveTags,parseCsvKv,parseOptionalNonNegativeInteger,parseOptionalNumber,parseTags,shouldResolveMutationStdinTokens,transferMutationStdinTokenPolicy,splitAcceptanceCriteria,resolvePriority,normalizeStatusInput,isTerminalStatus,collectRuntimeUpdateFieldValues,resolveItemTypesFilePath,resolveRuntimeFieldRegistry,resolveRuntimeStatusRegistry,describeAllowedTransitions,evaluateTransition,resolveTypeWorkflows,EXIT_CODE,PmCliError,stableValueEquals,resolveIsoOrRelative,getActiveExtensionRegistrations,collectRegisteredItemFieldNames,applyRegisteredItemFieldDefaultsAndValidation,parseRegisteredItemFieldAssignments,buildItemNotFoundError,listAllItemMetadataLight,locateItem,readLocatedItem,resolvePmRoot,readSettings,resolveAuthor}from"../runtime-primitives.js";import{mutateItemWithHistoryContextResolver}from"../../core/store/item-store.js";import{runClose}from"./close.js";import{normalizeRiskInput,normalizeSeverityInput,parseConfidenceInput,parseRegressionInput}from"./metadata-normalizers.js";import{applyLegacyNoneCollectionNormalizers,createLegacyNoneCollectionNormalizers,assertNoLegacyNoneToken,assertNoLegacyNoneTokens,isLegacyNoneToken}from"./legacy-none-tokens.js";import{ensureEnumValue as ensureEnum}from"./recurrence-parsers.js";import{parseEventEntries,parseReminderEntries,parseTypeOptionEntries}from"./repeatable-metadata-parsers.js";import{assertDependencyEdgesAllowed,assertDependencyTargetsResolvable,assertValidBareDependencyFlagValue}from"../dependency-flag-validation.js";import{normalizeDependencySeedId,normalizeItemReference,isExternalDependencyReference,normalizeDependencySourceKind}from"../dependency-provenance.js";import{resolveCanonicalRelationshipKind}from"../relationships.js";import{collectNewOrderingCycleWarnings}from"../graph/mutation-advisory.js";import{assertHierarchyMutationAllowed}from"../graph/hierarchy-integrity.js";import{resolveWorkspaceRelationshipKindRegistry}from"../graph/assembly.js";import{acquireHierarchyMutationLock}from"./hierarchy-mutation-lock.js";import{DEPENDENCY_KIND_VALUES,ISSUE_SEVERITY_VALUES,RISK_VALUES}from"../../types/index.js";import{parseDocs,parseFiles,parseLogSeed,parseTests,requireStringOption}from"./create.js";import{attachLinkedTestMutationProvenance}from"../test/trust.js";import{COMMON_UNSET_FIELD_DEFINITIONS_AFTER_CLOSE_REASON_BEFORE_AUTHOR,COMMON_UNSET_FIELD_DEFINITIONS_AFTER_AUTHOR,COMMON_UNSET_FIELD_DEFINITIONS_BEFORE_CLOSE_REASON,parseCommandUnsetTargets,resolveRuntimeUnsetFieldDefinition}from"./shared-unset-fields.js";const UPDATE_UNSET_FIELD_DEFINITIONS=[...COMMON_UNSET_FIELD_DEFINITIONS_BEFORE_CLOSE_REASON,{canonical:"close-reason",aliases:["close_reason","close-reason"],optionKey:"closeReason",metadataKey:"close_reason"},...COMMON_UNSET_FIELD_DEFINITIONS_AFTER_CLOSE_REASON_BEFORE_AUTHOR,...COMMON_UNSET_FIELD_DEFINITIONS_AFTER_AUTHOR],UPDATE_UNSET_ALIAS_MAP=(()=>{const map=new Map;for(const definition of UPDATE_UNSET_FIELD_DEFINITIONS)for(const alias of definition.aliases)map.set(alias,{optionKey:definition.optionKey,metadataKey:definition.metadataKey});return map})(),UPDATE_OPTION_KEY_TO_UNSET_CANONICAL=new Map(UPDATE_UNSET_FIELD_DEFINITIONS.map(definition=>[definition.optionKey,definition.canonical])),UPDATE_UNSET_SUPPORTED_CANONICAL_FIELDS=UPDATE_UNSET_FIELD_DEFINITIONS.map(definition=>definition.canonical).sort((left,right)=>left.localeCompare(right)).join(", "),OWNERSHIP_BYPASS_DISALLOWED_UNSET_ITEM_METADATA_KEYS=new Set(["close_reason","assignee","parent","blocked_by","blocked_reason","unblock_note","dependencies","comments","notes","learnings","files","tests","docs","reminders","events"]),UPDATE_LEGACY_NONE_COLLECTION_NORMALIZERS=createLegacyNoneCollectionNormalizers({depDisableFlagKey:"replaceDeps",fileDisableFlagKey:"replaceFiles",testDisableFlagKey:"replaceTests",docDisableFlagKey:"replaceDocs"});function normalizeLegacyNoneUpdateOptions(options){const normalized={...options,unset:options.unset?[...options.unset]:void 0},appendUnsetTarget=value=>{const current=normalized.unset?[...normalized.unset]:[];current.includes(value)||current.push(value),normalized.unset=current},scalarOptionKeys=new Set([...UPDATE_OPTION_KEY_TO_UNSET_CANONICAL.keys(),"rank"]);for(const optionKey of scalarOptionKeys){const candidate=normalized[optionKey];if(typeof candidate!="string"||!isLegacyNoneToken(candidate))continue;const canonicalUnset=optionKey==="rank"?"order":UPDATE_OPTION_KEY_TO_UNSET_CANONICAL.get(optionKey)??optionKey;appendUnsetTarget(canonicalUnset),normalized[optionKey]=void 0}return transferMutationStdinTokenPolicy(options,applyLegacyNoneCollectionNormalizers(normalized,UPDATE_LEGACY_NONE_COLLECTION_NORMALIZERS))}function parseUpdateUnsetTargets(raw,runtimeFieldRegistry,extensionFieldNames=[]){return parseCommandUnsetTargets({raw,supportedFields:UPDATE_UNSET_SUPPORTED_CANONICAL_FIELDS,resolveDefinition:trimmed=>{const extensionFieldName=extensionFieldNames.find(fieldName=>{const normalizedFieldName=fieldName.toLowerCase();return normalizedFieldName===trimmed||normalizedFieldName.replaceAll("_","-")===trimmed||normalizedFieldName.replaceAll("-","_")===trimmed});return UPDATE_UNSET_ALIAS_MAP.get(trimmed)??resolveRuntimeUnsetFieldDefinition(trimmed,"update",runtimeFieldRegistry)??(extensionFieldName?{optionKey:"field",metadataKey:extensionFieldName}:void 0)}})}const OWNERSHIP_BYPASS_RESTRICTED_FLAG_REPLACEMENTS=new Map([["--comment",id=>`pm comments ${id} --add "<text>" --force`],["--file",id=>`pm files ${id} --add "path=<path>,scope=<scope>,note=<note>" --force`],["--doc",id=>`pm docs ${id} --add "path=<path>,scope=<scope>,note=<note>" --force`]]);function buildOwnershipBypassRestrictedOptionsError(params){const replacementCommands=params.disallowedFlags.flatMap(flag=>{const replacement=OWNERSHIP_BYPASS_RESTRICTED_FLAG_REPLACEMENTS.get(flag);return replacement?[replacement(params.id)]:[]}),replacementSteps=params.disallowedFlags.flatMap(flag=>{const replacement=OWNERSHIP_BYPASS_RESTRICTED_FLAG_REPLACEMENTS.get(flag);return replacement?[`Replace ${flag} with: ${replacement(params.id)}`]:[]});return new PmCliError(params.message,EXIT_CODE.USAGE,{code:params.code,required:params.required,why:params.why,...replacementCommands.length>0?{examples:replacementCommands}:{},nextSteps:[`Re-run without: ${params.disallowedFlags.join(", ")}`,...replacementSteps]})}function enforceOwnershipBypassScope(id,options,clearItemMetadataKeys){const ownershipMetadataBypass=options.ownershipMetadataBypass===!0,ownershipDependencyBypass=options.ownershipDependencyBypass===!0;if(!ownershipMetadataBypass&&!ownershipDependencyBypass)return;if(ownershipMetadataBypass&&ownershipDependencyBypass)throw new PmCliError("Choose only one package-provided ownership bypass mode.",EXIT_CODE.USAGE);const pushIf=(condition,flag,list)=>{condition&&list.push(flag)};if(ownershipDependencyBypass){const disallowedFlags2=[];if(pushIf(options.title!==void 0,"--title",disallowedFlags2),pushIf(options.description!==void 0,"--description",disallowedFlags2),pushIf(options.body!==void 0,"--body",disallowedFlags2),pushIf(options.status!==void 0,"--status",disallowedFlags2),pushIf(options.closeReason!==void 0,"--close-reason",disallowedFlags2),pushIf(options.priority!==void 0,"--priority",disallowedFlags2),pushIf(options.type!==void 0,"--type",disallowedFlags2),pushIf(options.tags!==void 0,"--tags",disallowedFlags2),pushIf(Array.isArray(options.addTags)&&options.addTags.length>0,"--add-tags",disallowedFlags2),pushIf(Array.isArray(options.removeTags)&&options.removeTags.length>0,"--remove-tags",disallowedFlags2),pushIf(options.deadline!==void 0,"--deadline",disallowedFlags2),pushIf(options.estimatedMinutes!==void 0,"--estimate",disallowedFlags2),pushIf(options.acceptanceCriteria!==void 0,"--acceptance-criteria",disallowedFlags2),pushIf(Array.isArray(options.addAc)&&options.addAc.length>0,"--add-ac",disallowedFlags2),pushIf(Array.isArray(options.removeAc)&&options.removeAc.length>0,"--remove-ac",disallowedFlags2),pushIf(options.definitionOfReady!==void 0,"--definition-of-ready",disallowedFlags2),pushIf(options.order!==void 0||options.rank!==void 0,"--order/--rank",disallowedFlags2),pushIf(options.goal!==void 0,"--goal",disallowedFlags2),pushIf(options.objective!==void 0,"--objective",disallowedFlags2),pushIf(options.value!==void 0,"--value",disallowedFlags2),pushIf(options.impact!==void 0,"--impact",disallowedFlags2),pushIf(options.outcome!==void 0,"--outcome",disallowedFlags2),pushIf(options.whyNow!==void 0,"--why-now",disallowedFlags2),pushIf(options.assignee!==void 0,"--assignee",disallowedFlags2),pushIf(options.parent!==void 0,"--parent",disallowedFlags2),pushIf(options.reviewer!==void 0,"--reviewer",disallowedFlags2),pushIf(options.risk!==void 0,"--risk",disallowedFlags2),pushIf(options.confidence!==void 0,"--confidence",disallowedFlags2),pushIf(options.sprint!==void 0,"--sprint",disallowedFlags2),pushIf(options.release!==void 0,"--release",disallowedFlags2),pushIf(options.blockedBy!==void 0,"--blocked-by",disallowedFlags2),pushIf(options.blockedReason!==void 0,"--blocked-reason",disallowedFlags2),pushIf(options.unblockNote!==void 0,"--unblock-note",disallowedFlags2),pushIf(options.reporter!==void 0,"--reporter",disallowedFlags2),pushIf(options.severity!==void 0,"--severity",disallowedFlags2),pushIf(options.environment!==void 0,"--environment",disallowedFlags2),pushIf(options.reproSteps!==void 0,"--repro-steps",disallowedFlags2),pushIf(options.resolution!==void 0,"--resolution",disallowedFlags2),pushIf(options.expectedResult!==void 0,"--expected-result",disallowedFlags2),pushIf(options.actualResult!==void 0,"--actual-result",disallowedFlags2),pushIf(options.affectedVersion!==void 0,"--affected-version",disallowedFlags2),pushIf(options.fixedVersion!==void 0,"--fixed-version",disallowedFlags2),pushIf(options.component!==void 0,"--component",disallowedFlags2),pushIf(options.regression!==void 0,"--regression",disallowedFlags2),pushIf(options.customerImpact!==void 0,"--customer-impact",disallowedFlags2),pushIf(options.depRemove!==void 0,"--dep-remove",disallowedFlags2),pushIf(options.replaceDeps===!0,"--replace-deps",disallowedFlags2),pushIf(options.replaceTests===!0,"--replace-tests",disallowedFlags2),pushIf(options.replaceFiles===!0,"--replace-files",disallowedFlags2),pushIf(options.replaceDocs===!0,"--replace-docs",disallowedFlags2),pushIf(options.comment!==void 0,"--comment",disallowedFlags2),pushIf(options.note!==void 0,"--note",disallowedFlags2),pushIf(options.learning!==void 0,"--learning",disallowedFlags2),pushIf(options.file!==void 0,"--file",disallowedFlags2),pushIf(options.test!==void 0,"--test",disallowedFlags2),pushIf(options.doc!==void 0,"--doc",disallowedFlags2),pushIf(options.reminder!==void 0,"--reminder",disallowedFlags2),pushIf(options.event!==void 0,"--event",disallowedFlags2),pushIf(options.typeOption!==void 0,"--type-option",disallowedFlags2),pushIf(options.clearDeps===!0,"--clear-deps",disallowedFlags2),pushIf(options.clearComments===!0,"--clear-comments",disallowedFlags2),pushIf(options.clearNotes===!0,"--clear-notes",disallowedFlags2),pushIf(options.clearLearnings===!0,"--clear-learnings",disallowedFlags2),pushIf(options.clearFiles===!0,"--clear-files",disallowedFlags2),pushIf(options.clearTests===!0,"--clear-tests",disallowedFlags2),pushIf(options.clearDocs===!0,"--clear-docs",disallowedFlags2),pushIf(options.clearReminders===!0,"--clear-reminders",disallowedFlags2),pushIf(options.clearEvents===!0,"--clear-events",disallowedFlags2),pushIf(options.clearTypeOptions===!0,"--clear-type-options",disallowedFlags2),pushIf(options.force===!0,"--force",disallowedFlags2),pushIf(clearItemMetadataKeys.size>0,"--unset",disallowedFlags2),options.dep===void 0||options.dep.length===0)throw new PmCliError("The dependency ownership bypass requires at least one --dep value",EXIT_CODE.USAGE);if(disallowedFlags2.length>0)throw buildOwnershipBypassRestrictedOptionsError({id,code:"ownership_dependency_bypass_restricted_options",message:`The dependency ownership bypass supports append-only dependency additions via --dep. Remove restricted options: ${disallowedFlags2.join(", ")}`,required:"Pass only --dep additions (plus --message/--author) with the dependency ownership bypass.",why:"the dependency ownership bypass is a narrow non-owner override scoped to append-only dependency additions; every other mutation keeps its normal ownership rules.",disallowedFlags:disallowedFlags2});return}const disallowedFlags=[];pushIf(options.status!==void 0,"--status",disallowedFlags),pushIf(options.closeReason!==void 0,"--close-reason",disallowedFlags),pushIf(options.assignee!==void 0,"--assignee",disallowedFlags),pushIf(options.parent!==void 0,"--parent",disallowedFlags),pushIf(options.blockedBy!==void 0,"--blocked-by",disallowedFlags),pushIf(options.blockedReason!==void 0,"--blocked-reason",disallowedFlags),pushIf(options.unblockNote!==void 0,"--unblock-note",disallowedFlags),pushIf(options.dep!==void 0,"--dep",disallowedFlags),pushIf(options.depRemove!==void 0,"--dep-remove",disallowedFlags),pushIf(options.replaceDeps===!0,"--replace-deps",disallowedFlags),pushIf(options.replaceTests===!0,"--replace-tests",disallowedFlags),pushIf(options.replaceFiles===!0,"--replace-files",disallowedFlags),pushIf(options.replaceDocs===!0,"--replace-docs",disallowedFlags),pushIf(options.note!==void 0,"--note",disallowedFlags),pushIf(options.learning!==void 0,"--learning",disallowedFlags),pushIf(options.test!==void 0,"--test",disallowedFlags),pushIf(options.reminder!==void 0,"--reminder",disallowedFlags),pushIf(options.event!==void 0,"--event",disallowedFlags),pushIf(options.clearDeps===!0,"--clear-deps",disallowedFlags),pushIf(options.clearComments===!0,"--clear-comments",disallowedFlags),pushIf(options.clearNotes===!0,"--clear-notes",disallowedFlags),pushIf(options.clearLearnings===!0,"--clear-learnings",disallowedFlags),pushIf(options.clearFiles===!0,"--clear-files",disallowedFlags),pushIf(options.clearTests===!0,"--clear-tests",disallowedFlags),pushIf(options.clearDocs===!0,"--clear-docs",disallowedFlags),pushIf(options.clearReminders===!0,"--clear-reminders",disallowedFlags),pushIf(options.clearEvents===!0,"--clear-events",disallowedFlags);const disallowedUnset=[...clearItemMetadataKeys].filter(field=>OWNERSHIP_BYPASS_DISALLOWED_UNSET_ITEM_METADATA_KEYS.has(field)).sort((left,right)=>left.localeCompare(right)).map(field=>`--unset ${field.replaceAll("_","-")}`);if(disallowedFlags.push(...disallowedUnset),disallowedFlags.length>0)throw buildOwnershipBypassRestrictedOptionsError({id,code:"ownership_metadata_bypass_restricted_options",message:`The metadata ownership bypass only supports non-lifecycle metadata fields and evidence appends. Remove restricted options: ${disallowedFlags.join(", ")}`,required:"Limit the metadata ownership bypass to non-lifecycle metadata fields plus append-only --comment/--file/--doc evidence; route restricted appends and lifecycle changes through their dedicated commands.",why:"the metadata ownership bypass is a non-owner override scoped to metadata maintenance and append-only evidence; lifecycle, ownership, dependency mutations, restricted append fields, and clear/replace operations keep their normal ownership rules.",disallowedFlags})}function parseStatus(value,statusRegistry){const normalized=normalizeStatusInput(value,statusRegistry);if(!normalized){const allowedStatuses=statusRegistry.definitions.map(definition=>definition.id);throw new PmCliError(`Invalid --status value "${value}". Allowed: ${allowedStatuses.join(", ")}`,EXIT_CODE.USAGE)}return normalized}function enforceTypeWorkflowTransition(params){if(params.enforcement==="off"||params.typeWorkflows.length===0)return;const result=evaluateTransition({typeName:params.typeName,fromStatus:params.fromStatus,toStatus:params.toStatus,typeWorkflows:params.typeWorkflows,statusRegistry:params.statusRegistry});if(!result.hasRule||result.allowed)return;const normalizedFrom=normalizeStatusInput(params.fromStatus,params.statusRegistry)??params.fromStatus,normalizedTo=normalizeStatusInput(params.toStatus,params.statusRegistry)??params.toStatus,message=`Disallowed transition for type "${params.typeName}": ${normalizedFrom} -> ${normalizedTo}. Allowed transitions: ${describeAllowedTransitions(result.allowedTransitions)}.`;if(params.enforcement==="strict")throw new PmCliError(message,EXIT_CODE.USAGE);return`workflow_transition_not_allowed: ${message}`}function parseDependencyCreatedAt(value,currentIso){return!value||value.trim()===""||value.trim().toLowerCase()==="now"?currentIso:normalizeDependencyTimestamp(value)}function normalizeDependencyTimestamp(value){const parsed=Date.parse(value);if(!Number.isFinite(parsed))throw new PmCliError(`Invalid dependency created_at timestamp "${value}"`,EXIT_CODE.USAGE);return new Date(parsed).toISOString()}function parseOptionalDependencyString(value){if(value===void 0)return;const trimmed=value.trim();return trimmed.length>0?trimmed:void 0}const DEP_ADDITION_KEYS=["id","kind","type","author","created_at","source_kind"],DEP_REMOVE_KEYS=["id","kind","type","author","created_at","source_kind"];function looksLikeStructuredDependencyEntry(raw){return raw.startsWith("```")||raw.includes(`
2
+ `)||/^(?:[-*+]\s+)?(?:id|kind|type|author|created_at|source_kind)\s*[:=]/i.test(raw)?!0:looksLikeGenericKeyValueEntry(raw)}function normalizeDependencyKindInput(raw){return typeof raw=="string"?resolveCanonicalRelationshipKind(raw)??raw.trim():raw}function parseDependencyAdditions(raw,prefix,nowIso,fallbackAuthor){return raw?(assertNoLegacyNoneTokens(raw,"--dep","Use --clear-deps to clear dependencies."),{additions:raw.map(entry=>{const trimmedEntry=entry.trim(),isStructured=looksLikeStructuredDependencyEntry(trimmedEntry);assertValidBareDependencyFlagValue(trimmedEntry,isStructured);const kv=isStructured?parseCsvKv(entry,"--dep"):{id:trimmedEntry,kind:"related"};isStructured&&assertNoUnknownCsvKeys(kv,"--dep",DEP_ADDITION_KEYS);const id=kv.id?.trim(),kind=normalizeDependencyKindInput((kv.kind??kv.type)?.trim());if(!id||!kind)throw new PmCliError("--dep requires id and kind, or a bare item id to add a related dependency",EXIT_CODE.USAGE);if(id.toLowerCase()==="undefined")throw new PmCliError(`--dep id must not use placeholder token "${id}". Use --clear-deps to clear dependencies.`,EXIT_CODE.USAGE);const sourceKind=normalizeDependencySourceKind(parseOptionalDependencyString(kv.source_kind)),explicitAuthor=parseOptionalDependencyString(kv.author);return{id:normalizeDependencySeedId(id,prefix,sourceKind),kind:ensureEnum(kind,DEPENDENCY_KIND_VALUES,"dependency kind","kind"),created_at:parseDependencyCreatedAt(kv.created_at,nowIso),author:explicitAuthor??fallbackAuthor,source_kind:sourceKind??"cli:update:dep",author_source:explicitAuthor?"asserted":"detected"}})}):{additions:[]}}function parseDependencyRemovals(raw,prefix){return raw?(assertNoLegacyNoneTokens(raw,"--dep-remove"),raw.map(entry=>{const trimmed=entry.trim();if(!trimmed)throw new PmCliError("--dep-remove requires id or key/value selectors",EXIT_CODE.USAGE);const isStructured=looksLikeStructuredDependencyEntry(trimmed);if(assertValidBareDependencyFlagValue(trimmed,isStructured,"--dep-remove"),isStructured){const kv=parseCsvKv(trimmed,"--dep-remove");assertNoUnknownCsvKeys(kv,"--dep-remove",DEP_REMOVE_KEYS);const idRaw=kv.id?.trim();if(!idRaw)throw new PmCliError("--dep-remove key/value form requires id=<value>",EXIT_CODE.USAGE);if(idRaw.toLowerCase()==="undefined")throw new PmCliError(`--dep-remove id must not use placeholder token "${idRaw}"`,EXIT_CODE.USAGE);const kindRaw=normalizeDependencyKindInput(parseOptionalDependencyString(kv.kind??kv.type)),sourceKind=normalizeDependencySourceKind(parseOptionalDependencyString(kv.source_kind)),author=parseOptionalDependencyString(kv.author),createdAt=parseOptionalDependencyString(kv.created_at);return{id:normalizeDependencySeedId(idRaw,prefix,sourceKind),kind:kindRaw?ensureEnum(kindRaw,DEPENDENCY_KIND_VALUES,"dependency kind","kind"):void 0,source_kind:sourceKind,author,created_at:createdAt?normalizeDependencyTimestamp(createdAt):void 0}}if(trimmed.toLowerCase()==="undefined")throw new PmCliError(`--dep-remove id must not use placeholder token "${trimmed}"`,EXIT_CODE.USAGE);return{id:normalizeItemId(trimmed,prefix)}})):[]}function dependencyKey(value){const sourceKind=value.source_kind?.trim().toLowerCase()??"";return[value.id.trim().toLowerCase(),value.kind,sourceKind].join("\0")}function storedDependencyIdentityKey(value){const sourceKind=value.source_kind?.trim().toLowerCase()??"",author=value.author?.trim().toLowerCase()??"",rawCreatedAt=value.created_at?.trim()??"",parsedCreatedAt=Date.parse(rawCreatedAt),createdAt=Number.isFinite(parsedCreatedAt)?new Date(parsedCreatedAt).toISOString():rawCreatedAt;return[value.id.trim().toLowerCase(),value.kind,sourceKind,author,createdAt].join("\0")}function reconcileBlockedByDependency(current,nextBlockedById,nowIsoValue,author){let next=[...current??[]],changed=!1;if(nextBlockedById===void 0){const filtered=next.filter(dep=>dep.kind!=="blocked_by");return filtered.length!==next.length&&(next=filtered,changed=!0),changed?{dependencies:next.length>0?next:void 0,changed:!0}:{dependencies:current,changed:!1}}return next.some(dep=>dep.kind==="blocked_by"&&dep.id===nextBlockedById)||(next.push({id:nextBlockedById,kind:"blocked_by",created_at:nowIsoValue,author,source_kind:"cli:update:blocked_by",author_source:"detected"}),changed=!0),changed?{dependencies:next.length>0?next:void 0,changed:!0}:{dependencies:current,changed:!1}}async function resolveBlockedByDependencyTarget(blockedByOption,blockedByCleared,pmRoot,idPrefix,itemFormat,typeToFolder){if(blockedByOption===void 0||blockedByCleared)return{};const blockedByValue=blockedByOption.trim();if(blockedByValue.length===0)return{};const located=await locateItem(pmRoot,normalizeItemId(blockedByValue,idPrefix),idPrefix,itemFormat,typeToFolder);return located?{id:located.id}:{unresolved:blockedByValue}}function applyBlockedByDependencyEdge(metadata,resolvedBlockedById,nowIsoValue,author,changedFields){const reconciled=reconcileBlockedByDependency(metadata.dependencies,resolvedBlockedById,nowIsoValue,author);reconciled.changed&&(reconciled.dependencies===void 0?delete metadata.dependencies:metadata.dependencies=reconciled.dependencies,changedFields.includes("dependencies")||changedFields.push("dependencies"))}function fileKey(value){return`${value.path}::${value.scope}`}function docKey(value){return`${value.path}::${value.scope}`}function testKey(value){return`${value.command}::${value.path??""}::${value.scope}::${value.pm_context_mode??""}::${value.workspace_context_mode??""}`}function matchesDependencySelector(value,selector){return!(value.id.trim().toLowerCase()!==selector.id.trim().toLowerCase()||selector.kind&&value.kind!==selector.kind||selector.source_kind!==void 0&&value.source_kind?.trim().toLowerCase()!==selector.source_kind.trim().toLowerCase()||selector.author!==void 0&&value.author?.trim().toLowerCase()!==selector.author.trim().toLowerCase()||selector.created_at!==void 0&&(value.created_at===void 0||!Number.isFinite(Date.parse(value.created_at))||new Date(Date.parse(value.created_at)).toISOString()!==selector.created_at))}function normalizeUpdatePolicyOptionKey(raw,typeName){const canonical=canonicalizeCommandOptionKey("update",raw);if(!canonical)throw new PmCliError(`Unsupported command_option_policies option "${raw}" for update command on type "${typeName}"`,EXIT_CODE.CONFLICT);return canonical}function collectProvidedUpdatePolicyOptions(options,runtimeFieldRegistry,extensionFieldNames){const provided=new Set,mark=(optionKey,isProvided)=>{isProvided&&provided.add(optionKey)};if(mark("title",options.title!==void 0),mark("description",options.description!==void 0),mark("body",options.body!==void 0),mark("status",options.status!==void 0),mark("closeReason",options.closeReason!==void 0),mark("priority",options.priority!==void 0),mark("type",options.type!==void 0),mark("tags",options.tags!==void 0||Array.isArray(options.addTags)&&options.addTags.length>0||Array.isArray(options.removeTags)&&options.removeTags.length>0),mark("deadline",options.deadline!==void 0),mark("estimatedMinutes",options.estimatedMinutes!==void 0),mark("acceptanceCriteria",options.acceptanceCriteria!==void 0||Array.isArray(options.addAc)&&options.addAc.length>0||Array.isArray(options.removeAc)&&options.removeAc.length>0),mark("definitionOfReady",options.definitionOfReady!==void 0),mark("order",options.order!==void 0||options.rank!==void 0),mark("goal",options.goal!==void 0),mark("objective",options.objective!==void 0),mark("value",options.value!==void 0),mark("impact",options.impact!==void 0),mark("outcome",options.outcome!==void 0),mark("whyNow",options.whyNow!==void 0),mark("author",options.author!==void 0),mark("message",options.message!==void 0),mark("assignee",options.assignee!==void 0),mark("parent",options.parent!==void 0),mark("reviewer",options.reviewer!==void 0),mark("risk",options.risk!==void 0),mark("confidence",options.confidence!==void 0),mark("sprint",options.sprint!==void 0),mark("release",options.release!==void 0),mark("blockedBy",options.blockedBy!==void 0),mark("blockedReason",options.blockedReason!==void 0),mark("unblockNote",options.unblockNote!==void 0),mark("reporter",options.reporter!==void 0),mark("severity",options.severity!==void 0),mark("environment",options.environment!==void 0),mark("reproSteps",options.reproSteps!==void 0),mark("resolution",options.resolution!==void 0),mark("expectedResult",options.expectedResult!==void 0),mark("actualResult",options.actualResult!==void 0),mark("affectedVersion",options.affectedVersion!==void 0),mark("fixedVersion",options.fixedVersion!==void 0),mark("component",options.component!==void 0),mark("regression",options.regression!==void 0),mark("customerImpact",options.customerImpact!==void 0),mark("dep",options.dep!==void 0),mark("depRemove",options.depRemove!==void 0),mark("dep",options.replaceDeps===!0),mark("comment",options.comment!==void 0),mark("note",options.note!==void 0),mark("learning",options.learning!==void 0),mark("file",options.file!==void 0),mark("test",options.test!==void 0),mark("test",options.replaceTests===!0),mark("file",options.replaceFiles===!0),mark("doc",options.replaceDocs===!0),mark("doc",options.doc!==void 0),mark("reminder",options.reminder!==void 0),mark("event",options.event!==void 0),mark("typeOption",options.typeOption!==void 0),mark("field",options.field!==void 0),mark("force",options.force===!0),mark("ownershipMetadataBypass",options.ownershipMetadataBypass===!0),mark("ownershipDependencyBypass",options.ownershipDependencyBypass===!0),mark("dep",options.clearDeps===!0),mark("comment",options.clearComments===!0),mark("note",options.clearNotes===!0),mark("learning",options.clearLearnings===!0),mark("file",options.clearFiles===!0),mark("test",options.clearTests===!0),mark("doc",options.clearDocs===!0),mark("reminder",options.clearReminders===!0),mark("event",options.clearEvents===!0),mark("typeOption",options.clearTypeOptions===!0),options.unset&&options.unset.length>0){const unsetTargets=parseUpdateUnsetTargets(options.unset,runtimeFieldRegistry,extensionFieldNames);for(const optionKey of unsetTargets.optionKeys)mark(optionKey,!0)}return provided}function enforceUpdateOptionsByType(typeName,options,typeRegistry,runtimeFieldRegistry,extensionFieldNames){const typeDefinition=resolveTypeDefinition(typeName,typeRegistry);if(!typeDefinition)throw new PmCliError(`Invalid type value "${typeName}"`,EXIT_CODE.USAGE);const policyState=resolveCommandOptionPolicyState(typeDefinition,"update",[]);if(policyState.errors.length>0)throw new PmCliError(policyState.errors.join("; "),EXIT_CODE.CONFLICT);const provided=collectProvidedUpdatePolicyOptions(options,runtimeFieldRegistry,extensionFieldNames);for(const disabled of policyState.disabled)if(provided.has(normalizeUpdatePolicyOptionKey(disabled,typeName)))throw new PmCliError(`Option ${commandOptionFlagLabel("update",disabled)} is disabled for type "${typeName}" by command_option_policies`,EXIT_CODE.USAGE);for(const required of policyState.required)if(!provided.has(normalizeUpdatePolicyOptionKey(required,typeName)))throw new PmCliError(`Missing required option ${commandOptionFlagLabel("update",required)} for type "${typeName}"`,EXIT_CODE.USAGE)}const UPDATE_LEGACY_COMMON_SCALAR_OPTION_EXCLUSIONS=new Set(["order","rank"]),UPDATE_LEGACY_COMMON_SCALAR_OPTION_KEYS=COMMON_MUTATION_COMMAND_OPTION_KEYS.filter(key=>!UPDATE_LEGACY_COMMON_SCALAR_OPTION_EXCLUSIONS.has(key)),UPDATE_LEGACY_SCALAR_OPTION_KEYS=["tags","closeReason",...UPDATE_LEGACY_COMMON_SCALAR_OPTION_KEYS],UPDATE_SIMPLE_FIELD_FLAG_KEYS=["title","description","body","status","closeReason","completedAt","priority","type",...COMMON_MUTATION_COMMAND_OPTION_KEYS,"dep","depRemove","comment","note","learning","file","test","doc","reminder","event","typeOption","field"],UPDATE_POST_TAG_SCALAR_MUTATIONS=[{optionKey:"deadline",metadataKey:"deadline",transform:(value,context)=>resolveIsoOrRelative(value,context.nowValue,"deadline")},{optionKey:"estimatedMinutes",metadataKey:"estimated_minutes",transform:value=>parseOptionalNonNegativeInteger(value,"estimated-minutes")},{optionKey:"acceptanceCriteria",metadataKey:"acceptance_criteria",transform:value=>value},{optionKey:"definitionOfReady",metadataKey:"definition_of_ready"},{optionKey:"goal",metadataKey:"goal"},{optionKey:"objective",metadataKey:"objective"},{optionKey:"value",metadataKey:"value"},{optionKey:"impact",metadataKey:"impact"},{optionKey:"outcome",metadataKey:"outcome"},{optionKey:"whyNow",metadataKey:"why_now"}],UPDATE_STAKEHOLDER_SCALAR_MUTATIONS=[{optionKey:"reviewer",metadataKey:"reviewer"},{optionKey:"risk",metadataKey:"risk",transform:value=>ensureEnum(normalizeRiskInput(value),RISK_VALUES,"risk")},{optionKey:"confidence",metadataKey:"confidence",transform:value=>parseConfidenceInput(value)}],UPDATE_ISSUE_SCALAR_MUTATIONS=[{optionKey:"blockedReason",metadataKey:"blocked_reason"},{optionKey:"unblockNote",metadataKey:"unblock_note"},{optionKey:"reporter",metadataKey:"reporter"},{optionKey:"severity",metadataKey:"severity",transform:value=>ensureEnum(normalizeSeverityInput(value),ISSUE_SEVERITY_VALUES,"severity")},{optionKey:"environment",metadataKey:"environment"},{optionKey:"reproSteps",metadataKey:"repro_steps"},{optionKey:"resolution",metadataKey:"resolution"},{optionKey:"expectedResult",metadataKey:"expected_result"},{optionKey:"actualResult",metadataKey:"actual_result"},{optionKey:"affectedVersion",metadataKey:"affected_version"},{optionKey:"fixedVersion",metadataKey:"fixed_version"},{optionKey:"component",metadataKey:"component"},{optionKey:"regression",metadataKey:"regression",transform:value=>parseRegressionInput(value)},{optionKey:"customerImpact",metadataKey:"customer_impact"}];function applyUpdateScalarMutations(definitions,options,context){for(const definition of definitions){const optionValue=options[definition.optionKey],shouldClear=context.clearItemMetadataKeys.has(definition.metadataKey);if(!(optionValue===void 0&&!shouldClear)){if(shouldClear){delete context.metadataRecord[definition.metadataKey],context.changedFields.push(definition.metadataKey);continue}if(typeof optionValue!="string")throw new PmCliError(`${commandOptionFlagLabel("update",String(definition.optionKey))} must be a string value`,EXIT_CODE.USAGE);context.metadataRecord[definition.metadataKey]=definition.transform?definition.transform(optionValue,context):optionValue.trim(),context.changedFields.push(definition.metadataKey)}}}async function resolveStdinUpdateOptions(options){return normalizeLegacyNoneUpdateOptions(await resolveMutationStdinTokenFields(options,[["body","--body"],["description","--description"]],[["dep","--dep"],["depRemove","--dep-remove"],["comment","--comment"],["note","--note"],["learning","--learning"],["file","--file"],["test","--test"],["doc","--doc"],["reminder","--reminder"],["event","--event"],["typeOption","--type-option"],["field","--field"]]))}async function resolveUpdateTransportOptions(options){return shouldResolveMutationStdinTokens(options)?await resolveStdinUpdateOptions(options):normalizeLegacyNoneUpdateOptions(options)}function buildClearCollectionDefinitions(options){return[{enabled:options.clearDeps||options.replaceDeps,optionKey:"dep",clearFlag:"--clear-deps",valueFlag:"--dep",values:options.dep,metadataKey:"dependencies"},{enabled:options.clearComments,optionKey:"comment",clearFlag:"--clear-comments",valueFlag:"--comment",values:options.comment,metadataKey:"comments"},{enabled:options.clearNotes,optionKey:"note",clearFlag:"--clear-notes",valueFlag:"--note",values:options.note,metadataKey:"notes"},{enabled:options.clearLearnings,optionKey:"learning",clearFlag:"--clear-learnings",valueFlag:"--learning",values:options.learning,metadataKey:"learnings"},{enabled:options.clearFiles||options.replaceFiles,optionKey:"file",clearFlag:"--clear-files",valueFlag:"--file",values:options.file,metadataKey:"files"},{enabled:options.clearTests||options.replaceTests,optionKey:"test",clearFlag:"--clear-tests",valueFlag:"--test",values:options.test,metadataKey:"tests"},{enabled:options.clearDocs||options.replaceDocs,optionKey:"doc",clearFlag:"--clear-docs",valueFlag:"--doc",values:options.doc,metadataKey:"docs"},{enabled:options.clearReminders,optionKey:"reminder",clearFlag:"--clear-reminders",valueFlag:"--reminder",values:options.reminder,metadataKey:"reminders"},{enabled:options.clearEvents,optionKey:"event",clearFlag:"--clear-events",valueFlag:"--event",values:options.event,metadataKey:"events"},{enabled:options.clearTypeOptions,optionKey:"typeOption",clearFlag:"--clear-type-options",valueFlag:"--type-option",values:options.typeOption,metadataKey:"type_options"}]}function validateLinkedArtifactReplacement(params){if(params.enabled&&(!params.values||params.values.length===0))throw new PmCliError(`${params.replaceFlag} requires at least one ${params.valueFlag} entry`,EXIT_CODE.USAGE);if(params.enabled&&params.clearEnabled)throw new PmCliError(`${params.replaceFlag} cannot be combined with ${params.clearFlag}`,EXIT_CODE.USAGE)}function assertUpdateMutationOptionCombinations(options){const hasAdditiveAcceptanceCriteriaMutation=(options.addAc?.length??0)>0||(options.removeAc?.length??0)>0;if(options.acceptanceCriteria!==void 0&&hasAdditiveAcceptanceCriteriaMutation)throw new PmCliError("Cannot combine --acceptance-criteria replacement with --add-ac or --remove-ac. Use --remove-ac and --add-ac together for an atomic one-entry repair.",EXIT_CODE.USAGE,{code:"acceptance_criteria_mutation_conflict",reason:"replacement_and_additive_mutation_combined",nextSteps:["Use --acceptance-criteria alone to replace the complete list.","Use --remove-ac <old> --add-ac <new> to repair one criterion without replacing unrelated entries."]});if(options.replaceDeps===!0&&(options.dep===void 0||options.dep.length===0))throw new PmCliError("--replace-deps requires at least one --dep entry",EXIT_CODE.USAGE);if(options.replaceDeps===!0&&options.depRemove!==void 0&&options.depRemove.length>0)throw new PmCliError("--replace-deps cannot be combined with --dep-remove",EXIT_CODE.USAGE);validateLinkedArtifactReplacement({enabled:options.replaceTests===!0,values:options.test,replaceFlag:"--replace-tests",clearEnabled:options.clearTests===!0,clearFlag:"--clear-tests",valueFlag:"--test"}),validateLinkedArtifactReplacement({enabled:options.replaceFiles===!0,values:options.file,replaceFlag:"--replace-files",clearEnabled:options.clearFiles===!0,clearFlag:"--clear-files",valueFlag:"--file"}),validateLinkedArtifactReplacement({enabled:options.replaceDocs===!0,values:options.doc,replaceFlag:"--replace-docs",clearEnabled:options.clearDocs===!0,clearFlag:"--clear-docs",valueFlag:"--doc"})}function applyClearCollectionDefinitions(params){for(const definition of params.definitions){if(!definition.enabled)continue;const isReplacement=definition.optionKey==="dep"&&params.options.replaceDeps===!0||definition.optionKey==="test"&&params.options.replaceTests===!0||definition.optionKey==="file"&&params.options.replaceFiles===!0||definition.optionKey==="doc"&&params.options.replaceDocs===!0;if(definition.values&&definition.values.length>0&&!isReplacement)throw new PmCliError(`Cannot combine ${definition.clearFlag} with ${definition.valueFlag}`,EXIT_CODE.USAGE);params.clearOptionKeys.add(definition.optionKey),params.clearItemMetadataKeys.add(definition.metadataKey)}}function buildScalarOptionPresence(options){const presence={};for(const key of UPDATE_LEGACY_SCALAR_OPTION_KEYS)presence[String(key)]=options[key]!==void 0;return presence.order=options.order!==void 0||options.rank!==void 0,presence}function rejectUnsetScalarConflicts(options,unsetTargets){const scalarOptionPresence=buildScalarOptionPresence(options);for(const[optionKey,hasValue]of Object.entries(scalarOptionPresence)){if(!hasValue||!unsetTargets.optionKeys.has(optionKey))continue;const unsetField=UPDATE_OPTION_KEY_TO_UNSET_CANONICAL.get(optionKey)??optionKey;throw new PmCliError(`Cannot combine --unset ${unsetField} with ${commandOptionFlagLabel("update",optionKey)}`,EXIT_CODE.USAGE)}if(unsetTargets.metadataKeys.has("acceptance_criteria")){if(Array.isArray(options.addAc)&&options.addAc.length>0)throw new PmCliError("Cannot combine --unset acceptance-criteria with --add-ac",EXIT_CODE.USAGE);if(Array.isArray(options.removeAc)&&options.removeAc.length>0)throw new PmCliError("Cannot combine --unset acceptance-criteria with --remove-ac",EXIT_CODE.USAGE)}if(unsetTargets.metadataKeys.has("tags")){if(Array.isArray(options.addTags)&&options.addTags.length>0)throw new PmCliError("Cannot combine --unset tags with --add-tags",EXIT_CODE.USAGE);if(Array.isArray(options.removeTags)&&options.removeTags.length>0)throw new PmCliError("Cannot combine --unset tags with --remove-tags",EXIT_CODE.USAGE)}}function rejectLegacyScalarTokens(options){const assertNoLegacyScalarToken=(value,optionKey)=>{const unsetField=UPDATE_OPTION_KEY_TO_UNSET_CANONICAL.get(optionKey),hint=unsetField?`Use --unset ${unsetField} to clear this field.`:void 0;assertNoLegacyNoneToken(value,commandOptionFlagLabel("update",optionKey),hint)};for(const key of UPDATE_LEGACY_SCALAR_OPTION_KEYS)assertNoLegacyScalarToken(options[key],String(key));assertNoLegacyScalarToken(options.order??options.rank,"order"),assertNoLegacyNoneTokens(options.reminder,"--reminder","Use --clear-reminders to clear reminders."),assertNoLegacyNoneTokens(options.event,"--event","Use --clear-events to clear linked events.")}function buildUpdateFieldFlags(options,runtimeFieldUpdates){const flags={};for(const key of UPDATE_SIMPLE_FIELD_FLAG_KEYS)flags[String(key)]=options[key]!==void 0;return flags.tags=options.tags!==void 0,flags.addTags=Array.isArray(options.addTags)&&options.addTags.length>0,flags.removeTags=Array.isArray(options.removeTags)&&options.removeTags.length>0,flags.addAc=Array.isArray(options.addAc)&&options.addAc.length>0,flags.removeAc=Array.isArray(options.removeAc)&&options.removeAc.length>0,flags.order=options.order!==void 0,flags.rank=options.rank!==void 0,flags.replaceDeps=options.replaceDeps===!0,flags.replaceTests=options.replaceTests===!0,flags.replaceFiles=options.replaceFiles===!0,flags.replaceDocs=options.replaceDocs===!0,flags.unset=options.unset!==void 0&&options.unset.length>0,flags.clearDeps=options.clearDeps===!0,flags.clearComments=options.clearComments===!0,flags.clearNotes=options.clearNotes===!0,flags.clearLearnings=options.clearLearnings===!0,flags.clearFiles=options.clearFiles===!0,flags.clearTests=options.clearTests===!0,flags.clearDocs=options.clearDocs===!0,flags.clearReminders=options.clearReminders===!0,flags.clearEvents=options.clearEvents===!0,flags.clearTypeOptions=options.clearTypeOptions===!0,flags.documentAnnotationSnapshot=options.documentAnnotationSnapshot!==void 0,flags.runtimeFields=Object.keys(runtimeFieldUpdates).length>0,flags}async function buildNoopUpdateResult(params){const located=await locateItem(params.pmRoot,params.id,params.settings.id_prefix,params.settings.item_format,params.typeRegistry.type_to_folder);if(!located)throw await buildItemNotFoundError(params.pmRoot,params.id,params.settings.id_prefix,params.typeRegistry.type_to_folder);const{document}=await readLocatedItem(located,{schema:params.settings.schema});return{item:toItemRecord(document.metadata),changed_fields:[],warnings:["noop_no_update_fields"]}}async function loadUpdateRelationshipGraph(params){if(!(!params.fieldFlags.dep&&!params.fieldFlags.blockedBy&&!params.fieldFlags.parent&&!params.clearedMetadataKeys.has("parent")))return listAllItemMetadataLight(params.pmRoot,params.settings.item_format,params.typeToFolder,void 0,params.settings.schema)}function assertUpdateHierarchyIntegrity(params){params.before&&assertHierarchyMutationAllowed(params.before,params.before.map(item=>item.id===params.document.metadata.id?params.document.metadata:item),params.document.metadata.id,status=>isTerminalStatus(status,params.statusRegistry),resolveWorkspaceRelationshipKindRegistry())}function assertMatchingOrderRank(options){if(options.order!==void 0&&options.rank!==void 0&&options.order!==options.rank)throw new PmCliError("--order and --rank must match when both are provided",EXIT_CODE.USAGE)}async function resolveParentReferenceForUpdate(params){if(params.options.parent===void 0||params.unsetTargets.metadataKeys.has("parent"))return{resolvedParentValue:void 0,warnings:[]};const resolvedParentValue=normalizeItemReference(normalizeParentReferenceValue(params.options.parent),params.settings.id_prefix);if(isExternalDependencyReference(resolvedParentValue))return{resolvedParentValue,warnings:[]};if(assertParentReferenceIsNotSelf(params.id,resolvedParentValue,params.settings.id_prefix),await locateItem(params.pmRoot,resolvedParentValue,params.settings.id_prefix,params.settings.item_format,params.typeRegistry.type_to_folder))return{resolvedParentValue,warnings:[]};const normalizedParentId=normalizeItemId(resolvedParentValue,params.settings.id_prefix);return{resolvedParentValue,warnings:validateMissingParentReference(normalizedParentId,params.parentReferencePolicy).warnings}}function blockedByResolutionWarnings(resolution){return resolution.unresolved===void 0?[]:[`blocked_by_unresolved:${resolution.unresolved}`]}async function collectWorkflowTransitionWarnings(params){if(params.workflowEnforcement==="off"||params.typeWorkflows.length===0||!params.fieldFlags.status||params.options.status===void 0)return[];const located=await locateItem(params.pmRoot,params.id,params.settings.id_prefix,params.settings.item_format,params.typeRegistry.type_to_folder);if(!located)throw await buildItemNotFoundError(params.pmRoot,params.id,params.settings.id_prefix,params.typeRegistry.type_to_folder);const{document}=await readLocatedItem(located,{schema:params.settings.schema}),effectiveType=params.options.type!==void 0?resolveTypeName(params.options.type,params.typeRegistry)??params.options.type:document.metadata?.type??"",warning=enforceTypeWorkflowTransition({enforcement:params.workflowEnforcement,typeWorkflows:params.typeWorkflows,statusRegistry:params.statusRegistry,typeName:effectiveType,fromStatus:document.metadata?.status??"",toStatus:params.options.status});return warning?[warning]:[]}async function routeCloseStatusUpdate(context){if(!context.fieldFlags.status||normalizeStatusInput(context.options.status,context.statusRegistry)!==context.statusRegistry.close_status)return;const otherFieldKeys=Object.entries(context.fieldFlags).filter(([key,value])=>value&&key!=="status"&&key!=="closeReason"&&key!=="completedAt").map(([key])=>key),routeWarnings=[];let preChangedFields=[];if(otherFieldKeys.length>0){const preUpdateOptions=transferMutationStdinTokenPolicy(context.options,{...context.options,status:void 0,closeReason:void 0,message:void 0}),preUpdate=await runUpdate(context.id,preUpdateOptions,context.global);preChangedFields=preUpdate.changed_fields,routeWarnings.push(...preUpdate.warnings)}const closeResult=await runClose(context.id,context.options.closeReason,{author:context.options.author,message:context.options.message,force:context.options.force,completedAt:context.options.completedAt},context.global),warnings=[...context.workflowTransitionWarnings,...routeWarnings,...closeResult.warnings,"auto_routed_from_update_to_close"];return{item:closeResult.item,changed_fields:[...preChangedFields,...closeResult.changed_fields],warnings}}function applySimpleItemMutations(document,options,statusRegistry,changedFields){return options.title!==void 0&&(document.metadata.title=requireStringOption(options.title,"--title"),changedFields.push("title")),options.description!==void 0&&(document.metadata.description=options.description,changedFields.push("description")),options.body!==void 0&&(document.body=options.body,changedFields.push("body")),normalizeStatusInput(document.metadata.status,statusRegistry)??document.metadata.status}const TERMINAL_EVIDENCE_METADATA_KEYS=["closed_at","completed_at","close_reason","resolution","expected_result","actual_result","fixed_version"];function clearTerminalEvidence(metadata,changedFields){for(const key of TERMINAL_EVIDENCE_METADATA_KEYS)metadata[key]!==void 0&&(delete metadata[key],changedFields.push(key))}function applyStatusMutation(document,context,statusInput,previousStatusNormalized,changedFields){const status=parseStatus(statusInput,context.statusRegistry);if(document.metadata.status=status,changedFields.push("status"),status===context.statusRegistry.close_status&&(document.metadata.closed_at===void 0||document.metadata.closed_at===null)){document.metadata.closed_at=context.nowIso,document.metadata.completed_at=context.nowIso,changedFields.push("closed_at","completed_at");return}!isTerminalStatus(status,context.statusRegistry)&&isTerminalStatus(previousStatusNormalized,context.statusRegistry)&&clearTerminalEvidence(document.metadata,changedFields)}function applyStatusAndCompletionMutations(document,context,previousStatusNormalized,changedFields){if(context.options.status!==void 0&&applyStatusMutation(document,context,context.options.status,previousStatusNormalized,changedFields),context.options.completedAt!==void 0){if(!isTerminalStatus(document.metadata.status,context.statusRegistry))throw new PmCliError("--completed-at can only be set on a terminal item",EXIT_CODE.USAGE);document.metadata.completed_at=resolveIsoOrRelative(context.options.completedAt,new Date(context.nowIso),"completed-at"),changedFields.push("completed_at")}}function applyCloseReasonMutations(document,context,previousStatusNormalized,changedFields){if(context.options.closeReason!==void 0||context.clearItemMetadataKeys.has("close_reason")){if(context.clearItemMetadataKeys.has("close_reason"))delete document.metadata.close_reason;else{const closeReason=context.options.closeReason?.trim()??"";if(closeReason.length===0)throw new PmCliError("--close-reason must not be empty",EXIT_CODE.USAGE);document.metadata.close_reason=closeReason}changedFields.push("close_reason");return}context.options.status!==void 0&&isTerminalStatus(previousStatusNormalized,context.statusRegistry)&&!isTerminalStatus(document.metadata.status,context.statusRegistry)&&document.metadata.close_reason!==void 0&&(delete document.metadata.close_reason,changedFields.push("close_reason"))}function applyStatusAndCloseReasonMutations(document,context,previousStatusNormalized,changedFields){applyStatusAndCompletionMutations(document,context,previousStatusNormalized,changedFields),applyCloseReasonMutations(document,context,previousStatusNormalized,changedFields)}function applyPriorityTypeAndOptions(document,context,changedFields){let activeTypeName=resolveTypeName(document.metadata.type,context.typeRegistry)??document.metadata.type;if(context.options.priority!==void 0&&(document.metadata.priority=resolvePriority(context.options.priority),changedFields.push("priority")),context.options.type!==void 0){const resolvedTypeName=resolveTypeName(context.options.type,context.typeRegistry);if(!resolvedTypeName)throw new PmCliError(buildInvalidTypeError(context.options.type,context.typeRegistry.types,resolveItemTypesFilePath(context.pmRoot,context.settings.schema)),EXIT_CODE.USAGE);document.metadata.type=resolvedTypeName,activeTypeName=resolvedTypeName,changedFields.push("type")}return enforceUpdateOptionsByType(activeTypeName,context.options,context.typeRegistry,context.runtimeFieldRegistry,context.extensionFieldNames),applyTypeOptionMutation(document,context,activeTypeName,changedFields),activeTypeName}function applyTypeOptionMutation(document,context,activeTypeName,changedFields){if(context.options.typeOption!==void 0||context.clearItemMetadataKeys.has("type_options")){if(context.clearItemMetadataKeys.has("type_options"))delete document.metadata.type_options;else{const parsedTypeOptions=parseTypeOptionEntries(context.options.typeOption??[]),validation2=validateTypeOptions(activeTypeName,parsedTypeOptions,context.typeRegistry);if(validation2.errors.length>0)throw new PmCliError(validation2.errors.join("; "),EXIT_CODE.USAGE);document.metadata.type_options=validation2.normalized}changedFields.push("type_options");return}if(context.options.type===void 0||document.metadata.type_options===void 0)return;const validation=validateTypeOptions(activeTypeName,document.metadata.type_options,context.typeRegistry);if(validation.errors.length>0)throw new PmCliError(`Current type options are incompatible with type "${activeTypeName}". ${validation.errors.join("; ")}. Use --clear-type-options to clear them.`,EXIT_CODE.USAGE);document.metadata.type_options=validation.normalized}function normalizeTouchedDependencyIdentities(current,additions){const touchedKeys=new Set(additions.map(entry=>dependencyKey(entry))),retainedStoredIdentities=new Set;return current.filter(entry=>{if(!touchedKeys.has(dependencyKey(entry)))return!0;const storedIdentity=storedDependencyIdentityKey(entry);return retainedStoredIdentities.has(storedIdentity)?!1:(retainedStoredIdentities.add(storedIdentity),!0)})}function assertDependencyRemovalSelectorsMatch(current,selectors,itemId){const unmatchedSelectors=selectors.filter(selector=>!current.some(entry=>matchesDependencySelector(entry,selector)));if(unmatchedSelectors.length!==0)throw new PmCliError(`Dependency removal did not match ${unmatchedSelectors.length===1?"a stored edge":"stored edges"}.`,EXIT_CODE.NOT_FOUND,{code:"dependency_remove_no_match",reason:"selector_not_found",unmatched_selectors:unmatchedSelectors,available_dependencies:current.map(entry=>({id:entry.id,kind:entry.kind,source_kind:entry.source_kind,author:entry.author,created_at:entry.created_at})),why:"Failing on a zero-match selector prevents a mistyped dependency removal from being reported as successful.",nextSteps:[`Inspect the current item with: pm get ${itemId} --full`,"Retry --dep-remove with the exact id plus any kind, source_kind, author, or created_at selectors needed to identify one stored row."]})}function applyDependencyMutations(document,context,changedFields){if(context.options.dep===void 0&&context.options.depRemove===void 0&&!context.clearItemMetadataKeys.has("dependencies"))return;let nextDependencies=context.clearItemMetadataKeys.has("dependencies")?[]:[...document.metadata.dependencies??[]];if(context.dependencyUpdates.additions.length>0){nextDependencies=normalizeTouchedDependencyIdentities(nextDependencies,context.dependencyUpdates.additions);const seen=new Set(nextDependencies.map(entry=>dependencyKey(entry)));for(const addition of context.dependencyUpdates.additions){const key=dependencyKey(addition);seen.has(key)||(nextDependencies.push(addition),seen.add(key))}}context.dependencyRemovals.length>0&&(assertDependencyRemovalSelectorsMatch(nextDependencies,context.dependencyRemovals,document.metadata.id),nextDependencies=nextDependencies.filter(entry=>!context.dependencyRemovals.some(selector=>matchesDependencySelector(entry,selector)))),nextDependencies.length===0?delete document.metadata.dependencies:document.metadata.dependencies=nextDependencies,changedFields.push("dependencies")}function applyLogCollectionMutations(document,context,changedFields){applyLogCollectionMutation(document,"comments",context.options.comment,context.commentUpdates.values,context.clearItemMetadataKeys,changedFields),applyLogCollectionMutation(document,"notes",context.options.note,context.noteUpdates.values,context.clearItemMetadataKeys,changedFields),applyLogCollectionMutation(document,"learnings",context.options.learning,context.learningUpdates.values,context.clearItemMetadataKeys,changedFields)}function applyLogCollectionMutation(document,key,optionValue,values,clearItemMetadataKeys,changedFields){optionValue===void 0&&!clearItemMetadataKeys.has(key)||(clearItemMetadataKeys.has(key)||!values||values.length===0?delete document.metadata[key]:document.metadata[key]=[...document.metadata[key]??[],...values],changedFields.push(key))}function applyEvidenceCollectionMutations(document,context,changedFields){applyUniqueLinkedCollectionMutation(document,"files",context.options.file,context.fileUpdates.values,fileKey,context.options.replaceFiles===!0,context.clearItemMetadataKeys,changedFields),applyTestCollectionMutation(document,context,changedFields),applyUniqueLinkedCollectionMutation(document,"docs",context.options.doc,context.docUpdates.values,docKey,context.options.replaceDocs===!0,context.clearItemMetadataKeys,changedFields)}function applyUniqueLinkedCollectionMutation(document,key,optionValue,values,keyOf,replace,clearItemMetadataKeys,changedFields){if(!(optionValue===void 0&&!clearItemMetadataKeys.has(key))){if(replace)document.metadata[key]=values;else if(clearItemMetadataKeys.has(key)||!values||values.length===0)delete document.metadata[key];else{const next=[...document.metadata[key]??[]],seen=new Set(next.map(entry=>keyOf(entry)));for(const entry of values){const keyValue=keyOf(entry);seen.has(keyValue)||(next.push(entry),seen.add(keyValue))}document.metadata[key]=next}changedFields.push(key)}}function applyTestCollectionMutation(document,context,changedFields){context.options.test===void 0&&!context.clearItemMetadataKeys.has("tests")||(context.clearItemMetadataKeys.has("tests")&&context.options.replaceTests===!0?document.metadata.tests=dedupeLinkedTests(context.testUpdates.values)??[]:context.clearItemMetadataKeys.has("tests")||!context.testUpdates.values||context.testUpdates.values.length===0?delete document.metadata.tests:document.metadata.tests=dedupeLinkedTests([...document.metadata.tests??[],...context.testUpdates.values]),document.metadata.tests!==void 0&&document.metadata.tests.length===0&&delete document.metadata.tests,changedFields.push("tests"))}function dedupeLinkedTests(values){if(!values||values.length===0)return;const next=[],seen=new Set;for(const entry of values){const key=testKey(entry);seen.has(key)||(next.push(entry),seen.add(key))}return next}function applyTagsAndPlanningMutations(document,context,scalarMutationContext){const addTagsValues=context.options.addTags,removeTagsValues=context.options.removeTags,hasAdditiveTagMutation=Array.isArray(addTagsValues)&&addTagsValues.length>0||Array.isArray(removeTagsValues)&&removeTagsValues.length>0;if(context.options.tags!==void 0||context.clearItemMetadataKeys.has("tags")||hasAdditiveTagMutation){const baseTags=context.clearItemMetadataKeys.has("tags")?[]:context.options.tags!==void 0?parseTags(context.options.tags):Array.isArray(document.metadata.tags)?[...document.metadata.tags]:[];document.metadata.tags=applyTagRemovals(mergeAdditiveTags(baseTags,addTagsValues),removeTagsValues),scalarMutationContext.changedFields.push("tags")}applyUpdateScalarMutations(UPDATE_POST_TAG_SCALAR_MUTATIONS,context.options,scalarMutationContext),applyOrderMutation(document,context,scalarMutationContext.changedFields)}function applyAcceptanceCriteriaAdditiveMutation(document,context,scalarMutationContext){const addValues=context.options.addAc,removeValues=context.options.removeAc;if(!(Array.isArray(addValues)&&addValues.length>0)&&!(Array.isArray(removeValues)&&removeValues.length>0))return;const mutation=applyAcceptanceCriteriaMutations(splitAcceptanceCriteria(document.metadata.acceptance_criteria),addValues,removeValues);if(mutation.unmatchedRemovals.length>0)throw new PmCliError(`Acceptance criteria removal did not match: ${mutation.unmatchedRemovals.join(", ")}`,EXIT_CODE.NOT_FOUND,{code:"acceptance_criteria_remove_unmatched",reason:"exact_match_not_found",field:"acceptance_criteria",unmatched:mutation.unmatchedRemovals,why:"Lossless removal fails instead of silently applying the remaining mutations when an exact selector is wrong.",nextSteps:["Read the current acceptance_criteria value and retry with the exact criterion text.","Use --acceptance-criteria alone only when replacing the complete list is intentional."]});const nextValue=mutation.criteria.join("; ");document.metadata.acceptance_criteria!==nextValue&&(nextValue===""&&document.metadata.acceptance_criteria===void 0||(document.metadata.acceptance_criteria=nextValue,scalarMutationContext.changedFields.includes("acceptance_criteria")||scalarMutationContext.changedFields.push("acceptance_criteria")))}function applyOrderMutation(document,context,changedFields){const orderRaw=context.options.order??context.options.rank;if(!(orderRaw===void 0&&!context.clearItemMetadataKeys.has("order"))){if(context.clearItemMetadataKeys.has("order"))delete document.metadata.order;else{const parsedOrder=parseOptionalNumber(orderRaw??"","order");if(!Number.isInteger(parsedOrder))throw new PmCliError("Order must be an integer",EXIT_CODE.USAGE);document.metadata.order=parsedOrder}changedFields.push("order")}}function applyOwnershipAndIssueMutations(document,context,scalarMutationContext,warnings){applyAssigneeMutation(document,context,scalarMutationContext.changedFields),applyParentMutation(document,context,scalarMutationContext.changedFields),applyUpdateScalarMutations(UPDATE_STAKEHOLDER_SCALAR_MUTATIONS,context.options,scalarMutationContext),applySprintReleaseMutation(document,context,"sprint",warnings,scalarMutationContext.changedFields),applySprintReleaseMutation(document,context,"release",warnings,scalarMutationContext.changedFields),applyBlockedByMutation(document,context,scalarMutationContext.changedFields),applyUpdateScalarMutations(UPDATE_ISSUE_SCALAR_MUTATIONS,context.options,scalarMutationContext)}function applyAssigneeMutation(document,context,changedFields){if(!(context.options.assignee===void 0&&!context.clearItemMetadataKeys.has("assignee"))){if(context.clearItemMetadataKeys.has("assignee"))delete document.metadata.assignee;else{const assignee=context.options.assignee?.trim()??"";if(assignee==="")throw new PmCliError("--assignee must not be empty. Use --unset assignee to clear it.",EXIT_CODE.USAGE);document.metadata.assignee=assignee}changedFields.push("assignee")}}function applyParentMutation(document,context,changedFields){context.options.parent===void 0&&!context.clearItemMetadataKeys.has("parent")||(context.clearItemMetadataKeys.has("parent")?delete document.metadata.parent:document.metadata.parent=context.resolvedParentValue??"",changedFields.push("parent"))}function applySprintReleaseMutation(document,context,key,warnings,changedFields){if(!(context.options[key]===void 0&&!context.clearItemMetadataKeys.has(key))){if(context.clearItemMetadataKeys.has(key))delete document.metadata[key];else{const validation=validateSprintOrReleaseValue(key,context.options[key]??"",context.settings.validation.sprint_release_format);document.metadata[key]=validation.value,warnings.push(...validation.warnings)}changedFields.push(key)}}function applyBlockedByMutation(document,context,changedFields){context.options.blockedBy===void 0&&!context.clearItemMetadataKeys.has("blocked_by")||(context.clearItemMetadataKeys.has("blocked_by")?delete document.metadata.blocked_by:document.metadata.blocked_by=context.options.blockedBy?.trim()??"",changedFields.push("blocked_by"),(context.clearItemMetadataKeys.has("blocked_by")||context.resolvedBlockedByDependencyId!==void 0)&&applyBlockedByDependencyEdge(document.metadata,context.resolvedBlockedByDependencyId,context.nowIso,context.author,changedFields))}function applyScheduleMutations(document,context,changedFields){(context.options.reminder!==void 0||context.clearItemMetadataKeys.has("reminders"))&&(context.clearItemMetadataKeys.has("reminders")?delete document.metadata.reminders:document.metadata.reminders=parseReminderEntries(context.options.reminder??[],context.nowValue,{valueMode:"trimmed"}),changedFields.push("reminders")),(context.options.event!==void 0||context.clearItemMetadataKeys.has("events"))&&(context.clearItemMetadataKeys.has("events")?delete document.metadata.events:document.metadata.events=parseEventEntries(context.options.event??[],context.nowValue,{allDayEmptyGuard:"truthy",recurrenceEmptyNumericGuard:"truthy"}),changedFields.push("events"))}function applyRuntimeAndRegisteredFieldMutations(metadataRecord,context,changedFields){clearDynamicFields(metadataRecord,context.runtimeFieldRegistry.definitions.map(definition=>definition.metadata_key),context.clearItemMetadataKeys,changedFields),clearDynamicFields(metadataRecord,context.extensionFieldNames,context.clearItemMetadataKeys,changedFields);for(const[fieldKey,fieldValue]of Object.entries(context.runtimeFieldUpdates)){if(context.clearItemMetadataKeys.has(fieldKey)){const fieldFlag=fieldKey.replaceAll("_","-"),updateFlag=context.runtimeFieldRegistry.definitions.find(candidate=>candidate.metadata_key===fieldKey)?.cli_flag??fieldFlag;throw new PmCliError(`Cannot combine --unset ${fieldFlag} with --${updateFlag}`,EXIT_CODE.USAGE)}stableValueEquals(metadataRecord[fieldKey],fieldValue)||(metadataRecord[fieldKey]=fieldValue,changedFields.push(fieldKey))}const registeredItemFieldUpdates=parseRegisteredItemFieldAssignments(context.options.field,context.extensionRegistrations);for(const fieldKey of Object.keys(registeredItemFieldUpdates))if(context.clearItemMetadataKeys.has(fieldKey))throw new PmCliError(`Cannot combine --unset ${fieldKey.replaceAll("_","-")} with --field ${fieldKey}=...`,EXIT_CODE.USAGE);for(const[fieldKey,fieldValue]of Object.entries(registeredItemFieldUpdates))stableValueEquals(metadataRecord[fieldKey],fieldValue)||(metadataRecord[fieldKey]=fieldValue,changedFields.push(fieldKey))}function clearDynamicFields(metadataRecord,fieldKeys,clearItemMetadataKeys,changedFields){for(const fieldKey of fieldKeys)!clearItemMetadataKeys.has(fieldKey)||metadataRecord[fieldKey]===void 0||(delete metadataRecord[fieldKey],changedFields.push(fieldKey))}function assertPersistedAnnotationSnapshot(document,snapshot){if(snapshot===void 0)return;const current=toItemRecord(document.metadata),key=["comments","notes","learnings"].find(field=>{const submitted=snapshot[field];return submitted!==void 0&&(!Array.isArray(submitted)||!stableValueEquals(submitted,current[field]??[]))});if(key!==void 0)throw new PmCliError(`Full-item --stdin-json update changed persisted ${key}; no item fields were written.`,EXIT_CODE.USAGE,{code:"stdin_json_persisted_annotation_changed",reason:`${key}_requires_annotation_command`,required:`Use pm ${key} ${document.metadata.id} --edit <index> --add <text> to correct an existing entry.`,why:"Full-item update appends new annotations but cannot replace or remove existing audit entries.",nextSteps:[`Inspect the current ${key} with pm ${key} ${document.metadata.id}.`,`Apply the correction with pm ${key} ${document.metadata.id} --edit <index> --add <text>.`]})}function mutateUpdateDocument(document,context){assertPersistedAnnotationSnapshot(document,context.options.documentAnnotationSnapshot);const beforeMetadata=structuredClone(toItemRecord(document.metadata)),beforeBody=document.body,changedFields=[],warnings=[],previousStatusNormalized=applySimpleItemMutations(document,context.options,context.statusRegistry,changedFields),metadataRecord=toItemRecord(document.metadata),scalarMutationContext={metadataRecord,clearItemMetadataKeys:context.clearItemMetadataKeys,changedFields,nowValue:context.nowValue};applyStatusAndCloseReasonMutations(document,context,previousStatusNormalized,changedFields),applyPriorityTypeAndOptions(document,context,changedFields),applyDependencyMutations(document,context,changedFields),applyLogCollectionMutations(document,context,changedFields),applyEvidenceCollectionMutations(document,context,changedFields),applyTagsAndPlanningMutations(document,context,scalarMutationContext),applyAcceptanceCriteriaAdditiveMutation(document,context,scalarMutationContext),applyOwnershipAndIssueMutations(document,context,scalarMutationContext,warnings),(context.options.dep!==void 0||context.options.depRemove!==void 0||context.options.blockedBy!==void 0||context.clearItemMetadataKeys.has("dependencies")||context.clearItemMetadataKeys.has("blocked_by"))&&assertDependencyEdgesAllowed(document.metadata.id,document.metadata.dependencies),normalizeStatusInput(document.metadata.status,context.statusRegistry)===context.statusRegistry.canceled_status&&document.metadata.assignee!==void 0&&(delete document.metadata.assignee,changedFields.includes("assignee")||changedFields.push("assignee")),applyScheduleMutations(document,context,changedFields),applyRuntimeAndRegisteredFieldMutations(metadataRecord,context,changedFields);try{applyRegisteredItemFieldDefaultsAndValidation(metadataRecord,context.extensionRegistrations,{skipDefaultFields:context.clearItemMetadataKeys})}catch(error){throw new PmCliError(error instanceof Error?error.message:"Invalid extension item field values",EXIT_CODE.USAGE)}const afterMetadata=toItemRecord(document.metadata),actualChangedFields=[...new Set(changedFields)].filter(field=>field==="body"?document.body!==beforeBody:!stableValueEquals(beforeMetadata[field],afterMetadata[field]));return context.options.acceptanceCriteria!==void 0&&actualChangedFields.includes("acceptance_criteria")&&warnings.push(`acceptance_criteria_replaced:${splitAcceptanceCriteria(beforeMetadata.acceptance_criteria).length}:${splitAcceptanceCriteria(afterMetadata.acceptance_criteria).length}`),{changedFields:actualChangedFields,warnings}}async function runUpdateWithContext(id,options,global2,execution={}){options=await resolveUpdateTransportOptions(options);const pmRoot=resolvePmRoot(process.cwd(),global2.path);await assertInitializedTracker(pmRoot);const settings=await readSettings(pmRoot),statusRegistry=resolveRuntimeStatusRegistry(settings.schema),runtimeFieldRegistry=resolveRuntimeFieldRegistry(settings.schema),extensionRegistrations=getActiveExtensionRegistrations(),extensionFieldNames=collectRegisteredItemFieldNames(extensionRegistrations),typeRegistry=resolveItemTypeRegistry(settings,extensionRegistrations),workflowEnforcement=settings.governance.workflow_enforcement??"off",typeWorkflows=workflowEnforcement==="off"?[]:resolveTypeWorkflows(settings.schema),parentReferencePolicy=[{strict_error:"strict_error",warn:"warn",off:"off"},{strict_error:"warn",warn:"warn",off:"off"}][+(options.allowMissingParent===!0)][settings.validation.parent_reference],unsetTargets=parseUpdateUnsetTargets(options.unset,runtimeFieldRegistry,extensionFieldNames),clearOptionKeys=new Set(unsetTargets.optionKeys),clearItemMetadataKeys=new Set(unsetTargets.metadataKeys);assertUpdateMutationOptionCombinations(options),applyClearCollectionDefinitions({definitions:buildClearCollectionDefinitions(options),options,clearOptionKeys,clearItemMetadataKeys}),enforceOwnershipBypassScope(id,options,clearItemMetadataKeys),rejectUnsetScalarConflicts(options,unsetTargets),rejectLegacyScalarTokens(options);const author=resolveAuthor(options.author,settings.author_default),nowValue=new Date,nowIso=nowValue.toISOString(),dependencyUpdates=parseDependencyAdditions(options.dep,settings.id_prefix,nowIso,author);assertDependencyEdgesAllowed(id,dependencyUpdates.additions);const dependencyTargetWarnings=await assertDependencyTargetsResolvable({pmRoot,dependencies:dependencyUpdates.additions,idPrefix:settings.id_prefix,itemFormat:settings.item_format,typeToFolder:typeRegistry.type_to_folder,allowUnresolved:options.allowUnresolvedDeps,holders:[{id}],schema:settings.schema}),dependencyRemovals=parseDependencyRemovals(options.depRemove,settings.id_prefix),parsedCommentUpdates=parseLogSeed("--comment",options.comment,nowIso,author),commentUpdates=options.ownershipMetadataBypass===!0&&parsedCommentUpdates.values?{...parsedCommentUpdates,values:parsedCommentUpdates.values.map(entry=>({...entry,author}))}:parsedCommentUpdates,noteUpdates=parseLogSeed("--note",options.note,nowIso,author),learningUpdates=parseLogSeed("--learning",options.learning,nowIso,author),fileUpdates=parseFiles(options.file),testUpdates=parseTests(options.test);testUpdates.values=await attachLinkedTestMutationProvenance(testUpdates.values,author,nowIso);const docUpdates=parseDocs(options.doc),workflowTransitionWarnings=[],parentReference=await resolveParentReferenceForUpdate({id,options,unsetTargets,pmRoot,settings,typeRegistry,parentReferencePolicy}),blockedByResolution=await resolveBlockedByDependencyTarget(options.blockedBy,clearItemMetadataKeys.has("blocked_by"),pmRoot,settings.id_prefix,settings.item_format,typeRegistry.type_to_folder),resolvedBlockedByDependencyId=blockedByResolution.id,parentReferenceWarnings=[...parentReference.warnings,...blockedByResolutionWarnings(blockedByResolution)],runtimeFieldUpdates=collectRuntimeUpdateFieldValues(options,runtimeFieldRegistry,options.runtimeFieldCommands),fieldFlags=buildUpdateFieldFlags(options,runtimeFieldUpdates);if(!Object.values(fieldFlags).some(Boolean))return buildNoopUpdateResult({pmRoot,id,settings,typeRegistry});workflowTransitionWarnings.push(...await collectWorkflowTransitionWarnings({options,fieldFlags,workflowEnforcement,typeWorkflows,statusRegistry,typeRegistry,pmRoot,id,settings}));const routedClose=await routeCloseStatusUpdate({options,fieldFlags,statusRegistry,workflowTransitionWarnings,global:global2,id});if(routedClose)return routedClose;assertMatchingOrderRank(options);const relationshipRegistry=resolveWorkspaceRelationshipKindRegistry(),hierarchyMutationRequired=fieldFlags.parent&&!clearItemMetadataKeys.has("parent")||dependencyUpdates.additions.some(dependency=>relationshipRegistry.resolve(dependency.kind)?.hierarchy),releaseHierarchyMutationLock=await acquireHierarchyMutationLock({pmRoot,author,ttlSeconds:settings.locks.ttl_seconds,waitMs:settings.locks.wait_ms,required:hierarchyMutationRequired});try{let graphBeforeUpdate=await loadUpdateRelationshipGraph({fieldFlags,clearedMetadataKeys:clearItemMetadataKeys,pmRoot,settings,typeToFolder:typeRegistry.type_to_folder}),lifecycleTransition,recurrenceHistoryContext;const result=await mutateItemWithHistoryContextResolver({pmRoot,settings,typeToFolder:typeRegistry.type_to_folder,id,op:resolveUpdateHistoryOperation(options,execution),author,message:options.message,resolveHistoryContext:()=>recurrenceHistoryContext,force:options.force,bypassAssigneeConflict:options.ownershipMetadataBypass===!0||options.ownershipDependencyBypass===!0,extensionFieldNames,skipNoop:!0,mutate(document){lifecycleTransition=prepareRecurrenceTransition({document,recurrenceReason:execution.recurrenceReason,requestedStatus:options.status,statusRegistry}),recurrenceHistoryContext=lifecycleTransition?{recurrence:lifecycleTransition}:void 0,graphBeforeUpdate=graphBeforeUpdate?.map(item=>item.id===document.metadata.id?structuredClone(document.metadata):item);const mutation=mutateUpdateDocument(document,{options,settings,typeRegistry,statusRegistry,runtimeFieldRegistry,extensionRegistrations,extensionFieldNames,clearItemMetadataKeys,dependencyUpdates,dependencyRemovals,commentUpdates,noteUpdates,learningUpdates,fileUpdates,testUpdates,docUpdates,resolvedParentValue:parentReference.resolvedParentValue,resolvedBlockedByDependencyId,runtimeFieldUpdates,nowValue,nowIso,author,pmRoot});return assertUpdateHierarchyIntegrity({before:graphBeforeUpdate,document,statusRegistry}),mutation}});await releaseHierarchyMutationLock();const orderingCycleWarnings=graphBeforeUpdate?collectNewOrderingCycleWarnings(graphBeforeUpdate,graphBeforeUpdate.map(item=>item.id===result.item.id?result.item:item),result.item.id):[];return{item:toItemRecord(result.item),changed_fields:result.changedFields,warnings:[...workflowTransitionWarnings,...parentReferenceWarnings,...dependencyTargetWarnings,...orderingCycleWarnings,...result.warnings],...lifecycleTransition===void 0?{}:{lifecycle_transition:lifecycleTransition}}}finally{await releaseHierarchyMutationLock()}}function resolveUpdateHistoryOperation(options,execution){return options.ownershipMetadataBypass===!0||options.ownershipDependencyBypass===!0?"update_ownership_bypass":execution.recurrenceReason===void 0?"update":"reopen"}function prepareRecurrenceTransition(params){if(params.recurrenceReason===void 0)return;const fromStatus=normalizeStatusInput(params.document.metadata.status,params.statusRegistry)??params.document.metadata.status;if(!isTerminalStatus(fromStatus,params.statusRegistry))throw new PmCliError(`Item ${params.document.metadata.id} is already active with status ${fromStatus}; recurrence transitions require a terminal item.`,EXIT_CODE.CONFLICT,{code:"item_already_active",reason:"recurrence_requires_terminal_item",required:"Use item reopen only for a terminal item whose work has recurred.",why:"Appending a recurrence event to active work would corrupt lifecycle history.",recovery:{suggested_retry:`pm get ${params.document.metadata.id} --full`,suggested_retry_args:["get",params.document.metadata.id,"--full"]},nextSteps:[`Inspect the active item with: pm get ${params.document.metadata.id} --full`,`Continue the existing work with: pm update ${params.document.metadata.id} ...`]});const requestedStatus=params.requestedStatus??params.statusRegistry.open_status,toStatus=normalizeStatusInput(requestedStatus,params.statusRegistry)??requestedStatus,metadata=toItemRecord(params.document.metadata),previousTerminal=Object.fromEntries(["close_reason","resolution","expected_result","actual_result","fixed_version"].flatMap(key=>{const value=metadata[key];return typeof value=="string"?[[key,value]]:[]}));return{reason:params.recurrenceReason,from_status:fromStatus,to_status:toStatus,previous_terminal:previousTerminal}}async function runUpdate(id,options,global2){return runUpdateWithContext(id,options,global2)}async function runReopenUpdate(id,options,global2,recurrenceReason){const result=await runUpdateWithContext(id,options,global2,{recurrenceReason});if(result.lifecycle_transition===void 0)throw new PmCliError(`Item ${id} did not produce the required recurrence receipt.`,EXIT_CODE.GENERIC_FAILURE,{code:"reopen_receipt_missing",reason:"recurrence_transition_not_recorded",required:"A successful reopen must return the terminal-to-active lifecycle transition recorded in immutable history."});return{...result,lifecycle_transition:result.lifecycle_transition}}const _testOnlyUpdateCommand={applyStatusAndCloseReasonMutations,collectProvidedUpdatePolicyOptions,buildOwnershipBypassRestrictedOptionsError,enforceOwnershipBypassScope,enforceTypeWorkflowTransition,matchesDependencySelector,normalizeLegacyNoneUpdateOptions,normalizeUpdatePolicyOptionKey,parseDependencyAdditions,parseDependencyRemovals,parseUpdateUnsetTargets,reconcileBlockedByDependency,resolveRuntimeUnsetDefinition:(token,registry)=>resolveRuntimeUnsetFieldDefinition(token,"update",registry)};export{_testOnlyUpdateCommand,assertUpdateMutationOptionCombinations,parseDependencyAdditions,resolveUpdateTransportOptions,runReopenUpdate,runUpdate};
2
3
  //# sourceMappingURL=update.js.map
@@ -1,2 +1,2 @@
1
- !(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]="ee5f5c8d-37f9-577d-87a7-bb43be7c1186")}catch(e2){}})();function patchedStatus(entry){for(const operation of entry.patch){if(operation.path==="/metadata/status"||operation.path==="/front_matter/status"){if(typeof operation.value==="string"){return operation.value.trim().toLowerCase()}continue}if(operation.path!==""||typeof operation.value!=="object"){continue}const root=operation.value;const metadata=root.metadata??root.front_matter;if(typeof metadata?.status==="string"){return metadata.status.trim().toLowerCase()}}return void 0}function findEvidenceBackfill(id,entries,terminalStatuses){let previousStatus;let candidate;for(const entry of entries){const nextStatus=patchedStatus(entry);if(nextStatus===void 0){continue}const hasTransitionEvidence=terminalStatuses.has(nextStatus)&&(previousStatus!==void 0&&!terminalStatuses.has(previousStatus)||previousStatus===void 0&&entry.op==="create");previousStatus=nextStatus;if(hasTransitionEvidence&&Number.isFinite(Date.parse(entry.ts))){candidate={id,completed_at:entry.ts,history_op:entry.op}}}return candidate}function resolveCompletionTimestamp(item){if(item.completed_at!==void 0){return{resolved:true,timestamp:item.completed_at,source:"completed_at",fallback:false}}if(item.closed_at!==void 0){return{resolved:true,timestamp:item.closed_at,source:"closed_at",fallback:true}}if(item.updated_at!==void 0){return{resolved:true,timestamp:item.updated_at,source:"updated_at",fallback:true}}return{resolved:false}}function planCompletedAtBackfill(items,historyById,terminalStatuses){const candidates=[];for(const item of items){if(item.completed_at!==void 0||!terminalStatuses.has(item.status.trim().toLowerCase())){continue}const candidate=findEvidenceBackfill(item.id,historyById.get(item.id)??[],terminalStatuses);if(candidate!==void 0){candidates.push(candidate)}}return candidates.sort((left,right)=>left.id.localeCompare(right.id))}export{planCompletedAtBackfill,resolveCompletionTimestamp};
1
+ (function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},n=new e.Error().stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="61e27cd0-a444-5b66-a8e3-d81c76e4f8ae")}catch{}})();function patchedStatus(entry){for(const operation of entry.patch){if(operation.path==="/metadata/status"||operation.path==="/front_matter/status"){if(typeof operation.value=="string")return operation.value.trim().toLowerCase();continue}if(operation.path!==""||typeof operation.value!="object")continue;const root=operation.value,metadata=root.metadata??root.front_matter;if(typeof metadata?.status=="string")return metadata.status.trim().toLowerCase()}}function findEvidenceBackfill(id,entries,terminalStatuses){let previousStatus,candidate;for(const entry of entries){const nextStatus=patchedStatus(entry);if(nextStatus===void 0)continue;const hasTransitionEvidence=terminalStatuses.has(nextStatus)&&(previousStatus!==void 0&&!terminalStatuses.has(previousStatus)||previousStatus===void 0&&entry.op==="create");previousStatus=nextStatus,hasTransitionEvidence&&Number.isFinite(Date.parse(entry.ts))&&(candidate={id,completed_at:entry.ts,history_op:entry.op})}return candidate}function resolveCompletionTimestamp(item){return item.completed_at!==void 0?{resolved:!0,timestamp:item.completed_at,source:"completed_at",fallback:!1}:item.closed_at!==void 0?{resolved:!0,timestamp:item.closed_at,source:"closed_at",fallback:!0}:item.updated_at!==void 0?{resolved:!0,timestamp:item.updated_at,source:"updated_at",fallback:!0}:{resolved:!1}}function planCompletedAtBackfill(items,historyById,terminalStatuses){const candidates=[];for(const item of items){if(item.completed_at!==void 0||!terminalStatuses.has(item.status.trim().toLowerCase()))continue;const candidate=findEvidenceBackfill(item.id,historyById.get(item.id)??[],terminalStatuses);candidate!==void 0&&candidates.push(candidate)}return candidates.sort((left,right)=>left.id.localeCompare(right.id))}export{planCompletedAtBackfill,resolveCompletionTimestamp};
2
2
  //# sourceMappingURL=lifecycle-completion.js.map
@@ -1,2 +1,2 @@
1
- !(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]="86c929a6-644f-5b8e-a12b-04a73b4f4b60")}catch(e2){}})();import{EXIT_CODE}from"../core/shared/constants.js";import{PmCliError}from"../core/shared/errors.js";const DEFAULT_TERMINAL_TRANSITION_POLICY=Object.freeze({requireCloseReason:true,orderingEdges:"preserve"});function resolveTerminalReason(input){const candidates=[{source:"explicit",value:input.explicit},{source:"duplicate",value:input.duplicateOf===void 0?void 0:`Duplicate of ${input.duplicateOf}`},{source:"resolution",value:input.resolution},{source:"message",value:input.message}];for(const candidate of candidates){const normalized=candidate.value?.trim();if(normalized){return{closeReason:normalized,source:candidate.source}}}return{source:"none"}}function requireTerminalReason(input,required){return requireTerminalReasonWithRecovery(input,required,{operation:"close"})}function requireTerminalReasonWithRecovery(input,required,recovery){const resolution=resolveTerminalReason(input);if(!required||resolution.closeReason!==void 0){return resolution}const examples=recovery.operation==="create"?[`pm create --title "<title>" --type <type> --status ${recovery.status??"closed"} --close-reason "<closing summary>"`,`pm create --title "<title>" --type <type> --status ${recovery.status??"closed"} --resolution "<resolution summary>"`,`pm create --stdin-json < item.json`]:['pm close <id> "Done: <what changed and why>"','pm close <id> --reason "<closing summary>"','pm close <id> -m "<closing summary>"',"pm close <id> --duplicate-of <canonical-id>"];throw new PmCliError("Close reason text is required because governance.require_close_reason is enabled",EXIT_CODE.USAGE,{code:"close_reason_required",required:"Provide an author-controlled closing summary as the reason, message, resolution, or duplicate target.",why:"governance.require_close_reason is enabled, so tools must not invent immutable closure evidence.",examples,nextSteps:[`Re-run the ${recovery.operation} operation with a closing summary.`,"To stop requiring reasons, run: pm config set governance-require-close-reason --policy disabled"]})}function applyTerminalOrderingPolicy(metadata,policy){const previousBlockedBy=typeof metadata.blocked_by==="string"?metadata.blocked_by.trim():"";const hadBlockedBy=metadata.blocked_by!==void 0;const dependencies=metadata.dependencies??[];const predecessorEdges=dependencies.filter(dependency=>dependency.kind==="blocked_by");const hadBlockedReason=metadata.blocked_reason!==void 0;const changedFields=[];if(hadBlockedBy){delete metadata.blocked_by;changedFields.push("blocked_by")}if(hadBlockedReason){delete metadata.blocked_reason;changedFields.push("blocked_reason")}if(policy.orderingEdges==="remove"&&predecessorEdges.length>0){const removed=new Set(predecessorEdges);const retained=dependencies.filter(dependency=>!removed.has(dependency));if(retained.length>0){metadata.dependencies=retained}else{delete metadata.dependencies}changedFields.push("dependencies")}if(policy.orderingEdges==="remove"){return{changedFields,warnings:[...previousBlockedBy?[`closed_cleared_blocked_by:${metadata.id}:${previousBlockedBy}`]:[],...predecessorEdges.length>0?[`closed_removed_predecessors:${metadata.id}:${predecessorEdges.map(edge=>edge.id).join(",")}`,`closed_removed_predecessors_count:${metadata.id}:${predecessorEdges.length}`]:[]]}}const blockerIds=[...new Set([...previousBlockedBy?[previousBlockedBy]:[],...predecessorEdges.map(dependency=>dependency.id)])];if(blockerIds.length===0){return{changedFields,warnings:[]}}return{changedFields,warnings:[`closed_preserved_predecessors:${metadata.id}:${blockerIds.join(",")}`]}}export{DEFAULT_TERMINAL_TRANSITION_POLICY,applyTerminalOrderingPolicy,requireTerminalReason,requireTerminalReasonWithRecovery,resolveTerminalReason};
1
+ (function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},n=new e.Error().stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="8f7d8635-ea1c-5c87-9001-bfa1d1618478")}catch{}})();import{EXIT_CODE}from"../core/shared/constants.js";import{PmCliError}from"../core/shared/errors.js";const DEFAULT_TERMINAL_TRANSITION_POLICY=Object.freeze({requireCloseReason:!0,orderingEdges:"preserve"});function resolveTerminalReason(input){const candidates=[{source:"explicit",value:input.explicit},{source:"duplicate",value:input.duplicateOf===void 0?void 0:`Duplicate of ${input.duplicateOf}`},{source:"resolution",value:input.resolution},{source:"message",value:input.message}];for(const candidate of candidates){const normalized=candidate.value?.trim();if(normalized)return{closeReason:normalized,source:candidate.source}}return{source:"none"}}function requireTerminalReason(input,required){return requireTerminalReasonWithRecovery(input,required,{operation:"close"})}function requireTerminalReasonWithRecovery(input,required,recovery){const resolution=resolveTerminalReason(input);if(!required||resolution.closeReason!==void 0)return resolution;const examples=recovery.operation==="create"?[`pm create --title "<title>" --type <type> --status ${recovery.status??"closed"} --close-reason "<closing summary>"`,`pm create --title "<title>" --type <type> --status ${recovery.status??"closed"} --resolution "<resolution summary>"`,"pm create --stdin-json < item.json"]:['pm close <id> "Done: <what changed and why>"','pm close <id> --reason "<closing summary>"','pm close <id> -m "<closing summary>"',"pm close <id> --duplicate-of <canonical-id>"];throw new PmCliError("Close reason text is required because governance.require_close_reason is enabled",EXIT_CODE.USAGE,{code:"close_reason_required",required:"Provide an author-controlled closing summary as the reason, message, resolution, or duplicate target.",why:"governance.require_close_reason is enabled, so tools must not invent immutable closure evidence.",examples,nextSteps:[`Re-run the ${recovery.operation} operation with a closing summary.`,"To stop requiring reasons, run: pm config set governance-require-close-reason --policy disabled"]})}function applyTerminalOrderingPolicy(metadata,policy){const previousBlockedBy=typeof metadata.blocked_by=="string"?metadata.blocked_by.trim():"",hadBlockedBy=metadata.blocked_by!==void 0,dependencies=metadata.dependencies??[],predecessorEdges=dependencies.filter(dependency=>dependency.kind==="blocked_by"),hadBlockedReason=metadata.blocked_reason!==void 0,changedFields=[];if(hadBlockedBy&&(delete metadata.blocked_by,changedFields.push("blocked_by")),hadBlockedReason&&(delete metadata.blocked_reason,changedFields.push("blocked_reason")),policy.orderingEdges==="remove"&&predecessorEdges.length>0){const removed=new Set(predecessorEdges),retained=dependencies.filter(dependency=>!removed.has(dependency));retained.length>0?metadata.dependencies=retained:delete metadata.dependencies,changedFields.push("dependencies")}if(policy.orderingEdges==="remove")return{changedFields,warnings:[...previousBlockedBy?[`closed_cleared_blocked_by:${metadata.id}:${previousBlockedBy}`]:[],...predecessorEdges.length>0?[`closed_removed_predecessors:${metadata.id}:${predecessorEdges.map(edge=>edge.id).join(",")}`,`closed_removed_predecessors_count:${metadata.id}:${predecessorEdges.length}`]:[]]};const blockerIds=[...new Set([...previousBlockedBy?[previousBlockedBy]:[],...predecessorEdges.map(dependency=>dependency.id)])];return blockerIds.length===0?{changedFields,warnings:[]}:{changedFields,warnings:[`closed_preserved_predecessors:${metadata.id}:${blockerIds.join(",")}`]}}export{DEFAULT_TERMINAL_TRANSITION_POLICY,applyTerminalOrderingPolicy,requireTerminalReason,requireTerminalReasonWithRecovery,resolveTerminalReason};
2
2
  //# sourceMappingURL=lifecycle-policy.js.map
@@ -1,2 +1,3 @@
1
- !(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]="4adcee44-f1a4-5ac8-b9a9-5981a3197bce")}catch(e2){}})();import{assertInitializedTracker}from"./environment/tracker-preflight.js";import fs from"node:fs/promises";import path from"node:path";import{glob}from"tinyglobby";import{isFileAbsentError}from"../core/fs/fs-utils.js";import{getActiveExtensionRegistrations}from"../core/extensions/index.js";import{assertNoAmbiguousBareCommaEntry,assertNoUnknownCsvKeys,createStdinTokenResolver,looksLikeGenericKeyValueEntry,parseCsvKv}from"../core/item/parse.js";import{resolveItemTypeRegistry}from"../core/item/type-registry.js";import{isRemoteLinkedArtifactReference}from"../core/validate/linked-artifact-reference.js";import{EXIT_CODE}from"../core/shared/constants.js";import{PmCliError}from"../core/shared/errors.js";import{stableValueEquals}from"../core/shared/serialization.js";import{locateItem,mutateItem,readLocatedItem}from"../core/store/item-store.js";import{resolvePmRoot,resolveWorkspaceRoot}from"../core/store/paths.js";import{readSettings}from"../core/store/settings.js";import{SCOPE_VALUES}from"../types/index.js";import{resolveAuthor}from"../core/shared/author.js";const LINKED_ARTIFACT_ADD_KEYS=["path","scope","note"];const LINKED_ARTIFACT_ADD_GLOB_KEYS=["pattern","glob","path","scope","note"];const LINKED_ARTIFACT_REMOVE_KEYS=["path"];const LINKED_ARTIFACT_MIGRATE_KEYS=["from","to"];const LINKED_ARTIFACT_REMOVE_UNSUPPORTED_KEYS=new Set(["note","scope"]);function ensureScope(raw){const value=raw??"project";if(!SCOPE_VALUES.includes(value)){throw new PmCliError(`Invalid scope "${raw}". Valid scopes: ${SCOPE_VALUES.join(", ")} (default: project).`,EXIT_CODE.USAGE)}return value}function looksLikeStructuredPathEntry(raw){if(raw.startsWith("```")||raw.includes("\n")){return true}if(/^(?:[-*+]\s+)?(?:path|scope|note)\s*[:=]/i.test(raw)){return true}const firstCommaIndex=raw.indexOf(",");const leadingSegment=raw.slice(0,firstCommaIndex>=0?firstCommaIndex:raw.length);const equalsIndex=leadingSegment.indexOf("=");if(equalsIndex>=0&&!/\s/u.test(raw)&&(/^[A-Za-z][A-Za-z0-9+.-]*:\/\//u.test(raw)||/^(?:[A-Za-z]:[\\/]|[\\/]{1,2}|\.\.?(?:[\\/]))/u.test(raw)||[raw.indexOf("/"),raw.indexOf("\\")].some(separatorIndex=>separatorIndex>=0&&separatorIndex<equalsIndex))){return false}return leadingSegment.includes("=")||looksLikeGenericKeyValueEntry(raw)}function hasBalancedParentheses(value){let depth=0;for(const character of value){if(character==="(")depth+=1;if(character===")")depth-=1;if(depth<0)return false}return depth===0}function parseDocumentationReference(trimmed){if(/^[A-Za-z][A-Za-z0-9+.-]*:\/\//u.test(trimmed)&&!looksLikeStructuredPathEntry(trimmed)){return{path:trimmed,scope:"project",note:void 0}}const labelEnd=trimmed.indexOf("](");if(trimmed.startsWith("[")&&labelEnd>0&&trimmed.endsWith(")")){const destination2=trimmed.slice(labelEnd+2,-1).trim();if(destination2.length>0&&hasBalancedParentheses(destination2)){return{path:destination2,scope:"project",note:trimmed.slice(1,labelEnd).trim()||void 0}}}const delimiterIndex=trimmed.indexOf(",");if(delimiterIndex<0)return void 0;const label=trimmed.slice(0,delimiterIndex).trim();const destination=trimmed.slice(delimiterIndex+1).trim();if(label.length===0||!/^[A-Za-z][A-Za-z0-9+.-]*:\/\//u.test(destination)){return void 0}return{path:destination,scope:"project",note:label}}function parseAddEntries(raw,bareNoun){if(!raw)return[];return raw.flatMap(entry=>{const trimmed=entry.trim();if(bareNoun==="doc"){const reference=parseDocumentationReference(trimmed);if(reference!==void 0)return[reference]}assertNoAmbiguousBareCommaEntry(trimmed,"--add",`${bareNoun} path`,looksLikeStructuredPathEntry(trimmed));const kv=looksLikeStructuredPathEntry(trimmed)?parseCsvKv(entry,"--add"):{path:trimmed};assertNoUnknownCsvKeys(kv,"--add",LINKED_ARTIFACT_ADD_KEYS);if(!kv.path){throw new PmCliError(`--add requires path=<value> or a bare ${bareNoun} path`,EXIT_CODE.USAGE)}return[{path:kv.path,scope:ensureScope(kv.scope),note:kv.note?.trim()||void 0}]})}function parseAddGlobEntries(raw){if(!raw)return[];return raw.map(entry=>{const trimmed=entry.trim();if(!trimmed){throw new PmCliError("--add-glob requires a glob pattern value",EXIT_CODE.USAGE)}if(trimmed.includes("=")||/^(?:[-*+]\s+)?(?:pattern|glob|path)\s*[:=]/i.test(trimmed)||trimmed.startsWith("```")){const kv=parseCsvKv(trimmed,"--add-glob");assertNoUnknownCsvKeys(kv,"--add-glob",LINKED_ARTIFACT_ADD_GLOB_KEYS);const pattern=kv.pattern?.trim()||kv.glob?.trim()||kv.path?.trim();if(!pattern){throw new PmCliError("--add-glob key/value form requires pattern=<glob>",EXIT_CODE.USAGE)}return{pattern,scope:ensureScope(kv.scope),note:kv.note?.trim()||void 0}}return{pattern:trimmed,scope:"project"}})}function parseRemoveEntries(raw){if(!raw)return[];return raw.map(entry=>{const trimmed=entry.trim();if(!trimmed){throw new PmCliError("--remove requires a path value",EXIT_CODE.USAGE)}if(trimmed.includes("=")||/^(?:[-*+]\s+)?path\s*[:=]/i.test(trimmed)||trimmed.startsWith("```")){const kv=parseCsvKv(trimmed,"--remove");const unsupportedRemoveKeys=Object.keys(kv).filter(key=>LINKED_ARTIFACT_REMOVE_UNSUPPORTED_KEYS.has(key.toLowerCase()));if(unsupportedRemoveKeys.length>0){throw new PmCliError(`--remove identifies a linked artifact by path only and does not accept ${unsupportedRemoveKeys.map(key=>`"${key}"`).join(", ")}. Pass just the path (path=<value>, path:<value>, or a bare path); record removal context with --message "<why removed>".`,EXIT_CODE.USAGE)}assertNoUnknownCsvKeys(kv,"--remove",LINKED_ARTIFACT_REMOVE_KEYS);if(!kv.path){throw new PmCliError("--remove key/value form requires path=<value>",EXIT_CODE.USAGE)}return kv.path}return trimmed})}function parseMigrateEntries(raw){if(!raw)return[];return raw.map(entry=>{const kv=parseCsvKv(entry,"--migrate");assertNoUnknownCsvKeys(kv,"--migrate",LINKED_ARTIFACT_MIGRATE_KEYS);const from=kv.from?.trim();const to=kv.to?.trim();if(!from||!to){throw new PmCliError("--migrate requires from=<value> and to=<value>",EXIT_CODE.USAGE)}return{from,to}})}function applyPathMigrations(artifactPath,migrations){let next=artifactPath;for(const migration of migrations){if(next.startsWith(migration.from)){next=`${migration.to}${next.slice(migration.from.length)}`}}return next}function assertLinkedArtifactMutationIsUnambiguous(adds,removes,migrations=[]){if(adds.length===0||removes.length===0){return}const addedPaths=new Set(adds.map(entry=>applyPathMigrations(entry.path,migrations)));const conflicts=[...new Set(removes.map(entry=>applyPathMigrations(entry,migrations)).filter(entry=>addedPaths.has(entry)))].sort((left,right)=>left.localeCompare(right));if(conflicts.length===0){return}throw new PmCliError(`Linked artifact mutation cannot add and remove the same normalized path in one transaction: ${conflicts.join(", ")}. Split the replacement into separate commands so each history event has one unambiguous intent.`,EXIT_CODE.USAGE,{code:"linked_artifact_mutation_conflict",reason:"same_path_added_and_removed",required:"Use distinct normalized paths for --add and --remove in one invocation.",why:"Conflicting batch intent cannot be applied deterministically without silently discarding metadata or a removal.",nextSteps:["Run the removal and addition as separate commands with a --message describing each intent."]})}function normalizeLinkedPath(value){return value.split(path.sep).join("/")}function anchorLinkedPath(value,workspaceRoot,invocationRoot=process.cwd()){const trimmed=value.trim();if(isRemoteLinkedArtifactReference(trimmed)){return trimmed}if(path.isAbsolute(trimmed)||/^[A-Za-z]:[\\/]/.test(trimmed)){return normalizeLinkedPath(trimmed.replaceAll("\\",path.sep))}const invocationRelativeToWorkspace=path.relative(workspaceRoot,invocationRoot);if(invocationRelativeToWorkspace.startsWith(`..${path.sep}`)||invocationRelativeToWorkspace===".."||path.isAbsolute(invocationRelativeToWorkspace)){return normalizeLinkedPath(path.normalize(trimmed))}return normalizeLinkedPath(path.relative(workspaceRoot,path.resolve(invocationRoot,trimmed)))}async function expandAddGlobEntries(entries,workspaceRoot=process.cwd(),invocationRoot=process.cwd()){const expanded=[];for(const entry of entries){if(path.resolve(invocationRoot,entry.pattern)===path.resolve(invocationRoot))continue;const absolutePattern=path.isAbsolute(entry.pattern);const matches=await glob(entry.pattern,{cwd:invocationRoot,absolute:absolutePattern,onlyFiles:true,dot:true,expandDirectories:false,followSymbolicLinks:true});const sortedMatches=[...new Set(matches.map(match=>anchorLinkedPath(match,workspaceRoot,invocationRoot)))].sort((left,right)=>left.localeCompare(right));for(const matchedPath of sortedMatches){expanded.push({path:matchedPath,scope:entry.scope,note:entry.note})}}return expanded}function applyStandaloneNote(adds,note,hasAddFlags){if(note===void 0){return adds}if(!hasAddFlags){throw new PmCliError("--note requires --add or --add-glob in the same invocation (the note annotates the links being added)",EXIT_CODE.USAGE)}const trimmed=note.trim();if(trimmed.length===0){return adds}return adds.map(entry=>entry.note===void 0?{...entry,note:trimmed}:entry)}function artifactKey(value){return`${value.path}::${value.scope}`}function sortLinkedArtifacts(artifacts){return[...artifacts].sort((left,right)=>{const byPath=left.path.localeCompare(right.path);if(byPath!==0)return byPath;return left.scope.localeCompare(right.scope)})}function dedupeLinkedArtifacts(artifacts){return[...new Map(artifacts.map(entry=>[artifactKey(entry),entry])).values()].map(entry=>({...entry,note:entry.note?.trim()||void 0}))}async function validateLinkedPaths(paths,workspaceRoot=process.cwd()){const uniquePaths=[...new Set(paths)].sort((left,right)=>left.localeCompare(right));const existingFiles=[];const missingPaths=[];const nonFilePaths=[];const remoteReferences=[];for(const relativePath of uniquePaths){if(isRemoteLinkedArtifactReference(relativePath)){remoteReferences.push(relativePath.trim());continue}const resolvedPath=path.isAbsolute(relativePath)?relativePath:path.resolve(workspaceRoot,relativePath);try{const stats=await fs.stat(resolvedPath);if(stats.isFile()){existingFiles.push(relativePath)}else{nonFilePaths.push(relativePath)}}catch(error){if(typeof error==="object"&&error!==null&&"code"in error&&isFileAbsentError(error)){missingPaths.push(relativePath);continue}nonFilePaths.push(relativePath)}}return{checked:uniquePaths.length,existing_files:existingFiles,missing_paths:missingPaths,non_file_paths:nonFilePaths,remote_references:remoteReferences}}function applyLinkedArtifactMigrations(current,adds,removes,migrations){let count=0;for(let index=0;index<current.length;index+=1){const migratedPath=applyPathMigrations(current[index].path,migrations);if(migratedPath!==current[index].path){current[index]={...current[index],path:migratedPath};count+=1}}const migratedAdds=adds.map(entry=>{const migratedPath=applyPathMigrations(entry.path,migrations);if(migratedPath!==entry.path)count+=1;return{...entry,path:migratedPath}});return{adds:migratedAdds,removes:removes.map(entry=>applyPathMigrations(entry,migrations)),count}}function mergeLinkedArtifactChanges(current,adds,removes,appendStable){const merged=dedupeLinkedArtifacts(current);for(const add of adds){const index=merged.findIndex(entry=>entry.path===add.path&&entry.scope===add.scope);if(index<0){merged.push(add)}else if(add.note!==void 0){merged[index]={...merged[index],note:add.note}}}if(removes.length>0){for(let index=merged.length-1;index>=0;index-=1){if(removes.includes(merged[index].path))merged.splice(index,1)}}return appendStable?merged:sortLinkedArtifacts(merged)}async function buildLinkedArtifactResult(params){const paths=params.artifacts.map(entry=>entry.path);return{id:params.id,artifacts:params.artifacts,changed:params.changed,count:params.artifacts.length,migrations_applied:params.migrationsApplied&&params.migrationsApplied>0?params.migrationsApplied:void 0,validation:params.options.validatePaths||params.changed?await validateLinkedPaths(paths,params.workspaceRoot):void 0}}async function runLinkedArtifacts(id,options,global2,config){const{metadataKey}=config;const stdinResolver=createStdinTokenResolver();const pmRoot=resolvePmRoot(process.cwd(),global2.path);const workspaceRoot=resolveWorkspaceRoot(pmRoot);const invocationRoot=process.cwd();await assertInitializedTracker(pmRoot);const settings=await readSettings(pmRoot);const typeRegistry=resolveItemTypeRegistry(settings,getActiveExtensionRegistrations());const resolvedAdds=await stdinResolver.resolveList(options.add,"--add");const resolvedAddGlobs=await stdinResolver.resolveList(options.addGlob,"--add-glob");const resolvedRemoves=await stdinResolver.resolveList(options.remove,"--remove");const resolvedMigrations=await stdinResolver.resolveList(options.migrate,"--migrate");const parsedAdds=parseAddEntries(resolvedAdds,config.bareNoun).map(entry=>({...entry,path:anchorLinkedPath(entry.path,workspaceRoot,invocationRoot)}));const addGlobs=parseAddGlobEntries(resolvedAddGlobs);const expandedGlobAdds=await expandAddGlobEntries(addGlobs,workspaceRoot,invocationRoot);const adds=applyStandaloneNote([...parsedAdds,...expandedGlobAdds],options.note,parsedAdds.length>0||addGlobs.length>0);const removes=parseRemoveEntries(resolvedRemoves).map(entry=>anchorLinkedPath(entry,workspaceRoot,invocationRoot));const migrations=parseMigrateEntries(resolvedMigrations);assertLinkedArtifactMutationIsUnambiguous(adds,removes,migrations);const shouldMutate=adds.length>0||removes.length>0||migrations.length>0;if(!shouldMutate){const located=await locateItem(pmRoot,id,settings.id_prefix,settings.item_format,typeRegistry.type_to_folder);if(!located){throw new PmCliError(`Item ${id} not found`,EXIT_CODE.NOT_FOUND)}const loaded=await readLocatedItem(located,{schema:settings.schema});const artifacts2=loaded.document.metadata[metadataKey]??[];return buildLinkedArtifactResult({id:located.id,artifacts:artifacts2,changed:false,options,workspaceRoot})}const author=resolveAuthor(options.author,settings.author_default);const result=await mutateItem({pmRoot,settings,id,op:config.op,author,message:options.message,force:options.force,skipNoop:true,mutate(document){const metadata=document.metadata;const current=metadata[metadataKey]??[];const next=[...current];const migrated=applyLinkedArtifactMigrations(next,adds,removes,migrations);const normalized=mergeLinkedArtifactChanges(next,migrated.adds,migrated.removes,config.supportsAppendStable&&options.appendStable===true);if(normalized.length>0){metadata[metadataKey]=normalized}else{delete metadata[metadataKey]}const changed=!stableValueEquals(current,normalized);return{changedFields:changed?[metadataKey]:[],warnings:changed&&migrated.count>0?[`path_migrations_applied:${migrated.count}`]:[]}}});const artifacts=result.item[metadataKey]??[];const migrationWarning=result.warnings.find(warning=>warning.startsWith("path_migrations_applied:"));const migrationCount=migrationWarning?Number(migrationWarning.slice("path_migrations_applied:".length)):0;return buildLinkedArtifactResult({id:result.item.id,artifacts,changed:result.changedFields.includes(metadataKey),migrationsApplied:migrationCount,options,workspaceRoot})}function renameArtifactsResultKey(result,key){const out={};for(const[field,value]of Object.entries(result)){out[field==="artifacts"?key:field]=value}return out}export{LINKED_ARTIFACT_ADD_GLOB_KEYS,LINKED_ARTIFACT_ADD_KEYS,LINKED_ARTIFACT_MIGRATE_KEYS,LINKED_ARTIFACT_REMOVE_KEYS,anchorLinkedPath,applyPathMigrations,applyStandaloneNote,artifactKey,assertLinkedArtifactMutationIsUnambiguous,dedupeLinkedArtifacts,ensureScope,expandAddGlobEntries,looksLikeStructuredPathEntry,normalizeLinkedPath,parseAddEntries,parseAddGlobEntries,parseMigrateEntries,parseRemoveEntries,renameArtifactsResultKey,runLinkedArtifacts,sortLinkedArtifacts,validateLinkedPaths};
1
+ (function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},n=new e.Error().stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="12655e94-6304-56cf-9f5d-387a26572db0")}catch{}})();import{assertInitializedTracker}from"./environment/tracker-preflight.js";import fs from"node:fs/promises";import path from"node:path";import{glob}from"tinyglobby";import{isFileAbsentError}from"../core/fs/fs-utils.js";import{getActiveExtensionRegistrations}from"../core/extensions/index.js";import{assertNoAmbiguousBareCommaEntry,assertNoUnknownCsvKeys,createStdinTokenResolver,looksLikeGenericKeyValueEntry,parseCsvKv}from"../core/item/parse.js";import{resolveItemTypeRegistry}from"../core/item/type-registry.js";import{isRemoteLinkedArtifactReference}from"../core/validate/linked-artifact-reference.js";import{EXIT_CODE}from"../core/shared/constants.js";import{PmCliError}from"../core/shared/errors.js";import{stableValueEquals}from"../core/shared/serialization.js";import{locateItem,mutateItem,readLocatedItem}from"../core/store/item-store.js";import{resolvePmRoot,resolveWorkspaceRoot}from"../core/store/paths.js";import{readSettings}from"../core/store/settings.js";import{SCOPE_VALUES}from"../types/index.js";import{resolveAuthor}from"../core/shared/author.js";const LINKED_ARTIFACT_ADD_KEYS=["path","scope","note"],LINKED_ARTIFACT_ADD_GLOB_KEYS=["pattern","glob","path","scope","note"],LINKED_ARTIFACT_REMOVE_KEYS=["path"],LINKED_ARTIFACT_MIGRATE_KEYS=["from","to"],LINKED_ARTIFACT_REMOVE_UNSUPPORTED_KEYS=new Set(["note","scope"]);function ensureScope(raw){const value=raw??"project";if(!SCOPE_VALUES.includes(value))throw new PmCliError(`Invalid scope "${raw}". Valid scopes: ${SCOPE_VALUES.join(", ")} (default: project).`,EXIT_CODE.USAGE);return value}function looksLikeStructuredPathEntry(raw){if(raw.startsWith("```")||raw.includes(`
2
+ `)||/^(?:[-*+]\s+)?(?:path|scope|note)\s*[:=]/i.test(raw))return!0;const firstCommaIndex=raw.indexOf(","),leadingSegment=raw.slice(0,firstCommaIndex>=0?firstCommaIndex:raw.length),equalsIndex=leadingSegment.indexOf("=");return equalsIndex>=0&&!/\s/u.test(raw)&&(/^[A-Za-z][A-Za-z0-9+.-]*:\/\//u.test(raw)||/^(?:[A-Za-z]:[\\/]|[\\/]{1,2}|\.\.?(?:[\\/]))/u.test(raw)||[raw.indexOf("/"),raw.indexOf("\\")].some(separatorIndex=>separatorIndex>=0&&separatorIndex<equalsIndex))?!1:leadingSegment.includes("=")||looksLikeGenericKeyValueEntry(raw)}function hasBalancedParentheses(value){let depth=0;for(const character of value)if(character==="("&&(depth+=1),character===")"&&(depth-=1),depth<0)return!1;return depth===0}function parseDocumentationReference(trimmed){if(/^[A-Za-z][A-Za-z0-9+.-]*:\/\//u.test(trimmed)&&!looksLikeStructuredPathEntry(trimmed))return{path:trimmed,scope:"project",note:void 0};const labelEnd=trimmed.indexOf("](");if(trimmed.startsWith("[")&&labelEnd>0&&trimmed.endsWith(")")){const destination2=trimmed.slice(labelEnd+2,-1).trim();if(destination2.length>0&&hasBalancedParentheses(destination2))return{path:destination2,scope:"project",note:trimmed.slice(1,labelEnd).trim()||void 0}}const delimiterIndex=trimmed.indexOf(",");if(delimiterIndex<0)return;const label=trimmed.slice(0,delimiterIndex).trim(),destination=trimmed.slice(delimiterIndex+1).trim();if(!(label.length===0||!/^[A-Za-z][A-Za-z0-9+.-]*:\/\//u.test(destination)))return{path:destination,scope:"project",note:label}}function parseAddEntries(raw,bareNoun){return raw?raw.flatMap(entry=>{const trimmed=entry.trim();if(bareNoun==="doc"){const reference=parseDocumentationReference(trimmed);if(reference!==void 0)return[reference]}assertNoAmbiguousBareCommaEntry(trimmed,"--add",`${bareNoun} path`,looksLikeStructuredPathEntry(trimmed));const kv=looksLikeStructuredPathEntry(trimmed)?parseCsvKv(entry,"--add"):{path:trimmed};if(assertNoUnknownCsvKeys(kv,"--add",LINKED_ARTIFACT_ADD_KEYS),!kv.path)throw new PmCliError(`--add requires path=<value> or a bare ${bareNoun} path`,EXIT_CODE.USAGE);return[{path:kv.path,scope:ensureScope(kv.scope),note:kv.note?.trim()||void 0}]}):[]}function parseAddGlobEntries(raw){return raw?raw.map(entry=>{const trimmed=entry.trim();if(!trimmed)throw new PmCliError("--add-glob requires a glob pattern value",EXIT_CODE.USAGE);if(trimmed.includes("=")||/^(?:[-*+]\s+)?(?:pattern|glob|path)\s*[:=]/i.test(trimmed)||trimmed.startsWith("```")){const kv=parseCsvKv(trimmed,"--add-glob");assertNoUnknownCsvKeys(kv,"--add-glob",LINKED_ARTIFACT_ADD_GLOB_KEYS);const pattern=kv.pattern?.trim()||kv.glob?.trim()||kv.path?.trim();if(!pattern)throw new PmCliError("--add-glob key/value form requires pattern=<glob>",EXIT_CODE.USAGE);return{pattern,scope:ensureScope(kv.scope),note:kv.note?.trim()||void 0}}return{pattern:trimmed,scope:"project"}}):[]}function parseRemoveEntries(raw){return raw?raw.map(entry=>{const trimmed=entry.trim();if(!trimmed)throw new PmCliError("--remove requires a path value",EXIT_CODE.USAGE);if(trimmed.includes("=")||/^(?:[-*+]\s+)?path\s*[:=]/i.test(trimmed)||trimmed.startsWith("```")){const kv=parseCsvKv(trimmed,"--remove"),unsupportedRemoveKeys=Object.keys(kv).filter(key=>LINKED_ARTIFACT_REMOVE_UNSUPPORTED_KEYS.has(key.toLowerCase()));if(unsupportedRemoveKeys.length>0)throw new PmCliError(`--remove identifies a linked artifact by path only and does not accept ${unsupportedRemoveKeys.map(key=>`"${key}"`).join(", ")}. Pass just the path (path=<value>, path:<value>, or a bare path); record removal context with --message "<why removed>".`,EXIT_CODE.USAGE);if(assertNoUnknownCsvKeys(kv,"--remove",LINKED_ARTIFACT_REMOVE_KEYS),!kv.path)throw new PmCliError("--remove key/value form requires path=<value>",EXIT_CODE.USAGE);return kv.path}return trimmed}):[]}function parseMigrateEntries(raw){return raw?raw.map(entry=>{const kv=parseCsvKv(entry,"--migrate");assertNoUnknownCsvKeys(kv,"--migrate",LINKED_ARTIFACT_MIGRATE_KEYS);const from=kv.from?.trim(),to=kv.to?.trim();if(!from||!to)throw new PmCliError("--migrate requires from=<value> and to=<value>",EXIT_CODE.USAGE);return{from,to}}):[]}function applyPathMigrations(artifactPath,migrations){let next=artifactPath;for(const migration of migrations)next.startsWith(migration.from)&&(next=`${migration.to}${next.slice(migration.from.length)}`);return next}function assertLinkedArtifactMutationIsUnambiguous(adds,removes,migrations=[]){if(adds.length===0||removes.length===0)return;const addedPaths=new Set(adds.map(entry=>applyPathMigrations(entry.path,migrations))),conflicts=[...new Set(removes.map(entry=>applyPathMigrations(entry,migrations)).filter(entry=>addedPaths.has(entry)))].sort((left,right)=>left.localeCompare(right));if(conflicts.length!==0)throw new PmCliError(`Linked artifact mutation cannot add and remove the same normalized path in one transaction: ${conflicts.join(", ")}. Split the replacement into separate commands so each history event has one unambiguous intent.`,EXIT_CODE.USAGE,{code:"linked_artifact_mutation_conflict",reason:"same_path_added_and_removed",required:"Use distinct normalized paths for --add and --remove in one invocation.",why:"Conflicting batch intent cannot be applied deterministically without silently discarding metadata or a removal.",nextSteps:["Run the removal and addition as separate commands with a --message describing each intent."]})}function normalizeLinkedPath(value){return value.split(path.sep).join("/")}function anchorLinkedPath(value,workspaceRoot,invocationRoot=process.cwd()){const trimmed=value.trim();if(isRemoteLinkedArtifactReference(trimmed))return trimmed;if(path.isAbsolute(trimmed)||/^[A-Za-z]:[\\/]/.test(trimmed))return normalizeLinkedPath(trimmed.replaceAll("\\",path.sep));const invocationRelativeToWorkspace=path.relative(workspaceRoot,invocationRoot);return invocationRelativeToWorkspace.startsWith(`..${path.sep}`)||invocationRelativeToWorkspace===".."||path.isAbsolute(invocationRelativeToWorkspace)?normalizeLinkedPath(path.normalize(trimmed)):normalizeLinkedPath(path.relative(workspaceRoot,path.resolve(invocationRoot,trimmed)))}async function expandAddGlobEntries(entries,workspaceRoot=process.cwd(),invocationRoot=process.cwd()){const expanded=[];for(const entry of entries){if(path.resolve(invocationRoot,entry.pattern)===path.resolve(invocationRoot))continue;const absolutePattern=path.isAbsolute(entry.pattern),matches=await glob(entry.pattern,{cwd:invocationRoot,absolute:absolutePattern,onlyFiles:!0,dot:!0,expandDirectories:!1,followSymbolicLinks:!0}),sortedMatches=[...new Set(matches.map(match=>anchorLinkedPath(match,workspaceRoot,invocationRoot)))].sort((left,right)=>left.localeCompare(right));for(const matchedPath of sortedMatches)expanded.push({path:matchedPath,scope:entry.scope,note:entry.note})}return expanded}function applyStandaloneNote(adds,note,hasAddFlags){if(note===void 0)return adds;if(!hasAddFlags)throw new PmCliError("--note requires --add or --add-glob in the same invocation (the note annotates the links being added)",EXIT_CODE.USAGE);const trimmed=note.trim();return trimmed.length===0?adds:adds.map(entry=>entry.note===void 0?{...entry,note:trimmed}:entry)}function artifactKey(value){return`${value.path}::${value.scope}`}function sortLinkedArtifacts(artifacts){return[...artifacts].sort((left,right)=>{const byPath=left.path.localeCompare(right.path);return byPath!==0?byPath:left.scope.localeCompare(right.scope)})}function dedupeLinkedArtifacts(artifacts){return[...new Map(artifacts.map(entry=>[artifactKey(entry),entry])).values()].map(entry=>({...entry,note:entry.note?.trim()||void 0}))}async function validateLinkedPaths(paths,workspaceRoot=process.cwd()){const uniquePaths=[...new Set(paths)].sort((left,right)=>left.localeCompare(right)),existingFiles=[],missingPaths=[],nonFilePaths=[],remoteReferences=[];for(const relativePath of uniquePaths){if(isRemoteLinkedArtifactReference(relativePath)){remoteReferences.push(relativePath.trim());continue}const resolvedPath=path.isAbsolute(relativePath)?relativePath:path.resolve(workspaceRoot,relativePath);try{(await fs.stat(resolvedPath)).isFile()?existingFiles.push(relativePath):nonFilePaths.push(relativePath)}catch(error){if(typeof error=="object"&&error!==null&&"code"in error&&isFileAbsentError(error)){missingPaths.push(relativePath);continue}nonFilePaths.push(relativePath)}}return{checked:uniquePaths.length,existing_files:existingFiles,missing_paths:missingPaths,non_file_paths:nonFilePaths,remote_references:remoteReferences}}function applyLinkedArtifactMigrations(current,adds,removes,migrations){let count=0;for(let index=0;index<current.length;index+=1){const migratedPath=applyPathMigrations(current[index].path,migrations);migratedPath!==current[index].path&&(current[index]={...current[index],path:migratedPath},count+=1)}return{adds:adds.map(entry=>{const migratedPath=applyPathMigrations(entry.path,migrations);return migratedPath!==entry.path&&(count+=1),{...entry,path:migratedPath}}),removes:removes.map(entry=>applyPathMigrations(entry,migrations)),count}}function mergeLinkedArtifactChanges(current,adds,removes,appendStable){const merged=dedupeLinkedArtifacts(current);for(const add of adds){const index=merged.findIndex(entry=>entry.path===add.path&&entry.scope===add.scope);index<0?merged.push(add):add.note!==void 0&&(merged[index]={...merged[index],note:add.note})}if(removes.length>0)for(let index=merged.length-1;index>=0;index-=1)removes.includes(merged[index].path)&&merged.splice(index,1);return appendStable?merged:sortLinkedArtifacts(merged)}async function buildLinkedArtifactResult(params){const paths=params.artifacts.map(entry=>entry.path);return{id:params.id,artifacts:params.artifacts,changed:params.changed,count:params.artifacts.length,migrations_applied:params.migrationsApplied&&params.migrationsApplied>0?params.migrationsApplied:void 0,validation:params.options.validatePaths||params.changed?await validateLinkedPaths(paths,params.workspaceRoot):void 0}}async function runLinkedArtifacts(id,options,global2,config){const{metadataKey}=config,stdinResolver=createStdinTokenResolver(),pmRoot=resolvePmRoot(process.cwd(),global2.path),workspaceRoot=resolveWorkspaceRoot(pmRoot),invocationRoot=process.cwd();await assertInitializedTracker(pmRoot);const settings=await readSettings(pmRoot),typeRegistry=resolveItemTypeRegistry(settings,getActiveExtensionRegistrations()),resolvedAdds=await stdinResolver.resolveList(options.add,"--add"),resolvedAddGlobs=await stdinResolver.resolveList(options.addGlob,"--add-glob"),resolvedRemoves=await stdinResolver.resolveList(options.remove,"--remove"),resolvedMigrations=await stdinResolver.resolveList(options.migrate,"--migrate"),parsedAdds=parseAddEntries(resolvedAdds,config.bareNoun).map(entry=>({...entry,path:anchorLinkedPath(entry.path,workspaceRoot,invocationRoot)})),addGlobs=parseAddGlobEntries(resolvedAddGlobs),expandedGlobAdds=await expandAddGlobEntries(addGlobs,workspaceRoot,invocationRoot),adds=applyStandaloneNote([...parsedAdds,...expandedGlobAdds],options.note,parsedAdds.length>0||addGlobs.length>0),removes=parseRemoveEntries(resolvedRemoves).map(entry=>anchorLinkedPath(entry,workspaceRoot,invocationRoot)),migrations=parseMigrateEntries(resolvedMigrations);if(assertLinkedArtifactMutationIsUnambiguous(adds,removes,migrations),!(adds.length>0||removes.length>0||migrations.length>0)){const located=await locateItem(pmRoot,id,settings.id_prefix,settings.item_format,typeRegistry.type_to_folder);if(!located)throw new PmCliError(`Item ${id} not found`,EXIT_CODE.NOT_FOUND);const artifacts2=(await readLocatedItem(located,{schema:settings.schema})).document.metadata[metadataKey]??[];return buildLinkedArtifactResult({id:located.id,artifacts:artifacts2,changed:!1,options,workspaceRoot})}const author=resolveAuthor(options.author,settings.author_default),result=await mutateItem({pmRoot,settings,id,op:config.op,author,message:options.message,force:options.force,skipNoop:!0,mutate(document){const metadata=document.metadata,current=metadata[metadataKey]??[],next=[...current],migrated=applyLinkedArtifactMigrations(next,adds,removes,migrations),normalized=mergeLinkedArtifactChanges(next,migrated.adds,migrated.removes,config.supportsAppendStable&&options.appendStable===!0);normalized.length>0?metadata[metadataKey]=normalized:delete metadata[metadataKey];const changed=!stableValueEquals(current,normalized);return{changedFields:changed?[metadataKey]:[],warnings:changed&&migrated.count>0?[`path_migrations_applied:${migrated.count}`]:[]}}}),artifacts=result.item[metadataKey]??[],migrationWarning=result.warnings.find(warning=>warning.startsWith("path_migrations_applied:")),migrationCount=migrationWarning?Number(migrationWarning.slice(24)):0;return buildLinkedArtifactResult({id:result.item.id,artifacts,changed:result.changedFields.includes(metadataKey),migrationsApplied:migrationCount,options,workspaceRoot})}function renameArtifactsResultKey(result,key){const out={};for(const[field,value]of Object.entries(result))out[field==="artifacts"?key:field]=value;return out}export{LINKED_ARTIFACT_ADD_GLOB_KEYS,LINKED_ARTIFACT_ADD_KEYS,LINKED_ARTIFACT_MIGRATE_KEYS,LINKED_ARTIFACT_REMOVE_KEYS,anchorLinkedPath,applyPathMigrations,applyStandaloneNote,artifactKey,assertLinkedArtifactMutationIsUnambiguous,dedupeLinkedArtifacts,ensureScope,expandAddGlobEntries,looksLikeStructuredPathEntry,normalizeLinkedPath,parseAddEntries,parseAddGlobEntries,parseMigrateEntries,parseRemoveEntries,renameArtifactsResultKey,runLinkedArtifacts,sortLinkedArtifacts,validateLinkedPaths};
2
3
  //# sourceMappingURL=linked-artifacts.js.map
@@ -1,4 +1,4 @@
1
- !(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]="4f17095e-2dba-530c-935c-1803ed359510")}catch(e2){}})();import{PM_MCP_ERROR_CODES,PmMcpProtocolError,isMcpRecord}from"./protocol.js";const PM_MCP_APPS_EXTENSION="io.modelcontextprotocol/ui";const PM_MCP_APPS_SPEC_VERSION="2026-01-26";const PM_MCP_APP_MIME_TYPE="text/html;profile=mcp-app";const PM_MCP_APPS_SERVER_CAPABILITY=Object.freeze({specVersion:PM_MCP_APPS_SPEC_VERSION,mimeTypes:[PM_MCP_APP_MIME_TYPE]});function hasPmMcpAppsCapability(context){const extensions=context.clientCapabilities.extensions;if(!isMcpRecord(extensions))return false;const declaration=extensions[PM_MCP_APPS_EXTENSION];if(declaration===void 0)return false;if(!isMcpRecord(declaration)){throw new PmMcpProtocolError("Invalid MCP Apps client capability",PM_MCP_ERROR_CODES.missingRequiredClientCapability,{requiredCapabilities:{extensions:{[PM_MCP_APPS_EXTENSION]:PM_MCP_APPS_SERVER_CAPABILITY}}})}const mimeTypes=declaration.mimeTypes;const specVersion=declaration.specVersion;if(!Array.isArray(mimeTypes)||!mimeTypes.includes(PM_MCP_APP_MIME_TYPE)||specVersion!==void 0&&specVersion!==PM_MCP_APPS_SPEC_VERSION){throw new PmMcpProtocolError("Unsupported MCP Apps client capability",PM_MCP_ERROR_CODES.missingRequiredClientCapability,{requiredCapabilities:{extensions:{[PM_MCP_APPS_EXTENSION]:PM_MCP_APPS_SERVER_CAPABILITY}}})}return true}const PRIVATE_APP_RESOURCE_META={csp:{connectDomains:[],resourceDomains:[],frameDomains:[]},permissions:{},prefersBorder:true};const PM_MCP_APP_CONTRACTS=Object.freeze([{id:"context",name:"Context explorer",description:"Inspect bounded project context, provenance, omissions, and token accounting.",toolName:"pm_context",uri:"ui://pm/context.html"},{id:"graph",name:"Relationship graph",description:"Explore typed relationships, explaining paths, and graph-governance evidence.",toolName:"pm_graph",uri:"ui://pm/graph.html"},{id:"plan",name:"Plan and milestone view",description:"Review durable plan steps, dependencies, decisions, discoveries, and validation state.",toolName:"pm_plan",uri:"ui://pm/plan.html"},{id:"assurance",name:"Assurance dashboard",description:"Inspect validation verdicts, evidence, omissions, and actionable recovery paths.",toolName:"pm_validate",uri:"ui://pm/assurance.html"},{id:"operations",name:"Long-operation view",description:"Inspect durable test and operation results without creating a second task store.",toolName:"pm_test",uri:"ui://pm/operations.html"}].map(contract=>({...contract,toolMeta:{resourceUri:contract.uri,visibility:["model","app"]},resourceMeta:PRIVATE_APP_RESOURCE_META})));function findPmMcpAppByUri(uri){return PM_MCP_APP_CONTRACTS.find(contract=>contract.uri===uri)}function decoratePmMcpToolsWithApps(tools){const appsByTool=new Map(PM_MCP_APP_CONTRACTS.map(contract=>[contract.toolName,contract]));return tools.map(tool=>{const app=appsByTool.get(tool.name);return app?{...tool,_meta:{...tool._meta,ui:app.toolMeta}}:{...tool}})}function escapeHtml(value){return value.replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;").replaceAll("'","&#39;")}function renderPmMcpAppHtml(contract){const title=escapeHtml(contract.name);const description=escapeHtml(contract.description);const appInfo=JSON.stringify({name:`pm-${contract.id}-view`,version:PM_MCP_APPS_SPEC_VERSION});const protocolVersion=JSON.stringify(PM_MCP_APPS_SPEC_VERSION);return`<!doctype html>
1
+ (function(){try{var e=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{},n=new e.Error().stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="46f5fe59-6b84-5c68-ad07-bb1329f4ea29")}catch{}})();import{PM_MCP_ERROR_CODES,PmMcpProtocolError,isMcpRecord}from"./protocol.js";const PM_MCP_APPS_EXTENSION="io.modelcontextprotocol/ui",PM_MCP_APPS_SPEC_VERSION="2026-01-26",PM_MCP_APP_MIME_TYPE="text/html;profile=mcp-app",PM_MCP_APPS_SERVER_CAPABILITY=Object.freeze({specVersion:PM_MCP_APPS_SPEC_VERSION,mimeTypes:[PM_MCP_APP_MIME_TYPE]});function hasPmMcpAppsCapability(context){const extensions=context.clientCapabilities.extensions;if(!isMcpRecord(extensions))return!1;const declaration=extensions[PM_MCP_APPS_EXTENSION];if(declaration===void 0)return!1;if(!isMcpRecord(declaration))throw new PmMcpProtocolError("Invalid MCP Apps client capability",PM_MCP_ERROR_CODES.missingRequiredClientCapability,{requiredCapabilities:{extensions:{[PM_MCP_APPS_EXTENSION]:PM_MCP_APPS_SERVER_CAPABILITY}}});const mimeTypes=declaration.mimeTypes,specVersion=declaration.specVersion;if(!Array.isArray(mimeTypes)||!mimeTypes.includes(PM_MCP_APP_MIME_TYPE)||specVersion!==void 0&&specVersion!==PM_MCP_APPS_SPEC_VERSION)throw new PmMcpProtocolError("Unsupported MCP Apps client capability",PM_MCP_ERROR_CODES.missingRequiredClientCapability,{requiredCapabilities:{extensions:{[PM_MCP_APPS_EXTENSION]:PM_MCP_APPS_SERVER_CAPABILITY}}});return!0}const PRIVATE_APP_RESOURCE_META={csp:{connectDomains:[],resourceDomains:[],frameDomains:[]},permissions:{},prefersBorder:!0},PM_MCP_APP_CONTRACTS=Object.freeze([{id:"context",name:"Context explorer",description:"Inspect bounded project context, provenance, omissions, and token accounting.",toolName:"pm_context",uri:"ui://pm/context.html"},{id:"graph",name:"Relationship graph",description:"Explore typed relationships, explaining paths, and graph-governance evidence.",toolName:"pm_graph",uri:"ui://pm/graph.html"},{id:"plan",name:"Plan and milestone view",description:"Review durable plan steps, dependencies, decisions, discoveries, and validation state.",toolName:"pm_plan",uri:"ui://pm/plan.html"},{id:"assurance",name:"Assurance dashboard",description:"Inspect validation verdicts, evidence, omissions, and actionable recovery paths.",toolName:"pm_validate",uri:"ui://pm/assurance.html"},{id:"operations",name:"Long-operation view",description:"Inspect durable test and operation results without creating a second task store.",toolName:"pm_test",uri:"ui://pm/operations.html"}].map(contract=>({...contract,toolMeta:{resourceUri:contract.uri,visibility:["model","app"]},resourceMeta:PRIVATE_APP_RESOURCE_META})));function findPmMcpAppByUri(uri){return PM_MCP_APP_CONTRACTS.find(contract=>contract.uri===uri)}function decoratePmMcpToolsWithApps(tools){const appsByTool=new Map(PM_MCP_APP_CONTRACTS.map(contract=>[contract.toolName,contract]));return tools.map(tool=>{const app=appsByTool.get(tool.name);return app?{...tool,_meta:{...tool._meta,ui:app.toolMeta}}:{...tool}})}function escapeHtml(value){return value.replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;").replaceAll("'","&#39;")}function renderPmMcpAppHtml(contract){const title=escapeHtml(contract.name),description=escapeHtml(contract.description),appInfo=JSON.stringify({name:`pm-${contract.id}-view`,version:PM_MCP_APPS_SPEC_VERSION}),protocolVersion=JSON.stringify(PM_MCP_APPS_SPEC_VERSION);return`<!doctype html>
2
2
  <html lang="en">
3
3
  <head>
4
4
  <meta charset="utf-8">