Skip to content

Claude Code CLI

Official Documentation

Core docs:

Extended capabilities:

Deployment & CI/CD:

Agent SDK (TypeScript / Python):

stream-json event format cheatsheet:

Full documentation index (LLM-friendly):


Installation

Prerequisites: Node.js >= 18

bash
npm install -g @anthropic-ai/claude-code

Verify installation:

bash
claude --version

Actual Invocation Method (Verified in GolemBot)

Binary path: ~/.local/bin/claude (same directory as Cursor Agent's agent)

bash
~/.local/bin/claude \
  -p "user message" \
  --output-format stream-json \
  --verbose \
  --dangerously-skip-permissions \
  [--resume <sessionId>] \
  [--model <model-alias>]

PTY is not needed. Claude Code CLI supports standard stdin/stdout — a regular child_process.spawn() suffices. All three engines (Cursor, Claude Code, OpenCode) now use the same child_process.spawn approach.


stream-json Output Format

One JSON object per line (NDJSON); stdout outputs pure JSON without ANSI escape sequences.

Event Type Overview

typesubtypeMeaningKey Fields
systeminitInitializationsession_id, model, cwd, tools[], mcp_servers[], apiKeySource
assistantAssistant reply (text / tool calls)session_id, message.content[] — may contain text and tool_use blocks
userTool execution resultssession_id, message.content[].type:"tool_result"
resultsuccessConversation ended normallysession_id, duration_ms, duration_api_ms, total_cost_usd, num_turns, result, usage
resulterrorConversation ended with erroris_error: true, result (error message), permission_denials[]

Key Format Differences from Cursor

AspectCursor AgentClaude Code
Text messagestype:"assistant" + message.content[].type:"text"Same structure
Tool call starttype:"tool_call", subtype:"started"type:"assistant" + message.content[].type:"tool_use"
Tool call resulttype:"tool_call", subtype:"completed"type:"user" + message.content[].type:"tool_result"
Extended result fieldsduration_msduration_ms, duration_api_ms, total_cost_usd, num_turns, usage
ANSI sequencesNo (clean stdout since 2026.02+)No (pure stdout)
Mixed contentNeverA single assistant message can contain both text and tool_use blocks

Assistant Message Examples

Pure text reply:

json
{"type":"assistant","session_id":"session_01","message":{"id":"msg_1","type":"message","role":"assistant","content":[{"type":"text","text":"Planning next steps."}],"usage":{"input_tokens":120,"output_tokens":45}}}

Tool call:

json
{"type":"assistant","session_id":"session_01","message":{"id":"msg_2","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_1","name":"Bash","input":{"command":"ls -la"}}]}}

Tool result (user event):

json
{"type":"user","session_id":"session_01","message":{"id":"msg_3","type":"message","role":"user","content":[{"type":"tool_result","tool_use_id":"toolu_1","content":"total 2\nREADME.md\nsrc\n"}]}}

The tool result content can be either a string or array format:

json
{"type":"tool_result","tool_use_id":"toolu_2","content":[{"type":"text","text":"Task completed"}]}

Result Event Examples

json
{"type":"result","subtype":"success","session_id":"session_01","total_cost_usd":0.0123,"is_error":false,"duration_ms":12345,"duration_api_ms":12000,"num_turns":2,"result":"Done.","usage":{"input_tokens":150,"output_tokens":70,"service_tier":"standard"}}
json
{"type":"result","subtype":"error","session_id":"session_02","total_cost_usd":0.001,"is_error":true,"duration_ms":2000,"result":"","error":"Permission denied","permission_denials":[{"tool_name":"Bash","tool_use_id":"toolu_9","tool_input":{"command":"git fetch origin main"}}]}

--include-partial-messages Behavior

Without this parameter, assistant events contain complete messages (output all at once after each message is finished). With this parameter, additional stream_event type events are output, containing character-level incremental deltas:

json
{"type":"stream_event","event":{"type":"content_block_delta","delta":{"type":"text_delta","text":"Hel"}}}

Streaming event sequence: message_startcontent_block_startcontent_block_delta (multiple) → content_block_stopmessage_deltamessage_stop → finally the complete assistant message is output.

GolemBot Phase 1 does not use --include-partial-messages — the complete message mode is sufficient. Character-level streaming will be added in future iterations.


