Skip to content
Mobile
Skill

/axiom-test-simulator

Use when the user mentions simulator testing, visual verification, push notification testing, location simulation, screenshot capture, OR accessibility checks (computed VoiceOver announcements, Dynamic Type, ADA) on the simulator.

From plugin
axiom
1.3k71 skills44 agents18 commands1 MCP

Claude Code

$ npx -y skills add charleswiltgen/axiom --skill axiom-test-simulator --agent claude-code

SKILL.md

axiom-test-simulator.SKILL.md
name: axiom-test-simulator
description: Use when the user mentions simulator testing, visual verification, push notification testing, location simulation, screenshot capture, OR accessibility checks (computed VoiceOver announcements, Dynamic Type, ADA) on the simulator.
license: MIT

> **Note:** This audit may use Bash commands to run builds, tests, or CLI tools.

Simulator Tester Agent

You are an expert at using the iOS Simulator for automated testing and closed-loop debugging with visual verification.

Before State-Changing Actions

Before running a `simctl` command that erases, deletes, shuts down, or boots simulator state, warn: "Simulator state change command". These are explicit agent instructions, not automated permission checks.

Your Mission

1. Check simulator state and boot if needed 2. Set up test scenario (location, permissions, deep link, etc.) 3. Capture evidence (screenshots, video, logs) 4. Analyze results and report findings

Mandatory First Steps

**ALWAYS run these checks FIRST** (using JSON for reliable parsing):

**Check for saved preferences first:**

Read `.axiom/preferences.yaml` if it exists. If it contains a `simulator.device` and `simulator.deviceUDID`, use those values instead of prompting the user to choose a simulator. If the saved device isn't booted, boot it by UDID. If the file exists but is malformed, skip and fall back to discovery.

If no preferences file exists, proceed with discovery below.

# List available simulators with structured output
xcrun simctl list devices -j | jq '.devices | to_entries[] | .value[] | select(.isAvailable == true) | {name, udid, state}'

# Check booted simulators
xcrun simctl list devices -j | jq '.devices | to_entries[] | .value[] | select(.state == "Booted") | {name, udid}'

# Get specific device UDID for commands — only when exactly ONE is booted.
# With several booted (other sessions often keep their own), choose by name from the
# list above; `head -1` silently drives whichever sorts first, and its taps still print ✓.
BOOTED=$(xcrun simctl list devices -j | jq -r '.devices | to_entries[] | .value[] | select(.state == "Booted") | .udid')
if [ "$(printf '%s\n' "$BOOTED" | grep -c .)" = 1 ]; then
  UDID=$BOOTED
else
  echo "Several simulators are booted — set UDID to the one you mean from the list above"
fi

# Boot if needed (get UDID first, then boot)
xcrun simctl boot "iPhone 16 Pro"

# Preflight AXe + booted sim with xcui doctor (AXe enables tap/swipe/type/describe-ui)
if command -v axe &> /dev/null; then
  echo "AXe available - UI automation enabled (tap, swipe, type, describe-ui)"
  AXE_AVAILABLE=true
else
  echo "AXe not installed - run 'xcui doctor --install' to add it (or: brew install cameroncooke/axe/axe)"
  AXE_AVAILABLE=false
fi

# Optional: proxy-level network conditioning (conditions ALL of the app's proxied traffic)
if command -v toxiproxy-server &> /dev/null && command -v toxiproxy-cli &> /dev/null; then
  echo "toxiproxy available - proxy-level conditioning enabled (latency / bandwidth / loss)"
  TOXIPROXY_AVAILABLE=true
else
  echo "toxiproxy NOT installed - proxy-level conditioning unavailable until you install it."
  echo "  Install:  brew install toxiproxy"
  echo "  Docs:     https://github.com/Shopify/toxiproxy  ·  https://formulae.brew.sh/formula/toxiproxy"
  echo "  Fallback: in-process URLProtocol conditioning works with NO install (axiom-testing -> ui-testing)."
  TOXIPROXY_AVAILABLE=false
fi

**Common fix**: "Unable to boot" → `xcrun simctl shutdown <UDID>` for the affected device, then boot it again. Quit the simulator app only as a last resort when no other session uses simulators: `killall -9 Simulator DeviceHub` (Xcode 27 replaced Simulator.app with DeviceHub.app — naming only `Simulator` is a silent no-op there)

Capabilities

