Skip to content

Repository files navigation

my-task

version

A simple CLI task manager powered by SQLite.

日本語ドキュメント | Changelog

DEMO

Table of Contents

Installation

Homebrew

brew tap tominaga-h/tap
brew install tominaga-h/tap/my-task

From source

Requires a Rust toolchain.

git clone https://github.com/mad-tmng/my-task.git
cd my-task
cargo install --path .

Usage

Add a task

my-task add "Buy groceries"
my-task add "Fix login bug" --project my-app --due 2026-04-15
my-task add "Write tests" --due tomorrow
my-task add "Critical bug" --important

Fuzzy due dates

The --due flag accepts natural language in both English and Japanese:

Input Result
2026-04-15 Exact date
today / 今日 Today
tomorrow / 明日 Tomorrow
明後日 Day after tomorrow
next week / 来週 7 days from now
next month / 来月 Same day next month
mon-sun / 月曜-日曜 / 月曜日-日曜日 Next occurrence of that weekday

Mark a task as done

my-task done 1

Edit a task

Flag mode (one-liner)

my-task edit 5 --title "New title"
my-task edit 5 --project new-proj --due friday
my-task edit 5 --remind 2026-04-10        # Add a remind
my-task edit 5 --remove-remind 2026-04-10 # Remove a single remind
my-task edit 5 --no-remind                # Clear all reminds

Interactive mode (editor)

Opens your $EDITOR (falls back to vi) with tasks in YAML format. Delete a block to close that task.

my-task edit -i              # Edit all open tasks
my-task edit -i 5            # Edit a single task
my-task edit -i -P my-app    # Edit tasks in a project

List tasks

my-task list                 # Open tasks only
my-task ls                   # Alias
my-task list --all           # Include done/closed tasks
my-task list -P my-app       # Filter by project
my-task list --category work # Filter by project category
my-task list --due today     # Filter by due date (only tasks due today)
my-task list --sort due      # Sort by: id, due, project, created
my-task list --sort project --sort due  # Multiple sort keys
my-task list --important-only    # Important tasks only
my-task list -f                  # Follow: full-screen, auto-refreshing view (q to quit)
my-task list -f --interval 5     # Refresh every 5 seconds
my-task list --json              # Machine-readable JSON output

In follow mode the list is shown full-screen and refreshes automatically. Press q (or Esc / Ctrl-C) to quit, or r to refresh immediately. When the list is taller than the terminal, scroll with j / ↓ (down) and k / ↑ (up); a [start-end/total] indicator at the bottom shows the current range. The scroll position is kept across auto-refreshes. Follow mode requires a TTY; when output is piped/redirected it prints the list once and exits.

DEMO

Task statuses

Status Description
Open Active task
Done Completed via done command
Closed Closed by deleting block in edit -i

Notify due tasks

my-task notify              # Overdue + due today
my-task notify --days 3     # Include tasks due within 3 days

Shows overdue and upcoming tasks on stdout. Designed for use with cron / launchd. Silent (no output) when there are no matching tasks.

Search tasks

my-task search "bug"             # Search open tasks by keyword
my-task search "bug" --all       # Include done/closed tasks
my-task search "bug" -p my-app   # Combine with project filter
my-task search "bug" --json      # Machine-readable JSON output

Show task details

my-task show 1                   # Key-value format
my-task show 1 --json            # JSON output

Important tasks

Mark tasks as important to highlight them in listings:

my-task add "Critical bug" --important
my-task edit 5 --important       # Set important flag
my-task edit 5 --no-important    # Remove important flag
my-task list --important-only    # Filter important tasks only

Important tasks are displayed in magenta bold in list and notify output.

Project categories

Each project can have at most one category. Use the project command to set or clear a project's category, then filter tasks by category with list --category:

my-task project my-app --set-category work    # Assign the "work" category
my-task project my-app --clear-category       # Remove the category
my-task list --category work                  # List tasks in "work" projects
my-task projects                              # Category column is shown here
my-task projects --json                       # Machine-readable JSON output

The project must already exist (create it by adding a task with -p). Setting a category on an unknown project exits with code 1.

--category and --project are mutually exclusive on list; combining them is rejected as an argument error.

Data storage

Task data is stored in a SQLite database at:

$XDG_DATA_HOME/my-task/tasks.db

Default: ~/.local/share/my-task/tasks.db

Override with the MY_TASK_DATA_FILE environment variable.

Claude Code Plugin

cc-plugin/ contains the Claude Code plugin for this project. It provides the task-dev-cycle command, which helps drive a development workflow around my-task tasks, from task selection through implementation, testing, and completion.

Install it from the marketplace with:

/plugin marketplace add tominaga-h/my-task
/plugin install task-dev-cycle@my-task

After installation, run /task-dev-cycle. The plugin expects the my-task command to already be available in your environment.

License

MIT

Command Reference

my-task add <TITLE> [OPTIONS]

Add a new task.

Option Short Description
--project <NAME> -p Assign to a project
--due <DATE> -d Set due date (YYYY-MM-DD or fuzzy input)
--important — Mark task as important
  • <TITLE> is required and must not be empty.
  • Output: Added: #<ID> <TITLE>
  • Exit code 1 if title is empty or due date is invalid.

