gitextract_0f8ml73h/ ├── .editorconfig ├── .gitattributes ├── .github/ │ ├── ISSUE_TEMPLATE/ │ │ ├── bug_report.yaml │ │ └── feature_request.yaml │ ├── PULL_REQUEST_TEMPLATE.md │ ├── scripts/ │ │ └── boot_simulator.sh │ └── workflows/ │ ├── close-inactive-issues.yaml │ ├── lock-closed-issues.yaml │ ├── publish-cli.yaml │ ├── publish-release.yaml │ ├── publish-snapshot.yaml │ ├── test-e2e-ios-intel.yaml │ ├── test-e2e-prod.yaml │ ├── test-e2e.yaml │ ├── test.yaml │ └── update-samples.yaml ├── .gitignore ├── .idea/ │ ├── .gitignore │ ├── .name │ └── dictionaries/ │ └── project.xml ├── .run/ │ ├── cli-version.run.xml │ └── cli.run.xml ├── CHANGELOG.md ├── CONTRIBUTING.md ├── LICENSE ├── README.md ├── RELEASING.md ├── build.gradle.kts ├── debug.keystore ├── detekt.yml ├── e2e/ │ ├── .gitignore │ ├── README.md │ ├── download_apps │ ├── install_apps │ ├── manifest.txt │ ├── run_tests │ ├── update_samples │ └── workspaces/ │ ├── setOrientation/ │ │ └── test-set-orientation-flow.yaml │ ├── simple_web_view/ │ │ └── webview.yaml │ └── wikipedia/ │ ├── android-advanced-flow.yaml │ ├── android-flow.yaml │ ├── ios-advanced-flow.yaml │ ├── ios-flow.yaml │ ├── scripts/ │ │ └── getSearchQuery.js │ ├── subflows/ │ │ ├── launch-clearstate-android.yaml │ │ ├── launch-clearstate-ios.yaml │ │ ├── onboarding-android.yaml │ │ └── onboarding-ios.yaml │ └── wikipedia-android-advanced/ │ ├── auth/ │ │ ├── login.yml │ │ └── signup.yml │ ├── dashboard/ │ │ ├── copy-paste.yml │ │ ├── feed.yml │ │ ├── main.yml │ │ ├── saved.yml │ │ └── search.yml │ ├── onboarding/ │ │ ├── add-language.yml │ │ ├── main.yml │ │ └── remove-language.yml │ ├── run-test.yml │ └── scripts/ │ ├── fetchTestUser.js │ └── generateCredentials.js ├── gradle/ │ ├── libs.versions.toml │ └── wrapper/ │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradle.properties ├── gradlew ├── gradlew.bat ├── installLocally.sh ├── maestro ├── maestro-ai/ │ ├── README.md │ ├── build.gradle.kts │ ├── gradle.properties │ └── src/ │ └── main/ │ ├── java/ │ │ └── maestro/ │ │ └── ai/ │ │ ├── AI.kt │ │ ├── CloudPredictionAIEngine.kt │ │ ├── DemoApp.kt │ │ ├── IAPredictionEngine.kt │ │ ├── Prediction.kt │ │ ├── anthropic/ │ │ │ ├── Client.kt │ │ │ ├── Common.kt │ │ │ ├── Request.kt │ │ │ └── Response.kt │ │ ├── cloud/ │ │ │ └── ApiClient.kt │ │ ├── common/ │ │ │ └── Image.kt │ │ └── openai/ │ │ ├── Client.kt │ │ ├── Request.kt │ │ └── Response.kt │ └── resources/ │ ├── askForDefects_schema.json │ └── extractText_schema.json ├── maestro-android/ │ ├── build.gradle.kts │ └── src/ │ ├── androidTest/ │ │ ├── AndroidManifest.xml │ │ └── java/ │ │ ├── androidx/ │ │ │ └── test/ │ │ │ └── uiautomator/ │ │ │ └── UiDeviceExt.kt │ │ └── dev/ │ │ └── mobile/ │ │ └── maestro/ │ │ ├── AccessibilityNodeInfoExt.kt │ │ ├── MaestroDriverService.kt │ │ ├── Media.kt │ │ ├── ToastAccessibilityListener.kt │ │ ├── ViewHierarchy.kt │ │ ├── location/ │ │ │ ├── FusedLocationProvider.kt │ │ │ ├── LocationManagerProvider.kt │ │ │ ├── MockLocationProvider.kt │ │ │ └── PlayServices.kt │ │ └── screenshot/ │ │ ├── ScreenshotService.kt │ │ └── ScreenshotServiceTest.kt │ └── main/ │ ├── AndroidManifest.xml │ ├── java/ │ │ └── dev/ │ │ └── mobile/ │ │ └── maestro/ │ │ ├── handlers/ │ │ │ ├── AbstractSettingHandler.kt │ │ │ └── LocaleSettingHandler.kt │ │ └── receivers/ │ │ ├── HasAction.kt │ │ └── LocaleSettingReceiver.kt │ └── res/ │ └── values/ │ └── stub.xml ├── maestro-cli/ │ ├── build.gradle.kts │ ├── gradle.properties │ ├── jvm-version.jar │ └── src/ │ ├── jreleaser/ │ │ └── distributions/ │ │ └── maestro/ │ │ └── brew/ │ │ └── formula.rb.tpl │ ├── main/ │ │ ├── java/ │ │ │ └── maestro/ │ │ │ └── cli/ │ │ │ ├── App.kt │ │ │ ├── CliError.kt │ │ │ ├── Dependencies.kt │ │ │ ├── DisableAnsiMixin.kt │ │ │ ├── ShowHelpMixin.kt │ │ │ ├── analytics/ │ │ │ │ ├── Analytics.kt │ │ │ │ ├── AnalyticsStateManager.kt │ │ │ │ └── PostHogEvents.kt │ │ │ ├── api/ │ │ │ │ ├── ApiClient.kt │ │ │ │ └── Chatbot.kt │ │ │ ├── auth/ │ │ │ │ └── Auth.kt │ │ │ ├── cloud/ │ │ │ │ └── CloudInteractor.kt │ │ │ ├── command/ │ │ │ │ ├── BugReportCommand.kt │ │ │ │ ├── ChatCommand.kt │ │ │ │ ├── CheckSyntaxCommand.kt │ │ │ │ ├── CloudCommand.kt │ │ │ │ ├── DownloadSamplesCommand.kt │ │ │ │ ├── DriverCommand.kt │ │ │ │ ├── ListCloudDevicesCommand.kt │ │ │ │ ├── ListDevicesCommand.kt │ │ │ │ ├── LoginCommand.kt │ │ │ │ ├── LogoutCommand.kt │ │ │ │ ├── McpCommand.kt │ │ │ │ ├── PrintHierarchyCommand.kt │ │ │ │ ├── QueryCommand.kt │ │ │ │ ├── RecordCommand.kt │ │ │ │ ├── StartDeviceCommand.kt │ │ │ │ ├── StudioCommand.kt │ │ │ │ └── TestCommand.kt │ │ │ ├── db/ │ │ │ │ └── KeyValueStore.kt │ │ │ ├── device/ │ │ │ │ ├── DeviceCreateUtil.kt │ │ │ │ ├── PickDeviceInteractor.kt │ │ │ │ └── PickDeviceView.kt │ │ │ ├── driver/ │ │ │ │ ├── DriverBuildConfig.kt │ │ │ │ ├── DriverBuilder.kt │ │ │ │ ├── RealIOSDeviceDriver.kt │ │ │ │ ├── Spinner.kt │ │ │ │ └── XcodeBuildProcessBuilderFactory.kt │ │ │ ├── graphics/ │ │ │ │ ├── AWTUtils.kt │ │ │ │ ├── LocalVideoRenderer.kt │ │ │ │ ├── RemoteVideoRenderer.kt │ │ │ │ ├── SkiaFrameRenderer.kt │ │ │ │ ├── SkiaTextClipper.kt │ │ │ │ ├── SkiaUtils.kt │ │ │ │ └── VideoRenderer.kt │ │ │ ├── insights/ │ │ │ │ └── TestAnalysisManager.kt │ │ │ ├── mcp/ │ │ │ │ ├── McpServer.kt │ │ │ │ ├── README.md │ │ │ │ └── tools/ │ │ │ │ ├── BackTool.kt │ │ │ │ ├── CheatSheetTool.kt │ │ │ │ ├── CheckFlowSyntaxTool.kt │ │ │ │ ├── InputTextTool.kt │ │ │ │ ├── InspectViewHierarchyTool.kt │ │ │ │ ├── LaunchAppTool.kt │ │ │ │ ├── ListDevicesTool.kt │ │ │ │ ├── QueryDocsTool.kt │ │ │ │ ├── RunFlowFilesTool.kt │ │ │ │ ├── RunFlowTool.kt │ │ │ │ ├── StartDeviceTool.kt │ │ │ │ ├── StopAppTool.kt │ │ │ │ ├── TakeScreenshotTool.kt │ │ │ │ ├── TapOnTool.kt │ │ │ │ └── ViewHierarchyFormatters.kt │ │ │ ├── model/ │ │ │ │ ├── FlowStatus.kt │ │ │ │ ├── RunningFlow.kt │ │ │ │ └── TestExecutionSummary.kt │ │ │ ├── promotion/ │ │ │ │ └── PromotionStateManager.kt │ │ │ ├── report/ │ │ │ │ ├── HtmlAITestSuiteReporter.kt │ │ │ │ ├── HtmlInsightsAnalysisReporter.kt │ │ │ │ ├── HtmlTestSuiteReporter.kt │ │ │ │ ├── JUnitTestSuiteReporter.kt │ │ │ │ ├── ReportFormat.kt │ │ │ │ ├── ReporterFactory.kt │ │ │ │ ├── TestDebugReporter.kt │ │ │ │ └── TestSuiteReporter.kt │ │ │ ├── runner/ │ │ │ │ ├── CliWatcher.kt │ │ │ │ ├── CommandState.kt │ │ │ │ ├── CommandStatus.kt │ │ │ │ ├── FileWatcher.kt │ │ │ │ ├── MaestroCommandRunner.kt │ │ │ │ ├── TestRunner.kt │ │ │ │ ├── TestSuiteInteractor.kt │ │ │ │ └── resultview/ │ │ │ │ ├── AnsiResultView.kt │ │ │ │ ├── PlainTextResultView.kt │ │ │ │ ├── ResultView.kt │ │ │ │ └── UiState.kt │ │ │ ├── session/ │ │ │ │ ├── MaestroSessionManager.kt │ │ │ │ └── SessionStore.kt │ │ │ ├── update/ │ │ │ │ └── Updates.kt │ │ │ ├── util/ │ │ │ │ ├── ChangeLogUtils.kt │ │ │ │ ├── CiUtils.kt │ │ │ │ ├── DependencyResolver.kt │ │ │ │ ├── EnvUtils.kt │ │ │ │ ├── ErrorReporter.kt │ │ │ │ ├── FileDownloader.kt │ │ │ │ ├── FileUtils.kt │ │ │ │ ├── IOSEnvUtils.kt │ │ │ │ ├── PrintUtils.kt │ │ │ │ ├── ResourceUtils.kt │ │ │ │ ├── ScreenReporter.kt │ │ │ │ ├── ScreenshotUtils.kt │ │ │ │ ├── SocketUtils.kt │ │ │ │ ├── TimeUtils.kt │ │ │ │ ├── Unpacker.kt │ │ │ │ ├── WorkingDirectory.kt │ │ │ │ └── WorkspaceUtils.kt │ │ │ ├── view/ │ │ │ │ ├── ErrorViewUtils.kt │ │ │ │ ├── ProgressBar.kt │ │ │ │ ├── TestSuiteStatusView.kt │ │ │ │ └── ViewUtils.kt │ │ │ └── web/ │ │ │ └── WebInteractor.kt │ │ └── resources/ │ │ ├── ai_report.css │ │ ├── deps/ │ │ │ └── applesimutils │ │ ├── html-detailed.css │ │ ├── logback-test.xml │ │ └── tailwind.config.js │ └── test/ │ ├── kotlin/ │ │ └── maestro/ │ │ └── cli/ │ │ ├── android/ │ │ │ └── AndroidDeviceProvider.kt │ │ ├── cloud/ │ │ │ └── CloudInteractorTest.kt │ │ ├── command/ │ │ │ └── TestCommandTest.kt │ │ ├── driver/ │ │ │ ├── DriverBuilderTest.kt │ │ │ └── RealDeviceDriverTest.kt │ │ ├── report/ │ │ │ ├── HtmlTestSuiteReporterTest.kt │ │ │ ├── JUnitTestSuiteReporterTest.kt │ │ │ ├── TestDebugReporterTest.kt │ │ │ └── TestSuiteReporterTest.kt │ │ ├── runner/ │ │ │ └── resultview/ │ │ │ └── PlainTextResultViewTest.kt │ │ └── util/ │ │ ├── ChangeLogUtilsTest.kt │ │ ├── DependencyResolverTest.kt │ │ └── WorkspaceUtilsTest.kt │ ├── mcp/ │ │ ├── README.md │ │ ├── full-evals.yaml │ │ ├── inspect-view-hierarchy-evals.yaml │ │ ├── launch_app_with_env_replacement.yaml │ │ ├── maestro-mcp.json │ │ ├── mcp-server-config.json │ │ ├── run_mcp_evals.sh │ │ ├── run_mcp_tool_tests.sh │ │ ├── setup/ │ │ │ ├── check-maestro-cli-built.sh │ │ │ ├── download-and-install-apps.sh │ │ │ ├── flows/ │ │ │ │ ├── launch-demo-app-ios.yaml │ │ │ │ ├── launch-safari-ios.yaml │ │ │ │ ├── setup-wikipedia-search-android.yaml │ │ │ │ ├── setup-wikipedia-search-ios.yaml │ │ │ │ └── verify-ready-state.yaml │ │ │ ├── launch-simulator.sh │ │ │ └── setup_and_run_eval.sh │ │ ├── tool-tests-with-device.yaml │ │ └── tool-tests-without-device.yaml │ └── resources/ │ ├── apps/ │ │ └── web-manifest.json │ ├── location/ │ │ └── assert_multiple_locations.yaml │ ├── travel/ │ │ └── assert_travel_command.yaml │ └── workspaces/ │ ├── cloud_test/ │ │ ├── android/ │ │ │ └── flow.yaml │ │ ├── ios/ │ │ │ └── flow.yaml │ │ ├── tagged/ │ │ │ ├── regression.yaml │ │ │ └── smoke.yaml │ │ └── web/ │ │ └── flow.yaml │ └── test_command_test/ │ ├── 00_mixed_web_mobile_flow_tests/ │ │ ├── mobileflow.yaml │ │ ├── mobileflow2.yaml │ │ ├── webflow.yaml │ │ └── webflow2.yaml │ ├── 01_web_only/ │ │ ├── webflow.yaml │ │ └── webflow2.yaml │ ├── 02_mobile_only/ │ │ ├── mobileflow1.yaml │ │ └── mobileflow2.yaml │ ├── 03_mixed_with_config_execution_order/ │ │ ├── config.yaml │ │ └── subFolder/ │ │ ├── mobileflow.yaml │ │ ├── mobileflow2.yaml │ │ ├── webflow.yaml │ │ └── webflow2.yaml │ └── 04_web_only_with_config_execution_order/ │ ├── config.yaml │ └── subFolder/ │ ├── mobileflow.yaml │ ├── mobileflow2.yaml │ ├── webflow.yaml │ └── webflow2.yaml ├── maestro-client/ │ ├── build.gradle.kts │ ├── gradle.properties │ └── src/ │ ├── main/ │ │ ├── java/ │ │ │ └── maestro/ │ │ │ ├── Bounds.kt │ │ │ ├── Capability.kt │ │ │ ├── DeviceInfo.kt │ │ │ ├── Driver.kt │ │ │ ├── Errors.kt │ │ │ ├── Filters.kt │ │ │ ├── FindElementResult.kt │ │ │ ├── KeyCode.kt │ │ │ ├── Maestro.kt │ │ │ ├── Media.kt │ │ │ ├── OnDeviceElementQuery.kt │ │ │ ├── OnDeviceElementQueryResult.kt │ │ │ ├── Point.kt │ │ │ ├── ScreenRecording.kt │ │ │ ├── ScrollDirection.kt │ │ │ ├── SwipeDirection.kt │ │ │ ├── TapRepeat.kt │ │ │ ├── TreeNode.kt │ │ │ ├── UiElement.kt │ │ │ ├── ViewHierarchy.kt │ │ │ ├── android/ │ │ │ │ ├── AndroidAppFiles.kt │ │ │ │ ├── AndroidBuildToolsDirectory.kt │ │ │ │ ├── AndroidLaunchArguments.kt │ │ │ │ └── chromedevtools/ │ │ │ │ ├── AndroidWebViewHierarchyClient.kt │ │ │ │ ├── DadbChromeDevToolsClient.kt │ │ │ │ └── DadbSocket.kt │ │ │ ├── auth/ │ │ │ │ └── ApiKey.kt │ │ │ ├── debuglog/ │ │ │ │ ├── DebugLogStore.kt │ │ │ │ └── LogConfig.kt │ │ │ ├── device/ │ │ │ │ ├── Device.kt │ │ │ │ ├── DeviceError.kt │ │ │ │ ├── DeviceOrientation.kt │ │ │ │ ├── DeviceService.kt │ │ │ │ ├── DeviceSpec.kt │ │ │ │ ├── Platform.kt │ │ │ │ ├── locale/ │ │ │ │ │ ├── AndroidLocale.kt │ │ │ │ │ ├── DeviceLocale.kt │ │ │ │ │ ├── IosLocale.kt │ │ │ │ │ ├── LocaleValidationException.kt │ │ │ │ │ └── WebLocale.kt │ │ │ │ ├── serialization/ │ │ │ │ │ ├── DeviceLocaleSerializer.kt │ │ │ │ │ └── DeviceSpecModule.kt │ │ │ │ └── util/ │ │ │ │ ├── AndroidEnvUtils.kt │ │ │ │ ├── AvdDevice.kt │ │ │ │ ├── CommandLineUtils.kt │ │ │ │ ├── EnvUtils.kt │ │ │ │ ├── PrintUtils.kt │ │ │ │ ├── SimctlList.kt │ │ │ │ └── SystemInfo.kt │ │ │ ├── drivers/ │ │ │ │ ├── AndroidDriver.kt │ │ │ │ ├── CdpWebDriver.kt │ │ │ │ ├── IOSDriver.kt │ │ │ │ └── WebDriver.kt │ │ │ ├── js/ │ │ │ │ ├── GraalJsEngine.kt │ │ │ │ ├── GraalJsHttp.kt │ │ │ │ ├── Js.kt │ │ │ │ ├── JsConsole.kt │ │ │ │ ├── JsEngine.kt │ │ │ │ ├── JsHttp.kt │ │ │ │ ├── JsScope.kt │ │ │ │ └── RhinoJsEngine.kt │ │ │ ├── mockserver/ │ │ │ │ └── MockInteractor.kt │ │ │ └── utils/ │ │ │ ├── BlockingStreamObserver.kt │ │ │ ├── FileUtils.kt │ │ │ ├── HttpUtils.kt │ │ │ ├── LocaleUtils.kt │ │ │ ├── ScreenshotUtils.kt │ │ │ ├── StringUtils.kt │ │ │ └── TemporaryDirectory.kt │ │ └── resources/ │ │ ├── maestro-app.apk │ │ ├── maestro-server.apk │ │ └── maestro-web.js │ └── test/ │ ├── java/ │ │ └── maestro/ │ │ ├── FiltersTest.kt │ │ ├── PointTest.kt │ │ ├── UiElementTest.kt │ │ ├── android/ │ │ │ ├── AndroidAppFilesTest.kt │ │ │ ├── AndroidLaunchArgumentsTest.kt │ │ │ └── chromedevtools/ │ │ │ └── AndroidWebViewHierarchyClientTest.kt │ │ ├── device/ │ │ │ ├── DeviceServiceTest.kt │ │ │ ├── DeviceSpecTest.kt │ │ │ └── serialization/ │ │ │ └── DeviceSpecSerializationTest.kt │ │ ├── ios/ │ │ │ └── MockXCTestInstaller.kt │ │ ├── locale/ │ │ │ └── DeviceLocaleTest.kt │ │ ├── utils/ │ │ │ ├── HttpUtilsTest.kt │ │ │ └── StringUtilsTest.kt │ │ └── xctestdriver/ │ │ └── XCTestDriverClientTest.kt │ └── resources/ │ └── logback-test.xml ├── maestro-ios/ │ ├── README.md │ ├── build.gradle.kts │ ├── gradle.properties │ └── src/ │ └── main/ │ └── java/ │ └── ios/ │ ├── IOSDeviceErrors.kt │ ├── LocalIOSDevice.kt │ ├── devicectl/ │ │ └── DeviceControlIOSDevice.kt │ └── xctest/ │ └── XCTestIOSDevice.kt ├── maestro-ios-driver/ │ ├── build.gradle.kts │ ├── gradle.properties │ └── src/ │ ├── main/ │ │ ├── kotlin/ │ │ │ ├── device/ │ │ │ │ ├── IOSDevice.kt │ │ │ │ └── SimctlIOSDevice.kt │ │ │ ├── hierarchy/ │ │ │ │ └── AXElement.kt │ │ │ ├── util/ │ │ │ │ ├── CommandLineUtils.kt │ │ │ │ ├── IOSDevice.kt │ │ │ │ ├── IOSLaunchArguments.kt │ │ │ │ ├── LocalIOSDevice.kt │ │ │ │ ├── LocalIOSDeviceController.kt │ │ │ │ ├── LocalSimulatorUtils.kt │ │ │ │ ├── PrintUtils.kt │ │ │ │ ├── SimctlList.kt │ │ │ │ └── XCRunnerCLIUtils.kt │ │ │ └── xcuitest/ │ │ │ ├── XCTestClient.kt │ │ │ ├── XCTestDriverClient.kt │ │ │ ├── api/ │ │ │ │ ├── DeviceInfo.kt │ │ │ │ ├── EraseTextRequest.kt │ │ │ │ ├── Error.kt │ │ │ │ ├── GetRunningAppIdResponse.kt │ │ │ │ ├── GetRunningAppRequest.kt │ │ │ │ ├── InputTextRequest.kt │ │ │ │ ├── IsScreenStaticResponse.kt │ │ │ │ ├── KeyboardInfoRequest.kt │ │ │ │ ├── KeyboardInfoResponse.kt │ │ │ │ ├── LaunchAppRequest.kt │ │ │ │ ├── NetworkExceptions.kt │ │ │ │ ├── OkHttpClientInstance.kt │ │ │ │ ├── PressButtonRequest.kt │ │ │ │ ├── PressKeyRequest.kt │ │ │ │ ├── SetOrientationRequest.kt │ │ │ │ ├── SetPermissionsRequest.kt │ │ │ │ ├── SwipeRequest.kt │ │ │ │ ├── TerminateAppRequest.kt │ │ │ │ ├── TouchRequest.kt │ │ │ │ └── ViewHierarchyRequest.kt │ │ │ └── installer/ │ │ │ ├── IOSBuildProductsExtractor.kt │ │ │ ├── LocalXCTestInstaller.kt │ │ │ └── XCTestInstaller.kt │ │ └── resources/ │ │ ├── driver-iPhoneSimulator/ │ │ │ └── maestro-driver-ios-config.xctestrun │ │ ├── driver-iphoneos/ │ │ │ └── maestro-driver-ios-config.xctestrun │ │ └── screenrecord.sh │ └── test/ │ └── kotlin/ │ ├── DeviceCtlResponseTest.kt │ ├── IOSBuildProductsExtractorTest.kt │ └── IOSLaunchArgumentsTest.kt ├── maestro-ios-xctest-runner/ │ ├── .gitignore │ ├── MaestroDriverLib/ │ │ ├── Info.plist │ │ ├── Package.swift │ │ ├── Sources/ │ │ │ └── MaestroDriverLib/ │ │ │ ├── Helpers/ │ │ │ │ └── PermissionButtonFinder.swift │ │ │ ├── MaestroDriverLib.swift │ │ │ └── Models/ │ │ │ ├── AXElement.swift │ │ │ ├── AXFrame.swift │ │ │ ├── ElementType.swift │ │ │ └── PermissionValue.swift │ │ └── Tests/ │ │ └── MaestroDriverLibTests/ │ │ ├── AXElementTests.swift │ │ ├── AXFrameTests.swift │ │ └── PermissionButtonFinderTests.swift │ ├── build-maestro-ios-runner-all.sh │ ├── build-maestro-ios-runner.sh │ ├── maestro-driver-ios/ │ │ ├── AppDelegate.swift │ │ ├── Assets.xcassets/ │ │ │ ├── AccentColor.colorset/ │ │ │ │ └── Contents.json │ │ │ ├── AppIcon.appiconset/ │ │ │ │ └── Contents.json │ │ │ └── Contents.json │ │ ├── Base.lproj/ │ │ │ ├── LaunchScreen.storyboard │ │ │ └── Main.storyboard │ │ ├── Info.plist │ │ ├── SceneDelegate.swift │ │ └── ViewController.swift │ ├── maestro-driver-ios.xcodeproj/ │ │ ├── project.pbxproj │ │ ├── project.xcworkspace/ │ │ │ ├── contents.xcworkspacedata │ │ │ └── xcshareddata/ │ │ │ ├── IDEWorkspaceChecks.plist │ │ │ └── swiftpm/ │ │ │ └── Package.resolved │ │ └── xcshareddata/ │ │ └── xcschemes/ │ │ ├── maestro-driver-ios.xcscheme │ │ └── maestro-driver-iosTests.xcscheme │ ├── maestro-driver-iosTests/ │ │ ├── Info.plist │ │ ├── SnapshotParametersTests.swift │ │ └── maestro-driver-iosTests-Bridging-Header.h │ ├── maestro-driver-iosUITests/ │ │ ├── Categories/ │ │ │ ├── XCAXClient_iOS+FBSnapshotReqParams.h │ │ │ ├── XCAXClient_iOS+FBSnapshotReqParams.m │ │ │ ├── XCUIApplication+FBQuiescence.h │ │ │ ├── XCUIApplication+FBQuiescence.m │ │ │ ├── XCUIApplication+Helper.h │ │ │ ├── XCUIApplication+Helper.m │ │ │ ├── XCUIApplicationProcess+FBQuiescence.h │ │ │ ├── XCUIApplicationProcess+FBQuiescence.m │ │ │ └── maestro-driver-iosUITests-Bridging-Header.h │ │ ├── PrivateHeaders/ │ │ │ └── XCTest/ │ │ │ ├── CDStructures.h │ │ │ ├── NSString-XCTAdditions.h │ │ │ ├── NSValue-XCTestAdditions.h │ │ │ ├── UIGestureRecognizer-RecordingAdditions.h │ │ │ ├── UILongPressGestureRecognizer-RecordingAdditions.h │ │ │ ├── UIPanGestureRecognizer-RecordingAdditions.h │ │ │ ├── UIPinchGestureRecognizer-RecordingAdditions.h │ │ │ ├── UISwipeGestureRecognizer-RecordingAdditions.h │ │ │ ├── UITapGestureRecognizer-RecordingAdditions.h │ │ │ ├── XCAXClient_iOS.h │ │ │ ├── XCActivityRecord.h │ │ │ ├── XCApplicationMonitor.h │ │ │ ├── XCApplicationMonitor_iOS.h │ │ │ ├── XCApplicationQuery.h │ │ │ ├── XCDebugLogDelegate-Protocol.h │ │ │ ├── XCEventGenerator.h │ │ │ ├── XCKeyMappingPath.h │ │ │ ├── XCKeyboardInputSolver.h │ │ │ ├── XCKeyboardKeyMap.h │ │ │ ├── XCKeyboardLayout.h │ │ │ ├── XCPointerEvent.h │ │ │ ├── XCPointerEventPath.h │ │ │ ├── XCSourceCodeRecording.h │ │ │ ├── XCSourceCodeTreeNode.h │ │ │ ├── XCSourceCodeTreeNodeEnumerator.h │ │ │ ├── XCSymbolicationRecord.h │ │ │ ├── XCSymbolicatorHolder.h │ │ │ ├── XCSynthesizedEventRecord.h │ │ │ ├── XCTAXClient-Protocol.h │ │ │ ├── XCTAsyncActivity-Protocol.h │ │ │ ├── XCTAsyncActivity.h │ │ │ ├── XCTAutomationTarget-Protocol.h │ │ │ ├── XCTDarwinNotificationExpectation.h │ │ │ ├── XCTElementSetTransformer-Protocol.h │ │ │ ├── XCTKVOExpectation.h │ │ │ ├── XCTMetric.h │ │ │ ├── XCTNSNotificationExpectation.h │ │ │ ├── XCTNSPredicateExpectation.h │ │ │ ├── XCTNSPredicateExpectationObject-Protocol.h │ │ │ ├── XCTRunnerAutomationSession.h │ │ │ ├── XCTRunnerDaemonSession.h │ │ │ ├── XCTRunnerIDESession.h │ │ │ ├── XCTTestRunSession.h │ │ │ ├── XCTTestRunSessionDelegate-Protocol.h │ │ │ ├── XCTUIApplicationMonitor-Protocol.h │ │ │ ├── XCTWaiter.h │ │ │ ├── XCTWaiterDelegate-Protocol.h │ │ │ ├── XCTWaiterDelegatePrivate-Protocol.h │ │ │ ├── XCTWaiterManagement-Protocol.h │ │ │ ├── XCTWaiterManager.h │ │ │ ├── XCTest.h │ │ │ ├── XCTestCase.h │ │ │ ├── XCTestCaseRun.h │ │ │ ├── XCTestCaseSuite.h │ │ │ ├── XCTestConfiguration.h │ │ │ ├── XCTestContext.h │ │ │ ├── XCTestContextScope.h │ │ │ ├── XCTestDriver.h │ │ │ ├── XCTestDriverInterface-Protocol.h │ │ │ ├── XCTestExpectation.h │ │ │ ├── XCTestExpectationDelegate-Protocol.h │ │ │ ├── XCTestExpectationWaiter.h │ │ │ ├── XCTestLog.h │ │ │ ├── XCTestManager_IDEInterface-Protocol.h │ │ │ ├── XCTestManager_ManagerInterface-Protocol.h │ │ │ ├── XCTestManager_TestsInterface-Protocol.h │ │ │ ├── XCTestMisuseObserver.h │ │ │ ├── XCTestObservation-Protocol.h │ │ │ ├── XCTestObservationCenter.h │ │ │ ├── XCTestObserver.h │ │ │ ├── XCTestProbe.h │ │ │ ├── XCTestRun.h │ │ │ ├── XCTestSuite.h │ │ │ ├── XCTestSuiteRun.h │ │ │ ├── XCTestWaiter.h │ │ │ ├── XCUIApplication.h │ │ │ ├── XCUIApplicationImpl.h │ │ │ ├── XCUIApplicationProcess.h │ │ │ ├── XCUICoordinate.h │ │ │ ├── XCUIDevice.h │ │ │ ├── XCUIElement.h │ │ │ ├── XCUIElementAsynchronousHandlerWrapper.h │ │ │ ├── XCUIElementHitPointCoordinate.h │ │ │ ├── XCUIElementQuery.h │ │ │ ├── XCUIHitPointResult.h │ │ │ ├── XCUIRecorderNodeFinder.h │ │ │ ├── XCUIRecorderNodeFinderMatch.h │ │ │ ├── XCUIRecorderTimingMessage.h │ │ │ ├── XCUIRecorderUtilities.h │ │ │ ├── XCUIScreen.h │ │ │ ├── XCUIScreenDataSource-Protocol.h │ │ │ ├── _XCInternalTestRun.h │ │ │ ├── _XCKVOExpectationImplementation.h │ │ │ ├── _XCTDarwinNotificationExpectationImplementation.h │ │ │ ├── _XCTNSNotificationExpectationImplementation.h │ │ │ ├── _XCTNSPredicateExpectationImplementation.h │ │ │ ├── _XCTWaiterImpl.h │ │ │ ├── _XCTestCaseImplementation.h │ │ │ ├── _XCTestCaseInterruptionException.h │ │ │ ├── _XCTestExpectationImplementation.h │ │ │ ├── _XCTestImplementation.h │ │ │ ├── _XCTestObservationCenterImplementation.h │ │ │ └── _XCTestSuiteImplementation.h │ │ ├── Routes/ │ │ │ ├── Extensions/ │ │ │ │ ├── Logger.swift │ │ │ │ ├── StringExtensions.swift │ │ │ │ └── XCUIElement+Extensions.swift │ │ │ ├── Handlers/ │ │ │ │ ├── DeviceInfoHandler.swift │ │ │ │ ├── EraseTextHandler.swift │ │ │ │ ├── InputTextRouteHandler.swift │ │ │ │ ├── KeyboardRouteHandler.swift │ │ │ │ ├── LaunchAppHandler.swift │ │ │ │ ├── PressButtonHandler.swift │ │ │ │ ├── PressKeyHandler.swift │ │ │ │ ├── RunningAppRouteHandler.swift │ │ │ │ ├── ScreenDiffHandler.swift │ │ │ │ ├── ScreenshotHandler.swift │ │ │ │ ├── SetOrientationHandler.swift │ │ │ │ ├── SetPermissionsHandler.swift │ │ │ │ ├── StatusHandler.swift │ │ │ │ ├── SwipeRouteHandler.swift │ │ │ │ ├── SwipeRouteHandlerV2.swift │ │ │ │ ├── TerminateAppHandler.swift │ │ │ │ ├── TouchRouteHandler.swift │ │ │ │ └── ViewHierarchyHandler.swift │ │ │ ├── Helpers/ │ │ │ │ ├── AppError.swift │ │ │ │ ├── ScreenSizeHelper.swift │ │ │ │ ├── SystemPermissionHelper.swift │ │ │ │ └── TextInputHelper.swift │ │ │ ├── Models/ │ │ │ │ ├── AXElement.swift │ │ │ │ ├── DeviceInfoResponse.swift │ │ │ │ ├── EraseTextRequest.swift │ │ │ │ ├── GetRunningAppRequest.swift │ │ │ │ ├── InputTextRequest.swift │ │ │ │ ├── KeyboardHandlerRequest.swift │ │ │ │ ├── KeyboardHandlerResponse.swift │ │ │ │ ├── LaunchAppRequest.swift │ │ │ │ ├── PressButtonRequest.swift │ │ │ │ ├── PressKeyRequest.swift │ │ │ │ ├── SetOrientationRequest.swift │ │ │ │ ├── SetPermissionsRequest.swift │ │ │ │ ├── StatusResponse.swift │ │ │ │ ├── SwipeRequest.swift │ │ │ │ ├── TerminateAppRequest.swift │ │ │ │ ├── TouchRequest.swift │ │ │ │ └── ViewHierarchyRequest.swift │ │ │ ├── RouteHandlerFactory.swift │ │ │ ├── XCTest/ │ │ │ │ ├── AXClientSwizzler.swift │ │ │ │ ├── EventRecord.swift │ │ │ │ ├── EventTarget.swift │ │ │ │ ├── KeyModifierFlags.swift │ │ │ │ ├── PointerEventPath.swift │ │ │ │ ├── RunnerDaemonProxy.swift │ │ │ │ └── RunningApp.swift │ │ │ └── XCTestHTTPServer.swift │ │ ├── Utilities/ │ │ │ ├── AXClientProxy.h │ │ │ ├── AXClientProxy.m │ │ │ ├── FBConfiguration.h │ │ │ ├── FBConfiguration.m │ │ │ ├── FBLogger.h │ │ │ ├── FBLogger.m │ │ │ ├── XCAccessibilityElement.h │ │ │ ├── XCTestDaemonsProxy.h │ │ │ └── XCTestDaemonsProxy.m │ │ ├── maestro_driver_iosUITests.swift │ │ └── maestro_driver_iosUITestsLaunchTests.swift │ ├── run-maestro-ios-runner.sh │ └── test-maestro-ios-runner.sh ├── maestro-orchestra/ │ ├── build.gradle.kts │ ├── gradle.properties │ └── src/ │ ├── main/ │ │ └── java/ │ │ └── maestro/ │ │ └── orchestra/ │ │ ├── Orchestra.kt │ │ ├── error/ │ │ │ ├── InvalidFlowFile.kt │ │ │ ├── MediaFileNotFound.kt │ │ │ ├── NoInputException.kt │ │ │ ├── SyntaxError.kt │ │ │ ├── UnicodeNotSupportedError.kt │ │ │ └── ValidationError.kt │ │ ├── filter/ │ │ │ ├── FilterWithDescription.kt │ │ │ ├── LaunchArguments.kt │ │ │ └── TraitFilters.kt │ │ ├── geo/ │ │ │ └── Traveller.kt │ │ ├── util/ │ │ │ ├── AppMetadataAnalyzer.kt │ │ │ └── ElementCoordinateUtil.kt │ │ ├── validation/ │ │ │ ├── AppValidationException.kt │ │ │ ├── AppValidator.kt │ │ │ ├── WorkspaceValidationException.kt │ │ │ └── WorkspaceValidator.kt │ │ ├── workspace/ │ │ │ ├── ExecutionOrderPlanner.kt │ │ │ ├── Filters.kt │ │ │ ├── WorkspaceExecutionPlanner.kt │ │ │ ├── WorkspaceValidator.kt │ │ │ └── YamlCommandsPathValidator.kt │ │ └── yaml/ │ │ ├── MaestroFlowParser.kt │ │ ├── YamlAction.kt │ │ ├── YamlAddMedia.kt │ │ ├── YamlAssertNoDefectsWithAI.kt │ │ ├── YamlAssertScreenshot.kt │ │ ├── YamlAssertTrue.kt │ │ ├── YamlAssertWithAI.kt │ │ ├── YamlClearState.kt │ │ ├── YamlCommandReader.kt │ │ ├── YamlCondition.kt │ │ ├── YamlConfig.kt │ │ ├── YamlElementSelector.kt │ │ ├── YamlElementSelectorUnion.kt │ │ ├── YamlEraseTextUnion.kt │ │ ├── YamlEvalScript.kt │ │ ├── YamlExtendedWaitUntil.kt │ │ ├── YamlExtractTextWithAI.kt │ │ ├── YamlFluentCommand.kt │ │ ├── YamlInputRandomText.kt │ │ ├── YamlInputText.kt │ │ ├── YamlKillApp.kt │ │ ├── YamlLaunchApp.kt │ │ ├── YamlOnFlowComplete.kt │ │ ├── YamlOnFlowStart.kt │ │ ├── YamlOpenLink.kt │ │ ├── YamlPressKey.kt │ │ ├── YamlRepeatCommand.kt │ │ ├── YamlRetry.kt │ │ ├── YamlRunFlow.kt │ │ ├── YamlRunScript.kt │ │ ├── YamlScrollUntilVisible.kt │ │ ├── YamlSetAirplaneMode.kt │ │ ├── YamlSetClipboard.kt │ │ ├── YamlSetLocation.kt │ │ ├── YamlSetOrientation.kt │ │ ├── YamlSetPermissions.kt │ │ ├── YamlStartRecording.kt │ │ ├── YamlStopApp.kt │ │ ├── YamlSwipe.kt │ │ ├── YamlTakeScreenshot.kt │ │ ├── YamlToggleAirplaneMode.kt │ │ ├── YamlTravelCommand.kt │ │ └── YamlWaitForAnimationToEndCommand.kt │ └── test/ │ ├── java/ │ │ └── maestro/ │ │ └── orchestra/ │ │ ├── CommandDescriptionTest.kt │ │ ├── LaunchArgumentsTest.kt │ │ ├── MaestroCommandSerializationTest.kt │ │ ├── MaestroCommandTest.kt │ │ ├── android/ │ │ │ ├── AndroidMediaStoreTest.kt │ │ │ └── DadbExt.kt │ │ ├── util/ │ │ │ ├── AppMetadataAnalyzerTest.kt │ │ │ └── ElementCoordinateUtilTest.kt │ │ ├── validation/ │ │ │ ├── AppValidatorTest.kt │ │ │ └── WorkspaceValidatorTest.kt │ │ ├── workspace/ │ │ │ ├── ExecutionOrderPlannerTest.kt │ │ │ ├── WorkspaceExecutionPlannerErrorsTest.kt │ │ │ ├── WorkspaceExecutionPlannerTest.kt │ │ │ └── WorkspaceValidatorTest.kt │ │ └── yaml/ │ │ ├── YamlCommandReaderTest.kt │ │ └── junit/ │ │ ├── YamlCommandsExtension.kt │ │ ├── YamlFile.kt │ │ └── YamlResourceFile.kt │ └── resources/ │ ├── YamlCommandReaderTest/ │ │ ├── 002_launchApp.yaml │ │ ├── 003_launchApp_withClearState.yaml │ │ ├── 008_config_unknownKeys.yaml │ │ ├── 017_launchApp_otherPackage.yaml │ │ ├── 018_backPress_string.yaml │ │ ├── 019_scroll_string.yaml │ │ ├── 020_config_name.yaml │ │ ├── 022_on_flow_start_complete.yaml │ │ ├── 023_labels.yaml │ │ ├── 023_runScript_test.js │ │ ├── 024_string_non_string_commands.yaml │ │ ├── 025_killApp.yaml │ │ ├── 027_waitToSettleTimeoutMs.yaml │ │ ├── 028_inputRandomAnimal.yaml │ │ ├── 029_command_descriptions.yaml │ │ ├── 029_double_tap_element_relative.yaml │ │ ├── 029_element_relative_tap_css.yaml │ │ ├── 029_element_relative_tap_enabled.yaml │ │ ├── 029_element_relative_tap_id_absolute.yaml │ │ ├── 029_element_relative_tap_index.yaml │ │ ├── 029_element_relative_tap_label.yaml │ │ ├── 029_element_relative_tap_size.yaml │ │ ├── 029_element_relative_tap_text_percentage.yaml │ │ ├── 029_element_relative_tap_with_repeat.yaml │ │ ├── 029_pure_point_tap.yaml │ │ ├── 029_regular_element_tap.yaml │ │ ├── 030_setPermissions.yaml │ │ ├── 031_setOrientation.yaml │ │ └── 032_setOrientation_error.yaml │ ├── media/ │ │ ├── android/ │ │ │ ├── add_media_gif.yaml │ │ │ ├── add_media_jpeg.yaml │ │ │ ├── add_media_jpg.yaml │ │ │ ├── add_media_mp4.yaml │ │ │ ├── add_media_png.yaml │ │ │ └── add_multiple_media.yaml │ │ └── ios/ │ │ ├── add_media_gif.yaml │ │ ├── add_media_jpeg.yaml │ │ ├── add_media_jpg.yaml │ │ ├── add_media_mp4.yaml │ │ ├── add_media_png.yaml │ │ └── add_multiple_media.yaml │ └── workspaces/ │ ├── .gitignore │ ├── 000_individual_file/ │ │ └── flow.yaml │ ├── 001_simple/ │ │ ├── flowA.yaml │ │ ├── flowB.yaml │ │ └── notAFlow.txt │ ├── 002_subflows/ │ │ ├── flowA.yaml │ │ ├── flowB.yaml │ │ └── subflows/ │ │ └── subflow.yaml │ ├── 003_include_tags/ │ │ ├── flowA.yaml │ │ ├── flowB.yaml │ │ └── flowC.yaml │ ├── 004_exclude_tags/ │ │ ├── flowA.yaml │ │ ├── flowB.yaml │ │ └── flowC.yaml │ ├── 005_custom_include_pattern/ │ │ ├── config.yaml │ │ ├── featureA/ │ │ │ └── flowA.yaml │ │ ├── featureB/ │ │ │ └── flowB.yaml │ │ ├── featureC/ │ │ │ └── flowC.yaml │ │ └── flowD.yaml │ ├── 006_include_subfolders/ │ │ ├── config.yaml │ │ ├── featureA/ │ │ │ └── flowA.yaml │ │ ├── featureB/ │ │ │ └── flowB.yaml │ │ ├── featureC/ │ │ │ └── subfolder/ │ │ │ └── flowC.yaml │ │ └── flowD.yaml │ ├── 007_empty_config/ │ │ ├── config.yml │ │ ├── flowA.yaml │ │ └── flowB.yaml │ ├── 008_literal_pattern/ │ │ ├── config.yaml │ │ ├── featureA/ │ │ │ └── flowA.yaml │ │ └── featureB/ │ │ └── flowB.yaml │ ├── 009_custom_config_fields/ │ │ ├── config.yml │ │ ├── flowA.yaml │ │ └── flowB.yaml │ ├── 010_global_include_tags/ │ │ ├── config.yaml │ │ ├── flowA.yaml │ │ ├── flowA_subflow.yaml │ │ ├── flowB.yaml │ │ ├── flowC.yaml │ │ ├── flowD.yaml │ │ └── flowE.yaml │ ├── 011_global_exclude_tags/ │ │ ├── config.yaml │ │ ├── flowA.yaml │ │ ├── flowA_subflow.yaml │ │ ├── flowB.yaml │ │ ├── flowC.yaml │ │ ├── flowD.yaml │ │ └── flowE.yaml │ ├── 013_execution_order/ │ │ ├── config.yaml │ │ ├── flowA.yaml │ │ ├── flowB.yaml │ │ ├── flowCWithCustomName.yaml │ │ └── flowD.yaml │ ├── 014_config_not_null/ │ │ ├── config/ │ │ │ └── another_config.yaml │ │ ├── config.yaml │ │ ├── flowA.yaml │ │ └── flowB.yaml │ ├── 015_workspace_cloud_configs/ │ │ ├── config.yaml │ │ ├── flowA.yaml │ │ └── flowB.yaml │ ├── e000_flow_path_does_not_exist/ │ │ └── error.txt │ ├── e001_directory_does_not_contain_flow_files/ │ │ ├── error.txt │ │ └── workspace/ │ │ └── dummy │ ├── e002_top_level_directory_does_not_contain_flow_files/ │ │ ├── error.txt │ │ └── workspace/ │ │ └── subdir/ │ │ └── Flow.yaml │ ├── e003_flow_inclusion_pattern_does_not_match_any_flow_files/ │ │ ├── error.txt │ │ └── workspace/ │ │ ├── FlowC.yaml │ │ └── config.yaml │ ├── e004_tags_config_does_not_match_any_flow_files/ │ │ ├── error.txt │ │ ├── excludeTags.txt │ │ ├── includeTags.txt │ │ └── workspace/ │ │ ├── ConfigExclude.yaml │ │ ├── ParameterExclude.yaml │ │ └── config.yaml │ ├── e005_single_flow_does_not_exist/ │ │ ├── error.txt │ │ └── singleFlow.txt │ ├── e006_single_flow_invalid_string_command/ │ │ ├── error.txt │ │ ├── singleFlow.txt │ │ └── workspace/ │ │ └── Flow.yaml │ ├── e007_single_flow_malformatted_command/ │ │ ├── error.txt │ │ ├── singleFlow.txt │ │ └── workspace/ │ │ └── Flow.yaml │ ├── e008_subflow_invalid_string_command/ │ │ ├── error.txt │ │ └── workspace/ │ │ ├── Flow.yaml │ │ └── subflow/ │ │ └── SubFlow.yaml │ ├── e009_nested_subflow_invalid_string_command/ │ │ ├── error.txt │ │ └── workspace/ │ │ ├── Flow.yaml │ │ └── subflow/ │ │ ├── SubFlowA.yaml │ │ └── SubFlowB.yaml │ ├── e010_missing_config_section/ │ │ ├── error.txt │ │ └── workspace/ │ │ └── Flow.yaml │ ├── e011_missing_dashes/ │ │ ├── error.txt │ │ └── workspace/ │ │ └── Flow.yaml │ ├── e012_invalid_subflow_path/ │ │ ├── error.txt │ │ └── workspace/ │ │ └── Flow.yaml │ ├── e013_invalid_media_file/ │ │ ├── error.txt │ │ └── workspace/ │ │ └── Flow.yaml │ ├── e014_invalid_media_file_outside/ │ │ ├── error.txt │ │ └── workspace/ │ │ └── Flow.yaml │ ├── e015_array_command/ │ │ ├── error.txt │ │ └── workspace/ │ │ └── Flow.yaml │ ├── e016_config_invalid_command_in_onFlowStart/ │ │ ├── error.txt │ │ └── workspace/ │ │ └── Flow.yaml │ ├── e017_config_invalid_tags/ │ │ ├── error.txt │ │ └── workspace/ │ │ └── Flow.yaml │ ├── e018_config_missing_appId/ │ │ ├── error.txt │ │ └── workspace/ │ │ └── Flow.yaml │ ├── e019_invalid_swipe_direction/ │ │ ├── error.txt │ │ └── workspace/ │ │ └── Flow.yaml │ ├── e020_missing_command_options/ │ │ ├── error.txt │ │ └── workspace/ │ │ └── Flow.yaml │ ├── e021_multiple_command_names/ │ │ ├── error.txt │ │ └── workspace/ │ │ └── Flow.yaml │ ├── e022_top_level_option/ │ │ ├── error.txt │ │ └── workspace/ │ │ └── Flow.yaml │ ├── e023_empty/ │ │ ├── error.txt │ │ └── workspace/ │ │ └── Flow.yaml │ ├── e023_empty_commands/ │ │ ├── error.txt │ │ └── workspace/ │ │ └── Flow.yaml │ ├── e023_launchApp_empty_string/ │ │ ├── error.txt │ │ └── workspace/ │ │ └── Flow.yaml │ └── workspace_validator_flow.yaml ├── maestro-orchestra-models/ │ ├── build.gradle.kts │ ├── gradle.properties │ └── src/ │ ├── main/ │ │ └── java/ │ │ └── maestro/ │ │ └── orchestra/ │ │ ├── Commands.kt │ │ ├── Condition.kt │ │ ├── ElementSelector.kt │ │ ├── ElementTrait.kt │ │ ├── MaestroCommand.kt │ │ ├── MaestroConfig.kt │ │ ├── WorkspaceConfig.kt │ │ └── util/ │ │ └── Env.kt │ └── test/ │ └── kotlin/ │ └── maestro/ │ └── orchestra/ │ ├── CommandsTest.kt │ ├── ElementSelectorTest.kt │ └── util/ │ └── EnvTest.kt ├── maestro-proto/ │ ├── build.gradle.kts │ ├── gradle.properties │ └── src/ │ └── main/ │ └── proto/ │ └── maestro_android.proto ├── maestro-studio/ │ ├── server/ │ │ ├── .gitignore │ │ ├── build.gradle │ │ └── src/ │ │ └── main/ │ │ └── java/ │ │ └── maestro/ │ │ └── studio/ │ │ ├── AuthService.kt │ │ ├── DeviceService.kt │ │ ├── HttpException.kt │ │ ├── InsightService.kt │ │ ├── KtorUtils.kt │ │ ├── MaestroStudio.kt │ │ ├── MockService.kt │ │ └── Models.kt │ └── web/ │ ├── .gitignore │ ├── .npmrc │ ├── .nvmrc │ ├── build.gradle │ ├── package.json │ ├── postcss.config.js │ ├── public/ │ │ └── index.html │ ├── src/ │ │ ├── App.tsx │ │ ├── api/ │ │ │ └── api.ts │ │ ├── components/ │ │ │ ├── commands/ │ │ │ │ ├── CommandCreator.tsx │ │ │ │ ├── CommandInput.tsx │ │ │ │ ├── CommandList.tsx │ │ │ │ ├── CommandRow.tsx │ │ │ │ ├── ReplHeader.tsx │ │ │ │ ├── ReplView.tsx │ │ │ │ └── SaveFlowModal.tsx │ │ │ ├── common/ │ │ │ │ ├── AuthModal.tsx │ │ │ │ ├── Banner.tsx │ │ │ │ ├── ChatGptApiKeyModal.tsx │ │ │ │ ├── ConfirmationDialog.tsx │ │ │ │ ├── Header.tsx │ │ │ │ ├── Modal.tsx │ │ │ │ ├── PageSwitcher.tsx │ │ │ │ └── theme.tsx │ │ │ ├── design-system/ │ │ │ │ ├── button.tsx │ │ │ │ ├── checkbox.tsx │ │ │ │ ├── dialog.tsx │ │ │ │ ├── dropdown-menu.tsx │ │ │ │ ├── icon.tsx │ │ │ │ ├── input.tsx │ │ │ │ ├── keyboard-key.tsx │ │ │ │ ├── link.tsx │ │ │ │ ├── spinner.tsx │ │ │ │ ├── tabs.tsx │ │ │ │ └── utils/ │ │ │ │ ├── functions.tsx │ │ │ │ └── images.tsx │ │ │ ├── device-and-device-elements/ │ │ │ │ ├── ActionModal.tsx │ │ │ │ ├── AnnotatedScreenshot.tsx │ │ │ │ ├── BrowserActionBar.tsx │ │ │ │ ├── DeviceWrapperAspectRatio.tsx │ │ │ │ ├── ElementsPanel.tsx │ │ │ │ ├── InteractableDevice.tsx │ │ │ │ └── SelectedElementViewer.tsx │ │ │ └── interact/ │ │ │ └── InteractPageLayout.tsx │ │ ├── context/ │ │ │ ├── AuthContext.tsx │ │ │ ├── DeviceContext.tsx │ │ │ └── ReplContext.tsx │ │ ├── helpers/ │ │ │ ├── commandExample.ts │ │ │ ├── models.ts │ │ │ └── sampleElements.ts │ │ ├── index.tsx │ │ ├── pages/ │ │ │ └── InteractPage.tsx │ │ ├── react-app-env.d.ts │ │ └── style/ │ │ └── index.css │ ├── tailwind.config.js │ └── tsconfig.json ├── maestro-test/ │ ├── build.gradle.kts │ └── src/ │ ├── main/ │ │ └── kotlin/ │ │ └── maestro/ │ │ └── test/ │ │ └── drivers/ │ │ ├── FakeDriver.kt │ │ ├── FakeLayoutElement.kt │ │ └── FakeTimer.kt │ └── test/ │ ├── kotlin/ │ │ └── maestro/ │ │ └── test/ │ │ ├── DeepestMatchingElementTest.kt │ │ ├── FlowControllerTest.kt │ │ ├── GraalJsEngineTest.kt │ │ ├── IntegrationTest.kt │ │ ├── JsEngineTest.kt │ │ └── RhinoJsEngineTest.kt │ └── resources/ │ ├── 001_assert_visible_by_id.yaml │ ├── 002_assert_visible_by_text.yaml │ ├── 003_assert_visible_by_size.yaml │ ├── 004_assert_no_visible_element_with_id.yaml │ ├── 005_assert_no_visible_element_with_text.yaml │ ├── 006_assert_no_visible_element_with_size.yaml │ ├── 007_assert_visible_by_size_with_tolerance.yaml │ ├── 008_tap_on_element.yaml │ ├── 009_skip_optional_elements.yaml │ ├── 010_scroll.yaml │ ├── 011_back_press.yaml │ ├── 012_input_text.yaml │ ├── 013_launch_app.yaml │ ├── 014_tap_on_point.yaml │ ├── 015_element_relative_position.yaml │ ├── 016_multiline_text.yaml │ ├── 017_swipe.yaml │ ├── 018_contains_child.yaml │ ├── 019_dont_wait_for_visibility.yaml │ ├── 020_parse_config.yaml │ ├── 021_launch_app_with_clear_state.yaml │ ├── 022_launch_app_that_is_not_installed.yaml │ ├── 025_element_relative_position_shortcut.yaml │ ├── 026_assert_not_visible.yaml │ ├── 027_open_link.yaml │ ├── 028_env.yaml │ ├── 029_long_press_on_element.yaml │ ├── 030_long_press_on_point.yaml │ ├── 031_traits.yaml │ ├── 032_element_index.yaml │ ├── 033_int_text.yaml │ ├── 034_press_key.yaml │ ├── 035_refresh_position_ignore_duplicates.yaml │ ├── 036_erase_text.yaml │ ├── 037_unicode_input.yaml │ ├── 038_partial_id.yaml │ ├── 039_hide_keyboard.yaml │ ├── 040_escape_regex.yaml │ ├── 041_take_screenshot.yaml │ ├── 042_extended_wait.yaml │ ├── 043_stop_app.yaml │ ├── 044_clear_state.yaml │ ├── 045_clear_keychain.yaml │ ├── 046_run_flow.yaml │ ├── 047_run_flow_nested.yaml │ ├── 048_tapOn_clickable.yaml │ ├── 049_run_flow_conditionally.yaml │ ├── 051_set_location.yaml │ ├── 052_text_random.yaml │ ├── 053_repeat_times.yaml │ ├── 054_enabled.yaml │ ├── 055_compare_regex.yaml │ ├── 056_ignore_error.yaml │ ├── 057_runFlow_env.yaml │ ├── 057_subflow.yaml │ ├── 057_subflow_override.yaml │ ├── 058_inline_env.yaml │ ├── 058_subflow.yaml │ ├── 059_directional_swipe_command.yaml │ ├── 060_pass_env_to_env.yaml │ ├── 060_subflow.yaml │ ├── 061_launchApp_withoutStopping.yaml │ ├── 062_copy_paste_text.yaml │ ├── 063_js_injection.yaml │ ├── 064_js_files.yaml │ ├── 064_script.js │ ├── 064_script_alt.js │ ├── 064_script_with_args.js │ ├── 064_subflow.yaml │ ├── 065_subflow.yaml │ ├── 065_when_true.yaml │ ├── 066_copyText_jsVar.yaml │ ├── 067_assertTrue_fail.yaml │ ├── 067_assertTrue_pass.yaml │ ├── 068_erase_all_text.yaml │ ├── 069_wait_for_animation_to_end.yaml │ ├── 070_evalScript.yaml │ ├── 071_tapOnRelativePoint.yaml │ ├── 072_searchDepthFirst.yaml │ ├── 073_handle_linebreaks.yaml │ ├── 074_directional_swipe_element.yaml │ ├── 075_repeat_while.yaml │ ├── 076_optional_assertion.yaml │ ├── 077_env_special_characters.yaml │ ├── 078_swipe_relative.yaml │ ├── 079_scroll_until_visible.yaml │ ├── 080_hierarchy_pruning_assert_visible.yaml │ ├── 081_hierarchy_pruning_assert_not_visible.yaml │ ├── 082_repeat_while_true.yaml │ ├── 083_assert_properties.yaml │ ├── 084_open_browser.yaml │ ├── 085_open_link_auto_verify.yaml │ ├── 086_launchApp_sets_all_permissions_to_allow.yaml │ ├── 087_launchApp_with_all_permissions_to_deny.yaml │ ├── 088_launchApp_with_all_permissions_to_deny_and_notification_to_allow.yaml │ ├── 089_launchApp_with_sms_permission_group_to_allow.yaml │ ├── 090_travel.yaml │ ├── 091_assert_visible_by_index.yaml │ ├── 092_log_messages.yaml │ ├── 092_script.js │ ├── 093_js_default_value.yaml │ ├── 094_runFlow_inline.yaml │ ├── 095_launch_arguments.yaml │ ├── 096_platform_condition.yaml │ ├── 097_contains_descendants.yaml │ ├── 098_runScript.js │ ├── 098_runscript_conditionals.yaml │ ├── 098_runscript_conditionals_eager.yaml │ ├── 099_screen_recording.yaml │ ├── 100_tapOn_multiple_times.yaml │ ├── 101_doubleTapOn.yaml │ ├── 102_graaljs.yaml │ ├── 102_graaljs_subflow.yaml │ ├── 103_on_flow_start_complete_hooks.yaml │ ├── 103_setup.js │ ├── 103_teardown.js │ ├── 104_on_flow_start_complete_hooks_flow_failed.yaml │ ├── 105_on_flow_start_complete_when_js_output_set.yaml │ ├── 105_setup.js │ ├── 105_teardown.js │ ├── 106_on_flow_start_complete_when_js_output_set_subflows.yaml │ ├── 106_setup.js │ ├── 106_subflow.yaml │ ├── 106_teardown.js │ ├── 107_define_variables_command_before_hooks.yaml │ ├── 108_failed_start_hook.yaml │ ├── 109_failed_complete_hook.yaml │ ├── 110_add_media_device.yaml │ ├── 111_add_multiple_media.yaml │ ├── 112_scroll_until_visible_center.yaml │ ├── 113_tap_on_element_settle_timeout.yaml │ ├── 114_child_of_selector.yaml │ ├── 115_airplane_mode.yaml │ ├── 116_kill_app.yaml │ ├── 117_scroll_until_visible_speed.js │ ├── 117_scroll_until_visible_speed.yaml │ ├── 118_scroll_until_visible_negative.yaml │ ├── 119_retry_commands.yaml │ ├── 120_tap_on_element_retryTapIfNoChange.yaml │ ├── 122_pause_resume.yaml │ ├── 123_pause_resume_preserves_js_engine.yaml │ ├── 124_cancellation_during_flow_execution.yaml │ ├── 125_assert_by_css.yaml │ ├── 126_set_orientation.yaml │ ├── 126_set_orientation_with_env.yaml │ ├── 127_env_vars_isolation_graaljs.yaml │ ├── 127_env_vars_isolation_rhinojs.yaml │ ├── 127_script.js │ ├── 127_script_mutate_env_var.js │ ├── 128_datafaker_graaljs.yaml │ ├── 129_text_and_id.yaml │ ├── 130_text_and_index.yaml │ ├── 131_setPermissions.yaml │ ├── 132_repeat_while_timeout.yaml │ ├── 133_setClipboard.yaml │ ├── 134_take_screenshot_with_path.yaml │ ├── 135_screen_recording_with_path.yaml │ ├── 136_js_http_multi_part_requests.yaml │ ├── 137_shard_device_env_vars.yaml │ ├── 138_take_cropped_screenshot.yaml │ └── script/ │ └── multipart_request_file_script.js ├── maestro-utils/ │ ├── build.gradle.kts │ ├── gradle.properties │ └── src/ │ ├── main/ │ │ └── kotlin/ │ │ ├── Collections.kt │ │ ├── DepthTracker.kt │ │ ├── HttpClient.kt │ │ ├── Insight.kt │ │ ├── Insights.kt │ │ ├── MaestroTimer.kt │ │ ├── Metrics.kt │ │ ├── SocketUtils.kt │ │ ├── Strings.kt │ │ ├── TempFileHandler.kt │ │ └── network/ │ │ └── Errors.kt │ └── test/ │ └── kotlin/ │ ├── CollectionsTest.kt │ ├── DepthTrackerTest.kt │ ├── InsightTest.kt │ ├── MaestroTimerTest.kt │ ├── SocketUtilsTest.kt │ ├── StringsTest.kt │ └── network/ │ └── ErrorsTest.kt ├── maestro-web/ │ ├── build.gradle.kts │ ├── gradle.properties │ └── src/ │ └── main/ │ └── kotlin/ │ └── maestro/ │ └── web/ │ ├── cdp/ │ │ └── CdpClient.kt │ ├── record/ │ │ ├── JcodecVideoEncoder.kt │ │ ├── VideoEncoder.kt │ │ └── WebScreenRecorder.kt │ └── selenium/ │ ├── ChromeSeleniumFactory.kt │ └── SeleniumFactory.kt ├── scripts/ │ └── install.sh ├── settings.gradle.kts └── tmp.sh