@unbrained/pm-cli 2026.10.15 → 2026.10.18

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 (275) hide show
  1. package/.agents/skills/pm-developer/references/COMMAND_PLAYBOOK.md +1 -1
  2. package/.claude-plugin/marketplace.json +1 -1
  3. package/AGENTS.md +1 -0
  4. package/CHANGELOG.md +45 -0
  5. package/dist/cli/extension-command-options.d.ts +3 -1
  6. package/dist/cli/extension-command-options.js +1 -1
  7. package/dist/cli/help-content.js +2 -2
  8. package/dist/cli/register-list-query.js +2 -2
  9. package/dist/cli/register-mutation.js +2 -2
  10. package/dist/cli/register-operations.js +1 -1
  11. package/dist/cli/register-structured-mutation.d.ts +0 -5
  12. package/dist/cli/register-structured-mutation.js +1 -1
  13. package/dist/cli/runtime/invocation-options.js +1 -1
  14. package/dist/cli-bundle/bundle-manifest.json +1 -1
  15. package/dist/cli-bundle/chunks/{chunk-7VHINXZP.js → chunk-4GA4MUTE.js} +2 -2
  16. package/dist/cli-bundle/chunks/{chunk-RJ5N44WY.js → chunk-4V6ONLI6.js} +2 -2
  17. package/dist/cli-bundle/chunks/{chunk-LNKLQYBG.js → chunk-6VZKYJW7.js} +2 -2
  18. package/dist/cli-bundle/chunks/chunk-7PATQWTH.js +20 -0
  19. package/dist/cli-bundle/chunks/chunk-7WIEAGDS.js +2 -0
  20. package/dist/cli-bundle/chunks/{chunk-52EZH2QQ.js → chunk-AETP4JEM.js} +2 -2
  21. package/dist/cli-bundle/chunks/{chunk-WBBW3WQX.js → chunk-FIJOSX2C.js} +28 -28
  22. package/dist/cli-bundle/chunks/chunk-LUKVNL72.js +2 -0
  23. package/dist/cli-bundle/chunks/{chunk-NC3QVGDD.js → chunk-OJ77ZQN3.js} +2 -2
  24. package/dist/cli-bundle/chunks/chunk-PYRREEUB.js +30 -0
  25. package/dist/cli-bundle/chunks/chunk-RHQJ6VWC.js +237 -0
  26. package/dist/cli-bundle/chunks/{chunk-N56CAQBU.js → chunk-RNABUEFB.js} +52 -52
  27. package/dist/cli-bundle/chunks/chunk-TO6CIV4C.js +2 -0
  28. package/dist/cli-bundle/chunks/{chunk-JGKTOBVB.js → chunk-ZZED447K.js} +4 -4
  29. package/dist/cli-bundle/chunks/{register-list-query-FKKFQ66D.js → register-list-query-PUCVYYBD.js} +7 -7
  30. package/dist/cli-bundle/chunks/register-mutation-GGGVBXD5.js +20 -0
  31. package/dist/cli-bundle/chunks/{register-operations-GEQ2H7PS.js → register-operations-NRZ6Q4QE.js} +2 -2
  32. package/dist/cli-bundle/chunks/{register-setup-PSJTQBBO.js → register-setup-MV3P3YSF.js} +2 -2
  33. package/dist/cli-bundle/focused-chunks/chunk-2MPQUMTF.js +2 -0
  34. package/dist/cli-bundle/focused-chunks/{chunk-H3P77KVU.js → chunk-5UKCSZWT.js} +2 -2
  35. package/dist/cli-bundle/focused-chunks/{chunk-4KQFMOM7.js → chunk-A4ZHHTEX.js} +5 -5
  36. package/dist/cli-bundle/focused-chunks/{chunk-5OO54BIV.js → chunk-B4YLP5ZB.js} +3 -3
  37. package/dist/cli-bundle/focused-chunks/chunk-BFEMT5U3.js +20 -0
  38. package/dist/cli-bundle/focused-chunks/{chunk-THYQR3ON.js → chunk-FW7CSSKL.js} +61 -61
  39. package/dist/cli-bundle/focused-chunks/{chunk-3RNUMVK4.js → chunk-HYPRPSYD.js} +2 -2
  40. package/dist/cli-bundle/focused-chunks/{chunk-FQKPOZKS.js → chunk-IRVL4UXR.js} +2 -2
  41. package/dist/cli-bundle/focused-chunks/{chunk-Q4VNCTR2.js → chunk-L55KQ2KT.js} +2 -2
  42. package/dist/cli-bundle/focused-chunks/{chunk-52I2SNKJ.js → chunk-MASIOFPG.js} +2 -2
  43. package/dist/cli-bundle/focused-chunks/chunk-RJ3EIHDU.js +26 -0
  44. package/dist/cli-bundle/focused-chunks/chunk-SEL4Z2OO.js +167 -0
  45. package/dist/cli-bundle/focused-chunks/{chunk-TYLG5VEB.js → chunk-TB7F4FCR.js} +2 -2
  46. package/dist/cli-bundle/focused-chunks/{chunk-KIIFVULU.js → chunk-TZUIBG3P.js} +2 -2
  47. package/dist/cli-bundle/focused-chunks/{chunk-N6FUKTZS.js → chunk-Z7YIFCNE.js} +2 -2
  48. package/dist/cli-bundle/focused-chunks/{chunk-5KRACGBK.js → chunk-ZDBS2DCT.js} +3 -3
  49. package/dist/cli-bundle/main.js +27 -27
  50. package/dist/cli-bundle/sdk-authoring.js +1 -1
  51. package/dist/cli-bundle/sdk-contracts.js +2 -2
  52. package/dist/cli-bundle/sdk-core.js +23 -23
  53. package/dist/cli-bundle/sdk-governance.js +1 -1
  54. package/dist/cli-bundle/sdk-graph.js +1 -1
  55. package/dist/cli-bundle/sdk-merge.js +55 -54
  56. package/dist/cli-bundle/sdk-query.js +1 -1
  57. package/dist/cli-bundle/sdk-runtime.js +1 -1
  58. package/dist/cli-bundle/sdk-testing.js +1 -1
  59. package/dist/cli-bundle/sdk.js +7 -7
  60. package/dist/core/extensions/extension-types.d.ts +15 -0
  61. package/dist/core/extensions/extension-types.js +1 -1
  62. package/dist/core/extensions/flag-value-types.d.ts +16 -0
  63. package/dist/core/extensions/flag-value-types.js +1 -1
  64. package/dist/core/extensions/registration-contracts.js +1 -1
  65. package/dist/core/history/event-index.d.ts +8 -1
  66. package/dist/core/history/event-index.js +19 -18
  67. package/dist/core/item/item-format.js +3 -3
  68. package/dist/core/lock/lock.d.ts +8 -1
  69. package/dist/core/lock/lock.js +3 -3
  70. package/dist/core/output/mutation-projection.d.ts +0 -21
  71. package/dist/core/output/mutation-projection.js +1 -1
  72. package/dist/core/output/output.js +2 -2
  73. package/dist/core/schema/type-workflows.d.ts +1 -1
  74. package/dist/core/schema/type-workflows.js +1 -1
  75. package/dist/core/shared/text-normalization.d.ts +2 -0
  76. package/dist/core/shared/text-normalization.js +1 -1
  77. package/dist/core/store/item-mutation-precondition.d.ts +11 -0
  78. package/dist/core/store/item-mutation-precondition.js +2 -0
  79. package/dist/core/store/item-store.js +1 -1
  80. package/dist/core/store/paths.js +1 -1
  81. package/dist/core/telemetry/policy.d.ts +2 -0
  82. package/dist/core/telemetry/policy.js +1 -1
  83. package/dist/core/telemetry/runtime.d.ts +5 -3
  84. package/dist/core/telemetry/runtime.js +3 -3
  85. package/dist/mcp/server.js +1 -1
  86. package/dist/mcp/tool-definitions.js +1 -1
  87. package/dist/sdk/cli-contracts/agent-output-contracts.js +1 -1
  88. package/dist/sdk/cli-contracts/flag-contracts.js +1 -1
  89. package/dist/sdk/cli-contracts/flag-lexicon-contracts.js +1 -1
  90. package/dist/sdk/cli-contracts/registration-helpers.d.ts +1 -1
  91. package/dist/sdk/cli-contracts/registration-helpers.js +1 -1
  92. package/dist/sdk/cli-contracts/tool-schema.d.ts +2 -2
  93. package/dist/sdk/cli-contracts/tool-schema.js +1 -1
  94. package/dist/sdk/context-intent-contracts.js +1 -1
  95. package/dist/sdk/core.d.ts +2 -1
  96. package/dist/sdk/core.js +1 -1
  97. package/dist/sdk/generated/generated-error-code-catalog-part-1.js +1 -1
  98. package/dist/sdk/generated/generated-error-code-catalog-part-2.js +1 -1
  99. package/dist/sdk/governance/health/projection.d.ts +37 -0
  100. package/dist/sdk/governance/health/projection.js +2 -0
  101. package/dist/sdk/governance/health.d.ts +7 -18
  102. package/dist/sdk/governance/health.js +2 -2
  103. package/dist/sdk/guide-topics.js +1 -1
  104. package/dist/sdk/index.d.ts +2 -1
  105. package/dist/sdk/index.js +1 -1
  106. package/dist/sdk/item-transaction.d.ts +72 -9
  107. package/dist/sdk/item-transaction.js +1 -1
  108. package/dist/sdk/lifecycle/claim.d.ts +15 -1
  109. package/dist/sdk/lifecycle/claim.js +1 -1
  110. package/dist/sdk/lifecycle/close.d.ts +2 -8
  111. package/dist/sdk/lifecycle/close.js +1 -1
  112. package/dist/sdk/lifecycle/core-item-fields.d.ts +6 -0
  113. package/dist/sdk/lifecycle/core-item-fields.js +2 -0
  114. package/dist/sdk/lifecycle/mcp-actions.js +1 -1
  115. package/dist/sdk/lifecycle/mutation-option-validation.d.ts +2 -0
  116. package/dist/sdk/lifecycle/mutation-option-validation.js +2 -0
  117. package/dist/sdk/lifecycle/release-handoff.d.ts +12 -0
  118. package/dist/sdk/lifecycle/release-handoff.js +2 -0
  119. package/dist/sdk/lifecycle/structured-mutation-plan.d.ts +33 -0
  120. package/dist/sdk/lifecycle/structured-mutation-plan.js +2 -0
  121. package/dist/sdk/lifecycle/task-composition.d.ts +2 -2
  122. package/dist/sdk/lifecycle/task-composition.js +1 -1
  123. package/dist/sdk/lifecycle/update.d.ts +3 -11
  124. package/dist/sdk/lifecycle/update.js +1 -1
  125. package/dist/sdk/lifecycle/workflow-transition.d.ts +13 -0
  126. package/dist/sdk/lifecycle/workflow-transition.js +2 -0
  127. package/dist/sdk/lifecycle-policy.d.ts +12 -2
  128. package/dist/sdk/lifecycle-policy.js +1 -1
  129. package/dist/sdk/mutation-events.js +1 -1
  130. package/dist/sdk/public-surface.json +1 -1
  131. package/dist/sdk/query/list.d.ts +2 -0
  132. package/dist/sdk/query/list.js +1 -1
  133. package/dist/sdk/read-output-budget.js +1 -1
  134. package/dist/sdk/runtime-input.js +1 -1
  135. package/dist/sdk/runtime-primitives.d.ts +1 -1
  136. package/dist/sdk/runtime-primitives.js +1 -1
  137. package/dist/sdk/runtime.d.ts +8 -8
  138. package/dist/sdk/runtime.js +1 -1
  139. package/dist/sdk/structured-mutations.d.ts +52 -1
  140. package/dist/sdk/structured-mutations.js +1 -1
  141. package/dist/sdk/workspace-transaction.js +2 -2
  142. package/dist/types.d.ts +2 -2
  143. package/dist/types.js +1 -1
  144. package/docs/AGENT_GUIDE.md +33 -4
  145. package/docs/CLOSE_EVIDENCE_RECOVERY.md +16 -7
  146. package/docs/COMMANDS.md +111 -10
  147. package/docs/CONFIGURATION.md +22 -1
  148. package/docs/DEVELOPMENT_DEPENDENCY_SECURITY.md +22 -3
  149. package/docs/ECOSYSTEM_PLANNING_REVIEW.md +5 -1
  150. package/docs/EXTENSIONS.md +1 -1
  151. package/docs/OUTPUT_PROJECTION_CONTRACTS.md +10 -0
  152. package/docs/RELEASING.md +8 -1
  153. package/docs/SDK.md +114 -2
  154. package/docs/SDK_CONTEXT_COORDINATION.md +71 -7
  155. package/docs/SDK_STORAGE_LIFECYCLE.md +24 -2
  156. package/docs/TESTING.md +23 -0
  157. package/docs/examples/ci/github-actions-pm-extension-gate.yml +1 -1
  158. package/docs/examples/ci/gitlab-ci-pm-extension-gate.yml +1 -1
  159. package/docs/examples/ci/jenkins-pm-extension-gate.Jenkinsfile +1 -1
  160. package/docs/generated/FLAG_LEXICON_BUDGETS.md +1 -1
  161. package/docs/generated/REFUSAL_CLOSURE_CENSUS.md +16 -3
  162. package/marketplace.json +1 -1
  163. package/node_modules/@opentelemetry/core/package.json +2 -1
  164. package/node_modules/@opentelemetry/instrumentation/package.json +2 -1
  165. package/node_modules/@opentelemetry/resources/package.json +2 -1
  166. package/node_modules/@opentelemetry/sdk-trace/package.json +2 -1
  167. package/node_modules/@opentelemetry/sdk-trace-base/package.json +2 -1
  168. package/node_modules/@sentry/core/build/cjs/client.js +5 -4
  169. package/node_modules/@sentry/core/build/cjs/tracing/ai/gen-ai-attributes.js +0 -4
  170. package/node_modules/@sentry/core/build/cjs/tracing/ai/utils.js +33 -23
  171. package/node_modules/@sentry/core/build/cjs/tracing/anthropic-ai/index.js +7 -6
  172. package/node_modules/@sentry/core/build/cjs/tracing/anthropic-ai/streaming.js +3 -1
  173. package/node_modules/@sentry/core/build/cjs/tracing/google-genai/index.js +13 -14
  174. package/node_modules/@sentry/core/build/cjs/tracing/google-genai/streaming.js +6 -1
  175. package/node_modules/@sentry/core/build/cjs/tracing/langchain/utils.js +71 -21
  176. package/node_modules/@sentry/core/build/cjs/tracing/langgraph/utils.js +23 -33
  177. package/node_modules/@sentry/core/build/cjs/tracing/openai/streaming.js +6 -0
  178. package/node_modules/@sentry/core/build/cjs/tracing/openai/utils.js +11 -0
  179. package/node_modules/@sentry/core/build/cjs/tracing/workers-ai/utils.js +1 -1
  180. package/node_modules/@sentry/core/build/cjs/utils/eventUtils.js +4 -0
  181. package/node_modules/@sentry/core/build/cjs/utils/prepareEvent.js +2 -2
  182. package/node_modules/@sentry/core/build/cjs/utils/version.js +1 -1
  183. package/node_modules/@sentry/core/build/esm/client.js +6 -5
  184. package/node_modules/@sentry/core/build/esm/package.json +1 -1
  185. package/node_modules/@sentry/core/build/esm/tracing/ai/gen-ai-attributes.js +1 -3
  186. package/node_modules/@sentry/core/build/esm/tracing/ai/utils.js +34 -24
  187. package/node_modules/@sentry/core/build/esm/tracing/anthropic-ai/index.js +8 -7
  188. package/node_modules/@sentry/core/build/esm/tracing/anthropic-ai/streaming.js +3 -1
  189. package/node_modules/@sentry/core/build/esm/tracing/google-genai/index.js +15 -16
  190. package/node_modules/@sentry/core/build/esm/tracing/google-genai/streaming.js +6 -1
  191. package/node_modules/@sentry/core/build/esm/tracing/langchain/utils.js +73 -24
  192. package/node_modules/@sentry/core/build/esm/tracing/langgraph/utils.js +24 -34
  193. package/node_modules/@sentry/core/build/esm/tracing/openai/streaming.js +6 -0
  194. package/node_modules/@sentry/core/build/esm/tracing/openai/utils.js +11 -0
  195. package/node_modules/@sentry/core/build/esm/tracing/workers-ai/utils.js +2 -2
  196. package/node_modules/@sentry/core/build/esm/utils/eventUtils.js +4 -1
  197. package/node_modules/@sentry/core/build/esm/utils/prepareEvent.js +2 -2
  198. package/node_modules/@sentry/core/build/esm/utils/version.js +1 -1
  199. package/node_modules/@sentry/core/build/types/tracing/ai/utils.d.ts +3 -7
  200. package/node_modules/@sentry/core/build/types/tracing/anthropic-ai/types.d.ts +2 -2
  201. package/node_modules/@sentry/core/build/types/tracing/langchain/types.d.ts +15 -0
  202. package/node_modules/@sentry/core/build/types/tracing/langchain/utils.d.ts +1 -0
  203. package/node_modules/@sentry/core/build/types/tracing/langgraph/utils.d.ts +2 -0
  204. package/node_modules/@sentry/core/build/types/tracing/openai/types.d.ts +2 -0
  205. package/node_modules/@sentry/core/build/types/utils/eventUtils.d.ts +2 -1
  206. package/node_modules/@sentry/core/build/types-ts3.8/tracing/ai/utils.d.ts +3 -7
  207. package/node_modules/@sentry/core/build/types-ts3.8/tracing/anthropic-ai/types.d.ts +2 -2
  208. package/node_modules/@sentry/core/build/types-ts3.8/tracing/langchain/types.d.ts +15 -0
  209. package/node_modules/@sentry/core/build/types-ts3.8/tracing/langchain/utils.d.ts +1 -0
  210. package/node_modules/@sentry/core/build/types-ts3.8/tracing/langgraph/utils.d.ts +2 -0
  211. package/node_modules/@sentry/core/build/types-ts3.8/tracing/openai/types.d.ts +2 -0
  212. package/node_modules/@sentry/core/build/types-ts3.8/utils/eventUtils.d.ts +2 -1
  213. package/node_modules/@sentry/core/package.json +1 -1
  214. package/node_modules/@sentry/node/build/esm/package.json +1 -1
  215. package/node_modules/@sentry/node/package.json +5 -5
  216. package/node_modules/@sentry/node-core/build/cjs/integrations/anr/index.js +1 -1
  217. package/node_modules/@sentry/node-core/build/cjs/integrations/local-variables/local-variables-async.js +1 -1
  218. package/node_modules/@sentry/node-core/build/esm/integrations/anr/index.js +1 -1
  219. package/node_modules/@sentry/node-core/build/esm/integrations/anr/worker-script.js +2 -2
  220. package/node_modules/@sentry/node-core/build/esm/integrations/local-variables/local-variables-async.js +1 -1
  221. package/node_modules/@sentry/node-core/build/esm/integrations/local-variables/worker-script.js +1 -1
  222. package/node_modules/@sentry/node-core/build/esm/package.json +1 -1
  223. package/node_modules/@sentry/node-core/package.json +10 -4
  224. package/node_modules/@sentry/opentelemetry/build/esm/package.json +1 -1
  225. package/node_modules/@sentry/opentelemetry/package.json +5 -2
  226. package/node_modules/@sentry/server-utils/build/THIRD-PARTY-LICENSES.txt +55 -55
  227. package/node_modules/@sentry/server-utils/build/esm/package.json +1 -1
  228. package/node_modules/@sentry/server-utils/package.json +2 -2
  229. package/node_modules/@toon-format/toon/README.md +10 -41
  230. package/node_modules/@toon-format/toon/dist/index.d.mts +12 -36
  231. package/node_modules/@toon-format/toon/dist/index.mjs +134 -202
  232. package/node_modules/@toon-format/toon/package.json +2 -2
  233. package/node_modules/debug/package.json +3 -0
  234. package/node_modules/fdir/package.json +3 -0
  235. package/node_modules/has-flag/index.d.ts +39 -0
  236. package/node_modules/has-flag/index.js +8 -0
  237. package/node_modules/has-flag/license +9 -0
  238. package/node_modules/has-flag/package.json +46 -0
  239. package/node_modules/has-flag/readme.md +89 -0
  240. package/node_modules/supports-color/browser.js +5 -0
  241. package/node_modules/supports-color/index.js +135 -0
  242. package/node_modules/supports-color/license +9 -0
  243. package/node_modules/supports-color/package.json +53 -0
  244. package/node_modules/supports-color/readme.md +76 -0
  245. package/package.json +5 -4
  246. package/packages/pm-beads/package.json +1 -1
  247. package/packages/pm-calendar/package.json +1 -1
  248. package/packages/pm-command-kit/package.json +1 -1
  249. package/packages/pm-digital-twin/package.json +1 -1
  250. package/packages/pm-governance-audit/package.json +1 -1
  251. package/packages/pm-guide-shell/package.json +1 -1
  252. package/packages/pm-kanban/package.json +1 -1
  253. package/packages/pm-lifecycle-hooks/package.json +1 -1
  254. package/packages/pm-linked-test-adapters/package.json +1 -1
  255. package/packages/pm-search-advanced/package.json +1 -1
  256. package/packages/pm-templates/package.json +1 -1
  257. package/packages/pm-todos/package.json +1 -1
  258. package/packages/pm-vcs/package.json +1 -1
  259. package/plugins/pm-claude/.claude-plugin/plugin.json +1 -1
  260. package/plugins/pm-claude/package.json +1 -1
  261. package/plugins/pm-codex/.codex-plugin/plugin.json +1 -1
  262. package/plugins/pm-codex/package.json +1 -1
  263. package/plugins/pm-codex/plugin.json +1 -1
  264. package/runtime-dependencies.json +1 -1
  265. package/dist/cli-bundle/chunks/chunk-7OEGNA4X.js +0 -20
  266. package/dist/cli-bundle/chunks/chunk-EMEEHV2Y.js +0 -2
  267. package/dist/cli-bundle/chunks/chunk-JSUJWIHQ.js +0 -30
  268. package/dist/cli-bundle/chunks/chunk-VIMQCFCK.js +0 -2
  269. package/dist/cli-bundle/chunks/chunk-X2H6UR26.js +0 -236
  270. package/dist/cli-bundle/chunks/register-mutation-EWMMVZJB.js +0 -20
  271. package/dist/cli-bundle/focused-chunks/chunk-5TBAVZDR.js +0 -20
  272. package/dist/cli-bundle/focused-chunks/chunk-HTA3TNC3.js +0 -26
  273. package/dist/cli-bundle/focused-chunks/chunk-JKBH7YGX.js +0 -2
  274. package/dist/cli-bundle/focused-chunks/chunk-PDYE7QDX.js +0 -166
  275. package/docs/ecosystem-review-2026-09-28.json +0 -1
