mcp-pacemaker 1.3.1 → 2.0.2

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/CHANGELOG.md CHANGED
@@ -7,47 +7,103 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ Target release: **2.0.2**. This candidate has not yet been published.
11
+
10
12
  ### Fixed
11
13
 
12
- - Require a complete, bounded owner stage-list observation before recording no
13
- pending stages; keep owner authentication, ledger review and approval separate.
14
- - Require a stable, safe `total_count` on every GitHub jobs/artifacts page and
15
- reject count drift or overshoot before admitting incomplete publication evidence.
16
- - Require the original stage job's numeric attempt `1` when verifying captured
17
- stage evidence; the requested API attempt alone does not establish it.
18
- - Check each patch's actual runtime layout during npm publication. Legacy 1.3.1
19
- does not require 2.0-only editor/file modules, while shared execution and the
20
- current line's error module remain required.
21
- - Accept GitHub's exact unexpanded consumer-matrix job name during source-secret
22
- collection validation, while still requiring skipped status and no executed steps.
23
- - Compare collected report and native-receipt completion against the precision
24
- of GitHub's step timestamp without admitting execution in the next second.
25
- - Preserve exact positive source-CI attempts and accept bounded canonical npm repair tags.
26
- - Let the 1.3.1 publishing finalizer use approved immutable published 2.0.1 bytes
27
- for T32 comparison without a hosted seed, fabricated preparation evidence or
28
- stage authority. Candidate consumer, compatibility and publication gates remain required.
29
- - Resolve native directory watcher paths before watching logs and test control files,
14
+ - Replace the old GitHub-install quick start in the npm package documentation with
15
+ npm-first installation, exact-version commands, prerequisites and setup boundaries.
16
+ - Preserve npm package-type permissions in isolated consumer checks instead of silently
17
+ reverting directory, file, Git, or remote dependency restrictions to npm defaults.
18
+ - Resolve native directory watcher paths in publication and compatibility test helpers,
30
19
  avoiding Windows short-path watcher crashes without changing the selected files.
20
+ - Restore the legacy publisher's skipped-matrix job and whole-second timestamp handling
21
+ in reusable secret-collection admission, preserving source and execution checks.
22
+
23
+ ### Changed
24
+
25
+ - Make the manual npm publisher reusable for explicitly selected stable 1.x/2.x
26
+ versions, with immutable published comparison peers and no active bootstrap actions.
27
+ - Keep the existing GitHub source-CI, collection/review, preparation, OIDC staging,
28
+ verification and separately approved owner-publication route for the selected release.
31
29
 
32
30
  ### Security
33
31
 
