peachsim 0.1.570 → 0.1.572
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/LICENSE +1 -1
- package/README.md +108 -108
- package/cli/app-config.ts +1 -1
- package/cli/app-fonts.ts +4 -4
- package/cli/auth.ts +11 -11
- package/cli/bin.ts +4 -4
- package/cli/bridge-flow-runner.ts +28 -20
- package/cli/browser-evals.ts +2 -2
- package/cli/cli-update.ts +6 -6
- package/cli/cloud-client.ts +16 -16
- package/cli/cloud-dispatch.ts +3 -2
- package/cli/cloud-session.ts +12 -12
- package/cli/cloud-test-result-files.ts +97 -0
- package/cli/cloud-test-tunnel.ts +4 -4
- package/cli/command-registry.ts +7 -7
- package/cli/commands/agent-wrapper.ts +7 -7
- package/cli/commands/agent.ts +16 -16
- package/cli/commands/app-fonts.ts +3 -3
- package/cli/commands/assert.ts +10 -10
- package/cli/commands/auth.ts +5 -5
- package/cli/commands/box/checkout-plane.ts +1 -1
- package/cli/commands/box/plane-share.ts +2 -2
- package/cli/commands/box/rnx-command.ts +5 -5
- package/cli/commands/box.ts +38 -38
- package/cli/commands/camera.ts +13 -13
- package/cli/commands/cleanup.ts +13 -13
- package/cli/commands/compat.ts +7 -7
- package/cli/commands/config.ts +5 -5
- package/cli/commands/control.ts +63 -63
- package/cli/commands/cpu-profile.ts +11 -11
- package/cli/commands/daemon-mac-app.ts +10 -10
- package/cli/commands/daemon.ts +29 -27
- package/cli/commands/debug.ts +35 -35
- package/cli/commands/desktop.ts +3 -3
- package/cli/commands/detox.ts +33 -33
- package/cli/commands/device.ts +9 -9
- package/cli/commands/diagnose.ts +17 -17
- package/cli/commands/do-chain.ts +4 -4
- package/cli/commands/electron.ts +9 -9
- package/cli/commands/film.ts +9 -9
- package/cli/commands/flow.ts +49 -49
- package/cli/commands/inspect/core.ts +12 -12
- package/cli/commands/inspect/count.ts +1 -1
- package/cli/commands/inspect/describe.ts +1 -1
- package/cli/commands/inspect/env.ts +2 -2
- package/cli/commands/inspect/find.ts +2 -2
- package/cli/commands/inspect/get-layout.ts +2 -2
- package/cli/commands/inspect/keyboard.ts +1 -1
- package/cli/commands/inspect/list.ts +4 -4
- package/cli/commands/inspect/memory.ts +1 -1
- package/cli/commands/inspect/resolve-target.ts +1 -1
- package/cli/commands/inspect/screens.ts +1 -1
- package/cli/commands/inspect/shared.ts +1 -1
- package/cli/commands/inspect/tree.ts +1 -1
- package/cli/commands/inspect/url.ts +1 -1
- package/cli/commands/inspect/wait-event.ts +5 -5
- package/cli/commands/inspect.ts +82 -82
- package/cli/commands/install-cli.ts +16 -16
- package/cli/commands/install-desktop.ts +26 -26
- package/cli/commands/login.ts +11 -11
- package/cli/commands/maestro-generate.ts +10 -10
- package/cli/commands/maestro.ts +173 -71
- package/cli/commands/mode.ts +4 -4
- package/cli/commands/no-bridge-hint.ts +12 -12
- package/cli/commands/perf.ts +11 -11
- package/cli/commands/permissions.ts +5 -5
- package/cli/commands/platform.ts +21 -21
- package/cli/commands/preview.ts +5 -5
- package/cli/commands/profile.ts +12 -12
- package/cli/commands/react.ts +15 -15
- package/cli/commands/record.ts +31 -31
- package/cli/commands/report-issue.ts +4 -4
- package/cli/commands/reset.ts +2 -2
- package/cli/commands/runtime.ts +23 -23
- package/cli/commands/screenshot-command.ts +2 -2
- package/cli/commands/screenshot-layers.ts +5 -5
- package/cli/commands/screenshot-mode.ts +7 -7
- package/cli/commands/screenshot.ts +24 -24
- package/cli/commands/screenshots-capture.ts +13 -13
- package/cli/commands/screenshots.ts +6 -6
- package/cli/commands/serve.ts +12 -12
- package/cli/commands/setup.ts +25 -25
- package/cli/commands/skills.ts +30 -23
- package/cli/commands/slides.ts +20 -20
- package/cli/commands/state.ts +2 -2
- package/cli/commands/storage.ts +3 -3
- package/cli/commands/telemetry.ts +2 -2
- package/cli/commands/test.ts +176 -18
- package/cli/commands/three-mode.ts +17 -17
- package/cli/commands/timeline.ts +12 -12
- package/cli/commands/upgrade.ts +11 -11
- package/cli/commands/upload.ts +26 -26
- package/cli/commands/version.ts +7 -7
- package/cli/commands/what-happened.ts +20 -20
- package/cli/current-sim.ts +3 -3
- package/cli/desktop-companion.ts +16 -16
- package/cli/drivers/electron.ts +4 -4
- package/cli/drivers/playwright-sim-host.ts +7 -7
- package/cli/drivers/playwright.ts +4 -4
- package/cli/drivers/registry.ts +1 -1
- package/cli/drivers/types.ts +5 -5
- package/cli/flow-export.ts +1 -1
- package/cli/flow-file.ts +5 -5
- package/cli/flow-session.ts +1 -1
- package/cli/help-core.ts +13 -13
- package/cli/hints.ts +14 -14
- package/cli/inspect-notice-state.ts +1 -1
- package/cli/internal-child.ts +2 -2
- package/cli/maestro-js.ts +4 -4
- package/cli/maestro-report.ts +4 -2
- package/cli/main.ts +14 -14
- package/cli/outbound-endpoints.ts +32 -30
- package/cli/parse-args.ts +7 -7
- package/cli/privacy.ts +1 -1
- package/cli/recording-access.ts +10 -10
- package/cli/resolve-assets.ts +2 -2
- package/cli/rnx-in-process.ts +5 -5
- package/cli/run-registry.ts +3 -2
- package/cli/run-rnx-core.ts +3 -3
- package/cli/run-rnx.ts +1 -1
- package/cli/runtime-notes.ts +1 -1
- package/cli/self-invocation.ts +1 -1
- package/cli/send-to-box.ts +1 -1
- package/cli/shell-init.ts +40 -40
- package/cli/ui.ts +1 -1
- package/cli/ws-bridge.ts +22 -22
- package/detox/config-loader.ts +1 -1
- package/detox/index.ts +28 -28
- package/detox/jest-preset.cjs +2 -2
- package/detox/navigation.ts +2 -2
- package/dist-lib/agent-daemon-client.cjs +12 -12
- package/dist-lib/agent-events.cjs +1 -1
- package/dist-lib/agent-identity.cjs +2 -2
- package/dist-lib/agent-sessions.cjs +12 -12
- package/dist-lib/attached-projects.cjs +4 -4
- package/dist-lib/auth/shared-session.cjs +4 -4
- 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 +4 -4
- package/dist-lib/bridge-contract-input.cjs +1 -1
- package/dist-lib/bridge-contract-input.mjs +1 -1
- package/dist-lib/bridge-contract.cjs +2 -2
- package/dist-lib/bridge-contract.mjs +2 -2
- 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-test-args.cjs +116 -0
- package/dist-lib/cloud-test-args.mjs +86 -0
- package/dist-lib/cloud.cjs +42 -42
- package/dist-lib/cloud.mjs +42 -42
- package/dist-lib/config.cjs +2 -2
- package/dist-lib/detox/index.cjs +29 -29
- package/dist-lib/detox/jest-preset.cjs +2 -2
- package/dist-lib/dev-bundle-resolution.cjs +1 -1
- package/dist-lib/home-paths.cjs +12 -12
- package/dist-lib/host/bridge-host.cjs +87 -77
- 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 +6 -6
- package/dist-lib/host/websocket-proxy.cjs +1 -1
- package/dist-lib/index.cjs +63 -73
- 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 +5 -5
- package/dist-lib/menu.mjs +5 -5
- 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 +15 -15
- package/dist-lib/profiles.cjs +4 -4
- package/dist-lib/public-brand.cjs +3 -3
- 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 +2 -1
- package/dist-lib/sdk.cjs +9 -9
- package/dist-lib/sdk.mjs +9 -9
- package/dist-lib/skills.cjs +534 -520
- package/dist-lib/swift-compile.cjs +372 -0
- package/dist-lib/swift-compile.mjs +339 -0
- package/dist-lib/swift-package.cjs +78 -0
- package/dist-lib/swift-package.mjs +52 -0
- 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 +479 -161
- package/package.json +22 -1
- package/scripts/dev-server-scanner.ts +4 -3
- package/skills/contrast/SKILL.md +75 -75
- package/skills/{rnx-debug → peach-debug}/SKILL.md +90 -90
- package/skills/{rnx-perf → peach-perf}/SKILL.md +13 -13
- package/skills/{rnx-setup → peach-setup}/SKILL.md +60 -60
- package/skills/{rnx-test → peach-test}/SKILL.md +47 -47
- package/skills/{rnx-visual → peach-visual}/SKILL.md +26 -26
- package/src/agent-daemon-client.ts +5 -5
- package/src/agent-events.ts +1 -1
- package/src/agent-identity.ts +1 -1
- package/src/agent-sessions.ts +13 -13
- package/src/attached-projects.ts +1 -1
- package/src/auth/shared-session.ts +1 -1
- package/src/bridge-constants.ts +3 -3
- package/src/bridge-contract-input.ts +1 -1
- package/src/bridge-contract.ts +3 -3
- package/src/cli-version.ts +6 -6
- package/src/cloud-test-args.ts +100 -0
- package/src/cloud.ts +40 -40
- package/src/config.ts +1 -1
- package/src/connect.ts +6 -6
- package/src/dev-server-open.ts +8 -8
- package/src/disk-cleanup.ts +3 -3
- package/src/home-paths.ts +26 -26
- package/src/host/agent-host.ts +3 -3
- package/src/host/bridge-host.ts +33 -33
- package/src/host/fetch-proxy-handler.ts +1 -1
- package/src/host/plane-host.ts +2 -2
- package/src/host/replacement-module-handler.ts +2 -2
- package/src/menu.ts +2 -2
- package/src/metro-plugin.ts +7 -7
- package/src/metro-production-bundle.ts +2 -2
- package/src/native-dev-bundle-url.ts +2 -2
- package/src/playwright-host-log.ts +1 -1
- package/src/public-brand.ts +2 -2
- package/src/react-native-host-modules.ts +1 -1
- package/src/rolldown-plugin-swift.ts +11 -10
- package/src/runtime-assets.ts +11 -11
- package/src/runtime-delivery.ts +6 -6
- package/src/screenshots/orchestrate.ts +1 -1
- package/src/screenshots/org-deck.ts +1 -1
- package/src/screenshots/schema.ts +2 -2
- package/src/sim-client.ts +1 -1
- package/src/skills/builtin/compat-check.ts +2 -2
- package/src/swift-compile.ts +359 -0
- package/src/swift-package.ts +69 -0
- package/src/swift-submit.ts +3 -2
- package/src/vite-plugin-one.ts +8 -8
- package/src/vite-plugin-swift.ts +106 -110
- package/src/vite-plugin.ts +6 -19
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "peachsim",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.572",
|
|
4
4
|
"description": "Vite and Metro plugins, testing drivers, and SDK exports for peach.",
|
|
5
5
|
"author": "Tamagui LLC",
|
|
6
6
|
"license": "SEE LICENSE IN LICENSE",
|
|
@@ -46,6 +46,20 @@
|
|
|
46
46
|
"import": "./dist-lib/swift-submit.mjs",
|
|
47
47
|
"default": "./dist-lib/swift-submit.cjs"
|
|
48
48
|
},
|
|
49
|
+
"./swift-package": {
|
|
50
|
+
"types": "./src/swift-package.ts",
|
|
51
|
+
"source": "./src/swift-package.ts",
|
|
52
|
+
"bun": "./src/swift-package.ts",
|
|
53
|
+
"import": "./dist-lib/swift-package.mjs",
|
|
54
|
+
"default": "./dist-lib/swift-package.cjs"
|
|
55
|
+
},
|
|
56
|
+
"./swift-compile": {
|
|
57
|
+
"types": "./src/swift-compile.ts",
|
|
58
|
+
"source": "./src/swift-compile.ts",
|
|
59
|
+
"bun": "./src/swift-compile.ts",
|
|
60
|
+
"import": "./dist-lib/swift-compile.mjs",
|
|
61
|
+
"default": "./dist-lib/swift-compile.cjs"
|
|
62
|
+
},
|
|
49
63
|
"./metro": {
|
|
50
64
|
"source": "./src/metro-plugin.ts",
|
|
51
65
|
"default": "./dist-lib/metro.cjs"
|
|
@@ -150,6 +164,13 @@
|
|
|
150
164
|
"import": "./dist-lib/cloud-contract.mjs",
|
|
151
165
|
"default": "./dist-lib/cloud-contract.cjs"
|
|
152
166
|
},
|
|
167
|
+
"./cloud-test-args": {
|
|
168
|
+
"types": "./src/cloud-test-args.ts",
|
|
169
|
+
"source": "./src/cloud-test-args.ts",
|
|
170
|
+
"bun": "./src/cloud-test-args.ts",
|
|
171
|
+
"import": "./dist-lib/cloud-test-args.mjs",
|
|
172
|
+
"default": "./dist-lib/cloud-test-args.cjs"
|
|
173
|
+
},
|
|
153
174
|
"./cloud": {
|
|
154
175
|
"types": "./src/cloud.ts",
|
|
155
176
|
"source": "./src/cloud.ts",
|
|
@@ -122,7 +122,7 @@ export interface DiscoveredServer {
|
|
|
122
122
|
* COULD NOT LOOK MUST NEVER ANSWER AS THOUGH IT LOOKED. silence, timeout and
|
|
123
123
|
* empty are three different answers, and only `no-manifest` means "there is
|
|
124
124
|
* nothing there". reading `no-answer` as `no-manifest` is what made
|
|
125
|
-
* `
|
|
125
|
+
* `peach open` hand back `<base>/index.bundle` for a One app whose manifest
|
|
126
126
|
* names a different entry point entirely. */
|
|
127
127
|
type ManifestState = 'resolved' | 'no-manifest' | 'no-answer'
|
|
128
128
|
|
|
@@ -871,7 +871,7 @@ export async function probePort(
|
|
|
871
871
|
buildIconProxyUrl?: (externalUrl: string) => string,
|
|
872
872
|
listeningProcess?: ListeningProcess,
|
|
873
873
|
): Promise<DiscoveredServer | null> {
|
|
874
|
-
// callers such as `
|
|
874
|
+
// callers such as `peach open <port>` probe one port directly instead of
|
|
875
875
|
// going through scanDevServers. wait for the optional in-repo registry here
|
|
876
876
|
// too, or a cold CLI process can build the known app's bundle url before its
|
|
877
877
|
// runtime config is available.
|
|
@@ -1110,6 +1110,7 @@ export interface ScanOptions {
|
|
|
1110
1110
|
function isSootSimSelfServer(server: DiscoveredServer): boolean {
|
|
1111
1111
|
const bundleId = server.bundleId?.trim().toLowerCase()
|
|
1112
1112
|
if (bundleId?.startsWith('dev.sootsim.')) return true
|
|
1113
|
+
if (bundleId?.startsWith('dev.peachsim.')) return true
|
|
1113
1114
|
|
|
1114
1115
|
return false
|
|
1115
1116
|
}
|
|
@@ -1175,7 +1176,7 @@ export function __shouldReuseScannerCacheEntry(
|
|
|
1175
1176
|
return true
|
|
1176
1177
|
}
|
|
1177
1178
|
|
|
1178
|
-
// exported for tests / `
|
|
1179
|
+
// exported for tests / `peach debug` — forces the next scan to re-probe.
|
|
1179
1180
|
export function __resetScannerCache() {
|
|
1180
1181
|
portCache.clear()
|
|
1181
1182
|
knownNonPatched.clear()
|
package/skills/contrast/SKILL.md
CHANGED
|
@@ -14,68 +14,68 @@ overview of all available skills and CLI commands in this repo.
|
|
|
14
14
|
|
|
15
15
|
## Peach CLI commands
|
|
16
16
|
|
|
17
|
-
the `
|
|
17
|
+
the `peach` CLI is the operational surface for booting shells, driving
|
|
18
18
|
automation, inspecting the render tree, and managing sims.
|
|
19
19
|
|
|
20
20
|
| command | description |
|
|
21
21
|
| --- | --- |
|
|
22
|
-
| `
|
|
23
|
-
| `
|
|
24
|
-
| `
|
|
25
|
-
| `
|
|
26
|
-
| `
|
|
27
|
-
| `
|
|
28
|
-
| `
|
|
29
|
-
| `
|
|
30
|
-
| `
|
|
31
|
-
| `
|
|
32
|
-
| `
|
|
33
|
-
| `
|
|
34
|
-
| `
|
|
35
|
-
| `
|
|
36
|
-
| `
|
|
37
|
-
| `
|
|
38
|
-
| `
|
|
39
|
-
| `
|
|
40
|
-
| `
|
|
41
|
-
| `
|
|
42
|
-
| `
|
|
43
|
-
| `
|
|
44
|
-
| `
|
|
45
|
-
| `
|
|
46
|
-
| `
|
|
47
|
-
| `
|
|
48
|
-
| `
|
|
49
|
-
| `
|
|
50
|
-
| `
|
|
51
|
-
| `
|
|
52
|
-
| `
|
|
53
|
-
| `
|
|
54
|
-
| `
|
|
55
|
-
| `
|
|
56
|
-
| `
|
|
57
|
-
| `
|
|
58
|
-
| `
|
|
59
|
-
| `
|
|
60
|
-
| `
|
|
61
|
-
| `
|
|
62
|
-
| `
|
|
63
|
-
| `
|
|
64
|
-
| `
|
|
65
|
-
| `
|
|
66
|
-
| `
|
|
67
|
-
| `
|
|
22
|
+
| `peach maestro` | author, generate, and run Maestro YAML flows against peach |
|
|
23
|
+
| `peach detox` | run existing Detox suites against peach on headless Chromium |
|
|
24
|
+
| `peach cleanup` | inspect and reclaim local peach disk usage |
|
|
25
|
+
| `peach record` | capture the live sim as webm/mp4/gif, or sample N png frames (--frames) |
|
|
26
|
+
| `peach film` | record a flow on the flat canvas, play it back on the 3d device stage under a camera cinematic, save a clip |
|
|
27
|
+
| `peach storage` | manage guest app storage and launch profiles |
|
|
28
|
+
| `peach permissions` | inspect and change simulated operating-system permissions |
|
|
29
|
+
| `peach perf` | CPU, React render, shell frame, and scroll-layer profiling |
|
|
30
|
+
| `peach describe` | curated human-readable UI summary (default inspection tool) |
|
|
31
|
+
| `peach find` | locate nodes by text / testID / role / type / predicate |
|
|
32
|
+
| `peach assert` | run any read verb and convert its output into an exit code |
|
|
33
|
+
| `peach screenshot` | capture PNGs and manage App Store screenshot assets |
|
|
34
|
+
| `peach get` | read runtime state (tree, a11y, layout, url, count, errors, …) |
|
|
35
|
+
| `peach do` | drive the app (tap, type, scroll, swipe, key, reload, …) |
|
|
36
|
+
| `peach wait` | block until the runtime reaches a known state |
|
|
37
|
+
| `peach shell` | drive shell state and simulator chrome |
|
|
38
|
+
| `peach mode` | toggle screenshot and 3D display modes |
|
|
39
|
+
| `peach device` | inspect or change the live device preset for a sim |
|
|
40
|
+
| `peach network` | inspect live network traffic from the running peach worker |
|
|
41
|
+
| `peach logs` | inspect live console output from the running peach worker |
|
|
42
|
+
| `peach debug` | drive __sootsimDebug: channels, snapshots, and inspectors |
|
|
43
|
+
| `peach what-happened` | show recent semantic events: toasts, keyboards, screens, alerts, fetches, errors |
|
|
44
|
+
| `peach timeline` | control the semantic event timeline (enable opt-in kinds, clear, dump) |
|
|
45
|
+
| `peach box` | start a local Box or create a cloud Box |
|
|
46
|
+
| `peach ios` | start an iOS simulator |
|
|
47
|
+
| `peach android` | start an Android simulator |
|
|
48
|
+
| `peach open` | load a target into the current sim or open a new one |
|
|
49
|
+
| `peach list` | list connected sims or available launch drivers |
|
|
50
|
+
| `peach use` | select a connected sim |
|
|
51
|
+
| `peach skill` | install and inspect bundled peach agent skills |
|
|
52
|
+
| `peach claim` | take an exclusive lease on a sim |
|
|
53
|
+
| `peach agent` | attached projects + local agent sessions (codex/claude) |
|
|
54
|
+
| `peach close` | close a connected sim |
|
|
55
|
+
| `peach setup` | configure optional local conveniences |
|
|
56
|
+
| `peach compat` | check package compatibility |
|
|
57
|
+
| `peach report-issue` | send an explicitly approved compatibility report |
|
|
58
|
+
| `peach desktop` | launch or install the desktop companion |
|
|
59
|
+
| `peach daemon` | manage the recommended background bridge service |
|
|
60
|
+
| `peach version` | show the CLI + engine runtime versions you are running |
|
|
61
|
+
| `peach upgrade` | update the peach CLI and engine runtime to the latest |
|
|
62
|
+
| `peach serve` | run the peach bridge in the foreground |
|
|
63
|
+
| `peach runtime` | manage engine runtimes under ~/.peach/runtimes/ |
|
|
64
|
+
| `peach auth` | inspect active CLI auth |
|
|
65
|
+
| `peach login` | sign in for preview uploads |
|
|
66
|
+
| `peach logout` | clear the local desktop auth session |
|
|
67
|
+
| `peach config` | manage local CLI preferences |
|
|
68
68
|
|
|
69
69
|
### runtime verb groups
|
|
70
70
|
|
|
71
71
|
every runtime verb is organized under one of these grouping prefixes.
|
|
72
|
-
run `
|
|
72
|
+
run `peach --help` to see the full list under each group.
|
|
73
73
|
|
|
74
|
-
- `
|
|
75
|
-
- `
|
|
76
|
-
- `
|
|
77
|
-
- `
|
|
78
|
-
- `
|
|
74
|
+
- `peach describe` — summarize the current UI
|
|
75
|
+
- `peach find <...>` — unified finder (bare text, --testid, --role, --type, --pressable, --visible)
|
|
76
|
+
- `peach get <noun>` — read runtime state (tree, a11y, url, count, errors, warnings, requests, globals, layout, node)
|
|
77
|
+
- `peach do <action>` — drive the app (tap, tap-text, tap-id, type, type-into, key, dismiss, scroll, drag, swipe, pinch, reload, shell, sleep, settle, wait)
|
|
78
|
+
- `peach debug <tool>` — instrumentation (state, js, eval, perf, sample-color, enable/disable channels, snapshots, diff, record, recent)
|
|
79
79
|
|
|
80
80
|
### global flags
|
|
81
81
|
|
|
@@ -93,11 +93,11 @@ skills for working with the Peach native preview engine:
|
|
|
93
93
|
|
|
94
94
|
| skill | description |
|
|
95
95
|
| --- | --- |
|
|
96
|
-
| `/
|
|
97
|
-
| `/
|
|
98
|
-
| `/
|
|
99
|
-
| `/
|
|
100
|
-
| `/
|
|
96
|
+
| `/peach-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 peach CLI debug tooling first, not screenshots or ad-hoc logging. |
|
|
97
|
+
| `/peach-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 /peach-debug first. |
|
|
98
|
+
| `/peach-setup` | Get Peach connected to your React Native app with no project setup |
|
|
99
|
+
| `/peach-test` | Run automated tests against your React Native app under Peach with Maestro YAML or Detox/Jest |
|
|
100
|
+
| `/peach-visual` | Pixel-level rendering comparison between Peach and native iOS — fonts, gradients, shadows, image fidelity |
|
|
101
101
|
|
|
102
102
|
## automatic settling
|
|
103
103
|
|
|
@@ -115,18 +115,18 @@ commands in your own `sleep` or chain `do settle` "just to be safe"**.
|
|
|
115
115
|
`type-into`, `key`, `key-sequence`, `keycode`, `drag`, `swipe`,
|
|
116
116
|
`long-press`, `touch`, `gesture`, `pinch`, `scroll`, `shell`)
|
|
117
117
|
the CLI polls the layout hash until it is stable for two consecutive
|
|
118
|
-
frames. budget: **400 ms for agents** (`
|
|
118
|
+
frames. budget: **400 ms for agents** (`PEACH_AGENT=1`, set by the
|
|
119
119
|
harness), 200 ms for humans.
|
|
120
120
|
|
|
121
121
|
what this means:
|
|
122
122
|
|
|
123
|
-
- `
|
|
124
|
-
- you only need `
|
|
123
|
+
- `peach do tap-id login` then `peach find "Welcome"` Just Works™.
|
|
124
|
+
- you only need `peach do settle <seconds>` or `peach wait idle
|
|
125
125
|
--max-ms <N>` when the CLI explicitly prints
|
|
126
126
|
`⚠ auto-wait timed out after Nms — next command may see mid-animation
|
|
127
127
|
state`, or when the transition you care about lasts longer than ~400 ms
|
|
128
128
|
(full stack navigation, crossfades, video load).
|
|
129
|
-
- opt-out: `--no-wait` on a single command, `
|
|
129
|
+
- opt-out: `--no-wait` on a single command, `PEACH_NO_AUTO_WAIT=1`
|
|
130
130
|
for a whole lane.
|
|
131
131
|
- if a read keeps racing its write, the fix is **never** a blind `sleep` —
|
|
132
132
|
prefer `wait selector`, `wait ready`, `wait idle`, or a longer
|
|
@@ -139,27 +139,27 @@ what this means:
|
|
|
139
139
|
|
|
140
140
|
```sh
|
|
141
141
|
bun dev # start everything
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
142
|
+
peach dev -- pnpm dev # wrap a bundler
|
|
143
|
+
peach open 8081 # load an app
|
|
144
|
+
peach describe # inspect the UI tree
|
|
145
145
|
```
|
|
146
146
|
|
|
147
147
|
### debugging
|
|
148
148
|
|
|
149
149
|
```sh
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
150
|
+
peach get errors 5 # recent console errors
|
|
151
|
+
peach get requests 5 # recent failed requests
|
|
152
|
+
peach debug snapshot before # capture state
|
|
153
|
+
peach debug diff before after # compare snapshots
|
|
154
|
+
peach debug state shell # runtime state dump
|
|
155
155
|
```
|
|
156
156
|
|
|
157
157
|
### inspection
|
|
158
158
|
|
|
159
159
|
```sh
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
160
|
+
peach describe # visible elements
|
|
161
|
+
peach find "Sign in" # find by text
|
|
162
|
+
peach find --testid loginButton # find by testID
|
|
163
|
+
peach do tap-text "Submit" # tap by text
|
|
164
|
+
peach do type "hello" # type text
|
|
165
165
|
```
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
|
-
name:
|
|
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
|
|
2
|
+
name: peach-debug
|
|
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 peach CLI debug tooling first, not screenshots or ad-hoc logging.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Peach debug
|
|
@@ -10,15 +10,15 @@ 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,
|
|
12
12
|
event-order, or correctness question. for pixel-level rendering fidelity
|
|
13
|
-
load `/
|
|
13
|
+
load `/peach-visual` instead.
|
|
14
14
|
|
|
15
|
-
> needs a connected, pinned sim. if `
|
|
16
|
-
> `/
|
|
15
|
+
> needs a connected, pinned sim. if `peach describe` errors, load
|
|
16
|
+
> `/peach-setup` first.
|
|
17
17
|
|
|
18
18
|
## principle — drive the CLI, don't probe by hand
|
|
19
19
|
|
|
20
20
|
for any rendering, animation, gesture, or interaction bug, reach for the
|
|
21
|
-
|
|
21
|
+
peach CLI debug tooling **first** — `describe` and `find` to read the
|
|
22
22
|
tree, `debug snapshot` + `debug diff` to capture before/after, `debug
|
|
23
23
|
recent` on a channel and `perf shell` for frame-by-frame stats, and the
|
|
24
24
|
timeline for "what just happened". **do not** debug these by eye with
|
|
@@ -44,13 +44,13 @@ regression test. a pile of ad-hoc logs helps no one and gets deleted.
|
|
|
44
44
|
- "screen reader can't find this / wrong label / tap target too small" → [accessibility](#branch--accessibility)
|
|
45
45
|
- "I want to see what just happened" (ephemeral toast, async navigation,
|
|
46
46
|
fetch + alert sequence) → [the timeline](#the-timeline-what-happened)
|
|
47
|
-
- "I want pixel-level fidelity to iOS" → load `/
|
|
48
|
-
- "I want to author a test" → load `/
|
|
47
|
+
- "I want pixel-level fidelity to iOS" → load `/peach-visual`
|
|
48
|
+
- "I want to author a test" → load `/peach-test`
|
|
49
49
|
|
|
50
50
|
## anti-patterns (apply to every branch)
|
|
51
51
|
|
|
52
52
|
- **`a1`/`a2`/`b0` style ids mean Peach sims, never browser tabs.** when a user
|
|
53
|
-
says "look at a3", that's the `
|
|
53
|
+
says "look at a3", that's the `peach 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.
|
|
56
56
|
- **the CLI auto-settles. don't add `sleep`.** every read waits up to
|
|
@@ -62,10 +62,10 @@ regression test. a pile of ad-hoc logs helps no one and gets deleted.
|
|
|
62
62
|
changes, and duplicate strings. add `testID` during implementation and
|
|
63
63
|
query against it.
|
|
64
64
|
- **pin a sim once.** if more than one is live, an unpinned command
|
|
65
|
-
refuses to choose. run `
|
|
66
|
-
- **keep one sim and reuse its browser tab.** before `
|
|
67
|
-
`
|
|
68
|
-
`
|
|
65
|
+
refuses to choose. run `peach use <id>` at the start of the workflow.
|
|
66
|
+
- **keep one sim and reuse its browser tab.** before `peach open`, run
|
|
67
|
+
`peach list --all`. pin the target and use `peach do reload`; a plain
|
|
68
|
+
`peach open <target>` also navigates the saved sim. reserve `--new` for a
|
|
69
69
|
genuinely concurrent sim. repeated browser trees consume memory and CPU on a
|
|
70
70
|
shared machine.
|
|
71
71
|
- **`debug eval` is an escape hatch.** if a top-level command feels
|
|
@@ -95,13 +95,13 @@ fetches resolve. the timeline records them so you can ask "what
|
|
|
95
95
|
happened" instead of racing the UI with `find`.
|
|
96
96
|
|
|
97
97
|
```sh
|
|
98
|
-
|
|
98
|
+
peach timeline start # arm recording (cheap kinds default-on)
|
|
99
99
|
# reproduce the flow
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
100
|
+
peach what-happened # events since the last CLI call
|
|
101
|
+
peach what-happened --since 10s # absolute window
|
|
102
|
+
peach what-happened --kinds toast,fetch # filter to a few kinds
|
|
103
|
+
peach what-happened --summary # one-line counts
|
|
104
|
+
peach what-happened --flow # section events by screen/route
|
|
105
105
|
```
|
|
106
106
|
|
|
107
107
|
semantic kinds the timeline understands: `keyboard`, `screen`, `route`,
|
|
@@ -109,12 +109,12 @@ semantic kinds the timeline understands: `keyboard`, `screen`, `route`,
|
|
|
109
109
|
`gesture`, `text-input`, `reanimated`, `animation`, `fetch`, `console`,
|
|
110
110
|
`app-launch`, `shell`. cheap kinds record by default; heavier kinds
|
|
111
111
|
(scroll, gesture, text-input, reanimated, animation) opt in via
|
|
112
|
-
`
|
|
112
|
+
`peach timeline start scroll,gesture,…`.
|
|
113
113
|
|
|
114
114
|
every other CLI command also prints a one-line footer for events since
|
|
115
115
|
the last call — that's the headline indicator. when the footer is empty,
|
|
116
116
|
there's nothing new to look at; when it says `since last: 1 error · 1
|
|
117
|
-
toast · 1 screen push`, run `
|
|
117
|
+
toast · 1 screen push`, run `peach what-happened` to see the detail.
|
|
118
118
|
|
|
119
119
|
> reach for the timeline first when the question involves *something
|
|
120
120
|
> that appeared briefly and disappeared*. it's faster than a screenshot
|
|
@@ -135,11 +135,11 @@ need a manual wait when:
|
|
|
135
135
|
(no pulsing dots, no shimmer, no looping Lottie).
|
|
136
136
|
|
|
137
137
|
```sh
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
138
|
+
peach do settle 5 # wait up to 5s for layout stability
|
|
139
|
+
peach wait idle --max-ms 5000 # same thing under the `wait` verb
|
|
140
|
+
peach wait idle --strict # also require animation flags clear
|
|
141
|
+
peach do tap-id play --no-wait # skip auto-settle on one command
|
|
142
|
+
PEACH_NO_AUTO_WAIT=1 peach ... # disable auto-settle for a lane
|
|
143
143
|
```
|
|
144
144
|
|
|
145
145
|
## branch — debugging
|
|
@@ -147,14 +147,14 @@ RNX_NO_AUTO_WAIT=1 rnx ... # disable auto-settle for a lane
|
|
|
147
147
|
the playbook for "wrong tree / wrong props / wrong handler":
|
|
148
148
|
|
|
149
149
|
```sh
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
150
|
+
peach describe # what's on screen now
|
|
151
|
+
peach get errors 5 # any console smoke?
|
|
152
|
+
peach find --testid <node> # locate the suspect
|
|
153
|
+
peach debug snapshot before
|
|
154
154
|
# reproduce
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
155
|
+
peach debug snapshot after
|
|
156
|
+
peach debug diff before after # structural diff: what changed?
|
|
157
|
+
peach what-happened # timeline events during the repro
|
|
158
158
|
```
|
|
159
159
|
|
|
160
160
|
when the repro needs several closely timed inputs, replace the individual
|
|
@@ -162,15 +162,15 @@ write calls with one inline batch so WebSocket scheduling cannot change the
|
|
|
162
162
|
gesture:
|
|
163
163
|
|
|
164
164
|
```sh
|
|
165
|
-
|
|
165
|
+
peach do touch down 200 600 --then sleep 0.03 --then touch move 200 250 --then touch up 200 250
|
|
166
166
|
```
|
|
167
167
|
|
|
168
168
|
for nested scroll ownership or momentum transfer, compare the shell's resolved
|
|
169
169
|
gesture chain with the published scroll registry:
|
|
170
170
|
|
|
171
171
|
```sh
|
|
172
|
-
|
|
173
|
-
|
|
172
|
+
peach debug state scroll-input
|
|
173
|
+
peach debug state scroll-mirror
|
|
174
174
|
```
|
|
175
175
|
|
|
176
176
|
reading `describe` output:
|
|
@@ -187,9 +187,9 @@ for transitions, alerts, native UI, or anything spanning the shell ↔
|
|
|
187
187
|
tenant boundary, lean on the timeline before reaching for traces:
|
|
188
188
|
|
|
189
189
|
```sh
|
|
190
|
-
|
|
190
|
+
peach timeline start
|
|
191
191
|
# reproduce the launch / dismiss / alert
|
|
192
|
-
|
|
192
|
+
peach what-happened --kinds shell,alert,screen,animation
|
|
193
193
|
```
|
|
194
194
|
|
|
195
195
|
you're done when:
|
|
@@ -202,10 +202,10 @@ you're done when:
|
|
|
202
202
|
## branch — performance
|
|
203
203
|
|
|
204
204
|
```sh
|
|
205
|
-
|
|
205
|
+
peach perf shell start # arm capture (also clears prior frames)
|
|
206
206
|
# reproduce the slow interaction
|
|
207
|
-
|
|
208
|
-
|
|
207
|
+
peach perf shell stop # full report, including worst frames
|
|
208
|
+
peach perf shell stop --json # machine-readable summary
|
|
209
209
|
```
|
|
210
210
|
|
|
211
211
|
`perf shell` output:
|
|
@@ -227,8 +227,8 @@ budget. **p95 >20 ms is visible jank for a scrolling surface.**
|
|
|
227
227
|
profiling a whole flow:
|
|
228
228
|
|
|
229
229
|
```sh
|
|
230
|
-
|
|
231
|
-
|
|
230
|
+
peach maestro test .maestro/scroll-feed.yaml --profile # per-step + frame stats
|
|
231
|
+
peach perf cpu --duration 5 --output /tmp/trace.cpuprofile # sampled CPU
|
|
232
232
|
```
|
|
233
233
|
|
|
234
234
|
common patterns → first probe:
|
|
@@ -245,11 +245,11 @@ debug channels that help, but cost 1–3 ms/frame on their own — enable
|
|
|
245
245
|
only what you're investigating:
|
|
246
246
|
|
|
247
247
|
```sh
|
|
248
|
-
|
|
248
|
+
peach debug enable layout,onlayout,render,animated
|
|
249
249
|
# reproduce
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
250
|
+
peach debug recent layout 20 # last 20 layout events
|
|
251
|
+
peach debug recent render 20 # last 20 draw passes
|
|
252
|
+
peach debug disable layout,onlayout,render,animated
|
|
253
253
|
```
|
|
254
254
|
|
|
255
255
|
you're done when: a p95 number for the interaction + named hot path +
|
|
@@ -269,9 +269,9 @@ watch out for:
|
|
|
269
269
|
## branch — accessibility
|
|
270
270
|
|
|
271
271
|
```sh
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
272
|
+
peach get a11y # roles, labels, hints, and target geometry
|
|
273
|
+
peach get layout --styling # boxes, styles, and native pixel contrast
|
|
274
|
+
peach describe --a11y # inline a11y info on every node
|
|
275
275
|
```
|
|
276
276
|
|
|
277
277
|
native styled layout reads rendered pixels rather than inferring contrast from
|
|
@@ -287,9 +287,9 @@ contrast summary format:
|
|
|
287
287
|
finding offenders fast:
|
|
288
288
|
|
|
289
289
|
```sh
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
290
|
+
peach find --no-label # interactive nodes missing label
|
|
291
|
+
peach find --no-role # interactive nodes missing role
|
|
292
|
+
peach find --pressable --max-dim 44 # undersized tap targets
|
|
293
293
|
```
|
|
294
294
|
|
|
295
295
|
what gets checked:
|
|
@@ -298,7 +298,7 @@ what gets checked:
|
|
|
298
298
|
- **missing roles** — `Pressable`/`Touchable` without `accessibilityRole`
|
|
299
299
|
- **missing hints** — complex interactions without `accessibilityHint`
|
|
300
300
|
- **touch target size** — tappable nodes with hitSlop-expanded rect <44×44
|
|
301
|
-
- **contrast** — run `
|
|
301
|
+
- **contrast** — run `peach get layout --styling`; it samples final text and
|
|
302
302
|
text-suppressed background pixels, including gradients and composited opacity
|
|
303
303
|
- **label / visible-text mismatch** — label that reads differently from
|
|
304
304
|
the text VoiceOver would fall back to (often a translation bug)
|
|
@@ -315,11 +315,11 @@ triage order:
|
|
|
315
315
|
fix → verify loop (the same shape as debugging):
|
|
316
316
|
|
|
317
317
|
```sh
|
|
318
|
-
|
|
319
|
-
|
|
318
|
+
peach get a11y > before-a11y.txt
|
|
319
|
+
peach get layout --styling --json > before-layout.json
|
|
320
320
|
# apply the fix
|
|
321
|
-
|
|
322
|
-
|
|
321
|
+
peach get a11y > after-a11y.txt
|
|
322
|
+
peach get layout --styling --json > after-layout.json
|
|
323
323
|
diff before-a11y.txt after-a11y.txt
|
|
324
324
|
diff before-layout.json after-layout.json
|
|
325
325
|
```
|
|
@@ -371,7 +371,7 @@ type names sneak in).
|
|
|
371
371
|
## recovery — common failure modes
|
|
372
372
|
|
|
373
373
|
- **`describe` returns nothing** — no sim pinned, or the app isn't
|
|
374
|
-
loaded. load `/
|
|
374
|
+
loaded. load `/peach-setup` and re-confirm.
|
|
375
375
|
- **`find` returns multiple matches** — narrow with `--testid`,
|
|
376
376
|
`--visible`, or both.
|
|
377
377
|
- **`perf shell` reports zero frames** — you didn't run `perf shell start`
|
|
@@ -390,45 +390,45 @@ type names sneak in).
|
|
|
390
390
|
### finding and interacting
|
|
391
391
|
|
|
392
392
|
```sh
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
393
|
+
peach describe # all visible elements with styles
|
|
394
|
+
peach describe button # filter by text/role/label/testID
|
|
395
|
+
peach describe --testid foo # only the subtree under a testID
|
|
396
|
+
peach describe --verbose # include every style property
|
|
397
|
+
|
|
398
|
+
peach find "Sign in" # by text content
|
|
399
|
+
peach find --testid loginButton
|
|
400
|
+
peach find --role button
|
|
401
|
+
peach find --pressable
|
|
402
|
+
peach find --visible # only on-screen nodes
|
|
403
|
+
|
|
404
|
+
peach do tap-id loginButton # tap by testID (preferred)
|
|
405
|
+
peach do tap-text "Submit" # tap by text
|
|
406
|
+
peach do tap 196 400 # tap at coordinates
|
|
407
|
+
peach do type "hello world" # type into focused input
|
|
408
|
+
peach do type-into emailInput "a@b" # focus then type
|
|
409
|
+
peach do key return # special key (return, backspace, …)
|
|
410
|
+
peach do scroll feed-list 0 500 # scroll a testID to absolute x/y offsets
|
|
411
|
+
peach do swipe feed-list left # directional swipe
|
|
412
|
+
peach do long-press messageRow 800 # ms hold
|
|
413
413
|
```
|
|
414
414
|
|
|
415
415
|
### errors and requests
|
|
416
416
|
|
|
417
417
|
```sh
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
418
|
+
peach get errors 5 # last 5 console errors
|
|
419
|
+
peach get warnings 5
|
|
420
|
+
peach get requests 5 # recent failed requests
|
|
421
|
+
peach logs --since 30s # recent console output
|
|
422
|
+
peach network --since 30s # recent network traffic
|
|
423
423
|
```
|
|
424
424
|
|
|
425
425
|
### snapshots and diff
|
|
426
426
|
|
|
427
427
|
```sh
|
|
428
|
-
|
|
428
|
+
peach debug snapshot before
|
|
429
429
|
# interact
|
|
430
|
-
|
|
431
|
-
|
|
430
|
+
peach debug snapshot after
|
|
431
|
+
peach debug diff before after # added / removed / changed nodes
|
|
432
432
|
```
|
|
433
433
|
|
|
434
434
|
### debug channels
|
|
@@ -437,7 +437,7 @@ useful: `animated`, `layout`, `onlayout`, `render`, `sheets`, `portals`,
|
|
|
437
437
|
`gesture`, `scroll`, `text`, `image`.
|
|
438
438
|
|
|
439
439
|
```sh
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
440
|
+
peach debug enable animated,layout,sheets,portals
|
|
441
|
+
peach debug recent layout 20 # last 20 events on the channel
|
|
442
|
+
peach debug disable animated,layout,sheets,portals
|
|
443
443
|
```
|