Command Line Task Management

Introduction

If using a terminal and working from the command line is where you like to live, then you might want to consider also trying out a command line based task management tool like TaskWarrior.

It's open-source and fairly feature rich consider it's a non-gui tool.

You can install on macOS using:

brew install task

If you need help using the tool, then their website has some good documentation. But I found using either:

task help

Or:

man task

This (for me) was more useful in getting up and running quickly. I know there are 'quickstart' style guides available from their site. But sometimes just getting stuck in and playing around can getting you using a tool like this in a 'practical' sense much more quickly.

Adding

List any tasks already created:

task list

To create a new task with the description "this is my task":

task add +foo this is my task

Note: no quotes around the description are necessary

If you need to tag your task as well, use the + modifier:

task add +foo this is my task

If you want to filter your tasks by tag, again use the + modifier:

task list +foo

Completing

You can mark a task as being 'done' by specifying the task's ID (you'll find a task's ID within the ID column of the output shown when executing task list), which is just an incrementing integer starting from 1. This means that your first task will have an ID of 1 and we can mark that task done like so:

task done 1

It's important to know that for most commands you can swap the task ID and the subcommand being specified. So task list 1 is the same as task 1 list. Use whatever makes more sense to you. I'm more used to task <subcommand> <id>

Any tasks that are marked 'done' move into a separate completed area, which you can view:

task completed

Similarly you can filter that completed list of tasks with tags:

task completed +foo

Note: task IDs are reused when tasks are marked 'done'
but each task also gets a UUID (unique user id)
you'll see this UUID in the task completed view

Modifying

To modify your task, specify the task id (e.g. 1):

task modify 1 this will replace my previous task description

Note: not specifying a tag doesn't affect tags already applied

If you want to add a new tag on a task, use modify again:

task modify 1 +some_new_tag

Note: adding new tags, doesn't affect existing tags

You can remove tags by using the - modifier:

task modify 1 -some_new_tag

You can use the append command instead of modify to tweak your description without having to rewrite it completely:

task append 1 some text to add to end of existing description

Similarly there is the prepend command:

task prepend 1 some text to add to beginning of existing description

So imagine we created a new task and used both append and prepend:

task add foo
task append bar
task prepend baz

When we list the task we'd see the task description as:

baz foo bar

If the modify command isn't flexible enough, then you can go direct to the stored data with the edit command (but rarely do I use this particular feature over modify):

task edit 1

Note: uses editor assigned to $EDITOR

Deleting

To delete a task that you've realised you're not going to work on:

task delete 1

The delete command will check you're sure you want to delete:

Delete task 1 'this is my task'? (yes/no)

Note: a deleted task doesn't show in the task completed list

Priorities

A priority can be set using the priority attribute. The value for this attribute can be set to H (High), M (Medium) and L (Low).

Setting a priority affects the position of the task in the list. Setting a task to a low priority also affects the colour of the task so it becomes more obvious 'at a glance' what's important.

task add priority:H some important task

Blockers

In the real world we find our tasks can be blocked by other tasks all the time. You can use the depends attribute to indicate another task that is blocking an existing task:

task modify 1 depends:2

Doing this will move task 1 to the bottom of the task list and when using task list we will now find a D column that again helps us to identify what tasks are blocked 'at a glance'. Also, any task that is now 'depended' on will become highlighted and moved to the top of the task list, again to indicate its urgency.

This means you can also use the following commands to filter out only those tasks that have been explicitly blocked or that are blocking:

task blocked
task blocking

If you need to remove a dependency link, then specify the depends attribute without a value:

task modify 1 depends:

Performance

Here are some features I've not yet fully explored, but seem interesting as a way to include data that is typically more related to full task management GUIs.

Summary

TaskWarrior can show a report of aggregated task status by project:

task summary

Project Remaining Avg age Complete 0%                        100%
(none)          5      1d      64%                               

1 projects

Timesheet

TaskWarrior can show a weekly report of tasks completed and started:

task timesheet

2016-12-18 - 2016-12-24
  Completed (0 tasks)
  Started (0 tasks)

Note: I was holiday that week ^ hence no tasks :-)

This command starts with the current week and works backwards. So as an example, the following will show the last two weeks timesheet:

task timesheet 2

Burndowns

TaskWarrior can show a graphical burndown chart by the day, week or month.

task burndown.daily

Note: there is also .weekly & .monthly
but I like using .daily

History

For a shorter/clearer breakdown of tasks (added/completed/deleted):

task history.monthly

According to the man task:

Shows all data and metadata for the specified tasks. This is the only means of displaying all aspects of a given task, including the change history

Conclusion

I used to use TaskWarrior a looong time ago and have recently come back to it to find it has improved a lot and added some really cool features that weren't there when I last used it.

The reason I stopped though was because there's something tangible when dealing with a paper list. It's hard to explain. So I'm not sure if I'll ultimately find myself gravitating towards that method again in the future?

I hope not, because other than the inability to articulate why I went back to paper it seems there should not be a preference for that over TaskWarrior (considering how much I love working from the command line).


Links