Installation

Install tsk globally from npm. The package name is tskrun, but the CLI command is tsk.

terminal
npm install -g tskrun

Or run it directly without installing:

terminal
npx tskrun

Requires Node.js 18 or later. No other dependencies.

Agent Skill

Install the tsk agent skill to let AI coding agents manage tasks for you.

terminal
npx skills add tskrun/tskrun

Once installed, your AI agent can create, move, and manage tasks using tsk commands automatically.

Quick Start

Initialize a project, add tasks, move them through statuses.

~/my-project
tsk init
Initialized tsk project (prefix: TSK, storage: multi-file)
tsk add "Design landing page" --priority p1 --tag design
Created TSK-1
tsk add "Set up CI pipeline" --tag infra
Created TSK-2
tsk move TSK-1 in_progress
TSK-1 todoin_progress
tsk list
in_progress
TSK-1 Design landing page p1 design
todo
TSK-2 Set up CI pipeline infra
tsk move TSK-1 done
TSK-1 in_progressdone

Tasks live in the .tsk/ directory inside your project. Commit them alongside your code.

Commands

tsk init

Initialize a new tsk project in the current directory. Creates a .tsk/ directory with config.yml and task storage. Fails if .tsk/ already exists.

tsk init [options]
OptionDescription
--defaultsUse default config without prompting
--prefix <prefix>Task ID prefix (default: TSK)
--storage <type>multi-file (default) or single-file

tsk add <title>

Create a new task. Returns the created task ID.

tsk add "Task title" [options]
OptionDescription
-p, --priority <p>Priority: p0, p1, p2, p3
-t, --tag <tags>Comma-separated tags
-s, --status <s>Initial status (default: todo)
--parent <id>Parent task ID for subtasks
--template <name>Apply a named template from config
--by <name>Author name (default: $USER)

tsk list

List tasks with filtering, sorting, and grouping. Also available as tsk ls.

tsk list [options]
tsk ls [options]
OptionDescription
-s, --status <s>Filter by status
-p, --priority <p>Filter by priority
-t, --tag <tag>Filter by tag
--parent <id>Filter by parent task ID
--archivedShow archived tasks
--sort <field>Sort by: id, priority, status, created, updated
--descSort descending
--groupGroup output by status
Pretty TTY output groups by status by default. JSON/YAML output returns a flat array unless --group is explicitly passed.

tsk view <id>

View full details of a task, including its activity log. Accepts numeric IDs or prefixed IDs.

tsk view 1
tsk view TSK-1

tsk move <id...> <status>

Move one or more tasks to a new status. The last argument is always the target status. Supports batch moves.

tsk move 1 in_progress            # single task
tsk move 1 2 3 done               # batch move
tsk move 1 2 3 done --by agent    # with attribution
OptionDescription
--by <name>Author name (default: $USER)

tsk edit <id>

Update fields on an existing task.

tsk edit 1 [options]
OptionDescription
--title <title>New title
-p, --priority <p>New priority
-t, --tag <tags>Set tags (comma-separated)
-s, --status <s>New status
--parent <id>New parent task ID
--by <name>Author name (default: $USER)

tsk note <id> <message>

Add a note to a task. Notes appear in the task's activity log.

tsk note 1 "Found a bug in the parser"
tsk note 1 "Blocked on API changes" --by claude
OptionDescription
--by <name>Author name (default: $USER)

tsk log

Show the activity log across all tasks, sorted newest first.

tsk log [options]
OptionDescription
-n, --limit <n>Number of entries to show (default: 20)

tsk archive [id]

Archive a single task or all completed tasks. Archived tasks are hidden from tsk list by default.

tsk archive 1            # archive task 1
tsk archive --done       # archive all done tasks
tsk archive 1 --undo     # unarchive task 1
OptionDescription
--doneArchive all tasks with done status
--undoUnarchive the specified task
--by <name>Author name (default: $USER)
Use tsk list --archived to view archived tasks.

tsk rm <id>

Permanently remove a task. This cannot be undone.

tsk rm 1

tsk summary

Show a project summary with task counts by status.

tsk summary
tsk summary --json

JSON output shape:

{
  "total": 5,
  "statuses": {
    "todo": 2,
    "in_progress": 1,
    "review": 1,
    "done": 1
  }
}

tsk web

Launch a local web dashboard for your task board. Opens in your default browser.

tsk web [options]
OptionDescription
--port <number>Port number (default: 3456)

The dashboard provides a read-only board view served at http://localhost:3456 with a JSON API at /api/data.

Output Formats

