Try the XCSteward alpha
Have a real failure mode around xcodebuild, simctl,
Simulator readiness, cleanup, local CI-like workflows, or coding agents
running iOS tests? Try the OSS alpha, or open an issue with your setup.
XCSteward is an early, open-source alpha. It is local-first and runs on your Mac — there is no signup, no waitlist, and no account. The honest deal: it is most useful if you can point it at a real, reproducible failure rather than try it out of curiosity.
Current CLI workflow
Install the CLI locally, create or inspect a project profile, then run through the human or machine path. XCSteward's product surface is the CLI and its JSON contract; there is no hosted service or dashboard involved.
# requires macOS with a recent local Xcode
brew tap acyment/tap
brew install xcsteward
xcsteward profile init --detect --json Human path
A plain wait prints the queued job id, status/log/watch/follow commands, job directory, and compact updates. Use watch or follow from another terminal when you want to keep observing an existing job.
xcsteward submit --project app --wait --wait-timeout 900
xcsteward status <job-id> --watch
xcsteward logs <job-id> --follow Agent path
Agents and scripts should parse JSON from stdout and ignore human text.
Add --progress to long-running JSON waits when stderr JSON
events are useful; when command events are available those progress lines
add phase and phase_elapsed_seconds. Then use
explain --json for bounded triage before opening raw logs.
xcsteward profile init --detect --json
xcsteward submit --project app --wait --wait-timeout 900 --json --progress --env API_BASE_URL=http://127.0.0.1:8080
xcsteward explain <job-id> --json
Useful supporting commands include projects --json,
profile show <name> --json,
status <job-id> --watch --json for newline-delimited
JobSummary updates, repeatable
submit --metadata key=value plus --label,
repeatable submit --env KEY=VALUE for per-run
xcodebuild environment injection, and
cleanup --caches for XCSteward-owned cache and retained
evidence cleanup. XCSteward records env override keys, not sensitive
values.
Failure inspection
If build succeeds but the test runner never really starts, XCSteward treats
the outcome as environment/bootstrap failure rather than real test
execution failure. runner_bootstrap_failure means runner or
environment setup failed before XCTest attached; inspect the summary first,
then use explain --json before opening raw logs.
If the test command hits its timeout before XCSteward observes XCTest
attach evidence, the subtype is
pre_xctest_timeout: the command timed out before XCSteward
observed real test execution. That stays a runner/bootstrap diagnosis, not
a timed-out test case.
xcsteward status <job-id> --watch
xcsteward explain <job-id> --json
xcsteward logs <job-id>
When a job is queued or still in simulator/bootstrap setup, the combined
log may not exist yet. In that case logs <job-id> reports
that it is pending and points back to
status <job-id> --watch.
doctor still keeps project preflight bounded. If
.xctestrun integrity checking times out during a cold or long
build, the warning now says no compiler error was observed before timeout,
which is clearer diagnosis, not an invitation to wait forever.
Who this is for
Worth trying if you hit
- Local simulator test runs that hang before tests start.
- xcodebuild getting stuck resolving or booting destinations.
- simctl or CoreSimulator getting wedged or deadlocked.
- Cleanup and preboot scripts that have crept into your test ritual.
- Local, CI-like test workflows running on a Mac.
- Coding agents — or several scripts, jobs, and humans — touching Xcode tooling.
Not the right tool for
- Broken tests that fail on their own logic.
- App-level UI test flakiness and timing bugs in your test code.
- Code signing and provisioning problems.
- Missing or un-downloaded Xcode runtimes.
- Bugs inside a specific simulator runtime / vendor image.
- Network, backend, or mock-server instability.
What feedback is most valuable
Early on, depth beats volume. The reports that move the tool forward are specific:
- Real logs — actual output, a sample/spindump, or a gist beats a paraphrase.
- Real setups — your exact Xcode/macOS/simulator combination and command.
- Real failure modes — reproducible pain, not hypotheticals.
- Cases where XCSteward does not help — those tell us where the scope really ends.