@unbrained/pm-cli 2026.9.19 → 2026.9.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (149) hide show
  1. package/.claude-plugin/marketplace.json +2 -2
  2. package/CHANGELOG.md +954 -924
  3. package/dist/cli/main.d.ts +10 -76
  4. package/dist/cli/main.js +1 -2
  5. package/dist/cli/register-operations.js +1 -1
  6. package/dist/cli/runtime/activation.d.ts +51 -0
  7. package/dist/cli/runtime/activation.js +2 -0
  8. package/dist/cli/runtime/invocation-options.d.ts +41 -0
  9. package/dist/cli/runtime/invocation-options.js +2 -0
  10. package/dist/cli/runtime/selection.d.ts +29 -0
  11. package/dist/cli/runtime/selection.js +2 -0
  12. package/dist/cli/runtime/telemetry-outcome.d.ts +20 -0
  13. package/dist/cli/runtime/telemetry-outcome.js +2 -0
  14. package/dist/cli-bundle/bundle-manifest.json +150 -150
  15. package/dist/cli-bundle/chunks/{chunk-QA4GUEKJ.js → chunk-2QLXN6HZ.js} +46 -46
  16. package/dist/cli-bundle/chunks/chunk-2UNYUB4A.js +2 -0
  17. package/dist/cli-bundle/chunks/chunk-4SI67A2F.js +8 -0
  18. package/dist/cli-bundle/chunks/chunk-7YUYLYJQ.js +6 -0
  19. package/dist/cli-bundle/chunks/{chunk-7CN53F4S.js → chunk-FBWAECBI.js} +3 -3
  20. package/dist/cli-bundle/chunks/chunk-GRHSNUQO.js +20 -0
  21. package/dist/cli-bundle/chunks/chunk-HAFSMFJK.js +3 -0
  22. package/dist/cli-bundle/chunks/chunk-JBJUOOJI.js +238 -0
  23. package/dist/cli-bundle/chunks/chunk-K7RWRJLT.js +29 -0
  24. package/dist/cli-bundle/chunks/chunk-NHRB3L5T.js +2 -0
  25. package/dist/cli-bundle/chunks/{chunk-CCLWCESZ.js → chunk-QZTS23BV.js} +2 -2
  26. package/dist/cli-bundle/chunks/{chunk-K4VAU4HU.js → chunk-SDLBF4PY.js} +1252 -1252
  27. package/dist/cli-bundle/chunks/{register-list-query-RMZNHSII.js → register-list-query-5V43MYPN.js} +6 -6
  28. package/dist/cli-bundle/chunks/{register-mutation-HJGSGX3H.js → register-mutation-DXES37MA.js} +4 -4
  29. package/dist/cli-bundle/chunks/register-operations-LJU5H2CU.js +2 -0
  30. package/dist/cli-bundle/chunks/register-setup-HJUNGYBB.js +2 -0
  31. package/dist/cli-bundle/focused-chunks/chunk-3XPBKIV6.js +12 -0
  32. package/dist/cli-bundle/focused-chunks/{chunk-7Y7PAC56.js → chunk-5BLRMUMK.js} +2 -2
  33. package/dist/cli-bundle/focused-chunks/{chunk-5SZ4JSPZ.js → chunk-6MNKQKT6.js} +2 -2
  34. package/dist/cli-bundle/focused-chunks/{chunk-IKPR4VVN.js → chunk-DPBTIFW7.js} +2 -2
  35. package/dist/cli-bundle/focused-chunks/{chunk-J3GN4SQT.js → chunk-DRNXMOSV.js} +2 -2
  36. package/dist/cli-bundle/focused-chunks/{chunk-P4BA7OX7.js → chunk-FXAZPSU6.js} +7 -7
  37. package/dist/cli-bundle/focused-chunks/{chunk-ARK4FIO4.js → chunk-HYPK5OPA.js} +2 -2
  38. package/dist/cli-bundle/focused-chunks/{chunk-I4WDON3K.js → chunk-IA5CCSBB.js} +2 -2
  39. package/dist/cli-bundle/focused-chunks/{chunk-CJ4QA4RW.js → chunk-ISEOBALS.js} +2 -2
  40. package/dist/cli-bundle/focused-chunks/{chunk-ZI2YBJFH.js → chunk-K5ZCBC6Y.js} +3 -3
  41. package/dist/cli-bundle/focused-chunks/{chunk-V3YMNAO7.js → chunk-L6L4XCLY.js} +2 -2
  42. package/dist/cli-bundle/focused-chunks/{chunk-TDHVROGL.js → chunk-N6KI3LWF.js} +2 -2
  43. package/dist/cli-bundle/focused-chunks/chunk-PC6ZZVNP.js +20 -0
  44. package/dist/cli-bundle/focused-chunks/chunk-RQL5WLNZ.js +30 -0
  45. package/dist/cli-bundle/focused-chunks/{chunk-ZDBKYZFE.js → chunk-U2SB2BMM.js} +2 -2
  46. package/dist/cli-bundle/focused-chunks/{chunk-YDFEWXXZ.js → chunk-UIS5FVHH.js} +53 -53
  47. package/dist/cli-bundle/main.js +26 -27
  48. package/dist/cli-bundle/sdk-authoring.js +1 -1
  49. package/dist/cli-bundle/sdk-contracts.js +1 -1
  50. package/dist/cli-bundle/sdk-core.js +39 -39
  51. package/dist/cli-bundle/sdk-governance.js +1 -1
  52. package/dist/cli-bundle/sdk-graph.js +1 -1
  53. package/dist/cli-bundle/sdk-merge.js +42 -42
  54. package/dist/cli-bundle/sdk-query.js +1 -1
  55. package/dist/cli-bundle/sdk-runtime.js +1 -1
  56. package/dist/cli-bundle/sdk-testing.js +1 -1
  57. package/dist/cli-bundle/sdk.js +8 -8
  58. package/dist/core/diagnostics/remediation.js +1 -1
  59. package/dist/core/extensions/extension-types.d.ts +2 -2
  60. package/dist/core/extensions/loader.d.ts +9 -15
  61. package/dist/core/extensions/loader.js +1 -1
  62. package/dist/core/extensions/manifest-parser.d.ts +5 -0
  63. package/dist/core/extensions/manifest-parser.js +2 -0
  64. package/dist/core/extensions/registration-contracts.d.ts +34 -0
  65. package/dist/core/extensions/registration-contracts.js +2 -0
  66. package/dist/core/governance/issue-codes.d.ts +10 -1
  67. package/dist/core/governance/issue-codes.js +1 -1
  68. package/dist/core/validate/fix-planning.d.ts +3 -3
  69. package/dist/core/validate/fix-planning.js +1 -1
  70. package/dist/sdk/agent/refusal-reachability.d.ts +1 -1
  71. package/dist/sdk/completion/bash.d.ts +3 -0
  72. package/dist/sdk/completion/bash.js +2 -0
  73. package/dist/sdk/completion/fish.d.ts +3 -0
  74. package/dist/sdk/completion/fish.js +1054 -0
  75. package/dist/sdk/completion/shared.d.ts +103 -0
  76. package/dist/sdk/completion/shared.js +2 -0
  77. package/dist/sdk/completion/zsh.d.ts +3 -0
  78. package/dist/sdk/completion/zsh.js +1109 -0
  79. package/dist/sdk/completion.d.ts +5 -30
  80. package/dist/sdk/completion.js +1 -2160
  81. package/dist/sdk/generated/generated-error-code-catalog-part-2.js +1 -1
  82. package/dist/sdk/governance/closure-timestamps.d.ts +32 -0
  83. package/dist/sdk/governance/closure-timestamps.js +2 -0
  84. package/dist/sdk/governance/validate-normalization.d.ts +2 -0
  85. package/dist/sdk/governance/validate-normalization.js +1 -1
  86. package/dist/sdk/governance/validate.js +1 -1
  87. package/dist/sdk/governance.d.ts +1 -0
  88. package/dist/sdk/governance.js +1 -1
  89. package/dist/sdk/public-surface.json +1 -1
  90. package/dist/sdk/query/search/corpus.d.ts +27 -0
  91. package/dist/sdk/query/search/corpus.js +2 -0
  92. package/dist/sdk/query/search/filters.d.ts +27 -0
  93. package/dist/sdk/query/search/filters.js +2 -0
  94. package/dist/sdk/query/search/input.d.ts +28 -0
  95. package/dist/sdk/query/search/input.js +2 -0
  96. package/dist/sdk/query/search/lexical.d.ts +34 -0
  97. package/dist/sdk/query/search/lexical.js +2 -0
  98. package/dist/sdk/query/search/response.d.ts +34 -0
  99. package/dist/sdk/query/search/response.js +2 -0
  100. package/dist/sdk/query/search/semantic.d.ts +229 -0
  101. package/dist/sdk/query/search/semantic.js +3 -0
  102. package/dist/sdk/query/search/types.d.ts +123 -0
  103. package/dist/sdk/query/search/types.js +2 -0
  104. package/dist/sdk/query/search.d.ts +13 -364
  105. package/dist/sdk/query/search.js +1 -2
  106. package/dist/sdk/runtime/actions.d.ts +4 -0
  107. package/dist/sdk/runtime/actions.js +2 -0
  108. package/dist/sdk/runtime/context.d.ts +38 -0
  109. package/dist/sdk/runtime/context.js +2 -0
  110. package/dist/sdk/runtime/schema.d.ts +4 -0
  111. package/dist/sdk/runtime/schema.js +2 -0
  112. package/dist/sdk/runtime.d.ts +90 -95
  113. package/dist/sdk/runtime.js +1 -1
  114. package/docs/ARCHITECTURE.md +68 -0
  115. package/docs/HISTORY_GOVERNANCE_REPAIR.md +66 -0
  116. package/docs/README.md +2 -0
  117. package/docs/VALIDATION_PORTABILITY.md +82 -0
  118. package/docs/generated/REFUSAL_CLOSURE_CENSUS.md +4 -3
  119. package/marketplace.json +2 -2
  120. package/package.json +6 -6
  121. package/packages/pm-beads/package.json +1 -1
  122. package/packages/pm-calendar/package.json +1 -1
  123. package/packages/pm-command-kit/package.json +1 -1
  124. package/packages/pm-digital-twin/package.json +1 -1
  125. package/packages/pm-governance-audit/package.json +1 -1
  126. package/packages/pm-guide-shell/extensions/guide-shell/runtime.ts +23 -17
  127. package/packages/pm-guide-shell/package.json +1 -1
  128. package/packages/pm-kanban/package.json +1 -1
  129. package/packages/pm-lifecycle-hooks/package.json +1 -1
  130. package/packages/pm-linked-test-adapters/package.json +1 -1
  131. package/packages/pm-search-advanced/package.json +1 -1
  132. package/packages/pm-templates/package.json +1 -1
  133. package/packages/pm-todos/package.json +1 -1
  134. package/packages/pm-vcs/package.json +1 -1
  135. package/plugins/pm-claude/.claude-plugin/plugin.json +1 -1
  136. package/plugins/pm-codex/.codex-plugin/plugin.json +1 -1
  137. package/dist/cli-bundle/chunks/chunk-AACGU5IA.js +0 -3
  138. package/dist/cli-bundle/chunks/chunk-J7NP7QLW.js +0 -6
  139. package/dist/cli-bundle/chunks/chunk-KHN4NMKT.js +0 -238
  140. package/dist/cli-bundle/chunks/chunk-KYG2QKNY.js +0 -29
  141. package/dist/cli-bundle/chunks/chunk-OQS2Y6VN.js +0 -2
  142. package/dist/cli-bundle/chunks/chunk-QTHR3LXF.js +0 -20
  143. package/dist/cli-bundle/chunks/chunk-RVMDPIGD.js +0 -2
  144. package/dist/cli-bundle/chunks/chunk-WASMH647.js +0 -8
  145. package/dist/cli-bundle/chunks/register-operations-LBEMFUMM.js +0 -2
  146. package/dist/cli-bundle/chunks/register-setup-MU557JAA.js +0 -2
  147. package/dist/cli-bundle/focused-chunks/chunk-I32L3FWW.js +0 -12
  148. package/dist/cli-bundle/focused-chunks/chunk-OOZHQFBF.js +0 -20
  149. package/dist/cli-bundle/focused-chunks/chunk-QL4MO5M2.js +0 -30
@@ -1,18 +1,20 @@
1
- #!/usr/bin/env node
2
1
  /**
3
2
  * @module cli/main
3
+ * Coordinates CLI invocation state, extension lifecycle and command dispatch.
4
4
  */
5
5
  import { Command } from "commander";
6
- import { createEmptyExtensionRegistrationRegistry, type ExtensionCommandRegistry, type ExtensionDiscoveryResult, type ExtensionHookRegistry, type ActiveExtensionHookContext, type ExtensionParserRegistry, type ExtensionPreflightRegistry, type ExtensionServiceRegistry, type FlagDefinition, type PreflightRuntimeDecision, type RegisteredExtensionSchemaMigrationDefinition, type ExtensionRendererRegistry, type TelemetryErrorCategory, type PmCliErrorContext, type TelemetryCommandOutcome, type TelemetryCommandResolution, type TelemetryResolutionStage, readSettings, readSettingsWithMetadata, type GlobalOptions } from "../sdk/runtime-primitives.js";
7
- import type { PmSettings } from "../types/index.js";
8
- import { type LooseCommandFlagDefinition } from "./extension-command-options.js";
9
6
  import { describeUnknownError, isCommanderError, normalizeThrownExitCode, readThrownExitCode, wrapThrownErrorForSentry } from "../sdk/error-runtime.js";
7
+ import { type ActiveExtensionHookContext, type ExtensionCommandRegistry, type ExtensionDiscoveryResult, type ExtensionHookRegistry, type ExtensionParserRegistry, type ExtensionPreflightRegistry, type ExtensionRendererRegistry, type ExtensionServiceRegistry, type GlobalOptions, type PmCliErrorContext, type PreflightRuntimeDecision, type RegisteredExtensionSchemaMigrationDefinition, type TelemetryCommandOutcome, type TelemetryCommandResolution, type TelemetryErrorCategory, type TelemetryResolutionStage, createEmptyExtensionRegistrationRegistry, readSettings, readSettingsWithMetadata } from "../sdk/runtime-primitives.js";
8
+ import type { PmSettings } from "../types/index.js";
9
+ import { resolveUnknownCommanderToken } from "./commander-usage.js";
10
10
  import { type ExtensionCommandHelpDescriptor } from "./extension-command-help.js";
11
- import { normalizeBootstrapInvocation } from "./bootstrap-args.js";
11
+ import { type LooseCommandFlagDefinition } from "./extension-command-options.js";
12
12
  import { type MandatoryMigrationBlocker } from "./migration-gates.js";
13
- import { resolveUnknownCommanderToken } from "./commander-usage.js";
14
- /** Record the exact compatibility flags present in the raw CLI invocation. */
15
- declare function recordCliReadOutputInvocationProvenance(actionCommand: Command, commandPath: string, commandOptions: Record<string, unknown>): void;
13
+ import type { RuntimeExtensionActivationProbe } from "./runtime/activation.js";
14
+ import { activationCommandMatchesProbe, buildBootstrapActivationProbe, buildRuntimeExtensionActivationScope, buildRuntimeExtensionFilterForProbe, collectActivationCommandCandidates, collectLeadingCommandArgs, collectParsedActivationCommandArgs, commandPathNeedsSearchExtensions, commandPathNeedsTemplateExtensions, discoveryNeedsActivationForProbe, extensionActivationCommands, extensionCapabilities, extensionNeedsActivationForProbe, extensionProvidesTemplatesRuntime, hasAnyCapability, hasGlobalExtensionContributions, matchesStaticExtensionCommand, probeUsesAnyFlag, resolveStaticExtensionActivationDecision } from "./runtime/activation.js";
15
+ import { collectExtensionFlagDefinitionsForCommand, collectExtensionFlagDefinitionsForInvocation, extractCommandScopedOptions, isImporterOrExporterCommandPath, recordCliReadOutputInvocationProvenance, validateDynamicExtensionCommandInvocation } from "./runtime/invocation-options.js";
16
+ import { enforceExplicitRetryForFlagTypos, invocationRequestsVersion, resolveCoreCommandRegistrationSelection, shouldAttachRichHelpTextForInvocation, shouldRegisterDynamicExtensionPaths, shouldRegisterRuntimeSchemaFlags } from "./runtime/selection.js";
17
+ import { buildPostActionTelemetryOutcome, inferPostActionErrorCode, inferPostActionFailureMessage, normalizeTelemetryCommandResolution, normalizeTelemetryErrorCategory, normalizeTelemetryResolutionStage, readRecordBoolean, readRecordNumber, readRecordString } from "./runtime/telemetry-outcome.js";
16
18
  declare function setActiveExtensionHookContextForTest(context: ActiveExtensionHookContext<MandatoryMigrationBlocker> | null): void;
17
19
  declare function setActiveRuntimeExtensionCommandDescriptorsForTest(descriptors: Map<string, ExtensionCommandHelpDescriptor>): void;
18
20
  interface RuntimeExtensionSnapshot {
@@ -46,23 +48,9 @@ interface RuntimeExtensionDiscoverySnapshot {
46
48
  discoveryMs: number;
47
49
  settingsReadWarnings: string[];
48
50
  }
49
- interface RuntimeExtensionActivationProbe {
50
- commandPath?: string;
51
- commandArgs?: string[];
52
- allowCommandPrefixMatch?: boolean;
53
- }
54
51
  declare function inferMissingFieldsFromErrorMessage(message: string): string[] | undefined;
55
52
  /** Build replayable recovery guidance after removing sensitive matcher values from every invocation representation. */
56
53
  declare function buildPmCliRecoveryContext(context: PmCliErrorContext | undefined, invocationArgv: string[], rawMessage: string): PmCliErrorContext;
57
- declare function readRecordString(record: Record<string, unknown> | null, ...keys: string[]): string | undefined;
58
- declare function readRecordBoolean(record: Record<string, unknown> | null, ...keys: string[]): boolean | undefined;
59
- declare function readRecordNumber(record: Record<string, unknown> | null, ...keys: string[]): number | undefined;
60
- declare function normalizeTelemetryCommandResolution(value: string | undefined): TelemetryCommandResolution | undefined;
61
- declare function normalizeTelemetryResolutionStage(value: string | undefined): TelemetryResolutionStage | undefined;
62
- declare function normalizeTelemetryErrorCategory(value: string | undefined): TelemetryErrorCategory | undefined;
63
- declare function inferPostActionFailureMessage(result: Record<string, unknown> | null): string | undefined;
64
- declare function inferPostActionErrorCode(ok: boolean, exitCode: number): string | undefined;
65
- declare function buildPostActionTelemetryOutcome(): TelemetryCommandOutcome;
66
54
  declare function runAndClearAfterCommandHooks(outcome: TelemetryCommandOutcome): Promise<void>;
67
55
  declare function envFlagEnabled(key: string): boolean;
68
56
  declare function shouldLogHandledErrorToSentry(exitCode: number): boolean;
@@ -92,21 +80,6 @@ declare function handleGenericRunPmCliError(params: {
92
80
  commandResolution: TelemetryCommandResolution;
93
81
  }>;
94
82
  }): Promise<void>;
95
- /** Separate handler options from global controls, then validate and coerce contributed flags against the command's declared schema. */
96
- declare function extractCommandScopedOptions(command: Command, commandArgs: string[], extensionFlagDefinitions?: LooseCommandFlagDefinition[]): Record<string, unknown>;
97
- /** Join contributed flags by stable operation identity so canonical and compatibility command paths share the same schema. */
98
- declare function collectExtensionFlagDefinitionsForCommand(registrations: ReturnType<typeof createEmptyExtensionRegistrationRegistry>, commandPath: string): FlagDefinition[];
99
- declare function collectExtensionFlagDefinitionsForInvocation(registrations: ReturnType<typeof createEmptyExtensionRegistrationRegistry>, commandPath: string, commandArgs: string[]): FlagDefinition[];
100
- /**
101
- * Reports whether {@link commandPath} is the generated command path of a
102
- * registered importer (`<name> import`) or exporter (`<name> export`). Importers
103
- * and exporters read/write a source/destination via flags and take no positional
104
- * operand, so an unexpected positional is a usage error; free-form
105
- * `registerCommand` commands intentionally accept positionals via `context.args`
106
- * and are excluded.
107
- */
108
- declare function isImporterOrExporterCommandPath(registrations: ReturnType<typeof createEmptyExtensionRegistrationRegistry> | null, commandPath: string): boolean;
109
- declare function validateDynamicExtensionCommandInvocation(descriptor: ExtensionCommandHelpDescriptor | undefined, args: string[], options: Record<string, unknown>, extensionFlagDefinitions: LooseCommandFlagDefinition[]): void;
110
83
  declare function toLooseFieldDefinitionType(fieldType: string): "string" | "number" | "boolean";
111
84
  declare function commandHasLongOption(command: Command, longFlag: string): boolean;
112
85
  declare function commandHasShortOption(command: Command, shortFlag: string): boolean;
@@ -118,31 +91,6 @@ declare function defaultPreflightDecision(): PreflightRuntimeDecision;
118
91
  declare function buildRuntimeExtensionSnapshotCacheKey(pmRoot: string, activationScope?: string): string;
119
92
  declare function bootstrapProfileEnabled(invocationArgv: string[]): boolean;
120
93
  declare function buildRuntimeExtensionDiscoverySnapshotCacheKey(pmRoot: string): string;
121
- declare function collectLeadingCommandArgs(commandArgs: readonly string[] | undefined): string[];
122
- /** Match leading command paths against both native history spellings and stable extension operation identities. */
123
- declare function collectActivationCommandCandidates(probe: RuntimeExtensionActivationProbe): string[];
124
- declare function activationCommandMatchesProbe(command: string, probe: RuntimeExtensionActivationProbe): boolean;
125
- declare function extensionActivationCommands(extension: ExtensionDiscoveryResult["effective"][number]): string[];
126
- declare function extensionCapabilities(extension: ExtensionDiscoveryResult["effective"][number]): Set<string>;
127
- declare function hasAnyCapability(capabilities: Set<string>, expected: Set<string>): boolean;
128
- declare function commandPathNeedsSearchExtensions(commandPath: string | undefined): boolean;
129
- declare function probeUsesAnyFlag(probe: RuntimeExtensionActivationProbe, flags: Set<string>): boolean;
130
- declare function commandPathNeedsTemplateExtensions(probe: RuntimeExtensionActivationProbe): boolean;
131
- declare function extensionProvidesTemplatesRuntime(commands: readonly string[]): boolean;
132
- /** Match direct command paths plus the built-in create-template bridge. */
133
- declare function matchesStaticExtensionCommand(commands: readonly string[], probe: RuntimeExtensionActivationProbe): boolean;
134
- /** Identify contribution surfaces that participate in global runtime behavior. */
135
- declare function hasGlobalExtensionContributions(contributions: NonNullable<ExtensionDiscoveryResult["effective"][number]["contributions"]>): boolean;
136
- /** Resolve an exact activation verdict from declared commands and contributions. */
137
- declare function resolveStaticExtensionActivationDecision(extension: ExtensionDiscoveryResult["effective"][number], probe: RuntimeExtensionActivationProbe): boolean | undefined;
138
- declare function extensionNeedsActivationForProbe(extension: ExtensionDiscoveryResult["effective"][number], probe: RuntimeExtensionActivationProbe): boolean;
139
- /** Decide whether installed providers must activate for a targeted invocation or complete command discovery. */
140
- declare function discoveryNeedsActivationForProbe(discovery: ExtensionDiscoveryResult, probe: RuntimeExtensionActivationProbe): boolean;
141
- /** Build a deterministic activation scope; completion and unconstrained discovery include every installed command provider. */
142
- declare function buildRuntimeExtensionActivationScope(probe: RuntimeExtensionActivationProbe): string;
143
- declare function buildRuntimeExtensionFilterForProbe(probe: RuntimeExtensionActivationProbe): ((extension: ExtensionDiscoveryResult["effective"][number]) => boolean) | undefined;
144
- declare function buildBootstrapActivationProbe(invocationArgv: string[]): RuntimeExtensionActivationProbe;
145
- declare function collectParsedActivationCommandArgs(command: Command): string[];
146
94
  /** Surface settings-read warnings once per command on stderr. readSettings() silently falls back to defaults when settings.json is invalid, so most commands (create/list/search/...) generate the warning but never show it — a typo would change behavior with no explanation. Only the `settings_read_*` codes are surfaced (the corrupt-settings fallbacks: invalid_json / invalid_schema / merge_failed); other informational settings warnings (schema bootstrap, legacy-format coercion) stay quiet. Mirrors the same finding in `pm health`, which also carries a remediation_map for it. */
147
95
  declare function emitSettingsReadWarnings(warnings: readonly string[]): void;
148
96
  declare function emitExtensionProfile(globalOptions: GlobalOptions, snapshot: RuntimeExtensionSnapshot): void;
@@ -167,17 +115,6 @@ declare function wrapProgramActionsForExtensionHandlers(rootProgram: Command): v
167
115
  /** Apply descendant-derived visibility to every generated extension namespace. */
168
116
  declare function applyDynamicExtensionRootHelpVisibility(rootProgram: Command, preexistingTopLevelCommands: ReadonlySet<string>, descriptors: ReadonlyMap<string, ExtensionCommandHelpDescriptor>): void;
169
117
  declare function registerDynamicExtensionCommandPaths(rootProgram: Command, invocationArgv: string[]): Promise<void>;
170
- interface CoreCommandRegistrationSelection {
171
- setup: boolean;
172
- listQuery: boolean;
173
- mutation: boolean;
174
- operation: boolean;
175
- targetCommandName?: string;
176
- }
177
- declare function invocationRequestsVersion(invocationArgv: string[]): boolean;
178
- /** Load only the selected core registration family, retaining complete discovery for help and unknown paths. */
179
- declare function resolveCoreCommandRegistrationSelection(invocationArgv: string[]): CoreCommandRegistrationSelection;
180
- declare function shouldAttachRichHelpTextForInvocation(invocationArgv: string[]): boolean;
181
118
  /**
182
119
  * The root `program` is a module-level singleton. Any path that enters
183
120
  * `runPmCli` a second time in the same process (an embedding host, a long-lived
@@ -196,9 +133,6 @@ declare function shouldAttachRichHelpTextForInvocation(invocationArgv: string[])
196
133
  * through Commander untouched.
197
134
  */
198
135
  declare function ensureIdempotentTopLevelCommandRegistration(rootProgram: Command): void;
199
- declare function shouldRegisterDynamicExtensionPaths(_rootProgram: Command, invocationArgv: string[]): boolean;
200
- declare function shouldRegisterRuntimeSchemaFlags(invocationArgv: string[]): boolean;
201
- declare function enforceExplicitRetryForFlagTypos(bootstrapInvocation: ReturnType<typeof normalizeBootstrapInvocation>): void;
202
136
  type TelemetryCommandErrorEmitter = (params: {
203
137
  command: string;
204
138
  errorCode: string;
package/dist/cli/main.js CHANGED
@@ -1,5 +1,4 @@
1
- #!/usr/bin/env node
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]="8944365e-4eb7-527b-b0d6-53d07d700902")}catch(e2){}})();import{Command,CommanderError}from"commander";import{PM_RELOCATED_COMMAND_ALIASES,findPmNamespacedCommand,resolvePmCommandOperation}from"../sdk/cli-contracts/command-aliases.js";import{activateExtensions,clearActiveExtensionHooks,createCoreCommandHookContext,resetActiveExtensionRuntimeState,createEmptyExtensionRegistrationRegistry,discoverExtensions,getActiveCommandResult,getActiveExtensionRegistrations,loadExtensions,consumeAfterCommandAffectedItems,runActiveCommandHandler,runActiveParserOverride,runActivePreflightOverride,runAfterCommandHooks,runBeforeCommandHooks,setActiveCommandResult,setActiveCommandContext,setActiveExtensionCommands,setActiveExtensionHooks,setActiveExtensionParsers,setActiveExtensionPreflight,setActiveExtensionRegistrations,setActiveExtensionRenderers,setActiveExtensionServices,pathExists,resolvePmCliVersion,resolvePmPackageRootFromModule,resolveItemTypeRegistry,resolveRuntimeFieldRegistry,EXIT_CODE,resolveTelemetryErrorCategory,PmCliError,asRecordOrNull,printError,printResult,writeStderr,maybeRunFirstUseTelemetryPrompt,emitTelemetryErrorEvent,startTelemetryCommand,deriveTelemetryCommandResolution,sentryCaptureCliError,sentryFinishCommandSpan,sentryFlush,sentryLogCliUsageError,sentrySetCommandContext,sentryStartCommandSpan,ensureSentryInit,getSettingsPath,resolvePmRoot,readSettings,readSettingsWithMetadata,runWithHarnessDetectionSignals,runWithWorkspaceHarnessSignalDescriptors,createLazyModule}from"../sdk/runtime-primitives.js";import{runWithReproducibleProcessEnvironment}from"../sdk/reproducibility/process.js";import{resolveSubcommandFlagContractsForCommand}from"../sdk/cli-contracts.js";import{createExtensionCommandSdk}from"../sdk/extension-command-context.js";import{PmClient}from"../sdk/runtime.js";import{coerceLooseCommandOptionsWithFlagDefinitions,collectLooseCommandOptionKeysForDefinitions,collectLoosePositionalArgs,parseLooseCommandOptions,stripLooseCommandOptionTokens,validateLooseCommandOptionsWithFlagDefinitions}from"./extension-command-options.js";import{attachRichHelpText,isFullHelpDiscovery,setPmCommandHelpVisibilityTier}from"./help-content.js";import{finishActiveTelemetryCommand,recordAfterCommandContextUsage}from"./after-command-context-usage.js";import{extractProvidedOptionFlags,normalizeLongOptionFlag,redactSensitiveCommandArgs,renderPmCommand}from"./argv-utils.js";import{classifyCommanderError,classifyPmCliError,classifyUnknownError,formatPmCliErrorForDisplay,formatPmCliErrorForJson,formatUnknownErrorForJson,projectLeanErrorEnvelope}from"./error-guidance.js";import{describeUnknownError,isCommanderError,normalizeThrownExitCode,readThrownExitCode,wrapThrownErrorForSentry}from"../sdk/error-runtime.js";import{applyDefaultOutputFormat,clearResolvedGlobalOptions,collect,formatHookWarnings,getCommandPath,getGlobalOptions,invalidateSearchCachesForMutation,setResolvedGlobalOptions,syncCommanderActionOptions}from"./registration-helpers.js";import{normalizeExtensionCommandPath,collectDynamicExtensionFlagHelpByCommand,collectExtensionCommandHelpDescriptors,applyDynamicExtensionFlagOptions,buildResidualDynamicExtensionFlagHelp,applyDynamicExtensionArguments,buildDynamicExtensionCommandMetadataHelp,findCommandByPath,collectSafeExtensionCommandPaths,reportExtensionCommandCollision,ensureCommandPath,buildCanonicalExtensionAliases,extensionFlagTakesValueForInvocation}from"./extension-command-help.js";import{parseBootstrapGlobalOptions,applyBootstrapPagerPolicy,parseBootstrapHelpRequest,parseBootstrapCommandName,findBootstrapCommandTokenIndex,normalizeBootstrapInvocation,stripGlobalBootstrapTokens}from"./bootstrap-args.js";import{applyInvocationAuthorOverride}from"../sdk/invocation-author.js";import{createPmCliProgram}from"../sdk/cli-program.js";import{collectMandatoryMigrationBlockers,enforceMandatoryMigrationWriteGate,enforceItemFormatWriteGateAndPreflightMigration,enforceMutationGuardPreflight}from"./migration-gates.js";import{runExtensionMigrations}from"../sdk/extension/migrations.js";import{appendCommanderExtensionFailures,isKnownHelpCommandPath,formatCommanderUsageMessage,formatCommanderUsageJson,resolveCommanderUsageContext,resolveUnknownCommanderToken}from"./commander-usage.js";import{loadExtensionRecoveryFailures,loadUnknownCommandRecoveryFailures}from"./extension-recovery.js";import{maybeRenderBootstrapJsonHelp,attachCreateUpdatePolicyHelpText}from"./help-json-payload.js";import{attachOutputTokenAccounting}from"../sdk/output-token-accounting.js";import{runWithDiscoveredContextIntentContracts}from"../sdk/context-intent-runtime.js";import{PM_READ_OUTPUT_SURFACE_CONTRACTS,applyReadOutputIncludeModes,readOutputIncludeModeOptions,resolveReadOutputSurface,validateReadOutputOptions}from"../sdk/read-output-contracts.js";import{loadContextIntentSnapshotForInvocation}from"./context-intent-invocation.js";import{isPmSuccessfulExitCode}from"../sdk/cli-contracts/command-exit-contracts.js";import{installCommandNamespaces}from"./command-namespaces.js";const PM_PACKAGE_ROOT_ENV="PM_CLI_PACKAGE_ROOT";const READ_OUTPUT_INVOCATION_PROVENANCE=Symbol.for("pm.readOutputInvocationProvenance");function copyReadOutputInvocationProvenance(source,target){const provenance=Reflect.get(source,READ_OUTPUT_INVOCATION_PROVENANCE);if(provenance!==void 0){Reflect.set(target,READ_OUTPUT_INVOCATION_PROVENANCE,provenance)}}function recordCliReadOutputInvocationProvenance(actionCommand,commandPath,commandOptions){const surface=resolveReadOutputSurface(commandPath,commandOptions);if(!surface)return;let rootCommand=actionCommand;while(rootCommand.parent)rootCommand=rootCommand.parent;const rawArgs=rootCommand.rawArgs;const providedFlags=new Set(extractProvidedOptionFlags(rawArgs.slice(2)));const contract=PM_READ_OUTPUT_SURFACE_CONTRACTS.find(candidate=>candidate.command===surface);const explicitLegacyAliases=Object.values(contract.dimensions).flatMap(dimension=>dimension.legacy_aliases.flatMap(alias=>providedFlags.has(alias.flag)?[alias.flag]:[]));const previous=Reflect.get(commandOptions,READ_OUTPUT_INVOCATION_PROVENANCE);Reflect.set(commandOptions,READ_OUTPUT_INVOCATION_PROVENANCE,{canonical_include_modes:previous?.canonical_include_modes??[],explicit_legacy_aliases:explicitLegacyAliases,cli_invocation_observed:true});copyReadOutputInvocationProvenance(commandOptions,actionCommand)}function resolvePmPackageRoot(){return resolvePmPackageRootFromModule(import.meta.url,["../.."])}if(typeof process.env[PM_PACKAGE_ROOT_ENV]!=="string"||process.env[PM_PACKAGE_ROOT_ENV]?.trim().length===0){process.env[PM_PACKAGE_ROOT_ENV]=resolvePmPackageRoot()}let activeExtensionHookContext=null;let activeTelemetryCommandContext=null;function setActiveExtensionHookContextForTest(context){activeExtensionHookContext=context}function setActiveRuntimeExtensionCommandDescriptorsForTest(descriptors){activeRuntimeExtensionCommandDescriptors=descriptors}const TELEMETRY_COMMAND_RESOLUTION_SET=new Set(["success","nonexistent_command","invalid_option","missing_required_option","missing_required_argument","invalid_usage","validation_failed","health_findings","validation_findings","conflict","runtime_failed","unknown_failed"]);const TELEMETRY_RESOLUTION_STAGE_SET=new Set(["parse","preflight","execute","unknown"]);const TELEMETRY_ERROR_CATEGORY_SET=new Set(["usage","validation","conflict","runtime","unknown"]);let runtimeExtensionSnapshotCache=null;let runtimeExtensionDiscoverySnapshotCache=null;let activeRuntimeExtensionCommandDescriptors=new Map;const HANDLED_ERROR_SENTRY_FLUSH_TIMEOUT_MS=250;const EXPECTED_HANDLED_ERROR_EXIT_CODES=new Set([EXIT_CODE.USAGE,EXIT_CODE.NOT_FOUND,EXIT_CODE.CONFLICT]);const TRUE_LIKE_ENV_VALUES=new Set(["1","true","yes","on"]);const loadSetupRegistrationModule=createLazyModule(()=>import("./register-setup.js"));const loadListQueryRegistrationModule=createLazyModule(()=>import("./register-list-query.js"));const loadMutationRegistrationModule=createLazyModule(()=>import("./register-mutation.js"));const loadOperationRegistrationModule=createLazyModule(()=>import("./register-operations.js"));function renderAttemptedCommand(argv){return renderPmCommand(argv)}function inferMissingFieldsFromErrorMessage(message){const matches=message.match(/--[a-zA-Z0-9][a-zA-Z0-9_-]*/g);if(!matches||matches.length===0){return void 0}const normalized=[...new Set(matches.map(entry=>normalizeLongOptionFlag(entry)??entry))];return normalized.length>0?normalized:void 0}function inferMissingFieldsForRecovery(rawMessage,invocationArgv,existingRecovery){if(existingRecovery?.suggested_retry||rawMessage.includes("failed in extension handler (")||!/\b(?:missing|required|requires)\b/i.test(rawMessage)){return void 0}const providedFields=extractProvidedOptionFlags(invocationArgv);const providedSet=new Set(providedFields.map(flag=>normalizeLongOptionFlag(flag)??flag));const rawInferred=inferMissingFieldsFromErrorMessage(rawMessage);const commandName=invocationArgv.find(token=>program.commands.some(candidate=>candidate.name()===token));const command=commandName?program.commands.find(candidate=>candidate.name()===commandName):void 0;const declaredFlags=new Set([...program.options,...command?.options??[]].flatMap(option=>option.flags.split(/[ ,|]+/).map(flag=>normalizeLongOptionFlag(flag)).filter(flag=>flag!==void 0)));const trulyMissing=rawInferred?.filter(flag=>{const normalized=normalizeLongOptionFlag(flag)??flag;if(providedSet.has(normalized)){return false}return declaredFlags.has(normalized)||extensionFlagTakesValueForInvocation(invocationArgv,commandName,normalized,activeRuntimeExtensionCommandDescriptors)!==void 0});return trulyMissing&&trulyMissing.length>0?trulyMissing:void 0}function resolveRecoverySuggestedRetry(invocationArgv,attemptedCommand,inferredMissing,existingRecovery){if(existingRecovery?.suggested_retry){return existingRecovery.suggested_retry}const missingFlag=inferredMissing?.[0];const normalizedMissing=missingFlag?normalizeLongOptionFlag(missingFlag):void 0;const commandName=invocationArgv.find(token=>program.commands.some(candidate=>candidate.name()===token));const command=commandName?program.commands.find(candidate=>candidate.name()===commandName):void 0;const missingOption=normalizedMissing?command?.options.find(option=>option.flags.split(/[ ,|]+/).includes(normalizedMissing)):void 0;const extensionFlagTakesValue=extensionFlagTakesValueForInvocation(invocationArgv,commandName,normalizedMissing,activeRuntimeExtensionCommandDescriptors);const missingTokens=normalizedMissing?missingOption?.isBoolean()===true||extensionFlagTakesValue===false?[normalizedMissing]:[normalizedMissing,"<value>"]:[];const suggestedRetry=normalizedMissing?renderAttemptedCommand([...invocationArgv,...missingTokens]):attemptedCommand;return suggestedRetry===attemptedCommand?void 0:suggestedRetry}function projectExistingRecoveryOptionalFields(existingRecovery){if(!existingRecovery){return{}}const optionalFields=["recovery_mode","missing_required_fields","suggested_flags","suggested_retry_args","allowed_values","candidate_commands","candidate_commands_total","candidate_commands_truncated","fallback_candidates","next_best_command"];const projected={};for(const field of optionalFields){const value=existingRecovery[field];if(value!==void 0&&value!==null){projected[field]=value}}return projected}function buildRecoveryPayload(params){const existingRecovery=params.existingRecovery;return{attempted_command:existingRecovery?.attempted_command??params.attemptedCommand,normalized_args:existingRecovery?.normalized_args??[...params.invocationArgv],provided_fields:existingRecovery?.provided_fields??(params.providedFields.length>0?params.providedFields:void 0),missing:existingRecovery?.missing??params.inferredMissing,...projectExistingRecoveryOptionalFields(existingRecovery),...params.suggestedRetry?{suggested_retry:params.suggestedRetry}:{}}}function buildPmCliRecoveryContext(context,invocationArgv,rawMessage){const safeInvocationArgv=redactSensitiveCommandArgs(invocationArgv);const commandArgs=stripGlobalBootstrapTokens(safeInvocationArgv);const commandIndex=findBootstrapCommandTokenIndex(commandArgs);const[rootCommand,subcommand]=commandIndex===void 0?[]:commandArgs.slice(commandIndex,commandIndex+2);const explainRequested=safeInvocationArgv.includes("--explain");const rawExistingRecovery=context?.recovery;const existingRecovery=rawExistingRecovery&&(rootCommand==="history-redact"||rootCommand==="history"&&subcommand==="redact")?{...rawExistingRecovery,...rawExistingRecovery.attempted_command?{attempted_command:renderAttemptedCommand(safeInvocationArgv)}:{},...rawExistingRecovery.normalized_args?{normalized_args:[...safeInvocationArgv]}:{},...rawExistingRecovery.suggested_retry?{suggested_retry:renderAttemptedCommand(safeInvocationArgv)}:{},...rawExistingRecovery.suggested_retry_args?{suggested_retry_args:[...safeInvocationArgv]}:{}}:rawExistingRecovery;if(existingRecovery?.recovery_mode==="compact"&&!explainRequested){return{...context,recovery:existingRecovery}}const attemptedCommand=renderAttemptedCommand(safeInvocationArgv);const providedFields=extractProvidedOptionFlags(safeInvocationArgv);const inferredMissing=inferMissingFieldsForRecovery(rawMessage,safeInvocationArgv,existingRecovery);const suggestedRetry=resolveRecoverySuggestedRetry(safeInvocationArgv,attemptedCommand,inferredMissing,existingRecovery);const recovery=buildRecoveryPayload({invocationArgv:safeInvocationArgv,attemptedCommand,providedFields,inferredMissing,suggestedRetry,existingRecovery});return{...context,recovery}}function readRecordString(record,...keys){if(!record){return void 0}for(const key of keys){const candidate=record[key];if(typeof candidate==="string"){const normalized=candidate.trim();if(normalized.length>0){return normalized}}}return void 0}function readRecordBoolean(record,...keys){if(!record){return void 0}for(const key of keys){const candidate=record[key];if(typeof candidate==="boolean"){return candidate}}return void 0}function readRecordNumber(record,...keys){if(!record){return void 0}for(const key of keys){const candidate=record[key];if(typeof candidate==="number"&&Number.isFinite(candidate)){return Math.max(0,Math.trunc(candidate))}}return void 0}function normalizeTelemetryCommandResolution(value){if(!value){return void 0}const normalized=value.trim().toLowerCase();if(!TELEMETRY_COMMAND_RESOLUTION_SET.has(normalized)){return void 0}return normalized}function normalizeTelemetryResolutionStage(value){if(!value){return void 0}const normalized=value.trim().toLowerCase();if(!TELEMETRY_RESOLUTION_STAGE_SET.has(normalized)){return void 0}return normalized}function normalizeTelemetryErrorCategory(value){if(!value){return void 0}const normalized=value.trim().toLowerCase();if(!TELEMETRY_ERROR_CATEGORY_SET.has(normalized)){return void 0}return normalized}function inferPostActionFailureMessage(result){const explicit=readRecordString(result,"error","message");if(explicit){return explicit}const warnings=result?.warnings;if(Array.isArray(warnings)){const firstWarning=warnings.find(value=>typeof value==="string"&&value.trim().length>0);if(typeof firstWarning==="string"){return firstWarning.trim()}}const skippedTriggered=readRecordBoolean(result,"fail_on_skipped_triggered","failOnSkippedTriggered");if(skippedTriggered){return"linked_test_fail_on_skipped_triggered"}const failedCount=readRecordNumber(result,"failed");if(typeof failedCount==="number"&&failedCount>0){return`failed_runs:${failedCount}`}const runResults=result?.run_results;if(Array.isArray(runResults)){const failedRuns=runResults.filter(entry=>{const row=asRecordOrNull(entry);return row?.status==="failed"}).length;if(failedRuns>0){return`failed_runs:${failedRuns}`}}return void 0}function inferPostActionErrorCode(ok,exitCode){if(ok){return void 0}if(exitCode===EXIT_CODE.USAGE){return"invalid_command_usage"}if(exitCode===EXIT_CODE.NOT_FOUND){return"item_not_found"}if(exitCode===EXIT_CODE.CONFLICT){return"lock_conflict"}if(exitCode===EXIT_CODE.DEPENDENCY_FAILED){return"dependency_failed"}return"command_failed"}function buildPostActionTelemetryOutcome(){const result=asRecordOrNull(getActiveCommandResult());const processExitCode=typeof process.exitCode==="number"&&Number.isFinite(process.exitCode)?Math.max(0,Math.trunc(process.exitCode)):void 0;const resultExitCode=readRecordNumber(result,"exit_code","exitCode");const exitCode=processExitCode??resultExitCode??EXIT_CODE.SUCCESS;const ok=isPmSuccessfulExitCode(exitCode);const errorCode=readRecordString(result,"error_code","errorCode")??inferPostActionErrorCode(ok,exitCode);const errorCategory=normalizeTelemetryErrorCategory(readRecordString(result,"error_category","errorCategory"))??(!ok?resolveTelemetryErrorCategory(errorCode):void 0);const errorMessage=!ok?inferPostActionFailureMessage(result)??`command_exit_${exitCode}`:void 0;const commandResolution=normalizeTelemetryCommandResolution(readRecordString(result,"command_resolution","commandResolution"))??deriveTelemetryCommandResolution({ok,errorCode,errorCategory});const resolutionStage=normalizeTelemetryResolutionStage(readRecordString(result,"resolution_stage","resolutionStage"))??"execute";return{ok,error:errorMessage,exit_code:exitCode,error_code:errorCode,error_category:errorCategory,command_resolution:commandResolution,resolution_stage:resolutionStage}}async function runAndClearAfterCommandHooks(outcome){const telemetryRuntime=activeTelemetryCommandContext;activeTelemetryCommandContext=null;await finishActiveTelemetryCommand(telemetryRuntime,outcome);const runtime=activeExtensionHookContext;activeExtensionHookContext=null;if(!runtime){clearActiveExtensionHooks();return}let hookWarnings=[];const affected=consumeAfterCommandAffectedItems();try{await recordAfterCommandContextUsage({pmRoot:runtime.pmRoot,author:runtime.globalOptions.author,itemIds:outcome.ok?affected?.map(item=>item.id)??[]:[],intent:runtime.commandName})}catch{hookWarnings.push("context_usage_feedback_write_failed")}try{hookWarnings.push(...await runAfterCommandHooks(runtime.hooks,{command:runtime.commandName,args:runtime.commandArgs,options:{...runtime.commandOptions},global:{...runtime.globalOptions},pm_root:runtime.pmRoot,ok:outcome.ok,error:outcome.error,result:getActiveCommandResult(),affected}))}catch(error){const message=error instanceof Error?error.message:String(error);hookWarnings=[`afterCommand hooks failed: ${message}`]}finally{clearActiveExtensionHooks()}if(!runtime.globalOptions.json&&hookWarnings.length>0){printError(`[pm] warning: afterCommand hook_warnings=${formatHookWarnings(hookWarnings)}`)}if(runtime.profileEnabled&&hookWarnings.length>0){printError(`profile:extensions hook_warnings=${formatHookWarnings(hookWarnings)}`)}}async function ensureSentryForErrorReporting(){await ensureSentryInit()}function envFlagEnabled(key){return TRUE_LIKE_ENV_VALUES.has((process.env[key]??"").trim().toLowerCase())}function shouldLogHandledErrorToSentry(exitCode){if(envFlagEnabled("PM_SENTRY_CAPTURE_EXPECTED_ERRORS")){return true}return!EXPECTED_HANDLED_ERROR_EXIT_CODES.has(Math.trunc(exitCode))}async function maybeLogHandledCliErrorToSentry(params){if(!shouldLogHandledErrorToSentry(params.exit_code)){return false}await ensureSentryForErrorReporting();sentryLogCliUsageError(params);return true}async function handleGenericRunPmCliError(params){const message=describeUnknownError(params.error);const classification=classifyUnknownError(message);if(params.bootstrapGlobal.json){printError(JSON.stringify(formatUnknownErrorForJson(message,EXIT_CODE.GENERIC_FAILURE),null,2))}else{printError(message)}process.exitCode=EXIT_CODE.GENERIC_FAILURE;let errorCategory="runtime";let commandResolution="runtime_failed";try{await ensureSentryForErrorReporting();sentryCaptureCliError(params.error);const telemetry=await params.emitTelemetryCommandError({command:params.attemptedCommand,errorCode:classification.code,errorMessage:classification.detail,exitCode:EXIT_CODE.GENERIC_FAILURE,options:{bootstrap_global_options:params.bootstrapGlobal},resolutionStage:"execute"});errorCategory=telemetry.errorCategory;commandResolution=telemetry.commandResolution;sentryFinishCommandSpan(false,message,{error_code:classification.code,error_category:errorCategory,exit_code:EXIT_CODE.GENERIC_FAILURE,command_resolution:commandResolution,resolution_stage:"execute"})}catch(reportingError){if(!params.bootstrapGlobal.json){printError(`Failed to report error: ${describeUnknownError(reportingError)}`)}}try{await runAndClearAfterCommandHooks({ok:false,error:message,exit_code:EXIT_CODE.GENERIC_FAILURE,error_code:classification.code,error_category:errorCategory,command_resolution:commandResolution,resolution_stage:"execute"})}catch(hookError){if(!params.bootstrapGlobal.json){printError(`Failed to run error hooks: ${describeUnknownError(hookError)}`)}}try{await sentryFlush()}catch(flushError){if(!params.bootstrapGlobal.json){printError(`Failed to flush error reporting: ${describeUnknownError(flushError)}`)}}}function forwardReadOutputIncludeModes(actionCommand,commandPath,globalOptions,commandOptions){recordCliReadOutputInvocationProvenance(actionCommand,commandPath,commandOptions);const requested=globalOptions.outputInclude;if(requested===void 0)return;const{selectors,modes}=applyReadOutputIncludeModes(commandPath,requested,commandOptions);if(commandPath==="get"&&typeof commandOptions.fields==="string"){actionCommand.setOptionValueWithSource("fields",commandOptions.fields,"cli")}if(modes.length===0)return;copyReadOutputInvocationProvenance(commandOptions,actionCommand);const modeOptions=readOutputIncludeModeOptions(commandPath);for(const mode of modes){const key=modeOptions.get(mode);const value=commandOptions[key];actionCommand.setOptionValueWithSource(key,value,"cli")}const residual=selectors.length>0?selectors.join(","):void 0;if(residual===void 0){delete globalOptions.outputInclude}else{globalOptions.outputInclude=residual}for(let scope=actionCommand;scope;scope=scope.parent){scope.setOptionValueWithSource("outputInclude",residual,"cli")}setResolvedGlobalOptions(actionCommand,globalOptions)}function collectCommandInvocationOptions(command){const allOptions=command.optsWithGlobals();const commandPath=getCommandPath(command);if(resolvePmCommandOperation(commandPath)===commandPath)return allOptions;const ownOptions=command.opts();for(let parent=command.parent;parent?.parent;parent=parent.parent){for(const key of Object.keys(parent.opts())){if(!(key in ownOptions)&&parent.getOptionValueSource(key)==="default")delete allOptions[key]}}return allOptions}function extractCommandScopedOptions(command,commandArgs,extensionFlagDefinitions=[]){const allOptions=collectCommandInvocationOptions(command);const scoped={...allOptions};copyReadOutputInvocationProvenance(command,scoped);delete scoped.json;delete scoped.quiet;delete scoped.path;delete scoped.pmPath;delete scoped.noExtensions;delete scoped.extensions;delete scoped.profile;delete scoped.pager;delete scoped.changedFields;delete scoped.fullChangedFields;delete scoped.idOnly;delete scoped.lean;delete scoped.tokenAccounting;delete scoped.outputInclude;delete scoped.outputLimit;delete scoped.outputBudget;delete scoped.outputFormat;delete scoped.outputSession;const looseOptions=parseLooseCommandOptions(commandArgs);for(const[key,value]of Object.entries(looseOptions)){if(scoped[key]===void 0){scoped[key]=value}}if(extensionFlagDefinitions.length>0){const extensionOptionKeys=collectLooseCommandOptionKeysForDefinitions(extensionFlagDefinitions);const coreFlagDefinitions=resolveSubcommandFlagContractsForCommand(getCommandPath(command)).map(contract=>({long:contract.flag,short:contract.short,aliases:contract.aliases}));const optionsToValidate={...looseOptions};for(const key of extensionOptionKeys){if(scoped[key]!==void 0){optionsToValidate[key]=scoped[key]}}validateLooseCommandOptionsWithFlagDefinitions(optionsToValidate,[...coreFlagDefinitions,...extensionFlagDefinitions],getCommandPath(command));return coerceLooseCommandOptionsWithFlagDefinitions(scoped,extensionFlagDefinitions,looseOptions)}return scoped}function collectExtensionFlagDefinitionsForCommand(registrations,commandPath){const normalizedCommandPath=normalizeExtensionCommandPath(commandPath);if(normalizedCommandPath.length===0){return[]}return registrations.flags.filter(entry=>resolvePmCommandOperation(normalizeExtensionCommandPath(entry.target_command))===resolvePmCommandOperation(normalizedCommandPath)).flatMap(entry=>entry.flags)}function collectExtensionFlagDefinitionsForInvocation(registrations,commandPath,commandArgs){const exact=collectExtensionFlagDefinitionsForCommand(registrations,commandPath);const pathParts=[commandPath];let nestedMatch=[];for(const arg of commandArgs){if(arg.startsWith("-")){break}pathParts.push(arg);const nested=collectExtensionFlagDefinitionsForCommand(registrations,pathParts.join(" "));if(nested.length>0){nestedMatch=nested}}return nestedMatch.length>0?nestedMatch:exact}function dynamicCommandArguments(descriptor){return descriptor.arguments??[]}function formatDynamicCommandUsage(descriptor){const argumentSuffix=dynamicCommandArguments(descriptor).map(argument=>{const label=argument.variadic?`${argument.name}...`:argument.name;return argument.required?`<${label}>`:`[${label}]`}).join(" ");return`pm ${descriptor.command}${argumentSuffix?` ${argumentSuffix}`:""}`}function isImporterOrExporterCommandPath(registrations,commandPath){if(!registrations){return false}const normalized=normalizeExtensionCommandPath(commandPath);return registrations.importers.some(entry=>normalizeExtensionCommandPath(`${entry.importer} import`)===normalized)||registrations.exporters.some(entry=>normalizeExtensionCommandPath(`${entry.exporter} export`)===normalized)}function validateDynamicExtensionCommandArgs(descriptor,args){const descriptorArguments=dynamicCommandArguments(descriptor);const requiredCount=descriptorArguments.filter(argument=>argument.required).length;const variadic=descriptorArguments.some(argument=>argument.variadic);const maxCount=variadic?Number.POSITIVE_INFINITY:descriptorArguments.length;const failureHints=descriptor.failure_hints??[];const hintSuffix=failureHints.length>0?` ${failureHints.join(" ")}`:"";if(args.length<requiredCount){throw new PmCliError(`Missing required argument for extension command '${descriptor.command}'. Usage: ${formatDynamicCommandUsage(descriptor)}${hintSuffix}`,EXIT_CODE.USAGE)}if(args.length>maxCount){const extra=args.slice(maxCount).join(" ");throw new PmCliError(`Too many arguments for extension command '${descriptor.command}': ${extra}. Usage: ${formatDynamicCommandUsage(descriptor)}${hintSuffix}`,EXIT_CODE.USAGE)}}function formatDynamicOptionFlag(optionKey){return`--${optionKey.replace(/([a-z0-9])([A-Z])/g,"$1-$2").replace(/_/g,"-").toLowerCase()}`}function validateDynamicExtensionCommandOptions(descriptor,options,extensionFlagDefinitions){if(extensionFlagDefinitions.length>0){validateLooseCommandOptionsWithFlagDefinitions(options,extensionFlagDefinitions,descriptor.command);return}const unknownOptions=Object.keys(options).filter(key=>options[key]!==void 0).sort();if(unknownOptions.length===0){return}throw new PmCliError(`Unknown option '${unknownOptions.map(formatDynamicOptionFlag).join(", ")}' for extension command '${descriptor.command}'. This command does not define extension flags.`,EXIT_CODE.USAGE)}function validateDynamicExtensionCommandInvocation(descriptor,args,options,extensionFlagDefinitions){if(!descriptor){return}validateDynamicExtensionCommandArgs(descriptor,args);validateDynamicExtensionCommandOptions(descriptor,options,extensionFlagDefinitions)}const RUNTIME_FIELD_COMMAND_BY_COMMAND_PATH={create:"create",update:"update","update-many":"update_many",list:"list","list-all":"list","list-draft":"list","list-open":"list","list-in-progress":"list","list-blocked":"list","list-closed":"list","list-canceled":"list",search:"search",calendar:"calendar",context:"context","templates save":"create"};const runtimeFieldLooseFlagDefinitionCache=new Map;function toLooseFieldDefinitionType(fieldType){if(fieldType==="number"){return"number"}if(fieldType==="boolean"){return"boolean"}return"string"}function commandHasLongOption(command,longFlag){return command.options.some(option=>option.long===longFlag)}function commandHasShortOption(command,shortFlag){return command.options.some(option=>option.short===shortFlag)}function addRuntimeFieldOption(command,flagToken,description,repeatable){const normalizedToken=flagToken.trim();if(!normalizedToken){return}const helpText=description.length>0?description:`Runtime schema field (${flagToken})`;if(normalizedToken.startsWith("-")&&!normalizedToken.startsWith("--")){if(commandHasShortOption(command,normalizedToken)){return}if(repeatable){command.option(`${normalizedToken} <value>`,`${helpText} (repeatable)`,collect);return}command.option(`${normalizedToken} <value>`,helpText);return}const longFlag=normalizedToken.startsWith("--")?normalizedToken:`--${normalizedToken}`;if(commandHasLongOption(command,longFlag)){return}if(repeatable){command.option(`${longFlag} <value>`,`${helpText} (repeatable)`,collect);return}command.option(`${longFlag} <value>`,helpText)}async function collectRuntimeFieldLooseFlagDefinitionsForCommand(commandPath,pmRoot){const runtimeCommand=RUNTIME_FIELD_COMMAND_BY_COMMAND_PATH[commandPath];if(!runtimeCommand){return[]}const cacheKey=`${pmRoot}:${runtimeCommand}`;const cached=runtimeFieldLooseFlagDefinitionCache.get(cacheKey);if(cached){return cached}if(!await pathExists(getSettingsPath(pmRoot))){runtimeFieldLooseFlagDefinitionCache.set(cacheKey,[]);return[]}const settings=await readSettings(pmRoot);const fieldRegistry=resolveRuntimeFieldRegistry(settings.schema);const definitions=(fieldRegistry.command_to_fields.get(runtimeCommand)??[]).flatMap(field=>{const flagTokens=[field.cli_flag,...field.cli_aliases];return flagTokens.map(token=>({long:`--${token}`,type:toLooseFieldDefinitionType(field.type),value_type:toLooseFieldDefinitionType(field.type)}))});runtimeFieldLooseFlagDefinitionCache.set(cacheKey,definitions);return definitions}async function registerRuntimeSchemaFieldFlags(rootProgram,invocationArgv){const bootstrapGlobalOptions=parseBootstrapGlobalOptions(invocationArgv);const pmRoot=resolvePmRoot(process.cwd(),bootstrapGlobalOptions.path);if(!await pathExists(getSettingsPath(pmRoot))){return}const cachedDiscovery=runtimeExtensionDiscoverySnapshotCache?.key===buildRuntimeExtensionDiscoverySnapshotCacheKey(pmRoot)?runtimeExtensionDiscoverySnapshotCache.snapshot:null;const settings=cachedDiscovery===null?await readSettings(pmRoot):cachedDiscovery.settings;const fieldRegistry=resolveRuntimeFieldRegistry(settings.schema);const mappings=[{path:"create",command:"create"},{path:"update",command:"update"},{path:"update-many",command:"update_many"},{path:"list",command:"list"},{path:"list-all",command:"list"},{path:"list-draft",command:"list"},{path:"list-open",command:"list"},{path:"list-in-progress",command:"list"},{path:"list-blocked",command:"list"},{path:"list-closed",command:"list"},{path:"list-canceled",command:"list"},{path:"search",command:"search"},{path:"calendar",command:"calendar"},{path:"context",command:"context"},{path:"templates save",command:"create"}];for(const mapping of mappings){const command=findCommandByPath(rootProgram,mapping.path.split(" "));if(!command){continue}for(const field of fieldRegistry.command_to_fields.get(mapping.command)??[]){const description=field.description??"";addRuntimeFieldOption(command,field.cli_flag,description,field.repeatable);for(const alias of field.cli_aliases){addRuntimeFieldOption(command,alias,`Alias for --${field.cli_flag}`,field.repeatable)}}}}async function maybeAttachCreateUpdatePolicyHelpText(rootProgram,pmRoot,invocationArgv,registrations,settings){const bootstrapCommand=parseBootstrapCommandName(invocationArgv);if(bootstrapCommand!=="create"&&bootstrapCommand!=="update"){return}try{const resolvedSettings=settings??await readSettings(pmRoot);const typeRegistry=resolveItemTypeRegistry(resolvedSettings,registrations);attachCreateUpdatePolicyHelpText(rootProgram,typeRegistry,invocationArgv)}catch{}}function defaultPreflightDecision(){return{enforce_item_format_gate:true,run_preflight_item_format_sync:true,run_extension_migrations:true,enforce_mandatory_migration_gate:true}}function buildRuntimeExtensionSnapshotCacheKey(pmRoot,activationScope="all"){return activationScope==="all"?`pm-root:${pmRoot}`:`pm-root:${pmRoot}:activation:${activationScope}`}function bootstrapProfileEnabled(invocationArgv){return invocationArgv.some(token=>token==="--profile")}function buildRuntimeExtensionDiscoverySnapshotCacheKey(pmRoot){return`pm-root:${pmRoot}`}function collectLeadingCommandArgs(commandArgs){const leading=[];for(const arg of commandArgs??[]){if(arg.startsWith("-")){break}const normalized=normalizeExtensionCommandPath(arg);if(normalized.length===0){continue}leading.push(normalized)}return leading}function collectActivationCommandCandidates(probe){const commandPath=normalizeExtensionCommandPath(probe.commandPath??"");if(commandPath.length===0){return[]}const candidates=[commandPath];const parts=commandPath.split(" ").filter(part=>part.length>0);for(const arg of collectLeadingCommandArgs(probe.commandArgs)){parts.push(...arg.split(" ").filter(part=>part.length>0));candidates.push(parts.join(" "))}return[...new Set(candidates.flatMap(candidate=>[candidate,resolvePmCommandOperation(candidate)]))]}function activationCommandMatchesProbe(command,probe){const normalized=normalizeExtensionCommandPath(command);if(normalized.length===0){return false}const candidates=collectActivationCommandCandidates(probe);for(const candidate of candidates){if(candidate===normalized||candidate.startsWith(`${normalized} `)){return true}}if(probe.allowCommandPrefixMatch===true){return candidates.some(candidate=>normalized.startsWith(`${candidate} `))}return false}function extensionActivationCommands(extension){const explicitCommands=extension.activation?.commands;if(explicitCommands){return explicitCommands}const contributions=extension.contributions;if(!contributions){return[]}return[...entriesOrEmpty(contributions.commands),...entriesOrEmpty(contributions.command_handlers),...entriesOrEmpty(contributions.command_overrides),...entriesOrEmpty(contributions.flag_commands),...entriesOrEmpty(contributions.parser_overrides),...ownershipCommands(contributions.preflight_ownership),...ownershipCommands(contributions.renderer_ownership)]}function entriesOrEmpty(entries){return entries??[]}function ownershipCommands(entries){return entriesOrEmpty(entries).flatMap(entry=>entry.commands)}function extensionCapabilities(extension){return new Set((extension.capabilities??[]).map(capability=>capability.trim().toLowerCase()))}const GLOBAL_EXTENSION_ACTIVATION_CAPABILITIES=new Set(["hooks","parser","preflight","renderers"]);const CONSERVATIVE_EXTENSION_ACTIVATION_CAPABILITIES=new Set(["commands","schema","services","importers"]);const SEARCH_EXTENSION_ACTIVATION_COMMANDS=new Set(["reindex","search","search-advanced"]);const CREATE_TEMPLATE_FLAGS=new Set(["--template"]);function hasAnyCapability(capabilities,expected){for(const capability of expected){if(capabilities.has(capability)){return true}}return false}function commandPathNeedsSearchExtensions(commandPath){const normalized=normalizeExtensionCommandPath(commandPath??"");if(normalized.length===0){return false}const[topLevel]=normalized.split(" ");return SEARCH_EXTENSION_ACTIVATION_COMMANDS.has(topLevel??normalized)}function probeUsesAnyFlag(probe,flags){for(const arg of probe.commandArgs??[]){if(!arg.startsWith("--")){continue}const[flagName]=arg.split("=",1);if(flags.has(flagName)){return true}}return false}function commandPathNeedsTemplateExtensions(probe){return normalizeExtensionCommandPath(probe.commandPath??"")==="create"&&probeUsesAnyFlag(probe,CREATE_TEMPLATE_FLAGS)}function extensionProvidesTemplatesRuntime(commands){return commands.some(command=>{const normalized=normalizeExtensionCommandPath(command);return normalized==="templates"||normalized.startsWith("templates ")})}function matchesStaticExtensionCommand(commands,probe){return commands.some(command=>activationCommandMatchesProbe(command,probe))||commandPathNeedsTemplateExtensions(probe)&&extensionProvidesTemplatesRuntime(commands)}function hasGlobalExtensionContributions(contributions){const contributionCounts=[entriesOrEmpty(contributions.hooks).length,(contributions.preflight_overrides??0)-entriesOrEmpty(contributions.preflight_ownership).length,entriesOrEmpty(contributions.item_types).length,entriesOrEmpty(contributions.item_fields).length,entriesOrEmpty(contributions.relationship_kinds).length,entriesOrEmpty(contributions.service_overrides).length,entriesOrEmpty(contributions.assurance_providers).length,entriesOrEmpty(contributions.renderer_overrides).length-entriesOrEmpty(contributions.renderer_ownership).length];return contributionCounts.some(count=>count>0)}function resolveStaticExtensionActivationDecision(extension,probe){const explicitCommands=extension.activation?.commands??[];if(explicitCommands.length>0){return matchesStaticExtensionCommand(explicitCommands,probe)}const commands=extensionActivationCommands(extension);if(matchesStaticExtensionCommand(commands,probe))return true;if(extensionCapabilities(extension).has("search")&&commandPathNeedsSearchExtensions(probe.commandPath)){return true}if(extension.contributions){return hasGlobalExtensionContributions(extension.contributions)}return void 0}function extensionNeedsActivationForProbe(extension,probe){const staticDecision=resolveStaticExtensionActivationDecision(extension,probe);if(staticDecision!==void 0)return staticDecision;const capabilities=extensionCapabilities(extension);if(hasAnyCapability(capabilities,GLOBAL_EXTENSION_ACTIVATION_CAPABILITIES)){return true}if(hasAnyCapability(capabilities,CONSERVATIVE_EXTENSION_ACTIVATION_CAPABILITIES)){return true}return false}function discoveryNeedsActivationForProbe(discovery,probe){if(discovery.effective.length===0){return false}const hasCommandProbe=buildRuntimeExtensionActivationScope(probe)!=="all";if(!hasCommandProbe){return discovery.effective.some(extension=>{const capabilities=extensionCapabilities(extension);return extensionActivationCommands(extension).length>0||hasAnyCapability(capabilities,GLOBAL_EXTENSION_ACTIVATION_CAPABILITIES)||hasAnyCapability(capabilities,CONSERVATIVE_EXTENSION_ACTIVATION_CAPABILITIES)||capabilities.has("search")})}return discovery.effective.some(extension=>extensionNeedsActivationForProbe(extension,probe))}function buildRuntimeExtensionActivationScope(probe){if(normalizeExtensionCommandPath(probe.commandPath??"").split(" ")[0]==="completion"){return"all"}const commandPath=collectActivationCommandCandidates(probe).filter(candidate=>candidate.split(" ").every(part=>!part.startsWith("-"))).sort((left,right)=>right.length-left.length)[0]??normalizeExtensionCommandPath(probe.commandPath??"");if(commandPath.length===0){return"all"}const args=commandPathNeedsTemplateExtensions(probe)?"--template":"";const prefix=probe.allowCommandPrefixMatch===true?"prefix":"exact";return`${prefix}:${commandPath}:${args}`}function buildRuntimeExtensionFilterForProbe(probe){return buildRuntimeExtensionActivationScope(probe)==="all"?void 0:extension=>extensionNeedsActivationForProbe(extension,probe)}function buildBootstrapActivationProbe(invocationArgv){const helpRequest=parseBootstrapHelpRequest(invocationArgv);if(helpRequest.requested&&helpRequest.commandPathTokens.length>0){const[commandPath,...commandArgs]=helpRequest.commandPathTokens;return{commandPath,commandArgs,allowCommandPrefixMatch:true}}const stripped=stripGlobalBootstrapTokens(invocationArgv);const commandIndex=stripped.findIndex(token=>token.trim().length>0&&!token.startsWith("-"));if(commandIndex<0){return{}}return{commandPath:stripped[commandIndex],commandArgs:stripped.slice(commandIndex+1),allowCommandPrefixMatch:helpRequest.requested}}function collectParsedActivationCommandArgs(command){const commandArgs=command.args.map(String);const commandPath=normalizeExtensionCommandPath(getCommandPath(command));if(commandPath==="create"){const options=command.optsWithGlobals();if(typeof options.template==="string"&&options.template.trim().length>0){commandArgs.push("--template")}}return commandArgs}function emitSettingsReadWarnings(warnings){for(const warning of warnings){if(warning.startsWith("settings_read_")){printError(`[pm] warning: ${warning} \u2014 settings.json could not be loaded and pm fell back to defaults; run pm health for remediation.`)}}}function emitExtensionProfile(globalOptions,snapshot){if(!globalOptions.profile){return}printError(`profile:extensions loaded=${snapshot.loadedCount} failed=${snapshot.loadFailedCount} warnings=${snapshot.loadWarnings.length} activation_failed=${snapshot.activationFailedCount} hook_counts=before:${snapshot.hooks.beforeCommand.length}|after:${snapshot.hooks.afterCommand.length}|write:${snapshot.hooks.onWrite.length}|read:${snapshot.hooks.onRead.length}|index:${snapshot.hooks.onIndex.length} command_overrides=${snapshot.commands.overrides.length} command_handlers=${snapshot.commands.handlers.length} parser_overrides=${snapshot.parsers.overrides.length} preflight_overrides=${snapshot.preflight.overrides.length} service_overrides=${snapshot.services.overrides.length} renderer_overrides=${snapshot.renderers.overrides.length}`);if(snapshot.activationWarnings.length>0){printError(`profile:extensions activation_warnings=${formatHookWarnings(snapshot.activationWarnings)}`)}}function emitExtensionSkippedProfile(profileEnabled,snapshot,probe){if(!profileEnabled){return}const command=normalizeExtensionCommandPath(probe.commandPath??"")||"<none>";printError(`profile:extensions activation=skipped command=${command} effective=${snapshot.discovery.effective.length} warnings=${snapshot.discovery.warnings.length} discovery_ms=${snapshot.discoveryMs}`)}async function loadRuntimeExtensionDiscoverySnapshot(pmRoot,readSettingsWithMetadataFn=readSettingsWithMetadata){const cacheKey=buildRuntimeExtensionDiscoverySnapshotCacheKey(pmRoot);if(runtimeExtensionDiscoverySnapshotCache?.key===cacheKey){return runtimeExtensionDiscoverySnapshotCache.snapshot}try{const startedAt=Date.now();const{settings,warnings:settingsReadWarnings}=await readSettingsWithMetadataFn(pmRoot);const discovery=await discoverExtensions({pmRoot,settings,cwd:process.cwd(),noExtensions:false});const snapshot={pmRoot,settings,discovery,discoveryMs:Date.now()-startedAt,settingsReadWarnings:[...settingsReadWarnings]};runtimeExtensionDiscoverySnapshotCache={key:cacheKey,snapshot};return snapshot}catch{runtimeExtensionDiscoverySnapshotCache={key:cacheKey,snapshot:null};return null}}async function loadRuntimeExtensionSnapshot(pmRoot,probe,readSettingsFn=readSettings){const activationScope=probe?buildRuntimeExtensionActivationScope(probe):"all";const cacheKey=buildRuntimeExtensionSnapshotCacheKey(pmRoot,activationScope);if(runtimeExtensionSnapshotCache?.key===cacheKey){return runtimeExtensionSnapshotCache.snapshot}try{const settings=await readSettingsFn(pmRoot);const loadResult=await loadExtensions({pmRoot,settings,cwd:process.cwd(),noExtensions:false,extensionFilter:probe?buildRuntimeExtensionFilterForProbe(probe):void 0});const activationResult=await activateExtensions({...loadResult,loaded:loadResult.loaded});const commandHandlers=[...new Set(activationResult.commands.handlers.map(entry=>normalizeExtensionCommandPath(entry.command)))].filter(entry=>entry.length>0).sort((left,right)=>left.localeCompare(right));const commandFlagHelp=collectDynamicExtensionFlagHelpByCommand(activationResult.registrations.flags);const canonicalAliases=buildCanonicalExtensionAliases(activationResult.commands.handlers,activationResult.registrations.commands);const commandDescriptors=collectExtensionCommandHelpDescriptors(commandHandlers,activationResult.registrations.commands,activationResult.registrations.flags,canonicalAliases);const snapshot={hooks:activationResult.hooks,commands:activationResult.commands,parsers:activationResult.parsers,preflight:activationResult.preflight,services:activationResult.services,renderers:activationResult.renderers,registrations:activationResult.registrations,pmRoot,settings,commandHandlers,commandFlagHelp,commandDescriptors,commandAliases:canonicalAliases,loadWarnings:[...loadResult.warnings],activationWarnings:[...activationResult.warnings],loadedCount:loadResult.loaded.length,loadFailedCount:loadResult.failed.length,activationFailedCount:activationResult.failed.length,contextIntentPackages:loadResult.loaded.map(({name,module})=>({name,module}))};runtimeExtensionSnapshotCache={key:cacheKey,snapshot};return snapshot}catch{runtimeExtensionSnapshotCache={key:cacheKey,snapshot:null};return null}}async function maybeLoadRuntimeExtensions(command){const globalOptions=getGlobalOptions(command);if(globalOptions.noExtensions){const noExtPmRoot=resolvePmRoot(process.cwd(),globalOptions.path);if(await pathExists(getSettingsPath(noExtPmRoot))){emitSettingsReadWarnings((await readSettingsWithMetadata(noExtPmRoot)).warnings)}return null}const pmRoot=resolvePmRoot(process.cwd(),globalOptions.path);const discoverySnapshot=await loadRuntimeExtensionDiscoverySnapshot(pmRoot);if(!discoverySnapshot){return null}emitSettingsReadWarnings(discoverySnapshot.settingsReadWarnings);const probe={commandPath:getCommandPath(command),commandArgs:collectParsedActivationCommandArgs(command)};if(!discoveryNeedsActivationForProbe(discoverySnapshot.discovery,probe)){emitExtensionSkippedProfile(globalOptions.profile,discoverySnapshot,probe);return null}const snapshot=await loadRuntimeExtensionSnapshot(pmRoot,probe);if(!snapshot){return null}emitExtensionProfile(globalOptions,snapshot);return{hooks:snapshot.hooks,commands:snapshot.commands,parsers:snapshot.parsers,preflight:snapshot.preflight,services:snapshot.services,renderers:snapshot.renderers,registrations:snapshot.registrations,pmRoot}}async function loadRuntimeExtensionCommandDescriptorsForRecovery(pmRoot){const snapshot=await loadRuntimeExtensionSnapshot(pmRoot);return snapshot?new Map(snapshot.commandDescriptors):activeRuntimeExtensionCommandDescriptors}async function executeRegisteredRuntimeMigrations(migrations,pmRoot){const result=await runExtensionMigrations({pmRoot,migrations,author:"pm-extension-migration"});return result.migrations.filter(migration=>migration.outcome==="failed").map(migration=>`extension_migration_failed:${migration.layer}:${migration.extension}:${migration.id}`)}function buildExtensionCommandSdk(pmRoot,global2){const author=typeof global2.author==="string"&&global2.author.trim()?global2.author.trim():"pm-extension";return createExtensionCommandSdk(pmRoot,PmClient.forActiveExtensionHost({pmRoot,author}))}async function runRequiredExtensionCommand(command,options,globalOptions,extensionFlagDefinitions=[]){const commandPath=getCommandPath(command);let commandArgs=stripLooseCommandOptionTokens(command.args.map(String),extensionFlagDefinitions);let commandOptions={...options};let resolvedGlobalOptions={...globalOptions};const pmRoot=resolvePmRoot(process.cwd(),globalOptions.path);const parserOverride=await runActiveParserOverride({command:commandPath,args:commandArgs,options:commandOptions,global:resolvedGlobalOptions,pm_root:pmRoot});if(globalOptions.profile&&parserOverride.warnings.length>0){printError(`profile:extensions parser_warnings=${formatHookWarnings(parserOverride.warnings)}`)}commandArgs=parserOverride.context.args;commandOptions=parserOverride.context.options;resolvedGlobalOptions=parserOverride.context.global;validateDynamicExtensionCommandInvocation(activeRuntimeExtensionCommandDescriptors.get(normalizeExtensionCommandPath(commandPath)),commandArgs,commandOptions,extensionFlagDefinitions);setActiveCommandResult(void 0);setActiveCommandContext({command:commandPath,args:commandArgs,options:{...commandOptions},global:{...resolvedGlobalOptions},pm_root:pmRoot});const extensionCommandResult=await runActiveCommandHandler({command:commandPath,args:commandArgs,options:commandOptions,global:resolvedGlobalOptions,pm_root:pmRoot,sdk:buildExtensionCommandSdk(pmRoot,resolvedGlobalOptions)});if(resolvedGlobalOptions.profile&&extensionCommandResult.warnings.length>0){printError(`profile:extensions command_handler_warnings=${formatHookWarnings(extensionCommandResult.warnings)}`)}if(!extensionCommandResult.handled){if(extensionCommandResult.warnings.length>0){const warningCode=extensionCommandResult.warnings[0];const cause=extensionCommandResult.errorMessage?.trim();const causeSuffix=cause?` ${cause}`:"";throw new PmCliError(`Command "${commandPath}" failed in extension handler (${warningCode}).${causeSuffix}`,EXIT_CODE.GENERIC_FAILURE,{code:extensionCommandResult.errorCode??"command_failed",nextSteps:extensionCommandResult.remediation?[extensionCommandResult.remediation]:void 0})}throw new PmCliError(`Command "${commandPath}" is provided by extensions and is not currently available.`,EXIT_CODE.NOT_FOUND)}if(extensionCommandResult.exitCode!==void 0){process.exitCode=extensionCommandResult.exitCode}setActiveCommandResult(extensionCommandResult.result);return extensionCommandResult.result}const WRAPPED_ACTION_HANDLER=Symbol("pm.wrappedActionHandler");function resolveActionCommand(actionArgs,fallback){const possibleCommand=actionArgs[actionArgs.length-1];return possibleCommand instanceof Command?possibleCommand:fallback}function maybePrintExtensionProfileWarnings(enabled,label,warnings){if(enabled&&warnings.length>0){printError(`profile:extensions ${label}=${formatHookWarnings(warnings)}`)}}function validateDynamicInvocationArgs(params){const dynamicDescriptor=activeRuntimeExtensionCommandDescriptors.get(normalizeExtensionCommandPath(params.commandPath));if(!dynamicDescriptor||!isImporterOrExporterCommandPath(params.activeRegistrations,params.commandPath)){return}const positionalArgs=dynamicCommandArguments(dynamicDescriptor).length===0?collectLoosePositionalArgs(params.commandArgs):stripLooseCommandOptionTokens(params.commandArgs,params.extensionFlagDefinitions);validateDynamicExtensionCommandArgs(dynamicDescriptor,positionalArgs)}function syncCommanderActionArgs(actionCommand,actionArgs,commandArgs){actionCommand.args=[...commandArgs];if("_processArguments"in actionCommand&&typeof actionCommand._processArguments==="function"){actionCommand._processArguments()}if(actionArgs.length>0&&Array.isArray(actionArgs[0])){actionArgs[0]=[...actionCommand.processedArgs]}}function wrapProgramActionsForExtensionHandlers(rootProgram){const visit=entry=>{const actionEntry=entry;if(typeof actionEntry._actionHandler==="function"&&actionEntry[WRAPPED_ACTION_HANDLER]!==true){const originalAction=actionEntry._actionHandler;actionEntry._actionHandler=async function wrappedActionHandler(...actionArgs){const actionCommand=resolveActionCommand(actionArgs,entry);const startedAt=Date.now();clearResolvedGlobalOptions(actionCommand);let globalOptions=getGlobalOptions(actionCommand);const commandPath=resolvePmCommandOperation(getCommandPath(actionCommand));const pmRoot=resolvePmRoot(process.cwd(),globalOptions.path);let commandArgs=actionCommand.args.map(String);const activeRegistrations=getActiveExtensionRegistrations();const extensionFlagDefinitions=activeRegistrations?collectExtensionFlagDefinitionsForInvocation(activeRegistrations,commandPath,commandArgs):[];const runtimeFieldFlagDefinitions=await collectRuntimeFieldLooseFlagDefinitionsForCommand(commandPath,pmRoot);let commandOptions=extractCommandScopedOptions(actionCommand,commandArgs,[...extensionFlagDefinitions,...runtimeFieldFlagDefinitions]);const parserOverride=await runActiveParserOverride({command:commandPath,args:commandArgs,options:commandOptions,global:globalOptions,pm_root:pmRoot});maybePrintExtensionProfileWarnings(globalOptions.profile,"parser_warnings",parserOverride.warnings);commandArgs=parserOverride.context.args;commandOptions=parserOverride.context.options;globalOptions=parserOverride.context.global;validateDynamicInvocationArgs({activeRegistrations,commandPath,commandArgs,extensionFlagDefinitions});globalOptions=await applyDefaultOutputFormat(globalOptions);setResolvedGlobalOptions(actionCommand,globalOptions);syncCommanderActionArgs(actionCommand,actionArgs,commandArgs);syncCommanderActionOptions(actionCommand,commandOptions);setActiveCommandResult(void 0);setActiveCommandContext({command:commandPath,args:commandArgs,options:{...commandOptions},global:{...globalOptions},pm_root:pmRoot});const extensionCommandResult=await runActiveCommandHandler({command:commandPath,args:commandArgs,options:commandOptions,global:globalOptions,pm_root:pmRoot,sdk:buildExtensionCommandSdk(pmRoot,globalOptions)});maybePrintExtensionProfileWarnings(globalOptions.profile,"command_handler_warnings",extensionCommandResult.warnings);if(extensionCommandResult.handled){setActiveCommandResult(extensionCommandResult.result);printResult(extensionCommandResult.result,{...globalOptions,command:commandPath,commandArgs,commandOptions,pmRoot});if(globalOptions.profile){printError(`profile:command=${commandPath} took_ms=${Date.now()-startedAt}`)}return}return await originalAction.apply(this,actionArgs)};actionEntry[WRAPPED_ACTION_HANDLER]=true}for(const child of entry.commands){visit(child)}};visit(rootProgram)}async function clearDynamicExtensionCommandState(params){activeRuntimeExtensionCommandDescriptors=new Map;setActiveExtensionServices({overrides:[]});if(params){await maybeAttachCreateUpdatePolicyHelpText(params.rootProgram,params.pmRoot,params.invocationArgv,createEmptyExtensionRegistrationRegistry(),params.settings)}}function attachDynamicExtensionHelp(command,descriptor,flagHelp,metadataHelp){if(descriptor?.flags&&descriptor.flags.length>0){applyDynamicExtensionFlagOptions(command,descriptor.flags);const residualFlagHelp=buildResidualDynamicExtensionFlagHelp(command,descriptor.flags);if(residualFlagHelp){command.addHelpText("after",residualFlagHelp)}}else if(flagHelp){command.addHelpText("after",flagHelp)}if(metadataHelp){command.addHelpText("after",metadataHelp)}}function applyDynamicExtensionRootHelpVisibility(rootProgram,preexistingTopLevelCommands,descriptors){const tierRank={core:0,standard:1,full:2,internal:3};const applyVisibility=(command,pathParts)=>{const commandPath=pathParts.join(" ");const matchingDescriptors=[...descriptors.entries()].filter(([path])=>path===commandPath||path.startsWith(`${commandPath} `)).map(([,descriptor])=>descriptor);const tier=matchingDescriptors.length===0?"standard":matchingDescriptors.reduce((selected,descriptor)=>tierRank[descriptor.tier]<tierRank[selected]?descriptor.tier:selected,"internal");setPmCommandHelpVisibilityTier(command,tier);for(const child of command.commands){applyVisibility(child,[...pathParts,child.name()])}};for(const command of rootProgram.commands){if(!preexistingTopLevelCommands.has(command.name())){applyVisibility(command,[command.name()])}}}async function registerDynamicExtensionCommandPaths(rootProgram,invocationArgv){const bootstrapGlobalOptions=parseBootstrapGlobalOptions(invocationArgv);const pmRoot=resolvePmRoot(process.cwd(),bootstrapGlobalOptions.path);if(bootstrapGlobalOptions.noExtensions){await clearDynamicExtensionCommandState({rootProgram,pmRoot,invocationArgv});return}const discoverySnapshot=await loadRuntimeExtensionDiscoverySnapshot(pmRoot);const probe=buildBootstrapActivationProbe(invocationArgv);if(!discoverySnapshot){await clearDynamicExtensionCommandState();return}if(!discoveryNeedsActivationForProbe(discoverySnapshot.discovery,probe)){await clearDynamicExtensionCommandState({rootProgram,pmRoot,invocationArgv,settings:discoverySnapshot.settings});emitExtensionSkippedProfile(bootstrapProfileEnabled(invocationArgv),discoverySnapshot,probe);return}const snapshot=await loadRuntimeExtensionSnapshot(pmRoot,probe);if(!snapshot){await clearDynamicExtensionCommandState({rootProgram,pmRoot,invocationArgv,settings:discoverySnapshot.settings});return}setActiveExtensionServices(snapshot.services);activeRuntimeExtensionCommandDescriptors=new Map(snapshot.commandDescriptors);await maybeAttachCreateUpdatePolicyHelpText(rootProgram,pmRoot,invocationArgv,snapshot.registrations,snapshot.settings);const commandPaths=collectSafeExtensionCommandPaths(rootProgram,snapshot.commandHandlers,snapshot.commandDescriptors,snapshot.commandAliases,warning=>reportExtensionCommandCollision(snapshot.activationWarnings,printError,warning));const preexistingTopLevelCommands=new Set(rootProgram.commands.map(command=>command.name()));const registerCommandPath=commandPath=>{const pathParts=commandPath.split(" ").filter(part=>part.length>0);const descriptor=snapshot.commandDescriptors.get(commandPath);const existingCommand=findCommandByPath(rootProgram,pathParts);const flagHelp=snapshot.commandFlagHelp.get(commandPath);const metadataHelp=descriptor?buildDynamicExtensionCommandMetadataHelp(descriptor):null;if(existingCommand){attachDynamicExtensionHelp(existingCommand,descriptor,flagHelp,metadataHelp);return}const dynamicCommand=ensureCommandPath(rootProgram,pathParts);if(descriptor?.description){dynamicCommand.description(descriptor.description)}let residualDynamicFlagHelp=flagHelp;if(descriptor){applyDynamicExtensionArguments(dynamicCommand,descriptor);if(descriptor.flags.length>0){applyDynamicExtensionFlagOptions(dynamicCommand,descriptor.flags);residualDynamicFlagHelp=buildResidualDynamicExtensionFlagHelp(dynamicCommand,descriptor.flags)??void 0}}if(residualDynamicFlagHelp){dynamicCommand.addHelpText("after",residualDynamicFlagHelp)}if(metadataHelp){dynamicCommand.addHelpText("after",metadataHelp)}dynamicCommand.allowUnknownOption(true).allowExcessArguments(true).action(async(...actionArgs)=>{const maybeCommand=actionArgs[actionArgs.length-1];const command=maybeCommand instanceof Command?maybeCommand:dynamicCommand;const globalOptions=getGlobalOptions(command);const startedAt=Date.now();const extensionFlagDefinitions=collectExtensionFlagDefinitionsForInvocation(snapshot.registrations,commandPath,command.args.map(String));const scopedOptions=extractCommandScopedOptions(command,command.args.map(String),extensionFlagDefinitions);const result=await runRequiredExtensionCommand(command,scopedOptions,globalOptions,extensionFlagDefinitions);await invalidateSearchCachesForMutation(globalOptions,result);printResult(result,{...globalOptions,command:commandPath,commandArgs:command.args.map(String),commandOptions:scopedOptions,pmRoot});if(globalOptions.profile){printError(`profile:command=${commandPath} took_ms=${Date.now()-startedAt}`)}})};for(const commandPath of commandPaths){registerCommandPath(commandPath)}applyDynamicExtensionRootHelpVisibility(rootProgram,preexistingTopLevelCommands,snapshot.commandDescriptors)}const CLI_VERSION=resolvePmCliVersion(import.meta.url,["../.."])??"0.0.0";let program=createPmCliProgram(CLI_VERSION);function attachProgramLifecycleHooks(rootProgram){rootProgram.hook("preAction",async(_thisCommand,actionCommand)=>{activeExtensionHookContext=null;activeTelemetryCommandContext=null;clearActiveExtensionHooks();clearResolvedGlobalOptions(actionCommand);const rawGlobalOptions=actionCommand.optsWithGlobals();const bootstrapGlobalOptions=getGlobalOptions(actionCommand);const commandPath=resolvePmCommandOperation(getCommandPath(actionCommand));let commandArgs=actionCommand.args.map(String);let commandOptions=extractCommandScopedOptions(actionCommand,commandArgs);let globalOptions={...bootstrapGlobalOptions};validateReadOutputOptions(commandPath,{...commandOptions,outputInclude:rawGlobalOptions.outputInclude,outputLimit:rawGlobalOptions.outputLimit,outputBudget:rawGlobalOptions.outputBudget,outputFormat:rawGlobalOptions.outputFormat,outputSession:rawGlobalOptions.outputSession,outputCursor:rawGlobalOptions.outputCursor});forwardReadOutputIncludeModes(actionCommand,commandPath,globalOptions,commandOptions);await maybeRunFirstUseTelemetryPrompt(commandPath,globalOptions);const fallbackPmRoot=resolvePmRoot(process.cwd(),bootstrapGlobalOptions.path);const runtimeExtensions=await maybeLoadRuntimeExtensions(actionCommand);if(!runtimeExtensions){activeExtensionHookContext=createCoreCommandHookContext({commandName:commandPath,commandArgs,commandOptions,globalOptions,pmRoot:fallbackPmRoot});activeTelemetryCommandContext=await startTelemetryCommand({command:commandPath,pm_version:CLI_VERSION,args:commandArgs,options:commandOptions,global:globalOptions,pm_root:fallbackPmRoot});sentrySetCommandContext(commandPath,commandArgs,commandOptions,{source_context:activeTelemetryCommandContext?.source_context,source_context_source:activeTelemetryCommandContext?.source_context_source});sentryStartCommandSpan(commandPath);await enforceItemFormatWriteGateAndPreflightMigration(commandPath,commandOptions,fallbackPmRoot,defaultPreflightDecision());await enforceMutationGuardPreflight(commandPath,commandArgs,commandOptions,globalOptions,fallbackPmRoot);return}setActiveExtensionHooks(runtimeExtensions.hooks);setActiveExtensionCommands(runtimeExtensions.commands);setActiveExtensionParsers(runtimeExtensions.parsers);setActiveExtensionPreflight(runtimeExtensions.preflight);setActiveExtensionServices(runtimeExtensions.services);setActiveExtensionRenderers(runtimeExtensions.renderers);setActiveExtensionRegistrations(runtimeExtensions.registrations);const extensionFlagDefinitions=collectExtensionFlagDefinitionsForInvocation(runtimeExtensions.registrations,commandPath,commandArgs);commandOptions=extractCommandScopedOptions(actionCommand,commandArgs,extensionFlagDefinitions);forwardReadOutputIncludeModes(actionCommand,commandPath,globalOptions,commandOptions);const parserOverride=await runActiveParserOverride({command:commandPath,args:commandArgs,options:commandOptions,global:globalOptions,pm_root:runtimeExtensions.pmRoot});if(globalOptions.profile&&parserOverride.warnings.length>0){printError(`profile:extensions parser_warnings=${formatHookWarnings(parserOverride.warnings)}`)}commandArgs=parserOverride.context.args;commandOptions=parserOverride.context.options;globalOptions=parserOverride.context.global;syncCommanderActionOptions(actionCommand,commandOptions);const preflightOverride=await runActivePreflightOverride({command:commandPath,args:commandArgs,options:commandOptions,global:globalOptions,pm_root:runtimeExtensions.pmRoot,decision:defaultPreflightDecision()});if(globalOptions.profile&&preflightOverride.warnings.length>0){printError(`profile:extensions preflight_warnings=${formatHookWarnings(preflightOverride.warnings)}`)}commandArgs=preflightOverride.context.args;commandOptions=preflightOverride.context.options;globalOptions=preflightOverride.context.global;syncCommanderActionOptions(actionCommand,commandOptions);const preflightDecision=preflightOverride.decision;await enforceItemFormatWriteGateAndPreflightMigration(commandPath,commandOptions,runtimeExtensions.pmRoot,preflightDecision);await enforceMutationGuardPreflight(commandPath,commandArgs,commandOptions,globalOptions,runtimeExtensions.pmRoot);const migrationWarnings=preflightDecision.run_extension_migrations?await executeRegisteredRuntimeMigrations(runtimeExtensions.registrations.migrations,runtimeExtensions.pmRoot):[];if(globalOptions.profile&&migrationWarnings.length>0){printError(`profile:extensions migration_warnings=${formatHookWarnings(migrationWarnings)}`)}const migrationBlockers=collectMandatoryMigrationBlockers(runtimeExtensions.registrations.migrations);activeExtensionHookContext={hooks:runtimeExtensions.hooks,commandName:commandPath,commandArgs,commandOptions:{...commandOptions},globalOptions:{...globalOptions},pmRoot:runtimeExtensions.pmRoot,profileEnabled:Boolean(globalOptions.profile),migrationBlockers};setActiveCommandResult(void 0);setActiveCommandContext({command:commandPath,args:commandArgs,options:{...commandOptions},global:{...globalOptions},pm_root:runtimeExtensions.pmRoot});activeTelemetryCommandContext=await startTelemetryCommand({command:commandPath,pm_version:CLI_VERSION,args:commandArgs,options:commandOptions,global:globalOptions,pm_root:runtimeExtensions.pmRoot});sentrySetCommandContext(commandPath,commandArgs,commandOptions,{source_context:activeTelemetryCommandContext?.source_context,source_context_source:activeTelemetryCommandContext?.source_context_source});sentryStartCommandSpan(commandPath);const hookWarnings=await runBeforeCommandHooks(runtimeExtensions.hooks,{command:commandPath,args:commandArgs,options:{...commandOptions},global:{...globalOptions},pm_root:runtimeExtensions.pmRoot});if(globalOptions.profile&&hookWarnings.length>0){printError(`profile:extensions hook_warnings=${formatHookWarnings(hookWarnings)}`)}if(preflightDecision.enforce_mandatory_migration_gate){enforceMandatoryMigrationWriteGate(commandPath,commandOptions,migrationBlockers)}});rootProgram.hook("postAction",async()=>{const outcome=buildPostActionTelemetryOutcome();sentryFinishCommandSpan(outcome.ok,outcome.error,{error_code:outcome.error_code,error_category:outcome.error_category,exit_code:outcome.exit_code,command_resolution:outcome.command_resolution,resolution_stage:outcome.resolution_stage});await runAndClearAfterCommandHooks(outcome)})}attachProgramLifecycleHooks(program);const VERSION_FLAG_TOKENS=new Set(["--version","-V"]);const SETUP_COMMAND_NAMES=new Set(["config","extension","init","install","package","packages","templates","upgrade"]);const LIST_QUERY_COMMAND_NAMES=new Set(["activity","aggregate","context","ctx","events","get","graph","history","list","list-all","list-blocked","list-canceled","list-closed","list-draft","list-in-progress","list-open","search"]);const MUTATION_COMMAND_NAMES=new Set(["append","close","close-many","comments","delete","deps","discover","docs","files","history-repair","history-redact","history-compact","learnings","notes","plan","restore","update","update-many","create"]);const OPERATION_COMMAND_NAMES=new Set(["claim","close-task","contracts","duplicates","gc","health","pause-task","release","start-task","stats","test","test-all","test-runs","test-runs-worker","validate"]);const MUTATING_OPERATION_COMMAND_NAMES=new Set(["claim","close-task","pause-task","release","start-task","test"]);const REGISTER_ALL_CORE_COMMAND_FAMILIES={setup:true,listQuery:true,mutation:true,operation:true};const RUNTIME_SCHEMA_FLAG_BOOTSTRAP_COMMANDS=new Set(["create","update","update-many","list","list-all","list-draft","list-open","list-in-progress","list-blocked","list-closed","list-canceled","search","calendar","context","templates"]);function invocationRequestsVersion(invocationArgv){return invocationArgv.some(token=>VERSION_FLAG_TOKENS.has(token))}function resolveCoreCommandRegistrationSelection(invocationArgv){if(invocationRequestsVersion(invocationArgv)){return{setup:false,listQuery:false,mutation:false,operation:false}}if(invocationArgv.length===0||parseBootstrapHelpRequest(invocationArgv).requested){return REGISTER_ALL_CORE_COMMAND_FAMILIES}const commandName=parseBootstrapCommandName(invocationArgv);if(!commandName){return REGISTER_ALL_CORE_COMMAND_FAMILIES}const normalizedCommand=commandName.trim().toLowerCase();const commandTokens=stripGlobalBootstrapTokens(invocationArgv);const semanticCommand=findPmNamespacedCommand(commandTokens)?.alias;if(PM_RELOCATED_COMMAND_ALIASES.some(alias=>alias.alias===semanticCommand)){return{...REGISTER_ALL_CORE_COMMAND_FAMILIES,targetCommandName:semanticCommand}}if(SETUP_COMMAND_NAMES.has(normalizedCommand)){return{setup:true,listQuery:false,mutation:false,operation:false,targetCommandName:normalizedCommand}}if(LIST_QUERY_COMMAND_NAMES.has(normalizedCommand)){return{setup:false,listQuery:true,mutation:false,operation:false,targetCommandName:normalizedCommand}}if(MUTATION_COMMAND_NAMES.has(normalizedCommand)){return{setup:false,listQuery:false,mutation:true,operation:false,targetCommandName:normalizedCommand}}if(OPERATION_COMMAND_NAMES.has(normalizedCommand)){return{setup:false,listQuery:false,mutation:false,operation:true,targetCommandName:normalizedCommand}}return REGISTER_ALL_CORE_COMMAND_FAMILIES}function shouldAttachRichHelpTextForInvocation(invocationArgv){return invocationArgv.length===0||parseBootstrapHelpRequest(invocationArgv).requested||invocationArgv.includes("--explain")&&parseBootstrapCommandName(invocationArgv)===void 0}const IDEMPOTENT_TOP_LEVEL_REGISTRATION=Symbol("pmCliIdempotentTopLevelRegistration");function ensureIdempotentTopLevelCommandRegistration(rootProgram){const guarded=rootProgram;if(guarded[IDEMPOTENT_TOP_LEVEL_REGISTRATION]){return}guarded[IDEMPOTENT_TOP_LEVEL_REGISTRATION]=true;const registerOriginalCommand=rootProgram.command.bind(rootProgram);rootProgram.command=((nameAndArgs,...rest)=>{const commandName=nameAndArgs.split(/\s+/u)[0];if(rootProgram.commands.some(existing=>existing.name()===commandName||existing.aliases().includes(commandName))){return new Command(commandName)}return registerOriginalCommand(nameAndArgs,...rest)})}async function registerCoreCommandFamilies(rootProgram,selection){ensureIdempotentTopLevelCommandRegistration(rootProgram);if(selection.setup){const{registerSetupCommands}=await loadSetupRegistrationModule();registerSetupCommands(rootProgram)}if(selection.listQuery){const{registerListQueryCommands}=await loadListQueryRegistrationModule();const commandFilter=typeof selection.targetCommandName==="string"&&LIST_QUERY_COMMAND_NAMES.has(selection.targetCommandName)?new Set([selection.targetCommandName]):void 0;registerListQueryCommands(rootProgram,commandFilter?{commandFilter}:void 0)}if(selection.mutation){const{registerMutationCommands}=await loadMutationRegistrationModule();registerMutationCommands(rootProgram,{targetCommandName:selection.targetCommandName})}if(selection.operation){const{registerOperationCommands}=await loadOperationRegistrationModule();registerOperationCommands(rootProgram)}}function shouldRegisterDynamicExtensionPaths(_rootProgram,invocationArgv){if(invocationRequestsVersion(invocationArgv)){return false}if(isFullHelpDiscovery(invocationArgv)){return true}const helpRequest=parseBootstrapHelpRequest(invocationArgv);if(helpRequest.requested){return true}const commandName=parseBootstrapCommandName(invocationArgv);if(!commandName){return false}return true}function shouldRegisterRuntimeSchemaFlags(invocationArgv){if(invocationRequestsVersion(invocationArgv)){return false}const commandName=parseBootstrapCommandName(invocationArgv);if(!commandName){return false}return RUNTIME_SCHEMA_FLAG_BOOTSTRAP_COMMANDS.has(commandName)}function redactSensitiveFlagTypo(params){const rawTypoToken=String(params.rawFrom??"");const rawTypoEqualsIndex=rawTypoToken.indexOf("=");const rawTypoFlag=rawTypoEqualsIndex>=0?rawTypoToken.slice(0,rawTypoEqualsIndex):rawTypoToken;const sensitiveCanonicalFlag=params.normalizedTokens.map(token=>{const equalsIndex=token.indexOf("=");return equalsIndex>=0?token.slice(0,equalsIndex):token}).find(token=>token==="--literal"||token==="--regex"||token==="--replacement");const typoNormalizedArgv=sensitiveCanonicalFlag?params.argv.map(token=>{const equalsIndex=token.indexOf("=");const flag=equalsIndex>=0?token.slice(0,equalsIndex):token;return flag===rawTypoFlag?equalsIndex>=0?`${sensitiveCanonicalFlag}${token.slice(equalsIndex)}`:sensitiveCanonicalFlag:token}):params.argv;const safeArgv=redactSensitiveCommandArgs(typoNormalizedArgv);const safeTypoDisplay=sensitiveCanonicalFlag&&rawTypoEqualsIndex>=0?`${rawTypoFlag}=[redacted]`:rawTypoToken;const safeNormalizedDisplay=sensitiveCanonicalFlag&&params.normalizedDisplay.includes("=")?`${sensitiveCanonicalFlag}=[redacted]`:params.normalizedDisplay;return{argv:safeArgv,normalizedDisplay:safeNormalizedDisplay,sourceDisplay:safeTypoDisplay}}function enforceExplicitRetryForFlagTypos(bootstrapInvocation){const commandName=bootstrapInvocation.commandName;if(!commandName){return}const typoEvent=bootstrapInvocation.trace.find(entry=>entry.reason==="flag_typo");if(!typoEvent){return}const normalizedTokens=Array.isArray(typoEvent.to)?typoEvent.to:[String(typoEvent.to??"")].filter(entry=>entry.length>0);const normalizedDisplay=normalizedTokens.length>0?normalizedTokens.join(" "):"the canonical flag";const mutatingCommand=MUTATION_COMMAND_NAMES.has(commandName)||MUTATING_OPERATION_COMMAND_NAMES.has(commandName);const code=mutatingCommand?"mutating_flag_typo_requires_retry":"flag_typo_requires_retry";const commandScope=mutatingCommand?"mutating option":"option";const safeTypo=redactSensitiveFlagTypo({argv:bootstrapInvocation.argv,normalizedDisplay,normalizedTokens,rawFrom:typoEvent.from});throw new PmCliError(`Refusing to auto-correct ${commandScope} ${safeTypo.sourceDisplay} to ${safeTypo.normalizedDisplay}. Retry with the canonical flag so the command is explicit.`,EXIT_CODE.USAGE,{code,examples:[renderPmCommand(safeTypo.argv)],nextSteps:["Retry the command with the canonical flag shown in examples."],recovery:{normalized_args:safeTypo.argv,suggested_retry:renderPmCommand(safeTypo.argv)}})}function createTelemetryCommandErrorEmitter(params){return async event=>{const errorCategory=resolveTelemetryErrorCategory(event.errorCode);const commandResolution=deriveTelemetryCommandResolution({ok:false,errorCode:event.errorCode,errorCategory});await emitTelemetryErrorEvent({command:event.command,args:params.invocationArgv,options:event.options,global:params.bootstrapGlobal,pm_version:CLI_VERSION,pm_root:params.bootstrapPmRoot,error_code:event.errorCode,error_message:event.errorMessage,exit_code:event.exitCode,error_category:errorCategory,command_resolution:commandResolution,resolution_stage:event.resolutionStage});return{errorCategory,commandResolution}}}async function prepareExtensionServicesForRunPmCliError(params){if(params.bootstrapGlobal.noExtensions){return}const bootstrapProbe=buildBootstrapActivationProbe(params.invocationArgv);const discoverySnapshot=await loadRuntimeExtensionDiscoverySnapshot(params.bootstrapPmRoot);if(discoverySnapshot&&discoveryNeedsActivationForProbe(discoverySnapshot.discovery,bootstrapProbe)){const bootstrapSnapshot=await loadRuntimeExtensionSnapshot(params.bootstrapPmRoot,bootstrapProbe);setRecoveredExtensionServices(bootstrapSnapshot);return}if(discoverySnapshot){emitExtensionSkippedProfile(bootstrapProfileEnabled(params.invocationArgv),discoverySnapshot,bootstrapProbe)}setActiveExtensionServices({overrides:[]})}function setRecoveredExtensionServices(bootstrapSnapshot){if(!bootstrapSnapshot){setActiveExtensionServices({overrides:[]});return}setActiveExtensionServices(bootstrapSnapshot.services)}async function finishRunPmCliFailure(params){sentryFinishCommandSpan(false,params.errorMessage,{error_code:params.classificationCode,error_category:params.errorCategory,exit_code:params.exitCode,command_resolution:params.commandResolution,resolution_stage:params.resolutionStage});await runAndClearAfterCommandHooks({ok:false,error:params.errorMessage,exit_code:params.exitCode,error_code:params.classificationCode,error_category:params.errorCategory,command_resolution:params.commandResolution,resolution_stage:params.resolutionStage})}async function finishRunPmCliSuccessParse(){sentryFinishCommandSpan(true,void 0,{exit_code:EXIT_CODE.SUCCESS,command_resolution:"success",resolution_stage:"parse"});await runAndClearAfterCommandHooks({ok:true,exit_code:EXIT_CODE.SUCCESS,command_resolution:"success",resolution_stage:"parse"});process.exitCode=EXIT_CODE.SUCCESS}async function handleRunPmCliKnownError(context,numericExitCode){const hasExplicitExitCode=typeof numericExitCode==="number"&&Number.isFinite(numericExitCode);if(!(context.error instanceof PmCliError)&&(isCommanderError(context.error)||!hasExplicitExitCode)){return false}const errorMessage=describeUnknownError(context.error);const exitCode=context.error instanceof PmCliError?context.error.exitCode:normalizeThrownExitCode(numericExitCode);const rawContext=context.error instanceof PmCliError?context.error.context:void 0;const enrichedContext=buildPmCliRecoveryContext(rawContext,context.invocationArgv,errorMessage);const classification=classifyPmCliError(errorMessage,enrichedContext);const jsonErrorPayload=context.bootstrapGlobal.lean?projectLeanErrorEnvelope(formatPmCliErrorForJson(errorMessage,exitCode,enrichedContext)):formatPmCliErrorForJson(errorMessage,exitCode,enrichedContext);const renderedError=context.jsonErrors?JSON.stringify(context.bootstrapGlobal.tokenAccounting?attachOutputTokenAccounting(jsonErrorPayload,value=>`${JSON.stringify(value,null,2)}
1
+ !(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]="55cf18ea-fea1-5b3e-b10f-46f67f7f482b")}catch(e2){}})();import{Command,CommanderError}from"commander";import{findPmNamespacedCommand,resolvePmCommandOperation}from"../sdk/cli-contracts/command-aliases.js";import{createPmCliProgram}from"../sdk/cli-program.js";import{runWithDiscoveredContextIntentContracts}from"../sdk/context-intent-runtime.js";import{describeUnknownError,isCommanderError,normalizeThrownExitCode,readThrownExitCode,wrapThrownErrorForSentry}from"../sdk/error-runtime.js";import{createExtensionCommandSdk}from"../sdk/extension-command-context.js";import{runExtensionMigrations}from"../sdk/extension/migrations.js";import{applyInvocationAuthorOverride}from"../sdk/invocation-author.js";import{attachOutputTokenAccounting}from"../sdk/output-token-accounting.js";import{validateReadOutputOptions}from"../sdk/read-output-contracts.js";import{runWithReproducibleProcessEnvironment}from"../sdk/reproducibility/process.js";import{EXIT_CODE,PmCliError,activateExtensions,clearActiveExtensionHooks,consumeAfterCommandAffectedItems,createCoreCommandHookContext,createEmptyExtensionRegistrationRegistry,createLazyModule,deriveTelemetryCommandResolution,discoverExtensions,emitTelemetryErrorEvent,ensureSentryInit,getActiveCommandResult,getActiveExtensionRegistrations,getSettingsPath,loadExtensions,maybeRunFirstUseTelemetryPrompt,pathExists,printError,printResult,readSettings,readSettingsWithMetadata,resetActiveExtensionRuntimeState,resolveItemTypeRegistry,resolvePmCliVersion,resolvePmPackageRootFromModule,resolvePmRoot,resolveRuntimeFieldRegistry,resolveTelemetryErrorCategory,runActiveCommandHandler,runActiveParserOverride,runActivePreflightOverride,runAfterCommandHooks,runBeforeCommandHooks,runWithHarnessDetectionSignals,runWithWorkspaceHarnessSignalDescriptors,sentryCaptureCliError,sentryFinishCommandSpan,sentryFlush,sentryLogCliUsageError,sentrySetCommandContext,sentryStartCommandSpan,setActiveCommandContext,setActiveCommandResult,setActiveExtensionCommands,setActiveExtensionHooks,setActiveExtensionParsers,setActiveExtensionPreflight,setActiveExtensionRegistrations,setActiveExtensionRenderers,setActiveExtensionServices,startTelemetryCommand,writeStderr}from"../sdk/runtime-primitives.js";import{PmClient}from"../sdk/runtime.js";import{finishActiveTelemetryCommand,recordAfterCommandContextUsage}from"./after-command-context-usage.js";import{extractProvidedOptionFlags,normalizeLongOptionFlag,redactSensitiveCommandArgs,renderPmCommand}from"./argv-utils.js";import{applyBootstrapPagerPolicy,findBootstrapCommandTokenIndex,normalizeBootstrapInvocation,parseBootstrapCommandName,parseBootstrapGlobalOptions,parseBootstrapHelpRequest,stripGlobalBootstrapTokens}from"./bootstrap-args.js";import{installCommandNamespaces}from"./command-namespaces.js";import{appendCommanderExtensionFailures,formatCommanderUsageJson,formatCommanderUsageMessage,isKnownHelpCommandPath,resolveCommanderUsageContext,resolveUnknownCommanderToken}from"./commander-usage.js";import{loadContextIntentSnapshotForInvocation}from"./context-intent-invocation.js";import{classifyCommanderError,classifyPmCliError,classifyUnknownError,formatPmCliErrorForDisplay,formatPmCliErrorForJson,formatUnknownErrorForJson,projectLeanErrorEnvelope}from"./error-guidance.js";import{applyDynamicExtensionArguments,applyDynamicExtensionFlagOptions,buildCanonicalExtensionAliases,buildDynamicExtensionCommandMetadataHelp,buildResidualDynamicExtensionFlagHelp,collectDynamicExtensionFlagHelpByCommand,collectExtensionCommandHelpDescriptors,collectSafeExtensionCommandPaths,ensureCommandPath,extensionFlagTakesValueForInvocation,findCommandByPath,normalizeExtensionCommandPath,reportExtensionCommandCollision}from"./extension-command-help.js";import{collectLoosePositionalArgs,stripLooseCommandOptionTokens}from"./extension-command-options.js";import{loadExtensionRecoveryFailures,loadUnknownCommandRecoveryFailures}from"./extension-recovery.js";import{attachRichHelpText,isFullHelpDiscovery,setPmCommandHelpVisibilityTier}from"./help-content.js";import{attachCreateUpdatePolicyHelpText,maybeRenderBootstrapJsonHelp}from"./help-json-payload.js";import{collectMandatoryMigrationBlockers,enforceItemFormatWriteGateAndPreflightMigration,enforceMandatoryMigrationWriteGate,enforceMutationGuardPreflight}from"./migration-gates.js";import{applyDefaultOutputFormat,clearResolvedGlobalOptions,collect,formatHookWarnings,getCommandPath,getGlobalOptions,invalidateSearchCachesForMutation,setResolvedGlobalOptions,syncCommanderActionOptions}from"./registration-helpers.js";import{activationCommandMatchesProbe,buildBootstrapActivationProbe,buildRuntimeExtensionActivationScope,buildRuntimeExtensionFilterForProbe,collectActivationCommandCandidates,collectLeadingCommandArgs,collectParsedActivationCommandArgs,commandPathNeedsSearchExtensions,commandPathNeedsTemplateExtensions,discoveryNeedsActivationForProbe,extensionActivationCommands,extensionCapabilities,extensionNeedsActivationForProbe,extensionProvidesTemplatesRuntime,hasAnyCapability,hasGlobalExtensionContributions,matchesStaticExtensionCommand,probeUsesAnyFlag,resolveStaticExtensionActivationDecision}from"./runtime/activation.js";import{collectExtensionFlagDefinitionsForCommand,collectExtensionFlagDefinitionsForInvocation,dynamicCommandArguments,extractCommandScopedOptions,forwardReadOutputIncludeModes,isImporterOrExporterCommandPath,recordCliReadOutputInvocationProvenance,validateDynamicExtensionCommandArgs,validateDynamicExtensionCommandInvocation}from"./runtime/invocation-options.js";import{LIST_QUERY_COMMAND_NAMES,enforceExplicitRetryForFlagTypos,invocationRequestsVersion,resolveCoreCommandRegistrationSelection,shouldAttachRichHelpTextForInvocation,shouldRegisterDynamicExtensionPaths,shouldRegisterRuntimeSchemaFlags}from"./runtime/selection.js";import{buildPostActionTelemetryOutcome,inferPostActionErrorCode,inferPostActionFailureMessage,normalizeTelemetryCommandResolution,normalizeTelemetryErrorCategory,normalizeTelemetryResolutionStage,readRecordBoolean,readRecordNumber,readRecordString}from"./runtime/telemetry-outcome.js";const PM_PACKAGE_ROOT_ENV="PM_CLI_PACKAGE_ROOT";function resolvePmPackageRoot(){return resolvePmPackageRootFromModule(import.meta.url,["../.."])}if(typeof process.env[PM_PACKAGE_ROOT_ENV]!=="string"||process.env[PM_PACKAGE_ROOT_ENV]?.trim().length===0){process.env[PM_PACKAGE_ROOT_ENV]=resolvePmPackageRoot()}let activeExtensionHookContext=null;let activeTelemetryCommandContext=null;function setActiveExtensionHookContextForTest(context){activeExtensionHookContext=context}function setActiveRuntimeExtensionCommandDescriptorsForTest(descriptors){activeRuntimeExtensionCommandDescriptors=descriptors}let runtimeExtensionSnapshotCache=null;let runtimeExtensionDiscoverySnapshotCache=null;let activeRuntimeExtensionCommandDescriptors=new Map;const HANDLED_ERROR_SENTRY_FLUSH_TIMEOUT_MS=250;const EXPECTED_HANDLED_ERROR_EXIT_CODES=new Set([EXIT_CODE.USAGE,EXIT_CODE.NOT_FOUND,EXIT_CODE.CONFLICT]);const TRUE_LIKE_ENV_VALUES=new Set(["1","true","yes","on"]);const loadSetupRegistrationModule=createLazyModule(()=>import("./register-setup.js"));const loadListQueryRegistrationModule=createLazyModule(()=>import("./register-list-query.js"));const loadMutationRegistrationModule=createLazyModule(()=>import("./register-mutation.js"));const loadOperationRegistrationModule=createLazyModule(()=>import("./register-operations.js"));function renderAttemptedCommand(argv){return renderPmCommand(argv)}function inferMissingFieldsFromErrorMessage(message){const matches=message.match(/--[a-zA-Z0-9][a-zA-Z0-9_-]*/g);if(!matches||matches.length===0){return void 0}const normalized=[...new Set(matches.map(entry=>normalizeLongOptionFlag(entry)??entry))];return normalized.length>0?normalized:void 0}function inferMissingFieldsForRecovery(rawMessage,invocationArgv,existingRecovery){if(existingRecovery?.suggested_retry||rawMessage.includes("failed in extension handler (")||!/\b(?:missing|required|requires)\b/i.test(rawMessage)){return void 0}const providedFields=extractProvidedOptionFlags(invocationArgv);const providedSet=new Set(providedFields.map(flag=>normalizeLongOptionFlag(flag)??flag));const rawInferred=inferMissingFieldsFromErrorMessage(rawMessage);const commandName=invocationArgv.find(token=>program.commands.some(candidate=>candidate.name()===token));const command=commandName?program.commands.find(candidate=>candidate.name()===commandName):void 0;const declaredFlags=new Set([...program.options,...command?.options??[]].flatMap(option=>option.flags.split(/[ ,|]+/).map(flag=>normalizeLongOptionFlag(flag)).filter(flag=>flag!==void 0)));const trulyMissing=rawInferred?.filter(flag=>{const normalized=normalizeLongOptionFlag(flag)??flag;if(providedSet.has(normalized)){return false}return declaredFlags.has(normalized)||extensionFlagTakesValueForInvocation(invocationArgv,commandName,normalized,activeRuntimeExtensionCommandDescriptors)!==void 0});return trulyMissing&&trulyMissing.length>0?trulyMissing:void 0}function resolveRecoverySuggestedRetry(invocationArgv,attemptedCommand,inferredMissing,existingRecovery){if(existingRecovery?.suggested_retry){return existingRecovery.suggested_retry}const missingFlag=inferredMissing?.[0];const normalizedMissing=missingFlag?normalizeLongOptionFlag(missingFlag):void 0;const commandName=invocationArgv.find(token=>program.commands.some(candidate=>candidate.name()===token));const command=commandName?program.commands.find(candidate=>candidate.name()===commandName):void 0;const missingOption=normalizedMissing?command?.options.find(option=>option.flags.split(/[ ,|]+/).includes(normalizedMissing)):void 0;const extensionFlagTakesValue=extensionFlagTakesValueForInvocation(invocationArgv,commandName,normalizedMissing,activeRuntimeExtensionCommandDescriptors);const missingTokens=normalizedMissing?missingOption?.isBoolean()===true||extensionFlagTakesValue===false?[normalizedMissing]:[normalizedMissing,"<value>"]:[];const suggestedRetry=normalizedMissing?renderAttemptedCommand([...invocationArgv,...missingTokens]):attemptedCommand;return suggestedRetry===attemptedCommand?void 0:suggestedRetry}function projectExistingRecoveryOptionalFields(existingRecovery){if(!existingRecovery){return{}}const optionalFields=["recovery_mode","missing_required_fields","suggested_flags","suggested_retry_args","allowed_values","candidate_commands","candidate_commands_total","candidate_commands_truncated","fallback_candidates","next_best_command"];const projected={};for(const field of optionalFields){const value=existingRecovery[field];if(value!==void 0&&value!==null){projected[field]=value}}return projected}function buildRecoveryPayload(params){const existingRecovery=params.existingRecovery;return{attempted_command:existingRecovery?.attempted_command??params.attemptedCommand,normalized_args:existingRecovery?.normalized_args??[...params.invocationArgv],provided_fields:existingRecovery?.provided_fields??(params.providedFields.length>0?params.providedFields:void 0),missing:existingRecovery?.missing??params.inferredMissing,...projectExistingRecoveryOptionalFields(existingRecovery),...params.suggestedRetry?{suggested_retry:params.suggestedRetry}:{}}}function buildPmCliRecoveryContext(context,invocationArgv,rawMessage){const safeInvocationArgv=redactSensitiveCommandArgs(invocationArgv);const commandArgs=stripGlobalBootstrapTokens(safeInvocationArgv);const commandIndex=findBootstrapCommandTokenIndex(commandArgs);const[rootCommand,subcommand]=commandIndex===void 0?[]:commandArgs.slice(commandIndex,commandIndex+2);const explainRequested=safeInvocationArgv.includes("--explain");const rawExistingRecovery=context?.recovery;const existingRecovery=rawExistingRecovery&&(rootCommand==="history-redact"||rootCommand==="history"&&subcommand==="redact")?{...rawExistingRecovery,...rawExistingRecovery.attempted_command?{attempted_command:renderAttemptedCommand(safeInvocationArgv)}:{},...rawExistingRecovery.normalized_args?{normalized_args:[...safeInvocationArgv]}:{},...rawExistingRecovery.suggested_retry?{suggested_retry:renderAttemptedCommand(safeInvocationArgv)}:{},...rawExistingRecovery.suggested_retry_args?{suggested_retry_args:[...safeInvocationArgv]}:{}}:rawExistingRecovery;if(existingRecovery?.recovery_mode==="compact"&&!explainRequested){return{...context,recovery:existingRecovery}}const attemptedCommand=renderAttemptedCommand(safeInvocationArgv);const providedFields=extractProvidedOptionFlags(safeInvocationArgv);const inferredMissing=inferMissingFieldsForRecovery(rawMessage,safeInvocationArgv,existingRecovery);const suggestedRetry=resolveRecoverySuggestedRetry(safeInvocationArgv,attemptedCommand,inferredMissing,existingRecovery);const recovery=buildRecoveryPayload({invocationArgv:safeInvocationArgv,attemptedCommand,providedFields,inferredMissing,suggestedRetry,existingRecovery});return{...context,recovery}}async function runAndClearAfterCommandHooks(outcome){const telemetryRuntime=activeTelemetryCommandContext;activeTelemetryCommandContext=null;await finishActiveTelemetryCommand(telemetryRuntime,outcome);const runtime=activeExtensionHookContext;activeExtensionHookContext=null;if(!runtime){clearActiveExtensionHooks();return}let hookWarnings=[];const affected=consumeAfterCommandAffectedItems();try{await recordAfterCommandContextUsage({pmRoot:runtime.pmRoot,author:runtime.globalOptions.author,itemIds:outcome.ok?affected?.map(item=>item.id)??[]:[],intent:runtime.commandName})}catch{hookWarnings.push("context_usage_feedback_write_failed")}try{hookWarnings.push(...await runAfterCommandHooks(runtime.hooks,{command:runtime.commandName,args:runtime.commandArgs,options:{...runtime.commandOptions},global:{...runtime.globalOptions},pm_root:runtime.pmRoot,ok:outcome.ok,error:outcome.error,result:getActiveCommandResult(),affected}))}catch(error){const message=error instanceof Error?error.message:String(error);hookWarnings=[`afterCommand hooks failed: ${message}`]}finally{clearActiveExtensionHooks()}if(!runtime.globalOptions.json&&hookWarnings.length>0){printError(`[pm] warning: afterCommand hook_warnings=${formatHookWarnings(hookWarnings)}`)}if(runtime.profileEnabled&&hookWarnings.length>0){printError(`profile:extensions hook_warnings=${formatHookWarnings(hookWarnings)}`)}}async function ensureSentryForErrorReporting(){await ensureSentryInit()}function envFlagEnabled(key){return TRUE_LIKE_ENV_VALUES.has((process.env[key]??"").trim().toLowerCase())}function shouldLogHandledErrorToSentry(exitCode){if(envFlagEnabled("PM_SENTRY_CAPTURE_EXPECTED_ERRORS")){return true}return!EXPECTED_HANDLED_ERROR_EXIT_CODES.has(Math.trunc(exitCode))}async function maybeLogHandledCliErrorToSentry(params){if(!shouldLogHandledErrorToSentry(params.exit_code)){return false}await ensureSentryForErrorReporting();sentryLogCliUsageError(params);return true}async function handleGenericRunPmCliError(params){const message=describeUnknownError(params.error);const classification=classifyUnknownError(message);if(params.bootstrapGlobal.json){printError(JSON.stringify(formatUnknownErrorForJson(message,EXIT_CODE.GENERIC_FAILURE),null,2))}else{printError(message)}process.exitCode=EXIT_CODE.GENERIC_FAILURE;let errorCategory="runtime";let commandResolution="runtime_failed";try{await ensureSentryForErrorReporting();sentryCaptureCliError(params.error);const telemetry=await params.emitTelemetryCommandError({command:params.attemptedCommand,errorCode:classification.code,errorMessage:classification.detail,exitCode:EXIT_CODE.GENERIC_FAILURE,options:{bootstrap_global_options:params.bootstrapGlobal},resolutionStage:"execute"});errorCategory=telemetry.errorCategory;commandResolution=telemetry.commandResolution;sentryFinishCommandSpan(false,message,{error_code:classification.code,error_category:errorCategory,exit_code:EXIT_CODE.GENERIC_FAILURE,command_resolution:commandResolution,resolution_stage:"execute"})}catch(reportingError){if(!params.bootstrapGlobal.json){printError(`Failed to report error: ${describeUnknownError(reportingError)}`)}}try{await runAndClearAfterCommandHooks({ok:false,error:message,exit_code:EXIT_CODE.GENERIC_FAILURE,error_code:classification.code,error_category:errorCategory,command_resolution:commandResolution,resolution_stage:"execute"})}catch(hookError){if(!params.bootstrapGlobal.json){printError(`Failed to run error hooks: ${describeUnknownError(hookError)}`)}}try{await sentryFlush()}catch(flushError){if(!params.bootstrapGlobal.json){printError(`Failed to flush error reporting: ${describeUnknownError(flushError)}`)}}}const RUNTIME_FIELD_COMMAND_BY_COMMAND_PATH={create:"create",update:"update","update-many":"update_many",list:"list","list-all":"list","list-draft":"list","list-open":"list","list-in-progress":"list","list-blocked":"list","list-closed":"list","list-canceled":"list",search:"search",calendar:"calendar",context:"context","templates save":"create"};const runtimeFieldLooseFlagDefinitionCache=new Map;function toLooseFieldDefinitionType(fieldType){if(fieldType==="number"){return"number"}if(fieldType==="boolean"){return"boolean"}return"string"}function commandHasLongOption(command,longFlag){return command.options.some(option=>option.long===longFlag)}function commandHasShortOption(command,shortFlag){return command.options.some(option=>option.short===shortFlag)}function addRuntimeFieldOption(command,flagToken,description,repeatable){const normalizedToken=flagToken.trim();if(!normalizedToken){return}const helpText=description.length>0?description:`Runtime schema field (${flagToken})`;if(normalizedToken.startsWith("-")&&!normalizedToken.startsWith("--")){if(commandHasShortOption(command,normalizedToken)){return}if(repeatable){command.option(`${normalizedToken} <value>`,`${helpText} (repeatable)`,collect);return}command.option(`${normalizedToken} <value>`,helpText);return}const longFlag=normalizedToken.startsWith("--")?normalizedToken:`--${normalizedToken}`;if(commandHasLongOption(command,longFlag)){return}if(repeatable){command.option(`${longFlag} <value>`,`${helpText} (repeatable)`,collect);return}command.option(`${longFlag} <value>`,helpText)}async function collectRuntimeFieldLooseFlagDefinitionsForCommand(commandPath,pmRoot){const runtimeCommand=RUNTIME_FIELD_COMMAND_BY_COMMAND_PATH[commandPath];if(!runtimeCommand){return[]}const cacheKey=`${pmRoot}:${runtimeCommand}`;const cached=runtimeFieldLooseFlagDefinitionCache.get(cacheKey);if(cached){return cached}if(!await pathExists(getSettingsPath(pmRoot))){runtimeFieldLooseFlagDefinitionCache.set(cacheKey,[]);return[]}const settings=await readSettings(pmRoot);const fieldRegistry=resolveRuntimeFieldRegistry(settings.schema);const definitions=(fieldRegistry.command_to_fields.get(runtimeCommand)??[]).flatMap(field=>{const flagTokens=[field.cli_flag,...field.cli_aliases];return flagTokens.map(token=>({long:`--${token}`,type:toLooseFieldDefinitionType(field.type),value_type:toLooseFieldDefinitionType(field.type)}))});runtimeFieldLooseFlagDefinitionCache.set(cacheKey,definitions);return definitions}async function registerRuntimeSchemaFieldFlags(rootProgram,invocationArgv){const bootstrapGlobalOptions=parseBootstrapGlobalOptions(invocationArgv);const pmRoot=resolvePmRoot(process.cwd(),bootstrapGlobalOptions.path);if(!await pathExists(getSettingsPath(pmRoot))){return}const cachedDiscovery=runtimeExtensionDiscoverySnapshotCache?.key===buildRuntimeExtensionDiscoverySnapshotCacheKey(pmRoot)?runtimeExtensionDiscoverySnapshotCache.snapshot:null;const settings=cachedDiscovery===null?await readSettings(pmRoot):cachedDiscovery.settings;const fieldRegistry=resolveRuntimeFieldRegistry(settings.schema);const mappings=[{path:"create",command:"create"},{path:"update",command:"update"},{path:"update-many",command:"update_many"},{path:"list",command:"list"},{path:"list-all",command:"list"},{path:"list-draft",command:"list"},{path:"list-open",command:"list"},{path:"list-in-progress",command:"list"},{path:"list-blocked",command:"list"},{path:"list-closed",command:"list"},{path:"list-canceled",command:"list"},{path:"search",command:"search"},{path:"calendar",command:"calendar"},{path:"context",command:"context"},{path:"templates save",command:"create"}];for(const mapping of mappings){const command=findCommandByPath(rootProgram,mapping.path.split(" "));if(!command){continue}for(const field of fieldRegistry.command_to_fields.get(mapping.command)??[]){const description=field.description??"";addRuntimeFieldOption(command,field.cli_flag,description,field.repeatable);for(const alias of field.cli_aliases){addRuntimeFieldOption(command,alias,`Alias for --${field.cli_flag}`,field.repeatable)}}}}async function maybeAttachCreateUpdatePolicyHelpText(rootProgram,pmRoot,invocationArgv,registrations,settings){const bootstrapCommand=parseBootstrapCommandName(invocationArgv);if(bootstrapCommand!=="create"&&bootstrapCommand!=="update"){return}try{const resolvedSettings=settings??await readSettings(pmRoot);const typeRegistry=resolveItemTypeRegistry(resolvedSettings,registrations);attachCreateUpdatePolicyHelpText(rootProgram,typeRegistry,invocationArgv)}catch{}}function defaultPreflightDecision(){return{enforce_item_format_gate:true,run_preflight_item_format_sync:true,run_extension_migrations:true,enforce_mandatory_migration_gate:true}}function buildRuntimeExtensionSnapshotCacheKey(pmRoot,activationScope="all"){return activationScope==="all"?`pm-root:${pmRoot}`:`pm-root:${pmRoot}:activation:${activationScope}`}function bootstrapProfileEnabled(invocationArgv){return invocationArgv.some(token=>token==="--profile")}function buildRuntimeExtensionDiscoverySnapshotCacheKey(pmRoot){return`pm-root:${pmRoot}`}function emitSettingsReadWarnings(warnings){for(const warning of warnings){if(warning.startsWith("settings_read_")){printError(`[pm] warning: ${warning} \u2014 settings.json could not be loaded and pm fell back to defaults; run pm health for remediation.`)}}}function emitExtensionProfile(globalOptions,snapshot){if(!globalOptions.profile){return}printError(`profile:extensions loaded=${snapshot.loadedCount} failed=${snapshot.loadFailedCount} warnings=${snapshot.loadWarnings.length} activation_failed=${snapshot.activationFailedCount} hook_counts=before:${snapshot.hooks.beforeCommand.length}|after:${snapshot.hooks.afterCommand.length}|write:${snapshot.hooks.onWrite.length}|read:${snapshot.hooks.onRead.length}|index:${snapshot.hooks.onIndex.length} command_overrides=${snapshot.commands.overrides.length} command_handlers=${snapshot.commands.handlers.length} parser_overrides=${snapshot.parsers.overrides.length} preflight_overrides=${snapshot.preflight.overrides.length} service_overrides=${snapshot.services.overrides.length} renderer_overrides=${snapshot.renderers.overrides.length}`);if(snapshot.activationWarnings.length>0){printError(`profile:extensions activation_warnings=${formatHookWarnings(snapshot.activationWarnings)}`)}}function emitExtensionSkippedProfile(profileEnabled,snapshot,probe){if(!profileEnabled){return}const command=normalizeExtensionCommandPath(probe.commandPath??"")||"<none>";printError(`profile:extensions activation=skipped command=${command} effective=${snapshot.discovery.effective.length} warnings=${snapshot.discovery.warnings.length} discovery_ms=${snapshot.discoveryMs}`)}async function loadRuntimeExtensionDiscoverySnapshot(pmRoot,readSettingsWithMetadataFn=readSettingsWithMetadata){const cacheKey=buildRuntimeExtensionDiscoverySnapshotCacheKey(pmRoot);if(runtimeExtensionDiscoverySnapshotCache?.key===cacheKey){return runtimeExtensionDiscoverySnapshotCache.snapshot}try{const startedAt=Date.now();const{settings,warnings:settingsReadWarnings}=await readSettingsWithMetadataFn(pmRoot);const discovery=await discoverExtensions({pmRoot,settings,cwd:process.cwd(),noExtensions:false});const snapshot={pmRoot,settings,discovery,discoveryMs:Date.now()-startedAt,settingsReadWarnings:[...settingsReadWarnings]};runtimeExtensionDiscoverySnapshotCache={key:cacheKey,snapshot};return snapshot}catch{runtimeExtensionDiscoverySnapshotCache={key:cacheKey,snapshot:null};return null}}async function loadRuntimeExtensionSnapshot(pmRoot,probe,readSettingsFn=readSettings){const activationScope=probe?buildRuntimeExtensionActivationScope(probe):"all";const cacheKey=buildRuntimeExtensionSnapshotCacheKey(pmRoot,activationScope);if(runtimeExtensionSnapshotCache?.key===cacheKey){return runtimeExtensionSnapshotCache.snapshot}try{const settings=await readSettingsFn(pmRoot);const loadResult=await loadExtensions({pmRoot,settings,cwd:process.cwd(),noExtensions:false,extensionFilter:probe?buildRuntimeExtensionFilterForProbe(probe):void 0});const activationResult=await activateExtensions({...loadResult,loaded:loadResult.loaded});const commandHandlers=[...new Set(activationResult.commands.handlers.map(entry=>normalizeExtensionCommandPath(entry.command)))].filter(entry=>entry.length>0).sort((left,right)=>left.localeCompare(right));const commandFlagHelp=collectDynamicExtensionFlagHelpByCommand(activationResult.registrations.flags);const canonicalAliases=buildCanonicalExtensionAliases(activationResult.commands.handlers,activationResult.registrations.commands);const commandDescriptors=collectExtensionCommandHelpDescriptors(commandHandlers,activationResult.registrations.commands,activationResult.registrations.flags,canonicalAliases);const snapshot={hooks:activationResult.hooks,commands:activationResult.commands,parsers:activationResult.parsers,preflight:activationResult.preflight,services:activationResult.services,renderers:activationResult.renderers,registrations:activationResult.registrations,pmRoot,settings,commandHandlers,commandFlagHelp,commandDescriptors,commandAliases:canonicalAliases,loadWarnings:[...loadResult.warnings],activationWarnings:[...activationResult.warnings],loadedCount:loadResult.loaded.length,loadFailedCount:loadResult.failed.length,activationFailedCount:activationResult.failed.length,contextIntentPackages:loadResult.loaded.map(({name,module})=>({name,module}))};runtimeExtensionSnapshotCache={key:cacheKey,snapshot};return snapshot}catch{runtimeExtensionSnapshotCache={key:cacheKey,snapshot:null};return null}}async function maybeLoadRuntimeExtensions(command){const globalOptions=getGlobalOptions(command);if(globalOptions.noExtensions){const noExtPmRoot=resolvePmRoot(process.cwd(),globalOptions.path);if(await pathExists(getSettingsPath(noExtPmRoot))){emitSettingsReadWarnings((await readSettingsWithMetadata(noExtPmRoot)).warnings)}return null}const pmRoot=resolvePmRoot(process.cwd(),globalOptions.path);const discoverySnapshot=await loadRuntimeExtensionDiscoverySnapshot(pmRoot);if(!discoverySnapshot){return null}emitSettingsReadWarnings(discoverySnapshot.settingsReadWarnings);const probe={commandPath:getCommandPath(command),commandArgs:collectParsedActivationCommandArgs(command)};if(!discoveryNeedsActivationForProbe(discoverySnapshot.discovery,probe)){emitExtensionSkippedProfile(globalOptions.profile,discoverySnapshot,probe);return null}const snapshot=await loadRuntimeExtensionSnapshot(pmRoot,probe);if(!snapshot){return null}emitExtensionProfile(globalOptions,snapshot);return{hooks:snapshot.hooks,commands:snapshot.commands,parsers:snapshot.parsers,preflight:snapshot.preflight,services:snapshot.services,renderers:snapshot.renderers,registrations:snapshot.registrations,pmRoot}}async function loadRuntimeExtensionCommandDescriptorsForRecovery(pmRoot){const snapshot=await loadRuntimeExtensionSnapshot(pmRoot);return snapshot?new Map(snapshot.commandDescriptors):activeRuntimeExtensionCommandDescriptors}async function executeRegisteredRuntimeMigrations(migrations,pmRoot){const result=await runExtensionMigrations({pmRoot,migrations,author:"pm-extension-migration"});return result.migrations.filter(migration=>migration.outcome==="failed").map(migration=>`extension_migration_failed:${migration.layer}:${migration.extension}:${migration.id}`)}function buildExtensionCommandSdk(pmRoot,global2){const author=typeof global2.author==="string"&&global2.author.trim()?global2.author.trim():"pm-extension";return createExtensionCommandSdk(pmRoot,PmClient.forActiveExtensionHost({pmRoot,author}))}async function runRequiredExtensionCommand(command,options,globalOptions,extensionFlagDefinitions=[]){const commandPath=getCommandPath(command);let commandArgs=stripLooseCommandOptionTokens(command.args.map(String),extensionFlagDefinitions);let commandOptions={...options};let resolvedGlobalOptions={...globalOptions};const pmRoot=resolvePmRoot(process.cwd(),globalOptions.path);const parserOverride=await runActiveParserOverride({command:commandPath,args:commandArgs,options:commandOptions,global:resolvedGlobalOptions,pm_root:pmRoot});if(globalOptions.profile&&parserOverride.warnings.length>0){printError(`profile:extensions parser_warnings=${formatHookWarnings(parserOverride.warnings)}`)}commandArgs=parserOverride.context.args;commandOptions=parserOverride.context.options;resolvedGlobalOptions=parserOverride.context.global;validateDynamicExtensionCommandInvocation(activeRuntimeExtensionCommandDescriptors.get(normalizeExtensionCommandPath(commandPath)),commandArgs,commandOptions,extensionFlagDefinitions);setActiveCommandResult(void 0);setActiveCommandContext({command:commandPath,args:commandArgs,options:{...commandOptions},global:{...resolvedGlobalOptions},pm_root:pmRoot});const extensionCommandResult=await runActiveCommandHandler({command:commandPath,args:commandArgs,options:commandOptions,global:resolvedGlobalOptions,pm_root:pmRoot,sdk:buildExtensionCommandSdk(pmRoot,resolvedGlobalOptions)});if(resolvedGlobalOptions.profile&&extensionCommandResult.warnings.length>0){printError(`profile:extensions command_handler_warnings=${formatHookWarnings(extensionCommandResult.warnings)}`)}if(!extensionCommandResult.handled){if(extensionCommandResult.warnings.length>0){const warningCode=extensionCommandResult.warnings[0];const cause=extensionCommandResult.errorMessage?.trim();const causeSuffix=cause?` ${cause}`:"";throw new PmCliError(`Command "${commandPath}" failed in extension handler (${warningCode}).${causeSuffix}`,EXIT_CODE.GENERIC_FAILURE,{code:extensionCommandResult.errorCode??"command_failed",nextSteps:extensionCommandResult.remediation?[extensionCommandResult.remediation]:void 0})}throw new PmCliError(`Command "${commandPath}" is provided by extensions and is not currently available.`,EXIT_CODE.NOT_FOUND)}if(extensionCommandResult.exitCode!==void 0){process.exitCode=extensionCommandResult.exitCode}setActiveCommandResult(extensionCommandResult.result);return extensionCommandResult.result}const WRAPPED_ACTION_HANDLER=Symbol("pm.wrappedActionHandler");function resolveActionCommand(actionArgs,fallback){const possibleCommand=actionArgs[actionArgs.length-1];return possibleCommand instanceof Command?possibleCommand:fallback}function maybePrintExtensionProfileWarnings(enabled,label,warnings){if(enabled&&warnings.length>0){printError(`profile:extensions ${label}=${formatHookWarnings(warnings)}`)}}function validateDynamicInvocationArgs(params){const dynamicDescriptor=activeRuntimeExtensionCommandDescriptors.get(normalizeExtensionCommandPath(params.commandPath));if(!dynamicDescriptor||!isImporterOrExporterCommandPath(params.activeRegistrations,params.commandPath)){return}const positionalArgs=dynamicCommandArguments(dynamicDescriptor).length===0?collectLoosePositionalArgs(params.commandArgs):stripLooseCommandOptionTokens(params.commandArgs,params.extensionFlagDefinitions);validateDynamicExtensionCommandArgs(dynamicDescriptor,positionalArgs)}function syncCommanderActionArgs(actionCommand,actionArgs,commandArgs){actionCommand.args=[...commandArgs];if("_processArguments"in actionCommand&&typeof actionCommand._processArguments==="function"){actionCommand._processArguments()}if(actionArgs.length>0&&Array.isArray(actionArgs[0])){actionArgs[0]=[...actionCommand.processedArgs]}}function wrapProgramActionsForExtensionHandlers(rootProgram){const visit=entry=>{const actionEntry=entry;if(typeof actionEntry._actionHandler==="function"&&actionEntry[WRAPPED_ACTION_HANDLER]!==true){const originalAction=actionEntry._actionHandler;actionEntry._actionHandler=async function wrappedActionHandler(...actionArgs){const actionCommand=resolveActionCommand(actionArgs,entry);const startedAt=Date.now();clearResolvedGlobalOptions(actionCommand);let globalOptions=getGlobalOptions(actionCommand);const commandPath=resolvePmCommandOperation(getCommandPath(actionCommand));const pmRoot=resolvePmRoot(process.cwd(),globalOptions.path);let commandArgs=actionCommand.args.map(String);const activeRegistrations=getActiveExtensionRegistrations();const extensionFlagDefinitions=activeRegistrations?collectExtensionFlagDefinitionsForInvocation(activeRegistrations,commandPath,commandArgs):[];const runtimeFieldFlagDefinitions=await collectRuntimeFieldLooseFlagDefinitionsForCommand(commandPath,pmRoot);let commandOptions=extractCommandScopedOptions(actionCommand,commandArgs,[...extensionFlagDefinitions,...runtimeFieldFlagDefinitions]);const parserOverride=await runActiveParserOverride({command:commandPath,args:commandArgs,options:commandOptions,global:globalOptions,pm_root:pmRoot});maybePrintExtensionProfileWarnings(globalOptions.profile,"parser_warnings",parserOverride.warnings);commandArgs=parserOverride.context.args;commandOptions=parserOverride.context.options;globalOptions=parserOverride.context.global;validateDynamicInvocationArgs({activeRegistrations,commandPath,commandArgs,extensionFlagDefinitions});globalOptions=await applyDefaultOutputFormat(globalOptions);setResolvedGlobalOptions(actionCommand,globalOptions);syncCommanderActionArgs(actionCommand,actionArgs,commandArgs);syncCommanderActionOptions(actionCommand,commandOptions);setActiveCommandResult(void 0);setActiveCommandContext({command:commandPath,args:commandArgs,options:{...commandOptions},global:{...globalOptions},pm_root:pmRoot});const extensionCommandResult=await runActiveCommandHandler({command:commandPath,args:commandArgs,options:commandOptions,global:globalOptions,pm_root:pmRoot,sdk:buildExtensionCommandSdk(pmRoot,globalOptions)});maybePrintExtensionProfileWarnings(globalOptions.profile,"command_handler_warnings",extensionCommandResult.warnings);if(extensionCommandResult.handled){setActiveCommandResult(extensionCommandResult.result);printResult(extensionCommandResult.result,{...globalOptions,command:commandPath,commandArgs,commandOptions,pmRoot});if(globalOptions.profile){printError(`profile:command=${commandPath} took_ms=${Date.now()-startedAt}`)}return}return await originalAction.apply(this,actionArgs)};actionEntry[WRAPPED_ACTION_HANDLER]=true}for(const child of entry.commands){visit(child)}};visit(rootProgram)}async function clearDynamicExtensionCommandState(params){activeRuntimeExtensionCommandDescriptors=new Map;setActiveExtensionServices({overrides:[]});if(params){await maybeAttachCreateUpdatePolicyHelpText(params.rootProgram,params.pmRoot,params.invocationArgv,createEmptyExtensionRegistrationRegistry(),params.settings)}}function attachDynamicExtensionHelp(command,descriptor,flagHelp,metadataHelp){if(descriptor?.flags&&descriptor.flags.length>0){applyDynamicExtensionFlagOptions(command,descriptor.flags);const residualFlagHelp=buildResidualDynamicExtensionFlagHelp(command,descriptor.flags);if(residualFlagHelp){command.addHelpText("after",residualFlagHelp)}}else if(flagHelp){command.addHelpText("after",flagHelp)}if(metadataHelp){command.addHelpText("after",metadataHelp)}}function applyDynamicExtensionRootHelpVisibility(rootProgram,preexistingTopLevelCommands,descriptors){const tierRank={core:0,standard:1,full:2,internal:3};const applyVisibility=(command,pathParts)=>{const commandPath=pathParts.join(" ");const matchingDescriptors=[...descriptors.entries()].filter(([path])=>path===commandPath||path.startsWith(`${commandPath} `)).map(([,descriptor])=>descriptor);const tier=matchingDescriptors.length===0?"standard":matchingDescriptors.reduce((selected,descriptor)=>tierRank[descriptor.tier]<tierRank[selected]?descriptor.tier:selected,"internal");setPmCommandHelpVisibilityTier(command,tier);for(const child of command.commands){applyVisibility(child,[...pathParts,child.name()])}};for(const command of rootProgram.commands){if(!preexistingTopLevelCommands.has(command.name())){applyVisibility(command,[command.name()])}}}async function registerDynamicExtensionCommandPaths(rootProgram,invocationArgv){const bootstrapGlobalOptions=parseBootstrapGlobalOptions(invocationArgv);const pmRoot=resolvePmRoot(process.cwd(),bootstrapGlobalOptions.path);if(bootstrapGlobalOptions.noExtensions){await clearDynamicExtensionCommandState({rootProgram,pmRoot,invocationArgv});return}const discoverySnapshot=await loadRuntimeExtensionDiscoverySnapshot(pmRoot);const probe=buildBootstrapActivationProbe(invocationArgv);if(!discoverySnapshot){await clearDynamicExtensionCommandState();return}if(!discoveryNeedsActivationForProbe(discoverySnapshot.discovery,probe)){await clearDynamicExtensionCommandState({rootProgram,pmRoot,invocationArgv,settings:discoverySnapshot.settings});emitExtensionSkippedProfile(bootstrapProfileEnabled(invocationArgv),discoverySnapshot,probe);return}const snapshot=await loadRuntimeExtensionSnapshot(pmRoot,probe);if(!snapshot){await clearDynamicExtensionCommandState({rootProgram,pmRoot,invocationArgv,settings:discoverySnapshot.settings});return}setActiveExtensionServices(snapshot.services);activeRuntimeExtensionCommandDescriptors=new Map(snapshot.commandDescriptors);await maybeAttachCreateUpdatePolicyHelpText(rootProgram,pmRoot,invocationArgv,snapshot.registrations,snapshot.settings);const commandPaths=collectSafeExtensionCommandPaths(rootProgram,snapshot.commandHandlers,snapshot.commandDescriptors,snapshot.commandAliases,warning=>reportExtensionCommandCollision(snapshot.activationWarnings,printError,warning));const preexistingTopLevelCommands=new Set(rootProgram.commands.map(command=>command.name()));const registerCommandPath=commandPath=>{const pathParts=commandPath.split(" ").filter(part=>part.length>0);const descriptor=snapshot.commandDescriptors.get(commandPath);const existingCommand=findCommandByPath(rootProgram,pathParts);const flagHelp=snapshot.commandFlagHelp.get(commandPath);const metadataHelp=descriptor?buildDynamicExtensionCommandMetadataHelp(descriptor):null;if(existingCommand){attachDynamicExtensionHelp(existingCommand,descriptor,flagHelp,metadataHelp);return}const dynamicCommand=ensureCommandPath(rootProgram,pathParts);if(descriptor?.description){dynamicCommand.description(descriptor.description)}let residualDynamicFlagHelp=flagHelp;if(descriptor){applyDynamicExtensionArguments(dynamicCommand,descriptor);if(descriptor.flags.length>0){applyDynamicExtensionFlagOptions(dynamicCommand,descriptor.flags);residualDynamicFlagHelp=buildResidualDynamicExtensionFlagHelp(dynamicCommand,descriptor.flags)??void 0}}if(residualDynamicFlagHelp){dynamicCommand.addHelpText("after",residualDynamicFlagHelp)}if(metadataHelp){dynamicCommand.addHelpText("after",metadataHelp)}dynamicCommand.allowUnknownOption(true).allowExcessArguments(true).action(async(...actionArgs)=>{const maybeCommand=actionArgs[actionArgs.length-1];const command=maybeCommand instanceof Command?maybeCommand:dynamicCommand;const globalOptions=getGlobalOptions(command);const startedAt=Date.now();const extensionFlagDefinitions=collectExtensionFlagDefinitionsForInvocation(snapshot.registrations,commandPath,command.args.map(String));const scopedOptions=extractCommandScopedOptions(command,command.args.map(String),extensionFlagDefinitions);const result=await runRequiredExtensionCommand(command,scopedOptions,globalOptions,extensionFlagDefinitions);await invalidateSearchCachesForMutation(globalOptions,result);printResult(result,{...globalOptions,command:commandPath,commandArgs:command.args.map(String),commandOptions:scopedOptions,pmRoot});if(globalOptions.profile){printError(`profile:command=${commandPath} took_ms=${Date.now()-startedAt}`)}})};for(const commandPath of commandPaths){registerCommandPath(commandPath)}applyDynamicExtensionRootHelpVisibility(rootProgram,preexistingTopLevelCommands,snapshot.commandDescriptors)}const CLI_VERSION=resolvePmCliVersion(import.meta.url,["../.."])??"0.0.0";let program=createPmCliProgram(CLI_VERSION);function attachProgramLifecycleHooks(rootProgram){rootProgram.hook("preAction",async(_thisCommand,actionCommand)=>{activeExtensionHookContext=null;activeTelemetryCommandContext=null;clearActiveExtensionHooks();clearResolvedGlobalOptions(actionCommand);const rawGlobalOptions=actionCommand.optsWithGlobals();const bootstrapGlobalOptions=getGlobalOptions(actionCommand);const commandPath=resolvePmCommandOperation(getCommandPath(actionCommand));let commandArgs=actionCommand.args.map(String);let commandOptions=extractCommandScopedOptions(actionCommand,commandArgs);let globalOptions={...bootstrapGlobalOptions};validateReadOutputOptions(commandPath,{...commandOptions,outputInclude:rawGlobalOptions.outputInclude,outputLimit:rawGlobalOptions.outputLimit,outputBudget:rawGlobalOptions.outputBudget,outputFormat:rawGlobalOptions.outputFormat,outputSession:rawGlobalOptions.outputSession,outputCursor:rawGlobalOptions.outputCursor});forwardReadOutputIncludeModes(actionCommand,commandPath,globalOptions,commandOptions);await maybeRunFirstUseTelemetryPrompt(commandPath,globalOptions);const fallbackPmRoot=resolvePmRoot(process.cwd(),bootstrapGlobalOptions.path);const runtimeExtensions=await maybeLoadRuntimeExtensions(actionCommand);if(!runtimeExtensions){activeExtensionHookContext=createCoreCommandHookContext({commandName:commandPath,commandArgs,commandOptions,globalOptions,pmRoot:fallbackPmRoot});activeTelemetryCommandContext=await startTelemetryCommand({command:commandPath,pm_version:CLI_VERSION,args:commandArgs,options:commandOptions,global:globalOptions,pm_root:fallbackPmRoot});sentrySetCommandContext(commandPath,commandArgs,commandOptions,{source_context:activeTelemetryCommandContext?.source_context,source_context_source:activeTelemetryCommandContext?.source_context_source});sentryStartCommandSpan(commandPath);await enforceItemFormatWriteGateAndPreflightMigration(commandPath,commandOptions,fallbackPmRoot,defaultPreflightDecision());await enforceMutationGuardPreflight(commandPath,commandArgs,commandOptions,globalOptions,fallbackPmRoot);return}setActiveExtensionHooks(runtimeExtensions.hooks);setActiveExtensionCommands(runtimeExtensions.commands);setActiveExtensionParsers(runtimeExtensions.parsers);setActiveExtensionPreflight(runtimeExtensions.preflight);setActiveExtensionServices(runtimeExtensions.services);setActiveExtensionRenderers(runtimeExtensions.renderers);setActiveExtensionRegistrations(runtimeExtensions.registrations);const extensionFlagDefinitions=collectExtensionFlagDefinitionsForInvocation(runtimeExtensions.registrations,commandPath,commandArgs);commandOptions=extractCommandScopedOptions(actionCommand,commandArgs,extensionFlagDefinitions);forwardReadOutputIncludeModes(actionCommand,commandPath,globalOptions,commandOptions);const parserOverride=await runActiveParserOverride({command:commandPath,args:commandArgs,options:commandOptions,global:globalOptions,pm_root:runtimeExtensions.pmRoot});if(globalOptions.profile&&parserOverride.warnings.length>0){printError(`profile:extensions parser_warnings=${formatHookWarnings(parserOverride.warnings)}`)}commandArgs=parserOverride.context.args;commandOptions=parserOverride.context.options;globalOptions=parserOverride.context.global;syncCommanderActionOptions(actionCommand,commandOptions);const preflightOverride=await runActivePreflightOverride({command:commandPath,args:commandArgs,options:commandOptions,global:globalOptions,pm_root:runtimeExtensions.pmRoot,decision:defaultPreflightDecision()});if(globalOptions.profile&&preflightOverride.warnings.length>0){printError(`profile:extensions preflight_warnings=${formatHookWarnings(preflightOverride.warnings)}`)}commandArgs=preflightOverride.context.args;commandOptions=preflightOverride.context.options;globalOptions=preflightOverride.context.global;syncCommanderActionOptions(actionCommand,commandOptions);const preflightDecision=preflightOverride.decision;await enforceItemFormatWriteGateAndPreflightMigration(commandPath,commandOptions,runtimeExtensions.pmRoot,preflightDecision);await enforceMutationGuardPreflight(commandPath,commandArgs,commandOptions,globalOptions,runtimeExtensions.pmRoot);const migrationWarnings=preflightDecision.run_extension_migrations?await executeRegisteredRuntimeMigrations(runtimeExtensions.registrations.migrations,runtimeExtensions.pmRoot):[];if(globalOptions.profile&&migrationWarnings.length>0){printError(`profile:extensions migration_warnings=${formatHookWarnings(migrationWarnings)}`)}const migrationBlockers=collectMandatoryMigrationBlockers(runtimeExtensions.registrations.migrations);activeExtensionHookContext={hooks:runtimeExtensions.hooks,commandName:commandPath,commandArgs,commandOptions:{...commandOptions},globalOptions:{...globalOptions},pmRoot:runtimeExtensions.pmRoot,profileEnabled:Boolean(globalOptions.profile),migrationBlockers};setActiveCommandResult(void 0);setActiveCommandContext({command:commandPath,args:commandArgs,options:{...commandOptions},global:{...globalOptions},pm_root:runtimeExtensions.pmRoot});activeTelemetryCommandContext=await startTelemetryCommand({command:commandPath,pm_version:CLI_VERSION,args:commandArgs,options:commandOptions,global:globalOptions,pm_root:runtimeExtensions.pmRoot});sentrySetCommandContext(commandPath,commandArgs,commandOptions,{source_context:activeTelemetryCommandContext?.source_context,source_context_source:activeTelemetryCommandContext?.source_context_source});sentryStartCommandSpan(commandPath);const hookWarnings=await runBeforeCommandHooks(runtimeExtensions.hooks,{command:commandPath,args:commandArgs,options:{...commandOptions},global:{...globalOptions},pm_root:runtimeExtensions.pmRoot});if(globalOptions.profile&&hookWarnings.length>0){printError(`profile:extensions hook_warnings=${formatHookWarnings(hookWarnings)}`)}if(preflightDecision.enforce_mandatory_migration_gate){enforceMandatoryMigrationWriteGate(commandPath,commandOptions,migrationBlockers)}});rootProgram.hook("postAction",async()=>{const outcome=buildPostActionTelemetryOutcome();sentryFinishCommandSpan(outcome.ok,outcome.error,{error_code:outcome.error_code,error_category:outcome.error_category,exit_code:outcome.exit_code,command_resolution:outcome.command_resolution,resolution_stage:outcome.resolution_stage});await runAndClearAfterCommandHooks(outcome)})}attachProgramLifecycleHooks(program);const IDEMPOTENT_TOP_LEVEL_REGISTRATION=Symbol("pmCliIdempotentTopLevelRegistration");function ensureIdempotentTopLevelCommandRegistration(rootProgram){const guarded=rootProgram;if(guarded[IDEMPOTENT_TOP_LEVEL_REGISTRATION]){return}guarded[IDEMPOTENT_TOP_LEVEL_REGISTRATION]=true;const registerOriginalCommand=rootProgram.command.bind(rootProgram);rootProgram.command=((nameAndArgs,...rest)=>{const commandName=nameAndArgs.split(/\s+/u)[0];if(rootProgram.commands.some(existing=>existing.name()===commandName||existing.aliases().includes(commandName))){return new Command(commandName)}return registerOriginalCommand(nameAndArgs,...rest)})}async function registerCoreCommandFamilies(rootProgram,selection){ensureIdempotentTopLevelCommandRegistration(rootProgram);if(selection.setup){const{registerSetupCommands}=await loadSetupRegistrationModule();registerSetupCommands(rootProgram)}if(selection.listQuery){const{registerListQueryCommands}=await loadListQueryRegistrationModule();const commandFilter=typeof selection.targetCommandName==="string"&&LIST_QUERY_COMMAND_NAMES.has(selection.targetCommandName)?new Set([selection.targetCommandName]):void 0;registerListQueryCommands(rootProgram,commandFilter?{commandFilter}:void 0)}if(selection.mutation){const{registerMutationCommands}=await loadMutationRegistrationModule();registerMutationCommands(rootProgram,{targetCommandName:selection.targetCommandName})}if(selection.operation){const{registerOperationCommands}=await loadOperationRegistrationModule();registerOperationCommands(rootProgram)}}function createTelemetryCommandErrorEmitter(params){return async event=>{const errorCategory=resolveTelemetryErrorCategory(event.errorCode);const commandResolution=deriveTelemetryCommandResolution({ok:false,errorCode:event.errorCode,errorCategory});await emitTelemetryErrorEvent({command:event.command,args:params.invocationArgv,options:event.options,global:params.bootstrapGlobal,pm_version:CLI_VERSION,pm_root:params.bootstrapPmRoot,error_code:event.errorCode,error_message:event.errorMessage,exit_code:event.exitCode,error_category:errorCategory,command_resolution:commandResolution,resolution_stage:event.resolutionStage});return{errorCategory,commandResolution}}}async function prepareExtensionServicesForRunPmCliError(params){if(params.bootstrapGlobal.noExtensions){return}const bootstrapProbe=buildBootstrapActivationProbe(params.invocationArgv);const discoverySnapshot=await loadRuntimeExtensionDiscoverySnapshot(params.bootstrapPmRoot);if(discoverySnapshot&&discoveryNeedsActivationForProbe(discoverySnapshot.discovery,bootstrapProbe)){const bootstrapSnapshot=await loadRuntimeExtensionSnapshot(params.bootstrapPmRoot,bootstrapProbe);setRecoveredExtensionServices(bootstrapSnapshot);return}if(discoverySnapshot){emitExtensionSkippedProfile(bootstrapProfileEnabled(params.invocationArgv),discoverySnapshot,bootstrapProbe)}setActiveExtensionServices({overrides:[]})}function setRecoveredExtensionServices(bootstrapSnapshot){if(!bootstrapSnapshot){setActiveExtensionServices({overrides:[]});return}setActiveExtensionServices(bootstrapSnapshot.services)}async function finishRunPmCliFailure(params){sentryFinishCommandSpan(false,params.errorMessage,{error_code:params.classificationCode,error_category:params.errorCategory,exit_code:params.exitCode,command_resolution:params.commandResolution,resolution_stage:params.resolutionStage});await runAndClearAfterCommandHooks({ok:false,error:params.errorMessage,exit_code:params.exitCode,error_code:params.classificationCode,error_category:params.errorCategory,command_resolution:params.commandResolution,resolution_stage:params.resolutionStage})}async function finishRunPmCliSuccessParse(){sentryFinishCommandSpan(true,void 0,{exit_code:EXIT_CODE.SUCCESS,command_resolution:"success",resolution_stage:"parse"});await runAndClearAfterCommandHooks({ok:true,exit_code:EXIT_CODE.SUCCESS,command_resolution:"success",resolution_stage:"parse"});process.exitCode=EXIT_CODE.SUCCESS}async function handleRunPmCliKnownError(context,numericExitCode){const hasExplicitExitCode=typeof numericExitCode==="number"&&Number.isFinite(numericExitCode);if(!(context.error instanceof PmCliError)&&(isCommanderError(context.error)||!hasExplicitExitCode)){return false}const errorMessage=describeUnknownError(context.error);const exitCode=context.error instanceof PmCliError?context.error.exitCode:normalizeThrownExitCode(numericExitCode);const rawContext=context.error instanceof PmCliError?context.error.context:void 0;const enrichedContext=buildPmCliRecoveryContext(rawContext,context.invocationArgv,errorMessage);const classification=classifyPmCliError(errorMessage,enrichedContext);const jsonErrorPayload=context.bootstrapGlobal.lean?projectLeanErrorEnvelope(formatPmCliErrorForJson(errorMessage,exitCode,enrichedContext)):formatPmCliErrorForJson(errorMessage,exitCode,enrichedContext);const renderedError=context.jsonErrors?JSON.stringify(context.bootstrapGlobal.tokenAccounting?attachOutputTokenAccounting(jsonErrorPayload,value=>`${JSON.stringify(value,null,2)}
3
2
  `):jsonErrorPayload,null,2):formatPmCliErrorForDisplay(errorMessage,enrichedContext);if(context.jsonErrors)writeStderr(`${renderedError}
4
3
  `);else printError(renderedError);const{errorCategory,commandResolution}=await context.emitTelemetryCommandError({command:context.attemptedCommand,errorCode:classification.code,errorMessage:classification.detail,exitCode,options:{bootstrap_global_options:context.bootstrapGlobal},resolutionStage:"execute"});const loggedHandledErrorToSentry=await maybeLogHandledCliErrorToSentry({command:context.attemptedCommand,error_code:classification.code,error_category:errorCategory,exit_code:exitCode,error_message:classification.detail,command_resolution:commandResolution,resolution_stage:"execute",source_context:activeTelemetryCommandContext?.source_context});await finishRunPmCliFailure({errorMessage,exitCode,classificationCode:classification.code,errorCategory,commandResolution,resolutionStage:"execute"});if(loggedHandledErrorToSentry){sentryCaptureCliError(wrapThrownErrorForSentry(context.error,errorMessage));await sentryFlush(HANDLED_ERROR_SENTRY_FLUSH_TIMEOUT_MS)}process.exitCode=exitCode;return true}async function handleUnknownHelpCommandError(context,code){const unknownToken=resolvePmCommandOperation(parseBootstrapHelpRequest(context.invocationArgv).commandPathTokens.join(" "))||resolveUnknownCommanderToken(context.invocationArgv);const unknownMessage=`unknown command '${unknownToken}'`;const pmRoot=resolvePmRoot(process.cwd(),context.bootstrapGlobal.path);const recoveryCommandDescriptors=await loadRuntimeExtensionCommandDescriptorsForRecovery(pmRoot);const recoveryProbe=buildBootstrapActivationProbe(context.invocationArgv);const failedExtensions=await loadExtensionRecoveryFailures(pmRoot,{},collectActivationCommandCandidates(recoveryProbe));const usageContext=await resolveCommanderUsageContext({message:unknownMessage},program,recoveryCommandDescriptors,{failedExtensions});const classification=classifyCommanderError(usageContext.message,usageContext.commandName,usageContext.allowedTypes,{unknownCommandExamples:usageContext.unknownCommandExamples,unknownCommandNextSteps:usageContext.unknownCommandNextSteps,attemptedCommand:usageContext.attemptedCommand,normalizedInvocationArgs:usageContext.normalizedInvocationArgs,providedOptionFlags:usageContext.providedOptionFlags,unknownOptionSuggestions:usageContext.unknownOptionSuggestions,suggestedRetryCommand:usageContext.suggestedRetryCommand,failedExtensions});const{errorCategory,commandResolution}=await context.emitTelemetryCommandError({command:unknownToken,errorCode:classification.code,errorMessage:classification.detail,exitCode:EXIT_CODE.USAGE,options:{bootstrap_global_options:context.bootstrapGlobal,commander_code:code??"commander.helpDisplayed"},resolutionStage:"parse"});const loggedHandledErrorToSentry=await maybeLogHandledCliErrorToSentry({command:unknownToken,error_code:classification.code,error_category:errorCategory,exit_code:EXIT_CODE.USAGE,error_message:classification.detail,command_resolution:commandResolution,resolution_stage:"parse"});const baseRenderedUsage=context.jsonErrors?await formatCommanderUsageJson({message:unknownMessage},program,recoveryCommandDescriptors,context.bootstrapGlobal.lean===true,{failedExtensions}):await formatCommanderUsageMessage({message:unknownMessage},program,recoveryCommandDescriptors,{failedExtensions});const renderedUsage=appendCommanderExtensionFailures(baseRenderedUsage,context.jsonErrors,failedExtensions);await finishRunPmCliFailure({errorMessage:unknownMessage,exitCode:EXIT_CODE.USAGE,classificationCode:classification.code,errorCategory,commandResolution,resolutionStage:"parse"});if(context.jsonErrors)writeStderr(`${renderedUsage}
5
4
  `);else printError(renderedUsage);if(loggedHandledErrorToSentry){await sentryFlush(HANDLED_ERROR_SENTRY_FLUSH_TIMEOUT_MS)}process.exitCode=EXIT_CODE.USAGE}async function handleRunPmCliHelpDisplayError(context,code,rawMessage){const isHelpDisplayCode=code==="commander.helpDisplayed"||code==="commander.help"||code==="commander.helpCommand";if(!isHelpDisplayCode&&!rawMessage.includes("(outputHelp)")){return false}const helpRequest=parseBootstrapHelpRequest(context.invocationArgv);if(helpRequest.requested&&!isKnownHelpCommandPath(program,helpRequest.commandPathTokens)){await handleUnknownHelpCommandError(context,code);return true}await finishRunPmCliSuccessParse();return true}async function handleRunPmCliCommanderUsageError(context,code){const usageContext=await resolveCommanderUsageContext(context.error,program,activeRuntimeExtensionCommandDescriptors);const classification=classifyCommanderError(usageContext.message,usageContext.commandName,usageContext.allowedTypes,{unknownCommandExamples:usageContext.unknownCommandExamples,unknownCommandNextSteps:usageContext.unknownCommandNextSteps,attemptedCommand:usageContext.attemptedCommand,normalizedInvocationArgs:usageContext.normalizedInvocationArgs,providedOptionFlags:usageContext.providedOptionFlags,unknownOptionSuggestions:usageContext.unknownOptionSuggestions,suggestedRetryCommand:usageContext.suggestedRetryCommand});const{errorCategory,commandResolution}=await context.emitTelemetryCommandError({command:context.attemptedCommand,errorCode:classification.code,errorMessage:classification.detail,exitCode:EXIT_CODE.USAGE,options:{bootstrap_global_options:context.bootstrapGlobal,commander_code:code},resolutionStage:"parse"});const loggedHandledErrorToSentry=await maybeLogHandledCliErrorToSentry({command:context.attemptedCommand,error_code:classification.code,error_category:errorCategory,exit_code:EXIT_CODE.USAGE,error_message:classification.detail,command_resolution:commandResolution,resolution_stage:"parse",source_context:activeTelemetryCommandContext?.source_context});const baseRenderedUsage=context.jsonErrors?await formatCommanderUsageJson(context.error,program,activeRuntimeExtensionCommandDescriptors,context.bootstrapGlobal.lean===true):await formatCommanderUsageMessage(context.error,program,activeRuntimeExtensionCommandDescriptors);const recoveryFailures=await loadUnknownCommandRecoveryFailures(classification.code,context.bootstrapPmRoot,{},collectActivationCommandCandidates(buildBootstrapActivationProbe(context.invocationArgv)));const renderedUsage=appendCommanderExtensionFailures(baseRenderedUsage,context.jsonErrors,recoveryFailures);await finishRunPmCliFailure({errorMessage:usageContext.message,exitCode:EXIT_CODE.USAGE,classificationCode:classification.code,errorCategory,commandResolution,resolutionStage:"parse"});if(context.jsonErrors)writeStderr(`${renderedUsage}