home / skills / tristanmanchester / agent-skills / ios-simulator

ios-simulator skill

/ios-simulator

This skill automates iOS Simulator workflows, enabling testers and developers to manage devices, install apps, run UI actions, and capture screenshots.

npx playbooks add skill tristanmanchester/agent-skills --skill ios-simulator

Review the files below or copy the command above to add this skill to your agents.

Files (5)
SKILL.md
5.4 KB
---
name: ios-simulator
description: This skill should be used when the user asks to "test on iOS simulator", "run app on iPhone", "take iOS screenshot", "tap button in simulator", "automate iOS UI", "install app on simulator", "boot simulator", or when working with iOS apps, Xcode, Simulator, simctl, idb, UI automation, or iOS testing. It automates iOS Simulator workflows including device lifecycle (create/boot/erase), app management (install/launch), push notifications, privacy grants, screenshots, and accessibility-based UI navigation.
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 management
- `idb` 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

- **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).  
- `idb` is optional, but required for UI tree / semantic tapping. (Install steps below.)

## Quick start

```bash
# 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 `--pretty` to pretty-print JSON.
- Add `--text` for a short human-readable summary (when provided by the command).
- Commands that can be huge (`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 <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:
```bash
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:
```bash
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 ...]`
- `record-video --out <file.mp4> [--udid ...]` (runs until Ctrl+C)

### 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]`
- `ui tree` (full UI JSON array)
- `ui find --query <text> [--limit 20]`
- `ui tap --query <text>` (find + tap best match)
- `ui tap --x <num> --y <num>` (raw coordinate tap)
- `ui type --text <text>`
- `ui button --name HOME|LOCK|SIRI|SIDE_BUTTON|APPLE_PAY`

## Troubleshooting

See: [references/TROUBLESHOOTING.md](references/TROUBLESHOOTING.md)

Overview

This skill automates iOS Simulator workflows from the command line, designed for macOS and Xcode environments. It wraps xcrun simctl for simulator lifecycle and app management, and optionally uses idb for accessibility-driven UI inspection and interaction. The tool produces compact, machine-friendly output by default and supports human-readable modes when needed.

How this skill works

The skill exposes a Node CLI that issues simctl commands for listing, creating, booting, erasing, and deleting simulators, plus app install/launch/terminate and screenshots/video. When idb is available it queries the accessibility tree and can synthesize taps, typing, and semantic queries (find/tap/button). State (selected UDID) is stored in a local state file and commands accept explicit UDID overrides.

When to use it

  • Run an app on an iOS Simulator from CI or a macOS node
  • Take automated screenshots or record video of a simulator session
  • Automate UI interactions using accessibility queries (requires idb)
  • Install, uninstall, launch, or manage app containers on a simulator
  • Grant/revoke privacy permissions or send simulated push notifications

Best practices

  • Run commands on macOS with Xcode CLI tools installed and xcode-select configured
  • Install idb for reliable accessibility inspection and semantic taps (brew + pip steps)
  • Use the select command to write a default UDID state file for repeatable commands
  • Prefer --udid for explicit targeting in CI or multi-simulator flows
  • Treat erase/delete as dangerous and require --yes to avoid accidental data loss

Example use cases

  • Set up a consistent simulator in CI: list -> select --boot -> app install -> app launch
  • Automation test: boot simulator, install app, use ui find/tap/type to run a login flow, then screenshot
  • Privacy testing: grant specific simulator permissions, run app behavior scenarios, then revoke or reset
  • Push notification flow: send simulated push payloads to exercise notification handling in-app
  • Diagnostics: capture logs, screenshots, or full UI tree for debugging flaky UI elements

FAQ

Does this run outside macOS?

No. All simulator and simctl operations require macOS with Xcode tooling. Run commands on a remote macOS node if needed.

Is idb required?

idb is optional. simctl operations work without it, but idb is required for accessibility tree inspection and semantic UI actions like ui tap or ui type.

How does the tool output results?

By default it emits compact single-line JSON for machine parsing. Use --pretty for formatted JSON or --text for short human-readable summaries.