vibeview 0.48.0 → 0.50.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.
@@ -960,7 +960,8 @@ async function uploadApp(filePath, options) {
960
960
  url: `${baseUrl}/apps/${result.public_id}`,
961
961
  warnings: result.warnings ?? [],
962
962
  compat_status: result.compat_status ?? null,
963
- findings: result.findings ?? []
963
+ findings: result.findings ?? [],
964
+ launch_warning: result.launch_warning ?? null
964
965
  },
965
966
  null,
966
967
  2
@@ -986,6 +987,8 @@ async function uploadApp(filePath, options) {
986
987
  for (const w of result.warnings ?? []) console.error(chalk.yellow(`
987
988
  \u26A0 ${w}`));
988
989
  }
990
+ if (result.launch_warning) console.error(chalk.yellow(`
991
+ \u26A0 ${result.launch_warning}`));
989
992
  } catch (err) {
990
993
  if (err instanceof ApiStatusError && err.status === 422 && err.data?.error === "build_refused") {
991
994
  const findings = Array.isArray(err.data.findings) ? err.data.findings : [];
@@ -13,7 +13,7 @@ import {
13
13
  resolveArtifact,
14
14
  resolveAuth,
15
15
  uploadAppBuild
16
- } from "./chunk-3LXR2YCS.js";
16
+ } from "./chunk-42GZ4UEJ.js";
17
17
 
18
18
  // src/lib/formatters/not-checked.ts
19
19
  function notCheckedSteps(steps) {
@@ -205,6 +205,22 @@ function validateBuildXcode(xcode, platformKey) {
205
205
  );
206
206
  }
207
207
  }
208
+ function normalizeNodeVersion(value) {
209
+ if (typeof value === "number") {
210
+ return Number.isInteger(value) && value > 0 && value < 1e3 ? String(value) : null;
211
+ }
212
+ if (typeof value !== "string") return null;
213
+ const m = /^v?(\d{1,3})(?:\.x)?$/.exec(value.trim());
214
+ return m ? String(Number(m[1])) : null;
215
+ }
216
+ function validateBuildNode(node, platformKey) {
217
+ if (node === void 0) return;
218
+ if (normalizeNodeVersion(node) === null) {
219
+ throw new Error(
220
+ `vibeview.json: platforms.${platformKey}.build.node must be a Node.js major version like "24"`
221
+ );
222
+ }
223
+ }
208
224
  function platformUsesXcode(platformKey) {
209
225
  return XCODE_PLATFORMS.includes(platformKey);
210
226
  }
@@ -2167,6 +2183,13 @@ async function buildCommand(opts, cloudDeps) {
2167
2183
  "usage"
2168
2184
  );
2169
2185
  }
2186
+ if (opts.node !== void 0) {
2187
+ fail(
2188
+ opts,
2189
+ "--node requires --cloud: a local build uses the Node.js on this machine",
2190
+ "usage"
2191
+ );
2192
+ }
2170
2193
  const platform = await resolveBarePlatform(cwd, cfgRef.current, opts);
2171
2194
  const build = await resolveBuildConfig(cwd, cfgRef, platform, opts);
