@scalebun/cli 1.10.1 → 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 +114 -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 +24 -3
  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
@@ -40,6 +40,7 @@ exports.canPromptHidden = canPromptHidden;
40
40
  exports.promptHidden = promptHidden;
41
41
  exports.closePrompts = closePrompts;
42
42
  exports.text = text;
43
+ exports.confirmPhrase = confirmPhrase;
43
44
  exports.confirm = confirm;
44
45
  exports.number = number;
45
46
  exports.select = select;
@@ -134,6 +135,13 @@ function promptHidden(query) {
134
135
  // stdin. One interface reads sequential lines correctly. It is created lazily —
135
136
  // after the raw-mode `select`s run — so it never fights their stdin handling.
136
137
  let sharedRl = null;
138
+ // The interactive session used to LEND its own readline to this module, because
139
+ // it held one open for the whole session and two interfaces on one stdin is a
140
+ // top-tier source of "the CLI just hangs" — both attach listeners, the last one
141
+ // consumes the keypress stream, and neither sees a complete line. The session
142
+ // no longer holds one: it owns stdin in raw mode for the menu and hands it back
143
+ // before running anything, so commands are free to make their own prompts here.
144
+ // One owner at a time, enforced by structure rather than by a lending protocol.
137
145
  function getRl() {
138
146
  if (!sharedRl) {
139
147
  sharedRl = readline.createInterface({ input: process.stdin, output: process.stdout });
@@ -167,39 +175,189 @@ function ask(query) {
167
175
  });
168
176
  });
169
177
  }
