@scalebun/cli 1.0.0 → 1.4.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 (57) hide show
  1. package/lib/api/client.d.ts +8 -0
  2. package/lib/api/client.d.ts.map +1 -1
  3. package/lib/api/client.js +70 -2
  4. package/lib/api/client.js.map +1 -1
  5. package/lib/commands/ci-init.d.ts +0 -6
  6. package/lib/commands/ci-init.d.ts.map +1 -1
  7. package/lib/commands/ci-init.js +172 -28
  8. package/lib/commands/ci-init.js.map +1 -1
  9. package/lib/commands/doctor.d.ts +8 -0
  10. package/lib/commands/doctor.d.ts.map +1 -0
  11. package/lib/commands/doctor.js +252 -0
  12. package/lib/commands/doctor.js.map +1 -0
  13. package/lib/commands/login.d.ts +28 -4
  14. package/lib/commands/login.d.ts.map +1 -1
  15. package/lib/commands/login.js +132 -51
  16. package/lib/commands/login.js.map +1 -1
  17. package/lib/commands/ota-bundle.d.ts.map +1 -1
  18. package/lib/commands/ota-bundle.js +2 -0
  19. package/lib/commands/ota-bundle.js.map +1 -1
  20. package/lib/commands/ota-delete-bundle.d.ts +8 -0
  21. package/lib/commands/ota-delete-bundle.d.ts.map +1 -1
  22. package/lib/commands/ota-delete-bundle.js +60 -0
  23. package/lib/commands/ota-delete-bundle.js.map +1 -1
  24. package/lib/commands/ota-keys.d.ts +14 -0
  25. package/lib/commands/ota-keys.d.ts.map +1 -0
  26. package/lib/commands/ota-keys.js +200 -0
  27. package/lib/commands/ota-keys.js.map +1 -0
  28. package/lib/commands/ota-publish.d.ts +10 -0
  29. package/lib/commands/ota-publish.d.ts.map +1 -1
  30. package/lib/commands/ota-publish.js +251 -34
  31. package/lib/commands/ota-publish.js.map +1 -1
  32. package/lib/commands/ota-rollout.d.ts +3 -0
  33. package/lib/commands/ota-rollout.d.ts.map +1 -0
  34. package/lib/commands/ota-rollout.js +235 -0
  35. package/lib/commands/ota-rollout.js.map +1 -0
  36. package/lib/commands/quickstart.d.ts +4 -0
  37. package/lib/commands/quickstart.d.ts.map +1 -0
  38. package/lib/commands/quickstart.js +274 -0
  39. package/lib/commands/quickstart.js.map +1 -0
  40. package/lib/index.js +20 -1
  41. package/lib/index.js.map +1 -1
  42. package/lib/utils/bundle.d.ts +86 -0
  43. package/lib/utils/bundle.d.ts.map +1 -1
  44. package/lib/utils/bundle.js +244 -14
  45. package/lib/utils/bundle.js.map +1 -1
  46. package/lib/utils/credentials.d.ts +12 -1
  47. package/lib/utils/credentials.d.ts.map +1 -1
  48. package/lib/utils/credentials.js +40 -1
  49. package/lib/utils/credentials.js.map +1 -1
  50. package/lib/utils/transportSecurity.d.ts +36 -0
  51. package/lib/utils/transportSecurity.d.ts.map +1 -0
  52. package/lib/utils/transportSecurity.js +74 -0
  53. package/lib/utils/transportSecurity.js.map +1 -0
  54. package/lib/utils/ui.d.ts.map +1 -1
  55. package/lib/utils/ui.js +2 -0
  56. package/lib/utils/ui.js.map +1 -1
  57. package/package.json +1 -1
