{
  "$schema": "http://json-schema.org/draft-07/schema",
  "title": "Taskfile YAML Schema",
  "description": "Schema for Taskfile files.",
  "definitions": {
    "3": {
      "env": {
        "$ref": "#/definitions/3/vars"
      },
      "tasks": {
        "type": "object",
        "patternProperties": {
          "^.*$": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "array",
                "items": {
                  "oneOf": [
                    {
                      "type": "string"
                    },
                    {
                      "$ref": "#/definitions/3/task_call"
                    }
                  ]
                }
              },
              {
                "$ref": "#/definitions/3/task"
              }
            ]
          }
        }
      },
      "task": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "cmds": {
            "description": "A list of commands to be executed.",
            "$ref": "#/definitions/3/cmds"
          },
          "cmd": {
            "description": "The command to be executed.",
            "$ref": "#/definitions/3/cmd"
          },
          "deps": {
            "description": "A list of dependencies of this task. Tasks defined here will run in parallel before this task.",
            "type": "array",
            "items": {
              "oneOf": [
                {
                  "type": "string"
                },
                {
                  "$ref": "#/definitions/3/task_call"
                }
              ]
            }
          },
          "label": {
            "description": "Overrides the name of the task in the output when a task is run. Supports variables.",
            "type": "string"
          },
          "desc": {
            "description": "A short description of the task. This is displayed when calling `task --list`.",
            "type": "string"
          },
          "prompt": {
            "description": "A prompt that will be presented before a task is run. Declining will cancel running the current and any subsequent tasks.",
            "type": "string"
          },
          "summary": {
            "description": "A longer description of the task. This is displayed when calling `task --summary [task]`.",
            "type": "string"
          },
          "aliases": {
            "description": "A list of alternative names by which the task can be called.",
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "sources": {
            "description": "A list of sources to check before running this task. Relevant for `checksum` and `timestamp` methods. Can be file paths or star globs.",
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "generates": {
            "description": "A list of files meant to be generated by this task. Relevant for `timestamp` method. Can be file paths or star globs.",
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "status": {
            "description": "A list of commands to check if this task should run. The task is skipped otherwise. This overrides `method`, `sources` and `generates`.",
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "preconditions": {
            "description": "A list of commands to check if this task should run. If a condition is not met, the task will error.",
            "type": "array",
            "items": {
              "$ref": "#/definitions/3/precondition"
            }
          },
          "dir": {
            "description": "The directory in which this task should run. Defaults to the current working directory.",
            "type": "string"
          },
          "set": {
            "description": "Enables POSIX shell options for all of a task's commands. See https://www.gnu.org/software/bash/manual/html_node/The-Set-Builtin.html",
            "type": "array",
            "items": {
              "$ref": "#/definitions/3/set"
            }
          },
          "shopt": {
            "description": "Enables Bash shell options for all of a task's commands. See https://www.gnu.org/software/bash/manual/html_node/The-Shopt-Builtin.html",
            "type": "array",
            "items": {
              "$ref": "#/definitions/3/shopt"
            }
          },
          "vars": {
            "description": "A set of variables that can be used in the task.",
            "$ref": "#/definitions/3/vars"
          },
          "env": {
            "description": "A set of environment variables that will be made available to shell commands.",
            "$ref": "#/definitions/3/env"
          },
          "dotenv": {
            "description": "A list of `.env` file paths to be parsed.",
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "silent": {
            "description": "Hides task name and command from output. The command's output will still be redirected to `STDOUT` and `STDERR`. When combined with the `--list` flag, task descriptions will be hidden.",
            "type": "boolean",
            "default": false
          },
          "interactive": {
            "description": "Tells task that the command is interactive.",
            "type": "boolean",
            "default": false
          },
          "internal": {
            "description": "Stops a task from being callable on the command line. It will also be omitted from the output when used with `--list`.",
            "type": "boolean",
            "default": false
          },
          "method": {
            "description": "Defines which method is used to check the task is up-to-date. `timestamp` will compare the timestamp of the sources and generates files. `checksum` will check the checksum (You probably want to ignore the .task folder in your .gitignore file). `none` skips any validation and always run the task.",
            "type": "string",
            "enum": ["none", "checksum", "timestamp"],
            "default": "none"
          },
          "prefix": {
            "description": "Defines a string to prefix the output of tasks running in parallel. Only used when the output mode is `prefixed`.",
            "type": "string"
          },
          "ignore_error": {
            "description": "Continue execution if errors happen while executing commands.",
            "type": "boolean"
          },
          "run": {
            "description": "Specifies whether the task should run again or not if called more than once. Available options: `always`, `once` and `when_changed`.",
            "$ref": "#/definitions/3/run"
          },
          "platforms": {
            "description": "Specifies which platforms the task should be run on.",
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "requires": {
            "description": "A list of variables which should be set if this task is to run, if any of these variables are unset the task will error and not run",
            "$ref": "#/definitions/3/requires_obj"
          }
        }
      },
      "cmds": {
        "type": "array",
        "items": {
          "$ref": "#/definitions/3/cmd"
        }
      },
      "cmd": {
        "anyOf": [
          {
            "type": "string"
          },
          {
            "$ref": "#/definitions/3/cmd_call"
          },
          {
            "$ref": "#/definitions/3/task_call"
          },
          {
            "$ref": "#/definitions/3/for_call"
          }
        ]
      },
      "set": {
        "type": "string",
        "enum": [
          "allexport",
          "a",
          "errexit",
          "e",
          "noexec",
          "n",
          "noglob",
          "f",
          "nounset",
          "u",
          "xtrace",
          "x",
          "pipefail"
        ]
      },
      "shopt": {
        "type": "string",
        "enum": ["expand_aliases", "globstar", "nullglob"]
      },
      "vars": {
        "type": "object",
        "patternProperties": {
          "^.*$": {
            "anyOf": [
              {
                "type": ["boolean", "integer", "null", "number", "string"]
              },
              {
                "$ref": "#/definitions/3/dynamic_var"
              }
            ]
          }
        }
      },
      "dynamic_var": {
        "type": "object",
        "properties": {
          "sh": {
            "type": "string",
            "description": "The value will be treated as a command and the output assigned"
          },
          "additionalProperties": false
        }
      },
      "task_call": {
        "type": "object",
        "properties": {
          "task": {
            "description": "Name of the task to run",
            "type": "string"
          },
          "vars": {
            "description": "Values passed to the task called",
            "$ref": "#/definitions/3/vars"
          },
          "silent": {
            "description": "Hides task name and command from output. The command's output will still be redirected to `STDOUT` and `STDERR`.",
            "type": "boolean"
          }
        },
        "additionalProperties": false,
        "required": ["task"]
      },
      "cmd_call": {
        "type": "object",
        "properties": {
          "cmd": {
            "description": "Command to run",
            "type": "string"
          },
          "silent": {
            "description": "Silent mode disables echoing of command before Task runs it",
            "type": "boolean"
          },
          "set": {
            "description": "Enables POSIX shell options for this command. See https://www.gnu.org/software/bash/manual/html_node/The-Set-Builtin.html",
            "type": "array",
            "items": {
              "$ref": "#/definitions/3/set"
            }
          },
          "shopt": {
            "description": "Enables Bash shell options for this command. See https://www.gnu.org/software/bash/manual/html_node/The-Shopt-Builtin.html",
            "type": "array",
            "items": {
              "$ref": "#/definitions/3/shopt"
            }
          },
          "ignore_error": {
            "description": "Prevent command from aborting the execution of task even after receiving a status code of 1",
            "type": "boolean"
          },
          "defer": {
            "description": "",
            "type": "boolean"
          },
          "platforms": {
            "description": "Specifies which platforms the command should be run on.",
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        },
        "additionalProperties": false,
        "required": ["cmd"]
      },
      "for_call": {
        "type": "object",
        "properties": {
          "for": {
            "anyOf": [
              {
                "$ref": "#/definitions/3/for_list"
              },
              {
                "$ref": "#/definitions/3/for_attribute"
              },
              {
                "$ref": "#/definitions/3/for_var"
              }
            ]
          },
          "cmd": {
            "description": "Command to run",
            "type": "string"
          },
          "task": {
            "description": "Task to run",
            "type": "string"
          },
          "vars": {
            "description": "Values passed to the task called",
            "$ref": "#/definitions/3/vars"
          }
        },
        "oneOf": [
          {"required": ["cmd"]},
          {"required": ["task"]}
        ],
        "additionalProperties": false,
        "required": ["for"]
      },
      "for_list": {
        "description": "A list of values to iterate over",
        "type": "array",
        "items": {
          "type": "string"
        }
      },
      "for_attribute": {
        "description": "The task attribute to iterate over",
        "type": "string",
        "enum": ["sources"]
      },
      "for_var": {
        "description": "Which variables to iterate over. The variable will be split using any whitespace character by default. This can be changed by using the `split` attribute.",
        "type": "object",
        "properties": {
          "var": {
            "description": "Name of the variable to iterate over",
            "type": "string"
          },
          "split": {
            "description": "String to split the variable on",
            "type": "string"
          },
          "as": {
            "description": "What the loop variable should be named",
            "default": "ITEM",
            "type": "string"
          }
        },
        "additionalProperties": false,
        "required": ["var"]
      },
      "precondition": {
        "anyOf": [
          {
            "type": "string"
          },
          {
            "$ref": "#/definitions/3/precondition_obj"
          }
        ]
      },
      "precondition_obj": {
        "type": "object",
        "properties": {
          "sh": {
            "description": "Command to run. If that command returns 1, the condition will fail",
            "type": "string"
          },
          "msg": {
            "description": "Failure message to display when the condition fails",
            "type": "string"
          }
        }
      },
      "run": {
        "type": "string",
        "enum": ["always", "once", "when_changed"]
      },
      "outputString": {
        "type": "string",
        "enum": ["interleaved", "prefixed", "group"],
        "default": "interleaved"
      },
      "outputObject": {
        "type": "object",
        "properties": {
          "group": {
            "type": "object",
            "properties": {
              "begin": {
                "type": "string"
              },
              "end": {
                "type": "string"
              },
              "error_only": {
                "description": "Swallows command output on zero exit code",
                "type": "boolean",
                "default": false
              }
            }
          }
        }
      },
      "requires_obj": {
        "type": "object",
        "properties": {
          "vars": {
            "description": "List of variables that must be defined for the task to run",
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        }
      }
    }
  },
  "allOf": [
    {
      "type": "object",
      "properties": {
        "version": {
          "description": "Specify the Taskfile format that this file conforms to.",
          "anyOf": [
            {
              "type": "number",
              "enum": [3]
            },
            {
              "type": "string",
              "enum": ["3"]
            }
          ]
        },
        "output": {
          "description": "Defines how the STDOUT and STDERR are printed when running tasks in parallel. The interleaved output prints lines in real time (default). The group output will print the entire output of a command once, after it finishes, so you won't have live feedback for commands that take a long time to run. The prefix output will prefix every line printed by a command with [task-name] as the prefix, but you can customize the prefix for a command with the prefix: attribute.",
          "anyOf": [
            { "$ref": "#/definitions/3/outputString" },
            { "$ref": "#/definitions/3/outputObject" }
          ]
        },
        "method": {
          "description": "Defines which method is used to check the task is up-to-date. (default: checksum)",
          "type": "string",
          "enum": ["none", "checksum", "timestamp"],
          "default": "checksum"
        },
        "includes": {
          "description": "Imports tasks from the specified taskfiles. The tasks described in the given Taskfiles will be available with the informed namespace.",
          "type": "object",
          "patternProperties": {
            "^.*$": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "object",
                  "properties": {
                    "taskfile": {
                      "description": "The path for the Taskfile or directory to be included. If a directory, Task will look for files named `Taskfile.yml` or `Taskfile.yaml` inside that directory. If a relative path, resolved relative to the directory containing the including Taskfile.",
                      "type": "string"
                    },
                    "dir": {
                      "description": "The working directory of the included tasks when run.",
                      "type": "string"
                    },
                    "optional": {
                      "description": "If `true`, no errors will be thrown if the specified file does not exist.",
                      "type": "boolean"
                    },
                    "internal": {
                      "description": "Stops any task in the included Taskfile from being callable on the command line. These commands will also be omitted from the output when used with `--list`.",
                      "type": "boolean"
                    },
                    "aliases": {
                      "description": "Alternative names for the namespace of the included Taskfile.",
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    },
                    "vars": {
                      "description": "A set of variables to apply to the included Taskfile.",
                      "$ref": "#/definitions/3/vars"
                    }
                  }
                }
              ]
            }
          }
        },
        "vars": {
          "description": "A set of global variables.",
          "$ref": "#/definitions/3/vars"
        },
        "env": {
          "description": "A set of global environment variables.",
          "$ref": "#/definitions/3/env"
        },
        "tasks": {
          "description": "A set of task definitions.",
          "$ref": "#/definitions/3/tasks"
        },
        "silent": {
          "description": "Default 'silent' options for this Taskfile. If `false`, can be overidden with `true` in a task by task basis.",
          "type": "boolean"
        },
        "set": {
          "description": "Enables POSIX shell options for all commands in the Taskfile. See https://www.gnu.org/software/bash/manual/html_node/The-Set-Builtin.html",
          "type": "array",
          "items": {
            "$ref": "#/definitions/3/set"
          }
        },
        "shopt": {
          "description": "Enables Bash shell options for all commands in the Taskfile. See https://www.gnu.org/software/bash/manual/html_node/The-Shopt-Builtin.html",
          "type": "array",
          "items": {
            "$ref": "#/definitions/3/shopt"
          }
        },
        "dotenv": {
          "type": "array",
          "description": "A list of `.env` file paths to be parsed.",
          "items": {
            "type": "string"
          }
        },
        "run": {
          "description": "Default 'run' option for this Taskfile. Available options: `always`, `once` and `when_changed`.",
          "$ref": "#/definitions/3/run"
        },
        "interval": {
          "description": "Sets a different watch interval when using `--watch`, the default being 5 seconds. This string should be a valid Go duration: https://pkg.go.dev/time#ParseDuration.",
          "type": "string",
          "pattern": "^[0-9]+(?:m|s|ms)$"
        }
      },
      "additionalProperties": false,
      "required": ["version"],
      "anyOf": [
        {
          "required": ["includes"]
        },
        {
          "required": ["tasks"]
        },
        {
          "required": ["includes", "tasks"]
        }
      ]
    }
  ]
}