2172
2195
  const result = await runBuildForPlatform(
@@ -2177,6 +2200,7 @@ async function buildCommand(opts, cloudDeps) {
2177
2200
  (l) => console.error(chalk3.dim(l))
2178
2201
  );
2179
2202
  for (const w of result.warnings ?? []) console.error(chalk3.yellow(`\u26A0 ${w}`));
2203
+ if (result.launch_warning) console.error(chalk3.yellow(`\u26A0 ${result.launch_warning}`));
2180
2204
  persistUploadedAppId(cwd, platform, build, result.public_id);
2181
2205
  if (opts.json) {
2182
2206
  console.log(
@@ -2436,6 +2460,10 @@ async function runCloudBuildCommand(cwd, cfgRef, opts, deps) {
2436
2460
  if (opts.xcode !== void 0 && !XCODE_VERSION_RE.test(opts.xcode)) {
2437
2461
  fail(opts, `--xcode must be a version like 27.1, got "${opts.xcode}"`, "usage");
2438
2462
  }
2463
+ const nodeFlag = opts.node === void 0 ? void 0 : normalizeNodeVersion(opts.node);
2464
+ if (nodeFlag === null) {
2465
+ fail(opts, `--node must be a Node.js major version like 24, got "${opts.node}"`, "usage");
2466
+ }
2439
2467
  const platforms = await resolveCloudPlatforms(cwd, cfgRef, opts);
2440
2468
  if (opts.xcode !== void 0 && !platforms.some(platformUsesXcode)) {
2441
2469
  fail(
@@ -2459,6 +2487,7 @@ async function runCloudBuildCommand(cwd, cfgRef, opts, deps) {
2459
2487
  try {
2460
2488
  validateBuildEnv(cfg?.platforms?.[p]?.build?.env, p);
2461
2489
  validateBuildXcode(cfg?.platforms?.[p]?.build?.xcode, p);
2490
+ validateBuildNode(cfg?.platforms?.[p]?.build?.node, p);
2462
2491
  if (cfg?.platforms?.[p]?.build?.autoIncrement === true && opts.production && createFromArtifact.has(p)) {
2463
2492
  throw new UsageError(
2464
2493
  `platforms.${p}.build.autoIncrement needs the build linked to an app \u2014 set appId in vibeview.json (a brand-new app's first build can't auto-increment)`
@@ -2536,6 +2565,7 @@ ${offenders}`);
2536
2565
  );
2537
2566
  }
2538
2567
  const xcode = platformUsesXcode(p) ? opts.xcode ?? build.xcode : void 0;
2568
+ const node = nodeFlag ?? (build.node === void 0 ? void 0 : normalizeNodeVersion(build.node));
2539
2569
  return {
2540
2570
  platform: p,
2541
2571
  // OMITTED, never invented, for a platform whose app the artifact will
@@ -2549,7 +2579,8 @@ ${offenders}`);
2549
2579
  distribution: production ? "production" : "simulator",
2550
2580
  ...build.env ? { env: build.env } : {},
2551
2581
  ...autoIncrement && production ? { auto_increment: true } : {},
2552
- ...xcode ? { xcode } : {}
2582
+ ...xcode ? { xcode } : {},
2583
+ ...node ? { node } : {}
2553
2584
  };
2554
2585
  });
2555
2586
  const uploadSpinner = !opts.json ? createSpinner("uploading source...") : null;
@@ -2687,8 +2718,12 @@ async function waitForCloudBuilds(builds, opts, deps) {
2687
2718
  if (BUILD_TERMINAL_STATUSES.has(logs.status)) {
2688
2719
  const final = await fetchFinalSummary(build.id, updated, deps);
2689
2720
  state.set(build.id, final);
2721
+ const launchWarning = final.app_build?.launch_warning ?? null;
2690
2722
  if (!opts.json) {
2691
2723
  printOutcomeLine(final, multi);
2724
+ if (launchWarning) {
2725
+ console.error(chalk3.yellow(`${multi ? `[${final.platform}] ` : ""}\u26A0 ${launchWarning}`));
2726
+ }
2692
2727
  }
2693
2728
  emitCloud(opts.json, {
2694
2729
  event: "build_finished",
@@ -2697,7 +2732,8 @@ async function waitForCloudBuilds(builds, opts, deps) {
2697
2732
  cost_micro: final.cost_micro,
2698
2733
  error_summary: final.error_summary,
2699
2734
  app_build_id: final.app_build_id ?? null,
2700
- app_public_id: final.app_public_id ?? null
2735
+ app_public_id: final.app_public_id ?? null,
2736
+ launch_warning: launchWarning
2701
2737
  });
2702
2738
  finalized.add(build.id);
2703
2739
  }
package/dist/cli.js CHANGED
@@ -34,7 +34,7 @@ import {
34
34
  runAgentVerb,
35
35
  runStepsNotChecked,
36
36
  stepsNotCheckedLabel
37
- } from "./chunk-OMIZWILH.js";
37
+ } from "./chunk-BPHIX73G.js";
38
38
  import {
39
39
  ApiClient,
40
40
  ApiStatusError,
@@ -57,7 +57,7 @@ import {
57
57
  runCommandParseExitCode,
58
58
  saveConfig,
59
59
  uploadApp
60
- } from "./chunk-3LXR2YCS.js";
60
+ } from "./chunk-42GZ4UEJ.js";
61
61
 
62
62
  // src/cli.ts
63
63
  import { createRequire } from "module";
@@ -4376,6 +4376,9 @@ program.command("build").description("Run your configured build command and uplo
4376
4376
  ).option(
4377
4377
  "--xcode <version>",
4378
4378
  "--cloud only, ios/tvos: the Xcode version to build with (e.g. 27.1), overriding vibeview.json build.xcode for this run"
4379
+ ).option(
4380
+ "--node <major>",
4381
+ "--cloud only: the Node.js major to build with (e.g. 24), overriding vibeview.json build.node and the project .nvmrc for this run"
4379
4382
  ).option("--json", "Print the result as one JSON line (NDJSON events with --cloud)", false).action((opts) => buildCommand(opts));
4380
4383
  program.command("submit").description(
4381
4384
  "Submit a succeeded production cloud build's artifact to TestFlight (ios/tvos) or a Google Play track (android/androidtv) \u2014 binary upload only; store listing and review stay in the store consoles"
@@ -4508,7 +4511,7 @@ program.command("dev-reload").description(
4508
4511
  program.command("mcp").description(
4509
4512
  "Run an MCP stdio server exposing the agent verbs (tap, swipe, type, ...) plus dev_start/dev_stop/dev_reload as tools"
4510
4513
  ).option("--token <token>", "API token (or set VIBEVIEW_API_TOKEN)").action(async (opts) => {
4511
- const { runMcpServer } = await import("./server-3JZ2MN5N.js");
4514
+ const { runMcpServer } = await import("./server-Q2PYPAKB.js");
4512
4515
  await runMcpServer({ ...opts, version: pkg.version });
4513
4516
  });
4514
4517
  program.command("agent-setup").description(
@@ -34,12 +34,12 @@ import {
34
34
  renderEnvelope,
35
35
  resolveMetro,
36
36
  startDevSession
37
- } from "./chunk-OMIZWILH.js";
37
+ } from "./chunk-BPHIX73G.js";
38
38
  import {
39
39
  ApiClient,
40
40
  NotFoundError,
41
41
  resolveAuth
42
- } from "./chunk-3LXR2YCS.js";
42
+ } from "./chunk-42GZ4UEJ.js";
43
43
 
44
44
  // src/mcp/server.ts
45
45
  import { writeFileSync } from "fs";
@@ -998,7 +998,7 @@ async function handleUploadApp(args, deps) {
998
998
  }
999
999
  const name = typeof args.name === "string" && args.name ? args.name : void 0;
1000
1000
  const upload = deps.uploadApp ?? (async (f, n) => {
1001
- const { uploadAppBuild } = await import("./upload-app-TDR6PIWD.js");
1001
+ const { uploadAppBuild } = await import("./upload-app-DLBU3ZZY.js");
1002
1002
  const { result: result2 } = await uploadAppBuild(f, { ...deps.auth, name: n });
1003
1003
  return result2;
1004
1004
  });
@@ -1019,7 +1019,8 @@ async function handleUploadApp(args, deps) {
1019
1019
  build_id: result.build_id ?? null,
1020
1020
  version: result.version ?? null,
1021
1021
  build_number: result.build_number ?? null,
1022
- warnings
1022
+ warnings,
1023
+ launch_warning: result.launch_warning ?? null
1023
1024
  };
1024
1025
  const lines = [
1025
1026
  `${isNew ? "New app created" : "Build added to existing app"}: ${result.name}`,
@@ -1027,7 +1028,8 @@ async function handleUploadApp(args, deps) {
1027
1028
  ...result.build_id != null ? [
1028
1029
  `build_id: ${result.build_id}${result.version ? ` version ${result.version}${result.build_number ? ` (${result.build_number})` : ""}` : ""}`
1029
1030
  ] : [],
1030
- ...warnings.map((w) => `warning: ${w}`)
1031
+ ...warnings.map((w) => `warning: ${w}`),
1032
+ ...result.launch_warning ? [`warning: ${result.launch_warning}`] : []
1031
1033
  ];
1032
1034
  return textResult(lines.join("\n"), payload);
1033
1035
  }
@@ -3,7 +3,7 @@ import {
3
3
  describeBuild,
4
4
  uploadApp,
5
5
  uploadAppBuild
6
- } from "./chunk-3LXR2YCS.js";
6
+ } from "./chunk-42GZ4UEJ.js";
7
7
  export {
8
8
  describeBuild,
9
9
  uploadApp,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vibeview",
3
- "version": "0.48.0",
3
+ "version": "0.50.0",
4
4
  "description": "VibeView CLI -- run your app on cloud iOS simulators, Android emulators, Apple TV, Android TV and Roku devices: a React Native dev loop, device control for you or your coding agent (CLI or MCP), and tests from CI",
5
5
  "mcpName": "io.github.vibeview/vibeview",
6
6
  "type": "module",