[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-expo-eas-simulator":3,"mdc--3co6uk-key":37,"related-org-expo-eas-simulator":3146,"related-repo-expo-eas-simulator":3314},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":26,"repoUrl":27,"updatedAt":28,"license":29,"forks":30,"topics":31,"repo":32,"sourceUrl":35,"mdContent":36},"eas-simulator","run and control remote iOS and Android simulators","EAS service (paid). Run and control a user's app on a remote iOS\u002FAndroid simulator hosted on EAS cloud. Read before running any `eas simulator:*` commands - it has the current syntax for this experimental API. Use whenever the user needs a simulator they can't run locally - 'run my app on a cloud simulator', 'use eas simulator to run\u002Finstall\u002Fscreenshot my app', 'I'm on Linux\u002FCursor and need an iOS device', 'no sim on this box \u002F headless CI', 'let an agent click through my app and screenshot it', 'test my dev build on a remote sim with live reload', 'stream a sim to my browser' - even when they don't say 'EAS Simulator' or 'cloud'. On a host WITHOUT a local simulator (Linux, CI, cloud sandbox) it's the default; on macOS, do NOT auto-trigger for a plain 'run on the simulator' - use it only for a cloud\u002Fremote\u002Fshareable sim, an iOS version they lack, or an agent-driven session. NOT for local sims (expo run:ios, Xcode, Android Studio), EAS Build\u002FUpdate, web preview, or physical devices.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},"expo","Expo","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fexpo.png",[12,16,17,20,23],{"name":13,"slug":14,"type":15},"Android","android","tag",{"name":9,"slug":8,"type":15},{"name":18,"slug":19,"type":15},"iOS","ios",{"name":21,"slug":22,"type":15},"Mobile","mobile",{"name":24,"slug":25,"type":15},"CLI","cli",2190,"https:\u002F\u002Fgithub.com\u002Fexpo\u002Fskills","2026-07-31T05:52:18.602058","MIT",111,[],{"repoUrl":27,"stars":26,"forks":30,"topics":33,"description":34},[],"A collection of AI agent skills for working with Expo projects and Expo Application Services","https:\u002F\u002Fgithub.com\u002Fexpo\u002Fskills\u002Ftree\u002FHEAD\u002Fplugins\u002Fexpo\u002Fskills\u002Feas-simulator","---\nname: eas-simulator\ndescription: \"EAS service (paid). Run and control a user's app on a remote iOS\u002FAndroid simulator hosted on EAS cloud. Read before running any `eas simulator:*` commands - it has the current syntax for this experimental API. Use whenever the user needs a simulator they can't run locally - 'run my app on a cloud simulator', 'use eas simulator to run\u002Finstall\u002Fscreenshot my app', 'I'm on Linux\u002FCursor and need an iOS device', 'no sim on this box \u002F headless CI', 'let an agent click through my app and screenshot it', 'test my dev build on a remote sim with live reload', 'stream a sim to my browser' - even when they don't say 'EAS Simulator' or 'cloud'. On a host WITHOUT a local simulator (Linux, CI, cloud sandbox) it's the default; on macOS, do NOT auto-trigger for a plain 'run on the simulator' - use it only for a cloud\u002Fremote\u002Fshareable sim, an iOS version they lack, or an agent-driven session. NOT for local sims (expo run:ios, Xcode, Android Studio), EAS Build\u002FUpdate, web preview, or physical devices.\"\nversion: 1.0.0\nlicense: MIT\nallowed-tools: \"Bash(npx *eas-cli@*), Bash(npx *agent-device@*), Bash(npx expo *), Bash(eas *), Bash(expo *), Bash(xcodebuild*), Bash(pod*), Bash(argent *)\"\n---\n\n# EAS Simulator\n\n> **EAS service - costs apply.** EAS Simulator runs on Expo Application Services cloud infrastructure, a paid product with free-tier limits; remote simulator sessions use your plan's compute allowance. See https:\u002F\u002Fexpo.dev\u002Fpricing.\n\nEAS Simulator runs a remote iOS simulator or Android emulator on EAS infrastructure that you drive from your machine — from the CLI, from an AI agent (via `agent-device`), and from a browser preview. It's the unlock for **environments that can't run a simulator locally** (Linux boxes, cloud\u002Fbackground agents like Cursor Cloud), and for letting an agent *verify* a change on a real device instead of only reasoning about code.\n\nThe `simulator:*` commands are **experimental and hidden**, and need a recent eas-cli (≥ 20.3.0 as of writing) — which is why this skill runs everything via `npx --yes eas-cli@latest`. Flags and verbs may change; if a command fails, **`\u003Ccmd> --help` is authoritative.**\n\n## When to use\n\nThe frontmatter `description` carries the trigger phrases. In short: use this to get a user's app onto a **cloud** simulator and interact with it — especially from a Mac-less or cloud\u002Fsandbox agent. **Not** for local sims (`expo run:ios`, Xcode, Android Studio), store builds\u002Fsigning (that's EAS Build), or physical devices. For the macOS case, see *Cloud vs local* next.\n\n## Cloud vs local: decide this first\n\n- **Non-macOS** (Linux \u002F CI \u002F cloud sandbox like Cursor Cloud, detect via `uname -s` ≠ `Darwin`): the only way to get a sim — **proceed, once you've confirmed access** (see *Check availability first* below).\n- **macOS:** local sims exist and a cloud session costs money + latency, so **ask first** (\"a remote cloud sim — to share a live preview, offload, or test an iOS version you lack — or just run locally?\") unless the user explicitly said cloud\u002Fremote\u002Fshareable.\n- Always honor an explicit choice; for \"run it locally\" hand off to `expo run:ios` \u002F Xcode.\n\n```bash\n# Programmatic detection — run this to decide before doing anything else:\nif [ \"$(uname -s)\" != \"Darwin\" ] || ! xcrun --find simctl &>\u002Fdev\u002Fnull 2>&1; then\n  echo \"no local sim — proceed with EAS Simulator\"\nelse\n  echo \"local sim available — ask the user (cloud or local?)\"\nfi\n```\n\n## Prerequisites\n\n- **Run every `eas` command via `npx --yes eas-cli@latest …`** — guarantees a CLI new enough to have `simulator:*` (a global `eas` is often too old), and `--yes` skips npx's prompt. (Bare `eas` is fine if `eas --version` is current.)\n- **Authenticated.** Interactive machine → `npx --yes eas-cli@latest login`. **Cloud sandbox \u002F CI \u002F headless agent has no browser login — set `EXPO_TOKEN`** (expo.dev → Account → Access Tokens) in the env instead. Verify either way with `npx --yes eas-cli@latest whoami`.\n- Run from an Expo **project directory.** A fresh app needs one-time setup: `npx --yes eas-cli@latest init` to create\u002Flink the project (when there's no `projectId`), and **set `ios.bundleIdentifier`** in app config if it's missing — a fresh `create-expo-app` often has none, and `prebuild`\u002F`eas build` need it (they prompt or fail without it; e.g. `dev.\u003Cowner>.\u003Cslug>`). Read current config with `npx expo config --json` (it may live in `app.config.js`). The first Mode-C run is slow (native build); later runs reuse it.\n- A controller to drive the device. This skill uses **agent-device** (open source, MIT), run on demand via `npx agent-device@latest` — nothing globally installed. **argent** is an alternative (`--type argent` in `simulator:start`); see [references\u002Fcontrollers.md](.\u002Freferences\u002Fcontrollers.md).\n- **`.env.eas-simulator`** is written\u002Fmanaged by eas-cli (not this skill): it holds the session id (`EAS_SIMULATOR_SESSION_ID`) + the daemon URL\u002F**token**, so `get`\u002F`stop`\u002F`exec` default to that session (usually **omit `--id`**; pass `--id \u003Cid>` to target another). It carries a **token → keep it gitignored** (eas-cli marks it \"do not commit\" but may not add the ignore rule, and a fresh app's `.gitignore` won't cover it — add `.env.eas-simulator` if missing).\n- `--max-duration-minutes` is paid-plan only; otherwise a default applies.\n- **The command blocks assume a POSIX shell** (bash\u002Fzsh) — `printf`, `lsof`, `$(seq …)` loops won't run in cmd\u002FPowerShell. On Windows, run them in WSL or Git Bash, or translate as you go (the `eas-cli`\u002F`agent-device` invocations themselves are cross-platform).\n\n## Check availability first\n\nEAS Simulator is a **limited-access** EAS feature that is still rolling out, so it isn't enabled on every account. Confirm access **before** starting a session — this is a read-only check: no session, no billing.\n\n```bash\nnpx --yes eas-cli@latest simulator:availability --json\n# → {\"available\": true, ...}  enabled → continue to the core loop\n# → {\"available\": false, ...} not enabled → do NOT start a session\n```\n\nIf it's **not** available, don't call `simulator:start` (it will fail). Instead, hand off gracefully so you keep making progress without this skill:\n- Tell the user EAS Simulator isn't available on their account yet — it's coming soon.\n- Fall back to their normal local path for the actual goal — `expo run:ios` \u002F Xcode \u002F Android Studio for a local sim\u002Femulator, an EAS Build, or whatever else fits. Don't dead-end on the cloud sim; the request was almost never \"use EAS Simulator specifically.\"\n\n(If `simulator:availability` isn't recognized, the CLI is too old — upgrade, or treat a `not enabled for this account` error from `simulator:start` the same way: stop and fall back.)\n\n## The core loop (always the same)\n\nA session is: **start → (install your app) → drive → stop.** `eas-cli` owns the *session*; the device *verbs* (open\u002Ftap\u002Fscreenshot) come from the controller, which `npx --yes eas-cli@latest simulator:exec` runs for you with the session's connection env loaded.\n\n```bash\n# 1. Start a session (boots the remote sim + agent-device daemon; writes .env.eas-simulator).\nprintf '# managed by eas-cli\\n' > .env.eas-simulator   # clear any stale session first\nnpx --yes eas-cli@latest simulator:start --platform ios --type agent-device --non-interactive\n#    Then confirm it's live: simulator:get --json → status IN_PROGRESS (bounded poll in run-your-app.md).\n\n# 2. Drive it through `exec` (loads the session env, then runs the command you give it).\n#    agent-device runs on demand via npx — nothing installed globally.\nnpx --yes eas-cli@latest simulator:exec npx agent-device@latest open \u003Capp-or-url> --platform ios\nnpx --yes eas-cli@latest simulator:exec npx agent-device@latest snapshot -i          # interactive UI tree → @e1, @e2 refs\nnpx --yes eas-cli@latest simulator:exec npx agent-device@latest press @e2            # tap a ref (NOTE: 'press', not 'tap')\nnpx --yes eas-cli@latest simulator:exec npx agent-device@latest screenshot .\u002Fshot.png\n\n# 3. Stop (ends billing; tears down the VM) and reset the dotenv. Omit --id to target the dotenv session.\nnpx --yes eas-cli@latest simulator:stop\nprintf '# managed by eas-cli\\n' > .env.eas-simulator\n```\n\nTo **watch** it live, hand the user the `webPreviewUrl` that `start` prints (an `--type agent-device` iOS session runs serve-sim alongside the daemon, so it emits one — agent control *and* a browser preview in one session; Android has no preview, and `--type serve-sim` is preview-only). **This URL is for the *user's* browser — you cannot open it for them, and it must never touch the sim:**\n- **\"Open it here\" (Cursor\u002FVS Code)** → print the URL on its own line and tell the user to open Simple Browser (`Cmd\u002FCtrl+Shift+P` → \"Simple Browser: Show\") and paste it. Then **stop**: do not shell out to a system browser or a Cursor\u002FVS Code URL handler, and do not ask \"did a tab appear?\" — you can't confirm it, the handoff is done.\n- **Never `open` the `webPreviewUrl` on the sim.** It's a browser preview, not a deep link and not an `agent-device open` argument; routing it to the device renders a browser-in-a-browser (a real past failure).\n- **Headless agent** (no display) → just return the URL as the deliverable.\n- **Keeping it alive for the user to drive** → bound it: start with `--max-duration-minutes N` so it auto-stops; tell them it bills until stopped and when it auto-stops; offer to reopen\u002Fextend when it ends. (This is the one case where \"stop right away\" doesn't apply; one-shot `screenshot`\u002F`get` runs still stop immediately.)\n\n`start` also prints a job-run URL.\n\n## Commands at a glance\n\n| Command | Purpose |\n|---|---|\n| `npx --yes eas-cli@latest simulator:start --platform ios\\|android [--type agent-device\\|argent\\|serve-sim] [--package-version X] [--max-duration-minutes N] [--non-interactive] [--json]` | Create a session; boot the sim + controller; write `.env.eas-simulator`; print `webPreviewUrl` + job-run URL. **`--json` suppresses the `.env.eas-simulator` write** — omit it for the `exec` flow, or set the env yourself from `remoteConfig`. |\n| `npx --yes eas-cli@latest simulator:exec \u003Ccmd> [args…]` | Load `.env.eas-simulator`, then run `\u003Ccmd>` with that env. The bridge to the controller. |\n| `npx --yes eas-cli@latest simulator:get [--id] [--json]` | Session status + connection details. **Use this to confirm readiness** (see *Operating principles*). |\n| `npx --yes eas-cli@latest simulator:list [--status …] [--type …] [--platform …]` | List an app's sessions |\n| `npx --yes eas-cli@latest simulator:stop [--id]` | Stop a session (idempotent) |\n\n## Running the user's app — pick a mode\n\nThe remote sim boots **blank — no Expo Go, no apps.** Install a build, then drive it — but **match the build *type* to the goal first** (the box below); that's where live-session runs derail. Full sequences: [references\u002Frun-your-app.md](.\u002Freferences\u002Frun-your-app.md) — read before running a mode.\n\n> **Match the build to the goal before installing anything — this is where live-session runs derail.** Two traps, same root (grabbing a build that doesn't fit the request):\n> 1. **Wrong type.** Live edits (Mode C) **require a dev build.** A *static* build — a local Release (A), the default EAS sim build (B), or **any build left on the sim from an earlier screenshot run** — freezes its JS at build time and **can never hot-reload.** For a live request, **ignore existing builds entirely** and install a **dev** build (local Debug, or an EAS build with `developmentClient: true`). Never reconnect Metro to a static build hoping it'll reload — it won't.\n> 2. **Stale.** A static look must match current source — reuse only a fingerprint-matched build, else build fresh; reuse is explicit-only.\n>\n> So a leftover EAS\u002Frelease build is **not** a shortcut for \"iterate live\" — it's the wrong binary. The fact that a build *exists* never makes it the right one.\n\n| Mode | What it is | Choose when | Live edits? |\n|---|---|---|---|\n| **A — Local release build** | Build a Release `.app` locally, `agent-device install` it (uploads) | User has a Mac toolchain and wants a quick \"run my current code on a cloud device\" | No (rebuild to see changes) |\n| **B — EAS build** (rare, explicit-only) | `eas build` a simulator build, `agent-device install-from-source \u003Curl>` (the VM downloads it) | **Only when explicitly asked** — the user names an existing\u002FEAS build, or wants a static EAS artifact for CI\u002Fsharing. Not for \"show me\"\u002F\"iterate\" (use C). Sim builds need no credentials. | No |\n| **C — Local dev build + tunnel** | Dev (Debug) build + `EXPO_UNSTABLE_TUNNEL_V2=1 expo start --tunnel` + connect the dev client to Metro | **The agentic edit-and-see loop** — change code and see it live (Fast Refresh) | **Yes** |\n\nQuick decision — **default to C; A and B are explicit-only:**\n- **C (almost everything):** iterate, interact, poke the app, live edits — *and* most \"show me my app\" (current code needs a build anyway, so live+current wins). Mac → dev client builds locally; no Mac → build it on EAS (`developmentClient: true`). **Unsure → C.**\n- **A:** only an explicit one-shot **static** screenshot on a Mac.\n- **B:** only when the user names an existing\u002FEAS build or wants a static EAS artifact (CI\u002Fsharing) — see the box above for why a static build is the wrong tool for \"iterate.\"\n\n## Driving the device (agent-device)\n\n`agent-device` is the controller. Common verbs (run each as `npx --yes eas-cli@latest simulator:exec npx agent-device@latest \u003Cverb>`):\n\n| Verb | Does |\n|---|---|\n| `apps --platform ios` | List user-installed apps (the blank sim shows none); add `--all` to include system apps |\n| `install \u003CappId> \u003Cpath> --platform ios` | Install a local `.app` (uploads it) |\n| `install-from-source \u003Curl> --platform ios` | Install from a URL — the VM downloads it (use for EAS artifacts) |\n| `open \u003CappId\\|deep-link> --platform ios` | Launch an app (bundle id) or follow an app **deep link** (`exp+slug:\u002F\u002F…`). A first-time deep link raises a system **\"Open in '\u003Capp>'?\"** dialog — expect it (don't burn a snapshot discovering it) and `press 'label=\"Open\"'` to hand off; it can be slow, so bound it with agent-device's own `--timeout` (e.g. `press 'label=\"Open\"' --timeout 120000`) — **not** a shell `timeout` wrapper (macOS has no `timeout` binary). (Mode C sidesteps this dialog for the Metro-connect link via \"Enter URL manually\" — see run-your-app.md.) **Not** for the `webPreviewUrl` — that's a browser preview for the user, never the device. |\n| `snapshot -i` | Interactive accessibility tree → `@e1`-style refs |\n| `press \u003Cref\\|selector>` | Tap (e.g. `press @e2` or `press 'label=\"Open\"'`) — **the tap verb is `press`, not `tap`** |\n| `fill \u003Cref> \"text\"` | Type into a field |\n| `screenshot \u003Cpath>` | Capture the screen to a local PNG (downloaded from the daemon) — requires an app to be open (`open` first) |\n| `metro prepare` \u002F `metro reload` | Point a dev client at Metro \u002F reload (Mode C) |\n\nFor the full verb set and the `argent` controller alternative, see [references\u002Fcontrollers.md](.\u002Freferences\u002Fcontrollers.md).\n\n## Operating principles\n\nThe non-obvious mental model worth internalizing. Specific error→fix lookups (hung verbs, `tap`→`press`, `--platform`, `--json`, `pod install` locale, orphaned sessions, boot variability) live in [references\u002Ftroubleshooting.md](.\u002Freferences\u002Ftroubleshooting.md).\n\n1. **Establish ground truth, then reset — don't patch-loop.** Never assume an existing session or Metro is yours or healthy. Before driving, confirm:\n   - **cwd** — you're in the intended Expo project dir (a misdirected `start`\u002F`exec` sessions the *wrong app* + drops a stray `.env.eas-simulator`; `pwd` \u002F check `app.json`).\n   - **session live** — `IN_PROGRESS` via `simulator:get --json` (a stopped session keeps its id + `remoteConfig`, so the dotenv alone isn't proof).\n   - **one Metro on `:8081`** — reuse if it's yours, else free the port before starting (run-your-app.md).\n   - **build fits intent** — a **release build can't live-reload**; if live edits are wanted and a release build is installed, **install the dev build, don't reconnect**.\n\n   If current code isn't rendering after your **first** connect, stop poking live state: **reset to baseline** (stop session → clear dotenv → kill Metro) and redo the mode **once**; a second failure → stop and report. Never restart Metro in place, reconnect more than once, rebuild the native client to fix a JS\u002Fconnection problem, or surface a preview URL while state is unknown. (A daemon drop — `ERR_NGROK_3200` \u002F `Remote daemon is unavailable` — is the same: reset, don't retry.)\n2. **`exec` is a wrapper, not a driver.** `simulator:exec` loads `.env.eas-simulator` and spawns the command you pass; the device verbs come from the controller (`npx agent-device@latest`). There is no `simulator:tap`.\n3. **Act immediately; don't park an idle session.** Sessions are short-lived — install and drive right after `start`. Leaving one idle drops the tunnel\u002Fdaemon (→ reset, per #1).\n4. **Stop on every exit path (billing) and reset the dotenv.** `--non-interactive` doesn't auto-stop, and a forgotten session bills until stopped. Don't `start` again to \"retry\" a slow boot — that orphans a second billed session.\n5. **Screenshot only the correct, fresh build.** Mode C only after the dev client connects to Metro; A\u002FB only from a build matching current source — reusing a pre-existing build is the #1 \"my edits don't show\" cause (see the build caveat above). (`9:41` in the status bar is the sim default, not staleness.)\n\n## Stop and clean up\n\nStop the session (ends billing) **and reset the dotenv** so a later run doesn't try to reuse the dead session:\n\n```bash\nnpx --yes eas-cli@latest simulator:stop          # omit --id → stops the dotenv session (or pass --id \u003Cid>)\nprintf '# managed by eas-cli\\n' > .env.eas-simulator   # clear the stale session id so it isn't reused\n# if you started Metro for Mode C, stop it too (Ctrl+C in its terminal, or kill the expo process)\n```\n\n## References\n\n- [references\u002Frun-your-app.md](.\u002Freferences\u002Frun-your-app.md) — full command sequences for modes A, B, and C (read before running a mode).\n- [references\u002Fcontrollers.md](.\u002Freferences\u002Fcontrollers.md) — agent-device verb reference and the `argent` alternative.\n- [references\u002Ftroubleshooting.md](.\u002Freferences\u002Ftroubleshooting.md) — concrete errors and fixes.\n\nSource of truth: Expo docs and the `eas` \u002F `agent-device` CLIs (`npx --yes eas-cli@latest simulator:* --help`, `agent-device --help`). This skill teaches how to apply them; it doesn't replace them.\n\n## Submitting Feedback\nIf you encounter errors, misleading or outdated information in this skill, report it so Expo can improve:\n```bash\nnpx --yes submit-expo-feedback@latest --category skills --subject \"eas-simulator\" \"\u003Cactionable feedback>\"\n```\nOnly submit when you have something specific and actionable to report. Include as much relevant context as possible.\n",{"data":38,"body":41},{"name":4,"description":6,"version":39,"license":29,"allowed-tools":40},"1.0.0","Bash(npx *eas-cli@*), Bash(npx *agent-device@*), Bash(npx expo *), Bash(eas *), Bash(expo *), Bash(xcodebuild*), Bash(pod*), Bash(argent *)",{"type":42,"children":43},"root",[44,52,78,107,146,153,195,201,275,469,475,867,872,891,942,961,981,1009,1015,1056,1443,1506,1608,1618,1624,1813,1819,1853,1958,2120,2130,2187,2193,2211,2543,2560,2565,2611,2895,2901,2913,2985,2991,3028,3061,3067,3072,3135,3140],{"type":45,"tag":46,"props":47,"children":48},"element","h1",{"id":4},[49],{"type":50,"value":51},"text","EAS Simulator",{"type":45,"tag":53,"props":54,"children":55},"blockquote",{},[56],{"type":45,"tag":57,"props":58,"children":59},"p",{},[60,66,68,76],{"type":45,"tag":61,"props":62,"children":63},"strong",{},[64],{"type":50,"value":65},"EAS service - costs apply.",{"type":50,"value":67}," EAS Simulator runs on Expo Application Services cloud infrastructure, a paid product with free-tier limits; remote simulator sessions use your plan's compute allowance. See ",{"type":45,"tag":69,"props":70,"children":74},"a",{"href":71,"rel":72},"https:\u002F\u002Fexpo.dev\u002Fpricing",[73],"nofollow",[75],{"type":50,"value":71},{"type":50,"value":77},".",{"type":45,"tag":57,"props":79,"children":80},{},[81,83,90,92,97,99,105],{"type":50,"value":82},"EAS Simulator runs a remote iOS simulator or Android emulator on EAS infrastructure that you drive from your machine — from the CLI, from an AI agent (via ",{"type":45,"tag":84,"props":85,"children":87},"code",{"className":86},[],[88],{"type":50,"value":89},"agent-device",{"type":50,"value":91},"), and from a browser preview. It's the unlock for ",{"type":45,"tag":61,"props":93,"children":94},{},[95],{"type":50,"value":96},"environments that can't run a simulator locally",{"type":50,"value":98}," (Linux boxes, cloud\u002Fbackground agents like Cursor Cloud), and for letting an agent ",{"type":45,"tag":100,"props":101,"children":102},"em",{},[103],{"type":50,"value":104},"verify",{"type":50,"value":106}," a change on a real device instead of only reasoning about code.",{"type":45,"tag":57,"props":108,"children":109},{},[110,112,118,120,125,127,133,135],{"type":50,"value":111},"The ",{"type":45,"tag":84,"props":113,"children":115},{"className":114},[],[116],{"type":50,"value":117},"simulator:*",{"type":50,"value":119}," commands are ",{"type":45,"tag":61,"props":121,"children":122},{},[123],{"type":50,"value":124},"experimental and hidden",{"type":50,"value":126},", and need a recent eas-cli (≥ 20.3.0 as of writing) — which is why this skill runs everything via ",{"type":45,"tag":84,"props":128,"children":130},{"className":129},[],[131],{"type":50,"value":132},"npx --yes eas-cli@latest",{"type":50,"value":134},". Flags and verbs may change; if a command fails, ",{"type":45,"tag":61,"props":136,"children":137},{},[138,144],{"type":45,"tag":84,"props":139,"children":141},{"className":140},[],[142],{"type":50,"value":143},"\u003Ccmd> --help",{"type":50,"value":145}," is authoritative.",{"type":45,"tag":147,"props":148,"children":150},"h2",{"id":149},"when-to-use",[151],{"type":50,"value":152},"When to use",{"type":45,"tag":57,"props":154,"children":155},{},[156,158,164,166,171,173,178,180,186,188,193],{"type":50,"value":157},"The frontmatter ",{"type":45,"tag":84,"props":159,"children":161},{"className":160},[],[162],{"type":50,"value":163},"description",{"type":50,"value":165}," carries the trigger phrases. In short: use this to get a user's app onto a ",{"type":45,"tag":61,"props":167,"children":168},{},[169],{"type":50,"value":170},"cloud",{"type":50,"value":172}," simulator and interact with it — especially from a Mac-less or cloud\u002Fsandbox agent. ",{"type":45,"tag":61,"props":174,"children":175},{},[176],{"type":50,"value":177},"Not",{"type":50,"value":179}," for local sims (",{"type":45,"tag":84,"props":181,"children":183},{"className":182},[],[184],{"type":50,"value":185},"expo run:ios",{"type":50,"value":187},", Xcode, Android Studio), store builds\u002Fsigning (that's EAS Build), or physical devices. For the macOS case, see ",{"type":45,"tag":100,"props":189,"children":190},{},[191],{"type":50,"value":192},"Cloud vs local",{"type":50,"value":194}," next.",{"type":45,"tag":147,"props":196,"children":198},{"id":197},"cloud-vs-local-decide-this-first",[199],{"type":50,"value":200},"Cloud vs local: decide this first",{"type":45,"tag":202,"props":203,"children":204},"ul",{},[205,246,263],{"type":45,"tag":206,"props":207,"children":208},"li",{},[209,214,216,222,224,230,232,237,239,244],{"type":45,"tag":61,"props":210,"children":211},{},[212],{"type":50,"value":213},"Non-macOS",{"type":50,"value":215}," (Linux \u002F CI \u002F cloud sandbox like Cursor Cloud, detect via ",{"type":45,"tag":84,"props":217,"children":219},{"className":218},[],[220],{"type":50,"value":221},"uname -s",{"type":50,"value":223}," ≠ ",{"type":45,"tag":84,"props":225,"children":227},{"className":226},[],[228],{"type":50,"value":229},"Darwin",{"type":50,"value":231},"): the only way to get a sim — ",{"type":45,"tag":61,"props":233,"children":234},{},[235],{"type":50,"value":236},"proceed, once you've confirmed access",{"type":50,"value":238}," (see ",{"type":45,"tag":100,"props":240,"children":241},{},[242],{"type":50,"value":243},"Check availability first",{"type":50,"value":245}," below).",{"type":45,"tag":206,"props":247,"children":248},{},[249,254,256,261],{"type":45,"tag":61,"props":250,"children":251},{},[252],{"type":50,"value":253},"macOS:",{"type":50,"value":255}," local sims exist and a cloud session costs money + latency, so ",{"type":45,"tag":61,"props":257,"children":258},{},[259],{"type":50,"value":260},"ask first",{"type":50,"value":262}," (\"a remote cloud sim — to share a live preview, offload, or test an iOS version you lack — or just run locally?\") unless the user explicitly said cloud\u002Fremote\u002Fshareable.",{"type":45,"tag":206,"props":264,"children":265},{},[266,268,273],{"type":50,"value":267},"Always honor an explicit choice; for \"run it locally\" hand off to ",{"type":45,"tag":84,"props":269,"children":271},{"className":270},[],[272],{"type":50,"value":185},{"type":50,"value":274}," \u002F Xcode.",{"type":45,"tag":276,"props":277,"children":282},"pre",{"className":278,"code":279,"language":280,"meta":281,"style":281},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# Programmatic detection — run this to decide before doing anything else:\nif [ \"$(uname -s)\" != \"Darwin\" ] || ! xcrun --find simctl &>\u002Fdev\u002Fnull 2>&1; then\n  echo \"no local sim — proceed with EAS Simulator\"\nelse\n  echo \"local sim available — ask the user (cloud or local?)\"\nfi\n","bash","",[283],{"type":45,"tag":84,"props":284,"children":285},{"__ignoreMap":281},[286,298,406,430,439,460],{"type":45,"tag":287,"props":288,"children":291},"span",{"class":289,"line":290},"line",1,[292],{"type":45,"tag":287,"props":293,"children":295},{"style":294},"--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic",[296],{"type":50,"value":297},"# Programmatic detection — run this to decide before doing anything else:\n",{"type":45,"tag":287,"props":299,"children":301},{"class":289,"line":300},2,[302,308,314,319,325,331,336,341,346,350,355,360,365,370,375,380,385,390,396,401],{"type":45,"tag":287,"props":303,"children":305},{"style":304},"--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic",[306],{"type":50,"value":307},"if",{"type":45,"tag":287,"props":309,"children":311},{"style":310},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[312],{"type":50,"value":313}," [",{"type":45,"tag":287,"props":315,"children":316},{"style":310},[317],{"type":50,"value":318}," \"$(",{"type":45,"tag":287,"props":320,"children":322},{"style":321},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[323],{"type":50,"value":324},"uname",{"type":45,"tag":287,"props":326,"children":328},{"style":327},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[329],{"type":50,"value":330}," -s",{"type":45,"tag":287,"props":332,"children":333},{"style":310},[334],{"type":50,"value":335},")\"",{"type":45,"tag":287,"props":337,"children":338},{"style":310},[339],{"type":50,"value":340}," !=",{"type":45,"tag":287,"props":342,"children":343},{"style":310},[344],{"type":50,"value":345}," \"",{"type":45,"tag":287,"props":347,"children":348},{"style":327},[349],{"type":50,"value":229},{"type":45,"tag":287,"props":351,"children":352},{"style":310},[353],{"type":50,"value":354},"\"",{"type":45,"tag":287,"props":356,"children":357},{"style":310},[358],{"type":50,"value":359}," ]",{"type":45,"tag":287,"props":361,"children":362},{"style":310},[363],{"type":50,"value":364}," ||",{"type":45,"tag":287,"props":366,"children":367},{"style":310},[368],{"type":50,"value":369}," !",{"type":45,"tag":287,"props":371,"children":372},{"style":321},[373],{"type":50,"value":374}," xcrun",{"type":45,"tag":287,"props":376,"children":377},{"style":327},[378],{"type":50,"value":379}," --find",{"type":45,"tag":287,"props":381,"children":382},{"style":327},[383],{"type":50,"value":384}," simctl",{"type":45,"tag":287,"props":386,"children":387},{"style":310},[388],{"type":50,"value":389}," &>",{"type":45,"tag":287,"props":391,"children":393},{"style":392},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[394],{"type":50,"value":395},"\u002Fdev\u002Fnull ",{"type":45,"tag":287,"props":397,"children":398},{"style":310},[399],{"type":50,"value":400},"2>&1;",{"type":45,"tag":287,"props":402,"children":403},{"style":304},[404],{"type":50,"value":405}," then\n",{"type":45,"tag":287,"props":407,"children":409},{"class":289,"line":408},3,[410,416,420,425],{"type":45,"tag":287,"props":411,"children":413},{"style":412},"--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF",[414],{"type":50,"value":415},"  echo",{"type":45,"tag":287,"props":417,"children":418},{"style":310},[419],{"type":50,"value":345},{"type":45,"tag":287,"props":421,"children":422},{"style":327},[423],{"type":50,"value":424},"no local sim — proceed with EAS Simulator",{"type":45,"tag":287,"props":426,"children":427},{"style":310},[428],{"type":50,"value":429},"\"\n",{"type":45,"tag":287,"props":431,"children":433},{"class":289,"line":432},4,[434],{"type":45,"tag":287,"props":435,"children":436},{"style":304},[437],{"type":50,"value":438},"else\n",{"type":45,"tag":287,"props":440,"children":442},{"class":289,"line":441},5,[443,447,451,456],{"type":45,"tag":287,"props":444,"children":445},{"style":412},[446],{"type":50,"value":415},{"type":45,"tag":287,"props":448,"children":449},{"style":310},[450],{"type":50,"value":345},{"type":45,"tag":287,"props":452,"children":453},{"style":327},[454],{"type":50,"value":455},"local sim available — ask the user (cloud or local?)",{"type":45,"tag":287,"props":457,"children":458},{"style":310},[459],{"type":50,"value":429},{"type":45,"tag":287,"props":461,"children":463},{"class":289,"line":462},6,[464],{"type":45,"tag":287,"props":465,"children":466},{"style":304},[467],{"type":50,"value":468},"fi\n",{"type":45,"tag":147,"props":470,"children":472},{"id":471},"prerequisites",[473],{"type":50,"value":474},"Prerequisites",{"type":45,"tag":202,"props":476,"children":477},{},[478,539,577,666,715,809,820],{"type":45,"tag":206,"props":479,"children":480},{},[481,500,502,507,509,514,516,522,524,529,531,537],{"type":45,"tag":61,"props":482,"children":483},{},[484,486,492,494],{"type":50,"value":485},"Run every ",{"type":45,"tag":84,"props":487,"children":489},{"className":488},[],[490],{"type":50,"value":491},"eas",{"type":50,"value":493}," command via ",{"type":45,"tag":84,"props":495,"children":497},{"className":496},[],[498],{"type":50,"value":499},"npx --yes eas-cli@latest …",{"type":50,"value":501}," — guarantees a CLI new enough to have ",{"type":45,"tag":84,"props":503,"children":505},{"className":504},[],[506],{"type":50,"value":117},{"type":50,"value":508}," (a global ",{"type":45,"tag":84,"props":510,"children":512},{"className":511},[],[513],{"type":50,"value":491},{"type":50,"value":515}," is often too old), and ",{"type":45,"tag":84,"props":517,"children":519},{"className":518},[],[520],{"type":50,"value":521},"--yes",{"type":50,"value":523}," skips npx's prompt. (Bare ",{"type":45,"tag":84,"props":525,"children":527},{"className":526},[],[528],{"type":50,"value":491},{"type":50,"value":530}," is fine if ",{"type":45,"tag":84,"props":532,"children":534},{"className":533},[],[535],{"type":50,"value":536},"eas --version",{"type":50,"value":538}," is current.)",{"type":45,"tag":206,"props":540,"children":541},{},[542,547,549,555,557,568,570,576],{"type":45,"tag":61,"props":543,"children":544},{},[545],{"type":50,"value":546},"Authenticated.",{"type":50,"value":548}," Interactive machine → ",{"type":45,"tag":84,"props":550,"children":552},{"className":551},[],[553],{"type":50,"value":554},"npx --yes eas-cli@latest login",{"type":50,"value":556},". ",{"type":45,"tag":61,"props":558,"children":559},{},[560,562],{"type":50,"value":561},"Cloud sandbox \u002F CI \u002F headless agent has no browser login — set ",{"type":45,"tag":84,"props":563,"children":565},{"className":564},[],[566],{"type":50,"value":567},"EXPO_TOKEN",{"type":50,"value":569}," (expo.dev → Account → Access Tokens) in the env instead. Verify either way with ",{"type":45,"tag":84,"props":571,"children":573},{"className":572},[],[574],{"type":50,"value":575},"npx --yes eas-cli@latest whoami",{"type":50,"value":77},{"type":45,"tag":206,"props":578,"children":579},{},[580,582,587,589,595,597,603,605,616,618,624,626,632,634,640,642,648,650,656,658,664],{"type":50,"value":581},"Run from an Expo ",{"type":45,"tag":61,"props":583,"children":584},{},[585],{"type":50,"value":586},"project directory.",{"type":50,"value":588}," A fresh app needs one-time setup: ",{"type":45,"tag":84,"props":590,"children":592},{"className":591},[],[593],{"type":50,"value":594},"npx --yes eas-cli@latest init",{"type":50,"value":596}," to create\u002Flink the project (when there's no ",{"type":45,"tag":84,"props":598,"children":600},{"className":599},[],[601],{"type":50,"value":602},"projectId",{"type":50,"value":604},"), and ",{"type":45,"tag":61,"props":606,"children":607},{},[608,610],{"type":50,"value":609},"set ",{"type":45,"tag":84,"props":611,"children":613},{"className":612},[],[614],{"type":50,"value":615},"ios.bundleIdentifier",{"type":50,"value":617}," in app config if it's missing — a fresh ",{"type":45,"tag":84,"props":619,"children":621},{"className":620},[],[622],{"type":50,"value":623},"create-expo-app",{"type":50,"value":625}," often has none, and ",{"type":45,"tag":84,"props":627,"children":629},{"className":628},[],[630],{"type":50,"value":631},"prebuild",{"type":50,"value":633},"\u002F",{"type":45,"tag":84,"props":635,"children":637},{"className":636},[],[638],{"type":50,"value":639},"eas build",{"type":50,"value":641}," need it (they prompt or fail without it; e.g. ",{"type":45,"tag":84,"props":643,"children":645},{"className":644},[],[646],{"type":50,"value":647},"dev.\u003Cowner>.\u003Cslug>",{"type":50,"value":649},"). Read current config with ",{"type":45,"tag":84,"props":651,"children":653},{"className":652},[],[654],{"type":50,"value":655},"npx expo config --json",{"type":50,"value":657}," (it may live in ",{"type":45,"tag":84,"props":659,"children":661},{"className":660},[],[662],{"type":50,"value":663},"app.config.js",{"type":50,"value":665},"). The first Mode-C run is slow (native build); later runs reuse it.",{"type":45,"tag":206,"props":667,"children":668},{},[669,671,675,677,683,685,690,692,698,700,706,708,714],{"type":50,"value":670},"A controller to drive the device. This skill uses ",{"type":45,"tag":61,"props":672,"children":673},{},[674],{"type":50,"value":89},{"type":50,"value":676}," (open source, MIT), run on demand via ",{"type":45,"tag":84,"props":678,"children":680},{"className":679},[],[681],{"type":50,"value":682},"npx agent-device@latest",{"type":50,"value":684}," — nothing globally installed. ",{"type":45,"tag":61,"props":686,"children":687},{},[688],{"type":50,"value":689},"argent",{"type":50,"value":691}," is an alternative (",{"type":45,"tag":84,"props":693,"children":695},{"className":694},[],[696],{"type":50,"value":697},"--type argent",{"type":50,"value":699}," in ",{"type":45,"tag":84,"props":701,"children":703},{"className":702},[],[704],{"type":50,"value":705},"simulator:start",{"type":50,"value":707},"); see ",{"type":45,"tag":69,"props":709,"children":711},{"href":710},".\u002Freferences\u002Fcontrollers.md",[712],{"type":50,"value":713},"references\u002Fcontrollers.md",{"type":50,"value":77},{"type":45,"tag":206,"props":716,"children":717},{},[718,727,729,735,737,742,744,750,751,757,758,764,766,777,779,785,787,792,794,800,802,807],{"type":45,"tag":61,"props":719,"children":720},{},[721],{"type":45,"tag":84,"props":722,"children":724},{"className":723},[],[725],{"type":50,"value":726},".env.eas-simulator",{"type":50,"value":728}," is written\u002Fmanaged by eas-cli (not this skill): it holds the session id (",{"type":45,"tag":84,"props":730,"children":732},{"className":731},[],[733],{"type":50,"value":734},"EAS_SIMULATOR_SESSION_ID",{"type":50,"value":736},") + the daemon URL\u002F",{"type":45,"tag":61,"props":738,"children":739},{},[740],{"type":50,"value":741},"token",{"type":50,"value":743},", so ",{"type":45,"tag":84,"props":745,"children":747},{"className":746},[],[748],{"type":50,"value":749},"get",{"type":50,"value":633},{"type":45,"tag":84,"props":752,"children":754},{"className":753},[],[755],{"type":50,"value":756},"stop",{"type":50,"value":633},{"type":45,"tag":84,"props":759,"children":761},{"className":760},[],[762],{"type":50,"value":763},"exec",{"type":50,"value":765}," default to that session (usually ",{"type":45,"tag":61,"props":767,"children":768},{},[769,771],{"type":50,"value":770},"omit ",{"type":45,"tag":84,"props":772,"children":774},{"className":773},[],[775],{"type":50,"value":776},"--id",{"type":50,"value":778},"; pass ",{"type":45,"tag":84,"props":780,"children":782},{"className":781},[],[783],{"type":50,"value":784},"--id \u003Cid>",{"type":50,"value":786}," to target another). It carries a ",{"type":45,"tag":61,"props":788,"children":789},{},[790],{"type":50,"value":791},"token → keep it gitignored",{"type":50,"value":793}," (eas-cli marks it \"do not commit\" but may not add the ignore rule, and a fresh app's ",{"type":45,"tag":84,"props":795,"children":797},{"className":796},[],[798],{"type":50,"value":799},".gitignore",{"type":50,"value":801}," won't cover it — add ",{"type":45,"tag":84,"props":803,"children":805},{"className":804},[],[806],{"type":50,"value":726},{"type":50,"value":808}," if missing).",{"type":45,"tag":206,"props":810,"children":811},{},[812,818],{"type":45,"tag":84,"props":813,"children":815},{"className":814},[],[816],{"type":50,"value":817},"--max-duration-minutes",{"type":50,"value":819}," is paid-plan only; otherwise a default applies.",{"type":45,"tag":206,"props":821,"children":822},{},[823,828,830,836,838,844,845,851,853,859,860,865],{"type":45,"tag":61,"props":824,"children":825},{},[826],{"type":50,"value":827},"The command blocks assume a POSIX shell",{"type":50,"value":829}," (bash\u002Fzsh) — ",{"type":45,"tag":84,"props":831,"children":833},{"className":832},[],[834],{"type":50,"value":835},"printf",{"type":50,"value":837},", ",{"type":45,"tag":84,"props":839,"children":841},{"className":840},[],[842],{"type":50,"value":843},"lsof",{"type":50,"value":837},{"type":45,"tag":84,"props":846,"children":848},{"className":847},[],[849],{"type":50,"value":850},"$(seq …)",{"type":50,"value":852}," loops won't run in cmd\u002FPowerShell. On Windows, run them in WSL or Git Bash, or translate as you go (the ",{"type":45,"tag":84,"props":854,"children":856},{"className":855},[],[857],{"type":50,"value":858},"eas-cli",{"type":50,"value":633},{"type":45,"tag":84,"props":861,"children":863},{"className":862},[],[864],{"type":50,"value":89},{"type":50,"value":866}," invocations themselves are cross-platform).",{"type":45,"tag":147,"props":868,"children":870},{"id":869},"check-availability-first",[871],{"type":50,"value":243},{"type":45,"tag":57,"props":873,"children":874},{},[875,877,882,884,889],{"type":50,"value":876},"EAS Simulator is a ",{"type":45,"tag":61,"props":878,"children":879},{},[880],{"type":50,"value":881},"limited-access",{"type":50,"value":883}," EAS feature that is still rolling out, so it isn't enabled on every account. Confirm access ",{"type":45,"tag":61,"props":885,"children":886},{},[887],{"type":50,"value":888},"before",{"type":50,"value":890}," starting a session — this is a read-only check: no session, no billing.",{"type":45,"tag":276,"props":892,"children":894},{"className":278,"code":893,"language":280,"meta":281,"style":281},"npx --yes eas-cli@latest simulator:availability --json\n# → {\"available\": true, ...}  enabled → continue to the core loop\n# → {\"available\": false, ...} not enabled → do NOT start a session\n",[895],{"type":45,"tag":84,"props":896,"children":897},{"__ignoreMap":281},[898,926,934],{"type":45,"tag":287,"props":899,"children":900},{"class":289,"line":290},[901,906,911,916,921],{"type":45,"tag":287,"props":902,"children":903},{"style":321},[904],{"type":50,"value":905},"npx",{"type":45,"tag":287,"props":907,"children":908},{"style":327},[909],{"type":50,"value":910}," --yes",{"type":45,"tag":287,"props":912,"children":913},{"style":327},[914],{"type":50,"value":915}," eas-cli@latest",{"type":45,"tag":287,"props":917,"children":918},{"style":327},[919],{"type":50,"value":920}," simulator:availability",{"type":45,"tag":287,"props":922,"children":923},{"style":327},[924],{"type":50,"value":925}," --json\n",{"type":45,"tag":287,"props":927,"children":928},{"class":289,"line":300},[929],{"type":45,"tag":287,"props":930,"children":931},{"style":294},[932],{"type":50,"value":933},"# → {\"available\": true, ...}  enabled → continue to the core loop\n",{"type":45,"tag":287,"props":935,"children":936},{"class":289,"line":408},[937],{"type":45,"tag":287,"props":938,"children":939},{"style":294},[940],{"type":50,"value":941},"# → {\"available\": false, ...} not enabled → do NOT start a session\n",{"type":45,"tag":57,"props":943,"children":944},{},[945,947,952,954,959],{"type":50,"value":946},"If it's ",{"type":45,"tag":61,"props":948,"children":949},{},[950],{"type":50,"value":951},"not",{"type":50,"value":953}," available, don't call ",{"type":45,"tag":84,"props":955,"children":957},{"className":956},[],[958],{"type":50,"value":705},{"type":50,"value":960}," (it will fail). Instead, hand off gracefully so you keep making progress without this skill:",{"type":45,"tag":202,"props":962,"children":963},{},[964,969],{"type":45,"tag":206,"props":965,"children":966},{},[967],{"type":50,"value":968},"Tell the user EAS Simulator isn't available on their account yet — it's coming soon.",{"type":45,"tag":206,"props":970,"children":971},{},[972,974,979],{"type":50,"value":973},"Fall back to their normal local path for the actual goal — ",{"type":45,"tag":84,"props":975,"children":977},{"className":976},[],[978],{"type":50,"value":185},{"type":50,"value":980}," \u002F Xcode \u002F Android Studio for a local sim\u002Femulator, an EAS Build, or whatever else fits. Don't dead-end on the cloud sim; the request was almost never \"use EAS Simulator specifically.\"",{"type":45,"tag":57,"props":982,"children":983},{},[984,986,992,994,1000,1002,1007],{"type":50,"value":985},"(If ",{"type":45,"tag":84,"props":987,"children":989},{"className":988},[],[990],{"type":50,"value":991},"simulator:availability",{"type":50,"value":993}," isn't recognized, the CLI is too old — upgrade, or treat a ",{"type":45,"tag":84,"props":995,"children":997},{"className":996},[],[998],{"type":50,"value":999},"not enabled for this account",{"type":50,"value":1001}," error from ",{"type":45,"tag":84,"props":1003,"children":1005},{"className":1004},[],[1006],{"type":50,"value":705},{"type":50,"value":1008}," the same way: stop and fall back.)",{"type":45,"tag":147,"props":1010,"children":1012},{"id":1011},"the-core-loop-always-the-same",[1013],{"type":50,"value":1014},"The core loop (always the same)",{"type":45,"tag":57,"props":1016,"children":1017},{},[1018,1020,1025,1027,1032,1034,1039,1041,1046,1048,1054],{"type":50,"value":1019},"A session is: ",{"type":45,"tag":61,"props":1021,"children":1022},{},[1023],{"type":50,"value":1024},"start → (install your app) → drive → stop.",{"type":50,"value":1026}," ",{"type":45,"tag":84,"props":1028,"children":1030},{"className":1029},[],[1031],{"type":50,"value":858},{"type":50,"value":1033}," owns the ",{"type":45,"tag":100,"props":1035,"children":1036},{},[1037],{"type":50,"value":1038},"session",{"type":50,"value":1040},"; the device ",{"type":45,"tag":100,"props":1042,"children":1043},{},[1044],{"type":50,"value":1045},"verbs",{"type":50,"value":1047}," (open\u002Ftap\u002Fscreenshot) come from the controller, which ",{"type":45,"tag":84,"props":1049,"children":1051},{"className":1050},[],[1052],{"type":50,"value":1053},"npx --yes eas-cli@latest simulator:exec",{"type":50,"value":1055}," runs for you with the session's connection env loaded.",{"type":45,"tag":276,"props":1057,"children":1059},{"className":278,"code":1058,"language":280,"meta":281,"style":281},"# 1. Start a session (boots the remote sim + agent-device daemon; writes .env.eas-simulator).\nprintf '# managed by eas-cli\\n' > .env.eas-simulator   # clear any stale session first\nnpx --yes eas-cli@latest simulator:start --platform ios --type agent-device --non-interactive\n#    Then confirm it's live: simulator:get --json → status IN_PROGRESS (bounded poll in run-your-app.md).\n\n# 2. Drive it through `exec` (loads the session env, then runs the command you give it).\n#    agent-device runs on demand via npx — nothing installed globally.\nnpx --yes eas-cli@latest simulator:exec npx agent-device@latest open \u003Capp-or-url> --platform ios\nnpx --yes eas-cli@latest simulator:exec npx agent-device@latest snapshot -i          # interactive UI tree → @e1, @e2 refs\nnpx --yes eas-cli@latest simulator:exec npx agent-device@latest press @e2            # tap a ref (NOTE: 'press', not 'tap')\nnpx --yes eas-cli@latest simulator:exec npx agent-device@latest screenshot .\u002Fshot.png\n\n# 3. Stop (ends billing; tears down the VM) and reset the dotenv. Omit --id to target the dotenv session.\nnpx --yes eas-cli@latest simulator:stop\nprintf '# managed by eas-cli\\n' > .env.eas-simulator\n",[1060],{"type":45,"tag":84,"props":1061,"children":1062},{"__ignoreMap":281},[1063,1071,1108,1153,1161,1170,1178,1187,1252,1295,1338,1376,1384,1393,1414],{"type":45,"tag":287,"props":1064,"children":1065},{"class":289,"line":290},[1066],{"type":45,"tag":287,"props":1067,"children":1068},{"style":294},[1069],{"type":50,"value":1070},"# 1. Start a session (boots the remote sim + agent-device daemon; writes .env.eas-simulator).\n",{"type":45,"tag":287,"props":1072,"children":1073},{"class":289,"line":300},[1074,1078,1083,1088,1093,1098,1103],{"type":45,"tag":287,"props":1075,"children":1076},{"style":412},[1077],{"type":50,"value":835},{"type":45,"tag":287,"props":1079,"children":1080},{"style":310},[1081],{"type":50,"value":1082}," '",{"type":45,"tag":287,"props":1084,"children":1085},{"style":327},[1086],{"type":50,"value":1087},"# managed by eas-cli\\n",{"type":45,"tag":287,"props":1089,"children":1090},{"style":310},[1091],{"type":50,"value":1092},"'",{"type":45,"tag":287,"props":1094,"children":1095},{"style":310},[1096],{"type":50,"value":1097}," >",{"type":45,"tag":287,"props":1099,"children":1100},{"style":327},[1101],{"type":50,"value":1102}," .env.eas-simulator",{"type":45,"tag":287,"props":1104,"children":1105},{"style":294},[1106],{"type":50,"value":1107},"   # clear any stale session first\n",{"type":45,"tag":287,"props":1109,"children":1110},{"class":289,"line":408},[1111,1115,1119,1123,1128,1133,1138,1143,1148],{"type":45,"tag":287,"props":1112,"children":1113},{"style":321},[1114],{"type":50,"value":905},{"type":45,"tag":287,"props":1116,"children":1117},{"style":327},[1118],{"type":50,"value":910},{"type":45,"tag":287,"props":1120,"children":1121},{"style":327},[1122],{"type":50,"value":915},{"type":45,"tag":287,"props":1124,"children":1125},{"style":327},[1126],{"type":50,"value":1127}," simulator:start",{"type":45,"tag":287,"props":1129,"children":1130},{"style":327},[1131],{"type":50,"value":1132}," --platform",{"type":45,"tag":287,"props":1134,"children":1135},{"style":327},[1136],{"type":50,"value":1137}," ios",{"type":45,"tag":287,"props":1139,"children":1140},{"style":327},[1141],{"type":50,"value":1142}," --type",{"type":45,"tag":287,"props":1144,"children":1145},{"style":327},[1146],{"type":50,"value":1147}," agent-device",{"type":45,"tag":287,"props":1149,"children":1150},{"style":327},[1151],{"type":50,"value":1152}," --non-interactive\n",{"type":45,"tag":287,"props":1154,"children":1155},{"class":289,"line":432},[1156],{"type":45,"tag":287,"props":1157,"children":1158},{"style":294},[1159],{"type":50,"value":1160},"#    Then confirm it's live: simulator:get --json → status IN_PROGRESS (bounded poll in run-your-app.md).\n",{"type":45,"tag":287,"props":1162,"children":1163},{"class":289,"line":441},[1164],{"type":45,"tag":287,"props":1165,"children":1167},{"emptyLinePlaceholder":1166},true,[1168],{"type":50,"value":1169},"\n",{"type":45,"tag":287,"props":1171,"children":1172},{"class":289,"line":462},[1173],{"type":45,"tag":287,"props":1174,"children":1175},{"style":294},[1176],{"type":50,"value":1177},"# 2. Drive it through `exec` (loads the session env, then runs the command you give it).\n",{"type":45,"tag":287,"props":1179,"children":1181},{"class":289,"line":1180},7,[1182],{"type":45,"tag":287,"props":1183,"children":1184},{"style":294},[1185],{"type":50,"value":1186},"#    agent-device runs on demand via npx — nothing installed globally.\n",{"type":45,"tag":287,"props":1188,"children":1190},{"class":289,"line":1189},8,[1191,1195,1199,1203,1208,1213,1218,1223,1228,1233,1238,1243,1247],{"type":45,"tag":287,"props":1192,"children":1193},{"style":321},[1194],{"type":50,"value":905},{"type":45,"tag":287,"props":1196,"children":1197},{"style":327},[1198],{"type":50,"value":910},{"type":45,"tag":287,"props":1200,"children":1201},{"style":327},[1202],{"type":50,"value":915},{"type":45,"tag":287,"props":1204,"children":1205},{"style":327},[1206],{"type":50,"value":1207}," simulator:exec",{"type":45,"tag":287,"props":1209,"children":1210},{"style":327},[1211],{"type":50,"value":1212}," npx",{"type":45,"tag":287,"props":1214,"children":1215},{"style":327},[1216],{"type":50,"value":1217}," agent-device@latest",{"type":45,"tag":287,"props":1219,"children":1220},{"style":327},[1221],{"type":50,"value":1222}," open",{"type":45,"tag":287,"props":1224,"children":1225},{"style":310},[1226],{"type":50,"value":1227}," \u003C",{"type":45,"tag":287,"props":1229,"children":1230},{"style":327},[1231],{"type":50,"value":1232},"app-or-ur",{"type":45,"tag":287,"props":1234,"children":1235},{"style":392},[1236],{"type":50,"value":1237},"l",{"type":45,"tag":287,"props":1239,"children":1240},{"style":310},[1241],{"type":50,"value":1242},">",{"type":45,"tag":287,"props":1244,"children":1245},{"style":327},[1246],{"type":50,"value":1132},{"type":45,"tag":287,"props":1248,"children":1249},{"style":327},[1250],{"type":50,"value":1251}," ios\n",{"type":45,"tag":287,"props":1253,"children":1255},{"class":289,"line":1254},9,[1256,1260,1264,1268,1272,1276,1280,1285,1290],{"type":45,"tag":287,"props":1257,"children":1258},{"style":321},[1259],{"type":50,"value":905},{"type":45,"tag":287,"props":1261,"children":1262},{"style":327},[1263],{"type":50,"value":910},{"type":45,"tag":287,"props":1265,"children":1266},{"style":327},[1267],{"type":50,"value":915},{"type":45,"tag":287,"props":1269,"children":1270},{"style":327},[1271],{"type":50,"value":1207},{"type":45,"tag":287,"props":1273,"children":1274},{"style":327},[1275],{"type":50,"value":1212},{"type":45,"tag":287,"props":1277,"children":1278},{"style":327},[1279],{"type":50,"value":1217},{"type":45,"tag":287,"props":1281,"children":1282},{"style":327},[1283],{"type":50,"value":1284}," snapshot",{"type":45,"tag":287,"props":1286,"children":1287},{"style":327},[1288],{"type":50,"value":1289}," -i",{"type":45,"tag":287,"props":1291,"children":1292},{"style":294},[1293],{"type":50,"value":1294},"          # interactive UI tree → @e1, @e2 refs\n",{"type":45,"tag":287,"props":1296,"children":1298},{"class":289,"line":1297},10,[1299,1303,1307,1311,1315,1319,1323,1328,1333],{"type":45,"tag":287,"props":1300,"children":1301},{"style":321},[1302],{"type":50,"value":905},{"type":45,"tag":287,"props":1304,"children":1305},{"style":327},[1306],{"type":50,"value":910},{"type":45,"tag":287,"props":1308,"children":1309},{"style":327},[1310],{"type":50,"value":915},{"type":45,"tag":287,"props":1312,"children":1313},{"style":327},[1314],{"type":50,"value":1207},{"type":45,"tag":287,"props":1316,"children":1317},{"style":327},[1318],{"type":50,"value":1212},{"type":45,"tag":287,"props":1320,"children":1321},{"style":327},[1322],{"type":50,"value":1217},{"type":45,"tag":287,"props":1324,"children":1325},{"style":327},[1326],{"type":50,"value":1327}," press",{"type":45,"tag":287,"props":1329,"children":1330},{"style":327},[1331],{"type":50,"value":1332}," @e2",{"type":45,"tag":287,"props":1334,"children":1335},{"style":294},[1336],{"type":50,"value":1337},"            # tap a ref (NOTE: 'press', not 'tap')\n",{"type":45,"tag":287,"props":1339,"children":1341},{"class":289,"line":1340},11,[1342,1346,1350,1354,1358,1362,1366,1371],{"type":45,"tag":287,"props":1343,"children":1344},{"style":321},[1345],{"type":50,"value":905},{"type":45,"tag":287,"props":1347,"children":1348},{"style":327},[1349],{"type":50,"value":910},{"type":45,"tag":287,"props":1351,"children":1352},{"style":327},[1353],{"type":50,"value":915},{"type":45,"tag":287,"props":1355,"children":1356},{"style":327},[1357],{"type":50,"value":1207},{"type":45,"tag":287,"props":1359,"children":1360},{"style":327},[1361],{"type":50,"value":1212},{"type":45,"tag":287,"props":1363,"children":1364},{"style":327},[1365],{"type":50,"value":1217},{"type":45,"tag":287,"props":1367,"children":1368},{"style":327},[1369],{"type":50,"value":1370}," screenshot",{"type":45,"tag":287,"props":1372,"children":1373},{"style":327},[1374],{"type":50,"value":1375}," .\u002Fshot.png\n",{"type":45,"tag":287,"props":1377,"children":1379},{"class":289,"line":1378},12,[1380],{"type":45,"tag":287,"props":1381,"children":1382},{"emptyLinePlaceholder":1166},[1383],{"type":50,"value":1169},{"type":45,"tag":287,"props":1385,"children":1387},{"class":289,"line":1386},13,[1388],{"type":45,"tag":287,"props":1389,"children":1390},{"style":294},[1391],{"type":50,"value":1392},"# 3. Stop (ends billing; tears down the VM) and reset the dotenv. Omit --id to target the dotenv session.\n",{"type":45,"tag":287,"props":1394,"children":1396},{"class":289,"line":1395},14,[1397,1401,1405,1409],{"type":45,"tag":287,"props":1398,"children":1399},{"style":321},[1400],{"type":50,"value":905},{"type":45,"tag":287,"props":1402,"children":1403},{"style":327},[1404],{"type":50,"value":910},{"type":45,"tag":287,"props":1406,"children":1407},{"style":327},[1408],{"type":50,"value":915},{"type":45,"tag":287,"props":1410,"children":1411},{"style":327},[1412],{"type":50,"value":1413}," simulator:stop\n",{"type":45,"tag":287,"props":1415,"children":1417},{"class":289,"line":1416},15,[1418,1422,1426,1430,1434,1438],{"type":45,"tag":287,"props":1419,"children":1420},{"style":412},[1421],{"type":50,"value":835},{"type":45,"tag":287,"props":1423,"children":1424},{"style":310},[1425],{"type":50,"value":1082},{"type":45,"tag":287,"props":1427,"children":1428},{"style":327},[1429],{"type":50,"value":1087},{"type":45,"tag":287,"props":1431,"children":1432},{"style":310},[1433],{"type":50,"value":1092},{"type":45,"tag":287,"props":1435,"children":1436},{"style":310},[1437],{"type":50,"value":1097},{"type":45,"tag":287,"props":1439,"children":1440},{"style":327},[1441],{"type":50,"value":1442}," .env.eas-simulator\n",{"type":45,"tag":57,"props":1444,"children":1445},{},[1446,1448,1453,1455,1461,1463,1469,1471,1477,1479,1484,1486,1492,1494],{"type":50,"value":1447},"To ",{"type":45,"tag":61,"props":1449,"children":1450},{},[1451],{"type":50,"value":1452},"watch",{"type":50,"value":1454}," it live, hand the user the ",{"type":45,"tag":84,"props":1456,"children":1458},{"className":1457},[],[1459],{"type":50,"value":1460},"webPreviewUrl",{"type":50,"value":1462}," that ",{"type":45,"tag":84,"props":1464,"children":1466},{"className":1465},[],[1467],{"type":50,"value":1468},"start",{"type":50,"value":1470}," prints (an ",{"type":45,"tag":84,"props":1472,"children":1474},{"className":1473},[],[1475],{"type":50,"value":1476},"--type agent-device",{"type":50,"value":1478}," iOS session runs serve-sim alongside the daemon, so it emits one — agent control ",{"type":45,"tag":100,"props":1480,"children":1481},{},[1482],{"type":50,"value":1483},"and",{"type":50,"value":1485}," a browser preview in one session; Android has no preview, and ",{"type":45,"tag":84,"props":1487,"children":1489},{"className":1488},[],[1490],{"type":50,"value":1491},"--type serve-sim",{"type":50,"value":1493}," is preview-only). ",{"type":45,"tag":61,"props":1495,"children":1496},{},[1497,1499,1504],{"type":50,"value":1498},"This URL is for the ",{"type":45,"tag":100,"props":1500,"children":1501},{},[1502],{"type":50,"value":1503},"user's",{"type":50,"value":1505}," browser — you cannot open it for them, and it must never touch the sim:",{"type":45,"tag":202,"props":1507,"children":1508},{},[1509,1533,1566,1576],{"type":45,"tag":206,"props":1510,"children":1511},{},[1512,1517,1519,1525,1527,1531],{"type":45,"tag":61,"props":1513,"children":1514},{},[1515],{"type":50,"value":1516},"\"Open it here\" (Cursor\u002FVS Code)",{"type":50,"value":1518}," → print the URL on its own line and tell the user to open Simple Browser (",{"type":45,"tag":84,"props":1520,"children":1522},{"className":1521},[],[1523],{"type":50,"value":1524},"Cmd\u002FCtrl+Shift+P",{"type":50,"value":1526}," → \"Simple Browser: Show\") and paste it. Then ",{"type":45,"tag":61,"props":1528,"children":1529},{},[1530],{"type":50,"value":756},{"type":50,"value":1532},": do not shell out to a system browser or a Cursor\u002FVS Code URL handler, and do not ask \"did a tab appear?\" — you can't confirm it, the handoff is done.",{"type":45,"tag":206,"props":1534,"children":1535},{},[1536,1556,1558,1564],{"type":45,"tag":61,"props":1537,"children":1538},{},[1539,1541,1547,1549,1554],{"type":50,"value":1540},"Never ",{"type":45,"tag":84,"props":1542,"children":1544},{"className":1543},[],[1545],{"type":50,"value":1546},"open",{"type":50,"value":1548}," the ",{"type":45,"tag":84,"props":1550,"children":1552},{"className":1551},[],[1553],{"type":50,"value":1460},{"type":50,"value":1555}," on the sim.",{"type":50,"value":1557}," It's a browser preview, not a deep link and not an ",{"type":45,"tag":84,"props":1559,"children":1561},{"className":1560},[],[1562],{"type":50,"value":1563},"agent-device open",{"type":50,"value":1565}," argument; routing it to the device renders a browser-in-a-browser (a real past failure).",{"type":45,"tag":206,"props":1567,"children":1568},{},[1569,1574],{"type":45,"tag":61,"props":1570,"children":1571},{},[1572],{"type":50,"value":1573},"Headless agent",{"type":50,"value":1575}," (no display) → just return the URL as the deliverable.",{"type":45,"tag":206,"props":1577,"children":1578},{},[1579,1584,1586,1592,1594,1600,1601,1606],{"type":45,"tag":61,"props":1580,"children":1581},{},[1582],{"type":50,"value":1583},"Keeping it alive for the user to drive",{"type":50,"value":1585}," → bound it: start with ",{"type":45,"tag":84,"props":1587,"children":1589},{"className":1588},[],[1590],{"type":50,"value":1591},"--max-duration-minutes N",{"type":50,"value":1593}," so it auto-stops; tell them it bills until stopped and when it auto-stops; offer to reopen\u002Fextend when it ends. (This is the one case where \"stop right away\" doesn't apply; one-shot ",{"type":45,"tag":84,"props":1595,"children":1597},{"className":1596},[],[1598],{"type":50,"value":1599},"screenshot",{"type":50,"value":633},{"type":45,"tag":84,"props":1602,"children":1604},{"className":1603},[],[1605],{"type":50,"value":749},{"type":50,"value":1607}," runs still stop immediately.)",{"type":45,"tag":57,"props":1609,"children":1610},{},[1611,1616],{"type":45,"tag":84,"props":1612,"children":1614},{"className":1613},[],[1615],{"type":50,"value":1468},{"type":50,"value":1617}," also prints a job-run URL.",{"type":45,"tag":147,"props":1619,"children":1621},{"id":1620},"commands-at-a-glance",[1622],{"type":50,"value":1623},"Commands at a glance",{"type":45,"tag":1625,"props":1626,"children":1627},"table",{},[1628,1647],{"type":45,"tag":1629,"props":1630,"children":1631},"thead",{},[1632],{"type":45,"tag":1633,"props":1634,"children":1635},"tr",{},[1636,1642],{"type":45,"tag":1637,"props":1638,"children":1639},"th",{},[1640],{"type":50,"value":1641},"Command",{"type":45,"tag":1637,"props":1643,"children":1644},{},[1645],{"type":50,"value":1646},"Purpose",{"type":45,"tag":1648,"props":1649,"children":1650},"tbody",{},[1651,1717,1749,1779,1796],{"type":45,"tag":1633,"props":1652,"children":1653},{},[1654,1664],{"type":45,"tag":1655,"props":1656,"children":1657},"td",{},[1658],{"type":45,"tag":84,"props":1659,"children":1661},{"className":1660},[],[1662],{"type":50,"value":1663},"npx --yes eas-cli@latest simulator:start --platform ios|android [--type agent-device|argent|serve-sim] [--package-version X] [--max-duration-minutes N] [--non-interactive] [--json]",{"type":45,"tag":1655,"props":1665,"children":1666},{},[1667,1669,1674,1676,1681,1683,1701,1703,1708,1710,1716],{"type":50,"value":1668},"Create a session; boot the sim + controller; write ",{"type":45,"tag":84,"props":1670,"children":1672},{"className":1671},[],[1673],{"type":50,"value":726},{"type":50,"value":1675},"; print ",{"type":45,"tag":84,"props":1677,"children":1679},{"className":1678},[],[1680],{"type":50,"value":1460},{"type":50,"value":1682}," + job-run URL. ",{"type":45,"tag":61,"props":1684,"children":1685},{},[1686,1692,1694,1699],{"type":45,"tag":84,"props":1687,"children":1689},{"className":1688},[],[1690],{"type":50,"value":1691},"--json",{"type":50,"value":1693}," suppresses the ",{"type":45,"tag":84,"props":1695,"children":1697},{"className":1696},[],[1698],{"type":50,"value":726},{"type":50,"value":1700}," write",{"type":50,"value":1702}," — omit it for the ",{"type":45,"tag":84,"props":1704,"children":1706},{"className":1705},[],[1707],{"type":50,"value":763},{"type":50,"value":1709}," flow, or set the env yourself from ",{"type":45,"tag":84,"props":1711,"children":1713},{"className":1712},[],[1714],{"type":50,"value":1715},"remoteConfig",{"type":50,"value":77},{"type":45,"tag":1633,"props":1718,"children":1719},{},[1720,1729],{"type":45,"tag":1655,"props":1721,"children":1722},{},[1723],{"type":45,"tag":84,"props":1724,"children":1726},{"className":1725},[],[1727],{"type":50,"value":1728},"npx --yes eas-cli@latest simulator:exec \u003Ccmd> [args…]",{"type":45,"tag":1655,"props":1730,"children":1731},{},[1732,1734,1739,1741,1747],{"type":50,"value":1733},"Load ",{"type":45,"tag":84,"props":1735,"children":1737},{"className":1736},[],[1738],{"type":50,"value":726},{"type":50,"value":1740},", then run ",{"type":45,"tag":84,"props":1742,"children":1744},{"className":1743},[],[1745],{"type":50,"value":1746},"\u003Ccmd>",{"type":50,"value":1748}," with that env. The bridge to the controller.",{"type":45,"tag":1633,"props":1750,"children":1751},{},[1752,1761],{"type":45,"tag":1655,"props":1753,"children":1754},{},[1755],{"type":45,"tag":84,"props":1756,"children":1758},{"className":1757},[],[1759],{"type":50,"value":1760},"npx --yes eas-cli@latest simulator:get [--id] [--json]",{"type":45,"tag":1655,"props":1762,"children":1763},{},[1764,1766,1771,1772,1777],{"type":50,"value":1765},"Session status + connection details. ",{"type":45,"tag":61,"props":1767,"children":1768},{},[1769],{"type":50,"value":1770},"Use this to confirm readiness",{"type":50,"value":238},{"type":45,"tag":100,"props":1773,"children":1774},{},[1775],{"type":50,"value":1776},"Operating principles",{"type":50,"value":1778},").",{"type":45,"tag":1633,"props":1780,"children":1781},{},[1782,1791],{"type":45,"tag":1655,"props":1783,"children":1784},{},[1785],{"type":45,"tag":84,"props":1786,"children":1788},{"className":1787},[],[1789],{"type":50,"value":1790},"npx --yes eas-cli@latest simulator:list [--status …] [--type …] [--platform …]",{"type":45,"tag":1655,"props":1792,"children":1793},{},[1794],{"type":50,"value":1795},"List an app's sessions",{"type":45,"tag":1633,"props":1797,"children":1798},{},[1799,1808],{"type":45,"tag":1655,"props":1800,"children":1801},{},[1802],{"type":45,"tag":84,"props":1803,"children":1805},{"className":1804},[],[1806],{"type":50,"value":1807},"npx --yes eas-cli@latest simulator:stop [--id]",{"type":45,"tag":1655,"props":1809,"children":1810},{},[1811],{"type":50,"value":1812},"Stop a session (idempotent)",{"type":45,"tag":147,"props":1814,"children":1816},{"id":1815},"running-the-users-app-pick-a-mode",[1817],{"type":50,"value":1818},"Running the user's app — pick a mode",{"type":45,"tag":57,"props":1820,"children":1821},{},[1822,1824,1829,1831,1843,1845,1851],{"type":50,"value":1823},"The remote sim boots ",{"type":45,"tag":61,"props":1825,"children":1826},{},[1827],{"type":50,"value":1828},"blank — no Expo Go, no apps.",{"type":50,"value":1830}," Install a build, then drive it — but ",{"type":45,"tag":61,"props":1832,"children":1833},{},[1834,1836,1841],{"type":50,"value":1835},"match the build ",{"type":45,"tag":100,"props":1837,"children":1838},{},[1839],{"type":50,"value":1840},"type",{"type":50,"value":1842}," to the goal first",{"type":50,"value":1844}," (the box below); that's where live-session runs derail. Full sequences: ",{"type":45,"tag":69,"props":1846,"children":1848},{"href":1847},".\u002Freferences\u002Frun-your-app.md",[1849],{"type":50,"value":1850},"references\u002Frun-your-app.md",{"type":50,"value":1852}," — read before running a mode.",{"type":45,"tag":53,"props":1854,"children":1855},{},[1856,1866,1940],{"type":45,"tag":57,"props":1857,"children":1858},{},[1859,1864],{"type":45,"tag":61,"props":1860,"children":1861},{},[1862],{"type":50,"value":1863},"Match the build to the goal before installing anything — this is where live-session runs derail.",{"type":50,"value":1865}," Two traps, same root (grabbing a build that doesn't fit the request):",{"type":45,"tag":1867,"props":1868,"children":1869},"ol",{},[1870,1930],{"type":45,"tag":206,"props":1871,"children":1872},{},[1873,1878,1880,1885,1887,1892,1894,1899,1901,1906,1908,1913,1915,1920,1922,1928],{"type":45,"tag":61,"props":1874,"children":1875},{},[1876],{"type":50,"value":1877},"Wrong type.",{"type":50,"value":1879}," Live edits (Mode C) ",{"type":45,"tag":61,"props":1881,"children":1882},{},[1883],{"type":50,"value":1884},"require a dev build.",{"type":50,"value":1886}," A ",{"type":45,"tag":100,"props":1888,"children":1889},{},[1890],{"type":50,"value":1891},"static",{"type":50,"value":1893}," build — a local Release (A), the default EAS sim build (B), or ",{"type":45,"tag":61,"props":1895,"children":1896},{},[1897],{"type":50,"value":1898},"any build left on the sim from an earlier screenshot run",{"type":50,"value":1900}," — freezes its JS at build time and ",{"type":45,"tag":61,"props":1902,"children":1903},{},[1904],{"type":50,"value":1905},"can never hot-reload.",{"type":50,"value":1907}," For a live request, ",{"type":45,"tag":61,"props":1909,"children":1910},{},[1911],{"type":50,"value":1912},"ignore existing builds entirely",{"type":50,"value":1914}," and install a ",{"type":45,"tag":61,"props":1916,"children":1917},{},[1918],{"type":50,"value":1919},"dev",{"type":50,"value":1921}," build (local Debug, or an EAS build with ",{"type":45,"tag":84,"props":1923,"children":1925},{"className":1924},[],[1926],{"type":50,"value":1927},"developmentClient: true",{"type":50,"value":1929},"). Never reconnect Metro to a static build hoping it'll reload — it won't.",{"type":45,"tag":206,"props":1931,"children":1932},{},[1933,1938],{"type":45,"tag":61,"props":1934,"children":1935},{},[1936],{"type":50,"value":1937},"Stale.",{"type":50,"value":1939}," A static look must match current source — reuse only a fingerprint-matched build, else build fresh; reuse is explicit-only.",{"type":45,"tag":57,"props":1941,"children":1942},{},[1943,1945,1949,1951,1956],{"type":50,"value":1944},"So a leftover EAS\u002Frelease build is ",{"type":45,"tag":61,"props":1946,"children":1947},{},[1948],{"type":50,"value":951},{"type":50,"value":1950}," a shortcut for \"iterate live\" — it's the wrong binary. The fact that a build ",{"type":45,"tag":100,"props":1952,"children":1953},{},[1954],{"type":50,"value":1955},"exists",{"type":50,"value":1957}," never makes it the right one.",{"type":45,"tag":1625,"props":1959,"children":1960},{},[1961,1987],{"type":45,"tag":1629,"props":1962,"children":1963},{},[1964],{"type":45,"tag":1633,"props":1965,"children":1966},{},[1967,1972,1977,1982],{"type":45,"tag":1637,"props":1968,"children":1969},{},[1970],{"type":50,"value":1971},"Mode",{"type":45,"tag":1637,"props":1973,"children":1974},{},[1975],{"type":50,"value":1976},"What it is",{"type":45,"tag":1637,"props":1978,"children":1979},{},[1980],{"type":50,"value":1981},"Choose when",{"type":45,"tag":1637,"props":1983,"children":1984},{},[1985],{"type":50,"value":1986},"Live edits?",{"type":45,"tag":1648,"props":1988,"children":1989},{},[1990,2032,2078],{"type":45,"tag":1633,"props":1991,"children":1992},{},[1993,2001,2022,2027],{"type":45,"tag":1655,"props":1994,"children":1995},{},[1996],{"type":45,"tag":61,"props":1997,"children":1998},{},[1999],{"type":50,"value":2000},"A — Local release build",{"type":45,"tag":1655,"props":2002,"children":2003},{},[2004,2006,2012,2014,2020],{"type":50,"value":2005},"Build a Release ",{"type":45,"tag":84,"props":2007,"children":2009},{"className":2008},[],[2010],{"type":50,"value":2011},".app",{"type":50,"value":2013}," locally, ",{"type":45,"tag":84,"props":2015,"children":2017},{"className":2016},[],[2018],{"type":50,"value":2019},"agent-device install",{"type":50,"value":2021}," it (uploads)",{"type":45,"tag":1655,"props":2023,"children":2024},{},[2025],{"type":50,"value":2026},"User has a Mac toolchain and wants a quick \"run my current code on a cloud device\"",{"type":45,"tag":1655,"props":2028,"children":2029},{},[2030],{"type":50,"value":2031},"No (rebuild to see changes)",{"type":45,"tag":1633,"props":2033,"children":2034},{},[2035,2045,2063,2073],{"type":45,"tag":1655,"props":2036,"children":2037},{},[2038,2043],{"type":45,"tag":61,"props":2039,"children":2040},{},[2041],{"type":50,"value":2042},"B — EAS build",{"type":50,"value":2044}," (rare, explicit-only)",{"type":45,"tag":1655,"props":2046,"children":2047},{},[2048,2053,2055,2061],{"type":45,"tag":84,"props":2049,"children":2051},{"className":2050},[],[2052],{"type":50,"value":639},{"type":50,"value":2054}," a simulator build, ",{"type":45,"tag":84,"props":2056,"children":2058},{"className":2057},[],[2059],{"type":50,"value":2060},"agent-device install-from-source \u003Curl>",{"type":50,"value":2062}," (the VM downloads it)",{"type":45,"tag":1655,"props":2064,"children":2065},{},[2066,2071],{"type":45,"tag":61,"props":2067,"children":2068},{},[2069],{"type":50,"value":2070},"Only when explicitly asked",{"type":50,"value":2072}," — the user names an existing\u002FEAS build, or wants a static EAS artifact for CI\u002Fsharing. Not for \"show me\"\u002F\"iterate\" (use C). Sim builds need no credentials.",{"type":45,"tag":1655,"props":2074,"children":2075},{},[2076],{"type":50,"value":2077},"No",{"type":45,"tag":1633,"props":2079,"children":2080},{},[2081,2089,2102,2112],{"type":45,"tag":1655,"props":2082,"children":2083},{},[2084],{"type":45,"tag":61,"props":2085,"children":2086},{},[2087],{"type":50,"value":2088},"C — Local dev build + tunnel",{"type":45,"tag":1655,"props":2090,"children":2091},{},[2092,2094,2100],{"type":50,"value":2093},"Dev (Debug) build + ",{"type":45,"tag":84,"props":2095,"children":2097},{"className":2096},[],[2098],{"type":50,"value":2099},"EXPO_UNSTABLE_TUNNEL_V2=1 expo start --tunnel",{"type":50,"value":2101}," + connect the dev client to Metro",{"type":45,"tag":1655,"props":2103,"children":2104},{},[2105,2110],{"type":45,"tag":61,"props":2106,"children":2107},{},[2108],{"type":50,"value":2109},"The agentic edit-and-see loop",{"type":50,"value":2111}," — change code and see it live (Fast Refresh)",{"type":45,"tag":1655,"props":2113,"children":2114},{},[2115],{"type":45,"tag":61,"props":2116,"children":2117},{},[2118],{"type":50,"value":2119},"Yes",{"type":45,"tag":57,"props":2121,"children":2122},{},[2123,2125],{"type":50,"value":2124},"Quick decision — ",{"type":45,"tag":61,"props":2126,"children":2127},{},[2128],{"type":50,"value":2129},"default to C; A and B are explicit-only:",{"type":45,"tag":202,"props":2131,"children":2132},{},[2133,2161,2177],{"type":45,"tag":206,"props":2134,"children":2135},{},[2136,2141,2143,2147,2149,2154,2156],{"type":45,"tag":61,"props":2137,"children":2138},{},[2139],{"type":50,"value":2140},"C (almost everything):",{"type":50,"value":2142}," iterate, interact, poke the app, live edits — ",{"type":45,"tag":100,"props":2144,"children":2145},{},[2146],{"type":50,"value":1483},{"type":50,"value":2148}," most \"show me my app\" (current code needs a build anyway, so live+current wins). Mac → dev client builds locally; no Mac → build it on EAS (",{"type":45,"tag":84,"props":2150,"children":2152},{"className":2151},[],[2153],{"type":50,"value":1927},{"type":50,"value":2155},"). ",{"type":45,"tag":61,"props":2157,"children":2158},{},[2159],{"type":50,"value":2160},"Unsure → C.",{"type":45,"tag":206,"props":2162,"children":2163},{},[2164,2169,2171,2175],{"type":45,"tag":61,"props":2165,"children":2166},{},[2167],{"type":50,"value":2168},"A:",{"type":50,"value":2170}," only an explicit one-shot ",{"type":45,"tag":61,"props":2172,"children":2173},{},[2174],{"type":50,"value":1891},{"type":50,"value":2176}," screenshot on a Mac.",{"type":45,"tag":206,"props":2178,"children":2179},{},[2180,2185],{"type":45,"tag":61,"props":2181,"children":2182},{},[2183],{"type":50,"value":2184},"B:",{"type":50,"value":2186}," only when the user names an existing\u002FEAS build or wants a static EAS artifact (CI\u002Fsharing) — see the box above for why a static build is the wrong tool for \"iterate.\"",{"type":45,"tag":147,"props":2188,"children":2190},{"id":2189},"driving-the-device-agent-device",[2191],{"type":50,"value":2192},"Driving the device (agent-device)",{"type":45,"tag":57,"props":2194,"children":2195},{},[2196,2201,2203,2209],{"type":45,"tag":84,"props":2197,"children":2199},{"className":2198},[],[2200],{"type":50,"value":89},{"type":50,"value":2202}," is the controller. Common verbs (run each as ",{"type":45,"tag":84,"props":2204,"children":2206},{"className":2205},[],[2207],{"type":50,"value":2208},"npx --yes eas-cli@latest simulator:exec npx agent-device@latest \u003Cverb>",{"type":50,"value":2210},"):",{"type":45,"tag":1625,"props":2212,"children":2213},{},[2214,2230],{"type":45,"tag":1629,"props":2215,"children":2216},{},[2217],{"type":45,"tag":1633,"props":2218,"children":2219},{},[2220,2225],{"type":45,"tag":1637,"props":2221,"children":2222},{},[2223],{"type":50,"value":2224},"Verb",{"type":45,"tag":1637,"props":2226,"children":2227},{},[2228],{"type":50,"value":2229},"Does",{"type":45,"tag":1648,"props":2231,"children":2232},{},[2233,2258,2282,2299,2402,2427,2477,2494,2518],{"type":45,"tag":1633,"props":2234,"children":2235},{},[2236,2245],{"type":45,"tag":1655,"props":2237,"children":2238},{},[2239],{"type":45,"tag":84,"props":2240,"children":2242},{"className":2241},[],[2243],{"type":50,"value":2244},"apps --platform ios",{"type":45,"tag":1655,"props":2246,"children":2247},{},[2248,2250,2256],{"type":50,"value":2249},"List user-installed apps (the blank sim shows none); add ",{"type":45,"tag":84,"props":2251,"children":2253},{"className":2252},[],[2254],{"type":50,"value":2255},"--all",{"type":50,"value":2257}," to include system apps",{"type":45,"tag":1633,"props":2259,"children":2260},{},[2261,2270],{"type":45,"tag":1655,"props":2262,"children":2263},{},[2264],{"type":45,"tag":84,"props":2265,"children":2267},{"className":2266},[],[2268],{"type":50,"value":2269},"install \u003CappId> \u003Cpath> --platform ios",{"type":45,"tag":1655,"props":2271,"children":2272},{},[2273,2275,2280],{"type":50,"value":2274},"Install a local ",{"type":45,"tag":84,"props":2276,"children":2278},{"className":2277},[],[2279],{"type":50,"value":2011},{"type":50,"value":2281}," (uploads it)",{"type":45,"tag":1633,"props":2283,"children":2284},{},[2285,2294],{"type":45,"tag":1655,"props":2286,"children":2287},{},[2288],{"type":45,"tag":84,"props":2289,"children":2291},{"className":2290},[],[2292],{"type":50,"value":2293},"install-from-source \u003Curl> --platform ios",{"type":45,"tag":1655,"props":2295,"children":2296},{},[2297],{"type":50,"value":2298},"Install from a URL — the VM downloads it (use for EAS artifacts)",{"type":45,"tag":1633,"props":2300,"children":2301},{},[2302,2311],{"type":45,"tag":1655,"props":2303,"children":2304},{},[2305],{"type":45,"tag":84,"props":2306,"children":2308},{"className":2307},[],[2309],{"type":50,"value":2310},"open \u003CappId|deep-link> --platform ios",{"type":45,"tag":1655,"props":2312,"children":2313},{},[2314,2316,2321,2323,2329,2331,2342,2344,2350,2352,2358,2360,2366,2368,2372,2374,2380,2382,2387,2389,2393,2395,2400],{"type":50,"value":2315},"Launch an app (bundle id) or follow an app ",{"type":45,"tag":61,"props":2317,"children":2318},{},[2319],{"type":50,"value":2320},"deep link",{"type":50,"value":2322}," (",{"type":45,"tag":84,"props":2324,"children":2326},{"className":2325},[],[2327],{"type":50,"value":2328},"exp+slug:\u002F\u002F…",{"type":50,"value":2330},"). A first-time deep link raises a system ",{"type":45,"tag":61,"props":2332,"children":2333},{},[2334,2336],{"type":50,"value":2335},"\"Open in '",{"type":45,"tag":2337,"props":2338,"children":2339},"app",{},[2340],{"type":50,"value":2341},"'?\"",{"type":50,"value":2343}," dialog — expect it (don't burn a snapshot discovering it) and ",{"type":45,"tag":84,"props":2345,"children":2347},{"className":2346},[],[2348],{"type":50,"value":2349},"press 'label=\"Open\"'",{"type":50,"value":2351}," to hand off; it can be slow, so bound it with agent-device's own ",{"type":45,"tag":84,"props":2353,"children":2355},{"className":2354},[],[2356],{"type":50,"value":2357},"--timeout",{"type":50,"value":2359}," (e.g. ",{"type":45,"tag":84,"props":2361,"children":2363},{"className":2362},[],[2364],{"type":50,"value":2365},"press 'label=\"Open\"' --timeout 120000",{"type":50,"value":2367},") — ",{"type":45,"tag":61,"props":2369,"children":2370},{},[2371],{"type":50,"value":951},{"type":50,"value":2373}," a shell ",{"type":45,"tag":84,"props":2375,"children":2377},{"className":2376},[],[2378],{"type":50,"value":2379},"timeout",{"type":50,"value":2381}," wrapper (macOS has no ",{"type":45,"tag":84,"props":2383,"children":2385},{"className":2384},[],[2386],{"type":50,"value":2379},{"type":50,"value":2388}," binary). (Mode C sidesteps this dialog for the Metro-connect link via \"Enter URL manually\" — see run-your-app.md.) ",{"type":45,"tag":61,"props":2390,"children":2391},{},[2392],{"type":50,"value":177},{"type":50,"value":2394}," for the ",{"type":45,"tag":84,"props":2396,"children":2398},{"className":2397},[],[2399],{"type":50,"value":1460},{"type":50,"value":2401}," — that's a browser preview for the user, never the device.",{"type":45,"tag":1633,"props":2403,"children":2404},{},[2405,2414],{"type":45,"tag":1655,"props":2406,"children":2407},{},[2408],{"type":45,"tag":84,"props":2409,"children":2411},{"className":2410},[],[2412],{"type":50,"value":2413},"snapshot -i",{"type":45,"tag":1655,"props":2415,"children":2416},{},[2417,2419,2425],{"type":50,"value":2418},"Interactive accessibility tree → ",{"type":45,"tag":84,"props":2420,"children":2422},{"className":2421},[],[2423],{"type":50,"value":2424},"@e1",{"type":50,"value":2426},"-style refs",{"type":45,"tag":1633,"props":2428,"children":2429},{},[2430,2439],{"type":45,"tag":1655,"props":2431,"children":2432},{},[2433],{"type":45,"tag":84,"props":2434,"children":2436},{"className":2435},[],[2437],{"type":50,"value":2438},"press \u003Cref|selector>",{"type":45,"tag":1655,"props":2440,"children":2441},{},[2442,2444,2450,2452,2457,2458],{"type":50,"value":2443},"Tap (e.g. ",{"type":45,"tag":84,"props":2445,"children":2447},{"className":2446},[],[2448],{"type":50,"value":2449},"press @e2",{"type":50,"value":2451}," or ",{"type":45,"tag":84,"props":2453,"children":2455},{"className":2454},[],[2456],{"type":50,"value":2349},{"type":50,"value":2367},{"type":45,"tag":61,"props":2459,"children":2460},{},[2461,2463,2469,2471],{"type":50,"value":2462},"the tap verb is ",{"type":45,"tag":84,"props":2464,"children":2466},{"className":2465},[],[2467],{"type":50,"value":2468},"press",{"type":50,"value":2470},", not ",{"type":45,"tag":84,"props":2472,"children":2474},{"className":2473},[],[2475],{"type":50,"value":2476},"tap",{"type":45,"tag":1633,"props":2478,"children":2479},{},[2480,2489],{"type":45,"tag":1655,"props":2481,"children":2482},{},[2483],{"type":45,"tag":84,"props":2484,"children":2486},{"className":2485},[],[2487],{"type":50,"value":2488},"fill \u003Cref> \"text\"",{"type":45,"tag":1655,"props":2490,"children":2491},{},[2492],{"type":50,"value":2493},"Type into a field",{"type":45,"tag":1633,"props":2495,"children":2496},{},[2497,2506],{"type":45,"tag":1655,"props":2498,"children":2499},{},[2500],{"type":45,"tag":84,"props":2501,"children":2503},{"className":2502},[],[2504],{"type":50,"value":2505},"screenshot \u003Cpath>",{"type":45,"tag":1655,"props":2507,"children":2508},{},[2509,2511,2516],{"type":50,"value":2510},"Capture the screen to a local PNG (downloaded from the daemon) — requires an app to be open (",{"type":45,"tag":84,"props":2512,"children":2514},{"className":2513},[],[2515],{"type":50,"value":1546},{"type":50,"value":2517}," first)",{"type":45,"tag":1633,"props":2519,"children":2520},{},[2521,2538],{"type":45,"tag":1655,"props":2522,"children":2523},{},[2524,2530,2532],{"type":45,"tag":84,"props":2525,"children":2527},{"className":2526},[],[2528],{"type":50,"value":2529},"metro prepare",{"type":50,"value":2531}," \u002F ",{"type":45,"tag":84,"props":2533,"children":2535},{"className":2534},[],[2536],{"type":50,"value":2537},"metro reload",{"type":45,"tag":1655,"props":2539,"children":2540},{},[2541],{"type":50,"value":2542},"Point a dev client at Metro \u002F reload (Mode C)",{"type":45,"tag":57,"props":2544,"children":2545},{},[2546,2548,2553,2555,2559],{"type":50,"value":2547},"For the full verb set and the ",{"type":45,"tag":84,"props":2549,"children":2551},{"className":2550},[],[2552],{"type":50,"value":689},{"type":50,"value":2554}," controller alternative, see ",{"type":45,"tag":69,"props":2556,"children":2557},{"href":710},[2558],{"type":50,"value":713},{"type":50,"value":77},{"type":45,"tag":147,"props":2561,"children":2563},{"id":2562},"operating-principles",[2564],{"type":50,"value":1776},{"type":45,"tag":57,"props":2566,"children":2567},{},[2568,2570,2575,2577,2582,2583,2589,2590,2595,2596,2602,2604,2610],{"type":50,"value":2569},"The non-obvious mental model worth internalizing. Specific error→fix lookups (hung verbs, ",{"type":45,"tag":84,"props":2571,"children":2573},{"className":2572},[],[2574],{"type":50,"value":2476},{"type":50,"value":2576},"→",{"type":45,"tag":84,"props":2578,"children":2580},{"className":2579},[],[2581],{"type":50,"value":2468},{"type":50,"value":837},{"type":45,"tag":84,"props":2584,"children":2586},{"className":2585},[],[2587],{"type":50,"value":2588},"--platform",{"type":50,"value":837},{"type":45,"tag":84,"props":2591,"children":2593},{"className":2592},[],[2594],{"type":50,"value":1691},{"type":50,"value":837},{"type":45,"tag":84,"props":2597,"children":2599},{"className":2598},[],[2600],{"type":50,"value":2601},"pod install",{"type":50,"value":2603}," locale, orphaned sessions, boot variability) live in ",{"type":45,"tag":69,"props":2605,"children":2607},{"href":2606},".\u002Freferences\u002Ftroubleshooting.md",[2608],{"type":50,"value":2609},"references\u002Ftroubleshooting.md",{"type":50,"value":77},{"type":45,"tag":1867,"props":2612,"children":2613},{},[2614,2793,2836,2853,2877],{"type":45,"tag":206,"props":2615,"children":2616},{},[2617,2622,2624,2751,2755,2757,2762,2764,2769,2771,2776,2778,2784,2785,2791],{"type":45,"tag":61,"props":2618,"children":2619},{},[2620],{"type":50,"value":2621},"Establish ground truth, then reset — don't patch-loop.",{"type":50,"value":2623}," Never assume an existing session or Metro is yours or healthy. Before driving, confirm:",{"type":45,"tag":202,"props":2625,"children":2626},{},[2627,2679,2712,2728],{"type":45,"tag":206,"props":2628,"children":2629},{},[2630,2635,2637,2642,2643,2648,2650,2655,2657,2662,2664,2670,2672,2678],{"type":45,"tag":61,"props":2631,"children":2632},{},[2633],{"type":50,"value":2634},"cwd",{"type":50,"value":2636}," — you're in the intended Expo project dir (a misdirected ",{"type":45,"tag":84,"props":2638,"children":2640},{"className":2639},[],[2641],{"type":50,"value":1468},{"type":50,"value":633},{"type":45,"tag":84,"props":2644,"children":2646},{"className":2645},[],[2647],{"type":50,"value":763},{"type":50,"value":2649}," sessions the ",{"type":45,"tag":100,"props":2651,"children":2652},{},[2653],{"type":50,"value":2654},"wrong app",{"type":50,"value":2656}," + drops a stray ",{"type":45,"tag":84,"props":2658,"children":2660},{"className":2659},[],[2661],{"type":50,"value":726},{"type":50,"value":2663},"; ",{"type":45,"tag":84,"props":2665,"children":2667},{"className":2666},[],[2668],{"type":50,"value":2669},"pwd",{"type":50,"value":2671}," \u002F check ",{"type":45,"tag":84,"props":2673,"children":2675},{"className":2674},[],[2676],{"type":50,"value":2677},"app.json",{"type":50,"value":1778},{"type":45,"tag":206,"props":2680,"children":2681},{},[2682,2687,2689,2695,2697,2703,2705,2710],{"type":45,"tag":61,"props":2683,"children":2684},{},[2685],{"type":50,"value":2686},"session live",{"type":50,"value":2688}," — ",{"type":45,"tag":84,"props":2690,"children":2692},{"className":2691},[],[2693],{"type":50,"value":2694},"IN_PROGRESS",{"type":50,"value":2696}," via ",{"type":45,"tag":84,"props":2698,"children":2700},{"className":2699},[],[2701],{"type":50,"value":2702},"simulator:get --json",{"type":50,"value":2704}," (a stopped session keeps its id + ",{"type":45,"tag":84,"props":2706,"children":2708},{"className":2707},[],[2709],{"type":50,"value":1715},{"type":50,"value":2711},", so the dotenv alone isn't proof).",{"type":45,"tag":206,"props":2713,"children":2714},{},[2715,2726],{"type":45,"tag":61,"props":2716,"children":2717},{},[2718,2720],{"type":50,"value":2719},"one Metro on ",{"type":45,"tag":84,"props":2721,"children":2723},{"className":2722},[],[2724],{"type":50,"value":2725},":8081",{"type":50,"value":2727}," — reuse if it's yours, else free the port before starting (run-your-app.md).",{"type":45,"tag":206,"props":2729,"children":2730},{},[2731,2736,2738,2743,2745,2750],{"type":45,"tag":61,"props":2732,"children":2733},{},[2734],{"type":50,"value":2735},"build fits intent",{"type":50,"value":2737}," — a ",{"type":45,"tag":61,"props":2739,"children":2740},{},[2741],{"type":50,"value":2742},"release build can't live-reload",{"type":50,"value":2744},"; if live edits are wanted and a release build is installed, ",{"type":45,"tag":61,"props":2746,"children":2747},{},[2748],{"type":50,"value":2749},"install the dev build, don't reconnect",{"type":50,"value":77},{"type":45,"tag":2752,"props":2753,"children":2754},"br",{},[],{"type":50,"value":2756},"If current code isn't rendering after your ",{"type":45,"tag":61,"props":2758,"children":2759},{},[2760],{"type":50,"value":2761},"first",{"type":50,"value":2763}," connect, stop poking live state: ",{"type":45,"tag":61,"props":2765,"children":2766},{},[2767],{"type":50,"value":2768},"reset to baseline",{"type":50,"value":2770}," (stop session → clear dotenv → kill Metro) and redo the mode ",{"type":45,"tag":61,"props":2772,"children":2773},{},[2774],{"type":50,"value":2775},"once",{"type":50,"value":2777},"; a second failure → stop and report. Never restart Metro in place, reconnect more than once, rebuild the native client to fix a JS\u002Fconnection problem, or surface a preview URL while state is unknown. (A daemon drop — ",{"type":45,"tag":84,"props":2779,"children":2781},{"className":2780},[],[2782],{"type":50,"value":2783},"ERR_NGROK_3200",{"type":50,"value":2531},{"type":45,"tag":84,"props":2786,"children":2788},{"className":2787},[],[2789],{"type":50,"value":2790},"Remote daemon is unavailable",{"type":50,"value":2792}," — is the same: reset, don't retry.)",{"type":45,"tag":206,"props":2794,"children":2795},{},[2796,2806,2807,2813,2815,2820,2822,2827,2829,2835],{"type":45,"tag":61,"props":2797,"children":2798},{},[2799,2804],{"type":45,"tag":84,"props":2800,"children":2802},{"className":2801},[],[2803],{"type":50,"value":763},{"type":50,"value":2805}," is a wrapper, not a driver.",{"type":50,"value":1026},{"type":45,"tag":84,"props":2808,"children":2810},{"className":2809},[],[2811],{"type":50,"value":2812},"simulator:exec",{"type":50,"value":2814}," loads ",{"type":45,"tag":84,"props":2816,"children":2818},{"className":2817},[],[2819],{"type":50,"value":726},{"type":50,"value":2821}," and spawns the command you pass; the device verbs come from the controller (",{"type":45,"tag":84,"props":2823,"children":2825},{"className":2824},[],[2826],{"type":50,"value":682},{"type":50,"value":2828},"). There is no ",{"type":45,"tag":84,"props":2830,"children":2832},{"className":2831},[],[2833],{"type":50,"value":2834},"simulator:tap",{"type":50,"value":77},{"type":45,"tag":206,"props":2837,"children":2838},{},[2839,2844,2846,2851],{"type":45,"tag":61,"props":2840,"children":2841},{},[2842],{"type":50,"value":2843},"Act immediately; don't park an idle session.",{"type":50,"value":2845}," Sessions are short-lived — install and drive right after ",{"type":45,"tag":84,"props":2847,"children":2849},{"className":2848},[],[2850],{"type":50,"value":1468},{"type":50,"value":2852},". Leaving one idle drops the tunnel\u002Fdaemon (→ reset, per #1).",{"type":45,"tag":206,"props":2854,"children":2855},{},[2856,2861,2862,2868,2870,2875],{"type":45,"tag":61,"props":2857,"children":2858},{},[2859],{"type":50,"value":2860},"Stop on every exit path (billing) and reset the dotenv.",{"type":50,"value":1026},{"type":45,"tag":84,"props":2863,"children":2865},{"className":2864},[],[2866],{"type":50,"value":2867},"--non-interactive",{"type":50,"value":2869}," doesn't auto-stop, and a forgotten session bills until stopped. Don't ",{"type":45,"tag":84,"props":2871,"children":2873},{"className":2872},[],[2874],{"type":50,"value":1468},{"type":50,"value":2876}," again to \"retry\" a slow boot — that orphans a second billed session.",{"type":45,"tag":206,"props":2878,"children":2879},{},[2880,2885,2887,2893],{"type":45,"tag":61,"props":2881,"children":2882},{},[2883],{"type":50,"value":2884},"Screenshot only the correct, fresh build.",{"type":50,"value":2886}," Mode C only after the dev client connects to Metro; A\u002FB only from a build matching current source — reusing a pre-existing build is the #1 \"my edits don't show\" cause (see the build caveat above). (",{"type":45,"tag":84,"props":2888,"children":2890},{"className":2889},[],[2891],{"type":50,"value":2892},"9:41",{"type":50,"value":2894}," in the status bar is the sim default, not staleness.)",{"type":45,"tag":147,"props":2896,"children":2898},{"id":2897},"stop-and-clean-up",[2899],{"type":50,"value":2900},"Stop and clean up",{"type":45,"tag":57,"props":2902,"children":2903},{},[2904,2906,2911],{"type":50,"value":2905},"Stop the session (ends billing) ",{"type":45,"tag":61,"props":2907,"children":2908},{},[2909],{"type":50,"value":2910},"and reset the dotenv",{"type":50,"value":2912}," so a later run doesn't try to reuse the dead session:",{"type":45,"tag":276,"props":2914,"children":2916},{"className":278,"code":2915,"language":280,"meta":281,"style":281},"npx --yes eas-cli@latest simulator:stop          # omit --id → stops the dotenv session (or pass --id \u003Cid>)\nprintf '# managed by eas-cli\\n' > .env.eas-simulator   # clear the stale session id so it isn't reused\n# if you started Metro for Mode C, stop it too (Ctrl+C in its terminal, or kill the expo process)\n",[2917],{"type":45,"tag":84,"props":2918,"children":2919},{"__ignoreMap":281},[2920,2945,2977],{"type":45,"tag":287,"props":2921,"children":2922},{"class":289,"line":290},[2923,2927,2931,2935,2940],{"type":45,"tag":287,"props":2924,"children":2925},{"style":321},[2926],{"type":50,"value":905},{"type":45,"tag":287,"props":2928,"children":2929},{"style":327},[2930],{"type":50,"value":910},{"type":45,"tag":287,"props":2932,"children":2933},{"style":327},[2934],{"type":50,"value":915},{"type":45,"tag":287,"props":2936,"children":2937},{"style":327},[2938],{"type":50,"value":2939}," simulator:stop",{"type":45,"tag":287,"props":2941,"children":2942},{"style":294},[2943],{"type":50,"value":2944},"          # omit --id → stops the dotenv session (or pass --id \u003Cid>)\n",{"type":45,"tag":287,"props":2946,"children":2947},{"class":289,"line":300},[2948,2952,2956,2960,2964,2968,2972],{"type":45,"tag":287,"props":2949,"children":2950},{"style":412},[2951],{"type":50,"value":835},{"type":45,"tag":287,"props":2953,"children":2954},{"style":310},[2955],{"type":50,"value":1082},{"type":45,"tag":287,"props":2957,"children":2958},{"style":327},[2959],{"type":50,"value":1087},{"type":45,"tag":287,"props":2961,"children":2962},{"style":310},[2963],{"type":50,"value":1092},{"type":45,"tag":287,"props":2965,"children":2966},{"style":310},[2967],{"type":50,"value":1097},{"type":45,"tag":287,"props":2969,"children":2970},{"style":327},[2971],{"type":50,"value":1102},{"type":45,"tag":287,"props":2973,"children":2974},{"style":294},[2975],{"type":50,"value":2976},"   # clear the stale session id so it isn't reused\n",{"type":45,"tag":287,"props":2978,"children":2979},{"class":289,"line":408},[2980],{"type":45,"tag":287,"props":2981,"children":2982},{"style":294},[2983],{"type":50,"value":2984},"# if you started Metro for Mode C, stop it too (Ctrl+C in its terminal, or kill the expo process)\n",{"type":45,"tag":147,"props":2986,"children":2988},{"id":2987},"references",[2989],{"type":50,"value":2990},"References",{"type":45,"tag":202,"props":2992,"children":2993},{},[2994,3003,3019],{"type":45,"tag":206,"props":2995,"children":2996},{},[2997,3001],{"type":45,"tag":69,"props":2998,"children":2999},{"href":1847},[3000],{"type":50,"value":1850},{"type":50,"value":3002}," — full command sequences for modes A, B, and C (read before running a mode).",{"type":45,"tag":206,"props":3004,"children":3005},{},[3006,3010,3012,3017],{"type":45,"tag":69,"props":3007,"children":3008},{"href":710},[3009],{"type":50,"value":713},{"type":50,"value":3011}," — agent-device verb reference and the ",{"type":45,"tag":84,"props":3013,"children":3015},{"className":3014},[],[3016],{"type":50,"value":689},{"type":50,"value":3018}," alternative.",{"type":45,"tag":206,"props":3020,"children":3021},{},[3022,3026],{"type":45,"tag":69,"props":3023,"children":3024},{"href":2606},[3025],{"type":50,"value":2609},{"type":50,"value":3027}," — concrete errors and fixes.",{"type":45,"tag":57,"props":3029,"children":3030},{},[3031,3033,3038,3039,3044,3046,3052,3053,3059],{"type":50,"value":3032},"Source of truth: Expo docs and the ",{"type":45,"tag":84,"props":3034,"children":3036},{"className":3035},[],[3037],{"type":50,"value":491},{"type":50,"value":2531},{"type":45,"tag":84,"props":3040,"children":3042},{"className":3041},[],[3043],{"type":50,"value":89},{"type":50,"value":3045}," CLIs (",{"type":45,"tag":84,"props":3047,"children":3049},{"className":3048},[],[3050],{"type":50,"value":3051},"npx --yes eas-cli@latest simulator:* --help",{"type":50,"value":837},{"type":45,"tag":84,"props":3054,"children":3056},{"className":3055},[],[3057],{"type":50,"value":3058},"agent-device --help",{"type":50,"value":3060},"). This skill teaches how to apply them; it doesn't replace them.",{"type":45,"tag":147,"props":3062,"children":3064},{"id":3063},"submitting-feedback",[3065],{"type":50,"value":3066},"Submitting Feedback",{"type":45,"tag":57,"props":3068,"children":3069},{},[3070],{"type":50,"value":3071},"If you encounter errors, misleading or outdated information in this skill, report it so Expo can improve:",{"type":45,"tag":276,"props":3073,"children":3075},{"className":278,"code":3074,"language":280,"meta":281,"style":281},"npx --yes submit-expo-feedback@latest --category skills --subject \"eas-simulator\" \"\u003Cactionable feedback>\"\n",[3076],{"type":45,"tag":84,"props":3077,"children":3078},{"__ignoreMap":281},[3079],{"type":45,"tag":287,"props":3080,"children":3081},{"class":289,"line":290},[3082,3086,3090,3095,3100,3105,3110,3114,3118,3122,3126,3131],{"type":45,"tag":287,"props":3083,"children":3084},{"style":321},[3085],{"type":50,"value":905},{"type":45,"tag":287,"props":3087,"children":3088},{"style":327},[3089],{"type":50,"value":910},{"type":45,"tag":287,"props":3091,"children":3092},{"style":327},[3093],{"type":50,"value":3094}," submit-expo-feedback@latest",{"type":45,"tag":287,"props":3096,"children":3097},{"style":327},[3098],{"type":50,"value":3099}," --category",{"type":45,"tag":287,"props":3101,"children":3102},{"style":327},[3103],{"type":50,"value":3104}," skills",{"type":45,"tag":287,"props":3106,"children":3107},{"style":327},[3108],{"type":50,"value":3109}," --subject",{"type":45,"tag":287,"props":3111,"children":3112},{"style":310},[3113],{"type":50,"value":345},{"type":45,"tag":287,"props":3115,"children":3116},{"style":327},[3117],{"type":50,"value":4},{"type":45,"tag":287,"props":3119,"children":3120},{"style":310},[3121],{"type":50,"value":354},{"type":45,"tag":287,"props":3123,"children":3124},{"style":310},[3125],{"type":50,"value":345},{"type":45,"tag":287,"props":3127,"children":3128},{"style":327},[3129],{"type":50,"value":3130},"\u003Cactionable feedback>",{"type":45,"tag":287,"props":3132,"children":3133},{"style":310},[3134],{"type":50,"value":429},{"type":45,"tag":57,"props":3136,"children":3137},{},[3138],{"type":50,"value":3139},"Only submit when you have something specific and actionable to report. Include as much relevant context as possible.",{"type":45,"tag":3141,"props":3142,"children":3143},"style",{},[3144],{"type":50,"value":3145},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":3147,"total":3313},[3148,3162,3177,3192,3200,3214,3232,3243,3258,3276,3291,3302],{"slug":3149,"name":3149,"fn":3150,"description":3151,"org":3152,"tags":3153,"stars":26,"repoUrl":27,"updatedAt":3161},"eas-app-stores","deploy and submit Expo apps to stores","EAS service (paid). Deploy Expo apps to the app stores with EAS - build and submit to the iOS App Store, Google Play Store, and TestFlight, configure eas.json build and submit profiles, manage app versions and build numbers, and publish App Store metadata and ASO. Use whenever the user wants to deploy, release, or ship an app to production or the app stores, is preparing a production build, running eas build or eas submit, shipping to TestFlight, bumping version or build numbers, or setting up store listing metadata. For deploying an Expo website or API routes, use the eas-hosting skill.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3154,3155,3158,3159,3160],{"name":13,"slug":14,"type":15},{"name":3156,"slug":3157,"type":15},"Deployment","deployment",{"name":9,"slug":8,"type":15},{"name":18,"slug":19,"type":15},{"name":21,"slug":22,"type":15},"2026-07-24T05:36:44.164663",{"slug":3163,"name":3163,"fn":3164,"description":3165,"org":3166,"tags":3167,"stars":26,"repoUrl":27,"updatedAt":3176},"eas-hosting","deploy Expo websites to EAS Hosting","EAS service (paid). Deploy Expo websites and Expo Router API routes to EAS Hosting - export the web bundle, run eas deploy for production and PR preview URLs, manage environment secrets and custom domains, and work within the Cloudflare Workers runtime. Also covers authoring API routes (+api.ts handlers, HTTP methods, request handling, CORS). Use when deploying an Expo web app or API routes, setting up EAS Hosting, or configuring hosting environments and domains. Not for native builds or store releases - use the eas-app-stores skill for those.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3168,3169,3170,3173],{"name":3156,"slug":3157,"type":15},{"name":9,"slug":8,"type":15},{"name":3171,"slug":3172,"type":15},"Frontend","frontend",{"name":3174,"slug":3175,"type":15},"Web Development","web-development","2026-07-24T05:36:40.193701",{"slug":3178,"name":3178,"fn":3179,"description":3180,"org":3181,"tags":3182,"stars":26,"repoUrl":27,"updatedAt":3191},"eas-observe","configure EAS Observe for Expo apps","EAS service (paid). Use for anything related to EAS Observe - adding `expo-observe` to an Expo project (AppMetricsRoot\u002FObserveRoot HOC, markInteractive, the useObserve hook, the Expo Router \u002F React Navigation integrations for per-route metrics, and user-defined events via `Observe.logEvent`), querying via the EAS CLI (`eas observe:metrics-summary`, `observe:metrics`, `observe:routes`, `observe:events`, `observe:versions`), or interpreting the resulting metrics (cold\u002Fwarm launch, TTR, TTI, navigation cold\u002Fwarm TTR, update download, and the TTI frameRate params for triaging slow startups).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3183,3184,3185,3188],{"name":9,"slug":8,"type":15},{"name":21,"slug":22,"type":15},{"name":3186,"slug":3187,"type":15},"Observability","observability",{"name":3189,"slug":3190,"type":15},"React Native","react-native","2026-07-24T05:36:45.220605",{"slug":4,"name":4,"fn":5,"description":6,"org":3193,"tags":3194,"stars":26,"repoUrl":27,"updatedAt":28},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3195,3196,3197,3198,3199],{"name":13,"slug":14,"type":15},{"name":24,"slug":25,"type":15},{"name":9,"slug":8,"type":15},{"name":18,"slug":19,"type":15},{"name":21,"slug":22,"type":15},{"slug":3201,"name":3201,"fn":3202,"description":3203,"org":3204,"tags":3205,"stars":26,"repoUrl":27,"updatedAt":3213},"eas-update-insights","check health of EAS Updates","EAS service (paid). Check the health of published EAS Update: crash rates, install\u002Flaunch counts, unique users, payload size, and the split between embedded and OTA users per channel. Use when the user asks how an update is performing, whether a rollout is healthy, how many users are on the embedded build vs OTA, or wants to gate CI on update health.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3206,3209,3210,3211,3212],{"name":3207,"slug":3208,"type":15},"Analytics","analytics",{"name":3156,"slug":3157,"type":15},{"name":9,"slug":8,"type":15},{"name":21,"slug":22,"type":15},{"name":3186,"slug":3187,"type":15},"2026-07-24T05:36:50.17095",{"slug":3215,"name":3215,"fn":3216,"description":3217,"org":3218,"tags":3219,"stars":26,"repoUrl":27,"updatedAt":3231},"eas-workflows","configure EAS workflows for Expo projects","EAS service (paid). Helps understand and write EAS workflow YAML files for Expo projects. Use this skill when the user asks about CI\u002FCD or workflows in an Expo or EAS context, mentions .eas\u002Fworkflows\u002F, or wants help with EAS build pipelines or deployment automation.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3220,3223,3226,3227,3228],{"name":3221,"slug":3222,"type":15},"Automation","automation",{"name":3224,"slug":3225,"type":15},"CI\u002FCD","ci-cd",{"name":3156,"slug":3157,"type":15},{"name":9,"slug":8,"type":15},{"name":3229,"slug":3230,"type":15},"YAML","yaml","2026-07-24T05:36:43.205514",{"slug":3233,"name":3233,"fn":3234,"description":3235,"org":3236,"tags":3237,"stars":26,"repoUrl":27,"updatedAt":3242},"expo-app-clip","add iOS App Clip targets to Expo","Framework (OSS). Add an iOS App Clip target to an Expo app. Use when the user mentions App Clip, AASA, apple-app-site-association, appclips, smart app banner, or wants to ship a lightweight iOS Clip invoked from a URL alongside their parent app.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3238,3239,3240,3241],{"name":9,"slug":8,"type":15},{"name":18,"slug":19,"type":15},{"name":21,"slug":22,"type":15},{"name":3189,"slug":3190,"type":15},"2026-07-24T05:36:46.195935",{"slug":3244,"name":3244,"fn":3245,"description":3246,"org":3247,"tags":3248,"stars":26,"repoUrl":27,"updatedAt":3257},"expo-brownfield","integrate Expo and React Native into native apps","Framework (OSS). Integrate Expo and React Native into an existing native iOS or Android app. Use when the user mentions brownfield, embedding React Native in a native app, AAR\u002FXCFramework, or adding Expo to an existing Kotlin\u002FSwift project. Covers both the isolated approach and the integrated approach.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3249,3250,3251,3254,3255,3256],{"name":13,"slug":14,"type":15},{"name":9,"slug":8,"type":15},{"name":3252,"slug":3253,"type":15},"Integrations","integrations",{"name":18,"slug":19,"type":15},{"name":21,"slug":22,"type":15},{"name":3189,"slug":3190,"type":15},"2026-07-24T05:36:39.682299",{"slug":3259,"name":3259,"fn":3260,"description":3261,"org":3262,"tags":3263,"stars":26,"repoUrl":27,"updatedAt":3275},"expo-data-fetching","fetch and manage data in Expo apps","Framework (OSS). Use when implementing or debugging ANY network request, API call, or data fetching. Covers fetch API, React Query, SWR, error handling, caching, offline support, and Expo Router data loaders (`useLoaderData`).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3264,3267,3270,3271,3272],{"name":3265,"slug":3266,"type":15},"API Development","api-development",{"name":3268,"slug":3269,"type":15},"Caching","caching",{"name":9,"slug":8,"type":15},{"name":21,"slug":22,"type":15},{"name":3273,"slug":3274,"type":15},"React","react","2026-07-24T05:36:42.177188",{"slug":3277,"name":3277,"fn":3278,"description":3279,"org":3280,"tags":3281,"stars":26,"repoUrl":27,"updatedAt":3290},"expo-dev-client","build and distribute Expo development clients","Framework (OSS). Build and distribute Expo development clients locally or via TestFlight for internal testing. For production TestFlight releases and store submission, use the eas-app-stores skill.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3282,3283,3284,3285,3286,3289],{"name":13,"slug":14,"type":15},{"name":3156,"slug":3157,"type":15},{"name":9,"slug":8,"type":15},{"name":18,"slug":19,"type":15},{"name":3287,"slug":3288,"type":15},"Local Development","local-development",{"name":21,"slug":22,"type":15},"2026-07-24T05:36:51.160719",{"slug":3292,"name":3292,"fn":3293,"description":3294,"org":3295,"tags":3296,"stars":26,"repoUrl":27,"updatedAt":3301},"expo-dom","run web components in native apps","Framework (OSS). Use Expo DOM components to run web code in a webview on native and as-is on web. Migrate web code to native incrementally. For the end-to-end migration of a whole web app, use the expo-web-to-native skill.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3297,3298,3299,3300],{"name":9,"slug":8,"type":15},{"name":3171,"slug":3172,"type":15},{"name":21,"slug":22,"type":15},{"name":3189,"slug":3190,"type":15},"2026-07-24T05:36:41.176872",{"slug":3303,"name":3303,"fn":3304,"description":3305,"org":3306,"tags":3307,"stars":26,"repoUrl":27,"updatedAt":3312},"expo-examples","integrate Expo example projects","Framework (OSS). Expo's official example projects - the expo\u002Fexamples repo of ~70 `with-*` integrations (Stripe, Clerk, Supabase, OpenAI, maps, Reanimated, SQLite, Skia, NativeWind, and more). Use when integrating a third-party library or service into an existing Expo app and you want the canonical, version-matched pattern to adapt, or when scaffolding a new project from one with `npx create-expo --example`.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3308,3309,3310,3311],{"name":9,"slug":8,"type":15},{"name":3252,"slug":3253,"type":15},{"name":21,"slug":22,"type":15},{"name":3189,"slug":3190,"type":15},"2026-07-24T05:36:35.174379",24,{"items":3315,"total":3369},[3316,3324,3331,3338,3346,3354,3362],{"slug":3149,"name":3149,"fn":3150,"description":3151,"org":3317,"tags":3318,"stars":26,"repoUrl":27,"updatedAt":3161},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3319,3320,3321,3322,3323],{"name":13,"slug":14,"type":15},{"name":3156,"slug":3157,"type":15},{"name":9,"slug":8,"type":15},{"name":18,"slug":19,"type":15},{"name":21,"slug":22,"type":15},{"slug":3163,"name":3163,"fn":3164,"description":3165,"org":3325,"tags":3326,"stars":26,"repoUrl":27,"updatedAt":3176},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3327,3328,3329,3330],{"name":3156,"slug":3157,"type":15},{"name":9,"slug":8,"type":15},{"name":3171,"slug":3172,"type":15},{"name":3174,"slug":3175,"type":15},{"slug":3178,"name":3178,"fn":3179,"description":3180,"org":3332,"tags":3333,"stars":26,"repoUrl":27,"updatedAt":3191},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3334,3335,3336,3337],{"name":9,"slug":8,"type":15},{"name":21,"slug":22,"type":15},{"name":3186,"slug":3187,"type":15},{"name":3189,"slug":3190,"type":15},{"slug":4,"name":4,"fn":5,"description":6,"org":3339,"tags":3340,"stars":26,"repoUrl":27,"updatedAt":28},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3341,3342,3343,3344,3345],{"name":13,"slug":14,"type":15},{"name":24,"slug":25,"type":15},{"name":9,"slug":8,"type":15},{"name":18,"slug":19,"type":15},{"name":21,"slug":22,"type":15},{"slug":3201,"name":3201,"fn":3202,"description":3203,"org":3347,"tags":3348,"stars":26,"repoUrl":27,"updatedAt":3213},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3349,3350,3351,3352,3353],{"name":3207,"slug":3208,"type":15},{"name":3156,"slug":3157,"type":15},{"name":9,"slug":8,"type":15},{"name":21,"slug":22,"type":15},{"name":3186,"slug":3187,"type":15},{"slug":3215,"name":3215,"fn":3216,"description":3217,"org":3355,"tags":3356,"stars":26,"repoUrl":27,"updatedAt":3231},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3357,3358,3359,3360,3361],{"name":3221,"slug":3222,"type":15},{"name":3224,"slug":3225,"type":15},{"name":3156,"slug":3157,"type":15},{"name":9,"slug":8,"type":15},{"name":3229,"slug":3230,"type":15},{"slug":3233,"name":3233,"fn":3234,"description":3235,"org":3363,"tags":3364,"stars":26,"repoUrl":27,"updatedAt":3242},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3365,3366,3367,3368],{"name":9,"slug":8,"type":15},{"name":18,"slug":19,"type":15},{"name":21,"slug":22,"type":15},{"name":3189,"slug":3190,"type":15},22]