rnxsim 0.1.352 → 0.1.354

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 (198) hide show
  1. package/README.md +17 -16
  2. package/cli/bin.ts +5 -4
  3. package/cli/commands/control.ts +20 -5
  4. package/cli/commands/daemon-mac-app.ts +1 -1
  5. package/cli/commands/daemon.ts +6 -8
  6. package/cli/commands/install-desktop.ts +42 -32
  7. package/cli/commands/no-bridge-hint.ts +3 -3
  8. package/cli/commands/serve.ts +1 -1
  9. package/cli/commands/setup.ts +215 -176
  10. package/cli/commands/welcome.ts +9 -58
  11. package/cli/desktop-companion.ts +31 -16
  12. package/cli/prompt.ts +12 -7
  13. package/cli/setup-repository.ts +6 -2
  14. package/cli/ui.ts +68 -0
  15. package/dist-cli/bin.js +5 -5
  16. package/dist-cli/chunks/{agent-27WDUXK5.js → agent-FB7RPXO6.js} +2 -2
  17. package/dist-cli/chunks/{agent-wrapper-XAUWPZ6O.js → agent-wrapper-LFU3XEIG.js} +2 -2
  18. package/dist-cli/chunks/{app-fonts-COAZFLDG.js → app-fonts-FK6SETRG.js} +2 -2
  19. package/dist-cli/chunks/{assert-ZR2UE3EH.js → assert-3KQYZDDK.js} +2 -2
  20. package/dist-cli/chunks/{auth-LISHWKCC.js → auth-RFE3J27C.js} +2 -2
  21. package/dist-cli/chunks/{beta-AQQUYVA5.js → beta-XVY4WOYH.js} +2 -2
  22. package/dist-cli/chunks/{camera-KE44ZN3U.js → camera-JROBX5GM.js} +2 -2
  23. package/dist-cli/chunks/chunk-24DA3Y2Z.js +9 -0
  24. package/dist-cli/chunks/{chunk-E42ZJLPN.js → chunk-37S36DFW.js} +1 -1
  25. package/dist-cli/chunks/{chunk-LRKODRWI.js → chunk-3QLERZYJ.js} +2 -2
  26. package/dist-cli/chunks/{chunk-VQDY7NEJ.js → chunk-3RW6W3ZO.js} +1 -1
  27. package/dist-cli/chunks/{chunk-R4P7WO4L.js → chunk-4AQCDL24.js} +2 -2
  28. package/dist-cli/chunks/{chunk-M6DC6JZL.js → chunk-4OS3SXPZ.js} +2 -2
  29. package/dist-cli/chunks/{chunk-TF6VBUZ7.js → chunk-766UIGCS.js} +2 -2
  30. package/dist-cli/chunks/{chunk-PEBQKBEP.js → chunk-77CBLMD4.js} +1 -1
  31. package/dist-cli/chunks/{chunk-7T7DR34H.js → chunk-7WANPS3W.js} +2 -2
  32. package/dist-cli/chunks/{chunk-MJB6N7WS.js → chunk-ATQPDEED.js} +2 -2
  33. package/dist-cli/chunks/chunk-B7OMSJXC.js +15 -0
  34. package/dist-cli/chunks/{chunk-MJJP2BEI.js → chunk-BAWV2UEF.js} +3 -3
  35. package/dist-cli/chunks/{chunk-DSF4WC4X.js → chunk-BNXXNT3I.js} +2 -2
  36. package/dist-cli/chunks/{chunk-BZ32JGFC.js → chunk-CKKDXTKV.js} +1 -1
  37. package/dist-cli/chunks/{chunk-P5YC5VGA.js → chunk-CUK6Y2RR.js} +2 -2
  38. package/dist-cli/chunks/{chunk-XI4W6LRQ.js → chunk-ENPWD62S.js} +2 -2
  39. package/dist-cli/chunks/{chunk-ZK5HYQ4I.js → chunk-EWPX6LEN.js} +2 -2
  40. package/dist-cli/chunks/{chunk-AIGZ3TSW.js → chunk-FEHHM2LV.js} +3 -3
  41. package/dist-cli/chunks/{chunk-QP7KGSU4.js → chunk-FPH4TYZO.js} +3 -3
  42. package/dist-cli/chunks/{chunk-XHZEKHB2.js → chunk-GNKXRXND.js} +6 -6
  43. package/dist-cli/chunks/{chunk-3ZV4WSCR.js → chunk-GYGDIT5V.js} +2 -2
  44. package/dist-cli/chunks/{chunk-YAMKV3UB.js → chunk-HIYCRDUP.js} +2 -2
  45. package/dist-cli/chunks/{chunk-5JINX2IB.js → chunk-HUU7ZUQK.js} +2 -2
  46. package/dist-cli/chunks/{chunk-4AOAJXE2.js → chunk-IGV4KCCM.js} +2 -2
  47. package/dist-cli/chunks/{chunk-5JE5PNIV.js → chunk-IICFLREN.js} +1 -1
  48. package/dist-cli/chunks/chunk-IUL2WUWW.js +32 -0
  49. package/dist-cli/chunks/{chunk-EHQHK7KN.js → chunk-JJOHJNUQ.js} +2 -2
  50. package/dist-cli/chunks/{chunk-ESVF72YH.js → chunk-JT435OOM.js} +2 -2
  51. package/dist-cli/chunks/{chunk-R2BFC3AC.js → chunk-JT4IMNCO.js} +2 -2
  52. package/dist-cli/chunks/{chunk-S2PJOB2C.js → chunk-JWXAXCC6.js} +2 -2
  53. package/dist-cli/chunks/{chunk-CY6HBAOB.js → chunk-JXNR2KAB.js} +2 -2
  54. package/dist-cli/chunks/{chunk-45D2GGIA.js → chunk-LC77IVGY.js} +2 -2
  55. package/dist-cli/chunks/{chunk-H6MTPXZS.js → chunk-LCPZNPIB.js} +1 -1
  56. package/dist-cli/chunks/chunk-LETVUC6M.js +11 -0
  57. package/dist-cli/chunks/chunk-LRVL5MAX.js +4 -0
  58. package/dist-cli/chunks/{chunk-24CIPQT5.js → chunk-MIK6LMG4.js} +1 -1
  59. package/dist-cli/chunks/{chunk-JEPQ5YX3.js → chunk-N3CE6AZP.js} +2 -2
  60. package/dist-cli/chunks/{chunk-AR3CPCW3.js → chunk-OKFSCCFC.js} +1 -1
  61. package/dist-cli/chunks/{chunk-3Y7NWE22.js → chunk-P4GCLNFM.js} +2 -2
  62. package/dist-cli/chunks/{chunk-NQMZOJPX.js → chunk-PHIYWV44.js} +2 -2
  63. package/dist-cli/chunks/{chunk-WNJDE2JT.js → chunk-QQNNY43R.js} +1 -1
  64. package/dist-cli/chunks/{chunk-FHLEA4S5.js → chunk-QRYTCPNO.js} +2 -2
  65. package/dist-cli/chunks/{chunk-Q4ROOH3W.js → chunk-SLD2EMLZ.js} +2 -2
  66. package/dist-cli/chunks/{chunk-ELNSQ352.js → chunk-THFM2CFT.js} +1 -1
  67. package/dist-cli/chunks/{chunk-EGKGCDG5.js → chunk-TJRKLRNP.js} +1 -1
  68. package/dist-cli/chunks/{chunk-H4IF54WS.js → chunk-UAYXEP74.js} +1 -1
  69. package/dist-cli/chunks/{chunk-BQE4E24T.js → chunk-UI2IFVHB.js} +1 -1
  70. package/dist-cli/chunks/chunk-UVIWE3LD.js +124 -0
  71. package/dist-cli/chunks/chunk-UX6D4X6B.js +24 -0
  72. package/dist-cli/chunks/{chunk-RH6FJI5O.js → chunk-X2DJK3TB.js} +2 -2
  73. package/dist-cli/chunks/chunk-Y4GUWO3X.js +7 -0
  74. package/dist-cli/chunks/{chunk-DJAYEBF3.js → chunk-YATZ7U4S.js} +1 -1
  75. package/dist-cli/chunks/{chunk-RASWCAJJ.js → chunk-YIUIFZAE.js} +2 -2
  76. package/dist-cli/chunks/{chunk-QJTW4QQW.js → chunk-YXBNGSG6.js} +1 -1
  77. package/dist-cli/chunks/{chunk-2OME2KGY.js → chunk-ZJUFI3R7.js} +1 -1
  78. package/dist-cli/chunks/{chunk-6NSUY346.js → chunk-ZNABCRWX.js} +2 -2
  79. package/dist-cli/chunks/{cleanup-JUY2WU24.js → cleanup-F74ISXJC.js} +2 -2
  80. package/dist-cli/chunks/cli-version-VSDCFXXN.js +4 -0
  81. package/dist-cli/chunks/{compat-S2TBISY3.js → compat-C3RGYGXL.js} +2 -2
  82. package/dist-cli/chunks/{config-3PHD4J5N.js → config-CDY2RB7Q.js} +2 -2
  83. package/dist-cli/chunks/control-J35HAFZA.js +4 -0
  84. package/dist-cli/chunks/daemon-DLLEODJY.js +4 -0
  85. package/dist-cli/chunks/{debug-PFAJONVV.js → debug-3P2DUTUQ.js} +3 -3
  86. package/dist-cli/chunks/{desktop-Z7EOBMNV.js → desktop-XIXW34VW.js} +4 -4
  87. package/dist-cli/chunks/{detox-KRSP5SLY.js → detox-KAKTJ4P4.js} +2 -2
  88. package/dist-cli/chunks/{device-ZXJ7GRBO.js → device-4MAWLZMR.js} +2 -2
  89. package/dist-cli/chunks/{diagnose-JIMLEOEJ.js → diagnose-A3R7HUYA.js} +2 -2
  90. package/dist-cli/chunks/{disk-cleanup-YY7FFGVA.js → disk-cleanup-5R7JYCO6.js} +2 -2
  91. package/dist-cli/chunks/drivers-BB3BRKDS.js +4 -0
  92. package/dist-cli/chunks/{film-LKSJPU2A.js → film-GY5U752Q.js} +3 -3
  93. package/dist-cli/chunks/flow-ALMSRBVL.js +4 -0
  94. package/dist-cli/chunks/help-3ZL7MRUX.js +4 -0
  95. package/dist-cli/chunks/{hidden-runtime-alias-ZN3WZ3ND.js → hidden-runtime-alias-HSGN3GN4.js} +2 -2
  96. package/dist-cli/chunks/home-paths-BIUN4CBO.js +4 -0
  97. package/dist-cli/chunks/inspect-RCU7XVAO.js +4 -0
  98. package/dist-cli/chunks/install-desktop-LYVKLTCU.js +4 -0
  99. package/dist-cli/chunks/{login-XKLIFTAU.js → login-WKNMS4GG.js} +2 -2
  100. package/dist-cli/chunks/{logout-DR22RB5H.js → logout-6UFUOESK.js} +2 -2
  101. package/dist-cli/chunks/{maestro-SLCX6HBV.js → maestro-SJGV7B3W.js} +3 -3
  102. package/dist-cli/chunks/{maestro-generate-GBFZ5INV.js → maestro-generate-PMF2LLKX.js} +3 -3
  103. package/dist-cli/chunks/{mode-F4R2KNXX.js → mode-MN7LZCLB.js} +2 -2
  104. package/dist-cli/chunks/{optional-demo-registry-HM55KXGB.js → optional-demo-registry-HFA27YSP.js} +2 -2
  105. package/dist-cli/chunks/{perf-VBS5GEPG.js → perf-XGANSJT3.js} +2 -2
  106. package/dist-cli/chunks/{permissions-F46PQIUE.js → permissions-25UWEJKW.js} +2 -2
  107. package/dist-cli/chunks/privacy-SIDMP5EF.js +4 -0
  108. package/dist-cli/chunks/{record-NLZ6DFAA.js → record-MA3AI752.js} +3 -3
  109. package/dist-cli/chunks/{report-issue-XIE5BVR4.js → report-issue-4DTESWE2.js} +2 -2
  110. package/dist-cli/chunks/reset-GPHG5XN3.js +4 -0
  111. package/dist-cli/chunks/runtime-VOEIOODA.js +4 -0
  112. package/dist-cli/chunks/{screenshot-command-SD4JPNKW.js → screenshot-command-JUXMWXS5.js} +3 -3
  113. package/dist-cli/chunks/{screenshot-layers-X65RC3GT.js → screenshot-layers-DJF2E4PE.js} +2 -2
  114. package/dist-cli/chunks/{screenshots-capture-BBXN7FEZ.js → screenshots-capture-UGZU5GOW.js} +2 -2
  115. package/dist-cli/chunks/{serve-M6ZKMSAG.js → serve-H7GNKJSM.js} +2 -2
  116. package/dist-cli/chunks/setup-G2WYLPM6.js +4 -0
  117. package/dist-cli/chunks/{skills-KDWGQBOP.js → skills-4JGPOSFE.js} +2 -2
  118. package/dist-cli/chunks/{state-NWABXG2P.js → state-DEAQFKVP.js} +2 -2
  119. package/dist-cli/chunks/{storage-QQE3G65Q.js → storage-Y6F5NTGH.js} +2 -2
  120. package/dist-cli/chunks/store-3EQT7VU6.js +4 -0
  121. package/dist-cli/chunks/telemetry-FANCQHKG.js +4 -0
  122. package/dist-cli/chunks/{timeline-2VZ45MMB.js → timeline-HOHYYDOC.js} +2 -2
  123. package/dist-cli/chunks/{upgrade-T7PDR6T5.js → upgrade-QF5YHLSG.js} +2 -2
  124. package/dist-cli/chunks/upload-QKJHFAX7.js +4 -0
  125. package/dist-cli/chunks/{version-BX6QX5XA.js → version-PDCKYJLB.js} +2 -2
  126. package/dist-cli/chunks/{web-4J6JRZN2.js → web-C5EUAFFW.js} +2 -2
  127. package/dist-cli/chunks/welcome-3CQ2GE4F.js +5 -0
  128. package/dist-cli/chunks/{what-happened-CHQKFNCM.js → what-happened-L56ZFIMJ.js} +2 -2
  129. package/dist-lib/agent-daemon-client.cjs +2 -2
  130. package/dist-lib/agent-events.cjs +1 -1
  131. package/dist-lib/agent-identity.cjs +1 -1
  132. package/dist-lib/agent-sessions.cjs +1 -1
  133. package/dist-lib/attached-projects.cjs +1 -1
  134. package/dist-lib/auth/shared-session.cjs +1 -1
  135. package/dist-lib/backend-origin.cjs +1 -1
  136. package/dist-lib/beta.cjs +1 -1
  137. package/dist-lib/beta.mjs +1 -1
  138. package/dist-lib/bridge-constants.cjs +1 -1
  139. package/dist-lib/bridge-contract.cjs +1 -1
  140. package/dist-lib/cli-constants.cjs +1 -1
  141. package/dist-lib/config.cjs +1 -1
  142. package/dist-lib/detox/index.cjs +1 -1
  143. package/dist-lib/dev-bundle-resolution.cjs +1 -1
  144. package/dist-lib/home-paths.cjs +21 -1
  145. package/dist-lib/host/bridge-host.cjs +1 -1
  146. package/dist-lib/host/fetch-proxy-handler.cjs +1 -1
  147. package/dist-lib/host/fetch-proxy-overrides.cjs +1 -1
  148. package/dist-lib/host/fetch-proxy-overrides.mjs +1 -1
  149. package/dist-lib/host/replacement-module-handler.cjs +1 -1
  150. package/dist-lib/host/websocket-proxy.cjs +1 -1
  151. package/dist-lib/index.cjs +2 -2
  152. package/dist-lib/jump-to-source-babel.cjs +1 -1
  153. package/dist-lib/menu.cjs +1 -1
  154. package/dist-lib/menu.mjs +1 -1
  155. package/dist-lib/metro-production-bundle.cjs +1 -1
  156. package/dist-lib/metro-production-bundle.mjs +1 -1
  157. package/dist-lib/metro.cjs +2 -2
  158. package/dist-lib/profiles.cjs +1 -1
  159. package/dist-lib/public-brand.cjs +1 -1
  160. package/dist-lib/react-native-host-modules.cjs +1 -1
  161. package/dist-lib/react-native-host-modules.mjs +1 -1
  162. package/dist-lib/render-mode.cjs +1 -1
  163. package/dist-lib/scripts/dev-server-scanner.cjs +1 -1
  164. package/dist-lib/sdk.cjs +1 -1
  165. package/dist-lib/sdk.mjs +1 -1
  166. package/dist-lib/skills.cjs +87 -22
  167. package/dist-lib/vite.cjs +2 -2
  168. package/package.json +1 -1
  169. package/skills/contrast/SKILL.md +3 -3
  170. package/skills/rnx-setup/SKILL.md +17 -5
  171. package/src/agent-daemon-client.ts +1 -1
  172. package/src/home-paths.ts +22 -0
  173. package/src/metro-plugin.ts +1 -1
  174. package/src/runtime-assets.ts +1 -1
  175. package/dist-cli/chunks/chunk-2JZXOHH6.js +0 -4
  176. package/dist-cli/chunks/chunk-2WJABJ6C.js +0 -15
  177. package/dist-cli/chunks/chunk-5OVXQKUP.js +0 -25
  178. package/dist-cli/chunks/chunk-DFTG53TX.js +0 -11
  179. package/dist-cli/chunks/chunk-HF2FZ2WN.js +0 -7
  180. package/dist-cli/chunks/chunk-S63ENXGH.js +0 -6
  181. package/dist-cli/chunks/chunk-UHP33XGC.js +0 -124
  182. package/dist-cli/chunks/cli-version-6SQSIFNQ.js +0 -4
  183. package/dist-cli/chunks/control-GLBCTKAA.js +0 -4
  184. package/dist-cli/chunks/daemon-H4OVIEMH.js +0 -4
  185. package/dist-cli/chunks/drivers-63LY2NCK.js +0 -4
  186. package/dist-cli/chunks/flow-JHKPF7BN.js +0 -4
  187. package/dist-cli/chunks/help-Q6OY6VVA.js +0 -4
  188. package/dist-cli/chunks/home-paths-UOATIRKF.js +0 -4
  189. package/dist-cli/chunks/inspect-DW3V2FD4.js +0 -4
  190. package/dist-cli/chunks/install-desktop-GWY5H22W.js +0 -4
  191. package/dist-cli/chunks/privacy-34FNXPJP.js +0 -4
  192. package/dist-cli/chunks/reset-BAGCFYTS.js +0 -4
  193. package/dist-cli/chunks/runtime-JTYB4CM7.js +0 -4
  194. package/dist-cli/chunks/setup-KTWKZOJB.js +0 -30
  195. package/dist-cli/chunks/store-6XW4YZM6.js +0 -4
  196. package/dist-cli/chunks/telemetry-MVSV7JHI.js +0 -4
  197. package/dist-cli/chunks/upload-RF2MNO2X.js +0 -4
  198. package/dist-cli/chunks/welcome-3MJHGERV.js +0 -5
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.352 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.354 | (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 __defProp = Object.defineProperty;
package/dist-lib/menu.cjs CHANGED
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.352 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.354 | (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 __defProp = Object.defineProperty;
package/dist-lib/menu.mjs CHANGED
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.352 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.354 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/public-brand.ts
4
4
  var name = "rnx";
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.352 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.354 | (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 __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.352 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.354 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/metro-production-bundle.ts
4
4
  var RNXSIM_METRO_PRODUCTION_BUNDLE_OPTION = "rnxsim";
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.352 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.354 | (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;
@@ -514,7 +514,7 @@ function readActiveRuntime() {
514
514
  var DAEMON_LOCKFILE_MAX_BYTES = 16 * 1024;
515
515
 
516
516
  // src/runtime-assets.ts
517
- var SOOTSIM_RUNTIME_MISSING_MESSAGE = "[rnx] no engine runtime installed \u2014 run `rnx setup`, or `rnx runtime install`";
517
+ var SOOTSIM_RUNTIME_MISSING_MESSAGE = "[rnx] no engine runtime installed. run `rnx runtime install`";
518
518
  var _monorepoRootCache;
519
519
  function findMonorepoRoot() {
520
520
  if (_monorepoRootCache !== void 0) return _monorepoRootCache;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.352 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.354 | (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;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.352 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.354 | (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 __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.352 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.354 | (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 __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.352 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.354 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
 
3
3
  // src/react-native-host-modules.ts
4
4
  var REACT_NATIVE_PASSTHROUGH_SPECIFIERS = [
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.352 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.354 | (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 __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.352 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.354 | (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/dist-lib/sdk.cjs CHANGED
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.352 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.354 | (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 __defProp = Object.defineProperty;
package/dist-lib/sdk.mjs CHANGED
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.352 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.354 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
2
  var __defProp = Object.defineProperty;
3
3
  var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
4
4
  var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.352 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.354 | (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;
@@ -10668,6 +10668,7 @@ __export(home_paths_exports, {
10668
10668
  isDaemonLockfileFresh: () => isDaemonLockfileFresh,
10669
10669
  isDevBridgeLockfileFresh: () => isDevBridgeLockfileFresh,
10670
10670
  isDevWorkstation: () => isDevWorkstation,
10671
+ isOnboardingComplete: () => isOnboardingComplete,
10671
10672
  isSootsimDevCheckout: () => isSootsimDevCheckout,
10672
10673
  profilesDir: () => profilesDir,
10673
10674
  readActiveRuntime: () => readActiveRuntime,
@@ -10677,6 +10678,7 @@ __export(home_paths_exports, {
10677
10678
  readOrCreateAnonymousId: () => readOrCreateAnonymousId,
10678
10679
  readPrivacyPreferences: () => readPrivacyPreferences,
10679
10680
  readSharedConfig: () => readSharedConfig,
10681
+ readSimulatorDriverPreference: () => readSimulatorDriverPreference,
10680
10682
  removeDaemonLockfile: () => removeDaemonLockfile,
10681
10683
  removeDevBridgeLockfile: () => removeDevBridgeLockfile,
10682
10684
  runtimeDir: () => runtimeDir,
@@ -10687,6 +10689,7 @@ __export(home_paths_exports, {
10687
10689
  writeActiveRuntime: () => writeActiveRuntime,
10688
10690
  writeDaemonLockfile: () => writeDaemonLockfile,
10689
10691
  writeDevBridgeLockfile: () => writeDevBridgeLockfile,
10692
+ writeOnboardingPreferences: () => writeOnboardingPreferences,
10690
10693
  writePrivacyPreferences: () => writePrivacyPreferences,
10691
10694
  writeRuntimeUpgradeNotice: () => writeRuntimeUpgradeNotice,
10692
10695
  writeSharedConfig: () => writeSharedConfig
@@ -10793,6 +10796,19 @@ function writeSharedConfig(patch) {
10793
10796
  import_node_fs3.default.renameSync(tmp, configFilePath());
10794
10797
  return next;
10795
10798
  }
10799
+ function isOnboardingComplete() {
10800
+ return readSharedConfig().onboardingVersion === CURRENT_ONBOARDING_VERSION;
10801
+ }
10802
+ function readSimulatorDriverPreference() {
10803
+ const driver = readSharedConfig().simulatorDriver;
10804
+ return driver === "electron" || driver === "playwright" ? driver : null;
10805
+ }
10806
+ function writeOnboardingPreferences(driver) {
10807
+ writeSharedConfig({
10808
+ onboardingVersion: CURRENT_ONBOARDING_VERSION,
10809
+ simulatorDriver: driver
10810
+ });
10811
+ }
10796
10812
  function readPrivacyPreferences() {
10797
10813
  const settings = readSharedConfig().settings;
10798
10814
  const productAnalytics = settings?.productAnalytics;
@@ -11138,7 +11154,7 @@ function removeDevBridgeLockfile(owner) {
11138
11154
  } catch {
11139
11155
  }
11140
11156
  }
11141
- var import_node_crypto, import_node_fs3, import_node_os, import_node_path4, SOOTSIM_HOME_ENV, ACTIVE_RUNTIME_FILE, DAEMON_LOCKFILE, DEV_BRIDGES_DIR, CONFIG_FILE, DAEMON_HEARTBEAT_STALE_MS, DAEMON_LOCKFILE_MAX_BYTES, DAEMON_CLAIM_STALE_MS;
11157
+ var import_node_crypto, import_node_fs3, import_node_os, import_node_path4, SOOTSIM_HOME_ENV, ACTIVE_RUNTIME_FILE, DAEMON_LOCKFILE, DEV_BRIDGES_DIR, CONFIG_FILE, DAEMON_HEARTBEAT_STALE_MS, CURRENT_ONBOARDING_VERSION, DAEMON_LOCKFILE_MAX_BYTES, DAEMON_CLAIM_STALE_MS;
11142
11158
  var init_home_paths = __esm({
11143
11159
  "src/home-paths.ts"() {
11144
11160
  "use strict";
@@ -11152,6 +11168,7 @@ var init_home_paths = __esm({
11152
11168
  DEV_BRIDGES_DIR = "dev-bridges";
11153
11169
  CONFIG_FILE = "config.json";
11154
11170
  DAEMON_HEARTBEAT_STALE_MS = 3e4;
11171
+ CURRENT_ONBOARDING_VERSION = 1;
11155
11172
  DAEMON_LOCKFILE_MAX_BYTES = 16 * 1024;
11156
11173
  DAEMON_CLAIM_STALE_MS = 3e4;
11157
11174
  }
@@ -18199,9 +18216,9 @@ function findElectronBin(startDir) {
18199
18216
  function findMacApp() {
18200
18217
  const root = getSootsimRoot();
18201
18218
  const candidates = [
18202
- "/Applications/sootsim.app",
18203
- (0, import_path5.resolve)(process.env.HOME || "", "Applications/sootsim.app"),
18204
- ...root ? [(0, import_path5.resolve)(root, "app/sootsim.app")] : []
18219
+ "/Applications/rnx.app",
18220
+ (0, import_path5.resolve)(process.env.HOME || "", "Applications/rnx.app"),
18221
+ ...root ? [(0, import_path5.resolve)(root, "app/rnx.app")] : []
18205
18222
  ];
18206
18223
  const found = candidates.find((candidate) => (0, import_fs6.existsSync)(candidate));
18207
18224
  if (found) {
@@ -18230,20 +18247,17 @@ function findMacApp() {
18230
18247
  }
18231
18248
  function findFirstAppImage(dir) {
18232
18249
  if (!(0, import_fs6.existsSync)(dir)) return null;
18233
- const match = (0, import_fs6.readdirSync)(dir).filter((entry) => entry.startsWith("sootsim") && entry.endsWith(".AppImage")).sort().reverse()[0];
18250
+ const match = (0, import_fs6.readdirSync)(dir).filter((entry) => entry.startsWith("rnx") && entry.endsWith(".AppImage")).sort().reverse()[0];
18234
18251
  return match ? (0, import_path5.join)(dir, match) : null;
18235
18252
  }
18236
18253
  function findLinuxInstall() {
18237
18254
  const root = getSootsimRoot();
18238
18255
  const directCandidates = [
18239
- (0, import_path5.resolve)(process.env.HOME || "", "Applications/sootsim.AppImage"),
18240
- (0, import_path5.resolve)(process.env.HOME || "", ".local/bin/sootsim.AppImage"),
18241
- "/opt/sootsim/sootsim.AppImage",
18242
- "/opt/sootsim/sootsim",
18243
- ...root ? [
18244
- (0, import_path5.resolve)(root, "app/sootsim.AppImage"),
18245
- (0, import_path5.resolve)(root, "release/linux-unpacked/sootsim")
18246
- ] : []
18256
+ (0, import_path5.resolve)(process.env.HOME || "", "Applications/rnx.AppImage"),
18257
+ (0, import_path5.resolve)(process.env.HOME || "", ".local/bin/rnx.AppImage"),
18258
+ "/opt/rnx/rnx.AppImage",
18259
+ "/opt/rnx/rnx",
18260
+ ...root ? [(0, import_path5.resolve)(root, "app/rnx.AppImage"), (0, import_path5.resolve)(root, "release/linux-unpacked/rnx")] : []
18247
18261
  ];
18248
18262
  const directMatch = directCandidates.find((candidate) => (0, import_fs6.existsSync)(candidate));
18249
18263
  if (directMatch) {
@@ -18261,6 +18275,23 @@ function findLinuxInstall() {
18261
18275
  kind: "linux-appimage"
18262
18276
  };
18263
18277
  }
18278
+ function findWindowsInstall() {
18279
+ for (const hive of ["HKCU", "HKLM"]) {
18280
+ try {
18281
+ const output = (0, import_child_process5.execFileSync)(
18282
+ "reg",
18283
+ ["query", `${hive}\\Software\\Classes\\rnx\\shell\\open\\command`, "/ve"],
18284
+ { encoding: "utf8", timeout: 3e3 }
18285
+ );
18286
+ const executable = /"([^"\r\n]+\.exe)"/i.exec(output)?.[1];
18287
+ if (executable && (0, import_fs6.existsSync)(executable)) {
18288
+ return { path: executable, platform: "win32", kind: "win-exe" };
18289
+ }
18290
+ } catch {
18291
+ }
18292
+ }
18293
+ return null;
18294
+ }
18264
18295
  function findDesktopCompanion() {
18265
18296
  const dev = findDevElectron();
18266
18297
  if (dev) return dev;
@@ -18282,6 +18313,7 @@ function findDesktopCompanion() {
18282
18313
  }
18283
18314
  if (process.platform === "darwin") return findMacApp();
18284
18315
  if (process.platform === "linux") return findLinuxInstall();
18316
+ if (process.platform === "win32") return findWindowsInstall();
18285
18317
  return null;
18286
18318
  }
18287
18319
  async function spawnDetached(command, args, opts = {}) {
@@ -18328,7 +18360,7 @@ async function launchDesktopCompanion(url, install = findDesktopCompanion(), opt
18328
18360
  }
18329
18361
  function buildMacLaunchUrl(url, opts) {
18330
18362
  if (!opts.profileId && !opts.ephemeralProfile && !opts.ownerPid) return url;
18331
- const deepLink = new URL("sootsim://dev");
18363
+ const deepLink = new URL("rnx://dev");
18332
18364
  deepLink.searchParams.set("url", url);
18333
18365
  if (opts.profileId) deepLink.searchParams.set("profile", opts.profileId);
18334
18366
  if (opts.ephemeralProfile) deepLink.searchParams.set("ephemeral", "1");
@@ -19219,6 +19251,32 @@ var init_open_url2 = __esm({
19219
19251
  }
19220
19252
  });
19221
19253
 
19254
+ // cli/commands/inspect/env.ts
19255
+ function isAgentEnv() {
19256
+ if (process.env.SOOTSIM_AGENT === "0") return false;
19257
+ for (const name2 of AGENT_ENV_VARS) {
19258
+ const v = process.env[name2];
19259
+ if (v && v.trim() && v !== "0") return true;
19260
+ }
19261
+ return false;
19262
+ }
19263
+ var AGENT_ENV_VARS;
19264
+ var init_env = __esm({
19265
+ "cli/commands/inspect/env.ts"() {
19266
+ "use strict";
19267
+ AGENT_ENV_VARS = [
19268
+ "SOOTSIM_AGENT",
19269
+ "TM_SESSION",
19270
+ "CLAUDECODE",
19271
+ "CLAUDE_CODE_ENTRYPOINT",
19272
+ "CLAUDE_CODE_SESSION_ID",
19273
+ "CODEX_THREAD_ID",
19274
+ "CURSOR_TRACE_ID",
19275
+ "AIDER_MODEL"
19276
+ ];
19277
+ }
19278
+ });
19279
+
19222
19280
  // cli/runtime-notes.ts
19223
19281
  function isChangelogEntry(value) {
19224
19282
  if (!value || typeof value !== "object") return false;
@@ -19665,7 +19723,7 @@ async function ensureBridgeForOpen(preferredPort, explicitPort = false) {
19665
19723
  assertExplicitBridgeLock(preferredPort, explicitPort, nextLock);
19666
19724
  if (nextLock && isDaemonLockfileFresh(nextLock) && await canConnectToBridge(nextLock.bridgePort, 250)) {
19667
19725
  console.error(
19668
- ` started local bridge on port ${nextLock.bridgePort}; run \`sootsim setup\` to install the background daemon`
19726
+ ` Started a local bridge on port ${nextLock.bridgePort}. Run \`rnx daemon install\` to keep it ready between commands.`
19669
19727
  );
19670
19728
  return nextLock.bridgePort;
19671
19729
  }
@@ -20359,7 +20417,7 @@ function resolveTargetSim(sims, requestedId) {
20359
20417
  if (firstOpen) return firstOpen;
20360
20418
  throw new Error("no sim connected");
20361
20419
  }
20362
- function printOpenedSim(openUrl2, sim, mode) {
20420
+ function printOpenedSim(openUrl2, sim, mode, quiet = false) {
20363
20421
  const [printableOpenUrl, printableSimUrl] = [openUrl2, sim.url].map((value) => {
20364
20422
  if (!value) return value;
20365
20423
  try {
@@ -20372,6 +20430,10 @@ function printOpenedSim(openUrl2, sim, mode) {
20372
20430
  }
20373
20431
  return value;
20374
20432
  });
20433
+ if (quiet) {
20434
+ console.log(` Opened ConnectRN [${mode}]`);
20435
+ return;
20436
+ }
20375
20437
  console.log(
20376
20438
  ` ${mode === "current sim" ? "loaded" : "opened"}: ${printableOpenUrl} [${mode}]`
20377
20439
  );
@@ -20526,7 +20588,8 @@ async function runOpenCommand(args, opts = {}) {
20526
20588
  "--ephemeral",
20527
20589
  "--hot",
20528
20590
  "--no-hmr",
20529
- "--no-describe"
20591
+ "--no-describe",
20592
+ "--quiet"
20530
20593
  ],
20531
20594
  stripValueFlags: [
20532
20595
  "--base-url",
@@ -20539,6 +20602,7 @@ async function runOpenCommand(args, opts = {}) {
20539
20602
  ]
20540
20603
  });
20541
20604
  const requestedProfileId = args.find((_, i) => args[i - 1] === "--profile");
20605
+ const quiet = args.includes("--quiet");
20542
20606
  const ephemeralProfile = args.includes("--ephemeral");
20543
20607
  const cdpPortArg = args.find((_, i) => args[i - 1] === "--cdp-port");
20544
20608
  const cdpPort = cdpPortArg ? Number(cdpPortArg) : void 0;
@@ -20623,7 +20687,7 @@ async function runOpenCommand(args, opts = {}) {
20623
20687
  console.error(` unknown driver "${requestedDriverId}" \u2014 run \`rnx list --drivers\``);
20624
20688
  process.exit(1);
20625
20689
  }
20626
- const driverId = isDriverId(requestedDriverId) ? requestedDriverId : "playwright";
20690
+ const driverId = isDriverId(requestedDriverId) ? requestedDriverId : process.env.CI === "1" || process.env.CI === "true" || process.env.GITHUB_ACTIONS === "true" || isAgentEnv() || !process.stdin.isTTY ? "playwright" : readSimulatorDriverPreference() || "playwright";
20627
20691
  const driverHeadless = resolveDriverHeadless(args, driverId);
20628
20692
  if (cdpPort && driverId !== "playwright") {
20629
20693
  console.error(" rnx open: --cdp-port is only honored by the playwright driver");
@@ -20635,7 +20699,7 @@ async function runOpenCommand(args, opts = {}) {
20635
20699
  console.error(" rnx open: --hot and --no-hmr cannot be combined");
20636
20700
  process.exit(1);
20637
20701
  }
20638
- const hotMode = hotFlag ? true : noHmrFlag ? false : requestedDriverId !== "playwright";
20702
+ const hotMode = hotFlag ? true : noHmrFlag ? false : driverId !== "playwright";
20639
20703
  const deviceArg = args.find((_, i) => args[i - 1] === "--device");
20640
20704
  if (deviceArg && !(deviceArg in import_settings.devices)) {
20641
20705
  console.error(` rnx open: unknown device "${deviceArg}"`);
@@ -20761,7 +20825,7 @@ async function runOpenCommand(args, opts = {}) {
20761
20825
  applySootSimConfigToUrl(resolvedBaseUrl, runtimeConfig),
20762
20826
  buildShellUrlOpts
20763
20827
  );
20764
- printOpenedSim(shellUrl, { ...targetSim, url: shellUrl }, "current sim");
20828
+ printOpenedSim(shellUrl, { ...targetSim, url: shellUrl }, "current sim", quiet);
20765
20829
  await maybeDescribeAfterOpen(parsed.wsPort, targetSim.id, args);
20766
20830
  return parsed.wsPort;
20767
20831
  }
@@ -20834,7 +20898,7 @@ async function runOpenCommand(args, opts = {}) {
20834
20898
  const match = outcome.sim;
20835
20899
  saveCurrentSimId(match.id);
20836
20900
  signalDriverLaunchConnected(result);
20837
- printOpenedSim(openUrl2, match, `${driver.name} driver`);
20901
+ printOpenedSim(openUrl2, match, `${driver.name} driver`, quiet);
20838
20902
  await maybeDescribeAfterOpen(parsed.wsPort, match.id, args);
20839
20903
  return parsed.wsPort;
20840
20904
  }
@@ -21130,6 +21194,7 @@ var init_control = __esm({
21130
21194
  init_open_url2();
21131
21195
  init_ws_bridge();
21132
21196
  init_core();
21197
+ init_env();
21133
21198
  DEFAULT_DRIVER_CONNECT_TIMEOUT_MS = 12e4;
21134
21199
  DRIVER_CONNECT_INTERVAL_MS = 100;
21135
21200
  DRIVER_CONNECT_HOST_GRACE_MS = 5e3;
package/dist-lib/vite.cjs CHANGED
@@ -1,4 +1,4 @@
1
- /*! rnx v0.1.352 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
1
+ /*! rnx v0.1.354 | (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;
@@ -446,7 +446,7 @@ function isValidRuntimeVersion(value) {
446
446
  }
447
447
 
448
448
  // src/runtime-assets.ts
449
- var SOOTSIM_RUNTIME_MISSING_MESSAGE = "[rnx] no engine runtime installed \u2014 run `rnx setup`, or `rnx runtime install`";
449
+ var SOOTSIM_RUNTIME_MISSING_MESSAGE = "[rnx] no engine runtime installed. run `rnx runtime install`";
450
450
  var _monorepoRootCache;
451
451
  function findMonorepoRoot() {
452
452
  if (_monorepoRootCache !== void 0) return _monorepoRootCache;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rnxsim",
3
- "version": "0.1.352",
3
+ "version": "0.1.354",
4
4
  "description": "rnx CLI, Vite and Metro plugins, and agent skills for driving React Native apps in the browser.",
5
5
  "author": "Tamagui LLC",
6
6
  "license": "SEE LICENSE IN LICENSE",
@@ -49,11 +49,11 @@ automation, inspecting the render tree, and managing sims.
49
49
  | `rnx claim` | take an exclusive lease on a sim |
50
50
  | `rnx agent` | attached projects + local agent sessions (codex/claude) |
51
51
  | `rnx close` | close a connected sim |
52
- | `rnx setup` | check local setup and install the recommended bridge daemon |
52
+ | `rnx setup` | configure optional local conveniences |
53
53
  | `rnx compat` | check package compatibility |
54
54
  | `rnx report-issue` | send an explicitly approved compatibility report |
55
55
  | `rnx desktop` | launch or install the desktop companion |
56
- | `rnx daemon` | manage the optional background bridge service |
56
+ | `rnx daemon` | manage the recommended background bridge service |
57
57
  | `rnx version` | show the CLI + engine runtime versions you are running |
58
58
  | `rnx upgrade` | update the rnx CLI and engine runtime to the latest |
59
59
  | `rnx serve` | run the rnx bridge in the foreground |
@@ -92,7 +92,7 @@ skills for working with the rnx native preview engine:
92
92
  | --- | --- |
93
93
  | `/rnx-debug` | Debug rendering, animation, gesture, performance, and accessibility issues in a React Native app running under rnx. Reach for this whenever an animation looks wrong (janky, stutters, snaps, only updates once, or doesn't move at all), a swipe/transition/gesture misbehaves or feels broken, scrolling drops frames or feels slow, the UI renders the wrong tree/props, or a screen reader can't reach something — and drive the rnx CLI debug tooling first, not screenshots or ad-hoc logging. |
94
94
  | `/rnx-perf` | Optimize rnx engine and app performance — scroll jank, dropped frames, slow animation, idle CPU, memory growth, and "smooth normally but laggy under load" (video calls, busy machines). Covers measuring on the right thread with the right browser, proving each perf tier actually engages via its counters, a CPU-contention test harness, and the map of existing perf machinery so you improve it instead of reinventing it. For general app debugging load /rnx-debug first. |
95
- | `/rnx-setup` | Get rnx connected to your React Native app — from `rnx setup` to a driveable sim |
95
+ | `/rnx-setup` | Get rnx connected to your React Native app with no project setup |
96
96
  | `/rnx-test` | Run automated tests against your React Native app under rnx with Maestro YAML or Detox/Jest |
97
97
  | `/rnx-visual` | Pixel-level rendering comparison between rnx and native iOS — fonts, gradients, shadows, image fidelity |
98
98
 
@@ -1,13 +1,14 @@
1
1
  ---
2
2
  name: rnx-setup
3
- description: Get rnx connected to your React Native app — from `rnx setup` to a driveable sim
3
+ description: Get rnx connected to your React Native app with no project setup
4
4
  ---
5
5
 
6
6
  # rnx setup
7
7
 
8
8
  you want to drive a React Native app with rnx from the CLI. this skill
9
- takes you from `rnx setup` to a connected, pinned sim that every other
10
- rnx skill assumes exists. no per-app rnx install is required. if
9
+ takes you from a running development server to a connected, pinned sim that
10
+ every other rnx skill assumes exists. rnx requires no project setup or per-app
11
+ install. if
11
12
  `rnx describe` already
12
13
  returns a tree, you're past this skill — load `/rnx-debug` for
13
14
  debugging or `/rnx-test` for writing tests.
@@ -58,7 +59,8 @@ debugging or `/rnx-test` for writing tests.
58
59
  ## first move
59
60
 
60
61
  ```sh
61
- rnx setup # one-time guided setup; installs daemon
62
+ rnx daemon status # the persistent service makes agent commands much faster
63
+ rnx daemon install # enable it when missing on a supported personal machine
62
64
  rnx compat --json # scan the app's native package compatibility
63
65
  rnx open 8081 # load a metro/expo dev server
64
66
  rnx list # confirm exactly one sim is reachable
@@ -66,6 +68,15 @@ rnx use <id> # pin it for the rest of the workflow
66
68
  rnx describe # smoke test — should print a render tree
67
69
  ```
68
70
 
71
+ the background service keeps the local bridge and runtime ready between
72
+ commands. without it, rnx still works by starting an on-demand bridge, but
73
+ inspect, interaction, and test commands pay repeated startup cost. if the user
74
+ declined it during onboarding, `rnx daemon install` is the direct way to enable
75
+ it. CI does not need or install the service.
76
+
77
+ bare `rnx` opens ConnectRN for a human to choose among local apps. agents and
78
+ scripts should use `rnx open <port-or-url>` so the target is explicit.
79
+
69
80
  if you do not know the port, run `rnx open` with no target and pick from
70
81
  the detected dev servers. for hosted or unusual targets, pass the URL
71
82
  explicitly:
@@ -118,7 +129,8 @@ rnx runtime list # is at least one engine runtime installed?
118
129
  rnx open <port> # does loading explicitly work?
119
130
  ```
120
131
 
121
- if daemon is down: run `rnx setup`, or `rnx serve` in another shell for
132
+ if the daemon is not installed: run `rnx daemon install`. if the registered
133
+ daemon is down, run `rnx daemon restart`, or `rnx serve` in another shell for
122
134
  a foreground bridge. if no runtime is installed, `rnx open` installs it
123
135
  before launching. if open errors with "port unreachable": confirm your dev
124
136
  server is actually serving — the bundler has to be up before rnx can
@@ -361,7 +361,7 @@ export async function ensureDaemonRunning(
361
361
  }
362
362
  if (shouldSkipPersistentDaemon()) {
363
363
  throw new AgentDaemonError(
364
- `no rnx bridge on port ${port}. run \`rnx setup\` to install the background daemon, or \`rnx serve\` in another shell.`,
364
+ `no rnx bridge on port ${port}. run \`rnx daemon install\` to enable the faster background service, or \`rnx serve\` in another shell.`,
365
365
  'DEV_HOST_REFUSED',
366
366
  )
367
367
  }
package/src/home-paths.ts CHANGED
@@ -187,6 +187,8 @@ export function configFilePath(): string {
187
187
 
188
188
  export interface SharedConfig {
189
189
  telemetry?: boolean
190
+ onboardingVersion?: number
191
+ simulatorDriver?: 'electron' | 'playwright'
190
192
  settings?: Record<string, unknown>
191
193
  [key: string]: unknown
192
194
  }
@@ -222,6 +224,26 @@ export function writeSharedConfig(patch: Partial<SharedConfig>): SharedConfig {
222
224
  return next
223
225
  }
224
226
 
227
+ const CURRENT_ONBOARDING_VERSION = 1
228
+
229
+ export type SimulatorDriverPreference = 'electron' | 'playwright'
230
+
231
+ export function isOnboardingComplete(): boolean {
232
+ return readSharedConfig().onboardingVersion === CURRENT_ONBOARDING_VERSION
233
+ }
234
+
235
+ export function readSimulatorDriverPreference(): SimulatorDriverPreference | null {
236
+ const driver = readSharedConfig().simulatorDriver
237
+ return driver === 'electron' || driver === 'playwright' ? driver : null
238
+ }
239
+
240
+ export function writeOnboardingPreferences(driver: SimulatorDriverPreference): void {
241
+ writeSharedConfig({
242
+ onboardingVersion: CURRENT_ONBOARDING_VERSION,
243
+ simulatorDriver: driver,
244
+ })
245
+ }
246
+
225
247
  export interface PrivacyPreferences {
226
248
  productAnalytics: boolean
227
249
  crashReports: boolean
@@ -1,6 +1,6 @@
1
1
  // rnx metro plugin for opt-in dev shell and production bundle integration.
2
2
  // shell assets come from an engine runtime under ~/.sootsim/runtimes/, fetched
3
- // by `sootsim runtime install` / `sootsim setup`. ordinary localhost requests
3
+ // by `rnx runtime install`. ordinary localhost requests
4
4
  // follow active; a version-owned localhost origin stays on its exact directory
5
5
  // when active changes, so one loaded shell cannot mix runtime chunk trees.
6
6
  //
@@ -9,7 +9,7 @@ import { isValidRuntimeVersion } from '@contrast/runtime-delivery'
9
9
  import { readActiveRuntime, runtimeDir } from './home-paths.ts'
10
10
 
11
11
  export const SOOTSIM_RUNTIME_MISSING_MESSAGE =
12
- '[rnx] no engine runtime installed — run `rnx setup`, or `rnx runtime install`'
12
+ '[rnx] no engine runtime installed. run `rnx runtime install`'
13
13
 
14
14
  // --- dev-checkout mode boundary --------------------------------------------
15
15
  //
@@ -1,4 +0,0 @@
1
- /*! rnx v0.1.352 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
- import { createRequire as __sootsimCreateRequire } from 'node:module'
3
- var require = __sootsimCreateRequire(import.meta.url)
4
- function p(){console.error(" no rnx desktop companion found."),console.error(""),console.error(" install the desktop app:"),console.error(" rnx desktop install"),console.error(""),console.error(" or run setup to install the background daemon:"),console.error(" rnx setup"),console.error("")}function t(r){console.error(""),console.error(` no sim is connected to the rnx bridge on port ${r}.`),console.error(""),console.error(" start your app dev server, then open it in rnx:"),console.error(" npx expo start --localhost --port 8081"),console.error(" rnx open 8081"),console.error(""),console.error(" then inspect the live app:"),console.error(" rnx describe")}async function a(r,n,s){let e=[];try{e=await r.listSims()}catch{}if(console.error(""),e.length===0){t(n);return}console.error(` no sim with id "${s}" is connected to the bridge on port ${n}.`),console.error(""),console.error(" connected sims:");for(let o of e){let i=[o.isPrimary?"primary":null,o.readyState,o.userVisible===!1?"hidden":o.userVisible===!0?"visible":null,o.userFocused?"focused":null].filter(Boolean).join(", ");console.error(` ${o.id} (${i})`)}console.error(""),console.error(" pass a valid --sim id, or run `rnx list` to see all sessions.")}export{p as a,t as b,a as c};