@unbrained/pm-cli 2026.9.4 → 2026.9.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (190) hide show
  1. package/.agents/skills/HARNESS_COMPATIBILITY.md +1 -1
  2. package/.agents/skills/README.md +2 -2
  3. package/.agents/skills/pm-developer/SKILL.md +4 -1
  4. package/.agents/skills/pm-developer/references/COMMAND_PLAYBOOK.md +10 -0
  5. package/.agents/skills/pm-developer/references/GRAPH_AND_RELATIONSHIPS.md +3 -1
  6. package/.agents/skills/pm-extensions/SKILL.md +2 -2
  7. package/.agents/skills/pm-extensions/references/LIFECYCLE.md +3 -3
  8. package/.agents/skills/pm-extensions/references/TROUBLESHOOTING.md +3 -3
  9. package/.agents/skills/pm-user/SKILL.md +2 -0
  10. package/.agents/skills/pm-user/references/BACKLOG_SHAPING.md +5 -0
  11. package/.agents/skills/pm-user/references/WORKFLOWS.md +20 -5
  12. package/.claude-plugin/marketplace.json +2 -2
  13. package/CHANGELOG.md +26 -1
  14. package/dist/cli/commander-usage.d.ts +2 -0
  15. package/dist/cli/commander-usage.js +15 -12
  16. package/dist/cli/help-json-payload.js +12 -7
  17. package/dist/cli/main.js +15 -6
  18. package/dist/cli/register-list-query.js +4 -2
  19. package/dist/cli/register-mutation.js +4 -2
  20. package/dist/cli/register-operations.js +6 -2
  21. package/dist/cli-bundle/bundle-manifest.json +153 -153
  22. package/dist/cli-bundle/chunks/{chunk-RI4XNOYS.js → chunk-3HBDTJRK.js} +2 -2
  23. package/dist/cli-bundle/chunks/chunk-66VPKFP2.js +5 -0
  24. package/dist/cli-bundle/chunks/{chunk-I2AS367G.js → chunk-HUAQITVW.js} +2 -2
  25. package/dist/cli-bundle/chunks/{chunk-HI6BHPCU.js → chunk-IBYREGSP.js} +2 -2
  26. package/dist/cli-bundle/chunks/chunk-LUI4E32I.js +231 -0
  27. package/dist/cli-bundle/chunks/{chunk-YW4QK2G7.js → chunk-QPZHQY2O.js} +2 -2
  28. package/dist/cli-bundle/chunks/{chunk-X6CMGV6L.js → chunk-SF6SM6U5.js} +2 -2
  29. package/dist/cli-bundle/chunks/chunk-SVK5Y64D.js +40 -0
  30. package/dist/cli-bundle/chunks/chunk-V5GBD5KV.js +9 -0
  31. package/dist/cli-bundle/chunks/{chunk-V72UV7QS.js → chunk-WWAEGW4V.js} +57 -57
  32. package/dist/cli-bundle/chunks/{chunk-A24WAVE6.js → chunk-ZRAQS3UA.js} +2 -2
  33. package/dist/cli-bundle/chunks/{register-list-query-Z5YYSJJG.js → register-list-query-AYKGODWT.js} +3 -3
  34. package/dist/cli-bundle/chunks/{register-mutation-ELSP6I4I.js → register-mutation-YZYG53SQ.js} +4 -4
  35. package/dist/cli-bundle/chunks/register-operations-KFSCC7QV.js +2 -0
  36. package/dist/cli-bundle/chunks/{register-setup-E2AE72QG.js → register-setup-UJCRVGBG.js} +2 -2
  37. package/dist/cli-bundle/focused-chunks/chunk-24IG6ONG.js +2 -0
  38. package/dist/cli-bundle/focused-chunks/{chunk-53IHPICX.js → chunk-3ASU6WGI.js} +2 -2
  39. package/dist/cli-bundle/focused-chunks/chunk-3ITLIBKS.js +56 -0
  40. package/dist/cli-bundle/focused-chunks/chunk-3NQD5YDG.js +2 -0
  41. package/dist/cli-bundle/focused-chunks/{chunk-7N2TV7WZ.js → chunk-4OSHLNUE.js} +2 -2
  42. package/dist/cli-bundle/focused-chunks/chunk-65N6JHAN.js +2 -0
  43. package/dist/cli-bundle/focused-chunks/{chunk-AJR3OP2E.js → chunk-B2TTQGFG.js} +2 -2
  44. package/dist/cli-bundle/focused-chunks/chunk-GUBM3RGY.js +20 -0
  45. package/dist/cli-bundle/focused-chunks/{chunk-25UJBH4M.js → chunk-H5FOGAVD.js} +2 -2
  46. package/dist/cli-bundle/focused-chunks/chunk-JX3RCVCX.js +2 -0
  47. package/dist/cli-bundle/focused-chunks/{chunk-6PWPQKDN.js → chunk-KWWCBWFO.js} +2 -2
  48. package/dist/cli-bundle/focused-chunks/chunk-MV752SUC.js +12 -0
  49. package/dist/cli-bundle/focused-chunks/chunk-PKIPMCFS.js +6 -0
  50. package/dist/cli-bundle/focused-chunks/{chunk-3646BZ4W.js → chunk-QL66QNWG.js} +2 -2
  51. package/dist/cli-bundle/focused-chunks/chunk-RJMR2JIF.js +9 -0
  52. package/dist/cli-bundle/focused-chunks/chunk-WIUPWIZR.js +177 -0
  53. package/dist/cli-bundle/focused-chunks/{chunk-NBMJD6MK.js → chunk-WOCIPMW7.js} +2 -2
  54. package/dist/cli-bundle/focused-chunks/{chunk-MHKUIPJW.js → chunk-YEF5PQQ2.js} +2 -2
  55. package/dist/cli-bundle/main.js +22 -15
  56. package/dist/cli-bundle/sdk-authoring.js +1 -1
  57. package/dist/cli-bundle/sdk-contracts.js +1 -1
  58. package/dist/cli-bundle/sdk-core.js +29 -29
  59. package/dist/cli-bundle/sdk-governance.js +1 -1
  60. package/dist/cli-bundle/sdk-graph.js +1 -1
  61. package/dist/cli-bundle/sdk-merge.js +42 -39
  62. package/dist/cli-bundle/sdk-query.js +1 -1
  63. package/dist/cli-bundle/sdk-runtime.js +1 -1
  64. package/dist/cli-bundle/sdk-testing.js +1 -1
  65. package/dist/cli-bundle/sdk.js +8 -8
  66. package/dist/core/extensions/extension-types.d.ts +2 -0
  67. package/dist/core/extensions/extension-types.js +2 -2
  68. package/dist/core/history/drift-scan.d.ts +5 -0
  69. package/dist/core/history/drift-scan.js +16 -6
  70. package/dist/core/history/event-classification.d.ts +1 -1
  71. package/dist/core/history/event-classification.js +3 -2
  72. package/dist/core/history/history.js +37 -5
  73. package/dist/core/history/identity.d.ts +15 -0
  74. package/dist/core/history/identity.js +31 -0
  75. package/dist/core/history/projection.js +50 -17
  76. package/dist/core/history/read.js +6 -3
  77. package/dist/core/history/replay.d.ts +1 -2
  78. package/dist/core/history/replay.js +4 -4
  79. package/dist/core/history/version-address.d.ts +13 -0
  80. package/dist/core/history/version-address.js +33 -0
  81. package/dist/core/item/actionability.d.ts +21 -1
  82. package/dist/core/item/actionability.js +45 -10
  83. package/dist/core/item/id.js +8 -4
  84. package/dist/core/item/item-type-definition.d.ts +2 -0
  85. package/dist/core/item/item-type-definition.js +9 -2
  86. package/dist/core/item/type-registry.d.ts +5 -1
  87. package/dist/core/item/type-registry.js +9 -4
  88. package/dist/core/shared/errors.d.ts +8 -0
  89. package/dist/core/shared/errors.js +2 -2
  90. package/dist/core/store/item-store.d.ts +14 -0
  91. package/dist/core/store/item-store.js +48 -10
  92. package/dist/core/store/settings-validator.js +3 -2
  93. package/dist/sdk/actionability.d.ts +1 -1
  94. package/dist/sdk/actionability.js +3 -3
  95. package/dist/sdk/cli-contracts/command-aliases.js +11 -2
  96. package/dist/sdk/cli-contracts/completeness.js +4 -3
  97. package/dist/sdk/cli-contracts/flag-contracts.js +29 -5
  98. package/dist/sdk/cli-contracts/flag-lexicon-contracts.js +19 -12
  99. package/dist/sdk/cli-contracts/tool-parameter-tables.js +14 -2
  100. package/dist/sdk/cli-contracts/tool-schema.d.ts +2 -2
  101. package/dist/sdk/cli-contracts/tool-schema.js +19 -6
  102. package/dist/sdk/context-intent-contracts.js +3 -3
  103. package/dist/sdk/context-usage.js +9 -11
  104. package/dist/sdk/define.d.ts +1 -1
  105. package/dist/sdk/define.js +2 -2
  106. package/dist/sdk/generated/generated-error-code-catalog-part-1.js +98 -50
  107. package/dist/sdk/generated/generated-error-code-catalog-part-2.js +50 -2
  108. package/dist/sdk/governance/validate-history-drift.js +16 -5
  109. package/dist/sdk/guide-topics.js +116 -2
  110. package/dist/sdk/history/salvage.d.ts +35 -0
  111. package/dist/sdk/history/salvage.js +248 -0
  112. package/dist/sdk/history-compact.js +32 -37
  113. package/dist/sdk/history-read.d.ts +3 -2
  114. package/dist/sdk/history-read.js +6 -3
  115. package/dist/sdk/history-repair.d.ts +5 -0
  116. package/dist/sdk/history-repair.js +14 -2
  117. package/dist/sdk/lifecycle/claim.d.ts +4 -0
  118. package/dist/sdk/lifecycle/claim.js +9 -3
  119. package/dist/sdk/lifecycle/restore.d.ts +1 -0
  120. package/dist/sdk/lifecycle/restore.js +19 -7
  121. package/dist/sdk/output-projection.d.ts +3 -1
  122. package/dist/sdk/output-projection.js +11 -3
  123. package/dist/sdk/public-surface.json +1 -0
  124. package/dist/sdk/query/context.d.ts +9 -0
  125. package/dist/sdk/query/context.js +33 -21
  126. package/dist/sdk/query/get.d.ts +2 -2
  127. package/dist/sdk/query/get.js +4 -3
  128. package/dist/sdk/query/history.d.ts +11 -0
  129. package/dist/sdk/query/history.js +34 -10
  130. package/dist/sdk/query/next.d.ts +15 -1
  131. package/dist/sdk/query/next.js +43 -20
  132. package/dist/sdk/query.d.ts +1 -0
  133. package/dist/sdk/query.js +3 -2
  134. package/dist/sdk/runtime-primitives.d.ts +1 -1
  135. package/dist/sdk/runtime-primitives.js +3 -3
  136. package/dist/types.d.ts +2 -0
  137. package/dist/types.js +2 -2
  138. package/docs/AGENT_GUIDE.md +36 -0
  139. package/docs/HISTORY_RECOVERY.md +146 -0
  140. package/docs/README.md +1 -0
  141. package/docs/RELEASING.md +25 -11
  142. package/docs/SDK_CONTEXT_TRUTH_CONTRACTS.md +24 -1
  143. package/docs/SDK_EXECUTION_CONTRACTS.md +105 -0
  144. package/docs/TESTING.md +5 -0
  145. package/docs/agent-task-token-baseline.json +17 -17
  146. package/docs/agent-task-transcripts.json +2 -1
  147. package/docs/generated/FLAG_LEXICON_BUDGETS.md +10 -10
  148. package/docs/generated/REFUSAL_CLOSURE_CENSUS.md +11 -3
  149. package/marketplace.json +2 -2
  150. package/package.json +4 -5
  151. package/packages/pm-beads/package.json +1 -1
  152. package/packages/pm-calendar/package.json +1 -1
  153. package/packages/pm-command-kit/package.json +1 -1
  154. package/packages/pm-digital-twin/package.json +1 -1
  155. package/packages/pm-governance-audit/package.json +1 -1
  156. package/packages/pm-guide-shell/package.json +1 -1
  157. package/packages/pm-kanban/package.json +1 -1
  158. package/packages/pm-lifecycle-hooks/package.json +1 -1
  159. package/packages/pm-linked-test-adapters/package.json +1 -1
  160. package/packages/pm-search-advanced/package.json +1 -1
  161. package/packages/pm-templates/package.json +1 -1
  162. package/packages/pm-todos/package.json +1 -1
  163. package/packages/pm-vcs/package.json +1 -1
  164. package/plugins/pm-claude/.claude-plugin/plugin.json +1 -1
  165. package/plugins/pm-claude/skills/pm-audit/SKILL.md +2 -2
  166. package/plugins/pm-claude/skills/pm-developer/SKILL.md +2 -2
  167. package/plugins/pm-claude/skills/pm-planner/SKILL.md +2 -2
  168. package/plugins/pm-claude/skills/pm-release/SKILL.md +2 -2
  169. package/plugins/pm-claude/skills/pm-workflow/SKILL.md +3 -3
  170. package/plugins/pm-codex/.codex-plugin/plugin.json +1 -1
  171. package/plugins/pm-codex/skills/pm-auditor/SKILL.md +2 -2
  172. package/plugins/pm-codex/skills/pm-native/SKILL.md +3 -4
  173. package/plugins/pm-codex/skills/pm-release/SKILL.md +2 -2
  174. package/scripts/finalize-build.mjs +13 -1
  175. package/dist/cli-bundle/chunks/chunk-6XSKPNCF.js +0 -230
  176. package/dist/cli-bundle/chunks/chunk-OGBVU67G.js +0 -5
  177. package/dist/cli-bundle/chunks/chunk-TXW6VL33.js +0 -38
  178. package/dist/cli-bundle/chunks/chunk-VGLHECAP.js +0 -9
  179. package/dist/cli-bundle/chunks/register-operations-OH7R3ZT4.js +0 -2
  180. package/dist/cli-bundle/focused-chunks/chunk-4YRAVI43.js +0 -12
  181. package/dist/cli-bundle/focused-chunks/chunk-5P4HVOWG.js +0 -176
  182. package/dist/cli-bundle/focused-chunks/chunk-636VVQ7F.js +0 -54
  183. package/dist/cli-bundle/focused-chunks/chunk-B3A6MJYE.js +0 -2
  184. package/dist/cli-bundle/focused-chunks/chunk-BFDDJ2T2.js +0 -2
  185. package/dist/cli-bundle/focused-chunks/chunk-BHUIRZWQ.js +0 -9
  186. package/dist/cli-bundle/focused-chunks/chunk-JADHHPY6.js +0 -6
  187. package/dist/cli-bundle/focused-chunks/chunk-NSKBLHVI.js +0 -20
  188. package/dist/cli-bundle/focused-chunks/chunk-P2GOAOQN.js +0 -2
  189. package/dist/cli-bundle/focused-chunks/chunk-YARWJM2B.js +0 -2
  190. package/sdk/public-surface.json +0 -33034