@@ -0,0 +1,6 @@
1
+ /** Core item document fields; extension metadata retains its independently declared spelling. */
2
+ export declare const CORE_ITEM_FIELD_KEYS:ReadonlySet<string>;
3
+ /** Normalize only known core option targets; preserve unrelated extension metadata keys verbatim. */
4
+ export declare function resolveCoreUpsertMetadataKey(key:string):string;
5
+ /** Preserve an omitted key while normalizing a supplied core option target. */
6
+ export declare function resolveCoreUpsertMetadataKey(key:string | undefined):string | undefined;
@@ -0,0 +1,2 @@
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]="01728cbc-2037-50d2-8318-5f106714b8da")}catch{}})();import{ITEM_PROJECT_CONTEXT_KEYS}from"../../core/shared/constants.js";const CORE_ITEM_FIELD_KEYS=new Set(["id","title","description","type","status","priority","tags","body","deadline","estimated_minutes","acceptance_criteria","definition_of_ready","order","rank","assignee",...ITEM_PROJECT_CONTEXT_KEYS,"affected_version","fixed_version","component","regression","customer_impact","close_reason","completed_at","dependencies","comments","notes","learnings","files","tests","docs","reminders","events","type_options"]);function resolveCoreUpsertMetadataKey(key){if(key===void 0)return;const stored=key.replace(/[A-Z]/gu,letter=>`_${letter.toLowerCase()}`);return CORE_ITEM_FIELD_KEYS.has(stored)?stored:key}export{CORE_ITEM_FIELD_KEYS,resolveCoreUpsertMetadataKey};
2
+ //# sourceMappingURL=core-item-fields.js.map
@@ -1,2 +1,2 @@
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]="140b50c9-b0b3-5446-8ef9-5993bf4d830c")}catch{}})();import{projectMutationResult}from"../../core/output/mutation-projection.js";import{PmCliError}from"../../core/shared/errors.js";import{runClose}from"./close.js";import{runReopen}from"./reopen.js";import{runClaim,runClaimNext,runRelease}from"./claim.js";import{runStartTask,runPauseTask,runCloseTask}from"./task-composition.js";import{readRuntimeString,withMutationCompaction,mutationOptionsWithOverrides}from"../runtime-input.js";async function runMcpClaimAction(context){const{changedFields,idOnly,runnerOptions}=withMutationCompaction(context.args,context.options),force=context.force===!0||runnerOptions.force===!0,selectionOptions={...context.args,...runnerOptions};if(selectionOptions.start===!0)return runMcpTaskCompositionAction(context,"start_task");const result=context.args.next===!0||runnerOptions.next===!0?await runClaimNext(force,context.global,selectionOptions,selectionOptions):await runClaim(requireLifecycleItemId(context,runnerOptions),force,context.global,selectionOptions);return projectMutationResult(result,{changedFields,compactEnvelope:changedFields==="compact"&&!idOnly,idOnly})}function requireLifecycleItemId(context,options){const id=context.id??readRuntimeString(options,"id");if(!id)throw new PmCliError("Missing required argument: id",64);return id}function readLifecycleReason(context,options){return readRuntimeString(context.args,"reason")??readRuntimeString(context.args,"text")??readRuntimeString(options,"reason")??readRuntimeString(options,"text")}async function runMcpCloseAction(context){const{changedFields,idOnly,runnerOptions}=withMutationCompaction(context.args,context.options);return runnerOptions.releaseAssignment===!0?runMcpTaskCompositionAction(context,"close_task"):projectMutationResult(await runClose(requireLifecycleItemId(context,runnerOptions),readLifecycleReason(context,runnerOptions),{...runnerOptions,force:context.force===!0||runnerOptions.force===!0},context.global),{changedFields,compactEnvelope:changedFields==="compact"&&!idOnly,idOnly})}async function runMcpTaskCompositionAction(context,action){const{changedFields,idOnly,runnerOptions}=withMutationCompaction(context.args,context.options),id=requireLifecycleItemId(context,runnerOptions),options=mutationOptionsWithOverrides(runnerOptions,{force:context.force===!0||runnerOptions.force===!0}),result=action==="start_task"?await runStartTask(id,options,context.global):action==="pause_task"?await runPauseTask(id,options,context.global):await runCloseTask(id,readLifecycleReason(context,runnerOptions),options,context.global);return projectMutationResult(result,{changedFields,idOnly,compactEnvelope:changedFields==="compact"&&!idOnly})}async function runMcpReleaseAction(context){if(context.options.pause===!0)return runMcpTaskCompositionAction(context,"pause_task");const{changedFields,idOnly,runnerOptions}=withMutationCompaction(context.args,context.options),result=await runRelease(requireLifecycleItemId(context,runnerOptions),context.force===!0,context.global,runnerOptions);return projectMutationResult(result,{changedFields,idOnly,compactEnvelope:changedFields==="compact"&&!idOnly})}async function runMcpReopenAction(context){const{changedFields,idOnly,runnerOptions}=withMutationCompaction(context.args,context.options);return projectMutationResult(await runReopen(requireLifecycleItemId(context,runnerOptions),readLifecycleReason(context,runnerOptions)??"",{...runnerOptions,force:context.force===!0||runnerOptions.force===!0},context.global),{changedFields,compactEnvelope:changedFields==="compact"&&!idOnly,idOnly})}export{runMcpClaimAction,runMcpCloseAction,runMcpReleaseAction,runMcpReopenAction,runMcpTaskCompositionAction};
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]="04780b9d-76a4-544a-9341-7aa56c1e451b")}catch{}})();import{projectMutationResult}from"../../core/output/mutation-projection.js";import{PmCliError}from"../../core/shared/errors.js";import{runClose}from"./close.js";import{runReopen}from"./reopen.js";import{runClaim,runClaimNext,runRelease}from"./claim.js";import{runStartTask,runPauseTask,runCloseTask}from"./task-composition.js";import{readRuntimeString,withMutationCompaction,mutationOptionsWithOverrides}from"../runtime-input.js";async function runMcpClaimAction(context){const{changedFields,idOnly,runnerOptions}=withMutationCompaction(context.args,context.options),force=context.force===!0||runnerOptions.force===!0,selectionOptions={...context.args,...runnerOptions};if(selectionOptions.start===!0)return runMcpTaskCompositionAction(context,"start_task");const result=context.args.next===!0||runnerOptions.next===!0?await runClaimNext(force,context.global,selectionOptions,selectionOptions):await runClaim(requireLifecycleItemId(context,runnerOptions),force,context.global,selectionOptions);return projectMutationResult(result,{changedFields,compactEnvelope:changedFields==="compact"&&!idOnly,idOnly})}function requireLifecycleItemId(context,options){const id=context.id??readRuntimeString(options,"id");if(!id)throw new PmCliError("Missing required argument: id",64);return id}function readLifecycleReason(context,options){return readRuntimeString(context.args,"reason")??readRuntimeString(context.args,"text")??readRuntimeString(options,"reason")??readRuntimeString(options,"text")}async function runMcpCloseAction(context){const{changedFields,idOnly,runnerOptions}=withMutationCompaction(context.args,context.options);return runnerOptions.releaseAssignment===!0?runMcpTaskCompositionAction(context,"close_task"):projectMutationResult(await runClose(requireLifecycleItemId(context,runnerOptions),readLifecycleReason(context,runnerOptions),{...runnerOptions,force:context.force===!0||runnerOptions.force===!0},context.global),{changedFields,compactEnvelope:changedFields==="compact"&&!idOnly,idOnly})}async function runMcpTaskCompositionAction(context,action){const{changedFields,idOnly,runnerOptions}=withMutationCompaction(context.args,context.options),id=requireLifecycleItemId(context,runnerOptions),options=mutationOptionsWithOverrides(runnerOptions,{force:context.force===!0||runnerOptions.force===!0}),result=action==="start_task"?await runStartTask(id,options,context.global):action==="pause_task"?await runPauseTask(id,options,context.global):await runCloseTask(id,readLifecycleReason(context,runnerOptions),options,context.global);return projectMutationResult(result,{changedFields,idOnly,compactEnvelope:changedFields==="compact"&&!idOnly})}async function runMcpReleaseAction(context){const{changedFields,idOnly,runnerOptions}=withMutationCompaction(context.args,context.options),options=mutationOptionsWithOverrides(runnerOptions,{message:readRuntimeString(Object.hasOwn(runnerOptions,"message")?runnerOptions:context.args,"message")});if(options.pause===!0)return runMcpTaskCompositionAction({...context,options},"pause_task");const result=await runRelease(requireLifecycleItemId(context,options),context.force===!0||options.force===!0,context.global,options);return projectMutationResult(result,{changedFields,idOnly,compactEnvelope:changedFields==="compact"&&!idOnly})}async function runMcpReopenAction(context){const{changedFields,idOnly,runnerOptions}=withMutationCompaction(context.args,context.options);return projectMutationResult(await runReopen(requireLifecycleItemId(context,runnerOptions),readLifecycleReason(context,runnerOptions)??"",{...runnerOptions,force:context.force===!0||runnerOptions.force===!0},context.global),{changedFields,compactEnvelope:changedFields==="compact"&&!idOnly,idOnly})}export{runMcpClaimAction,runMcpCloseAction,runMcpReleaseAction,runMcpReopenAction,runMcpTaskCompositionAction};
2
2
  //# sourceMappingURL=mcp-actions.js.map
