@melra/cli 0.3.0-alpha.11 → 0.3.0-alpha.12

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 (43) hide show
  1. package/README.md +11 -6
  2. package/dist/activity.d.ts +26 -0
  3. package/dist/activity.d.ts.map +1 -0
  4. package/dist/activity.js +401 -0
  5. package/dist/activity.js.map +1 -0
  6. package/dist/client-status.d.ts +24 -0
  7. package/dist/client-status.d.ts.map +1 -0
  8. package/dist/client-status.js +273 -0
  9. package/dist/client-status.js.map +1 -0
  10. package/dist/clients.d.ts +32 -0
  11. package/dist/clients.d.ts.map +1 -0
  12. package/dist/clients.js +584 -0
  13. package/dist/clients.js.map +1 -0
  14. package/dist/conformance.d.ts.map +1 -1
  15. package/dist/conformance.js +4 -2
  16. package/dist/conformance.js.map +1 -1
  17. package/dist/demo-workflow.d.ts +46 -0
  18. package/dist/demo-workflow.d.ts.map +1 -0
  19. package/dist/demo-workflow.js +58 -0
  20. package/dist/demo-workflow.js.map +1 -0
  21. package/dist/environment.d.ts +3 -1
  22. package/dist/environment.d.ts.map +1 -1
  23. package/dist/environment.js +13 -1
  24. package/dist/environment.js.map +1 -1
  25. package/dist/human.d.ts +67 -0
  26. package/dist/human.d.ts.map +1 -0
  27. package/dist/human.js +257 -0
  28. package/dist/human.js.map +1 -0
  29. package/dist/index.js +236 -49
  30. package/dist/index.js.map +1 -1
  31. package/dist/isolation.d.ts +35 -0
  32. package/dist/isolation.d.ts.map +1 -0
  33. package/dist/isolation.js +66 -0
  34. package/dist/isolation.js.map +1 -0
  35. package/dist/jsonc.d.ts +24 -0
  36. package/dist/jsonc.d.ts.map +1 -0
  37. package/dist/jsonc.js +238 -0
  38. package/dist/jsonc.js.map +1 -0
  39. package/dist/output.d.ts +28 -0
  40. package/dist/output.d.ts.map +1 -0
  41. package/dist/output.js +77 -0
  42. package/dist/output.js.map +1 -0
  43. package/package.json +10 -10