170
- /** Free-text question with an optional default (shown in parentheses). */
178
+ /**
179
+ * Free-text question with an optional default (shown in parentheses).
180
+ *
181
+ * ── Empty is a question, not an answer ──────────────────────────────────────
182
+ *
183
+ * This used to return '' the moment someone pressed Enter with nothing typed,
184
+ * and every caller then invented its own reaction. `text('App id')` in the
185
+ * publish wizard did `if (!id) process.exit(1)` — a silent exit 1, no message,
186
+ * from a prompt that had just told you it wanted an app id. Others carried the
187
+ * empty string onward until the API rejected a field the user never saw.
188
+ *
189
+ * Pressing Enter at a prompt with no default is almost never a decision; it is
190
+ * someone hurrying, or not knowing what is wanted. So empty now re-asks and
191
+ * explains, and callers with something sensible to fall back on pass a
192
+ * `default` — which is what "Enter means yes" should always have looked like.
193
+ * `allowEmpty` remains for fields that are honestly optional.
194
+ */
171
195
  async function text(query, opts = {}) {
172
196
  const suffix = opts.default ? chalk_1.default.dim(` (${opts.default})`) : '';
173
- const answer = (await ask(`${chalk_1.default.cyan('?')} ${query}${suffix}: `)).trim();
174
- return answer || opts.default || '';
197
+ let empties = 0;
198
+ for (;;) {
199
+ const raw = (await ask(`${chalk_1.default.cyan('?')} ${query}${suffix}: `)).trim();
200
+ const answer = raw || opts.default || '';
201
+ if (!answer && !opts.allowEmpty) {
202
+ bailOnEmptyLoop(++empties, `${query} is required.`);
203
+ console.log(chalk_1.default.yellow(' Nothing entered — this one is needed to continue.'));
204
+ if (opts.help)
205
+ console.log(chalk_1.default.dim(` ${opts.help}`));
206
+ continue;
207
+ }
208
+ const problem = answer && opts.validate ? opts.validate(answer) : null;
209
+ if (problem) {
210
+ console.log(chalk_1.default.yellow(` ${problem}`));
211
+ if (opts.help)
212
+ console.log(chalk_1.default.dim(` ${opts.help}`));
213
+ continue;
214
+ }
215
+ return answer;
216
+ }
217
+ }
218
+ /**
219
+ * Type-this-exact-phrase confirmation, for the destructive commands.
220
+ *
221
+ * Empty and wrong are DIFFERENT mistakes and deserve different answers:
222
+ *
223
+ * empty — cancel. Enter must stay an escape from a prompt that is about to
224
+ * delete a channel or roll back a fleet; re-asking would trap
225
+ * someone whose actual intent was to back out. But say so, rather
226
+ * than printing "Cancelled" and leaving them to guess whether the
227
+ * keystroke registered.
228
+ * wrong — re-ask. A typo in a channel name is not a decision to cancel, and
229
+ * making the operator re-run the whole command mid-incident to fix
230
+ * one character is the worst moment to be pedantic.
231
+ */
232
+ async function confirmPhrase(query, expected, opts = {}) {
233
+ const normalise = (v) => (opts.caseInsensitive ? v.toLowerCase() : v);
234
+ for (;;) {
235
+ const answer = (await ask(`${chalk_1.default.cyan('?')} ${query}`)).trim();
236
+ if (!answer) {
237
+ console.log(chalk_1.default.dim(' Nothing typed — cancelled.'));
238
+ return false;
239
+ }
240
+ if (normalise(answer) === normalise(expected))
241
+ return true;
242
+ console.log(chalk_1.default.yellow(` That is not "${expected}" — got "${answer}".`));
243
+ console.log(chalk_1.default.dim(' Type it exactly, or press Enter to cancel.'));
244
+ }
245
+ }
246
+ /**
247
+ * Guard against a re-ask loop becoming a hang.
248
+ *
249
+ * `ask()` resolves '' both when a person presses Enter and when stdin closes,
250
+ * and the two are indistinguishable from here. So a prompt that re-asks on
251
+ * empty would spin forever against a closed or piped stdin, printing its
252
+ * help text into a void — a CI job that hangs until the runner kills it,
253
+ * looking like a network fault rather than a missing flag.
254
+ *
255
+ * Off a TTY there is nobody to help, so the first empty answer is fatal. On a
256
+ * TTY the cap is high enough that a real person never meets it.
257
+ */
258
+ function bailOnEmptyLoop(attempts, what) {
259
+ const interactive = process.stdin.isTTY && process.stdout.isTTY;
260
+ if (interactive && attempts < 10)
261
+ return;
262
+ console.error(`❌ ${what}`);
263
+ if (!interactive) {
264
+ console.error(' Nothing is attached to answer this prompt — pass it as a flag instead.');
265
+ }
266
+ process.exit(1);
175
267
  }
