第一部分

使用指南

从安装到精通,全面掌握 Claude Code 的使用方法

01

什么是 Claude Code

终端里的 AI 编程搭档

Claude Code 是 Anthropic 推出的官方 CLI 工具,让你直接在终端中与 Claude AI 协作编程。它能理解你的整个代码库,编辑文件,运行命令,管理 Git 工作流 —— 一切都在你的终端中完成。

核心能力一览

💻

代码编写与编辑

直接读写项目文件,精确替换代码片段,支持所有编程语言

🔍

代码库理解

通过 Grep/Glob 搜索理解项目结构,阅读任意文件了解上下文

🖥️

终端命令执行

运行 shell 命令、测试、构建、部署,一切 CLI 操作

🔀

Git 工作流

自动 commit、创建 PR、代码审查,集成 GitHub 工作流

🔌

MCP 扩展

通过 Model Context Protocol 连接外部工具和数据源

🧠

项目记忆

CLAUDE.md 文件保存项目约定和偏好,跨会话记忆

02

安装与配置

系统要求

Node.js >= 18.0.0
操作系统 macOS / Linux / Windows (WSL)
账户 Anthropic Claude 订阅
安装方式 npm 全局安装

安装步骤

# 全局安装 Claude Code
npm install -g @anthropic-ai/claude-code

# 验证安装
claude --version

# 首次运行 (会引导 OAuth 登录)
claude

配置文件

Claude Code 的配置存储在 ~/.claude.json 中,包含全局设置和项目级设置。

// 主要配置项分类 (源自 utils/config.ts)

// UX 设置
theme: string           // 主题
verbose: boolean        // 详细输出
editorMode: string      // 编辑器模式
autoCompactEnabled: boolean  // 自动压缩历史

// 权限设置
bypassPermissionsModeAccepted: boolean
allowedTools: string[]  // 允许的工具列表

// MCP 服务器
mcpServers: Record<string, McpServerConfig>

// 模型偏好
// 通过 --model 或 /model 命令设置

环境变量

变量作用
ANTHROPIC_API_KEYAPI 密钥 (替代 OAuth 认证)
ANTHROPIC_MODEL指定默认模型
CLAUDE_CODE_EFFORT_LEVEL思考力度 (low/medium/high/max)
CLAUDE_CODE_SIMPLE简化系统提示
DISABLE_AUTO_COMPACT禁用自动压缩
CLAUDE_CODE_DISABLE_AUTO_MEMORY禁用自动记忆
03

基本使用

启动方式

# 交互式 REPL (最常用)
claude

# 带初始提示启动
claude "帮我分析这个项目的架构"

# 非交互模式 (输出结果后退出)
claude -p "解释 src/main.ts 的作用"

# 指定模型
claude --model opus

# 限制最大轮次
claude --max-turns 10

# 管道输入
cat error.log | claude -p "分析这个错误日志"

# 恢复上次会话
claude --resume

交互式 REPL 界面

claude — Terminal
╭─────────────────────────────────────────────╮
│ Claude Code v2.1.88 │
│ Working in: ~/my-project │
│ Model: claude-sonnet-4-20250514 │
╰─────────────────────────────────────────────╯
提示: Shift+Tab 切换权限模式 | /help 查看帮助
帮我创建一个 Express API 项目
好的,我来为你创建一个 Express API 项目。
⚙️ BashTool: mkdir -p src && npm init -y
Wrote to /Users/you/api/package.json
📝 FileWriteTool: src/index.ts
Created src/index.ts (42 lines)
项目已创建完成!包含:
• Express 路由设置
• TypeScript 配置
• 基本的健康检查端点

常用操作示例

代码解释

❯ 解释 src/utils/auth.ts 中的
  认证流程

Bug 修复

❯ 这个函数有 bug,用户输入为空
  时会崩溃,帮我修复

重构代码

❯ 将 UserService 类重构为使用
  依赖注入模式

写测试

❯ 为 calculateTotal 函数编写
  单元测试

Git 操作

❯ 将当前修改提交,写一个有意义
  的 commit message

项目搭建

❯ 创建一个 React + Vite 项目,
  配置好 Tailwind CSS
04

斜杠命令大全

在 REPL 中输入 / 即可触发

命令作用说明
配置管理
/config打开配置面板管理所有设置项
/model切换模型opus / sonnet / haiku 等
/effort调整思考力度low / medium / high / max
/permissions管理权限规则工具允许/拒绝规则
会话管理
/clear清除对话重新开始新会话
/compact压缩历史减少 token 消耗
/resume恢复会话加载之前的对话
/export导出对话保存对话记录
工具与扩展
/mcp管理 MCP 服务器添加、移除、查看 MCP
/skills技能管理查看和管理技能
/hooks钩子管理事件钩子配置
项目操作
/init初始化 CLAUDE.md创建项目记忆文件
/memory编辑记忆文件修改 CLAUDE.md
/add-dir添加工作目录多目录工作
/doctor诊断检查检查环境配置
其他
/help帮助信息查看所有命令
/login登录OAuth 认证
/logout退出登录清除认证信息
/plan计划模式切换到只读计划模式
05

内置工具使用

Claude Code 的 30+ 内置工具

Claude 会根据你的需求自动选择合适的工具。你不需要手动指定,但了解这些工具有助于更高效地与 Claude 协作。

文件操作工具

📖 FileRead

读取文件内容。支持按行范围读取大文件。

提示: Claude 编辑文件前必须先读取,确保理解上下文。

✏️ FileEdit

通过 "旧字符串 → 新字符串" 精确替换编辑文件。支持 replace_all 全局替换。

提示: 比整体重写更安全,只修改需要改的部分。

📝 FileWrite

创建新文件或完全覆写已有文件。

提示: 适合创建新文件;已有文件优先用 FileEdit。

📓 NotebookEdit

编辑 Jupyter Notebook (.ipynb) 单元格。

提示: 支持创建/编辑/删除 notebook 中的单元格。

搜索工具

🔍 Grep

基于 ripgrep 的代码内容搜索。支持正则表达式、文件类型过滤。

