@unbrained/pm-cli 2026.8.17 → 2026.8.18
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/.claude-plugin/marketplace.json +2 -2
- package/AGENTS.md +4 -3
- package/CHANGELOG.md +35 -3
- package/README.md +3 -3
- package/dist/cli/error-guidance.js +7 -4
- package/dist/cli/register-list-query.js +132 -51
- package/dist/cli-bundle/bundle-manifest.json +146 -146
- package/dist/cli-bundle/chunks/chunk-5UZZAJKR.js +3 -0
- package/dist/cli-bundle/chunks/{chunk-YM2YAMF7.js → chunk-ALDJGKAK.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-HBJAS566.js → chunk-BSK2IN3C.js} +2 -2
- package/dist/cli-bundle/chunks/chunk-DY4DMUMC.js +197 -0
- package/dist/cli-bundle/chunks/{chunk-JOKATURE.js → chunk-GNFAFIJI.js} +9 -9
- package/dist/cli-bundle/chunks/chunk-L5Q2CLPE.js +35 -0
- package/dist/cli-bundle/chunks/{chunk-TPXZIBIV.js → chunk-PVRUN5ZS.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-7IBRGCHX.js → chunk-RZQTVMRQ.js} +2 -2
- package/dist/cli-bundle/chunks/chunk-SARFF5H5.js +3 -0
- package/dist/cli-bundle/chunks/chunk-UYCLQVL2.js +13 -0
- package/dist/cli-bundle/chunks/{chunk-3UEGXBMR.js → chunk-YRGOLZA7.js} +58 -54
- package/dist/cli-bundle/chunks/register-list-query-I23LALEE.js +11 -0
- package/dist/cli-bundle/chunks/{register-mutation-4WBRPXLV.js → register-mutation-6YGU3GPH.js} +2 -2
- package/dist/cli-bundle/chunks/{register-operations-SSENDH5B.js → register-operations-4HTFC6J7.js} +2 -2
- package/dist/cli-bundle/chunks/{register-setup-DOSFBGKE.js → register-setup-PPPEF3SN.js} +2 -2
- package/dist/cli-bundle/focused-chunks/chunk-2PN4TJXH.js +2 -0
- package/dist/cli-bundle/focused-chunks/{chunk-ZQPGZZWQ.js → chunk-3TKWMNKF.js} +3 -3
- package/dist/cli-bundle/focused-chunks/chunk-5AF3ZBNB.js +155 -0
- package/dist/cli-bundle/focused-chunks/chunk-C5IW2NDA.js +2 -0
- package/dist/cli-bundle/focused-chunks/{chunk-SYZENPIT.js → chunk-EUEGXZ2A.js} +2 -2
- package/dist/cli-bundle/focused-chunks/{chunk-XKAMP5OU.js → chunk-EX6MKP2X.js} +2 -2
- package/dist/cli-bundle/focused-chunks/{chunk-CYFK5UPB.js → chunk-K43KKAFS.js} +2 -2
- package/dist/cli-bundle/focused-chunks/{chunk-ATEY76SX.js → chunk-M62NO7EI.js} +2 -2
- package/dist/cli-bundle/focused-chunks/{chunk-SALH6B6K.js → chunk-ODOVCP45.js} +5 -5
- package/dist/cli-bundle/focused-chunks/chunk-RNDNMARJ.js +16 -0
- package/dist/cli-bundle/focused-chunks/chunk-TN4AE665.js +26 -0
- package/dist/cli-bundle/focused-chunks/chunk-TVV2DONO.js +2 -0
- package/dist/cli-bundle/focused-chunks/chunk-UI6AJ5TD.js +4 -0
- package/dist/cli-bundle/focused-chunks/{chunk-MHPIL773.js → chunk-V5XTGLK7.js} +2 -2
- package/dist/cli-bundle/focused-chunks/{chunk-KP2VQQVQ.js → chunk-WGHQVU6P.js} +2 -2
- package/dist/cli-bundle/focused-chunks/chunk-XYNBXTDQ.js +2 -0
- package/dist/cli-bundle/focused-chunks/chunk-Z56ECT7I.js +2 -0
- package/dist/cli-bundle/main.js +7 -7
- package/dist/cli-bundle/sdk-authoring.js +1 -1
- package/dist/cli-bundle/sdk-contracts.js +1 -1
- 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 +32 -32
- 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 +4 -4
- package/dist/core/config/nested-settings.js +8 -2
- package/dist/core/extensions/exporter-output-contract.d.ts +12 -0
- package/dist/core/extensions/exporter-output-contract.js +67 -0
- package/dist/core/extensions/extension-types.d.ts +36 -1
- package/dist/core/extensions/extension-types.js +2 -2
- package/dist/core/extensions/loader.js +35 -44
- package/dist/core/history/event-index.d.ts +5 -0
- package/dist/core/history/event-index.js +133 -27
- package/dist/core/sentry/helpers.js +3 -3
- package/dist/core/shared/constants.js +5 -2
- package/dist/core/store/settings-validator.d.ts +4 -0
- package/dist/core/store/settings-validator.js +3 -2
- package/dist/core/store/settings.js +8 -2
- package/dist/mcp/tool-definitions.js +12 -7
- package/dist/sdk/agent/refusal-reachability.js +4 -4
- package/dist/sdk/authoring.d.ts +1 -1
- package/dist/sdk/authoring.js +2 -2
- package/dist/sdk/cli-bootstrap.d.ts +2 -2
- package/dist/sdk/cli-bootstrap.js +4 -4
- package/dist/sdk/cli-contracts/command-aliases.d.ts +34 -2
- package/dist/sdk/cli-contracts/command-aliases.js +64 -13
- package/dist/sdk/cli-contracts/enum-contracts.d.ts +4 -0
- package/dist/sdk/cli-contracts/enum-contracts.js +9 -2
- package/dist/sdk/cli-contracts/flag-contracts.js +11 -7
- package/dist/sdk/cli-contracts/grammar-contracts.d.ts +70 -0
- package/dist/sdk/cli-contracts/grammar-contracts.js +345 -0
- package/dist/sdk/cli-contracts/runtime-contracts.d.ts +19 -2
- package/dist/sdk/cli-contracts/runtime-contracts.js +61 -14
- package/dist/sdk/cli-contracts/tool-parameter-tables.js +7 -2
- package/dist/sdk/cli-contracts/tool-schema.d.ts +2 -2
- package/dist/sdk/cli-contracts/tool-schema.js +20 -11
- package/dist/sdk/cli-contracts.d.ts +2 -2
- package/dist/sdk/cli-contracts.js +4 -4
- package/dist/sdk/completion.js +13 -15
- package/dist/sdk/compose.d.ts +3 -3
- package/dist/sdk/compose.js +2 -2
- package/dist/sdk/contracts.d.ts +1 -0
- package/dist/sdk/contracts.js +3 -2
- package/dist/sdk/core.d.ts +1 -1
- package/dist/sdk/core.js +3 -3
- package/dist/sdk/environment/host-environment-errors.js +3 -3
- package/dist/sdk/generated/generated-error-code-catalog-part-1.js +54 -14
- package/dist/sdk/generated/generated-error-code-catalog-part-2.js +50 -14
- package/dist/sdk/guide-topics.js +5 -5
- package/dist/sdk/index.d.ts +4 -3
- package/dist/sdk/index.js +6 -5
- package/dist/sdk/init-agent-guidance.js +3 -3
- package/dist/sdk/mutation-events.d.ts +18 -2
- package/dist/sdk/mutation-events.js +59 -16
- package/dist/sdk/output.d.ts +44 -0
- package/dist/sdk/output.js +28 -2
- package/dist/sdk/query/complete-list.d.ts +94 -0
- package/dist/sdk/query/complete-list.js +173 -0
- package/dist/sdk/query/list.js +5 -2
- package/dist/sdk/query.d.ts +1 -0
- package/dist/sdk/query.js +3 -2
- package/dist/sdk/read-output-contracts.d.ts +2 -2
- package/dist/sdk/read-output-contracts.js +36 -9
- package/dist/sdk/runtime-extended-actions.js +10 -2
- package/dist/sdk/runtime.d.ts +8 -2
- package/dist/sdk/runtime.js +11 -8
- package/dist/types.d.ts +5 -0
- package/dist/types.js +2 -2
- package/docs/AGENT_GUIDE.md +25 -9
- package/docs/CLI_GRAMMAR.md +106 -0
- package/docs/COMMANDS.md +23 -23
- package/docs/ONBOARDING.md +4 -4
- package/docs/QUICKSTART.md +1 -1
- package/docs/README.md +2 -0
- package/docs/RELEASING.md +30 -6
- package/docs/SDK.md +36 -2
- package/docs/SDK_ARTIFACT_OUTPUT.md +72 -0
- package/docs/SDK_CONTEXT_COORDINATION.md +46 -12
- package/docs/agent-task-token-baseline.json +5 -5
- package/marketplace.json +2 -2
- package/package.json +3 -2
- 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 +652 -31
- package/dist/cli-bundle/chunks/chunk-2QLOXC3V.js +0 -3
- package/dist/cli-bundle/chunks/chunk-4JPYF536.js +0 -35
- package/dist/cli-bundle/chunks/chunk-6VDLG2FC.js +0 -13
- package/dist/cli-bundle/chunks/chunk-ION3E43Q.js +0 -197
- package/dist/cli-bundle/chunks/chunk-OAC5NIV4.js +0 -3
- package/dist/cli-bundle/chunks/register-list-query-Q7KII4G5.js +0 -10
- package/dist/cli-bundle/focused-chunks/chunk-267MUUS6.js +0 -16
- package/dist/cli-bundle/focused-chunks/chunk-2NNFLLNG.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-2QSAKMIH.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-BUCG4ZI2.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-EHXIKD6K.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-KGEXTMPG.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-POEEAD2V.js +0 -4
- package/dist/cli-bundle/focused-chunks/chunk-XPIC53VA.js +0 -26
- package/dist/cli-bundle/focused-chunks/chunk-ZT2DJS27.js +0 -155
|
@@ -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.18"
|
|
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.18",
|
|
17
17
|
"author": {
|
|
18
18
|
"name": "unbrained",
|
|
19
19
|
"url": "https://github.com/unbraind/pm-cli"
|
package/AGENTS.md
CHANGED
|
@@ -63,8 +63,8 @@ For real repository tracking, do not override `PM_PATH`. If a script must target
|
|
|
63
63
|
```bash
|
|
64
64
|
pm context --limit 10
|
|
65
65
|
pm search "<request keywords>" --limit 10
|
|
66
|
-
pm list
|
|
67
|
-
pm list
|
|
66
|
+
pm list --status open --limit 20
|
|
67
|
+
pm list --status in_progress --limit 20
|
|
68
68
|
pm create --create-mode progressive --title "..." --description "..." --type Task --status open
|
|
69
69
|
pm claim <id>
|
|
70
70
|
pm update <id> --status in_progress --message "Start implementation"
|
|
@@ -82,12 +82,13 @@ Author identity is automatic; use `--author` only for an explicit override.
|
|
|
82
82
|
|
|
83
83
|
## Working Rules
|
|
84
84
|
|
|
85
|
-
- **Orient:** run `pm context`, `pm search`, `pm list
|
|
85
|
+
- **Orient:** run `pm context`, `pm search`, `pm list --status open`, and `pm list --status in_progress` before `pm create`. If net-new work is required, create or reuse the parent lineage first and record duplicate-check evidence in a create-time comment.
|
|
86
86
|
- **Verify before you claim:** the verification recipe for the Non-Negotiable above. A `closed` item whose `resolution`/`close_reason` describes the fix represents completed, shipped work — never describe it as outstanding. Confirm release/CI/infra status against the live system, e.g. `pm get pm-9gxi`, `npm view @unbrained/pm-cli version`, `gh release list`, `gh run list --workflow=auto-release.yml`.
|
|
87
87
|
- **Implement:** keep edits scoped to the claimed item. Link changed files with `pm files`, docs with `pm docs`, and runnable verification with `pm test`.
|
|
88
88
|
- **Record:** use `pm comments`, `pm notes`, and `pm learnings` for progress, rationale, and durable lessons. Prefer append-style updates over rewriting item content.
|
|
89
89
|
- **Verify:** use sandbox-safe commands. For documentation-only work, run at least `pnpm build` and a focused link/content check. For broader work, run linked tests, coverage, validation, and release gates as appropriate.
|
|
90
90
|
- **Close:** add evidence first, then `pm close <id> "<reason>" --validate-close warn`, then `pm release <id>`.
|
|
91
|
+
- **Land closeout through review:** tracker evidence, item closure, and the generated changelog are part of the reviewed delivery. Never push post-merge closeout commits directly to `main`; if evidence depends on the merge SHA, carry it in a normal `main`-based follow-up PR so the new head retains analyzer provenance. See [Releasing](docs/RELEASING.md#reviewed-delivery-closeout).
|
|
91
92
|
|
|
92
93
|
## Test Safety
|
|
93
94
|
|
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,39 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 2026.8.18 - 2026-08-18
|
|
4
|
+
|
|
5
|
+
### Added
|
|
6
|
+
|
|
7
|
+
- Alias shim layer: config-aware hidden aliases with one-line migration hints (foundation for all consolidations) ([pm-0z7n](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/features/pm-0z7n.toon))
|
|
8
|
+
|
|
9
|
+
### Fixed
|
|
10
|
+
|
|
11
|
+
- A commit pushed directly to the default branch can never be released: both analyzer-evidence fallbacks presuppose a pull request, and nothing declares that precondition ([pm-u1baah](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/issues/pm-u1baah.toon))
|
|
12
|
+
- GH-1052: typed fail-closed whole-list SDK primitive ([pm-y4aaol](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/issues/pm-y4aaol.toon))
|
|
13
|
+
- Packed Bun SDK import fails on node:module stripTypeScriptTypes ([pm-ikj8ve](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/issues/pm-ikj8ve.toon))
|
|
14
|
+
- GH-1051: package catalog rejects universal output-budget controls ([pm-2firut](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/issues/pm-2firut.toon))
|
|
15
|
+
- Bun event streaming falls back to authoritative history without node:sqlite ([pm-b8hwfr](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/issues/pm-b8hwfr.toon))
|
|
16
|
+
- Surface replication gate scopes trigger activation to relevant diff content ([pm-mrhwow](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/issues/pm-mrhwow.toon))
|
|
17
|
+
- CodeQL: remove generated-code artifact path interpolation from exporter integration harness ([pm-ozxkm2](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/issues/pm-ozxkm2.toon))
|
|
18
|
+
- Exporter artifact-channel contract: clean stdout, bounded receipts, and binary-safe streaming ([pm-dilou2](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/issues/pm-dilou2.toon))
|
|
19
|
+
- GH-1048: Windows Node 24 numeric EDQUOT fixtures construct NaN on platforms that do not declare that errno ([pm-y4kovm](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/issues/pm-y4kovm.toon))
|
|
20
|
+
- Queued daily releases recognize an already-published same-day release before analyzer provenance ([pm-dm2vfz](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/issues/pm-dm2vfz.toon))
|
|
21
|
+
|
|
22
|
+
### Security
|
|
23
|
+
|
|
24
|
+
- Adopt Dependabot PR \#1046 pinned CodeQL 4.37.7 and TruffleHog 3.97.0 refresh ([pm-pp6al9](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/chores/pm-pp6al9.toon))
|
|
25
|
+
|
|
26
|
+
### Deprecated
|
|
27
|
+
|
|
28
|
+
- ADR: noun-verb CLI grammar — accepted consolidation principles and alias-preserving deprecation policy ([pm-pbyu](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/decisions/pm-pbyu.toon))
|
|
29
|
+
|
|
30
|
+
### Other
|
|
31
|
+
|
|
32
|
+
- Command-grammar conformance gate: the noun-verb table and shared verb vocabulary become machine-checked contracts a non-conforming command cannot pass ([pm-wt43zj](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/tasks/pm-wt43zj.toon))
|
|
33
|
+
- Consolidate the 8 list-\* status variants into pm list --status (list-all/open/draft/in-progress/blocked/closed/canceled become hidden aliases) ([pm-pfqi](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/tasks/pm-pfqi.toon))
|
|
34
|
+
- Command-destination census: 14 of 76 canonical commands have no declared home in the target grammar, so the surface can be frozen with its shape still undecided ([pm-yy8rmx](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/tasks/pm-yy8rmx.toon))
|
|
35
|
+
- Half of the pm events payload is per-row resume cursors an agent never reads: 48 percent of stream bytes buy a capability consumed once per batch ([pm-ez1dfg](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/tasks/pm-ez1dfg.toon))
|
|
36
|
+
|
|
3
37
|
## 2026.8.17 - 2026-08-17
|
|
4
38
|
|
|
5
39
|
### Added
|
|
@@ -37,7 +71,6 @@
|
|
|
37
71
|
- GH-1028: history-author-acknowledge bulk mutation lacks dry-run and misreports empty selection ([pm-mcxk8v](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/issues/pm-mcxk8v.toon))
|
|
38
72
|
- GH-1030: contracts --json --full is wholly omitted by the default output budget ([pm-2qvq7a](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/issues/pm-2qvq7a.toon))
|
|
39
73
|
- Auto Release blocker closure ignores successful recovery dispatch and reruns the stale tag-push workflow ([pm-db8onn](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/issues/pm-db8onn.toon))
|
|
40
|
-
- A commit pushed directly to the default branch can never be released: both analyzer-evidence fallbacks presuppose a pull request, and nothing declares that precondition ([pm-u1baah](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/issues/pm-u1baah.toon))
|
|
41
74
|
|
|
42
75
|
### Other
|
|
43
76
|
|
|
@@ -52,7 +85,6 @@
|
|
|
52
85
|
- Provide an audited repair and severity-migration contract for legacy invalid provenance ([pm-76fkpp](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/issues/pm-76fkpp.toon))
|
|
53
86
|
- Detect extension-host pm-cli version skew before a workspace reports healthy ([pm-643e0k](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/issues/pm-643e0k.toon))
|
|
54
87
|
- Restore strict unknown-key parity for docs linked-artifact additions ([pm-22rzjp](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/issues/pm-22rzjp.toon))
|
|
55
|
-
- Surface replication gate scopes trigger activation to relevant diff content ([pm-mrhwow](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/issues/pm-mrhwow.toon))
|
|
56
88
|
- Make every failing health verdict self-indexing and attach gate severity to findings ([pm-larv4r](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/issues/pm-larv4r.toon))
|
|
57
89
|
- GH-1004: history-repair remains writer-version-specific across 2026.8.7 and 2026.8.13 ([pm-igdvfq](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/issues/pm-igdvfq.toon))
|
|
58
90
|
- Assurance gates preserve zero-valued counts and report actionable source failures ([pm-xmmafu](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/issues/pm-xmmafu.toon))
|
|
@@ -969,10 +1001,10 @@
|
|
|
969
1001
|
|
|
970
1002
|
### Fixed
|
|
971
1003
|
|
|
1004
|
+
- Sentry no longer captures deliberate Ctrl+C/Ctrl+D interrupts as error-level events (AbortError, PM-CLI-27) ([pm-ksv2](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/issues/pm-ksv2.toon))
|
|
972
1005
|
- pm get --full omits children for Plan parents while pm list --parent returns them ([pm-y4z5](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/issues/pm-y4z5.toon))
|
|
973
1006
|
- Intentional package CommandError outcomes create high-severity Sentry issues (PM-CLI-16) ([pm-7071](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/issues/pm-7071.toon))
|
|
974
1007
|
- Extension install self-copy guard: reject source-inside-destination layouts before fs.cp EINVAL (PM-CLI-28) ([pm-8myl](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/issues/pm-8myl.toon))
|
|
975
|
-
- Sentry captures deliberate Ctrl+C interrupts as error-level events (AbortError, PM-CLI-27) ([pm-ksv2](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/issues/pm-ksv2.toon))
|
|
976
1008
|
- Torn-install bundle transients block scheduled releases: boot-time chunk-integrity self-check + distinct error code for gate classification ([pm-wfvq](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/issues/pm-wfvq.toon))
|
|
977
1009
|
- GH-446: pm get omits schedule facet (events/start_at/end_at/location) for Meeting/Event/Reminder ([pm-x1g5](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/issues/pm-x1g5.toon))
|
|
978
1010
|
- GH-533: create/update accept empty --title — required-title contract inconsistent between omitted and empty string ([pm-7je0](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/issues/pm-7je0.toon))
|
package/README.md
CHANGED
|
@@ -84,7 +84,7 @@ pm create \
|
|
|
84
84
|
--ac "Restore succeeds after stale lock cleanup and has regression coverage." \
|
|
85
85
|
--create-mode progressive
|
|
86
86
|
|
|
87
|
-
pm list
|
|
87
|
+
pm list --status open --limit 10
|
|
88
88
|
pm claim <item-id>
|
|
89
89
|
pm update <item-id> --status in_progress --message "Start implementation"
|
|
90
90
|
pm files <item-id> --add path=src/core/lock/lock.ts
|
|
@@ -102,8 +102,8 @@ Use `pm next` to get the single highest-priority ready item (and why), or `pm co
|
|
|
102
102
|
pm next # the next actionable item + rationale, ready/blocked queues
|
|
103
103
|
pm context --limit 10
|
|
104
104
|
pm search "keywords for the requested work" --limit 10
|
|
105
|
-
pm list
|
|
106
|
-
pm list
|
|
105
|
+
pm list --status open --limit 20
|
|
106
|
+
pm list --status in_progress --limit 20
|
|
107
107
|
```
|
|
108
108
|
|
|
109
109
|
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).
|
|
@@ -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]="763daf66-1309-50bc-8783-8c232e4d690d")}catch(e){}}();
|
|
3
3
|
import { resolveRecoveryCommandName } from "../sdk/agent/command-recovery.js";
|
|
4
4
|
import { renderPmCommand } from "./argv-utils.js";
|
|
5
5
|
import { discoverNearbyPmRoot } from "../sdk/tracker-root-discovery.js";
|
|
@@ -483,7 +483,7 @@ function buildItemNotFoundGuidance(rawMessage, message, context) {
|
|
|
483
483
|
const nextSteps = isPlaceholder
|
|
484
484
|
? [
|
|
485
485
|
"Check that the variable holding the item ID is defined before passing it to pm.",
|
|
486
|
-
'Use "pm list
|
|
486
|
+
'Use "pm list --status open --limit 20" to find valid IDs.',
|
|
487
487
|
]
|
|
488
488
|
: ["Confirm the active --path/PM_PATH scope, then retry with a valid id."];
|
|
489
489
|
return applyPmCliErrorContext(makeGuidanceMessage({
|
|
@@ -492,7 +492,10 @@ function buildItemNotFoundGuidance(rawMessage, message, context) {
|
|
|
492
492
|
happened,
|
|
493
493
|
required: "Use an existing item ID from current tracker data.",
|
|
494
494
|
why: "Mutation and read commands operate only on known IDs.",
|
|
495
|
-
examples: [
|
|
495
|
+
examples: [
|
|
496
|
+
"pm list --status open --limit 20",
|
|
497
|
+
'pm search "<keyword>" --limit 10',
|
|
498
|
+
],
|
|
496
499
|
nextSteps,
|
|
497
500
|
}), rawMessage, context);
|
|
498
501
|
}
|
|
@@ -1237,4 +1240,4 @@ export const _testOnly = {
|
|
|
1237
1240
|
resolveKnownPackageCommandHint,
|
|
1238
1241
|
};
|
|
1239
1242
|
//# sourceMappingURL=error-guidance.js.map
|
|
1240
|
-
//# debugId=
|
|
1243
|
+
//# debugId=763daf66-1309-50bc-8783-8c232e4d690d
|
|
@@ -1,10 +1,11 @@
|
|
|
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]="
|
|
3
|
-
import { EXIT_CODE, PmCliError, renderRowsAsCsv, renderRowsAsTable, } from "../sdk/runtime-primitives.js";
|
|
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]="7bcf441b-e211-535f-9502-5624add292e5")}catch(e){}}();
|
|
3
|
+
import { EXIT_CODE, PmCliError, readSettings, renderRowsAsCsv, renderRowsAsTable, resolvePmRoot, } from "../sdk/runtime-primitives.js";
|
|
4
|
+
import { renderPmCommandAliasMigrationHint, resolvePmCommandAlias, } from "../sdk/cli-contracts.js";
|
|
4
5
|
import { EVAL_QUERY_SET_SCHEMA_ID } from "../sdk/eval.js";
|
|
5
6
|
import { applyContextIntentProjection } from "../sdk/context-intent-contracts.js";
|
|
6
|
-
import { serializeNdjsonRows } from "../sdk/output.js";
|
|
7
|
-
import { listMutationEvents, subscribeMutationEvents, } from "../sdk/mutation-events.js";
|
|
7
|
+
import { serializeNdjsonRows, serializeNdjsonStream, } from "../sdk/output.js";
|
|
8
|
+
import { listMutationEvents, subscribeMutationEventBatches, subscribeMutationEvents, } from "../sdk/mutation-events.js";
|
|
8
9
|
import { runActivity } from "./commands/activity.js";
|
|
9
10
|
import { runAggregate } from "./commands/aggregate.js";
|
|
10
11
|
import { renderContextMarkdown, runContext, resolveContextOutputFormat, } from "./commands/context.js";
|
|
@@ -103,6 +104,14 @@ function registerContentAndGovernanceFilters(command) {
|
|
|
103
104
|
.option("--filter-sprint-missing", "Show only items missing sprint")
|
|
104
105
|
.option("--filter-release-missing", "Show only items missing release");
|
|
105
106
|
}
|
|
107
|
+
const CANONICAL_LIST_STATUS_VARIANTS = {
|
|
108
|
+
draft: { name: "list-draft", dependencyBlocked: false },
|
|
109
|
+
open: { name: "list-open", dependencyBlocked: false },
|
|
110
|
+
in_progress: { name: "list-in-progress", dependencyBlocked: false },
|
|
111
|
+
blocked: { name: "list-blocked", dependencyBlocked: true },
|
|
112
|
+
closed: { name: "list-closed", dependencyBlocked: false },
|
|
113
|
+
canceled: { name: "list-canceled", dependencyBlocked: false },
|
|
114
|
+
};
|
|
106
115
|
/** Resolve and validate the mutually exclusive list rendering modes. */
|
|
107
116
|
function resolveRegisteredListOutputContext(options, globalOptions) {
|
|
108
117
|
const streamMode = options.stream === true;
|
|
@@ -146,39 +155,63 @@ function renderRegisteredListResult(commandName, result, output) {
|
|
|
146
155
|
}
|
|
147
156
|
}
|
|
148
157
|
async function runRegisteredListCommand(params) {
|
|
149
|
-
const
|
|
158
|
+
const parsedGlobalOptions = getGlobalOptions(params.actionCommand);
|
|
159
|
+
const globalOptions = params.aliasContract
|
|
160
|
+
? { ...parsedGlobalOptions, command: params.aliasContract.canonical }
|
|
161
|
+
: parsedGlobalOptions;
|
|
150
162
|
const startedAt = Date.now();
|
|
151
|
-
if (params.
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
"pm list-all --no-truncate",
|
|
157
|
-
],
|
|
158
|
-
});
|
|
163
|
+
if (params.aliasContract?.lifecycle === "deprecated") {
|
|
164
|
+
const deprecationHints = await readSettings(resolvePmRoot(process.cwd(), globalOptions.path)).then((settings) => settings.ux.deprecation_hints);
|
|
165
|
+
if (deprecationHints) {
|
|
166
|
+
printError(renderPmCommandAliasMigrationHint(params.aliasContract));
|
|
167
|
+
}
|
|
159
168
|
}
|
|
160
169
|
const intentOptions = applyContextIntentProjection("list", params.options);
|
|
161
170
|
const listOptions = normalizeListOptions(intentOptions);
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
171
|
+
let effectiveName = params.name;
|
|
172
|
+
let effectiveStatus = params.status;
|
|
173
|
+
let effectiveDependencyBlocked = params.dependencyBlocked === true;
|
|
174
|
+
let effectiveExcludeTerminal = params.excludeTerminal === true;
|
|
175
|
+
const requestedStatus = listOptions.status?.trim().toLowerCase();
|
|
176
|
+
const requestedVariant = params.name === "list" && requestedStatus !== undefined
|
|
177
|
+
? CANONICAL_LIST_STATUS_VARIANTS[requestedStatus]
|
|
178
|
+
: undefined;
|
|
179
|
+
if (params.name === "list") {
|
|
180
|
+
if (params.options.all === true || requestedStatus === "all") {
|
|
181
|
+
effectiveName = "list-all";
|
|
182
|
+
effectiveExcludeTerminal = false;
|
|
183
|
+
listOptions.status = undefined;
|
|
184
|
+
}
|
|
185
|
+
else if (requestedStatus !== undefined && requestedVariant !== undefined) {
|
|
186
|
+
effectiveName = requestedVariant.name;
|
|
187
|
+
effectiveStatus = requestedStatus;
|
|
188
|
+
effectiveDependencyBlocked = requestedVariant.dependencyBlocked;
|
|
189
|
+
effectiveExcludeTerminal = false;
|
|
190
|
+
listOptions.status = undefined;
|
|
191
|
+
}
|
|
167
192
|
}
|
|
168
|
-
listOptions
|
|
193
|
+
applyDefaultListProjection(listOptions, effectiveName);
|
|
194
|
+
if (effectiveExcludeTerminal)
|
|
195
|
+
listOptions.excludeTerminal = true;
|
|
196
|
+
listOptions.dependencyBlocked = effectiveDependencyBlocked;
|
|
169
197
|
const output = resolveRegisteredListOutputContext(intentOptions, globalOptions);
|
|
170
|
-
const result = await runList(
|
|
171
|
-
renderRegisteredListResult(
|
|
198
|
+
const result = await runList(effectiveDependencyBlocked ? undefined : effectiveStatus, listOptions, globalOptions);
|
|
199
|
+
renderRegisteredListResult("list", result, output);
|
|
172
200
|
if (globalOptions.profile) {
|
|
173
|
-
printError(`profile:command
|
|
201
|
+
printError(`profile:command=list took_ms=${Date.now() - startedAt}`);
|
|
174
202
|
}
|
|
175
203
|
}
|
|
176
204
|
function registerListCommand(program, descriptor) {
|
|
177
|
-
const { name, description, status, excludeTerminal, allowStatusFilter, dependencyBlocked, } = descriptor;
|
|
178
|
-
const command = program
|
|
205
|
+
const { name, description, status, excludeTerminal, allowStatusFilter, dependencyBlocked, aliasContract, } = descriptor;
|
|
206
|
+
const command = program
|
|
207
|
+
.command(name, { hidden: aliasContract?.hidden === true })
|
|
208
|
+
.description(description);
|
|
179
209
|
if (allowStatusFilter) {
|
|
180
210
|
command.option("--status <value>", "Filter by status (repeatable or comma-separated; matches any; all selects every status)", collect);
|
|
181
211
|
}
|
|
212
|
+
if (name === "list") {
|
|
213
|
+
command.option("--all", "Include every lifecycle status");
|
|
214
|
+
}
|
|
182
215
|
command
|
|
183
216
|
.option("--for <intent>", "Apply a declared context intent projection")
|
|
184
217
|
.option("--token-budget <n>", "Override the selected intent's maximum estimated output tokens")
|
|
@@ -228,6 +261,7 @@ function registerListCommand(program, descriptor) {
|
|
|
228
261
|
dependencyBlocked,
|
|
229
262
|
options,
|
|
230
263
|
actionCommand,
|
|
264
|
+
aliasContract,
|
|
231
265
|
});
|
|
232
266
|
});
|
|
233
267
|
// Hidden pure snake_case underscore-duplicate alias (kept parse-functional).
|
|
@@ -235,7 +269,6 @@ function registerListCommand(program, descriptor) {
|
|
|
235
269
|
addHiddenOption(command, "--assignee_filter <value>", "Alias for --assignee-filter");
|
|
236
270
|
addHiddenOption(command, "--tree_depth <n>", "Alias for --tree-depth");
|
|
237
271
|
addHiddenOption(command, "--token_budget <n>", "Alias for --token-budget");
|
|
238
|
-
addHiddenOption(command, "--all", "Removed ambiguous alias; emits migration guidance");
|
|
239
272
|
// Singular alias so `--filter-estimate-missing` works (matches update-many spelling).
|
|
240
273
|
addHiddenOption(command, "--filter-estimate-missing", "Alias for --filter-estimates-missing");
|
|
241
274
|
}
|
|
@@ -411,6 +444,13 @@ function buildMutationEventOptions(options, pmRoot) {
|
|
|
411
444
|
const harness = readRepeatableStringOption(options, "harness");
|
|
412
445
|
const agentInstance = readRepeatableStringOption(options, "agentInstance");
|
|
413
446
|
const provenanceFilter = readRepeatableStringOption(options, "provenanceFilter");
|
|
447
|
+
const rawCursorMode = typeof options.cursorMode === "string" ? options.cursorMode : undefined;
|
|
448
|
+
if (rawCursorMode !== undefined &&
|
|
449
|
+
rawCursorMode !== "batch" &&
|
|
450
|
+
rawCursorMode !== "row") {
|
|
451
|
+
throw new PmCliError("Events --cursor-mode must be batch or row.", EXIT_CODE.USAGE, { code: "invalid_event_cursor_mode" });
|
|
452
|
+
}
|
|
453
|
+
const cursorMode = rawCursorMode;
|
|
414
454
|
return {
|
|
415
455
|
pmRoot,
|
|
416
456
|
since: typeof options.since === "string" ? options.since : undefined,
|
|
@@ -426,42 +466,76 @@ function buildMutationEventOptions(options, pmRoot) {
|
|
|
426
466
|
...(harness === undefined ? {} : { harness }),
|
|
427
467
|
...(agentInstance === undefined ? {} : { agentInstance }),
|
|
428
468
|
...(provenanceFilter === undefined ? {} : { provenanceFilter }),
|
|
469
|
+
cursorMode,
|
|
429
470
|
};
|
|
430
471
|
}
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
? Number(options.intervalMs)
|
|
441
|
-
: undefined;
|
|
472
|
+
/** Follows mutation events using either compatibility row cursors or the default batch-boundary trailer contract. */
|
|
473
|
+
async function followMutationEvents(eventOptions, options, quiet) {
|
|
474
|
+
if (options.provenanceSummary === true) {
|
|
475
|
+
throw new PmCliError("Events --provenance-summary is bounded to one page and cannot be combined with --follow.", EXIT_CODE.USAGE);
|
|
476
|
+
}
|
|
477
|
+
const intervalMs = typeof options.intervalMs === "string"
|
|
478
|
+
? Number(options.intervalMs)
|
|
479
|
+
: undefined;
|
|
480
|
+
if (eventOptions.cursorMode === "row") {
|
|
442
481
|
for await (const event of subscribeMutationEvents({
|
|
443
482
|
...eventOptions,
|
|
444
483
|
intervalMs,
|
|
445
484
|
})) {
|
|
446
|
-
if (!
|
|
485
|
+
if (!quiet) {
|
|
447
486
|
writeStdout(`${JSON.stringify(event)}\n`);
|
|
448
487
|
}
|
|
449
488
|
}
|
|
450
489
|
return;
|
|
451
490
|
}
|
|
491
|
+
for await (const page of subscribeMutationEventBatches({
|
|
492
|
+
...eventOptions,
|
|
493
|
+
intervalMs,
|
|
494
|
+
})) {
|
|
495
|
+
if (!quiet) {
|
|
496
|
+
writeStdout(`${serializeNdjsonStream(page.events, {
|
|
497
|
+
count: page.count,
|
|
498
|
+
has_more: page.has_more,
|
|
499
|
+
next_cursor: page.next_cursor ?? null,
|
|
500
|
+
source: page.source,
|
|
501
|
+
heartbeat: page.count === 0,
|
|
502
|
+
})}\n`);
|
|
503
|
+
}
|
|
504
|
+
}
|
|
505
|
+
}
|
|
506
|
+
/** Serializes one bounded mutation-event page using its declared row or batch cursor mode. */
|
|
507
|
+
function renderMutationEventPage(page) {
|
|
508
|
+
if (page.cursor_mode === "row") {
|
|
509
|
+
return serializeNdjsonRows(page.events);
|
|
510
|
+
}
|
|
511
|
+
return serializeNdjsonStream(page.events, {
|
|
512
|
+
count: page.count,
|
|
513
|
+
has_more: page.has_more,
|
|
514
|
+
next_cursor: page.next_cursor ?? null,
|
|
515
|
+
source: page.source,
|
|
516
|
+
...(page.provenance_summary === undefined
|
|
517
|
+
? {}
|
|
518
|
+
: { provenance_summary: page.provenance_summary }),
|
|
519
|
+
});
|
|
520
|
+
}
|
|
521
|
+
async function runEventsAction(options, command) {
|
|
522
|
+
const globalOptions = getGlobalOptions(command);
|
|
523
|
+
const startedAt = Date.now();
|
|
524
|
+
const eventOptions = buildMutationEventOptions(options, globalOptions.path);
|
|
525
|
+
if (options.follow === true) {
|
|
526
|
+
await followMutationEvents(eventOptions, options, globalOptions.quiet === true);
|
|
527
|
+
return;
|
|
528
|
+
}
|
|
452
529
|
const page = await listMutationEvents(eventOptions);
|
|
453
530
|
setActiveCommandResult(page);
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
},
|
|
463
|
-
]),
|
|
464
|
-
]);
|
|
531
|
+
if (globalOptions.json) {
|
|
532
|
+
printResult(page, globalOptions);
|
|
533
|
+
if (globalOptions.profile) {
|
|
534
|
+
printError(`profile:command=events took_ms=${Date.now() - startedAt}`);
|
|
535
|
+
}
|
|
536
|
+
return;
|
|
537
|
+
}
|
|
538
|
+
const rendered = renderMutationEventPage(page);
|
|
465
539
|
if (!globalOptions.quiet && rendered.length > 0) {
|
|
466
540
|
writeStdout(`${rendered}\n`);
|
|
467
541
|
}
|
|
@@ -530,7 +604,7 @@ export function registerListQueryCommands(program, options) {
|
|
|
530
604
|
const listCommandDescriptors = [
|
|
531
605
|
{
|
|
532
606
|
name: "list",
|
|
533
|
-
description: "List items
|
|
607
|
+
description: "List active items with optional lifecycle-status and project filters.",
|
|
534
608
|
excludeTerminal: true,
|
|
535
609
|
allowStatusFilter: true,
|
|
536
610
|
},
|
|
@@ -579,7 +653,13 @@ export function registerListQueryCommands(program, options) {
|
|
|
579
653
|
];
|
|
580
654
|
for (const descriptor of listCommandDescriptors) {
|
|
581
655
|
if (shouldRegister(descriptor.name)) {
|
|
582
|
-
|
|
656
|
+
const aliasContract = resolvePmCommandAlias(descriptor.name);
|
|
657
|
+
registerListCommand(program, {
|
|
658
|
+
...descriptor,
|
|
659
|
+
...(aliasContract?.registration === "commander"
|
|
660
|
+
? { aliasContract }
|
|
661
|
+
: {}),
|
|
662
|
+
});
|
|
583
663
|
}
|
|
584
664
|
}
|
|
585
665
|
if (shouldRegister("aggregate")) {
|
|
@@ -775,6 +855,7 @@ export function registerListQueryCommands(program, options) {
|
|
|
775
855
|
.option("--author <value>", "Filter by mutation author (repeatable or comma-separated)", collect)
|
|
776
856
|
.option("--item <value>", "Filter by item or workspace stream id (repeatable or comma-separated)", collect)
|
|
777
857
|
.option("--limit <n>", "Return at most 1,000 events (default: 100)")
|
|
858
|
+
.option("--cursor-mode <mode>", "Cursor framing: batch emits one terminal trailer (default); row preserves one cursor per event")
|
|
778
859
|
.option("--full", "Include each complete authoritative history entry")
|
|
779
860
|
.option("--provenance", "Include patch-free author, harness, instance, and extensible provenance")
|
|
780
861
|
.option("--provenance-summary", "Include bounded provenance completeness counts")
|
|
@@ -838,4 +919,4 @@ export const _testOnlyRegisterListQuery = {
|
|
|
838
919
|
parseListFormat,
|
|
839
920
|
};
|
|
840
921
|
//# sourceMappingURL=register-list-query.js.map
|
|
841
|
-
//# debugId=
|
|
922
|
+
//# debugId=7bcf441b-e211-535f-9502-5624add292e5
|