@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
@@ -0,0 +1,258 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.registerOtaInspectCommands = registerOtaInspectCommands;
7
+ const chalk_1 = __importDefault(require("chalk"));
8
+ const client_1 = require("../api/client");
9
+ const validate_1 = require("../utils/validate");
10
+ const output_1 = require("../utils/output");
11
+ /** Kept beside the flags that accept them so the help text cannot drift. */
12
+ const PLATFORMS = ['android', 'ios'];
13
+ const BUNDLE_SORTS = ['newest', 'oldest', 'version', 'largest'];
14
+ const credentials_1 = require("../utils/credentials");
15
+ const resolve_1 = require("../utils/resolve");
16
+ const context_1 = require("../utils/context");
17
+ const output_2 = require("../utils/output");
18
+ /** Decimal MB, defined once. The dashboard reported MiB on one tab and MB on
19
+ * another, both labelled "MB", so the same bundle showed two sizes. */
20
+ function mb(bytes) {
21
+ if (typeof bytes !== 'number')
22
+ return '—';
23
+ return `${(bytes / 1000000).toFixed(2)} MB`;
24
+ }
25
+ function age(iso) {
26
+ if (!iso)
27
+ return '—';
28
+ const ms = Date.now() - new Date(iso).getTime();
29
+ if (!Number.isFinite(ms) || ms < 0)
30
+ return '—';
31
+ const h = ms / 3600000;
32
+ if (h < 1)
33
+ return `${Math.max(1, Math.round(ms / 60000))}m`;
34
+ if (h < 48)
35
+ return `${Math.round(h)}h`;
36
+ return `${Math.round(h / 24)}d`;
37
+ }
38
+ /**
39
+ * One vocabulary for a rate, used everywhere.
40
+ *
41
+ * The dashboard rendered this five different ways — "no data", "not measured",
42
+ * "too early", a green "0.00% ✓" and a flat "0%". Two of those manufactured a
43
+ * passing grade out of zero installs. Three states only: a number, "collecting"
44
+ * below the floor, or a named reason.
45
+ */
46
+ const RATE_FLOOR = 25;
47
+ function rate(installs = 0, rollbacks = 0) {
48
+ if (installs === 0)
49
+ return chalk_1.default.dim('no installs');
50
+ if (installs < RATE_FLOOR)
51
+ return chalk_1.default.dim(`collecting · ${installs}/${RATE_FLOOR}`);
52
+ const pct = (rollbacks / installs) * 100;
53
+ const s = `${pct.toFixed(1)}%`;
54
+ return pct >= 5 ? chalk_1.default.red(s) : pct >= 2 ? chalk_1.default.yellow(s) : chalk_1.default.green(s);
55
+ }
56
+ function statusLabel(s) {
57
+ switch (s) {
58
+ case 'ACTIVE': return chalk_1.default.cyan('live');
59
+ case 'PAUSED': return chalk_1.default.yellow('paused');
60
+ case 'ROLLED_BACK': return chalk_1.default.red('rolled back');
61
+ // Superseded is the NORMAL end of every release, so it is never coloured
62
+ // like a failure. Painting it red made 7 of 8 rows look like disasters.
63
+ case 'SUPERSEDED': return chalk_1.default.dim('superseded');
64
+ default: return chalk_1.default.dim(s.toLowerCase());
65
+ }
66
+ }
67
+ function registerOtaInspectCommands(ota) {
68
+ // ── ota bundles ───────────────────────────────────────────────────────────
69
+ ota
70
+ .command('bundles')
71
+ .alias('bundle-list')
72
+ .description('List uploaded bundles — the only way to learn a --bundle-id')
73
+ .option('--app-id <id>', 'Scalebun app ID (resolved from scalebun.json when omitted)')
74
+ .option('--platform <p>', 'ios | android')
75
+ .option('--signed <v>', 'signed | unsigned')
76
+ .option('--search <q>', 'Match version, hash or note')
77
+ .option('--sort <s>', 'newest | oldest | version | largest', 'newest')
78
+ .option('--limit <n>', 'How many to show', '20')
79
+ .option('--latest', 'Print only the newest bundle id, for scripting')
80
+ .option('--json', 'Machine-readable output')
81
+ .action(async (opts) => {
82
+ const creds = (0, credentials_1.readCredentials)();
83
+ if (!creds)
84
+ (0, output_2.fail)('Not signed in.', ['Run `scalebun login`.'], output_2.ExitCode.Usage);
85
+ const appId = await (0, resolve_1.resolveAppId)({ appId: opts.appId, nonInteractive: opts.json });
86
+ // Everything is checked BEFORE the round trip: a typo should cost a
87
+ // second, not a request. (--limit was validated after the fetch, so junk
88
+ // still paid for the network.)
89
+ const limit = (0, validate_1.checkedInt)('--limit', opts.limit, { min: 1, max: 1000, fallback: 20 });
90
+ // Every one of these was forwarded to the API verbatim. A typo did not
91
+ // fail — it produced a filtered list that looked authoritative, which is
92
+ // the worst outcome for a command whose whole job is telling you what
93
+ // exists.
94
+ const qs = new URLSearchParams();
95
+ if (opts.platform)
96
+ qs.set('platform', (0, validate_1.checkedEnum)('--platform', opts.platform, PLATFORMS, { caseInsensitive: true }));
97
+ if (opts.signed)
98
+ qs.set('signed', (0, validate_1.checkedEnum)('--signed', opts.signed, ['signed', 'unsigned'], { caseInsensitive: true }));
99
+ if (opts.search)
100
+ qs.set('search', opts.search);
101
+ if (opts.sort)
102
+ qs.set('sort', (0, validate_1.checkedEnum)('--sort', opts.sort, BUNDLE_SORTS, { caseInsensitive: true }));
103
+ let rows;
104
+ try {
105
+ const res = await new client_1.ApiClient(creds).get(`/saas/apps/${appId}/ota/bundles${qs.toString() ? `?${qs}` : ''}`);
106
+ // The endpoint returns a plain array without `page` and an envelope
107
+ // with it — accept both rather than pinning one shape.
108
+ rows = Array.isArray(res) ? res : (res?.rows ?? []);
109
+ }
110
+ catch (err) {
111
+ (0, output_2.failFromError)('Could not list bundles', err);
112
+ }
113
+ const shown = rows.slice(0, limit);
114
+ // --latest exists so a pipeline can do the thing that was impossible:
115
+ // BUNDLE=$(scalebun ota bundles --latest)
116
+ if (opts.latest) {
117
+ const newest = shown[0];
118
+ if (!newest)
119
+ (0, output_2.fail)('No bundles on this app.', [], output_2.ExitCode.Usage);
120
+ (0, output_2.emit)(() => console.log(newest.id), { ok: true, bundleId: newest.id, version: newest.version ?? null });
121
+ return;
122
+ }
123
+ (0, output_2.emit)(() => {
124
+ if (!shown.length) {
125
+ console.log('\nNo bundles match.');
126
+ // The early return skipped the block at the end of this function,
127
+ // so the empty state — the one place a next step is worth most,
128
+ // because there is nothing on screen to act on — offered nothing.
129
+ (0, output_1.printNextSteps)([{ label: 'Build and ship one', argv: ['ota', 'publish'] }], chalk_1.default.cyan);
130
+ return;
131
+ }
132
+ console.log('');
133
+ for (const b of shown) {
134
+ const v = b.version != null ? `v${b.version}` : b.id.slice(0, 8);
135
+ const sig = b.signature ? chalk_1.default.green('signed') : chalk_1.default.yellow('unsigned');
136
+ console.log(` ${chalk_1.default.bold(v.padEnd(6))} ${chalk_1.default.dim((b.platform ?? '?').padEnd(8))} ` +
137
+ `${mb(b.sizeBytes).padStart(9)} ${sig.padEnd(18)} ${chalk_1.default.dim(age(b.createdAt).padStart(4))} ${chalk_1.default.dim(b.id)}`);
138
+ }
139
+ if (rows.length > shown.length) {
140
+ console.log(chalk_1.default.dim(`\n ${rows.length - shown.length} more — raise --limit to see them.`));
141
+ }
142
+ console.log('');
143
+ // This list exists to find something to promote — its own help text
144
+ // calls it "the only way to learn a --bundle-id". The empty case
145
+ // returned above, so there is nothing to branch on here.
146
+ (0, output_1.printNextSteps)([
147
+ { label: 'Make one live', argv: ['ota', 'promote'] },
148
+ { label: 'See what is live', argv: ['ota', 'status'] },
149
+ ], chalk_1.default.cyan);
150
+ }, { ok: true, count: shown.length, total: rows.length, bundles: shown });
151
+ });
152
+ // ── ota status ────────────────────────────────────────────────────────────
153
+ ota
154
+ .command('status')
155
+ .description('What is live, and what needs a decision')
156
+ .option('--app-id <id>', 'Scalebun app ID (resolved from scalebun.json when omitted)')
157
+ .option('--fail-on <level>', 'Exit 3 when an item at this level exists: act | read')
158
+ .option('--json', 'Machine-readable output')
159
+ .action(async (opts) => {
160
+ // Checked here rather than where it is used, at the bottom of the action:
161
+ // a typo used to disable the gate silently — `--fail-on acts` matched no
162
+ // branch, the command exited 0, and the pipeline went green having
163
+ // checked nothing. A gate that a typo can switch off is not a gate. And
164
+ // validating up here means the whole report is not printed before the
165
+ // usage error that invalidates it.
166
+ const failOn = opts.failOn
167
+ ? (0, validate_1.checkedEnum)('--fail-on', opts.failOn, ['act', 'read'], { caseInsensitive: true })
168
+ : undefined;
169
+ const creds = (0, credentials_1.readCredentials)();
170
+ if (!creds)
171
+ (0, output_2.fail)('Not signed in.', ['Run `scalebun login`.'], output_2.ExitCode.Usage);
172
+ const appId = await (0, resolve_1.resolveAppId)({ appId: opts.appId, nonInteractive: opts.json });
173
+ const client = new client_1.ApiClient(creds);
174
+ // Composed from endpoints that already exist. Attention evaluates guards
175
+ // DRY, so asking for status can never pause a live release.
176
+ const [releases, attention] = await Promise.all([
177
+ client.get(`/saas/apps/${appId}/ota/releases`).catch(() => []),
178
+ client.get(`/saas/apps/${appId}/ota/attention`).catch(() => null),
179
+ ]);
180
+ // Any command that fetched releases refreshes the cache the splash reads.
181
+ if (Array.isArray(releases))
182
+ (0, context_1.cacheReleaseCount)(releases.length, process.cwd());
183
+ const live = (releases ?? []).filter((r) => r.status === 'ACTIVE');
184
+ const items = attention?.items ?? [];
185
+ const actItems = items.filter((i) => i.severity === 'act');
186
+ (0, output_2.emit)(() => {
187
+ console.log('');
188
+ if (!live.length) {
189
+ console.log(chalk_1.default.dim(' Nothing is live on this app.'));
190
+ }
191
+ for (const r of live) {
192
+ const v = r.bundle?.version != null ? `v${r.bundle.version}` : r.id.slice(0, 8);
193
+ const s = r.stats ?? {};
194
+ console.log(` ${chalk_1.default.bold(v)} ${statusLabel(r.status)} ${chalk_1.default.dim('@')} ${chalk_1.default.bold(`${r.rolloutPercent ?? 0}%`)}` +
195
+ chalk_1.default.dim(` ${r.bundle?.platform ?? ''} · ${r.bundle?.channel?.name ?? 'default'} · ${age(r.createdAt)} old`));
196
+ console.log(chalk_1.default.dim(` installs `) + String(s.installs ?? 0).padEnd(8) +
197
+ chalk_1.default.dim('rollback rate ') + rate(s.installs, s.rollbacks));
198
+ }
199
+ console.log('');
200
+ if (!attention) {
201
+ console.log(chalk_1.default.yellow(' Could not evaluate what needs a decision.'));
202
+ }
203
+ else {
204
+ const g = attention.guards;
205
+ if (g) {
206
+ // NEVER collapse an unevaluated guard into "0 breaching" — an app
207
+ // that was not measured has not been found clean.
208
+ const breach = g.evaluated
209
+ ? `${g.breaching ?? 0} breaching`
210
+ : chalk_1.default.dim(`not evaluated${g.reason ? ` (${g.reason})` : ''}`);
211
+ console.log(chalk_1.default.dim(` guards ${g.armed} armed · ${breach}`));
212
+ }
213
+ if (!items.length) {
214
+ console.log(chalk_1.default.green(' Nothing needs a decision.'));
215
+ }
216
+ else {
217
+ for (const i of items) {
218
+ const tag = i.severity === 'act' ? chalk_1.default.yellow('act ') : chalk_1.default.dim('read');
219
+ console.log(` ${tag} ${i.title}`);
220
+ if (i.facts?.length)
221
+ console.log(chalk_1.default.dim(` ${i.facts.join(' · ')}`));
222
+ }
223
+ }
224
+ }
225
+ // Offer the levers that match the state. With a release live these
226
+ // are the three things you can do about it; with nothing live the
227
+ // only honest suggestion is to ship something.
228
+ (0, output_1.printNextSteps)(live.length
229
+ ? [
230
+ { label: 'Change the share', argv: ['ota', 'rollout', '--percent', '100'] },
231
+ { label: 'Stop new deliveries', argv: ['ota', 'pause'] },
232
+ { label: 'Revert every device', argv: ['ota', 'rollback'] },
233
+ ]
234
+ : [{ label: 'Ship an update', argv: ['ota', 'publish'] }], chalk_1.default.cyan);
235
+ }, {
236
+ ok: true,
237
+ live: live.map((r) => ({
238
+ id: r.id, version: r.bundle?.version ?? null,
239
+ rolloutPercent: r.rolloutPercent ?? 0, stats: r.stats ?? {},
240
+ })),
241
+ guards: attention?.guards ?? null,
242
+ attention: items,
243
+ });
244
+ // --fail-on turns status into a CI gate. Exit 3 is "a check you asked for
245
+ // said no" — distinct from a 4xx (2) and from the API being down (4).
246
+ if (failOn === 'act' && actItems.length) {
247
+ if (!(0, output_2.isJson)())
248
+ console.error(chalk_1.default.yellow(` ${actItems.length} decision(s) waiting.`));
249
+ process.exit(output_2.ExitCode.Gate);
250
+ }
251
+ if (failOn === 'read' && items.length) {
252
+ if (!(0, output_2.isJson)())
253
+ console.error(chalk_1.default.yellow(` ${items.length} item(s) to review.`));
254
+ process.exit(output_2.ExitCode.Gate);
255
+ }
256
+ });
257
+ }
258
+ //# sourceMappingURL=ota-inspect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ota-inspect.js","sourceRoot":"","sources":["../../src/commands/ota-inspect.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,23 @@
1
1
  import { Command } from 'commander';
