id = "taskwarrior" name = "Taskwarrior" homepage = "https://taskwarrior.org" description = "Taskwarrior is Free and Open Source Software that manages your TODO list from the command line." # `task` is also the binary of go-task, whose configuration is a Taskfile.yml # committed to a repository and never anything under the user's home. This # entry is Taskwarrior's, which is the one with a per-user config file. executables = ["task"] [dotfiles] # taskrc(5) FILES: "$HOME/.taskrc", and "Additionally, if no ~/.taskrc exists, # taskwarrior will check if the XDG_CONFIG_HOME environment variable is # defined", reading $XDG_CONFIG_HOME/task/taskrc — the configuration base # directory, written as `[configHome]` so the variable is honoured instead of # the specification's default being hard-coded. paths = [ "~/.taskrc", "[configHome]/task/taskrc", ] # ~/.task is the task database, not configuration — taskrc(5) on # data.location: "This is a path to the directory containing all the # Taskwarrior data." exclude = ["~/.task/"] # Taskwarrior holds no credential file of its own. The man page's SYNC section # names no configuration variables at all, so there is no stored sync # credential to lift out either. secret = [] # All three name a filesystem location on this machine, but not for the same # reason, so they are two rules. Both spellings of the file on each, or a rule # stops running the moment the user switches to the XDG location. # # taskrc(5), data.location: "This is a path to the directory containing all the # Taskwarrior data. By default, it is set up to be ~/.task", and # hooks.location: "This is a path to the hook scripts directory. By default it # is ~/.task/hooks" — a user who moved either wrote an absolute path to this # disk, and that is exactly what they would want back when rebuilding it. [[dotfiles.machine_lines]] file = ["~/.taskrc", "[configHome]/task/taskrc"] match = { prefix = ["data.location", "hooks.location"] } scope = "backup" # `include` pulls in a theme or a fragment by path, and the themes ship with # the package, so where they sit differs with the package manager that # installed Taskwarrior — a fact about the kind of machine, the same on every # box of that OS and architecture. [[dotfiles.machine_lines]] file = ["~/.taskrc", "[configHome]/task/taskrc"] match = { prefix = ["include"] } scope = "platform" [commands] format = 1 label = "Taskwarrior" description = "Add tasks and list them with a filter. Taskwarrior has no command-line flags of its own for these jobs: everything is positional words. Modifications, annotations and rc overrides are left out." quality = "ai-draft" parser = { end_of_options = "--", interleave = "permute", long_equals = true, short_attached = false, short_bundles = false } [[commands.source]] id = "manual" kind = "manual" url = "https://taskwarrior.org/docs/" revision = "2026-10" evidence = """task add task list task next""" [[commands.subcommand]] path = ["add"] label = "Add a task" description = "Create a task from a description. Attributes such as project:Home or due:tomorrow can be typed into the description." [[commands.subcommand.source]] id = "manual" kind = "manual" url = "https://taskwarrior.org/docs/" revision = "2026-10" evidence = """task add """ [[commands.subcommand.field]] id = "description" label = "Description and attributes" description = "Words after add. Example: Buy milk project:Home due:tomorrow" type = "string" position = 0 multiple = true min = 1 sources = ["manual"] [[commands.subcommand.task]] id = "add" label = "Add a task" fields = ["description"] required = ["description"] [[commands.subcommand.group]] id = "basic" label = "Basic" fields = ["description"]