@@ -0,0 +1,2 @@
1
+ /** Reject malformed raw duration options before either parsed or direct SDK batches can write. */
2
+ export declare function assertMutationOptionValueTypes(options:Readonly<Record<string,unknown>> | undefined,op:string,index:number):void;
@@ -0,0 +1,2 @@
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]="6456f85b-e076-5048-9c21-03d477267259")}catch{}})();import{EXIT_CODE}from"../../core/shared/constants.js";import{PmCliError}from"../../core/shared/errors.js";function assertMutationOptionValueTypes(options,op,index){const value=options?.estimatedMinutes;if(!(value===void 0||typeof value=="string"))throw new PmCliError(`Mutation ${index+1} ${op} option "estimatedMinutes" must be a string.`,EXIT_CODE.USAGE,{code:"mutation_option_value_invalid",required:'Pass estimatedMinutes as a string, for example "45", in raw mutation options.',why:"Raw options use the create/update command option types; item documents accept numeric estimated_minutes instead.",nextSteps:["Quote the estimatedMinutes value or use an item document with numeric estimated_minutes, then retry the transaction."]})}export{assertMutationOptionValueTypes};
2
+ //# sourceMappingURL=mutation-option-validation.js.map
@@ -0,0 +1,12 @@
1
+ /** @module sdk/lifecycle/release-handoff Validates project-defined handoff queues before ownership changes. */
2
+ import { type RuntimeStatusRegistry } from "../../core/schema/runtime-schema.js";
3
+ import type { ItemMetadata,PmSettings } from "../../types/index.js";
4
+ import type { ReleaseMutationOptions,ReleaseResult } from "./claim.js";
5
+ /** Resolve a declared non-terminal queue and evidence without inventing project statuses. */
6
+ export declare function resolveReleaseHandoff(options:ReleaseMutationOptions,registry:RuntimeStatusRegistry):string | undefined;
7
+ /** Enforce the locked source state and configured transition before changing the queue. */
8
+ export declare function applyReleaseHandoff(metadata:ItemMetadata,target:string,settings:PmSettings,registry:RuntimeStatusRegistry,message:string):{
9
+ receipt:NonNullable<ReleaseResult["handoff"]>;
10
+ warnings:string[];
11
+ changedFields:string[];
12
+ };
@@ -0,0 +1,2 @@
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]="e32c9f13-2e6a-5ac6-a1ce-9c839121441a")}catch{}})();import{normalizeStatusInputWithRegistry,statusIsTerminal}from"../../core/schema/runtime-schema.js";import{resolveTypeWorkflows}from"../../core/schema/type-workflows.js";import{EXIT_CODE}from"../../core/shared/constants.js";import{PmCliError}from"../../core/shared/errors.js";import{enforceTypeWorkflowTransition}from"./workflow-transition.js";function resolveReleaseHandoff(options,registry){if(options.handoff===void 0)return;if(options.pause===!0)throw new PmCliError("--handoff cannot be combined with --pause. Choose a handoff queue or pause the item.",EXIT_CODE.USAGE);const status=typeof options.handoff=="string"?normalizeStatusInputWithRegistry(options.handoff,registry):void 0;if(status===void 0||statusIsTerminal(status,registry)||status===registry.in_progress_status)throw new PmCliError("--handoff must name a configured non-terminal status distinct from the in-progress status. Inspect pm schema statuses or add a project queue with pm schema add-status <queue> --role active.",EXIT_CODE.USAGE);if(typeof options.message!="string"||options.message.trim().length===0)throw new PmCliError("--handoff requires --message with implementation evidence and the next verification step.",EXIT_CODE.USAGE);return status}function applyReleaseHandoff(metadata,target,settings,registry,message){if(statusIsTerminal(metadata.status,registry)||!metadata.assignee?.trim())throw new PmCliError("Handoff requires a claimed, non-terminal item. Claim the active work before handing it off; use pm item reopen for completed work.",EXIT_CODE.CONFLICT);const enforcement=settings.governance.workflow_enforcement??"off",warning=enforceTypeWorkflowTransition({enforcement,typeWorkflows:enforcement==="off"?[]:resolveTypeWorkflows(settings.schema),statusRegistry:registry,typeName:metadata.type,fromStatus:metadata.status,toStatus:target}),receipt={from_status:metadata.status,to_status:target,message},changedFields=metadata.status===target?[]:["status"];return metadata.status=target,{receipt,warnings:warning?[warning]:[],changedFields}}export{applyReleaseHandoff,resolveReleaseHandoff};
2
+ //# sourceMappingURL=release-handoff.js.map
@@ -0,0 +1,33 @@
1
+ import type { PmSettings } from "../../types/index.js";
2
+ import { type ResolvedItemMutationDocument } from "../structured-mutations.js";
3
+ /** Inputs for planning one mutation document against a workspace. */
4
+ export interface PlanItemMutationDocumentOptions {
5
+ /** Tracker root whose schema and items govern the plan. */
6
+ pmRoot:string;
7
+ /** Raw document text: JSON array, versioned envelope, single record, or JSON Lines. */
8
+ input:string;
9
+ /** Explicit stable transaction id; omitted ids derive from the document bytes. */
10
+ transactionId?:string;
11
+ /** Stored field key, declared field key or option target identifying existing items. Stored keys take precedence over aliases. */
12
+ upsertKey?:string;
13
+ /** Already-read settings, to avoid a second settings read on hot paths. */
14
+ settings?:PmSettings;
15
+ }
16
+ /** Resolved plan plus the transaction identity the caller must reuse to resume. */
17
+ export interface PlannedItemMutationDocument extends ResolvedItemMutationDocument {
18
+ /** Transaction id to pass to preview/commit; stable across replays of the same document. */
19
+ transaction_id:string;
20
+ /** Whether the transaction id came from the caller or was derived from the document. */
21
+ transaction_id_source:"explicit" | "derived";
22
+ /** Upsert key applied to create rows, when any. */
23
+ upsert_key?:string;
24
+ }
25
+ /**
26
+ * Resolve a mutation document against the workspace. Reads happen before the
27
+ * writer lock; the returned batch is deterministic for the same document,
28
+ * schema, and existing items, so interrupted or repeated imports replay
29
+ * through the transaction journal instead of duplicating work. Create rows
30
+ * left by keyed upsert carry a `unique` guard that the commit re-checks under
31
+ * the lock, so a concurrent writer cannot slip a duplicate in after planning.
32
+ */
33
+ export declare function planItemMutationDocument(options:PlanItemMutationDocumentOptions):Promise<PlannedItemMutationDocument>;
@@ -0,0 +1,2 @@
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]="3c45eeb2-58f2-58f9-ad24-e439967b99ef")}catch{}})();import{resolveRuntimeFieldRegistry,runtimeFieldOptionTarget}from"../../core/schema/runtime-schema.js";import{listUpsertKeyCandidates,resolveTransactionSchema}from"../item-transaction.js";import{readSettings}from"../../core/store/settings.js";import{resolveCoreUpsertMetadataKey}from"./core-item-fields.js";import{EXIT_CODE}from"../../core/shared/constants.js";import{PmCliError}from"../../core/shared/errors.js";import{deriveMutationTransactionId,resolveItemMutationDocument}from"../structured-mutations.js";async function planItemMutationDocument(options){const suppliedKey=options.upsertKey?.trim();if(suppliedKey!==void 0&&suppliedKey.length===0)throw new PmCliError("Upsert key must be a non-empty field name.",EXIT_CODE.USAGE);const settings=options.settings??await readSettings(options.pmRoot),explicit=options.transactionId?.trim()??"",transactionId=explicit.length>0?explicit:deriveMutationTransactionId(options.input),planSchema=await resolveTransactionSchema(options.pmRoot,settings),runtimeFields=resolveRuntimeFieldRegistry(planSchema.schema).definitions,upsertKey=(runtimeFields.find(field=>field.metadata_key===suppliedKey)??runtimeFields.find(field=>field.key===suppliedKey||runtimeFieldOptionTarget(field)===suppliedKey))?.metadata_key??resolveCoreUpsertMetadataKey(suppliedKey),upsert=upsertKey===void 0?void 0:{key:upsertKey,existing:await listUpsertKeyCandidates(options.pmRoot,settings,planSchema,upsertKey)};return{...resolveItemMutationDocument(options.input,{transactionId,idPrefix:settings.id_prefix,runtimeFields,...upsert===void 0?{}:{upsert}}),transaction_id:transactionId,transaction_id_source:explicit.length>0?"explicit":"derived",...upsert===void 0?{}:{upsert_key:upsert.key}}}export{planItemMutationDocument};
2
+ //# sourceMappingURL=structured-mutation-plan.js.map
@@ -1,9 +1,9 @@
1
1
  import type { GlobalOptions } from "../../core/shared/command-types.js";
