终端 UI

Claude Code 使用 Ink — 一个在终端中渲染 React 组件的框架 — 构建了完整的交互式 UI。

Ink 框架

Ink 让你可以用 React 的方式构建终端应用:组件、hooks、状态管理、JSX — 一切都在终端里运行。

自定义 Reconciler

Claude Code 使用了 fork/内部版本的 Ink,包含自定义的 React reconciler。处理终端特有的渲染逻辑(光标、颜色、布局)。

自定义 Hooks

useInput — 键盘输入处理
useTerminalSize — 终端尺寸响应
useSearchHighlight — 搜索高亮

虚拟列表渲染

消息列表使用虚拟滚动,只渲染可见区域的消息,确保长对话的性能。

React Compiler

组件经过 React Compiler 处理,自动注入 memoization (const $ = _c(N)),优化渲染性能。

170+
React 组件
16
设计系统组件
596
.ts/.tsx 文件

核心组件树

// 组件层级结构 (170+ 组件, 596 文件)
App.tsx                     ── 根 Provider (AppState, Stats, FpsMetrics)
├── REPL.tsx                ── 交互 REPL (5005行, 54 useState, 68 useEffect)
│   ├── Messages.tsx        ── 消息列表容器
│   │   └── MessageRow.tsx  ── 单条消息渲染
│   │       ├── UserMessage   ── 用户输入
│   │       ├── AssistantMsg  ── AI 回复 (text + thinking)
│   │       └── ToolResult    ── 工具结果 (每个工具有自己的 UI)
│   ├── PromptInput/        ── 用户输入区域
│   ├── permissions/        ── 权限对话框
│   ├── tasks/              ── 任务面板
│   └── teams/              ── 团队协作 UI
├── design-system/          ── 16 个主题 UI 原语 (见下方)
├── diff/ + StructuredDiff/ ── Diff 渲染组件
├── Settings/               ── 设置界面
├── wizard/                 ── 向导流程
├── buddy/                  ── Buddy 伴侣精灵 UI
└── ThemeProvider           ── 主题注入 (dark/light + auto)
    

Design System (16 组件)

src/components/design-system/ 提供可复用的主题化 UI 原语:

Dialog

模态对话框

FuzzyPicker

模糊搜索列表 (11KB)

Tabs

选项卡界面 (10KB)

ThemedBox

主题容器 (5KB)

ThemedText

主题文本 (4KB)

ProgressBar

进度条

ThemeProvider

主题上下文 + 预览/保存

+9 更多

Byline, Divider, ListItem, LoadingState, Pane, Ratchet, StatusIcon, KeyboardShortcutHint, color.ts

REPL 屏幕

src/screens/REPL.tsx 是用户看到的主界面,负责:

渲染机制

每个工具都可以提供自己的 React 组件来渲染结果:

// 工具的 React 渲染组件 (以 BashTool 为例)
// src/tools/BashTool/BashTool.tsx

function BashToolResult({ result }) {
  return (
    <Box flexDirection="column">
      <Text color="gray">$ {result.command}</Text>
      <Text>{result.stdout}</Text>
      {result.stderr && <Text color="red">{result.stderr}</Text>}
      <Text color="gray">exit: {result.exitCode} ({result.duration}ms)</Text>
    </Box>
  );
}
    

有 React UI 组件的工具包括:AgentTool(进度显示)、BashTool(命令输出)、FileReadTool(文件内容)、FileEditTool(diff 显示)、AskUserQuestionTool(交互式问题)、MCPTool(进度和结果)等。