[ Documentation ]
peach do

peach do

Grouping verb for user-interaction actions. peach do <action> covers the write side of the bridge: taps, typing, key presses, touch/scroll/drag/swipe/pinch gestures, reload, and local timing helpers. Repeat --then before each additional batchable action to run one ordered engine batch.

terminal
peach do <action> [args]
peach do <action> [args] [--then <action> [args] ...]

Options

flagdescription
--then <action>append an action to the same ordered engine batch
--jsonfor an inline chain, print every engine-step result
--no-waitfor an inline chain, skip the final auto-settle

Examples

terminal
peach do tap email --then type user@example.com --then tap submit
peach do tap 196 727
peach do double-tap 196 400
peach do tap-text "Sign in"
peach do tap-id loginNextButton
peach do type "natew.bsky.social"
peach do type-into email "me@example.com"
peach do key return
peach do key-sequence shift h i
peach do dismiss
peach do scroll feed 0 400
peach do drag 200 720 200 160
peach do swipe 200 720 200 160
peach do gesture swipe-from-bottom-edge
peach do reload

Inline Action Chains

Repeat --then before each additional do action to run one ordered engine batch:

terminal
peach do tap email --then type user@example.com --then tap submit

Each phrase uses the same positional grammar as its standalone command. The shell passes --then through as a normal argument, so punctuation in action data remains data:

terminal
peach do tap email --then type "Hello, world" --then key return

The exact --then token is reserved by peach do as the action boundary.

Batchable phrases are tap, tap-id, tap-text, double-tap, long-press, type, type-into, key, key-sequence, dismiss, scroll, drag, swipe, pinch, touch, and sleep. Conveniences such as type-into and key-sequence expand into their normal input steps inside the same batch. Run lifecycle and state commands such as reload, settle, and peach wait separately.

The batch stops on the first failed action, then applies the usual post-write auto-settle. Add --json for every engine-step result or --no-wait to skip the final auto-settle.

Inline Versus Durable Flows

An inline chain is the shell-native form for a one-off batch. Put reusable, reviewed, or CI-owned flows in Maestro YAML and run them with peach maestro test. A chain does not create or update a Maestro draft.

Subcommands

Run peach do <verb> --help for the flags and examples of any subcommand.

targeting

subcommanddescription
tap <testid>tap a testID, absolute coords, or —testid / —text
double-tap <testid> [gapMs]tap the same coordinates twice quickly
tap-text <text> [--nth <n>] [--within <testID>]findByText then tap (rich disambiguation flags)
tap-id <id>findByTestId then tap center
tap-best <query>testID-first, text-fallback robust tap

native device

subcommanddescription
scan <text> [--format <web-format>]inject a barcode scan into active camera scanning

text input

subcommanddescription
type <text>type through the iOS visual keyboard
type-into <id> <text>focus input by testID then type
key <name>special key (return, delete, space, shift, …)
key-sequence <key> [<key> ...]press multiple visual keyboard keys
keycode <code> [<code> ...]press DOM-style key codes via visual keyboard
dismissdismiss the iOS keyboard
dispatch <char>raw key (bypasses visual shift state)

gestures

subcommanddescription
scroll <id> <x> <y>scroll a ScrollView by testID
drag <x1> <y1> <x2> <y2> [steps] [stepMs]drag via real PointerEvents
swipe <x1> <y1> <x2> <y2> [steps] [stepMs]drag with faster defaults
long-press <testid> [durationMs]hold a press on a testID or at coordinates
touch <down|move|up|cancel> <x> <y> [pointerId] --then touch ...low-level touch primitives
gesture <preset> [durationMs]preset gestures (scroll / edge swipes)
pinch <x1> <y1> <x2> <y2> <x1'> <y1'> <x2'> <y2'> [steps] [stepMs]two-pointer pinch helper

animations

subcommanddescription
stop-animation <id|all>stop a running animation

lifecycle

subcommanddescription
reloadreload the page + wait for reconnect
wait [seconds]wait for sim reconnect
settle [seconds] [--strict]wait for animations to settle
sleep [seconds]local pause between commands