From todo
Manage personal tasks — add, update, complete, reopen, remove, and report. Tasks are stored in a central markdown file accessible from any session.
How this skill is triggered — by the user, by Claude, or both
Slash command
/todo:todoThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Manage tasks stored in a single markdown file at `$CYBERDECK_TASKS`.
Manage tasks stored in a single markdown file at $CYBERDECK_TASKS.
Before any operation, verify $CYBERDECK_TASKS is set:
export CYBERDECK_TASKS=$HOME/tasks.md"add, create it (see File Creation below)./todo:todo add to create your first task."Determine the operation from the first word of $ARGUMENTS:
add → Add operationcomplete or done → Complete operationreopen → Reopen operationupdate → Update operationremove or delete → Remove operationlist or report or ls → List operationlistEverything after the operation keyword is the payload.
Before executing any operation, validate metadata tags in the payload:
@id(value) — reject if present in an add payload: "Task IDs are auto-assigned. Remove @id() and try again."@priority(value) — value must be one of: high, medium, low. Reject otherwise: "Invalid priority 'value'. Use high, medium, or low."@due(value) — value must be a valid date in YYYY-MM-DD format. Reject if the format is wrong or the date is invalid (e.g., 2026-13-45): "Invalid due date 'value'. Use YYYY-MM-DD format."@project(value) — value must be non-empty. Reject if empty: "Project name cannot be empty."Several operations (complete, reopen, update, remove) need to find a task by the user's payload. Use this strategy consistently:
@id(N) or a bare number N, match by task ID@tag() metadata)Every task gets an auto-generated @id(N) tag (integer, monotonically increasing):
add: scan all tasks across all sections (Active, Completed, Removed) for existing @id() values. Assign the next integer after the highest found. If no IDs exist, start at 1.@id() tag is placed at the end of the task line, after all other tags: - [ ] Description text @priority(medium) @created(2026-04-10) @id(3)/todo:todo complete 3 or /todo:todo complete @id(3)Add a new task to the ## Active section.
@project(name) — optional@priority(high|medium|low) — default to @priority(medium) if not specified@due(YYYY-MM-DD) — optional@id(N) (see Task IDs above)@created(YYYY-MM-DD) with today's date- [ ] <description> <tags> @created(YYYY-MM-DD) @id(N)## Active section (before the next ## heading or end of file)updated date in the frontmatter to todayMark an active task as completed.
## Active section## Active to the top of ## Completed:
- [ ] to - [x]@completed(YYYY-MM-DD) with today's dateupdated dateMove a completed or removed task back to Active.
## Completed first, then ## Removed (see Task Matching above)## Active:
- [x] or - [-] to - [ ]@completed(YYYY-MM-DD) tag if present@removed(YYYY-MM-DD) and @reason(...) tags if presentupdated dateModify an active task's description or metadata.
@id(N)), followed by changes## Active (see Task Matching above)--desc "new description", replace the task's description text (the non-tag portion) with the new description@priority(), @due(), @project()):
updated dateRemove an active task (move to Removed section with a reason).
## Active (see Task Matching above)@reason(text), use it. Otherwise, ask the user for a brief reason (one line).## Active to the top of ## Removed:
- [ ] to - [-]@removed(YYYY-MM-DD) with today's date@reason(<reason>)updated dateDisplay tasks with optional filters. Filters can be combined.
Read the tasks file
Parse filters from payload — multiple filters may be combined:
@project(name) → filter by project@priority(high|medium|low) → filter by priority@due → show tasks with due dates, sorted by due date (earliest first)overdue → show tasks where @due() date is before todaycompleted → show tasks from ## Completed sectionremoved → show tasks from ## Removed sectionall → show all sections (Active, Completed, Removed)When multiple filters are present, apply all of them (logical AND). For example, /todo:todo list @project(keystone) @priority(high) shows only high-priority keystone tasks.
Preserve file order (the order tasks appear in the markdown) unless a sort is specified (e.g., @due filter sorts by earliest due date).
Format output as a bullet list. Each line starts with • followed by the task ID in dim gray, a —, then the task description and metadata:
For active tasks:
## Active Tasks (N total)
• 1 — Task description — @project(x) @priority(high) @due(2026-04-15)
• 2 — Task description — @priority(medium)
...
Summary: N active, N high priority, N overdue
For overdue:
## Overdue Tasks
• 1 — Task description — @due(2026-04-08) (2 days overdue) @project(x)
...
The ID number and first — should be displayed in dim/gray so they recede visually. The task description should be normal weight.
Include summary stats at the bottom: total active, count by priority, overdue count
When $CYBERDECK_TASKS file doesn't exist and the operation is add, create it with this template:
---
title: Tasks
updated: YYYY-MM-DD
---
# Tasks
## Active
## Completed
## Removed
Replace YYYY-MM-DD with today's date. Then proceed with the add operation.
$ARGUMENTS, execute without asking questionsCreates, edits, and optimizes skills for Claude Code, including drafting, evaluating with test prompts, iterating on performance, and improving skill descriptions for better triggering accuracy.
npx claudepluginhub ryan-small/cyberdeck --plugin todo