@unbrained/pm-cli 2026.10.19 → 2026.10.21
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 +1 -1
- package/CHANGELOG.md +58 -0
- package/dist/cli/error-guidance.d.ts +15 -0
- package/dist/cli/error-guidance.js +2 -2
- package/dist/cli/main.js +1 -1
- package/dist/cli/register-list-query.js +2 -2
- package/dist/cli/register-operations.js +1 -1
- package/dist/cli/register-structured-mutation.js +1 -1
- package/dist/cli-bundle/bundle-manifest.json +1 -1
- package/dist/cli-bundle/chunks/{chunk-4MJ6WBMA.js → chunk-2B5HAZFK.js} +2 -2
- package/dist/cli-bundle/chunks/chunk-4D25HF3V.js +2 -0
- package/dist/cli-bundle/chunks/{chunk-LBEMB3BW.js → chunk-4OYU5OXQ.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-4XFVAXA4.js → chunk-5PZ7JNMI.js} +2 -2
- package/dist/cli-bundle/chunks/chunk-C6SAXKBO.js +3 -0
- package/dist/cli-bundle/chunks/chunk-DIKQ2AL5.js +2 -0
- package/dist/cli-bundle/chunks/chunk-DIR3YEFD.js +2 -0
- package/dist/cli-bundle/chunks/{chunk-O2ZRRLAP.js → chunk-DJQVNDXO.js} +3 -3
- package/dist/cli-bundle/chunks/chunk-DR6DUBTU.js +30 -0
- package/dist/cli-bundle/chunks/{chunk-5GZSX5HU.js → chunk-EMGMLKRV.js} +47 -47
- package/dist/cli-bundle/chunks/chunk-GWIGZDRS.js +3 -0
- package/dist/cli-bundle/chunks/chunk-IB7UB5TE.js +2 -0
- package/dist/cli-bundle/chunks/{chunk-QG4LMU7A.js → chunk-KBSVPUFD.js} +46 -45
- package/dist/cli-bundle/chunks/{chunk-NX7Q4LGN.js → chunk-MOC5BJHW.js} +2 -2
- package/dist/cli-bundle/chunks/chunk-MZZIAC6S.js +20 -0
- package/dist/cli-bundle/chunks/{chunk-DMFM5R4G.js → chunk-NNB65OOO.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-D3EDNAN7.js → chunk-QPV6UD55.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-6DS5CAN2.js → chunk-TMXWWOPJ.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-H3XYP24A.js → chunk-V3XONSVC.js} +2 -2
- package/dist/cli-bundle/chunks/chunk-V5GJTXYW.js +126 -0
- package/dist/cli-bundle/chunks/chunk-XAWE4EAK.js +2 -0
- package/dist/cli-bundle/chunks/{chunk-XH7C3A5N.js → chunk-ZNKFMIVA.js} +6 -6
- package/dist/cli-bundle/chunks/context-budget-recovery-L2WP5S26.js +2 -0
- package/dist/cli-bundle/{focused-chunks/indexed-receipt-blobs-QW2VWWJE.js → chunks/indexed-receipt-blobs-65XXSPPR.js} +2 -2
- package/dist/cli-bundle/chunks/mutation-admission-FNWOVJLN.js +2 -0
- package/dist/cli-bundle/chunks/{register-list-query-WQUVDJIH.js → register-list-query-6PT5Y2EZ.js} +5 -5
- package/dist/cli-bundle/chunks/{register-mutation-IWIBQIO3.js → register-mutation-TAIQV46L.js} +4 -4
- package/dist/cli-bundle/chunks/register-operations-ONIRO22G.js +2 -0
- package/dist/cli-bundle/chunks/register-setup-OQMUZBJV.js +2 -0
- package/dist/cli-bundle/chunks/{settlement-hook-UNFMCKKQ.js → settlement-hook-UVFYSBMU.js} +2 -2
- package/dist/cli-bundle/chunks/stage-FCPVFO3B.js +2 -0
- package/dist/cli-bundle/focused-chunks/chunk-32ZKLRWM.js +2 -0
- package/dist/cli-bundle/focused-chunks/{chunk-3TEIACFU.js → chunk-3LWH2RJC.js} +3 -3
- package/dist/cli-bundle/focused-chunks/{chunk-OV2WVLUR.js → chunk-44353U27.js} +2 -2
- package/dist/cli-bundle/focused-chunks/chunk-4HJVAUFX.js +2 -0
- package/dist/cli-bundle/focused-chunks/{chunk-SKYLOPU2.js → chunk-5IMM7GOF.js} +2 -2
- package/dist/cli-bundle/focused-chunks/{chunk-JBJJW2WL.js → chunk-6QSZHRM7.js} +2 -2
- package/dist/cli-bundle/focused-chunks/chunk-7UD7XTOE.js +12 -0
- package/dist/cli-bundle/focused-chunks/{chunk-H6BVQ63U.js → chunk-CUWNNU4N.js} +2 -2
- package/dist/cli-bundle/focused-chunks/chunk-E2S42XCT.js +2 -0
- package/dist/cli-bundle/focused-chunks/chunk-GHQVM6K6.js +2 -0
- package/dist/cli-bundle/focused-chunks/chunk-GRSQGMRR.js +2 -0
- package/dist/cli-bundle/focused-chunks/{chunk-HYMYAGSY.js → chunk-HNCMYF2W.js} +2 -2
- package/dist/cli-bundle/focused-chunks/{chunk-WZTEFFQI.js → chunk-IAGFXKMZ.js} +2 -2
- package/dist/cli-bundle/focused-chunks/chunk-JI3RXXRN.js +78 -0
- package/dist/cli-bundle/focused-chunks/chunk-JMZPZQHR.js +26 -0
- package/dist/cli-bundle/focused-chunks/{chunk-RLRMNFLF.js → chunk-KVYUQS6Y.js} +2 -2
- package/dist/cli-bundle/focused-chunks/chunk-O3M6YWVL.js +2 -0
- package/dist/cli-bundle/focused-chunks/chunk-P5D7MHDS.js +20 -0
- package/dist/cli-bundle/focused-chunks/chunk-PDOWLRHC.js +8 -0
- package/dist/cli-bundle/focused-chunks/chunk-SVOOGGAK.js +2 -0
- package/dist/cli-bundle/focused-chunks/chunk-T27TLSEU.js +65 -0
- package/dist/cli-bundle/focused-chunks/{chunk-GWTV45SB.js → chunk-VD64TPXI.js} +2 -2
- package/dist/cli-bundle/focused-chunks/{chunk-JDBO7SMR.js → chunk-VE6MTRH5.js} +2 -2
- package/dist/cli-bundle/focused-chunks/chunk-XE7P7N5X.js +8 -0
- package/dist/cli-bundle/focused-chunks/chunk-YIWDX6KO.js +91 -0
- package/dist/cli-bundle/focused-chunks/context-budget-recovery-5MKOCGY5.js +2 -0
- package/dist/cli-bundle/{chunks/indexed-receipt-blobs-BVSHK4WQ.js → focused-chunks/indexed-receipt-blobs-CRP6HAZY.js} +2 -2
- package/dist/cli-bundle/focused-chunks/mutation-admission-KM57KDDF.js +2 -0
- package/dist/cli-bundle/focused-chunks/{settlement-hook-X4FNHTOD.js → settlement-hook-MNCHFCAX.js} +2 -2
- package/dist/cli-bundle/focused-chunks/stage-UJYGWNZ7.js +2 -0
- package/dist/cli-bundle/main.js +21 -21
- 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 +23 -23
- 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 +58 -57
- 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 +8 -8
- package/dist/core/fs/fs-utils.d.ts +2 -2
- package/dist/core/fs/fs-utils.js +1 -1
- package/dist/core/history/event-index.js +2 -2
- package/dist/core/item/actionability.js +1 -1
- package/dist/core/lock/lock-gc.d.ts +12 -5
- package/dist/core/lock/lock-gc.js +1 -1
- package/dist/core/lock/lock-owner.d.ts +33 -0
- package/dist/core/lock/lock-owner.js +2 -0
- package/dist/core/lock/lock.d.ts +11 -22
- package/dist/core/lock/lock.js +4 -3
- package/dist/core/output/output.d.ts +7 -2
- package/dist/core/output/output.js +5 -5
- package/dist/core/shared/errors.d.ts +50 -0
- package/dist/core/shared/errors.js +1 -1
- package/dist/core/store/settings.js +2 -2
- package/dist/mcp/server.js +1 -1
- package/dist/sdk/cli-contracts/runtime-contracts.js +1 -1
- package/dist/sdk/core.d.ts +1 -1
- package/dist/sdk/core.js +1 -1
- package/dist/sdk/dependencies/context-budget-recovery.d.ts +21 -0
- package/dist/sdk/dependencies/context-budget-recovery.js +2 -0
- package/dist/sdk/dependencies.js +1 -1
- package/dist/sdk/errors.d.ts +4 -1
- package/dist/sdk/errors.js +1 -1
- package/dist/sdk/extension-command-context.js +2 -2
- package/dist/sdk/generated/generated-error-code-catalog-part-1.js +1 -1
- package/dist/sdk/governance/assurance-action.js +1 -1
- package/dist/sdk/governance/assurance.js +1 -1
- package/dist/sdk/governance/health.js +2 -2
- package/dist/sdk/index.d.ts +1 -1
- package/dist/sdk/index.js +1 -1
- package/dist/sdk/item-transaction.d.ts +13 -0
- package/dist/sdk/item-transaction.js +1 -1
- package/dist/sdk/lifecycle/structured-mutation-plan.d.ts +14 -1
- package/dist/sdk/lifecycle/structured-mutation-plan.js +1 -1
- package/dist/sdk/output/list-envelope.d.ts +7 -0
- package/dist/sdk/output/list-envelope.js +2 -0
- package/dist/sdk/output.d.ts +1 -0
- package/dist/sdk/output.js +2 -2
- package/dist/sdk/pagination.d.ts +3 -3
- package/dist/sdk/pagination.js +1 -1
- package/dist/sdk/public-surface.json +1 -1
- package/dist/sdk/query/context.js +2 -2
- package/dist/sdk/query/list.d.ts +2 -0
- package/dist/sdk/query/list.js +1 -1
- package/dist/sdk/query/projection-contracts.d.ts +1 -1
- package/dist/sdk/query/projection-contracts.js +1 -1
- package/dist/sdk/relationship-context.d.ts +2 -0
- package/dist/sdk/relationship-context.js +1 -1
- package/dist/sdk/runtime/mutation-admission.d.ts +2 -0
- package/dist/sdk/runtime/mutation-admission.js +2 -0
- package/dist/sdk/runtime-input.d.ts +2 -0
- package/dist/sdk/runtime-input.js +1 -1
- package/dist/sdk/runtime.js +1 -1
- package/dist/sdk/structured-mutations.d.ts +2 -0
- package/dist/sdk/structured-mutations.js +1 -1
- package/dist/sdk/test/execution.d.ts +1 -0
- package/dist/sdk/test/execution.js +2 -2
- package/docs/AGENT_RUNTIME_PRIMITIVES.md +9 -0
- package/docs/ASSURANCE.md +17 -2
- package/docs/COMMANDS.md +31 -3
- package/docs/CONFIGURATION.md +29 -0
- package/docs/CONTEXT_RELEVANCE.md +15 -0
- package/docs/DEVELOPMENT_DEPENDENCY_SECURITY.md +26 -3
- package/docs/PR_REVIEW_LOOP.md +32 -12
- package/docs/SCRIPTING.md +10 -0
- package/docs/SDK.md +144 -0
- package/docs/TESTING.md +43 -1
- package/docs/agent-task-token-baseline.json +1 -1
- package/marketplace.json +1 -1
- package/package.json +1 -1
- 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-claude/package.json +1 -1
- package/plugins/pm-codex/.codex-plugin/plugin.json +1 -1
- package/plugins/pm-codex/package.json +1 -1
- package/plugins/pm-codex/plugin.json +1 -1
- package/runtime-dependencies.json +1 -1
- package/dist/cli-bundle/chunks/chunk-4CXQSRSP.js +0 -126
- package/dist/cli-bundle/chunks/chunk-4ICKT4GH.js +0 -3
- package/dist/cli-bundle/chunks/chunk-OEJ3G7XT.js +0 -20
- package/dist/cli-bundle/chunks/chunk-QBNEZII5.js +0 -30
- package/dist/cli-bundle/chunks/chunk-QKAAZWGC.js +0 -3
- package/dist/cli-bundle/chunks/chunk-TK3G3GAP.js +0 -2
- package/dist/cli-bundle/chunks/register-operations-SUWOZNDU.js +0 -2
- package/dist/cli-bundle/chunks/register-setup-QGM5YJW7.js +0 -2
- package/dist/cli-bundle/chunks/stage-7DELI4Z5.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-2IEWB6MB.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-5YTOYBTZ.js +0 -65
- package/dist/cli-bundle/focused-chunks/chunk-BJMPRB7A.js +0 -91
- package/dist/cli-bundle/focused-chunks/chunk-ENZMATOY.js +0 -20
- package/dist/cli-bundle/focused-chunks/chunk-EOQ6W25I.js +0 -8
- package/dist/cli-bundle/focused-chunks/chunk-FEN7WOOP.js +0 -12
- package/dist/cli-bundle/focused-chunks/chunk-JCLC6HKT.js +0 -8
- package/dist/cli-bundle/focused-chunks/chunk-KLJN44VY.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-L4PL3GZR.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-PXDR77TO.js +0 -78
- package/dist/cli-bundle/focused-chunks/chunk-Y54ONBEX.js +0 -25
- package/dist/cli-bundle/focused-chunks/stage-MZSVQYO4.js +0 -2
package/docs/PR_REVIEW_LOOP.md
CHANGED
|
@@ -15,6 +15,7 @@ capture, avoiding repeated diff hunks that are irrelevant to marker matching.
|
|
|
15
15
|
```bash
|
|
16
16
|
node scripts/reviews/pr-review-loop.mjs inventory --pr 123 > /tmp/pr-123-review-inventory.json
|
|
17
17
|
node scripts/reviews/pr-review-loop.mjs watch --pr 123 --interval 30 > /tmp/pr-123-review-inventory.json
|
|
18
|
+
node scripts/reviews/pr-review-loop.mjs watch --pr 123 --phase reviews --interval 30 > /tmp/pr-123-full-review-inventory.json
|
|
18
19
|
node scripts/reviews/pr-review-loop.mjs react --node-id IC_kw... --reaction THUMBS_UP
|
|
19
20
|
node scripts/reviews/pr-review-loop.mjs acknowledge --pr 123 --node-id PRR_kw... --revision '<revision>' --reaction THUMBS_UP --body "CodeRabbit feedback implemented: https://github.com/owner/repo/pull/123#pullrequestreview-456. The suggested edge case is covered by test X."
|
|
20
21
|
node scripts/reviews/pr-review-loop.mjs reply-inline --pr 123 --comment-id 456 --body "Addressed in abc123."
|
|
@@ -43,17 +44,34 @@ markers then distinguish revised feedback and suppress duplicate retry replies
|
|
|
43
44
|
for that same revision. Inline markers are matched only within the selected
|
|
44
45
|
reply thread. Legacy calls without the flag retain their existing behavior.
|
|
45
46
|
|
|
46
|
-
After every push or reviewer retrigger, run `watch`.
|
|
47
|
-
`gh pr checks --watch`,
|
|
48
|
-
|
|
49
|
-
|
|
47
|
+
After every push or reviewer retrigger, run `watch`. Its default `checks` phase
|
|
48
|
+
delegates waiting to `gh pr checks --watch --fail-fast`, returning the complete
|
|
49
|
+
exact-head conversation inventory as soon as a check fails, even while an optional
|
|
50
|
+
reviewer remains pending. Fix that failure before starting another wait. Use
|
|
51
|
+
`--phase reviews` for the separate blocking review-completion phase: it delegates
|
|
52
|
+
to `gh pr checks --watch` without fail-fast and waits for every emitted check.
|
|
53
|
+
Both phases record `pendingChecks` and `unavailableChecks` from the final rollup,
|
|
54
|
+
including names, states, URLs and whether each context is required. Neutral,
|
|
55
|
+
skipped, canceled and other unavailable signals do not establish review approval;
|
|
56
|
+
inspect the retained conversations for provider quota or service limitations.
|
|
57
|
+
Pending checks prevent a successful receipt even if GitHub reports `CLEAN`.
|
|
58
|
+
This behavior is tracked by [pm-jm7m3o](../.agents/pm/tasks/pm-jm7m3o.toon).
|
|
59
|
+
Native watch success covers emitted checks only: a required provider may
|
|
50
60
|
never emit its context. The helper unions classic branch-protection requirements
|
|
51
|
-
with all effective ruleset requirements
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
61
|
+
with all effective ruleset requirements and retains publisher bindings in
|
|
62
|
+
`mergeReadiness.requiredChecks` alongside `requiredContexts`. Bound requirements
|
|
63
|
+
need both a name in the head rollup and paginated exact-head check-run evidence
|
|
64
|
+
from the expected app. A wrong or unavailable check-run publisher remains in
|
|
65
|
+
`missingContexts`; unbound legacy contexts retain name-based presence checks.
|
|
66
|
+
Commit statuses expose no app identity in the rollup. Status-only bound contexts
|
|
67
|
+
are disclosed in `publisherUnverifiable` with source `commit_status` and rely on
|
|
68
|
+
GitHub's `CLEAN` verdict to enforce the publisher binding. If the same context is
|
|
69
|
+
also emitted as a check run, that run still requires exact-head app evidence.
|
|
70
|
+
The receipt records GitHub's `mergeStateStatus` independently: an attempt is
|
|
71
|
+
`passed` only when no requirement is missing and GitHub reports `CLEAN`.
|
|
72
|
+
Publisher presence does not establish a passing verdict; GitHub retains that
|
|
73
|
+
enforcement along with other merge requirements. Publisher evidence is tracked by
|
|
74
|
+
[pm-5p48kf](../.agents/pm/tasks/pm-5p48kf.toon). Missing contexts and blocked or
|
|
57
75
|
unknown merge state remain `incomplete`; native watch failures remain `failed`.
|
|
58
76
|
Superseded attempts carry `superseded: true` and never certify readiness. Unavailable policy or status reads
|
|
59
77
|
fail visibly instead of certifying readiness. Successful
|
|
@@ -62,8 +80,10 @@ The direct `watch` command emits its complete JSON receipt before exiting `1`
|
|
|
62
80
|
for `incomplete` or `failed`, and exits `0` only for `passed`. Shell automation
|
|
63
81
|
can therefore stop on the exit status while retaining all findings for triage.
|
|
64
82
|
|
|
65
|
-
A failed
|
|
66
|
-
|
|
83
|
+
A failed check is still an actionable signal: `watch` records the failed outcome
|
|
84
|
+
and returns all findings instead of aborting before inventory. A fail-fast receipt
|
|
85
|
+
does not establish completion of pending reviews; the explicit review phase and
|
|
86
|
+
final inventory retain that separate obligation.
|
|
67
87
|
If the PR head or target branch changes during the wait or final readiness read,
|
|
68
88
|
the helper watches the new target, up to three consecutive attempts, before
|
|
69
89
|
returning exact-head state. It does not poll an absent required provider status.
|
package/docs/SCRIPTING.md
CHANGED
|
@@ -101,6 +101,16 @@ receipts without that evidence retain their existing envelope.
|
|
|
101
101
|
|
|
102
102
|
JSON object field order is not an API. Consume fields by name. Read envelopes keep the stable pagination vocabulary `items`, `count`, `total`, `has_more`, and, when another page exists, `next_cursor`. The `filters` object echoes the effective query scope. Plain `pm list` and `pm search` are all-status reads and disclose `filters.status: "all"`; lifecycle-specific commands such as `pm list-open` remain explicit shortcuts.
|
|
103
103
|
|
|
104
|
+
Default brief-list TOON presentation omits default projection, sorting, timestamp,
|
|
105
|
+
and redundant zero-count metadata. A `details: "--full"` pointer replaces only
|
|
106
|
+
the standard full-item omission receipt. Unchecked source status, pagination,
|
|
107
|
+
non-default sorting, warnings, and additional diagnostics remain visible.
|
|
108
|
+
Use JSON for the complete typed envelope. TOON object rows preserve explicit
|
|
109
|
+
nulls and empty values, including nested cells. Only genuinely missing keys
|
|
110
|
+
appear in a table's `absent` metadata.
|
|
111
|
+
Successful health checks retain their compact presentation by omitting an empty
|
|
112
|
+
diagnostic `details` object. Material diagnostics and failing checks remain visible.
|
|
113
|
+
|
|
104
114
|
Projection flags intentionally change row shape. Use `--fields` when a script requires an exact subset, `--brief` or `--compact` only when the documented sparse shape is sufficient, and `--full` when linked metadata is required. Check `row_contract` on generic read surfaces that expose one; do not infer omitted fields as empty values.
|
|
105
115
|
|
|
106
116
|
For long-lived clients, generate or inspect the runtime contract instead of hard-coding recalled flags:
|
package/docs/SDK.md
CHANGED
|
@@ -164,6 +164,19 @@ snapshot. Breaking SDK changes require a date-based release and matching
|
|
|
164
164
|
package compatibility bounds or migration guidance. Never refresh the snapshot
|
|
165
165
|
merely to silence an unexplained diff.
|
|
166
166
|
|
|
167
|
+
The mutation-admission update adds optional `changed?: false` to
|
|
168
|
+
`PmCliErrorContext`. The conservative signature gate records this interface
|
|
169
|
+
addition with a breaking acknowledgement; existing context objects and error
|
|
170
|
+
codes remain valid. Consumers need no data migration or new dependency bounds.
|
|
171
|
+
When adopting this update, read `error.context?.changed === false` as proof of a
|
|
172
|
+
preflight refusal. An absent property gives no guarantee about writes; do not
|
|
173
|
+
coerce it to `false` or treat an executed failure as safe to retry. Consumers
|
|
174
|
+
that enumerate error keys should accept the additional optional property.
|
|
175
|
+
JavaScript create/update callers must also remove misspelled keys and move
|
|
176
|
+
mutation fields into `options` on generic `run` calls: these requests now fail
|
|
177
|
+
instead of silently dropping fields. See [Robust Automation Pattern](#robust-automation-pattern)
|
|
178
|
+
for supported aliases and runtime schema discovery.
|
|
179
|
+
|
|
167
180
|
The snapshot also records an aggregate-completeness census. Every public symbol
|
|
168
181
|
from every non-testing SDK subpath must be available from
|
|
169
182
|
`@unbrained/pm-cli/sdk`; deliberate test-only exclusions require a named reason.
|
|
@@ -210,6 +223,36 @@ follow the migration guidance for changed unions or error codes. The shared
|
|
|
210
223
|
[primitive inventory](SDK_PRIMITIVE_INVENTORY.md) records CLI/MCP ownership:
|
|
211
224
|
presentation modules import the SDK and have zero private-core edges.
|
|
212
225
|
|
|
226
|
+
### Lock ownership and recovery
|
|
227
|
+
|
|
228
|
+
Use the public `acquireLock` primitive when a package must serialize its own
|
|
229
|
+
state changes. Always await its release in `finally`:
|
|
230
|
+
|
|
231
|
+
```ts
|
|
232
|
+
import { acquireLock } from "@unbrained/pm-cli/sdk";
|
|
233
|
+
|
|
234
|
+
async function writePackageState(pmRoot: string, write: () => Promise<void>) {
|
|
235
|
+
const release = await acquireLock(pmRoot, "example.state", 3600, "example-package", false, true, 30_000);
|
|
236
|
+
try {
|
|
237
|
+
await write();
|
|
238
|
+
} finally {
|
|
239
|
+
await release();
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
The built-in provider automatically recovers a provably dead original Linux
|
|
245
|
+
owner before TTL. Unknown owners retain the existing lease policy. Conflicts
|
|
246
|
+
expose the lock identity, observed process state and wait advice through
|
|
247
|
+
`PmCliError.context`. Force does not bypass an unexpired lock whose owner is
|
|
248
|
+
alive or unverifiable. TTL expiry permits removal regardless of owner liveness.
|
|
249
|
+
An expired holder can continue writing, so mutual exclusion beyond TTL is not
|
|
250
|
+
guaranteed. Choose a TTL longer than the critical section, or fence protected
|
|
251
|
+
resource writes at the caller. See
|
|
252
|
+
[Configuration](CONFIGURATION.md#common-settings) for host identity, local
|
|
253
|
+
recovery audit receipts and `PM_LOCK_WAIT_MS` precedence. Extension lock
|
|
254
|
+
providers retain responsibility for their own ownership and recovery policy.
|
|
255
|
+
|
|
213
256
|
### Portable merge settlement
|
|
214
257
|
|
|
215
258
|
Tracked by [pm-gh1475](../.agents/pm/issues/pm-gh1475.toon) and
|
|
@@ -1382,6 +1425,22 @@ handlers remain disabled. Package-backed `--template` create input cannot be
|
|
|
1382
1425
|
semantically previewed through its package handler; expand it into explicit core
|
|
1383
1426
|
mutation options before preview.
|
|
1384
1427
|
|
|
1428
|
+
Actionable previews are tracked by [pm-ekf2gu](../.agents/pm/issues/pm-ekf2gu.toon)
|
|
1429
|
+
and [pm-fa9olc](../.agents/pm/tasks/pm-fa9olc.toon).
|
|
1430
|
+
`previewItemMutations` returns `warnings` grouped by zero-based operation
|
|
1431
|
+
`index`, canonical `id`, and `op`. These are the original create lifecycle
|
|
1432
|
+
warnings, including advisory `likely_duplicates` and duplicate-recovery tokens.
|
|
1433
|
+
Earlier staged creates participate in later duplicate checks. Strict policy
|
|
1434
|
+
still refuses duplicates; preview never changes the configured policy.
|
|
1435
|
+
|
|
1436
|
+
For a document resolved with `planItemMutationDocument`, call
|
|
1437
|
+
`previewItemMutationDocument({ pmRoot, author, plan })` from the aggregate SDK.
|
|
1438
|
+
It returns `{ validation, rows }`; affected rows retain their source `index`
|
|
1439
|
+
and `ref` and gain `warnings`. Rows without warnings omit that property. The
|
|
1440
|
+
input plan stays unchanged. Both `pm item mutate --dry-run` and MCP `pm_mutate`
|
|
1441
|
+
use this same projection. A `replayed_committed_plan` has no newly evaluated
|
|
1442
|
+
warnings; an empty warning list in that state does not certify current policy.
|
|
1443
|
+
|
|
1385
1444
|
Staging excludes derived `search` and `locks` content and unrelated runtime state,
|
|
1386
1445
|
retaining registered item folders, explicitly configured schema files, and
|
|
1387
1446
|
`runtime/session.json` for core focus and inherited-parent semantics. Root-layout
|
|
@@ -1395,6 +1454,17 @@ remapped only in the staged settings. Schema files configured outside the
|
|
|
1395
1454
|
tracker fail with `transaction_preview_external_schema`; relocate them inside
|
|
1396
1455
|
the selected tracker root before retrying.
|
|
1397
1456
|
|
|
1457
|
+
`transaction_preview_non_regular_file` includes `preview_storage` in SDK error
|
|
1458
|
+
context and the CLI JSON error envelope. It reports a fixed `storage_area`,
|
|
1459
|
+
`entry_redacted`, and, when safe, `relative_entry` using `/` separators relative
|
|
1460
|
+
to the selected tracker root. Coordinates are limited to 160 ASCII characters
|
|
1461
|
+
from letters, digits, `.`, `_`, `-`, and separators. Absolute paths, traversal,
|
|
1462
|
+
control characters and overlong or otherwise unsafe names are withheld; the
|
|
1463
|
+
storage category remains available. Diagnostics never include link targets.
|
|
1464
|
+
Inspect that entry without following links, restore the intended regular file
|
|
1465
|
+
or directory, and retry the dry run. Native filesystem errors retain their
|
|
1466
|
+
existing diagnostics.
|
|
1467
|
+
|
|
1398
1468
|
Preview requires trusted, stable directory entries and ancestors. Where Node
|
|
1399
1469
|
exposes `O_NOFOLLOW` and `O_NONBLOCK`, descriptor opens request those POSIX guards.
|
|
1400
1470
|
Windows retains entry checks, regular-file descriptor checks and snapshot
|
|
@@ -1632,6 +1702,16 @@ contract compact and fail-safe for newly added flags. Use
|
|
|
1632
1702
|
package-authored query surface. `encodeQueryCursor`, `decodeQueryCursorState`, and
|
|
1633
1703
|
`paginateQueryRows` remain the transport-neutral continuation primitives.
|
|
1634
1704
|
|
|
1705
|
+
`decodeQueryCursorEnvelope`, `decodeQueryCursorState`, and
|
|
1706
|
+
`resolveQueryCursorStart` accept an optional final `cursorFlag` argument
|
|
1707
|
+
(`"--after"`, the default, or `"--cursor"`) so package-authored queries can
|
|
1708
|
+
name their actual producer flag in refusal guidance. Relationship packets use
|
|
1709
|
+
`--cursor`. The deps action additionally returns a scoped executable
|
|
1710
|
+
`recovery.suggested_retry_args` for a fresh query after a malformed or mismatched
|
|
1711
|
+
cursor; it preserves traversal and output policy while removing the rejected
|
|
1712
|
+
producer cursor and stale output continuation. See
|
|
1713
|
+
[pm-ohgg1b](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/issues/pm-ohgg1b.toon).
|
|
1714
|
+
|
|
1635
1715
|
At the storage boundary, the metadata cache maintains a rebuildable SQLite
|
|
1636
1716
|
query projection under the same source cursor and cross-process writer lock as
|
|
1637
1717
|
the JSON metadata/body/collection tiers. Bounded default-order light `list`
|
|
@@ -1640,6 +1720,13 @@ trees, custom runtime fields, dependency-aware filtering, unsupported filters,
|
|
|
1640
1720
|
and stale/missing indexes take the canonical fallback path with identical
|
|
1641
1721
|
result contracts. Custom hosts may call `queryItemMetadataIndex` directly, but
|
|
1642
1722
|
must treat `null` as an instruction to rebuild or use authoritative storage.
|
|
1723
|
+
The separate history-event index is also optional. Recognized native SQLite
|
|
1724
|
+
failures while starting its write transaction invalidate that projection before
|
|
1725
|
+
appending authoritative history. Native lock contention retains its existing
|
|
1726
|
+
invalidation protocol; unrelated adapter exceptions and authoritative append
|
|
1727
|
+
failures propagate. A later index rebuild restores accelerated history reads.
|
|
1728
|
+
(Repository tracker: [pm-0orupq](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/tasks/pm-0orupq.toon);
|
|
1729
|
+
tracker records are excluded from npm.)
|
|
1643
1730
|
|
|
1644
1731
|
List results always expose `total`, `has_more`, `truncated`, and a nullable
|
|
1645
1732
|
`next_cursor`, whether or not the page was truncated; unset filter echoes are
|
|
@@ -1688,6 +1775,16 @@ true. The normal JSON envelope remains unchanged, and an actionable cursor is
|
|
|
1688
1775
|
always retained. SDK query functions continue returning their full typed
|
|
1689
1776
|
results; lean projection belongs to the CLI presentation boundary.
|
|
1690
1777
|
|
|
1778
|
+
Custom agent hosts can import `projectPmBriefListEnvelope` from
|
|
1779
|
+
`@unbrained/pm-cli/sdk` to apply the same brief-list presentation without
|
|
1780
|
+
mutating the original result. It retains unchecked source status and actionable
|
|
1781
|
+
continuation, and leaves partial, custom, or inconsistent envelopes intact.
|
|
1782
|
+
The CLI applies this projection only to TOON; ordinary JSON and SDK query
|
|
1783
|
+
results retain their complete contracts. The public `encodePmTableRows` and
|
|
1784
|
+
`decodePmTableRows` primitives distinguish explicit null and empty cells from
|
|
1785
|
+
missing keys. TOON rendering preserves those row facts before selecting the
|
|
1786
|
+
smaller expanded or tabular encoding.
|
|
1787
|
+
|
|
1691
1788
|
Migration note: before this contract, `total` was present only when pagination
|
|
1692
1789
|
omitted rows, a completed page omitted `next_cursor`, and verbose results
|
|
1693
1790
|
emitted unset filter keys with `null` values. Consumers must use `has_more` or
|
|
@@ -2468,6 +2565,39 @@ throw createPmCliExpectedError("hello requires --name", {
|
|
|
2468
2565
|
|
|
2469
2566
|
The helper returns an `Error` whose public name is `PmCliError` and whose `exitCode` is structural. That makes it safe for bundled, linked, and separately installed package code even when class identity is not shared with the running CLI.
|
|
2470
2567
|
|
|
2568
|
+
For example, the SDK command layer settles relationship token counts after alias
|
|
2569
|
+
counts, read disclosure, encoding and optional lean/token-accounting policies.
|
|
2570
|
+
It converts an impossible rendered context budget into an expected
|
|
2571
|
+
`invalid_argument_value` usage error. The public `PmTokenBudgetRecovery` type and
|
|
2572
|
+
`isPmTokenBudgetRecovery` guard describe `context.recovery.token_budget`: requested
|
|
2573
|
+
tokens, a verified feasible retry value, and an exact minimum only when every
|
|
2574
|
+
smaller positive budget has been checked. Larger searches report `feasible_only`;
|
|
2575
|
+
query cost limits, exhausted searches or independent output constraints can report
|
|
2576
|
+
`unavailable`. Both states leave the unproved minimum `null`. The bounded search
|
|
2577
|
+
uses the real packer and output policy, including alias disclosure.
|
|
2578
|
+
The public type is a discriminated union: checking `minimum_status` narrows the
|
|
2579
|
+
verified budgets and requires a reason for `unavailable`. Package authors cannot
|
|
2580
|
+
declare unavailable advice with a numeric budget or omit its cause. The runtime
|
|
2581
|
+
guard additionally checks positive safe integers and equal budgets for `exact`;
|
|
2582
|
+
those numeric invariants cannot be expressed by the declaration alone.
|
|
2583
|
+
`suggested_retry_args` preserves the selected tracker, query and output options
|
|
2584
|
+
with the verified feasible budget so it works from another workspace.
|
|
2585
|
+
Retry probes consume canonical summary/full include modes before packing and
|
|
2586
|
+
retain only residual field selectors, matching the emitted CLI command. Recovery
|
|
2587
|
+
work estimates include repeated dangling-reference renders; summary probes count
|
|
2588
|
+
only their single rendering pass. Expensive queries return explicit unavailable
|
|
2589
|
+
budget advice and retain the compact inspection fallback.
|
|
2590
|
+
`next_best_command` retains a separate compact tree-summary inspection, which
|
|
2591
|
+
also supplies the fallback when no working context budget is established.
|
|
2592
|
+
CLI JSON and MCP preserve that recovery. The lower-level
|
|
2593
|
+
`buildRelationshipContext` primitive retains its `TypeError` validation contract;
|
|
2594
|
+
unrelated runtime errors still propagate.
|
|
2595
|
+
(Repository tracker: [pm-odw3j8](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/tasks/pm-odw3j8.toon),
|
|
2596
|
+
[pm-0bbc53](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/tasks/pm-0bbc53.toon),
|
|
2597
|
+
[pm-k6uglj](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/tasks/pm-k6uglj.toon),
|
|
2598
|
+
[pm-8jzcwv](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/tasks/pm-8jzcwv.toon);
|
|
2599
|
+
tracker records are excluded from npm.)
|
|
2600
|
+
|
|
2471
2601
|
For policy, lint, or verification commands that should render their full result
|
|
2472
2602
|
and report failure without throwing, return a structured object instead:
|
|
2473
2603
|
|
|
@@ -3212,6 +3342,20 @@ history and retains mutation governance.
|
|
|
3212
3342
|
|
|
3213
3343
|
## Robust Automation Pattern
|
|
3214
3344
|
|
|
3345
|
+
Native `PmClient.create`, `update`, and their generic `run` routes reject unknown
|
|
3346
|
+
option names at runtime, including JavaScript callers and injected extension
|
|
3347
|
+
clients ([pm-fl3phm](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/issues/pm-fl3phm.toon),
|
|
3348
|
+
a repository-only tracker record excluded from npm). A typo such as
|
|
3349
|
+
`priorty` refuses the whole request with `PmCliError.code =
|
|
3350
|
+
"invalid_argument_value"`, `context.reason = "unknown_mutation_option"`, a
|
|
3351
|
+
nearest-name hint when available, and `context.changed = false`. Put mutation
|
|
3352
|
+
fields under `options` when using `run`; existing declared top-level aliases
|
|
3353
|
+
remain accepted. Workspace schema option identities remain available through
|
|
3354
|
+
`run`, while typed convenience methods support extension item fields through `field`.
|
|
3355
|
+
MCP retains its existing transport-specific admission contract. The no-change
|
|
3356
|
+
receipt applies to these preflight refusals; an executed operation's outcome
|
|
3357
|
+
and evidence must be assessed separately.
|
|
3358
|
+
|
|
3215
3359
|
1. Read `PM_TOOL_ACTIONS` or `PM_TOOL_PARAMETERS_SCHEMA` for baseline static validation.
|
|
3216
3360
|
2. Load runtime contracts with `getContracts(pmRoot, { runtimeOnly: true })` or run `pm contracts --runtime-only --json` inside the target project.
|
|
3217
3361
|
3. Verify the action appears in `actions` and has `action_availability[].invocable: true`.
|
package/docs/TESTING.md
CHANGED
|
@@ -49,6 +49,19 @@ claims to the same canonical gate IDs. Hosted-only environment isolation and
|
|
|
49
49
|
tracker-integrity steps remain explicit entries with reasons rather than
|
|
50
50
|
silently disappearing from local parity.
|
|
51
51
|
|
|
52
|
+
The full-source command-example scan runs after parallel contract files in the
|
|
53
|
+
existing serial cohort. It keeps the same source corpus, assertions and
|
|
54
|
+
30-second deadline, so concurrent contract workers do not consume its
|
|
55
|
+
policy-check budget. This allocation is tracked by
|
|
56
|
+
[pm-a3c6g4](../.agents/pm/tasks/pm-a3c6g4.toon); broader runner qualification
|
|
57
|
+
remains with [pm-bj7rq0](../.agents/pm/issues/pm-bj7rq0.toon).
|
|
58
|
+
|
|
59
|
+
The same serial cohort runs the ten-thousand-item aggregation, cold governance
|
|
60
|
+
read, and surface-replication fixture files after parallel contracts
|
|
61
|
+
([pm-ckb8w5](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/tasks/pm-ckb8w5.toon),
|
|
62
|
+
a repository-only tracker record excluded from npm). Their original input
|
|
63
|
+
populations, assertions, per-test deadlines and retry policy remain in force.
|
|
64
|
+
|
|
52
65
|
`node scripts/run-tests.mjs` wraps Vitest in temporary tracker roots, disables
|
|
53
66
|
external Sentry delivery for the build, test workers, and their nested CLI
|
|
54
67
|
children, then cleans the roots up. Instrumentation tests can still exercise
|
|
@@ -244,6 +257,22 @@ into the pass count; a persistent assertion still fails after the bounded
|
|
|
244
257
|
retry. Local runs do not retry, so deterministic failures stay immediate while
|
|
245
258
|
iterating.
|
|
246
259
|
|
|
260
|
+
The complete receipt-operation, aborted-operation recovery, receipt-settlement, merge-portability and
|
|
261
|
+
lossless-collection-union integration files run in the existing serial
|
|
262
|
+
`lifecycle-performance` project after parallel contracts. Both nightly shards and
|
|
263
|
+
full coverage use that same project partition, retaining every case and its
|
|
264
|
+
original assertions, deadlines and retry policy. This allocation is tracked by
|
|
265
|
+
[pm-89297t](../.agents/pm/tasks/pm-89297t.toon); it does not classify or erase
|
|
266
|
+
historical failed attempts.
|
|
267
|
+
|
|
268
|
+
The complete macOS Node 24 and Windows Node 24 nightly suites each use two
|
|
269
|
+
Vitest shards. Both halves must pass within the existing 20-minute job limit;
|
|
270
|
+
sharding retains the same complete file population, serial phase, assertions,
|
|
271
|
+
per-test deadlines and retry policy. The recurrence collector retains the old
|
|
272
|
+
unsharded platform families alongside both current shard identities, so changing
|
|
273
|
+
the matrix does not erase earlier failures. macOS allocation is tracked by
|
|
274
|
+
[pm-qrirz8](../.agents/pm/tasks/pm-qrirz8.toon).
|
|
275
|
+
|
|
247
276
|
Vitest's GitHub reporter emits annotations and retry evidence. The repository
|
|
248
277
|
reliability reporter additionally writes
|
|
249
278
|
`.vitest-reports/reliability-<shard>.json` and appends a job-summary table with
|
|
@@ -544,6 +573,18 @@ the descriptor registry does not yet know about.
|
|
|
544
573
|
For in-place metadata corrections and context admission/refusal semantics, see
|
|
545
574
|
[Linked-test edits](LINKED_TEST_EDITS.md).
|
|
546
575
|
|
|
576
|
+
Run-option admission is tracked by
|
|
577
|
+
[pm-hdvxqg](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/issues/pm-hdvxqg.toon)
|
|
578
|
+
(a repository-only tracker record excluded from npm).
|
|
579
|
+
`pm test` requires `--run` for `--timeout`, `--progress`, execution context,
|
|
580
|
+
environment directives, and run selectors. Registration-only calls refuse these
|
|
581
|
+
options before saving links. Combined edits and execution validate the effective
|
|
582
|
+
post-edit selection under the item lock before persistence, including out-of-range
|
|
583
|
+
indexes and unmatched selectors. These admission errors carry `changed: false`
|
|
584
|
+
in structured output. A valid request that executes a failing child can still
|
|
585
|
+
save its accepted edits and execution evidence; inspect its run results before
|
|
586
|
+
retrying.
|
|
587
|
+
|
|
547
588
|
Add tests to the item that owns the work:
|
|
548
589
|
|
|
549
590
|
```bash
|
|
@@ -668,7 +709,8 @@ pm test <item-id> --run --workspace-context snapshot --override-linked-workspace
|
|
|
668
709
|
Windows execution is tracked by [pm-bj7rq0](../.agents/pm/issues/pm-bj7rq0.toon).
|
|
669
710
|
Script and native keeper cohorts run independently on Windows Node 24. Their
|
|
670
711
|
source/script keeper steps retain the two-worker cap, and each cohort retains
|
|
671
|
-
the 12-minute deadline. The
|
|
712
|
+
the 12-minute deadline. The four-file Git/worktree receipt slice uses one
|
|
713
|
+
worker to avoid competing subprocess-heavy files at the same case deadlines. The required
|
|
672
714
|
`Windows regression (Node 24)` check waits for both cohorts and fails if either
|
|
673
715
|
fails, is cancelled, or is skipped. This preserves every selected regression
|
|
674
716
|
while avoiding a shared serial job deadline. See GitHub's
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":5,"transcript_version":2,"transcript_digest":"sha256:6d4041acfaa4075dde1972d6127a74f18916f7661738b4f5d5fd47a61c179a78","estimator":"ceil(utf8_bytes / 4)","comparison_scope":"plan_recovery_tracker_root_canonicalized","measurement_scope":"output_before_token_accounting","published_with_release":true,"orientation":{"canonical_task_id":"orientation-context-intent","required_capabilities":["actionable_work","active_ownership","workspace_state"],"measured_winner_tokens":1087,"protocols":[{"task_id":"orientation-context-intent","command_count":1,"estimated_tokens":1087,"capabilities":["actionable_work","active_ownership","workspace_state"],"capability_evidence":{"actionable_work":[{"step_id":"context","field_path":"hierarchy"}],"active_ownership":[{"step_id":"context","field_path":"activity"}],"workspace_state":[{"step_id":"context","field_path":"summary.active_items"}]}},{"task_id":"orientation-operating-rules","command_count":4,"estimated_tokens":
|
|
1
|
+
{"version":5,"transcript_version":2,"transcript_digest":"sha256:6d4041acfaa4075dde1972d6127a74f18916f7661738b4f5d5fd47a61c179a78","estimator":"ceil(utf8_bytes / 4)","comparison_scope":"plan_recovery_tracker_root_canonicalized","measurement_scope":"output_before_token_accounting","published_with_release":true,"orientation":{"canonical_task_id":"orientation-context-intent","required_capabilities":["actionable_work","active_ownership","workspace_state"],"measured_winner_tokens":1087,"protocols":[{"task_id":"orientation-context-intent","command_count":1,"estimated_tokens":1087,"capabilities":["actionable_work","active_ownership","workspace_state"],"capability_evidence":{"actionable_work":[{"step_id":"context","field_path":"hierarchy"}],"active_ownership":[{"step_id":"context","field_path":"activity"}],"workspace_state":[{"step_id":"context","field_path":"summary.active_items"}]}},{"task_id":"orientation-operating-rules","command_count":4,"estimated_tokens":2139,"capabilities":["actionable_work","active_ownership","workspace_state"],"capability_evidence":{"actionable_work":[{"step_id":"open","field_path":"items"}],"active_ownership":[{"step_id":"in-progress","field_path":"items"}],"workspace_state":[{"step_id":"context","field_path":"summary.active_items"}]}},{"task_id":"orientation-contracts-next","command_count":2,"estimated_tokens":5203,"capabilities":["actionable_work","active_ownership","workspace_state"],"capability_evidence":{"actionable_work":[{"step_id":"next","field_path":"recommended.id"}],"active_ownership":[{"step_id":"next","field_path":"held_by_others"}],"workspace_state":[{"step_id":"next","field_path":"summary.in_progress"}]}}]},"tasks":[{"id":"orientation-context-intent","max_estimated_tokens":1087,"steps":[{"id":"context","max_estimated_tokens":1087,"accounting_mode":"self_reported"}]},{"id":"orientation-contracts-next","max_estimated_tokens":5203,"steps":[{"id":"contracts","max_estimated_tokens":4481,"accounting_mode":"self_reported"},{"id":"next","max_estimated_tokens":722,"accounting_mode":"self_reported"}]},{"id":"orientation-operating-rules","max_estimated_tokens":2139,"steps":[{"id":"context","max_estimated_tokens":1087,"accounting_mode":"self_reported"},{"id":"search","max_estimated_tokens":164,"accounting_mode":"self_reported"},{"id":"open","max_estimated_tokens":712,"accounting_mode":"self_reported"},{"id":"in-progress","max_estimated_tokens":176,"accounting_mode":"self_reported"}]},{"id":"context-bootstrap","max_estimated_tokens":2077,"steps":[{"id":"triage","max_estimated_tokens":619,"accounting_mode":"self_reported"},{"id":"orient","max_estimated_tokens":1087,"accounting_mode":"self_reported"},{"id":"inspect","max_estimated_tokens":371,"accounting_mode":"self_reported"}]},{"id":"closed-domain-recovery","max_estimated_tokens":630,"steps":[{"id":"refuse-intent","max_estimated_tokens":259,"accounting_mode":"self_reported"},{"id":"retry-intent","max_estimated_tokens":371,"accounting_mode":"self_reported"}]},{"id":"unknown-option-recovery","max_estimated_tokens":596,"steps":[{"id":"refuse-option","max_estimated_tokens":433,"accounting_mode":"self_reported"},{"id":"retry-option","max_estimated_tokens":163,"accounting_mode":"self_reported"}]},{"id":"lifecycle-mutation","max_estimated_tokens":812,"steps":[{"id":"create","max_estimated_tokens":20,"accounting_mode":"self_reported"},{"id":"inspect-open","max_estimated_tokens":363,"accounting_mode":"self_reported"},{"id":"close","max_estimated_tokens":31,"accounting_mode":"self_reported"},{"id":"inspect-closed","max_estimated_tokens":398,"accounting_mode":"self_reported"}]},{"id":"bulk-effect-outcomes","max_estimated_tokens":326,"steps":[{"id":"create-bulk-target","max_estimated_tokens":20,"accounting_mode":"self_reported"},{"id":"partial-effect","max_estimated_tokens":174,"accounting_mode":"self_reported"},{"id":"no-effect","max_estimated_tokens":132,"accounting_mode":"self_reported"}]},{"id":"plan-execution-mutations","max_estimated_tokens":806,"steps":[{"id":"create-plan","max_estimated_tokens":21,"accounting_mode":"self_reported"},{"id":"add-step","max_estimated_tokens":254,"accounting_mode":"self_reported"},{"id":"complete-step","max_estimated_tokens":253,"accounting_mode":"self_reported"},{"id":"inspect-plan","max_estimated_tokens":278,"accounting_mode":"self_reported"}]}],"composite_max_estimated_tokens":13676}
|
package/marketplace.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name":"pm","owner":{"name":"unbrained","url":"https://github.com/unbraind/pm-cli"},"description":"Official marketplace for pm CLI — native git-based project management for Claude Code and AI coding agents.","version":"2026.10.
|
|
1
|
+
{"name":"pm","owner":{"name":"unbrained","url":"https://github.com/unbraind/pm-cli"},"description":"Official marketplace for pm CLI — native git-based project management for Claude Code and AI coding agents.","version":"2026.10.21","plugins":[{"name":"pm-claude","source":"./plugins/pm-claude","description":"Native pm CLI integration for Claude Code — 32 MCP tools, 14 workflow skills with slash invocations, 4 subagents, hybrid TUI task tracking, session context injection, and coordination subagents for git-based project management without leaving Claude Code.","version":"2026.10.21","author":{"name":"unbrained","url":"https://github.com/unbraind/pm-cli"},"homepage":"https://github.com/unbraind/pm-cli","repository":"https://github.com/unbraind/pm-cli","license":"MIT","keywords":["pm-cli","project-management","mcp","tasks","agents","workflows","git-native","task-tracker","ai"],"category":"productivity"}]}
|
package/package.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name":"@unbrained/pm-beads","version":"2026.10.
|
|
1
|
+
{"name":"@unbrained/pm-beads","version":"2026.10.21","private":true,"type":"module","description":"First-party pm package for importing Beads JSONL records.","homepage":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-beads#readme","repository":{"type":"git","url":"git+https://github.com/unbraind/pm-cli.git","directory":"packages/pm-beads"},"bugs":{"url":"https://github.com/unbraind/pm-cli/issues"},"keywords":["pm-package","project-management","beads"],"pm":{"aliases":["beads"],"extensions":["extensions/beads"],"catalog":{"display_name":"Beads Import","category":"migration","summary":"Import Beads JSONL records into pm while preserving source IDs.","tags":["migration","beads","import"],"links":{"docs":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-beads#readme","repository":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-beads","report":"https://github.com/unbraind/pm-cli/issues"}},"docs":["README.md"],"examples":["README.md"]}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name":"@unbrained/pm-calendar","version":"2026.10.
|
|
1
|
+
{"name":"@unbrained/pm-calendar","version":"2026.10.21","private":true,"type":"module","description":"First-party pm package for calendar and agenda views.","homepage":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-calendar#readme","repository":{"type":"git","url":"git+https://github.com/unbraind/pm-cli.git","directory":"packages/pm-calendar"},"bugs":{"url":"https://github.com/unbraind/pm-cli/issues"},"keywords":["pm-package","project-management","calendar","agenda"],"pm":{"aliases":["calendar"],"extensions":["extensions/calendar"],"catalog":{"display_name":"Calendar Views","category":"workflow","summary":"Show agenda, day, week, and month views for deadlines, reminders, and scheduled events.","tags":["calendar","agenda","workflow"],"links":{"docs":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-calendar#readme","repository":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-calendar","report":"https://github.com/unbraind/pm-cli/issues"}},"docs":["README.md"],"examples":["README.md"]}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name":"@unbrained/pm-command-kit","version":"2026.10.
|
|
1
|
+
{"name":"@unbrained/pm-command-kit","version":"2026.10.21","private":true,"type":"module","description":"First-party pm exemplar package for the commands capability: registerCommand, registerFlags, and registerParser.","homepage":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-command-kit#readme","repository":{"type":"git","url":"git+https://github.com/unbraind/pm-cli.git","directory":"packages/pm-command-kit"},"bugs":{"url":"https://github.com/unbraind/pm-cli/issues"},"keywords":["pm-package","project-management","sdk","commands","exemplar"],"pm":{"aliases":["command-kit"],"extensions":["extensions/command-kit"],"catalog":{"display_name":"Command Kit Exemplar","category":"sdk","summary":"Copy-paste-able exemplar for registerCommand, registerFlags, and registerParser.","tags":["sdk","commands","parser","exemplar"],"links":{"docs":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-command-kit#readme","repository":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-command-kit","report":"https://github.com/unbraind/pm-cli/issues"}},"docs":["README.md"],"examples":["README.md"]}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name":"@unbrained/pm-digital-twin","version":"2026.10.
|
|
1
|
+
{"name":"@unbrained/pm-digital-twin","version":"2026.10.21","private":true,"type":"module","description":"Beyond-PM exemplar: a temporal production-facility digital twin built entirely on public pm SDK and extension primitives.","homepage":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-digital-twin#readme","repository":{"type":"git","url":"git+https://github.com/unbraind/pm-cli.git","directory":"packages/pm-digital-twin"},"bugs":{"url":"https://github.com/unbraind/pm-cli/issues"},"keywords":["pm-package","sdk","digital-twin","event-sourcing","temporal-graph","exemplar"],"pm":{"aliases":["digital-twin","twin"],"extensions":["extensions/digital-twin"],"catalog":{"display_name":"Digital Twin SDK Exemplar","category":"sdk","summary":"Temporal facility graph proving event replay, point-in-time state, invariants, federation, checkpoints, and compact exports through public SDK contracts.","tags":["sdk","digital-twin","event-sourcing","graph","offline-first","exemplar"],"links":{"docs":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-digital-twin#readme","repository":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-digital-twin","report":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-digital-twin/GAP_REPORT.md"}},"docs":["README.md","GAP_REPORT.md"],"examples":["README.md"]}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name":"@unbrained/pm-governance-audit","version":"2026.10.
|
|
1
|
+
{"name":"@unbrained/pm-governance-audit","version":"2026.10.21","private":true,"type":"module","description":"First-party pm package for governance audit and normalization workflows.","homepage":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-governance-audit#readme","repository":{"type":"git","url":"git+https://github.com/unbraind/pm-cli.git","directory":"packages/pm-governance-audit"},"bugs":{"url":"https://github.com/unbraind/pm-cli/issues"},"keywords":["pm-package","project-management","governance","audit","normalize","hooks"],"pm":{"aliases":["governance-audit","audit"],"extensions":["extensions/governance-audit"],"catalog":{"display_name":"Governance Audit","category":"governance","summary":"Run dedupe audits, comments audits, and normalize sweeps as package-owned workflows.","tags":["governance","audit","normalize","hooks"],"links":{"docs":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-governance-audit#readme","repository":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-governance-audit","report":"https://github.com/unbraind/pm-cli/issues"}},"docs":["README.md"],"examples":["README.md"]}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name":"@unbrained/pm-guide-shell","version":"2026.10.
|
|
1
|
+
{"name":"@unbrained/pm-guide-shell","version":"2026.10.21","private":true,"type":"module","description":"First-party pm package for guide and shell completion workflows.","homepage":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-guide-shell#readme","repository":{"type":"git","url":"git+https://github.com/unbraind/pm-cli.git","directory":"packages/pm-guide-shell"},"bugs":{"url":"https://github.com/unbraind/pm-cli/issues"},"keywords":["pm-package","project-management","guide","completion","shell"],"pm":{"aliases":["guide-shell"],"extensions":["extensions/guide-shell"],"catalog":{"display_name":"Guide + Shell UX","category":"workflow","summary":"Restore guide documentation and shell completion commands as package-owned UX surfaces.","tags":["guide","completion","shell"],"links":{"docs":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-guide-shell#readme","repository":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-guide-shell","report":"https://github.com/unbraind/pm-cli/issues"}},"docs":["README.md"],"examples":["README.md"]}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name":"@unbrained/pm-kanban","version":"2026.10.
|
|
1
|
+
{"name":"@unbrained/pm-kanban","version":"2026.10.21","private":true,"type":"module","description":"First-party pm archetype package: a complete Kanban continuous-flow profile built on public SDK primitives.","homepage":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-kanban#readme","repository":{"type":"git","url":"git+https://github.com/unbraind/pm-cli.git","directory":"packages/pm-kanban"},"bugs":{"url":"https://github.com/unbraind/pm-cli/issues"},"keywords":["pm-package","project-management","sdk","profile","archetype","kanban","exemplar"],"pm":{"aliases":["kanban"],"extensions":["extensions/kanban"],"catalog":{"display_name":"Kanban Archetype","category":"sdk","summary":"Installable Kanban continuous-flow archetype: Card item type, flow fields, and a ProjectProfileDefinition built on public SDK primitives.","tags":["sdk","profile","archetype","kanban","schema","exemplar"],"links":{"docs":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-kanban#readme","repository":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-kanban","report":"https://github.com/unbraind/pm-cli/issues"}},"docs":["README.md"],"examples":["README.md"]}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name":"@unbrained/pm-lifecycle-hooks","version":"2026.10.
|
|
1
|
+
{"name":"@unbrained/pm-lifecycle-hooks","version":"2026.10.21","private":true,"type":"module","description":"First-party pm package demonstrating safe lifecycle hook registration.","homepage":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-lifecycle-hooks#readme","repository":{"type":"git","url":"git+https://github.com/unbraind/pm-cli.git","directory":"packages/pm-lifecycle-hooks"},"bugs":{"url":"https://github.com/unbraind/pm-cli/issues"},"keywords":["pm-package","project-management","hooks","lifecycle","sdk"],"pm":{"aliases":["lifecycle-hooks"],"extensions":["extensions/lifecycle-hooks"],"catalog":{"display_name":"Lifecycle Hooks","category":"sdk","summary":"Default-inert lifecycle hook exemplar for package authors.","tags":["hooks","lifecycle","sdk"],"links":{"docs":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-lifecycle-hooks#readme","repository":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-lifecycle-hooks","report":"https://github.com/unbraind/pm-cli/issues"}},"docs":["README.md"],"examples":["README.md"]}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name":"@unbrained/pm-linked-test-adapters","version":"2026.10.
|
|
1
|
+
{"name":"@unbrained/pm-linked-test-adapters","version":"2026.10.21","private":true,"type":"module","description":"First-party pm package for optional linked-test run management adapters and reporters.","homepage":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-linked-test-adapters#readme","repository":{"type":"git","url":"git+https://github.com/unbraind/pm-cli.git","directory":"packages/pm-linked-test-adapters"},"bugs":{"url":"https://github.com/unbraind/pm-cli/issues"},"keywords":["pm-package","project-management","linked-tests","background-runs","test-runs"],"pm":{"aliases":["linked-test-adapters"],"extensions":["extensions/linked-test-adapters"],"catalog":{"display_name":"Linked Test Adapters","category":"testing","summary":"Restore optional linked-test run management/reporting command surfaces.","tags":["tests","linked-tests","background","reporting"],"links":{"docs":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-linked-test-adapters#readme","repository":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-linked-test-adapters","report":"https://github.com/unbraind/pm-cli/issues"}},"docs":["README.md"],"examples":["README.md"]}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name":"@unbrained/pm-search-advanced","version":"2026.10.
|
|
1
|
+
{"name":"@unbrained/pm-search-advanced","version":"2026.10.21","private":true,"type":"module","description":"First-party pm package for semantic, hybrid, and reindex search workflows.","homepage":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-search-advanced#readme","repository":{"type":"git","url":"git+https://github.com/unbraind/pm-cli.git","directory":"packages/pm-search-advanced"},"bugs":{"url":"https://github.com/unbraind/pm-cli/issues"},"keywords":["pm-package","project-management","search","reindex","semantic","hybrid"],"pm":{"aliases":["search-advanced"],"extensions":["extensions/search-advanced"],"catalog":{"display_name":"Advanced Search","category":"search","summary":"Enable semantic/hybrid search modes and reindex workflows.","tags":["search","semantic","hybrid","reindex"],"links":{"docs":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-search-advanced#readme","repository":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-search-advanced","report":"https://github.com/unbraind/pm-cli/issues"}},"docs":["README.md"],"examples":["README.md"]}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name":"@unbrained/pm-templates","version":"2026.10.
|
|
1
|
+
{"name":"@unbrained/pm-templates","version":"2026.10.21","private":true,"type":"module","description":"First-party pm package for reusable create templates.","homepage":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-templates#readme","repository":{"type":"git","url":"git+https://github.com/unbraind/pm-cli.git","directory":"packages/pm-templates"},"bugs":{"url":"https://github.com/unbraind/pm-cli/issues"},"keywords":["pm-package","project-management","templates"],"pm":{"aliases":["templates"],"extensions":["extensions/templates"],"catalog":{"display_name":"Create Templates","category":"workflow","summary":"Save, list, show, and apply reusable pm create option templates.","tags":["templates","create","workflow"],"links":{"docs":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-templates#readme","repository":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-templates","report":"https://github.com/unbraind/pm-cli/issues"}},"docs":["README.md"],"examples":["README.md"]}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name":"@unbrained/pm-todos","version":"2026.10.
|
|
1
|
+
{"name":"@unbrained/pm-todos","version":"2026.10.21","private":true,"type":"module","description":"First-party pm package for Todo markdown import and export.","homepage":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-todos#readme","repository":{"type":"git","url":"git+https://github.com/unbraind/pm-cli.git","directory":"packages/pm-todos"},"bugs":{"url":"https://github.com/unbraind/pm-cli/issues"},"keywords":["pm-package","project-management","todos"],"pm":{"aliases":["todos"],"extensions":["extensions/todos"],"catalog":{"display_name":"Todos Import/Export","category":"migration","summary":"Import and export Todo markdown tasks through pm package commands.","tags":["migration","todos","import","export"],"links":{"docs":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-todos#readme","repository":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-todos","report":"https://github.com/unbraind/pm-cli/issues"}},"docs":["README.md"],"examples":["README.md"]}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name":"@unbrained/pm-vcs-sdk-exemplar","version":"2026.10.
|
|
1
|
+
{"name":"@unbrained/pm-vcs-sdk-exemplar","version":"2026.10.21","private":true,"type":"module","description":"Beyond-PM exemplar: a VCS-style changeset workflow built entirely on public pm SDK and extension primitives.","homepage":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-vcs#readme","repository":{"type":"git","url":"git+https://github.com/unbraind/pm-cli.git","directory":"packages/pm-vcs"},"bugs":{"url":"https://github.com/unbraind/pm-cli/issues"},"keywords":["pm-package","sdk","vcs","event-sourcing","exemplar"],"pm":{"aliases":["vcs-exemplar"],"extensions":["extensions/vcs"],"catalog":{"display_name":"VCS SDK Exemplar","category":"sdk","summary":"Non-PM changeset/ref workflow proving custom schema, domain commands, hooks, history replay, and typed relationship events through public SDK contracts.","tags":["sdk","vcs","event-sourcing","graph","exemplar"],"links":{"docs":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-vcs#readme","repository":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-vcs","report":"https://github.com/unbraind/pm-cli/tree/main/packages/pm-vcs/GAP_REPORT.md"}},"docs":["README.md","GAP_REPORT.md"],"examples":["README.md"]}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"$schema":"https://json.schemastore.org/claude-code-plugin-manifest.json","name":"pm-claude","displayName":"pm CLI","description":"Native pm CLI integration for Claude Code — 32 MCP tools, 14 skills with slash invocations, 4 subagents (coordinator, delivery-chain, triage, verification), hybrid TUI task tracking (pm as persistent store + Claude Code task panel as live view), session context injection, and full git-based project management without leaving Claude Code.","version":"2026.10.
|
|
1
|
+
{"$schema":"https://json.schemastore.org/claude-code-plugin-manifest.json","name":"pm-claude","displayName":"pm CLI","description":"Native pm CLI integration for Claude Code — 32 MCP tools, 14 skills with slash invocations, 4 subagents (coordinator, delivery-chain, triage, verification), hybrid TUI task tracking (pm as persistent store + Claude Code task panel as live view), session context injection, and full git-based project management without leaving Claude Code.","version":"2026.10.21","author":{"name":"unbrained","url":"https://github.com/unbraind/pm-cli"},"homepage":"https://github.com/unbraind/pm-cli","repository":"https://github.com/unbraind/pm-cli","license":"MIT","keywords":["pm-cli","project-management","mcp","tasks","agents","workflows","git-native","task-tracker","ai"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name":"pm-claude-runtime","private":true,"type":"module","version":"2026.10.
|
|
1
|
+
{"name":"pm-claude-runtime","private":true,"type":"module","version":"2026.10.21","dependencies":{"@unbrained/pm-cli":"2026.10.21"}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name":"pm-codex","version":"2026.10.
|
|
1
|
+
{"name":"pm-codex","version":"2026.10.21","description":"Native Codex integration for pm-cli with bundled MCP tools, skills, commands, and agent workflows.","author":{"name":"unbrained","url":"https://github.com/unbraind/pm-cli"},"homepage":"https://github.com/unbraind/pm-cli/tree/main/plugins/pm-codex","repository":"https://github.com/unbraind/pm-cli","license":"MIT","keywords":["pm-cli","codex","mcp","project-management","agents","tasks","workflows"],"skills":"./skills/","mcpServers":"./.mcp.json","interface":{"displayName":"pm CLI","shortDescription":"Native pm tracker tools and agent workflows","longDescription":"Use pm CLI from Codex through native MCP tools instead of shelling out to the pm command. The plugin bundles tracker operations, skills, command prompts, and subagent workflow guidance for planning, execution, validation, release, and audit work.","developerName":"unbrained","category":"Coding","capabilities":["Interactive","Read","Write"],"websiteURL":"https://github.com/unbraind/pm-cli","privacyPolicyURL":"https://github.com/unbraind/pm-cli/blob/main/SECURITY.md","termsOfServiceURL":"https://github.com/unbraind/pm-cli/blob/main/LICENSE","defaultPrompt":["Use pm CLI to orient, claim, track, verify, and close this repository task"],"composerIcon":"./assets/pm-cli-small.svg","logo":"./assets/pm-cli-small.svg","screenshots":[],"brandColor":"#2563EB"}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name":"pm-codex-runtime","private":true,"type":"module","version":"2026.10.
|
|
1
|
+
{"name":"pm-codex-runtime","private":true,"type":"module","version":"2026.10.21","dependencies":{"@unbrained/pm-cli":"2026.10.21"}}
|