@@ -10,9 +10,15 @@
10
10
  * `blocked_by` resolution a single source of truth.
11
11
  */
12
12
 
13
- !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="0605f770-d868-5fe9-a186-45f00d2e93b4")}catch(e){}}();
13
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="7d98ca40-57e8-5afe-8e9d-b694da0130d1")}catch(e){}}();
14
14
  import { isTerminalStatus, normalizeStatusForRegistry } from "./status.js";
15
+ import { BUILTIN_ITEM_EXECUTION_ROLES, resolveTypeDefinition } from "./type-registry.js";
15
16
  import { isExternalDependencyReference, isExternalDependencySourceKind, } from "./dependency-reference.js";
17
+ /** Resolve dispatch semantics once for SDK callers, honoring custom and extension type aliases before built-in defaults. */
18
+ export function resolveItemExecutionRole(type, registry) {
19
+ const definition = registry === undefined ? undefined : resolveTypeDefinition(type, registry);
20
+ return definition?.execution_role ?? BUILTIN_ITEM_EXECUTION_ROLES[type.trim().toLowerCase()] ?? "agent";
21
+ }
16
22
  /** Dependency kind that marks "this item is blocked by the referenced item". */
17
23
  const BLOCKED_BY_DEPENDENCY_KIND = "blocked_by";
