Todo management
by @lstpsche
Per-workspace SQLite todo manager (./todo.db) with groups and task statuses (pending/in_progress/done/skipped), operated via {baseDir}/scripts/todo.sh for adding, listing, editing, moving, and removing entries and managing groups.
clawhub install todo-management📖 About This Skill
name: todo-management description: Per-workspace SQLite todo manager (./todo.db) with groups and task statuses (pending/in_progress/done/skipped), operated via {baseDir}/scripts/todo.sh for adding, listing, editing, moving, and removing entries and managing groups. metadata: {"openclaw":{"emoji":"📝","requires":{"bins":["sqlite3"]}}} user-invocable: true
Todo Management
What this skill controls
A per-workspace SQLite database:./todo.dbTODO_DB=/path/to/todo.dbAll changes MUST happen through the CLI:
bash {baseDir}/scripts/todo.sh ...
Statuses
pending (default), in_progress, done, skippedDefault list hides done and skipped unless --all or --status=....
Non-negotiable rules
1) No file writing (ever)
todos.md, notes, markdown, exports).todos.md (...).todo.db, mutated by todo.sh.2) Never print the todo list unless explicitly asked
3) Keep replies extremely short
Allowed confirmations (English examples; translate as needed):
4) Ambiguity handling (the ONLY exception to rule #2)
If the user requests a destructive action but does not specify an ID (e.g., “remove the milk task”): 1) runentry list (optionally with --group=...)
2) show the results (minimal table)
3) ask which ID to act onThis is the only case where you may show the list without the user explicitly requesting it.
5) Group deletion safety
group remove "X" moves entries to Inbox (default).--delete-entries.Commands (use exactly these)
Entries
bash {baseDir}/scripts/todo.sh entry create "Buy milk"
- bash {baseDir}/scripts/todo.sh entry create "Ship feature X" --group="Work" --status=in_progress
bash {baseDir}/scripts/todo.sh entry list
- bash {baseDir}/scripts/todo.sh entry list --group="Work"
- bash {baseDir}/scripts/todo.sh entry list --all
- bash {baseDir}/scripts/todo.sh entry list --status=done
bash {baseDir}/scripts/todo.sh entry show 12
bash {baseDir}/scripts/todo.sh entry edit 12 "Buy oat milk instead"
bash {baseDir}/scripts/todo.sh entry move 12 --group="Inbox"
bash {baseDir}/scripts/todo.sh entry status 12 --status=done
- bash {baseDir}/scripts/todo.sh entry status 12 --status=skipped
bash {baseDir}/scripts/todo.sh entry remove 12Groups
bash {baseDir}/scripts/todo.sh group create "Work"
- bash {baseDir}/scripts/todo.sh group list
bash {baseDir}/scripts/todo.sh group rename "Work" "Work (Project A)"
- bash {baseDir}/scripts/todo.sh group edit "Work" "Work (Project A)"
bash {baseDir}/scripts/todo.sh group remove "Work"
- Delete entries too (ONLY if user explicitly wants it):
- bash {baseDir}/scripts/todo.sh group remove "Work" --delete-entries“Clear the list” behavior (no list printing)
To clear the todo list: 1) runentry list --all to get IDs (do NOT paste the results)
2) remove each ID with entry remove ID
3) reply with ONE line: “Cleared.”If the user then asks to see the list, run entry list and show it.
Dialogue example (expected behavior)
User: "I need to buy milk, add it to my todo list" Agent: "Done."
User: "Oh, and I also need to clean the room" Agent: "Added to the list."
User: "Show my todos" Agent: (prints the list)
User: "Remove the milk one" Agent: (lists matching tasks + asks for ID, then removes when ID is provided)