176
- /** Yes/no question. Empty input takes the default. */
268
+ const YES = new Set(['y', 'yes', 'true', '1']);
269
+ const NO = new Set(['n', 'no', 'false', '0']);
270
+ /**
271
+ * Yes/no question. Empty input takes the default; anything unrecognised
272
+ * RE-ASKS.
273
+ *
274
+ * ── Why it re-asks ──────────────────────────────────────────────────────────
275
+ *
276
+ * This used to be `return answer === 'y' || answer === 'yes'`, so every input
277
+ * that was not literally yes counted as no. Typing `50` at
278
+ * "Promote v14 to 100% of devices? (y/N)" — a completely reasonable thing to
279
+ * type when you wanted 50% — silently meant "no", and the CLI reported
280
+ * "Cancelled — nothing was promoted" as though the user had declined. The
281
+ * person did not decline. They answered a different question, and the tool
282
+ * discarded the answer and blamed them for it.
283
+ *
284
+ * The same swallow hid `yes please`, `Y ` with a stray space, and a mistyped
285
+ * `t`. Silently reading all of those as "no" is safe for the fleet and awful
286
+ * for the human: the destructive path is protected while the intent is lost
287
+ * without a word.
288
+ */
177
289
  async function confirm(query, opts = {}) {
178
- const def = opts.default ?? false;
179
- const answer = (await ask(`${chalk_1.default.cyan('?')} ${query} ${chalk_1.default.dim(def ? '(Y/n)' : '(y/N)')}: `))
180
- .trim()
181
- .toLowerCase();
182
- if (!answer)
183
- return def;
184
- return answer === 'y' || answer === 'yes';
290
+ const required = opts.default === undefined;
291
+ // The suffix has to tell the truth about what Enter does. `(y/n)` with
292
+ // neither letter capitalised is the standing convention for "no default,
293
+ // answer the question" — writing `(y/N)` here and then re-asking would be a
294
+ // prompt that lies about its own contract.
295
+ const suffix = required ? '(y/n)' : opts.default ? '(Y/n)' : '(y/N)';
296
+ let empties = 0;
297
+ for (;;) {
298
+ const answer = (await ask(`${chalk_1.default.cyan('?')} ${query} ${chalk_1.default.dim(suffix)}: `))
299
+ .trim()
300
+ .toLowerCase();
301
+ if (!answer) {
302
+ if (!required)
303
+ return opts.default;
304
+ bailOnEmptyLoop(++empties, `${query} needs a yes or no.`);
305
+ console.log(chalk_1.default.yellow(' This one has no default — answer y or n.'));
306
+ console.log(chalk_1.default.dim(' Ctrl+C backs out without doing anything.'));
307
+ continue;
308
+ }
309
+ if (YES.has(answer))
310
+ return true;
311
+ if (NO.has(answer))
312
+ return false;
313
+ // A number here almost always means the user was answering the quantity in
314
+ // the question rather than the yes/no, so say so instead of "invalid".
315
+ if (/^\d+%?$/.test(answer)) {
316
+ console.log(chalk_1.default.yellow(` "${answer}" looks like a number — this is a yes or no question.`));
317
+ if (opts.numericHint)
318
+ console.log(chalk_1.default.dim(` ${opts.numericHint}`));
319
+ }
320
+ else {
321
+ console.log(chalk_1.default.yellow(` Please answer y or n — got "${answer}".`));
322
+ }
323
+ }
185
324
  }
186
325
  /** Integer question with optional default and min/max validation (loops until valid). */
187
326
  async function number(query, opts = {}) {
188
327
  const { min, max } = opts;
189
328
  const range = min !== undefined && max !== undefined ? ` between ${min} and ${max}` : '';
329
+ let empties = 0;
190
330
  // eslint-disable-next-line no-constant-condition
191
331
  while (true) {
192
332
  const suffix = opts.default !== undefined ? chalk_1.default.dim(` (${opts.default})`) : '';
193
333
  const raw = (await ask(`${chalk_1.default.cyan('?')} ${query}${suffix}: `)).trim();
194
334
  if (!raw && opts.default !== undefined)
195
335
  return opts.default;
196
- const n = Number(raw);
197
- if (Number.isInteger(n) &&
198
- (min === undefined || n >= min) &&
199
- (max === undefined || n <= max)) {
200
- return n;
336
+ // Empty with no default fell through to the format check below and was
337
+ // reported as `got ""`, which describes the input rather than the problem.
338
+ if (!raw) {
339
+ bailOnEmptyLoop(++empties, `${query} is required.`);
340
+ console.log(chalk_1.default.yellow(` Nothing entered — enter a whole number${range}.`));
341
+ continue;
201
342
  }
202
- console.log(chalk_1.default.yellow(` Please enter a whole number${range}.`));
343
+ // A trailing % is the obvious thing to type for something the question
344
+ // calls a percentage. Number('50%') is NaN, so without this the prompt
345
+ // rejects the right answer for a formatting reason.
346
+ const cleaned = raw.replace(/%$/, '').trim();
347
+ // Strict rather than Number(): that accepts '0x10', '1e3' and Infinity,
348
+ // and reading a hex literal as a rollout percentage helps nobody.
349
+ if (!/^[+-]?\d+$/.test(cleaned)) {
350
+ console.log(chalk_1.default.yellow(/^[+-]?\d*\.\d+$/.test(cleaned)
351
+ ? ` Whole numbers only${range} — got "${raw}".`
352
+ : ` Please enter a whole number${range} — got "${raw}".`));
353
+ continue;
354
+ }
355
+ const n = Number(cleaned);
356
+ if ((min !== undefined && n < min) || (max !== undefined && n > max)) {
357
+ console.log(chalk_1.default.yellow(` ${n} is out of range — enter a whole number${range}.`));
358
+ continue;
359
+ }
360
+ return n;
203
361
  }
204
362
  }
205
363
  /**
@@ -224,10 +382,16 @@ async function numberedSelect(query, choices, def) {
224
382
  const raw = (await ask(` Choose 1-${choices.length} ${chalk_1.default.dim(`(${def + 1})`)}: `)).trim();
225
383
  if (!raw)
226
384
  return choices[def].value;
227
- const n = parseInt(raw, 10);
228
- if (Number.isInteger(n) && n >= 1 && n <= choices.length)
385
+ // parseInt('2abc') is 2, so a typo used to select a neighbour of what the
386
+ // user meant. Require the whole answer to be the number.
387
+ if (!/^\d+$/.test(raw)) {
388
+ console.log(chalk_1.default.yellow(` Enter a number between 1 and ${choices.length} — got "${raw}".`));
389
+ continue;
390
+ }
391
+ const n = Number(raw);
392
+ if (n >= 1 && n <= choices.length)
229
393
  return choices[n - 1].value;
230
- console.log(chalk_1.default.yellow(` Enter a number between 1 and ${choices.length}.`));
394
+ console.log(chalk_1.default.yellow(` ${n} is not on the list — choose between 1 and ${choices.length}.`));
231
395
  }
232
396
  }
233
397
  function arrowSelect(query, choices, def) {
@@ -1 +1 @@
1
- {"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/utils/prompt.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/utils/prompt.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Build provenance for an OTA bundle — where the code came from and which CI run
3
+ * produced it. Sent (optionally) with the presign request so the dashboard can
4
+ * show Git SHA / PR / CI build / pipeline. Every field is best-effort: on a
5
+ * developer's laptop only the git fields resolve; in CI the run metadata fills in.
6
+ */
7
+ export interface Provenance {
8
+ gitSha?: string;
9
+ gitBranch?: string;
10
+ prNumber?: number;
11
+ ciProvider?: string;
12
+ ciPipeline?: string;
13
+ ciBuildNumber?: string;
14
+ ciRunUrl?: string;
15
+ }
16
+ export declare function collectProvenance(cwd?: string): Provenance;
17
+ export interface AssetEntry {
18
+ path: string;
19
+ assetType: 'js' | 'image' | 'font' | 'other';
20
+ sizeBytes: number;
21
+ sha256?: string;
22
+ }
23
+ /**
24
+ * Enumerate the bundle + its Metro assets into a manifest the backend stores as
25
+ * per-asset rows (so the dashboard can diff added/changed/removed and size
26
+ * regressions). The JS bundle is always the first entry; `assetsDir` is the
27
+ * `--assets-dest` directory from `buildBundle` (absent for pre-built bundles).
28
+ */
29
+ export declare function collectAssetManifest(bundlePath: string, bundleSha256: string, bundleSizeBytes: number, assetsDir?: string): AssetEntry[];
30
+ //# sourceMappingURL=provenance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provenance.d.ts","sourceRoot":"","sources":["../../src/utils/provenance.ts"],"names":[],"mappings":"AAKA;;;;;GAKG;AACH,MAAM,WAAW,UAAU;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAsBD,wBAAgB,iBAAiB,CAAC,GAAG,GAAE,MAAsB,GAAG,UAAU,CAmDzE;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,IAAI,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,CAAC;IAC7C,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAUD;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,MAAM,EACpB,eAAe,EAAE,MAAM,EACvB,SAAS,CAAC,EAAE,MAAM,GACjB,UAAU,EAAE,CA6Bd"}
@@ -0,0 +1,157 @@
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.collectProvenance = collectProvenance;
37
+ exports.collectAssetManifest = collectAssetManifest;
38
+ const childProcess = __importStar(require("child_process"));
39
+ const fs = __importStar(require("fs"));
40
+ const path = __importStar(require("path"));
41
+ const hash_1 = require("./hash");
42
+ function git(args, cwd) {
43
+ try {
44
+ const out = childProcess
45
+ .execFileSync('git', args, { cwd, encoding: 'utf-8', stdio: ['ignore', 'pipe', 'ignore'] })
46
+ .trim();
47
+ return out || undefined;
48
+ }
49
+ catch {
50
+ return undefined;
51
+ }
52
+ }
53
+ /** Drop undefined keys so the JSON body stays clean. */
54
+ function compact(p) {
55
+ const out = {};
56
+ for (const [k, v] of Object.entries(p)) {
57
+ if (v !== undefined && v !== null && v !== '')
58
+ out[k] = v;
59
+ }
60
+ return out;
61
+ }
62
+ function collectProvenance(cwd = process.cwd()) {
63
+ const env = process.env;
64
+ // GitHub Actions
65
+ if (env.GITHUB_ACTIONS === 'true') {
66
+ const prMatch = /refs\/pull\/(\d+)\//.exec(env.GITHUB_REF ?? '');
67
+ return compact({
68
+ gitSha: env.GITHUB_SHA ?? git(['rev-parse', 'HEAD'], cwd),
69
+ gitBranch: env.GITHUB_REF_NAME ?? git(['rev-parse', '--abbrev-ref', 'HEAD'], cwd),
70
+ prNumber: prMatch ? Number(prMatch[1]) : undefined,
71
+ ciProvider: 'github-actions',
72
+ ciPipeline: env.GITHUB_WORKFLOW,
73
+ ciBuildNumber: env.GITHUB_RUN_NUMBER,
74
+ ciRunUrl: env.GITHUB_SERVER_URL && env.GITHUB_REPOSITORY && env.GITHUB_RUN_ID
75
+ ? `${env.GITHUB_SERVER_URL}/${env.GITHUB_REPOSITORY}/actions/runs/${env.GITHUB_RUN_ID}`
76
+ : undefined,
77
+ });
78
+ }
79
+ // GitLab CI
80
+ if (env.GITLAB_CI === 'true') {
81
+ return compact({
82
+ gitSha: env.CI_COMMIT_SHA ?? git(['rev-parse', 'HEAD'], cwd),
83
+ gitBranch: env.CI_COMMIT_REF_NAME ?? git(['rev-parse', '--abbrev-ref', 'HEAD'], cwd),
84
+ prNumber: env.CI_MERGE_REQUEST_IID ? Number(env.CI_MERGE_REQUEST_IID) : undefined,
85
+ ciProvider: 'gitlab-ci',
86
+ ciPipeline: env.CI_PIPELINE_NAME ?? env.CI_PROJECT_PATH,
87
+ ciBuildNumber: env.CI_PIPELINE_IID,
88
+ ciRunUrl: env.CI_PIPELINE_URL,
89
+ });
90
+ }
91
+ // Bitrise
92
+ if (env.BITRISE_IO === 'true') {
93
+ return compact({
94
+ gitSha: env.BITRISE_GIT_COMMIT ?? git(['rev-parse', 'HEAD'], cwd),
95
+ gitBranch: env.BITRISE_GIT_BRANCH ?? git(['rev-parse', '--abbrev-ref', 'HEAD'], cwd),
96
+ prNumber: env.BITRISE_PULL_REQUEST ? Number(env.BITRISE_PULL_REQUEST) : undefined,
97
+ ciProvider: 'bitrise',
98
+ ciPipeline: env.BITRISE_TRIGGERED_WORKFLOW_ID,
99
+ ciBuildNumber: env.BITRISE_BUILD_NUMBER,
100
+ ciRunUrl: env.BITRISE_BUILD_URL,
101
+ });
102
+ }
103
+ // Local / unknown CI — resolve what git can tell us.
104
+ return compact({
105
+ gitSha: git(['rev-parse', 'HEAD'], cwd),
106
+ gitBranch: git(['rev-parse', '--abbrev-ref', 'HEAD'], cwd),
107
+ });
108
+ }
109
+ function assetTypeForExt(p) {
110
+ const e = path.extname(p).toLowerCase();
111
+ if (['.js', '.jsbundle', '.hbc', '.bundle'].includes(e))
112
+ return 'js';
113
+ if (['.png', '.jpg', '.jpeg', '.gif', '.webp', '.svg', '.bmp', '.ico'].includes(e))
114
+ return 'image';
115
+ if (['.ttf', '.otf', '.woff', '.woff2'].includes(e))
116
+ return 'font';
117
+ return 'other';
118
+ }
119
+ /**
120
+ * Enumerate the bundle + its Metro assets into a manifest the backend stores as
121
+ * per-asset rows (so the dashboard can diff added/changed/removed and size
122
+ * regressions). The JS bundle is always the first entry; `assetsDir` is the
123
+ * `--assets-dest` directory from `buildBundle` (absent for pre-built bundles).
124
+ */
125
+ function collectAssetManifest(bundlePath, bundleSha256, bundleSizeBytes, assetsDir) {
126
+ const assets = [
127
+ { path: path.basename(bundlePath), assetType: 'js', sizeBytes: bundleSizeBytes, sha256: bundleSha256 },
128
+ ];
129
+ if (assetsDir && fs.existsSync(assetsDir)) {
130
+ const walk = (dir) => {
131
+ for (const name of fs.readdirSync(dir)) {
132
+ const full = path.join(dir, name);
133
+ const st = fs.statSync(full);
134
+ if (st.isDirectory()) {
135
+ walk(full);
136
+ }
137
+ else {
138
+ const rel = path.relative(assetsDir, full).split(path.sep).join('/');
139
+ assets.push({
140
+ path: rel,
141
+ assetType: assetTypeForExt(name),
142
+ sizeBytes: st.size,
143
+ sha256: (0, hash_1.sha256File)(full),
144
+ });
145
+ }
146
+ }
147
+ };
148
+ try {
149
+ walk(assetsDir);
150
+ }
151
+ catch {
152
+ /* best-effort — a missing asset dir just means a JS-only manifest */
153
+ }
154
+ }
155
+ return assets;
156
+ }
157
+ //# sourceMappingURL=provenance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provenance.js","sourceRoot":"","sources":["../../src/utils/provenance.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,81 @@
1
+ /**
2
+ * Resolving what a command should act on, without making the operator type it.
3
+ *
4
+ * ── The chain, in order ─────────────────────────────────────────────────────
5
+ *
6
+ * 1. an explicit flag — always wins
7
+ * 2. SCALEBUN_APP_ID / scalebun.json — the common case, and silent
8
+ * 3. the account has exactly one app — auto-select and say so
9
+ * 4. a TTY — interactive picker
10
+ * 5. no TTY — hard error naming the flag
11
+ *
12
+ * Layer 5 is the one that must never be skipped. A prompt that blocks in CI is
13
+ * a deploy that hangs until the job times out, and it looks like a network
14
+ * fault rather than a missing flag. The publish wizard already got this right
15
+ * (`ota-publish.ts`, TTY-gated); this generalises that rule so every command
16
+ * inherits it instead of re-deciding.
17
+ *
18
+ * ── Why resolving beats prompting ───────────────────────────────────────────
19
+ *
20
+ * Prompting on nine commands turns a nine-flag problem into a nine-prompt
21
+ * problem. Layer 2 is where the win is: `scalebun link` once, and the flag
22
+ * disappears from every later invocation. There is a cost argument too —
23
+ * `fetchAllApps` walks orgs → projects → project-detail, so resolving from the
24
+ * network on every command pays N+1 HTTP calls every time.
25
+ */
26
+ export interface ResolveOpts {
27
+ /** The explicit flag value, if the user passed one. */
28
+ appId?: string;
29
+ /** Skip layers 3 and 4 — set by --json / --non-interactive / --yes. */
30
+ nonInteractive?: boolean;
31
+ /** Flag name to quote in the non-TTY error. */
32
+ flag?: string;
33
+ }
34
+ /**
35
+ * True when this process must not prompt: no TTY, or the caller forbade it.
36
+ *
37
+ * `isJson()` is the authority on machine mode rather than a per-command
38
+ * `opts.json`. Commander does not hand root options down to subcommand
39
+ * handlers — and because the root declares `--json` too, it consumes the flag
40
+ * before a subcommand ever sees it. So the flag is read once from raw argv at
41
+ * startup (`applyGlobalFlags`) and every consumer asks `output.ts`. The
42
+ * per-command `--json` declarations remain, purely so `--help` documents them.
43
+ */
44
+ export declare function isNonInteractive(opts?: {
45
+ nonInteractive?: boolean;
46
+ }): boolean;
47
+ /**
48
+ * Resolve the app id for a command.
49
+ *
50
+ * Never returns an empty string — it either returns an id or exits with a
51
+ * message naming the exact flag to pass.
52
+ */
53
+ export declare function resolveAppId(opts?: ResolveOpts): Promise<string>;
54
+ /**
55
+ * Resolve a release for the control commands.
56
+ *
57
+ * `pause` and `rollback` already accepted an optional --release-id and fell
58
+ * back to "the single ACTIVE release"; `resume` required it and never resolved,
59
+ * which made the undo of the panic button the hardest command to type. This
60
+ * generalises the resolver and lets each caller say which statuses count —
61
+ * so `resume` can look for PAUSED rather than ACTIVE.
62
+ */
63
+ export interface ReleaseRow {
64
+ id: string;
65
+ status: string;
66
+ rolloutPercent?: number;
67
+ bundle?: {
68
+ version?: number;
69
+ platform?: string;
70
+ };
71
+ }
72
+ export declare function describeRelease(r: ReleaseRow): string;
73
+ export declare function resolveRelease(releases: ReleaseRow[], opts: {
74
+ releaseId?: string;
75
+ /** Statuses that qualify when no id was given. */
76
+ statuses: string[];
77
+ /** Verb used in messages: "resume", "pause", … */
78
+ verb: string;
79
+ nonInteractive?: boolean;
80
+ }): Promise<ReleaseRow>;
81
+ //# sourceMappingURL=resolve.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../src/utils/resolve.ts"],"names":[],"mappings":"AASA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,MAAM,WAAW,WAAW;IAC1B,uDAAuD;IACvD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,uEAAuE;IACvE,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,+CAA+C;IAC/C,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,GAAE;IAAE,cAAc,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,OAAO,CASjF;AAED;;;;;GAKG;AACH,wBAAsB,YAAY,CAAC,IAAI,GAAE,WAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CAsE1E;AAmBD;;;;;;;;GAQG;AACH,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,MAAM,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAClD;AAED,wBAAgB,eAAe,CAAC,CAAC,EAAE,UAAU,GAAG,MAAM,CAIrD;AAED,wBAAsB,cAAc,CAClC,QAAQ,EAAE,UAAU,EAAE,EACtB,IAAI,EAAE;IACJ,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kDAAkD;IAClD,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,kDAAkD;IAClD,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B,GACA,OAAO,CAAC,UAAU,CAAC,CAmCrB"}