This is the leaked source code of Anthropic's Claude Code CLI (leaked 2026-03-31). It is a read-only reference codebase — there is no build system, no tests, and no package.json included. Treat it as a study/exploration resource.
- Language: TypeScript / TSX
- Runtime: Bun (not Node.js)
- Terminal UI: React + Ink (React for CLI)
- Scale: ~1,900 files, 512,000+ lines across
src/
- Entrypoint —
src/main.tsx: Commander.js CLI parser, service initialization, lazy feature loading via Bun feature flags - Query Engine —
src/QueryEngine.ts(~46K lines): LLM API call handler — streaming, tool loops, thinking mode, retries, token counting - Tool System —
src/Tool.ts(~29K lines) +src/tools/: ~50 tools (BashTool, FileEditTool, AgentTool, etc.), each self-contained with input schema, permissions, and execution logic - Command System —
src/commands.ts(~25K lines) +src/commands/: ~50 slash commands (/commit,/review,/config, etc.) - Context —
src/context.ts: Collects OS, shell, git, and user context for prompt construction
| Directory | Purpose |
|---|---|
src/bridge/ |
IDE integration layer (VS Code, JetBrains) — bidirectional messaging, JWT auth, session management |
src/coordinator/ |
Multi-agent orchestration |
src/services/ |
External integrations — Anthropic API, MCP, OAuth, LSP, analytics, plugins |
src/hooks/ |
React hooks including toolPermission/ for per-tool permission checks |
src/components/ |
~140 Ink UI components |
src/plugins/ |
Plugin system |
src/skills/ |
Skill system |
src/tasks/ |
Task management |
src/types/ |
Centralized TypeScript type definitions |
src/utils/ |
Shared utilities |
src/schemas/ |
Zod-based config schemas |
src/memdir/ |
Persistent memory directory |
src/voice/ |
Voice input |
src/vim/ |
Vim mode |
src/buddy/ |
Companion sprite (Easter egg) |
Bun strips inactive code at build time via import { feature } from 'bun:bundle'. Notable flags: PROACTIVE, KAIROS, BRIDGE_MODE, DAEMON, VOICE_MODE, AGENT_TRIGGERS, MONITOR_TOOL, COORDINATOR_MODE.
- Imports: ESM with explicit
.jsextensions (e.g.,from './commands.js') - Files/Dirs: kebab-case (
commit-push-pr.ts,add-dir/) - Classes/Components: PascalCase (
BashTool,QueryEngine) - Functions: camelCase (
getCommands(),getAllTools()) - Constants: UPPER_SNAKE_CASE (
ALLOWED_TOOLS,FRAME_INTERVAL_MS) - Linter: Biome (not ESLint). Look for
biome-ignoredirectives - Ant-only code: Some imports/features are gated behind
process.env.USER_TYPE === 'ant'(Anthropic internal) - Index pattern: Features export via
index.tsfiles
- Find a tool: Look in
src/tools/<ToolName>/— each tool is a directory with its implementation, UI, and permissions co-located - Find a command: Look in
src/commands/<command-name>/orsrc/commands/<command-name>.ts - Understand permissions: Start at
src/hooks/toolPermission/ - Trace an API call: Start at
src/QueryEngine.ts→src/services/api/ - Understand types: Centralized in
src/types/, tool-specific types insrc/Tool.ts - Follow the bridge: IDE integration starts at
src/bridge/bridgeMain.ts - MCP integration:
src/services/mcp/
- Always use background terminals (
isBackground: true) for every command so a terminal ID is returned - Always kill the terminal after the command completes, whether it succeeds or fails — never leave terminals open
- Do not reuse foreground shell sessions — stale sessions block future terminal operations in Codespaces
- In GitHub Codespaces, agent-spawned terminals may be hidden — they still work. Do not assume a terminal is broken if you cannot see it
- If a terminal appears unresponsive, kill it and create a new one rather than retrying in the same terminal