@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.
- package/README.md +12 -0
- package/dist/add-mcp-install.d.ts +36 -0
- package/dist/add-mcp-install.js +48 -0
- package/dist/add-mcp-install.js.map +1 -0
- package/dist/cli.d.ts +3 -1
- package/dist/cli.js +14 -0
- package/dist/cli.js.map +1 -1
- package/dist/defaults.d.ts +2 -0
- package/dist/defaults.js +4 -0
- package/dist/defaults.js.map +1 -1
- package/dist/detect-running-hosts.d.ts +4 -0
- package/dist/detect-running-hosts.js +13 -0
- package/dist/detect-running-hosts.js.map +1 -0
- package/dist/help.js +9 -1
- package/dist/help.js.map +1 -1
- package/dist/host-catalog.d.ts +27 -0
- package/dist/host-catalog.js +355 -0
- package/dist/host-catalog.js.map +1 -0
- package/dist/host-config.d.ts +23 -0
- package/dist/host-config.js +80 -0
- package/dist/host-config.js.map +1 -0
- package/dist/install-hosts.d.ts +31 -0
- package/dist/install-hosts.js +322 -0
- package/dist/install-hosts.js.map +1 -0
- package/dist/install.d.ts +32 -0
- package/dist/install.js +120 -0
- package/dist/install.js.map +1 -0
- package/dist/onboarding-prompt.d.ts +2 -0
- package/dist/onboarding-prompt.js +15 -0
- package/dist/onboarding-prompt.js.map +1 -0
- package/dist/process-info.d.ts +8 -0
- package/dist/process-info.js +14 -0
- package/dist/process-info.js.map +1 -0
- package/dist/which.d.ts +1 -0
- package/dist/which.js +22 -0
- package/dist/which.js.map +1 -0
- package/package.json +5 -2
- package/skills/kody/SKILL.md +10 -0
|
@@ -0,0 +1,322 @@
|
|
|
1
|
+
import { mkdir, readFile, writeFile } from 'node:fs/promises';
|
|
2
|
+
import { spawn } from 'node:child_process';
|
|
3
|
+
import { addMcpAgentByHostId, addMcpUsesProjectScope, defaultUpsertServer, isAddMcpHostId, kodyRemoteConfig, } from './add-mcp-install.js';
|
|
4
|
+
import { buildCursorInstallUrl, buildGooseInstallUrl, buildVsCodeInstallUrl, hostById, hostConfigPath, } from './host-catalog.js';
|
|
5
|
+
import { writeMergedConfig } from './host-config.js';
|
|
6
|
+
import { openUrl } from './open-url.js';
|
|
7
|
+
import { which as whichOnPath } from './which.js';
|
|
8
|
+
const oauthNote = 'Approve Kody in the browser when the client starts OAuth.';
|
|
9
|
+
async function defaultReadFile(path) {
|
|
10
|
+
try {
|
|
11
|
+
return await readFile(path, 'utf8');
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
return null;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
async function defaultRunCommand(command, args) {
|
|
18
|
+
return await new Promise((resolve) => {
|
|
19
|
+
const child = spawn(command, args, { stdio: 'ignore' });
|
|
20
|
+
child.on('error', () => resolve(false));
|
|
21
|
+
child.on('exit', (code) => resolve(code === 0));
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
async function defaultOpenApp(name) {
|
|
25
|
+
if (process.platform === 'darwin')
|
|
26
|
+
return defaultRunCommand('open', ['-a', name]);
|
|
27
|
+
if (process.platform === 'win32')
|
|
28
|
+
return defaultRunCommand('cmd', ['/c', 'start', '', name]);
|
|
29
|
+
return defaultRunCommand(name, []);
|
|
30
|
+
}
|
|
31
|
+
function runtimeMethods(runtime) {
|
|
32
|
+
return {
|
|
33
|
+
which: runtime.which ?? whichOnPath,
|
|
34
|
+
openUrl: runtime.openUrl ?? openUrl,
|
|
35
|
+
openApp: runtime.openApp ?? defaultOpenApp,
|
|
36
|
+
runCommand: runtime.runCommand ?? defaultRunCommand,
|
|
37
|
+
readFile: runtime.readFile ?? defaultReadFile,
|
|
38
|
+
writeFile: runtime.writeFile ?? ((path, body) => writeFile(path, body, 'utf8')),
|
|
39
|
+
mkdir: runtime.mkdir ?? ((path) => mkdir(path, { recursive: true }).then(() => undefined)),
|
|
40
|
+
upsertServer: runtime.upsertServer ?? defaultUpsertServer,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
async function writeLeftoverFile(id, mcpUrl, runtime) {
|
|
44
|
+
const path = hostConfigPath({
|
|
45
|
+
id,
|
|
46
|
+
home: runtime.home,
|
|
47
|
+
cwd: runtime.cwd,
|
|
48
|
+
project: runtime.project,
|
|
49
|
+
platform: runtime.platform,
|
|
50
|
+
});
|
|
51
|
+
if (!path)
|
|
52
|
+
return null;
|
|
53
|
+
const io = runtimeMethods(runtime);
|
|
54
|
+
return await writeMergedConfig({
|
|
55
|
+
path,
|
|
56
|
+
id,
|
|
57
|
+
mcpUrl,
|
|
58
|
+
readFile: io.readFile,
|
|
59
|
+
writeFile: io.writeFile,
|
|
60
|
+
mkdir: io.mkdir,
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
function writeAddMcpHost(id, mcpUrl, runtime) {
|
|
64
|
+
const result = runtimeMethods(runtime).upsertServer(addMcpAgentByHostId[id], 'kody', kodyRemoteConfig(mcpUrl), {
|
|
65
|
+
local: addMcpUsesProjectScope(id, runtime.project),
|
|
66
|
+
cwd: runtime.cwd,
|
|
67
|
+
});
|
|
68
|
+
if (!result.success) {
|
|
69
|
+
return { changed: false, error: result.error ?? `add-mcp could not configure ${id}.` };
|
|
70
|
+
}
|
|
71
|
+
return { path: result.path, changed: true };
|
|
72
|
+
}
|
|
73
|
+
async function tryCommand(runtime, command, args) {
|
|
74
|
+
const resolved = runtimeMethods(runtime).which(command);
|
|
75
|
+
const line = `${command} ${args.join(' ')}`;
|
|
76
|
+
if (!resolved)
|
|
77
|
+
return { ran: false, command: line };
|
|
78
|
+
const ok = await runtimeMethods(runtime).runCommand(resolved, args);
|
|
79
|
+
return { ran: ok, command: line };
|
|
80
|
+
}
|
|
81
|
+
export async function applyHost(input) {
|
|
82
|
+
const host = hostById(input.id);
|
|
83
|
+
const io = runtimeMethods(input.runtime);
|
|
84
|
+
switch (input.id) {
|
|
85
|
+
case 'claude-desktop': {
|
|
86
|
+
const opened = await io.openApp('Claude');
|
|
87
|
+
return {
|
|
88
|
+
id: input.id,
|
|
89
|
+
label: host.label,
|
|
90
|
+
status: 'manual',
|
|
91
|
+
opened: opened ? 'Claude' : undefined,
|
|
92
|
+
instructions: [
|
|
93
|
+
'Open Settings → Connectors and add a custom connector with this MCP URL.',
|
|
94
|
+
'Do not put the remote URL in claude_desktop_config.json.',
|
|
95
|
+
'After connecting, start a new chat and ask Claude to list Kody tools.',
|
|
96
|
+
oauthNote,
|
|
97
|
+
],
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
case 'jetbrains':
|
|
101
|
+
return {
|
|
102
|
+
id: input.id,
|
|
103
|
+
label: host.label,
|
|
104
|
+
status: 'manual',
|
|
105
|
+
instructions: [
|
|
106
|
+
'Open Settings → Tools → AI Assistant → MCP and add a remote HTTP server named kody.',
|
|
107
|
+
oauthNote,
|
|
108
|
+
],
|
|
109
|
+
};
|
|
110
|
+
case 'claude-code': {
|
|
111
|
+
const added = await tryCommand(input.runtime, 'claude', [
|
|
112
|
+
'mcp',
|
|
113
|
+
'add',
|
|
114
|
+
'--transport',
|
|
115
|
+
'http',
|
|
116
|
+
'-s',
|
|
117
|
+
input.runtime.project ? 'project' : 'user',
|
|
118
|
+
'kody',
|
|
119
|
+
input.mcpUrl,
|
|
120
|
+
]);
|
|
121
|
+
if (added.ran) {
|
|
122
|
+
return {
|
|
123
|
+
id: input.id,
|
|
124
|
+
label: host.label,
|
|
125
|
+
status: 'command',
|
|
126
|
+
command: added.command,
|
|
127
|
+
instructions: [oauthNote],
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
return addMcpResult(input, [
|
|
131
|
+
`Or run: claude mcp add --transport http -s user kody ${input.mcpUrl}`,
|
|
132
|
+
oauthNote,
|
|
133
|
+
]);
|
|
134
|
+
}
|
|
135
|
+
case 'copilot-cli': {
|
|
136
|
+
const added = await tryCommand(input.runtime, 'copilot', [
|
|
137
|
+
'mcp',
|
|
138
|
+
'add',
|
|
139
|
+
'--transport',
|
|
140
|
+
'http',
|
|
141
|
+
'kody',
|
|
142
|
+
input.mcpUrl,
|
|
143
|
+
]);
|
|
144
|
+
if (added.ran) {
|
|
145
|
+
return {
|
|
146
|
+
id: input.id,
|
|
147
|
+
label: host.label,
|
|
148
|
+
status: 'command',
|
|
149
|
+
command: added.command,
|
|
150
|
+
instructions: [oauthNote],
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
return addMcpResult(input, [
|
|
154
|
+
`Or run: copilot mcp add --transport http kody ${input.mcpUrl}`,
|
|
155
|
+
oauthNote,
|
|
156
|
+
]);
|
|
157
|
+
}
|
|
158
|
+
case 'gemini-cli': {
|
|
159
|
+
const added = await tryCommand(input.runtime, 'gemini', [
|
|
160
|
+
'mcp',
|
|
161
|
+
'add',
|
|
162
|
+
'--transport',
|
|
163
|
+
'http',
|
|
164
|
+
'--scope',
|
|
165
|
+
input.runtime.project ? 'project' : 'user',
|
|
166
|
+
'kody',
|
|
167
|
+
input.mcpUrl,
|
|
168
|
+
]);
|
|
169
|
+
if (added.ran) {
|
|
170
|
+
return {
|
|
171
|
+
id: input.id,
|
|
172
|
+
label: host.label,
|
|
173
|
+
status: 'command',
|
|
174
|
+
command: added.command,
|
|
175
|
+
instructions: [oauthNote],
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
return addMcpResult(input, [
|
|
179
|
+
`Or run: gemini mcp add --transport http --scope user kody ${input.mcpUrl}`,
|
|
180
|
+
oauthNote,
|
|
181
|
+
]);
|
|
182
|
+
}
|
|
183
|
+
case 'cursor': {
|
|
184
|
+
const written = writeMappedHost(input);
|
|
185
|
+
const url = buildCursorInstallUrl(input.mcpUrl);
|
|
186
|
+
const opened = written.status === 'wrote' ? await io.openUrl(url) : false;
|
|
187
|
+
return {
|
|
188
|
+
...written,
|
|
189
|
+
opened: opened ? url : undefined,
|
|
190
|
+
instructions: [
|
|
191
|
+
'Reload MCP servers in Cursor if the new server does not appear.',
|
|
192
|
+
oauthNote,
|
|
193
|
+
],
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
case 'vscode': {
|
|
197
|
+
const written = writeMappedHost(input);
|
|
198
|
+
const url = buildVsCodeInstallUrl(input.mcpUrl);
|
|
199
|
+
const opened = written.status === 'wrote' ? await io.openUrl(url) : false;
|
|
200
|
+
return {
|
|
201
|
+
...written,
|
|
202
|
+
opened: opened ? url : undefined,
|
|
203
|
+
instructions: [
|
|
204
|
+
'Use Agent mode in Copilot Chat after the server is added.',
|
|
205
|
+
oauthNote,
|
|
206
|
+
],
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
case 'vscode-insiders': {
|
|
210
|
+
const written = await writeLeftoverFile(input.id, input.mcpUrl, input.runtime);
|
|
211
|
+
const url = buildVsCodeInstallUrl(input.mcpUrl, 'vscode-insiders');
|
|
212
|
+
const opened = written?.changed ? await io.openUrl(url) : false;
|
|
213
|
+
return leftoverResult(host.label, input.id, written, [
|
|
214
|
+
'Use Agent mode in Copilot Chat after the server is added.',
|
|
215
|
+
oauthNote,
|
|
216
|
+
], opened ? url : undefined);
|
|
217
|
+
}
|
|
218
|
+
case 'goose': {
|
|
219
|
+
const written = writeMappedHost(input);
|
|
220
|
+
const url = buildGooseInstallUrl(input.mcpUrl);
|
|
221
|
+
const opened = written.status === 'wrote' ? await io.openUrl(url) : false;
|
|
222
|
+
return {
|
|
223
|
+
...written,
|
|
224
|
+
opened: opened ? url : undefined,
|
|
225
|
+
instructions: ['Restart Goose if the extension does not appear.', oauthNote],
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
case 'codex': {
|
|
229
|
+
const written = writeMappedHost(input);
|
|
230
|
+
if (written.status === 'wrote') {
|
|
231
|
+
await tryCommand(input.runtime, 'codex', ['mcp', 'login', 'kody']);
|
|
232
|
+
}
|
|
233
|
+
return {
|
|
234
|
+
...written,
|
|
235
|
+
instructions: ['If OAuth does not start, run: codex mcp login kody', oauthNote],
|
|
236
|
+
};
|
|
237
|
+
}
|
|
238
|
+
case 'opencode': {
|
|
239
|
+
const written = writeMappedHost(input);
|
|
240
|
+
if (written.status === 'wrote') {
|
|
241
|
+
await tryCommand(input.runtime, 'opencode', ['mcp', 'auth', 'kody']);
|
|
242
|
+
}
|
|
243
|
+
return {
|
|
244
|
+
...written,
|
|
245
|
+
instructions: ['If OAuth does not start, run: opencode mcp auth kody', oauthNote],
|
|
246
|
+
};
|
|
247
|
+
}
|
|
248
|
+
case 'windsurf':
|
|
249
|
+
case 'zed':
|
|
250
|
+
case 'antigravity':
|
|
251
|
+
case 'cline':
|
|
252
|
+
case 'cline-cli':
|
|
253
|
+
case 'grok-build':
|
|
254
|
+
case 'mcporter':
|
|
255
|
+
return addMcpResult(input, [
|
|
256
|
+
`Restart ${host.label} if the new server does not appear.`,
|
|
257
|
+
oauthNote,
|
|
258
|
+
]);
|
|
259
|
+
case 'qwen-code':
|
|
260
|
+
case 'amazon-q':
|
|
261
|
+
case 'visual-studio': {
|
|
262
|
+
const written = await writeLeftoverFile(input.id, input.mcpUrl, input.runtime);
|
|
263
|
+
return leftoverResult(host.label, input.id, written, [
|
|
264
|
+
`Restart ${host.label} if the new server does not appear.`,
|
|
265
|
+
oauthNote,
|
|
266
|
+
]);
|
|
267
|
+
}
|
|
268
|
+
default: {
|
|
269
|
+
const exhaustive = input.id;
|
|
270
|
+
throw new Error(`Unhandled host: ${String(exhaustive)}`);
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
function writeMappedHost(input) {
|
|
275
|
+
const host = hostById(input.id);
|
|
276
|
+
if (!isAddMcpHostId(input.id)) {
|
|
277
|
+
return {
|
|
278
|
+
id: input.id,
|
|
279
|
+
label: host.label,
|
|
280
|
+
status: 'manual',
|
|
281
|
+
instructions: [`${host.label} has no add-mcp writer.`],
|
|
282
|
+
};
|
|
283
|
+
}
|
|
284
|
+
const written = writeAddMcpHost(input.id, input.mcpUrl, input.runtime);
|
|
285
|
+
if (written.error) {
|
|
286
|
+
return {
|
|
287
|
+
id: input.id,
|
|
288
|
+
label: host.label,
|
|
289
|
+
status: 'manual',
|
|
290
|
+
instructions: [written.error, oauthNote],
|
|
291
|
+
};
|
|
292
|
+
}
|
|
293
|
+
return {
|
|
294
|
+
id: input.id,
|
|
295
|
+
label: host.label,
|
|
296
|
+
status: written.changed ? 'wrote' : 'unchanged',
|
|
297
|
+
path: written.path,
|
|
298
|
+
instructions: [],
|
|
299
|
+
};
|
|
300
|
+
}
|
|
301
|
+
function addMcpResult(input, instructions) {
|
|
302
|
+
return { ...writeMappedHost(input), instructions };
|
|
303
|
+
}
|
|
304
|
+
function leftoverResult(label, id, written, instructions, opened) {
|
|
305
|
+
if (!written) {
|
|
306
|
+
return {
|
|
307
|
+
id,
|
|
308
|
+
label,
|
|
309
|
+
status: 'manual',
|
|
310
|
+
instructions: [`${label} has no automatic config path for this scope.`, ...instructions],
|
|
311
|
+
};
|
|
312
|
+
}
|
|
313
|
+
return {
|
|
314
|
+
id,
|
|
315
|
+
label,
|
|
316
|
+
status: written.changed ? 'wrote' : 'unchanged',
|
|
317
|
+
path: written.path,
|
|
318
|
+
opened,
|
|
319
|
+
instructions,
|
|
320
|
+
};
|
|
321
|
+
}
|
|
322
|
+
//# sourceMappingURL=install-hosts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install-hosts.js","sourceRoot":"","sources":["../src/install-hosts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { type HostId } from './host-catalog.js';
|
|
2
|
+
import { type ApplyResult, type InstallRuntime } from './install-hosts.js';
|
|
3
|
+
import type { ProcessInfo } from './process-info.js';
|
|
4
|
+
export type InstallOptions = {
|
|
5
|
+
mcpUrl: string;
|
|
6
|
+
clients?: string;
|
|
7
|
+
yes?: boolean;
|
|
8
|
+
project?: boolean;
|
|
9
|
+
json?: boolean;
|
|
10
|
+
};
|
|
11
|
+
export type InstallIo = {
|
|
12
|
+
stdout?: (text: string) => void;
|
|
13
|
+
stderr?: (text: string) => void;
|
|
14
|
+
isTTY?: boolean;
|
|
15
|
+
home?: string;
|
|
16
|
+
cwd?: string;
|
|
17
|
+
listProcesses?: () => Promise<Array<ProcessInfo>>;
|
|
18
|
+
chooseHosts?: (hosts: Array<{
|
|
19
|
+
id: HostId;
|
|
20
|
+
label: string;
|
|
21
|
+
}>) => Promise<Array<HostId>>;
|
|
22
|
+
runtime?: Partial<InstallRuntime>;
|
|
23
|
+
};
|
|
24
|
+
export declare function runInstall(options: InstallOptions, io?: InstallIo): Promise<{
|
|
25
|
+
code: number;
|
|
26
|
+
results: Array<ApplyResult>;
|
|
27
|
+
}>;
|
|
28
|
+
export declare function noRunningAgentsMessage(mcpUrl: string): string;
|
|
29
|
+
export declare function formatInstallReport(input: {
|
|
30
|
+
mcpUrl: string;
|
|
31
|
+
results: Array<ApplyResult>;
|
|
32
|
+
}): string;
|
package/dist/install.js
ADDED
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { homedir } from 'node:os';
|
|
2
|
+
import checkbox from '@inquirer/checkbox';
|
|
3
|
+
import { detectRunningHosts, listRunningProcesses } from './detect-running-hosts.js';
|
|
4
|
+
import { hostById, parseHostIds } from './host-catalog.js';
|
|
5
|
+
import { applyHost } from './install-hosts.js';
|
|
6
|
+
import { buildOnboardingContinuationPrompt, webClientsOnboardingNote, } from './onboarding-prompt.js';
|
|
7
|
+
async function defaultChooseHosts(hosts) {
|
|
8
|
+
return await checkbox({
|
|
9
|
+
message: 'Configure Kody in these running agents',
|
|
10
|
+
choices: hosts.map((host) => ({
|
|
11
|
+
name: host.label,
|
|
12
|
+
value: host.id,
|
|
13
|
+
checked: true,
|
|
14
|
+
})),
|
|
15
|
+
required: false,
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
export async function runInstall(options, io = {}) {
|
|
19
|
+
const write = io.stdout ?? ((text) => process.stdout.write(text));
|
|
20
|
+
const mcpUrl = options.mcpUrl;
|
|
21
|
+
const home = io.home ?? homedir();
|
|
22
|
+
const cwd = io.cwd ?? process.cwd();
|
|
23
|
+
const isTTY = io.isTTY ?? Boolean(process.stdin.isTTY);
|
|
24
|
+
const listProcesses = io.listProcesses ?? listRunningProcesses;
|
|
25
|
+
const detected = detectRunningHosts(await listProcesses());
|
|
26
|
+
const requested = options.clients ? parseHostIds(options.clients) : null;
|
|
27
|
+
let selected;
|
|
28
|
+
if (requested) {
|
|
29
|
+
selected = requested;
|
|
30
|
+
}
|
|
31
|
+
else if (detected.length === 0) {
|
|
32
|
+
write(noRunningAgentsMessage(mcpUrl));
|
|
33
|
+
return { code: 1, results: [] };
|
|
34
|
+
}
|
|
35
|
+
else if (options.yes || (!isTTY && detected.length === 1)) {
|
|
36
|
+
selected = detected.map((host) => host.id);
|
|
37
|
+
}
|
|
38
|
+
else if (!isTTY && detected.length > 1) {
|
|
39
|
+
write([
|
|
40
|
+
'Multiple local agents are running. Re-run with --yes or --clients <ids>.',
|
|
41
|
+
`Detected: ${detected.map((host) => host.id).join(', ')}`,
|
|
42
|
+
'',
|
|
43
|
+
].join('\n'));
|
|
44
|
+
return { code: 1, results: [] };
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
const choose = io.chooseHosts ?? defaultChooseHosts;
|
|
48
|
+
selected = await choose(detected.map((host) => ({ id: host.id, label: host.label })));
|
|
49
|
+
if (selected.length === 0) {
|
|
50
|
+
write(`No clients selected.\n${webClientsOnboardingNote(mcpUrl)}\n`);
|
|
51
|
+
return { code: 1, results: [] };
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
const runtime = {
|
|
55
|
+
home,
|
|
56
|
+
cwd,
|
|
57
|
+
project: options.project === true,
|
|
58
|
+
...io.runtime,
|
|
59
|
+
};
|
|
60
|
+
const results = [];
|
|
61
|
+
for (const id of selected) {
|
|
62
|
+
results.push(await applyHost({ id, mcpUrl, runtime }));
|
|
63
|
+
}
|
|
64
|
+
if (options.json) {
|
|
65
|
+
write(`${JSON.stringify({ mcpUrl, results }, null, 2)}\n`);
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
write(formatInstallReport({ mcpUrl, results }));
|
|
69
|
+
}
|
|
70
|
+
return { code: 0, results };
|
|
71
|
+
}
|
|
72
|
+
export function noRunningAgentsMessage(mcpUrl) {
|
|
73
|
+
return [
|
|
74
|
+
'No local MCP agents are running.',
|
|
75
|
+
'Start Cursor, Claude Desktop, VS Code, Goose, or another local client, then run kody install again.',
|
|
76
|
+
'Or pass --clients cursor,vscode to configure a client that is not running.',
|
|
77
|
+
webClientsOnboardingNote(mcpUrl),
|
|
78
|
+
'',
|
|
79
|
+
].join('\n');
|
|
80
|
+
}
|
|
81
|
+
export function formatInstallReport(input) {
|
|
82
|
+
const lines = [];
|
|
83
|
+
for (const result of input.results) {
|
|
84
|
+
const host = hostById(result.id);
|
|
85
|
+
const headline = statusHeadline(result);
|
|
86
|
+
lines.push(`${host.label}: ${headline}`);
|
|
87
|
+
if (result.path)
|
|
88
|
+
lines.push(` ${result.path}`);
|
|
89
|
+
if (result.command)
|
|
90
|
+
lines.push(` ${result.command}`);
|
|
91
|
+
for (const instruction of result.instructions) {
|
|
92
|
+
lines.push(` ${instruction}`);
|
|
93
|
+
}
|
|
94
|
+
lines.push('');
|
|
95
|
+
}
|
|
96
|
+
lines.push('Paste this into your agent to continue onboarding:');
|
|
97
|
+
lines.push('');
|
|
98
|
+
lines.push(buildOnboardingContinuationPrompt());
|
|
99
|
+
lines.push('');
|
|
100
|
+
lines.push(webClientsOnboardingNote(input.mcpUrl));
|
|
101
|
+
lines.push('');
|
|
102
|
+
return lines.join('\n');
|
|
103
|
+
}
|
|
104
|
+
function statusHeadline(result) {
|
|
105
|
+
switch (result.status) {
|
|
106
|
+
case 'wrote':
|
|
107
|
+
return 'configured';
|
|
108
|
+
case 'unchanged':
|
|
109
|
+
return 'already configured';
|
|
110
|
+
case 'command':
|
|
111
|
+
return 'added via CLI';
|
|
112
|
+
case 'manual':
|
|
113
|
+
return 'needs a manual step';
|
|
114
|
+
default: {
|
|
115
|
+
const exhaustive = result.status;
|
|
116
|
+
return exhaustive;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=install.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install.js","sourceRoot":"","sources":["../src/install.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AACjC,OAAO,QAAQ,MAAM,oBAAoB,CAAA;AACzC,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAA;AACpF,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAe,MAAM,mBAAmB,CAAA;AACvE,OAAO,EAAE,SAAS,EAAyC,MAAM,oBAAoB,CAAA;AACrF,OAAO,EACN,iCAAiC,EACjC,wBAAwB,GACxB,MAAM,wBAAwB,CAAA;AAsB/B,KAAK,UAAU,kBAAkB,CAChC,KAA2C;IAE3C,OAAO,MAAM,QAAQ,CAAC;QACrB,OAAO,EAAE,wCAAwC;QACjD,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YAC7B,IAAI,EAAE,IAAI,CAAC,KAAK;YAChB,KAAK,EAAE,IAAI,CAAC,EAAE;YACd,OAAO,EAAE,IAAI;SACb,CAAC,CAAC;QACH,QAAQ,EAAE,KAAK;KACf,CAAC,CAAA;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAC/B,OAAuB,EACvB,KAAgB,EAAE;IAElB,MAAM,KAAK,GAAG,EAAE,CAAC,MAAM,IAAI,CAAC,CAAC,IAAY,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAA;IACzE,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAA;IAC7B,MAAM,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,OAAO,EAAE,CAAA;IACjC,MAAM,GAAG,GAAG,EAAE,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAA;IACnC,MAAM,KAAK,GAAG,EAAE,CAAC,KAAK,IAAI,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;IACtD,MAAM,aAAa,GAAG,EAAE,CAAC,aAAa,IAAI,oBAAoB,CAAA;IAC9D,MAAM,QAAQ,GAAG,kBAAkB,CAAC,MAAM,aAAa,EAAE,CAAC,CAAA;IAC1D,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IAExE,IAAI,QAAuB,CAAA;IAC3B,IAAI,SAAS,EAAE,CAAC;QACf,QAAQ,GAAG,SAAS,CAAA;IACrB,CAAC;SAAM,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAClC,KAAK,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAC,CAAA;QACrC,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAA;IAChC,CAAC;SAAM,IAAI,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC,KAAK,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC,EAAE,CAAC;QAC7D,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAC3C,CAAC;SAAM,IAAI,CAAC,KAAK,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1C,KAAK,CACJ;YACC,0EAA0E;YAC1E,aAAa,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;YACzD,EAAE;SACF,CAAC,IAAI,CAAC,IAAI,CAAC,CACZ,CAAA;QACD,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAA;IAChC,CAAC;SAAM,CAAC;QACP,MAAM,MAAM,GAAG,EAAE,CAAC,WAAW,IAAI,kBAAkB,CAAA;QACnD,QAAQ,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAA;QACrF,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,KAAK,CAAC,yBAAyB,wBAAwB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;YACpE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAA;QAChC,CAAC;IACF,CAAC;IAED,MAAM,OAAO,GAAmB;QAC/B,IAAI;QACJ,GAAG;QACH,OAAO,EAAE,OAAO,CAAC,OAAO,KAAK,IAAI;QACjC,GAAG,EAAE,CAAC,OAAO;KACb,CAAA;IACD,MAAM,OAAO,GAAuB,EAAE,CAAA;IACtC,KAAK,MAAM,EAAE,IAAI,QAAQ,EAAE,CAAC;QAC3B,OAAO,CAAC,IAAI,CAAC,MAAM,SAAS,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,CAAA;IACvD,CAAC;IAED,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QAClB,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAA;IAC3D,CAAC;SAAM,CAAC;QACP,KAAK,CAAC,mBAAmB,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,CAAA;IAChD,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,CAAA;AAC5B,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,MAAc;IACpD,OAAO;QACN,kCAAkC;QAClC,qGAAqG;QACrG,4EAA4E;QAC5E,wBAAwB,CAAC,MAAM,CAAC;QAChC,EAAE;KACF,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACb,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,KAGnC;IACA,MAAM,KAAK,GAAkB,EAAE,CAAA;IAC/B,KAAK,MAAM,MAAM,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QACpC,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;QAChC,MAAM,QAAQ,GAAG,cAAc,CAAC,MAAM,CAAC,CAAA;QACvC,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC,CAAA;QACxC,IAAI,MAAM,CAAC,IAAI;YAAE,KAAK,CAAC,IAAI,CAAC,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC,CAAA;QAC/C,IAAI,MAAM,CAAC,OAAO;YAAE,KAAK,CAAC,IAAI,CAAC,KAAK,MAAM,CAAC,OAAO,EAAE,CAAC,CAAA;QACrD,KAAK,MAAM,WAAW,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;YAC/C,KAAK,CAAC,IAAI,CAAC,KAAK,WAAW,EAAE,CAAC,CAAA;QAC/B,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACf,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,oDAAoD,CAAC,CAAA;IAChE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACd,KAAK,CAAC,IAAI,CAAC,iCAAiC,EAAE,CAAC,CAAA;IAC/C,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACd,KAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAA;IAClD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACd,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACxB,CAAC;AAED,SAAS,cAAc,CAAC,MAAmB;IAC1C,QAAQ,MAAM,CAAC,MAAM,EAAE,CAAC;QACvB,KAAK,OAAO;YACX,OAAO,YAAY,CAAA;QACpB,KAAK,WAAW;YACf,OAAO,oBAAoB,CAAA;QAC5B,KAAK,SAAS;YACb,OAAO,eAAe,CAAA;QACvB,KAAK,QAAQ;YACZ,OAAO,qBAAqB,CAAA;QAC7B,OAAO,CAAC,CAAC,CAAC;YACT,MAAM,UAAU,GAAU,MAAM,CAAC,MAAM,CAAA;YACvC,OAAO,UAAU,CAAA;QAClB,CAAC;IACF,CAAC;AACF,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { onboardingUrl } from './defaults.js';
|
|
2
|
+
export function buildOnboardingContinuationPrompt() {
|
|
3
|
+
return [
|
|
4
|
+
'Kody is connected as an MCP server in this agent.',
|
|
5
|
+
'Help me get started with Kody.',
|
|
6
|
+
'First, briefly explain what Kody can do for me in plain language.',
|
|
7
|
+
'Then help me connect one integration I care about: check coding_guide_get for a matching provider guide (for example provider_github or provider_google) and follow it; otherwise use search and the official guides to find the right setup steps, walk me through the connect or secrets flow, and verify the connection with a small ad hoc execute smoke test.',
|
|
8
|
+
'Do not create any packages until the integration works — start with ad hoc execute calls.',
|
|
9
|
+
'Once the integration works, check community_search for a trusted community package that is close to what I want, fork or adapt it (community_fork, or point me at one-click install on /onboarding or the listing detail), and only create a new package if nothing suitable exists.',
|
|
10
|
+
].join(' ');
|
|
11
|
+
}
|
|
12
|
+
export function webClientsOnboardingNote(mcpUrl) {
|
|
13
|
+
return `For web-based clients (ChatGPT, Claude.ai, Grok), see ${onboardingUrl(mcpUrl)}`;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=onboarding-prompt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"onboarding-prompt.js","sourceRoot":"","sources":["../src/onboarding-prompt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAE7C,MAAM,UAAU,iCAAiC;IAChD,OAAO;QACN,mDAAmD;QACnD,gCAAgC;QAChC,mEAAmE;QACnE,oWAAoW;QACpW,2FAA2F;QAC3F,sRAAsR;KACtR,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AACZ,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,MAAc;IACtD,OAAO,yDAAyD,aAAa,CAAC,MAAM,CAAC,EAAE,CAAA;AACxF,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export type ProcessInfo = {
|
|
2
|
+
name: string;
|
|
3
|
+
cmd?: string;
|
|
4
|
+
};
|
|
5
|
+
export declare function processHaystack(process: ProcessInfo): string;
|
|
6
|
+
export declare function processBaseName(process: ProcessInfo): string;
|
|
7
|
+
export declare function nameEquals(process: ProcessInfo, ...names: Array<string>): boolean;
|
|
8
|
+
export declare function haystackMatches(process: ProcessInfo, pattern: RegExp): boolean;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export function processHaystack(process) {
|
|
2
|
+
return `${process.name} ${process.cmd ?? ''}`;
|
|
3
|
+
}
|
|
4
|
+
export function processBaseName(process) {
|
|
5
|
+
return process.name.replace(/\.exe$/iu, '').trim().toLowerCase();
|
|
6
|
+
}
|
|
7
|
+
export function nameEquals(process, ...names) {
|
|
8
|
+
const base = processBaseName(process);
|
|
9
|
+
return names.some((name) => base === name.toLowerCase());
|
|
10
|
+
}
|
|
11
|
+
export function haystackMatches(process, pattern) {
|
|
12
|
+
return pattern.test(processHaystack(process));
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=process-info.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process-info.js","sourceRoot":"","sources":["../src/process-info.ts"],"names":[],"mappings":"AAKA,MAAM,UAAU,eAAe,CAAC,OAAoB;IACnD,OAAO,GAAG,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,IAAI,EAAE,EAAE,CAAA;AAC9C,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,OAAoB;IACnD,OAAO,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;AACjE,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,OAAoB,EAAE,GAAG,KAAoB;IACvE,MAAM,IAAI,GAAG,eAAe,CAAC,OAAO,CAAC,CAAA;IACrC,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,IAAI,CAAC,WAAW,EAAE,CAAC,CAAA;AACzD,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,OAAoB,EAAE,OAAe;IACpE,OAAO,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAA;AAC9C,CAAC"}
|
package/dist/which.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function which(command: string, env?: NodeJS.ProcessEnv): string | undefined;
|
package/dist/which.js
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { accessSync, constants } from 'node:fs';
|
|
2
|
+
import { delimiter, join } from 'node:path';
|
|
3
|
+
export function which(command, env = process.env) {
|
|
4
|
+
const pathValue = env.PATH ?? env.Path;
|
|
5
|
+
if (!pathValue)
|
|
6
|
+
return undefined;
|
|
7
|
+
const extensions = process.platform === 'win32' ? (env.PATHEXT ?? '.EXE;.CMD;.BAT;.COM').split(';') : [''];
|
|
8
|
+
for (const directory of pathValue.split(delimiter)) {
|
|
9
|
+
for (const extension of extensions) {
|
|
10
|
+
const candidate = join(directory, `${command}${extension}`);
|
|
11
|
+
try {
|
|
12
|
+
accessSync(candidate, constants.X_OK);
|
|
13
|
+
return candidate;
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
// keep looking
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
return undefined;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=which.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"which.js","sourceRoot":"","sources":["../src/which.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAC/C,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAE3C,MAAM,UAAU,KAAK,CAAC,OAAe,EAAE,MAAyB,OAAO,CAAC,GAAG;IAC1E,MAAM,SAAS,GAAG,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,CAAA;IACtC,IAAI,CAAC,SAAS;QAAE,OAAO,SAAS,CAAA;IAChC,MAAM,UAAU,GACf,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,IAAI,qBAAqB,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;IACxF,KAAK,MAAM,SAAS,IAAI,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;QACpD,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;YACpC,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE,GAAG,OAAO,GAAG,SAAS,EAAE,CAAC,CAAA;YAC3D,IAAI,CAAC;gBACJ,UAAU,CAAC,SAAS,EAAE,SAAS,CAAC,IAAI,CAAC,CAAA;gBACrC,OAAO,SAAS,CAAA;YACjB,CAAC;YAAC,MAAM,CAAC;gBACR,eAAe;YAChB,CAAC;QACF,CAAC;IACF,CAAC;IACD,OAAO,SAAS,CAAA;AACjB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kodycodes/cli",
|
|
3
|
-
"version": "1.0
|
|
3
|
+
"version": "1.1.0",
|
|
4
4
|
"description": "Official Kody MCP client CLI: login, secure token storage, search, and execute.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -47,8 +47,11 @@
|
|
|
47
47
|
"access": "public"
|
|
48
48
|
},
|
|
49
49
|
"dependencies": {
|
|
50
|
+
"@inquirer/checkbox": "^5.2.2",
|
|
50
51
|
"@modelcontextprotocol/client": "2.0.0",
|
|
51
|
-
"@napi-rs/keyring": "^1.3.0"
|
|
52
|
+
"@napi-rs/keyring": "^1.3.0",
|
|
53
|
+
"add-mcp": "^2.0.0",
|
|
54
|
+
"ps-list": "^9.0.0"
|
|
52
55
|
},
|
|
53
56
|
"devDependencies": {
|
|
54
57
|
"@types/node": "^24.5.2",
|
package/skills/kody/SKILL.md
CHANGED
|
@@ -25,6 +25,16 @@ Then install this skill into the current host if it is not already present:
|
|
|
25
25
|
npx @kodycodes/cli skill install
|
|
26
26
|
```
|
|
27
27
|
|
|
28
|
+
To add Kody as a remote MCP server in running local agents:
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
npx @kodycodes/cli install
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
That command only lists local clients that are currently running. For web-based
|
|
35
|
+
clients (ChatGPT, Claude.ai, Grok), point the user at
|
|
36
|
+
https://kody.codes/onboarding.
|
|
37
|
+
|
|
28
38
|
## Login
|
|
29
39
|
|
|
30
40
|
```bash
|