@@ -0,0 +1,235 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.registerOtaRolloutCommands = registerOtaRolloutCommands;
37
+ const credentials_1 = require("../utils/credentials");
38
+ const client_1 = require("../api/client");
39
+ function client() {
40
+ const creds = (0, credentials_1.readCredentials)();
41
+ if (!creds) {
42
+ console.error('❌ Not logged in. Run `scalebun login` first.');
43
+ process.exit(1);
44
+ }
45
+ return new client_1.ApiClient(creds);
46
+ }
47
+ /**
48
+ * Resolve which release to act on.
49
+ *
50
+ * `--release-id` is explicit and always wins. Otherwise we take the single
51
+ * ACTIVE release, and refuse when that is ambiguous rather than guessing —
52
+ * picking "the newest" would eventually roll back the wrong thing on an app
53
+ * running an experiment or a multi-platform release, and this is a command
54
+ * people reach for during an incident.
55
+ */
56
+ async function resolveRelease(api, appId, releaseId) {
57
+ if (releaseId) {
58
+ const all = await api.get(`/saas/apps/${appId}/ota/releases`);
59
+ const found = Array.isArray(all) ? all.find((r) => r.id === releaseId) : undefined;
60
+ if (!found) {
61
+ console.error(`❌ Release ${releaseId} not found on app ${appId}.`);
62
+ process.exit(1);
63
+ }
64
+ return found;
65
+ }
66
+ const all = await api.get(`/saas/apps/${appId}/ota/releases`);
67
+ const active = (Array.isArray(all) ? all : []).filter((r) => r.status === 'ACTIVE');
68
+ if (active.length === 0) {
69
+ console.error('❌ No ACTIVE release on this app. Pass --release-id explicitly.');
70
+ process.exit(1);
71
+ }
72
+ if (active.length > 1) {
73
+ console.error(`❌ ${active.length} ACTIVE releases — refusing to guess. Pass --release-id:\n` +
74
+ active
75
+ .map((r) => ` ${r.id} v${r.bundle?.version ?? '?'} ${r.bundle?.platform ?? ''} ` +
76
+ `@ ${r.rolloutPercent}%`)
77
+ .join('\n'));
78
+ process.exit(1);
79
+ }
80
+ return active[0];
81
+ }
82
+ function describe(r) {
83
+ return `v${r.bundle?.version ?? '?'} (${r.bundle?.platform ?? '?'}) — ${r.status} @ ${r.rolloutPercent}%`;
84
+ }
85
+ function registerOtaRolloutCommands(ota) {
86
+ // ── releases ──────────────────────────────────────────────────────────────
87
+ ota
88
+ .command('releases')
89
+ .description('List releases and their current rollout state')
90
+ .requiredOption('--app-id <id>', 'Scalebun application ID')
91
+ .action(async (opts) => {
92
+ const api = client();
93
+ try {
94
+ const all = await api.get(`/saas/apps/${opts.appId}/ota/releases`);
95
+ const rows = Array.isArray(all) ? all : [];
96
+ if (rows.length === 0) {
97
+ console.log('No releases on this app yet.');
98
+ return;
99
+ }
100
+ console.log('');
101
+ for (const r of rows) {
102
+ const flag = r.status === 'ACTIVE' ? '▶' : r.status === 'PAUSED' ? '⏸' : ' ';
103
+ console.log(`${flag} ${describe(r)}`);
104
+ console.log(` id: ${r.id}`);
105
+ if (r.targetAppVersion)
106
+ console.log(` targets: ${r.targetAppVersion}`);
107
+ }
108
+ console.log('');
109
+ }
110
+ catch (err) {
111
+ console.error(`❌ ${err.message}`);
112
+ process.exit(1);
113
+ }
114
+ });
115
+ // ── rollout ───────────────────────────────────────────────────────────────
116
+ ota
117
+ .command('rollout')
118
+ .description('Set the rollout percentage on a release')
119
+ .requiredOption('--app-id <id>', 'Scalebun application ID')
120
+ .requiredOption('--percent <n>', 'Target rollout percentage (0-100)')
121
+ .option('--release-id <id>', 'Release to change (defaults to the single ACTIVE release)')
122
+ .action(async (opts) => {
123
+ const percent = Number(opts.percent);
124
+ if (!Number.isInteger(percent) || percent < 0 || percent > 100) {
125
+ console.error(`❌ --percent must be a whole number 0-100 (got "${opts.percent}").`);
126
+ process.exit(1);
127
+ }
128
+ const api = client();
129
+ try {
130
+ const release = await resolveRelease(api, opts.appId, opts.releaseId);
131
+ if (release.status !== 'ACTIVE') {
132
+ console.error(`❌ Release is ${release.status}, not ACTIVE. ` +
133
+ `Use \`ota resume\` before changing its rollout.`);
134
+ process.exit(1);
135
+ }
136
+ console.log(`🎯 ${describe(release)} → ${percent}%`);
137
+ await api.patch(`/saas/apps/${opts.appId}/ota/releases/${release.id}`, {
138
+ rolloutPercent: percent,
139
+ });
140
+ console.log(`✅ Rollout set to ${percent}%. Takes effect on each device's next check.`);
141
+ }
142
+ catch (err) {
143
+ console.error(`❌ ${err.message}`);
144
+ process.exit(1);
145
+ }
146
+ });
147
+ // ── pause ─────────────────────────────────────────────────────────────────
148
+ ota
149
+ .command('pause')
150
+ .description('Pause a release — no new devices receive it')
151
+ .requiredOption('--app-id <id>', 'Scalebun application ID')
152
+ .option('--release-id <id>', 'Release to pause (defaults to the single ACTIVE release)')
153
+ .action(async (opts) => {
154
+ const api = client();
155
+ try {
156
+ const release = await resolveRelease(api, opts.appId, opts.releaseId);
157
+ console.log(`⏸ Pausing ${describe(release)}`);
158
+ await api.patch(`/saas/apps/${opts.appId}/ota/releases/${release.id}`, {
159
+ status: 'PAUSED',
160
+ });
161
+ console.log('✅ Paused. Devices that already installed this bundle KEEP running it — ' +
162
+ 'pausing stops distribution, it does not revert anyone. Use `ota rollback` for that.');
163
+ }
164
+ catch (err) {
165
+ console.error(`❌ ${err.message}`);
166
+ process.exit(1);
167
+ }
168
+ });
169
+ // ── resume ────────────────────────────────────────────────────────────────
170
+ ota
171
+ .command('resume')
172
+ .description('Resume a paused release')
173
+ .requiredOption('--app-id <id>', 'Scalebun application ID')
174
+ .requiredOption('--release-id <id>', 'Release to resume')
175
+ .action(async (opts) => {
176
+ const api = client();
177
+ try {
178
+ console.log(`▶ Resuming release ${opts.releaseId}`);
179
+ await api.patch(`/saas/apps/${opts.appId}/ota/releases/${opts.releaseId}`, {
180
+ status: 'ACTIVE',
181
+ });
182
+ console.log('✅ Resumed at its existing rollout percentage.');
183
+ }
184
+ catch (err) {
185
+ console.error(`❌ ${err.message}`);
186
+ process.exit(1);
187
+ }
188
+ });
189
+ // ── rollback ──────────────────────────────────────────────────────────────
190
+ ota
191
+ .command('rollback')
192
+ .description('Roll back a release — devices revert to the previous bundle')
193
+ .requiredOption('--app-id <id>', 'Scalebun application ID')
194
+ .option('--release-id <id>', 'Release to roll back (defaults to the single ACTIVE release)')
195
+ .option('--yes', 'Skip the confirmation prompt (required in CI)')
196
+ .action(async (opts) => {
197
+ const api = client();
198
+ try {
199
+ const release = await resolveRelease(api, opts.appId, opts.releaseId);
200
+ // Rollback moves every device on this release back to their previous
201
+ // bundle. In an interactive shell that deserves a confirmation; in CI
202
+ // there is no TTY to prompt on, so --yes is mandatory rather than
203
+ // silently assumed.
204
+ if (!opts.yes) {
205
+ if (!process.stdin.isTTY) {
206
+ console.error('❌ Refusing to roll back without confirmation. Pass --yes to proceed in CI.');
207
+ process.exit(1);
208
+ }
209
+ const readline = await Promise.resolve().then(() => __importStar(require('readline')));
210
+ const rl = readline.createInterface({
211
+ input: process.stdin,
212
+ output: process.stdout,
213
+ });
214
+ const answer = await new Promise((resolve) => rl.question(`⚠️ Roll back ${describe(release)}?\n` +
215
+ ` Every device on this release reverts to its previous bundle. Type "yes": `, (a) => {
216
+ rl.close();
217
+ resolve(a);
218
+ }));
219
+ if (answer.trim().toLowerCase() !== 'yes') {
220
+ console.log('Aborted — nothing changed.');
221
+ return;
222
+ }
223
+ }
224
+ console.log(`⏮ Rolling back ${describe(release)}`);
225
+ await api.post(`/saas/apps/${opts.appId}/ota/releases/${release.id}/rollback`);
226
+ console.log('✅ Rolled back. Devices revert on their next check — this is not instant, ' +
227
+ 'and a device that is offline reverts when it next comes online.');
228
+ }
229
+ catch (err) {
230
+ console.error(`❌ ${err.message}`);
231
+ process.exit(1);
232
+ }
233
+ });
234
+ }
235
+ //# sourceMappingURL=ota-rollout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ota-rollout.js","sourceRoot":"","sources":["../../src/commands/ota-rollout.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerAppsCommand(program: Command): void;
3
+ export declare function registerQuickstartCommand(program: Command): void;
4
+ //# sourceMappingURL=quickstart.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quickstart.d.ts","sourceRoot":"","sources":["../../src/commands/quickstart.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAsFpC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA8D1D;AAED,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAoJhE"}
@@ -0,0 +1,274 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.registerAppsCommand = registerAppsCommand;
40
+ exports.registerQuickstartCommand = registerQuickstartCommand;
41
+ const crypto = __importStar(require("crypto"));
42
+ const fs = __importStar(require("fs"));
43
+ const path = __importStar(require("path"));
44
+ const readline = __importStar(require("readline"));
45
+ const chalk_1 = __importDefault(require("chalk"));
46
+ const credentials_1 = require("../utils/credentials");
47
+ const client_1 = require("../api/client");
48
+ const login_1 = require("./login");
49
+ const doctor_1 = require("./doctor");
50
+ const ota_keys_1 = require("./ota-keys");
51
+ /** client key with the middle masked — enough to recognize, useless to steal. */
52
+ function maskKey(key) {
53
+ return key.length <= 16 ? key : `${key.slice(0, 12)}…${key.slice(-4)}`;
54
+ }
55
+ /** Every app the account can see, flattened for listing/selection. */
56
+ async function fetchAllApps(client) {
57
+ const orgs = await client.get('/organizations');
58
+ const entries = [];
59
+ for (const org of orgs ?? []) {
60
+ const projects = await client.get(`/organizations/${org.id}/projects`);
61
+ for (const p of projects ?? []) {
62
+ const detail = await client.get(`/organizations/${org.id}/projects/${p.id}`);
63
+ for (const app of detail?.apps ?? []) {
64
+ entries.push({ orgId: org.id, orgName: org.name, projectName: p.name, app });
65
+ }
66
+ }
67
+ }
68
+ return entries;
69
+ }
70
+ function registerAppsCommand(program) {
71
+ program
72
+ .command('apps')
73
+ .description('List every app you can publish to, with the IDs the other commands need')
74
+ .option('--keys', 'Also show each app\'s environments and SDK client keys (masked)')
75
+ .action(async (opts) => {
76
+ const creds = (0, credentials_1.readCredentials)();
77
+ if (!creds) {
78
+ console.error('❌ Not logged in. Run `scalebun login` first.');
79
+ process.exit(1);
80
+ }
81
+ const client = new client_1.ApiClient(creds);
82
+ let entries;
83
+ try {
84
+ entries = await fetchAllApps(client);
85
+ }
86
+ catch (err) {
87
+ console.error(`❌ Could not list apps: ${err.message}`);
88
+ process.exit(1);
89
+ return;
90
+ }
91
+ if (!entries.length) {
92
+ console.log('\nNo apps yet. Create one in the dashboard (it takes a minute), then re-run this.\n');
93
+ return;
94
+ }
95
+ console.log('');
96
+ let lastGroup = '';
97
+ for (const e of entries) {
98
+ const group = `${e.orgName} / ${e.projectName}`;
99
+ if (group !== lastGroup) {
100
+ console.log(chalk_1.default.bold(` ${group}`));
101
+ lastGroup = group;
102
+ }
103
+ console.log(` • ${e.app.name.padEnd(24)} ${chalk_1.default.dim(e.app.platform ?? '?')} app-id: ${chalk_1.default.cyan(e.app.id)}`);
104
+ if (opts.keys) {
105
+ try {
106
+ const envs = await client.get(`/apps/${e.app.id}/environments`);
107
+ for (const env of envs ?? []) {
108
+ const keys = await client.get(`/environments/${env.id}/sdk-keys`);
109
+ const active = (keys ?? []).filter((k) => k.status === 'active');
110
+ const label = `${env.name}${env.type ? ` (${env.type})` : ''}`;
111
+ if (!active.length) {
112
+ console.log(` ${label}: ${chalk_1.default.dim('no active client key')}`);
113
+ }
114
+ for (const k of active) {
115
+ console.log(` ${label}: ${chalk_1.default.green(maskKey(k.clientKey))} ${chalk_1.default.dim(k.name ?? '')}`);
116
+ }
117
+ }
118
+ }
119
+ catch {
120
+ console.log(chalk_1.default.dim(' (could not load environments/keys)'));
121
+ }
122
+ }
123
+ }
124
+ console.log('');
125
+ console.log(chalk_1.default.dim(' Next: scalebun ota publish --app-id <id> --channel production --platform android'));
126
+ console.log('');
127
+ });
128
+ }
129
+ function registerQuickstartCommand(program) {
130
+ program
131
+ .command('quickstart')
132
+ .description('Guided walkthrough: login → pick your app → keys → health check → first release')
133
+ .option('--app-id <id>', 'Skip app selection and use this app')
134
+ .action(async (opts) => {
135
+ const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
136
+ const ask = (q) => new Promise((r) => rl.question(q, r));
137
+ const step = (n, title) => console.log(chalk_1.default.bold.cyan(`\n── Step ${n}/6 · ${title} ${'─'.repeat(Math.max(1, 44 - title.length))}`));
138
+ try {
139
+ console.log(chalk_1.default.bold('\n⚡ Scalebun quickstart — from zero to your first OTA update.\n'));
140
+ console.log(chalk_1.default.dim(' Everything below runs against your real account. Ctrl+C any time.'));
141
+ // ── 1. Login ────────────────────────────────────────────────────────
142
+ step(1, 'Sign in');
143
+ let creds = (0, credentials_1.readCredentials)();
144
+ if (creds) {
145
+ try {
146
+ const me = await new client_1.ApiClient(creds).get('/auth/me');
147
+ console.log(`✅ Already signed in as ${me.email} (${creds.apiUrl})`);
148
+ }
149
+ catch {
150
+ console.log('⚠️ Stored token no longer works — signing in again.');
151
+ creds = null;
152
+ }
153
+ }
154
+ if (!creds) {
155
+ await (0, login_1.runLogin)({ expiresDays: '90' });
156
+ creds = (0, credentials_1.readCredentials)();
157
+ if (!creds)
158
+ process.exit(1);
159
+ }
160
+ const client = new client_1.ApiClient(creds);
161
+ // ── 2. Pick the app ─────────────────────────────────────────────────
162
+ step(2, 'Pick your app');
163
+ let appId = opts.appId ?? null;
164
+ let appLabel = appId ?? '';
165
+ if (!appId) {
166
+ const entries = await fetchAllApps(client);
167
+ if (!entries.length) {
168
+ console.log('❌ Your account has no apps yet.');
169
+ console.log(' Create one in the dashboard (Organization → Project → App), then re-run quickstart.');
170
+ process.exit(1);
171
+ }
172
+ if (entries.length === 1) {
173
+ appId = entries[0].app.id;
174
+ appLabel = entries[0].app.name;
175
+ console.log(`✅ Using your only app: ${appLabel} (${appId})`);
176
+ }
177
+ else {
178
+ entries.forEach((e, i) => console.log(` ${i + 1}. ${e.orgName} / ${e.projectName} / ${chalk_1.default.bold(e.app.name)} ${chalk_1.default.dim(e.app.id)}`));
179
+ const n = parseInt(await ask('\nWhich app? [1]: '), 10) || 1;
180
+ const chosen = entries[Math.min(Math.max(n, 1), entries.length) - 1];
181
+ appId = chosen.app.id;
182
+ appLabel = chosen.app.name;
183
+ console.log(`✅ ${chosen.app.name} (${appId})`);
184
+ }
185
+ }
186
+ // ── 3. SDK client key ───────────────────────────────────────────────
187
+ step(3, 'SDK client key');
188
+ console.log(chalk_1.default.dim(' The client key is what your app ships with — it scopes every SDK call to this app.'));
189
+ let clientKeyForSnippet = null;
190
+ try {
191
+ const envs = await client.get(`/apps/${appId}/environments`);
192
+ for (const env of envs ?? []) {
193
+ const keys = await client.get(`/environments/${env.id}/sdk-keys`);
194
+ const active = (keys ?? []).filter((k) => k.status === 'active');
195
+ console.log(` ${env.name}: ${active.length ? active.map((k) => maskKey(k.clientKey)).join(', ') : chalk_1.default.dim('no active key')}`);
196
+ if (active.length && !clientKeyForSnippet)
197
+ clientKeyForSnippet = active[0].clientKey;
198
+ }
199
+ if (!clientKeyForSnippet && envs?.length) {
200
+ const yn = (await ask('\n No active client key. Create one now? [Y/n]: ')).trim().toLowerCase();
201
+ if (yn !== 'n') {
202
+ const made = await client.post(`/environments/${envs[0].id}/sdk-keys`, {
203
+ name: 'quickstart key',
204
+ });
205
+ clientKeyForSnippet = made.clientKey;
206
+ console.log(` 🔑 Created: ${made.clientKey}`);
207
+ if (made.secretKey) {
208
+ console.log(chalk_1.default.yellow(` Secret key (shown ONCE, store it now): ${made.secretKey}`));
209
+ }
210
+ }
211
+ }
212
+ }
213
+ catch (err) {
214
+ console.log(` ⚠️ Could not read keys (${err.message}) — grab the client key from the dashboard instead.`);
215
+ }
216
+ console.log('\n Wire the SDK in your app entry point:\n');
217
+ console.log(chalk_1.default.green(' import { ScaleBunProvider } from \'@scalebun/react-native\';\n'));
218
+ console.log(chalk_1.default.green(' <ScaleBunProvider config={{'));
219
+ console.log(chalk_1.default.green(` clientKey: '${clientKeyForSnippet ?? '<your client key>'}',`));
220
+ console.log(chalk_1.default.green(' }}>'));
221
+ console.log(chalk_1.default.green(' <App />'));
222
+ console.log(chalk_1.default.green(' </ScaleBunProvider>'));
223
+ // ── 4. Bundle signing key ───────────────────────────────────────────
224
+ step(4, 'Bundle signing (recommended)');
225
+ const keyPath = path.resolve('.scalebun', 'ota-signing-key.pem');
226
+ if (fs.existsSync(keyPath)) {
227
+ console.log(`✅ Signing key already present: ${keyPath}`);
228
+ }
229
+ else {
230
+ const yn = (await ask(' No signing key found. Generate + register one now? [Y/n]: ')).trim().toLowerCase();
231
+ if (yn !== 'n') {
232
+ const { publicKey, privateKey } = crypto.generateKeyPairSync('ed25519');
233
+ fs.mkdirSync(path.dirname(keyPath), { recursive: true });
234
+ fs.writeFileSync(keyPath, privateKey.export({ type: 'pkcs8', format: 'pem' }), { mode: 0o600 });
235
+ const publicHex = (0, ota_keys_1.rawPublicKeyHex)(publicKey);
236
+ await client.post(`/saas/apps/${appId}/ota/signing-keys`, {
237
+ publicKey: publicHex,
238
+ name: `quickstart ${new Date().toISOString().slice(0, 10)}`,
239
+ });
240
+ console.log(` 🔏 Key generated (${keyPath}) and public half registered.`);
241
+ console.log(chalk_1.default.yellow(' Add `.scalebun/` to .gitignore — the private key must never be committed.'));
242
+ console.log(` Pin it in the app for end-to-end authenticity: ota: { publicSigningKey: '${publicHex}' }`);
243
+ }
244
+ else {
245
+ console.log(chalk_1.default.dim(' Skipped — bundles will ship on SHA-256 integrity alone.'));
246
+ }
247
+ }
248
+ // ── 5. Project health ───────────────────────────────────────────────
249
+ step(5, 'Project health check');
250
+ console.log(chalk_1.default.dim(' Running `scalebun doctor` on the current directory…'));
251
+ await (0, doctor_1.runDoctor)(); // exits on blocking failures, same as the standalone command
252
+ // ── 6. First release ────────────────────────────────────────────────
253
+ step(6, 'Ship your first update');
254
+ console.log(' From your app\'s directory:\n');
255
+ console.log(chalk_1.default.green(` scalebun ota publish --app-id ${appId} --channel production --platform android \\`));
256
+ console.log(chalk_1.default.green(' --release-note "First OTA release"'));
257
+ console.log('\n Then manage it:\n');
258
+ console.log(` ${chalk_1.default.cyan('scalebun ota releases')} --app-id ${appId} ${chalk_1.default.dim('# live state per channel')}`);
259
+ console.log(` ${chalk_1.default.cyan('scalebun ota rollout')} --app-id ${appId} --percent 10 ${chalk_1.default.dim('# staged rollout')}`);
260
+ console.log(` ${chalk_1.default.cyan('scalebun ota pause')} --app-id ${appId} ${chalk_1.default.dim('# stop new deliveries')}`);
261
+ console.log(` ${chalk_1.default.cyan('scalebun ota rollback')} --app-id ${appId} ${chalk_1.default.dim('# revert every device')}`);
262
+ console.log(` ${chalk_1.default.cyan('scalebun ci init')} ${chalk_1.default.dim('# generate a CI workflow (GitHub/GitLab)')}`);
263
+ console.log(`\n Dashboard: releases, adoption and rollback analytics live under ${chalk_1.default.bold('OTA')} for ${chalk_1.default.bold(appLabel || appId)}.\n`);
264
+ }
265
+ catch (err) {
266
+ console.error(`\n❌ Quickstart stopped: ${err?.message ?? err}`);
267
+ process.exit(1);
268
+ }
269
+ finally {
270
+ rl.close();
271
+ }
272
+ });
273
+ }
274
+ //# sourceMappingURL=quickstart.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quickstart.js","sourceRoot":"","sources":["../../src/commands/quickstart.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsFA,kDA8DC;AAED,8DAoJC;AAzSD,+CAAiC;AACjC,uCAAyB;AACzB,2CAA6B;AAC7B,mDAAqC;AACrC,kDAA0B;AAC1B,sDAAoE;AACpE,0CAA0C;AAC1C,mCAAmC;AACnC,qCAAqC;AACrC,yCAA6C;AAmD7C,iFAAiF;AACjF,SAAS,OAAO,CAAC,GAAW;IAC1B,OAAO,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACzE,CAAC;AAED,sEAAsE;AACtE,KAAK,UAAU,YAAY,CAAC,MAAiB;IAC3C,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAAW,gBAAgB,CAAC,CAAC;IAC1D,MAAM,OAAO,GAAe,EAAE,CAAC;IAC/B,KAAK,MAAM,GAAG,IAAI,IAAI,IAAI,EAAE,EAAE,CAAC;QAC7B,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,GAAG,CAC/B,kBAAkB,GAAG,CAAC,EAAE,WAAW,CACpC,CAAC;QACF,KAAK,MAAM,CAAC,IAAI,QAAQ,IAAI,EAAE,EAAE,CAAC;YAC/B,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,GAAG,CAC7B,kBAAkB,GAAG,CAAC,EAAE,aAAa,CAAC,CAAC,EAAE,EAAE,CAC5C,CAAC;YACF,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,IAAI,IAAI,EAAE,EAAE,CAAC;gBACrC,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,EAAE,EAAE,OAAO,EAAE,GAAG,CAAC,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;YAC/E,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAgB,mBAAmB,CAAC,OAAgB;IAClD,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,yEAAyE,CAAC;SACtF,MAAM,CAAC,QAAQ,EAAE,iEAAiE,CAAC;SACnF,MAAM,CAAC,KAAK,EAAE,IAAwB,EAAE,EAAE;QACzC,MAAM,KAAK,GAAG,IAAA,6BAAe,GAAE,CAAC;QAChC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,KAAK,CAAC,8CAA8C,CAAC,CAAC;YAC9D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,kBAAS,CAAC,KAAK,CAAC,CAAC;QACpC,IAAI,OAAmB,CAAC;QACxB,IAAI,CAAC;YACH,OAAO,GAAG,MAAM,YAAY,CAAC,MAAM,CAAC,CAAC;QACvC,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,OAAO,CAAC,KAAK,CAAC,0BAA0B,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YACvD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAChB,OAAO;QACT,CAAC;QAED,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YACpB,OAAO,CAAC,GAAG,CAAC,qFAAqF,CAAC,CAAC;YACnG,OAAO;QACT,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,IAAI,SAAS,GAAG,EAAE,CAAC;QACnB,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,MAAM,KAAK,GAAG,GAAG,CAAC,CAAC,OAAO,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;YAChD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACxB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC;gBACrC,SAAS,GAAG,KAAK,CAAC;YACpB,CAAC;YACD,OAAO,CAAC,GAAG,CACT,QAAQ,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,eAAK,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,aAAa,eAAK,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CACrG,CAAC;YACF,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;gBACd,IAAI,CAAC;oBACH,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAAW,SAAS,CAAC,CAAC,GAAG,CAAC,EAAE,eAAe,CAAC,CAAC;oBAC1E,KAAK,MAAM,GAAG,IAAI,IAAI,IAAI,EAAE,EAAE,CAAC;wBAC7B,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAAc,iBAAiB,GAAG,CAAC,EAAE,WAAW,CAAC,CAAC;wBAC/E,MAAM,MAAM,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC;wBACjE,MAAM,KAAK,GAAG,GAAG,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;wBAC/D,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;4BACnB,OAAO,CAAC,GAAG,CAAC,UAAU,KAAK,KAAK,eAAK,CAAC,GAAG,CAAC,sBAAsB,CAAC,EAAE,CAAC,CAAC;wBACvE,CAAC;wBACD,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;4BACvB,OAAO,CAAC,GAAG,CACT,UAAU,KAAK,KAAK,eAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,IAAI,eAAK,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,EAAE,CACnF,CAAC;wBACJ,CAAC;oBACH,CAAC;gBACH,CAAC;gBAAC,MAAM,CAAC;oBACP,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAC,CAAC;gBACtE,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,mFAAmF,CAAC,CAAC,CAAC;QAC5G,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACP,CAAC;AAED,SAAgB,yBAAyB,CAAC,OAAgB;IACxD,OAAO;SACJ,OAAO,CAAC,YAAY,CAAC;SACrB,WAAW,CAAC,iFAAiF,CAAC;SAC9F,MAAM,CAAC,eAAe,EAAE,qCAAqC,CAAC;SAC9D,MAAM,CAAC,KAAK,EAAE,IAAwB,EAAE,EAAE;QACzC,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QACtF,MAAM,GAAG,GAAG,CAAC,CAAS,EAAmB,EAAE,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAClF,MAAM,IAAI,GAAG,CAAC,CAAS,EAAE,KAAa,EAAE,EAAE,CACxC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,KAAK,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAE5G,IAAI,CAAC;YACH,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,iEAAiE,CAAC,CAAC,CAAC;YAC3F,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,sEAAsE,CAAC,CAAC,CAAC;YAE/F,uEAAuE;YACvE,IAAI,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;YACnB,IAAI,KAAK,GAAG,IAAA,6BAAe,GAAE,CAAC;YAC9B,IAAI,KAAK,EAAE,CAAC;gBACV,IAAI,CAAC;oBACH,MAAM,EAAE,GAAG,MAAM,IAAI,kBAAS,CAAC,KAAK,CAAC,CAAC,GAAG,CAAoB,UAAU,CAAC,CAAC;oBACzE,OAAO,CAAC,GAAG,CAAC,0BAA0B,EAAE,CAAC,KAAK,KAAK,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;gBACtE,CAAC;gBAAC,MAAM,CAAC;oBACP,OAAO,CAAC,GAAG,CAAC,sDAAsD,CAAC,CAAC;oBACpE,KAAK,GAAG,IAAI,CAAC;gBACf,CAAC;YACH,CAAC;YACD,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,MAAM,IAAA,gBAAQ,EAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;gBACtC,KAAK,GAAG,IAAA,6BAAe,GAAE,CAAC;gBAC1B,IAAI,CAAC,KAAK;oBAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC9B,CAAC;YACD,MAAM,MAAM,GAAG,IAAI,kBAAS,CAAC,KAAK,CAAC,CAAC;YAEpC,uEAAuE;YACvE,IAAI,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC;YACzB,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC;YAC/B,IAAI,QAAQ,GAAG,KAAK,IAAI,EAAE,CAAC;YAC3B,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,MAAM,CAAC,CAAC;gBAC3C,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;oBACpB,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;oBAC/C,OAAO,CAAC,GAAG,CAAC,wFAAwF,CAAC,CAAC;oBACtG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAClB,CAAC;gBACD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBACzB,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;oBAC1B,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC;oBAC/B,OAAO,CAAC,GAAG,CAAC,0BAA0B,QAAQ,KAAK,KAAK,GAAG,CAAC,CAAC;gBAC/D,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACvB,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,MAAM,CAAC,CAAC,WAAW,MAAM,eAAK,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,eAAK,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CACjG,CACF,CAAC;oBACF,MAAM,CAAC,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,oBAAoB,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;oBAC7D,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;oBACrE,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;oBACtB,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;oBAC3B,OAAO,CAAC,GAAG,CAAC,KAAK,MAAM,CAAC,GAAG,CAAC,IAAI,KAAK,KAAK,GAAG,CAAC,CAAC;gBACjD,CAAC;YACH,CAAC;YAED,uEAAuE;YACvE,IAAI,CAAC,CAAC,EAAE,gBAAgB,CAAC,CAAC;YAC1B,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,uFAAuF,CAAC,CAAC,CAAC;YAChH,IAAI,mBAAmB,GAAkB,IAAI,CAAC;YAC9C,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAAW,SAAS,KAAK,eAAe,CAAC,CAAC;gBACvE,KAAK,MAAM,GAAG,IAAI,IAAI,IAAI,EAAE,EAAE,CAAC;oBAC7B,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAAc,iBAAiB,GAAG,CAAC,EAAE,WAAW,CAAC,CAAC;oBAC/E,MAAM,MAAM,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC;oBACjE,OAAO,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,eAAK,CAAC,GAAG,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;oBAClI,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC,mBAAmB;wBAAE,mBAAmB,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;gBACvF,CAAC;gBACD,IAAI,CAAC,mBAAmB,IAAI,IAAI,EAAE,MAAM,EAAE,CAAC;oBACzC,MAAM,EAAE,GAAG,CAAC,MAAM,GAAG,CAAC,oDAAoD,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;oBAClG,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;wBACf,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,CAAY,iBAAiB,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE;4BAChF,IAAI,EAAE,gBAAgB;yBACvB,CAAC,CAAC;wBACH,mBAAmB,GAAG,IAAI,CAAC,SAAS,CAAC;wBACrC,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;wBAChD,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;4BACnB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,6CAA6C,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;wBAC3F,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,OAAO,GAAQ,EAAE,CAAC;gBAClB,OAAO,CAAC,GAAG,CAAC,+BAA+B,GAAG,CAAC,OAAO,qDAAqD,CAAC,CAAC;YAC/G,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC;YAC5D,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,qEAAqE,CAAC,CAAC,CAAC;YAChG,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC,CAAC;YAC7D,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,sBAAsB,mBAAmB,IAAI,mBAAmB,IAAI,CAAC,CAAC,CAAC;YAC/F,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC;YACrC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC;YAC3C,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC,CAAC;YAErD,uEAAuE;YACvE,IAAI,CAAC,CAAC,EAAE,8BAA8B,CAAC,CAAC;YACxC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,qBAAqB,CAAC,CAAC;YACjE,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC3B,OAAO,CAAC,GAAG,CAAC,kCAAkC,OAAO,EAAE,CAAC,CAAC;YAC3D,CAAC;iBAAM,CAAC;gBACN,MAAM,EAAE,GAAG,CAAC,MAAM,GAAG,CAAC,+DAA+D,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;gBAC7G,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;oBACf,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,MAAM,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC;oBACxE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;oBACzD,EAAE,CAAC,aAAa,CAAC,OAAO,EAAE,UAAU,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAW,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;oBAC1G,MAAM,SAAS,GAAG,IAAA,0BAAe,EAAC,SAAS,CAAC,CAAC;oBAC7C,MAAM,MAAM,CAAC,IAAI,CAAC,cAAc,KAAK,mBAAmB,EAAE;wBACxD,SAAS,EAAE,SAAS;wBACpB,IAAI,EAAE,cAAc,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE;qBAC5D,CAAC,CAAC;oBACH,OAAO,CAAC,GAAG,CAAC,wBAAwB,OAAO,+BAA+B,CAAC,CAAC;oBAC5E,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,8EAA8E,CAAC,CAAC,CAAC;oBAC1G,OAAO,CAAC,GAAG,CAAC,gFAAgF,SAAS,KAAK,CAAC,CAAC;gBAC9G,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,4DAA4D,CAAC,CAAC,CAAC;gBACvF,CAAC;YACH,CAAC;YAED,uEAAuE;YACvE,IAAI,CAAC,CAAC,EAAE,sBAAsB,CAAC,CAAC;YAChC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,wDAAwD,CAAC,CAAC,CAAC;YACjF,MAAM,IAAA,kBAAS,GAAE,CAAC,CAAC,6DAA6D;YAEhF,uEAAuE;YACvE,IAAI,CAAC,CAAC,EAAE,wBAAwB,CAAC,CAAC;YAClC,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;YAChD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,sCAAsC,KAAK,6CAA6C,CAAC,CAAC,CAAC;YACnH,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,2CAA2C,CAAC,CAAC,CAAC;YACtE,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;YACtC,OAAO,CAAC,GAAG,CAAC,QAAQ,eAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,aAAa,KAAK,OAAO,eAAK,CAAC,GAAG,CAAC,0BAA0B,CAAC,EAAE,CAAC,CAAC;YACzH,OAAO,CAAC,GAAG,CAAC,QAAQ,eAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,cAAc,KAAK,mBAAmB,eAAK,CAAC,GAAG,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC;YAC7H,OAAO,CAAC,GAAG,CAAC,QAAQ,eAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,gBAAgB,KAAK,OAAO,eAAK,CAAC,GAAG,CAAC,uBAAuB,CAAC,EAAE,CAAC,CAAC;YACtH,OAAO,CAAC,GAAG,CAAC,QAAQ,eAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,aAAa,KAAK,OAAO,eAAK,CAAC,GAAG,CAAC,uBAAuB,CAAC,EAAE,CAAC,CAAC;YACtH,OAAO,CAAC,GAAG,CAAC,QAAQ,eAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,0BAA0B,eAAK,CAAC,GAAG,CAAC,0CAA0C,CAAC,EAAE,CAAC,CAAC;YACrI,OAAO,CAAC,GAAG,CAAC,wEAAwE,eAAK,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,eAAK,CAAC,IAAI,CAAC,QAAQ,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC;QACnJ,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,OAAO,CAAC,KAAK,CAAC,2BAA2B,GAAG,EAAE,OAAO,IAAI,GAAG,EAAE,CAAC,CAAC;YAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;gBAAS,CAAC;YACT,EAAE,CAAC,KAAK,EAAE,CAAC;QACb,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
package/lib/index.js CHANGED
@@ -1,29 +1,48 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const commander_1 = require("commander");
4
+ const login_1 = require("./commands/login");
5
+ const doctor_1 = require("./commands/doctor");
4
6
  const ota_publish_1 = require("./commands/ota-publish");
