tasks-cli-rs
A powerful, Markdown-based TODO task management CLI tool written in Rust.
Implementation Status
v0.1 is implemented (see ROADMAP.md):
- Task libraries:
tasks lib add/list/use/current/remove - CRUD:
tasks new/list/show/delete - Lifecycle:
tasks start/done/cancel/status(automatic timestamps) - Field edits:
tasks set --title/--priority/--due/--tag-add/--tag-remove - Quick due dates everywhere
--due/-dis accepted (new/set/filters):today,tomorrow,+3d,+2w,fri(next such weekday),8-15(nearest future MM-DD), or fullYYYY-MM-DD - Editor:
tasks edit <id>,tasks edit --lib(auto-detection chain) - Filters:
tasks list --status/--tag/--priority/--due-before/--due-after; done/cancelled are hidden by default —--all(or an explicit--status) shows them, and--dir archive/...browses archives unfiltered - Search:
tasks search <text>; tags:tasks tag add/remove/list - Task ids: sequence number (
1,#1) or UUID short id prefix
Recurring tasks: tasks recur add/list/show/pause/resume/remove/tick
Rules live in .recurring/ inside the library and generate ordinary task
files. Dates are local calendar dates, and monthly:31 clamps to the last day
of shorter months. There is no daemon: every command materialises whatever is
due first, so missed cycles collapse into a single task for the latest one. A
new cycle is generated even when the previous instance is still open.
Build and test:
Everything below this section is the original design document; features not listed above are not yet implemented.
Overview
tasks-cli-rs is a command-line tool that treats each TODO item as a Markdown file, stored and organized on the filesystem. It provides a seamless task management experience with rich features including Kanban board view, sync support, tags, lifecycle tracking, and smart editor integration.
Features
1. Markdown-Based Task Storage
Each task is stored as an individual Markdown (.md) file. The file contains structured front matter (YAML) for metadata and free-form Markdown body for task description and notes.
Task file format example (tasks/work/implement-auth.md):
id: 550e8400-e29b-41d4-a716-446655440000
title: Implement user authentication
status: in_progress
priority: high
tags: [backend, security, auth]
created_at: 2026-07-01T09:00:00Z
started_at: 2026-07-02T10:00:00Z
due_date: 2026-07-20T23:59:59Z
completed_at: null
steps:
- - - -
Implement JWT-based authentication for the REST API.
Use RS256 algorithm. Tokens should expire after 15 minutes.
Task filesystem layout:
~/.tasks-cli/ # Default base directory
├── config.toml # Global configuration
├── libraries.toml # Registered task libraries
└── repos/
├── personal/ # A task library (project)
│ ├── .tasks-meta.toml # Library metadata
│ ├── inbox/
│ ├── work/
│ └── personal/
└── work-projects/ # Another task library
├── .tasks-meta.toml
├── feature-a/
└── bugfixes/
2. Task Library Management
A task library is a root directory containing a collection of tasks organized into subdirectories. Users can maintain multiple libraries (e.g., personal, work) and switch between them as the active default.
Commands:
# Add a new library
# List all registered libraries
# Switch the active (default) library
# Show currently active library
# Remove a library from the registry (does not delete files)
3. Task Lifecycle Management
Tasks follow a clearly defined lifecycle. Users can explicitly mark transitions.
Lifecycle states:
| Status | Description |
|---|---|
todo |
Created, not yet started |
in_progress |
Work has been started |
blocked |
Waiting on an external dependency |
in_review |
Work done, pending review |
done |
Completed |
cancelled |
Explicitly cancelled |
Commands:
# Mark a task as started (sets started_at timestamp)
# Mark a task as done (sets completed_at timestamp)
# Set arbitrary status
# Cancel a task
4. Task CRUD Operations
# Create a new task
# List tasks
# Show task details
# Delete a task
# Search tasks
5. Task Editing
Open a task's Markdown file in an external editor. The editor is selected based on the environment:
- SSH / headless environment: defaults to
$EDITORorvim - Desktop environment: auto-detects and supports VSCode (
code), Zed (zed), Neovim, etc.
Commands:
# Edit a task in the default editor
# Edit with a specific editor
# Open the task library root in an editor
Editor detection logic (priority order):
--editorCLI flagTASKS_EDITORenvironment variableeditorfield in~/.tasks-cli/config.toml$VISUALenvironment variable$EDITORenvironment variable- Auto-detection: checks if running in SSH session (
$SSH_TTY/$SSH_CONNECTION), then prefers terminal editors (vim,nano); otherwise checks for desktop editors (code,zed,nvim)
6. Tag Management
Tags are stored in the YAML front matter of each task file.
# Add tags to a task
# Remove tags from a task
# List all tags used across the active library
# List all tasks with a specific tag
7. Kanban Board View
Display tasks in a Kanban board layout in the terminal, grouped by status columns.
# Show Kanban board for active library
# Show board for a specific subdirectory
# Show board filtered by tag
# Show board with a specific set of columns
Terminal Kanban board example:
┌──────────────────┐ ┌──────────────────┐ ┌──────────────────┐
│ TODO (3) │ │ IN PROGRESS (2) │ │ DONE (5) │
├──────────────────┤ ├──────────────────┤ ├──────────────────┤
│ Fix login bug │ │ Auth impl │ │ Setup CI/CD │
│ [high] [bugfix] │ │ [backend] │ │ Write unit tests │
│ Due: 2026-07-20 │ │ Due: 2026-07-25 │ │ ... │
├──────────────────┤ ├──────────────────┤ │ │
│ Update docs │ │ Refactor DB │ │ │
│ [docs] │ │ [backend] │ │ │
├──────────────────┤ └──────────────────┘ │ │
│ Add dark mode │ │ │
│ [frontend] │ │ │
│ Due: 2026-08-01 │ │ │
└──────────────────┘ └──────────────────┘
8. Statistics and Reporting
# Show task statistics summary
# Show stats for a specific time range
# Show stats per tag
# Show completion trend (tasks done per day/week)
# Show overdue tasks
Example stats output:
Task Statistics — personal library
────────────────────────────────────
Total tasks: 47
Todo: 12
In Progress: 5
Done: 28
Cancelled: 2
Completion rate: 59.6%
Avg. completion: 3.2 days
Overdue: 3 tasks
Top tags:
backend ██████████ 18
frontend ████████ 14
bugfix █████ 9
9. Due Date Reminders
# Check for tasks due soon (default: within 3 days)
# Check for tasks due within a custom window
# List overdue tasks
# Show a summary notification (suitable for shell prompt or cron)
Integrates with the shell prompt for unobtrusive reminders:
# Add to ~/.bashrc or ~/.zshrc for prompt integration
# Displays: ⚠ 2 due $ when tasks are approaching due date
10. GitHub Repository Sync
Sync your task library with a GitHub repository, enabling collaboration and backup.
# Configure GitHub sync for a library
# Push local tasks to GitHub
# Pull tasks from GitHub
# Sync (pull then push, resolving conflicts)
# Show sync status
# Disable sync
Sync behavior:
- Uses
gitunder the hood; the task library directory is a git repository. - Each
pushcommits all changes with an auto-generated message and pushes to the configured remote branch. - Conflict resolution: file-level merge using last-write-wins by default;
--interactiveflag prompts for manual conflict resolution. - Authentication: uses SSH keys or
GH_TOKENenvironment variable viaghCLI if available.
11. WebDAV Sync
Sync your task library with any WebDAV-compatible server (Nextcloud, ownCloud, etc.).
# Configure WebDAV sync for a library
# Password is stored in system keychain (uses `keyring` crate)
# Push to WebDAV
# Pull from WebDAV
# Bidirectional sync
# Show sync status
Sync behavior:
- Uploads/downloads individual
.mdfiles. - Uses
ETag-based conflict detection to avoid overwriting newer remote changes. - Deleted files are tracked in
.tasks-meta.tomlto propagate deletions.
12. Global Configuration
Configuration is stored at ~/.tasks-cli/config.toml.
[]
= "personal"
= "%Y-%m-%d"
= "%H:%M"
[]
= "vim"
# desktop_prefer = "code" # Uncomment to prefer VSCode on desktop
[]
= 3
= true
[]
= true
= 20
= 15
[]
= false
[]
= false
13. Steps (Sub-task Management)
Steps are ordered sub-tasks within a task, stored in the YAML front matter. Each step has its own status, optional due date, and optional dependencies on other steps.
Step fields:
| Field | Required | Description |
|---|---|---|
id |
yes | Short unique identifier (e.g. s1, s2) |
title |
yes | Step description |
status |
yes | One of: todo, in_progress, done, cancelled |
due_date |
no | Step-level deadline (overrides nothing, informational) |
depends_on |
no | List of step IDs that must be done before this step can start |
Commands:
# Add a step to a task
# List steps for a task
# Update step status
# Edit step title
# Remove a step
# Reorder steps
Step progress and task completion:
# Show step progress for a task
Example output:
Task: Implement user authentication [in_progress]
Priority: high Due: 2026-07-20 Tags: backend, security
Steps: 1/4 done (25%)
━━━━━━━━━━░░░░░░░░░░░░░░░░░░░░░░░░░░░░
[done] s1: Design token schema
[in_progress] s2: Implement login endpoint (due: 2026-07-15)
[blocked] s3: Add refresh token support (blocked by: s2)
[todo] s4: Write integration tests (blocked by: s2, s3)
Behavior rules:
- Task completion percentage is auto-calculated from step statuses (done steps / total steps).
- When all steps are marked
done, the parent task status is automatically suggested to move todone(user must confirm). - A step with unmet
depends_onrequirements shows asblockedand cannot be started until all dependencies aredone. - Steps are displayed in the Kanban board, stats, and task detail views.
tasks list --stepsshows step count and completion percentage in the list output.tasks boardshows a mini progress bar for tasks that have steps.
14. Suggested Optimizations
These are recommended enhancements to improve usability and productivity:
14.1 Task Dependencies and Blocking
# Mark a task as blocked by another task
# Mark a task as depending on another (finishes-before relationship)
# Show dependency graph
- A task with unsatisfied dependencies shows a
blockedbadge. - When the blocking task is marked
done, the dependent task'sblockedstatus is auto-cleared totodo.
14.2 Task Aliases
# Create a short alias for a task
# Use alias in any command
- Aliases are stored per-library in
.tasks-meta.toml. tasks showauto-resolves slugs (derived from title), IDs, and aliases.
14.3 Natural Language Date Parsing
- Uses a date parsing library (e.g.
chrono+ custom parser) to handle relative dates.
14.4 Undo / Action Log
# Undo the last action
# Show recent action history
- Every mutation (create, delete, status change, step update) is logged to
~/.tasks-cli/history.jsonl. tasks undoreverses the last logged action.
14.5 Task Templates
# Save current task as a template
# Create a task from a template
- Templates are stored in
~/.tasks-cli/templates/. - Includes tags, steps, and default priority from the source task.
14.6 Priority Matrix View
# Show tasks in an Eisenhower matrix (urgent/important quadrants)
Example output:
┌─────────────────────────────┐ ┌─────────────────────────────┐
│ URGENT & IMPORTANT │ │ IMPORTANT, NOT URGENT │
│ DO FIRST │ │ SCHEDULE │
├─────────────────────────────┤ ├─────────────────────────────┤
│ • Fix login crash (P1) │ │ • Refactor auth module (P2) │
│ • Deploy hotfix (P1) │ │ • Write API docs (P2) │
└─────────────────────────────┘ └─────────────────────────────┘
┌─────────────────────────────┐ ┌─────────────────────────────┐
│ URGENT, NOT IMPORTANT │ │ NOT URGENT, NOT IMPORTANT │
│ DELEGATE │ │ ELIMINATE │
├─────────────────────────────┤ ├─────────────────────────────┤
│ • Respond to emails (P3) │ │ • Clean up old branches │
└─────────────────────────────┘ └─────────────────────────────┘
14.7 Task Pinning
# Pin a task to always show at top of list/board
# Unpin
# Show only pinned tasks
14.8 Time Tracking
# Start tracking time on a task
# Stop tracking
# Show time logged
# Weekly time report
- Time entries stored in task front matter as
time_entries: [{started_at, ended_at}]. - Integrates with
tasks statsfor average completion time calculations.
Installation
From crates.io
From source
Shell completion
# Bash
# Zsh
# Fish
Quick Start
# Initialize with a task library in your home directory
# Create your first task
# List tasks
# Start working on it
# Edit notes
# Mark done
# View the Kanban board
Command Reference
| Command | Description |
|---|---|
tasks new <title> |
Create a new task |
tasks did <title> |
Record an already-finished item (born done); supports --tag and -m <note> |
tasks list |
List tasks |
tasks show <id> |
Show task details |
tasks edit <id> |
Edit task in editor |
tasks start <id> |
Mark task as started |
tasks done <id> |
Mark task as done |
tasks cancel <id> |
Cancel a task |
tasks status <id> <status> |
Set task status |
tasks delete <id> |
Delete a task |
tasks search <query> |
Search tasks |
tasks tag add <id> <tag> |
Add tag to task |
tasks tag remove <id> <tag> |
Remove tag from task |
tasks tag list |
List all tags |
tasks step add <id> <title> |
Add a step to a task |
tasks step list <id> |
List steps for a task |
tasks step start <id> <step-id> |
Mark step as started |
tasks step done <id> <step-id> |
Mark step as done |
tasks step edit <id> <step-id> <title> |
Edit step title |
tasks step remove <id> <step-id> |
Remove a step |
tasks step move <id> <step-id> |
Reorder a step |
tasks board |
Show Kanban board |
tasks matrix |
Show Eisenhower priority matrix |
tasks stats |
Show statistics |
tasks remind |
Check reminders |
tasks overdue |
List overdue tasks |
tasks block <id> --by <id> |
Mark task as blocked by another |
tasks depends <id> --on <id> |
Add task dependency |
tasks deps |
Show dependency graph |
tasks alias <id> <name> |
Create task alias |
tasks pin <id> |
Pin task to top of list |
tasks unpin <id> |
Unpin task |
tasks time start <id> |
Start time tracking |
tasks time stop <id> |
Stop time tracking |
tasks time report |
Show time tracking report |
tasks template save <id> |
Save task as template |
tasks undo |
Undo last action |
tasks history |
Show action history |
tasks lib add <name> <path> |
Register a library |
tasks lib list |
List libraries |
tasks lib use <name> |
Switch active library |
tasks lib current |
Show active library |
tasks lib remove <name> |
Remove library |
tasks sync github setup |
Configure GitHub sync |
tasks sync github sync |
Sync with GitHub |
tasks sync webdav setup |
Configure WebDAV sync |
tasks sync webdav sync |
Sync with WebDAV |
tasks completions <shell> |
Generate shell completions |
Planned Features
Recently Implemented
- Steps (sub-task management) with dependencies and progress tracking
- Task dependencies (blocks / blocked-by)
- Task aliases for quick reference
- Task pinning
- Time tracking (start/stop with weekly reports)
- Priority matrix view (Eisenhower matrix)
- Undo / action log
- Task templates
Future Enhancements
- Recurring tasks (daily, weekly, monthly)
- Natural language date parsing ("next Friday", "in 2 days")
- CalDAV sync support
- TUI (Terminal User Interface) mode with full keyboard navigation
- Export to JSON, CSV, HTML
- Import from other tools (Todoist, Things, OmniFocus export formats)
- Mobile app companion (read-only sync with mobile clients)
- REST API server mode for third-party integrations
- Plugin system for custom commands and output formats
- Collaborative task sharing (multi-user sync with permissions)
Contributing
Contributions are welcome! Please open an issue or pull request on GitHub.
License
MIT License. See LICENSE for details.