2
- import { type ClaimMutationOptions } from "./claim.js";
2
+ import { type ReleaseMutationOptions } from "./claim.js";
3
3
  import { type CloseCommandOptions } from "./close.js";
4
4
  import type { StartTaskResult,PauseTaskResult,CloseTaskResult } from "../runtime-public-contracts.js";
5
5
  /** Ownership inputs shared by the explicit-item start and pause compositions. */
6
- export interface TaskCompositionOptions extends ClaimMutationOptions {
6
+ export interface TaskCompositionOptions extends ReleaseMutationOptions {
7
7
  /** Permit the same ownership and terminal overrides as constituent mutations. */
8
8
  force?:boolean;
9
9
  /** Ranked selection cannot be combined with an explicit-item composition. */
@@ -1,2 +1,2 @@
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]="69182e8d-b8c7-5b70-8650-185a8f07f6ee")}catch{}})();import{PmCliError}from"../../core/shared/errors.js";import{EXIT_CODE}from"../../core/shared/constants.js";import{resolveRuntimeStatusRegistry}from"../../core/schema/runtime-schema.js";import{resolvePmRoot}from"../../core/store/paths.js";import{readSettings}from"../../core/store/settings.js";import{runClaim,runRelease}from"./claim.js";import{runClose}from"./close.js";import{runUpdate}from"./update.js";import{resolveStartTaskInProgressStatus}from"../start-task-status.js";import{mutationOptionsWithOverrides}from"../runtime-input.js";async function finishComposition(id,completed,operation){try{return await operation()}catch(error){const context=error instanceof PmCliError?error.context:{},failure=new PmCliError(error instanceof Error?error.message:String(error),error instanceof PmCliError?error.exitCode:EXIT_CODE.GENERIC_FAILURE,{...context,item_id:id,why:`${completed} completed for ${id} before the following step failed. No rollback was performed.${context.why?` ${context.why}`:""}`,nextSteps:[`Inspect the persisted state with pm get ${id} and pm history ${id} before retrying the failed step.`,...context.nextSteps??[]]});throw failure.cause=error,failure}}async function runStartTask(id,options,global2){if(options.next===!0||options.ifAvailable===!0)throw new PmCliError("--start cannot be combined with --next or --if-available for an explicit item",EXIT_CODE.USAGE,{code:"invalid_argument_value",required:"Remove --next and --if-available when starting an explicit item.",nextSteps:["Remove --next and --if-available, keep the explicit item ID and other supplied arguments, then retry."]});const settings=await readSettings(resolvePmRoot(process.cwd(),global2.path)),status=resolveStartTaskInProgressStatus(resolveRuntimeStatusRegistry(settings.schema)),claim=await runClaim(id,options.force===!0,global2,options),canonicalId=claim.item.id,update=await finishComposition(canonicalId,"claim",()=>runUpdate(canonicalId,mutationOptionsWithOverrides(options,{status},["assignee","start","next","ifAvailable","maxAttempts"]),global2));return{id:canonicalId,action:"start_task",claim,update}}async function runPauseTask(id,options,global2){const settings=await readSettings(resolvePmRoot(process.cwd(),global2.path)),status=resolveRuntimeStatusRegistry(settings.schema).open_status,update=await runUpdate(id,mutationOptionsWithOverrides(options,{status},["assignee","pause"]),global2),canonicalId=update.item.id,release=await finishComposition(canonicalId,"update",()=>runRelease(canonicalId,options.force===!0,global2,options));return{id:canonicalId,action:"pause_task",update,release}}async function runCloseTask(id,reason,options,global2){const close=await runClose(id,reason,options,global2),canonicalId=close.item.id,release=await finishComposition(canonicalId,"close",()=>runRelease(canonicalId,options.force===!0,global2,options));return{id:canonicalId,action:"close_task",close,release}}export{finishComposition,runCloseTask,runPauseTask,runStartTask};
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]="23f3ce6b-d536-5df2-92b1-ec756d53aa02")}catch{}})();import{PmCliError}from"../../core/shared/errors.js";import{EXIT_CODE}from"../../core/shared/constants.js";import{resolveRuntimeStatusRegistry}from"../../core/schema/runtime-schema.js";import{resolvePmRoot}from"../../core/store/paths.js";import{readSettings}from"../../core/store/settings.js";import{runClaim,runRelease}from"./claim.js";import{resolveReleaseHandoff}from"./release-handoff.js";import{runClose}from"./close.js";import{runUpdate}from"./update.js";import{resolveStartTaskInProgressStatus}from"../start-task-status.js";import{mutationOptionsWithOverrides}from"../runtime-input.js";async function finishComposition(id,completed,operation){try{return await operation()}catch(error){const context=error instanceof PmCliError?error.context:{},failure=new PmCliError(error instanceof Error?error.message:String(error),error instanceof PmCliError?error.exitCode:EXIT_CODE.GENERIC_FAILURE,{...context,item_id:id,why:`${completed} completed for ${id} before the following step failed. No rollback was performed.${context.why?` ${context.why}`:""}`,nextSteps:[`Inspect the persisted state with pm get ${id} and pm history ${id} before retrying the failed step.`,...context.nextSteps??[]]});throw failure.cause=error,failure}}async function runStartTask(id,options,global2){if(options.next===!0||options.ifAvailable===!0)throw new PmCliError("--start cannot be combined with --next or --if-available for an explicit item",EXIT_CODE.USAGE,{code:"invalid_argument_value",required:"Remove --next and --if-available when starting an explicit item.",nextSteps:["Remove --next and --if-available, keep the explicit item ID and other supplied arguments, then retry."]});const settings=await readSettings(resolvePmRoot(process.cwd(),global2.path)),status=resolveStartTaskInProgressStatus(resolveRuntimeStatusRegistry(settings.schema)),claim=await runClaim(id,options.force===!0,global2,options),canonicalId=claim.item.id,update=await finishComposition(canonicalId,"claim",()=>runUpdate(canonicalId,mutationOptionsWithOverrides(options,{status},["assignee","start","next","ifAvailable","maxAttempts"]),global2));return{id:canonicalId,action:"start_task",claim,update}}async function runPauseTask(id,options,global2){const settings=await readSettings(resolvePmRoot(process.cwd(),global2.path)),registry=resolveRuntimeStatusRegistry(settings.schema);resolveReleaseHandoff({...options,pause:!0},registry);const status=registry.open_status,update=await runUpdate(id,mutationOptionsWithOverrides(options,{status},["assignee","pause"]),global2),canonicalId=update.item.id,release=await finishComposition(canonicalId,"update",()=>runRelease(canonicalId,options.force===!0,global2,options));return{id:canonicalId,action:"pause_task",update,release}}async function runCloseTask(id,reason,options,global2){const close=await runClose(id,reason,options,global2),canonicalId=close.item.id,release=await finishComposition(canonicalId,"close",()=>runRelease(canonicalId,options.force===!0,global2,options));return{id:canonicalId,action:"close_task",close,release}}export{finishComposition,runCloseTask,runPauseTask,runStartTask};
2
2
  //# sourceMappingURL=task-composition.js.map
