vibeview 0.47.0 → 0.49.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) {
@@ -190,6 +190,24 @@ function validateBuildEnv(env, platformKey) {
190
190
  }
191
191
  }
192
192
  }
193
+ var XCODE_PLATFORMS = ["ios", "tvos"];
194
+ var XCODE_VERSION_RE = /^\d+\.\d+$/;
195
+ function validateBuildXcode(xcode, platformKey) {
196
+ if (xcode === void 0) return;
197
+ if (!XCODE_PLATFORMS.includes(platformKey)) {
198
+ throw new Error(
199
+ `vibeview.json: platforms.${platformKey}.build.xcode only applies to ios and tvos builds \u2014 remove it from the ${platformKey} block`
200
+ );
201
+ }
202
+ if (typeof xcode !== "string" || !XCODE_VERSION_RE.test(xcode)) {
203
+ throw new Error(
204
+ `vibeview.json: platforms.${platformKey}.build.xcode must be a version string like "27.1"`
205
+ );
206
+ }
207
+ }
208
+ function platformUsesXcode(platformKey) {
209
+ return XCODE_PLATFORMS.includes(platformKey);
210
+ }
193
211
  function saveDevConfig(cwd, cfg) {
194
212
  const target = join(cwd, FILE);
195
213
  const tmp = join(cwd, `.${FILE}.${process.pid}.${Date.now()}.tmp`);
@@ -2142,6 +2160,13 @@ async function buildCommand(opts, cloudDeps) {
2142
2160
  "usage"
2143
2161
  );
2144
2162
  }
2163
+ if (opts.xcode !== void 0) {
2164
+ fail(
2165
+ opts,
2166
+ "--xcode requires --cloud: a local build uses the Xcode selected on this machine",
2167
+ "usage"
2168
+ );
2169
+ }
2145
2170
  const platform = await resolveBarePlatform(cwd, cfgRef.current, opts);
2146
2171
  const build = await resolveBuildConfig(cwd, cfgRef, platform, opts);
