← 返回信息流
AI 资讯Hacker News·2 小时前

Show HN: 基于 libghostty 打造的屏幕风格终端复用器 Boo

原标题:Show HN: Boo – screen-style terminal multiplexer built on libghostty

速览

该项目 Boo 是一个终端复用器,其核心构建在 libghostty 库之上。它采用了类似屏幕(screen)的使用风格,旨在为开发者提供更高效的终端会话管理体验。作为 Show HN 项目,它展示了 libghostty 在构建现代终端工具方面的潜力。

AI 深度解读

Show HN: Boo – 基于 libghostty 构建的屏幕风格终端复用器

背景

在终端工作流中,GNU screentmux 长期以来一直是保持会话持久化和多窗口管理的标准工具。然而,随着终端仿真技术的演进,特别是像 Ghostty 这样高性能、现代终端仿真器的出现,传统的终端复用器在状态同步、渲染保真度以及与自动化脚本/AI 代理的交互能力上存在局限性。

Boo 是一个新兴的开源项目,它旨在利用 libghostty(Ghostty 的底层终端仿真核心库)的强大能力,重新定义终端复用器。该项目由 Coder 团队开发,使用 Zig 语言编写,旨在解决传统复用器在“屏幕状态”感知上的不足,并为脚本和 AI 代理提供更原生的交互接口。

核心内容

项目概述与安装

Boo 是一个类 GNU screen 风格的终端复用器,其核心优势在于它并非简单地转发字节流,而是通过 Ghostty 的终端仿真核心解析每个会话的输出。这意味着 Boo 始终掌握着每个会话的精确屏幕状态,包括内容、样式、光标位置、滚动历史记录以及终端模式。

安装方式: 对于 Linux 和 macOS 用户,可以通过以下命令一键安装:

curl -fsSL https://raw.githubusercontent.com/coder/boo/main/install.sh | sh

也可以通过设置 BOO_VERSIONBOO_INSTALL_DIR 环境变量来指定版本和安装路径。预编译的二进制文件发布在 GitHub Releases 页面。

核心功能与使用

Boo 提供了一套完整的会话管理功能,支持会话的创建、分离、重新连接、重命名和销毁。

  • 会话管理

    • boo new:创建新会话并附加。如果不指定名称,默认使用当前目录名,若不可用则使用进程 ID。
    • boo new work -d -- make:创建一个名为 work 的分离会话,并在后台运行 make 命令。
    • boo attach work:重新连接到指定会话。
    • boo ui:启动全屏 UI 界面,在侧边栏中列出所有会话,支持通过键盘快捷键进行切换、调整大小、创建和终止会话。
    • boo ls / boo rename / boo kill:列出、重命名或终止会话。
  • 快捷键兼容

    • 默认绑定遵循 GNU screen 的规范,包括 C-a C-d(分离)和 C-a d
    • boo ui 提供了额外的快捷键用于会话管理。

自动化与 AI 代理友好性

Boo 的设计特别考虑了脚本和 AI 代理的需求,提供了无需 TTY 即可使用的原生命令,使其成为驱动交互式程序的天然沙箱。

典型自动化循环:

  1. 创建无头会话boo new build -d -- bash
  2. 发送输入boo send build --text 'make' --enter(注意:--text 是字面量,无转义处理,无隐式换行)。
  3. 等待输出稳定boo wait build --idle(等待 2 秒无新输出,避免传统的 sleep-and-poll 轮询循环)。
  4. 读取屏幕boo peek build --scrollback(读取渲染后的屏幕,而非原始字节日志)。
  5. 清理boo kill build

关键自动化特性:

  • 状态读取 (peek):打印的是从终端状态重建的渲染屏幕,保证有序、完整重绘且稳定。支持 --scrollback 包含历史记录,--json 输出包含大小、光标和标题信息。
  • 等待机制 (wait):支持 wait --text <text> 阻塞直到屏幕包含特定文本,或 wait --idle 等待输出静止。支持超时设置(如 500ms, 2s, 1m 等),超时返回退出码 4,防止无限挂起。
  • 输入发送 (send)send --text 是字面量输入,无转义处理,无引号层干扰。支持 --enter 提交,--key 发送控制键(如 Enter, C-c, Up),且 stdin 模式是二进制安全的。
  • 机器可读输出ls --jsonpeek --json 提供结构化数据。
  • 退出码规范:0 成功,1 错误,2 用法错误,3 会话不存在,4 等待超时。

架构设计

Boo 的架构分为客户端、守护进程和终端仿真层:

  1. 客户端:将用户的 TTY 置于原始模式(raw mode),并通过帧式 Unix 套接字协议(src/protocol.zig)传输字节。
  2. 守护进程:在会话创建时 fork 产生,拥有会话的命令。该命令是一个附加到 PTY 的子进程,其输出被送入持久的 ghostty-vt TerminalStream。
  3. 状态同步
    • 附加时:输出逐字节传递给用户的终端。
    • 重新附加时:守护进程清理用户终端,并使用 libghosttyVT TerminalFormatter 从状态中重放屏幕。
    • 分离时:终端查询(如 DSR, DA, XTWINOPS)由 libghostty 的流处理器回答;附加时则由真实终端回答,避免双重回复。

限制与现状

Boo 目前是一个年轻的项目,并非 GNU screen 的直接替代品:

  • 单客户端限制:每个会话只允许一个附加客户端(附加即抢占),不支持 -x 共享模式。
  • 单窗口限制:每个会话只有一个窗口,不支持会话内的拆分或标签页。建议每个任务运行一个会话,并通过 boo ui 进行切换。
  • 前缀键限制C-a 前缀目前不可配置。粘贴包含 0x01 的字节会被解释为前缀(这与 GNU screen 的缺陷相同,但 boo ui 通过括号粘贴功能免疫此问题)。
  • 终端类型:会话运行在 TERM=xterm-256color 下。

关键要点

  • 基于 libghostty:Boo 利用 libghostty 的核心能力,实现了对终端屏幕状态(内容、样式、光标、滚动等)的精确感知,这是传统复用器难以做到的。
  • Zig 编写:项目使用 Zig 语言开发,依赖 Zig 0.5.2(原文提及 0.15.2,需确认版本,通常 Zig 版本号较小,此处保留原文数字或指代 Zig 构建系统),并通过 zig build 进行构建。
  • AI/Agent 友好:提供了 send, peek, wait 等原生命令,支持无 TTY 操作和 JSON 输出,极大简化了脚本和 AI 代理与交互式终端程序的交互逻辑。
  • 非侵入式状态重放:重新附加会话时,不是简单地重放日志,而是基于 libghostty 的状态重建屏幕,确保渲染的一致性。
  • 功能取舍:目前不支持多客户端共享会话、会话内多窗口/标签页,以及可配置的前缀键。它更适合单任务单会话的管理模式。
  • 安装简便:提供了一键安装脚本和预编译二进制文件,支持 Nix 构建。

意义与影响

Boo 的出现代表了终端复用器领域的一个新方向:从“字节流转发”向“状态感知渲染”转变

  1. 提升自动化可靠性:传统的终端自动化往往依赖于解析原始输出流,容易受到 ANSI 转义序列、滚动缓冲区变化等因素的干扰。Boo 通过 libghostty 提供的结构化屏幕状态
查看原文 →github.com