@@ -1,5 +1,6 @@
1
- import { resolveItemTypeRegistry,type RuntimeFieldRegistry,type RuntimeStatusRegistry,type NormalizedTypeWorkflow,type GlobalOptions,PmCliError,getActiveExtensionRegistrations,readSettings } from "../runtime-primitives.js";
2
- import type { Dependency,GovernanceWorkflowEnforcement,ItemDocument } from "../../types/index.js";
1
+ import { resolveItemTypeRegistry,type RuntimeFieldRegistry,type RuntimeStatusRegistry,type GlobalOptions,PmCliError,getActiveExtensionRegistrations,readSettings } from "../runtime-primitives.js";
2
+ import { enforceTypeWorkflowTransition } from "./workflow-transition.js";
3
+ import type { Dependency,ItemDocument } from "../../types/index.js";
3
4
  import { parseDocs,parseFiles,parseLogSeed,parseTests } from "./create.js";
4
5
  import type { MutationMetadataCommandOptions,SharedLinkedResourceClearOptions,SharedLinkedResourceOptions } from "./mutation-command-options.js";
5
6
  /** Documents the update command options payload exchanged by command, SDK, and package integrations. */
@@ -106,15 +107,6 @@ why:string;
106
107
  disallowedFlags:string[];
107
108
  }):PmCliError;
