peachsim 0.1.527

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (324) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +640 -0
  3. package/cli/app-config.ts +82 -0
  4. package/cli/app-fonts.ts +388 -0
  5. package/cli/app-project.ts +59 -0
  6. package/cli/app-splash.ts +171 -0
  7. package/cli/app-state-reset.ts +26 -0
  8. package/cli/auth.ts +184 -0
  9. package/cli/bin.ts +59 -0
  10. package/cli/bridge-diagnostics.ts +226 -0
  11. package/cli/bridge-flow-runner.ts +2806 -0
  12. package/cli/browser-backend.ts +44 -0
  13. package/cli/browser-evals.ts +96 -0
  14. package/cli/cli-update.ts +261 -0
  15. package/cli/cloud-client.ts +1530 -0
  16. package/cli/cloud-dispatch.ts +206 -0
  17. package/cli/cloud-session.ts +227 -0
  18. package/cli/command-contract.ts +221 -0
  19. package/cli/command-registry.ts +304 -0
  20. package/cli/commands/agent-wrapper.ts +1048 -0
  21. package/cli/commands/agent.ts +439 -0
  22. package/cli/commands/app-fonts.ts +99 -0
  23. package/cli/commands/assert.ts +542 -0
  24. package/cli/commands/auth.ts +71 -0
  25. package/cli/commands/box/bundle-plane.ts +71 -0
  26. package/cli/commands/box/checkout-plane.ts +256 -0
  27. package/cli/commands/box/plane-share.ts +208 -0
  28. package/cli/commands/box/rnx-command.ts +60 -0
  29. package/cli/commands/box/search-command.ts +157 -0
  30. package/cli/commands/box.ts +925 -0
  31. package/cli/commands/camera.ts +266 -0
  32. package/cli/commands/cleanup.ts +169 -0
  33. package/cli/commands/compat.ts +176 -0
  34. package/cli/commands/config.ts +34 -0
  35. package/cli/commands/control.ts +2154 -0
  36. package/cli/commands/cpu-profile.ts +941 -0
  37. package/cli/commands/daemon-mac-app.ts +165 -0
  38. package/cli/commands/daemon.ts +800 -0
  39. package/cli/commands/debug.ts +751 -0
  40. package/cli/commands/desktop.ts +39 -0
  41. package/cli/commands/detect.ts +201 -0
  42. package/cli/commands/detox.ts +481 -0
  43. package/cli/commands/device.ts +134 -0
  44. package/cli/commands/diagnose.ts +589 -0
  45. package/cli/commands/do-chain.ts +408 -0
  46. package/cli/commands/electron.ts +94 -0
  47. package/cli/commands/film.ts +379 -0
  48. package/cli/commands/flow.ts +1240 -0
  49. package/cli/commands/inspect/actions.ts +516 -0
  50. package/cli/commands/inspect/core.ts +2086 -0
  51. package/cli/commands/inspect/count.ts +17 -0
  52. package/cli/commands/inspect/describe.ts +119 -0
  53. package/cli/commands/inspect/env.ts +25 -0
  54. package/cli/commands/inspect/find.ts +169 -0
  55. package/cli/commands/inspect/get-layout.ts +53 -0
  56. package/cli/commands/inspect/keyboard.ts +54 -0
  57. package/cli/commands/inspect/list.ts +175 -0
  58. package/cli/commands/inspect/memory.ts +215 -0
  59. package/cli/commands/inspect/redaction.ts +39 -0
  60. package/cli/commands/inspect/resolve-target.ts +77 -0
  61. package/cli/commands/inspect/screens.ts +78 -0
  62. package/cli/commands/inspect/settle.ts +32 -0
  63. package/cli/commands/inspect/settling.ts +197 -0
  64. package/cli/commands/inspect/shared.ts +259 -0
  65. package/cli/commands/inspect/sleep.ts +15 -0
  66. package/cli/commands/inspect/tree.ts +23 -0
  67. package/cli/commands/inspect/url.ts +17 -0
  68. package/cli/commands/inspect/wait-event.ts +211 -0
  69. package/cli/commands/inspect/wait-idle.ts +25 -0
  70. package/cli/commands/inspect/wait-ready.ts +87 -0
  71. package/cli/commands/inspect/wait-selector.ts +59 -0
  72. package/cli/commands/inspect/wait.ts +32 -0
  73. package/cli/commands/inspect.ts +4738 -0
  74. package/cli/commands/install-cli.ts +275 -0
  75. package/cli/commands/install-desktop.ts +385 -0
  76. package/cli/commands/login.ts +357 -0
  77. package/cli/commands/logout.ts +24 -0
  78. package/cli/commands/maestro-generate.ts +375 -0
  79. package/cli/commands/maestro.ts +536 -0
  80. package/cli/commands/mode.ts +58 -0
  81. package/cli/commands/no-bridge-hint.ts +80 -0
  82. package/cli/commands/perf.ts +67 -0
  83. package/cli/commands/permissions.ts +203 -0
  84. package/cli/commands/platform.ts +410 -0
  85. package/cli/commands/preview.ts +103 -0
  86. package/cli/commands/profile.ts +106 -0
  87. package/cli/commands/react.ts +353 -0
  88. package/cli/commands/record.ts +1435 -0
  89. package/cli/commands/report-issue.ts +305 -0
  90. package/cli/commands/reset.ts +89 -0
  91. package/cli/commands/runtime.ts +348 -0
  92. package/cli/commands/screenshot-command.ts +106 -0
  93. package/cli/commands/screenshot-layers.ts +144 -0
  94. package/cli/commands/screenshot-mode.ts +38 -0
  95. package/cli/commands/screenshot.ts +492 -0
  96. package/cli/commands/screenshots-capture.ts +608 -0
  97. package/cli/commands/screenshots.ts +127 -0
  98. package/cli/commands/serve.ts +139 -0
  99. package/cli/commands/setup.ts +416 -0
  100. package/cli/commands/shell-boolean-mode.ts +82 -0
  101. package/cli/commands/skills.ts +468 -0
  102. package/cli/commands/slides.ts +357 -0
  103. package/cli/commands/state.ts +94 -0
  104. package/cli/commands/storage.ts +58 -0
  105. package/cli/commands/telemetry.ts +55 -0
  106. package/cli/commands/test.ts +535 -0
  107. package/cli/commands/three-mode.ts +771 -0
  108. package/cli/commands/timeline.ts +121 -0
  109. package/cli/commands/upgrade.ts +167 -0
  110. package/cli/commands/upload.ts +1203 -0
  111. package/cli/commands/version.ts +63 -0
  112. package/cli/commands/welcome.ts +17 -0
  113. package/cli/commands/what-happened.ts +328 -0
  114. package/cli/current-sim.ts +217 -0
  115. package/cli/desktop-companion.ts +315 -0
  116. package/cli/drivers/electron.ts +70 -0
  117. package/cli/drivers/index.ts +20 -0
  118. package/cli/drivers/playwright-provisioning.ts +184 -0
  119. package/cli/drivers/playwright-sim-host.ts +537 -0
  120. package/cli/drivers/playwright.ts +209 -0
  121. package/cli/drivers/registry.ts +65 -0
  122. package/cli/drivers/types.ts +102 -0
  123. package/cli/flow-export.ts +55 -0
  124. package/cli/flow-file.ts +142 -0
  125. package/cli/flow-live-status.ts +126 -0
  126. package/cli/flow-session.ts +140 -0
  127. package/cli/help-core.ts +143 -0
  128. package/cli/help.ts +44 -0
  129. package/cli/hidden-runtime-alias.ts +19 -0
  130. package/cli/hints.ts +214 -0
  131. package/cli/inspect-notice-state.ts +114 -0
  132. package/cli/internal-child.ts +176 -0
  133. package/cli/maestro-js.ts +323 -0
  134. package/cli/main.ts +704 -0
  135. package/cli/open-url.ts +8 -0
  136. package/cli/outbound-endpoints.ts +830 -0
  137. package/cli/parent-pid.ts +204 -0
  138. package/cli/parse-args.ts +189 -0
  139. package/cli/privacy.ts +53 -0
  140. package/cli/prompt.ts +56 -0
  141. package/cli/recording-access.ts +108 -0
  142. package/cli/registry.ts +2 -0
  143. package/cli/resolve-assets.ts +63 -0
  144. package/cli/rnx-in-process.ts +98 -0
  145. package/cli/run-registry.ts +226 -0
  146. package/cli/run-rnx-core.ts +148 -0
  147. package/cli/run-rnx.ts +137 -0
  148. package/cli/runtime-notes.ts +66 -0
  149. package/cli/runtime-summary.ts +25 -0
  150. package/cli/secure-file.ts +31 -0
  151. package/cli/self-invocation.ts +58 -0
  152. package/cli/send-to-box.ts +109 -0
  153. package/cli/setup-repository.ts +191 -0
  154. package/cli/shell-init.ts +98 -0
  155. package/cli/standalone.ts +4 -0
  156. package/cli/telemetry.ts +84 -0
  157. package/cli/ui.ts +68 -0
  158. package/cli/ws-bridge.ts +1020 -0
  159. package/detox/attempt-events.cjs +23 -0
  160. package/detox/colors.ts +54 -0
  161. package/detox/config-loader.ts +135 -0
  162. package/detox/element-types.ts +48 -0
  163. package/detox/expectations.ts +534 -0
  164. package/detox/gestures.ts +501 -0
  165. package/detox/index.ts +2694 -0
  166. package/detox/jest-preset.cjs +29 -0
  167. package/detox/jest-setup-after-env.cjs +22 -0
  168. package/detox/matchers.ts +30 -0
  169. package/detox/motion-change.cjs +109 -0
  170. package/detox/motion-change.d.cts +35 -0
  171. package/detox/navigation-lifecycle.ts +290 -0
  172. package/detox/navigation.ts +43 -0
  173. package/detox/proof-frame.cjs +114 -0
  174. package/detox/record-block-execution.cjs +78 -0
  175. package/detox/screenshots/animated-color-test-rest-norngh.png +0 -0
  176. package/detox/screenshots/color-test-after-drag-norngh.png +0 -0
  177. package/detox/screenshots/color-test-rest-norngh.png +0 -0
  178. package/detox/screenshots/theme-blue-toggle.png +0 -0
  179. package/detox/screenshots/theme-blue.png +0 -0
  180. package/detox/screenshots/theme-red-toggle.png +0 -0
  181. package/detox/screenshots/theme-red.png +0 -0
  182. package/dist-lib/agent-daemon-client.cjs +502 -0
  183. package/dist-lib/agent-events.cjs +48 -0
  184. package/dist-lib/agent-identity.cjs +53 -0
  185. package/dist-lib/agent-sessions.cjs +759 -0
  186. package/dist-lib/attached-projects.cjs +526 -0
  187. package/dist-lib/auth/shared-session.cjs +208 -0
  188. package/dist-lib/backend-origin.cjs +88 -0
  189. package/dist-lib/beta.cjs +41 -0
  190. package/dist-lib/beta.mjs +13 -0
  191. package/dist-lib/bridge-constants.cjs +161 -0
  192. package/dist-lib/bridge-contract-input.cjs +451 -0
  193. package/dist-lib/bridge-contract-input.mjs +414 -0
  194. package/dist-lib/bridge-contract.cjs +130 -0
  195. package/dist-lib/bridge-contract.mjs +94 -0
  196. package/dist-lib/capture-contract.cjs +220 -0
  197. package/dist-lib/capture-contract.mjs +190 -0
  198. package/dist-lib/cli-constants.cjs +32 -0
  199. package/dist-lib/cloud-contract.cjs +194 -0
  200. package/dist-lib/cloud-contract.mjs +145 -0
  201. package/dist-lib/cloud.cjs +670 -0
  202. package/dist-lib/cloud.mjs +639 -0
  203. package/dist-lib/config.cjs +96 -0
  204. package/dist-lib/detox/index.cjs +3789 -0
  205. package/dist-lib/detox/jest-preset.cjs +29 -0
  206. package/dist-lib/dev-bundle-resolution.cjs +290 -0
  207. package/dist-lib/home-paths.cjs +638 -0
  208. package/dist-lib/host/bridge-host.cjs +10903 -0
  209. package/dist-lib/host/fetch-proxy-handler.cjs +421 -0
  210. package/dist-lib/host/fetch-proxy-overrides.cjs +63 -0
  211. package/dist-lib/host/fetch-proxy-overrides.mjs +37 -0
  212. package/dist-lib/host/replacement-module-handler.cjs +469 -0
  213. package/dist-lib/host/websocket-proxy.cjs +298 -0
  214. package/dist-lib/index.cjs +4268 -0
  215. package/dist-lib/jump-to-source-babel.cjs +93 -0
  216. package/dist-lib/jump-to-source-native.cjs +112 -0
  217. package/dist-lib/menu.cjs +646 -0
  218. package/dist-lib/menu.mjs +604 -0
  219. package/dist-lib/metro-fingerprint-registry.cjs +186 -0
  220. package/dist-lib/metro-fingerprint-registry.mjs +156 -0
  221. package/dist-lib/metro-production-bundle.cjs +329 -0
  222. package/dist-lib/metro-production-bundle.mjs +295 -0
  223. package/dist-lib/metro.cjs +904 -0
  224. package/dist-lib/profiles.cjs +246 -0
  225. package/dist-lib/public-brand.cjs +39 -0
  226. package/dist-lib/react-native-host-modules.cjs +51 -0
  227. package/dist-lib/react-native-host-modules.mjs +25 -0
  228. package/dist-lib/render-mode.cjs +54 -0
  229. package/dist-lib/scripts/dev-server-scanner.cjs +1232 -0
  230. package/dist-lib/sdk.cjs +2433 -0
  231. package/dist-lib/sdk.mjs +2336 -0
  232. package/dist-lib/skills.cjs +39132 -0
  233. package/dist-lib/swift-submit.cjs +92 -0
  234. package/dist-lib/swift-submit.mjs +65 -0
  235. package/dist-lib/swift.cjs +1646 -0
  236. package/dist-lib/vite.cjs +1591 -0
  237. package/package.json +290 -0
  238. package/scripts/dev-server-scanner.ts +1291 -0
  239. package/scripts/optional-demo-registry.ts +113 -0
  240. package/skills/contrast/SKILL.md +165 -0
  241. package/skills/rnx-debug/SKILL.md +433 -0
  242. package/skills/rnx-perf/SKILL.md +399 -0
  243. package/skills/rnx-setup/SKILL.md +172 -0
  244. package/skills/rnx-test/SKILL.md +321 -0
  245. package/skills/rnx-visual/SKILL.md +126 -0
  246. package/src/agent-daemon-client.ts +410 -0
  247. package/src/agent-events.ts +71 -0
  248. package/src/agent-identity.ts +23 -0
  249. package/src/agent-prompt.ts +71 -0
  250. package/src/agent-sessions.ts +580 -0
  251. package/src/app-url.ts +39 -0
  252. package/src/attached-projects.ts +539 -0
  253. package/src/auth/shared-session.ts +235 -0
  254. package/src/backend-origin.ts +70 -0
  255. package/src/beta.ts +19 -0
  256. package/src/bridge-constants.ts +175 -0
  257. package/src/bridge-contract-input.ts +502 -0
  258. package/src/bridge-contract.ts +558 -0
  259. package/src/browser-cache.ts +16 -0
  260. package/src/capture-contract.ts +587 -0
  261. package/src/cli-constants.ts +1 -0
  262. package/src/cli-version.ts +40 -0
  263. package/src/cloud-contract.ts +274 -0
  264. package/src/cloud.ts +762 -0
  265. package/src/codex-client.ts +234 -0
  266. package/src/config.ts +132 -0
  267. package/src/connect.ts +101 -0
  268. package/src/dev-bundle-resolution.ts +346 -0
  269. package/src/dev-server-open.ts +198 -0
  270. package/src/disk-cleanup.ts +540 -0
  271. package/src/flow-timeout-scale.ts +15 -0
  272. package/src/home-paths.ts +806 -0
  273. package/src/host/agent-host.ts +666 -0
  274. package/src/host/bridge-host.ts +2788 -0
  275. package/src/host/fetch-proxy-handler.ts +449 -0
  276. package/src/host/fetch-proxy-overrides.ts +51 -0
  277. package/src/host/open-url.ts +89 -0
  278. package/src/host/plane-host.ts +203 -0
  279. package/src/host/replacement-module-handler.ts +158 -0
  280. package/src/host/websocket-proxy.ts +315 -0
  281. package/src/index.ts +71 -0
  282. package/src/jump-to-source-babel.ts +135 -0
  283. package/src/jump-to-source-native.ts +102 -0
  284. package/src/menu.ts +777 -0
  285. package/src/metro-fingerprint-registry.ts +302 -0
  286. package/src/metro-plugin.ts +341 -0
  287. package/src/metro-production-bundle.ts +471 -0
  288. package/src/native-dev-bundle-url.ts +118 -0
  289. package/src/native-seam-manifest.ts +341 -0
  290. package/src/playwright-host-log.ts +16 -0
  291. package/src/plist.ts +27 -0
  292. package/src/poll-until.ts +123 -0
  293. package/src/profiles.ts +179 -0
  294. package/src/public-brand.ts +9 -0
  295. package/src/react-native-host-modules.ts +26 -0
  296. package/src/render-mode.ts +27 -0
  297. package/src/rolldown-plugin-swift.ts +240 -0
  298. package/src/runtime-assets.ts +233 -0
  299. package/src/runtime-delivery.ts +54 -0
  300. package/src/screenshots/compose.ts +422 -0
  301. package/src/screenshots/frame-compose.ts +514 -0
  302. package/src/screenshots/orchestrate.ts +256 -0
  303. package/src/screenshots/org-deck.ts +91 -0
  304. package/src/screenshots/registry.ts +58 -0
  305. package/src/screenshots/schema.ts +364 -0
  306. package/src/sdk.ts +15 -0
  307. package/src/settings-bundle.ts +418 -0
  308. package/src/shell-bridge-identity.ts +15 -0
  309. package/src/sim-client.ts +697 -0
  310. package/src/skills/builtin/a11y-review.ts +132 -0
  311. package/src/skills/builtin/compat-check.ts +71 -0
  312. package/src/skills/builtin/maestro-test.ts +121 -0
  313. package/src/skills/builtin/perf-profile.ts +90 -0
  314. package/src/skills/builtin/screenshot-all.ts +52 -0
  315. package/src/skills/builtin/visual-diff.ts +100 -0
  316. package/src/skills/registry.ts +107 -0
  317. package/src/skills/types.ts +41 -0
  318. package/src/swift-submit.ts +185 -0
  319. package/src/swift.ts +7 -0
  320. package/src/team-machine-prompt.ts +73 -0
  321. package/src/vite-plugin-one.ts +264 -0
  322. package/src/vite-plugin-swift.ts +620 -0
  323. package/src/vite-plugin.ts +1946 -0
  324. package/src/worklets-babel.ts +250 -0
