toolkit/packages/skills/start-ios/SKILL.md
Start iOS development with Simulator, dev server, and optional Poltergeist auto-rebuild
npx skillsauth add stevengonsalvez/agents-in-a-box start-iosInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Start iOS development with Simulator, dev server, and optional Poltergeist auto-rebuild.
/start-ios # Debug build, .env.development
/start-ios Staging # Staging build, .env.staging
/start-ios Release # Release build, .env.production
/start-ios Debug iPhone15Pro # Specific simulator
CONFIGURATION=${1:-Debug}
DEVICE=${2:-"iPhone 15 Pro"}
case $CONFIGURATION in
Debug)
ENV_FILE=".env.development"
SCHEME="Debug"
;;
Staging)
ENV_FILE=".env.staging"
SCHEME="Staging"
;;
Production|Release)
ENV_FILE=".env.production"
SCHEME="Release"
;;
esac
[ ! -f "$ENV_FILE" ] && ENV_FILE=".env"
detect_ios_project() {
if [ -d "ios" ] && [ -f "ios/Podfile" ]; then
echo "react-native"
elif [ -f "capacitor.config.json" ] || [ -f "capacitor.config.ts" ]; then
echo "capacitor"
elif [ -f "ios/"*.xcworkspace ]; then
echo "native-pods"
elif [ -f "ios/"*.xcodeproj ]; then
echo "native"
else
echo "unknown"
fi
}
PROJECT_TYPE=$(detect_ios_project)
[ ! -d "ios" ] && echo "❌ ios/ directory not found" && exit 1
# CocoaPods
if [ -f "ios/Podfile" ] && [ ! -d "ios/Pods" ]; then
cd ios && pod install && cd ..
fi
# npm
if [ -f "package.json" ] && [ ! -d "node_modules" ]; then
npm install
fi
SIMULATOR_UDID=$(xcrun simctl list devices | grep "$DEVICE" | grep -v "unavailable" | head -1 | grep -oE '\([A-F0-9-]+\)' | tr -d '()')
[ -z "$SIMULATOR_UDID" ] && echo "❌ Simulator '$DEVICE' not found" && xcrun simctl list devices | grep -E "iPhone|iPad" && exit 1
SIMULATOR_STATE=$(xcrun simctl list devices | grep "$SIMULATOR_UDID" | grep -oE '\((Booted|Shutdown)\)' | tr -d '()')
if [ "$SIMULATOR_STATE" != "Booted" ]; then
xcrun simctl boot "$SIMULATOR_UDID"
open -a Simulator
sleep 3
fi
POLTERGEIST_AVAILABLE=false
if command -v poltergeist &> /dev/null; then
POLTERGEIST_AVAILABLE=true
[ ! -f ".poltergeist.yml" ] && cat > .poltergeist.yml <<EOF
platform: ios
watchPaths:
- ios/**/*.swift
- ios/**/*.m
- ios/**/*.h
ignorePaths:
- ios/Pods/**
- ios/build/**
buildCommand: |
xcodebuild -workspace ios/*.xcworkspace -scheme $SCHEME -configuration $CONFIGURATION -destination "id=$SIMULATOR_UDID" build
EOF
fi
PROJECT_NAME=$(basename "$(pwd)")
BRANCH=$(git branch --show-current 2>/dev/null || echo "main")
TIMESTAMP=$(date +%s)
SESSION="ios-${PROJECT_NAME}-${TIMESTAMP}"
tmux new-session -d -s "$SESSION" -n build
case $PROJECT_TYPE in
react-native)
tmux send-keys -t "$SESSION:build" "npx react-native run-ios --simulator='$DEVICE' --configuration $CONFIGURATION" C-m
;;
capacitor)
tmux send-keys -t "$SESSION:build" "npx cap sync ios && npx cap run ios --target='$SIMULATOR_UDID' --configuration=$CONFIGURATION" C-m
;;
native-pods|native)
WORKSPACE=$(find ios -name "*.xcworkspace" -maxdepth 1 | head -1)
if [ -n "$WORKSPACE" ]; then
tmux send-keys -t "$SESSION:build" "xcodebuild -workspace $WORKSPACE -scheme $SCHEME -configuration $CONFIGURATION -destination 'id=$SIMULATOR_UDID' build" C-m
fi
;;
esac
# Dev server (if needed)
if [ "$PROJECT_TYPE" = "react-native" ] || grep -q "\"dev\":" package.json 2>/dev/null; then
DEV_PORT=$(shuf -i 3000-9999 -n 1)
tmux new-window -t "$SESSION" -n dev-server
tmux send-keys -t "$SESSION:dev-server" "PORT=$DEV_PORT npm start 2>&1 | tee dev-server.log" C-m
fi
# Poltergeist (if available)
if [ "$POLTERGEIST_AVAILABLE" = true ]; then
tmux new-window -t "$SESSION" -n poltergeist
tmux send-keys -t "$SESSION:poltergeist" "poltergeist watch --platform ios 2>&1 | tee poltergeist.log" C-m
fi
# Logs
tmux new-window -t "$SESSION" -n logs
tmux send-keys -t "$SESSION:logs" "xcrun simctl spawn $SIMULATOR_UDID log stream --level debug" C-m
# Git
tmux new-window -t "$SESSION" -n git
tmux send-keys -t "$SESSION:git" "git status" C-m
cat > .tmux-ios-session.json <<EOF
{
"session": "$SESSION",
"project_name": "$PROJECT_NAME",
"branch": "$BRANCH",
"type": "$PROJECT_TYPE",
"configuration": "$CONFIGURATION",
"environment": "$ENV_FILE",
"simulator": {
"name": "$DEVICE",
"udid": "$SIMULATOR_UDID"
},
"dev_port": ${DEV_PORT:-null},
"poltergeist": $POLTERGEIST_AVAILABLE,
"created": "$(date -Iseconds)"
}
EOF
echo ""
echo "✨ iOS Dev Environment Started: $SESSION"
echo ""
echo "Configuration: $CONFIGURATION ($ENV_FILE)"
echo "Simulator: $DEVICE"
[ "$POLTERGEIST_AVAILABLE" = true ] && echo "Poltergeist: Auto-rebuild enabled"
echo ""
echo "Attach: tmux attach -t $SESSION"
echo "Status: /tmux-status"
echo ""
documentation
Report reflect drain spend over a time window — tokens split by cached (cache_read), uncached writes (cache_creation), and io (input+output), with a $ estimate, grouped by day / outcome / model / transcript. Reads the drainer's cost log and surfaces outlier runs and cache-reuse health (the 41.5M-token failure mode = low cache reuse + high cache writes). Use to answer "what is reflection costing me" for the last day / week.
development
Show fleet status — every claude session running on the host, merged across ainb + claude-peers broker + background jobs. Use when you need to enumerate sessions before composing an action, see which sessions have a peer registered (broker-routable) vs tmux-only, check the `summary` of each session, or pipe the list into jq for filtering. Default output: text table. Pass --format json for LLM consumption.
testing
Ordered multi-step prompts to fleet targets, ack-gated between steps via JSONL assistant-turn-end detection. Use for cycles like disconnect→reconnect→verify, or any flow where step N+1 requires step N to have completed first. The skill BLOCKS until each target's transcript shows the next assistant turn finishing OR per-step timeout fires (default 300s).
development
Center control panel — enumerate every claude session that is blocked waiting on something: a user answer (AskUserQuestion fired), an API error retry, an idle assistant turn-end with no follow-up, or an explicit WAITING: marker. Returns rich JSON with signal kind + context per session. Use this when you've stepped away from the fleet and want one place to see everything that wants your attention and answer it.