@unbrained/pm-cli 2026.5.24 → 2026.5.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/CHANGELOG.md +953 -522
- package/README.md +2 -10
- package/dist/cli/bootstrap-args.d.ts +18 -1
- package/dist/cli/bootstrap-args.js +143 -3
- package/dist/cli/bootstrap-args.js.map +1 -1
- package/dist/cli/commander-usage.js +134 -11
- package/dist/cli/commander-usage.js.map +1 -1
- package/dist/cli/commands/append.js +4 -3
- package/dist/cli/commands/append.js.map +1 -1
- package/dist/cli/commands/claim.js +5 -4
- package/dist/cli/commands/claim.js.map +1 -1
- package/dist/cli/commands/close.d.ts +3 -0
- package/dist/cli/commands/close.js +26 -3
- package/dist/cli/commands/close.js.map +1 -1
- package/dist/cli/commands/completion.d.ts +2 -2
- package/dist/cli/commands/completion.js +109 -56
- package/dist/cli/commands/completion.js.map +1 -1
- package/dist/cli/commands/config.d.ts +1 -1
- package/dist/cli/commands/config.js +82 -4
- package/dist/cli/commands/config.js.map +1 -1
- package/dist/cli/commands/create.js +7 -272
- package/dist/cli/commands/create.js.map +1 -1
- package/dist/cli/commands/delete.js +4 -3
- package/dist/cli/commands/delete.js.map +1 -1
- package/dist/cli/commands/docs.d.ts +1 -12
- package/dist/cli/commands/docs.js +8 -312
- package/dist/cli/commands/docs.js.map +1 -1
- package/dist/cli/commands/extension/bundled-catalog.d.ts +14 -0
- package/dist/cli/commands/extension/bundled-catalog.js +268 -0
- package/dist/cli/commands/extension/bundled-catalog.js.map +1 -0
- package/dist/cli/commands/extension/doctor.d.ts +31 -0
- package/dist/cli/commands/extension/doctor.js +345 -0
- package/dist/cli/commands/extension/doctor.js.map +1 -0
- package/dist/cli/commands/extension/install-sources.d.ts +37 -0
- package/dist/cli/commands/extension/install-sources.js +384 -0
- package/dist/cli/commands/extension/install-sources.js.map +1 -0
- package/dist/cli/commands/extension/managed-state.d.ts +48 -0
- package/dist/cli/commands/extension/managed-state.js +172 -0
- package/dist/cli/commands/extension/managed-state.js.map +1 -0
- package/dist/cli/commands/extension/scaffold.d.ts +14 -0
- package/dist/cli/commands/extension/scaffold.js +202 -0
- package/dist/cli/commands/extension/scaffold.js.map +1 -0
- package/dist/cli/commands/extension/shared.d.ts +14 -0
- package/dist/cli/commands/extension/shared.js +106 -0
- package/dist/cli/commands/extension/shared.js.map +1 -0
- package/dist/cli/commands/extension.d.ts +36 -68
- package/dist/cli/commands/extension.js +143 -1422
- package/dist/cli/commands/extension.js.map +1 -1
- package/dist/cli/commands/files.d.ts +1 -12
- package/dist/cli/commands/files.js +11 -308
- package/dist/cli/commands/files.js.map +1 -1
- package/dist/cli/commands/get.js +4 -3
- package/dist/cli/commands/get.js.map +1 -1
- package/dist/cli/commands/health.js +17 -3
- package/dist/cli/commands/health.js.map +1 -1
- package/dist/cli/commands/history-redact.js +23 -18
- package/dist/cli/commands/history-redact.js.map +1 -1
- package/dist/cli/commands/history-repair.js +24 -18
- package/dist/cli/commands/history-repair.js.map +1 -1
- package/dist/cli/commands/legacy-none-tokens.d.ts +3 -0
- package/dist/cli/commands/legacy-none-tokens.js +39 -0
- package/dist/cli/commands/legacy-none-tokens.js.map +1 -0
- package/dist/cli/commands/linked-artifacts.d.ts +96 -0
- package/dist/cli/commands/linked-artifacts.js +335 -0
- package/dist/cli/commands/linked-artifacts.js.map +1 -0
- package/dist/cli/commands/linked-test-parsers.d.ts +28 -0
- package/dist/cli/commands/linked-test-parsers.js +192 -0
- package/dist/cli/commands/linked-test-parsers.js.map +1 -0
- package/dist/cli/commands/list.js +19 -5
- package/dist/cli/commands/list.js.map +1 -1
- package/dist/cli/commands/normalize.js +4 -3
- package/dist/cli/commands/normalize.js.map +1 -1
- package/dist/cli/commands/plan.d.ts +5 -0
- package/dist/cli/commands/plan.js +56 -8
- package/dist/cli/commands/plan.js.map +1 -1
- package/dist/cli/commands/recurrence-parsers.d.ts +26 -0
- package/dist/cli/commands/recurrence-parsers.js +98 -0
- package/dist/cli/commands/recurrence-parsers.js.map +1 -0
- package/dist/cli/commands/restore.js +19 -8
- package/dist/cli/commands/restore.js.map +1 -1
- package/dist/cli/commands/search.js +5 -8
- package/dist/cli/commands/search.js.map +1 -1
- package/dist/cli/commands/test/linked-command-detection.d.ts +37 -0
- package/dist/cli/commands/test/linked-command-detection.js +200 -0
- package/dist/cli/commands/test/linked-command-detection.js.map +1 -0
- package/dist/cli/commands/test.d.ts +1 -2
- package/dist/cli/commands/test.js +8 -350
- package/dist/cli/commands/test.js.map +1 -1
- package/dist/cli/commands/update-many.js +4 -3
- package/dist/cli/commands/update-many.js.map +1 -1
- package/dist/cli/commands/update.js +83 -356
- package/dist/cli/commands/update.js.map +1 -1
- package/dist/cli/commands/validate.js +32 -12
- package/dist/cli/commands/validate.js.map +1 -1
- package/dist/cli/error-guidance.d.ts +1 -0
- package/dist/cli/error-guidance.js +6 -2
- package/dist/cli/error-guidance.js.map +1 -1
- package/dist/cli/main.d.ts +11 -0
- package/dist/cli/main.js +76 -28
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/register-list-query.d.ts +4 -1
- package/dist/cli/register-list-query.js +242 -203
- package/dist/cli/register-list-query.js.map +1 -1
- package/dist/cli/register-mutation.js +73 -11
- package/dist/cli/register-mutation.js.map +1 -1
- package/dist/cli/register-operations.js +3 -3
- package/dist/cli/register-operations.js.map +1 -1
- package/dist/cli/register-setup.js +12 -7
- package/dist/cli/register-setup.js.map +1 -1
- package/dist/cli/registration-helpers.js +3 -2
- package/dist/cli/registration-helpers.js.map +1 -1
- package/dist/cli.js +4 -3
- package/dist/cli.js.map +1 -1
- package/dist/core/config/positional-value.d.ts +44 -0
- package/dist/core/config/positional-value.js +109 -0
- package/dist/core/config/positional-value.js.map +1 -0
- package/dist/core/extensions/extension-capability-aliases.d.ts +14 -0
- package/dist/core/extensions/extension-capability-aliases.js +159 -0
- package/dist/core/extensions/extension-capability-aliases.js.map +1 -0
- package/dist/core/extensions/extension-hook-runtime.d.ts +13 -0
- package/dist/core/extensions/extension-hook-runtime.js +414 -0
- package/dist/core/extensions/extension-hook-runtime.js.map +1 -0
- package/dist/core/extensions/extension-policy.d.ts +69 -0
- package/dist/core/extensions/extension-policy.js +481 -0
- package/dist/core/extensions/extension-policy.js.map +1 -0
- package/dist/core/extensions/extension-registries.d.ts +8 -0
- package/dist/core/extensions/extension-registries.js +52 -0
- package/dist/core/extensions/extension-registries.js.map +1 -0
- package/dist/core/extensions/extension-runtime-helpers.d.ts +6 -0
- package/dist/core/extensions/extension-runtime-helpers.js +29 -0
- package/dist/core/extensions/extension-runtime-helpers.js.map +1 -0
- package/dist/core/extensions/extension-types.d.ts +13 -39
- package/dist/core/extensions/extension-types.js +34 -2
- package/dist/core/extensions/extension-types.js.map +1 -1
- package/dist/core/extensions/index.d.ts +7 -0
- package/dist/core/extensions/index.js +11 -2
- package/dist/core/extensions/index.js.map +1 -1
- package/dist/core/extensions/loader.d.ts +4 -22
- package/dist/core/extensions/loader.js +22 -1139
- package/dist/core/extensions/loader.js.map +1 -1
- package/dist/core/history/drift-scan.d.ts +11 -0
- package/dist/core/history/drift-scan.js +114 -32
- package/dist/core/history/drift-scan.js.map +1 -1
- package/dist/core/history/history-rewrite.d.ts +43 -0
- package/dist/core/history/history-rewrite.js +48 -0
- package/dist/core/history/history-rewrite.js.map +1 -0
- package/dist/core/history/history.js +5 -4
- package/dist/core/history/history.js.map +1 -1
- package/dist/core/history/replay.js +4 -3
- package/dist/core/history/replay.js.map +1 -1
- package/dist/core/item/item-record.d.ts +19 -0
- package/dist/core/item/item-record.js +24 -0
- package/dist/core/item/item-record.js.map +1 -0
- package/dist/core/output/mutation-projection.d.ts +31 -0
- package/dist/core/output/mutation-projection.js +103 -0
- package/dist/core/output/mutation-projection.js.map +1 -0
- package/dist/core/output/output.d.ts +2 -0
- package/dist/core/output/output.js +5 -3
- package/dist/core/output/output.js.map +1 -1
- package/dist/core/schema/runtime-schema.js +8 -38
- package/dist/core/schema/runtime-schema.js.map +1 -1
- package/dist/core/search/vector-stores.js +46 -9
- package/dist/core/search/vector-stores.js.map +1 -1
- package/dist/core/sentry/helpers.d.ts +1 -1
- package/dist/core/sentry/helpers.js +20 -3
- package/dist/core/sentry/helpers.js.map +1 -1
- package/dist/core/shared/command-types.d.ts +1 -0
- package/dist/core/shared/command-types.js +2 -2
- package/dist/core/shared/command-types.js.map +1 -1
- package/dist/core/shared/constants.d.ts +10 -1
- package/dist/core/shared/constants.js +56 -58
- package/dist/core/shared/constants.js.map +1 -1
- package/dist/core/shared/levenshtein.js +23 -7
- package/dist/core/shared/levenshtein.js.map +1 -1
- package/dist/core/shared/primitives.d.ts +23 -0
- package/dist/core/shared/primitives.js +39 -2
- package/dist/core/shared/primitives.js.map +1 -1
- package/dist/core/store/front-matter-cache.d.ts +16 -2
- package/dist/core/store/front-matter-cache.js +99 -33
- package/dist/core/store/front-matter-cache.js.map +1 -1
- package/dist/core/store/item-store.js +8 -73
- package/dist/core/store/item-store.js.map +1 -1
- package/dist/mcp/server.js +76 -28
- package/dist/mcp/server.js.map +1 -1
- package/dist/sdk/cli-contracts/enum-contracts.d.ts +20 -0
- package/dist/sdk/cli-contracts/enum-contracts.js +156 -0
- package/dist/sdk/cli-contracts/enum-contracts.js.map +1 -0
- package/dist/sdk/cli-contracts/tool-option-contracts.d.ts +14 -0
- package/dist/sdk/cli-contracts/tool-option-contracts.js +243 -0
- package/dist/sdk/cli-contracts/tool-option-contracts.js.map +1 -0
- package/dist/sdk/cli-contracts/tool-parameter-tables.d.ts +11 -0
- package/dist/sdk/cli-contracts/tool-parameter-tables.js +901 -0
- package/dist/sdk/cli-contracts/tool-parameter-tables.js.map +1 -0
- package/dist/sdk/cli-contracts.d.ts +11 -33
- package/dist/sdk/cli-contracts.js +30 -1356
- package/dist/sdk/cli-contracts.js.map +1 -1
- package/dist/sdk/package-import-adapters.d.ts +74 -0
- package/dist/sdk/package-import-adapters.js +186 -0
- package/dist/sdk/package-import-adapters.js.map +1 -0
- package/dist/sdk/package-runtime-options.d.ts +26 -0
- package/dist/sdk/package-runtime-options.js +71 -0
- package/dist/sdk/package-runtime-options.js.map +1 -0
- package/dist/sdk/runtime.d.ts +2 -0
- package/dist/sdk/runtime.js +4 -2
- package/dist/sdk/runtime.js.map +1 -1
- package/docs/AGENT_GUIDE.md +6 -10
- package/docs/CLAUDE_CODE_PLUGIN.md +5 -28
- package/docs/CODEX_PLUGIN.md +5 -5
- package/docs/COMMANDS.md +19 -3
- package/docs/CONFIGURATION.md +15 -0
- package/docs/EXTENSIONS.md +4 -63
- package/docs/RELEASING.md +4 -4
- package/marketplace.json +7 -3
- package/package.json +9 -6
- package/packages/pm-beads/extensions/beads/index.js +2 -49
- package/packages/pm-beads/extensions/beads/index.ts +2 -54
- package/packages/pm-beads/extensions/beads/runtime-loader.js +86 -0
- package/packages/pm-beads/extensions/beads/runtime-loader.ts +88 -0
- package/packages/pm-beads/extensions/beads/runtime.js +26 -115
- package/packages/pm-beads/extensions/beads/runtime.ts +33 -132
- package/packages/pm-calendar/extensions/calendar/index.js +47 -2
- package/packages/pm-calendar/extensions/calendar/index.ts +52 -2
- package/packages/pm-calendar/extensions/calendar/runtime.js +1 -0
- package/packages/pm-calendar/extensions/calendar/runtime.ts +1 -0
- package/packages/pm-governance-audit/extensions/governance-audit/runtime.js +14 -41
- package/packages/pm-governance-audit/extensions/governance-audit/runtime.ts +25 -41
- package/packages/pm-guide-shell/extensions/guide-shell/runtime.js +10 -50
- package/packages/pm-guide-shell/extensions/guide-shell/runtime.ts +17 -50
- package/packages/pm-linked-test-adapters/extensions/linked-test-adapters/runtime.js +8 -40
- package/packages/pm-linked-test-adapters/extensions/linked-test-adapters/runtime.ts +10 -40
- package/packages/pm-search-advanced/extensions/search-advanced/index.js +1 -1
- package/packages/pm-search-advanced/extensions/search-advanced/runtime.js +4 -37
- package/packages/pm-search-advanced/extensions/search-advanced/runtime.ts +6 -37
- package/packages/pm-todos/extensions/todos/index.js +3 -50
- package/packages/pm-todos/extensions/todos/index.ts +3 -55
- package/packages/pm-todos/extensions/todos/runtime-loader.js +86 -0
- package/packages/pm-todos/extensions/todos/runtime-loader.ts +88 -0
- package/packages/pm-todos/extensions/todos/runtime.js +24 -117
- package/packages/pm-todos/extensions/todos/runtime.ts +32 -129
- package/plugins/pm-claude/README.md +2 -2
- package/plugins/pm-claude/commands/pm-planner.md +1 -15
- package/plugins/pm-claude/scripts/pm-mcp-server.mjs +5 -2
- package/plugins/pm-claude/skills/pm-planner/SKILL.md +3 -21
- package/plugins/pm-codex/scripts/pm-mcp-server.mjs +15 -6
- package/plugins/pm-codex/skills/pm-native/SKILL.md +1 -13
- package/PRD.md +0 -1734
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
|
|
2
|
-
!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]="
|
|
2
|
+
!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]="afd2b2c1-6cc9-56db-974f-643acbaf2784")}catch(e){}}();
|
|
3
3
|
import { pathExists } from "../core/fs/fs-utils.js";
|
|
4
4
|
import { resolveItemTypeRegistry } from "../core/item/type-registry.js";
|
|
5
5
|
import { EXIT_CODE } from "../core/shared/constants.js";
|
|
@@ -7,7 +7,7 @@ import { getSettingsPath, resolvePmRoot } from "../core/store/paths.js";
|
|
|
7
7
|
import { readSettings } from "../core/store/settings.js";
|
|
8
8
|
import { BUILTIN_ITEM_TYPE_VALUES } from "../types/index.js";
|
|
9
9
|
import { getActiveExtensionRegistrations, runActiveServiceOverride, } from "../core/extensions/index.js";
|
|
10
|
-
import { resolveSubcommandFlagContractsForCommand } from "../sdk/cli-contracts.js";
|
|
10
|
+
import { PM_CORE_COMMAND_NAMES, resolveSubcommandFlagContractsForCommand } from "../sdk/cli-contracts.js";
|
|
11
11
|
import { formatCommanderErrorForDisplay, formatCommanderErrorForJson, } from "./error-guidance.js";
|
|
12
12
|
import { normalizeHelpCommandPath } from "./help-content.js";
|
|
13
13
|
import { getCommandPath } from "./registration-helpers.js";
|
|
@@ -30,6 +30,54 @@ const OPTIONAL_PACKAGE_INSTALL_HINTS = {
|
|
|
30
30
|
beads: "beads",
|
|
31
31
|
todos: "todos",
|
|
32
32
|
};
|
|
33
|
+
const COMMON_COMMAND_ALIASES = {
|
|
34
|
+
comment: ["comments"],
|
|
35
|
+
note: ["notes"],
|
|
36
|
+
learning: ["learnings"],
|
|
37
|
+
show: ["get"],
|
|
38
|
+
};
|
|
39
|
+
const SEMANTIC_UNKNOWN_OPTION_SUGGESTIONS = {
|
|
40
|
+
comments: {
|
|
41
|
+
"--body": ["--add"],
|
|
42
|
+
"--text": ["--add"],
|
|
43
|
+
"--comment": ["--add"],
|
|
44
|
+
},
|
|
45
|
+
notes: {
|
|
46
|
+
"--body": ["--add"],
|
|
47
|
+
"--text": ["--add"],
|
|
48
|
+
"--note": ["--add"],
|
|
49
|
+
},
|
|
50
|
+
learnings: {
|
|
51
|
+
"--body": ["--add"],
|
|
52
|
+
"--text": ["--add"],
|
|
53
|
+
"--learning": ["--add"],
|
|
54
|
+
},
|
|
55
|
+
// Tag mutations are single --tags flags; agents transferring additive tag verbs
|
|
56
|
+
// ("--add-tag(s)") from other tools should be pointed at the canonical flag.
|
|
57
|
+
update: {
|
|
58
|
+
"--add-tags": ["--tags"],
|
|
59
|
+
"--add-tag": ["--tags"],
|
|
60
|
+
"--tag": ["--tags"],
|
|
61
|
+
},
|
|
62
|
+
create: {
|
|
63
|
+
"--add-tags": ["--tags"],
|
|
64
|
+
"--add-tag": ["--tags"],
|
|
65
|
+
"--tag": ["--tags"],
|
|
66
|
+
},
|
|
67
|
+
};
|
|
68
|
+
function getSemanticUnknownOptionSuggestions(commandName, unknownOption) {
|
|
69
|
+
const commandSuggestions = SEMANTIC_UNKNOWN_OPTION_SUGGESTIONS[commandName];
|
|
70
|
+
if (!commandSuggestions) {
|
|
71
|
+
return [];
|
|
72
|
+
}
|
|
73
|
+
const normalizedUnknown = normalizeLongFlag(unknownOption);
|
|
74
|
+
for (const [flag, suggestions] of Object.entries(commandSuggestions)) {
|
|
75
|
+
if (normalizeLongFlag(flag) === normalizedUnknown) {
|
|
76
|
+
return suggestions;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
return [];
|
|
80
|
+
}
|
|
33
81
|
export function collectRuntimeCommandPaths(root, extensionDescriptors) {
|
|
34
82
|
const commandPaths = new Set();
|
|
35
83
|
const queue = [...root.commands];
|
|
@@ -124,20 +172,32 @@ function suggestNearestLongFlags(unknownOption, knownFlags) {
|
|
|
124
172
|
return [];
|
|
125
173
|
}
|
|
126
174
|
const unknownComparable = toComparableFlag(unknownOption);
|
|
175
|
+
if (unknownComparable.length === 0) {
|
|
176
|
+
return [];
|
|
177
|
+
}
|
|
127
178
|
const maxDistance = unknownComparable.length >= 8 ? 2 : 1;
|
|
179
|
+
// rank 0 = abbreviation/prefix match (e.g. --desc -> --description), rank 1 = edit-distance typo.
|
|
128
180
|
const candidates = [];
|
|
129
181
|
for (const flag of knownFlags) {
|
|
130
|
-
const
|
|
131
|
-
if (
|
|
182
|
+
const flagComparable = toComparableFlag(flag);
|
|
183
|
+
if (flagComparable === unknownComparable) {
|
|
184
|
+
continue;
|
|
185
|
+
}
|
|
186
|
+
if (unknownComparable.length >= 3 && flagComparable.startsWith(unknownComparable)) {
|
|
187
|
+
candidates.push({ flag, rank: 0, distance: flagComparable.length - unknownComparable.length });
|
|
132
188
|
continue;
|
|
133
189
|
}
|
|
134
|
-
|
|
190
|
+
const distance = levenshteinDistanceWithinLimit(unknownComparable, flagComparable, maxDistance);
|
|
191
|
+
if (distance === null || distance <= 0) {
|
|
135
192
|
continue;
|
|
136
193
|
}
|
|
137
|
-
candidates.push({ flag, distance });
|
|
194
|
+
candidates.push({ flag, rank: 1, distance });
|
|
138
195
|
}
|
|
139
196
|
return candidates
|
|
140
197
|
.sort((left, right) => {
|
|
198
|
+
if (left.rank !== right.rank) {
|
|
199
|
+
return left.rank - right.rank;
|
|
200
|
+
}
|
|
141
201
|
if (left.distance !== right.distance) {
|
|
142
202
|
return left.distance - right.distance;
|
|
143
203
|
}
|
|
@@ -146,6 +206,55 @@ function suggestNearestLongFlags(unknownOption, knownFlags) {
|
|
|
146
206
|
.map((entry) => entry.flag)
|
|
147
207
|
.slice(0, 3);
|
|
148
208
|
}
|
|
209
|
+
let crossCommandFlagIndexCache;
|
|
210
|
+
// Alias/shortcut command names that duplicate a canonical command. Excluding them
|
|
211
|
+
// keeps cross-command flag hints focused on the primary commands an agent should use.
|
|
212
|
+
const CROSS_COMMAND_FLAG_EXCLUSIONS = new Set([
|
|
213
|
+
"ctx",
|
|
214
|
+
"packages",
|
|
215
|
+
"list-draft",
|
|
216
|
+
"list-open",
|
|
217
|
+
"list-in-progress",
|
|
218
|
+
"list-blocked",
|
|
219
|
+
"list-closed",
|
|
220
|
+
"list-canceled",
|
|
221
|
+
"start-task",
|
|
222
|
+
"pause-task",
|
|
223
|
+
"close-task",
|
|
224
|
+
"help",
|
|
225
|
+
]);
|
|
226
|
+
// Index of long flag -> command names that accept it (in declaration order), so an
|
|
227
|
+
// unknown flag on one command can be recognised as valid elsewhere (e.g. --type is
|
|
228
|
+
// rejected on test-all but valid on create/list). Built once from core command contracts.
|
|
229
|
+
function getCrossCommandFlagIndex() {
|
|
230
|
+
if (crossCommandFlagIndexCache) {
|
|
231
|
+
return crossCommandFlagIndexCache;
|
|
232
|
+
}
|
|
233
|
+
const index = new Map();
|
|
234
|
+
for (const command of PM_CORE_COMMAND_NAMES) {
|
|
235
|
+
if (CROSS_COMMAND_FLAG_EXCLUSIONS.has(command)) {
|
|
236
|
+
continue;
|
|
237
|
+
}
|
|
238
|
+
for (const flag of collectKnownLongFlags(command)) {
|
|
239
|
+
const commands = index.get(flag) ?? [];
|
|
240
|
+
commands.push(command);
|
|
241
|
+
index.set(flag, commands);
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
crossCommandFlagIndexCache = index;
|
|
245
|
+
return crossCommandFlagIndexCache;
|
|
246
|
+
}
|
|
247
|
+
function findOtherCommandsForFlag(unknownOption, currentCommand) {
|
|
248
|
+
if (!unknownOption.startsWith("--")) {
|
|
249
|
+
return [];
|
|
250
|
+
}
|
|
251
|
+
const commands = getCrossCommandFlagIndex().get(normalizeLongFlag(unknownOption));
|
|
252
|
+
if (!commands) {
|
|
253
|
+
return [];
|
|
254
|
+
}
|
|
255
|
+
const normalizedCurrent = currentCommand?.trim().toLowerCase();
|
|
256
|
+
return commands.filter((command) => command !== normalizedCurrent).slice(0, 3);
|
|
257
|
+
}
|
|
149
258
|
function rewriteUnknownOptionArgv(argv, unknownOption, replacementFlag) {
|
|
150
259
|
for (let index = 0; index < argv.length; index += 1) {
|
|
151
260
|
const token = argv[index];
|
|
@@ -192,12 +301,14 @@ export function buildUnknownCommandGuidanceFromRuntime(rawMessage, root, extensi
|
|
|
192
301
|
return left.commandPath.localeCompare(right.commandPath);
|
|
193
302
|
})
|
|
194
303
|
.map((entry) => entry.commandPath);
|
|
304
|
+
const aliasCandidates = (COMMON_COMMAND_ALIASES[primaryToken] ?? []).filter((aliasPath) => commandPaths.includes(aliasPath));
|
|
305
|
+
const combinedCandidates = dedupeStrings([...aliasCandidates, ...rankedCandidates]);
|
|
195
306
|
const fallbackTopLevel = [...new Set(commandPaths.map((commandPath) => commandPath.split(" ")[0]).filter((segment) => segment.length > 0))];
|
|
196
307
|
fallbackTopLevel.sort((left, right) => left.localeCompare(right));
|
|
197
|
-
const suggestedPaths = (
|
|
308
|
+
const suggestedPaths = (combinedCandidates.length > 0 ? combinedCandidates : fallbackTopLevel).slice(0, 3);
|
|
198
309
|
const examples = [...new Set(["pm --help", ...suggestedPaths.map((path) => `pm ${path} --help`)])];
|
|
199
310
|
const optionalPackageHint = resolveOptionalPackageInstallHint(normalizedUnknown);
|
|
200
|
-
const didYouMean =
|
|
311
|
+
const didYouMean = combinedCandidates.length > 0 ? `Did you mean: ${combinedCandidates.slice(0, 3).join(", ")}?` : null;
|
|
201
312
|
return {
|
|
202
313
|
unknownCommandExamples: examples,
|
|
203
314
|
unknownCommandNextSteps: [
|
|
@@ -208,6 +319,9 @@ export function buildUnknownCommandGuidanceFromRuntime(rawMessage, root, extensi
|
|
|
208
319
|
],
|
|
209
320
|
};
|
|
210
321
|
}
|
|
322
|
+
function dedupeStrings(values) {
|
|
323
|
+
return Array.from(new Set(values));
|
|
324
|
+
}
|
|
211
325
|
export function resolveChildCommandByToken(parent, token) {
|
|
212
326
|
const normalizedToken = token.trim().toLowerCase();
|
|
213
327
|
return parent.commands.find((candidate) => {
|
|
@@ -259,8 +373,14 @@ export async function resolveCommanderUsageContext(error, rootProgram, extension
|
|
|
259
373
|
const unknownCommandGuidance = buildUnknownCommandGuidanceFromRuntime(message, rootProgram, extensionDescriptors);
|
|
260
374
|
const unknownOptionMatch = message.match(/unknown option '([^']+)'/i);
|
|
261
375
|
const unknownOptionSuggestions = unknownOptionMatch && commandName
|
|
262
|
-
?
|
|
376
|
+
? dedupeStrings([
|
|
377
|
+
...getSemanticUnknownOptionSuggestions(commandName, unknownOptionMatch[1]),
|
|
378
|
+
...suggestNearestLongFlags(unknownOptionMatch[1], collectKnownLongFlags(commandName)),
|
|
379
|
+
])
|
|
263
380
|
: undefined;
|
|
381
|
+
const unknownOptionOtherCommands = unknownOptionMatch
|
|
382
|
+
? findOtherCommandsForFlag(unknownOptionMatch[1], commandName)
|
|
383
|
+
: [];
|
|
264
384
|
let suggestedRetryCommand;
|
|
265
385
|
if (unknownOptionMatch && unknownOptionSuggestions && unknownOptionSuggestions.length > 0) {
|
|
266
386
|
const rewritten = rewriteUnknownOptionArgv(invocationArgv, unknownOptionMatch[1], unknownOptionSuggestions[0]);
|
|
@@ -286,13 +406,14 @@ export async function resolveCommanderUsageContext(error, rootProgram, extension
|
|
|
286
406
|
normalizedInvocationArgs: [...invocationArgv],
|
|
287
407
|
providedOptionFlags,
|
|
288
408
|
unknownOptionSuggestions,
|
|
409
|
+
unknownOptionOtherCommands: unknownOptionOtherCommands.length > 0 ? unknownOptionOtherCommands : undefined,
|
|
289
410
|
suggestedRetryCommand,
|
|
290
411
|
...(unknownCommandGuidance ?? {}),
|
|
291
412
|
};
|
|
292
413
|
}
|
|
293
414
|
export async function formatCommanderUsageMessage(error, rootProgram, extensionDescriptors) {
|
|
294
415
|
const usageContext = await resolveCommanderUsageContext(error, rootProgram, extensionDescriptors);
|
|
295
|
-
const { message, commandName, allowedTypes, unknownCommandExamples, unknownCommandNextSteps, attemptedCommand, normalizedInvocationArgs, providedOptionFlags, unknownOptionSuggestions, suggestedRetryCommand, } = usageContext;
|
|
416
|
+
const { message, commandName, allowedTypes, unknownCommandExamples, unknownCommandNextSteps, attemptedCommand, normalizedInvocationArgs, providedOptionFlags, unknownOptionSuggestions, unknownOptionOtherCommands, suggestedRetryCommand, } = usageContext;
|
|
296
417
|
const formatted = formatCommanderErrorForDisplay(message, commandName, allowedTypes, {
|
|
297
418
|
unknownCommandExamples,
|
|
298
419
|
unknownCommandNextSteps,
|
|
@@ -300,6 +421,7 @@ export async function formatCommanderUsageMessage(error, rootProgram, extensionD
|
|
|
300
421
|
normalizedInvocationArgs,
|
|
301
422
|
providedOptionFlags,
|
|
302
423
|
unknownOptionSuggestions,
|
|
424
|
+
unknownOptionOtherCommands,
|
|
303
425
|
suggestedRetryCommand,
|
|
304
426
|
});
|
|
305
427
|
const serviceOverride = await runActiveServiceOverride("help_format", {
|
|
@@ -321,9 +443,10 @@ export async function formatCommanderUsageJson(error, rootProgram, extensionDesc
|
|
|
321
443
|
normalizedInvocationArgs: usageContext.normalizedInvocationArgs,
|
|
322
444
|
providedOptionFlags: usageContext.providedOptionFlags,
|
|
323
445
|
unknownOptionSuggestions: usageContext.unknownOptionSuggestions,
|
|
446
|
+
unknownOptionOtherCommands: usageContext.unknownOptionOtherCommands,
|
|
324
447
|
suggestedRetryCommand: usageContext.suggestedRetryCommand,
|
|
325
448
|
});
|
|
326
449
|
return JSON.stringify(envelope, null, 2);
|
|
327
450
|
}
|
|
328
451
|
//# sourceMappingURL=commander-usage.js.map
|
|
329
|
-
//# debugId=
|
|
452
|
+
//# debugId=afd2b2c1-6cc9-56db-974f-643acbaf2784
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commander-usage.js","sources":["cli/commander-usage.ts"],"sourceRoot":"/","sourcesContent":["import { Command } from \"commander\";\nimport { pathExists } from \"../core/fs/fs-utils.js\";\nimport { resolveItemTypeRegistry } from \"../core/item/type-registry.js\";\nimport { EXIT_CODE } from \"../core/shared/constants.js\";\nimport { getSettingsPath, resolvePmRoot } from \"../core/store/paths.js\";\nimport { readSettings } from \"../core/store/settings.js\";\nimport { BUILTIN_ITEM_TYPE_VALUES } from \"../types/index.js\";\nimport {\n getActiveExtensionRegistrations,\n runActiveServiceOverride,\n} from \"../core/extensions/index.js\";\nimport { resolveSubcommandFlagContractsForCommand } from \"../sdk/cli-contracts.js\";\nimport {\n type CommanderGuidanceContext,\n formatCommanderErrorForDisplay,\n formatCommanderErrorForJson,\n} from \"./error-guidance.js\";\nimport { normalizeHelpCommandPath } from \"./help-content.js\";\nimport { getCommandPath } from \"./registration-helpers.js\";\nimport {\n normalizeBootstrapInvocation,\n parseBootstrapGlobalOptions,\n parseBootstrapCommandName,\n} from \"./bootstrap-args.js\";\nimport {\n extractProvidedOptionFlags,\n normalizeLongFlag,\n renderPmCommand,\n} from \"./argv-utils.js\";\nimport { levenshteinDistanceWithinLimit } from \"../core/shared/levenshtein.js\";\nimport type { ExtensionCommandHelpDescriptor } from \"./extension-command-help.js\";\n\nexport const BUILTIN_TYPE_HELP_VALUES = BUILTIN_ITEM_TYPE_VALUES.join(\"|\");\n\nconst OPTIONAL_PACKAGE_INSTALL_HINTS: Record<string, string> = {\n calendar: \"calendar\",\n cal: \"calendar\",\n reindex: \"search-advanced\",\n \"search-advanced\": \"search-advanced\",\n \"dedupe-audit\": \"governance-audit\",\n \"comments-audit\": \"governance-audit\",\n normalize: \"governance-audit\",\n guide: \"guide-shell\",\n completion: \"guide-shell\",\n templates: \"templates\",\n \"test-runs\": \"linked-test-adapters\",\n beads: \"beads\",\n todos: \"todos\",\n};\n\nexport interface CommanderUsageContext extends CommanderGuidanceContext {\n message: string;\n commandName: string | undefined;\n allowedTypes: string;\n}\n\nexport function collectRuntimeCommandPaths(\n root: Command,\n extensionDescriptors: ReadonlyMap<string, ExtensionCommandHelpDescriptor>,\n): string[] {\n const commandPaths = new Set<string>();\n const queue: Command[] = [...root.commands];\n while (queue.length > 0) {\n const current = queue.shift();\n if (!current) {\n continue;\n }\n const normalizedPath = normalizeHelpCommandPath(getCommandPath(current));\n const hasInternalSegment = normalizedPath.split(\" \").some((segment) => segment.startsWith(\"_\"));\n if (normalizedPath.length > 0 && !hasInternalSegment) {\n commandPaths.add(normalizedPath);\n }\n queue.push(...current.commands);\n }\n for (const descriptorPath of extensionDescriptors.keys()) {\n const normalizedPath = normalizeHelpCommandPath(descriptorPath);\n const hasInternalSegment = normalizedPath.split(\" \").some((segment) => segment.startsWith(\"_\"));\n if (normalizedPath.length > 0 && !hasInternalSegment) {\n commandPaths.add(normalizedPath);\n }\n }\n return [...commandPaths].sort((left, right) => left.localeCompare(right));\n}\n\nexport function scoreCommandPathMatch(commandPath: string, queryToken: string): number {\n const normalizedPath = commandPath.trim().toLowerCase();\n const normalizedToken = queryToken.trim().toLowerCase();\n if (normalizedToken.length === 0) {\n return Number.POSITIVE_INFINITY;\n }\n const pathSegments = normalizedPath.split(\" \");\n if (normalizedPath === normalizedToken) {\n return 0;\n }\n if (pathSegments.includes(normalizedToken)) {\n return 1;\n }\n if (pathSegments.some((segment) => segment.startsWith(normalizedToken))) {\n return 2;\n }\n if (normalizedPath.includes(normalizedToken)) {\n return 3;\n }\n // Fall back to edit distance so transposition/typo cases (e.g. \"lst\" -> \"list\") still rank.\n const maxDistance = normalizedToken.length >= 5 ? 2 : 1;\n let bestDistance = Number.POSITIVE_INFINITY;\n for (const segment of pathSegments) {\n const distance = levenshteinDistanceWithinLimit(segment, normalizedToken, maxDistance);\n if (distance !== null) {\n bestDistance = Math.min(bestDistance, distance);\n }\n }\n if (Number.isFinite(bestDistance)) {\n return 4 + bestDistance;\n }\n return Number.POSITIVE_INFINITY;\n}\n\nfunction toComparableFlag(flag: string): string {\n return normalizeLongFlag(flag).slice(2).replace(/-/g, \"\");\n}\n\nfunction renderAttemptedCommand(argv: string[]): string {\n return renderPmCommand(argv);\n}\n\nfunction resolveOptionalPackageInstallHint(commandPath: string): string | null {\n const topLevel = commandPath.split(\" \")[0]?.trim().toLowerCase();\n if (!topLevel) {\n return null;\n }\n const packageAlias = OPTIONAL_PACKAGE_INSTALL_HINTS[topLevel];\n if (!packageAlias) {\n return null;\n }\n return `If this command comes from an optional package, install it with: pm install ${packageAlias}`;\n}\n\nfunction collectKnownLongFlags(commandName: string | undefined): string[] {\n const flags = new Set<string>();\n const contracts = resolveSubcommandFlagContractsForCommand(commandName);\n for (const contract of contracts) {\n if (contract.flag.startsWith(\"--\")) {\n flags.add(normalizeLongFlag(contract.flag));\n }\n for (const alias of contract.aliases ?? []) {\n if (alias.startsWith(\"--\")) {\n flags.add(normalizeLongFlag(alias));\n }\n }\n }\n return [...flags].sort((left, right) => left.localeCompare(right));\n}\n\nfunction suggestNearestLongFlags(unknownOption: string, knownFlags: string[]): string[] {\n if (!unknownOption.startsWith(\"--\")) {\n return [];\n }\n const unknownComparable = toComparableFlag(unknownOption);\n const maxDistance = unknownComparable.length >= 8 ? 2 : 1;\n const candidates: Array<{ flag: string; distance: number }> = [];\n for (const flag of knownFlags) {\n const distance = levenshteinDistanceWithinLimit(unknownComparable, toComparableFlag(flag), maxDistance);\n if (distance === null) {\n continue;\n }\n if (distance <= 0) {\n continue;\n }\n candidates.push({ flag, distance });\n }\n return candidates\n .sort((left, right) => {\n if (left.distance !== right.distance) {\n return left.distance - right.distance;\n }\n return left.flag.localeCompare(right.flag);\n })\n .map((entry) => entry.flag)\n .slice(0, 3);\n}\n\nfunction rewriteUnknownOptionArgv(argv: string[], unknownOption: string, replacementFlag: string): string[] | undefined {\n for (let index = 0; index < argv.length; index += 1) {\n const token = argv[index];\n if (!token.startsWith(\"--\")) {\n continue;\n }\n const equalsIndex = token.indexOf(\"=\");\n const key = equalsIndex >= 0 ? token.slice(0, equalsIndex) : token;\n if (normalizeLongFlag(key) !== normalizeLongFlag(unknownOption)) {\n continue;\n }\n const next = [...argv];\n next[index] = equalsIndex >= 0 ? `${replacementFlag}${token.slice(equalsIndex)}` : replacementFlag;\n return next;\n }\n return undefined;\n}\n\nexport function buildUnknownCommandGuidanceFromRuntime(\n rawMessage: string,\n root: Command,\n extensionDescriptors: ReadonlyMap<string, ExtensionCommandHelpDescriptor>,\n): CommanderGuidanceContext | undefined {\n const unknownCommandMatch = rawMessage.match(/unknown command '([^']+)'/i);\n if (!unknownCommandMatch || typeof unknownCommandMatch[1] !== \"string\") {\n return undefined;\n }\n const normalizedUnknown = normalizeHelpCommandPath(unknownCommandMatch[1]);\n if (normalizedUnknown.length === 0) {\n return undefined;\n }\n const commandPaths = collectRuntimeCommandPaths(root, extensionDescriptors);\n if (commandPaths.length === 0) {\n return undefined;\n }\n\n const primaryToken = normalizedUnknown.split(\" \")[0] ?? normalizedUnknown;\n const rankedCandidates = commandPaths\n .map((commandPath) => {\n const directScore = scoreCommandPathMatch(commandPath, normalizedUnknown);\n const fallbackScore =\n primaryToken !== normalizedUnknown ? scoreCommandPathMatch(commandPath, primaryToken) : Number.POSITIVE_INFINITY;\n const score = Math.min(directScore, fallbackScore);\n return { commandPath, score };\n })\n .filter((entry) => Number.isFinite(entry.score))\n .sort((left, right) => {\n if (left.score !== right.score) {\n return left.score - right.score;\n }\n return left.commandPath.localeCompare(right.commandPath);\n })\n .map((entry) => entry.commandPath);\n\n const fallbackTopLevel = [...new Set(commandPaths.map((commandPath) => commandPath.split(\" \")[0]).filter((segment) => segment.length > 0))];\n fallbackTopLevel.sort((left, right) => left.localeCompare(right));\n const suggestedPaths = (rankedCandidates.length > 0 ? rankedCandidates : fallbackTopLevel).slice(0, 3);\n const examples = [...new Set([\"pm --help\", ...suggestedPaths.map((path) => `pm ${path} --help`)])];\n const optionalPackageHint = resolveOptionalPackageInstallHint(normalizedUnknown);\n const didYouMean = rankedCandidates.length > 0 ? `Did you mean: ${rankedCandidates.slice(0, 3).join(\", \")}?` : null;\n\n return {\n unknownCommandExamples: examples,\n unknownCommandNextSteps: [\n ...(didYouMean ? [didYouMean] : []),\n 'Run \"pm --help\" to list commands available in this runtime, including active extensions.',\n \"Use one of the suggested command paths above with --help to inspect valid flags and usage.\",\n ...(optionalPackageHint ? [optionalPackageHint] : []),\n ],\n };\n}\n\nexport function resolveChildCommandByToken(parent: Command, token: string): Command | undefined {\n const normalizedToken = token.trim().toLowerCase();\n return parent.commands.find((candidate) => {\n if (candidate.name().trim().toLowerCase() === normalizedToken) {\n return true;\n }\n const aliases = typeof candidate.aliases === \"function\" ? candidate.aliases() : [];\n return aliases.some((alias) => alias.trim().toLowerCase() === normalizedToken);\n });\n}\n\nexport function isKnownHelpCommandPath(root: Command, commandPathTokens: string[]): boolean {\n if (commandPathTokens.length === 0) {\n return true;\n }\n let current = root;\n let matchedAny = false;\n for (const token of commandPathTokens) {\n const next = resolveChildCommandByToken(current, token);\n if (!next) {\n return matchedAny;\n }\n matchedAny = true;\n current = next;\n }\n return matchedAny;\n}\n\nexport async function resolveCommanderUsageContext(\n error: unknown,\n rootProgram: Command,\n extensionDescriptors: ReadonlyMap<string, ExtensionCommandHelpDescriptor>,\n): Promise<CommanderUsageContext> {\n const rawMessage = typeof error === \"object\" && error !== null ? (error as { message?: string }).message : undefined;\n const message = rawMessage ?? \"Invalid command usage\";\n const invocationArgv = normalizeBootstrapInvocation(process.argv.slice(2)).argv;\n const bootstrapGlobal = parseBootstrapGlobalOptions(invocationArgv);\n const commandName = parseBootstrapCommandName(invocationArgv);\n const attemptedCommand = renderAttemptedCommand(invocationArgv);\n const providedOptionFlags = extractProvidedOptionFlags(invocationArgv);\n let allowedTypes = BUILTIN_TYPE_HELP_VALUES;\n try {\n const pmRoot = resolvePmRoot(process.cwd(), bootstrapGlobal.path);\n if (await pathExists(getSettingsPath(pmRoot))) {\n const settings = await readSettings(pmRoot);\n const typeRegistry = resolveItemTypeRegistry(settings, getActiveExtensionRegistrations());\n if (typeRegistry.types.length > 0) {\n allowedTypes = typeRegistry.types.join(\"|\");\n }\n }\n } catch {\n // Fall back to built-in type guidance when settings cannot be read.\n }\n const unknownCommandGuidance = buildUnknownCommandGuidanceFromRuntime(message, rootProgram, extensionDescriptors);\n const unknownOptionMatch = message.match(/unknown option '([^']+)'/i);\n const unknownOptionSuggestions =\n unknownOptionMatch && commandName\n ? suggestNearestLongFlags(unknownOptionMatch[1], collectKnownLongFlags(commandName))\n : undefined;\n let suggestedRetryCommand: string | undefined;\n if (unknownOptionMatch && unknownOptionSuggestions && unknownOptionSuggestions.length > 0) {\n const rewritten = rewriteUnknownOptionArgv(invocationArgv, unknownOptionMatch[1], unknownOptionSuggestions[0]);\n if (rewritten) {\n suggestedRetryCommand = renderAttemptedCommand(rewritten);\n }\n }\n if (!suggestedRetryCommand) {\n const missingRequiredOption = message.match(/required option '([^']+)' not specified/i);\n const requiredOptionToken = missingRequiredOption?.[1]?.trim().split(/\\s+/)[0]?.replace(/[,:;]+$/g, \"\");\n if (requiredOptionToken?.startsWith(\"--\")) {\n const hasFlag = invocationArgv.some((token) => token.startsWith(requiredOptionToken));\n if (!hasFlag) {\n suggestedRetryCommand = renderAttemptedCommand([...invocationArgv, requiredOptionToken, \"<value>\"]);\n }\n }\n }\n return {\n message,\n commandName,\n allowedTypes,\n attemptedCommand,\n normalizedInvocationArgs: [...invocationArgv],\n providedOptionFlags,\n unknownOptionSuggestions,\n suggestedRetryCommand,\n ...(unknownCommandGuidance ?? {}),\n };\n}\n\nexport async function formatCommanderUsageMessage(\n error: unknown,\n rootProgram: Command,\n extensionDescriptors: ReadonlyMap<string, ExtensionCommandHelpDescriptor>,\n): Promise<string> {\n const usageContext = await resolveCommanderUsageContext(error, rootProgram, extensionDescriptors);\n const {\n message,\n commandName,\n allowedTypes,\n unknownCommandExamples,\n unknownCommandNextSteps,\n attemptedCommand,\n normalizedInvocationArgs,\n providedOptionFlags,\n unknownOptionSuggestions,\n suggestedRetryCommand,\n } = usageContext;\n const formatted = formatCommanderErrorForDisplay(message, commandName, allowedTypes, {\n unknownCommandExamples,\n unknownCommandNextSteps,\n attemptedCommand,\n normalizedInvocationArgs,\n providedOptionFlags,\n unknownOptionSuggestions,\n suggestedRetryCommand,\n });\n const serviceOverride = await runActiveServiceOverride(\"help_format\", {\n message: formatted,\n command: commandName,\n allowed_types: allowedTypes,\n });\n if (serviceOverride.handled && typeof serviceOverride.result === \"string\") {\n return serviceOverride.result;\n }\n return formatted;\n}\n\nexport async function formatCommanderUsageJson(\n error: unknown,\n rootProgram: Command,\n extensionDescriptors: ReadonlyMap<string, ExtensionCommandHelpDescriptor>,\n): Promise<string> {\n const usageContext = await resolveCommanderUsageContext(error, rootProgram, extensionDescriptors);\n const envelope = formatCommanderErrorForJson(\n usageContext.message,\n usageContext.commandName,\n usageContext.allowedTypes,\n EXIT_CODE.USAGE,\n {\n unknownCommandExamples: usageContext.unknownCommandExamples,\n unknownCommandNextSteps: usageContext.unknownCommandNextSteps,\n attemptedCommand: usageContext.attemptedCommand,\n normalizedInvocationArgs: usageContext.normalizedInvocationArgs,\n providedOptionFlags: usageContext.providedOptionFlags,\n unknownOptionSuggestions: usageContext.unknownOptionSuggestions,\n suggestedRetryCommand: usageContext.suggestedRetryCommand,\n },\n );\n return JSON.stringify(envelope, null, 2);\n}\n"],"names":[],"mappings":"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","debugId":"c8215895-2ec4-5d78-97b1-42fc20757af7"}
|
|
1
|
+
{"version":3,"file":"commander-usage.js","sources":["cli/commander-usage.ts"],"sourceRoot":"/","sourcesContent":["import { Command } from \"commander\";\nimport { pathExists } from \"../core/fs/fs-utils.js\";\nimport { resolveItemTypeRegistry } from \"../core/item/type-registry.js\";\nimport { EXIT_CODE } from \"../core/shared/constants.js\";\nimport { getSettingsPath, resolvePmRoot } from \"../core/store/paths.js\";\nimport { readSettings } from \"../core/store/settings.js\";\nimport { BUILTIN_ITEM_TYPE_VALUES } from \"../types/index.js\";\nimport {\n getActiveExtensionRegistrations,\n runActiveServiceOverride,\n} from \"../core/extensions/index.js\";\nimport { PM_CORE_COMMAND_NAMES, resolveSubcommandFlagContractsForCommand } from \"../sdk/cli-contracts.js\";\nimport {\n type CommanderGuidanceContext,\n formatCommanderErrorForDisplay,\n formatCommanderErrorForJson,\n} from \"./error-guidance.js\";\nimport { normalizeHelpCommandPath } from \"./help-content.js\";\nimport { getCommandPath } from \"./registration-helpers.js\";\nimport {\n normalizeBootstrapInvocation,\n parseBootstrapGlobalOptions,\n parseBootstrapCommandName,\n} from \"./bootstrap-args.js\";\nimport {\n extractProvidedOptionFlags,\n normalizeLongFlag,\n renderPmCommand,\n} from \"./argv-utils.js\";\nimport { levenshteinDistanceWithinLimit } from \"../core/shared/levenshtein.js\";\nimport type { ExtensionCommandHelpDescriptor } from \"./extension-command-help.js\";\n\nexport const BUILTIN_TYPE_HELP_VALUES = BUILTIN_ITEM_TYPE_VALUES.join(\"|\");\n\nconst OPTIONAL_PACKAGE_INSTALL_HINTS: Record<string, string> = {\n calendar: \"calendar\",\n cal: \"calendar\",\n reindex: \"search-advanced\",\n \"search-advanced\": \"search-advanced\",\n \"dedupe-audit\": \"governance-audit\",\n \"comments-audit\": \"governance-audit\",\n normalize: \"governance-audit\",\n guide: \"guide-shell\",\n completion: \"guide-shell\",\n templates: \"templates\",\n \"test-runs\": \"linked-test-adapters\",\n beads: \"beads\",\n todos: \"todos\",\n};\n\nconst COMMON_COMMAND_ALIASES: Record<string, string[]> = {\n comment: [\"comments\"],\n note: [\"notes\"],\n learning: [\"learnings\"],\n show: [\"get\"],\n};\n\nconst SEMANTIC_UNKNOWN_OPTION_SUGGESTIONS: Record<string, Record<string, string[]>> = {\n comments: {\n \"--body\": [\"--add\"],\n \"--text\": [\"--add\"],\n \"--comment\": [\"--add\"],\n },\n notes: {\n \"--body\": [\"--add\"],\n \"--text\": [\"--add\"],\n \"--note\": [\"--add\"],\n },\n learnings: {\n \"--body\": [\"--add\"],\n \"--text\": [\"--add\"],\n \"--learning\": [\"--add\"],\n },\n // Tag mutations are single --tags flags; agents transferring additive tag verbs\n // (\"--add-tag(s)\") from other tools should be pointed at the canonical flag.\n update: {\n \"--add-tags\": [\"--tags\"],\n \"--add-tag\": [\"--tags\"],\n \"--tag\": [\"--tags\"],\n },\n create: {\n \"--add-tags\": [\"--tags\"],\n \"--add-tag\": [\"--tags\"],\n \"--tag\": [\"--tags\"],\n },\n};\n\nfunction getSemanticUnknownOptionSuggestions(commandName: string, unknownOption: string): string[] {\n const commandSuggestions = SEMANTIC_UNKNOWN_OPTION_SUGGESTIONS[commandName];\n if (!commandSuggestions) {\n return [];\n }\n const normalizedUnknown = normalizeLongFlag(unknownOption);\n for (const [flag, suggestions] of Object.entries(commandSuggestions)) {\n if (normalizeLongFlag(flag) === normalizedUnknown) {\n return suggestions;\n }\n }\n return [];\n}\n\nexport interface CommanderUsageContext extends CommanderGuidanceContext {\n message: string;\n commandName: string | undefined;\n allowedTypes: string;\n}\n\nexport function collectRuntimeCommandPaths(\n root: Command,\n extensionDescriptors: ReadonlyMap<string, ExtensionCommandHelpDescriptor>,\n): string[] {\n const commandPaths = new Set<string>();\n const queue: Command[] = [...root.commands];\n while (queue.length > 0) {\n const current = queue.shift();\n if (!current) {\n continue;\n }\n const normalizedPath = normalizeHelpCommandPath(getCommandPath(current));\n const hasInternalSegment = normalizedPath.split(\" \").some((segment) => segment.startsWith(\"_\"));\n if (normalizedPath.length > 0 && !hasInternalSegment) {\n commandPaths.add(normalizedPath);\n }\n queue.push(...current.commands);\n }\n for (const descriptorPath of extensionDescriptors.keys()) {\n const normalizedPath = normalizeHelpCommandPath(descriptorPath);\n const hasInternalSegment = normalizedPath.split(\" \").some((segment) => segment.startsWith(\"_\"));\n if (normalizedPath.length > 0 && !hasInternalSegment) {\n commandPaths.add(normalizedPath);\n }\n }\n return [...commandPaths].sort((left, right) => left.localeCompare(right));\n}\n\nexport function scoreCommandPathMatch(commandPath: string, queryToken: string): number {\n const normalizedPath = commandPath.trim().toLowerCase();\n const normalizedToken = queryToken.trim().toLowerCase();\n if (normalizedToken.length === 0) {\n return Number.POSITIVE_INFINITY;\n }\n const pathSegments = normalizedPath.split(\" \");\n if (normalizedPath === normalizedToken) {\n return 0;\n }\n if (pathSegments.includes(normalizedToken)) {\n return 1;\n }\n if (pathSegments.some((segment) => segment.startsWith(normalizedToken))) {\n return 2;\n }\n if (normalizedPath.includes(normalizedToken)) {\n return 3;\n }\n // Fall back to edit distance so transposition/typo cases (e.g. \"lst\" -> \"list\") still rank.\n const maxDistance = normalizedToken.length >= 5 ? 2 : 1;\n let bestDistance = Number.POSITIVE_INFINITY;\n for (const segment of pathSegments) {\n const distance = levenshteinDistanceWithinLimit(segment, normalizedToken, maxDistance);\n if (distance !== null) {\n bestDistance = Math.min(bestDistance, distance);\n }\n }\n if (Number.isFinite(bestDistance)) {\n return 4 + bestDistance;\n }\n return Number.POSITIVE_INFINITY;\n}\n\nfunction toComparableFlag(flag: string): string {\n return normalizeLongFlag(flag).slice(2).replace(/-/g, \"\");\n}\n\nfunction renderAttemptedCommand(argv: string[]): string {\n return renderPmCommand(argv);\n}\n\nfunction resolveOptionalPackageInstallHint(commandPath: string): string | null {\n const topLevel = commandPath.split(\" \")[0]?.trim().toLowerCase();\n if (!topLevel) {\n return null;\n }\n const packageAlias = OPTIONAL_PACKAGE_INSTALL_HINTS[topLevel];\n if (!packageAlias) {\n return null;\n }\n return `If this command comes from an optional package, install it with: pm install ${packageAlias}`;\n}\n\nfunction collectKnownLongFlags(commandName: string | undefined): string[] {\n const flags = new Set<string>();\n const contracts = resolveSubcommandFlagContractsForCommand(commandName);\n for (const contract of contracts) {\n if (contract.flag.startsWith(\"--\")) {\n flags.add(normalizeLongFlag(contract.flag));\n }\n for (const alias of contract.aliases ?? []) {\n if (alias.startsWith(\"--\")) {\n flags.add(normalizeLongFlag(alias));\n }\n }\n }\n return [...flags].sort((left, right) => left.localeCompare(right));\n}\n\nfunction suggestNearestLongFlags(unknownOption: string, knownFlags: string[]): string[] {\n if (!unknownOption.startsWith(\"--\")) {\n return [];\n }\n const unknownComparable = toComparableFlag(unknownOption);\n if (unknownComparable.length === 0) {\n return [];\n }\n const maxDistance = unknownComparable.length >= 8 ? 2 : 1;\n // rank 0 = abbreviation/prefix match (e.g. --desc -> --description), rank 1 = edit-distance typo.\n const candidates: Array<{ flag: string; rank: number; distance: number }> = [];\n for (const flag of knownFlags) {\n const flagComparable = toComparableFlag(flag);\n if (flagComparable === unknownComparable) {\n continue;\n }\n if (unknownComparable.length >= 3 && flagComparable.startsWith(unknownComparable)) {\n candidates.push({ flag, rank: 0, distance: flagComparable.length - unknownComparable.length });\n continue;\n }\n const distance = levenshteinDistanceWithinLimit(unknownComparable, flagComparable, maxDistance);\n if (distance === null || distance <= 0) {\n continue;\n }\n candidates.push({ flag, rank: 1, distance });\n }\n return candidates\n .sort((left, right) => {\n if (left.rank !== right.rank) {\n return left.rank - right.rank;\n }\n if (left.distance !== right.distance) {\n return left.distance - right.distance;\n }\n return left.flag.localeCompare(right.flag);\n })\n .map((entry) => entry.flag)\n .slice(0, 3);\n}\n\nlet crossCommandFlagIndexCache: Map<string, string[]> | undefined;\n\n// Alias/shortcut command names that duplicate a canonical command. Excluding them\n// keeps cross-command flag hints focused on the primary commands an agent should use.\nconst CROSS_COMMAND_FLAG_EXCLUSIONS = new Set<string>([\n \"ctx\",\n \"packages\",\n \"list-draft\",\n \"list-open\",\n \"list-in-progress\",\n \"list-blocked\",\n \"list-closed\",\n \"list-canceled\",\n \"start-task\",\n \"pause-task\",\n \"close-task\",\n \"help\",\n]);\n\n// Index of long flag -> command names that accept it (in declaration order), so an\n// unknown flag on one command can be recognised as valid elsewhere (e.g. --type is\n// rejected on test-all but valid on create/list). Built once from core command contracts.\nfunction getCrossCommandFlagIndex(): Map<string, string[]> {\n if (crossCommandFlagIndexCache) {\n return crossCommandFlagIndexCache;\n }\n const index = new Map<string, string[]>();\n for (const command of PM_CORE_COMMAND_NAMES) {\n if (CROSS_COMMAND_FLAG_EXCLUSIONS.has(command)) {\n continue;\n }\n for (const flag of collectKnownLongFlags(command)) {\n const commands = index.get(flag) ?? [];\n commands.push(command);\n index.set(flag, commands);\n }\n }\n crossCommandFlagIndexCache = index;\n return crossCommandFlagIndexCache;\n}\n\nfunction findOtherCommandsForFlag(unknownOption: string, currentCommand: string | undefined): string[] {\n if (!unknownOption.startsWith(\"--\")) {\n return [];\n }\n const commands = getCrossCommandFlagIndex().get(normalizeLongFlag(unknownOption));\n if (!commands) {\n return [];\n }\n const normalizedCurrent = currentCommand?.trim().toLowerCase();\n return commands.filter((command) => command !== normalizedCurrent).slice(0, 3);\n}\n\nfunction rewriteUnknownOptionArgv(argv: string[], unknownOption: string, replacementFlag: string): string[] | undefined {\n for (let index = 0; index < argv.length; index += 1) {\n const token = argv[index];\n if (!token.startsWith(\"--\")) {\n continue;\n }\n const equalsIndex = token.indexOf(\"=\");\n const key = equalsIndex >= 0 ? token.slice(0, equalsIndex) : token;\n if (normalizeLongFlag(key) !== normalizeLongFlag(unknownOption)) {\n continue;\n }\n const next = [...argv];\n next[index] = equalsIndex >= 0 ? `${replacementFlag}${token.slice(equalsIndex)}` : replacementFlag;\n return next;\n }\n return undefined;\n}\n\nexport function buildUnknownCommandGuidanceFromRuntime(\n rawMessage: string,\n root: Command,\n extensionDescriptors: ReadonlyMap<string, ExtensionCommandHelpDescriptor>,\n): CommanderGuidanceContext | undefined {\n const unknownCommandMatch = rawMessage.match(/unknown command '([^']+)'/i);\n if (!unknownCommandMatch || typeof unknownCommandMatch[1] !== \"string\") {\n return undefined;\n }\n const normalizedUnknown = normalizeHelpCommandPath(unknownCommandMatch[1]);\n if (normalizedUnknown.length === 0) {\n return undefined;\n }\n const commandPaths = collectRuntimeCommandPaths(root, extensionDescriptors);\n if (commandPaths.length === 0) {\n return undefined;\n }\n\n const primaryToken = normalizedUnknown.split(\" \")[0] ?? normalizedUnknown;\n const rankedCandidates = commandPaths\n .map((commandPath) => {\n const directScore = scoreCommandPathMatch(commandPath, normalizedUnknown);\n const fallbackScore =\n primaryToken !== normalizedUnknown ? scoreCommandPathMatch(commandPath, primaryToken) : Number.POSITIVE_INFINITY;\n const score = Math.min(directScore, fallbackScore);\n return { commandPath, score };\n })\n .filter((entry) => Number.isFinite(entry.score))\n .sort((left, right) => {\n if (left.score !== right.score) {\n return left.score - right.score;\n }\n return left.commandPath.localeCompare(right.commandPath);\n })\n .map((entry) => entry.commandPath);\n\n const aliasCandidates = (COMMON_COMMAND_ALIASES[primaryToken] ?? []).filter((aliasPath) =>\n commandPaths.includes(aliasPath),\n );\n const combinedCandidates = dedupeStrings([...aliasCandidates, ...rankedCandidates]);\n\n const fallbackTopLevel = [...new Set(commandPaths.map((commandPath) => commandPath.split(\" \")[0]).filter((segment) => segment.length > 0))];\n fallbackTopLevel.sort((left, right) => left.localeCompare(right));\n const suggestedPaths = (combinedCandidates.length > 0 ? combinedCandidates : fallbackTopLevel).slice(0, 3);\n const examples = [...new Set([\"pm --help\", ...suggestedPaths.map((path) => `pm ${path} --help`)])];\n const optionalPackageHint = resolveOptionalPackageInstallHint(normalizedUnknown);\n const didYouMean = combinedCandidates.length > 0 ? `Did you mean: ${combinedCandidates.slice(0, 3).join(\", \")}?` : null;\n\n return {\n unknownCommandExamples: examples,\n unknownCommandNextSteps: [\n ...(didYouMean ? [didYouMean] : []),\n 'Run \"pm --help\" to list commands available in this runtime, including active extensions.',\n \"Use one of the suggested command paths above with --help to inspect valid flags and usage.\",\n ...(optionalPackageHint ? [optionalPackageHint] : []),\n ],\n };\n}\n\nfunction dedupeStrings(values: string[]): string[] {\n return Array.from(new Set(values));\n}\n\nexport function resolveChildCommandByToken(parent: Command, token: string): Command | undefined {\n const normalizedToken = token.trim().toLowerCase();\n return parent.commands.find((candidate) => {\n if (candidate.name().trim().toLowerCase() === normalizedToken) {\n return true;\n }\n const aliases = typeof candidate.aliases === \"function\" ? candidate.aliases() : [];\n return aliases.some((alias) => alias.trim().toLowerCase() === normalizedToken);\n });\n}\n\nexport function isKnownHelpCommandPath(root: Command, commandPathTokens: string[]): boolean {\n if (commandPathTokens.length === 0) {\n return true;\n }\n let current = root;\n let matchedAny = false;\n for (const token of commandPathTokens) {\n const next = resolveChildCommandByToken(current, token);\n if (!next) {\n return matchedAny;\n }\n matchedAny = true;\n current = next;\n }\n return matchedAny;\n}\n\nexport async function resolveCommanderUsageContext(\n error: unknown,\n rootProgram: Command,\n extensionDescriptors: ReadonlyMap<string, ExtensionCommandHelpDescriptor>,\n): Promise<CommanderUsageContext> {\n const rawMessage = typeof error === \"object\" && error !== null ? (error as { message?: string }).message : undefined;\n const message = rawMessage ?? \"Invalid command usage\";\n const invocationArgv = normalizeBootstrapInvocation(process.argv.slice(2)).argv;\n const bootstrapGlobal = parseBootstrapGlobalOptions(invocationArgv);\n const commandName = parseBootstrapCommandName(invocationArgv);\n const attemptedCommand = renderAttemptedCommand(invocationArgv);\n const providedOptionFlags = extractProvidedOptionFlags(invocationArgv);\n let allowedTypes = BUILTIN_TYPE_HELP_VALUES;\n try {\n const pmRoot = resolvePmRoot(process.cwd(), bootstrapGlobal.path);\n if (await pathExists(getSettingsPath(pmRoot))) {\n const settings = await readSettings(pmRoot);\n const typeRegistry = resolveItemTypeRegistry(settings, getActiveExtensionRegistrations());\n if (typeRegistry.types.length > 0) {\n allowedTypes = typeRegistry.types.join(\"|\");\n }\n }\n } catch {\n // Fall back to built-in type guidance when settings cannot be read.\n }\n const unknownCommandGuidance = buildUnknownCommandGuidanceFromRuntime(message, rootProgram, extensionDescriptors);\n const unknownOptionMatch = message.match(/unknown option '([^']+)'/i);\n const unknownOptionSuggestions =\n unknownOptionMatch && commandName\n ? dedupeStrings([\n ...getSemanticUnknownOptionSuggestions(commandName, unknownOptionMatch[1]),\n ...suggestNearestLongFlags(unknownOptionMatch[1], collectKnownLongFlags(commandName)),\n ])\n : undefined;\n const unknownOptionOtherCommands = unknownOptionMatch\n ? findOtherCommandsForFlag(unknownOptionMatch[1], commandName)\n : [];\n let suggestedRetryCommand: string | undefined;\n if (unknownOptionMatch && unknownOptionSuggestions && unknownOptionSuggestions.length > 0) {\n const rewritten = rewriteUnknownOptionArgv(invocationArgv, unknownOptionMatch[1], unknownOptionSuggestions[0]);\n if (rewritten) {\n suggestedRetryCommand = renderAttemptedCommand(rewritten);\n }\n }\n if (!suggestedRetryCommand) {\n const missingRequiredOption = message.match(/required option '([^']+)' not specified/i);\n const requiredOptionToken = missingRequiredOption?.[1]?.trim().split(/\\s+/)[0]?.replace(/[,:;]+$/g, \"\");\n if (requiredOptionToken?.startsWith(\"--\")) {\n const hasFlag = invocationArgv.some((token) => token.startsWith(requiredOptionToken));\n if (!hasFlag) {\n suggestedRetryCommand = renderAttemptedCommand([...invocationArgv, requiredOptionToken, \"<value>\"]);\n }\n }\n }\n return {\n message,\n commandName,\n allowedTypes,\n attemptedCommand,\n normalizedInvocationArgs: [...invocationArgv],\n providedOptionFlags,\n unknownOptionSuggestions,\n unknownOptionOtherCommands: unknownOptionOtherCommands.length > 0 ? unknownOptionOtherCommands : undefined,\n suggestedRetryCommand,\n ...(unknownCommandGuidance ?? {}),\n };\n}\n\nexport async function formatCommanderUsageMessage(\n error: unknown,\n rootProgram: Command,\n extensionDescriptors: ReadonlyMap<string, ExtensionCommandHelpDescriptor>,\n): Promise<string> {\n const usageContext = await resolveCommanderUsageContext(error, rootProgram, extensionDescriptors);\n const {\n message,\n commandName,\n allowedTypes,\n unknownCommandExamples,\n unknownCommandNextSteps,\n attemptedCommand,\n normalizedInvocationArgs,\n providedOptionFlags,\n unknownOptionSuggestions,\n unknownOptionOtherCommands,\n suggestedRetryCommand,\n } = usageContext;\n const formatted = formatCommanderErrorForDisplay(message, commandName, allowedTypes, {\n unknownCommandExamples,\n unknownCommandNextSteps,\n attemptedCommand,\n normalizedInvocationArgs,\n providedOptionFlags,\n unknownOptionSuggestions,\n unknownOptionOtherCommands,\n suggestedRetryCommand,\n });\n const serviceOverride = await runActiveServiceOverride(\"help_format\", {\n message: formatted,\n command: commandName,\n allowed_types: allowedTypes,\n });\n if (serviceOverride.handled && typeof serviceOverride.result === \"string\") {\n return serviceOverride.result;\n }\n return formatted;\n}\n\nexport async function formatCommanderUsageJson(\n error: unknown,\n rootProgram: Command,\n extensionDescriptors: ReadonlyMap<string, ExtensionCommandHelpDescriptor>,\n): Promise<string> {\n const usageContext = await resolveCommanderUsageContext(error, rootProgram, extensionDescriptors);\n const envelope = formatCommanderErrorForJson(\n usageContext.message,\n usageContext.commandName,\n usageContext.allowedTypes,\n EXIT_CODE.USAGE,\n {\n unknownCommandExamples: usageContext.unknownCommandExamples,\n unknownCommandNextSteps: usageContext.unknownCommandNextSteps,\n attemptedCommand: usageContext.attemptedCommand,\n normalizedInvocationArgs: usageContext.normalizedInvocationArgs,\n providedOptionFlags: usageContext.providedOptionFlags,\n unknownOptionSuggestions: usageContext.unknownOptionSuggestions,\n unknownOptionOtherCommands: usageContext.unknownOptionOtherCommands,\n suggestedRetryCommand: usageContext.suggestedRetryCommand,\n },\n );\n return JSON.stringify(envelope, null, 2);\n}\n"],"names":[],"mappings":"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","debugId":"afd2b2c1-6cc9-56db-974f-643acbaf2784"}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
|
|
2
|
-
!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]="
|
|
2
|
+
!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]="14238d29-d4c8-5988-afde-c4d3b52c450d")}catch(e){}}();
|
|
3
3
|
import { pathExists } from "../../core/fs/fs-utils.js";
|
|
4
4
|
import { EXIT_CODE } from "../../core/shared/constants.js";
|
|
5
5
|
import { PmCliError } from "../../core/shared/errors.js";
|
|
6
6
|
import { resolveAuthor } from "../../core/shared/author.js";
|
|
7
|
+
import { toItemRecord } from "../../core/item/item-record.js";
|
|
7
8
|
import { createStdinTokenResolver } from "../../core/item/parse.js";
|
|
8
9
|
import { mutateItem } from "../../core/store/item-store.js";
|
|
9
10
|
import { getSettingsPath, resolvePmRoot } from "../../core/store/paths.js";
|
|
@@ -39,10 +40,10 @@ export async function runAppend(id, options, global) {
|
|
|
39
40
|
},
|
|
40
41
|
});
|
|
41
42
|
return {
|
|
42
|
-
item: result.item,
|
|
43
|
+
item: toItemRecord(result.item),
|
|
43
44
|
appended: appended.length > 0 ? appended : "",
|
|
44
45
|
changed_fields: result.changedFields,
|
|
45
46
|
};
|
|
46
47
|
}
|
|
47
48
|
//# sourceMappingURL=append.js.map
|
|
48
|
-
//# debugId=
|
|
49
|
+
//# debugId=14238d29-d4c8-5988-afde-c4d3b52c450d
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"append.js","sources":["cli/commands/append.ts"],"sourceRoot":"/","sourcesContent":["import { pathExists } from \"../../core/fs/fs-utils.js\";\nimport { EXIT_CODE } from \"../../core/shared/constants.js\";\nimport type { GlobalOptions } from \"../../core/shared/command-types.js\";\nimport { PmCliError } from \"../../core/shared/errors.js\";\nimport { resolveAuthor } from \"../../core/shared/author.js\";\nimport { createStdinTokenResolver } from \"../../core/item/parse.js\";\nimport { mutateItem } from \"../../core/store/item-store.js\";\nimport { getSettingsPath, resolvePmRoot } from \"../../core/store/paths.js\";\nimport { readSettings } from \"../../core/store/settings.js\";\n\nexport interface AppendCommandOptions {\n body: string;\n author?: string;\n message?: string;\n force?: boolean;\n}\n\nexport interface AppendResult {\n item: Record<string, unknown>;\n appended: string;\n changed_fields: string[];\n}\n\n\nexport async function runAppend(id: string, options: AppendCommandOptions, global: GlobalOptions): Promise<AppendResult> {\n if (options.body === undefined) {\n throw new PmCliError(\"Missing required --body text\", EXIT_CODE.USAGE);\n }\n const stdinResolver = createStdinTokenResolver();\n const pmRoot = resolvePmRoot(process.cwd(), global.path);\n if (!(await pathExists(getSettingsPath(pmRoot)))) {\n throw new PmCliError(`Tracker is not initialized at ${pmRoot}. Run pm init first.`, EXIT_CODE.NOT_FOUND);\n }\n const settings = await readSettings(pmRoot);\n const author = resolveAuthor(options.author, settings.author_default);\n const bodyInput = await stdinResolver.resolveValue(options.body, \"--body\");\n const appended = (bodyInput ?? \"\").trim();\n\n const result = await mutateItem({\n pmRoot,\n settings,\n id,\n op: \"append\",\n author,\n message: options.message,\n force: options.force,\n mutate(document) {\n if (appended.length === 0) {\n return { changedFields: [] };\n }\n const spacer = document.body.trim().length > 0 ? \"\\n\\n\" : \"\";\n document.body = `${document.body.replace(/\\s+$/, \"\")}${spacer}${appended}\\n`;\n return { changedFields: [\"body\"] };\n },\n });\n\n return {\n item: result.item
|
|
1
|
+
{"version":3,"file":"append.js","sources":["cli/commands/append.ts"],"sourceRoot":"/","sourcesContent":["import { pathExists } from \"../../core/fs/fs-utils.js\";\nimport { EXIT_CODE } from \"../../core/shared/constants.js\";\nimport type { GlobalOptions } from \"../../core/shared/command-types.js\";\nimport { PmCliError } from \"../../core/shared/errors.js\";\nimport { resolveAuthor } from \"../../core/shared/author.js\";\nimport { toItemRecord } from \"../../core/item/item-record.js\";\nimport { createStdinTokenResolver } from \"../../core/item/parse.js\";\nimport { mutateItem } from \"../../core/store/item-store.js\";\nimport { getSettingsPath, resolvePmRoot } from \"../../core/store/paths.js\";\nimport { readSettings } from \"../../core/store/settings.js\";\n\nexport interface AppendCommandOptions {\n body: string;\n author?: string;\n message?: string;\n force?: boolean;\n}\n\nexport interface AppendResult {\n item: Record<string, unknown>;\n appended: string;\n changed_fields: string[];\n}\n\n\nexport async function runAppend(id: string, options: AppendCommandOptions, global: GlobalOptions): Promise<AppendResult> {\n if (options.body === undefined) {\n throw new PmCliError(\"Missing required --body text\", EXIT_CODE.USAGE);\n }\n const stdinResolver = createStdinTokenResolver();\n const pmRoot = resolvePmRoot(process.cwd(), global.path);\n if (!(await pathExists(getSettingsPath(pmRoot)))) {\n throw new PmCliError(`Tracker is not initialized at ${pmRoot}. Run pm init first.`, EXIT_CODE.NOT_FOUND);\n }\n const settings = await readSettings(pmRoot);\n const author = resolveAuthor(options.author, settings.author_default);\n const bodyInput = await stdinResolver.resolveValue(options.body, \"--body\");\n const appended = (bodyInput ?? \"\").trim();\n\n const result = await mutateItem({\n pmRoot,\n settings,\n id,\n op: \"append\",\n author,\n message: options.message,\n force: options.force,\n mutate(document) {\n if (appended.length === 0) {\n return { changedFields: [] };\n }\n const spacer = document.body.trim().length > 0 ? \"\\n\\n\" : \"\";\n document.body = `${document.body.replace(/\\s+$/, \"\")}${spacer}${appended}\\n`;\n return { changedFields: [\"body\"] };\n },\n });\n\n return {\n item: toItemRecord(result.item),\n appended: appended.length > 0 ? appended : \"\",\n changed_fields: result.changedFields,\n };\n}\n"],"names":[],"mappings":";;AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,gCAAgC,CAAC;AAE3D,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAC9D,OAAO,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC3E,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAgB5D,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,EAAU,EAAE,OAA6B,EAAE,MAAqB;IAC9F,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC/B,MAAM,IAAI,UAAU,CAAC,8BAA8B,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC;IACxE,CAAC;IACD,MAAM,aAAa,GAAG,wBAAwB,EAAE,CAAC;IACjD,MAAM,MAAM,GAAG,aAAa,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;IACzD,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;QACjD,MAAM,IAAI,UAAU,CAAC,iCAAiC,MAAM,sBAAsB,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAC3G,CAAC;IACD,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,MAAM,CAAC,CAAC;IAC5C,MAAM,MAAM,GAAG,aAAa,CAAC,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,cAAc,CAAC,CAAC;IACtE,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC3E,MAAM,QAAQ,GAAG,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAE1C,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC;QAC9B,MAAM;QACN,QAAQ;QACR,EAAE;QACF,EAAE,EAAE,QAAQ;QACZ,MAAM;QACN,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,CAAC,QAAQ;YACb,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC1B,OAAO,EAAE,aAAa,EAAE,EAAE,EAAE,CAAC;YAC/B,CAAC;YACD,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7D,QAAQ,CAAC,IAAI,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,MAAM,GAAG,QAAQ,IAAI,CAAC;YAC7E,OAAO,EAAE,aAAa,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC;QACrC,CAAC;KACF,CAAC,CAAC;IAEH,OAAO;QACL,IAAI,EAAE,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC;QAC/B,QAAQ,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE;QAC7C,cAAc,EAAE,MAAM,CAAC,aAAa;KACrC,CAAC;AACJ,CAAC","debugId":"14238d29-d4c8-5988-afde-c4d3b52c450d"}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
|
|
2
|
-
!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]="
|
|
2
|
+
!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]="c54bf8e8-7777-5980-8f16-e6df0c5bb53f")}catch(e){}}();
|
|
3
3
|
import { pathExists } from "../../core/fs/fs-utils.js";
|
|
4
4
|
import { resolveRuntimeStatusRegistry, statusIsTerminal } from "../../core/schema/runtime-schema.js";
|
|
5
5
|
import { EXIT_CODE } from "../../core/shared/constants.js";
|
|
6
6
|
import { PmCliError } from "../../core/shared/errors.js";
|
|
7
|
+
import { toItemRecord } from "../../core/item/item-record.js";
|
|
7
8
|
import { mutateItem } from "../../core/store/item-store.js";
|
|
8
9
|
import { getSettingsPath, resolvePmRoot } from "../../core/store/paths.js";
|
|
9
10
|
import { readSettings } from "../../core/store/settings.js";
|
|
@@ -47,7 +48,7 @@ export async function runClaim(id, force, global, options = {}) {
|
|
|
47
48
|
},
|
|
48
49
|
});
|
|
49
50
|
return {
|
|
50
|
-
item: result.item,
|
|
51
|
+
item: toItemRecord(result.item),
|
|
51
52
|
claimed_by: skipped && previousAssignee !== null ? previousAssignee : author,
|
|
52
53
|
previous_assignee: previousAssignee,
|
|
53
54
|
forced: force,
|
|
@@ -95,7 +96,7 @@ export async function runRelease(id, force, global, options = {}) {
|
|
|
95
96
|
});
|
|
96
97
|
}
|
|
97
98
|
return {
|
|
98
|
-
item: result.item,
|
|
99
|
+
item: toItemRecord(result.item),
|
|
99
100
|
released_by: author,
|
|
100
101
|
previous_assignee: previousAssignee,
|
|
101
102
|
audit_release: options.allowAuditRelease === true,
|
|
@@ -103,4 +104,4 @@ export async function runRelease(id, force, global, options = {}) {
|
|
|
103
104
|
};
|
|
104
105
|
}
|
|
105
106
|
//# sourceMappingURL=claim.js.map
|
|
106
|
-
//# debugId=
|
|
107
|
+
//# debugId=c54bf8e8-7777-5980-8f16-e6df0c5bb53f
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claim.js","sources":["cli/commands/claim.ts"],"sourceRoot":"/","sourcesContent":["import { pathExists } from \"../../core/fs/fs-utils.js\";\nimport { resolveRuntimeStatusRegistry, statusIsTerminal } from \"../../core/schema/runtime-schema.js\";\nimport { EXIT_CODE } from \"../../core/shared/constants.js\";\nimport type { GlobalOptions } from \"../../core/shared/command-types.js\";\nimport { PmCliError } from \"../../core/shared/errors.js\";\nimport { mutateItem } from \"../../core/store/item-store.js\";\nimport { getSettingsPath, resolvePmRoot } from \"../../core/store/paths.js\";\nimport { readSettings } from \"../../core/store/settings.js\";\nimport { resolveAuthor } from \"../../core/shared/author.js\";\nimport { wrapOwnershipConflict } from \"./annotation-command.js\";\n\nexport interface ClaimResult {\n item: Record<string, unknown>;\n claimed_by: string;\n previous_assignee: string | null;\n forced: boolean;\n skipped?: boolean;\n warnings?: string[];\n}\n\nexport interface ReleaseResult {\n item: Record<string, unknown>;\n released_by: string;\n previous_assignee: string | null;\n audit_release: boolean;\n forced: boolean;\n}\n\nexport interface ClaimMutationOptions {\n author?: string;\n message?: string;\n ifAvailable?: boolean;\n}\n\nexport interface ReleaseMutationOptions extends ClaimMutationOptions {\n allowAuditRelease?: boolean;\n}\n\nexport async function runClaim(\n id: string,\n force: boolean,\n global: GlobalOptions,\n options: ClaimMutationOptions = {},\n): Promise<ClaimResult> {\n const pmRoot = resolvePmRoot(process.cwd(), global.path);\n if (!(await pathExists(getSettingsPath(pmRoot)))) {\n throw new PmCliError(`Tracker is not initialized at ${pmRoot}. Run pm init first.`, EXIT_CODE.NOT_FOUND);\n }\n const settings = await readSettings(pmRoot);\n const statusRegistry = resolveRuntimeStatusRegistry(settings.schema);\n const author = resolveAuthor(options.author, settings.author_default);\n let previousAssignee: string | null = null;\n let skipped = false;\n const mutationWarnings: string[] = [];\n\n const result = await mutateItem({\n pmRoot,\n settings,\n id,\n op: \"claim\",\n author,\n message: options.message,\n force,\n mutate(document) {\n previousAssignee = document.metadata.assignee ?? null;\n if (statusIsTerminal(document.metadata.status, statusRegistry) && !force) {\n throw new PmCliError(`Cannot claim terminal item ${document.metadata.id} without --force`, EXIT_CODE.CONFLICT);\n }\n const heldByOther = previousAssignee !== null && previousAssignee !== author;\n if (heldByOther && options.ifAvailable === true) {\n skipped = true;\n mutationWarnings.push(`claim_skipped_held_by:${previousAssignee}`);\n return { changedFields: [] };\n }\n if (heldByOther) {\n mutationWarnings.push(`claim_takeover:${previousAssignee}->${author}`);\n }\n document.metadata.assignee = author;\n return { changedFields: [\"assignee\"], warnings: mutationWarnings };\n },\n });\n\n return {\n item: result.item
|
|
1
|
+
{"version":3,"file":"claim.js","sources":["cli/commands/claim.ts"],"sourceRoot":"/","sourcesContent":["import { pathExists } from \"../../core/fs/fs-utils.js\";\nimport { resolveRuntimeStatusRegistry, statusIsTerminal } from \"../../core/schema/runtime-schema.js\";\nimport { EXIT_CODE } from \"../../core/shared/constants.js\";\nimport type { GlobalOptions } from \"../../core/shared/command-types.js\";\nimport { PmCliError } from \"../../core/shared/errors.js\";\nimport { toItemRecord } from \"../../core/item/item-record.js\";\nimport { mutateItem } from \"../../core/store/item-store.js\";\nimport { getSettingsPath, resolvePmRoot } from \"../../core/store/paths.js\";\nimport { readSettings } from \"../../core/store/settings.js\";\nimport { resolveAuthor } from \"../../core/shared/author.js\";\nimport { wrapOwnershipConflict } from \"./annotation-command.js\";\n\nexport interface ClaimResult {\n item: Record<string, unknown>;\n claimed_by: string;\n previous_assignee: string | null;\n forced: boolean;\n skipped?: boolean;\n warnings?: string[];\n}\n\nexport interface ReleaseResult {\n item: Record<string, unknown>;\n released_by: string;\n previous_assignee: string | null;\n audit_release: boolean;\n forced: boolean;\n}\n\nexport interface ClaimMutationOptions {\n author?: string;\n message?: string;\n ifAvailable?: boolean;\n}\n\nexport interface ReleaseMutationOptions extends ClaimMutationOptions {\n allowAuditRelease?: boolean;\n}\n\nexport async function runClaim(\n id: string,\n force: boolean,\n global: GlobalOptions,\n options: ClaimMutationOptions = {},\n): Promise<ClaimResult> {\n const pmRoot = resolvePmRoot(process.cwd(), global.path);\n if (!(await pathExists(getSettingsPath(pmRoot)))) {\n throw new PmCliError(`Tracker is not initialized at ${pmRoot}. Run pm init first.`, EXIT_CODE.NOT_FOUND);\n }\n const settings = await readSettings(pmRoot);\n const statusRegistry = resolveRuntimeStatusRegistry(settings.schema);\n const author = resolveAuthor(options.author, settings.author_default);\n let previousAssignee: string | null = null;\n let skipped = false;\n const mutationWarnings: string[] = [];\n\n const result = await mutateItem({\n pmRoot,\n settings,\n id,\n op: \"claim\",\n author,\n message: options.message,\n force,\n mutate(document) {\n previousAssignee = document.metadata.assignee ?? null;\n if (statusIsTerminal(document.metadata.status, statusRegistry) && !force) {\n throw new PmCliError(`Cannot claim terminal item ${document.metadata.id} without --force`, EXIT_CODE.CONFLICT);\n }\n const heldByOther = previousAssignee !== null && previousAssignee !== author;\n if (heldByOther && options.ifAvailable === true) {\n skipped = true;\n mutationWarnings.push(`claim_skipped_held_by:${previousAssignee}`);\n return { changedFields: [] };\n }\n if (heldByOther) {\n mutationWarnings.push(`claim_takeover:${previousAssignee}->${author}`);\n }\n document.metadata.assignee = author;\n return { changedFields: [\"assignee\"], warnings: mutationWarnings };\n },\n });\n\n return {\n item: toItemRecord(result.item),\n claimed_by: skipped && previousAssignee !== null ? previousAssignee : author,\n previous_assignee: previousAssignee,\n forced: force,\n ...(skipped ? { skipped: true } : {}),\n ...(mutationWarnings.length > 0 ? { warnings: mutationWarnings } : {}),\n };\n}\n\nexport async function runRelease(\n id: string,\n force: boolean,\n global: GlobalOptions,\n options: ReleaseMutationOptions = {},\n): Promise<ReleaseResult> {\n const pmRoot = resolvePmRoot(process.cwd(), global.path);\n if (!(await pathExists(getSettingsPath(pmRoot)))) {\n throw new PmCliError(`Tracker is not initialized at ${pmRoot}. Run pm init first.`, EXIT_CODE.NOT_FOUND);\n }\n const settings = await readSettings(pmRoot);\n const author = resolveAuthor(options.author, settings.author_default);\n let previousAssignee: string | null = null;\n\n let result: Awaited<ReturnType<typeof mutateItem>>;\n try {\n result = await mutateItem({\n pmRoot,\n settings,\n id,\n op: \"release\",\n author,\n message: options.message,\n force,\n bypassAssigneeConflict: Boolean(options.allowAuditRelease),\n mutate(document) {\n previousAssignee = document.metadata.assignee ?? null;\n if (!previousAssignee) {\n return { changedFields: [] };\n }\n delete document.metadata.assignee;\n return { changedFields: [\"assignee\"] };\n },\n });\n } catch (error: unknown) {\n wrapOwnershipConflict(error, {\n required: \"For audited non-owner handoffs, prefer --allow-audit-release before considering --force.\",\n examples: ['pm release pm-a1b2 --author \"reviewer\" --allow-audit-release'],\n nextSteps: [\n \"Use --allow-audit-release for append-only release handoffs that only clear assignee metadata.\",\n \"Use --force only when an explicit override is approved for broader ownership conflicts.\",\n ],\n });\n }\n\n return {\n item: toItemRecord(result.item),\n released_by: author,\n previous_assignee: previousAssignee,\n audit_release: options.allowAuditRelease === true,\n forced: force,\n };\n}\n"],"names":[],"mappings":";;AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,EAAE,4BAA4B,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AACrG,OAAO,EAAE,SAAS,EAAE,MAAM,gCAAgC,CAAC;AAE3D,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC3E,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AA6BhE,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,EAAU,EACV,KAAc,EACd,MAAqB,EACrB,UAAgC,EAAE;IAElC,MAAM,MAAM,GAAG,aAAa,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;IACzD,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;QACjD,MAAM,IAAI,UAAU,CAAC,iCAAiC,MAAM,sBAAsB,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAC3G,CAAC;IACD,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,MAAM,CAAC,CAAC;IAC5C,MAAM,cAAc,GAAG,4BAA4B,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACrE,MAAM,MAAM,GAAG,aAAa,CAAC,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,cAAc,CAAC,CAAC;IACtE,IAAI,gBAAgB,GAAkB,IAAI,CAAC;IAC3C,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,MAAM,gBAAgB,GAAa,EAAE,CAAC;IAEtC,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC;QAC9B,MAAM;QACN,QAAQ;QACR,EAAE;QACF,EAAE,EAAE,OAAO;QACX,MAAM;QACN,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,KAAK;QACL,MAAM,CAAC,QAAQ;YACb,gBAAgB,GAAG,QAAQ,CAAC,QAAQ,CAAC,QAAQ,IAAI,IAAI,CAAC;YACtD,IAAI,gBAAgB,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;gBACzE,MAAM,IAAI,UAAU,CAAC,8BAA8B,QAAQ,CAAC,QAAQ,CAAC,EAAE,kBAAkB,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAC;YACjH,CAAC;YACD,MAAM,WAAW,GAAG,gBAAgB,KAAK,IAAI,IAAI,gBAAgB,KAAK,MAAM,CAAC;YAC7E,IAAI,WAAW,IAAI,OAAO,CAAC,WAAW,KAAK,IAAI,EAAE,CAAC;gBAChD,OAAO,GAAG,IAAI,CAAC;gBACf,gBAAgB,CAAC,IAAI,CAAC,yBAAyB,gBAAgB,EAAE,CAAC,CAAC;gBACnE,OAAO,EAAE,aAAa,EAAE,EAAE,EAAE,CAAC;YAC/B,CAAC;YACD,IAAI,WAAW,EAAE,CAAC;gBAChB,gBAAgB,CAAC,IAAI,CAAC,kBAAkB,gBAAgB,KAAK,MAAM,EAAE,CAAC,CAAC;YACzE,CAAC;YACD,QAAQ,CAAC,QAAQ,CAAC,QAAQ,GAAG,MAAM,CAAC;YACpC,OAAO,EAAE,aAAa,EAAE,CAAC,UAAU,CAAC,EAAE,QAAQ,EAAE,gBAAgB,EAAE,CAAC;QACrE,CAAC;KACF,CAAC,CAAC;IAEH,OAAO;QACL,IAAI,EAAE,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC;QAC/B,UAAU,EAAE,OAAO,IAAI,gBAAgB,KAAK,IAAI,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,MAAM;QAC5E,iBAAiB,EAAE,gBAAgB;QACnC,MAAM,EAAE,KAAK;QACb,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACrC,GAAG,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,gBAAgB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACvE,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,EAAU,EACV,KAAc,EACd,MAAqB,EACrB,UAAkC,EAAE;IAEpC,MAAM,MAAM,GAAG,aAAa,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;IACzD,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;QACjD,MAAM,IAAI,UAAU,CAAC,iCAAiC,MAAM,sBAAsB,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAC3G,CAAC;IACD,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,MAAM,CAAC,CAAC;IAC5C,MAAM,MAAM,GAAG,aAAa,CAAC,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,cAAc,CAAC,CAAC;IACtE,IAAI,gBAAgB,GAAkB,IAAI,CAAC;IAE3C,IAAI,MAA8C,CAAC;IACnD,IAAI,CAAC;QACH,MAAM,GAAG,MAAM,UAAU,CAAC;YACxB,MAAM;YACN,QAAQ;YACR,EAAE;YACF,EAAE,EAAE,SAAS;YACb,MAAM;YACN,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,KAAK;YACL,sBAAsB,EAAE,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC;YAC1D,MAAM,CAAC,QAAQ;gBACb,gBAAgB,GAAG,QAAQ,CAAC,QAAQ,CAAC,QAAQ,IAAI,IAAI,CAAC;gBACtD,IAAI,CAAC,gBAAgB,EAAE,CAAC;oBACtB,OAAO,EAAE,aAAa,EAAE,EAAE,EAAE,CAAC;gBAC/B,CAAC;gBACD,OAAO,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC;gBAClC,OAAO,EAAE,aAAa,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC;YACzC,CAAC;SACF,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,qBAAqB,CAAC,KAAK,EAAE;YAC3B,QAAQ,EAAE,0FAA0F;YACpG,QAAQ,EAAE,CAAC,8DAA8D,CAAC;YAC1E,SAAS,EAAE;gBACT,+FAA+F;gBAC/F,yFAAyF;aAC1F;SACF,CAAC,CAAC;IACL,CAAC;IAED,OAAO;QACL,IAAI,EAAE,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC;QAC/B,WAAW,EAAE,MAAM;QACnB,iBAAiB,EAAE,gBAAgB;QACnC,aAAa,EAAE,OAAO,CAAC,iBAAiB,KAAK,IAAI;QACjD,MAAM,EAAE,KAAK;KACd,CAAC;AACJ,CAAC","debugId":"c54bf8e8-7777-5980-8f16-e6df0c5bb53f"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
|
|
2
|
-
!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]="
|
|
2
|
+
!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]="610305d5-0069-57e6-aea6-0e9973eac456")}catch(e){}}();
|
|
3
3
|
import { pathExists } from "../../core/fs/fs-utils.js";
|
|
4
|
+
import { toItemRecord } from "../../core/item/item-record.js";
|
|
4
5
|
import { isTerminalStatus } from "../../core/item/status.js";
|
|
5
6
|
import { resolveItemTypeRegistry } from "../../core/item/type-registry.js";
|
|
6
7
|
import { resolveRuntimeStatusRegistry } from "../../core/schema/runtime-schema.js";
|
|
@@ -87,6 +88,23 @@ export async function runClose(id, closeReasonText, options, global) {
|
|
|
87
88
|
throw new PmCliError(`Item ${document.metadata.id} is already terminal; use --force to close again.`, EXIT_CODE.CONFLICT);
|
|
88
89
|
}
|
|
89
90
|
const mutationWarnings = [];
|
|
91
|
+
// pm-fl0c #11: apply inline closure fields BEFORE the validation pass so
|
|
92
|
+
// a single `pm close <id> "reason" --resolution "..."` call satisfies
|
|
93
|
+
// strict validation without a prior pm update. Only meaningful trimmed
|
|
94
|
+
// text writes; an empty/whitespace value is a no-op rather than a clear.
|
|
95
|
+
const inlineCloseFields = [
|
|
96
|
+
{ option: options.resolution, key: "resolution" },
|
|
97
|
+
{ option: options.expectedResult, key: "expected_result" },
|
|
98
|
+
{ option: options.actualResult, key: "actual_result" },
|
|
99
|
+
];
|
|
100
|
+
for (const { option, key } of inlineCloseFields) {
|
|
101
|
+
if (typeof option !== "string")
|
|
102
|
+
continue;
|
|
103
|
+
const trimmed = option.trim();
|
|
104
|
+
if (trimmed.length === 0)
|
|
105
|
+
continue;
|
|
106
|
+
document.metadata[key] = trimmed;
|
|
107
|
+
}
|
|
90
108
|
if (validateCloseMode !== "off") {
|
|
91
109
|
const missingFields = findMissingCloseValidationFields(document.metadata);
|
|
92
110
|
if (missingFields.length > 0) {
|
|
@@ -110,6 +128,11 @@ export async function runClose(id, closeReasonText, options, global) {
|
|
|
110
128
|
document.metadata.status = statusRegistry.close_status;
|
|
111
129
|
document.metadata.close_reason = closeReason;
|
|
112
130
|
const changedFields = ["status", "close_reason"];
|
|
131
|
+
for (const { option, key } of inlineCloseFields) {
|
|
132
|
+
if (typeof option === "string" && option.trim().length > 0) {
|
|
133
|
+
changedFields.push(key);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
113
136
|
if (document.metadata.assignee !== undefined) {
|
|
114
137
|
delete document.metadata.assignee;
|
|
115
138
|
changedFields.push("assignee");
|
|
@@ -153,10 +176,10 @@ export async function runClose(id, closeReasonText, options, global) {
|
|
|
153
176
|
},
|
|
154
177
|
});
|
|
155
178
|
return {
|
|
156
|
-
item: result.item,
|
|
179
|
+
item: toItemRecord(result.item),
|
|
157
180
|
changed_fields: result.changedFields,
|
|
158
181
|
warnings: result.warnings,
|
|
159
182
|
};
|
|
160
183
|
}
|
|
161
184
|
//# sourceMappingURL=close.js.map
|
|
162
|
-
//# debugId=
|
|
185
|
+
//# debugId=610305d5-0069-57e6-aea6-0e9973eac456
|