@unbrained/pm-cli 2026.9.6 → 2026.9.8

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 (719) hide show
  1. package/.agents/skills/pm-developer/SKILL.md +12 -4
  2. package/.agents/skills/pm-developer/references/MULTI_AGENT_MERGE.md +19 -10
  3. package/.agents/skills/pm-extensions/SKILL.md +6 -0
  4. package/.agents/skills/pm-sdk/SKILL.md +11 -2
  5. package/.agents/skills/pm-user/SKILL.md +5 -0
  6. package/.agents/skills/pm-user/references/ECOSYSTEM_PLANNING.md +95 -0
  7. package/.claude-plugin/marketplace.json +2 -2
  8. package/CHANGELOG.md +218 -182
  9. package/dist/cli/after-command-context-usage.js +1 -48
  10. package/dist/cli/argv-utils.js +1 -40
  11. package/dist/cli/bootstrap-args.js +1 -9
  12. package/dist/cli/bundle-integrity.js +2 -110
  13. package/dist/cli/commander-usage.js +11 -771
  14. package/dist/cli/commands/activity.js +1 -9
  15. package/dist/cli/commands/aggregate.js +1 -5
  16. package/dist/cli/commands/append.js +1 -5
  17. package/dist/cli/commands/claim.js +1 -5
  18. package/dist/cli/commands/close-many.js +1 -5
  19. package/dist/cli/commands/close.js +1 -9
  20. package/dist/cli/commands/comments.js +1 -5
  21. package/dist/cli/commands/config.js +1 -9
  22. package/dist/cli/commands/context.js +1 -9
  23. package/dist/cli/commands/contracts.js +1 -5
  24. package/dist/cli/commands/copy.js +1 -9
  25. package/dist/cli/commands/create.js +1 -9
  26. package/dist/cli/commands/delete.js +1 -9
  27. package/dist/cli/commands/deps.js +1 -9
  28. package/dist/cli/commands/docs.js +1 -9
  29. package/dist/cli/commands/duplicates.js +1 -9
  30. package/dist/cli/commands/eval.js +1 -9
  31. package/dist/cli/commands/extension/describe.js +1 -5
  32. package/dist/cli/commands/extension/scaffold.js +1 -5
  33. package/dist/cli/commands/extension/shared.js +1 -5
  34. package/dist/cli/commands/extension.js +1 -9
  35. package/dist/cli/commands/files.js +1 -9
  36. package/dist/cli/commands/focus.js +1 -9
  37. package/dist/cli/commands/gc.js +1 -9
  38. package/dist/cli/commands/get.js +1 -9
  39. package/dist/cli/commands/graph.js +1 -10
  40. package/dist/cli/commands/health.js +1 -9
  41. package/dist/cli/commands/history-compact.js +1 -10
  42. package/dist/cli/commands/history-redact.js +1 -11
  43. package/dist/cli/commands/history-repair.js +1 -10
  44. package/dist/cli/commands/history.js +1 -5
  45. package/dist/cli/commands/index.js +1 -58
  46. package/dist/cli/commands/init-agent-guidance.js +1 -9
  47. package/dist/cli/commands/init.js +1 -9
  48. package/dist/cli/commands/learnings.js +1 -5
  49. package/dist/cli/commands/lifecycle-transitions.js +1 -5
  50. package/dist/cli/commands/list.js +1 -9
  51. package/dist/cli/commands/merge.js +1 -11
  52. package/dist/cli/commands/next.js +1 -9
  53. package/dist/cli/commands/notes.js +1 -5
  54. package/dist/cli/commands/plan.js +1 -9
  55. package/dist/cli/commands/profile.js +1 -9
  56. package/dist/cli/commands/restore.js +1 -9
  57. package/dist/cli/commands/scheduling-shortcuts.js +1 -9
  58. package/dist/cli/commands/schema.js +1 -10
  59. package/dist/cli/commands/search.js +1 -9
  60. package/dist/cli/commands/stats.js +1 -9
  61. package/dist/cli/commands/telemetry.js +1 -9
  62. package/dist/cli/commands/test-all.js +1 -9
  63. package/dist/cli/commands/test-runs.js +1 -9
  64. package/dist/cli/commands/test.js +1 -9
  65. package/dist/cli/commands/update-many.js +1 -5
  66. package/dist/cli/commands/update.js +1 -9
  67. package/dist/cli/commands/upgrade.js +1 -5
  68. package/dist/cli/commands/validate.js +1 -15
  69. package/dist/cli/context-intent-invocation.js +1 -20
  70. package/dist/cli/description-stdin.js +1 -17
  71. package/dist/cli/error-guidance.js +1 -1353
  72. package/dist/cli/extension-command-help.js +5 -636
  73. package/dist/cli/extension-command-options.js +1 -427
  74. package/dist/cli/extension-recovery.js +1 -126
  75. package/dist/cli/help-content.js +2 -1001
  76. package/dist/cli/help-json-payload.js +4 -570
  77. package/dist/cli/main.d.ts +4 -0
  78. package/dist/cli/main.js +5 -2573
  79. package/dist/cli/migration-gates.js +1 -289
  80. package/dist/cli/public.js +1 -20
  81. package/dist/cli/register-annotations.js +1 -270
  82. package/dist/cli/register-assurance.js +1 -62
  83. package/dist/cli/register-files-lookup.js +1 -56
  84. package/dist/cli/register-history-activity.d.ts +8 -0
  85. package/dist/cli/register-history-activity.js +2 -0
  86. package/dist/cli/register-history-author.js +1 -38
  87. package/dist/cli/register-history-maintenance.d.ts +9 -0
  88. package/dist/cli/register-history-maintenance.js +2 -0
  89. package/dist/cli/register-list-query.js +10 -943
  90. package/dist/cli/register-mutation-options.js +1 -9
  91. package/dist/cli/register-mutation.js +19 -1893
  92. package/dist/cli/register-operations.js +1 -920
  93. package/dist/cli/register-setup.js +1 -716
  94. package/dist/cli/register-structured-mutation.js +1 -196
  95. package/dist/cli/registration-helpers.js +1 -5
  96. package/dist/cli/runtime-compatibility-boundary.js +4 -42
  97. package/dist/cli/schema-registration-helpers.js +1 -73
  98. package/dist/cli/search-refresh.js +1 -13
  99. package/dist/cli/stats-analytics-json.js +1 -68
  100. package/dist/cli/telemetry-flush.js +1 -10
  101. package/dist/cli-bundle/bundle-manifest.json +164 -156
  102. package/dist/cli-bundle/chunks/chunk-3BZZA6A3.js +5 -0
  103. package/dist/cli-bundle/chunks/chunk-AMRDVX36.js +235 -0
  104. package/dist/cli-bundle/chunks/chunk-DAM4CBBR.js +2202 -0
  105. package/dist/cli-bundle/chunks/{chunk-WYRZZ5ZE.js → chunk-DEZPZOQ7.js} +2 -2
  106. package/dist/cli-bundle/chunks/chunk-FLDWYEND.js +77 -0
  107. package/dist/cli-bundle/chunks/{chunk-NPN5I67J.js → chunk-G5ADGQ2D.js} +3 -3
  108. package/dist/cli-bundle/chunks/chunk-JAAEYHUA.js +2 -0
  109. package/dist/cli-bundle/chunks/{chunk-JX4DH4WC.js → chunk-KR3RP4FH.js} +3 -3
  110. package/dist/cli-bundle/chunks/chunk-LEZOUXG6.js +2 -0
  111. package/dist/cli-bundle/chunks/chunk-NSAPNEYH.js +2 -0
  112. package/dist/cli-bundle/chunks/chunk-QOEKOECV.js +29 -0
  113. package/dist/cli-bundle/chunks/chunk-RHSFOMHU.js +2 -0
  114. package/dist/cli-bundle/chunks/chunk-XOD2PCB6.js +20 -0
  115. package/dist/cli-bundle/chunks/{chunk-JT6XF6GE.js → chunk-YVEQ2AMO.js} +4 -4
  116. package/dist/cli-bundle/chunks/register-list-query-KSK3R63M.js +11 -0
  117. package/dist/cli-bundle/chunks/register-mutation-IQ5C7U6O.js +20 -0
  118. package/dist/cli-bundle/chunks/{register-operations-I5W3KMGB.js → register-operations-DWVHR2NC.js} +2 -2
  119. package/dist/cli-bundle/chunks/register-setup-BQ5SVD4B.js +2 -0
  120. package/dist/cli-bundle/focused-chunks/chunk-3WRPWLA7.js +3 -0
  121. package/dist/cli-bundle/focused-chunks/chunk-7MBUII7U.js +2 -0
  122. package/dist/cli-bundle/focused-chunks/chunk-COPBO5HW.js +8 -0
  123. package/dist/cli-bundle/focused-chunks/chunk-DUN4IXYN.js +20 -0
  124. package/dist/cli-bundle/focused-chunks/{chunk-LIJIA4TY.js → chunk-EE5QSM4Z.js} +3 -3
  125. package/dist/cli-bundle/focused-chunks/chunk-HJVARYM3.js +6 -0
  126. package/dist/cli-bundle/focused-chunks/chunk-IAUOUGVR.js +177 -0
  127. package/dist/cli-bundle/focused-chunks/chunk-KOOMJ54F.js +2 -0
  128. package/dist/cli-bundle/focused-chunks/chunk-MZDXX7JY.js +56 -0
  129. package/dist/cli-bundle/focused-chunks/{chunk-M6PBRFSH.js → chunk-OPFHFGDD.js} +2 -2
  130. package/dist/cli-bundle/focused-chunks/chunk-QHNETP77.js +9 -0
  131. package/dist/cli-bundle/focused-chunks/{chunk-3BZEOXLT.js → chunk-RMWES4M6.js} +2 -2
  132. package/dist/cli-bundle/focused-chunks/chunk-RXT4P5QH.js +10 -0
  133. package/dist/cli-bundle/focused-chunks/chunk-SDOL6FM2.js +12 -0
  134. package/dist/cli-bundle/focused-chunks/chunk-SQV4AAUC.js +2 -0
  135. package/dist/cli-bundle/focused-chunks/{chunk-PEFABF7E.js → chunk-WE3IUNIW.js} +3 -3
  136. package/dist/cli-bundle/focused-chunks/chunk-YALOUBWJ.js +2 -0
  137. package/dist/cli-bundle/main.js +20 -20
  138. package/dist/cli-bundle/sdk-authoring.js +1 -1
  139. package/dist/cli-bundle/sdk-contracts.js +2 -2
  140. package/dist/cli-bundle/sdk-core.js +29 -29
  141. package/dist/cli-bundle/sdk-governance.js +1 -1
  142. package/dist/cli-bundle/sdk-graph.js +1 -1
  143. package/dist/cli-bundle/sdk-merge.js +42 -42
  144. package/dist/cli-bundle/sdk-query.js +1 -1
  145. package/dist/cli-bundle/sdk-runtime.js +1 -1
  146. package/dist/cli-bundle/sdk-testing.js +1 -1
  147. package/dist/cli-bundle/sdk.js +11 -11
  148. package/dist/cli.js +1 -104
  149. package/dist/core/checkpoint/checkpoint-gc.js +1 -169
  150. package/dist/core/checkpoint/mutation-checkpoint.js +2 -133
  151. package/dist/core/config/nested-settings.js +1 -534
  152. package/dist/core/config/positional-value.js +1 -109
  153. package/dist/core/diagnostics/remediation.js +1 -506
  154. package/dist/core/extensions/activation-summary-markdown.js +2 -145
  155. package/dist/core/extensions/activation-summary.js +1 -92
  156. package/dist/core/extensions/activation-transaction.js +1 -46
  157. package/dist/core/extensions/capability-usage.js +1 -173
  158. package/dist/core/extensions/command-hook-context.js +1 -13
  159. package/dist/core/extensions/command-metadata-contract.js +1 -22
  160. package/dist/core/extensions/command-visibility-tier.js +1 -29
  161. package/dist/core/extensions/contribution-inventory.js +1 -173
  162. package/dist/core/extensions/exporter-output-contract.js +1 -66
  163. package/dist/core/extensions/extension-candidate.js +1 -18
  164. package/dist/core/extensions/extension-capability-aliases.js +1 -158
  165. package/dist/core/extensions/extension-hook-runtime.js +1 -699
  166. package/dist/core/extensions/extension-policy.js +1 -599
  167. package/dist/core/extensions/extension-registries.js +1 -62
  168. package/dist/core/extensions/extension-runtime-helpers.js +1 -33
  169. package/dist/core/extensions/extension-types.js +1 -102
  170. package/dist/core/extensions/flag-definition-validation.js +1 -52
  171. package/dist/core/extensions/flag-value-types.js +1 -64
  172. package/dist/core/extensions/index.js +1 -526
  173. package/dist/core/extensions/item-field-types.js +1 -39
  174. package/dist/core/extensions/item-fields.js +1 -261
  175. package/dist/core/extensions/loader.js +1 -2223
  176. package/dist/core/extensions/manifest-schema.js +1 -69
  177. package/dist/core/extensions/module-graph-snapshot.js +1 -33
  178. package/dist/core/extensions/preflight-ownership.js +1 -41
  179. package/dist/core/extensions/registration-validation.js +1 -82
  180. package/dist/core/extensions/registration-values.js +1 -209
  181. package/dist/core/extensions/reserved-host-flags.js +1 -36
  182. package/dist/core/extensions/runtime-registrations.js +1 -67
  183. package/dist/core/extensions/service-ownership.js +1 -19
  184. package/dist/core/extensions/version-compat.js +1 -216
  185. package/dist/core/fs/fs-utils.js +2 -158
  186. package/dist/core/fs/host-environment-errors.js +1 -141
  187. package/dist/core/fs/index.js +1 -9
  188. package/dist/core/fs/path-utils.js +1 -17
  189. package/dist/core/governance/content-fields.js +1 -160
  190. package/dist/core/governance/issue-codes.js +1 -151
  191. package/dist/core/governance/metadata-coverage.js +1 -358
  192. package/dist/core/history/drift-cache.js +3 -72
  193. package/dist/core/history/drift-scan.js +1 -342
  194. package/dist/core/history/event-classification.js +1 -109
  195. package/dist/core/history/event-index.js +8 -784
  196. package/dist/core/history/history-compact-bulk.js +1 -104
  197. package/dist/core/history/history-diff.js +1 -158
  198. package/dist/core/history/history-rewrite.d.ts +6 -1
  199. package/dist/core/history/history-rewrite.js +1 -107
  200. package/dist/core/history/history-storage-stats.js +1 -102
  201. package/dist/core/history/history-stream-policy.js +1 -62
  202. package/dist/core/history/history.js +2 -617
  203. package/dist/core/history/identity.js +1 -30
  204. package/dist/core/history/index.js +1 -9
  205. package/dist/core/history/projection.js +1 -196
  206. package/dist/core/history/read.d.ts +9 -0
  207. package/dist/core/history/read.js +1 -57
  208. package/dist/core/history/replay.js +2 -439
  209. package/dist/core/history/version-address.js +1 -32
  210. package/dist/core/history/workspace-history.js +2 -433
  211. package/dist/core/io/body-file.js +1 -62
  212. package/dist/core/io/bulk-ids-input.js +1 -112
  213. package/dist/core/item/actionability.js +1 -327
  214. package/dist/core/item/dependency-reference.js +1 -20
  215. package/dist/core/item/id.js +1 -112
  216. package/dist/core/item/index.js +1 -12
  217. package/dist/core/item/item-format-version.js +1 -78
  218. package/dist/core/item/item-format.js +5 -1473
  219. package/dist/core/item/item-record.js +1 -23
  220. package/dist/core/item/item-type-definition.js +1 -133
  221. package/dist/core/item/parent-reference-policy.js +1 -57
  222. package/dist/core/item/parse.js +2 -603
  223. package/dist/core/item/plan-lifecycle.js +1 -19
  224. package/dist/core/item/priority.js +1 -61
  225. package/dist/core/item/sprint-release-format.js +1 -38
  226. package/dist/core/item/status-filter.js +1 -115
  227. package/dist/core/item/status.js +1 -43
  228. package/dist/core/item/toon-decode.js +1 -29
  229. package/dist/core/item/type-registry.js +1 -715
  230. package/dist/core/item/type-synonyms.js +1 -38
  231. package/dist/core/lock/index.js +1 -9
  232. package/dist/core/lock/lock-gc.js +1 -240
  233. package/dist/core/lock/lock.js +3 -590
  234. package/dist/core/output/mutation-projection.js +1 -217
  235. package/dist/core/output/output-control.js +1 -25
  236. package/dist/core/output/output.js +11 -494
  237. package/dist/core/output/query-summary.js +1 -58
  238. package/dist/core/output/tabular.js +1 -77
  239. package/dist/core/packages/manifest.js +1 -244
  240. package/dist/core/packages/root.js +1 -84
  241. package/dist/core/profile/profile-describe.js +1 -83
  242. package/dist/core/profile/profile-lint.js +1 -415
  243. package/dist/core/profile/profile-plan.js +0 -0
  244. package/dist/core/profile/profile-presets.js +1 -370
  245. package/dist/core/reproducibility/context.js +1 -82
  246. package/dist/core/schema/fields-file.js +2 -288
  247. package/dist/core/schema/item-types-file.js +2 -296
  248. package/dist/core/schema/runtime-field-filters.js +1 -49
  249. package/dist/core/schema/runtime-field-values.js +1 -313
  250. package/dist/core/schema/runtime-schema.js +2 -826
  251. package/dist/core/schema/status-defs-file.js +2 -227
  252. package/dist/core/schema/status-token.js +1 -31
  253. package/dist/core/schema/type-inference.js +1 -95
  254. package/dist/core/schema/type-presets.js +1 -87
  255. package/dist/core/schema/type-workflows.js +1 -104
  256. package/dist/core/search/background-refresh.js +2 -286
  257. package/dist/core/search/bm25.js +1 -146
  258. package/dist/core/search/cache.js +2 -534
  259. package/dist/core/search/corpus.js +1 -311
  260. package/dist/core/search/embedding-batches.js +1 -163
  261. package/dist/core/search/eval.js +1 -225
  262. package/dist/core/search/http-client.js +1 -75
  263. package/dist/core/search/providers.js +1 -242
  264. package/dist/core/search/relevance.js +1 -244
  265. package/dist/core/search/semantic-defaults.js +1 -199
  266. package/dist/core/search/staleness.js +1 -30
  267. package/dist/core/search/vector-stores.js +2 -664
  268. package/dist/core/search/vectorization-metadata.js +1 -81
  269. package/dist/core/sentry/helpers.js +1 -272
  270. package/dist/core/sentry/instrument.js +1 -387
  271. package/dist/core/session/session-state.js +1 -260
  272. package/dist/core/shared/agent-session-context.js +1 -133
  273. package/dist/core/shared/author.js +1 -1172
  274. package/dist/core/shared/command-types.js +1 -4
  275. package/dist/core/shared/conflict-markers.js +1 -31
  276. package/dist/core/shared/constants.js +1 -405
  277. package/dist/core/shared/errors.js +1 -20
  278. package/dist/core/shared/html-entity-decode.js +1 -131
  279. package/dist/core/shared/index.js +1 -12
  280. package/dist/core/shared/item-metadata-contract.js +1 -89
  281. package/dist/core/shared/lazy-module.js +1 -16
  282. package/dist/core/shared/levenshtein.js +1 -61
  283. package/dist/core/shared/memo.js +1 -19
  284. package/dist/core/shared/numeric-parsers.js +1 -20
  285. package/dist/core/shared/option-alias-visibility.js +1 -67
  286. package/dist/core/shared/primitives.js +1 -127
  287. package/dist/core/shared/serial-queue.js +1 -79
  288. package/dist/core/shared/serialization.js +1 -210
  289. package/dist/core/shared/split-comma-list.js +1 -30
  290. package/dist/core/shared/text-normalization.js +1 -38
  291. package/dist/core/shared/time.js +1 -306
  292. package/dist/core/store/index.js +1 -12
  293. package/dist/core/store/item-format-migration.js +1 -125
  294. package/dist/core/store/item-metadata-cache.js +1 -1116
  295. package/dist/core/store/item-metadata-query-index.js +9 -394
  296. package/dist/core/store/item-metadata-read-work.js +1 -43
  297. package/dist/core/store/item-store.js +1 -693
  298. package/dist/core/store/paths.d.ts +1 -1
  299. package/dist/core/store/paths.js +1 -214
  300. package/dist/core/store/settings-read-cache.js +1 -85
  301. package/dist/core/store/settings-validator.js +1 -421
  302. package/dist/core/store/settings.js +3 -1309
  303. package/dist/core/store/tracker-preflight.js +1 -141
  304. package/dist/core/telemetry/consent.js +5 -108
  305. package/dist/core/telemetry/observability.js +1 -246
  306. package/dist/core/telemetry/runtime.js +4 -1988
  307. package/dist/core/test/background-runs.js +4 -945
  308. package/dist/core/test/item-test-run-tracking.js +1 -63
  309. package/dist/core/test/run-selectors.js +1 -120
  310. package/dist/core/validate/estimate-defaults.js +1 -89
  311. package/dist/core/validate/fix-planning.js +1 -189
  312. package/dist/core/validate/linked-artifact-reference.js +1 -36
  313. package/dist/core/validate/missing-by-type.js +1 -34
  314. package/dist/core/validate/missing-link-owners.js +1 -95
  315. package/dist/core/validate/stale-file-classification.js +1 -82
  316. package/dist/mcp/http-server.js +5 -448
  317. package/dist/mcp/legacy-adapter.js +1 -77
  318. package/dist/mcp/runtime-capabilities.js +1 -200
  319. package/dist/mcp/server.js +4 -1233
  320. package/dist/mcp/tool-definitions.js +1 -804
  321. package/dist/sdk/actionability.js +1 -13
  322. package/dist/sdk/agent/closed-domain-contracts.js +1 -161
  323. package/dist/sdk/agent/command-recovery.js +1 -59
  324. package/dist/sdk/agent/command-suggestions.js +1 -66
  325. package/dist/sdk/agent/create-option-policy.js +1 -31
  326. package/dist/sdk/agent/identity-config.js +1 -106
  327. package/dist/sdk/agent/item-addressing.js +1 -207
  328. package/dist/sdk/agent/refusal-closure-census.js +1 -151
  329. package/dist/sdk/agent/refusal-closure.js +1 -133
  330. package/dist/sdk/agent/refusal-corpus-contracts.js +1 -193
  331. package/dist/sdk/agent/refusal-reachability.js +1 -593
  332. package/dist/sdk/agent/subcommand-recovery.js +1 -83
  333. package/dist/sdk/agent/task-transcript-contracts.js +1 -197
  334. package/dist/sdk/agent/tracker-preflight-contracts.js +1 -126
  335. package/dist/sdk/agent-capability-contracts.js +1 -428
  336. package/dist/sdk/agent-session-context.js +1 -9
  337. package/dist/sdk/annotations.js +1 -448
  338. package/dist/sdk/author-attribution.js +1 -468
  339. package/dist/sdk/authoring.js +1 -20
  340. package/dist/sdk/cli-bootstrap.js +1 -838
  341. package/dist/sdk/cli-contracts/agent-output-contracts.d.ts +1 -1
  342. package/dist/sdk/cli-contracts/agent-output-contracts.js +4 -476
  343. package/dist/sdk/cli-contracts/bootstrap-command-scanner.js +1 -79
  344. package/dist/sdk/cli-contracts/command-aliases.d.ts +4 -0
  345. package/dist/sdk/cli-contracts/command-aliases.js +1 -107
  346. package/dist/sdk/cli-contracts/command-exit-contracts.js +1 -151
  347. package/dist/sdk/cli-contracts/commander-mutation-options.js +1 -1081
  348. package/dist/sdk/cli-contracts/commander-types.js +1 -159
  349. package/dist/sdk/cli-contracts/completeness.js +1 -393
  350. package/dist/sdk/cli-contracts/enum-contracts.js +1 -222
  351. package/dist/sdk/cli-contracts/flag-contracts.js +1 -1947
  352. package/dist/sdk/cli-contracts/flag-lexicon-contracts.js +1 -347
  353. package/dist/sdk/cli-contracts/grammar-contracts.js +1 -986
  354. package/dist/sdk/cli-contracts/registration-helpers.js +7 -990
  355. package/dist/sdk/cli-contracts/runtime-contracts.d.ts +5 -0
  356. package/dist/sdk/cli-contracts/runtime-contracts.js +1 -2090
  357. package/dist/sdk/cli-contracts/schemas/assurance-definition.js +1 -324
  358. package/dist/sdk/cli-contracts/string-lists.js +1 -16
  359. package/dist/sdk/cli-contracts/tool-option-contracts.js +1 -461
  360. package/dist/sdk/cli-contracts/tool-parameter-tables.js +1 -2167
  361. package/dist/sdk/cli-contracts/tool-schema.d.ts +3 -1
  362. package/dist/sdk/cli-contracts/tool-schema.js +1 -1664
  363. package/dist/sdk/cli-contracts/typed-action-inputs.js +1 -4
  364. package/dist/sdk/cli-contracts.d.ts +1 -1
  365. package/dist/sdk/cli-contracts.js +1 -17
  366. package/dist/sdk/cli-program.js +1 -49
  367. package/dist/sdk/command-line.d.ts +2 -5
  368. package/dist/sdk/command-line.js +1 -78
  369. package/dist/sdk/comments.js +1 -133
  370. package/dist/sdk/compile-cache.js +1 -73
  371. package/dist/sdk/completion.js +157 -837
  372. package/dist/sdk/compose.js +1 -1090
  373. package/dist/sdk/config.js +1 -1204
  374. package/dist/sdk/context/recency.js +1 -33
  375. package/dist/sdk/context/semantic-session-attribution.js +1 -82
  376. package/dist/sdk/context/usage-egress.js +1 -29
  377. package/dist/sdk/context/usage-ledger.js +3 -185
  378. package/dist/sdk/context-intent-contracts.js +1 -709
  379. package/dist/sdk/context-intent-runtime.js +1 -115
  380. package/dist/sdk/context-packing.js +1 -218
  381. package/dist/sdk/context-relevance.js +1 -503
  382. package/dist/sdk/context-signal-store.js +2 -426
  383. package/dist/sdk/context-usage.js +1 -367
  384. package/dist/sdk/contracts.js +1 -23
  385. package/dist/sdk/core-governance.js +1 -14
  386. package/dist/sdk/core.js +1 -14
  387. package/dist/sdk/corpus-shape.js +1 -401
  388. package/dist/sdk/define.js +1 -220
  389. package/dist/sdk/dependencies.js +1 -718
  390. package/dist/sdk/dependency-flag-validation.js +1 -156
  391. package/dist/sdk/dependency-provenance.js +1 -135
  392. package/dist/sdk/docs.js +1 -14
  393. package/dist/sdk/duplicates.js +1 -40
  394. package/dist/sdk/environment/agent-environment.js +1 -466
  395. package/dist/sdk/environment/host-environment-errors.js +1 -8
  396. package/dist/sdk/environment/project-runtime-compatibility.js +1 -481
  397. package/dist/sdk/environment/source-context.js +1 -28
  398. package/dist/sdk/environment/tracker-preflight.js +1 -9
  399. package/dist/sdk/error-code-catalog.js +1 -153
  400. package/dist/sdk/error-runtime.js +1 -58
  401. package/dist/sdk/errors.js +1 -58
  402. package/dist/sdk/eval.js +1 -190
  403. package/dist/sdk/extension/author-manifest.js +1 -92
  404. package/dist/sdk/extension/bundled-catalog.js +1 -332
  405. package/dist/sdk/extension/concurrency.js +1 -25
  406. package/dist/sdk/extension/copy-scope.d.ts +2 -0
  407. package/dist/sdk/extension/copy-scope.js +2 -0
  408. package/dist/sdk/extension/custom-field-collisions.js +1 -30
  409. package/dist/sdk/extension/describe.js +3 -189
  410. package/dist/sdk/extension/doctor.js +1 -606
  411. package/dist/sdk/extension/install-plan.d.ts +69 -0
  412. package/dist/sdk/extension/install-plan.js +2 -0
  413. package/dist/sdk/extension/install-receipts.d.ts +7 -0
  414. package/dist/sdk/extension/install-receipts.js +2 -0
  415. package/dist/sdk/extension/install-runtime.js +3 -313
  416. package/dist/sdk/extension/install-snapshot.js +1 -66
  417. package/dist/sdk/extension/install-sources.js +5 -1057
  418. package/dist/sdk/extension/managed-state.js +2 -252
  419. package/dist/sdk/extension/migrations.js +2 -174
  420. package/dist/sdk/extension/output-ownership.js +1 -25
  421. package/dist/sdk/extension/runtime-summary.js +1 -18
  422. package/dist/sdk/extension/scaffold.js +4 -2308
  423. package/dist/sdk/extension/shared.js +1 -147
  424. package/dist/sdk/extension/source-resolution.js +1 -65
  425. package/dist/sdk/extension/update-check.js +1 -67
  426. package/dist/sdk/extension-command-context.js +1 -44
  427. package/dist/sdk/extension-contracts.js +1 -73
  428. package/dist/sdk/extension.d.ts +7 -2
  429. package/dist/sdk/extension.js +1 -2196
  430. package/dist/sdk/files.js +1 -535
  431. package/dist/sdk/flag-invocation-contracts.d.ts +0 -5
  432. package/dist/sdk/flag-invocation-contracts.js +1 -344
  433. package/dist/sdk/generated/generated-error-code-catalog-part-1.js +1 -2224
  434. package/dist/sdk/generated/generated-error-code-catalog-part-2.js +1 -2236
  435. package/dist/sdk/generated-error-code-catalog.js +1 -16
  436. package/dist/sdk/governance/assurance-action-contracts.js +1 -4
  437. package/dist/sdk/governance/assurance-action.js +1 -411
  438. package/dist/sdk/governance/assurance-limits.js +1 -10
  439. package/dist/sdk/governance/assurance-mutation-error.js +1 -81
  440. package/dist/sdk/governance/assurance-presets.js +1 -135
  441. package/dist/sdk/governance/assurance-runtime.js +1 -238
  442. package/dist/sdk/governance/assurance.js +4 -1182
  443. package/dist/sdk/governance/boundary-fixtures.js +1 -200
  444. package/dist/sdk/governance/coverage-assurance.js +1 -60
  445. package/dist/sdk/governance/defect-recurrence-coverage.js +1 -188
  446. package/dist/sdk/governance/defect-recurrence-graph.js +1 -120
  447. package/dist/sdk/governance/defect-recurrence-signals.js +1 -24
  448. package/dist/sdk/governance/defect-recurrence.js +1 -623
  449. package/dist/sdk/governance/extension-host-version.js +1 -115
  450. package/dist/sdk/governance/gc.js +1 -368
  451. package/dist/sdk/governance/health.js +1 -2367
  452. package/dist/sdk/governance/hierarchy-validation.js +1 -108
  453. package/dist/sdk/governance/linked-file-report.js +1 -71
  454. package/dist/sdk/governance/merge-receipt-history.js +1 -206
  455. package/dist/sdk/governance/provenance-health.js +1 -282
  456. package/dist/sdk/governance/reindex.js +4 -761
  457. package/dist/sdk/governance/stale-work.js +1 -82
  458. package/dist/sdk/governance/status-role-diagnostics.js +1 -35
  459. package/dist/sdk/governance/storage-integrity.js +1 -280
  460. package/dist/sdk/governance/tracked-runtime-cache.js +1 -106
  461. package/dist/sdk/governance/upgrade.js +2 -327
  462. package/dist/sdk/governance/validate-history-drift.js +1 -81
  463. package/dist/sdk/governance/validate-item-reader.js +1 -17
  464. package/dist/sdk/governance/validate-normalization.js +1 -36
  465. package/dist/sdk/governance/validate.js +1 -2261
  466. package/dist/sdk/governance/workspace-position.js +1 -163
  467. package/dist/sdk/governance.d.ts +1 -0
  468. package/dist/sdk/governance.js +1 -31
  469. package/dist/sdk/graph/adapter.js +1 -181
  470. package/dist/sdk/graph/analytics.js +1 -474
  471. package/dist/sdk/graph/assembly.js +1 -377
  472. package/dist/sdk/graph/cache.js +1 -160
  473. package/dist/sdk/graph/centrality.js +1 -258
  474. package/dist/sdk/graph/conformance.js +1 -130
  475. package/dist/sdk/graph/deadline-scheduling.d.ts +90 -0
  476. package/dist/sdk/graph/deadline-scheduling.js +2 -0
  477. package/dist/sdk/graph/durable-cache.d.ts +1 -1
  478. package/dist/sdk/graph/durable-cache.js +1 -361
  479. package/dist/sdk/graph/governance-contracts.js +1 -34
  480. package/dist/sdk/graph/governance.d.ts +13 -1
  481. package/dist/sdk/graph/governance.js +1 -735
  482. package/dist/sdk/graph/hierarchy-integrity.js +1 -310
  483. package/dist/sdk/graph/index.d.ts +3 -2
  484. package/dist/sdk/graph/index.js +1 -26
  485. package/dist/sdk/graph/lifecycle-coverage.d.ts +32 -0
  486. package/dist/sdk/graph/lifecycle-coverage.js +2 -0
  487. package/dist/sdk/graph/mutation-advisory.js +1 -176
  488. package/dist/sdk/graph/remediation.js +1 -197
  489. package/dist/sdk/graph/run.d.ts +15 -1
  490. package/dist/sdk/graph/run.js +1 -768
  491. package/dist/sdk/graph/scheduling.js +1 -124
  492. package/dist/sdk/graph/traversal.js +1 -284
  493. package/dist/sdk/graph/workspace-relationship-kind-registry.js +1 -27
  494. package/dist/sdk/graph.js +1 -15
  495. package/dist/sdk/guide-topics.js +1 -707
  496. package/dist/sdk/guide.js +1 -279
  497. package/dist/sdk/history/maintenance.d.ts +71 -0
  498. package/dist/sdk/history/maintenance.js +2 -0
  499. package/dist/sdk/history/salvage.js +2 -247
  500. package/dist/sdk/history/subject.d.ts +19 -0
  501. package/dist/sdk/history/subject.js +2 -0
  502. package/dist/sdk/history-analytics.js +1 -282
  503. package/dist/sdk/history-compact.js +1 -527
  504. package/dist/sdk/history-mcp.js +1 -68
  505. package/dist/sdk/history-provenance.js +1 -182
  506. package/dist/sdk/history-read.js +1 -96
  507. package/dist/sdk/history-redact.d.ts +1 -14
  508. package/dist/sdk/history-redact.js +1 -643
  509. package/dist/sdk/history-repair.d.ts +5 -0
  510. package/dist/sdk/history-repair.js +1 -657
  511. package/dist/sdk/improvement-ledger-validation.js +1 -62
  512. package/dist/sdk/improvement-ledger.js +2 -257
  513. package/dist/sdk/index.d.ts +4 -0
  514. package/dist/sdk/index.js +1 -183
  515. package/dist/sdk/init-agent-guidance.js +2 -496
  516. package/dist/sdk/init.js +2 -820
  517. package/dist/sdk/invocation-author.js +1 -39
  518. package/dist/sdk/item-children.js +1 -90
  519. package/dist/sdk/item-metadata-index.js +1 -15
  520. package/dist/sdk/item-schedule.js +1 -27
  521. package/dist/sdk/item-transaction.js +1 -396
  522. package/dist/sdk/learnings.js +1 -29
  523. package/dist/sdk/lifecycle/append.js +2 -53
  524. package/dist/sdk/lifecycle/claim.d.ts +2 -0
  525. package/dist/sdk/lifecycle/claim.js +1 -242
  526. package/dist/sdk/lifecycle/close-many.js +1 -438
  527. package/dist/sdk/lifecycle/close.js +1 -468
  528. package/dist/sdk/lifecycle/copy.js +1 -212
  529. package/dist/sdk/lifecycle/create.js +1 -1949
  530. package/dist/sdk/lifecycle/delete.js +1 -45
  531. package/dist/sdk/lifecycle/event-validation-messages.js +1 -91
  532. package/dist/sdk/lifecycle/focus.js +1 -91
  533. package/dist/sdk/lifecycle/hierarchy-mutation-lock.js +1 -24
  534. package/dist/sdk/lifecycle/legacy-none-tokens.js +1 -149
  535. package/dist/sdk/lifecycle/lifecycle-transitions.js +1 -40
  536. package/dist/sdk/lifecycle/mcp-actions.d.ts +2 -0
  537. package/dist/sdk/lifecycle/mcp-actions.js +1 -51
  538. package/dist/sdk/lifecycle/metadata-normalizers.js +1 -46
  539. package/dist/sdk/lifecycle/mutation-command-options.js +1 -9
  540. package/dist/sdk/lifecycle/plan.js +1 -1606
  541. package/dist/sdk/lifecycle/recurrence-parsers.js +1 -147
  542. package/dist/sdk/lifecycle/reopen.js +1 -68
  543. package/dist/sdk/lifecycle/repeatable-metadata-parsers.js +1 -143
  544. package/dist/sdk/lifecycle/restore.d.ts +1 -0
  545. package/dist/sdk/lifecycle/restore.js +1 -330
  546. package/dist/sdk/lifecycle/shared-unset-fields.js +1 -295
  547. package/dist/sdk/lifecycle/update-many.js +1 -861
  548. package/dist/sdk/lifecycle/update.js +1 -2136
  549. package/dist/sdk/lifecycle-completion.js +1 -92
  550. package/dist/sdk/lifecycle-policy.js +1 -120
  551. package/dist/sdk/linked-artifacts.js +1 -530
  552. package/dist/sdk/mcp/apps.js +4 -133
  553. package/dist/sdk/mcp/authorization.js +1 -404
  554. package/dist/sdk/mcp/discovery.js +1 -494
  555. package/dist/sdk/mcp/interactions.js +1 -336
  556. package/dist/sdk/mcp/protocol.d.ts +7 -0
  557. package/dist/sdk/mcp/protocol.js +1 -184
  558. package/dist/sdk/mcp/skills.js +1 -389
  559. package/dist/sdk/mcp/subscriptions.js +1 -211
  560. package/dist/sdk/mcp/tasks.js +2 -430
  561. package/dist/sdk/mcp/transport.js +1 -260
  562. package/dist/sdk/merge/abandoned-receipts.js +1 -46
  563. package/dist/sdk/merge/driver.js +1 -212
  564. package/dist/sdk/merge/index.js +1 -16
  565. package/dist/sdk/merge/install.js +3 -561
  566. package/dist/sdk/merge/receipt-file-boundary.js +1 -46
  567. package/dist/sdk/merge/receipt-operation.js +1 -96
  568. package/dist/sdk/merge/receipt-schema.js +1 -397
  569. package/dist/sdk/merge/receipts.js +4 -525
  570. package/dist/sdk/merge/reconcile.js +1 -352
  571. package/dist/sdk/merge/three-way.js +3 -775
  572. package/dist/sdk/merge.js +1 -10
  573. package/dist/sdk/mutation-events.js +1 -292
  574. package/dist/sdk/mutation-guard.js +1 -216
  575. package/dist/sdk/notes.js +1 -139
  576. package/dist/sdk/output-contracts.js +1 -172
  577. package/dist/sdk/output-projection.js +1 -430
  578. package/dist/sdk/output-token-accounting.js +1 -140
  579. package/dist/sdk/output.js +1 -64
  580. package/dist/sdk/ownership-source.js +1 -21
  581. package/dist/sdk/package-import-adapters.js +1 -442
  582. package/dist/sdk/package-migrations.js +1 -20
  583. package/dist/sdk/package-runtime-options.js +1 -80
  584. package/dist/sdk/pagination.js +1 -162
  585. package/dist/sdk/profile.js +1 -454
  586. package/dist/sdk/provenance.js +1 -258
  587. package/dist/sdk/public-surface.json +1 -1
  588. package/dist/sdk/query/activity.js +1 -401
  589. package/dist/sdk/query/aggregate.d.ts +16 -0
  590. package/dist/sdk/query/aggregate.js +1 -390
  591. package/dist/sdk/query/calendar.js +1 -964
  592. package/dist/sdk/query/complete-list.js +1 -215
  593. package/dist/sdk/query/context.js +1 -1702
  594. package/dist/sdk/query/duplicate-candidates.js +1 -70
  595. package/dist/sdk/query/get.js +1 -450
  596. package/dist/sdk/query/history.js +1 -186
  597. package/dist/sdk/query/item-filter-options.js +1 -9
  598. package/dist/sdk/query/light-metadata.js +1 -18
  599. package/dist/sdk/query/list-filter-shared.js +1 -81
  600. package/dist/sdk/query/list.js +1 -1304
  601. package/dist/sdk/query/multi-value-filters.js +1 -78
  602. package/dist/sdk/query/next.js +1 -513
  603. package/dist/sdk/query/parsers.js +1 -44
  604. package/dist/sdk/query/projection-contracts.js +1 -184
  605. package/dist/sdk/query/search-contracts.js +1 -230
  606. package/dist/sdk/query/search-pagination.js +1 -35
  607. package/dist/sdk/query/search-rendering.js +1 -105
  608. package/dist/sdk/query/search.js +2 -1987
  609. package/dist/sdk/query.js +1 -35
  610. package/dist/sdk/read-output/continuation.js +1 -194
  611. package/dist/sdk/read-output-budget.js +1 -135
  612. package/dist/sdk/read-output-contracts.js +1 -1225
  613. package/dist/sdk/read-output-rows.js +1 -186
  614. package/dist/sdk/read-output-session.js +1 -208
  615. package/dist/sdk/relationship-analytics.js +1 -410
  616. package/dist/sdk/relationship-context.js +1 -284
  617. package/dist/sdk/relationship-history.js +4 -519
  618. package/dist/sdk/relationship-kinds/contract.js +1 -22
  619. package/dist/sdk/relationship-migration.js +1 -77
  620. package/dist/sdk/relationships.js +1 -579
  621. package/dist/sdk/reproducibility/process.js +1 -87
  622. package/dist/sdk/runtime-action-aliases.js +1 -59
  623. package/dist/sdk/runtime-extended-actions.js +1 -177
  624. package/dist/sdk/runtime-input.js +1 -614
  625. package/dist/sdk/runtime-primitives.js +1 -84
  626. package/dist/sdk/runtime-public-contracts.js +1 -4
  627. package/dist/sdk/runtime-stats-options.js +1 -38
  628. package/dist/sdk/runtime.js +1 -1928
  629. package/dist/sdk/scheduling-shortcuts.js +1 -63
  630. package/dist/sdk/schema-migration.js +3 -856
  631. package/dist/sdk/schema.js +1 -1376
  632. package/dist/sdk/search-refresh-worker.js +1 -18
  633. package/dist/sdk/similarity-scoring.js +1 -53
  634. package/dist/sdk/similarity.js +1 -326
  635. package/dist/sdk/start-task-status.js +1 -14
  636. package/dist/sdk/stats.js +1 -270
  637. package/dist/sdk/structured-mutations.js +1 -580
  638. package/dist/sdk/telemetry-flush.js +1 -13
  639. package/dist/sdk/telemetry.js +1 -405
  640. package/dist/sdk/templates.js +2 -292
  641. package/dist/sdk/test/batch.js +2 -509
  642. package/dist/sdk/test/entry.js +1 -70
  643. package/dist/sdk/test/execution.js +6 -2211
  644. package/dist/sdk/test/linked-command-detection.js +1 -546
  645. package/dist/sdk/test/measurements.js +1 -91
  646. package/dist/sdk/test/parsers.js +1 -545
  647. package/dist/sdk/test/runs.js +1 -193
  648. package/dist/sdk/test/trust.js +2 -206
  649. package/dist/sdk/testing.js +4 -1391
  650. package/dist/sdk/traceability/runtime-files-lookup.js +1 -32
  651. package/dist/sdk/traceability/source-traceability.js +1 -292
  652. package/dist/sdk/tracker-root-discovery.js +1 -9
  653. package/dist/sdk/workspace-contracts-cache.js +1 -28
  654. package/dist/sdk/workspace-contracts.js +1 -33
  655. package/dist/sdk/workspace-memory.js +2 -318
  656. package/dist/sdk/workspace-recipe.js +1 -71
  657. package/dist/sdk/workspace-snapshot.js +4 -613
  658. package/dist/sdk/workspace-transaction-gc.js +1 -149
  659. package/dist/sdk/workspace-transaction.js +2 -363
  660. package/dist/sdk/workspace.js +3 -127
  661. package/dist/types/index.js +1 -9
  662. package/dist/types.js +1 -245
  663. package/docs/AGENT_GUIDE.md +1 -1
  664. package/docs/CONTEXT_ALGORITHM_PORTFOLIO.md +167 -0
  665. package/docs/DIAGNOSTIC_OUTPUT_CONTRACTS.md +9 -3
  666. package/docs/EXTENSIONS.md +1 -0
  667. package/docs/HISTORY_MAINTENANCE.md +125 -0
  668. package/docs/MCP_2026_07_28_CONFORMANCE.md +20 -10
  669. package/docs/PACKAGE_EVIDENCE.md +92 -0
  670. package/docs/PLANNING_MEASUREMENTS.md +183 -0
  671. package/docs/README.md +3 -0
  672. package/docs/RELEASING.md +1 -0
  673. package/docs/SCRIPTING.md +21 -0
  674. package/docs/TESTING.md +23 -0
  675. package/docs/generated/FLAG_LEXICON_BUDGETS.md +5 -5
  676. package/docs/generated/REFUSAL_CLOSURE_CENSUS.md +2 -2
  677. package/marketplace.json +2 -2
  678. package/package.json +1 -1
  679. package/packages/pm-beads/package.json +1 -1
  680. package/packages/pm-calendar/package.json +1 -1
  681. package/packages/pm-command-kit/package.json +1 -1
  682. package/packages/pm-digital-twin/package.json +1 -1
  683. package/packages/pm-governance-audit/package.json +1 -1
  684. package/packages/pm-guide-shell/package.json +1 -1
  685. package/packages/pm-kanban/package.json +1 -1
  686. package/packages/pm-lifecycle-hooks/package.json +1 -1
  687. package/packages/pm-linked-test-adapters/package.json +1 -1
  688. package/packages/pm-search-advanced/package.json +1 -1
  689. package/packages/pm-templates/package.json +1 -1
  690. package/packages/pm-todos/package.json +1 -1
  691. package/packages/pm-vcs/package.json +1 -1
  692. package/plugins/pm-claude/.claude-plugin/plugin.json +1 -1
  693. package/plugins/pm-codex/.codex-plugin/plugin.json +1 -1
  694. package/scripts/finalize-build.mjs +45 -3
  695. package/dist/cli-bundle/chunks/chunk-AZDFJGH6.js +0 -9
  696. package/dist/cli-bundle/chunks/chunk-BAX2BYUW.js +0 -2111
  697. package/dist/cli-bundle/chunks/chunk-CKOL5U7J.js +0 -77
  698. package/dist/cli-bundle/chunks/chunk-OF76PSDQ.js +0 -5
  699. package/dist/cli-bundle/chunks/chunk-QUWFABDM.js +0 -232
  700. package/dist/cli-bundle/chunks/chunk-QWRRFYK3.js +0 -2
  701. package/dist/cli-bundle/chunks/chunk-RWWBOWJ5.js +0 -2
  702. package/dist/cli-bundle/chunks/chunk-WGAOYSYH.js +0 -40
  703. package/dist/cli-bundle/chunks/chunk-WI2AYPA7.js +0 -2
  704. package/dist/cli-bundle/chunks/register-list-query-5JL52D33.js +0 -11
  705. package/dist/cli-bundle/chunks/register-mutation-ZPG7KMVP.js +0 -20
  706. package/dist/cli-bundle/chunks/register-setup-H4SVAVX7.js +0 -2
  707. package/dist/cli-bundle/focused-chunks/chunk-AL5ON6K6.js +0 -2
  708. package/dist/cli-bundle/focused-chunks/chunk-CHC2IDXA.js +0 -6
  709. package/dist/cli-bundle/focused-chunks/chunk-CK6QFAPZ.js +0 -20
  710. package/dist/cli-bundle/focused-chunks/chunk-EZR3GHFE.js +0 -2
  711. package/dist/cli-bundle/focused-chunks/chunk-H2WJWK7L.js +0 -56
  712. package/dist/cli-bundle/focused-chunks/chunk-NTPY5GSO.js +0 -3
  713. package/dist/cli-bundle/focused-chunks/chunk-P5O7MP5Y.js +0 -2
  714. package/dist/cli-bundle/focused-chunks/chunk-PDMW2E36.js +0 -177
  715. package/dist/cli-bundle/focused-chunks/chunk-QTVCLMSZ.js +0 -6
  716. package/dist/cli-bundle/focused-chunks/chunk-QTZRBUYA.js +0 -8
  717. package/dist/cli-bundle/focused-chunks/chunk-SGQST3PQ.js +0 -12
  718. package/dist/cli-bundle/focused-chunks/chunk-UKHASMMP.js +0 -10
  719. package/dist/cli-bundle/focused-chunks/chunk-ZPEKQHOC.js +0 -2
