@scalebun/cli 1.10.2 → 1.11.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 (95) hide show
  1. package/lib/commands/ci-init.d.ts.map +1 -1
  2. package/lib/commands/ci-init.js +80 -2
  3. package/lib/commands/ci-init.js.map +1 -1
  4. package/lib/commands/doctor.d.ts.map +1 -1
  5. package/lib/commands/doctor.js +148 -3
  6. package/lib/commands/doctor.js.map +1 -1
  7. package/lib/commands/link.d.ts +16 -0
  8. package/lib/commands/link.d.ts.map +1 -0
  9. package/lib/commands/link.js +164 -0
  10. package/lib/commands/link.js.map +1 -0
  11. package/lib/commands/login.d.ts.map +1 -1
  12. package/lib/commands/login.js +29 -7
  13. package/lib/commands/login.js.map +1 -1
  14. package/lib/commands/ota-bundle.d.ts +15 -2
  15. package/lib/commands/ota-bundle.d.ts.map +1 -1
  16. package/lib/commands/ota-bundle.js +142 -12
  17. package/lib/commands/ota-bundle.js.map +1 -1
  18. package/lib/commands/ota-channels.d.ts.map +1 -1
  19. package/lib/commands/ota-channels.js +213 -21
  20. package/lib/commands/ota-channels.js.map +1 -1
  21. package/lib/commands/ota-inspect.d.ts +3 -0
  22. package/lib/commands/ota-inspect.d.ts.map +1 -0
  23. package/lib/commands/ota-inspect.js +258 -0
  24. package/lib/commands/ota-inspect.js.map +1 -0
  25. package/lib/commands/ota-keys.d.ts +18 -0
  26. package/lib/commands/ota-keys.d.ts.map +1 -1
  27. package/lib/commands/ota-keys.js +149 -4
  28. package/lib/commands/ota-keys.js.map +1 -1
  29. package/lib/commands/ota-promote.d.ts +3 -0
  30. package/lib/commands/ota-promote.d.ts.map +1 -0
  31. package/lib/commands/ota-promote.js +194 -0
  32. package/lib/commands/ota-promote.js.map +1 -0
  33. package/lib/commands/ota-publish.d.ts.map +1 -1
  34. package/lib/commands/ota-publish.js +108 -38
  35. package/lib/commands/ota-publish.js.map +1 -1
  36. package/lib/commands/ota-rollout.d.ts.map +1 -1
  37. package/lib/commands/ota-rollout.js +201 -171
  38. package/lib/commands/ota-rollout.js.map +1 -1
  39. package/lib/commands/quickstart.d.ts.map +1 -1
  40. package/lib/commands/quickstart.js +110 -8
  41. package/lib/commands/quickstart.js.map +1 -1
  42. package/lib/commands/shell.d.ts +28 -0
  43. package/lib/commands/shell.d.ts.map +1 -0
  44. package/lib/commands/shell.js +512 -0
  45. package/lib/commands/shell.js.map +1 -0
  46. package/lib/index.js +140 -4
  47. package/lib/index.js.map +1 -1
  48. package/lib/ui/menu.d.ts +109 -0
  49. package/lib/ui/menu.d.ts.map +1 -0
  50. package/lib/ui/menu.js +314 -0
  51. package/lib/ui/menu.js.map +1 -0
  52. package/lib/utils/bundle.d.ts.map +1 -1
  53. package/lib/utils/bundle.js +7 -1
  54. package/lib/utils/bundle.js.map +1 -1
  55. package/lib/utils/context.d.ts +88 -0
  56. package/lib/utils/context.d.ts.map +1 -0
  57. package/lib/utils/context.js +247 -0
  58. package/lib/utils/context.js.map +1 -0
  59. package/lib/utils/credentials.d.ts +16 -0
  60. package/lib/utils/credentials.d.ts.map +1 -1
  61. package/lib/utils/credentials.js +14 -3
  62. package/lib/utils/credentials.js.map +1 -1
  63. package/lib/utils/guide.d.ts +63 -0
  64. package/lib/utils/guide.d.ts.map +1 -0
  65. package/lib/utils/guide.js +189 -0
  66. package/lib/utils/guide.js.map +1 -0
  67. package/lib/utils/output.d.ts +96 -0
  68. package/lib/utils/output.d.ts.map +1 -0
  69. package/lib/utils/output.js +135 -0
  70. package/lib/utils/output.js.map +1 -0
  71. package/lib/utils/prompt.d.ts +80 -6
  72. package/lib/utils/prompt.d.ts.map +1 -1
  73. package/lib/utils/prompt.js +184 -20
  74. package/lib/utils/prompt.js.map +1 -1
  75. package/lib/utils/provenance.d.ts +30 -0
  76. package/lib/utils/provenance.d.ts.map +1 -0
  77. package/lib/utils/provenance.js +157 -0
  78. package/lib/utils/provenance.js.map +1 -0
  79. package/lib/utils/resolve.d.ts +81 -0
  80. package/lib/utils/resolve.d.ts.map +1 -0
  81. package/lib/utils/resolve.js +139 -0
  82. package/lib/utils/resolve.js.map +1 -0
  83. package/lib/utils/sdkBin.d.ts +18 -0
  84. package/lib/utils/sdkBin.d.ts.map +1 -0
  85. package/lib/utils/sdkBin.js +76 -0
  86. package/lib/utils/sdkBin.js.map +1 -0
  87. package/lib/utils/ui.d.ts +10 -1
  88. package/lib/utils/ui.d.ts.map +1 -1
  89. package/lib/utils/ui.js +18 -57
  90. package/lib/utils/ui.js.map +1 -1
  91. package/lib/utils/validate.d.ts +62 -0
  92. package/lib/utils/validate.d.ts.map +1 -0
  93. package/lib/utils/validate.js +189 -0
  94. package/lib/utils/validate.js.map +1 -0
  95. package/package.json +3 -2
