blackbone/codex-marketplace/tree/main/plugins/todo-claude

ToDo는 Claude Code를 위한 repo 단위 영속 작업 큐 플러그인입니다. 원자적 작업 분해, DAG 디스패치, 격리된 worktree 실행, 작업별 영속 Claude 세션, 재시도 및 병합 큐, 내장 터미널·데스크톱 대시보드를 제공합니다.
blackbone/codex-marketplace/tree/main/plugins/todo-claude

ToDo는 Codex ToDo 플러그인의 Claude Code 브랜치이며 .todo/ 상태, 작업, 파이프라인, 라우팅 규칙, MCP 도구와 대시보드를 공유합니다. /plugin marketplace add blackbone/codex-marketplace 및 /plugin install todo@blackbone으로 설치합니다. 요구 사항은 Node.js 22+, Git, 백그라운드 worker용 claude CLI입니다. 대상 Git repo에서 /todo:init을 실행하면 활성화되며 .todo/config.json을 만들고, 기본적으로 .todo/를 제외하고, 루트 CLAUDE.md에 관리되는 라우팅 블록을 설치하고, 해당 repo의 소유자가 Claude Code임을 선언합니다. /todo:start는 detached runner를 시작하고 /todo:dashboard는 로컬 URL을 반환합니다. 활성화된 repo에서는 ToDo를 명시하지 않은 프로젝트 변경에도 라우팅이 적용되며, 읽기 전용 분석과 상태 확인은 현재 세션에 남습니다. 세션 hook은 라우팅 정책과 전체 Ponytail 프로필을 주입합니다. Claude Code의 주입 1회 한도가 10,000자이므로 두 번째 hook 항목으로 나뉩니다. 플러그인에는 Claude Code mod(mod/register.tsx)가 포함되어 터미널과 데스크톱 Code 탭에 네이티브 대시보드를 그립니다. 작업 표, 종속성 그래프, 작업별 창(Overview / Chat / Logs), 필터 구문과 설정 양식이 있으며 데스크톱에는 상태 타일, 진행률 막대와 worker lanes도 있습니다. mod는 scripts/mod-api.mjs를 3초마다 폴링하며 샌드박스 격리를 사용하지 않습니다. 백그라운드 worker는 작업 worktree에서 claude -p stream-json 모드로 실행됩니다. 작업마다 Claude 세션 하나를 유지하며 처음에는 --session-id로 만들고 재시도, 답변, reopen 및 merge 복구에는 --resume으로 재사용합니다. 구조화된 출력은 --json-schema로 반환하고 tool 호출과 token 사용량은 같은 attempt ledger에 기록합니다. worker 권한은 codexSandbox 설정에 매핑됩니다. read-only는 dontAsk와 읽기 전용 도구를 사용하고, workspace-write(기본값)는 acceptEdits와 Claude Code 샌드박스(failIfUnavailable, 네트워크 없음)를 사용하며, danger-full-access는 샌드박스 없이 bypassPermissions를 사용합니다. /todo:run은 hook으로 session/prompt ID를 기록해 같은 세션의 MCP server가 읽도록 하고, 중지 hook은 완전히 일치하는 claim만 해제합니다. repo 하나는 동시에 host 하나만 소유할 수 있습니다. host는 .todo/config.json에 기록되며 설정하지 않으면 Codex입니다. 다른 host에 살아 있는 프로세스가 있으면 Claude Code 쪽은 비활성화되고 HOST_MISMATCH를 반환하지만 읽기는 계속 사용할 수 있습니다. 설정 파일은 Codex 브랜치와 공유하며 Claude 전용 필드는 claudeCommand, models.claude 및 codexSandbox입니다. 내장 profile은 Codex 이름과 역할(mini / fast / standard / medium / proven / advanced / expert / ultra)을 유지하고 서로 다른 effort로 Sonnet 또는 Opus에 대응합니다. 모델 목록은 CLI initialize 응답에서 가져와 .todo/claude-models.json에 1시간 동안 캐시하며 profile이 유효하지 않으면 runner를 시작하지 않습니다. 알려진 제한으로 workspace-write에는 macOS 또는 Linux/WSL2의 bubblewrap과 socat이 필요하고(네이티브 Windows에서는 worker가 실패), danger-full-access는 root 아래에서 거부되며, 실행 중인 문제에 답변을 보낼 수 없고, Codex thread와 Claude session은 호환되지 않으며, 로컬 대시보드가 repo 내용과 로그를 노출할 수 있고, 플러그인을 업데이트한 뒤 skills/hooks/MCP를 다시 불러오려면 새 세션이 필요합니다. npm run test:todo-claude로 테스트하며 라이선스는 MIT입니다.
먼저 작성자의 README에서 marketplace와 플러그인 이름을 확인하세요. 저장소 구조에 따라 명령어가 달라질 수 있습니다.
claude plugin marketplace add blackbone/codex-marketplace claude plugin install todo
ToDo gives Claude Code a durable, repository-local task queue with automatic atomic decomposition, Ponytail full task formation and execution, connector and Git preflight, atomic DAG publication, optional repository-defined execution pipelines, isolated worktree delivery by default, optional single-branch execution, persistent per-task Claude sessions, tier-escalating retries, a local rebase merge queue, per-attempt telemetry, and a live dashboard.
This is the Claude Code fork of the Codex ToDo plugin. Both
forks use the same .todo/ state, tasks, pipelines, routing rules, MCP tools,
dashboard, and model profile names; only the host integration and the executor
differ. The Codex README describes the shared behavior in full: routing,
Ponytail lifecycle, Git execution and merge queue, single-branch execution,
pipelines, dashboard, and records.

