@unbrained/pm-cli 2026.8.27 → 2026.8.28

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 (105) hide show
  1. package/.claude-plugin/marketplace.json +2 -2
  2. package/CHANGELOG.md +25 -1
  3. package/dist/cli/error-guidance.js +61 -7
  4. package/dist/cli/register-annotations.js +58 -41
  5. package/dist/cli-bundle/bundle-manifest.json +121 -121
  6. package/dist/cli-bundle/chunks/{chunk-SH6P7FXI.js → chunk-BY2FQ2NI.js} +2 -2
  7. package/dist/cli-bundle/chunks/{chunk-TNX6HC54.js → chunk-E73FDIWT.js} +2 -2
  8. package/dist/cli-bundle/chunks/{chunk-SHMDY36D.js → chunk-FEVBFFCQ.js} +2 -2
  9. package/dist/cli-bundle/chunks/{chunk-CVBBGWW5.js → chunk-M7OXRQE3.js} +10 -6
  10. package/dist/cli-bundle/chunks/{chunk-R4ETAOJC.js → chunk-NBCBFVZI.js} +2 -2
  11. package/dist/cli-bundle/chunks/{chunk-SKXLJIEK.js → chunk-NTXZHRKA.js} +45 -45
  12. package/dist/cli-bundle/chunks/{chunk-52EKTW6V.js → chunk-QE6WQXFO.js} +2 -2
  13. package/dist/cli-bundle/chunks/{chunk-MFNTKMTI.js → chunk-TIQ6AMH2.js} +2 -2
  14. package/dist/cli-bundle/chunks/chunk-X2RROGZE.js +2 -0
  15. package/dist/cli-bundle/chunks/{chunk-OS27HHBN.js → chunk-XRVVYRRO.js} +28 -28
  16. package/dist/cli-bundle/chunks/{chunk-3OO3W6FW.js → chunk-XWEQGHHG.js} +2 -2
  17. package/dist/cli-bundle/chunks/{register-list-query-EUWM6VII.js → register-list-query-J35ZPQQ5.js} +2 -2
  18. package/dist/cli-bundle/chunks/{register-mutation-FD4HSAVU.js → register-mutation-J6XJJOGU.js} +4 -4
  19. package/dist/cli-bundle/chunks/{register-operations-HRMNFEC3.js → register-operations-AE3JEMFT.js} +2 -2
  20. package/dist/cli-bundle/chunks/{register-setup-33GNICLX.js → register-setup-OQERLLWE.js} +2 -2
  21. package/dist/cli-bundle/focused-chunks/{chunk-4BR5UU52.js → chunk-4ZDRZYYJ.js} +41 -41
  22. package/dist/cli-bundle/focused-chunks/{chunk-MXTYGECH.js → chunk-AHAM2HAU.js} +2 -2
  23. package/dist/cli-bundle/focused-chunks/{chunk-SUBSWYW3.js → chunk-JZYPPMXF.js} +2 -2
  24. package/dist/cli-bundle/focused-chunks/chunk-LLNTHF5X.js +2 -0
  25. package/dist/cli-bundle/focused-chunks/chunk-LYFWQMVC.js +2 -0
  26. package/dist/cli-bundle/focused-chunks/{chunk-EKX37ZHA.js → chunk-THEPQMLX.js} +2 -2
  27. package/dist/cli-bundle/focused-chunks/chunk-YJLDHJOD.js +2 -0
  28. package/dist/cli-bundle/main.js +14 -14
  29. package/dist/cli-bundle/sdk-authoring.js +1 -1
  30. package/dist/cli-bundle/sdk-contracts.js +2 -2
  31. package/dist/cli-bundle/sdk-core.js +26 -26
  32. package/dist/cli-bundle/sdk-governance.js +1 -1
  33. package/dist/cli-bundle/sdk-merge.js +20 -20
  34. package/dist/cli-bundle/sdk-query.js +1 -1
  35. package/dist/cli-bundle/sdk-runtime.js +1 -1
  36. package/dist/cli-bundle/sdk-testing.js +1 -1
  37. package/dist/cli-bundle/sdk.js +10 -10
  38. package/dist/mcp/tool-definitions.js +5 -5
  39. package/dist/sdk/agent/command-recovery.js +3 -3
  40. package/dist/sdk/agent/task-transcript-contracts.d.ts +52 -0
  41. package/dist/sdk/agent/task-transcript-contracts.js +198 -0
  42. package/dist/sdk/annotations.d.ts +5 -2
  43. package/dist/sdk/annotations.js +66 -36
  44. package/dist/sdk/cli-bootstrap.d.ts +2 -8
  45. package/dist/sdk/cli-bootstrap.js +7 -67
  46. package/dist/sdk/cli-contracts/bootstrap-command-scanner.d.ts +23 -0
  47. package/dist/sdk/cli-contracts/bootstrap-command-scanner.js +80 -0
  48. package/dist/sdk/cli-contracts/flag-contracts.js +5 -2
  49. package/dist/sdk/cli-contracts/flag-lexicon-contracts.js +5 -5
  50. package/dist/sdk/cli-contracts/tool-parameter-tables.js +15 -2
  51. package/dist/sdk/cli-contracts/tool-schema.d.ts +1 -1
  52. package/dist/sdk/cli-contracts/tool-schema.js +16 -3
  53. package/dist/sdk/comments.d.ts +4 -0
  54. package/dist/sdk/comments.js +2 -2
  55. package/dist/sdk/completion.js +9 -5
  56. package/dist/sdk/contracts.d.ts +1 -0
  57. package/dist/sdk/contracts.js +3 -2
  58. package/dist/sdk/extension/install-sources.d.ts +13 -0
  59. package/dist/sdk/extension/install-sources.js +62 -30
  60. package/dist/sdk/generated/generated-error-code-catalog-part-1.js +26 -2
  61. package/dist/sdk/generated/generated-error-code-catalog-part-2.js +26 -14
  62. package/dist/sdk/index.d.ts +1 -0
  63. package/dist/sdk/index.js +3 -2
  64. package/dist/sdk/learnings.d.ts +4 -0
  65. package/dist/sdk/learnings.js +7 -4
  66. package/dist/sdk/lifecycle/close.js +4 -3
  67. package/dist/sdk/notes.d.ts +4 -0
  68. package/dist/sdk/notes.js +2 -2
  69. package/dist/sdk/runtime-input.js +5 -2
  70. package/dist/sdk/runtime.d.ts +6 -6
  71. package/dist/sdk/runtime.js +8 -8
  72. package/docs/COMMANDS.md +4 -3
  73. package/docs/OUTPUT_TOKEN_ACCOUNTING.md +20 -7
  74. package/docs/RELEASING.md +9 -1
  75. package/docs/SDK.md +12 -0
  76. package/docs/SDK_CONTEXT_INTEGRITY.md +12 -1
  77. package/docs/SDK_RUNTIME_BOUNDARIES.md +10 -0
  78. package/docs/TESTING.md +6 -2
  79. package/docs/agent-task-token-baseline.json +97 -11
  80. package/docs/agent-task-transcripts.json +211 -0
  81. package/docs/generated/FLAG_LEXICON_BUDGETS.md +3 -3
  82. package/docs/generated/REFUSAL_CLOSURE_CENSUS.md +6 -3
  83. package/docs/performance/cli-transport-overhead.md +10 -2
  84. package/marketplace.json +2 -2
  85. package/package.json +2 -2
  86. package/packages/pm-beads/package.json +1 -1
  87. package/packages/pm-calendar/package.json +1 -1
  88. package/packages/pm-command-kit/package.json +1 -1
  89. package/packages/pm-digital-twin/package.json +1 -1
  90. package/packages/pm-governance-audit/package.json +1 -1
  91. package/packages/pm-guide-shell/package.json +1 -1
  92. package/packages/pm-kanban/package.json +1 -1
  93. package/packages/pm-lifecycle-hooks/package.json +1 -1
  94. package/packages/pm-linked-test-adapters/package.json +1 -1
  95. package/packages/pm-search-advanced/package.json +1 -1
  96. package/packages/pm-templates/package.json +1 -1
  97. package/packages/pm-todos/package.json +1 -1
  98. package/packages/pm-vcs/package.json +1 -1
  99. package/plugins/pm-claude/.claude-plugin/plugin.json +1 -1
  100. package/plugins/pm-codex/.codex-plugin/plugin.json +1 -1
  101. package/sdk/public-surface.json +197 -25
  102. package/dist/cli-bundle/chunks/chunk-QTO7USTH.js +0 -2
  103. package/dist/cli-bundle/focused-chunks/chunk-2AGZ5BRT.js +0 -2
  104. package/dist/cli-bundle/focused-chunks/chunk-AQ5IYEZZ.js +0 -2
  105. package/dist/cli-bundle/focused-chunks/chunk-YHWHX6YY.js +0 -2