@@ -1,235 +1,265 @@
1
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
- })();
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
35
5
  Object.defineProperty(exports, "__esModule", { value: true });
36
6
  exports.registerOtaRolloutCommands = registerOtaRolloutCommands;
7
+ const chalk_1 = __importDefault(require("chalk"));
37
8
  const credentials_1 = require("../utils/credentials");
38
9
  const client_1 = require("../api/client");
10
+ const validate_1 = require("../utils/validate");
11
+ const resolve_1 = require("../utils/resolve");
12
+ const prompt_1 = require("../utils/prompt");
13
+ const context_1 = require("../utils/context");
14
+ const output_1 = require("../utils/output");
39
15
  function client() {
40
16
  const creds = (0, credentials_1.readCredentials)();
41
- if (!creds) {
42
- console.error('Not logged in. Run `scalebun login` first.');
43
- process.exit(1);
44
- }
17
+ if (!creds)
18
+ (0, output_1.fail)('Not signed in.', ['Run `scalebun login` first.'], output_1.ExitCode.Usage);
45
19
  return new client_1.ApiClient(creds);
46
20
  }
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) {
21
+ async function loadReleases(api, appId) {
22
+ try {
58
23
  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;
24
+ const rows = Array.isArray(all) ? all : [];
25
+ // Any command that fetched releases refreshes the cache the splash reads,
26
+ // so the onboarding stage self-corrects without its own request.
27
+ (0, context_1.cacheReleaseCount)(rows.length, process.cwd());
28
+ return rows;
65
29
  }
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);
30
+ catch (err) {
31
+ (0, output_1.failFromError)('Could not list releases', err);
71
32
  }
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
33
  }
