taskwarrior

package module
v0.0.0-...-37df6ff Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Feb 6, 2026 License: MIT Imports: 10 Imported by: 0

README

go-taskwarrior

GoDoc

Golang API for taskwarrior database.

Features

  • Full support for Taskwarrior JSON format
  • Custom parser for .taskrc configuration files
  • Read access to taskwarrior database
  • Adding/modifying existing tasks
  • Query tasks with filters (project, tags, status, UUIDs)
  • Field validation for Task and TaskRC structures
  • Support for all Taskwarrior fields:
    • Dates: entry, start, due, until, wait, scheduled, end, modified
    • Recurring tasks: recur, mask, imask, parent
    • Tags and annotations arrays
    • User Defined Attributes (UDAs)
    • Dependency tracking with comma-separated UUIDs
  • Comprehensive test suite with fixtures
  • Validation helpers:
    • ValidateTask() - validates required task fields
    • ValidateTaskRC() - validates configuration

Quickstart

Example program to read the current user's tasks:

package main

import (
	"github.com/errnoh/go-taskwarrior"
)

func main() {
	// Initialize new TaskWarrior instance
	tw, err := taskwarrior.NewTaskWarrior("~/.taskrc")
	if err != nil {
		panic(err)
	}

	// Fetch all tasks
	err = tw.FetchAllTasks()
	if err != nil {
		panic(err)
	}

	// Print all tasks
	tw.PrintTasks()
}
Querying Tasks

Filter tasks by project, tags, status, or UUIDs:

// Get all pending tasks from the "work" project
filter := taskwarrior.Filter{
    Project: "work",
    Status:  "pending",
}
tasks, err := tw.QueryTasks(filter)

// Get tasks with specific tags
filter := taskwarrior.Filter{
    Tags: []string{"urgent", "high"},
}
tasks, err := tw.QueryTasks(filter)

// Get tasks by UUIDs
filter := taskwarrior.Filter{
    UUIDs: []string{"uuid1", "uuid2"},
}
tasks, err := tw.QueryTasks(filter)
Adding Tasks

To add new task initialize Task object with desired values:

newTask := &taskwarrior.Task{
    Description: "Buy groceries",
    Project:     "personal",
    Priority:    "H",
    Tags:        []string{"shopping", "weekly"},
    Due:         "20260210T120000Z",
    Urgency:     5.0,
}

tw.AddTask(newTask)
tw.Commit() // Save changes
Validating Tasks

Ensure tasks and configuration are valid before saving:

// Validate a task
err := taskwarrior.ValidateTask(newTask)
if err != nil {
    panic(err)
}

// Validate TaskRC configuration
err := taskwarrior.ValidateTaskRC(tw.Config)
if err != nil {
    panic(err)
}
Task Structure

The library supports all Taskwarrior fields:

type Task struct {
    Description string  `json:"description"`
    Project     string  `json:"project,omitempty"`
    Status      string  `json:"status,omitempty"`
    Uuid        string  `json:"uuid,omitempty"`
    Urgency     float32 `json:"urgency,omitempty"`
    Priority    string  `json:"priority,omitempty"`
    Start       string  `json:"start,omitempty"`
    Due         string  `json:"due,omitempty"`
    Until       string  `json:"until,omitempty"`
    Wait        string  `json:"wait,omitempty"`
    Scheduled   string  `json:"scheduled,omitempty"`
    Recur       string  `json:"recur,omitempty"`
    Mask        string  `json:"mask,omitempty"`
    Imask       int     `json:"imask,omitempty"`
    Parent      string  `json:"parent,omitempty"`
    Modified    string  `json:"modified,omitempty"`
    Depends     string  `json:"depends,omitempty"`
    Tags        []string `json:"tags,omitempty"`
    Annotations []taskwarrior.Annotation `json:"annotations,omitempty"`
    UDA         map[string]interface{} `json:"-"`
}

For more samples see examples directory and package tests.

Documentation

Index

Constants

This section is empty.

Variables

View Source
var TASKRC = PathExpandTilda("~/.taskrc")

Default configuration path.

Functions

func GetAvailableKeys

func GetAvailableKeys() []string

Return list of available configuration options represented by TaskRC structure fields.

func PathExpandTilda

func PathExpandTilda(path string) string

Expand tilda in filepath as $HOME of current user.

func StripComments

func StripComments(line string) string

Remove commented part of input string.

