Strace-ui、Bonsai_term 与 TUI 复兴

Hacker News Top 工具

摘要

Jane Street 的工程师介绍了 strace-ui,这是一个用于 strace 的交互式终端 UI,通过过滤、PID 追踪和手册页集成简化了系统调用调试,并强调了由其 Bonsai 框架推动的 TUI 复兴。

暂无内容
查看原文
查看缓存全文

缓存时间: 2026/06/02 15:34

# strace-ui、Bonsai_term 与 TUI 复兴 来源:https://blog.janestreet.com/strace-ui-bonsai-term-and-the-tui-renaissance/ 我们一直觉得 strace 很有用,但用起来有些棘手。它的输出常常难以理解,追踪子进程或线程很困难,如果你想过滤系统调用,还得用标志重新运行每个调用。调试时你真正想要的是一个用于探索、优化等操作的交互工具,但 strace 却让这变得困难。于是 strace-ui 登场了,它将 strace 变成了一个交互式终端界面: 一个 strace-ui 追踪简单程序的短录屏 strace-ui 为 PID 分配短 ID 以便浏览,格式化结构体,并将缓冲区渲染为十六进制转储而非字符串。它还有一些截图上看不到的其他好功能: - **交互式过滤**。在追踪异步 OCaml 进程?忘记传 `-e '!futex,timerfd_settime,epoll_wait'` 了?别担心:按 **h** 即可隐藏任何你不关心的系统调用。 - **追踪特定文件描述符**。按 **>** 或 **<** 跳转到引用同一文件描述符的下一个/上一个系统调用,或按 **F** 将过滤器改为只包含触及给定 FD 的系统调用。(它比单纯的数字 FD 过滤更智能:strace-ui 会尝试跟踪 FD 重用并跨 fork 追踪,但如果你附加到已经打开 FD 的进程上,效果就不太理想。) - **`rt_sigprocmask` 到底是什么?** 按 **m** 打开手册页查看。 - 子进程或线程会被分配简短的数字标签,而不是显示原始 PID,这样更容易跟踪复杂的 `strace -f` 调用。(你也可以按 PID 过滤或排除 PID。) - **DNS 解析**:strace 的 `--decode-fds=all` 会打印文件描述符如 1411.11.11.11:56789]>,这很棒。strace-ui 更进一步,打印为 14another-hostname:56789]>,让你一眼就能看到进程正在做什么。 我们的开发者 Ian Henry(https://signalsandthreads.com/building-tools-for-traders/)为了满足自己的需求制作了 strace-ui。2017 年他一直在寻找这样的工具但没找到。由于有构建交互式终端界面的经验(包括使用 lambda_term 在 OCaml 中构建),他知道这有多困难和令人不悦。这个想法多年来一直在酝酿,但始终觉得不值得投入,直到最近几股力量汇聚在一起,让终端界面开发变得愉快起来。 ## Bonsai:一个强大的响应式 UI 框架 多年来,我们一直在用我们开发的函数式风格的 OCaml 库 Bonsai(https://github.com/janestreet/bonsai)构建 Web 应用程序,该库受 Elm(https://elm-lang.org/)启发。一个带简单交互的 Bonsai 组件看起来像这样: ```ocaml module Dice = struct let faces = ... let component (graph @ local) = let face, set_face = Bonsai.state (List.hd_exn faces) graph in let%arr face and set_face in {%html| You rolled a #{face} let index = Random.int (List.length faces) in set_face (List.nth_exn faces index) >Roll the dice |} end ``` 组件实现为纯函数式状态机,并且易于组合。框架内部的增量机制意味着值只在必要时才会重新计算。这适用于每个值,而不仅仅是视图。Bonsai 的妙处在于,它允许你按需组合状态和增量原语。同样的原语既可用于防止用户交互时重新渲染整个页面,也可用于对实时更新的数据集上的昂贵业务逻辑计算进行增量处理。(如果你熟悉 React,可以想象所有东西都在使用类似 hooks 的机制,并且状态在组件层级之外管理。)而且由于 Bonsai 是用 OCaml 编写的,你可以在后端和前端使用相同的语言和类型。这对于保持大型 Web 应用代码库的可管理性来说,其影响怎么强调都不为过,尤其是当你广泛利用 OCaml 的类型系统时。 ## Bonsai 并不真是个 Web 框架 到目前为止我们实际上一直在谈论 Bonsai_web。Bonsai 本身与前端无关,因为归根结底,所有 UI 本质上都可以表示为带状态的增量计算,其中不同的组件知道如何在底层数据变化时渲染自身。如果 Bonsai 是一个用于管理状态生命周期和范围的库,上面再加一层用于表达特定 UI 界面的细节,那么你就知道相同的核心是如何被适配的了。而 Bonsai_term 就是由此诞生的。 当 Ty Overby 在 2019 年创建 Bonsai 时,它最终会被用于终端应用的想法还是个玩笑。某种程度上,Bonsai 的全部意义在于,在 Jane Street,我们在 Web 开发方面感觉有些力不从心。我们一些最重要的应用建立在古老且有些难用的 curses(https://en.wikipedia.org/wiki/Curses_(programming_library))库上,它“名如其库”(curses 意为诅咒)。终端应用快速且以键盘为中心,这是我们所喜欢的,但 Web 也有许多优点。点击超链接的便利性很难被超越;当然,Web 也为你提供了构建 UI 的广阔调色板,包括在命令行上不实用的图表和图形,以及集成帮助(通过工具提示等)。在 Bonsai_web 发布后的几年里,Web 应用蓬勃发展,其中许多直接是从终端移植过来的。但到了 2026 年,我们感觉另一场复兴正在酝酿,这次是相反的方向。 ## 终端 UI 卷土重来——Claude Code 效应? Bonsai_term 最初是 2024 年夏天 Jose Rodriguez(我们的开发者之一)的个人爱好项目,他利用 kitty 图形协议构建了一个漫画阅读器。它展现出足够的前景,以至于他后来为 Jane Street 开发了一些类似 ncdu 的工具。2025 年 4 月,Bonsai_term 获得了足够的关注,我们开始认真投入生产化。恰逢 AI 智能体开始崭露头角,而 2025 年 2 月 Claude Code 的到来更是让一切加速。很快变得明朗:一款精心制作的终端应用正在战胜功能齐全的 IDE,这在很大程度上要归功于终端本身的速度、简单性和可移植性。终端模拟器无处不在,并深度集成到编辑器中;TUI 在开发者已经在的地方迎接他们。起初是命令行(https://en.wikipedia.org/wiki/In_the_Beginning..._Was_the_Command_Line),现在依然如此——无处不在、触手可及。 我们加倍投入 Bonsai_term,很快形成了反馈循环。我们开发了自己的类似 Claude Code 的工具,名为 AIDE(我们构建它是为了保持在不同模型供应商之间选择的自由,以适应我们特殊的开发环境,并更好地控制执行沙箱),它既成为了 Bonsai_term 的演示,也成为了创造它的伙伴。在将 AIDE 构建为功能齐全的智能体框架的过程中,我们产生了一个丰富的 UI 组件库,其他应用可以利用这些组件。那些了解这款特别优秀的 TUI 的开发者很高兴地发现,他们可以利用构建该 TUI 的新框架,以同样精致的方式制作自己的终端应用。任何在这里做过 Web 开发的人都会对 Bonsai_term 感到熟悉,而且它还有一个巨大优势:特别适合 AI 辅助。实际上,我们有些不明白这些模型编写 Bonsai_term 代码的能力为什么这么好——考虑到它相对小众,并且依赖于例如 OxCaml(https://oxcaml.org/)专有特性。(我们觉得这可能与测试故事有关,下面会讨论。) 然后,最近随着 Bonsai_term 和 AI 智能体的出现,Ian 发现他可以在不到十分钟内做出一个可用的原型。这个原型足够有用,足以支撑后续让其变得真正靠谱所花费的时间。 Bonsai_term 截图测试,显示预期输出渲染为 UI 本身 注意这些测试中的“预期”块包含实际 UI 的渲染 ## 用截图测试形成闭环 Bonsai_term 最强大的特性之一是其测试框架,它与 AI 开发配合得很好。你可以轻松编写集成测试,只需在终端应用中逐步操作,并在任意时刻打印其状态(看起来就像截图)。因为一切都是文本,这直接应用了我们的 expect 测试(https://blog.janestreet.com/the-joy-of-expect-tests/)框架,与常规的 expect 测试一样,回归或行为变化会表现为差异。重要的是,这些测试对于编码智能体来说运行起来很简单,而且输出对智能体也可读。这个闭环使 AI 很容易检查自己的工作,导致功能更经常在第一次尝试时就正确。实际上,体验如此之好,以至于 strace-ui 的许多开发时间都花在了那些智能体无法从测试中看到的输出类型上,例如滚动、过滤和渲染的性能特性。(它在文件描述符追踪方面也遇到了很大困难。) ## 上万个终端应用百花齐放 如果你查看我们内部搜索引擎中提及 Bonsai_term 的记录,你会发现每天都有几十个新应用在构建。一些例子: - 一个用于交易系统的时光机调试 TUI。 - 一个用于自动化 Linux 管理任务的 TUI。 - 一个用于我们内部 CI 系统的监控 TUI。 - 用于编排和监控智能体编码会话的 TUI。 - 一个用于运行和管理智能体评估的 TUI。 - 用于管理部署和回滚的 TUI。 - 一个用于浏览日志的 TUI。 - 终端图表库。 我们不能在公开文章中展示所有这些的截图,但这里有两个可以分享的:`proctopus`,用于管理多进程应用;以及 `dissect`,用于分解可执行文件中的臃肿部分。 proctopus 终端应用 dissect 终端应用 这种增长可能又回到了导致 strace-ui 出现的相同力量: - 终端应用轻量、快速,并且开发者随处可得。 - 使用 Bonsai_term,你可以用声明式、类型安全的方式构建终端应用,并在后端和前端之间共享代码。 - 你之前不需要用过 Bonsai 就能上手。 - AI“说 Bonsai_term”,而截图风格的 expect 测试形成的闭环意味着你和智能体都能看到应用在做什么;反馈快速且准确。 - 有一个健康的组件生态系统,而且由于 Bonsai 组件组合性很好,你可以通过拼接现有组件来构建相当复杂的应用。 还有一个额外的好处,是 Bonsai_web 工作方式的特性。Bonsai_web 应用是用 OCaml 编写的,但通过一个名为 js_of_ocaml 的转译器移植到 JavaScript。浏览器 API 的变幻莫测意味着一些在原生平台上运行良好的库无法链接到 js_of_ocaml 程序;实际上,编写 Bonsai_web 应用的最大障碍之一,就是精心切割出所有依赖库的 JavaScript 友好部分。虽然多年来为了支持我们的 Web 应用工作,这种切割已经做了很多,但远未完成。Bonsai_term 没有这个问题,这意味着你的 TUI 更像是一个常规的 OCaml 程序,可以使用与其他任何应用相同的库、工具和服务。 令人欣慰的是,纠正人机工程学确实对开发者的兴趣产生了巨大影响。现在 Jane Street 的许多开发者在为自己构建小工具甚至复杂的完整应用时,都会选择 Bonsai_term,而以前这或许不值得投入。而且由于身处终端,这些应用是键盘驱动的、闪电般快速的,并以一种有用的方式受到约束——为实用性而非炫目而优化。Web 不会消失,但看到终端应用再次蓬勃发展,就像回家一样。 ## 附录:如何试用 strace-ui、Bonsai_term 和 Proctopus 想试试 Bonsai_term 吗?你可以在这里阅读我们的安装指南(https://github.com/janestreet/bonsai_term)。你可以让你的 LLM 查看我们的示例仓库(https://github.com/janestreet/bonsai_term_examples),然后让它构建你自己的 TUI。我们强烈建议你让你的 LLM 编写类似于这个(https://github.com/janestreet/bonsai_term_examples/blob/with-extensions/pomodoro_timer/test/test_pomodoro_timer.ml)的 expect 测试,以获得更好的效果! 你可以通过以下链接中的说明安装 `proctopus` 和 `strace-ui`: - proctopus:https://github.com/janestreet/proctopus - strace-ui:https://github.com/janestreet/strace_ui

