@kodycodes/cli 1.0.1 → 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.
@@ -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>;