@unbrained/pm-cli 2026.5.6 → 2026.5.11

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 (268) hide show
  1. package/.agents/pm/extensions/.managed-extensions.json +2 -2
  2. package/.agents/pm/extensions/beads/runtime.js +4 -4
  3. package/.agents/pm/extensions/beads/runtime.ts +5 -5
  4. package/.agents/pm/extensions/todos/runtime.js +7 -7
  5. package/.agents/pm/extensions/todos/runtime.ts +10 -10
  6. package/.agents/skills/HARNESS_COMPATIBILITY.md +45 -0
  7. package/.agents/skills/README.md +21 -0
  8. package/.agents/skills/pm-developer/SKILL.md +73 -0
  9. package/.agents/skills/pm-developer/references/COMMAND_PLAYBOOK.md +48 -0
  10. package/.agents/skills/pm-developer/references/PROMPTS.md +17 -0
  11. package/.agents/skills/pm-extensions/SKILL.md +57 -0
  12. package/.agents/skills/pm-extensions/references/LIFECYCLE.md +40 -0
  13. package/.agents/skills/pm-extensions/references/TROUBLESHOOTING.md +25 -0
  14. package/.agents/skills/pm-sdk/SKILL.md +50 -0
  15. package/.agents/skills/pm-sdk/references/INTEGRATION_CHECKLIST.md +31 -0
  16. package/.agents/skills/pm-sdk/references/PROMPTS.md +13 -0
  17. package/.agents/skills/pm-user/SKILL.md +59 -0
  18. package/.agents/skills/pm-user/references/PROMPTS.md +17 -0
  19. package/.agents/skills/pm-user/references/WORKFLOWS.md +35 -0
  20. package/.claude-plugin/marketplace.json +38 -0
  21. package/.pi/README.md +35 -0
  22. package/.pi/agents/pm-triage-agent.md +19 -0
  23. package/.pi/agents/pm-verification-agent.md +21 -0
  24. package/.pi/chains/pm-native-delivery.chain.md +11 -0
  25. package/.pi/extensions/pm-cli/index.js +387 -0
  26. package/.pi/prompts/pm-workflow.md +5 -0
  27. package/.pi/skills/pm-native/SKILL.md +44 -0
  28. package/.pi/skills/pm-release/SKILL.md +35 -0
  29. package/AGENTS.md +1 -1
  30. package/CHANGELOG.md +13 -0
  31. package/PRD.md +16 -16
  32. package/README.md +30 -4
  33. package/dist/cli/argv-utils.d.ts +5 -0
  34. package/dist/cli/argv-utils.js +34 -0
  35. package/dist/cli/argv-utils.js.map +1 -0
  36. package/dist/cli/bootstrap-args.d.ts +15 -0
  37. package/dist/cli/bootstrap-args.js +211 -0
  38. package/dist/cli/bootstrap-args.js.map +1 -1
  39. package/dist/cli/commander-usage.js +109 -3
  40. package/dist/cli/commander-usage.js.map +1 -1
  41. package/dist/cli/commands/claim.js +6 -6
  42. package/dist/cli/commands/claim.js.map +1 -1
  43. package/dist/cli/commands/close.js +9 -9
  44. package/dist/cli/commands/close.js.map +1 -1
  45. package/dist/cli/commands/comments.d.ts +2 -0
  46. package/dist/cli/commands/comments.js +57 -8
  47. package/dist/cli/commands/comments.js.map +1 -1
  48. package/dist/cli/commands/completion.js +40 -7
  49. package/dist/cli/commands/completion.js.map +1 -1
  50. package/dist/cli/commands/config.js +6 -3
  51. package/dist/cli/commands/config.js.map +1 -1
  52. package/dist/cli/commands/contracts.d.ts +19 -0
  53. package/dist/cli/commands/contracts.js +36 -1
  54. package/dist/cli/commands/contracts.js.map +1 -1
  55. package/dist/cli/commands/create.d.ts +2 -2
  56. package/dist/cli/commands/create.js +116 -55
  57. package/dist/cli/commands/create.js.map +1 -1
  58. package/dist/cli/commands/docs.js +13 -6
  59. package/dist/cli/commands/docs.js.map +1 -1
  60. package/dist/cli/commands/extension.d.ts +3 -1
  61. package/dist/cli/commands/extension.js +174 -2
  62. package/dist/cli/commands/extension.js.map +1 -1
  63. package/dist/cli/commands/files.js +19 -12
  64. package/dist/cli/commands/files.js.map +1 -1
  65. package/dist/cli/commands/get.js +5 -5
  66. package/dist/cli/commands/get.js.map +1 -1
  67. package/dist/cli/commands/guide.d.ts +55 -0
  68. package/dist/cli/commands/guide.js +260 -0
  69. package/dist/cli/commands/guide.js.map +1 -0
  70. package/dist/cli/commands/health.js +1 -1
  71. package/dist/cli/commands/health.js.map +1 -1
  72. package/dist/cli/commands/history.js +30 -10
  73. package/dist/cli/commands/history.js.map +1 -1
  74. package/dist/cli/commands/index.d.ts +1 -0
  75. package/dist/cli/commands/index.js +1 -0
  76. package/dist/cli/commands/index.js.map +1 -1
  77. package/dist/cli/commands/init.d.ts +2 -0
  78. package/dist/cli/commands/init.js +21 -1
  79. package/dist/cli/commands/init.js.map +1 -1
  80. package/dist/cli/commands/learnings.js +3 -3
  81. package/dist/cli/commands/learnings.js.map +1 -1
  82. package/dist/cli/commands/metadata-normalizers.d.ts +4 -0
  83. package/dist/cli/commands/metadata-normalizers.js +37 -0
  84. package/dist/cli/commands/metadata-normalizers.js.map +1 -0
  85. package/dist/cli/commands/notes.js +3 -3
  86. package/dist/cli/commands/notes.js.map +1 -1
  87. package/dist/cli/commands/reindex.js +180 -156
  88. package/dist/cli/commands/reindex.js.map +1 -1
  89. package/dist/cli/commands/restore.d.ts +2 -2
  90. package/dist/cli/commands/restore.js +44 -24
  91. package/dist/cli/commands/restore.js.map +1 -1
  92. package/dist/cli/commands/search.d.ts +2 -0
  93. package/dist/cli/commands/search.js +45 -26
  94. package/dist/cli/commands/search.js.map +1 -1
  95. package/dist/cli/commands/test-all.d.ts +2 -0
  96. package/dist/cli/commands/test-all.js +2 -0
  97. package/dist/cli/commands/test-all.js.map +1 -1
  98. package/dist/cli/commands/test.d.ts +1 -0
  99. package/dist/cli/commands/test.js +13 -5
  100. package/dist/cli/commands/test.js.map +1 -1
  101. package/dist/cli/commands/update.js +188 -157
  102. package/dist/cli/commands/update.js.map +1 -1
  103. package/dist/cli/commands/validate.js +1 -1
  104. package/dist/cli/commands/validate.js.map +1 -1
  105. package/dist/cli/error-guidance.d.ts +9 -1
  106. package/dist/cli/error-guidance.js +147 -6
  107. package/dist/cli/error-guidance.js.map +1 -1
  108. package/dist/cli/guide-topics.d.ts +25 -0
  109. package/dist/cli/guide-topics.js +283 -0
  110. package/dist/cli/guide-topics.js.map +1 -0
  111. package/dist/cli/help-content.js +25 -1
  112. package/dist/cli/help-content.js.map +1 -1
  113. package/dist/cli/help-json-payload.js +11 -1
  114. package/dist/cli/help-json-payload.js.map +1 -1
  115. package/dist/cli/main.js +69 -6
  116. package/dist/cli/main.js.map +1 -1
  117. package/dist/cli/register-list-query.js +38 -1
  118. package/dist/cli/register-list-query.js.map +1 -1
  119. package/dist/cli/register-mutation.js +17 -4
  120. package/dist/cli/register-mutation.js.map +1 -1
  121. package/dist/cli/register-setup.js +15 -1
  122. package/dist/cli/register-setup.js.map +1 -1
  123. package/dist/cli/telemetry-flush.d.ts +2 -0
  124. package/dist/cli/telemetry-flush.js +4 -0
  125. package/dist/cli/telemetry-flush.js.map +1 -0
  126. package/dist/cli.js +1 -2
  127. package/dist/cli.js.map +1 -1
  128. package/dist/core/extensions/extension-types.d.ts +72 -0
  129. package/dist/core/extensions/extension-types.js +24 -0
  130. package/dist/core/extensions/extension-types.js.map +1 -1
  131. package/dist/core/extensions/loader.d.ts +1 -0
  132. package/dist/core/extensions/loader.js +766 -7
  133. package/dist/core/extensions/loader.js.map +1 -1
  134. package/dist/core/history/history.js +32 -11
  135. package/dist/core/history/history.js.map +1 -1
  136. package/dist/core/item/item-format.d.ts +2 -2
  137. package/dist/core/item/item-format.js +16 -16
  138. package/dist/core/item/item-format.js.map +1 -1
  139. package/dist/core/lock/lock.js +2 -0
  140. package/dist/core/lock/lock.js.map +1 -1
  141. package/dist/core/schema/runtime-field-filters.js +1 -1
  142. package/dist/core/schema/runtime-field-filters.js.map +1 -1
  143. package/dist/core/schema/runtime-field-values.js +2 -2
  144. package/dist/core/schema/runtime-field-values.js.map +1 -1
  145. package/dist/core/schema/runtime-schema.d.ts +1 -1
  146. package/dist/core/schema/runtime-schema.js +3 -3
  147. package/dist/core/schema/runtime-schema.js.map +1 -1
  148. package/dist/core/search/cache.js +7 -21
  149. package/dist/core/search/cache.js.map +1 -1
  150. package/dist/core/search/corpus.d.ts +13 -0
  151. package/dist/core/search/corpus.js +74 -0
  152. package/dist/core/search/corpus.js.map +1 -0
  153. package/dist/core/search/embedding-batches.js +90 -30
  154. package/dist/core/search/embedding-batches.js.map +1 -1
  155. package/dist/core/sentry/instrument.d.ts +18 -1
  156. package/dist/core/sentry/instrument.js +128 -12
  157. package/dist/core/sentry/instrument.js.map +1 -1
  158. package/dist/core/shared/constants.d.ts +1 -1
  159. package/dist/core/shared/constants.js +21 -1
  160. package/dist/core/shared/constants.js.map +1 -1
  161. package/dist/core/shared/errors.d.ts +8 -0
  162. package/dist/core/shared/errors.js.map +1 -1
  163. package/dist/core/shared/levenshtein.d.ts +1 -0
  164. package/dist/core/shared/levenshtein.js +37 -0
  165. package/dist/core/shared/levenshtein.js.map +1 -0
  166. package/dist/core/store/front-matter-cache.d.ts +1 -1
  167. package/dist/core/store/front-matter-cache.js +13 -13
  168. package/dist/core/store/front-matter-cache.js.map +1 -1
  169. package/dist/core/store/item-format-migration.js +5 -2
  170. package/dist/core/store/item-format-migration.js.map +1 -1
  171. package/dist/core/store/item-store.js +16 -15
  172. package/dist/core/store/item-store.js.map +1 -1
  173. package/dist/core/store/paths.js +35 -2
  174. package/dist/core/store/paths.js.map +1 -1
  175. package/dist/core/store/settings.js +216 -2
  176. package/dist/core/store/settings.js.map +1 -1
  177. package/dist/core/telemetry/runtime.d.ts +1 -0
  178. package/dist/core/telemetry/runtime.js +102 -3
  179. package/dist/core/telemetry/runtime.js.map +1 -1
  180. package/dist/core/test/item-test-run-tracking.js +2 -2
  181. package/dist/core/test/item-test-run-tracking.js.map +1 -1
  182. package/dist/mcp/server.d.ts +2 -0
  183. package/dist/mcp/server.js +407 -0
  184. package/dist/mcp/server.js.map +1 -0
  185. package/dist/pi/native.d.ts +5 -0
  186. package/dist/pi/native.js +236 -0
  187. package/dist/pi/native.js.map +1 -0
  188. package/dist/sdk/cli-contracts.d.ts +24 -2
  189. package/dist/sdk/cli-contracts.js +317 -2
  190. package/dist/sdk/cli-contracts.js.map +1 -1
  191. package/dist/sdk/index.d.ts +12 -1
  192. package/dist/sdk/index.js +8 -1
  193. package/dist/sdk/index.js.map +1 -1
  194. package/dist/types.d.ts +51 -2
  195. package/dist/types.js.map +1 -1
  196. package/docs/AGENT_GUIDE.md +15 -0
  197. package/docs/ARCHITECTURE.md +2 -2
  198. package/docs/CLAUDE_CODE_PLUGIN.md +225 -0
  199. package/docs/CODEX_PLUGIN.md +33 -0
  200. package/docs/COMMANDS.md +6 -2
  201. package/docs/CONFIGURATION.md +2 -8
  202. package/docs/EXTENSIONS.md +688 -0
  203. package/docs/MIGRATION_CLI_SIMPLIFICATION.md +64 -0
  204. package/docs/PI_PACKAGE.md +141 -0
  205. package/docs/QUICKSTART.md +1 -0
  206. package/docs/README.md +30 -1
  207. package/docs/RELEASING.md +4 -2
  208. package/docs/SDK.md +444 -2
  209. package/docs/examples/ci/github-actions-pm-extension-gate.yml +53 -0
  210. package/docs/examples/ci/gitlab-ci-pm-extension-gate.yml +41 -0
  211. package/docs/examples/ci/jenkins-pm-extension-gate.Jenkinsfile +45 -0
  212. package/docs/examples/policy-restricted-extension/README.md +74 -0
  213. package/docs/examples/policy-restricted-extension/index.js +21 -0
  214. package/docs/examples/policy-restricted-extension/manifest.json +21 -0
  215. package/docs/examples/policy-restricted-extension/package.json +8 -0
  216. package/docs/examples/sdk-app-embedding/README.md +39 -0
  217. package/docs/examples/sdk-app-embedding/package.json +9 -0
  218. package/docs/examples/sdk-app-embedding/run-embedded-pm.mjs +61 -0
  219. package/docs/examples/sdk-contract-consumer/README.md +57 -0
  220. package/docs/examples/sdk-contract-consumer/inspect-contracts.mjs +47 -0
  221. package/docs/examples/sdk-contract-consumer/package.json +10 -0
  222. package/docs/examples/starter-extension/README.md +57 -42
  223. package/docs/examples/starter-extension/manifest.json +15 -0
  224. package/marketplace.json +34 -0
  225. package/package.json +38 -4
  226. package/plugins/pm-cli-claude/.claude-plugin/plugin.json +23 -0
  227. package/plugins/pm-cli-claude/.mcp.json +12 -0
  228. package/plugins/pm-cli-claude/README.md +225 -0
  229. package/plugins/pm-cli-claude/agents/pm-coordinator.md +48 -0
  230. package/plugins/pm-cli-claude/agents/pm-delivery-chain.md +88 -0
  231. package/plugins/pm-cli-claude/agents/pm-triage-agent.md +83 -0
  232. package/plugins/pm-cli-claude/agents/pm-verification-agent.md +88 -0
  233. package/plugins/pm-cli-claude/commands/pm-audit.md +39 -0
  234. package/plugins/pm-cli-claude/commands/pm-calendar.md +41 -0
  235. package/plugins/pm-cli-claude/commands/pm-close-task.md +20 -0
  236. package/plugins/pm-cli-claude/commands/pm-developer.md +38 -0
  237. package/plugins/pm-cli-claude/commands/pm-init.md +44 -0
  238. package/plugins/pm-cli-claude/commands/pm-list.md +39 -0
  239. package/plugins/pm-cli-claude/commands/pm-new.md +36 -0
  240. package/plugins/pm-cli-claude/commands/pm-planner.md +51 -0
  241. package/plugins/pm-cli-claude/commands/pm-release.md +41 -0
  242. package/plugins/pm-cli-claude/commands/pm-search.md +21 -0
  243. package/plugins/pm-cli-claude/commands/pm-start-task.md +27 -0
  244. package/plugins/pm-cli-claude/commands/pm-status.md +15 -0
  245. package/plugins/pm-cli-claude/commands/pm-triage.md +35 -0
  246. package/plugins/pm-cli-claude/commands/pm-workflow.md +49 -0
  247. package/plugins/pm-cli-claude/hooks/hooks.json +17 -0
  248. package/plugins/pm-cli-claude/hooks/session-start.mjs +120 -0
  249. package/plugins/pm-cli-claude/scripts/pm-mcp-server.mjs +60 -0
  250. package/plugins/pm-cli-claude/skills/pm-audit/SKILL.md +88 -0
  251. package/plugins/pm-cli-claude/skills/pm-developer/SKILL.md +116 -0
  252. package/plugins/pm-cli-claude/skills/pm-planner/SKILL.md +118 -0
  253. package/plugins/pm-cli-claude/skills/pm-release/SKILL.md +83 -0
  254. package/plugins/pm-cli-claude/skills/pm-workflow/SKILL.md +148 -0
  255. package/plugins/pm-cli-codex/.codex-plugin/plugin.json +45 -0
  256. package/plugins/pm-cli-codex/.mcp.json +14 -0
  257. package/plugins/pm-cli-codex/README.md +30 -0
  258. package/plugins/pm-cli-codex/assets/pm-cli-small.svg +4 -0
  259. package/plugins/pm-cli-codex/commands/pm-audit.md +8 -0
  260. package/plugins/pm-cli-codex/commands/pm-close-task.md +9 -0
  261. package/plugins/pm-cli-codex/commands/pm-start-task.md +9 -0
  262. package/plugins/pm-cli-codex/scripts/pm-mcp-server.mjs +54 -0
  263. package/plugins/pm-cli-codex/skills/pm-auditor/SKILL.md +21 -0
  264. package/plugins/pm-cli-codex/skills/pm-auditor/agents/openai.yaml +6 -0
  265. package/plugins/pm-cli-codex/skills/pm-native/SKILL.md +57 -0
  266. package/plugins/pm-cli-codex/skills/pm-native/agents/openai.yaml +6 -0
  267. package/plugins/pm-cli-codex/skills/pm-release/SKILL.md +19 -0
  268. package/plugins/pm-cli-codex/skills/pm-release/agents/openai.yaml +6 -0
