@scalebun/cli 1.0.0 → 1.0.1

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.
@@ -35,10 +35,12 @@ var __importStar = (this && this.__importStar) || (function () {
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
36
  exports.registerOtaPublishCommand = registerOtaPublishCommand;
37
37
  const fs = __importStar(require("fs"));
38
+ const crypto = __importStar(require("crypto"));
38
39
  const credentials_1 = require("../utils/credentials");
39
40
  const client_1 = require("../api/client");
40
41
  const bundle_1 = require("../utils/bundle");
41
42
  const hash_1 = require("../utils/hash");
43
+ const ota_keys_1 = require("./ota-keys");
42
44
  /**
43
45
  * `scalebun ota publish` — the flagship CLI command.
44
46
  *
@@ -59,18 +61,22 @@ function registerOtaPublishCommand(ota) {
59
61
  .option('--channel <nameOrId>', 'OTA channel name (e.g. default, beta, production) or channel ID', 'default')
60
62
  .option('--channel-id <id>', 'OTA channel ID (legacy alias)')
61
63
  .option('--platform <platform>', 'Target platform: android | ios', 'android')
62
- .option('--install-mode <mode>', 'Install & execution behavior: IMMEDIATE (forces instant app restart on download), ON_NEXT_RESTART (applies silently on next cold boot - default), ON_NEXT_RESUME (applies when app resumes)', 'ON_NEXT_RESTART')
64
+ .option('--install-mode <mode>', 'IMMEDIATE (SDK restarts the app right after install; also marked mandatory) | ' +
65
+ 'ON_NEXT_RESTART (default: activates on next cold boot) | ' +
66
+ 'ON_NEXT_RESUME (SDK restarts when the app next returns to the foreground)', 'ON_NEXT_RESTART')
63
67
  .option('--target-version <semver>', 'Target app native semver range (e.g. ">=1.0.0", "1.0.0")', '>=1.0.0')
64
68
  .option('--rollout <percent>', 'Target rollout percentage (1-100)', '100')
65
69
  .option('--entry-file <path>', 'JS entry file', 'index.js')
66
70
  .option('--release-note <text>', 'Release note for dashboard display and device changelog')
67
- .option('--hermes', 'Compile to Hermes bytecode (recommended for production)')
68
- .option('--hermes-disabled', 'Explicitly disable Hermes bytecode compilation')
71
+ .option('--hermes', 'Compile to Hermes bytecode (the default — flag kept for compatibility)')
72
+ .option('--hermes-disabled', 'Ship plain JS instead of Hermes bytecode (~20-30% slower cold start)')
73
+ .option('--key-dir <dir>', 'Directory holding the ed25519 signing key (default: ./.scalebun)')
69
74
  .option('--skip-bundle', 'Skip react-native bundle (provide --bundle-path instead)')
70
75
  .option('--bundle-path <path>', 'Path to a pre-built bundle file')
71
76
  .option('--custom-bundle-path <path>', 'Alias for --bundle-path (explicit naming)')
72
77
  .option('--sourcemap', 'Generate and upload sourcemap for crash symbolication')
73
78
  .option('--keep-artifacts', 'Keep build artifacts (bundle + sourcemap) after upload')
79
+ .option('--skip-promote', 'Upload and finalize only — do not make the release live')
74
80
  .action(async (opts) => {
75
81
  const creds = (0, credentials_1.readCredentials)();
76
82
  if (!creds) {
@@ -87,8 +93,19 @@ function registerOtaPublishCommand(ota) {
87
93
  const targetChannel = opts.channelId || opts.channel || 'default';
88
94
  const client = new client_1.ApiClient(creds);
89
95
  const platform = opts.platform;
96
+ // Runtime binding. `targetAppVersion` gates on a marketing string; these
97
+ // are the actual contract between the bundle and the binary that runs
98
+ // it. The backend withholds a bundle from a device whose runtime does
99
+ // not match — see runtime-compat.ts.
100
+ const rnVersion = (0, bundle_1.detectProjectRnVersion)();
101
+ // Generated here, before the build, so it can be compiled into the JS.
102
+ // The SDK reads it back at boot to prove the bundle it installed is the
103
+ // one actually executing.
104
+ const identityToken = crypto.randomBytes(16).toString('hex');
90
105
  // Step 1: Build the bundle (or use pre-built)
91
106
  let bundlePath;
107
+ let hermesBytecodeVersion = null;
108
+ let bundleCarriesMarker = false;
92
109
  if (opts.skipBundle && (opts.bundlePath || opts.customBundlePath)) {
93
110
  bundlePath = opts.bundlePath || opts.customBundlePath;
94
111
  if (!fs.existsSync(bundlePath)) {
@@ -96,10 +113,21 @@ function registerOtaPublishCommand(ota) {
96
113
  process.exit(1);
97
114
  }
98
115
  console.log(`📦 Using pre-built bundle: ${bundlePath}`);
116
+ // A pre-built artifact is taken as-is: injecting a marker would mean
117
+ // rewriting someone else's build output, and if it is already Hermes
118
+ // bytecode a text prefix would corrupt it outright.
119
+ hermesBytecodeVersion = (0, bundle_1.readHermesBytecodeVersion)(bundlePath);
120
+ console.log(' ℹ️ Pre-built bundle — no identity marker injected. Install verification ' +
121
+ 'will be unavailable for this release.');
99
122
  }
100
123
  else {
101
- // Resolve Hermes: --hermes-disabled takes precedence
102
- const useHermes = opts.hermesDisabled ? false : opts.hermes;
124
+ // Hermes is the DEFAULT. The docs have always said "compiled to Hermes
125
+ // bytecode by default (--hermes)" while the flag was actually opt-in —
126
+ // so every publish that didn't know the flag shipped plain JS with a
127
+ // slower cold start and no HBC version for the runtime gate to check.
128
+ // Making the code match the docs is the right direction: bytecode is
129
+ // what production wants, and `--hermes-disabled` remains the opt-out.
130
+ const useHermes = opts.hermesDisabled ? false : true;
103
131
  console.log(`📦 Building ${platform} bundle${useHermes ? ' (Hermes bytecode)' : ''}…`);
104
132
  const result = (0, bundle_1.buildBundle)({
105
133
  platform,
@@ -107,9 +135,39 @@ function registerOtaPublishCommand(ota) {
107
135
  dev: false,
108
136
  hermes: useHermes,
109
137
  sourcemap: opts.sourcemap,
138
+ identityToken,
110
139
  });
111
140
  bundlePath = result.bundlePath;
141
+ hermesBytecodeVersion = result.hermesBytecodeVersion;
142
+ bundleCarriesMarker = true;
112
143
  console.log(` ✅ Bundle built: ${bundlePath}`);
144
+ // You asked for bytecode and didn't get it: that is a failed build,
145
+ // not a warning. This degradation has shipped silently twice now —
146
+ // first via `npx hermesc` (not a real package), then via spawnSync's
147
+ // 1MB maxBuffer killing the compiler — and a plain-JS bundle both
148
+ // starts ~20-30% slower and carries no HBC version for the runtime
149
+ // gate to check. If plain JS is what you want, say so.
150
+ if (useHermes && !result.hermesCompiled) {
151
+ console.error('❌ --hermes was requested but the bundle is NOT Hermes bytecode (see the hermesc error above).\n' +
152
+ ' To intentionally publish plain JS, use --hermes-disabled.');
153
+ process.exit(1);
154
+ }
155
+ }
156
+ console.log(` Runtime: RN ${rnVersion ?? 'unknown'}` +
157
+ (hermesBytecodeVersion !== null
158
+ ? `, Hermes HBC v${hermesBytecodeVersion}`
159
+ : ', plain JS'));
160
+ if (!rnVersion) {
161
+ console.warn(' ⚠️ React Native version could not be detected — this bundle will not be ' +
162
+ 'runtime-gated, and can reach binaries that cannot run it.');
163
+ }
164
+ // The sourcemap must be located BEFORE presign, because sourcemaps are
165
+ // uploaded through a presigned URL requested alongside the bundle's.
166
+ const sourcemapPath = opts.sourcemap && fs.existsSync(bundlePath + '.map')
167
+ ? bundlePath + '.map'
168
+ : null;
169
+ if (opts.sourcemap && !sourcemapPath) {
170
+ console.warn(' ⚠️ --sourcemap was passed but no .map file was produced — continuing without one.');
113
171
  }
114
172
  // Step 2: Hash the bundle
115
173
  console.log('🔒 Computing SHA-256…');
@@ -131,6 +189,23 @@ function registerOtaPublishCommand(ota) {
131
189
  sha256,
132
190
  sizeBytes,
133
191
  releaseNote: opts.releaseNote,
192
+ rnVersion: rnVersion ?? undefined,
193
+ hermes: hermesBytecodeVersion !== null,
194
+ hermesBytecodeVersion: hermesBytecodeVersion ?? undefined,
195
+ identityToken: bundleCarriesMarker ? identityToken : undefined,
196
+ // Sourcemaps ride the presign flow: declaring them here returns a
197
+ // second presigned PUT URL. This CLI used to skip these fields and
198
+ // instead POST base64 JSON to /bundles/:id/sourcemap after promote
199
+ // — an endpoint that DOES NOT EXIST and never has. The error was
200
+ // caught and printed as a "non-fatal" warning, so every
201
+ // `--sourcemap` publish ever made silently uploaded nothing while
202
+ // the summary implied symbolication would work.
203
+ ...(sourcemapPath
204
+ ? {
205
+ sourcemapSha256: (0, hash_1.sha256File)(sourcemapPath),
206
+ sourcemapSizeBytes: fs.statSync(sourcemapPath).size,
207
+ }
208
+ : {}),
134
209
  });
135
210
  }
136
211
  catch (err) {
@@ -154,51 +229,82 @@ function registerOtaPublishCommand(ota) {
154
229
  console.log('🔍 Finalizing (server-side hash verification)…');
155
230
  let finalized;
156
231
  try {
157
- finalized = await client.post(`/saas/apps/${opts.appId}/ota/bundles/${presigned.bundleId}/finalize`);
232
+ // OTA-03: sign the bundle hash with the locally-held private key, if
233
+ // this project has adopted signing. The key never leaves this machine —
234
+ // only the detached signature is uploaded, so ScaleBun can serve a
235
+ // signature it could not itself have produced. Unsigned publishes stay
236
+ // valid; the device only enforces once an app embeds a public key.
237
+ const signature = (0, ota_keys_1.signBundleHash)(sha256, opts.keyDir);
238
+ if (signature) {
239
+ console.log(' 🔏 Signed with local ed25519 key');
240
+ }
241
+ finalized = await client.post(`/saas/apps/${opts.appId}/ota/bundles/${presigned.bundleId}/finalize`, signature ? { signature } : undefined);
158
242
  }
159
243
  catch (err) {
160
244
  console.error(`❌ Finalize failed: ${err.message}`);
161
245
  process.exit(1);
162
246
  }
163
247
  // Step 6: Promote release to ACTIVE status with installMode
164
- console.log('🚀 Promoting release to active target channel…');
165
- try {
166
- const rolloutPercent = parseInt(opts.rollout, 10) || 100;
167
- await client.post(`/saas/apps/${opts.appId}/ota/bundles/${presigned.bundleId}/promote`, {
168
- targetAppVersion: opts.targetVersion || '>=1.0.0',
169
- rolloutPercent,
170
- isMandatory: installMode === 'IMMEDIATE',
171
- installMode,
172
- releaseNote: opts.releaseNote,
173
- });
248
+ if (opts.skipPromote) {
249
+ console.log('⏭️ Skipping promotion (--skip-promote) — bundle is uploaded but NOT live.');
250
+ console.log(` Promote later from the dashboard, or re-run without --skip-promote.`);
174
251
  }
175
- catch (err) {
176
- console.warn(` ⚠️ Promotion notice: ${err.message}`);
252
+ else {
253
+ console.log('🚀 Promoting release to active target channel…');
254
+ try {
255
+ const rolloutPercent = parseInt(opts.rollout, 10) || 100;
256
+ await client.post(`/saas/apps/${opts.appId}/ota/bundles/${presigned.bundleId}/promote`, {
257
+ targetAppVersion: opts.targetVersion || '>=1.0.0',
258
+ rolloutPercent,
259
+ isMandatory: installMode === 'IMMEDIATE',
260
+ installMode,
261
+ releaseNote: opts.releaseNote,
262
+ });
263
+ }
264
+ catch (err) {
265
+ // This used to warn and exit 0 — so a CI pipeline printed
266
+ // "published successfully" while no device would ever receive the
267
+ // update (promotion is what makes a bundle live). A pipeline must
268
+ // fail when its purpose failed.
269
+ console.error(`❌ Promotion failed: ${err.message}`);
270
+ console.error(` The bundle IS uploaded (v pending, id ${presigned.bundleId}) but is NOT live.\n` +
271
+ ' Fix the error and promote from the dashboard, or publish again.\n' +
272
+ ' To upload without promoting on purpose, use --skip-promote.');
273
+ process.exit(1);
274
+ }
177
275
  }
178
- // Step 7: Upload sourcemap if generated
179
- if (opts.sourcemap) {
180
- const sourcemapPath = bundlePath + '.map';
181
- if (fs.existsSync(sourcemapPath)) {
182
- console.log('🗺️ Uploading sourcemap for crash symbolication…');
183
- try {
184
- const mapData = fs.readFileSync(sourcemapPath);
185
- await client.post(`/saas/apps/${opts.appId}/ota/bundles/${presigned.bundleId}/sourcemap`, { sourcemap: mapData.toString('base64'), encoding: 'base64' });
186
- console.log(' ✅ Sourcemap uploaded');
187
- if (!opts.keepArtifacts) {
276
+ // Step 7: Upload the sourcemap through its presigned URL.
277
+ // (The old code POSTed base64 JSON to /bundles/:id/sourcemap — a route
278
+ // that has never existed — and downgraded the 404 to a "non-fatal"
279
+ // warning, so symbolication silently never worked for OTA bundles.)
280
+ if (sourcemapPath && presigned.sourcemapUploadUrl) {
281
+ console.log('🗺️ Uploading sourcemap for crash symbolication…');
282
+ try {
283
+ await client.putBytes(presigned.sourcemapUploadUrl, fs.readFileSync(sourcemapPath), 'application/json');
284
+ console.log(' ✅ Sourcemap uploaded');
285
+ if (!opts.keepArtifacts) {
286
+ try {
188
287
  fs.unlinkSync(sourcemapPath);
189
288
  }
289
+ catch {
290
+ /* non-fatal */
291
+ }
190
292
  }
