Skip to content

CLI Guide

Complete reference for using taskmd from the command line.

Command Reference

Quick Reference

CommandDescription
listList tasks in a quick textual format
getGet detailed information about a specific task
setSet a task's frontmatter fields
nextRecommend what task to work on next
validateLint and validate tasks
graphExport task dependency graph
boardDisplay tasks grouped in a kanban-like board view
statsShow computed metrics about tasks
tagsList all tags with task counts
snapshotProduce a frozen, machine-readable representation of tasks
reportGenerate a comprehensive project report
tracksShow parallel work tracks based on scope overlap
feedShow a chronological activity feed of task changes
archiveArchive or delete completed/cancelled tasks
rmDelete a task file permanently
deduplicateDetect and resolve duplicate task IDs
next-idShow the next available task ID
addCreate a new task file with proper frontmatter
searchFull-text search across task titles and bodies
templatesList and manage task templates
verifyRun verification checks for a task
statusShow in-progress tasks or get metadata for a specific task
contextShow file context for a task
worklogView or add worklog entries for a task
importImport tasks from external sources
specGenerate the taskmd specification file
syncSync tasks from external sources
webWeb dashboard commands
initInitialize a project with agent configuration and spec files
commit-msgGenerate conventional commit messages from task metadata
mcpStart MCP server over stdio
todosFind TODO/FIXME comments in source code
phasesList project phases with progress stats
projectsList and manage registered projects
completionGenerate shell completion scripts

list - View and Filter Tasks

Display tasks in various formats with filtering and sorting.

Basic usage:

bash
# List all tasks
taskmd list

# List tasks in specific directory
taskmd list ./tasks

# Different output formats
taskmd list --format table   # Default
taskmd list --format json
taskmd list --format yaml

Filtering:

bash
# Filter by status
taskmd list --filter status=pending
taskmd list --filter status=in-progress

# Filter by priority
taskmd list --filter priority=high

# Filter by multiple criteria (AND logic)
taskmd list --filter status=pending --filter priority=high

# Filter by tag
taskmd list --filter tag=cli

# Filter by effort
taskmd list --filter effort=small

Sorting:

bash
# Sort by priority
taskmd list --sort priority

# Sort by status
taskmd list --sort status

# Sort by created date
taskmd list --sort created

Custom columns:

bash
# Show specific columns
taskmd list --columns id,title,status

# Show more columns
taskmd list --columns id,title,status,priority,effort,deps

Limiting results:

bash
# Show only 5 tasks
taskmd list --sort priority --limit 5

Flags:

FlagDefaultDescription
--filterFilter tasks (repeatable, AND logic)
--phaseFilter tasks by phase name
--sortSort by field (id, title, status, priority, effort, created)
--columnsid,title,status,priority,fileComma-separated list of columns to display
--limit0Maximum number of tasks to display (0 = unlimited)
--formattableOutput format (table, json, yaml)

Examples:

bash
# High-priority pending tasks
taskmd list --filter status=pending --filter priority=high

# Small tasks (quick wins)
taskmd list --filter effort=small --filter status=pending

# All CLI-related tasks
taskmd list --filter tag=cli --sort priority

# Top 5 by priority
taskmd list --sort priority --limit 5

# Export to JSON for scripting
taskmd list --format json > tasks.json

# Filter by phase
taskmd list --phase v0.2

validate - Check Task Files

Validate task files for errors and consistency issues.

bash
# Validate all tasks
taskmd validate

# Validate specific directory
taskmd validate ./tasks

# Strict mode (enable warnings)
taskmd validate --strict

# JSON output
taskmd validate --format json

Flags:

FlagDefaultDescription
--formattextOutput format (text, table, json)
--strictfalseEnable strict validation with additional warnings

What it checks:

  • Required fields present (id, title, status)
  • Valid field values
  • Duplicate task IDs
  • Missing dependencies (references to non-existent tasks)
  • Circular dependencies
  • YAML syntax errors

Exit codes:

  • 0 - Valid (no errors)
  • 1 - Invalid (errors found)
  • 2 - Valid with warnings (strict mode only)

next - Find What to Work On

Analyze tasks and recommend the best ones to work on next.

taskmd scores tasks based on:

  • Priority: High priority scores higher
  • Critical path: Tasks on the critical path score higher
  • Downstream impact: Tasks blocking many others score higher
  • Effort: Smaller tasks get a boost (quick wins)
  • Phase proximity: Tasks in phases with nearer due dates score higher
  • Actionability: Only tasks with satisfied dependencies
bash
# Get top 5 recommendations
taskmd next

# Get top 3 recommendations
taskmd next --limit 3

# Next high-priority task
taskmd next --filter priority=high

# Next small task (quick win)
taskmd next --filter effort=small --limit 1

# Show only quick wins (effort: small)
taskmd next --quick-wins

# Show only critical path tasks
taskmd next --critical --limit 1