@@ -15,7 +15,8 @@ import { applyRegisteredItemFieldDefaultsAndValidation } from "../../core/extens
15
15
  import { locateItem, mutateItem } from "../../core/store/item-store.js";
16
16
  import { getSettingsPath, resolvePmRoot } from "../../core/store/paths.js";
17
17
  import { readSettings } from "../../core/store/settings.js";
18
- import { CONFIDENCE_TEXT_VALUES, DEPENDENCY_KIND_VALUES, ISSUE_SEVERITY_VALUES, RECURRENCE_FREQUENCY_VALUES, RECURRENCE_WEEKDAY_VALUES, RISK_VALUES, } from "../../types/index.js";
18
+ import { normalizeRiskInput, normalizeSeverityInput, parseConfidenceInput, parseRegressionInput, } from "./metadata-normalizers.js";
19
+ import { DEPENDENCY_KIND_VALUES, ISSUE_SEVERITY_VALUES, RECURRENCE_FREQUENCY_VALUES, RECURRENCE_WEEKDAY_VALUES, RISK_VALUES, } from "../../types/index.js";
19
20
  import { parseDocs, parseFiles, parseLogSeed, parseTests } from "./create.js";
20
21
  const LEGACY_NONE_TOKENS = new Set(["none", "null"]);
