CLI · Open source · MIT

v0.19.1

Conductor

Give Claude hands. Let it drive your app.

A token-efficient CLI for mobile and web UI testing, built for AI agents. A TypeScript reimplementation and partial fork of Maestro that bundles its own native drivers — no external CLI, no setup friction, no nonsense.

Install

npm install -g @houwert/conductor

That's it. Conductor is a pure CLI — no Claude Code plugin or skill is registered. Wire it into your agent through a custom CLAUDE.md, a project skill, or a slash command.

Highlights
🎯

Built for agents

Output is short and human-readable by default; opt into --json when you need machine-parseable results. Designed to be cheap on tokens.

📱

iOS, Android, and web

Drive iOS simulators, Android emulators, and Playwright-controlled browsers through one CLI. Same commands, three platforms.

👀

Inspect and assert

Read the live view hierarchy with accessibility metadata, take screenshots, and assert visibility — all without writing flow YAML.

🧵

Multi-device parallel testing

Run flows on every booted device at once with run-parallel, or hand each agent its own device through a shared pool with file-based locking.

📦

Drivers bundled

No Maestro CLI, no extra setup. Native iOS, Android, and web drivers are downloaded on first use into ~/.conductor/drivers — and Argus ships its own copy out of the box.

🪵

Logs out of the box

Stream React Native Metro logs, native simctl/logcat output, or browser console events with a single conductor logs command.

  1. v0.19.1

    Fixes

    • Fix `take-screenshot --id/--text/<query>` cropping the wrong region on retina iOS and 4K tvOS. The crop pipeline derived its AX→pixel scale from the synthetic root `axElement.frame`, which is always zero, so bounds in logical points were applied as pixel coordinates and the crop landed in the top-left quadrant. Scale is now sourced from `deviceInfo`, and `--margin` is interpreted in the same logical units as the bounds it pads. Also adds the missing `-o` shorthand for `--output`.
  2. v0.19.0

    Highlights

    • `screenshot` can now target a single element via `--selector` (or a positional selector argument), cropping the capture to that element's bounds. Adds a new `png-crop` helper for in-process PNG cropping, so no external image tooling is required.
    • Restore app focus on tvOS via a new `RestoreFocusHandler` in the iOS driver, wired through the daemon and bootstrap so tvOS sessions can recover focus after backgrounding or navigation.

    Fixes

    • Make the blast radius of `launch-app --clear-state` and `--clear-keychain` explicit: clarified `--help` text, updated `docs/commands.md`, and added a one-line stderr warning when either flag is used. These flags drop the app's keychain items (signing the user out) and are easy to reach for as a debugging shortcut — the new messaging spells that out. No behavior change.
  3. v0.18.0

    Highlights

    • Add a `set-viewport` command for web sessions. Resize the Playwright browser to a preset (`mobile`, `tablet`, `desktop`) or explicit `width`/`height`, with optional device scale factor, mobile emulation, user agent, and color scheme. The current URL is preserved across the resize, so a single browser session can be screenshotted at multiple form factors without booting more devices.
    • Add ephemeral `@eN` element refs. `capture-ui` now assigns each accessible element a short ref (`@e1`, `@e2`, …) and persists its screen coordinates per session, so `tap-on @e3` can act on the captured point directly without re-querying or fuzzy text/id matching. Stale snapshots (different device or older than 60s) emit an advisory warning rather than hard-failing.