@unbrained/pm-cli 2026.8.26 → 2026.8.27

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 (161) hide show
  1. package/.agents/skills/HARNESS_COMPATIBILITY.md +32 -0
  2. package/.agents/skills/README.md +47 -0
  3. package/.agents/skills/pm-developer/SKILL.md +117 -0
  4. package/.agents/skills/pm-developer/references/COMMAND_PLAYBOOK.md +49 -0
  5. package/.agents/skills/pm-developer/references/GRAPH_AND_RELATIONSHIPS.md +91 -0
  6. package/.agents/skills/pm-developer/references/MULTI_AGENT_MERGE.md +72 -0
  7. package/.agents/skills/pm-developer/references/PROMPTS.md +17 -0
  8. package/.agents/skills/pm-developer/references/SCRIPTING_COMPOSITION.md +82 -0
  9. package/.agents/skills/pm-developer/references/TOKEN_BUDGETS.md +85 -0
  10. package/.agents/skills/pm-extensions/SKILL.md +106 -0
  11. package/.agents/skills/pm-extensions/references/AUTHORING.md +95 -0
  12. package/.agents/skills/pm-extensions/references/LIFECYCLE.md +40 -0
  13. package/.agents/skills/pm-extensions/references/TROUBLESHOOTING.md +25 -0
  14. package/.agents/skills/pm-sdk/SKILL.md +107 -0
  15. package/.agents/skills/pm-sdk/references/DOMAIN_MODELING.md +78 -0
  16. package/.agents/skills/pm-sdk/references/INTEGRATION_CHECKLIST.md +31 -0
  17. package/.agents/skills/pm-sdk/references/PROMPTS.md +13 -0
  18. package/.agents/skills/pm-sdk/references/SURFACE_MAP.md +82 -0
  19. package/.agents/skills/pm-user/SKILL.md +111 -0
  20. package/.agents/skills/pm-user/references/BACKLOG_SHAPING.md +105 -0
  21. package/.agents/skills/pm-user/references/PROMPTS.md +17 -0
  22. package/.agents/skills/pm-user/references/WORKFLOWS.md +35 -0
  23. package/.claude-plugin/marketplace.json +2 -2
  24. package/CHANGELOG.md +25 -3
  25. package/README.md +8 -5
  26. package/dist/cli/commander-usage.js +11 -7
  27. package/dist/cli/error-guidance.js +3 -3
  28. package/dist/cli/help-content.d.ts +2 -0
  29. package/dist/cli/help-content.js +53 -17
  30. package/dist/cli/help-json-payload.d.ts +8 -2
  31. package/dist/cli/help-json-payload.js +46 -12
  32. package/dist/cli/main.js +52 -74
  33. package/dist/cli/register-annotations.js +27 -21
  34. package/dist/cli/register-setup.js +98 -57
  35. package/dist/cli-bundle/bundle-manifest.json +152 -152
  36. package/dist/cli-bundle/chunks/chunk-3OO3W6FW.js +202 -0
  37. package/dist/cli-bundle/chunks/chunk-52EKTW6V.js +3 -0
  38. package/dist/cli-bundle/chunks/{chunk-KBFP3E4E.js → chunk-CVBBGWW5.js} +62 -44
  39. package/dist/cli-bundle/chunks/chunk-MFNTKMTI.js +13 -0
  40. package/dist/cli-bundle/chunks/{chunk-E2GCFJSU.js → chunk-OS27HHBN.js} +31 -31
  41. package/dist/cli-bundle/chunks/chunk-QTO7USTH.js +2 -0
  42. package/dist/cli-bundle/chunks/{chunk-S4U76VZF.js → chunk-R4ETAOJC.js} +2 -2
  43. package/dist/cli-bundle/chunks/{chunk-UKBCRPA2.js → chunk-SH6P7FXI.js} +2 -2
  44. package/dist/cli-bundle/chunks/{chunk-WRHJ3MB6.js → chunk-SHMDY36D.js} +2 -2
  45. package/dist/cli-bundle/chunks/{chunk-ZNRLJ54C.js → chunk-SKXLJIEK.js} +2 -2
  46. package/dist/cli-bundle/chunks/chunk-TNX6HC54.js +3 -0
  47. package/dist/cli-bundle/chunks/{register-list-query-EMCPMICY.js → register-list-query-EUWM6VII.js} +2 -2
  48. package/dist/cli-bundle/chunks/{register-mutation-OJ67ABCB.js → register-mutation-FD4HSAVU.js} +4 -4
  49. package/dist/cli-bundle/chunks/{register-operations-H2GLP7LT.js → register-operations-HRMNFEC3.js} +2 -2
  50. package/dist/cli-bundle/chunks/register-setup-33GNICLX.js +2 -0
  51. package/dist/cli-bundle/focused-chunks/{chunk-4XNH2HM7.js → chunk-2AGZ5BRT.js} +2 -2
  52. package/dist/cli-bundle/focused-chunks/{chunk-72T6JGAE.js → chunk-4BR5UU52.js} +45 -45
  53. package/dist/cli-bundle/focused-chunks/{chunk-OHIHZ7HS.js → chunk-6GCRSLPG.js} +2 -2
  54. package/dist/cli-bundle/focused-chunks/{chunk-UYBA57GY.js → chunk-AD6ULRAF.js} +2 -2
  55. package/dist/cli-bundle/focused-chunks/{chunk-7YCDTCBC.js → chunk-AQ5IYEZZ.js} +2 -2
  56. package/dist/cli-bundle/focused-chunks/{chunk-YO3ZF3FI.js → chunk-EKX37ZHA.js} +2 -2
  57. package/dist/cli-bundle/focused-chunks/{chunk-LV5N3LK5.js → chunk-FC2AXLB5.js} +2 -2
  58. package/dist/cli-bundle/focused-chunks/{chunk-IBHXMFE7.js → chunk-HC7ODMH3.js} +2 -2
  59. package/dist/cli-bundle/focused-chunks/{chunk-4K2II4TV.js → chunk-HVQ22RC4.js} +2 -2
  60. package/dist/cli-bundle/focused-chunks/{chunk-A644DUFQ.js → chunk-MEASX544.js} +2 -2
  61. package/dist/cli-bundle/focused-chunks/{chunk-FXDLT6FL.js → chunk-MXTYGECH.js} +2 -2
  62. package/dist/cli-bundle/focused-chunks/{chunk-MMXUPDDJ.js → chunk-SUBSWYW3.js} +2 -2
  63. package/dist/cli-bundle/focused-chunks/{chunk-57XY346D.js → chunk-XDPYBQCF.js} +9 -9
  64. package/dist/cli-bundle/focused-chunks/{chunk-TMJDFHVD.js → chunk-Y3JJXRVK.js} +2 -2
  65. package/dist/cli-bundle/focused-chunks/{chunk-66VGB23P.js → chunk-Y5A7SJJ7.js} +2 -2
  66. package/dist/cli-bundle/focused-chunks/chunk-YHWHX6YY.js +2 -0
  67. package/dist/cli-bundle/focused-chunks/{chunk-P2E6LDAE.js → chunk-YVVZ3LQ6.js} +3 -3
  68. package/dist/cli-bundle/focused-chunks/chunk-Z2USIBR2.js +5 -0
  69. package/dist/cli-bundle/main.js +15 -14
  70. package/dist/cli-bundle/sdk-authoring.js +1 -1
  71. package/dist/cli-bundle/sdk-contracts.js +2 -2
  72. package/dist/cli-bundle/sdk-core.js +31 -31
  73. package/dist/cli-bundle/sdk-governance.js +1 -1
  74. package/dist/cli-bundle/sdk-graph.js +1 -1
  75. package/dist/cli-bundle/sdk-merge.js +31 -31
  76. package/dist/cli-bundle/sdk-query.js +1 -1
  77. package/dist/cli-bundle/sdk-runtime.js +1 -1
  78. package/dist/cli-bundle/sdk-testing.js +1 -1
  79. package/dist/cli-bundle/sdk.js +32 -7
  80. package/dist/core/governance/issue-codes.d.ts +11 -2
  81. package/dist/core/governance/issue-codes.js +29 -10
  82. package/dist/core/item/item-format.js +3 -3
  83. package/dist/core/store/item-store.js +12 -5
  84. package/dist/mcp/server.js +123 -9
  85. package/dist/mcp/tool-definitions.d.ts +2 -0
  86. package/dist/mcp/tool-definitions.js +2 -2
  87. package/dist/sdk/agent/closed-domain-contracts.d.ts +1 -1
  88. package/dist/sdk/agent/closed-domain-contracts.js +24 -2
  89. package/dist/sdk/agent-capability-contracts.js +6 -2
  90. package/dist/sdk/cli-bootstrap.js +3 -2
  91. package/dist/sdk/cli-contracts/command-aliases.js +15 -2
  92. package/dist/sdk/cli-contracts/enum-contracts.d.ts +4 -1
  93. package/dist/sdk/cli-contracts/enum-contracts.js +7 -2
  94. package/dist/sdk/cli-contracts/flag-contracts.js +9 -5
  95. package/dist/sdk/cli-contracts/grammar-contracts.d.ts +3 -3
  96. package/dist/sdk/cli-contracts/grammar-contracts.js +24 -17
  97. package/dist/sdk/cli-contracts/runtime-contracts.js +13 -11
  98. package/dist/sdk/cli-contracts/tool-schema.js +18 -15
  99. package/dist/sdk/cli-contracts.d.ts +1 -1
  100. package/dist/sdk/cli-contracts.js +3 -3
  101. package/dist/sdk/cli-program.js +3 -2
  102. package/dist/sdk/completion.js +40 -13
  103. package/dist/sdk/generated/generated-error-code-catalog-part-2.js +14 -2
  104. package/dist/sdk/governance/upgrade.d.ts +2 -0
  105. package/dist/sdk/governance/upgrade.js +30 -8
  106. package/dist/sdk/governance/validate.js +8 -6
  107. package/dist/sdk/guide-topics.js +6 -6
  108. package/dist/sdk/index.d.ts +4 -2
  109. package/dist/sdk/index.js +5 -3
  110. package/dist/sdk/mcp/apps.d.ts +70 -0
  111. package/dist/sdk/mcp/apps.js +154 -0
  112. package/dist/sdk/mcp/skills.d.ts +127 -0
  113. package/dist/sdk/mcp/skills.js +390 -0
  114. package/dist/sdk/read-output-contracts.js +16 -3
  115. package/dist/sdk/runtime-action-aliases.js +7 -3
  116. package/dist/sdk/runtime-input.js +12 -4
  117. package/dist/sdk/runtime-primitives.d.ts +1 -1
  118. package/dist/sdk/runtime-primitives.js +3 -3
  119. package/docs/CLI_GRAMMAR.md +7 -1
  120. package/docs/COMMANDS.md +2 -2
  121. package/docs/EXTENSIONS.md +33 -32
  122. package/docs/MCP_2026_07_28.md +24 -2
  123. package/docs/MCP_2026_07_28_CONFORMANCE.md +4 -4
  124. package/docs/MCP_SKILLS_AND_APPS.md +107 -0
  125. package/docs/QUICKSTART.md +15 -15
  126. package/docs/README.md +1 -0
  127. package/docs/RELEASING.md +11 -3
  128. package/docs/SDK_CONTEXT_INTEGRITY.md +6 -0
  129. package/docs/SDK_EVIDENCE_TRACEABILITY.md +9 -1
  130. package/docs/generated/AGENT_CAPABILITY_ROUTING.md +1 -1
  131. package/docs/generated/REFUSAL_CLOSURE_CENSUS.md +7 -6
  132. package/marketplace.json +2 -2
  133. package/package.json +9 -7
  134. package/packages/pm-beads/README.md +12 -6
  135. package/packages/pm-beads/docs/MIGRATION.md +53 -0
  136. package/packages/pm-beads/extensions/beads/index.ts +8 -0
  137. package/packages/pm-beads/extensions/beads/runtime.ts +671 -112
  138. package/packages/pm-beads/package.json +1 -1
  139. package/packages/pm-calendar/package.json +1 -1
  140. package/packages/pm-command-kit/package.json +1 -1
  141. package/packages/pm-digital-twin/package.json +1 -1
  142. package/packages/pm-governance-audit/package.json +1 -1
  143. package/packages/pm-guide-shell/package.json +1 -1
  144. package/packages/pm-kanban/package.json +1 -1
  145. package/packages/pm-lifecycle-hooks/package.json +1 -1
  146. package/packages/pm-linked-test-adapters/package.json +1 -1
  147. package/packages/pm-search-advanced/package.json +1 -1
  148. package/packages/pm-templates/package.json +1 -1
  149. package/packages/pm-todos/package.json +1 -1
  150. package/packages/pm-vcs/package.json +1 -1
  151. package/plugins/pm-claude/.claude-plugin/plugin.json +1 -1
  152. package/plugins/pm-codex/.codex-plugin/plugin.json +1 -1
  153. package/sdk/public-surface.json +235 -13
  154. package/dist/cli-bundle/chunks/chunk-ES25LX3D.js +0 -202
  155. package/dist/cli-bundle/chunks/chunk-FRDWWB6R.js +0 -3
  156. package/dist/cli-bundle/chunks/chunk-ICQ3RVIY.js +0 -2
  157. package/dist/cli-bundle/chunks/chunk-IV64RJVE.js +0 -13
  158. package/dist/cli-bundle/chunks/chunk-MVYLQ67M.js +0 -3
  159. package/dist/cli-bundle/chunks/register-setup-GLZAHLVI.js +0 -2
  160. package/dist/cli-bundle/focused-chunks/chunk-7I23XGWO.js +0 -2
  161. package/dist/cli-bundle/focused-chunks/chunk-LMKG3DFE.js +0 -5
