ctask - Claude Task Manager
CLI tool for managing Claude-generated tasks.
Installation
Quick Install
cd claude-task
./install.sh
Then add to your ~/.bashrc or ~/.zshrc:
export PATH="$HOME/.local/bin:$PATH"
Manual Installation
cd claude-task
uv sync
ln -s $(pwd)/.venv/bin/ctask ~/.local/bin/ctask
Directory Structure
Tasks are organized by session in ~/.claude/tasks/:
~/.claude/
├── tasks/
│ ├── abc-123-session-id/ (session directory)
│ │ ├── 1.json
│ │ ├── 2.json
│ │ └── 3.json
│ └── xyz-789-session-id/ (another session)
│ └── 1.json
└── projects/
└── my-project/
└── sessions-index.json (session metadata)
The sessions-index.json contains session metadata including firstPrompt which is used as the session description:
{
"version": 1,
"entries": [
{
"sessionId": "abc-123-session-id",
"firstPrompt": "Build a CLI tool for task management",
"messageCount": 5,
"created": "2026-02-28T10:00:00Z"
}
]
}
Important: You must select a session with ctask select before using other commands.
Configuration
CTASK_SESSIONS: Optional path to custom session listing script. See CTASK_SESSIONS_SPEC.md for specification and examples/ for sample implementations.EDITOR: Editor to use forctask edit(default:vi)
Usage
First, select a session:
ctask select
This displays available sessions and lets you choose one. The selection persists for your terminal session.
List tasks (default action)
ctask
ctask list
ctask ls # alias for list
Shows a tabular view of all tasks in the selected session directory.
Create a task
ctask create "Task name" "Task description"
ctask add "Task name" "Task description" # alias for create
ctask create "Fix bug" "Fix authentication bug" --status pending --active-form "Fixing bug"
ctask create "Deploy" --after 5 --after 6 # this task comes after tasks 5 and 6
ctask create "Write code" --before 10 # this task comes before task 10
Options:
- --status: Task status (default: pending)
- --active-form: Active form description
- --blocks / --before: Task IDs this task blocks (this comes before them)
- --blocked-by / --after: Task IDs blocking this task (this comes after them)
Modify a task
ctask mod 8 --status in_progress
ctask mod 8 --name "New name" --description "New description"
ctask mod 8 --after 5 # add dependency
ctask mod 8 --unblock # remove all blockers
ctask mod 8 --unblock --after 5 # replace blockers with only task 5
Options:
- --name: Update task name
- --description: Update description
- --status: Update status
- --active-form: Update active form
- --blocks / --before: Set task IDs this blocks (replaces existing)
- --blocked-by / --after: Set/add task IDs blocking this (adds to existing, or replaces if used with --unblock)
- --unblock: Clear all blockers before applying --blocked-by
Edit a task
ctask edit 8
Opens the task JSON file in your $EDITOR.
Delete a task
ctask delete 8
ctask rm 8 # alias for delete
Deletes the specified task file.
Select a session
ctask select
Displays available sessions from ~/.claude/tasks/ (sorted by most recently used) with an interactive picker. Sessions show their firstPrompt from the sessions index as descriptions. The selection is stored per-terminal-session using the session leader PID.
You can optionally set CTASK_SESSIONS to point to a custom script that returns a JSON array of sessions. See CTASK_SESSIONS_SPEC.md for the complete specification.
Note: All other commands require a session to be selected first. If you haven't selected a session, you'll see:
No session selected. Run 'ctask select' first.
Task Format
Tasks are stored as JSON files with numerically increasing IDs:
{
"id": "7",
"subject": "Task title",
"description": "Detailed description",
"activeForm": "Present continuous form",
"status": "pending",
"blocks": [],
"blockedBy": []
}
Task IDs are automatically incremented when creating new tasks. The ID is determined by:
- The maximum of existing task IDs + 1
- The value in .highwatermark file + 1 (if it exists)
The .highwatermark file in each session directory is managed by Claude and tracks the highest task ID to prevent ID conflicts.
Session State
ctask maintains session state using the session leader PID. Each terminal session can have its own active task directory selected via ctask select.
Session state is stored in ~/.claude/ctask_state.json.