108
109
  declare function enforceOwnershipBypassScope(id:string,options:UpdateCommandOptions,clearItemMetadataKeys:Set<string>):void;
109
- /** Enforce per-type allowed-transition rules (governance.workflow_enforcement). `off` (default) or an unrestricted type is a no-op. `strict` throws on a disallowed transition; `warn` returns a warning string surfaced on the update result. The target status is the raw `--status` value (resolved case-insensitively through the registry inside evaluateTransition). */
110
- declare function enforceTypeWorkflowTransition(params:{
111
- enforcement:GovernanceWorkflowEnforcement;
112
- typeWorkflows:NormalizedTypeWorkflow[];
113
- statusRegistry:RuntimeStatusRegistry;
114
- typeName:string;
115
- fromStatus:string;
116
- toStatus:string;
117
- }):string | undefined;
118
110
  interface ParsedDependencyUpdates {
119
111
  additions:Dependency[];
120
112
  }
@@ -1,3 +1,3 @@
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]="1d77acec-3731-597e-ad30-9ea1d25c057f")}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{resolveCoreFieldRecovery}from"./core-field-recovery.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{requireDependencyKind,assertDependencyEdgesAllowed,assertDependencyTargetsResolvable,assertValidBareDependencyFlagValue}from"../dependency-flag-validation.js";import{normalizeDependencySeedId,normalizeItemReference,isExternalDependencyReference,normalizeDependencySourceKind}from"../dependency-provenance.js";import{collectNewOrderingCycleWarnings}from"../graph/mutation-advisory.js";import{assertHierarchyMutationAllowed}from"../graph/hierarchy-integrity.js";import{assertNonHierarchyCardinalityMutationAllowed,relationshipKindNeedsIntegrityLock}from"../graph/cardinality-integrity.js";import{resolveWorkspaceRelationshipKindRegistry}from"../graph/assembly.js";import{acquireHierarchyMutationLock}from"./hierarchy-mutation-lock.js";import{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(`
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]="f93d880f-109a-51b7-8572-d03841e35803")}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,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{enforceTypeWorkflowTransition}from"./workflow-transition.js";import{normalizeRiskInput,normalizeSeverityInput,parseConfidenceInput,parseRegressionInput}from"./metadata-normalizers.js";import{resolveCoreFieldRecovery}from"./core-field-recovery.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{requireDependencyKind,assertDependencyEdgesAllowed,assertDependencyTargetsResolvable,assertValidBareDependencyFlagValue}from"../dependency-flag-validation.js";import{normalizeDependencySeedId,normalizeItemReference,isExternalDependencyReference,normalizeDependencySourceKind}from"../dependency-provenance.js";import{collectNewOrderingCycleWarnings}from"../graph/mutation-advisory.js";import{assertHierarchyMutationAllowed}from"../graph/hierarchy-integrity.js";import{assertNonHierarchyCardinalityMutationAllowed,relationshipKindNeedsIntegrityLock}from"../graph/cardinality-integrity.js";import{resolveWorkspaceRelationshipKindRegistry}from"../graph/assembly.js";import{acquireHierarchyMutationLock}from"./hierarchy-mutation-lock.js";import{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 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
2
  `)||/^(?:[-*+]\s+)?(?:id|kind|type|author|created_at|source_kind)\s*[:=]/i.test(raw)?!0:looksLikeGenericKeyValueEntry(raw)}function normalizeDependencyKindInput(raw){return typeof raw=="string"?resolveWorkspaceRelationshipKindRegistry().resolve(raw)?.kind??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:requireDependencyKind(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?requireDependencyKind(kindRaw):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&&(assertNonHierarchyCardinalityMutationAllowed(params.before,params.before.map(item=>item.id===params.document.metadata.id?params.document.metadata:item)),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,resolveCoreFieldRecovery);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=>relationshipKindNeedsIntegrityLock(dependency.kind,relationshipRegistry)),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};
3
3
  //# sourceMappingURL=update.js.map
@@ -0,0 +1,13 @@
1
+ /** @module sdk/lifecycle/workflow-transition Shared per-type workflow enforcement for lifecycle writers. */
2
+ import { type NormalizedTypeWorkflow } from "../../core/schema/type-workflows.js";
3
+ import { type RuntimeStatusRegistry } from "../../core/schema/runtime-schema.js";
4
+ import type { GovernanceWorkflowEnforcement } from "../../types/index.js";
5
+ /** Enforce per-type allowed-transition rules (governance.workflow_enforcement). `off` (default) or an unrestricted type is a no-op. `strict` throws on a disallowed transition; `warn` returns a warning string surfaced on the update result. The target status is the raw `--status` value (resolved case-insensitively through the registry inside evaluateTransition). */
6
+ export declare function enforceTypeWorkflowTransition(params:{
7
+ enforcement:GovernanceWorkflowEnforcement;
8
+ typeWorkflows:NormalizedTypeWorkflow[];
9
+ statusRegistry:RuntimeStatusRegistry;
10
+ typeName:string;
11
+ fromStatus:string;
12
+ toStatus:string;
13
+ }):string | undefined;
@@ -0,0 +1,2 @@
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]="4790c318-c305-53d4-895c-e9ac90665376")}catch{}})();import{describeAllowedTransitions,evaluateTransition}from"../../core/schema/type-workflows.js";import{normalizeStatusInputWithRegistry as normalizeStatusInput}from"../../core/schema/runtime-schema.js";import{PmCliError}from"../../core/shared/errors.js";import{EXIT_CODE}from"../../core/shared/constants.js";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}`}export{enforceTypeWorkflowTransition};
2
+ //# sourceMappingURL=workflow-transition.js.map
@@ -1,4 +1,3 @@
1
- import { type PmCliErrorRecoveryPayload } from "../core/shared/errors.js";
2
1
  import type { ItemMetadata } from "../types/index.js";
3
2
  /** The author-controlled field from which a terminal reason was derived. */
4
3
  export type TerminalReasonSource = "explicit" | "duplicate" | "resolution" | "message" | "none";
@@ -39,10 +38,21 @@ item:Record<string,unknown>;
39
38
  /** Metadata fields changed by the transition. */
40
39
  changed_fields:string[];
41
40
  /** Evidence-only update guidance when a successful warning close leaves acceptance fields missing. */
42
- recovery?:PmCliErrorRecoveryPayload;
41
+ follow_up?:CloseEvidenceFollowUp;
43
42
  /** Validation and lifecycle policy receipts. */
44
43
  warnings:string[];
45
44
  }
45
+ /** Optional evidence completion after a successful, durable close. */
46
+ export interface CloseEvidenceFollowUp {
47
+ /** Close succeeded; this guidance does not request another close attempt. */
48
+ kind:"complete_close_evidence";
49
+ /** Only the evidence flags that remain missing. */
50
+ missing:string[];
51
+ /** Readable evidence-only update command. */
52
+ suggested_command:string;
53
+ /** Authoritative argument vector retaining the tracker and item identity. */
54
+ suggested_command_args:string[];
55
+ }
46
56
  /** Candidate author-controlled sources for one terminal transition reason. */