@@ -0,0 +1,80 @@
1
+ /**
2
+ * @module sdk/cli-contracts/bootstrap-command-scanner
3
+ *
4
+ * Resolves command position from shell-free argv without loading CLI runtime
5
+ * normalization, error, filesystem, or item-addressing dependencies.
6
+ */
7
+ /** Global options that consume a following value when one is present. */
8
+
9
+ !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]="9d04e30a-caf5-59b4-8853-9df39c1728aa")}catch(e){}}();
10
+ export const GLOBAL_VALUE_CONSUMING_FLAGS = new Set([
11
+ "--pm-path",
12
+ "--path",
13
+ "--author",
14
+ "--output-include",
15
+ "--output-limit",
16
+ "--output-budget",
17
+ "--output-format",
18
+ "--output-session",
19
+ "--output-cursor",
20
+ ]);
21
+ /** Boolean global options ignored while locating the command token. */
22
+ export const BOOTSTRAP_BOOLEAN_FLAGS = new Set([
23
+ "--no-extensions",
24
+ "--no-pager",
25
+ "--json",
26
+ "--quiet",
27
+ "--lean",
28
+ "--token-accounting",
29
+ "--output-row-contract",
30
+ "--all",
31
+ ]);
32
+ /** Whether a global value-consuming flag uses its inline `--flag=value` form. */
33
+ export function isInlineGlobalValueToken(token) {
34
+ const equalsIndex = token.indexOf("=");
35
+ return (equalsIndex > 0 &&
36
+ GLOBAL_VALUE_CONSUMING_FLAGS.has(token.slice(0, equalsIndex)));
37
+ }
38
+ /** Whether a bootstrap value flag consumes its following token. */
39
+ export function consumesBootstrapValue(flag, next) {
40
+ if (typeof next !== "string")
41
+ return false;
42
+ return flag === "--path" || flag === "--pm-path" || !next.startsWith("-");
43
+ }
44
+ /**
45
+ * Locate the first command token after global flags and their values.
46
+ *
47
+ * A leading `--` terminates command discovery. Unknown flags are ignored so
48
+ * later command-specific validation can return the canonical diagnostic.
49
+ */
50
+ export function findBootstrapCommandTokenIndex(argv) {
51
+ for (let index = 0; index < argv.length; index += 1) {
52
+ const token = argv[index];
53
+ if (token === "--") {
54
+ return undefined;
55
+ }
56
+ if (GLOBAL_VALUE_CONSUMING_FLAGS.has(token)) {
57
+ index += consumesBootstrapValue(token, argv[index + 1]) ? 1 : 0;
58
+ continue;
59
+ }
60
+ if (isInlineGlobalValueToken(token) ||
61
+ BOOTSTRAP_BOOLEAN_FLAGS.has(token) ||
62
+ token === "--profile" ||
63
+ token === "--id-only" ||
64
+ token === "--explain") {
65
+ continue;
66
+ }
67
+ if (token.startsWith("-")) {
68
+ continue;
69
+ }
70
+ return index;
71
+ }
72
+ return undefined;
73
+ }
74
+ /** Resolve the normalized command name from shell-free invocation arguments. */
75
+ export function parseBootstrapCommandName(argv) {
76
+ const index = findBootstrapCommandTokenIndex(argv);
77
+ return index === undefined ? undefined : argv[index].trim().toLowerCase();
78
+ }
79
+ //# sourceMappingURL=bootstrap-command-scanner.js.map
80
+ //# debugId=9d04e30a-caf5-59b4-8853-9df39c1728aa
@@ -7,7 +7,7 @@
7
7
  * flag surface stays single-sourced across the CLI, SDK, and MCP boundaries.
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]="76fe6260-2386-52c5-8f94-aad48dec33f9")}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]="bd6c497f-9fb0-5c47-a677-9dd6636dba02")}catch(e){}}();
11
11
  import { normalizeUniqueStringList } from "./string-lists.js";
