@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.
- package/README.md +16 -3
- 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/auth.d.ts +1 -1
- package/dist/auth.js +91 -89
- package/dist/auth.js.map +1 -1
- package/dist/cli.d.ts +3 -1
- package/dist/cli.js +17 -2
- package/dist/cli.js.map +1 -1
- package/dist/defaults.d.ts +10 -0
- package/dist/defaults.js +16 -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/mcp.js +6 -7
- package/dist/mcp.js.map +1 -1
- package/dist/oauth-provider.d.ts +12 -0
- package/dist/oauth-provider.js +89 -0
- package/dist/oauth-provider.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 +6 -3
- package/skills/kody/SKILL.md +11 -1
package/README.md
CHANGED
|
@@ -2,9 +2,11 @@
|
|
|
2
2
|
|
|
3
3
|
Turn one-off agent work into something you can rerun: a local MCP client for
|
|
4
4
|
[Kody](https://kody.codes) with login, OS keychain token storage, `search`, and
|
|
5
|
-
`execute`.
|
|
5
|
+
`execute`. Talks MCP `2026-07-28` (Kody's stateless `/mcp` lane) and logs in
|
|
6
|
+
with Client ID Metadata Documents (SEP-991).
|
|
6
7
|
|
|
7
8
|
```bash
|
|
9
|
+
npx @kodycodes/cli install
|
|
8
10
|
npx @kodycodes/cli login
|
|
9
11
|
npx @kodycodes/cli search "what can you do"
|
|
10
12
|
npx @kodycodes/cli skill install
|
|
@@ -25,7 +27,8 @@ Or run via `npx @kodycodes/cli` without a global install.
|
|
|
25
27
|
|
|
26
28
|
| Command | Purpose |
|
|
27
29
|
| --- | --- |
|
|
28
|
-
| `kody
|
|
30
|
+
| `kody install` | Detect running local MCP clients, write their config, and start host OAuth. |
|
|
31
|
+
| `kody login` | Browser OAuth (CIMD + PKCE). Stores access and refresh tokens. |
|
|
29
32
|
| `kody logout` | Deletes stored credentials. |
|
|
30
33
|
| `kody status` | Shows login state without printing secrets. |
|
|
31
34
|
| `kody whoami` | Confirms the MCP connection and lists tools. |
|
|
@@ -33,6 +36,16 @@ Or run via `npx @kodycodes/cli` without a global install.
|
|
|
33
36
|
| `kody execute` | Calls Kody `execute` (`--code`, `--file`, or stdin via `--file -`). |
|
|
34
37
|
| `kody skill install` | Copies the getting-started skill into Claude Code / Cursor / Agents. |
|
|
35
38
|
|
|
39
|
+
`kody install` lists **running local** agents (Cursor, Claude Desktop, VS Code,
|
|
40
|
+
Goose, Claude Code, Codex, Windsurf, Zed, and similar) and writes each host's
|
|
41
|
+
remote MCP entry for `https://kody.codes/mcp`. Common host formats go through
|
|
42
|
+
[`add-mcp`](https://www.npmjs.com/package/add-mcp). It does not list web clients.
|
|
43
|
+
For ChatGPT, Claude.ai, and Grok, use [kody.codes/onboarding](https://kody.codes/onboarding).
|
|
44
|
+
|
|
45
|
+
After install, the CLI prints a prompt you can paste into the configured agent
|
|
46
|
+
to continue onboarding. Host OAuth stays in that client — `kody login` is only
|
|
47
|
+
for the CLI itself.
|
|
48
|
+
|
|
36
49
|
`--mcp-url` or `KODY_MCP_URL` overrides the default `https://kody.codes/mcp`.
|
|
37
50
|
`--json` prints structured MCP results.
|
|
38
51
|
|
|
@@ -45,7 +58,7 @@ Credentials are stored in the OS secret store:
|
|
|
45
58
|
- Linux: Secret Service / libsecret
|
|
46
59
|
|
|
47
60
|
If the keychain is unavailable (common on headless Linux), the CLI writes a
|
|
48
|
-
`0600` file under `$XDG_CONFIG_HOME/kody` (or `%APPDATA
|
|
61
|
+
`0600` file under `$XDG_CONFIG_HOME/kody` (or `%APPDATA%\kody` on Windows,
|
|
49
62
|
`~/Library/Application Support/kody` on macOS). Tokens are never printed.
|
|
50
63
|
|
|
51
64
|
Access tokens refresh automatically on expiry or HTTP 401.
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { type AgentType, type InstallResult, type McpServerConfig } from 'add-mcp';
|
|
2
|
+
import type { HostId } from './host-catalog.js';
|
|
3
|
+
/**
|
|
4
|
+
* Hosts whose on-disk MCP config `add-mcp` already knows how to merge.
|
|
5
|
+
* Claude Desktop is intentionally omitted: remote MCP lives in Connectors, not
|
|
6
|
+
* `claude_desktop_config.json`.
|
|
7
|
+
*/
|
|
8
|
+
export declare const addMcpAgentByHostId: {
|
|
9
|
+
readonly antigravity: "antigravity";
|
|
10
|
+
readonly cline: "cline";
|
|
11
|
+
readonly 'cline-cli': "cline-cli";
|
|
12
|
+
readonly 'claude-code': "claude-code";
|
|
13
|
+
readonly codex: "codex";
|
|
14
|
+
readonly cursor: "cursor";
|
|
15
|
+
readonly 'gemini-cli': "gemini-cli";
|
|
16
|
+
readonly goose: "goose";
|
|
17
|
+
readonly 'copilot-cli': "github-copilot-cli";
|
|
18
|
+
readonly 'grok-build': "grok-build";
|
|
19
|
+
readonly mcporter: "mcporter";
|
|
20
|
+
readonly opencode: "opencode";
|
|
21
|
+
readonly vscode: "vscode";
|
|
22
|
+
readonly windsurf: "windsurf";
|
|
23
|
+
readonly zed: "zed";
|
|
24
|
+
};
|
|
25
|
+
export type AddMcpHostId = keyof typeof addMcpAgentByHostId;
|
|
26
|
+
export type UpsertServerFn = (agentType: AgentType, serverName: string, serverConfig: McpServerConfig, options?: {
|
|
27
|
+
local?: boolean;
|
|
28
|
+
cwd?: string;
|
|
29
|
+
}) => InstallResult;
|
|
30
|
+
export declare function isAddMcpHostId(id: HostId): id is AddMcpHostId;
|
|
31
|
+
export declare function addMcpUsesProjectScope(id: AddMcpHostId, project: boolean): boolean;
|
|
32
|
+
export declare function kodyRemoteConfig(mcpUrl: string): McpServerConfig;
|
|
33
|
+
export declare function defaultUpsertServer(agentType: AgentType, serverName: string, serverConfig: McpServerConfig, options?: {
|
|
34
|
+
local?: boolean;
|
|
35
|
+
cwd?: string;
|
|
36
|
+
}): InstallResult;
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { upsertServer, } from 'add-mcp';
|
|
2
|
+
/**
|
|
3
|
+
* Hosts whose on-disk MCP config `add-mcp` already knows how to merge.
|
|
4
|
+
* Claude Desktop is intentionally omitted: remote MCP lives in Connectors, not
|
|
5
|
+
* `claude_desktop_config.json`.
|
|
6
|
+
*/
|
|
7
|
+
export const addMcpAgentByHostId = {
|
|
8
|
+
antigravity: 'antigravity',
|
|
9
|
+
cline: 'cline',
|
|
10
|
+
'cline-cli': 'cline-cli',
|
|
11
|
+
'claude-code': 'claude-code',
|
|
12
|
+
codex: 'codex',
|
|
13
|
+
cursor: 'cursor',
|
|
14
|
+
'gemini-cli': 'gemini-cli',
|
|
15
|
+
goose: 'goose',
|
|
16
|
+
'copilot-cli': 'github-copilot-cli',
|
|
17
|
+
'grok-build': 'grok-build',
|
|
18
|
+
mcporter: 'mcporter',
|
|
19
|
+
opencode: 'opencode',
|
|
20
|
+
vscode: 'vscode',
|
|
21
|
+
windsurf: 'windsurf',
|
|
22
|
+
zed: 'zed',
|
|
23
|
+
};
|
|
24
|
+
const addMcpProjectHosts = new Set([
|
|
25
|
+
'claude-code',
|
|
26
|
+
'codex',
|
|
27
|
+
'cursor',
|
|
28
|
+
'gemini-cli',
|
|
29
|
+
'copilot-cli',
|
|
30
|
+
'grok-build',
|
|
31
|
+
'mcporter',
|
|
32
|
+
'opencode',
|
|
33
|
+
'vscode',
|
|
34
|
+
'zed',
|
|
35
|
+
]);
|
|
36
|
+
export function isAddMcpHostId(id) {
|
|
37
|
+
return Object.hasOwn(addMcpAgentByHostId, id);
|
|
38
|
+
}
|
|
39
|
+
export function addMcpUsesProjectScope(id, project) {
|
|
40
|
+
return project && addMcpProjectHosts.has(id);
|
|
41
|
+
}
|
|
42
|
+
export function kodyRemoteConfig(mcpUrl) {
|
|
43
|
+
return { type: 'http', url: mcpUrl };
|
|
44
|
+
}
|
|
45
|
+
export function defaultUpsertServer(agentType, serverName, serverConfig, options) {
|
|
46
|
+
return upsertServer(agentType, serverName, serverConfig, options);
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=add-mcp-install.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"add-mcp-install.js","sourceRoot":"","sources":["../src/add-mcp-install.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,YAAY,GAIZ,MAAM,SAAS,CAAA;AAGhB;;;;GAIG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG;IAClC,WAAW,EAAE,aAAa;IAC1B,KAAK,EAAE,OAAO;IACd,WAAW,EAAE,WAAW;IACxB,aAAa,EAAE,aAAa;IAC5B,KAAK,EAAE,OAAO;IACd,MAAM,EAAE,QAAQ;IAChB,YAAY,EAAE,YAAY;IAC1B,KAAK,EAAE,OAAO;IACd,aAAa,EAAE,oBAAoB;IACnC,YAAY,EAAE,YAAY;IAC1B,QAAQ,EAAE,UAAU;IACpB,QAAQ,EAAE,UAAU;IACpB,MAAM,EAAE,QAAQ;IAChB,QAAQ,EAAE,UAAU;IACpB,GAAG,EAAE,KAAK;CAC4C,CAAA;AAIvD,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAe;IAChD,aAAa;IACb,OAAO;IACP,QAAQ;IACR,YAAY;IACZ,aAAa;IACb,YAAY;IACZ,UAAU;IACV,UAAU;IACV,QAAQ;IACR,KAAK;CACL,CAAC,CAAA;AASF,MAAM,UAAU,cAAc,CAAC,EAAU;IACxC,OAAO,MAAM,CAAC,MAAM,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAA;AAC9C,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,EAAgB,EAAE,OAAgB;IACxE,OAAO,OAAO,IAAI,kBAAkB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;AAC7C,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,MAAc;IAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,CAAA;AACrC,CAAC;AAED,MAAM,UAAU,mBAAmB,CAClC,SAAoB,EACpB,UAAkB,EAClB,YAA6B,EAC7B,OAA2C;IAE3C,OAAO,YAAY,CAAC,SAAS,EAAE,UAAU,EAAE,YAAY,EAAE,OAAO,CAAC,CAAA;AAClE,CAAC"}
|
package/dist/auth.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type OAuthClientInformationMixed, type OAuthTokens } from '@modelcontextprotocol/client';
|
|
2
2
|
import { type SecretBackend, type StoredCredentials } from './store.js';
|
|
3
3
|
export type LoginOptions = {
|
|
4
4
|
mcpUrl?: string;
|
package/dist/auth.js
CHANGED
|
@@ -1,17 +1,9 @@
|
|
|
1
1
|
import { createServer, } from 'node:http';
|
|
2
|
-
import {
|
|
3
|
-
import { accessTokenSkewMs, defaultMcpUrl, defaultScopes, loginTimeoutMs, } from './defaults.js';
|
|
4
|
-
import {
|
|
2
|
+
import { auth, } from '@modelcontextprotocol/client';
|
|
3
|
+
import { accessTokenSkewMs, cliRedirectUrl, defaultMcpUrl, defaultScopes, loginTimeoutMs, } from './defaults.js';
|
|
4
|
+
import { createCliOAuthProvider } from './oauth-provider.js';
|
|
5
5
|
import { redactError } from './redact.js';
|
|
6
6
|
import { loadCredentials, saveCredentials, } from './store.js';
|
|
7
|
-
function clientInformationFrom(credentials) {
|
|
8
|
-
return {
|
|
9
|
-
client_id: credentials.clientId,
|
|
10
|
-
...(credentials.clientSecret
|
|
11
|
-
? { client_secret: credentials.clientSecret }
|
|
12
|
-
: {}),
|
|
13
|
-
};
|
|
14
|
-
}
|
|
15
7
|
export function isAccessTokenExpired(credentials, now = Date.now()) {
|
|
16
8
|
if (!credentials.expiresAt)
|
|
17
9
|
return false;
|
|
@@ -38,31 +30,54 @@ export function credentialsFromTokens(input) {
|
|
|
38
30
|
scope: input.tokens.scope ?? input.previous?.scope,
|
|
39
31
|
};
|
|
40
32
|
}
|
|
33
|
+
async function persistAuthorizedSession(input) {
|
|
34
|
+
const tokens = await input.provider.tokens();
|
|
35
|
+
const client = await input.provider.clientInformation();
|
|
36
|
+
if (!tokens || !client) {
|
|
37
|
+
throw new Error('OAuth completed without tokens. Run `kody login`.');
|
|
38
|
+
}
|
|
39
|
+
const credentials = credentialsFromTokens({
|
|
40
|
+
mcpUrl: input.mcpUrl,
|
|
41
|
+
resource: input.mcpUrl,
|
|
42
|
+
authorizationServerUrl: tokens.issuer ??
|
|
43
|
+
input.previous?.authorizationServerUrl ??
|
|
44
|
+
new URL(input.mcpUrl).origin,
|
|
45
|
+
client,
|
|
46
|
+
tokens,
|
|
47
|
+
previous: input.previous,
|
|
48
|
+
now: input.now,
|
|
49
|
+
});
|
|
50
|
+
const saved = saveCredentials(credentials, input.backend);
|
|
51
|
+
return { credentials, saved };
|
|
52
|
+
}
|
|
41
53
|
export async function refreshStoredCredentials(input) {
|
|
42
54
|
const { credentials } = input;
|
|
43
55
|
if (!credentials.refreshToken) {
|
|
44
56
|
throw new Error('No refresh token is stored. Run `kody login`.');
|
|
45
57
|
}
|
|
46
|
-
const
|
|
47
|
-
|
|
58
|
+
const provider = createCliOAuthProvider({
|
|
59
|
+
mcpUrl: credentials.mcpUrl,
|
|
60
|
+
redirectUri: cliRedirectUrl(),
|
|
61
|
+
existing: credentials,
|
|
62
|
+
loadStoredTokens: true,
|
|
63
|
+
openBrowser: false,
|
|
64
|
+
expectedState: crypto.randomUUID(),
|
|
48
65
|
});
|
|
49
|
-
const
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
refreshToken: credentials.refreshToken,
|
|
53
|
-
resource: new URL(credentials.resource),
|
|
66
|
+
const result = await auth(provider, {
|
|
67
|
+
serverUrl: credentials.mcpUrl,
|
|
68
|
+
scope: defaultScopes.join(' '),
|
|
54
69
|
fetchFn: input.fetchFn,
|
|
55
70
|
});
|
|
56
|
-
|
|
71
|
+
if (result !== 'AUTHORIZED') {
|
|
72
|
+
throw new Error('Token refresh requires a new `kody login`.');
|
|
73
|
+
}
|
|
74
|
+
const { credentials: next } = await persistAuthorizedSession({
|
|
57
75
|
mcpUrl: credentials.mcpUrl,
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
client: clientInformationFrom(credentials),
|
|
61
|
-
tokens,
|
|
76
|
+
provider,
|
|
77
|
+
backend: input.backend,
|
|
62
78
|
previous: credentials,
|
|
63
79
|
now: input.now,
|
|
64
80
|
});
|
|
65
|
-
saveCredentials(next, input.backend);
|
|
66
81
|
return next;
|
|
67
82
|
}
|
|
68
83
|
export async function ensureFreshCredentials(input) {
|
|
@@ -81,33 +96,29 @@ export async function ensureFreshCredentials(input) {
|
|
|
81
96
|
fetchFn: input.fetchFn,
|
|
82
97
|
});
|
|
83
98
|
}
|
|
84
|
-
function startCallbackServer() {
|
|
99
|
+
function startCallbackServer(redirectUri) {
|
|
85
100
|
return new Promise((resolve, reject) => {
|
|
86
101
|
const server = createServer();
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
reject(new Error(
|
|
102
|
+
const port = Number(redirectUri.port);
|
|
103
|
+
server.listen(port, redirectUri.hostname, () => resolve(server));
|
|
104
|
+
server.on('error', (error) => {
|
|
105
|
+
if ('code' in error && error.code === 'EADDRINUSE') {
|
|
106
|
+
reject(new Error(`Login callback port ${port} is in use. Stop the other listener and retry.`));
|
|
92
107
|
return;
|
|
93
108
|
}
|
|
94
|
-
|
|
95
|
-
server,
|
|
96
|
-
redirectUri: new URL(`http://127.0.0.1:${address.port}/callback`),
|
|
97
|
-
});
|
|
109
|
+
reject(error);
|
|
98
110
|
});
|
|
99
|
-
server.on('error', reject);
|
|
100
111
|
});
|
|
101
112
|
}
|
|
102
113
|
function waitForCallback(input) {
|
|
103
114
|
return new Promise((resolve, reject) => {
|
|
104
|
-
const finish = (error,
|
|
115
|
+
const finish = (error, result) => {
|
|
105
116
|
clearTimeout(timer);
|
|
106
117
|
input.server.close();
|
|
107
118
|
if (error)
|
|
108
119
|
reject(error);
|
|
109
120
|
else
|
|
110
|
-
resolve(
|
|
121
|
+
resolve(result ?? { code: '' });
|
|
111
122
|
};
|
|
112
123
|
const timer = setTimeout(() => {
|
|
113
124
|
finish(new Error('Timed out waiting for the browser login.'));
|
|
@@ -130,6 +141,7 @@ function waitForCallback(input) {
|
|
|
130
141
|
}
|
|
131
142
|
const state = url.searchParams.get('state');
|
|
132
143
|
const code = url.searchParams.get('code');
|
|
144
|
+
const iss = url.searchParams.get('iss') ?? undefined;
|
|
133
145
|
if (state !== input.expectedState || !code) {
|
|
134
146
|
response
|
|
135
147
|
.writeHead(400, { 'Content-Type': 'text/html' })
|
|
@@ -140,7 +152,7 @@ function waitForCallback(input) {
|
|
|
140
152
|
response
|
|
141
153
|
.writeHead(200, { 'Content-Type': 'text/html' })
|
|
142
154
|
.end('<p>Kody CLI is signed in. You can close this window.</p>');
|
|
143
|
-
finish(null, code);
|
|
155
|
+
finish(null, { code, ...(iss ? { iss } : {}) });
|
|
144
156
|
}
|
|
145
157
|
catch (error) {
|
|
146
158
|
finish(redactError(error));
|
|
@@ -150,64 +162,54 @@ function waitForCallback(input) {
|
|
|
150
162
|
}
|
|
151
163
|
export async function login(options = {}) {
|
|
152
164
|
const mcpUrl = options.mcpUrl ?? defaultMcpUrl;
|
|
153
|
-
const
|
|
154
|
-
const
|
|
155
|
-
const
|
|
156
|
-
|
|
157
|
-
const
|
|
165
|
+
const redirectUri = cliRedirectUrl();
|
|
166
|
+
const expectedState = crypto.randomUUID();
|
|
167
|
+
const server = await startCallbackServer(redirectUri);
|
|
168
|
+
let authorizationUrl = redirectUri;
|
|
169
|
+
const provider = createCliOAuthProvider({
|
|
170
|
+
mcpUrl,
|
|
171
|
+
redirectUri,
|
|
172
|
+
loadStoredTokens: false,
|
|
173
|
+
openBrowser: options.openBrowser !== false,
|
|
174
|
+
expectedState,
|
|
175
|
+
onAuthorizationUrl: (url) => {
|
|
176
|
+
authorizationUrl = url;
|
|
177
|
+
options.onAuthorizationUrl?.(url);
|
|
178
|
+
},
|
|
179
|
+
});
|
|
158
180
|
try {
|
|
159
|
-
const
|
|
160
|
-
|
|
161
|
-
metadata,
|
|
162
|
-
clientMetadata: {
|
|
163
|
-
redirect_uris: [redirectUri.href],
|
|
164
|
-
client_name: 'Kody CLI',
|
|
165
|
-
client_uri: 'https://github.com/kody-bot/cli',
|
|
166
|
-
grant_types: ['authorization_code', 'refresh_token'],
|
|
167
|
-
response_types: ['code'],
|
|
168
|
-
token_endpoint_auth_method: 'none',
|
|
169
|
-
scope: defaultScopes.join(' '),
|
|
170
|
-
},
|
|
181
|
+
const first = await auth(provider, {
|
|
182
|
+
serverUrl: mcpUrl,
|
|
171
183
|
scope: defaultScopes.join(' '),
|
|
172
|
-
fetchFn,
|
|
184
|
+
fetchFn: options.fetchFn,
|
|
173
185
|
});
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
+
if (first !== 'AUTHORIZED') {
|
|
187
|
+
const callback = await waitForCallback({
|
|
188
|
+
server,
|
|
189
|
+
redirectUri,
|
|
190
|
+
expectedState,
|
|
191
|
+
timeoutMs: options.timeoutMs ?? loginTimeoutMs,
|
|
192
|
+
});
|
|
193
|
+
const exchanged = await auth(provider, {
|
|
194
|
+
serverUrl: mcpUrl,
|
|
195
|
+
authorizationCode: callback.code,
|
|
196
|
+
...(callback.iss ? { iss: callback.iss } : {}),
|
|
197
|
+
scope: defaultScopes.join(' '),
|
|
198
|
+
fetchFn: options.fetchFn,
|
|
199
|
+
});
|
|
200
|
+
if (exchanged !== 'AUTHORIZED') {
|
|
201
|
+
throw new Error('OAuth redirect completed without tokens.');
|
|
202
|
+
}
|
|
186
203
|
}
|
|
187
|
-
|
|
188
|
-
server
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
timeoutMs: options.timeoutMs ?? loginTimeoutMs,
|
|
192
|
-
});
|
|
193
|
-
const tokens = await exchangeAuthorization(info.authorizationServerUrl, {
|
|
194
|
-
metadata,
|
|
195
|
-
clientInformation: client,
|
|
196
|
-
authorizationCode: code,
|
|
197
|
-
codeVerifier,
|
|
198
|
-
redirectUri,
|
|
199
|
-
resource: new URL(resource),
|
|
200
|
-
fetchFn,
|
|
201
|
-
});
|
|
202
|
-
const credentials = credentialsFromTokens({
|
|
204
|
+
else {
|
|
205
|
+
server.close();
|
|
206
|
+
}
|
|
207
|
+
const { credentials, saved } = await persistAuthorizedSession({
|
|
203
208
|
mcpUrl,
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
client,
|
|
207
|
-
tokens,
|
|
209
|
+
provider,
|
|
210
|
+
backend: options.backend,
|
|
208
211
|
now: options.now?.(),
|
|
209
212
|
});
|
|
210
|
-
const saved = saveCredentials(credentials, options.backend);
|
|
211
213
|
return {
|
|
212
214
|
credentials,
|
|
213
215
|
authorizationUrl,
|
package/dist/auth.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,YAAY,GAIZ,MAAM,WAAW,CAAA;AAClB,OAAO,EACN,
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,YAAY,GAIZ,MAAM,WAAW,CAAA;AAClB,OAAO,EACN,IAAI,GAGJ,MAAM,8BAA8B,CAAA;AACrC,OAAO,EACN,iBAAiB,EACjB,cAAc,EACd,aAAa,EACb,aAAa,EACb,cAAc,GACd,MAAM,eAAe,CAAA;AACtB,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAA;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AACzC,OAAO,EACN,eAAe,EACf,eAAe,GAGf,MAAM,YAAY,CAAA;AAYnB,MAAM,UAAU,oBAAoB,CACnC,WAA8B,EAC9B,MAAc,IAAI,CAAC,GAAG,EAAE;IAExB,IAAI,CAAC,WAAW,CAAC,SAAS;QAAE,OAAO,KAAK,CAAA;IACxC,OAAO,GAAG,GAAG,iBAAiB,IAAI,WAAW,CAAC,SAAS,CAAA;AACxD,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,KAQrC;IACA,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE,CAAA;IACnC,MAAM,SAAS,GACd,OAAO,KAAK,CAAC,MAAM,CAAC,UAAU,KAAK,QAAQ;QAC1C,CAAC,CAAC,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC,UAAU,GAAG,IAAI;QACtC,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,SAAS,CAAA;IAC7B,OAAO;QACN,OAAO,EAAE,CAAC;QACV,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,sBAAsB,EAAE,KAAK,CAAC,sBAAsB;QACpD,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC,SAAS;QAChC,YAAY,EACX,eAAe,IAAI,KAAK,CAAC,MAAM;YAC9B,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,aAAa;YAC5B,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,YAAY;QAChC,WAAW,EAAE,KAAK,CAAC,MAAM,CAAC,YAAY;QACtC,YAAY,EAAE,KAAK,CAAC,MAAM,CAAC,aAAa,IAAI,KAAK,CAAC,QAAQ,EAAE,YAAY;QACxE,SAAS,EAAE,KAAK,CAAC,MAAM,CAAC,UAAU,IAAI,QAAQ;QAC9C,SAAS;QACT,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,IAAI,KAAK,CAAC,QAAQ,EAAE,KAAK;KAClD,CAAA;AACF,CAAC;AAED,KAAK,UAAU,wBAAwB,CAAC,KAMvC;IAIA,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAA;IAC5C,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,iBAAiB,EAAE,CAAA;IACvD,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAA;IACrE,CAAC;IACD,MAAM,WAAW,GAAG,qBAAqB,CAAC;QACzC,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,QAAQ,EAAE,KAAK,CAAC,MAAM;QACtB,sBAAsB,EACrB,MAAM,CAAC,MAAM;YACb,KAAK,CAAC,QAAQ,EAAE,sBAAsB;YACtC,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,MAAM;QAC7B,MAAM;QACN,MAAM;QACN,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,GAAG,EAAE,KAAK,CAAC,GAAG;KACd,CAAC,CAAA;IACF,MAAM,KAAK,GAAG,eAAe,CAAC,WAAW,EAAE,KAAK,CAAC,OAAO,CAAC,CAAA;IACzD,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,CAAA;AAC9B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAAC,KAK9C;IACA,MAAM,EAAE,WAAW,EAAE,GAAG,KAAK,CAAA;IAC7B,IAAI,CAAC,WAAW,CAAC,YAAY,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAA;IACjE,CAAC;IACD,MAAM,QAAQ,GAAG,sBAAsB,CAAC;QACvC,MAAM,EAAE,WAAW,CAAC,MAAM;QAC1B,WAAW,EAAE,cAAc,EAAE;QAC7B,QAAQ,EAAE,WAAW;QACrB,gBAAgB,EAAE,IAAI;QACtB,WAAW,EAAE,KAAK;QAClB,aAAa,EAAE,MAAM,CAAC,UAAU,EAAE;KAClC,CAAC,CAAA;IACF,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,EAAE;QACnC,SAAS,EAAE,WAAW,CAAC,MAAM;QAC7B,KAAK,EAAE,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC;QAC9B,OAAO,EAAE,KAAK,CAAC,OAAO;KACtB,CAAC,CAAA;IACF,IAAI,MAAM,KAAK,YAAY,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAA;IAC9D,CAAC;IACD,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,GAAG,MAAM,wBAAwB,CAAC;QAC5D,MAAM,EAAE,WAAW,CAAC,MAAM;QAC1B,QAAQ;QACR,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,QAAQ,EAAE,WAAW;QACrB,GAAG,EAAE,KAAK,CAAC,GAAG;KACd,CAAC,CAAA;IACF,OAAO,IAAI,CAAA;AACZ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,KAK5C;IACA,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,aAAa,CAAA;IAC5C,MAAM,WAAW,GAAG,eAAe,CAAC,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,CAAA;IAC1D,IAAI,CAAC,WAAW,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAA;IACpD,CAAC;IACD,IAAI,CAAC,oBAAoB,CAAC,WAAW,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QACnD,OAAO,WAAW,CAAA;IACnB,CAAC;IACD,OAAO,MAAM,wBAAwB,CAAC;QACrC,WAAW;QACX,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,GAAG,EAAE,KAAK,CAAC,GAAG;QACd,OAAO,EAAE,KAAK,CAAC,OAAO;KACtB,CAAC,CAAA;AACH,CAAC;AAED,SAAS,mBAAmB,CAAC,WAAgB;IAC5C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACtC,MAAM,MAAM,GAAG,YAAY,EAAE,CAAA;QAC7B,MAAM,IAAI,GAAG,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAA;QACrC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,WAAW,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAA;QAChE,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YAC5B,IAAI,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;gBACpD,MAAM,CACL,IAAI,KAAK,CACR,uBAAuB,IAAI,gDAAgD,CAC3E,CACD,CAAA;gBACD,OAAM;YACP,CAAC;YACD,MAAM,CAAC,KAAK,CAAC,CAAA;QACd,CAAC,CAAC,CAAA;IACH,CAAC,CAAC,CAAA;AACH,CAAC;AAED,SAAS,eAAe,CAAC,KAKxB;IACA,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACtC,MAAM,MAAM,GAAG,CAAC,KAAmB,EAAE,MAAuC,EAAE,EAAE;YAC/E,YAAY,CAAC,KAAK,CAAC,CAAA;YACnB,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,CAAA;YACpB,IAAI,KAAK;gBAAE,MAAM,CAAC,KAAK,CAAC,CAAA;;gBACnB,OAAO,CAAC,MAAM,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAA;QACrC,CAAC,CAAA;QACD,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YAC7B,MAAM,CAAC,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC,CAAA;QAC9D,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,CAAA;QAEnB,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,OAAwB,EAAE,QAAwB,EAAE,EAAE;YACjF,IAAI,CAAC;gBACJ,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,IAAI,GAAG,EAAE,KAAK,CAAC,WAAW,CAAC,CAAA;gBAC1D,IAAI,GAAG,CAAC,QAAQ,KAAK,KAAK,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;oBACjD,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAA;oBACxC,OAAM;gBACP,CAAC;gBACD,MAAM,KAAK,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;gBAC3C,IAAI,KAAK,EAAE,CAAC;oBACX,MAAM,WAAW,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,mBAAmB,CAAC,IAAI,EAAE,CAAA;oBACnE,QAAQ;yBACN,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC;yBAC/C,GAAG,CAAC,yDAAyD,CAAC,CAAA;oBAChE,MAAM,CAAC,IAAI,KAAK,CAAC,WAAW,IAAI,KAAK,CAAC,CAAC,CAAA;oBACvC,OAAM;gBACP,CAAC;gBACD,MAAM,KAAK,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;gBAC3C,MAAM,IAAI,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;gBACzC,MAAM,GAAG,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,SAAS,CAAA;gBACpD,IAAI,KAAK,KAAK,KAAK,CAAC,aAAa,IAAI,CAAC,IAAI,EAAE,CAAC;oBAC5C,QAAQ;yBACN,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC;yBAC/C,GAAG,CAAC,2DAA2D,CAAC,CAAA;oBAClE,MAAM,CAAC,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC,CAAA;oBAC1D,OAAM;gBACP,CAAC;gBACD,QAAQ;qBACN,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC;qBAC/C,GAAG,CAAC,0DAA0D,CAAC,CAAA;gBACjE,MAAM,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;YAChD,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAChB,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAA;YAC3B,CAAC;QACF,CAAC,CAAC,CAAA;IACH,CAAC,CAAC,CAAA;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,KAAK,CAAC,UAAwB,EAAE;IAMrD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,aAAa,CAAA;IAC9C,MAAM,WAAW,GAAG,cAAc,EAAE,CAAA;IACpC,MAAM,aAAa,GAAG,MAAM,CAAC,UAAU,EAAE,CAAA;IACzC,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,WAAW,CAAC,CAAA;IACrD,IAAI,gBAAgB,GAAG,WAAW,CAAA;IAClC,MAAM,QAAQ,GAAG,sBAAsB,CAAC;QACvC,MAAM;QACN,WAAW;QACX,gBAAgB,EAAE,KAAK;QACvB,WAAW,EAAE,OAAO,CAAC,WAAW,KAAK,KAAK;QAC1C,aAAa;QACb,kBAAkB,EAAE,CAAC,GAAG,EAAE,EAAE;YAC3B,gBAAgB,GAAG,GAAG,CAAA;YACtB,OAAO,CAAC,kBAAkB,EAAE,CAAC,GAAG,CAAC,CAAA;QAClC,CAAC;KACD,CAAC,CAAA;IACF,IAAI,CAAC;QACJ,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,EAAE;YAClC,SAAS,EAAE,MAAM;YACjB,KAAK,EAAE,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC;YAC9B,OAAO,EAAE,OAAO,CAAC,OAAO;SACxB,CAAC,CAAA;QACF,IAAI,KAAK,KAAK,YAAY,EAAE,CAAC;YAC5B,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC;gBACtC,MAAM;gBACN,WAAW;gBACX,aAAa;gBACb,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,cAAc;aAC9C,CAAC,CAAA;YACF,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,QAAQ,EAAE;gBACtC,SAAS,EAAE,MAAM;gBACjB,iBAAiB,EAAE,QAAQ,CAAC,IAAI;gBAChC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC9C,KAAK,EAAE,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC;gBAC9B,OAAO,EAAE,OAAO,CAAC,OAAO;aACxB,CAAC,CAAA;YACF,IAAI,SAAS,KAAK,YAAY,EAAE,CAAC;gBAChC,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAA;YAC5D,CAAC;QACF,CAAC;aAAM,CAAC;YACP,MAAM,CAAC,KAAK,EAAE,CAAA;QACf,CAAC;QACD,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG,MAAM,wBAAwB,CAAC;YAC7D,MAAM;YACN,QAAQ;YACR,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE;SACpB,CAAC,CAAA;QACF,OAAO;YACN,WAAW;YACX,gBAAgB;YAChB,WAAW,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI;YAC/B,WAAW,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI;SAC/B,CAAA;IACF,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,MAAM,CAAC,KAAK,EAAE,CAAA;QACd,MAAM,WAAW,CAAC,KAAK,CAAC,CAAA;IACzB,CAAC;AACF,CAAC"}
|
package/dist/cli.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export type CommandName = 'login' | 'logout' | 'status' | 'whoami' | 'search' | 'execute' | 'skill' | 'help' | 'version';
|
|
1
|
+
export type CommandName = 'login' | 'logout' | 'status' | 'whoami' | 'search' | 'execute' | 'install' | 'skill' | 'help' | 'version';
|
|
2
2
|
declare function parseKnown(args: Array<string>): {
|
|
3
3
|
values: {
|
|
4
4
|
[longOption: string]: string | boolean | undefined;
|
|
@@ -16,6 +16,8 @@ declare function parseKnown(args: Array<string>): {
|
|
|
16
16
|
'conversation-id'?: string | boolean | undefined;
|
|
17
17
|
project?: string | boolean | undefined;
|
|
18
18
|
'no-browser'?: string | boolean | undefined;
|
|
19
|
+
clients?: string | boolean | undefined;
|
|
20
|
+
yes?: string | boolean | undefined;
|
|
19
21
|
};
|
|
20
22
|
positionals: string[];
|
|
21
23
|
};
|
package/dist/cli.js
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { parseArgs } from 'node:util';
|
|
2
2
|
import { readFile } from 'node:fs/promises';
|
|
3
|
-
import { defaultMcpUrl } from './defaults.js';
|
|
3
|
+
import { defaultMcpUrl, modernMcpProtocolVersion } from './defaults.js';
|
|
4
4
|
import { usage } from './help.js';
|
|
5
5
|
import { ensureFreshCredentials, login } from './auth.js';
|
|
6
6
|
import { deleteCredentials, loadCredentials } from './store.js';
|
|
7
7
|
import { callKodyTool, formatToolResult, listKodyTools } from './mcp.js';
|
|
8
|
+
import { runInstall } from './install.js';
|
|
8
9
|
import { installSkill } from './skill.js';
|
|
9
10
|
import { readPackageVersion } from './package-info.js';
|
|
10
11
|
import { redactError } from './redact.js';
|
|
@@ -30,6 +31,8 @@ function parseKnown(args) {
|
|
|
30
31
|
'conversation-id': { type: 'string' },
|
|
31
32
|
project: { type: 'boolean' },
|
|
32
33
|
'no-browser': { type: 'boolean' },
|
|
34
|
+
clients: { type: 'string' },
|
|
35
|
+
yes: { type: 'boolean', short: 'y' },
|
|
33
36
|
},
|
|
34
37
|
});
|
|
35
38
|
}
|
|
@@ -51,6 +54,7 @@ export function resolveCommand(argv) {
|
|
|
51
54
|
case 'whoami':
|
|
52
55
|
case 'search':
|
|
53
56
|
case 'execute':
|
|
57
|
+
case 'install':
|
|
54
58
|
case 'skill':
|
|
55
59
|
case 'help':
|
|
56
60
|
case 'version':
|
|
@@ -135,12 +139,13 @@ async function dispatch(parsed, write) {
|
|
|
135
139
|
if (json) {
|
|
136
140
|
write(`${JSON.stringify({
|
|
137
141
|
mcpUrl: credentials.mcpUrl,
|
|
142
|
+
protocol: modernMcpProtocolVersion,
|
|
138
143
|
scope: credentials.scope ?? null,
|
|
139
144
|
tools: tools.map((tool) => tool.name),
|
|
140
145
|
}, null, 2)}\n`);
|
|
141
146
|
return 0;
|
|
142
147
|
}
|
|
143
|
-
write(`Connected to ${credentials.mcpUrl}\nTools: ${tools.map((tool) => tool.name).join(', ') || '(none)'}\n`);
|
|
148
|
+
write(`Connected to ${credentials.mcpUrl} (${modernMcpProtocolVersion})\nTools: ${tools.map((tool) => tool.name).join(', ') || '(none)'}\n`);
|
|
144
149
|
return 0;
|
|
145
150
|
}
|
|
146
151
|
case 'search': {
|
|
@@ -180,6 +185,16 @@ async function dispatch(parsed, write) {
|
|
|
180
185
|
write(formatToolResult(result, json));
|
|
181
186
|
return result.isError ? 1 : 0;
|
|
182
187
|
}
|
|
188
|
+
case 'install': {
|
|
189
|
+
const result = await runInstall({
|
|
190
|
+
mcpUrl,
|
|
191
|
+
clients: typeof parsed.values.clients === 'string' ? parsed.values.clients : undefined,
|
|
192
|
+
yes: parsed.values.yes === true,
|
|
193
|
+
project: parsed.values.project === true,
|
|
194
|
+
json,
|
|
195
|
+
}, { stdout: write });
|
|
196
|
+
return result.code;
|
|
197
|
+
}
|
|
183
198
|
case 'skill': {
|
|
184
199
|
const action = parsed.positionals[0] ?? 'install';
|
|
185
200
|
if (action !== 'install') {
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/defaults.d.ts
CHANGED
|
@@ -1,6 +1,16 @@
|
|
|
1
1
|
export declare const defaultMcpUrl = "https://kody.codes/mcp";
|
|
2
|
+
/** Pin to Kody's stateless `/mcp` lane. */
|
|
3
|
+
export declare const modernMcpProtocolVersion = "2026-07-28";
|
|
2
4
|
export declare const defaultScopes: readonly ["profile", "email"];
|
|
3
5
|
export declare const keyringService = "kody.codes";
|
|
4
6
|
export declare const loginTimeoutMs: number;
|
|
5
7
|
export declare const accessTokenSkewMs = 60000;
|
|
6
8
|
export declare const cliName = "@kodycodes/cli";
|
|
9
|
+
export declare const cliClientUri = "https://github.com/kody-bot/cli";
|
|
10
|
+
/** Fixed loopback port so CIMD can list an exact redirect URI. */
|
|
11
|
+
export declare const oauthCallbackPort = 43742;
|
|
12
|
+
export declare const cliClientIdMetadataPath = "/oauth/cli-client-metadata.json";
|
|
13
|
+
export declare function cliClientMetadataUrl(mcpUrl: string): string;
|
|
14
|
+
export declare function cliRedirectUrl(port?: number): URL;
|
|
15
|
+
export declare const onboardingPath = "/onboarding";
|
|
16
|
+
export declare function onboardingUrl(mcpUrl: string): string;
|
package/dist/defaults.js
CHANGED
|
@@ -1,7 +1,23 @@
|
|
|
1
1
|
export const defaultMcpUrl = 'https://kody.codes/mcp';
|
|
2
|
+
/** Pin to Kody's stateless `/mcp` lane. */
|
|
3
|
+
export const modernMcpProtocolVersion = '2026-07-28';
|
|
2
4
|
export const defaultScopes = ['profile', 'email'];
|
|
3
5
|
export const keyringService = 'kody.codes';
|
|
4
6
|
export const loginTimeoutMs = 5 * 60 * 1000;
|
|
5
7
|
export const accessTokenSkewMs = 60_000;
|
|
6
8
|
export const cliName = '@kodycodes/cli';
|
|
9
|
+
export const cliClientUri = 'https://github.com/kody-bot/cli';
|
|
10
|
+
/** Fixed loopback port so CIMD can list an exact redirect URI. */
|
|
11
|
+
export const oauthCallbackPort = 43742;
|
|
12
|
+
export const cliClientIdMetadataPath = '/oauth/cli-client-metadata.json';
|
|
13
|
+
export function cliClientMetadataUrl(mcpUrl) {
|
|
14
|
+
return new URL(cliClientIdMetadataPath, mcpUrl).href;
|
|
15
|
+
}
|
|
16
|
+
export function cliRedirectUrl(port = oauthCallbackPort) {
|
|
17
|
+
return new URL(`http://127.0.0.1:${port}/callback`);
|
|
18
|
+
}
|
|
19
|
+
export const onboardingPath = '/onboarding';
|
|
20
|
+
export function onboardingUrl(mcpUrl) {
|
|
21
|
+
return new URL(onboardingPath, mcpUrl).href;
|
|
22
|
+
}
|
|
7
23
|
//# sourceMappingURL=defaults.js.map
|
package/dist/defaults.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"defaults.js","sourceRoot":"","sources":["../src/defaults.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,aAAa,GAAG,wBAAwB,CAAA;AACrD,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,SAAS,EAAE,OAAO,CAAU,CAAA;AAC1D,MAAM,CAAC,MAAM,cAAc,GAAG,YAAY,CAAA;AAC1C,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAA;AAC3C,MAAM,CAAC,MAAM,iBAAiB,GAAG,MAAM,CAAA;AACvC,MAAM,CAAC,MAAM,OAAO,GAAG,gBAAgB,CAAA"}
|
|
1
|
+
{"version":3,"file":"defaults.js","sourceRoot":"","sources":["../src/defaults.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,aAAa,GAAG,wBAAwB,CAAA;AACrD,2CAA2C;AAC3C,MAAM,CAAC,MAAM,wBAAwB,GAAG,YAAY,CAAA;AACpD,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,SAAS,EAAE,OAAO,CAAU,CAAA;AAC1D,MAAM,CAAC,MAAM,cAAc,GAAG,YAAY,CAAA;AAC1C,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAA;AAC3C,MAAM,CAAC,MAAM,iBAAiB,GAAG,MAAM,CAAA;AACvC,MAAM,CAAC,MAAM,OAAO,GAAG,gBAAgB,CAAA;AACvC,MAAM,CAAC,MAAM,YAAY,GAAG,iCAAiC,CAAA;AAC7D,kEAAkE;AAClE,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,CAAA;AACtC,MAAM,CAAC,MAAM,uBAAuB,GAAG,iCAAiC,CAAA;AAExE,MAAM,UAAU,oBAAoB,CAAC,MAAc;IAClD,OAAO,IAAI,GAAG,CAAC,uBAAuB,EAAE,MAAM,CAAC,CAAC,IAAI,CAAA;AACrD,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,OAAe,iBAAiB;IAC9D,OAAO,IAAI,GAAG,CAAC,oBAAoB,IAAI,WAAW,CAAC,CAAA;AACpD,CAAC;AAED,MAAM,CAAC,MAAM,cAAc,GAAG,aAAa,CAAA;AAE3C,MAAM,UAAU,aAAa,CAAC,MAAc;IAC3C,OAAO,IAAI,GAAG,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC,IAAI,CAAA;AAC5C,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { type HostDefinition } from './host-catalog.js';
|
|
2
|
+
import type { ProcessInfo } from './process-info.js';
|
|
3
|
+
export declare function listRunningProcesses(): Promise<Array<ProcessInfo>>;
|
|
4
|
+
export declare function detectRunningHosts(processes: Array<ProcessInfo>, catalog?: ReadonlyArray<HostDefinition>): Array<HostDefinition>;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import psList from 'ps-list';
|
|
2
|
+
import { hostCatalog } from './host-catalog.js';
|
|
3
|
+
export async function listRunningProcesses() {
|
|
4
|
+
const processes = await psList();
|
|
5
|
+
return processes.map((process) => ({
|
|
6
|
+
name: process.name,
|
|
7
|
+
cmd: process.cmd,
|
|
8
|
+
}));
|
|
9
|
+
}
|
|
10
|
+
export function detectRunningHosts(processes, catalog = hostCatalog) {
|
|
11
|
+
return catalog.filter((host) => processes.some((process) => host.matches(process)));
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=detect-running-hosts.js.map
|