From react-native-hifi
Automates UI interactions on iOS simulators/devices and Android emulators/devices: open apps, snapshot/screenshot, tap/press, type/fill, scroll, extract UI info. For mobile QA, debugging, replay.
npx claudepluginhub bidah/react-native-hifi --plugin react-native-hifiThis skill uses the workspace's default tool permissions.
For exploration, use snapshot refs. For deterministic replay, use selectors.
Automates UI interactions on iOS, tvOS, macOS, and Android apps: snapshots/screenshots, tapping, typing, scrolling, UI extraction, logs, network, perf snapshots.
Automates mobile app testing on iOS simulators/Android emulators using Appium, Detox, XCUITest, Espresso, Maestro. Validates UI interactions, gestures, navigation, and platform behaviors.
Automates Android devices using Midscene.js from screenshots via ADB for taps, swipes, text input, app launches. Enables natural language control for mobile app testing, QA, and visual verification without DOM or accessibility labels.
Share bugs, ideas, or general feedback.
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.open <package> --remote-config <path> --relaunch.--serial, --device, --udid, or an isolation scope.AGENT_DEVICE_SESSION, set AGENT_DEVICE_PLATFORM, and the daemon will enforce the shared lock policy across CLI, typed client, and RPC entry points.--session-lock reject|strip (or AGENT_DEVICE_SESSION_LOCK) only when you need to override the default reject behavior. Lock mode applies to nested batch steps too.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 open com.example.myapp --remote-config ./agent-device.remote.json --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.
export AGENT_DEVICE_SESSION=qa-ios
export AGENT_DEVICE_PLATFORM=ios
export AGENT_DEVICE_SESSION_LOCK=strip
agent-device open MyApp --relaunch
agent-device snapshot -i
agent-device batch --steps-file /tmp/qa-steps.json --json
agent-device close
Use this for orchestrators that must preserve one bound session/device across many plain CLI calls without a wrapper script.
export AGENT_DEVICE_SESSION=qa-android
export AGENT_DEVICE_PLATFORM=android
agent-device reinstall MyApp /path/to/app-debug.apk --serial emulator-5554
agent-device --session-lock reject open com.example.myapp --relaunch
agent-device snapshot -i
agent-device close --shutdown
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
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>"}}'
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 install-from-source <url> [--header "name:value"]
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.
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.fill for clear-then-type semantics; use type for focused append typing.install for in-place app upgrades, and reinstall for deterministic fresh-state runs..apk/.aab, iOS .app/.ipa..aab requires bundletool in PATH.network dump is best-effort and parses HTTP(s) entries from the session app log file.--target with --platform.settings permission <grant|deny|reset> <camera|microphone|photos|contacts|notifications> [full|limited]alert wait then alert accept/dismiss — retries internally for up to 2s.Failed to access Android app sandbox for /path/app-debug.apk: Android relaunch flow received an APK path instead of package name. Use reinstall first, then open <package> --relaunch.Failed to terminate iOS app: flow may have selected a physical iPhone. Re-run with ensure-simulator, then pin with --device or --udid.--activity (unsupported combination).boot as default first step instead of fallback.agent-device binary over on-demand package execution.