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.
- package/README.md +17 -16
- package/cli/bin.ts +5 -4
- package/cli/commands/control.ts +20 -5
- package/cli/commands/daemon-mac-app.ts +1 -1
- package/cli/commands/daemon.ts +6 -8
- package/cli/commands/install-desktop.ts +42 -32
- package/cli/commands/no-bridge-hint.ts +3 -3
- package/cli/commands/serve.ts +1 -1
- package/cli/commands/setup.ts +215 -176
- package/cli/commands/welcome.ts +9 -58
- package/cli/desktop-companion.ts +31 -16
- package/cli/prompt.ts +12 -7
- package/cli/setup-repository.ts +6 -2
- package/cli/ui.ts +68 -0
- package/dist-cli/bin.js +5 -5
- package/dist-cli/chunks/{agent-27WDUXK5.js → agent-FB7RPXO6.js} +2 -2
- package/dist-cli/chunks/{agent-wrapper-XAUWPZ6O.js → agent-wrapper-LFU3XEIG.js} +2 -2
- package/dist-cli/chunks/{app-fonts-COAZFLDG.js → app-fonts-FK6SETRG.js} +2 -2
- package/dist-cli/chunks/{assert-ZR2UE3EH.js → assert-3KQYZDDK.js} +2 -2
- package/dist-cli/chunks/{auth-LISHWKCC.js → auth-RFE3J27C.js} +2 -2
- package/dist-cli/chunks/{beta-AQQUYVA5.js → beta-XVY4WOYH.js} +2 -2
- package/dist-cli/chunks/{camera-KE44ZN3U.js → camera-JROBX5GM.js} +2 -2
- package/dist-cli/chunks/chunk-24DA3Y2Z.js +9 -0
- package/dist-cli/chunks/{chunk-E42ZJLPN.js → chunk-37S36DFW.js} +1 -1
- package/dist-cli/chunks/{chunk-LRKODRWI.js → chunk-3QLERZYJ.js} +2 -2
- package/dist-cli/chunks/{chunk-VQDY7NEJ.js → chunk-3RW6W3ZO.js} +1 -1
- package/dist-cli/chunks/{chunk-R4P7WO4L.js → chunk-4AQCDL24.js} +2 -2
- package/dist-cli/chunks/{chunk-M6DC6JZL.js → chunk-4OS3SXPZ.js} +2 -2
- package/dist-cli/chunks/{chunk-TF6VBUZ7.js → chunk-766UIGCS.js} +2 -2
- package/dist-cli/chunks/{chunk-PEBQKBEP.js → chunk-77CBLMD4.js} +1 -1
- package/dist-cli/chunks/{chunk-7T7DR34H.js → chunk-7WANPS3W.js} +2 -2
- package/dist-cli/chunks/{chunk-MJB6N7WS.js → chunk-ATQPDEED.js} +2 -2
- package/dist-cli/chunks/chunk-B7OMSJXC.js +15 -0
- package/dist-cli/chunks/{chunk-MJJP2BEI.js → chunk-BAWV2UEF.js} +3 -3
- package/dist-cli/chunks/{chunk-DSF4WC4X.js → chunk-BNXXNT3I.js} +2 -2
- package/dist-cli/chunks/{chunk-BZ32JGFC.js → chunk-CKKDXTKV.js} +1 -1
- package/dist-cli/chunks/{chunk-P5YC5VGA.js → chunk-CUK6Y2RR.js} +2 -2
- package/dist-cli/chunks/{chunk-XI4W6LRQ.js → chunk-ENPWD62S.js} +2 -2
- package/dist-cli/chunks/{chunk-ZK5HYQ4I.js → chunk-EWPX6LEN.js} +2 -2
- package/dist-cli/chunks/{chunk-AIGZ3TSW.js → chunk-FEHHM2LV.js} +3 -3
- package/dist-cli/chunks/{chunk-QP7KGSU4.js → chunk-FPH4TYZO.js} +3 -3
- package/dist-cli/chunks/{chunk-XHZEKHB2.js → chunk-GNKXRXND.js} +6 -6
- package/dist-cli/chunks/{chunk-3ZV4WSCR.js → chunk-GYGDIT5V.js} +2 -2
- package/dist-cli/chunks/{chunk-YAMKV3UB.js → chunk-HIYCRDUP.js} +2 -2
- package/dist-cli/chunks/{chunk-5JINX2IB.js → chunk-HUU7ZUQK.js} +2 -2
- package/dist-cli/chunks/{chunk-4AOAJXE2.js → chunk-IGV4KCCM.js} +2 -2
- package/dist-cli/chunks/{chunk-5JE5PNIV.js → chunk-IICFLREN.js} +1 -1
- package/dist-cli/chunks/chunk-IUL2WUWW.js +32 -0
- package/dist-cli/chunks/{chunk-EHQHK7KN.js → chunk-JJOHJNUQ.js} +2 -2
- package/dist-cli/chunks/{chunk-ESVF72YH.js → chunk-JT435OOM.js} +2 -2
- package/dist-cli/chunks/{chunk-R2BFC3AC.js → chunk-JT4IMNCO.js} +2 -2
- package/dist-cli/chunks/{chunk-S2PJOB2C.js → chunk-JWXAXCC6.js} +2 -2
- package/dist-cli/chunks/{chunk-CY6HBAOB.js → chunk-JXNR2KAB.js} +2 -2
- package/dist-cli/chunks/{chunk-45D2GGIA.js → chunk-LC77IVGY.js} +2 -2
- package/dist-cli/chunks/{chunk-H6MTPXZS.js → chunk-LCPZNPIB.js} +1 -1
- package/dist-cli/chunks/chunk-LETVUC6M.js +11 -0
- package/dist-cli/chunks/chunk-LRVL5MAX.js +4 -0
- package/dist-cli/chunks/{chunk-24CIPQT5.js → chunk-MIK6LMG4.js} +1 -1
- package/dist-cli/chunks/{chunk-JEPQ5YX3.js → chunk-N3CE6AZP.js} +2 -2
- package/dist-cli/chunks/{chunk-AR3CPCW3.js → chunk-OKFSCCFC.js} +1 -1
- package/dist-cli/chunks/{chunk-3Y7NWE22.js → chunk-P4GCLNFM.js} +2 -2
- package/dist-cli/chunks/{chunk-NQMZOJPX.js → chunk-PHIYWV44.js} +2 -2
- package/dist-cli/chunks/{chunk-WNJDE2JT.js → chunk-QQNNY43R.js} +1 -1
- package/dist-cli/chunks/{chunk-FHLEA4S5.js → chunk-QRYTCPNO.js} +2 -2
- package/dist-cli/chunks/{chunk-Q4ROOH3W.js → chunk-SLD2EMLZ.js} +2 -2
- package/dist-cli/chunks/{chunk-ELNSQ352.js → chunk-THFM2CFT.js} +1 -1
- package/dist-cli/chunks/{chunk-EGKGCDG5.js → chunk-TJRKLRNP.js} +1 -1
- package/dist-cli/chunks/{chunk-H4IF54WS.js → chunk-UAYXEP74.js} +1 -1
- package/dist-cli/chunks/{chunk-BQE4E24T.js → chunk-UI2IFVHB.js} +1 -1
- package/dist-cli/chunks/chunk-UVIWE3LD.js +124 -0
- package/dist-cli/chunks/chunk-UX6D4X6B.js +24 -0
- package/dist-cli/chunks/{chunk-RH6FJI5O.js → chunk-X2DJK3TB.js} +2 -2
- package/dist-cli/chunks/chunk-Y4GUWO3X.js +7 -0
- package/dist-cli/chunks/{chunk-DJAYEBF3.js → chunk-YATZ7U4S.js} +1 -1
- package/dist-cli/chunks/{chunk-RASWCAJJ.js → chunk-YIUIFZAE.js} +2 -2
- package/dist-cli/chunks/{chunk-QJTW4QQW.js → chunk-YXBNGSG6.js} +1 -1
- package/dist-cli/chunks/{chunk-2OME2KGY.js → chunk-ZJUFI3R7.js} +1 -1
- package/dist-cli/chunks/{chunk-6NSUY346.js → chunk-ZNABCRWX.js} +2 -2
- package/dist-cli/chunks/{cleanup-JUY2WU24.js → cleanup-F74ISXJC.js} +2 -2
- package/dist-cli/chunks/cli-version-VSDCFXXN.js +4 -0
- package/dist-cli/chunks/{compat-S2TBISY3.js → compat-C3RGYGXL.js} +2 -2
- package/dist-cli/chunks/{config-3PHD4J5N.js → config-CDY2RB7Q.js} +2 -2
- package/dist-cli/chunks/control-J35HAFZA.js +4 -0
- package/dist-cli/chunks/daemon-DLLEODJY.js +4 -0
- package/dist-cli/chunks/{debug-PFAJONVV.js → debug-3P2DUTUQ.js} +3 -3
- package/dist-cli/chunks/{desktop-Z7EOBMNV.js → desktop-XIXW34VW.js} +4 -4
- package/dist-cli/chunks/{detox-KRSP5SLY.js → detox-KAKTJ4P4.js} +2 -2
- package/dist-cli/chunks/{device-ZXJ7GRBO.js → device-4MAWLZMR.js} +2 -2
- package/dist-cli/chunks/{diagnose-JIMLEOEJ.js → diagnose-A3R7HUYA.js} +2 -2
- package/dist-cli/chunks/{disk-cleanup-YY7FFGVA.js → disk-cleanup-5R7JYCO6.js} +2 -2
- package/dist-cli/chunks/drivers-BB3BRKDS.js +4 -0
- package/dist-cli/chunks/{film-LKSJPU2A.js → film-GY5U752Q.js} +3 -3
- package/dist-cli/chunks/flow-ALMSRBVL.js +4 -0
- package/dist-cli/chunks/help-3ZL7MRUX.js +4 -0
- package/dist-cli/chunks/{hidden-runtime-alias-ZN3WZ3ND.js → hidden-runtime-alias-HSGN3GN4.js} +2 -2
- package/dist-cli/chunks/home-paths-BIUN4CBO.js +4 -0
- package/dist-cli/chunks/inspect-RCU7XVAO.js +4 -0
- package/dist-cli/chunks/install-desktop-LYVKLTCU.js +4 -0
- package/dist-cli/chunks/{login-XKLIFTAU.js → login-WKNMS4GG.js} +2 -2
- package/dist-cli/chunks/{logout-DR22RB5H.js → logout-6UFUOESK.js} +2 -2
- package/dist-cli/chunks/{maestro-SLCX6HBV.js → maestro-SJGV7B3W.js} +3 -3
- package/dist-cli/chunks/{maestro-generate-GBFZ5INV.js → maestro-generate-PMF2LLKX.js} +3 -3
- package/dist-cli/chunks/{mode-F4R2KNXX.js → mode-MN7LZCLB.js} +2 -2
- package/dist-cli/chunks/{optional-demo-registry-HM55KXGB.js → optional-demo-registry-HFA27YSP.js} +2 -2
- package/dist-cli/chunks/{perf-VBS5GEPG.js → perf-XGANSJT3.js} +2 -2
- package/dist-cli/chunks/{permissions-F46PQIUE.js → permissions-25UWEJKW.js} +2 -2
- package/dist-cli/chunks/privacy-SIDMP5EF.js +4 -0
- package/dist-cli/chunks/{record-NLZ6DFAA.js → record-MA3AI752.js} +3 -3
- package/dist-cli/chunks/{report-issue-XIE5BVR4.js → report-issue-4DTESWE2.js} +2 -2
- package/dist-cli/chunks/reset-GPHG5XN3.js +4 -0
- package/dist-cli/chunks/runtime-VOEIOODA.js +4 -0
- package/dist-cli/chunks/{screenshot-command-SD4JPNKW.js → screenshot-command-JUXMWXS5.js} +3 -3
- package/dist-cli/chunks/{screenshot-layers-X65RC3GT.js → screenshot-layers-DJF2E4PE.js} +2 -2
- package/dist-cli/chunks/{screenshots-capture-BBXN7FEZ.js → screenshots-capture-UGZU5GOW.js} +2 -2
- package/dist-cli/chunks/{serve-M6ZKMSAG.js → serve-H7GNKJSM.js} +2 -2
- package/dist-cli/chunks/setup-G2WYLPM6.js +4 -0
- package/dist-cli/chunks/{skills-KDWGQBOP.js → skills-4JGPOSFE.js} +2 -2
- package/dist-cli/chunks/{state-NWABXG2P.js → state-DEAQFKVP.js} +2 -2
- package/dist-cli/chunks/{storage-QQE3G65Q.js → storage-Y6F5NTGH.js} +2 -2
- package/dist-cli/chunks/store-3EQT7VU6.js +4 -0
- package/dist-cli/chunks/telemetry-FANCQHKG.js +4 -0
- package/dist-cli/chunks/{timeline-2VZ45MMB.js → timeline-HOHYYDOC.js} +2 -2
- package/dist-cli/chunks/{upgrade-T7PDR6T5.js → upgrade-QF5YHLSG.js} +2 -2
- package/dist-cli/chunks/upload-QKJHFAX7.js +4 -0
- package/dist-cli/chunks/{version-BX6QX5XA.js → version-PDCKYJLB.js} +2 -2
- package/dist-cli/chunks/{web-4J6JRZN2.js → web-C5EUAFFW.js} +2 -2
- package/dist-cli/chunks/welcome-3CQ2GE4F.js +5 -0
- package/dist-cli/chunks/{what-happened-CHQKFNCM.js → what-happened-L56ZFIMJ.js} +2 -2
- package/dist-lib/agent-daemon-client.cjs +2 -2
- package/dist-lib/agent-events.cjs +1 -1
- package/dist-lib/agent-identity.cjs +1 -1
- package/dist-lib/agent-sessions.cjs +1 -1
- package/dist-lib/attached-projects.cjs +1 -1
- package/dist-lib/auth/shared-session.cjs +1 -1
- package/dist-lib/backend-origin.cjs +1 -1
- package/dist-lib/beta.cjs +1 -1
- package/dist-lib/beta.mjs +1 -1
- package/dist-lib/bridge-constants.cjs +1 -1
- package/dist-lib/bridge-contract.cjs +1 -1
- package/dist-lib/cli-constants.cjs +1 -1
- package/dist-lib/config.cjs +1 -1
- package/dist-lib/detox/index.cjs +1 -1
- package/dist-lib/dev-bundle-resolution.cjs +1 -1
- package/dist-lib/home-paths.cjs +21 -1
- package/dist-lib/host/bridge-host.cjs +1 -1
- package/dist-lib/host/fetch-proxy-handler.cjs +1 -1
- package/dist-lib/host/fetch-proxy-overrides.cjs +1 -1
- package/dist-lib/host/fetch-proxy-overrides.mjs +1 -1
- package/dist-lib/host/replacement-module-handler.cjs +1 -1
- package/dist-lib/host/websocket-proxy.cjs +1 -1
- package/dist-lib/index.cjs +2 -2
- package/dist-lib/jump-to-source-babel.cjs +1 -1
- package/dist-lib/menu.cjs +1 -1
- package/dist-lib/menu.mjs +1 -1
- package/dist-lib/metro-production-bundle.cjs +1 -1
- package/dist-lib/metro-production-bundle.mjs +1 -1
- package/dist-lib/metro.cjs +2 -2
- package/dist-lib/profiles.cjs +1 -1
- package/dist-lib/public-brand.cjs +1 -1
- package/dist-lib/react-native-host-modules.cjs +1 -1
- package/dist-lib/react-native-host-modules.mjs +1 -1
- package/dist-lib/render-mode.cjs +1 -1
- package/dist-lib/scripts/dev-server-scanner.cjs +1 -1
- package/dist-lib/sdk.cjs +1 -1
- package/dist-lib/sdk.mjs +1 -1
- package/dist-lib/skills.cjs +87 -22
- package/dist-lib/vite.cjs +2 -2
- package/package.json +1 -1
- package/skills/contrast/SKILL.md +3 -3
- package/skills/rnx-setup/SKILL.md +17 -5
- package/src/agent-daemon-client.ts +1 -1
- package/src/home-paths.ts +22 -0
- package/src/metro-plugin.ts +1 -1
- package/src/runtime-assets.ts +1 -1
- package/dist-cli/chunks/chunk-2JZXOHH6.js +0 -4
- package/dist-cli/chunks/chunk-2WJABJ6C.js +0 -15
- package/dist-cli/chunks/chunk-5OVXQKUP.js +0 -25
- package/dist-cli/chunks/chunk-DFTG53TX.js +0 -11
- package/dist-cli/chunks/chunk-HF2FZ2WN.js +0 -7
- package/dist-cli/chunks/chunk-S63ENXGH.js +0 -6
- package/dist-cli/chunks/chunk-UHP33XGC.js +0 -124
- package/dist-cli/chunks/cli-version-6SQSIFNQ.js +0 -4
- package/dist-cli/chunks/control-GLBCTKAA.js +0 -4
- package/dist-cli/chunks/daemon-H4OVIEMH.js +0 -4
- package/dist-cli/chunks/drivers-63LY2NCK.js +0 -4
- package/dist-cli/chunks/flow-JHKPF7BN.js +0 -4
- package/dist-cli/chunks/help-Q6OY6VVA.js +0 -4
- package/dist-cli/chunks/home-paths-UOATIRKF.js +0 -4
- package/dist-cli/chunks/inspect-DW3V2FD4.js +0 -4
- package/dist-cli/chunks/install-desktop-GWY5H22W.js +0 -4
- package/dist-cli/chunks/privacy-34FNXPJP.js +0 -4
- package/dist-cli/chunks/reset-BAGCFYTS.js +0 -4
- package/dist-cli/chunks/runtime-JTYB4CM7.js +0 -4
- package/dist-cli/chunks/setup-KTWKZOJB.js +0 -30
- package/dist-cli/chunks/store-6XW4YZM6.js +0 -4
- package/dist-cli/chunks/telemetry-MVSV7JHI.js +0 -4
- package/dist-cli/chunks/upload-RF2MNO2X.js +0 -4
- package/dist-cli/chunks/welcome-3MJHGERV.js +0 -5
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
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.
|
|
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.
|
|
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/metro.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
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
|
|
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;
|
package/dist-lib/profiles.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
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.
|
|
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.
|
|
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/render-mode.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
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.
|
|
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.
|
|
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.
|
|
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);
|
package/dist-lib/skills.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
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/
|
|
18203
|
-
(0, import_path5.resolve)(process.env.HOME || "", "Applications/
|
|
18204
|
-
...root ? [(0, import_path5.resolve)(root, "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("
|
|
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/
|
|
18240
|
-
(0, import_path5.resolve)(process.env.HOME || "", ".local/bin/
|
|
18241
|
-
"/opt/
|
|
18242
|
-
"/opt/
|
|
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("
|
|
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
|
-
`
|
|
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 :
|
|
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.
|
|
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
|
|
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
package/skills/contrast/SKILL.md
CHANGED
|
@@ -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` |
|
|
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
|
|
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
|
|
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
|
|
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
|
|
10
|
-
rnx skill assumes exists.
|
|
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
|
|
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
|
|
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
|
|
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
|
package/src/metro-plugin.ts
CHANGED
|
@@ -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 `
|
|
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
|
//
|
package/src/runtime-assets.ts
CHANGED
|
@@ -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
|
|
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};
|