12
12
  import { RESERVED_EXTENSION_HOST_FLAGS } from "../../core/extensions/reserved-host-flags.js";
13
13
  import { PM_POSITIONAL_ACTION_CONTRACTS, } from "./grammar-contracts.js";
@@ -226,6 +226,7 @@ export const COMMENTS_FLAG_CONTRACTS = [
226
226
  { flag: "--delete" },
227
227
  { flag: "--limit" },
228
228
  { flag: "--full-history" },
229
+ { flag: "--if-absent", value_type: "boolean" },
229
230
  { flag: "--author" },
230
231
  { flag: "--message" },
231
232
  { flag: "--force" },
@@ -249,6 +250,7 @@ export const NOTES_FLAG_CONTRACTS = [
249
250
  { flag: "--event-type" },
250
251
  { flag: "--include-meta" },
251
252
  { flag: "--full-history" },
253
+ { flag: "--if-absent", value_type: "boolean" },
252
254
  { flag: "--author" },
253
255
  { flag: "--message" },
254
256
  { flag: "--force" },
@@ -259,6 +261,7 @@ export const LEARNINGS_FLAG_CONTRACTS = [
259
261
  { flag: "--add", aliases: ["--learning", "--text"] },
260
262
  { flag: "--limit" },
261
263
  { flag: "--full-history" },
264
+ { flag: "--if-absent", value_type: "boolean" },
262
265
  { flag: "--author" },
263
266
  { flag: "--message" },
264
267
  { flag: "--force" },
@@ -1912,4 +1915,4 @@ export function toCompletionFlagString(flagContracts, includeGlobal = true) {
1912
1915
  return normalizeUniqueStringList(all).join(" ");
1913
1916
  }
1914
1917
  //# sourceMappingURL=flag-contracts.js.map
1915
- //# debugId=76fe6260-2386-52c5-8f94-aad48dec33f9
1918
+ //# debugId=bd6c497f-9fb0-5c47-a677-9dd6636dba02
@@ -5,7 +5,7 @@
5
5
  * per-command growth budgets.
6
6
  */
7
7
 
8
- !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]="8320177c-e95d-5d14-a914-4ac37230c0b9")}catch(e){}}();
8
+ !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]="3466866d-8869-5ab6-b981-d084e7330aa5")}catch(e){}}();
9
9
  import { hasSubcommandFlagContractsForCommand, resolveSubcommandFlagContractsForCommand, } from "./flag-contracts.js";
10
10
  import { PM_COMMAND_CAPABILITY_CONTRACTS, } from "../agent-capability-contracts.js";
11
11
  import { enrichCliFlagInvocationContracts } from "../flag-invocation-contracts.js";
@@ -146,9 +146,9 @@ const PM_COMMAND_FLAG_BUDGET_MAXIMUMS = Object.freeze({
146
146
  "close-many": 72,
147
147
  delete: 24,
148
148
  append: 24,
149
- comments: 30,
150
- notes: 34,
151
- learnings: 26,
149
+ comments: 31,
150
+ notes: 35,
151
+ learnings: 27,
152
152
  files: 39,
153
153
  docs: 30,
154
154
  deps: 32,
@@ -337,4 +337,4 @@ export function renderPmFlagLexiconMarkdown() {
337
337
  ].join("\n");
338
338
  }
339
339
  //# sourceMappingURL=flag-lexicon-contracts.js.map
340
- //# debugId=8320177c-e95d-5d14-a914-4ac37230c0b9
340
+ //# debugId=3466866d-8869-5ab6-b981-d084e7330aa5
@@ -4,7 +4,7 @@
4
4
  * Defines SDK command-contract metadata for Tool Parameter Tables.
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]="2d43e788-cb8d-59b8-a447-4d24033bb55b")}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]="6968f481-8384-5e3b-8ac0-b0972d08eeb1")}catch(e){}}();
8
8
  import { PLAN_HARNESS_VALUES, PLAN_MODE_VALUES, PLAN_STEP_LINK_KIND_VALUES, PLAN_STEP_STATUS_VALUES, } from "../../types/index.js";
9
9
  import { PM_READ_OUTPUT_SESSION_MAX_SEEN_ITEM_IDS } from "../read-output-session.js";
10
10
  import { ASSURANCE_DEFINITION_SCHEMA } from "./schemas/assurance-definition.js";