@@ -0,0 +1,111 @@
1
+ ---
2
+ name: pm-user
3
+ description: Guides user- and operator-facing pm-cli workflows for intake, triage, prioritization, planning, and reporting under a bounded token budget. Use when routing requests into pm items, organizing a backlog, or reporting on state without implementing code changes.
4
+ license: MIT
5
+ compatibility: Works in terminal-based agent harnesses that execute pm CLI commands.
6
+ metadata:
7
+ owner: unbrained
8
+ domain: pm-cli
9
+ scope: operator-workflow
10
+ ---
11
+
12
+ # pm User Skill
13
+
14
+ Planning and coordination work where the output is clean tracker state, not
15
+ code. The tracker is the project's context: an item is well-formed when another
16
+ agent can rebuild the full situation from it alone.
17
+
18
+ ## Load Order
19
+
20
+ | Tier | Load | Cost | When |
21
+ | ---- | ------------------------------------- | --------- | ------------------------------ |
22
+ | 0 | This file | ~650 tok | Always. |
23
+ | 1 | `pm context --limit 10` | ~2.1k | Orient in an existing project. |
24
+ | 1 | `pm search "<terms>" --limit 10` | ~0.5-1k | Before creating anything. |
25
+ | 2 | `pm guide <topic> --depth brief` | ~0.6-1k | An unfamiliar family. |
26
+ | 3 | `references/*.md` below | ~0.3-1k | Procedure detail. |
27
+
28
+ Optional deep routing that never goes stale:
29
+
30
+ ```bash
31
+ pm install guide-shell --project
32
+ pm guide quickstart
33
+ pm guide commands --depth brief
34
+ ```
35
+
36
+ ## Non-Negotiables
37
+
38
+ - Author identity is detected automatically. **Never pass `--author`, never set
39
+ `PM_AUTHOR`.**
40
+ - Search before creating; record the duplicate check as a create-time comment.
41
+ - Never delete items by search match — only by exact id.
42
+ - Prefer appending (`pm comments`, `pm notes`) over rewriting item content.
43
+ - Never assert an item's state from memory. Read it live first.
44
+
45
+ ## Intake Loop
46
+
47
+ ```bash
48
+ pm context --limit 10
49
+ pm search "<request keywords>" --limit 10
50
+ pm list-open --limit 20 --output-include id,title,type,priority
51
+ # reuse if it exists; otherwise create with lineage
52
+ pm create --create-mode progressive \
53
+ --title "..." --description "..." --type Task --status open \
54
+ --parent <epic-or-feature-id> \
55
+ --dep "id=<origin-item>,kind=discovered_from" \
56
+ --ac "..." --priority 1 --risk medium --confidence medium
57
+ pm comments <ID> "Duplicate check: searched <terms>; nearest existing is <id> which covers <scope>."
58
+ ```
59
+
60
+ ## What Makes An Item Well-Formed
61
+
62
+ Use the metadata the tracker actually has. An item carrying only a title is a
63
+ placeholder, not a tracked unit of work.
64
+
65
+ | Field | Why it matters |
66
+ | ---------------------------------------- | -------------------------------------------------- |
67
+ | `--type` | Routes into the right lifecycle and changelog bucket|
68
+ | `--parent` | Places the item in the ladder |
69
+ | `--dep "id=..,kind=.."` | Makes lineage machine-readable |
70
+ | `--ac` | Defines done without argument |
71
+ | `--expected-result` / `--actual-result` | Turns a defect into a reproducible claim |
72
+ | `--priority`, `--risk`, `--confidence` | Lets selection rank without a human |
73
+ | `--estimate`, `--deadline` | Feeds scheduling and forecasting |
74
+ | `--resolution`, `--close-reason` | Makes the closed record answerable later |
75
+
76
+ `--risk` is an enum: `low`, `medium`, `high`, `critical`. `--ac` **replaces**
77
+ the criteria; `--dep` **appends**.
78
+
79
+ ## Capability Map
80
+
81
+ | Need | Entry | Guide topic |
82
+ | --------------------------- | ---------------------------------------- | ------------ |
83
+ | What should I do next | `pm next` | `quickstart` |
84
+ | Where does this project stand | `pm context`, `pm stats` | `quickstart` |
85
+ | Find existing work | `pm search`, `pm list`, `pm duplicates` | `commands` |
86
+ | Group and count | `pm aggregate --group-by <field>` | `commands` |
87
+ | Lineage and ordering | `pm deps`, `pm graph <verb>` | `graph` |
88
+ | Recent movement | `pm activity`, `pm events`, `pm history` | `assurance` |
89
+ | Data quality | `pm validate`, `pm health` | `assurance` |
90
+ | Plan a multi-step change | `pm plan` | `workflows` |
91
+ | Custom types and statuses | `pm schema`, `pm config` | `commands` |
92
+ | Keep reads cheap | `--output-*`, `--token-accounting` | `tokens` |
93
+
94
+ ## Reporting Without Loading Rows
95
+
96
+ ```bash
97
+ pm stats
98
+ pm aggregate --group-by status --json | jq '.groups'
99
+ pm list --status open --output-include id,title,priority --output-limit 20
100
+ ```
101
+
102
+ `--group-by tags` groups by the whole tag **tuple**, not by individual tag.
103
+ Aggregate on a scalar field when a per-value count is what you want.
104
+
105
+ ## References
106
+
107
+ | Need | Load | Cost |
108
+ | --------------------------------- | --------------------------------------------- | -------- |
109
+ | Triage and planning procedures | [Workflows](references/WORKFLOWS.md) | ~350 tok |
110
+ | Prompt templates | [Prompts](references/PROMPTS.md) | ~250 tok |
111
+ | Backlog structure and item quality | [Backlog shaping](references/BACKLOG_SHAPING.md) | ~900 tok |
@@ -0,0 +1,105 @@
1
+ # Backlog Shaping
2
+
3
+ How to keep a tracker readable by both people and graph algorithms as it grows
4
+ from a handful of items to hundreds of thousands.
5
+
6
+ ## The Ladder
7
+
8
+ Work resolves upward through typed edges to a declared outcome. A healthy
9
+ workspace has no active item that reaches nothing.
10
+
11
+ ```
12
+ Milestone (declared outcome)
13
+ ^ implements
14
+ Epic / capability area
15
+ ^ parent
16
+ Feature / Story / Decision
17
+ ^ parent
18
+ Task / Issue / Chore
19
+ ```
20
+
21
+ - `Story` states what an agent or an organization needs, in their words.
22
+ - `Decision` records an architecture choice; open means proposed, closed means
23
+ accepted or rejected with rationale.
24
+ - `Milestone` declares an outcome, not a date bucket.
25
+ - `Plan` holds a multi-step change with durable steps and discoveries.
26
+
27
+ Check the ladder:
28
+
29
+ ```bash
30
+ pm graph audit --json | jq '{
31
+ isolated: .profile.isolated_active_nodes,
32
+ unreachable: .profile.outcome_unreachable_nodes,
33
+ outcomes: .profile.outcome_nodes
34
+ }'
35
+ ```
36
+
37
+ ## Never Create A Duplicate
38
+
39
+ ```bash
40
+ pm search "<distinctive phrase from the request>" --limit 10
41
+ pm search "<second phrasing>" --limit 10
42
+ pm list --type <likely-type> --status all --output-include id,title --output-limit 30
43
+ pm duplicates --limit 20 # scored candidate pairs, where the corpus allows it
44
+ ```
45
+
46
+ Record what you searched in a create-time comment. A duplicate check that is
47
+ not written down cannot be audited later, and the next agent repeats it.
48
+
49
+ When the request extends existing scope, extend the existing item — add
50
+ acceptance criteria, add a child, add a typed edge. Filing a near-identical
51
+ sibling is the most expensive mistake in a large tracker.
52
+
53
+ ## Prioritization That Selection Can Use
54
+
55
+ `pm next` ranks from recorded metadata. Metadata you never set cannot rank.
56
+
57
+ ```bash
58
+ pm update <ID> --priority 1 --risk high --confidence medium --estimate 120
59
+ pm update <ID> --deadline 2026-09-30
60
+ pm comments <ID> "Decision log: raised to P1 because <evidence>."
61
+ ```
62
+
63
+ Ordering belongs in edges, not in priority numbers:
64
+
65
+ ```bash
66
+ pm update <ID> --dep "id=<prerequisite>,kind=blocked_by"
67
+ ```
68
+
69
+ Do not record the inverse `blocks` edge as well — the pair is one relationship
70
+ and recording both creates a cycle.
71
+
72
+ ## Closing Well
73
+
74
+ A closed item is the project's memory. Closed badly, it is a dead end.
75
+
76
+ ```bash
77
+ pm close <ID> "<what shipped and what proved it>" \
78
+ --resolution "<how it was resolved>" \
79
+ --validate-close warn
80
+ pm release <ID>
81
+ ```
82
+
83
+ Fill `resolution`, `expected_result`, and `actual_result` for defects.
84
+ `pm validate --check-resolution` reports which terminal items are missing them.
85
+
86
+ Record evolution explicitly rather than letting it be inferred:
87
+
88
+ ```bash
89
+ pm update <NEW> --dep "id=<OLD>,kind=supersedes"
90
+ pm update <FIX> --dep "id=<INCIDENT>,kind=incident_from"
91
+ pm update <TEST> --dep "id=<FEATURE>,kind=verifies"
92
+ ```
93
+
94
+ ## Periodic Hygiene
95
+
96
+ ```bash
97
+ pm validate --check-resolution --check-history-drift
98
+ pm health --summary
99
+ pm graph audit
100
+ pm list --status in_progress # stale claims
101
+ pm aggregate --group-by type --json
102
+ ```
103
+
104
+ Fix what a diagnostic prescribes rather than only recording that it warned.
105
+ A warning that has been carried for months is a decision that was never made.
@@ -0,0 +1,17 @@
1
+ # Operator Prompt Templates
2
+
3
+ ## Triage
4
+
5
+ `Find the canonical pm item for this request. Show duplicate-check commands, then either reuse and update the item or create parent lineage + child item with explicit rationale.`
6
+
7
+ ## Schedule
8
+
9
+ `Apply deterministic scheduling metadata (status, priority, estimate, deadline) to <ID> and leave a comment explaining the prioritization decision.`
10
+
11
+ ## Handoff
12
+
13
+ `Prepare <ID> for handoff: append current state, blockers, and next actions; release the claim when handoff is complete.`
14
+
15
+ ## Closure Readiness
16
+
17
+ `Validate whether <ID> is close-ready by checking acceptance criteria, linked files/tests/docs, and latest verification evidence.`
@@ -0,0 +1,35 @@
1
+ # User and Operator Workflows
2
+
3
+ ## Intake Workflow
4
+
5
+ 1. Query current context:
6
+
7
+ ```bash
8
+ pm context --limit 10
9
+ pm search "<keywords>" --limit 10
10
+ pm list-open --limit 20
11
+ pm list-in-progress --limit 20
12
+ ```
13
+
14
+ 2. If existing item matches, reuse and update it.
15
+ 3. If no match exists, create parent lineage then child item.
16
+ 4. Add duplicate-check evidence in comments at creation time.
17
+
18
+ ## Claim and Ownership Workflow
19
+
20
+ ```bash
21
+ pm claim <ID>
22
+ pm update <ID> --status in_progress --message "Start work"
23
+ pm comments <ID> "Owner update: <state>"
24
+ pm release <ID>
25
+ ```
26
+
27
+ ## Audit-Friendly Collaboration
28
+
29
+ For non-owner append-only collaboration:
30
+
31
+ ```bash
32
+ pm comments <ID> --add "audit comment" --allow-audit-comment
33
+ pm notes <ID> --add "audit note" --allow-audit-comment
34
+ pm update <ID> --dep "id=<id>,kind=related,author=<author>,created_at=now" --allow-audit-dep-update
35
+ ```
@@ -6,14 +6,14 @@
6
6
  },
