@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.
- package/.agents/skills/HARNESS_COMPATIBILITY.md +32 -0
- package/.agents/skills/README.md +47 -0
- package/.agents/skills/pm-developer/SKILL.md +117 -0
- package/.agents/skills/pm-developer/references/COMMAND_PLAYBOOK.md +49 -0
- package/.agents/skills/pm-developer/references/GRAPH_AND_RELATIONSHIPS.md +91 -0
- package/.agents/skills/pm-developer/references/MULTI_AGENT_MERGE.md +72 -0
- package/.agents/skills/pm-developer/references/PROMPTS.md +17 -0
- package/.agents/skills/pm-developer/references/SCRIPTING_COMPOSITION.md +82 -0
- package/.agents/skills/pm-developer/references/TOKEN_BUDGETS.md +85 -0
- package/.agents/skills/pm-extensions/SKILL.md +106 -0
- package/.agents/skills/pm-extensions/references/AUTHORING.md +95 -0
- package/.agents/skills/pm-extensions/references/LIFECYCLE.md +40 -0
- package/.agents/skills/pm-extensions/references/TROUBLESHOOTING.md +25 -0
- package/.agents/skills/pm-sdk/SKILL.md +107 -0
- package/.agents/skills/pm-sdk/references/DOMAIN_MODELING.md +78 -0
- package/.agents/skills/pm-sdk/references/INTEGRATION_CHECKLIST.md +31 -0
- package/.agents/skills/pm-sdk/references/PROMPTS.md +13 -0
- package/.agents/skills/pm-sdk/references/SURFACE_MAP.md +82 -0
- package/.agents/skills/pm-user/SKILL.md +111 -0
- package/.agents/skills/pm-user/references/BACKLOG_SHAPING.md +105 -0
- package/.agents/skills/pm-user/references/PROMPTS.md +17 -0
- package/.agents/skills/pm-user/references/WORKFLOWS.md +35 -0
- package/.claude-plugin/marketplace.json +2 -2
- package/CHANGELOG.md +25 -3
- package/README.md +8 -5
- package/dist/cli/commander-usage.js +11 -7
- package/dist/cli/error-guidance.js +3 -3
- package/dist/cli/help-content.d.ts +2 -0
- package/dist/cli/help-content.js +53 -17
- package/dist/cli/help-json-payload.d.ts +8 -2
- package/dist/cli/help-json-payload.js +46 -12
- package/dist/cli/main.js +52 -74
- package/dist/cli/register-annotations.js +27 -21
- package/dist/cli/register-setup.js +98 -57
- package/dist/cli-bundle/bundle-manifest.json +152 -152
- package/dist/cli-bundle/chunks/chunk-3OO3W6FW.js +202 -0
- package/dist/cli-bundle/chunks/chunk-52EKTW6V.js +3 -0
- package/dist/cli-bundle/chunks/{chunk-KBFP3E4E.js → chunk-CVBBGWW5.js} +62 -44
- package/dist/cli-bundle/chunks/chunk-MFNTKMTI.js +13 -0
- package/dist/cli-bundle/chunks/{chunk-E2GCFJSU.js → chunk-OS27HHBN.js} +31 -31
- package/dist/cli-bundle/chunks/chunk-QTO7USTH.js +2 -0
- package/dist/cli-bundle/chunks/{chunk-S4U76VZF.js → chunk-R4ETAOJC.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-UKBCRPA2.js → chunk-SH6P7FXI.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-WRHJ3MB6.js → chunk-SHMDY36D.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-ZNRLJ54C.js → chunk-SKXLJIEK.js} +2 -2
- package/dist/cli-bundle/chunks/chunk-TNX6HC54.js +3 -0
- package/dist/cli-bundle/chunks/{register-list-query-EMCPMICY.js → register-list-query-EUWM6VII.js} +2 -2
- package/dist/cli-bundle/chunks/{register-mutation-OJ67ABCB.js → register-mutation-FD4HSAVU.js} +4 -4
- package/dist/cli-bundle/chunks/{register-operations-H2GLP7LT.js → register-operations-HRMNFEC3.js} +2 -2
- package/dist/cli-bundle/chunks/register-setup-33GNICLX.js +2 -0
- package/dist/cli-bundle/focused-chunks/{chunk-4XNH2HM7.js → chunk-2AGZ5BRT.js} +2 -2
- package/dist/cli-bundle/focused-chunks/{chunk-72T6JGAE.js → chunk-4BR5UU52.js} +45 -45
- package/dist/cli-bundle/focused-chunks/{chunk-OHIHZ7HS.js → chunk-6GCRSLPG.js} +2 -2
- package/dist/cli-bundle/focused-chunks/{chunk-UYBA57GY.js → chunk-AD6ULRAF.js} +2 -2
- package/dist/cli-bundle/focused-chunks/{chunk-7YCDTCBC.js → chunk-AQ5IYEZZ.js} +2 -2
- package/dist/cli-bundle/focused-chunks/{chunk-YO3ZF3FI.js → chunk-EKX37ZHA.js} +2 -2
- package/dist/cli-bundle/focused-chunks/{chunk-LV5N3LK5.js → chunk-FC2AXLB5.js} +2 -2
- package/dist/cli-bundle/focused-chunks/{chunk-IBHXMFE7.js → chunk-HC7ODMH3.js} +2 -2
- package/dist/cli-bundle/focused-chunks/{chunk-4K2II4TV.js → chunk-HVQ22RC4.js} +2 -2
- package/dist/cli-bundle/focused-chunks/{chunk-A644DUFQ.js → chunk-MEASX544.js} +2 -2
- package/dist/cli-bundle/focused-chunks/{chunk-FXDLT6FL.js → chunk-MXTYGECH.js} +2 -2
- package/dist/cli-bundle/focused-chunks/{chunk-MMXUPDDJ.js → chunk-SUBSWYW3.js} +2 -2
- package/dist/cli-bundle/focused-chunks/{chunk-57XY346D.js → chunk-XDPYBQCF.js} +9 -9
- package/dist/cli-bundle/focused-chunks/{chunk-TMJDFHVD.js → chunk-Y3JJXRVK.js} +2 -2
- package/dist/cli-bundle/focused-chunks/{chunk-66VGB23P.js → chunk-Y5A7SJJ7.js} +2 -2
- package/dist/cli-bundle/focused-chunks/chunk-YHWHX6YY.js +2 -0
- package/dist/cli-bundle/focused-chunks/{chunk-P2E6LDAE.js → chunk-YVVZ3LQ6.js} +3 -3
- package/dist/cli-bundle/focused-chunks/chunk-Z2USIBR2.js +5 -0
- package/dist/cli-bundle/main.js +15 -14
- package/dist/cli-bundle/sdk-authoring.js +1 -1
- package/dist/cli-bundle/sdk-contracts.js +2 -2
- package/dist/cli-bundle/sdk-core.js +31 -31
- package/dist/cli-bundle/sdk-governance.js +1 -1
- package/dist/cli-bundle/sdk-graph.js +1 -1
- package/dist/cli-bundle/sdk-merge.js +31 -31
- package/dist/cli-bundle/sdk-query.js +1 -1
- package/dist/cli-bundle/sdk-runtime.js +1 -1
- package/dist/cli-bundle/sdk-testing.js +1 -1
- package/dist/cli-bundle/sdk.js +32 -7
- package/dist/core/governance/issue-codes.d.ts +11 -2
- package/dist/core/governance/issue-codes.js +29 -10
- package/dist/core/item/item-format.js +3 -3
- package/dist/core/store/item-store.js +12 -5
- package/dist/mcp/server.js +123 -9
- package/dist/mcp/tool-definitions.d.ts +2 -0
- package/dist/mcp/tool-definitions.js +2 -2
- package/dist/sdk/agent/closed-domain-contracts.d.ts +1 -1
- package/dist/sdk/agent/closed-domain-contracts.js +24 -2
- package/dist/sdk/agent-capability-contracts.js +6 -2
- package/dist/sdk/cli-bootstrap.js +3 -2
- package/dist/sdk/cli-contracts/command-aliases.js +15 -2
- package/dist/sdk/cli-contracts/enum-contracts.d.ts +4 -1
- package/dist/sdk/cli-contracts/enum-contracts.js +7 -2
- package/dist/sdk/cli-contracts/flag-contracts.js +9 -5
- package/dist/sdk/cli-contracts/grammar-contracts.d.ts +3 -3
- package/dist/sdk/cli-contracts/grammar-contracts.js +24 -17
- package/dist/sdk/cli-contracts/runtime-contracts.js +13 -11
- package/dist/sdk/cli-contracts/tool-schema.js +18 -15
- package/dist/sdk/cli-contracts.d.ts +1 -1
- package/dist/sdk/cli-contracts.js +3 -3
- package/dist/sdk/cli-program.js +3 -2
- package/dist/sdk/completion.js +40 -13
- package/dist/sdk/generated/generated-error-code-catalog-part-2.js +14 -2
- package/dist/sdk/governance/upgrade.d.ts +2 -0
- package/dist/sdk/governance/upgrade.js +30 -8
- package/dist/sdk/governance/validate.js +8 -6
- package/dist/sdk/guide-topics.js +6 -6
- package/dist/sdk/index.d.ts +4 -2
- package/dist/sdk/index.js +5 -3
- package/dist/sdk/mcp/apps.d.ts +70 -0
- package/dist/sdk/mcp/apps.js +154 -0
- package/dist/sdk/mcp/skills.d.ts +127 -0
- package/dist/sdk/mcp/skills.js +390 -0
- package/dist/sdk/read-output-contracts.js +16 -3
- package/dist/sdk/runtime-action-aliases.js +7 -3
- package/dist/sdk/runtime-input.js +12 -4
- package/dist/sdk/runtime-primitives.d.ts +1 -1
- package/dist/sdk/runtime-primitives.js +3 -3
- package/docs/CLI_GRAMMAR.md +7 -1
- package/docs/COMMANDS.md +2 -2
- package/docs/EXTENSIONS.md +33 -32
- package/docs/MCP_2026_07_28.md +24 -2
- package/docs/MCP_2026_07_28_CONFORMANCE.md +4 -4
- package/docs/MCP_SKILLS_AND_APPS.md +107 -0
- package/docs/QUICKSTART.md +15 -15
- package/docs/README.md +1 -0
- package/docs/RELEASING.md +11 -3
- package/docs/SDK_CONTEXT_INTEGRITY.md +6 -0
- package/docs/SDK_EVIDENCE_TRACEABILITY.md +9 -1
- package/docs/generated/AGENT_CAPABILITY_ROUTING.md +1 -1
- package/docs/generated/REFUSAL_CLOSURE_CENSUS.md +7 -6
- package/marketplace.json +2 -2
- package/package.json +9 -7
- package/packages/pm-beads/README.md +12 -6
- package/packages/pm-beads/docs/MIGRATION.md +53 -0
- package/packages/pm-beads/extensions/beads/index.ts +8 -0
- package/packages/pm-beads/extensions/beads/runtime.ts +671 -112
- package/packages/pm-beads/package.json +1 -1
- package/packages/pm-calendar/package.json +1 -1
- package/packages/pm-command-kit/package.json +1 -1
- package/packages/pm-digital-twin/package.json +1 -1
- package/packages/pm-governance-audit/package.json +1 -1
- package/packages/pm-guide-shell/package.json +1 -1
- package/packages/pm-kanban/package.json +1 -1
- package/packages/pm-lifecycle-hooks/package.json +1 -1
- package/packages/pm-linked-test-adapters/package.json +1 -1
- package/packages/pm-search-advanced/package.json +1 -1
- package/packages/pm-templates/package.json +1 -1
- package/packages/pm-todos/package.json +1 -1
- package/packages/pm-vcs/package.json +1 -1
- package/plugins/pm-claude/.claude-plugin/plugin.json +1 -1
- package/plugins/pm-codex/.codex-plugin/plugin.json +1 -1
- package/sdk/public-surface.json +235 -13
- package/dist/cli-bundle/chunks/chunk-ES25LX3D.js +0 -202
- package/dist/cli-bundle/chunks/chunk-FRDWWB6R.js +0 -3
- package/dist/cli-bundle/chunks/chunk-ICQ3RVIY.js +0 -2
- package/dist/cli-bundle/chunks/chunk-IV64RJVE.js +0 -13
- package/dist/cli-bundle/chunks/chunk-MVYLQ67M.js +0 -3
- package/dist/cli-bundle/chunks/register-setup-GLZAHLVI.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-7I23XGWO.js +0 -2
- 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.
|
|
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.
|
|
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
|
|
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]="
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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=
|
|
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]="
|
|
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=
|
|
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. */
|
package/dist/cli/help-content.js
CHANGED
|
@@ -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]="
|
|
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
|
-
/**
|
|
887
|
-
|
|
888
|
-
const
|
|
889
|
-
const
|
|
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 (
|
|
896
|
-
|
|
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) =>
|
|
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
|
-
|
|
903
|
-
|
|
904
|
-
|
|
923
|
+
if (command !== program || fullDiscovery)
|
|
924
|
+
return visible;
|
|
925
|
+
return visible.filter((option) => coreOptions.has(option.flags));
|
|
905
926
|
},
|
|
906
927
|
});
|
|
907
|
-
|
|
908
|
-
|
|
909
|
-
|
|
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=
|
|
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
|
|
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
|
|
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>;
|