191
- catch (err) {
192
- console.warn(` ⚠️ Sourcemap upload failed (non-fatal): ${err.message}`);
193
- }
194
293
  }
294
+ catch (err) {
295
+ console.warn(` ⚠️ Sourcemap upload failed: ${err.message}\n` +
296
+ ' Stack traces from this bundle will not symbolicate. Re-publish to retry.');
297
+ }
298
+ }
299
+ else if (sourcemapPath && !presigned.sourcemapUploadUrl) {
300
+ console.warn(' ⚠️ Backend did not return a sourcemap upload URL — is it up to date?');
195
301
  }
196
302
  // Step 8: Print detailed success summary
197
303
  const installModeLabel = installMode === 'IMMEDIATE'
198
- ? '⚡ IMMEDIATE (App restarts right after download)'
304
+ ? '⚡ IMMEDIATE (SDK restarts the app right after install)'
199
305
  : installMode === 'ON_NEXT_RESUME'
200
- ? '🔄 ON_NEXT_RESUME (Applies when app resumes)'
201
- : '🌙 ON_NEXT_RESTART (Applies silently on next launch)';
306
+ ? '🔄 ON_NEXT_RESUME (SDK restarts on next return to foreground)'
307
+ : '🌙 ON_NEXT_RESTART (activates silently on next launch)';
202
308
  console.log('');
