@ken-jo/agent-connector 0.4.94 → 0.4.95

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.
Files changed (70) hide show
  1. package/README.md +155 -41
  2. package/dist/{action-VW5SACXY.js → action-Q7GGO4PA.js} +8 -8
  3. package/dist/{chunk-2RIFORQS.js → chunk-3NH2ARIS.js} +2 -2
  4. package/dist/{chunk-KJLFGQQM.js → chunk-5IOTP7LQ.js} +3 -3
  5. package/dist/{chunk-KJLFGQQM.js.map → chunk-5IOTP7LQ.js.map} +1 -1
  6. package/dist/{chunk-P23RVIUY.js → chunk-7F5KHLEP.js} +4 -4
  7. package/dist/{chunk-B5W3RHTI.js → chunk-APZDTY76.js} +2 -2
  8. package/dist/{chunk-SILKSP2Y.js → chunk-D4ELPBB5.js} +2 -2
  9. package/dist/{chunk-TQRLMA2C.js → chunk-H33M77DD.js} +18 -18
  10. package/dist/{chunk-I5TO42QC.js → chunk-I5UXHIDT.js} +3 -3
  11. package/dist/{chunk-ZMAJ2XFD.js → chunk-ISEJWBFF.js} +2 -2
  12. package/dist/{chunk-TTKSYJRY.js → chunk-PAPMUAR5.js} +5 -5
  13. package/dist/{chunk-KSPMSRVU.js → chunk-PW42ZXCB.js} +2 -2
  14. package/dist/{chunk-EHP7WISI.js → chunk-YPAXJ7EW.js} +11 -6
  15. package/dist/chunk-YPAXJ7EW.js.map +1 -0
  16. package/dist/{claude-code-DUZNOAS2.js → claude-code-GRWO6XBZ.js} +4 -4
  17. package/dist/cli/sdk.js +4 -4
  18. package/dist/cli.js +1 -1
  19. package/dist/{define-connector-LQFJL_at.d.ts → define-connector-DTWb46UB.d.ts} +1 -1
  20. package/dist/{detect-P5OA5UYM.js → detect-6V4LC3MA.js} +4 -4
  21. package/dist/{doctor-2O2Q6MIB.js → doctor-2YDUVSAU.js} +11 -11
  22. package/dist/{hook-4N3BMKIK.js → hook-OEVRDMXD.js} +8 -8
  23. package/dist/index.d.ts +3 -3
  24. package/dist/index.js +2 -2
  25. package/dist/{install-NPN77N3S.js → install-5NMCUDG5.js} +8 -8
  26. package/dist/{introspect-D4fEGuhN.d.ts → introspect-dNekqPDY.d.ts} +1 -1
  27. package/dist/{leaderboard-QKB36OBR.js → leaderboard-XEKS7B3H.js} +2 -2
  28. package/dist/{package-Q6DV5247.js → package-G25GVTH2.js} +6 -6
  29. package/dist/runtime/index.d.ts +1 -1
  30. package/dist/runtime/index.js +6 -6
  31. package/dist/sdk/index.d.ts +4 -4
  32. package/dist/sdk/index.js +3 -3
  33. package/dist/sdk/test.d.ts +2 -2
  34. package/dist/sdk/test.js +6 -6
  35. package/dist/{serve-MJTTXDX4.js → serve-XTMIUHKK.js} +8 -8
  36. package/dist/{status-Q3UY4NZU.js → status-VJAGO4Z7.js} +6 -6
  37. package/dist/{statusline-QF4G724E.js → statusline-EY2E2UGF.js} +7 -7
  38. package/dist/{telemetry-JHVRDDNK.js → telemetry-OLZQBADT.js} +5 -5
  39. package/dist/{types-BhcUEIJJ.d.ts → types-JyhpJHJa.d.ts} +4 -2
  40. package/dist/{uninstall-H2SOV3AP.js → uninstall-AZEUPAND.js} +8 -8
  41. package/dist/{upgrade-UCSG7L5U.js → upgrade-CAUUHSSC.js} +8 -8
  42. package/dist/{usage-4EGIJ4TM.js → usage-3KHZ4RYZ.js} +2 -2
  43. package/dist/{usage-event-GRQE7XWT.js → usage-event-TZWOZPRJ.js} +7 -7
  44. package/package.json +2 -2
  45. package/dist/chunk-EHP7WISI.js.map +0 -1
  46. /package/dist/{action-VW5SACXY.js.map → action-Q7GGO4PA.js.map} +0 -0
  47. /package/dist/{chunk-2RIFORQS.js.map → chunk-3NH2ARIS.js.map} +0 -0
  48. /package/dist/{chunk-P23RVIUY.js.map → chunk-7F5KHLEP.js.map} +0 -0
  49. /package/dist/{chunk-B5W3RHTI.js.map → chunk-APZDTY76.js.map} +0 -0
  50. /package/dist/{chunk-SILKSP2Y.js.map → chunk-D4ELPBB5.js.map} +0 -0
  51. /package/dist/{chunk-TQRLMA2C.js.map → chunk-H33M77DD.js.map} +0 -0
  52. /package/dist/{chunk-I5TO42QC.js.map → chunk-I5UXHIDT.js.map} +0 -0
  53. /package/dist/{chunk-ZMAJ2XFD.js.map → chunk-ISEJWBFF.js.map} +0 -0
  54. /package/dist/{chunk-TTKSYJRY.js.map → chunk-PAPMUAR5.js.map} +0 -0
  55. /package/dist/{chunk-KSPMSRVU.js.map → chunk-PW42ZXCB.js.map} +0 -0
  56. /package/dist/{claude-code-DUZNOAS2.js.map → claude-code-GRWO6XBZ.js.map} +0 -0
  57. /package/dist/{detect-P5OA5UYM.js.map → detect-6V4LC3MA.js.map} +0 -0
  58. /package/dist/{doctor-2O2Q6MIB.js.map → doctor-2YDUVSAU.js.map} +0 -0
  59. /package/dist/{hook-4N3BMKIK.js.map → hook-OEVRDMXD.js.map} +0 -0
  60. /package/dist/{install-NPN77N3S.js.map → install-5NMCUDG5.js.map} +0 -0
  61. /package/dist/{leaderboard-QKB36OBR.js.map → leaderboard-XEKS7B3H.js.map} +0 -0
  62. /package/dist/{package-Q6DV5247.js.map → package-G25GVTH2.js.map} +0 -0
  63. /package/dist/{serve-MJTTXDX4.js.map → serve-XTMIUHKK.js.map} +0 -0
  64. /package/dist/{status-Q3UY4NZU.js.map → status-VJAGO4Z7.js.map} +0 -0
  65. /package/dist/{statusline-QF4G724E.js.map → statusline-EY2E2UGF.js.map} +0 -0
  66. /package/dist/{telemetry-JHVRDDNK.js.map → telemetry-OLZQBADT.js.map} +0 -0
  67. /package/dist/{uninstall-H2SOV3AP.js.map → uninstall-AZEUPAND.js.map} +0 -0
  68. /package/dist/{upgrade-UCSG7L5U.js.map → upgrade-CAUUHSSC.js.map} +0 -0
  69. /package/dist/{usage-4EGIJ4TM.js.map → usage-3KHZ4RYZ.js.map} +0 -0
  70. /package/dist/{usage-event-GRQE7XWT.js.map → usage-event-TZWOZPRJ.js.map} +0 -0