# Next task for a specific phase
taskmd next --phase v0.2

# JSON for automation
taskmd next --format json

Flags:

FlagDefaultDescription
--formattableOutput format (table, json, yaml)
--limit5Maximum number of recommendations
--filterFilter tasks (repeatable, e.g. --filter tag=cli)
--phaseFilter recommendations by phase name
--quick-winsfalseShow only quick wins (effort: small)
--criticalfalseShow only critical path tasks

graph - Visualize Dependencies

Export task dependency graphs in various formats.

bash
# ASCII art (terminal-friendly)
taskmd graph --format ascii

# Mermaid diagram
taskmd graph --format mermaid

# Graphviz DOT
taskmd graph --format dot

# JSON structure
taskmd graph --format json

Filtering:

bash
# Exclude completed tasks (default)
taskmd graph

# Include all tasks
taskmd graph --all

# Exclude specific statuses
taskmd graph --exclude-status completed --exclude-status blocked

Focus on specific tasks:

bash
# Show task and its dependencies (upstream)
taskmd graph --root 022 --upstream

# Show task and what depends on it (downstream)
taskmd graph --root 022 --downstream

# Show full subgraph
taskmd graph --root 022

Filter and highlight:

bash
# Filter by task attributes
taskmd graph --filter priority=high
taskmd graph --filter tag=cli --exclude-status completed

# Highlight a specific task
taskmd graph --focus 022 --format mermaid

Flags:

FlagDefaultDescription
--formatasciiOutput format (mermaid, dot, ascii, json)
--exclude-statuscompletedExclude tasks with status (repeatable)
--allfalseInclude all tasks (overrides --exclude-status)
--rootStart graph from specific task ID
--upstreamfalseShow only dependencies (ancestors)
--downstreamfalseShow only dependents (descendants)
--focusHighlight specific task ID
--filterFilter tasks (repeatable, AND logic)
--out, -oWrite output to file

Output to file:

bash
taskmd graph --format mermaid --out deps.mmd
taskmd graph --format dot --out deps.dot

# Generate PNG with Graphviz
taskmd graph --format dot | dot -Tpng > graph.png

stats - Project Metrics

Display computed statistics about your task set.

bash
# Show all statistics
taskmd stats

# Specific directory
taskmd stats ./tasks

# JSON output
taskmd stats --format json

Flags:

FlagDefaultDescription
--formattableOutput format (table, json, yaml)
--group-byGroup stats by field (e.g., phase)

Metrics provided:

  • Total tasks and count by status
  • Priority breakdown
  • Effort breakdown
  • Blocked tasks count
  • Completion rate
  • Critical path length
  • Max dependency depth
  • Average dependencies per task

board - Kanban View

Display tasks grouped by a field in a board layout.

bash
# Group by status (default)
taskmd board

# Group by priority
taskmd board --group-by priority

# Group by effort
taskmd board --group-by effort

# Group by tag
taskmd board --group-by tag

# Group by phase
taskmd board --group-by phase

# Output formats
taskmd board --format md    # Markdown (default)
taskmd board --format txt   # Plain text
taskmd board --format json  # JSON

# Output to file
taskmd board --out board.md

Flags:

FlagDefaultDescription
--formatmdOutput format (md, txt, json)
--group-bystatusField to group by (status, priority, effort, type, group, tag, phase)
--out, -oWrite output to file

snapshot - Machine-Readable Export

Produce a static, machine-readable representation for automation.

bash
# Full snapshot (JSON)
taskmd snapshot

# Core fields only
taskmd snapshot --core

# Include derived analysis
taskmd snapshot --derived

# Output formats
taskmd snapshot --format json
taskmd snapshot --format yaml
taskmd snapshot --format md

# Grouping
taskmd snapshot --group-by status
taskmd snapshot --group-by priority

# Output to file
taskmd snapshot --out snapshot.json

Flags:

FlagDefaultDescription
--formatjsonOutput format (json, yaml, md)
--corefalseOutput only core fields (id, title, dependencies)
--derivedfalseInclude computed/derived fields (blocked status, depth, topological order)
--group-byGroup tasks by field (status, priority, effort, type, group)
--out, -oWrite output to file

get - View Task Details

Alias: show is a deprecated alias for get. Use get instead.

Display detailed information about a specific task, identified by ID, title, or file path.

Matching priority:

  1. Exact match by task ID (case-sensitive)
  2. Exact match by task title (case-insensitive)
  3. Match by file path or filename
  4. Fuzzy match across IDs and titles (unless --exact is set)
bash
# Look up by task ID
taskmd get cli-037

# Look up by title
taskmd get "Add show command"

# Look up by file path
taskmd get tasks/cli/037-task.md

# Fuzzy search
taskmd get sho

# Strict lookup — fail if no exact match
taskmd get sho --exact

Flags:

