使用指南
从安装到精通,全面掌握 Claude Code 的使用方法
什么是 Claude Code
终端里的 AI 编程搭档
Claude Code 是 Anthropic 推出的官方 CLI 工具,让你直接在终端中与 Claude AI 协作编程。它能理解你的整个代码库,编辑文件,运行命令,管理 Git 工作流 —— 一切都在你的终端中完成。
核心能力一览
代码编写与编辑
直接读写项目文件,精确替换代码片段,支持所有编程语言
代码库理解
通过 Grep/Glob 搜索理解项目结构,阅读任意文件了解上下文
终端命令执行
运行 shell 命令、测试、构建、部署,一切 CLI 操作
Git 工作流
自动 commit、创建 PR、代码审查,集成 GitHub 工作流
MCP 扩展
通过 Model Context Protocol 连接外部工具和数据源
项目记忆
CLAUDE.md 文件保存项目约定和偏好,跨会话记忆
安装与配置
系统要求
安装步骤
# 全局安装 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_KEY | API 密钥 (替代 OAuth 认证) |
ANTHROPIC_MODEL | 指定默认模型 |
CLAUDE_CODE_EFFORT_LEVEL | 思考力度 (low/medium/high/max) |
CLAUDE_CODE_SIMPLE | 简化系统提示 |
DISABLE_AUTO_COMPACT | 禁用自动压缩 |
CLAUDE_CODE_DISABLE_AUTO_MEMORY | 禁用自动记忆 |
基本使用
启动方式
# 交互式 REPL (最常用)
claude
# 带初始提示启动
claude "帮我分析这个项目的架构"
# 非交互模式 (输出结果后退出)
claude -p "解释 src/main.ts 的作用"
# 指定模型
claude --model opus
# 限制最大轮次
claude --max-turns 10
# 管道输入
cat error.log | claude -p "分析这个错误日志"
# 恢复上次会话
claude --resume
交互式 REPL 界面
常用操作示例
代码解释
❯ 解释 src/utils/auth.ts 中的
认证流程
Bug 修复
❯ 这个函数有 bug,用户输入为空
时会崩溃,帮我修复
重构代码
❯ 将 UserService 类重构为使用
依赖注入模式
写测试
❯ 为 calculateTotal 函数编写
单元测试
Git 操作
❯ 将当前修改提交,写一个有意义
的 commit message
项目搭建
❯ 创建一个 React + Vite 项目,
配置好 Tailwind CSS
斜杠命令大全
在 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 | 计划模式 | 切换到只读计划模式 |
内置工具使用
Claude Code 的 30+ 内置工具
Claude 会根据你的需求自动选择合适的工具。你不需要手动指定,但了解这些工具有助于更高效地与 Claude 协作。
文件操作工具
📖 FileRead
读取文件内容。支持按行范围读取大文件。
✏️ FileEdit
通过 "旧字符串 → 新字符串" 精确替换编辑文件。支持 replace_all 全局替换。
📝 FileWrite
创建新文件或完全覆写已有文件。
📓 NotebookEdit
编辑 Jupyter Notebook (.ipynb) 单元格。
搜索工具
🔍 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
- 复杂任务自动分解
模型选择与配置
可用模型与别名
模型选择优先级:/model 会话设置 → --model 启动参数 → ANTHROPIC_MODEL 环境变量 → 配置文件 → 默认值
| 别名 | 模型 | 适用场景 |
|---|---|---|
sonnet | Claude Sonnet (默认) | 日常编程,平衡速度和质量 |
opus | Claude Opus | 复杂推理,架构设计 (Max/Team) |
haiku | Claude 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
权限模式
五种权限模式
在 REPL 中按 Shift+Tab 切换权限模式。
默认模式
敏感操作 (写文件、执行命令) 需要你手动确认。推荐初学者使用。
接受编辑
自动接受文件编辑,但执行命令仍需确认。适合信任 Claude 编辑代码时。
计划模式
只读模式。Claude 只能搜索和阅读代码,不能修改任何内容。适合代码审查和规划。
跳过权限
自动接受所有操作,无需确认。危险!仅在完全信任时使用。
静默拒绝
不询问用户,直接拒绝需要权限的操作。
工具级权限控制
# 通过 /permissions 命令管理
/permissions
# 允许特定工具
# 例如: 总是允许 Bash 执行 npm test
# 工具名: BashTool 规则: npm test
# 拒绝特定 MCP 工具
# 工具名: mcp__server__dangerous_tool
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
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 → 屏蔽该服务器全部工具
进阶技巧
高效使用心法
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 迁移"
全自动化配置
告别 "Do you want to proceed?"
默认情况下,Claude Code 在执行写文件、运行命令等敏感操作时会弹出确认提示,需要手动选择 Yes/No。在开发效率优先或 CI/CD 自动化场景下,你可以通过以下方式跳过所有确认,实现全自动执行。
方法 1:--dangerously-skip-permissions 标志
启动时加上此标志,跳过所有权限确认,自动允许所有操作(写文件、执行命令、删除等)。
# 交互式 REPL,跳过所有权限确认
claude --dangerously-skip-permissions
# 简写也可以
claude --dangerously-skip-permissions "重构这个模块"
方法 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 的实现原理
项目概述
源码来源
本教程基于通过 npm 包 @anthropic-ai/claude-code 中 cli.js.map 的 sourcesContent 还原出的 TypeScript 源码。
目录结构
核心源码结构
入口与核心引擎
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 # 工具类型
架构总览
五层架构
核心设计原则
极致冷启动
cli.tsx 快速路径避免全量加载;所有 import 动态化;并行预取 MDM/钥匙串/OAuth。
编译时门控
feature('FLAG') 实现死代码消除,同一代码库支持公开版 vs 内部版。
单文件打包
所有依赖打包进 ~13MB 的 cli.js,dependencies: {} 为空。
工具即能力
统一 Tool 接口,内置工具、MCP 工具、插件工具共享权限和执行框架。
启动流程
完整启动链路
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();
}
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);
}
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>
);
}
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 等
]
}
工具系统实现
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)
}
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 支持
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}
终端 UI (Ink)
React + Ink 终端渲染
Claude Code 使用 React + Ink 构建终端 UI —— 将 React 组件渲染为 ANSI 终端输出。
<App> # 顶级包装器
├── AppStateProvider # 状态 Context
├── ThemeProvider # 主题 Context
└── <REPL> # 主屏幕
├── <MessageList> # 消息列表
├── <InputArea> # 用户输入
├── <Spinner> # 加载指示
├── <StatusBar> # 状态栏
└── <PermissionDialog> # 权限对话框
状态管理
双层状态
全局状态 — 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, ... })
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工作流脚本多 Agent 协作
Coordinator 模式
Coordinator (主 Agent)
分析 · 分配 · 汇总
Worker 1
文件分析
Worker 2
代码修改
Worker 3
测试运行
Swarm 后端
源码深挖
基于 Xiao Tan 的 Claude Code 源码深度研究报告,深入剖析系统内部机制
系统提示词架构
Prompt 不是文本,是编排器
Claude Code 的系统提示词不是一段静态字符串,而是一个 system prompt assembly architecture。核心文件 src/constants/prompts.ts 承担了主系统提示词的总装配:环境信息注入、工具规范注入、安全规范注入、MCP 指令注入、记忆注入等。
静态前缀 vs 动态后缀
getSystemPrompt() 的核心设计是先构造静态部分(适合 cache),再拼接动态部分(每次会话可变):
静态前缀(可缓存)
getSimpleIntroSection()— 身份与基础定位getSimpleSystemSection()— 运行时规则getSimpleDoingTasksSection()— 做任务哲学getActionsSection()— 风险动作规范getUsingYourToolsSection()— 工具使用规范getSimpleToneAndStyleSection()— 语气风格getOutputEfficiencySection()— 输出效率
动态后缀(会话特定)
- Session-specific guidance
- Memory prompt (CLAUDE.md)
- 环境信息 (OS, Git, CWD...)
- MCP instructions
- 输出语言与风格
- Scratchpad 说明
- Token budget / brief 模式
Prompt Cache Boundary:基础设施级思维
源码中明确存在 SYSTEM_PROMPT_DYNAMIC_BOUNDARY 标记,并有注释说明:边界前尽量可 cache,边界后是用户/会话特定内容,不能乱改否则会破坏缓存逻辑。
各 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 强制验证
- 不是"总规则"而是"总+局部规则"
Agent 调度链
从 AgentTool 到 runAgent 再到 query
Agent 调度不是简单的"转发到子 agent",而是一条完整的 subagent runtime pipeline:调度分流 → 上下文构造 → 生命周期管理 → 模型主循环。
完整调度链路(14 步)
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
- 独立权限和工具池
- 定制化的角色约束
三层分工
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() — 终止子进程内置 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 的问题
工具: 只读+WebStatusline Setup
配置用户的状态栏设置
工具: Read+EditExplore 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 强制要求的验证清单:
VERDICT: PASS / FAIL / PARTIAL
Agent Prompt 中的"反懒 delegation"设计
AgentTool/prompt.ts 明确教育模型如何给子 agent 写 prompt:
✅ 正确做法:
- 像对新同事 briefing 一样写 prompt
- 说明目标和原因
- 说明你已经排除了什么
- 提供足够背景让它能做判断
- 给到 file path、line、具体改动要求
❌ 错误做法 (懒 delegation):
- "基于你的发现,修复 bug"
- "根据研究结果,实现它"
- 把理解任务的工作外包给 agent
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 插件,而是模型行为层面的扩展单元。能提供的能力包括:
支持的 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 | 改写工具输入 |
permissionBehavior | allow / ask / deny |
preventContinuation | 阻止流程继续 |
stopReason | 停止原因 |
additionalContexts | 追加上下文 |
updatedMCPToolOutput | 修改 MCP 工具输出 |
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
工具执行管线
不是直连函数调用,是 Runtime Pipeline
Claude Code 的工具执行并不是"模型决定 → 直接跑函数"。toolExecution.ts 实现了一条标准的 runtime pipeline,包含校验、拦截、权限、执行、追踪、后处理等完整链路。
14 步执行管线
输入校验
Hook 拦截
权限决策
执行与追踪
后处理
权限语义的关键粘合层
resolveHookPermissionDecision() 定义了 Hook 与权限系统的严格关系:
Hook Decision Settings Rule 最终结果
───────────── ───────────── ──────────
allow (无 deny/ask) → 允许
allow deny → 仍然拒绝 ⚠️
allow ask → 仍然要问
ask * → 作为 forceDecision 传递
deny * → 直接拒绝
护城河分析
不是一个 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 hygiene 和 product engineering 全部统一起来的系统。这就是为什么它不像一个"会调工具的聊天机器人",而更像一个真正可扩展、可治理、可产品化的 Agent Operating System。
总结与启示
架构亮点
极致的性能优化
冷启动快速路径、并行预取、编译时死代码消除
优雅的工具抽象
统一 Tool 接口 + Generator 流式进度 + 权限框架
巧妙的 MCP 集成
MCP 工具透明包装为标准 Tool,命名空间隔离
React 终端 UI
Ink 将 React 组件化和声明式渲染引入终端
渐进式功能加载
Feature Flags + 条件 require = 多产品变体
安全至上
细粒度权限、拒绝追踪、破坏性命令检测
学习路线建议
入口链路
cli.tsx → main.tsx → replLauncher.tsx
核心引擎
QueryEngine.ts + query.ts
工具体系
Tool.ts → tools.ts → BashTool
API 层
services/api/claude.ts
MCP 集成
services/mcp/client.ts
高级特性
Coordinator / Swarm / Plugin / Skill
关键文件速查
| 文件 | 作用 |
|---|---|
entrypoints/cli.tsx | CLI 入口,快速路径检测 |
main.tsx | 主函数,Commander 设置 |
QueryEngine.ts | Agent 核心循环引擎 |
Tool.ts / tools.ts | 工具类型 / 注册表 |
constants/prompts.ts | 系统提示构建 |
services/api/claude.ts | Anthropic API 调用 |
services/mcp/client.ts | MCP 客户端 |
utils/config.ts | 配置管理 |
bootstrap/state.ts | 全局状态 |
types/permissions.ts | 权限类型定义 |
utils/effort.ts | 思考力度配置 |
基于 @anthropic-ai/claude-code v2.1.88 源码还原分析 · 仅供研究学习
第三部分深挖内容参考 Xiao Tan 的《Claude Code 源码深度研究报告》
源码版权归 Anthropic 所有