Trending-skills claude-code-source-study
Deep dive into Claude Code source code to learn production-grade AI agent architecture patterns
git clone https://github.com/Aradotso/trending-skills
T=$(mktemp -d) && git clone --depth=1 https://github.com/Aradotso/trending-skills "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/claude-code-source-study" ~/.claude/skills/aradotso-trending-skills-claude-code-source-study && rm -rf "$T"
skills/claude-code-source-study/SKILL.mdClaude Code Source Study
Skill by ara.so — Daily 2026 Skills collection.
A 25-article deep-dive into Claude Code's ~1900-file source code, covering System Prompt engineering, multi-agent orchestration, tool systems, permission security, and terminal UI. Learn production-grade AI agent patterns from Anthropic's real CLI product.
What This Project Is
This is a Chinese-language source code analysis series that dissects Claude Code (Anthropic's AI CLI coding assistant) module by module — with exact file references, line numbers, and code snippets. Each article extracts reusable design patterns for building your own AI agent applications.
Tech stack covered: Bun + TypeScript + Ink (React for terminals) + Anthropic API
Repository Structure
claude-code-source-study/ ├── docs/ │ ├── 00-目录与阅读指引.md # Index and reading guide │ ├── 01-项目全景.md # Project overview │ ├── 02-启动优化.md # Startup optimization │ ├── 03-状态管理.md # State management │ ├── 04-System-Prompt-工程.md # System prompt engineering │ ├── 05-对话循环.md # Conversation loop │ ├── 06-上下文管理.md # Context management │ ├── 07-Prompt-Cache.md # Prompt caching │ ├── 08-Thinking-与推理控制.md # Thinking & reasoning │ ├── 09-工具系统设计.md # Tool system design │ ├── 10-BashTool-深度剖析.md # BashTool deep dive │ ├── 11-命令系统.md # Command system │ ├── 12-Agent-系统.md # Agent system │ ├── 13-内置Agent设计模式.md # Built-in agent patterns │ ├── 14-任务系统.md # Task system │ ├── 15-MCP-协议实现.md # MCP protocol │ ├── 16-权限系统.md # Permission system │ ├── 17-Settings-系统.md # Settings system │ ├── 18-Hooks系统.md # Hooks system │ ├── 19-Feature-Flag与编译期优化.md │ ├── 20-API调用与错误恢复.md # API retry/recovery │ ├── 21-Ink框架深度定制.md # Ink UI customization │ ├── 22-设计系统.md # Design system │ ├── 23-Memory系统.md # Memory system │ ├── 24-Skill-Plugin开发实战.md # Plugin development │ └── 25-架构模式总结.md # Architecture patterns summary └── README.md
Reading Routes
⚡ Quick Route (7 articles) — Global understanding
01 → 02 → 03 → 05 → 09 → 12 → 25
🤖 AI Engineering Route (9 articles) — Deep AI core
01 → 03 → 04 → 05 → 06 → 08 → 09 → 12 → 13
📚 Complete Route (25 articles)
Read docs/01 through docs/25 in order.
Key Patterns Extracted from Claude Code
1. Tool Builder Pattern (buildTool()
)
buildTool()Claude Code registers tools using a builder with three-layer conditional registration:
// Pattern extracted from docs/09-工具系统设计.md const buildTool = <TInput, TOutput>(config: { name: string description: string inputSchema: ZodSchema<TInput> handler: (input: TInput, context: ToolContext) => Promise<TOutput> isEnabled?: (context: AppContext) => boolean requiresPermission?: PermissionLevel }) => config // Registration with conditions const tools = [ buildTool({ name: 'bash', ... }), buildTool({ name: 'read_file', ... }), buildTool({ name: 'write_file', ... }), ].filter(tool => tool.isEnabled?.(ctx) ?? true)
2. AsyncGenerator Conversation Loop (docs/05
)
docs/05// Pattern: state-machine conversation loop using AsyncGenerator async function* conversationLoop( messages: Message[], tools: Tool[] ): AsyncGenerator<StreamEvent> { while (true) { const stream = await anthropic.messages.stream({ model: 'claude-opus-4-5', messages, tools, system: buildSystemPrompt(), }) for await (const event of stream) { yield event } const response = await stream.finalMessage() if (response.stop_reason === 'end_turn') break if (response.stop_reason === 'tool_use') { const toolResults = await executeTools(response.content) messages.push({ role: 'assistant', content: response.content }) messages.push({ role: 'user', content: toolResults }) // loop continues } } }
3. 35-Line Minimal Store (React ↔ Non-React Bridge) (docs/03
)
docs/03// Pattern: tiny reactive store bridging React and imperative code type Listener<T> = (state: T) => void function createStore<T>(initialState: T) { let state = initialState const listeners = new Set<Listener<T>>() return { getState: () => state, setState: (updater: Partial<T> | ((s: T) => T)) => { state = typeof updater === 'function' ? updater(state) : { ...state, ...updater } listeners.forEach(l => l(state)) }, subscribe: (listener: Listener<T>) => { listeners.add(listener) return () => listeners.delete(listener) }, // React hook integration useStore: () => { const [s, setS] = React.useState(state) React.useEffect(() => subscribe(setS), []) return s } } }
4. System Prompt Segmented Construction (docs/04
)
docs/04// Pattern: build system prompt in segments with cache boundaries function buildSystemPrompt(context: AppContext): SystemPrompt { return [ // Static segment — cache this (never changes) { type: 'text', text: CORE_INSTRUCTIONS, cache_control: { type: 'ephemeral' } }, // Semi-static segment — cache per project { type: 'text', text: buildProjectContext(context.project), cache_control: { type: 'ephemeral' } }, // Dynamic segment — never cache (changes each turn) { type: 'text', text: buildDynamicContext(context.session) }, ] }
5. Context Auto-Compact with Token Budget (docs/06
)
docs/06// Pattern: token budget management with auto-compact const TOKEN_BUDGET = { MAX_CONTEXT: 200_000, COMPACT_THRESHOLD: 0.85, // compact at 85% full SUMMARY_RESERVE: 2_000, } async function maybeCompact(messages: Message[]): Promise<Message[]> { const tokenCount = await countTokens(messages) if (tokenCount < TOKEN_BUDGET.MAX_CONTEXT * TOKEN_BUDGET.COMPACT_THRESHOLD) { return messages } // Summarize older messages, keep recent ones verbatim const keepRecent = messages.slice(-20) const toSummarize = messages.slice(0, -20) const summary = await summarize(toSummarize) return [ { role: 'user', content: `Previous conversation summary:\n${summary}` }, { role: 'assistant', content: 'Understood.' }, ...keepRecent, ] }
6. Permission 7-Step Decision Pipeline (docs/16
)
docs/16// Pattern: layered permission evaluation type PermissionMode = 'default' | 'acceptEdits' | 'bypassPermissions' | 'plan' | 'auto' | 'strict' | 'custom' async function evaluatePermission( action: ToolAction, context: PermissionContext ): Promise<PermissionResult> { // Step 1: Check bypass mode if (context.mode === 'bypassPermissions') return { allowed: true } // Step 2: Check if action is always-safe if (isAlwaysSafe(action)) return { allowed: true } // Step 3: Check allowlist if (isAllowlisted(action, context.allowlist)) return { allowed: true } // Step 4: Check blocklist if (isBlocklisted(action, context.blocklist)) return { allowed: false, reason: 'blocklisted' } // Step 5: Check auto-approve rules if (matchesAutoApprove(action, context.rules)) return { allowed: true } // Step 6: Check session memory if (context.sessionMemory.has(actionKey(action))) return { allowed: true } // Step 7: Ask user const decision = await promptUser(action) if (decision.remember) context.sessionMemory.add(actionKey(action)) return { allowed: decision.approved } }
7. Multi-Agent Context Isolation (docs/12
)
docs/12// Pattern: sub-agent with isolated context async function spawnSubAgent(task: AgentTask, parentContext: AgentContext) { const subContext: AgentContext = { // Isolated: sub-agent gets its own conversation messages: [], sessionId: generateId(), // Inherited: shares tools and permissions from parent tools: parentContext.tools, permissionMode: parentContext.permissionMode, // Scoped: limited working directory cwd: task.workingDir ?? parentContext.cwd, // Budget: prevent runaway sub-agents maxTurns: task.maxTurns ?? 10, tokenBudget: task.tokenBudget ?? 50_000, } return conversationLoop( [{ role: 'user', content: task.prompt }], subContext.tools, subContext ) }
8. withRetry for API Overload (docs/20
)
docs/20// Pattern: exponential backoff with overload handling async function withRetry<T>( fn: () => Promise<T>, options = { maxAttempts: 3, baseDelay: 1000 } ): Promise<T> { for (let attempt = 1; attempt <= options.maxAttempts; attempt++) { try { return await fn() } catch (err) { if (attempt === options.maxAttempts) throw err // Handle Anthropic 529 overloaded if (isOverloadError(err)) { const delay = options.baseDelay * Math.pow(2, attempt - 1) await sleep(delay + Math.random() * 1000) // jitter continue } // Don't retry non-retriable errors if (isAuthError(err) || isInvalidRequestError(err)) throw err throw err } } throw new Error('unreachable') }
Applying These Patterns to Your Own Agent
Minimal Agent Scaffold
import Anthropic from '@anthropic-ai/sdk' const anthropic = new Anthropic({ apiKey: process.env.ANTHROPIC_API_KEY }) // 1. Define tools using builder pattern const tools = [ buildTool({ name: 'read_file', description: 'Read a file from disk', inputSchema: z.object({ path: z.string() }), handler: async ({ path }) => fs.readFile(path, 'utf-8'), }), ] // 2. Build system prompt with cache segments const systemPrompt = buildSystemPrompt({ static: CORE_RULES, dynamic: '' }) // 3. Run conversation loop for await (const event of conversationLoop( [{ role: 'user', content: userInput }], tools )) { if (event.type === 'text') process.stdout.write(event.text) }
Thinking / Extended Reasoning Config (docs/08
)
docs/08// Control reasoning effort per request type ThinkingConfig = | { type: 'disabled' } | { type: 'enabled'; budget_tokens: number } // "ultrathink" = maximum budget const EFFORT_LEVELS = { low: { type: 'enabled', budget_tokens: 1_000 }, medium: { type: 'enabled', budget_tokens: 5_000 }, high: { type: 'enabled', budget_tokens: 10_000 }, ultrathink: { type: 'enabled', budget_tokens: 32_000 }, } satisfies Record<string, ThinkingConfig> const response = await anthropic.messages.create({ model: 'claude-opus-4-5', thinking: EFFORT_LEVELS.ultrathink, messages, })
Troubleshooting
| Problem | Solution |
|---|---|
| Article links 404 | Clone the repo — all articles are in locally |
| Code examples reference internal modules | They're illustrative patterns extracted from analysis, not runnable as-is |
| Need the actual Claude Code source | See Anthropic's published CLI source |
| Want to contribute an article | Open a PR to following the existing article format |
Start Here
git clone https://github.com/luyao618/Claude-Code-Source-Study cd Claude-Code-Source-Study # Quick route: global understanding (7 articles) open docs/01-项目全景.md # AI engineering deep dive (9 articles) open docs/04-System-Prompt-工程.md # Architecture patterns summary (read last) open docs/25-架构模式总结.md