@scalebun/cli 1.10.2 → 1.12.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 (98) 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-delete-bundle.d.ts.map +1 -1
  22. package/lib/commands/ota-delete-bundle.js +15 -4
  23. package/lib/commands/ota-delete-bundle.js.map +1 -1
  24. package/lib/commands/ota-inspect.d.ts +3 -0
  25. package/lib/commands/ota-inspect.d.ts.map +1 -0
  26. package/lib/commands/ota-inspect.js +258 -0
  27. package/lib/commands/ota-inspect.js.map +1 -0
  28. package/lib/commands/ota-keys.d.ts +25 -0
  29. package/lib/commands/ota-keys.d.ts.map +1 -1
  30. package/lib/commands/ota-keys.js +329 -27
  31. package/lib/commands/ota-keys.js.map +1 -1
  32. package/lib/commands/ota-promote.d.ts +3 -0
  33. package/lib/commands/ota-promote.d.ts.map +1 -0
  34. package/lib/commands/ota-promote.js +194 -0
  35. package/lib/commands/ota-promote.js.map +1 -0
  36. package/lib/commands/ota-publish.d.ts.map +1 -1
  37. package/lib/commands/ota-publish.js +108 -38
  38. package/lib/commands/ota-publish.js.map +1 -1
  39. package/lib/commands/ota-rollout.d.ts.map +1 -1
  40. package/lib/commands/ota-rollout.js +212 -171
  41. package/lib/commands/ota-rollout.js.map +1 -1
  42. package/lib/commands/quickstart.d.ts.map +1 -1
  43. package/lib/commands/quickstart.js +110 -8
  44. package/lib/commands/quickstart.js.map +1 -1
  45. package/lib/commands/shell.d.ts +28 -0
  46. package/lib/commands/shell.d.ts.map +1 -0
  47. package/lib/commands/shell.js +512 -0
  48. package/lib/commands/shell.js.map +1 -0
  49. package/lib/index.js +140 -4
  50. package/lib/index.js.map +1 -1
  51. package/lib/ui/menu.d.ts +109 -0
  52. package/lib/ui/menu.d.ts.map +1 -0
  53. package/lib/ui/menu.js +314 -0
  54. package/lib/ui/menu.js.map +1 -0
  55. package/lib/utils/bundle.d.ts.map +1 -1
  56. package/lib/utils/bundle.js +7 -1
  57. package/lib/utils/bundle.js.map +1 -1
  58. package/lib/utils/context.d.ts +88 -0
  59. package/lib/utils/context.d.ts.map +1 -0
  60. package/lib/utils/context.js +247 -0
  61. package/lib/utils/context.js.map +1 -0
  62. package/lib/utils/credentials.d.ts +16 -0
  63. package/lib/utils/credentials.d.ts.map +1 -1
  64. package/lib/utils/credentials.js +14 -3
  65. package/lib/utils/credentials.js.map +1 -1
  66. package/lib/utils/guide.d.ts +63 -0
  67. package/lib/utils/guide.d.ts.map +1 -0
  68. package/lib/utils/guide.js +189 -0
  69. package/lib/utils/guide.js.map +1 -0
  70. package/lib/utils/output.d.ts +96 -0
  71. package/lib/utils/output.d.ts.map +1 -0
  72. package/lib/utils/output.js +135 -0
  73. package/lib/utils/output.js.map +1 -0
  74. package/lib/utils/prompt.d.ts +109 -6
  75. package/lib/utils/prompt.d.ts.map +1 -1
  76. package/lib/utils/prompt.js +222 -20
  77. package/lib/utils/prompt.js.map +1 -1
  78. package/lib/utils/provenance.d.ts +30 -0
  79. package/lib/utils/provenance.d.ts.map +1 -0
  80. package/lib/utils/provenance.js +157 -0
  81. package/lib/utils/provenance.js.map +1 -0
  82. package/lib/utils/resolve.d.ts +81 -0
  83. package/lib/utils/resolve.d.ts.map +1 -0
  84. package/lib/utils/resolve.js +139 -0
  85. package/lib/utils/resolve.js.map +1 -0
  86. package/lib/utils/sdkBin.d.ts +18 -0
  87. package/lib/utils/sdkBin.d.ts.map +1 -0
  88. package/lib/utils/sdkBin.js +76 -0
  89. package/lib/utils/sdkBin.js.map +1 -0
  90. package/lib/utils/ui.d.ts +10 -1
  91. package/lib/utils/ui.d.ts.map +1 -1
  92. package/lib/utils/ui.js +18 -57
  93. package/lib/utils/ui.js.map +1 -1
  94. package/lib/utils/validate.d.ts +62 -0
  95. package/lib/utils/validate.d.ts.map +1 -0
  96. package/lib/utils/validate.js +189 -0
  97. package/lib/utils/validate.js.map +1 -0
  98. package/package.json +3 -2