@@ -499,6 +499,7 @@ export const PM_TOOL_PARAMETER_PROPERTIES = {
499
499
  noCheckpoint: { type: "boolean" },
500
500
  force: { type: "boolean" },
501
501
  ifAvailable: { type: "boolean" },
502
+ ifAbsent: { type: "boolean" },
502
503
  next: { type: "boolean" },
503
504
  maxAttempts: {
504
505
  anyOf: [
@@ -1266,6 +1267,9 @@ export const PM_TOOL_PARAMETER_METADATA = {
1266
1267
  message: {
1267
1268
  description: "History message for mutation audit trail.",
1268
1269
  },
1270
+ ifAbsent: {
1271
+ description: "For annotations, append only when no existing entry has the same resolved author and exact stored text; retries return changed false without a history event.",
1272
+ },
1269
1273
  assignee: {
1270
1274
  description: "Assignee identity.",
1271
1275
  },
@@ -2029,11 +2033,17 @@ export const PM_TOOL_ACTION_SCOPED_PARAMETER_METADATA = {
2029
2033
  full: {
2030
2034
  description: "Return the complete post-mutation comment history instead of the bounded mutation receipt projection.",
2031
2035
  },
2036
+ ifAbsent: {
2037
+ description: "Append a comment only when the resolved author and exact stored text are absent; a duplicate retry returns changed false without writing history.",
2038
+ },
2032
2039
  },
2033
2040
  notes: {
2034
2041
  full: {
2035
2042
  description: "Return the complete post-mutation note history instead of the bounded mutation receipt projection.",
2036
2043
  },
2044
+ ifAbsent: {
2045
+ description: "Append a note only when the resolved author and exact stored text are absent; a duplicate retry returns changed false without writing history.",
2046
+ },
2037
2047
  since: {
2038
2048
  description: "Inclusive ISO 8601 creation timestamp lower bound for structured note event filtering.",
2039
2049
  examples: ["2026-01-01T00:00:00.000Z"],
@@ -2043,6 +2053,9 @@ export const PM_TOOL_ACTION_SCOPED_PARAMETER_METADATA = {
2043
2053
  full: {
2044
2054
  description: "Return the complete post-mutation learning history instead of the bounded mutation receipt projection.",
2045
2055
  },
2056
+ ifAbsent: {
2057
+ description: "Append a learning only when the resolved author and exact stored text are absent; a duplicate retry returns changed false without writing history.",
2058
+ },
2046
2059
  },
2047
2060
  next: {
2048
2061
  tag: {
@@ -2128,4 +2141,4 @@ export const PM_TOOL_ACTION_SCOPED_PARAMETER_METADATA = {
2128
2141
  },
2129
2142
  };
2130
2143
  //# sourceMappingURL=tool-parameter-tables.js.map
2131
- //# debugId=2d43e788-cb8d-59b8-a447-4d24033bb55b
2144
+ //# debugId=6968f481-8384-5e3b-8ac0-b0972d08eeb1
@@ -91,7 +91,7 @@ export interface PmActionToolInputSchemaOptions {
91
91
  */
92
92
  export declare function buildPmActionToolInputSchema(action: PmToolAction, options?: PmActionToolInputSchemaOptions): Record<string, unknown>;
93
93
  /** Canonical version of the action-scoped strict MCP tool-parameters schema (`PM_TOOL_PARAMETERS_SCHEMA`). Exported as the single source of truth so the MCP server, the `pm contracts` command, SDK consumers, and contract tests bind to one version constant. Bump the patch/minor for additive, backward-compatible schema changes; bump the MAJOR for breaking changes — the major also drives the `$id` `tool-parameters-v{major}` slug, so the two never drift. */
94
- export declare const PM_TOOL_PARAMETERS_SCHEMA_VERSION: "4.9.0";
94
+ export declare const PM_TOOL_PARAMETERS_SCHEMA_VERSION: "4.10.1";
95
95
  /**
96
96
  * Major component of {@link PM_TOOL_PARAMETERS_SCHEMA_VERSION}, used to build the
97
97
  * schema `$id` slug so a breaking version bump renames the document in lockstep.
@@ -7,7 +7,7 @@
7
7
  * consumers from a single source of truth.
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]="0b302ca6-1333-532f-a55e-e8e984636456")}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]="91de08b8-ad0b-5c61-a272-3c18cd3f083b")}catch(e){}}();
11
11
  import { normalizeUniqueStringList } from "./string-lists.js";
12
12
  import { PM_TOOL_ACTIONS } from "./enum-contracts.js";
13
13
  import { TOOL_CREATE_OPTION_CONTRACTS, TOOL_SHARED_CREATE_UPDATE_OPTION_CONTRACTS, TOOL_UPDATE_OPTION_CONTRACTS, TOOL_UPDATE_MANY_FILTER_OPTION_CONTRACTS, TOOL_CONTEXT_OPTION_CONTRACTS, TOOL_ACTIVITY_OPTION_CONTRACTS, TOOL_LIST_FILTER_OPTION_CONTRACTS, TOOL_AGGREGATE_OPTION_CONTRACTS, TOOL_SEARCH_FILTER_OPTION_CONTRACTS, TOOL_CLOSE_MANY_FILTER_OPTION_CONTRACTS, } from "./tool-option-contracts.js";
@@ -850,8 +850,13 @@ const PM_TOOL_ACTION_SCHEMA_CONTRACTS = {
850
850
  "delete",
851
851
  "limit",
852
852
  "full",
853
+ "ifAbsent",
853
854
  ...AUTHOR_MESSAGE_FORCE_PARAMETER_KEYS,
854
855
  ],
856
+ mutuallyExclusive: [
857
+ ["edit", "ifAbsent"],
858
+ ["delete", "ifAbsent"],
859
+ ],
855
860
  },
856
861
  notes: {
857
862
  required: ["id"],
@@ -867,6 +872,7 @@ const PM_TOOL_ACTION_SCHEMA_CONTRACTS = {
867
872
  "eventType",
868
873
  "includeMeta",
869
874
  "full",
875
+ "ifAbsent",
870
876
  ...AUTHOR_MESSAGE_FORCE_PARAMETER_KEYS,
871
877
  ],
872
878
  mutuallyExclusive: [
@@ -875,6 +881,8 @@ const PM_TOOL_ACTION_SCHEMA_CONTRACTS = {
875
881
  ["addJson", "file"],
876
882
  ["addJson", "edit"],
877
883
  ["addJson", "delete"],
884
+ ["edit", "ifAbsent"],
885
+ ["delete", "ifAbsent"],
878
886
  ],
879
887
  },
880
888
  learnings: {
@@ -887,8 +895,13 @@ const PM_TOOL_ACTION_SCHEMA_CONTRACTS = {
887
895
  "delete",
888
896
  "limit",
889
897
  "full",
898
+ "ifAbsent",
890
899
  ...AUTHOR_MESSAGE_FORCE_PARAMETER_KEYS,
891
900
  ],
901
+ mutuallyExclusive: [
902
+ ["edit", "ifAbsent"],
903
+ ["delete", "ifAbsent"],
904
+ ],
892
905
  },
893
906
  files: {
894
907
  required: [],
@@ -1534,7 +1547,7 @@ function createLazyContractSchema(build) {
1534
1547
  });
1535
1548
  }
1536
1549
  /** Canonical version of the action-scoped strict MCP tool-parameters schema (`PM_TOOL_PARAMETERS_SCHEMA`). Exported as the single source of truth so the MCP server, the `pm contracts` command, SDK consumers, and contract tests bind to one version constant. Bump the patch/minor for additive, backward-compatible schema changes; bump the MAJOR for breaking changes — the major also drives the `$id` `tool-parameters-v{major}` slug, so the two never drift. */
1537
- export const PM_TOOL_PARAMETERS_SCHEMA_VERSION = "4.9.0";
1550
+ export const PM_TOOL_PARAMETERS_SCHEMA_VERSION = "4.10.1";
1538
1551
  /**
1539
1552
  * Major component of {@link PM_TOOL_PARAMETERS_SCHEMA_VERSION}, used to build the
1540
1553
  * schema `$id` slug so a breaking version bump renames the document in lockstep.
@@ -1616,4 +1629,4 @@ export const _testOnlyCliContracts = {
1616
1629
  withFlagAliasMetadata,
1617
1630
  };
1618
1631
  //# sourceMappingURL=tool-schema.js.map
1619
- //# debugId=0b302ca6-1333-532f-a55e-e8e984636456
1632
+ //# debugId=91de08b8-ad0b-5c61-a272-3c18cd3f083b
@@ -19,6 +19,8 @@ export interface CommentsCommandOptions {
19
19
  includeMeta?: boolean;
20
20
  /** Return complete comment history after a mutation instead of a bounded receipt. */
21
21
  fullHistory?: boolean;
22
+ /** Append only when no comment has the same resolved author and text. */
23
+ ifAbsent?: boolean;
22
24
  /** Value that configures or reports author for this contract. */
23
25
  author?: string;
24
26
  /** Human-readable explanation suitable for logs and agent-facing output. */
@@ -46,6 +48,8 @@ export interface CommentsResult {
46
48
  mutation_receipt?: AnnotationMutationReceipt;
47
49
  /** Declares whether older comments were withheld from a mutation response. */
48
50
  omission_receipt?: AnnotationOmissionReceipt;
51
+ /** Whether a requested mutation changed persisted state. */
52
+ changed?: boolean;
49
53
  }
50
54
  /** Implements run comments for the public runtime surface of this module. */
51
55
  export declare function runComments(id: string, options: CommentsCommandOptions, global: GlobalOptions): Promise<CommentsResult>;
@@ -4,7 +4,7 @@
4
4
  * Implements the pm comments command surface and its agent-facing runtime behavior.
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]="5167b367-26cf-52d5-8040-bb001ce3592a")}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]="f761d37b-28df-5176-9e25-762f57aa0abf")}catch(e){}}();
8
8
  import { isFileAbsentError } from "../core/fs/fs-utils.js";
9
9
  import { readFile } from "node:fs/promises";
10
10
  import { EXIT_CODE, PmCliError, createStdinTokenResolver, shouldResolveMutationStdinTokens, } from "./runtime-primitives.js";
@@ -131,4 +131,4 @@ export async function runComments(id, options, global) {
131
131
  });
