Claw Code TUI 增强计划:rusty-claude-cli 从内联 REPL 到现代终端交互的分阶段改造解析
本文基于 Claw Code 仓库中的 TUI 增强规划文档 tui-enhancement-plan.md,完整解读其"现状架构分析—六阶段增强计划—优先级建议—目标模块结构—风险评估"的核心脉络,并结合 rusty-claude-cli 的实际源码、依赖与实现细节,验证计划中每个技术点与当前仓库的对应关系。读完本文,你将掌握该 TUI 方案的整体设计思路、各阶段任务清单与验收依据,并能在源码层面确认哪些规划已被部分落地、哪些仍是待办。
1. 文档定位与适用前提
该规划文档是 rusty-claude-cli crate(仓库中主二进制,可执行文件名为 claw,见 Cargo.toml)的终端交互层改造方案,文档末尾标注:Generated: 2026-03-31 | Workspace: rust/ | Branch: dev/rust。它同时有一份内容一致的镜像副本 TUI-ENHANCEMENT-PLAN.md。
需要说明适用前提:文档中的部分行数统计(如 main.rs 约 3,159 行、input.rs 269 行)是规划生成时点的快照。当前仓库中 main.rs 已增长到约 19,831 行、input.rs 约 330 行、render.rs 约 1,070 行,说明该 crate 在规划之后仍在快速演进。本文在引用文档数据时均注明"规划时点",并补充了当前仓库的实际状态。
2. 现状架构分析:Crate 地图与 TUI 组件盘点
规划文档的第一步是对现有终端界面做全面盘点,结论是:项目已经具备不错的"内联滚动式 REPL"体验,但距离"现代 TUI"还有明显差距。
2.1 Crate 地图(规划时点)
| Crate | 职责 | 行数(规划时点) | TUI 相关性 |
|---|---|---|---|
rusty-claude-cli |
主二进制:REPL 循环、参数解析、渲染、API 桥接 | ~3,600 | 主要 TUI 表面 |
runtime |
会话、对话循环、配置、权限、压缩 | ~5,300 | 提供数据/状态 |
api |
Anthropic HTTP 客户端 + SSE 流式 | ~1,500 | 提供流式事件 |
commands |
斜杠命令元数据/解析/帮助 | ~470 | 驱动命令分发 |
tools |
18 个内置工具实现 | ~3,500 | 工具执行展示 |
2.2 现有 TUI 组件与质量评估
| 组件 | 文件 | 当前职责 | 规划时点评估 | 当前仓库佐证 |
|---|---|---|---|---|
| 输入 | input.rs |
基于 rustyline 的行编辑器:斜杠命令 Tab 补全、Shift+Enter 换行、历史 |
✅ 扎实 | SlashCommandHelper 实现了 Completer/Hinter/Highlighter,与文档描述一致 |
| 渲染 | render.rs |
Markdown→终端渲染(标题、列表、表格、syntect 高亮代码块、引用块)+ spinner 组件 | ✅ 良好 | TerminalRenderer 持有 SyntaxSet/syntect 主题与 ColorTheme |
| 应用/REPL 循环 | main.rs |
单体 LiveCli 结构体:REPL 循环、全部斜杠命令处理、流式输出、工具调用展示、权限询问、会话管理 |
⚠️ 单体化 | LiveCli 至今仍定义在 main.rs 中,字段包括 model、permission_mode、runtime: BuiltRuntime、session: SessionHandle 等 |
| 备用应用 | 规划时点的 app.rs |
早期 CliApp 原型,基于 ConversationClient、流事件处理、TerminalRenderer |
⚠️ 疑似未使用/遗留 | 当前 rusty-claude-cli/src 下已无 app.rs,仅剩 init.rs、input.rs、main.rs、render.rs、setup_wizard.rs,可推断文档任务 0.2(移除遗留 CliApp)已随仓库演进完成 |
2.3 关键依赖
文档列出的依赖与 Cargo.toml 实际声明完全吻合:
- crossterm 0.28 —— 终端控制(光标、颜色、清屏)
- pulldown-cmark 0.13 —— Markdown 解析
- syntect 5 —— 语法高亮
- rustyline 15 —— 带补全的行编辑
- serde_json —— 工具 I/O 格式化
此外还依赖 tokio(运行时)与仓库内 api、runtime、commands、tools、plugins 五个 crate。
2.4 优势与 15 项短板
文档肯定了 6 项现有优势:干净的 Markdown 渲染管线(带状态跟踪)、工具调用的盒线边框与 ✓/✗ 结果图标、15 个斜杠命令、完整会话管理(持久化/恢复/列表/切换/压缩)、交互式 Y/N 权限询问、以及覆盖各格式化与解析路径的单元测试。
短板清单是后续六阶段计划的直接依据,共 15 条,归纳为四类:
- 结构性:
main.rs是数千行单体(#1);app.rs与main.rs双应用结构(#11)。 - 视觉呈现:无全屏/替代屏幕布局(#2)、无进度条(#3)、
/diff只倒原始 git diff 文本(#4)、主回复流无语法高亮(#5)、无状态栏/HUD(#6)、无颜色主题定制——ColorTheme::default()硬编码(#9)。 - 交互能力:无图片/附件预览(#7)、流式输出带人为延迟(#8)、无 resize 感知(#10)、无长输出 pager(#12)、工具结果不可折叠(#13)、无 thinking/reasoning 指示器(#14)、工具参数无自动补全(#15)。
这些短板在当前仓库中大多可得到印证,例如:
- 工具调用的盒线边框仍按文档描述实现:main.rs#L13352 的模板字符串
╭─ name ─╮ … ╰─╯; - 通用思考指示器仍是
🦀 Thinking...(main.rs#L7756),尚未按任务 2.2 区分 reasoning 状态; - 颜色主题仍是硬编码的 ColorTheme::default(),印证短板 #9。
3. 六阶段增强计划(Phase 0–6)
文档的核心主体是把改造拆成 7 个阶段(Phase 0 到 Phase 6,其中 Phase 6 为 Stretch 目标)、30 余项任务,每项标注工作量(S/M/L/XL)。以下按阶段完整继承任务表,并在"源码佐证"列给出当前仓库的对应实现位置。
3.1 Phase 0:结构清理(地基)
目标:打破单体、删除死代码、为 TUI 工作建立模块结构。
| 任务 | 说明 | 工作量 | 源码佐证/现状 |
|---|---|---|---|
| 0.1 | 将 LiveCli 从 main.rs 抽离到 app.rs,并拆出 format.rs(报告格式化)、session_manager.rs(会话 CRUD) |
M | LiveCli 当前仍在 main.rs,该项未完成 |
| 0.2 | 移除或合并遗留 CliApp |
S | 当前 crate 已无 app.rs/CliApp,可推断该项已落地 |
| 0.3 | 整合两套参数解析(手写 parse_args() 与 clap 版 args.rs),统一到 args.rs 或全面采用 clap |
S | 解析逻辑仍在 main.rs 内 |
| 0.4 | 新建 tui/ 模块(status_bar.rs、layout.rs、tool_panel.rs 等命名空间) |
S | 当前 src/ 下尚无 tui/ 目录 |
3.2 Phase 1:状态栏与实时 HUD
目标:交互期间持续显示关键信息。
| 任务 | 说明 | 工作量 | 源码佐证/现状 |
|---|---|---|---|
| 1.1 | 终端尺寸感知的状态行:用 crossterm::terminal::size() 渲染底部固定状态栏(模型名、权限模式、会话 ID、累计 token、估算成本) |
M | 待办 |
| 1.2 | 实时 token 计数:流式过程中随 AssistantEvent::Usage / AssistantEvent::TextDelta 事件更新状态栏 |
M | 事件模型来自 api crate 的 SSE 流式层 |
| 1.3 | 单轮耗时计时:文档指出 showTurnDuration 配置已存在于 Config 工具但尚未接线 |
S | 已核实:tools/src/lib.rs#L6322 中确有 showTurnDuration 的 ConfigSettingSpec 定义 |
| 1.4 | Git 分支指示器:文档指出分支信息已经由 parse_git_status_metadata 解析好 |
S | 已核实:parse_git_status_metadata 返回项目根与分支名,可被状态栏复用 |
3.3 Phase 2:增强流式输出
目标:让主回复流在视觉上更丰富、响应更快。
| 任务 | 说明 | 工作量 | 源码佐证/现状 |
|---|---|---|---|
| 2.1 | 实时 Markdown 渲染:缓冲文本增量、按到达顺序增量渲染(标题检测、粗斜体、行内代码),复用 TerminalRenderer::render_markdown |
L | 已有增量渲染雏形:MarkdownStreamState 通过 find_stream_safe_boundary 在"流安全边界"处切出可渲染前缀并调用 markdown_to_ansi,这正是 2.1 方向的落地证据 |
| 2.2 | Thinking 指示器:扩展思考/推理时显示独立动画(如 🧠 Reasoning...),替代通用 🦀 Thinking... |
S | 当前仍是通用指示器(main.rs#L7756);不过 main.rs 中已存在 render_thinking_block_summary 与 ThinkingDelta 累积逻辑,具备接线基础 |
| 2.3 | 流式进度条:基于 max_tokens 与已输出 token 的近似完成度指示 | M | 待办 |
| 2.4 | 移除人为流式延迟:规划时点的 stream_markdown 每处理一个空白分隔 chunk 睡 8ms,对主回复流应改为即时或可配置 |
S | 当前 stream_markdown 已是一步完成渲染、写入并 flush,函数内不再存在逐 chunk 睡眠,方向与 2.4 一致 |
3.4 Phase 3:工具调用可视化
目标:让工具执行过程可读、可导航。
| 任务 | 说明 | 工作量 |
|---|---|---|
| 3.1 | 可折叠工具输出:超过 N 行(可配置,默认 15)时显示摘要与 [+] Expand 提示;初期以"截断 + 完整输出存文件"作为回退 |
M |
| 3.2 | 工具结果语法高亮:按工具名识别代码内容(bash stdout、read_file 内容、REPL 输出),用 syntect 高亮而非纯文本 |
M |
| 3.3 | 工具调用时间线:多工具轮次结束后显示紧凑摘要,如 `🔧 bash → ✓ | read_file → ✓ |
| 3.4 | Diff 感知的 edit_file 展示:编辑成功时展示彩色 unified diff,而非仅 ✓ edit_file: path |
M |
| 3.5 | 权限询问增强:盒线样式、工具名着色、一行摘要说明该工具将做什么 | S |
3.5 Phase 4:增强斜杠命令与导航
目标:改善信息展示、补齐缺失功能。
| 任务 | 说明 | 工作量 |
|---|---|---|
| 4.1 | /diff 彩色输出:解析 git diff,红/绿着色增删行(类似 delta / diff-so-fancy) |
M |
| 4.2 | 长输出 pager:/status、/config、/memory、/diff 超过终端高度时走内置 pager(j/k/q 滚动)或外部 $PAGER |
M |
| 4.3 | /search 命令:按关键字检索会话历史 |
M |
| 4.4 | /undo 命令:基于 write_file/edit_file 工具结果中的 originalFile 数据回滚最近一次文件编辑 |
M |
| 4.5 | 交互式会话选择器:用模糊过滤的交互列表替换文本式 /session list(上下键选择、回车切换) |
L |
| 4.6 | 工具参数 Tab 补全:扩展 SlashCommandHelper,为 /export 后的文件路径、/model 后的模型名、/session switch 后的会话 ID 提供补全 |
M |
任务 4.6 的落点 SlashCommandHelper 当前实现了 Completer 等 rustyline trait,是自然扩展点。
3.6 Phase 5:颜色主题与配置
目标:用户可自定义视觉外观。
| 任务 | 说明 | 工作量 |
|---|---|---|
| 5.1 | 命名颜色主题:dark(当前默认)、light、solarized、catppuccin,接线到 Config 工具的 theme 设置 |
M |
| 5.2 | ANSI-256 / truecolor 能力检测与优雅降级(无颜色 → 16 色 → 256 色 → truecolor) | M |
| 5.3 | 可配置 spinner 样式(braille 点、bar、moon phases 等) | S |
| 5.4 | Banner 定制:ASCII 艺术横幅可关闭或可配置 | S |
当前 Spinner 使用固定 10 帧 braille 点序列(⠋⠙⠹⠸⠼⠴⠦⠧⠇⠏),即 5.3 提到的"braille dots"默认样式。
3.7 Phase 6:全屏 TUI 模式(Stretch)
目标:为高级用户提供可选的替代屏幕布局。
| 任务 | 说明 | 工作量 |
|---|---|---|
| 6.1 | 引入 ratatui 依赖(终端 UI 框架),作为可选依赖 |
S |
| 6.2 | 分栏布局:上栏会话(带 scrollback)、下栏输入区、右侧可选侧栏(工具状态/todo 列表) | XL |
| 6.3 | 可滚动会话视图:PgUp/PgDn 翻历史、会话内搜索 | L |
| 6.4 | 键盘快捷键面板:? 帮助浮层展示全部键位 |
M |
| 6.5 | 鼠标支持:点击展开工具结果、滚动会话、选择文本复制 | L |
当前 Cargo.toml 中尚无 ratatui 依赖,Phase 6 整体未启动。
4. 优先级建议
文档给出的落地排序按"影响/工作量"权衡,值得作为实施参考:
立即执行(高影响、中等工作量)
- Phase 0 —— 必要清理;规划时点的 3,159 行
main.rs是头号维护风险,且阻塞干净的 TUI 增量(从当前仓库看,main.rs已进一步膨胀,该项紧迫性不降反升); - Phase 1.1–1.2 —— 带实时 token 的状态栏,是影响力最高的 UX 改进;
- Phase 2.4 —— 移除人为延迟,低工作量、立竿见影;
- Phase 3.1 —— 可折叠工具输出,大段 bash 输出目前严重破坏可读性。
近期(下个迭代)
- Phase 2.1 实时 Markdown 渲染(仓库中
MarkdownStreamState已给出方向); - Phase 3.2 工具结果语法高亮;
- Phase 3.4 Diff 感知的编辑展示;
- Phase 4.1
/diff彩色输出。
中长期
- Phase 5 颜色主题(按需推进);
- Phase 4.2–4.6 导航与命令增强;
- Phase 6 全屏模式(大工程,早期阶段交付后再评估)。
5. 目标模块结构与关键设计原则
5.1 Phase 0 完成后的模块结构
文档给出的目标结构是:
crates/rusty-claude-cli/src/
├── main.rs # 入口,仅做参数分发(约 100 行)
├── args.rs # CLI 参数解析(合并现有两套解析器)
├── app.rs # LiveCli 结构体、REPL 循环、轮次执行
├── format.rs # 所有报告格式化(status、cost、model、permissions 等)
├── session_mgr.rs # 会话 CRUD:创建、恢复、列表、切换、持久化
├── init.rs # 仓库初始化(不变)
├── input.rs # 行编辑器(不变,少量扩展)
├── render.rs # TerminalRenderer、Spinner(扩展)
└── tui/
├── mod.rs # TUI 模块根
├── status_bar.rs # 持久底部状态行
├── tool_panel.rs # 工具调用可视化(盒子、时间线、可折叠)
├── diff_view.rs # 彩色 diff 渲染
├── pager.rs # 长输出内置 pager
└── theme.rs # 颜色主题定义与选择
对照当前仓库:init.rs、input.rs、render.rs 已存在且职责基本对应;args.rs、app.rs、format.rs、session_mgr.rs、tui/ 目录尚未建立,LiveCli 与格式化逻辑仍集中在 main.rs。这为执行 Phase 0 提供了明确的迁移路径。
5.2 五条关键设计原则
- 保持内联 REPL 为默认 —— 全屏 TUI 应为 opt-in(
--tui标志); - 一切不依赖真实终端即可测试 —— 所有格式化函数接收
&mut impl Write,不直接假设 stdout(当前stream_markdown(&self, markdown: &str, out: &mut impl Write)的签名正是这一原则的体现); - 流式优先 —— 渲染必须增量工作,不得缓冲整个响应(
MarkdownStreamState::push返回Option<String>增量输出的设计同理); - 终端控制统一走
crossterm—— 不要混用裸 ANSI 转义与 crossterm(文档指出当前启动 banner 处存在这种混用); - 重型依赖做 feature 门控 ——
ratatui应放在full-tuifeature flag 之后。
6. 风险评估与缓解
| 风险 | 缓解措施 |
|---|---|
| 重构过程中破坏可用的 REPL | Phase 0 是纯结构重组,以既有测试覆盖作安全网 |
| 终端兼容性问题(tmux、SSH、Windows) | 依赖 crossterm 的抽象层;在降级环境中测试 |
| 富渲染带来的性能回退 | 重构前后做性能剖析;始终保留快速路径(原始流式输出) |
| 范围蔓延到 Phase 6 | 先把 Phase 0–3 作为一致版本交付,再启动 Phase 6 |
app.rs 与 main.rs 的混淆 |
Phase 0.2 显式移除遗留 CliApp 予以解决 |
7. 结语:从规划文档到可验证的落地路径
这份规划文档的价值在于:它把"把 REPL 变成现代 TUI"这一模糊目标,拆成了可逐条验收的任务,并且每条任务都能在当前仓库中找到锚点——
- 已可核实的基础设施:
showTurnDuration配置项(tools/src/lib.rs#L6322)、git 分支解析(main.rs#L6215)、增量 Markdown 流渲染(render.rs#L600-L620)、盒线工具边框与 thinking 块渲染(main.rs#L13352); - 明确未启动的部分:
tui/模块、状态栏/HUD、可折叠工具输出、颜色主题、ratatui全屏模式; - 需要持续警惕的结构性风险:
main.rs体量的持续增长,正是 Phase 0 被列为"第一优先级"的原因。
若要在本地运行该 CLI 验证现状,可在仓库内使用 cargo build -p rusty-claude-cli 构建(产物二进制名为 claw),相关集成测试位于 rust/crates/rusty-claude-cli/tests/ 目录(含 mock_parity_harness.rs、resume_slash_commands.rs 等),可作为验证 REPL 行为回归的安全网。整体而言,该 TUI 增强计划以"先结构、后体验、再形态"的顺序推进,兼顾了可测试性(原则 2)与渐进交付(风险缓解),是终端交互类项目规划中少见的"任务级可验收"范本。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0622
Hy4-previewHy4 preview 是由腾讯混元团队研发的新一代混合专家(MoE)旗舰模型。模型总参数量 770B,每个 token 激活 49B,主干共包含78层,第一层采用标准 FFN,其余 77 层均为 MoE 结构,每层包含 256 个路由专家与 1 个共享专家,每个 token 激活 top-8 路由专家及共享专家。主干之外原生内置 1 层 MTP(总参数量 10B,激活 0.7B)以支持投机解码。Python00
GLM-5.3GLM-5.3 与 GLM-5.2 使用相同的基座模型——所有提升均来自后训练。与 GLM-5.2 相比,它在复杂编程和长程任务上的表现显著提升。Jinja00
GLM-5.3-FlashGLM-5.3-Flash (320B-A18B),是GLM-5系列的首个原生多模态模型。320B总参数,能力超过GLM-5.2Jinja00
Spark-X2.5-4BSpark-X2.5-4B 旨在让强大的 AI 更实用、更高效、更易获得。在广泛日常任务中表现强劲,涵盖对话、写作、翻译、推理、编码、工具调用以及智能体工作流,并在同等规模的开源模型中取得领先成绩。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00