{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "$id": "https://json.schemastore.org/maestro-flow.json",
  "$defs": {
    "selectorObject": {
      "title": "selector object",
      "description": "Element selector map. Combine properties with AND semantics.\nhttps://docs.maestro.dev/reference/selectors.md",
      "type": "object",
      "additionalProperties": true,
      "properties": {
        "text": {
          "title": "text",
          "type": "string",
          "description": "Visible text or accessibility label (regex).\nhttps://docs.maestro.dev/reference/selectors/core-selectors.md"
        },
        "id": {
          "title": "id",
          "type": "string",
          "description": "Accessibility identifier / resource id (regex).\nhttps://docs.maestro.dev/reference/selectors/core-selectors.md"
        },
        "index": {
          "title": "index",
          "description": "0-based index among matches. May be a number or a JavaScript expression string.\nhttps://docs.maestro.dev/reference/selectors/core-selectors.md",
          "oneOf": [
            {
              "type": "integer",
              "minimum": 0
            },
            {
              "type": "string"
            }
          ]
        },
        "point": {
          "title": "point",
          "type": "string",
          "description": "Screen coordinate: relative (\"50%,50%\") or absolute (\"100,200\").\nhttps://docs.maestro.dev/reference/selectors/core-selectors.md"
        },
        "css": {
          "title": "css",
          "type": "string",
          "description": "Web-only CSS selector.\nhttps://docs.maestro.dev/reference/selectors/core-selectors.md"
        },
        "enabled": {
          "title": "enabled",
          "type": "boolean",
          "description": "Match enabled state.\nhttps://docs.maestro.dev/reference/selectors/state-selectors.md"
        },
        "checked": {
          "title": "checked",
          "type": "boolean",
          "description": "Match checked state.\nhttps://docs.maestro.dev/reference/selectors/state-selectors.md"
        },
        "focused": {
          "title": "focused",
          "type": "boolean",
          "description": "Match focused state.\nhttps://docs.maestro.dev/reference/selectors/state-selectors.md"
        },
        "selected": {
          "title": "selected",
          "type": "boolean",
          "description": "Match selected state.\nhttps://docs.maestro.dev/reference/selectors/state-selectors.md"
        },
        "above": {
          "$ref": "#/$defs/selector",
          "title": "above",
          "description": "Element is above this selector.\nhttps://docs.maestro.dev/reference/selectors/relational-selectors.md"
        },
        "below": {
          "$ref": "#/$defs/selector",
          "title": "below",
          "description": "Element is below this selector.\nhttps://docs.maestro.dev/reference/selectors/relational-selectors.md"
        },
        "leftOf": {
          "$ref": "#/$defs/selector",
          "title": "leftOf",
          "description": "Element is left of this selector.\nhttps://docs.maestro.dev/reference/selectors/relational-selectors.md"
        },
        "rightOf": {
          "$ref": "#/$defs/selector",
          "title": "rightOf",
          "description": "Element is right of this selector.\nhttps://docs.maestro.dev/reference/selectors/relational-selectors.md"
        },
        "containsChild": {
          "$ref": "#/$defs/selector",
          "title": "containsChild",
          "description": "Contains this direct child.\nhttps://docs.maestro.dev/reference/selectors/relational-selectors.md"
        },
        "childOf": {
          "$ref": "#/$defs/selector",
          "title": "childOf",
          "description": "Direct child of this parent.\nhttps://docs.maestro.dev/reference/selectors/relational-selectors.md"
        },
        "containsDescendants": {
          "title": "containsDescendants",
          "description": "Contains all listed descendants.\nhttps://docs.maestro.dev/reference/selectors/relational-selectors.md",
          "oneOf": [
            {
              "$ref": "#/$defs/selector"
            },
            {
              "type": "array",
              "items": {
                "$ref": "#/$defs/selector"
              }
            }
          ]
        },
        "traits": {
          "title": "traits",
          "type": "string",
          "description": "Element trait filter.\nhttps://docs.maestro.dev/reference/selectors/element-traits.md",
          "examples": ["text", "long-text", "square"]
        },
        "width": {
          "title": "width",
          "type": "number",
          "description": "Match element width.\nhttps://docs.maestro.dev/reference/selectors/dimension-matchers.md"
        },
        "height": {
          "title": "height",
          "type": "number",
          "description": "Match element height.\nhttps://docs.maestro.dev/reference/selectors/dimension-matchers.md"
        },
        "tolerance": {
          "title": "tolerance",
          "type": "number",
          "description": "Tolerance for width/height matching.\nhttps://docs.maestro.dev/reference/selectors/dimension-matchers.md"
        },
        "optional": {
          "title": "optional",
          "type": "boolean",
          "description": "If true, failure does not fail the flow.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md"
        },
        "label": {
          "title": "label",
          "type": "string",
          "description": "Human-readable step label for reports.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md"
        },
        "repeat": {
          "title": "repeat",
          "type": "integer",
          "minimum": 1,
          "description": "Repeat the tap N times.\nhttps://docs.maestro.dev/reference/commands-available/tapon.md"
        },
        "delay": {
          "title": "delay",
          "type": "integer",
          "minimum": 0,
          "description": "Delay in ms between repeated taps.\nhttps://docs.maestro.dev/reference/commands-available/tapon.md"
        },
        "retryTapIfNoChange": {
          "title": "retryTapIfNoChange",
          "type": "boolean",
          "description": "Retry the tap if the UI does not change.\nhttps://docs.maestro.dev/reference/commands-available/tapon.md"
        }
      }
    },
    "selector": {
      "title": "selector",
      "description": "Element selector: shorthand string (text match) or selector object.\nhttps://docs.maestro.dev/reference/selectors.md",
      "oneOf": [
        {
          "type": "string",
          "minLength": 1,
          "description": "Shorthand text selector"
        },
        {
          "$ref": "#/$defs/selectorObject"
        }
      ]
    },
    "condition": {
      "title": "condition",
      "description": "when condition for conditional commands (AND if multiple keys).\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/conditions.md",
      "type": "object",
      "additionalProperties": true,
      "properties": {
        "visible": {
          "$ref": "#/$defs/selector",
          "title": "visible",
          "description": "Run when this element is visible"
        },
        "notVisible": {
          "$ref": "#/$defs/selector",
          "title": "notVisible",
          "description": "Run when this element is not visible"
        },
        "platform": {
          "title": "platform",
          "type": "string",
          "description": "Run on a specific platform (Android, iOS, or Web).\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/conditions.md",
          "examples": ["Android", "iOS", "Web"]
        },
        "true": {
          "title": "true",
          "type": "string",
          "description": "JavaScript expression that must evaluate to true"
        }
      }
    },
    "commandMeta": {
      "title": "command meta",
      "type": "object",
      "properties": {
        "label": {
          "type": "string",
          "description": "Human-readable step label for reports.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md"
        },
        "optional": {
          "type": "boolean",
          "description": "If true, failure does not fail the flow.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md"
        }
      }
    },
    "stringMap": {
      "title": "string map",
      "type": "object",
      "additionalProperties": {
        "type": "string"
      }
    },
    "permissionValue": {
      "title": "permission value",
      "type": "string",
      "description": "Permission grant state.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/permissions.md",
      "examples": ["allow", "deny", "unset"]
    },
    "permissionsMap": {
      "title": "permissions map",
      "type": "object",
      "additionalProperties": {
        "$ref": "#/$defs/permissionValue"
      },
      "properties": {
        "all": {
          "$ref": "#/$defs/permissionValue"
        }
      }
    },
    "swipeDirection": {
      "title": "swipe direction",
      "type": "string",
      "description": "Swipe/scroll direction.",
      "examples": ["LEFT", "RIGHT", "UP", "DOWN"]
    },
    "commandList": {
      "title": "command list",
      "description": "Ordered list of Maestro commands.",
      "type": "array",
      "items": {
        "$ref": "#/$defs/commandStep"
      }
    },
    "flowConfiguration": {
      "title": "flow configuration",
      "description": "Flow header (YAML document above ---). Also accepts workspace config.yaml keys via additionalProperties.\nhttps://docs.maestro.dev/maestro-flows/readme.md",
      "type": "object",
      "additionalProperties": true,
      "properties": {
        "appId": {
          "title": "appId",
          "type": "string",
          "description": "Android package name or iOS bundle ID under test. Supports ${ENV} interpolation.\nhttps://docs.maestro.dev/maestro-flows/readme.md",
          "examples": ["com.example.app", "${APP_ID}"]
        },
        "url": {
          "title": "url",
          "type": "string",
          "description": "Starting URL for web flows.\nhttps://docs.maestro.dev/get-started/supported-platform/web-browser.md"
        },
        "name": {
          "title": "name",
          "type": "string",
          "description": "Human-readable flow name for reports."
        },
        "tags": {
          "title": "tags",
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Tags for filtering which flows run.\nhttps://docs.maestro.dev/maestro-flows/workspace-management/test-discovery-and-tags.md"
        },
        "env": {
          "title": "env",
          "description": "Default environment variables for this flow.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/parameters-and-constants.md",
          "type": "object",
          "additionalProperties": true
        },
        "jsEngine": {
          "title": "jsEngine",
          "type": "string",
          "description": "JavaScript engine for scripts in this flow.",
          "examples": ["rhino", "graaljs"]
        },
        "onFlowStart": {
          "$ref": "#/$defs/commandList",
          "title": "onFlowStart",
          "description": "Commands run before the flow body.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/hooks.md"
        },
        "onFlowComplete": {
          "$ref": "#/$defs/commandList",
          "title": "onFlowComplete",
          "description": "Commands run after the flow body (success or failure).\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/hooks.md"
        }
      }
    },
    "elementCommandValue": {
      "title": "element command value",
      "description": "Shorthand string or selector/options object.",
      "oneOf": [
        {
          "type": "string",
          "minLength": 1
        },
        {
          "$ref": "#/$defs/selectorObject"
        }
      ]
    },
    "launchAppValue": {
      "title": "launchApp value",
      "description": "Launch app arguments or bare app id.\nhttps://docs.maestro.dev/reference/commands-available/launchapp.md",
      "oneOf": [
        {
          "type": "string",
          "minLength": 1,
          "description": "App id to launch"
        },
        {
          "type": "object",
          "additionalProperties": true,
          "properties": {
            "appId": {
              "type": "string",
              "description": "Package name / bundle ID"
            },
            "clearState": {
              "type": "boolean",
              "description": "Clear app data before launch"
            },
            "clearKeychain": {
              "type": "boolean",
              "description": "Clear entire iOS keychain"
            },
            "stopApp": {
              "type": "boolean",
              "description": "Stop the app before launching (default true)"
            },
            "permissions": {
              "$ref": "#/$defs/permissionsMap"
            },
            "arguments": {
              "type": "object",
              "additionalProperties": true,
              "description": "Launch arguments (string, boolean, number)"
            },
            "label": {
              "type": "string",
              "description": "Human-readable step label for reports.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md"
            },
            "optional": {
              "type": "boolean",
              "description": "If true, failure does not fail the flow.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md"
            }
          }
        }
      ]
    },
    "runFlowValue": {
      "title": "runFlow value",
      "description": "Run a subflow file or inline commands.\nhttps://docs.maestro.dev/reference/commands-available/runflow.md",
      "oneOf": [
        {
          "type": "string",
          "minLength": 1,
          "description": "Path to subflow file"
        },
        {
          "type": "object",
          "additionalProperties": true,
          "properties": {
            "file": {
              "type": "string",
              "description": "Relative path to the flow file"
            },
            "env": {
              "type": "object",
              "additionalProperties": true,
              "description": "Environment variables for the subflow"
            },
            "commands": {
              "$ref": "#/$defs/commandList",
              "description": "Inline commands"
            },
            "when": {
              "$ref": "#/$defs/condition"
            },
            "label": {
              "type": "string",
              "description": "Human-readable step label for reports.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md"
            },
            "optional": {
              "type": "boolean",
              "description": "If true, failure does not fail the flow.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md"
            }
          }
        }
      ]
    },
    "runScriptValue": {
      "title": "runScript value",
      "description": "Run a JavaScript file.\nhttps://docs.maestro.dev/reference/commands-available/runscript.md",
      "oneOf": [
        {
          "type": "string",
          "minLength": 1,
          "description": "Path to JS file"
        },
        {
          "type": "object",
          "additionalProperties": true,
          "properties": {
            "file": {
              "type": "string"
            },
            "env": {
              "type": "object",
              "additionalProperties": true
            },
            "label": {
              "type": "string",
              "description": "Human-readable step label for reports.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md"
            },
            "optional": {
              "type": "boolean",
              "description": "If true, failure does not fail the flow.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md"
            }
          }
        }
      ]
    },
    "inputTextValue": {
      "title": "inputText value",
      "description": "Text to type into the focused field.\nhttps://docs.maestro.dev/reference/commands-available/inputtext.md",
      "oneOf": [
        {
          "type": "string"
        },
        {
          "type": "object",
          "additionalProperties": true,
          "properties": {
            "text": {
              "type": "string",
              "description": "Text to input"
            },
            "label": {
              "type": "string",
              "description": "Human-readable step label for reports.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md"
            },
            "optional": {
              "type": "boolean",
              "description": "If true, failure does not fail the flow.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md"
            }
          }
        }
      ]
    },
    "openLinkValue": {
      "title": "openLink value",
      "description": "Open a URL or deep link.\nhttps://docs.maestro.dev/reference/commands-available/openlink.md",
      "oneOf": [
        {
          "type": "string",
          "minLength": 1
        },
        {
          "type": "object",
          "additionalProperties": true,
          "properties": {
            "link": {
              "type": "string",
              "description": "URL or custom scheme"
            },
            "autoVerify": {
              "type": "boolean",
              "description": "Android: auto-verify app link handling"
            },
            "browser": {
              "type": "boolean",
              "description": "Android: force open in Chrome"
            },
            "label": {
              "type": "string",
              "description": "Human-readable step label for reports.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md"
            },
            "optional": {
              "type": "boolean",
              "description": "If true, failure does not fail the flow.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md"
            }
          }
        }
      ]
    },
    "extendedWaitUntilValue": {
      "title": "extendedWaitUntil value",
      "description": "Wait until visible/notVisible with custom timeout.\nhttps://docs.maestro.dev/reference/commands-available/extendedwaituntil.md",
      "type": "object",
      "additionalProperties": true,
      "properties": {
        "visible": {
          "$ref": "#/$defs/selector"
        },
        "notVisible": {
          "$ref": "#/$defs/selector"
        },
        "timeout": {
          "description": "Timeout in milliseconds",
          "oneOf": [
            {
              "type": "integer",
              "minimum": 1
            },
            {
              "type": "string"
            }
          ]
        },
        "label": {
          "type": "string",
          "description": "Human-readable step label for reports.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md"
        },
        "optional": {
          "type": "boolean",
          "description": "If true, failure does not fail the flow.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md"
        }
      }
    },
    "repeatValue": {
      "title": "repeat value",
      "description": "Repeat commands times or while condition.\nhttps://docs.maestro.dev/reference/commands-available/repeat.md",
      "type": "object",
      "additionalProperties": true,
      "properties": {
        "times": {
          "type": "integer",
          "minimum": 1
        },
        "while": {
          "$ref": "#/$defs/condition"
        },
        "commands": {
          "$ref": "#/$defs/commandList"
        },
        "label": {
          "type": "string",
          "description": "Human-readable step label for reports.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md"
        },
        "optional": {
          "type": "boolean",
          "description": "If true, failure does not fail the flow.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md"
        }
      }
    },
    "retryValue": {
      "title": "retry value",
      "description": "Retry commands or a flow file on failure.\nhttps://docs.maestro.dev/reference/commands-available/retry.md",
      "type": "object",
      "additionalProperties": true,
      "properties": {
        "maxRetries": {
          "type": "integer",
          "minimum": 0,
          "maximum": 3
        },
        "commands": {
          "$ref": "#/$defs/commandList"
        },
        "file": {
          "type": "string"
        },
        "label": {
          "type": "string",
          "description": "Human-readable step label for reports.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md"
        },
        "optional": {
          "type": "boolean",
          "description": "If true, failure does not fail the flow.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md"
        }
      }
    },
    "swipeValue": {
      "title": "swipe value",
      "description": "Swipe by direction, coordinates, or from an element.\nhttps://docs.maestro.dev/reference/commands-available/swipe.md",
      "type": "object",
      "additionalProperties": true,
      "properties": {
        "direction": {
          "$ref": "#/$defs/swipeDirection"
        },
        "start": {
          "type": "string",
          "description": "Start point \"x, y\" or \"x%, y%\""
        },
        "end": {
          "type": "string",
          "description": "End point \"x, y\" or \"x%, y%\""
        },
        "from": {
          "$ref": "#/$defs/selector"
        },
        "duration": {
          "type": "integer",
          "minimum": 0,
          "description": "Duration in ms"
        },
        "label": {
          "type": "string",
          "description": "Human-readable step label for reports.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md"
        },
        "optional": {
          "type": "boolean",
          "description": "If true, failure does not fail the flow.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md"
        }
      }
    },
    "scrollUntilVisibleValue": {
      "title": "scrollUntilVisible value",
      "description": "Scroll until an element is visible.\nhttps://docs.maestro.dev/reference/commands-available/scrolluntilvisible.md",
      "type": "object",
      "additionalProperties": true,
      "properties": {
        "element": {
          "$ref": "#/$defs/selector"
        },
        "direction": {
          "$ref": "#/$defs/swipeDirection"
        },
        "timeout": {
          "oneOf": [
            {
              "type": "integer",
              "minimum": 1
            },
            {
              "type": "string"
            }
          ]
        },
        "speed": {
          "type": "number"
        },
        "visibilityPercentage": {
          "type": "number"
        },
        "centerElement": {
          "type": "boolean"
        },
        "label": {
          "type": "string",
          "description": "Human-readable step label for reports.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md"
        },
        "optional": {
          "type": "boolean",
          "description": "If true, failure does not fail the flow.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md"
        }
      }
    },
    "setLocationValue": {
      "title": "setLocation value",
      "description": "Mock device GPS coordinates.\nhttps://docs.maestro.dev/reference/commands-available/setlocation.md",
      "type": "object",
      "additionalProperties": true,
      "properties": {
        "latitude": {
          "type": "number"
        },
        "longitude": {
          "type": "number"
        },
        "label": {
          "type": "string",
          "description": "Human-readable step label for reports.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md"
        },
        "optional": {
          "type": "boolean",
          "description": "If true, failure does not fail the flow.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md"
        }
      }
    },
    "travelValue": {
      "title": "travel value",
      "description": "Simulate movement along GPS points.\nhttps://docs.maestro.dev/reference/commands-available/travel.md",
      "type": "object",
      "additionalProperties": true,
      "properties": {
        "points": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Coordinate strings \"lat, lon\""
        },
        "speed": {
          "type": "number",
          "description": "Speed in km/h"
        },
        "label": {
          "type": "string",
          "description": "Human-readable step label for reports.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md"
        },
        "optional": {
          "type": "boolean",
          "description": "If true, failure does not fail the flow.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md"
        }
      }
    },
    "assertTrueValue": {
      "title": "assertTrue value",
      "description": "Assert a JavaScript expression is truthy.\nhttps://docs.maestro.dev/reference/commands-available/asserttrue.md",
      "oneOf": [
        {
          "type": "string"
        },
        {
          "type": "object",
          "additionalProperties": true,
          "properties": {
            "condition": {
              "type": "string",
              "description": "Expression to evaluate"
            },
            "label": {
              "type": "string",
              "description": "Human-readable step label for reports.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md"
            },
            "optional": {
              "type": "boolean",
              "description": "If true, failure does not fail the flow.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md"
            }
          }
        }
      ]
    },
    "assertWithAIValue": {
      "title": "assertWithAI value",
      "description": "Natural-language UI assertion via AI.\nhttps://docs.maestro.dev/reference/commands-available/assertwithai.md",
      "type": "object",
      "additionalProperties": true,
      "properties": {
        "assertion": {
          "type": "string"
        },
        "label": {
          "type": "string",
          "description": "Human-readable step label for reports.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md"
        },
        "optional": {
          "type": "boolean",
          "description": "If true, failure does not fail the flow.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md"
        }
      }
    },
    "extractTextWithAIValue": {
      "title": "extractTextWithAI value",
      "description": "Extract text from the screen with AI.\nhttps://docs.maestro.dev/reference/commands-available/extracttextwithai.md",
      "oneOf": [
        {
          "type": "string",
          "description": "Query string"
        },
        {
          "type": "object",
          "additionalProperties": true,
          "properties": {
            "query": {
              "type": "string"
            },
            "outputVariable": {
              "type": "string"
            },
            "label": {
              "type": "string",
              "description": "Human-readable step label for reports.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md"
            },
            "optional": {
              "type": "boolean",
              "description": "If true, failure does not fail the flow.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md"
            }
          }
        }
      ]
    },
    "assertScreenshotValue": {
      "title": "assertScreenshot value",
      "description": "Visual regression against a baseline screenshot.\nhttps://docs.maestro.dev/reference/commands-available/assertscreenshot.md",
      "oneOf": [
        {
          "type": "string",
          "description": "Path to baseline image"
        },
        {
          "type": "object",
          "additionalProperties": true,
          "properties": {
            "path": {
              "type": "string"
            },
            "cropOn": {
              "$ref": "#/$defs/selector"
            },
            "thresholdPercentage": {
              "type": "number"
            },
            "label": {
              "type": "string",
              "description": "Human-readable step label for reports.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md"
            },
            "optional": {
              "type": "boolean",
              "description": "If true, failure does not fail the flow.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md"
            }
          }
        }
      ]
    },
    "takeScreenshotValue": {
      "title": "takeScreenshot value",
      "description": "Capture a screenshot.\nhttps://docs.maestro.dev/reference/commands-available/takescreenshot.md",
      "oneOf": [
        {
          "type": "string",
          "description": "Output path / name"
        },
        {
          "type": "object",
          "additionalProperties": true,
          "properties": {
            "path": {
              "type": "string"
            },
            "cropOn": {
              "$ref": "#/$defs/selector"
            },
            "label": {
              "type": "string",
              "description": "Human-readable step label for reports.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md"
            },
            "optional": {
              "type": "boolean",
              "description": "If true, failure does not fail the flow.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md"
            }
          }
        }
      ]
    },
    "startRecordingValue": {
      "title": "startRecording value",
      "description": "Start screen recording.\nhttps://docs.maestro.dev/reference/commands-available/startrecording.md",
      "oneOf": [
        {
          "type": "string",
          "description": "Recording path / name"
        },
        {
          "type": "object",
          "additionalProperties": true,
          "properties": {
            "path": {
              "type": "string"
            },
            "label": {
              "type": "string",
              "description": "Human-readable step label for reports.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md"
            },
            "optional": {
              "type": "boolean",
              "description": "If true, failure does not fail the flow.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md"
            }
          }
        }
      ]
    },
    "eraseTextValue": {
      "title": "eraseText value",
      "description": "Erase characters from the focused field.\nhttps://docs.maestro.dev/reference/commands-available/erasetext.md",
      "oneOf": [
        {
          "type": "integer",
          "minimum": 1,
          "maximum": 100
        },
        {
          "type": "object",
          "additionalProperties": true,
          "properties": {
            "charactersToErase": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100
            },
            "label": {
              "type": "string",
              "description": "Human-readable step label for reports.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md"
            },
            "optional": {
              "type": "boolean",
              "description": "If true, failure does not fail the flow.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md"
            }
          }
        }
      ]
    },
    "setPermissionsValue": {
      "title": "setPermissions value",
      "description": "Grant or deny permissions mid-flow.\nhttps://docs.maestro.dev/reference/commands-available/setpermissions.md",
      "type": "object",
      "additionalProperties": true,
      "properties": {
        "permissions": {
          "$ref": "#/$defs/permissionsMap"
        },
        "appId": {
          "type": "string"
        },
        "label": {
          "type": "string",
          "description": "Human-readable step label for reports.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md"
        },
        "optional": {
          "type": "boolean",
          "description": "If true, failure does not fail the flow.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md"
        }
      }
    },
    "waitForAnimationToEndValue": {
      "title": "waitForAnimationToEnd value",
      "description": "Wait for UI animations to finish.\nhttps://docs.maestro.dev/reference/commands-available/waitforanimationtoend.md",
      "type": "object",
      "additionalProperties": true,
      "properties": {
        "timeout": {
          "oneOf": [
            {
              "type": "integer",
              "minimum": 1
            },
            {
              "type": "string"
            }
          ]
        },
        "label": {
          "type": "string",
          "description": "Human-readable step label for reports.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md"
        },
        "optional": {
          "type": "boolean",
          "description": "If true, failure does not fail the flow.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md"
        }
      }
    },
    "addMediaValue": {
      "title": "addMedia value",
      "description": "Add media files to the device gallery.\nhttps://docs.maestro.dev/reference/commands-available/addmedia.md",
      "type": "array",
      "items": {
        "type": "string"
      },
      "minItems": 1
    },
    "stopAppValue": {
      "title": "stopApp value",
      "description": "Stop an app without clearing data.\nhttps://docs.maestro.dev/reference/commands-available/stopapp.md",
      "oneOf": [
        {
          "type": "string",
          "description": "App id"
        },
        {
          "type": "object",
          "additionalProperties": true,
          "properties": {
            "appId": {
              "type": "string"
            },
            "label": {
              "type": "string",
              "description": "Human-readable step label for reports.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md"
            },
            "optional": {
              "type": "boolean",
              "description": "If true, failure does not fail the flow.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md"
            }
          }
        }
      ]
    },
    "killAppValue": {
      "title": "killApp value",
      "description": "Force-stop an app.\nhttps://docs.maestro.dev/reference/commands-available/killapp.md",
      "oneOf": [
        {
          "type": "string",
          "description": "App id"
        },
        {
          "type": "object",
          "additionalProperties": true,
          "properties": {
            "appId": {
              "type": "string"
            },
            "label": {
              "type": "string",
              "description": "Human-readable step label for reports.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md"
            },
            "optional": {
              "type": "boolean",
              "description": "If true, failure does not fail the flow.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md"
            }
          }
        }
      ]
    },
    "clearStateValue": {
      "title": "clearState value",
      "description": "Clear app data / cache.\nhttps://docs.maestro.dev/reference/commands-available/clearstate.md",
      "oneOf": [
        {
          "type": "string",
          "description": "App id"
        },
        {
          "type": "object",
          "additionalProperties": true,
          "properties": {
            "appId": {
              "type": "string"
            },
            "label": {
              "type": "string",
              "description": "Human-readable step label for reports.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md"
            },
            "optional": {
              "type": "boolean",
              "description": "If true, failure does not fail the flow.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md"
            }
          }
        }
      ]
    },
    "pressKeyValue": {
      "title": "pressKey value",
      "description": "Hardware / soft key name.\nhttps://docs.maestro.dev/reference/commands-available/presskey.md",
      "type": "string",
      "minLength": 1,
      "examples": [
        "home",
        "lock",
        "enter",
        "backspace",
        "volume up",
        "volume down",
        "back",
        "power",
        "tab"
      ]
    },
    "setAirplaneModeValue": {
      "title": "setAirplaneMode value",
      "type": "string",
      "description": "Enable or disable airplane mode (Android).\nhttps://docs.maestro.dev/reference/commands-available/setairplanemode.md",
      "examples": ["enabled", "disabled"]
    },
    "setOrientationValue": {
      "title": "setOrientation value",
      "description": "Device orientation.\nhttps://docs.maestro.dev/reference/commands-available/setorientation.md",
      "type": "string",
      "examples": [
        "PORTRAIT",
        "LANDSCAPE_LEFT",
        "LANDSCAPE_RIGHT",
        "UPSIDE_DOWN"
      ]
    },
    "setClipboardValue": {
      "title": "setClipboard value",
      "description": "Set clipboard text.\nhttps://docs.maestro.dev/reference/commands-available/setclipboard.md",
      "type": "string"
    },
    "evalScriptValue": {
      "title": "evalScript value",
      "description": "Inline JavaScript expression.\nhttps://docs.maestro.dev/reference/commands-available/evalscript.md",
      "type": "string"
    },
    "randomInputValue": {
      "title": "random input value",
      "description": "Random input options (length for text/number).\nhttps://docs.maestro.dev/reference/commands-available/inputtext.md",
      "type": "object",
      "additionalProperties": true,
      "properties": {
        "length": {
          "type": "integer",
          "minimum": 1
        },
        "label": {
          "type": "string",
          "description": "Human-readable step label for reports.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md"
        },
        "optional": {
          "type": "boolean",
          "description": "If true, failure does not fail the flow.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md"
        }
      }
    },
    "commandObject": {
      "title": "command object",
      "description": "Single Maestro command as a one-key mapping (e.g. tapOn: Login, launchApp: { clearState: true }). Unknown future commands are allowed via additionalProperties.",
      "type": "object",
      "minProperties": 1,
      "maxProperties": 1,
      "additionalProperties": true,
      "properties": {
        "addMedia": {
          "$ref": "#/$defs/addMediaValue",
          "description": "Add media to the gallery.\nhttps://docs.maestro.dev/reference/commands-available/addmedia.md"
        },
        "assertNoDefectsWithAI": {
          "description": "AI visual defect check.\nhttps://docs.maestro.dev/reference/commands-available/assertnodefectswithai.md",
          "oneOf": [
            {
              "type": "null"
            },
            {
              "type": "object",
              "additionalProperties": true,
              "properties": {
                "label": {
                  "type": "string",
                  "description": "Human-readable step label for reports.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md"
                },
                "optional": {
                  "type": "boolean",
                  "description": "If true, failure does not fail the flow.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md"
                }
              }
            }
          ]
        },
        "assertNotVisible": {
          "$ref": "#/$defs/elementCommandValue",
          "description": "Assert element is not visible.\nhttps://docs.maestro.dev/reference/commands-available/assertnotvisible.md"
        },
        "assertScreenshot": {
          "$ref": "#/$defs/assertScreenshotValue",
          "description": "Visual regression assertion.\nhttps://docs.maestro.dev/reference/commands-available/assertscreenshot.md"
        },
        "assertTrue": {
          "$ref": "#/$defs/assertTrueValue",
          "description": "Assert JS expression is true.\nhttps://docs.maestro.dev/reference/commands-available/asserttrue.md"
        },
        "assertVisible": {
          "$ref": "#/$defs/elementCommandValue",
          "description": "Assert element is visible.\nhttps://docs.maestro.dev/reference/commands-available/assertvisible.md"
        },
        "assertWithAI": {
          "$ref": "#/$defs/assertWithAIValue",
          "description": "Natural-language AI assertion.\nhttps://docs.maestro.dev/reference/commands-available/assertwithai.md"
        },
        "back": {
          "description": "Press system back.\nhttps://docs.maestro.dev/reference/commands-available/back.md",
          "oneOf": [
            {
              "type": "null"
            },
            {
              "type": "object",
              "additionalProperties": true,
              "properties": {
                "label": {
                  "type": "string",
                  "description": "Human-readable step label for reports.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md"
                },
                "optional": {
                  "type": "boolean",
                  "description": "If true, failure does not fail the flow.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md"
                }
              }
            }
          ]
        },
        "clearKeychain": {
          "description": "Clear iOS keychain.\nhttps://docs.maestro.dev/reference/commands-available/clearkeychain.md",
          "oneOf": [
            {
              "type": "null"
            },
            {
              "type": "object",
              "additionalProperties": true,
              "properties": {
                "label": {
                  "type": "string",
                  "description": "Human-readable step label for reports.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md"
                },
                "optional": {
                  "type": "boolean",
                  "description": "If true, failure does not fail the flow.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md"
                }
              }
            }
          ]
        },
        "clearState": {
          "$ref": "#/$defs/clearStateValue",
          "description": "Clear app state.\nhttps://docs.maestro.dev/reference/commands-available/clearstate.md"
        },
        "copyTextFrom": {
          "$ref": "#/$defs/elementCommandValue",
          "description": "Copy text from an element.\nhttps://docs.maestro.dev/reference/commands-available/copytextfrom.md"
        },
        "doubleTapOn": {
          "$ref": "#/$defs/elementCommandValue",
          "description": "Double-tap an element.\nhttps://docs.maestro.dev/reference/commands-available/doubletapon.md"
        },
        "eraseText": {
          "$ref": "#/$defs/eraseTextValue",
          "description": "Erase focused text.\nhttps://docs.maestro.dev/reference/commands-available/erasetext.md"
        },
        "evalScript": {
          "$ref": "#/$defs/evalScriptValue",
          "description": "Evaluate inline JavaScript.\nhttps://docs.maestro.dev/reference/commands-available/evalscript.md"
        },
        "extendedWaitUntil": {
          "$ref": "#/$defs/extendedWaitUntilValue",
          "description": "Wait with custom timeout.\nhttps://docs.maestro.dev/reference/commands-available/extendedwaituntil.md"
        },
        "extractTextWithAI": {
          "$ref": "#/$defs/extractTextWithAIValue",
          "description": "Extract text with AI.\nhttps://docs.maestro.dev/reference/commands-available/extracttextwithai.md"
        },
        "hideKeyboard": {
          "description": "Dismiss the soft keyboard.\nhttps://docs.maestro.dev/reference/commands-available/hidekeyboard.md",
          "oneOf": [
            {
              "type": "null"
            },
            {
              "type": "object",
              "additionalProperties": true,
              "properties": {
                "label": {
                  "type": "string",
                  "description": "Human-readable step label for reports.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md"
                },
                "optional": {
                  "type": "boolean",
                  "description": "If true, failure does not fail the flow.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md"
                }
              }
            }
          ]
        },
        "inputText": {
          "$ref": "#/$defs/inputTextValue",
          "description": "Type text into the focused field.\nhttps://docs.maestro.dev/reference/commands-available/inputtext.md"
        },
        "inputRandomText": {
          "description": "Type random text.\nhttps://docs.maestro.dev/reference/commands-available/inputtext.md",
          "oneOf": [
            {
              "type": "null"
            },
            {
              "$ref": "#/$defs/randomInputValue"
            }
          ]
        },
        "inputRandomNumber": {
          "description": "Type a random number.\nhttps://docs.maestro.dev/reference/commands-available/inputtext.md",
          "oneOf": [
            {
              "type": "null"
            },
            {
              "$ref": "#/$defs/randomInputValue"
            }
          ]
        },
        "inputRandomEmail": {
          "description": "Type a random email.\nhttps://docs.maestro.dev/reference/commands-available/inputtext.md",
          "oneOf": [
            {
              "type": "null"
            },
            {
              "$ref": "#/$defs/randomInputValue"
            }
          ]
        },
        "inputRandomPersonName": {
          "description": "Type a random person name.\nhttps://docs.maestro.dev/reference/commands-available/inputtext.md",
          "oneOf": [
            {
              "type": "null"
            },
            {
              "$ref": "#/$defs/randomInputValue"
            }
          ]
        },
        "inputRandomCityName": {
          "description": "Type a random city name.\nhttps://docs.maestro.dev/reference/commands-available/inputtext.md",
          "oneOf": [
            {
              "type": "null"
            },
            {
              "$ref": "#/$defs/randomInputValue"
            }
          ]
        },
        "inputRandomCountryName": {
          "description": "Type a random country name.\nhttps://docs.maestro.dev/reference/commands-available/inputtext.md",
          "oneOf": [
            {
              "type": "null"
            },
            {
              "$ref": "#/$defs/randomInputValue"
            }
          ]
        },
        "inputRandomColorName": {
          "description": "Type a random color name.\nhttps://docs.maestro.dev/reference/commands-available/inputtext.md",
          "oneOf": [
            {
              "type": "null"
            },
            {
              "$ref": "#/$defs/randomInputValue"
            }
          ]
        },
        "killApp": {
          "$ref": "#/$defs/killAppValue",
          "description": "Force-stop an app.\nhttps://docs.maestro.dev/reference/commands-available/killapp.md"
        },
        "launchApp": {
          "$ref": "#/$defs/launchAppValue",
          "description": "Launch an app.\nhttps://docs.maestro.dev/reference/commands-available/launchapp.md"
        },
        "longPressOn": {
          "$ref": "#/$defs/elementCommandValue",
          "description": "Long-press an element.\nhttps://docs.maestro.dev/reference/commands-available/longpresson.md"
        },
        "openLink": {
          "$ref": "#/$defs/openLinkValue",
          "description": "Open a URL or deep link.\nhttps://docs.maestro.dev/reference/commands-available/openlink.md"
        },
        "pasteText": {
          "description": "Paste clipboard into the focused field.\nhttps://docs.maestro.dev/reference/commands-available/pastetext.md",
          "oneOf": [
            {
              "type": "null"
            },
            {
              "type": "object",
              "additionalProperties": true,
              "properties": {
                "label": {
                  "type": "string",
                  "description": "Human-readable step label for reports.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md"
                },
                "optional": {
                  "type": "boolean",
                  "description": "If true, failure does not fail the flow.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md"
                }
              }
            }
          ]
        },
        "pressKey": {
          "$ref": "#/$defs/pressKeyValue",
          "description": "Press a hardware/soft key.\nhttps://docs.maestro.dev/reference/commands-available/presskey.md"
        },
        "repeat": {
          "$ref": "#/$defs/repeatValue",
          "description": "Repeat commands.\nhttps://docs.maestro.dev/reference/commands-available/repeat.md"
        },
        "retry": {
          "$ref": "#/$defs/retryValue",
          "description": "Retry commands on failure.\nhttps://docs.maestro.dev/reference/commands-available/retry.md"
        },
        "runFlow": {
          "$ref": "#/$defs/runFlowValue",
          "description": "Run a nested flow.\nhttps://docs.maestro.dev/reference/commands-available/runflow.md"
        },
        "runScript": {
          "$ref": "#/$defs/runScriptValue",
          "description": "Run a JavaScript file.\nhttps://docs.maestro.dev/reference/commands-available/runscript.md"
        },
        "scroll": {
          "description": "Simple vertical scroll.\nhttps://docs.maestro.dev/reference/commands-available/scroll.md",
          "oneOf": [
            {
              "type": "null"
            },
            {
              "type": "object",
              "additionalProperties": true,
              "properties": {
                "label": {
                  "type": "string",
                  "description": "Human-readable step label for reports.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md"
                },
                "optional": {
                  "type": "boolean",
                  "description": "If true, failure does not fail the flow.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md"
                }
              }
            }
          ]
        },
        "scrollUntilVisible": {
          "$ref": "#/$defs/scrollUntilVisibleValue",
          "description": "Scroll until element is visible.\nhttps://docs.maestro.dev/reference/commands-available/scrolluntilvisible.md"
        },
        "setAirplaneMode": {
          "$ref": "#/$defs/setAirplaneModeValue",
          "description": "Set airplane mode.\nhttps://docs.maestro.dev/reference/commands-available/setairplanemode.md"
        },
        "setClipboard": {
          "$ref": "#/$defs/setClipboardValue",
          "description": "Set clipboard contents.\nhttps://docs.maestro.dev/reference/commands-available/setclipboard.md"
        },
        "setLocation": {
          "$ref": "#/$defs/setLocationValue",
          "description": "Set GPS location.\nhttps://docs.maestro.dev/reference/commands-available/setlocation.md"
        },
        "setOrientation": {
          "$ref": "#/$defs/setOrientationValue",
          "description": "Set device orientation.\nhttps://docs.maestro.dev/reference/commands-available/setorientation.md"
        },
        "setPermissions": {
          "$ref": "#/$defs/setPermissionsValue",
          "description": "Set app permissions.\nhttps://docs.maestro.dev/reference/commands-available/setpermissions.md"
        },
        "startRecording": {
          "$ref": "#/$defs/startRecordingValue",
          "description": "Start screen recording.\nhttps://docs.maestro.dev/reference/commands-available/startrecording.md"
        },
        "stopApp": {
          "$ref": "#/$defs/stopAppValue",
          "description": "Stop an app.\nhttps://docs.maestro.dev/reference/commands-available/stopapp.md"
        },
        "stopRecording": {
          "description": "Stop screen recording.\nhttps://docs.maestro.dev/reference/commands-available/stoprecording.md",
          "oneOf": [
            {
              "type": "null"
            },
            {
              "type": "object",
              "additionalProperties": true,
              "properties": {
                "label": {
                  "type": "string",
                  "description": "Human-readable step label for reports.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md"
                },
                "optional": {
                  "type": "boolean",
                  "description": "If true, failure does not fail the flow.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md"
                }
              }
            }
          ]
        },
        "swipe": {
          "$ref": "#/$defs/swipeValue",
          "description": "Swipe gesture.\nhttps://docs.maestro.dev/reference/commands-available/swipe.md"
        },
        "takeScreenshot": {
          "$ref": "#/$defs/takeScreenshotValue",
          "description": "Capture a screenshot.\nhttps://docs.maestro.dev/reference/commands-available/takescreenshot.md"
        },
        "tapOn": {
          "$ref": "#/$defs/elementCommandValue",
          "description": "Tap an element or coordinate.\nhttps://docs.maestro.dev/reference/commands-available/tapon.md"
        },
        "toggleAirplaneMode": {
          "description": "Toggle airplane mode.\nhttps://docs.maestro.dev/reference/commands-available/toggleairplanemode.md",
          "oneOf": [
            {
              "type": "null"
            },
            {
              "type": "object",
              "additionalProperties": true,
              "properties": {
                "label": {
                  "type": "string",
                  "description": "Human-readable step label for reports.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md"
                },
                "optional": {
                  "type": "boolean",
                  "description": "If true, failure does not fail the flow.\nhttps://docs.maestro.dev/maestro-flows/flow-control-and-logic/labeling-and-error-handling.md"
                }
              }
            }
          ]
        },
        "travel": {
          "$ref": "#/$defs/travelValue",
          "description": "Travel along GPS points.\nhttps://docs.maestro.dev/reference/commands-available/travel.md"
        },
        "waitForAnimationToEnd": {
          "description": "Wait for animations to end.\nhttps://docs.maestro.dev/reference/commands-available/waitforanimationtoend.md",
          "oneOf": [
            {
              "type": "null"
            },
            {
              "$ref": "#/$defs/waitForAnimationToEndValue"
            }
          ]
        }
      }
    },
    "bareCommand": {
      "title": "bare command",
      "description": "Commands that may be written as a bare YAML scalar with no arguments (e.g. launchApp, hideKeyboard, scroll).",
      "type": "string",
      "minLength": 1,
      "examples": [
        "launchApp",
        "hideKeyboard",
        "scroll",
        "back",
        "pasteText",
        "stopRecording",
        "waitForAnimationToEnd",
        "toggleAirplaneMode",
        "clearKeychain",
        "clearState",
        "stopApp",
        "killApp",
        "inputRandomText",
        "inputRandomNumber",
        "inputRandomEmail",
        "inputRandomPersonName",
        "assertNoDefectsWithAI"
      ]
    },
    "commandStep": {
      "title": "command step",
      "description": "One flow step: bare command name or single-key command object.",
      "oneOf": [
        {
          "$ref": "#/$defs/bareCommand"
        },
        {
          "$ref": "#/$defs/commandObject"
        }
      ]
    }
  },
  "title": "Maestro Flow",
  "description": "YAML flow file for Maestro (mobile and web UI automation). A file is usually two YAML documents separated by ---: (1) flow configuration, (2) ordered command list.\nhttps://docs.maestro.dev/maestro-flows/readme.md",
  "oneOf": [
    {
      "$ref": "#/$defs/flowConfiguration"
    },
    {
      "$ref": "#/$defs/commandList"
    }
  ]
}