my-task done <ID>

Mark a task as done. Sets status to done and records the completion date.

  • <ID> is required (positive integer).
  • Output: Done: #<ID> <TITLE>
  • Exit code 1 if the task is not found or already done.

my-task edit [ID] [OPTIONS]

Edit an existing task. Two modes are available:

Flag mode

Requires <ID> and at least one of --title, --project, --due, --remind, --no-remind, --remove-remind, --important, or --no-important.

Option Short Description
--title <TEXT> -t Set new title (must not be empty)
--project <NAME> -p Set new project name
--due <DATE> -d Set new due date (YYYY-MM-DD or fuzzy input)
--remind <DATE> -r Add a remind date (YYYY-MM-DD or fuzzy input)
--no-remind — Clear all reminds
--remove-remind <DATE> — Remove a single remind by date (YYYY-MM-DD or fuzzy input)
--important — Set important flag
--no-important — Remove important flag
  • --important and --no-important cannot be used together.
  • --remind, --no-remind, and --remove-remind are mutually exclusive.
  • Output: Updated: #<ID> <TITLE>
  • Exit code 1 if no flags given, task not found, title is empty, an invalid date is supplied, or --remove-remind targets a date with no matching remind.

Interactive mode (-i / --interactive)

Opens $EDITOR (fallback: vi) with tasks in YAML format.

Option Short Description
--interactive -i Enable editor mode
--filter-project <NAME> -P Filter tasks by project (only with -i)
  • [ID] is optional: if given, edits a single task; if omitted, edits all open tasks.
  • Deleting a task block in the editor closes that task (sets status to closed).
  • Only changed tasks are updated. Unchanged tasks are skipped.
  • Output: Updated N tasks, Closed N tasks, or No changes
  • -i cannot be combined with --title, --project, --due, --remind, --no-remind, --remove-remind, --important, or --no-important.

my-task notify [OPTIONS]

Show overdue and due-soon tasks on stdout.

Option Short Default Description
--days <N> -D 0 Include tasks due within N days from today (0 = today + overdue only)
  • Outputs nothing and exits with code 0 when no tasks match (silent mode).
  • Overdue tasks show days past due; today's tasks show "today"; future tasks show days remaining.

my-task list [OPTIONS]

List tasks in a table. Alias: my-task ls

Option Short Default Description
--all -a false Show all tasks including done and closed
--project <NAME> -P — Filter by project name
--category <CAT> -c — Filter by project category (cannot be combined with --project)
--due <DATE> -d — Filter by due date (YYYY-MM-DD or fuzzy input like today, 今日, 明日)
--sort <KEY> -s id Sort by: id, due, project, created (age is alias for created). Repeatable for multi-key sort
--important-only — false Show only important tasks
--follow -f false Full-screen, auto-refreshing view. Press q/Esc/Ctrl-C to quit, r to refresh now, j/k (or ↓/↑) to scroll. Requires a TTY (prints once when piped)
--interval <SECS> — 2 Polling interval (seconds) for follow mode
--json — false Output as JSON array (cannot be combined with --follow)

Display rules:

  • Important tasks: title in magenta bold.
  • Open tasks: default colors. Overdue titles/due dates shown in red, due today in yellow, future due in green.
  • Done tasks: all columns in green (except project, which keeps its assigned color).
  • Closed tasks: all columns in dark grey.
  • Age column: >30d red, >7d yellow.
  • Tasks with --sort due: tasks without a due date appear last.

Output footer: N tasks or N tasks (M done)

my-task search <KEYWORD> [OPTIONS]

Search tasks by title (partial match, case-insensitive for ASCII).

Option Short Default Description
--all -a false Include done and closed tasks
--project <NAME> -p — Filter by project name
--json — false Output as JSON array
  • Results are displayed in the same table format as list.
  • Outputs No tasks found for keyword: "..." when no tasks match.
  • With --json, matching tasks are output as a JSON array ([] when none match).

my-task show <ID> [OPTIONS]

Show detailed information about a single task.

Option Short Description
--json — Output as JSON
  • Default output: key-value format (one field per line).
  • Fields: ID, Title, Status, Project, Due, Remind, Important, Created, Updated.
  • --json output uses the same schema as list / search (single object): id, title, status, project, due, created, done_at, updated, reminds, important, source.
  • Exit code 1 if the task is not found.

my-task project <NAME> [OPTIONS]

Manage a single project's category. The project must already exist.

Option Short Description
--set-category <CAT> — Set the project's category
--clear-category — Clear the project's category (mutually exclusive with --set-category)
  • Exactly one of --set-category or --clear-category must be given; otherwise exits with code 1.
  • Exit code 1 if no project named <NAME> exists (projects are never created implicitly here).

my-task projects

List all projects with their category and task counts (Open / Done / Closed / Total).

Option Short Default Description
--json — false Output as JSON array ([] when there are no projects)

About

A simple CLI task manager powered by SQLite

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages