# Claw Code Usage This guide covers the current Rust workspace under `rust/` and the `claw` CLI binary. If you are brand new, make the doctor health check your first run: start `claw`, then run `/doctor`. ## Quick-start health check Run this before prompts, sessions, or automation: ```bash cd rust cargo build --workspace ./target/debug/claw # first command inside the REPL /doctor ``` `/doctor` is the built-in setup and preflight diagnostic. Once you have a saved session, you can rerun it with `./target/debug/claw --resume latest /doctor`. ## Prerequisites - Rust toolchain with `cargo` - One of: - `ANTHROPIC_API_KEY` for direct API access - `claw login` for OAuth-based auth - Optional: `ANTHROPIC_BASE_URL` when targeting a proxy or local service ## Install / build the workspace ```bash cd rust cargo build --workspace ``` The CLI binary is available at `rust/target/debug/claw` after a debug build. Make the doctor check above your first post-build step. ## Quick start ### First-run doctor check ```bash cd rust ./target/debug/claw /doctor ``` ### Interactive REPL ```bash cd rust ./target/debug/claw ``` ### One-shot prompt ```bash cd rust ./target/debug/claw prompt "summarize this repository" ``` ### Shorthand prompt mode ```bash cd rust ./target/debug/claw "explain rust/crates/runtime/src/lib.rs" ``` ### JSON output for scripting ```bash cd rust ./target/debug/claw --output-format json prompt "status" ``` ## Model and permission controls ```bash cd rust ./target/debug/claw --model sonnet prompt "review this diff" ./target/debug/claw --permission-mode read-only prompt "summarize Cargo.toml" ./target/debug/claw --permission-mode workspace-write prompt "update README.md" ./target/debug/claw --allowedTools read,glob "inspect the runtime crate" ``` Supported permission modes: - `read-only` - `workspace-write` - `danger-full-access` Model aliases currently supported by the CLI: - `opus` → `claude-opus-4-6` - `sonnet` → `claude-sonnet-4-6` - `haiku` → `claude-haiku-4-5-20251213` ## Authentication ### API key ```bash export ANTHROPIC_API_KEY="sk-ant-..." ``` ### OAuth ```bash cd rust ./target/debug/claw login ./target/debug/claw logout ``` ## Local Models `claw` can talk to local servers and provider gateways through either Anthropic-compatible or OpenAI-compatible endpoints. Use `ANTHROPIC_BASE_URL` with `ANTHROPIC_AUTH_TOKEN` for Anthropic-compatible services, or `OPENAI_BASE_URL` with `OPENAI_API_KEY` for OpenAI-compatible services. OAuth is Anthropic-only, so when `OPENAI_BASE_URL` is set you should use API-key style auth instead of `claw login`. ### Anthropic-compatible endpoint ```bash export ANTHROPIC_BASE_URL="http://127.0.0.1:8080" export ANTHROPIC_AUTH_TOKEN="local-dev-token" cd rust ./target/debug/claw --model "claude-sonnet-4-6" prompt "reply with the word ready" ``` ### OpenAI-compatible endpoint ```bash export OPENAI_BASE_URL="http://127.0.0.1:8000/v1" export OPENAI_API_KEY="local-dev-token" cd rust ./target/debug/claw --model "qwen2.5-coder" prompt "reply with the word ready" ``` ### Ollama ```bash export OPENAI_BASE_URL="http://127.0.0.1:11434/v1" unset OPENAI_API_KEY cd rust ./target/debug/claw --model "llama3.2" prompt "summarize this repository in one sentence" ``` ### OpenRouter ```bash export OPENAI_BASE_URL="https://openrouter.ai/api/v1" export OPENAI_API_KEY="sk-or-v1-..." cd rust ./target/debug/claw --model "openai/gpt-4.1-mini" prompt "summarize this repository in one sentence" ``` ## Supported Providers & Models `claw` has three built-in provider backends. The provider is selected automatically based on the model name, falling back to whichever credential is present in the environment. ### Provider matrix | Provider | Protocol | Auth env var(s) | Base URL env var | Default base URL | |---|---|---|---|---| | **Anthropic** (direct) | Anthropic Messages API | `ANTHROPIC_API_KEY` or `ANTHROPIC_AUTH_TOKEN` or OAuth (`claw login`) | `ANTHROPIC_BASE_URL` | `https://api.anthropic.com` | | **xAI** | OpenAI-compatible | `XAI_API_KEY` | `XAI_BASE_URL` | `https://api.x.ai/v1` | | **OpenAI-compatible** | OpenAI Chat Completions | `OPENAI_API_KEY` | `OPENAI_BASE_URL` | `https://api.openai.com/v1` | The OpenAI-compatible backend also serves as the gateway for **OpenRouter**, **Ollama**, and any other service that speaks the OpenAI `/v1/chat/completions` wire format — just point `OPENAI_BASE_URL` at the service. ### Tested models and aliases These are the models registered in the built-in alias table with known token limits: | Alias | Resolved model name | Provider | Max output tokens | Context window | |---|---|---|---|---| | `opus` | `claude-opus-4-6` | Anthropic | 32 000 | 200 000 | | `sonnet` | `claude-sonnet-4-6` | Anthropic | 64 000 | 200 000 | | `haiku` | `claude-haiku-4-5-20251213` | Anthropic | 64 000 | 200 000 | | `grok` / `grok-3` | `grok-3` | xAI | 64 000 | 131 072 | | `grok-mini` / `grok-3-mini` | `grok-3-mini` | xAI | 64 000 | 131 072 | | `grok-2` | `grok-2` | xAI | — | — | Any model name that does not match an alias is passed through verbatim. This is how you use OpenRouter model slugs (`openai/gpt-4.1-mini`), Ollama tags (`llama3.2`), or full Anthropic model IDs (`claude-sonnet-4-20250514`). ### User-defined aliases You can add custom aliases in any settings file (`~/.claw/settings.json`, `.claw/settings.json`, or `.claw/settings.local.json`): ```json { "aliases": { "fast": "claude-haiku-4-5-20251213", "smart": "claude-opus-4-6", "cheap": "grok-3-mini" } } ``` Local project settings override user-level settings. Aliases resolve through the built-in table, so `"fast": "haiku"` also works. ### How provider detection works 1. If the resolved model name starts with `claude` → Anthropic. 2. If it starts with `grok` → xAI. 3. Otherwise, `claw` checks which credential is set: `ANTHROPIC_API_KEY`/`ANTHROPIC_AUTH_TOKEN` first, then `OPENAI_API_KEY`, then `XAI_API_KEY`. 4. If nothing matches, it defaults to Anthropic. ## FAQ ### What about Codex? The name "codex" appears in the Claw Code ecosystem but it does **not** refer to OpenAI Codex (the code-generation model). Here is what it means in this project: - **`oh-my-codex` (OmX)** is the workflow and plugin layer that sits on top of `claw`. It provides planning modes, parallel multi-agent execution, notification routing, and other automation features. See [PHILOSOPHY.md](./PHILOSOPHY.md) and the [oh-my-codex repo](https://github.com/Yeachan-Heo/oh-my-codex). - **`.codex/` directories** (e.g. `.codex/skills`, `.codex/agents`, `.codex/commands`) are legacy lookup paths that `claw` still scans alongside the primary `.claw/` directories. - **`CODEX_HOME`** is an optional environment variable that points to a custom root for user-level skill and command lookups. `claw` does **not** support OpenAI Codex sessions, the Codex CLI, or Codex session import/export. If you need to use OpenAI models (like GPT-4.1), configure the OpenAI-compatible provider as shown above in the [OpenAI-compatible endpoint](#openai-compatible-endpoint) and [OpenRouter](#openrouter) sections. ## HTTP proxy support `claw` honours the standard `HTTP_PROXY`, `HTTPS_PROXY`, and `NO_PROXY` environment variables (both upper- and lower-case spellings are accepted) when issuing outbound requests to Anthropic, OpenAI-, and xAI-compatible endpoints. Set them before launching the CLI and the underlying `reqwest` client will be configured automatically. ### Environment variables ```bash export HTTPS_PROXY="http://proxy.corp.example:3128" export HTTP_PROXY="http://proxy.corp.example:3128" export NO_PROXY="localhost,127.0.0.1,.corp.example" cd rust ./target/debug/claw prompt "hello via the corporate proxy" ``` ### Programmatic `proxy_url` config option As an alternative to per-scheme environment variables, the `ProxyConfig` type exposes a `proxy_url` field that acts as a single catch-all proxy for both HTTP and HTTPS traffic. When `proxy_url` is set it takes precedence over the separate `http_proxy` and `https_proxy` fields. ```rust use api::{build_http_client_with, ProxyConfig}; // From a single unified URL (config file, CLI flag, etc.) let config = ProxyConfig::from_proxy_url("http://proxy.corp.example:3128"); let client = build_http_client_with(&config).expect("proxy client"); // Or set the field directly alongside NO_PROXY let config = ProxyConfig { proxy_url: Some("http://proxy.corp.example:3128".to_string()), no_proxy: Some("localhost,127.0.0.1".to_string()), ..ProxyConfig::default() }; let client = build_http_client_with(&config).expect("proxy client"); ``` ### Notes - When both `HTTPS_PROXY` and `HTTP_PROXY` are set, the secure proxy applies to `https://` URLs and the plain proxy applies to `http://` URLs. - `proxy_url` is a unified alternative: when set, it applies to both `http://` and `https://` destinations, overriding the per-scheme fields. - `NO_PROXY` accepts a comma-separated list of host suffixes (for example `.corp.example`) and IP literals. - Empty values are treated as unset, so leaving `HTTPS_PROXY=""` in your shell will not enable a proxy. - If a proxy URL cannot be parsed, `claw` falls back to a direct (no-proxy) client so existing workflows keep working; double-check the URL if you expected the request to be tunnelled. ## Common operational commands ```bash cd rust ./target/debug/claw status ./target/debug/claw sandbox ./target/debug/claw agents ./target/debug/claw mcp ./target/debug/claw skills ./target/debug/claw system-prompt --cwd .. --date 2026-04-04 ``` ## Session management REPL turns are persisted under `.claw/sessions/` in the current workspace. ```bash cd rust ./target/debug/claw --resume latest ./target/debug/claw --resume latest /status /diff ``` Useful interactive commands include `/help`, `/status`, `/cost`, `/config`, `/session`, `/model`, `/permissions`, and `/export`. ## Config file resolution order Runtime config is loaded in this order, with later entries overriding earlier ones: 1. `~/.claw.json` 2. `~/.config/claw/settings.json` 3. `/.claw.json` 4. `/.claw/settings.json` 5. `/.claw/settings.local.json` ## Mock parity harness The workspace includes a deterministic Anthropic-compatible mock service and parity harness. ```bash cd rust ./scripts/run_mock_parity_harness.sh ``` Manual mock service startup: ```bash cd rust cargo run -p mock-anthropic-service -- --bind 127.0.0.1:0 ``` ## Verification ```bash cd rust cargo test --workspace ``` ## Workspace overview Current Rust crates: - `api` - `commands` - `compat-harness` - `mock-anthropic-service` - `plugins` - `runtime` - `rusty-claude-cli` - `telemetry` - `tools`