7
7
  "metadata": {
8
8
  "description": "Official marketplace for pm CLI — native git-based project management for Claude Code and AI coding agents.",
9
- "version": "2026.8.26"
9
+ "version": "2026.8.27"
10
10
  },
11
11
  "plugins": [
12
12
  {
13
13
  "name": "pm-claude",
14
14
  "source": "./plugins/pm-claude",
15
15
  "description": "Native pm CLI integration for Claude Code — 28 MCP tools, 5 workflow skills, 14 slash commands, 4 subagents, hybrid TUI task tracking, session context injection, and coordination subagents for git-based project management without leaving Claude Code.",
16
- "version": "2026.8.26",
16
+ "version": "2026.8.27",
17
17
  "author": {
18
18
  "name": "unbrained",
19
19
  "url": "https://github.com/unbraind/pm-cli"
package/CHANGELOG.md CHANGED
@@ -1,5 +1,28 @@
1
1
  # Changelog
2
2
 
3
+ ## 2026.8.27 - 2026-08-27
4
+
5
+ ### Added
6
+
7
+ - Tiered contract-driven help: one-screen core help, full surface via pm help --all, generated from the contract table ([pm-e2bq](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/features/pm-e2bq.toon))
8
+ - Skills over MCP: discoverable version-coherent pm workflows with progressive disclosure, capability requirements, and token budgets ([pm-8nzivt](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/features/pm-8nzivt.toon))
9
+ - MCP Apps for pm: interactive graph, context, plan, assurance, and long-operation views with consent-safe action boundaries ([pm-pznhee](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/features/pm-pznhee.toon))
10
+
11
+ ### Fixed
12
+
13
+ - GH-859: pm-beads source export can omit Beads comment bodies and events ([pm-tpwde6](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/issues/pm-tpwde6.toon))
14
+ - pm get silently discards --output-include field names because entity reads bind the flag to sections while collection reads bind it to fields, and the omission receipt reports no omissions either way ([pm-0k19l7](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/issues/pm-0k19l7.toon))
15
+ - GH-860: pm-beads --preserve-source-ids changes source ID casing ([pm-f7jj9b](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/issues/pm-f7jj9b.toon))
16
+ - GH-862: pm-beads must map Beads close reasons into native resolution metadata ([pm-gus5ft](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/issues/pm-gus5ft.toon))
17
+ - GH-1118: natural-language word-number titles trigger duplicate issue-code false positives ([pm-blvfye](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/issues/pm-blvfye.toon))
18
+ - Published-artifact verification rejects the new pm-mcp-http bin before executing its healthy published entrypoint ([pm-fpdne3](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/issues/pm-fpdne3.toon))
19
+
20
+ ### Other
21
+
22
+ - Consolidate package lifecycle: extension/package/install/upgrade under a single pm package namespace ([pm-tnud](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/tasks/pm-tnud.toon))
23
+ - Refresh compatible ESLint 10.9.1 and Node type 26.3 patches ([pm-crkmmr](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/chores/pm-crkmmr.toon))
24
+ - MCP 2026-07-28 conformance and release gate: official schema matrix, protocol-era adapters, real transports, adversarial cases, and published consumers ([pm-55yf1t](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/tasks/pm-55yf1t.toon))
25
+
3
26
  ## 2026.8.26 - 2026-08-26
4
27
 
5
28
  ### Added
@@ -442,7 +465,6 @@
442
465
  - Sentry PM-CLI-2Q: expected snapshot-name validation is captured as a high production error ([pm-qyg51h](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/issues/pm-qyg51h.toon))
443
466
  - The release gate classifies production errors by message prose and reads none of the 236 error codes the product declares, so every waiver is a latent re-block and a broad substring is a silent waiver ([pm-dqtzva](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/issues/pm-dqtzva.toon))
444
467
  - The mandatory command-wiring replication set is enforced only by a prose checklist, and the census shows partial application is the single largest recurring defect class in the record ([pm-7rrqsk](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/issues/pm-7rrqsk.toon))
445
- - pm get silently discards --output-include field names because entity reads bind the flag to sections while collection reads bind it to fields, and the omission receipt reports no omissions either way ([pm-0k19l7](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/issues/pm-0k19l7.toon))
446
468
  - GH-919: \_workspace author-attribution coordinates cannot be acknowledged ([pm-ety1qc](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/issues/pm-ety1qc.toon))
447
469
  - pm comments write response replays the entire accumulated history, so one append can emit hundreds of comments ([pm-9stazf](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/issues/pm-9stazf.toon))
448
470
  - GH-457: pm health hangs during vectorization check with no output (never-block violation) ([pm-tu71](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/issues/pm-tu71.toon))
@@ -991,12 +1013,12 @@
991
1013
 
992
1014
  ### Fixed
993
1015
 
1016
+ - GH-576: unknown-command help probes return structured non-zero errors ([pm-bu1m](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/issues/pm-bu1m.toon))
994
1017
  - Sentry PM-CLI-2G: make merge-driver installation permission failures actionable ([pm-bnmlsc](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/issues/pm-bnmlsc.toon))
995
1018
  - Sentry PM-CLI-2F: classify manifest-proven torn bundle call-time TypeError ([pm-pz7xtx](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/issues/pm-pz7xtx.toon))
996
1019
  - Compatibility gate rejects compact legacy create envelopes after release promotion ([pm-pkdpyz](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/issues/pm-pkdpyz.toon))
997
1020
  - Sentry PM-CLI-2E: directory-shaped settings.json crashes CLI bootstrap ([pm-k0nl2w](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/issues/pm-k0nl2w.toon))
998
1021
  - Sentry PM-CLI-2D: storage-integrity history scan reads .jsonl directories as files ([pm-o1c53b](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/issues/pm-o1c53b.toon))
999
- - GH-576: unknown-command help probes return structured non-zero errors ([pm-bu1m](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/issues/pm-bu1m.toon))
1000
1022
  - GH-551: dependency seeds accept global source_kind and preserve cross-workspace IDs ([pm-topu](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/issues/pm-topu.toon))
1001
1023
  - GH-595: list JSON always emits total/has_more/truncated/next_cursor and omits unset filters ([pm-wrss](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/issues/pm-wrss.toon))
1002
1024
  - GH-623: opt-in post-merge history reconciliation hook and one-command verify repair ([pm-mfkv92](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/issues/pm-mfkv92.toon))
@@ -1462,6 +1484,7 @@
1462
1484
 
1463
1485
  ### Added
1464
1486
 
1487
+ - pm package/extension init --capability profile: scaffold a project-profile starter package ([pm-h2hk](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/features/pm-h2hk.toon))
1465
1488
  - Describe --markdown writes reference docs to a file ([pm-u2tm](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/features/pm-u2tm.toon))
1466
1489
  - Complete scaffold capability matrix: --capability renderers/parser/preflight/services starters ([pm-i5p5](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/features/pm-i5p5.toon))
1467
1490
  - Scaffolded & authored command-bearing extensions reliably activate for their own commands ([pm-yxb5](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/features/pm-yxb5.toon))
@@ -1469,7 +1492,6 @@
1469
1492
  - pm next: recommend the next actionable (unblocked, ready) work item with rationale + blocked companion ([pm-nj90](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/features/pm-nj90.toon))
1470
1493
  - Add pm package / pm packages shell completion (bash/zsh/fish), including the package-only --declarative flag ([pm-mthy](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/tasks/pm-mthy.toon))
1471
1494
  - Project profile author-time validation: lintProjectProfile + assertProjectProfile + pm profile lint ([pm-j1fj](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/features/pm-j1fj.toon))
1472
- - pm package/extension init --capability profile: scaffold a project-profile starter package ([pm-h2hk](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/features/pm-h2hk.toon))
1473
1495
  - SDK + CLI: render extension/package surfaces to Markdown reference docs (renderExtensionSurfaceMarkdown + describe --markdown) ([pm-dmum](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/features/pm-dmum.toon))
1474
1496
  - pm package/extension init --capability schema: scaffold custom item type/field/migration starter ([pm-d1ig](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/features/pm-d1ig.toon))
1475
1497
  - First-party baseline profile package built on public SDK primitives ([pm-a7o4](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/features/pm-a7o4.toon))
package/README.md CHANGED
@@ -60,14 +60,17 @@ npx --yes @unbrained/pm-cli@latest --help
60
60
  `pm` packages use the same package-first vocabulary:
61
61
 
62
62
  ```bash
63
- pm install '*'
64
- pm install ./my-package
63
+ pm package install '*'
64
+ pm package install ./my-package
65
65
  pm package manage --project
66
66
  pm package doctor --detail summary
67
- pm upgrade --dry-run
67
+ pm package upgrade --dry-run
68
68
  ```
69
69
 
70
- The legacy `pm extension ...` command remains available for existing automation.
70
+ The hidden legacy `pm extension ...`, `pm install ...`, and `pm upgrade ...`
71
+ aliases remain available for existing automation. They preserve canonical output
72
+ and emit one migration hint on stderr unless `ux.deprecation_hints` is disabled;
73
+ for example, `pm install guide-shell --project` maps to the canonical command.
71
74
 
72
75
  ## 60 Second Example
73
76
 
@@ -108,7 +111,7 @@ pm list --status in_progress --limit 20
108
111
 
109
112
  If no relevant item exists, create a parent lineage before child work, claim the child item, link changed files/docs/tests, and leave evidence comments before closing. The full workflow is in the [Agent Guide](docs/AGENT_GUIDE.md).
110
113
 
111
- For token-aware local routing, install `guide-shell` with `pm install guide-shell --project`, then use `pm guide workflows` and drill into related topics (`commands`, `skills`, `release`) only when needed.
114
+ For token-aware local routing, install `guide-shell` with `pm package install guide-shell --project`, then use `pm guide workflows` and drill into related topics (`commands`, `skills`, `release`) only when needed.
112
115
 
113
116
  ## Core Model
114
117
 
@@ -1,5 +1,5 @@
1
1
 
2
- !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="48877bbb-17bf-5a78-91fa-19a2f2f4c2be")}catch(e){}}();
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]="8879d491-9158-548c-bfbd-8ab57d8eb936")}catch(e){}}();
3
3
  import { pathExists, resolveItemTypeRegistry, EXIT_CODE, getSettingsPath, resolvePmRoot, readSettings, getActiveExtensionRegistrations, locateItem, runActiveServiceOverride, levenshteinDistanceWithinLimit, } from "../sdk/runtime-primitives.js";
