feat: add dbtool tui live query workspace
Some checks failed
release-smoke / macos-13 / x86_64-apple-darwin (push) Has been cancelled
release-smoke / ubuntu-latest / x86_64-unknown-linux-gnu (push) Has been cancelled
release-smoke / windows-latest / x86_64-pc-windows-msvc (push) Has been cancelled

- add shared db-app layer for connect/inspect/query/export events
- add dbtool-tui workspace with sqlite-local live flow and QA docs
- include host-validated acceptance updates for CMP-36

Co-Authored-By: Paperclip <noreply@paperclip.ing>
This commit is contained in:
Paperclip CTO
2026-03-27 17:17:20 +00:00
parent 7424491944
commit 19aeb7784b
12 changed files with 5006 additions and 4 deletions

20
apps/tui/Cargo.toml Normal file
View File

@@ -0,0 +1,20 @@
[package]
name = "dbtool-tui"
version.workspace = true
edition.workspace = true
rust-version.workspace = true
publish = false
[[bin]]
name = "dbtool-tui"
path = "src/main.rs"
[dependencies]
crossterm = "0.28.1"
db-app.workspace = true
db-config.workspace = true
db-core.workspace = true
ratatui = "0.29.0"
[lints]
workspace = true

114
apps/tui/README.md Normal file
View File