132
132
  }
133
133
  //# sourceMappingURL=comments.js.map
134
- //# debugId=5167b367-26cf-52d5-8040-bb001ce3592a
134
+ //# debugId=f761d37b-28df-5176-9e25-762f57aa0abf
@@ -4,7 +4,7 @@
4
4
  * Implements the pm completion command surface and its agent-facing runtime behavior.
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]="c8446891-4e65-54c3-9826-eb40f4922f3b")}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]="4bf2b42b-91f3-5850-b1f1-d8a01525860c")}catch(e){}}();
8
8
  import { EXIT_CODE, PmCliError } from "./runtime-primitives.js";
9
9
  import { listPmCommandsForTier } from "./agent-capability-contracts.js";
10
10
  import { SCAFFOLD_CAPABILITIES } from "./extension/scaffold.js";
@@ -601,13 +601,13 @@ export function generateBashScript(itemTypes = [], tags = [], eagerTagExpansion
601
601
  ` COMPREPLY=(${compgen(`${PACKAGE_LIFECYCLE_ACTIONS} ${PACKAGE_LIFECYCLE_FLAGS} ${UPGRADE_FLAGS}`)})`,
602
602
  " ;;",
603
603
  " comments)",
604
- ` COMPREPLY=(${compgen("--add --body --stdin --file --edit --delete --limit --full-history --author --message --force --json --quiet --no-changed-fields --pm-path --path --no-extensions --no-pager --profile --help")})`,
604
+ ` COMPREPLY=(${compgen("--add --body --stdin --file --edit --delete --limit --full-history --if-absent --author --message --force --json --quiet --no-changed-fields --pm-path --path --no-extensions --no-pager --profile --help")})`,
605
605
  " ;;",
606
606
  " notes)",
607
- ` COMPREPLY=(${compgen("--add --add-json --stdin --file --edit --delete --limit --since --event-type --include-meta --full-history --author --message --force --json --quiet --no-changed-fields --pm-path --path --no-extensions --no-pager --profile --help")})`,
607
+ ` COMPREPLY=(${compgen("--add --add-json --stdin --file --edit --delete --limit --since --event-type --include-meta --full-history --if-absent --author --message --force --json --quiet --no-changed-fields --pm-path --path --no-extensions --no-pager --profile --help")})`,
608
608
  " ;;",
609
609
  " learnings)",
610
- ` COMPREPLY=(${compgen("--add --stdin --file --edit --delete --limit --full-history --author --message --force --json --quiet --no-changed-fields --pm-path --path --no-extensions --no-pager --profile --help")})`,
610
+ ` COMPREPLY=(${compgen("--add --stdin --file --edit --delete --limit --full-history --if-absent --author --message --force --json --quiet --no-changed-fields --pm-path --path --no-extensions --no-pager --profile --help")})`,
611
611
  " ;;",
612
612
  " files)",
613
613
  ` COMPREPLY=(${compgen("discover lookup --add --add-glob --remove --migrate --list --apply --note --append-stable --validate-paths --scope --limit --offset --no-truncate --strict-read --explain --lines --decision-depth --author --message --force --json --quiet --no-changed-fields --pm-path --path --no-extensions --no-pager --profile --help")})`,
@@ -1370,6 +1370,7 @@ ${zshSearchRuntimeFieldFlags} '--json[Output JSON]' \\
1370
1370
  '--delete[Delete the comment at 1-based index]:index' \\
1371
1371
  '--limit[Return only latest n entries]:number' \\
1372
1372
  '--full-history[Return complete post-mutation history]' \\
1373
+ '--if-absent[Append only when the resolved author and text are absent]' \\
1373
1374
  '--author[Entry author (falls back to PM_AUTHOR/settings)]:author' \\
1374
1375
  '--message[History message]:message' \\
1375
1376
  '--force[Force override]' \\
@@ -1390,6 +1391,7 @@ ${zshSearchRuntimeFieldFlags} '--json[Output JSON]' \\
1390
1391
  '--event-type[Return structured events with this top-level type]:event_type' \\
1391
1392
  '--include-meta[Include result counts and truncation metadata]' \\
1392
1393
  '--full-history[Return complete post-mutation history]' \\
1394
+ '--if-absent[Append only when the resolved author and text are absent]' \\
1393
1395
  '--author[Entry author (falls back to PM_AUTHOR/settings)]:author' \\
1394
1396
  '--message[History message]:message' \\
1395
1397
  '--force[Force override]' \\
@@ -1406,6 +1408,7 @@ ${zshSearchRuntimeFieldFlags} '--json[Output JSON]' \\
1406
1408
  '--delete[Delete the entry at a 1-based index]:index' \\
1407
1409
  '--limit[Return only latest n entries]:number' \\
1408
1410
  '--full-history[Return complete post-mutation history]' \\
1411
+ '--if-absent[Append only when the resolved author and text are absent]' \\
1409
1412
  '--author[Entry author (falls back to PM_AUTHOR/settings)]:author' \\
1410
1413
  '--message[History message]:message' \\
1411
1414
  '--force[Force override]' \\
@@ -2452,6 +2455,7 @@ complete -c pm -n '__fish_seen_subcommand_from comments' -l stdin -d 'Read comme
2452
2455
  complete -c pm -n '__fish_seen_subcommand_from comments' -l file -d 'Read comment text from file (supports multiline markdown)' -r
2453
2456
  complete -c pm -n '__fish_seen_subcommand_from comments' -l edit -d 'Replace the comment at 1-based index (text from positional/--add/--stdin/--file)' -r
2454
2457
  complete -c pm -n '__fish_seen_subcommand_from comments' -l delete -d 'Delete the comment at 1-based index' -r
2458
+ complete -c pm -n '__fish_seen_subcommand_from comments notes learnings' -l if-absent -d 'Append only when the resolved author and text are absent'
2455
2459
  complete -c pm -n '__fish_seen_subcommand_from notes' -l stdin -d 'Read entry text from stdin'
2456
2460
  complete -c pm -n '__fish_seen_subcommand_from notes' -l file -d 'Read entry text from file' -r
2457
2461
  complete -c pm -n '__fish_seen_subcommand_from notes' -l edit -d 'Replace the entry at a 1-based index' -r
@@ -2794,4 +2798,4 @@ export function runCompletion(shell, itemTypes = [], tags = [], eagerTagExpansio
2794
2798
  };
2795
2799
  }
