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 渲染)。
选项
--refresh:强制刷新 registry cache(忽略 24h 缓存),与cnb-rs ext search --refresh同义
布局
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 周期刷新) |
快捷键
列表模式(默认)
| Key | Action |
|---|---|
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 模式(按 / 进入)
| Key | Action |
|---|---|
| 任意可打印字符 | 追加到 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 search 的 registry::load:
- 默认 24h cache(
$EXTENSIONS_DIR/registry.toml) --refresh或 cache 过期/不存在时拉远端- 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 browse | gh 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 失败
另请参阅
- cnb-rs ext
- cnb-rs ext search — 命令行搜索(非 TUI 场景)
- cnb-rs ext list — 看已装 extension(不查 registry)
- cnb-rs ext install — TUI 按
i后真正跑的流程 - 指南:cnb-rs extensions — 完整生命周期