@@ -0,0 +1,114 @@
# dbtool-tui Shell
`apps/tui` 提供 `dbtool-tui-v1` 的终端工作台实现。
## 当前范围
当前实现包含:
- 独立 `dbtool-tui` 应用入口
- 稳定的六区工作台布局
- 顶部视图切换与底部快捷键提示
- 连接管理列表、当前连接上下文和失败连接可视化区分
- 键盘驱动的连接切换工作流,以及连接 `loading / success / failure` 可视状态
- `sqlite-local` 的真实 connect / inspect 路径schema browser 可展示 live schema / table / column
- `sqlite-local` 的真实 query / results / export 工作流,直接复用 `crates/db-app`
- 查询草稿切换、基础键入编辑、执行触发与执行状态反馈
- 成功 / 空结果 / 错误三类查询结果展示,以及宽表列分页提示
- 当前结果集导出到 `/tmp` 的 CSV / JSON 反馈
- 面板焦点管理
- 列表选择与基础键盘导航
- `Ready` / `Loading` / `Error` 三种基础界面状态
- 终端尺寸过小的显式降级提示
当前不包含:
- 真实网络数据库连接激活
- 多连接并发会话
- 自定义新增 / 编辑连接表单
- 完整 SQL 编辑器能力
## 运行方式
在项目根目录执行:
```bash
cargo run -p dbtool-tui
```
当前默认 live 路径是 `sqlite-local`,底层使用 `examples/tmp/dbtool-demo.sqlite`
启动后会自动对 `sqlite-local` 执行 connect + inspect切换连接时会重新触发 live activation。
如果当前 runner 缺少 Rust 工具链,可先使用已有产物:
```bash
./target/debug/dbtool-tui
```
## 键盘交互
- `Tab` / `Shift+Tab`:切换焦点面板
- `←` / `→``1` / `2` / `3`:切换顶部视图
- `↑` / `↓`移动连接、schema/object 或结果行选择
- `Enter`:在 `Connections` 焦点下激活所选连接;在 `Schema Browser` 焦点下展开 / 折叠 schema 或确认对象;在 `Query Editor` 焦点下执行当前查询
- `i`:在 `Query Editor` 中进入基础插入模式
- `x`:将当前结果集导出为 CSV 到 `/tmp`
- `j`:将当前结果集导出为 JSON 到 `/tmp`
- `[` / `]`:在 `Query Editor` 中切换查询草稿;在 `Results` 中横向翻页宽表列
- `r`:清空当前 query / export 反馈,回到 `Ready`
- `Esc`:回到默认工作台
- `q`:退出
## 快速测试路径
如果你只是想快速走通一遍当前可见工作流,推荐按下面步骤操作:
1. 启动 `cargo run -p dbtool-tui`
2. 等待默认连接 `sqlite-local``Loading` 变成可用状态
3.`Tab` 把焦点切到 `Schema Browser`
4.`↑` / `↓` 选择 `main.accounts``main.tickets`
5.`Tab` 切到 `Query Editor`
6. 先不要按 `i`,直接按 `[` / `]` 切换草稿
7. 选中 `account_ticket_summary.sql` 后按 `Enter`,确认成功结果
8. 切到 `empty_recent_tickets.sql` 后按 `Enter`,确认空结果
9. 切到 `bad_syntax.sql` 后按 `Enter`,确认错误结果持续留在工作区
10. 切到 `ticket_export_preview.sql` 后按 `Enter`,成功后按 `x``j`,确认导出反馈和 `/tmp` 路径
## 常见困惑
- `Inserted a newline. Press Esc, then Enter to run.`:表示你已经按了 `i` 进入编辑模式,然后按了 `Enter`;这时 `Enter` 不会执行查询,而是插入换行。按 `Esc` 退出编辑模式后,再按 `Enter` 才是执行查询。
- 当前不能自定义输入数据库连接:这是当前范围外能力。当前 TUI 只提供内置的 `sqlite-local`、Postgres、MySQL 示例连接,用于验证工作台流程和状态反馈。
- 如果觉得界面文字偏多:本轮已先做一轮 Help / Status / Connections 文案收敛;当前版本仍偏向 QA / 契约验证界面,后续再继续收敛文案。
## 界面验收
QA 可按以下步骤复核:
1. 启动后能看到 `Connections``Schema Browser``Query Editor``Results``Inspector``Status & Activity` 六个区域
2. 默认活动连接应为 `sqlite-local`,且 `Connections` 列表中能区分当前连接、可选连接和失败连接
3. 使用 `2` 进入 `Connections` 视图后,可用 `↑` / `↓` 移动连接选择
4.`Connections` 焦点下按 `Enter` 激活失败连接时,`Status & Activity``Inspector` 会持续显示可读错误,而不是只给瞬时提示
5. 启动后或回到 `sqlite-local` 后,连接状态会先进入 `Loading`,随后在 `Schema Browser` 焦点下可浏览 `main.accounts``main.tickets`
6. 选中对象后,`Results` 会展示列定义,`Inspector` 会展示当前 schema / object / column 上下文
7.`Query Editor` 焦点下可用 `[` / `]` 切换查询草稿,`i` 进入基础输入模式,`Enter` 触发执行
8. `account_ticket_summary.sql` 应返回真实结果行,`empty_recent_tickets.sql` 应显示空结果,`bad_syntax.sql` 应显示结构化错误
9. `ticket_export_preview.sql` 执行成功后,按 `x``j` 应在工作区内看到导出成功反馈和 `/tmp` 输出路径
10. 成功结果在 `Results` 中以表格方式展示,宽表会给出列分页提示,长结果仍可用 `↑` / `↓` 浏览
11. 错误状态会保留可读错误信息,不退化成空白或瞬时提示
12. 使用 `Tab` / `Shift+Tab` 时,当前焦点区域边框高亮会移动
13. 使用 `←` / `→``1` / `2` / `3` 时,中间内容区会随视图切换
14. 使用 `r`query / export 反馈会清空并回到 `Ready`
15. 将终端缩小到低于 `100x28` 时,会出现尺寸不足提示而不是错乱布局
16. 使用 `Esc` 可恢复默认工作台,使用 `q` 可稳定退出
## 当前限制
- `sqlite-local` 是当前唯一可在本地 runner 直接完成 live connect / inspect / query / export 的路径
- Postgres / MySQL 连接仍以可读失败态保留,用于验证多目标上下文和错误持续可见性
- 当前 runner 若缺少 `cargo`,需要使用已有二进制做交互 smoke源码重建与测试需在具备 Rust 工具链的环境完成
共享 QA 文档:
- `TUI_ACCEPTANCE_CHECKLIST.md`
- `TUI_TEST_STRATEGY.md`
- `TUI_REGRESSION_CHECKLIST.md`

3053
apps/tui/src/main.rs Normal file

File diff suppressed because it is too large Load Diff