2796
2800
  //# sourceMappingURL=completion.js.map
2797
- //# debugId=c8446891-4e65-54c3-9826-eb40f4922f3b
2801
+ //# debugId=4bf2b42b-91f3-5850-b1f1-d8a01525860c
@@ -13,6 +13,7 @@ export * from "./flag-invocation-contracts.js";
13
13
  export * from "./cli-contracts/flag-lexicon-contracts.js";
14
14
  export * from "./output-token-accounting.js";
15
15
  export * from "./output-contracts.js";
16
+ export * from "./agent/task-transcript-contracts.js";
16
17
  export * from "./read-output-contracts.js";
17
18
  export * from "./agent/refusal-closure.js";
18
19
  export * from "./agent/closed-domain-contracts.js";
@@ -4,7 +4,7 @@
4
4
  * Exposes command and action contract data without loading SDK runtime code.
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]="8bdc03e5-c5cd-5842-b438-cf7bc79863f0")}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]="b47a3cc6-caba-5de8-8813-a4e6112dbe61")}catch(e){}}();
8
8
  export * from "./cli-contracts.js";
9
9
  export * from "./cli-contracts/grammar-contracts.js";
10
10
  export * from "./cli-contracts/command-exit-contracts.js";
@@ -15,9 +15,10 @@ export * from "./flag-invocation-contracts.js";
15
15
  export * from "./cli-contracts/flag-lexicon-contracts.js";
