The ct command line

The ct command line

Manage todos from the terminal with JSON-first output — built for scripts, git hooks, and coding agents.

ct is createtodo in your terminal. Every command prints JSON, so results pipe straight into jq, git hooks, or an agent’s context.

Install and sign in

npm install -g @createtodo/cli
ct login          # opens the browser to approve this device
ct status         # which workspace and member you are

ct login approves the device in your browser and stores a workspace API key locally. ct login --api-key <key> stores a key you made yourself; CREATETODO_API_KEY in the environment skips login for CI.

The core loop

ct ready          # actionable work: open, not blocked, not claimed by another session
ct claim MZ-123   # assign to yourself, mark it started, take a lease
ct show MZ-123    # description, subtodos and relations
ct check MZ-123 2 --note "covered by the e2e spec"   # tick acceptance criterion 2
ct close MZ-123   # done — response lists newly unblocked todos

Dependencies make the loop self-organizing: ct dep add MZ-124 MZ-123 means MZ-124 waits on MZ-123, ct ready hides blocked work, and closing a blocker reports what it freed up. ct health surfaces stale, orphaned and thin todos before they rot.

Filing work

ct create "Fix sync retry loop" -l engineering -p high --label AI \
  -d "Retries hammer the API after a 401." --acceptance="- backoff caps at 60s"
ct create "Extract the retry helper" --parent MZ-123     # a subtodo
ct update MZ-123 -s "In Progress" -a me --due 2026-11-01
ct label add MZ-123 Bug
ct comment MZ-123 "Root cause: the token refresh raced the retry."

ct create warns when a top-level todo has no description or acceptance criteria, and agents label what they file AI.

Claims and leases

ct claim takes a lease on the todo for this session, renewed by every ct command that names the todo and expiring 15 minutes after the last one. The app shows it as a chip beside the assignee with the session’s name, and ct ready hides todos another live session holds. ct claim refuses a live foreign lease unless you pass --force; ct close releases the lease, ct release MZ-123 releases it without closing.

Asking and remembering

ct ask "title" --todo MZ-123 --questions '[…]' files a questionnaire you answer in the app; ct answers <id> reads it back, ct questionnaires --status open lists what is waiting and ct dismiss <id> withdraws one asked by mistake. ct remember, ct memories and ct forget manage workspace memory.

Repos and offline

  • ct link <list> binds a repository to a list: ct create files there and ct prime scopes to it. ct unlink removes the binding.
  • ct pull builds a local replica; reads fall back to it when the API is unreachable, and --local forces it. Writes made offline wait in ct queue (flush, drop <id>, clear).
  • ct sync mirrors every todo into the repo as JSON files.

Teach your agent the conventions

ct skill install claude-code   # also: codex, cursor, gemini, universal
ct init                        # runs `ct prime` on session start and after compaction

The skill teaches the commands and the conventions that matter: reference todos by identifier, never invent one, write real descriptions, ask instead of guessing. ct prime prints what is in progress, what is ready and those conventions. Run ct help for the full command surface and ct <command> --help for any command’s flags.