The crow CLI communicates with the running Crow app via a Unix socket at ~/.local/share/crow/crow.sock (override with CROW_SOCKET). The app must be running for RPC commands to succeed; crow setup is the only subcommand that works without a running app.
All commands print JSON to stdout on success. Session and terminal identifiers are full UUIDs (e.g. a1b2c3d4-e5f6-7890-abcd-ef1234567890) — short names are not accepted.
Every subcommand source lives in Packages/CrowCLI/Sources/CrowCLILib/Commands/.
First-time setup wizard. Checks for runtime dependencies (git, gh, claude), prompts for a development root and workspaces, then writes ~/Library/Application Support/crow/devroot and scaffolds {devRoot}/.claude/.
crow setup
crow setup --dev-root ~/Dev| Flag | Required | Description |
|---|---|---|
--dev-root |
no | Skip the interactive dev-root prompt |
This is the only subcommand that does not require a running app.
Create a new session.
crow new-session --name "feature-name"| Flag | Required | Description |
|---|---|---|
--name |
yes | Session name |
Returns {"session_id": "<uuid>", "name": "..."}.
crow rename-session --session <uuid> "new-name"| Arg / Flag | Required | Description |
|---|---|---|
--session |
yes | Session UUID |
(positional) NAME |
yes | New name |
Make the given session the active tab in the app.
crow select-session --session <uuid>Print all sessions.
crow list-sessionscrow get-session --session <uuid>Returns full session details: id, name, status, ticket metadata, worktrees, terminals, and links.
crow set-status --session <uuid> active
crow set-status --session <uuid> paused
crow set-status --session <uuid> inReview
crow set-status --session <uuid> completed
crow set-status --session <uuid> archived| Arg / Flag | Required | Description |
|---|---|---|
--session |
yes | Session UUID |
(positional) STATUS |
yes | active, paused, inReview, completed, archived |
crow delete-session --session <uuid>Deletes the session metadata. Sessions on protected branches (main/master/develop) preserve the repo folder and branch — see Configuration › Safe Deletion.
Attach ticket metadata (URL, title, number) to a session. At least one of --url, --title, or --number must be provided.
crow set-ticket --session <uuid> --url "https://github.com/org/repo/issues/123" --title "Fix bug" --number 123| Flag | Required | Description |
|---|---|---|
--session |
yes | Session UUID |
--url |
no¹ | Ticket URL |
--title |
no¹ | Ticket title |
--number |
no¹ | Ticket number |
¹ At least one of --url, --title, --number is required.
Add a link (issue, PR, repo, or custom) to a session.
crow add-link --session <uuid> --label "Issue #123" --url "https://..." --type ticket| Flag | Required | Description |
|---|---|---|
--session |
yes | Session UUID |
--label |
yes | Display label |
--url |
yes | Target URL |
--type |
no | ticket, pr, repo, or custom (default: custom) |
crow list-links --session <uuid>Register a git worktree for a session. The app uses --repo-path to run git commands against the main repo when needed.
crow add-worktree \
--session <uuid> \
--repo "acme-api" \
--repo-path "/Users/you/Dev/RadiusMethod/acme-api" \
--path "/Users/you/Dev/RadiusMethod/acme-api-123-feature" \
--branch "feature/acme-api-123" \
--primary| Flag | Required | Description |
|---|---|---|
--session |
yes | Session UUID |
--repo |
yes | Repo name |
--path |
yes | Worktree path |
--branch |
yes | Branch name |
--repo-path |
no | Main repo path (used when shelling out to git against the primary repo) |
--primary |
no | Flag — mark this as the primary worktree for the session |
Note:
add-worktreedoes not support a--workspaceflag. Workspace association is derived from--repo-path.
crow list-worktrees --session <uuid>Create a new terminal tab inside a session. Use --managed for the primary Claude Code terminal that Crow auto-starts and tracks readiness for.
crow new-terminal --session <uuid> --cwd "/path/to/worktree" --name "Claude Code" --command "claude" --managed| Flag | Required | Description |
|---|---|---|
--session |
yes | Session UUID |
--cwd |
yes | Working directory |
--name |
no | Terminal display name |
--command |
no | Command to run once the shell is ready |
--managed |
no | Flag — mark as a managed Claude Code terminal (readiness tracking, auto-launch) |
crow list-terminals --session <uuid>Close a terminal tab in a session.
crow close-terminal --session <uuid> --terminal <uuid>Write text to a terminal. Newlines in TEXT are converted to Enter keypresses; include a trailing newline to submit a command.
crow send --session <uuid> --terminal <uuid> "claude --continue"$'\n'| Arg / Flag | Required | Description |
|---|---|---|
--session |
yes | Session UUID |
--terminal |
yes | Terminal UUID |
(positional) TEXT |
yes | Text to send |
Forwards a Claude Code hook event (e.g. Stop, Notification, PreToolUse) to the app. The JSON payload is read from stdin and wrapped in an RPC call. This is wired up automatically by Claude Code's hook system — you do not invoke it by hand.
echo '{"tool":"Bash"}' | crow hook-event --session <uuid> --event PreToolUseOn success it is silent; on error it prints JSON to stdout.
0— success- non-zero — connection error, validation failure, or RPC error (details on stderr)
When the app returns an RPC error, the command prints JSON of the form:
{"error": "..."}and exits non-zero. Common causes: the app is not running (socket connection refused), an invalid UUID, or a session/terminal that does not exist.