@nowline/cli 0.8.6 → 0.10.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 (91) 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 +31 -3
  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 +7 -12
  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.d.ts.map +1 -1
  37. package/dist/generated/version.js +2 -2
  38. package/dist/generated/version.js.map +1 -1
  39. package/dist/i18n/locale.d.ts.map +1 -1
  40. package/dist/i18n/locale.js +2 -5
  41. package/dist/i18n/locale.js.map +1 -1
  42. package/dist/index.js +4 -0
  43. package/dist/index.js.map +1 -1
  44. package/dist/io/config.d.ts +1 -1
  45. package/dist/io/config.d.ts.map +1 -1
  46. package/dist/io/config.js +1 -1
  47. package/dist/io/config.js.map +1 -1
  48. package/dist/io/log.d.ts +17 -0
  49. package/dist/io/log.d.ts.map +1 -0
  50. package/dist/io/log.js +16 -0
  51. package/dist/io/log.js.map +1 -0
  52. package/dist/mcp-install/clients.d.ts +58 -0
  53. package/dist/mcp-install/clients.d.ts.map +1 -0
  54. package/dist/mcp-install/clients.js +304 -0
  55. package/dist/mcp-install/clients.js.map +1 -0
  56. package/dist/mcp-install/host.d.ts +29 -0
  57. package/dist/mcp-install/host.d.ts.map +1 -0
  58. package/dist/mcp-install/host.js +72 -0
  59. package/dist/mcp-install/host.js.map +1 -0
  60. package/dist/mcp-install/json-config.d.ts +29 -0
  61. package/dist/mcp-install/json-config.d.ts.map +1 -0
  62. package/dist/mcp-install/json-config.js +139 -0
  63. package/dist/mcp-install/json-config.js.map +1 -0
  64. package/dist/mcp-install/server-command.d.ts +26 -0
  65. package/dist/mcp-install/server-command.d.ts.map +1 -0
  66. package/dist/mcp-install/server-command.js +52 -0
  67. package/dist/mcp-install/server-command.js.map +1 -0
  68. package/man/fr/nowline.1 +248 -19
  69. package/man/fr/nowline.5 +819 -45
  70. package/man/nowline.1 +193 -18
  71. package/man/nowline.5 +764 -36
  72. package/package.json +19 -19
  73. package/src/cli/args.ts +55 -5
  74. package/src/cli/help.ts +31 -3
  75. package/src/cli/options.ts +286 -0
  76. package/src/commands/init.ts +2 -3
  77. package/src/commands/mcp-install.ts +211 -0
  78. package/src/commands/mcp.ts +10 -14
  79. package/src/commands/render.ts +198 -195
  80. package/src/commands/serve.ts +102 -74
  81. package/src/diagnostics/adapt.ts +62 -0
  82. package/src/diagnostics/model.ts +1 -1
  83. package/src/generated/version.ts +2 -2
  84. package/src/i18n/locale.ts +2 -6
  85. package/src/index.ts +3 -0
  86. package/src/io/config.ts +0 -1
  87. package/src/io/log.ts +33 -0
  88. package/src/mcp-install/clients.ts +443 -0
  89. package/src/mcp-install/host.ts +106 -0
  90. package/src/mcp-install/json-config.ts +179 -0
  91. package/src/mcp-install/server-command.ts +75 -0
@@ -0,0 +1,58 @@
1
+ import type { HostEnv } from './host.js';
2
+ import type { ServerEntry } from './server-command.js';
3
+ export type Scope = 'user' | 'project';
4
+ /** The name every harness registers the server under, so tools surface as `mcp__nowline__*`. */
5
+ export declare const SERVER_NAME = "nowline";
6
+ /** A JSON / JSONC config file we edit in place. */
7
+ export interface JsonTarget {
8
+ kind: 'json';
9
+ path: string;
10
+ /** Where the entry goes and what it holds, decided after reading the existing document. */
11
+ place(entry: ServerEntry, doc: unknown): {
12
+ keyPath: string[];
13
+ value: unknown;
14
+ };
15
+ /** Top-level keys a newly created file starts with. */
16
+ seed?: Record<string, unknown>;
17
+ /** Shown after a successful install. */
18
+ hint?: string;
19
+ }
20
+ /**
21
+ * A harness whose config we can't safely edit ourselves (Claude Code's
22
+ * ~/.claude.json, Codex's TOML): run its own `mcp add`, else print it.
23
+ */
24
+ export interface CliTarget {
25
+ kind: 'cli';
26
+ binary: string;
27
+ add: string[];
28
+ remove: string[];
29
+ fallback: PrintTarget;
30
+ }
31
+ /** Paste-ready instructions, for configs we neither edit nor reach through a CLI. */
32
+ export interface PrintTarget {
33
+ kind: 'print';
34
+ install: {
35
+ instructions: string;
36
+ snippet: string;
37
+ };
38
+ uninstall: {
39
+ instructions: string;
40
+ snippet?: string;
41
+ };
42
+ }
43
+ export type Target = JsonTarget | CliTarget | PrintTarget;
44
+ export interface ClientDescriptor {
45
+ id: string;
46
+ name: string;
47
+ scopes: readonly Scope[];
48
+ /** True when the harness looks installed (its CLI is on PATH or its config dir exists). */
49
+ detect(host: HostEnv): boolean;
50
+ target(scope: Scope, entry: ServerEntry, host: HostEnv): Target;
51
+ }
52
+ /** POSIX-shell quoting for printed commands; bare when nothing needs escaping. */
53
+ export declare function shellQuote(arg: string): string;
54
+ export declare function commandLine(argv: readonly string[]): string;
55
+ export declare const CLIENTS: readonly ClientDescriptor[];
56
+ export declare const CLIENT_IDS: readonly string[];
57
+ export declare function findClient(id: string): ClientDescriptor | undefined;
58
+ //# sourceMappingURL=clients.d.ts.map
@@ -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"}