项目总览
仓库结构、构建系统与入口流程
Claude Code 是一个基于 TypeScript 和 React (Ink) 构建的单体 CLI 应用,约 515K 行代码,使用 Bun 打包为单个可执行文件 cli.js(约 13MB)。它通过 Anthropic API 与 Claude 模型交互,提供终端内的 AI 辅助编程体验。
核心要点
设计亮点
零依赖的 13MB 全家桶
大多数 Node.js 应用依赖成百上千个 npm 包,安装时经常出现版本冲突、安全漏洞等问题。Claude Code 把所有代码打包进一个 13MB 的文件,用户安装时零依赖下载。这是通过 Bun 的 bundler 实现的——它把 1885 个源文件编译、打包、摇树优化后合并为一个可执行的 JavaScript 文件。代价是开发时需要精心管理模块边界,但用户体验极好。
Feature Flags 不是开关,是手术刀
传统 Feature Flags 在运行时判断 if (flag) {...},未启用的代码仍然存在于程序中。Claude Code 的 feature() 在构建时就被替换为 true/false 字面量,Bun 的 tree-shaker 随后将 if (false) {...} 整块删除。这意味着面向外部用户的构建里,内部功能(如 KAIROS 协调模式、语音模式)的代码一个字节都不存在。这同时也是一种安全措施——外部用户无法通过逆向工程发现未发布的功能。
六层千层饼设置系统
Claude Code 的设置从 6 个来源合并:用户全局设置、项目设置、本地设置、CLI 参数、MDM(企业管理策略)和远程管理设置。关键的设计决策是:数组类型的设置(如 allowedTools)是替换而非合并。如果你在项目设置里定义了允许的工具列表,它会完全替代用户设置里的列表,而不是把两个列表拼在一起。这避免了'我明明在项目里禁了某个工具,为什么全局设置还是允许了?'的困惑。MDM 层还支持 Windows 注册表和 macOS plist,让企业 IT 管理员可以通过设备管理系统统一配置所有员工的 Claude Code。
启动顺序像多米诺骨牌
main.tsx 的 4683 行代码按严格顺序初始化子系统。认证必须先于设置加载(远程设置需要认证 Token 才能获取),Feature Flags 必须先于工具注册(工具的可见性取决于 Flag 状态),MCP 配置必须先于技能加载(MCP 技能需要知道有哪些可用服务器)。如果顺序错了,可能出现用户还没登录就尝试获取远程设置(网络错误),或者工具列表缺少了被 Flag 控制的新工具。
模块架构图
cli.js13,000 LOC打包后的入口脚本(Node 可执行文件)
main.tsx4,683 LOC主入口,CLI 参数解析、认证、设置加载、REPL 启动
entrypoints/init.ts500 LOC初始化逻辑
entrypoints/cli.tsx1,500 LOCCLI 引导器
components/App.tsx800 LOC根 React 组件
Tool.ts792 LOC工具基类定义
tools.ts600 LOC工具注册中心
commands.ts900 LOC命令注册中心
关键代码
深入解析
Claude Code 使用 Bun 作为构建工具,将所有 TypeScript 源码打包为单个 cli.js 文件(~13MB),实现零依赖部署。这意味着用户安装后不需要 node_modules,不会出现依赖冲突。
设置系统采用 6 层优先级合并:CLI 参数 > 本地设置 > 项目设置 > 用户设置 > MDM 策略 > 远程管理设置。数组类型的设置是替换而非合并,防止意外累加。
Feature Flags 通过 bun:bundle 的 feature() 函数实现编译时条件判断。和运行时 Feature Flags 不同的是,未启用的代码在构建时就被彻底删除(死代码消除),不会增加包体积。
React + Ink 的组合让 Claude Code 能在终端中渲染丰富的交互界面。Ink 将 React 的虚拟 DOM 映射到终端 ANSI 转义序列,让开发者可以用 JSX 写终端 UI。
main.tsx 是整个应用的引导器(4683行),负责按正确顺序初始化所有子系统。启动顺序很关键:认证必须在设置加载之前(因为远程设置需要认证),Feature Flags 必须在工具加载之前(因为工具的可见性依赖 Flags)。
认证支持 4 种方式:OAuth(浏览器登录)、API Key(环境变量)、AWS Bedrock(云服务)、Google Vertex AI(云服务)。每种方式有独立的认证流程和 Token 刷新机制。
GrowthBook 作为 Feature Flags 的远程控制平面,允许 Anthropic 不发版就能开关功能。比如新的 KAIROS 协调模式可以先对 1% 用户开放,观察效果后再全量发布。
Bootstrap State 是一个全局可变对象,存储在启动阶段确定的不变量:Session ID、工作目录、项目根、SDK Beta 列表等。这些值在整个会话生命周期内不会变化。