mcp-pacemaker 2.0.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,10 +7,40 @@ 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
- - 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,
13
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.
29
+
30
+ ### Security
31
+
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]
14
44
 
15
45
  ### Changed
16
46
 
package/CONTRIBUTING.md CHANGED
@@ -103,15 +103,21 @@ instead of installing bundled Chromium. CI uses bundled Chromium, not that overr
103
103
  Both standalone test commands **fail** when preparation is missing or candidate bytes have
104
104
  changed. Clean and prepare again after changing package files, built assets, or Node major.
105
105
 
106
- Scope is explicitly **1.3.0, 1.3.1, 2.0.0 and 2.0.1**, not arbitrary compatible-looking versions.
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.
107
110
  The same harness runs in both maintained branches:
108
111
 
109
112
  | Preparation | Selected legacy / current pair |
110
113
  |---|---|
111
- | Default in the 2.0.1 checkout | Immutable 1.3.0 / packed 2.0.1 |
114
+ | Default in the selected 2.0.2 checkout | Immutable 1.3.0 / packed 2.0.2 |
112
115
  | Default in the 1.3.1 checkout | Packed 1.3.1 / immutable 2.0.0 |
113
116
  | `npm run compat:prepare:baseline` | Immutable 1.3.0 / immutable 2.0.0 |
114
- | `npm run compat:prepare -- --peer-root <opposite-patch-checkout>` | Packed 1.3.1 / packed 2.0.1 |
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.
115
121
 
116
122
  Run both API and browser gates for the explicit patch pair before publishing either complete
117
123
  dual-major release set. The two default CI pairs alone do not establish that combined result.
@@ -175,7 +181,7 @@ API, admin mutation, SSE and MCP requests go to the real backend, without respon
175
181
  Nested JS assets are included. The old-tab upgrade case does not substitute assets: it stops
176
182
  the actual selected 1.x process and starts the selected 2.x process on the same port before refresh.
177
183
 
178
- No other version compatibility is claimed. Writable downgrade is checked on a fresh
184
+ Only the executed exact version pairs establish compatibility. Writable downgrade is checked on a fresh
179
185
  synthetic config with default ownership and inherited security. The test does not change
180
186
  tokens, elevate, or set ACLs. It checks unchanged caller authority and, on Windows, the actual
181
187
  selected 1.x helper's full/partial audit visibility. Caller-context hashes are not direct measurements
@@ -200,6 +206,10 @@ the user's global prefix, host configuration, live bridge, or npm credentials. I
200
206
  resolved caller registry/cache and offline setting without a mirror fallback. Registry
201
207
  signatures and provenance are separate post-publication checks, not inferred from this smoke test.
202
208
 
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.
212
+
203
213
  ## Changing how a host is wired
204
214
 
205
215
  Host adapters live in `HOSTS` in `bin/cli.mjs`. Each one declares where that host's config
package/README.md CHANGED
@@ -1,6 +1,13 @@
1
1
  # mcp-pacemaker
2
2
 