// Claude 会这样使用:
Grep: pattern="function auth"
      type="ts" path="src/"

📂 Glob

按文件名模式搜索文件。

// Claude 会这样使用:
Glob: pattern="**/*.test.ts"

执行与交互工具

🖥️ Bash

执行 shell 命令。最强大的工具,需权限确认。

  • 支持超时控制
  • 大输出自动持久化到磁盘
  • 自动检测只读/安全命令
  • 后台运行支持

🌐 WebFetch / WebSearch

抓取网页内容和搜索互联网。

  • WebFetch: 获取指定 URL 内容
  • WebSearch: 搜索引擎查询

🤖 Agent

创建子 Agent 执行独立子任务。

  • 子 Agent 有独立工具和权限
  • 并行处理多个子任务
  • 结果汇总返回

📋 TodoWrite

创建和管理任务清单,追踪复杂任务进度。

  • 状态: pending / in_progress / completed
  • 复杂任务自动分解
06

模型选择与配置

可用模型与别名

模型选择优先级:/model 会话设置 → --model 启动参数 → ANTHROPIC_MODEL 环境变量 → 配置文件 → 默认值

别名模型适用场景
sonnetClaude Sonnet (默认)日常编程,平衡速度和质量
opusClaude Opus复杂推理,架构设计 (Max/Team)
haikuClaude Haiku简单任务,快速响应
best当前最佳模型自动选择最强模型
sonnet[1m]Sonnet 1M 上下文超大代码库分析
opus[1m]Opus 1M 上下文超长上下文推理

思考力度 (Effort)

通过 /effort 命令或 CLAUDE_CODE_EFFORT_LEVEL 环境变量控制 Claude 的思考深度。

low

快速响应
简单任务

medium

平衡模式
一般编程

high

深度思考
复杂问题

max

最强推理
架构设计

# 使用环境变量设置
export CLAUDE_CODE_EFFORT_LEVEL=high
claude

# 或在会话中切换
/effort high
07

权限模式

五种权限模式

在 REPL 中按 Shift+Tab 切换权限模式。

default

默认模式

敏感操作 (写文件、执行命令) 需要你手动确认。推荐初学者使用。

acceptEdits

接受编辑

自动接受文件编辑,但执行命令仍需确认。适合信任 Claude 编辑代码时。

plan

计划模式

只读模式。Claude 只能搜索和阅读代码,不能修改任何内容。适合代码审查和规划。

bypassPermissions

跳过权限

自动接受所有操作,无需确认。危险!仅在完全信任时使用。

dontAsk

静默拒绝

不询问用户,直接拒绝需要权限的操作。

工具级权限控制

# 通过 /permissions 命令管理
/permissions

# 允许特定工具
# 例如: 总是允许 Bash 执行 npm test
# 工具名: BashTool  规则: npm test

# 拒绝特定 MCP 工具
# 工具名: mcp__server__dangerous_tool
08

CLAUDE.md 项目记忆

让 Claude 记住你的项目约定

CLAUDE.md 是 Claude Code 的 "记忆文件",类似于项目的 .editorconfig.eslintrc,但面向 AI。它告诉 Claude 项目的技术栈、编码规范、构建命令等信息。

文件层级与加载顺序

加载优先级 (从低到高):

