| name | todo |
| user_invocable | true |
| description | Manage and track all TODOs from code comments and todo files. Provides quick reports of open tasks, scans for untracked TODOs, and integrates with GitHub Issues. Triggered by "/todo", "show todos", "list todos", or "todo status". |
Todo Management Skill
This skill consolidates all TODOs from two sources:
- Code comments -
TODO:andCLAUDE:markers in src/, tests/, docs/ - Todo files - Files with "todo" in the filename
Quick Start - Run Scan Script First
ALWAYS run this script first to save tokens:
python .claude/skills/todo/todo_scan.py
This outputs a complete report showing:
- Tracked vs untracked code TODOs
- Todo files and their status
- GitHub Issues with
todolabel
Quick Report (Default Action)
When user runs /todo, provide a quick summary:
- Run the scan script
- Query GitHub Issues:
gh issue list --label todo --state open --json number,title,labels - Present combined report
Output format:
=== TODO Quick Report ===
Open Issues: X (Y high, Z medium, W low)
In Progress: N
Untracked in code: M
| # | Pri | Category | Title | Status |
|-----|------|----------|--------------------------|-------------|
| #45 | HIGH | bug | GUI Animation Bug | in-progress |
| #32 | MED | arch | Circular imports | analyzed |
...
Untracked Code TODOs: M
src/file.py:123 - TODO: description
...
Run `/todo scan` for full scan
Run `/todo track` to create issues for untracked items
Commands
/todo help
Show quick reference of available commands:
/todo Quick report (open issues, priorities, in-progress)
/todo scan Full codebase scan for TODOs
/todo sync Find inconsistencies between code and GitHub
/todo search Search issues by keyword or label
/todo track Create GitHub Issues for untracked TODOs
/todo analyze #id Analyze TODO and update its GitHub Issue
/todo start #id Mark issue as in-progress
/todo done #id Close the issue
/todo reject #id Close with wontfix label
/todo or /todo report
Quick report from script output and GitHub Issues.
/todo scan
Full scan with detailed output:
python .claude/skills/todo/todo_scan.py
/todo sync
Find inconsistencies between code/files and GitHub Issues:
python .claude/skills/todo/todo_scan.py --sync
Checks performed:
Code TODOs:
- Missing in GitHub - Code TODO has
[#X]but issue doesn't exist or lackstodolabel - Missing in Code - GitHub Issue with
todo:codelabel has no matching code TODO - Stale TODOs - Code TODO references a CLOSED issue (should be removed)
File Entries:
4. Missing in GitHub - File entry references issue that doesn't exist or lacks todo label
5. Missing in File - GitHub Issue with todo:file label has no matching file entry
6. Stale Entries - File entry references a CLOSED issue (should be removed)
7. Status Mismatch - File says in-progress but GitHub lacks label, or vice versa
Output format:
=== SYNC REPORT ===
Code: Missing in GitHub (1):
src/file.py:42 - [#999] issue does not exist
Code: Stale TODOs (1):
src/old.py:20 - [#30] issue is CLOSED - remove this TODO
File: Status Mismatch (2):
todo/todo_open.md:5 - [#16] file says 'investigating' but GitHub has 'in-progress' label
todo/todo_open.md:15 - [#23] file says 'in-progress' but GitHub lacks label
Synced: 13 code TODOs, 25 file entries
Interactive Resolution:
When inconsistencies are found, ask the user how to resolve each one:
Status Mismatch - Ask: "Update file to match GitHub, or update GitHub to match file?"
- Option A: Update file entry status to match GitHub label
- Option B: Add/remove
in-progresslabel on GitHub to match file - Option C: Skip (do nothing)
Stale TODOs/Entries - Ask: "Issue is closed. Remove the TODO/entry?"
- Option A: Remove the code comment or file entry
- Option B: Skip (keep it)
Missing in GitHub - Ask: "Create GitHub Issue for this TODO?"
- Option A: Create issue with
todolabel - Option B: Skip
- Option A: Create issue with
Missing in Code/File - Ask: "GitHub Issue has label but no local reference. What to do?"
- Option A: Remove the
todo:codeortodo:filelabel from GitHub - Option B: Skip (leave as is)
- Option A: Remove the
Example interaction:
Found 1 inconsistency:
[1] Status Mismatch: todo/todo_open.md:5
Issue #16: file says 'investigating' but GitHub has 'in-progress' label
How to resolve?
A) Update file to 'in-progress'
B) Remove 'in-progress' label from GitHub
C) Skip
/todo search [query] [--label <label>]
Search GitHub Issues by keyword and/or label filter.
Usage:
/todo search animation # Search for "animation" in title/body
/todo search --label bug # Filter by label
/todo search gui --label high # Combined: keyword + label
/todo search --label in-progress # Find all in-progress issues
Implementation:
# Keyword search (searches title and body)
gh issue list --label todo --search "animation" --state open --json number,title,labels,state
# Label filter (can use partial match)
gh issue list --label todo --label "priority:high" --state open --json number,title,labels,state
# Combined
gh issue list --label todo --label bug --search "animation" --state open --json number,title,labels,state
# Include closed issues
gh issue list --label todo --search "animation" --state all --json number,title,labels,state
Output format:
=== Search Results: "animation" ===
| # | State | Labels | Title |
|-----|--------|-------------------------|--------------------------|
| #45 | open | bug, priority:high | GUI Animation Bug |
| #12 | closed | enhancement | Animation speed control |
Found 2 issues. Use `/todo start #id`, `/todo done #id`, or `/todo analyze #id` to operate on results.
Common label filters:
--label bug- Bug issues--label enhancement- Feature requests--label priority:high/priority:medium/priority:low- By priority--label in-progress- Currently being worked on--label analyzed- Already analyzed by Claude--label todo:code- From code comments--label todo:file- From todo files
Options:
--all- Include closed issues (default: open only)--limit N- Limit results (default: 30)
/todo track
For each untracked code TODO:
- Assign next available ID (check existing TC# numbers)
- Create GitHub Issue with
todoandtodo:codelabels - Update code comment with issue number:
# TODO [#123]: text
/todo analyze [#id]
Read the code context around a TODO, update the GitHub Issue description with analysis, and add analyzed label.
/todo start #id
Add in-progress label to the GitHub Issue.
/todo done #id
Close the GitHub Issue. Optionally remove or update the code comment.
/todo reject #id [reason]
Add wontfix label and close the issue with reason.
ID Schema
Code Comments
Format: # TODO [ID]: description
Examples:
# TODO [TC1]: Move single step mode into operator# TODO [#45]: Fix animation bug# CLAUDE [#123]: Review this logic
GitHub Labels
| Label | Purpose |
|---|---|
todo |
All tracked TODOs |
todo:code |
From code comments |
todo:file |
From todo files |
analyzed |
Claude has reviewed and understands |
in-progress |
Currently being worked on |
priority:high |
High priority |
priority:medium |
Medium priority |
priority:low |
Low priority |
Status Flow
new → analyzed → in_progress → completed
│
└──────────▶ rejected (wontfix)
Todo Files
Files with "todo" in filename are tracked:
- Should be moved to
todo/folder - Files with "new entries" section need processing
- Each entry should become a GitHub Issue
Processing New Entries
- Find files with
has_new_entries: truein scan output - Read the new entries section
- Create GitHub Issues for each entry
- Update file to mark entries as processed
Token-Saving Strategy
- Always run Python script first - It does the file scanning
- Use --json flag for programmatic parsing:
python .claude/skills/todo/todo_scan.py --json - Only read specific files when analyzing individual TODOs
- Cache GitHub queries - The script already queries once
Migration Notes
Existing tracked items use these ID formats:
TC1-TC6- Code TODOsB#, G#, A#, Q#, S#, D#- Categorized tasks in todo_open.md
These will be migrated to GitHub Issues when /todo track is run.
Important
- NEVER create issues without user approval - Show what will be created first
- Ask before modifying code - Confirm before updating TODO comments with IDs
- Preserve existing IDs - Don't reassign TC1-TC6 to new numbers