5
7
  const ota_bundle_1 = require("./commands/ota-bundle");
6
8
  const ota_channels_1 = require("./commands/ota-channels");
7
9
  const ota_delete_bundle_1 = require("./commands/ota-delete-bundle");
10
+ const ota_keys_1 = require("./commands/ota-keys");
11
+ const ota_rollout_1 = require("./commands/ota-rollout");
8
12
  const launch_1 = require("./commands/launch");
9
13
  const migrate_codepush_1 = require("./commands/migrate-codepush");
10
14
  const ci_init_1 = require("./commands/ci-init");
15
+ const quickstart_1 = require("./commands/quickstart");
11
16
  const ui_1 = require("./utils/ui");
12
17
  const program = new commander_1.Command();
18
+ // Read the version from package.json so it can never drift from the published
19
+ // version. The compiled entry lives at lib/index.js, so ../package.json is the
20
+ // CLI manifest. (Hardcoding it left `scalebun --version` reporting 0.1.0 long
21
+ // after the package had moved on.)
22
+ const { version } = require('../package.json');
13
23
  program
14
24
  .name('scalebun')
15
25
  .description('Scalebun CLI — OTA bundle publishing and management')
16
- .version('0.1.0')
26
+ .version(version)
17
27
  .action(() => {
18
28
  (0, ui_1.renderBanner)();
19
29
  (0, ui_1.renderStatus)();
20
30
  (0, ui_1.renderCommands)();
21
31
  });
