Skill: Simulators and Emulators

SkillDev tools

How to list, pick, and boot Android emulators and iOS simulators for local app runs.

Available today. Use it from your connected AI after setup.

Connect ahel once, and every AI you use reads what you have installed.

Then ask your AI: use the Skill: Simulators and Emulators skill

What this skill tells your AI

The instructions your AI receives, as published by championswimmer/twofac in .agents/skills/simulators-emulators/SKILL.md and read by ahel’s review.

IMPORTANT: Preferred iOS Simulator Name: iPhone 16 w Watch (local), iPhone 16 CI Preferred Android Emulator Name: Pixel_9 (local), pixel_6 CI

Use this skill to discover local Android emulators and iOS simulators, pick a target interactively, and boot it before running the app.

It also supports clearing app data for a specific Android package or resetting an iOS Simulator app by uninstalling its bundle from a selected simulator.

Companion scripts

  • Shared helpers: .agents/skills/simulators-emulators/scripts/simulatorTools.mjs
  • Android picker: .agents/skills/simulators-emulators/scripts/android-emulator-picker.mjs
  • iOS picker: .agents/skills/simulators-emulators/scripts/ios-simulator-picker.mjs

Common checks

  • Android AVD list: emulator -list-avds
  • Running Android devices: adb devices -l
  • iOS devices/runtimes (JSON): xcrun simctl list --json

Android emulators

List and pick

  • List with script: node .agents/skills/simulators-emulators/scripts/android-emulator-picker.mjs --list
  • Interactive pick: node .agents/skills/simulators-emulators/scripts/android-emulator-picker.mjs
  • Pick and boot: node .agents/skills/simulators-emulators/scripts/android-emulator-picker.mjs --boot
  • Pick by AVD name: node .agents/skills/simulators-emulators/scripts/android-emulator-picker.mjs --avd Pixel_8_API_34 --boot
  • Clear app data for a package on the selected emulator: node .agents/skills/simulators-emulators/scripts/android-emulator-picker.mjs --boot --clear-app-data tech.arnav.twofac.app
  • Clear app data for a package on a specific AVD: node .agents/skills/simulators-emulators/scripts/android-emulator-picker.mjs --avd Pixel_8_API_34 --clear-app-data tech.arnav.twofac.app

Run app on selected emulator

Use shell output to set ANDROID_SERIAL:

eval "$(node .agents/skills/simulators-emulators/scripts/android-emulator-picker.mjs --boot --shell)"
ANDROID_SERIAL="$ANDROID_SERIAL" ./gradlew :androidApp:installDebug
adb -s "$ANDROID_SERIAL" shell am start -n tech.arnav.twofac.app/.MainActivity
adb -s "$ANDROID_SERIAL" shell dumpsys activity activities | rg 'Resumed: ActivityRecord|mCurrentFocus|mFocusedApp'

When multiple emulators/devices are connected, always pass ANDROID_SERIAL (or adb -s <serial>) to avoid ambiguous target errors.

Clear app data on Android

The Android script uses adb shell pm clear <package> against the selected emulator. This keeps the app installed but removes its local state:

node .agents/skills/simulators-emulators/scripts/android-emulator-picker.mjs \
  --avd Pixel_8_API_34 \
  --clear-app-data tech.arnav.twofac.app

Use --boot as well if you want the script to explicitly boot the emulator first; the script will also boot automatically when --clear-app-data targets a stopped emulator.

iOS simulators

List and pick

  • List with script: node .agents/skills/simulators-emulators/scripts/ios-simulator-picker.mjs --list
  • Interactive pick: node .agents/skills/simulators-emulators/scripts/ios-simulator-picker.mjs
  • Pick and boot: node .agents/skills/simulators-emulators/scripts/ios-simulator-picker.mjs --boot
  • Pick by UDID: node .agents/skills/simulators-emulators/scripts/ios-simulator-picker.mjs --udid <UDID> --boot
  • Clear app data for a bundle on the selected simulator: node .agents/skills/simulators-emulators/scripts/ios-simulator-picker.mjs --clear-app-data tech.arnav.twofac.app
  • Clear app data for a bundle on a specific simulator: node .agents/skills/simulators-emulators/scripts/ios-simulator-picker.mjs --udid <UDID> --clear-app-data tech.arnav.twofac.app

Run app on selected simulator

Use shell output to set IOS_SIMULATOR_UDID:

eval "$(node .agents/skills/simulators-emulators/scripts/ios-simulator-picker.mjs --boot --shell)"
xcodebuild \
  -workspace iosApp/iosApp.xcworkspace \
  -scheme iosApp \
  -destination "platform=iOS Simulator,id=$IOS_SIMULATOR_UDID"

UDID is preferred over simulator name because names are often duplicated across runtimes.

Clear app data on iOS Simulator

For iOS Simulator, the script clears app data by uninstalling the selected app bundle with xcrun simctl uninstall <UDID> <bundleId>. This removes the app sandbox, so reinstall the app afterward before launching it again:

node .agents/skills/simulators-emulators/scripts/ios-simulator-picker.mjs \
  --udid "$IOS_SIMULATOR_UDID" \
  --clear-app-data tech.arnav.twofac.app

Script behavior notes

  • Android boot readiness checks sys.boot_completed before returning.
  • Android app-data clearing uses adb shell pm clear <package> on the selected emulator.
  • iOS boot uses xcrun simctl bootstatus <UDID> -b to wait for full readiness.
  • iOS app-data clearing uses xcrun simctl uninstall <UDID> <bundleId> to reset the app sandbox.
  • Android script reads AVD metadata from avdmanager list avd and running serials from adb devices -l.
  • iOS script reads simulator inventory from xcrun simctl list --json and filters to available iOS runtimes/devices.

Signals

GitHub stars
125
Forks
8
Last commit
Jun 2026
Advanced
Catalog kind
skill
Gateway key
simulators-emulators
Source
github.com/championswimmer/twofac