ワンクリックで
agent-device
// Automates interactions for iOS simulators/devices and Android emulators/devices. Use when navigating apps, taking snapshots/screenshots, tapping, typing, scrolling, or extracting UI info on mobile targets.
// Automates interactions for iOS simulators/devices and Android emulators/devices. Use when navigating apps, taking snapshots/screenshots, tapping, typing, scrolling, or extracting UI info on mobile targets.
Use when working with Hot Updater CLI setup, deployment, patch artifacts, bundle inventory/state, rollback, channels, code signing keys, database migration, diagnostics, or AI-assisted React Native OTA operations.
Generate and execute PR-aware OTA E2E scenarios for `examples/v0.85.0` by diffing the checked-out branch against its PR base branch or default branch, inferring the affected runtime, rollout, and recovery surfaces, and then running the scenario through `../e2e`. Use when the caller wants current-branch OTA validation without hand-writing the scenario.
Run a fixed OTA regression flow for `examples/v0.85.0` with `agent-device`. Use when the caller wants a built-in end-to-end scenario instead of defining one manually: deploy a known-good OTA bundle, verify a visible UI change plus the deployed `bundleId`, then deploy an intentionally crashing OTA bundle and verify rollback to the previous stable bundle with `RECOVERED` and `crashedBundleId` evidence.
Run end-to-end OTA verification for `examples/v0.85.0` with `agent-device`. Use when validating iOS or Android release builds, deploying OTA bundles with `pnpm hot-updater deploy`, checking stable update application, reproducing rollback after a crash bundle, or reading bundle-store metadata and crash history for the v0.85.0 example app.
Use when an AI agent needs to queue, monitor, diagnose, and iterate on HotUpdater E2E dashboard jobs through the Mac mini `hot-updater-agent` CLI instead of running local device flows directly. Trigger for requests to run PR E2E through the dashboard, inspect queued E2E failures, tail bot logs, or fix-and-rerun E2E until green.
Run a local pnpm monorepo CI loop, fix failures, and stop only when the full sequence is green. Use when Codex is asked to fix CI, make a repository green, or resolve failures from `pnpm -w build`, `pnpm -w test:type`, `pnpm -w lint`, `pnpm -w test`, or `pnpm -w test:integration`.
| name | agent-device |
| description | Automates interactions for iOS simulators/devices and Android emulators/devices. Use when navigating apps, taking snapshots/screenshots, tapping, typing, scrolling, or extracting UI info on mobile targets. |
For exploration, use snapshot refs. For deterministic replay, use selectors. For structured exploratory QA bug hunts and reporting, use ../dogfood/SKILL.md.
Use this skill as a router, not a full manual.
devices -> pick target -> open.open -> snapshot -i -> press/fill -> diff snapshot -i -> closeopen <app> -> logs clear --restart -> reproduce -> network dump -> logs path -> targeted grepreplay -u <path> -> verify updated selectorsensure-simulator first and pass --device, --udid, or --ios-simulator-device-set on later commands.install or reinstall for .apk/.aab files, then relaunch by installed package name.runtime set before open <package> --relaunch.--serial, --device, --udid, or an isolation scope.agent-device open Settings --platform ios
agent-device snapshot -i
agent-device press @e3
agent-device diff snapshot -i
agent-device fill @e5 "test"
agent-device close
agent-device ensure-simulator --platform ios --device "iPhone 16" --boot
agent-device open MyApp --platform ios --device "iPhone 16" --session qa-ios --relaunch
agent-device snapshot -i
agent-device press @e3
agent-device close
Use this when a physical iPhone is also connected and you want deterministic simulator-only automation.
agent-device reinstall MyApp /path/to/app-debug.apk --platform android --serial emulator-5554
agent-device runtime set --session qa-android --platform android --metro-host 10.0.2.2 --metro-port 8081
agent-device open com.example.myapp --platform android --serial emulator-5554 --session qa-android --relaunch
agent-device snapshot -i
agent-device close
Do not use open <apk|aab> --relaunch on Android. Install/reinstall binaries first, then relaunch by package.
agent-device open MyApp --platform ios
agent-device logs clear --restart
agent-device network dump 25
agent-device logs path
Logging is off by default. Enable only for debugging windows.
logs clear --restart requires an active app session (open <app> first).
agent-device replay -u ./session.ad
# Client points directly at the remote daemon HTTP base URL.
export AGENT_DEVICE_DAEMON_BASE_URL=http://mac-host.example:4310
export AGENT_DEVICE_DAEMON_AUTH_TOKEN=<token>
# Allocate lease
curl -sS "${AGENT_DEVICE_DAEMON_BASE_URL}/rpc" \
-H "content-type: application/json" \
-H "Authorization: Bearer <token>" \
-d '{"jsonrpc":"2.0","id":"alloc-1","method":"agent_device.lease.allocate","params":{"runId":"run-123","tenantId":"acme","ttlMs":60000}}'
# Use lease in tenant-isolated command execution
agent-device \
--tenant acme \
--session-isolation tenant \
--run-id run-123 \
--lease-id <lease-id> \
session list --json
# Heartbeat and release
curl -sS "${AGENT_DEVICE_DAEMON_BASE_URL}/rpc" \
-H "content-type: application/json" \
-H "Authorization: Bearer <token>" \
-d '{"jsonrpc":"2.0","id":"hb-1","method":"agent_device.lease.heartbeat","params":{"leaseId":"<lease-id>","ttlMs":60000}}'
curl -sS "${AGENT_DEVICE_DAEMON_BASE_URL}/rpc" \
-H "content-type: application/json" \
-H "Authorization: Bearer <token>" \
-d '{"jsonrpc":"2.0","id":"rel-1","method":"agent_device.lease.release","params":{"leaseId":"<lease-id>"}}'
Notes:
AGENT_DEVICE_DAEMON_BASE_URL makes the CLI skip local daemon discovery/startup and call the remote HTTP daemon directly.AGENT_DEVICE_DAEMON_AUTH_TOKEN is sent in both the JSON-RPC request token and HTTP auth headers.--debug does not tail a local daemon.log; inspect logs on the remote host instead.agent-device devices
agent-device devices --platform ios --ios-simulator-device-set /tmp/tenant-a/simulators
agent-device devices --platform android --android-device-allowlist emulator-5554,device-1234
agent-device ensure-simulator --device "iPhone 16" --ios-simulator-device-set /tmp/tenant-a/simulators
agent-device ensure-simulator --device "iPhone 16" --runtime com.apple.CoreSimulator.SimRuntime.iOS-18-4 --ios-simulator-device-set /tmp/tenant-a/simulators --boot
agent-device open [app|url] [url]
agent-device open [app] --relaunch
agent-device close [app]
agent-device install <app> <path-to-binary>
agent-device reinstall <app> <path-to-binary>
agent-device session list
Use boot only as fallback when open cannot find/connect to a ready target.
For Android emulators by AVD name, use boot --platform android --device <avd-name>.
For Android emulators without GUI, add --headless.
Use --target mobile|tv with --platform (required) to pick phone/tablet vs TV targets (AndroidTV/tvOS).
For Android React Native + Metro flows, install or reinstall the APK first, set runtime hints with runtime set, then use open <package> --relaunch; do not use open <apk|aab> --relaunch.
For local iOS QA in mixed simulator/device environments, use ensure-simulator and pass --device or --udid so automation does not attach to a physical device by accident.
Isolation scoping quick reference:
--ios-simulator-device-set <path> scopes iOS simulator discovery + command execution to one simulator set.--android-device-allowlist <serials> scopes Android discovery/selection to comma/space separated serials.--device, --udid, --serial); out-of-scope selectors fail with DEVICE_NOT_FOUND.Simulator provisioning quick reference:
ensure-simulator to create or reuse a named iOS simulator inside a device set before starting a session.--device <name> is required (e.g. "iPhone 16 Pro"). --runtime <id> pins the runtime; omit to use the newest compatible one.--boot boots it immediately. Returns udid, device, runtime, ios_simulator_device_set, created, booted.TV quick reference:
open/apps use TV launcher discovery automatically.snapshot, wait, press, fill, get, scroll, back, home, app-switcher, record and related selector flows).back/home/app-switcher map to Siri Remote actions (menu, home, double-home) in the runner.pinch, settings, and push.agent-device snapshot -i
agent-device diff snapshot -i
agent-device find "Sign In" click
agent-device press @e1
agent-device fill @e2 "text"
agent-device is visible 'id="anchor"'
press is canonical tap command; click is an alias.
agent-device appstate
agent-device clipboard read
agent-device clipboard write "token"
agent-device keyboard status
agent-device keyboard dismiss
agent-device perf --json
agent-device network dump [limit] [summary|headers|body|all]
agent-device push <bundle|package> <payload.json|inline-json>
agent-device trigger-app-event screenshot_taken '{"source":"qa"}'
agent-device get text @e1
agent-device screenshot out.png
agent-device settings permission grant notifications
agent-device settings permission reset camera
agent-device trace start
agent-device trace stop ./trace.log
agent-device batch --steps-file /tmp/batch-steps.json --json
agent-device perf --json (or metrics --json) after open.snapshot -i; scope/depth only when needed.find "<query>" click --json returns { ref, locator, query, x, y } — all derived from the matched snapshot node. Do not rely on these fields from raw press/click responses for observability; use find instead.fill for clear-then-type semantics; use type for focused append typing.install for in-place app upgrades (keep app data when platform permits), and reinstall for deterministic fresh-state runs.install/reinstall: Android .apk/.aab, iOS .app/.ipa..aab requires bundletool in PATH, or AGENT_DEVICE_BUNDLETOOL_JAR=<path-to-bundletool-all.jar> with java in PATH..aab optional: set AGENT_DEVICE_ANDROID_BUNDLETOOL_MODE=<mode> to control bundletool build-apks --mode (default: universal)..ipa: extract/install from Payload/*.app; when multiple app bundles are present, <app> is used as a bundle id/name hint.appstate is session-scoped; Android appstate is live foreground state. iOS responses include device_udid and ios_simulator_device_set for isolation verification.open responses include device_udid and ios_simulator_device_set to confirm which simulator handled the session.clipboard read / clipboard write <text> are supported on Android and iOS simulators; iOS physical devices are not supported yet.keyboard status|get|dismiss report keyboard visibility/type and dismiss via keyevent when visible.network dump is best-effort and parses HTTP(s) entries from the session app log file.settings faceid|touchid <match|nonmatch|enroll|unenroll>; Android supports settings fingerprint <match|nonmatch> where runtime tooling is available.--target with --platform (ios, android, or apple alias); target-only selection is invalid.push simulates notification delivery:
trigger-app-event requires app-defined deep-link hooks and URL template configuration (AGENT_DEVICE_APP_EVENT_URL_TEMPLATE or platform-specific variants).trigger-app-event requires an active session or explicit selectors (--platform, --device, --udid, --serial); on iOS physical devices, custom-scheme triggers require active app context.website/docs/docs/commands.md under App event triggers.settings permission <grant|deny|reset> <camera|microphone|photos|contacts|notifications> [full|limited]alert wait then alert accept/dismiss — accept/dismiss retry internally for up to 2 s so you do not need manual sleeps. See references/permissions.md.full|limited mode applies only to iOS photos; other targets reject mode.fill/type may require an ADB keyboard IME on some system images; only install IME APKs from trusted sources and verify checksum/signature.--save-script, prefer explicit path syntax (--save-script=flow.ad or ./flow.ad).--tenant, --session-isolation tenant, --run-id, and --lease-id together.AGENT_DEVICE_IOS_SIMULATOR_DEVICE_SET (compat IOS_SIMULATOR_DEVICE_SET) and
AGENT_DEVICE_ANDROID_DEVICE_ALLOWLIST (compat ANDROID_DEVICE_ALLOWLIST).AGENT_DEVICE_DAEMON_BASE_URL / --daemon-base-url instead of relying on local daemon metadata or loopback-only ports.Failed to access Android app sandbox for /path/app-debug.apk: Android relaunch/runtime-hint flow received an APK path instead of an installed package name. Use reinstall first, then open <package> --relaunch.mkdir: Needs 1 argument while writing ReactNativeDevPrefs.xml: likely an older agent-device build or stale global install is still using the shell-based Android runtime-hint writer. Verify the exact binary being invoked.Failed to terminate iOS app: the flow may have selected a physical iPhone or an unavailable iOS target. Re-run with ensure-simulator, then pin the simulator with --device or --udid.agent-device binary over on-demand package execution.npx --yes agent-device@<exact-version> --help).~/.agent-device; replay scripts write to explicit paths you provide.AGENT_DEVICE_DAEMON_SERVER_MODE=http|dual on the host plus client-side AGENT_DEVICE_DAEMON_BASE_URL, with AGENT_DEVICE_HTTP_AUTH_HOOK and tenant-scoped lease admission where needed.--activity (unsupported combination).boot as default first step instead of fallback.