Awesome-openclaw-skills ios-simulator
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.
install
source · Clone the upstream repo
git clone https://github.com/sundial-org/awesome-openclaw-skills
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/sundial-org/awesome-openclaw-skills "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/ios-simulator" ~/.claude/skills/sundial-org-awesome-openclaw-skills-ios-simulator && rm -rf "$T"
OpenClaw · Install into ~/.openclaw/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/sundial-org/awesome-openclaw-skills "$T" && mkdir -p ~/.openclaw/skills && cp -r "$T/skills/ios-simulator" ~/.openclaw/skills/sundial-org-awesome-openclaw-skills-ios-simulator && rm -rf "$T"
manifest:
skills/ios-simulator/SKILL.mdsource content
iOS Simulator Automation
This skill provides a Node-only CLI wrapper around:
for simulator/device/app managementxcrun simctl
for accessibility-tree inspection + synthesised UI input (tap/text/button)idb
It is designed for AI agents: minimal, structured output by default, with opt-in detail.
Important constraints
- Must run on macOS with Xcode Command Line Tools (or Xcode) available.
- If the ClawdBot gateway is not macOS, run these commands on a connected macOS node (see “Remote macOS node” below).
is optional, but required for UI tree / semantic tapping. (Install steps below.)idb
Quick start
# 1) Sanity check node {baseDir}/scripts/ios-sim.mjs health # 2) List simulators (compact) node {baseDir}/scripts/ios-sim.mjs list # 3) Select a default simulator (writes .ios-sim-state.json in the current dir) node {baseDir}/scripts/ios-sim.mjs select --name "iPhone" --runtime "iOS" --boot # 4) 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.MyApp # 5) 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)
- Default output: single-line JSON (small summary object).
- Add
to pretty-print JSON.--pretty - Add
for a short human-readable summary (when provided by the command).--text - Commands that can be huge (
,ui tree
) are opt-in.list --full
State / default UDID
select writes a state file (default: ./.ios-sim-state.json) that stores the chosen UDID.
All commands accept --udid <UUID> and otherwise fall back to the state file.
Override location with:
IOS_SIM_STATE_FILE=/path/to/state.json
Dependency notes
Xcode / simctl availability
If
xcrun cannot find simctl, ensure Xcode CLI tools are selected (via Xcode settings or xcode-select) and run the first-launch setup:
xcodebuild -runFirstLaunch
idb (for accessibility automation)
Install
idb_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 | , , , , , | No data loss |
| CAUTION | , , , | Alters simulator/app state |
| DANGEROUS | , | Requires |
Command index
All commands live under:
node {baseDir}/scripts/ios-sim.mjs <command> [subcommand] [flags]
Core simulator lifecycle
list [--full]select --name <substr> [--runtime <substr>] [--boot]boot [--udid <uuid>] [--wait]shutdown [--udid <uuid>|--all]erase --yes [--udid <uuid>|--all]delete --yes [--udid <uuid>]create --name <name> --device-type <substr> --runtime <substr>
App management
app install --app <path/to/App.app> [--udid ...]app uninstall --bundle-id <id> [--udid ...]app launch --bundle-id <id> [--udid ...] [-- <args...>]app terminate --bundle-id <id> [--udid ...]app container --bundle-id <id> [--type data|app] [--udid ...]
Screenshots & video
screenshot --out <file.png> [--udid ...]
(runs until Ctrl+C)record-video --out <file.mp4> [--udid ...]
Clipboard / URL
clipboard get [--udid ...]clipboard set --text <text> [--udid ...]openurl --url <url> [--udid ...]
Simulator permissions & push notifications
privacy grant --bundle-id <id> --service <svc[,svc...]> [--udid ...]privacy revoke --bundle-id <id> --service <svc[,svc...]> [--udid ...]privacy reset --bundle-id <id> --service <svc[,svc...]> [--udid ...]push --bundle-id <id> --payload <json-string> [--udid ...]
Logs
logs show [--last 5m] [--predicate <expr>] [--udid ...]
Accessibility-driven UI automation (requires idb)
ui summary [--limit 12]
(full UI JSON array)ui treeui find --query <text> [--limit 20]
(find + tap best match)ui tap --query <text>
(raw coordinate tap)ui tap --x <num> --y <num>ui type --text <text>ui button --name HOME|LOCK|SIRI|SIDE_BUTTON|APPLE_PAY