18
24
  /** Reverse dependency kind that marks "this item blocks the referenced item". */
@@ -177,6 +183,24 @@ export function collectDependencyBlockedIds(corpus, statusRegistry) {
177
183
  }
178
184
  return blocked;
179
185
  }
186
+ /** Select dispatch candidates from a classified report while retaining held-out worklists. Ownership and ranking remain caller responsibilities. */
187
+ export function selectActionableEntries(report, statusRegistry, options = {}, typeRegistry) {
188
+ const candidates = [...report.ready, ...report.decisions, ...report.gates];
189
+ if (options.includeContainers === true) {
190
+ candidates.push(...report.containers.filter((entry) => entry.open_blockers.length === 0 && !statusRegistry.blocked_statuses.has(normalizeStatusForRegistry(entry.item.status, statusRegistry))));
191
+ }
192
+ const selected = { ready: [], decisions: [], gates: [] };
193
+ for (const entry of candidates) {
194
+ const role = resolveItemExecutionRole(entry.item.type, typeRegistry);
195
+ if (role === "human" && options.includeDecisions !== true)
196
+ selected.decisions.push(entry);
197
+ else if (role === "gate" && options.includeGates !== true)
198
+ selected.gates.push(entry);
199
+ else
200
+ selected.ready.push(entry);
201
+ }
202
+ return selected;
203
+ }
180
204
  /** Resolves the registry's active status set, falling back to just the canonical open status when a custom schema declares none — the same safety net `pm context` applies so the report never misclassifies every item as inactive. */