4
4
  import { BUILTIN_ITEM_TYPE_VALUES } from "../types/index.js";
5
5
  import { PM_CORE_COMMAND_NAMES, resolveSubcommandFlagContractsForCommand, } from "../sdk/cli-contracts.js";
@@ -525,16 +525,20 @@ export function isKnownHelpCommandPath(root, commandPathTokens) {
525
525
  return true;
526
526
  }
527
527
  let current = root;
528
- let matchedAny = false;
529
- for (const token of commandPathTokens) {
528
+ for (const [tokenIndex, token] of commandPathTokens.entries()) {
530
529
  const next = resolveChildCommandByToken(current, token);
531
530
  if (!next) {
532
- return matchedAny;
531
+ if (current.commands.some((candidate) => candidate.name() !== "help")) {
532
+ return false;
533
+ }
534
+ const declaredArguments = current.registeredArguments;
535
+ return (declaredArguments.length > 0 &&
536
+ (declaredArguments.at(-1)?.variadic === true ||
537
+ commandPathTokens.length - tokenIndex <= declaredArguments.length));
533
538
  }
534
- matchedAny = true;
535
539
  current = next;
536
540
  }
537
- return matchedAny;
541
+ return true;
538
542
  }
539
543
  async function resolveWorkspaceUsageContext(bootstrapGlobal, message, invocationArgv, commandName) {
540
544
  try {
@@ -763,4 +767,4 @@ export const _testOnly = {
763
767
  suggestNearestLongFlags,
764
768
  };
765
769
  //# sourceMappingURL=commander-usage.js.map
766
- //# debugId=48877bbb-17bf-5a78-91fa-19a2f2f4c2be
770
+ //# debugId=8879d491-9158-548c-bfbd-8ab57d8eb936
@@ -1,5 +1,5 @@
1
1
 
2
- !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="4bdb7fcf-dd74-57bc-8a0e-07539095462e")}catch(e){}}();
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]="bb31fb1f-bf61-5eab-aa63-5d04fbac282f")}catch(e){}}();
3
3
  import { resolveRecoveryCommandName } from "../sdk/agent/command-recovery.js";
