busiless
busiless is a simple task tracking and auto-prioritization tool. Using a directory of arbitrarily organized files, each with a simple front matter header, busiless is able to:
-
Generate visual dependency graphs based on dependency information in task headers.
-
Generate a task priority list based on task dependencies.
busiless aims to be lightweight, service-less, and flexible. Tasks themselves can be any arbitrary file format, including markdown or text, and can be named and organized arbitrarily according to project needs.
Task Files
All task files are discovered recursively within a particular directory, which
is considered to be the root directory. Task files are all files containing a
front matter with a field type: task
. Any other file is
ignored.
Identifying Tasks
Task files are identified by their absolute path relative to the root directory.
For example, given ./tasks
as the root search directory, a file at
./tasks/milestone1/fix-bug.txt
will have the ID /milestone1/fix-bug.txt
.
The root directory can be specified using the BUSILESS_ROOT
environment
variable, or on the command-line using the -r
/--root
argument.
When one task refers to another it can also use a relative path, relative from itself.
Task Metadata
As mentioned, a task file must have a type: task
field/value in its front
matter. It may also have these optional fields which provide additional
metadata:
-
after
- An array of task identifiers which a task depends on. Elements in the array can also use doublestar patterns to match multiple tasks using wildcards. -
status
- An arbitrary string indicating the current status of a task. Task status can be used to filter out tasks when executing commands. -
weight
- An arbitrary number which will be used during prioritization to break ties between two tasks. If not given then a value of 10 is assumed.
Installation and Usage
busiless can be installed using go install
:
go install dev.mediocregopher.com/busiless.git/cmd/busiless
The binary provides multiple sub-commands, each providing different functionality.
prioritize
The prioritize
sub-command will analyze all task files in a task set and
produce a list of tasks which should be worked on next, ordered by their
relative "total weights".
Tasks which can be worked on next are those which don't depend on any other
tasks, as determined by their after
metadata field.
The "total weight" of each task is determined by adding the task's weight
to
the total weights of all tasks which depend on it. In effect a higher total
weight indicates that more tasks depend on the task being completed.
Example Usage
> busiless prioritize --root ./tasks --ignore-status done
0) /mvp/cli/base.txt (30)
1) /mvp/dag.txt (30)
2) /mvp/license.txt (10)
visualize
The visualize
sub-command will generate an SVG depicting the dependency graph
of a set of tasks. This can be useful for understanding a task set at a high
level, as well as to help identify and untangle dependency cycles.
Example Usage
> busiless visualize --root ./tasks --pattern '/mvp/**' > mvp.svg
Example
A set of example task files can be found under the ./tasks
directory in this
project.