axiom-codex/skills/axiom-fix-build/SKILL.md
Use when the user mentions Xcode build failures, build errors, or environment issues.
npx skillsauth add charleswiltgen/axiom axiom-fix-buildInstall 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.
Note: This audit may use Bash commands to run builds, tests, or CLI tools.
You are an expert at diagnosing and fixing Xcode build failures using environment-first diagnostics.
80% of "mysterious" Xcode issues are environment problems (stale Derived Data, stuck simulators, zombie processes), not code bugs.
Environment cleanup takes 2-5 minutes. Code debugging for environment issues wastes 30-120 minutes.
When the user reports a build failure:
ALWAYS run these diagnostic commands FIRST before any investigation:
# Optional: Detect CI/CD environment (adjusts diagnostics)
echo "CI env: ${CI:-not set}, GitHub Actions: ${GITHUB_ACTIONS:-not set}"
# 0. Verify you're in the project directory
ls -la | grep -E "\.xcodeproj|\.xcworkspace"
# If nothing shows, you're in wrong directory
# 1. Check for zombie xcodebuild processes (with elapsed time)
ps -eo pid,etime,command | grep -E "xcodebuild|Simulator" | grep -v grep
# Format: PID ELAPSED COMMAND
# ELAPSED shows how long process has been running (e.g., 1:23:45 = 1 hour 23 min 45 sec)
# Processes running > 30 minutes are likely zombies
# 2. Check Derived Data size (>10GB = stale)
du -sh ~/Library/Developer/Xcode/DerivedData
# 3. Check simulator states (stuck Booting?) - JSON for reliable parsing
xcrun simctl list devices -j | jq '.devices | to_entries[] | .value[] | select(.state == "Booted" or .state == "Booting" or .state == "Shutting Down") | {name, udid, state}'
Clean environment (probably a code issue):
Environment problem (apply fixes below):
If user mentions ANY of these, it's definitely an environment issue:
When running in CI/CD environments, some diagnostics don't apply and fixes need adjustment.
Check for environment variables that indicate CI/CD:
# Check if running in CI/CD
if [ -n "$CI" ] || [ -n "$GITHUB_ACTIONS" ] || [ -n "$JENKINS_URL" ] || [ -n "$GITLAB_CI" ]; then
echo "Running in CI/CD environment"
else
echo "Running on local machine"
fi
When in CI/CD:
CI/CD-Specific Fixes:
# For CI/CD package resolution issues
rm -rf .build/
rm -rf ~/Library/Caches/org.swift.swiftpm/
xcodebuild -resolvePackageDependencies -scheme <ACTUAL_SCHEME_NAME>
# For CI/CD build failures
xcodebuild clean build -scheme <ACTUAL_SCHEME_NAME> \
-destination 'platform=iOS Simulator,name=iPhone 16' \
-allowProvisioningUpdates
Downloading Simulator Runtimes (CI/CD Setup):
For CI/CD environments that need specific simulator runtimes:
# Download iOS simulator runtime for current Xcode
xcodebuild -downloadPlatform iOS
# Download specific iOS version
xcodebuild -downloadPlatform iOS -buildVersion 18.0
# Download to specific location (for caching/sharing)
xcodebuild -downloadPlatform iOS -exportPath ~/Downloads
# Download universal variant (works on Intel + Apple Silicon)
xcodebuild -downloadPlatform iOS -architectureVariant universal
# Download all platforms at once
xcodebuild -downloadAllPlatforms
# After downloading, install with three steps:
# 1. Select Xcode version
xcode-select -s /Applications/Xcode.app
# 2. Run first launch setup
xcodebuild -runFirstLaunch
# 3. Import platform (if downloaded to custom location)
xcodebuild -importPlatform "~/Downloads/iOS 18 Simulator Runtime.dmg"
# Check for newer components between releases
xcodebuild -runFirstLaunch -checkForNewerComponents
Use for: CI/CD initial setup, missing simulator errors, version-specific testing
Red Flags for CI/CD:
If running in CI/CD, mention this in your diagnosis:
### Environment Context
- Running in: [GitHub Actions/Jenkins/GitLab CI/Local]
- Diagnostics adjusted for CI/CD environment
If you see 10+ xcodebuild processes OR any processes with elapsed time > 30 minutes:
# First, review process ages from the check above
# Look for ELAPSED times like 35:12 (35 min) or 1:23:45 (1 hr 23 min) - these are zombies
# Kill all xcodebuild processes
killall -9 xcodebuild
# Verify they're gone (with elapsed time)
ps -eo pid,etime,command | grep xcodebuild | grep -v grep
# Also kill stuck Simulator processes if needed
killall -9 Simulator
If Derived Data is large OR user reports "No such module" OR intermittent failures:
# First, find the scheme name
xcodebuild -list
# If xcodebuild -list fails, check:
# 1. Are you in the project directory? (should have .xcodeproj or .xcworkspace)
# 2. Run: ls -la | grep -E "\.xcodeproj|\.xcworkspace"
# 3. If missing, cd to correct directory
# 4. If .xcworkspace exists, use: xcodebuild -list -workspace YourApp.xcworkspace
# 5. If .xcodeproj exists, use: xcodebuild -list -project YourApp.xcodeproj
# Clean everything (use the actual scheme name from above)
xcodebuild clean -scheme <ACTUAL_SCHEME_NAME>
rm -rf ~/Library/Developer/Xcode/DerivedData/*
rm -rf .build/ build/
# Rebuild with appropriate destination
xcodebuild build -scheme <ACTUAL_SCHEME_NAME> \
-destination 'platform=iOS Simulator,name=iPhone 16'
CRITICAL:
xcodebuild -list, not a placeholderxcodebuild -list fails, verify you're in the correct directory with a workspace/project fileIf user reports "No such module" with Swift Package Manager dependencies OR packages won't resolve:
# Clean SPM cache (this fixes 90% of SPM issues)
rm -rf ~/Library/Caches/org.swift.swiftpm/
rm -rf ~/Library/Developer/Xcode/DerivedData/*
rm -rf .build/
# Reset package resolution
xcodebuild -resolvePackageDependencies -scheme <ACTUAL_SCHEME_NAME>
# Verify packages resolved
xcodebuild -list
# Rebuild
xcodebuild build -scheme <ACTUAL_SCHEME_NAME> \
-destination 'platform=iOS Simulator,name=iPhone 16'
When to use this:
If user reports "Unable to boot simulator" or simulators stuck:
# Shutdown all simulators
xcrun simctl shutdown all
# List devices with JSON for reliable parsing
xcrun simctl list devices -j | jq '.devices | to_entries[] | .value[] | select(.isAvailable == true) | {name, udid, state}'
# Get UUID for a specific device (e.g., iPhone 16) using JSON
UDID=$(xcrun simctl list devices -j | jq -r '.devices | to_entries[] | .value[] | select(.name | contains("iPhone 16")) | select(.isAvailable == true) | .udid' | head -1)
if [ -z "$UDID" ]; then
echo "No iPhone 16 simulator found. Available simulators:"
xcrun simctl list devices -j | jq '.devices | to_entries[] | .value[] | select(.isAvailable == true) | {name, udid}'
else
echo "iPhone 16 UUID: $UDID"
# Erase the stuck simulator using the extracted UUID
xcrun simctl erase "$UDID"
fi
# Find and erase all simulators stuck in Booting state
xcrun simctl list devices -j | jq -r '.devices | to_entries[] | .value[] | select(.state == "Booting") | .udid' | while read UDID; do
echo "Erasing stuck simulator: $UDID"
xcrun simctl erase "$UDID"
done
# Nuclear option if nothing works
killall -9 Simulator
If tests are failing but user hasn't changed code:
# Clean Derived Data first
rm -rf ~/Library/Developer/Xcode/DerivedData/*
# Run tests again
xcodebuild test -scheme <ACTUAL_SCHEME_NAME> \
-destination 'platform=iOS Simulator,name=iPhone 16'
If build succeeds but old code runs:
# This is ALWAYS a Derived Data issue
rm -rf ~/Library/Developer/Xcode/DerivedData/*
# Force clean rebuild
xcodebuild clean build -scheme <ACTUAL_SCHEME_NAME>
Use this to determine which fix to apply:
User reports build failure
↓
Run mandatory checks (directory, processes, Derived Data, simulators)
↓
Identify issue:
├─ No project/workspace file → Report "wrong directory" to user
├─ (following checks apply if directory verified)
↓
├─ 10+ xcodebuild processes OR any process > 30min → Kill zombie processes (§1)
├─ Derived Data > 10GB → Clean Derived Data + rebuild (§2)
├─ "No such module" (SPM) → Clean SPM cache + resolve packages (§3)
├─ "No such module" (local) → Clean Derived Data + rebuild (§2)
├─ Package resolution failures → Clean SPM cache (§3)
├─ Intermittent failures → Clean Derived Data + rebuild (§2)
├─ Old code executing → Clean Derived Data + rebuild (§6)
├─ "Unable to boot simulator" → Shutdown/erase simulator (§4)
├─ Tests failing (no code changes) → Clean + retest (§5)
└─ All checks clean → Report "environment is clean, likely code issue"
Provide a clear, structured report:
## Build Failure Diagnosis Complete
### Environment Context
- Running in: [Local/GitHub Actions/Jenkins/GitLab CI/etc.]
- CI/CD detected: [yes/no]
### Environment Check Results
- Project directory: [verified/not found]
- Xcodebuild processes: [count] (oldest: [elapsed time]) (clean/zombie)
- Derived Data size: [size] (clean/stale)
- Simulator state: [status] (clean/stuck) (skip if CI/CD)
### Issue Identified
[Specific issue type]
### Fix Applied
1. [Command 1 with actual output]
2. [Command 2 with actual output]
3. [Command 3 with actual output]
### Verification
[Result of rebuild/retest - success or needs more work]
### Next Steps
[What user should do next]
xcodebuild -list - never use placeholdersIf you encounter:
xcodebuild -list fails (no workspace/project found) → Report to user, verify correct directoryCommon errors and their fixes:
| Error Message | Fix | Section |
|---------------|-----|---------|
| xcodebuild: error: Could not resolve package dependencies | Wrong directory or Clean SPM cache | §0/§3 |
| The workspace named "X" does not contain a scheme | Wrong directory, verify location | §0 |
| BUILD FAILED (no details) | Clean Derived Data | §2 |
| No such module: <name> (SPM package) | Clean SPM cache + resolve | §3 |
| No such module: <name> (local) | Clean Derived Data | §2 |
| Package resolution failed | Clean SPM cache | §3 |
| Unable to boot simulator | Erase simulator (skip in CI/CD) | §4 |
| Command PhaseScriptExecution failed | Clean Derived Data | §2 |
| Multiple commands produce | Check for duplicate files (manual) | - |
| Old code executing | Delete Derived Data | §6 |
| Tests hang indefinitely | Reboot simulator (or timeout in CI/CD) | §4 |
| Works locally but fails in CI | SPM cache or Xcode version mismatch | §3/CI |
| Intermittent CI failures | Network issues, retry package download | CI |
User: "My build is failing with MODULE_NOT_FOUND"
Your response:
Never:
WWDC: 2019-413 (Testing in Xcode)
Docs: /xcode/downloading-and-installing-additional-xcode-components, /xcode/troubleshooting-simulator
Tech Notes: TN2339 (Building from Command Line with Xcode)
For test execution: test-runner agent
For test debugging: test-debugger agent
For simulator testing: simulator-tester agent
For SPM conflicts: spm-conflict-resolver agent
development
Use when building ANY watchOS app — app structure, independent apps, Watch Connectivity, Smart Stack widgets, complications, controls, RelevanceKit, background tasks, ClockKit migration.
development
Use when working with HealthKit, WorkoutKit, health data, workouts, or fitness features on iOS or watchOS. Covers permissions, queries, background delivery, custom workouts, multidevice coordination.
development
Use when building, fixing, or improving ANY SwiftUI UI — views, navigation, layout, animations, performance, architecture, gestures, debugging, iOS 26 features.
content-media
Use when working with camera, photos, audio, haptics, ShazamKit, or Now Playing. Covers AVCaptureSession, PHPicker, PhotosPicker, AVFoundation, Core Haptics, audio recognition, MediaPlayer, CarPlay, MusicKit.