Session Resume

  • --resume <sessionId> resumes a specific session
  • --session-id <uuid> uses a specified UUID as the session ID
  • --continue / -c resumes the most recent session in the current directory
  • --fork-session forks from an existing session (preserves history but with a different ID)
  • session_id can be obtained from the type: "system" init event or the type: "result" event

Difference from Cursor: Cursor can only get session_id from the result event; Claude Code provides it in the system init event.


Authentication Methods

MethodUse CaseSetup
claude auth loginLocal development (recommended)Browser OAuth flow
ANTHROPIC_API_KEY environment variableCI/CD, scripts, headless environmentsObtain from https://console.anthropic.com/settings/keys
Cloud Provider (Bedrock/Vertex/Foundry)Enterprise deploymentPlatform-specific environment variable configuration

CI/CD scenarios must use API keyclaude auth login requires browser interaction.


Skill / CLAUDE.md Mechanism

Claude Code's Skill system differs significantly from Cursor's:

CLAUDE.md (Project Memory):

LocationPurposeWhen Loaded
./CLAUDE.md or ./.claude/CLAUDE.mdProject-level instructionsAuto-loaded at session start
~/.claude/CLAUDE.mdPersonal-level instructions (all projects)Auto-loaded at session start
./CLAUDE.local.mdPersonal project-level instructions (not committed to git)Auto-loaded at session start

Skills (.claude/skills/):

  • Similar to Cursor's .cursor/skills/, each skill is a directory containing SKILL.md
  • Claude Code auto-discovers skills under .claude/skills/
  • Skill descriptions are loaded into context at session start; full content is loaded on-demand when used
  • Supports frontmatter configuration: name, description, disable-model-invocation, allowed-tools, context: fork, etc.
  • Users can manually trigger via /skill-name, or Claude automatically determines when to use them

GolemBot's skill injection strategy:

EngineInjection Method
Cursorsymlink skills/<name>.cursor/skills/<name>
Claude CodeGenerate CLAUDE.md at workspace root (containing skill descriptions and path references)

Permissions & Security

Parameter / SettingEffect
--dangerously-skip-permissionsSkip all permission prompts (required for headless)
--allowedTools "Bash,Read,Edit"Allow specified tools without confirmation (finer granularity)
--disallowedTools "Edit"Disable specified tools
permissions.allow/deny in settings.jsonPersistent permission rules

GolemBot uses --dangerously-skip-permissions (equivalent to Cursor's --force --trust --sandbox disabled).


Model Configuration

AliasCorresponding ModelUse Case
sonnetSonnet 4.6 (latest)Day-to-day coding
opusOpus 4.6 (latest)Complex reasoning
haikuHaikuSimple tasks
opusplanOpus for planning phase, Sonnet for executionMixed mode

Can be set via --model <alias> or the ANTHROPIC_MODEL environment variable.


MCP Support

Claude Code loads MCP configuration from .claude/mcp.json (not .cursor/mcp.json). The CLI supports --mcp-config ./mcp.json to load additional MCP configurations.


GitHub Actions Integration

yaml
- name: Run Claude Code
  uses: anthropics/claude-code-action@v1
  with:
    prompt: "Your prompt here"
    allowed-tools: "Bash,Read,Edit"
  env:
    ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}

Known Pitfalls & GolemBot Adaptation Notes

  1. PTY is not needed — The biggest difference from Cursor; simple child_process.spawn works
  2. No ANSI stripping needed — stdout is pure JSON, unlike Cursor's PTY output which mixes in ANSI sequences
  3. Mixed content blocks — A single assistant message may contain both text and tool_use; they need to be split and processed separately
  4. tool_result is a user event — Not Cursor's tool_call.subtype:"completed", but a separate type:"user" event
  5. session_id is available at init — No need to wait for the result event to get the session_id
  6. --verbose is required — Without this parameter, stream-json only outputs the final result, not intermediate assistant/user events
  7. result provides more metadatatotal_cost_usd, num_turns, duration_api_ms, usage can all be exposed to users
  8. --dangerously-skip-permissions is a single parameter — Unlike Cursor which needs three parameters: --force --trust --sandbox disabled
  9. Permission bypass must be explicitly enabled — You must first enable the option with --allow-dangerously-skip-permissions, then activate with --dangerously-skip-permissions or --permission-mode bypassPermissions. Or use --dangerously-skip-permissions directly, which implicitly allows it
  10. Skill paths differ — Cursor uses .cursor/skills/, Claude Code uses .claude/skills/; GolemBot must choose the injection method based on the engine

Released under the MIT License.