Drive iOS and Android devices for the Expensify App - testing, debugging, performance profiling, bug reproduction, and feature verification. Use when the developer needs to interact with the mobile app on a device.
70
88%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
Passed
No findings from the security scan
These checks evaluate at skill load. If any line shows FAIL, stop and surface the fix before running any device command.
agent-device version: !R=0.20.0; V=$(agent-device --version 2>/dev/null); [ -n "$V" ] && [ "$(printf '%s\n%s\n' "$R" "$V" | sort -V | head -1)" = "$R" ] && echo "OK ($V)" || echo "FAIL (need v$R+, got: ${V:-not installed}). Fix: npm install -g agent-device@latest"
Bundled CLI skills dir: !D="$(npm root -g)/agent-device/skills/agent-device"; test -s "$D/SKILL.md" && echo "OK ($D)" || echo "FAIL (missing $D/SKILL.md). Fix: npm install -g agent-device@latest"
HybridApp mode: !M=$(scripts/is-hybrid-app.sh 2>/dev/null | tail -1); [ "$M" = "true" ] && echo "OK (HybridApp)" || echo "FAIL (got: ${M:-unknown}). This skill only supports the HybridApp build - ensure the Mobile-Expensify submodule is present."
Run this sequence the first time the user asks for device interaction in a session, before any open / snapshot / replay.
If the user prompt names ios or android explicitly, use it. Otherwise ask. Only iOS and Android are supported; reject other platforms.
HybridApp dev builds only (the pre-flight gate enforces this).
| Platform | Bundle ID | Build command from App root |
|---|---|---|
ios | com.expensify.expensifylite | npm run ios |
android | org.me.mobiexpensifyg.dev | npm run android |
agent-device apps --platform <p> --jsonIf the resolved bundle ID is missing from the list, STOP and instruct the developer to run the matching build command from the App repository root. The build script detects HybridApp mode and builds the native app from Mobile-Expensify/.
agent-device metro prepare --public-base-url http://localhost:8081 --port 8081 --kind react-nativeIf metro prepare fails, STOP and surface the error verbatim.
agent-device devices --platform <p> --jsonbooted=true.Capture the device name and (for iOS) the simulator UDID, or (for Android) the serial.
agent-device session list --jsonFor each entry whose device_udid (iOS) or serial (Android) matches the chosen device:
reuse (continue with the existing session) or reset (force-close it).
agent-device close --shutdown --session <name>. --shutdown also frees the simulator.agent-device open <bundle-id> --platform <p> --device "<name>"If open errors with "app not installed", revisit step 3.
agent-device snapshot -iConfirm the app rendered. From here, follow the Agent decision loop for repeatable flows or drive interactively.
After opening or relaunching the App, inspect agent-device snapshot -i for React Native development overlays before interacting.
If the snapshot reports a LogBox warning, run:
agent-device react-native dismiss-overlay
agent-device snapshot -iContinue only when the fresh snapshot no longer reports the overlay. Multiple LogBox banners can require repeated dismiss-overlay and fresh snapshot -i calls. If the snapshot reports a RedBox fatal error, stop and surface the error instead of dismissing it.
Before pressing an action that may be covered by an overlay or system UI:
agent-device snapshot -i
agent-device screenshot --overlay-refsUse a stable selector or a fresh @eN reference. Confirm the target is reported as hittable. Never use coordinates to bypass interactionBlocked: "covered", reason: "offscreen_ref", or targetHittable: false.
When a target is rejected, capture agent-device screenshot --overlay-refs. Dismiss a recoverable LogBox overlay when present, capture a fresh snapshot -i, and retry only through a selector or fresh reference. Otherwise stop and report the blocker.
After pressing the action, verify the expected destination or control state with wait, is, find, or a fresh snapshot.
Read these files directly for device automation guidance (bootstrap, exploration, verification, debugging): !echo "$(npm root -g)/agent-device/skills/agent-device"
This skill owns interactive automation only: reusable setup and navigation macros under flows/macros/, with platform overrides under flows/macros/<platform>/. Propose and run macros through the Agent decision loop. flows/README.md is also the reference for the .ad metadata spec, selector rules, and recording workflow, so read it before authoring any .ad file in this repository.
Measurement flows live in the measure-telemetry-span skill, which owns its own flows/ and runner. Do not add measurement flows here.
80ba92d
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.