FlagDefaultDescription
--formattextOutput format (text, json, yaml)
--exactfalseDisable fuzzy matching
--threshold0.6Fuzzy match sensitivity (0.0–1.0)
--raw-markdownfalseDisplay raw markdown without formatting
--contextfalseInclude context files in output

set - Update Task Fields

Alias: update is a deprecated alias for set. Use set instead.

Modify a task's frontmatter fields by ID.

bash
# Change status
taskmd set 042 --status in-progress

# Change priority and effort
taskmd set 042 --priority high --effort large

# Mark as completed (shortcut)
taskmd set 042 --done

# Preview changes without writing
taskmd set 042 --priority critical --dry-run

# Set phase
taskmd set 042 --phase v0.2

# Clear phase
taskmd set 042 --phase ""

Flags:

FlagDefaultDescription
[task-id]Task ID as positional argument
--task-idTask ID to update (alternative to positional)
--statusNew status (pending, in-progress, in-review, completed, blocked, cancelled)
--priorityNew priority (low, medium, high, critical)
--effortNew effort (small, medium, large)
--ownerOwner/assignee
--parentParent task ID (empty string to clear)
--phasePhase name (empty string to clear)
--donefalseAlias for --status completed
--dry-runfalsePreview changes without writing to disk
--add-tagAdd a tag (repeatable)
--remove-tagRemove a tag (repeatable)
--add-prAdd a PR URL (repeatable)
--remove-prRemove a PR URL (repeatable)
--add-touchesAdd a scope identifier to touches (repeatable)
--remove-touchesRemove a scope identifier from touches (repeatable)
--typeWork type (feature, bug, improvement, chore, docs)
--depends-onSet dependencies (comma-separated IDs, e.g. 010,015)
--verifyfalseRun verification checks before completing a task

Tag management:

bash
# Add tags
taskmd set 042 --add-tag backend --add-tag api

# Remove a tag
taskmd set 042 --remove-tag deprecated

# Add and remove in one command
taskmd set 042 --add-tag v2 --remove-tag v1

Scope (touches) management:

bash
# Add scopes
taskmd set 042 --add-touches cli/graph --add-touches cli/output

# Remove a scope
taskmd set 042 --remove-touches cli/graph

tags - List Tags

Display all tags used across task files with usage counts.

bash
# List all tags
taskmd tags

# List tags in specific directory
taskmd tags ./tasks

# Tags used by pending tasks only
taskmd tags --filter status=pending

# JSON output
taskmd tags --format json

Flags:

FlagDefaultDescription
--formattableOutput format (table, json, yaml)
--filterFilter tasks before aggregating (repeatable)

archive - Archive Completed Tasks

Move completed or cancelled task files into an archive/ subdirectory, or permanently delete them.

bash
# Archive all completed tasks
taskmd archive --all-completed -y

# Archive all cancelled tasks
taskmd archive --all-cancelled -y

# Archive specific tasks by ID
taskmd archive --id 042 --id 043 -y

# Preview what would be archived
taskmd archive --all-completed --dry-run

# Permanently delete cancelled tasks
taskmd archive --all-cancelled --delete -f

Flags:

FlagDefaultDescription
--idArchive task(s) by ID (repeatable)
--statusArchive tasks matching this status
--all-completedfalseArchive all completed tasks
--all-cancelledfalseArchive all cancelled tasks
--tagArchive tasks with this tag
--dry-runfalsePreview changes without making them
--yes, -yfalseSkip confirmation prompt
--deletefalsePermanently delete instead of archive
--force, -ffalseSkip confirmation for delete

rm - Delete a Task

Permanently delete a task file by ID. Displays the task details and asks for confirmation before deleting.

bash
# Delete a task (with confirmation prompt)
taskmd rm 042

# Skip confirmation
taskmd rm 042 --force

# Preview what would be deleted
taskmd rm 042 --dry-run

Flags:

FlagDefaultDescription
--force, -ffalseSkip confirmation prompt
--dry-runfalsePreview what would be deleted without acting

deduplicate - Resolve Duplicate IDs

Detect and resolve duplicate task IDs that can occur when multiple contributors create tasks on separate branches.

For each collision, the oldest task (by created date) keeps its original ID. Newer tasks get reassigned a fresh ID, with file renames and cross-reference updates applied automatically.

bash
# Detect and fix duplicates
taskmd deduplicate

# Scan a specific directory
taskmd deduplicate ./tasks

# Preview changes without modifying files
taskmd deduplicate --dry-run

# Skip interactive prompts for ambiguous references
taskmd deduplicate --no-interactive

# JSON output
taskmd deduplicate --format json

Flags:

FlagDefaultDescription
--dry-runfalsePreview changes without modifying files
--formattextOutput format (text, json)
--no-interactivefalseSkip interactive prompts for ambiguous references

next-id - Get Next Available ID

Scan task files and output the next available sequential ID. Finds the highest numeric ID and returns max + 1, preserving any common prefix and zero-padding.

bash
# Get next ID
taskmd next-id