16
16
  export * from "./output-token-accounting.js";
17
17
  export * from "./output-contracts.js";
18
+ export * from "./agent/task-transcript-contracts.js";
18
19
  export * from "./read-output-contracts.js";
19
20
  export * from "./agent/refusal-closure.js";
20
21
  export * from "./agent/closed-domain-contracts.js";
21
22
  export * from "./agent/tracker-preflight-contracts.js";
22
23
  //# sourceMappingURL=contracts.js.map
23
- //# debugId=8bdc03e5-c5cd-5842-b438-cf7bc79863f0
24
+ //# debugId=b47a3cc6-caba-5de8-8813-a4e6112dbe61
@@ -107,6 +107,12 @@ export declare function wrapNpmPackResolutionError(spec: string, error: unknown)
107
107
  declare function resolveNpmPackSpec(spec: string): Promise<string>;
108
108
  /** Implements normalize npm local file alias spec for the public runtime surface of this module. */
109
109
  export declare function normalizeNpmLocalFileAliasSpec(spec: string, cwd?: string): string;
110
+ /**
111
+ * Parse npm pack output and bind the reported artifact to its isolated target.
112
+ *
113
+ * Supports current JSON metadata and the legacy filename-only form while
114
+ * refusing absolute or traversing results before the filesystem is consulted.
115
+ */
110
116
  declare function parsePackedNpmPackage(stdout: string, packDirectory: string): {
111
117
  tarball: string;
112
118
  package?: string;
@@ -118,6 +124,13 @@ declare function resolveNpmSourceDirectory(source: NpmInstallSource): Promise<{
118
124
  version?: string;
119
125
  cleanup: () => Promise<void>;
120
126
  }>;
127
+ /**
128
+ * Resolve an npm source with an injectable, argv-safe package-manager runner.
129
+ *
130
+ * Local package directories remain in place, while local and registry archives
131
+ * share the same bounded validation, dependency installation, and cleanup
132
+ * contract. Registry artifacts must also exist inside the requested pack root.
133
+ */
121
134
  declare function resolveNpmSourceDirectoryWithRunner(source: NpmInstallSource, npmRunner: typeof runNpmCommand): Promise<{
122
135
  directory: string;
123
136
  package?: string;
@@ -4,7 +4,7 @@
4
4
  * Implements extension package-management support for Install Sources.
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]="89b84412-aa15-5868-95b3-c8d898b1f480")}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]="404342eb-68ab-5b7d-9a5a-ade1c8e98546")}catch(e){}}();
8
8
  import { execFile } from "node:child_process";
9
9
  import fs from "node:fs/promises";
10
10
  import os from "node:os";
@@ -397,38 +397,63 @@ export function normalizeNpmLocalFileAliasSpec(spec, cwd = process.cwd()) {
397
397
  : decodedPath;
398
398
  return `${packageName}@${nativePath}`;
399
399
  }