82
- function describe(r) {
83
- return `v${r.bundle?.version ?? '?'} (${r.bundle?.platform ?? '?'}) — ${r.status} @ ${r.rolloutPercent}%`;
34
+ /** Shared flags. Every control command takes the same three. */
35
+ function common(c) {
36
+ return c
37
+ .option('--app-id <id>', 'Scalebun app ID (resolved from scalebun.json when omitted)')
38
+ .option('--release-id <id>', 'Act on this release specifically')
39
+ .option('--json', 'Machine-readable output');
84
40
  }
85
41
  function registerOtaRolloutCommands(ota) {
86
42
  // ── releases ──────────────────────────────────────────────────────────────
87
43
  ota
88
44
  .command('releases')
89
45
  .description('List releases and their current rollout state')
90
- .requiredOption('--app-id <id>', 'Scalebun application ID')
46
+ .option('--app-id <id>', 'Scalebun app ID (resolved from scalebun.json when omitted)')
47
+ .option('--json', 'Machine-readable output')
91
48
  .action(async (opts) => {
92
49
  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.');
50
+ const appId = await (0, resolve_1.resolveAppId)({ appId: opts.appId, nonInteractive: opts.json });
51
+ const rows = await loadReleases(api, appId);
52
+ (0, output_1.emit)(() => {
53
+ if (!rows.length) {
54
+ console.log('\nNo releases yet.');
55
+ // The empty state is where an offered next step is worth most:
56
+ // there is nothing on screen to act on, so the only useful thing
57
+ // the command can do is point at what comes first.
58
+ (0, output_1.printNextSteps)([{ label: 'Ship one', argv: ['ota', 'publish'] }], chalk_1.default.cyan);
98
59
  return;
99
60
  }
100
61
  console.log('');
101
62
  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}`);
63
+ const marker = r.status === 'ACTIVE' ? chalk_1.default.cyan('▶') : ' ';
64
+ console.log(`${marker} ${chalk_1.default.bold((0, resolve_1.describeRelease)(r))}` +
65
+ (r.targetAppVersion ? chalk_1.default.dim(` targets ${r.targetAppVersion}`) : ''));
66
+ console.log(chalk_1.default.dim(` ${r.id}`));
107
67
  }
108
68
  console.log('');
109
- }
110
- catch (err) {
111
- console.error(`❌ ${err.message}`);
112
- process.exit(1);
113
- }
69
+ (0, output_1.printNextSteps)([
70
+ { label: 'Set the share', argv: ['ota', 'rollout', '--percent', '100'] },
71
+ { label: 'Stop one', argv: ['ota', 'pause'] },
72
+ { label: 'Watch them', argv: ['ota', 'status'] },
73
+ ], chalk_1.default.cyan);
74
+ }, { ok: true, count: rows.length, releases: rows });
114
75
  });
115
76
  // ── rollout ───────────────────────────────────────────────────────────────
116
- ota
77
+ common(ota
117
78
  .command('rollout')
118
79
  .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
- }
80
+ .requiredOption('--percent <n>', 'Target rollout percentage, 0-100')).action(async (opts) => {
128
81
  const api = client();
82
+ const appId = await (0, resolve_1.resolveAppId)({ appId: opts.appId, nonInteractive: opts.json });
83
+ // Validate before the round trip — the precedent publish set for itself.
84
+ // Shared with --rollout on publish and promote, so all three accept the
85
+ // same things — including a trailing `%`, which Number() reads as NaN.
86
+ const pct = (0, validate_1.checkedPercent)('--percent', opts.percent);
87
+ const releases = await loadReleases(api, appId);
88
+ const release = await (0, resolve_1.resolveRelease)(releases, {
89
+ releaseId: opts.releaseId,
90
+ statuses: ['ACTIVE', 'PAUSED'],
91
+ verb: 'widen',
92
+ nonInteractive: opts.json,
93
+ });
94
+ // Lowering does not take the bundle off devices that already applied it.
95
+ // Saying so here is the difference between an operator thinking they have
96
+ // undone something and discovering later that they have not.
97
+ if (pct < (release.rolloutPercent ?? 0) && !(0, output_1.isJson)()) {
98
+ console.log(chalk_1.default.yellow(`⚠️ Lowering ${release.rolloutPercent}% → ${pct}% stops NEW devices receiving it.\n` +
99
+ ' Devices that already applied the bundle keep it — `ota rollback` is how you take it away.'));
100
+ }
129
101
  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.`);
102
+ await api.patch(`/saas/apps/${appId}/ota/releases/${release.id}`, { rolloutPercent: pct });
141
103
  }
142
104
  catch (err) {
143
- console.error(`❌ ${err.message}`);
144
- process.exit(1);
105
+ (0, output_1.failFromError)('Could not set the rollout', err);
145
106
  }
107
+ (0, output_1.emit)(() => {
108
+ console.log(`✅ ${(0, resolve_1.describeRelease)(release)} → ${chalk_1.default.bold(`${pct}%`)}`);
109
+ (0, output_1.printNextSteps)([
110
+ { label: 'Watch it', argv: ['ota', 'status'] },
111
+ // Only offer widening while there is room to widen.
112
+ ...(pct < 100 ? [{ label: 'Widen it', argv: ['ota', 'rollout', '--percent', '100'] }] : []),
113
+ { label: 'Stop it', argv: ['ota', 'pause'] },
114
+ { label: 'Undo it', argv: ['ota', 'rollback'] },
115
+ ], chalk_1.default.cyan);
116
+ }, { ok: true, releaseId: release.id, rolloutPercent: pct });
146
117
  });
147
118
  // ── 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) => {
119
+ common(ota.command('pause').description('Pause a release — no new devices receive it')).action(async (opts) => {
154
120
  const api = client();
121
+ const appId = await (0, resolve_1.resolveAppId)({ appId: opts.appId, nonInteractive: opts.json });
122
+ const releases = await loadReleases(api, appId);
123
+ const release = await (0, resolve_1.resolveRelease)(releases, {
124
+ releaseId: opts.releaseId,
125
+ statuses: ['ACTIVE'],
126
+ verb: 'pause',
127
+ nonInteractive: opts.json,
128
+ });
155
129
  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.');
130
+ await api.patch(`/saas/apps/${appId}/ota/releases/${release.id}`, { status: 'PAUSED' });
163
131
  }
164
132
  catch (err) {
165
- console.error(`❌ ${err.message}`);
166
- process.exit(1);
133
+ (0, output_1.failFromError)('Could not pause', err);
167
134
  }
135
+ (0, output_1.emit)(() => {
136
+ console.log(`⏸ Paused ${chalk_1.default.bold((0, resolve_1.describeRelease)(release))}`);
137
+ console.log(chalk_1.default.dim(' Devices that already installed this bundle KEEP running it — pausing stops\n' +
138
+ ' distribution, it does not revert anyone. `ota rollback` does that.'));
139
+ (0, output_1.printNextSteps)([
140
+ { label: 'Undo the pause', argv: ['ota', 'resume'] },
141
+ { label: 'Revert devices', argv: ['ota', 'rollback'] },
142
+ { label: 'Watch it', argv: ['ota', 'status'] },
143
+ ], chalk_1.default.cyan);
144
+ }, { ok: true, releaseId: release.id, status: 'PAUSED' });
168
145
  });
