@unbrained/pm-cli 2026.10.18 → 2026.10.20
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 +43 -0
- package/dist/cli/error-guidance.d.ts +7 -0
- package/dist/cli/error-guidance.js +2 -2
- package/dist/cli/help-content.js +2 -2
- package/dist/cli/register-mutation.js +2 -2
- package/dist/cli/register-setup.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-PYRREEUB.js → chunk-2GGGOD7P.js} +28 -28
- package/dist/cli-bundle/chunks/chunk-7NHA5K77.js +126 -0
- package/dist/cli-bundle/chunks/chunk-7ZOIZ2AZ.js +8 -0
- package/dist/cli-bundle/chunks/{chunk-4GA4MUTE.js → chunk-GHJOMRSF.js} +2 -2
- package/dist/cli-bundle/chunks/chunk-KU4Q3MSI.js +8 -0
- package/dist/cli-bundle/chunks/chunk-LS55VKRK.js +3 -0
- package/dist/cli-bundle/chunks/chunk-PNPE2OVJ.js +112 -0
- package/dist/cli-bundle/chunks/chunk-PTL3TBT6.js +20 -0
- package/dist/cli-bundle/chunks/chunk-QETMESEB.js +6 -0
- package/dist/cli-bundle/chunks/{chunk-7WIEAGDS.js → chunk-QMZ73FCW.js} +2 -2
- package/dist/cli-bundle/chunks/chunk-QQYCB2LO.js +2 -0
- package/dist/cli-bundle/chunks/chunk-RUKSEZE7.js +2 -0
- package/dist/cli-bundle/chunks/chunk-TZU6U5ZE.js +3 -0
- package/dist/cli-bundle/chunks/chunk-VLJLWZBO.js +70 -0
- package/dist/cli-bundle/chunks/chunk-VS565KBX.js +2 -0
- package/dist/cli-bundle/chunks/chunk-XAWE4EAK.js +2 -0
- package/dist/cli-bundle/chunks/chunk-YECCKB4E.js +3 -0
- package/dist/cli-bundle/chunks/{chunk-FIJOSX2C.js → chunk-YT2Z3JPC.js} +72 -66
- package/dist/cli-bundle/chunks/chunk-YTHI5DTH.js +2 -0
- package/dist/cli-bundle/chunks/{chunk-6VZKYJW7.js → chunk-YW6SIKYP.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-ZZED447K.js → chunk-ZA3XXHEE.js} +6 -6
- package/dist/cli-bundle/chunks/context-budget-recovery-L2WP5S26.js +2 -0
- package/dist/cli-bundle/chunks/indexed-receipt-blobs-U7VGKIYC.js +4 -0
- package/dist/cli-bundle/chunks/{register-list-query-PUCVYYBD.js → register-list-query-NNDV6F6I.js} +3 -3
- package/dist/cli-bundle/chunks/register-mutation-3GCBSNQS.js +20 -0
- package/dist/cli-bundle/chunks/register-operations-YKDGNKUL.js +2 -0
- package/dist/cli-bundle/chunks/register-setup-AOUZQQWB.js +2 -0
- package/dist/cli-bundle/chunks/settlement-hook-CLRGA6O7.js +7 -0
- package/dist/cli-bundle/chunks/stage-6QXYRMSU.js +2 -0
- package/dist/cli-bundle/focused-chunks/chunk-37SU7BZI.js +3 -0
- package/dist/cli-bundle/focused-chunks/chunk-6IU7BESB.js +65 -0
- package/dist/cli-bundle/focused-chunks/chunk-AK2CI2GI.js +2 -0
- package/dist/cli-bundle/focused-chunks/chunk-AS3MOBO3.js +25 -0
- package/dist/cli-bundle/focused-chunks/chunk-AW35RDKA.js +78 -0
- package/dist/cli-bundle/focused-chunks/chunk-E4II2D2B.js +3 -0
- package/dist/cli-bundle/focused-chunks/{chunk-A4ZHHTEX.js → chunk-F7FD25TG.js} +12 -12
- package/dist/cli-bundle/focused-chunks/chunk-FOA7XKWP.js +2 -0
- package/dist/cli-bundle/focused-chunks/{chunk-TB7F4FCR.js → chunk-GYHZ7W6O.js} +2 -2
- package/dist/cli-bundle/focused-chunks/chunk-H5Q2HUU6.js +8 -0
- package/dist/cli-bundle/focused-chunks/chunk-HUZAXSIJ.js +3 -0
- package/dist/cli-bundle/focused-chunks/chunk-J6EYUGAR.js +6 -0
- package/dist/cli-bundle/focused-chunks/chunk-JEXZEIAX.js +91 -0
- package/dist/cli-bundle/focused-chunks/{chunk-BFEMT5U3.js → chunk-KDGUIIRU.js} +3 -3
- package/dist/cli-bundle/focused-chunks/{chunk-ZDBS2DCT.js → chunk-KKRFSI2N.js} +2 -2
- package/dist/cli-bundle/focused-chunks/chunk-LJPUJ2KK.js +2 -0
- package/dist/cli-bundle/focused-chunks/chunk-MQ42BFGX.js +2 -0
- package/dist/cli-bundle/focused-chunks/{chunk-IRVL4UXR.js → chunk-NI6NS44Q.js} +2 -2
- package/dist/cli-bundle/focused-chunks/chunk-VAYS754X.js +2 -0
- package/dist/cli-bundle/focused-chunks/{chunk-Z7YIFCNE.js → chunk-VLSER3XW.js} +2 -2
- package/dist/cli-bundle/focused-chunks/chunk-VS6VTWTZ.js +8 -0
- package/dist/cli-bundle/focused-chunks/chunk-VVRXF4JO.js +2 -0
- package/dist/cli-bundle/focused-chunks/chunk-ZGEK57KD.js +2 -0
- package/dist/cli-bundle/focused-chunks/context-budget-recovery-5MKOCGY5.js +2 -0
- package/dist/cli-bundle/focused-chunks/indexed-receipt-blobs-H2G6CCGO.js +4 -0
- package/dist/cli-bundle/focused-chunks/settlement-hook-5SNBBT7C.js +7 -0
- package/dist/cli-bundle/focused-chunks/stage-EMTISXR7.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 +28 -22
- 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 +66 -53
- 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/output/output.d.ts +7 -2
- package/dist/core/output/output.js +5 -5
- package/dist/core/shared/errors.d.ts +48 -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/bootstrap-command-scanner.js +1 -1
- package/dist/sdk/cli-contracts/flag-contracts.js +1 -1
- package/dist/sdk/cli-contracts/flag-lexicon-contracts.js +1 -1
- package/dist/sdk/cli-contracts/runtime-contracts.d.ts +1 -0
- package/dist/sdk/cli-contracts/runtime-contracts.js +1 -1
- package/dist/sdk/cli-contracts/tool-parameter-tables.js +1 -1
- package/dist/sdk/cli-contracts/tool-schema.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/install-sources.js +3 -3
- package/dist/sdk/extension/shared.js +1 -1
- package/dist/sdk/generated/generated-error-code-catalog-part-1.js +1 -1
- package/dist/sdk/generated/generated-error-code-catalog-part-2.js +1 -1
- package/dist/sdk/governance/health.js +1 -1
- package/dist/sdk/history-repair.js +1 -1
- 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/merge/driver.js +7 -1
- package/dist/sdk/merge/indexed-receipt-blobs.d.ts +2 -0
- package/dist/sdk/merge/indexed-receipt-blobs.js +4 -0
- package/dist/sdk/merge/install.d.ts +8 -0
- package/dist/sdk/merge/install.js +3 -3
- package/dist/sdk/merge/receipts.d.ts +6 -0
- package/dist/sdk/merge/receipts.js +2 -2
- package/dist/sdk/merge/reconcile.d.ts +6 -0
- package/dist/sdk/merge/reconcile.js +1 -1
- package/dist/sdk/merge/settlement-hook.d.ts +12 -0
- package/dist/sdk/merge/settlement-hook.js +7 -0
- package/dist/sdk/merge/stage.d.ts +13 -0
- package/dist/sdk/merge/stage.js +2 -0
- 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/public-surface.json +1 -1
- package/dist/sdk/query/list.js +1 -1
- package/dist/sdk/relationship-context.d.ts +2 -0
- package/dist/sdk/relationship-context.js +1 -1
- package/dist/sdk/runtime-extended-actions.js +1 -1
- package/dist/sdk/structured-mutations.d.ts +2 -0
- package/dist/sdk/structured-mutations.js +1 -1
- package/docs/COMMANDS.md +27 -0
- package/docs/CONFIGURATION.md +14 -0
- package/docs/MERGE_SAFETY.md +88 -5
- package/docs/PR_REVIEW_LOOP.md +32 -12
- package/docs/SCRIPTING.md +10 -0
- package/docs/SDK.md +103 -0
- package/docs/TESTING.md +32 -1
- package/docs/generated/FLAG_LEXICON_BUDGETS.md +2 -2
- package/docs/generated/REFUSAL_CLOSURE_CENSUS.md +6 -3
- 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-4V6ONLI6.js +0 -3
- package/dist/cli-bundle/chunks/chunk-7PATQWTH.js +0 -20
- package/dist/cli-bundle/chunks/chunk-AETP4JEM.js +0 -3
- package/dist/cli-bundle/chunks/chunk-LUKVNL72.js +0 -2
- package/dist/cli-bundle/chunks/chunk-OJ77ZQN3.js +0 -8
- package/dist/cli-bundle/chunks/chunk-RHQJ6VWC.js +0 -237
- package/dist/cli-bundle/chunks/chunk-RNABUEFB.js +0 -80
- package/dist/cli-bundle/chunks/chunk-TO6CIV4C.js +0 -2
- package/dist/cli-bundle/chunks/register-mutation-GGGVBXD5.js +0 -20
- package/dist/cli-bundle/chunks/register-operations-NRZ6Q4QE.js +0 -2
- package/dist/cli-bundle/chunks/register-setup-MV3P3YSF.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-2MPQUMTF.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-5UKCSZWT.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-B4YLP5ZB.js +0 -3
- package/dist/cli-bundle/focused-chunks/chunk-FW7CSSKL.js +0 -75
- package/dist/cli-bundle/focused-chunks/chunk-HYPRPSYD.js +0 -3
- package/dist/cli-bundle/focused-chunks/chunk-L55KQ2KT.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-MASIOFPG.js +0 -8
- package/dist/cli-bundle/focused-chunks/chunk-RJ3EIHDU.js +0 -26
- package/dist/cli-bundle/focused-chunks/chunk-SEL4Z2OO.js +0 -167
- package/dist/cli-bundle/focused-chunks/chunk-TZUIBG3P.js +0 -2
package/docs/MERGE_SAFETY.md
CHANGED
|
@@ -286,6 +286,28 @@ receipt file that the older writer never created. Incomplete, contradictory, or
|
|
|
286
286
|
modern summaries still fail closed. `runMergeReceiptReport` remains the
|
|
287
287
|
compatible valid-only report.
|
|
288
288
|
|
|
289
|
+
## Portable receipt proof
|
|
290
|
+
|
|
291
|
+
Reconciliation refuses `merge_receipt_not_portable` before any audit write when
|
|
292
|
+
an active clone-local receipt lacks a validated tracked counterpart. `--force`
|
|
293
|
+
does not bypass this boundary, including for direct SDK history-repair calls.
|
|
294
|
+
An earlier aborted operation can leave an unreferenced local receipt whose field
|
|
295
|
+
hashes happen to match a later merge; those hashes do not make its evidence
|
|
296
|
+
portable. Review and preserve unrelated stale receipts outside the active store,
|
|
297
|
+
or restore the original valid durable sidecar. Never copy private local receipt
|
|
298
|
+
values into tracked evidence as a substitute.
|
|
299
|
+
|
|
300
|
+
`inspectMergeReceiptEvidence().durable_receipt_ids` identifies validated durable
|
|
301
|
+
counterparts whose immutable provenance matches the stored blob referenced by the Git index;
|
|
302
|
+
clone-local replacement refs cannot substitute different evidence.
|
|
303
|
+
Untracked files and mismatched staged versions cannot authorize an audit write.
|
|
304
|
+
`unstaged_durable_receipt_ids` reports valid disk candidates for a read-only
|
|
305
|
+
preview; clone-local-only evidence remains refused even in preview. Current readers
|
|
306
|
+
return both arrays; their optional interface properties preserve structural compatibility,
|
|
307
|
+
and a missing property provides no evidence. Health resolves committed history
|
|
308
|
+
references against these durable identities, so a local copy cannot hide evidence
|
|
309
|
+
that a fresh clone will lack. Receipt summaries remain privacy-safe.
|
|
310
|
+
|
|
289
311
|
## Historical receipt reader compatibility
|
|
290
312
|
|
|
291
313
|
Tracked by [pm-2xtv84](../.agents/pm/issues/pm-2xtv84.toon) and
|
|
@@ -388,8 +410,13 @@ pm config project set ids_token_length 8
|
|
|
388
410
|
|
|
389
411
|
The SDK item merge refuses an empty common ancestor with
|
|
390
412
|
`item_identity_conflict`, even for equal item content: document equality alone
|
|
391
|
-
cannot prove a common creation.
|
|
392
|
-
|
|
413
|
+
cannot prove a common creation. The pure merge primitive leaves inputs unchanged.
|
|
414
|
+
The Git driver preserves both original snapshots in visible conflict markers
|
|
415
|
+
and names the item in its refusal, tracked by
|
|
416
|
+
[pm-gh1491](../.agents/pm/issues/pm-gh1491.toon). Staging these files does not
|
|
417
|
+
clear the conflict-marker health and storage failures. A copied creation or
|
|
418
|
+
history prefix alone never authorizes fusion of two independently introduced
|
|
419
|
+
identities. The history merge also
|
|
393
420
|
refuses different create events across its inputs, multiple creates in either
|
|
394
421
|
input, or creations on both sides when the ancestor lacks a create event even
|
|
395
422
|
when their bytes match, before fast-forwarding or reanchoring. A common ancestor
|
|
@@ -432,6 +459,54 @@ N-branch conflict fixture compares competing writes to the same scalar set.
|
|
|
432
459
|
Arbitrary histories, ordered executable test definitions with receiving-clone
|
|
433
460
|
trust, and relationship-event ordering retain their separate conformance contracts.
|
|
434
461
|
|
|
462
|
+
## Settle a lossless merge in one commit
|
|
463
|
+
|
|
464
|
+
Tracked by [pm-gh1475](../.agents/pm/issues/pm-gh1475.toon).
|
|
465
|
+
Pause Git before it creates the merge commit, then stage the audited settlement:
|
|
466
|
+
|
|
467
|
+
```bash
|
|
468
|
+
git merge --no-commit --no-ff <branch>
|
|
469
|
+
pm merge reconcile --stage
|
|
470
|
+
git diff --cached
|
|
471
|
+
git commit
|
|
472
|
+
```
|
|
473
|
+
|
|
474
|
+
`--stage` first previews reconciliation. It refuses discarded-value decisions,
|
|
475
|
+
untrusted or unrelated repairs, invalid storage, missing durable evidence,
|
|
476
|
+
unresolved Git paths, alternate Git indices, and unstaged edits to the reconciliation paths. It never
|
|
477
|
+
accepts `--force`. Only the verified history streams and receipt sidecars are
|
|
478
|
+
added to the index; unrelated staged changes retain their existing state.
|
|
479
|
+
Validated new sidecars enter the index before any audit history is written.
|
|
480
|
+
If apply fails, their new index entries are reverted while their files and
|
|
481
|
+
unrelated staged work remain available for review. Staged receipt deletions
|
|
482
|
+
remain operator decisions and are refused.
|
|
483
|
+
`--stage --dry-run` checks this boundary without applying or staging anything.
|
|
484
|
+
The result's `staged_paths` lists the repository-relative artifacts added.
|
|
485
|
+
Tracker aliases resolve before preview, so proof verification, repair and staging
|
|
486
|
+
use the same physical tracker root.
|
|
487
|
+
|
|
488
|
+
Repositories can explicitly opt into a merge-aware `pre-commit` hook:
|
|
489
|
+
|
|
490
|
+
```bash
|
|
491
|
+
pm merge install --pre-commit-hook --dry-run
|
|
492
|
+
pm merge install --pre-commit-hook
|
|
493
|
+
git merge --no-commit --no-ff <branch>
|
|
494
|
+
git commit
|
|
495
|
+
```
|
|
496
|
+
|
|
497
|
+
The hook runs guarded settlement only when `MERGE_HEAD` exists; ordinary commits
|
|
498
|
+
are unchanged. Installation honors Git's hooks directory, including
|
|
499
|
+
`core.hooksPath`, and preserves any hook without the pm ownership header. For
|
|
500
|
+
an existing hook, integrate `pm merge reconcile --stage` into the reviewed merge
|
|
501
|
+
path yourself. The installation result reports `settlement_hook.path`; removing
|
|
502
|
+
that owned hook restores the manual workflow. Hooks are clone-local and must be
|
|
503
|
+
installed explicitly in each clone. No hook is installed by default.
|
|
504
|
+
|
|
505
|
+
The explicit `--no-commit --no-ff` step is required. Git's automatic merge commit
|
|
506
|
+
can capture its tree before a `pre-merge-commit` hook stages new audit artifacts;
|
|
507
|
+
that hook cannot provide this single-commit guarantee. Rebase and already
|
|
508
|
+
committed merges continue to use the explicit reconciliation gate below.
|
|
509
|
+
|
|
435
510
|
## Required post-merge gate
|
|
436
511
|
|
|
437
512
|
Reconciliation resolves receipt discovery and settlement from the requested
|
|
@@ -443,12 +518,20 @@ After every branch merge that touches `.agents/pm`, run:
|
|
|
443
518
|
|
|
444
519
|
```bash
|
|
445
520
|
pm merge reconcile --dry-run --json
|
|
521
|
+
# When the preview lists unstaged sidecars, review and stage those files first.
|
|
446
522
|
pm merge reconcile --message "Reconcile merged tracker histories" --json
|
|
447
523
|
# Required only to accept a receipt that lacks qualifying exact hash proof:
|
|
448
524
|
pm merge reconcile --force --message "Accept reviewed merge decisions" --json
|
|
449
525
|
```
|
|
450
526
|
|
|
451
527
|
The preview reports every drifted stream and pending receipt without mutation.
|
|
528
|
+
`unstaged_durable_receipt_ids` identifies valid filesystem sidecars awaiting
|
|
529
|
+
matching immutable evidence in the Git index. The preview can inspect those
|
|
530
|
+
sidecars, but ordinary apply refuses to cite them until they are staged. For the
|
|
531
|
+
default tracker their paths are `.agents/pm/merge-receipts/<receipt-id>.json`;
|
|
532
|
+
use `git add -- <reviewed sidecar paths>` followed by `git diff --cached`. Use
|
|
533
|
+
`--stage` for the guarded lossless workflow above. After ordinary apply, stage
|
|
534
|
+
the updated history and receipt lifecycle files together before committing.
|
|
452
535
|
It applies the same exact-snapshot proof requirement as apply: stale or
|
|
453
536
|
unprovable receipts appear as failed streams in both modes, tracked by
|
|
454
537
|
[pm-ao0bu9](../.agents/pm/issues/pm-ao0bu9.toon).
|
|
@@ -514,9 +597,9 @@ The apply pass uses the audited history rewrite boundary to append a
|
|
|
514
597
|
event includes privacy-safe receipt provenance; a clean receipt-bearing stream
|
|
515
598
|
gets a no-op merge event so the merge remains addressable even when replay
|
|
516
599
|
already matches. The command immediately validates history drift plus storage
|
|
517
|
-
integrity and exits nonzero when an invariant remains red. Default Git hooks
|
|
518
|
-
|
|
519
|
-
|
|
600
|
+
integrity and exits nonzero when an invariant remains red. Default Git hooks remain unchanged. The explicit merge-aware pre-commit option
|
|
601
|
+
above includes settlement before committing; a repository-owned post-merge hook
|
|
602
|
+
can still enforce reconciliation after an already-created merge commit.
|
|
520
603
|
|
|
521
604
|
The default validation surface includes `storage_integrity`. It fails on unreadable item documents, history conflict markers, malformed history tails, live items whose latest history operation is `delete` (a delete/modify resurrection candidate), and unparseable settings/schema files. This prevents the ordinary tolerant read path from turning corruption into a green gate.
|
|
522
605
|
|
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
|
@@ -210,6 +210,32 @@ follow the migration guidance for changed unions or error codes. The shared
|
|
|
210
210
|
[primitive inventory](SDK_PRIMITIVE_INVENTORY.md) records CLI/MCP ownership:
|
|
211
211
|
presentation modules import the SDK and have zero private-core edges.
|
|
212
212
|
|
|
213
|
+
### Portable merge settlement
|
|
214
|
+
|
|
215
|
+
Tracked by [pm-gh1475](../.agents/pm/issues/pm-gh1475.toon) and
|
|
216
|
+
[pm-gh1491](../.agents/pm/issues/pm-gh1491.toon). Import `runMergeInstall`,
|
|
217
|
+
`runMergeReconcile`, and `inspectMergeReceiptEvidence` from
|
|
218
|
+
`@unbrained/pm-cli/sdk/merge`. `runMergeInstall({ preCommitHook: true }, global)`
|
|
219
|
+
explicitly installs the merge-aware pre-commit hook; the default installs no hook.
|
|
220
|
+
`runMergeReconcile({ stage: true }, global)` previews first and stages only
|
|
221
|
+
verified lossless history and receipt artifacts. It refuses forced acceptance,
|
|
222
|
+
competing values, unrelated drift, dirty reconciliation paths and unresolved Git
|
|
223
|
+
paths. `staged_paths` reports exactly which relative paths were added to the index.
|
|
224
|
+
|
|
225
|
+
The single-commit journey pauses Git with `git merge --no-commit --no-ff` before
|
|
226
|
+
reconciliation or an opted-in pre-commit hook runs. `durable_receipt_ids` on the
|
|
227
|
+
inspection result reports counterparts with matching immutable provenance in
|
|
228
|
+
the active Git index. `unstaged_durable_receipt_ids` separates valid filesystem
|
|
229
|
+
sidecars that a read-only preview may inspect. Guarded staging prepares new
|
|
230
|
+
sidecars before auditing and restores their new index entries if apply fails.
|
|
231
|
+
Inspection lists indexed candidates once and reads bounded object batches.
|
|
232
|
+
Guarded settlement resolves tracker aliases before preview, proof verification
|
|
233
|
+
and apply, so every phase uses the same physical tracker root.
|
|
234
|
+
Ordinary apply requires indexed proof first. Missing portable proof
|
|
235
|
+
refuses an audit write even with `force`; local receipts alone cannot authorize
|
|
236
|
+
committed history references. See [Merge safety](MERGE_SAFETY.md#settle-a-lossless-merge-in-one-commit)
|
|
237
|
+
for the complete operator workflow and recovery boundaries.
|
|
238
|
+
|
|
213
239
|
### Build an entire custom project tool
|
|
214
240
|
|
|
215
241
|
The [SDK-only custom-tool exemplar](examples/sdk-custom-tool/README.md)
|
|
@@ -1356,6 +1382,22 @@ handlers remain disabled. Package-backed `--template` create input cannot be
|
|
|
1356
1382
|
semantically previewed through its package handler; expand it into explicit core
|
|
1357
1383
|
mutation options before preview.
|
|
1358
1384
|
|
|
1385
|
+
Actionable previews are tracked by [pm-ekf2gu](../.agents/pm/issues/pm-ekf2gu.toon)
|
|
1386
|
+
and [pm-fa9olc](../.agents/pm/tasks/pm-fa9olc.toon).
|
|
1387
|
+
`previewItemMutations` returns `warnings` grouped by zero-based operation
|
|
1388
|
+
`index`, canonical `id`, and `op`. These are the original create lifecycle
|
|
1389
|
+
warnings, including advisory `likely_duplicates` and duplicate-recovery tokens.
|
|
1390
|
+
Earlier staged creates participate in later duplicate checks. Strict policy
|
|
1391
|
+
still refuses duplicates; preview never changes the configured policy.
|
|
1392
|
+
|
|
1393
|
+
For a document resolved with `planItemMutationDocument`, call
|
|
1394
|
+
`previewItemMutationDocument({ pmRoot, author, plan })` from the aggregate SDK.
|
|
1395
|
+
It returns `{ validation, rows }`; affected rows retain their source `index`
|
|
1396
|
+
and `ref` and gain `warnings`. Rows without warnings omit that property. The
|
|
1397
|
+
input plan stays unchanged. Both `pm item mutate --dry-run` and MCP `pm_mutate`
|
|
1398
|
+
use this same projection. A `replayed_committed_plan` has no newly evaluated
|
|
1399
|
+
warnings; an empty warning list in that state does not certify current policy.
|
|
1400
|
+
|
|
1359
1401
|
Staging excludes derived `search` and `locks` content and unrelated runtime state,
|
|
1360
1402
|
retaining registered item folders, explicitly configured schema files, and
|
|
1361
1403
|
`runtime/session.json` for core focus and inherited-parent semantics. Root-layout
|
|
@@ -1369,6 +1411,17 @@ remapped only in the staged settings. Schema files configured outside the
|
|
|
1369
1411
|
tracker fail with `transaction_preview_external_schema`; relocate them inside
|
|
1370
1412
|
the selected tracker root before retrying.
|
|
1371
1413
|
|
|
1414
|
+
`transaction_preview_non_regular_file` includes `preview_storage` in SDK error
|
|
1415
|
+
context and the CLI JSON error envelope. It reports a fixed `storage_area`,
|
|
1416
|
+
`entry_redacted`, and, when safe, `relative_entry` using `/` separators relative
|
|
1417
|
+
to the selected tracker root. Coordinates are limited to 160 ASCII characters
|
|
1418
|
+
from letters, digits, `.`, `_`, `-`, and separators. Absolute paths, traversal,
|
|
1419
|
+
control characters and overlong or otherwise unsafe names are withheld; the
|
|
1420
|
+
storage category remains available. Diagnostics never include link targets.
|
|
1421
|
+
Inspect that entry without following links, restore the intended regular file
|
|
1422
|
+
or directory, and retry the dry run. Native filesystem errors retain their
|
|
1423
|
+
existing diagnostics.
|
|
1424
|
+
|
|
1372
1425
|
Preview requires trusted, stable directory entries and ancestors. Where Node
|
|
1373
1426
|
exposes `O_NOFOLLOW` and `O_NONBLOCK`, descriptor opens request those POSIX guards.
|
|
1374
1427
|
Windows retains entry checks, regular-file descriptor checks and snapshot
|
|
@@ -1614,6 +1667,13 @@ trees, custom runtime fields, dependency-aware filtering, unsupported filters,
|
|
|
1614
1667
|
and stale/missing indexes take the canonical fallback path with identical
|
|
1615
1668
|
result contracts. Custom hosts may call `queryItemMetadataIndex` directly, but
|
|
1616
1669
|
must treat `null` as an instruction to rebuild or use authoritative storage.
|
|
1670
|
+
The separate history-event index is also optional. Recognized native SQLite
|
|
1671
|
+
failures while starting its write transaction invalidate that projection before
|
|
1672
|
+
appending authoritative history. Native lock contention retains its existing
|
|
1673
|
+
invalidation protocol; unrelated adapter exceptions and authoritative append
|
|
1674
|
+
failures propagate. A later index rebuild restores accelerated history reads.
|
|
1675
|
+
(Repository tracker: [pm-0orupq](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/tasks/pm-0orupq.toon);
|
|
1676
|
+
tracker records are excluded from npm.)
|
|
1617
1677
|
|
|
1618
1678
|
List results always expose `total`, `has_more`, `truncated`, and a nullable
|
|
1619
1679
|
`next_cursor`, whether or not the page was truncated; unset filter echoes are
|
|
@@ -1662,6 +1722,16 @@ true. The normal JSON envelope remains unchanged, and an actionable cursor is
|
|
|
1662
1722
|
always retained. SDK query functions continue returning their full typed
|
|
1663
1723
|
results; lean projection belongs to the CLI presentation boundary.
|
|
1664
1724
|
|
|
1725
|
+
Custom agent hosts can import `projectPmBriefListEnvelope` from
|
|
1726
|
+
`@unbrained/pm-cli/sdk` to apply the same brief-list presentation without
|
|
1727
|
+
mutating the original result. It retains unchecked source status and actionable
|
|
1728
|
+
continuation, and leaves partial, custom, or inconsistent envelopes intact.
|
|
1729
|
+
The CLI applies this projection only to TOON; ordinary JSON and SDK query
|
|
1730
|
+
results retain their complete contracts. The public `encodePmTableRows` and
|
|
1731
|
+
`decodePmTableRows` primitives distinguish explicit null and empty cells from
|
|
1732
|
+
missing keys. TOON rendering preserves those row facts before selecting the
|
|
1733
|
+
smaller expanded or tabular encoding.
|
|
1734
|
+
|
|
1665
1735
|
Migration note: before this contract, `total` was present only when pagination
|
|
1666
1736
|
omitted rows, a completed page omitted `next_cursor`, and verbose results
|
|
1667
1737
|
emitted unset filter keys with `null` values. Consumers must use `has_more` or
|
|
@@ -2442,6 +2512,39 @@ throw createPmCliExpectedError("hello requires --name", {
|
|
|
2442
2512
|
|
|
2443
2513
|
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.
|
|
2444
2514
|
|
|
2515
|
+
For example, the SDK command layer settles relationship token counts after alias
|
|
2516
|
+
counts, read disclosure, encoding and optional lean/token-accounting policies.
|
|
2517
|
+
It converts an impossible rendered context budget into an expected
|
|
2518
|
+
`invalid_argument_value` usage error. The public `PmTokenBudgetRecovery` type and
|
|
2519
|
+
`isPmTokenBudgetRecovery` guard describe `context.recovery.token_budget`: requested
|
|
2520
|
+
tokens, a verified feasible retry value, and an exact minimum only when every
|
|
2521
|
+
smaller positive budget has been checked. Larger searches report `feasible_only`;
|
|
2522
|
+
query cost limits, exhausted searches or independent output constraints can report
|
|
2523
|
+
`unavailable`. Both states leave the unproved minimum `null`. The bounded search
|
|
2524
|
+
uses the real packer and output policy, including alias disclosure.
|
|
2525
|
+
The public type is a discriminated union: checking `minimum_status` narrows the
|
|
2526
|
+
verified budgets and requires a reason for `unavailable`. Package authors cannot
|
|
2527
|
+
declare unavailable advice with a numeric budget or omit its cause. The runtime
|
|
2528
|
+
guard additionally checks positive safe integers and equal budgets for `exact`;
|
|
2529
|
+
those numeric invariants cannot be expressed by the declaration alone.
|
|
2530
|
+
`suggested_retry_args` preserves the selected tracker, query and output options
|
|
2531
|
+
with the verified feasible budget so it works from another workspace.
|
|
2532
|
+
Retry probes consume canonical summary/full include modes before packing and
|
|
2533
|
+
retain only residual field selectors, matching the emitted CLI command. Recovery
|
|
2534
|
+
work estimates include repeated dangling-reference renders; summary probes count
|
|
2535
|
+
only their single rendering pass. Expensive queries return explicit unavailable
|
|
2536
|
+
budget advice and retain the compact inspection fallback.
|
|
2537
|
+
`next_best_command` retains a separate compact tree-summary inspection, which
|
|
2538
|
+
also supplies the fallback when no working context budget is established.
|
|
2539
|
+
CLI JSON and MCP preserve that recovery. The lower-level
|
|
2540
|
+
`buildRelationshipContext` primitive retains its `TypeError` validation contract;
|
|
2541
|
+
unrelated runtime errors still propagate.
|
|
2542
|
+
(Repository tracker: [pm-odw3j8](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/tasks/pm-odw3j8.toon),
|
|
2543
|
+
[pm-0bbc53](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/tasks/pm-0bbc53.toon),
|
|
2544
|
+
[pm-k6uglj](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/tasks/pm-k6uglj.toon),
|
|
2545
|
+
[pm-8jzcwv](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/tasks/pm-8jzcwv.toon);
|
|
2546
|
+
tracker records are excluded from npm.)
|
|
2547
|
+
|
|
2445
2548
|
For policy, lint, or verification commands that should render their full result
|
|
2446
2549
|
and report failure without throwing, return a structured object instead:
|
|
2447
2550
|
|
package/docs/TESTING.md
CHANGED
|
@@ -49,6 +49,13 @@ 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
|
+
|
|
52
59
|
`node scripts/run-tests.mjs` wraps Vitest in temporary tracker roots, disables
|
|
53
60
|
external Sentry delivery for the build, test workers, and their nested CLI
|
|
54
61
|
children, then cleans the roots up. Instrumentation tests can still exercise
|
|
@@ -97,6 +104,13 @@ so PR-local CodeFactor maintainability annotations fail locally before commit or
|
|
|
97
104
|
push. Existing legacy high-complexity test fixtures are tracked separately and
|
|
98
105
|
must not be used as precedent for new changed production/script code.
|
|
99
106
|
|
|
107
|
+
Module-usage checks share the SDK boundary's literal-specifier parser and walk
|
|
108
|
+
nested AST nodes, including lazy `import("./module.js")` references. Unused
|
|
109
|
+
modules, comment-only references, and computed paths do not gain incoming
|
|
110
|
+
references. The regression is tracked by
|
|
111
|
+
[pm-f38ovr](../.agents/pm/issues/pm-f38ovr.toon); no module allowance or threshold
|
|
112
|
+
increase is required to keep optional SDK capabilities lazy.
|
|
113
|
+
|
|
100
114
|
The same required static gate validates an explicit seven-day Dependabot
|
|
101
115
|
cooldown for every updater and requires both npm and GitHub Actions entries.
|
|
102
116
|
Missing values, semver overrides outside 7–90 days, invalid YAML, removed
|
|
@@ -237,6 +251,22 @@ into the pass count; a persistent assertion still fails after the bounded
|
|
|
237
251
|
retry. Local runs do not retry, so deterministic failures stay immediate while
|
|
238
252
|
iterating.
|
|
239
253
|
|
|
254
|
+
The complete receipt-operation, aborted-operation recovery, receipt-settlement, merge-portability and
|
|
255
|
+
lossless-collection-union integration files run in the existing serial
|
|
256
|
+
`lifecycle-performance` project after parallel contracts. Both nightly shards and
|
|
257
|
+
full coverage use that same project partition, retaining every case and its
|
|
258
|
+
original assertions, deadlines and retry policy. This allocation is tracked by
|
|
259
|
+
[pm-89297t](../.agents/pm/tasks/pm-89297t.toon); it does not classify or erase
|
|
260
|
+
historical failed attempts.
|
|
261
|
+
|
|
262
|
+
The complete macOS Node 24 and Windows Node 24 nightly suites each use two
|
|
263
|
+
Vitest shards. Both halves must pass within the existing 20-minute job limit;
|
|
264
|
+
sharding retains the same complete file population, serial phase, assertions,
|
|
265
|
+
per-test deadlines and retry policy. The recurrence collector retains the old
|
|
266
|
+
unsharded platform families alongside both current shard identities, so changing
|
|
267
|
+
the matrix does not erase earlier failures. macOS allocation is tracked by
|
|
268
|
+
[pm-qrirz8](../.agents/pm/tasks/pm-qrirz8.toon).
|
|
269
|
+
|
|
240
270
|
Vitest's GitHub reporter emits annotations and retry evidence. The repository
|
|
241
271
|
reliability reporter additionally writes
|
|
242
272
|
`.vitest-reports/reliability-<shard>.json` and appends a job-summary table with
|
|
@@ -661,7 +691,8 @@ pm test <item-id> --run --workspace-context snapshot --override-linked-workspace
|
|
|
661
691
|
Windows execution is tracked by [pm-bj7rq0](../.agents/pm/issues/pm-bj7rq0.toon).
|
|
662
692
|
Script and native keeper cohorts run independently on Windows Node 24. Their
|
|
663
693
|
source/script keeper steps retain the two-worker cap, and each cohort retains
|
|
664
|
-
the 12-minute deadline. The
|
|
694
|
+
the 12-minute deadline. The four-file Git/worktree receipt slice uses one
|
|
695
|
+
worker to avoid competing subprocess-heavy files at the same case deadlines. The required
|
|
665
696
|
`Windows regression (Node 24)` check waits for both cohorts and fails if either
|
|
666
697
|
fails, is cancelled, or is skipped. This preserves every selected regression
|
|
667
698
|
while avoiding a shared serial job deadline. See GitHub's
|
|
@@ -39,7 +39,7 @@ This file is generated by `listPmFlagLexicon()`. Compatibility aliases do not co
|
|
|
39
39
|
| `history-repair` | evidence | 27 | 27 |
|
|
40
40
|
| `history-compact` | evidence | 30 | 30 |
|
|
41
41
|
| `history-author-acknowledge` | evidence | 28 | 28 |
|
|
42
|
-
| `merge` | workspace |
|
|
42
|
+
| `merge` | workspace | 29 | 29 |
|
|
43
43
|
| `schema` | workspace | 43 | 43 |
|
|
44
44
|
| `profile` | workspace | 22 | 22 |
|
|
45
45
|
| `activity` | context | 35 | 35 |
|
|
@@ -110,7 +110,7 @@ This file is generated by `listPmFlagLexicon()`. Compatibility aliases do not co
|
|
|
110
110
|
| `item test worker` | internal | 20 | 20 |
|
|
111
111
|
| `history acknowledge` | evidence | 28 | 28 |
|
|
112
112
|
| `item copy` | intake | 24 | 24 |
|
|
113
|
-
| `workspace merge` | workspace |
|
|
113
|
+
| `workspace merge` | workspace | 29 | 29 |
|
|
114
114
|
| `item duplicates` | context | 25 | 25 |
|
|
115
115
|
| `calendar meet` | automation | 33 | 33 |
|
|
116
116
|
| `calendar event` | automation | 33 | 33 |
|
|
@@ -4,12 +4,12 @@ Tracker: `pm-f05lsg`.
|
|
|
4
4
|
|
|
5
5
|
Every catalog code is listed. An `uncovered` row is an explicit closure obligation, never an omission or implied approval.
|
|
6
6
|
|
|
7
|
-
- Catalog error codes:
|
|
7
|
+
- Catalog error codes: 422
|
|
8
8
|
- Executable error codes: 19
|
|
9
9
|
- Executable-code ratchet floor: 18
|
|
10
10
|
- Required executable canonical codes: `bulk_ids_input_empty`, `bulk_ids_input_missing_path`, `bulk_ids_input_unreadable`, `invalid_argument_value`, `manifest_unknown_key`, `missing_lifecycle_target`, `missing_required_argument`, `no_version_bounds_declared`, `projection_options_mutually_exclusive`, `tracker_not_initialized`, `tracker_root_missing`, `tracker_root_not_directory`, `tracker_root_unreadable`, `unknown_context_intent`, `unknown_field_projection`, `unknown_option`, `unknown_subcommand`
|
|
11
|
-
- Uncovered error codes:
|
|
12
|
-
- Coverage fraction: 0.
|
|
11
|
+
- Uncovered error codes: 403
|
|
12
|
+
- Coverage fraction: 0.045024
|
|
13
13
|
- Closed-domain probes: 19
|
|
14
14
|
- Grammar probes: 117
|
|
15
15
|
|
|
@@ -221,9 +221,12 @@ Every catalog code is listed. An `uncovered` row is an explicit closure obligati
|
|
|
221
221
|
| `merge_git_config_unwritable` | `merge_git_config_unwritable` | uncovered | none | 0 |
|
|
222
222
|
| `merge_receipt_evidence_invalid` | `merge_receipt_evidence_invalid` | uncovered | none | 0 |
|
|
223
223
|
| `merge_receipt_history_reference_missing` | `merge_receipt_history_reference_missing` | uncovered | none | 0 |
|
|
224
|
+
| `merge_receipt_not_portable` | `merge_receipt_not_portable` | uncovered | none | 0 |
|
|
224
225
|
| `merge_receipts_pending` | `merge_receipts_pending` | uncovered | none | 0 |
|
|
225
226
|
| `merge_reconcile_receipt_evidence_untrusted` | `merge_reconcile_receipt_evidence_untrusted` | uncovered | none | 0 |
|
|
226
227
|
| `merge_root_not_found` | `merge_root_not_found` | uncovered | none | 0 |
|
|
228
|
+
| `merge_settlement_hook_conflict` | `merge_settlement_hook_conflict` | uncovered | none | 0 |
|
|
229
|
+
| `merge_settlement_review_required` | `merge_settlement_review_required` | uncovered | none | 0 |
|
|
227
230
|
| `missing_allowed_values` | `missing_allowed_values` | uncovered | none | 0 |
|
|
228
231
|
| `missing_budget` | `missing_budget` | uncovered | none | 0 |
|
|
229
232
|
| `missing_cli_flag` | `missing_cli_flag` | uncovered | none | 0 |
|
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.20","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.20","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.20","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.20","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.20","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.20","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.20","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.20","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.20","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.20","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.20","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.20","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"]}}
|