Autonomy Docs
Migrate

Maestro

Turn Maestro YAML flows into Autonomy Android test cases of outcome steps, without tapOn selectors and waits.

Maestro flows are already short and declarative. The migration keeps what each flow checks and drops the commands that get there: tapOn, inputText, scroll and the waits between them.

Prompt

Paste this into a coding agent connected to the Autonomy MCP server, from inside the repository:

Codetext
Migrate the Maestro flows in this repository to Autonomy with the Autonomy MCP tools.

Setup
1. Call autonomy_project_list and ask me which project to use. Call autonomy_environment_list with its projectId and ask me which environment to run in. Check that it has an android target for the flows' appId; if it doesn't, tell me before you create anything.
2. Call autonomy_test_case_list with the projectId. Skip flows that an existing test case already covers.

For each flow
3. Create ONE test case with autonomy_test_case_create: projectId, name = the flow's name or file name, platforms = ["android"]. iOS testing isn't available yet: skip iOS-only flows and list them for me. Don't migrate sub-flows that only run from other flows on their own.
4. Write each step as an outcome: what is true when the step is done, in plain words ("A new account exists for a fresh email"). Say what the flow proves, not how: no tapOn, inputText, scroll, selectors or waits. One step can cover several commands that serve one outcome. Use 12 steps or fewer; split a longer flow into several test cases.
5. Each step is {id, text, attachments[]}. Each attachment has id, kind and exact. Kinds: account {role}, inbox (no address = a fresh inbox per run), phone, file, screenshot, data {label, value} or {label, intent} for generated data.
6. Never write a password, token or key into a step. For each account the flows sign in as (often a login sub-flow), ask me to save it in the dashboard (the project's Sign-ins, New sign-in) and tell you its account name, then start the test with a step such as "The store owner is signed in" with that account attached. For other secrets in env, propose names and reference them as {{env.NAME}}; add them as secret values with autonomy_environment_upsert only after I agree.
7. Values the flow is about (the text an assertVisible checks, a coupon that must apply, input that must be refused): a data attachment with exact: true. Other env values: {{env.NAME}}.
8. Sign-up data (emails, names, passwords, phone numbers, random values from evalScript): a fresh inbox, a phone attachment and generated data, never a fixed value.
9. Inline runFlow sub-flows into the outcomes of the flows that call them. Drop launchApp with clearState (every run starts with a clean install), extendedWaitUntil, waitForAnimationToEnd, retry and repeat blocks that only wait.

Afterwards
10. If flows are grouped (tags, folders, config includes), offer to create a test plan per group with autonomy_test_plan_create.
11. Run one migrated test case with autonomy_run_trigger in the environment I picked. Follow it with autonomy_run_get (pass the last cursor and waitMs) until it ends. For any step that didn't pass, read autonomy_run_step_actions and tell me what happened.
12. Finish with a table: source flow, test case ID, number of steps, and anything you couldn't map.

Mapping

MaestroAutonomy
One flow fileOne test case.
appIdThe app build on the environment's Android target. See Mobile builds.
tags, folders, config includesOptionally, a test plan.
tapOn, inputText, scroll, swipe, backFolded into the step's outcome. The agent finds the controls.
assertVisible: "Order placed"The outcome, with Order placed as a data attachment marked Exact.
assertNotVisibleAn outcome that says what must not show, such as "No error banner is shown".
launchApp with clearStateDropped. Every run starts with a clean install, signed out.
extendedWaitUntil, waitForAnimationToEnd, retryDropped.
runFlowInlined into the outcomes of the calling flow. A login sub-flow becomes a signed-in step with a saved sign-in.
env and ${VAR}{{env.VAR}}, marked secret when it's a credential.
evalScript random dataGenerated data, or a Fresh inbox per run for emails.
takeScreenshotA screenshot attachment.
repeatOne outcome that states the end result, such as "The cart holds three items".

See the migration overview for a worked example.

Didn’t find it?

On this page