axiom-accessibility
Use when fixing or auditing ANY accessibility issue — VoiceOver, Dynamic Type, color contrast, touch targets, WCAG compliance,…
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.
Claude Code
$ npx -y skills add charleswiltgen/axiom --skill axiom-test-simulator --agent claude-code
Codex
$ npx skills add charleswiltgen/axiom --skill axiom-test-simulator -a codex -y
Cursor
$ npx skills add charleswiltgen/axiom --skill axiom-test-simulator -a cursor -y
Gemini CLI
$ npx skills add charleswiltgen/axiom --skill axiom-test-simulator -a gemini-cli -y
GitHub Copilot
$ npx skills add charleswiltgen/axiom --skill axiom-test-simulator -a github-copilot -y
OpenCode
$ npx skills add charleswiltgen/axiom --skill axiom-test-simulator -a opencode -y
Windsurf
$ npx skills add charleswiltgen/axiom --skill axiom-test-simulator -a windsurf -y
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.
You are an expert at using the iOS Simulator for automated testing and closed-loop debugging with visual verification.
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.
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
**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)
xcrun simctl io $UDID screenshot /tmp/screenshot-$(date +%s).png
**Use for**: Visual fixes, layout issues, error states, documentation
# 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
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`
# 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# 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`
xcrun simctl openurl $UDID myapp://settings/profile xcrun simctl openurl $UDID "https://example.com/product/123"
xcrun simctl launch $UDID com.example.YourApp xcrun simctl terminate $UDID com.example.YourApp xcrun simctl install $UDID /path/to/YourApp.app
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
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.
Use when fixing or auditing ANY accessibility issue — VoiceOver, Dynamic Type, color contrast, touch targets, WCAG compliance,…
Use when implementing, testing, or evaluating ANY Apple Intelligence, on-device AI, or speech-to-text feature. Covers Foundation…
Use when the user has a crash log (.ips, MetricKit JSON, legacy .crash text, .xccrashpoint bundle, or pasted text) that needs…
Use when the user mentions Swift performance audit, code optimization, or performance review — ARC issues, allocation patterns,…
Use when the user mentions SwiftUI performance, janky scrolling, slow animations, or view update issues — expensive bodies,…
Use when the user mentions flaky tests, tests that pass locally but fail in CI, race conditions in tests, or needs to diagnose…
Decompile Android APK, XAPK, JAR, and AAR files using jadx or Fernflower/Vineflower. Reverse engineer Android apps, extract HTTP…