- Go 99.2%
- Makefile 0.8%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
BREAKING CHANGE: Task storage format changed from JSON array to JSONL (JSON Lines) format, where each task is stored as a single line of JSON. Benefits: - More efficient for large task lists (no need to parse entire file) - Better for version control (line-based diffs show individual tasks) - Simpler append operations without parsing entire file - Industry standard format for line-delimited JSON data The change includes full backwards compatibility - existing task.json files in JSON array format are automatically read and converted to JSONL on the next save operation. No manual migration required. New tests verify both JSONL and legacy JSON array format reading, as well as automatic format conversion during save operations. Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com> |
||
| .codex/skills/task | ||
| .github/workflows | ||
| cmd | ||
| internal | ||
| testdata | ||
| .gitignore | ||
| .goreleaser.yaml | ||
| go.mod | ||
| LICENSE | ||
| main.go | ||
| Makefile | ||
| README.md | ||
Task - a simple task management utility
Task is a simply task management utility written in Go. It stores its state in a JSON file that's local to each project.
Because the tasks are represented in JSON on disk, they're version controlled along with the code.
Usage
task help/task -h
Show the standard help command listing all subcommands and global arguments.
task init
Initialise the directory to use task by creating the .task/ directory and the .task/task.json.
task list
Display a list of tasks in the project. Optional arguments:
--jsonto show the full JSON structure rather than the pretty print-l/--labelto filter the list by tasks with this label-t/--typeto filter the list by tasks with this type-s/--statusto filter the by tasks with this status
task new
Create a new task. First positional argument is the task name. All tasks start as todo. New tasks are given an automatically generated 3 character hash as an ID. Optional arguments:
-d/--descriptiontaking a string for the description-l/--labeltaking a list of strings to add as labels to the task-t/--typetakingtask,bug, orfeature
When no flags are provided, task new opens $EDITOR with YAML frontmatter for the task fields and the description below it. Avoid using the bare task new form in non-interactive shells or automation, since it will block waiting for an editor.
task edit
Edit a task in $EDITOR. The editor opens with YAML frontmatter containing the task fields and the description below it. Avoid using task edit in non-interactive shells or automation, since it will block waiting for an editor.
task update
Update an existing task. The first positional argument is the task ID. Optional arguments:
-n/--nametaking a string for the task name-d/--descriptiontaking a string for the description-l/--labeltaking a list of strings to add as labels to the task-t/--typetakingtask,bug, orfeature-s/--statustakingtodo,progress,blocked,abandon, ordone
task show
Show a task in full with all of its fields and notes. First positional argument is task ID. Can be run with --json to show the full JSON structure rather than the pretty print.
task note
Append a note to the task with ID passed as the first positional argument. The second positional argument is a string that is the content of the note. Also accepts stdin for the note content. In such cases, the first positional argument is still the task ID.
Aliases
task ready->task list -s todotask take $id->task update $id -s progresstask complete $id->task update $id -s donetask block $id->task update $id -s blockedtask abandon $id->task update $id -s abandon
Schema
The schema for a task is as follows. The tasks.json file is just an array of them until we feel the need to optimise.
{
"id": "9nk", // Generated on creation
"created_at": "ISO datetime",
"updated_at": "ISO datetime", // Updated on every mutation, default DESC sort order for list
"title": "Task title",
"description": "Task description",// Optional, initialised as null
"status": "progress", // Required, initialised as todo
"labels": ["label1", "label2"], // Required, initialised as []
"notes": [ // Required, initialised at []
{
"id": "9nk-81f", // Required, initialised with task ID plus new note key
"created_at": "ISO datetime",
"content": "Note content"
}
]
}
Development
To build locally with existing tags:
make build # Builds with version from git tag
To tag and create a release:
git tag -a v1.0.0 -m "Release name"
git push origin v1.0.0
goreleaser release # Requires goreleaser and GITHUB_TOKEN