Toolbox Hub:从 fzf 脚本集合到 Rust TUI 工具箱

Toolbox Hub 最初解决的是一个很实际的问题:我有很多 CLI 工具和自己写的脚本,但每个工具都有不同的参数、输入方式和交互习惯。与其继续堆 fzf 菜单,不如把它们统一到一个真正的 TUI 工具箱里。

现在它已经不只是 FFmpeg 菜单

当前注册表按领域组织:

  • 媒体 44
  • 图像 3
  • 系统 11
  • 网络 8
  • 开发 4
  • 工具 2
  • 包管理 7
  • 打包 20

工具来源包括内置动作、本地脚本和 TOML Manifest。用户可以把自己的动作放进 ~/.config/toolbox-hub/tools.d/,通过 Ctrl-R 重载,而不用重新编译。

软件包中心

包管理是这一轮变化里比较重要的一部分。

Toolbox Hub 没有通过解析 pacman 的文本输出来做数据层,而是直接使用 Arch Linux 的 libalpm。在此基础上,包管理界面提供搜索、已安装、新闻、维护四个面板,并处理官方仓库、AUR、依赖、孤儿、缓存和更新等信息。

真正会修改系统的操作都会先显示最终命令,再进行二次确认,同时支持 dry-run。CLI 和 TUI 也共用同一套命令翻译逻辑。

文件和鼠标交互

TUI 不再只是键盘菜单。

现在可以用鼠标选择、双击执行、滚轮滚动;文件视图可以直接过滤文件,并在终端右侧预览图片。根据终端能力,可以使用 kitty、sixel 或 iTerm2 图形协议,不能显示图片时再降级为字符预览。

表单还可以直接打开文件选择器,工作目录也可以交给 yazi 管理。

CLI 与 TUI 是同一个工具

Toolbox Hub 并不要求所有操作都进入界面:

toolbox-hub -s fzf
toolbox-hub -i fzf ripgrep
toolbox-hub -u
toolbox-hub -n --unread
toolbox-hub --orphans
toolbox-hub --clear-cache

同时还提供 ui pick、ui confirm、ui pager 三个可以被脚本复用的终端组件。它们把 UI 输出到 `/dev/tty),stdout 留给脚本结果,因此可以继续组合进 shell 工作流。

为什么坚持 Arch + libalpm

这是一个明确面向 Arch 系 Linux 的工具。

包管理依赖 libalpm,真正执行软件安装和系统修改时仍然交给 pacman / paru;FFmpeg 等媒体工具也继续调用成熟 CLI,而不是重新实现编解码器或包管理器。

这样做的边界比较清楚:Toolbox Hub 负责发现、参数组织、预览、交互、任务和状态;真正执行工作的工具继续保持独立。

sing-box 也进入了统一动作模型

除了媒体和包管理,Toolbox Hub 还把本地 sing-box 运维脚本接入了同一套动作系统,包括体检、审计修复、TUN / eBPF 切换和容器代理。

涉及配置修改的动作采用:

检查 → 备份 → 原子替换 → 重启 → 健康检查 → 失败回滚

因此它逐渐从「把很多脚本放在一起」变成了一个统一的本机工具工作台。

当前架构

核心职责大致分成:

model
  ↓
providers → registry
  ↓
app → ui
  ↓
runtime / media

packages
  ├─ libalpm
  ├─ AUR / Arch News
  └─ package worker

Provider 负责工具来源,registry 负责聚合和发现,app / ui 负责交互,runtime 负责执行,packages 独立处理 Arch 软件包数据和操作。

项目主页:Toolbox Hub

相关文档与实现入口

源码:GitHub