Claude-code源码学习

GitHub对应仓库:1664178416/claude-code-map-learn: claude-code源码学习

若可以请给我点个star⭐

📋 前言

Claude Code 源码泄露事件引起了广泛关注。作为 AI 编程工具的天花板,它的源码对学习 AI 应用开发来说简直是宝藏资源。本文将从工程角度深度解析其架构设计,帮助大家提升 AI 项目开发能力。


一、源码泄露始末

1.1 发生了什么?

Claude Code 是通过 npm 发布的开发者工具。正常情况下,代码上线前会经过压缩混淆处理,但开发时用于调试的 Source Map 文件(相当于"翻译对照表")应该在发布时删除。

然而 Anthropic 的工程师在发布 Claude Code 2.1.88 版本时,打包工具 Bun 默认生成了 Source Map 文件,而他们忘了在发布配置里把 .map 文件排除掉。

结果:一个 59.8 MBcli.js.map 文件就这么被直接发到了公开的 npm 仓库。

1.2 泄露了什么?

  • 1906 个 TypeScript 源文件
  • 约 51.2 万行代码
  • 包括:Agent 循环引擎、40+ 内置工具完整实现、系统提示词组装逻辑、记忆系统、上下文压缩、权限管控机制等
  • 不包括:服务端模型训练代码和 API 后端逻辑

1.3 这是第二次!

更有趣的是,去年 2 月 Claude Code 刚发布的时候就出过一模一样的事故。同一个错误犯了两次,属实是 Vibe Coding 上瘾了。


二、整体架构解析

Claude Code 使用 React Ink 框架开发(用 React 写命令行界面),整个项目分为 6 层:

复制代码
┌─────────────────────────────────────────┐
│     CLI 和界面层(终端交互)            │
├─────────────────────────────────────────┤
│     Agent 循环引擎(大脑)              │
├─────────────────────────────────────────┤
│     工具系统(40+内置工具+MCP扩展)     │
├─────────────────────────────────────────┤
│     记忆系统(解决断片问题)            │
├─────────────────────────────────────────┤
│     上下文压缩系统(解决token满的问题)  │
├─────────────────────────────────────────┤
│     权限和安全系统                       │
└─────────────────────────────────────────┘

三、核心模块深度解析

3.1 Agent 循环:朴素而强大的 ReAct 机制

Claude Code 的核心循环出奇地朴素------就是一个 while(true) 无限循环:

复制代码
// query.ts
while (true) {
  // 1. 上下文压缩(防止 token 爆炸)
  // 2. 调用大模型,流式获取响应
  // 3. 解析模型返回的工具调用
  // 4. 执行工具,获取结果
  // 5. 把结果追加到对话历史
  // 6. 如果没有新的工具调用,结束;否则继续循环
}

这 就是 AI 领域著名的 ReAct 机制 (推理 + 执行),让 AI 自己形成 思考 → 行动 → 观察 → 再思考 的闭环。

代码中还有个彩蛋------工程师留下的"巫师守则"注释:

复制代码
/**
 * The rules of thinking are lengthy and fortuitous...
 * Heed these rules well, young wizard.
 * For they are the rules of thinking,
 * and the rules of thinking are the rules of the universe.
 * If ye does not heed these rules, ye will be punished
 * with an entire day of debugging and hair pulling.
 */

3.2 工具系统:fail-closed 安全哲学

Claude Code 内置 40+ 工具,每个工具都通过 buildTool 工厂函数创建,有个精妙的默认值设计

复制代码
// Tool.ts
// Defaults (fail-closed where it matters):
const TOOL_DEFAULTS = {
  isConcurrencySafe: (_input?: unknown) => false,  // 默认不安全
  isReadOnly: (_input?: unknown) => false,         // 默认会修改
  isDestructive: (_input?: unknown) => false,     // 默认有破坏性
  toAutoClassifierInput: () => '',               // 默认跳过安全检查
}

fail-closed(失败时关闭) 思想:如果你没声明"我只是读个文件",系统就默认它危险,不让它并发执行。

💡 这就像公司门禁系统------没刷卡默认进不去,而不是默认让进。

3.3 读写分离的并发控制

Claude Code 实现了一套聪明的读写分离机制

复制代码
// 连续几个只读工具可以一起跑
// 一旦遇到写操作,就得排队等前面的都完成了
if (isConcurrencySafe && acc[acc.length - 1]?.isConcurrencySafe) {
  // 合并到并发批次
} else {
  // 新开一个批次
}

这正是数据库领域的读读并行、读写互斥思想在 AI 工具执行中的应用。

3.4 System Prompt 缓存优化

Claude Code 用 DYNAMIC_BOUNDARY 标记把提示词精确切成两半:

复制代码
┌────────────────────────────────────────┐
│  静态部分(全球用户共享缓存)           │
│  角色定义、行为规范、工具说明...       │
├─ DYNAMIC_BOUNDARY ────────────────────┤
│  动态部分(每个用户各不相同)          │
│  当前时间、Git状态、CLAUDE.md配置...  │
└────────────────────────────────────────┘

效果:静态部分全球几百万用户共享同一份缓存,节省大量 token 和成本。

3.5 内容检索:不用 RAG 的智慧

业界流行 RAG(检索增强生成),但 Claude Code 压根不用!

复制代码
// memdir/memdir.ts
const memSearch = `grep -rn "<search term>" ${autoMemDir} --include="*.md"`
const transcriptSearch = `grep -rn "<search term>" ${projectDir}/ --include="*.jsonl"`

创始人 Boris Cherny 在播客中说:"让 AI 自己决定搜什么、怎么搜,效果远远好于 RAG。"