package/README.md CHANGED
@@ -7,16 +7,16 @@
7
7
  ### Deploy one MCP to every agent CLI.
8
8
 
9
9
  Write your server + hooks once with `defineConnector()`, then `install` it into
10
- the native config — or `package` it as a real plugin — across **42 agent CLIs**
10
+ the native config — or `package` it as a real plugin — across every detected agent CLI
11
11
  (Claude Code, Codex, Cursor, Copilot, Gemini, OpenCode, Warp, Zed…).
12
12
 
13
13
  [![npm](https://img.shields.io/npm/v/@ken-jo/agent-connector?color=cb3837&logo=npm)](https://www.npmjs.com/package/@ken-jo/agent-connector)
14
14
  [![license](https://img.shields.io/npm/l/@ken-jo/agent-connector?color=22c55e)](LICENSE)
15
- ![platforms](https://img.shields.io/badge/platforms-42-2563eb)
15
+ [![platform coverage](https://img.shields.io/badge/platform%20coverage-see%20%2Fcoverage-2563eb)](https://agent-connector.ai/coverage)
16
16
  ![surfaces](https://img.shields.io/badge/surfaces-MCP%20%7C%20hooks%20%7C%20commands%20%7C%20tools%20%7C%20memory%20%7C%20status%20line-2563eb)
17
17
  ![hook paradigms](https://img.shields.io/badge/hook%20paradigms-3-2563eb)
18
- ![install verified](https://img.shields.io/badge/install%20verified-42%2F42-22c55e)
19
- ![headless runtime](https://img.shields.io/badge/headless%20runtime-20%20CLIs%20activated-22c55e)
18
+ [![install verified](https://img.shields.io/badge/install%20verified-registry%20harness-22c55e)](https://agent-connector.ai/coverage)
19
+ [![headless runtime](https://img.shields.io/badge/headless%20runtime-verified%20matrix-22c55e)](https://agent-connector.ai/coverage)
20
20
  ![marketplace](https://img.shields.io/badge/package-10%20marketplace%20formats-2563eb)
21
21
  ![tests](https://img.shields.io/badge/tests-passing-22c55e)
22
22
 
@@ -31,7 +31,7 @@ if you already run an agent CLI and just want token totals, jump straight to
31
31
  - [CLI](#cli) — every command at a glance
32
32
  - [Token telemetry & usage](#token-telemetry--usage) — per-tool telemetry vs. connector-free `usage`
33
33
  - [Publish to the MCP ecosystem](#publish-to-the-mcp-ecosystem) — emit the official MCP standard artifacts
34
- - [Verification](#verification) — how the 42-platform contract is proven
34
+ - [Verification](#verification) — how the platform coverage contract is proven
35
35
 
36
36
  <p align="center">
37
37
  <a href="examples/showcase-demo/">
@@ -51,8 +51,10 @@ agent-connector is an **SDK connector developers depend on**. Add it to the
51
51
  package that holds your connector, declare the connector once, then ship a
52
52
  branded MCP package/bin such as `npx @acme/acme-db-mcp install` — it deploys to
53
53
  every detected agent CLI in that host's own native config. Installing
54
- `@ken-jo/agent-connector` globally is only an optional path for connector-free
55
- token usage reports. The linear path is:
54
+ `@ken-jo/agent-connector` globally is not the branded MCP lifecycle path; reserve
55
+ the global CLI guidance for connector-free token usage reports. Framework
56
+ artifact tooling stays developer-facing and normally runs through
57
+ `npx @ken-jo/agent-connector ... --connector`. The linear path is:
56
58
  **get a server → declare it → install through your branded package**.
57
59
 
58
60
  **0. You need an MCP server file first.** The config below points at
@@ -73,21 +75,22 @@ npm install @ken-jo/agent-connector
73
75
  "name": "@acme/acme-db-mcp",
74
76
  "mcpName": "io.github.acme/acme-db",
75
77
  "bin": { "acme-db": "./bin.mjs" },
76
- "dependencies": { "@ken-jo/agent-connector": "^0.4.92" }
78
+ "dependencies": { "@ken-jo/agent-connector": "^0.4.94" }
77
79
  }
78
80
  ```
79
81
 
80
82
  ```js
81
83
  // 3. agent-connector.config.mjs — declare your server + hooks once
82
84
  import { fileURLToPath } from "node:url";
83
- import { defineConnector } from "@ken-jo/agent-connector";
85
+ import { defineConnector } from "@ken-jo/agent-connector/sdk";
84
86
 
85
87
  const serverPath = fileURLToPath(new URL("./my-mcp-server.mjs", import.meta.url));
86
88
 
87
89
  export default defineConnector({
88
90
  // package.json / npm metadata is the source of truth. The host alias/runtime
89
91
  // id and connector version are derived from name/mcpName/bin/version unless
90
- // you need a multi-instance alias.
92
+ // you need a legacy or multi-instance alias. Host-native ids are generated
93
+ // during install, so do not copy them back into defineConnector({ id }).
91
94
  server: {
92
95
  transport: "stdio",
93
96
  command: "node",
@@ -97,10 +100,106 @@ export default defineConnector({
97
100
  });
98
101
  ```
99
102
 
100
- > While developing, `server.command` can be `node` + a local file path (as
101
- > above); once your server is a published package, switch to `npx` + the package
102
- > name (`command: "npx", args: ["-y", "@acme/acme-db-mcp"]`) the form the
103
- > [site quick-start](https://agent-connector.ai) teaches.
103
+ The wiring contract is:
104
+
105
+ 1. `package.json` defines the public product identity (`name`, `mcpName`, `bin`,
106
+ `version`).
107
+ 2. `bin.mjs` calls `createConnectorCli({ packageJson, connector })` so every
108
+ install/doctor/upgrade/uninstall command runs under the developer's brand.
109
+ 3. `agent-connector.config.*` uses `defineConnector({ server, ...surfaces })` to
110
+ describe the real MCP launch shape or remote endpoint.
111
+ 4. `install` renders that single declaration into each detected host's native
112
+ MCP config. For stdio processes, the host points at the stable
113
+ agent-connector home binary, which launches the real command and can measure
114
+ per-tool traffic. For remote HTTP servers, the host receives the URL where
115
+ supported; there is no stdio process to wrap.
116
+
117
+ ### Command boundary
118
+
119
+ Keep the two command layers separate:
120
+
121
+ | Layer | Who runs it | Examples | Purpose |
122
+ | --- | --- | --- | --- |
123
+ | Branded MCP lifecycle | Users of your MCP package | `npx @acme/acme-db-mcp install`, `acme-db doctor --probe`, `acme-db upgrade`, `acme-db uninstall`, `acme-db telemetry report --by tool` | Install, verify, update, remove, and inspect telemetry for **your MCP**. |
124
+ | Framework tooling | MCP package developers | `npx @ken-jo/agent-connector package --connector ./agent-connector.config.mjs` | Emit host plugin bundles and MCP distribution artifacts from a connector config. |
125
+ | Connector-free user telemetry | Agent-CLI users with no MCP package | `npx @ken-jo/agent-connector usage report --by platform` | Read host CLI logs read-only for whole-conversation token totals. |
126
+
127
+ If a command operates the MCP after it is authored, prefer the branded package/bin.
128
+ If a command builds framework distribution artifacts, use the framework CLI.
129
+
130
+ ### MCP server launch examples
131
+
132
+ Pick the `server` shape that matches the MCP you are building. The wrapper
133
+ package identity still comes from `package.json`; these examples only describe
134
+ how to start or connect to the actual MCP server.
135
+
136
+ | Shape | Use when | Minimal launch |
137
+ | --- | --- | --- |
138
+ | Package-runner MCP | The MCP is published as a package. | `npx -y @acme/acme-db-mcp` |
139
+ | Local server-process MCP | The MCP server ships inside your package. | `node ./my-mcp-server.mjs` |
140
+ | Python MCP | The MCP server is Python and should resolve runtime deps at launch. | `uv run --with mcp ./my_mcp_server.py` |
141
+ | CLI-based MCP | An existing executable exposes an MCP serving mode. | `local-tools mcp serve` |
142
+ | Remote server MCP | The MCP is hosted behind an HTTP endpoint. | `https://mcp.example.com/mcp` |
143
+
144
+ Each snippet below is the `server` field for `defineConnector({ ... })`; only
145
+ the local server-process example needs the `serverPath` helper shown inline.
146
+
147
+ **Package-runner MCP** — a published package that should be launched with `npx`:
148
+
149
+ ```js
150
+ server: {
151
+ transport: "stdio",
152
+ command: "npx",
153
+ args: ["-y", "@acme/acme-db-mcp"],
154
+ }
155
+ ```
156
+
157
+ **Local server-process MCP** — a bundled server file or binary:
158
+
159
+ ```js
160
+ import { fileURLToPath } from "node:url";
161
+
162
+ const serverPath = fileURLToPath(new URL("./my-mcp-server.mjs", import.meta.url));
163
+
164
+ server: {
165
+ transport: "stdio",
166
+ command: "node",
167
+ args: [serverPath],
168
+ }
169
+ ```
170
+
171
+ **Python MCP** — usually run through `uv` so dependencies are resolved with the
172
+ server:
173
+
174
+ ```js
175
+ server: {
176
+ transport: "stdio",
177
+ command: "uv",
178
+ args: ["run", "--with", "mcp", "./my_mcp_server.py"],
179
+ }
180
+ ```
181
+
182
+ Use direct `python ./my_mcp_server.py` only when the runtime environment is
183
+ already managed by your package or deployment wrapper.
184
+
185
+ **CLI-based MCP** — an existing executable exposes an MCP mode:
186
+
187
+ ```js
188
+ server: {
189
+ transport: "stdio",
190
+ command: "local-tools",
191
+ args: ["mcp", "serve"],
192
+ }
193
+ ```
194
+
195
+ **Remote server MCP** — a hosted MCP endpoint:
196
+
197
+ ```js
198
+ server: {
199
+ transport: "http",
200
+ url: "https://mcp.example.com/mcp",
201
+ }
202
+ ```
104
203
 
105
204
  ```bash
106
205
  # 4. deploy under your branded MCP package/bin
@@ -111,10 +210,11 @@ npx @acme/acme-db-mcp install # write native config in each host
111
210
 
112
211
  > `install` targets only the hosts actually **detected** on this machine (or an
113
212
  > explicit `--targets` / `connector.targets` list), intersected with the
114
- > 42-adapter registry there is no "install to all 42 unconditionally" path.
213
+ > current adapter registry shown on [`/coverage`](https://agent-connector.ai/coverage)
214
+ > — there is no "install to every host unconditionally" path.
115
215
  > `@ken-jo/agent-connector` is the framework dependency underneath; use it
116
- > directly for development fallback or connector-free token telemetry, not as
117
- > the foreground install brand for your users.
216
+ > directly for framework packaging/debugging or connector-free token telemetry,
217
+ > not as the foreground install brand for your users.
118
218
 
119
219
  ## Ship it: direct install or a marketplace plugin
120
220
 
@@ -125,11 +225,14 @@ Same one definition, your choice of distribution.
125
225
  content-surface config in place, with no per-platform marketplace submission or
126
226
  review. This is the Quick start path above.
127
227
 
128
- **Marketplace plugin** — `agent-connector package` turns the connector into a
129
- real plugin/extension bundle (manifest + bundled commands, agents, skills,
130
- hooks, MCP) from one definition. Hooks + MCP keep the telemetry serve-wrapper,
131
- so a marketplace-installed connector still reports per-tool tokens for its stdio
132
- server. `--format all` emits **10 host formats**:
228
+ **Marketplace plugin** — the framework `package` command turns the connector
229
+ into a real plugin/extension bundle (manifest + bundled commands, agents,
230
+ skills, hooks, MCP) from one definition. This is framework tooling, so run it
231
+ with `npx @ken-jo/agent-connector package --connector ...`. If you already keep
232
+ the framework CLI installed globally, `agent-connector package --connector ...`
233
+ is only the shorter equivalent. Hooks + MCP keep the
234
+ telemetry serve-wrapper, so a marketplace-installed connector still reports
235
+ per-tool tokens for its stdio server. `--format all` emits **10 host formats**:
133
236
 
134
237
  | Format | Hosts |
135
238
  |---|---|
@@ -151,8 +254,11 @@ so they're excluded from `--format all`) — `mcp-server-json` (an MCP Registry
151
254
 
152
255
  ```bash
153
256
  # emit every host format (mcp-server-json + mcpb are opt-in by name)
154
- agent-connector package --format all --out ./dist-plugin
155
- agent-connector package --format gemini-extension --out ./ext # or just one
257
+ npx @ken-jo/agent-connector package --connector ./agent-connector.config.mjs --format all --out ./dist-plugin
258
+ npx @ken-jo/agent-connector package --connector ./agent-connector.config.mjs --format gemini-extension --out ./ext # or just one
259
+
260
+ # if you already keep the framework CLI globally installed, the same command is:
261
+ agent-connector package --connector ./agent-connector.config.mjs --format all --out ./dist-plugin
156
262
 
157
263
  # e.g. Claude Code: /plugin marketplace add ./dist-plugin/claude-plugin
158
264
  # /plugin install <connector-id>@agent-connector
@@ -203,7 +309,10 @@ import { createConnectorCli } from "@ken-jo/agent-connector/cli";
203
309
 
204
310
  // run() resolves to the exit code and never calls process.exit
205
311
  process.exitCode = await createConnectorCli({
312
+ // packageJson supplies public identity: name, mcpName, bin, version.
206
313
  packageJson: new URL("./package.json", import.meta.url),
314
+ // connector supplies behavior: server, hooks, skills, telemetry.
315
+ // These are two layers, not duplicate id/display-name inputs.
207
316
  connector: new URL("./agent-connector.config.mjs", import.meta.url),
208
317
  }).run();
209
318
  ```
@@ -226,7 +335,7 @@ format, or *skip-warns* (never silently drops) where a host can't support it.
226
335
 
227
336
  ```ts
228
337
  import { fileURLToPath } from "node:url";
229
- import { defineConnector } from "@ken-jo/agent-connector";
338
+ import { defineConnector } from "@ken-jo/agent-connector/sdk";
230
339
 
231
340
  // Resolve your server to an absolute path — host CLIs spawn it from their own CWD.
232
341
  const serverPath = fileURLToPath(new URL("./my-mcp-server.mjs", import.meta.url));
@@ -305,11 +414,12 @@ everywhere.
305
414
  ### Memory, statusline, actions, and the SDK
306
415
 
307
416
  - **`memory`** (aligned with the [AGENTS.md](https://agents.md) standard) — ship
308
- standing guidance that lands in `AGENTS.md` on 33 of the 42 hosts; the two that
309
- don't read it (Claude Code `CLAUDE.md`, Gemini CLI → `GEMINI.md`) are wired
310
- per their own official docs. Writes are surgical marker-fenced, hash-stamped
311
- managed blocks multiple connectors coexist, bytes outside your markers are
312
- never touched, and uninstall excises exactly your blocks.
417
+ standing guidance into the memory/rules file each host actually reads.
418
+ AGENTS.md adopters get the standard file; host-specific exceptions such as
419
+ Claude Code `CLAUDE.md` and Gemini CLI → `GEMINI.md` are wired per their own
420
+ official docs. Writes are surgical marker-fenced, hash-stamped managed blocks
421
+ multiple connectors coexist, bytes outside your markers are never touched,
422
+ and uninstall excises exactly your blocks.
313
423
  - **`statusline`** (`defineStatusline`) — a live HUD render function the host
314
424
  calls on every status refresh. v1 registers Claude Code's `settings.json.statusLine`
315
425
  or Qwen Code's `settings.json.ui.statusLine` (set-if-absent, refcounted,
@@ -328,7 +438,9 @@ everywhere.
328
438
  `capabilitiesOf`, `surfaceSupport`), and an **offline harness**
329
439
  (`simulate`, `explain`, `explainHooks`) that runs the real adapter
330
440
  parse→handler→format chain to answer *"does my handler actually work on host
331
- X?"* before you touch a real host. See
441
+ X?"* before you touch a real host. Agent-facing guidance is intentionally
442
+ split into a small router skill plus focused references under
443
+ [`skills/agent-connector/references`](skills/agent-connector/references). See
332
444
  [`docs/ARCHITECTURE.md`](docs/ARCHITECTURE.md).
333
445
 
334
446
  ## How it works
@@ -345,8 +457,9 @@ everywhere.
345
457
  only framework-owned state lives under the data-root.
346
458
  - **Windows-first correctness.** No symlinks, no POSIX-only assumptions.
347
459
 
348
- **Three hook paradigms**, all install-verified across the 42-platform set
349
- (see [`docs/ARCHITECTURE.md`](docs/ARCHITECTURE.md)):
460
+ **Three hook paradigms**, all install-verified across the registered platform
461
+ set (see [`/coverage`](https://agent-connector.ai/coverage) and
462
+ [`docs/ARCHITECTURE.md`](docs/ARCHITECTURE.md)):
350
463
 
351
464
  | Paradigm | Platforms |
352
465
  |---|---|
@@ -455,14 +568,15 @@ defineConnector({
455
568
 
456
569
  ## Verification
457
570
 
458
- The full single-API contract is **install-verified across all 42 platforms** by
459
- a committed registry-driven install-roundtrip harness that, for every adapter,
460
- drives the real install → uninstall into an isolated HOME and asserts on-disk
461
- placement + zero residue. A separate committed `scripts/verify-host.mjs` driver
462
- installs **20 real host CLIs** and verifies install → placement →
463
- clean-uninstall, and live hook dispatch + telemetry are proven end-to-end on
464
- several of them. The remaining hosts (IDE extensions / GUI editors with no
465
- headless CLI) stay covered by the install-roundtrip harness.
571
+ The full single-API contract is **install-verified across the current platform
572
+ registry** by a committed registry-driven install-roundtrip harness that, for
573
+ every adapter, drives the real install → uninstall into an isolated HOME and
574
+ asserts on-disk placement + zero residue. A separate committed
575
+ `scripts/verify-host.mjs` driver installs real host CLIs from the verification
576
+ matrix and checks install → placement → clean-uninstall; live hook dispatch +
577
+ telemetry are proven end-to-end where the host can run headlessly. IDE
578
+ extensions / GUI editors with no headless CLI stay covered by the
579
+ install-roundtrip harness.
466
580
 
467
581
  **Dogfood result:** porting the real multi-host context-mode plugin to
468
582
  `defineConnector` collapsed **~20,322 lines of hand-maintained per-host code down
@@ -1,19 +1,19 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  fail
4
- } from "./chunk-TQRLMA2C.js";
4
+ } from "./chunk-H33M77DD.js";
5
5
  import {
6
6
  runAction
7
- } from "./chunk-EHP7WISI.js";
7
+ } from "./chunk-YPAXJ7EW.js";
8
8
  import "./chunk-OP4KBXUO.js";
9
9
  import "./chunk-Z2MRSS2I.js";
10
- import "./chunk-ZMAJ2XFD.js";
11
- import "./chunk-I5TO42QC.js";
10
+ import "./chunk-ISEJWBFF.js";
11
+ import "./chunk-I5UXHIDT.js";
12
12
  import "./chunk-KHO5WNTP.js";
13
13
  import "./chunk-IVAWP6HH.js";
14
- import "./chunk-KSPMSRVU.js";
15
- import "./chunk-KJLFGQQM.js";
16
- import "./chunk-SILKSP2Y.js";
14
+ import "./chunk-PW42ZXCB.js";
15
+ import "./chunk-5IOTP7LQ.js";
16
+ import "./chunk-D4ELPBB5.js";
17
17
  import "./chunk-NBYKLUF6.js";
18
18
  import "./chunk-4NHXLXSD.js";
19
19
  import "./chunk-UMQ6NBQR.js";
@@ -52,4 +52,4 @@ async function run(argv) {
52
52
  export {
53
53
  run
54
54
  };
55
- //# sourceMappingURL=action-VW5SACXY.js.map
55
+ //# sourceMappingURL=action-Q7GGO4PA.js.map
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  allAdapters,
4
4
  loadAdapter
5
- } from "./chunk-SILKSP2Y.js";
5
+ } from "./chunk-D4ELPBB5.js";
6
6
 
7
7
  // src/sdk/introspect.ts
8
8
  function hostCanFireEvent(c, event) {
@@ -87,4 +87,4 @@ export {
87
87
  hostsSupporting,
88
88
  surfaceSupport
89
89
  };
90
- //# sourceMappingURL=chunk-2RIFORQS.js.map
90
+ //# sourceMappingURL=chunk-3NH2ARIS.js.map
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  REGISTERED_PLATFORM_IDS
4
- } from "./chunk-SILKSP2Y.js";
4
+ } from "./chunk-D4ELPBB5.js";
5
5
  import {
6
6
  CONFIG_PATCH_SEGMENT_RE,
7
7
  configPatchNamespaceViolation,
@@ -159,7 +159,7 @@ function inferNpmPackageFromServer(server) {
159
159
  }
160
160
  function resolveMcpPackageIdentity(input) {
161
161
  const packageName = input.mcp?.packageName ?? inferNpmPackageFromServer(input.server);
162
- const hostAlias = input.mcp?.hostAlias ?? (packageName ? deriveHostAliasFromPackageName(packageName) : void 0) ?? (input.mcp?.mcpName ? deriveHostAliasFromMcpName(input.mcp.mcpName) : void 0) ?? (input.mcp?.bin ? cleanMcpBasename(input.mcp.bin) : void 0);
162
+ const hostAlias = input.mcp?.hostAlias ?? (input.mcp?.mcpName ? deriveHostAliasFromMcpName(input.mcp.mcpName) : void 0) ?? (packageName ? deriveHostAliasFromPackageName(packageName) : void 0) ?? (input.mcp?.bin ? cleanMcpBasename(input.mcp.bin) : void 0);
163
163
  return {
164
164
  ...packageName ? { packageName } : {},
165
165
  ...input.mcp?.mcpName ? { mcpName: input.mcp.mcpName } : {},
@@ -668,4 +668,4 @@ export {
668
668
  defineConfigPatch,
669
669
  defineNativeHook
670
670
  };
671
- //# sourceMappingURL=chunk-KJLFGQQM.js.map
671
+ //# sourceMappingURL=chunk-5IOTP7LQ.js.map