# Scan specific directory
taskmd next-id ./tasks/cli

# JSON output with metadata
taskmd next-id --format json

Flags:

FlagDefaultDescription
--formatplainOutput format (plain, json)

Scripting example:

bash
# Create a new task file with the next ID
ID=$(taskmd next-id)
echo "---
id: \"$ID\"
title: \"My new task\"
status: pending
---" > "tasks/${ID}-my-new-task.md"

commit-msg - Generate Commit Messages

Generate a conventional commit message derived from task metadata.

When --task-id is provided, the message is generated from that task. When no --task-id is provided, the command inspects staged changes (git diff --cached) to find task files whose status changed to completed and generates a message from those tasks automatically.

The subject line format is type(scope): lowercase title (task ID), where the scope is the task's group directory (if any).

bash
# Generate message for a specific task
taskmd commit-msg --task-id 042

# Use a custom commit type
taskmd commit-msg --task-id 042 --type feat

# Include completed subtasks as bullet points in the body
taskmd commit-msg --task-id 042 --body

# Subject line only (no body)
taskmd commit-msg --task-id 042 --short

# Auto-detect completed tasks from staged changes
taskmd commit-msg

# Use with git commit
git commit -m "$(taskmd commit-msg --task-id 042)"

Flags:

FlagDefaultDescription
--task-idTask ID to generate the message for (omit to auto-detect from staged changes)
--typechoreCommit type prefix (feat, fix, chore, docs, test, refactor)
--bodyfalseInclude completed subtasks (- [x]) as bullet points in the commit body
--shortfalseOutput the subject line only (no body)

Auto-detection:

When --task-id is omitted, the command runs git diff --cached and looks for task files where +status: completed appears in the diff. It then generates a commit message from all matched tasks. If multiple tasks are found, the subject line lists all task IDs (e.g., chore: complete tasks 042, 043).

add - Create a New Task

Create a new task markdown file with proper frontmatter. The title is used to generate both the task title and the filename slug. A sequential ID is automatically assigned based on existing tasks.

bash
# Create a task with just a title
taskmd add "Fix the login bug"

# Set priority and tags
taskmd add "Implement OAuth" --priority high --tags backend,auth

# Create in a subdirectory group
taskmd add "Design mockups" --group design --effort large

# Open in $EDITOR after creation
taskmd add "Quick fix" --edit

# With dependencies
taskmd add "Deploy to staging" --depends-on 041,042

# Create with phase
taskmd add "Implement OAuth" --phase v0.2

# Custom filename slug
taskmd add "Fix the login bug" --slug fix-login

# JSON output for scripting
taskmd add "Automated task" --format json

Flags:

FlagDefaultDescription
--prioritymediumTask priority (low, medium, high, critical)
--effortTask effort (small, medium, large)
--tagsComma-separated tags
--statuspendingTask status (pending, in-progress, completed, blocked, cancelled)
--ownerTask owner/assignee
--depends-onComma-separated dependency task IDs
--parentParent task ID
--phasePhase name
--groupSubdirectory to create the task in
--slugCustom filename slug (default: auto-generated from title)
--formatplainOutput format (plain, json)
--editfalseOpen the new task in $EDITOR
--templateUse a task template (e.g., bug, feature, chore)

Templates:

bash
# Create from a template
taskmd add "Login fails on Safari" --template bug
taskmd add "Dark mode support" --template feature --priority high

templates - Manage Task Templates

List and inspect task templates used by the add command. Templates are discovered from three sources in precedence order: project (.taskmd/templates/), user (~/.taskmd/templates/), and built-in.

bash
# List available templates
taskmd templates list

# JSON output
taskmd templates list --format json

# YAML output
taskmd templates list --format yaml

Flags:

FlagDefaultDescription
--formattableOutput format (table, json, yaml)

Perform case-insensitive full-text search across all task titles and markdown body content. Results show where the match was found and a context snippet.

bash
# Search for a keyword
taskmd search "authentication"

# JSON output
taskmd search deploy --format json

# Filter and sort results
taskmd search "auth" --filter priority=high
taskmd search "deploy" --filter status=pending --sort priority --limit 5

# YAML output
taskmd search "bug fix" --format yaml

Flags:

FlagDefaultDescription
--formattableOutput format (table, json, yaml)
--filterFilter tasks (repeatable, AND logic, e.g., --filter status=pending --filter priority=high)
--sortSort by field (id, title, status, priority, effort, created)
--limit0Maximum number of results (0 = unlimited)

verify - Run Verification Checks

Run the acceptance checks defined in a task's verify field. Each verify step has a type:

  • bash -- runs a shell command, reports pass/fail based on exit code
  • assert -- displays a check for the agent to evaluate (not executed)
bash
# Verify a task (stops at first failure)
taskmd verify 042

# Run all checks even if some fail
taskmd verify 042 --all

# JSON output
taskmd verify 042 --format json

# Preview checks without executing
taskmd verify 042 --dry-run