@@ -0,0 +1,433 @@
1
+ ---
2
+ name: rnx-debug
3
+ description: 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.
4
+ ---
5
+
6
+ # rnx debug
7
+
8
+ the foundational skill for "something is wrong with my app in rnx".
9
+ covers debugging, performance, and accessibility — three branches that
10
+ share the same CLI primitives, the same auto-settling contract, and the
11
+ same diff/snapshot workflow. start here for any rendering, interaction,
12
+ event-order, or correctness question. for pixel-level rendering fidelity
13
+ load `/rnx-visual` instead.
14
+
15
+ > needs a connected, pinned sim. if `rnx describe` errors, load
16
+ > `/rnx-setup` first.
17
+
18
+ ## principle — drive the CLI, don't probe by hand
19
+
20
+ for any rendering, animation, gesture, or interaction bug, reach for the
21
+ rnx CLI debug tooling **first** — `describe` and `find` to read the
22
+ tree, `debug snapshot` + `debug diff` to capture before/after, `debug
23
+ recent` on a channel and `perf shell` for frame-by-frame stats, and the
24
+ timeline for "what just happened". **do not** debug these by eye with
25
+ screenshots, sprinkle `console.log` through the render path, or spin up a
26
+ one-off browser-automation script. the canvas has no DOM to inspect, and a
27
+ CLI capture is reproducible, diffable, and shareable in a way a screenshot
28
+ never is.
29
+
30
+ if the existing CLI tools don't capture the issue cleanly — the animation
31
+ is too fast to read, the signal you need isn't on any channel, the
32
+ interaction spans a boundary the timeline doesn't section — the right move
33
+ is to **improve the debug tooling**, not to paper over it with throwaway
34
+ probes. add a durable, channel-gated, start/stop instrument that's off by
35
+ default (so baseline performance is untouched) and emits exactly the signal
36
+ you're chasing. a good capture command is one-shot reproducible, every
37
+ agent after you benefits from it, and the same capture can become a
38
+ regression test. a pile of ad-hoc logs helps no one and gets deleted.
39
+
40
+ ## route in
41
+
42
+ - "my app renders wrong / wrong props / wrong tree" → [debugging](#branch--debugging)
43
+ - "feels slow / drops frames / janks on scroll" → [performance](#branch--performance)
44
+ - "screen reader can't find this / wrong label / tap target too small" → [accessibility](#branch--accessibility)
45
+ - "I want to see what just happened" (ephemeral toast, async navigation,
46
+ fetch + alert sequence) → [the timeline](#the-timeline-what-happened)
47
+ - "I want pixel-level fidelity to iOS" → load `/rnx-visual`
48
+ - "I want to author a test" → load `/rnx-test`
49
+
50
+ ## anti-patterns (apply to every branch)
51
+
52
+ - **`a1`/`a2`/`b0` style ids mean rnx sims, never browser tabs.** when a user
53
+ says "look at a3", that's the `rnx list` sim id. do not open chrome
54
+ MCP unless the user explicitly says "use chrome" — the canvas has no
55
+ DOM to inspect anyway.
56
+ - **the CLI auto-settles. don't add `sleep`.** every read waits up to
57
+ 1800 ms for in-flight transitions to start; every write polls layout
58
+ hash until stable. if a read keeps racing its write, the fix is **never**
59
+ a blind `sleep` — it's `wait selector`, `wait ready`, `wait idle`, or
60
+ fixing the underlying animation-completion signal.
61
+ - **prefer `--testid` over text matching.** text drifts under i18n, copy
62
+ changes, and duplicate strings. add `testID` during implementation and
63
+ query against it.
64
+ - **pin a sim once.** if more than one is live, an unpinned command
65
+ refuses to choose. run `rnx use <id>` at the start of the workflow.
66
+ - **keep one sim and reuse its browser tab.** before `rnx open`, run
67
+ `rnx list --all`. pin the target and use `rnx do reload`; a plain
68
+ `rnx open <target>` also navigates the saved sim. reserve `--new` for a
69
+ genuinely concurrent sim. repeated browser trees consume memory and CPU on a
70
+ shared machine.
71
+ - **`debug eval` is an escape hatch.** if a top-level command feels
72
+ broken or missing, file an issue — every agent after you benefits from
73
+ a better CLI, not a pile of ad-hoc scripts.
74
+ - **sweep `get errors` and `get requests` after every repro.** the
75
+ one-line summary tells you the count grew; you still have to *look at
76
+ them*. a "fixed" behavior with a new console error is not fixed.
77
+ - **"found a testID" is not done.** done is: reliable repro + identified
78
+ root cause (specific node + prop, or event + handler) + verified fix.
79
+
80
+ ## the timeline ("what happened")
81
+
82
+ between two CLI calls, things happen invisibly — toasts flash, keyboards
83
+ open and close, screens push and pop, alerts fire and dismiss, async
84
+ fetches resolve. the timeline records them so you can ask "what
85
+ happened" instead of racing the UI with `find`.
86
+
87
+ ```sh
88
+ rnx timeline start # arm recording (cheap kinds default-on)
89
+ # reproduce the flow
90
+ rnx what-happened # events since the last CLI call
91
+ rnx what-happened --since 10s # absolute window
92
+ rnx what-happened --kinds toast,fetch # filter to a few kinds
93
+ rnx what-happened --summary # one-line counts
94
+ rnx what-happened --flow # section events by screen/route
95
+ ```
96
+
97
+ semantic kinds the timeline understands: `keyboard`, `screen`, `route`,
98
+ `alert`, `actionsheet`, `picker`, `notification`, `toast`, `scroll`,
99
+ `gesture`, `text-input`, `reanimated`, `animation`, `fetch`, `console`,
100
+ `app-launch`, `shell`. cheap kinds record by default; heavier kinds
101
+ (scroll, gesture, text-input, reanimated, animation) opt in via
102
+ `rnx timeline start scroll,gesture,…`.
103
+
104
+ every other CLI command also prints a one-line footer for events since
105
+ the last call — that's the headline indicator. when the footer is empty,
106
+ there's nothing new to look at; when it says `since last: 1 error · 1
107
+ toast · 1 screen push`, run `rnx what-happened` to see the detail.
108
+
109
+ > reach for the timeline first when the question involves *something
110
+ > that appeared briefly and disappeared*. it's faster than a screenshot
111
+ > and tells you the duration too.
112
+
113
+ ## automatic settling — when you actually need a manual wait
114
+
115
+ every CLI command already participates in a two-phase settle. you only
116
+ need a manual wait when:
117
+
118
+ 1. the CLI explicitly printed `⚠ auto-wait timed out after Nms — next
119
+ command may see mid-animation state` *and* your next read depends on
120
+ the animation finishing.
121
+ 2. the transition is longer than ~400 ms (full stack navigation,
122
+ crossfades, video first-frame, network-backed render).
123
+ 3. you want `--strict` settle, which also requires animation flags to
124
+ clear — only safe for apps with no perpetual background animation
125
+ (no pulsing dots, no shimmer, no looping Lottie).
126
+
127
+ ```sh
128
+ rnx do settle 5 # wait up to 5s for layout stability
129
+ rnx wait idle --max-ms 5000 # same thing under the `wait` verb
130
+ rnx wait idle --strict # also require animation flags clear
131
+ rnx do tap-id play --no-wait # skip auto-settle on one command
132
+ RNX_NO_AUTO_WAIT=1 rnx ... # disable auto-settle for a lane
133
+ ```
134
+
135
+ ## branch — debugging
136
+
137
+ the playbook for "wrong tree / wrong props / wrong handler":
138
+
139
+ ```sh
140
+ rnx describe # what's on screen now
141
+ rnx get errors 5 # any console smoke?
142
+ rnx find --testid <node> # locate the suspect
143
+ rnx debug snapshot before
144
+ # reproduce
145
+ rnx debug snapshot after
146
+ rnx debug diff before after # structural diff: what changed?
147
+ rnx what-happened # timeline events during the repro
148
+ ```
149
+
150
+ when the repro needs several closely timed inputs, replace the individual
151
+ write calls with one inline batch so WebSocket scheduling cannot change the
152
+ gesture:
153
+
154
+ ```sh
155
+ rnx do touch down 200 600 --then sleep 0.03 --then touch move 200 250 --then touch up 200 250
156
+ ```
157
+
158
+ for nested scroll ownership or momentum transfer, compare the shell's resolved
159
+ gesture chain with the published scroll registry:
160
+
161
+ ```sh
162
+ rnx debug state scroll-input
163
+ rnx debug state scroll-mirror
164
+ ```
165
+
166
+ reading `describe` output:
167
+
168
+ ```
169
+ [button] "Sign in" #loginButton @(0,347) 402x44 [bg:#006AFF fg:#fff] (tap)
170
+ <text> "Forgot?" @(341,287) 55x28 [fg:#666 fontSize:14]
171
+ ```
172
+
173
+ format: `[type] "text" #testID @(x,y) WxH [styles] (flags)`. coordinates
174
+ are points (CSS pixels), origin top-left, parent-relative.
175
+
176
+ for transitions, alerts, native UI, or anything spanning the shell ↔
177
+ tenant boundary, lean on the timeline before reaching for traces:
178
+
179
+ ```sh
180
+ rnx timeline start
181
+ # reproduce the launch / dismiss / alert
182
+ rnx what-happened --kinds shell,alert,screen,animation
183
+ ```
184
+
185
+ you're done when:
186
+
187
+ 1. repro is reliable (same input → same output)
188
+ 2. root cause is identified (specific node + prop, or event + handler,
189
+ not "something in the navigation stack")
190
+ 3. fix re-verified through the same `snapshot → reproduce → diff` loop
191
+
192
+ ## branch — performance
193
+
194
+ ```sh
195
+ rnx perf shell start # arm capture (also clears prior frames)
196
+ # reproduce the slow interaction
197
+ rnx perf shell stop # full report, including worst frames
198
+ rnx perf shell stop --json # machine-readable summary
199
+ ```
200
+
201
+ `perf shell` output:
202
+
203
+ ```
204
+ frames: 847
205
+ total: 14123ms
206
+ avg: 16.7ms
207
+ max: 42ms (⚠ dropped frames)
208
+ p95: 22.3ms
209
+ layout frames: 123
210
+ layout avg: 2.1ms
211
+ ```
212
+
213
+ frame budget: target **8 ms / frame (120 fps)** — render <4 ms, layout
214
+ <2 ms, JS/react <2 ms. heavier paints can fall back to the 16 ms / 60 fps
215
+ budget. **p95 >20 ms is visible jank for a scrolling surface.**
216
+
217
+ profiling a whole flow:
218
+
219
+ ```sh
220
+ rnx maestro test .maestro/scroll-feed.yaml --profile # per-step + frame stats
221
+ rnx perf cpu --duration 5 --output /tmp/trace.cpuprofile # sampled CPU
222
+ ```
223
+
224
+ common patterns → first probe:
225
+
226
+ | symptom | likely | next |
227
+ | --- | --- | --- |
228
+ | scroll jank | layout firing during scroll | `debug enable layout` + `debug recent layout 40` |
229
+ | anim stutter | `Animated.Value` on `width`/`height` | switch to `transform: [{ scale }]` or `translate` |
230
+ | first-tap lag | font / image still loading | `get requests` + `debug state image` |
231
+ | memory growth | live animation drivers not cleaned up | `debug state animations` |
232
+ | slow initial render | many text measurements | `debug recent text` on first paint |
233
+
234
+ debug channels that help, but cost 1–3 ms/frame on their own — enable
235
+ only what you're investigating:
236
+
237
+ ```sh
238
+ rnx debug enable layout,onlayout,render,animated
239
+ # reproduce
240
+ rnx debug recent layout 20 # last 20 layout events
241
+ rnx debug recent render 20 # last 20 draw passes
242
+ rnx debug disable layout,onlayout,render,animated
243
+ ```
244
+
245
+ you're done when: a p95 number for the interaction + named hot path +
246
+ remeasured (a fresh `perf start` between runs clears the buffer) and the
247
+ number moved.
248
+
249
+ watch out for:
250
+
251
+ - **dynamic format strings bust the text-measurement cache.** `${count}
252
+ messages` re-measures every change — render the number and the word as
253
+ separate `<Text>` nodes.
254
+ - **`--strict` settle hangs forever on perpetual animation.** anything
255
+ with a pulsing dot or looping Lottie will never go quiet under
256
+ `--strict`. use plain `wait idle` there.
257
+ - **p95 over a single run is noise.** take three runs minimum.
258
+
259
+ ## branch — accessibility
260
+
261
+ ```sh
262
+ rnx get a11y # roles, labels, hints, and target geometry
263
+ rnx get layout --styling # boxes, styles, and native pixel contrast
264
+ rnx describe --a11y # inline a11y info on every node
265
+ ```
266
+
267
+ native styled layout reads rendered pixels rather than inferring contrast from
268
+ tokens. it compares the normal frame with one CanvasKit capture where text is
269
+ suppressed and adds each text score to the existing layout row and issue list.
270
+
271
+ contrast summary format:
272
+
273
+ ```
274
+ #loginButton @(24,347) 120x24 font:16 color:#777 contrast:1.4/4.5 FAIL on:#888888 "Sign in"
275
+ ```
276
+
277
+ finding offenders fast:
278
+
279
+ ```sh
280
+ rnx find --no-label # interactive nodes missing label
281
+ rnx find --no-role # interactive nodes missing role
282
+ rnx find --pressable --max-dim 44 # undersized tap targets
283
+ ```
284
+
285
+ what gets checked:
286
+
287
+ - **missing labels** — interactive nodes without `accessibilityLabel`
288
+ - **missing roles** — `Pressable`/`Touchable` without `accessibilityRole`
289
+ - **missing hints** — complex interactions without `accessibilityHint`
290
+ - **touch target size** — tappable nodes with hitSlop-expanded rect <44×44
291
+ - **contrast** — run `rnx get layout --styling`; it samples final text and
292
+ text-suppressed background pixels, including gradients and composited opacity
293
+ - **label / visible-text mismatch** — label that reads differently from
294
+ the text VoiceOver would fall back to (often a translation bug)
295
+ - **duplicate labels** — two reachable nodes with identical labels on
296
+ one screen ("Open" + "Open" leaves no way to disambiguate)
297
+
298
+ triage order:
299
+
300
+ - **P0** — interactive node with no label or no role (blocks screen
301
+ reader entirely)
302
+ - **P1** — tap target <44×44, duplicate labels
303
+ - **P2** — contrast, label/visible-text mismatch
304
+
305
+ fix → verify loop (the same shape as debugging):
306
+
307
+ ```sh
308
+ rnx get a11y > before-a11y.txt
309
+ rnx get layout --styling --json > before-layout.json
310
+ # apply the fix
311
+ rnx get a11y > after-a11y.txt
312
+ rnx get layout --styling --json > after-layout.json
313
+ diff before-a11y.txt after-a11y.txt
314
+ diff before-layout.json after-layout.json
315
+ ```
316
+
317
+ fixing common cases:
318
+
319
+ ```tsx
320
+ // bad: icon button with no accessible name
321
+ <Pressable onPress={onBack}>
322
+ <ChevronLeftIcon />
323
+ </Pressable>
324
+
325
+ // good: labeled + roled + hinted + hitSlop'd
326
+ <Pressable
327
+ onPress={onBack}
328
+ accessibilityRole="button"
329
+ accessibilityLabel="Back"
330
+ accessibilityHint="Returns to the previous screen"
331
+ hitSlop={12} // bumps tap target to 44×44 minimum
332
+ >
333
+ <ChevronLeftIcon />
334
+ </Pressable>
335
+
336
+ // bad: text input with no programmatic label
337
+ <TextInput placeholder="Email" onChangeText={setEmail} />
338
+
339
+ // good: label survives even when placeholder is hidden
340
+ <TextInput
341
+ placeholder="Email"
342
+ accessibilityLabel="Email address"
343
+ onChangeText={setEmail}
344
+ />
345
+ ```
346
+
347
+ watch out for:
348
+
349
+ - **placeholders are not labels.** they disappear after the user types.
350
+ - **hitSlop expands the a11y rect too.** rarely need to make the
351
+ rendered button bigger — `hitSlop={12}` is usually enough.
352
+ - **`accessibilityRole="image"` is not an `alt` tag.** pair it with
353
+ `accessibilityLabel` or VoiceOver reads "image" and nothing else.
354
+ - **`importantForAccessibility="no-hide-descendants"` hides an entire
355
+ subtree.** useful for decorative chrome, dangerous if you forget it.
356
+
357
+ run the screen reader on a real device at least once before shipping —
358
+ labels that read fine on paper often sound robotic ("delete_message_btn_v2"
359
+ type names sneak in).
360
+
361
+ ## recovery — common failure modes
362
+
363
+ - **`describe` returns nothing** — no sim pinned, or the app isn't
364
+ loaded. load `/rnx-setup` and re-confirm.
365
+ - **`find` returns multiple matches** — narrow with `--testid`,
366
+ `--visible`, or both.
367
+ - **`perf shell` reports zero frames** — you didn't run `perf shell start`
368
+ first, or the capture window closed before any frame committed.
369
+ - **`get a11y` returns 100+ items** — narrow with `find --role`,
370
+ `find --pressable`, or `find --no-label`; the a11y tree is descriptive and
371
+ intentionally does not invent an `--issues` grading mode.
372
+ - **styled layout cannot capture pixels** — open a tenant app, dismiss system
373
+ overlays, and let the launch transition finish before retrying.
374
+ - **timeline footer keeps showing 1 error but `get errors` is empty** —
375
+ the footer reads "since last cursor advance"; `get errors` is absolute.
376
+ the error already scrolled out of the absolute ring buffer.
377
+
378
+ ## reference
379
+
380
+ ### finding and interacting
381
+
382
+ ```sh
383
+ rnx describe # all visible elements with styles
384
+ rnx describe button # filter by text/role/label/testID
385
+ rnx describe --testid foo # only the subtree under a testID
386
+ rnx describe --verbose # include every style property
387
+
388
+ rnx find "Sign in" # by text content
389
+ rnx find --testid loginButton
390
+ rnx find --role button
391
+ rnx find --pressable
392
+ rnx find --visible # only on-screen nodes
393
+
394
+ rnx do tap-id loginButton # tap by testID (preferred)
395
+ rnx do tap-text "Submit" # tap by text
396
+ rnx do tap 196 400 # tap at coordinates
397
+ rnx do type "hello world" # type into focused input
398
+ rnx do type-into emailInput "a@b" # focus then type
399
+ rnx do key return # special key (return, backspace, …)
400
+ rnx do scroll feed-list 0 500 # scroll a testID to absolute x/y offsets
401
+ rnx do swipe feed-list left # directional swipe
402
+ rnx do long-press messageRow 800 # ms hold
403
+ ```
404
+
405
+ ### errors and requests
406
+
407
+ ```sh
408
+ rnx get errors 5 # last 5 console errors
409
+ rnx get warnings 5
410
+ rnx get requests 5 # recent failed requests
411
+ rnx logs --since 30s # recent console output
412
+ rnx network --since 30s # recent network traffic
413
+ ```
414
+
415
+ ### snapshots and diff
416
+
417
+ ```sh
418
+ rnx debug snapshot before
419
+ # interact
420
+ rnx debug snapshot after
421
+ rnx debug diff before after # added / removed / changed nodes
422
+ ```
423
+
424
+ ### debug channels
425
+
426
+ useful: `animated`, `layout`, `onlayout`, `render`, `sheets`, `portals`,
427
+ `gesture`, `scroll`, `text`, `image`.
428
+
429
+ ```sh
430
+ rnx debug enable animated,layout,sheets,portals
431
+ rnx debug recent layout 20 # last 20 events on the channel
432
+ rnx debug disable animated,layout,sheets,portals
433
+ ```