@@ -0,0 +1,584 @@
1
+ // Copyright 2026 XAGI Labs Private Limited
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ import { existsSync, readFileSync } from "node:fs";
4
+ import { copyFile, mkdir, readFile, writeFile } from "node:fs/promises";
5
+ import { homedir } from "node:os";
6
+ import { dirname, isAbsolute, join } from "node:path";
7
+ import { isDeepStrictEqual } from "node:util";
8
+ import { parseJsonc, upsertJsonc } from "./jsonc.js";
9
+ // The per-OS application-config directory: where Electron apps and Zed keep
10
+ // their settings.
11
+ function appConfig(...segments) {
12
+ if (process.platform === "win32") {
13
+ return join(process.env.APPDATA ?? join(homedir(), "AppData", "Roaming"), ...segments);
14
+ }
15
+ if (process.platform === "darwin") {
16
+ return join(homedir(), "Library", "Application Support", ...segments);
17
+ }
18
+ return join(process.env.XDG_CONFIG_HOME ?? join(homedir(), ".config"), ...segments);
19
+ }
20
+ const home = (...segments) => join(homedir(), ...segments);
21
+ export const CLIENTS = {
22
+ generic: { label: "your MCP client", shape: "mcpServers" },
23
+ "claude-code": {
24
+ label: "Claude Code",
25
+ shape: "mcpServers",
26
+ bin: "claude",
27
+ path: (workspace) => join(workspace, ".mcp.json"),
28
+ // A project .mcp.json server waits for the user's approval; until then
29
+ // `claude mcp list` shows it as "Pending approval" and no tool appears.
30
+ next: "Start claude in this workspace and approve the 'melra' server when it asks; 'claude mcp list' then shows it connected.",
31
+ },
32
+ "claude-desktop": {
33
+ label: "Claude Desktop",
34
+ app: "Claude.app",
35
+ shape: "mcpServers",
36
+ path: () => appConfig("Claude", "claude_desktop_config.json"),
37
+ },
38
+ cursor: {
39
+ label: "Cursor",
40
+ app: "Cursor.app",
41
+ shape: "mcpServers",
42
+ bin: "cursor",
43
+ path: () => home(".cursor", "mcp.json"),
44
+ },
45
+ windsurf: {
46
+ label: "Windsurf",
47
+ app: "Windsurf.app",
48
+ shape: "mcpServers",
49
+ bin: "windsurf",
50
+ path: () => home(".codeium", "windsurf", "mcp_config.json"),
51
+ },
52
+ gemini: {
53
+ label: "Gemini CLI",
54
+ shape: "mcpServers",
55
+ bin: "gemini",
56
+ path: () => home(".gemini", "settings.json"),
57
+ },
58
+ kiro: {
59
+ label: "Kiro",
60
+ app: "Kiro.app",
61
+ shape: "mcpServers",
62
+ bin: "kiro",
63
+ path: () => home(".kiro", "settings", "mcp.json"),
64
+ },
65
+ cline: {
66
+ label: "Cline",
67
+ shape: "mcpServers",
68
+ path: () => appConfig("Code", "User", "globalStorage", "saoudrizwan.claude-dev", "settings", "cline_mcp_settings.json"),
69
+ },
70
+ vscode: {
71
+ label: "VS Code",
72
+ app: "Visual Studio Code.app",
73
+ shape: "vscode",
74
+ bin: "code",
75
+ path: (workspace) => join(workspace, ".vscode", "mcp.json"),
76
+ },
77
+ zed: {
78
+ label: "Zed",
79
+ app: "Zed.app",
80
+ shape: "zed",
81
+ bin: "zed",
82
+ path: () => process.platform === "win32"
83
+ ? appConfig("Zed", "settings.json")
84
+ : join(process.env.XDG_CONFIG_HOME ?? home(".config"), "zed", "settings.json"),
85
+ },
86
+ opencode: {
87
+ label: "OpenCode",
88
+ shape: "opencode",
89
+ bin: "opencode",
90
+ path: () => home(".config", "opencode", "opencode.json"),
91
+ },
92
+ codex: {
93
+ label: "Codex",
94
+ shape: "codex",
95
+ bin: "codex",
96
+ path: () => join(process.env.CODEX_HOME ?? home(".codex"), "config.toml"),
97
+ },
98
+ // https://github.com/aaif-goose/goose/blob/main/crates/goose/src/config/paths.rs
99
+ goose: {
100
+ label: "Goose",
101
+ shape: "goose",
102
+ bin: "goose",
103
+ // GOOSE_PATH_ROOT moves the whole tree, config under `<root>/config`, but
104
+ // only when it is absolute; Goose ignores a relative one, and so does this.
105
+ // Otherwise Windows keeps the old "Block" app directory.
106
+ path: () => {
107
+ const root = process.env.GOOSE_PATH_ROOT;
108
+ if (root !== undefined && isAbsolute(root))
109
+ return join(root, "config", "config.yaml");
110
+ return process.platform === "win32"
111
+ ? appConfig("Block", "goose", "config", "config.yaml")
112
+ : join(process.env.XDG_CONFIG_HOME ?? home(".config"), "goose", "config.yaml");
113
+ },
114
+ },
115
+ continue: {
116
+ label: "Continue",
117
+ shape: "continue",
118
+ // Continue loads every block file in the workspace's .continue/mcpServers,
119
+ // so MELRA gets a file of its own rather than an edit to config.yaml.
120
+ path: (workspace) => join(workspace, ".continue", "mcpServers", "melra.yaml"),
121
+ },
122
+ amp: {
123
+ label: "Amp",
124
+ shape: "amp",
125
+ bin: "amp",
126
+ // Amp reads settings.json or settings.jsonc; edit the one already there
127
+ // rather than create a second file beside it.
128
+ path: () => {
129
+ const json = home(".config", "amp", "settings.json");
130
+ const jsonc = home(".config", "amp", "settings.jsonc");
131
+ return !existsSync(json) && existsSync(jsonc) ? jsonc : json;
132
+ },
133
+ },
134
+ // https://github.com/openclaw/openclaw/blob/main/docs/tools/mcp.md
135
+ // https://github.com/openclaw/openclaw/blob/main/src/config/zod-schema.mcp-server.ts
136
+ // https://github.com/openclaw/openclaw/blob/main/src/config/state-dir.ts
137
+ // https://github.com/openclaw/openclaw/blob/main/docs/help/environment.md
138
+ openclaw: {
139
+ label: "OpenClaw",
140
+ shape: "openclaw",
141
+ bin: "openclaw",
142
+ // JSON5 on disk. The JSONC editor covers the comments and trailing commas
143
+ // OpenClaw itself writes; JSON5-only syntax (unquoted keys, single quotes)
144
+ // fails the JSONC parse and is refused rather than rewritten. The gateway
145
+ // hot-reloads the file, whereas `openclaw mcp add` refuses while it runs.
146
+ path: () => process.env.OPENCLAW_CONFIG_PATH ??
147
+ join(process.env.OPENCLAW_STATE_DIR ?? join(process.env.OPENCLAW_HOME ?? homedir(), ".openclaw"), "openclaw.json"),
148
+ },
149
+ // https://github.com/NousResearch/hermes-agent/blob/main/website/docs/reference/mcp-config-reference.md
150
+ // https://github.com/NousResearch/hermes-agent/blob/main/hermes_constants.py (HERMES_HOME)
151
+ // https://github.com/NousResearch/hermes-agent/blob/main/tools/mcp_tool_config.py
152
+ hermes: {
153
+ label: "Hermes Agent",
154
+ shape: "hermes",
155
+ bin: "hermes",
156
+ // Hermes keeps its Windows home under %LOCALAPPDATA%, without the dot.
157
+ path: () => join(process.env.HERMES_HOME ??
158
+ (process.platform === "win32"
159
+ ? join(process.env.LOCALAPPDATA ?? home("AppData", "Local"), "hermes")
160
+ : home(".hermes")), "config.yaml"),
161
+ },
162
+ // https://docs.github.com/en/copilot/how-tos/copilot-cli/customize-copilot/add-mcp-servers
163
+ // https://docs.github.com/en/copilot/reference/copilot-cli-reference/cli-config-dir-reference
164
+ copilot: {
165
+ label: "GitHub Copilot CLI",
166
+ shape: "copilot",
167
+ bin: "copilot",
168
+ // COPILOT_HOME replaces ~/.copilot; XDG_CONFIG_HOME is not honoured.
169
+ path: () => join(process.env.COPILOT_HOME ?? home(".copilot"), "mcp-config.json"),
170
+ },
171
+ // https://qwenlm.github.io/qwen-code-docs/en/users/features/mcp/
172
+ qwen: {
173
+ label: "Qwen Code",
174
+ shape: "mcpServers",
175
+ bin: "qwen",
176
+ path: () => home(".qwen", "settings.json"),
177
+ },
178
+ // https://docs.augmentcode.com/cli/integrations
179
+ // https://docs.augmentcode.com/cli/config
180
+ auggie: {
181
+ label: "Auggie (Augment CLI)",
182
+ shape: "mcpServers",
183
+ bin: "auggie",
184
+ path: () => home(".augment", "settings.json"),
185
+ },
186
+ // https://docs.warp.dev/agents/capabilities/mcp.md
187
+ warp: {
188
+ label: "Warp",
189
+ app: "Warp.app",
190
+ // Warp requires `args`, which every rendered entry carries, even if empty.
191
+ shape: "mcpServers",
192
+ // A desktop app with no CLI of its own: ~/.warp is how it is detected.
193
+ path: () => home(".warp", ".mcp.json"),
194
+ },
195
+ // https://junie.jetbrains.com/docs/junie-cli-mcp-configuration.html
196
+ junie: {
197
+ label: "JetBrains Junie",
198
+ shape: "mcpServers",
199
+ bin: "junie",
200
+ path: () => home(".junie", "mcp", "mcp.json"),
201
+ },
202
+ // https://docs.factory.com/cli/configuration/mcp
203
+ droid: {
204
+ label: "Factory Droid",
205
+ shape: "droid",
206
+ bin: "droid",
207
+ path: () => home(".factory", "mcp.json"),
208
+ },
209
+ // https://www.kimi.com/code/docs/en/kimi-code-cli/customization/mcp.html
210
+ kimi: {
211
+ label: "Kimi Code CLI",
212
+ shape: "mcpServers",
213
+ bin: "kimi",
214
+ path: () => join(process.env.KIMI_CODE_HOME ?? home(".kimi-code"), "mcp.json"),
215
+ },
216
+ // https://kilo.ai/docs/automate/mcp/using-in-cli
217
+ // https://kilo.ai/docs/getting-started/settings
218
+ kilo: {
219
+ label: "Kilo Code",
220
+ shape: "kilo",
221
+ bin: "kilo",
222
+ // ~/.config on every OS, Windows included. Edit kilo.json when that is the
223
+ // one already there, rather than create kilo.jsonc beside it.
224
+ path: () => {
225
+ const jsonc = home(".config", "kilo", "kilo.jsonc");
226
+ const json = home(".config", "kilo", "kilo.json");
227
+ return !existsSync(jsonc) && existsSync(json) ? json : jsonc;
228
+ },
229
+ },
230
+ // https://lmstudio.ai/docs/app/mcp
231
+ // https://lmstudio.ai/lmstudio/js-code-sandbox/files/src/findLMStudioHome.ts
232
+ // https://github.com/lmstudio-ai/lmstudio-bug-tracker/issues/1371
233
+ lmstudio: {
234
+ label: "LM Studio",
235
+ app: "LM Studio.app",
236
+ shape: "mcpServers",
237
+ bin: "lms",
238
+ path: () => join(lmStudioHome(), "mcp.json"),
239
+ },
240
+ };
241
+ // LM Studio's home is not always ~/.lmstudio: a pointer file names it, and
242
+ // older installs live in ~/.cache/lm-studio. This is the order LM Studio's own
243
+ // sample code resolves it in, minus writing the pointer, which is LM Studio's
244
+ // job and not something reading a path should do.
245
+ function lmStudioHome() {
246
+ try {
247
+ const pointed = readFileSync(home(".lmstudio-home-pointer"), "utf8").trim();
248
+ if (pointed !== "")
249
+ return pointed;
250
+ }
251
+ catch {
252
+ // No pointer yet: fall through to where LM Studio would create one.
253
+ }
254
+ const legacy = home(".cache", "lm-studio");
255
+ return existsSync(legacy) ? legacy : home(".lmstudio");
256
+ }
257
+ // Older names that already appear in scripts and docs.
258
+ const ALIASES = { claude: "claude-code" };
259
+ export function resolveClient(name) {
260
+ const resolved = ALIASES[name] ?? name;
261
+ if (!Object.hasOwn(CLIENTS, resolved)) {
262
+ throw new Error(`unknown --client '${name}'; use one of: ${Object.keys(CLIENTS).join(", ")}`);
263
+ }
264
+ return resolved;
265
+ }
266
+ // TOML basic strings and YAML double-quoted scalars take the same escapes JSON
267
+ // emits, so JSON.stringify is a correct string encoder for both, and YAML needs
268
+ // no dependency.
269
+ const q = (value) => JSON.stringify(value);
270
+ // A flat string map as a YAML block mapping nested `indent` deep, or `{}`.
271
+ function yamlMap(key, map, indent) {
272
+ const pairs = Object.entries(map);
273
+ if (pairs.length === 0)
274
+ return [`${indent}${key}: {}`];
275
+ return [
276
+ `${indent}${key}:`,
277
+ ...pairs.map(([name, value]) => `${indent} ${q(name)}: ${q(value)}`),
278
+ ];
279
+ }
280
+ // Hermes reads `mcp_servers.<name>` with the usual command/args/env.
281
+ function hermesYaml(entry) {
282
+ return [
283
+ "mcp_servers:",
284
+ " melra:",
285
+ ` command: ${q(entry.command)}`,
286
+ ` args: [${entry.args.map(q).join(", ")}]`,
287
+ ...yamlMap("env", entry.env, " "),
288
+ "",
289
+ ].join("\n");
290
+ }
291
+ function gooseYaml(entry) {
292
+ return [
293
+ "extensions:",
294
+ " melra:",
295
+ " name: melra",
296
+ " type: stdio",
297
+ " enabled: true",
298
+ ` cmd: ${q(entry.command)}`,
299
+ ` args: [${entry.args.map(q).join(", ")}]`,
300
+ ...yamlMap("envs", entry.env, " "),
301
+ " timeout: 300",
302
+ "",
303
+ ].join("\n");
304
+ }
305
+ // A Continue block file carries its own name, version, and schema.
306
+ function continueYaml(entry) {
307
+ return [
308
+ "name: MELRA",
309
+ "version: 0.0.1",
310
+ "schema: v1",
311
+ "mcpServers:",
312
+ " - name: melra",
313
+ ` command: ${q(entry.command)}`,
314
+ ` args: [${entry.args.map(q).join(", ")}]`,
315
+ ...yamlMap("env", entry.env, " "),
316
+ "",
317
+ ].join("\n");
318
+ }
319
+ function codexToml(entry) {
320
+ return [
321
+ "[mcp_servers.melra]",
322
+ `command = ${q(entry.command)}`,
323
+ `args = [${entry.args.map(q).join(", ")}]`,
324
+ "",
325
+ "[mcp_servers.melra.env]",
326
+ ...Object.entries(entry.env).map(([key, value]) => `${key} = ${q(value)}`),
327
+ "",
328
+ ].join("\n");
329
+ }
330
+ export function clientConfig(name, entry) {
331
+ switch (CLIENTS[name]?.shape) {
332
+ case "vscode":
333
+ return { servers: { melra: { type: "stdio", ...entry } } };
334
+ case "zed":
335
+ return { context_servers: { melra: entry } };
336
+ case "opencode":
337
+ return {
338
+ $schema: "https://opencode.ai/config.json",
339
+ mcp: {
340
+ melra: {
341
+ type: "local",
342
+ command: [entry.command, ...entry.args],
343
+ environment: entry.env,
344
+ enabled: true,
345
+ },
346
+ },
347
+ };
348
+ case "codex":
349
+ return codexToml(entry);
350
+ case "goose":
351
+ return gooseYaml(entry);
352
+ case "hermes":
353
+ return hermesYaml(entry);
354
+ case "openclaw":
355
+ return { mcp: { servers: { melra: entry } } };
356
+ // Copilot CLI passes a server only PATH from its own environment, so
357
+ // MELRA's settings must all be in `env`, as they are. `tools: ["*"]`
358
+ // exposes every MELRA tool; every documented example carries it.
359
+ case "copilot":
360
+ return { mcpServers: { melra: { type: "local", ...entry, tools: ["*"] } } };
361
+ case "droid":
362
+ return { mcpServers: { melra: { type: "stdio", ...entry } } };
363
+ // OpenCode's format without OpenCode's $schema, which would be wrong here.
364
+ case "kilo":
365
+ return {
366
+ mcp: {
367
+ melra: {
368
+ type: "local",
369
+ command: [entry.command, ...entry.args],
370
+ environment: entry.env,
371
+ enabled: true,
372
+ },
373
+ },
374
+ };
375
+ case "continue":
376
+ return continueYaml(entry);
377
+ case "amp":
378
+ return { "amp.mcpServers": { melra: entry } };
379
+ default:
380
+ return { mcpServers: { melra: entry } };
381
+ }
382
+ }
383
+ export function clientConfigPath(name, workspace) {
384
+ return CLIENTS[name]?.path?.(workspace);
385
+ }
386
+ export const isObject = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
387
+ // Drop every `[mcp_servers.melra]` table (and its subtables) so a rerun after
388
+ // an upgrade replaces the old entry instead of duplicating a TOML table, which
389
+ // Codex would reject.
390
+ function withoutMelraTables(toml) {
391
+ let skipping = false;
392
+ return toml
393
+ .split(/\r?\n/)
394
+ .filter((line) => {
395
+ const header = /^\s*\[\[?\s*([^\]]+?)\s*\]\]?\s*(#.*)?$/.exec(line);
396
+ if (header !== null) {
397
+ const table = header[1] ?? "";
398
+ skipping = table === "mcp_servers.melra" || table.startsWith("mcp_servers.melra.");
399
+ }
400
+ return !skipping;
401
+ })
402
+ .join("\n")
403
+ .trimEnd();
404
+ }
405
+ // Put MELRA's entry under a top-level YAML map — Goose's `extensions:`,
406
+ // Hermes's `mcp_servers:` — replacing any earlier one, with a line edit that
407
+ // leaves every other byte of the file alone. `config` is the rendered block,
408
+ // whose first line names the map. Both clients write block-style YAML with one
409
+ // key per line, which a line edit handles; anything else — flow style, tabs,
410
+ // odd indentation, a top level that is not a plain mapping — is refused rather
411
+ // than guessed at.
412
+ function withMelraYamlEntry(path, yaml, config) {
413
+ const refuse = (why) => new Error(`${path}: ${why}; add the printed config to it by hand`);
414
+ const cr = yaml.includes("\r\n") ? "\r" : "";
415
+ const lines = yaml.split("\n").map((raw) => {
416
+ const text = raw.replace(/\r$/, "");
417
+ return { raw, text, content: !/^\s*(#.*)?$/.test(text), indent: text.search(/\S/) };
418
+ });
419
+ const isKey = (text) => /^ *(?:[\w.$-]+|"[^"\\]*"|'[^']*') *:(?: |$)/.test(text);
420
+ const named = (key, text) => new RegExp(`^ *(?:${key}|"${key}"|'${key}') *:`).test(text);
421
+ for (const line of lines) {
422
+ if (!line.content)
423
+ continue;
424
+ if (/^ *\t/.test(line.text))
425
+ throw refuse("it indents with tabs");
426
+ if (line.indent === 0 && !isKey(line.text))
427
+ throw refuse("it is not a plain YAML mapping");
428
+ }
429
+ // MELRA's entry as rendered, without the header naming its map.
430
+ const [header = "", ...rendered] = config.split("\n").slice(0, -1);
431
+ const map = header.slice(0, -1);
432
+ const entry = rendered;
433
+ const out = (block, indent) => block.map((line) => `${" ".repeat(indent)}${line.slice(2)}${cr}`);
434
+ const headers = lines.flatMap((line, index) => line.indent === 0 && named(map, line.text) ? [index] : []);
435
+ const start = headers[0];
436
+ if (start === undefined) {
437
+ const separator = yaml === "" || yaml.endsWith("\n") ? "" : `${cr}\n`;
438
+ return `${yaml}${separator}${header}${cr}\n${out(entry, 2).join("\n")}\n`;
439
+ }
440
+ if (headers.length > 1)
441
+ throw refuse(`it has more than one \`${header}\` key`);
442
+ if (!/^[^:]*: *(#.*)?$/.test(lines[start]?.text ?? "")) {
443
+ throw refuse(`\`${header}\` is not a block mapping`);
444
+ }
445
+ const after = lines.findIndex((line, index) => index > start && line.content && line.indent === 0);
446
+ const end = after === -1 ? lines.length : after;
447
+ const children = lines.slice(start + 1, end).flatMap((line, offset) => line.content ? [{ ...line, index: start + 1 + offset }] : []);
448
+ const indent = children[0]?.indent ?? 2;
449
+ for (const child of children) {
450
+ if (child.indent < indent || (child.indent === indent && !isKey(child.text))) {
451
+ throw refuse(`\`${header}\` is not a block mapping with even indentation`);
452
+ }
453
+ }
454
+ // Drop every earlier `melra:` entry: its key through its last deeper line,
455
+ // so blank or comment lines after it stay with whatever follows.
456
+ const drop = new Set();
457
+ let first;
458
+ for (const [position, child] of children.entries()) {
459
+ if (child.indent !== indent || !named("melra", child.text))
460
+ continue;
461
+ first ??= child.index;
462
+ let last = child.index;
463
+ for (const deeper of children.slice(position + 1)) {
464
+ if (deeper.indent === indent)
465
+ break;
466
+ last = deeper.index;
467
+ }
468
+ for (let index = child.index; index <= last; index++)
469
+ drop.add(index);
470
+ }
471
+ const at = first ?? (children.at(-1)?.index ?? start) + 1;
472
+ const result = lines.flatMap((line, index) => {
473
+ const placed = index === at ? out(entry, indent) : [];
474
+ return drop.has(index) ? placed : [...placed, line.raw];
475
+ });
476
+ if (at === lines.length)
477
+ result.push(...out(entry, indent));
478
+ return result.join("\n");
479
+ }
480
+ // Every place a rendered config sets something: the `melra` entry itself,
481
+ // however deep its container sits (OpenClaw's is `mcp.servers`), and any
482
+ // non-object setting beside it (OpenCode's `$schema`).
483
+ function settings(config, at = []) {
484
+ return Object.entries(config).flatMap(([key, value]) => key !== "melra" && isObject(value) ? settings(value, [...at, key]) : [[[...at, key], value]]);
485
+ }
486
+ // `settings` applied to a parsed object, as `upsertJsonc` applies them to text.
487
+ function merged(before, path, value) {
488
+ const [key, ...rest] = path;
489
+ if (key === undefined)
490
+ return before;
491
+ if (rest.length === 0) {
492
+ return key === "melra" || !Object.hasOwn(before, key) ? { ...before, [key]: value } : before;
493
+ }
494
+ const inner = before[key];
495
+ return { ...before, [key]: merged(isObject(inner) ? inner : {}, rest, value) };
496
+ }
497
+ // Merge a JSON-shaped config into a JSON or JSONC file by editing only the
498
+ // members MELRA owns: the `melra` entry is upserted wherever its container
499
+ // is, and a non-object setting (OpenCode's `$schema`) is added only if
500
+ // absent. Plain JSON goes through the same in-place edit as JSONC rather than
501
+ // JSON.parse → JSON.stringify, so a user's formatting and key order survive
502
+ // there too, and duplicate keys (which JSON.parse silently collapses) are
503
+ // refused everywhere. The result is parsed back and compared, whole, with the
504
+ // merge it was meant to be, so a file is never written that does not say
505
+ // exactly what was intended.
506
+ function withMelraJson(path, text, config) {
507
+ const refuse = (why) => new Error(`${path}: ${why}; add the printed config to it by hand`);
508
+ let before;
509
+ try {
510
+ before = parseJsonc(text).value;
511
+ }
512
+ catch (error) {
513
+ throw refuse(`it is not valid JSON or JSONC (${error.message})`);
514
+ }
515
+ if (!isObject(before))
516
+ throw refuse("it does not hold a JSON object");
517
+ let expected = before;
518
+ let next = text;
519
+ try {
520
+ for (const [path, value] of settings(config)) {
521
+ next = upsertJsonc(next, path, value, path.at(-1) !== "melra");
522
+ expected = merged(expected, path, value);
523
+ }
524
+ }
525
+ catch (error) {
526
+ throw refuse(error.message);
527
+ }
528
+ let after;
529
+ try {
530
+ after = parseJsonc(next).value;
531
+ }
532
+ catch {
533
+ after = undefined;
534
+ }
535
+ if (!isDeepStrictEqual(after, expected)) {
536
+ throw refuse("editing it in place did not produce the intended settings");
537
+ }
538
+ return next;
539
+ }
540
+ /**
541
+ * Merge MELRA into the client's own config file, keeping everything else in
542
+ * it. The previous file is copied to `<file>.bak` first. JSON and JSONC files
543
+ * are edited in place by `withMelraJson`, so comments, trailing commas, and
544
+ * formatting outside MELRA's own entry survive; a file that is not valid JSONC
545
+ * is refused. Continue's file is MELRA's alone, so it is replaced whole.
546
+ */
547
+ export async function writeClientConfig(path, config, name) {
548
+ let existing;
549
+ try {
550
+ existing = await readFile(path, "utf8");
551
+ }
552
+ catch (error) {
553
+ if (error.code !== "ENOENT")
554
+ throw error;
555
+ }
556
+ const shape = CLIENTS[name]?.shape;
557
+ let next;
558
+ if (typeof config === "string" && (existing === undefined || shape === "continue")) {
559
+ next = config;
560
+ }
561
+ else if (typeof config === "string" && (shape === "goose" || shape === "hermes")) {
562
+ next = withMelraYamlEntry(path, existing ?? "", config);
563
+ }
564
+ else if (typeof config === "string") {
565
+ const kept = existing === undefined ? "" : withoutMelraTables(existing);
566
+ next = kept === "" ? config : `${kept}\n\n${config}`;
567
+ }
568
+ else if (existing === undefined || existing.trim() === "") {
569
+ next = `${JSON.stringify(config, null, 2)}\n`;
570
+ }
571
+ else {
572
+ next = withMelraJson(path, existing, config);
573
+ }
574
+ // Already exactly this: rewriting would only replace a good .bak with a copy.
575
+ if (next === existing)
576
+ return { unchanged: true };
577
+ await mkdir(dirname(path), { recursive: true });
578
+ const backup = existing === undefined ? undefined : `${path}.bak`;
579
+ if (backup !== undefined)
580
+ await copyFile(path, backup);
581
+ await writeFile(path, next);
582
+ return backup === undefined ? {} : { backup };
583
+ }
584
+ //# sourceMappingURL=clients.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clients.js","sourceRoot":"","sources":["../src/clients.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"conformance.d.ts","sourceRoot":"","sources":["../src/conformance.ts"],"names":[],"mappings":"AAiCA,eAAO,MAAM,iBAAiB,wBAAwB,CAAC;AA8EvD,MAAM,WAAW,kBAAkB;IACjC,mEAAmE;IACnE,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,8EAA8E;IAC9E,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,gFAAgF;IAChF,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAkCD,wBAAsB,cAAc,CAClC,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,CAAC,CAuW/D"}
1
+ {"version":3,"file":"conformance.d.ts","sourceRoot":"","sources":["../src/conformance.ts"],"names":[],"mappings":"AAkCA,eAAO,MAAM,iBAAiB,wBAAwB,CAAC;AA8EvD,MAAM,WAAW,kBAAkB;IACjC,mEAAmE;IACnE,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,8EAA8E;IAC9E,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,gFAAgF;IAChF,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAkCD,wBAAsB,cAAc,CAClC,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,CAAC,CAuW/D"}
@@ -23,6 +23,7 @@
23
23
  * reach the same disk.
24
24
  */
25
25
  import { randomBytes } from "node:crypto";
26
+ import { isSea } from "node:sea";
26
27
  import { Client } from "@modelcontextprotocol/sdk/client/index.js";
27
28
  import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js";
28
29
  import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js";
@@ -397,11 +398,12 @@ async function connect(client, options) {
397
398
  }
398
399
  const command = options.command ?? process.execPath;
399
400
  const args = options.args ??
400
- (options.command === undefined
401
+ (options.command === undefined && !isSea()
401
402
  ? // Reproduce how this process was started, loaders included, so the same
402
403
  // command works from `dist/bin.js` and from `tsx src/index.ts`.
403
404
  [...process.execArgv, process.argv[1] ?? "", "serve"]
404
- : ["serve"]);
405
+ : // A single executable is its own entry point: it takes `serve` directly.
406
+ ["serve"]);
405
407
  await client.connect(new StdioClientTransport({
406
408
  command,
407
409
  args,