tsk auto-detects whether stdout is a TTY and adjusts its output accordingly.

ContextBehavior
TTY (terminal)Pretty, colorized output with status grouping
Piped / non-TTYJSON output for machine consumption
--jsonForce JSON output regardless of context
--yamlForce YAML output regardless of context
--quietMinimal output (IDs only)

These global flags work with any command. This makes tsk easy to compose with other tools:

# pipe to jq
tsk list --json | jq '.[] | select(.priority == "p0")'

# grab just the ID of a new task
NEW_ID=$(tsk add "Fix bug" --quiet)

# export as YAML
tsk list --yaml > tasks.yml

Task Model

Every task has the following fields.

FieldDescription
idSequential integer, auto-incremented from a counter in config.yml
titleShort description of the task
statusCurrent status (see below)
priorityOptional priority level (see below)
tagsArray of string labels
parentOptional parent task ID for subtask relationships
byAuthor who last modified the task
createdISO 8601 creation timestamp
updatedISO 8601 last-modified timestamp
archivedBoolean, set by tsk archive
activityAppend-only log of all changes and notes

IDs

Task IDs are sequential integers. Commands accept both the bare number and the prefixed form. With the default prefix TSK, task 1 can be referenced as 1 or TSK-1. The prefix is set during tsk init and stored in .tsk/config.yml.

Statuses

The default status workflow:

StatusMeaning
todoNot started (default for new tasks)
in_progressActively being worked on
reviewAwaiting review or feedback
doneCompleted

Priorities

Four priority levels, from highest to lowest:

PriorityMeaning
p0Critical / blocking
p1High priority
p2Medium priority
p3Low priority / nice-to-have

Priority is optional. Tasks without a priority are unranked.

Tags

Tags are free-form string labels. Pass multiple tags as a comma-separated list:

tsk add "API endpoint" --tag backend,api,v2

Filter by tag with tsk list --tag backend.

Parent Tasks

Tasks can reference a parent to create subtask hierarchies:

tsk add "Implement auth" --parent 1

Filter subtasks with tsk list --parent 1.

Activity Tracking

Every mutation is recorded in the task's activity array as an append-only log. Entries include a timestamp, action type, author, and optional detail.

The --by flag

All mutation commands (add, move, edit, note, archive) accept --by <name> to attribute the change. Defaults to $USER from the environment.

tsk move 1 done --by claude
tsk note 1 "Shipped to production" --by deploy-bot

This is useful for distinguishing human vs. automated changes, or tracking which team member made each update.

Notes

Use tsk note to add freeform commentary to a task. Notes are stored as note entries in the activity log and appear when viewing the task with tsk view.

Activity Log

Use tsk log to see recent activity across all tasks. Each entry shows the timestamp, task ID, action, author, and detail.

Example activity entries inside a task file:

activity:
  - timestamp: "2026-01-15T10:30:00.000Z"
    action: created
    by: vikas
  - timestamp: "2026-01-15T12:00:00.000Z"
    action: moved
    by: claude
    detail: "todo → in_progress"
  - timestamp: "2026-01-15T14:20:00.000Z"
    action: note
    by: claude
    detail: "Started implementation, found edge case"

Storage

All data lives in the .tsk/ directory at your project root. There are two storage backends.

Multi-file (default)

Each task is a separate YAML file. This produces clean git diffs and avoids merge conflicts when multiple people work on different tasks.

.tsk/ config.yml # project settings, ID counter tasks/ 1.yml # task 1 2.yml # task 2 3.yml # task 3

Single-file

All tasks in one file. Simpler for small projects or scripting use cases.

.tsk/ config.yml # project settings, ID counter tasks.yml # all tasks in one file

Choose the storage type during tsk init:

tsk init --storage multi-file   # default
tsk init --storage single-file

Both backends use atomic writes (temporary file + rename) to prevent data corruption.

Config file

The .tsk/config.yml file stores project-level settings: the ID prefix, storage type, status definitions, templates, and the auto-increment counter.

Web Dashboard

Run tsk web to launch a local web dashboard that displays your task board in a browser.

terminal
tsk web
Dashboard running at http://localhost:3456
Press Ctrl+C to stop
  • Serves on port 3456 by default (override with --port)
  • Opens your default browser automatically
  • Read-only board view of all non-archived tasks
  • JSON API available at /api/data
  • No external dependencies -- self-contained HTML served by a Node HTTP server

Exit Codes

tsk uses structured exit codes for scripting and CI integration.

CodeMeaning
0Success
1General error
2Task not found
3Invalid field value
4Configuration or project error