package/dist/cli/main.js CHANGED
@@ -1,2575 +1,7 @@
1
1
  #!/usr/bin/env node
2
- /**
3
- * @module cli/main
4
- */
5
-
6
- !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]="2b73baa7-f63e-5a3b-a8cb-659ac26d7c67")}catch(e){}}();
7
- import { Command, CommanderError } from "commander";
8
- 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";
9
- import { runWithReproducibleProcessEnvironment } from "../sdk/reproducibility/process.js";
10
- import { resolveSubcommandFlagContractsForCommand } from "../sdk/cli-contracts.js";
11
- import { createExtensionCommandSdk } from "../sdk/extension-command-context.js";
12
- import { PmClient } from "../sdk/runtime.js";
13
- import { coerceLooseCommandOptionsWithFlagDefinitions, collectLooseCommandOptionKeysForDefinitions, collectLoosePositionalArgs, parseLooseCommandOptions, stripLooseCommandOptionTokens, validateLooseCommandOptionsWithFlagDefinitions, } from "./extension-command-options.js";
14
- import { attachRichHelpText, isFullHelpDiscovery, setPmCommandHelpVisibilityTier, } from "./help-content.js";
15
- import { finishActiveTelemetryCommand, recordAfterCommandContextUsage } from "./after-command-context-usage.js";
16
- import { extractProvidedOptionFlags, normalizeLongOptionFlag, redactSensitiveCommandArgs, renderPmCommand } from "./argv-utils.js";
17
- import { classifyCommanderError, classifyPmCliError, classifyUnknownError, formatPmCliErrorForDisplay, formatPmCliErrorForJson, formatUnknownErrorForJson, projectLeanErrorEnvelope, } from "./error-guidance.js";
18
- import { describeUnknownError, isCommanderError, normalizeThrownExitCode, readThrownExitCode, wrapThrownErrorForSentry } from "../sdk/error-runtime.js";
19
- import { applyDefaultOutputFormat, clearResolvedGlobalOptions, collect, formatHookWarnings, getCommandPath, getGlobalOptions, invalidateSearchCachesForMutation, setResolvedGlobalOptions, syncCommanderActionOptions, } from "./registration-helpers.js";
20
- import { normalizeExtensionCommandPath, collectDynamicExtensionFlagHelpByCommand, collectExtensionCommandHelpDescriptors, applyDynamicExtensionFlagOptions, buildResidualDynamicExtensionFlagHelp, applyDynamicExtensionArguments, buildDynamicExtensionCommandMetadataHelp, findCommandByPath, collectSafeExtensionCommandPaths, reportExtensionCommandCollision, ensureCommandPath, buildCanonicalExtensionAliases, extensionFlagTakesValueForInvocation, } from "./extension-command-help.js";
21
- import { parseBootstrapGlobalOptions, applyBootstrapPagerPolicy, parseBootstrapHelpRequest, parseBootstrapCommandName, normalizeBootstrapInvocation, stripGlobalBootstrapTokens, } from "./bootstrap-args.js";
22
- import { applyInvocationAuthorOverride } from "../sdk/invocation-author.js";
23
- import { createPmCliProgram } from "../sdk/cli-program.js";
24
- import { collectMandatoryMigrationBlockers, enforceMandatoryMigrationWriteGate, enforceItemFormatWriteGateAndPreflightMigration, enforceMutationGuardPreflight, } from "./migration-gates.js";
25
- import { runExtensionMigrations } from "../sdk/extension/migrations.js";
26
- import { appendCommanderExtensionFailures, isKnownHelpCommandPath, formatCommanderUsageMessage, formatCommanderUsageJson, resolveCommanderUsageContext, resolveUnknownCommanderToken, } from "./commander-usage.js";
27
- import { loadExtensionRecoveryFailures, loadUnknownCommandRecoveryFailures } from "./extension-recovery.js";
28
- import { maybeRenderBootstrapJsonHelp, attachCreateUpdatePolicyHelpText } from "./help-json-payload.js";
29
- import { attachOutputTokenAccounting } from "../sdk/output-token-accounting.js";
30
- import { runWithDiscoveredContextIntentContracts } from "../sdk/context-intent-runtime.js";
31
- import { PM_READ_OUTPUT_SURFACE_CONTRACTS, applyReadOutputIncludeModes, readOutputIncludeModeOptions, resolveReadOutputSurface, validateReadOutputOptions, } from "../sdk/read-output-contracts.js";
32
- import { loadContextIntentSnapshotForInvocation } from "./context-intent-invocation.js";
33
- import { isPmSuccessfulExitCode } from "../sdk/cli-contracts/command-exit-contracts.js";
34
- const PM_PACKAGE_ROOT_ENV = "PM_CLI_PACKAGE_ROOT";
35
- const READ_OUTPUT_INVOCATION_PROVENANCE = Symbol.for("pm.readOutputInvocationProvenance");
36
- /** Carry private read-output provenance across Commander's option rebuilds. */
37
- function copyReadOutputInvocationProvenance(source, target) {
38
- const provenance = Reflect.get(source, READ_OUTPUT_INVOCATION_PROVENANCE);
39
- if (provenance !== undefined) {
40
- Reflect.set(target, READ_OUTPUT_INVOCATION_PROVENANCE, provenance);
41
- }
42
- }
43
- /** Record the exact compatibility flags present in the raw CLI invocation. */
44
- function recordCliReadOutputInvocationProvenance(actionCommand, commandPath, commandOptions) {
45
- const surface = resolveReadOutputSurface(commandPath, commandOptions);
46
- if (!surface)
47
- return;
48
- let rootCommand = actionCommand;
49
- while (rootCommand.parent)
50
- rootCommand = rootCommand.parent;
51
- const rawArgs = rootCommand.rawArgs;
52
- const providedFlags = new Set(extractProvidedOptionFlags(rawArgs.slice(2)));
53
- const contract = PM_READ_OUTPUT_SURFACE_CONTRACTS.find((candidate) => candidate.command === surface);
54
- const explicitLegacyAliases = Object.values(contract.dimensions).flatMap((dimension) => dimension.legacy_aliases.flatMap((alias) => (providedFlags.has(alias.flag) ? [alias.flag] : [])));
55
- const previous = Reflect.get(commandOptions, READ_OUTPUT_INVOCATION_PROVENANCE);
56
- Reflect.set(commandOptions, READ_OUTPUT_INVOCATION_PROVENANCE, {
57
- canonical_include_modes: previous?.canonical_include_modes ?? [],
58
- explicit_legacy_aliases: explicitLegacyAliases,
59
- cli_invocation_observed: true,
60
- });
61
- copyReadOutputInvocationProvenance(commandOptions, actionCommand);
62
- }
63
- function resolvePmPackageRoot() {
64
- return resolvePmPackageRootFromModule(import.meta.url, ["../.."]);
65
- }
66
- if (typeof process.env[PM_PACKAGE_ROOT_ENV] !== "string" || process.env[PM_PACKAGE_ROOT_ENV]?.trim().length === 0) {
67
- process.env[PM_PACKAGE_ROOT_ENV] = resolvePmPackageRoot();
68
- }
69
- let activeExtensionHookContext = null;
70
- let activeTelemetryCommandContext = null;
71
- function setActiveExtensionHookContextForTest(context) {
72
- activeExtensionHookContext = context;
73
- }
74
- function setActiveRuntimeExtensionCommandDescriptorsForTest(descriptors) {
75
- activeRuntimeExtensionCommandDescriptors = descriptors;
76
- }
77
- const TELEMETRY_COMMAND_RESOLUTION_SET = new Set([
78
- "success",
79
- "nonexistent_command",
80
- "invalid_option",
81
- "missing_required_option",
82
- "missing_required_argument",
83
- "invalid_usage",
84
- "validation_failed",
85
- "health_findings",
86
- "validation_findings",
87
- "conflict",
88
- "runtime_failed",
89
- "unknown_failed",
90
- ]);
91
- const TELEMETRY_RESOLUTION_STAGE_SET = new Set(["parse", "preflight", "execute", "unknown"]);
92
- const TELEMETRY_ERROR_CATEGORY_SET = new Set(["usage", "validation", "conflict", "runtime", "unknown"]);
93
- let runtimeExtensionSnapshotCache = null;
94
- let runtimeExtensionDiscoverySnapshotCache = null;
95
- let activeRuntimeExtensionCommandDescriptors = new Map();
96
- const HANDLED_ERROR_SENTRY_FLUSH_TIMEOUT_MS = 250;
97
- const EXPECTED_HANDLED_ERROR_EXIT_CODES = new Set([EXIT_CODE.USAGE, EXIT_CODE.NOT_FOUND, EXIT_CODE.CONFLICT]);
98
- const TRUE_LIKE_ENV_VALUES = new Set(["1", "true", "yes", "on"]);
99
- const loadSetupRegistrationModule = createLazyModule(() => import("./register-setup.js"));
100
- const loadListQueryRegistrationModule = createLazyModule(() => import("./register-list-query.js"));
101
- const loadMutationRegistrationModule = createLazyModule(() => import("./register-mutation.js"));
102
- const loadOperationRegistrationModule = createLazyModule(() => import("./register-operations.js"));
103
- /* c8 ignore start */
104
- function renderAttemptedCommand(argv) {
105
- return renderPmCommand(argv);
106
- }
107
- function inferMissingFieldsFromErrorMessage(message) {
108
- const matches = message.match(/--[a-zA-Z0-9][a-zA-Z0-9_-]*/g);
109
- if (!matches || matches.length === 0) {
110
- return undefined;
111
- }
112
- /* c8 ignore next */
113
- const normalized = [...new Set(matches.map((entry) => normalizeLongOptionFlag(entry) ?? entry))];
114
- /* c8 ignore next */
115
- return normalized.length > 0 ? normalized : undefined;
116
- }
117
- function inferMissingFieldsForRecovery(rawMessage, invocationArgv, existingRecovery) {
118
- if (existingRecovery?.suggested_retry || rawMessage.includes("failed in extension handler (") || !/\b(?:missing|required|requires)\b/i.test(rawMessage)) {
119
- return undefined;
120
- }
121
- const providedFields = extractProvidedOptionFlags(invocationArgv);
122
- const providedSet = new Set(providedFields.map((flag) => normalizeLongOptionFlag(flag) ?? flag));
123
- const rawInferred = inferMissingFieldsFromErrorMessage(rawMessage);
124
- const commandName = invocationArgv.find((token) => program.commands.some((candidate) => candidate.name() === token));
125
- const command = commandName ? program.commands.find((candidate) => candidate.name() === commandName) : undefined;
126
- const declaredFlags = new Set([...program.options, ...(command?.options ?? [])].flatMap((option) => option.flags
127
- .split(/[ ,|]+/)
128
- .map((flag) => normalizeLongOptionFlag(flag))
129
- .filter((flag) => flag !== undefined)));
130
- const trulyMissing = rawInferred?.filter((flag) => {
131
- const normalized = normalizeLongOptionFlag(flag) ?? flag;
132
- if (providedSet.has(normalized)) {
133
- return false;
134
- }
135
- return declaredFlags.has(normalized) || extensionFlagTakesValueForInvocation(invocationArgv, commandName, normalized, activeRuntimeExtensionCommandDescriptors) !== undefined;
136
- });
137
- return trulyMissing && trulyMissing.length > 0 ? trulyMissing : undefined;
138
- }
139
- function resolveRecoverySuggestedRetry(invocationArgv, attemptedCommand, inferredMissing, existingRecovery) {
140
- if (existingRecovery?.suggested_retry) {
141
- return existingRecovery.suggested_retry;
142
- }
143
- const missingFlag = inferredMissing?.[0];
144
- const normalizedMissing = missingFlag ? normalizeLongOptionFlag(missingFlag) : undefined;
145
- const commandName = invocationArgv.find((token) => program.commands.some((candidate) => candidate.name() === token));
146
- const command = commandName ? program.commands.find((candidate) => candidate.name() === commandName) : undefined;
147
- const missingOption = normalizedMissing ? command?.options.find((option) => option.flags.split(/[ ,|]+/).includes(normalizedMissing)) : undefined;
148
- const extensionFlagTakesValue = extensionFlagTakesValueForInvocation(invocationArgv, commandName, normalizedMissing, activeRuntimeExtensionCommandDescriptors);
149
- const missingTokens = normalizedMissing ? (missingOption?.isBoolean() === true || extensionFlagTakesValue === false ? [normalizedMissing] : [normalizedMissing, "<value>"]) : [];
150
- const suggestedRetry = normalizedMissing ? renderAttemptedCommand([...invocationArgv, ...missingTokens]) : attemptedCommand;
151
- return suggestedRetry === attemptedCommand ? undefined : suggestedRetry;
152
- }
153
- function projectExistingRecoveryOptionalFields(existingRecovery) {
154
- if (!existingRecovery) {
155
- return {};
156
- }
157
- const optionalFields = [
158
- "recovery_mode",
159
- "missing_required_fields",
160
- "suggested_flags",
161
- "suggested_retry_args",
162
- "allowed_values",
163
- "candidate_commands",
164
- "candidate_commands_total",
165
- "candidate_commands_truncated",
166
- "fallback_candidates",
167
- "next_best_command",
168
- ];
169
- const projected = {};
170
- for (const field of optionalFields) {
171
- const value = existingRecovery[field];
172
- if (value !== undefined && value !== null) {
173
- projected[field] = value;
174
- }
175
- }
176
- return projected;
177
- }
178
- function buildRecoveryPayload(params) {
179
- const existingRecovery = params.existingRecovery;
180
- return {
181
- attempted_command: existingRecovery?.attempted_command ?? params.attemptedCommand,
182
- normalized_args: existingRecovery?.normalized_args ?? [...params.invocationArgv],
183
- /* c8 ignore next */
184
- provided_fields: existingRecovery?.provided_fields ?? (params.providedFields.length > 0 ? params.providedFields : undefined),
185
- missing: existingRecovery?.missing ?? params.inferredMissing,
186
- ...projectExistingRecoveryOptionalFields(existingRecovery),
187
- ...(params.suggestedRetry ? { suggested_retry: params.suggestedRetry } : {}),
188
- };
189
- }
190
- function buildPmCliRecoveryContext(context, invocationArgv, rawMessage) {
191
- const safeInvocationArgv = redactSensitiveCommandArgs(invocationArgv);
192
- const explainRequested = safeInvocationArgv.includes("--explain");
193
- const rawExistingRecovery = context?.recovery;
194
- const existingRecovery = rawExistingRecovery && safeInvocationArgv.includes("history-redact")
195
- ? {
196
- ...rawExistingRecovery,
197
- ...(rawExistingRecovery.attempted_command ? { attempted_command: renderAttemptedCommand(safeInvocationArgv) } : {}),
198
- ...(rawExistingRecovery.normalized_args ? { normalized_args: [...safeInvocationArgv] } : {}),
199
- ...(rawExistingRecovery.suggested_retry ? { suggested_retry: renderAttemptedCommand(safeInvocationArgv) } : {}),
200
- ...(rawExistingRecovery.suggested_retry_args ? { suggested_retry_args: [...safeInvocationArgv] } : {}),
201
- }
202
- : rawExistingRecovery;
203
- if (existingRecovery?.recovery_mode === "compact" && !explainRequested) {
204
- return {
205
- /* c8 ignore next */
206
- ...context,
207
- recovery: existingRecovery,
208
- };
209
- }
210
- const attemptedCommand = renderAttemptedCommand(safeInvocationArgv);
211
- const providedFields = extractProvidedOptionFlags(safeInvocationArgv);
212
- const inferredMissing = inferMissingFieldsForRecovery(rawMessage, safeInvocationArgv, existingRecovery);
213
- const suggestedRetry = resolveRecoverySuggestedRetry(safeInvocationArgv, attemptedCommand, inferredMissing, existingRecovery);
214
- const recovery = buildRecoveryPayload({
215
- invocationArgv: safeInvocationArgv,
216
- attemptedCommand,
217
- providedFields,
218
- inferredMissing,
219
- suggestedRetry,
220
- existingRecovery,
221
- });
222
- return {
223
- ...context,
224
- recovery,
225
- };
226
- }
227
- /* c8 ignore stop */
228
- function readRecordString(record, ...keys) {
229
- if (!record) {
230
- return undefined;
231
- }
232
- for (const key of keys) {
233
- const candidate = record[key];
234
- if (typeof candidate === "string") {
235
- const normalized = candidate.trim();
236
- if (normalized.length > 0) {
237
- return normalized;
238
- }
239
- }
240
- }
241
- return undefined;
242
- }
243
- function readRecordBoolean(record, ...keys) {
244
- if (!record) {
245
- return undefined;
246
- }
247
- for (const key of keys) {
248
- const candidate = record[key];
249
- if (typeof candidate === "boolean") {
250
- return candidate;
251
- }
252
- }
253
- return undefined;
254
- }
255
- function readRecordNumber(record, ...keys) {
256
- if (!record) {
257
- return undefined;
258
- }
259
- for (const key of keys) {
260
- const candidate = record[key];
261
- if (typeof candidate === "number" && Number.isFinite(candidate)) {
262
- return Math.max(0, Math.trunc(candidate));
263
- }
264
- }
265
- return undefined;
266
- }
267
- function normalizeTelemetryCommandResolution(value) {
268
- if (!value) {
269
- return undefined;
270
- }
271
- const normalized = value.trim().toLowerCase();
272
- if (!TELEMETRY_COMMAND_RESOLUTION_SET.has(normalized)) {
273
- return undefined;
274
- }
275
- return normalized;
276
- }
277
- function normalizeTelemetryResolutionStage(value) {
278
- if (!value) {
279
- return undefined;
280
- }
281
- const normalized = value.trim().toLowerCase();
282
- if (!TELEMETRY_RESOLUTION_STAGE_SET.has(normalized)) {
283
- return undefined;
284
- }
285
- return normalized;
286
- }
287
- function normalizeTelemetryErrorCategory(value) {
288
- if (!value) {
289
- return undefined;
290
- }
291
- const normalized = value.trim().toLowerCase();
292
- if (!TELEMETRY_ERROR_CATEGORY_SET.has(normalized)) {
293
- return undefined;
294
- }
295
- return normalized;
296
- }
297
- /* c8 ignore start */
298
- function inferPostActionFailureMessage(result) {
299
- const explicit = readRecordString(result, "error", "message");
300
- if (explicit) {
301
- return explicit;
302
- }
303
- const warnings = result?.warnings;
304
- if (Array.isArray(warnings)) {
305
- const firstWarning = warnings.find((value) => typeof value === "string" && value.trim().length > 0);
306
- /* c8 ignore next */
307
- if (typeof firstWarning === "string") {
308
- return firstWarning.trim();
309
- }
310
- }
311
- const skippedTriggered = readRecordBoolean(result, "fail_on_skipped_triggered", "failOnSkippedTriggered");
312
- if (skippedTriggered) {
313
- return "linked_test_fail_on_skipped_triggered";
314
- }
315
- const failedCount = readRecordNumber(result, "failed");
316
- if (typeof failedCount === "number" && failedCount > 0) {
317
- return `failed_runs:${failedCount}`;
318
- }
319
- const runResults = result?.run_results;
320
- if (Array.isArray(runResults)) {
321
- const failedRuns = runResults.filter((entry) => {
322
- const row = asRecordOrNull(entry);
323
- return row?.status === "failed";
324
- }).length;
325
- /* c8 ignore next */
326
- if (failedRuns > 0) {
327
- return `failed_runs:${failedRuns}`;
328
- }
329
- }
330
- return undefined;
331
- }
332
- /* c8 ignore stop */
333
- function inferPostActionErrorCode(ok, exitCode) {
334
- if (ok) {
335
- return undefined;
336
- }
337
- if (exitCode === EXIT_CODE.USAGE) {
338
- return "invalid_command_usage";
339
- }
340
- if (exitCode === EXIT_CODE.NOT_FOUND) {
341
- return "item_not_found";
342
- }
343
- if (exitCode === EXIT_CODE.CONFLICT) {
344
- return "lock_conflict";
345
- }
346
- if (exitCode === EXIT_CODE.DEPENDENCY_FAILED) {
347
- return "dependency_failed";
348
- }
349
- return "command_failed";
350
- }
351
- function buildPostActionTelemetryOutcome() {
352
- const result = asRecordOrNull(getActiveCommandResult());
353
- const processExitCode = typeof process.exitCode === "number" && Number.isFinite(process.exitCode) ? Math.max(0, Math.trunc(process.exitCode)) : undefined;
354
- const resultExitCode = readRecordNumber(result, "exit_code", "exitCode");
355
- const exitCode = processExitCode ?? resultExitCode ?? EXIT_CODE.SUCCESS;
356
- const ok = isPmSuccessfulExitCode(exitCode);
357
- const errorCode = readRecordString(result, "error_code", "errorCode") ?? inferPostActionErrorCode(ok, exitCode);
358
- const errorCategory = normalizeTelemetryErrorCategory(readRecordString(result, "error_category", "errorCategory")) ?? (!ok ? resolveTelemetryErrorCategory(errorCode) : undefined);
359
- const errorMessage = !ok ? (inferPostActionFailureMessage(result) ?? `command_exit_${exitCode}`) : undefined;
360
- const commandResolution = normalizeTelemetryCommandResolution(readRecordString(result, "command_resolution", "commandResolution")) ??
361
- deriveTelemetryCommandResolution({
362
- ok,
363
- errorCode,
364
- errorCategory,
365
- });
366
- const resolutionStage = normalizeTelemetryResolutionStage(readRecordString(result, "resolution_stage", "resolutionStage")) ?? "execute";
367
- return {
368
- ok,
369
- error: errorMessage,
370
- exit_code: exitCode,
371
- error_code: errorCode,
372
- error_category: errorCategory,
373
- command_resolution: commandResolution,
374
- resolution_stage: resolutionStage,
375
- };
376
- }
377
- /* c8 ignore start */
378
- async function runAndClearAfterCommandHooks(outcome) {
379
- const telemetryRuntime = activeTelemetryCommandContext;
380
- activeTelemetryCommandContext = null;
381
- await finishActiveTelemetryCommand(telemetryRuntime, outcome);
382
- const runtime = activeExtensionHookContext;
383
- activeExtensionHookContext = null;
384
- if (!runtime) {
385
- clearActiveExtensionHooks();
386
- return;
387
- }
388
- let hookWarnings = [];
389
- const affected = consumeAfterCommandAffectedItems();
390
- try {
391
- await recordAfterCommandContextUsage({
392
- pmRoot: runtime.pmRoot,
393
- author: runtime.globalOptions.author,
394
- itemIds: outcome.ok ? (affected?.map((item) => item.id) ?? []) : [],
395
- intent: runtime.commandName,
396
- });
397
- }
398
- catch {
399
- hookWarnings.push("context_usage_feedback_write_failed");
400
- }
401
- try {
402
- hookWarnings.push(...(await runAfterCommandHooks(runtime.hooks, {
403
- command: runtime.commandName,
404
- args: runtime.commandArgs,
405
- options: { ...runtime.commandOptions },
406
- global: { ...runtime.globalOptions },
407
- pm_root: runtime.pmRoot,
408
- ok: outcome.ok,
409
- error: outcome.error,
410
- result: getActiveCommandResult(),
411
- affected,
412
- })));
413
- }
414
- catch (error) {
415
- /* c8 ignore next */
416
- const message = error instanceof Error ? error.message : String(error);
417
- hookWarnings = [`afterCommand hooks failed: ${message}`];
418
- }
419
- finally {
420
- clearActiveExtensionHooks();
421
- }
422
- if (!runtime.globalOptions.json && hookWarnings.length > 0) {
423
- printError(`[pm] warning: afterCommand hook_warnings=${formatHookWarnings(hookWarnings)}`);
424
- }
425
- if (runtime.profileEnabled && hookWarnings.length > 0) {
426
- printError(`profile:extensions hook_warnings=${formatHookWarnings(hookWarnings)}`);
427
- }
428
- }
429
- async function ensureSentryForErrorReporting() {
430
- await ensureSentryInit();
431
- }
432
- function envFlagEnabled(key) {
433
- return TRUE_LIKE_ENV_VALUES.has((process.env[key] ?? "").trim().toLowerCase());
434
- }
435
- function shouldLogHandledErrorToSentry(exitCode) {
436
- if (envFlagEnabled("PM_SENTRY_CAPTURE_EXPECTED_ERRORS")) {
437
- return true;
438
- }
439
- return !EXPECTED_HANDLED_ERROR_EXIT_CODES.has(Math.trunc(exitCode));
440
- }
441
- async function maybeLogHandledCliErrorToSentry(params) {
442
- if (!shouldLogHandledErrorToSentry(params.exit_code)) {
443
- return false;
444
- }
445
- await ensureSentryForErrorReporting();
446
- sentryLogCliUsageError(params);
447
- return true;
448
- }
449
- async function handleGenericRunPmCliError(params) {
450
- const message = describeUnknownError(params.error);
451
- const classification = classifyUnknownError(message);
452
- if (params.bootstrapGlobal.json) {
453
- printError(JSON.stringify(formatUnknownErrorForJson(message, EXIT_CODE.GENERIC_FAILURE), null, 2));
454
- }
455
- else {
456
- printError(message);
457
- }
458
- process.exitCode = EXIT_CODE.GENERIC_FAILURE;
459
- let errorCategory = "runtime";
460
- let commandResolution = "runtime_failed";
461
- try {
462
- await ensureSentryForErrorReporting();
463
- sentryCaptureCliError(params.error);
464
- const telemetry = await params.emitTelemetryCommandError({
465
- command: params.attemptedCommand,
466
- errorCode: classification.code,
467
- errorMessage: classification.detail,
468
- exitCode: EXIT_CODE.GENERIC_FAILURE,
469
- options: {
470
- bootstrap_global_options: params.bootstrapGlobal,
471
- },
472
- resolutionStage: "execute",
473
- });
474
- errorCategory = telemetry.errorCategory;
475
- commandResolution = telemetry.commandResolution;
476
- sentryFinishCommandSpan(false, message, {
477
- error_code: classification.code,
478
- error_category: errorCategory,
479
- exit_code: EXIT_CODE.GENERIC_FAILURE,
480
- command_resolution: commandResolution,
481
- resolution_stage: "execute",
482
- });
483
- }
484
- catch (reportingError) {
485
- /* c8 ignore next */
486
- if (!params.bootstrapGlobal.json) {
487
- printError(`Failed to report error: ${describeUnknownError(reportingError)}`);
488
- }
489
- }
490
- try {
491
- await runAndClearAfterCommandHooks({
492
- ok: false,
493
- error: message,
494
- exit_code: EXIT_CODE.GENERIC_FAILURE,
495
- error_code: classification.code,
496
- error_category: errorCategory,
497
- command_resolution: commandResolution,
498
- resolution_stage: "execute",
499
- });
500
- }
501
- catch (hookError) {
502
- /* c8 ignore next */
503
- if (!params.bootstrapGlobal.json) {
504
- printError(`Failed to run error hooks: ${describeUnknownError(hookError)}`);
505
- }
506
- }
507
- try {
508
- await sentryFlush();
509
- }
510
- catch (flushError) {
511
- /* c8 ignore next */
512
- if (!params.bootstrapGlobal.json) {
513
- printError(`Failed to flush error reporting: ${describeUnknownError(flushError)}`);
514
- }
515
- }
516
- }
517
- /**
518
- * Hand canonical `--output-include` projection modes to the command that owns
519
- * them, leaving only field selectors for post-execution projection.
520
- *
521
- * `--output-include brief` must be the exact behaviour of `--brief`, which the
522
- * emitted migration hint promises; a mode can only be honoured before the
523
- * command computes its rows, so it cannot be resolved by the output layer.
524
- */
525
- function forwardReadOutputIncludeModes(actionCommand, commandPath, globalOptions, commandOptions) {
526
- recordCliReadOutputInvocationProvenance(actionCommand, commandPath, commandOptions);
527
- const requested = globalOptions.outputInclude;
528
- if (requested === undefined)
529
- return;
530
- const { selectors, modes } = applyReadOutputIncludeModes(commandPath, requested, commandOptions);
531
- if (commandPath === "get" && typeof commandOptions.fields === "string") {
532
- actionCommand.setOptionValueWithSource("fields", commandOptions.fields, "cli");
533
- }
534
- if (modes.length === 0)
535
- return;
536
- copyReadOutputInvocationProvenance(commandOptions, actionCommand);
537
- const modeOptions = readOutputIncludeModeOptions(commandPath);
538
- for (const mode of modes) {
539
- const key = modeOptions.get(mode);
540
- const value = commandOptions[key];
541
- actionCommand.setOptionValueWithSource(key, value, "cli");
542
- }
543
- const residual = selectors.length > 0 ? selectors.join(",") : undefined;
544
- if (residual === undefined) {
545
- delete globalOptions.outputInclude;
546
- }
547
- else {
548
- globalOptions.outputInclude = residual;
549
- }
550
- // The resolved-global cache is cleared and re-read from Commander before the
551
- // handler runs, so the consumed modes have to leave the parsed option too.
552
- for (let scope = actionCommand; scope; scope = scope.parent) {
553
- scope.setOptionValueWithSource("outputInclude", residual, "cli");
554
- }
555
- setResolvedGlobalOptions(actionCommand, globalOptions);
556
- }
557
- function extractCommandScopedOptions(command, commandArgs, extensionFlagDefinitions = []) {
558
- const allOptions = command.optsWithGlobals();
559
- const scoped = { ...allOptions };
560
- copyReadOutputInvocationProvenance(command, scoped);
561
- delete scoped.json;
562
- delete scoped.quiet;
563
- delete scoped.path;
564
- delete scoped.pmPath;
565
- delete scoped.noExtensions;
566
- delete scoped.extensions;
567
- delete scoped.profile;
568
- delete scoped.pager;
569
- // Global output controls must not leak into per-command mutation fields.
570
- delete scoped.changedFields;
571
- delete scoped.fullChangedFields;
572
- delete scoped.idOnly;
573
- delete scoped.lean;
574
- delete scoped.tokenAccounting;
575
- delete scoped.outputInclude;
576
- delete scoped.outputLimit;
577
- delete scoped.outputBudget;
578
- delete scoped.outputFormat;
579
- delete scoped.outputSession;
580
- const looseOptions = parseLooseCommandOptions(commandArgs);
581
- for (const [key, value] of Object.entries(looseOptions)) {
582
- /* c8 ignore next */
583
- if (scoped[key] === undefined) {
584
- scoped[key] = value;
585
- }
586
- }
587
- if (extensionFlagDefinitions.length > 0) {
588
- const extensionOptionKeys = collectLooseCommandOptionKeysForDefinitions(extensionFlagDefinitions);
589
- const coreFlagDefinitions = resolveSubcommandFlagContractsForCommand(getCommandPath(command)).map((contract) => ({
590
- long: contract.flag,
591
- short: contract.short,
592
- aliases: contract.aliases,
593
- }));
594
- const optionsToValidate = { ...looseOptions };
595
- for (const key of extensionOptionKeys) {
596
- /* c8 ignore next */
597
- if (scoped[key] !== undefined) {
598
- optionsToValidate[key] = scoped[key];
599
- }
600
- }
601
- validateLooseCommandOptionsWithFlagDefinitions(optionsToValidate, [...coreFlagDefinitions, ...extensionFlagDefinitions], getCommandPath(command));
602
- return coerceLooseCommandOptionsWithFlagDefinitions(scoped, extensionFlagDefinitions, looseOptions);
603
- }
604
- return scoped;
605
- }
606
- /* c8 ignore stop */
607
- function collectExtensionFlagDefinitionsForCommand(registrations, commandPath) {
608
- const normalizedCommandPath = normalizeExtensionCommandPath(commandPath);
609
- if (normalizedCommandPath.length === 0) {
610
- return [];
611
- }
612
- return registrations.flags.filter((entry) => normalizeExtensionCommandPath(entry.target_command) === normalizedCommandPath).flatMap((entry) => entry.flags);
613
- }
614
- function collectExtensionFlagDefinitionsForInvocation(registrations, commandPath, commandArgs) {
615
- const exact = collectExtensionFlagDefinitionsForCommand(registrations, commandPath);
616
- const pathParts = [commandPath];
617
- let nestedMatch = [];
618
- for (const arg of commandArgs) {
619
- if (arg.startsWith("-")) {
620
- break;
621
- }
622
- pathParts.push(arg);
623
- const nested = collectExtensionFlagDefinitionsForCommand(registrations, pathParts.join(" "));
624
- if (nested.length > 0) {
625
- nestedMatch = nested;
626
- }
627
- }
628
- return nestedMatch.length > 0 ? nestedMatch : exact;
629
- }
630
- function dynamicCommandArguments(descriptor) {
631
- return descriptor.arguments ?? [];
632
- }
633
- function formatDynamicCommandUsage(descriptor) {
634
- const argumentSuffix = dynamicCommandArguments(descriptor)
635
- .map((argument) => {
636
- const label = argument.variadic ? `${argument.name}...` : argument.name;
637
- return argument.required ? `<${label}>` : `[${label}]`;
638
- })
639
- .join(" ");
640
- return `pm ${descriptor.command}${argumentSuffix ? ` ${argumentSuffix}` : ""}`;
641
- }
642
- /**
643
- * Reports whether {@link commandPath} is the generated command path of a
644
- * registered importer (`<name> import`) or exporter (`<name> export`). Importers
645
- * and exporters read/write a source/destination via flags and take no positional
646
- * operand, so an unexpected positional is a usage error; free-form
647
- * `registerCommand` commands intentionally accept positionals via `context.args`
648
- * and are excluded.
649
- */
650
- function isImporterOrExporterCommandPath(registrations, commandPath) {
651
- if (!registrations) {
652
- return false;
653
- }
654
- const normalized = normalizeExtensionCommandPath(commandPath);
655
- return (registrations.importers.some((entry) => normalizeExtensionCommandPath(`${entry.importer} import`) === normalized) ||
656
- registrations.exporters.some((entry) => normalizeExtensionCommandPath(`${entry.exporter} export`) === normalized));
657
- }
658
- function validateDynamicExtensionCommandArgs(descriptor, args) {
659
- const descriptorArguments = dynamicCommandArguments(descriptor);
660
- const requiredCount = descriptorArguments.filter((argument) => argument.required).length;
661
- const variadic = descriptorArguments.some((argument) => argument.variadic);
662
- const maxCount = variadic ? Number.POSITIVE_INFINITY : descriptorArguments.length;
663
- const failureHints = descriptor.failure_hints ?? [];
664
- const hintSuffix = failureHints.length > 0 ? ` ${failureHints.join(" ")}` : "";
665
- if (args.length < requiredCount) {
666
- throw new PmCliError(`Missing required argument for extension command '${descriptor.command}'. Usage: ${formatDynamicCommandUsage(descriptor)}${hintSuffix}`, EXIT_CODE.USAGE);
667
- }
668
- if (args.length > maxCount) {
669
- const extra = args.slice(maxCount).join(" ");
670
- throw new PmCliError(`Too many arguments for extension command '${descriptor.command}': ${extra}. Usage: ${formatDynamicCommandUsage(descriptor)}${hintSuffix}`, EXIT_CODE.USAGE);
671
- }
672
- }
673
- function formatDynamicOptionFlag(optionKey) {
674
- return `--${optionKey
675
- .replace(/([a-z0-9])([A-Z])/g, "$1-$2")
676
- .replace(/_/g, "-")
677
- .toLowerCase()}`;
678
- }
679
- function validateDynamicExtensionCommandOptions(descriptor, options, extensionFlagDefinitions) {
680
- if (extensionFlagDefinitions.length > 0) {
681
- validateLooseCommandOptionsWithFlagDefinitions(options, extensionFlagDefinitions, descriptor.command);
682
- return;
683
- }
684
- const unknownOptions = Object.keys(options)
685
- .filter((key) => options[key] !== undefined)
686
- .sort();
687
- if (unknownOptions.length === 0) {
688
- return;
689
- }
690
- throw new PmCliError(`Unknown option '${unknownOptions.map(formatDynamicOptionFlag).join(", ")}' for extension command '${descriptor.command}'. This command does not define extension flags.`, EXIT_CODE.USAGE);
691
- }
692
- function validateDynamicExtensionCommandInvocation(descriptor, args, options, extensionFlagDefinitions) {
693
- if (!descriptor) {
694
- return;
695
- }
696
- validateDynamicExtensionCommandArgs(descriptor, args);
697
- validateDynamicExtensionCommandOptions(descriptor, options, extensionFlagDefinitions);
698
- }
699
- const RUNTIME_FIELD_COMMAND_BY_COMMAND_PATH = {
700
- create: "create",
701
- update: "update",
702
- "update-many": "update_many",
703
- list: "list",
704
- "list-all": "list",
705
- "list-draft": "list",
706
- "list-open": "list",
707
- "list-in-progress": "list",
708
- "list-blocked": "list",
709
- "list-closed": "list",
710
- "list-canceled": "list",
711
- search: "search",
712
- calendar: "calendar",
713
- context: "context",
714
- "templates save": "create",
715
- };
716
- const runtimeFieldLooseFlagDefinitionCache = new Map();
717
- function toLooseFieldDefinitionType(fieldType) {
718
- if (fieldType === "number") {
719
- return "number";
720
- }
721
- if (fieldType === "boolean") {
722
- return "boolean";
723
- }
724
- return "string";
725
- }
726
- function commandHasLongOption(command, longFlag) {
727
- return command.options.some((option) => option.long === longFlag);
728
- }
729
- function commandHasShortOption(command, shortFlag) {
730
- return command.options.some((option) => option.short === shortFlag);
731
- }
732
- function addRuntimeFieldOption(command, flagToken, description, repeatable) {
733
- const normalizedToken = flagToken.trim();
734
- if (!normalizedToken) {
735
- return;
736
- }
737
- const helpText = description.length > 0 ? description : `Runtime schema field (${flagToken})`;
738
- if (normalizedToken.startsWith("-") && !normalizedToken.startsWith("--")) {
739
- if (commandHasShortOption(command, normalizedToken)) {
740
- return;
741
- }
742
- if (repeatable) {
743
- command.option(`${normalizedToken} <value>`, `${helpText} (repeatable)`, collect);
744
- return;
745
- }
746
- command.option(`${normalizedToken} <value>`, helpText);
747
- return;
748
- }
749
- const longFlag = normalizedToken.startsWith("--") ? normalizedToken : `--${normalizedToken}`;
750
- if (commandHasLongOption(command, longFlag)) {
751
- return;
752
- }
753
- if (repeatable) {
754
- command.option(`${longFlag} <value>`, `${helpText} (repeatable)`, collect);
755
- return;
756
- }
757
- command.option(`${longFlag} <value>`, helpText);
758
- }
759
- async function collectRuntimeFieldLooseFlagDefinitionsForCommand(commandPath, pmRoot) {
760
- const runtimeCommand = RUNTIME_FIELD_COMMAND_BY_COMMAND_PATH[commandPath];
761
- if (!runtimeCommand) {
762
- return [];
763
- }
764
- const cacheKey = `${pmRoot}:${runtimeCommand}`;
765
- const cached = runtimeFieldLooseFlagDefinitionCache.get(cacheKey);
766
- if (cached) {
767
- return cached;
768
- }
769
- if (!(await pathExists(getSettingsPath(pmRoot)))) {
770
- runtimeFieldLooseFlagDefinitionCache.set(cacheKey, []);
771
- return [];
772
- }
773
- const settings = await readSettings(pmRoot);
774
- const fieldRegistry = resolveRuntimeFieldRegistry(settings.schema);
775
- const definitions = (fieldRegistry.command_to_fields.get(runtimeCommand) ?? []).flatMap((field) => {
776
- const flagTokens = [field.cli_flag, ...field.cli_aliases];
777
- return flagTokens.map((token) => ({
778
- long: `--${token}`,
779
- type: toLooseFieldDefinitionType(field.type),
780
- value_type: toLooseFieldDefinitionType(field.type),
781
- }));
782
- });
783
- runtimeFieldLooseFlagDefinitionCache.set(cacheKey, definitions);
784
- return definitions;
785
- }
786
- async function registerRuntimeSchemaFieldFlags(rootProgram, invocationArgv) {
787
- const bootstrapGlobalOptions = parseBootstrapGlobalOptions(invocationArgv);
788
- const pmRoot = resolvePmRoot(process.cwd(), bootstrapGlobalOptions.path);
789
- if (!(await pathExists(getSettingsPath(pmRoot)))) {
790
- return;
791
- }
792
- const cachedDiscovery = runtimeExtensionDiscoverySnapshotCache?.key === buildRuntimeExtensionDiscoverySnapshotCacheKey(pmRoot) ? runtimeExtensionDiscoverySnapshotCache.snapshot : null;
793
- const settings = cachedDiscovery === null ? await readSettings(pmRoot) : cachedDiscovery.settings;
794
- const fieldRegistry = resolveRuntimeFieldRegistry(settings.schema);
795
- const mappings = [
796
- { path: "create", command: "create" },
797
- { path: "update", command: "update" },
798
- { path: "update-many", command: "update_many" },
799
- { path: "list", command: "list" },
800
- { path: "list-all", command: "list" },
801
- { path: "list-draft", command: "list" },
802
- { path: "list-open", command: "list" },
803
- { path: "list-in-progress", command: "list" },
804
- { path: "list-blocked", command: "list" },
805
- { path: "list-closed", command: "list" },
806
- { path: "list-canceled", command: "list" },
807
- { path: "search", command: "search" },
808
- { path: "calendar", command: "calendar" },
809
- { path: "context", command: "context" },
810
- { path: "templates save", command: "create" },
811
- ];
812
- for (const mapping of mappings) {
813
- const command = findCommandByPath(rootProgram, mapping.path.split(" "));
814
- if (!command) {
815
- continue;
816
- }
817
- for (const field of fieldRegistry.command_to_fields.get(mapping.command) ?? []) {
818
- const description = field.description ?? "";
819
- addRuntimeFieldOption(command, field.cli_flag, description, field.repeatable);
820
- for (const alias of field.cli_aliases) {
821
- addRuntimeFieldOption(command, alias, `Alias for --${field.cli_flag}`, field.repeatable);
822
- }
823
- }
824
- }
825
- }
826
- async function maybeAttachCreateUpdatePolicyHelpText(rootProgram, pmRoot, invocationArgv, registrations, settings) {
827
- const bootstrapCommand = parseBootstrapCommandName(invocationArgv);
828
- if (bootstrapCommand !== "create" && bootstrapCommand !== "update") {
829
- return;
830
- }
831
- try {
832
- const resolvedSettings = settings ?? (await readSettings(pmRoot));
833
- const typeRegistry = resolveItemTypeRegistry(resolvedSettings, registrations);
834
- attachCreateUpdatePolicyHelpText(rootProgram, typeRegistry, invocationArgv);
835
- }
836
- catch {
837
- // Help should remain available even when settings cannot be read.
838
- }
839
- }
840
- function defaultPreflightDecision() {
841
- return {
842
- enforce_item_format_gate: true,
843
- run_preflight_item_format_sync: true,
844
- run_extension_migrations: true,
845
- enforce_mandatory_migration_gate: true,
846
- };
847
- }
848
- function buildRuntimeExtensionSnapshotCacheKey(pmRoot, activationScope = "all") {
849
- return activationScope === "all" ? `pm-root:${pmRoot}` : `pm-root:${pmRoot}:activation:${activationScope}`;
850
- }
851
- function bootstrapProfileEnabled(invocationArgv) {
852
- return invocationArgv.some((token) => token === "--profile");
853
- }
854
- function buildRuntimeExtensionDiscoverySnapshotCacheKey(pmRoot) {
855
- return `pm-root:${pmRoot}`;
856
- }
857
- function collectLeadingCommandArgs(commandArgs) {
858
- const leading = [];
859
- for (const arg of commandArgs ?? []) {
860
- if (arg.startsWith("-")) {
861
- break;
862
- }
863
- const normalized = normalizeExtensionCommandPath(arg);
864
- if (normalized.length === 0) {
865
- continue;
866
- }
867
- leading.push(normalized);
868
- }
869
- return leading;
870
- }
871
- /* c8 ignore start */
872
- function collectActivationCommandCandidates(probe) {
873
- /* c8 ignore next */
874
- const commandPath = normalizeExtensionCommandPath(probe.commandPath ?? "");
875
- if (commandPath.length === 0) {
876
- return [];
877
- }
878
- const candidates = [commandPath];
879
- const parts = commandPath.split(" ").filter((part) => part.length > 0);
880
- for (const arg of collectLeadingCommandArgs(probe.commandArgs)) {
881
- parts.push(...arg.split(" ").filter((part) => part.length > 0));
882
- candidates.push(parts.join(" "));
883
- }
884
- return [...new Set(candidates)];
885
- }
886
- function activationCommandMatchesProbe(command, probe) {
887
- const normalized = normalizeExtensionCommandPath(command);
888
- if (normalized.length === 0) {
889
- return false;
890
- }
891
- const candidates = collectActivationCommandCandidates(probe);
892
- for (const candidate of candidates) {
893
- if (candidate === normalized || candidate.startsWith(`${normalized} `)) {
894
- return true;
895
- }
896
- }
897
- if (probe.allowCommandPrefixMatch === true) {
898
- return candidates.some((candidate) => normalized.startsWith(`${candidate} `));
899
- }
900
- return false;
901
- }
902
- function extensionActivationCommands(extension) {
903
- const explicitCommands = extension.activation?.commands;
904
- if (explicitCommands) {
905
- return explicitCommands;
906
- }
907
- const contributions = extension.contributions;
908
- if (!contributions) {
909
- return [];
910
- }
911
- return [
912
- ...entriesOrEmpty(contributions.commands),
913
- ...entriesOrEmpty(contributions.command_handlers),
914
- ...entriesOrEmpty(contributions.command_overrides),
915
- ...entriesOrEmpty(contributions.flag_commands),
916
- ...entriesOrEmpty(contributions.parser_overrides),
917
- ...ownershipCommands(contributions.preflight_ownership),
918
- ...ownershipCommands(contributions.renderer_ownership),
919
- ];
920
- }
921
- function entriesOrEmpty(entries) {
922
- return entries ?? [];
923
- }
924
- function ownershipCommands(entries) {
925
- return entriesOrEmpty(entries).flatMap((entry) => entry.commands);
926
- }
927
- function extensionCapabilities(extension) {
928
- /* c8 ignore next */
929
- return new Set((extension.capabilities ?? []).map((capability) => capability.trim().toLowerCase()));
930
- }
931
- const GLOBAL_EXTENSION_ACTIVATION_CAPABILITIES = new Set(["hooks", "parser", "preflight", "renderers"]);
932
- // Capabilities that register command handlers whose names are not statically
933
- // known without declared `activation.commands`, so the extension must activate
934
- // for any command probe. `importers`/`exporters` register their import/export as
935
- // command handlers, so they belong here alongside commands/schema/services.
936
- const CONSERVATIVE_EXTENSION_ACTIVATION_CAPABILITIES = new Set(["commands", "schema", "services", "importers"]);
937
- const SEARCH_EXTENSION_ACTIVATION_COMMANDS = new Set(["reindex", "search", "search-advanced"]);
938
- const CREATE_TEMPLATE_FLAGS = new Set(["--template"]);
939
- function hasAnyCapability(capabilities, expected) {
940
- for (const capability of expected) {
941
- if (capabilities.has(capability)) {
942
- return true;
943
- }
944
- }
945
- return false;
946
- }
947
- function commandPathNeedsSearchExtensions(commandPath) {
948
- const normalized = normalizeExtensionCommandPath(commandPath ?? "");
949
- if (normalized.length === 0) {
950
- return false;
951
- }
952
- const [topLevel] = normalized.split(" ");
953
- /* c8 ignore next */
954
- return SEARCH_EXTENSION_ACTIVATION_COMMANDS.has(topLevel ?? normalized);
955
- }
956
- function probeUsesAnyFlag(probe, flags) {
957
- /* c8 ignore next */
958
- for (const arg of probe.commandArgs ?? []) {
959
- if (!arg.startsWith("--")) {
960
- continue;
961
- }
962
- const [flagName] = arg.split("=", 1);
963
- if (flags.has(flagName)) {
964
- return true;
965
- }
966
- }
967
- return false;
968
- }
969
- /* c8 ignore stop */
970
- function commandPathNeedsTemplateExtensions(probe) {
971
- return normalizeExtensionCommandPath(probe.commandPath ?? "") === "create" && probeUsesAnyFlag(probe, CREATE_TEMPLATE_FLAGS);
972
- }
973
- function extensionProvidesTemplatesRuntime(commands) {
974
- return commands.some((command) => {
975
- const normalized = normalizeExtensionCommandPath(command);
976
- return normalized === "templates" || normalized.startsWith("templates ");
977
- });
978
- }
979
- /** Match direct command paths plus the built-in create-template bridge. */
980
- function matchesStaticExtensionCommand(commands, probe) {
981
- return commands.some((command) => activationCommandMatchesProbe(command, probe)) || (commandPathNeedsTemplateExtensions(probe) && extensionProvidesTemplatesRuntime(commands));
982
- }
983
- /** Identify contribution surfaces that participate in global runtime behavior. */
984
- function hasGlobalExtensionContributions(contributions) {
985
- const contributionCounts = [
986
- entriesOrEmpty(contributions.hooks).length,
987
- (contributions.preflight_overrides ?? 0) - entriesOrEmpty(contributions.preflight_ownership).length,
988
- entriesOrEmpty(contributions.item_types).length,
989
- entriesOrEmpty(contributions.item_fields).length,
990
- entriesOrEmpty(contributions.relationship_kinds).length,
991
- entriesOrEmpty(contributions.service_overrides).length,
992
- entriesOrEmpty(contributions.assurance_providers).length,
993
- entriesOrEmpty(contributions.renderer_overrides).length - entriesOrEmpty(contributions.renderer_ownership).length,
994
- ];
995
- return contributionCounts.some((count) => count > 0);
996
- }
997
- /** Resolve an exact activation verdict from declared commands and contributions. */
998
- function resolveStaticExtensionActivationDecision(extension, probe) {
999
- const explicitCommands = extension.activation?.commands ?? [];
1000
- if (explicitCommands.length > 0) {
1001
- return matchesStaticExtensionCommand(explicitCommands, probe);
1002
- }
1003
- const commands = extensionActivationCommands(extension);
1004
- if (matchesStaticExtensionCommand(commands, probe))
1005
- return true;
1006
- if (extensionCapabilities(extension).has("search") && commandPathNeedsSearchExtensions(probe.commandPath)) {
1007
- return true;
1008
- }
1009
- if (extension.contributions) {
1010
- return hasGlobalExtensionContributions(extension.contributions);
1011
- }
1012
- return undefined;
1013
- }
1014
- function extensionNeedsActivationForProbe(extension, probe) {
1015
- const staticDecision = resolveStaticExtensionActivationDecision(extension, probe);
1016
- if (staticDecision !== undefined)
1017
- return staticDecision;
1018
- const capabilities = extensionCapabilities(extension);
1019
- if (hasAnyCapability(capabilities, GLOBAL_EXTENSION_ACTIVATION_CAPABILITIES)) {
1020
- return true;
1021
- }
1022
- // Without declared activation commands the contributed command names are
1023
- // unknown, so any command-bearing capability (commands/schema/services and
1024
- // importers/exporters, all of which register command handlers) must activate
1025
- // for the probe — the invoked command could be one it registers. Activation
1026
- // stays lazy once the extension declares `activation.commands` (handled by the
1027
- // exact-match path above).
1028
- if (hasAnyCapability(capabilities, CONSERVATIVE_EXTENSION_ACTIVATION_CAPABILITIES)) {
1029
- return true;
1030
- }
1031
- return false;
1032
- }
1033
- function discoveryNeedsActivationForProbe(discovery, probe) {
1034
- if (discovery.effective.length === 0) {
1035
- return false;
1036
- }
1037
- const hasCommandProbe = normalizeExtensionCommandPath(probe.commandPath ?? "").length > 0;
1038
- if (!hasCommandProbe) {
1039
- return discovery.effective.some((extension) => {
1040
- const capabilities = extensionCapabilities(extension);
1041
- return (extensionActivationCommands(extension).length > 0 ||
1042
- hasAnyCapability(capabilities, GLOBAL_EXTENSION_ACTIVATION_CAPABILITIES) ||
1043
- hasAnyCapability(capabilities, CONSERVATIVE_EXTENSION_ACTIVATION_CAPABILITIES) ||
1044
- capabilities.has("search"));
1045
- });
1046
- }
1047
- return discovery.effective.some((extension) => extensionNeedsActivationForProbe(extension, probe));
1048
- }
1049
- function buildRuntimeExtensionActivationScope(probe) {
1050
- const commandPath = collectActivationCommandCandidates(probe)
1051
- .filter((candidate) => candidate.split(" ").every((part) => !part.startsWith("-")))
1052
- .sort((left, right) => right.length - left.length)[0] ?? normalizeExtensionCommandPath(probe.commandPath ?? "");
1053
- if (commandPath.length === 0) {
1054
- return "all";
1055
- }
1056
- const args = commandPathNeedsTemplateExtensions(probe) ? "--template" : "";
1057
- const prefix = probe.allowCommandPrefixMatch === true ? "prefix" : "exact";
1058
- return `${prefix}:${commandPath}:${args}`;
1059
- }
1060
- function buildRuntimeExtensionFilterForProbe(probe) {
1061
- return buildRuntimeExtensionActivationScope(probe) === "all" ? undefined : (extension) => extensionNeedsActivationForProbe(extension, probe);
1062
- }
1063
- function buildBootstrapActivationProbe(invocationArgv) {
1064
- const helpRequest = parseBootstrapHelpRequest(invocationArgv);
1065
- if (helpRequest.requested && helpRequest.commandPathTokens.length > 0) {
1066
- const [commandPath, ...commandArgs] = helpRequest.commandPathTokens;
1067
- return {
1068
- commandPath,
1069
- commandArgs,
1070
- allowCommandPrefixMatch: true,
1071
- };
1072
- }
1073
- const stripped = stripGlobalBootstrapTokens(invocationArgv);
1074
- const commandIndex = stripped.findIndex((token) => token.trim().length > 0 && !token.startsWith("-"));
1075
- if (commandIndex < 0) {
1076
- return {};
1077
- }
1078
- return {
1079
- commandPath: stripped[commandIndex],
1080
- commandArgs: stripped.slice(commandIndex + 1),
1081
- allowCommandPrefixMatch: helpRequest.requested,
1082
- };
1083
- }
1084
- /* c8 ignore start */
1085
- function collectParsedActivationCommandArgs(command) {
1086
- const commandArgs = command.args.map(String);
1087
- const commandPath = normalizeExtensionCommandPath(getCommandPath(command));
1088
- if (commandPath === "create") {
1089
- const options = command.optsWithGlobals();
1090
- /* c8 ignore next */
1091
- if (typeof options.template === "string" && options.template.trim().length > 0) {
1092
- commandArgs.push("--template");
1093
- }
1094
- }
1095
- return commandArgs;
1096
- }
1097
- /* c8 ignore stop */
1098
- /** 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. */
1099
- function emitSettingsReadWarnings(warnings) {
1100
- for (const warning of warnings) {
1101
- if (warning.startsWith("settings_read_")) {
1102
- printError(`[pm] warning: ${warning} — settings.json could not be loaded and pm fell back to defaults; run pm health for remediation.`);
1103
- }
1104
- }
1105
- }
1106
- function emitExtensionProfile(globalOptions, snapshot) {
1107
- if (!globalOptions.profile) {
1108
- return;
1109
- }
1110
- 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}`);
1111
- if (snapshot.activationWarnings.length > 0) {
1112
- printError(`profile:extensions activation_warnings=${formatHookWarnings(snapshot.activationWarnings)}`);
1113
- }
1114
- }
1115
- function emitExtensionSkippedProfile(profileEnabled, snapshot, probe) {
1116
- if (!profileEnabled) {
1117
- return;
1118
- }
1119
- const command = normalizeExtensionCommandPath(probe.commandPath ?? "") || "<none>";
1120
- printError(`profile:extensions activation=skipped command=${command} effective=${snapshot.discovery.effective.length} warnings=${snapshot.discovery.warnings.length} discovery_ms=${snapshot.discoveryMs}`);
1121
- }
1122
- async function loadRuntimeExtensionDiscoverySnapshot(pmRoot, readSettingsWithMetadataFn = readSettingsWithMetadata) {
1123
- const cacheKey = buildRuntimeExtensionDiscoverySnapshotCacheKey(pmRoot);
1124
- if (runtimeExtensionDiscoverySnapshotCache?.key === cacheKey) {
1125
- return runtimeExtensionDiscoverySnapshotCache.snapshot;
1126
- }
1127
- try {
1128
- const startedAt = Date.now();
1129
- const { settings, warnings: settingsReadWarnings } = await readSettingsWithMetadataFn(pmRoot);
1130
- const discovery = await discoverExtensions({
1131
- pmRoot,
1132
- settings,
1133
- cwd: process.cwd(),
1134
- noExtensions: false,
1135
- });
1136
- const snapshot = {
1137
- pmRoot,
1138
- settings,
1139
- discovery,
1140
- discoveryMs: Date.now() - startedAt,
1141
- settingsReadWarnings: [...settingsReadWarnings],
1142
- };
1143
- runtimeExtensionDiscoverySnapshotCache = {
1144
- key: cacheKey,
1145
- snapshot,
1146
- };
1147
- return snapshot;
1148
- }
1149
- catch {
1150
- runtimeExtensionDiscoverySnapshotCache = {
1151
- key: cacheKey,
1152
- snapshot: null,
1153
- };
1154
- return null;
1155
- }
1156
- }
1157
- async function loadRuntimeExtensionSnapshot(pmRoot, probe, readSettingsFn = readSettings) {
1158
- const activationScope = probe ? buildRuntimeExtensionActivationScope(probe) : "all";
1159
- const cacheKey = buildRuntimeExtensionSnapshotCacheKey(pmRoot, activationScope);
1160
- if (runtimeExtensionSnapshotCache?.key === cacheKey) {
1161
- return runtimeExtensionSnapshotCache.snapshot;
1162
- }
1163
- try {
1164
- const settings = await readSettingsFn(pmRoot);
1165
- const loadResult = await loadExtensions({
1166
- pmRoot,
1167
- settings,
1168
- cwd: process.cwd(),
1169
- noExtensions: false,
1170
- extensionFilter: probe ? buildRuntimeExtensionFilterForProbe(probe) : undefined,
1171
- });
1172
- const activationResult = await activateExtensions({
1173
- ...loadResult,
1174
- loaded: loadResult.loaded,
1175
- });
1176
- const commandHandlers = [...new Set(activationResult.commands.handlers.map((entry) => normalizeExtensionCommandPath(entry.command)))]
1177
- .filter((entry) => entry.length > 0)
1178
- .sort((left, right) => left.localeCompare(right));
1179
- const commandFlagHelp = collectDynamicExtensionFlagHelpByCommand(activationResult.registrations.flags);
1180
- const canonicalAliases = buildCanonicalExtensionAliases(activationResult.commands.handlers, activationResult.registrations.commands);
1181
- const commandDescriptors = collectExtensionCommandHelpDescriptors(commandHandlers, activationResult.registrations.commands, activationResult.registrations.flags, canonicalAliases);
1182
- const snapshot = {
1183
- hooks: activationResult.hooks,
1184
- commands: activationResult.commands,
1185
- parsers: activationResult.parsers,
1186
- preflight: activationResult.preflight,
1187
- services: activationResult.services,
1188
- renderers: activationResult.renderers,
1189
- registrations: activationResult.registrations,
1190
- pmRoot,
1191
- settings,
1192
- commandHandlers,
1193
- commandFlagHelp,
1194
- commandDescriptors,
1195
- commandAliases: canonicalAliases,
1196
- loadWarnings: [...loadResult.warnings],
1197
- activationWarnings: [...activationResult.warnings],
1198
- loadedCount: loadResult.loaded.length,
1199
- loadFailedCount: loadResult.failed.length,
1200
- activationFailedCount: activationResult.failed.length,
1201
- contextIntentPackages: loadResult.loaded.map(({ name, module }) => ({
1202
- name,
1203
- module,
1204
- })),
1205
- };
1206
- runtimeExtensionSnapshotCache = {
1207
- key: cacheKey,
1208
- snapshot,
1209
- };
1210
- return snapshot;
1211
- }
1212
- catch {
1213
- runtimeExtensionSnapshotCache = {
1214
- key: cacheKey,
1215
- snapshot: null,
1216
- };
1217
- return null;
1218
- }
1219
- }
1220
- /* c8 ignore start */
1221
- async function maybeLoadRuntimeExtensions(command) {
1222
- const globalOptions = getGlobalOptions(command);
1223
- if (globalOptions.noExtensions) {
1224
- // Extensions are disabled, so the discovery snapshot that normally carries
1225
- // the settings-read warnings is skipped. Surface them directly here (a single
1226
- // read on this uncommon path) so `pm --no-extensions <cmd>` — the common safe
1227
- // mode — still reports a corrupt settings.json instead of silently running on
1228
- // defaults.
1229
- const noExtPmRoot = resolvePmRoot(process.cwd(), globalOptions.path);
1230
- if (await pathExists(getSettingsPath(noExtPmRoot))) {
1231
- emitSettingsReadWarnings((await readSettingsWithMetadata(noExtPmRoot)).warnings);
1232
- }
1233
- return null;
1234
- }
1235
- const pmRoot = resolvePmRoot(process.cwd(), globalOptions.path);
1236
- const discoverySnapshot = await loadRuntimeExtensionDiscoverySnapshot(pmRoot);
1237
- if (!discoverySnapshot) {
1238
- return null;
1239
- }
1240
- // Surface actionable settings-read warnings once per command, before the
1241
- // activation-skipped fast path returns, so create/list/search/... all report a
1242
- // corrupt settings.json instead of silently running on defaults.
1243
- emitSettingsReadWarnings(discoverySnapshot.settingsReadWarnings);
1244
- const probe = {
1245
- commandPath: getCommandPath(command),
1246
- commandArgs: collectParsedActivationCommandArgs(command),
1247
- };
1248
- if (!discoveryNeedsActivationForProbe(discoverySnapshot.discovery, probe)) {
1249
- emitExtensionSkippedProfile(globalOptions.profile, discoverySnapshot, probe);
1250
- return null;
1251
- }
1252
- const snapshot = await loadRuntimeExtensionSnapshot(pmRoot, probe);
1253
- /* c8 ignore next */
1254
- if (!snapshot) {
1255
- return null;
1256
- }
1257
- emitExtensionProfile(globalOptions, snapshot);
1258
- return {
1259
- hooks: snapshot.hooks,
1260
- commands: snapshot.commands,
1261
- parsers: snapshot.parsers,
1262
- preflight: snapshot.preflight,
1263
- services: snapshot.services,
1264
- renderers: snapshot.renderers,
1265
- registrations: snapshot.registrations,
1266
- pmRoot,
1267
- };
1268
- }
1269
- /* c8 ignore stop */
1270
- async function loadRuntimeExtensionCommandDescriptorsForRecovery(pmRoot) {
1271
- const snapshot = await loadRuntimeExtensionSnapshot(pmRoot);
1272
- return snapshot ? new Map(snapshot.commandDescriptors) : activeRuntimeExtensionCommandDescriptors;
1273
- }
1274
- async function executeRegisteredRuntimeMigrations(migrations, pmRoot) {
1275
- const result = await runExtensionMigrations({
1276
- pmRoot,
1277
- migrations,
1278
- author: "pm-extension-migration",
1279
- });
1280
- return result.migrations
1281
- .filter((migration) => migration.outcome === "failed")
1282
- .map((migration) => `extension_migration_failed:${migration.layer}:${migration.extension}:${migration.id}`);
1283
- }
1284
- /* c8 ignore start */
1285
- /** Build one host-bound extension SDK using the command's resolved author. */
1286
- function buildExtensionCommandSdk(pmRoot, global) {
1287
- const author = typeof global.author === "string" && global.author.trim() ? global.author.trim() : "pm-extension";
1288
- return createExtensionCommandSdk(pmRoot, PmClient.forActiveExtensionHost({ pmRoot, author }));
1289
- }
1290
- async function runRequiredExtensionCommand(command, options, globalOptions, extensionFlagDefinitions = []) {
1291
- const commandPath = getCommandPath(command);
1292
- let commandArgs = stripLooseCommandOptionTokens(command.args.map(String), extensionFlagDefinitions);
1293
- let commandOptions = { ...options };
1294
- let resolvedGlobalOptions = { ...globalOptions };
1295
- const pmRoot = resolvePmRoot(process.cwd(), globalOptions.path);
1296
- const parserOverride = await runActiveParserOverride({
1297
- command: commandPath,
1298
- args: commandArgs,
1299
- options: commandOptions,
1300
- global: resolvedGlobalOptions,
1301
- pm_root: pmRoot,
1302
- });
1303
- if (globalOptions.profile && parserOverride.warnings.length > 0) {
1304
- printError(`profile:extensions parser_warnings=${formatHookWarnings(parserOverride.warnings)}`);
1305
- }
1306
- commandArgs = parserOverride.context.args;
1307
- commandOptions = parserOverride.context.options;
1308
- resolvedGlobalOptions = parserOverride.context.global;
1309
- validateDynamicExtensionCommandInvocation(activeRuntimeExtensionCommandDescriptors.get(normalizeExtensionCommandPath(commandPath)), commandArgs, commandOptions, extensionFlagDefinitions);
1310
- setActiveCommandResult(undefined);
1311
- setActiveCommandContext({
1312
- command: commandPath,
1313
- args: commandArgs,
1314
- options: { ...commandOptions },
1315
- global: { ...resolvedGlobalOptions },
1316
- pm_root: pmRoot,
1317
- });
1318
- const extensionCommandResult = await runActiveCommandHandler({
1319
- command: commandPath,
1320
- args: commandArgs,
1321
- options: commandOptions,
1322
- global: resolvedGlobalOptions,
1323
- pm_root: pmRoot,
1324
- sdk: buildExtensionCommandSdk(pmRoot, resolvedGlobalOptions),
1325
- });
1326
- if (resolvedGlobalOptions.profile && extensionCommandResult.warnings.length > 0) {
1327
- printError(`profile:extensions command_handler_warnings=${formatHookWarnings(extensionCommandResult.warnings)}`);
1328
- }
1329
- if (!extensionCommandResult.handled) {
1330
- if (extensionCommandResult.warnings.length > 0) {
1331
- const warningCode = extensionCommandResult.warnings[0];
1332
- const cause = extensionCommandResult.errorMessage?.trim();
1333
- /* c8 ignore next */
1334
- const causeSuffix = cause ? ` ${cause}` : "";
1335
- throw new PmCliError(`Command "${commandPath}" failed in extension handler (${warningCode}).${causeSuffix}`, EXIT_CODE.GENERIC_FAILURE, {
1336
- code: extensionCommandResult.errorCode ?? "command_failed",
1337
- nextSteps: extensionCommandResult.remediation ? [extensionCommandResult.remediation] : undefined,
1338
- });
1339
- }
1340
- throw new PmCliError(`Command "${commandPath}" is provided by extensions and is not currently available.`, EXIT_CODE.NOT_FOUND);
1341
- }
1342
- if (extensionCommandResult.exitCode !== undefined) {
1343
- process.exitCode = extensionCommandResult.exitCode;
1344
- }
1345
- setActiveCommandResult(extensionCommandResult.result);
1346
- return extensionCommandResult.result;
1347
- }
1348
- const WRAPPED_ACTION_HANDLER = Symbol("pm.wrappedActionHandler");
1349
- function resolveActionCommand(actionArgs, fallback) {
1350
- const possibleCommand = actionArgs[actionArgs.length - 1];
1351
- /* c8 ignore next */
1352
- return possibleCommand instanceof Command ? possibleCommand : fallback;
1353
- }
1354
- function maybePrintExtensionProfileWarnings(enabled, label, warnings) {
1355
- if (enabled && warnings.length > 0) {
1356
- printError(`profile:extensions ${label}=${formatHookWarnings(warnings)}`);
1357
- }
1358
- }
1359
- function validateDynamicInvocationArgs(params) {
1360
- const dynamicDescriptor = activeRuntimeExtensionCommandDescriptors.get(normalizeExtensionCommandPath(params.commandPath));
1361
- if (!dynamicDescriptor || !isImporterOrExporterCommandPath(params.activeRegistrations, params.commandPath)) {
1362
- return;
1363
- }
1364
- const positionalArgs = dynamicCommandArguments(dynamicDescriptor).length === 0
1365
- ? collectLoosePositionalArgs(params.commandArgs)
1366
- : stripLooseCommandOptionTokens(params.commandArgs, params.extensionFlagDefinitions);
1367
- validateDynamicExtensionCommandArgs(dynamicDescriptor, positionalArgs);
1368
- }
1369
- function syncCommanderActionArgs(actionCommand, actionArgs, commandArgs) {
1370
- actionCommand.args = [...commandArgs];
1371
- /* c8 ignore next */
1372
- if ("_processArguments" in actionCommand && typeof actionCommand._processArguments === "function") {
1373
- actionCommand._processArguments();
1374
- }
1375
- /* c8 ignore next */
1376
- if (actionArgs.length > 0 && Array.isArray(actionArgs[0])) {
1377
- actionArgs[0] = [...actionCommand.processedArgs];
1378
- }
1379
- }
1380
- function wrapProgramActionsForExtensionHandlers(rootProgram) {
1381
- const visit = (entry) => {
1382
- const actionEntry = entry;
1383
- if (typeof actionEntry._actionHandler === "function" && actionEntry[WRAPPED_ACTION_HANDLER] !== true) {
1384
- const originalAction = actionEntry._actionHandler;
1385
- actionEntry._actionHandler = async function wrappedActionHandler(...actionArgs) {
1386
- const actionCommand = resolveActionCommand(actionArgs, entry);
1387
- const startedAt = Date.now();
1388
- clearResolvedGlobalOptions(actionCommand);
1389
- let globalOptions = getGlobalOptions(actionCommand);
1390
- const commandPath = getCommandPath(actionCommand);
1391
- const pmRoot = resolvePmRoot(process.cwd(), globalOptions.path);
1392
- let commandArgs = actionCommand.args.map(String);
1393
- const activeRegistrations = getActiveExtensionRegistrations();
1394
- const extensionFlagDefinitions = activeRegistrations ? collectExtensionFlagDefinitionsForInvocation(activeRegistrations, commandPath, commandArgs) : [];
1395
- const runtimeFieldFlagDefinitions = await collectRuntimeFieldLooseFlagDefinitionsForCommand(commandPath, pmRoot);
1396
- let commandOptions = extractCommandScopedOptions(actionCommand, commandArgs, [...extensionFlagDefinitions, ...runtimeFieldFlagDefinitions]);
1397
- const parserOverride = await runActiveParserOverride({
1398
- command: commandPath,
1399
- args: commandArgs,
1400
- options: commandOptions,
1401
- global: globalOptions,
1402
- pm_root: pmRoot,
1403
- });
1404
- maybePrintExtensionProfileWarnings(globalOptions.profile, "parser_warnings", parserOverride.warnings);
1405
- commandArgs = parserOverride.context.args;
1406
- commandOptions = parserOverride.context.options;
1407
- globalOptions = parserOverride.context.global;
1408
- // Validate importer/exporter positionals on the real dispatch path:
1409
- // these short-circuit before the dynamic action that previously held the
1410
- // only arity validation, so excess positionals could reach handlers.
1411
- // Free-form `registerCommand` commands intentionally accept positionals
1412
- // via context.args, and core commands have no descriptor.
1413
- validateDynamicInvocationArgs({
1414
- activeRegistrations,
1415
- commandPath,
1416
- commandArgs,
1417
- extensionFlagDefinitions,
1418
- });
1419
- globalOptions = await applyDefaultOutputFormat(globalOptions);
1420
- setResolvedGlobalOptions(actionCommand, globalOptions);
1421
- syncCommanderActionArgs(actionCommand, actionArgs, commandArgs);
1422
- syncCommanderActionOptions(actionCommand, commandOptions);
1423
- setActiveCommandResult(undefined);
1424
- setActiveCommandContext({
1425
- command: commandPath,
1426
- args: commandArgs,
1427
- options: { ...commandOptions },
1428
- global: { ...globalOptions },
1429
- pm_root: pmRoot,
1430
- });
1431
- const extensionCommandResult = await runActiveCommandHandler({
1432
- command: commandPath,
1433
- args: commandArgs,
1434
- options: commandOptions,
1435
- global: globalOptions,
1436
- pm_root: pmRoot,
1437
- sdk: buildExtensionCommandSdk(pmRoot, globalOptions),
1438
- });
1439
- maybePrintExtensionProfileWarnings(globalOptions.profile, "command_handler_warnings", extensionCommandResult.warnings);
1440
- if (extensionCommandResult.handled) {
1441
- setActiveCommandResult(extensionCommandResult.result);
1442
- printResult(extensionCommandResult.result, {
1443
- ...globalOptions,
1444
- command: commandPath,
1445
- commandArgs,
1446
- commandOptions,
1447
- pmRoot,
1448
- });
1449
- if (globalOptions.profile) {
1450
- printError(`profile:command=${commandPath} took_ms=${Date.now() - startedAt}`);
1451
- }
1452
- return;
1453
- }
1454
- return await originalAction.apply(this, actionArgs);
1455
- };
1456
- actionEntry[WRAPPED_ACTION_HANDLER] = true;
1457
- }
1458
- for (const child of entry.commands) {
1459
- visit(child);
1460
- }
1461
- };
1462
- visit(rootProgram);
1463
- }
1464
- /* c8 ignore stop */
1465
- async function clearDynamicExtensionCommandState(params) {
1466
- activeRuntimeExtensionCommandDescriptors = new Map();
1467
- setActiveExtensionServices({ overrides: [] });
1468
- if (params) {
1469
- await maybeAttachCreateUpdatePolicyHelpText(params.rootProgram, params.pmRoot, params.invocationArgv, createEmptyExtensionRegistrationRegistry(), params.settings);
1470
- }
1471
- }
1472
- /* v8 ignore start -- dynamic help fallback variants are exercised through registration integration tests; residual legacy branches are defensive */
1473
- function attachDynamicExtensionHelp(command, descriptor, flagHelp, metadataHelp) {
1474
- if (descriptor?.flags && descriptor.flags.length > 0) {
1475
- applyDynamicExtensionFlagOptions(command, descriptor.flags);
1476
- const residualFlagHelp = buildResidualDynamicExtensionFlagHelp(command, descriptor.flags);
1477
- if (residualFlagHelp) {
1478
- command.addHelpText("after", residualFlagHelp);
1479
- }
1480
- }
1481
- else if (flagHelp) {
1482
- command.addHelpText("after", flagHelp);
1483
- }
1484
- if (metadataHelp) {
1485
- command.addHelpText("after", metadataHelp);
1486
- }
1487
- }
1488
- /* v8 ignore stop */
1489
- /* c8 ignore start */
1490
- /** Apply descendant-derived visibility to every generated extension namespace. */
1491
- function applyDynamicExtensionRootHelpVisibility(rootProgram, preexistingTopLevelCommands, descriptors) {
1492
- const tierRank = { core: 0, standard: 1, full: 2, internal: 3 };
1493
- const applyVisibility = (command, pathParts) => {
1494
- const commandPath = pathParts.join(" ");
1495
- const matchingDescriptors = [...descriptors.entries()].filter(([path]) => path === commandPath || path.startsWith(`${commandPath} `)).map(([, descriptor]) => descriptor);
1496
- const tier = matchingDescriptors.length === 0
1497
- ? "standard"
1498
- : matchingDescriptors.reduce((selected, descriptor) => (tierRank[descriptor.tier] < tierRank[selected] ? descriptor.tier : selected), "internal");
1499
- setPmCommandHelpVisibilityTier(command, tier);
1500
- for (const child of command.commands) {
1501
- applyVisibility(child, [...pathParts, child.name()]);
1502
- }
1503
- };
1504
- for (const command of rootProgram.commands) {
1505
- if (!preexistingTopLevelCommands.has(command.name())) {
1506
- applyVisibility(command, [command.name()]);
1507
- }
1508
- }
1509
- }
1510
- async function registerDynamicExtensionCommandPaths(rootProgram, invocationArgv) {
1511
- const bootstrapGlobalOptions = parseBootstrapGlobalOptions(invocationArgv);
1512
- const pmRoot = resolvePmRoot(process.cwd(), bootstrapGlobalOptions.path);
1513
- if (bootstrapGlobalOptions.noExtensions) {
1514
- await clearDynamicExtensionCommandState({
1515
- rootProgram,
1516
- pmRoot,
1517
- invocationArgv,
1518
- });
1519
- return;
1520
- }
1521
- const discoverySnapshot = await loadRuntimeExtensionDiscoverySnapshot(pmRoot);
1522
- const probe = buildBootstrapActivationProbe(invocationArgv);
1523
- if (!discoverySnapshot) {
1524
- await clearDynamicExtensionCommandState();
1525
- return;
1526
- }
1527
- if (!discoveryNeedsActivationForProbe(discoverySnapshot.discovery, probe)) {
1528
- await clearDynamicExtensionCommandState({
1529
- rootProgram,
1530
- pmRoot,
1531
- invocationArgv,
1532
- settings: discoverySnapshot.settings,
1533
- });
1534
- emitExtensionSkippedProfile(bootstrapProfileEnabled(invocationArgv), discoverySnapshot, probe);
1535
- return;
1536
- }
1537
- const snapshot = await loadRuntimeExtensionSnapshot(pmRoot, probe);
1538
- /* c8 ignore next */
1539
- if (!snapshot) {
1540
- await clearDynamicExtensionCommandState({
1541
- rootProgram,
1542
- pmRoot,
1543
- invocationArgv,
1544
- settings: discoverySnapshot.settings,
1545
- });
1546
- return;
1547
- }
1548
- // Ensure usage/help/error formatting overrides are available even when parse
1549
- // errors occur before preAction hooks initialize full runtime extension state.
1550
- setActiveExtensionServices(snapshot.services);
1551
- activeRuntimeExtensionCommandDescriptors = new Map(snapshot.commandDescriptors);
1552
- await maybeAttachCreateUpdatePolicyHelpText(rootProgram, pmRoot, invocationArgv, snapshot.registrations, snapshot.settings);
1553
- const commandPaths = collectSafeExtensionCommandPaths(rootProgram, snapshot.commandHandlers, snapshot.commandDescriptors, snapshot.commandAliases, (warning) => reportExtensionCommandCollision(snapshot.activationWarnings, printError, warning));
1554
- const preexistingTopLevelCommands = new Set(rootProgram.commands.map((command) => command.name()));
1555
- const registerCommandPath = (commandPath) => {
1556
- const pathParts = commandPath.split(" ").filter((part) => part.length > 0);
1557
- const descriptor = snapshot.commandDescriptors.get(commandPath);
1558
- const existingCommand = findCommandByPath(rootProgram, pathParts);
1559
- const flagHelp = snapshot.commandFlagHelp.get(commandPath);
1560
- const metadataHelp = descriptor ? buildDynamicExtensionCommandMetadataHelp(descriptor) : null;
1561
- if (existingCommand) {
1562
- attachDynamicExtensionHelp(existingCommand, descriptor, flagHelp, metadataHelp);
1563
- return;
1564
- }
1565
- // Empty command paths were removed above, so ensureCommandPath cannot return null.
1566
- const dynamicCommand = ensureCommandPath(rootProgram, pathParts);
1567
- if (descriptor?.description) {
1568
- dynamicCommand.description(descriptor.description);
1569
- }
1570
- let residualDynamicFlagHelp = flagHelp;
1571
- if (descriptor) {
1572
- applyDynamicExtensionArguments(dynamicCommand, descriptor);
1573
- if (descriptor.flags.length > 0) {
1574
- applyDynamicExtensionFlagOptions(dynamicCommand, descriptor.flags);
1575
- residualDynamicFlagHelp = buildResidualDynamicExtensionFlagHelp(dynamicCommand, descriptor.flags) ?? undefined;
1576
- }
1577
- }
1578
- if (residualDynamicFlagHelp) {
1579
- dynamicCommand.addHelpText("after", residualDynamicFlagHelp);
1580
- }
1581
- if (metadataHelp) {
1582
- dynamicCommand.addHelpText("after", metadataHelp);
1583
- }
1584
- dynamicCommand
1585
- .allowUnknownOption(true)
1586
- .allowExcessArguments(true)
1587
- .action(async (...actionArgs) => {
1588
- const maybeCommand = actionArgs[actionArgs.length - 1];
1589
- /* c8 ignore next */
1590
- const command = maybeCommand instanceof Command ? maybeCommand : dynamicCommand;
1591
- const globalOptions = getGlobalOptions(command);
1592
- const startedAt = Date.now();
1593
- const extensionFlagDefinitions = collectExtensionFlagDefinitionsForInvocation(snapshot.registrations, commandPath, command.args.map(String));
1594
- const scopedOptions = extractCommandScopedOptions(command, command.args.map(String), extensionFlagDefinitions);
1595
- const result = await runRequiredExtensionCommand(command, scopedOptions, globalOptions, extensionFlagDefinitions);
1596
- await invalidateSearchCachesForMutation(globalOptions, result);
1597
- printResult(result, {
1598
- ...globalOptions,
1599
- command: commandPath,
1600
- commandArgs: command.args.map(String),
1601
- commandOptions: scopedOptions,
1602
- pmRoot,
1603
- });
1604
- if (globalOptions.profile) {
1605
- printError(`profile:command=${commandPath} took_ms=${Date.now() - startedAt}`);
1606
- }
1607
- });
1608
- };
1609
- for (const commandPath of commandPaths) {
1610
- registerCommandPath(commandPath);
1611
- }
1612
- applyDynamicExtensionRootHelpVisibility(rootProgram, preexistingTopLevelCommands, snapshot.commandDescriptors);
1613
- }
1614
- /* c8 ignore stop */
1615
- /* c8 ignore start */
1616
- const CLI_VERSION = resolvePmCliVersion(import.meta.url, ["../.."]) ?? "0.0.0";
1617
- /* c8 ignore stop */
1618
- let program = createPmCliProgram(CLI_VERSION);
1619
- /* c8 ignore start */
1620
- function attachProgramLifecycleHooks(rootProgram) {
1621
- rootProgram.hook("preAction", async (_thisCommand, actionCommand) => {
1622
- activeExtensionHookContext = null;
1623
- activeTelemetryCommandContext = null;
1624
- clearActiveExtensionHooks();
1625
- clearResolvedGlobalOptions(actionCommand);
1626
- const rawGlobalOptions = actionCommand.optsWithGlobals();
1627
- const bootstrapGlobalOptions = getGlobalOptions(actionCommand);
1628
- const commandPath = getCommandPath(actionCommand);
1629
- let commandArgs = actionCommand.args.map(String);
1630
- let commandOptions = extractCommandScopedOptions(actionCommand, commandArgs);
1631
- let globalOptions = { ...bootstrapGlobalOptions };
1632
- validateReadOutputOptions(commandPath, {
1633
- ...commandOptions,
1634
- outputInclude: rawGlobalOptions.outputInclude,
1635
- outputLimit: rawGlobalOptions.outputLimit,
1636
- outputBudget: rawGlobalOptions.outputBudget,
1637
- outputFormat: rawGlobalOptions.outputFormat,
1638
- outputSession: rawGlobalOptions.outputSession,
1639
- outputCursor: rawGlobalOptions.outputCursor,
1640
- });
1641
- forwardReadOutputIncludeModes(actionCommand, commandPath, globalOptions, commandOptions);
1642
- await maybeRunFirstUseTelemetryPrompt(commandPath, globalOptions);
1643
- const fallbackPmRoot = resolvePmRoot(process.cwd(), bootstrapGlobalOptions.path);
1644
- const runtimeExtensions = await maybeLoadRuntimeExtensions(actionCommand);
1645
- if (!runtimeExtensions) {
1646
- activeExtensionHookContext = createCoreCommandHookContext({
1647
- commandName: commandPath,
1648
- commandArgs,
1649
- commandOptions,
1650
- globalOptions,
1651
- pmRoot: fallbackPmRoot,
1652
- });
1653
- activeTelemetryCommandContext = await startTelemetryCommand({
1654
- command: commandPath,
1655
- pm_version: CLI_VERSION,
1656
- args: commandArgs,
1657
- options: commandOptions,
1658
- global: globalOptions,
1659
- pm_root: fallbackPmRoot,
1660
- });
1661
- sentrySetCommandContext(commandPath, commandArgs, commandOptions, {
1662
- source_context: activeTelemetryCommandContext?.source_context,
1663
- source_context_source: activeTelemetryCommandContext?.source_context_source,
1664
- });
1665
- sentryStartCommandSpan(commandPath);
1666
- await enforceItemFormatWriteGateAndPreflightMigration(commandPath, commandOptions, fallbackPmRoot, defaultPreflightDecision());
1667
- await enforceMutationGuardPreflight(commandPath, commandArgs, commandOptions, globalOptions, fallbackPmRoot);
1668
- return;
1669
- }
1670
- setActiveExtensionHooks(runtimeExtensions.hooks);
1671
- setActiveExtensionCommands(runtimeExtensions.commands);
1672
- setActiveExtensionParsers(runtimeExtensions.parsers);
1673
- setActiveExtensionPreflight(runtimeExtensions.preflight);
1674
- setActiveExtensionServices(runtimeExtensions.services);
1675
- setActiveExtensionRenderers(runtimeExtensions.renderers);
1676
- setActiveExtensionRegistrations(runtimeExtensions.registrations);
1677
- const extensionFlagDefinitions = collectExtensionFlagDefinitionsForInvocation(runtimeExtensions.registrations, commandPath, commandArgs);
1678
- commandOptions = extractCommandScopedOptions(actionCommand, commandArgs, extensionFlagDefinitions);
1679
- forwardReadOutputIncludeModes(actionCommand, commandPath, globalOptions, commandOptions);
1680
- const parserOverride = await runActiveParserOverride({
1681
- command: commandPath,
1682
- args: commandArgs,
1683
- options: commandOptions,
1684
- global: globalOptions,
1685
- pm_root: runtimeExtensions.pmRoot,
1686
- });
1687
- /* c8 ignore next */
1688
- if (globalOptions.profile && parserOverride.warnings.length > 0) {
1689
- printError(`profile:extensions parser_warnings=${formatHookWarnings(parserOverride.warnings)}`);
1690
- }
1691
- commandArgs = parserOverride.context.args;
1692
- commandOptions = parserOverride.context.options;
1693
- globalOptions = parserOverride.context.global;
1694
- syncCommanderActionOptions(actionCommand, commandOptions);
1695
- const preflightOverride = await runActivePreflightOverride({
1696
- command: commandPath,
1697
- args: commandArgs,
1698
- options: commandOptions,
1699
- global: globalOptions,
1700
- pm_root: runtimeExtensions.pmRoot,
1701
- decision: defaultPreflightDecision(),
1702
- });
1703
- /* c8 ignore next */
1704
- if (globalOptions.profile && preflightOverride.warnings.length > 0) {
1705
- printError(`profile:extensions preflight_warnings=${formatHookWarnings(preflightOverride.warnings)}`);
1706
- }
1707
- commandArgs = preflightOverride.context.args;
1708
- commandOptions = preflightOverride.context.options;
1709
- globalOptions = preflightOverride.context.global;
1710
- syncCommanderActionOptions(actionCommand, commandOptions);
1711
- const preflightDecision = preflightOverride.decision;
1712
- await enforceItemFormatWriteGateAndPreflightMigration(commandPath, commandOptions, runtimeExtensions.pmRoot, preflightDecision);
1713
- await enforceMutationGuardPreflight(commandPath, commandArgs, commandOptions, globalOptions, runtimeExtensions.pmRoot);
1714
- /* c8 ignore next */
1715
- const migrationWarnings = preflightDecision.run_extension_migrations
1716
- ? await executeRegisteredRuntimeMigrations(runtimeExtensions.registrations.migrations, runtimeExtensions.pmRoot)
1717
- : [];
1718
- if (globalOptions.profile && migrationWarnings.length > 0) {
1719
- printError(`profile:extensions migration_warnings=${formatHookWarnings(migrationWarnings)}`);
1720
- }
1721
- const migrationBlockers = collectMandatoryMigrationBlockers(runtimeExtensions.registrations.migrations);
1722
- activeExtensionHookContext = {
1723
- hooks: runtimeExtensions.hooks,
1724
- commandName: commandPath,
1725
- commandArgs,
1726
- commandOptions: { ...commandOptions },
1727
- globalOptions: { ...globalOptions },
1728
- pmRoot: runtimeExtensions.pmRoot,
1729
- profileEnabled: Boolean(globalOptions.profile),
1730
- migrationBlockers,
1731
- };
1732
- setActiveCommandResult(undefined);
1733
- setActiveCommandContext({
1734
- command: commandPath,
1735
- args: commandArgs,
1736
- options: { ...commandOptions },
1737
- global: { ...globalOptions },
1738
- pm_root: runtimeExtensions.pmRoot,
1739
- });
1740
- activeTelemetryCommandContext = await startTelemetryCommand({
1741
- command: commandPath,
1742
- pm_version: CLI_VERSION,
1743
- args: commandArgs,
1744
- options: commandOptions,
1745
- global: globalOptions,
1746
- pm_root: runtimeExtensions.pmRoot,
1747
- });
1748
- sentrySetCommandContext(commandPath, commandArgs, commandOptions, {
1749
- source_context: activeTelemetryCommandContext?.source_context,
1750
- source_context_source: activeTelemetryCommandContext?.source_context_source,
1751
- });
1752
- sentryStartCommandSpan(commandPath);
1753
- const hookWarnings = await runBeforeCommandHooks(runtimeExtensions.hooks, {
1754
- command: commandPath,
1755
- args: commandArgs,
1756
- options: { ...commandOptions },
1757
- global: { ...globalOptions },
1758
- pm_root: runtimeExtensions.pmRoot,
1759
- });
1760
- /* c8 ignore next */
1761
- if (globalOptions.profile && hookWarnings.length > 0) {
1762
- printError(`profile:extensions hook_warnings=${formatHookWarnings(hookWarnings)}`);
1763
- }
1764
- /* c8 ignore next */
1765
- if (preflightDecision.enforce_mandatory_migration_gate) {
1766
- enforceMandatoryMigrationWriteGate(commandPath, commandOptions, migrationBlockers);
1767
- }
1768
- });
1769
- /* c8 ignore stop */
1770
- rootProgram.hook("postAction", async () => {
1771
- const outcome = buildPostActionTelemetryOutcome();
1772
- sentryFinishCommandSpan(outcome.ok, outcome.error, {
1773
- error_code: outcome.error_code,
1774
- error_category: outcome.error_category,
1775
- exit_code: outcome.exit_code,
1776
- command_resolution: outcome.command_resolution,
1777
- resolution_stage: outcome.resolution_stage,
1778
- });
1779
- await runAndClearAfterCommandHooks(outcome);
1780
- });
1781
- }
1782
- attachProgramLifecycleHooks(program);
1783
- const VERSION_FLAG_TOKENS = new Set(["--version", "-V"]);
1784
- const SETUP_COMMAND_NAMES = new Set(["config", "extension", "init", "install", "package", "packages", "templates", "upgrade"]);
1785
- const LIST_QUERY_COMMAND_NAMES = new Set([
1786
- "activity",
1787
- "aggregate",
1788
- "context",
1789
- "ctx",
1790
- "events",
1791
- "get",
1792
- "graph",
1793
- "history",
1794
- "list",
1795
- "list-all",
1796
- "list-blocked",
1797
- "list-canceled",
1798
- "list-closed",
1799
- "list-draft",
1800
- "list-in-progress",
1801
- "list-open",
1802
- "search",
1803
- ]);
1804
- const MUTATION_COMMAND_NAMES = new Set([
1805
- "append",
1806
- "close",
1807
- "close-many",
1808
- "comments",
1809
- "delete",
1810
- "deps",
1811
- "discover",
1812
- "docs",
1813
- "files",
1814
- "learnings",
1815
- "notes",
1816
- "plan",
1817
- "restore",
1818
- "update",
1819
- "update-many",
1820
- "create",
1821
- ]);
1822
- const OPERATION_COMMAND_NAMES = new Set([
1823
- "claim",
1824
- "close-task",
1825
- "contracts",
1826
- "duplicates",
1827
- "gc",
1828
- "health",
1829
- "pause-task",
1830
- "release",
1831
- "start-task",
1832
- "stats",
1833
- "test",
1834
- "test-all",
1835
- "test-runs",
1836
- "test-runs-worker",
1837
- "validate",
1838
- ]);
1839
- const MUTATING_OPERATION_COMMAND_NAMES = new Set(["claim", "close-task", "pause-task", "release", "start-task", "test"]);
1840
- const REGISTER_ALL_CORE_COMMAND_FAMILIES = {
1841
- setup: true,
1842
- listQuery: true,
1843
- mutation: true,
1844
- operation: true,
1845
- };
1846
- const RUNTIME_SCHEMA_FLAG_BOOTSTRAP_COMMANDS = new Set([
1847
- "create",
1848
- "update",
1849
- "update-many",
1850
- "list",
1851
- "list-all",
1852
- "list-draft",
1853
- "list-open",
1854
- "list-in-progress",
1855
- "list-blocked",
1856
- "list-closed",
1857
- "list-canceled",
1858
- "search",
1859
- "calendar",
1860
- "context",
1861
- "templates",
1862
- ]);
1863
- function invocationRequestsVersion(invocationArgv) {
1864
- return invocationArgv.some((token) => VERSION_FLAG_TOKENS.has(token));
1865
- }
1866
- function resolveCoreCommandRegistrationSelection(invocationArgv) {
1867
- if (invocationRequestsVersion(invocationArgv)) {
1868
- return {
1869
- setup: false,
1870
- listQuery: false,
1871
- mutation: false,
1872
- operation: false,
1873
- };
1874
- }
1875
- if (invocationArgv.length === 0 || parseBootstrapHelpRequest(invocationArgv).requested) {
1876
- return REGISTER_ALL_CORE_COMMAND_FAMILIES;
1877
- }
1878
- const commandName = parseBootstrapCommandName(invocationArgv);
1879
- if (!commandName) {
1880
- return REGISTER_ALL_CORE_COMMAND_FAMILIES;
1881
- }
1882
- const normalizedCommand = commandName.trim().toLowerCase();
1883
- if (SETUP_COMMAND_NAMES.has(normalizedCommand)) {
1884
- return {
1885
- setup: true,
1886
- listQuery: false,
1887
- mutation: false,
1888
- operation: false,
1889
- targetCommandName: normalizedCommand,
1890
- };
1891
- }
1892
- if (LIST_QUERY_COMMAND_NAMES.has(normalizedCommand)) {
1893
- return {
1894
- setup: false,
1895
- listQuery: true,
1896
- mutation: false,
1897
- operation: false,
1898
- targetCommandName: normalizedCommand,
1899
- };
1900
- }
1901
- if (MUTATION_COMMAND_NAMES.has(normalizedCommand)) {
1902
- return {
1903
- setup: false,
1904
- listQuery: false,
1905
- mutation: true,
1906
- operation: false,
1907
- targetCommandName: normalizedCommand,
1908
- };
1909
- }
1910
- if (OPERATION_COMMAND_NAMES.has(normalizedCommand)) {
1911
- return {
1912
- setup: false,
1913
- listQuery: false,
1914
- mutation: false,
1915
- operation: true,
1916
- targetCommandName: normalizedCommand,
1917
- };
1918
- }
1919
- return REGISTER_ALL_CORE_COMMAND_FAMILIES;
1920
- }
1921
- function shouldAttachRichHelpTextForInvocation(invocationArgv) {
1922
- return (invocationArgv.length === 0 ||
1923
- parseBootstrapHelpRequest(invocationArgv).requested ||
1924
- (invocationArgv.includes("--explain") &&
1925
- parseBootstrapCommandName(invocationArgv) === undefined));
1926
- }
1927
- const IDEMPOTENT_TOP_LEVEL_REGISTRATION = Symbol("pmCliIdempotentTopLevelRegistration");
1928
- /**
1929
- * The root `program` is a module-level singleton. Any path that enters
1930
- * `runPmCli` a second time in the same process (an embedding host, a long-lived
1931
- * plugin runtime, or a retry) re-runs core command registration against it, and
1932
- * Commander throws `cannot add command 'X' as already have command 'X'` on the
1933
- * second pass. That is a raw `Error` (not a `CommandError`), so it escapes the
1934
- * Sentry release-gate CLI-error allowlist and can silently block the daily
1935
- * auto-release (Sentry PM-CLI-1R / pm-zyez — the fragility class pm-nb08 warns
1936
- * about).
1937
- *
1938
- * Make top-level registration idempotent: a duplicate `program.command(name)`
1939
- * returns a throwaway `Command`, so its chained `.argument()/.option()/.action()`
1940
- * builders apply harmlessly while the already-wired original command is
1941
- * preserved. The guard is installed once per program (Symbol flag) and only
1942
- * short-circuits exact duplicates — every first-time registration still flows
1943
- * through Commander untouched.
1944
- */
1945
- function ensureIdempotentTopLevelCommandRegistration(rootProgram) {
1946
- const guarded = rootProgram;
1947
- if (guarded[IDEMPOTENT_TOP_LEVEL_REGISTRATION]) {
1948
- return;
1949
- }
1950
- guarded[IDEMPOTENT_TOP_LEVEL_REGISTRATION] = true;
1951
- const registerOriginalCommand = rootProgram.command.bind(rootProgram);
1952
- rootProgram.command = ((nameAndArgs, ...rest) => {
1953
- const commandName = nameAndArgs.split(/\s+/u)[0];
1954
- // Match Commander's own dedup, which collides on an existing command's name
1955
- // OR any of its aliases, so a re-entrant registration can never reach the
1956
- // raw "cannot add command" throw.
1957
- if (rootProgram.commands.some((existing) => existing.name() === commandName || existing.aliases().includes(commandName))) {
1958
- return new Command(commandName);
1959
- }
1960
- return registerOriginalCommand(nameAndArgs, ...rest);
1961
- });
1962
- }
1963
- async function registerCoreCommandFamilies(rootProgram, selection) {
1964
- ensureIdempotentTopLevelCommandRegistration(rootProgram);
1965
- if (selection.setup) {
1966
- const { registerSetupCommands } = await loadSetupRegistrationModule();
1967
- registerSetupCommands(rootProgram);
1968
- }
1969
- if (selection.listQuery) {
1970
- const { registerListQueryCommands } = await loadListQueryRegistrationModule();
1971
- const commandFilter = typeof selection.targetCommandName === "string" && LIST_QUERY_COMMAND_NAMES.has(selection.targetCommandName) ? new Set([selection.targetCommandName]) : undefined;
1972
- registerListQueryCommands(rootProgram, commandFilter ? { commandFilter } : undefined);
1973
- }
1974
- if (selection.mutation) {
1975
- const { registerMutationCommands } = await loadMutationRegistrationModule();
1976
- registerMutationCommands(rootProgram, {
1977
- targetCommandName: selection.targetCommandName,
1978
- });
1979
- }
1980
- if (selection.operation) {
1981
- const { registerOperationCommands } = await loadOperationRegistrationModule();
1982
- registerOperationCommands(rootProgram);
1983
- }
1984
- }
1985
- function shouldRegisterDynamicExtensionPaths(_rootProgram, invocationArgv) {
1986
- if (invocationRequestsVersion(invocationArgv)) {
1987
- return false;
1988
- }
1989
- if (isFullHelpDiscovery(invocationArgv)) {
1990
- return true;
1991
- }
1992
- const helpRequest = parseBootstrapHelpRequest(invocationArgv);
1993
- if (helpRequest.requested) {
1994
- return true;
1995
- }
1996
- const commandName = parseBootstrapCommandName(invocationArgv);
1997
- if (!commandName) {
1998
- return false;
1999
- }
2000
- return true;
2001
- }
2002
- function shouldRegisterRuntimeSchemaFlags(invocationArgv) {
2003
- if (invocationRequestsVersion(invocationArgv)) {
2004
- return false;
2005
- }
2006
- const commandName = parseBootstrapCommandName(invocationArgv);
2007
- if (!commandName) {
2008
- return false;
2009
- }
2010
- return RUNTIME_SCHEMA_FLAG_BOOTSTRAP_COMMANDS.has(commandName);
2011
- }
2012
- /**
2013
- * Project a typo trace and its canonical target into disclosure-safe source,
2014
- * target, and retry values before they are copied into error diagnostics.
2015
- */
2016
- function redactSensitiveFlagTypo(params) {
2017
- const rawTypoToken = String(params.rawFrom ?? "");
2018
- const rawTypoEqualsIndex = rawTypoToken.indexOf("=");
2019
- const rawTypoFlag = rawTypoEqualsIndex >= 0 ? rawTypoToken.slice(0, rawTypoEqualsIndex) : rawTypoToken;
2020
- const sensitiveCanonicalFlag = params.normalizedTokens
2021
- .map((token) => {
2022
- const equalsIndex = token.indexOf("=");
2023
- return equalsIndex >= 0 ? token.slice(0, equalsIndex) : token;
2024
- })
2025
- .find((token) => token === "--literal" || token === "--regex" || token === "--replacement");
2026
- const typoNormalizedArgv = sensitiveCanonicalFlag
2027
- ? params.argv.map((token) => {
2028
- const equalsIndex = token.indexOf("=");
2029
- const flag = equalsIndex >= 0 ? token.slice(0, equalsIndex) : token;
2030
- return flag === rawTypoFlag ? (equalsIndex >= 0 ? `${sensitiveCanonicalFlag}${token.slice(equalsIndex)}` : sensitiveCanonicalFlag) : token;
2031
- })
2032
- : params.argv;
2033
- const safeArgv = redactSensitiveCommandArgs(typoNormalizedArgv);
2034
- const safeTypoDisplay = sensitiveCanonicalFlag && rawTypoEqualsIndex >= 0 ? `${rawTypoFlag}=[redacted]` : rawTypoToken;
2035
- const safeNormalizedDisplay = sensitiveCanonicalFlag && params.normalizedDisplay.includes("=") ? `${sensitiveCanonicalFlag}=[redacted]` : params.normalizedDisplay;
2036
- return {
2037
- argv: safeArgv,
2038
- normalizedDisplay: safeNormalizedDisplay,
2039
- sourceDisplay: safeTypoDisplay,
2040
- };
2041
- }
2042
- function enforceExplicitRetryForFlagTypos(bootstrapInvocation) {
2043
- const commandName = bootstrapInvocation.commandName;
2044
- if (!commandName) {
2045
- return;
2046
- }
2047
- const typoEvent = bootstrapInvocation.trace.find((entry) => entry.reason === "flag_typo");
2048
- if (!typoEvent) {
2049
- return;
2050
- }
2051
- const normalizedTokens = Array.isArray(typoEvent.to) ? typoEvent.to : [String(typoEvent.to ?? "")].filter((entry) => entry.length > 0);
2052
- const normalizedDisplay = normalizedTokens.length > 0 ? normalizedTokens.join(" ") : "the canonical flag";
2053
- const mutatingCommand = MUTATION_COMMAND_NAMES.has(commandName) || MUTATING_OPERATION_COMMAND_NAMES.has(commandName);
2054
- const code = mutatingCommand ? "mutating_flag_typo_requires_retry" : "flag_typo_requires_retry";
2055
- const commandScope = mutatingCommand ? "mutating option" : "option";
2056
- const safeTypo = redactSensitiveFlagTypo({
2057
- argv: bootstrapInvocation.argv,
2058
- normalizedDisplay,
2059
- normalizedTokens,
2060
- rawFrom: typoEvent.from,
2061
- });
2062
- 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, {
2063
- code,
2064
- examples: [renderPmCommand(safeTypo.argv)],
2065
- nextSteps: ["Retry the command with the canonical flag shown in examples."],
2066
- recovery: {
2067
- normalized_args: safeTypo.argv,
2068
- suggested_retry: renderPmCommand(safeTypo.argv),
2069
- },
2070
- });
2071
- }
2072
- function createTelemetryCommandErrorEmitter(params) {
2073
- return async (event) => {
2074
- const errorCategory = resolveTelemetryErrorCategory(event.errorCode);
2075
- const commandResolution = deriveTelemetryCommandResolution({
2076
- ok: false,
2077
- errorCode: event.errorCode,
2078
- errorCategory,
2079
- });
2080
- await emitTelemetryErrorEvent({
2081
- command: event.command,
2082
- args: params.invocationArgv,
2083
- options: event.options,
2084
- global: params.bootstrapGlobal,
2085
- pm_version: CLI_VERSION,
2086
- pm_root: params.bootstrapPmRoot,
2087
- error_code: event.errorCode,
2088
- error_message: event.errorMessage,
2089
- exit_code: event.exitCode,
2090
- error_category: errorCategory,
2091
- command_resolution: commandResolution,
2092
- resolution_stage: event.resolutionStage,
2093
- });
2094
- return {
2095
- errorCategory,
2096
- commandResolution,
2097
- };
2098
- };
2099
- }
2100
- async function prepareExtensionServicesForRunPmCliError(params) {
2101
- if (params.bootstrapGlobal.noExtensions) {
2102
- return;
2103
- }
2104
- const bootstrapProbe = buildBootstrapActivationProbe(params.invocationArgv);
2105
- const discoverySnapshot = await loadRuntimeExtensionDiscoverySnapshot(params.bootstrapPmRoot);
2106
- if (discoverySnapshot && discoveryNeedsActivationForProbe(discoverySnapshot.discovery, bootstrapProbe)) {
2107
- const bootstrapSnapshot = await loadRuntimeExtensionSnapshot(params.bootstrapPmRoot, bootstrapProbe);
2108
- setRecoveredExtensionServices(bootstrapSnapshot);
2109
- return;
2110
- }
2111
- if (discoverySnapshot) {
2112
- emitExtensionSkippedProfile(bootstrapProfileEnabled(params.invocationArgv), discoverySnapshot, bootstrapProbe);
2113
- }
2114
- setActiveExtensionServices({ overrides: [] });
2115
- }
2116
- function setRecoveredExtensionServices(bootstrapSnapshot) {
2117
- if (!bootstrapSnapshot) {
2118
- setActiveExtensionServices({ overrides: [] });
2119
- return;
2120
- }
2121
- setActiveExtensionServices(bootstrapSnapshot.services);
2122
- }
2123
- async function finishRunPmCliFailure(params) {
2124
- sentryFinishCommandSpan(false, params.errorMessage, {
2125
- error_code: params.classificationCode,
2126
- error_category: params.errorCategory,
2127
- exit_code: params.exitCode,
2128
- command_resolution: params.commandResolution,
2129
- resolution_stage: params.resolutionStage,
2130
- });
2131
- await runAndClearAfterCommandHooks({
2132
- ok: false,
2133
- error: params.errorMessage,
2134
- exit_code: params.exitCode,
2135
- error_code: params.classificationCode,
2136
- error_category: params.errorCategory,
2137
- command_resolution: params.commandResolution,
2138
- resolution_stage: params.resolutionStage,
2139
- });
2140
- }
2141
- async function finishRunPmCliSuccessParse() {
2142
- sentryFinishCommandSpan(true, undefined, {
2143
- exit_code: EXIT_CODE.SUCCESS,
2144
- command_resolution: "success",
2145
- resolution_stage: "parse",
2146
- });
2147
- await runAndClearAfterCommandHooks({
2148
- ok: true,
2149
- exit_code: EXIT_CODE.SUCCESS,
2150
- command_resolution: "success",
2151
- resolution_stage: "parse",
2152
- });
2153
- process.exitCode = EXIT_CODE.SUCCESS;
2154
- }
2155
- async function handleRunPmCliKnownError(context, numericExitCode) {
2156
- const hasExplicitExitCode = typeof numericExitCode === "number" && Number.isFinite(numericExitCode);
2157
- if (!(context.error instanceof PmCliError) && (isCommanderError(context.error) || !hasExplicitExitCode)) {
2158
- return false;
2159
- }
2160
- const errorMessage = describeUnknownError(context.error);
2161
- const exitCode = context.error instanceof PmCliError ? context.error.exitCode : normalizeThrownExitCode(numericExitCode);
2162
- const rawContext = context.error instanceof PmCliError ? context.error.context : undefined;
2163
- const enrichedContext = buildPmCliRecoveryContext(rawContext, context.invocationArgv, errorMessage);
2164
- const classification = classifyPmCliError(errorMessage, enrichedContext);
2165
- const jsonErrorPayload = context.bootstrapGlobal.lean
2166
- ? projectLeanErrorEnvelope(formatPmCliErrorForJson(errorMessage, exitCode, enrichedContext))
2167
- : formatPmCliErrorForJson(errorMessage, exitCode, enrichedContext);
2168
- const renderedError = context.jsonErrors
2169
- ? JSON.stringify(context.bootstrapGlobal.tokenAccounting ? attachOutputTokenAccounting(jsonErrorPayload, (value) => `${JSON.stringify(value, null, 2)}\n`) : jsonErrorPayload, null, 2)
2170
- : formatPmCliErrorForDisplay(errorMessage, enrichedContext);
2171
- if (context.jsonErrors)
2172
- writeStderr(`${renderedError}\n`);
2173
- else
2174
- printError(renderedError);
2175
- const { errorCategory, commandResolution } = await context.emitTelemetryCommandError({
2176
- command: context.attemptedCommand,
2177
- errorCode: classification.code,
2178
- errorMessage: classification.detail,
2179
- exitCode,
2180
- options: {
2181
- bootstrap_global_options: context.bootstrapGlobal,
2182
- },
2183
- resolutionStage: "execute",
2184
- });
2185
- const loggedHandledErrorToSentry = await maybeLogHandledCliErrorToSentry({
2186
- command: context.attemptedCommand,
2187
- error_code: classification.code,
2188
- error_category: errorCategory,
2189
- exit_code: exitCode,
2190
- error_message: classification.detail,
2191
- command_resolution: commandResolution,
2192
- resolution_stage: "execute",
2193
- source_context: activeTelemetryCommandContext?.source_context,
2194
- });
2195
- await finishRunPmCliFailure({
2196
- errorMessage,
2197
- exitCode,
2198
- classificationCode: classification.code,
2199
- errorCategory,
2200
- commandResolution,
2201
- resolutionStage: "execute",
2202
- });
2203
- if (loggedHandledErrorToSentry) {
2204
- sentryCaptureCliError(wrapThrownErrorForSentry(context.error, errorMessage));
2205
- await sentryFlush(HANDLED_ERROR_SENTRY_FLUSH_TIMEOUT_MS);
2206
- }
2207
- process.exitCode = exitCode;
2208
- return true;
2209
- }
2210
- async function handleUnknownHelpCommandError(context, code) {
2211
- const unknownToken = resolveUnknownCommanderToken(context.invocationArgv);
2212
- const unknownMessage = `unknown command '${unknownToken}'`;
2213
- const pmRoot = resolvePmRoot(process.cwd(), context.bootstrapGlobal.path);
2214
- const recoveryCommandDescriptors = await loadRuntimeExtensionCommandDescriptorsForRecovery(pmRoot);
2215
- const recoveryProbe = buildBootstrapActivationProbe(context.invocationArgv);
2216
- const failedExtensions = await loadExtensionRecoveryFailures(pmRoot, {}, collectActivationCommandCandidates(recoveryProbe));
2217
- const usageContext = await resolveCommanderUsageContext({ message: unknownMessage }, program, recoveryCommandDescriptors, { failedExtensions });
2218
- const classification = classifyCommanderError(usageContext.message, usageContext.commandName, usageContext.allowedTypes, {
2219
- unknownCommandExamples: usageContext.unknownCommandExamples,
2220
- unknownCommandNextSteps: usageContext.unknownCommandNextSteps,
2221
- attemptedCommand: usageContext.attemptedCommand,
2222
- normalizedInvocationArgs: usageContext.normalizedInvocationArgs,
2223
- providedOptionFlags: usageContext.providedOptionFlags,
2224
- unknownOptionSuggestions: usageContext.unknownOptionSuggestions,
2225
- suggestedRetryCommand: usageContext.suggestedRetryCommand,
2226
- failedExtensions,
2227
- });
2228
- const { errorCategory, commandResolution } = await context.emitTelemetryCommandError({
2229
- command: unknownToken,
2230
- errorCode: classification.code,
2231
- errorMessage: classification.detail,
2232
- exitCode: EXIT_CODE.USAGE,
2233
- options: {
2234
- bootstrap_global_options: context.bootstrapGlobal,
2235
- commander_code: code ?? "commander.helpDisplayed",
2236
- },
2237
- resolutionStage: "parse",
2238
- });
2239
- const loggedHandledErrorToSentry = await maybeLogHandledCliErrorToSentry({
2240
- command: unknownToken,
2241
- error_code: classification.code,
2242
- error_category: errorCategory,
2243
- exit_code: EXIT_CODE.USAGE,
2244
- error_message: classification.detail,
2245
- command_resolution: commandResolution,
2246
- resolution_stage: "parse",
2247
- });
2248
- const baseRenderedUsage = context.jsonErrors
2249
- ? await formatCommanderUsageJson({ message: unknownMessage }, program, recoveryCommandDescriptors, context.bootstrapGlobal.lean === true, { failedExtensions })
2250
- : await formatCommanderUsageMessage({ message: unknownMessage }, program, recoveryCommandDescriptors, { failedExtensions });
2251
- const renderedUsage = appendCommanderExtensionFailures(baseRenderedUsage, context.jsonErrors, failedExtensions);
2252
- await finishRunPmCliFailure({
2253
- errorMessage: unknownMessage,
2254
- exitCode: EXIT_CODE.USAGE,
2255
- classificationCode: classification.code,
2256
- errorCategory,
2257
- commandResolution,
2258
- resolutionStage: "parse",
2259
- });
2260
- if (context.jsonErrors)
2261
- writeStderr(`${renderedUsage}\n`);
2262
- else
2263
- printError(renderedUsage);
2264
- if (loggedHandledErrorToSentry) {
2265
- await sentryFlush(HANDLED_ERROR_SENTRY_FLUSH_TIMEOUT_MS);
2266
- }
2267
- process.exitCode = EXIT_CODE.USAGE;
2268
- }
2269
- async function handleRunPmCliHelpDisplayError(context, code, rawMessage) {
2270
- const isHelpDisplayCode = code === "commander.helpDisplayed" || code === "commander.help" || code === "commander.helpCommand";
2271
- if (!isHelpDisplayCode && !rawMessage.includes("(outputHelp)")) {
2272
- return false;
2273
- }
2274
- const helpRequest = parseBootstrapHelpRequest(context.invocationArgv);
2275
- if (helpRequest.requested && !isKnownHelpCommandPath(program, helpRequest.commandPathTokens)) {
2276
- await handleUnknownHelpCommandError(context, code);
2277
- return true;
2278
- }
2279
- await finishRunPmCliSuccessParse();
2280
- return true;
2281
- }
2282
- async function handleRunPmCliCommanderUsageError(context, code) {
2283
- const usageContext = await resolveCommanderUsageContext(context.error, program, activeRuntimeExtensionCommandDescriptors);
2284
- const classification = classifyCommanderError(usageContext.message, usageContext.commandName, usageContext.allowedTypes, {
2285
- unknownCommandExamples: usageContext.unknownCommandExamples,
2286
- unknownCommandNextSteps: usageContext.unknownCommandNextSteps,
2287
- attemptedCommand: usageContext.attemptedCommand,
2288
- normalizedInvocationArgs: usageContext.normalizedInvocationArgs,
2289
- providedOptionFlags: usageContext.providedOptionFlags,
2290
- unknownOptionSuggestions: usageContext.unknownOptionSuggestions,
2291
- suggestedRetryCommand: usageContext.suggestedRetryCommand,
2292
- });
2293
- const { errorCategory, commandResolution } = await context.emitTelemetryCommandError({
2294
- command: context.attemptedCommand,
2295
- errorCode: classification.code,
2296
- errorMessage: classification.detail,
2297
- exitCode: EXIT_CODE.USAGE,
2298
- options: {
2299
- bootstrap_global_options: context.bootstrapGlobal,
2300
- commander_code: code,
2301
- },
2302
- resolutionStage: "parse",
2303
- });
2304
- const loggedHandledErrorToSentry = await maybeLogHandledCliErrorToSentry({
2305
- command: context.attemptedCommand,
2306
- error_code: classification.code,
2307
- error_category: errorCategory,
2308
- exit_code: EXIT_CODE.USAGE,
2309
- error_message: classification.detail,
2310
- command_resolution: commandResolution,
2311
- resolution_stage: "parse",
2312
- source_context: activeTelemetryCommandContext?.source_context,
2313
- });
2314
- const baseRenderedUsage = context.jsonErrors
2315
- ? await formatCommanderUsageJson(context.error, program, activeRuntimeExtensionCommandDescriptors, context.bootstrapGlobal.lean === true)
2316
- : await formatCommanderUsageMessage(context.error, program, activeRuntimeExtensionCommandDescriptors);
2317
- const recoveryFailures = await loadUnknownCommandRecoveryFailures(classification.code, context.bootstrapPmRoot, {}, collectActivationCommandCandidates(buildBootstrapActivationProbe(context.invocationArgv)));
2318
- const renderedUsage = appendCommanderExtensionFailures(baseRenderedUsage, context.jsonErrors, recoveryFailures);
2319
- await finishRunPmCliFailure({
2320
- errorMessage: usageContext.message,
2321
- exitCode: EXIT_CODE.USAGE,
2322
- classificationCode: classification.code,
2323
- errorCategory,
2324
- commandResolution,
2325
- resolutionStage: "parse",
2326
- });
2327
- if (context.jsonErrors)
2328
- writeStderr(`${renderedUsage}\n`);
2329
- else
2330
- printError(renderedUsage);
2331
- if (loggedHandledErrorToSentry) {
2332
- await sentryFlush(HANDLED_ERROR_SENTRY_FLUSH_TIMEOUT_MS);
2333
- }
2334
- process.exitCode = EXIT_CODE.USAGE;
2335
- }
2336
- function shouldHandleRunPmCliCommanderError(error) {
2337
- if (typeof error !== "object" || error === null || !("code" in error)) {
2338
- return false;
2339
- }
2340
- const code = error.code;
2341
- if (typeof code === "string" && (code === "commander.version" || code.startsWith("commander."))) {
2342
- return true;
2343
- }
2344
- const rawMessage = String(error.message ?? "");
2345
- return rawMessage.includes("(outputHelp)");
2346
- }
2347
- async function handleRunPmCliCommanderError(context) {
2348
- const code = context.error.code;
2349
- const rawMessage = String(context.error.message ?? "");
2350
- if (await handleRunPmCliHelpDisplayError(context, code, rawMessage)) {
2351
- return;
2352
- }
2353
- if (code === "commander.version") {
2354
- await finishRunPmCliSuccessParse();
2355
- return;
2356
- }
2357
- await handleRunPmCliCommanderUsageError(context, code);
2358
- }
2359
- async function handleRunPmCliError(params) {
2360
- const bootstrapGlobal = parseBootstrapGlobalOptions(params.invocationArgv);
2361
- const bootstrapPmRoot = resolvePmRoot(process.cwd(), bootstrapGlobal.path);
2362
- const context = {
2363
- error: params.error,
2364
- invocationArgv: params.invocationArgv,
2365
- bootstrapGlobal,
2366
- jsonErrors: bootstrapGlobal.json,
2367
- bootstrapPmRoot,
2368
- attemptedCommand: parseBootstrapCommandName(params.invocationArgv) ?? "<unknown>",
2369
- emitTelemetryCommandError: createTelemetryCommandErrorEmitter({
2370
- invocationArgv: params.invocationArgv,
2371
- bootstrapGlobal,
2372
- bootstrapPmRoot,
2373
- }),
2374
- };
2375
- await prepareExtensionServicesForRunPmCliError({
2376
- invocationArgv: params.invocationArgv,
2377
- bootstrapGlobal,
2378
- bootstrapPmRoot,
2379
- });
2380
- if (await handleRunPmCliKnownError(context, readThrownExitCode(params.error))) {
2381
- return;
2382
- }
2383
- if (shouldHandleRunPmCliCommanderError(params.error)) {
2384
- await handleRunPmCliCommanderError(context);
2385
- return;
2386
- }
2387
- await handleGenericRunPmCliError({
2388
- error: params.error,
2389
- attemptedCommand: context.attemptedCommand,
2390
- bootstrapGlobal,
2391
- emitTelemetryCommandError: context.emitTelemetryCommandError,
2392
- });
2393
- }
2394
- /** Dispatch one fresh CLI invocation with deterministic process state and tracker-scoped attribution. */
2395
- async function runPmCliInReproducibleContext(rawArgv) {
2396
- program = createPmCliProgram(CLI_VERSION);
2397
- attachProgramLifecycleHooks(program);
2398
- // The runtime-extension snapshot caches dedupe discovery work within a
2399
- // single invocation only. Reset them on entry so long-lived embeddings
2400
- // (in-process test runners, future SDK hosts) observe the same fresh
2401
- // extension state a one-shot `pm` process would — e.g. an extension
2402
- // installed by the previous invocation must be visible to this one.
2403
- runtimeExtensionSnapshotCache = null;
2404
- runtimeExtensionDiscoverySnapshotCache = null;
2405
- activeRuntimeExtensionCommandDescriptors = new Map();
2406
- resetActiveExtensionRuntimeState();
2407
- let invocationArgv = [...rawArgv];
2408
- let restorePmAuthor;
2409
- let restorePagerPolicy;
2410
- try {
2411
- const bootstrapInvocation = normalizeBootstrapInvocation(rawArgv);
2412
- invocationArgv = bootstrapInvocation.argv;
2413
- const invocationProcessArgv = [process.argv[0], process.argv[1], ...invocationArgv];
2414
- const isBareInvocation = invocationArgv.length === 0;
2415
- const bootstrapGlobal = parseBootstrapGlobalOptions(invocationArgv);
2416
- if (bootstrapGlobal.authorMissingValue) {
2417
- throw new PmCliError("--author requires a non-empty value.", EXIT_CODE.USAGE, {
2418
- code: "missing_required_argument",
2419
- nextSteps: ["Pass an explicit author identifier with --author <id>."],
2420
- });
2421
- }
2422
- restorePmAuthor = applyInvocationAuthorOverride(bootstrapGlobal.author);
2423
- enforceExplicitRetryForFlagTypos(bootstrapInvocation);
2424
- restorePagerPolicy = applyBootstrapPagerPolicy(invocationArgv);
2425
- const registrationSelection = resolveCoreCommandRegistrationSelection(invocationArgv);
2426
- await registerCoreCommandFamilies(program, registrationSelection);
2427
- if (shouldAttachRichHelpTextForInvocation(invocationArgv)) {
2428
- attachRichHelpText(program, invocationArgv);
2429
- }
2430
- const registerDynamicCommands = shouldRegisterDynamicExtensionPaths(program, invocationArgv);
2431
- if (registerDynamicCommands) {
2432
- await registerDynamicExtensionCommandPaths(program, invocationArgv);
2433
- }
2434
- else {
2435
- activeRuntimeExtensionCommandDescriptors = new Map();
2436
- setActiveExtensionServices({ overrides: [] });
2437
- }
2438
- if (shouldRegisterRuntimeSchemaFlags(invocationArgv)) {
2439
- await registerRuntimeSchemaFieldFlags(program, invocationArgv);
2440
- }
2441
- wrapProgramActionsForExtensionHandlers(program);
2442
- const renderedBootstrapJsonHelp = await maybeRenderBootstrapJsonHelp(program, invocationArgv, activeRuntimeExtensionCommandDescriptors);
2443
- if (renderedBootstrapJsonHelp) {
2444
- return;
2445
- }
2446
- const helpRequest = parseBootstrapHelpRequest(invocationArgv);
2447
- if (helpRequest.requested && !isKnownHelpCommandPath(program, helpRequest.commandPathTokens)) {
2448
- throw new CommanderError(EXIT_CODE.USAGE, "commander.helpDisplayed", "(outputHelp)");
2449
- }
2450
- if (isBareInvocation ||
2451
- (isFullHelpDiscovery(invocationArgv) &&
2452
- parseBootstrapCommandName(invocationArgv) === undefined)) {
2453
- program.outputHelp();
2454
- return;
2455
- }
2456
- const invocationPmRoot = resolvePmRoot(process.cwd(), bootstrapGlobal.path);
2457
- const invocationSettings = await readSettings(invocationPmRoot);
2458
- const intentSnapshot = await loadContextIntentSnapshotForInvocation(invocationArgv, invocationPmRoot, bootstrapGlobal.noExtensions, loadRuntimeExtensionSnapshot);
2459
- await runWithDiscoveredContextIntentContracts({
2460
- pmRoot: invocationPmRoot,
2461
- packages: intentSnapshot?.contextIntentPackages,
2462
- }, () => runWithHarnessDetectionSignals({ env: { ...process.env, PM_PATH: invocationPmRoot }, argv: invocationProcessArgv, cwd: process.cwd() }, () => runWithWorkspaceHarnessSignalDescriptors(invocationSettings.agent_identity.harness_signals, () => program.parseAsync(invocationProcessArgv), {
2463
- probesEnabled: invocationSettings.agent_identity?.probes_enabled,
2464
- })));
2465
- }
2466
- catch (error) {
2467
- await handleRunPmCliError({ error, invocationArgv });
2468
- }
2469
- finally {
2470
- restorePagerPolicy?.();
2471
- restorePmAuthor?.();
2472
- }
2473
- }
2474
- /** Implements run pm cli for the public runtime surface of this module. */
2475
- export async function runPmCli(rawArgv = process.argv.slice(2)) {
2476
- try {
2477
- await runWithReproducibleProcessEnvironment(process.env, () => runPmCliInReproducibleContext(rawArgv));
2478
- }
2479
- catch (error) {
2480
- await handleRunPmCliError({ error, invocationArgv: [...rawArgv] });
2481
- }
2482
- }
2483
- /** Public contract for test only, shared by SDK and presentation-layer consumers. */
2484
- export const _testOnly = {
2485
- activationCommandMatchesProbe,
2486
- applyDynamicExtensionRootHelpVisibility,
2487
- bootstrapProfileEnabled,
2488
- buildBootstrapActivationProbe,
2489
- buildPostActionTelemetryOutcome,
2490
- buildPmCliRecoveryContext,
2491
- buildRuntimeExtensionDiscoverySnapshotCacheKey,
2492
- buildRuntimeExtensionActivationScope,
2493
- buildRuntimeExtensionSnapshotCacheKey,
2494
- buildRuntimeExtensionFilterForProbe,
2495
- addRuntimeFieldOption,
2496
- collectActivationCommandCandidates,
2497
- collectExtensionFlagDefinitionsForCommand,
2498
- collectExtensionFlagDefinitionsForInvocation,
2499
- collectLeadingCommandArgs,
2500
- collectParsedActivationCommandArgs,
2501
- collectRuntimeFieldLooseFlagDefinitionsForCommand,
2502
- commandHasLongOption,
2503
- commandHasShortOption,
2504
- commandPathNeedsSearchExtensions,
2505
- commandPathNeedsTemplateExtensions,
2506
- describeUnknownError,
2507
- defaultPreflightDecision,
2508
- discoveryNeedsActivationForProbe,
2509
- emitExtensionProfile,
2510
- emitExtensionSkippedProfile,
2511
- emitSettingsReadWarnings,
2512
- ensureIdempotentTopLevelCommandRegistration,
2513
- enforceExplicitRetryForFlagTypos,
2514
- envFlagEnabled,
2515
- executeRegisteredRuntimeMigrations,
2516
- extractCommandScopedOptions,
2517
- extensionActivationCommands,
2518
- extensionCapabilities,
2519
- extensionNeedsActivationForProbe,
2520
- extensionProvidesTemplatesRuntime,
2521
- hasAnyCapability,
2522
- hasGlobalExtensionContributions,
2523
- handleGenericRunPmCliError,
2524
- handleRunPmCliCommanderError,
2525
- handleRunPmCliError,
2526
- handleRunPmCliHelpDisplayError,
2527
- handleRunPmCliKnownError,
2528
- handleRunPmCliCommanderUsageError,
2529
- handleUnknownHelpCommandError,
2530
- inferMissingFieldsFromErrorMessage,
2531
- inferPostActionErrorCode,
2532
- inferPostActionFailureMessage,
2533
- invocationRequestsVersion,
2534
- isCommanderError,
2535
- loadRuntimeExtensionCommandDescriptorsForRecovery,
2536
- loadRuntimeExtensionDiscoverySnapshot,
2537
- loadRuntimeExtensionSnapshot,
2538
- maybeLoadRuntimeExtensions,
2539
- maybeAttachCreateUpdatePolicyHelpText,
2540
- maybeLogHandledCliErrorToSentry,
2541
- matchesStaticExtensionCommand,
2542
- normalizeTelemetryCommandResolution,
2543
- normalizeTelemetryErrorCategory,
2544
- normalizeTelemetryResolutionStage,
2545
- normalizeThrownExitCode,
2546
- probeUsesAnyFlag,
2547
- prepareExtensionServicesForRunPmCliError,
2548
- readRecordBoolean,
2549
- readRecordNumber,
2550
- readRecordString,
2551
- recordCliReadOutputInvocationProvenance,
2552
- registerDynamicExtensionCommandPaths,
2553
- registerRuntimeSchemaFieldFlags,
2554
- resolveCoreCommandRegistrationSelection,
2555
- resolveStaticExtensionActivationDecision,
2556
- resolveUnknownHelpToken: resolveUnknownCommanderToken,
2557
- readThrownExitCode,
2558
- runAndClearAfterCommandHooks,
2559
- runRequiredExtensionCommand,
2560
- shouldAttachRichHelpTextForInvocation,
2561
- shouldLogHandledErrorToSentry,
2562
- shouldRegisterDynamicExtensionPaths,
2563
- shouldRegisterRuntimeSchemaFlags,
2564
- shouldHandleRunPmCliCommanderError,
2565
- setActiveExtensionHookContextForTest,
2566
- setActiveRuntimeExtensionCommandDescriptorsForTest,
2567
- setRecoveredExtensionServices,
2568
- toLooseFieldDefinitionType,
2569
- isImporterOrExporterCommandPath,
2570
- validateDynamicExtensionCommandInvocation,
2571
- wrapProgramActionsForExtensionHandlers,
2572
- wrapThrownErrorForSentry,
2573
- };
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]="bec161fa-a929-5f40-89b9-e41ffa0aa80d")}catch(e2){}})();import{Command,CommanderError}from"commander";import{resolvePmHistoryOperation}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";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 extractCommandScopedOptions(command,commandArgs,extensionFlagDefinitions=[]){const allOptions=command.optsWithGlobals();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=>normalizeExtensionCommandPath(entry.target_command)===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,resolvePmHistoryOperation(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=normalizeExtensionCommandPath(probe.commandPath??"").length>0;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){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=resolvePmHistoryOperation(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=resolvePmHistoryOperation(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();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)}
3
+ `):jsonErrorPayload,null,2):formatPmCliErrorForDisplay(errorMessage,enrichedContext);if(context.jsonErrors)writeStderr(`${renderedError}
4
+ `);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=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
+ `);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}
6
+ `);else printError(renderedUsage);if(loggedHandledErrorToSentry){await sentryFlush(HANDLED_ERROR_SENTRY_FLUSH_TIMEOUT_MS)}process.exitCode=EXIT_CODE.USAGE}function shouldHandleRunPmCliCommanderError(error){if(typeof error!=="object"||error===null||!("code"in error)){return false}const code=error.code;if(typeof code==="string"&&(code==="commander.version"||code.startsWith("commander."))){return true}const rawMessage=String(error.message??"");return rawMessage.includes("(outputHelp)")}async function handleRunPmCliCommanderError(context){const code=context.error.code;const rawMessage=String(context.error.message??"");if(await handleRunPmCliHelpDisplayError(context,code,rawMessage)){return}if(code==="commander.version"){await finishRunPmCliSuccessParse();return}await handleRunPmCliCommanderUsageError(context,code)}async function handleRunPmCliError(params){const bootstrapGlobal=parseBootstrapGlobalOptions(params.invocationArgv);const bootstrapPmRoot=resolvePmRoot(process.cwd(),bootstrapGlobal.path);const context={error:params.error,invocationArgv:params.invocationArgv,bootstrapGlobal,jsonErrors:bootstrapGlobal.json,bootstrapPmRoot,attemptedCommand:parseBootstrapCommandName(params.invocationArgv)??"<unknown>",emitTelemetryCommandError:createTelemetryCommandErrorEmitter({invocationArgv:params.invocationArgv,bootstrapGlobal,bootstrapPmRoot})};await prepareExtensionServicesForRunPmCliError({invocationArgv:params.invocationArgv,bootstrapGlobal,bootstrapPmRoot});if(await handleRunPmCliKnownError(context,readThrownExitCode(params.error))){return}if(shouldHandleRunPmCliCommanderError(params.error)){await handleRunPmCliCommanderError(context);return}await handleGenericRunPmCliError({error:params.error,attemptedCommand:context.attemptedCommand,bootstrapGlobal,emitTelemetryCommandError:context.emitTelemetryCommandError})}async function runPmCliInReproducibleContext(rawArgv){program=createPmCliProgram(CLI_VERSION);attachProgramLifecycleHooks(program);runtimeExtensionSnapshotCache=null;runtimeExtensionDiscoverySnapshotCache=null;activeRuntimeExtensionCommandDescriptors=new Map;resetActiveExtensionRuntimeState();let invocationArgv=[...rawArgv];let restorePmAuthor;let restorePagerPolicy;try{const bootstrapInvocation=normalizeBootstrapInvocation(rawArgv);invocationArgv=bootstrapInvocation.argv;const invocationProcessArgv=[process.argv[0],process.argv[1],...invocationArgv];const isBareInvocation=invocationArgv.length===0;const bootstrapGlobal=parseBootstrapGlobalOptions(invocationArgv);if(bootstrapGlobal.authorMissingValue){throw new PmCliError("--author requires a non-empty value.",EXIT_CODE.USAGE,{code:"missing_required_argument",nextSteps:["Pass an explicit author identifier with --author <id>."]})}restorePmAuthor=applyInvocationAuthorOverride(bootstrapGlobal.author);enforceExplicitRetryForFlagTypos(bootstrapInvocation);restorePagerPolicy=applyBootstrapPagerPolicy(invocationArgv);const registrationSelection=resolveCoreCommandRegistrationSelection(invocationArgv);await registerCoreCommandFamilies(program,registrationSelection);if(shouldAttachRichHelpTextForInvocation(invocationArgv)){attachRichHelpText(program,invocationArgv)}const registerDynamicCommands=shouldRegisterDynamicExtensionPaths(program,invocationArgv);if(registerDynamicCommands){await registerDynamicExtensionCommandPaths(program,invocationArgv)}else{activeRuntimeExtensionCommandDescriptors=new Map;setActiveExtensionServices({overrides:[]})}if(shouldRegisterRuntimeSchemaFlags(invocationArgv)){await registerRuntimeSchemaFieldFlags(program,invocationArgv)}wrapProgramActionsForExtensionHandlers(program);const renderedBootstrapJsonHelp=await maybeRenderBootstrapJsonHelp(program,invocationArgv,activeRuntimeExtensionCommandDescriptors);if(renderedBootstrapJsonHelp){return}const helpRequest=parseBootstrapHelpRequest(invocationArgv);if(helpRequest.requested&&!isKnownHelpCommandPath(program,helpRequest.commandPathTokens)){throw new CommanderError(EXIT_CODE.USAGE,"commander.helpDisplayed","(outputHelp)")}if(isBareInvocation||isFullHelpDiscovery(invocationArgv)&&parseBootstrapCommandName(invocationArgv)===void 0){program.outputHelp();return}const invocationPmRoot=resolvePmRoot(process.cwd(),bootstrapGlobal.path);const invocationSettings=await readSettings(invocationPmRoot);const intentSnapshot=await loadContextIntentSnapshotForInvocation(invocationArgv,invocationPmRoot,bootstrapGlobal.noExtensions,loadRuntimeExtensionSnapshot);await runWithDiscoveredContextIntentContracts({pmRoot:invocationPmRoot,packages:intentSnapshot?.contextIntentPackages},()=>runWithHarnessDetectionSignals({env:{...process.env,PM_PATH:invocationPmRoot},argv:invocationProcessArgv,cwd:process.cwd()},()=>runWithWorkspaceHarnessSignalDescriptors(invocationSettings.agent_identity.harness_signals,()=>program.parseAsync(invocationProcessArgv),{probesEnabled:invocationSettings.agent_identity?.probes_enabled})))}catch(error){await handleRunPmCliError({error,invocationArgv})}finally{restorePagerPolicy?.();restorePmAuthor?.()}}async function runPmCli(rawArgv=process.argv.slice(2)){try{await runWithReproducibleProcessEnvironment(process.env,()=>runPmCliInReproducibleContext(rawArgv))}catch(error){await handleRunPmCliError({error,invocationArgv:[...rawArgv]})}}const _testOnly={activationCommandMatchesProbe,applyDynamicExtensionRootHelpVisibility,bootstrapProfileEnabled,buildBootstrapActivationProbe,buildPostActionTelemetryOutcome,buildPmCliRecoveryContext,buildRuntimeExtensionDiscoverySnapshotCacheKey,buildRuntimeExtensionActivationScope,buildRuntimeExtensionSnapshotCacheKey,buildRuntimeExtensionFilterForProbe,addRuntimeFieldOption,collectActivationCommandCandidates,collectExtensionFlagDefinitionsForCommand,collectExtensionFlagDefinitionsForInvocation,collectLeadingCommandArgs,collectParsedActivationCommandArgs,collectRuntimeFieldLooseFlagDefinitionsForCommand,commandHasLongOption,commandHasShortOption,commandPathNeedsSearchExtensions,commandPathNeedsTemplateExtensions,describeUnknownError,defaultPreflightDecision,discoveryNeedsActivationForProbe,emitExtensionProfile,emitExtensionSkippedProfile,emitSettingsReadWarnings,ensureIdempotentTopLevelCommandRegistration,enforceExplicitRetryForFlagTypos,envFlagEnabled,executeRegisteredRuntimeMigrations,extractCommandScopedOptions,extensionActivationCommands,extensionCapabilities,extensionNeedsActivationForProbe,extensionProvidesTemplatesRuntime,hasAnyCapability,hasGlobalExtensionContributions,handleGenericRunPmCliError,handleRunPmCliCommanderError,handleRunPmCliError,handleRunPmCliHelpDisplayError,handleRunPmCliKnownError,handleRunPmCliCommanderUsageError,handleUnknownHelpCommandError,inferMissingFieldsFromErrorMessage,inferPostActionErrorCode,inferPostActionFailureMessage,invocationRequestsVersion,isCommanderError,loadRuntimeExtensionCommandDescriptorsForRecovery,loadRuntimeExtensionDiscoverySnapshot,loadRuntimeExtensionSnapshot,maybeLoadRuntimeExtensions,maybeAttachCreateUpdatePolicyHelpText,maybeLogHandledCliErrorToSentry,matchesStaticExtensionCommand,normalizeTelemetryCommandResolution,normalizeTelemetryErrorCategory,normalizeTelemetryResolutionStage,normalizeThrownExitCode,probeUsesAnyFlag,prepareExtensionServicesForRunPmCliError,readRecordBoolean,readRecordNumber,readRecordString,recordCliReadOutputInvocationProvenance,registerDynamicExtensionCommandPaths,registerRuntimeSchemaFieldFlags,resolveCoreCommandRegistrationSelection,resolveStaticExtensionActivationDecision,resolveUnknownHelpToken:resolveUnknownCommanderToken,readThrownExitCode,runAndClearAfterCommandHooks,runRequiredExtensionCommand,shouldAttachRichHelpTextForInvocation,shouldLogHandledErrorToSentry,shouldRegisterDynamicExtensionPaths,shouldRegisterRuntimeSchemaFlags,shouldHandleRunPmCliCommanderError,setActiveExtensionHookContextForTest,setActiveRuntimeExtensionCommandDescriptorsForTest,setRecoveredExtensionServices,toLooseFieldDefinitionType,isImporterOrExporterCommandPath,validateDynamicExtensionCommandInvocation,wrapProgramActionsForExtensionHandlers,wrapThrownErrorForSentry};export{_testOnly,runPmCli};
2574
7
  //# sourceMappingURL=main.js.map
2575
- //# debugId=2b73baa7-f63e-5a3b-a8cb-659ac26d7c67