Claude Code Skill
Last updated: 2026-02-22
Add a /todo slash command to Claude Code that creates tasks in ToDone and keeps a local TODO file in sync.
What It Does
The ToDone skill adds a /todo command to Claude Code. When you say /todo Fix the login redirect bug, it:
- Enriches the todo by scanning your codebase for related files and context
- Appends the task to a local
docs/TODO.mdfile in your project - Creates the task in your ToDone workspace via the API
- Syncs both sources bidirectionally — tasks added or completed on either side stay in sync
This means your todos live in two places: version-controlled markdown in your repo, and your ToDone dashboard.
Prerequisites
You need three things before setting up the skill:
- Claude Code — Anthropic's CLI tool (install guide)
- A ToDone account — sign up at todone.fyi
- An API key — generate one in your ToDone workspace settings under API Keys
Setup
1. Create the skill directory
In your project root, create the skill folder:
mkdir -p .claude/skills/todo
2. Copy the skill file
Create .claude/skills/todo/SKILL.md with the contents from The Skill File below. The full file is ready to copy.
3. Configure your API key
In the skill file, replace <YOUR_API_KEY> with the API key you generated in ToDone:
| API key | `td_abc123...` |
4. Test it
Open Claude Code in your project and type:
/todo Add a test task
Claude will create the task in both docs/TODO.md and your ToDone workspace.
The Skill File
Copy this entire block into .claude/skills/todo/SKILL.md:
---
name: todo
description: "Add a todo to docs/TODO.md and the ToDone app, then bidirectionally sync both sources. Invoke via '/todo'."
user-invocable: true
disable-model-invocation: false
allowed-tools: Read, Write, Edit, Glob, Grep, Bash
---
# Todo — Add & Sync
## Config
| Key | Value |
|-----|-------|
| API base | `https://www.todone.fyi` |
| API key | `<YOUR_API_KEY>` |
| Auth header | `Authorization: Bearer <YOUR_API_KEY>` |
| TODO file | `docs/TODO.md` |
| Category name | `ToDone` |
All `curl` calls use `-s` and the auth header above.
## Phase 1 — Add New Item
1. **Parse** — Extract title + details from user message.
2. **Enrich** — Glob/Grep the codebase for related files. Add 1-3 sentences of context as the description. Check for related existing TODOs.
3. **Append to TODO file** — Read the file, pick the best `##` section (`Features`, `UI / Design`, `Views`, `API`, `Deployment / Infrastructure`, `Platform`, `Real-Time`, `Bugs` — default `Features`). Append:
```
### <Title>
- **Status:** TODO
- <description>
```
4. **Create in app** — `GET /api/categories` to find the category ID (create via `POST /api/categories` if missing). Then `POST /api/tasks` with `{ title, body, categoryId, force: true }`.
## Phase 2 — Bidirectional Sync
5. **Fetch live tasks** — `GET /api/tasks?categoryId=<id>` for all tasks in the category.
6. **Parse TODO file** — Extract every `### <Title>` and its `**Status:**`.
7. **Reconcile** — Match by normalized title (case-insensitive; use fuzzy judgement for near-matches).
| Live app | TODO file | Action |
|----------|-----------|--------|
| Active, not in file | — | Add to file in appropriate section |
| — | Status: TODO, not in app | `POST /api/tasks` with `force: true` |
| Completed (`completedAt` set) | Status: TODO | Update file status to `Done` |
| Active, has body | No/different description | Update file description |
| — | Has description, app task has no body | `PATCH /api/tasks/:id` with `{ body }` |
| Both agree (both done, or both match) | — | No change |
8. **Report** — Tell the user: what was added, sync summary (items added/updated/status-changed per side), total active count.
## API Quick Ref
| Method | Path | Notes |
|--------|------|-------|
| `GET` | `/api/tasks` | Params: `categoryId`, `stageId`, `priority`, `sort`, `order` |
| `POST` | `/api/tasks` | Body: `{ title, body?, categoryId?, priority?, force? }`. Returns 409 on duplicate. |
| `PATCH` | `/api/tasks/:id` | Same fields as POST (minus `force`), plus `position`. |
| `DELETE` | `/api/tasks/:id` | Returns 204. |
| `GET` | `/api/categories` | |
| `POST` | `/api/categories` | Body: `{ name, color? }` |
Priority values: `LOWEST`, `LOW`, `MEDIUM`, `HIGH`, `URGENT`, or omit for none.
Field limits: title 500 chars, body 50k chars.
Errors: 400 bad request, 401 unauth, 403 forbidden, 404 not found, 409 duplicate/similar.
How It Works
Phase 1: Adding a todo
When you invoke /todo, Claude:
- Parses your message to extract the task title and any details
- Scans your codebase with Glob and Grep to find related files, then writes a short description with context
- Appends the task to
docs/TODO.mdunder the most relevant section heading - Creates the task in ToDone via the API, filed under a "ToDone" category (created automatically if it doesn't exist)
Phase 2: Bidirectional sync
After adding the new item, Claude syncs everything:
- Tasks in ToDone but not in the file get added to the file
- Tasks in the file but not in ToDone get created via the API
- Tasks completed in ToDone get their file status updated to "Done"
- Description differences are reconciled (longer/newer description wins)
The sync runs automatically every time you use /todo.
Usage Examples
/todo Fix the login redirect bug
Creates a task, enriches it with context from auth-related files, syncs.
/todo Add rate limiting to the API endpoints
Scans for API route files, notes which endpoints exist, creates a detailed task.
/todo Sync my todos
Skips creating a new task and just runs the bidirectional sync.
The skill is smart about duplicates. If a similar task already exists, it will flag it rather than creating a duplicate.