@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
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import { resolveAuthToken, resolveServerUrl } from '../lib/config.js';
|
|
3
|
+
import { CliError, runCommand } from '../lib/errors.js';
|
|
4
|
+
import { fetchAccount, initialOrganizationId, organizationDisplayLabel, promptForOrganization, shellLiteral, } from '../lib/organization.js';
|
|
5
|
+
import { readStoredAuthProfile, storeSelectedOrganization } from '../lib/token-store.js';
|
|
6
|
+
const selectCommand = new Command('select')
|
|
7
|
+
.description('Choose the default organization for commands not tied to an app')
|
|
8
|
+
.option('--server <url>', 'OtaKit console URL')
|
|
9
|
+
.action(async (options) => {
|
|
10
|
+
await runCommand(async () => {
|
|
11
|
+
const serverUrl = resolveServerUrl(process.cwd(), options.server);
|
|
12
|
+
const auth = await resolveAuthToken(serverUrl);
|
|
13
|
+
if (!auth) {
|
|
14
|
+
throw new CliError('Not authenticated. Run `otakit login`, or set OTAKIT_TOKEN.');
|
|
15
|
+
}
|
|
16
|
+
if (auth.token.startsWith('otakit_sk_')) {
|
|
17
|
+
throw new CliError('Organization API keys are already bound to one organization; no selection is needed.');
|
|
18
|
+
}
|
|
19
|
+
const account = await fetchAccount(serverUrl, auth.token);
|
|
20
|
+
const storedProfile = auth.source === 'file' ? await readStoredAuthProfile(serverUrl) : null;
|
|
21
|
+
const selected = await promptForOrganization(account.memberships, {
|
|
22
|
+
initialOrganizationId: initialOrganizationId(account, storedProfile),
|
|
23
|
+
});
|
|
24
|
+
if (auth.source !== 'file') {
|
|
25
|
+
console.log('');
|
|
26
|
+
console.log(`Selected organization: ${organizationDisplayLabel(selected, account.memberships)}.`);
|
|
27
|
+
console.log('OTAKIT_TOKEN is active, so use this organization in the same environment:');
|
|
28
|
+
console.log(`export OTAKIT_ORGANIZATION_ID=${shellLiteral(selected.organizationId)}`);
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
const stored = await storeSelectedOrganization(serverUrl, account.user.id, selected.organizationId);
|
|
32
|
+
if (!stored.ok) {
|
|
33
|
+
throw new CliError(stored.reason ?? 'Could not store the selected organization.');
|
|
34
|
+
}
|
|
35
|
+
console.log('');
|
|
36
|
+
console.log(`Default organization: ${organizationDisplayLabel(selected, account.memberships)}.`);
|
|
37
|
+
console.log('Restart running MCP connections to use the new default.');
|
|
38
|
+
});
|
|
39
|
+
});
|
|
40
|
+
export const organizationCommand = new Command('organization')
|
|
41
|
+
.alias('org')
|
|
42
|
+
.description('Manage the CLI organization context')
|
|
43
|
+
.addCommand(selectCommand);
|
|
44
|
+
//# sourceMappingURL=organization.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"organization.js","sourceRoot":"","sources":["../../src/commands/organization.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../../src/commands/register.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../../src/commands/register.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA8DpC,eAAO,MAAM,eAAe,SA8IxB,CAAC"}
|
|
@@ -1,14 +1,35 @@
|
|
|
1
1
|
import { Command } from 'commander';
|
|
2
2
|
import ora from 'ora';
|
|
3
|
-
import { resolveAuthToken, resolveServerUrl } from '../lib/config.js';
|
|
3
|
+
import { resolveAuthToken, resolveOrganizationOverride, resolveServerUrl, } from '../lib/config.js';
|
|
4
4
|
import { CliError, runCommand } from '../lib/errors.js';
|
|
5
5
|
import { fetchCli } from '../lib/http.js';
|
|
6
|
+
import { fetchAccount, initialOrganizationId, organizationById, promptForOrganization, shellLiteral, } from '../lib/organization.js';
|
|
7
|
+
import { readStoredAuthProfile, storeSelectedOrganization } from '../lib/token-store.js';
|
|
6
8
|
const APP_SLUG_REGEX = /^[A-Za-z0-9._-]{3,120}$/;
|
|
9
|
+
async function createApp(serverUrl, token, slug, organizationId) {
|
|
10
|
+
const headers = new Headers({
|
|
11
|
+
Authorization: `Bearer ${token}`,
|
|
12
|
+
'Content-Type': 'application/json',
|
|
13
|
+
});
|
|
14
|
+
if (organizationId)
|
|
15
|
+
headers.set('X-OtaKit-Organization-Id', organizationId);
|
|
16
|
+
const response = await fetchCli(`${serverUrl}/api/v1/apps`, {
|
|
17
|
+
method: 'POST',
|
|
18
|
+
headers,
|
|
19
|
+
body: JSON.stringify({ slug }),
|
|
20
|
+
});
|
|
21
|
+
const contentType = response.headers.get('content-type') ?? '';
|
|
22
|
+
const payload = contentType.includes('application/json')
|
|
23
|
+
? (await response.json())
|
|
24
|
+
: null;
|
|
25
|
+
return { response, payload };
|
|
26
|
+
}
|
|
7
27
|
export const registerCommand = new Command('register')
|
|
8
28
|
.description('Create a new app')
|
|
9
29
|
.requiredOption('--slug <slug>', 'App slug (for example: com.example.app)')
|
|
10
30
|
.option('--server <url>', 'Server URL')
|
|
11
31
|
.option('--token <token>', 'Auth token (or set OTAKIT_TOKEN env var)')
|
|
32
|
+
.option('--secret-key <key>', 'Alias for --token')
|
|
12
33
|
.action(async (options) => {
|
|
13
34
|
await runCommand(async () => {
|
|
14
35
|
const slug = options.slug.trim();
|
|
@@ -16,9 +37,12 @@ export const registerCommand = new Command('register')
|
|
|
16
37
|
throw new CliError('Invalid slug. Use 3-120 chars: letters, numbers, dot, underscore, hyphen.');
|
|
17
38
|
}
|
|
18
39
|
const serverUrl = resolveServerUrl(process.cwd(), options.server);
|
|
19
|
-
|
|
40
|
+
if (options.token && options.secretKey) {
|
|
41
|
+
throw new CliError('Use either `--token` or `--secret-key`, not both.');
|
|
42
|
+
}
|
|
43
|
+
const explicitToken = options.token?.trim() || options.secretKey?.trim();
|
|
20
44
|
const resolvedAuth = explicitToken
|
|
21
|
-
? { token: explicitToken }
|
|
45
|
+
? { token: explicitToken, source: 'env_token' }
|
|
22
46
|
: await resolveAuthToken(serverUrl);
|
|
23
47
|
if (!resolvedAuth?.token) {
|
|
24
48
|
throw new CliError([
|
|
@@ -28,20 +52,44 @@ export const registerCommand = new Command('register')
|
|
|
28
52
|
' 3. OTAKIT_TOKEN env var',
|
|
29
53
|
].join('\n'));
|
|
30
54
|
}
|
|
55
|
+
const organizationOverride = resolveOrganizationOverride();
|
|
56
|
+
let organizationId = organizationOverride ?? resolvedAuth.organizationId;
|
|
57
|
+
let account;
|
|
58
|
+
if (!organizationOverride && resolvedAuth.source === 'file') {
|
|
59
|
+
account = await fetchAccount(serverUrl, resolvedAuth.token);
|
|
60
|
+
const current = organizationById(account.memberships, organizationId);
|
|
61
|
+
if (!current) {
|
|
62
|
+
const storedProfile = await readStoredAuthProfile(serverUrl);
|
|
63
|
+
const selected = await promptForOrganization(account.memberships, {
|
|
64
|
+
initialOrganizationId: initialOrganizationId(account, storedProfile),
|
|
65
|
+
});
|
|
66
|
+
organizationId = selected.organizationId;
|
|
67
|
+
const stored = await storeSelectedOrganization(serverUrl, account.user.id, selected.organizationId);
|
|
68
|
+
if (!stored.ok) {
|
|
69
|
+
throw new CliError(stored.reason ?? 'Could not store the selected organization.');
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
31
73
|
const spinner = ora(`Creating app "${slug}"...`).start();
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
74
|
+
let { response, payload } = await createApp(serverUrl, resolvedAuth.token, slug, organizationId);
|
|
75
|
+
if (response.status === 409 &&
|
|
76
|
+
payload?.code === 'ORGANIZATION_SELECTION_REQUIRED' &&
|
|
77
|
+
!organizationId) {
|
|
78
|
+
spinner.stop();
|
|
79
|
+
account ??= await fetchAccount(serverUrl, resolvedAuth.token);
|
|
80
|
+
const selected = await promptForOrganization(account.memberships, {
|
|
81
|
+
initialOrganizationId: initialOrganizationId(account),
|
|
82
|
+
});
|
|
83
|
+
organizationId = selected.organizationId;
|
|
84
|
+
if (resolvedAuth.source === 'file') {
|
|
85
|
+
const stored = await storeSelectedOrganization(serverUrl, account.user.id, selected.organizationId);
|
|
86
|
+
if (!stored.ok) {
|
|
87
|
+
throw new CliError(stored.reason ?? 'Could not store the selected organization.');
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
spinner.start();
|
|
91
|
+
({ response, payload } = await createApp(serverUrl, resolvedAuth.token, slug, organizationId));
|
|
92
|
+
}
|
|
45
93
|
if (!response.ok) {
|
|
46
94
|
spinner.fail('Failed to create app');
|
|
47
95
|
const errorMessage = typeof payload?.error === 'string' ? payload.error : `API error (${response.status})`;
|
|
@@ -73,6 +121,13 @@ export const registerCommand = new Command('register')
|
|
|
73
121
|
console.log('Next steps:');
|
|
74
122
|
console.log('1. Build your web app');
|
|
75
123
|
console.log('2. Run `otakit upload --release`');
|
|
124
|
+
if (organizationId &&
|
|
125
|
+
resolvedAuth.source !== 'file' &&
|
|
126
|
+
!resolvedAuth.token.startsWith('otakit_sk_')) {
|
|
127
|
+
console.log('');
|
|
128
|
+
console.log('For later app-less commands in this environment:');
|
|
129
|
+
console.log(`export OTAKIT_ORGANIZATION_ID=${shellLiteral(organizationId)}`);
|
|
130
|
+
}
|
|
76
131
|
});
|
|
77
132
|
});
|
|
78
133
|
//# sourceMappingURL=register.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"register.js","sourceRoot":"","sources":["../../src/commands/register.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,GAAG,MAAM,KAAK,CAAC;AAEtB,OAAO,
|
|
1
|
+
{"version":3,"file":"register.js","sourceRoot":"","sources":["../../src/commands/register.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"release.d.ts","sourceRoot":"","sources":["../../src/commands/release.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAgBpC,eAAO,MAAM,cAAc,
|
|
1
|
+
{"version":3,"file":"release.d.ts","sourceRoot":"","sources":["../../src/commands/release.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAgBpC,eAAO,MAAM,cAAc,SAmDvB,CAAC"}
|
package/dist/commands/release.js
CHANGED
|
@@ -24,7 +24,10 @@ export const releaseCommand = new Command('release')
|
|
|
24
24
|
const forceLabel = forceImmediate ? ' (force immediate)' : '';
|
|
25
25
|
if (bundleId) {
|
|
26
26
|
const spinner = ora(`Releasing ${bundleId} to ${targetLabel}...`).start();
|
|
27
|
-
await api.release(channel, bundleId, { forceImmediate });
|
|
27
|
+
const result = await api.release(channel, bundleId, { forceImmediate });
|
|
28
|
+
if (result.publicationStatus === 'manifest_sync_pending') {
|
|
29
|
+
throw new CliError(`Release ${result.release.id} was recorded, but manifest synchronization is pending (operation ${result.operationId}). OtaKit will retry automatically; do not publish it again with a new version.`);
|
|
30
|
+
}
|
|
28
31
|
spinner.succeed(`Released ${bundleId} to ${targetLabel}${forceLabel}.`);
|
|
29
32
|
return;
|
|
30
33
|
}
|
|
@@ -36,7 +39,10 @@ export const releaseCommand = new Command('release')
|
|
|
36
39
|
}
|
|
37
40
|
const latest = bundles[0];
|
|
38
41
|
spinner.text = `Releasing ${latest.version} to ${targetLabel}...`;
|
|
39
|
-
await api.release(channel, latest.id, { forceImmediate });
|
|
42
|
+
const result = await api.release(channel, latest.id, { forceImmediate });
|
|
43
|
+
if (result.publicationStatus === 'manifest_sync_pending') {
|
|
44
|
+
throw new CliError(`Release ${result.release.id} was recorded, but manifest synchronization is pending (operation ${result.operationId}). OtaKit will retry automatically; do not publish it again with a new version.`);
|
|
45
|
+
}
|
|
40
46
|
spinner.succeed(`Released ${latest.version} to ${targetLabel}${forceLabel}.`);
|
|
41
47
|
});
|
|
42
48
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"release.js","sourceRoot":"","sources":["../../src/commands/release.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,GAAG,MAAM,KAAK,CAAC;AAEtB,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAStD,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,OAAO,CAAC,SAAS,CAAC;KACjD,WAAW,CAAC,yDAAyD,CAAC;KACtE,QAAQ,CAAC,YAAY,EAAE,sBAAsB,CAAC;KAC9C,MAAM,CAAC,eAAe,EAAE,iBAAiB,CAAC;KAC1C,MAAM,CAAC,gBAAgB,EAAE,qBAAqB,CAAC;KAC/C,MAAM,CAAC,qBAAqB,EAAE,0CAA0C,CAAC;KACzE,MAAM,CACL,mBAAmB,EACnB,6EAA6E,CAC9E;KACA,MAAM,CAAC,KAAK,EAAE,QAA4B,EAAE,OAAuB,EAAE,EAAE;IACtE,MAAM,UAAU,CAAC,KAAK,IAAI,EAAE;QAC1B,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC;YACjC,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,SAAS,EAAE,OAAO,CAAC,MAAM;SAC1B,CAAC,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,SAAS,CAAC,MAAM,CAAC,CAAC;QAClC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC3E,MAAM,WAAW,GAAG,OAAO,IAAI,cAAc,CAAC;QAC9C,MAAM,cAAc,GAAG,OAAO,CAAC,cAAc,KAAK,IAAI,CAAC;QACvD,MAAM,UAAU,GAAG,cAAc,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,EAAE,CAAC;QAE9D,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,OAAO,GAAG,GAAG,CAAC,aAAa,QAAQ,OAAO,WAAW,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC;YAC1E,MAAM,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,QAAQ,EAAE,EAAE,cAAc,EAAE,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"release.js","sourceRoot":"","sources":["../../src/commands/release.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"upload.d.ts","sourceRoot":"","sources":["../../src/commands/upload.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"upload.d.ts","sourceRoot":"","sources":["../../src/commands/upload.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA2EpC,eAAO,MAAM,aAAa,SAyKtB,CAAC"}
|
package/dist/commands/upload.js
CHANGED
|
@@ -7,6 +7,16 @@ import { CliError, runCommand } from '../lib/errors.js';
|
|
|
7
7
|
import { collectNativePackages, formatCompatibilityReport, } from '../lib/native-deps.js';
|
|
8
8
|
import { resolveBundlePath, resolveVersion, runUploadWorkflow } from '../lib/upload-workflow.js';
|
|
9
9
|
import { normalizeChannel } from '../lib/validate.js';
|
|
10
|
+
function parseAutoRevertThreshold(raw, flag, min, max) {
|
|
11
|
+
if (raw === undefined) {
|
|
12
|
+
return undefined;
|
|
13
|
+
}
|
|
14
|
+
const value = Number(raw);
|
|
15
|
+
if (!Number.isInteger(value) || value < min || value > max) {
|
|
16
|
+
throw new CliError(`${flag} must be an integer between ${min} and ${max} (got "${raw}")`);
|
|
17
|
+
}
|
|
18
|
+
return value;
|
|
19
|
+
}
|
|
10
20
|
function resolveStrategy(flagValue, configValue) {
|
|
11
21
|
const raw = flagValue?.trim().toLowerCase();
|
|
12
22
|
if (raw !== undefined && raw !== 'zip' && raw !== 'deltas') {
|
|
@@ -37,6 +47,9 @@ export const uploadCommand = new Command('upload')
|
|
|
37
47
|
.option('--package-json <path>', 'package.json used for native dependency detection')
|
|
38
48
|
.option('--node-modules <path>', 'node_modules used for native dependency detection')
|
|
39
49
|
.option('--force-immediate', 'With --release: devices apply and reload on their next check (emergency fixes)')
|
|
50
|
+
.option('--auto-revert', 'With --release: automatically revert this release if too many devices roll back (24h window)')
|
|
51
|
+
.option('--auto-revert-rate <percent>', 'With --auto-revert: rollback share that triggers the revert (1-95, default 20)')
|
|
52
|
+
.option('--auto-revert-min-sample <count>', 'With --auto-revert: minimum applied+rollback events before the rate is trusted (10-100000, default 50)')
|
|
40
53
|
.option('--encrypt', 'Encrypt the bundle with OTAKIT_ENCRYPTION_KEY (auto-enabled when the env var is set)')
|
|
41
54
|
.action(async (path, options) => {
|
|
42
55
|
await runCommand(async () => {
|
|
@@ -93,8 +106,17 @@ export const uploadCommand = new Command('upload')
|
|
|
93
106
|
if (options.forceImmediate === true && releaseChannel === undefined) {
|
|
94
107
|
console.warn('--force-immediate has no effect without --release; ignoring.');
|
|
95
108
|
}
|
|
109
|
+
if (options.autoRevert !== true &&
|
|
110
|
+
(options.autoRevertRate !== undefined || options.autoRevertMinSample !== undefined)) {
|
|
111
|
+
throw new CliError('--auto-revert-rate and --auto-revert-min-sample require --auto-revert.');
|
|
112
|
+
}
|
|
113
|
+
if (options.autoRevert === true && releaseChannel === undefined) {
|
|
114
|
+
console.warn('--auto-revert has no effect without --release; ignoring.');
|
|
115
|
+
}
|
|
116
|
+
const autoRevertRatePercent = parseAutoRevertThreshold(options.autoRevertRate, '--auto-revert-rate', 1, 95);
|
|
117
|
+
const autoRevertMinSample = parseAutoRevertThreshold(options.autoRevertMinSample, '--auto-revert-min-sample', 10, 100000);
|
|
96
118
|
const spinner = ora(strategy === 'deltas' ? 'Hashing bundle files...' : 'Creating zip archive...').start();
|
|
97
|
-
const
|
|
119
|
+
const uploadResult = await (async () => {
|
|
98
120
|
try {
|
|
99
121
|
const result = await runUploadWorkflow({
|
|
100
122
|
api,
|
|
@@ -105,12 +127,15 @@ export const uploadCommand = new Command('upload')
|
|
|
105
127
|
strategy,
|
|
106
128
|
nativePackages,
|
|
107
129
|
forceImmediate: options.forceImmediate === true,
|
|
130
|
+
autoRevert: options.autoRevert === true,
|
|
131
|
+
autoRevertRatePercent,
|
|
132
|
+
autoRevertMinSample,
|
|
108
133
|
encrypt: options.encrypt,
|
|
109
134
|
onStatus: (message) => {
|
|
110
135
|
spinner.text = message;
|
|
111
136
|
},
|
|
112
137
|
});
|
|
113
|
-
return result
|
|
138
|
+
return result;
|
|
114
139
|
}
|
|
115
140
|
catch (error) {
|
|
116
141
|
if (spinner.isSpinning) {
|
|
@@ -119,6 +144,10 @@ export const uploadCommand = new Command('upload')
|
|
|
119
144
|
throw error;
|
|
120
145
|
}
|
|
121
146
|
})();
|
|
147
|
+
const bundle = uploadResult.bundle;
|
|
148
|
+
if (uploadResult.release?.publicationStatus === 'manifest_sync_pending') {
|
|
149
|
+
throw new CliError(`Bundle uploaded and release ${uploadResult.release.release.id} was recorded, but manifest synchronization is pending (operation ${uploadResult.release.operationId}). OtaKit will retry automatically; do not upload or publish it again.`);
|
|
150
|
+
}
|
|
122
151
|
if (releaseChannel !== undefined) {
|
|
123
152
|
spinner.succeed(`Uploaded ${bundle.version} (${bundle.id}) and released to ${releaseChannel ?? 'base channel'}.`);
|
|
124
153
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"upload.js","sourceRoot":"","sources":["../../src/commands/upload.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,GAAG,MAAM,KAAK,CAAC;AAEtB,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAE,gCAAgC,EAAE,MAAM,wBAAwB,CAAC;AAC1E,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EACL,qBAAqB,EACrB,yBAAyB,GAE1B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AACjG,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"upload.js","sourceRoot":"","sources":["../../src/commands/upload.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"whoami.d.ts","sourceRoot":"","sources":["../../src/commands/whoami.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"whoami.d.ts","sourceRoot":"","sources":["../../src/commands/whoami.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAkBpC,eAAO,MAAM,aAAa,SAiGtB,CAAC"}
|
package/dist/commands/whoami.js
CHANGED
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
import { Command } from 'commander';
|
|
2
|
-
import {
|
|
2
|
+
import { ApiClient } from '../lib/api.js';
|
|
3
|
+
import { resolveAuthToken, resolveOrganizationOverride, resolveServerUrl } from '../lib/config.js';
|
|
3
4
|
import { CliError, runCommand } from '../lib/errors.js';
|
|
4
|
-
import {
|
|
5
|
+
import { fetchAccount, organizationById, organizationDisplayLabel } from '../lib/organization.js';
|
|
6
|
+
import { CLI_VERSION } from '../lib/version.js';
|
|
5
7
|
export const whoamiCommand = new Command('whoami')
|
|
6
8
|
.description('Show current authenticated user and organization context')
|
|
7
9
|
.option('--server <url>', 'Server URL')
|
|
10
|
+
.option('--json', 'Print machine-readable account details')
|
|
8
11
|
.action(async (options) => {
|
|
9
12
|
await runCommand(async () => {
|
|
10
13
|
const serverUrl = resolveServerUrl(process.cwd(), options.server);
|
|
@@ -12,27 +15,66 @@ export const whoamiCommand = new Command('whoami')
|
|
|
12
15
|
if (!auth) {
|
|
13
16
|
throw new CliError(['Not authenticated.', 'Run `otakit login`, or set OTAKIT_TOKEN.'].join('\n'));
|
|
14
17
|
}
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
18
|
+
if (auth.token.startsWith('otakit_sk_')) {
|
|
19
|
+
const client = new ApiClient({
|
|
20
|
+
appId: '00000000-0000-0000-0000-000000000000',
|
|
21
|
+
serverUrl,
|
|
22
|
+
authToken: auth.token,
|
|
23
|
+
authSource: auth.source,
|
|
24
|
+
}, CLI_VERSION);
|
|
25
|
+
const context = await client.request('/api/v1/context');
|
|
26
|
+
if (options.json) {
|
|
27
|
+
console.log(JSON.stringify({ credential: 'organization_key', organization: context.organization }, null, 2));
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
console.log('Credential: organization API key');
|
|
31
|
+
console.log(`Organization: ${context.organization.name}`);
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
const account = await fetchAccount(serverUrl, auth.token);
|
|
35
|
+
const overrideOrganizationId = resolveOrganizationOverride();
|
|
36
|
+
const effectiveOrganizationId = overrideOrganizationId ?? auth.organizationId;
|
|
37
|
+
const effectiveOrganization = organizationById(account.memberships, effectiveOrganizationId);
|
|
38
|
+
if (options.json) {
|
|
39
|
+
console.log(JSON.stringify({
|
|
40
|
+
...account,
|
|
41
|
+
cli: {
|
|
42
|
+
authSource: auth.source,
|
|
43
|
+
organizationId: effectiveOrganizationId ?? null,
|
|
44
|
+
organizationSource: overrideOrganizationId
|
|
45
|
+
? 'environment'
|
|
46
|
+
: auth.organizationId
|
|
47
|
+
? 'stored_profile'
|
|
48
|
+
: 'none',
|
|
49
|
+
},
|
|
50
|
+
}, null, 2));
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
console.log(`User: ${account.user.email}`);
|
|
27
54
|
console.log(`Auth source: ${auth.source}`);
|
|
55
|
+
if (effectiveOrganization) {
|
|
56
|
+
const prefix = overrideOrganizationId ? 'Environment organization' : 'Default organization';
|
|
57
|
+
console.log(`${prefix}: ${organizationDisplayLabel(effectiveOrganization, account.memberships)}`);
|
|
58
|
+
}
|
|
59
|
+
else if (effectiveOrganizationId) {
|
|
60
|
+
console.log('Organization selection: unavailable or no longer accessible');
|
|
61
|
+
console.log('Run `otakit organization select` to choose a current membership.');
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
console.log('Default organization: not selected');
|
|
65
|
+
if (account.memberships.length > 1) {
|
|
66
|
+
console.log('Run `otakit organization select` to choose one.');
|
|
67
|
+
}
|
|
68
|
+
}
|
|
28
69
|
console.log('');
|
|
29
|
-
if (
|
|
70
|
+
if (account.memberships.length === 0) {
|
|
30
71
|
console.log('Memberships: none');
|
|
31
72
|
return;
|
|
32
73
|
}
|
|
33
74
|
console.log('Memberships:');
|
|
34
|
-
for (const membership of
|
|
35
|
-
|
|
75
|
+
for (const membership of account.memberships) {
|
|
76
|
+
const marker = membership.organizationId === effectiveOrganizationId ? '*' : '-';
|
|
77
|
+
console.log(` ${marker} ${organizationDisplayLabel(membership, account.memberships)}`);
|
|
36
78
|
}
|
|
37
79
|
});
|
|
38
80
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"whoami.js","sourceRoot":"","sources":["../../src/commands/whoami.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"whoami.js","sourceRoot":"","sources":["../../src/commands/whoami.ts"],"names":[],"mappings":"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"}
|