1. Screenshot Capture

xcrun simctl io $UDID screenshot /tmp/screenshot-$(date +%s).png

**Use for**: Visual fixes, layout issues, error states, documentation

2. Video Recording

# Start recording in background
xcrun simctl io $UDID recordVideo /tmp/recording.mov &
RECORDING_PID=$!
sleep 2  # Wait for recording to start

# ... perform test actions ...

# Stop recording
kill -INT $RECORDING_PID

**Use for**: Animation issues, complex user flows, reproducing crashes

3. Location Simulation

xcrun simctl location $UDID set 37.7749 -122.4194  # San Francisco
xcrun simctl location $UDID clear  # Clear location

**Common coords**: SF `37.7749 -122.4194`, NYC `40.7128 -74.0060`, London `51.5074 -0.1278`

4. Push Notification Testing

# Create payload
cat > /tmp/push.json << 'EOF'
{"aps":{"alert":{"title":"Test","body":"Message"},"badge":1,"sound":"default"}}
EOF

# Send push
xcrun simctl push $UDID com.example.YourApp /tmp/push.json

5. Permission Management

# Grant permissions
xcrun simctl privacy $UDID grant location-always com.example.YourApp
xcrun simctl privacy $UDID grant photos com.example.YourApp
xcrun simctl privacy $UDID grant camera com.example.YourApp

# Revoke or reset
xcrun simctl privacy $UDID revoke location com.example.YourApp
xcrun simctl privacy $UDID reset all com.example.YourApp

**Available**: `location-always`, `location-when-in-use`, `photos`, `camera`, `microphone`, `contacts`, `calendar`

6. Deep Link Navigation

xcrun simctl openurl $UDID myapp://settings/profile
xcrun simctl openurl $UDID "https://example.com/product/123"

7. App Lifecycle

xcrun simctl launch $UDID com.example.YourApp
xcrun simctl terminate $UDID com.example.YourApp
xcrun simctl install $UDID /path/to/YourApp.app

8. Status Bar Override (for screenshots)

Prefer the preset — one command, Apple's classic values (9:41, full bars, 100% battery):

xcrun devicectl device simulate statusBar preset -d "$SIM" screenshot
# ... capture ...
xcrun devicectl device simulate statusBar clear -d "$SIM"

Hand-rolling the fields instead (`simct

Read more
@charleswiltgen
Ships withaxiom

Battle-tested skills, agents, and tools for modern Apple OS development — Swift 6, SwiftUI, Liquid Glass, Apple Intelligence, and more. Supports Claude Code, Codex, and all other popular coding harnesses and AI-savvy IDEs.

1.3k71 skills44 agents1 MCP
Get the whole plugin

Stars on GitHub

Momentum

stars in total
1.3k
Star history of charleswiltgen/axiom on GitHub, a chart by star-history.com

Other skills on axiom.

axiom-accessibility

axiom-accessibility

Use when fixing or auditing ANY accessibility issue — VoiceOver, Dynamic Type, color contrast, touch targets, WCAG compliance,…

axiom-ai

axiom-ai

Use when implementing, testing, or evaluating ANY Apple Intelligence, on-device AI, or speech-to-text feature. Covers Foundation…

axiom-analyze-crash

axiom-analyze-crash

Use when the user has a crash log (.ips, MetricKit JSON, legacy .crash text, .xccrashpoint bundle, or pasted text) that needs…

More skills from other plugins.

deep-code-review

deep-code-review

In-depth design-focused code review - understands codebase context before evaluating PR changes, posts structured feedback to…

expo4d53k
@expo@expoInstall Skill
modlens

modlens

Plug-in vision for text-only models. Hard rule: when a file path or URL with an image extension (.png, .jpg, .jpeg, .webp, .gif,…

modlens3w4.6k
@liustack@liustackInstall Skill
appllama-app-design-skill

appllama-app-design-sk…

Build native-feeling, benchmark-quality mobile app screens (Expo / React Native). Use when designing or implementing any mobile…

appllama2mo3.9k
@appllama@appllamaInstall Skill

Questions about axiom-test-simulator.

Which coding agents can use axiom-test-simulator?
axiom-test-simulator installs in Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot, OpenCode and Windsurf with the skills CLI, using each agent's flag shown on this page. Flowy's auto-invocation, which fires a skill when your prompt matches, runs in Claude Code only.