A simple CLI task manager powered by SQLite.
brew tap tominaga-h/tap
brew install tominaga-h/tap/my-taskRequires a Rust toolchain.
git clone https://github.com/mad-tmng/my-task.git
cd my-task
cargo install --path .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" --importantThe --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 |
my-task done 1my-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 remindsOpens 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 projectmy-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 outputIn 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.
| Status | Description |
|---|---|
| Open | Active task |
| Done | Completed via done command |
| Closed | Closed by deleting block in edit -i |
my-task notify # Overdue + due today
my-task notify --days 3 # Include tasks due within 3 daysShows overdue and upcoming tasks on stdout. Designed for use with cron / launchd. Silent (no output) when there are no matching 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 outputmy-task show 1 # Key-value format
my-task show 1 --json # JSON outputMark 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 onlyImportant tasks are displayed in magenta bold in list and notify output.
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 outputThe 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.
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.
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-taskAfter installation, run /task-dev-cycle. The plugin expects the my-task command to already be available in your environment.
MIT
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
1if title is empty or due date is invalid.
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
1if the task is not found or already done.
Edit an existing task. Two modes are available:
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 |
--importantand--no-importantcannot be used together.--remind,--no-remind, and--remove-remindare mutually exclusive.- Output:
Updated: #<ID> <TITLE> - Exit code
1if no flags given, task not found, title is empty, an invalid date is supplied, or--remove-remindtargets a date with no matching remind.
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, orNo changes -icannot be combined with--title,--project,--due,--remind,--no-remind,--remove-remind,--important, or--no-important.
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
0when no tasks match (silent mode). - Overdue tasks show days past due; today's tasks show "today"; future tasks show days remaining.
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:
>30dred,>7dyellow. - Tasks with
--sort due: tasks without a due date appear last.
Output footer: N tasks or N tasks (M done)
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).
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.
--jsonoutput uses the same schema aslist/search(single object):id,title,status,project,due,created,done_at,updated,reminds,important,source.- Exit code
1if the task is not found.
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-categoryor--clear-categorymust be given; otherwise exits with code1. - Exit code
1if no project named<NAME>exists (projects are never created implicitly here).
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) |

