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

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