181
205
  function resolveActiveStatusSet(statusRegistry) {
182
206
  /* c8 ignore start -- fallback applies only to custom schemas that intentionally define zero active statuses */
@@ -242,7 +266,7 @@ function indexCorpus(corpus) {
242
266
  * blockers and the non-terminal items it would unblock. Returned lists preserve
243
267
  * the candidate order so the caller can apply its own ranking.
244
268
  */
245
- export function computeActionabilityReport(candidates, corpus, statusRegistry) {
269
+ export function computeActionabilityReport(candidates, corpus, statusRegistry, typeRegistry) {
246
270
  const { itemsById, childrenByParent, blockedByReverse, blockerIdsByItem } = indexCorpus(corpus);
247
271
  const activeStatuses = new Set([
248
272
  ...resolveActiveStatusSet(statusRegistry),
@@ -255,16 +279,14 @@ export function computeActionabilityReport(candidates, corpus, statusRegistry) {
255
279
  .map((entry) => normalizeItemId(entry.id)));
256
280
  const ready = [];
257
281
  const blocked = [];
282
+ const containers = [];
283
+ const decisions = [];
284
+ const gates = [];
258
285
  let activeCount = 0;
259
- let containerCount = 0;
260
286
  for (const item of candidates) {
261
287
  if (!activeStatuses.has(normalizeStatusForRegistry(item.status, statusRegistry)))
262
288
  continue;
263
289
  activeCount += 1;
264
- if (hasOpenDescendant(item.id, childrenByParent, statusRegistry)) {
265
- containerCount += 1;
266
- continue;
267
- }
268
290
  const openBlockers = resolveItemBlockersWithIndex(item, itemsById, statusRegistry, blockerIdsByItem).filter((blocker) => !blocker.resolved);
269
291
  const unblocks = (blockedByReverse.get(normalizeItemId(item.id)) ?? [])
270
292
  .filter((dependentId) => nonTerminalIds.has(normalizeItemId(dependentId)))
@@ -274,9 +296,19 @@ export function computeActionabilityReport(candidates, corpus, statusRegistry) {
274
296
  open_blockers: openBlockers,
275
297
  unblocks,
276
298
  };
299
+ if (hasOpenDescendant(item.id, childrenByParent, statusRegistry)) {
300
+ containers.push(entry);
301
+ continue;
302
+ }
277
303
  const lifecycleBlocked = statusRegistry.blocked_statuses.has(normalizeStatusForRegistry(item.status, statusRegistry));
278
304
  if (openBlockers.length === 0 && !lifecycleBlocked) {
279
- ready.push(entry);
305
+ const role = resolveItemExecutionRole(item.type, typeRegistry);
306
+ if (role === "human")
307
+ decisions.push(entry);
308
+ else if (role === "gate")
309
+ gates.push(entry);
310
+ else
311
+ ready.push(entry);
280
312
  }
281
313
  else {
282
314
  blocked.push(entry);
@@ -285,9 +317,12 @@ export function computeActionabilityReport(candidates, corpus, statusRegistry) {
285
317
  return {
286
318
  ready,
287
319
  blocked,
320
+ containers,
321
+ decisions,
322
+ gates,
288
323
  active_count: activeCount,
289
- container_count: containerCount,
324
+ container_count: containers.length,
290
325
  };
291
326
  }
292
327
  //# sourceMappingURL=actionability.js.map
293
- //# debugId=0605f770-d868-5fe9-a186-45f00d2e93b4
328
+ //# debugId=7d98ca40-57e8-5afe-8e9d-b694da0130d1
@@ -4,7 +4,7 @@
4
4
  * Defines item parsing, formatting, and lifecycle helpers for Id.
5
5
  */
6
6
 
7
- !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="6b3f1585-ab12-57ca-80eb-d3cebc384c52")}catch(e){}}();
7
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="04f02467-a4ee-5616-9fbf-3df1141efccf")}catch(e){}}();
8
8
  import crypto from "node:crypto";
9
9
  import path from "node:path";
10
10
  import { TYPE_TO_FOLDER } from "../shared/constants.js";
@@ -60,11 +60,13 @@ function randomToken(length) {
60
60
  }
61
61
  return token;
62
62
  }
63
+ /** Reserve an identity when either a live item path or its retained history exists. */
63
64
  async function idExists(pmRoot, id, typeToFolder) {
64
65
  const checks = [...new Set(Object.values(typeToFolder))].flatMap((folder) => [
65
66
  path.join(pmRoot, folder, `${id}.md`),
66
67
  path.join(pmRoot, folder, `${id}.toon`),
67
68
  ]);
69
+ checks.push(path.join(pmRoot, "history", `${id}.jsonl`));
68
70
  return (await Promise.all(checks.map((target) => pathExists(target)))).some(Boolean);
69
71
  }
70
72
  /** Bounds accepted for the configurable random id token length (`ids.token_length`). */
@@ -95,8 +97,10 @@ export async function generateItemId(pmRoot, prefix, options = {}) {
95
97
  while (tokenLength <= maxTokenLength) {
96
98
  for (let i = 0; i < 32; i += 1) {
97
99
  const id = `${normalizePrefix(prefix)}${randomToken(tokenLength)}`;
98
- if (options.probeExisting === false ||
99
- !(await idExists(pmRoot, id, options.typeToFolder ?? TYPE_TO_FOLDER))) {
100
+ const occupied = await (options.probeExisting === false
101
+ ? pathExists(path.join(pmRoot, "history", `${id}.jsonl`))
102
+ : idExists(pmRoot, id, options.typeToFolder ?? TYPE_TO_FOLDER));
103
+ if (!occupied) {
100
104
  return id;
101
105
  }
102
106
  attempts += 1;
@@ -106,4 +110,4 @@ export async function generateItemId(pmRoot, prefix, options = {}) {
106
110
  throw new Error(`Unable to generate unique id after ${attempts} attempts`);
107
111
  }
108
112
  //# sourceMappingURL=id.js.map
109
- //# debugId=6b3f1585-ab12-57ca-80eb-d3cebc384c52
113
+ //# debugId=04f02467-a4ee-5616-9fbf-3df1141efccf
@@ -38,6 +38,8 @@ export interface NormalizeItemTypeDefinitionOptions {
38
38
  /** How to resolve a raw policy `command` value (defaults to {@link keepPolicyCommand}). */
39
39
  resolvePolicyCommand?: ResolvePolicyCommand;
40
40
  }
41
+ /** Validate an execution role before a settings or extension definition enters scheduling. Unknown values fail instead of silently enabling dispatch. */
42
+ export declare function parseItemExecutionRole(value: unknown): ItemTypeDefinition["execution_role"];
41
43
  /**
42
44
  * Normalize a full {@link ItemTypeDefinition}, returning null when the name is blank.
43
45
  *
@@ -15,7 +15,7 @@
15
15
  */
16
16
  /** Dedupe + sort a string list: trim, drop blanks, unique, locale-sorted. */
17
17
 
18
- !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="815165a9-27a7-5933-adae-c7e55330c8e4")}catch(e){}}();
18
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="f02cb2e7-2d5f-5cc8-8a60-18db78b50da0")}catch(e){}}();
19
19
  export function normalizeItemTypeStringList(values) {
20
20
  return [
21
21
  ...new Set((values ?? [])
@@ -85,6 +85,12 @@ function optionalNonEmptyString(value) {
85
85
  const normalized = value?.trim();
86
86
  return normalized && normalized.length > 0 ? normalized : undefined;
87
87
  }
88
+ /** Validate an execution role before a settings or extension definition enters scheduling. Unknown values fail instead of silently enabling dispatch. */
89
+ export function parseItemExecutionRole(value) {
90
+ if (value === undefined || value === "agent" || value === "human" || value === "gate")
91
+ return value;
92
+ throw new Error("Item type execution_role must be agent, human, or gate.");
93
+ }
88
94
  /**
89
95
  * Normalize a full {@link ItemTypeDefinition}, returning null when the name is blank.
90
96
  *
@@ -113,6 +119,7 @@ export function normalizeItemTypeDefinition(definition, options = {}) {
113
119
  name,
114
120
  description: optionalNonEmptyString(definition.description),
115
121
  default_status: optionalNonEmptyString(definition.default_status),
122
+ ...(definition.execution_role === undefined ? {} : { execution_role: parseItemExecutionRole(definition.execution_role) }),
116
123
  folder: optionalNonEmptyString(definition.folder),
117
124
  aliases: aliases.length > 0 ? aliases : undefined,
118
125
  required_create_fields: normalizeOptionalStringList(definition.required_create_fields, hasRequiredCreateFields),
@@ -124,4 +131,4 @@ export function normalizeItemTypeDefinition(definition, options = {}) {
124
131
  };
125
132
  }
126
133
  //# sourceMappingURL=item-type-definition.js.map
127
- //# debugId=815165a9-27a7-5933-adae-c7e55330c8e4
134
+ //# debugId=f02cb2e7-2d5f-5cc8-8a60-18db78b50da0
@@ -1,5 +1,7 @@
1
1
  import type { ExtensionRegistrationRegistry } from "../extensions/loader.js";
2
- import type { ItemTypeCommandOptionPolicy, ItemTypeOptionDefinition, PmSettings } from "../../types/index.js";
2
+ import type { ItemTypeCommandOptionPolicy, ItemTypeDefinition, ItemTypeOptionDefinition, PmSettings } from "../../types/index.js";
3
+ /** Default dispatch roles for built-in types whose work requires human input or outcome verification. Custom definitions can override these through the same registry. */
4
+ export declare const BUILTIN_ITEM_EXECUTION_ROLES: Readonly<Record<string, "human" | "gate">>;
3
5
  /** Fallback required create fields used when callers do not provide an override. */
4
6
  export declare const DEFAULT_REQUIRED_CREATE_FIELDS: readonly ["title", "description", "status", "priority", "tags", "body", "deadline", "estimatedMinutes", "acceptanceCriteria", "author", "message", "assignee"];
5
7
  /** Fallback required create repeatables used when callers do not provide an override. */
@@ -31,6 +33,8 @@ export interface ResolvedItemTypeDefinition {
31
33
  aliases: string[];
32
34
  /** Optional per-type status applied at create time when `--status` is omitted. */
33
35
  default_status?: string;
36
+ /** Effective dispatch role; absent legacy definitions are resolved through the built-in defaults. */
37
+ execution_role?: ItemTypeDefinition["execution_role"];
34
38
  /** Value that configures or reports required create fields for this contract. */
35
39
  required_create_fields: string[];
36
40
  /** Value that configures or reports required create repeatables for this contract. */
@@ -4,11 +4,13 @@
4
4
  * Defines item parsing, formatting, and lifecycle helpers for Type Registry.
5
5
  */
6
6
 
7
- !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="88b2ed4e-b5fd-5014-abf1-c163db033abf")}catch(e){}}();
7
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="506efdc7-b04e-5023-ab59-57ede87558f9")}catch(e){}}();
8
8
  import path from "node:path";
