Skip to content

Release v0.9.5: Maestro CLI 2.10.0 - #77

Merged
BlueShork merged 8 commits into
mainfrom
feature/update-maestro-cli
Sep 24, 2026
Merged

BlueShork merged 8 commits into
mainfrom
feature/update-maestro-cli

Conversation

@BlueShork

Copy link
Copy Markdown
Owner

Summary

Moves Maestro Deck from Maestro CLI 2.5.1 to 2.10.0 and bumps the app to v0.9.5.

Maestro 2.6 removed maestro studio, which the app used to keep device drivers warm and, on web, as the browser's HTTP API. The three keepers now run maestro <flags> mcp --no-viewer, which keeps one driver session per device for as long as the process lives:

  • Android: hierarchy/driver_keeper.rs (was studio.rs). The fast gRPC hierarchy path on :7001 is unchanged.
  • iOS simulator: the XCTest runner on :22087 is held by the keeper, with the same readiness and health probes.
  • Web: rewritten. Commands go through the MCP run tool, the hierarchy through inspect_screen (flattened to the existing element format, so the tap resolver and inspector are untouched), and the live preview is a CDP screencast of the keeper's Chrome, shared with the run mirror in web_session/cdp.rs.
  • Orphan sweeps are scoped by the keepers' global flags (--udid / --device / -p web), so a user's own maestro mcp is never killed.

Other changes

  • REQUIRED_MAESTRO is now 2.10.0. The managed setup records the version it installed, and re-downloads a managed Maestro installed at another version.
  • Since Maestro 2.7, takeScreenshot / startRecording write into the run's debug bundle instead of the working directory. Each run now gets its own flattened bundle (--debug-output … --flatten-debug-output), and those files are copied back next to the flow before runner:exit, so the screenshot bank finds them again.
  • The step parser and editor completions know the 2.9 dark-mode commands and the new swipe at <point> suffix; Billy's prompt lists the dark-mode commands.
  • Fixes found while testing:
    • A toast dismissed during the 180 ms swap delay stayed on screen forever ("Recovering driver…").
    • The image-bank flow grid was frozen in its shrunken entry state when the gallery didn't scroll.
    • Web baselines get a globe icon instead of the Android logo.
  • Version bump to 0.9.5 and changelog entry.

Known limitation

Physical iPhones still need the devicelab-patched Maestro 2.5.1 jars (BlueShork/maestro-ios-device), so they don't work with 2.10.0 until the bridge is updated. Cloud workers keep their own pinned Maestro and are not affected by this PR.

Test plan

  • cargo clippy --all-targets -D warnings, cargo fmt --check, 296 Rust tests
  • tsc, eslint, 541 frontend tests
  • maestro test output byte-identical between 2.5.1 and 2.10.0 on the same flow
  • Live e2e with 2.10.0 (ignored tests, MAESTRO_BIN=…): web_keeper_end_to_end, android_keeper_end_to_end on a physical Samsung, ios_sim_keeper_end_to_end and capture_with_touch_injection_does_not_panic on an iPhone 17 simulator
  • Tested in the app: Android inspector and runs, web inspector, runs and screenshot bank
  • iOS simulator in the app
  • Windows

🤖 Generated with Claude Code

Maestro 2.6 removed `maestro studio`, which kept the Android/iOS drivers
warm and served the web session's HTTP API. The keepers now run
`maestro <flags> mcp --no-viewer`, whose per-device session holds the
driver for the life of the process:

- Android: hierarchy/driver_keeper.rs (was studio.rs), gRPC on :7001
- iOS simulator: runner on :22087, same readiness probes
- Web: commands via the MCP `run` tool, hierarchy via `inspect_screen`,
  live preview via a CDP screencast of the keeper's Chrome (shared with
  the run mirror in web_session/cdp.rs)

Orphan sweeps are scoped by the global flags (--udid / --device / -p web)
so a user's own `maestro mcp` is never killed. REQUIRED_MAESTRO is now
2.10.0; the step parser and completions learn the 2.9 dark-mode commands
and the swipe relative-point suffix. Physical iPhones still need the
patched 2.5.1 jars and are knowingly broken until the bridge is updated.
The managed install short-circuited on any recorded maestro path, so a user
whose app had installed 2.5.1 would keep it forever. The manifest now records
the version maestro was installed at; a mismatch (or a legacy manifest without
one) reads as not installed, and the automatic setup fetches the pinned
release.
push() delays inserting a toast by 180 ms when another one is open. A quick
operation (driver recovery takes ~100 ms) dismissed its toast inside that
window: the dismiss matched nothing, then the toast was inserted and, being
persistent, stayed up forever. Pending toasts are now tracked so such a
dismiss cancels the insert.
… flow

Since maestro 2.7 these commands write into the run's debug bundle
(<bundle>/<flow>/takeScreenshot/<path>.png) instead of the working
directory, so the screenshot bank reported every capture as missing.
Each run now gets its own flattened bundle (--debug-output
--flatten-debug-output), and its command outputs are copied back to the
flow's directory before runner:exit, where maestro 2.5 used to put them.
FlowScrollGrid drives its cells from the container's scroll progress. A
gallery that fits without scrolling (e.g. 6 web baselines) never moves off
progress 0, so every card stayed half-size, offset and faded, leaving huge
gaps. It now renders a static grid unless the container actually scrolls.

When it does animate, clamping the keyframe offsets into [0, 1] piled the
first row's entry keyframes up at 0, so it also started shrunken. Offsets
are now re-sampled with toUnitKeyframes, which keeps the curve and computes
the real value at both edges.

Web baselines also get a globe icon instead of the Android logo.
Only the macOS/Windows window hiders use it since the keeper stopped
spawning maestro itself, so Linux CI failed on an unused import.
@sonarqubecloud

Copy link
Copy Markdown

Quality Gate Failed Quality Gate failed

Failed conditions
41.4% Coverage on New Code (required ≥ 80%)

See analysis details on SonarQube Cloud

@BlueShork
BlueShork merged commit ffa8ecd into main Sep 24, 2026
8 of 9 checks passed
@BlueShork
BlueShork deleted the feature/update-maestro-cli branch September 24, 2026 12:08
@github-actions github-actions Bot locked and limited conversation to collaborators Sep 24, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Setup required wants an older version than the latest version of the CLI.

1 participant