@nowline/cli 0.8.6 → 0.9.0

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 (89) hide show
  1. package/README.md +32 -9
  2. package/dist/cli/args.d.ts +20 -4
  3. package/dist/cli/args.d.ts.map +1 -1
  4. package/dist/cli/args.js +20 -0
  5. package/dist/cli/args.js.map +1 -1
  6. package/dist/cli/help.d.ts.map +1 -1
  7. package/dist/cli/help.js +30 -2
  8. package/dist/cli/help.js.map +1 -1
  9. package/dist/cli/options.d.ts +74 -0
  10. package/dist/cli/options.d.ts.map +1 -0
  11. package/dist/cli/options.js +209 -0
  12. package/dist/cli/options.js.map +1 -0
  13. package/dist/commands/init.d.ts.map +1 -1
  14. package/dist/commands/init.js +2 -3
  15. package/dist/commands/init.js.map +1 -1
  16. package/dist/commands/mcp-install.d.ts +18 -0
  17. package/dist/commands/mcp-install.d.ts.map +1 -0
  18. package/dist/commands/mcp-install.js +151 -0
  19. package/dist/commands/mcp-install.js.map +1 -0
  20. package/dist/commands/mcp.d.ts.map +1 -1
  21. package/dist/commands/mcp.js +5 -11
  22. package/dist/commands/mcp.js.map +1 -1
  23. package/dist/commands/render.d.ts +7 -0
  24. package/dist/commands/render.d.ts.map +1 -1
  25. package/dist/commands/render.js +161 -155
  26. package/dist/commands/render.js.map +1 -1
  27. package/dist/commands/serve.d.ts.map +1 -1
  28. package/dist/commands/serve.js +87 -60
  29. package/dist/commands/serve.js.map +1 -1
  30. package/dist/diagnostics/adapt.d.ts +12 -1
  31. package/dist/diagnostics/adapt.d.ts.map +1 -1
  32. package/dist/diagnostics/adapt.js +53 -1
  33. package/dist/diagnostics/adapt.js.map +1 -1
  34. package/dist/diagnostics/model.d.ts +1 -1
  35. package/dist/generated/version.d.ts +1 -1
  36. package/dist/generated/version.js +2 -2
  37. package/dist/i18n/locale.d.ts.map +1 -1
  38. package/dist/i18n/locale.js +2 -5
  39. package/dist/i18n/locale.js.map +1 -1
  40. package/dist/index.js +4 -0
  41. package/dist/index.js.map +1 -1
  42. package/dist/io/config.d.ts +1 -1
  43. package/dist/io/config.d.ts.map +1 -1
  44. package/dist/io/config.js +1 -1
  45. package/dist/io/config.js.map +1 -1
  46. package/dist/io/log.d.ts +17 -0
  47. package/dist/io/log.d.ts.map +1 -0
  48. package/dist/io/log.js +16 -0
  49. package/dist/io/log.js.map +1 -0
  50. package/dist/mcp-install/clients.d.ts +58 -0
  51. package/dist/mcp-install/clients.d.ts.map +1 -0
  52. package/dist/mcp-install/clients.js +304 -0
  53. package/dist/mcp-install/clients.js.map +1 -0
  54. package/dist/mcp-install/host.d.ts +29 -0
  55. package/dist/mcp-install/host.d.ts.map +1 -0
  56. package/dist/mcp-install/host.js +72 -0
  57. package/dist/mcp-install/host.js.map +1 -0
  58. package/dist/mcp-install/json-config.d.ts +29 -0
  59. package/dist/mcp-install/json-config.d.ts.map +1 -0
  60. package/dist/mcp-install/json-config.js +139 -0
  61. package/dist/mcp-install/json-config.js.map +1 -0
  62. package/dist/mcp-install/server-command.d.ts +26 -0
  63. package/dist/mcp-install/server-command.d.ts.map +1 -0
  64. package/dist/mcp-install/server-command.js +52 -0
  65. package/dist/mcp-install/server-command.js.map +1 -0
  66. package/man/fr/nowline.1 +246 -19
  67. package/man/fr/nowline.5 +819 -45
  68. package/man/nowline.1 +191 -18
  69. package/man/nowline.5 +764 -36
  70. package/package.json +19 -19
  71. package/src/cli/args.ts +55 -5
  72. package/src/cli/help.ts +30 -2
  73. package/src/cli/options.ts +286 -0
  74. package/src/commands/init.ts +2 -3
  75. package/src/commands/mcp-install.ts +211 -0
  76. package/src/commands/mcp.ts +8 -13
  77. package/src/commands/render.ts +198 -195
  78. package/src/commands/serve.ts +102 -74
  79. package/src/diagnostics/adapt.ts +62 -0
  80. package/src/diagnostics/model.ts +1 -1
  81. package/src/generated/version.ts +2 -2
  82. package/src/i18n/locale.ts +2 -6
  83. package/src/index.ts +3 -0
  84. package/src/io/config.ts +0 -1
  85. package/src/io/log.ts +33 -0
  86. package/src/mcp-install/clients.ts +443 -0
  87. package/src/mcp-install/host.ts +106 -0
  88. package/src/mcp-install/json-config.ts +179 -0
  89. package/src/mcp-install/server-command.ts +75 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clients.d.ts","sourceRoot":"","sources":["../../src/mcp-install/clients.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEvD,MAAM,MAAM,KAAK,GAAG,MAAM,GAAG,SAAS,CAAC;AAEvC,gGAAgG;AAChG,eAAO,MAAM,WAAW,YAAY,CAAC;AAErC,mDAAmD;AACnD,MAAM,WAAW,UAAU;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,2FAA2F;IAC3F,KAAK,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,EAAE,OAAO,GAAG;QAAE,OAAO,EAAE,MAAM,EAAE,CAAC;QAAC,KAAK,EAAE,OAAO,CAAA;KAAE,CAAC;IAC/E,uDAAuD;IACvD,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,wCAAwC;IACxC,IAAI,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AACH,MAAM,WAAW,SAAS;IACtB,IAAI,EAAE,KAAK,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,EAAE,CAAC;IACd,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,WAAW,CAAC;CACzB;AAED,qFAAqF;AACrF,MAAM,WAAW,WAAW;IACxB,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IACnD,SAAS,EAAE;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CACzD;AAED,MAAM,MAAM,MAAM,GAAG,UAAU,GAAG,SAAS,GAAG,WAAW,CAAC;AAE1D,MAAM,WAAW,gBAAgB;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,SAAS,KAAK,EAAE,CAAC;IACzB,2FAA2F;IAC3F,MAAM,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC;IAC/B,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,GAAG,MAAM,CAAC;CACnE;AA+CD,kFAAkF;AAClF,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAE3D;AAoCD,eAAO,MAAM,OAAO,EAAE,SAAS,gBAAgB,EA2R9C,CAAC;AAgBF,eAAO,MAAM,UAAU,EAAE,SAAS,MAAM,EAA6B,CAAC;AAEtE,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS,CAEnE"}