9
9
  import { TYPE_TO_FOLDER } from "../shared/constants.js";
10
10
  import { ITEM_TYPE_VALUES } from "../../types/index.js";
11
- import { normalizeItemTypeDefinition as normalizeSharedItemTypeDefinition, normalizeItemTypeStringList, strictPolicyCommand, } from "./item-type-definition.js";
11
+ import { normalizeItemTypeDefinition as normalizeSharedItemTypeDefinition, normalizeItemTypeStringList, strictPolicyCommand, parseItemExecutionRole, } from "./item-type-definition.js";
12
+ /** Default dispatch roles for built-in types whose work requires human input or outcome verification. Custom definitions can override these through the same registry. */
13
+ export const BUILTIN_ITEM_EXECUTION_ROLES = Object.freeze({ decision: "human", milestone: "gate" });
12
14
  /** Fallback required create fields used when callers do not provide an override. */
13
15
  export const DEFAULT_REQUIRED_CREATE_FIELDS = [
14
16
  "title",
@@ -421,6 +423,7 @@ function coerceTypeDefinitionFromUnknown(raw) {
421
423
  name,
422
424
  description,
423
425
  default_status: defaultStatus,
426
+ execution_role: parseItemExecutionRole(record.execution_role),
424
427
  folder,
425
428
  aliases: readStringArray(record, "aliases"),
426
429
  required_create_fields: readStringArray(record, "required_create_fields"),
@@ -462,6 +465,7 @@ function buildResolvedTypeDefinition(normalizedDefinition, existing) {
462
465
  toDefaultFolder(keepName));
463
466
  const resolvedDefinition = {
464
467
  name: keepName,
468
+ execution_role: normalizedDefinition.execution_role,
465
469
  folder,
466
470
  aliases: normalizeItemTypeStringList([
467
471
  ...(existing?.aliases ?? []),
@@ -488,7 +492,7 @@ function applyTypeDefinitions(source, target) {
488
492
  }
489
493
  const lowerName = normalizedDefinition.name.toLowerCase();
490
494
  const existing = target.get(lowerName);
491
- target.set(lowerName, buildResolvedTypeDefinition(normalizedDefinition, existing));
495
+ target.set(lowerName, buildResolvedTypeDefinition({ ...normalizedDefinition, execution_role: normalizedDefinition.execution_role ?? existing?.execution_role }, existing));
492
496
  }
493
497
  }
494
498
  function collectExtensionTypeDefinitions(registrations) {
@@ -516,6 +520,7 @@ export function resolveItemTypeRegistry(settings, extensionRegistrations = null)
516
520
  for (const builtin of ITEM_TYPE_VALUES) {
517
521
  byLowerName.set(builtin.toLowerCase(), {
518
522
  name: builtin,
523
+ execution_role: BUILTIN_ITEM_EXECUTION_ROLES[builtin.toLowerCase()] ?? "agent",
519
524
  folder: TYPE_TO_FOLDER[builtin],
520
525
  aliases: [],
521
526
  required_create_fields: [...DEFAULT_REQUIRED_CREATE_FIELDS],
@@ -708,4 +713,4 @@ export function validateTypeOptions(typeName, rawTypeOptions, registry) {
708
713
  };
709
714
  }
710
715
  //# sourceMappingURL=type-registry.js.map
711
- //# debugId=88b2ed4e-b5fd-5014-abf1-c163db033abf
716
+ //# debugId=506efdc7-b04e-5023-ab59-57ede87558f9
@@ -53,6 +53,14 @@ export interface PmCliErrorRecoveryPayload {
53
53
  export interface PmCliErrorContext {
54
54
  /** Value that configures or reports code for this contract. */
55
55
  code?: string;
56
+ /** Item whose document could not be decoded or parsed. */
57
+ item_id?: string;
58
+ /** Exact filesystem path of the unreadable item document. */
59
+ item_path?: string;
60
+ /** Original document size before decoding or parsing. */
61
+ byte_length?: number;
62
+ /** Whether the original item document contained no bytes. */
63
+ empty?: boolean;
56
64
  /** Stable failure class within the operation-specific error code. */
57
65
  reason?: string;
58
66
  /** Metadata field responsible for a validation failure, when known. */
@@ -1,6 +1,6 @@
1
1
  /** Implements the exported pm cli error runtime abstraction for core/shared/errors.ts. */
2
2
 
3
- !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="922e2e27-1499-5466-98e4-322d0d742e40")}catch(e){}}();
3
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="9ab4b378-900c-5a2a-9237-b1d8d4f2ae13")}catch(e){}}();
4
4
  export class PmCliError extends Error {
5
5
  /** Value that configures or reports exit code for this contract. */
6
6
  exitCode;
@@ -18,4 +18,4 @@ export class PmCliError extends Error {
18
18
  }
19
19
  }
20
20
  //# sourceMappingURL=errors.js.map
21
- //# debugId=922e2e27-1499-5466-98e4-322d0d742e40
21
+ //# debugId=9ab4b378-900c-5a2a-9237-b1d8d4f2ae13
@@ -25,6 +25,20 @@ export declare function readLocatedItem(item: LocatedItem, options?: {
25
25
  raw: string;
26
26
  document: ItemDocument;
27
27
  }>;
28
+ /**
29
+ * Read once and retain a recoverable parse failure beside its exact text snapshot.
30
+ * Filesystem and merge-conflict errors still throw; callers must explicitly
31
+ * reconstruct an invalid document before performing any mutation.
32
+ */
33
+ export declare function readLocatedItemSnapshot(item: LocatedItem, options?: Parameters<typeof readLocatedItem>[1]): Promise<{
34
+ raw: string;
35
+ document: ItemDocument;
36
+ error: null;
37
+ } | {
38
+ raw: string;
39
+ document: null;
40
+ error: PmCliError;
41
+ }>;
28
42
  /** Implements list all item metadata for the public runtime surface of this module. */
29
43
  export declare function listAllItemMetadata(pmRoot: string, preferredFormat?: ItemFormat, typeToFolder?: Record<string, string>, warnings?: string[], schema?: RuntimeSchemaSettings): Promise<ItemMetadata[]>;
30
44
  /**
@@ -4,7 +4,7 @@
4
4
  * Reads and writes tracker storage with format-aware helpers for Item Store.
5
5
  */
6
6
 
7
- !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="bffd3114-3e85-58ae-90c7-eea5069cdb89")}catch(e){}}();
7
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="c3390c01-c153-5baa-b9bd-07ea8d34828f")}catch(e){}}();
8
8
  import fs from "node:fs/promises";
