rnxsim 0.1.489 → 0.1.491

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 (64) hide show
  1. package/cli/cloud-client.ts +43 -7
  2. package/cli/command-registry.ts +3 -0
  3. package/cli/commands/detox.ts +41 -11
  4. package/cli/commands/flow.ts +2 -1
  5. package/cli/commands/maestro.ts +30 -0
  6. package/cli/commands/platform.ts +15 -0
  7. package/cli/commands/preview.ts +104 -0
  8. package/cli/commands/test.ts +224 -0
  9. package/cli/main.ts +34 -0
  10. package/cli/outbound-endpoints.ts +5 -2
  11. package/dist-lib/agent-daemon-client.cjs +1 -1
  12. package/dist-lib/agent-events.cjs +1 -1
  13. package/dist-lib/agent-identity.cjs +1 -1
  14. package/dist-lib/agent-sessions.cjs +1 -1
  15. package/dist-lib/attached-projects.cjs +1 -1
  16. package/dist-lib/auth/shared-session.cjs +1 -1
  17. package/dist-lib/backend-origin.cjs +1 -1
  18. package/dist-lib/beta.cjs +1 -1
  19. package/dist-lib/beta.mjs +1 -1
  20. package/dist-lib/bridge-constants.cjs +1 -1
  21. package/dist-lib/bridge-contract-input.cjs +1 -1
  22. package/dist-lib/bridge-contract-input.mjs +1 -1
  23. package/dist-lib/bridge-contract.cjs +1 -1
  24. package/dist-lib/bridge-contract.mjs +1 -1
  25. package/dist-lib/capture-contract.cjs +1 -1
  26. package/dist-lib/capture-contract.mjs +1 -1
  27. package/dist-lib/cli-constants.cjs +1 -1
  28. package/dist-lib/cloud-contract.cjs +1 -1
  29. package/dist-lib/cloud-contract.mjs +1 -1
  30. package/dist-lib/cloud.cjs +1 -1
  31. package/dist-lib/cloud.mjs +1 -1
  32. package/dist-lib/config.cjs +1 -1
  33. package/dist-lib/detox/index.cjs +1 -1
  34. package/dist-lib/dev-bundle-resolution.cjs +1 -1
  35. package/dist-lib/home-paths.cjs +1 -1
  36. package/dist-lib/host/bridge-host.cjs +22 -8
  37. package/dist-lib/host/fetch-proxy-handler.cjs +1 -1
  38. package/dist-lib/host/fetch-proxy-overrides.cjs +1 -1
  39. package/dist-lib/host/fetch-proxy-overrides.mjs +1 -1
  40. package/dist-lib/host/replacement-module-handler.cjs +1 -1
  41. package/dist-lib/host/websocket-proxy.cjs +1 -1
  42. package/dist-lib/index.cjs +1 -1
  43. package/dist-lib/jump-to-source-babel.cjs +1 -1
  44. package/dist-lib/jump-to-source-native.cjs +1 -1
  45. package/dist-lib/menu.cjs +1 -1
  46. package/dist-lib/menu.mjs +1 -1
  47. package/dist-lib/metro-fingerprint-registry.cjs +1 -1
  48. package/dist-lib/metro-fingerprint-registry.mjs +1 -1
  49. package/dist-lib/metro-production-bundle.cjs +1 -1
  50. package/dist-lib/metro-production-bundle.mjs +1 -1
  51. package/dist-lib/metro.cjs +1 -1
  52. package/dist-lib/profiles.cjs +1 -1
  53. package/dist-lib/public-brand.cjs +1 -1
  54. package/dist-lib/react-native-host-modules.cjs +1 -1
  55. package/dist-lib/react-native-host-modules.mjs +1 -1
  56. package/dist-lib/render-mode.cjs +1 -1
  57. package/dist-lib/scripts/dev-server-scanner.cjs +1 -1
  58. package/dist-lib/sdk.cjs +1 -1
  59. package/dist-lib/sdk.mjs +1 -1
  60. package/dist-lib/skills.cjs +72 -148
  61. package/dist-lib/vite.cjs +1 -1
  62. package/package.json +3 -3
  63. package/skills/contrast/SKILL.md +3 -0
  64. package/src/vite-plugin.ts +28 -16
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.489 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.491 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __create = Object.create;
@@ -2196,36 +2196,36 @@ var init_capability_inventory_coverage = __esm({
2196
2196
  raw: {
2197
2197
  covered: 0,
2198
2198
  ratio: 0,
2199
- total: 96
2199
+ total: 139
2200
2200
  },
2201
2201
  weighted: {
2202
2202
  covered: 0,
2203
2203
  ratio: 0,
2204
- total: 8.96774193548
2204
+ total: 8.96356275304
2205
2205
  }
2206
2206
  },
2207
2207
  semantic: {
2208
2208
  raw: {
2209
2209
  covered: 0,
2210
2210
  ratio: 0,
2211
- total: 49
2211
+ total: 70
2212
2212
  },
2213
2213
  weighted: {
2214
2214
  covered: 0,
2215
2215
  ratio: 0,
2216
- total: 4.6935483871
2216
+ total: 4.69230769231
2217
2217
  }
2218
2218
  },
2219
2219
  visual: {
2220
2220
  raw: {
2221
2221
  covered: 0,
2222
2222
  ratio: 0,
2223
- total: 47
2223
+ total: 69
2224
2224
  },
2225
2225
  weighted: {
2226
2226
  covered: 0,
2227
2227
  ratio: 0,
2228
- total: 4.27419354839
2228
+ total: 4.27125506073
2229
2229
  }
2230
2230
  },
2231
2231
  byPlatform: {
@@ -2234,36 +2234,36 @@ var init_capability_inventory_coverage = __esm({
2234
2234
  raw: {
2235
2235
  covered: 0,
2236
2236
  ratio: 0,
2237
- total: 96
2237
+ total: 139
2238
2238
  },
2239
2239
  weighted: {
2240
2240
  covered: 0,
2241
2241
  ratio: 0,
2242
- total: 8.96774193548
2242
+ total: 8.96356275304
2243
2243
  }
2244
2244
  },
2245
2245
  semantic: {
2246
2246
  raw: {
2247
2247
  covered: 0,
2248
2248
  ratio: 0,
2249
- total: 49
2249
+ total: 70
2250
2250
  },
2251
2251
  weighted: {
2252
2252
  covered: 0,
2253
2253
  ratio: 0,
2254
- total: 4.6935483871
2254
+ total: 4.69230769231
2255
2255
  }
2256
2256
  },
2257
2257
  visual: {
2258
2258
  raw: {
2259
2259
  covered: 0,
2260
2260
  ratio: 0,
2261
- total: 47
2261
+ total: 69
2262
2262
  },
2263
2263
  weighted: {
2264
2264
  covered: 0,
2265
2265
  ratio: 0,
2266
- total: 4.27419354839
2266
+ total: 4.27125506073
2267
2267
  }
2268
2268
  }
2269
2269
  },
@@ -2272,36 +2272,36 @@ var init_capability_inventory_coverage = __esm({
2272
2272
  raw: {
2273
2273
  covered: 0,
2274
2274
  ratio: 0,
2275
- total: 96
2275
+ total: 139
2276
2276
  },
2277
2277
  weighted: {
2278
2278
  covered: 0,
2279
2279
  ratio: 0,
2280
- total: 8.96774193548
2280
+ total: 8.96356275304
2281
2281
  }
2282
2282
  },
2283
2283
  semantic: {
2284
2284
  raw: {
2285
2285
  covered: 0,
2286
2286
  ratio: 0,
2287
- total: 49
2287
+ total: 70
2288
2288
  },
2289
2289
  weighted: {
2290
2290
  covered: 0,
2291
2291
  ratio: 0,
2292
- total: 4.6935483871
2292
+ total: 4.69230769231
2293
2293
  }
2294
2294
  },
2295
2295
  visual: {
2296
2296
  raw: {
2297
2297
  covered: 0,
2298
2298
  ratio: 0,
2299
- total: 47
2299
+ total: 69
2300
2300
  },
2301
2301
  weighted: {
2302
2302
  covered: 0,
2303
2303
  ratio: 0,
2304
- total: 4.27419354839
2304
+ total: 4.27125506073
2305
2305
  }
2306
2306
  }
2307
2307
  }
@@ -2776,7 +2776,7 @@ var init_capability_inventory_coverage = __esm({
2776
2776
  raw: {
2777
2777
  covered: 0,
2778
2778
  ratio: 0,
2779
- total: 61
2779
+ total: 63
2780
2780
  },
2781
2781
  weighted: {
2782
2782
  covered: 0,
@@ -2788,7 +2788,7 @@ var init_capability_inventory_coverage = __esm({
2788
2788
  raw: {
2789
2789
  covered: 0,
2790
2790
  ratio: 0,
2791
- total: 32
2791
+ total: 33
2792
2792
  },
2793
2793
  weighted: {
2794
2794
  covered: 0,
@@ -2800,7 +2800,7 @@ var init_capability_inventory_coverage = __esm({
2800
2800
  raw: {
2801
2801
  covered: 0,
2802
2802
  ratio: 0,
2803
- total: 29
2803
+ total: 30
2804
2804
  },
2805
2805
  weighted: {
2806
2806
  covered: 0,
@@ -2814,7 +2814,7 @@ var init_capability_inventory_coverage = __esm({
2814
2814
  raw: {
2815
2815
  covered: 0,
2816
2816
  ratio: 0,
2817
- total: 61
2817
+ total: 63
2818
2818
  },
2819
2819
  weighted: {
2820
2820
  covered: 0,
@@ -2826,7 +2826,7 @@ var init_capability_inventory_coverage = __esm({
2826
2826
  raw: {
2827
2827
  covered: 0,
2828
2828
  ratio: 0,
2829
- total: 32
2829
+ total: 33
2830
2830
  },
2831
2831
  weighted: {
2832
2832
  covered: 0,
@@ -2838,7 +2838,7 @@ var init_capability_inventory_coverage = __esm({
2838
2838
  raw: {
2839
2839
  covered: 0,
2840
2840
  ratio: 0,
2841
- total: 29
2841
+ total: 30
2842
2842
  },
2843
2843
  weighted: {
2844
2844
  covered: 0,
@@ -2852,7 +2852,7 @@ var init_capability_inventory_coverage = __esm({
2852
2852
  raw: {
2853
2853
  covered: 0,
2854
2854
  ratio: 0,
2855
- total: 61
2855
+ total: 63
2856
2856
  },
2857
2857
  weighted: {
2858
2858
  covered: 0,
@@ -2864,7 +2864,7 @@ var init_capability_inventory_coverage = __esm({
2864
2864
  raw: {
2865
2865
  covered: 0,
2866
2866
  ratio: 0,
2867
- total: 32
2867
+ total: 33
2868
2868
  },
2869
2869
  weighted: {
2870
2870
  covered: 0,
@@ -2876,7 +2876,7 @@ var init_capability_inventory_coverage = __esm({
2876
2876
  raw: {
2877
2877
  covered: 0,
2878
2878
  ratio: 0,
2879
- total: 29
2879
+ total: 30
2880
2880
  },
2881
2881
  weighted: {
2882
2882
  covered: 0,
@@ -3796,56 +3796,10 @@ var init_capability_outcomes2 = __esm({
3796
3796
  }
3797
3797
  },
3798
3798
  "react-native-gesture-handler": {
3799
- exactTestedVersion: "2.32.0",
3800
- supportedVersionRange: ">=2.30.0",
3801
- lastMeasured: {
3802
- byWeighting: {
3803
- strict: {
3804
- android: {
3805
- passedWeight: 0,
3806
- failedWeight: 0,
3807
- unassessedWeight: 49,
3808
- totalWeight: 49,
3809
- assessedWeight: 0,
3810
- compatibility: null,
3811
- assessed: 0
3812
- },
3813
- ios: {
3814
- passedWeight: 9,
3815
- failedWeight: 0,
3816
- unassessedWeight: 40,
3817
- totalWeight: 49,
3818
- assessedWeight: 9,
3819
- compatibility: 1,
3820
- assessed: 0.1836734693877551
3821
- }
3822
- },
3823
- usage: {
3824
- android: {
3825
- passedWeight: 0,
3826
- failedWeight: 0,
3827
- unassessedWeight: 776,
3828
- totalWeight: 776,
3829
- assessedWeight: 0,
3830
- compatibility: null,
3831
- assessed: 0
3832
- },
3833
- ios: {
3834
- passedWeight: 7,
3835
- failedWeight: 0,
3836
- unassessedWeight: 769,
3837
- totalWeight: 776,
3838
- assessedWeight: 7,
3839
- compatibility: 1,
3840
- assessed: 0.00902061855670103
3841
- }
3842
- }
3843
- },
3844
- capturedAt: "2026-09-08T05:52:45.303Z",
3845
- receipts: ["retained-essentials-react-native-gesture-handler-r22458-20260908"],
3846
- sourceCommit: "ea3eb82eeea6f6925ae708b7028cb577ad37f36a"
3847
- },
3848
- unmatchedReferenceCount: 528,
3799
+ exactTestedVersion: "3.3.0",
3800
+ supportedVersionRange: ">=3.3.0",
3801
+ lastMeasured: null,
3802
+ unmatchedReferenceCount: 529,
3849
3803
  byPlatform: {
3850
3804
  android: {
3851
3805
  passedWeight: 0,
@@ -3871,8 +3825,8 @@ var init_capability_outcomes2 = __esm({
3871
3825
  android: {
3872
3826
  passedWeight: 0,
3873
3827
  failedWeight: 0,
3874
- unassessedWeight: 49,
3875
- totalWeight: 49,
3828
+ unassessedWeight: 70,
3829
+ totalWeight: 70,
3876
3830
  assessedWeight: 0,
3877
3831
  compatibility: null,
3878
3832
  assessed: 0
@@ -3880,8 +3834,8 @@ var init_capability_outcomes2 = __esm({
3880
3834
  ios: {
3881
3835
  passedWeight: 0,
3882
3836
  failedWeight: 0,
3883
- unassessedWeight: 49,
3884
- totalWeight: 49,
3837
+ unassessedWeight: 70,
3838
+ totalWeight: 70,
3885
3839
  assessedWeight: 0,
3886
3840
  compatibility: null,
3887
3841
  assessed: 0
@@ -4323,58 +4277,9 @@ var init_capability_outcomes2 = __esm({
4323
4277
  }
4324
4278
  },
4325
4279
  "react-native-screens": {
4326
- exactTestedVersion: "4.26.2",
4280
+ exactTestedVersion: "4.27.0",
4327
4281
  supportedVersionRange: ">=4.0.0",
4328
- lastMeasured: {
4329
- byWeighting: {
4330
- strict: {
4331
- android: {
4332
- passedWeight: 0,
4333
- failedWeight: 0,
4334
- unassessedWeight: 32,
4335
- totalWeight: 32,
4336
- assessedWeight: 0,
4337
- compatibility: null,
4338
- assessed: 0
4339
- },
4340
- ios: {
4341
- passedWeight: 3,
4342
- failedWeight: 0,
4343
- unassessedWeight: 29,
4344
- totalWeight: 32,
4345
- assessedWeight: 3,
4346
- compatibility: 1,
4347
- assessed: 0.09375
4348
- }
4349
- },
4350
- usage: {
4351
- android: {
4352
- passedWeight: 0,
4353
- failedWeight: 0,
4354
- unassessedWeight: 6,
4355
- totalWeight: 6,
4356
- assessedWeight: 0,
4357
- compatibility: null,
4358
- assessed: 0
4359
- },
4360
- ios: {
4361
- passedWeight: 4,
4362
- failedWeight: 0,
4363
- unassessedWeight: 2,
4364
- totalWeight: 6,
4365
- assessedWeight: 4,
4366
- compatibility: 1,
4367
- assessed: 0.6666666666666666
4368
- }
4369
- }
4370
- },
4371
- capturedAt: "2026-09-08T06:14:31.559Z",
4372
- receipts: [
4373
- "retained-essentials-react-native-screens-r22458-20260908",
4374
- "screens-sheets-paired-clean-p40993"
4375
- ],
4376
- sourceCommit: "ea3eb82eeea6f6925ae708b7028cb577ad37f36a"
4377
- },
4282
+ lastMeasured: null,
4378
4283
  unmatchedReferenceCount: 0,
4379
4284
  byPlatform: {
4380
4285
  android: {
@@ -4401,8 +4306,8 @@ var init_capability_outcomes2 = __esm({
4401
4306
  android: {
4402
4307
  passedWeight: 0,
4403
4308
  failedWeight: 0,
4404
- unassessedWeight: 32,
4405
- totalWeight: 32,
4309
+ unassessedWeight: 33,
4310
+ totalWeight: 33,
4406
4311
  assessedWeight: 0,
4407
4312
  compatibility: null,
4408
4313
  assessed: 0
@@ -4410,8 +4315,8 @@ var init_capability_outcomes2 = __esm({
4410
4315
  ios: {
4411
4316
  passedWeight: 0,
4412
4317
  failedWeight: 0,
4413
- unassessedWeight: 32,
4414
- totalWeight: 32,
4318
+ unassessedWeight: 33,
4319
+ totalWeight: 33,
4415
4320
  assessedWeight: 0,
4416
4321
  compatibility: null,
4417
4322
  assessed: 0
@@ -4749,7 +4654,7 @@ var init_supported_native_packages = __esm({
4749
4654
  "@bugsnag/react-native-performance",
4750
4655
  // coverage
4751
4656
  "@callstack/liquid-glass",
4752
- // seam
4657
+ // preset+seam
4753
4658
  "@candlefinance/faster-image",
4754
4659
  // seam
4755
4660
  "@clerk/expo-passkeys",
@@ -5201,7 +5106,7 @@ var init_supported_native_packages = __esm({
5201
5106
  "react-native-bootsplash",
5202
5107
  // preset+seam+coverage
5203
5108
  "react-native-bottom-tabs",
5204
- // preset+visual-proof
5109
+ // visual-proof
5205
5110
  "react-native-branch",
5206
5111
  // coverage
5207
5112
  "react-native-calendar-events",
@@ -5899,6 +5804,11 @@ var init_registry = __esm({
5899
5804
  { range: ">=2.0.0 <2.30.0", coverage: 0.7, note: "tap, pan, long press" },
5900
5805
  {
5901
5806
  range: ">=2.30.0 <3.0.0",
5807
+ coverage: 0.75,
5808
+ note: "legacy gesture builders, handlers, swipeable and drawer entrypoints"
5809
+ },
5810
+ {
5811
+ range: ">=3.3.0",
5902
5812
  ...scoredCoverage("react-native-gesture-handler"),
5903
5813
  features: [
5904
5814
  {
@@ -9529,8 +9439,8 @@ var init_registry = __esm({
9529
9439
  {
9530
9440
  range: ">=1.21.0",
9531
9441
  coverage: 0.72,
9532
- note: "native-seam only for toolbar/menu host views. One's public Stack.Toolbar components use the real @vxrn/native implementation, whose React code runs from the bundle and converts the composition API into native host props and native-stack header items.",
9533
- working: "StackToolbar header and bottom placements, Button, Label, Icon with SF Symbols/image sources, Badge, fixed/fluid Spacer, View children, nested Menu/MenuAction trees, disabled/selected/destructive actions, visible action callbacks, and native-stack header bar item integration",
9442
+ note: "native-seam only for toolbar/menu host views. The real @vxrn/native React code runs from the bundle and converts its public props into native host props.",
9443
+ working: "ToolbarHost, ToolbarItem with SF Symbols/image sources, badges, fixed/fluid spacers, view children, nested MenuAction trees, disabled/selected/destructive actions, and visible action callbacks",
9534
9444
  missing: "Color and zoom-transition native hosts, SplitView gamma host, bottom SearchBarSlot integration with a configured native search controller, exact UIKit shared-background grouping"
9535
9445
  }
9536
9446
  ]
@@ -28039,6 +27949,15 @@ async function inferCloudModuleIdentity(source) {
28039
27949
  }
28040
27950
  }
28041
27951
  async function produceCloudArtifact(bundlePath, assetsPath, maxBytes = MAX_RNX_CLOUD_BUNDLE_BYTES) {
27952
+ return produceArtifact(
27953
+ bundlePath,
27954
+ assetsPath,
27955
+ maxBytes,
27956
+ REMOTE_COMMAND,
27957
+ "allow-placeholders"
27958
+ );
27959
+ }
27960
+ async function produceArtifact(bundlePath, assetsPath, maxBytes, command, assetPolicy) {
28042
27961
  const source = await loadBundleSource(bundlePath);
28043
27962
  const descriptors = extractAssetDescriptors(source);
28044
27963
  const search = assetsPath ? explicitMetroAssetDest((0, import_node_path15.resolve)(assetsPath), descriptors) : descriptors.length > 0 && !isRemoteBundleInput(bundlePath) ? searchMetroAssetDest(bundlePath, descriptors) : { dest: null, searched: [], truncated: false };
@@ -28054,7 +27973,7 @@ async function produceCloudArtifact(bundlePath, assetsPath, maxBytes = MAX_RNX_C
28054
27973
  const placement = placements.get(label);
28055
27974
  if (placement?.mismatched && dest) {
28056
27975
  throw new Error(
28057
- `${REMOTE_COMMAND} found ${variant.descriptor.name}.${variant.descriptor.type} in ${dest.directory}, but its bytes are not the ones this bundle was built against. Rebuild with \`react-native bundle --assets-dest ${dest.directory}\` so the bundle and the images match.`
27976
+ `${command} found ${variant.descriptor.name}.${variant.descriptor.type} in ${dest.directory}, but its bytes are not the ones this bundle was built against. Rebuild with \`react-native bundle --assets-dest ${dest.directory}\` so the bundle and the images match.`
28058
27977
  );
28059
27978
  }
28060
27979
  const relative2 = placement?.files.get(variant.scale);
@@ -28062,17 +27981,22 @@ async function produceCloudArtifact(bundlePath, assetsPath, maxBytes = MAX_RNX_C
28062
27981
  if (placement && placement.files.size > 0) return null;
28063
27982
  if (placement && placement.ambiguous.length > 0 && dest) {
28064
27983
  throw new Error(
28065
- `${REMOTE_COMMAND} found more than one image for ${label} in ${dest.directory} and none of them is the one Metro hashed: ${placement.ambiguous.sort().join(", ")}. Pass --assets <dir> to name the directory \`react-native bundle --assets-dest\` wrote.`
27984
+ `${command} found more than one image for ${label} in ${dest.directory} and none of them is the one Metro hashed: ${placement.ambiguous.sort().join(", ")}. Pass --assets <dir> to name the directory \`react-native bundle --assets-dest\` wrote.`
28066
27985
  );
28067
27986
  }
28068
27987
  if (assetsPath) {
28069
27988
  throw new Error(
28070
- `${REMOTE_COMMAND} could not find ${label} under --assets ${dest?.directory ?? (0, import_node_path15.resolve)(assetsPath)}. Point --assets at the directory \`react-native bundle --assets-dest\` wrote, or drop the flag to let ${REMOTE_COMMAND} find it.`
27989
+ `${command} could not find ${label} under --assets ${dest?.directory ?? (0, import_node_path15.resolve)(assetsPath)}. Point --assets at the directory \`react-native bundle --assets-dest\` wrote, or drop the flag to let ${command} find it.`
28071
27990
  );
28072
27991
  }
28073
27992
  if (search.truncated) {
28074
27993
  throw new Error(
28075
- `${REMOTE_COMMAND} stopped listing ${search.searched.join(", ")} after ${MAX_ASSET_DEST_FILES} files and never reached ${label}, so it cannot tell a missing asset from an unread one. Pass --assets <dir> to name the directory \`react-native bundle --assets-dest\` wrote.`
27994
+ `${command} stopped listing ${search.searched.join(", ")} after ${MAX_ASSET_DEST_FILES} files and never reached ${label}, so it cannot tell a missing asset from an unread one. Pass --assets <dir> to name the directory \`react-native bundle --assets-dest\` wrote.`
27995
+ );
27996
+ }
27997
+ if (assetPolicy === "require-assets") {
27998
+ throw new Error(
27999
+ `${command} could not find ${label}. Pass --assets <dir> pointing at the directory \`react-native bundle --assets-dest <dir>\` wrote, or build with \`--assets-dest\`.`
28076
28000
  );
28077
28001
  }
28078
28002
  const placeholder = metroAssetPlaceholderBytes(variant.descriptor.type);
@@ -28087,7 +28011,7 @@ async function produceCloudArtifact(bundlePath, assetsPath, maxBytes = MAX_RNX_C
28087
28011
  );
28088
28012
  const classic = metroIosAssetDestRelatives(variant.descriptor.httpServerLocation, filename)[0] ?? filename;
28089
28013
  throw new Error(
28090
- `${REMOTE_COMMAND} could not read ${(0, import_node_path15.join)(dest?.directory ?? ".", classic)} for ${variant.descriptor.name}.${variant.descriptor.type} at scale ${variant.scale}, and has no stand-in for a .${variant.descriptor.type} asset. Build the bundle with --assets-dest, or pass --assets <dir>.`
28014
+ `${command} could not read ${(0, import_node_path15.join)(dest?.directory ?? ".", classic)} for ${variant.descriptor.name}.${variant.descriptor.type} at scale ${variant.scale}, and has no stand-in for a .${variant.descriptor.type} asset. Build the bundle with --assets-dest, or pass --assets <dir>.`
28091
28015
  );
28092
28016
  });
28093
28017
  const artifact = await buildRnxCloudArtifact(embedded.code, {
@@ -28103,12 +28027,12 @@ async function produceCloudArtifact(bundlePath, assetsPath, maxBytes = MAX_RNX_C
28103
28027
  const warnings = [];
28104
28028
  if (substituted.length > 0) {
28105
28029
  warnings.push(
28106
- `${REMOTE_COMMAND} embedded a placeholder image for ${substituted.length} asset(s) no scale of which is in ${search.searched.join(", ") || "any asset dest directory"}: ${substituted.join(", ")}. Build the bundle with --assets-dest, or pass --assets <dir>, to ship the real images.`
28030
+ `${command} embedded a placeholder image for ${substituted.length} asset(s) no scale of which is in ${search.searched.join(", ") || "any asset dest directory"}: ${substituted.join(", ")}. Build the bundle with --assets-dest, or pass --assets <dir>, to ship the real images.`
28107
28031
  );
28108
28032
  }
28109
28033
  if (bytes.length >= Math.floor(maxBytes * 0.8)) {
28110
28034
  warnings.push(
28111
- `${REMOTE_COMMAND} artifact is ${bytes.length} bytes, ${Math.round(bytes.length / maxBytes * 100)}% of the ${maxBytes}-byte limit.${largestEmbeddedAssets(assets.sizes, 5)}`
28035
+ `${command} artifact is ${bytes.length} bytes, ${Math.round(bytes.length / maxBytes * 100)}% of the ${maxBytes}-byte limit.${largestEmbeddedAssets(assets.sizes, 5)}`
28112
28036
  );
28113
28037
  }
28114
28038
  return {
package/dist-lib/vite.cjs CHANGED
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.489 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.491 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
3
  "use strict";
4
4
  var __create = Object.create;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rnxsim",
3
- "version": "0.1.489",
3
+ "version": "0.1.491",
4
4
  "description": "Vite and Metro plugins, testing drivers, and SDK exports for rnx.",
5
5
  "author": "Tamagui LLC",
6
6
  "license": "SEE LICENSE IN LICENSE",
@@ -261,14 +261,14 @@
261
261
  },
262
262
  "devDependencies": {
263
263
  "@contrast/runtime-delivery": "workspace:*",
264
- "@sootsim/compat": "workspace:*",
265
264
  "@rnx/box": "workspace:*",
266
265
  "@rnx/globals": "workspace:*",
267
266
  "@rnx/skills": "workspace:*",
267
+ "@sootsim/compat": "workspace:*",
268
268
  "@types/ws": "^8.5.13",
269
269
  "rnx-cloud-box": "workspace:*",
270
270
  "sootsim-engine": "workspace:*",
271
- "typescript": "^5.7.0",
271
+ "typescript": "^6.0.3",
272
272
  "vite": "^8.2.2",
273
273
  "yaml": "^2.8.3"
274
274
  }
@@ -19,6 +19,7 @@ automation, inspecting the render tree, and managing sims.
19
19
 
20
20
  | command | description |
21
21
  | --- | --- |
22
+ | `rnx test` | run a Maestro flow or Detox suite against an rnx app bundle |
22
23
  | `rnx maestro` | author, generate, and run Maestro YAML flows against rnx |
23
24
  | `rnx detox` | run existing Detox suites against rnx on headless Chromium |
24
25
  | `rnx cleanup` | inspect and reclaim local rnx disk usage |
@@ -45,7 +46,9 @@ automation, inspecting the render tree, and managing sims.
45
46
  | `rnx box` | start a local Box or create a cloud Box |
46
47
  | `rnx ios` | start an iOS simulator |
47
48
  | `rnx android` | start an Android simulator |
49
+ | `rnx remote` | run a prebuilt bundle on a remote simulator |
48
50
  | `rnx open` | load a target into the current sim or open a new one |
51
+ | `rnx preview` | publish a prebuilt bundle as a standalone preview |
49
52
  | `rnx list` | list connected sims or available launch drivers |
50
53
  | `rnx use` | select a connected sim |
51
54
  | `rnx skill` | install and inspect bundled rnx agent skills |
@@ -229,15 +229,14 @@ const expoUiJetpackComposeRealAliases = [
229
229
  }
230
230
  })
231
231
 
232
- // `react-native-gesture-handler/ReanimatedSwipeable` and `.../DrawerLayout` are
233
- // upstream pure JS and should load from the installed package. The root RNGH
234
- // package still aliases to SootSim's native seam, so add exact subpath aliases
235
- // before the root stub can rewrite them to
236
- // `<stubs>/react-native-gesture-handler.ts/<subpath>`.
237
- function rnghSubpathRealPath(subpath: string): string | null {
232
+ // these components are upstream pure JS and should load unchanged over the
233
+ // native seam. gesture handler 3 still supplies ReanimatedSwipeable but removed
234
+ // DrawerLayout, so the latter resolves from the explicit v2 compatibility
235
+ // alias. exact subpath aliases must precede the root facade alias.
236
+ function rnghSubpathRealPath(packageName: string, subpath: string): string | null {
238
237
  try {
239
238
  const packageJsonPath = sootsimPluginRequire.resolve(
240
- `react-native-gesture-handler/${subpath}/package.json`,
239
+ `${packageName}/${subpath}/package.json`,
241
240
  )
242
241
  const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'))
243
242
  const moduleEntry = packageJson?.module
@@ -253,8 +252,14 @@ function rnghSubpathRealPath(subpath: string): string | null {
253
252
  }
254
253
  }
255
254
 
256
- const rnghReanimatedSwipeableRealPath = rnghSubpathRealPath('ReanimatedSwipeable')
257
- const rnghDrawerLayoutRealPath = rnghSubpathRealPath('DrawerLayout')
255
+ const rnghReanimatedSwipeableRealPath = rnghSubpathRealPath(
256
+ 'react-native-gesture-handler',
257
+ 'ReanimatedSwipeable',
258
+ )
259
+ const rnghDrawerLayoutRealPath = rnghSubpathRealPath(
260
+ 'react-native-gesture-handler-v2',
261
+ 'DrawerLayout',
262
+ )
258
263
 
259
264
  const rnghGestureHandlerRootViewContextRealPath = (() => {
260
265
  try {
@@ -273,9 +278,12 @@ const rnghGestureHandlerRootViewContextShimPath = path.resolve(
273
278
  'rngh-gesture-handler-root-view-context.ts',
274
279
  )
275
280
  const rnghRootStubPath = path.resolve(compatStubsDir, 'react-native-gesture-handler.ts')
276
- const rnghLibModuleRoot = rnghGestureHandlerRootViewContextRealPath
277
- ? path.dirname(rnghGestureHandlerRootViewContextRealPath)
278
- : null
281
+ const rnghLibModuleRoots = [
282
+ rnghGestureHandlerRootViewContextRealPath
283
+ ? path.dirname(rnghGestureHandlerRootViewContextRealPath)
284
+ : null,
285
+ rnghDrawerLayoutRealPath ? path.dirname(path.dirname(rnghDrawerLayoutRealPath)) : null,
286
+ ].filter((root): root is string => root !== null)
279
287
 
280
288
  const compatWrapperRealPackageAliases: Array<{
281
289
  find: string
@@ -415,9 +423,11 @@ function rnghUpstreamInternalResolvePlugin(): Plugin {
415
423
  id: /(?:^\.\.\/\.\.(?:\.(?:js|jsx|mjs|ts|tsx))?$|GestureDetector(?:\.(?:js|jsx|mjs|ts|tsx))?$|GestureHandlerRootViewContext(?:\.(?:js|jsx|mjs|ts|tsx))?$|(?:PanGestureHandler|TapGestureHandler|State)(?:\.(?:js|jsx|mjs|ts|tsx))?$)/,
416
424
  },
417
425
  handler(source, importer) {
418
- if (!importer || !rnghLibModuleRoot) return null
426
+ if (!importer || rnghLibModuleRoots.length === 0) return null
419
427
  const importerPath = stripViteQuery(importer)
420
- if (!isPathInside(importerPath, rnghLibModuleRoot)) return null
428
+ if (!rnghLibModuleRoots.some((root) => isPathInside(importerPath, root))) {
429
+ return null
430
+ }
421
431
  const sourcePath = source.replace(/\.(js|jsx|mjs|ts|tsx)$/, '')
422
432
  if (
423
433
  sourcePath === '../..' ||
@@ -503,7 +513,9 @@ const ENGINE_WORKER_BOOT_CLOSURES: WorkerBootClosure[] = [
503
513
  // name table, and it sends the aliases and metrics it read on the wire
504
514
  // (engine/app-font-registry.ts registerForwardedAppFonts). keep it that way
505
515
  // when adding font work here, or both caps take the parser again.
506
- { entry: 'src/render-worker/shell-worker-entry.ts', maxBytes: 3_400_000 },
516
+ // gesture handler 3's upstream hook surface moved the measured closure to
517
+ // 3,446,531 bytes. keep only the four-kilobyte rounding margin here.
518
+ { entry: 'src/render-worker/shell-worker-entry.ts', maxBytes: 3_450_000 },
507
519
  { entry: 'src/render-worker/compositor-worker-entry.ts', maxBytes: 1_080_000 },
508
520
  { entry: 'src/render-worker/compositor-worker-ganesh-entry.ts', maxBytes: 1_820_000 },
509
521
  ]
@@ -1206,7 +1218,7 @@ function sootsimConfigPlugin(
1206
1218
  ...(rnghDrawerLayoutRealPath
1207
1219
  ? [
1208
1220
  {
1209
- find: /^react-native-gesture-handler\/DrawerLayout$/,
1221
+ find: /^(?:react-native-gesture-handler|react-native-gesture-handler-v2)\/DrawerLayout$/,
1210
1222
  replacement: rnghDrawerLayoutRealPath,
1211
1223
  },
1212
1224
  ]