rnxsim 0.1.560 → 0.1.561
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 +20 -20
- package/dist-lib/agent-daemon-client.cjs +1 -1
- 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-input.cjs +1 -1
- package/dist-lib/bridge-contract-input.mjs +1 -1
- package/dist-lib/bridge-contract.cjs +1 -1
- package/dist-lib/bridge-contract.mjs +1 -1
- package/dist-lib/capture-contract.cjs +1 -1
- package/dist-lib/capture-contract.mjs +1 -1
- package/dist-lib/cli-constants.cjs +1 -1
- package/dist-lib/cloud-contract.cjs +1 -1
- package/dist-lib/cloud-contract.mjs +1 -1
- package/dist-lib/cloud.cjs +1 -1
- package/dist-lib/cloud.mjs +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 +1 -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 +1 -1
- package/dist-lib/jump-to-source-babel.cjs +1 -1
- package/dist-lib/jump-to-source-native.cjs +1 -1
- package/dist-lib/menu.cjs +1 -1
- package/dist-lib/menu.mjs +1 -1
- package/dist-lib/metro-fingerprint-registry.cjs +1 -1
- package/dist-lib/metro-fingerprint-registry.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 +1 -1
- 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 +2 -2
- package/dist-lib/swift-submit.cjs +1 -1
- package/dist-lib/swift-submit.mjs +1 -1
- package/dist-lib/swift.cjs +1 -1
- package/dist-lib/vite.cjs +1 -1
- package/package.json +1 -1
- package/skills/contrast/SKILL.md +9 -9
- package/skills/rnx-debug/SKILL.md +5 -5
- package/skills/rnx-perf/SKILL.md +5 -5
- package/skills/rnx-setup/SKILL.md +11 -11
- package/skills/rnx-test/SKILL.md +11 -11
- package/skills/rnx-visual/SKILL.md +6 -6
package/README.md
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Peach
|
|
2
2
|
|
|
3
3
|
The source owner for the standalone `rnx` executable and the public `rnxsim`
|
|
4
4
|
integration library used to drive a browser-native React Native simulator.
|
|
@@ -202,7 +202,7 @@ bridge always addresses the **shell worker**, never an undifferentiated sim.
|
|
|
202
202
|
|
|
203
203
|
| component | role | key files |
|
|
204
204
|
| --- | --- | --- |
|
|
205
|
-
|
|
|
205
|
+
| Peach CLI (bin + dispatcher) | Short-lived terminal entry point. Parses argv, owns the private-by-default one-time choice, lazy-imports one command per run, and routes direct open/runtime/inspection flows. | `cli/bin.ts`, `cli/main.ts`, `cli/privacy.ts`, `cli/parse-args.ts`, `cli/help.ts`, `cli/commands/setup.ts`, `cli/commands/control.ts` |
|
|
206
206
|
| WsBridge client | Client side of the CLI→daemon link. Resolves the daemon port from the lockfile, opens a WS to `:7668`, sends JSON commands and awaits `{id,result}`/`{id,error}`. Used by every interactive command. | `cli/ws-bridge.ts`, `src/bridge-constants.ts`, `cli/current-sim.ts` |
|
|
207
207
|
| inspect / SDK command surface | Runtime inspection + interaction verbs (describe, find, do tap, get errors, wait, layout, settle). Re-exported as `rnxsim/sdk` so programmatic callers drive a sim the same way the CLI does. | `cli/commands/inspect/core.ts`, `cli/commands/inspect/actions.ts`, `cli/commands/inspect.ts`, `src/sdk.ts` |
|
|
208
208
|
| bridge-contract input parsers | Turn untrusted JSON into typed bridge-contract arguments, so a transport in front of a sim validates request bodies once instead of writing a second reader. | `src/bridge-contract-input.ts`, `src/bridge-contract.ts` |
|
|
@@ -211,11 +211,11 @@ bridge always addresses the **shell worker**, never an undifferentiated sim.
|
|
|
211
211
|
| SootSimBridgeHost (serve/daemon) | The bridge process (`rnx serve`, or autostarted as the daemon via launchd/systemd). HTTP+WS hub on `:7668`: relays commands between CLI clients and registered sims; also serves runtime HTTP, `/__server-scan`, and fetch/WS proxies. | `src/host/bridge-host.ts`, `cli/commands/serve.ts`, `cli/commands/daemon.ts`, `src/home-paths.ts` |
|
|
212
212
|
| AgentHost + sessions | Agent-routing extension of the host: owns the single FIFO reader per agent session and fans `agent:event`/`session-status` pushes to every WS subscriber. Backed by agent-sessions + attached-projects stores. | `src/host/agent-host.ts`, `src/agent-sessions.ts`, `src/attached-projects.ts`, `src/agent-daemon-client.ts` |
|
|
213
213
|
| host proxies + dev-server scan | Host-side helpers so a cross-origin tenant worker can reach local dev servers and same-origin APIs: `/__server-scan` discovers running metro/expo/vxrn/one servers; fetch + websocket proxies relay guest-app network through the daemon. | `src/host/fetch-proxy-handler.ts`, `src/host/websocket-proxy.ts`, `scripts/dev-server-scanner.ts`, `src/dev-bundle-resolution.ts` |
|
|
214
|
-
| runtime delivery +
|
|
214
|
+
| runtime delivery + Peach home | Versioned engine runtime management. The shared machinery owns manifest fetch, sha256 verification, channels, and auto-update. Peach binds it to `https://contrast.dev` and `~/.rnx/runtimes/<version>`. A repo can select `runtimeVersion` without changing the machine default. | `src/runtime-delivery.ts`, `packages/contrast-runtime-delivery/`, `src/home-paths.ts`, `src/runtime-assets.ts` |
|
|
215
215
|
| standalone CLI delivery | Cached stable-version checks, bounded interactive notices, and verified atomic executable replacement. | `cli/cli-update.ts`, `cli/commands/upgrade.ts`, `cli/commands/version.ts`, `src/cli-version.ts` |
|
|
216
216
|
| `rnxsim/vite` + `rnxsim/metro` (runtime serving) | Published bundler plugins. Both serve the installed engine runtime at `/__soot/` from `~/.rnx/runtimes/<version>` so an app's own dev server can host the sim shell; the Vite plugin can opt into a named Electron window. | `src/vite-plugin-one.ts`, `src/metro-plugin.ts`, `src/runtime-assets.ts` |
|
|
217
217
|
| `sootsim()` vite resolver plugin (internal) | The large RN-resolution / native-stub vite plugin: aliases `react-native` to the engine shim, native packages to `@sootsim/compat` stubs, applies worklets/babel transforms, and instantiates `SootSimBridgeHost` in its dev server. Distinct from the published `rnxsim/vite` export. | `src/vite-plugin.ts`, `src/worklets-babel.ts`, `packages/compat/src/stub-manifest.ts` |
|
|
218
|
-
| skills registry |
|
|
218
|
+
| skills registry | Peach agent skills (`rnx-setup`, `rnx-debug`, `rnx-test`, `rnx-visual`, and the generated `contrast` index) installable with `rnx skill`. | `skills/*.md`, `src/skills/registry.ts`, `src/skills/types.ts` |
|
|
219
219
|
|
|
220
220
|
## Getting started
|
|
221
221
|
|
|
@@ -245,7 +245,7 @@ The `rnxsim` npm package contains bundler plugins and library exports, not a CLI
|
|
|
245
245
|
binary. Start your Metro, Expo, or One dev server the way you already do, then
|
|
246
246
|
open it from the CLI. There is no iOS native build in the inner loop; Metro alone is
|
|
247
247
|
enough. The manifest bundle path and query remain authoritative. When both the
|
|
248
|
-
discovery request and manifest target are loopback addresses,
|
|
248
|
+
discovery request and manifest target are loopback addresses, Peach keeps the
|
|
249
249
|
loopback host that answered discovery so an IPv6-only listener is not reopened
|
|
250
250
|
through an unreachable IPv4 address. `rnx open` starts a local bridge when no
|
|
251
251
|
daemon is reachable. The background service is strongly recommended for local
|
|
@@ -253,7 +253,7 @@ agent work because inspect, interaction, and test commands reuse one ready bridg
|
|
|
253
253
|
and runtime. Enable it at any time with `rnx daemon install`; it is never required
|
|
254
254
|
in CI. The packaged Desktop app is optional and available through first-run
|
|
255
255
|
onboarding or `rnx desktop install`. A downloaded app starts its own bundled
|
|
256
|
-
daemon on first launch, then offers **Install the
|
|
256
|
+
daemon on first launch, then offers **Install the Peach command** over the running
|
|
257
257
|
simulator. That action installs `~/.local/bin/rnx`, updates shell startup, and
|
|
258
258
|
hands the daemon to launchd or systemd without reloading the window. Windows
|
|
259
259
|
keeps the desktop-owned daemon because it has no daemon service yet. Native Electron windows created by `rnx open` belong to that CLI
|
|
@@ -264,7 +264,7 @@ window for a selected device (same device list as the `Window >` menu).
|
|
|
264
264
|
|
|
265
265
|
### Privacy
|
|
266
266
|
|
|
267
|
-
|
|
267
|
+
Peach sends no analytics, crash report, command event, app data, project data, or
|
|
268
268
|
identity by default. An unsigned-in interactive run may request the runtime it
|
|
269
269
|
is about to execute and the stable standalone CLI version document. The latter
|
|
270
270
|
runs after the command in a detached process at most once every 20 hours and can
|
|
@@ -275,7 +275,7 @@ consuming the later human choice. Legacy browser and Electron telemetry senders
|
|
|
275
275
|
are removed rather than being enabled by this consent.
|
|
276
276
|
|
|
277
277
|
Opt-in diagnostics are limited to package name/version/unsupported API or error
|
|
278
|
-
class.
|
|
278
|
+
class. Peach never sends source, file paths, project names, app content, commands,
|
|
279
279
|
identity, screenshots, or recordings as diagnostics. Cloud commands such as
|
|
280
280
|
login, upload, billing, issue reporting, generated flows, and screenshot decks
|
|
281
281
|
contact their documented service only when explicitly invoked. The complete
|
|
@@ -335,7 +335,7 @@ For One's `nativeTransformModules`, export
|
|
|
335
335
|
|
|
336
336
|
## CLI
|
|
337
337
|
|
|
338
|
-
The CLI is the primary debugging surface for
|
|
338
|
+
The CLI is the primary debugging surface for Peach — use it first for runtime
|
|
339
339
|
inspection, interaction, animation debugging, shell tracing, screenshots, and
|
|
340
340
|
flow capture, not just as a test runner.
|
|
341
341
|
|
|
@@ -381,7 +381,7 @@ rnx do tap email --then type user@example.com --then tap submit
|
|
|
381
381
|
|
|
382
382
|
## Bundler plugins (`rnxsim/vite` and `rnxsim/metro`)
|
|
383
383
|
|
|
384
|
-
The Vite plugin serves the installed
|
|
384
|
+
The Vite plugin serves the installed Peach runtime from your existing dev server.
|
|
385
385
|
|
|
386
386
|
```ts
|
|
387
387
|
// vite.config.ts
|
|
@@ -402,10 +402,10 @@ const config = getDefaultConfig(__dirname)
|
|
|
402
402
|
module.exports = withRNX(config)
|
|
403
403
|
```
|
|
404
404
|
|
|
405
|
-
|
|
405
|
+
Peach works directly with regular, unannotated Metro production JavaScript bundles
|
|
406
406
|
out of the box. It identifies modules by matching package graph fingerprints
|
|
407
407
|
against a separately updated, integrity-checked registry. Hermes bytecode is not
|
|
408
|
-
a supported input; pass
|
|
408
|
+
a supported input; pass Peach the JavaScript bundle produced before Hermes
|
|
409
409
|
compilation.
|
|
410
410
|
|
|
411
411
|
If an app has unusual dependencies or fingerprint inference fails, you can
|
|
@@ -417,7 +417,7 @@ options and enables two integrations:
|
|
|
417
417
|
bundle. Resolution, transforms, minification, and source maps stay the app's
|
|
418
418
|
own, so the annotated bundle is the exact bundle you ship: the footer assigns
|
|
419
419
|
one unused global on a device, and Hermes drops it during bytecode compilation.
|
|
420
|
-
2. **In-browser dev shell:** serves the
|
|
420
|
+
2. **In-browser dev shell:** serves the Peach simulator shell at `/__soot/` on
|
|
421
421
|
the Metro dev server.
|
|
422
422
|
|
|
423
423
|
The URL helpers request ordinary Metro graphs: `dev=false&minify=true` for
|
|
@@ -439,8 +439,8 @@ const developmentUrl = toRNXDevelopmentBundleUrl(
|
|
|
439
439
|
|
|
440
440
|
## Coming from Detox
|
|
441
441
|
|
|
442
|
-
|
|
443
|
-
(`import { by, element, expect, device } from 'detox'`) run against
|
|
442
|
+
Peach ships a drop-in Detox driver. Existing Detox test files
|
|
443
|
+
(`import { by, element, expect, device } from 'detox'`) run against Peach with
|
|
444
444
|
no code changes — just add one line to your jest config:
|
|
445
445
|
|
|
446
446
|
```js
|
|
@@ -459,7 +459,7 @@ See `../../docs/migrating-from-detox.md` for details.
|
|
|
459
459
|
|
|
460
460
|
## Coming from Maestro
|
|
461
461
|
|
|
462
|
-
Maestro is
|
|
462
|
+
Maestro is Peach's single YAML test surface. Point it at your existing
|
|
463
463
|
`.maestro/` directory, generate a test, or author one from live actions:
|
|
464
464
|
|
|
465
465
|
```sh
|
|
@@ -489,7 +489,7 @@ rnx screenshot --with-frame --output /tmp/rnx-framed.png
|
|
|
489
489
|
rnx record --duration 5 --output /tmp/rnx-anim.mp4
|
|
490
490
|
```
|
|
491
491
|
|
|
492
|
-
`rnx screenshot --with-frame` composes the real
|
|
492
|
+
`rnx screenshot --with-frame` composes the real Peach shell device chrome
|
|
493
493
|
around the raw screen bitmap (reusing the shell bezel/button geometry, excluding
|
|
494
494
|
the Electron top bar, rail gutter, and other window chrome). Flows can request
|
|
495
495
|
the framed export inline without changing Maestro syntax:
|
|
@@ -553,7 +553,7 @@ frame for quick art-direction passes.
|
|
|
553
553
|
|
|
554
554
|
## Skills registry
|
|
555
555
|
|
|
556
|
-
`rnx skill install` installs
|
|
556
|
+
`rnx skill install` installs Peach agent skills in the standard
|
|
557
557
|
`<skill-name>/SKILL.md` layout used by Codex and Claude Code. The bundled
|
|
558
558
|
skills cover setup, debugging/perf/accessibility, testing, visual review, and
|
|
559
559
|
the generated `contrast` command index. The published CLI registry and generated
|
|
@@ -568,10 +568,10 @@ When command docs or examples drift, update `packages/rnx-skills/` and run:
|
|
|
568
568
|
bun run generate:sootsim-docs
|
|
569
569
|
```
|
|
570
570
|
|
|
571
|
-
## Runtime delivery (the
|
|
571
|
+
## Runtime delivery (the Peach home and CDN)
|
|
572
572
|
|
|
573
573
|
The engine never ships inside this package. `runtime-delivery.ts` names
|
|
574
|
-
|
|
574
|
+
Peach's CDN origin (default `https://contrast.dev`, overridable in
|
|
575
575
|
`config.json`), its `SOOTSIM_*` env overrides, and its hosted paths, then hands
|
|
576
576
|
them to the shared delivery machinery in `@contrast/runtime-delivery` — an
|
|
577
577
|
internal workspace package the CLI bundles, so a published install has it
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.561 | (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.561 | (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.561 | (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.561 | (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.561 | (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.561 | (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.561 | (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/beta.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.561 | (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/beta.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.561 | (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.561 | (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.561 | (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.561 | (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.561 | (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.561 | (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/cloud.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.561 | (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/cloud.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.561 | (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/config.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.561 | (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/detox/index.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.561 | (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.561 | (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/home-paths.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.561 | (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.561 | (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.561 | (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.561 | (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.561 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
|
|
3
3
|
// src/host/fetch-proxy-overrides.ts
|
|
4
4
|
var FETCH_PROXY_BROWSER_USER_AGENT = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.561 | (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.561 | (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/index.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.561 | (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.561 | (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.561 | (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/menu.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.561 | (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.561 | (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.561 | (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.561 | (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/profiles.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.561 | (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.561 | (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.561 | (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.561 | (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.561 | (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.561 | (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.561 | (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.561 | (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;
|
|
@@ -5008,7 +5008,7 @@ var init_supported_native_packages = __esm({
|
|
|
5008
5008
|
"expo-store-review",
|
|
5009
5009
|
// visual-proof+coverage
|
|
5010
5010
|
"expo-symbols",
|
|
5011
|
-
//
|
|
5011
|
+
// coverage
|
|
5012
5012
|
"expo-system-ui",
|
|
5013
5013
|
// seam+coverage
|
|
5014
5014
|
"expo-task-manager",
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.561 | (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/swift.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.561 | (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/vite.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.561 | (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
package/skills/contrast/SKILL.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: contrast
|
|
3
3
|
description: >-
|
|
4
|
-
index of all Contrast and
|
|
4
|
+
index of all Contrast and Peach agent skills and CLI commands.
|
|
5
5
|
auto-generated from the CLI info registry — do not edit by hand.
|
|
6
6
|
---
|
|
7
7
|
|
|
@@ -12,7 +12,7 @@ overview of all available skills and CLI commands in this repo.
|
|
|
12
12
|
> this file is auto-generated by `bun scripts/generate-contrast-skill.ts`.
|
|
13
13
|
> to update, edit the source registries and re-run the generator.
|
|
14
14
|
|
|
15
|
-
##
|
|
15
|
+
## Peach CLI commands
|
|
16
16
|
|
|
17
17
|
the `rnx` CLI is the operational surface for booting shells, driving
|
|
18
18
|
automation, inspecting the render tree, and managing sims.
|
|
@@ -87,17 +87,17 @@ run `rnx --help` to see the full list under each group.
|
|
|
87
87
|
- `-t, --theme <scheme>` — override light, dark, or auto color scheme
|
|
88
88
|
- `--headless` — run browser automation without a visible window where supported
|
|
89
89
|
|
|
90
|
-
## bundled
|
|
90
|
+
## bundled Peach agent skills
|
|
91
91
|
|
|
92
|
-
skills for working with the
|
|
92
|
+
skills for working with the Peach native preview engine:
|
|
93
93
|
|
|
94
94
|
| skill | description |
|
|
95
95
|
| --- | --- |
|
|
96
|
-
| `/rnx-debug` | Debug rendering, animation, gesture, performance, and accessibility issues in a React Native app running under
|
|
97
|
-
| `/rnx-perf` | Optimize
|
|
98
|
-
| `/rnx-setup` | Get
|
|
99
|
-
| `/rnx-test` | Run automated tests against your React Native app under
|
|
100
|
-
| `/rnx-visual` | Pixel-level rendering comparison between
|
|
96
|
+
| `/rnx-debug` | Debug rendering, animation, gesture, performance, and accessibility issues in a React Native app running under Peach. 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. |
|
|
97
|
+
| `/rnx-perf` | Optimize Peach 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. |
|
|
98
|
+
| `/rnx-setup` | Get Peach connected to your React Native app with no project setup |
|
|
99
|
+
| `/rnx-test` | Run automated tests against your React Native app under Peach with Maestro YAML or Detox/Jest |
|
|
100
|
+
| `/rnx-visual` | Pixel-level rendering comparison between Peach and native iOS — fonts, gradients, shadows, image fidelity |
|
|
101
101
|
|
|
102
102
|
## automatic settling
|
|
103
103
|
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: rnx-debug
|
|
3
|
-
description: Debug rendering, animation, gesture, performance, and accessibility issues in a React Native app running under
|
|
3
|
+
description: Debug rendering, animation, gesture, performance, and accessibility issues in a React Native app running under Peach. 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.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
#
|
|
6
|
+
# Peach debug
|
|
7
7
|
|
|
8
|
-
the foundational skill for "something is wrong with my app in
|
|
8
|
+
the foundational skill for "something is wrong with my app in Peach".
|
|
9
9
|
covers debugging, performance, and accessibility — three branches that
|
|
10
10
|
share the same CLI primitives, the same auto-settling contract, and the
|
|
11
11
|
same diff/snapshot workflow. start here for any rendering, interaction,
|
|
@@ -49,7 +49,7 @@ regression test. a pile of ad-hoc logs helps no one and gets deleted.
|
|
|
49
49
|
|
|
50
50
|
## anti-patterns (apply to every branch)
|
|
51
51
|
|
|
52
|
-
- **`a1`/`a2`/`b0` style ids mean
|
|
52
|
+
- **`a1`/`a2`/`b0` style ids mean Peach sims, never browser tabs.** when a user
|
|
53
53
|
says "look at a3", that's the `rnx list` sim id. do not open chrome
|
|
54
54
|
MCP unless the user explicitly says "use chrome" — the canvas has no
|
|
55
55
|
DOM to inspect anyway.
|
|
@@ -84,7 +84,7 @@ regression test. a pile of ad-hoc logs helps no one and gets deleted.
|
|
|
84
84
|
- **after an unexplained restart, re-establish which sim you are on.** a sim
|
|
85
85
|
that reconnected, or a dev stack that came back on a port another process now
|
|
86
86
|
holds, is a fresh instrument; a port answering 200 says something is
|
|
87
|
-
listening, not that it is yours. every
|
|
87
|
+
listening, not that it is yours. every Peach command prints its own `→ <sim>`
|
|
88
88
|
line, so reading that line is the check.
|
|
89
89
|
|
|
90
90
|
## the timeline ("what happened")
|
package/skills/rnx-perf/SKILL.md
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: rnx-perf
|
|
3
|
-
description: Optimize
|
|
3
|
+
description: Optimize Peach 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.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
#
|
|
6
|
+
# Peach performance
|
|
7
7
|
|
|
8
|
-
optimize performance in
|
|
8
|
+
optimize performance in Peach: the shell frame pipeline, the compositor
|
|
9
9
|
tiers, and the guest app. this skill exists because every real perf win in
|
|
10
10
|
this engine followed the same loop — measure on the right thread, read the
|
|
11
11
|
counters that prove machinery engaged, fix the one thing the counters
|
|
@@ -384,7 +384,7 @@ tier fire on feeds came entirely from rejection counters.
|
|
|
384
384
|
- `Animated.Value` on `width`/`height` forces layout per frame — use
|
|
385
385
|
`transform` (scale/translate).
|
|
386
386
|
- per-frame React work from reanimated-style code is an engine conformance
|
|
387
|
-
bug (valid worklet apps must not commit per frame) — fix
|
|
387
|
+
bug (valid worklet apps must not commit per frame) — fix Peach core,
|
|
388
388
|
never add a divergent fast-path (upstream alignment overrides perf; see
|
|
389
389
|
the `shouldFreezeOffscreenStackContent` incident).
|
|
390
390
|
- render-storm loops (poll → remount) show up as commit-rate repaints and
|
|
@@ -396,4 +396,4 @@ done means: a named hot path + the counter or split that indicts it + the
|
|
|
396
396
|
same capture re-run showing the number moved + no new errors (`get errors`)
|
|
397
397
|
+ nothing torn down left running (close sims you opened, kill load loops).
|
|
398
398
|
for engine changes, run the affected integration tests exposed by the installed
|
|
399
|
-
|
|
399
|
+
Peach version and capture stable screenshots of surfaces you touched.
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: rnx-setup
|
|
3
|
-
description: Get
|
|
3
|
+
description: Get Peach connected to your React Native app with no project setup
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
#
|
|
6
|
+
# Peach setup
|
|
7
7
|
|
|
8
|
-
you want to drive a React Native app with
|
|
8
|
+
you want to drive a React Native app with Peach from the CLI. this skill
|
|
9
9
|
takes you from a running development server to a connected, pinned sim that
|
|
10
|
-
every other
|
|
10
|
+
every other Peach skill assumes exists. Peach requires no project setup or per-app
|
|
11
11
|
install. if
|
|
12
12
|
`rnx describe` already
|
|
13
13
|
returns a tree, you're past this skill — load `/rnx-debug` for
|
|
@@ -21,7 +21,7 @@ debugging or `/rnx-test` for writing tests.
|
|
|
21
21
|
- **don't switch sims mid-investigation.** pin once with `rnx use
|
|
22
22
|
<id>` and keep it pinned. an unpinned command refuses to choose when more
|
|
23
23
|
than one driveable sim is live.
|
|
24
|
-
- **an empty `rnx list` is not "broken
|
|
24
|
+
- **an empty `rnx list` is not "broken Peach".** it usually means the
|
|
25
25
|
daemon is down, the dev server port is wrong, or the runtime is missing.
|
|
26
26
|
walk the recovery checklist before reinstalling.
|
|
27
27
|
- **keep one sim for your whole session.** the first `rnx open <port>`
|
|
@@ -53,7 +53,7 @@ debugging or `/rnx-test` for writing tests.
|
|
|
53
53
|
- **never retry-loop `rnx open` against a wedged or slow stack.** a
|
|
54
54
|
connect timeout means diagnose the stack. do not retry. if the first launch
|
|
55
55
|
never connects, each retry can create another browser tree before there is a
|
|
56
|
-
saved sim to reuse. verify the development server and
|
|
56
|
+
saved sim to reuse. verify the development server and Peach runtime, then
|
|
57
57
|
retry once after fixing the cause.
|
|
58
58
|
|
|
59
59
|
## first move
|
|
@@ -69,7 +69,7 @@ rnx describe # smoke test — should print a render tree
|
|
|
69
69
|
```
|
|
70
70
|
|
|
71
71
|
the background service keeps the local bridge and runtime ready between
|
|
72
|
-
commands. without it,
|
|
72
|
+
commands. without it, Peach still works by starting an on-demand bridge, but
|
|
73
73
|
inspect, interaction, and test commands pay repeated startup cost. if the user
|
|
74
74
|
declined it during onboarding, `rnx daemon install` is the direct way to enable
|
|
75
75
|
it. CI does not need or install the service.
|
|
@@ -100,8 +100,8 @@ rnx open https://my-app.local # load a hosted bundle
|
|
|
100
100
|
## compatibility feedback requires approval
|
|
101
101
|
|
|
102
102
|
run `rnx compat --json` from the app project root during setup. if the scan
|
|
103
|
-
identifies a plausible missing
|
|
104
|
-
evidence that behavior is missing or broken specifically in
|
|
103
|
+
identifies a plausible missing Peach seam, or the running app gives concrete
|
|
104
|
+
evidence that behavior is missing or broken specifically in Peach, summarize
|
|
105
105
|
the package, expected behavior, actual behavior, and runtime evidence for the
|
|
106
106
|
user. then offer to send that finding with `rnx report-issue`.
|
|
107
107
|
|
|
@@ -133,7 +133,7 @@ if the daemon is not installed: run `rnx daemon install`. if the registered
|
|
|
133
133
|
daemon is down, run `rnx daemon restart`, or `rnx serve` in another shell for
|
|
134
134
|
a foreground bridge. if no runtime is installed, `rnx open` installs it
|
|
135
135
|
before launching. if open errors with "port unreachable": confirm your dev
|
|
136
|
-
server is actually serving — the bundler has to be up before
|
|
136
|
+
server is actually serving — the bundler has to be up before Peach can
|
|
137
137
|
attach.
|
|
138
138
|
|
|
139
139
|
**two sims appear unexpectedly.** an earlier `rnx claim` didn't
|
|
@@ -151,7 +151,7 @@ Run `rnx runtime install`, then retry `rnx open <port>`.
|
|
|
151
151
|
do not retry in a loop. verify the development server first: `__soot/` must
|
|
152
152
|
respond and the engine watchers must be running. inspect the driver diagnostic
|
|
153
153
|
path printed by the failed command. restart the broken development stack at its
|
|
154
|
-
supervisor, then retry once.
|
|
154
|
+
supervisor, then retry once. Peach owns the isolated browser profile and its
|
|
155
155
|
process tree; do not open the shell URL through an operating-system browser.
|
|
156
156
|
|
|
157
157
|
**bridge disconnects mid-sim.** the WebSocket dropped (laptop slept,
|
package/skills/rnx-test/SKILL.md
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: rnx-test
|
|
3
|
-
description: Run automated tests against your React Native app under
|
|
3
|
+
description: Run automated tests against your React Native app under Peach with Maestro YAML or Detox/Jest
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
#
|
|
6
|
+
# Peach tests
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
Peach has two test runners. Maestro owns every YAML test, whether it was
|
|
9
9
|
hand-authored, generated from a goal, or recorded from live CLI actions.
|
|
10
|
-
Detox runs existing imperative Jest suites through the
|
|
10
|
+
Detox runs existing imperative Jest suites through the Peach driver.
|
|
11
11
|
|
|
12
12
|
> needs a connected, pinned sim. if `rnx describe` errors, load
|
|
13
13
|
> `/rnx-setup` first.
|
|
@@ -165,7 +165,7 @@ rnx maestro test .maestro/login.yaml
|
|
|
165
165
|
```
|
|
166
166
|
|
|
167
167
|
no test rewrites, no detox config, no simulator. the runtime auto-launches
|
|
168
|
-
|
|
168
|
+
a Peach shell if one isn't running.
|
|
169
169
|
|
|
170
170
|
```sh
|
|
171
171
|
rnx maestro # auto-discover .maestro/ or maestro/
|
|
@@ -190,10 +190,10 @@ interpolation.
|
|
|
190
190
|
|
|
191
191
|
### partial
|
|
192
192
|
|
|
193
|
-
- `clearKeychain` — no keychain in
|
|
193
|
+
- `clearKeychain` — no keychain in Peach; logs a warning and continues.
|
|
194
194
|
if a test depends on keychain state being reset, add an explicit
|
|
195
195
|
in-app "sign out" step instead.
|
|
196
|
-
- `when.platform` —
|
|
196
|
+
- `when.platform` — Peach emulates iOS; android branches are skipped.
|
|
197
197
|
- `openLink`: app routing works; there is no OS-level browser fallback.
|
|
198
198
|
|
|
199
199
|
`stopApp` keeps the guest runtime stopped. The next `launchApp` starts a fresh
|
|
@@ -216,7 +216,7 @@ these throw `unsupported maestro verb: X`:
|
|
|
216
216
|
- **"missing environment variable for flow placeholder: FOO"** — pass
|
|
217
217
|
`--env FOO=bar` or export it. pick one mechanism per repo and document
|
|
218
218
|
it in the flow directory's README.
|
|
219
|
-
- **flow can't find an element** —
|
|
219
|
+
- **flow can't find an element** — Peach's matcher uses testID + visible
|
|
220
220
|
text. UIKit-only labels that real maestro scrapes from the host OS won't
|
|
221
221
|
resolve here; switch to testID.
|
|
222
222
|
- **flow runs but nothing renders** — confirm the bundler your flow
|
|
@@ -225,7 +225,7 @@ these throw `unsupported maestro verb: X`:
|
|
|
225
225
|
|
|
226
226
|
## branch — detox drop-in
|
|
227
227
|
|
|
228
|
-
an existing detox suite runs against
|
|
228
|
+
an existing detox suite runs against Peach with **one line** of jest
|
|
229
229
|
config and zero test changes.
|
|
230
230
|
|
|
231
231
|
`import { by, device, element, expect, waitFor } from 'detox'` is
|
|
@@ -271,7 +271,7 @@ rnx detox init # scaffold config + e2e/example.test.ts
|
|
|
271
271
|
|
|
272
272
|
### compat surface
|
|
273
273
|
|
|
274
|
-
| detox API |
|
|
274
|
+
| detox API | Peach |
|
|
275
275
|
| ---------------------------------- | ------- |
|
|
276
276
|
| `element(by.id(...))` | supported |
|
|
277
277
|
| `element(by.text(...))` | supported — but prefer `by.id` |
|
|
@@ -291,7 +291,7 @@ rnx detox init # scaffold config + e2e/example.test.ts
|
|
|
291
291
|
|
|
292
292
|
### troubleshooting
|
|
293
293
|
|
|
294
|
-
- **"no
|
|
294
|
+
- **"no Peach shell reachable"** — start one yourself
|
|
295
295
|
(`rnx open <port>`) or pass `--port <n>`.
|
|
296
296
|
- **"jest cannot find module 'detox'"** — the preset isn't wired. confirm
|
|
297
297
|
`preset: 'rnxsim/detox'` is in the jest config jest
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: rnx-visual
|
|
3
|
-
description: Pixel-level rendering comparison between
|
|
3
|
+
description: Pixel-level rendering comparison between Peach and native iOS — fonts, gradients, shadows, image fidelity
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
#
|
|
6
|
+
# Peach visual fidelity
|
|
7
7
|
|
|
8
|
-
pixel-level rendering fidelity: does the
|
|
8
|
+
pixel-level rendering fidelity: does the Peach canvas match native iOS
|
|
9
9
|
for text, gradients, shadows, blur, and image rendering? the `rnx`
|
|
10
10
|
CLI gives you two primitives — **canvas capture** (`rnx screenshot`)
|
|
11
11
|
and **structural diff** (`rnx debug snapshot`/`diff`). pixel
|
|
@@ -23,7 +23,7 @@ the capture step is the hard part and it's fully reproducible.
|
|
|
23
23
|
diff` is faster, deterministic, and tells you *why*.
|
|
24
24
|
- visual change (color, gradient, shadow, font metric, blur, image)? →
|
|
25
25
|
continue here.
|
|
26
|
-
- comparing
|
|
26
|
+
- comparing Peach to your iOS simulator for fidelity? → continue.
|
|
27
27
|
- regressing your own app against itself across commits? → continue.
|
|
28
28
|
|
|
29
29
|
## anti-patterns (read first)
|
|
@@ -64,7 +64,7 @@ screen you want to inspect and capture it with a distinct output filename.
|
|
|
64
64
|
|
|
65
65
|
capture both sides to PNGs, then diff with any standard image tool.
|
|
66
66
|
|
|
67
|
-
**
|
|
67
|
+
**Peach vs Peach (regression across your own commits):**
|
|
68
68
|
|
|
69
69
|
```sh
|
|
70
70
|
rnx screenshot -o before.png # baseline, before your change
|
|
@@ -74,7 +74,7 @@ npx pixelmatch before.png after.png diff.png 0.1 # writes diff.png
|
|
|
74
74
|
# or: magick compare before.png after.png diff.png
|
|
75
75
|
```
|
|
76
76
|
|
|
77
|
-
**
|
|
77
|
+
**Peach vs native iOS (fidelity to the real thing):**
|
|
78
78
|
|
|
79
79
|
```sh
|
|
80
80
|
# native side: lifecycle and UI use xcodebuildmcp with one claimed simulator
|