func ValidateTask

func ValidateTask(task *Task) error

ValidateTask checks if the task has all required fields. Returns error if validation fails.

func ValidateTaskRC

func ValidateTaskRC(config *TaskRC) error

ValidateTaskRC checks if the TaskRC has valid configuration. Returns error if validation fails.

Types

type Annotation

type Annotation struct {
	Entry       string `json:"entry"`
	Description string `json:"description"`
}

Annotation represents a task annotation.

type Filter

type Filter struct {
	Project string   // Filter by project (e.g., "MyProject")
	Tags    []string // Filter by tags (e.g., ["urgent", "work"])
	Status  string   // Filter by status (e.g., "pending", "completed")
	UUIDs   []string // Filter by specific UUIDs (e.g., ["uuid1", "uuid2"])
}

Filter represents query parameters for filtering tasks. Used with QueryTasks() to filter exported task data.

type Task

type Task struct {
	Id          int32                  `json:"id"`
	Description string                 `json:"description"`
	Project     string                 `json:"project,omitempty"`
	Status      string                 `json:"status,omitempty"`
	Uuid        string                 `json:"uuid,omitempty"`
	Urgency     float32                `json:"urgency,omitempty"`
	Priority    string                 `json:"priority,omitempty"`
	Due         string                 `json:"due,omitempty"`
	Start       string                 `json:"start,omitempty"`
	End         string                 `json:"end,omitempty"`
	Entry       string                 `json:"entry,omitempty"`
	Until       string                 `json:"until,omitempty"`
	Wait        string                 `json:"wait,omitempty"`
	Scheduled   string                 `json:"scheduled,omitempty"`
	Recur       string                 `json:"recur,omitempty"`
	Mask        string                 `json:"mask,omitempty"`
	Imask       int                    `json:"imask,omitempty"`
	Parent      string                 `json:"parent,omitempty"`
	Modified    string                 `json:"modified,omitempty"`
	Depends     []string               `json:"depends,omitempty"`
	Tags        []string               `json:"tags,omitempty"`
	Annotations []Annotation           `json:"annotations,omitempty"`
	UDA         map[string]interface{} `json:"-"`
}

Task representation.

type TaskRC

type TaskRC struct {
	ConfigPath         string // Location of this .taskrc
	DataLocation       string `taskwarrior:"data.location"`
	DependencyTracking string `taskwarrior:"dependency.on"`
	Recall             string `taskwarrior:"recurrence"`
	RecallAfter        string `taskwarrior:"recurrence.limit"`
}

Describes configuration file entries that currently supported by this library.

func ParseTaskRC

func ParseTaskRC(configPath string) (*TaskRC, error)

Return new TaskRC struct instance that contains fields with given configuration file values.

func (*TaskRC) MapTaskRC

func (c *TaskRC) MapTaskRC(buf string) error

Map buffer values to given TaskRC struct.

type TaskWarrior

type TaskWarrior struct {
	Config *TaskRC // Configuration options
	Tasks  []Task  // Task JSON entries
}

Represents a single taskwarrior instance.

func NewTaskWarrior

func NewTaskWarrior(configPath string) (*TaskWarrior, error)

Create new empty TaskWarrior instance.

func (*TaskWarrior) AddTask

func (tw *TaskWarrior) AddTask(task *Task)

Add new Task entry to given TaskWarrior.

func (*TaskWarrior) Commit

func (tw *TaskWarrior) Commit() error

Save current changes of given TaskWarrior instance.

func (*TaskWarrior) FetchAllTasks

func (tw *TaskWarrior) FetchAllTasks() error

Fetch all tasks for given TaskWarrior with system `taskwarrior` command call.

func (*TaskWarrior) PrintTasks

func (tw *TaskWarrior) PrintTasks()

Pretty print for all tasks represented in given TaskWarrior.

func (*TaskWarrior) QueryTasks

func (tw *TaskWarrior) QueryTasks(filter Filter) ([]Task, error)

QueryTasks retrieves tasks matching the specified filters using Taskwarrior's native filtering capabilities. This is more efficient than fetching all tasks and filtering in memory.

Example:

filter := taskwarrior.Filter{Project: "work", Tags: ["urgent"]}
tasks := tw.QueryTasks(filter)

For more filter syntax, see: https://taskwarrior.org/docs/userguide/#filtering-tasks

Directories

Path Synopsis
examples
agenda-report command
basics command

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL