{
  "openapi": "3.2.0",
  "info": {
    "title": "instamix",
    "version": "0.1.0",
    "description": "Commands of an instamix script (`python site.py --jsonl COMMAND`, or `imix site.py --jsonl COMMAND`) and the declarations a script is made of. Each operation's `x-cli` says how its request becomes argv; a flag's `negate` is how to ask for false over a default from the config files."
  },
  "paths": {
    "/cat": {
      "post": {
        "operationId": "cat",
        "summary": "Print the contents of PATHS (default: every file).",
        "description": "Print the contents of PATHS (default: every file).",
        "x-cli": {
          "program": "script",
          "command": "cat"
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "paths": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "x-cli": {
                      "argument": 0
                    }
                  },
                  "bare": {
                    "type": "boolean",
                    "description": "Do not add a default inventory and ansible.cfg.",
                    "x-cli": {
                      "flag": "--bare",
                      "negate": "--no-bare"
                    }
                  },
                  "profile": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "description": "Activate a profile (repeatable, comma-separated; '*' for all). Read before the script runs, so it also steers what it declares.",
                    "x-cli": {
                      "flag": "--profile"
                    }
                  }
                },
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The command's events, one JSON object per line. The process exit code is the command's status.",
            "content": {
              "application/jsonl": {
                "itemSchema": {
                  "$ref": "#/components/schemas/Event"
                }
              }
            }
          }
        }
      }
    },
    "/container": {
      "post": {
        "operationId": "container",
        "summary": "Run PLAYBOOK (default: site.yml) with ansible-playbook in a container.",
        "description": "Run PLAYBOOK (default: site.yml) with ansible-playbook in a container.\n\nThe tree is built here and mounted into the image, which only has to\nhave ansible: an execution environment will do. The image is --image,\nelse the script's container_image(), else its base's.",
        "x-cli": {
          "program": "script",
          "command": "container"
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "playbook": {
                    "type": "string",
                    "x-cli": {
                      "argument": 0
                    }
                  },
                  "image": {
                    "type": "string",
                    "description": "The image to run ansible in (default: the script's; see `image`).",
                    "x-cli": {
                      "flag": "--image"
                    }
                  },
                  "engine": {
                    "type": "string",
                    "enum": [
                      "podman",
                      "docker"
                    ],
                    "description": "What runs the container (default: podman, else docker).",
                    "x-cli": {
                      "flag": "--engine"
                    }
                  },
                  "pull": {
                    "type": "string",
                    "enum": [
                      "missing",
                      "always",
                      "never",
                      "newer"
                    ],
                    "description": "When to pull the image.",
                    "default": "missing",
                    "x-cli": {
                      "flag": "--pull"
                    }
                  },
                  "dir": {
                    "type": "string",
                    "description": "Build in this directory instead of a temporary one.",
                    "x-cli": {
                      "flag": "--dir"
                    }
                  },
                  "keep": {
                    "type": "boolean",
                    "description": "Keep the temporary build directory.",
                    "x-cli": {
                      "flag": "--keep",
                      "negate": "--no-keep"
                    }
                  },
                  "install": {
                    "type": "boolean",
                    "description": "Install galaxy requirements into the tree first.",
                    "x-cli": {
                      "flag": "--install",
                      "negate": "--no-install"
                    }
                  },
                  "check": {
                    "type": "boolean",
                    "description": "ansible-playbook --check.",
                    "x-cli": {
                      "flag": "--check",
                      "negate": "--no-check"
                    }
                  },
                  "diff": {
                    "type": "boolean",
                    "description": "ansible-playbook --diff.",
                    "x-cli": {
                      "flag": "--diff",
                      "negate": "--no-diff"
                    }
                  },
                  "limit": {
                    "type": "string",
                    "description": "Limit to a host subset.",
                    "x-cli": {
                      "flag": "--limit"
                    }
                  },
                  "tags": {
                    "type": "string",
                    "description": "Only run these tags.",
                    "x-cli": {
                      "flag": "--tags"
                    }
                  },
                  "skip_tags": {
                    "type": "string",
                    "description": "Skip these tags.",
                    "x-cli": {
                      "flag": "--skip-tags"
                    }
                  },
                  "become": {
                    "type": "boolean",
                    "description": "Run operations with become.",
                    "x-cli": {
                      "flag": "--become",
                      "negate": "--no-become"
                    }
                  },
                  "user": {
                    "type": "string",
                    "description": "Connect as this user.",
                    "x-cli": {
                      "flag": "--user"
                    }
                  },
                  "connection": {
                    "type": "string",
                    "description": "Connection type.",
                    "x-cli": {
                      "flag": "--connection"
                    }
                  },
                  "extra_vars": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "description": "Extra variables (repeatable).",
                    "x-cli": {
                      "flag": "--extra-vars"
                    }
                  },
                  "inventory": {
                    "type": "string",
                    "description": "Override the inventory.",
                    "x-cli": {
                      "flag": "--inventory"
                    }
                  },
                  "start_at_task": {
                    "type": "string",
                    "description": "Start at this task.",
                    "x-cli": {
                      "flag": "--start-at-task"
                    }
                  },
                  "step": {
                    "type": "boolean",
                    "description": "Confirm each task.",
                    "x-cli": {
                      "flag": "--step"
                    }
                  },
                  "list_tasks": {
                    "type": "boolean",
                    "description": "List the tasks and exit.",
                    "x-cli": {
                      "flag": "--list-tasks"
                    }
                  },
                  "list_hosts": {
                    "type": "boolean",
                    "description": "List matching hosts and exit.",
                    "x-cli": {
                      "flag": "--list-hosts"
                    }
                  },
                  "syntax_check": {
                    "type": "boolean",
                    "description": "Only check the syntax.",
                    "x-cli": {
                      "flag": "--syntax-check"
                    }
                  },
                  "vault_password_file": {
                    "type": "string",
                    "description": "Vault password file.",
                    "x-cli": {
                      "flag": "--vault-password-file"
                    }
                  },
                  "verbose": {
                    "type": "integer",
                    "minimum": 0,
                    "description": "Pass -v to ansible (repeatable).",
                    "x-cli": {
                      "flag": "--verbose",
                      "repeat": true
                    }
                  },
                  "record": {
                    "type": "string",
                    "description": "Also write the run's events to FILE (JSONL), for `imix replay`; ansible's output stays as it is.",
                    "x-cli": {
                      "flag": "--record"
                    }
                  },
                  "bare": {
                    "type": "boolean",
                    "description": "Do not add a default inventory and ansible.cfg.",
                    "x-cli": {
                      "flag": "--bare",
                      "negate": "--no-bare"
                    }
                  },
                  "profile": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "description": "Activate a profile (repeatable, comma-separated; '*' for all). Read before the script runs, so it also steers what it declares.",
                    "x-cli": {
                      "flag": "--profile"
                    }
                  },
                  "outside_paths": {
                    "type": "boolean",
                    "description": "Let the environment's (--env) or the image's (container) collections and roles count: the tree's ansible.cfg names them after its own, and --install does not install them again. Off, only the tree's count.",
                    "x-cli": {
                      "flag": "--outside-paths",
                      "negate": "--no-outside-paths"
                    }
                  }
                },
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The command's events, one JSON object per line. The process exit code is the command's status.",
            "content": {
              "application/jsonl": {
                "itemSchema": {
                  "$ref": "#/components/schemas/Event"
                }
              }
            }
          }
        }
      }
    },
    "/describe": {
      "post": {
        "operationId": "describe",
        "summary": "Say what this script has, and what each is for: its stages, tags,",
        "description": "Say what this script has, and what each is for: its stages, tags,\ngroups and variables.",
        "x-cli": {
          "program": "script",
          "command": "describe"
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "json": {
                    "type": "boolean",
                    "description": "Write it as one JSON object, on one line.",
                    "x-cli": {
                      "flag": "--json"
                    }
                  },
                  "profile": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "description": "Activate a profile (repeatable, comma-separated; '*' for all). Read before the script runs, so it also steers what it declares.",
                    "x-cli": {
                      "flag": "--profile"
                    }
                  }
                },
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The command's events, one JSON object per line. The process exit code is the command's status.",
            "content": {
              "application/jsonl": {
                "itemSchema": {
                  "$ref": "#/components/schemas/Event"
                }
              }
            }
          }
        }
      }
    },
    "/diff": {
      "post": {
        "operationId": "diff",
        "summary": "Show what `generate DEST` would change on disk.",
        "description": "Show what `generate DEST` would change on disk.",
        "x-cli": {
          "program": "script",
          "command": "diff"
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "dest": {
                    "type": "string",
                    "default": "out",
                    "x-cli": {
                      "argument": 0
                    }
                  },
                  "bare": {
                    "type": "boolean",
                    "description": "Do not add a default inventory and ansible.cfg.",
                    "x-cli": {
                      "flag": "--bare",
                      "negate": "--no-bare"
                    }
                  },
                  "profile": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "description": "Activate a profile (repeatable, comma-separated; '*' for all). Read before the script runs, so it also steers what it declares.",
                    "x-cli": {
                      "flag": "--profile"
                    }
                  }
                },
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The command's events, one JSON object per line. The process exit code is the command's status.",
            "content": {
              "application/jsonl": {
                "itemSchema": {
                  "$ref": "#/components/schemas/Event"
                }
              }
            }
          }
        }
      }
    },
    "/doctor": {
      "post": {
        "operationId": "doctor",
        "summary": "Check this machine against the script's runtime requirements.",
        "description": "Check this machine against the script's runtime requirements.",
        "x-cli": {
          "program": "script",
          "command": "doctor"
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "env": {
                    "type": "boolean",
                    "description": "Run ansible from an environment built (or reused) with uv from the script's requirements; see `env`.",
                    "x-cli": {
                      "flag": "--env",
                      "negate": "--no-env"
                    }
                  },
                  "profile": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "description": "Activate a profile (repeatable, comma-separated; '*' for all). Read before the script runs, so it also steers what it declares.",
                    "x-cli": {
                      "flag": "--profile"
                    }
                  }
                },
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The command's events, one JSON object per line. The process exit code is the command's status.",
            "content": {
              "application/jsonl": {
                "itemSchema": {
                  "$ref": "#/components/schemas/Event"
                }
              }
            }
          }
        }
      }
    },
    "/env": {
      "post": {
        "operationId": "env",
        "summary": "Build the environment the script's requirements describe, with uv.",
        "description": "Build the environment the script's requirements describe, with uv.\n\nIt holds ansible-core and the pip requirements, on the Python that\nrequires_python() asks for, installed from a hash-checked lock, and the\ncollections and roles requires_collection() and requires_role() ask for,\ninstalled with its own ansible-galaxy. Prints its directory; `run --env`\n(and install, lint, test, doctor) use it, and so does `imix lsp`.",
        "x-cli": {
          "program": "script",
          "command": "env"
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "dir": {
                    "type": "string",
                    "description": "Build here instead of the cache (~/.cache/instamix/envs).",
                    "x-cli": {
                      "flag": "--dir"
                    }
                  },
                  "upgrade": {
                    "type": "boolean",
                    "description": "Resolve the requirements again instead of reusing the lock.",
                    "x-cli": {
                      "flag": "--upgrade",
                      "negate": "--no-upgrade"
                    }
                  },
                  "profile": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "description": "Activate a profile (repeatable, comma-separated; '*' for all). Read before the script runs, so it also steers what it declares.",
                    "x-cli": {
                      "flag": "--profile"
                    }
                  }
                },
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The command's events, one JSON object per line. The process exit code is the command's status.",
            "content": {
              "application/jsonl": {
                "itemSchema": {
                  "$ref": "#/components/schemas/Event"
                }
              }
            }
          }
        }
      }
    },
    "/generate": {
      "post": {
        "operationId": "generate",
        "summary": "Write the playbook directory to DEST (default: out).",
        "description": "Write the playbook directory to DEST (default: out).\n\nA DEST ending in .tar, .tar.gz/.tgz, .tar.bz2/.tbz2 or .tar.xz/.txz is\nwritten as a tar archive instead, and - writes one to stdout.",
        "x-cli": {
          "program": "script",
          "command": "generate"
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "dest": {
                    "type": "string",
                    "default": "out",
                    "x-cli": {
                      "argument": 0
                    }
                  },
                  "force": {
                    "type": "boolean",
                    "description": "Write into a non-empty directory instamix did not create.",
                    "x-cli": {
                      "flag": "--force",
                      "negate": "--no-force"
                    }
                  },
                  "compress": {
                    "type": "string",
                    "enum": [
                      "bz2",
                      "gz",
                      "none",
                      "xz"
                    ],
                    "description": "Write a tar archive with this compression, whatever DEST is called (default: from the name; gz for -).",
                    "x-cli": {
                      "flag": "--compress"
                    }
                  },
                  "env": {
                    "type": "boolean",
                    "description": "Run ansible from an environment built (or reused) with uv from the script's requirements; see `env`.",
                    "x-cli": {
                      "flag": "--env",
                      "negate": "--no-env"
                    }
                  },
                  "bare": {
                    "type": "boolean",
                    "description": "Do not add a default inventory and ansible.cfg.",
                    "x-cli": {
                      "flag": "--bare",
                      "negate": "--no-bare"
                    }
                  },
                  "profile": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "description": "Activate a profile (repeatable, comma-separated; '*' for all). Read before the script runs, so it also steers what it declares.",
                    "x-cli": {
                      "flag": "--profile"
                    }
                  },
                  "outside_paths": {
                    "type": "boolean",
                    "description": "Let the environment's (--env) or the image's (container) collections and roles count: the tree's ansible.cfg names them after its own, and --install does not install them again. Off, only the tree's count.",
                    "x-cli": {
                      "flag": "--outside-paths",
                      "negate": "--no-outside-paths"
                    }
                  }
                },
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The command's events, one JSON object per line. The process exit code is the command's status.",
            "content": {
              "application/jsonl": {
                "itemSchema": {
                  "$ref": "#/components/schemas/Event"
                }
              }
            }
          }
        }
      }
    },
    "/image": {
      "post": {
        "operationId": "image",
        "summary": "Print the container image the script asks for (exit 1 when none):",
        "description": "Print the container image the script asks for (exit 1 when none):\nits container_image(), else its base's.",
        "x-cli": {
          "program": "script",
          "command": "image"
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "profile": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "description": "Activate a profile (repeatable, comma-separated; '*' for all). Read before the script runs, so it also steers what it declares.",
                    "x-cli": {
                      "flag": "--profile"
                    }
                  }
                },
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The command's events, one JSON object per line. The process exit code is the command's status.",
            "content": {
              "application/jsonl": {
                "itemSchema": {
                  "$ref": "#/components/schemas/Event"
                }
              }
            }
          }
        }
      }
    },
    "/install": {
      "post": {
        "operationId": "install",
        "summary": "Generate into DEST and install galaxy roles and collections there.",
        "description": "Generate into DEST and install galaxy roles and collections there.",
        "x-cli": {
          "program": "script",
          "command": "install"
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "dest": {
                    "type": "string",
                    "default": "out",
                    "x-cli": {
                      "argument": 0
                    }
                  },
                  "env": {
                    "type": "boolean",
                    "description": "Run ansible from an environment built (or reused) with uv from the script's requirements; see `env`.",
                    "x-cli": {
                      "flag": "--env",
                      "negate": "--no-env"
                    }
                  },
                  "skip_requirements": {
                    "type": "boolean",
                    "description": "Run even if this machine lacks the script's runtime requirements.",
                    "x-cli": {
                      "flag": "--skip-requirements",
                      "negate": "--no-skip-requirements"
                    }
                  },
                  "bare": {
                    "type": "boolean",
                    "description": "Do not add a default inventory and ansible.cfg.",
                    "x-cli": {
                      "flag": "--bare",
                      "negate": "--no-bare"
                    }
                  },
                  "profile": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "description": "Activate a profile (repeatable, comma-separated; '*' for all). Read before the script runs, so it also steers what it declares.",
                    "x-cli": {
                      "flag": "--profile"
                    }
                  },
                  "outside_paths": {
                    "type": "boolean",
                    "description": "Let the environment's (--env) or the image's (container) collections and roles count: the tree's ansible.cfg names them after its own, and --install does not install them again. Off, only the tree's count.",
                    "x-cli": {
                      "flag": "--outside-paths",
                      "negate": "--no-outside-paths"
                    }
                  }
                },
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The command's events, one JSON object per line. The process exit code is the command's status.",
            "content": {
              "application/jsonl": {
                "itemSchema": {
                  "$ref": "#/components/schemas/Event"
                }
              }
            }
          }
        }
      }
    },
    "/lint": {
      "post": {
        "operationId": "lint",
        "summary": "Run the registered checks, then ansible-lint (or a syntax check).",
        "description": "Run the registered checks, then ansible-lint (or a syntax check).",
        "x-cli": {
          "program": "script",
          "command": "lint"
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "checks_only": {
                    "type": "boolean",
                    "description": "Only run the registered checks.",
                    "x-cli": {
                      "flag": "--checks-only"
                    }
                  },
                  "no_checks": {
                    "type": "boolean",
                    "description": "Skip the registered checks.",
                    "x-cli": {
                      "flag": "--no-checks",
                      "negate": "--checks"
                    }
                  },
                  "no_builtin_checks": {
                    "type": "boolean",
                    "description": "Skip instamix's own structural checks.",
                    "x-cli": {
                      "flag": "--no-builtin-checks",
                      "negate": "--builtin-checks"
                    }
                  },
                  "env": {
                    "type": "boolean",
                    "description": "Run ansible from an environment built (or reused) with uv from the script's requirements; see `env`.",
                    "x-cli": {
                      "flag": "--env",
                      "negate": "--no-env"
                    }
                  },
                  "skip_requirements": {
                    "type": "boolean",
                    "description": "Run even if this machine lacks the script's runtime requirements.",
                    "x-cli": {
                      "flag": "--skip-requirements",
                      "negate": "--no-skip-requirements"
                    }
                  },
                  "bare": {
                    "type": "boolean",
                    "description": "Do not add a default inventory and ansible.cfg.",
                    "x-cli": {
                      "flag": "--bare",
                      "negate": "--no-bare"
                    }
                  },
                  "profile": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "description": "Activate a profile (repeatable, comma-separated; '*' for all). Read before the script runs, so it also steers what it declares.",
                    "x-cli": {
                      "flag": "--profile"
                    }
                  },
                  "outside_paths": {
                    "type": "boolean",
                    "description": "Let the environment's (--env) or the image's (container) collections and roles count: the tree's ansible.cfg names them after its own, and --install does not install them again. Off, only the tree's count.",
                    "x-cli": {
                      "flag": "--outside-paths",
                      "negate": "--no-outside-paths"
                    }
                  }
                },
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The command's events, one JSON object per line. The process exit code is the command's status.",
            "content": {
              "application/jsonl": {
                "itemSchema": {
                  "$ref": "#/components/schemas/Event"
                }
              }
            }
          }
        }
      }
    },
    "/profiles": {
      "post": {
        "operationId": "profiles",
        "summary": "List the profiles this script mentions.",
        "description": "List the profiles this script mentions.",
        "x-cli": {
          "program": "script",
          "command": "profiles"
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "profile": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "description": "Activate a profile (repeatable, comma-separated; '*' for all). Read before the script runs, so it also steers what it declares.",
                    "x-cli": {
                      "flag": "--profile"
                    }
                  }
                },
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The command's events, one JSON object per line. The process exit code is the command's status.",
            "content": {
              "application/jsonl": {
                "itemSchema": {
                  "$ref": "#/components/schemas/Event"
                }
              }
            }
          }
        }
      }
    },
    "/run": {
      "post": {
        "operationId": "run",
        "summary": "Run PLAYBOOK (default: site.yml) with ansible-playbook.",
        "description": "Run PLAYBOOK (default: site.yml) with ansible-playbook.",
        "x-cli": {
          "program": "script",
          "command": "run"
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "playbook": {
                    "type": "string",
                    "x-cli": {
                      "argument": 0
                    }
                  },
                  "dir": {
                    "type": "string",
                    "description": "Build in this directory instead of a temporary one.",
                    "x-cli": {
                      "flag": "--dir"
                    }
                  },
                  "keep": {
                    "type": "boolean",
                    "description": "Keep the temporary build directory.",
                    "x-cli": {
                      "flag": "--keep",
                      "negate": "--no-keep"
                    }
                  },
                  "install": {
                    "type": "boolean",
                    "description": "Install galaxy requirements into the tree first.",
                    "x-cli": {
                      "flag": "--install",
                      "negate": "--no-install"
                    }
                  },
                  "check": {
                    "type": "boolean",
                    "description": "ansible-playbook --check.",
                    "x-cli": {
                      "flag": "--check",
                      "negate": "--no-check"
                    }
                  },
                  "diff": {
                    "type": "boolean",
                    "description": "ansible-playbook --diff.",
                    "x-cli": {
                      "flag": "--diff",
                      "negate": "--no-diff"
                    }
                  },
                  "limit": {
                    "type": "string",
                    "description": "Limit to a host subset.",
                    "x-cli": {
                      "flag": "--limit"
                    }
                  },
                  "tags": {
                    "type": "string",
                    "description": "Only run these tags.",
                    "x-cli": {
                      "flag": "--tags"
                    }
                  },
                  "skip_tags": {
                    "type": "string",
                    "description": "Skip these tags.",
                    "x-cli": {
                      "flag": "--skip-tags"
                    }
                  },
                  "become": {
                    "type": "boolean",
                    "description": "Run operations with become.",
                    "x-cli": {
                      "flag": "--become",
                      "negate": "--no-become"
                    }
                  },
                  "user": {
                    "type": "string",
                    "description": "Connect as this user.",
                    "x-cli": {
                      "flag": "--user"
                    }
                  },
                  "connection": {
                    "type": "string",
                    "description": "Connection type.",
                    "x-cli": {
                      "flag": "--connection"
                    }
                  },
                  "extra_vars": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "description": "Extra variables (repeatable).",
                    "x-cli": {
                      "flag": "--extra-vars"
                    }
                  },
                  "inventory": {
                    "type": "string",
                    "description": "Override the inventory.",
                    "x-cli": {
                      "flag": "--inventory"
                    }
                  },
                  "start_at_task": {
                    "type": "string",
                    "description": "Start at this task.",
                    "x-cli": {
                      "flag": "--start-at-task"
                    }
                  },
                  "step": {
                    "type": "boolean",
                    "description": "Confirm each task.",
                    "x-cli": {
                      "flag": "--step"
                    }
                  },
                  "list_tasks": {
                    "type": "boolean",
                    "description": "List the tasks and exit.",
                    "x-cli": {
                      "flag": "--list-tasks"
                    }
                  },
                  "list_hosts": {
                    "type": "boolean",
                    "description": "List matching hosts and exit.",
                    "x-cli": {
                      "flag": "--list-hosts"
                    }
                  },
                  "syntax_check": {
                    "type": "boolean",
                    "description": "Only check the syntax.",
                    "x-cli": {
                      "flag": "--syntax-check"
                    }
                  },
                  "vault_password_file": {
                    "type": "string",
                    "description": "Vault password file.",
                    "x-cli": {
                      "flag": "--vault-password-file"
                    }
                  },
                  "verbose": {
                    "type": "integer",
                    "minimum": 0,
                    "description": "Pass -v to ansible (repeatable).",
                    "x-cli": {
                      "flag": "--verbose",
                      "repeat": true
                    }
                  },
                  "record": {
                    "type": "string",
                    "description": "Also write the run's events to FILE (JSONL), for `imix replay`; ansible's output stays as it is.",
                    "x-cli": {
                      "flag": "--record"
                    }
                  },
                  "env": {
                    "type": "boolean",
                    "description": "Run ansible from an environment built (or reused) with uv from the script's requirements; see `env`.",
                    "x-cli": {
                      "flag": "--env",
                      "negate": "--no-env"
                    }
                  },
                  "skip_requirements": {
                    "type": "boolean",
                    "description": "Run even if this machine lacks the script's runtime requirements.",
                    "x-cli": {
                      "flag": "--skip-requirements",
                      "negate": "--no-skip-requirements"
                    }
                  },
                  "bare": {
                    "type": "boolean",
                    "description": "Do not add a default inventory and ansible.cfg.",
                    "x-cli": {
                      "flag": "--bare",
                      "negate": "--no-bare"
                    }
                  },
                  "profile": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "description": "Activate a profile (repeatable, comma-separated; '*' for all). Read before the script runs, so it also steers what it declares.",
                    "x-cli": {
                      "flag": "--profile"
                    }
                  },
                  "outside_paths": {
                    "type": "boolean",
                    "description": "Let the environment's (--env) or the image's (container) collections and roles count: the tree's ansible.cfg names them after its own, and --install does not install them again. Off, only the tree's count.",
                    "x-cli": {
                      "flag": "--outside-paths",
                      "negate": "--no-outside-paths"
                    }
                  },
                  "ansible_args": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "description": "Passed through to ansible-playbook, after `--`.",
                    "x-cli": {
                      "passthrough": true
                    }
                  }
                },
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The command's events, one JSON object per line. The process exit code is the command's status.",
            "content": {
              "application/jsonl": {
                "itemSchema": {
                  "$ref": "#/components/schemas/Event"
                }
              }
            }
          }
        }
      }
    },
    "/show": {
      "post": {
        "operationId": "show",
        "summary": "List the files this script declares (default).",
        "description": "List the files this script declares (default).",
        "x-cli": {
          "program": "script",
          "command": "show"
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "bare": {
                    "type": "boolean",
                    "description": "Do not add a default inventory and ansible.cfg.",
                    "x-cli": {
                      "flag": "--bare",
                      "negate": "--no-bare"
                    }
                  },
                  "profile": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "description": "Activate a profile (repeatable, comma-separated; '*' for all). Read before the script runs, so it also steers what it declares.",
                    "x-cli": {
                      "flag": "--profile"
                    }
                  }
                },
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The command's events, one JSON object per line. The process exit code is the command's status.",
            "content": {
              "application/jsonl": {
                "itemSchema": {
                  "$ref": "#/components/schemas/Event"
                }
              }
            }
          }
        }
      }
    },
    "/test": {
      "post": {
        "operationId": "test",
        "summary": "Run the declared tests: molecule, ansible-test, or a role test playbook.",
        "description": "Run the declared tests: molecule, ansible-test, or a role test playbook.",
        "x-cli": {
          "program": "script",
          "command": "test"
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "target": {
                    "type": "string",
                    "x-cli": {
                      "argument": 0
                    }
                  },
                  "dir": {
                    "type": "string",
                    "description": "Build in this directory instead of a temporary one.",
                    "x-cli": {
                      "flag": "--dir"
                    }
                  },
                  "keep": {
                    "type": "boolean",
                    "description": "Keep the build directory.",
                    "x-cli": {
                      "flag": "--keep",
                      "negate": "--no-keep"
                    }
                  },
                  "install": {
                    "type": "boolean",
                    "description": "Install galaxy requirements into the tree first.",
                    "x-cli": {
                      "flag": "--install",
                      "negate": "--no-install"
                    }
                  },
                  "runner": {
                    "type": "string",
                    "enum": [
                      "auto",
                      "molecule",
                      "ansible-test",
                      "playbook"
                    ],
                    "description": "Force a runner instead of picking one.",
                    "default": "auto",
                    "x-cli": {
                      "flag": "--runner"
                    }
                  },
                  "kind": {
                    "type": "string",
                    "enum": [
                      "sanity",
                      "units",
                      "integration"
                    ],
                    "description": "What ansible-test should run.",
                    "default": "sanity",
                    "x-cli": {
                      "flag": "--kind"
                    }
                  },
                  "list": {
                    "type": "boolean",
                    "description": "List what could be tested and exit.",
                    "x-cli": {
                      "flag": "--list"
                    }
                  },
                  "env": {
                    "type": "boolean",
                    "description": "Run ansible from an environment built (or reused) with uv from the script's requirements; see `env`.",
                    "x-cli": {
                      "flag": "--env",
                      "negate": "--no-env"
                    }
                  },
                  "skip_requirements": {
                    "type": "boolean",
                    "description": "Run even if this machine lacks the script's runtime requirements.",
                    "x-cli": {
                      "flag": "--skip-requirements",
                      "negate": "--no-skip-requirements"
                    }
                  },
                  "bare": {
                    "type": "boolean",
                    "description": "Do not add a default inventory and ansible.cfg.",
                    "x-cli": {
                      "flag": "--bare",
                      "negate": "--no-bare"
                    }
                  },
                  "profile": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "description": "Activate a profile (repeatable, comma-separated; '*' for all). Read before the script runs, so it also steers what it declares.",
                    "x-cli": {
                      "flag": "--profile"
                    }
                  },
                  "outside_paths": {
                    "type": "boolean",
                    "description": "Let the environment's (--env) or the image's (container) collections and roles count: the tree's ansible.cfg names them after its own, and --install does not install them again. Off, only the tree's count.",
                    "x-cli": {
                      "flag": "--outside-paths",
                      "negate": "--no-outside-paths"
                    }
                  }
                },
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The command's events, one JSON object per line. The process exit code is the command's status.",
            "content": {
              "application/jsonl": {
                "itemSchema": {
                  "$ref": "#/components/schemas/Event"
                }
              }
            }
          }
        }
      }
    },
    "/imix/config": {
      "post": {
        "operationId": "config",
        "summary": "Default options per command, from git-like config files.",
        "description": "Default options per command, from git-like config files.\n\n~/.config/instamix/config holds the global ones, and the nearest\n.instamixconfig up to the root of the git repository the ones for\nthere; the command line and environment variables still win. A key is\na command and one of its long options: run.install, env.upgrade,\nproxy.serve.listen; proxy.url and proxy.list are where scripts fetch\nthrough. `keys` lists them all.",
        "x-cli": {
          "program": "imix",
          "command": "config"
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {},
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The command's events, one JSON object per line. The process exit code is the command's status.",
            "content": {
              "application/jsonl": {
                "itemSchema": {
                  "$ref": "#/components/schemas/Event"
                }
              }
            }
          }
        }
      }
    },
    "/imix/container": {
      "post": {
        "operationId": "container",
        "summary": "Run SCRIPT's playbook in a container: `imix container SCRIPT",
        "description": "Run SCRIPT's playbook in a container: `imix container SCRIPT\n[--image IMAGE] [OPTIONS] [PLAYBOOK] [-- ANSIBLE ARGS]`, the script's own\n`container` command (`SCRIPT container --help` lists its options).",
        "x-cli": {
          "program": "imix",
          "command": "container"
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "script_path": {
                    "type": "string",
                    "x-cli": {
                      "argument": 0
                    }
                  },
                  "args": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "x-cli": {
                      "argument": 1
                    }
                  }
                },
                "additionalProperties": false,
                "required": [
                  "script_path"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The command's events, one JSON object per line. The process exit code is the command's status.",
            "content": {
              "application/jsonl": {
                "itemSchema": {
                  "$ref": "#/components/schemas/Event"
                }
              }
            }
          }
        }
      }
    },
    "/imix/import": {
      "post": {
        "operationId": "import",
        "summary": "Turn an existing playbook DIRECTORY into one instamix script.",
        "description": "Turn an existing playbook DIRECTORY into one instamix script.\n\nFiles that look like they hold secrets -- by name (.env, keys, vault\npasswords, ...) or by content (API tokens, private keys) -- are left out\nunless --all is given.",
        "x-cli": {
          "program": "imix",
          "command": "import"
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "directory": {
                    "type": "string",
                    "x-cli": {
                      "argument": 0
                    }
                  },
                  "output": {
                    "type": "string",
                    "description": "Write the script here instead of stdout.",
                    "x-cli": {
                      "flag": "--output"
                    }
                  },
                  "force": {
                    "type": "boolean",
                    "description": "Overwrite an existing script.",
                    "x-cli": {
                      "flag": "--force"
                    }
                  },
                  "all": {
                    "type": "boolean",
                    "description": "Also import files that look like they hold secrets.",
                    "x-cli": {
                      "flag": "--all"
                    }
                  }
                },
                "additionalProperties": false,
                "required": [
                  "directory"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The command's events, one JSON object per line. The process exit code is the command's status.",
            "content": {
              "application/jsonl": {
                "itemSchema": {
                  "$ref": "#/components/schemas/Event"
                }
              }
            }
          }
        }
      }
    },
    "/imix/init": {
      "post": {
        "operationId": "init",
        "summary": "Write a starter script to PATH (default: site.py).",
        "description": "Write a starter script to PATH (default: site.py).",
        "x-cli": {
          "program": "imix",
          "command": "init"
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "path": {
                    "type": "string",
                    "default": "site.py",
                    "x-cli": {
                      "argument": 0
                    }
                  },
                  "force": {
                    "type": "boolean",
                    "description": "Overwrite an existing script.",
                    "x-cli": {
                      "flag": "--force"
                    }
                  }
                },
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The command's events, one JSON object per line. The process exit code is the command's status.",
            "content": {
              "application/jsonl": {
                "itemSchema": {
                  "$ref": "#/components/schemas/Event"
                }
              }
            }
          }
        }
      }
    },
    "/imix/plays": {
      "post": {
        "operationId": "plays",
        "summary": "Find the instamix scripts, and say what each has.",
        "description": "Find the instamix scripts, and say what each has.",
        "x-cli": {
          "program": "imix",
          "command": "plays"
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {},
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The command's events, one JSON object per line. The process exit code is the command's status.",
            "content": {
              "application/jsonl": {
                "itemSchema": {
                  "$ref": "#/components/schemas/Event"
                }
              }
            }
          }
        }
      }
    },
    "/imix/proxy": {
      "post": {
        "operationId": "proxy",
        "summary": "A screening proxy for Galaxy and PyPI: cache, allow and deny.",
        "description": "A screening proxy for Galaxy and PyPI: cache, allow and deny.",
        "x-cli": {
          "program": "imix",
          "command": "proxy"
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {},
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The command's events, one JSON object per line. The process exit code is the command's status.",
            "content": {
              "application/jsonl": {
                "itemSchema": {
                  "$ref": "#/components/schemas/Event"
                }
              }
            }
          }
        }
      }
    },
    "/imix/replay": {
      "post": {
        "operationId": "replay",
        "summary": "Show a run recorded with --record (or saved --jsonl output; - for",
        "description": "Show a run recorded with --record (or saved --jsonl output; - for\nstdin): what ran, each play and task, every host's result, what failed\nand why, and the recap.",
        "x-cli": {
          "program": "imix",
          "command": "replay"
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "file": {
                    "type": "string",
                    "x-cli": {
                      "argument": 0
                    }
                  },
                  "failed": {
                    "type": "boolean",
                    "description": "Only what failed or was unreachable.",
                    "x-cli": {
                      "flag": "--failed"
                    }
                  },
                  "host": {
                    "type": "string",
                    "description": "Only this host.",
                    "x-cli": {
                      "flag": "--host"
                    }
                  },
                  "results": {
                    "type": "boolean",
                    "description": "Each result in full.",
                    "x-cli": {
                      "flag": "--results"
                    }
                  }
                },
                "additionalProperties": false,
                "required": [
                  "file"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The command's events, one JSON object per line. The process exit code is the command's status.",
            "content": {
              "application/jsonl": {
                "itemSchema": {
                  "$ref": "#/components/schemas/Event"
                }
              }
            }
          }
        }
      }
    },
    "/imix/repo": {
      "post": {
        "operationId": "repo",
        "summary": "Playbook repositories: clone, list, sync, remove.",
        "description": "Playbook repositories: clone, list, sync, remove.",
        "x-cli": {
          "program": "imix",
          "command": "repo"
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {},
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The command's events, one JSON object per line. The process exit code is the command's status.",
            "content": {
              "application/jsonl": {
                "itemSchema": {
                  "$ref": "#/components/schemas/Event"
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "Content": {
        "description": "Text (dedented, newline-terminated), or data dumped as YAML.",
        "type": [
          "string",
          "object",
          "array"
        ]
      },
      "Only": {
        "description": "Profiles this declaration belongs to (like `with profile(...)`).",
        "type": [
          "string",
          "array"
        ],
        "items": {
          "type": "string"
        }
      },
      "Play": {
        "type": "object",
        "required": [
          "hosts"
        ],
        "properties": {
          "hosts": {
            "type": [
              "string",
              "array"
            ],
            "items": {
              "type": "string"
            }
          }
        },
        "description": "One play, as ansible reads it."
      },
      "Event_profiles": {
        "type": "object",
        "description": "The active profiles.",
        "properties": {
          "event": {
            "const": "profiles"
          },
          "active": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        },
        "required": [
          "event",
          "active"
        ],
        "additionalProperties": false
      },
      "Event_file": {
        "type": "object",
        "description": "A file of the tree.",
        "properties": {
          "event": {
            "const": "file"
          },
          "path": {
            "type": "string"
          },
          "size": {
            "type": "integer"
          },
          "mode": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Unix permission bits, or null for the default (0644)."
          },
          "sha256": {
            "type": "string",
            "pattern": "^[0-9a-f]{64}$"
          },
          "default": {
            "type": "boolean",
            "description": "Added by instamix (inventory, ansible.cfg, requirements.yml), not declared by the script."
          },
          "text": {
            "type": "string",
            "description": "The contents, if UTF-8 (cat)."
          },
          "base64": {
            "type": "string",
            "description": "The contents, if not UTF-8 (cat)."
          }
        },
        "required": [
          "event",
          "path",
          "size",
          "mode",
          "sha256"
        ],
        "additionalProperties": false
      },
      "Event_removed": {
        "type": "object",
        "description": "A file generate removed because the script no longer declares it.",
        "properties": {
          "event": {
            "const": "removed"
          },
          "path": {
            "type": "string"
          }
        },
        "required": [
          "event",
          "path"
        ],
        "additionalProperties": false
      },
      "Event_generated": {
        "type": "object",
        "description": "generate finished.",
        "properties": {
          "event": {
            "const": "generated"
          },
          "dest": {
            "type": "string"
          },
          "format": {
            "type": "string",
            "enum": [
              "directory",
              "tar"
            ]
          },
          "files": {
            "type": "integer"
          },
          "compression": {
            "type": "string",
            "enum": [
              "gz",
              "bz2",
              "xz",
              "none"
            ]
          },
          "sha256": {
            "type": "string",
            "pattern": "^[0-9a-f]{64}$",
            "description": "Of the archive."
          }
        },
        "required": [
          "event",
          "dest",
          "format",
          "files"
        ],
        "additionalProperties": false
      },
      "Event_change": {
        "type": "object",
        "description": "A file generate would change.",
        "properties": {
          "event": {
            "const": "change"
          },
          "path": {
            "type": "string"
          },
          "status": {
            "type": "string",
            "enum": [
              "added",
              "modified",
              "removed"
            ]
          },
          "diff": {
            "type": "string",
            "description": "A unified diff."
          }
        },
        "required": [
          "event",
          "path",
          "status"
        ],
        "additionalProperties": false
      },
      "Event_diff": {
        "type": "object",
        "description": "diff finished.",
        "properties": {
          "event": {
            "const": "diff"
          },
          "dest": {
            "type": "string"
          },
          "changed": {
            "type": "boolean"
          }
        },
        "required": [
          "event",
          "dest",
          "changed"
        ],
        "additionalProperties": false
      },
      "Event_problem": {
        "type": "object",
        "description": "A check found a problem.",
        "properties": {
          "event": {
            "const": "problem"
          },
          "check": {
            "type": "string"
          },
          "message": {
            "type": "string"
          }
        },
        "required": [
          "event",
          "check",
          "message"
        ],
        "additionalProperties": false
      },
      "Event_checks": {
        "type": "object",
        "description": "The checks finished.",
        "properties": {
          "event": {
            "const": "checks"
          },
          "count": {
            "type": "integer"
          },
          "problems": {
            "type": "integer"
          }
        },
        "required": [
          "event",
          "count",
          "problems"
        ],
        "additionalProperties": false
      },
      "Event_target": {
        "type": "object",
        "description": "Something test can run.",
        "properties": {
          "event": {
            "const": "target"
          },
          "runner": {
            "type": "string",
            "enum": [
              "molecule",
              "ansible-test",
              "playbook"
            ]
          },
          "name": {
            "type": "string"
          },
          "path": {
            "type": "string"
          }
        },
        "required": [
          "event",
          "runner",
          "name",
          "path"
        ],
        "additionalProperties": false
      },
      "Event_profile": {
        "type": "object",
        "description": "A profile the script mentions.",
        "properties": {
          "event": {
            "const": "profile"
          },
          "name": {
            "type": "string"
          },
          "active": {
            "type": "boolean"
          },
          "builtin": {
            "type": "boolean"
          },
          "files": {
            "type": "integer"
          }
        },
        "required": [
          "event",
          "name",
          "active",
          "builtin",
          "files"
        ],
        "additionalProperties": false
      },
      "Event_exec": {
        "type": "object",
        "description": "instamix started a program.",
        "properties": {
          "event": {
            "const": "exec"
          },
          "cmd": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "cwd": {
            "type": "string"
          }
        },
        "required": [
          "event",
          "cmd",
          "cwd"
        ],
        "additionalProperties": false
      },
      "Event_output": {
        "type": "object",
        "description": "A line the program wrote.",
        "properties": {
          "event": {
            "const": "output"
          },
          "stream": {
            "type": "string",
            "enum": [
              "stdout",
              "stderr"
            ]
          },
          "line": {
            "type": "string"
          }
        },
        "required": [
          "event",
          "stream",
          "line"
        ],
        "additionalProperties": false
      },
      "Event_exited": {
        "type": "object",
        "description": "The program exited.",
        "properties": {
          "event": {
            "const": "exited"
          },
          "cmd": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "status": {
            "type": "integer"
          }
        },
        "required": [
          "event",
          "cmd",
          "status"
        ],
        "additionalProperties": false
      },
      "Event_play": {
        "type": "object",
        "description": "A play started (run).",
        "properties": {
          "event": {
            "const": "play"
          },
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "hosts": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        },
        "required": [
          "event",
          "id",
          "name",
          "hosts"
        ],
        "additionalProperties": false
      },
      "Event_task": {
        "type": "object",
        "description": "A task or handler started (run).",
        "properties": {
          "event": {
            "const": "task"
          },
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "action": {
            "type": "string"
          },
          "handler": {
            "type": "boolean"
          },
          "path": {
            "type": "string",
            "description": "Where the task is, file:line."
          },
          "role": {
            "type": "string"
          }
        },
        "required": [
          "event",
          "id",
          "name",
          "action",
          "handler"
        ],
        "additionalProperties": false
      },
      "Event_result": {
        "type": "object",
        "description": "What a task did on one host, or for one loop item (run).",
        "properties": {
          "event": {
            "const": "result"
          },
          "host": {
            "type": "string"
          },
          "task_id": {
            "type": "string"
          },
          "task": {
            "type": "string"
          },
          "action": {
            "type": "string"
          },
          "status": {
            "type": "string",
            "enum": [
              "ok",
              "changed",
              "failed",
              "skipped",
              "unreachable"
            ]
          },
          "result": {
            "type": "object",
            "description": "The module's result, as ansible's callbacks see it: without internal keys and the module invocation, and censored for no_log."
          },
          "item": {
            "description": "The loop item this result is for."
          },
          "items": {
            "type": "integer",
            "description": "The number of loop items, on the result that sums a loop up; each item had its own event."
          },
          "ignored": {
            "type": "boolean",
            "description": "A failure ignore_errors lets through."
          },
          "delegated_to": {
            "type": "string"
          }
        },
        "required": [
          "event",
          "host",
          "task_id",
          "task",
          "action",
          "status",
          "result"
        ],
        "additionalProperties": false
      },
      "Event_recap": {
        "type": "object",
        "description": "One host's totals at the end of a run.",
        "properties": {
          "event": {
            "const": "recap"
          },
          "host": {
            "type": "string"
          },
          "ok": {
            "type": "integer"
          },
          "changed": {
            "type": "integer"
          },
          "unreachable": {
            "type": "integer"
          },
          "failures": {
            "type": "integer"
          },
          "skipped": {
            "type": "integer"
          },
          "rescued": {
            "type": "integer"
          },
          "ignored": {
            "type": "integer"
          }
        },
        "required": [
          "event",
          "host",
          "ok",
          "changed",
          "unreachable",
          "failures",
          "skipped",
          "rescued",
          "ignored"
        ],
        "additionalProperties": false
      },
      "Event_stage": {
        "type": "object",
        "description": "A stage of the script (describe): a playbook under a tag of its name.",
        "properties": {
          "event": {
            "const": "stage"
          },
          "name": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "playbook": {
            "type": "string"
          },
          "tags": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "when": {
            "description": "The condition the stage runs under."
          },
          "hosts": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "What the plays of its playbook target."
          },
          "source": {
            "type": "string",
            "description": "The script that described it."
          }
        },
        "required": [
          "event",
          "name",
          "description",
          "playbook",
          "tags"
        ],
        "additionalProperties": false
      },
      "Event_tag": {
        "type": "object",
        "description": "A tag and what it runs (describe).",
        "properties": {
          "event": {
            "const": "tag"
          },
          "name": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "stage": {
            "type": "boolean",
            "description": "It is the tag of a stage."
          }
        },
        "required": [
          "event",
          "name",
          "description",
          "stage"
        ],
        "additionalProperties": false
      },
      "Event_group": {
        "type": "object",
        "description": "A host group and what its hosts are for (describe).",
        "properties": {
          "event": {
            "const": "group"
          },
          "name": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "hosts": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "children": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "vars": {
            "type": "object"
          }
        },
        "required": [
          "event",
          "name",
          "description",
          "hosts",
          "children",
          "vars"
        ],
        "additionalProperties": false
      },
      "Event_variable": {
        "type": "object",
        "description": "A variable the playbooks need, and its shape (describe).",
        "properties": {
          "event": {
            "const": "variable"
          },
          "name": {
            "type": "string"
          },
          "group": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "shape": {
            "type": "string",
            "description": "The shape, as glom's Match prints it."
          },
          "required": {
            "type": "boolean",
            "description": "The script has to set it: it has no default."
          },
          "default": {
            "description": "What the group's group_vars give it."
          },
          "source": {
            "type": "string",
            "description": "The script that described it."
          },
          "schema": {
            "type": "object",
            "description": "The shape as JSON Schema, as far as one says it."
          }
        },
        "required": [
          "event",
          "name",
          "group",
          "description",
          "shape",
          "required"
        ],
        "additionalProperties": false
      },
      "Event_hidden": {
        "type": "object",
        "description": "Files left out because their profiles are not active.",
        "properties": {
          "event": {
            "const": "hidden"
          },
          "files": {
            "type": "integer"
          },
          "profiles": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        },
        "required": [
          "event",
          "files",
          "profiles"
        ],
        "additionalProperties": false
      },
      "Event_skipped": {
        "type": "object",
        "description": "A file import left out because it may hold secrets.",
        "properties": {
          "event": {
            "const": "skipped"
          },
          "path": {
            "type": "string"
          },
          "reason": {
            "type": "string"
          }
        },
        "required": [
          "event",
          "path",
          "reason"
        ],
        "additionalProperties": false
      },
      "Event_script": {
        "type": "object",
        "description": "The script import wrote.",
        "properties": {
          "event": {
            "const": "script"
          },
          "source": {
            "type": "string"
          }
        },
        "required": [
          "event",
          "source"
        ],
        "additionalProperties": false
      },
      "Event_wrote": {
        "type": "object",
        "description": "A script was written.",
        "properties": {
          "event": {
            "const": "wrote"
          },
          "path": {
            "type": "string"
          }
        },
        "required": [
          "event",
          "path"
        ],
        "additionalProperties": false
      },
      "Event_requirement": {
        "type": "object",
        "description": "A runtime requirement, checked against this machine (doctor).",
        "properties": {
          "event": {
            "const": "requirement"
          },
          "kind": {
            "type": "string",
            "enum": [
              "ansible",
              "python",
              "pip",
              "command"
            ]
          },
          "name": {
            "type": "string"
          },
          "spec": {
            "type": "string",
            "description": "A version requirement (>=2.16,<2.19), or empty."
          },
          "found": {
            "type": [
              "string",
              "null"
            ],
            "description": "The version, or path for a command, found here."
          },
          "ok": {
            "type": "boolean"
          }
        },
        "required": [
          "event",
          "kind",
          "name",
          "spec",
          "found",
          "ok"
        ],
        "additionalProperties": false
      },
      "Event_env": {
        "type": "object",
        "description": "The environment env built or reused.",
        "properties": {
          "event": {
            "const": "env"
          },
          "path": {
            "type": "string"
          },
          "created": {
            "type": "boolean"
          },
          "python": {
            "type": [
              "string",
              "null"
            ]
          },
          "ansible": {
            "type": [
              "string",
              "null"
            ]
          },
          "collections": {
            "type": "integer",
            "description": "Galaxy collections installed in it."
          },
          "roles": {
            "type": "integer",
            "description": "Galaxy roles installed in it."
          }
        },
        "required": [
          "event",
          "path",
          "created",
          "python",
          "ansible"
        ],
        "additionalProperties": false
      },
      "Event_container": {
        "type": "object",
        "description": "The image and engine `container` runs ansible with, before it does.",
        "properties": {
          "event": {
            "const": "container"
          },
          "image": {
            "type": "string"
          },
          "engine": {
            "type": "string"
          },
          "hint": {
            "type": "string",
            "description": "What in the script names the image, when it does."
          }
        },
        "required": [
          "event",
          "image",
          "engine"
        ],
        "additionalProperties": false
      },
      "Event_image": {
        "type": "object",
        "description": "The container image the script asks for.",
        "properties": {
          "event": {
            "const": "image"
          },
          "image": {
            "type": "string"
          },
          "source": {
            "type": "string"
          }
        },
        "required": [
          "event",
          "image",
          "source"
        ],
        "additionalProperties": false
      },
      "Event_runtime": {
        "type": "object",
        "description": "What a command that starts ansible runs it with, before it does.",
        "properties": {
          "event": {
            "const": "runtime"
          },
          "ansible": {
            "type": [
              "string",
              "null"
            ]
          },
          "python": {
            "type": [
              "string",
              "null"
            ]
          },
          "ansible_playbook": {
            "type": [
              "string",
              "null"
            ],
            "description": "Where ansible-playbook is; null: nowhere."
          },
          "environment": {
            "type": [
              "string",
              "null"
            ],
            "description": "The environment in use (--env), or null: PATH."
          },
          "base": {
            "type": "string",
            "description": "The base the environment starts from."
          },
          "proxy": {
            "type": "string",
            "description": "Where galaxy and pip content comes through."
          },
          "settings": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "The config files in effect, the weakest first."
          }
        },
        "required": [
          "event",
          "ansible",
          "python",
          "ansible_playbook",
          "environment"
        ],
        "additionalProperties": false
      },
      "Event_record": {
        "type": "object",
        "description": "A recording began (--record): the first event of the file.",
        "properties": {
          "event": {
            "const": "record"
          },
          "script": {
            "type": "string"
          },
          "argv": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "at": {
            "type": "string",
            "description": "When, as an ISO 8601 time (UTC)."
          }
        },
        "required": [
          "event",
          "script",
          "argv",
          "at"
        ],
        "additionalProperties": false
      },
      "Event_error": {
        "type": "object",
        "description": "The command failed; the exit code is not 0.",
        "properties": {
          "event": {
            "const": "error"
          },
          "message": {
            "type": "string"
          }
        },
        "required": [
          "event",
          "message"
        ],
        "additionalProperties": false
      },
      "Event": {
        "oneOf": [
          {
            "$ref": "#/components/schemas/Event_profiles"
          },
          {
            "$ref": "#/components/schemas/Event_file"
          },
          {
            "$ref": "#/components/schemas/Event_removed"
          },
          {
            "$ref": "#/components/schemas/Event_generated"
          },
          {
            "$ref": "#/components/schemas/Event_change"
          },
          {
            "$ref": "#/components/schemas/Event_diff"
          },
          {
            "$ref": "#/components/schemas/Event_problem"
          },
          {
            "$ref": "#/components/schemas/Event_checks"
          },
          {
            "$ref": "#/components/schemas/Event_target"
          },
          {
            "$ref": "#/components/schemas/Event_profile"
          },
          {
            "$ref": "#/components/schemas/Event_exec"
          },
          {
            "$ref": "#/components/schemas/Event_output"
          },
          {
            "$ref": "#/components/schemas/Event_exited"
          },
          {
            "$ref": "#/components/schemas/Event_play"
          },
          {
            "$ref": "#/components/schemas/Event_task"
          },
          {
            "$ref": "#/components/schemas/Event_result"
          },
          {
            "$ref": "#/components/schemas/Event_recap"
          },
          {
            "$ref": "#/components/schemas/Event_stage"
          },
          {
            "$ref": "#/components/schemas/Event_tag"
          },
          {
            "$ref": "#/components/schemas/Event_group"
          },
          {
            "$ref": "#/components/schemas/Event_variable"
          },
          {
            "$ref": "#/components/schemas/Event_hidden"
          },
          {
            "$ref": "#/components/schemas/Event_skipped"
          },
          {
            "$ref": "#/components/schemas/Event_script"
          },
          {
            "$ref": "#/components/schemas/Event_wrote"
          },
          {
            "$ref": "#/components/schemas/Event_requirement"
          },
          {
            "$ref": "#/components/schemas/Event_env"
          },
          {
            "$ref": "#/components/schemas/Event_container"
          },
          {
            "$ref": "#/components/schemas/Event_image"
          },
          {
            "$ref": "#/components/schemas/Event_runtime"
          },
          {
            "$ref": "#/components/schemas/Event_record"
          },
          {
            "$ref": "#/components/schemas/Event_error"
          }
        ],
        "discriminator": {
          "propertyName": "event",
          "mapping": {
            "profiles": "#/components/schemas/Event_profiles",
            "file": "#/components/schemas/Event_file",
            "removed": "#/components/schemas/Event_removed",
            "generated": "#/components/schemas/Event_generated",
            "change": "#/components/schemas/Event_change",
            "diff": "#/components/schemas/Event_diff",
            "problem": "#/components/schemas/Event_problem",
            "checks": "#/components/schemas/Event_checks",
            "target": "#/components/schemas/Event_target",
            "profile": "#/components/schemas/Event_profile",
            "exec": "#/components/schemas/Event_exec",
            "output": "#/components/schemas/Event_output",
            "exited": "#/components/schemas/Event_exited",
            "play": "#/components/schemas/Event_play",
            "task": "#/components/schemas/Event_task",
            "result": "#/components/schemas/Event_result",
            "recap": "#/components/schemas/Event_recap",
            "stage": "#/components/schemas/Event_stage",
            "tag": "#/components/schemas/Event_tag",
            "group": "#/components/schemas/Event_group",
            "variable": "#/components/schemas/Event_variable",
            "hidden": "#/components/schemas/Event_hidden",
            "skipped": "#/components/schemas/Event_skipped",
            "script": "#/components/schemas/Event_script",
            "wrote": "#/components/schemas/Event_wrote",
            "requirement": "#/components/schemas/Event_requirement",
            "env": "#/components/schemas/Event_env",
            "container": "#/components/schemas/Event_container",
            "image": "#/components/schemas/Event_image",
            "runtime": "#/components/schemas/Event_runtime",
            "record": "#/components/schemas/Event_record",
            "error": "#/components/schemas/Event_error"
          }
        }
      },
      "Declaration_file": {
        "type": "object",
        "description": "Declare one file.",
        "properties": {
          "call": {
            "const": "file"
          },
          "path": {
            "type": "string"
          },
          "content": {
            "$ref": "#/components/schemas/Content"
          },
          "mode": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Unix permission bits, or null for the default (0644)."
          },
          "only": {
            "$ref": "#/components/schemas/Only"
          }
        },
        "required": [
          "call",
          "path"
        ],
        "additionalProperties": false,
        "x-python": {
          "call": "file"
        }
      },
      "Declaration_include": {
        "type": "object",
        "description": "Read a file off disk.",
        "properties": {
          "call": {
            "const": "include"
          },
          "src": {
            "type": "string"
          },
          "dest": {
            "type": "string"
          },
          "only": {
            "$ref": "#/components/schemas/Only"
          }
        },
        "required": [
          "call",
          "src"
        ],
        "additionalProperties": false,
        "x-python": {
          "call": "include"
        }
      },
      "Declaration_include_tree": {
        "type": "object",
        "description": "Read a directory off disk.",
        "properties": {
          "call": {
            "const": "include_tree"
          },
          "src": {
            "type": "string"
          },
          "dest": {
            "type": "string"
          },
          "only": {
            "$ref": "#/components/schemas/Only"
          }
        },
        "required": [
          "call",
          "src"
        ],
        "additionalProperties": false,
        "x-python": {
          "call": "include_tree"
        }
      },
      "Declaration_playbook": {
        "type": "object",
        "description": "Declare a playbook from plays.",
        "properties": {
          "call": {
            "const": "playbook"
          },
          "path": {
            "type": "string",
            "default": "site.yml"
          },
          "plays": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Play"
            }
          },
          "only": {
            "$ref": "#/components/schemas/Only"
          }
        },
        "required": [
          "call"
        ],
        "additionalProperties": false,
        "x-python": {
          "call": "playbook",
          "positional": [
            "path",
            "plays"
          ],
          "varargs": "plays"
        }
      },
      "Declaration_role": {
        "type": "object",
        "description": "Lay out a role; only the parts given are written.",
        "properties": {
          "call": {
            "const": "role"
          },
          "name": {
            "type": "string"
          },
          "tasks": {
            "type": "array",
            "items": {
              "type": "object"
            }
          },
          "handlers": {
            "type": "array",
            "items": {
              "type": "object"
            }
          },
          "defaults": {
            "type": "object"
          },
          "vars": {
            "type": "object"
          },
          "meta": {
            "type": "object"
          },
          "files": {
            "type": "object",
            "additionalProperties": {
              "$ref": "#/components/schemas/Content"
            }
          },
          "templates": {
            "type": "object",
            "additionalProperties": {
              "$ref": "#/components/schemas/Content"
            }
          },
          "tests": {
            "type": "array",
            "items": {
              "type": "object"
            },
            "description": "Tasks, or plays, for tests/test.yml."
          },
          "collection": {
            "type": "string",
            "description": "Put the role in this local collection (ns.name)."
          },
          "only": {
            "$ref": "#/components/schemas/Only"
          }
        },
        "required": [
          "call",
          "name"
        ],
        "additionalProperties": false,
        "x-python": {
          "call": "role"
        }
      },
      "Declaration_collection": {
        "type": "object",
        "description": "Lay out a local collection.",
        "properties": {
          "call": {
            "const": "collection"
          },
          "name": {
            "type": "string",
            "pattern": "^[^.]+\\.[^.]+$"
          },
          "version": {
            "type": "string",
            "default": "1.0.0"
          },
          "roles": {
            "type": "object",
            "description": "role name -> role() arguments"
          },
          "plugins": {
            "type": "object",
            "additionalProperties": {
              "$ref": "#/components/schemas/Content"
            }
          },
          "meta": {
            "type": "object"
          },
          "only": {
            "$ref": "#/components/schemas/Only"
          }
        },
        "required": [
          "call",
          "name"
        ],
        "additionalProperties": false,
        "x-python": {
          "call": "collection"
        }
      },
      "Declaration_group_vars": {
        "type": "object",
        "description": "Variables for a group.",
        "properties": {
          "call": {
            "const": "group_vars"
          },
          "group": {
            "type": "string"
          },
          "data": {
            "type": "object"
          },
          "only": {
            "$ref": "#/components/schemas/Only"
          }
        },
        "required": [
          "call",
          "group"
        ],
        "additionalProperties": false,
        "x-python": {
          "call": "group_vars"
        }
      },
      "Declaration_host_vars": {
        "type": "object",
        "description": "Variables for a host.",
        "properties": {
          "call": {
            "const": "host_vars"
          },
          "host": {
            "type": "string"
          },
          "data": {
            "type": "object"
          },
          "only": {
            "$ref": "#/components/schemas/Only"
          }
        },
        "required": [
          "call",
          "host"
        ],
        "additionalProperties": false,
        "x-python": {
          "call": "host_vars"
        }
      },
      "Declaration_inventory": {
        "type": "object",
        "description": "An INI inventory from groups.",
        "properties": {
          "call": {
            "const": "inventory"
          },
          "groups": {
            "type": "object",
            "description": "group -> host list, or {hosts, vars, children}"
          },
          "path": {
            "type": "string",
            "default": "inventory"
          },
          "only": {
            "$ref": "#/components/schemas/Only"
          }
        },
        "required": [
          "call"
        ],
        "additionalProperties": false,
        "x-python": {
          "call": "inventory"
        }
      },
      "Declaration_group": {
        "type": "object",
        "description": "Describe a host group; the inventory is written from the groups.",
        "properties": {
          "call": {
            "const": "group"
          },
          "name": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "hosts": {
            "type": [
              "array",
              "object"
            ],
            "description": "Host names, or host -> inventory variables."
          },
          "children": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "The groups nested in it."
          },
          "vars": {
            "type": "object"
          },
          "only": {
            "$ref": "#/components/schemas/Only"
          }
        },
        "required": [
          "call",
          "name",
          "description"
        ],
        "additionalProperties": false,
        "x-python": {
          "call": "group"
        }
      },
      "Declaration_tag": {
        "type": "object",
        "description": "Describe a tag: what running it alone does.",
        "properties": {
          "call": {
            "const": "tag"
          },
          "name": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "only": {
            "$ref": "#/components/schemas/Only"
          }
        },
        "required": [
          "call",
          "name",
          "description"
        ],
        "additionalProperties": false,
        "x-python": {
          "call": "tag"
        }
      },
      "Declaration_var": {
        "type": "object",
        "description": "Describe a variable the playbooks need. A default goes into the group's group_vars; without one a group has to set it, unless it is optional.",
        "properties": {
          "call": {
            "const": "var"
          },
          "name": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "shape": {
            "type": "string",
            "enum": [
              "str",
              "int",
              "float",
              "bool",
              "list",
              "dict"
            ],
            "default": "str",
            "description": "In Python, anything glom's Match takes: a type, a list or dict of shapes, Or(...)."
          },
          "default": {
            "description": "The value in the group's group_vars."
          },
          "group": {
            "type": "string",
            "default": "all"
          },
          "optional": {
            "type": "boolean",
            "default": false
          },
          "only": {
            "$ref": "#/components/schemas/Only"
          }
        },
        "required": [
          "call",
          "name",
          "description"
        ],
        "additionalProperties": false,
        "x-python": {
          "call": "var"
        }
      },
      "Declaration_stage": {
        "type": "object",
        "description": "Describe a stage: a declared playbook that site.yml imports under a tag of the stage's name.",
        "properties": {
          "call": {
            "const": "stage"
          },
          "name": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "playbook": {
            "type": "string",
            "description": "Default: NAME.yml."
          },
          "when": {
            "description": "A condition, as on a task."
          },
          "tags": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "More tags to run it under."
          },
          "only": {
            "$ref": "#/components/schemas/Only"
          }
        },
        "required": [
          "call",
          "name",
          "description"
        ],
        "additionalProperties": false,
        "x-python": {
          "call": "stage"
        }
      },
      "Declaration_requires_role": {
        "type": "object",
        "description": "Depend on a galaxy role.",
        "properties": {
          "call": {
            "const": "requires_role"
          },
          "name": {
            "type": "string"
          },
          "version": {
            "type": "string"
          },
          "src": {
            "type": "string"
          },
          "scm": {
            "type": "string"
          },
          "only": {
            "$ref": "#/components/schemas/Only"
          }
        },
        "required": [
          "call",
          "name"
        ],
        "additionalProperties": false,
        "x-python": {
          "call": "requires_role"
        }
      },
      "Declaration_requires_collection": {
        "type": "object",
        "description": "Depend on a galaxy collection.",
        "properties": {
          "call": {
            "const": "requires_collection"
          },
          "name": {
            "type": "string"
          },
          "version": {
            "type": "string"
          },
          "source": {
            "type": "string"
          },
          "type": {
            "type": "string"
          },
          "signatures": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "only": {
            "$ref": "#/components/schemas/Only"
          }
        },
        "required": [
          "call",
          "name"
        ],
        "additionalProperties": false,
        "x-python": {
          "call": "requires_collection"
        }
      },
      "Declaration_requires_ansible": {
        "type": "object",
        "description": "Need an ansible-core version on the controller.",
        "properties": {
          "call": {
            "const": "requires_ansible"
          },
          "spec": {
            "type": "string",
            "examples": [
              ">=2.16,<2.19"
            ]
          },
          "only": {
            "$ref": "#/components/schemas/Only"
          }
        },
        "required": [
          "call",
          "spec"
        ],
        "additionalProperties": false,
        "x-python": {
          "call": "requires_ansible"
        }
      },
      "Declaration_proxy_list": {
        "type": "object",
        "description": "Fetch collections, roles and pip packages through this list of the instamix proxy ($INSTAMIX_PROXY).",
        "properties": {
          "call": {
            "const": "proxy_list"
          },
          "name": {
            "type": "string"
          },
          "only": {
            "$ref": "#/components/schemas/Only"
          }
        },
        "required": [
          "call",
          "name"
        ],
        "additionalProperties": false,
        "x-python": {
          "call": "proxy_list"
        }
      },
      "Declaration_requires_base": {
        "type": "object",
        "description": "Start the environment from a base: what a community execution environment puts on the controller (instamix_bases.BASES). A script's own collections and roles go into its tree, never the environment.",
        "properties": {
          "call": {
            "const": "requires_base"
          },
          "name": {
            "type": "string",
            "enum": [
              "minimal",
              "base"
            ]
          },
          "only": {
            "$ref": "#/components/schemas/Only"
          }
        },
        "required": [
          "call",
          "name"
        ],
        "additionalProperties": false,
        "x-python": {
          "call": "requires_base"
        }
      },
      "Declaration_container_image": {
        "type": "object",
        "description": "The container image `imix container` runs the playbooks in.",
        "properties": {
          "call": {
            "const": "container_image"
          },
          "ref": {
            "type": "string",
            "examples": [
              "ghcr.io/ansible-community/community-ee-base:latest"
            ]
          },
          "only": {
            "$ref": "#/components/schemas/Only"
          }
        },
        "required": [
          "call",
          "ref"
        ],
        "additionalProperties": false,
        "x-python": {
          "call": "container_image"
        }
      },
      "Declaration_requires_python": {
        "type": "object",
        "description": "Need a Python version for ansible itself.",
        "properties": {
          "call": {
            "const": "requires_python"
          },
          "spec": {
            "type": "string",
            "examples": [
              ">=3.11"
            ]
          },
          "only": {
            "$ref": "#/components/schemas/Only"
          }
        },
        "required": [
          "call",
          "spec"
        ],
        "additionalProperties": false,
        "x-python": {
          "call": "requires_python"
        }
      },
      "Declaration_requires_pip": {
        "type": "object",
        "description": "Need Python packages next to ansible (also written to requirements.txt).",
        "properties": {
          "call": {
            "const": "requires_pip"
          },
          "packages": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "minItems": 1,
            "examples": [
              [
                "jmespath",
                "netaddr>=0.10"
              ]
            ]
          },
          "only": {
            "$ref": "#/components/schemas/Only"
          }
        },
        "required": [
          "call",
          "packages"
        ],
        "additionalProperties": false,
        "x-python": {
          "call": "requires_pip",
          "positional": [
            "packages"
          ],
          "varargs": "packages"
        }
      },
      "Declaration_requires_command": {
        "type": "object",
        "description": "Need programs on PATH.",
        "properties": {
          "call": {
            "const": "requires_command"
          },
          "names": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "minItems": 1
          },
          "only": {
            "$ref": "#/components/schemas/Only"
          }
        },
        "required": [
          "call",
          "names"
        ],
        "additionalProperties": false,
        "x-python": {
          "call": "requires_command",
          "positional": [
            "names"
          ],
          "varargs": "names"
        }
      },
      "Declaration_molecule": {
        "type": "object",
        "description": "A molecule scenario, for the repo or one role.",
        "properties": {
          "call": {
            "const": "molecule"
          },
          "scenario": {
            "type": "string",
            "default": "default"
          },
          "converge": {
            "type": "array",
            "items": {
              "type": "object"
            }
          },
          "verify": {
            "type": "array",
            "items": {
              "type": "object"
            }
          },
          "driver": {
            "type": "string",
            "default": "podman"
          },
          "image": {
            "type": "string",
            "default": "quay.io/centos/centos:stream9"
          },
          "platforms": {
            "type": "array",
            "items": {
              "type": "object"
            }
          },
          "role": {
            "type": "string"
          },
          "config": {
            "type": "object"
          },
          "only": {
            "$ref": "#/components/schemas/Only"
          }
        },
        "required": [
          "call"
        ],
        "additionalProperties": false,
        "x-python": {
          "call": "molecule"
        }
      },
      "Declaration_integration_test": {
        "type": "object",
        "description": "An ansible-test integration target.",
        "properties": {
          "call": {
            "const": "integration_test"
          },
          "target": {
            "type": "string"
          },
          "tasks": {
            "type": "array",
            "items": {
              "type": "object"
            }
          },
          "collection": {
            "type": "string"
          },
          "aliases": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "only": {
            "$ref": "#/components/schemas/Only"
          }
        },
        "required": [
          "call",
          "target"
        ],
        "additionalProperties": false,
        "x-python": {
          "call": "integration_test"
        }
      },
      "Declaration_unit_test": {
        "type": "object",
        "description": "A file under tests/unit.",
        "properties": {
          "call": {
            "const": "unit_test"
          },
          "path": {
            "type": "string"
          },
          "content": {
            "$ref": "#/components/schemas/Content"
          },
          "collection": {
            "type": "string"
          },
          "only": {
            "$ref": "#/components/schemas/Only"
          }
        },
        "required": [
          "call",
          "path",
          "content"
        ],
        "additionalProperties": false,
        "x-python": {
          "call": "unit_test"
        }
      },
      "Declaration": {
        "oneOf": [
          {
            "$ref": "#/components/schemas/Declaration_file"
          },
          {
            "$ref": "#/components/schemas/Declaration_include"
          },
          {
            "$ref": "#/components/schemas/Declaration_include_tree"
          },
          {
            "$ref": "#/components/schemas/Declaration_playbook"
          },
          {
            "$ref": "#/components/schemas/Declaration_role"
          },
          {
            "$ref": "#/components/schemas/Declaration_collection"
          },
          {
            "$ref": "#/components/schemas/Declaration_group_vars"
          },
          {
            "$ref": "#/components/schemas/Declaration_host_vars"
          },
          {
            "$ref": "#/components/schemas/Declaration_inventory"
          },
          {
            "$ref": "#/components/schemas/Declaration_group"
          },
          {
            "$ref": "#/components/schemas/Declaration_tag"
          },
          {
            "$ref": "#/components/schemas/Declaration_var"
          },
          {
            "$ref": "#/components/schemas/Declaration_stage"
          },
          {
            "$ref": "#/components/schemas/Declaration_requires_role"
          },
          {
            "$ref": "#/components/schemas/Declaration_requires_collection"
          },
          {
            "$ref": "#/components/schemas/Declaration_requires_ansible"
          },
          {
            "$ref": "#/components/schemas/Declaration_proxy_list"
          },
          {
            "$ref": "#/components/schemas/Declaration_requires_base"
          },
          {
            "$ref": "#/components/schemas/Declaration_container_image"
          },
          {
            "$ref": "#/components/schemas/Declaration_requires_python"
          },
          {
            "$ref": "#/components/schemas/Declaration_requires_pip"
          },
          {
            "$ref": "#/components/schemas/Declaration_requires_command"
          },
          {
            "$ref": "#/components/schemas/Declaration_molecule"
          },
          {
            "$ref": "#/components/schemas/Declaration_integration_test"
          },
          {
            "$ref": "#/components/schemas/Declaration_unit_test"
          }
        ],
        "discriminator": {
          "propertyName": "call",
          "mapping": {
            "file": "#/components/schemas/Declaration_file",
            "include": "#/components/schemas/Declaration_include",
            "include_tree": "#/components/schemas/Declaration_include_tree",
            "playbook": "#/components/schemas/Declaration_playbook",
            "role": "#/components/schemas/Declaration_role",
            "collection": "#/components/schemas/Declaration_collection",
            "group_vars": "#/components/schemas/Declaration_group_vars",
            "host_vars": "#/components/schemas/Declaration_host_vars",
            "inventory": "#/components/schemas/Declaration_inventory",
            "group": "#/components/schemas/Declaration_group",
            "tag": "#/components/schemas/Declaration_tag",
            "var": "#/components/schemas/Declaration_var",
            "stage": "#/components/schemas/Declaration_stage",
            "requires_role": "#/components/schemas/Declaration_requires_role",
            "requires_collection": "#/components/schemas/Declaration_requires_collection",
            "requires_ansible": "#/components/schemas/Declaration_requires_ansible",
            "proxy_list": "#/components/schemas/Declaration_proxy_list",
            "requires_base": "#/components/schemas/Declaration_requires_base",
            "container_image": "#/components/schemas/Declaration_container_image",
            "requires_python": "#/components/schemas/Declaration_requires_python",
            "requires_pip": "#/components/schemas/Declaration_requires_pip",
            "requires_command": "#/components/schemas/Declaration_requires_command",
            "molecule": "#/components/schemas/Declaration_molecule",
            "integration_test": "#/components/schemas/Declaration_integration_test",
            "unit_test": "#/components/schemas/Declaration_unit_test"
          }
        }
      },
      "Script": {
        "type": "object",
        "description": "A whole script: its declarations, in order.",
        "properties": {
          "declarations": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Declaration"
            }
          }
        },
        "required": [
          "declarations"
        ],
        "additionalProperties": false
      }
    }
  }
}