1. ~/.claude/CLAUDE.md          # 全局用户级记忆
2. 项目根/CLAUDE.md             # 项目级记忆 (提交到 Git)
3. 项目根/.claude/CLAUDE.md     # 项目级 (隐藏目录)
4. 项目根/.claude/rules/*.md    # 规则文件 (可多个)
5. 项目根/CLAUDE.local.md       # 本地记忆 (不提交到 Git)
最佳实践:CLAUDE.md 提交到 Git 供团队共享,CLAUDE.local.md 放个人偏好。

CLAUDE.md 示例

# 项目: My API Service

## 技术栈
- Node.js + TypeScript
- Express.js
- PostgreSQL + Prisma ORM
- Jest 测试框架

## 构建命令
- 安装依赖: `npm install`
- 开发服务器: `npm run dev`
- 运行测试: `npm test`
- 构建生产版: `npm run build`
- 数据库迁移: `npx prisma migrate dev`

## 编码规范
- 使用 2 空格缩进
- 变量命名使用 camelCase
- 文件命名使用 kebab-case
- 所有函数必须有 TypeScript 类型注解
- 每个模块必须有对应的测试文件

## 项目结构
- src/routes/     — API 路由
- src/services/   — 业务逻辑
- src/models/     — 数据模型
- src/middleware/  — 中间件
- src/utils/      — 工具函数

## 注意事项
- 不要修改 src/generated/ 下的文件
- PR 必须通过所有测试才能合并
- 敏感配置使用环境变量,不要硬编码

管理记忆文件

# 初始化 CLAUDE.md (交互式引导)
/init

# 编辑记忆文件
/memory

# 在对话中让 Claude 更新记忆
❯ 把刚才约定的编码规范写入 CLAUDE.md
09

MCP 服务器配置

什么是 MCP?

Model Context Protocol (MCP) 是 Anthropic 推出的开放标准,允许 AI 连接外部工具和数据源。通过 MCP,Claude Code 可以访问数据库、API、自定义工具等。

添加 MCP 服务器

# 通过斜杠命令添加
/mcp

# 通过 CLI 参数添加 (stdio 类型)
claude mcp add my-server -- node /path/to/server.js

# 添加 SSE 类型服务器
claude mcp add my-api --transport sse \
  --url https://api.example.com/mcp

# 查看已配置的服务器
claude mcp list

# 移除服务器
claude mcp remove my-server

三种传输方式

Stdio

启动子进程通信。最常用,适合本地工具。

claude mcp add db-tool \
  -- node db-mcp-server.js

SSE

Server-Sent Events。适合远程服务器。

claude mcp add remote \
  --transport sse \
  --url https://mcp.example.com

HTTP

可流式 HTTP。适合 REST 风格的服务。

claude mcp add api \
  --transport http \
  --url https://api.example.com/mcp

MCP 工具命名规则

MCP 服务器的工具在 Claude Code 中以特殊前缀命名:

格式: mcp__<服务器名>__<工具名>

示例: mcp__database__query
      mcp__github__create_issue
      mcp__slack__send_message

这种命名方式便于权限管控 —— 你可以拒绝整个服务器的所有工具:

拒绝规则: mcp__untrusted_server  → 屏蔽该服务器全部工具
10

进阶技巧

高效使用心法

1. 先规划再执行

对复杂任务,先用 Plan 模式 (Shift+Tab) 让 Claude 分析方案,确认后再切回默认模式执行。

2. 善用 CLAUDE.md

把项目约定、构建命令、注意事项写入 CLAUDE.md,Claude 每次启动都会读取,避免重复说明。

3. 具体明确的指令

与其说 "优化代码",不如说 "将这个 O(n²) 的排序改为使用 Map 的 O(n) 方案"。越具体效果越好。

4. 利用管道输入

| 管道传递错误日志、测试输出等上下文给 Claude:npm test 2>&1 | claude -p "修复测试"

5. 会话持续性

claude --resume 恢复之前的会话,避免重复建立上下文。

6. 子 Agent 并行

Claude 会自动为独立子任务创建子 Agent 并行处理,提高效率。

常用工作流

# 工作流 1: 代码审查
claude -p "审查最近的 git diff,指出问题"

# 工作流 2: 从头搭建项目
claude "创建一个 Python FastAPI 项目,包含用户认证和数据库"

# 工作流 3: 调试问题
npm test 2>&1 | claude -p "分析测试失败原因并修复"

# 工作流 4: 文档生成
claude "为 src/api/ 下的所有路由生成 OpenAPI 文档"

# 工作流 5: 数据库迁移
claude "我需要给 User 表添加 avatar_url 字段,
  生成 Prisma 迁移"
11

全自动化配置

告别 "Do you want to proceed?"

默认情况下,Claude Code 在执行写文件、运行命令等敏感操作时会弹出确认提示,需要手动选择 Yes/No。在开发效率优先或 CI/CD 自动化场景下,你可以通过以下方式跳过所有确认,实现全自动执行

方法 1:--dangerously-skip-permissions 标志

启动时加上此标志,跳过所有权限确认,自动允许所有操作(写文件、执行命令、删除等)。

# 交互式 REPL,跳过所有权限确认
claude --dangerously-skip-permissions

# 简写也可以
claude --dangerously-skip-permissions "重构这个模块"
⚠️ 风险提示:顾名思义 "dangerously",此模式下 Claude 可以执行任何操作(包括删除文件、运行任意命令),请确保在可控环境中使用。

方法 2:-y / --yes 标志

自动对所有确认提示回答 "Yes",适合快速开发场景。

# 交互式模式,自动回答 yes
claude -y

# 非交互式管道模式 + 自动 yes
claude -p --yes "帮我修复这个 bug"

# 等价写法
claude -p -y "为所有函数添加类型注解"

方法 3:管道模式 (-p) 用于脚本和 CI/CD

-p 为非交互式管道模式,不会等待用户输入。搭配 --dangerously-skip-permissions 实现完全自动化。

# 最常见的 CI/CD 全自动化组合
claude -p --dangerously-skip-permissions "运行测试并修复失败的用例"

# 管道传入上下文
npm test 2>&1 | claude -p --dangerously-skip-permissions "分析并修复这些测试失败"

# 从文件读取 prompt
claude -p --dangerously-skip-permissions < prompt.txt

# 搭配 --output-format json 获取结构化输出
claude -p -y --output-format json "列出项目中的 TODO"

方法 4:配置 autoApprove 永久跳过特定工具确认

如果你不想全局跳过,可以只对特定工具设置自动批准,粒度更细。

# 设置全局自动批准的工具列表
claude config set --global autoApprove "Bash,Write,Edit"

# 查看当前配置
claude config get autoApprove

# 只批准 Bash 工具 (如 npm test, git 等命令)
claude config set --global autoApprove "Bash"

# 批准更多工具
claude config set --global autoApprove "Bash,Write,Edit,MultiEdit,NotebookEdit"
工具名称参考:常用工具名包括 Bash(执行命令)、Write(写文件)、Edit(编辑文件)、MultiEdit(多文件编辑)、NotebookEdit(Notebook 编辑)。

方法 5:通过 /permissions 命令配置规则

在 REPL 中使用 /permissions 添加细粒度规则,允许特定命令模式自动执行。

# 在 Claude Code REPL 中输入
/permissions

# 添加允许规则示例:
# 工具: Bash  规则: npm test        → npm test 自动执行
# 工具: Bash  规则: git *           → 所有 git 命令自动执行
# 工具: Bash  规则: npx prisma *    → prisma 命令自动执行

场景对照表

场景 推荐方式 命令示例
本地开发,想省去手动确认 --dangerously-skip-permissions claude --dangerously-skip-permissions
CI/CD 完全自动化 -p -y --dangerously-skip-permissions claude -p -y --dangerously-skip-permissions "task"
只想跳过特定工具确认 autoApprove 配置 claude config set --global autoApprove "Bash,Write"
只允许特定命令模式 /permissions 规则 /permissions → 添加 Bash: npm test
REPL 中临时切换 Shift+Tab 切换到 bypassPermissions Shift+Tab 选择 bypassPermissions

GitHub Actions 中的完整示例

# .github/workflows/claude-autofix.yml
name: Claude Auto Fix
on:
  issues:
    types: [opened]
jobs:
  autofix:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Install Claude Code
        run: npm install -g @anthropic-ai/claude-code
      - name: Run Claude
        env:
          ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
        run: |
          claude -p --dangerously-skip-permissions \
            "分析 issue #${{ github.event.issue.number }} 并尝试修复"
第二部分

源码深度解析

基于 v2.1.88 还原源码,深入理解 Claude Code 的实现原理

12

项目概述

源码来源

本教程基于通过 npm 包 @anthropic-ai/claude-codecli.js.mapsourcesContent 还原出的 TypeScript 源码。

npm 包@anthropic-ai/claude-code
版本2.1.88
还原文件4756 个
TS/TSX1884 个
13

目录结构

核心源码结构

入口与核心引擎

src/
├── entrypoints/
│   ├── cli.tsx        # CLI 入口 (快速路径)
│   └── init.ts        # 初始化
├── main.tsx           # 主函数 (Commander)
├── replLauncher.tsx   # REPL 挂载
├── QueryEngine.ts     # Agent 核心循环
├── query.ts           # 底层查询
├── Tool.ts            # Tool 类型定义
├── tools.ts           # 工具注册表
└── commands.ts        # 命令注册表

工具 · 服务 · UI

src/
├── tools/             # 30+ 工具实现
│   ├── BashTool/
│   ├── FileEditTool/
│   ├── GrepTool/
│   ├── AgentTool/
│   ├── MCPTool/
│   └── ...
├── services/
│   ├── api/claude.ts  # API 调用
│   └── mcp/client.ts  # MCP 客户端
├── screens/REPL.tsx   # 主 REPL 屏幕
├── components/        # Ink UI 组件
├── state/AppState.tsx # 应用状态
└── bootstrap/state.ts # 全局状态

扩展功能

src/
├── coordinator/    # 多 Agent 协调
├── assistant/      # 助手模式
├── plugins/        # 插件系统
├── skills/         # 技能系统
├── voice/          # 语音交互
├── vim/            # Vim 模式
├── daemon/         # 守护进程
└── utils/
    ├── swarm/      # 蜂群协作
    ├── permissions/ # 权限
    ├── model/      # 模型选择
    └── config.ts   # 配置管理

常量与提示

src/constants/
├── prompts.ts         # 系统提示构建
├── systemPromptSections.ts
├── cyberRiskInstruction.js
├── outputStyles.js
├── oauth.js
└── tools.js           # 工具常量

src/types/
├── message.ts         # 消息类型
├── permissions.ts     # 权限类型
├── hooks.ts           # 钩子类型
└── tools.ts           # 工具类型
14

架构总览

五层架构

用户交互层
CLI (Commander)
Terminal UI (Ink + React)
REPL 屏幕
核心引擎层
QueryEngine
命令路由
权限管控
工具与服务层
30+ 内置工具
MCP 桥接
Plugin / Skill
API 与外部服务
Anthropic API (流式)
MCP Servers
OAuth / Auth
基础设施层
全局状态
遥测 (OpenTelemetry)
会话存储

核心设计原则

极致冷启动

cli.tsx 快速路径避免全量加载;所有 import 动态化;并行预取 MDM/钥匙串/OAuth。

编译时门控

feature('FLAG') 实现死代码消除,同一代码库支持公开版 vs 内部版。

单文件打包

所有依赖打包进 ~13MB 的 cli.jsdependencies: {} 为空。

工具即能力

统一 Tool 接口,内置工具、MCP 工具、插件工具共享权限和执行框架。

15

启动流程

完整启动链路

1

cli.tsx — 入口检测

async function main(): Promise<void> {
  const args = process.argv.slice(2);
  // 快速路径: --version 零模块加载
  if (args[0] === '--version') {
    console.log(`${MACRO.VERSION} (Claude Code)`);
    return;
  }
  // 特殊子命令: --daemon, --background-session...
  // 最终: 动态 import main
  const { main: cliMain } = await import('../main.js');
  await cliMain();
}
2

main.tsx — Commander + 初始化

export async function main() {
  startMdmRawRead();        // 并行预取
  startKeychainPrefetch();  // 并行预取
  // Commander 参数解析
  const program = new CommanderCommand()
    .name('claude')
    .option('-p, --print', '...')
    .option('--model <model>', '...');
  await init();             // 初始化所有子系统
  // 启动 REPL 或无头模式
  await launchRepl(root, appProps, replProps);
}
3

replLauncher.tsx — 挂载 React UI

export async function launchRepl(root, appProps, replProps) {
  const { App } = await import('./components/App.js');
  const { REPL } = await import('./screens/REPL.js');
  await renderAndRun(root,
    <App {...appProps}>
      <REPL {...replProps} />
    </App>
  );
}
16

Agent 核心循环

QueryEngine — 灵魂所在

QueryEngine 管理整个对话生命周期,驱动 "输入 → API 调用 → 工具执行 → 反馈" 的多轮循环。

循环流程

💬

接收输入

🧠

构建上下文

📡

调用 API

⚙️

执行工具

🔄

反馈循环

完成

核心代码

export class QueryEngine {
  private mutableMessages: Message[]
  private totalUsage: NonNullableUsage

  async *submitMessage(prompt): AsyncGenerator<SDKMessage> {
    // 1. 包装权限检查
    const wrappedCanUseTool = async (tool, input) => {
      const result = await canUseTool(tool, input)
      if (result.behavior !== 'allow')
        this.permissionDenials.push({ tool_name: tool.name })
      return result
    }
    // 2. 获取系统提示 (含 CLAUDE.md 记忆)
    const systemPrompt = await fetchSystemPromptParts(...)
    // 3. 进入多轮 Agent 循环
    for await (const msg of query({
      messages: this.mutableMessages,
      systemPrompt,
      tools: filteredTools,
      model: mainLoopModel,
      maxTurns,
      canUseTool: wrappedCanUseTool,
    })) {
      yield* this.processMessage(msg)
    }
    // 4. 持久化会话
    await flushSessionStorage(...)
  }
}

系统提示的构建

系统提示由多个分段拼装而成,分为静态缓存段动态段

// constants/prompts.ts (简化)
async function getSystemPrompt(tools, model) {
  return [
    getSimpleIntroSection(),      // 身份介绍 + 安全指令
    getSimpleSystemSection(),     // Markdown 输出、权限模式
    getSimpleDoingTasksSection(), // 编程规范、先读后改
    getActionsSection(),          // 破坏性操作确认
    getUsingYourToolsSection(),   // 工具使用指南
    getSimpleToneAndStyleSection(), // 语气和风格
    SYSTEM_PROMPT_DYNAMIC_BOUNDARY, // ← 缓存分界线
    loadMemoryPrompt(),           // CLAUDE.md 内容
    computeSimpleEnvInfo(),       // 环境信息
    // ... MCP 指令、scratchpad 等
  ]
}
17

工具系统实现

Tool 接口

export type Tool = {
  name: string
  description: string
  inputSchema: ToolInputJSONSchema
  isEnabled(): boolean
  isReadOnly(): boolean
  needsPermissions(input): boolean
  // Generator 模式: 支持进度流式报告
  call(input, context): AsyncGenerator<
    ToolCallProgress, ToolCallResult, unknown
  >
  mcpInfo?: { serverName: string; toolName: string }
}

BashTool 实现细节

// tools/BashTool/BashTool.tsx (简化)
const BashTool = buildTool({
  name: 'Bash',
  maxResultSizeChars: 30_000,
  inputSchema: {
    command: string,        // 要执行的命令
    timeout: number,        // 超时 (秒)
    description: string,    // 命令描述
    run_in_background: bool // 后台运行
  },
  isReadOnly: (input) =>
    checkReadOnlyConstraints(input.command),
  call: async function*(input, context) {
    // 流式输出 shell 执行结果
    for await (const chunk of runShellCommand(...)) {
      yield { type: 'progress', content: chunk }
    }
    // 大输出持久化到磁盘
    if (output.length > 30_000) {
      persistToDisk(output)
      return { content: '<persisted-output>...' }
    }
    return { content: output }
  }
})

FileEditTool 实现细节

// tools/FileEditTool/FileEditTool.ts (简化)
// 输入: file_path, old_string, new_string, replace_all
async function* call(input, context) {
  // 1. 必须先读取过该文件 (防止盲改)
  if (!fileWasRead(input.file_path))
    throw Error('必须先用 FileRead 读取文件')

  // 2. 陈旧性检查 (文件是否被外部修改)
  if (isStale(input.file_path))
    throw Error('文件已被外部修改,请重新读取')

  // 3. 查找 old_string
  const matches = findActualString(content, old_string)
  if (matches.length === 0) throw Error('未找到匹配')
  if (matches.length > 1 && !replace_all)
    throw Error('多处匹配,需指定 replace_all')

  // 4. 执行替换,保留原始换行和编码
  const patched = applyPatch(content, old_string, new_string)
  await writeTextContent(file_path, patched)

  // 5. 通知 LSP / IDE
  notifyLSP(file_path)
}
18

API 调用层

流式 API 调用

// services/api/claude.ts (简化)
async function* queryModel(params): AsyncGenerator<StreamEvent> {
  const client = new Anthropic()
  const stream = await client.beta.messages.create({
    model,
    max_tokens: getModelMaxOutputTokens(model),
    messages: normalizeMessagesForAPI(messages),
    system: systemPrompt,
    tools: tools.map(toolToAPISchema),
    stream: true,
    thinking: thinkingConfig,  // 扩展思考
    betas: getMergedBetas(model),
  })
  for await (const event of stream) {
    yield processStreamEvent(event)
  }
}

关键特性

流式响应

逐块接收,实时渲染到终端

自动重试

可重试错误自动恢复

成本追踪

实时追踪 token 和费用

多供应商

Anthropic / Bedrock / GCP

缓存策略

系统提示前缀跨用户缓存

扩展思考

Interleaved thinking 支持

19

MCP 集成实现

MCP 客户端架构

// services/mcp/client.ts (简化)
import { Client } from '@modelcontextprotocol/sdk/client'
import { StdioClientTransport } from '...sdk/client/stdio'
import { SSEClientTransport } from '...sdk/client/sse'
import { StreamableHTTPClientTransport } from '...sdk/client/streamableHttp'

async function connectMCPServer(config) {
  const client = new Client({
    name: 'claude-code',
    version: MACRO.VERSION,
  })
  // 选择传输方式
  const transport = config.type === 'stdio'
    ? new StdioClientTransport(config)
    : config.type === 'sse'
    ? new SSEClientTransport(config.url)
    : new StreamableHTTPClientTransport(config.url)

  await client.connect(transport)
  const tools = await client.listTools()

  // MCP 工具 → 标准 Tool 对象
  return tools.map(t => MCPTool.create(client, t))
}

// 工具名: mcp__${serverName}__${toolName}
20

终端 UI (Ink)

React + Ink 终端渲染

Claude Code 使用 React + Ink 构建终端 UI —— 将 React 组件渲染为 ANSI 终端输出。

<App>                      # 顶级包装器
  ├── AppStateProvider      # 状态 Context
  ├── ThemeProvider          # 主题 Context
  └── <REPL>                # 主屏幕
      ├── <MessageList>     # 消息列表
      ├── <InputArea>       # 用户输入
      ├── <Spinner>         # 加载指示
      ├── <StatusBar>       # 状态栏
      └── <PermissionDialog> # 权限对话框
21

状态管理

双层状态

全局状态 — bootstrap/state.ts

⚠️ 源码注释: "DO NOT ADD MORE STATE HERE"

type State = {
  originalCwd: string
  projectRoot: string
  totalCostUSD: number
  sessionId: SessionId
  modelUsage: { [model]: ModelUsage }
  isInteractive: boolean
  hookMatchers: RegisteredHookMatcher[]
  // 遥测计数器...
}

应用状态 — state/AppState.tsx

// React Context 驱动
const { getAppState, setAppState } = useAppState()
// QueryEngine 通过注入访问
new QueryEngine({ getAppState, setAppState, ... })
22

Feature Flags

编译时特性门控

import { feature } from 'bun:bundle'
// 编译时: feature() 返回 false → 整个分支被移除
const SleepTool = feature('KAIROS')
  ? require('./tools/SleepTool').SleepTool : null
COORDINATOR_MODE多 Agent 协调
KAIROS助手模式
VOICE_MODE语音交互
DAEMON守护进程
WEB_BROWSER_TOOL浏览器工具
HISTORY_SNIP历史裁剪
AGENT_TRIGGERS定时触发
WORKFLOW_SCRIPTS工作流脚本
23

多 Agent 协作

Coordinator 模式

Coordinator (主 Agent)

分析 · 分配 · 汇总

Worker 1

文件分析

Worker 2

代码修改

Worker 3

测试运行

Swarm 后端

tmux — 通过 tmux 分割窗格,每个 Agent 一个窗格
iTerm2 — 利用 iTerm2 API 创建分割窗格
In-Process — 同一进程内多 Agent 循环
第三部分

源码深挖

基于 Xiao Tan 的 Claude Code 源码深度研究报告,深入剖析系统内部机制

24

系统提示词架构

Prompt 不是文本,是编排器

Claude Code 的系统提示词不是一段静态字符串,而是一个 system prompt assembly architecture。核心文件 src/constants/prompts.ts 承担了主系统提示词的总装配:环境信息注入、工具规范注入、安全规范注入、MCP 指令注入、记忆注入等。

静态前缀 vs 动态后缀

getSystemPrompt() 的核心设计是先构造静态部分(适合 cache),再拼接动态部分(每次会话可变):

静态前缀(可缓存)

  • getSimpleIntroSection() — 身份与基础定位
  • getSimpleSystemSection() — 运行时规则
  • getSimpleDoingTasksSection() — 做任务哲学
  • getActionsSection() — 风险动作规范
  • getUsingYourToolsSection() — 工具使用规范
  • getSimpleToneAndStyleSection() — 语气风格
  • getOutputEfficiencySection() — 输出效率
SYSTEM_PROMPT_DYNAMIC_BOUNDARY

动态后缀(会话特定)

  • Session-specific guidance
  • Memory prompt (CLAUDE.md)
  • 环境信息 (OS, Git, CWD...)
  • MCP instructions
  • 输出语言与风格
  • Scratchpad 说明
  • Token budget / brief 模式

Prompt Cache Boundary:基础设施级思维

源码中明确存在 SYSTEM_PROMPT_DYNAMIC_BOUNDARY 标记,并有注释说明:边界前尽量可 cache,边界后是用户/会话特定内容,不能乱改否则会破坏缓存逻辑。

关键洞察:这说明 Claude Code 已经在做 Prompt assembly with cache economics —— 连 system prompt 的 token 成本与缓存命中都做了工程化优化。

各 Prompt 模块的行为价值

身份定位

getSimpleIntroSection()

  • 定义自己是 interactive agent
  • 注入 CYBER_RISK_INSTRUCTION
  • 禁止随意生成或猜 URL

运行时规则

getSimpleSystemSection()

  • 工具运行在 permission mode 下
  • 被拒绝后不能原样重试
  • 外部结果可能含 prompt injection
  • 上下文会被自动压缩

做任务哲学

getSimpleDoingTasksSection()

  • 不要加用户没要求的功能
  • 不要过度抽象和瞎重构
  • 先读代码再改代码
  • 方法失败先诊断再换策略
  • 删除确认没用的东西

风险动作

getActionsSection()

  • 定义 destructive / hard-to-reverse 操作
  • 修改共享状态需确认
  • 不要用 destructive 当捷径
  • blast radius 思维编码进 prompt

工具使用语法

getUsingYourToolsSection()

  • 读文件用 FileRead,不用 cat
  • 改文件用 FileEdit,不用 sed
  • 无依赖的工具调用要并行
  • 定义了 tool usage grammar

会话局部指令

getSessionSpecificGuidanceSection()

  • 根据当前工具集动态注入约束
  • Explore/Plan agents 可用性
  • Verification agent 强制验证
  • 不是"总规则"而是"总+局部规则"
本质洞察:"做任务哲学"这段不是 prompt 细节,而是 Anthropic 对 AI 工程师行为规范的制度化表达。很多 coding agent 不稳定,不是不会写代码,而是行为发散。这一段就是为了解决行为漂移。
25

Agent 调度链

从 AgentTool 到 runAgent 再到 query

Agent 调度不是简单的"转发到子 agent",而是一条完整的 subagent runtime pipeline:调度分流 → 上下文构造 → 生命周期管理 → 模型主循环。

完整调度链路(14 步)

1 主模型决定调用 Agent 工具
2 AgentTool.call() 解析输入参数
3 判断: teammate / fork / built-in / background / worktree / remote
4 选择 agent definition
5 构造 prompt messages
6 构造 / 继承 system prompt
7 组装工具池
8 创建 agent-specific ToolUseContext
9 注册 hooks / skills / MCP servers
10 调用 runAgent()
11 runAgent() 内部调用 query()
12 query() 产出消息流
13 runAgent 记录 transcript、处理 lifecycle
14 AgentTool 汇总结果或走异步通知

Fork Path vs Normal Path

Fork Path(继承上下文)

  • 省略 subagent_type 且 fork feature 开启
  • 继承主线程 system prompt
  • buildForkedMessages() 构造
  • 工具集与父线程一致
  • 共享 prompt cache,不白烧 token
  • useExactTools = true
适合: 研究任务、大量中间输出的实现任务

Normal Path(独立上下文)

  • 明确指定 built-in / custom agent type
  • 基于 agentDefinition 生成新 system prompt
  • 只给该 agent 所需上下文
  • 走该 agent 的 tool restrictions
  • 独立权限和工具池
  • 定制化的角色约束
适合: 专职 agent(Explore / Plan / Verify)
Cache 优化洞察:Fork path 会尽量保持 API request prefix byte-identical,提高 prompt cache 命中。普通人只想"子任务能跑",Claude Code 想的是"子任务能跑,而且尽量复用主线程 cache"。这就是产品级系统思维。

三层分工

AgentTool

调度与模式分流 — 解析参数、判断 fork/normal/background/remote、构造上下文

runAgent()

子 Agent 上下文构造与生命周期管理 — MCP servers、hooks、skills、permission、cleanup

query()

模型消息流与 tool-calling 主循环 — 真正的对话引擎

Background vs Foreground 生命周期

Foreground

  • 主线程等待结果
  • 可在执行中被 background 化
  • 有 progress tracking
  • 结果直接返回

Background

  • 独立 abort controller
  • 后台异步运行
  • 完成后 notification 通知
  • 可选自动 summarization

runAgent() 产品化证据

runAgent.ts 不是简单 wrapper,而是子 agent 的完整 runtime constructor,包含大量产品级细节:

recordSidechainTranscript() — 记录对话副本
writeAgentMetadata() — 写入元数据
registerPerfettoAgent() — 性能追踪
cleanupAgentTracking() — 清理跟踪
killShellTasksForAgent() — 终止子进程
清理 session hooks / MCP / file state / todos
26

内置 Agent 深挖

职责分工,而不是万能 Worker

Anthropic 的方向不是让一个 agent 什么都做,而是 specialization:探索给 Explore、规划给 Plan、验证给 Verification、通用任务给 General Purpose。

六大内置 Agent

🤖

General Purpose

通用 Agent,处理搜索代码、执行多步任务等复杂工作

工具: 全部
🔍

Explore

纯读模式的代码探索专家,快速搜索和理解代码库

工具: 只读
📋

Plan

纯规划角色,输出 step-by-step 实现计划

工具: 只读
🛡️

Verification

对抗性验证器,工作是 "try to break it"

工具: 全部
📖

Claude Code Guide

回答关于 Claude Code 功能、API、SDK 的问题

工具: 只读+Web
⚙️

Statusline Setup

配置用户的状态栏设置

工具: Read+Edit

Explore Agent:绝对只读

exploreAgent.ts 的 prompt 非常严格,被故意裁成 read-only specialist

禁止操作

  • 不能创建/修改/删除/移动文件
  • 不能写临时文件
  • 不能用重定向/heredoc 写文件
  • 不能运行改变系统状态的命令

允许操作

  • Glob / Grep / FileRead 快速探索
  • Bash 只允许: ls, git status/log/diff, find, grep, cat, head, tail
  • 尽量并行用工具
  • 要快,尽快给结果

Plan Agent:架构师而非执行者

planAgent.ts 被定义成 architect / planner,降低角色混杂:

  • 只读,不准改文件
  • 需要先理解需求
  • 需要探索代码库的模式和架构
  • 输出 step-by-step implementation plan
  • 最后必须列出 Critical Files for Implementation

Verification Agent:对抗性验证器

verificationAgent.ts 是本轮深挖中非常重要的发现。它的 prompt 开头就点出两类失败模式:

失败模式 1: verification avoidance

只看代码、不跑检查、写 PASS 就走

失败模式 2: 被前 80% 迷惑

UI 看起来还行、测试也过了,就忽略最后 20% 的问题

Prompt 强制要求的验证清单:

🔨 build 构建通过
🧪 test suite 测试套件
📏 linter / type-check
🌐 frontend: 浏览器自动化验证
🖥️ backend: curl/fetch 实测响应
📟 CLI: stdout/stderr/exit code
🗄️ migration: up/down + 已有数据
🔄 refactor: 测 public API surface
⚔️ 必须做 adversarial probes
📋 每个 check 带 command + output
最终必须输出: VERDICT: PASS / FAIL / PARTIAL
关键洞察:Verification Agent 不是"再跑一次测试",而是一个 adversarial validator。它把很多 LLM 常见的"差不多就算了"直接用 prompt 反制掉了。

Agent Prompt 中的"反懒 delegation"设计

AgentTool/prompt.ts 明确教育模型如何给子 agent 写 prompt:

✅ 正确做法:
- 像对新同事 briefing 一样写 prompt
- 说明目标和原因
- 说明你已经排除了什么
- 提供足够背景让它能做判断
- 给到 file path、line、具体改动要求

❌ 错误做法 (懒 delegation):
- "基于你的发现,修复 bug"
- "根据研究结果,实现它"
- 把理解任务的工作外包给 agent
这是为什么 Claude Code 的 subagent 效果更稳:主 agent 被 prompt 强制要求承担 synthesis 责任
27

Skill / Plugin / Hook 生态

不是外挂,是模型可感知的扩展体系

很多系统也有插件和工具,但模型本身不知道有哪些扩展、什么时候该用、怎么用。Claude Code 通过 skills 列表、agent 列表、MCP instructions、session-specific guidance 让模型"知道自己的扩展能力是什么"

Skill:Workflow Package

Skill 不是文档,而是 prompt-native workflow package

本质

  • Markdown prompt bundle
  • 带 frontmatter metadata
  • 可声明 allowed-tools
  • 可按需注入当前上下文
  • 可把重复工作流压缩成可复用能力包

运行时规则

  • task 匹配 skill 时必须调用 Skill tool
  • 不能只提 skill 不执行
  • slash command 可以视为 skill 入口
  • 如果 skill 已通过 tag 注入,则不要重复调用

Plugin:Prompt + Metadata + Runtime Constraints

插件不是普通 CLI 插件,而是模型行为层面的扩展单元。能提供的能力包括:

markdown commands SKILL.md skill 目录 commandsMetadata userConfig shell frontmatter allowed-tools model / effort hints user-invocable disable-model-invocation runtime 变量替换
支持的 runtime 变量:
${CLAUDE_PLUGIN_ROOT}    — 插件根目录
${CLAUDE_PLUGIN_DATA}    — 插件数据目录
${CLAUDE_SKILL_DIR}      — 技能目录
${CLAUDE_SESSION_ID}     — 当前会话 ID
${user_config.X}         — 用户配置变量

Hook:运行时治理层

Hook 不仅能"记日志",还是 runtime policy layer,支持三个阶段拦截:

PreToolUse

工具执行前拦截

PostToolUse

工具执行后处理

PostToolUseFailure

工具失败后处理

Hook 可以返回的控制指令:

字段作用
message向对话注入消息
blockingError阻断错误
updatedInput改写工具输入
permissionBehaviorallow / ask / deny
preventContinuation阻止流程继续
stopReason停止原因
additionalContexts追加上下文
updatedMCPToolOutput修改 MCP 工具输出
安全设计:Hook 的 allow 不会自动突破 settings deny/ask rules。如果 tool 要求 user interaction 而 hook 没提供 updatedInput,仍要走统一 permission flow。Hook 强,但没有绕开核心安全模型

MCP:工具桥 + 行为说明注入通道

MCP 的价值远高于简单 tool registry,因为它能同时注入:

1. 新工具

外部 MCP Server 提供的工具,透明包装为标准 Tool

2. 使用说明

通过 getMcpInstructionsSection() 把 MCP server 的 instructions 拼进 system prompt

此外,Agent 还可以自带 agent-specific MCP servers:

  • 从配置中按名字引用现有 MCP server
  • 在 frontmatter 里内联定义 agent-specific MCP server
  • Agent 结束时自动 cleanup
28

工具执行管线

不是直连函数调用,是 Runtime Pipeline

Claude Code 的工具执行并不是"模型决定 → 直接跑函数"。toolExecution.ts 实现了一条标准的 runtime pipeline,包含校验、拦截、权限、执行、追踪、后处理等完整链路。

14 步执行管线

输入校验

1 查找 tool 定义
2 解析 MCP metadata
3 Zod schema 校验输入
4 tool-specific validateInput

Hook 拦截

5 Bash speculative classifier check
6 运行 PreToolUse hooks
7 解析 hook permission result

权限决策

8 走 permission 决策流程
9 根据 updatedInput 修正输入

执行与追踪

10 真正执行 tool.call()
11 记录 analytics / tracing / OTel

后处理

12 运行 PostToolUse hooks
13 处理 structured output
14 失败走 PostToolUseFailure hooks

权限语义的关键粘合层

resolveHookPermissionDecision() 定义了 Hook 与权限系统的严格关系:

Hook Decision     Settings Rule     最终结果
─────────────     ─────────────     ──────────
allow             (无 deny/ask)     → 允许
allow             deny              → 仍然拒绝 ⚠️
allow             ask               → 仍然要问
ask               *                 → 作为 forceDecision 传递
deny              *                 → 直接拒绝
Hook 的 allow 不是万能通行证。整个权限模型是多层叠加、最严格者胜出
29

护城河分析

不是一个 prompt,而是一个 Agent Operating System

很多人复刻 coding agent 时只拿走一个 system prompt + 文件编辑工具 + bash 工具 + CLI 壳。但 Claude Code 真实的护城河,是把 prompt、tool、permission、agent、skill、plugin、hook、MCP、cache 和产品体验统一起来的完整系统

11 层护城河

📐

Prompt Architecture

模块化 prompt assembly,不是静态文本

🛡️

Tool Runtime Governance

14 步执行管线,不是直连函数调用

🔐

Permission Model

多层权限叠加,最严格者胜出

🪝

Hook Policy Layer

运行时治理,可拦截/修改/阻断

🧩

Agent Specialization

Explore/Plan/Verify 专职分工

📦

Skill Workflow Packaging

可复用的 prompt-native 工作流包

🔌

Plugin Integration

模型行为层面的扩展单元

🌐

MCP Instruction Injection

工具+使用说明双通道注入

💾

Prompt Cache Optimization

静态/动态分界,fork 共享 cache

Async/BG/Remote Lifecycle

完整的 agent 生命周期管理

📊

Transcript / Telemetry

transcript、cleanup、resume 全纳入

四个核心优势

1. 把"好行为"制度化

不把"好习惯"交给模型即兴发挥,而是写进 prompt 和 runtime 规则:不要乱加功能、不要过度抽象、不要瞎重试被拒绝的工具、不要未验证就说成功、匹配 skill 时必须执行 skill、verification 不能只看代码必须跑命令。

2. 上下文是稀缺资源

大量设计围绕上下文优化:system prompt 动静边界、prompt cache boundary、fork 共享 cache、skill 按需注入、MCP instructions 按连接状态注入、function result clearing、summarize tool results。它不是把 token 当免费空气,而是当 runtime 预算来管理。

3. Agent 分工降低混乱

研究和探索不用污染主线程;规划和实现分离,降低混乱;验证独立出来,对抗"实现者 bias"。很多系统的问题是一个 agent 既研究、又规划、又实现、又验收,最终哪件事都不够稳定。

4. 生态是"模型可感知"的

通过 skills 列表、agent 列表、MCP instructions、session-specific guidance、command integration,让模型"知道自己的扩展能力是什么"。这才是生态真正能发挥作用的关键。

一句话总结

Claude Code 的真正秘密,不是一段 system prompt,而是一个把 prompt architecture、tool runtime、permission model、agent orchestration、skill packaging、plugin system、hooks governance、MCP integration、context hygieneproduct engineering 全部统一起来的系统。这就是为什么它不像一个"会调工具的聊天机器人",而更像一个真正可扩展、可治理、可产品化的 Agent Operating System
30

总结与启示

架构亮点

极致的性能优化

冷启动快速路径、并行预取、编译时死代码消除

优雅的工具抽象

统一 Tool 接口 + Generator 流式进度 + 权限框架

巧妙的 MCP 集成

MCP 工具透明包装为标准 Tool,命名空间隔离

React 终端 UI

Ink 将 React 组件化和声明式渲染引入终端

渐进式功能加载

Feature Flags + 条件 require = 多产品变体

安全至上

细粒度权限、拒绝追踪、破坏性命令检测

学习路线建议

1

入口链路

cli.tsxmain.tsxreplLauncher.tsx

2

核心引擎

QueryEngine.ts + query.ts

3

工具体系

Tool.tstools.tsBashTool

4

API 层

services/api/claude.ts

5

MCP 集成

services/mcp/client.ts

6

高级特性

Coordinator / Swarm / Plugin / Skill

关键文件速查

文件作用
entrypoints/cli.tsxCLI 入口,快速路径检测
main.tsx主函数,Commander 设置
QueryEngine.tsAgent 核心循环引擎
Tool.ts / tools.ts工具类型 / 注册表
constants/prompts.ts系统提示构建
services/api/claude.tsAnthropic API 调用
services/mcp/client.tsMCP 客户端
utils/config.ts配置管理
bootstrap/state.ts全局状态
types/permissions.ts权限类型定义
utils/effort.ts思考力度配置

基于 @anthropic-ai/claude-code v2.1.88 源码还原分析 · 仅供研究学习
第三部分深挖内容参考 Xiao Tan 的《Claude Code 源码深度研究报告》
源码版权归 Anthropic 所有