@otakit/cli 1.3.0 → 1.5.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 +42 -3
- package/dist/commands/connect.d.ts +3 -0
- package/dist/commands/connect.d.ts.map +1 -0
- package/dist/commands/connect.js +216 -0
- package/dist/commands/connect.js.map +1 -0
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +40 -48
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/mcp.d.ts +4 -0
- package/dist/commands/mcp.d.ts.map +1 -0
- package/dist/commands/mcp.js +122 -0
- package/dist/commands/mcp.js.map +1 -0
- package/dist/commands/organization.d.ts +3 -0
- package/dist/commands/organization.d.ts.map +1 -0
- package/dist/commands/organization.js +44 -0
- package/dist/commands/organization.js.map +1 -0
- package/dist/commands/register.d.ts.map +1 -1
- package/dist/commands/register.js +71 -16
- package/dist/commands/register.js.map +1 -1
- package/dist/commands/release.d.ts.map +1 -1
- package/dist/commands/release.js +8 -2
- package/dist/commands/release.js.map +1 -1
- package/dist/commands/upload.d.ts.map +1 -1
- package/dist/commands/upload.js +31 -2
- package/dist/commands/upload.js.map +1 -1
- package/dist/commands/whoami.d.ts.map +1 -1
- package/dist/commands/whoami.js +59 -17
- package/dist/commands/whoami.js.map +1 -1
- package/dist/index.js +4494 -21
- package/dist/index.js.map +7 -1
- package/dist/lib/api.d.ts +29 -6
- package/dist/lib/api.d.ts.map +1 -1
- package/dist/lib/api.js +55 -15
- package/dist/lib/api.js.map +1 -1
- package/dist/lib/config.d.ts +7 -0
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +18 -4
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/login-flow.d.ts +13 -0
- package/dist/lib/login-flow.d.ts.map +1 -0
- package/dist/lib/login-flow.js +89 -0
- package/dist/lib/login-flow.js.map +1 -0
- package/dist/lib/native-deps.d.ts +2 -0
- package/dist/lib/native-deps.d.ts.map +1 -1
- package/dist/lib/native-deps.js +12 -2
- package/dist/lib/native-deps.js.map +1 -1
- package/dist/lib/organization.d.ts +27 -0
- package/dist/lib/organization.d.ts.map +1 -0
- package/dist/lib/organization.js +86 -0
- package/dist/lib/organization.js.map +1 -0
- package/dist/lib/project-inspect.d.ts +27 -0
- package/dist/lib/project-inspect.d.ts.map +1 -0
- package/dist/lib/project-inspect.js +131 -0
- package/dist/lib/project-inspect.js.map +1 -0
- package/dist/lib/token-store.d.ts +8 -2
- package/dist/lib/token-store.d.ts.map +1 -1
- package/dist/lib/token-store.js +105 -67
- package/dist/lib/token-store.js.map +1 -1
- package/dist/lib/upload-workflow.d.ts +10 -1
- package/dist/lib/upload-workflow.d.ts.map +1 -1
- package/dist/lib/upload-workflow.js +56 -12
- package/dist/lib/upload-workflow.js.map +1 -1
- package/dist/lib/version.d.ts.map +1 -1
- package/dist/lib/version.js +16 -5
- package/dist/lib/version.js.map +1 -1
- package/dist/mcp/local-adapter.d.ts +97 -0
- package/dist/mcp/local-adapter.d.ts.map +1 -0
- package/dist/mcp/local-adapter.js +664 -0
- package/dist/mcp/local-adapter.js.map +1 -0
- package/package.json +15 -5
package/README.md
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
# @otakit/cli
|
|
2
2
|
|
|
3
|
+
<!-- mcp-name: io.github.otakit/otakit -->
|
|
4
|
+
|
|
3
5
|
Upload and release CLI for OtaKit.
|
|
4
6
|
|
|
5
7
|
## What it does
|
|
@@ -64,7 +66,7 @@ Resolution order:
|
|
|
64
66
|
Main rules:
|
|
65
67
|
|
|
66
68
|
1. `appId`: `--app-id` -> `OTAKIT_APP_ID` -> `plugins.OtaKit.appId`
|
|
67
|
-
2. `serverUrl`: `--server` -> `OTAKIT_SERVER_URL` -> `plugins.OtaKit.serverUrl` -> `https://otakit.app
|
|
69
|
+
2. `serverUrl`: `--server` -> `OTAKIT_SERVER_URL` -> `plugins.OtaKit.serverUrl` -> `https://console.otakit.app`
|
|
68
70
|
3. `outputDir`: upload path arg -> `OTAKIT_BUILD_DIR` / `OTAKIT_OUTPUT_DIR` -> `webDir`
|
|
69
71
|
4. release channel: `--release` -> unnamed channel, `--release <channel>` -> named channel
|
|
70
72
|
|
|
@@ -73,6 +75,13 @@ Auth precedence:
|
|
|
73
75
|
1. `OTAKIT_TOKEN`
|
|
74
76
|
2. stored token from `otakit login`
|
|
75
77
|
|
|
78
|
+
Organization rules:
|
|
79
|
+
|
|
80
|
+
1. organization API keys stay bound to their organization
|
|
81
|
+
2. app-scoped commands use the organization that owns the app
|
|
82
|
+
3. app-less commands use the default chosen during login; automation can set `OTAKIT_ORGANIZATION_ID`
|
|
83
|
+
4. `otakit organization select` changes the local default without changing the dashboard workspace
|
|
84
|
+
|
|
76
85
|
Version precedence:
|
|
77
86
|
|
|
78
87
|
1. `--version`
|
|
@@ -90,16 +99,18 @@ Version precedence:
|
|
|
90
99
|
- `otakit release <bundleId> --channel staging`
|
|
91
100
|
promote an existing bundle later
|
|
92
101
|
|
|
93
|
-
Releases are append-only. The newest release for
|
|
94
|
-
devices see on manifest checks.
|
|
102
|
+
Releases are append-only. The newest release for
|
|
103
|
+
`(appId, channel, runtimeVersion)` is what devices see on manifest checks.
|
|
95
104
|
|
|
96
105
|
## Common commands
|
|
97
106
|
|
|
98
107
|
- `otakit login`
|
|
99
108
|
- `otakit logout`
|
|
100
109
|
- `otakit whoami`
|
|
110
|
+
- `otakit organization select`
|
|
101
111
|
- `otakit register --slug <slug>`
|
|
102
112
|
- `otakit upload [path] [--release [channel]]`
|
|
113
|
+
- `otakit upload --release --auto-revert [--auto-revert-rate <1-95>] [--auto-revert-min-sample <10-100000>]` — server reverts the release if too many devices roll back within 24h (defaults: 20% of ≥50)
|
|
103
114
|
- `otakit release [bundleId] [--channel <channel>]`
|
|
104
115
|
- `otakit releases [--channel <channel> | --base]`
|
|
105
116
|
- `otakit list`
|
|
@@ -107,6 +118,34 @@ devices see on manifest checks.
|
|
|
107
118
|
- `otakit config validate`
|
|
108
119
|
- `otakit config resolve --json`
|
|
109
120
|
- `otakit generate-signing-key`
|
|
121
|
+
- `otakit mcp [--project-root <path>]`
|
|
122
|
+
|
|
123
|
+
## MCP server
|
|
124
|
+
|
|
125
|
+
Run the local stdio server from the Capacitor project it should access:
|
|
126
|
+
|
|
127
|
+
```bash
|
|
128
|
+
npx -y @otakit/cli@latest mcp
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
The project root and organization are fixed when the server starts. For a configured
|
|
132
|
+
project, the CLI uses `plugins.OtaKit.appId` to select its owning organization and
|
|
133
|
+
the server verifies current membership. An organization key is already fixed to its
|
|
134
|
+
owning organization. For app-less projects, `otakit login` stores a named default;
|
|
135
|
+
change it with `otakit organization select` and restart the MCP connection. Users do
|
|
136
|
+
not need an organization ID for interactive setup.
|
|
137
|
+
|
|
138
|
+
Do not put an OtaKit token in tool arguments. The server reuses `OTAKIT_TOKEN` or the
|
|
139
|
+
stored `otakit login` session and honors `OTAKIT_SERVER_URL` for self-hosted
|
|
140
|
+
installations. App-less automation may set `OTAKIT_ORGANIZATION_ID`; the
|
|
141
|
+
`--organization-id` flag remains an advanced per-process override.
|
|
142
|
+
|
|
143
|
+
The hosted remote server is `https://console.otakit.app/mcp`. It is a separate,
|
|
144
|
+
deployment-enabled surface for account operations and cannot read or upload files
|
|
145
|
+
from your local project. A deployment that has not enabled it returns a clear
|
|
146
|
+
`503` response; local stdio MCP continues to work independently. See the
|
|
147
|
+
[MCP and Agent Skills guide](https://otakit.app/docs/agents) for Claude Code, Codex,
|
|
148
|
+
OAuth scopes, and remote setup.
|
|
110
149
|
|
|
111
150
|
## CI
|
|
112
151
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connect.d.ts","sourceRoot":"","sources":["../../src/commands/connect.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAkGpC,eAAO,MAAM,cAAc,SAiKvB,CAAC"}
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
import { existsSync, readFileSync, writeFileSync } from 'node:fs';
|
|
2
|
+
import { mkdirSync } from 'node:fs';
|
|
3
|
+
import { dirname, join, relative, resolve } from 'node:path';
|
|
4
|
+
import { Command } from 'commander';
|
|
5
|
+
import { ApiClient, OtaKitApiError } from '../lib/api.js';
|
|
6
|
+
import { resolveAuthToken, resolveConfigSnapshot, resolveOrganizationOverride, } from '../lib/config.js';
|
|
7
|
+
import { CliError, runCommand } from '../lib/errors.js';
|
|
8
|
+
import { signInWithEmailOtp } from '../lib/login-flow.js';
|
|
9
|
+
import { fetchAccount, initialOrganizationId, promptForOrganization } from '../lib/organization.js';
|
|
10
|
+
import { confirm } from '../lib/prompt.js';
|
|
11
|
+
import { storeAuthProfile } from '../lib/token-store.js';
|
|
12
|
+
import { CLI_VERSION } from '../lib/version.js';
|
|
13
|
+
const SERVER_NAME = 'otakit';
|
|
14
|
+
/**
|
|
15
|
+
* Which agent this repository is set up for. Detection only ever picks the
|
|
16
|
+
* default shown in the plan; `--client` overrides it and the plan states what
|
|
17
|
+
* was chosen, so nothing is configured behind the user's back.
|
|
18
|
+
*/
|
|
19
|
+
function detectClient(projectRoot) {
|
|
20
|
+
if (existsSync(join(projectRoot, '.claude')) || existsSync(join(projectRoot, 'CLAUDE.md'))) {
|
|
21
|
+
return 'claude';
|
|
22
|
+
}
|
|
23
|
+
if (existsSync(join(projectRoot, '.codex')) || existsSync(join(projectRoot, 'AGENTS.md'))) {
|
|
24
|
+
return 'codex';
|
|
25
|
+
}
|
|
26
|
+
if (existsSync(join(projectRoot, '.vscode')))
|
|
27
|
+
return 'vscode';
|
|
28
|
+
return 'claude';
|
|
29
|
+
}
|
|
30
|
+
function parseClient(value, projectRoot) {
|
|
31
|
+
if (!value)
|
|
32
|
+
return detectClient(projectRoot);
|
|
33
|
+
const normalized = value.trim().toLowerCase();
|
|
34
|
+
if (normalized === 'claude' || normalized === 'claude-code')
|
|
35
|
+
return 'claude';
|
|
36
|
+
if (normalized === 'codex')
|
|
37
|
+
return 'codex';
|
|
38
|
+
if (normalized === 'vscode' || normalized === 'vs-code')
|
|
39
|
+
return 'vscode';
|
|
40
|
+
throw new CliError(`Unknown client "${value}". Use claude, codex, or vscode.`);
|
|
41
|
+
}
|
|
42
|
+
const CLIENT_LABELS = {
|
|
43
|
+
claude: 'Claude Code',
|
|
44
|
+
codex: 'Codex',
|
|
45
|
+
vscode: 'VS Code',
|
|
46
|
+
};
|
|
47
|
+
function serverEntry(serverUrl, isHosted, projectRootToken) {
|
|
48
|
+
const args = ['-y', '@otakit/cli@latest', 'mcp', '--project-root', projectRootToken];
|
|
49
|
+
if (!isHosted)
|
|
50
|
+
args.push('--server', serverUrl);
|
|
51
|
+
return { type: 'stdio', command: 'npx', args };
|
|
52
|
+
}
|
|
53
|
+
function configTargetFor(client, projectRoot) {
|
|
54
|
+
if (client === 'claude')
|
|
55
|
+
return join(projectRoot, '.mcp.json');
|
|
56
|
+
if (client === 'vscode')
|
|
57
|
+
return join(projectRoot, '.vscode', 'mcp.json');
|
|
58
|
+
// Codex keeps servers in ~/.codex/config.toml. Hand-editing someone's global
|
|
59
|
+
// TOML is not something to do quietly, so print its own command instead.
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
function readExisting(path) {
|
|
63
|
+
if (!existsSync(path))
|
|
64
|
+
return {};
|
|
65
|
+
try {
|
|
66
|
+
const parsed = JSON.parse(readFileSync(path, 'utf8'));
|
|
67
|
+
return parsed && typeof parsed === 'object' && !Array.isArray(parsed)
|
|
68
|
+
? parsed
|
|
69
|
+
: {};
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
// VS Code allows comments in mcp.json. Rewriting the file would drop them
|
|
73
|
+
// anyway, so stop rather than silently discarding someone's notes.
|
|
74
|
+
throw new CliError(`${path} could not be parsed as JSON (comments are not supported here). Add the server by hand, or move the file and run again.`);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
function row(label, value) {
|
|
78
|
+
return ` ${label.padEnd(14)}${value}`;
|
|
79
|
+
}
|
|
80
|
+
export const connectCommand = new Command('connect')
|
|
81
|
+
.description('Connect this project to your coding agent')
|
|
82
|
+
.option('--client <client>', 'claude, codex, or vscode (default: detected)')
|
|
83
|
+
.option('--project-root <path>', 'Project to connect (default: current directory)')
|
|
84
|
+
.option('--server <url>', 'OtaKit console URL override')
|
|
85
|
+
.option('--dry-run', 'Show what would be written and exit')
|
|
86
|
+
.option('--yes', 'Skip the confirmation prompt')
|
|
87
|
+
.action(async (options) => {
|
|
88
|
+
await runCommand(async () => {
|
|
89
|
+
const projectRoot = resolve(options.projectRoot ?? process.cwd());
|
|
90
|
+
if (!existsSync(projectRoot)) {
|
|
91
|
+
throw new CliError(`Project root does not exist: ${projectRoot}`);
|
|
92
|
+
}
|
|
93
|
+
const client = parseClient(options.client, projectRoot);
|
|
94
|
+
// Resolve the project first: a self-hosted capacitor.config sets the
|
|
95
|
+
// console this project belongs to, and signing in against the hosted
|
|
96
|
+
// default instead would configure a server the project never uses.
|
|
97
|
+
const snapshot = await resolveConfigSnapshot({
|
|
98
|
+
cwd: projectRoot,
|
|
99
|
+
serverUrl: options.server,
|
|
100
|
+
});
|
|
101
|
+
const serverUrl = snapshot.serverUrl.value;
|
|
102
|
+
const isHosted = serverUrl.replace(/\/+$/, '') === 'https://console.otakit.app';
|
|
103
|
+
// Sign in first if needed, so this really is one command.
|
|
104
|
+
let auth = await resolveAuthToken(serverUrl);
|
|
105
|
+
if (!auth) {
|
|
106
|
+
console.log(`Not signed in to ${serverUrl}.`);
|
|
107
|
+
const { token } = await signInWithEmailOtp(serverUrl);
|
|
108
|
+
// Store the same context `otakit login` does. Without the chosen
|
|
109
|
+
// organization, an app-less project would sign in and then immediately
|
|
110
|
+
// fail with ORGANIZATION_SELECTION_REQUIRED.
|
|
111
|
+
const account = await fetchAccount(serverUrl, token);
|
|
112
|
+
const selected = snapshot.appId.value
|
|
113
|
+
? undefined
|
|
114
|
+
: await promptForOrganization(account.memberships, {
|
|
115
|
+
initialOrganizationId: initialOrganizationId(account),
|
|
116
|
+
});
|
|
117
|
+
const stored = await storeAuthProfile(serverUrl, {
|
|
118
|
+
token,
|
|
119
|
+
userId: account.user.id,
|
|
120
|
+
...(selected ? { organizationId: selected.organizationId } : {}),
|
|
121
|
+
});
|
|
122
|
+
if (!stored.ok) {
|
|
123
|
+
throw new CliError(stored.reason ?? 'Could not store the access token.');
|
|
124
|
+
}
|
|
125
|
+
auth = await resolveAuthToken(serverUrl);
|
|
126
|
+
console.log('');
|
|
127
|
+
}
|
|
128
|
+
if (!auth)
|
|
129
|
+
throw new CliError('Not authenticated. Run `otakit login`, or set OTAKIT_TOKEN.');
|
|
130
|
+
// OTAKIT_ORGANIZATION_ID has to win here too, or CI that works with
|
|
131
|
+
// `otakit mcp` fails with the same variables set.
|
|
132
|
+
const organizationId = snapshot.appId.value
|
|
133
|
+
? undefined
|
|
134
|
+
: (resolveOrganizationOverride() ?? auth.organizationId ?? undefined);
|
|
135
|
+
const probe = new ApiClient({
|
|
136
|
+
appId: snapshot.appId.value ?? '00000000-0000-0000-0000-000000000000',
|
|
137
|
+
serverUrl,
|
|
138
|
+
authToken: auth.token,
|
|
139
|
+
authSource: auth.source,
|
|
140
|
+
}, CLI_VERSION, { organizationId });
|
|
141
|
+
let context;
|
|
142
|
+
try {
|
|
143
|
+
context = await probe.request(snapshot.appId.value
|
|
144
|
+
? `/api/v1/context?${new URLSearchParams({ appId: snapshot.appId.value })}`
|
|
145
|
+
: '/api/v1/context');
|
|
146
|
+
}
|
|
147
|
+
catch (error) {
|
|
148
|
+
if (error instanceof OtaKitApiError && error.nextStep) {
|
|
149
|
+
throw new CliError(`${error.message}\n${error.nextStep}`);
|
|
150
|
+
}
|
|
151
|
+
throw error;
|
|
152
|
+
}
|
|
153
|
+
const target = configTargetFor(client, projectRoot);
|
|
154
|
+
const projectRootToken = client === 'claude'
|
|
155
|
+
? '${CLAUDE_PROJECT_DIR:-.}'
|
|
156
|
+
: client === 'vscode'
|
|
157
|
+
? '${workspaceFolder}'
|
|
158
|
+
: '.';
|
|
159
|
+
const entry = serverEntry(serverUrl, isHosted, projectRootToken);
|
|
160
|
+
// Everything that is about to happen, before any of it happens.
|
|
161
|
+
console.log(`Connecting ${CLIENT_LABELS[client]}${options.client ? '' : ' (detected)'}.`);
|
|
162
|
+
console.log('');
|
|
163
|
+
console.log(row('console', serverUrl));
|
|
164
|
+
console.log(row('organization', context.organization.name));
|
|
165
|
+
console.log(row('signed in as', context.actor.label));
|
|
166
|
+
console.log(row('project', projectRoot));
|
|
167
|
+
console.log(row('app', snapshot.appId.value
|
|
168
|
+
? `${context.app?.slug ?? snapshot.appId.value} (from ${snapshot.appId.source})`
|
|
169
|
+
: 'none configured — set plugins.OtaKit.appId in capacitor.config.*'));
|
|
170
|
+
console.log('');
|
|
171
|
+
if (!target) {
|
|
172
|
+
const command = `codex mcp add ${SERVER_NAME} -- ${entry.command} ${entry.args.join(' ')}`;
|
|
173
|
+
console.log('Codex stores MCP servers in ~/.codex/config.toml. Run:');
|
|
174
|
+
console.log('');
|
|
175
|
+
console.log(` ${command}`);
|
|
176
|
+
console.log('');
|
|
177
|
+
console.log('Then restart Codex and ask it to inspect this project.');
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
const existing = readExisting(target);
|
|
181
|
+
// VS Code's mcp.json uses "servers"; Claude Code's .mcp.json uses
|
|
182
|
+
// "mcpServers". The client decides, not whatever happens to be in the file.
|
|
183
|
+
const key = client === 'vscode' ? 'servers' : 'mcpServers';
|
|
184
|
+
const servers = (existing[key] ?? {});
|
|
185
|
+
const replacing = Object.prototype.hasOwnProperty.call(servers, SERVER_NAME);
|
|
186
|
+
const relativeTarget = relative(projectRoot, target) || target;
|
|
187
|
+
console.log(`Will ${replacing ? 'replace' : 'add'} server "${SERVER_NAME}" in ${relativeTarget}:`);
|
|
188
|
+
console.log('');
|
|
189
|
+
for (const line of JSON.stringify({ [SERVER_NAME]: entry }, null, 2).split('\n')) {
|
|
190
|
+
console.log(` ${line}`);
|
|
191
|
+
}
|
|
192
|
+
console.log('');
|
|
193
|
+
if (options.dryRun) {
|
|
194
|
+
console.log('Dry run: nothing was written.');
|
|
195
|
+
return;
|
|
196
|
+
}
|
|
197
|
+
if (!options.yes) {
|
|
198
|
+
if (!process.stdin.isTTY) {
|
|
199
|
+
throw new CliError('Confirmation needs an interactive terminal. Re-run with --yes.');
|
|
200
|
+
}
|
|
201
|
+
if (!(await confirm('Write it?'))) {
|
|
202
|
+
console.log('Cancelled. Nothing was written.');
|
|
203
|
+
return;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
const next = { ...existing, [key]: { ...servers, [SERVER_NAME]: entry } };
|
|
207
|
+
mkdirSync(dirname(target), { recursive: true });
|
|
208
|
+
writeFileSync(target, `${JSON.stringify(next, null, 2)}\n`, 'utf8');
|
|
209
|
+
console.log('');
|
|
210
|
+
console.log(`Wrote ${relativeTarget}.`);
|
|
211
|
+
console.log(client === 'claude'
|
|
212
|
+
? 'Restart Claude Code, run /mcp to confirm "otakit" is connected, then ask it to inspect this project.'
|
|
213
|
+
: 'Run "MCP: List Servers" in VS Code to trust and start the server.');
|
|
214
|
+
});
|
|
215
|
+
});
|
|
216
|
+
//# sourceMappingURL=connect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connect.js","sourceRoot":"","sources":["../../src/commands/connect.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAsBpC,eAAO,MAAM,YAAY,SAiFrB,CAAC"}
|
package/dist/commands/login.js
CHANGED
|
@@ -1,14 +1,9 @@
|
|
|
1
1
|
import { Command } from 'commander';
|
|
2
|
-
import ora from 'ora';
|
|
3
2
|
import { resolveServerUrl } from '../lib/config.js';
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
const OTP_REGEX = /^\d{6}$/;
|
|
9
|
-
function toShellLiteral(value) {
|
|
10
|
-
return `'${value.replace(/'/g, `'"'"'`)}'`;
|
|
11
|
-
}
|
|
3
|
+
import { runCommand } from '../lib/errors.js';
|
|
4
|
+
import { fetchAccount, initialOrganizationId, organizationById, organizationDisplayLabel, promptForOrganization, shellLiteral, } from '../lib/organization.js';
|
|
5
|
+
import { signInWithEmailOtp } from '../lib/login-flow.js';
|
|
6
|
+
import { readStoredAuthProfile, storeAuthProfile } from '../lib/token-store.js';
|
|
12
7
|
export const loginCommand = new Command('login')
|
|
13
8
|
.description('Sign in with email OTP and store access token')
|
|
14
9
|
.option('--email <email>', 'Email address')
|
|
@@ -17,47 +12,38 @@ export const loginCommand = new Command('login')
|
|
|
17
12
|
.action(async (options) => {
|
|
18
13
|
await runCommand(async () => {
|
|
19
14
|
const serverUrl = resolveServerUrl(process.cwd(), options.server);
|
|
20
|
-
const
|
|
21
|
-
|
|
22
|
-
|
|
15
|
+
const { token, email: signedInEmail } = await signInWithEmailOtp(serverUrl, options.email);
|
|
16
|
+
const previousProfile = await readStoredAuthProfile(serverUrl);
|
|
17
|
+
let account;
|
|
18
|
+
try {
|
|
19
|
+
account = await fetchAccount(serverUrl, token);
|
|
23
20
|
}
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
sendSpinner.fail('Could not send verification code');
|
|
34
|
-
throw new CliError(await parseApiError(sendOtpResponse));
|
|
35
|
-
}
|
|
36
|
-
sendSpinner.succeed('Verification code sent');
|
|
37
|
-
const otp = (await ask('Verification code: ')).trim();
|
|
38
|
-
if (!OTP_REGEX.test(otp)) {
|
|
39
|
-
throw new CliError('Invalid verification code. Enter the 6-digit code.');
|
|
21
|
+
catch (error) {
|
|
22
|
+
if (!options.tokenOnly)
|
|
23
|
+
throw error;
|
|
24
|
+
const storeResult = await storeAuthProfile(serverUrl, { token });
|
|
25
|
+
process.stdout.write(`${token}\n`);
|
|
26
|
+
if (!storeResult.ok) {
|
|
27
|
+
console.error(`Warning: could not store token locally (${storeResult.reason ?? 'unknown reason'}).`);
|
|
28
|
+
}
|
|
29
|
+
return;
|
|
40
30
|
}
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
},
|
|
47
|
-
body: JSON.stringify({ email: emailInput, otp }),
|
|
48
|
-
});
|
|
49
|
-
if (!signInResponse.ok) {
|
|
50
|
-
verifySpinner.fail('Sign-in failed');
|
|
51
|
-
throw new CliError(await parseApiError(signInResponse));
|
|
31
|
+
let selectedOrganization = account.memberships.length === 1 ? account.memberships[0] : undefined;
|
|
32
|
+
if (!selectedOrganization &&
|
|
33
|
+
options.tokenOnly &&
|
|
34
|
+
previousProfile?.userId === account.user.id) {
|
|
35
|
+
selectedOrganization = organizationById(account.memberships, previousProfile.organizationId);
|
|
52
36
|
}
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
throw new CliError('Server returned an invalid auth response.');
|
|
37
|
+
if (!selectedOrganization && !options.tokenOnly) {
|
|
38
|
+
selectedOrganization = await promptForOrganization(account.memberships, {
|
|
39
|
+
initialOrganizationId: initialOrganizationId(account, previousProfile),
|
|
40
|
+
});
|
|
58
41
|
}
|
|
59
|
-
const storeResult = await
|
|
60
|
-
|
|
42
|
+
const storeResult = await storeAuthProfile(serverUrl, {
|
|
43
|
+
token,
|
|
44
|
+
userId: account.user.id,
|
|
45
|
+
...(selectedOrganization ? { organizationId: selectedOrganization.organizationId } : {}),
|
|
46
|
+
});
|
|
61
47
|
if (options.tokenOnly) {
|
|
62
48
|
process.stdout.write(`${token}\n`);
|
|
63
49
|
if (!storeResult.ok) {
|
|
@@ -66,14 +52,20 @@ export const loginCommand = new Command('login')
|
|
|
66
52
|
return;
|
|
67
53
|
}
|
|
68
54
|
if (storeResult.ok) {
|
|
69
|
-
const signedInAs =
|
|
55
|
+
const signedInAs = ` as ${account.user.email || signedInEmail}`;
|
|
70
56
|
console.log(`Logged in${signedInAs}.`);
|
|
57
|
+
if (selectedOrganization) {
|
|
58
|
+
console.log(`Default organization: ${organizationDisplayLabel(selectedOrganization, account.memberships)}.`);
|
|
59
|
+
}
|
|
71
60
|
console.log(`Token stored locally for ${serverUrl}.`);
|
|
72
61
|
return;
|
|
73
62
|
}
|
|
74
63
|
console.warn(`Could not store token locally: ${storeResult.reason ?? 'unknown reason'}.`);
|
|
75
64
|
console.log('Use env fallback in this shell:');
|
|
76
|
-
console.log(`export OTAKIT_TOKEN=${
|
|
65
|
+
console.log(`export OTAKIT_TOKEN=${shellLiteral(token)}`);
|
|
66
|
+
if (selectedOrganization) {
|
|
67
|
+
console.log(`export OTAKIT_ORGANIZATION_ID=${shellLiteral(selectedOrganization.organizationId)}`);
|
|
68
|
+
}
|
|
77
69
|
});
|
|
78
70
|
});
|
|
79
71
|
//# sourceMappingURL=login.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,
|
|
1
|
+
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EACL,YAAY,EACZ,qBAAqB,EACrB,gBAAgB,EAChB,wBAAwB,EACxB,qBAAqB,EACrB,YAAY,GAEb,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAQhF,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC;KAC7C,WAAW,CAAC,+CAA+C,CAAC;KAC5D,MAAM,CAAC,iBAAiB,EAAE,eAAe,CAAC;KAC1C,MAAM,CAAC,gBAAgB,EAAE,YAAY,CAAC;KACtC,MAAM,CAAC,cAAc,EAAE,gCAAgC,CAAC;KACxD,MAAM,CAAC,KAAK,EAAE,OAAqB,EAAE,EAAE;IACtC,MAAM,UAAU,CAAC,KAAK,IAAI,EAAE;QAC1B,MAAM,SAAS,GAAG,gBAAgB,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QAClE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,GAAG,MAAM,kBAAkB,CAAC,SAAS,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;QAE3F,MAAM,eAAe,GAAG,MAAM,qBAAqB,CAAC,SAAS,CAAC,CAAC;QAC/D,IAAI,OAAwB,CAAC;QAC7B,IAAI,CAAC;YACH,OAAO,GAAG,MAAM,YAAY,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QACjD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,OAAO,CAAC,SAAS;gBAAE,MAAM,KAAK,CAAC;YACpC,MAAM,WAAW,GAAG,MAAM,gBAAgB,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;YACjE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,IAAI,CAAC,CAAC;YACnC,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE,CAAC;gBACpB,OAAO,CAAC,KAAK,CACX,2CAA2C,WAAW,CAAC,MAAM,IAAI,gBAAgB,IAAI,CACtF,CAAC;YACJ,CAAC;YACD,OAAO;QACT,CAAC;QAED,IAAI,oBAAoB,GACtB,OAAO,CAAC,WAAW,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACxE,IACE,CAAC,oBAAoB;YACrB,OAAO,CAAC,SAAS;YACjB,eAAe,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,EAAE,EAC3C,CAAC;YACD,oBAAoB,GAAG,gBAAgB,CACrC,OAAO,CAAC,WAAW,EACnB,eAAe,CAAC,cAAc,CAC/B,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,oBAAoB,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;YAChD,oBAAoB,GAAG,MAAM,qBAAqB,CAAC,OAAO,CAAC,WAAW,EAAE;gBACtE,qBAAqB,EAAE,qBAAqB,CAAC,OAAO,EAAE,eAAe,CAAC;aACvE,CAAC,CAAC;QACL,CAAC;QAED,MAAM,WAAW,GAAG,MAAM,gBAAgB,CAAC,SAAS,EAAE;YACpD,KAAK;YACL,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,EAAE;YACvB,GAAG,CAAC,oBAAoB,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,oBAAoB,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACzF,CAAC,CAAC;QAEH,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;YACtB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,IAAI,CAAC,CAAC;YACnC,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE,CAAC;gBACpB,OAAO,CAAC,KAAK,CACX,2CAA2C,WAAW,CAAC,MAAM,IAAI,gBAAgB,IAAI,CACtF,CAAC;YACJ,CAAC;YACD,OAAO;QACT,CAAC;QAED,IAAI,WAAW,CAAC,EAAE,EAAE,CAAC;YACnB,MAAM,UAAU,GAAG,OAAO,OAAO,CAAC,IAAI,CAAC,KAAK,IAAI,aAAa,EAAE,CAAC;YAChE,OAAO,CAAC,GAAG,CAAC,YAAY,UAAU,GAAG,CAAC,CAAC;YACvC,IAAI,oBAAoB,EAAE,CAAC;gBACzB,OAAO,CAAC,GAAG,CACT,yBAAyB,wBAAwB,CAAC,oBAAoB,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,CAChG,CAAC;YACJ,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,4BAA4B,SAAS,GAAG,CAAC,CAAC;YACtD,OAAO;QACT,CAAC;QAED,OAAO,CAAC,IAAI,CAAC,kCAAkC,WAAW,CAAC,MAAM,IAAI,gBAAgB,GAAG,CAAC,CAAC;QAC1F,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;QAC/C,OAAO,CAAC,GAAG,CAAC,uBAAuB,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC1D,IAAI,oBAAoB,EAAE,CAAC;YACzB,OAAO,CAAC,GAAG,CACT,iCAAiC,YAAY,CAAC,oBAAoB,CAAC,cAAc,CAAC,EAAE,CACrF,CAAC;QACJ,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../../src/commands/mcp.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA4BpC,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAIhE;AAED,eAAO,MAAM,UAAU,SAoHnB,CAAC"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { realpathSync, statSync } from 'node:fs';
|
|
2
|
+
import { resolve } from 'node:path';
|
|
3
|
+
import { createOtaKitMcpServer } from '@otakit/mcp-core';
|
|
4
|
+
import { serveStdio } from '@modelcontextprotocol/server/stdio';
|
|
5
|
+
import { Command } from 'commander';
|
|
6
|
+
import { ApiClient, OtaKitApiError } from '../lib/api.js';
|
|
7
|
+
import { readProjectConfig, resolveConfigSnapshot, resolveOrganizationOverride, } from '../lib/config.js';
|
|
8
|
+
import { CliError, runCommand } from '../lib/errors.js';
|
|
9
|
+
import { CLI_VERSION } from '../lib/version.js';
|
|
10
|
+
import { createLocalToolAuthorization, LocalOtaKitToolAdapter, } from '../mcp/local-adapter.js';
|
|
11
|
+
export function localMcpContextPath(appId) {
|
|
12
|
+
const normalizedAppId = appId?.trim();
|
|
13
|
+
if (!normalizedAppId)
|
|
14
|
+
return '/api/v1/context';
|
|
15
|
+
return `/api/v1/context?${new URLSearchParams({ appId: normalizedAppId }).toString()}`;
|
|
16
|
+
}
|
|
17
|
+
export const mcpCommand = new Command('mcp')
|
|
18
|
+
.description('Run the local OtaKit MCP server over stdio')
|
|
19
|
+
.option('--project-root <path>', 'Project root available to local tools (default: current directory)')
|
|
20
|
+
.option('--server <url>', 'OtaKit console URL override')
|
|
21
|
+
.option('--app-id <id>', 'Default app ID override for project configuration')
|
|
22
|
+
.option('--organization-id <id>', 'Organization override for app-less automation')
|
|
23
|
+
.action(async (options) => {
|
|
24
|
+
await runCommand(async () => {
|
|
25
|
+
const selectedRoot = resolve(options.projectRoot ?? process.cwd());
|
|
26
|
+
let projectRoot;
|
|
27
|
+
try {
|
|
28
|
+
projectRoot = realpathSync(selectedRoot);
|
|
29
|
+
if (!statSync(projectRoot).isDirectory())
|
|
30
|
+
throw new Error('not a directory');
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
throw new CliError(`Project root is not a readable directory: ${selectedRoot}`);
|
|
34
|
+
}
|
|
35
|
+
const snapshot = await resolveConfigSnapshot({
|
|
36
|
+
cwd: projectRoot,
|
|
37
|
+
appId: options.appId,
|
|
38
|
+
serverUrl: options.server,
|
|
39
|
+
});
|
|
40
|
+
if (!snapshot.authToken.value || !snapshot.authSource) {
|
|
41
|
+
throw new CliError('Not authenticated. Run `otakit login`, or set OTAKIT_TOKEN.');
|
|
42
|
+
}
|
|
43
|
+
const explicitOrganizationId = options.organizationId?.trim();
|
|
44
|
+
if (snapshot.appId.value && explicitOrganizationId) {
|
|
45
|
+
throw new CliError('`--organization-id` is only valid for app-less projects. Remove it; the configured app selects its owning organization.');
|
|
46
|
+
}
|
|
47
|
+
const organizationId = snapshot.appId.value
|
|
48
|
+
? undefined
|
|
49
|
+
: (resolveOrganizationOverride(explicitOrganizationId) ??
|
|
50
|
+
snapshot.authOrganizationId ??
|
|
51
|
+
undefined);
|
|
52
|
+
const probe = new ApiClient({
|
|
53
|
+
appId: snapshot.appId.value ?? '00000000-0000-0000-0000-000000000000',
|
|
54
|
+
serverUrl: snapshot.serverUrl.value,
|
|
55
|
+
authToken: snapshot.authToken.value,
|
|
56
|
+
authSource: snapshot.authSource,
|
|
57
|
+
}, CLI_VERSION, { organizationId });
|
|
58
|
+
let fixed;
|
|
59
|
+
try {
|
|
60
|
+
fixed = await probe.request(localMcpContextPath(snapshot.appId.value));
|
|
61
|
+
}
|
|
62
|
+
catch (error) {
|
|
63
|
+
if (error instanceof OtaKitApiError) {
|
|
64
|
+
if (!snapshot.appId.value && organizationId && error.status === 404) {
|
|
65
|
+
throw new CliError('The selected organization is unavailable. Run `otakit organization select`, then restart this MCP server.');
|
|
66
|
+
}
|
|
67
|
+
if (error.nextStep)
|
|
68
|
+
throw new CliError(`${error.message}\n${error.nextStep}`);
|
|
69
|
+
}
|
|
70
|
+
throw error;
|
|
71
|
+
}
|
|
72
|
+
const projectConfig = await readProjectConfig(projectRoot);
|
|
73
|
+
const connection = {
|
|
74
|
+
serverUrl: snapshot.serverUrl.value,
|
|
75
|
+
authToken: snapshot.authToken.value,
|
|
76
|
+
authSource: snapshot.authSource,
|
|
77
|
+
organization: fixed.organization,
|
|
78
|
+
actor: fixed.actor,
|
|
79
|
+
capabilities: fixed.capabilities,
|
|
80
|
+
projectRoot,
|
|
81
|
+
defaultApp: snapshot.appId.value
|
|
82
|
+
? {
|
|
83
|
+
id: snapshot.appId.value,
|
|
84
|
+
slug: fixed.app?.slug ?? null,
|
|
85
|
+
channel: projectConfig?.channel ?? null,
|
|
86
|
+
runtimeVersion: projectConfig?.runtimeVersion ?? null,
|
|
87
|
+
}
|
|
88
|
+
: null,
|
|
89
|
+
};
|
|
90
|
+
const adapter = new LocalOtaKitToolAdapter(connection);
|
|
91
|
+
const handle = serveStdio(() => createOtaKitMcpServer({
|
|
92
|
+
mode: 'local',
|
|
93
|
+
version: CLI_VERSION,
|
|
94
|
+
binding: {
|
|
95
|
+
serverOrigin: connection.serverUrl,
|
|
96
|
+
organizationName: connection.organization.name,
|
|
97
|
+
projectRoot: connection.projectRoot,
|
|
98
|
+
isProject: projectConfig !== null || Boolean(snapshot.appId.value),
|
|
99
|
+
appId: connection.defaultApp?.id ?? null,
|
|
100
|
+
appSlug: connection.defaultApp?.slug ?? null,
|
|
101
|
+
channel: connection.defaultApp?.channel ?? null,
|
|
102
|
+
runtimeVersion: connection.defaultApp?.runtimeVersion ?? null,
|
|
103
|
+
releaseWritesEnabled: connection.capabilities.releaseReliability,
|
|
104
|
+
},
|
|
105
|
+
adapter,
|
|
106
|
+
authorization: createLocalToolAuthorization(connection),
|
|
107
|
+
onError: (error, tool) => {
|
|
108
|
+
if (error instanceof Error && error.name === 'PublicToolError')
|
|
109
|
+
return;
|
|
110
|
+
console.error(`[OtaKit MCP] ${tool} failed`, error);
|
|
111
|
+
},
|
|
112
|
+
}), {
|
|
113
|
+
onerror: (error) => console.error('[OtaKit MCP] transport error', error),
|
|
114
|
+
});
|
|
115
|
+
const close = async () => {
|
|
116
|
+
await handle.close();
|
|
117
|
+
};
|
|
118
|
+
process.once('SIGINT', close);
|
|
119
|
+
process.once('SIGTERM', close);
|
|
120
|
+
});
|
|
121
|
+
});
|
|
122
|
+
//# sourceMappingURL=mcp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../src/commands/mcp.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"organization.d.ts","sourceRoot":"","sources":["../../src/commands/organization.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAkEpC,eAAO,MAAM,mBAAmB,SAGJ,CAAC"}
|