请添加图片描述

几天前 Claude Code 意外泄露了完整源码。我分析了它的架构,参考设计思路,5 天从零做出了 30+ 个终端 UI 组件 + headless agent 框架。

项目地址:github.com/Minnzen/claude-code-kit


一、起因:终端 UI 没有好选择

我一直想做高质量的 CLI 工具,但终端 UI 的体验普遍很差——大多数命令行工具还停留在 console.log 往下刷的阶段。

现有的选择:

方案 问题
Ink 实质上已停更,组件太少(~10 个)
blessed / terminal-kit 年久失修,API 过时
手写 ANSI escape 能用,维护成本极高

然后 Claude Code 出现了。用过的人都知道,它的终端体验是目前最好的:

  • 流式输出一个字一个字蹦出来
  • 代码 diff 高亮展示
  • 权限弹窗让你确认是否执行命令
  • Markdown 直接在终端里渲染

这不是 readline 能做出来的。但它是闭源产品——我只能用,不能复用。

然后泄露事件发生了。


二、泄露代码里看到了什么

3 月 31 号,安全研究员 Chaofan Shou(@shoucccc)发现 Claude Code v2.1.88 的 npm 包里带了完整的 source map——打包时的一个失误导致 .map 文件没有被排除。

消息出来当天我就拿到了还原后的代码。512k 行,1900 个文件。

分析下来,架构分三层:

渲染层 — 没有用 Ink,自己实现了一套 React reconciler 做终端渲染。布局引擎是 Yoga(Meta 的 Flexbox 实现),而且是纯 TypeScript 移植版,不依赖 C++ native binding。渲染做了差量更新,只重绘变化的部分,不闪屏。

Agent 层 — 不是简单的"调 API 打印结果"。代码里有:

  • KAIROS — feature flag 控制的 proactive 上下文管理系统
  • 多 agent 编排 — 子 agent 派生和任务协调
  • 自修复记忆 — 上下文压缩和持久化
  • 工具并行执行 — 只读工具自动并发

代码规模 — 512k 行,远比一个"终端聊天工具"该有的体量大得多。


三、为什么重写,不直接提取

源码都有了,直接用不行吗?不行。

1)组件和 Claude Code 内部系统深度耦合

每个组件都依赖 CC 特有的上下文——动画组件依赖内部 ClockContext,权限组件依赖它的 permission 管理,消息列表和 session 层绑死。单独拎一个组件出来,依赖链会拖出整个 Claude Code。

2)React Compiler 编译产物和业务逻辑混在一起

很多组件经过 React Compiler 编译:

const $ = _c(81);
if ($[0] !== props.value) {
  t0 = renderSomething(props.value);
  $[0] = props.value;
  $[1] = t0;
} else {
  t0 = $[1];
}

_c(81) 是编译器生成的 81 槽缓存数组,$[0] 是记忆化槽位。这些优化产物和组件逻辑交织在一起,没法简单剥离。

结论:架构设计参考,组件从零重写,渲染引擎提取适配。

判断做完就开始干活——用 Claude Code(Opus 4.6)自己来写 Claude Code 的替代品。Vibe coding 确实高效,从分析到 v0.2.0 发布,三天。


四、怎么做的

分包设计

拆成 5 个独立 npm 包,核心原则是解耦

claude-code-kit/
├── packages/
│   ├── shared/              — Yoga 布局引擎(纯 TS)、ANSI 工具
│   ├── ink-renderer/        — React reconciler + TTY 渲染
│   ├── ui/                  — 30+ UI 组件
│   ├── agent/               — headless agent 框架
│   └── tools/               — 17 个内置工具
├── examples/
│   ├── hello-world/         — 组件交互 demo
│   ├── agent-cli/           — AI 编程助手
│   └── alt-screen-dashboard/— 系统监控面板
└── tests/                   — 498 个测试

Agent 和 UI 完全独立:

  • Agent 可以 headless 运行 → agent.chat("分析这个文件") 直接拿结果
  • UI 可以不接 Agent → 只用组件做交互式终端界面

渲染引擎

React reconciler 和 Yoga 布局引擎逻辑相对独立,不依赖业务组件。提取出来做了适配,成为 ink-renderer 包。这是整个项目里唯一直接源自 Claude Code 源码的部分。

组件库

30+ 个组件,每个都不依赖任何 Provider 就能独立工作:

