New: watch your coding agents work, step by step, on a live board. Try the demo, no account

Use Taskhold with ccmanager

By Jake Marsh, who builds Taskhold. Updated 2026-10-26. Facts about other tools checked 2026-10-26. 2 min read.

ccmanager runs Claude Code, Codex, Gemini CLI and other agents in git worktrees and knows when each session goes idle, busy or waiting for input. Its status hooks can pass that on to Taskhold, so the live board says a session is waiting even when the agent itself didn't report it.

The setup for the agents themselves is the same as for Claude Squad; the general pattern is in several agents on one list.

Connect the sessions

ccmanager starts each agent in a new worktree, so configure Taskhold at user scope and commit the workflow to CLAUDE.md or AGENTS.md:

claude mcp add --transport http --scope user taskhold https://taskhold.com/api/mcp --header "Authorization: Bearer <your atd_sk_ key>"

Add a waiting-for-input hook

  1. Save your API key where the script can read it: mkdir -p ~/.config/taskhold && printf '%s' 'atd_sk_...' > ~/.config/taskhold/key && chmod 600 ~/.config/taskhold/key (or export TASKHOLD_API_KEY).
  2. Save the script below as ~/.config/ccmanager/taskhold-waiting.sh and make it executable.
  3. In ccmanager, open Global Configuration > Configure Status Hooks and set the waiting_input hook to bash ~/.config/ccmanager/taskhold-waiting.sh, or add it to ~/.config/ccmanager/config.json as shown.
#!/bin/bash
# taskhold-waiting.sh: ccmanager status hook. Says on the Taskhold task in progress that a session waits for you.
# ccmanager runs it in the worktree and sets CCMANAGER_WORKTREE_BRANCH. Needs curl and jq.
key=${TASKHOLD_API_KEY:-$(cat ~/.config/taskhold/key 2>/dev/null)}
base=${TASKHOLD_API_URL:-https://taskhold.com/api}
[ -z "$key" ] && exit 0
auth="Authorization: Bearer $key"
id=$(curl -s --max-time 3 "$base/tasks/current" -H "$auth" | jq -r '.task.id // empty')
[ -z "$id" ] && exit 0
jq -n --arg m "Waiting for input in ccmanager ($CCMANAGER_WORKTREE_BRANCH)" '{message: $m}' \
  | curl -s --max-time 3 -o /dev/null "$base/tasks/$id/progress" -H "$auth" \
    -H "Content-Type: application/json" -d @-
exit 0
{
  "statusHooks": {
    "waiting_input": { "command": "bash ~/.config/ccmanager/taskhold-waiting.sh", "enabled": true }
  }
}
Merge into ~/.config/ccmanager/config.json.

One limit to know

The hook knows the branch but not which Taskhold task the session is on, so it writes to the task Taskhold returns as in progress, the most recently active one. With several sessions running at once that can be another session's task. Treat it as a nudge to look; questions that need a real answer should still come from the agent through taskhold_block.

Share this page:XLinkedInBlueskyHacker News

See how far along your coding agents are.

$12/month or $120/year after the trial. Card up front. Cancel before day 7 and you pay nothing. Every agent you run is included.

Sources

Related

Updated 2026-10-26. Something wrong or out of date? Email hello@greatwork.company.