@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.
- package/.claude-plugin/marketplace.json +2 -2
- package/CHANGELOG.md +25 -1
- package/dist/cli/error-guidance.js +61 -7
- package/dist/cli/register-annotations.js +58 -41
- package/dist/cli-bundle/bundle-manifest.json +121 -121
- package/dist/cli-bundle/chunks/{chunk-SH6P7FXI.js → chunk-BY2FQ2NI.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-TNX6HC54.js → chunk-E73FDIWT.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-SHMDY36D.js → chunk-FEVBFFCQ.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-CVBBGWW5.js → chunk-M7OXRQE3.js} +10 -6
- package/dist/cli-bundle/chunks/{chunk-R4ETAOJC.js → chunk-NBCBFVZI.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-SKXLJIEK.js → chunk-NTXZHRKA.js} +45 -45
- package/dist/cli-bundle/chunks/{chunk-52EKTW6V.js → chunk-QE6WQXFO.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-MFNTKMTI.js → chunk-TIQ6AMH2.js} +2 -2
- package/dist/cli-bundle/chunks/chunk-X2RROGZE.js +2 -0
- package/dist/cli-bundle/chunks/{chunk-OS27HHBN.js → chunk-XRVVYRRO.js} +28 -28
- package/dist/cli-bundle/chunks/{chunk-3OO3W6FW.js → chunk-XWEQGHHG.js} +2 -2
- package/dist/cli-bundle/chunks/{register-list-query-EUWM6VII.js → register-list-query-J35ZPQQ5.js} +2 -2
- package/dist/cli-bundle/chunks/{register-mutation-FD4HSAVU.js → register-mutation-J6XJJOGU.js} +4 -4
- package/dist/cli-bundle/chunks/{register-operations-HRMNFEC3.js → register-operations-AE3JEMFT.js} +2 -2
- package/dist/cli-bundle/chunks/{register-setup-33GNICLX.js → register-setup-OQERLLWE.js} +2 -2
- package/dist/cli-bundle/focused-chunks/{chunk-4BR5UU52.js → chunk-4ZDRZYYJ.js} +41 -41
- package/dist/cli-bundle/focused-chunks/{chunk-MXTYGECH.js → chunk-AHAM2HAU.js} +2 -2
- package/dist/cli-bundle/focused-chunks/{chunk-SUBSWYW3.js → chunk-JZYPPMXF.js} +2 -2
- package/dist/cli-bundle/focused-chunks/chunk-LLNTHF5X.js +2 -0
- package/dist/cli-bundle/focused-chunks/chunk-LYFWQMVC.js +2 -0
- package/dist/cli-bundle/focused-chunks/{chunk-EKX37ZHA.js → chunk-THEPQMLX.js} +2 -2
- package/dist/cli-bundle/focused-chunks/chunk-YJLDHJOD.js +2 -0
- package/dist/cli-bundle/main.js +14 -14
- package/dist/cli-bundle/sdk-authoring.js +1 -1
- package/dist/cli-bundle/sdk-contracts.js +2 -2
- package/dist/cli-bundle/sdk-core.js +26 -26
- package/dist/cli-bundle/sdk-governance.js +1 -1
- package/dist/cli-bundle/sdk-merge.js +20 -20
- package/dist/cli-bundle/sdk-query.js +1 -1
- package/dist/cli-bundle/sdk-runtime.js +1 -1
- package/dist/cli-bundle/sdk-testing.js +1 -1
- package/dist/cli-bundle/sdk.js +10 -10
- package/dist/mcp/tool-definitions.js +5 -5
- package/dist/sdk/agent/command-recovery.js +3 -3
- package/dist/sdk/agent/task-transcript-contracts.d.ts +52 -0
- package/dist/sdk/agent/task-transcript-contracts.js +198 -0
- package/dist/sdk/annotations.d.ts +5 -2
- package/dist/sdk/annotations.js +66 -36
- package/dist/sdk/cli-bootstrap.d.ts +2 -8
- package/dist/sdk/cli-bootstrap.js +7 -67
- package/dist/sdk/cli-contracts/bootstrap-command-scanner.d.ts +23 -0
- package/dist/sdk/cli-contracts/bootstrap-command-scanner.js +80 -0
- package/dist/sdk/cli-contracts/flag-contracts.js +5 -2
- package/dist/sdk/cli-contracts/flag-lexicon-contracts.js +5 -5
- package/dist/sdk/cli-contracts/tool-parameter-tables.js +15 -2
- package/dist/sdk/cli-contracts/tool-schema.d.ts +1 -1
- package/dist/sdk/cli-contracts/tool-schema.js +16 -3
- package/dist/sdk/comments.d.ts +4 -0
- package/dist/sdk/comments.js +2 -2
- package/dist/sdk/completion.js +9 -5
- package/dist/sdk/contracts.d.ts +1 -0
- package/dist/sdk/contracts.js +3 -2
- package/dist/sdk/extension/install-sources.d.ts +13 -0
- package/dist/sdk/extension/install-sources.js +62 -30
- package/dist/sdk/generated/generated-error-code-catalog-part-1.js +26 -2
- package/dist/sdk/generated/generated-error-code-catalog-part-2.js +26 -14
- package/dist/sdk/index.d.ts +1 -0
- package/dist/sdk/index.js +3 -2
- package/dist/sdk/learnings.d.ts +4 -0
- package/dist/sdk/learnings.js +7 -4
- package/dist/sdk/lifecycle/close.js +4 -3
- package/dist/sdk/notes.d.ts +4 -0
- package/dist/sdk/notes.js +2 -2
- package/dist/sdk/runtime-input.js +5 -2
- package/dist/sdk/runtime.d.ts +6 -6
- package/dist/sdk/runtime.js +8 -8
- package/docs/COMMANDS.md +4 -3
- package/docs/OUTPUT_TOKEN_ACCOUNTING.md +20 -7
- package/docs/RELEASING.md +9 -1
- package/docs/SDK.md +12 -0
- package/docs/SDK_CONTEXT_INTEGRITY.md +12 -1
- package/docs/SDK_RUNTIME_BOUNDARIES.md +10 -0
- package/docs/TESTING.md +6 -2
- package/docs/agent-task-token-baseline.json +97 -11
- package/docs/agent-task-transcripts.json +211 -0
- package/docs/generated/FLAG_LEXICON_BUDGETS.md +3 -3
- package/docs/generated/REFUSAL_CLOSURE_CENSUS.md +6 -3
- package/docs/performance/cli-transport-overhead.md +10 -2
- package/marketplace.json +2 -2
- package/package.json +2 -2
- package/packages/pm-beads/package.json +1 -1
- package/packages/pm-calendar/package.json +1 -1
- package/packages/pm-command-kit/package.json +1 -1
- package/packages/pm-digital-twin/package.json +1 -1
- package/packages/pm-governance-audit/package.json +1 -1
- package/packages/pm-guide-shell/package.json +1 -1
- package/packages/pm-kanban/package.json +1 -1
- package/packages/pm-lifecycle-hooks/package.json +1 -1
- package/packages/pm-linked-test-adapters/package.json +1 -1
- package/packages/pm-search-advanced/package.json +1 -1
- package/packages/pm-templates/package.json +1 -1
- package/packages/pm-todos/package.json +1 -1
- package/packages/pm-vcs/package.json +1 -1
- package/plugins/pm-claude/.claude-plugin/plugin.json +1 -1
- package/plugins/pm-codex/.codex-plugin/plugin.json +1 -1
- package/sdk/public-surface.json +197 -25
- package/dist/cli-bundle/chunks/chunk-QTO7USTH.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-2AGZ5BRT.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-AQ5IYEZZ.js +0 -2
- 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]="
|
|
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=
|
|
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]="
|
|
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:
|
|
150
|
-
notes:
|
|
151
|
-
learnings:
|
|
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=
|
|
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]="
|
|
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=
|
|
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.
|
|
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]="
|
|
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.
|
|
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=
|
|
1632
|
+
//# debugId=91de08b8-ad0b-5c61-a272-3c18cd3f083b
|
package/dist/sdk/comments.d.ts
CHANGED
|
@@ -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>;
|
package/dist/sdk/comments.js
CHANGED
|
@@ -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]="
|
|
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=
|
|
134
|
+
//# debugId=f761d37b-28df-5176-9e25-762f57aa0abf
|
package/dist/sdk/completion.js
CHANGED
|
@@ -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]="
|
|
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=
|
|
2801
|
+
//# debugId=4bf2b42b-91f3-5850-b1f1-d8a01525860c
|
package/dist/sdk/contracts.d.ts
CHANGED
|
@@ -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";
|
package/dist/sdk/contracts.js
CHANGED
|
@@ -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]="
|
|
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=
|
|
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]="
|
|
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
|
-
|
|
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
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
.
|
|
422
|
-
|
|
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
|
|
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
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
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
|
-
|
|
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=
|
|
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]="
|
|
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=
|
|
2117
|
+
//# debugId=95253070-db43-5ddd-8468-7d001bc6657b
|