组件 功能
REPL 完整对话界面(流式输出 + slash 命令 + 状态栏)
PromptInput 多行输入 + 历史记录 + 命令补全 + Vim 模式
Select / MultiSelect 键盘导航选择(支持 j/k)
Spinner Claude Code 同款 Unicode 动画
StreamingText 逐字流式输出
Markdown 终端 Markdown 渲染(带缓存,支持流式)
DiffView 代码差异展示
PermissionRequest 权限确认弹窗(Allow / Always Allow / Deny)
ThemeProvider 4 套主题、33 个 color token
ProgressBar / StatusLine / Dialog / Tabs 设计系统组件

Provider 设计

Agent 不绑定任何一家,改个 baseURL 就能接本地模型:

const agent = new Agent({
  provider: new OpenAIProvider({
    apiKey: 'your-key',
    baseURL: 'http://localhost:11434/v1'  // Ollama
  }),
  model: 'llama3.1',
  tools: [bashTool, readTool]
})

支持 Anthropic、OpenAI、Ollama、DeepSeek、Groq、SiliconFlow 等任意 OpenAI 兼容服务。

安全设计

从 v0.1.0 就有,不是出了问题才补的:

机制 说明
默认只读权限 Read / Glob / Grep 自动放行,Bash / Write / Edit 需确认
路径遍历防护 阻止 ../../../etc/passwd 类攻击
SSRF 防护 web-fetch 阻断内网 IP 请求
isDestructive 标记 Bash、ExitWorktree 等标记为破坏性操作

五、对齐 Claude Code

泄露让架构思路成为公开知识。参考概念,不参考代码。

v0.3.0 做了一次大规模对齐,重点在工具系统:

改动 说明
7 → 17 个工具 新增 WebSearch、Agent、NotebookEdit、LSP、Worktree、Task x4
命名对齐 工具名 PascalCase、参数名 snake_case,兼容 CC prompt 格式
Description 10-50 行 每个工具写了完整的 LLM 行为指南
MCP 客户端 从任意 MCP server 动态发现工具(stdio + HTTP)
并行执行 readOnly 工具自动并发,不排队

17 个工具一览

工具 类型 说明
Bash write Shell 执行,支持后台运行、超时、sandbox
Read read 文件读取,支持 PDF pages、图片 base64
Edit write 字符串替换,支持 replace_all 全局替换
Write write 创建/覆盖文件
Glob read 文件匹配,按修改时间排序
Grep read 正则搜索,支持上下文行、分页、多行匹配
WebFetch read HTTP 抓取,HTML→Markdown、HTTPS 升级、缓存
WebSearch read DuckDuckGo 搜索,域名白/黑名单
Agent write 子 agent 派生,超时和 abort 传播
NotebookEdit write Jupyter cell 编辑
TaskCreate write 创建任务,支持 owner 和依赖追踪
TaskUpdate write 更新任务状态、blocks/blockedBy
TaskGet read 查询单个任务
TaskList read 列出/过滤任务
EnterWorktree write 创建 git worktree
ExitWorktree write 清理 git worktree
LSP read 语言服务器查询(工厂模式)

所有工具都用 Opus 4.6 的真实 API 做过端到端验证。


六、和其他项目的对比

claude-code-kit Ink Aider Goose
终端 UI 组件 30+(React) ~10(停更)
Flexbox 布局 纯 TS Yoga Native binding
Agent 框架 有(provider 无关) 有(Python) 有(Python)
内置工具 17 个 ~10 ~10
MCP 客户端
并行工具执行
UI + Agent 一体
语言 TypeScript TypeScript Python Python

七、成果

十行代码跑一个完整的终端 AI 助手:

import { Agent, AnthropicProvider } from '@claude-code-kit/agent'
import { bashTool, readTool, editTool } from '@claude-code-kit/tools'
import { render } from '@claude-code-kit/ink-renderer'
import { AgentREPL } from '@claude-code-kit/ui'

const agent = new Agent({
  provider: new AnthropicProvider({ apiKey: process.env.ANTHROPIC_API_KEY }),
  tools: [bashTool, readTool, editTool],
  model: 'claude-opus-4-6',
})
await render(<AgentREPL agent={agent} />)

举两个例子

代码附带在仓库 examples

  • Hello world !
    请添加图片描述
  • 系统监控面板
    请添加图片描述

最后

项目地址:github.com/Minnzen/claude-code-kit

pnpm add @claude-code-kit/ui @claude-code-kit/agent @claude-code-kit/tools react

接下来会做多 agent 编排,让多个 agent 能协作完成复杂任务。

欢迎交流。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