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
appId: com.acme.shop---- launchApp- tapOn: id: "email"- inputText: "dana@example.com"- tapOn: "Sign in"- assertVisible: "Welcome back"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
| Maestro | Squiggle |
|---|---|
tapOn | tap, with a selector: { text: … } or { testID: … } |
tapOn: { id: … } | tap: { testID: … } |
doubleTapOn · longPressOn | doubleTap · longPress |
inputText | type: { into: <selector>, value: … } |
assertVisible · assertNotVisible | Accepted with a selector mapping, or assert: { visible: … } |
extendedWaitUntil | waitFor, or scrollUntilVisible for a control |
waitForAnimationToEnd | waitFor: { animationIdle: true } |
swipe · scroll · scrollUntilVisible | The same names |
launchApp (clearState) | launchApp: { clearState: true } |
stopApp · back · pressKey · openLink | The same names |
runFlow · repeat · retry · when · optional · label | The same names |
appId · env · tags | The same keys, in the flow header |
index | index (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,pasteTextandhideKeyboardsetLocation,travel,setOrientation,setAirplaneMode,toggleAirplaneMode,addMedia,setPermissionsandclearKeychaintakeScreenshot,startRecordingandstopRecordingrunScriptandevalScript: Squiggle has no JavaScript engineassertWithAI,assertNoDefectsWithAI,extractTextWithAIandassertScreenshot
These stop the flow from loading, with an error that names them:
- Position selectors (
below,above,leftOf,rightOf). Usewithinto look inside another control. containsChildand state matchers such asenabledandchecked.assertTrue. Use one of Squiggle’s asserts instead.onFlowStartandonFlowComplete. Useprerequisitefor 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).