203
309
  console.log(`✅ Bundle v${finalized.version} published successfully!`);
204
310
  console.log(` Channel: ${finalized.channelName} (${finalized.environmentName})`);
@@ -209,6 +315,20 @@ function registerOtaPublishCommand(ota) {
209
315
  if (opts.sourcemap) {
210
316
  console.log(` Sourcemap: Uploaded ✓ (Stack traces will auto-symbolicate)`);
211
317
  }
318
+ const rolloutNow = opts.skipPromote ? 0 : parseInt(opts.rollout, 10) || 100;
319
+ console.log('');
320
+ console.log('Manage this release:');
321
+ console.log(` scalebun ota releases --app-id ${opts.appId} # see live state`);
322
+ if (!opts.skipPromote && rolloutNow < 100) {
323
+ console.log(` scalebun ota rollout --app-id ${opts.appId} --percent 100 # widen the rollout`);
324
+ }
325
+ console.log(` scalebun ota pause --app-id ${opts.appId} # stop new deliveries`);
326
+ console.log(` scalebun ota rollback --app-id ${opts.appId} # revert every device`);
327
+ if (!opts.skipPromote && rolloutNow === 100) {
328
+ console.log('');
329
+ console.log(' Tip: production releases usually start staged — `--rollout 10`, watch the');
330
+ console.log(' health page, then `ota rollout --percent 100` once it looks clean.');
331
+ }
212
332
  // Clean up bundle unless --keep-artifacts or using pre-built
213
333
  if (!opts.keepArtifacts && !opts.skipBundle) {
214
334
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"ota-publish.js","sourceRoot":"","sources":["../../src/commands/ota-publish.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ota-publish.js","sourceRoot":"","sources":["../../src/commands/ota-publish.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerOtaRolloutCommands(ota: Command): void;
3
+ //# sourceMappingURL=ota-rollout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ota-rollout.d.ts","sourceRoot":"","sources":["../../src/commands/ota-rollout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA0FpC,wBAAgB,0BAA0B,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,CAqK7D"}
@@ -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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"}
package/lib/index.js CHANGED
@@ -1,10 +1,14 @@
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");
@@ -19,11 +23,18 @@ program
19
23
  (0, ui_1.renderStatus)();
20
24
  (0, ui_1.renderCommands)();
21
25
  });
26
+ // `registerLoginCommand` was imported and never called, so `scalebun login`
27
+ // did not exist — every other command depends on the credentials it writes,
28
+ // and the documented first step of the CLI was unreachable.
29
+ (0, login_1.registerLoginCommand)(program);
30
+ (0, doctor_1.registerDoctorCommand)(program);
22
31
  const ota = program.command('ota').description('OTA update management');
23
32
  (0, ota_publish_1.registerOtaPublishCommand)(ota);
24
33
  (0, ota_bundle_1.registerOtaBundleCommand)(ota);
25
34
  (0, ota_channels_1.registerOtaChannelsCommand)(ota);
26
35
  (0, ota_delete_bundle_1.registerOtaDeleteBundleCommand)(ota);
36
+ (0, ota_keys_1.registerOtaKeysCommand)(ota);
37
+ (0, ota_rollout_1.registerOtaRolloutCommands)(ota);
27
38
  (0, launch_1.registerLaunchCommand)(program);
28
39
  const migrate = program.command('migrate').description('Migration utilities from other platforms');
29
40
  (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,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,4EAA4E;AAC5E,4EAA4E;AAC5E,4DAA4D;AAC5D,IAAA,4BAAoB,EAAC,OAAO,CAAC,CAAC;AAC9B,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"}