Files
dbtool-cli-v1/apps/tui/README.md
Paperclip CTO d5f69462b0
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
feat(usable): integrate current dbtool implementation snapshot
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-04-02 08:26:18 +00:00

186 lines
11 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# dbtool-tui Shell
`apps/tui` 提供 `dbtool-tui-v1` 的终端工作台实现。
## 当前范围
当前实现包含:
- 独立 `dbtool-tui` 应用入口
- 稳定的六区工作台布局
- 顶部视图切换与底部快捷键提示
- 基于 shared profile store 的连接管理列表、当前连接上下文和失败连接可视化区分
- `Connections` 视图内的分步式新增 / 编辑 / 删除 / 测试 / 保存并激活工作流
- session-only secret 输入与复用;密码不会写入持久化 profile 文件
- 键盘驱动的连接切换工作流,以及连接 `loading / success / failure` 可视状态
- `sqlite-local` 的真实 connect / inspect 路径schema browser 可展示 live schema / table / column
- `sqlite-local` 的真实 query / results / export 工作流,直接复用 `crates/db-app`
- PostgreSQL / MySQL 的 Docker demo live activation / query / export 路径
- shared inspect 返回 schema-level availability 时,`Schema Browser` / `Inspector` / `Status & Activity` 可稳定区分 `ready / empty / restricted`
- 查询草稿切换、基础键入编辑、执行触发与执行状态反馈
- 成功 / 空结果 / 错误三类查询结果展示,以及宽表列分页提示
- 当前结果集导出到 `/tmp` 的 CSV / JSON 反馈
- 面板焦点管理
- 列表选择与基础键盘导航
- `Ready` / `Loading` / `Error` 三种基础界面状态
- 终端尺寸过小的显式降级提示
当前不包含:
- 多连接并发会话
- 跨重启持久化 secret 管理
- 多步向导之外的复杂连接模板或批量导入
- 完整 SQL 编辑器能力
## usable-v1 口径边界
当前 TUI 能力要按三层结论理解,避免把局部 live path 误记为整体通过:
| 层级 | 当前结论 | 含义 |
| --- | --- | --- |
| shell baseline | `pass` | 六区布局、焦点、状态、TTY 启动与退出可直接复核 |
| `sqlite-local` local live | `partial` | 单机会话内可复核 connect / inspect / query / export但只覆盖本地 SQLite |
| PostgreSQL / MySQL network live | `pass` | 当前 runner 可通过 `host.docker.internal`、Docker demo 容器与 TTY smoke 脚本复核真实激活、查询、导出 |
- `sqlite-local` 仍是最轻量的本地单机验证入口,但不再是唯一 live 路径。
- 当前 usable-v1 的 runner 内 network live 回放口径已经建立,可直接复核 PostgreSQL / MySQL。
- QA 在对外汇报时应明确写成“shell baseline = pass、`sqlite-local` = partial、PostgreSQL/MySQL network live = passdemo path”。
## 运行方式
在项目根目录执行:
```bash
cargo run -p dbtool-tui
```
当前默认 live 路径是 `sqlite-local`,底层使用 `examples/tmp/dbtool-demo.sqlite`
启动后会自动对 `sqlite-local` 执行 connect + inspect切换连接时会重新触发 live activation。
内置 `reporting-postgres` / `orders-mysql` profile 默认走 `host.docker.internal:55432/53306`,并分别复用 `dbtool_demo` / `qa_demo` demo 数据。
保存的 profile 默认写入 `~/.config/dbtool/tui-profiles.json`;若需要隔离测试,可在启动前设置 `DBTOOL_TUI_PROFILE_STORE=/tmp/dbtool-tui-profiles.json`
如果当前 runner 缺少 Rust 工具链,可先使用已有产物:
```bash
./target/debug/dbtool-tui
```
## TTY smoke 契约
- `dbtool-tui` 需要交互式 TTY正常终端启动与自动化 smoke 都必须走 TTY 路径。
- 当前最小可重复入口:
```bash
scripts/tui/smoke-tty.sh ./target/debug/dbtool-tui
```
- PostgreSQL live smoke
```bash
export DBTOOL_PASSWORD=dbtool
scripts/tui/live-network-smoke.sh postgres ./target/debug/dbtool-tui
```
- MySQL live smoke
```bash
export DBTOOL_PASSWORD=dbtool
scripts/tui/live-network-smoke.sh mysql ./target/debug/dbtool-tui
```
- 小终端降级入口:
```bash
scripts/tui/smoke-tty.sh ./target/debug/dbtool-tui 20 90 /tmp/dbtool-tui-small.log
```
- `./target/debug/dbtool-tui --help` 不是有效 smoke当前它只用于确认“非 TTY 会被明确拒绝”这一限制。
- 共享 runbook 见 `TUI_SMOKE_RUNBOOK.md`
## 键盘交互
- `Tab` / `Shift+Tab`:切换焦点面板
- `←` / `→``1` / `2` / `3`:切换顶部视图
- `↑` / `↓`移动连接、schema/object 或结果行选择
- `Enter`:在 `Connections` 焦点下激活所选连接;在 `Connections` 视图的 `Query Editor` 下循环 driver 或提交字段编辑;在 `Schema Browser` 焦点下展开 / 折叠 schema 或确认对象;在 `Query Editor` 焦点下执行当前查询
- `n` / `e` / `d`:在 `Connections` 视图中新增 / 编辑 / 删除保存的 profile
- `i`:在 `Connections` 视图中编辑当前字段;在工作区 `Query Editor` 中进入 SQL 基础插入模式
- `t`:在连接表单中测试当前 staged profileconnect + inspect
- `s`:在连接表单中保存并激活当前 staged profile
- `x`:将当前结果集导出为 CSV 到 `/tmp`
- `j`:将当前结果集导出为 JSON 到 `/tmp`
- `[` / `]`:在 `Query Editor` 中切换查询草稿;在 `Results` 中横向翻页宽表列
- `r`:清空当前 query / export 反馈,回到 `Ready`
- `Esc`:取消当前连接管理动作,或回到默认工作台
- `q`:退出
## 状态恢复与键位一致性
- `Esc` 在三个场景下都承担“回到稳定态”的职责:连接表单 / 删除确认时先取消当前动作;编辑模式下退回 navigate mode普通导航下回到默认 `Workspace` + `Query Editor` 焦点。
- `r` 是唯一的显式恢复键:会同时清空 query 结果、query 错误、export 成功/失败反馈,并把界面状态收口回 `Ready`
- `[` / `]` 只在工作区的两个焦点区生效:`Query Editor` 下切换草稿,`Results` 下横向翻页;其他面板按下不会触发隐藏状态变化。
- `x` / `j` 只在当前工作区已有“成功且可导出”的结果集时成立;若查询仍在运行或当前没有可导出结果,会保留明确错误/提示,而不是静默失败。
- `Enter` 的语义由当前视图和焦点共同决定:`Connections` = 激活连接,连接表单中的 `Query Editor` = 提交字段 / 循环 driver`Schema Browser` = 展开/确认对象,工作区 `Query Editor` = 执行查询;插入模式下 `Enter` 只提交当前字段或插入换行。
## 快速测试路径
如果你只是想快速走通一遍当前可见工作流,推荐按下面步骤操作:
1. 启动 `cargo run -p dbtool-tui`
2.`2` 进入 `Connections` 视图,确认左侧列表来自 profile store
3.`n` 新建 profile在中间 `Query Editor` 里用 `i` 编辑字段、`t` 测试连接、`s` 保存并激活
4. 等待活动连接从 `Loading` 变成 `Healthy`
5.`Tab` 把焦点切到 `Schema Browser`
6.`↑` / `↓` 选择 `main.accounts``main.tickets`
7.`Tab` 切到 `Query Editor`
8. 先不要按 `i`,直接按 `[` / `]` 切换草稿
9. 选中 `account_ticket_summary.sql` 后按 `Enter`,确认成功结果
10. 切到 `empty_recent_tickets.sql` 后按 `Enter`,确认空结果
11. 切到 `bad_syntax.sql` 后按 `Enter`,确认错误结果持续留在工作区
12. 切到 `ticket_export_preview.sql` 后按 `Enter`,成功后按 `x``j`,确认导出反馈和 `/tmp` 路径
## 常见困惑
- `Inserted a newline. Press Esc, then Enter to run.`:表示你已经按了 `i` 进入编辑模式,然后按了 `Enter`;这时 `Enter` 不会执行查询,而是插入换行。按 `Esc` 退出编辑模式后,再按 `Enter` 才是执行查询。
- 当前保存的 profile 文件不包含密码:界面里的 `Session password` 只在本次 TUI 进程中可用;如果需要跨重启复用,请配置 `Password env`
- 如果修改了 profile store 路径,建议用临时文件如 `DBTOOL_TUI_PROFILE_STORE=/tmp/dbtool-tui-profiles.json` 做 smoke避免污染长期配置。
- 若 GUI host 或宿主机需要把 demo network host 从 `host.docker.internal` 改到 `127.0.0.1`,只能在启动前设置 `DBTOOL_TUI_POSTGRES_HOST` / `DBTOOL_TUI_POSTGRES_PORT``DBTOOL_TUI_MYSQL_HOST` / `DBTOOL_TUI_MYSQL_PORT`;这属于 operator fallback不等于连接管理已交付。
- 如果觉得界面文字偏多:本轮已先做一轮 Help / Status / Connections 文案收敛;当前版本仍偏向 QA / 契约验证界面,后续再继续收敛文案。
## 界面验收
QA 可按以下步骤复核:
1. 启动后能看到 `Connections``Schema Browser``Query Editor``Results``Inspector``Status & Activity` 六个区域
2. 默认活动连接应为 `sqlite-local`,且 `Connections` 列表中能区分当前连接、可选连接和失败连接
3. 使用 `2` 进入 `Connections` 视图后,可用 `↑` / `↓` 移动连接选择,并在 `Results` / `Inspector` 里看到 profile store 与 secret source 摘要
4.`n` 可进入新增流程;中间 `Query Editor` 会切换成分步式字段表单,`i` 进入字段编辑,`t` 测试连接,`s` 保存并激活
5. 编辑流程下 `Session password` 只显示 session-only 提示,不会回显明文密码
6.`Connections` 焦点下按 `Enter` 激活失败连接时,`Status & Activity``Inspector` 会持续显示可读错误,而不是只给瞬时提示
7. 启动后或回到 `sqlite-local` 后,连接状态会先进入 `Loading`,随后在 `Schema Browser` 焦点下可浏览 `main.accounts``main.tickets`
8. 选中对象后,`Results` 会展示列定义,`Inspector` 会展示当前 schema / object / column 上下文
9. 在工作区 `Query Editor` 焦点下可用 `[` / `]` 切换查询草稿,`i` 进入基础输入模式,`Enter` 触发执行
10. `account_ticket_summary.sql` 应返回真实结果行,`empty_recent_tickets.sql` 应显示空结果,`bad_syntax.sql` 应显示结构化错误
11. `ticket_export_preview.sql` 执行成功后,按 `x``j` 应在工作区内看到导出成功反馈和 `/tmp` 输出路径
12. 成功结果在 `Results` 中以表格方式展示,宽表会给出列分页提示,长结果仍可用 `↑` / `↓` 浏览
13. 错误状态会保留可读错误信息,不退化成空白或瞬时提示
14. 使用 `Tab` / `Shift+Tab` 时,当前焦点区域边框高亮会移动
15. 使用 `←` / `→``1` / `2` / `3` 时,中间内容区会随视图切换
16. 使用 `r`query / export 反馈会清空并回到 `Ready`
17. 将终端缩小到低于 `100x28` 时,会出现尺寸不足提示而不是错乱布局
18. 使用 `Esc` 可取消当前连接管理动作或恢复默认工作台,使用 `q` 可稳定退出
## 当前限制
- `sqlite-local` 仍是当前最快的本地 runner live connect / inspect / query / export 路径
- Postgres / MySQL 当前默认指向 Docker demo 容器;若 demo stack 未启动,会回退为可读失败态
- 当前 runner 若缺少 `cargo`,需要使用已有二进制做交互 smoke源码重建与测试需在具备 Rust 工具链的环境完成
- 非 TTY 启动当前会明确报错并退出;这是已记录限制,不是可支持的帮助命令路径
共享 QA 文档:
- `TUI_ACCEPTANCE_CHECKLIST.md`
- `TUI_SMOKE_RUNBOOK.md`
- `TUI_TEST_STRATEGY.md`
- `TUI_REGRESSION_CHECKLIST.md`