169
146
  // ── 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) => {
147
+ common(ota.command('resume').description('Resume a paused release')).action(async (opts) => {
176
148
  const api = client();
149
+ const appId = await (0, resolve_1.resolveAppId)({ appId: opts.appId, nonInteractive: opts.json });
150
+ const releases = await loadReleases(api, appId);
151
+ // PAUSED, not ACTIVE — the whole point of resume is that the release is
152
+ // not active. The old resolver looked for ACTIVE and so could never have
153
+ // helped here, which is why this command demanded an explicit id.
154
+ const release = await (0, resolve_1.resolveRelease)(releases, {
155
+ releaseId: opts.releaseId,
156
+ statuses: ['PAUSED'],
157
+ verb: 'resume',
158
+ nonInteractive: opts.json,
159
+ });
177
160
  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.');
161
+ await api.patch(`/saas/apps/${appId}/ota/releases/${release.id}`, { status: 'ACTIVE' });
183
162
  }
184
163
  catch (err) {
185
- console.error(`❌ ${err.message}`);
186
- process.exit(1);
164
+ (0, output_1.failFromError)('Could not resume', err);
187
165
  }
166
+ (0, output_1.emit)(() => {
167
+ console.log(`▶ Resumed ${chalk_1.default.bold((0, resolve_1.describeRelease)(release))} at its existing rollout percentage.`);
168
+ (0, output_1.printNextSteps)([
169
+ { label: 'Watch it', argv: ['ota', 'status'] },
170
+ { label: 'Change the share', argv: ['ota', 'rollout', '--percent', '100'] },
171
+ { label: 'Stop it again', argv: ['ota', 'pause'] },
172
+ ], chalk_1.default.cyan);
173
+ }, { ok: true, releaseId: release.id, status: 'ACTIVE' });
188
174
  });
189
175
  // ── rollback ──────────────────────────────────────────────────────────────