@@ -32,14 +32,24 @@ var __importStar = (this && this.__importStar) || (function () {
32
32
  return result;
33
33
  };
34
34
  })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
35
38
  Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.ensureKeyDirGitignored = ensureKeyDirGitignored;
36
40
  exports.rawPublicKeyHex = rawPublicKeyHex;
41
+ exports.localPublicKeyHex = localPublicKeyHex;
37
42
  exports.registerOtaKeysCommand = registerOtaKeysCommand;
38
43
  exports.signBundleHash = signBundleHash;
39
44
  const crypto = __importStar(require("crypto"));
40
45
  const fs = __importStar(require("fs"));
41
46
  const path = __importStar(require("path"));
47
+ const chalk_1 = __importDefault(require("chalk"));
42
48
  const credentials_1 = require("../utils/credentials");
49
+ const resolve_1 = require("../utils/resolve");
50
+ const prompt_1 = require("../utils/prompt");
51
+ const output_1 = require("../utils/output");
52
+ const context_1 = require("../utils/context");
43
53
  const client_1 = require("../api/client");
44
54
  /**
45
55
  * Bundle signing keys (OTA-03).
@@ -56,12 +66,102 @@ const client_1 = require("../api/client");
56
66
  */
57
67
  const KEY_DIR = '.scalebun';
58
68
  const PRIVATE_KEY_FILE = 'ota-signing-key.pem';
69
+ /**
70
+ * Keep the private key out of version control WITHOUT relying on the operator
71
+ * reading a warning. The previous behaviour printed "NEVER commit this — add
72
+ * .scalebun/ to .gitignore" and stopped; anyone who scrolled past that line
73
+ * committed their signing key, and a signing key in git history is compromised
74
+ * even after the file is deleted.
75
+ *
76
+ * Rules, in order of caution:
77
+ * - Only the key's directory relative to cwd can be ignored by cwd's
78
+ * .gitignore; if --out points outside the project, we cannot help — report
79
+ * the manual step instead of writing a useless entry.
80
+ * - An existing .gitignore is appended to, never rewritten.
81
+ * - A missing .gitignore is created only when cwd is actually a git repo
82
+ * (a `.git` entry exists) — creating one in a non-repo would be litter.
83
+ *
84
+ * @returns a human-readable sentence describing what happened, for the summary.
85
+ */
86
+ function ensureKeyDirGitignored(outDir, cwd = process.cwd()) {
87
+ const rel = path.relative(cwd, outDir);
88
+ if (rel === '' || rel.startsWith('..') || path.isAbsolute(rel)) {
89
+ return `outside this project — add ${outDir} to that location's .gitignore yourself`;
90
+ }
91
+ // Normalise to forward slashes: gitignore patterns use `/` on every platform.
92
+ const entry = rel.split(path.sep).join('/') + '/';
93
+ const gitignorePath = path.join(cwd, '.gitignore');
94
+ try {
95
+ if (fs.existsSync(gitignorePath)) {
96
+ const lines = fs.readFileSync(gitignorePath, 'utf8').split(/\r?\n/);
97
+ const covered = lines.some((l) => {
98
+ const t = l.trim();
99
+ return t === entry || t === entry.slice(0, -1) || t === '/' + entry || t === '/' + entry.slice(0, -1);
100
+ });
101
+ if (covered)
102
+ return `already ignored by .gitignore (${entry})`;
103
+ const body = fs.readFileSync(gitignorePath, 'utf8');
104
+ const sep = body.length === 0 || body.endsWith('\n') ? '' : '\n';
105
+ fs.appendFileSync(gitignorePath, `${sep}\n# ScaleBun OTA signing key — never commit\n${entry}\n`);
106
+ return `added ${entry} to .gitignore`;
107
+ }
108
+ if (fs.existsSync(path.join(cwd, '.git'))) {
109
+ fs.writeFileSync(gitignorePath, `# ScaleBun OTA signing key — never commit\n${entry}\n`);
110
+ return `created .gitignore with ${entry}`;
111
+ }
112
+ return `no git repo detected — if you version this directory, ignore ${entry}`;
113
+ }
114
+ catch (err) {
115
+ return `could not update .gitignore (${err?.message ?? err}) — add ${entry} yourself`;
116
+ }
117
+ }
59
118
  /** Hex-encoded raw 32-byte ed25519 public key from a Node KeyObject. */
