Coming from Maestro

For AI agents: this page is Markdown at https://squiggle.sh/docs/flows/maestro.md. Every docs page is listed at https://squiggle.sh/llms.txt, and all of them are one file at https://squiggle.sh/llms-full.txt.

Squiggle flows are close to Maestro's, but a Maestro file doesn't run as it is. Most commands have a direct equivalent with a different name, and a few don't run at all.

The same flow, both ways

Maestro
appId: com.acme.shop---- launchApp- tapOn:    id: "email"- inputText: "dana@example.com"- tapOn: "Sign in"- assertVisible: "Welcome back"
Squiggle
flow: sign inappId: com.acme.shopsteps:  - launchApp  - type: { into: { testID: email }, value: dana@example.com }  - tap: { text: Sign in }  - assert: { visible: { text: Welcome back } }

A Squiggle flow is one YAML document: a flow name, the header keys, then steps. There’s no --- separator.

Commands

MaestroSquiggle
tapOntap, with a selector: { text: … } or { testID: … }
tapOn: { id: … }tap: { testID: … }
doubleTapOn · longPressOndoubleTap · longPress
inputTexttype: { into: <selector>, value: … }
assertVisible · assertNotVisibleAccepted with a selector mapping, or assert: { visible: … }
extendedWaitUntilwaitFor, or scrollUntilVisible for a control
waitForAnimationToEndwaitFor: { animationIdle: true }
swipe · scroll · scrollUntilVisibleThe same names
launchApp (clearState)launchApp: { clearState: true }
stopApp · back · pressKey · openLinkThe same names
runFlow · repeat · retry · when · optional · labelThe same names
appId · env · tagsThe same keys, in the flow header
indexindex (from 0), or nth (from 1)

What Squiggle doesn’t run

These are read without an error and reported as unsupported in the run. They never count as passed, so a moved suite shows exactly which parts aren’t tested:

  • eraseText, copyTextFrom, pasteText and hideKeyboard
  • setLocation, travel, setOrientation, setAirplaneMode, toggleAirplaneMode, addMedia, setPermissions and clearKeychain
  • takeScreenshot, startRecording and stopRecording
  • runScript and evalScript: Squiggle has no JavaScript engine
  • assertWithAI, assertNoDefectsWithAI, extractTextWithAI and assertScreenshot

These stop the flow from loading, with an error that names them:

  • Position selectors (below, above, leftOf, rightOf). Use within to look inside another control.
  • containsChild and state matchers such as enabled and checked.
  • assertTrue. Use one of Squiggle’s asserts instead.
  • onFlowStart and onFlowComplete. Use prerequisite for setup (see Repeatable flows).

What you get on top

A moved control heals instead of failing (see Healing), and asserts can check what the app did, not only what it shows: renders, dropped frames, store and query state, and logged events (see Assertions).