# Custom timeout (seconds) per command
taskmd verify 042 --timeout 120

# --task-id flag also works
taskmd verify --task-id 042

Flags:

FlagDefaultDescription
--task-idTask ID to verify (alternative to positional argument)
--allfalseRun all checks even if one fails (default: fail-fast)
--formattableOutput format (table, json)
--dry-runfalseList checks without executing
--timeout60Per-command timeout in seconds

Exit codes:

  • 0 - All executable checks passed
  • 1 - One or more executable checks failed

status - Show In-Progress Tasks or Task Metadata

Without arguments, shows all in-progress tasks. With a query argument, displays the frontmatter metadata of a specific task (without body content, resolved dependency info, context files, or worklog data).

If the task has children (other tasks with a matching parent field), a recursive children tree is displayed showing each child's ID, status, and title. Grandchildren and deeper descendants are shown with indentation.

Matching uses the same logic as get (ID, title, file path, fuzzy).

bash
# Show all in-progress tasks
taskmd status

# Compact output for shell statuslines
taskmd status --statusline

# Filter by scope
taskmd status --scope cli

# Look up by task ID
taskmd status 042

# Look up by title
taskmd status "Setup project"

# JSON output
taskmd status 042 --format json

# YAML output
taskmd status 042 --format yaml

# Strict lookup (no fuzzy matching)
taskmd status sho --exact

# Metadata only, skip children tree
taskmd status 042 --minimal

Example output (parent task):

Task: 173
Title: Build e2e test suite for CLI
Status: completed
Children:
  ├─ 174 [completed] Set up e2e test foundation
  ├─ 175 [completed] E2e tests for workflows
  └─ 176 [completed] E2e tests for error handling
File: cli/173-e2e-test-suite.md

Statusline examples:

The --statusline flag outputs a compact format suitable for embedding in Claude Code's statusline. If multiple tasks are in progress, the first is shown with (+N more).

Use $(taskmd status --statusline) anywhere you want to display the active task:

bash
# In your ~/.claude/statusline-command.sh:
current_task=$(taskmd status --statusline 2>/dev/null)
if [ -n "$current_task" ]; then
  line="${line} | ${current_task}"
fi
bash
# In your ~/.tmux.conf:
set -g status-right '#(taskmd status --statusline 2>/dev/null)'
bash
# In your ~/.zshrc:
RPROMPT='$(taskmd status --statusline 2>/dev/null)'
bash
# In your ~/.config/starship.toml:
[custom.task]
command = "taskmd status --statusline"
when = "taskmd status --statusline"
format = "[$output]($style) "
style = "dimmed yellow"

Flags:

FlagDefaultDescription
--formattextOutput format (text, json, yaml)
--exactfalseDisable fuzzy matching, exact only
--threshold0.6Fuzzy match sensitivity (0.0-1.0)
--minimalfalseShow only task metadata, skip children
--statuslinefalseCompact output for Claude Code statusline (no-args mode)
--scopeFilter by group/directory (no-args mode)

context - Show File Context

Resolve all relevant files for a task into a structured output. Files come from two sources:

  1. Scope files -- resolved from the task's touches field via scope definitions in .taskmd.yaml
  2. Explicit files -- listed directly in the task's context field
bash
# Show context for a task
taskmd context --task-id 042

# JSON output
taskmd context --task-id 042 --format json

# Include file contents and task body
taskmd context --task-id 042 --include-content --resolve

# Include files from dependency tasks
taskmd context --task-id 042 --include-deps

# Limit number of files
taskmd context --task-id 042 --max-files 20

Flags:

FlagDefaultDescription
--task-id(required)Task ID to build context for
--formattextOutput format (text, json, yaml)
--resolvefalseExpand directory paths to individual files
--include-contentfalseInline file contents and task body
--include-depsfalseInclude files from direct dependency tasks
--max-files0Cap number of files (0 = unlimited)

worklog - View or Add Worklog Entries

View or add timestamped worklog entries for a task. Worklog files are stored at tasks/<group>/.worklogs/<ID>.md.

bash
# View worklog entries
taskmd worklog 015

# Add a new entry
taskmd worklog 015 --add "Started implementation"

# JSON output
taskmd worklog 015 --format json

# YAML output
taskmd worklog 015 --format yaml

Flags:

FlagDefaultDescription
--addAppend a new worklog entry with the given text
--formattextOutput format (text, json, yaml)

import - Import Tasks from External Sources

Fetch tasks from an external source (GitHub Issues, Jira, etc.) and create local markdown task files. This is a one-time onboarding tool for populating your tasks/ directory.

When run without --source, an interactive wizard guides you through setup.

bash
# Interactive wizard
taskmd import

# GitHub: import from a repository
taskmd import --source github --repo owner/repo

# GitHub: with auth token and filters
taskmd import --source github --project owner/repo --token-env GITHUB_TOKEN

