iOS Simulator Skill
by @tristanmanchester
21 production-ready scripts for iOS app testing, building, and automation. Provides semantic UI navigation, build automation, accessibility testing, and simulator lifecycle management. Optimized for AI agents with minimal token output.
clawhub install ios-simulator๐ About This Skill
name: ios-simulator description: Automate iOS Simulator workflows (simctl + idb): create/boot/erase devices, install/launch apps, push notifications, privacy grants, screenshots, and accessibility-based UI navigation. Use when working with iOS apps, Xcode, Simulator, simctl, idb, UI automation, or iOS testing. metadata: {"clawdbot":{"emoji":"๐ฑ","os":["darwin"],"requires":{"bins":["xcrun"]},"install":[{"brew":{"formula":"idb-companion","bins":["idb_companion"],"tap":"facebook/fb"}}]}}
iOS Simulator Automation
This skill provides a Node-only CLI wrapper around:
xcrun simctl for simulator/device/app managementidb for accessibility-tree inspection + synthesised UI input (tap/text/button)It is designed for AI agents: minimal, structured output by default, with opt-in detail.
Important constraints
idb is optional, but required for UI tree / semantic tapping. (Install steps below.)Quick start
# 1) Sanity check
node {baseDir}/scripts/ios-sim.mjs health2) List simulators (compact)
node {baseDir}/scripts/ios-sim.mjs list3) Select a default simulator (writes .ios-sim-state.json in the current dir)
node {baseDir}/scripts/ios-sim.mjs select --name "iPhone" --runtime "iOS" --boot4) Install + launch an .app
node {baseDir}/scripts/ios-sim.mjs app install --app path/to/MyApp.app
node {baseDir}/scripts/ios-sim.mjs app launch --bundle-id com.example.MyApp5) Inspect current UI (requires idb)
node {baseDir}/scripts/ios-sim.mjs ui summary
node {baseDir}/scripts/ios-sim.mjs ui tap --query "Log in"
node {baseDir}/scripts/ios-sim.mjs ui type --text "hello world"6) Screenshot
node {baseDir}/scripts/ios-sim.mjs screenshot --out artifacts/screen.png
Remote macOS node
If you are not on macOS, run the same commands on the macOS node using ClawdBotโs node execution (e.g. exec with host: node / node tools). Ensure the skill folder exists on that node, or copy it there.
Output conventions (token-efficient)
--pretty to pretty-print JSON.--text for a short human-readable summary (when provided by the command).ui tree, list --full) are opt-in.State / default UDID
select writes a state file (default: ./.ios-sim-state.json) that stores the chosen UDID.
All commands accept --udid and otherwise fall back to the state file.
Override location with:
IOS_SIM_STATE_FILE=/path/to/state.jsonDependency notes
Xcode / simctl availability
Ifxcrun cannot find simctl, ensure Xcode CLI tools are selected (via Xcode settings or xcode-select) and run the first-launch setup:
xcodebuild -runFirstLaunchidb (for accessibility automation)
Installidb_companion and the idb CLI:
brew tap facebook/fb
brew install idb-companion
python3 -m pip install --upgrade fb-idb
Safety tiers
| Tier | Commands | Notes |
|------|----------|------|
| SAFE | list, health, boot, shutdown, screenshot, ui * | No data loss |
| CAUTION | privacy *, push, clipboard *, openurl | Alters simulator/app state |
| DANGEROUS | erase, delete | Requires --yes |
Command index
All commands live under:
node {baseDir}/scripts/ios-sim.mjs [subcommand] [flags]
Core simulator lifecycle
list [--full]select --name [--runtime ] [--boot] boot [--udid ] [--wait] shutdown [--udid |--all] erase --yes [--udid |--all] delete --yes [--udid ] create --name --device-type --runtime App management
app install --app [--udid ...] app uninstall --bundle-id [--udid ...] app launch --bundle-id [--udid ...] [-- ] app terminate --bundle-id [--udid ...] app container --bundle-id [--type data|app] [--udid ...] Screenshots & video
screenshot --out [--udid ...] record-video --out [--udid ...] (runs until Ctrl+C)Clipboard / URL
clipboard get [--udid ...]clipboard set --text [--udid ...] openurl --url [--udid ...] Simulator permissions & push notifications
privacy grant --bundle-id --service [--udid ...] privacy revoke --bundle-id --service [--udid ...] privacy reset --bundle-id --service [--udid ...] push --bundle-id --payload [--udid ...] Logs
logs show [--last 5m] [--predicate ] [--udid ...] Accessibility-driven UI automation (requires idb)
ui summary [--limit 12]ui tree (full UI JSON array)ui find --query [--limit 20] ui tap --query (find + tap best match)ui tap --x --y (raw coordinate tap)ui type --text ui button --name HOME|LOCK|SIRI|SIDE_BUTTON|APPLE_PAYTroubleshooting
๐ก Examples
# 1) Sanity check
node {baseDir}/scripts/ios-sim.mjs health2) List simulators (compact)
node {baseDir}/scripts/ios-sim.mjs list3) Select a default simulator (writes .ios-sim-state.json in the current dir)
node {baseDir}/scripts/ios-sim.mjs select --name "iPhone" --runtime "iOS" --boot4) Install + launch an .app
node {baseDir}/scripts/ios-sim.mjs app install --app path/to/MyApp.app
node {baseDir}/scripts/ios-sim.mjs app launch --bundle-id com.example.MyApp5) Inspect current UI (requires idb)
node {baseDir}/scripts/ios-sim.mjs ui summary
node {baseDir}/scripts/ios-sim.mjs ui tap --query "Log in"
node {baseDir}/scripts/ios-sim.mjs ui type --text "hello world"6) Screenshot
node {baseDir}/scripts/ios-sim.mjs screenshot --out artifacts/screen.png