@kodycodes/cli 1.0.0 → 1.1.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 (46) hide show
  1. package/README.md +16 -3
  2. package/dist/add-mcp-install.d.ts +36 -0
  3. package/dist/add-mcp-install.js +48 -0
  4. package/dist/add-mcp-install.js.map +1 -0
  5. package/dist/auth.d.ts +1 -1
  6. package/dist/auth.js +91 -89
  7. package/dist/auth.js.map +1 -1
  8. package/dist/cli.d.ts +3 -1
  9. package/dist/cli.js +17 -2
  10. package/dist/cli.js.map +1 -1
  11. package/dist/defaults.d.ts +10 -0
  12. package/dist/defaults.js +16 -0
  13. package/dist/defaults.js.map +1 -1
  14. package/dist/detect-running-hosts.d.ts +4 -0
  15. package/dist/detect-running-hosts.js +13 -0
  16. package/dist/detect-running-hosts.js.map +1 -0
  17. package/dist/help.js +9 -1
  18. package/dist/help.js.map +1 -1
  19. package/dist/host-catalog.d.ts +27 -0
  20. package/dist/host-catalog.js +355 -0
  21. package/dist/host-catalog.js.map +1 -0
  22. package/dist/host-config.d.ts +23 -0
  23. package/dist/host-config.js +80 -0
  24. package/dist/host-config.js.map +1 -0
  25. package/dist/install-hosts.d.ts +31 -0
  26. package/dist/install-hosts.js +322 -0
  27. package/dist/install-hosts.js.map +1 -0
  28. package/dist/install.d.ts +32 -0
  29. package/dist/install.js +120 -0
  30. package/dist/install.js.map +1 -0
  31. package/dist/mcp.js +6 -7
  32. package/dist/mcp.js.map +1 -1
  33. package/dist/oauth-provider.d.ts +12 -0
  34. package/dist/oauth-provider.js +89 -0
  35. package/dist/oauth-provider.js.map +1 -0
  36. package/dist/onboarding-prompt.d.ts +2 -0
  37. package/dist/onboarding-prompt.js +15 -0
  38. package/dist/onboarding-prompt.js.map +1 -0
  39. package/dist/process-info.d.ts +8 -0
  40. package/dist/process-info.js +14 -0
  41. package/dist/process-info.js.map +1 -0
  42. package/dist/which.d.ts +1 -0
  43. package/dist/which.js +22 -0
  44. package/dist/which.js.map +1 -0
  45. package/package.json +6 -3
  46. package/skills/kody/SKILL.md +11 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect-running-hosts.js","sourceRoot":"","sources":["../src/detect-running-hosts.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,SAAS,CAAA;AAC5B,OAAO,EAAE,WAAW,EAAuB,MAAM,mBAAmB,CAAA;AAGpE,MAAM,CAAC,KAAK,UAAU,oBAAoB;IACzC,MAAM,SAAS,GAAG,MAAM,MAAM,EAAE,CAAA;IAChC,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QAClC,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,GAAG,EAAE,OAAO,CAAC,GAAG;KAChB,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,UAAU,kBAAkB,CACjC,SAA6B,EAC7B,UAAyC,WAAW;IAEpD,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;AACpF,CAAC"}
package/dist/help.js CHANGED
@@ -1,4 +1,5 @@
1
- import { defaultMcpUrl } from './defaults.js';
1
+ import { defaultMcpUrl, onboardingUrl } from './defaults.js';
2
+ import { hostIds } from './host-catalog.js';
2
3
  import { readPackageVersion } from './package-info.js';
3
4
  export const usage = `Kody CLI ${readPackageVersion()}
4
5
 
@@ -11,8 +12,15 @@ Usage:
11
12
  kody whoami [--mcp-url <url>] [--json]
12
13
  kody search [query] [--entity <ref>] [--domain <id>] [--limit <n>] [--json]
13
14
  kody execute [--code <esm>] [--file <path>] [--params <json>] [--conversation-id <id>] [--json]
15
+ kody install [--mcp-url <url>] [--clients <ids>] [--yes] [--project] [--json]
14
16
  kody skill install [--project]
15
17
 
18
+ kody install configures running local MCP clients (Cursor, Claude Desktop,
19
+ VS Code, Goose, and others). For web-based clients (ChatGPT, Claude.ai, Grok),
20
+ see ${onboardingUrl(defaultMcpUrl)}
21
+
22
+ --clients Comma-separated ids: ${hostIds.join(', ')}
23
+
16
24
  Environment:
17
25
  KODY_MCP_URL Override the default MCP URL (${defaultMcpUrl})
18
26
  `;
package/dist/help.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"help.js","sourceRoot":"","sources":["../src/help.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAC7C,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AAEtD,MAAM,CAAC,MAAM,KAAK,GAAG,YAAY,kBAAkB,EAAE;;;;;;;;;;;;;;iDAcJ,aAAa;CAC7D,CAAA"}
1
+ {"version":3,"file":"help.js","sourceRoot":"","sources":["../src/help.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAC5D,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAA;AAC3C,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AAEtD,MAAM,CAAC,MAAM,KAAK,GAAG,YAAY,kBAAkB,EAAE;;;;;;;;;;;;;;;;QAgB7C,aAAa,CAAC,aAAa,CAAC;;oCAEA,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;;;iDAGL,aAAa;CAC7D,CAAA"}
@@ -0,0 +1,27 @@
1
+ import { type ProcessInfo } from './process-info.js';
2
+ export declare const hostIds: readonly ["amazon-q", "antigravity", "claude-code", "claude-desktop", "cline", "cline-cli", "codex", "copilot-cli", "cursor", "gemini-cli", "goose", "grok-build", "jetbrains", "mcporter", "opencode", "qwen-code", "visual-studio", "vscode", "vscode-insiders", "windsurf", "zed"];
3
+ export type HostId = (typeof hostIds)[number];
4
+ export type HostKind = 'file' | 'command' | 'manual';
5
+ export type HostDefinition = {
6
+ id: HostId;
7
+ label: string;
8
+ kind: HostKind;
9
+ matches: (process: ProcessInfo) => boolean;
10
+ };
11
+ export declare function isHostId(value: string): value is HostId;
12
+ export declare function parseHostIds(raw: string): Array<HostId>;
13
+ export declare const hostCatalog: ReadonlyArray<HostDefinition>;
14
+ export declare function hostById(id: HostId): HostDefinition;
15
+ export declare function configHome(home: string, platform?: NodeJS.Platform): string;
16
+ export declare function applicationSupport(home: string, app: string, platform?: NodeJS.Platform): string;
17
+ export declare function hostConfigPath(input: {
18
+ id: HostId;
19
+ home: string;
20
+ cwd: string;
21
+ project: boolean;
22
+ platform?: NodeJS.Platform;
23
+ }): string | null;
24
+ export declare function encodeBase64Url(value: string): string;
25
+ export declare function buildCursorInstallUrl(mcpServerUrl: string): string;
26
+ export declare function buildVsCodeInstallUrl(mcpServerUrl: string, scheme?: 'vscode' | 'vscode-insiders'): string;
27
+ export declare function buildGooseInstallUrl(mcpServerUrl: string): string;
@@ -0,0 +1,355 @@
1
+ import { join } from 'node:path';
2
+ import { haystackMatches, nameEquals } from './process-info.js';
3
+ export const hostIds = [
4
+ 'amazon-q',
5
+ 'antigravity',
6
+ 'claude-code',
7
+ 'claude-desktop',
8
+ 'cline',
9
+ 'cline-cli',
10
+ 'codex',
11
+ 'copilot-cli',
12
+ 'cursor',
13
+ 'gemini-cli',
14
+ 'goose',
15
+ 'grok-build',
16
+ 'jetbrains',
17
+ 'mcporter',
18
+ 'opencode',
19
+ 'qwen-code',
20
+ 'visual-studio',
21
+ 'vscode',
22
+ 'vscode-insiders',
23
+ 'windsurf',
24
+ 'zed',
25
+ ];
26
+ const hostAliases = {
27
+ 'cline-vscode': 'cline',
28
+ codeium: 'windsurf',
29
+ cascade: 'windsurf',
30
+ gemini: 'gemini-cli',
31
+ 'github-copilot-cli': 'copilot-cli',
32
+ };
33
+ function isClaudeDesktop(process) {
34
+ if (haystackMatches(process, /Claude\.app|claude-desktop|Claude Helper/iu)) {
35
+ return true;
36
+ }
37
+ const raw = process.name.replace(/\.exe$/iu, '').trim();
38
+ return raw === 'Claude' || raw.startsWith('Claude ');
39
+ }
40
+ export function isHostId(value) {
41
+ return hostIds.includes(value);
42
+ }
43
+ export function parseHostIds(raw) {
44
+ const ids = raw
45
+ .split(',')
46
+ .map((part) => part.trim())
47
+ .filter(Boolean);
48
+ if (ids.length === 0) {
49
+ throw new Error(`Provide at least one client id. Known: ${hostIds.join(', ')}`);
50
+ }
51
+ const known = [];
52
+ for (const id of ids) {
53
+ if (id === 'grok' || id === 'chatgpt' || id === 'claude.ai') {
54
+ throw new Error(`"${id}" is a web client. For the local Grok Build CLI use grok-build. For web-based clients see https://kody.codes/onboarding`);
55
+ }
56
+ const resolved = hostAliases[id] ?? id;
57
+ if (!isHostId(resolved)) {
58
+ throw new Error(`Unknown client "${id}". Known: ${hostIds.join(', ')}`);
59
+ }
60
+ known.push(resolved);
61
+ }
62
+ return known;
63
+ }
64
+ const jetbrainsNames = [
65
+ 'clion',
66
+ 'datagrip',
67
+ 'goland',
68
+ 'idea',
69
+ 'idea64',
70
+ 'intellij',
71
+ 'phpstorm',
72
+ 'pycharm',
73
+ 'pycharm64',
74
+ 'rider',
75
+ 'rubymine',
76
+ 'rustrover',
77
+ 'webstorm',
78
+ 'webstorm64',
79
+ ];
80
+ export const hostCatalog = [
81
+ {
82
+ id: 'cursor',
83
+ label: 'Cursor',
84
+ kind: 'file',
85
+ matches: (process) => nameEquals(process, 'cursor') || haystackMatches(process, /Cursor\.app/iu),
86
+ },
87
+ {
88
+ id: 'vscode-insiders',
89
+ label: 'VS Code Insiders',
90
+ kind: 'file',
91
+ matches: (process) => /insiders/iu.test(process.name) &&
92
+ (/code/iu.test(process.name) || haystackMatches(process, /code/iu)),
93
+ },
94
+ {
95
+ id: 'vscode',
96
+ label: 'VS Code',
97
+ kind: 'file',
98
+ matches: (process) => {
99
+ if (haystackMatches(process, /insiders|cursor|windsurf|antigravity/iu))
100
+ return false;
101
+ const base = process.name.replace(/\.exe$/iu, '').trim().toLowerCase();
102
+ return (base === 'code' ||
103
+ base === 'code - oss' ||
104
+ base.startsWith('code helper') ||
105
+ haystackMatches(process, /Visual Studio Code\.app/iu));
106
+ },
107
+ },
108
+ {
109
+ id: 'claude-desktop',
110
+ label: 'Claude Desktop',
111
+ kind: 'manual',
112
+ matches: isClaudeDesktop,
113
+ },
114
+ {
115
+ id: 'claude-code',
116
+ label: 'Claude Code',
117
+ kind: 'command',
118
+ matches: (process) => nameEquals(process, 'claude') && !isClaudeDesktop(process),
119
+ },
120
+ {
121
+ id: 'codex',
122
+ label: 'Codex',
123
+ kind: 'file',
124
+ matches: (process) => nameEquals(process, 'codex') || haystackMatches(process, /Codex\.app/iu),
125
+ },
126
+ {
127
+ id: 'opencode',
128
+ label: 'OpenCode',
129
+ kind: 'file',
130
+ matches: (process) => nameEquals(process, 'opencode'),
131
+ },
132
+ {
133
+ id: 'goose',
134
+ label: 'Goose',
135
+ kind: 'file',
136
+ matches: (process) => nameEquals(process, 'goose', 'goosed') || haystackMatches(process, /Goose\.app/iu),
137
+ },
138
+ {
139
+ id: 'windsurf',
140
+ label: 'Windsurf',
141
+ kind: 'file',
142
+ matches: (process) => nameEquals(process, 'windsurf') || haystackMatches(process, /Windsurf\.app/iu),
143
+ },
144
+ {
145
+ id: 'zed',
146
+ label: 'Zed',
147
+ kind: 'file',
148
+ matches: (process) => nameEquals(process, 'zed') || haystackMatches(process, /Zed\.app/iu),
149
+ },
150
+ {
151
+ id: 'copilot-cli',
152
+ label: 'Copilot CLI',
153
+ kind: 'command',
154
+ matches: (process) => nameEquals(process, 'copilot'),
155
+ },
156
+ {
157
+ id: 'gemini-cli',
158
+ label: 'Gemini CLI',
159
+ kind: 'command',
160
+ matches: (process) => nameEquals(process, 'gemini'),
161
+ },
162
+ {
163
+ id: 'qwen-code',
164
+ label: 'Qwen Code',
165
+ kind: 'file',
166
+ matches: (process) => nameEquals(process, 'qwen'),
167
+ },
168
+ {
169
+ id: 'amazon-q',
170
+ label: 'Amazon Q',
171
+ kind: 'file',
172
+ matches: (process) => haystackMatches(process, /amazon.?q/iu) ||
173
+ (nameEquals(process, 'q') && haystackMatches(process, /amazon/iu)),
174
+ },
175
+ {
176
+ id: 'antigravity',
177
+ label: 'Antigravity',
178
+ kind: 'file',
179
+ matches: (process) => nameEquals(process, 'antigravity') || haystackMatches(process, /Antigravity\.app/iu),
180
+ },
181
+ {
182
+ id: 'cline',
183
+ label: 'Cline',
184
+ kind: 'file',
185
+ matches: (process) => nameEquals(process, 'cline-vscode') || haystackMatches(process, /cline-vscode/iu),
186
+ },
187
+ {
188
+ id: 'cline-cli',
189
+ label: 'Cline CLI',
190
+ kind: 'command',
191
+ matches: (process) => nameEquals(process, 'cline'),
192
+ },
193
+ {
194
+ id: 'grok-build',
195
+ label: 'Grok Build',
196
+ kind: 'file',
197
+ matches: (process) => nameEquals(process, 'grok'),
198
+ },
199
+ {
200
+ id: 'mcporter',
201
+ label: 'MCPorter',
202
+ kind: 'file',
203
+ matches: (process) => nameEquals(process, 'mcporter'),
204
+ },
205
+ {
206
+ id: 'visual-studio',
207
+ label: 'Visual Studio',
208
+ kind: 'file',
209
+ matches: (process) => nameEquals(process, 'devenv'),
210
+ },
211
+ {
212
+ id: 'jetbrains',
213
+ label: 'JetBrains IDE',
214
+ kind: 'manual',
215
+ matches: (process) => nameEquals(process, ...jetbrainsNames) ||
216
+ haystackMatches(process, /IntelliJ IDEA|PyCharm|WebStorm|GoLand|RustRover|PhpStorm|CLion|Rider|RubyMine|DataGrip/u),
217
+ },
218
+ ];
219
+ export function hostById(id) {
220
+ const host = hostCatalog.find((candidate) => candidate.id === id);
221
+ if (!host)
222
+ throw new Error(`Unknown host: ${id}`);
223
+ return host;
224
+ }
225
+ export function configHome(home, platform = process.platform) {
226
+ return platform === 'win32' ? join(home, 'AppData', 'Roaming') : join(home, '.config');
227
+ }
228
+ export function applicationSupport(home, app, platform = process.platform) {
229
+ if (platform === 'darwin')
230
+ return join(home, 'Library', 'Application Support', app);
231
+ if (platform === 'win32')
232
+ return join(home, 'AppData', 'Roaming', app);
233
+ return join(home, '.config', app);
234
+ }
235
+ export function hostConfigPath(input) {
236
+ const platform = input.platform ?? process.platform;
237
+ if (input.project) {
238
+ switch (input.id) {
239
+ case 'cursor':
240
+ return join(input.cwd, '.cursor', 'mcp.json');
241
+ case 'vscode':
242
+ case 'vscode-insiders':
243
+ case 'copilot-cli':
244
+ return join(input.cwd, '.vscode', 'mcp.json');
245
+ case 'claude-code':
246
+ return join(input.cwd, '.mcp.json');
247
+ case 'opencode':
248
+ return join(input.cwd, 'opencode.json');
249
+ case 'codex':
250
+ return join(input.cwd, '.codex', 'config.toml');
251
+ case 'gemini-cli':
252
+ return join(input.cwd, '.gemini', 'settings.json');
253
+ case 'qwen-code':
254
+ return join(input.cwd, '.qwen', 'settings.json');
255
+ case 'amazon-q':
256
+ return join(input.cwd, '.amazonq', 'mcp.json');
257
+ case 'zed':
258
+ return join(input.cwd, '.zed', 'settings.json');
259
+ case 'grok-build':
260
+ return join(input.cwd, '.grok', 'config.toml');
261
+ case 'mcporter':
262
+ return join(input.cwd, 'config', 'mcporter.json');
263
+ case 'antigravity':
264
+ case 'claude-desktop':
265
+ case 'cline':
266
+ case 'cline-cli':
267
+ case 'goose':
268
+ case 'windsurf':
269
+ case 'visual-studio':
270
+ case 'jetbrains':
271
+ return null;
272
+ default: {
273
+ const exhaustive = input.id;
274
+ return exhaustive;
275
+ }
276
+ }
277
+ }
278
+ switch (input.id) {
279
+ case 'cursor':
280
+ return join(input.home, '.cursor', 'mcp.json');
281
+ case 'vscode':
282
+ return join(applicationSupport(input.home, 'Code', platform), 'User', 'mcp.json');
283
+ case 'vscode-insiders':
284
+ return join(applicationSupport(input.home, 'Code - Insiders', platform), 'User', 'mcp.json');
285
+ case 'claude-code':
286
+ return join(input.home, '.claude.json');
287
+ case 'codex':
288
+ return join(input.home, '.codex', 'config.toml');
289
+ case 'opencode':
290
+ return join(configHome(input.home, platform), 'opencode', 'opencode.json');
291
+ case 'goose':
292
+ return join(configHome(input.home, platform), 'goose', 'config.yaml');
293
+ case 'windsurf':
294
+ return join(input.home, '.codeium', 'windsurf', 'mcp_config.json');
295
+ case 'zed':
296
+ return join(configHome(input.home, platform), 'zed', 'settings.json');
297
+ case 'copilot-cli':
298
+ return join(input.home, '.copilot', 'mcp-config.json');
299
+ case 'gemini-cli':
300
+ return join(input.home, '.gemini', 'settings.json');
301
+ case 'qwen-code':
302
+ return join(input.home, '.qwen', 'settings.json');
303
+ case 'amazon-q':
304
+ return join(input.home, '.aws', 'amazonq', 'mcp.json');
305
+ case 'antigravity':
306
+ return join(input.home, '.gemini', 'config', 'mcp_config.json');
307
+ case 'cline':
308
+ return join(applicationSupport(input.home, 'Code', platform), 'User', 'globalStorage', 'saoudrizwan.claude-dev', 'settings', 'cline_mcp_settings.json');
309
+ case 'cline-cli':
310
+ return join(input.home, '.cline', 'data', 'settings', 'cline_mcp_settings.json');
311
+ case 'grok-build':
312
+ return join(input.home, '.grok', 'config.toml');
313
+ case 'mcporter':
314
+ return join(input.home, '.mcporter', 'mcporter.json');
315
+ case 'visual-studio':
316
+ return join(input.home, '.mcp.json');
317
+ case 'claude-desktop':
318
+ case 'jetbrains':
319
+ return null;
320
+ default: {
321
+ const exhaustive = input.id;
322
+ return exhaustive;
323
+ }
324
+ }
325
+ }
326
+ export function encodeBase64Url(value) {
327
+ return Buffer.from(value)
328
+ .toString('base64')
329
+ .replaceAll('+', '-')
330
+ .replaceAll('/', '_')
331
+ .replace(/=+$/u, '');
332
+ }
333
+ export function buildCursorInstallUrl(mcpServerUrl) {
334
+ const config = encodeBase64Url(JSON.stringify({ url: mcpServerUrl }));
335
+ return `cursor://anysphere.cursor-deeplink/mcp/install?name=kody&config=${config}`;
336
+ }
337
+ export function buildVsCodeInstallUrl(mcpServerUrl, scheme = 'vscode') {
338
+ const config = encodeURIComponent(JSON.stringify({
339
+ name: 'kody',
340
+ type: 'http',
341
+ url: mcpServerUrl,
342
+ }));
343
+ return `${scheme}:mcp/install?${config}`;
344
+ }
345
+ export function buildGooseInstallUrl(mcpServerUrl) {
346
+ const params = new URLSearchParams({
347
+ url: mcpServerUrl,
348
+ type: 'streamable_http',
349
+ id: 'kody',
350
+ name: 'Kody',
351
+ description: 'Kody personal assistant',
352
+ });
353
+ return `goose://extension?${params.toString()}`;
354
+ }
355
+ //# sourceMappingURL=host-catalog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host-catalog.js","sourceRoot":"","sources":["../src/host-catalog.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ export declare const leftoverHostIds: readonly ["amazon-q", "qwen-code", "visual-studio", "vscode-insiders"];
2
+ export type LeftoverHostId = (typeof leftoverHostIds)[number];
3
+ export declare function leftoverRemoteEntry(id: LeftoverHostId, mcpUrl: string): Record<string, unknown>;
4
+ export declare function sameRemoteUrl(entry: unknown, mcpUrl: string): boolean;
5
+ export declare function mergeHostDocument(input: {
6
+ id: LeftoverHostId;
7
+ existing: string | null;
8
+ mcpUrl: string;
9
+ }): {
10
+ body: string;
11
+ changed: boolean;
12
+ };
13
+ export declare function writeMergedConfig(input: {
14
+ path: string;
15
+ id: LeftoverHostId;
16
+ mcpUrl: string;
17
+ readFile: (path: string) => Promise<string | null>;
18
+ writeFile: (path: string, body: string) => Promise<void>;
19
+ mkdir: (path: string) => Promise<void>;
20
+ }): Promise<{
21
+ path: string;
22
+ changed: boolean;
23
+ }>;
@@ -0,0 +1,80 @@
1
+ import { dirname } from 'node:path';
2
+ export const leftoverHostIds = [
3
+ 'amazon-q',
4
+ 'qwen-code',
5
+ 'visual-studio',
6
+ 'vscode-insiders',
7
+ ];
8
+ function asObject(value, label) {
9
+ if (value && typeof value === 'object' && !Array.isArray(value)) {
10
+ return value;
11
+ }
12
+ throw new Error(`${label} must be a JSON object.`);
13
+ }
14
+ function nestedObject(parent, key) {
15
+ const current = parent[key];
16
+ if (current == null) {
17
+ const next = {};
18
+ parent[key] = next;
19
+ return next;
20
+ }
21
+ return asObject(current, key);
22
+ }
23
+ export function leftoverRemoteEntry(id, mcpUrl) {
24
+ switch (id) {
25
+ case 'vscode-insiders':
26
+ case 'visual-studio':
27
+ case 'amazon-q':
28
+ return { type: 'http', url: mcpUrl };
29
+ case 'qwen-code':
30
+ return { httpUrl: mcpUrl };
31
+ default: {
32
+ const exhaustive = id;
33
+ return exhaustive;
34
+ }
35
+ }
36
+ }
37
+ function jsonRootKey(id) {
38
+ switch (id) {
39
+ case 'vscode-insiders':
40
+ case 'visual-studio':
41
+ return 'servers';
42
+ case 'amazon-q':
43
+ case 'qwen-code':
44
+ return 'mcpServers';
45
+ default: {
46
+ const exhaustive = id;
47
+ return exhaustive;
48
+ }
49
+ }
50
+ }
51
+ export function sameRemoteUrl(entry, mcpUrl) {
52
+ if (!entry || typeof entry !== 'object')
53
+ return false;
54
+ const record = entry;
55
+ const candidates = [record.url, record.serverUrl, record.httpUrl, record.uri];
56
+ return candidates.some((value) => value === mcpUrl);
57
+ }
58
+ export function mergeHostDocument(input) {
59
+ const entry = leftoverRemoteEntry(input.id, input.mcpUrl);
60
+ const parsed = input.existing?.trim() ? JSON.parse(input.existing) : {};
61
+ const root = asObject(parsed, 'MCP config');
62
+ const bucket = nestedObject(root, jsonRootKey(input.id));
63
+ const changed = !sameRemoteUrl(bucket.kody, input.mcpUrl);
64
+ bucket.kody = entry;
65
+ return { body: `${JSON.stringify(root, null, 2)}\n`, changed };
66
+ }
67
+ export async function writeMergedConfig(input) {
68
+ const existing = await input.readFile(input.path);
69
+ const merged = mergeHostDocument({
70
+ id: input.id,
71
+ existing,
72
+ mcpUrl: input.mcpUrl,
73
+ });
74
+ if (merged.changed) {
75
+ await input.mkdir(dirname(input.path));
76
+ await input.writeFile(input.path, merged.body);
77
+ }
78
+ return { path: input.path, changed: merged.changed };
79
+ }
80
+ //# sourceMappingURL=host-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host-config.js","sourceRoot":"","sources":["../src/host-config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import { type UpsertServerFn } from './add-mcp-install.js';
2
+ import { type HostId } from './host-catalog.js';
3
+ export type ApplyStatus = 'wrote' | 'unchanged' | 'manual' | 'command';
4
+ export type ApplyResult = {
5
+ id: HostId;
6
+ label: string;
7
+ status: ApplyStatus;
8
+ path?: string;
9
+ opened?: string;
10
+ command?: string;
11
+ instructions: Array<string>;
12
+ };
13
+ export type InstallRuntime = {
14
+ home: string;
15
+ cwd: string;
16
+ project: boolean;
17
+ platform?: NodeJS.Platform;
18
+ which?: (command: string) => string | undefined;
19
+ openUrl?: (url: string) => Promise<boolean>;
20
+ openApp?: (name: string) => Promise<boolean>;
21
+ runCommand?: (command: string, args: Array<string>) => Promise<boolean>;
22
+ readFile?: (path: string) => Promise<string | null>;
23
+ writeFile?: (path: string, body: string) => Promise<void>;
24
+ mkdir?: (path: string) => Promise<void>;
25
+ upsertServer?: UpsertServerFn;
26
+ };
27
+ export declare function applyHost(input: {
28
+ id: HostId;
29
+ mcpUrl: string;
30
+ runtime: InstallRuntime;
31
+ }): Promise<ApplyResult>;