# GitHub: filter by labels and assignee
taskmd import --source github --repo owner/repo --labels bug,critical --assignee alice

# GitHub: filter by milestone
taskmd import --source github --repo owner/repo --milestone "v2.0"

# Jira: import from a project
taskmd import --source jira --project PROJ --url https://company.atlassian.net

# Jira: with JQL filter
taskmd import --source jira --project PROJ --url https://company.atlassian.net --jql "assignee = currentUser()"

# Preview without writing files
taskmd import --source github --repo owner/repo --dry-run

# JSON output for scripting
taskmd import --source github --repo owner/repo --format json

Flags:

FlagDefaultDescription
--sourceSource name (github, jira, etc.). Omit for interactive wizard
--projectProject identifier (owner/repo for GitHub, project key for Jira)
--token-envEnvironment variable name for auth token
--user-envEnvironment variable name for username (Jira)
--base-urlAPI base URL (for Jira or GitHub Enterprise)
--output-dir./tasksTarget directory for imported task files
--filterSource-specific filters as key:value pairs (e.g. "state:open labels:bug")
--dry-runfalsePreview import without writing files
--formattableOutput format (table, json, yaml)

GitHub-specific flags:

FlagDescription
--repoAlias for --project (owner/repo)
--labelsFilter by labels (comma-separated)
--milestoneFilter by milestone
--assigneeFilter by assignee

Jira-specific flags:

FlagDescription
--urlAlias for --base-url (Jira instance URL)
--jqlJira Query Language filter

spec - Generate Specification File

Generate the taskmd specification document in your project directory. The specification describes the task file format, including frontmatter fields, valid values, file naming conventions, and directory structure.

bash
# Write TASKMD_SPEC.md to current directory
taskmd spec

# Print spec to stdout
taskmd spec --stdout

# Write to a specific directory
taskmd spec --dir ./docs

# Overwrite existing file
taskmd spec --force

Flags:

FlagDefaultDescription
--forcefalseOverwrite existing TASKMD_SPEC.md
--stdoutfalsePrint spec to stdout instead of writing a file

mcp - Start MCP Server

Start a Model Context Protocol (MCP) server that communicates over stdin/stdout. This allows LLM-based tools (Cursor, Windsurf, Copilot agents, Claude Code, etc.) to interact with your taskmd project using the standard MCP protocol.

bash
# Start MCP server
taskmd mcp

Configuration example for Claude Code (.mcp.json):

json
{
  "mcpServers": {
    "taskmd": {
      "command": "taskmd",
      "args": ["mcp"]
    }
  }
}

report - Generate Reports

Generate a comprehensive project report combining summary statistics, task groupings, critical-path analysis, and blocked tasks.

bash
# Markdown report to stdout
taskmd report

# HTML report to file
taskmd report --format html --out report.html

# JSON report grouped by priority
taskmd report tasks/ --group-by priority --format json

# Include dependency graph
taskmd report tasks/ --format html --include-graph --out report.html

Flags:

FlagDefaultDescription
--formatmdOutput format (md, html, json)
--group-bystatusField to group by (status, priority, effort, group, tag)
--out, -oWrite output to file
--include-graphfalseEmbed dependency graph in report

tracks - Parallel Work Tracks

Assign actionable tasks to parallel work tracks based on the touches frontmatter field. Tasks that share a scope are placed in separate tracks so they can be worked on without merge conflicts.

bash
# Show work tracks
taskmd tracks

# Filter to CLI-related tasks
taskmd tracks --filter tag=cli

# Limit to top 3 tracks
taskmd tracks --limit 3

# Export track assignments
taskmd tracks --format json > tracks.json

Flags:

FlagDefaultDescription
--formattableOutput format (table, json, yaml)
--filterFilter tasks (repeatable)
--limit0Maximum number of tracks (0 = unlimited)
--scopeFocus on a single scope; supports wildcards (e.g. cli/graph, cli*)

phases - List Project Phases

Display configured project phases with summary statistics including task counts, completion rates, and due dates. Phases are defined in .taskmd.yaml under the phases key.

bash
# List phases with progress
taskmd phases

# JSON output
taskmd phases --format json

# YAML output
taskmd phases --format yaml

Flags:

FlagDefaultDescription
--formattableOutput format (table, json, yaml)

feed - Activity Feed

Show a chronological activity feed of recent changes to task files. Uses git log to detect task creation, modification, and renames, presenting them as a time-ordered feed.

bash
# Show recent task activity
taskmd feed

# Show changes from the last 7 days
taskmd feed --since 7d

# Limit to 10 entries
taskmd feed --limit 10

# Filter to a specific scope
taskmd feed --scope cli

# Export as JSON
taskmd feed --format json

Flags:

FlagDefaultDescription
--formattextOutput format (text, json)
--limit20Maximum number of commits to show
--scopeFilter to a tasks subdirectory; supports wildcards (e.g. cli, cli*)
--sinceShow changes since (e.g. 2d, 1w, 2026-02-28)

sync - Sync External Sources

Commands for syncing tasks with external sources (GitHub Issues, Jira, etc.). Running taskmd sync alone displays usage and available subcommands.

sync down

Fetch tasks from configured external sources and create or update local markdown task files. Configuration is read from .taskmd.yaml.

bash
# Sync all configured sources
taskmd sync down

# Preview without writing files
taskmd sync down --dry-run

# Sync a specific source
taskmd sync down --source github
taskmd sync down --source jira

# Overwrite local changes with remote data
taskmd sync down --conflict remote

Flags:

FlagDefaultDescription
--dry-runfalsePreview changes without writing files
--sourceSync only the named source
--conflictskipConflict strategy: skip, remote, or local

See Configuration for how to set up sync sources in .taskmd.yaml.

web - Web Dashboard

Commands for the taskmd web dashboard.

web start

Start the web interface server.

bash
# Start server
taskmd web start

# Start and open browser
taskmd web start --open

# Custom port
taskmd web start --port 3000

# Read-only mode (disables editing)
taskmd web start --readonly

# Specific tasks directory
taskmd web start --task-dir ./my-tasks --open

Flags:

FlagDefaultDescription
--port8080Server port
--openfalseOpen browser on start
--devfalseEnable dev mode (CORS for Vite dev server)
--readonlyfalseStart in read-only mode (disables editing)

web export

Export the dashboard as a self-contained static site. The exported site can be deployed to GitHub Pages, Netlify, S3, or any static file host.

bash
# Export to default directory (./taskmd-export)
taskmd web export

# Export to a specific directory
taskmd web export -o ./public

# Set base path for URLs (e.g., for GitHub Pages subpath)
taskmd web export --base-path /demo/

# Export with custom task directory
taskmd web export --task-dir ./tasks -o ./site

Flags:

FlagDefaultDescription
-o, --output./taskmd-exportOutput directory
--base-path/Base path for URLs (e.g., /demo/)

See the Web Interface Guide for detailed web UI documentation.

todos - Find TODO/FIXME Comments

Scan source code files recursively for marker comments (TODO, FIXME, HACK, XXX, NOTE, BUG, OPTIMIZE) and display them with file path, line number, marker type, and comment text.

Respects .gitignore and skips common non-source directories (node_modules, .git, vendor, etc.). Supports language-aware comment parsing for Go, JavaScript, TypeScript, Python, Ruby, Shell, CSS, HTML, Rust, YAML, and TOML.

bash
# List all TODO/FIXME comments
taskmd todos list

# Scan a specific directory
taskmd todos list --dir ./src

# Filter by marker type
taskmd todos list --marker TODO --marker FIXME

# Include only specific file patterns
taskmd todos list --include "*.go"

# Exclude specific file patterns
taskmd todos list --exclude "*.test.go"

# JSON output
taskmd todos list --format json

# Rich output with scope and git blame info
taskmd todos list --rich

Flags:

FlagDefaultDescription
--dir.Directory to scan for source code
--marker(all)Filter by marker type (repeatable)
--includeInclude only files matching glob pattern (repeatable)
--excludeExclude files matching glob pattern (repeatable)
--formattableOutput format (table, json, yaml)
--richfalseInclude scope and git blame information (slower)
--raw-textfalseInclude original source line text in output

Exclude patterns can also be configured in .taskmd.yaml under todos.exclude. CLI --exclude flags are additive with config patterns.

init - Initialize a Project

Set up a complete taskmd project in the current directory. Creates a task directory, .taskmd.yaml config, agent configuration files, the taskmd specification document, and built-in task templates.

When run interactively (in a terminal), prompts for any values not provided via flags. In non-interactive mode, defaults to Claude agent configuration.

bash
# Interactive setup (prompts for missing info)
taskmd init

# Set task directory, prompt for agents
taskmd init --task-dir ./tasks

# Claude agent config, prompt for task directory
taskmd init --claude

# Fully non-interactive
taskmd init --task-dir ./tasks --claude

# Multiple agents
taskmd init --claude --gemini

# Skip specific outputs
taskmd init --no-spec         # Skip TASKMD_SPEC.md
taskmd init --no-agent        # Skip agent configs
taskmd init --no-templates    # Skip task templates

# Overwrite existing files
taskmd init --force

# Print all content to stdout instead of writing files
taskmd init --stdout

Flags:

FlagDefaultDescription
--task-dir./tasksTask directory path to create
--claudefalseInitialize for Claude Code
--geminifalseInitialize for Gemini
--codexfalseInitialize for Codex
--no-specfalseSkip generating TASKMD_SPEC.md
--no-agentfalseSkip generating agent configuration files
--no-templatesfalseSkip copying built-in task templates
--forcefalseOverwrite existing files
--stdoutfalsePrint all content to stdout instead of writing files

If a file already exists and --force is not set, it is skipped with a warning.