3
- **Keep your MCP servers alive across editor restarts, reboots, and token expiry.** The long-running bridge is dependency-free; a small CLI (commander · clack · picocolors) handles setup.
3
+ **A local process supervisor and transport bridge for your MCP servers.** Manage server
4
+ lifetime outside your editor or CLI, with opt-in pre-warming and compatible session sharing.
5
+ The long-running bridge has no third-party runtime dependencies; the setup CLI and dashboards
6
+ have their own dependencies.
7
+
8
+ [Install from npm](https://www.npmjs.com/package/mcp-pacemaker) ·
9
+ [Report a problem](https://github.com/girishkvs/mcp-pacemaker/issues) ·
10
+ [Release notes](https://github.com/girishkvs/mcp-pacemaker/releases)
4
11
 
5
12
  MCP hosts — editors (VS Code, Cursor, Claude Desktop) **and** CLIs (Claude Code, Copilot CLI,
6
13
  Codex, Gemini) — run stdio MCP servers as child processes. When the host restarts, crashes, or
@@ -19,36 +26,45 @@ is separate planned work.
19
26
 
20
27
  ## Quick start
21
28
 
22
- This README describes **2.0.x**. The current line is 2.x; the explicit maintenance line is
23
- 1.3.x. See the [legacy documentation](https://github.com/girishkvs/mcp-pacemaker/blob/v1.3.1/README.md)
24
- for its immediate-save behavior and [support policy](SECURITY.md#supported-versions).
29
+ Install **mcp-pacemaker 2.0.2** from npm. Use a maintained **Node.js 22 or 24**
30
+ release; Windows also needs PowerShell 7 and Windows Script Host.
31
+ See [installation requirements](#install) before setup.
25
32
 
26
- Compatibility gates distinguish immutable **1.3.0 / 2.0.0** from the **1.3.1 / 2.0.1** candidates.
27
- A 2.x client handles legacy immediate saves. A 1.x client cannot write pooling settings to a
28
- 2.x bridge: update the CLI and refresh old dashboard tabs. Before downgrading, settle pending
29
- or interrupted transactions with 2.x. See the [real-version gates](CONTRIBUTING.md#real-version-compatibility-gates)
30
- for exact pairs; other minor versions are not covered.
33
+ ```bash
34
+ npm install -g mcp-pacemaker@2.0.2
35
+ mcp-pacemaker --version
36
+ ```
37
+
38
+ The version check prints `2.0.2` without running setup.
39
+ Before setup, have a readable JSON host configuration containing server definitions, or
40
+ prepare [`~/.mcp-pacemaker/servers.json`](#serversjson). Supported import sources are
41
+ `vscode`, `cursor`, `claude` (Claude Desktop), `copilot-cli` and `gemini`.
42
+ Codex and Claude Code are wiring destinations, not import sources.
43
+
44
+ Then run interactive setup:
31
45
 
32
46
  ```bash
33
- npm i -g github:girishkvs/mcp-pacemaker#v2.0.1
34
47
  mcp-pacemaker init
35
48
  ```
36
49
 
37
- That one command does the whole setup:
50
+ `init` detects supported hosts, imports **one source host** (or reuses `servers.json`),
51
+ asks for confirmation before wiring the selected hosts, registers OS auto-start and
52
+ starts the bridge. Reload or restart the selected hosts afterward.
38
53
 
39
- 1. **detects** every MCP host you have installed — editors and CLIs,
40
- 2. **imports** the servers already configured in them into `~/.mcp-pacemaker/servers.json`,
41
- 3. **rewrites** each host's config to point at the bridge (backing every file up first),
42
- 4. **registers** OS auto-start so the bridge returns after a reboot,
43
- 5. **starts** the bridge and prints what it wired.
54
+ **Setup changes local configuration and auto-start.** Importing can create or update
55
+ `servers.json` before the wiring confirmation. Existing JSON/TOML host files get a `.bak`
56
+ before replacement; native Claude Code registrations do not. Keep your own protected
57
+ configuration backup, especially before repeating setup.
44
58
 
45
- Nothing is written before you see it: `mcp-pacemaker plan --client <host>` shows the exact
46
- changes, every config write leaves a `.bak`, and `mcp-pacemaker uninstall` restores them.
59
+ `--from` chooses the import source; `--client` chooses wiring destinations. For example,
60
+ `mcp-pacemaker init --from vscode --client codex` imports VS Code's definitions and wires
61
+ Codex. Without `--from`, setup prefers the first detected JSON host; it does not merge
62
+ every detected host. Omit `--yes` to keep the confirmation prompt.
47
63
 
48
- After setup, bare `mcp-pacemaker` reports status:
64
+ Check the running bridge:
49
65
 
50
66
  ```bash
51
- mcp-pacemaker # status: bridges, wired hosts, servers
67
+ mcp-pacemaker status # status without entering first-run setup
52
68
  mcp-pacemaker top # live terminal dashboard
53
69
  mcp-pacemaker doctor # diagnose config, reachability, wiring
54
70
  ```
@@ -56,12 +72,12 @@ mcp-pacemaker doctor # diagnose config, reachability, wiring
56
72
  <details>
57
73
  <summary>Prefer to drive it yourself? The same steps, one at a time</summary>
58
74
 
59
- Every command takes any host id — `vscode`, `cursor`, `claude`, `claude-code`, `copilot-cli`,
60
- `codex`, `gemini` (see [Supported hosts](#supported-hosts)). `--from` / `--client` below are
61
- just examples; substitute whichever you use.
75
+ `plan`, `install` and `emit` accept any [supported host](#supported-hosts) as a wiring target.
76
+ `import --from` accepts the five JSON import sources listed above. Run import first unless
77
+ you already have `servers.json`; `plan` needs that file.
62
78
 
63
79
  ```bash
64
- mcp-pacemaker import --from <host> # build servers.json from an existing host
80
+ mcp-pacemaker import --from <source> # write servers.json from one JSON host config
65
81
  mcp-pacemaker plan --client <host> # dry run: show what install would change
66
82
  mcp-pacemaker install --client <host> # wire one host (--port N gives it its own bridge)
67
83
  mcp-pacemaker start # start the bridge
@@ -81,23 +97,32 @@ them in.
81
97
 
82
98
  </details>
83
99
 
84
- ## Why not just use supergateway / mcp-proxy?
100
+ ## Which process-sharing mode?
85
101
 
86
- Those are great, mature stdio↔SSE bridges. `mcp-pacemaker` targets a different problem —
87
- *durable local hosting on a dev workstation* — and adds things they don't:
102
+ Sharing a bridge does not automatically share a server process.
88
103
 
89
- | | supergateway | mcp-proxy | **mcp-pacemaker** |
90
- |---|---|---|---|
91
- | stdio → SSE | ✅ | ✅ | ✅ |
92
- | Streamable HTTP | ✅ | ✅ | ✅ |
93
- | Dependencies | npm tree | PyPI tree | **bridge: zero** · tiny setup CLI |
94
- | Process supervision | ❌ | ❌ | ✅ |
95
- | OS auto-start (logon / unlock / boot) | ❌ | ❌ | ✅ (Windows / macOS / Linux) |
96
- | Dynamic per-request token (from a CLI, auto-refresh) | ❌ (static) | ❌ (static/OAuth2) | ✅ |
97
- | Sessions survive the bridge restarting | ❌ | ❌ | ✅ |
98
- | Scheduled recycle for interactively-authenticated servers | ❌ | ❌ | ✅ |
99
- | One-command import + client wiring | ❌ | ❌ | ✅ |
100
- | Web + terminal dashboard, HTTP API | ❌ | ❌ | ✅ |
104
+ | Mode | Process behavior | Use when |
105
+ |---|---|---|
106
+ | `isolated` (default) | One child per session | The server needs per-client workspace, account or conversation state |
107
+ | `pool` (opt-in) | Pre-started, uninitialized children; each is assigned exclusively to one session | Startup is slow but sessions must remain separate |
108
+ | `shared` (opt-in) | One initialized child for compatible sessions | Tools are stateless, inputs are explicit and the credential context is common |
109
+
110
+ Shared clients must send identical initialization parameters, including `clientInfo`, and
111
+ empty client capabilities. It is not automatic cross-editor sharing. See
112
+ [shared-mode limits](#shared-mode) before enabling it.
113
+
114
+ ## Choosing a transport tool
115
+
116
+ Documentation checked September 27, 2026; this is a use-case guide, not a feature benchmark.
117
+
118
+ | Tool | Consider it when |
119
+ |---|---|
120
+ | [Supergateway](https://github.com/supercorp-ai/supergateway) | You want command-line conversion between stdio and HTTP/SSE/WebSocket transports |
121
+ | [mcp-proxy](https://github.com/sparfenyuk/mcp-proxy) | You want a Python-based adapter between local stdio clients/servers and remote MCP transports |
122
+ | **mcp-pacemaker** | You want workstation process supervision, host wiring, auto-start, lifecycle diagnostics and explicit isolation/pooling/sharing policies |
123
+
124
+ These projects have overlapping capabilities. Reconnecting to a fresh server is not recovery
125
+ of arbitrary application state, and a transport bridge is not a sandbox for untrusted tools.
101
126
 
102
127
  ## Supported hosts
103
128
 
@@ -125,26 +150,25 @@ Use a maintained **Node.js 22 or 24** release. Node 20 remains a compatibility t
125
150
  end-of-life, not a recommended secure runtime. The bridge has no npm runtime dependencies;
126
151
  the setup CLI and dashboard have their own dependencies.
127
152
 
128
- GitHub and npm publication are separate. Until the npm release is announced from
129
- [this repository](https://github.com/girishkvs/mcp-pacemaker/releases), use the pinned GitHub
130
- release. Do not assume that an npm package with a matching name is this project.
153
+ Install the released package from [npm](https://www.npmjs.com/package/mcp-pacemaker).
154
+ Its repository link should point to
155
+ [`girishkvs/mcp-pacemaker`](https://github.com/girishkvs/mcp-pacemaker).
156
+ Use an exact version for a repeatable installation:
131
157
 
132
158
  ```bash
133
- npm i -g github:girishkvs/mcp-pacemaker#v2.0.1
134
- # Deliberate legacy installation instead:
135
- npm i -g github:girishkvs/mcp-pacemaker#v1.3.1
159
+ npm install -g mcp-pacemaker@2.0.2
160
+ mcp-pacemaker --version
136
161
  ```
137
162
 
138
- After npm publication, `mcp-pacemaker@latest` selects the current 2.x line and
139
- `mcp-pacemaker@legacy` selects maintained 1.3.x. Verify the official listing's repository and
140
- maintainer before installing. For a repeatable installation, choose an exact released version:
163
+ The current line uses the `latest` npm channel; the maintenance line uses `legacy` when that
164
+ channel has been published. Check the actual registry values before choosing a channel:
141
165
 
142
166
  ```bash
143
- npm i -g mcp-pacemaker@2.0.1
144
- # Or, deliberately:
145
- npm i -g mcp-pacemaker@1.3.1
167
+ npm view mcp-pacemaker dist-tags --json
146
168
  ```
147
169
 
170
+ GitHub tags and npm publication are separate: a tag does not establish that the same
171
+ version or channel is available on npm, or that its package bytes are identical.
148
172
  `@1` and `@2` are version ranges, not the maintained channels. They can select a version
149
173
  withdrawn from a channel. `upgrade --self` resolves the installed major's channel and prints
150
174
  an exact-version command; it never installs or downgrades anything.
@@ -158,11 +182,26 @@ Automatic configuration edits need .NET Framework 4.6.2 or newer. The bundled he
158
182
  unsigned; npm provenance is not Authenticode signing or an application-control allowlist.
159
183
  Windows ARM64 is not validated.
160
184
 
185
+ ### Version compatibility
186
+
187
+ This README describes **2.0.x**. For 1.3.x immediate-save behavior, see the
188
+ [legacy documentation](https://github.com/girishkvs/mcp-pacemaker/blob/v1.3.1/README.md)
189
+ and [support policy](SECURITY.md#supported-versions). Those documents do not establish
190
+ that a legacy version is available on npm.
191
+
192
+ The historical baselines remain **1.3.0 / 2.0.0**. The earlier **1.3.1 / 2.0.1**
193
+ patch-pair evidence is not transferable to a new release. The selected **1.3.1 / 2.0.2**
194
+ pair requires fresh exact-byte compatibility and service-replacement gates.
195
+ A 2.x client handles legacy immediate saves. A 1.x client cannot write pooling settings to a
196
+ 2.x bridge: update the CLI and refresh old dashboard tabs. Before downgrading, settle pending
197
+ or interrupted transactions with 2.x. See the [real-version gates](CONTRIBUTING.md#real-version-compatibility-gates)
198
+ for exact pairs; only the exact executed pairs are covered.
199
+
161
200
  ### Command reference
162
201
 
163
202
  | Command | What it does |
164
203
  |---|---|
165
- | `init [--client a,b] [--yes]` | **The one you want.** Detect hosts, import, wire, auto-start, launch |
204
+ | `init [--from source] [--client a,b] [--yes]` | Interactive setup: import one source, wire selected hosts, auto-start, launch |
166
205
  | `status` | Bridges, wired hosts, servers, and any server currently failing |
167
206
  | `reload` | Re-read `servers.json` into the running bridge without restarting it |
168
207
  | `doctor` | Diagnose config, bridge reachability, host wiring |
@@ -171,13 +210,13 @@ Windows ARM64 is not validated.
171
210
  | `logs [--follow] [--since 2h] [--server name] [--grep text]` | Read and filter durable logs, including retained rotation |
172
211
  | `top` / `dashboard` | Live terminal UI / web dashboard |
173
212
  | `plan --client <host>` | Dry run — show exactly what `install` would change |
174
- | `import --from <host>` | Build `~/.mcp-pacemaker/servers.json` from an existing host |
213
+ | `import --from <source>` | Build `~/.mcp-pacemaker/servers.json` from one supported JSON host config |
175
214
  | `install --client <host> [--port N]` | Wire one host (its own `--port` gives it its own bridge) |
176
215
  | `emit --client <host>` | Print the config entries without writing anything |
177
216
  | `start` / `stop` | Start or stop bridges (`--port` for one, else all) |
178
217
  | `upgrade [--self]` | Re-wire hosts; `--self` only prints same-major, exact-version installation guidance |
179
218
  | `update-check [--json]` | Compare the installed version with its maintained npm channel |
180
- | `uninstall` | Stop the bridge, remove auto-start, restore configs from `.bak` |
219
+ | `uninstall` | Stop managed bridges, remove auto-start, restore available host-file `.bak` copies; native entries are not restored |
181
220
 
182
221
  > Package installation does not upgrade a running backend. `upgrade` rewires host configuration;
183
222
  > it does not replace package files, restart an adopted backend, or update its autostart path.
@@ -198,7 +237,10 @@ relying on an implicit socket-location fallback.
198
237
  Isolated and pooled stdio servers support HTTP+SSE (`/<name>/sse`) and Streamable HTTP
199
238
  (`/<name>/mcp`). Shared mode requires Streamable HTTP.
200
239
 
201
- `install` writes a `.bak` of your client config before touching it, and `uninstall` restores it.
240
+ `install` backs up an existing JSON/TOML host file to `.bak`; repeating it replaces that backup.
241
+ `uninstall` restores available host-file backups, leaves files without backups as-is, and
242
+ keeps `servers.json`. Native Claude Code registrations are not backed up or automatically
243
+ restored; record their original definitions separately and restore them through Claude Code.
202
244
 
203
245
  ### Replacing or rolling back a running installation
204
246
 
@@ -607,7 +649,19 @@ See [the shared-session contract](docs/shared-sessions.md) for limits and failur
607
649
  ## Uninstall
608
650
 
609
651
  ```bash
610
- npx mcp-pacemaker uninstall # stop bridge, remove auto-start, restore client config from .bak
652
+ mcp-pacemaker uninstall # use the CLI from the matching installed version
653
+ ```
654
+
655
+ This stops managed bridges, removes auto-start entries and restores available host-file
656
+ backups. It leaves files without backups and native Claude Code registrations unchanged.
657
+ It is not scoped to one port; review [replacement and rollback](#replacing-or-rolling-back-a-running-installation)
658
+ first if another instance must remain running. Do not fetch a different CLI with `npx`
659
+ to remove an existing installation.
660
+
661
+ After the installed service has been removed successfully, remove the global npm package:
662
+
663
+ ```bash
664
+ npm uninstall -g mcp-pacemaker
611
665
  ```
612
666
 
613
667
  ## Project
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mcp-pacemaker",
3
- "version": "2.0.1",
3
+ "version": "2.0.2",
4
4
  "description": "Keeps your MCP servers alive across editor restarts, reboots, and token expiry — pluggable auth, cross-platform auto-start, one-command setup. Zero-dependency bridge; a small CLI for setup.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -27,7 +27,7 @@
27
27
  "version": "7.3.6"
28
28
  }
29
29
  ],
30
- "producerLockSha256": "3946d2db15350b7ad8f815710004243dd1116682e9cdcb880beac27baed92244",
30
+ "producerLockSha256": "b88a73a6212e26f4c4dde985d84eadf39870c8758e4698cdd5544b8a55eb8cca",
31
31
  "projectLicenseSha256": "590ad9c29ee5580f83b9c05e403ca259d89e8366d1ed4c7207aa5e0a07afbf79",
32
32
  "noticesSha256": "11abb641d5175ce3817909603274fd0675b222ed53fae98d3513fd3f25eb56fc",
33
33
  "chunks": [