2
2
  import * as crypto from 'crypto';
3
+ /**
4
+ * Keep the private key out of version control WITHOUT relying on the operator
5
+ * reading a warning. The previous behaviour printed "NEVER commit this — add
6
+ * .scalebun/ to .gitignore" and stopped; anyone who scrolled past that line
7
+ * committed their signing key, and a signing key in git history is compromised
8
+ * even after the file is deleted.
9
+ *
10
+ * Rules, in order of caution:
11
+ * - Only the key's directory relative to cwd can be ignored by cwd's
12
+ * .gitignore; if --out points outside the project, we cannot help — report
13
+ * the manual step instead of writing a useless entry.
14
+ * - An existing .gitignore is appended to, never rewritten.
15
+ * - A missing .gitignore is created only when cwd is actually a git repo
16
+ * (a `.git` entry exists) — creating one in a non-repo would be litter.
17
+ *
18
+ * @returns a human-readable sentence describing what happened, for the summary.
19
+ */
20
+ export declare function ensureKeyDirGitignored(outDir: string, cwd?: string): string;
3
21
  /** Hex-encoded raw 32-byte ed25519 public key from a Node KeyObject. */
4
22
  export declare function rawPublicKeyHex(publicKey: crypto.KeyObject): string;
5
23
  export declare function registerOtaKeysCommand(ota: Command): void;
@@ -1 +1 @@
1
- {"version":3,"file":"ota-keys.d.ts","sourceRoot":"","sources":["../../src/commands/ota-keys.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AA+BjC,wEAAwE;AACxE,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,CAAC,SAAS,GAAG,MAAM,CAInE;AAED,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,CA0JzD;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAC5B,SAAS,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE,MAAM,GACd,MAAM,GAAG,IAAI,CAcf"}
1
+ {"version":3,"file":"ota-keys.d.ts","sourceRoot":"","sources":["../../src/commands/ota-keys.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AA2BjC;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,GAAE,MAAsB,GAAG,MAAM,CA8B1F;AAUD,wEAAwE;AACxE,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,CAAC,SAAS,GAAG,MAAM,CAInE;AAED,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,CAwQzD;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAC5B,SAAS,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE,MAAM,GACd,MAAM,GAAG,IAAI,CAcf"}
@@ -32,14 +32,22 @@ 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;
37
41
  exports.registerOtaKeysCommand = registerOtaKeysCommand;
38
42
  exports.signBundleHash = signBundleHash;
39
43
  const crypto = __importStar(require("crypto"));
40
44
  const fs = __importStar(require("fs"));
41
45
  const path = __importStar(require("path"));
46
+ const chalk_1 = __importDefault(require("chalk"));
42
47
  const credentials_1 = require("../utils/credentials");
48
+ const resolve_1 = require("../utils/resolve");
49
+ const prompt_1 = require("../utils/prompt");
50
+ const output_1 = require("../utils/output");
43
51
  const client_1 = require("../api/client");
44
52
  /**
45
53
  * Bundle signing keys (OTA-03).
@@ -56,6 +64,55 @@ const client_1 = require("../api/client");
56
64
  */
57
65
  const KEY_DIR = '.scalebun';
58
66
  const PRIVATE_KEY_FILE = 'ota-signing-key.pem';
67
+ /**
68
+ * Keep the private key out of version control WITHOUT relying on the operator
69
+ * reading a warning. The previous behaviour printed "NEVER commit this — add
70
+ * .scalebun/ to .gitignore" and stopped; anyone who scrolled past that line
71
+ * committed their signing key, and a signing key in git history is compromised
72
+ * even after the file is deleted.
73
+ *
74
+ * Rules, in order of caution:
75
+ * - Only the key's directory relative to cwd can be ignored by cwd's
76
+ * .gitignore; if --out points outside the project, we cannot help — report
77
+ * the manual step instead of writing a useless entry.
78
+ * - An existing .gitignore is appended to, never rewritten.
79
+ * - A missing .gitignore is created only when cwd is actually a git repo
80
+ * (a `.git` entry exists) — creating one in a non-repo would be litter.
81
+ *
82
+ * @returns a human-readable sentence describing what happened, for the summary.
83
+ */
84
+ function ensureKeyDirGitignored(outDir, cwd = process.cwd()) {
85
+ const rel = path.relative(cwd, outDir);
86
+ if (rel === '' || rel.startsWith('..') || path.isAbsolute(rel)) {
87
+ return `outside this project — add ${outDir} to that location's .gitignore yourself`;
88
+ }
89
+ // Normalise to forward slashes: gitignore patterns use `/` on every platform.
90
+ const entry = rel.split(path.sep).join('/') + '/';
91
+ const gitignorePath = path.join(cwd, '.gitignore');
92
+ try {
93
+ if (fs.existsSync(gitignorePath)) {
94
+ const lines = fs.readFileSync(gitignorePath, 'utf8').split(/\r?\n/);
95
+ const covered = lines.some((l) => {
96
+ const t = l.trim();
97
+ return t === entry || t === entry.slice(0, -1) || t === '/' + entry || t === '/' + entry.slice(0, -1);
98
+ });
99
+ if (covered)
100
+ return `already ignored by .gitignore (${entry})`;
101
+ const body = fs.readFileSync(gitignorePath, 'utf8');
102
+ const sep = body.length === 0 || body.endsWith('\n') ? '' : '\n';
103
+ fs.appendFileSync(gitignorePath, `${sep}\n# ScaleBun OTA signing key — never commit\n${entry}\n`);
104
+ return `added ${entry} to .gitignore`;
105
+ }
106
+ if (fs.existsSync(path.join(cwd, '.git'))) {
107
+ fs.writeFileSync(gitignorePath, `# ScaleBun OTA signing key — never commit\n${entry}\n`);
108
+ return `created .gitignore with ${entry}`;
109
+ }
110
+ return `no git repo detected — if you version this directory, ignore ${entry}`;
111
+ }
112
+ catch (err) {
113
+ return `could not update .gitignore (${err?.message ?? err}) — add ${entry} yourself`;
114
+ }
115
+ }
59
116
  /** Hex-encoded raw 32-byte ed25519 public key from a Node KeyObject. */
60
117
  function rawPublicKeyHex(publicKey) {
61
118
  // SPKI for ed25519 is a fixed 12-byte header followed by the 32-byte key.
@@ -82,12 +139,19 @@ function registerOtaKeysCommand(ota) {
82
139
  const { publicKey, privateKey } = crypto.generateKeyPairSync('ed25519');
83
140
  fs.mkdirSync(outDir, { recursive: true });
84
141
  fs.writeFileSync(privatePath, privateKey.export({ type: 'pkcs8', format: 'pem' }),
85
- // Owner read/write only. Irrelevant on Windows, correct everywhere else.
142
+ // Owner read/write only on POSIX. On Windows Node silently DROPS this
143
+ // mode, so the explicit ACL below is what actually protects the key
144
+ // there — the same treatment the credentials file already gets. A
145
+ // signing key with weaker protection than the login token would be
146
+ // backwards: this file is what proves your code is yours.
86
147
  { mode: 0o600 });
148
+ (0, credentials_1.restrictToCurrentUser)(privatePath, 'your OTA signing private key');
149
+ const gitignoreOutcome = ensureKeyDirGitignored(outDir);
87
150
  const publicHex = rawPublicKeyHex(publicKey);
88
151
  console.log(`\n🔑 ed25519 signing keypair generated.\n`);
89
152
  console.log(` Private key : ${privatePath}`);
90
- console.log(` NEVER commit this. Add ${KEY_DIR}/ to .gitignore.`);
153
+ console.log(` NEVER commit or share this file.`);
154
+ console.log(` Git : ${gitignoreOutcome}`);
91
155
  console.log(` Public key : ${publicHex}\n`);
92
156
  if (opts.appId) {
93
157
  const creds = (0, credentials_1.readCredentials)();
@@ -114,14 +178,24 @@ function registerOtaKeysCommand(ota) {
114
178
  else {
115
179
  console.log('ℹ️ Pass --app-id to register the public key automatically.\n');
116
180
  }
117
- console.log('Next: embed the PUBLIC key in your app and enforce it at init:\n');
181
+ // This used to print `verifySignature: myEd25519Verifier` a
182
+ // placeholder that left every adopter to hand-write ~100 lines of
183
+ // crypto plumbing for the most security-critical path in the product.
184
+ // The SDK now ships that verifier; all the developer owes is one
185
+ // install and the pinned key.
186
+ console.log('Next: install the verifier peers (once per app):\n');
187
+ console.log(' npm install @noble/ed25519 @noble/hashes\n');
188
+ console.log('Then embed the PUBLIC key in your app and enforce it at init:\n');
118
189
  console.log(' ScaleBun.init({');
119
190
  console.log(' // …');
120
191
  console.log(' ota: {');
192
+ console.log(' enabled: true,');
121
193
  console.log(` publicSigningKey: '${publicHex}',`);
122
- console.log(' verifySignature: myEd25519Verifier,');
123
194
  console.log(' },');
124
195
  console.log(' })\n');
196
+ console.log('The SDK verifies every bundle against that key and REFUSES any update\n' +
197
+ 'that does not match. Supply `ota.verifySignature` only if you need to\n' +
198
+ 'override it — your own function always takes precedence.\n');
125
199
  });
126
200
  ota
127
201
  .command('register-key')
@@ -169,6 +243,7 @@ function registerOtaKeysCommand(ota) {
169
243
  for (const k of keys) {
170
244
  const state = k.revokedAt ? 'REVOKED' : 'active';
171
245
  console.log(` • ${(k.name ?? 'unnamed').padEnd(20)} ${state.padEnd(8)} ${k.publicKey.slice(0, 16)}…`);
246
+ console.log(` ${k.id}`);
172
247
  }
173
248
  console.log('');
174
249
  }
@@ -177,6 +252,76 @@ function registerOtaKeysCommand(ota) {
177
252
  process.exit(1);
178
253
  }
179
254
  });
255
+ /**
256
+ * `scalebun ota keys revoke` — the missing half of the state above.
257
+ *
258
+ * `ota keys` has always RENDERED a `REVOKED` state that the CLI itself could
259
+ * never produce: the route existed and was role-gated, and only the dashboard
260
+ * could reach it. Key compromise is the one signing operation that is
261
+ * time-critical, and a key ceremony typically runs from a hardened box with
262
+ * no browser session — so "open the dashboard" is exactly the wrong answer.
263
+ *
264
+ * Revocation is a soft delete server-side: the row survives for the audit
265
+ * trail, which is why this is a POST to /revoke and not a DELETE.
266
+ */
267
+ ota
268
+ .command('revoke-key')
269
+ .description('Revoke a signing key — bundles signed with it stop verifying')
270
+ .requiredOption('--key-id <id>', 'Signing key to revoke (from `scalebun ota keys`)')
271
+ .option('--app-id <id>', 'Scalebun app ID (resolved from scalebun.json when omitted)')
272
+ .option('--yes', 'Skip the confirmation (required off a TTY)')
273
+ .option('--json', 'Machine-readable output')
274
+ .action(async (opts) => {
275
+ const creds = (0, credentials_1.readCredentials)();
276
+ if (!creds)
277
+ (0, output_1.fail)('Not signed in.', ['Run `scalebun login` first.'], output_1.ExitCode.Usage);
278
+ const appId = await (0, resolve_1.resolveAppId)({ appId: opts.appId, nonInteractive: opts.json });
279
+ const client = new client_1.ApiClient(creds);
280
+ let keys;
281
+ try {
282
+ keys = await client.get(`/saas/apps/${appId}/ota/signing-keys`);
283
+ }
284
+ catch (err) {
285
+ (0, output_1.failFromError)('Could not list signing keys', err);
286
+ }
287
+ const target = (keys ?? []).find((k) => k.id === opts.keyId);
288
+ if (!target) {
289
+ (0, output_1.fail)(`No signing key ${opts.keyId} on this app.`, (keys ?? []).map((k) => ` ${k.id} ${k.name ?? 'unnamed'}`), output_1.ExitCode.Usage);
290
+ }
291
+ if (target.revokedAt) {
292
+ // Already revoked is not a failure — a rotation script re-running must
293
+ // not fail the pipeline for reaching the state it wanted.
294
+ (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 });
295
+ return;
296
+ }
297
+ if (!opts.yes) {
298
+ if ((0, resolve_1.isNonInteractive)({ nonInteractive: opts.json })) {
299
+ (0, output_1.fail)('Refusing to revoke a signing key without confirmation.', ['Pass --yes if this is intentional.'], output_1.ExitCode.Usage);
300
+ }
301
+ console.log('');
302
+ console.log(chalk_1.default.yellow(`⚠️ Revoking ${chalk_1.default.bold(target.name ?? target.id)}.\n` +
303
+ ' Apps pinning ONLY this key will refuse every future update — that is\n' +
304
+ ' fail-closed by design. Register the replacement and ship a build\n' +
305
+ ' pinning both before revoking the old one.'));
306
+ const ok = await (0, prompt_1.confirmPhrase)(' Type "revoke" to confirm: ', 'revoke', {
307
+ caseInsensitive: true,
308
+ });
309
+ (0, prompt_1.closePrompts)();
310
+ if (!ok) {
311
+ console.log('Cancelled — the key is still active.');
312
+ process.exit(output_1.ExitCode.Ok);
313
+ }
314
+ }
315
+ try {
316
+ await client.post(`/saas/apps/${appId}/ota/signing-keys/${target.id}/revoke`, {});
317
+ }
318
+ catch (err) {
319
+ (0, output_1.failFromError)('Could not revoke the key', err, [
320
+ 'Revoking a signing key requires an owner or admin role.',
321
+ ]);
322
+ }
323
+ (0, output_1.emit)(() => console.log(`\n🔒 Revoked ${chalk_1.default.bold(target.name ?? target.id)}\n`), { ok: true, keyId: target.id, revoked: true });
324
+ });
180
325
  }
181
326
  /**
182
327
  * 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"}