190
- ota
176
+ common(ota
191
177
  .command('rollback')
192
178
  .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
179
  .option('--yes', 'Skip the confirmation prompt (required in CI)')
196
- .action(async (opts) => {
180
+ .option('--dry-run', 'Show the blast radius and exit without changing anything')).action(async (opts) => {
197
181
  const api = client();
182
+ const appId = await (0, resolve_1.resolveAppId)({ appId: opts.appId, nonInteractive: opts.json });
183
+ const releases = await loadReleases(api, appId);
184
+ const release = await (0, resolve_1.resolveRelease)(releases, {
185
+ releaseId: opts.releaseId,
186
+ statuses: ['ACTIVE', 'PAUSED'],
187
+ verb: 'roll back',
188
+ nonInteractive: opts.json || opts.yes,
189
+ });
190
+ // Who this actually touches. The dashboard has shown this for a while; the
191
+ // terminal asked you to confirm a fleet-wide revert with a version number
192
+ // and nothing else.
193
+ let blast = null;
198
194
  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
- }
195
+ blast = await api.get(`/saas/apps/${appId}/ota/releases/${release.id}/blast-radius`);
196
+ }
197
+ catch {
198
+ // Best-effort. An unreachable analytics route must never block the one
199
+ // command someone runs during an incident.
200
+ blast = null;
201
+ }
202
+ const renderBlast = () => {
203
+ if (!blast) {
204
+ console.log(chalk_1.default.dim(' Blast radius unavailable — proceeding without it.'));
205
+ return;
206
+ }
207
+ // 24, not 22: "excluded from estimate" is exactly 22 characters, so a
208
+ // 22-wide column produced "excluded from estimate2684".
209
+ const line = (k, v) => console.log(chalk_1.default.dim(` ${k.padEnd(24)}`) + v);
210
+ line('devices affected', String(blast.targetedDevices ?? 0));
211
+ // null means NOT MEASURED, and the service returns null deliberately.
212
+ // Printing 0 here would turn "we do not know" into "nobody is paying".
213
+ line('paying users', blast.payingUsers == null ? chalk_1.default.dim('not measured') : String(blast.payingUsers));
214
+ line('revenue at risk', blast.mrrAtRisk == null
215
+ ? chalk_1.default.dim('not measured')
216
+ : `${blast.mrrAtRisk} ${blast.currency ?? ''}`.trim());
217
+ if (blast.devicesWithoutInstallationId) {
218
+ line('excluded from estimate', `${blast.devicesWithoutInstallationId} without an install id`);
223
219
  }
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.');
220
+ };
221
+ if (opts.dryRun) {
222
+ (0, output_1.emit)(() => {
223
+ console.log('');
224
+ console.log(`🔎 Rolling back ${chalk_1.default.bold((0, resolve_1.describeRelease)(release))} would affect:`);
225
+ renderBlast();
226
+ console.log(chalk_1.default.dim('\n --dry-run: nothing was changed.\n'));
227
+ }, { ok: true, dryRun: true, releaseId: release.id, blastRadius: blast });
228
+ return;
229
+ }
230
+ if (!opts.yes) {
231
+ if ((0, resolve_1.isNonInteractive)()) {
232
+ (0, output_1.fail)('Refusing to roll back without confirmation.', ['Pass --yes to proceed in CI.'], output_1.ExitCode.Usage);
233
+ }
234
+ console.log('');
235
+ console.log(chalk_1.default.yellow(`⚠️ Roll back ${chalk_1.default.bold((0, resolve_1.describeRelease)(release))}?`));
236
+ renderBlast();
237
+ console.log(chalk_1.default.dim(' Every device on this release reverts to its previous bundle.'));
238
+ console.log('');
239
+ const ok = await (0, prompt_1.confirmPhrase)(' Type "yes" to confirm: ', 'yes', { caseInsensitive: true });
240
+ (0, prompt_1.closePrompts)();
241
+ if (!ok) {
242
+ console.log('Cancelled — nothing was rolled back.');
243
+ process.exit(output_1.ExitCode.Ok);
244
+ }
245
+ }
246
+ try {
247
+ await api.post(`/saas/apps/${appId}/ota/releases/${release.id}/rollback`, {});
228
248
  }
229
249
  catch (err) {
230
- console.error(`❌ ${err.message}`);
231
- process.exit(1);
250
+ (0, output_1.failFromError)('Rollback failed', err);
232
251
  }
252
+ (0, output_1.emit)(() => {
253
+ console.log(`↺ Rolled back ${chalk_1.default.bold((0, resolve_1.describeRelease)(release))}`);
254
+ console.log(chalk_1.default.dim(' Devices revert on their next check. Promote a newer bundle to move forward.'));
255
+ (0, output_1.printNextSteps)([
256
+ { label: 'Watch it', argv: ['ota', 'status'] },
257
+ // "Promote a newer bundle to move forward" is the sentence above;
258
+ // this is the command that does it.
259
+ { label: 'Ship a fix', argv: ['ota', 'promote'] },
260
+ { label: 'See every release', argv: ['ota', 'releases'] },
261
+ ], chalk_1.default.cyan);
262
+ }, { ok: true, releaseId: release.id, status: 'ROLLED_BACK', blastRadius: blast });
233
263
  });
234
264
  }
235
265
  //# sourceMappingURL=ota-rollout.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ota-rollout.js","sourceRoot":"","sources":["../../src/commands/ota-rollout.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ota-rollout.js","sourceRoot":"","sources":["../../src/commands/ota-rollout.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"quickstart.d.ts","sourceRoot":"","sources":["../../src/commands/quickstart.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA2CpC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA8D1D;AAED,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAoJhE"}
1
+ {"version":3,"file":"quickstart.d.ts","sourceRoot":"","sources":["../../src/commands/quickstart.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA8CpC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAsF1D;AAED,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAmOhE"}