Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 15 additions & 0 deletions CHANGELOG_EN.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,18 @@
# What's New in v0.9.5

## Maestro 2.10.0
- **Maestro Deck now runs on Maestro CLI 2.10.0** (previously 2.5.1). The app's automatic setup downloads it for you, and replaces a Maestro it installed at an older version.
- **Same features, new engine** — Maestro 2.6 removed `maestro studio`, which the app relied on. The inspector, taps and live preview now go through `maestro mcp` on Android, iOS simulators and the web.
- **Dark mode commands** from Maestro 2.9 (`setDarkMode`, `toggleDarkMode`, `assertDarkMode`, `assertLightMode`) are suggested in the editor, tracked in the run console and known to Billy.
- **Known limitation:** physical iPhones still need the patched Maestro 2.5.1 and don't work with 2.10.0 yet.

## Fixes
- Screenshots taken with `takeScreenshot` land next to the flow again, so the screenshot bank finds them instead of reporting them as missing.
- The screenshot bank gallery no longer leaves cards small, faded and far apart when it fits without scrolling, no longer crashes into a black screen on WebKit, and web baselines show a globe icon.
- The "Recovering driver…" notice no longer stays on screen after the driver has recovered.

---

# What's New in v0.9.0

## Maestro Deck Cloud
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ Maestro is the YAML mobile-testing framework. Maestro Deck is the desktop app th

| | Maestro Deck | Maestro Studio | Appium Inspector |
| ----------------------- | ---------------------------------------------------- | ---------------------------- | -------------------------- |
| Install | Single signed app (DMG/MSI) | `maestro studio` (browser) | Java + Appium server setup |
| Install | Single signed app (DMG/MSI) | Separate desktop app | Java + Appium server setup |
| Footprint | Native Tauri shell (~80 MB RAM idle, system webview) | Electron-based, ~400+ MB RAM | JVM + Chromium inspector |
| Cost | Free, source-available (BUSL-1.1) | Free, closed source | Free, open source |
| Live mirroring | ✅ scrcpy-grade, 60 fps | ⚠️ Periodic screenshots | ⚠️ Screenshot-based |
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "maestro-deck",
"private": true,
"version": "0.9.0",
"version": "0.9.5",
"type": "module",
"description": "Source-available visual IDE for Maestro mobile tests",
"license": "BUSL-1.1",
Expand Down
4 changes: 2 additions & 2 deletions src-tauri/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "maestro-deck"
version = "0.9.0"
version = "0.9.5"
description = "Source-available visual IDE for Maestro mobile tests"
authors = ["Ethan Morisset <blueshork.dev@gmail.com>"]
license = "BUSL-1.1"
Expand Down Expand Up @@ -90,7 +90,7 @@ image = { version = "0.25", default-features = false, features = ["png"] }

# gRPC client for talking directly to the on-device Maestro driver
# (bypasses the slow `maestro hierarchy` CLI invocation path when the
# driver is kept alive by a background `maestro studio` process).
# driver is kept alive by a background `maestro mcp` process).
tonic = { version = "0.12", default-features = false, features = ["codegen", "prost", "transport"] }
prost = "0.13"
zip = "2"
Expand Down
2 changes: 1 addition & 1 deletion src-tauri/src/device/ios.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
//! physical iPhones via `xcrun devicectl list devices`. Both surface as
//! `Platform::Ios`; physical devices carry `physical: true` so the connect /
//! keeper / screenshot paths select the `maestro-ios-device` bridge instead of
//! the simulator's `simctl` + `maestro studio`.
//! the simulator's `simctl` + `maestro mcp`.

use std::collections::BTreeMap;
use std::process::Command;
Expand Down
2 changes: 1 addition & 1 deletion src-tauri/src/device/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ pub struct Device {
pub booted: bool,
/// True only for physical iPhones (discovered via `devicectl`). Selects the
/// `maestro-ios-device` bridge keeper + HTTP screenshot path instead of the
/// simulator's `simctl`/`maestro studio` path. False for Android, Web, and
/// simulator's `simctl`/`maestro mcp` path. False for Android, Web, and
/// iOS simulators.
#[serde(default)]
pub physical: bool,
Expand Down
15 changes: 10 additions & 5 deletions src-tauri/src/env_check/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ pub(crate) fn parse_java_major(out: &str) -> Option<u32> {

use serde::Serialize;

pub(crate) const REQUIRED_MAESTRO: &str = "2.5.1";
pub(crate) const REQUIRED_MAESTRO: &str = "2.10.0";
pub(crate) const MIN_JAVA_MAJOR: u32 = 17;

#[derive(Serialize, Clone, Debug, PartialEq)]
Expand Down Expand Up @@ -353,11 +353,16 @@ mod tests {
}

#[test]
fn maestro_251_is_ok_other_versions_are_wrong_version() {
assert_eq!(maestro_check(Some("2.5.1".into()), None).status, "ok");
let c = maestro_check(Some("2.6.0".into()), None);
fn maestro_2_10_0_is_ok_other_versions_are_wrong_version() {
assert_eq!(maestro_check(Some("2.10.0".into()), None).status, "ok");
// 2.5.1 still ships `maestro studio`, which the app no longer uses.
let c = maestro_check(Some("2.5.1".into()), None);
assert_eq!(c.status, "wrong-version");
assert_eq!(c.detail.as_deref(), Some("need 2.5.1"));
assert_eq!(c.detail.as_deref(), Some("need 2.10.0"));
assert_eq!(
maestro_check(Some("2.9.0".into()), None).status,
"wrong-version"
);
assert_eq!(maestro_check(None, None).status, "missing");
}

Expand Down
Loading
Loading