RAG = 帮实习生整理资料给他看

Agentic Search = 给实习生权限让他自己去找

模型能力越强,后者优势越大。


四、三层记忆架构(最精妙的设计)

这是 Claude Code 最值得学习的部分------Self-Healing Memory 自愈记忆

第一层:MEMORY.md(热数据)

  • 每次对话都加载

  • 最多 200 行、25KB

  • 只存指针不存内容

    // 截断逻辑
    export const MAX_ENTRYPOINT_LINES = 200
    export const MAX_ENTRYPOINT_BYTES = 25_000

第二层:话题文件(温数据)

  • 编码偏好、项目架构约定、踩过的坑
  • 用 Sonnet 小模型挑选最多 5 个相关文件
  • 只记人的偏好和判断,不记代码(代码会变,但记忆不会自动更新)

第三层:历史对话(冷数据)

  • 存成 .jsonl 格式

  • 需要时用 Grep 搜索

    ┌─────────────────────────────────────┐
    │ 热:MEMORY.md ─ 每次都加载 │
    ├─────────────────────────────────────┤
    │ 温:话题文件 ─ 按需加载 │
    ├─────────────────────────────────────┤
    │ 冷:历史对话 ─ 搜索获取 │
    └─────────────────────────────────────┘


五、五级上下文压缩

Claude Code 设计了五级压缩策略,像漏斗一样层层过滤:

级别 名称 策略
1 Snip 剪裁 旧的工具调用结果只保留结构
2 Microcompact 卸载到缓存(不直接丢弃)
3 Context Collapse 对话折叠摘要
4 Autocompact 超过阈值触发全量摘要
5 Reactive Compact 413错误时紧急触发

还有断路器机制------连续失败 3 次就自动停下来,避免无限重试浪费 API 调用。


六、安全审查:多层防护

即使开启 --dangerously-skip-permissions(YOLO 模式),背后还有一个影子 AI 在帮你把关:

复制代码
// YOLO 安全分类器
export async function classifyYoloAction(
  toolName: string,
  toolInput: Record<string, unknown>
): Promise<'allow' | 'soft_deny' | 'hard_deny'>

Bash 命令安全检查定义了 23 种规则,包括:

  • Unicode 零宽空格混淆
  • Zsh 危险命令(zmodload)
  • IFS 变量注入
  • 等等...

七、隐藏彩蛋:数字宠物系统

buddy/ 目录下,Anthropic 工程师藏了一套数字宠物系统

复制代码
// 18种物种
export const SPECIES = [
  duck, goose, blob, cat, dragon, octopus, owl, penguin,
  turtle, snail, ghost, axolotl, capybara, cactus, robot,
  rabbit, mushroom, chonk,
] as const

原计划 4 月作为彩蛋预热、5 月上线,结果源码泄露提前被发现了 😂


八、工程亮点总结

技术点 亮点
Agent 循环 朴素的 while(true) + ReAct 机制
工具系统 fail-closed 安全哲学
并发控制 读写分离 + 断路器
Prompt 缓存 精确的动态/静态分层
检索策略 Agentic Search > RAG
记忆系统 三层分级(热/温/冷)
上下文压缩 五级漏斗 + 断路器
安全审查 多层防护 + 影子 AI
性能优化 动态加载 + TCP 预连接

九、学习价值

📚 这份源码是目前最好的 AI 应用架构教材

像以下问题的答案全在里面:

  • Agent 循环怎么写?
  • 工具系统怎么设计?
  • 记忆怎么管理?
  • 安全怎么做?

简历上如果能写上"深度阅读了 Claude Code 源码并应用于自己的项目",绝对是加分项。


十、结语

看完这份源码,你会发现 Claude Code 里没什么惊天动地的新算法,用的都是程序员接触过的基础知识:并发控制、读写分离、分层缓存、断路器、功能开关...

但 Claude Code 团队把这些东西完美组合到了 AI 场景里,打造出了极其优秀的产品。

这正印证了那句话------计算机基础知识和设计思想很重要


📌 本文对应GitHub仓库1664178416/claude-code-map-learn: claude-code源码学习

⭐ 觉得有帮助的话,点个赞再走呗~

#AI #ClaudeCode #源码 #技术分享 #编程工具

相关推荐
羊小猪~~8 小时前
LLM--微调(Adapters,Prompt,Prefix)
算法·ai·大模型·llm·prompt·adapters·prefix
芙莉莲教你写代码8 小时前
Flutter 框架跨平台鸿蒙开发 - 时区转换器应用
学习·flutter·华为·harmonyos
妄汐霜8 小时前
小白学习笔记(MyBatis)
笔记·学习·mybatis
421!8 小时前
C 语言学习笔记——11(函数指针与指针函数)
c语言·开发语言·笔记·单片机·学习
承渊政道8 小时前
【优选算法】(实战:栈、队列、优先级队列高频考题通关全解)
数据结构·c++·笔记·学习·算法·leetcode·宽度优先
盐焗西兰花8 小时前
鸿蒙学习实战之路-Share Kit系列(14/17)-手机间碰一碰分享实战
学习·智能手机·harmonyos
arvin_xiaoting8 小时前
OpenClaw学习总结_II_频道系统_6:iMessage集成详解
学习
敲敲了个代码8 小时前
React 那么多状态管理库,到底选哪个?如果非要焊死一个呢?这篇文章解决你的选择困难症
前端·javascript·学习·react.js·前端框架
醇氧8 小时前
【学习】IP地址分类全解析
网络协议·学习·tcp/ip