60
119
  function rawPublicKeyHex(publicKey) {
61
120
  // SPKI for ed25519 is a fixed 12-byte header followed by the 32-byte key.
62
121
  const spki = publicKey.export({ type: 'spki', format: 'der' });
63
122
  return spki.subarray(spki.length - 32).toString('hex');
64
123
  }
124
+ /**
125
+ * The public half of the local signing key, if one exists — so `register-key`
126
+ * can offer the right value as the default instead of asking the developer to
127
+ * paste a 64-char hex string. Reads the private key at `./.scalebun/…pem` and
128
+ * derives the public key from it; returns null when there is no local key.
129
+ */
130
+ function localPublicKeyHex(keyDir = KEY_DIR) {
131
+ try {
132
+ const privatePath = path.join(path.resolve(keyDir), PRIVATE_KEY_FILE);
133
+ if (!fs.existsSync(privatePath))
134
+ return null;
135
+ const priv = crypto.createPrivateKey(fs.readFileSync(privatePath));
136
+ return rawPublicKeyHex(crypto.createPublicKey(priv));
137
+ }
138
+ catch {
139
+ return null;
140
+ }
141
+ }
142
+ /**
143
+ * Are the JS verifier fallbacks present in the host app?
144
+ *
145
+ * Only used to decide whether to PRINT an install hint, never to gate anything —
146
+ * so a wrong answer costs a redundant line of advice, not a broken command.
147
+ * Walks up from the cwd because the CLI is run from the app root while the
148
+ * packages may be hoisted to a monorepo root above it.
149
+ */
150
+ function verifierPeersInstalled() {
151
+ let dir = process.cwd();
152
+ for (let hops = 0; hops < 6; hops++) {
153
+ const nm = path.join(dir, 'node_modules', '@noble');
154
+ if (fs.existsSync(path.join(nm, 'ed25519')) &&
155
+ fs.existsSync(path.join(nm, 'hashes'))) {
156
+ return true;
157
+ }
158
+ const up = path.dirname(dir);
159
+ if (up === dir)
160
+ break;
161
+ dir = up;
162
+ }
163
+ return false;
164
+ }
65
165
  function registerOtaKeysCommand(ota) {
66
166
  ota
67
167
  .command('generate-key-pair')
@@ -70,78 +170,203 @@ function registerOtaKeysCommand(ota) {
70
170
  .option('--name <name>', 'Label for the key in the dashboard')
71
171
  .option('--out <dir>', `Directory for the private key (default: ./${KEY_DIR})`)
72
172
  .option('--force', 'Overwrite an existing private key')
173
+ .option('--yes', 'Skip the overwrite confirmation (for CI)')
73
174
  .action(async (opts) => {
74
175
  const outDir = path.resolve(opts.out ?? KEY_DIR);
75
176
  const privatePath = path.join(outDir, PRIVATE_KEY_FILE);
76
- if (fs.existsSync(privatePath) && !opts.force) {
77
- console.error(`❌ A signing key already exists at ${privatePath}.\n` +
78
- ` Overwriting it means every bundle signed with the old key can no longer be\n` +
79
- ` verified by apps carrying the old public key. Pass --force if that is intended.`);
80
- process.exit(1);
177
+ const replacing = fs.existsSync(privatePath);
178
+ if (replacing && !opts.force) {
179
+ (0, output_1.fail)(`A signing key already exists at ${privatePath}.`, [
180
+ 'Overwriting it means every bundle signed with the old key can no longer',
181
+ 'be verified by apps that pin the old public key — those devices stop',
182
+ 'taking updates until they ship a new native build.',
183
+ '',
184
+ 'Pass --force if that is intended.',
185
+ ], output_1.ExitCode.Usage);
186
+ }
187
+ // --force gets you PAST the guard; it is not the confirmation itself.
188
+ // The flag is typed once, usually from memory or a runbook, and what sits
189
+ // on the other side of it strands every already-installed app. So the flag
190
+ // opens the door and the prompt asks the question — and the question is
191
+ // skipped only where there is nobody there to answer it.
192
+ if (replacing && opts.force && !(0, resolve_1.isNonInteractive)({ nonInteractive: opts.yes })) {
193
+ const ok = await (0, prompt_1.confirmDestructive)({
194
+ title: `Overwrite the signing key at ${privatePath}?`,
195
+ consequence: [
196
+ 'The current private key is destroyed. It cannot be recovered.',
197
+ 'Bundles already signed with it stop verifying on every device that',
198
+ 'carries the old public key.',
199
+ 'Those devices need a NEW NATIVE BUILD to trust the new key — an OTA',
200
+ 'update cannot repair this, because the pin lives in the binary.',
201
+ ],
202
+ confirmLabel: 'Overwrite the key',
203
+ });
204
+ (0, prompt_1.closePrompts)();
205
+ if (!ok) {
206
+ console.log('');
207
+ console.log('Cancelled. The existing key is untouched.');
208
+ return;
209
+ }
81
210
  }
82
211
  const { publicKey, privateKey } = crypto.generateKeyPairSync('ed25519');
83
212
  fs.mkdirSync(outDir, { recursive: true });
84
213
  fs.writeFileSync(privatePath, privateKey.export({ type: 'pkcs8', format: 'pem' }),
85
- // Owner read/write only. Irrelevant on Windows, correct everywhere else.
214
+ // Owner read/write only on POSIX. On Windows Node silently DROPS this
215
+ // mode, so the explicit ACL below is what actually protects the key
216
+ // there — the same treatment the credentials file already gets. A
217
+ // signing key with weaker protection than the login token would be
218
+ // backwards: this file is what proves your code is yours.
86
219
  { mode: 0o600 });
220
+ (0, credentials_1.restrictToCurrentUser)(privatePath, 'your OTA signing private key');
221
+ const gitignoreOutcome = ensureKeyDirGitignored(outDir);
87
222
  const publicHex = rawPublicKeyHex(publicKey);
88
223
  console.log(`\n🔑 ed25519 signing keypair generated.\n`);
89
224
  console.log(` Private key : ${privatePath}`);
90
- console.log(` NEVER commit this. Add ${KEY_DIR}/ to .gitignore.`);
225
+ console.log(` NEVER commit or share this file.`);
226
+ console.log(` Git : ${gitignoreOutcome}`);
91
227
  console.log(` Public key : ${publicHex}\n`);
92
- if (opts.appId) {
228
+ // The linked project already answers "which app". Making the user pass
229
+ // --app-id on top of `scalebun link` is the CLI forgetting what link was
230
+ // for; an explicit flag still wins when one is given.
231
+ const registerTo = opts.appId ?? (0, context_1.getContext)().appId;
232
+ if (registerTo) {
93
233
  const creds = (0, credentials_1.readCredentials)();
94
234
  if (!creds) {
95
- console.error('Not logged in. Run `scalebun login` first.');
235
+ console.error(chalk_1.default.red('Not logged in. Run `scalebun login` first.'));
96
236
  console.error(' The keypair was still written; register it later with:');
97
- console.error(` scalebun ota register-key --app-id <id> --public-key ${publicHex}`);
237
+ console.error(` scalebun ota register-key --public-key ${publicHex}`);
98
238
  process.exit(1);
99
239
  }
100
240
  const client = new client_1.ApiClient(creds);
101
241
  try {
102
- await client.post(`/saas/apps/${opts.appId}/ota/signing-keys`, {
242
+ await client.post(`/saas/apps/${registerTo}/ota/signing-keys`, {
103
243
  publicKey: publicHex,
104
244
  name: opts.name ?? `CLI ${new Date().toISOString().slice(0, 10)}`,
105
245
  });
106
- console.log('✅ Public key registered with ScaleBun.\n');
246
+ console.log(`Public key registered with ScaleBun (app ${registerTo}).`);
247
+ console.log('');
107
248
  }
108
249
  catch (err) {
109
- console.error(`❌ Failed to register public key: ${err.message}`);
110
- console.error(` Retry with: scalebun ota register-key --app-id ${opts.appId} --public-key ${publicHex}\n`);
250
+ console.error(chalk_1.default.red(`Failed to register public key: ${err.message}`));
251
+ console.error(` Retry with: scalebun ota register-key --public-key ${publicHex}`);
111
252
  process.exit(1);
112
253
  }
113
254
  }
114
255
  else {
115
- console.log('ℹ️ Pass --app-id to register the public key automatically.\n');
256
+ console.log('No app is linked, so the public key was not registered.');
257
+ console.log('Run `scalebun link` (or pass --app-id) and then `scalebun ota register-key`.');
258
+ console.log('');
116
259
  }
117
- console.log('Next: embed the PUBLIC key in your app and enforce it at init:\n');
260
+ console.log('Embed the PUBLIC key in your app and enforce it at init:');
261
+ console.log('');
118
262
  console.log(' ScaleBun.init({');
119
263
  console.log(' // …');
120
264
  console.log(' ota: {');
265
+ console.log(' enabled: true,');
121
266
  console.log(` publicSigningKey: '${publicHex}',`);
122
- console.log(' verifySignature: myEd25519Verifier,');
123
267
  console.log(' },');
124
- console.log(' })\n');
268
+ console.log(' })');
269
+ console.log('');
270
+ console.log('The SDK verifies every bundle against that key and REFUSES any update' +
271
+ ' that does not match. Supply `ota.verifySignature` only if you need to' +
272
+ ' override it — your own function always takes precedence.');
273
+ console.log('');
274
+ // Only mention the peers when they are actually missing, and say what
275
+ // they are FOR. Printing an unconditional `npm install` taught people the
276
+ // SDK cannot verify without it — it can: iOS uses CryptoKit and Android
277
+ // 13+ uses the platform Ed25519. The peers are the fallback for older
278
+ // Android, so on a modern-only floor this install is simply not needed.
279
+ if (!verifierPeersInstalled()) {
280
+ console.log('Verification runs natively on iOS (CryptoKit) and Android 13+.');
281
+ console.log('If you still support Android 12 or older, add the JS fallback:');
282
+ console.log('');
283
+ console.log(' npm install @noble/ed25519 @noble/hashes');
284
+ console.log('');
285
+ }
286
+ if (replacing) {
287
+ console.log(chalk_1.default.yellow('This key REPLACED an existing one. Apps already in the field pin the' +
288
+ ' old public key and will refuse every bundle signed with this one' +
289
+ ' until they are updated by a new native build. An OTA update cannot' +
290
+ ' carry the fix, because the pin lives in the binary that checks it.'));
291
+ console.log('');
292
+ }
293
+ (0, output_1.printNextSteps)([
294
+ ...(registerTo
295
+ ? []
296
+ : [
297
+ {
298
+ label: 'Link this project',
299
+ argv: ['link'],
300
+ },
301
+ ]),
302
+ { label: 'Confirm the key landed', argv: ['ota', 'keys'] },
303
+ {
304
+ label: 'Publish a signed bundle',
305
+ argv: ['ota', 'publish', '--channel', 'staging'],
306
+ },
307
+ ], chalk_1.default.cyan);
125
308
  });
126
309
  ota
127
310
  .command('register-key')
128
311
  .description('Register an existing ed25519 public key with an app')
129
- .requiredOption('--app-id <id>', 'Scalebun app ID')
130
- .requiredOption('--public-key <hex>', 'ed25519 public key (hex or base64)')
312
+ .option('--app-id <id>', 'Scalebun app ID (resolved from scalebun.json when omitted)')
313
+ // Not requiredOption: on a TTY the key defaults to the public half of the
314
+ // local ./.scalebun signing key, and the name is prompted. CI still needs the
315
+ // flag (or a local key) rather than hanging on a prompt.
316
+ .option('--public-key <hex>', 'ed25519 public key (hex or base64); read from ./.scalebun when omitted')
131
317
  .option('--name <name>', 'Label for the key in the dashboard')
132
318
  .action(async (opts) => {
319
+ const appId = await (0, resolve_1.resolveAppId)({ appId: opts.appId });
133
320
  const creds = (0, credentials_1.readCredentials)();
134
321
  if (!creds) {
135
322
  console.error('❌ Not logged in. Run `scalebun login` first.');
136
323
  process.exit(1);
137
324
  }
325
+ const nonInteractive = (0, resolve_1.isNonInteractive)();
326
+ // Public key: the flag, else the public half of the local signing key
327
+ // (offered as the default), else typed in.
328
+ let publicKey = opts.publicKey?.trim();
329
+ if (!publicKey) {
330
+ const local = localPublicKeyHex();
331
+ if (nonInteractive) {
332
+ if (!local) {
333
+ (0, output_1.fail)('A public key is required.', [
334
+ 'Pass --public-key <hex>, or run this in a terminal to read it',
335
+ 'from ./.scalebun automatically.',
336
+ ], output_1.ExitCode.Usage);
337
+ }
338
+ publicKey = local;
339
+ }
340
+ else {
341
+ publicKey = (await (0, prompt_1.text)('ed25519 public key (hex)', {
342
+ default: local ?? '',
343
+ help: local
344
+ ? 'Enter to use the public half of your local ./.scalebun signing key.'
345
+ : 'Paste the 64-character hex (or base64) public key.',
346
+ validate: (v) => /\s/.test(v)
347
+ ? 'A key has no spaces.'
348
+ : v.trim().length < 40
349
+ ? 'That looks too short for an ed25519 key.'
350
+ : null,
351
+ })).trim();
352
+ }
353
+ }
354
+ // Name: the flag, else prompted with a friendly default.
355
+ let name = opts.name?.trim();
356
+ if (!name && !nonInteractive) {
357
+ name = (await (0, prompt_1.text)('Key name (label shown in the dashboard)', {
358
+ default: 'cli',
359
+ allowEmpty: true,
360
+ })).trim();
361
+ }
362
+ (0, prompt_1.closePrompts)();
138
363
  const client = new client_1.ApiClient(creds);
139
364
  try {
140
- await client.post(`/saas/apps/${opts.appId}/ota/signing-keys`, {
141
- publicKey: opts.publicKey,
142
- name: opts.name ?? 'CLI',
365
+ await client.post(`/saas/apps/${appId}/ota/signing-keys`, {
366
+ publicKey,
367
+ name: name || 'CLI',
143
368
  });
144
- console.log('✅ Public key registered.\n');
369
+ console.log('\n✅ Public key registered.\n');
145
370
  }
146
371
  catch (err) {
147
372
  console.error(`❌ Failed to register public key: ${err.message}`);
@@ -151,8 +376,9 @@ function registerOtaKeysCommand(ota) {
151
376
  ota
152
377
  .command('keys')
153
378
  .description('List signing keys registered for an app')
154
- .requiredOption('--app-id <id>', 'Scalebun app ID')
379
+ .option('--app-id <id>', 'Scalebun app ID (resolved from scalebun.json when omitted)')
155
380
  .action(async (opts) => {
381
+ const appId = await (0, resolve_1.resolveAppId)({ appId: opts.appId });
156
382
  const creds = (0, credentials_1.readCredentials)();
157
383
  if (!creds) {
158
384
  console.error('❌ Not logged in. Run `scalebun login` first.');
@@ -160,8 +386,8 @@ function registerOtaKeysCommand(ota) {
160
386
  }
161
387
  const client = new client_1.ApiClient(creds);
162
388
  try {
163
- const keys = await client.get(`/saas/apps/${opts.appId}/ota/signing-keys`);
164
- console.log(`\n🔑 Signing keys for app ${opts.appId}:\n`);
389
+ const keys = await client.get(`/saas/apps/${appId}/ota/signing-keys`);
390
+ console.log(`\n🔑 Signing keys for app ${appId}:\n`);
165
391
  if (!keys?.length) {
166
392
  console.log(' (none — run `scalebun ota generate-key-pair --app-id <id>`)\n');
167
393
  return;
@@ -169,6 +395,7 @@ function registerOtaKeysCommand(ota) {
169
395
  for (const k of keys) {
170
396
  const state = k.revokedAt ? 'REVOKED' : 'active';
171
397
  console.log(` • ${(k.name ?? 'unnamed').padEnd(20)} ${state.padEnd(8)} ${k.publicKey.slice(0, 16)}…`);
398
+ console.log(` ${k.id}`);
172
399
  }
173
400
  console.log('');
174
401
  }
@@ -177,6 +404,81 @@ function registerOtaKeysCommand(ota) {
177
404
  process.exit(1);
178
405
  }
179
406
  });
407
+ /**
408
+ * `scalebun ota keys revoke` — the missing half of the state above.
409
+ *
410
+ * `ota keys` has always RENDERED a `REVOKED` state that the CLI itself could
411
+ * never produce: the route existed and was role-gated, and only the dashboard
412
+ * could reach it. Key compromise is the one signing operation that is
413
+ * time-critical, and a key ceremony typically runs from a hardened box with
414
+ * no browser session — so "open the dashboard" is exactly the wrong answer.
415
+ *
416
+ * Revocation is a soft delete server-side: the row survives for the audit
417
+ * trail, which is why this is a POST to /revoke and not a DELETE.
418
+ */
419
+ ota
420
+ .command('revoke-key')
421
+ .description('Revoke a signing key — bundles signed with it stop verifying')
422
+ .requiredOption('--key-id <id>', 'Signing key to revoke (from `scalebun ota keys`)')
423
+ .option('--app-id <id>', 'Scalebun app ID (resolved from scalebun.json when omitted)')
424
+ .option('--yes', 'Skip the confirmation (required off a TTY)')
425
+ .option('--json', 'Machine-readable output')
426
+ .action(async (opts) => {
427
+ const creds = (0, credentials_1.readCredentials)();
428
+ if (!creds)
429
+ (0, output_1.fail)('Not signed in.', ['Run `scalebun login` first.'], output_1.ExitCode.Usage);
430
+ const appId = await (0, resolve_1.resolveAppId)({ appId: opts.appId, nonInteractive: opts.json });
431
+ const client = new client_1.ApiClient(creds);
432
+ let keys;
433
+ try {
434
+ keys = await client.get(`/saas/apps/${appId}/ota/signing-keys`);
435
+ }
436
+ catch (err) {
437
+ (0, output_1.failFromError)('Could not list signing keys', err);
438
+ }
439
+ const target = (keys ?? []).find((k) => k.id === opts.keyId);
440
+ if (!target) {
441
+ (0, output_1.fail)(`No signing key ${opts.keyId} on this app.`, (keys ?? []).map((k) => ` ${k.id} ${k.name ?? 'unnamed'}`), output_1.ExitCode.Usage);
442
+ }
443
+ if (target.revokedAt) {
444
+ // Already revoked is not a failure — a rotation script re-running must
445
+ // not fail the pipeline for reaching the state it wanted.
446
+ (0, output_1.emit)(() => console.log(`\n${chalk_1.default.dim(`${target.name ?? target.id} is already revoked.`)}\n`), { ok: true, keyId: target.id, alreadyRevoked: true });
447
+ return;
448
+ }
449
+ if (!opts.yes) {
450
+ if ((0, resolve_1.isNonInteractive)({ nonInteractive: opts.json })) {
451
+ (0, output_1.fail)('Refusing to revoke a signing key without confirmation.', ['Pass --yes if this is intentional.'], output_1.ExitCode.Usage);
452
+ }
453
+ console.log('');
454
+ console.log(chalk_1.default.yellow(`⚠️ Revoking ${chalk_1.default.bold(target.name ?? target.id)}.\n` +
455
+ ' Apps pinning ONLY this key will refuse every future update — that is\n' +
456
+ ' fail-closed by design. Register the replacement and ship a build\n' +
457
+ ' pinning both before revoking the old one.'));
458
+ const ok = await (0, prompt_1.confirmDestructive)({
459
+ title: `Revoke ${target.name ?? target.id}?`,
460
+ consequence: [
461
+ 'Apps pinning ONLY this key refuse every future update — fail-closed',
462
+ 'by design, and not repairable over the air.',
463
+ ],
464
+ confirmLabel: 'Revoke the key',
465
+ });
466
+ (0, prompt_1.closePrompts)();
467
+ if (!ok) {
468
+ console.log('Cancelled — the key is still active.');
469
+ process.exit(output_1.ExitCode.Ok);
470
+ }
471
+ }
472
+ try {
473
+ await client.post(`/saas/apps/${appId}/ota/signing-keys/${target.id}/revoke`, {});
474
+ }
475
+ catch (err) {
476
+ (0, output_1.failFromError)('Could not revoke the key', err, [
477
+ 'Revoking a signing key requires an owner or admin role.',
478
+ ]);
479
+ }
480
+ (0, output_1.emit)(() => console.log(`\n🔒 Revoked ${chalk_1.default.bold(target.name ?? target.id)}\n`), { ok: true, keyId: target.id, revoked: true });
481
+ });
180
482
  }
181
483
  /**
182
484
  * Sign a bundle hash with the locally-held private key.
@@ -1 +1 @@
1
- {"version":3,"file":"ota-keys.js","sourceRoot":"","sources":["../../src/commands/ota-keys.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ota-keys.js","sourceRoot":"","sources":["../../src/commands/ota-keys.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerOtaPromoteCommand(ota: Command): void;
3
+ //# sourceMappingURL=ota-promote.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ota-promote.d.ts","sourceRoot":"","sources":["../../src/commands/ota-promote.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAqDpC,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,CA6M5D"}