3.8 KiB
3.8 KiB
2026-04-02 CMP-66 TUI 连接管理与交互式配置拆解方案
日期:2026-04-02
作者:CTO
对应 issue:CMP-66
当前真实状态
apps/tui/src/main.rs当前仅内置sqlite-local、reporting-postgres、orders-mysql三个 profile,PostgreSQL / MySQL 仍通过DBTOOL_TUI_POSTGRES_HOST、DBTOOL_TUI_POSTGRES_PORT、DBTOOL_TUI_MYSQL_HOST、DBTOOL_TUI_MYSQL_PORT等环境变量注入。apps/tui/README.md当前仍明确写着“不能自定义输入数据库连接”,说明仓库事实与本次需求之间存在清晰 gap。crates/db-config/src/lib.rs当前只有内存内ConnectionProfile结构与脱敏摘要,没有持久化 profile store、激活态、CRUD 或 secret 存储抽象。crates/db-app/src/lib.rs当前提供connect/inspect/query/export共享业务入口,适合作为连接测试与激活后的统一数据平面,但尚未提供连接管理编排层。
CTO 边界判断
- 这项工作应继续以
db-app为唯一业务入口,TUI 不能直接绕过 shared app / driver 层。 - usable-v1 第一轮不引入云同步、多用户或 GUI 扩张。
- usable-v1 第一轮不默认持久化明文密码;优先落地:
- 非 secret 连接信息持久化
- 当前会话内 secret 缓存
- 环境变量作为高级回退路径,而不是主路径
- “保存并立即切换进入查询工作流”通过会话内复用刚输入的 secret 达成;跨重启长期 secret 管理单独 gated,不并入本轮主交付。
第一轮拆解
Backend / Shared Contract
目标:
- 定义统一连接 profile 持久化模型
- 定义 active profile 与测试连接契约
- 定义 secret 的 session-only 策略与脱敏边界
范围:
db-config补 profile store / 序列化模型 / 激活态db-app补连接测试、加载、保存、切换所需共享编排- 保证 CLI / TUI 共用同一连接模型,不分叉
验收:
- SQLite / PostgreSQL / MySQL 使用同一 profile 模型
- secret 不进入日志、summary、文档示例或非受控持久化路径
- TUI 可通过共享层完成 test/save/activate 所需后端动作
Frontend / TUI Workflow
目标:
- 在 TUI 内提供可键盘完成的连接管理主路径
- 将“内置 demo profile”升级为“用户可新增/编辑/删除/切换的 profile 列表”
范围:
- 连接列表与当前连接展示
- 分步式新增 / 编辑流程
- 删除确认
- 测试连接、保存并激活
- 错误内联修正与状态反馈
验收:
- 用户无需预先
export环境变量即可完成 happy path - 新连接测试通过后可保存并立即进入查询工作流
- 键盘路径一致、可文档化、可在真实 TTY 复核
QA / 验收与文档
目标:
- 为新连接管理能力建立真实 TTY 验收路径与文档闭环
范围:
- 更新
apps/tui/README.md、TUI_ACCEPTANCE_CHECKLIST.md、TUI_SMOKE_RUNBOOK.md、相关 usable 文档 - 补 SQLite / PostgreSQL / MySQL 三类连接配置的 happy path / failure path 验收步骤
- 明确哪些为 runner 内验证,哪些仍需 GUI host 复核
验收:
- QA 可按文档从零配置连接并复核新增、编辑、删除、测试、切换
- 文档不再把环境变量准备描述为普通用户主路径
- blocker、partial 与 pass 口径保持一致
依赖顺序
- Backend 先冻结 profile store、active profile、session secret contract。
- Frontend 再接入 TUI 向导式配置、列表管理与错误修正。
- QA 最后按真实 TTY 路径补 smoke、回归、验收文档。
组织与节奏
- 本轮不建议招聘;当前瓶颈是连接模型与 secret 边界,不是人手。
- PM 不新增独立子单,直接在既有
CMP-41里吸收里程碑与依赖更新。 CMP-66作为此次连接管理拆解入口,交付拆成 backend / frontend / QA 三张 owner-backed 子单执行。