DOM - Document Object Model

Taskwarrior has a Document Object Model, or DOM, which defines a way to reference all the data managed by taskwarrior. You may be familiar with the DOM implemented by web browsers that let you access details on a page programmatically. For example:

document.getElementById("myAnchor").href

Taskwarrior allows the same kind of data access in a similar form, for example:

1.description

This references the description text of task 1. There is a _get helper command that queries data using a DOM reference. Let’s see it in action, by first creating a detailed task.

$ task add Buy milk due:tomorrow +store project:Home pri:H
$ task 1 info

Name          Value
------------- ------------------------------------------
ID            1
Description   Buy milk
Status        Pending
Project       Home
Priority      H
Entered       2014-09-28 21:53:59 (4 seconds)
Due           2014-09-29 00:00:00
Last modified 2014-09-28 21:53:59 (4 seconds)
Tags          store
UUID          c0ab2bf6-b4f5-45c2-8420-18ab4f1ba7e7
Urgency       16.56
                           project     1  *    1 =     1
                          priority     1  *    6 =     6
                              tags   0.8  *    1 =   0.8
                               due  0.73  *   12 =  8.76

All the attributes of that task are available via DOM references. Here are some examples:

$ task _get 1.description
Buy milk

$ task _get 1.uuid
c0ab2bf6-b4f5-45c2-8420-18ab4f1ba7e7

$ task _get c0ab2bf6-b4f5-45c2-8420-18ab4f1ba7e7.id
    1

$ task _get 1.due.year
2014

$ task _get 1.due.julian
272

Supported References

system.version

The version of taskwarrior, for example:

$ task _get system.version
2.4.0

system.os

The operating system, for example:

$ task _get system.os
FreeBSD

rc.<name>

Any configuration value default, with any overrides from the .taskrc applied, then with any command line overrides applied last. For example:

$ task _get rc.data.location
~/.task

<attribute>

Any task attribute. Note that no task ID or UUID is specified, so this variant is only useful on the command line like this:

$ task add Pay rent due:eom wait:'due - 3days'

Note that ‘due’ is a DOM reference from earlier on the command line.

<id>.<attribute>

Any attribute of the specified task ID. For example:

$ task add Fix the leak depends:3 scheduled:3.due

This makes the new task dependent on task 3, and scheduled on the due date of task 3. Note that ‘3.due’ is a DOM reference of a specific task.

<uuid>.<attribute>

Any attribute of the specified task UUID, as above.

Any attribute that is of type date can be directly accessed as a date, or it can be accessed by the elements of that date. For example:

  • <date>.year - 2.4.0 The year, for example:

    $ task _get 1.due.year
    2014
    
  • <date>.month - 2.4.0 The month, for example:

    $ task _get 1.due.month
    9
    
  • <date>.day - 2.4.0 The day of the month, for example:

    $ task _get 1.due.day
    29
    
  • <date>.week - 2.4.0 The week number of the date, for example:

    $ task _get 1.due.week
    40
    
  • <date>.weekday - 2.4.0 The numbered weekday of the date, where 0 is Sunday and 6 is Saturday. For example:

    $ task _get 1.due.weekday
    1
    
  • <date>.julian - 2.4.0 The Julian day of the date, which is the day number of the date in the year. For example, January 1st is 1, February 10th is 41. For example:

    $ task _get 1.due.julian
    272
    
  • <date>.hour - 2.4.0 The hour of the day, for example:

    $ task _get 1.due.hour
    0
    
  • <date>.minute - 2.4.0 The minute of the hour, for example:

    $ task _get 1.due.minute
    0
    
  • <date>.second - 2.4.0 The seconds of the minute, for example:

    $ task _get 1.due.second
    0
    

Tags can be accessed as a single item as an <attribute>, of the individual tags can be accessed:

  • tags.<literal> - 2.4.0 Direct access, per-tag, for example:

    $ task _get 1.tag.home
    home
    

    If the tag is present, it is shown, otherwise the result is blank, and Taskwarrior exits with a non-zero status.

    $ task _get 1.tag.DUE
    DUE
    $ task _get 1.tag.OVERDUE
    

    Workѕ for virtual tags too, in the same manner.

Annotations are compound data structures, with two elements, which are description and entry. Annotations are accessed by an ordinal.

  • annotations.<N>.description - 2.4.0 The description of the Nth annotation, for example:

    $ task _get 1.annotations.0.description

  • annotations.<N>.entry - 2.4.0 The creation timestamp of the Nth annotation, for example:

    $ task _get 1.annotations.0.entry
    

    Note that because entry is of type date, the individual elements can be addressed, as above, for example:

    $ task _get 1.annotations.0.entry.year
    2014
    

UDA values can be accessed in the same manner.