34
- - Prepare 1.3.1 with a `smol-toml` minimum and locked version of 1.8.0. Bounded malformed-TOML
35
- regressions cover the EOF-comment hang fixed by CVE-2026-85730 without changing legacy
36
- pooling, audit-policy, or immediate-save behavior.
32
+ - Record a temporary **2.0.2-only producer risk acceptance** for `smol-toml 1.8.0`
33
+ in the CLI runtime and `braces 3.0.3`, `postcss-selector-parser 6.1.4` and
34
+ `source-map-js 1.2.1` in UI build tooling. The October 6 review keeps the
35
+ original **2026-10-12T00:00:00Z** expiry and binds both unchanged producer
36
+ locks and the exact native reports. Raw audit/OSV findings remain visible.
37
+ Dependency upgrades stay deferred from this documentation release.
38
+ This is not a patch or a clean advisory result; fresh-consumer findings are
39
+ not exempted. Remediation and exception removal are required
40
+ before expiry or the next release. See the
41
+ [exact advisories, exposure, mitigations and follow-up](docs/npm-publishing.md#temporary-202-producer-risk-acceptance).
42
+
43
+ ## [2.0.1]
37
44
 
38
45
  ### Changed
39
46
 
40
- - Resolve the explicit `legacy` npm channel for same-major, exact-version update guidance.
41
- Channel rollback and adoption of an existing backend are not automatic upgrades.
42
- - Limit legacy maintenance to the newest 1.3.x patch through March 31, 2027; document durable
43
- service replacement and platform prerequisites.
47
+ - Prepare 2.0.1 for a separate npm publication, with exact-version guidance from the current
48
+ major's maintained channel. Channel rollback and backend adoption are not automatic upgrades.
49
+ - Document durable service replacement, explicit legacy maintenance, platform prerequisites,
50
+ and the difference between npm provenance and Windows executable signing.
44
51
 
45
52
  ### Added
46
53
 
47
54
  - Source-bound, manual npm preparation/staging tooling, bundled third-party notices, and
48
55
  fresh-consumer package checks.
49
- - Exact legacy-patch/current-release compatibility gates and an explicit two-patch mode,
50
- while retaining the immutable 1.3.0/2.0.0 historical pair. Add maintenance-branch and Node 24 CI.
56
+ - Explicit patch compatibility pairs alongside the unchanged 1.3.0/2.0.0 historical pair;
57
+ maintenance-branch CI and Node 24 coverage.
58
+
59
+ ## [2.0.0] - 2026-09-12
60
+
61
+ ### Breaking
62
+
63
+ - Version 2.0 changes the pooling save contract from immediate application to queued batches.
64
+ API clients must send `x-mcp-pooling-batch: 1` and distinguish HTTP 202 acceptance from
65
+ activation. Older clients are rejected without staging a change.
66
+ - The `prewarm` CLI returns after staging, not after activation. Scripts must observe the batch
67
+ result before relying on the new settings. Undo restores the whole batch, not one server.
68
+ - Update the CLI and reload open dashboard pages when upgrading the bridge from 1.3.0.
69
+ Before downgrading, use 2.0 to resolve any pending or interrupted configuration transaction.
70
+
71
+ ### Changed
72
+
73
+ - Pooling changes stage a complete configuration copy and reload five seconds after the last
74
+ accepted change. The UI and CLI distinguish Pending, Applying and completed activation;
75
+ Reload now flushes a batch, and Cancel/Undo explicitly applies to the whole batch.
76
+ - Batch-capable clients identify the asynchronous save protocol. Older clients are rejected
77
+ before staging instead of reporting an accepted change as already enabled.
78
+ - Windows configuration saves use directory-inherited auditing without requiring audit-read
79
+ privilege. A non-blocking notice explains that custom per-file audit rules may not carry
80
+ forward; ordinary access and supported integrity protections remain required.
81
+ - Windows saves retain an existing owner that matches the caller user or token default owner,
82
+ preserving supported legacy writes after downgrade. Other owners still use checked transfer,
83
+ and source write access remains required.
84
+
85
+ ### Added
86
+
87
+ - Permanent real-version compatibility gates for **1.3.0 and 2.0.0 only**, using pinned
88
+ published 1.3.0 code and an actual packed 2.0.0 candidate. CI covers CLI/API pairs on
89
+ Windows/Linux/macOS with Node 20/22 and built dashboard pairs in the Linux Chromium job:
90
+ immediate legacy saves/Undo, fresh-nonce protocol refusal, actual old-tab restart/refresh,
91
+ queued save/Cancel/Undo, settled upgrade/downgrade configuration bytes, and same-authority
92
+ legacy write/Undo capability after downgrade (or the unchanged known Windows audit refusal).
93
+
94
+ ### Fixed
95
+
96
+ - Preserve recovery checkpoints after uncertain post-placement failures without replaying
97
+ writes or accepting corrupt journals.
98
+ - Avoid dispatching process-tree termination for children already known to have exited,
99
+ including failed session resumes.
100
+
101
+ ### Security
102
+
103
+ - Raise the `smol-toml` minimum and locked version from 1.7.0 to 1.8.0 to address
104
+ [CVE-2026-85730](https://github.com/squirrelchat/smol-toml/security/advisories/GHSA-7w5x-hrqm-74c2).
105
+ Malformed TOML ending with a comment in an unclosed array or inline table now produces a
106
+ parse error instead of hanging the CLI while reading Codex configuration.
51
107
 
52
108
  ## [1.3.0] - 2026-09-08
53
109
 
@@ -419,6 +475,8 @@ one is a trap for anyone building something similar.
419
475
  - Do not report a teardown the bridge initiated as a crash. `taskkill /F` exits non-zero, so
420
476
  every recycle, idle reap and session close was recorded as a failure, burying real ones.
421
477
 
478
+ [2.0.0]: https://github.com/girishkvs/mcp-pacemaker/releases/tag/v2.0.0
479
+ [1.3.0]: https://github.com/girishkvs/mcp-pacemaker/releases/tag/v1.3.0
422
480
  [1.2.0]: https://github.com/girishkvs/mcp-pacemaker/releases/tag/v1.2.0
423
481
  [1.1.0]: https://github.com/girishkvs/mcp-pacemaker/releases/tag/v1.1.0
424
482
  [1.0.0]: https://github.com/girishkvs/mcp-pacemaker/releases/tag/v1.0.0
package/CONTRIBUTING.md CHANGED
@@ -47,9 +47,12 @@ owned scratch roots and native watcher inputs at their boundaries; keep rejectin
47
47
  links, replaced directories, and files outside the approved inventory. A Windows-only pass
48
48
  does not establish Linux or macOS correctness; the hosted platform matrix remains required.
49
49
 
50
- The complete Windows suite needs audit-read rights for successful configuration-write cases.
51
- Security-specific fixtures modify only their own temporary files. Automatic writes deliberately
52
- fail closed when audit policy is unreadable; the suite also exercises that restricted path.
50
+ Windows configuration-write coverage must exercise the normal interactive startup token,
51
+ not only a test process inheriting an elevated runner. Validate both the actual token context
52
+ and successful staging/activation. Security-oracle fixtures may use already-authorized test
53
+ authority to establish and inspect their own files; production saves must not depend on it.
54
+ Directory-inherited auditing is the default. Test ordinary access restrictions, integrity,
55
+ custom-audit behavior, contender files and crash recovery separately.
53
56
 
54
57
  Windows automatic edits use the packaged .NET Framework 4.6.2 helper. Changes to its source
55
58
  must rebuild the executable and metadata with
@@ -60,6 +63,11 @@ platform; Windows also exercises the real executable. Those checks do not replac
60
63
  byte-for-byte rebuild, and a rolling CI image may not contain the recorded compiler.
61
64
  No compiler or PowerShell host runs in the production config-write path.
62
65
 
66
+ Batch tests must cover the full five-second trailing debounce, merging complete snapshots,
67
+ Reload now, requests during a flip, stale active revisions, whole-batch Cancel/Undo and late
68
+ commit outcomes. Use controlled clocks for scheduling boundaries and real file/HTTP cases for
69
+ integration. A skipped second move is not proof of recovery after actual process termination.
70
+
63
71
  **A regression test must be shown to fail without its fix.** Revert the fix, watch the test
64
72
  fail, restore it, watch it pass. Several bugs in this repo were originally "covered" by tests
65
73
  that passed against the broken code — a test that cannot fail is worse than no test, because
@@ -69,70 +77,138 @@ sleeping a fixed interval.
69
77
 
70
78
  ## Real-version compatibility gates
71
79
 
72
- These gates run actual legacy/current CLI, API and built dashboard code, not mocked backend
73
- responses. Scope is explicitly **1.3.0, 1.3.1, 2.0.0 and 2.0.1**. The maintained branches use
74
- the same harness, with exact version assertions and separate historical evidence.
75
-
76
- | Preparation | Selected legacy / current pair |
77
- |---|---|
78
- | Default in this 1.3.1 checkout | Packed 1.3.1 / immutable 2.0.0 |
79
- | Default in the 2.0.1 checkout | Immutable 1.3.0 / packed 2.0.1 |
80
- | `npm run compat:prepare:baseline` | Immutable 1.3.0 / immutable 2.0.0 |
81
- | `npm run compat:prepare -- --peer-root <opposite-patch-checkout>` | Packed 1.3.1 / packed 2.0.1 |
80
+ These are separate, mandatory CI gates, not substitutes for `npm test`. The root CI job runs
81
+ CLI/API pairs on Windows, Linux and macOS with Node 20, 22 and 24. The Linux/Node 22 UI
82
+ job runs one Chromium browser matrix after building the dashboard.
82
83
 
83
84
  ```bash
85
+ npm ci
84
86
  npm run compat:prepare
85
87
  npm run test:compat
86
88
  npm run compat:clean
87
89
 
90
+ # Browser gate: build before packing the candidate.
91
+ npm --prefix ui ci
88
92
  npm --prefix ui run build
89
- # Install the existing Playwright Chromium browser from the ui directory for CI.
90
- # A local run can instead set MCP_COMPAT_BROWSER_CHANNEL=chrome.
93
+ cd ui
94
+ npx --no-install playwright install --with-deps chromium
95
+ cd ..
91
96
  npm run compat:prepare
92
97
  npm run test:compat:browser
93
98
  npm run compat:clean
94
99
  ```
95
100
 
96
- Run both gates for the explicit patch pair before publishing the complete dual-major set;
97
- the default per-branch pairs alone do not establish that result. Run cleanup before selecting
98
- another pair or performing `npm ci`. CI covers Windows/Linux/macOS with Node 20/22/24 and a
99
- Linux/Node 22 Chromium lane. Node 20 is legacy runtime compatibility, not a supported secure runtime.
101
+ For an already installed local Chrome, set `MCP_COMPAT_BROWSER_CHANNEL=chrome` in your shell
102
+ instead of installing bundled Chromium. CI uses bundled Chromium, not that override.
103
+ Both standalone test commands **fail** when preparation is missing or candidate bytes have
104
+ changed. Clean and prepare again after changing package files, built assets, or Node major.
105
+
106
+ Historical compatibility baselines remain explicitly **1.3.0 and 2.0.0**.
107
+ Candidate versions must be canonical stable **1.x legacy / 2.x current** versions.
108
+ The owner selects the actual release and any exact opposite-major patch pair;
109
+ support in the harness alone is not evidence that every patch was tested.
110
+ The same harness runs in both maintained branches:
111
+
112
+ | Preparation | Selected legacy / current pair |
113
+ |---|---|
114
+ | Default in the selected 2.0.2 checkout | Immutable 1.3.0 / packed 2.0.2 |
115
+ | Default in the 1.3.1 checkout | Packed 1.3.1 / immutable 2.0.0 |
116
+ | `npm run compat:prepare:baseline` | Immutable 1.3.0 / immutable 2.0.0 |
117
+ | `npm run compat:prepare -- --peer-root <opposite-patch-checkout>` | Packed 1.3.1 / packed 2.0.2 |
118
+
119
+ These selections are not qualification evidence. The selected 1.3.1/2.0.2 pair
120
+ requires fresh exact-byte gates; earlier 1.3.1/2.0.1 results remain historical.
121
+
122
+ Run both API and browser gates for the explicit patch pair before publishing either complete
123
+ dual-major release set. The two default CI pairs alone do not establish that combined result.
124
+ Run `compat:clean` before selecting another pair.
100
125
 
101
126
  Publication artifact gates add `--candidate-tarball <absolute.tgz> --candidate-sha256 <digest>`.
102
- This supplies the checkout's own candidate role without repacking it: here that is the legacy
103
- 1.3.1 role. Complete input hashes and the archive digest must match; historical mode cannot
104
- substitute a patch. The manifest also records the exact npm CLI version.
127
+ This supplies the checkout's own candidate role without repacking it, including the legacy
128
+ role when invoked from 1.3.1. The archive must match every package input and the supplied digest;
129
+ historical mode cannot substitute it. The manifest also records the exact npm CLI version.
105
130
 
106
- Historical sources are pinned to `2d525f4ced01b978a5aeb83aef69145e96cced05` (1.3.0) and
131
+ Release sources are pinned to `2d525f4ced01b978a5aeb83aef69145e96cced05` (1.3.0) and
107
132
  `db4812a1cbfb8546c814a656397b9a48ccf0f32c` (2.0.0). Missing commits are fetched read-only by
108
- exact SHA into an owned temporary repository. Archives honor canonical Git line endings and
109
- committed attributes. Local candidates are packed without lifecycle scripts, compared against
110
- their source files, and restored using their own unchanged producer locks. Caller-resolved
111
- registry/cache settings are honored without a fallback; locks must retain public URLs.
112
-
113
- The manifest records selection mode, exact versions and references, each archive/file hash,
114
- candidate inputs and Node major. Editing either candidate invalidates preparation. Owned
115
- temporary HOME/config/ports keep the user's state isolated. Identity-checked cleanup never
116
- follows links or claims another directory. Failed cleanup remains retryable.
117
-
118
- The selected 2.x client must preserve immediate 1.x HTTP 200 saves/Undo. The selected 1.x
119
- client gets HTTP 409 from 2.x with a fresh nonce, or HTTP 401 after a real restart with a stale
120
- nonce; refresh must load the selected new assets. The 2.x cases require HTTP 202 pending
121
- receipts, actual activation, cancellation and whole-batch Undo. Settled downgrade checks
122
- active bytes, instance changes and unchanged caller authority. Known Windows audit-unavailable
123
- legacy HTTP 403 must remain unchanged; it is not counted as a successful legacy write.
124
- Unresolved transactions, arbitrary ACL changes and OS-service installation are separate gates.
133
+ exact SHA into an owned temporary repository, never through a moving tag or into checkout refs.
134
+ Git archive uses canonical Git line endings and the committed attributes. Local candidates
135
+ are packed with lifecycle scripts disabled and compared against their actual source files.
136
+
137
+ Each selected package uses its own unchanged producer lock via `npm ci --omit=dev --ignore-scripts`.
138
+ This is producer-locked compatibility, not fresh consumer resolution. The manifest records the
139
+ selection mode, exact versions and release references, per-role archive/file hashes, source
140
+ inputs and Node major. Editing either candidate invalidates prepared fixtures. No patch is
141
+ relabeled as the original historical bytes. Git, tar, Node and npm must be available.
142
+
143
+ For local restores through an approved registry, preparation honors the caller's resolved
144
+ `npm_config_registry` and `npm_config_replace_registry_host` settings (and npm cache).
145
+ For example, in a POSIX shell:
146
+
147
+ ```bash
148
+ npm_config_registry=https://approved-registry.example.test/npm/ \
149
+ npm_config_replace_registry_host=npmjs npm run compat:prepare
150
+ ```
151
+
152
+ Use your approved registry URL, not the example. These settings are forwarded to isolated
153
+ `npm ci` calls without changing npmrc files or recording registry settings in the manifest.
154
+ CI sets no override and uses the public registry. Both committed lockfiles and the fixture
155
+ lockfiles must retain public URLs; preparation verifies that restore leaves fixture locks
156
+ byte-identical. Registry policy or quarantine rejections fail preparation without a fallback.
157
+
158
+ Fixtures, private baseline code, configuration and fake HOME/state live in owned OS temporary
159
+ directories, never the user's active configuration. Only a manifest pointer is kept under
160
+ ignored `node_modules/.cache`. This manifest is also the prepared fixture's ownership marker:
161
+ it is created before restore, keeps its identity when preparation finishes, and is removed
162
+ only after its temporary tree is gone. A failed manifest unlink remains retryable. Other
163
+ temporary test directories use adjacent ownership markers. Ports are allocated dynamically.
164
+ Cleanup checks directory and marker identities and removes only owned files without following
165
+ links. Bridge/browser failures retain their original error and diagnostic logs in test output;
166
+ cleanup errors do not replace
167
+ the original failure. Run cleanup before another root `npm ci`, which removes the pointer.
168
+
169
+ | Pair/case | Required result |
170
+ |---|---|
171
+ | Selected 2.x CLI/API and built UI to selected 1.x backend | Legacy HTTP 200 enable and Undo; original config bytes restored |
172
+ | Selected 1.x CLI/API and built UI to selected 2.x backend, fresh nonce | Protocol HTTP 409, no queued write or config change |
173
+ | Already-open selected 1.x tab through an actual bridge restart | Old nonce gets HTTP 401; refresh loads the selected 2.x assets and can stage/cancel |
174
+ | Selected 2.x CLI and UI to selected 2.x backend | Queued save, Cancel, actual application and whole-batch Undo |
175
+ | Settled selected 1.x / 2.x / 1.x configuration | Edits/Undo and both restarts preserve the expected active bytes |
176
+ | Actual selected 1.x writes before and after that roundtrip, unchanged authority | Supported write/Undo must remain supported; known Windows audit-unavailable refusal must remain HTTP 403 with no change |
177
+
178
+ **Test-only UI asset serving:** the two mixed UI/backend cases serve exact old/new built
179
+ `ui/dist` files through Playwright, substituting only the current nonce in the HTML. All
180
+ API, admin mutation, SSE and MCP requests go to the real backend, without response mocks.
181
+ Nested JS assets are included. The old-tab upgrade case does not substitute assets: it stops
182
+ the actual selected 1.x process and starts the selected 2.x process on the same port before refresh.
183
+
184
+ Only the executed exact version pairs establish compatibility. Writable downgrade is checked on a fresh
185
+ synthetic config with default ownership and inherited security. The test does not change
186
+ tokens, elevate, or set ACLs. It checks unchanged caller authority and, on Windows, the actual
187
+ selected 1.x helper's full/partial audit visibility. Caller-context hashes are not direct measurements
188
+ of individual bridge tokens. Only the legacy HTTP 403 audit-unavailable
189
+ condition is accepted as unsupported; unexpected errors and any new HTTP 500 fail the gate.
190
+ The Windows 2.x writer retains a source owner matching the caller user or token default
191
+ owner; other owners still use checked transfer, and source write access remains required.
192
+ These gates do not test a downgrade with an unresolved transaction, installer/service
193
+ replacement, arbitrary Windows ACLs or authority changes, or all host integrations; their
194
+ separate tests and operational checks still apply.
125
195
 
126
196
  ## npm consumer validation
127
197
 
128
- `npm run consumer:check -- --tarball <absolute-file> --sha256 <digest> --version 1.3.1 --name mcp-pacemaker`
129
- uses an owned disposable project and a separate global prefix. It does not copy the producer
130
- lock: it records fresh dependency resolution, checks the installed command shim and exercises
131
- the packaged bridge, CLI and UI assets with synthetic servers/private state.
198
+ `npm run consumer:check -- --tarball <absolute-file> --sha256 <digest> --version <version> --name mcp-pacemaker`
199
+ installs the exact packed candidate into an owned disposable consumer project without a copied
200
+ producer lock, records the resolved graph, checks a separate global-prefix command shim, and
201
+ starts the real packaged bridge against synthetic servers and private state. It checks the
202
+ packaged UI assets and CLI status, then removes only its owned fixtures.
203
+
204
+ Run it with normal npm install-script policy and again with `--ignore-scripts`. It never uses
205
+ the user's global prefix, host configuration, live bridge, or npm credentials. It honors the
206
+ resolved caller registry/cache and offline setting without a mirror fallback. Registry
207
+ signatures and provenance are separate post-publication checks, not inferred from this smoke test.
132
208
 
133
- Run with normal npm install-script policy and again with `--ignore-scripts`. Caller registry,
134
- cache and offline settings are honored, but user credentials and real host configuration are
135
- not used. Registry signatures and provenance remain separate post-publication checks.
209
+ The consumer preserves npm's effective `allow-directory`, `allow-file`, `allow-git`, and
210
+ `allow-remote` values, including environment overrides. It does not replace restrictions
211
+ with defaults or grant permissions when an install is rejected.
136
212
 
137
213
  ## Changing how a host is wired
138
214