@@ -0,0 +1,304 @@
1
+ import * as path from 'node:path';
2
+ /** The name every harness registers the server under, so tools surface as `mcp__nowline__*`. */
3
+ export const SERVER_NAME = 'nowline';
4
+ function xdgConfig(host) {
5
+ return host.env.XDG_CONFIG_HOME || path.join(host.home, '.config');
6
+ }
7
+ function appData(host) {
8
+ return host.env.APPDATA || path.join(host.home, 'AppData', 'Roaming');
9
+ }
10
+ /** Per-OS application config directory (Electron apps: Claude Desktop, VS Code). */
11
+ function appConfigDir(host, name) {
12
+ if (host.platform === 'darwin') {
13
+ return path.join(host.home, 'Library', 'Application Support', name);
14
+ }
15
+ if (host.platform === 'win32')
16
+ return path.join(appData(host), name);
17
+ return path.join(xdgConfig(host), name);
18
+ }
19
+ function onPathOrExists(binaries, dirs) {
20
+ return (host) => binaries.some((binary) => host.findAllOnPath(binary).length > 0) ||
21
+ dirs(host).some((dir) => host.exists(dir));
22
+ }
23
+ function plain(entry) {
24
+ return { command: entry.command, args: entry.args };
25
+ }
26
+ function stdioTyped(entry) {
27
+ return { type: 'stdio', command: entry.command, args: entry.args };
28
+ }
29
+ function underKey(filePath, key, shape, extra = {}) {
30
+ return {
31
+ kind: 'json',
32
+ path: filePath,
33
+ place: (entry) => ({ keyPath: [key, SERVER_NAME], value: shape(entry) }),
34
+ ...extra,
35
+ };
36
+ }
37
+ /** POSIX-shell quoting for printed commands; bare when nothing needs escaping. */
38
+ export function shellQuote(arg) {
39
+ return /^[\w@%+=:,./-]+$/.test(arg) ? arg : `'${arg.replace(/'/g, `'\\''`)}'`;
40
+ }
41
+ export function commandLine(argv) {
42
+ return argv.map(shellQuote).join(' ');
43
+ }
44
+ function cliTarget(binary, add, remove, fallback) {
45
+ return {
46
+ kind: 'cli',
47
+ binary,
48
+ add,
49
+ remove,
50
+ fallback: fallback ?? {
51
+ kind: 'print',
52
+ install: {
53
+ instructions: `${binary} is not on PATH; once it is, run:`,
54
+ snippet: commandLine([binary, ...add]),
55
+ },
56
+ uninstall: {
57
+ instructions: `${binary} is not on PATH; once it is, run:`,
58
+ snippet: commandLine([binary, ...remove]),
59
+ },
60
+ },
61
+ };
62
+ }
63
+ /** Prefer an existing `.jsonc` sibling, since OpenCode reads either. */
64
+ function jsonOrJsonc(host, base) {
65
+ return host.exists(`${base}.jsonc`) ? `${base}.jsonc` : `${base}.json`;
66
+ }
67
+ function isRecord(value) {
68
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
69
+ }
70
+ export const CLIENTS = [
71
+ {
72
+ id: 'claude-code',
73
+ name: 'Claude Code',
74
+ scopes: ['user', 'project'],
75
+ detect: onPathOrExists(['claude'], (h) => [path.join(h.home, '.claude')]),
76
+ target: (scope, entry, host) => {
77
+ if (scope === 'project') {
78
+ return underKey(path.join(host.cwd, '.mcp.json'), 'mcpServers', stdioTyped);
79
+ }
80
+ return cliTarget('claude', ['mcp', 'add', '--scope', 'user', SERVER_NAME, '--', entry.command, ...entry.args], ['mcp', 'remove', '--scope', 'user', SERVER_NAME]);
81
+ },
82
+ },
83
+ {
84
+ id: 'claude-desktop',
85
+ name: 'Claude Desktop',
86
+ scopes: ['user'],
87
+ detect: onPathOrExists([], (h) => [appConfigDir(h, 'Claude')]),
88
+ target: (_scope, _entry, host) => underKey(path.join(appConfigDir(host, 'Claude'), 'claude_desktop_config.json'), 'mcpServers', plain, { hint: 'restart Claude Desktop to load it' }),
89
+ },
90
+ {
91
+ id: 'cursor',
92
+ name: 'Cursor',
93
+ scopes: ['user', 'project'],
94
+ detect: onPathOrExists(['cursor'], (h) => [path.join(h.home, '.cursor')]),
95
+ target: (scope, _entry, host) => underKey(path.join(scope === 'user' ? host.home : host.cwd, '.cursor', 'mcp.json'), 'mcpServers', plain),
96
+ },
97
+ {
98
+ id: 'vscode',
99
+ name: 'VS Code',
100
+ scopes: ['user', 'project'],
101
+ detect: onPathOrExists(['code'], (h) => [path.join(appConfigDir(h, 'Code'), 'User')]),
102
+ target: (scope, _entry, host) => underKey(scope === 'user'
103
+ ? path.join(appConfigDir(host, 'Code'), 'User', 'mcp.json')
104
+ : path.join(host.cwd, '.vscode', 'mcp.json'), 'servers', stdioTyped),
105
+ },
106
+ {
107
+ id: 'codex',
108
+ name: 'Codex CLI',
109
+ scopes: ['user'],
110
+ detect: onPathOrExists(['codex'], (h) => [h.env.CODEX_HOME || path.join(h.home, '.codex')]),
111
+ target: (_scope, entry, host) => {
112
+ const configPath = path.join(host.env.CODEX_HOME || path.join(host.home, '.codex'), 'config.toml');
113
+ // JSON string and array literals are valid TOML basic strings and arrays.
114
+ const toml = [
115
+ `[mcp_servers.${SERVER_NAME}]`,
116
+ `command = ${JSON.stringify(entry.command)}`,
117
+ `args = ${JSON.stringify(entry.args)}`,
118
+ ].join('\n');
119
+ return cliTarget('codex', ['mcp', 'add', SERVER_NAME, '--', entry.command, ...entry.args], ['mcp', 'remove', SERVER_NAME], {
120
+ kind: 'print',
121
+ install: {
122
+ instructions: `codex is not on PATH; add this to ${configPath}:`,
123
+ snippet: toml,
124
+ },
125
+ uninstall: {
126
+ instructions: `codex is not on PATH; delete the [mcp_servers.${SERVER_NAME}] table from ${configPath}.`,
127
+ },
128
+ });
129
+ },
130
+ },
131
+ {
132
+ id: 'gemini',
133
+ name: 'Gemini CLI',
134
+ scopes: ['user', 'project'],
135
+ // Antigravity also lives under ~/.gemini, so look for Gemini's own file.
136
+ detect: onPathOrExists(['gemini'], (h) => [path.join(h.home, '.gemini', 'settings.json')]),
137
+ target: (scope, _entry, host) => underKey(path.join(scope === 'user' ? host.home : host.cwd, '.gemini', 'settings.json'), 'mcpServers', plain),
138
+ },
139
+ {
140
+ id: 'antigravity',
141
+ name: 'Antigravity',
142
+ scopes: ['user', 'project'],
143
+ detect: onPathOrExists(['agy', 'antigravity'], (h) => [
144
+ path.join(h.home, '.gemini', 'config'),
145
+ path.join(h.home, '.gemini', 'antigravity-cli'),
146
+ ]),
147
+ // The Antigravity app, IDE and CLI share one file.
148
+ target: (scope, _entry, host) => underKey(scope === 'user'
149
+ ? path.join(host.home, '.gemini', 'config', 'mcp_config.json')
150
+ : path.join(host.cwd, '.agents', 'mcp_config.json'), 'mcpServers', plain),
151
+ },
152
+ {
153
+ id: 'muse',
154
+ name: 'Muse Code',
155
+ scopes: ['user'],
156
+ detect: onPathOrExists(['muse'], (h) => [path.join(h.home, '.config', 'muse')]),
157
+ target: (_scope, _entry, host) => underKey(path.join(host.home, '.config', 'muse', 'settings.json'), 'mcp_servers',
158
+ // `optional`: a missing nowline warns instead of aborting every Muse run.
159
+ (entry) => ({
160
+ transport: 'stdio',
161
+ command: entry.command,
162
+ args: entry.args,
163
+ mode: 'optional',
164
+ }),
165
+ // Muse refuses to start on a settings file without it.
166
+ { seed: { schema_version: 1 } }),
167
+ },
168
+ {
169
+ id: 'opencode',
170
+ name: 'OpenCode',
171
+ scopes: ['user', 'project'],
172
+ detect: onPathOrExists(['opencode'], (h) => [path.join(xdgConfig(h), 'opencode')]),
173
+ target: (scope, _entry, host) => ({
174
+ kind: 'json',
175
+ path: jsonOrJsonc(host, scope === 'user'
176
+ ? path.join(xdgConfig(host), 'opencode', 'opencode')
177
+ : path.join(host.cwd, 'opencode')),
178
+ seed: { $schema: 'https://opencode.ai/config.json' },
179
+ place: (entry, doc) => {
180
+ const command = [entry.command, ...entry.args];
181
+ const mcp = isRecord(doc) ? doc.mcp : undefined;
182
+ // The v2 layout nests servers under `mcp.servers` and drops `enabled`.
183
+ if (isRecord(mcp) && isRecord(mcp.servers)) {
184
+ return {
185
+ keyPath: ['mcp', 'servers', SERVER_NAME],
186
+ value: { type: 'local', command },
187
+ };
188
+ }
189
+ return {
190
+ keyPath: ['mcp', SERVER_NAME],
191
+ value: { type: 'local', command, enabled: true },
192
+ };
193
+ },
194
+ }),
195
+ },
196
+ {
197
+ id: 'copilot',
198
+ name: 'GitHub Copilot CLI',
199
+ scopes: ['user', 'project'],
200
+ detect: onPathOrExists(['copilot'], (h) => [path.join(h.home, '.copilot')]),
201
+ target: (scope, _entry, host) => scope === 'user'
202
+ ? underKey(path.join(host.home, '.copilot', 'mcp-config.json'), 'mcpServers', (entry) => ({
203
+ type: 'local',
204
+ command: entry.command,
205
+ args: entry.args,
206
+ tools: ['*'],
207
+ }))
208
+ : // Same file and shape as Claude Code's project scope; Copilot reads it too.
209
+ underKey(path.join(host.cwd, '.mcp.json'), 'mcpServers', stdioTyped),
210
+ },
211
+ {
212
+ id: 'windsurf',
213
+ name: 'Windsurf',
214
+ scopes: ['user'],
215
+ detect: onPathOrExists(['windsurf'], (h) => [path.join(h.home, '.codeium', 'windsurf')]),
216
+ target: (_scope, _entry, host) => underKey(path.join(host.home, '.codeium', 'windsurf', 'mcp_config.json'), 'mcpServers', plain),
217
+ },
218
+ {
219
+ id: 'zed',
220
+ name: 'Zed',
221
+ scopes: ['user', 'project'],
222
+ detect: onPathOrExists(['zed'], (h) => [zedConfigDir(h)]),
223
+ target: (scope, _entry, host) => underKey(scope === 'user'
224
+ ? path.join(zedConfigDir(host), 'settings.json')
225
+ : path.join(host.cwd, '.zed', 'settings.json'), 'context_servers', (entry) => ({ command: entry.command, args: entry.args, env: {} })),
226
+ },
227
+ {
228
+ id: 'amp',
229
+ name: 'Amp',
230
+ scopes: ['user', 'project'],
231
+ detect: onPathOrExists(['amp'], (h) => [path.join(h.home, '.config', 'amp')]),
232
+ target: (scope, entry, host) => {
233
+ if (scope === 'user' && host.platform === 'win32') {
234
+ // Amp documents no Windows settings path; its own CLI knows it.
235
+ return {
236
+ kind: 'print',
237
+ install: {
238
+ instructions: 'run:',
239
+ snippet: commandLine([
240
+ 'amp',
241
+ 'mcp',
242
+ 'add',
243
+ SERVER_NAME,
244
+ '--',
245
+ entry.command,
246
+ ...entry.args,
247
+ ]),
248
+ },
249
+ uninstall: {
250
+ instructions: `remove "${SERVER_NAME}" from "amp.mcpServers" in Amp's settings.json.`,
251
+ },
252
+ };
253
+ }
254
+ return underKey(scope === 'user'
255
+ ? path.join(host.home, '.config', 'amp', 'settings.json')
256
+ : path.join(host.cwd, '.amp', 'settings.json'), 'amp.mcpServers', plain, scope === 'project'
257
+ ? { hint: `approve it once with \`amp mcp approve ${SERVER_NAME}\`` }
258
+ : {});
259
+ },
260
+ },
261
+ {
262
+ id: 'goose',
263
+ name: 'Goose',
264
+ scopes: ['user'],
265
+ detect: onPathOrExists(['goose'], (h) => [gooseConfigPath(h, true)]),
266
+ target: (_scope, entry, host) => {
267
+ const configPath = gooseConfigPath(host, false);
268
+ // Goose's config is YAML we'd lose comments in; JSON scalars are valid YAML.
269
+ const yaml = [
270
+ 'extensions:',
271
+ ` ${SERVER_NAME}:`,
272
+ ' enabled: true',
273
+ ` name: ${SERVER_NAME}`,
274
+ ' type: stdio',
275
+ ` cmd: ${JSON.stringify(entry.command)}`,
276
+ ` args: ${JSON.stringify(entry.args)}`,
277
+ ' timeout: 300',
278
+ ].join('\n');
279
+ return {
280
+ kind: 'print',
281
+ install: { instructions: `add this to ${configPath}:`, snippet: yaml },
282
+ uninstall: {
283
+ instructions: `delete extensions.${SERVER_NAME} from ${configPath}.`,
284
+ },
285
+ };
286
+ },
287
+ },
288
+ ];
289
+ function zedConfigDir(host) {
290
+ return host.platform === 'win32'
291
+ ? path.join(appData(host), 'Zed')
292
+ : path.join(xdgConfig(host), 'zed');
293
+ }
294
+ function gooseConfigPath(host, dirOnly) {
295
+ const dir = host.platform === 'win32'
296
+ ? path.join(appData(host), 'Block', 'goose', 'config')
297
+ : path.join(xdgConfig(host), 'goose');
298
+ return dirOnly ? dir : path.join(dir, 'config.yaml');
299
+ }
300
+ export const CLIENT_IDS = CLIENTS.map((c) => c.id);
301
+ export function findClient(id) {
302
+ return CLIENTS.find((c) => c.id === id);
303
+ }
304
+ //# sourceMappingURL=clients.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clients.js","sourceRoot":"","sources":["../../src/mcp-install/clients.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ export interface SpawnResult {
2
+ status: number | null;
3
+ stdout: string;
4
+ stderr: string;
5
+ /** Set when the process couldn't start or timed out. */
6
+ error?: string;
7
+ }
8
+ /**
9
+ * Everything `--mcp-install` reads from the machine, behind one seam so the
10
+ * client table and server resolution are testable without touching $HOME or
11
+ * spawning real harnesses.
12
+ */
13
+ export interface HostEnv {
14
+ platform: NodeJS.Platform;
15
+ home: string;
16
+ cwd: string;
17
+ env: Readonly<Record<string, string | undefined>>;
18
+ execPath: string;
19
+ argv1: string | undefined;
20
+ /** True for the Bun-compiled standalone binary (Homebrew, .deb, release downloads). */
21
+ isCompiledBinary: boolean;
22
+ exists(p: string): boolean;
23
+ realpath(p: string): string;
24
+ /** Every executable named `name` on PATH, in PATH order. */
25
+ findAllOnPath(name: string): string[];
26
+ spawn(command: string, args: readonly string[]): SpawnResult;
27
+ }
28
+ export declare function createHostEnv(): HostEnv;
29
+ //# sourceMappingURL=host.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host.d.ts","sourceRoot":"","sources":["../../src/mcp-install/host.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,WAAW;IACxB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,wDAAwD;IACxD,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;GAIG;AACH,MAAM,WAAW,OAAO;IACpB,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC;IAClD,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,uFAAuF;IACvF,gBAAgB,EAAE,OAAO,CAAC;IAC1B,MAAM,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAC3B,QAAQ,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC5B,4DAA4D;IAC5D,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACtC,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,WAAW,CAAC;CAChE;AAID,wBAAgB,aAAa,IAAI,OAAO,CA4DvC"}
@@ -0,0 +1,72 @@
1
+ import { spawnSync } from 'node:child_process';
2
+ import { accessSync, constants, existsSync, realpathSync, statSync } from 'node:fs';
3
+ import * as os from 'node:os';
4
+ import * as path from 'node:path';
5
+ const SPAWN_TIMEOUT_MS = 30_000;
6
+ export function createHostEnv() {
7
+ const platform = process.platform;
8
+ const env = process.env;
9
+ const findAllOnPath = (name) => {
10
+ const dirs = (env.PATH ?? '').split(path.delimiter).filter(Boolean);
11
+ const exts = platform === 'win32'
12
+ ? (env.PATHEXT ?? '.EXE;.CMD;.BAT;.COM').split(';').filter(Boolean)
13
+ : [''];
14
+ const found = [];
15
+ for (const dir of dirs) {
16
+ for (const ext of exts) {
17
+ const candidate = path.join(dir, name + ext.toLowerCase());
18
+ if (isExecutable(candidate, platform))
19
+ found.push(candidate);
20
+ }
21
+ }
22
+ return found;
23
+ };
24
+ const bunVersion = process.versions.bun;
25
+ return {
26
+ platform,
27
+ home: os.homedir(),
28
+ cwd: process.cwd(),
29
+ env,
30
+ execPath: process.execPath,
31
+ argv1: process.argv[1],
32
+ isCompiledBinary: bunVersion !== undefined && !/^bun(\.exe)?$/i.test(path.basename(process.execPath)),
33
+ exists: existsSync,
34
+ realpath: (p) => {
35
+ try {
36
+ return realpathSync(p);
37
+ }
38
+ catch {
39
+ return path.resolve(p);
40
+ }
41
+ },
42
+ findAllOnPath,
43
+ spawn: (command, args) => {
44
+ const resolved = findAllOnPath(command)[0] ?? command;
45
+ // Node refuses to spawn .cmd/.bat shims without a shell (CVE-2024-27980).
46
+ const needsShell = platform === 'win32' && /\.(cmd|bat)$/i.test(resolved);
47
+ const result = spawnSync(needsShell ? `"${resolved}"` : resolved, needsShell ? args.map((a) => `"${a.replace(/"/g, '""')}"`) : [...args], {
48
+ encoding: 'utf-8',
49
+ // No stdin: a harness that prompts fails fast instead of hanging.
50
+ stdio: ['ignore', 'pipe', 'pipe'],
51
+ timeout: SPAWN_TIMEOUT_MS,
52
+ shell: needsShell,
53
+ });
54
+ return {
55
+ status: result.status,
56
+ stdout: result.stdout ?? '',
57
+ stderr: result.stderr ?? '',
58
+ error: result.error?.message,
59
+ };
60
+ },
61
+ };
62
+ }
63
+ function isExecutable(candidate, platform) {
64
+ try {
65
+ accessSync(candidate, platform === 'win32' ? constants.F_OK : constants.X_OK);
66
+ return statSync(candidate).isFile();
67
+ }
68
+ catch {
69
+ return false;
70
+ }
71
+ }
72
+ //# sourceMappingURL=host.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host.js","sourceRoot":"","sources":["../../src/mcp-install/host.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import type { JsonTarget } from './clients.js';
2
+ import type { ServerEntry } from './server-command.js';
3
+ export type JsonChange = 'created' | 'added' | 'updated' | 'unchanged' | 'removed' | 'absent';
4
+ export interface JsonEdit {
5
+ change: JsonChange;
6
+ /** The new file content; undefined when nothing changes. */
7
+ text?: string;
8
+ keyPath: string[];
9
+ value?: unknown;
10
+ }
11
+ export declare class JsonConfigError extends Error {
12
+ }
13
+ /**
14
+ * Inserts or replaces the server entry in a JSON / JSONC document, editing
15
+ * the text rather than re-serializing it, so comments, key order, and the
16
+ * file's own indentation survive. `existing` undefined means the file is
17
+ * missing.
18
+ */
19
+ export declare function upsertEntry(existing: string | undefined, target: JsonTarget, entry: ServerEntry): JsonEdit;
20
+ /** Removes the server entry, leaving every other key and comment in place. */
21
+ export declare function removeEntry(existing: string | undefined, target: JsonTarget, entry: ServerEntry): JsonEdit;
22
+ export declare function readConfigFile(filePath: string): string | undefined;
23
+ /**
24
+ * Atomic write (temp file + rename) so a crash never leaves a harness with a
25
+ * half-written config. Writes through a symlink (dotfile managers) and keeps
26
+ * the existing file mode.
27
+ */
28
+ export declare function writeConfigFile(filePath: string, text: string): void;
29
+ //# sourceMappingURL=json-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-config.d.ts","sourceRoot":"","sources":["../../src/mcp-install/json-config.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEvD,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,GAAG,WAAW,GAAG,SAAS,GAAG,QAAQ,CAAC;AAE9F,MAAM,WAAW,QAAQ;IACrB,MAAM,EAAE,UAAU,CAAC;IACnB,4DAA4D;IAC5D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,qBAAa,eAAgB,SAAQ,KAAK;CAAG;AAE7C;;;;;GAKG;AACH,wBAAgB,WAAW,CACvB,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,MAAM,EAAE,UAAU,EAClB,KAAK,EAAE,WAAW,GACnB,QAAQ,CAaV;AAED,8EAA8E;AAC9E,wBAAgB,WAAW,CACvB,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,MAAM,EAAE,UAAU,EAClB,KAAK,EAAE,WAAW,GACnB,QAAQ,CAUV;AAED,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAOnE;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAapE"}
@@ -0,0 +1,139 @@
1
+ import { chmodSync, mkdirSync, readFileSync, realpathSync, renameSync, statSync, writeFileSync, } from 'node:fs';
2
+ import * as path from 'node:path';
3
+ import { applyEdits, modify, parse, printParseErrorCode, } from 'jsonc-parser';
4
+ export class JsonConfigError extends Error {
5
+ }
6
+ /**
7
+ * Inserts or replaces the server entry in a JSON / JSONC document, editing
8
+ * the text rather than re-serializing it, so comments, key order, and the
9
+ * file's own indentation survive. `existing` undefined means the file is
10
+ * missing.
11
+ */
12
+ export function upsertEntry(existing, target, entry) {
13
+ const isNew = existing === undefined || existing.trim() === '';
14
+ const text = isNew ? `${JSON.stringify(target.seed ?? {}, null, 2)}\n` : existing;
15
+ const doc = parseDocument(text, target.path);
16
+ const { keyPath, value } = target.place(entry, doc);
17
+ const current = valueAt(doc, keyPath);
18
+ if (!isNew && deepEqual(current, value))
19
+ return { change: 'unchanged', keyPath, value };
20
+ return {
21
+ change: isNew ? 'created' : current === undefined ? 'added' : 'updated',
22
+ text: applyEdits(text, insertionEdits(text, keyPath, value)),
23
+ keyPath,
24
+ value,
25
+ };
26
+ }
27
+ /** Removes the server entry, leaving every other key and comment in place. */
28
+ export function removeEntry(existing, target, entry) {
29
+ if (existing === undefined || existing.trim() === '') {
30
+ return { change: 'absent', keyPath: [] };
31
+ }
32
+ const doc = parseDocument(existing, target.path);
33
+ const { keyPath } = target.place(entry, doc);
34
+ if (valueAt(doc, keyPath) === undefined)
35
+ return { change: 'absent', keyPath };
36
+ // Unformatted: a pure deletion, so neighbouring entries keep their layout.
37
+ const edits = modify(existing, keyPath, undefined, {});
38
+ return { change: 'removed', text: applyEdits(existing, edits), keyPath };
39
+ }
40
+ export function readConfigFile(filePath) {
41
+ try {
42
+ return readFileSync(filePath, 'utf-8');
43
+ }
44
+ catch (err) {
45
+ if (err.code === 'ENOENT')
46
+ return undefined;
47
+ throw err;
48
+ }
49
+ }
50
+ /**
51
+ * Atomic write (temp file + rename) so a crash never leaves a harness with a
52
+ * half-written config. Writes through a symlink (dotfile managers) and keeps
53
+ * the existing file mode.
54
+ */
55
+ export function writeConfigFile(filePath, text) {
56
+ let destination = filePath;
57
+ let mode;
58
+ try {
59
+ destination = realpathSync(filePath);
60
+ mode = statSync(destination).mode & 0o777;
61
+ }
62
+ catch {
63
+ mkdirSync(path.dirname(filePath), { recursive: true });
64
+ }
65
+ const temp = `${destination}.nowline-${process.pid}.tmp`;
66
+ writeFileSync(temp, text, 'utf-8');
67
+ if (mode !== undefined)
68
+ chmodSync(temp, mode);
69
+ renameSync(temp, destination);
70
+ }
71
+ /**
72
+ * jsonc-parser's formatter re-flows the whole line it edits, and appending a
73
+ * key to a non-empty object edits the previous sibling's line, so a user's
74
+ * compact `"other": { "command": "x" }` would come back expanded. For that
75
+ * case, take the unformatted edit and indent the new property ourselves.
76
+ * Every other case (replacing our own entry, creating a missing parent)
77
+ * only touches lines we own, so the library's formatting is fine.
78
+ */
79
+ function insertionEdits(text, keyPath, value) {
80
+ const formatting = detectFormatting(text);
81
+ const raw = modify(text, keyPath, value, {});
82
+ const edit = raw[0];
83
+ if (raw.length !== 1 || edit.length !== 0 || !edit.content.startsWith(',')) {
84
+ return modify(text, keyPath, value, { formattingOptions: formatting });
85
+ }
86
+ const unit = formatting.insertSpaces ? ' '.repeat(formatting.tabSize ?? 2) : '\t';
87
+ const lineStart = text.lastIndexOf('\n', edit.offset - 1) + 1;
88
+ const lineIndent = /^[ \t]*/.exec(text.slice(lineStart))?.[0] ?? '';
89
+ const property = JSON.stringify(JSON.parse(`{${edit.content.slice(1)}}`), null, unit)
90
+ .split('\n')
91
+ .slice(1, -1)
92
+ .map((line) => lineIndent + line.slice(unit.length));
93
+ const eol = formatting.eol ?? '\n';
94
+ return [{ ...edit, content: `,${eol}${property.join(eol)}` }];
95
+ }
96
+ function parseDocument(text, filePath) {
97
+ const errors = [];
98
+ const doc = parse(text, errors, { allowTrailingComma: true, disallowComments: false });
99
+ if (errors.length > 0) {
100
+ const first = errors[0];
101
+ throw new JsonConfigError(`cannot parse ${filePath}: ${printParseErrorCode(first.error)} at offset ${first.offset}; fix or move the file and re-run.`);
102
+ }
103
+ if (!isRecord(doc)) {
104
+ throw new JsonConfigError(`cannot update ${filePath}: the top level is not a JSON object.`);
105
+ }
106
+ return doc;
107
+ }
108
+ function valueAt(doc, keyPath) {
109
+ let node = doc;
110
+ for (const key of keyPath) {
111
+ if (!isRecord(node))
112
+ return undefined;
113
+ node = node[key];
114
+ }
115
+ return node;
116
+ }
117
+ function detectFormatting(text) {
118
+ const eol = text.includes('\r\n') ? '\r\n' : '\n';
119
+ const indent = /^([ \t]+)\S/m.exec(text)?.[1];
120
+ if (indent?.startsWith('\t'))
121
+ return { insertSpaces: false, tabSize: 1, eol };
122
+ return { insertSpaces: true, tabSize: indent?.length ?? 2, eol };
123
+ }
124
+ function isRecord(value) {
125
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
126
+ }
127
+ function deepEqual(a, b) {
128
+ if (a === b)
129
+ return true;
130
+ if (Array.isArray(a) && Array.isArray(b)) {
131
+ return a.length === b.length && a.every((item, i) => deepEqual(item, b[i]));
132
+ }
133
+ if (isRecord(a) && isRecord(b)) {
134
+ const keys = Object.keys(a);
135
+ return (keys.length === Object.keys(b).length && keys.every((key) => deepEqual(a[key], b[key])));
136
+ }
137
+ return false;
138
+ }
139
+ //# sourceMappingURL=json-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-config.js","sourceRoot":"","sources":["../../src/mcp-install/json-config.ts"],"names":[],"mappings":"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"}