A CLI tool for managing personal TODOs across life categories and project directories
Project description
todo-cli-tool
A fast, project-aware CLI for managing personal TODOs across your life.
Manage TODOs from the terminal with priorities, life categories, and automatic project detection. Cross-LLM integration via per-project .todos.md files and LLM config file pointers. Launch AI coding sessions directly from your TODO list.
Features
- Life Categories: Organize TODOs across Work, Family, Health, Hobbies, and custom categories.
- Priority System: Five priority levels (Critical to None) with color-coded Rich output.
- Project-Aware: Auto-detects your project from the working directory — no flags needed.
- Cross-LLM Integration: Auto-generates
.todos.mdand updatesclaude.local.md/AGENTS.local.mdso your AI assistant (Claude, Codex, Gemini, OpenCode) always knows your TODOs. - LLM Quick Start: Run
todo start <id>to mark a TODO as in-progress and launch your preferred LLM with the TODO as the prompt. - Beautiful Output: Rich-powered tables and detail panels with overdue highlighting.
- Single YAML Store: All TODOs in one file (
~/.todo/todos.yml) — easy to backup, sync, or inspect.
Demo
$ todo add "Implement auth middleware" -p 1 -c Work -dd 2026-04-01 -t backend,auth
Created TODO [a3f7b2]: Implement auth middleware
$ todo list
┏━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━┓
┃ ID ┃ Pri ┃ Title ┃ Category ┃ Status ┃ Due ┃
┡━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━┩
│ a3f7b2 │ Critical │ Implement auth middleware │ Work │ todo │ 2026-04-01 │
└──────────┴────────────┴────────────────────────────┴──────────────┴──────────────┴────────────────┘
$ todo done a3f7b2
Marked [a3f7b2] as done
$ todo start a3f7b2 claude
Started [a3f7b2]
# Launches: claude "Implement auth middleware" -n "todo:a3f7b2"
Tech Stack
- Python 3.11+ — Language
- Typer — CLI framework
- Rich — Terminal output
- Pydantic — Data validation
- PyYAML — Data storage
- uv — Package management
- pytest — Testing
- ruff — Linting & formatting
- mypy — Type checking
Getting Started
Prerequisites
- Python 3.11 or higher
- uv (recommended) or pip
Install from PyPI
pipx install todo-cli-tool
Or install from source
git clone https://github.com/lucasluize-tech/cli-todo.git
cd cli-tools
uv venv --python 3.13
source .venv/bin/activate
uv pip install -e .
Add todo to your PATH
Symlink the binary so it's available globally, without needing to activate the venv:
ln -sf "$(pwd)/.venv/bin/todo" ~/.local/bin/todo
Make sure ~/.local/bin is in your PATH. Then you can run todo from anywhere.
Verify the installation
todo --help
Usage
Managing TODOs
# Add a TODO with priority, category, due date, and tags
todo add "Buy groceries" -p 2 -c Family -dd 2026-04-15 -t errands
# List all TODOs
todo list -a
# List TODOs for the current project (auto-detected)
todo list
# Filter by category, priority, status, or tag
todo list -c Work -p 1
todo list --tag backend
# Show full details of a TODO
todo show a3f7b2
# Edit a TODO
todo edit a3f7b2 --title "New title" -p 3
# Mark as in-progress and launch an LLM session
todo start a3f7b2 # uses default LLM (claude)
todo start a3f7b2 codex # override with specific LLM
todo done a3f7b2
# Archive completed TODOs
todo archive a3f7b2
todo archive --all-done
# Delete a TODO (with confirmation)
todo delete a3f7b2
Configuration
Project Roots (important!)
Project roots are parent directories that contain your projects. The tool uses these to auto-detect which project you're working in based on your current directory.
By default, ~/projects and ~/work are configured. If your projects live elsewhere, add your own roots:
# List configured project roots
todo config roots list
# Add a project root
todo config roots add ~/code
todo config roots add ~/personal
# Remove a project root
todo config roots remove ~/work
How it works: If ~/projects is a root and you run todo add from ~/projects/my-app, the tool detects my-app as the project. TODOs are tagged with this project and a .todos.md file is generated at ~/projects/my-app/.todos.md.
If your cwd is not inside any configured root, no project is detected and no .todos.md is generated.
Categories and Defaults
# List categories
todo config categories list
# Add/remove categories
todo config categories add "Pets"
todo config categories remove "Social"
# Set defaults
todo config defaults set priority 2
todo config defaults set category "Family"
LLM Integration
Configure which LLM to use and which config files to generate:
# Set default LLM for `todo start`
todo config defaults set llm claude # claude, codex, gemini, opencode
# Choose which files to generate (comma-separated)
todo config defaults set llm_files claude,agents
# Use local files (default) or shared files
todo config defaults set llm_files_local true # claude.local.md, AGENTS.local.md
todo config defaults set llm_files_local false # CLAUDE.md, AGENTS.md
By default, todo writes to claude.local.md and AGENTS.local.md (local-first, not committed to git). Set llm_files_local to false if you want the shared variants.
Project Integration
# Regenerate .todos.md and CLAUDE.md for the current project
todo generate
# Regenerate for all projects
todo generate -a
When you run todo add or todo done from within a configured project root, the tool automatically:
- Detects the project from your working directory
- Regenerates
.todos.mdat the project root - Updates LLM config files (
claude.local.md,AGENTS.local.mdby default) with open TODO counts
Project Structure
cli-tools/
├── src/todo/
│ ├── cli.py # Typer app, command definitions
│ ├── models.py # Pydantic models (Todo, Config)
│ ├── store.py # YAML read/write, file locking
│ ├── renderer.py # Rich output formatting
│ ├── project.py # Project detection, .todos.md generation
│ ├── config.py # User config management
│ └── sync.py # Cloud sync interface (stub)
├── tests/ # 109 tests, 84% coverage
├── .github/workflows/ # CI + Release pipelines
└── pyproject.toml
Contributing
This is an open-source project and contributions are welcome.
Fork the repository, make your changes, and open a pull request. Please ensure tests pass before submitting:
uv run pytest
uv run ruff check src/ tests/
uv run ruff format --check src/ tests/
License
MIT
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file todo_cli_tool-0.2.0.tar.gz.
File metadata
- Download URL: todo_cli_tool-0.2.0.tar.gz
- Upload date:
- Size: 40.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b8a1107979bf2148472fe8d439c336679282c14054270b10e721a202186460b0
|
|
| MD5 |
e898fda7d6f528a690fb45086b9073b2
|
|
| BLAKE2b-256 |
fa9546b7ef1c074cc487eb09616dd1caf119d5c3d78cc63a3a3a3bbf262bffe4
|
Provenance
The following attestation bundles were made for todo_cli_tool-0.2.0.tar.gz:
Publisher:
release.yml on lucasluize-tech/cli-todo
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
todo_cli_tool-0.2.0.tar.gz -
Subject digest:
b8a1107979bf2148472fe8d439c336679282c14054270b10e721a202186460b0 - Sigstore transparency entry: 1204383918
- Sigstore integration time:
-
Permalink:
lucasluize-tech/cli-todo@1bb0cdc9e27e48b0229c6cb6962fb7b9018784aa -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/lucasluize-tech
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@1bb0cdc9e27e48b0229c6cb6962fb7b9018784aa -
Trigger Event:
push
-
Statement type:
File details
Details for the file todo_cli_tool-0.2.0-py3-none-any.whl.
File metadata
- Download URL: todo_cli_tool-0.2.0-py3-none-any.whl
- Upload date:
- Size: 16.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0ff51cc51f5e7a53ec9096e168e53a69479f33841a6c7ddd51b382abf52114c2
|
|
| MD5 |
5a4ade20a6b47ca3d3c11ec46a20ff69
|
|
| BLAKE2b-256 |
c76fb9bcac78b2e28e4507391870f94e79b79ddaefcf5ed2289d961906b989be
|
Provenance
The following attestation bundles were made for todo_cli_tool-0.2.0-py3-none-any.whl:
Publisher:
release.yml on lucasluize-tech/cli-todo
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
todo_cli_tool-0.2.0-py3-none-any.whl -
Subject digest:
0ff51cc51f5e7a53ec9096e168e53a69479f33841a6c7ddd51b382abf52114c2 - Sigstore transparency entry: 1204383922
- Sigstore integration time:
-
Permalink:
lucasluize-tech/cli-todo@1bb0cdc9e27e48b0229c6cb6962fb7b9018784aa -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/lucasluize-tech
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@1bb0cdc9e27e48b0229c6cb6962fb7b9018784aa -
Trigger Event:
push
-
Statement type: