Skip to main content
command

todo — Claude Code command: project tasks in todos.md

Keeps a project task list in todos.md without leaving the chat: add, complete, remove, list. Handy when a full tracker is overkill.

Install into Claude Code · claude-code-templates All methods and platforms ↓
npx claude-code-templates@latest --command project-management/todo
Open on GitHub

What todo does

The command reads and writes a todos.md file at the root of your project. It finds that root by looking for markers like .git or package.json, creates the file if it is missing, and keeps two sections: ## Active and ## Completed. Tasks get numbers, so you can refer to them later by index.

The first argument picks the action: add, complete, remove, undo, due, list, past due, next. A second argument on add sets a due date — "tomorrow", "next week", "4 days", or a specific date. Dates are stored as MM/DD/YYYY, and a time is only included when you ask for one. Active tasks with a due date sort ahead of those without.

Tool access is limited to Read, Write and Edit, and everything happens inside todos.md — this is not a tool for editing your code. One thing to watch: if your project root is not obvious from .git or package.json, the file may land somewhere you did not expect, so check the path after the first run.

What it helps with

  • jot down a task without leaving the chat
  • attach a due date to a task you already added
  • mark a finished item complete and drop it from the active list
  • see which tasks are past due and still open
  • undo an accidental completion

Example prompts for the agent

  • /user:todo add "Fix navigation bug"
  • /user:todo complete 1
  • /user:todo past due

How to install todo

1claude-code-templates

npx claude-code-templates@latest --command project-management/todo

2Manually: put the files in place

.claude/commands/todo.md

Call it with /todo. For all projects use ~/.claude/commands/

Questions about todo

How do I install todo in Claude?

Run npx claude-code-templates@latest --command project-management/todo. The command file then lives at .claude/commands/todo.md.

What does the todo command do?

It manages a project task list in todos.md: adding items, completing them, removing them, and showing active or past-due tasks.

Where are the tasks stored?

In todos.md at the project root. The command locates the root via .git, package.json and similar markers, and creates the file when it does not exist.

Source text

todo.md · MIT
---
allowed-tools: Read, Write, Edit
argument-hint: "[action] [task-description] | add | complete | remove | list"
description: Manage project todos in todos.md file
---

# Project Todo Manager

Manage todos in a `todos.md` file at the root of your current project directory: **$ARGUMENTS**

## Usage Examples:
- `/user:todo add "Fix navigation bug"`
- `/user:todo add "Fix navigation bug" [date/time/"tomorrow"/"next week"]` an optional 2nd parameter to set a due date
- `/user:todo complete 1` 
- `/user:todo remove 2`
- `/user:todo list`
- `/user:todo undo 1`

## Instructions:

You are a todo manager for the current project. When this command is invoked:

1. **Determine the project root** by looking for common indicators (.git, package.json, etc.)
2. **Locate or create** `todos.md` in the project root
3. **Parse the command arguments** to determine the action:
   - `add "task description"` - Add a new todo
   - `add "task description" [tomorrow|next week|4 days|June 9|12-24-2025|etc...]` - Add a new todo with the provided due date
   - `due N [tomorrow|next week|4 days|June 9|12-24-2025|etc...]` - Mark todo N with the due date provided
   - `complete N` - Mark todo N as completed and move from the ##Active list to the ##Completed list
   - `remove N` - Remove todo N entirely
   - `undo N` - Mark completed todo N as incomplete
   - `list [N]` or no args - Show all (or N number of) todos in a user-friendly format, with each todo numbered for reference
   - `past due` - Show all of the tasks which are past due and still active
   - `next` - Shows the next active task in the list, this should respect Due dates, if there are any. If not, just show the first todo in the Active list

## Todo Format:
Use this markdown format in todos.md:
```markdown
# Project Todos

## Active
- [ ] Task description here | Due: MM-DD-YYYY (conditionally include HH:MM AM/PM, if specified)
- [ ] Another task 

## Completed  
- [x] Finished task | Done: MM-DD-YYYY (conditionally include HH:MM AM/PM, if specified) 
- [x] Another completed task | Due: MM-DD-YYYY (conditionally include HH:MM AM/PM, if specified) | Done: MM-DD-YYYY (conditionally include HH:MM AM/PM, if specified) 
```

## Behavior:
- Number todos when displaying (1, 2, 3...)
- Keep completed todos in a separate section
- Todos do not need to have Due Dates/Times
- Keep the Active list sorted descending by Due Date, if there are any; though in a list with mixed tasks with and without Due Dates, those with Due Dates should come before those without Due Dates
- If todos.md doesn't exist, create it with the basic structure
- Show helpful feedback after each action
- Handle edge cases gracefully (invalid numbers, missing file, etc.)
- All provided dates/times should be saved/formatted in a standardized format of MM/DD/YYYY (or DD/MM/YYYY depending on locale), unless the user specifies a different format
- Times should not be included in the due date format unless requested (`due N in 2 hours` should be MM/DD/YYYY @ [+ 2 hours from now]) 

Always be concise and helpful in your responses.

© davila7 · MIT · davila7/claude-code-templates

Similar slash commands

All slash commands for Notes, tasks and projects →

From the same set205

The whole set →

Project sponsors

Companies that keep this analytics open
Gold sponsor

Impressions, clicks and code copies — open statistics. We keep the numbers public for the same reason NeBlask itself is public. Become a sponsor