9
9
  import path from "node:path";
10
10
  import { getActiveExtensionRegistrations, projectAfterCommandItemSnapshot, recordAfterCommandAffectedItem, runActiveOnReadHooks, runActiveBeforeMutationHooks, runActiveOnWriteHooks, runActiveServiceOverride, } from "../extensions/index.js";
@@ -18,6 +18,7 @@ import { canonicalDocument, parseItemDocument, serializeItemDocument, } from "..
18
18
  import { resolveItemTypeRegistry } from "../item/type-registry.js";
19
19
  import { acquireLock } from "../lock/lock.js";
20
20
  import { writeFileAtomic } from "../fs/fs-utils.js";
21
+ import { isUtf8 } from "node:buffer";
21
22
  import { normalizeItemId, normalizeRawItemId } from "../item/id.js";
22
23
  import { acquireItemMetadataDerivedIndexLock, listAllDocumentCandidatesCached, listAllDocumentsCached, listAllDocumentsCachedLight, refreshItemMetadataDerivedIndex, } from "./item-metadata-cache.js";
23
24
  import { getHistoryPath, getItemPath, ITEM_FILE_EXTENSIONS } from "./paths.js";
@@ -96,18 +97,55 @@ export async function locateItem(pmRoot, rawId, idPrefix = "pm-", preferredForma
96
97
  }
97
98
  /** Implements read located item for the public runtime surface of this module. */
98
99
  export async function readLocatedItem(item, options = {}) {
99
- const raw = await fs.readFile(item.itemPath, "utf8");
100
+ const snapshot = await readLocatedItemSnapshot(item, options);
101
+ if (snapshot.error !== null)
102
+ throw snapshot.error;
103
+ return { raw: snapshot.raw, document: snapshot.document };
104
+ }
105
+ /**
106
+ * Read once and retain a recoverable parse failure beside its exact text snapshot.
107
+ * Filesystem and merge-conflict errors still throw; callers must explicitly
108
+ * reconstruct an invalid document before performing any mutation.
109
+ */
110
+ export async function readLocatedItemSnapshot(item, options = {}) {
111
+ const bytes = await fs.readFile(item.itemPath);
112
+ if (!isUtf8(bytes)) {
113
+ throw new PmCliError("Item contains invalid UTF-8; preserve a binary backup before recovering it.", EXIT_CODE.CONFLICT, { code: "item_document_encoding_invalid", item_id: item.id, item_path: item.itemPath, byte_length: bytes.length, empty: false });
114
+ }
115
+ const raw = bytes.toString("utf8");
100
116
  await runActiveOnReadHooks({
101
117
  path: item.itemPath,
102
118
  scope: "project",
103
119
  });
104
- const document = parseItemDocument(raw, {
105
- format: item.item_format,
106
- schema: options.schema,
107
- extensionFieldNames: resolveActiveExtensionFieldNames(options.extensionFieldNames),
108
- onWarning: (warning) => appendWarning(options.warnings, warning),
109
- });
110
- return { raw, document };
120
+ let document;
121
+ try {
122
+ document = parseItemDocument(raw, {
123
+ format: item.item_format,
124
+ schema: options.schema,
125
+ extensionFieldNames: resolveActiveExtensionFieldNames(options.extensionFieldNames),
126
+ onWarning: (warning) => appendWarning(options.warnings, warning),
127
+ });
128
+ }
129
+ catch (error) {
130
+ if (error instanceof PmCliError && error.code === "item_document_invalid") {
131
+ return {
132
+ raw,
133
+ document: null,
134
+ error: new PmCliError(`Cannot read ${item.id} at ${item.itemPath}${bytes.length === 0 ? " (zero-length file)" : ""}: ${error.message}`, error.exitCode, {
135
+ ...error.context,
136
+ item_id: item.id,
137
+ item_path: item.itemPath,
138
+ byte_length: bytes.length,
139
+ empty: bytes.length === 0,
140
+ nextSteps: [
141
+ `Run pm history ${item.id} --full, then pm restore ${item.id} <version> to recover a recorded state.`,
142
+ ],
143
+ }),
144
+ };
145
+ }
146
+ throw error;
147
+ }
148
+ return { raw, document, error: null };
111
149
  }
112
150
  /** Implements list all item metadata for the public runtime surface of this module. */
113
151
  export async function listAllItemMetadata(pmRoot, preferredFormat, typeToFolder = TYPE_TO_FOLDER, warnings, schema) {
@@ -649,4 +687,4 @@ export async function deleteItem(params) {
649
687
  }
650
688
  }
651
689
  //# sourceMappingURL=item-store.js.map
652
- //# debugId=bffd3114-3e85-58ae-90c7-eea5069cdb89
690
+ //# debugId=c3390c01-c153-5baa-b9bd-07ea8d34828f
@@ -12,7 +12,7 @@
12
12
  * byte-identical to the previous implementation.
13
13
  */
14
14
 
15
- !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="0e135793-d2ed-505b-b73e-6db55218d8af")}catch(e){}}();
15
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="c9cac741-16ba-5466-806f-bf8881a2ffa2")}catch(e){}}();
16
16
  import { GOVERNANCE_PRESET_VALUES, RUNTIME_FIELD_COMMAND_VALUES, RUNTIME_FIELD_TYPE_VALUES, RUNTIME_STATUS_ROLE_VALUES, RUNTIME_UNKNOWN_FIELD_POLICY_VALUES, } from "../../types.js";
17
17
  // Generic over `never` so it is assignable to every `Outcome<T>`.
18
18
  const FAIL = { ok: false };
