iOS setup and app launch from the tool itself: doctor --fix, launch --arg, a PATH-aware plugin launcher - #14
Conversation
Verifying an iOS build with the plugin took a third of a session before the first command ran: uv was absent, AXe's tap had to be trusted before Homebrew would install it, and once both were there the MCP host's PATH still did not list where they had gone. Then every relaunch of a test build with launch flags went through simctl by hand, followed by a guessed sleep. - `aua doctor --fix` installs AXe (tap, `brew trust`, install) when the iOS adapter finds it missing, reporting each step; the by-hand hint and `./install.sh --with-ios` carry the same three steps. Host tooling only: no target is touched, so no device-ledger entry. - `aua app launch <bundle> --arg ARG` (repeatable) hands a simulator app its process arguments through `simctl launch`; MCP takes `arguments`. Android has no process arguments and refuses them rather than dropping them. The engine passes the list through only when given, so a runtime without the parameter is untouched. - The plugins' MCP server starts through a `sh -c` launcher that looks for `uvx` in `~/.local/bin`, `/opt/homebrew/bin`, `/usr/local/bin` and `~/.cargo/bin` before the host's PATH, and says what to install when it is nowhere. The pinned release moves to `env.AUA_SPEC`; the version test and `bump-version.sh` read it there. - `docs/ios.md` says that element bounds are accessibility frames, which a rim or artwork past the view's edge widens by a few points. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
|
Full-suite comparison on this machine (macOS, Python 3.11, xdist):
|
…t the new paths Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
|
CI here fails at |
Why
Verifying an iOS build through the Claude Code plugin took a third of a session before the first analyser command ran, then a manual
simctl launchplus a guessed sleep on every relaunch. Each obstacle was small; together they were most of the time. The session that hit them is written up here: https://grim-seal.drophere.cc/ (an iOS hub verification on two simulators).uvwas absent, and once installed to/opt/homebrew/binthe MCP host's PATH did not list it, so the plugin reported only the host's barecommand not found.brew install axefailed on a fresh machine because a current Homebrew refuses to loadcameroncooke/axeuntil it is trusted; the README's one-liner had nobrew truststep, andaua --platform ios doctorcould only say "axe missing".--uitesting, feature-flag overrides).aua app launchhad no way to pass them, so every relaunch bypassed the tool.What
aua doctor --fixinstalls the host tooling a platform can install. On iOS that is AXe through Homebrew — tap,brew trust(tolerated when an older Homebrew lacks it), install — with each step reported../install.sh --with-iosdoes the same at setup, and the by-hand hint carries all three steps. Host tooling only, so no device-ledger entry; a failed install is the one thing doctor exits non-zero on.aua app launch <bundle> --arg ARG(repeatable) hands a simulator app its process arguments throughsimctl launch; MCPapp/app_launch_and_analyzetakearguments. Android has no process arguments and refuses them with a hint rather than dropping them. The engine passes the list only when given, so a runtime without the parameter is untouched. Combined with the existing global--until rid:<landing>, a relaunch is one call with arrival evidence..mcp.jsonstarts the server throughsh -c: it prepends~/.local/bin,/opt/homebrew/bin,/usr/local/binand~/.cargo/bin, and says what to install whenuvxis nowhere. The pinned release moves toenv.AUA_SPEC; the version test andbump-version.shread it there.claude plugin validate .passes.docs/ios.mdexplains that bounds are accessibility frames and what to measure for a pixel-exact layout check.Not in this PR
Two items from the same session are left as suggestions:
--serialcommand. I implemented--switch-leaseand pulled it: a target acquired by replacement is a reservation thatvalidate_userefuses untillease acquire --replacecompletes the handoff, so doing it inline means reworking that two-phase design, which deserves its own change.--untilthat waits on "the tree changed" (a tab switch has no positive term to name), and a shorter post-action stability confirmation on simulators, where a satisfied--untilstill spent the 5s ceiling confirming.Tests
New: iOS doctor-fix (installs, tolerates a Homebrew without
trust, reports a failed install, leaves an installed AXe alone), launch arguments reachingsimctlin order, engine passing arguments through a fake device, and the CLI'sdoctor --fixrendering and failure path. The version-consistency tests follow the launcher. Lint, mypy and the touched suites are green locally.🤖 Generated with Claude Code