2147
2172
  const result = await runBuildForPlatform(
@@ -2152,6 +2177,7 @@ async function buildCommand(opts, cloudDeps) {
2152
2177
  (l) => console.error(chalk3.dim(l))
2153
2178
  );
2154
2179
  for (const w of result.warnings ?? []) console.error(chalk3.yellow(`\u26A0 ${w}`));
2180
+ if (result.launch_warning) console.error(chalk3.yellow(`\u26A0 ${result.launch_warning}`));
2155
2181
  persistUploadedAppId(cwd, platform, build, result.public_id);
2156
2182
  if (opts.json) {
2157
2183
  console.log(
@@ -2408,7 +2434,17 @@ function formatCost(costMicro) {
2408
2434
  return `$${(costMicro / 1e6).toFixed(2)}`;
2409
2435
  }
2410
2436
  async function runCloudBuildCommand(cwd, cfgRef, opts, deps) {
2437
+ if (opts.xcode !== void 0 && !XCODE_VERSION_RE.test(opts.xcode)) {
2438
+ fail(opts, `--xcode must be a version like 27.1, got "${opts.xcode}"`, "usage");
2439
+ }
2411
2440
  const platforms = await resolveCloudPlatforms(cwd, cfgRef, opts);
2441
+ if (opts.xcode !== void 0 && !platforms.some(platformUsesXcode)) {
2442
+ fail(
2443
+ opts,
2444
+ `--xcode only applies to ios and tvos builds \u2014 this run builds ${platforms.join(", ")}`,
2445
+ "usage"
2446
+ );
2447
+ }
2412
2448
  const { token, baseUrl } = resolveAuth(opts);
2413
2449
  const client = new ApiClient(baseUrl, token);
2414
2450
  const d = deps ?? defaultCloudBuildDeps(client);
@@ -2423,6 +2459,7 @@ async function runCloudBuildCommand(cwd, cfgRef, opts, deps) {
2423
2459
  for (const p of platforms) {
2424
2460
  try {
2425
2461
  validateBuildEnv(cfg?.platforms?.[p]?.build?.env, p);
2462
+ validateBuildXcode(cfg?.platforms?.[p]?.build?.xcode, p);
2426
2463
  if (cfg?.platforms?.[p]?.build?.autoIncrement === true && opts.production && createFromArtifact.has(p)) {
2427
2464
  throw new UsageError(
2428
2465
  `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)`
@@ -2499,6 +2536,7 @@ ${offenders}`);
2499
2536
  )
2500
2537
  );
2501
2538
  }
2539
+ const xcode = platformUsesXcode(p) ? opts.xcode ?? build.xcode : void 0;
2502
2540
  return {
2503
2541
  platform: p,
2504
2542
  // OMITTED, never invented, for a platform whose app the artifact will
@@ -2511,7 +2549,8 @@ ${offenders}`);
2511
2549
  artifact_path: artifactPath,
2512
2550
  distribution: production ? "production" : "simulator",
2513
2551
  ...build.env ? { env: build.env } : {},
2514
- ...autoIncrement && production ? { auto_increment: true } : {}
2552
+ ...autoIncrement && production ? { auto_increment: true } : {},
2553
+ ...xcode ? { xcode } : {}
2515
2554
  };
2516
2555
  });
2517
2556
  const uploadSpinner = !opts.json ? createSpinner("uploading source...") : null;
@@ -2649,8 +2688,12 @@ async function waitForCloudBuilds(builds, opts, deps) {
2649
2688
  if (BUILD_TERMINAL_STATUSES.has(logs.status)) {
2650
2689
  const final = await fetchFinalSummary(build.id, updated, deps);
2651
2690
  state.set(build.id, final);
2691
+ const launchWarning = final.app_build?.launch_warning ?? null;
2652
2692
  if (!opts.json) {
2653
2693
  printOutcomeLine(final, multi);
2694
+ if (launchWarning) {
2695
+ console.error(chalk3.yellow(`${multi ? `[${final.platform}] ` : ""}\u26A0 ${launchWarning}`));
2696
+ }
2654
2697
  }
2655
2698
  emitCloud(opts.json, {
2656
2699
  event: "build_finished",
@@ -2659,7 +2702,8 @@ async function waitForCloudBuilds(builds, opts, deps) {
2659
2702
  cost_micro: final.cost_micro,
2660
2703
  error_summary: final.error_summary,
2661
2704
  app_build_id: final.app_build_id ?? null,
2662
- app_public_id: final.app_public_id ?? null
2705
+ app_public_id: final.app_public_id ?? null,
2706
+ launch_warning: launchWarning
2663
2707
  });
2664
2708
  finalized.add(build.id);
2665
2709
  }
package/dist/cli.js CHANGED
@@ -34,7 +34,7 @@ import {
34
34
  runAgentVerb,
35
35
  runStepsNotChecked,
36
36
  stepsNotCheckedLabel
37
- } from "./chunk-GA56B7WS.js";
37
+ } from "./chunk-X5F4DA3S.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";
@@ -4373,6 +4373,9 @@ program.command("build").description("Run your configured build command and uplo
4373
4373
  "--production",
4374
4374
  "--cloud only: build a signed, installable production artifact (.aab/.ipa) using uploaded signing credentials (see `vibeview credentials add`), instead of the default unsigned simulator build",
4375
4375
  false
4376
+ ).option(
4377
+ "--xcode <version>",
4378
+ "--cloud only, ios/tvos: the Xcode version to build with (e.g. 27.1), overriding vibeview.json build.xcode for this run"
4376
4379
  ).option("--json", "Print the result as one JSON line (NDJSON events with --cloud)", false).action((opts) => buildCommand(opts));
4377
4380
  program.command("submit").description(
4378
4381
  "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"
@@ -4505,7 +4508,7 @@ program.command("dev-reload").description(
4505
4508
  program.command("mcp").description(
4506
4509
  "Run an MCP stdio server exposing the agent verbs (tap, swipe, type, ...) plus dev_start/dev_stop/dev_reload as tools"
4507
4510
  ).option("--token <token>", "API token (or set VIBEVIEW_API_TOKEN)").action(async (opts) => {
4508
- const { runMcpServer } = await import("./server-PSPIUL6A.js");
4511
+ const { runMcpServer } = await import("./server-NOJQ4XLR.js");
4509
4512
  await runMcpServer({ ...opts, version: pkg.version });
4510
4513
  });
4511
4514
  program.command("agent-setup").description(
@@ -34,12 +34,12 @@ import {
34
34
  renderEnvelope,
35
35
  resolveMetro,
36
36
  startDevSession
37
- } from "./chunk-GA56B7WS.js";
37
+ } from "./chunk-X5F4DA3S.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.47.0",
3
+ "version": "0.49.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",