Back to Roo Code

@roo-code/cli

apps/cli/README.md

3.54.09.0 KB
Original Source

@roo-code/cli

Command Line Interface for Roo Code - Run the Roo Code agent from the terminal without VSCode.

Overview

This CLI uses the @roo-code/vscode-shim package to provide a VSCode API compatibility layer, allowing the main Roo Code extension to run in a Node.js environment.

Installation

Install the Roo Code CLI with a single command:

bash
curl -fsSL https://raw.githubusercontent.com/RooCodeInc/Roo-Code/main/apps/cli/install.sh | sh

Requirements:

  • Node.js 20 or higher
  • macOS Apple Silicon (M1/M2/M3/M4) or Linux x64

Custom installation directory:

bash
ROO_INSTALL_DIR=/opt/roo-code ROO_BIN_DIR=/usr/local/bin curl -fsSL ... | sh

Install a specific version:

bash
ROO_VERSION=0.1.0 curl -fsSL https://raw.githubusercontent.com/RooCodeInc/Roo-Code/main/apps/cli/install.sh | sh

Updating

Re-run the install script to update to the latest version:

bash
curl -fsSL https://raw.githubusercontent.com/RooCodeInc/Roo-Code/main/apps/cli/install.sh | sh

Or run:

bash
roo upgrade

Uninstalling

bash
rm -rf ~/.roo/cli ~/.local/bin/roo

Usage

Interactive Mode (Default)

By default, the CLI auto-approves actions and runs in interactive TUI mode:

bash
export OPENROUTER_API_KEY=sk-or-v1-...

roo "What is this project?" -w ~/Documents/my-project

You can also run without a prompt and enter it interactively in TUI mode:

bash
roo -w ~/Documents/my-project

In interactive mode:

  • Tool executions are auto-approved
  • Commands are auto-approved
  • Followup questions show suggestions with a 60-second timeout, then auto-select the first suggestion
  • Browser and MCP actions are auto-approved

Approval-Required Mode (--require-approval)

If you want manual approval prompts, enable approval-required mode:

bash
roo "Refactor the utils.ts file" --require-approval -w ~/Documents/my-project

In approval-required mode:

  • Tool, command, browser, and MCP actions prompt for yes/no approval
  • Followup questions wait for manual input (no auto-timeout)

Use --print for non-interactive execution and machine-readable output:

bash
# Prompt is required
roo --print "Summarize this repository"

# Create a new task with a specific session ID (UUID)
roo --print --create-with-session-id 018f7fc8-7c96-7f7c-98aa-2ec4ff7f6d87 "Summarize this repository"

Stdin Stream Mode (--stdin-prompt-stream)

For programmatic control (one process, multiple prompts), use --stdin-prompt-stream with --print. Send NDJSON commands via stdin:

bash
printf '{"command":"start","requestId":"1","prompt":"1+1=?"}\n' | roo --print --stdin-prompt-stream --output-format stream-json

# Optional: provide taskId per start command
printf '{"command":"start","requestId":"1","taskId":"018f7fc8-7c96-7f7c-98aa-2ec4ff7f6d87","prompt":"1+1=?"}\n' | roo --print --stdin-prompt-stream --output-format stream-json

Options

OptionDescriptionDefault
[prompt]Your prompt (positional argument, optional)None
--prompt-file <path>Read prompt from a file instead of command line argumentNone
--create-with-session-id <session-id>Create a new task using the provided session ID (UUID)None
-w, --workspace <path>Workspace path to operate inCurrent directory
-p, --printPrint response and exit (non-interactive mode)false
--stdin-prompt-streamRead NDJSON control commands from stdin (requires --print)false
-e, --extension <path>Path to the extension bundle directoryAuto-detected
-d, --debugEnable debug output (includes detailed debug information, prompts, paths, etc)false
-a, --require-approvalRequire manual approval before actions executefalse
-k, --api-key <key>API key for the LLM providerFrom env var
--provider <provider>API provider (anthropic, openai, openrouter, etc.)openrouter
-m, --model <model>Model to useanthropic/claude-opus-4.6
--mode <mode>Mode to start in (code, architect, ask, debug, etc.)code
--terminal-shell <path>Absolute shell path for inline terminal command executionAuto-detected shell
-r, --reasoning-effort <effort>Reasoning effort level (unspecified, disabled, none, minimal, low, medium, high, xhigh)medium
--consecutive-mistake-limit <n>Consecutive error/repetition limit before guidance prompt (0 disables the limit)10
--ephemeralRun without persisting state (uses temporary storage)false
--oneshotExit upon task completionfalse
--output-format <format>Output format with --print: text, json, or stream-jsontext

Environment Variables

The CLI will look for API keys in environment variables if not provided via --api-key:

ProviderEnvironment Variable
anthropicANTHROPIC_API_KEY
openai-nativeOPENAI_API_KEY
openrouterOPENROUTER_API_KEY
geminiGOOGLE_API_KEY
vercel-ai-gatewayVERCEL_AI_GATEWAY_API_KEY

Architecture

┌─────────────────┐
│   CLI Entry     │
│   (index.ts)    │
└────────┬────────┘
         │
         ▼
┌─────────────────┐
│  ExtensionHost  │
│  (extension-    │
│   host.ts)      │
└────────┬────────┘
         │
    ┌────┴────┐
    │         │
    ▼         ▼
┌───────┐  ┌──────────┐
│vscode │  │Extension │
│-shim  │  │ Bundle   │
└───────┘  └──────────┘

How It Works

  1. CLI Entry Point (index.ts): Parses command line arguments and initializes the ExtensionHost

  2. ExtensionHost (extension-host.ts):

    • Creates a VSCode API mock using @roo-code/vscode-shim
    • Intercepts require('vscode') to return the mock
    • Loads and activates the extension bundle
    • Manages bidirectional message flow
  3. Message Flow:

    • CLI → Extension: emit("webviewMessage", {...})
    • Extension → CLI: emit("extensionWebviewMessage", {...})

Development

bash
# Run directly from source (no build required)
pnpm dev --provider openrouter --api-key $OPENROUTER_API_KEY --print "Hello"

# Run tests
pnpm test

# Type checking
pnpm check-types

# Linting
pnpm lint

Releasing

Official releases are created via the GitHub Actions workflow at .github/workflows/cli-release.yml.

To trigger a release:

  1. Go to ActionsCLI Release
  2. Click Run workflow
  3. Optionally specify a version (defaults to package.json version)
  4. Click Run workflow

The workflow will:

  1. Build the CLI on all platforms (macOS Apple Silicon, Linux x64)
  2. Create platform-specific tarballs with bundled ripgrep
  3. Verify each tarball
  4. Create a GitHub release with all tarballs attached

Local Builds

For local development and testing, use the build script:

bash
# Build tarball for your current platform
./apps/cli/scripts/build.sh

# Build and install locally
./apps/cli/scripts/build.sh --install

# Fast build (skip verification)
./apps/cli/scripts/build.sh --skip-verify