@unbrained/pm-cli 2026.10.7 → 2026.10.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +2 -2
- package/CHANGELOG.md +15 -0
- package/dist/cli-bundle/bundle-manifest.json +152 -152
- package/dist/cli-bundle/chunks/chunk-34L2BS2Z.js +3 -0
- package/dist/cli-bundle/chunks/chunk-FOLSEOJ2.js +20 -0
- package/dist/cli-bundle/chunks/{chunk-A4QWRU7D.js → chunk-HFCIAXLP.js} +5 -5
- package/dist/cli-bundle/chunks/chunk-JDTBPW4Y.js +2 -0
- package/dist/cli-bundle/chunks/{chunk-TG3IOQUG.js → chunk-K6E2FFUT.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-VU77O6HC.js → chunk-L7U5FSZ5.js} +2 -2
- package/dist/cli-bundle/chunks/{chunk-N2PFAWVV.js → chunk-MJVRF67I.js} +3 -3
- package/dist/cli-bundle/chunks/{chunk-GJ2OJKRM.js → chunk-OG66KEOF.js} +79 -79
- package/dist/cli-bundle/chunks/{chunk-MOXX7D3F.js → chunk-RCFZ6H2Y.js} +2 -2
- package/dist/cli-bundle/chunks/chunk-TNU56MZI.js +8 -0
- package/dist/cli-bundle/chunks/chunk-UGFN5NJ2.js +2 -0
- package/dist/cli-bundle/chunks/{chunk-TON7H63A.js → chunk-ZBVAZ7XX.js} +53 -52
- package/dist/cli-bundle/chunks/{chunk-DWH555SN.js → chunk-ZHIMZ65M.js} +16 -16
- package/dist/cli-bundle/chunks/{register-list-query-CBJELTDX.js → register-list-query-PYVSPGPV.js} +2 -2
- package/dist/cli-bundle/chunks/{register-mutation-JRH6EGSE.js → register-mutation-WXP3YLIN.js} +2 -2
- package/dist/cli-bundle/chunks/register-operations-WL25C3NP.js +2 -0
- package/dist/cli-bundle/chunks/register-setup-PFKYNEQI.js +2 -0
- package/dist/cli-bundle/focused-chunks/chunk-2KSPGWLH.js +20 -0
- package/dist/cli-bundle/focused-chunks/{chunk-PBNQZV33.js → chunk-6TKAFFEB.js} +2 -2
- package/dist/cli-bundle/focused-chunks/{chunk-EPOCI7ZX.js → chunk-A3W6HFFO.js} +2 -2
- package/dist/cli-bundle/focused-chunks/{chunk-2YICTWWA.js → chunk-BDT5EALU.js} +2 -2
- package/dist/cli-bundle/focused-chunks/{chunk-3BKRCR57.js → chunk-DRHJOG5X.js} +2 -2
- package/dist/cli-bundle/focused-chunks/{chunk-XIGFEA3W.js → chunk-EOUORVJA.js} +2 -2
- package/dist/cli-bundle/focused-chunks/chunk-F2ME5MJY.js +3 -0
- package/dist/cli-bundle/focused-chunks/{chunk-QY4Z23QC.js → chunk-L3CZNKZE.js} +11 -11
- package/dist/cli-bundle/focused-chunks/{chunk-QEYEDXRI.js → chunk-LZQGEVKT.js} +2 -2
- package/dist/cli-bundle/focused-chunks/{chunk-FWWFCLDM.js → chunk-MW2TQHZ3.js} +60 -59
- package/dist/cli-bundle/focused-chunks/{chunk-HMG5F5EC.js → chunk-OLCJ2PJS.js} +2 -2
- package/dist/cli-bundle/focused-chunks/{chunk-SIR5RFJX.js → chunk-OSKXYRYZ.js} +27 -27
- package/dist/cli-bundle/focused-chunks/{chunk-NRSA5ZB2.js → chunk-PBPPIGUL.js} +2 -2
- package/dist/cli-bundle/focused-chunks/{chunk-7X3QD5V4.js → chunk-PEBOVLEG.js} +2 -2
- package/dist/cli-bundle/focused-chunks/{chunk-4FKCHJGV.js → chunk-V3EPBB6V.js} +2 -2
- package/dist/cli-bundle/focused-chunks/{chunk-3NSZ5C4A.js → chunk-XT7JAVHI.js} +2 -2
- package/dist/cli-bundle/main.js +2 -2
- package/dist/cli-bundle/sdk-authoring.js +1 -1
- package/dist/cli-bundle/sdk-contracts.js +1 -1
- package/dist/cli-bundle/sdk-core.js +2 -2
- 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 +51 -50
- package/dist/cli-bundle/sdk-query.js +1 -1
- package/dist/cli-bundle/sdk-runtime.js +1 -1
- package/dist/cli-bundle/sdk-testing.js +1 -1
- package/dist/cli-bundle/sdk.js +4 -4
- package/dist/core/extensions/item-fields.d.ts +6 -1
- package/dist/core/extensions/item-fields.js +1 -1
- package/dist/core/fs/fs-utils.d.ts +19 -4
- package/dist/core/fs/fs-utils.js +2 -2
- package/dist/core/lock/lock.d.ts +9 -2
- package/dist/core/lock/lock.js +2 -2
- package/dist/core/store/settings.js +2 -2
- package/dist/core/telemetry/runtime.d.ts +1 -1
- package/dist/core/telemetry/runtime.js +4 -4
- package/dist/sdk/generated/generated-error-code-catalog-part-2.js +1 -1
- package/dist/sdk/governance/health.js +2 -2
- package/dist/sdk/history-repair.js +1 -1
- package/dist/sdk/item-transaction.js +1 -1
- package/dist/sdk/merge/abandoned-receipts.js +1 -1
- package/dist/sdk/merge/driver.js +1 -1
- package/dist/sdk/merge/install.js +3 -2
- package/dist/sdk/merge/receipt-operation.d.ts +5 -5
- package/dist/sdk/merge/receipt-operation.js +1 -1
- package/dist/sdk/merge/receipts.d.ts +1 -1
- package/dist/sdk/merge/receipts.js +3 -3
- package/dist/sdk/merge/worktree-config.d.ts +2 -0
- package/dist/sdk/merge/worktree-config.js +1 -1
- package/dist/sdk/public-surface.json +1 -1
- package/docs/BUILD_AND_RELEASE_ACCEPTANCE.md +36 -100
- package/docs/MERGE_SAFETY.md +61 -6
- package/docs/PACKED_FIRST_RUN.md +26 -42
- package/docs/README.md +1 -0
- package/docs/SDK_AUDITED_MUTATIONS.md +18 -0
- package/docs/SDK_STORAGE_LIFECYCLE.md +35 -0
- package/docs/generated/REFUSAL_CLOSURE_CENSUS.md +4 -3
- package/marketplace.json +2 -2
- 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 +2 -2
- package/plugins/pm-codex/.codex-plugin/plugin.json +1 -1
- package/plugins/pm-codex/package.json +2 -2
- package/plugins/pm-codex/plugin.json +1 -1
- package/runtime-dependencies.json +2 -2
- package/dist/cli-bundle/chunks/chunk-754AV3DC.js +0 -8
- package/dist/cli-bundle/chunks/chunk-CEM35QB2.js +0 -2
- package/dist/cli-bundle/chunks/chunk-CMIU2NDK.js +0 -20
- package/dist/cli-bundle/chunks/chunk-GSQK3VUT.js +0 -2
- package/dist/cli-bundle/chunks/chunk-WUOFG4JY.js +0 -3
- package/dist/cli-bundle/chunks/register-operations-FYV7CUBF.js +0 -2
- package/dist/cli-bundle/chunks/register-setup-M5VO6JUH.js +0 -2
- package/dist/cli-bundle/focused-chunks/chunk-3RJ4VK7U.js +0 -3
- package/dist/cli-bundle/focused-chunks/chunk-H5VREEUE.js +0 -20
|
@@ -1,115 +1,51 @@
|
|
|
1
1
|
# Build generations and registry acceptance
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
[pm-ygli86](../.agents/pm/tasks/pm-ygli86.toon)
|
|
5
|
-
|
|
6
|
-
[pm-63i8nr](../.agents/pm/tasks/pm-63i8nr.toon) and
|
|
3
|
+
Trackers: [pm-cxc4jc](../.agents/pm/tasks/pm-cxc4jc.toon),
|
|
4
|
+
[pm-ygli86](../.agents/pm/tasks/pm-ygli86.toon),
|
|
5
|
+
[pm-63i8nr](../.agents/pm/tasks/pm-63i8nr.toon),
|
|
7
6
|
[pm-p5u6](../.agents/pm/chores/pm-p5u6.toon).
|
|
8
7
|
|
|
9
|
-
##
|
|
8
|
+
## Build ownership
|
|
10
9
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
JavaScript. The lease is under `.cache/build-lease`; its owner receipt records a
|
|
16
|
-
process identifier and an opaque inheritance token.
|
|
10
|
+
Build/test/coverage sessions own `.cache/build-lease` through completion;
|
|
11
|
+
other producers/consumers wait twenty minutes. Nested readers inherit a verified
|
|
12
|
+
PID/token receipt; nested builds require independent workspaces. Direct stages
|
|
13
|
+
and arbitrary `dist` reads bypass this protocol.
|
|
17
14
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
15
|
+
Leases never expire or get stolen. Two matching reads proving PID absence fail
|
|
16
|
+
promptly with recovery guidance. Missing/malformed/changing/ambiguous receipts
|
|
17
|
+
use the timeout; PID reuse is ambiguous. Inspect owner and children before
|
|
18
|
+
abandoned-lease removal. Failed builds leave `.cache/build-incomplete`; prebuilt
|
|
19
|
+
tests refuse it until a successful build.
|
|
22
20
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
the ordinary acquisition timeout. PID reuse can make a departed owner appear
|
|
29
|
-
live; the probe is a conservative diagnostic, not proof of process identity.
|
|
30
|
-
After an interrupted process, inspect the owner and its children before removing
|
|
31
|
-
an abandoned lease. A failed build leaves `.cache/build-incomplete`; prebuilt
|
|
32
|
-
tests refuse that generation until a successful `pnpm build` clears the marker.
|
|
33
|
-
Direct invocations of individual build stages or arbitrary reads of `dist` do
|
|
34
|
-
not participate in this protocol. Use the build and test entrypoints for
|
|
35
|
-
concurrent validation.
|
|
21
|
+
Interrupts stop the child and stage admission, allowing five seconds for
|
|
22
|
+
settlement, lease release and cleanup; unsettled children retain storage.
|
|
23
|
+
Subprocess tests cover build/prebuilt paths and installer exits bypassing
|
|
24
|
+
`finally`. [Storage lifecycle](SDK_STORAGE_LIFECYCLE.md) defines retention and
|
|
25
|
+
platform limits.
|
|
36
26
|
|
|
37
|
-
##
|
|
27
|
+
## Registry acceptance
|
|
38
28
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
and context read benchmarks also register their owned roots. Normal completion
|
|
45
|
-
releases the registration after cleanup. Synchronous
|
|
46
|
-
workspaces also clean on process exit, including uncaught failure. SIGINT and
|
|
47
|
-
SIGTERM run registered cleanup before returning exit codes 130 and 143.
|
|
29
|
+
Release publishes once, chooses the registry's closest older calendar version
|
|
30
|
+
and runs the same eleven-step session against control then candidate in separate
|
|
31
|
+
roots. Linux/macOS/Windows cover npm local/global and Bun local. Installed CLI/SDK
|
|
32
|
+
and selected runtimes have two-minute step deadlines, bounded output and token
|
|
33
|
+
receipts. Synthetic telemetry/external reporting are disabled.
|
|
48
34
|
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
35
|
+
Control failure indicates harness/environment problems; candidate-only failure
|
|
36
|
+
requires regression investigation. Both block advertisement, which requires every
|
|
37
|
+
matrix leg. Artifacts name manager/step. Immutable versions are never republished;
|
|
38
|
+
exact-tag recovery retains the reviewed control selector. Parent deadlines cover
|
|
39
|
+
preparation and publish/verify/advertise.
|
|
54
40
|
|
|
55
|
-
The
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
does not stop, the workspace is retained and its location is reported. A signal
|
|
59
|
-
must never remove files still being used by a test process. Real subprocess
|
|
60
|
-
regressions exercise both build-enabled and prebuilt execution, alongside
|
|
61
|
-
installer failures that call `process.exit` and therefore bypass `finally`.
|
|
62
|
-
|
|
63
|
-
Package-first dogfood disables telemetry for its synthetic child commands so
|
|
64
|
-
detached flush workers cannot recreate the workspace after cleanup. Dedicated
|
|
65
|
-
telemetry acceptance and the live Sentry/telemetry gate verify delivery.
|
|
66
|
-
|
|
67
|
-
Release-note integration fixtures own their changelog, generator location, and
|
|
68
|
-
Git lookup directory. Both a dated-only changelog and an Unreleased section are
|
|
69
|
-
tested against the same real over-budget tracker. Release preparation can
|
|
70
|
-
therefore regenerate the checkout changelog without changing test inputs.
|
|
71
|
-
|
|
72
|
-
These handlers cannot run after SIGKILL, power loss, or Windows forced process
|
|
73
|
-
termination. Native signal acceptance runs on Unix; callback and normal-exit
|
|
74
|
-
contracts also run on Windows. The remaining script-wide migration stays tracked
|
|
75
|
-
by pm-p5u6 rather than treating these covered entrypoints as complete adoption.
|
|
76
|
-
|
|
77
|
-
## Published candidate and control
|
|
78
|
-
|
|
79
|
-
The Release workflow publishes npm artifacts once, verifies executors, and
|
|
80
|
-
selects the closest older calendar version from the public registry inventory.
|
|
81
|
-
It then runs the same eleven-step agent session against the control first and
|
|
82
|
-
the candidate second in independent temporary installation roots.
|
|
83
|
-
|
|
84
|
-
The matrix covers Linux, macOS, and Windows with npm local, npm global, and Bun
|
|
85
|
-
local installations. Each session initializes, orients, creates, claims,
|
|
86
|
-
annotates, links evidence, closes, validates, reads the closed item and context,
|
|
87
|
-
and verifies a complete corpus read through the installed public SDK. Each
|
|
88
|
-
subprocess has a two-minute deadline; command output has per-step bounds and the
|
|
89
|
-
report records estimated token cost. Telemetry and external error reporting are
|
|
90
|
-
disabled in these acceptance workspaces.
|
|
91
|
-
|
|
92
|
-
GitHub release advertisement is a separate job that depends on every matrix
|
|
93
|
-
leg succeeding. A failed control identifies a harness or environment problem;
|
|
94
|
-
a passing control followed by a failing candidate identifies a candidate
|
|
95
|
-
regression to investigate. Neither failure permits advertisement. Reports are
|
|
96
|
-
retained as workflow artifacts; failures also name the manager and failing step.
|
|
97
|
-
Existing npm versions are never republished during exact-tag recovery.
|
|
98
|
-
|
|
99
|
-
The prepublication artifact gate accepts both npm's array report and npm 12's
|
|
100
|
-
package-keyed report. It requires exactly one artifact, validates keyed package
|
|
101
|
-
identity, and applies the same file, source-map, and size limits to either shape.
|
|
102
|
-
Exact-tag recovery preserves the reviewed control selector before checking out
|
|
103
|
-
older unpublished source. The automatic-release parent budgets the complete
|
|
104
|
-
publish, acceptance, and advertisement sequence plus its preparation work.
|
|
105
|
-
|
|
106
|
-
Run the same comparison locally:
|
|
41
|
+
The artifact gate validates one npm array/keyed receipt, identity and size/file/map
|
|
42
|
+
limits. Release-note fixtures own generator/changelog/Git roots, isolating
|
|
43
|
+
dated/Unreleased over-budget cases from checkout regeneration.
|
|
107
44
|
|
|
108
45
|
```bash
|
|
109
|
-
npm run release:verify-installed-agent -- --version
|
|
110
|
-
npm run release:verify-installed-agent -- --version
|
|
46
|
+
npm run release:verify-installed-agent -- --version "$CANDIDATE" --previous-version "$CONTROL" --manager npm --global --json
|
|
47
|
+
npm run release:verify-installed-agent -- --version "$CANDIDATE" --previous-version "$CONTROL" --manager bun --json
|
|
111
48
|
```
|
|
112
49
|
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
runtime rather than assuming shell shim names.
|
|
50
|
+
Set both versions. Windows `npm run` supplies npm's JavaScript entrypoint.
|
|
51
|
+
See [packed first run](PACKED_FIRST_RUN.md) and [release policy](RELEASING.md).
|
package/docs/MERGE_SAFETY.md
CHANGED
|
@@ -74,7 +74,18 @@ Health and validation name `pm merge install` as the repair command for missing
|
|
|
74
74
|
or drifted drivers. This upgrade behavior is tracked by
|
|
75
75
|
[pm-rcjyft](../.agents/pm/issues/pm-rcjyft.toon).
|
|
76
76
|
|
|
77
|
-
The installer publishes the shared `.gitattributes` fence only after the
|
|
77
|
+
The installer publishes the shared `.gitattributes` fence only after the
|
|
78
|
+
clone-local driver commands are configured. Matching definitions are read
|
|
79
|
+
without rewriting Git configuration. Concurrent pm installers coordinate
|
|
80
|
+
through a clone-local lock shared by its worktrees. Each required Git write
|
|
81
|
+
waits up to five seconds for Git's native config-file lock, with capped backoff;
|
|
82
|
+
it never removes another writer's lock. Persistent contention, malformed
|
|
83
|
+
configuration, and permission failures return the stable
|
|
84
|
+
`merge_git_config_unwritable` error with recovery guidance and leave an absent
|
|
85
|
+
fence absent. This behavior is tracked by
|
|
86
|
+
[pm-gh1424](../.agents/pm/issues/pm-gh1424.toon).
|
|
87
|
+
Use `pm merge install --dry-run --json` to inspect the contract in
|
|
88
|
+
intentionally read-only workspaces.
|
|
78
89
|
|
|
79
90
|
### Independent worktree runtimes
|
|
80
91
|
|
|
@@ -177,7 +188,20 @@ and `hash_only`, while the clone-local receipt remains `clone_local`. This lets
|
|
|
177
188
|
a fresh-clone reviewer recover ordinary control-plane decisions without
|
|
178
189
|
publishing titles, descriptions, custom statuses, or other potentially private
|
|
179
190
|
content. When both copies exist the SDK deduplicates them and prefers the
|
|
180
|
-
locally recoverable
|
|
191
|
+
locally recoverable values. After immutable provenance matches, durable
|
|
192
|
+
reconciled state takes precedence over a stale clone-local pending copy only
|
|
193
|
+
when verified item history contains a sealed `merge_reconcile` event with the
|
|
194
|
+
same complete receipt summary and disposition. An absent, unreadable, invalid,
|
|
195
|
+
unsealed, or mismatched audit keeps the receipt pending in memory; inspection
|
|
196
|
+
rewrites neither receipt nor history. History is verified once per affected
|
|
197
|
+
item in each receipt scan.
|
|
198
|
+
Copy provenance includes normalized `requested_preference_applied`, so copies
|
|
199
|
+
that disagree on whether preference participated cannot share lifecycle state
|
|
200
|
+
even if history matches one copy. Inspection reports `copy_provenance_mismatch`,
|
|
201
|
+
and settlement refuses before either receipt is written. Legacy omission uses
|
|
202
|
+
the declared conflict policy's default participation value.
|
|
203
|
+
A local reconciled copy paired with a pending durable copy remains pending,
|
|
204
|
+
so an interrupted settlement can finish its durable write:
|
|
181
205
|
|
|
182
206
|
```bash
|
|
183
207
|
pm merge report
|
|
@@ -249,18 +273,33 @@ does not recover the original private value.
|
|
|
249
273
|
|
|
250
274
|
## Receipts from an aborted rebase
|
|
251
275
|
|
|
252
|
-
Tracked by [pm-466m0j](../.agents/pm/issues/pm-466m0j.toon)
|
|
253
|
-
created during a
|
|
254
|
-
|
|
276
|
+
Tracked by [pm-466m0j](../.agents/pm/issues/pm-466m0j.toon) and
|
|
277
|
+
[pm-gh1405](../.agents/pm/issues/pm-gh1405.toon). New receipts created during a
|
|
278
|
+
merge or rebase capture only its operation kind, original commit, and item blob
|
|
279
|
+
in the typed `MergeReceiptOperation` contract. A plain merge captures these
|
|
280
|
+
before Git publishes `MERGE_HEAD`: Git must supply its `GITHEAD_<incoming object
|
|
281
|
+
ID>` driver environment signal, `HEAD` must equal `ORIG_HEAD`, and the
|
|
282
|
+
driver's ours input must hash to the item blob at that commit. Missing or
|
|
283
|
+
ambiguous coordinates are omitted. Matching origin references and bytes alone
|
|
284
|
+
cannot identify a plain merge: cherry-pick and revert also invoke content
|
|
285
|
+
drivers. Without Git's incoming-head signal, those receipts remain unresolved
|
|
286
|
+
and cannot receive a plain-merge abandonment audit. Branch labels from the
|
|
287
|
+
driver environment are never persisted. After aborting, run:
|
|
255
288
|
|
|
256
289
|
```bash
|
|
257
290
|
pm merge reconcile --dry-run --json
|
|
258
|
-
pm merge reconcile --message "Record restored original
|
|
291
|
+
pm merge reconcile --message "Record restored original Git state" --json
|
|
259
292
|
```
|
|
260
293
|
|
|
294
|
+
SDK consumers that exhaustively handle `MergeReceiptOperation.kind` must
|
|
295
|
+
accept both `rebase` and `merge`. Existing rebase coordinates and receipt
|
|
296
|
+
version remain valid; no stored receipt migration is required.
|
|
297
|
+
|
|
261
298
|
Settlement requires Git to have left every active merge/rebase/cherry-pick/revert
|
|
262
299
|
operation, HEAD to match the original commit, and the item in HEAD, index, and
|
|
263
300
|
working tree to match the original blob. The item history must already be clean.
|
|
301
|
+
Requiring the original HEAD also rules out a new commit incorporating the
|
|
302
|
+
abandoned merge's other branch.
|
|
264
303
|
The history transaction rechecks the proof against its exact protected item
|
|
265
304
|
snapshot. Apply appends an explicit `merge_reconcile` event with
|
|
266
305
|
`abandoned_receipts` and the reason `original_git_state_restored`; it then marks
|
|
@@ -271,6 +310,22 @@ If receipt persistence fails after the audit commits, retry reuses the identical
|
|
|
271
310
|
verified disposition and finishes the receipt writes without appending another
|
|
272
311
|
audit event. An unrelated earlier audit does not satisfy this check.
|
|
273
312
|
|
|
313
|
+
The driver-created `merge-receipts/<receipt-id>.json` sidecar can remain
|
|
314
|
+
untracked after Git aborts. After reviewed settlement, commit that privacy-safe
|
|
315
|
+
sidecar together with the item's new history audit. Reconciliation preserves
|
|
316
|
+
the durable evidence for other worktrees instead of deleting the sidecar.
|
|
317
|
+
|
|
318
|
+
Applied-merge settlement has the same retry contract, tracked by
|
|
319
|
+
[pm-gh1390](../.agents/pm/issues/pm-gh1390.toon). The current item must still
|
|
320
|
+
satisfy authoritative receipt proof; only an identical receipt context in a
|
|
321
|
+
sealed event from reanchored, verified history suppresses a repeated provenance
|
|
322
|
+
event. Matching unsealed legacy context receives a new sealed audit while its
|
|
323
|
+
original entry remains intact. This also works with
|
|
324
|
+
durable-only evidence in another worktree. Once that worktree commits the
|
|
325
|
+
settled sidecar and history, a receiving worktree's stale local pending receipt
|
|
326
|
+
cannot reopen it. A subsequent `pm merge reconcile` leaves all three files
|
|
327
|
+
unchanged.
|
|
328
|
+
|
|
274
329
|
Old receipts without operation coordinates remain pending for ordinary review.
|
|
275
330
|
Tracked `merge-receipts/` sidecars are durable provenance and must remain tracked.
|
|
276
331
|
Deleting or ignoring them would lose the evidence needed by other clones.
|
package/docs/PACKED_FIRST_RUN.md
CHANGED
|
@@ -1,50 +1,34 @@
|
|
|
1
1
|
# Packed First-Run Acceptance
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
[pm-rcjyft](../.agents/pm/issues/pm-rcjyft.toon),
|
|
5
|
-
[pm-07m41m](../.agents/pm/issues/pm-07m41m.toon)
|
|
3
|
+
Trackers: [pm-ygli86](../.agents/pm/tasks/pm-ygli86.toon),
|
|
4
|
+
[pm-rcjyft](../.agents/pm/issues/pm-rcjyft.toon),
|
|
5
|
+
[pm-07m41m](../.agents/pm/issues/pm-07m41m.toon),
|
|
6
|
+
[pm-p5u6](../.agents/pm/chores/pm-p5u6.toon).
|
|
6
7
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
It executes the installed `pm` shim before passing the installed package directory
|
|
10
|
-
to the acceptance harness:
|
|
8
|
+
CI globally installs one tarball in isolated npm prefixes on Ubuntu/macOS/Windows
|
|
9
|
+
with Node 22.18.0 and 24, runs the installed `pm` shim, then invokes:
|
|
11
10
|
|
|
12
11
|
```bash
|
|
13
12
|
node scripts/release/packed-first-run.mjs /path/to/installed/@unbrained/pm-cli
|
|
14
13
|
```
|
|
15
14
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
command
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
MCP cleanup waits for process closure before removing its workspace. It allows
|
|
38
|
-
five seconds after SIGTERM, then sends SIGKILL and allows five more seconds. If
|
|
39
|
-
the child still does not close, the harness fails with captured diagnostics and
|
|
40
|
-
retains that workspace rather than attempting removal while it is in use.
|
|
41
|
-
|
|
42
|
-
The separate runtime-upgrade regression installs drivers through an absolute
|
|
43
|
-
runtime symlink, removes the original runtime directory, retargets the symlink,
|
|
44
|
-
and performs a real Git merge. It verifies the upgrade failure from GitHub #1248
|
|
45
|
-
without altering any developer runtime or repository.
|
|
46
|
-
|
|
47
|
-
This matrix proves the packed artifact's first-run behavior. Registry propagation,
|
|
48
|
-
npm/Bun installed agent sessions, npx/bunx execution, production telemetry, and
|
|
49
|
-
previous-release compatibility remain separate acceptance claims under the
|
|
50
|
-
[release workflow](RELEASING.md).
|
|
15
|
+
| Journey | Required observation |
|
|
16
|
+
| --- | --- |
|
|
17
|
+
| Installed README | Ordered init/create/list from `60 Second Example`; missing/reordered commands, unsupported expressions or unbalanced quotes fail. No shell execution. |
|
|
18
|
+
| Persistence | Each command returns nonempty output below 4,096 characters; the created item exists. |
|
|
19
|
+
| Branch merge | Independent comments survive a real Git merge; reconciliation and strict history verification succeed. |
|
|
20
|
+
| MCP | Initialization advertises the installed version. |
|
|
21
|
+
| Telemetry | A loopback collector receives detached `command_finish`; queue empties and successful flush persists. One 90-second deadline includes incomplete bodies; start alone cannot pass. |
|
|
22
|
+
|
|
23
|
+
Detached delivery removes inherited inline/test overrides; other commands/MCP
|
|
24
|
+
disable telemetry. Home/global roots are isolated. Interrupts stop stage admission
|
|
25
|
+
and collection, waiting five seconds for disposal. CLI errors await actual closure.
|
|
26
|
+
MCP waits five seconds after SIGTERM, then SIGKILL plus five more; failure retains
|
|
27
|
+
storage/diagnostics. [Storage lifecycle](SDK_STORAGE_LIFECYCLE.md) defines ownership
|
|
28
|
+
and abrupt-exit limits.
|
|
29
|
+
|
|
30
|
+
A separate #1248 regression removes/retargets an owned runtime symlink and performs
|
|
31
|
+
a real Git merge, preserving developer runtimes.
|
|
32
|
+
|
|
33
|
+
Registry propagation, npm/Bun sessions, npx/bunx, production telemetry and previous
|
|
34
|
+
compatibility have separate [release acceptance](BUILD_AND_RELEASE_ACCEPTANCE.md).
|
package/docs/README.md
CHANGED
|
@@ -98,6 +98,7 @@ pm guide release --json
|
|
|
98
98
|
- [Extension Lifecycle Contracts](EXTENSION_LIFECYCLE.md) - source identity, durable migrations, and scoped preflight ownership.
|
|
99
99
|
- [Extension Author Contracts](EXTENSION_AUTHOR_CONTRACTS.md) - the stability guarantees and contract surface package authors build against.
|
|
100
100
|
- [SDK](SDK.md) - public import surfaces and typed authoring examples.
|
|
101
|
+
- [SDK Storage Lifecycle](SDK_STORAGE_LIFECYCLE.md) - existing-parent writes, background worker lifetimes, and temporary acceptance producers.
|
|
101
102
|
- [SDK Item Creation and Recovery](SDK_CREATE_AND_RECOVERY.md) - typed deterministic conflicts, resolved identity, actionable refusals, and amount-limited producer cursors.
|
|
102
103
|
- [Audited SDK Settings and Item Updates](SDK_AUDITED_MUTATIONS.md) - extension-owned settings changes, replay-safe previews, and full-item JSON annotation integrity.
|
|
103
104
|
- [SDK execution and recovery contracts](SDK_EXECUTION_CONTRACTS.md): schema-driven scheduling, handoff, and command recovery.
|
|
@@ -4,6 +4,24 @@ The extension settings contract is tracked by
|
|
|
4
4
|
[pm-wtqltn](../.agents/pm/issues/pm-wtqltn.toon). Full-item JSON annotation
|
|
5
5
|
integrity is tracked by [pm-2589e6](../.agents/pm/issues/pm-2589e6.toon).
|
|
6
6
|
Canonical previews are tracked by [pm-2sef82](../.agents/pm/features/pm-2sef82.toon).
|
|
7
|
+
Preview path refusals are tracked by
|
|
8
|
+
[pm-preview-path-refusal](../.agents/pm/issues/pm-preview-path-refusal.toon).
|
|
9
|
+
|
|
10
|
+
## Transaction preview storage
|
|
11
|
+
|
|
12
|
+
Item mutation and completion previews inspect a staged copy of the configured
|
|
13
|
+
tracker storage without changing source items or bootstrapping source schemas.
|
|
14
|
+
Linked entries, special files and directories configured as files are refused
|
|
15
|
+
with `transaction_preview_non_regular_file` (CLI exit `2`). SDK callers receive
|
|
16
|
+
a `PmCliError` with the same code and repair guidance in `context.nextSteps`.
|
|
17
|
+
The producer diagnostic omits discovered filesystem paths. Inspect the configured
|
|
18
|
+
settings, schema, session and item storage, restore the intended regular files and directories,
|
|
19
|
+
then retry the original dry run.
|
|
20
|
+
|
|
21
|
+
Entry and opened-descriptor checks enforce the same contract. Persistent native
|
|
22
|
+
filesystem failures, including missing link targets and permission errors, keep
|
|
23
|
+
their original codes. These checks require stable, trusted ancestors; they do
|
|
24
|
+
not guarantee protection against hostile concurrent path redirection.
|
|
7
25
|
|
|
8
26
|
## Extension settings
|
|
9
27
|
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# SDK Storage Lifecycle
|
|
2
|
+
|
|
3
|
+
Tracked by [pm-p5u6](../.agents/pm/chores/pm-p5u6.toon).
|
|
4
|
+
|
|
5
|
+
Detached telemetry reads existing settings without scaffolding schemas/identity.
|
|
6
|
+
Locks, queue/state rewrites and event/OTLP completion preserve owner-removed
|
|
7
|
+
storage. Delivery stays best effort/nonblocking; foreground defaults create parents.
|
|
8
|
+
|
|
9
|
+
```typescript
|
|
10
|
+
import { acquireLock, writeFileAtomic } from "@unbrained/pm-cli/sdk";
|
|
11
|
+
|
|
12
|
+
const policy = { createParentDirectories: false };
|
|
13
|
+
const release = await acquireLock(root, "job", 60, "worker", false, true, 5000, policy);
|
|
14
|
+
try {
|
|
15
|
+
await writeFileAtomic(resultPath, serializedResult, policy);
|
|
16
|
+
} finally {
|
|
17
|
+
await release();
|
|
18
|
+
}
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
Owners initialize lock/result parents; absence fails without recreation. The
|
|
22
|
+
policy cannot pin identity or prevent symlink/replacement races. Extension lock
|
|
23
|
+
overrides own their lifecycle.
|
|
24
|
+
|
|
25
|
+
Async scripts use `registerTempOperation`: signal children, check after
|
|
26
|
+
uncancellable SDK work, `finish` after finally disposal. Interrupts close admission
|
|
27
|
+
and await completion; timeout retains evidence. Sync scripts use
|
|
28
|
+
`registerTempCleanup`. Normal failure, SIGINT/SIGTERM (130/143), explicit retention
|
|
29
|
+
and caller-owned roots are covered; unrelated roots survive. Abrupt exits retain
|
|
30
|
+
async work. SIGKILL/power loss/Windows forced termination cannot run handlers.
|
|
31
|
+
Unix tests cover signals; Windows covers callbacks/normal exit.
|
|
32
|
+
|
|
33
|
+
Real storage, HTTP/OTLP, Git and subprocess regressions complement
|
|
34
|
+
[build/registry acceptance](BUILD_AND_RELEASE_ACCEPTANCE.md) and
|
|
35
|
+
[packed first run](PACKED_FIRST_RUN.md).
|
|
@@ -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: 396
|
|
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: 377
|
|
12
|
+
- Coverage fraction: 0.047980
|
|
13
13
|
- Closed-domain probes: 19
|
|
14
14
|
- Grammar probes: 117
|
|
15
15
|
|
|
@@ -324,6 +324,7 @@ Every catalog code is listed. An `uncovered` row is an explicit closure obligati
|
|
|
324
324
|
| `tracker_root_not_directory` | `tracker_root_not_directory` | executable | owned_state | 1 |
|
|
325
325
|
| `tracker_root_unreadable` | `tracker_root_unreadable` | executable | owned_state | 1 |
|
|
326
326
|
| `transaction_preview_external_schema` | `transaction_preview_external_schema` | uncovered | none | 0 |
|
|
327
|
+
| `transaction_preview_non_regular_file` | `transaction_preview_non_regular_file` | uncovered | none | 0 |
|
|
327
328
|
| `transaction_preview_snapshot_changed` | `transaction_preview_snapshot_changed` | uncovered | none | 0 |
|
|
328
329
|
| `type_duplicate` | `type_duplicate` | uncovered | none | 0 |
|
|
329
330
|
| `type_invalid` | `type_invalid` | uncovered | none | 0 |
|
package/marketplace.json
CHANGED
|
@@ -5,13 +5,13 @@
|
|
|
5
5
|
"url": "https://github.com/unbraind/pm-cli"
|
|
6
6
|
},
|
|
7
7
|
"description": "Official marketplace for pm CLI — native git-based project management for Claude Code and AI coding agents.",
|
|
8
|
-
"version": "2026.10.
|
|
8
|
+
"version": "2026.10.8",
|
|
9
9
|
"plugins": [
|
|
10
10
|
{
|
|
11
11
|
"name": "pm-claude",
|
|
12
12
|
"source": "./plugins/pm-claude",
|
|
13
13
|
"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.",
|
|
14
|
-
"version": "2026.10.
|
|
14
|
+
"version": "2026.10.8",
|
|
15
15
|
"author": {
|
|
16
16
|
"name": "unbrained",
|
|
17
17
|
"url": "https://github.com/unbraind/pm-cli"
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@unbrained/pm-digital-twin",
|
|
3
|
-
"version": "2026.10.
|
|
3
|
+
"version": "2026.10.8",
|
|
4
4
|
"private": true,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"description": "Beyond-PM exemplar: a temporal production-facility digital twin built entirely on public pm SDK and extension primitives.",
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"name": "pm-claude",
|
|
4
4
|
"displayName": "pm CLI",
|
|
5
5
|
"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.",
|
|
6
|
-
"version": "2026.10.
|
|
6
|
+
"version": "2026.10.8",
|
|
7
7
|
"author": {
|
|
8
8
|
"name": "unbrained",
|
|
9
9
|
"url": "https://github.com/unbraind/pm-cli"
|