32
+ // `registerLoginCommand` was imported and never called, so `scalebun login`
33
+ // did not exist — every other command depends on the credentials it writes,
34
+ // and the documented first step of the CLI was unreachable.
35
+ (0, login_1.registerLoginCommand)(program);
36
+ (0, quickstart_1.registerQuickstartCommand)(program);
37
+ (0, quickstart_1.registerAppsCommand)(program);
38
+ (0, doctor_1.registerDoctorCommand)(program);
22
39
  const ota = program.command('ota').description('OTA update management');
23
40
  (0, ota_publish_1.registerOtaPublishCommand)(ota);
24
41
  (0, ota_bundle_1.registerOtaBundleCommand)(ota);
25
42
  (0, ota_channels_1.registerOtaChannelsCommand)(ota);
26
43
  (0, ota_delete_bundle_1.registerOtaDeleteBundleCommand)(ota);
44
+ (0, ota_keys_1.registerOtaKeysCommand)(ota);
45
+ (0, ota_rollout_1.registerOtaRolloutCommands)(ota);
27
46
  (0, launch_1.registerLaunchCommand)(program);
28
47
  const migrate = program.command('migrate').description('Migration utilities from other platforms');
29
48
  (0, migrate_codepush_1.registerMigrateCodepushCommand)(migrate);
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;AAAA,yCAAoC;AAEpC,wDAAmE;AACnE,sDAAiE;AACjE,0DAAqE;AACrE,oEAA8E;AAC9E,8CAA0D;AAC1D,kEAA6E;AAC7E,gDAA2D;AAC3D,mCAAwE;AAExE,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,UAAU,CAAC;KAChB,WAAW,CAAC,qDAAqD,CAAC;KAClE,OAAO,CAAC,OAAO,CAAC;KAChB,MAAM,CAAC,GAAG,EAAE;IACX,IAAA,iBAAY,GAAE,CAAC;IACf,IAAA,iBAAY,GAAE,CAAC;IACf,IAAA,mBAAc,GAAE,CAAC;AACnB,CAAC,CAAC,CAAC;AAEL,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,uBAAuB,CAAC,CAAC;AACxE,IAAA,uCAAyB,EAAC,GAAG,CAAC,CAAC;AAC/B,IAAA,qCAAwB,EAAC,GAAG,CAAC,CAAC;AAC9B,IAAA,yCAA0B,EAAC,GAAG,CAAC,CAAC;AAChC,IAAA,kDAA8B,EAAC,GAAG,CAAC,CAAC;AACpC,IAAA,8BAAqB,EAAC,OAAO,CAAC,CAAC;AAE/B,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,WAAW,CAAC,0CAA0C,CAAC,CAAC;AACnG,IAAA,iDAA8B,EAAC,OAAO,CAAC,CAAC;AACxC,IAAA,+BAAqB,EAAC,OAAO,CAAC,CAAC;AAE/B,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;IAC7B,IAAA,iBAAY,GAAE,CAAC;IACf,IAAA,iBAAY,GAAE,CAAC;IACf,IAAA,mBAAc,GAAE,CAAC;AACnB,CAAC;KAAM,CAAC;IACN,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AAC9B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;AAAA,yCAAoC;AACpC,4CAAwD;AACxD,8CAA0D;AAC1D,wDAAmE;AACnE,sDAAiE;AACjE,0DAAqE;AACrE,oEAA8E;AAC9E,kDAA6D;AAC7D,wDAAoE;AACpE,8CAA0D;AAC1D,kEAA6E;AAC7E,gDAA2D;AAC3D,sDAAuF;AACvF,mCAAwE;AAExE,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,8EAA8E;AAC9E,+EAA+E;AAC/E,8EAA8E;AAC9E,mCAAmC;AACnC,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,iBAAiB,CAAwB,CAAC;AAEtE,OAAO;KACJ,IAAI,CAAC,UAAU,CAAC;KAChB,WAAW,CAAC,qDAAqD,CAAC;KAClE,OAAO,CAAC,OAAO,CAAC;KAChB,MAAM,CAAC,GAAG,EAAE;IACX,IAAA,iBAAY,GAAE,CAAC;IACf,IAAA,iBAAY,GAAE,CAAC;IACf,IAAA,mBAAc,GAAE,CAAC;AACnB,CAAC,CAAC,CAAC;AAEL,4EAA4E;AAC5E,4EAA4E;AAC5E,4DAA4D;AAC5D,IAAA,4BAAoB,EAAC,OAAO,CAAC,CAAC;AAC9B,IAAA,sCAAyB,EAAC,OAAO,CAAC,CAAC;AACnC,IAAA,gCAAmB,EAAC,OAAO,CAAC,CAAC;AAC7B,IAAA,8BAAqB,EAAC,OAAO,CAAC,CAAC;AAE/B,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,uBAAuB,CAAC,CAAC;AACxE,IAAA,uCAAyB,EAAC,GAAG,CAAC,CAAC;AAC/B,IAAA,qCAAwB,EAAC,GAAG,CAAC,CAAC;AAC9B,IAAA,yCAA0B,EAAC,GAAG,CAAC,CAAC;AAChC,IAAA,kDAA8B,EAAC,GAAG,CAAC,CAAC;AACpC,IAAA,iCAAsB,EAAC,GAAG,CAAC,CAAC;AAC5B,IAAA,wCAA0B,EAAC,GAAG,CAAC,CAAC;AAChC,IAAA,8BAAqB,EAAC,OAAO,CAAC,CAAC;AAE/B,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,WAAW,CAAC,0CAA0C,CAAC,CAAC;AACnG,IAAA,iDAA8B,EAAC,OAAO,CAAC,CAAC;AACxC,IAAA,+BAAqB,EAAC,OAAO,CAAC,CAAC;AAE/B,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;IAC7B,IAAA,iBAAY,GAAE,CAAC;IACf,IAAA,iBAAY,GAAE,CAAC;IACf,IAAA,mBAAc,GAAE,CAAC;AACnB,CAAC;KAAM,CAAC;IACN,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AAC9B,CAAC"}