400
+ /**
401
+ * Parse npm pack output and bind the reported artifact to its isolated target.
402
+ *
403
+ * Supports current JSON metadata and the legacy filename-only form while
404
+ * refusing absolute or traversing results before the filesystem is consulted.
405
+ */
400
406
  function parsePackedNpmPackage(stdout, packDirectory) {
407
+ let parsed;
401
408
  try {
402
- const parsed = JSON.parse(stdout);
403
- const first = Array.isArray(parsed) ? parsed[0] : undefined;
404
- if (first &&
405
- typeof first.filename === "string" &&
406
- first.filename.trim().length > 0) {
407
- return {
408
- tarball: path.resolve(packDirectory, first.filename),
409
- package: typeof first.name === "string" ? first.name : undefined,
410
- version: typeof first.version === "string" ? first.version : undefined,
411
- };
412
- }
409
+ parsed = JSON.parse(stdout);
413
410
  }
414
411
  catch {
415
412
  // Fall back to the last stdout line for older npm output.
416
413
  }
417
- const lastLine = stdout
418
- .split(/\r?\n/)
419
- .map((line) => line.trim())
420
- .filter((line) => line.length > 0)
421
- .at(-1);
422
- if (!lastLine) {
414
+ const first = Array.isArray(parsed)
415
+ ? parsed[0]
416
+ : undefined;
417
+ const filename = first &&
418
+ typeof first.filename === "string" &&
419
+ first.filename.trim().length > 0
420
+ ? first.filename
421
+ : stdout
422
+ .split(/\r?\n/)
423
+ .map((line) => line.trim())
424
+ .filter((line) => line.length > 0)
425
+ .at(-1);
426
+ if (!filename) {
423
427
  throw new PmCliError("npm pack did not report a tarball filename.", EXIT_CODE.GENERIC_FAILURE);
424
428
  }
429
+ const tarball = path.resolve(packDirectory, filename);
430
+ const relativeTarball = path.relative(packDirectory, tarball);
431
+ if (relativeTarball.length === 0 ||
432
+ relativeTarball === ".." ||
433
+ relativeTarball.startsWith(`..${path.sep}`) ||
434
+ path.isAbsolute(relativeTarball)) {
435
+ throw new PmCliError("npm pack reported a package archive outside its isolated destination.", EXIT_CODE.GENERIC_FAILURE, {
436
+ code: "npm_package_archive_unsafe",
437
+ required: "Retry with a trusted npm client that writes its archive inside the requested pack destination.",
438
+ why: "pm will not read a package-manager artifact outside the isolated directory created for this install.",
439
+ });
440
+ }
425
441
  return {
426
- tarball: path.resolve(packDirectory, lastLine),
442
+ tarball,
443
+ package: typeof first?.name === "string" ? first.name : undefined,
444
+ version: typeof first?.version === "string" ? first.version : undefined,
427
445
  };
428
446
  }
429
447
  async function resolveNpmSourceDirectory(source) {
430
448
  return resolveNpmSourceDirectoryWithRunner(source, runNpmCommand);
431
449
  }
450
+ /**
451
+ * Resolve an npm source with an injectable, argv-safe package-manager runner.
452
+ *
453
+ * Local package directories remain in place, while local and registry archives
454
+ * share the same bounded validation, dependency installation, and cleanup
455
+ * contract. Registry artifacts must also exist inside the requested pack root.
456
+ */
432
457
  async function resolveNpmSourceDirectoryWithRunner(source, npmRunner) {
433
458
  const localPackageRoot = await resolveLocalNpmPackagePath(source.spec);
434
459
  if (localPackageRoot) {
@@ -451,9 +476,7 @@ async function resolveNpmSourceDirectoryWithRunner(source, npmRunner) {
451
476
  }
452
477
  const tempRoot = await fs.mkdtemp(path.join(os.tmpdir(), "pm-npm-package-source-"));
453
478
  const packDirectory = path.join(tempRoot, "pack");
454
- const extractDirectory = path.join(tempRoot, "extract");
455
479
  await fs.mkdir(packDirectory, { recursive: true });
456
- await fs.mkdir(extractDirectory, { recursive: true });
457
480
  try {
458
481
  const packSpec = await resolveNpmPackSpec(source.spec);
459
482
  const packStdout = await npmRunner([
@@ -464,16 +487,25 @@ async function resolveNpmSourceDirectoryWithRunner(source, npmRunner) {
464
487
  packDirectory,
465
488
  ]);
466
489
  const packed = parsePackedNpmPackage(packStdout, packDirectory);
467
- await execFileAsync("tar", ["-xzf", packed.tarball, "-C", extractDirectory], { encoding: "utf8" });
468
- const packageRoot = path.join(extractDirectory, "package");
469
- await installNpmPackageRuntimeDependencies(packageRoot);
470
- const directory = await resolvePackageExtensionDirectory(packageRoot, source.input);
490
+ if (!(await pathExists(packed.tarball))) {
491
+ throw new PmCliError("npm pack did not create its reported package archive.", EXIT_CODE.GENERIC_FAILURE, {
492
+ code: "npm_package_archive_missing",
493
+ required: "Retry the npm package install with a healthy registry and writable temporary directory.",
494
+ why: "The package manager reported a tarball filename that was absent before validation, so pm cannot safely extract or install it.",
495
+ });
496
+ }
497
+ const extracted = await extractLocalPackageArchive(packed.tarball);
471
498
  return {
472
- directory,
473
- package: packed.package,
474
- version: packed.version,
499
+ directory: extracted.directory,
500
+ package: packed.package ?? extracted.package,
501
+ version: packed.version ?? extracted.version,
475
502
  cleanup: async () => {
476
- await fs.rm(tempRoot, { recursive: true, force: true });
503
+ try {
504
+ await extracted.cleanup();
505
+ }
506
+ finally {
507
+ await fs.rm(tempRoot, { recursive: true, force: true });
508
+ }
477
509
  },
478
510
  };
479
511
  }
@@ -962,4 +994,4 @@ export const _testOnlyInstallSources = {
962
994
  runNpmCommand,
963
995
  };
964
996
  //# sourceMappingURL=install-sources.js.map
965
- //# debugId=89b84412-aa15-5868-95b3-c8d898b1f480
997
+ //# debugId=404342eb-68ab-5b7d-9a5a-ade1c8e98546
@@ -1,6 +1,6 @@
1
1
  /** Generated partition 1 of the exhaustive error-code catalog. */
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]="c51fce27-5acd-513d-83c4-5fd75bd999f9")}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]="95253070-db43-5ddd-8468-7d001bc6657b")}catch(e){}}();
4
4
  export const PM_ERROR_CODE_CATALOG_PART_1 = [
5
5
  {
6
6
  code: "acceptance_criteria_mutation_conflict",
@@ -122,6 +122,18 @@ export const PM_ERROR_CODE_CATALOG_PART_1 = [
122
122
  canonical_code: "annotation_flag_like_value",
123
123
  aliases: [],
124
124
  },
125
+ {
126
+ code: "annotation_if_absent_without_append",
127
+ meaning: "Annotation if absent without append condition.",
128
+ stability: "provisional",
129
+ exit_code: 2,
130
+ class: "usage",
131
+ recovery: "Inspect the structured error guidance and retry the suggested command.",
132
+ sources: ["sdk/annotations.ts"],
133
+ emitting_commands: ["*"],
134
+ canonical_code: "annotation_if_absent_without_append",
135
+ aliases: [],
136
+ },
125
137
  {
126
138
  code: "annotation_message_without_text",
127
139
  meaning: "Annotation message without text condition.",
@@ -2088,6 +2100,18 @@ export const PM_ERROR_CODE_CATALOG_PART_1 = [
2088
2100
  canonical_code: "merge_root_not_found",
2089
2101
  aliases: [],
2090
2102
  },
2103
+ {
2104
+ code: "missing_allowed_values",
2105
+ meaning: "Missing allowed values condition.",
2106
+ stability: "provisional",
2107
+ exit_code: 1,
2108
+ class: "generic_failure",
2109
+ recovery: "Inspect the structured error guidance and retry the suggested command.",
2110
+ sources: ["sdk/agent/refusal-closure.ts"],
2111
+ emitting_commands: ["*"],
2112
+ canonical_code: "missing_allowed_values",
2113
+ aliases: [],
2114
+ },
2091
2115
  ];
2092
2116
  //# sourceMappingURL=generated-error-code-catalog-part-1.js.map
2093
- //# debugId=c51fce27-5acd-513d-83c4-5fd75bd999f9
2117
+ //# debugId=95253070-db43-5ddd-8468-7d001bc6657b