@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.
Files changed (70) hide show
  1. package/README.md +42 -3
  2. package/dist/commands/connect.d.ts +3 -0
  3. package/dist/commands/connect.d.ts.map +1 -0
  4. package/dist/commands/connect.js +216 -0
  5. package/dist/commands/connect.js.map +1 -0
  6. package/dist/commands/login.d.ts.map +1 -1
  7. package/dist/commands/login.js +40 -48
  8. package/dist/commands/login.js.map +1 -1
  9. package/dist/commands/mcp.d.ts +4 -0
  10. package/dist/commands/mcp.d.ts.map +1 -0
  11. package/dist/commands/mcp.js +122 -0
  12. package/dist/commands/mcp.js.map +1 -0
  13. package/dist/commands/organization.d.ts +3 -0
  14. package/dist/commands/organization.d.ts.map +1 -0
  15. package/dist/commands/organization.js +44 -0
  16. package/dist/commands/organization.js.map +1 -0
  17. package/dist/commands/register.d.ts.map +1 -1
  18. package/dist/commands/register.js +71 -16
  19. package/dist/commands/register.js.map +1 -1
  20. package/dist/commands/release.d.ts.map +1 -1
  21. package/dist/commands/release.js +8 -2
  22. package/dist/commands/release.js.map +1 -1
  23. package/dist/commands/upload.d.ts.map +1 -1
  24. package/dist/commands/upload.js +31 -2
  25. package/dist/commands/upload.js.map +1 -1
  26. package/dist/commands/whoami.d.ts.map +1 -1
  27. package/dist/commands/whoami.js +59 -17
  28. package/dist/commands/whoami.js.map +1 -1
  29. package/dist/index.js +4494 -21
  30. package/dist/index.js.map +7 -1
  31. package/dist/lib/api.d.ts +29 -6
  32. package/dist/lib/api.d.ts.map +1 -1
  33. package/dist/lib/api.js +55 -15
  34. package/dist/lib/api.js.map +1 -1
  35. package/dist/lib/config.d.ts +7 -0
  36. package/dist/lib/config.d.ts.map +1 -1
  37. package/dist/lib/config.js +18 -4
  38. package/dist/lib/config.js.map +1 -1
  39. package/dist/lib/login-flow.d.ts +13 -0
  40. package/dist/lib/login-flow.d.ts.map +1 -0
  41. package/dist/lib/login-flow.js +89 -0
  42. package/dist/lib/login-flow.js.map +1 -0
  43. package/dist/lib/native-deps.d.ts +2 -0
  44. package/dist/lib/native-deps.d.ts.map +1 -1
  45. package/dist/lib/native-deps.js +12 -2
  46. package/dist/lib/native-deps.js.map +1 -1
  47. package/dist/lib/organization.d.ts +27 -0
  48. package/dist/lib/organization.d.ts.map +1 -0
  49. package/dist/lib/organization.js +86 -0
  50. package/dist/lib/organization.js.map +1 -0
  51. package/dist/lib/project-inspect.d.ts +27 -0
  52. package/dist/lib/project-inspect.d.ts.map +1 -0
  53. package/dist/lib/project-inspect.js +131 -0
  54. package/dist/lib/project-inspect.js.map +1 -0
  55. package/dist/lib/token-store.d.ts +8 -2
  56. package/dist/lib/token-store.d.ts.map +1 -1
  57. package/dist/lib/token-store.js +105 -67
  58. package/dist/lib/token-store.js.map +1 -1
  59. package/dist/lib/upload-workflow.d.ts +10 -1
  60. package/dist/lib/upload-workflow.d.ts.map +1 -1
  61. package/dist/lib/upload-workflow.js +56 -12
  62. package/dist/lib/upload-workflow.js.map +1 -1
  63. package/dist/lib/version.d.ts.map +1 -1
  64. package/dist/lib/version.js +16 -5
  65. package/dist/lib/version.js.map +1 -1
  66. package/dist/mcp/local-adapter.d.ts +97 -0
  67. package/dist/mcp/local-adapter.d.ts.map +1 -0
  68. package/dist/mcp/local-adapter.js +664 -0
  69. package/dist/mcp/local-adapter.js.map +1 -0
  70. 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/api/v1`
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 `(appId, channel)` is what
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,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const connectCommand: Command;
3
+ //# sourceMappingURL=connect.d.ts.map
@@ -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;AA6BpC,eAAO,MAAM,YAAY,SAsFrB,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"}
@@ -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 { CliError, runCommand } from '../lib/errors.js';
5
- import { fetchCli, parseApiError } from '../lib/http.js';
6
- import { ask } from '../lib/prompt.js';
7
- import { storeAccessToken } from '../lib/token-store.js';
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 emailInput = options.email?.trim().toLowerCase() || (await ask('Email: ')).trim().toLowerCase();
21
- if (!emailInput) {
22
- throw new CliError('Email is required.');
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
- const sendSpinner = ora('Sending verification code...').start();
25
- const sendOtpResponse = await fetchCli(`${serverUrl}/api/auth/email-otp/send-verification-otp`, {
26
- method: 'POST',
27
- headers: {
28
- 'Content-Type': 'application/json',
29
- },
30
- body: JSON.stringify({ email: emailInput, type: 'sign-in' }),
31
- });
32
- if (!sendOtpResponse.ok) {
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
- const verifySpinner = ora('Verifying code...').start();
42
- const signInResponse = await fetchCli(`${serverUrl}/api/auth/sign-in/email-otp`, {
43
- method: 'POST',
44
- headers: {
45
- 'Content-Type': 'application/json',
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
- const payload = (await signInResponse.json());
54
- const token = typeof payload.token === 'string' ? payload.token.trim() : '';
55
- if (!token) {
56
- verifySpinner.fail('Sign-in failed');
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 storeAccessToken(serverUrl, token);
60
- verifySpinner.succeed('Signed in');
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 = typeof payload.user?.email === 'string' ? ` as ${payload.user.email}` : '';
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=${toShellLiteral(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":"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"}
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { Command } from 'commander';
2
+ export declare function localMcpContextPath(appId: string | null): string;
3
+ export declare const mcpCommand: Command;
4
+ //# sourceMappingURL=mcp.d.ts.map
@@ -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,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const organizationCommand: Command;
3
+ //# sourceMappingURL=organization.d.ts.map
@@ -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"}