From todo
Capture and process follow-up work discovered during development. Use when a user notices incidental work (stale config, tech debt, dead code, test gaps) they want to defer without losing context. Provides the todo file format, creation workflow, and processing logic via remote Claude sessions.
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
Repo-native system for capturing follow-up work with full context and processing it automatically via remote Claude sessions.
Repo-native system for capturing follow-up work with full context and processing it automatically via remote Claude sessions.
/add-todo or /process-todo/add-todo)dev_docs/todos/.todo-config.yml (absent → repo-pr)Capture is destination-agnostic; only the handler decides where the todo lands.
The delivery destination is a handler named in a repo-committed config file, dev_docs/todos/.todo-config.yml:
handler: repo-pr # repo-pr (default) | gh-issue | jira
# handler-specific blocks (gh-issue / jira) live under their own keys
Resolution: file absent or no handler: → repo-pr; unknown value → /add-todo stops and points to /todo-config. Every handler receives the same drafted todo (title, body, priority, tags, source_branch, source_pr, …) and returns the URL of what it created.
repo-pr (default)Reproduces the original behavior. Dispatches an agent to:
todo/add/<slug>)dev_docs/todos/<slug>.mdtodo-add (an auto-merge workflow lands it on main, decoupled from the feature branch)Zero local impact. No files written, no branches created, no staging.
Fallback modes (automatic cascade, repo-pr only): --remote (cloud VM) → --subagent (GitHub API via sub-agent, zero local git impact) → --local (stage into current branch). If gh auth status fails, skip straight to --local. Do NOT pass --print to claude --remote. This cascade applies only to repo-pr; other handlers are single foreground calls (gh-issue via the gh CLI, jira via the Atlassian MCP).
gh-issueCreates a GitHub Issue via gh issue create (foreground, no git plumbing). Config:
handler: gh-issue
gh-issue:
repo: owner/name # optional; defaults to current repo
labels: [follow-up] # optional
assignees: [] # optional
Requires working gh auth; on auth failure it stops with guidance rather than falling back. The drafted todo's body plus a source-branch/PR footer becomes the issue body; the handler returns the new issue URL.
jiraCreates a Jira work item via the Atlassian MCP server (mcp__claude_ai_Atlassian__createJiraIssue), placed under a selected epic. Config:
handler: jira
jira:
site: mycompany.atlassian.net
project: PLAT # required
issue_type: Task # default Task
default_epic: PLAT-100 # optional; skips the epic prompt
labels: []
Requires the Atlassian MCP to be connected in Claude Code and the configured site to be in the user's accessible resources; stops with guidance otherwise. Lists the project's open epics via JQL for the user to pick a parent, maps the drafted todo to summary + description (with source footer), and returns the https://<site>/browse/<KEY> URL.
/todo-configConfigures the handler and writes dev_docs/todos/.todo-config.yml. Shows the current config, prompts for the destination, verifies prerequisites (gh auth for gh-issue; Atlassian MCP connectivity for jira), and delegates interactive logins to the user. Run it before using a non-default handler.
/process-todoand/list-todosonly operate onrepo-pr(file-based) todos. For thegh-issueandjirahandlers, lifecycle and tracking live in the external tool — read-back/sync is out of scope.
/process-todo)dev_docs/todos/**/*.md for unclaimed todostodo/<slug>, sets status: claimed)todo-loop/list-todos)Quick status check. Shows all todos with priority, status, tags, and expiry.
Files live in dev_docs/todos/ (supports subdirectories). Markdown with YAML frontmatter.
---
title: Imperative description under 80 chars
priority: low
status: unclaimed
created: 2026-03-23
source_branch: bestdan/feat/example
source_pr: 42
related_files:
- path/to/relevant/file.ts
- path/to/another/file.ts
expires: 2026-04-22
tags:
- cleanup
---
## Context
Why this exists. What you saw. Written for someone who has never seen this code.
## Task
1. Concrete step one
2. Concrete step two
3. Run tests
## Acceptance Criteria
- No remaining references to X
- Tests pass
| Field | Required | Description |
|---|---|---|
title | yes | Imperative description, < 80 chars |
priority | yes | low / medium / high |
status | yes | unclaimed / claimed / blocked |
created | yes | ISO date |
source_branch | yes | Branch where todo was identified |
source_pr | no | PR number if already open |
related_files | yes | Paths the consumer should read for context |
expires | yes | ISO date. Default: 30 days from creation. |
tags | no | Freeform tags for filtering (e.g., cleanup, tests) |
unclaimed --> claimed --> PR opened --> merged (todo file deleted)
| |
| +--> blocked (needs manual intervention)
|
+--> expired (auto-pruned after 30 days)
Two namespaces to avoid collisions:
todo/add/<slug> — the PR that adds the todo file (auto-merged)todo/<slug> — the PR that does the work and deletes the todo fileAlways scan recursively: dev_docs/todos/**/*.md. Subdirectories are optional organizational structure.
Each remote session gets its own isolated VM with a fresh clone. Filesystem races are impossible. The only contention point is git push:
todo/<slug>git push is atomic — second push failsRemote sessions (claude --remote) run in cloud VMs and don't have access to locally-installed plugins. The /add-todo and /process-todo commands handle this by embedding all necessary instructions directly in the remote prompt. The remote agent doesn't need to know about this plugin — it just follows the instructions in its prompt.
Guides creation, editing, and verification of skills for AI coding agents using test-driven development with subagent scenarios. Use when authoring or debugging skills.
npx claudepluginhub bestdan/todo-plugin --plugin todo