projects - Manage Registered Projects

List and manage globally registered projects. Projects are registered in ~/.taskmd.yaml under the projects key, enabling multi-project workflows with --project and --all-projects flags.

bash
# List all registered projects with task stats
taskmd projects

# JSON output
taskmd projects --format json

# Register the current directory as a project
taskmd projects register

# Register with a custom ID and name
taskmd projects register --id my-project --name "My Project"

# Register a specific path
taskmd projects register --path /path/to/project

# Unregister by current directory
taskmd projects unregister

# Unregister by project ID
taskmd projects unregister --id my-project

Flags (projects):

FlagDefaultDescription
--formattableOutput format (table, json, yaml)

Flags (projects register):

FlagDefaultDescription
--id(directory basename)Project ID
--name(same as ID)Display name
--path(current directory)Path to register

Flags (projects unregister):

FlagDefaultDescription
--id(match by current directory)Project ID to remove

Multi-project usage:

bash
# Run any command against a specific registered project
taskmd list --project my-project

# Aggregate tasks from all registered projects
taskmd list --all-projects
taskmd stats --all-projects
taskmd next --all-projects

completion - Generate Shell Completions

Generate shell completion scripts for taskmd. Supports Bash, Zsh, Fish, and PowerShell.

bash
# Bash
source <(taskmd completion bash)

# Bash (persistent - Linux)
taskmd completion bash > /etc/bash_completion.d/taskmd

# Bash (persistent - macOS with Homebrew)
taskmd completion bash > $(brew --prefix)/etc/bash_completion.d/taskmd

# Zsh (persistent)
taskmd completion zsh > "${fpath[1]}/_taskmd"

# Fish
taskmd completion fish | source

# Fish (persistent)
taskmd completion fish > ~/.config/fish/completions/taskmd.fish

# PowerShell
taskmd completion powershell | Out-String | Invoke-Expression

Arguments:

ArgumentRequiredDescription
bash|zsh|fish|powershellYesShell type to generate completions for

TIP

After installing completions, start a new shell session for them to take effect. For Zsh, ensure compinit is loaded: echo "autoload -U compinit; compinit" >> ~/.zshrc

Global Flags

Available for all commands:

bash
--config string       # Config file path
-d, --task-dir string # Task directory to scan (default ".")
--format string       # Output format (table, json, yaml)
--verbose             # Verbose logging
--quiet               # Suppress non-essential output
--stdin               # Read from stdin instead of files
--debug               # Enable debug output (prints to stderr)
--no-color            # Disable colored output
--project string      # Operate on a registered project by ID
--all-projects        # Aggregate tasks from all registered projects

Common Workflows

Daily Task Management

bash
# Morning: What should I work on?
taskmd next --limit 5

# Check project status
taskmd stats

# During work: Validate changes
taskmd validate

# End of day: What got done?
taskmd list --filter status=completed --sort created

Weekly Planning

bash
# Visual overview
taskmd board --group-by priority

# Identify bottlenecks
taskmd graph --exclude-status completed --format ascii

# Focus on priorities
taskmd list --filter status=pending --sort priority

CI/CD Integration

bash
# Validate in CI pipeline
if ! taskmd validate tasks/ --strict; then
    echo "Task validation failed"
    exit 1
fi

# Generate snapshot artifact
taskmd snapshot tasks/ --derived --out task-snapshot.json

Scripting and Piping

bash
# Pipe between commands
taskmd list --format json | jq '.[] | select(.priority == "high")'

# Validate from stdin
echo '---
id: "999"
title: "Test task"
status: pending
---
# Test' | taskmd validate --stdin

# Find quick wins
taskmd list tasks/ \
  --filter status=pending \
  --filter priority=high \
  --filter effort=small \
  --format json | jq -r '.[] | "\(.id): \(.title)"'

Environment Variables

taskmd supports environment variables with the TASKMD_ prefix:

bash
export TASKMD_DIR=./tasks
export TASKMD_VERBOSE=true

Environment variables have lower precedence than config files and CLI flags.

Troubleshooting

"No tasks found"

  1. Check that your tasks directory exists: ls -la tasks/
  2. Ensure files have .md extension
  3. Verify YAML frontmatter format
  4. Run taskmd validate tasks/ for specific errors
  5. Try verbose output: taskmd list tasks/ --verbose

"Invalid task format"

  • Check YAML frontmatter is properly formatted
  • Ensure required fields are present: id, title
  • Verify status is valid: pending, in-progress, completed, blocked, cancelled
  • Run taskmd validate tasks/ for line-level error messages

"Circular dependency detected"

Dependencies form a cycle (A depends on B, B depends on A). Use taskmd graph --format ascii to visualize the cycle and remove one dependency to break it.

Command not found

bash
# Check installation
which taskmd
taskmd --version

# If not found, add to PATH
export PATH=$PATH:$(go env GOPATH)/bin

Released under the MIT License. v0.2.1