@@ -137,6 +137,7 @@ const itemTypeDefinition = vObject({
137
137
  // Per-type create-time default status (config-driven); preserved so inline
138
138
  // settings.item_types.definitions behave identically to schema/types.json.
139
139
  default_status: vOptional(vString),
140
+ execution_role: vOptional(vLiteral("agent", "human", "gate")),
140
141
  folder: vOptional(vString),
141
142
  aliases: vOptional(vArray(vString)),
142
143
  required_create_fields: vOptional(vArray(vString)),
@@ -418,4 +419,4 @@ export function validateSettings(raw) {
418
419
  return { success: true, data: result.value };
419
420
  }
420
421
  //# sourceMappingURL=settings-validator.js.map
421
- //# debugId=0e135793-d2ed-505b-b73e-6db55218d8af
422
+ //# debugId=c9cac741-16ba-5466-806f-bf8881a2ffa2
@@ -7,4 +7,4 @@
7
7
  * blocker or ready-work classifications without storage or rendering side
8
8
  * effects.
9
9
  */
10
- export { ACTIONABILITY_ORDERING_KINDS, collectBlockedByIds, collectBlockedByIdsFromCorpus, collectDependencyBlockedIds, computeActionabilityReport, indexBlockedByIds, resolveItemBlockers, type ActionabilityReport, type ActionableEntry, type ResolvedBlocker, } from "../core/item/actionability.js";
10
+ export { ACTIONABILITY_ORDERING_KINDS, collectBlockedByIds, collectBlockedByIdsFromCorpus, collectDependencyBlockedIds, computeActionabilityReport, indexBlockedByIds, resolveItemBlockers, resolveItemExecutionRole, selectActionableEntries, type ActionabilitySelectionOptions, type ActionabilityReport, type ActionableEntry, type ResolvedBlocker, } from "../core/item/actionability.js";
@@ -8,7 +8,7 @@
8
8
  * effects.
9
9
  */
10
10
 
11
- !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="cc271a73-9767-54bb-a142-d4d4569e3c6a")}catch(e){}}();
12
- export { ACTIONABILITY_ORDERING_KINDS, collectBlockedByIds, collectBlockedByIdsFromCorpus, collectDependencyBlockedIds, computeActionabilityReport, indexBlockedByIds, resolveItemBlockers, } from "../core/item/actionability.js";
11
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="7d393eb0-d24d-55d2-8e4e-e94805d91784")}catch(e){}}();
12
+ export { ACTIONABILITY_ORDERING_KINDS, collectBlockedByIds, collectBlockedByIdsFromCorpus, collectDependencyBlockedIds, computeActionabilityReport, indexBlockedByIds, resolveItemBlockers, resolveItemExecutionRole, selectActionableEntries, } from "../core/item/actionability.js";
13
13
  //# sourceMappingURL=actionability.js.map
14
- //# debugId=cc271a73-9767-54bb-a142-d4d4569e3c6a
14
+ //# debugId=7d393eb0-d24d-55d2-8e4e-e94805d91784
@@ -10,8 +10,17 @@
10
10
  * are intentionally absent from default help and completion discovery.
11
11
  */
12
12
 
13
- !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="3c9694bd-3635-5298-abeb-6899c94317ab")}catch(e){}}();
13
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="a7934e70-b1ea-5eac-b500-e4b18a6385a6")}catch(e){}}();
14
14
  export const PM_COMMAND_ALIAS_CONTRACTS = [
15
+ {
16
+ alias: "tests",
17
+ canonical: "test",
18
+ canonical_argv: ["test"],
19
+ lifecycle: "permanent",
20
+ hidden: false,
21
+ registration: "bootstrap",
22
+ owner: "pm-u4t9gp",
23
+ },
15
24
  ...[
16
25
  ["fetch", "get"],
17
26
  ["read", "get"],
@@ -96,4 +105,4 @@ export function renderPmCommandAliasMigrationHint(contract) {
96
105
  return `Deprecated command \`${contract.alias}\`; use \`pm ${contract.canonical_argv.join(" ")}\`.`;
97
106
  }
98
107
  //# sourceMappingURL=command-aliases.js.map
99
- //# debugId=3c9694bd-3635-5298-abeb-6899c94317ab
108
+ //# debugId=a7934e70-b1ea-5eac-b500-e4b18a6385a6
@@ -7,7 +7,7 @@
7
7
  * a hand-picked test list.
8
8
  */
9
9
 
10
- !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="f4e5eed5-94c2-536a-8685-e20b735de480")}catch(e){}}();
10
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="199e3ef5-93a0-5d93-8f77-d9d12bbc69d4")}catch(e){}}();
11
11
  import { PM_TOOL_ACTIONS } from "./enum-contracts.js";
12
12
  import { resolveSubcommandFlagContractsForCommand, } from "./flag-contracts.js";
13
13
  import { pmToolActionParameterKeys } from "./tool-schema.js";
@@ -100,6 +100,7 @@ const ACTION_POSITIONAL_PARAMETERS = {
100
100
  },
101
101
  };
102
102
  const ACTION_FLAG_PARAMETER_OVERRIDES = {
103
+ append: { "--text": "body" },
103
104
  assurance: {
104
105
  "--tree": "treeId",
105
106
  "--owner": "owner",
@@ -139,7 +140,7 @@ const ACTION_FLAG_PARAMETER_OVERRIDES = {
139
140
  docs: { "--note": "addNote" },
140
141
  comments: { "--full-history": "full" },
141
142
  notes: { "--file": "text", "--full-history": "full" },
142
- learnings: { "--full-history": "full" },
143
+ learnings: { "--file": "text", "--full-history": "full" },
143
144
  gc: { "--scope": "gcScope" },
144
145
  contracts: { "--action": "contractAction" },
145
146
  schema: {
@@ -390,4 +391,4 @@ export function analyzeSdkCliParameterCompleteness(source = {}) {
390
391
  });
391
392
  }
392
393
  //# sourceMappingURL=completeness.js.map
393
- //# debugId=f4e5eed5-94c2-536a-8685-e20b735de480
394
+ //# debugId=199e3ef5-93a0-5d93-8f77-d9d12bbc69d4