@unbrained/pm-cli 2026.9.6 → 2026.9.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (719) hide show
  1. package/.agents/skills/pm-developer/SKILL.md +12 -4
  2. package/.agents/skills/pm-developer/references/MULTI_AGENT_MERGE.md +19 -10
  3. package/.agents/skills/pm-extensions/SKILL.md +6 -0
  4. package/.agents/skills/pm-sdk/SKILL.md +11 -2
  5. package/.agents/skills/pm-user/SKILL.md +5 -0
  6. package/.agents/skills/pm-user/references/ECOSYSTEM_PLANNING.md +95 -0
  7. package/.claude-plugin/marketplace.json +2 -2
  8. package/CHANGELOG.md +218 -182
  9. package/dist/cli/after-command-context-usage.js +1 -48
  10. package/dist/cli/argv-utils.js +1 -40
  11. package/dist/cli/bootstrap-args.js +1 -9
  12. package/dist/cli/bundle-integrity.js +2 -110
  13. package/dist/cli/commander-usage.js +11 -771
  14. package/dist/cli/commands/activity.js +1 -9
  15. package/dist/cli/commands/aggregate.js +1 -5
  16. package/dist/cli/commands/append.js +1 -5
  17. package/dist/cli/commands/claim.js +1 -5
  18. package/dist/cli/commands/close-many.js +1 -5
  19. package/dist/cli/commands/close.js +1 -9
  20. package/dist/cli/commands/comments.js +1 -5
  21. package/dist/cli/commands/config.js +1 -9
  22. package/dist/cli/commands/context.js +1 -9
  23. package/dist/cli/commands/contracts.js +1 -5
  24. package/dist/cli/commands/copy.js +1 -9
  25. package/dist/cli/commands/create.js +1 -9
  26. package/dist/cli/commands/delete.js +1 -9
  27. package/dist/cli/commands/deps.js +1 -9
  28. package/dist/cli/commands/docs.js +1 -9
  29. package/dist/cli/commands/duplicates.js +1 -9
  30. package/dist/cli/commands/eval.js +1 -9
  31. package/dist/cli/commands/extension/describe.js +1 -5
  32. package/dist/cli/commands/extension/scaffold.js +1 -5
  33. package/dist/cli/commands/extension/shared.js +1 -5
  34. package/dist/cli/commands/extension.js +1 -9
  35. package/dist/cli/commands/files.js +1 -9
  36. package/dist/cli/commands/focus.js +1 -9
  37. package/dist/cli/commands/gc.js +1 -9
  38. package/dist/cli/commands/get.js +1 -9
  39. package/dist/cli/commands/graph.js +1 -10
  40. package/dist/cli/commands/health.js +1 -9
  41. package/dist/cli/commands/history-compact.js +1 -10
  42. package/dist/cli/commands/history-redact.js +1 -11
  43. package/dist/cli/commands/history-repair.js +1 -10
  44. package/dist/cli/commands/history.js +1 -5
  45. package/dist/cli/commands/index.js +1 -58
  46. package/dist/cli/commands/init-agent-guidance.js +1 -9
  47. package/dist/cli/commands/init.js +1 -9
  48. package/dist/cli/commands/learnings.js +1 -5
  49. package/dist/cli/commands/lifecycle-transitions.js +1 -5
  50. package/dist/cli/commands/list.js +1 -9
  51. package/dist/cli/commands/merge.js +1 -11
  52. package/dist/cli/commands/next.js +1 -9
  53. package/dist/cli/commands/notes.js +1 -5
  54. package/dist/cli/commands/plan.js +1 -9
  55. package/dist/cli/commands/profile.js +1 -9
  56. package/dist/cli/commands/restore.js +1 -9
  57. package/dist/cli/commands/scheduling-shortcuts.js +1 -9
  58. package/dist/cli/commands/schema.js +1 -10
  59. package/dist/cli/commands/search.js +1 -9
  60. package/dist/cli/commands/stats.js +1 -9
  61. package/dist/cli/commands/telemetry.js +1 -9
  62. package/dist/cli/commands/test-all.js +1 -9
  63. package/dist/cli/commands/test-runs.js +1 -9
  64. package/dist/cli/commands/test.js +1 -9
  65. package/dist/cli/commands/update-many.js +1 -5
  66. package/dist/cli/commands/update.js +1 -9
  67. package/dist/cli/commands/upgrade.js +1 -5
  68. package/dist/cli/commands/validate.js +1 -15
  69. package/dist/cli/context-intent-invocation.js +1 -20
  70. package/dist/cli/description-stdin.js +1 -17
  71. package/dist/cli/error-guidance.js +1 -1353
  72. package/dist/cli/extension-command-help.js +5 -636
  73. package/dist/cli/extension-command-options.js +1 -427
  74. package/dist/cli/extension-recovery.js +1 -126
  75. package/dist/cli/help-content.js +2 -1001
  76. package/dist/cli/help-json-payload.js +4 -570
  77. package/dist/cli/main.d.ts +4 -0
  78. package/dist/cli/main.js +5 -2573
  79. package/dist/cli/migration-gates.js +1 -289
  80. package/dist/cli/public.js +1 -20
  81. package/dist/cli/register-annotations.js +1 -270
  82. package/dist/cli/register-assurance.js +1 -62
  83. package/dist/cli/register-files-lookup.js +1 -56
  84. package/dist/cli/register-history-activity.d.ts +8 -0
  85. package/dist/cli/register-history-activity.js +2 -0
  86. package/dist/cli/register-history-author.js +1 -38
  87. package/dist/cli/register-history-maintenance.d.ts +9 -0
  88. package/dist/cli/register-history-maintenance.js +2 -0
  89. package/dist/cli/register-list-query.js +10 -943
  90. package/dist/cli/register-mutation-options.js +1 -9
  91. package/dist/cli/register-mutation.js +19 -1893
  92. package/dist/cli/register-operations.js +1 -920
  93. package/dist/cli/register-setup.js +1 -716
  94. package/dist/cli/register-structured-mutation.js +1 -196
  95. package/dist/cli/registration-helpers.js +1 -5
  96. package/dist/cli/runtime-compatibility-boundary.js +4 -42
  97. package/dist/cli/schema-registration-helpers.js +1 -73
  98. package/dist/cli/search-refresh.js +1 -13
  99. package/dist/cli/stats-analytics-json.js +1 -68
  100. package/dist/cli/telemetry-flush.js +1 -10
  101. package/dist/cli-bundle/bundle-manifest.json +164 -156
  102. package/dist/cli-bundle/chunks/chunk-3BZZA6A3.js +5 -0
  103. package/dist/cli-bundle/chunks/chunk-AMRDVX36.js +235 -0
  104. package/dist/cli-bundle/chunks/chunk-DAM4CBBR.js +2202 -0
  105. package/dist/cli-bundle/chunks/{chunk-WYRZZ5ZE.js → chunk-DEZPZOQ7.js} +2 -2
  106. package/dist/cli-bundle/chunks/chunk-FLDWYEND.js +77 -0
  107. package/dist/cli-bundle/chunks/{chunk-NPN5I67J.js → chunk-G5ADGQ2D.js} +3 -3
  108. package/dist/cli-bundle/chunks/chunk-JAAEYHUA.js +2 -0
  109. package/dist/cli-bundle/chunks/{chunk-JX4DH4WC.js → chunk-KR3RP4FH.js} +3 -3
  110. package/dist/cli-bundle/chunks/chunk-LEZOUXG6.js +2 -0
  111. package/dist/cli-bundle/chunks/chunk-NSAPNEYH.js +2 -0
  112. package/dist/cli-bundle/chunks/chunk-QOEKOECV.js +29 -0
  113. package/dist/cli-bundle/chunks/chunk-RHSFOMHU.js +2 -0
  114. package/dist/cli-bundle/chunks/chunk-XOD2PCB6.js +20 -0
  115. package/dist/cli-bundle/chunks/{chunk-JT6XF6GE.js → chunk-YVEQ2AMO.js} +4 -4
  116. package/dist/cli-bundle/chunks/register-list-query-KSK3R63M.js +11 -0
  117. package/dist/cli-bundle/chunks/register-mutation-IQ5C7U6O.js +20 -0
  118. package/dist/cli-bundle/chunks/{register-operations-I5W3KMGB.js → register-operations-DWVHR2NC.js} +2 -2
  119. package/dist/cli-bundle/chunks/register-setup-BQ5SVD4B.js +2 -0
  120. package/dist/cli-bundle/focused-chunks/chunk-3WRPWLA7.js +3 -0
  121. package/dist/cli-bundle/focused-chunks/chunk-7MBUII7U.js +2 -0
  122. package/dist/cli-bundle/focused-chunks/chunk-COPBO5HW.js +8 -0
  123. package/dist/cli-bundle/focused-chunks/chunk-DUN4IXYN.js +20 -0
  124. package/dist/cli-bundle/focused-chunks/{chunk-LIJIA4TY.js → chunk-EE5QSM4Z.js} +3 -3
  125. package/dist/cli-bundle/focused-chunks/chunk-HJVARYM3.js +6 -0
  126. package/dist/cli-bundle/focused-chunks/chunk-IAUOUGVR.js +177 -0
  127. package/dist/cli-bundle/focused-chunks/chunk-KOOMJ54F.js +2 -0
  128. package/dist/cli-bundle/focused-chunks/chunk-MZDXX7JY.js +56 -0
  129. package/dist/cli-bundle/focused-chunks/{chunk-M6PBRFSH.js → chunk-OPFHFGDD.js} +2 -2
  130. package/dist/cli-bundle/focused-chunks/chunk-QHNETP77.js +9 -0
  131. package/dist/cli-bundle/focused-chunks/{chunk-3BZEOXLT.js → chunk-RMWES4M6.js} +2 -2
  132. package/dist/cli-bundle/focused-chunks/chunk-RXT4P5QH.js +10 -0
  133. package/dist/cli-bundle/focused-chunks/chunk-SDOL6FM2.js +12 -0
  134. package/dist/cli-bundle/focused-chunks/chunk-SQV4AAUC.js +2 -0
  135. package/dist/cli-bundle/focused-chunks/{chunk-PEFABF7E.js → chunk-WE3IUNIW.js} +3 -3
  136. package/dist/cli-bundle/focused-chunks/chunk-YALOUBWJ.js +2 -0
  137. package/dist/cli-bundle/main.js +20 -20
  138. package/dist/cli-bundle/sdk-authoring.js +1 -1
  139. package/dist/cli-bundle/sdk-contracts.js +2 -2
  140. package/dist/cli-bundle/sdk-core.js +29 -29
  141. package/dist/cli-bundle/sdk-governance.js +1 -1
  142. package/dist/cli-bundle/sdk-graph.js +1 -1
  143. package/dist/cli-bundle/sdk-merge.js +42 -42
  144. package/dist/cli-bundle/sdk-query.js +1 -1
  145. package/dist/cli-bundle/sdk-runtime.js +1 -1
  146. package/dist/cli-bundle/sdk-testing.js +1 -1
  147. package/dist/cli-bundle/sdk.js +11 -11
  148. package/dist/cli.js +1 -104
  149. package/dist/core/checkpoint/checkpoint-gc.js +1 -169
  150. package/dist/core/checkpoint/mutation-checkpoint.js +2 -133
  151. package/dist/core/config/nested-settings.js +1 -534
  152. package/dist/core/config/positional-value.js +1 -109
  153. package/dist/core/diagnostics/remediation.js +1 -506
  154. package/dist/core/extensions/activation-summary-markdown.js +2 -145
  155. package/dist/core/extensions/activation-summary.js +1 -92
  156. package/dist/core/extensions/activation-transaction.js +1 -46
  157. package/dist/core/extensions/capability-usage.js +1 -173
  158. package/dist/core/extensions/command-hook-context.js +1 -13
  159. package/dist/core/extensions/command-metadata-contract.js +1 -22
  160. package/dist/core/extensions/command-visibility-tier.js +1 -29
  161. package/dist/core/extensions/contribution-inventory.js +1 -173
  162. package/dist/core/extensions/exporter-output-contract.js +1 -66
  163. package/dist/core/extensions/extension-candidate.js +1 -18
  164. package/dist/core/extensions/extension-capability-aliases.js +1 -158
  165. package/dist/core/extensions/extension-hook-runtime.js +1 -699
  166. package/dist/core/extensions/extension-policy.js +1 -599
  167. package/dist/core/extensions/extension-registries.js +1 -62
  168. package/dist/core/extensions/extension-runtime-helpers.js +1 -33
  169. package/dist/core/extensions/extension-types.js +1 -102
  170. package/dist/core/extensions/flag-definition-validation.js +1 -52
  171. package/dist/core/extensions/flag-value-types.js +1 -64
  172. package/dist/core/extensions/index.js +1 -526
  173. package/dist/core/extensions/item-field-types.js +1 -39
  174. package/dist/core/extensions/item-fields.js +1 -261
  175. package/dist/core/extensions/loader.js +1 -2223
  176. package/dist/core/extensions/manifest-schema.js +1 -69
  177. package/dist/core/extensions/module-graph-snapshot.js +1 -33
  178. package/dist/core/extensions/preflight-ownership.js +1 -41
  179. package/dist/core/extensions/registration-validation.js +1 -82
  180. package/dist/core/extensions/registration-values.js +1 -209
  181. package/dist/core/extensions/reserved-host-flags.js +1 -36
  182. package/dist/core/extensions/runtime-registrations.js +1 -67
  183. package/dist/core/extensions/service-ownership.js +1 -19
  184. package/dist/core/extensions/version-compat.js +1 -216
  185. package/dist/core/fs/fs-utils.js +2 -158
  186. package/dist/core/fs/host-environment-errors.js +1 -141
  187. package/dist/core/fs/index.js +1 -9
  188. package/dist/core/fs/path-utils.js +1 -17
  189. package/dist/core/governance/content-fields.js +1 -160
  190. package/dist/core/governance/issue-codes.js +1 -151
  191. package/dist/core/governance/metadata-coverage.js +1 -358
  192. package/dist/core/history/drift-cache.js +3 -72
  193. package/dist/core/history/drift-scan.js +1 -342
  194. package/dist/core/history/event-classification.js +1 -109
  195. package/dist/core/history/event-index.js +8 -784
  196. package/dist/core/history/history-compact-bulk.js +1 -104
  197. package/dist/core/history/history-diff.js +1 -158
  198. package/dist/core/history/history-rewrite.d.ts +6 -1
  199. package/dist/core/history/history-rewrite.js +1 -107
  200. package/dist/core/history/history-storage-stats.js +1 -102
  201. package/dist/core/history/history-stream-policy.js +1 -62
  202. package/dist/core/history/history.js +2 -617
  203. package/dist/core/history/identity.js +1 -30
  204. package/dist/core/history/index.js +1 -9
  205. package/dist/core/history/projection.js +1 -196
  206. package/dist/core/history/read.d.ts +9 -0
  207. package/dist/core/history/read.js +1 -57
  208. package/dist/core/history/replay.js +2 -439
  209. package/dist/core/history/version-address.js +1 -32
  210. package/dist/core/history/workspace-history.js +2 -433
  211. package/dist/core/io/body-file.js +1 -62
  212. package/dist/core/io/bulk-ids-input.js +1 -112
  213. package/dist/core/item/actionability.js +1 -327
  214. package/dist/core/item/dependency-reference.js +1 -20
  215. package/dist/core/item/id.js +1 -112
  216. package/dist/core/item/index.js +1 -12
  217. package/dist/core/item/item-format-version.js +1 -78
  218. package/dist/core/item/item-format.js +5 -1473
  219. package/dist/core/item/item-record.js +1 -23
  220. package/dist/core/item/item-type-definition.js +1 -133
  221. package/dist/core/item/parent-reference-policy.js +1 -57
  222. package/dist/core/item/parse.js +2 -603
  223. package/dist/core/item/plan-lifecycle.js +1 -19
  224. package/dist/core/item/priority.js +1 -61
  225. package/dist/core/item/sprint-release-format.js +1 -38
  226. package/dist/core/item/status-filter.js +1 -115
  227. package/dist/core/item/status.js +1 -43
  228. package/dist/core/item/toon-decode.js +1 -29
  229. package/dist/core/item/type-registry.js +1 -715
  230. package/dist/core/item/type-synonyms.js +1 -38
  231. package/dist/core/lock/index.js +1 -9
  232. package/dist/core/lock/lock-gc.js +1 -240
  233. package/dist/core/lock/lock.js +3 -590
  234. package/dist/core/output/mutation-projection.js +1 -217
  235. package/dist/core/output/output-control.js +1 -25
  236. package/dist/core/output/output.js +11 -494
  237. package/dist/core/output/query-summary.js +1 -58
  238. package/dist/core/output/tabular.js +1 -77
  239. package/dist/core/packages/manifest.js +1 -244
  240. package/dist/core/packages/root.js +1 -84
  241. package/dist/core/profile/profile-describe.js +1 -83
  242. package/dist/core/profile/profile-lint.js +1 -415
  243. package/dist/core/profile/profile-plan.js +0 -0
  244. package/dist/core/profile/profile-presets.js +1 -370
  245. package/dist/core/reproducibility/context.js +1 -82
  246. package/dist/core/schema/fields-file.js +2 -288
  247. package/dist/core/schema/item-types-file.js +2 -296
  248. package/dist/core/schema/runtime-field-filters.js +1 -49
  249. package/dist/core/schema/runtime-field-values.js +1 -313
  250. package/dist/core/schema/runtime-schema.js +2 -826
  251. package/dist/core/schema/status-defs-file.js +2 -227
  252. package/dist/core/schema/status-token.js +1 -31
  253. package/dist/core/schema/type-inference.js +1 -95
  254. package/dist/core/schema/type-presets.js +1 -87
  255. package/dist/core/schema/type-workflows.js +1 -104
  256. package/dist/core/search/background-refresh.js +2 -286
  257. package/dist/core/search/bm25.js +1 -146
  258. package/dist/core/search/cache.js +2 -534
  259. package/dist/core/search/corpus.js +1 -311
  260. package/dist/core/search/embedding-batches.js +1 -163
  261. package/dist/core/search/eval.js +1 -225
  262. package/dist/core/search/http-client.js +1 -75
  263. package/dist/core/search/providers.js +1 -242
  264. package/dist/core/search/relevance.js +1 -244
  265. package/dist/core/search/semantic-defaults.js +1 -199
  266. package/dist/core/search/staleness.js +1 -30
  267. package/dist/core/search/vector-stores.js +2 -664
  268. package/dist/core/search/vectorization-metadata.js +1 -81
  269. package/dist/core/sentry/helpers.js +1 -272
  270. package/dist/core/sentry/instrument.js +1 -387
  271. package/dist/core/session/session-state.js +1 -260
  272. package/dist/core/shared/agent-session-context.js +1 -133
  273. package/dist/core/shared/author.js +1 -1172
  274. package/dist/core/shared/command-types.js +1 -4
  275. package/dist/core/shared/conflict-markers.js +1 -31
  276. package/dist/core/shared/constants.js +1 -405
  277. package/dist/core/shared/errors.js +1 -20
  278. package/dist/core/shared/html-entity-decode.js +1 -131
  279. package/dist/core/shared/index.js +1 -12
  280. package/dist/core/shared/item-metadata-contract.js +1 -89
  281. package/dist/core/shared/lazy-module.js +1 -16
  282. package/dist/core/shared/levenshtein.js +1 -61
  283. package/dist/core/shared/memo.js +1 -19
  284. package/dist/core/shared/numeric-parsers.js +1 -20
  285. package/dist/core/shared/option-alias-visibility.js +1 -67
  286. package/dist/core/shared/primitives.js +1 -127
  287. package/dist/core/shared/serial-queue.js +1 -79
  288. package/dist/core/shared/serialization.js +1 -210
  289. package/dist/core/shared/split-comma-list.js +1 -30
  290. package/dist/core/shared/text-normalization.js +1 -38
  291. package/dist/core/shared/time.js +1 -306
  292. package/dist/core/store/index.js +1 -12
  293. package/dist/core/store/item-format-migration.js +1 -125
  294. package/dist/core/store/item-metadata-cache.js +1 -1116
  295. package/dist/core/store/item-metadata-query-index.js +9 -394
  296. package/dist/core/store/item-metadata-read-work.js +1 -43
  297. package/dist/core/store/item-store.js +1 -693
  298. package/dist/core/store/paths.d.ts +1 -1
  299. package/dist/core/store/paths.js +1 -214
  300. package/dist/core/store/settings-read-cache.js +1 -85
  301. package/dist/core/store/settings-validator.js +1 -421
  302. package/dist/core/store/settings.js +3 -1309
  303. package/dist/core/store/tracker-preflight.js +1 -141
  304. package/dist/core/telemetry/consent.js +5 -108
  305. package/dist/core/telemetry/observability.js +1 -246
  306. package/dist/core/telemetry/runtime.js +4 -1988
  307. package/dist/core/test/background-runs.js +4 -945
  308. package/dist/core/test/item-test-run-tracking.js +1 -63
  309. package/dist/core/test/run-selectors.js +1 -120
  310. package/dist/core/validate/estimate-defaults.js +1 -89
  311. package/dist/core/validate/fix-planning.js +1 -189
  312. package/dist/core/validate/linked-artifact-reference.js +1 -36
  313. package/dist/core/validate/missing-by-type.js +1 -34
  314. package/dist/core/validate/missing-link-owners.js +1 -95
  315. package/dist/core/validate/stale-file-classification.js +1 -82
  316. package/dist/mcp/http-server.js +5 -448
  317. package/dist/mcp/legacy-adapter.js +1 -77
  318. package/dist/mcp/runtime-capabilities.js +1 -200
  319. package/dist/mcp/server.js +4 -1233
  320. package/dist/mcp/tool-definitions.js +1 -804
  321. package/dist/sdk/actionability.js +1 -13
  322. package/dist/sdk/agent/closed-domain-contracts.js +1 -161
  323. package/dist/sdk/agent/command-recovery.js +1 -59
  324. package/dist/sdk/agent/command-suggestions.js +1 -66
  325. package/dist/sdk/agent/create-option-policy.js +1 -31
  326. package/dist/sdk/agent/identity-config.js +1 -106
  327. package/dist/sdk/agent/item-addressing.js +1 -207
  328. package/dist/sdk/agent/refusal-closure-census.js +1 -151
  329. package/dist/sdk/agent/refusal-closure.js +1 -133
  330. package/dist/sdk/agent/refusal-corpus-contracts.js +1 -193
  331. package/dist/sdk/agent/refusal-reachability.js +1 -593
  332. package/dist/sdk/agent/subcommand-recovery.js +1 -83
  333. package/dist/sdk/agent/task-transcript-contracts.js +1 -197
  334. package/dist/sdk/agent/tracker-preflight-contracts.js +1 -126
  335. package/dist/sdk/agent-capability-contracts.js +1 -428
  336. package/dist/sdk/agent-session-context.js +1 -9
  337. package/dist/sdk/annotations.js +1 -448
  338. package/dist/sdk/author-attribution.js +1 -468
  339. package/dist/sdk/authoring.js +1 -20
  340. package/dist/sdk/cli-bootstrap.js +1 -838
  341. package/dist/sdk/cli-contracts/agent-output-contracts.d.ts +1 -1
  342. package/dist/sdk/cli-contracts/agent-output-contracts.js +4 -476
  343. package/dist/sdk/cli-contracts/bootstrap-command-scanner.js +1 -79
  344. package/dist/sdk/cli-contracts/command-aliases.d.ts +4 -0
  345. package/dist/sdk/cli-contracts/command-aliases.js +1 -107
  346. package/dist/sdk/cli-contracts/command-exit-contracts.js +1 -151
  347. package/dist/sdk/cli-contracts/commander-mutation-options.js +1 -1081
  348. package/dist/sdk/cli-contracts/commander-types.js +1 -159
  349. package/dist/sdk/cli-contracts/completeness.js +1 -393
  350. package/dist/sdk/cli-contracts/enum-contracts.js +1 -222
  351. package/dist/sdk/cli-contracts/flag-contracts.js +1 -1947
  352. package/dist/sdk/cli-contracts/flag-lexicon-contracts.js +1 -347
  353. package/dist/sdk/cli-contracts/grammar-contracts.js +1 -986
  354. package/dist/sdk/cli-contracts/registration-helpers.js +7 -990
  355. package/dist/sdk/cli-contracts/runtime-contracts.d.ts +5 -0
  356. package/dist/sdk/cli-contracts/runtime-contracts.js +1 -2090
  357. package/dist/sdk/cli-contracts/schemas/assurance-definition.js +1 -324
  358. package/dist/sdk/cli-contracts/string-lists.js +1 -16
  359. package/dist/sdk/cli-contracts/tool-option-contracts.js +1 -461
  360. package/dist/sdk/cli-contracts/tool-parameter-tables.js +1 -2167
  361. package/dist/sdk/cli-contracts/tool-schema.d.ts +3 -1
  362. package/dist/sdk/cli-contracts/tool-schema.js +1 -1664
  363. package/dist/sdk/cli-contracts/typed-action-inputs.js +1 -4
  364. package/dist/sdk/cli-contracts.d.ts +1 -1
  365. package/dist/sdk/cli-contracts.js +1 -17
  366. package/dist/sdk/cli-program.js +1 -49
  367. package/dist/sdk/command-line.d.ts +2 -5
  368. package/dist/sdk/command-line.js +1 -78
  369. package/dist/sdk/comments.js +1 -133
  370. package/dist/sdk/compile-cache.js +1 -73
  371. package/dist/sdk/completion.js +157 -837
  372. package/dist/sdk/compose.js +1 -1090
  373. package/dist/sdk/config.js +1 -1204
  374. package/dist/sdk/context/recency.js +1 -33
  375. package/dist/sdk/context/semantic-session-attribution.js +1 -82
  376. package/dist/sdk/context/usage-egress.js +1 -29
  377. package/dist/sdk/context/usage-ledger.js +3 -185
  378. package/dist/sdk/context-intent-contracts.js +1 -709
  379. package/dist/sdk/context-intent-runtime.js +1 -115
  380. package/dist/sdk/context-packing.js +1 -218
  381. package/dist/sdk/context-relevance.js +1 -503
  382. package/dist/sdk/context-signal-store.js +2 -426
  383. package/dist/sdk/context-usage.js +1 -367
  384. package/dist/sdk/contracts.js +1 -23
  385. package/dist/sdk/core-governance.js +1 -14
  386. package/dist/sdk/core.js +1 -14
  387. package/dist/sdk/corpus-shape.js +1 -401
  388. package/dist/sdk/define.js +1 -220
  389. package/dist/sdk/dependencies.js +1 -718
  390. package/dist/sdk/dependency-flag-validation.js +1 -156
  391. package/dist/sdk/dependency-provenance.js +1 -135
  392. package/dist/sdk/docs.js +1 -14
  393. package/dist/sdk/duplicates.js +1 -40
  394. package/dist/sdk/environment/agent-environment.js +1 -466
  395. package/dist/sdk/environment/host-environment-errors.js +1 -8
  396. package/dist/sdk/environment/project-runtime-compatibility.js +1 -481
  397. package/dist/sdk/environment/source-context.js +1 -28
  398. package/dist/sdk/environment/tracker-preflight.js +1 -9
  399. package/dist/sdk/error-code-catalog.js +1 -153
  400. package/dist/sdk/error-runtime.js +1 -58
  401. package/dist/sdk/errors.js +1 -58
  402. package/dist/sdk/eval.js +1 -190
  403. package/dist/sdk/extension/author-manifest.js +1 -92
  404. package/dist/sdk/extension/bundled-catalog.js +1 -332
  405. package/dist/sdk/extension/concurrency.js +1 -25
  406. package/dist/sdk/extension/copy-scope.d.ts +2 -0
  407. package/dist/sdk/extension/copy-scope.js +2 -0
  408. package/dist/sdk/extension/custom-field-collisions.js +1 -30
  409. package/dist/sdk/extension/describe.js +3 -189
  410. package/dist/sdk/extension/doctor.js +1 -606
  411. package/dist/sdk/extension/install-plan.d.ts +69 -0
  412. package/dist/sdk/extension/install-plan.js +2 -0
  413. package/dist/sdk/extension/install-receipts.d.ts +7 -0
  414. package/dist/sdk/extension/install-receipts.js +2 -0
  415. package/dist/sdk/extension/install-runtime.js +3 -313
  416. package/dist/sdk/extension/install-snapshot.js +1 -66
  417. package/dist/sdk/extension/install-sources.js +5 -1057
  418. package/dist/sdk/extension/managed-state.js +2 -252
  419. package/dist/sdk/extension/migrations.js +2 -174
  420. package/dist/sdk/extension/output-ownership.js +1 -25
  421. package/dist/sdk/extension/runtime-summary.js +1 -18
  422. package/dist/sdk/extension/scaffold.js +4 -2308
  423. package/dist/sdk/extension/shared.js +1 -147
  424. package/dist/sdk/extension/source-resolution.js +1 -65
  425. package/dist/sdk/extension/update-check.js +1 -67
  426. package/dist/sdk/extension-command-context.js +1 -44
  427. package/dist/sdk/extension-contracts.js +1 -73
  428. package/dist/sdk/extension.d.ts +7 -2
  429. package/dist/sdk/extension.js +1 -2196
  430. package/dist/sdk/files.js +1 -535
  431. package/dist/sdk/flag-invocation-contracts.d.ts +0 -5
  432. package/dist/sdk/flag-invocation-contracts.js +1 -344
  433. package/dist/sdk/generated/generated-error-code-catalog-part-1.js +1 -2224
  434. package/dist/sdk/generated/generated-error-code-catalog-part-2.js +1 -2236
  435. package/dist/sdk/generated-error-code-catalog.js +1 -16
  436. package/dist/sdk/governance/assurance-action-contracts.js +1 -4
  437. package/dist/sdk/governance/assurance-action.js +1 -411
  438. package/dist/sdk/governance/assurance-limits.js +1 -10
  439. package/dist/sdk/governance/assurance-mutation-error.js +1 -81
  440. package/dist/sdk/governance/assurance-presets.js +1 -135
  441. package/dist/sdk/governance/assurance-runtime.js +1 -238
  442. package/dist/sdk/governance/assurance.js +4 -1182
  443. package/dist/sdk/governance/boundary-fixtures.js +1 -200
  444. package/dist/sdk/governance/coverage-assurance.js +1 -60
  445. package/dist/sdk/governance/defect-recurrence-coverage.js +1 -188
  446. package/dist/sdk/governance/defect-recurrence-graph.js +1 -120
  447. package/dist/sdk/governance/defect-recurrence-signals.js +1 -24
  448. package/dist/sdk/governance/defect-recurrence.js +1 -623
  449. package/dist/sdk/governance/extension-host-version.js +1 -115
  450. package/dist/sdk/governance/gc.js +1 -368
  451. package/dist/sdk/governance/health.js +1 -2367
  452. package/dist/sdk/governance/hierarchy-validation.js +1 -108
  453. package/dist/sdk/governance/linked-file-report.js +1 -71
  454. package/dist/sdk/governance/merge-receipt-history.js +1 -206
  455. package/dist/sdk/governance/provenance-health.js +1 -282
  456. package/dist/sdk/governance/reindex.js +4 -761
  457. package/dist/sdk/governance/stale-work.js +1 -82
  458. package/dist/sdk/governance/status-role-diagnostics.js +1 -35
  459. package/dist/sdk/governance/storage-integrity.js +1 -280
  460. package/dist/sdk/governance/tracked-runtime-cache.js +1 -106
  461. package/dist/sdk/governance/upgrade.js +2 -327
  462. package/dist/sdk/governance/validate-history-drift.js +1 -81
  463. package/dist/sdk/governance/validate-item-reader.js +1 -17
  464. package/dist/sdk/governance/validate-normalization.js +1 -36
  465. package/dist/sdk/governance/validate.js +1 -2261
  466. package/dist/sdk/governance/workspace-position.js +1 -163
  467. package/dist/sdk/governance.d.ts +1 -0
  468. package/dist/sdk/governance.js +1 -31
  469. package/dist/sdk/graph/adapter.js +1 -181
  470. package/dist/sdk/graph/analytics.js +1 -474
  471. package/dist/sdk/graph/assembly.js +1 -377
  472. package/dist/sdk/graph/cache.js +1 -160
  473. package/dist/sdk/graph/centrality.js +1 -258
  474. package/dist/sdk/graph/conformance.js +1 -130
  475. package/dist/sdk/graph/deadline-scheduling.d.ts +90 -0
  476. package/dist/sdk/graph/deadline-scheduling.js +2 -0
  477. package/dist/sdk/graph/durable-cache.d.ts +1 -1
  478. package/dist/sdk/graph/durable-cache.js +1 -361
  479. package/dist/sdk/graph/governance-contracts.js +1 -34
  480. package/dist/sdk/graph/governance.d.ts +13 -1
  481. package/dist/sdk/graph/governance.js +1 -735
  482. package/dist/sdk/graph/hierarchy-integrity.js +1 -310
  483. package/dist/sdk/graph/index.d.ts +3 -2
  484. package/dist/sdk/graph/index.js +1 -26
  485. package/dist/sdk/graph/lifecycle-coverage.d.ts +32 -0
  486. package/dist/sdk/graph/lifecycle-coverage.js +2 -0
  487. package/dist/sdk/graph/mutation-advisory.js +1 -176
  488. package/dist/sdk/graph/remediation.js +1 -197
  489. package/dist/sdk/graph/run.d.ts +15 -1
  490. package/dist/sdk/graph/run.js +1 -768
  491. package/dist/sdk/graph/scheduling.js +1 -124
  492. package/dist/sdk/graph/traversal.js +1 -284
  493. package/dist/sdk/graph/workspace-relationship-kind-registry.js +1 -27
  494. package/dist/sdk/graph.js +1 -15
  495. package/dist/sdk/guide-topics.js +1 -707
  496. package/dist/sdk/guide.js +1 -279
  497. package/dist/sdk/history/maintenance.d.ts +71 -0
  498. package/dist/sdk/history/maintenance.js +2 -0
  499. package/dist/sdk/history/salvage.js +2 -247
  500. package/dist/sdk/history/subject.d.ts +19 -0
  501. package/dist/sdk/history/subject.js +2 -0
  502. package/dist/sdk/history-analytics.js +1 -282
  503. package/dist/sdk/history-compact.js +1 -527
  504. package/dist/sdk/history-mcp.js +1 -68
  505. package/dist/sdk/history-provenance.js +1 -182
  506. package/dist/sdk/history-read.js +1 -96
  507. package/dist/sdk/history-redact.d.ts +1 -14
  508. package/dist/sdk/history-redact.js +1 -643
  509. package/dist/sdk/history-repair.d.ts +5 -0
  510. package/dist/sdk/history-repair.js +1 -657
  511. package/dist/sdk/improvement-ledger-validation.js +1 -62
  512. package/dist/sdk/improvement-ledger.js +2 -257
  513. package/dist/sdk/index.d.ts +4 -0
  514. package/dist/sdk/index.js +1 -183
  515. package/dist/sdk/init-agent-guidance.js +2 -496
  516. package/dist/sdk/init.js +2 -820
  517. package/dist/sdk/invocation-author.js +1 -39
  518. package/dist/sdk/item-children.js +1 -90
  519. package/dist/sdk/item-metadata-index.js +1 -15
  520. package/dist/sdk/item-schedule.js +1 -27
  521. package/dist/sdk/item-transaction.js +1 -396
  522. package/dist/sdk/learnings.js +1 -29
  523. package/dist/sdk/lifecycle/append.js +2 -53
  524. package/dist/sdk/lifecycle/claim.d.ts +2 -0
  525. package/dist/sdk/lifecycle/claim.js +1 -242
  526. package/dist/sdk/lifecycle/close-many.js +1 -438
  527. package/dist/sdk/lifecycle/close.js +1 -468
  528. package/dist/sdk/lifecycle/copy.js +1 -212
  529. package/dist/sdk/lifecycle/create.js +1 -1949
  530. package/dist/sdk/lifecycle/delete.js +1 -45
  531. package/dist/sdk/lifecycle/event-validation-messages.js +1 -91
  532. package/dist/sdk/lifecycle/focus.js +1 -91
  533. package/dist/sdk/lifecycle/hierarchy-mutation-lock.js +1 -24
  534. package/dist/sdk/lifecycle/legacy-none-tokens.js +1 -149
  535. package/dist/sdk/lifecycle/lifecycle-transitions.js +1 -40
  536. package/dist/sdk/lifecycle/mcp-actions.d.ts +2 -0
  537. package/dist/sdk/lifecycle/mcp-actions.js +1 -51
  538. package/dist/sdk/lifecycle/metadata-normalizers.js +1 -46
  539. package/dist/sdk/lifecycle/mutation-command-options.js +1 -9
  540. package/dist/sdk/lifecycle/plan.js +1 -1606
  541. package/dist/sdk/lifecycle/recurrence-parsers.js +1 -147
  542. package/dist/sdk/lifecycle/reopen.js +1 -68
  543. package/dist/sdk/lifecycle/repeatable-metadata-parsers.js +1 -143
  544. package/dist/sdk/lifecycle/restore.d.ts +1 -0
  545. package/dist/sdk/lifecycle/restore.js +1 -330
  546. package/dist/sdk/lifecycle/shared-unset-fields.js +1 -295
  547. package/dist/sdk/lifecycle/update-many.js +1 -861
  548. package/dist/sdk/lifecycle/update.js +1 -2136
  549. package/dist/sdk/lifecycle-completion.js +1 -92
  550. package/dist/sdk/lifecycle-policy.js +1 -120
  551. package/dist/sdk/linked-artifacts.js +1 -530
  552. package/dist/sdk/mcp/apps.js +4 -133
  553. package/dist/sdk/mcp/authorization.js +1 -404
  554. package/dist/sdk/mcp/discovery.js +1 -494
  555. package/dist/sdk/mcp/interactions.js +1 -336
  556. package/dist/sdk/mcp/protocol.d.ts +7 -0
  557. package/dist/sdk/mcp/protocol.js +1 -184
  558. package/dist/sdk/mcp/skills.js +1 -389
  559. package/dist/sdk/mcp/subscriptions.js +1 -211
  560. package/dist/sdk/mcp/tasks.js +2 -430
  561. package/dist/sdk/mcp/transport.js +1 -260
  562. package/dist/sdk/merge/abandoned-receipts.js +1 -46
  563. package/dist/sdk/merge/driver.js +1 -212
  564. package/dist/sdk/merge/index.js +1 -16
  565. package/dist/sdk/merge/install.js +3 -561
  566. package/dist/sdk/merge/receipt-file-boundary.js +1 -46
  567. package/dist/sdk/merge/receipt-operation.js +1 -96
  568. package/dist/sdk/merge/receipt-schema.js +1 -397
  569. package/dist/sdk/merge/receipts.js +4 -525
  570. package/dist/sdk/merge/reconcile.js +1 -352
  571. package/dist/sdk/merge/three-way.js +3 -775
  572. package/dist/sdk/merge.js +1 -10
  573. package/dist/sdk/mutation-events.js +1 -292
  574. package/dist/sdk/mutation-guard.js +1 -216
  575. package/dist/sdk/notes.js +1 -139
  576. package/dist/sdk/output-contracts.js +1 -172
  577. package/dist/sdk/output-projection.js +1 -430
  578. package/dist/sdk/output-token-accounting.js +1 -140
  579. package/dist/sdk/output.js +1 -64
  580. package/dist/sdk/ownership-source.js +1 -21
  581. package/dist/sdk/package-import-adapters.js +1 -442
  582. package/dist/sdk/package-migrations.js +1 -20
  583. package/dist/sdk/package-runtime-options.js +1 -80
  584. package/dist/sdk/pagination.js +1 -162
  585. package/dist/sdk/profile.js +1 -454
  586. package/dist/sdk/provenance.js +1 -258
  587. package/dist/sdk/public-surface.json +1 -1
  588. package/dist/sdk/query/activity.js +1 -401
  589. package/dist/sdk/query/aggregate.d.ts +16 -0
  590. package/dist/sdk/query/aggregate.js +1 -390
  591. package/dist/sdk/query/calendar.js +1 -964
  592. package/dist/sdk/query/complete-list.js +1 -215
  593. package/dist/sdk/query/context.js +1 -1702
  594. package/dist/sdk/query/duplicate-candidates.js +1 -70
  595. package/dist/sdk/query/get.js +1 -450
  596. package/dist/sdk/query/history.js +1 -186
  597. package/dist/sdk/query/item-filter-options.js +1 -9
  598. package/dist/sdk/query/light-metadata.js +1 -18
  599. package/dist/sdk/query/list-filter-shared.js +1 -81
  600. package/dist/sdk/query/list.js +1 -1304
  601. package/dist/sdk/query/multi-value-filters.js +1 -78
  602. package/dist/sdk/query/next.js +1 -513
  603. package/dist/sdk/query/parsers.js +1 -44
  604. package/dist/sdk/query/projection-contracts.js +1 -184
  605. package/dist/sdk/query/search-contracts.js +1 -230
  606. package/dist/sdk/query/search-pagination.js +1 -35
  607. package/dist/sdk/query/search-rendering.js +1 -105
  608. package/dist/sdk/query/search.js +2 -1987
  609. package/dist/sdk/query.js +1 -35
  610. package/dist/sdk/read-output/continuation.js +1 -194
  611. package/dist/sdk/read-output-budget.js +1 -135
  612. package/dist/sdk/read-output-contracts.js +1 -1225
  613. package/dist/sdk/read-output-rows.js +1 -186
  614. package/dist/sdk/read-output-session.js +1 -208
  615. package/dist/sdk/relationship-analytics.js +1 -410
  616. package/dist/sdk/relationship-context.js +1 -284
  617. package/dist/sdk/relationship-history.js +4 -519
  618. package/dist/sdk/relationship-kinds/contract.js +1 -22
  619. package/dist/sdk/relationship-migration.js +1 -77
  620. package/dist/sdk/relationships.js +1 -579
  621. package/dist/sdk/reproducibility/process.js +1 -87
  622. package/dist/sdk/runtime-action-aliases.js +1 -59
  623. package/dist/sdk/runtime-extended-actions.js +1 -177
  624. package/dist/sdk/runtime-input.js +1 -614
  625. package/dist/sdk/runtime-primitives.js +1 -84
  626. package/dist/sdk/runtime-public-contracts.js +1 -4
  627. package/dist/sdk/runtime-stats-options.js +1 -38
  628. package/dist/sdk/runtime.js +1 -1928
  629. package/dist/sdk/scheduling-shortcuts.js +1 -63
  630. package/dist/sdk/schema-migration.js +3 -856
  631. package/dist/sdk/schema.js +1 -1376
  632. package/dist/sdk/search-refresh-worker.js +1 -18
  633. package/dist/sdk/similarity-scoring.js +1 -53
  634. package/dist/sdk/similarity.js +1 -326
  635. package/dist/sdk/start-task-status.js +1 -14
  636. package/dist/sdk/stats.js +1 -270
  637. package/dist/sdk/structured-mutations.js +1 -580
  638. package/dist/sdk/telemetry-flush.js +1 -13
  639. package/dist/sdk/telemetry.js +1 -405
  640. package/dist/sdk/templates.js +2 -292
  641. package/dist/sdk/test/batch.js +2 -509
  642. package/dist/sdk/test/entry.js +1 -70
  643. package/dist/sdk/test/execution.js +6 -2211
  644. package/dist/sdk/test/linked-command-detection.js +1 -546
  645. package/dist/sdk/test/measurements.js +1 -91
  646. package/dist/sdk/test/parsers.js +1 -545
  647. package/dist/sdk/test/runs.js +1 -193
  648. package/dist/sdk/test/trust.js +2 -206
  649. package/dist/sdk/testing.js +4 -1391
  650. package/dist/sdk/traceability/runtime-files-lookup.js +1 -32
  651. package/dist/sdk/traceability/source-traceability.js +1 -292
  652. package/dist/sdk/tracker-root-discovery.js +1 -9
  653. package/dist/sdk/workspace-contracts-cache.js +1 -28
  654. package/dist/sdk/workspace-contracts.js +1 -33
  655. package/dist/sdk/workspace-memory.js +2 -318
  656. package/dist/sdk/workspace-recipe.js +1 -71
  657. package/dist/sdk/workspace-snapshot.js +4 -613
  658. package/dist/sdk/workspace-transaction-gc.js +1 -149
  659. package/dist/sdk/workspace-transaction.js +2 -363
  660. package/dist/sdk/workspace.js +3 -127
  661. package/dist/types/index.js +1 -9
  662. package/dist/types.js +1 -245
  663. package/docs/AGENT_GUIDE.md +1 -1
  664. package/docs/CONTEXT_ALGORITHM_PORTFOLIO.md +167 -0
  665. package/docs/DIAGNOSTIC_OUTPUT_CONTRACTS.md +9 -3
  666. package/docs/EXTENSIONS.md +1 -0
  667. package/docs/HISTORY_MAINTENANCE.md +125 -0
  668. package/docs/MCP_2026_07_28_CONFORMANCE.md +20 -10
  669. package/docs/PACKAGE_EVIDENCE.md +92 -0
  670. package/docs/PLANNING_MEASUREMENTS.md +183 -0
  671. package/docs/README.md +3 -0
  672. package/docs/RELEASING.md +1 -0
  673. package/docs/SCRIPTING.md +21 -0
  674. package/docs/TESTING.md +23 -0
  675. package/docs/generated/FLAG_LEXICON_BUDGETS.md +5 -5
  676. package/docs/generated/REFUSAL_CLOSURE_CENSUS.md +2 -2
  677. package/marketplace.json +2 -2
  678. package/package.json +1 -1
  679. package/packages/pm-beads/package.json +1 -1
  680. package/packages/pm-calendar/package.json +1 -1
  681. package/packages/pm-command-kit/package.json +1 -1
  682. package/packages/pm-digital-twin/package.json +1 -1
  683. package/packages/pm-governance-audit/package.json +1 -1
  684. package/packages/pm-guide-shell/package.json +1 -1
  685. package/packages/pm-kanban/package.json +1 -1
  686. package/packages/pm-lifecycle-hooks/package.json +1 -1
  687. package/packages/pm-linked-test-adapters/package.json +1 -1
  688. package/packages/pm-search-advanced/package.json +1 -1
  689. package/packages/pm-templates/package.json +1 -1
  690. package/packages/pm-todos/package.json +1 -1
  691. package/packages/pm-vcs/package.json +1 -1
  692. package/plugins/pm-claude/.claude-plugin/plugin.json +1 -1
  693. package/plugins/pm-codex/.codex-plugin/plugin.json +1 -1
  694. package/scripts/finalize-build.mjs +45 -3
  695. package/dist/cli-bundle/chunks/chunk-AZDFJGH6.js +0 -9
  696. package/dist/cli-bundle/chunks/chunk-BAX2BYUW.js +0 -2111
  697. package/dist/cli-bundle/chunks/chunk-CKOL5U7J.js +0 -77
  698. package/dist/cli-bundle/chunks/chunk-OF76PSDQ.js +0 -5
  699. package/dist/cli-bundle/chunks/chunk-QUWFABDM.js +0 -232
  700. package/dist/cli-bundle/chunks/chunk-QWRRFYK3.js +0 -2
  701. package/dist/cli-bundle/chunks/chunk-RWWBOWJ5.js +0 -2
  702. package/dist/cli-bundle/chunks/chunk-WGAOYSYH.js +0 -40
  703. package/dist/cli-bundle/chunks/chunk-WI2AYPA7.js +0 -2
  704. package/dist/cli-bundle/chunks/register-list-query-5JL52D33.js +0 -11
  705. package/dist/cli-bundle/chunks/register-mutation-ZPG7KMVP.js +0 -20
  706. package/dist/cli-bundle/chunks/register-setup-H4SVAVX7.js +0 -2
  707. package/dist/cli-bundle/focused-chunks/chunk-AL5ON6K6.js +0 -2
  708. package/dist/cli-bundle/focused-chunks/chunk-CHC2IDXA.js +0 -6
  709. package/dist/cli-bundle/focused-chunks/chunk-CK6QFAPZ.js +0 -20
  710. package/dist/cli-bundle/focused-chunks/chunk-EZR3GHFE.js +0 -2
  711. package/dist/cli-bundle/focused-chunks/chunk-H2WJWK7L.js +0 -56
  712. package/dist/cli-bundle/focused-chunks/chunk-NTPY5GSO.js +0 -3
  713. package/dist/cli-bundle/focused-chunks/chunk-P5O7MP5Y.js +0 -2
  714. package/dist/cli-bundle/focused-chunks/chunk-PDMW2E36.js +0 -177
  715. package/dist/cli-bundle/focused-chunks/chunk-QTVCLMSZ.js +0 -6
  716. package/dist/cli-bundle/focused-chunks/chunk-QTZRBUYA.js +0 -8
  717. package/dist/cli-bundle/focused-chunks/chunk-SGQST3PQ.js +0 -12
  718. package/dist/cli-bundle/focused-chunks/chunk-UKHASMMP.js +0 -10
  719. package/dist/cli-bundle/focused-chunks/chunk-ZPEKQHOC.js +0 -2
@@ -1,944 +1,11 @@
1
-
2
- !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="7b6e80ad-a85b-5539-8f47-02bfad799cdb")}catch(e){}}();
3
- import { EXIT_CODE, PmCliError, readSettings, renderRowsAsCsv, renderRowsAsTable, resolvePmRoot, } from "../sdk/runtime-primitives.js";
4
- import { renderPmCommandAliasMigrationHint, resolvePmCommandAlias, } from "../sdk/cli-contracts.js";
5
- import { EVAL_QUERY_SET_SCHEMA_ID } from "../sdk/eval.js";
6
- import { applyContextIntentProjection } from "../sdk/context-intent-contracts.js";
7
- import { renderPmClosedDomainHelp } from "../sdk/agent/closed-domain-contracts.js";
8
- import { serializeNdjsonRows, serializeNdjsonStream } from "../sdk/output.js";
9
- import { listMutationEvents, subscribeMutationEventBatches, subscribeMutationEvents, } from "../sdk/mutation-events.js";
10
- import { runActivity } from "./commands/activity.js";
11
- import { runAggregate } from "./commands/aggregate.js";
12
- import { renderContextMarkdown, runContext, resolveContextOutputFormat, } from "./commands/context.js";
13
- import { runEval } from "./commands/eval.js";
14
- import { runGet } from "./commands/get.js";
15
- import { runGraph } from "./commands/graph.js";
16
- import { runHistory } from "./commands/history.js";
17
- import { runList } from "./commands/list.js";
18
- import { LIST_COMMAND_DEFAULT_PROJECTIONS, } from "../sdk/query/list.js";
19
- import { renderNextMarkdown, runNext, resolveNextOutputFormat, } from "./commands/next.js";
20
- import { runSearch } from "./commands/search.js";
21
- import { addHiddenOption, collect, getGlobalOptions, normalizeAggregateOptions, normalizeActivityOptions, normalizeContextOptions, normalizeListOptions, normalizeNextOptions, normalizeSearchKeywordsInput, normalizeSearchOptions, printActivityJsonStream, printError, printListJsonStream, printResult, resolveActivityStreamMode, setActiveCommandResult, writeStdout, } from "./registration-helpers.js";
22
- function shouldRegisterListQueryCommand(commandName, commandFilter) {
23
- if (!commandFilter || commandFilter.size === 0) {
24
- return true;
25
- }
26
- if (commandName === "context") {
27
- return commandFilter.has("context") || commandFilter.has("ctx");
28
- }
29
- return commandFilter.has(commandName);
30
- }
31
- /** Parses the `pm list --format` value into a supported render mode. csv/table are human export modes; json/toon override the machine output format. Returns undefined when no `--format` was supplied so the global output format applies. */
32
- function parseListFormat(rawFormat) {
33
- if (rawFormat === undefined) {
34
- return undefined;
35
- }
36
- if (typeof rawFormat !== "string") {
37
- throw new PmCliError("List --format must be one of csv|table|json|ndjson|toon", EXIT_CODE.USAGE);
38
- }
39
- const normalized = rawFormat.trim().toLowerCase();
40
- if (normalized === "csv" ||
41
- normalized === "table" ||
42
- normalized === "json" ||
43
- normalized === "ndjson" ||
44
- normalized === "toon") {
45
- return normalized;
46
- }
47
- throw new PmCliError("List --format must be one of csv|table|json|ndjson|toon", EXIT_CODE.USAGE);
48
- }
49
- function resolveReadCommandOutputFormat(commandLabel, rawFormat, globalOptions, allowNdjson = false) {
50
- if (rawFormat === undefined) {
51
- return globalOptions;
52
- }
53
- if (typeof rawFormat !== "string") {
54
- throw new PmCliError(`${commandLabel} --format must be one of ${allowNdjson ? "json|ndjson|toon" : "json|toon"}`, EXIT_CODE.USAGE);
55
- }
56
- const normalized = rawFormat.trim().toLowerCase();
57
- if (normalized !== "json" &&
58
- (normalized !== "ndjson" || !allowNdjson) &&
59
- normalized !== "toon") {
60
- throw new PmCliError(`${commandLabel} --format must be one of ${allowNdjson ? "json|ndjson|toon" : "json|toon"}`, EXIT_CODE.USAGE);
61
- }
62
- if (globalOptions.json === true && normalized === "toon") {
63
- throw new PmCliError(`${commandLabel} cannot combine --json with --format toon`, EXIT_CODE.USAGE);
64
- }
65
- return {
66
- ...globalOptions,
67
- json: normalized === "json" || normalized === "ndjson",
68
- };
69
- }
70
- function applyDefaultListProjection(listOptions, commandName) {
71
- if (LIST_COMMAND_DEFAULT_PROJECTIONS[commandName] === "brief" &&
72
- listOptions.includeBody !== true &&
73
- listOptions.compact !== true &&
74
- listOptions.brief !== true &&
75
- listOptions.full !== true &&
76
- listOptions.fields === undefined) {
77
- listOptions.brief = true;
78
- }
79
- }
80
- function registerContentAndGovernanceFilters(command) {
81
- command
82
- .option("--has-notes", "Show only items that have notes")
83
- .option("--has-learnings", "Show only items that have learnings")
84
- .option("--has-files", "Show only items that have linked files")
85
- .option("--has-docs", "Show only items that have linked docs")
86
- .option("--has-tests", "Show only items that have linked tests")
87
- .option("--has-comments", "Show only items that have comments")
88
- .option("--has-deps", "Show only items that have dependencies")
89
- .option("--has-body", "Show only items that have a non-empty body")
90
- .option("--has-linked-command", "Show only items whose linked tests carry a runnable command")
91
- .option("--no-notes", "Show only items that have no notes")
92
- .option("--no-learnings", "Show only items that have no learnings")
93
- .option("--no-files", "Show only items that have no linked files")
94
- .option("--filter-files-missing", "Alias for --no-files")
95
- .option("--no-docs", "Show only items that have no linked docs")
96
- .option("--filter-docs-missing", "Alias for --no-docs")
97
- .option("--no-tests", "Show only items that have no linked tests")
98
- .option("--no-comments", "Show only items that have no comments")
99
- .option("--no-deps", "Show only items that have no dependencies")
100
- .option("--empty-body", "Show only items with an empty body")
101
- .option("--no-linked-command", "Show only items whose linked tests carry no runnable command")
102
- .option("--filter-reviewer-missing", "Show only items missing reviewer")
103
- .option("--filter-risk-missing", "Show only items missing risk")
104
- .option("--filter-confidence-missing", "Show only items missing confidence")
105
- .option("--filter-sprint-missing", "Show only items missing sprint")
106
- .option("--filter-release-missing", "Show only items missing release");
107
- }
108
- const CANONICAL_LIST_STATUS_VARIANTS = {
109
- draft: { name: "list-draft", dependencyBlocked: false },
110
- open: { name: "list-open", dependencyBlocked: false },
111
- in_progress: { name: "list-in-progress", dependencyBlocked: false },
112
- blocked: { name: "list-blocked", dependencyBlocked: true },
113
- closed: { name: "list-closed", dependencyBlocked: false },
114
- canceled: { name: "list-canceled", dependencyBlocked: false },
115
- };
116
- /** Resolve and validate the mutually exclusive list rendering modes. */
117
- function resolveRegisteredListOutputContext(options, globalOptions) {
118
- const streamMode = options.stream === true;
119
- const listFormat = parseListFormat(options.format);
120
- const tabular = listFormat === "csv" || listFormat === "table";
121
- const effectiveGlobal = listFormat === "json" || listFormat === "ndjson" || listFormat === "toon"
122
- ? resolveReadCommandOutputFormat("List", options.format, globalOptions, true)
123
- : globalOptions;
124
- if (streamMode && !effectiveGlobal.json) {
125
- throw new PmCliError("--stream requires --json output mode.", EXIT_CODE.USAGE);
126
- }
127
- if ((tabular || listFormat === "ndjson") && streamMode) {
128
- throw new PmCliError("--format csv|table|ndjson cannot be combined with --stream.", EXIT_CODE.USAGE);
129
- }
130
- return { streamMode, listFormat, effectiveGlobal };
131
- }
132
- /** Render one list result through tabular, stream, or standard output paths. */
133
- function renderRegisteredListResult(commandName, result, output) {
134
- if (output.listFormat === "csv" || output.listFormat === "table") {
135
- setActiveCommandResult(result);
136
- const rows = result.items;
137
- const rendered = output.listFormat === "csv"
138
- ? renderRowsAsCsv(rows)
139
- : renderRowsAsTable(rows);
140
- if (!output.effectiveGlobal.quiet && rendered.length > 0) {
141
- writeStdout(`${rendered}\n`);
142
- }
143
- }
144
- else if (output.listFormat === "ndjson") {
145
- setActiveCommandResult(result);
146
- const rendered = serializeNdjsonRows(result.items);
147
- if (!output.effectiveGlobal.quiet && rendered.length > 0) {
148
- writeStdout(`${rendered}\n`);
149
- }
150
- }
151
- else if (output.streamMode) {
152
- printListJsonStream(commandName, result, output.effectiveGlobal);
153
- }
154
- else {
155
- printResult(result, output.effectiveGlobal);
156
- }
157
- }
158
- async function runRegisteredListCommand(params) {
159
- const parsedGlobalOptions = getGlobalOptions(params.actionCommand);
160
- const globalOptions = params.aliasContract
161
- ? { ...parsedGlobalOptions, command: params.aliasContract.canonical }
162
- : parsedGlobalOptions;
163
- const startedAt = Date.now();
164
- if (params.aliasContract?.lifecycle === "deprecated") {
165
- const deprecationHints = await readSettings(resolvePmRoot(process.cwd(), globalOptions.path)).then((settings) => settings.ux.deprecation_hints);
166
- if (deprecationHints) {
167
- printError(renderPmCommandAliasMigrationHint(params.aliasContract));
168
- }
169
- }
170
- const intentOptions = applyContextIntentProjection("list", params.options);
171
- const listOptions = normalizeListOptions(intentOptions);
172
- const selection = resolveRegisteredListSelection(params, listOptions);
173
- const { effectiveName, effectiveStatus, effectiveDependencyBlocked, effectiveExcludeTerminal, } = selection;
174
- applyDefaultListProjection(listOptions, effectiveName);
175
- Object.assign(listOptions, { projectionCommand: effectiveName });
176
- if (effectiveExcludeTerminal)
177
- listOptions.excludeTerminal = true;
178
- listOptions.dependencyBlocked = effectiveDependencyBlocked;
179
- const output = resolveRegisteredListOutputContext(intentOptions, globalOptions);
180
- const result = await runList(effectiveDependencyBlocked ? undefined : effectiveStatus, listOptions, globalOptions);
181
- renderRegisteredListResult("list", result, output);
182
- if (globalOptions.profile) {
183
- printError(`profile:command=list took_ms=${Date.now() - startedAt}`);
184
- }
185
- }
186
- /** Resolve aliases and lifecycle buckets into one SDK list selection. */
187
- function resolveRegisteredListSelection(params, listOptions) {
188
- let effectiveName = params.name;
189
- let effectiveStatus = params.status;
190
- let effectiveDependencyBlocked = params.dependencyBlocked === true;
191
- let effectiveExcludeTerminal = params.excludeTerminal === true;
192
- const requestedStatus = listOptions.status?.trim().toLowerCase();
193
- const requestedVariant = params.name === "list" && requestedStatus !== undefined
194
- ? CANONICAL_LIST_STATUS_VARIANTS[requestedStatus]
195
- : undefined;
196
- if (params.name === "list") {
197
- if (params.options.all === true || requestedStatus === "all") {
198
- effectiveName = "list-all";
199
- effectiveExcludeTerminal = false;
200
- listOptions.status = undefined;
201
- }
202
- else if (requestedStatus !== undefined &&
203
- requestedVariant !== undefined) {
204
- effectiveName = requestedVariant.name;
205
- effectiveStatus = requestedStatus;
206
- effectiveDependencyBlocked = requestedVariant.dependencyBlocked;
207
- effectiveExcludeTerminal = false;
208
- listOptions.status = undefined;
209
- }
210
- }
211
- if (effectiveName === "list-open" || effectiveName === "list-in-progress") {
212
- listOptions.lifecycleBucket =
213
- effectiveName === "list-open" ? "open" : "in_progress";
214
- effectiveStatus = undefined;
215
- }
216
- return {
217
- effectiveName,
218
- effectiveStatus,
219
- effectiveDependencyBlocked,
220
- effectiveExcludeTerminal,
221
- };
222
- }
223
- function registerListCommand(program, descriptor) {
224
- const { name, description, status, excludeTerminal, allowStatusFilter, dependencyBlocked, aliasContract, } = descriptor;
225
- const command = program
226
- .command(name, { hidden: aliasContract?.hidden === true })
227
- .description(description);
228
- if (allowStatusFilter) {
229
- command.option("--status <value>", "Filter by status (repeatable or comma-separated; matches any; all selects every status)", collect);
230
- }
231
- if (name === "list") {
232
- command.option("--all", "Include every lifecycle status");
233
- }
234
- command
235
- .option("--for <intent>", `Apply a declared context intent projection. ${renderPmClosedDomainHelp("list", "--for")}`)
236
- .option("--token-budget <n>", "Override the selected intent's maximum estimated output tokens")
237
- .option("--type <value>", "Filter by item type (repeatable or comma-separated; matches any)", collect)
238
- .option("--tag <value>", "Filter by tag (repeatable or comma-separated; matches any)", collect)
239
- .option("--priority <value>", "Filter by priority (repeatable or comma-separated; matches any)", collect)
240
- .option("--deadline-before <value>", "Filter by deadline upper bound (ISO/date string or relative)")
241
- .option("--deadline-after <value>", "Filter by deadline lower bound (ISO/date string or relative)")
242
- .option("--today", "Filter to items updated since local midnight today")
243
- .option("--recent", "Filter to items updated in the last 7 days")
244
- .option("--updated-after <value>", 'Filter by updated_at lower bound: ISO timestamp or signed relative (e.g. "-2h"/"-7d" for the past). "Changed since my last window" → --updated-after <ISO>')
245
- .option("--updated-before <value>", "Filter by updated_at upper bound: ISO timestamp or signed relative (-2h/+1d)")
246
- .option("--created-after <value>", "Filter by created_at lower bound: ISO timestamp or signed relative (-2h/+1d)")
247
- .option("--created-before <value>", "Filter by created_at upper bound: ISO timestamp or signed relative (-2h/+1d)")
248
- .option("--ids <value>", "Filter by explicit item IDs (comma-separated or repeatable)")
249
- .option("--assignee <value>", "Filter by assignee", collect)
250
- .option("--assignee-filter <value>", "Filter assignee presence: assigned|unassigned")
251
- .option("--parent <value>", "Filter by parent item ID")
252
- .option("--sprint <value>", "Filter by sprint", collect)
253
- .option("--release <value>", "Filter by release", collect)
254
- .option("--filter-ac-missing", "Show only items missing acceptance_criteria")
255
- .option("--filter-estimates-missing", "Show only items missing estimated_minutes")
256
- .option("--filter-resolution-missing", "Show only terminal items missing resolution")
257
- .option("--filter-metadata-missing", "Show only items missing any tracked metadata (AC, estimate, or resolution)")
258
- .option("--limit <n>", "Limit returned item count")
259
- .option("--offset <n>", "Skip the first n matching rows before limit is applied")
260
- .option("--after <cursor>", "Continue after an opaque next_cursor from a previous list response")
261
- .option("--no-truncate", "Return every matched row after the explicit status and field filters")
262
- .option("--include-body", "Include item body in each returned list row")
263
- .option("--strict-read", "Fail closed if any item document or item directory cannot be read")
264
- .option("--compact", "Render compact list projection fields (mutually exclusive with --brief/--full/--fields)")
265
- .option("--brief", "Ultra-compact output: id, status, type, title only (agent-optimized, mutually exclusive with --compact/--full/--fields)")
266
- .option("--full", "Render full list projection fields (mutually exclusive with --compact/--brief/--fields)")
267
- .option("--fields <value>", `Render custom comma-separated list fields (mutually exclusive with --compact/--brief/--full). ${renderPmClosedDomainHelp(name, "--fields")}`)
268
- .option("--sort <value>", "Sort field: priority|deadline|updated_at|created_at|title|parent (aliases: updated, created)")
269
- .option("--order <value>", "Sort order: asc|desc (requires --sort)")
270
- .option("--tree", "Render rows in parent/child tree order")
271
- .option("--tree-depth <n>", "Maximum recursion depth with --tree (0 keeps root rows only)")
272
- .option("--format <value>", "Output render mode: csv|table (human export) or json|ndjson|toon (machine output override)")
273
- .option("--stream", "Emit line-delimited JSON rows (requires --json)");
274
- registerContentAndGovernanceFilters(command);
275
- command.action(async (options, actionCommand) => {
276
- await runRegisteredListCommand({
277
- name,
278
- status,
279
- excludeTerminal,
280
- dependencyBlocked,
281
- options,
282
- actionCommand,
283
- aliasContract,
284
- });
285
- });
286
- // Hidden pure snake_case underscore-duplicate alias (kept parse-functional).
287
- addHiddenOption(command, "--tags <value>", "Alias for --tag");
288
- addHiddenOption(command, "--assignee_filter <value>", "Alias for --assignee-filter");
289
- addHiddenOption(command, "--tree_depth <n>", "Alias for --tree-depth");
290
- addHiddenOption(command, "--token_budget <n>", "Alias for --token-budget");
291
- // Singular alias so `--filter-estimate-missing` works (matches update-many spelling).
292
- addHiddenOption(command, "--filter-estimate-missing", "Alias for --filter-estimates-missing");
293
- }
294
- async function runAggregateAction(options, command) {
295
- const globalOptions = getGlobalOptions(command);
296
- const startedAt = Date.now();
297
- const result = await runAggregate(normalizeAggregateOptions(options), globalOptions);
298
- printResult(result, globalOptions);
299
- if (globalOptions.profile) {
300
- printError(`profile:command=aggregate took_ms=${Date.now() - startedAt}`);
301
- }
302
- }
303
- async function runContextAction(options, actionCommand) {
304
- const globalOptions = getGlobalOptions(actionCommand);
305
- const startedAt = Date.now();
306
- const normalized = normalizeContextOptions(applyContextIntentProjection("context", options));
307
- const result = await runContext(normalized, globalOptions);
308
- const outputFormat = resolveContextOutputFormat(normalized, globalOptions);
309
- if (outputFormat === "markdown") {
310
- if (!globalOptions.quiet) {
311
- writeStdout(`${renderContextMarkdown(result)}\n`);
312
- }
313
- }
314
- else if (outputFormat === "ndjson") {
315
- setActiveCommandResult(result);
316
- const rendered = serializeNdjsonRows([
317
- ...result.high_level,
318
- ...result.low_level,
319
- ...result.blocked_fallback,
320
- ]);
321
- if (!globalOptions.quiet && rendered.length > 0) {
322
- writeStdout(`${rendered}\n`);
323
- }
324
- }
325
- else {
326
- printResult(result, {
327
- ...globalOptions,
328
- json: outputFormat === "json",
329
- });
330
- }
331
- if (globalOptions.profile) {
332
- printError(`profile:command=context took_ms=${Date.now() - startedAt}`);
333
- }
334
- }
335
- async function runNextAction(options, actionCommand) {
336
- const globalOptions = getGlobalOptions(actionCommand);
337
- const startedAt = Date.now();
338
- const nextOptions = normalizeNextOptions(applyContextIntentProjection("next", options));
339
- const result = await runNext(nextOptions, globalOptions);
340
- const outputFormat = resolveNextOutputFormat(nextOptions, globalOptions);
341
- if (outputFormat === "markdown") {
342
- if (!globalOptions.quiet) {
343
- writeStdout(`${renderNextMarkdown(result)}\n`);
344
- }
345
- }
346
- else {
347
- printResult(result, { ...globalOptions, json: outputFormat === "json" });
348
- }
349
- if (globalOptions.profile) {
350
- printError(`profile:command=next took_ms=${Date.now() - startedAt}`);
351
- }
352
- }
353
- async function runSearchAction(keywords, options, command) {
354
- const globalOptions = getGlobalOptions(command);
355
- const startedAt = Date.now();
356
- const query = normalizeSearchKeywordsInput(keywords);
357
- const intentOptions = applyContextIntentProjection("search", options, [
358
- query,
359
- ]);
360
- const searchOptions = normalizeSearchOptions(intentOptions);
361
- const result = await runSearch(query, {
362
- ...searchOptions,
363
- mode: typeof searchOptions.mode === "string" &&
364
- searchOptions.mode.trim().length > 0
365
- ? searchOptions.mode
366
- : "keyword",
367
- }, globalOptions);
368
- const outputFormat = typeof intentOptions.format === "string"
369
- ? intentOptions.format.trim().toLowerCase()
370
- : undefined;
371
- const effectiveGlobal = resolveReadCommandOutputFormat("Search", intentOptions.format, globalOptions, true);
372
- if (outputFormat === "ndjson") {
373
- setActiveCommandResult(result);
374
- const rendered = serializeNdjsonRows(result.items);
375
- if (!effectiveGlobal.quiet && rendered.length > 0) {
376
- writeStdout(`${rendered}\n`);
377
- }
378
- }
379
- else {
380
- printResult(result, effectiveGlobal);
381
- }
382
- if (globalOptions.profile) {
383
- printError(`profile:command=search took_ms=${Date.now() - startedAt}`);
384
- }
385
- }
386
- async function runEvalAction(options, command) {
387
- const globalOptions = getGlobalOptions(command);
388
- const startedAt = Date.now();
389
- const result = await runEval({
390
- mode: typeof options.mode === "string" ? options.mode : undefined,
391
- k: typeof options.k === "string" ? options.k : undefined,
392
- failUnder: typeof options.failUnder === "string" ? options.failUnder : undefined,
393
- queries: typeof options.queries === "string" ? options.queries : undefined,
394
- format: typeof options.format === "string" ? options.format : undefined,
395
- }, globalOptions);
396
- printResult(result, resolveReadCommandOutputFormat("Eval", options.format, globalOptions));
397
- if (globalOptions.profile) {
398
- printError(`profile:command=eval took_ms=${Date.now() - startedAt}`);
399
- }
400
- if (!result.passed) {
401
- throw new PmCliError(`Eval gate failed: aggregate nDCG@${result.k} ${result.aggregate.ndcg} is below --fail-under ${result.fail_under}`, EXIT_CODE.GENERIC_FAILURE);
402
- }
403
- }
404
- async function runGetAction(id, options, command) {
405
- const globalOptions = getGlobalOptions(command);
406
- const startedAt = Date.now();
407
- const intentOptions = applyContextIntentProjection("get", options, [id]);
408
- const result = await runGet(id, globalOptions, {
409
- depth: typeof intentOptions.depth === "string" ? intentOptions.depth : undefined,
410
- fields: typeof intentOptions.fields === "string"
411
- ? intentOptions.fields
412
- : undefined,
413
- full: Boolean(intentOptions.full),
414
- tree: intentOptions.tree === true,
415
- treeDepth: typeof intentOptions.treeDepth === "string"
416
- ? intentOptions.treeDepth
417
- : typeof intentOptions.tree_depth === "string"
418
- ? intentOptions.tree_depth
419
- : undefined,
420
- at: typeof intentOptions.at === "string" ? intentOptions.at : undefined,
421
- });
422
- printResult(result, resolveReadCommandOutputFormat("Get", intentOptions.format, globalOptions));
423
- if (globalOptions.profile) {
424
- printError(`profile:command=get took_ms=${Date.now() - startedAt}`);
425
- }
426
- }
427
- async function runHistoryAction(id, options, command) {
428
- const globalOptions = getGlobalOptions(command);
429
- const startedAt = Date.now();
430
- if ([options.compact, options.raw, options.full, options.provenance].filter((value) => value === true).length > 1) {
431
- throw new PmCliError("History projection options are mutually exclusive. Use --compact, --provenance, or --full.", EXIT_CODE.USAGE);
432
- }
433
- const field = typeof options.field === "string" ? options.field : undefined;
434
- const strictExit = Boolean(options.strictExit) || Boolean(options.failOnWarn);
435
- if (strictExit && !options.verify) {
436
- throw new PmCliError("--strict-exit requires --verify (it gates on the verification result).", EXIT_CODE.USAGE);
437
- }
438
- const result = await runHistory(id, {
439
- limit: typeof options.limit === "string" ? options.limit : undefined,
440
- compact: options.full === true || options.provenance === true ? false : true,
441
- provenance: options.provenance === true,
442
- provenanceSummary: options.provenanceSummary === true,
443
- harness: readRepeatableStringOption(options, "harness"),
444
- agentInstance: readRepeatableStringOption(options, "agentInstance"),
445
- provenanceFilter: readRepeatableStringOption(options, "provenanceFilter"),
446
- diff: Boolean(options.diff) || field !== undefined,
447
- field,
448
- verify: Boolean(options.verify),
449
- }, globalOptions);
450
- printResult(result, resolveReadCommandOutputFormat("History", options.format, globalOptions));
451
- // GH-604: without --strict-exit a broken chain still exits 0 (read-only
452
- // inspection default); with it, verification.ok:false becomes a nonzero exit
453
- // so CI and merge hooks can gate on `pm history <id> --verify --strict-exit`.
454
- if (strictExit && result.verification && !result.verification.ok) {
455
- process.exitCode = EXIT_CODE.GENERIC_FAILURE;
456
- }
457
- if (globalOptions.profile) {
458
- printError(`profile:command=history took_ms=${Date.now() - startedAt}`);
459
- }
460
- }
461
- function readRepeatableStringOption(options, key) {
462
- const value = options[key];
463
- return Array.isArray(value) ? value : undefined;
464
- }
465
- function buildMutationEventOptions(options, pmRoot) {
466
- const harness = readRepeatableStringOption(options, "harness");
467
- const agentInstance = readRepeatableStringOption(options, "agentInstance");
468
- const provenanceFilter = readRepeatableStringOption(options, "provenanceFilter");
469
- const rawCursorMode = typeof options.cursorMode === "string" ? options.cursorMode : undefined;
470
- if (rawCursorMode !== undefined &&
471
- rawCursorMode !== "batch" &&
472
- rawCursorMode !== "row") {
473
- throw new PmCliError("Events --cursor-mode must be batch or row.", EXIT_CODE.USAGE, { code: "invalid_event_cursor_mode" });
474
- }
475
- const cursorMode = rawCursorMode;
476
- return {
477
- pmRoot,
478
- since: typeof options.since === "string" ? options.since : undefined,
479
- type: readRepeatableStringOption(options, "type"),
480
- author: readRepeatableStringOption(options, "author"),
481
- item: readRepeatableStringOption(options, "item"),
482
- limit: typeof options.limit === "string" ? Number(options.limit) : undefined,
483
- full: options.full === true,
484
- ...(options.provenance === true ? { provenance: true } : {}),
485
- ...(options.provenanceSummary === true ? { provenanceSummary: true } : {}),
486
- ...(harness === undefined ? {} : { harness }),
487
- ...(agentInstance === undefined ? {} : { agentInstance }),
488
- ...(provenanceFilter === undefined ? {} : { provenanceFilter }),
489
- cursorMode,
490
- };
491
- }
492
- /** Follows mutation events using either compatibility row cursors or the default batch-boundary trailer contract. */
493
- async function followMutationEvents(eventOptions, options, quiet) {
494
- if (options.provenanceSummary === true) {
495
- throw new PmCliError("Events --provenance-summary is bounded to one page and cannot be combined with --follow.", EXIT_CODE.USAGE);
496
- }
497
- const intervalMs = typeof options.intervalMs === "string"
498
- ? Number(options.intervalMs)
499
- : undefined;
500
- if (eventOptions.cursorMode === "row") {
501
- for await (const event of subscribeMutationEvents({
502
- ...eventOptions,
503
- intervalMs,
504
- })) {
505
- if (!quiet) {
506
- writeStdout(`${JSON.stringify(event)}\n`);
507
- }
508
- }
509
- return;
510
- }
511
- for await (const page of subscribeMutationEventBatches({
512
- ...eventOptions,
513
- intervalMs,
514
- })) {
515
- if (!quiet) {
516
- writeStdout(`${serializeNdjsonStream(page.events, {
517
- count: page.count,
518
- has_more: page.has_more,
519
- next_cursor: page.next_cursor ?? null,
520
- source: page.source,
521
- heartbeat: page.count === 0,
522
- })}\n`);
523
- }
524
- }
525
- }
526
- /** Serializes one bounded mutation-event page using its declared row or batch cursor mode. */
527
- function renderMutationEventPage(page) {
528
- if (page.cursor_mode === "row") {
529
- return serializeNdjsonRows(page.events);
530
- }
531
- return serializeNdjsonStream(page.events, {
532
- count: page.count,
533
- has_more: page.has_more,
534
- next_cursor: page.next_cursor ?? null,
535
- source: page.source,
536
- ...(page.provenance_summary === undefined
537
- ? {}
538
- : { provenance_summary: page.provenance_summary }),
539
- });
540
- }
541
- async function runEventsAction(options, command) {
542
- const globalOptions = getGlobalOptions(command);
543
- const startedAt = Date.now();
544
- const eventOptions = buildMutationEventOptions(options, globalOptions.path);
545
- if (options.follow === true) {
546
- await followMutationEvents(eventOptions, options, globalOptions.quiet === true);
547
- return;
548
- }
549
- const page = await listMutationEvents(eventOptions);
550
- setActiveCommandResult(page);
551
- if (globalOptions.json) {
552
- printResult(page, globalOptions);
553
- if (globalOptions.profile) {
554
- printError(`profile:command=events took_ms=${Date.now() - startedAt}`);
555
- }
556
- return;
557
- }
558
- const rendered = renderMutationEventPage(page);
559
- if (!globalOptions.quiet && rendered.length > 0) {
560
- writeStdout(`${rendered}\n`);
561
- }
562
- if (globalOptions.profile) {
563
- printError(`profile:command=events took_ms=${Date.now() - startedAt}`);
564
- }
565
- }
566
- async function runActivityAction(options, command) {
567
- const globalOptions = getGlobalOptions(command);
568
- const startedAt = Date.now();
569
- if ([options.raw, options.compact, options.full, options.provenance].filter((value) => value === true).length > 1) {
570
- throw new PmCliError("Activity projection options are mutually exclusive. Use --raw, --compact, --provenance, or --full.", EXIT_CODE.USAGE);
571
- }
572
- const streamMode = resolveActivityStreamMode(options.stream);
573
- if (streamMode && !globalOptions.json) {
574
- throw new PmCliError("--stream requires --json output mode.", EXIT_CODE.USAGE);
575
- }
576
- const normalized = normalizeActivityOptions(options);
577
- const result = await runActivity(streamMode && options.full !== true && options.provenance !== true
578
- ? { ...normalized, raw: true, compact: true }
579
- : normalized, globalOptions);
580
- if (streamMode) {
581
- printActivityJsonStream(result, normalized, globalOptions);
582
- }
583
- else {
584
- printResult(result, globalOptions);
585
- }
586
- if (globalOptions.profile) {
587
- printError(`profile:command=activity took_ms=${Date.now() - startedAt}`);
588
- }
589
- }
590
- async function runGraphAction(subcommand, id, target, options, command) {
591
- const globalOptions = getGlobalOptions(command);
592
- const startedAt = Date.now();
593
- const result = await runGraph(subcommand, id, target, {
594
- ...(Array.isArray(options.kind)
595
- ? { kind: options.kind }
596
- : {}),
597
- maxDepth: typeof options.maxDepth === "string" ? options.maxDepth : undefined,
598
- limit: typeof options.limit === "string" ? options.limit : undefined,
599
- after: typeof options.after === "string" ? options.after : undefined,
600
- direction: typeof options.direction === "string" ? options.direction : undefined,
601
- maxPaths: typeof options.maxPaths === "string" ? options.maxPaths : undefined,
602
- sample: typeof options.sample === "string" ? options.sample : undefined,
603
- ...(Array.isArray(options.exemptIsolate)
604
- ? { exemptIsolate: options.exemptIsolate }
605
- : {}),
606
- ...(Array.isArray(options.exemptIsolateType)
607
- ? { exemptIsolateType: options.exemptIsolateType }
608
- : {}),
609
- saveBaseline: options.saveBaseline === true,
610
- rebuild: options.rebuild === true,
611
- clear: options.clear === true,
612
- summary: options.summary === true,
613
- full: options.full === true,
614
- }, globalOptions);
615
- printResult(result, globalOptions);
616
- if (globalOptions.profile) {
617
- printError(`profile:command=graph took_ms=${Date.now() - startedAt}`);
618
- }
619
- }
620
- /** Implements register list query commands for the public runtime surface of this module. */
621
- export function registerListQueryCommands(program, options) {
622
- const commandFilter = options?.commandFilter;
623
- const shouldRegister = (commandName) => shouldRegisterListQueryCommand(commandName, commandFilter);
624
- const listCommandDescriptors = [
625
- {
626
- name: "list",
627
- description: "List active items with optional lifecycle-status and project filters.",
628
- excludeTerminal: true,
629
- allowStatusFilter: true,
630
- },
631
- {
632
- name: "list-all",
633
- description: "List all items with optional filters.",
634
- excludeTerminal: false,
635
- allowStatusFilter: true,
636
- },
637
- {
638
- name: "list-draft",
639
- description: "List draft items with optional filters.",
640
- status: "draft",
641
- },
642
- {
643
- name: "list-open",
644
- description: "List open items with optional filters.",
645
- status: "open",
646
- excludeTerminal: false,
647
- allowStatusFilter: false,
648
- },
649
- {
650
- name: "list-in-progress",
651
- description: "List in-progress items with optional filters.",
652
- status: "in_progress",
653
- excludeTerminal: false,
654
- allowStatusFilter: false,
655
- },
656
- {
657
- name: "list-blocked",
658
- description: "List blocked items (blocked status or open blocked_by dependencies, matching pm next) with optional filters.",
659
- dependencyBlocked: true,
660
- excludeTerminal: false,
661
- allowStatusFilter: false,
662
- },
663
- {
664
- name: "list-closed",
665
- description: "List closed items with optional filters.",
666
- status: "closed",
667
- },
668
- {
669
- name: "list-canceled",
670
- description: "List canceled items with optional filters.",
671
- status: "canceled",
672
- },
673
- ];
674
- for (const descriptor of listCommandDescriptors) {
675
- if (shouldRegister(descriptor.name)) {
676
- const aliasContract = resolvePmCommandAlias(descriptor.name);
677
- registerListCommand(program, {
678
- ...descriptor,
679
- ...(aliasContract?.registration === "commander"
680
- ? { aliasContract }
681
- : {}),
682
- });
683
- }
684
- }
685
- if (shouldRegister("aggregate")) {
686
- const aggregateCommand = program
687
- .command("aggregate")
688
- .description("Aggregate grouped item counts for governance queries.")
689
- .option("--group-by <value>", "Comma-separated group-by fields (supported: parent,type,priority,status,assignee,tags,sprint,release)")
690
- .option("--count", "Return grouped counts (default behavior)")
691
- .option("--completion", "Add open/in_progress/closed/other counts and completion_pct per group")
692
- .option("--sum <field>", "Sum a numeric field per group")
693
- .option("--avg <field>", "Average a numeric field per group")
694
- .option("--include-unparented", "Include unparented rows when grouping by parent")
695
- .option("--status <value>", "Filter by item status")
696
- .option("--type <value>", "Filter by item type")
697
- .option("--tag <value>", "Filter by tag")
698
- .option("--priority <value>", "Filter by priority")
699
- .option("--deadline-before <value>", "Filter by deadline upper bound (ISO/date string or relative)")
700
- .option("--deadline-after <value>", "Filter by deadline lower bound (ISO/date string or relative)")
701
- .option("--assignee <value>", "Filter by assignee")
702
- .option("--assignee-filter <value>", "Filter assignee presence: assigned|unassigned")
703
- .option("--parent <value>", "Filter by parent item ID")
704
- .option("--sprint <value>", "Filter by sprint")
705
- .option("--release <value>", "Filter by release");
706
- // Hidden pure snake_case underscore-duplicate aliases (kept parse-functional).
707
- addHiddenOption(aggregateCommand, "--include_unparented", "Alias for --include-unparented");
708
- addHiddenOption(aggregateCommand, "--assignee_filter <value>", "Alias for --assignee-filter");
709
- aggregateCommand.action(runAggregateAction);
710
- }
711
- if (shouldRegister("context")) {
712
- const contextCommand = program
713
- .command("context")
714
- .alias("ctx")
715
- .description("Show a token-efficient project context snapshot for next-work decisions.")
716
- .option("--for <intent>", `Apply a declared context intent projection. ${renderPmClosedDomainHelp("context", "--for")}`)
717
- .option("--date <value>", "Anchor date/time for agenda window calculations (ISO/date string or relative)")
718
- .option("--from <value>", "Agenda lower bound (ISO/date string or relative)")
719
- .option("--to <value>", "Agenda upper bound (ISO/date string or relative)")
720
- .option("--past", "Include past agenda entries in bounded windows")
721
- .option("--type <value>", "Filter by item type")
722
- .option("--tag <value>", "Filter by tag")
723
- .option("--priority <value>", "Filter by priority")
724
- .option("--assignee <value>", "Filter by assignee")
725
- .option("--assignee-filter <value>", "Filter assignee presence: assigned|unassigned")
726
- .option("--sprint <value>", "Filter by sprint")
727
- .option("--release <value>", "Filter by release")
728
- .option("--parent <id>", "Scope the snapshot to one item's subtree (the item plus all descendants)")
729
- .option("--limit <n>", "Limit focus and agenda rows per section")
730
- .option("--after <cursor>", "Continue ranked focus after a next_cursor from a previous context response")
731
- .option("--format <value>", "Context output format override: markdown|toon|json|ndjson")
732
- .option("--depth <value>", "Context depth: brief|standard|deep|full (full = every section, no per-section cap)")
733
- .option("--section <value...>", "Include specific sections (repeatable; overrides --depth)")
734
- .option("--fields <value>", "Project focus rows to a comma-separated field subset (e.g. id,title,priority)")
735
- .option("--activity-limit <n>", "Limit recent activity entries (default: settings or 10)")
736
- .option("--stale-threshold <value>", "Staleness cutoff in days (e.g. 7 or 7d; default: settings or 7)")
737
- .option("--explain-ranking", "Include the scorer model, per-signal contributions, and ranked candidate ids")
738
- .option("--token-budget <n>", "Maximum estimated tokens spent on ranked focus rows")
739
- .option("--no-extension-health", "Omit the installed extension health summary")
740
- .option("--no-tags", "Omit tag arrays from context focus rows");
741
- // Hidden pure snake_case underscore-duplicate alias (kept parse-functional).
742
- addHiddenOption(contextCommand, "--assignee_filter <value>", "Alias for --assignee-filter");
743
- addHiddenOption(contextCommand, "--max-items <n>", "Alias for --limit");
744
- addHiddenOption(contextCommand, "--explain_ranking", "Alias for --explain-ranking");
745
- addHiddenOption(contextCommand, "--token_budget <n>", "Alias for --token-budget");
746
- contextCommand.action(runContextAction);
747
- }
748
- if (shouldRegister("next")) {
749
- const nextCommand = program
750
- .command("next")
751
- .description("Recommend the next actionable (unblocked, ready) work item with rationale + blocked companion.")
752
- .option("--for <intent>", `Apply a declared context intent projection. ${renderPmClosedDomainHelp("next", "--for")}`)
753
- .option("--type <value>", "Filter candidate items by type")
754
- .option("--tag <value>", "Filter candidate items by tag")
755
- .option("--priority <value>", "Filter candidate items by priority")
756
- .option("--assignee <value>", "Filter candidate items by assignee")
757
- .option("--assignee-filter <value>", "Filter assignee presence: assigned|unassigned")
758
- .option("--sprint <value>", "Filter candidate items by sprint")
759
- .option("--release <value>", "Filter candidate items by release")
760
- .option("--parent <id>", "Scope to one item's subtree (the item plus all descendants)")
761
- .option("--limit <n>", "Limit ready rows (default: 5; non-positive falls back to default)")
762
- .option("--blocked-limit <n>", "Limit blocked rows (default: same as --limit)")
763
- .option("--ready-only", "Omit the blocked companion list")
764
- .option("--include-decisions", "Include human-gated Decision items in the claimable ready queue")
765
- .option("--include-gates", "Include outcome gates in the ready queue")
766
- .option("--include-containers", "Include containers with unfinished descendants in the ready queue")
767
- .option("--format <value>", "Next output format override: markdown|toon|json")
768
- .option("--explain-ranking", "Include the scorer model, per-signal contributions, and ranked ready ids")
769
- .option("--token-budget <n>", "Maximum estimated tokens spent on the ranked ready queue");
770
- addHiddenOption(nextCommand, "--assignee_filter <value>", "Alias for --assignee-filter");
771
- addHiddenOption(nextCommand, "--blocked_limit <n>", "Alias for --blocked-limit");
772
- addHiddenOption(nextCommand, "--ready_only", "Alias for --ready-only");
773
- addHiddenOption(nextCommand, "--explain_ranking", "Alias for --explain-ranking");
774
- addHiddenOption(nextCommand, "--token_budget <n>", "Alias for --token-budget");
775
- nextCommand.action(runNextAction);
776
- }
777
- if (shouldRegister("search")) {
778
- const searchCommand = program
779
- .command("search")
780
- .argument("<keywords...>", "Keyword query tokens")
781
- .description("Search items with keyword, semantic, or hybrid retrieval. Inline field:value tokens " +
782
- "(tag:/status:/type:/priority:) in the query are parsed as filters, e.g. 'auth tag:area:search status:open'.")
783
- .option("--for <intent>", `Apply a declared context intent projection. ${renderPmClosedDomainHelp("search", "--for")}`)
784
- .option("--token-budget <n>", "Override the selected intent's maximum estimated output tokens")
785
- .option("--mode <value>", "Search mode: keyword|semantic|hybrid (default: keyword)")
786
- .option("--semantic", "Shorthand for --mode semantic")
787
- .option("--hybrid", "Shorthand for --mode hybrid")
788
- .option("--match-mode <value>", "Token match mode: and|or|exact (default: or with all-terms ranking bonus; and = hard-require every token; exact = exact phrase)")
789
- .option("--min-score <value>", "Per-query minimum score threshold (finite number >= 0); overrides settings search.score_threshold for this query only")
790
- .option("--count", "Return only the count of matching items (post-filter/threshold, pre-limit); skips hit rows")
791
- .option("--semantic-weight <value>", "Override hybrid semantic weight for this query (0..1); invalid values fall back to settings")
792
- .option("--include-linked", "Include linked files, docs, and tests in the searchable corpus")
793
- .option("--title-exact", "Require exact normalized title match for the full query string")
794
- .option("--phrase-exact", "Require exact normalized phrase match in searchable text")
795
- .option("--highlight", "Emit per-field matched-text snippets (wrapped in «…») on each hit; off by default")
796
- .option("--status <value>", "Filter by status before query (all, open/closed/canceled aliases, or configured status id; CSV)")
797
- .option("--type <value>", "Filter by item type")
798
- .option("--tag <value>", "Filter by tag")
799
- .option("--priority <value>", "Filter by priority")
800
- .option("--deadline-before <value>", "Filter by deadline upper bound (ISO/date string or relative)")
801
- .option("--deadline-after <value>", "Filter by deadline lower bound (ISO/date string or relative)")
802
- .option("--updated-after <value>", 'Filter by updated_at lower bound: ISO timestamp or signed relative (e.g. "-2h"/"-7d" for the past)')
803
- .option("--updated-before <value>", "Filter by updated_at upper bound: ISO timestamp or signed relative (-2h/+1d)")
804
- .option("--created-after <value>", "Filter by created_at lower bound: ISO timestamp or signed relative (-2h/+1d)")
805
- .option("--created-before <value>", "Filter by created_at upper bound: ISO timestamp or signed relative (-2h/+1d)")
806
- .option("--assignee <value>", "Filter by assignee")
807
- .option("--sprint <value>", "Filter by sprint")
808
- .option("--release <value>", "Filter by release")
809
- .option("--parent <value>", "Filter by parent item ID")
810
- .option("--compact", "Render compact search hits (default; mutually exclusive with --full/--fields)")
811
- .option("--full", "Render full search hits with nested item payloads (mutually exclusive with --compact/--fields)")
812
- .option("--fields <value>", `Render custom comma-separated search hit fields (mutually exclusive with --compact/--full). ${renderPmClosedDomainHelp("search", "--fields")}`)
813
- .option("--format <value>", "Search output format override: json|ndjson|toon")
814
- .option("--limit <n>", "Limit returned item count")
815
- .option("--after <cursor>", "Continue after an opaque next_cursor from a previous search response");
816
- registerContentAndGovernanceFilters(searchCommand);
817
- searchCommand.action(runSearchAction);
818
- addHiddenOption(searchCommand, "--tags <value>", "Alias for --tag");
819
- addHiddenOption(searchCommand, "--token_budget <n>", "Alias for --token-budget");
820
- }
821
- if (shouldRegister("eval")) {
822
- program
823
- .command("eval")
824
- .description("Evaluate search relevance against a curated golden-query set: reports nDCG@k, MRR@k, " +
825
- "precision@k, and recall@k per query plus the macro average. Use --fail-under as a CI gate.")
826
- .option("--mode <value>", "Default retrieval mode for queries without their own: keyword|semantic|hybrid (default: keyword)")
827
- .option("--k <n>", "Metric cutoff @k (positive integer; default: 10)")
828
- .option("--fail-under <value>", "Exit non-zero when aggregate nDCG@k falls below this threshold (0..1); CI gate")
829
- .option("--queries <path>", `Query JSON (${EVAL_QUERY_SET_SCHEMA_ID}); default: search/eval-queries.json; errors show an example`)
830
- .option("--format <value>", "Eval output format override: json|toon")
831
- .action(runEvalAction);
832
- }
833
- if (shouldRegister("get")) {
834
- const getCommand = program
835
- .command("get")
836
- .argument("<id>", "Item id")
837
- .option("--for <intent>", `Apply a declared context intent projection. ${renderPmClosedDomainHelp("get", "--for")}`)
838
- .option("--token-budget <n>", "Override the selected intent's maximum estimated output tokens")
839
- .option("--depth <value>", "Detail depth: brief|standard|deep|full (full aliases deep; default: standard)")
840
- .option("--full", "Explicit full item read; equivalent to --depth deep (mutually exclusive with --depth/--fields)")
841
- .option("--fields <value>", `Render custom comma-separated item metadata fields. ${renderPmClosedDomainHelp("get", "--fields")}`)
842
- .option("--tree", "Include descendants rooted at the requested item")
843
- .option("--tree-depth <n>", "Maximum subtree depth for --tree descendants")
844
- .option("--at <version-or-timestamp>", "Reconstruct a verified historical item state without mutating it")
845
- .option("--format <value>", "Get output format override: json|toon")
846
- .description("Show item details by ID.")
847
- .action(runGetAction);
848
- addHiddenOption(getCommand, "--tree_depth <n>", "Alias for --tree-depth");
849
- addHiddenOption(getCommand, "--token_budget <n>", "Alias for --token-budget");
850
- }
851
- if (shouldRegister("history")) {
852
- program
853
- .command("history")
854
- .argument("<id>", "Item id")
855
- .option("--limit <n>", "Return only the latest n history entries")
856
- .option("--compact", "Condensed output: show entry index, timestamp, op, author, patch count, and changed fields")
857
- .option("--full", "Show full history entries with JSON Patch payloads")
858
- .option("--provenance", "Show patch-free author, harness, instance, and extensible provenance")
859
- .option("--provenance-summary", "Include bounded provenance completeness counts")
860
- .option("--harness <value>", "Filter by recorded or vocabulary-resolved harness (repeatable)", collect)
861
- .option("--agent-instance <value>", "Filter by privacy-safe agent instance (repeatable)", collect)
862
- .option("--provenance-filter <dimension=value>", "Filter by an exact declared provenance value (repeatable)", collect)
863
- .option("--diff", "Include per-entry field-level before/after value diffs computed by replaying the history chain")
864
- .option("--field <name>", "With --diff, show only entries that changed this field (implies --diff)")
865
- .option("--verify", "Verify hash chain and replay integrity for the full history stream")
866
- .option("--strict-exit", "With --verify, exit nonzero when verification fails (merge-safety gate parity with pm validate)")
867
- .option("--fail-on-warn", "Alias for --strict-exit")
868
- .option("--format <value>", "History output format override: json|toon")
869
- .description("Show item history entries.")
870
- .action(runHistoryAction);
871
- }
872
- if (shouldRegister("events")) {
873
- program
874
- .command("events")
875
- .option("--since <cursor-or-timestamp>", "Resume strictly after a durable cursor, or include events from an ISO timestamp")
876
- .option("--type <value>", "Filter by mutation operation (repeatable or comma-separated)", collect)
877
- .option("--author <value>", "Filter by mutation author (repeatable or comma-separated)", collect)
878
- .option("--item <value>", "Filter by item or workspace stream id (repeatable or comma-separated)", collect)
879
- .option("--limit <n>", "Return at most 1,000 events (default: 100)")
880
- .option("--cursor-mode <mode>", "Cursor framing: batch emits one terminal trailer (default); row preserves one cursor per event")
881
- .option("--full", "Include each complete authoritative history entry")
882
- .option("--provenance", "Include patch-free author, harness, instance, and extensible provenance")
883
- .option("--provenance-summary", "Include bounded provenance completeness counts")
884
- .option("--harness <value>", "Filter by recorded or vocabulary-resolved harness (repeatable)", collect)
885
- .option("--agent-instance <value>", "Filter by privacy-safe agent instance (repeatable)", collect)
886
- .option("--provenance-filter <dimension=value>", "Filter by an exact declared provenance value (repeatable)", collect)
887
- .option("--follow", "Continue emitting committed events as newline-delimited JSON")
888
- .option("--interval-ms <n>", "Empty-read delay while following (minimum: 10ms; default: 250ms)")
889
- .description("Emit cursor-resumable committed mutation facts as newline-delimited JSON.")
890
- .action(runEventsAction);
891
- }
892
- if (shouldRegister("activity")) {
893
- program
894
- .command("activity")
895
- .option("--id <value>", "Filter by item ID")
896
- .option("--op <value>", "Filter by history operation")
897
- .option("--author <value>", "Filter by history author")
898
- .option("--from <value>", "Lower timestamp bound (ISO/date string or relative)")
899
- .option("--to <value>", "Upper timestamp bound (ISO/date string or relative)")
900
- .option("--limit <n>", "Return only the latest n activity entries")
901
- .option("--unbounded", "Explicitly return every matching activity entry (disables the default bound)")
902
- .option("--compact", "Condensed output: show only id, op, ts, author, msg per entry")
903
- .option("--raw", "Show the legacy compact per-event stream instead of the item digest")
904
- .option("--full", "Show full activity entries with JSON Patch payloads")
905
- .option("--provenance", "Show patch-free author, harness, instance, and extensible provenance")
906
- .option("--provenance-summary", "Include bounded provenance completeness counts")
907
- .option("--harness <value>", "Filter by recorded or vocabulary-resolved harness (repeatable)", collect)
908
- .option("--agent-instance <value>", "Filter by privacy-safe agent instance (repeatable)", collect)
909
- .option("--provenance-filter <dimension=value>", "Filter by an exact declared provenance value (repeatable)", collect)
910
- .option("--stream [mode]", "Emit line-delimited JSON rows (requires --json). Optional mode: rows|ndjson|jsonl")
911
- .description("Show recent activity across items.")
912
- .action(runActivityAction);
913
- }
914
- if (shouldRegister("graph")) {
915
- program
916
- .command("graph")
917
- .argument("<subcommand>", "Graph query (ancestors, descendants, predecessors, successors, paths, impact, analyze, audit, communities, redundancy, dominators, slack, centrality, articulation, plan, index)")
918
- .argument("[id]", "Root item id (traversals, paths, impact, and dominators)")
919
- .argument("[target]", "Target item id (paths only)")
920
- .option("--kind <value>", "Restrict traversal to registered relationship kinds (repeatable or comma-separated)", collect)
921
- .option("--max-depth <value>", "Maximum traversal depth (non-negative integer)")
922
- .option("--limit <value>", "Maximum returned rows per bounded collection")
923
- .option("--after <value>", "Resume a traversal after this previously returned node id")
924
- .option("--direction <value>", "Edge orientation for paths/impact (outgoing, incoming, or both)")
925
- .option("--max-paths <value>", "Maximum enumerated paths (paths only)")
926
- .option("--sample <value>", "Maximum evidence sample entries per audit finding (audit only)")
927
- .option("--exempt-isolate <value>", "Item ids treated as explicitly valid isolates by the audit (repeatable or comma-separated)", collect)
928
- .option("--exempt-isolate-type <value>", "Item types whose active isolates are policy-valid for the audit (repeatable or comma-separated)", collect)
929
- .option("--save-baseline", "Persist the audit census as the change-since-baseline comparison point (audit only)")
930
- .option("--rebuild", "Rebuild and warm the durable graph index (index only)")
931
- .option("--clear", "Delete the durable graph index (index only)")
932
- .option("--summary", "Return counts-first envelopes without row collections")
933
- .option("--full", "Return the complete graph row projection")
934
- .description("Bounded workspace relationship-graph queries, analytics, and governance audit.")
935
- .action(runGraphAction);
936
- }
937
- }
938
- /** Public contract for test only register list query, shared by SDK and presentation-layer consumers. */
939
- export const _testOnlyRegisterListQuery = {
940
- resolveReadCommandOutputFormat,
941
- parseListFormat,
942
- };
1
+ !(function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=new e.Error().stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="7f10283d-7b38-500c-9ad2-16c62ee336c1")}catch(e2){}})();import{EXIT_CODE,PmCliError,readSettings,renderRowsAsCsv,renderRowsAsTable,resolvePmRoot}from"../sdk/runtime-primitives.js";import{renderPmCommandAliasMigrationHint,resolvePmCommandAlias}from"../sdk/cli-contracts.js";import{EVAL_QUERY_SET_SCHEMA_ID}from"../sdk/eval.js";import{applyContextIntentProjection}from"../sdk/context-intent-contracts.js";import{renderPmClosedDomainHelp}from"../sdk/agent/closed-domain-contracts.js";import{serializeNdjsonRows,serializeNdjsonStream}from"../sdk/output.js";import{listMutationEvents,subscribeMutationEventBatches,subscribeMutationEvents}from"../sdk/mutation-events.js";import{registerHistoryActivityCommand}from"./register-history-activity.js";import{registerHistoryMaintenanceCommands}from"./register-history-maintenance.js";import{runAggregate}from"./commands/aggregate.js";import{renderContextMarkdown,runContext,resolveContextOutputFormat}from"./commands/context.js";import{runEval}from"./commands/eval.js";import{runGet}from"./commands/get.js";import{runGraph}from"./commands/graph.js";import{runHistory}from"./commands/history.js";import{runList}from"./commands/list.js";import{LIST_COMMAND_DEFAULT_PROJECTIONS}from"../sdk/query/list.js";import{renderNextMarkdown,runNext,resolveNextOutputFormat}from"./commands/next.js";import{runSearch}from"./commands/search.js";import{addHiddenOption,collect,getGlobalOptions,normalizeAggregateOptions,normalizeContextOptions,normalizeListOptions,normalizeNextOptions,normalizeSearchKeywordsInput,normalizeSearchOptions,printError,printListJsonStream,printResult,setActiveCommandResult,writeStdout}from"./registration-helpers.js";function shouldRegisterListQueryCommand(commandName,commandFilter){if(!commandFilter||commandFilter.size===0){return true}if(commandName==="context"){return commandFilter.has("context")||commandFilter.has("ctx")}return commandFilter.has(commandName)}function parseListFormat(rawFormat){if(rawFormat===void 0){return void 0}if(typeof rawFormat!=="string"){throw new PmCliError("List --format must be one of csv|table|json|ndjson|toon",EXIT_CODE.USAGE)}const normalized=rawFormat.trim().toLowerCase();if(normalized==="csv"||normalized==="table"||normalized==="json"||normalized==="ndjson"||normalized==="toon"){return normalized}throw new PmCliError("List --format must be one of csv|table|json|ndjson|toon",EXIT_CODE.USAGE)}function resolveReadCommandOutputFormat(commandLabel,rawFormat,globalOptions,allowNdjson=false){if(rawFormat===void 0){return globalOptions}if(typeof rawFormat!=="string"){throw new PmCliError(`${commandLabel} --format must be one of ${allowNdjson?"json|ndjson|toon":"json|toon"}`,EXIT_CODE.USAGE)}const normalized=rawFormat.trim().toLowerCase();if(normalized!=="json"&&(normalized!=="ndjson"||!allowNdjson)&&normalized!=="toon"){throw new PmCliError(`${commandLabel} --format must be one of ${allowNdjson?"json|ndjson|toon":"json|toon"}`,EXIT_CODE.USAGE)}if(globalOptions.json===true&&normalized==="toon"){throw new PmCliError(`${commandLabel} cannot combine --json with --format toon`,EXIT_CODE.USAGE)}return{...globalOptions,json:normalized==="json"||normalized==="ndjson"}}function applyDefaultListProjection(listOptions,commandName){if(LIST_COMMAND_DEFAULT_PROJECTIONS[commandName]==="brief"&&listOptions.includeBody!==true&&listOptions.compact!==true&&listOptions.brief!==true&&listOptions.full!==true&&listOptions.fields===void 0){listOptions.brief=true}}function registerContentAndGovernanceFilters(command){command.option("--has-notes","Show only items that have notes").option("--has-learnings","Show only items that have learnings").option("--has-files","Show only items that have linked files").option("--has-docs","Show only items that have linked docs").option("--has-tests","Show only items that have linked tests").option("--has-comments","Show only items that have comments").option("--has-deps","Show only items that have dependencies").option("--has-body","Show only items that have a non-empty body").option("--has-linked-command","Show only items whose linked tests carry a runnable command").option("--no-notes","Show only items that have no notes").option("--no-learnings","Show only items that have no learnings").option("--no-files","Show only items that have no linked files").option("--filter-files-missing","Alias for --no-files").option("--no-docs","Show only items that have no linked docs").option("--filter-docs-missing","Alias for --no-docs").option("--no-tests","Show only items that have no linked tests").option("--no-comments","Show only items that have no comments").option("--no-deps","Show only items that have no dependencies").option("--empty-body","Show only items with an empty body").option("--no-linked-command","Show only items whose linked tests carry no runnable command").option("--filter-reviewer-missing","Show only items missing reviewer").option("--filter-risk-missing","Show only items missing risk").option("--filter-confidence-missing","Show only items missing confidence").option("--filter-sprint-missing","Show only items missing sprint").option("--filter-release-missing","Show only items missing release")}const CANONICAL_LIST_STATUS_VARIANTS={draft:{name:"list-draft",dependencyBlocked:false},open:{name:"list-open",dependencyBlocked:false},in_progress:{name:"list-in-progress",dependencyBlocked:false},blocked:{name:"list-blocked",dependencyBlocked:true},closed:{name:"list-closed",dependencyBlocked:false},canceled:{name:"list-canceled",dependencyBlocked:false}};function resolveRegisteredListOutputContext(options,globalOptions){const streamMode=options.stream===true;const listFormat=parseListFormat(options.format);const tabular=listFormat==="csv"||listFormat==="table";const effectiveGlobal=listFormat==="json"||listFormat==="ndjson"||listFormat==="toon"?resolveReadCommandOutputFormat("List",options.format,globalOptions,true):globalOptions;if(streamMode&&!effectiveGlobal.json){throw new PmCliError("--stream requires --json output mode.",EXIT_CODE.USAGE)}if((tabular||listFormat==="ndjson")&&streamMode){throw new PmCliError("--format csv|table|ndjson cannot be combined with --stream.",EXIT_CODE.USAGE)}return{streamMode,listFormat,effectiveGlobal}}function renderRegisteredListResult(commandName,result,output){if(output.listFormat==="csv"||output.listFormat==="table"){setActiveCommandResult(result);const rows=result.items;const rendered=output.listFormat==="csv"?renderRowsAsCsv(rows):renderRowsAsTable(rows);if(!output.effectiveGlobal.quiet&&rendered.length>0){writeStdout(`${rendered}
2
+ `)}}else if(output.listFormat==="ndjson"){setActiveCommandResult(result);const rendered=serializeNdjsonRows(result.items);if(!output.effectiveGlobal.quiet&&rendered.length>0){writeStdout(`${rendered}
3
+ `)}}else if(output.streamMode){printListJsonStream(commandName,result,output.effectiveGlobal)}else{printResult(result,output.effectiveGlobal)}}async function runRegisteredListCommand(params){const parsedGlobalOptions=getGlobalOptions(params.actionCommand);const globalOptions=params.aliasContract?{...parsedGlobalOptions,command:params.aliasContract.canonical}:parsedGlobalOptions;const startedAt=Date.now();if(params.aliasContract?.lifecycle==="deprecated"){const deprecationHints=await readSettings(resolvePmRoot(process.cwd(),globalOptions.path)).then(settings=>settings.ux.deprecation_hints);if(deprecationHints){printError(renderPmCommandAliasMigrationHint(params.aliasContract))}}const intentOptions=applyContextIntentProjection("list",params.options);const listOptions=normalizeListOptions(intentOptions);const selection=resolveRegisteredListSelection(params,listOptions);const{effectiveName,effectiveStatus,effectiveDependencyBlocked,effectiveExcludeTerminal}=selection;applyDefaultListProjection(listOptions,effectiveName);Object.assign(listOptions,{projectionCommand:effectiveName});if(effectiveExcludeTerminal)listOptions.excludeTerminal=true;listOptions.dependencyBlocked=effectiveDependencyBlocked;const output=resolveRegisteredListOutputContext(intentOptions,globalOptions);const result=await runList(effectiveDependencyBlocked?void 0:effectiveStatus,listOptions,globalOptions);renderRegisteredListResult("list",result,output);if(globalOptions.profile){printError(`profile:command=list took_ms=${Date.now()-startedAt}`)}}function resolveRegisteredListSelection(params,listOptions){let effectiveName=params.name;let effectiveStatus=params.status;let effectiveDependencyBlocked=params.dependencyBlocked===true;let effectiveExcludeTerminal=params.excludeTerminal===true;const requestedStatus=listOptions.status?.trim().toLowerCase();const requestedVariant=params.name==="list"&&requestedStatus!==void 0?CANONICAL_LIST_STATUS_VARIANTS[requestedStatus]:void 0;if(params.name==="list"){if(params.options.all===true||requestedStatus==="all"){effectiveName="list-all";effectiveExcludeTerminal=false;listOptions.status=void 0}else if(requestedStatus!==void 0&&requestedVariant!==void 0){effectiveName=requestedVariant.name;effectiveStatus=requestedStatus;effectiveDependencyBlocked=requestedVariant.dependencyBlocked;effectiveExcludeTerminal=false;listOptions.status=void 0}}if(effectiveName==="list-open"||effectiveName==="list-in-progress"){listOptions.lifecycleBucket=effectiveName==="list-open"?"open":"in_progress";effectiveStatus=void 0}return{effectiveName,effectiveStatus,effectiveDependencyBlocked,effectiveExcludeTerminal}}function registerListCommand(program,descriptor){const{name,description,status,excludeTerminal,allowStatusFilter,dependencyBlocked,aliasContract}=descriptor;const command=program.command(name,{hidden:aliasContract?.hidden===true}).description(description);if(allowStatusFilter){command.option("--status <value>","Filter by status (repeatable or comma-separated; matches any; all selects every status)",collect)}if(name==="list"){command.option("--all","Include every lifecycle status")}command.option("--for <intent>",`Apply a declared context intent projection. ${renderPmClosedDomainHelp("list","--for")}`).option("--token-budget <n>","Override the selected intent's maximum estimated output tokens").option("--type <value>","Filter by item type (repeatable or comma-separated; matches any)",collect).option("--tag <value>","Filter by tag (repeatable or comma-separated; matches any)",collect).option("--priority <value>","Filter by priority (repeatable or comma-separated; matches any)",collect).option("--deadline-before <value>","Filter by deadline upper bound (ISO/date string or relative)").option("--deadline-after <value>","Filter by deadline lower bound (ISO/date string or relative)").option("--today","Filter to items updated since local midnight today").option("--recent","Filter to items updated in the last 7 days").option("--updated-after <value>",'Filter by updated_at lower bound: ISO timestamp or signed relative (e.g. "-2h"/"-7d" for the past). "Changed since my last window" \u2192 --updated-after <ISO>').option("--updated-before <value>","Filter by updated_at upper bound: ISO timestamp or signed relative (-2h/+1d)").option("--created-after <value>","Filter by created_at lower bound: ISO timestamp or signed relative (-2h/+1d)").option("--created-before <value>","Filter by created_at upper bound: ISO timestamp or signed relative (-2h/+1d)").option("--ids <value>","Filter by explicit item IDs (comma-separated or repeatable)").option("--assignee <value>","Filter by assignee",collect).option("--assignee-filter <value>","Filter assignee presence: assigned|unassigned").option("--parent <value>","Filter by parent item ID").option("--sprint <value>","Filter by sprint",collect).option("--release <value>","Filter by release",collect).option("--filter-ac-missing","Show only items missing acceptance_criteria").option("--filter-estimates-missing","Show only items missing estimated_minutes").option("--filter-resolution-missing","Show only terminal items missing resolution").option("--filter-metadata-missing","Show only items missing any tracked metadata (AC, estimate, or resolution)").option("--limit <n>","Limit returned item count").option("--offset <n>","Skip the first n matching rows before limit is applied").option("--after <cursor>","Continue after an opaque next_cursor from a previous list response").option("--no-truncate","Return every matched row after the explicit status and field filters").option("--include-body","Include item body in each returned list row").option("--strict-read","Fail closed if any item document or item directory cannot be read").option("--compact","Render compact list projection fields (mutually exclusive with --brief/--full/--fields)").option("--brief","Ultra-compact output: id, status, type, title only (agent-optimized, mutually exclusive with --compact/--full/--fields)").option("--full","Render full list projection fields (mutually exclusive with --compact/--brief/--fields)").option("--fields <value>",`Render custom comma-separated list fields (mutually exclusive with --compact/--brief/--full). ${renderPmClosedDomainHelp(name,"--fields")}`).option("--sort <value>","Sort field: priority|deadline|updated_at|created_at|title|parent (aliases: updated, created)").option("--order <value>","Sort order: asc|desc (requires --sort)").option("--tree","Render rows in parent/child tree order").option("--tree-depth <n>","Maximum recursion depth with --tree (0 keeps root rows only)").option("--format <value>","Output render mode: csv|table (human export) or json|ndjson|toon (machine output override)").option("--stream","Emit line-delimited JSON rows (requires --json)");registerContentAndGovernanceFilters(command);command.action(async(options,actionCommand)=>{await runRegisteredListCommand({name,status,excludeTerminal,dependencyBlocked,options,actionCommand,aliasContract})});addHiddenOption(command,"--tags <value>","Alias for --tag");addHiddenOption(command,"--assignee_filter <value>","Alias for --assignee-filter");addHiddenOption(command,"--tree_depth <n>","Alias for --tree-depth");addHiddenOption(command,"--token_budget <n>","Alias for --token-budget");addHiddenOption(command,"--filter-estimate-missing","Alias for --filter-estimates-missing")}async function runAggregateAction(options,command){const globalOptions=getGlobalOptions(command);const startedAt=Date.now();const result=await runAggregate(normalizeAggregateOptions(options),globalOptions);printResult(result,globalOptions);if(globalOptions.profile){printError(`profile:command=aggregate took_ms=${Date.now()-startedAt}`)}}async function runContextAction(options,actionCommand){const globalOptions=getGlobalOptions(actionCommand);const startedAt=Date.now();const normalized=normalizeContextOptions(applyContextIntentProjection("context",options));const result=await runContext(normalized,globalOptions);const outputFormat=resolveContextOutputFormat(normalized,globalOptions);if(outputFormat==="markdown"){if(!globalOptions.quiet){writeStdout(`${renderContextMarkdown(result)}
4
+ `)}}else if(outputFormat==="ndjson"){setActiveCommandResult(result);const rendered=serializeNdjsonRows([...result.high_level,...result.low_level,...result.blocked_fallback]);if(!globalOptions.quiet&&rendered.length>0){writeStdout(`${rendered}
5
+ `)}}else{printResult(result,{...globalOptions,json:outputFormat==="json"})}if(globalOptions.profile){printError(`profile:command=context took_ms=${Date.now()-startedAt}`)}}async function runNextAction(options,actionCommand){const globalOptions=getGlobalOptions(actionCommand);const startedAt=Date.now();const nextOptions=normalizeNextOptions(applyContextIntentProjection("next",options));const result=await runNext(nextOptions,globalOptions);const outputFormat=resolveNextOutputFormat(nextOptions,globalOptions);if(outputFormat==="markdown"){if(!globalOptions.quiet){writeStdout(`${renderNextMarkdown(result)}
6
+ `)}}else{printResult(result,{...globalOptions,json:outputFormat==="json"})}if(globalOptions.profile){printError(`profile:command=next took_ms=${Date.now()-startedAt}`)}}async function runSearchAction(keywords,options,command){const globalOptions=getGlobalOptions(command);const startedAt=Date.now();const query=normalizeSearchKeywordsInput(keywords);const intentOptions=applyContextIntentProjection("search",options,[query]);const searchOptions=normalizeSearchOptions(intentOptions);const result=await runSearch(query,{...searchOptions,mode:typeof searchOptions.mode==="string"&&searchOptions.mode.trim().length>0?searchOptions.mode:"keyword"},globalOptions);const outputFormat=typeof intentOptions.format==="string"?intentOptions.format.trim().toLowerCase():void 0;const effectiveGlobal=resolveReadCommandOutputFormat("Search",intentOptions.format,globalOptions,true);if(outputFormat==="ndjson"){setActiveCommandResult(result);const rendered=serializeNdjsonRows(result.items);if(!effectiveGlobal.quiet&&rendered.length>0){writeStdout(`${rendered}
7
+ `)}}else{printResult(result,effectiveGlobal)}if(globalOptions.profile){printError(`profile:command=search took_ms=${Date.now()-startedAt}`)}}async function runEvalAction(options,command){const globalOptions=getGlobalOptions(command);const startedAt=Date.now();const result=await runEval({mode:typeof options.mode==="string"?options.mode:void 0,k:typeof options.k==="string"?options.k:void 0,failUnder:typeof options.failUnder==="string"?options.failUnder:void 0,queries:typeof options.queries==="string"?options.queries:void 0,format:typeof options.format==="string"?options.format:void 0},globalOptions);printResult(result,resolveReadCommandOutputFormat("Eval",options.format,globalOptions));if(globalOptions.profile){printError(`profile:command=eval took_ms=${Date.now()-startedAt}`)}if(!result.passed){throw new PmCliError(`Eval gate failed: aggregate nDCG@${result.k} ${result.aggregate.ndcg} is below --fail-under ${result.fail_under}`,EXIT_CODE.GENERIC_FAILURE)}}async function runGetAction(id,options,command){const globalOptions=getGlobalOptions(command);const startedAt=Date.now();const intentOptions=applyContextIntentProjection("get",options,[id]);const result=await runGet(id,globalOptions,{depth:typeof intentOptions.depth==="string"?intentOptions.depth:void 0,fields:typeof intentOptions.fields==="string"?intentOptions.fields:void 0,full:Boolean(intentOptions.full),tree:intentOptions.tree===true,treeDepth:typeof intentOptions.treeDepth==="string"?intentOptions.treeDepth:typeof intentOptions.tree_depth==="string"?intentOptions.tree_depth:void 0,at:typeof intentOptions.at==="string"?intentOptions.at:void 0});printResult(result,resolveReadCommandOutputFormat("Get",intentOptions.format,globalOptions));if(globalOptions.profile){printError(`profile:command=get took_ms=${Date.now()-startedAt}`)}}async function runHistoryAction(id,options,command){const globalOptions=getGlobalOptions(command);const startedAt=Date.now();if([options.compact,options.raw,options.full,options.provenance].filter(value=>value===true).length>1){throw new PmCliError("History projection options are mutually exclusive. Use --compact, --provenance, or --full.",EXIT_CODE.USAGE)}const field=typeof options.field==="string"?options.field:void 0;const strictExit=Boolean(options.strictExit)||Boolean(options.failOnWarn);if(strictExit&&!options.verify){throw new PmCliError("--strict-exit requires --verify (it gates on the verification result).",EXIT_CODE.USAGE)}const result=await runHistory(id,{limit:typeof options.limit==="string"?options.limit:void 0,compact:options.full===true||options.provenance===true?false:true,provenance:options.provenance===true,provenanceSummary:options.provenanceSummary===true,harness:readRepeatableStringOption(options,"harness"),agentInstance:readRepeatableStringOption(options,"agentInstance"),provenanceFilter:readRepeatableStringOption(options,"provenanceFilter"),diff:Boolean(options.diff)||field!==void 0,field,verify:Boolean(options.verify)},globalOptions);printResult(result,resolveReadCommandOutputFormat("History",options.format,globalOptions));if(strictExit&&result.verification&&!result.verification.ok){process.exitCode=EXIT_CODE.GENERIC_FAILURE}if(globalOptions.profile){printError(`profile:command=history took_ms=${Date.now()-startedAt}`)}}function readRepeatableStringOption(options,key){const value=options[key];return Array.isArray(value)?value:void 0}function buildMutationEventOptions(options,pmRoot){const harness=readRepeatableStringOption(options,"harness");const agentInstance=readRepeatableStringOption(options,"agentInstance");const provenanceFilter=readRepeatableStringOption(options,"provenanceFilter");const rawCursorMode=typeof options.cursorMode==="string"?options.cursorMode:void 0;if(rawCursorMode!==void 0&&rawCursorMode!=="batch"&&rawCursorMode!=="row"){throw new PmCliError("Events --cursor-mode must be batch or row.",EXIT_CODE.USAGE,{code:"invalid_event_cursor_mode"})}const cursorMode=rawCursorMode;return{pmRoot,since:typeof options.since==="string"?options.since:void 0,type:readRepeatableStringOption(options,"type"),author:readRepeatableStringOption(options,"author"),item:readRepeatableStringOption(options,"item"),limit:typeof options.limit==="string"?Number(options.limit):void 0,full:options.full===true,...options.provenance===true?{provenance:true}:{},...options.provenanceSummary===true?{provenanceSummary:true}:{},...harness===void 0?{}:{harness},...agentInstance===void 0?{}:{agentInstance},...provenanceFilter===void 0?{}:{provenanceFilter},cursorMode}}async function followMutationEvents(eventOptions,options,quiet){if(options.provenanceSummary===true){throw new PmCliError("Events --provenance-summary is bounded to one page and cannot be combined with --follow.",EXIT_CODE.USAGE)}const intervalMs=typeof options.intervalMs==="string"?Number(options.intervalMs):void 0;if(eventOptions.cursorMode==="row"){for await(const event of subscribeMutationEvents({...eventOptions,intervalMs})){if(!quiet){writeStdout(`${JSON.stringify(event)}
8
+ `)}}return}for await(const page of subscribeMutationEventBatches({...eventOptions,intervalMs})){if(!quiet){writeStdout(`${serializeNdjsonStream(page.events,{count:page.count,has_more:page.has_more,next_cursor:page.next_cursor??null,source:page.source,heartbeat:page.count===0})}
9
+ `)}}}function renderMutationEventPage(page){if(page.cursor_mode==="row"){return serializeNdjsonRows(page.events)}return serializeNdjsonStream(page.events,{count:page.count,has_more:page.has_more,next_cursor:page.next_cursor??null,source:page.source,...page.provenance_summary===void 0?{}:{provenance_summary:page.provenance_summary}})}async function runEventsAction(options,command){const globalOptions=getGlobalOptions(command);const startedAt=Date.now();const eventOptions=buildMutationEventOptions(options,globalOptions.path);if(options.follow===true){await followMutationEvents(eventOptions,options,globalOptions.quiet===true);return}const page=await listMutationEvents(eventOptions);setActiveCommandResult(page);if(globalOptions.json){printResult(page,globalOptions);if(globalOptions.profile){printError(`profile:command=events took_ms=${Date.now()-startedAt}`)}return}const rendered=renderMutationEventPage(page);if(!globalOptions.quiet&&rendered.length>0){writeStdout(`${rendered}
10
+ `)}if(globalOptions.profile){printError(`profile:command=events took_ms=${Date.now()-startedAt}`)}}async function runGraphAction(subcommand,id,target,options,command){const globalOptions=getGlobalOptions(command);const startedAt=Date.now();const result=await runGraph(subcommand,id,target,{...Array.isArray(options.kind)?{kind:options.kind}:{},maxDepth:typeof options.maxDepth==="string"?options.maxDepth:void 0,limit:typeof options.limit==="string"?options.limit:void 0,after:typeof options.after==="string"?options.after:void 0,direction:typeof options.direction==="string"?options.direction:void 0,maxPaths:typeof options.maxPaths==="string"?options.maxPaths:void 0,sample:typeof options.sample==="string"?options.sample:void 0,...Array.isArray(options.exemptIsolate)?{exemptIsolate:options.exemptIsolate}:{},...Array.isArray(options.exemptIsolateType)?{exemptIsolateType:options.exemptIsolateType}:{},saveBaseline:options.saveBaseline===true,rebuild:options.rebuild===true,clear:options.clear===true,summary:options.summary===true,full:options.full===true},globalOptions);printResult(result,globalOptions);if(globalOptions.profile){printError(`profile:command=graph took_ms=${Date.now()-startedAt}`)}}function registerListQueryCommands(program,options){const commandFilter=options?.commandFilter;const shouldRegister=commandName=>shouldRegisterListQueryCommand(commandName,commandFilter);const listCommandDescriptors=[{name:"list",description:"List active items with optional lifecycle-status and project filters.",excludeTerminal:true,allowStatusFilter:true},{name:"list-all",description:"List all items with optional filters.",excludeTerminal:false,allowStatusFilter:true},{name:"list-draft",description:"List draft items with optional filters.",status:"draft"},{name:"list-open",description:"List open items with optional filters.",status:"open",excludeTerminal:false,allowStatusFilter:false},{name:"list-in-progress",description:"List in-progress items with optional filters.",status:"in_progress",excludeTerminal:false,allowStatusFilter:false},{name:"list-blocked",description:"List blocked items (blocked status or open blocked_by dependencies, matching pm next) with optional filters.",dependencyBlocked:true,excludeTerminal:false,allowStatusFilter:false},{name:"list-closed",description:"List closed items with optional filters.",status:"closed"},{name:"list-canceled",description:"List canceled items with optional filters.",status:"canceled"}];for(const descriptor of listCommandDescriptors){if(shouldRegister(descriptor.name)){const aliasContract=resolvePmCommandAlias(descriptor.name);registerListCommand(program,{...descriptor,...aliasContract?.registration==="commander"?{aliasContract}:{}})}}if(shouldRegister("aggregate")){const aggregateCommand=program.command("aggregate").description("Group item counts and numeric measures.").option("--set-mode <value>","Set grouping: element (default)|tuple").option("--limit <value>","Group page size (default: 50)").option("--after <value>","Continue with next_after cursor").option("--group-by <value>","Fields: parent,type,priority,status,assignee,tags,sprint,release (comma-separated)").option("--count","Counts (default)").option("--completion","Status counts and completion_pct").option("--sum <field>","Group numeric sum").option("--avg <field>","Group numeric average").option("--include-unparented","Keep unparented group").option("--status <value>","Item status").option("--type <value>","Item type").option("--tag <value>","Filter by tag").option("--priority <value>","Filter by priority").option("--deadline-before <value>","Latest deadline (ISO/date or relative)").option("--deadline-after <value>","Earliest deadline (ISO/date or relative)").option("--assignee <value>","Filter by assignee").option("--assignee-filter <value>","Assignee presence: assigned|unassigned").option("--parent <value>","Parent ID").option("--sprint <value>","Filter by sprint").option("--release <value>","Filter by release");addHiddenOption(aggregateCommand,"--include_unparented","Alias for --include-unparented");addHiddenOption(aggregateCommand,"--assignee_filter <value>","Alias for --assignee-filter");aggregateCommand.action(runAggregateAction)}if(shouldRegister("context")){const contextCommand=program.command("context").alias("ctx").description("Show a token-efficient project context snapshot for next-work decisions.").option("--for <intent>",`Apply a declared context intent projection. ${renderPmClosedDomainHelp("context","--for")}`).option("--date <value>","Anchor date/time for agenda window calculations (ISO/date string or relative)").option("--from <value>","Agenda lower bound (ISO/date string or relative)").option("--to <value>","Agenda upper bound (ISO/date string or relative)").option("--past","Include past agenda entries in bounded windows").option("--type <value>","Filter by item type").option("--tag <value>","Filter by tag").option("--priority <value>","Filter by priority").option("--assignee <value>","Filter by assignee").option("--assignee-filter <value>","Filter assignee presence: assigned|unassigned").option("--sprint <value>","Filter by sprint").option("--release <value>","Filter by release").option("--parent <id>","Scope the snapshot to one item's subtree (the item plus all descendants)").option("--limit <n>","Limit focus and agenda rows per section").option("--after <cursor>","Continue ranked focus after a next_cursor from a previous context response").option("--format <value>","Context output format override: markdown|toon|json|ndjson").option("--depth <value>","Context depth: brief|standard|deep|full (full = every section, no per-section cap)").option("--section <value...>","Include specific sections (repeatable; overrides --depth)").option("--fields <value>","Project focus rows to a comma-separated field subset (e.g. id,title,priority)").option("--activity-limit <n>","Limit recent activity entries (default: settings or 10)").option("--stale-threshold <value>","Staleness cutoff in days (e.g. 7 or 7d; default: settings or 7)").option("--explain-ranking","Include the scorer model, per-signal contributions, and ranked candidate ids").option("--token-budget <n>","Maximum estimated tokens spent on ranked focus rows").option("--no-extension-health","Omit the installed extension health summary").option("--no-tags","Omit tag arrays from context focus rows");addHiddenOption(contextCommand,"--assignee_filter <value>","Alias for --assignee-filter");addHiddenOption(contextCommand,"--max-items <n>","Alias for --limit");addHiddenOption(contextCommand,"--explain_ranking","Alias for --explain-ranking");addHiddenOption(contextCommand,"--token_budget <n>","Alias for --token-budget");contextCommand.action(runContextAction)}if(shouldRegister("next")){const nextCommand=program.command("next").description("Recommend the next actionable (unblocked, ready) work item with rationale + blocked companion.").option("--for <intent>",`Apply a declared context intent projection. ${renderPmClosedDomainHelp("next","--for")}`).option("--type <value>","Filter candidate items by type").option("--tag <value>","Filter candidate items by tag").option("--priority <value>","Filter candidate items by priority").option("--assignee <value>","Filter candidate items by assignee").option("--assignee-filter <value>","Filter assignee presence: assigned|unassigned").option("--sprint <value>","Filter candidate items by sprint").option("--release <value>","Filter candidate items by release").option("--parent <id>","Scope to one item's subtree (the item plus all descendants)").option("--limit <n>","Limit ready rows (default: 5; non-positive falls back to default)").option("--blocked-limit <n>","Limit blocked rows (default: same as --limit)").option("--ready-only","Omit the blocked companion list").option("--include-decisions","Include human-gated Decision items in the claimable ready queue").option("--include-gates","Include outcome gates in the ready queue").option("--include-containers","Include containers with unfinished descendants in the ready queue").option("--format <value>","Next output format override: markdown|toon|json").option("--explain-ranking","Include the scorer model, per-signal contributions, and ranked ready ids").option("--token-budget <n>","Maximum estimated tokens spent on the ranked ready queue");addHiddenOption(nextCommand,"--assignee_filter <value>","Alias for --assignee-filter");addHiddenOption(nextCommand,"--blocked_limit <n>","Alias for --blocked-limit");addHiddenOption(nextCommand,"--ready_only","Alias for --ready-only");addHiddenOption(nextCommand,"--explain_ranking","Alias for --explain-ranking");addHiddenOption(nextCommand,"--token_budget <n>","Alias for --token-budget");nextCommand.action(runNextAction)}if(shouldRegister("search")){const searchCommand=program.command("search").argument("<keywords...>","Keyword query tokens").description("Search items with keyword, semantic, or hybrid retrieval. Inline field:value tokens (tag:/status:/type:/priority:) in the query are parsed as filters, e.g. 'auth tag:area:search status:open'.").option("--for <intent>",`Apply a declared context intent projection. ${renderPmClosedDomainHelp("search","--for")}`).option("--token-budget <n>","Override the selected intent's maximum estimated output tokens").option("--mode <value>","Search mode: keyword|semantic|hybrid (default: keyword)").option("--semantic","Shorthand for --mode semantic").option("--hybrid","Shorthand for --mode hybrid").option("--match-mode <value>","Token match mode: and|or|exact (default: or with all-terms ranking bonus; and = hard-require every token; exact = exact phrase)").option("--min-score <value>","Per-query minimum score threshold (finite number >= 0); overrides settings search.score_threshold for this query only").option("--count","Return only the count of matching items (post-filter/threshold, pre-limit); skips hit rows").option("--semantic-weight <value>","Override hybrid semantic weight for this query (0..1); invalid values fall back to settings").option("--include-linked","Include linked files, docs, and tests in the searchable corpus").option("--title-exact","Require exact normalized title match for the full query string").option("--phrase-exact","Require exact normalized phrase match in searchable text").option("--highlight","Emit per-field matched-text snippets (wrapped in \xAB\u2026\xBB) on each hit; off by default").option("--status <value>","Filter by status before query (all, open/closed/canceled aliases, or configured status id; CSV)").option("--type <value>","Filter by item type").option("--tag <value>","Filter by tag").option("--priority <value>","Filter by priority").option("--deadline-before <value>","Filter by deadline upper bound (ISO/date string or relative)").option("--deadline-after <value>","Filter by deadline lower bound (ISO/date string or relative)").option("--updated-after <value>",'Filter by updated_at lower bound: ISO timestamp or signed relative (e.g. "-2h"/"-7d" for the past)').option("--updated-before <value>","Filter by updated_at upper bound: ISO timestamp or signed relative (-2h/+1d)").option("--created-after <value>","Filter by created_at lower bound: ISO timestamp or signed relative (-2h/+1d)").option("--created-before <value>","Filter by created_at upper bound: ISO timestamp or signed relative (-2h/+1d)").option("--assignee <value>","Filter by assignee").option("--sprint <value>","Filter by sprint").option("--release <value>","Filter by release").option("--parent <value>","Filter by parent item ID").option("--compact","Render compact search hits (default; mutually exclusive with --full/--fields)").option("--full","Render full search hits with nested item payloads (mutually exclusive with --compact/--fields)").option("--fields <value>",`Render custom comma-separated search hit fields (mutually exclusive with --compact/--full). ${renderPmClosedDomainHelp("search","--fields")}`).option("--format <value>","Search output format override: json|ndjson|toon").option("--limit <n>","Limit returned item count").option("--after <cursor>","Continue after an opaque next_cursor from a previous search response");registerContentAndGovernanceFilters(searchCommand);searchCommand.action(runSearchAction);addHiddenOption(searchCommand,"--tags <value>","Alias for --tag");addHiddenOption(searchCommand,"--token_budget <n>","Alias for --token-budget")}if(shouldRegister("eval")){program.command("eval").description("Evaluate search relevance against a curated golden-query set: reports nDCG@k, MRR@k, precision@k, and recall@k per query plus the macro average. Use --fail-under as a CI gate.").option("--mode <value>","Default retrieval mode for queries without their own: keyword|semantic|hybrid (default: keyword)").option("--k <n>","Metric cutoff @k (positive integer; default: 10)").option("--fail-under <value>","Exit non-zero when aggregate nDCG@k falls below this threshold (0..1); CI gate").option("--queries <path>",`Query JSON (${EVAL_QUERY_SET_SCHEMA_ID}); default: search/eval-queries.json; errors show an example`).option("--format <value>","Eval output format override: json|toon").action(runEvalAction)}if(shouldRegister("get")){const getCommand=program.command("get").argument("<id>","Item id").option("--for <intent>",`Apply a declared context intent projection. ${renderPmClosedDomainHelp("get","--for")}`).option("--token-budget <n>","Override the selected intent's maximum estimated output tokens").option("--depth <value>","Detail depth: brief|standard|deep|full (full aliases deep; default: standard)").option("--full","Explicit full item read; equivalent to --depth deep (mutually exclusive with --depth/--fields)").option("--fields <value>",`Render custom comma-separated item metadata fields. ${renderPmClosedDomainHelp("get","--fields")}`).option("--tree","Include descendants rooted at the requested item").option("--tree-depth <n>","Maximum subtree depth for --tree descendants").option("--at <version-or-timestamp>","Reconstruct a verified historical item state without mutating it").option("--format <value>","Get output format override: json|toon").description("Show item details by ID.").action(runGetAction);addHiddenOption(getCommand,"--tree_depth <n>","Alias for --tree-depth");addHiddenOption(getCommand,"--token_budget <n>","Alias for --token-budget")}if(shouldRegister("history")){const historyCommand=program.command("history").enablePositionalOptions().argument("<id>","Item id").option("--limit <n>","Latest n entries").option("--compact","Show index, timestamp, op, author, patch count, and fields").option("--full","Full entries with JSON Patches").option("--provenance","Show authors and provenance without patches").option("--provenance-summary","Count provenance completeness").option("--harness <value>","Filter by recorded/resolved harness (repeatable)",collect).option("--agent-instance <value>","Filter agent instance (repeatable)",collect).option("--provenance-filter <dimension=value>","Filter by an exact declared provenance value (repeatable)",collect).option("--diff","Replay per-entry before/after field diffs").option("--field <name>","Filter changed field; implies --diff").option("--verify","Verify the full hash chain and replay").option("--strict-exit","With --verify, fail on integrity errors").option("--fail-on-warn","Alias for --strict-exit").option("--format <value>","Output: json|toon").description("Show item history entries.").action(runHistoryAction);registerHistoryMaintenanceCommands(historyCommand,true);registerHistoryActivityCommand(historyCommand.command("activity"))}if(shouldRegister("events")){program.command("events").option("--since <cursor-or-timestamp>","Resume strictly after a durable cursor, or include events from an ISO timestamp").option("--type <value>","Filter by mutation operation (repeatable or comma-separated)",collect).option("--author <value>","Filter by mutation author (repeatable or comma-separated)",collect).option("--item <value>","Filter by item or workspace stream id (repeatable or comma-separated)",collect).option("--limit <n>","Return at most 1,000 events (default: 100)").option("--cursor-mode <mode>","Cursor framing: batch emits one terminal trailer (default); row preserves one cursor per event").option("--full","Include each complete authoritative history entry").option("--provenance","Include patch-free author, harness, instance, and extensible provenance").option("--provenance-summary","Include bounded provenance completeness counts").option("--harness <value>","Filter by recorded or vocabulary-resolved harness (repeatable)",collect).option("--agent-instance <value>","Filter by privacy-safe agent instance (repeatable)",collect).option("--provenance-filter <dimension=value>","Filter by an exact declared provenance value (repeatable)",collect).option("--follow","Continue emitting committed events as newline-delimited JSON").option("--interval-ms <n>","Empty-read delay while following (minimum: 10ms; default: 250ms)").description("Emit cursor-resumable committed mutation facts as newline-delimited JSON.").action(runEventsAction)}if(shouldRegister("activity")){registerHistoryActivityCommand(program.command("activity",{hidden:true}))}if(shouldRegister("graph")){program.command("graph").argument("<subcommand>","Graph query (ancestors, descendants, predecessors, successors, paths, impact, analyze, audit, communities, redundancy, dominators, slack, centrality, articulation, plan, index)").argument("[id]","Root item id (traversals, paths, impact, and dominators)").argument("[target]","Target item id (paths only)").option("--kind <value>","Restrict traversal to registered relationship kinds (repeatable or comma-separated)",collect).option("--max-depth <value>","Maximum traversal depth (non-negative integer)").option("--limit <value>","Maximum returned rows per bounded collection").option("--after <value>","Resume a traversal after this previously returned node id").option("--direction <value>","Edge orientation for paths/impact (outgoing, incoming, or both)").option("--max-paths <value>","Maximum enumerated paths (paths only)").option("--sample <value>","Maximum evidence sample entries per audit finding (audit only)").option("--exempt-isolate <value>","Item ids treated as explicitly valid isolates by the audit (repeatable or comma-separated)",collect).option("--exempt-isolate-type <value>","Item types whose active isolates are policy-valid for the audit (repeatable or comma-separated)",collect).option("--save-baseline","Persist the audit census as the change-since-baseline comparison point (audit only)").option("--rebuild","Rebuild and warm the durable graph index (index only)").option("--clear","Delete the durable graph index (index only)").option("--summary","Return counts-first envelopes without row collections").option("--full","Return the complete graph row projection").description("Bounded workspace relationship-graph queries, analytics, and governance audit.").action(runGraphAction)}}const _testOnlyRegisterListQuery={resolveReadCommandOutputFormat,parseListFormat};export{_testOnlyRegisterListQuery,registerListQueryCommands};
943
11
  //# sourceMappingURL=register-list-query.js.map
944
- //# debugId=7b6e80ad-a85b-5539-8f47-02bfad799cdb