Skip to content

v0.21.2

Latest

Choose a tag to compare

@thymikee thymikee released this 14 Sep 13:08
· 17 commits to main since this release

Highlights

v0.21.2 makes navigation take fewer steps and improves recovery when captures, recordings, or sessions hit a problem.

  • Find off-screen elements in one command. scroll <direction> --until <selector> scrolls and checks until the target is on screen. Scrolls also stay above the keyboard, and edge scrolling stops when a surface gets stuck.
  • Automate iOS web sign-in sheets in place. Interact with ASWebAuthenticationSession login sheets without switching away from the app or cancelling its authentication session.
  • Snapshots and waits report more useful results. Cut-off captures are disclosed across platforms, regular iOS snapshots honor --depth across backends, and waits keep polling through retriable runner refusals.
  • Recordings recover more reliably. Retrying record stop returns the finished export, Simulator startup and shutdown recover more safely, and stale Android recording evidence no longer blocks the next recording. Android results also report the duration actually captured, with a warning when it falls short of the requested window.
  • Maestro gains inline JavaScript expressions. Use evalScript to compute output values for later steps. Exported flows also preserve tel: and mailto: links, and replay results produce well-formed JUnit XML.
  • Sessions survive more interruptions. Matching installed versions reuse the same daemon without unnecessary replacement, rebooted devices can shed stale claims, and admitted work keeps its lease while it runs. BrowserStack allocation settings and cancelled cloud screen reads are handled more consistently.