Add the marketplace and install only this plugin:
/plugin marketplace add blackbone/codex-marketplace
/plugin install todo@blackbone
Requirements: Node.js 22+ and Git on the PATH of the Claude Code process, and
the claude CLI for background workers. On Windows the workers need the native
claude.exe (an npm claude.cmd shim cannot be started without a shell); set
claudeCommand to its full path if it is not on PATH.
Installing ToDo does not activate it in every repository. In a target Git
repository, invoke /todo:init. Initialization creates .todo/config.json,
excludes .todo/ from Git by default, installs a managed routing block in the
root CLAUDE.md without replacing other rules, and claims the repository for
Claude Code. Use /todo:start to start the detached runner and
/todo:dashboard to retrieve its local URL.
| Skill | Purpose |
| --- | --- |
| /todo:init | Activate ToDo in a Git repository. |
| /todo:route | Route project changes into tasks; perform tool setup directly. |
| /todo:create | Create an explicit self-contained task. |
| /todo:run | Claim and execute a task in the current session. |
| /todo:start | Start the runner and return its dashboard URL. |
| /todo:stop | Stop the runner. |
| /todo:supervise | Inspect runner health and failed tasks on request. |
| /todo:status, /todo:list, /todo:get | Inspect tasks, workers, and results. |
| /todo:dashboard, /todo:workers | Show the dashboard or worker state. |
| /todo:update, /todo:retry, /todo:reopen, /todo:cancel | Manage an unclaimed or closed task. |
| /todo:artifact-add | Attach files, images, URLs, code, or text context. |
In an activated repository, /todo:route applies to repository mutations even
when ToDo is not mentioned explicitly. Read-only analysis, planning, status, and
inspection stay in the current session.
Classify each operation by its purpose and effects, not just its file path or the fact that a plugin/tool is invoked.
The tooling and local verification exceptions do not expand a claimed worker's assigned task scope, repository access, permissions, or authority to create follow-up tasks. Perform tool setup or local verification only when required for the assigned task and already allowed by its restrictions; never use these exceptions to alter unrelated repositories, managed routing instructions, or .todo runtime state.
<!-- TODO TOOLING EXCEPTION END -->In an activated repository the session hooks inject the routing policy and the Ponytail full contour, so project mutations are routed through ToDo even when ToDo is not mentioned. The contour arrives through a second hook entry because Claude Code caps each injected context at 10,000 characters.
The plugin ships a Claude Code mod (mod/register.tsx) that draws the
dashboard natively, in the terminal and in the desktop Code tab. Open it with
/todo-dashboard, or from the band above the prompt: it always shows a
colored count per task state (running, waiting, failed, queued, blocked,
merging) beside a button with the state's colored circle that opens the table
filtered to that state, and ToDo opens it unfiltered. The pane has the web dashboard's
task table and columns, the task graph, one window per task (ⓘ in the
table, Details in the graph) with Overview, Chat and Logs tabs, header sorting, the same filter syntax
(status:failed|blocked profile:advanced text) with status and profile chips,
task files, chat with reply, steer and continue, task and runner logs, and the
settings form. The desktop also draws status tiles, a progress bar and worker
lanes. The status line carries a task summary, and toasts report tasks that
fail, wait for input, or complete.
Graph (desktop only; the terminal has no Graph button) draws the dependency graph: arrows run from a blocker to the task that waited for it, columns follow dependency depth, colors follow status. It shows the active tasks with everything they depend on, the whole history, or one task's ancestors and dependents (Focus), as a pipeline view of task cards. It opens at 100% centered on running work (else a task waiting for input, else a failed one). Pan and zoom with the buttons above it (arrows, − / +, Fit, Center, 100%). The drawing is a script-less image, so it takes no mouse drags, wheel zoom or clicks: the 🔍 button beside each task in the table opens the graph centered on that task, and Details opens the selected task's window.
Hovering a card lights it, its dependencies and the tasks they reach in their status colors and fades the rest; hovering an arrow lights it and its two cards. Running tasks glow blue slowly, failed ones red quickly, tasks waiting for input amber. The graph redraws only when a task's status, title or dependencies change, not while a running task's duration or tokens grow, so hover highlights stay.
The table and the graph fill the pane's height. The surface reports its size only in cells, so on the desktop Taller / Shorter tune the fit; the setting is kept across sessions.
Closed tasks keep their dependencies in .todo/history; records written before
dependencies were kept fall back to the ## Dependencies section of the task
body, so older history may lack edges.
The mod polls scripts/mod-api.mjs every three seconds. Reads and settings
saves work without a runner; task input goes through the running dashboard and
keeps its same-origin checks. Mods are not sandboxed: the mod runs with Claude
Code's own access, like the plugin's hooks.
Each background attempt is one claude -p process in stream-json mode, started
in the task worktree with TODO_RUNNER_WORKER=1. A task keeps one Claude
session: the first attempt creates it with --session-id, retries, answers,
reopen, and merge repair continue it with --resume. The worker returns its
result through --json-schema structured output. Tool calls, token usage
(including cache reads and writes) and failures are recorded in the same
attempt ledger and usage files as the Codex fork. Steer in the dashboard
queues an instruction into the running process. Claude Code has no session
archive or remote title API, so those steps are no-ops and the dashboard title
status reads unsupported.
Worker permissions are the Claude Code equivalents of the Codex sandbox modes
selected by codexSandbox in .todo/config.json:
| codexSandbox | Claude worker |
| --- | --- |
| read-only | --permission-mode dontAsk with read-only tools (Read, Grep, Glob, web reads, read-only Git) |
| workspace-write (default) | --permission-mode acceptEdits: file edits are accepted inside the worktree only; shell commands run in the Claude Code sandbox (failIfUnavailable, no unsandboxed fallback, strict empty network allowlist), so writes stay in the worktree and network access is off. Other tools that would need a prompt are denied, except the ToDo MCP server |
| danger-full-access | --permission-mode bypassPermissions without the sandbox |
/todo:run claims a task for the current session. Claude Code sends no session
or turn in MCP requests, so the SessionStart and UserPromptSubmit hooks
record the session ID and prompt ID under the Claude process ID in the plugin
data directory; the ToDo MCP server of the same session reads them. The Stop
hook releases only a claim of the exact session and prompt.
A repository is claimed by one host at a time; host in .todo/config.json
records it, and a repository without it belongs to Codex. While a live process
of the other host works in the repository (its runner PID from
.todo/daemon.json, or the PID of a task claim), ToDo in Claude Code stays
disabled: the session hook says so and task-changing MCP tools fail with
HOST_MISMATCH. Reads keep working. When that PID is dead, the first
task-changing call, runner start, or activation claims the repository for
Claude Code. Interactive claims left by Codex become waiting-input, and Codex
threads are not resumed: the next attempt starts a new Claude session. To hand a
repository over, stop the runner from the host that owns it.
The configuration file is shared with the Codex fork. Fields specific to this fork:
claudeCommand — the Claude CLI used by workers (default claude).
codexCommand belongs to the Codex fork and is ignored here.models — either the legacy Codex profile array or a map keyed by host.
This fork reads and writes models.claude; without it, the built-in profiles
below apply. A plain array stays with Codex.codexSandbox — the worker permission mode described above.Built-in profiles keep the Codex names and task roles:
| Profile | Model | Effort |
| --- | --- | --- |
| mini | claude-sonnet-5-5 | low |
| fast | claude-sonnet-5-5 | medium |
| standard | claude-sonnet-5-5 | high |
| medium | claude-sonnet-5-5 | xhigh |
| proven | claude-opus-5-5 | medium |
| advanced | claude-opus-5-5 | high |
| expert (default) | claude-opus-5-5 | xhigh |
| ultra | claude-opus-5-5 | max |
Profiles are edited in the dashboard settings, both in the Claude Code pane
(/todo-dashboard → Settings) and in the web dashboard: add, rename, remove
(not while open tasks use the profile), and choose each profile's model,
effort, and description. Saving writes models.claude; until then the
built-ins below apply.
Profile models come from the Claude CLI model list: the models the CLI
reports to an SDK initialize request (what /model offers), with each
model's effort levels. Reading it makes no model request; it is cached in
.todo/claude-models.json for an hour. A profile may name a model id, an
alias such as opus, or a dated id's base (claude-haiku-4-5). The settings
refuse a model outside the list or an effort the model does not support, and
while any profile is invalid runner_start and the dashboard Start runner
button return start-blocked with the problems; the runner does not start until
the profiles are fixed in settings. The list says which models the CLI knows,
not which the account may use: a listed model that needs usage credits still
fails at the first task attempt.
Built-ins use only Sonnet and Opus. Haiku and Fable stay in the executor
catalog for custom profiles; saved former Haiku and Fable built-ins are offered
for migration by model_profiles.
Profile updates only recommend built-ins at their declared supported effort; unavailable tiers are not silently downgraded.
The model catalog is built in, because the Claude CLI does not list models;
preflight checks that the CLI runs (claude-command). Pipelines keep their step
types (codex-exec, codex-thread); both run as Claude sessions here.
workspace-write
requires the Claude Code sandbox (macOS, or Linux/WSL2 with bubblewrap and
socat); where it is unavailable, such as native Windows, worker turns fail
instead of running unsandboxed. Choose danger-full-access there explicitly.
Interactive runs use the permissions of the current session.danger-full-access uses bypassPermissions, which Claude Code refuses when
running as root outside a recognized sandbox.claude -p does
not ask questions mid-turn, so a worker that needs input finishes with
requiresInteractive and the answer continues the task in a new turn..todo/ runtime state or place secrets in task descriptions.npm run test:todo-claude
The suite covers the host claim, the Claude executor against a fake claude
CLI, a daemon run end to end, and the executor-independent ToDo tests. Daemon
scenarios that drive the Codex app-server protocol run in the Codex fork.