4
4
  import { projectPmDiagnosticOutput, projectPmDiagnosticText, } from "../sdk/cli-contracts/agent-output-contracts.js";
5
5
  import { renderPmCommand } from "./argv-utils.js";
@@ -207,6 +207,7 @@ function renderRecoveryBundle(recovery) {
207
207
  return [];
208
208
  }
209
209
  const lines = ["Recovery bundle:"];
210
+ appendRecoveryTextLine(lines, "suggested_retry", normalized.suggested_retry);
210
211
  appendRecoveryTextLine(lines, "attempted_command", normalized.attempted_command);
211
212
  appendRecoveryListLine(lines, "normalized_args", normalized.normalized_args, " ");
212
213
  if (normalized.parsed_positionals &&
@@ -231,7 +232,6 @@ function renderRecoveryBundle(recovery) {
231
232
  if (normalized.option_scope !== undefined) {
232
233
  lines.push(` option_scope: ${normalized.option_scope}`);
233
234
  }
234
- appendRecoveryTextLine(lines, "suggested_retry", normalized.suggested_retry);
235
235
  if (typeof normalized.retry_after_ms === "number") {
236
236
  lines.push(` retry_after_ms: ${normalized.retry_after_ms}`);
237
237
  }
@@ -1297,4 +1297,4 @@ export const _testOnly = {
1297
1297
  resolveKnownPackageCommandHint,
1298
1298
  };
1299
1299
  //# sourceMappingURL=error-guidance.js.map
1300
- //# debugId=4bdb7fcf-dd74-57bc-8a0e-07539095462e
1300
+ //# debugId=bb31fb1f-bf61-5eab-aa63-5d04fbac282f
@@ -39,6 +39,8 @@ declare function renderDetailedHelpBundle(bundle: HelpBundle): string;
39
39
  export declare function normalizeHelpCommandPath(commandPath: string): string;
40
40
  /** Implements resolve help detail mode for the public runtime surface of this module. */
41
41
  export declare function resolveHelpDetailMode(argv: string[]): HelpDetailMode;
42
+ /** Whether an invocation requests the complete public command discovery tier. */
43
+ export declare function isFullHelpDiscovery(argv: readonly string[]): boolean;
42
44
  /** Public contract for root help bundle, shared by SDK and presentation-layer consumers. */
43
45
  export declare const ROOT_HELP_BUNDLE: HelpBundle;
44
46
  /** Implements resolve help bundle for path for the public runtime surface of this module. */
@@ -1,8 +1,9 @@
1
1
 
2
- !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="5ea35d21-cfe6-5138-9fdb-413083719924")}catch(e){}}();
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]="1399e88f-710a-5e5c-b4b3-70e35ec401cf")}catch(e){}}();
3
3
  import { parseBootstrapHelpRequest } from "./bootstrap-args.js";
4
4
  import { formatPmPositionalActionFlagTip, PM_POSITIONAL_ACTION_CONTRACTS, resolvePmPositionalActionContract, } from "../sdk/cli-contracts/grammar-contracts.js";
5
- import { listPmCommandsForTier, measurePmCoreHelp, PM_CORE_HELP_OPTION_FLAGS, } from "../sdk/agent-capability-contracts.js";
5
+ import { listPmCommandsForTier, measurePmCoreHelp, PM_CORE_HELP_OPTION_FLAGS, resolvePmCommandVisibilityTier, } from "../sdk/agent-capability-contracts.js";
6
+ import { PM_COMMAND_ALIAS_CONTRACTS, renderPmCommandAliasMigrationHint, } from "../sdk/cli-contracts.js";
6
7
  const COMMAND_HELP_VISIBILITY_TIERS = new WeakMap();
7
8
  /** Attach a package command's declared tier to its Commander presentation node. */
8
9
  export function setPmCommandHelpVisibilityTier(command, tier) {
@@ -92,6 +93,10 @@ export function resolveHelpDetailMode(argv) {
92
93
  }
93
94
  return "compact";
94
95
  }
96
+ /** Whether an invocation requests the complete public command discovery tier. */
97
+ export function isFullHelpDiscovery(argv) {
98
+ return argv.includes("--all") || argv.includes("--explain");
99
+ }
95
100
  const HELP_BY_COMMAND_PATH = {
96
101
  init: {
97
102
  why: "Bootstraps tracker storage and settings so all other commands can run safely.",
@@ -883,30 +888,47 @@ export function resolveHelpNarrative(commandPath, detailMode) {
883
888
  detail_mode: detailMode,
884
889
  };
885
890
  }
886
- /** Implements attach rich help text for the public runtime surface of this module. */
887
- export function attachRichHelpText(program, argv = process.argv.slice(2)) {
888
- const baselineHelp = program.createHelp();
889
- const coreCommands = new Set(listPmCommandsForTier("core"));
891
+ /** Render the complete permanent and deprecated command-alias discovery appendix. */
892
+ function renderFullCommandAliasHelp() {
893
+ const permanentAliases = PM_COMMAND_ALIAS_CONTRACTS.filter(({ lifecycle }) => lifecycle === "permanent");
894
+ const deprecatedAliases = PM_COMMAND_ALIAS_CONTRACTS.filter(({ lifecycle }) => lifecycle === "deprecated");
895
+ return [
896
+ "",
897
+ "Command aliases:",
898
+ ...permanentAliases.map(({ alias, canonical_argv: canonicalArgv }) => ` ${alias} -> pm ${canonicalArgv.join(" ")}`),
899
+ "",
900
+ "Deprecated aliases:",
901
+ ...deprecatedAliases.map((contract) => ` ${contract.alias} -> pm ${contract.canonical_argv.join(" ")} (${renderPmCommandAliasMigrationHint(contract)})`),
902
+ ].join("\n");
903
+ }
904
+ /** Configure Commander visibility without changing the registered command graph. */
905
+ function configureTieredHelpVisibility(program, baselineHelp, fullDiscovery, selectedRootCommands) {
890
906
  const coreOptions = new Set(PM_CORE_HELP_OPTION_FLAGS);
891
- const selectedRootCommands = new Set();
892
907
  program.configureHelp({
893
908
  visibleCommands(command) {
894
909
  const visible = baselineHelp.visibleCommands(command);
895
- if (command !== program) {
896
- return visible;
910
+ if (!fullDiscovery) {
911
+ if (command !== program)
912
+ return visible;
913
+ return visible.filter((candidate) => selectedRootCommands.has(candidate));
897
914
  }
898
- return visible.filter((candidate) => selectedRootCommands.has(candidate));
915
+ return visible.filter((candidate) => {
916
+ const declaredTier = getPmCommandHelpVisibilityTier(candidate);
917
+ return ((declaredTier ?? resolvePmCommandVisibilityTier(candidate.name())) !==
918
+ "internal");
919
+ });
899
920
  },
900
921
  visibleOptions(command) {
901
922
  const visible = baselineHelp.visibleOptions(command);
902
- return command === program
903
- ? visible.filter((option) => coreOptions.has(option.flags))
904
- : visible;
923
+ if (command !== program || fullDiscovery)
924
+ return visible;
925
+ return visible.filter((option) => coreOptions.has(option.flags));
905
926
  },
906
927
  });
907
- const detailMode = resolveHelpDetailMode(argv);
908
- const rootHelpText = renderHelpBundle(ROOT_HELP_BUNDLE, detailMode);
909
- program.addHelpText("after", rootHelpText);
928
+ }
929
+ /** Populate the root core tier while enforcing the public help-size budget. */
930
+ function selectBudgetedRootCommands(program, baselineHelp, selectedRootCommands, rootHelpText) {
931
+ const coreCommands = new Set(listPmCommandsForTier("core"));
910
932
  const budgetHelp = program.createHelp();
911
933
  budgetHelp.prepareContext({
912
934
  error: false,
@@ -930,6 +952,20 @@ export function attachRichHelpText(program, argv = process.argv.slice(2)) {
930
952
  selectedRootCommands.delete(candidate);
931
953
  }
932
954
  }
955
+ }
956
+ /** Implements attach rich help text for the public runtime surface of this module. */
957
+ export function attachRichHelpText(program, argv = process.argv.slice(2)) {
958
+ const baselineHelp = program.createHelp();
959
+ const fullDiscovery = isFullHelpDiscovery(argv);
960
+ const selectedRootCommands = new Set();
961
+ configureTieredHelpVisibility(program, baselineHelp, fullDiscovery, selectedRootCommands);
962
+ const detailMode = resolveHelpDetailMode(argv);
963
+ const rootHelpText = renderHelpBundle(ROOT_HELP_BUNDLE, detailMode);
964
+ program.addHelpText("after", rootHelpText);
965
+ if (fullDiscovery) {
966
+ program.addHelpText("after", renderFullCommandAliasHelp());
967
+ }
968
+ selectBudgetedRootCommands(program, baselineHelp, selectedRootCommands, rootHelpText);
933
969
  for (const [commandPath, bundle] of Object.entries(HELP_BY_COMMAND_PATH)) {
934
970
  attachBundleByPath(program, commandPath, bundle, detailMode);
935
971
  }
@@ -963,4 +999,4 @@ export const _testOnly = {
963
999
  renderDetailedHelpBundle,
964
1000
  };
965
1001
  //# sourceMappingURL=help-content.js.map
966
- //# debugId=5ea35d21-cfe6-5138-9fdb-413083719924
1002
+ //# debugId=1399e88f-710a-5e5c-b4b3-70e35ec401cf
@@ -31,6 +31,12 @@ export interface HelpSubcommandSummary {
31
31
  tier: PmCommandVisibilityTier;
32
32
  /** Shared command capability family. */
33
33
  family: PmCommandCapabilityFamily;
34
+ /** Canonical command path when this row is an executable alias. */
35
+ alias_for?: string;
36
+ /** Compatibility lifecycle declared by the canonical alias contract. */
37
+ alias_lifecycle?: "permanent" | "deprecated";
38
+ /** True when callers should migrate from this executable spelling. */
39
+ deprecated?: true;
34
40
  }
35
41
  type ExtensionCommandSurface = Pick<ExtensionCommandHelpDescriptor, "tier" | "family">;
36
42
  declare function resolveExtensionCommandSurface(commandPath: string, descriptors: ReadonlyMap<string, ExtensionCommandHelpDescriptor>, allowDescendants?: boolean): ExtensionCommandSurface | undefined;
@@ -40,7 +46,7 @@ declare function buildOptionAliasMap(options: unknown[]): Map<string, string[]>;
40
46
  declare function buildHelpOptionSummaries(command: Command): HelpOptionSummary[];
41
47
  declare function compactHelpOptionAliases(options: HelpOptionSummary[]): HelpOptionSummary[];
42
48
  declare function buildHelpArgumentSummaries(command: Command): HelpArgumentSummary[];
43
- declare function buildHelpSubcommandSummaries(command: Command, extensionDescriptors?: ReadonlyMap<string, ExtensionCommandHelpDescriptor>): HelpSubcommandSummary[];
49
+ declare function buildHelpSubcommandSummaries(command: Command, extensionDescriptors?: ReadonlyMap<string, ExtensionCommandHelpDescriptor>, includeAll?: boolean): HelpSubcommandSummary[];
44
50
  interface PositionalActionHelpProjection {
45
51
  arguments: HelpArgumentSummary[];
46
52
  options: HelpOptionSummary[];
@@ -48,7 +54,7 @@ interface PositionalActionHelpProjection {
48
54
  usage: string;
49
55
  }
50
56
  /** Build the command/action structural view shared by every JSON help field. */
51
- declare function buildPositionalActionHelpProjection(action: PmPositionalActionContract | undefined, targetCommand: Command, resolvedPath: string, allOptions: HelpOptionSummary[], extensionDescriptors?: ReadonlyMap<string, ExtensionCommandHelpDescriptor>): PositionalActionHelpProjection;
57
+ declare function buildPositionalActionHelpProjection(action: PmPositionalActionContract | undefined, targetCommand: Command, resolvedPath: string, allOptions: HelpOptionSummary[], extensionDescriptors?: ReadonlyMap<string, ExtensionCommandHelpDescriptor>, includeAll?: boolean): PositionalActionHelpProjection;
52
58
  declare function buildJsonHelpPayload(rootProgram: Command, targetCommand: Command, argv: string[], requestedPath: string[], extensionDescriptors: ReadonlyMap<string, ExtensionCommandHelpDescriptor>): Record<string, unknown>;
53
59
  /** Implements maybe render bootstrap json help for the public runtime surface of this module. */
54
60
  export declare function maybeRenderBootstrapJsonHelp(rootProgram: Command, argv: string[], extensionDescriptors: ReadonlyMap<string, ExtensionCommandHelpDescriptor>): Promise<boolean>;