21
22
  const UPDATE_UNSET_FIELD_DEFINITIONS = [
@@ -187,6 +188,61 @@ function assertNoLegacyNoneTokens(values, flag, replacementHint) {
187
188
  const suffix = replacementHint ? ` ${replacementHint}` : "";
188
189
  throw new PmCliError(`${flag} no longer accepts "none" or "null".${suffix}`.trim(), EXIT_CODE.USAGE);
189
190
  }
191
+ const UPDATE_LEGACY_NONE_COLLECTION_NORMALIZERS = [
192
+ { optionKey: "dep", clearFlagKey: "clearDeps", valueFlag: "--dep", clearFlag: "--clear-deps", disableReplaceFlagKey: "replaceDeps" },
193
+ { optionKey: "comment", clearFlagKey: "clearComments", valueFlag: "--comment", clearFlag: "--clear-comments" },
194
+ { optionKey: "note", clearFlagKey: "clearNotes", valueFlag: "--note", clearFlag: "--clear-notes" },
195
+ { optionKey: "learning", clearFlagKey: "clearLearnings", valueFlag: "--learning", clearFlag: "--clear-learnings" },
196
+ { optionKey: "file", clearFlagKey: "clearFiles", valueFlag: "--file", clearFlag: "--clear-files" },
197
+ { optionKey: "test", clearFlagKey: "clearTests", valueFlag: "--test", clearFlag: "--clear-tests", disableReplaceFlagKey: "replaceTests" },
198
+ { optionKey: "doc", clearFlagKey: "clearDocs", valueFlag: "--doc", clearFlag: "--clear-docs" },
199
+ { optionKey: "reminder", clearFlagKey: "clearReminders", valueFlag: "--reminder", clearFlag: "--clear-reminders" },
200
+ { optionKey: "event", clearFlagKey: "clearEvents", valueFlag: "--event", clearFlag: "--clear-events" },
201
+ { optionKey: "typeOption", clearFlagKey: "clearTypeOptions", valueFlag: "--type-option", clearFlag: "--clear-type-options" },
202
+ ];
203
+ function normalizeLegacyNoneUpdateOptions(options) {
204
+ const normalized = {
205
+ ...options,
206
+ unset: options.unset ? [...options.unset] : undefined,
207
+ };
208
+ const appendUnsetTarget = (value) => {
209
+ const current = normalized.unset ? [...normalized.unset] : [];
210
+ if (!current.includes(value)) {
211
+ current.push(value);
212
+ }
213
+ normalized.unset = current;
214
+ };
215
+ const scalarOptionKeys = new Set([...UPDATE_OPTION_KEY_TO_UNSET_CANONICAL.keys(), "rank"]);
216
+ for (const optionKey of scalarOptionKeys) {
217
+ const candidate = normalized[optionKey];
218
+ if (typeof candidate !== "string" || !isLegacyNoneToken(candidate)) {
219
+ continue;
220
+ }
221
+ const canonicalUnset = optionKey === "rank" ? "order" : (UPDATE_OPTION_KEY_TO_UNSET_CANONICAL.get(optionKey) ?? optionKey);
222
+ appendUnsetTarget(canonicalUnset);
223
+ normalized[optionKey] = undefined;
224
+ }
225
+ for (const definition of UPDATE_LEGACY_NONE_COLLECTION_NORMALIZERS) {
226
+ const entries = normalized[definition.optionKey];
227
+ if (!Array.isArray(entries) || entries.length === 0) {
228
+ continue;
229
+ }
230
+ const hasLegacy = entries.some((entry) => isLegacyNoneToken(entry));
231
+ if (!hasLegacy) {
232
+ continue;
233
+ }
234
+ const concreteEntries = entries.filter((entry) => !isLegacyNoneToken(entry));
235
+ if (concreteEntries.length > 0) {
236
+ throw new PmCliError(`Cannot mix legacy clear token "none"/"null" with concrete ${definition.valueFlag} entries. Use ${definition.clearFlag} to clear or provide explicit entries.`, EXIT_CODE.USAGE);
237
+ }
238
+ normalized[definition.optionKey] = undefined;
239
+ normalized[definition.clearFlagKey] = true;
240
+ if (definition.disableReplaceFlagKey) {
241
+ normalized[definition.disableReplaceFlagKey] = false;
242
+ }
243
+ }
244
+ return normalized;
245
+ }
190
246
  function resolveRuntimeUnsetDefinition(token, runtimeFieldRegistry) {
191
247
  if (!runtimeFieldRegistry) {
192
248
  return undefined;
@@ -197,7 +253,7 @@ function resolveRuntimeUnsetDefinition(token, runtimeFieldRegistry) {
197
253
  }
198
254
  const candidates = new Set([
199
255
  definition.key,
200
- definition.front_matter_key,
256
+ definition.metadata_key,
201
257
  definition.cli_flag.replaceAll("-", "_"),
202
258
  definition.cli_flag,
203
259
  ...definition.cli_aliases.map((alias) => alias.replaceAll("-", "_")),
@@ -208,7 +264,7 @@ function resolveRuntimeUnsetDefinition(token, runtimeFieldRegistry) {
208
264
  }
209
265
  return {
210
266
  optionKey: definition.key,
211
- frontMatterKey: definition.front_matter_key,
267
+ frontMatterKey: definition.metadata_key,
212
268
  };
213
269
  }
214
270
  return undefined;
@@ -433,38 +489,6 @@ function parseStatus(value, statusRegistry) {
433
489
  }
434
490
  return normalized;
435
491
  }
436
- function normalizeRiskInput(value) {
437
- const trimmed = value.trim();
438
- return trimmed.toLowerCase() === "med" ? "medium" : trimmed;
439
- }
440
- function normalizeSeverityInput(value) {
441
- const trimmed = value.trim();
442
- return trimmed.toLowerCase() === "med" ? "medium" : trimmed;
443
- }
444
- function parseConfidenceInput(value) {
445
- const trimmed = value.trim().toLowerCase();
446
- if (trimmed === "med") {
447
- return "medium";
448
- }
449
- if (CONFIDENCE_TEXT_VALUES.includes(trimmed)) {
450
- return trimmed;
451
- }
452
- const parsed = parseOptionalNumber(value, "confidence");
453
- if (!Number.isInteger(parsed) || parsed < 0 || parsed > 100) {
454
- throw new PmCliError("Confidence must be an integer 0..100 or one of low|med|medium|high", EXIT_CODE.USAGE);
455
- }
456
- return parsed;
457
- }
458
- function parseRegressionInput(value) {
459
- const normalized = value.trim().toLowerCase();
460
- if (normalized === "true" || normalized === "1") {
461
- return true;
462
- }
463
- if (normalized === "false" || normalized === "0") {
464
- return false;
465
- }
466
- throw new PmCliError("Regression must be one of true|false|1|0", EXIT_CODE.USAGE);
467
- }
468
492
  function weekdayOrderIndex(value) {
469
493
  return RECURRENCE_WEEKDAY_VALUES.indexOf(value);
470
494
  }
@@ -554,9 +578,9 @@ function parseRecurrenceRule(kv, startAt, nowValue) {
554
578
  function parseEventEntries(raw, nowValue) {
555
579
  return raw.map((entry) => {
556
580
  const kv = parseCsvKv(entry, "--event");
557
- const startRaw = kv.start?.trim();
581
+ const startRaw = (kv.start ?? kv.date)?.trim();
558
582
  if (!startRaw) {
559
- throw new PmCliError("--event requires start=<iso|relative>", EXIT_CODE.USAGE);
583
+ throw new PmCliError("--event requires start=<iso|relative> or date=<iso|relative>", EXIT_CODE.USAGE);
560
584
  }
561
585
  const startAt = resolveIsoOrRelative(startRaw, nowValue, "event.start");
562
586
  const endRaw = kv.end?.trim();
@@ -652,17 +676,24 @@ function parseOptionalDependencyString(value) {
652
676
  const trimmed = value.trim();
653
677
  return trimmed.length > 0 ? trimmed : undefined;
654
678
  }
679
+ function looksLikeStructuredDependencyEntry(raw) {
680
+ if (raw.startsWith("```") || raw.includes("\n")) {
681
+ return true;
682
+ }
683
+ return /^(?:[-*+]\s+)?(?:id|kind|author|created_at|source_kind)\s*[:=]/i.test(raw);
684
+ }
655
685
  function parseDependencyAdditions(raw, prefix, nowIso) {
656
686
  if (!raw) {
657
687
  return { additions: [] };
658
688
  }
659
689
  assertNoLegacyNoneTokens(raw, "--dep", "Use --clear-deps to clear dependencies.");
660
690
  const additions = raw.map((entry) => {
661
- const kv = parseCsvKv(entry, "--dep");
691
+ const trimmedEntry = entry.trim();
692
+ const kv = looksLikeStructuredDependencyEntry(trimmedEntry) ? parseCsvKv(entry, "--dep") : { id: trimmedEntry, kind: "related" };
662
693
  const id = kv.id?.trim();
663
694
  const kind = kv.kind?.trim();
664
695
  if (!id || !kind) {
665
- throw new PmCliError("--dep requires id and kind", EXIT_CODE.USAGE);
696
+ throw new PmCliError("--dep requires id and kind, or a bare item id to add a related dependency", EXIT_CODE.USAGE);
666
697
  }
667
698
  if (id.toLowerCase() === "undefined") {
668
699
  throw new PmCliError(`--dep id must not use placeholder token "${id}". Use --clear-deps to clear dependencies.`, EXIT_CODE.USAGE);
@@ -857,7 +888,7 @@ function enforceUpdateOptionsByType(typeName, options, typeRegistry) {
857
888
  }
858
889
  export async function runUpdate(id, options, global) {
859
890
  const stdinResolver = createStdinTokenResolver();
860
- options = {
891
+ options = normalizeLegacyNoneUpdateOptions({
861
892
  ...options,
862
893
  body: await stdinResolver.resolveValue(options.body, "--body"),
863
894
  dep: await stdinResolver.resolveList(options.dep, "--dep"),
@@ -871,7 +902,7 @@ export async function runUpdate(id, options, global) {
871
902
  reminder: await stdinResolver.resolveList(options.reminder, "--reminder"),
872
903
  event: await stdinResolver.resolveList(options.event, "--event"),
873
904
  typeOption: await stdinResolver.resolveList(options.typeOption, "--type-option"),
874
- };
905
+ });
875
906
  const pmRoot = resolvePmRoot(process.cwd(), global.path);
876
907
  if (!(await pathExists(getSettingsPath(pmRoot)))) {
877
908
  throw new PmCliError(`Tracker is not initialized at ${pmRoot}. Run pm init first.`, EXIT_CODE.NOT_FOUND);
@@ -1187,20 +1218,20 @@ export async function runUpdate(id, options, global) {
1187
1218
  mutate(document) {
1188
1219
  const changedFields = [];
1189
1220
  const warnings = [];
1190
- let activeTypeName = resolveTypeName(document.front_matter.type, typeRegistry) ?? document.front_matter.type;
1221
+ let activeTypeName = resolveTypeName(document.metadata.type, typeRegistry) ?? document.metadata.type;
1191
1222
  if (options.title !== undefined) {
1192
- document.front_matter.title = options.title;
1223
+ document.metadata.title = options.title;
1193
1224
  changedFields.push("title");
1194
1225
  }
1195
1226
  if (options.description !== undefined) {
1196
- document.front_matter.description = options.description;
1227
+ document.metadata.description = options.description;
1197
1228
  changedFields.push("description");
1198
1229
  }
1199
1230
  if (options.body !== undefined) {
1200
1231
  document.body = options.body;
1201
1232
  changedFields.push("body");
1202
1233
  }
1203
- const previousStatus = document.front_matter.status;
1234
+ const previousStatus = document.metadata.status;
1204
1235
  const previousStatusNormalized = normalizeStatusInput(previousStatus, statusRegistry) ?? previousStatus;
1205
1236
  if (options.status !== undefined) {
1206
1237
  const status = parseStatus(options.status, statusRegistry);
@@ -1218,34 +1249,34 @@ export async function runUpdate(id, options, global) {
1218
1249
  ],
1219
1250
  });
1220
1251
  }
1221
- document.front_matter.status = status;
1252
+ document.metadata.status = status;
1222
1253
  if (status === statusRegistry.canceled_status) {
1223
- delete document.front_matter.assignee;
1254
+ delete document.metadata.assignee;
1224
1255
  }
1225
1256
  changedFields.push("status");
1226
1257
  }
1227
1258
  if (options.closeReason !== undefined || clearFrontMatterKeys.has("close_reason")) {
1228
1259
  if (clearFrontMatterKeys.has("close_reason")) {
1229
- delete document.front_matter.close_reason;
1260
+ delete document.metadata.close_reason;
1230
1261
  }
1231
1262
  else {
1232
1263
  const closeReason = options.closeReason.trim();
1233
1264
  if (closeReason.length === 0) {
1234
1265
  throw new PmCliError("--close-reason must not be empty", EXIT_CODE.USAGE);
1235
1266
  }
1236
- document.front_matter.close_reason = closeReason;
1267
+ document.metadata.close_reason = closeReason;
1237
1268
  }
1238
1269
  changedFields.push("close_reason");
1239
1270
  }
1240
1271
  else if (options.status !== undefined &&
1241
1272
  previousStatusNormalized === statusRegistry.close_status &&
1242
- document.front_matter.status !== statusRegistry.canceled_status &&
1243
- document.front_matter.close_reason !== undefined) {
1244
- delete document.front_matter.close_reason;
1273
+ document.metadata.status !== statusRegistry.canceled_status &&
1274
+ document.metadata.close_reason !== undefined) {
1275
+ delete document.metadata.close_reason;
1245
1276
  changedFields.push("close_reason");
1246
1277
  }
1247
1278
  if (options.priority !== undefined) {
1248
- document.front_matter.priority = ensurePriority(options.priority);
1279
+ document.metadata.priority = ensurePriority(options.priority);
1249
1280
  changedFields.push("priority");
1250
1281
  }
1251
1282
  if (options.type !== undefined) {
@@ -1253,14 +1284,14 @@ export async function runUpdate(id, options, global) {
1253
1284
  if (!resolvedTypeName) {
1254
1285
  throw new PmCliError(`Invalid type value "${options.type}". Allowed: ${typeRegistry.types.join(", ")}`, EXIT_CODE.USAGE);
1255
1286
  }
1256
- document.front_matter.type = resolvedTypeName;
1287
+ document.metadata.type = resolvedTypeName;
1257
1288
  activeTypeName = resolvedTypeName;
1258
1289
  changedFields.push("type");
1259
1290
  }
1260
1291
  enforceUpdateOptionsByType(activeTypeName, options, typeRegistry);
1261
1292
  if (options.typeOption !== undefined || clearFrontMatterKeys.has("type_options")) {
1262
1293
  if (clearFrontMatterKeys.has("type_options")) {
1263
- delete document.front_matter.type_options;
1294
+ delete document.metadata.type_options;
1264
1295
  }
1265
1296
  else {
1266
1297
  const parsedTypeOptions = parseTypeOptionEntries(options.typeOption);
@@ -1268,19 +1299,19 @@ export async function runUpdate(id, options, global) {
1268
1299
  if (validation.errors.length > 0) {
1269
1300
  throw new PmCliError(validation.errors.join("; "), EXIT_CODE.USAGE);
1270
1301
  }
1271
- document.front_matter.type_options = validation.normalized;
1302
+ document.metadata.type_options = validation.normalized;
1272
1303
  }
1273
1304
  changedFields.push("type_options");
1274
1305
  }
1275
- else if (options.type !== undefined && document.front_matter.type_options !== undefined) {
1276
- const validation = validateTypeOptions(activeTypeName, document.front_matter.type_options, typeRegistry);
1306
+ else if (options.type !== undefined && document.metadata.type_options !== undefined) {
1307
+ const validation = validateTypeOptions(activeTypeName, document.metadata.type_options, typeRegistry);
1277
1308
  if (validation.errors.length > 0) {
1278
1309
  throw new PmCliError(`Current type options are incompatible with type "${activeTypeName}". ${validation.errors.join("; ")}. Use --clear-type-options to clear them.`, EXIT_CODE.USAGE);
1279
1310
  }
1280
- document.front_matter.type_options = validation.normalized;
1311
+ document.metadata.type_options = validation.normalized;
1281
1312
  }
1282
1313
  if (options.dep !== undefined || options.depRemove !== undefined || clearFrontMatterKeys.has("dependencies")) {
1283
- let nextDependencies = clearFrontMatterKeys.has("dependencies") ? [] : [...(document.front_matter.dependencies ?? [])];
1314
+ let nextDependencies = clearFrontMatterKeys.has("dependencies") ? [] : [...(document.metadata.dependencies ?? [])];
1284
1315
  if (dependencyUpdates.additions.length > 0) {
1285
1316
  const seen = new Set(nextDependencies.map((entry) => dependencyKey(entry)));
1286
1317
  for (const addition of dependencyUpdates.additions) {
@@ -1296,46 +1327,46 @@ export async function runUpdate(id, options, global) {
1296
1327
  nextDependencies = nextDependencies.filter((entry) => !dependencyRemovals.some((selector) => matchesDependencySelector(entry, selector)));
1297
1328
  }
1298
1329
  if (nextDependencies.length === 0) {
1299
- delete document.front_matter.dependencies;
1330
+ delete document.metadata.dependencies;
1300
1331
  }
1301
1332
  else {
1302
- document.front_matter.dependencies = nextDependencies;
1333
+ document.metadata.dependencies = nextDependencies;
1303
1334
  }
1304
1335
  changedFields.push("dependencies");
1305
1336
  }
1306
1337
  if (options.comment !== undefined || clearFrontMatterKeys.has("comments")) {
1307
1338
  if (clearFrontMatterKeys.has("comments") || !commentUpdates.values || commentUpdates.values.length === 0) {
1308
- delete document.front_matter.comments;
1339
+ delete document.metadata.comments;
1309
1340
  }
1310
1341
  else {
1311
- document.front_matter.comments = [...(document.front_matter.comments ?? []), ...commentUpdates.values];
1342
+ document.metadata.comments = [...(document.metadata.comments ?? []), ...commentUpdates.values];
1312
1343
  }
1313
1344
  changedFields.push("comments");
1314
1345
  }
1315
1346
  if (options.note !== undefined || clearFrontMatterKeys.has("notes")) {
1316
1347
  if (clearFrontMatterKeys.has("notes") || !noteUpdates.values || noteUpdates.values.length === 0) {
1317
- delete document.front_matter.notes;
1348
+ delete document.metadata.notes;
1318
1349
  }
1319
1350
  else {
1320
- document.front_matter.notes = [...(document.front_matter.notes ?? []), ...noteUpdates.values];
1351
+ document.metadata.notes = [...(document.metadata.notes ?? []), ...noteUpdates.values];
1321
1352
  }
1322
1353
  changedFields.push("notes");
1323
1354
  }
1324
1355
  if (options.learning !== undefined || clearFrontMatterKeys.has("learnings")) {
1325
1356
  if (clearFrontMatterKeys.has("learnings") || !learningUpdates.values || learningUpdates.values.length === 0) {
1326
- delete document.front_matter.learnings;
1357
+ delete document.metadata.learnings;
1327
1358
  }
1328
1359
  else {
1329
- document.front_matter.learnings = [...(document.front_matter.learnings ?? []), ...learningUpdates.values];
1360
+ document.metadata.learnings = [...(document.metadata.learnings ?? []), ...learningUpdates.values];
1330
1361
  }
1331
1362
  changedFields.push("learnings");
1332
1363
  }
1333
1364
  if (options.file !== undefined || clearFrontMatterKeys.has("files")) {
1334
1365
  if (clearFrontMatterKeys.has("files") || !fileUpdates.values || fileUpdates.values.length === 0) {
1335
- delete document.front_matter.files;
1366
+ delete document.metadata.files;
1336
1367
  }
1337
1368
  else {
1338
- const nextFiles = [...(document.front_matter.files ?? [])];
1369
+ const nextFiles = [...(document.metadata.files ?? [])];
1339
1370
  const seen = new Set(nextFiles.map((entry) => fileKey(entry)));
1340
1371
  for (const entry of fileUpdates.values) {
1341
1372
  const key = fileKey(entry);
@@ -1345,14 +1376,14 @@ export async function runUpdate(id, options, global) {
1345
1376
  nextFiles.push(entry);
1346
1377
  seen.add(key);
1347
1378
  }
1348
- document.front_matter.files = nextFiles;
1379
+ document.metadata.files = nextFiles;
1349
1380
  }
1350
1381
  changedFields.push("files");
1351
1382
  }
1352
1383
  if (options.test !== undefined || clearFrontMatterKeys.has("tests")) {
1353
1384
  if (clearFrontMatterKeys.has("tests") && options.replaceTests === true) {
1354
1385
  if (!testUpdates.values || testUpdates.values.length === 0) {
1355
- delete document.front_matter.tests;
1386
+ delete document.metadata.tests;
1356
1387
  }
1357
1388
  else {
1358
1389
  const replacementTests = [];
@@ -1365,14 +1396,14 @@ export async function runUpdate(id, options, global) {
1365
1396
  replacementTests.push(entry);
1366
1397
  seen.add(key);
1367
1398
  }
1368
- document.front_matter.tests = replacementTests;
1399
+ document.metadata.tests = replacementTests;
1369
1400
  }
1370
1401
  }
1371
1402
  else if (clearFrontMatterKeys.has("tests") || !testUpdates.values || testUpdates.values.length === 0) {
1372
- delete document.front_matter.tests;
1403
+ delete document.metadata.tests;
1373
1404
  }
1374
1405
  else {
1375
- const nextTests = [...(document.front_matter.tests ?? [])];
1406
+ const nextTests = [...(document.metadata.tests ?? [])];
1376
1407
  const seen = new Set(nextTests.map((entry) => testKey(entry)));
1377
1408
  for (const entry of testUpdates.values) {
1378
1409
  const key = testKey(entry);
@@ -1382,16 +1413,16 @@ export async function runUpdate(id, options, global) {
1382
1413
  nextTests.push(entry);
1383
1414
  seen.add(key);
1384
1415
  }
1385
- document.front_matter.tests = nextTests;
1416
+ document.metadata.tests = nextTests;
1386
1417
  }
1387
1418
  changedFields.push("tests");
1388
1419
  }
1389
1420
  if (options.doc !== undefined || clearFrontMatterKeys.has("docs")) {
1390
1421
  if (clearFrontMatterKeys.has("docs") || !docUpdates.values || docUpdates.values.length === 0) {
1391
- delete document.front_matter.docs;
1422
+ delete document.metadata.docs;
1392
1423
  }
1393
1424
  else {
1394
- const nextDocs = [...(document.front_matter.docs ?? [])];
1425
+ const nextDocs = [...(document.metadata.docs ?? [])];
1395
1426
  const seen = new Set(nextDocs.map((entry) => docKey(entry)));
1396
1427
  for (const entry of docUpdates.values) {
1397
1428
  const key = docKey(entry);
@@ -1401,364 +1432,364 @@ export async function runUpdate(id, options, global) {
1401
1432
  nextDocs.push(entry);
1402
1433
  seen.add(key);
1403
1434
  }
1404
- document.front_matter.docs = nextDocs;
1435
+ document.metadata.docs = nextDocs;
1405
1436
  }
1406
1437
  changedFields.push("docs");
1407
1438
  }
1408
1439
  if (options.tags !== undefined || clearFrontMatterKeys.has("tags")) {
1409
- document.front_matter.tags = clearFrontMatterKeys.has("tags") ? [] : parseTags(options.tags);
1440
+ document.metadata.tags = clearFrontMatterKeys.has("tags") ? [] : parseTags(options.tags);
1410
1441
  changedFields.push("tags");
1411
1442
  }
1412
1443
  if (options.deadline !== undefined || clearFrontMatterKeys.has("deadline")) {
1413
1444
  if (clearFrontMatterKeys.has("deadline")) {
1414
- delete document.front_matter.deadline;
1445
+ delete document.metadata.deadline;
1415
1446
  }
1416
1447
  else {
1417
- document.front_matter.deadline = resolveIsoOrRelative(options.deadline, new Date(), "deadline");
1448
+ document.metadata.deadline = resolveIsoOrRelative(options.deadline, new Date(), "deadline");
1418
1449
  }
1419
1450
  changedFields.push("deadline");
1420
1451
  }
1421
1452
  if (options.estimatedMinutes !== undefined || clearFrontMatterKeys.has("estimated_minutes")) {
1422
1453
  if (clearFrontMatterKeys.has("estimated_minutes")) {
1423
- delete document.front_matter.estimated_minutes;
1454
+ delete document.metadata.estimated_minutes;
1424
1455
  }
1425
1456
  else {
1426
- document.front_matter.estimated_minutes = parseOptionalNumber(options.estimatedMinutes, "estimated-minutes");
1457
+ document.metadata.estimated_minutes = parseOptionalNumber(options.estimatedMinutes, "estimated-minutes");
1427
1458
  }
1428
1459
  changedFields.push("estimated_minutes");
1429
1460
  }
1430
1461
  if (options.acceptanceCriteria !== undefined || clearFrontMatterKeys.has("acceptance_criteria")) {
1431
1462
  if (clearFrontMatterKeys.has("acceptance_criteria")) {
1432
- delete document.front_matter.acceptance_criteria;
1463
+ delete document.metadata.acceptance_criteria;
1433
1464
  }
1434
1465
  else {
1435
- document.front_matter.acceptance_criteria = options.acceptanceCriteria;
1466
+ document.metadata.acceptance_criteria = options.acceptanceCriteria;
1436
1467
  }
1437
1468
  changedFields.push("acceptance_criteria");
1438
1469
  }
1439
1470
  if (options.definitionOfReady !== undefined || clearFrontMatterKeys.has("definition_of_ready")) {
1440
1471
  if (clearFrontMatterKeys.has("definition_of_ready")) {
1441
- delete document.front_matter.definition_of_ready;
1472
+ delete document.metadata.definition_of_ready;
1442
1473
  }
1443
1474
  else {
1444
- document.front_matter.definition_of_ready = options.definitionOfReady.trim();
1475
+ document.metadata.definition_of_ready = options.definitionOfReady.trim();
1445
1476
  }
1446
1477
  changedFields.push("definition_of_ready");
1447
1478
  }
1448
1479
  const orderRaw = options.order ?? options.rank;
1449
1480
  if (orderRaw !== undefined || clearFrontMatterKeys.has("order")) {
1450
1481
  if (clearFrontMatterKeys.has("order")) {
1451
- delete document.front_matter.order;
1482
+ delete document.metadata.order;
1452
1483
  }
1453
1484
  else {
1454
1485
  const parsedOrder = parseOptionalNumber(orderRaw, "order");
1455
1486
  if (!Number.isInteger(parsedOrder)) {
1456
1487
  throw new PmCliError("Order must be an integer", EXIT_CODE.USAGE);
1457
1488
  }
1458
- document.front_matter.order = parsedOrder;
1489
+ document.metadata.order = parsedOrder;
1459
1490
  }
1460
1491
  changedFields.push("order");
1461
1492
  }
1462
1493
  if (options.goal !== undefined || clearFrontMatterKeys.has("goal")) {
1463
1494
  if (clearFrontMatterKeys.has("goal")) {
1464
- delete document.front_matter.goal;
1495
+ delete document.metadata.goal;
1465
1496
  }
1466
1497
  else {
1467
- document.front_matter.goal = options.goal.trim();
1498
+ document.metadata.goal = options.goal.trim();
1468
1499
  }
1469
1500
  changedFields.push("goal");
1470
1501
  }
1471
1502
  if (options.objective !== undefined || clearFrontMatterKeys.has("objective")) {
1472
1503
  if (clearFrontMatterKeys.has("objective")) {
1473
- delete document.front_matter.objective;
1504
+ delete document.metadata.objective;
1474
1505
  }
1475
1506
  else {
1476
- document.front_matter.objective = options.objective.trim();
1507
+ document.metadata.objective = options.objective.trim();
1477
1508
  }
1478
1509
  changedFields.push("objective");
1479
1510
  }
1480
1511
  if (options.value !== undefined || clearFrontMatterKeys.has("value")) {
1481
1512
  if (clearFrontMatterKeys.has("value")) {
1482
- delete document.front_matter.value;
1513
+ delete document.metadata.value;
1483
1514
  }
1484
1515
  else {
1485
- document.front_matter.value = options.value.trim();
1516
+ document.metadata.value = options.value.trim();
1486
1517
  }
1487
1518
  changedFields.push("value");
1488
1519
  }
1489
1520
  if (options.impact !== undefined || clearFrontMatterKeys.has("impact")) {
1490
1521
  if (clearFrontMatterKeys.has("impact")) {
1491
- delete document.front_matter.impact;
1522
+ delete document.metadata.impact;
1492
1523
  }
1493
1524
  else {
1494
- document.front_matter.impact = options.impact.trim();
1525
+ document.metadata.impact = options.impact.trim();
1495
1526
  }
1496
1527
  changedFields.push("impact");
1497
1528
  }
1498
1529
  if (options.outcome !== undefined || clearFrontMatterKeys.has("outcome")) {
1499
1530
  if (clearFrontMatterKeys.has("outcome")) {
1500
- delete document.front_matter.outcome;
1531
+ delete document.metadata.outcome;
1501
1532
  }
1502
1533
  else {
1503
- document.front_matter.outcome = options.outcome.trim();
1534
+ document.metadata.outcome = options.outcome.trim();
1504
1535
  }
1505
1536
  changedFields.push("outcome");
1506
1537
  }
1507
1538
  if (options.whyNow !== undefined || clearFrontMatterKeys.has("why_now")) {
1508
1539
  if (clearFrontMatterKeys.has("why_now")) {
1509
- delete document.front_matter.why_now;
1540
+ delete document.metadata.why_now;
1510
1541
  }
1511
1542
  else {
1512
- document.front_matter.why_now = options.whyNow.trim();
1543
+ document.metadata.why_now = options.whyNow.trim();
1513
1544
  }
1514
1545
  changedFields.push("why_now");
1515
1546
  }
1516
1547
  if (options.assignee !== undefined || clearFrontMatterKeys.has("assignee")) {
1517
1548
  if (clearFrontMatterKeys.has("assignee")) {
1518
- delete document.front_matter.assignee;
1549
+ delete document.metadata.assignee;
1519
1550
  }
1520
1551
  else {
1521
1552
  if (options.assignee.trim() === "") {
1522
1553
  throw new PmCliError("--assignee must not be empty. Use --unset assignee to clear it.", EXIT_CODE.USAGE);
1523
1554
  }
1524
- document.front_matter.assignee = options.assignee.trim();
1555
+ document.metadata.assignee = options.assignee.trim();
1525
1556
  }
1526
1557
  changedFields.push("assignee");
1527
1558
  }
1528
1559
  if (options.parent !== undefined || clearFrontMatterKeys.has("parent")) {
1529
1560
  if (clearFrontMatterKeys.has("parent")) {
1530
- delete document.front_matter.parent;
1561
+ delete document.metadata.parent;
1531
1562
  }
1532
1563
  else {
1533
- document.front_matter.parent = resolvedParentValue;
1564
+ document.metadata.parent = resolvedParentValue;
1534
1565
  }
1535
1566
  changedFields.push("parent");
1536
1567
  }
1537
1568
  if (options.reviewer !== undefined || clearFrontMatterKeys.has("reviewer")) {
1538
1569
  if (clearFrontMatterKeys.has("reviewer")) {
1539
- delete document.front_matter.reviewer;
1570
+ delete document.metadata.reviewer;
1540
1571
  }
1541
1572
  else {
1542
- document.front_matter.reviewer = options.reviewer.trim();
1573
+ document.metadata.reviewer = options.reviewer.trim();
1543
1574
  }
1544
1575
  changedFields.push("reviewer");
1545
1576
  }
1546
1577
  if (options.risk !== undefined || clearFrontMatterKeys.has("risk")) {
1547
1578
  if (clearFrontMatterKeys.has("risk")) {
1548
- delete document.front_matter.risk;
1579
+ delete document.metadata.risk;
1549
1580
  }
1550
1581
  else {
1551
- document.front_matter.risk = ensureEnum(normalizeRiskInput(options.risk), RISK_VALUES, "risk");
1582
+ document.metadata.risk = ensureEnum(normalizeRiskInput(options.risk), RISK_VALUES, "risk");
1552
1583
  }
1553
1584
  changedFields.push("risk");
1554
1585
  }
1555
1586
  if (options.confidence !== undefined || clearFrontMatterKeys.has("confidence")) {
1556
1587
  if (clearFrontMatterKeys.has("confidence")) {
1557
- delete document.front_matter.confidence;
1588
+ delete document.metadata.confidence;
1558
1589
  }
1559
1590
  else {
1560
- document.front_matter.confidence = parseConfidenceInput(options.confidence);
1591
+ document.metadata.confidence = parseConfidenceInput(options.confidence);
1561
1592
  }
1562
1593
  changedFields.push("confidence");
1563
1594
  }
1564
1595
  if (options.sprint !== undefined || clearFrontMatterKeys.has("sprint")) {
1565
1596
  if (clearFrontMatterKeys.has("sprint")) {
1566
- delete document.front_matter.sprint;
1597
+ delete document.metadata.sprint;
1567
1598
  }
1568
1599
  else {
1569
1600
  const sprintValidation = validateSprintOrReleaseValue("sprint", options.sprint, sprintReleasePolicy);
1570
- document.front_matter.sprint = sprintValidation.value;
1601
+ document.metadata.sprint = sprintValidation.value;
1571
1602
  warnings.push(...sprintValidation.warnings);
1572
1603
  }
1573
1604
  changedFields.push("sprint");
1574
1605
  }
1575
1606
  if (options.release !== undefined || clearFrontMatterKeys.has("release")) {
1576
1607
  if (clearFrontMatterKeys.has("release")) {
1577
- delete document.front_matter.release;
1608
+ delete document.metadata.release;
1578
1609
  }
1579
1610
  else {
1580
1611
  const releaseValidation = validateSprintOrReleaseValue("release", options.release, sprintReleasePolicy);
1581
- document.front_matter.release = releaseValidation.value;
1612
+ document.metadata.release = releaseValidation.value;
1582
1613
  warnings.push(...releaseValidation.warnings);
1583
1614
  }
1584
1615
  changedFields.push("release");
1585
1616
  }
1586
1617
  if (options.blockedBy !== undefined || clearFrontMatterKeys.has("blocked_by")) {
1587
1618
  if (clearFrontMatterKeys.has("blocked_by")) {
1588
- delete document.front_matter.blocked_by;
1619
+ delete document.metadata.blocked_by;
1589
1620
  }
1590
1621
  else {
1591
- document.front_matter.blocked_by = options.blockedBy.trim();
1622
+ document.metadata.blocked_by = options.blockedBy.trim();
1592
1623
  }
1593
1624
  changedFields.push("blocked_by");
1594
1625
  }
1595
1626
  if (options.blockedReason !== undefined || clearFrontMatterKeys.has("blocked_reason")) {
1596
1627
  if (clearFrontMatterKeys.has("blocked_reason")) {
1597
- delete document.front_matter.blocked_reason;
1628
+ delete document.metadata.blocked_reason;
1598
1629
  }
1599
1630
  else {
1600
- document.front_matter.blocked_reason = options.blockedReason.trim();
1631
+ document.metadata.blocked_reason = options.blockedReason.trim();
1601
1632
  }
1602
1633
  changedFields.push("blocked_reason");
1603
1634
  }
1604
1635
  if (options.unblockNote !== undefined || clearFrontMatterKeys.has("unblock_note")) {
1605
1636
  if (clearFrontMatterKeys.has("unblock_note")) {
1606
- delete document.front_matter.unblock_note;
1637
+ delete document.metadata.unblock_note;
1607
1638
  }
1608
1639
  else {
1609
- document.front_matter.unblock_note = options.unblockNote.trim();
1640
+ document.metadata.unblock_note = options.unblockNote.trim();
1610
1641
  }
1611
1642
  changedFields.push("unblock_note");
1612
1643
  }
1613
1644
  if (options.reporter !== undefined || clearFrontMatterKeys.has("reporter")) {
1614
1645
  if (clearFrontMatterKeys.has("reporter")) {
1615
- delete document.front_matter.reporter;
1646
+ delete document.metadata.reporter;
1616
1647
  }
1617
1648
  else {
1618
- document.front_matter.reporter = options.reporter.trim();
1649
+ document.metadata.reporter = options.reporter.trim();
1619
1650
  }
1620
1651
  changedFields.push("reporter");
1621
1652
  }
1622
1653
  if (options.severity !== undefined || clearFrontMatterKeys.has("severity")) {
1623
1654
  if (clearFrontMatterKeys.has("severity")) {
1624
- delete document.front_matter.severity;
1655
+ delete document.metadata.severity;
1625
1656
  }
1626
1657
  else {
1627
- document.front_matter.severity = ensureEnum(normalizeSeverityInput(options.severity), ISSUE_SEVERITY_VALUES, "severity");
1658
+ document.metadata.severity = ensureEnum(normalizeSeverityInput(options.severity), ISSUE_SEVERITY_VALUES, "severity");
1628
1659
  }
1629
1660
  changedFields.push("severity");
1630
1661
  }
1631
1662
  if (options.environment !== undefined || clearFrontMatterKeys.has("environment")) {
1632
1663
  if (clearFrontMatterKeys.has("environment")) {
1633
- delete document.front_matter.environment;
1664
+ delete document.metadata.environment;
1634
1665
  }
1635
1666
  else {
1636
- document.front_matter.environment = options.environment.trim();
1667
+ document.metadata.environment = options.environment.trim();
1637
1668
  }
1638
1669
  changedFields.push("environment");
1639
1670
  }
1640
1671
  if (options.reproSteps !== undefined || clearFrontMatterKeys.has("repro_steps")) {
1641
1672
  if (clearFrontMatterKeys.has("repro_steps")) {
1642
- delete document.front_matter.repro_steps;
1673
+ delete document.metadata.repro_steps;
1643
1674
  }
1644
1675
  else {
1645
- document.front_matter.repro_steps = options.reproSteps.trim();
1676
+ document.metadata.repro_steps = options.reproSteps.trim();
1646
1677
  }
1647
1678
  changedFields.push("repro_steps");
1648
1679
  }
1649
1680
  if (options.resolution !== undefined || clearFrontMatterKeys.has("resolution")) {
1650
1681
  if (clearFrontMatterKeys.has("resolution")) {
1651
- delete document.front_matter.resolution;
1682
+ delete document.metadata.resolution;
1652
1683
  }
1653
1684
  else {
1654
- document.front_matter.resolution = options.resolution.trim();
1685
+ document.metadata.resolution = options.resolution.trim();
1655
1686
  }
1656
1687
  changedFields.push("resolution");
1657
1688
  }
1658
1689
  if (options.expectedResult !== undefined || clearFrontMatterKeys.has("expected_result")) {
1659
1690
  if (clearFrontMatterKeys.has("expected_result")) {
1660
- delete document.front_matter.expected_result;
1691
+ delete document.metadata.expected_result;
1661
1692
  }
1662
1693
  else {
1663
- document.front_matter.expected_result = options.expectedResult.trim();
1694
+ document.metadata.expected_result = options.expectedResult.trim();
1664
1695
  }
1665
1696
  changedFields.push("expected_result");
1666
1697
  }
1667
1698
  if (options.actualResult !== undefined || clearFrontMatterKeys.has("actual_result")) {
1668
1699
  if (clearFrontMatterKeys.has("actual_result")) {
1669
- delete document.front_matter.actual_result;
1700
+ delete document.metadata.actual_result;
1670
1701
  }
1671
1702
  else {
1672
- document.front_matter.actual_result = options.actualResult.trim();
1703
+ document.metadata.actual_result = options.actualResult.trim();
1673
1704
  }
1674
1705
  changedFields.push("actual_result");
1675
1706
  }
1676
1707
  if (options.affectedVersion !== undefined || clearFrontMatterKeys.has("affected_version")) {
1677
1708
  if (clearFrontMatterKeys.has("affected_version")) {
1678
- delete document.front_matter.affected_version;
1709
+ delete document.metadata.affected_version;
1679
1710
  }
1680
1711
  else {
1681
- document.front_matter.affected_version = options.affectedVersion.trim();
1712
+ document.metadata.affected_version = options.affectedVersion.trim();
1682
1713
  }
1683
1714
  changedFields.push("affected_version");
1684
1715
  }
1685
1716
  if (options.fixedVersion !== undefined || clearFrontMatterKeys.has("fixed_version")) {
1686
1717
  if (clearFrontMatterKeys.has("fixed_version")) {
1687
- delete document.front_matter.fixed_version;
1718
+ delete document.metadata.fixed_version;
1688
1719
  }
1689
1720
  else {
1690
- document.front_matter.fixed_version = options.fixedVersion.trim();
1721
+ document.metadata.fixed_version = options.fixedVersion.trim();
1691
1722
  }
1692
1723
  changedFields.push("fixed_version");
1693
1724
  }
1694
1725
  if (options.component !== undefined || clearFrontMatterKeys.has("component")) {
1695
1726
  if (clearFrontMatterKeys.has("component")) {
1696
- delete document.front_matter.component;
1727
+ delete document.metadata.component;
1697
1728
  }
1698
1729
  else {
1699
- document.front_matter.component = options.component.trim();
1730
+ document.metadata.component = options.component.trim();
1700
1731
  }
1701
1732
  changedFields.push("component");
1702
1733
  }
1703
1734
  if (options.regression !== undefined || clearFrontMatterKeys.has("regression")) {
1704
1735
  if (clearFrontMatterKeys.has("regression")) {
1705
- delete document.front_matter.regression;
1736
+ delete document.metadata.regression;
1706
1737
  }
1707
1738
  else {
1708
- document.front_matter.regression = parseRegressionInput(options.regression);
1739
+ document.metadata.regression = parseRegressionInput(options.regression);
1709
1740
  }
1710
1741
  changedFields.push("regression");
1711
1742
  }
1712
1743
  if (options.customerImpact !== undefined || clearFrontMatterKeys.has("customer_impact")) {
1713
1744
  if (clearFrontMatterKeys.has("customer_impact")) {
1714
- delete document.front_matter.customer_impact;
1745
+ delete document.metadata.customer_impact;
1715
1746
  }
1716
1747
  else {
1717
- document.front_matter.customer_impact = options.customerImpact.trim();
1748
+ document.metadata.customer_impact = options.customerImpact.trim();
1718
1749
  }
1719
1750
  changedFields.push("customer_impact");
1720
1751
  }
1721
1752
  if (options.reminder !== undefined || clearFrontMatterKeys.has("reminders")) {
1722
1753
  if (clearFrontMatterKeys.has("reminders")) {
1723
- delete document.front_matter.reminders;
1754
+ delete document.metadata.reminders;
1724
1755
  }
1725
1756
  else {
1726
- document.front_matter.reminders = parseReminderEntries(options.reminder, nowValue);
1757
+ document.metadata.reminders = parseReminderEntries(options.reminder, nowValue);
1727
1758
  }
1728
1759
  changedFields.push("reminders");
1729
1760
  }
1730
1761
  if (options.event !== undefined || clearFrontMatterKeys.has("events")) {
1731
1762
  if (clearFrontMatterKeys.has("events")) {
1732
- delete document.front_matter.events;
1763
+ delete document.metadata.events;
1733
1764
  }
1734
1765
  else {
1735
- document.front_matter.events = parseEventEntries(options.event, nowValue);
1766
+ document.metadata.events = parseEventEntries(options.event, nowValue);
1736
1767
  }
1737
1768
  changedFields.push("events");
1738
1769
  }
1739
1770
  for (const definition of runtimeFieldRegistry.definitions) {
1740
- if (!clearFrontMatterKeys.has(definition.front_matter_key)) {
1771
+ if (!clearFrontMatterKeys.has(definition.metadata_key)) {
1741
1772
  continue;
1742
1773
  }
1743
- if (document.front_matter[definition.front_matter_key] === undefined) {
1774
+ if (document.metadata[definition.metadata_key] === undefined) {
1744
1775
  continue;
1745
1776
  }
1746
- delete document.front_matter[definition.front_matter_key];
1747
- changedFields.push(definition.front_matter_key);
1777
+ delete document.metadata[definition.metadata_key];
1778
+ changedFields.push(definition.metadata_key);
1748
1779
  }
1749
1780
  const runtimeFieldUpdates = collectRuntimeUpdateFieldValues(options, runtimeFieldRegistry);
1750
1781
  for (const [fieldKey, fieldValue] of Object.entries(runtimeFieldUpdates)) {
1751
1782
  if (clearFrontMatterKeys.has(fieldKey)) {
1752
1783
  continue;
1753
1784
  }
1754
- if (JSON.stringify(document.front_matter[fieldKey]) === JSON.stringify(fieldValue)) {
1785
+ if (JSON.stringify(document.metadata[fieldKey]) === JSON.stringify(fieldValue)) {
1755
1786
  continue;
1756
1787
  }
1757
- document.front_matter[fieldKey] = fieldValue;
1788
+ document.metadata[fieldKey] = fieldValue;
1758
1789
  changedFields.push(fieldKey);
1759
1790
  }
1760
1791
  try {
1761
- applyRegisteredItemFieldDefaultsAndValidation(document.front_matter, getActiveExtensionRegistrations());
1792
+ applyRegisteredItemFieldDefaultsAndValidation(document.metadata, getActiveExtensionRegistrations());
1762
1793
  }
1763
1794
  catch (error) {
1764
1795
  throw new PmCliError(error instanceof Error ? error.message : "Invalid extension item field values", EXIT_CODE.USAGE);