相似文章

@jakevin7: 发表个暴论,TUI 会逐渐式微甚至被淘汰。 我已经很久没有用 claude code 了。基本都是用 slock。 对于临时任务,现在用的更多的是 codex desktop,偶尔用 claude desktop。 让我开始重新思考 TU…

X AI KOLs Following

文章讨论了TUI(终端用户界面)在AI编程工具中逐渐式微的趋势,作者认为随着模型能力增强,TUI将被CLI+server架构或Web UI取代,并分享了从Claude Code转向Slock、Codex Desktop等工具的个人体验。

@geekbb: 基于 Tauri(Rust + Svelte)的桌面应用,将编程 AI 代理、API 客户端、SQL/NoSQL 编辑器、SSH 终端、远程文件浏览器和项目管理看板整合在一个界面中,开发者不用在多个应用之间切换。 https://gith…

X AI KOLs Timeline

Clauge 是一个基于 Tauri(Rust + Svelte)的桌面应用,将编程 AI 代理、API 客户端、SQL/NoSQL 编辑器、SSH 终端、远程文件浏览器和项目管理看板集成在同一界面内,让开发者无需在多个应用间切换。

@GoJun315: 终端工具用了 20 年,一直没人搞懂进程为什么在跑。 一位印度独立开发者,开源了 witr 工具,上线不到五个月,暴涨了 15400+ GitHub Star! 终端里一行命令,把进程的整条来路说清楚。从 kernel 到 systemd…

X AI KOLs Timeline

一款名为 witr 的开源终端工具,由印度独立开发者开发,能解释进程为何运行,从 kernel 到 systemd 追踪进程来源,并内置交互式 TUI 仪表盘,上线不到五个月获得 15400+ GitHub Star。