What's Changed

  • refactor(contracts): additive capability facts pilot on touch family by @thymikee in #2420
  • refactor(commands): declare a command option once and derive its surfaces by @thymikee in #2421
  • fix(android): ease controlled scrolls within the requested duration by @thymikee in #2393
  • fix(ios): serve regular --depth from every snapshot backend by @thymikee in #2431
  • fix(check): honor Vitest worker configuration by @PLASMA-FR in #2437
  • fix(wait): retire native selector bypass and recover text observations by @thymikee in #2440
  • fix(snapshot): compare unchanged presentations by value by @PLASMA-FR in #2442
  • test(daemon): split the two replay test files over the size tripwire by @thymikee in #2455
  • fix(ios): budget snapshot bridge test compile from the build ceiling by @thymikee in #2454
  • refactor(cli-schema): derive the flag tail of usage synopses by @thymikee in #2456
  • fix(ios): budget cold toolchain probes for the first-exec signature stall by @thymikee in #2423
  • refactor(contracts): additive capability facts on the keyboard family by @thymikee in #2459
  • refactor(contracts): additive capability facts on the gesture family by @thymikee in #2460
  • refactor(contracts): additive capability facts on the clipboard family by @thymikee in #2464
  • refactor(commands): declare project-config admission and recorder sanitization on the flag declaration by @thymikee in #2453
  • feat(scroll): find off-screen targets in one command with --until by @thymikee in #2436
  • fix(cli): declare projectConfig on the scroll --until flag by @thymikee in #2472
  • chore(layering): runner modules reach host-kit only through the runner host port by @thymikee in #2470
  • refactor(apple): carry one phase Deadline through the runner interfaces and test cancellation as a matrix by @thymikee in #2473
  • chore(gates): name the added modules and import paths when an eager closure grows by @thymikee in #2471
  • fix(maestro): preserve tel and mailto links in replay export by @PLASMA-FR in #2463
  • fix(network): report iOS requests that reused a keep-alive connection by @boorad in #2433
  • fix(test): emit well-formed JUnit XML for replay results by @PLASMA-FR in #2477
  • perf(package): strip comments from the Apple runner source the npm package ships by @thymikee in #2467
  • fix(ios): refuse Simulator bridge trees that end at a web view's remote content (#2484) by @thymikee in #2486
  • fix(orientation): disclose an unconfirmed rotation instead of asserting it by @prateekranka in #2483
  • fix(test): keep the working directory literal during glob discovery by @PLASMA-FR in #2490
  • fix(android): retire completed recording evidence after pid reuse by @thymikee in #2487
  • fix(ios): reap orphaned simulator recorders with a graceful finalize window by @thymikee in #2457
  • chore(react-devtools): pin agent-react-devtools 0.5.0 for React Native 0.87+ by @thymikee in #2488
  • fix(selectors): collapse an unverified-hittability wrapper chain to its control by @prateekranka in #2482
  • fix(wait): poll through a retriable runner refusal instead of surrendering the budget by @thymikee in #2493
  • fix(test): prevent custom reporter exit-code wraparound by @PLASMA-FR in #2497
  • feat(ios): drive ASWebAuthenticationSession sign-in sheets in place (#2438) by @thymikee in #2448
  • fix(ios): recover simulator recorder startup failures by @PLASMA-FR in #2447
  • fix(browserstack): carry the full provider-allocation config over the lease_allocate envelope (#2494) by @thymikee in #2495
  • docs(website): swap in the new agent-device logotype and README banner by @thymikee in #2502
  • fix(selectors): resolve a wrapper chain's control for uniqueness reads by @thymikee in #2501
  • fix(scroll): pace edge passes to rest and stop a stuck surface by @thymikee in #2499
  • docs(adr-0011): narrow the offscreen rescue comment to the per-request surface policy by @thymikee in #2465
  • fix(diff): include maximum RGB distance at threshold one by @PLASMA-FR in #2508
  • fix(ios): gate alert activation on a fresh hittable read by @thymikee in #2506
  • fix(test): preserve colliding diagnostic artifacts by @PLASMA-FR in #2507
  • fix(aws): defer Android app launch until open by @dennisimoo in #2512
  • fix(android): carry accessibility selected state into snapshots by @thymikee in #2515
  • perf(screenshot): read the crop region instead of decoding the whole capture by @thymikee in #2504
  • perf(scripts): add a device-free PNG crop benchmark by @thymikee in #2505
  • feat(snapshot): disclose a cut capture on every platform; raise the iOS bridge node cap to 5000 by @thymikee in #2510
  • refactor(snapshot): drop the bridge truncation dimension; stop promising --scope for depth caps by @thymikee in #2511
  • fix(daemon): keep a discarded rejection from shutting the daemon down by @thymikee in #2532
  • chore(config): scope the qs override and drop dead fallow, worktree and prettier entries by @thymikee in #2535
  • fix(cloud): cancel a screen read that its caller gave up on by @thymikee in #2516
  • fix(daemon): let admitted work keep the lease it is working on by @thymikee in #2517
  • docs: fix phantom specifiers, the duplicate ADR 0019, and the Node floor by @thymikee in #2533
  • fix(record): replay the finished export from a retried record stop by @thymikee in #2534
  • fix(contracts): state the scroll keyboard clip once for every platform by @thymikee in #2537
  • fix(scroll): keep the swipe above the keyboard, refuse when it cannot by @thymikee in #2503
  • fix(android): keep a scroll's swipe out of the IME window by @thymikee in #2514
  • refactor(daemon): bind only the command families the daemon dispatches through by @thymikee in #2548
  • refactor(runtime): own provider-device admission behind a typed capability by @thymikee in #2556
  • test(layering): classify daemon edges that reach platform mechanics through a hub by @thymikee in #2557
  • fix(android-helper): build with the pinned build-tools version, fail on CI when unset by @thymikee in #2568
  • refactor(command-registry): move CLI flag grammar, text and aliases down (#2543) by @thymikee in #2561
  • refactor(daemon): cut the last edges into the CLI schema layer (#2543) by @thymikee in #2562
  • fix(cli): hand device-auth URLs to the browser without a shell by @thymikee in #2567
  • refactor(move): settle a device claim in its own module by @thymikee in #2574
  • feat(devices): answer when a device's current boot began by @thymikee in #2575
  • fix(daemon): take a foreign device claim the device's own reboot invalidated by @thymikee in #2570
  • fix(apple): carry the runner's sparse verdict through a viewport refusal by @thymikee in #2572
  • fix(android): retire recording evidence stranded by a re-adopted device id by @thymikee in #2564
  • fix(record): end the recorder a loaded host could not confirm by @thymikee in #2565
  • fix(android): report the clip an Android recording really captured by @thymikee in #2566
  • fix(daemon): let an installed version stand as its whole code identity by @thymikee in #2569
  • refactor(tests): share the router-open fixtures between its suites by @thymikee in #2585
  • refactor(recording): remove unused start trimming and its exclusive support code by @thymikee in #2586
  • feat(maestro): support evalScript inline JavaScript expressions by @Rohit3523 in #2158
  • docs(adr): ADR 0024 — screen recording as one coordinator with two facts (proposed) by @thymikee in #2588

New Contributors

Full Changelog: v0.21.1...v0.21.2