跳转到内容

cnb-rs ext browse

cnb-rs ext browse [options]

全屏 TUI 浏览 registry 中所有 extension,实时关键字 filter、键盘导航,一键安装 / 卸载 / 浏览器打开仓库(Phase 6 Task D)。

灵感来自 gh ext browse,简化版:列表 + filter(不含 readme preview 面板,按 w 直接走浏览器读 README,避免在 TUI 内集成 markdown 渲染)。

选项

布局

text
┌─────────────────────────────────────────────────────────────┐
│ cnb-rs ext browse · 24 entries · filter: stats              │  ← header (反白)
├─────────────────────────────────────────────────────────────┤
│ (按 / 进入 filter 模式) 或 filter: <text>                   │  ← filter row
├─────────────────────────────────────────────────────────────┤
│ > [✓] ★ cnb-stats        Git commit 统计 dashboard ⭐0 v0.1.3│
│   [ ] ★ cnb-chat         CNB OpenAPI 自然语言 agent         │
│   [✓] ★ cnb-stars        Star 累积趋势可视化                │
│   ...                                                        │
├─────────────────────────────────────────────────────────────┤
│ j/k:nav  /:filter  i:install  r:remove  w:web  ...  q:quit  │  ← footer (反白)
└─────────────────────────────────────────────────────────────┘
列前缀含义
> 当前选中项
[✓]已安装
[ ]未安装
official extension(cnb-rs 团队维护)
⭐<N>仓库 star 数(CI 周期刷新)
后缀 v..最新 release tag(CI 周期刷新)

快捷键

列表模式(默认)

KeyAction
q / Esc退出
j / 下一项
k / 上一项
Shift+J / Space / PageDown下翻 25
Shift+K / PageUp上翻 25
g跳到顶部
Shift+G跳到底部
/进入 filter 模式
i安装当前选中(退出 TUI 后跑 install 流程)
r卸载当前选中(退出 TUI 后跑 remove 流程)
w在浏览器打开当前 entry 的仓库 URL

Filter 模式(按 / 进入)

KeyAction
任意可打印字符追加到 filter,实时过滤列表
Backspace删 filter 末尾字符
Enter应用 filter,回到列表模式
Esc清空 filter 并回列表模式
Ctrl+C强制退出 TUI

filter 在 name / description / repo 三字段做不区分大小写的字串包含匹配(与 ext search 同语义)。

行为细节

Action 后退执行

i / r / w 不会内联执行 install / remove / open,而是退出 TUI 后再 dispatch 到对应流程:

text
[TUI 内按 i] → 退 alternate screen → 还原 cursor → 打印「→ cnb-rs ext install <name>」 → 跑 install::install(..)

这样可以复用既有 install 的进度条 / SHA256 校验 / sh.exe wrap 等完整流程,不用把它们嵌进 TUI raw mode(参考 gh ext browse 切到 "command" page 的同思路,但实现更简单)。

非 TTY fallback

CI / pipe 环境(stdout 不是 TTY)自动跳过 TUI,回退到 plain 列表 print:

bash
$ cnb-rs ext browse | head
registry 24 extension(非 TTY 环境,跳过 TUI):
  [ ] cnb-stats              Git commit 统计 dashboard
  [] cnb-chat               CNB OpenAPI 自然语言 agent
  ...

提示:交互式 browse 需要 TTY 终端;脚本场景请用 `cnb-rs ext search --json`

Registry 数据源

复用 cnb-rs ext searchregistry::load

  1. 默认 24h cache($EXTENSIONS_DIR/registry.toml
  2. --refresh 或 cache 过期/不存在时拉远端
  3. fetch 失败时 fallback 到 stale cache,保证离线可用

stars / latest_release 字段来自 Phase 6 Task B 的 ext registry refresh,由 cnb-extensions 的 daily cron job 自动刷新。

实现取向

  • 零额外依赖:仅用现有 crossterm 依赖实现 raw mode + alternate screen + event loop + 渲染,不引入 ratatui(与 design .windsurf/docs/cnb-extension-design.md §A4 「browse 与瘦身目标一致」对齐)
  • 单文件src/commands/extension/browse.rs ~530 行(含 17 个单元测试)
  • 简化范围:v1 仅做列表 + filter;不做 readme preview 面板(参考 gh ext browse 双列布局),按 w 直接浏览器读

gh extension browse 的差异

特性cnb-rs ext browsegh extension browse
全屏 TUI✅ crossterm + alternate screen✅ rivo/tview + Pages
实时 filter✅ name / description / repo 全字段✅ 仅 name
已装标记[✓][installed]
跳顶 / 跳底g / Shift+G❌ 无(仅 PageUp/PageDown)
Readme preview❌ 简化,按 w 走浏览器读✅ 双列布局,markdown 渲染
全屏 readme 模式✅ Enter 切到 readme page
全屏 help page❌ inline footer hint? 切到 help page
Install 时进度可见✅ 退出 TUI 后跑原 install 流程✅ 切到 command page 看输出
非 TTY fallback✅ 自动 plain print 列表❌ 必须有 TTY
Binary size 增量0(复用现有 crossterm)tview 增 ~300KB

退出码

  • 0:用户正常退出(q / Esc),或退出后 install / remove / open 都成功
  • 1:TUI 启动失败(终端 raw mode 不可用 / registry 加载失败),或退出后 install / remove 失败

另请参阅

Released under the MIT License.