你每天用 Claude Code 写代码,但你有没有想过——它自己是怎么写的?
Claude Code 是一个用 AI 构建的 AI 编程工具。它的源码仓库在 GitHub 上已经积累了 106k Stars、16.8k Forks,是近年来增长最快的开发者工具之一。
这篇文章,我们就来拆开它,看看里面到底是什么。
它是什么?一句话说清楚
Claude Code 不是代码补全插件,不是聊天机器人。
它是一个运行在终端里的 AI Agent 框架——把 Claude 大模型的推理能力,和文件读写、命令执行、代码搜索等真实工程工具连接起来,让模型能自主完成跨文件的复杂任务。
技术栈:Node.js(>= 18)+ npm 包分发,主程序是单文件 cli.js,打包后约 43MB,几乎零外部依赖——所有东西全部打包进去了。
核心架构:三阶段智能体循环
Claude Code 的核心,是一个持续运行的 Agentic Loop(智能体循环):
用户输入
↓
① Gather Context(收集上下文)
搜索文件 · 读取代码 · 理解依赖
↓
② Take Action(采取行动)
编辑文件 · 执行命令 · 调用工具
↓
③ Verify Results(验证结果)
运行测试 · 检查输出 · 决定下一步
↓
反馈给 Claude → 继续循环,直到任务完成
工具系统:Claude 的「手脚」
Claude Code 内置了五大类工具,每一类都对应真实的工程操作:
文件操作类
- Read — 读取文件内容
- Write — 创建/覆盖文件
- Edit — 精确字符串替换(需要先 Read)
- Glob — 按文件名模式匹配
- Grep — 正则搜索文件内容
命令执行类
- Bash — 执行 Shell 命令(每条独立进程,工作目录持久化)
网络类
- WebFetch — 拉取网页内容
- WebSearch — 搜索引擎查询
编排类(最有意思的部分)
- Agent — 派生子 Agent,拥有独立上下文窗口
- AskUserQuestion — 主动向用户提问
- TodoWrite — 任务列表管理
- CronCreate / CronDelete — 会话内定时任务
MCP 类
- ListMcpResourcesTool / ReadMcpResourceTool — 连接外部 MCP 服务器
这些工具的设计哲学是 最小化但完备——没有多余的工具,但组合起来能完成几乎所有工程任务。
权限系统:三层防护
Claude Code 可以执行真实命令、修改真实文件,所以权限控制至关重要。
系统设计了三个层级,规则优先级:deny → ask → allow(先匹配先生效):
| 操作类型 |
默认行为 |
| 文件读取、代码搜索 |
自动允许 |
| 文件写入、编辑 |
需用户确认(会话内生效) |
| Shell 命令执行 |
需用户确认(可设置永久允许) |
五种权限模式:
default — 首次使用每个工具时询问
acceptEdits — 自动接受文件编辑
plan — 只读分析,不能修改文件或执行命令
auto — 后台安全检查后自动批准
bypassPermissions — 跳过所有提示(仅限沙箱)
即使在最宽松的模式下,.git、.claude、.vscode、.idea 等受保护目录依然会触发询问。
插件系统:官方内置 13 个插件
Claude Code 支持插件扩展,官方仓库的 plugins/ 目录里已经内置了 13 个。每个插件可以包含:
- Slash Commands — 自定义命令(如
/code-review)
- Skills — 注入上下文的技能片段
- Hooks — 事件钩子(工具调用前/后、会话启动等)
- Agents — 专用子 Agent 定义
几个有代表性的官方插件:
code-review:同时派生 5 个并行 Sonnet Agent 进行 PR 代码审查,每个 Agent 专注不同维度,最终汇总置信度评分。这是多 Agent 协作的典型应用。
security-guidance:挂在 PreToolUse 钩子上,在每次工具调用前扫描 9 类安全风险——命令注入、XSS、eval 滥用等,一旦检测到就阻断执行。
feature-dev:7 阶段结构化功能开发工作流,从需求探索到架构设计再到代码审查,全程引导。
Hooks 事件系统:自动化的关键
Hooks 是 Claude Code 的事件钩子机制,可以在特定时机自动执行用户脚本:
| 事件 |
触发时机 |
典型用法 |
SessionStart |
会话启动 |
注入项目上下文 |
PreToolUse |
工具调用前 |
安全检查、权限验证 |
PostToolUse |
工具调用后 |
自动格式化、日志记录 |
PermissionDenied |
权限拒绝后 |
可返回 retry 重试 |
Stop |
Claude 停止时 |
拦截并继续迭代 |
PreToolUse 钩子支持返回 exit code 2 来阻断工具调用——这是构建安全防护层的核心机制。
上下文管理:如何处理大型项目
大型项目的代码量远超模型上下文窗口,Claude Code 用了几种策略来应对:
CLAUDE.md 文件:项目级持久指令,存放在 .claude/ 目录,每次会话自动加载,不占用对话上下文。
Skills(技能):结构化的提示片段,按需注入,精准补充上下文,避免全量加载。
子 Agent(Subagents):每个子 Agent 有独立的上下文窗口,处理子任务后只返回结果给主 Agent,避免主会话上下文膨胀。
/compact 压缩命令:对话过长时手动触发上下文压缩,保留关键信息,丢弃冗余历史。
工程细节:藏在 CHANGELOG 里的秘密
翻阅 Claude Code 的 CHANGELOG,能看到很多有意思的工程优化细节:
性能:SSE 流式传输大帧处理优化为线性时间复杂度(之前是二次方级别);MCP 工具 Schema 移除了 per-turn 的 JSON.stringify;长会话转录写入不再随会话长度平方级增长。
内存:修复了大型会话(> 50MB)的崩溃问题;修复了 LRU 缓存 key 的内存泄漏。
Prompt Cache:优化了 Bedrock / Vertex / Foundry 的缓存命中率,移除工具描述中的动态内容——因为动态内容会导致 prompt cache 失效,增加 token 成本。
这些细节说明 Claude Code 团队在生产环境中积累了大量真实的性能问题经验。
自举:Claude Code 用自己开发自己
Claude Code 仓库里有一个 .claude/ 目录——这是 Claude Code 自身的配置文件夹。
这意味着 Claude Code 团队在用 Claude Code 开发 Claude Code。这种「自举」(Bootstrapping)不只是一个有趣的事实,它也是 Claude Code 能快速迭代的原因之一:开发者本身就是最重度的用户。
总结
Claude Code 的架构可以用三个词概括:
工具化——把模型能力和真实工程工具精确连接,不多也不少。
可扩展——插件、Hooks、Skills、子 Agent,每一层都留了扩展口。
生产导向——权限系统、上下文管理、性能优化,每个设计决策都来自真实工程场景。
它不是一个实验性的 Demo,而是一个在生产环境中被大量工程师每天使用、持续打磨的系统。
从其 GitHub 开源仓库的活跃度和迭代速度,我们就能感受到这一点。对于想要深入了解现代 AI Agent 架构,尤其是基于 Node.js 构建的复杂智能体系统的开发者来说,Claude Code 的源码是一个非常宝贵的开源实战学习案例。这种将大模型推理与确定性工具系统深度集成的框架设计,正代表了当前人工智能工程化的一个重要方向。
如果你对这类话题感兴趣,欢迎来云栈社区 与其他开发者一起交流探讨。
官方仓库:https://github.com/anthropics/claude-code