@unbrained/pm-cli 2026.9.7 → 2026.9.9

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 (746) 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 +7 -2
  6. package/.agents/skills/pm-user/references/ECOSYSTEM_PLANNING.md +95 -0
  7. package/.claude-plugin/marketplace.json +2 -2
  8. package/CHANGELOG.md +231 -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.d.ts +0 -5
  92. package/dist/cli/register-mutation.js +19 -1893
  93. package/dist/cli/register-operations.js +1 -920
  94. package/dist/cli/register-setup.js +1 -716
  95. package/dist/cli/register-structured-mutation.js +1 -196
  96. package/dist/cli/registration-helpers.js +1 -5
  97. package/dist/cli/runtime-compatibility-boundary.js +4 -42
  98. package/dist/cli/schema-registration-helpers.js +1 -73
  99. package/dist/cli/search-refresh.js +1 -13
  100. package/dist/cli/stats-analytics-json.js +1 -68
  101. package/dist/cli/telemetry-flush.js +1 -10
  102. package/dist/cli-bundle/bundle-manifest.json +164 -156
  103. package/dist/cli-bundle/chunks/{chunk-NPN5I67J.js → chunk-3IPRM75M.js} +3 -3
  104. package/dist/cli-bundle/chunks/chunk-4VL5P22L.js +2 -0
  105. package/dist/cli-bundle/chunks/chunk-AAFBV3U3.js +29 -0
  106. package/dist/cli-bundle/chunks/chunk-D3YVILJJ.js +20 -0
  107. package/dist/cli-bundle/chunks/{chunk-WYRZZ5ZE.js → chunk-DEZPZOQ7.js} +2 -2
  108. package/dist/cli-bundle/chunks/chunk-ECBLPN7B.js +3 -0
  109. package/dist/cli-bundle/chunks/chunk-J6ERHBV2.js +235 -0
  110. package/dist/cli-bundle/chunks/chunk-JUNJ5EKI.js +2 -0
  111. package/dist/cli-bundle/chunks/chunk-L5RCDKQ2.js +2 -0
  112. package/dist/cli-bundle/chunks/chunk-NSAPNEYH.js +2 -0
  113. package/dist/cli-bundle/chunks/chunk-OHNLSGGV.js +79 -0
  114. package/dist/cli-bundle/chunks/chunk-WQKMSFBV.js +5 -0
  115. package/dist/cli-bundle/chunks/{chunk-BAX2BYUW.js → chunk-XZ6T7YPP.js} +256 -150
  116. package/dist/cli-bundle/chunks/{chunk-JT6XF6GE.js → chunk-Z3XVXUVF.js} +4 -4
  117. package/dist/cli-bundle/chunks/register-list-query-UIHRCS6D.js +11 -0
  118. package/dist/cli-bundle/chunks/register-mutation-WHWMGRVX.js +20 -0
  119. package/dist/cli-bundle/chunks/register-operations-64YZYTC5.js +2 -0
  120. package/dist/cli-bundle/chunks/register-setup-PERI45EM.js +2 -0
  121. package/dist/cli-bundle/focused-chunks/chunk-2W4XIYOB.js +2 -0
  122. package/dist/cli-bundle/focused-chunks/chunk-2WSBXIGF.js +12 -0
  123. package/dist/cli-bundle/focused-chunks/chunk-5FHTCOHS.js +3 -0
  124. package/dist/cli-bundle/focused-chunks/chunk-7N6DOREF.js +26 -0
  125. package/dist/cli-bundle/focused-chunks/{chunk-3BZEOXLT.js → chunk-7PC4R5QB.js} +2 -2
  126. package/dist/cli-bundle/focused-chunks/chunk-BUCJUZVG.js +6 -0
  127. package/dist/cli-bundle/focused-chunks/chunk-FE3BABLJ.js +2 -0
  128. package/dist/cli-bundle/focused-chunks/chunk-IWITF53W.js +2 -0
  129. package/dist/cli-bundle/focused-chunks/chunk-OQUGRHKV.js +10 -0
  130. package/dist/cli-bundle/focused-chunks/{chunk-M6PBRFSH.js → chunk-PNKIANFZ.js} +2 -2
  131. package/dist/cli-bundle/focused-chunks/{chunk-LIJIA4TY.js → chunk-QQQ4SAUO.js} +3 -3
  132. package/dist/cli-bundle/focused-chunks/chunk-TTYXF5YD.js +177 -0
  133. package/dist/cli-bundle/focused-chunks/chunk-XNR3DM6J.js +2 -0
  134. package/dist/cli-bundle/focused-chunks/chunk-XSS3APUF.js +9 -0
  135. package/dist/cli-bundle/focused-chunks/chunk-YCDQ2N23.js +8 -0
  136. package/dist/cli-bundle/focused-chunks/chunk-YJUXGS57.js +20 -0
  137. package/dist/cli-bundle/focused-chunks/chunk-ZTCE4UO6.js +58 -0
  138. package/dist/cli-bundle/main.js +20 -20
  139. package/dist/cli-bundle/sdk-authoring.js +1 -1
  140. package/dist/cli-bundle/sdk-contracts.js +2 -2
  141. package/dist/cli-bundle/sdk-core.js +37 -37
  142. package/dist/cli-bundle/sdk-governance.js +1 -1
  143. package/dist/cli-bundle/sdk-graph.js +1 -1
  144. package/dist/cli-bundle/sdk-merge.js +42 -42
  145. package/dist/cli-bundle/sdk-query.js +1 -1
  146. package/dist/cli-bundle/sdk-runtime.js +1 -1
  147. package/dist/cli-bundle/sdk-testing.js +1 -1
  148. package/dist/cli-bundle/sdk.js +11 -11
  149. package/dist/cli.js +1 -104
  150. package/dist/core/checkpoint/checkpoint-gc.js +1 -169
  151. package/dist/core/checkpoint/mutation-checkpoint.js +2 -133
  152. package/dist/core/config/nested-settings.js +1 -534
  153. package/dist/core/config/positional-value.js +1 -109
  154. package/dist/core/diagnostics/remediation.js +1 -506
  155. package/dist/core/extensions/activation-summary-markdown.js +2 -145
  156. package/dist/core/extensions/activation-summary.js +1 -92
  157. package/dist/core/extensions/activation-transaction.js +1 -46
  158. package/dist/core/extensions/capability-usage.js +1 -173
  159. package/dist/core/extensions/command-hook-context.js +1 -13
  160. package/dist/core/extensions/command-metadata-contract.js +1 -22
  161. package/dist/core/extensions/command-visibility-tier.js +1 -29
  162. package/dist/core/extensions/contribution-inventory.js +1 -173
  163. package/dist/core/extensions/exporter-output-contract.js +1 -66
  164. package/dist/core/extensions/extension-candidate.js +1 -18
  165. package/dist/core/extensions/extension-capability-aliases.js +1 -158
  166. package/dist/core/extensions/extension-hook-runtime.js +1 -699
  167. package/dist/core/extensions/extension-policy.js +1 -599
  168. package/dist/core/extensions/extension-registries.js +1 -62
  169. package/dist/core/extensions/extension-runtime-helpers.js +1 -33
  170. package/dist/core/extensions/extension-types.js +1 -102
  171. package/dist/core/extensions/flag-definition-validation.js +1 -52
  172. package/dist/core/extensions/flag-value-types.js +1 -64
  173. package/dist/core/extensions/index.js +1 -526
  174. package/dist/core/extensions/item-field-types.js +1 -39
  175. package/dist/core/extensions/item-fields.js +1 -261
  176. package/dist/core/extensions/loader.js +1 -2223
  177. package/dist/core/extensions/manifest-schema.js +1 -69
  178. package/dist/core/extensions/module-graph-snapshot.js +1 -33
  179. package/dist/core/extensions/preflight-ownership.js +1 -41
  180. package/dist/core/extensions/registration-validation.js +1 -82
  181. package/dist/core/extensions/registration-values.js +1 -209
  182. package/dist/core/extensions/reserved-host-flags.js +1 -36
  183. package/dist/core/extensions/runtime-registrations.js +1 -67
  184. package/dist/core/extensions/service-ownership.js +1 -19
  185. package/dist/core/extensions/version-compat.js +1 -216
  186. package/dist/core/fs/fs-utils.js +2 -158
  187. package/dist/core/fs/host-environment-errors.js +1 -141
  188. package/dist/core/fs/index.js +1 -9
  189. package/dist/core/fs/path-utils.js +1 -17
  190. package/dist/core/governance/content-fields.js +1 -160
  191. package/dist/core/governance/issue-codes.js +1 -151
  192. package/dist/core/governance/metadata-coverage.js +1 -358
  193. package/dist/core/history/drift-cache.js +3 -72
  194. package/dist/core/history/drift-scan.js +1 -342
  195. package/dist/core/history/event-classification.js +1 -109
  196. package/dist/core/history/event-index.js +8 -784
  197. package/dist/core/history/history-compact-bulk.js +1 -104
  198. package/dist/core/history/history-diff.js +1 -158
  199. package/dist/core/history/history-rewrite.d.ts +6 -1
  200. package/dist/core/history/history-rewrite.js +1 -107
  201. package/dist/core/history/history-storage-stats.js +1 -102
  202. package/dist/core/history/history-stream-policy.js +1 -62
  203. package/dist/core/history/history.js +2 -617
  204. package/dist/core/history/identity.js +1 -30
  205. package/dist/core/history/index.js +1 -9
  206. package/dist/core/history/projection.js +1 -196
  207. package/dist/core/history/read.d.ts +9 -0
  208. package/dist/core/history/read.js +1 -57
  209. package/dist/core/history/replay.js +2 -439
  210. package/dist/core/history/version-address.js +1 -32
  211. package/dist/core/history/workspace-history.js +2 -433
  212. package/dist/core/io/body-file.js +1 -62
  213. package/dist/core/io/bulk-ids-input.js +1 -112
  214. package/dist/core/item/actionability.js +1 -327
  215. package/dist/core/item/dependency-reference.js +1 -20
  216. package/dist/core/item/id.js +1 -112
  217. package/dist/core/item/index.js +1 -12
  218. package/dist/core/item/item-format-version.js +1 -78
  219. package/dist/core/item/item-format.js +5 -1473
  220. package/dist/core/item/item-record.js +1 -23
  221. package/dist/core/item/item-type-definition.js +1 -133
  222. package/dist/core/item/parent-reference-policy.js +1 -57
  223. package/dist/core/item/parse.js +2 -603
  224. package/dist/core/item/plan-lifecycle.js +1 -19
  225. package/dist/core/item/priority.js +1 -61
  226. package/dist/core/item/sprint-release-format.js +1 -38
  227. package/dist/core/item/status-filter.js +1 -115
  228. package/dist/core/item/status.js +1 -43
  229. package/dist/core/item/toon-decode.js +1 -29
  230. package/dist/core/item/type-registry.js +1 -715
  231. package/dist/core/item/type-synonyms.js +1 -38
  232. package/dist/core/lock/index.js +1 -9
  233. package/dist/core/lock/lock-gc.js +1 -240
  234. package/dist/core/lock/lock.js +3 -590
  235. package/dist/core/output/mutation-projection.js +1 -217
  236. package/dist/core/output/output-control.js +1 -25
  237. package/dist/core/output/output.js +11 -494
  238. package/dist/core/output/query-summary.js +1 -58
  239. package/dist/core/output/tabular.js +1 -77
  240. package/dist/core/packages/manifest.js +1 -244
  241. package/dist/core/packages/root.js +1 -84
  242. package/dist/core/policy/workflow-policy-schema.d.ts +312 -0
  243. package/dist/core/policy/workflow-policy-schema.js +2 -0
  244. package/dist/core/policy/workflow-policy-store.d.ts +24 -0
  245. package/dist/core/policy/workflow-policy-store.js +2 -0
  246. package/dist/core/policy/workflow-policy.d.ts +139 -0
  247. package/dist/core/policy/workflow-policy.js +2 -0
  248. package/dist/core/profile/profile-describe.js +1 -83
  249. package/dist/core/profile/profile-lint.js +1 -415
  250. package/dist/core/profile/profile-plan.js +0 -0
  251. package/dist/core/profile/profile-presets.js +1 -370
  252. package/dist/core/reproducibility/context.js +1 -82
  253. package/dist/core/schema/fields-file.js +2 -288
  254. package/dist/core/schema/item-types-file.js +2 -296
  255. package/dist/core/schema/runtime-field-filters.js +1 -49
  256. package/dist/core/schema/runtime-field-values.js +1 -313
  257. package/dist/core/schema/runtime-schema.js +2 -826
  258. package/dist/core/schema/status-defs-file.js +2 -227
  259. package/dist/core/schema/status-token.js +1 -31
  260. package/dist/core/schema/type-inference.js +1 -95
  261. package/dist/core/schema/type-presets.js +1 -87
  262. package/dist/core/schema/type-workflows.js +1 -104
  263. package/dist/core/search/background-refresh.js +2 -286
  264. package/dist/core/search/bm25.js +1 -146
  265. package/dist/core/search/cache.js +2 -534
  266. package/dist/core/search/corpus.js +1 -311
  267. package/dist/core/search/embedding-batches.js +1 -163
  268. package/dist/core/search/eval.js +1 -225
  269. package/dist/core/search/http-client.js +1 -75
  270. package/dist/core/search/providers.js +1 -242
  271. package/dist/core/search/relevance.js +1 -244
  272. package/dist/core/search/semantic-defaults.js +1 -199
  273. package/dist/core/search/staleness.js +1 -30
  274. package/dist/core/search/vector-stores.js +2 -664
  275. package/dist/core/search/vectorization-metadata.js +1 -81
  276. package/dist/core/sentry/helpers.js +1 -272
  277. package/dist/core/sentry/instrument.js +1 -387
  278. package/dist/core/session/session-state.js +1 -260
  279. package/dist/core/shared/agent-session-context.js +1 -133
  280. package/dist/core/shared/author.js +1 -1172
  281. package/dist/core/shared/command-types.js +1 -4
  282. package/dist/core/shared/conflict-markers.js +1 -31
  283. package/dist/core/shared/constants.js +1 -405
  284. package/dist/core/shared/errors.js +1 -20
  285. package/dist/core/shared/html-entity-decode.js +1 -131
  286. package/dist/core/shared/index.js +1 -12
  287. package/dist/core/shared/item-metadata-contract.js +1 -89
  288. package/dist/core/shared/lazy-module.js +1 -16
  289. package/dist/core/shared/levenshtein.js +1 -61
  290. package/dist/core/shared/memo.js +1 -19
  291. package/dist/core/shared/numeric-parsers.js +1 -20
  292. package/dist/core/shared/option-alias-visibility.js +1 -67
  293. package/dist/core/shared/primitives.js +1 -127
  294. package/dist/core/shared/serial-queue.js +1 -79
  295. package/dist/core/shared/serialization.js +1 -210
  296. package/dist/core/shared/split-comma-list.js +1 -30
  297. package/dist/core/shared/text-normalization.js +1 -38
  298. package/dist/core/shared/time.js +1 -306
  299. package/dist/core/store/index.js +1 -12
  300. package/dist/core/store/item-format-migration.js +1 -125
  301. package/dist/core/store/item-metadata-cache.js +1 -1116
  302. package/dist/core/store/item-metadata-query-index.js +9 -394
  303. package/dist/core/store/item-metadata-read-work.js +1 -43
  304. package/dist/core/store/item-store.js +1 -693
  305. package/dist/core/store/paths.d.ts +1 -1
  306. package/dist/core/store/paths.js +1 -214
  307. package/dist/core/store/settings-read-cache.js +1 -85
  308. package/dist/core/store/settings-validator.d.ts +1 -0
  309. package/dist/core/store/settings-validator.js +1 -421
  310. package/dist/core/store/settings.js +3 -1309
  311. package/dist/core/store/tracker-preflight.js +1 -141
  312. package/dist/core/telemetry/consent.js +5 -108
  313. package/dist/core/telemetry/observability.js +1 -246
  314. package/dist/core/telemetry/runtime.js +4 -1988
  315. package/dist/core/test/background-runs.js +4 -945
  316. package/dist/core/test/item-test-run-tracking.js +1 -63
  317. package/dist/core/test/run-selectors.js +1 -120
  318. package/dist/core/validate/estimate-defaults.js +1 -89
  319. package/dist/core/validate/fix-planning.js +1 -189
  320. package/dist/core/validate/linked-artifact-reference.js +1 -36
  321. package/dist/core/validate/missing-by-type.js +1 -34
  322. package/dist/core/validate/missing-link-owners.js +1 -95
  323. package/dist/core/validate/stale-file-classification.js +1 -82
  324. package/dist/mcp/http-server.js +5 -448
  325. package/dist/mcp/legacy-adapter.js +1 -77
  326. package/dist/mcp/runtime-capabilities.js +1 -200
  327. package/dist/mcp/server.js +4 -1233
  328. package/dist/mcp/tool-definitions.js +1 -804
  329. package/dist/sdk/actionability.js +1 -13
  330. package/dist/sdk/agent/closed-domain-contracts.js +1 -161
  331. package/dist/sdk/agent/command-recovery.js +1 -59
  332. package/dist/sdk/agent/command-suggestions.js +1 -66
  333. package/dist/sdk/agent/create-option-policy.js +1 -31
  334. package/dist/sdk/agent/identity-config.js +1 -106
  335. package/dist/sdk/agent/item-addressing.js +1 -207
  336. package/dist/sdk/agent/refusal-closure-census.js +1 -151
  337. package/dist/sdk/agent/refusal-closure.js +1 -133
  338. package/dist/sdk/agent/refusal-corpus-contracts.js +1 -193
  339. package/dist/sdk/agent/refusal-reachability.js +1 -593
  340. package/dist/sdk/agent/subcommand-recovery.js +1 -83
  341. package/dist/sdk/agent/task-transcript-contracts.js +1 -197
  342. package/dist/sdk/agent/tracker-preflight-contracts.js +1 -126
  343. package/dist/sdk/agent-capability-contracts.js +1 -428
  344. package/dist/sdk/agent-session-context.js +1 -9
  345. package/dist/sdk/annotations.js +1 -448
  346. package/dist/sdk/author-attribution.js +1 -468
  347. package/dist/sdk/authoring.js +1 -20
  348. package/dist/sdk/cli-bootstrap.js +1 -838
  349. package/dist/sdk/cli-contracts/agent-output-contracts.d.ts +1 -1
  350. package/dist/sdk/cli-contracts/agent-output-contracts.js +4 -476
  351. package/dist/sdk/cli-contracts/bootstrap-command-scanner.js +1 -79
  352. package/dist/sdk/cli-contracts/command-aliases.d.ts +4 -0
  353. package/dist/sdk/cli-contracts/command-aliases.js +1 -107
  354. package/dist/sdk/cli-contracts/command-exit-contracts.js +1 -151
  355. package/dist/sdk/cli-contracts/commander-mutation-options.js +1 -1081
  356. package/dist/sdk/cli-contracts/commander-types.js +1 -159
  357. package/dist/sdk/cli-contracts/completeness.js +1 -393
  358. package/dist/sdk/cli-contracts/enum-contracts.d.ts +1 -1
  359. package/dist/sdk/cli-contracts/enum-contracts.js +1 -222
  360. package/dist/sdk/cli-contracts/flag-contracts.js +1 -1947
  361. package/dist/sdk/cli-contracts/flag-lexicon-contracts.js +1 -347
  362. package/dist/sdk/cli-contracts/grammar-contracts.js +1 -986
  363. package/dist/sdk/cli-contracts/registration-helpers.js +7 -990
  364. package/dist/sdk/cli-contracts/runtime-contracts.d.ts +5 -0
  365. package/dist/sdk/cli-contracts/runtime-contracts.js +1 -2090
  366. package/dist/sdk/cli-contracts/schemas/assurance-definition.js +1 -324
  367. package/dist/sdk/cli-contracts/string-lists.js +1 -16
  368. package/dist/sdk/cli-contracts/tool-option-contracts.js +1 -461
  369. package/dist/sdk/cli-contracts/tool-parameter-tables.js +1 -2167
  370. package/dist/sdk/cli-contracts/tool-schema.d.ts +3 -1
  371. package/dist/sdk/cli-contracts/tool-schema.js +1 -1664
  372. package/dist/sdk/cli-contracts/typed-action-inputs.js +1 -4
  373. package/dist/sdk/cli-contracts.d.ts +1 -1
  374. package/dist/sdk/cli-contracts.js +1 -17
  375. package/dist/sdk/cli-program.js +1 -49
  376. package/dist/sdk/command-line.d.ts +2 -5
  377. package/dist/sdk/command-line.js +1 -78
  378. package/dist/sdk/comments.js +1 -133
  379. package/dist/sdk/compile-cache.js +1 -73
  380. package/dist/sdk/completion.js +174 -839
  381. package/dist/sdk/compose.js +1 -1090
  382. package/dist/sdk/config.js +1 -1204
  383. package/dist/sdk/context/recency.js +1 -33
  384. package/dist/sdk/context/semantic-session-attribution.js +1 -82
  385. package/dist/sdk/context/usage-egress.js +1 -29
  386. package/dist/sdk/context/usage-ledger.js +3 -185
  387. package/dist/sdk/context-intent-contracts.js +1 -709
  388. package/dist/sdk/context-intent-runtime.js +1 -115
  389. package/dist/sdk/context-packing.js +1 -218
  390. package/dist/sdk/context-relevance.js +1 -503
  391. package/dist/sdk/context-signal-store.js +2 -426
  392. package/dist/sdk/context-usage.js +1 -367
  393. package/dist/sdk/contracts.js +1 -23
  394. package/dist/sdk/core-governance.js +1 -14
  395. package/dist/sdk/core.js +1 -14
  396. package/dist/sdk/corpus-shape.js +1 -401
  397. package/dist/sdk/define.js +1 -220
  398. package/dist/sdk/dependencies.js +1 -718
  399. package/dist/sdk/dependency-flag-validation.js +1 -156
  400. package/dist/sdk/dependency-provenance.js +1 -135
  401. package/dist/sdk/docs.js +1 -14
  402. package/dist/sdk/duplicates.js +1 -40
  403. package/dist/sdk/environment/agent-environment.js +1 -466
  404. package/dist/sdk/environment/host-environment-errors.js +1 -8
  405. package/dist/sdk/environment/project-runtime-compatibility.js +1 -481
  406. package/dist/sdk/environment/source-context.js +1 -28
  407. package/dist/sdk/environment/tracker-preflight.js +1 -9
  408. package/dist/sdk/error-code-catalog.js +1 -153
  409. package/dist/sdk/error-runtime.js +1 -58
  410. package/dist/sdk/errors.js +1 -58
  411. package/dist/sdk/eval.js +1 -190
  412. package/dist/sdk/extension/author-manifest.js +1 -92
  413. package/dist/sdk/extension/bundled-catalog.js +1 -332
  414. package/dist/sdk/extension/concurrency.js +1 -25
  415. package/dist/sdk/extension/copy-scope.d.ts +2 -0
  416. package/dist/sdk/extension/copy-scope.js +2 -0
  417. package/dist/sdk/extension/custom-field-collisions.js +1 -30
  418. package/dist/sdk/extension/describe.js +3 -189
  419. package/dist/sdk/extension/doctor.js +1 -606
  420. package/dist/sdk/extension/install-plan.d.ts +69 -0
  421. package/dist/sdk/extension/install-plan.js +2 -0
  422. package/dist/sdk/extension/install-receipts.d.ts +7 -0
  423. package/dist/sdk/extension/install-receipts.js +2 -0
  424. package/dist/sdk/extension/install-runtime.js +3 -313
  425. package/dist/sdk/extension/install-snapshot.js +1 -66
  426. package/dist/sdk/extension/install-sources.js +5 -1057
  427. package/dist/sdk/extension/managed-state.js +2 -252
  428. package/dist/sdk/extension/migrations.js +2 -174
  429. package/dist/sdk/extension/output-ownership.js +1 -25
  430. package/dist/sdk/extension/runtime-summary.js +1 -18
  431. package/dist/sdk/extension/scaffold.js +4 -2308
  432. package/dist/sdk/extension/shared.js +1 -147
  433. package/dist/sdk/extension/source-resolution.js +1 -65
  434. package/dist/sdk/extension/update-check.js +1 -67
  435. package/dist/sdk/extension-command-context.js +1 -44
  436. package/dist/sdk/extension-contracts.js +1 -73
  437. package/dist/sdk/extension.d.ts +7 -2
  438. package/dist/sdk/extension.js +1 -2196
  439. package/dist/sdk/files.js +1 -535
  440. package/dist/sdk/flag-invocation-contracts.d.ts +0 -5
  441. package/dist/sdk/flag-invocation-contracts.js +1 -344
  442. package/dist/sdk/generated/generated-error-code-catalog-part-1.js +1 -2224
  443. package/dist/sdk/generated/generated-error-code-catalog-part-2.js +1 -2236
  444. package/dist/sdk/generated-error-code-catalog.js +1 -16
  445. package/dist/sdk/governance/assurance-action-contracts.js +1 -4
  446. package/dist/sdk/governance/assurance-action.js +1 -411
  447. package/dist/sdk/governance/assurance-limits.js +1 -10
  448. package/dist/sdk/governance/assurance-mutation-error.js +1 -81
  449. package/dist/sdk/governance/assurance-presets.js +1 -135
  450. package/dist/sdk/governance/assurance-runtime.js +1 -238
  451. package/dist/sdk/governance/assurance.js +4 -1182
  452. package/dist/sdk/governance/boundary-fixtures.js +1 -200
  453. package/dist/sdk/governance/coverage-assurance.js +1 -60
  454. package/dist/sdk/governance/defect-recurrence-coverage.js +1 -188
  455. package/dist/sdk/governance/defect-recurrence-graph.js +1 -120
  456. package/dist/sdk/governance/defect-recurrence-signals.js +1 -24
  457. package/dist/sdk/governance/defect-recurrence.js +1 -623
  458. package/dist/sdk/governance/extension-host-version.js +1 -115
  459. package/dist/sdk/governance/gc.js +1 -368
  460. package/dist/sdk/governance/health.js +1 -2367
  461. package/dist/sdk/governance/hierarchy-validation.js +1 -108
  462. package/dist/sdk/governance/linked-file-report.js +1 -71
  463. package/dist/sdk/governance/merge-receipt-history.js +1 -206
  464. package/dist/sdk/governance/provenance-health.js +1 -282
  465. package/dist/sdk/governance/reindex.js +4 -761
  466. package/dist/sdk/governance/stale-work.js +1 -82
  467. package/dist/sdk/governance/status-role-diagnostics.js +1 -35
  468. package/dist/sdk/governance/storage-integrity.js +1 -280
  469. package/dist/sdk/governance/tracked-runtime-cache.js +1 -106
  470. package/dist/sdk/governance/upgrade.js +2 -327
  471. package/dist/sdk/governance/validate-history-drift.js +1 -81
  472. package/dist/sdk/governance/validate-item-reader.js +1 -17
  473. package/dist/sdk/governance/validate-normalization.js +1 -36
  474. package/dist/sdk/governance/validate.d.ts +3 -1
  475. package/dist/sdk/governance/validate.js +1 -2261
  476. package/dist/sdk/governance/workflow-completeness.d.ts +32 -0
  477. package/dist/sdk/governance/workflow-completeness.js +2 -0
  478. package/dist/sdk/governance/workflow-policy.d.ts +47 -0
  479. package/dist/sdk/governance/workflow-policy.js +4 -0
  480. package/dist/sdk/governance/workspace-position.js +1 -163
  481. package/dist/sdk/governance.d.ts +2 -0
  482. package/dist/sdk/governance.js +1 -31
  483. package/dist/sdk/graph/adapter.js +1 -181
  484. package/dist/sdk/graph/analytics.js +1 -474
  485. package/dist/sdk/graph/assembly.js +1 -377
  486. package/dist/sdk/graph/cache.js +1 -160
  487. package/dist/sdk/graph/centrality.js +1 -258
  488. package/dist/sdk/graph/conformance.js +1 -130
  489. package/dist/sdk/graph/deadline-scheduling.d.ts +90 -0
  490. package/dist/sdk/graph/deadline-scheduling.js +2 -0
  491. package/dist/sdk/graph/durable-cache.d.ts +1 -1
  492. package/dist/sdk/graph/durable-cache.js +1 -361
  493. package/dist/sdk/graph/governance-contracts.js +1 -34
  494. package/dist/sdk/graph/governance.d.ts +13 -1
  495. package/dist/sdk/graph/governance.js +1 -735
  496. package/dist/sdk/graph/hierarchy-integrity.js +1 -310
  497. package/dist/sdk/graph/index.d.ts +3 -2
  498. package/dist/sdk/graph/index.js +1 -26
  499. package/dist/sdk/graph/lifecycle-coverage.d.ts +32 -0
  500. package/dist/sdk/graph/lifecycle-coverage.js +2 -0
  501. package/dist/sdk/graph/mutation-advisory.js +1 -176
  502. package/dist/sdk/graph/remediation.js +1 -197
  503. package/dist/sdk/graph/run.d.ts +15 -1
  504. package/dist/sdk/graph/run.js +1 -768
  505. package/dist/sdk/graph/scheduling.js +1 -124
  506. package/dist/sdk/graph/traversal.js +1 -284
  507. package/dist/sdk/graph/workspace-relationship-kind-registry.js +1 -27
  508. package/dist/sdk/graph.js +1 -15
  509. package/dist/sdk/guide-topics.js +1 -707
  510. package/dist/sdk/guide.js +1 -279
  511. package/dist/sdk/history/maintenance.d.ts +71 -0
  512. package/dist/sdk/history/maintenance.js +2 -0
  513. package/dist/sdk/history/salvage.js +2 -247
  514. package/dist/sdk/history/subject.d.ts +19 -0
  515. package/dist/sdk/history/subject.js +2 -0
  516. package/dist/sdk/history-analytics.js +1 -282
  517. package/dist/sdk/history-compact.js +1 -527
  518. package/dist/sdk/history-mcp.js +1 -68
  519. package/dist/sdk/history-provenance.js +1 -182
  520. package/dist/sdk/history-read.js +1 -96
  521. package/dist/sdk/history-redact.d.ts +1 -14
  522. package/dist/sdk/history-redact.js +1 -643
  523. package/dist/sdk/history-repair.d.ts +5 -0
  524. package/dist/sdk/history-repair.js +1 -657
  525. package/dist/sdk/improvement-ledger-validation.js +1 -62
  526. package/dist/sdk/improvement-ledger.js +2 -257
  527. package/dist/sdk/index.d.ts +4 -1
  528. package/dist/sdk/index.js +1 -183
  529. package/dist/sdk/init-agent-guidance.js +2 -496
  530. package/dist/sdk/init.js +2 -820
  531. package/dist/sdk/invocation-author.js +1 -39
  532. package/dist/sdk/item-children.js +1 -90
  533. package/dist/sdk/item-metadata-index.js +1 -15
  534. package/dist/sdk/item-schedule.js +1 -27
  535. package/dist/sdk/item-transaction.js +1 -396
  536. package/dist/sdk/learnings.js +1 -29
  537. package/dist/sdk/lifecycle/append.js +2 -53
  538. package/dist/sdk/lifecycle/claim.d.ts +2 -0
  539. package/dist/sdk/lifecycle/claim.js +1 -242
  540. package/dist/sdk/lifecycle/close-many.js +1 -438
  541. package/dist/sdk/lifecycle/close.js +1 -468
  542. package/dist/sdk/lifecycle/copy.js +1 -212
  543. package/dist/sdk/lifecycle/create.js +1 -1949
  544. package/dist/sdk/lifecycle/delete.js +1 -45
  545. package/dist/sdk/lifecycle/event-validation-messages.js +1 -91
  546. package/dist/sdk/lifecycle/focus.js +1 -91
  547. package/dist/sdk/lifecycle/hierarchy-mutation-lock.js +1 -24
  548. package/dist/sdk/lifecycle/legacy-none-tokens.js +1 -149
  549. package/dist/sdk/lifecycle/lifecycle-transitions.js +1 -40
  550. package/dist/sdk/lifecycle/mcp-actions.d.ts +2 -0
  551. package/dist/sdk/lifecycle/mcp-actions.js +1 -51
  552. package/dist/sdk/lifecycle/metadata-normalizers.js +1 -46
  553. package/dist/sdk/lifecycle/mutation-command-options.js +1 -9
  554. package/dist/sdk/lifecycle/plan.js +1 -1606
  555. package/dist/sdk/lifecycle/recurrence-parsers.d.ts +1 -1
  556. package/dist/sdk/lifecycle/recurrence-parsers.js +1 -147
  557. package/dist/sdk/lifecycle/reopen.js +1 -68
  558. package/dist/sdk/lifecycle/repeatable-metadata-parsers.js +1 -143
  559. package/dist/sdk/lifecycle/restore.d.ts +1 -0
  560. package/dist/sdk/lifecycle/restore.js +1 -330
  561. package/dist/sdk/lifecycle/shared-unset-fields.js +1 -295
  562. package/dist/sdk/lifecycle/update-many.js +1 -861
  563. package/dist/sdk/lifecycle/update.js +1 -2136
  564. package/dist/sdk/lifecycle-completion.js +1 -92
  565. package/dist/sdk/lifecycle-policy.js +1 -120
  566. package/dist/sdk/linked-artifacts.js +1 -530
  567. package/dist/sdk/mcp/apps.js +4 -133
  568. package/dist/sdk/mcp/authorization.js +1 -404
  569. package/dist/sdk/mcp/discovery.js +1 -494
  570. package/dist/sdk/mcp/interactions.js +1 -336
  571. package/dist/sdk/mcp/protocol.d.ts +7 -0
  572. package/dist/sdk/mcp/protocol.js +1 -184
  573. package/dist/sdk/mcp/skills.js +1 -389
  574. package/dist/sdk/mcp/subscriptions.js +1 -211
  575. package/dist/sdk/mcp/tasks.js +2 -430
  576. package/dist/sdk/mcp/transport.js +1 -260
  577. package/dist/sdk/merge/abandoned-receipts.js +1 -46
  578. package/dist/sdk/merge/driver.js +1 -212
  579. package/dist/sdk/merge/index.js +1 -16
  580. package/dist/sdk/merge/install.js +3 -561
  581. package/dist/sdk/merge/receipt-file-boundary.js +1 -46
  582. package/dist/sdk/merge/receipt-operation.js +1 -96
  583. package/dist/sdk/merge/receipt-schema.js +1 -397
  584. package/dist/sdk/merge/receipts.js +4 -525
  585. package/dist/sdk/merge/reconcile.js +1 -352
  586. package/dist/sdk/merge/three-way.js +3 -775
  587. package/dist/sdk/merge.js +1 -10
  588. package/dist/sdk/mutation-events.js +1 -292
  589. package/dist/sdk/mutation-guard.js +1 -216
  590. package/dist/sdk/notes.js +1 -139
  591. package/dist/sdk/output-contracts.js +1 -172
  592. package/dist/sdk/output-projection.js +1 -430
  593. package/dist/sdk/output-token-accounting.js +1 -140
  594. package/dist/sdk/output.js +1 -64
  595. package/dist/sdk/ownership-source.js +1 -21
  596. package/dist/sdk/package-import-adapters.js +1 -442
  597. package/dist/sdk/package-migrations.js +1 -20
  598. package/dist/sdk/package-runtime-options.js +1 -80
  599. package/dist/sdk/pagination.js +1 -162
  600. package/dist/sdk/profile.js +1 -454
  601. package/dist/sdk/provenance.js +1 -258
  602. package/dist/sdk/public-surface.json +1 -1
  603. package/dist/sdk/query/activity.js +1 -401
  604. package/dist/sdk/query/aggregate.d.ts +16 -0
  605. package/dist/sdk/query/aggregate.js +1 -390
  606. package/dist/sdk/query/calendar.js +1 -964
  607. package/dist/sdk/query/complete-list.js +1 -215
  608. package/dist/sdk/query/context.js +1 -1702
  609. package/dist/sdk/query/duplicate-candidates.js +1 -70
  610. package/dist/sdk/query/get.js +1 -450
  611. package/dist/sdk/query/history.js +1 -186
  612. package/dist/sdk/query/item-filter-options.js +1 -9
  613. package/dist/sdk/query/light-metadata.js +1 -18
  614. package/dist/sdk/query/list-filter-shared.js +1 -81
  615. package/dist/sdk/query/list.js +1 -1304
  616. package/dist/sdk/query/multi-value-filters.js +1 -78
  617. package/dist/sdk/query/next.js +1 -513
  618. package/dist/sdk/query/parsers.js +1 -44
  619. package/dist/sdk/query/projection-contracts.js +1 -184
  620. package/dist/sdk/query/search-contracts.d.ts +27 -0
  621. package/dist/sdk/query/search-contracts.js +1 -230
  622. package/dist/sdk/query/search-pagination.js +1 -35
  623. package/dist/sdk/query/search-rendering.js +1 -105
  624. package/dist/sdk/query/search.d.ts +6 -4
  625. package/dist/sdk/query/search.js +2 -1987
  626. package/dist/sdk/query.js +1 -35
  627. package/dist/sdk/read-output/continuation.js +1 -194
  628. package/dist/sdk/read-output-budget.js +1 -135
  629. package/dist/sdk/read-output-contracts.d.ts +1 -1
  630. package/dist/sdk/read-output-contracts.js +1 -1225
  631. package/dist/sdk/read-output-rows.js +1 -186
  632. package/dist/sdk/read-output-session.js +1 -208
  633. package/dist/sdk/relationship-analytics.js +1 -410
  634. package/dist/sdk/relationship-context.js +1 -284
  635. package/dist/sdk/relationship-history.js +4 -519
  636. package/dist/sdk/relationship-kinds/contract.js +1 -22
  637. package/dist/sdk/relationship-migration.js +1 -77
  638. package/dist/sdk/relationships.js +1 -579
  639. package/dist/sdk/reproducibility/process.js +1 -87
  640. package/dist/sdk/runtime-action-aliases.js +1 -59
  641. package/dist/sdk/runtime-extended-actions.js +1 -177
  642. package/dist/sdk/runtime-input.js +1 -614
  643. package/dist/sdk/runtime-primitives.js +1 -84
  644. package/dist/sdk/runtime-public-contracts.d.ts +2 -1
  645. package/dist/sdk/runtime-public-contracts.js +1 -4
  646. package/dist/sdk/runtime-stats-options.js +1 -38
  647. package/dist/sdk/runtime.d.ts +4 -0
  648. package/dist/sdk/runtime.js +1 -1928
  649. package/dist/sdk/scheduling-shortcuts.js +1 -63
  650. package/dist/sdk/schema-migration.js +3 -856
  651. package/dist/sdk/schema.d.ts +2 -1
  652. package/dist/sdk/schema.js +1 -1376
  653. package/dist/sdk/search-refresh-worker.js +1 -18
  654. package/dist/sdk/similarity-scoring.js +1 -53
  655. package/dist/sdk/similarity.js +1 -326
  656. package/dist/sdk/start-task-status.js +1 -14
  657. package/dist/sdk/stats.js +1 -270
  658. package/dist/sdk/structured-mutations.js +1 -580
  659. package/dist/sdk/telemetry-flush.js +1 -13
  660. package/dist/sdk/telemetry.js +1 -405
  661. package/dist/sdk/templates.js +2 -292
  662. package/dist/sdk/test/batch.js +2 -509
  663. package/dist/sdk/test/entry.js +1 -70
  664. package/dist/sdk/test/execution.js +6 -2211
  665. package/dist/sdk/test/linked-command-detection.js +1 -546
  666. package/dist/sdk/test/measurements.js +1 -91
  667. package/dist/sdk/test/parsers.js +1 -545
  668. package/dist/sdk/test/runs.js +1 -193
  669. package/dist/sdk/test/trust.js +2 -206
  670. package/dist/sdk/testing.js +4 -1391
  671. package/dist/sdk/traceability/runtime-files-lookup.js +1 -32
  672. package/dist/sdk/traceability/source-traceability.js +1 -292
  673. package/dist/sdk/tracker-root-discovery.js +1 -9
  674. package/dist/sdk/workspace-contracts-cache.js +1 -28
  675. package/dist/sdk/workspace-contracts.js +1 -33
  676. package/dist/sdk/workspace-memory.js +2 -318
  677. package/dist/sdk/workspace-recipe.js +1 -71
  678. package/dist/sdk/workspace-snapshot.js +4 -613
  679. package/dist/sdk/workspace-transaction-gc.js +1 -149
  680. package/dist/sdk/workspace-transaction.js +2 -363
  681. package/dist/sdk/workspace.js +3 -127
  682. package/dist/types/index.js +1 -9
  683. package/dist/types.d.ts +4 -0
  684. package/dist/types.js +1 -245
  685. package/docs/AGENT_GUIDE.md +1 -1
  686. package/docs/COMMANDS.md +10 -0
  687. package/docs/CONFIGURATION.md +12 -1
  688. package/docs/CONTEXT_ALGORITHM_PORTFOLIO.md +167 -0
  689. package/docs/DIAGNOSTIC_OUTPUT_CONTRACTS.md +9 -3
  690. package/docs/EXTENSIONS.md +1 -0
  691. package/docs/HISTORY_MAINTENANCE.md +125 -0
  692. package/docs/MCP_2026_07_28_CONFORMANCE.md +20 -10
  693. package/docs/PACKAGE_EVIDENCE.md +92 -0
  694. package/docs/PLANNING_MEASUREMENTS.md +183 -0
  695. package/docs/README.md +4 -0
  696. package/docs/READ_OUTPUT_CONTRACTS.md +5 -0
  697. package/docs/SCRIPTING.md +21 -0
  698. package/docs/TESTING.md +33 -0
  699. package/docs/WORKFLOW_POLICIES.md +129 -0
  700. package/docs/generated/FLAG_LEXICON_BUDGETS.md +7 -7
  701. package/docs/generated/REFUSAL_CLOSURE_CENSUS.md +11 -5
  702. package/marketplace.json +2 -2
  703. package/package.json +5 -5
  704. package/packages/pm-beads/package.json +1 -1
  705. package/packages/pm-calendar/package.json +1 -1
  706. package/packages/pm-command-kit/package.json +1 -1
  707. package/packages/pm-digital-twin/package.json +1 -1
  708. package/packages/pm-governance-audit/package.json +1 -1
  709. package/packages/pm-guide-shell/package.json +1 -1
  710. package/packages/pm-kanban/package.json +1 -1
  711. package/packages/pm-lifecycle-hooks/package.json +1 -1
  712. package/packages/pm-linked-test-adapters/package.json +1 -1
  713. package/packages/pm-search-advanced/package.json +1 -1
  714. package/packages/pm-templates/package.json +1 -1
  715. package/packages/pm-todos/package.json +1 -1
  716. package/packages/pm-vcs/package.json +1 -1
  717. package/plugins/pm-claude/.claude-plugin/plugin.json +1 -1
  718. package/plugins/pm-codex/.codex-plugin/plugin.json +1 -1
  719. package/scripts/finalize-build.mjs +45 -3
  720. package/dist/cli-bundle/chunks/chunk-AZDFJGH6.js +0 -9
  721. package/dist/cli-bundle/chunks/chunk-CKOL5U7J.js +0 -77
  722. package/dist/cli-bundle/chunks/chunk-JX4DH4WC.js +0 -3
  723. package/dist/cli-bundle/chunks/chunk-OF76PSDQ.js +0 -5
  724. package/dist/cli-bundle/chunks/chunk-QUWFABDM.js +0 -232
  725. package/dist/cli-bundle/chunks/chunk-QWRRFYK3.js +0 -2
  726. package/dist/cli-bundle/chunks/chunk-RWWBOWJ5.js +0 -2
  727. package/dist/cli-bundle/chunks/chunk-WGAOYSYH.js +0 -40
  728. package/dist/cli-bundle/chunks/chunk-WI2AYPA7.js +0 -2
  729. package/dist/cli-bundle/chunks/register-list-query-5JL52D33.js +0 -11
  730. package/dist/cli-bundle/chunks/register-mutation-ZPG7KMVP.js +0 -20
  731. package/dist/cli-bundle/chunks/register-operations-I5W3KMGB.js +0 -2
  732. package/dist/cli-bundle/chunks/register-setup-H4SVAVX7.js +0 -2
  733. package/dist/cli-bundle/focused-chunks/chunk-AL5ON6K6.js +0 -2
  734. package/dist/cli-bundle/focused-chunks/chunk-CHC2IDXA.js +0 -6
  735. package/dist/cli-bundle/focused-chunks/chunk-CK6QFAPZ.js +0 -20
  736. package/dist/cli-bundle/focused-chunks/chunk-EZR3GHFE.js +0 -2
  737. package/dist/cli-bundle/focused-chunks/chunk-H2WJWK7L.js +0 -56
  738. package/dist/cli-bundle/focused-chunks/chunk-NTPY5GSO.js +0 -3
  739. package/dist/cli-bundle/focused-chunks/chunk-P5O7MP5Y.js +0 -2
  740. package/dist/cli-bundle/focused-chunks/chunk-PDMW2E36.js +0 -177
  741. package/dist/cli-bundle/focused-chunks/chunk-PEFABF7E.js +0 -26
  742. package/dist/cli-bundle/focused-chunks/chunk-QTVCLMSZ.js +0 -6
  743. package/dist/cli-bundle/focused-chunks/chunk-QTZRBUYA.js +0 -8
  744. package/dist/cli-bundle/focused-chunks/chunk-SGQST3PQ.js +0 -12
  745. package/dist/cli-bundle/focused-chunks/chunk-UKHASMMP.js +0 -10
  746. 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