47
57
  export interface TerminalReasonInput {
48
58
  /** Explicit reason supplied by the operation caller. */
@@ -1,2 +1,2 @@
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};
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]="8e07b07a-fde3-5173-bb7c-7e8ade88570c")}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,2 @@
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]="3483e997-6bee-52bf-a048-8fe5c2427d06")}catch{}})();import{assertInitializedTracker}from"./environment/tracker-preflight.js";import{createHash}from"node:crypto";import{setTimeout as delay}from"node:timers/promises";import{queryHistoryEventIndex,queryHistoryEventStreams,rebuildHistoryEventIndex}from"../core/history/event-index.js";import{EXIT_CODE}from"../core/shared/constants.js";import{PmCliError}from"../core/shared/errors.js";import{stableStringify}from"../core/shared/serialization.js";import{resolvePmRoot}from"../core/store/paths.js";import{readSettings}from"../core/store/settings.js";import{parseHistoryProvenanceFilters,projectHistoryProvenance,resolveHistoryProvenanceDimensions,summarizeHistoryProvenance}from"./history-provenance.js";const MUTATION_EVENT_CURSOR_VERSION=1,MUTATION_EVENT_CURSOR_PATTERN=/^[A-Za-z0-9_-]+$/,DEFAULT_EVENT_LIMIT=100,MAX_EVENT_LIMIT=1e3,DEFAULT_FOLLOW_INTERVAL_MS=250,MUTATION_EVENT_WIRE_BUDGET=Object.freeze({batch_to_row_ratio:.6,fixture_events:200});function normalizeFilter(value){if(value===void 0)return;const values=typeof value=="string"?[value]:value,normalized=[...new Set(values.flatMap(entry=>entry.split(",")).map(entry=>entry.trim()).filter(Boolean))].sort((left,right)=>left.localeCompare(right));return normalized.length===0?void 0:normalized}function eventQueryFingerprint(options){return createHash("sha256").update(stableStringify({type:normalizeFilter(options.type),author:normalizeFilter(options.author),item:normalizeFilter(options.item),harness:normalizeFilter(options.harness),agent_instance:normalizeFilter(options.agentInstance),provenance:normalizeFilter(options.provenanceFilter)})).digest("hex").slice(0,24)}function encodeMutationEventCursor(event,fingerprint){const envelope={version:MUTATION_EVENT_CURSOR_VERSION,fingerprint,ts:event.entry.ts,stream_id:event.stream_id,stream_offset:event.stream_offset};return Buffer.from(JSON.stringify(envelope),"utf8").toString("base64url")}function isMutationEventCursorEnvelope(value,fingerprint){if(typeof value!="object"||value===null)return!1;const candidate=value;return[candidate.version===MUTATION_EVENT_CURSOR_VERSION,candidate.fingerprint===fingerprint,typeof candidate.ts=="string",typeof candidate.stream_id=="string",typeof candidate.stream_offset=="number",Number.isSafeInteger(candidate.stream_offset),Number(candidate.stream_offset)>=0].every(Boolean)}function decodeMutationEventCursor(cursor,fingerprint){const normalized=cursor.trim();if(normalized.length===0||normalized.length>4096||!MUTATION_EVENT_CURSOR_PATTERN.test(normalized))throw new PmCliError("Invalid mutation event cursor.",EXIT_CODE.USAGE,{code:"invalid_event_cursor"});let parsed;try{parsed=JSON.parse(Buffer.from(normalized,"base64url").toString("utf8"))}catch{throw new PmCliError("Invalid mutation event cursor.",EXIT_CODE.USAGE,{code:"invalid_event_cursor"})}if(!isMutationEventCursorEnvelope(parsed,fingerprint))throw new PmCliError("Mutation event cursor does not match this query.",EXIT_CODE.USAGE,{code:"event_cursor_query_mismatch"});return parsed}function parseMutationEventLimit(value){const limit=value??DEFAULT_EVENT_LIMIT;if(!Number.isSafeInteger(limit)||limit<0||limit>MAX_EVENT_LIMIT)throw new PmCliError(`Mutation event limit must be an integer from 0 to ${MAX_EVENT_LIMIT}.`,EXIT_CODE.USAGE,{code:"invalid_event_limit"});return limit}function isAbortError(error){return error instanceof Error&&error.name==="AbortError"}function resolveMutationEventStart(sinceValue,fingerprint){const since=sinceValue?.trim();if(!since)return{};if(MUTATION_EVENT_CURSOR_PATTERN.test(since))return{cursor:decodeMutationEventCursor(since,fingerprint)};const milliseconds=Date.parse(since);if(!Number.isFinite(milliseconds))throw new PmCliError("Mutation event --since must be an event cursor or ISO timestamp.",EXIT_CODE.USAGE,{code:"invalid_event_since"});return{sinceTimestamp:new Date(milliseconds).toISOString()}}async function resolveIndexedMutationEvents(pmRoot,query){let indexed=await queryHistoryEventIndex(pmRoot,query);if(indexed===null){if(!await rebuildHistoryEventIndex(pmRoot))return{...await queryHistoryEventStreams(pmRoot,query),source:"authoritative_history"};indexed=await queryHistoryEventIndex(pmRoot,query)}if(indexed===null)throw new PmCliError("Mutation event index could not be opened after rebuild.",EXIT_CODE.GENERIC_FAILURE,{code:"event_index_unavailable"});return{...indexed,source:"derived_index"}}function resolveMutationEventCursorMode(value){const cursorMode=value??"batch";if(cursorMode!=="batch"&&cursorMode!=="row")throw new PmCliError("Mutation event cursor mode must be batch or row.",EXIT_CODE.USAGE,{code:"invalid_event_cursor_mode"});return cursorMode}async function listMutationEvents(options={}){const pmRoot=resolvePmRoot(options.cwd??process.cwd(),options.pmRoot);await assertInitializedTracker(pmRoot);const requestedLimit=parseMutationEventLimit(options.limit),cursorMode=resolveMutationEventCursorMode(options.cursorMode);if(options.full===!0&&options.provenance===!0)throw new PmCliError("Mutation event projections are mutually exclusive. Use --provenance or --full.",EXIT_CODE.USAGE);const settings=await readSettings(pmRoot),vocabulary=settings.agent_identity.identity_vocabulary,dimensions=resolveHistoryProvenanceDimensions(settings.agent_identity.harness_signals),provenancePredicates=parseHistoryProvenanceFilters({provenance:options.provenanceFilter},dimensions),harnesses=normalizeFilter(options.harness),fingerprint=eventQueryFingerprint(options),{cursor,sinceTimestamp}=resolveMutationEventStart(options.since,fingerprint),query={...cursor?{after_ts:cursor.ts,after_stream_id:cursor.stream_id,after_stream_offset:cursor.stream_offset}:sinceTimestamp?{since_ts:sinceTimestamp}:{},ops:normalizeFilter(options.type),authors:normalizeFilter(options.author),harnesses,harness_alias_authors:harnesses?Object.entries(vocabulary.aliases).filter(([,harness])=>harnesses.includes(harness)).map(([author])=>author):void 0,agent_instances:normalizeFilter(options.agentInstance),provenance:[...provenancePredicates].map(([dimension,values])=>({dimension,values:[...values]})),stream_ids:normalizeFilter(options.item),limit:requestedLimit},indexed=await resolveIndexedMutationEvents(pmRoot,query),events=indexed.events.map(event=>({...cursorMode==="row"?{cursor:encodeMutationEventCursor(event,fingerprint)}:{},item_id:event.stream_id,version:event.stream_offset+1,ts:event.entry.ts,author:event.entry.author,type:event.entry.op,...event.entry.message===void 0?{}:{message:event.entry.message},patch_count:event.entry.patch.length,...options.full===!0?{entry:event.entry}:{},...options.provenance===!0?{provenance:projectHistoryProvenance(event.entry,vocabulary,{itemId:event.stream_id,version:event.stream_offset+1})}:{}}));return{events,count:events.length,has_more:indexed.has_more,cursor_mode:cursorMode,...indexed.events.length===0?{}:{next_cursor:encodeMutationEventCursor(indexed.events[indexed.events.length-1],fingerprint)},source:indexed.source,...options.provenanceSummary===!0?{provenance_summary:summarizeHistoryProvenance(indexed.events.map(event=>event.entry),vocabulary,dimensions)}:{}}}async function*subscribeMutationEventBatches(options={}){const intervalMs=options.intervalMs??DEFAULT_FOLLOW_INTERVAL_MS;if(!Number.isSafeInteger(intervalMs)||intervalMs<10)throw new PmCliError("Mutation event follow interval must be an integer of at least 10ms.",EXIT_CODE.USAGE,{code:"invalid_event_follow_interval"});let cursor=options.since;for(;options.signal?.aborted!==!0;){const page=await listMutationEvents({...options,cursorMode:options.cursorMode??"batch",since:cursor});if(yield page.next_cursor===void 0&&cursor!==void 0?{...page,next_cursor:cursor}:page,page.events.length>0){cursor=page.next_cursor;continue}try{await delay(intervalMs,void 0,{signal:options.signal})}catch(error){if(isAbortError(error))return;throw error}}}async function*subscribeMutationEvents(options={}){for await(const page of subscribeMutationEventBatches({...options,cursorMode:"row"}))for(const event of page.events)yield event}const _testOnlyMutationEvents={decodeMutationEventCursor,encodeMutationEventCursor,eventQueryFingerprint,isAbortError,isMutationEventCursorEnvelope,parseMutationEventLimit,resolveMutationEventStart};export{MUTATION_EVENT_WIRE_BUDGET,_testOnlyMutationEvents,listMutationEvents,subscribeMutationEventBatches,subscribeMutationEvents};
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]="62e71554-f62d-55c5-811c-198f573d9426")}catch{}})();import{assertInitializedTracker}from"./environment/tracker-preflight.js";import{createHash}from"node:crypto";import{setTimeout as delay}from"node:timers/promises";import{readHistoryEventIndexPage,queryHistoryEventStreams,rebuildHistoryEventIndex}from"../core/history/event-index.js";import{EXIT_CODE}from"../core/shared/constants.js";import{PmCliError}from"../core/shared/errors.js";import{stableStringify}from"../core/shared/serialization.js";import{toErrorMessage}from"../core/shared/primitives.js";import{resolvePmRoot}from"../core/store/paths.js";import{readSettings}from"../core/store/settings.js";import{parseHistoryProvenanceFilters,projectHistoryProvenance,resolveHistoryProvenanceDimensions,summarizeHistoryProvenance}from"./history-provenance.js";const MUTATION_EVENT_CURSOR_VERSION=1,MUTATION_EVENT_CURSOR_PATTERN=/^[A-Za-z0-9_-]+$/,DEFAULT_EVENT_LIMIT=100,MAX_EVENT_LIMIT=1e3,DEFAULT_FOLLOW_INTERVAL_MS=250,MUTATION_EVENT_WIRE_BUDGET=Object.freeze({batch_to_row_ratio:.6,fixture_events:200});function normalizeFilter(value){if(value===void 0)return;const values=typeof value=="string"?[value]:value,normalized=[...new Set(values.flatMap(entry=>entry.split(",")).map(entry=>entry.trim()).filter(Boolean))].sort((left,right)=>left.localeCompare(right));return normalized.length===0?void 0:normalized}function eventQueryFingerprint(options){return createHash("sha256").update(stableStringify({type:normalizeFilter(options.type),author:normalizeFilter(options.author),item:normalizeFilter(options.item),harness:normalizeFilter(options.harness),agent_instance:normalizeFilter(options.agentInstance),provenance:normalizeFilter(options.provenanceFilter)})).digest("hex").slice(0,24)}function encodeMutationEventCursor(event,fingerprint){const envelope={version:MUTATION_EVENT_CURSOR_VERSION,fingerprint,ts:event.entry.ts,stream_id:event.stream_id,stream_offset:event.stream_offset};return Buffer.from(JSON.stringify(envelope),"utf8").toString("base64url")}function isMutationEventCursorEnvelope(value,fingerprint){if(typeof value!="object"||value===null)return!1;const candidate=value;return[candidate.version===MUTATION_EVENT_CURSOR_VERSION,candidate.fingerprint===fingerprint,typeof candidate.ts=="string",typeof candidate.stream_id=="string",typeof candidate.stream_offset=="number",Number.isSafeInteger(candidate.stream_offset),Number(candidate.stream_offset)>=0].every(Boolean)}function decodeMutationEventCursor(cursor,fingerprint){const normalized=cursor.trim();if(normalized.length===0||normalized.length>4096||!MUTATION_EVENT_CURSOR_PATTERN.test(normalized))throw new PmCliError("Invalid mutation event cursor.",EXIT_CODE.USAGE,{code:"invalid_event_cursor"});let parsed;try{parsed=JSON.parse(Buffer.from(normalized,"base64url").toString("utf8"))}catch{throw new PmCliError("Invalid mutation event cursor.",EXIT_CODE.USAGE,{code:"invalid_event_cursor"})}if(!isMutationEventCursorEnvelope(parsed,fingerprint))throw new PmCliError("Mutation event cursor does not match this query.",EXIT_CODE.USAGE,{code:"event_cursor_query_mismatch"});return parsed}function parseMutationEventLimit(value){const limit=value??DEFAULT_EVENT_LIMIT;if(!Number.isSafeInteger(limit)||limit<0||limit>MAX_EVENT_LIMIT)throw new PmCliError(`Mutation event limit must be an integer from 0 to ${MAX_EVENT_LIMIT}.`,EXIT_CODE.USAGE,{code:"invalid_event_limit"});return limit}function isAbortError(error){return error instanceof Error&&error.name==="AbortError"}function resolveMutationEventStart(sinceValue,fingerprint){const since=sinceValue?.trim();if(!since)return{};if(MUTATION_EVENT_CURSOR_PATTERN.test(since))return{cursor:decodeMutationEventCursor(since,fingerprint)};const milliseconds=Date.parse(since);if(!Number.isFinite(milliseconds))throw new PmCliError("Mutation event --since must be an event cursor or ISO timestamp.",EXIT_CODE.USAGE,{code:"invalid_event_since"});return{sinceTimestamp:new Date(milliseconds).toISOString()}}async function resolveIndexedMutationEvents(pmRoot,query){const attempt=await readHistoryEventIndexPage(pmRoot,query);let indexed=attempt.result;if(indexed===null&&attempt.repair_needed)try{await rebuildHistoryEventIndex(pmRoot,{lockWaitMs:0})&&(indexed=(await readHistoryEventIndexPage(pmRoot,query)).result)}catch{}if(indexed===null)try{return{...await queryHistoryEventStreams(pmRoot,query),source:"authoritative_history"}}catch(error){throw error instanceof PmCliError?error:new PmCliError("Mutation events are unavailable because authoritative history could not be read.",EXIT_CODE.GENERIC_FAILURE,{code:"event_index_unavailable",why:toErrorMessage(error)})}return{...indexed,source:"derived_index"}}function resolveMutationEventCursorMode(value){const cursorMode=value??"batch";if(cursorMode!=="batch"&&cursorMode!=="row")throw new PmCliError("Mutation event cursor mode must be batch or row.",EXIT_CODE.USAGE,{code:"invalid_event_cursor_mode"});return cursorMode}async function listMutationEvents(options={}){const pmRoot=resolvePmRoot(options.cwd??process.cwd(),options.pmRoot);await assertInitializedTracker(pmRoot);const requestedLimit=parseMutationEventLimit(options.limit),cursorMode=resolveMutationEventCursorMode(options.cursorMode);if(options.full===!0&&options.provenance===!0)throw new PmCliError("Mutation event projections are mutually exclusive. Use --provenance or --full.",EXIT_CODE.USAGE);const settings=await readSettings(pmRoot),vocabulary=settings.agent_identity.identity_vocabulary,dimensions=resolveHistoryProvenanceDimensions(settings.agent_identity.harness_signals),provenancePredicates=parseHistoryProvenanceFilters({provenance:options.provenanceFilter},dimensions),harnesses=normalizeFilter(options.harness),fingerprint=eventQueryFingerprint(options),{cursor,sinceTimestamp}=resolveMutationEventStart(options.since,fingerprint),query={...cursor?{after_ts:cursor.ts,after_stream_id:cursor.stream_id,after_stream_offset:cursor.stream_offset}:sinceTimestamp?{since_ts:sinceTimestamp}:{},ops:normalizeFilter(options.type),authors:normalizeFilter(options.author),harnesses,harness_alias_authors:harnesses?Object.entries(vocabulary.aliases).filter(([,harness])=>harnesses.includes(harness)).map(([author])=>author):void 0,agent_instances:normalizeFilter(options.agentInstance),provenance:[...provenancePredicates].map(([dimension,values])=>({dimension,values:[...values]})),stream_ids:normalizeFilter(options.item),limit:requestedLimit},indexed=await resolveIndexedMutationEvents(pmRoot,query),events=indexed.events.map(event=>({...cursorMode==="row"?{cursor:encodeMutationEventCursor(event,fingerprint)}:{},item_id:event.stream_id,version:event.stream_offset+1,ts:event.entry.ts,author:event.entry.author,type:event.entry.op,...event.entry.message===void 0?{}:{message:event.entry.message},patch_count:event.entry.patch.length,...options.full===!0?{entry:event.entry}:{},...options.provenance===!0?{provenance:projectHistoryProvenance(event.entry,vocabulary,{itemId:event.stream_id,version:event.stream_offset+1})}:{}}));return{events,count:events.length,has_more:indexed.has_more,cursor_mode:cursorMode,...indexed.events.length===0?{}:{next_cursor:encodeMutationEventCursor(indexed.events[indexed.events.length-1],fingerprint)},source:indexed.source,...options.provenanceSummary===!0?{provenance_summary:summarizeHistoryProvenance(indexed.events.map(event=>event.entry),vocabulary,dimensions)}:{}}}async function*subscribeMutationEventBatches(options={}){const intervalMs=options.intervalMs??DEFAULT_FOLLOW_INTERVAL_MS;if(!Number.isSafeInteger(intervalMs)||intervalMs<10)throw new PmCliError("Mutation event follow interval must be an integer of at least 10ms.",EXIT_CODE.USAGE,{code:"invalid_event_follow_interval"});let cursor=options.since;for(;options.signal?.aborted!==!0;){const page=await listMutationEvents({...options,cursorMode:options.cursorMode??"batch",since:cursor});if(yield page.next_cursor===void 0&&cursor!==void 0?{...page,next_cursor:cursor}:page,page.events.length>0){cursor=page.next_cursor;continue}try{await delay(intervalMs,void 0,{signal:options.signal})}catch(error){if(isAbortError(error))return;throw error}}}async function*subscribeMutationEvents(options={}){for await(const page of subscribeMutationEventBatches({...options,cursorMode:"row"}))for(const event of page.events)yield event}const _testOnlyMutationEvents={decodeMutationEventCursor,encodeMutationEventCursor,eventQueryFingerprint,isAbortError,isMutationEventCursorEnvelope,parseMutationEventLimit,resolveMutationEventStart};export{MUTATION_EVENT_WIRE_BUDGET,_testOnlyMutationEvents,listMutationEvents,subscribeMutationEventBatches,subscribeMutationEvents};
2
2
  //# sourceMappingURL=mutation-events.js.map