Claude Code 程序的分发采用的是 Bun 作为运行时,源码通过 esbuild 打包成一个 JS bundle,并编译成 JavaScriptCore 字节码(JSC bytecode)装载在分发包中。
Bun 打包的时候有一个 fallback 策略,如果 JSC 加载失败,会去加载源码,因此分发包不仅包含了字节码,源码也保留了一份。
按照这个思路,将 CC 源码 dump 一份出来就不难了。
可以通过分析 Bun 的产物格式,做静态分析拿到 bundle JS,再将 bundle JS 运行起来,在运行时通过 hook 模块加载函数来 dump 各模块的源码,这个操作可以提取目录层级依赖关系。
唯一的缺点是,JS bundle 本身已经被 esbuild 压缩了一轮,变量名混淆了,直接阅读较为困难,但字符串字面量(包括 API 端点、prompt 模板、属性名等等)都完整保留了,因此交给 AI 去理解和阅读,没啥问题。
P.S. 反编译出来的代码也是可以正常 run 的。又多了一个持续跟进研究 Claude Code 功能的路子了,🐶