diff --git a/README.md b/README.md index 9ec101c9a..c4b9784da 100644 --- a/README.md +++ b/README.md @@ -102,7 +102,7 @@ Only use these steps for an app whose source you trust. Homebrew installations u 14. Automatic project entry-point detection with one-click run support for Spring Boot, Java, Maven, Gradle, npm, Cargo, Go, Python, Make, Docker Compose, Procfile, and shell projects. 15. Per-language service switches so language servers can be enabled or disabled independently to match the machine's resources. 16. Multi-line editor tabs for keeping more files visible in the same workspace. -17. Database connection workspace with multiple database types, connection management, SQL history, table browsing, and database operations. +17. Database connection workspace (currently macOS only) with multiple database types, connection management, SQL history, table browsing, and database operations. 18. Ongoing bug fixes and user experience improvements. diff --git a/README.zh-CN.md b/README.zh-CN.md index 0aa149716..5810baaf9 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -102,7 +102,7 @@ Lithe 是一款主要面向 Java 和 Spring Boot 开发者的轻量级 IDEA 替 14. 自动识别 Spring Boot、Java、Maven、Gradle、npm、Cargo、Go、Python、Make、Docker Compose、Procfile 和 Shell 项目的可运行入口,并支持一键运行。 15. 支持按语言独立开关语言服务,可根据电脑配置自由启用或停用。 16. 支持类似 IDEA 的多行编辑器标签,同时展示更多打开的文件。 -17. 新增数据库连接工作台,支持多种数据库类型、连接管理、SQL 历史、表浏览和数据库操作。 +17. 新增数据库连接工作台(目前仅支持 macOS),支持多种数据库类型、连接管理、SQL 历史、表浏览和数据库操作。 18. 持续修复问题并优化用户体验。 diff --git a/shared/platform-feature-matrix/features/database-connections.json b/shared/platform-feature-matrix/features/database-connections.json index 30c8eaea6..a4e298af2 100644 --- a/shared/platform-feature-matrix/features/database-connections.json +++ b/shared/platform-feature-matrix/features/database-connections.json @@ -25,11 +25,11 @@ }, "windows": { "evidence": [ - "windows/tauri/src/features/database" + "windows/tauri/src/config/backend-capabilities.ts" ], - "implementationStatus": "implemented", - "verificationStatus": "pending" + "implementationStatus": "missing", + "verificationStatus": "not-applicable" }, "owner": "Database", - "verification": "创建、编辑、测试和删除各支持数据库连接,确认凭据和错误边界。 Search 查询与文件掩码、Database 连接搜索、Redis Key pattern 和 Nacos 配置/服务搜索均直接使用 Git Log 同源的全局唯一 LitheSearchFieldStyle;在深浅主题核对 36pt 外框、30pt 可见高度、4pt 圆角、1pt 常态边框、2pt 聚焦边框、3pt 外留白及 13pt 常规文字和提示色,确认无局部背景或原生边框叠加,并保留搜索、清除与键盘提交行为。 使用原生 NSHostingView 渲染验证共享 LitheSearchTextField 的占位文字在深浅主题均为 IDEA Component.infoForeground 对应的 #73767C、13pt 常规字重;空输入框单独绘制占位文字,避免 SwiftUI 原生 prompt 替换其颜色与字重,有内容时占位文字消失并保留原生编辑和主文字色。 中文输入法组词期间,即使绑定文本仍为空,共享 LitheSearchTextField 占位文字立即隐藏;取消组词或删空后恢复,确认中文后仍隐藏。原生 setMarkedText 回归覆盖明暗主题和两个输入框互不影响;保留焦点、键盘提交、搜索/过滤语义及占位字号颜色。原生背景观察视图卸载和移出窗口时清理通知,匹配当前窗口的字段编辑器及所属输入区域,不修改业务绑定。 共享搜索字段未聚焦时悬停立即显示文本编辑光标,离开或禁用时恢复箭头;保留中文组词及连接过滤语义。 macOS:分别在数据库首页、SQL/数据/结构/历史页、Redis/Nacos/MongoDB 工作区及连接/结构比较弹窗打开时退出应用或关闭项目,确认无 SIGTRAP;休眠后重新打开数据库,确认新实例正常工作,旧视图的延迟刷新不会访问已清空的能力缓存。 macOS 数据库入口位于右侧停靠栏,采用 IDEA IU-262.9437.185 中明确 Apache-2.0 授权的原始 20pt 描边圆柱 SVG(database/expui/dbms@20x20.svg 及 dark 变体,DatabaseIconMappings 对应数据库工具窗口),沿用共享停靠栏尺寸及普通/悬停/选中配色,打开时保留项目树、代码编辑器和底部工具;无连接时只有右侧空状态,不显示中央统计首页。打开表、查询或历史时复用可关闭的 Database 编辑器标签;隐藏右侧面板不关闭标签,关闭标签保留连接和 SQL 草稿。切换代码、终端、媒体、Diff 后可重新选择数据库;休眠和关闭项目移除数据库标签。Windows 本次保持现有布局。 数据库工具栏和筛选/排序统一为原始 16pt IDEA 明暗 SVG、共享 22pt 按钮,检查无额外边框、正常/悬停/禁用/筛选选中状态和默认箭头;各图标按钮复用 workbenchHoverHelp 即时显示本地化用途,禁用按钮也可显示提示,移开和点击后关闭,提示在数据库面板局部 scope 内绘制;窄面板工具栏可横向滚动,空状态只保留常规灰色文字,在内容区横向居中、纵向约三分之一处显示;移除图标、说明段落和重复 New Connection 按钮,添加连接仍由工具栏加号进入。 数据库连接新建/编辑、文件夹及 DBX 导入复用全局居中弹窗、输入焦点边框与确认/取消按钮;核对重复打开、取消/Escape/标题关闭、引擎选择及语言环境,导入关闭后清空数据。 连接/文件夹表单不再绘制 grouped 卡片背景,展开高级选项仍可滚动;普通/密码输入框复用共享 28pt 居中布局和启用状态下的 I-beam 悬停,深浅主题核对文字、焦点和禁用状态。 数据库面板仅标题下保留共享 LitheToolWindowHeaderDivider(主题边框色、1pt 高度、两侧 1pt 留白),工具栏按钮下方不再绘制额外横线;深浅主题对照项目和其他工具窗口核对。 连接搜索默认折叠为工具栏搜索图标,点击仅展开共享输入框且不自动聚焦,点击输入框后才显示焦点边框,再次点击或 Escape 清空并关闭搜索;筛选和排序固定在同一工具栏最右侧,窄宽度下左侧动作可横向滚动且右侧菜单仍可操作。 新建/编辑连接采用原生 Grid 标签列和输入列,Host/Port 同行、TLS/安全开关在输入列;提示文字跟随输入列,保留现有字段及逻辑。核对 MySQL、SQLite、Redis、Nacos、长标签以及展开安全/网络选项时的对齐和滚动;弹窗按简要/展开内容调整高度,不添加 IDEA 专有控件。 共享搜索输入在点击同窗口输入区域以外的位置时释放原生字段编辑器,焦点边框恢复常态;输入内部点击保留焦点,其他搜索框的观察器不得取消当前编辑,查询文字保持不变。 数据库概览按钮位于搜索左侧,打开独立可关闭且去重的 Database Overview 编辑器标签;用共享标题/分隔线/行样式保留连接数、已连接数、类型数、Quick Start、Common Actions、Recent SQL 六区。核对与 Database 查询标签同时打开、分别关闭和重复打开,草稿/连接不丢失;关闭项目或休眠移除全部数据库标签;明暗主题、窄窗口纵向排版及最近 SQL 恢复到所属连接。 数据库概览和内容标签统一使用侧栏圆柱图标;连接标签保持数据库名(空值用连接名),页面切换不改变名称;无连接全局历史显示 SQL History。 概览常用动作悬停仅覆盖内容和内边距,使用共享圆角,禁用动作无悬停;概览 New Connection 删除 SwiftUI sheet,复用侧栏 LitheCenteredPopup,核对无打开动画/遮罩、原生标题与外框及关闭/取消/Escape。 连接弹窗 Safety 和 Advanced network 标题整行支持点击展开/收起;检查文字、空白、原生箭头均只切换一次,展开后的输入和开关操作不触发收起。 数据库分组文件夹复用项目树 LitheIcon(.folder) 和共享 treeIconSize,删除黄色 folder.fill;核对深浅主题、展开/收起及嵌套分组。 数据库树分组、连接、数据库、表节点复用共享 litheTreeRow/Tree 字体、行高、缩进与选择悬停色;移除连接颜色竖线、Tables 数量胶囊和空表独立卡片,保留状态、只读/保护提示及原动作。 数据工作区四个导航图标复用共享工具栏按钮和选中状态,空状态使用共享 LitheUnavailableView;数据库操作错误由协调器交给全局通知,核对隐藏侧栏仍通知、重复激活不重复通知、休眠取消观察和重新激活恢复;连接树悬停保持默认箭头。 四个数据库工作区内容统一共享页签、工具栏、标题分隔线、滚动条与字体,SQL 编辑器使用主题字体和颜色;Overview Quick Start/Recent SQL 悬停与 Common Actions 共用圆角与内外留白,背景不覆盖行外留白,状态和时间保持右对齐。核对有数据和空状态、查询草稿切换/关闭、结果网格、数据编辑、结构动作、历史恢复以及明暗主题。 数据库树采用共享左右 12pt、上下 4pt 外留白;连接与表的选中行接入共享活动区域观察器,仅树区域获得焦点且应用窗口为 key 时显示主题蓝色,点击编辑区、搜索框或切换窗口后显示非活动灰色。核对重新点击树恢复蓝色,选中对象保持不变。 连接树移除行尾 Provider 类型及状态符号,成功/失败改为品牌图标右下角绿色/红色圆点,未连接不显示点,连接中保留进度提示;MySQL 原有海豚图形使用 IDEA 深色图标蓝色 #548AF7 提升暗背景对比,工具栏与树节点复用同一资源。核对不同连接状态、只读提示及明暗背景可辨性。 Provider 图标替换为 Community c7f91397 的原始 16×16 providers SVG 及可用 dark 变体(Nacos 保持已有资源),避免 DBX 1024px 画布内留白导致图形过小;主题切换使用独立缓存。状态点依据 modifiers/dot.svg 的 5pt 直径,在 Lithe 主题语义色上按用户要求轻微提高饱和度,不改变全局颜色。验证原生资源尺寸、实际像素占用、主题切换及红绿点位置。 Redis Key Browser 标题/DB 标识复用共享工具窗口标题栏,Estimate size 使用原生常规复选框;刷新与 SCAN 搜索使用 IDEA 16pt SVG 和共享 22pt 工具栏按钮及悬停说明。删除局部红色图标底板、DB 胶囊、迷你开关和内联错误条,错误沿用协调器全局通知,空状态复用 LitheUnavailableView 并填充浏览区,确保搜索固定顶部。保留 SCAN 分页、大小估计绑定、重试、详情及写保护逻辑。核对错误/空状态、搜索焦点、键盘提交与切换连接;原生生命周期检查覆盖 SQLite/Redis 工作区关闭项目后的保留视图。 Data 表格按 Community grid/impl 的 TableResultView、CellRenderingUtils、GridColorSchemeUtil 和 SelectionColorLayer 组织:数据工具栏置于 WHERE/ORDER BY 分栏上方,删除无动作 All rows 胶囊;表头 25pt 下限、4pt 左内边距、原始列 SVG、自适应数字宽度行号列,点击行号仍选择行、点击 # 仍全选,保留排序/过滤菜单。数字单元格右对齐、文本左对齐;单元格选择接入原生焦点和共享活动区域,有焦编辑器选择蓝、失焦编辑器选择灰,切换表清理焦点;表头使用背景 RGB +16/-16 的 softHighlightOf、网格线取 Islands 编辑器 INDENT_GUIDE,单元格左右 3pt,行高按字体行高乘编辑器行距 +5pt,顶部工具栏使用共享 30pt 紧凑高度。数据库树 schema/Tables 分组/表使用 IDEA IU-262.9437.185 中明确 Apache-2.0 授权的原始 schema/objectGroup/table 16pt 明暗 SVG,Nacos/Redis/MongoDB 节点保持既有语义。验证有数据时焦点/失焦、过滤/排序、行选择/全选、分页、只读及窄宽度。 筛选/排序弹出区域复用共享弹窗按钮、输入框和分段控件,删除原生按钮背景。数据列宽参考 DefaultGridColumnLayout,按表头与前 100 行内容测量,40pt 下限和可用宽度黄金分割上限,按内容比例分配面板剩余空间;不再等分视口。可写连接单击只选择、双击进入单元格编辑,只读只选择不进入编辑;保留上下文菜单和行操作。 数据库树首层文件夹和连接不叠加局部 7pt/4pt 左内边距,只使用共享容器留白和 19pt 层级缩进;核对首层起点、文件夹子连接以及未分组连接。 数据表头依据 primaryKeyColumns 显示原始 16pt columnGoldKey 明暗资源;核对单字段及复合主键、普通列,字段名 id 不作为主键判据。 共享 sidecar 行解码读取实际值类型,SQLite PRAGMA 的 pk/cid/notnull 保持整数而非 unsupported;回归覆盖单字段和复合主键及普通列。 数据网格列宽在内容测量基础上按比例分配面板剩余宽度、移除 full×1.2 上限;拉宽/收窄面板核对铺满与横向滚动。双击可写单元格进入编辑,普通选中保留整格选中色;复用共享 litheFocusEffectHidden 隐藏 macOS 14+ 系统文字焦点框,核对键盘及双击编辑,Git Log 既有行为不变。 数据表删除独立路径/属性工具栏,保留单行共享 30pt 工具栏:左侧原始 16pt/22pt 刷新及编辑动作,右侧 TSV/分页固定,低频原操作合并到 Data Tools,窄宽度左侧横向滚动;连接标签显示数据库/连接名,移除内层表标签。原普通 Text 的单/双击 SwiftUI 手势改为原生 mouseDown 点击计数,第一下同步选择,第二下在可写连接进入编辑,不等待双击判定;已编辑字段不覆盖,右键/Control-click 和滚轮仍交由原控件,核对默认光标、只读、焦点失焦和键盘导航。 每个数据库连接对应一个顶层标签,重复打开去重;切换表仍复用所属连接标签,内层表标签与文字 Data/SQL/Structure/History 栏删除。四个页面使用原始 16pt table/shell/structure/history SVG、共享 22pt 图标按钮及悬停/选中/辅助功能,与表格操作合并为一行;分组分隔项 7pt 槽位,ToolBar.separatorColor 深浅主题色,非 Data 或无表禁用表格操作。验证 Data/Structure/History 页面及独立 SQL 控制台切换、数据库名稳定、多连接标签去重/关闭/恢复、各连接 SQL 草稿和导航位置隔离、表选择及即时单击、全部关闭/休眠清理和窄宽度布局;明暗资源和原动作保留。 工具栏新增/提交/撤销/更多、TSV 和分页复用同一共享按钮状态;核对可用时原色及 hover,禁用时灰色且无 hover,父组禁用与显式参数禁用只降低一次亮度;TSV 保留文字固有宽度。组件检查覆盖深浅主题,实际预览检查只读/可写草稿及撤销后的状态恢复。 行号列使用与数据相同的 13pt 等宽 Regular 字体,普通与当前行文字使用独立 LINE_NUMBERS_COLOR/LINE_NUMBER_ON_CARET_ROW_COLOR;背景透明,当前行按 SelectionColorLayer 高亮;核对单元格选择、行选择、# 全选、失焦、右键、深浅主题,以及右侧 1pt 网格线。 macOS Data 新增草稿行须立即可见、延续行号并滚动选中,双击编辑后可提交;连续新增与撤销通过原生预览检查,只读连接保持禁用,失败保留草稿。 macOS 连接树只显示保存的连接名和品牌/连接状态图标,移除只读锁;演示名称不含人为追加的类型后缀。 macOS Data 全选后点击单元格清除整行选择,行号仍可逐个取消;可写演示连接单击只选择、双击可编辑,Tables 分类使用普通树文字色,数量维持次要色。 macOS 可写单元格单击立即整格选择、双击进入编辑,编辑保留原背景及内侧 2pt Islands #3871E1 焦点边框;已有行与新增行一致,失焦移除边框,只读不编辑,行号与全选保留草稿。 macOS 异步标签导航:点击连接先同步选中标签,数据刷新完成不重新激活页面;侧栏、Overview、历史恢复和表动作复用同一入口。运行 DatabaseWorkspaceLifecycleTests.delayedConnectionLoadPreservesLaterNavigation,以 TestGate 控制成功/失败加载,核对切到文件或 Overview、关闭单个/全部标签和请求开始前关闭后,标签集合和选择不被迟到结果修改,loading 状态正常结束。 macOS Data 变更背景按 Community MutationsColorLayer 解析:修改蓝色、新增绿色、删除使用 DIFF_DELETED,提交失败覆盖为 Islands Notification.errorBackground 红色;当前行深/浅 RGB 各加/减 0x10,取消整行选择后保留当前行高亮,实际选中单元格覆盖选中色。核对编辑、连续新增、删除标记、失败保留草稿、撤销及深浅主题;每条网格线使用 INDENT_GUIDE_COLOR 深/浅 #323438/#E6E6E6 与 1pt 单边绘制,行列无额外空隙,修改/失败/删除不改变边线或文字透明度。DatabaseGridAppearanceTests 保护动态主题解析与透明度。 macOS Data 透明行号栏使用独立 LINE_NUMBERS_COLOR/LINE_NUMBER_ON_CARET_ROW_COLOR;普通行号无表头底板;GridRowHeader 横线与 TableResultRowHeader 右侧竖线保留同一 1pt 网格边线,当前行号变亮,选中单元格所在行的其余普通单元格及当前列标题取 GRID_CURRENT_ROW。核对深浅主题、跨行/列点击、键盘移动、全选取消、失焦、双击编辑和新增草稿,变更色及蓝/灰单元格选择保持原优先级。 macOS SQL 控制台:New Query 为每个查询打开独立顶层 console 标签;Data/SQL 切换复用已打开控制台,历史恢复与表 SQL 动作走相同导航入口。无查询结果时编辑器铺满面板,结果出现后使用共享分隔容器,原生行号栏复用普通编辑器;保留补全、格式化、执行选区、风险确认与历史。MySQL/MariaDB 数据库菜单位于控制台右侧,侧栏不显示额外品牌按钮,切库保留查询 ID 和草稿并清理旧结果。DatabaseWorkspaceLifecycleTests.connectionAndConsoleTabsRestoreDraftsAndCloseIndependently 覆盖多查询、跨连接、后台关闭、切库、关闭当前控制台与全部关闭;延迟加载测试增加切到查询后不得抢回标签的场景。 macOS Console 默认 JetBrains Mono 13pt Regular 与 1.2 行距,字号随编辑器设置;浅色注释真实 Italic,其余 token 保持常规,引号内注释标记不误着色。原生测试核对明暗主题、空白编辑视口扩大后仍覆盖、I-beam、当前行号、草稿回传及字体/段落属性。SQL 只读结果复用 Data 自适应列宽、透明行号、1pt 网格和立即选择/键盘/复制;筛选排序、结构编辑及批量/替换/行详情复用共享按钮、输入、选择器和居中弹窗,核对 Esc/取消/标题关闭不提交。Redis/Nacos 输入与工具栏保留原动作;系统确认及文件选择保留原生。远端 Provider 的实际读写仍须有服务验证,不以组件测试代替。 Console 及 Structure 工具栏统一复用 Database 的 30pt 行高;Console 与共享行号使用 TextKit 1 初始化,保护执行结果分栏及标签重建后无需点击即可首次显示草稿。补全候选的原生 delegate 回归确认 SELECT 前缀,不把系统抢占的 Control-Space 快捷键认定为已完成实机验收。 Mac 本地回归增加重名查询列的布局、原生 Data/Console 重建后的表格草稿及后台刷新快照、行号区与编辑区背景连续性、数据库菜单初始选择状态;数据库切换保留现有 MySQL/MariaDB 后端边界。 Mac Console:无焦点时进入/移动空白编辑区显示 I-beam,离开恢复箭头;首次普通点击末行下方任意位置直接聚焦 EOF,清除旧文字选择,不插入虚拟空行,立即输入追加到最后一行;窗口缩放与查询结果分栏后仍保持整块视口命中。数据库下拉的辅助功能报告当前库名,切库保留查询 ID 和草稿。 Mac Console 文字从内容区原点开始,不叠加容器与行片段的水平留白;明暗主题原生图像回归核对空查询和末尾空行输入前后行号基线不变,当前行背景持续覆盖行号栏;Console 行号按 New UI 的 4pt 空注释区、4pt 前置间距及 14pt 最小占位右对齐,核对单个数字的原生绘制位置,测量使用实际 Console 字体。 Mac Console 点击切行时,原生插入光标与当前行背景同步;stillSelecting 为 true 的单个/多个选区入口回归在选择结束通知之前检查行号及背景,保留原生拖选、键盘、输入法和执行选区行为,只重绘旧、新行及行号区域。 Mac Console 按 Community New UI 将分隔线置于行号栏右边缘前 3pt,1pt 线后保留 2pt 编辑背景,文字容器不重复加 padding;明暗主题原生像素检查验证边线及两点背景。 macOS 审查回归:运行 DatabaseWorkspaceLifecycleTests 的 delayedApplyLocksDraftsAndPreservesNavigation、backgroundConnectionManagementPreservesEditorSelection、removingConnectionClosesOwnedTabsAndFallsBack;以有界延迟控制成功/失败提交,核对在途编辑及重复提交被阻止、A→B 和 A→B→A 不被旧提交刷新、后台保存/刷新不改变编辑器选择,删除连接显式移除数据/查询标签并合法回退。原生交互和实际服务验证单独记录。 Mac Data、只读结果、Console 和行号栏结构背景复用全局 editor 调色板,与项目区保持一致;测试遍历全部配色及明暗外观,Console 与普通编辑器一样关闭文本、滚动视口、容器及行号栏的独立底色;在同一原生窗口逐像素比较最终合成背景与侧栏一致,覆盖深浅外观及编辑、缩放、重绘后的当前行状态。WHERE/ORDER BY 空条件沿 INLINE_PARAMETER_HINT 取深/浅 #858A94/#7A7A7A,有条件使用 SQL keyword 色;实际点击筛选/排序与切换面板后颜色不漂移。 Mac Console 数据库选择器在 SQLite 等单库连接下也可展开,使用共享菜单/hover/22pt 按钮和 16pt schema/箭头;当前库初始选中,MySQL/MariaDB 列出当前连接的其他数据库并复用切库,保留查询 ID 和草稿。SQLite 只显示当前文件库,未开放跨连接切换;核对关闭/Esc/禁用、真实名称和 2pt 内容间隔及左右 4pt 留白。 Mac 异步草稿隔离:运行 delayedPageOnlyClearsItsOwnCurrentDrafts,核对成功/失败分页在切表、切连接及后续分页替代后不清空新页面草稿;运行 delayedApplyLocksDraftsAndPreservesNavigation 的 otherConnection 场景,核对后台提交不阻止新连接加载和编辑,旧提交结束不清理新连接草稿,模块仍追踪后台在途写入。 Mac 查询呈现:运行 queryOutputTracksStatementsSelectionAndFailures 与 WorkbenchModuleUIRegistryTests,核对底部 Services/Output、逐语句真实时间/行数/错误、Unicode 与重复语句选区、错误历史、清空日志保留结果,以及执行前按 SQL 子句格式化(保留词大小写,SELECT 内容另起一行并缩进 4 格,FROM 跟随投影)、有原生范围时只改选区并保留重复 SQL、引用及运算符;深浅主题实际打开连接标题的历史窗口,检查 Close/Paste/Esc、只读预览、错误条关闭和 Services 页签切换。SQL 编辑区、历史预览和 Output 共用语法高亮器;querySyntaxColorsProtectQuotedIdentifiersAndLiterals 在明暗主题核对关键词与运算符、指数数字、转义字符串、美元引用、引用标识符和注释,SQL 本文保持不变。原生像素回归核对首列语句左侧 1pt 绿框可见,绘制遵循 BOXED 零外扩并避开 AppKit 裁剪边缘;同窗原生色块校准 HDR 映射,保留确切色值及严格色差断言。格式化后的末尾光标仍位于 EOF。executionMarkersFollowUnchangedStatementsAndExposeStripePositions 核对成功对号、失败图标、右侧 14×2pt 状态条、短文本不拉伸和长文本压缩、Unicode 前置编辑移动范围与语句编辑清除状态;queryCompletionKeepsOnlyUnchangedExecutionMarkers 用 TestGate 控制查询完成,核对在途追加保留状态及修改已执行语句不显示旧标记。右侧标记点击定位,普通滚动和滑块拖动保留共享 CompactScroller;原生明暗主题另验收。共享输出 Copy 复用统一按钮,常态无背景和边框、hover 使用共享圆角底色,禁用只衰减一次,复制内容仍为无 ANSI 的原始输出。Copy 作为原生滚动视图内的真实 NSHostingView 子视图优先命中,仍用共享 SwiftUI 按钮样式;正文排除按钮的 cursor rect,按钮及下层移动事件均保持箭头;copyExcludesNativeTextHitsAndCursorRectsAcrossResize 在深浅主题检查图标、文字、内边距、缩放后命中、文本矩形完整覆盖正文,以及下层 cursorUpdate 事件恢复箭头。回归检查整棵 NSHostingView 视图树命中到真实按钮宿主,覆盖窗口缩放和图标/文字/留白;完整应用 hover 单独检查。multilineStatementOutlineEndsAtFinalLineInsteadOfWidestLine 核对四行 SQL 的绿框在最后一行收窄到实际终点,原生像素验证收窄边线和原最大 X 处背景;沿 Community EditorPainter.paintBorderEffect,保留绿色 token 和 1pt 描边。 审查修复回归:databaseSQLFormatterLeavesSessionDependentEscapesVerbatim 核对 SQLite 普通字符串、E 转义字符串及写入语句含反斜杠时完全保留原文;formattedMiddleSelectionKeepsTheWholeStatement 核对 Unicode 前缀后的中间选区、全选和 EOF 格式化映射;delayedApplyLocksDraftsAndPreservesNavigation 增加 returnToConnection 的成功/失败场景,核对提交结束后补刷并结束 loading、不影响其他连接。真实窗口核对从旧 Console 切到新 Console 后 History Paste 不沿用旧范围。 SQL History 列表与预览之间的分隔条使用现有 highlightsOnHover=false,深浅主题核对 hover、按下及拖动颜色保持常态,同时保留调整光标和宽度拖动。 databaseSQLScannersPreserveCombiningMarksInsideLiterals 覆盖 U+0301/U+FE0F 开头、双引号转义及字面量内分号/危险关键词;格式化保持原值、拆分仍为一条查询。formattedMiddleSelectionKeepsTheWholeStatement 同时覆盖单条替换和整段多语句格式化,选区不包含其他语句,EOF/全选仍正确。databaseTextAndCopyIgnoreLateEventsOverDivider 验证正文、可编辑 Console、只读 History 及 Copy 的延迟 tracking 事件不覆盖真实分隔条光标,移出窗口后不修改光标;正常正文和按钮仍提供各自光标。Copy 的深浅主题实际宿主测试覆盖翻转坐标与缩放。 后台连接保存回归:backgroundSavePreservesCurrentLoading 使用 TestGate 覆盖当前连接空闲、刷新表、打开表及分页,与后台保存成功/失败的两种完成顺序;后台保存不能设置或清除当前页面 Loading,连接弹窗独立显示连接中并防止重复提交。 P1 并发回归:sidebarTableSelectionDuringApplyLoadsLastSelection 经真实 AppModel 入口覆盖提交期间 A→B、A→B→A 与成功/失败,断言旧页清空、最终表数据正确及 Loading 结束;sqlExecutionLockSurvivesConnectionNavigation 覆盖 INSERT/查询、成功/失败及完成前/后返回原连接,验证跨连接 SQL 执行锁、模块忙闲、禁止重复 Run 与完成后释放。 草稿快照与持久日志回归:reselectingFilteredTableDiscardsDraftsBeforeReplacingKeys 覆盖过滤/排序后编辑、重选同表成功/失败,保证旧行索引草稿不再向新快照主键提交;sqlExecutionLockSurvivesConnectionNavigation 重读原连接的持久 History、Execution Events、Audit,覆盖后台成功/失败及部分批次中断,保留实际影响行数且不回填其他连接 UI。 连接目录的多库独立展开与树单选,见 database-multi-schema-tree 能力记录。 macOS 连接和文件夹右键 Move/To Folder:无分组直接输入,已有分组选择目的地、新建后自动移入或移回根层;QA/Quick 创建嵌套路径,验证循环/重名/过期目标不会产生部分变更。名称弹窗与项目新建文件共用 LitheNamePopup,检查 Enter、Esc、错误提示和深浅主题。 macOS 密码保存:新建用户名为空,仅提供直到重启和永久两种范围;验证临时密码不落盘、跨模块实例可读、范围转换先成功更新存储再发布值、写入/删除失败保留旧密码、旧配置缺少范围字段默认永久。测试结果 Copy 点击后关闭、悬停手形。Windows 此保存范围选项未同步,保持 pending。 新连接 Name 默认采用数据库@主机、未填数据库时为@主机,SQLite 使用文件名;手动改名和已有连接名称不被联动覆盖,URI 密码和查询参数不进入名称。" + "verification": "创建、编辑、测试和删除各支持数据库连接,确认凭据和错误边界。 Search 查询与文件掩码、Database 连接搜索、Redis Key pattern 和 Nacos 配置/服务搜索均直接使用 Git Log 同源的全局唯一 LitheSearchFieldStyle;在深浅主题核对 36pt 外框、30pt 可见高度、4pt 圆角、1pt 常态边框、2pt 聚焦边框、3pt 外留白及 13pt 常规文字和提示色,确认无局部背景或原生边框叠加,并保留搜索、清除与键盘提交行为。 使用原生 NSHostingView 渲染验证共享 LitheSearchTextField 的占位文字在深浅主题均为 IDEA Component.infoForeground 对应的 #73767C、13pt 常规字重;空输入框单独绘制占位文字,避免 SwiftUI 原生 prompt 替换其颜色与字重,有内容时占位文字消失并保留原生编辑和主文字色。 中文输入法组词期间,即使绑定文本仍为空,共享 LitheSearchTextField 占位文字立即隐藏;取消组词或删空后恢复,确认中文后仍隐藏。原生 setMarkedText 回归覆盖明暗主题和两个输入框互不影响;保留焦点、键盘提交、搜索/过滤语义及占位字号颜色。原生背景观察视图卸载和移出窗口时清理通知,匹配当前窗口的字段编辑器及所属输入区域,不修改业务绑定。 共享搜索字段未聚焦时悬停立即显示文本编辑光标,离开或禁用时恢复箭头;保留中文组词及连接过滤语义。 macOS:分别在数据库首页、SQL/数据/结构/历史页、Redis/Nacos/MongoDB 工作区及连接/结构比较弹窗打开时退出应用或关闭项目,确认无 SIGTRAP;休眠后重新打开数据库,确认新实例正常工作,旧视图的延迟刷新不会访问已清空的能力缓存。 macOS 数据库入口位于右侧停靠栏,采用 IDEA IU-262.9437.185 中明确 Apache-2.0 授权的原始 20pt 描边圆柱 SVG(database/expui/dbms@20x20.svg 及 dark 变体,DatabaseIconMappings 对应数据库工具窗口),沿用共享停靠栏尺寸及普通/悬停/选中配色,打开时保留项目树、代码编辑器和底部工具;无连接时只有右侧空状态,不显示中央统计首页。打开表、查询或历史时复用可关闭的 Database 编辑器标签;隐藏右侧面板不关闭标签,关闭标签保留连接和 SQL 草稿。切换代码、终端、媒体、Diff 后可重新选择数据库;休眠和关闭项目移除数据库标签。Windows 本次保持现有布局。 数据库工具栏和筛选/排序统一为原始 16pt IDEA 明暗 SVG、共享 22pt 按钮,检查无额外边框、正常/悬停/禁用/筛选选中状态和默认箭头;各图标按钮复用 workbenchHoverHelp 即时显示本地化用途,禁用按钮也可显示提示,移开和点击后关闭,提示在数据库面板局部 scope 内绘制;窄面板工具栏可横向滚动,空状态只保留常规灰色文字,在内容区横向居中、纵向约三分之一处显示;移除图标、说明段落和重复 New Connection 按钮,添加连接仍由工具栏加号进入。 数据库连接新建/编辑、文件夹及 DBX 导入复用全局居中弹窗、输入焦点边框与确认/取消按钮;核对重复打开、取消/Escape/标题关闭、引擎选择及语言环境,导入关闭后清空数据。 连接/文件夹表单不再绘制 grouped 卡片背景,展开高级选项仍可滚动;普通/密码输入框复用共享 28pt 居中布局和启用状态下的 I-beam 悬停,深浅主题核对文字、焦点和禁用状态。 数据库面板仅标题下保留共享 LitheToolWindowHeaderDivider(主题边框色、1pt 高度、两侧 1pt 留白),工具栏按钮下方不再绘制额外横线;深浅主题对照项目和其他工具窗口核对。 连接搜索默认折叠为工具栏搜索图标,点击仅展开共享输入框且不自动聚焦,点击输入框后才显示焦点边框,再次点击或 Escape 清空并关闭搜索;筛选和排序固定在同一工具栏最右侧,窄宽度下左侧动作可横向滚动且右侧菜单仍可操作。 新建/编辑连接采用原生 Grid 标签列和输入列,Host/Port 同行、TLS/安全开关在输入列;提示文字跟随输入列,保留现有字段及逻辑。核对 MySQL、SQLite、Redis、Nacos、长标签以及展开安全/网络选项时的对齐和滚动;弹窗按简要/展开内容调整高度,不添加 IDEA 专有控件。 共享搜索输入在点击同窗口输入区域以外的位置时释放原生字段编辑器,焦点边框恢复常态;输入内部点击保留焦点,其他搜索框的观察器不得取消当前编辑,查询文字保持不变。 数据库概览按钮位于搜索左侧,打开独立可关闭且去重的 Database Overview 编辑器标签;用共享标题/分隔线/行样式保留连接数、已连接数、类型数、Quick Start、Common Actions、Recent SQL 六区。核对与 Database 查询标签同时打开、分别关闭和重复打开,草稿/连接不丢失;关闭项目或休眠移除全部数据库标签;明暗主题、窄窗口纵向排版及最近 SQL 恢复到所属连接。 数据库概览和内容标签统一使用侧栏圆柱图标;连接标签保持数据库名(空值用连接名),页面切换不改变名称;无连接全局历史显示 SQL History。 概览常用动作悬停仅覆盖内容和内边距,使用共享圆角,禁用动作无悬停;概览 New Connection 删除 SwiftUI sheet,复用侧栏 LitheCenteredPopup,核对无打开动画/遮罩、原生标题与外框及关闭/取消/Escape。 连接弹窗 Safety 和 Advanced network 标题整行支持点击展开/收起;检查文字、空白、原生箭头均只切换一次,展开后的输入和开关操作不触发收起。 数据库分组文件夹复用项目树 LitheIcon(.folder) 和共享 treeIconSize,删除黄色 folder.fill;核对深浅主题、展开/收起及嵌套分组。 数据库树分组、连接、数据库、表节点复用共享 litheTreeRow/Tree 字体、行高、缩进与选择悬停色;移除连接颜色竖线、Tables 数量胶囊和空表独立卡片,保留状态、只读/保护提示及原动作。 数据工作区四个导航图标复用共享工具栏按钮和选中状态,空状态使用共享 LitheUnavailableView;数据库操作错误由协调器交给全局通知,核对隐藏侧栏仍通知、重复激活不重复通知、休眠取消观察和重新激活恢复;连接树悬停保持默认箭头。 四个数据库工作区内容统一共享页签、工具栏、标题分隔线、滚动条与字体,SQL 编辑器使用主题字体和颜色;Overview Quick Start/Recent SQL 悬停与 Common Actions 共用圆角与内外留白,背景不覆盖行外留白,状态和时间保持右对齐。核对有数据和空状态、查询草稿切换/关闭、结果网格、数据编辑、结构动作、历史恢复以及明暗主题。 数据库树采用共享左右 12pt、上下 4pt 外留白;连接与表的选中行接入共享活动区域观察器,仅树区域获得焦点且应用窗口为 key 时显示主题蓝色,点击编辑区、搜索框或切换窗口后显示非活动灰色。核对重新点击树恢复蓝色,选中对象保持不变。 连接树移除行尾 Provider 类型及状态符号,成功/失败改为品牌图标右下角绿色/红色圆点,未连接不显示点,连接中保留进度提示;MySQL 原有海豚图形使用 IDEA 深色图标蓝色 #548AF7 提升暗背景对比,工具栏与树节点复用同一资源。核对不同连接状态、只读提示及明暗背景可辨性。 Provider 图标替换为 Community c7f91397 的原始 16×16 providers SVG 及可用 dark 变体(Nacos 保持已有资源),避免 DBX 1024px 画布内留白导致图形过小;主题切换使用独立缓存。状态点依据 modifiers/dot.svg 的 5pt 直径,在 Lithe 主题语义色上按用户要求轻微提高饱和度,不改变全局颜色。验证原生资源尺寸、实际像素占用、主题切换及红绿点位置。 Redis Key Browser 标题/DB 标识复用共享工具窗口标题栏,Estimate size 使用原生常规复选框;刷新与 SCAN 搜索使用 IDEA 16pt SVG 和共享 22pt 工具栏按钮及悬停说明。删除局部红色图标底板、DB 胶囊、迷你开关和内联错误条,错误沿用协调器全局通知,空状态复用 LitheUnavailableView 并填充浏览区,确保搜索固定顶部。保留 SCAN 分页、大小估计绑定、重试、详情及写保护逻辑。核对错误/空状态、搜索焦点、键盘提交与切换连接;原生生命周期检查覆盖 SQLite/Redis 工作区关闭项目后的保留视图。 Data 表格按 Community grid/impl 的 TableResultView、CellRenderingUtils、GridColorSchemeUtil 和 SelectionColorLayer 组织:数据工具栏置于 WHERE/ORDER BY 分栏上方,删除无动作 All rows 胶囊;表头 25pt 下限、4pt 左内边距、原始列 SVG、自适应数字宽度行号列,点击行号仍选择行、点击 # 仍全选,保留排序/过滤菜单。数字单元格右对齐、文本左对齐;单元格选择接入原生焦点和共享活动区域,有焦编辑器选择蓝、失焦编辑器选择灰,切换表清理焦点;表头使用背景 RGB +16/-16 的 softHighlightOf、网格线取 Islands 编辑器 INDENT_GUIDE,单元格左右 3pt,行高按字体行高乘编辑器行距 +5pt,顶部工具栏使用共享 30pt 紧凑高度。数据库树 schema/Tables 分组/表使用 IDEA IU-262.9437.185 中明确 Apache-2.0 授权的原始 schema/objectGroup/table 16pt 明暗 SVG,Nacos/Redis/MongoDB 节点保持既有语义。验证有数据时焦点/失焦、过滤/排序、行选择/全选、分页、只读及窄宽度。 筛选/排序弹出区域复用共享弹窗按钮、输入框和分段控件,删除原生按钮背景。数据列宽参考 DefaultGridColumnLayout,按表头与前 100 行内容测量,40pt 下限和可用宽度黄金分割上限,按内容比例分配面板剩余空间;不再等分视口。可写连接单击只选择、双击进入单元格编辑,只读只选择不进入编辑;保留上下文菜单和行操作。 数据库树首层文件夹和连接不叠加局部 7pt/4pt 左内边距,只使用共享容器留白和 19pt 层级缩进;核对首层起点、文件夹子连接以及未分组连接。 数据表头依据 primaryKeyColumns 显示原始 16pt columnGoldKey 明暗资源;核对单字段及复合主键、普通列,字段名 id 不作为主键判据。 共享 sidecar 行解码读取实际值类型,SQLite PRAGMA 的 pk/cid/notnull 保持整数而非 unsupported;回归覆盖单字段和复合主键及普通列。 数据网格列宽在内容测量基础上按比例分配面板剩余宽度、移除 full×1.2 上限;拉宽/收窄面板核对铺满与横向滚动。双击可写单元格进入编辑,普通选中保留整格选中色;复用共享 litheFocusEffectHidden 隐藏 macOS 14+ 系统文字焦点框,核对键盘及双击编辑,Git Log 既有行为不变。 数据表删除独立路径/属性工具栏,保留单行共享 30pt 工具栏:左侧原始 16pt/22pt 刷新及编辑动作,右侧 TSV/分页固定,低频原操作合并到 Data Tools,窄宽度左侧横向滚动;连接标签显示数据库/连接名,移除内层表标签。原普通 Text 的单/双击 SwiftUI 手势改为原生 mouseDown 点击计数,第一下同步选择,第二下在可写连接进入编辑,不等待双击判定;已编辑字段不覆盖,右键/Control-click 和滚轮仍交由原控件,核对默认光标、只读、焦点失焦和键盘导航。 每个数据库连接对应一个顶层标签,重复打开去重;切换表仍复用所属连接标签,内层表标签与文字 Data/SQL/Structure/History 栏删除。四个页面使用原始 16pt table/shell/structure/history SVG、共享 22pt 图标按钮及悬停/选中/辅助功能,与表格操作合并为一行;分组分隔项 7pt 槽位,ToolBar.separatorColor 深浅主题色,非 Data 或无表禁用表格操作。验证 Data/Structure/History 页面及独立 SQL 控制台切换、数据库名稳定、多连接标签去重/关闭/恢复、各连接 SQL 草稿和导航位置隔离、表选择及即时单击、全部关闭/休眠清理和窄宽度布局;明暗资源和原动作保留。 工具栏新增/提交/撤销/更多、TSV 和分页复用同一共享按钮状态;核对可用时原色及 hover,禁用时灰色且无 hover,父组禁用与显式参数禁用只降低一次亮度;TSV 保留文字固有宽度。组件检查覆盖深浅主题,实际预览检查只读/可写草稿及撤销后的状态恢复。 行号列使用与数据相同的 13pt 等宽 Regular 字体,普通与当前行文字使用独立 LINE_NUMBERS_COLOR/LINE_NUMBER_ON_CARET_ROW_COLOR;背景透明,当前行按 SelectionColorLayer 高亮;核对单元格选择、行选择、# 全选、失焦、右键、深浅主题,以及右侧 1pt 网格线。 macOS Data 新增草稿行须立即可见、延续行号并滚动选中,双击编辑后可提交;连续新增与撤销通过原生预览检查,只读连接保持禁用,失败保留草稿。 macOS 连接树只显示保存的连接名和品牌/连接状态图标,移除只读锁;演示名称不含人为追加的类型后缀。 macOS Data 全选后点击单元格清除整行选择,行号仍可逐个取消;可写演示连接单击只选择、双击可编辑,Tables 分类使用普通树文字色,数量维持次要色。 macOS 可写单元格单击立即整格选择、双击进入编辑,编辑保留原背景及内侧 2pt Islands #3871E1 焦点边框;已有行与新增行一致,失焦移除边框,只读不编辑,行号与全选保留草稿。 macOS 异步标签导航:点击连接先同步选中标签,数据刷新完成不重新激活页面;侧栏、Overview、历史恢复和表动作复用同一入口。运行 DatabaseWorkspaceLifecycleTests.delayedConnectionLoadPreservesLaterNavigation,以 TestGate 控制成功/失败加载,核对切到文件或 Overview、关闭单个/全部标签和请求开始前关闭后,标签集合和选择不被迟到结果修改,loading 状态正常结束。 macOS Data 变更背景按 Community MutationsColorLayer 解析:修改蓝色、新增绿色、删除使用 DIFF_DELETED,提交失败覆盖为 Islands Notification.errorBackground 红色;当前行深/浅 RGB 各加/减 0x10,取消整行选择后保留当前行高亮,实际选中单元格覆盖选中色。核对编辑、连续新增、删除标记、失败保留草稿、撤销及深浅主题;每条网格线使用 INDENT_GUIDE_COLOR 深/浅 #323438/#E6E6E6 与 1pt 单边绘制,行列无额外空隙,修改/失败/删除不改变边线或文字透明度。DatabaseGridAppearanceTests 保护动态主题解析与透明度。 macOS Data 透明行号栏使用独立 LINE_NUMBERS_COLOR/LINE_NUMBER_ON_CARET_ROW_COLOR;普通行号无表头底板;GridRowHeader 横线与 TableResultRowHeader 右侧竖线保留同一 1pt 网格边线,当前行号变亮,选中单元格所在行的其余普通单元格及当前列标题取 GRID_CURRENT_ROW。核对深浅主题、跨行/列点击、键盘移动、全选取消、失焦、双击编辑和新增草稿,变更色及蓝/灰单元格选择保持原优先级。 macOS SQL 控制台:New Query 为每个查询打开独立顶层 console 标签;Data/SQL 切换复用已打开控制台,历史恢复与表 SQL 动作走相同导航入口。无查询结果时编辑器铺满面板,结果出现后使用共享分隔容器,原生行号栏复用普通编辑器;保留补全、格式化、执行选区、风险确认与历史。MySQL/MariaDB 数据库菜单位于控制台右侧,侧栏不显示额外品牌按钮,切库保留查询 ID 和草稿并清理旧结果。DatabaseWorkspaceLifecycleTests.connectionAndConsoleTabsRestoreDraftsAndCloseIndependently 覆盖多查询、跨连接、后台关闭、切库、关闭当前控制台与全部关闭;延迟加载测试增加切到查询后不得抢回标签的场景。 macOS Console 默认 JetBrains Mono 13pt Regular 与 1.2 行距,字号随编辑器设置;浅色注释真实 Italic,其余 token 保持常规,引号内注释标记不误着色。原生测试核对明暗主题、空白编辑视口扩大后仍覆盖、I-beam、当前行号、草稿回传及字体/段落属性。SQL 只读结果复用 Data 自适应列宽、透明行号、1pt 网格和立即选择/键盘/复制;筛选排序、结构编辑及批量/替换/行详情复用共享按钮、输入、选择器和居中弹窗,核对 Esc/取消/标题关闭不提交。Redis/Nacos 输入与工具栏保留原动作;系统确认及文件选择保留原生。远端 Provider 的实际读写仍须有服务验证,不以组件测试代替。 Console 及 Structure 工具栏统一复用 Database 的 30pt 行高;Console 与共享行号使用 TextKit 1 初始化,保护执行结果分栏及标签重建后无需点击即可首次显示草稿。补全候选的原生 delegate 回归确认 SELECT 前缀,不把系统抢占的 Control-Space 快捷键认定为已完成实机验收。 Mac 本地回归增加重名查询列的布局、原生 Data/Console 重建后的表格草稿及后台刷新快照、行号区与编辑区背景连续性、数据库菜单初始选择状态;数据库切换保留现有 MySQL/MariaDB 后端边界。 Mac Console:无焦点时进入/移动空白编辑区显示 I-beam,离开恢复箭头;首次普通点击末行下方任意位置直接聚焦 EOF,清除旧文字选择,不插入虚拟空行,立即输入追加到最后一行;窗口缩放与查询结果分栏后仍保持整块视口命中。数据库下拉的辅助功能报告当前库名,切库保留查询 ID 和草稿。 Mac Console 文字从内容区原点开始,不叠加容器与行片段的水平留白;明暗主题原生图像回归核对空查询和末尾空行输入前后行号基线不变,当前行背景持续覆盖行号栏;Console 行号按 New UI 的 4pt 空注释区、4pt 前置间距及 14pt 最小占位右对齐,核对单个数字的原生绘制位置,测量使用实际 Console 字体。 Mac Console 点击切行时,原生插入光标与当前行背景同步;stillSelecting 为 true 的单个/多个选区入口回归在选择结束通知之前检查行号及背景,保留原生拖选、键盘、输入法和执行选区行为,只重绘旧、新行及行号区域。 Mac Console 按 Community New UI 将分隔线置于行号栏右边缘前 3pt,1pt 线后保留 2pt 编辑背景,文字容器不重复加 padding;明暗主题原生像素检查验证边线及两点背景。 macOS 审查回归:运行 DatabaseWorkspaceLifecycleTests 的 delayedApplyLocksDraftsAndPreservesNavigation、backgroundConnectionManagementPreservesEditorSelection、removingConnectionClosesOwnedTabsAndFallsBack;以有界延迟控制成功/失败提交,核对在途编辑及重复提交被阻止、A→B 和 A→B→A 不被旧提交刷新、后台保存/刷新不改变编辑器选择,删除连接显式移除数据/查询标签并合法回退。原生交互和实际服务验证单独记录。 Mac Data、只读结果、Console 和行号栏结构背景复用全局 editor 调色板,与项目区保持一致;测试遍历全部配色及明暗外观,Console 与普通编辑器一样关闭文本、滚动视口、容器及行号栏的独立底色;在同一原生窗口逐像素比较最终合成背景与侧栏一致,覆盖深浅外观及编辑、缩放、重绘后的当前行状态。WHERE/ORDER BY 空条件沿 INLINE_PARAMETER_HINT 取深/浅 #858A94/#7A7A7A,有条件使用 SQL keyword 色;实际点击筛选/排序与切换面板后颜色不漂移。 Mac Console 数据库选择器在 SQLite 等单库连接下也可展开,使用共享菜单/hover/22pt 按钮和 16pt schema/箭头;当前库初始选中,MySQL/MariaDB 列出当前连接的其他数据库并复用切库,保留查询 ID 和草稿。SQLite 只显示当前文件库,未开放跨连接切换;核对关闭/Esc/禁用、真实名称和 2pt 内容间隔及左右 4pt 留白。 Mac 异步草稿隔离:运行 delayedPageOnlyClearsItsOwnCurrentDrafts,核对成功/失败分页在切表、切连接及后续分页替代后不清空新页面草稿;运行 delayedApplyLocksDraftsAndPreservesNavigation 的 otherConnection 场景,核对后台提交不阻止新连接加载和编辑,旧提交结束不清理新连接草稿,模块仍追踪后台在途写入。 Mac 查询呈现:运行 queryOutputTracksStatementsSelectionAndFailures 与 WorkbenchModuleUIRegistryTests,核对底部 Services/Output、逐语句真实时间/行数/错误、Unicode 与重复语句选区、错误历史、清空日志保留结果,以及执行前按 SQL 子句格式化(保留词大小写,SELECT 内容另起一行并缩进 4 格,FROM 跟随投影)、有原生范围时只改选区并保留重复 SQL、引用及运算符;深浅主题实际打开连接标题的历史窗口,检查 Close/Paste/Esc、只读预览、错误条关闭和 Services 页签切换。SQL 编辑区、历史预览和 Output 共用语法高亮器;querySyntaxColorsProtectQuotedIdentifiersAndLiterals 在明暗主题核对关键词与运算符、指数数字、转义字符串、美元引用、引用标识符和注释,SQL 本文保持不变。原生像素回归核对首列语句左侧 1pt 绿框可见,绘制遵循 BOXED 零外扩并避开 AppKit 裁剪边缘;同窗原生色块校准 HDR 映射,保留确切色值及严格色差断言。格式化后的末尾光标仍位于 EOF。executionMarkersFollowUnchangedStatementsAndExposeStripePositions 核对成功对号、失败图标、右侧 14×2pt 状态条、短文本不拉伸和长文本压缩、Unicode 前置编辑移动范围与语句编辑清除状态;queryCompletionKeepsOnlyUnchangedExecutionMarkers 用 TestGate 控制查询完成,核对在途追加保留状态及修改已执行语句不显示旧标记。右侧标记点击定位,普通滚动和滑块拖动保留共享 CompactScroller;原生明暗主题另验收。共享输出 Copy 复用统一按钮,常态无背景和边框、hover 使用共享圆角底色,禁用只衰减一次,复制内容仍为无 ANSI 的原始输出。Copy 作为原生滚动视图内的真实 NSHostingView 子视图优先命中,仍用共享 SwiftUI 按钮样式;正文排除按钮的 cursor rect,按钮及下层移动事件均保持箭头;copyExcludesNativeTextHitsAndCursorRectsAcrossResize 在深浅主题检查图标、文字、内边距、缩放后命中、文本矩形完整覆盖正文,以及下层 cursorUpdate 事件恢复箭头。回归检查整棵 NSHostingView 视图树命中到真实按钮宿主,覆盖窗口缩放和图标/文字/留白;完整应用 hover 单独检查。multilineStatementOutlineEndsAtFinalLineInsteadOfWidestLine 核对四行 SQL 的绿框在最后一行收窄到实际终点,原生像素验证收窄边线和原最大 X 处背景;沿 Community EditorPainter.paintBorderEffect,保留绿色 token 和 1pt 描边。 审查修复回归:databaseSQLFormatterLeavesSessionDependentEscapesVerbatim 核对 SQLite 普通字符串、E 转义字符串及写入语句含反斜杠时完全保留原文;formattedMiddleSelectionKeepsTheWholeStatement 核对 Unicode 前缀后的中间选区、全选和 EOF 格式化映射;delayedApplyLocksDraftsAndPreservesNavigation 增加 returnToConnection 的成功/失败场景,核对提交结束后补刷并结束 loading、不影响其他连接。真实窗口核对从旧 Console 切到新 Console 后 History Paste 不沿用旧范围。 SQL History 列表与预览之间的分隔条使用现有 highlightsOnHover=false,深浅主题核对 hover、按下及拖动颜色保持常态,同时保留调整光标和宽度拖动。 databaseSQLScannersPreserveCombiningMarksInsideLiterals 覆盖 U+0301/U+FE0F 开头、双引号转义及字面量内分号/危险关键词;格式化保持原值、拆分仍为一条查询。formattedMiddleSelectionKeepsTheWholeStatement 同时覆盖单条替换和整段多语句格式化,选区不包含其他语句,EOF/全选仍正确。databaseTextAndCopyIgnoreLateEventsOverDivider 验证正文、可编辑 Console、只读 History 及 Copy 的延迟 tracking 事件不覆盖真实分隔条光标,移出窗口后不修改光标;正常正文和按钮仍提供各自光标。Copy 的深浅主题实际宿主测试覆盖翻转坐标与缩放。 后台连接保存回归:backgroundSavePreservesCurrentLoading 使用 TestGate 覆盖当前连接空闲、刷新表、打开表及分页,与后台保存成功/失败的两种完成顺序;后台保存不能设置或清除当前页面 Loading,连接弹窗独立显示连接中并防止重复提交。 P1 并发回归:sidebarTableSelectionDuringApplyLoadsLastSelection 经真实 AppModel 入口覆盖提交期间 A→B、A→B→A 与成功/失败,断言旧页清空、最终表数据正确及 Loading 结束;sqlExecutionLockSurvivesConnectionNavigation 覆盖 INSERT/查询、成功/失败及完成前/后返回原连接,验证跨连接 SQL 执行锁、模块忙闲、禁止重复 Run 与完成后释放。 草稿快照与持久日志回归:reselectingFilteredTableDiscardsDraftsBeforeReplacingKeys 覆盖过滤/排序后编辑、重选同表成功/失败,保证旧行索引草稿不再向新快照主键提交;sqlExecutionLockSurvivesConnectionNavigation 重读原连接的持久 History、Execution Events、Audit,覆盖后台成功/失败及部分批次中断,保留实际影响行数且不回填其他连接 UI。 连接目录的多库独立展开与树单选,见 database-multi-schema-tree 能力记录。 macOS 连接和文件夹右键 Move/To Folder:无分组直接输入,已有分组选择目的地、新建后自动移入或移回根层;QA/Quick 创建嵌套路径,验证循环/重名/过期目标不会产生部分变更。名称弹窗与项目新建文件共用 LitheNamePopup,检查 Enter、Esc、错误提示和深浅主题。 macOS 密码保存:新建用户名为空,仅提供直到重启和永久两种范围;验证临时密码不落盘、跨模块实例可读、范围转换先成功更新存储再发布值、写入/删除失败保留旧密码、旧配置缺少范围字段默认永久。测试结果 Copy 点击后关闭、悬停手形。Windows 此保存范围选项未同步,保持 pending。 新连接 Name 默认采用数据库@主机、未填数据库时为@主机,SQLite 使用文件名;手动改名和已有连接名称不被联动覆盖,URI 密码和查询参数不进入名称。 Windows:数据库后端从未接入(backend-capabilities 的 database 为 false,前端调用的数据库命令没有原生实现),工具菜单入口禁用;.db、.sqlite、.duckdb 文件按普通二进制或文本打开,不进入数据库查看器。" } diff --git a/shared/platform-feature-matrix/features/database-crud-export.json b/shared/platform-feature-matrix/features/database-crud-export.json index 7eebc6e0a..1393d6fba 100644 --- a/shared/platform-feature-matrix/features/database-crud-export.json +++ b/shared/platform-feature-matrix/features/database-crud-export.json @@ -15,10 +15,10 @@ }, "windows": { "evidence": [ - "windows/tauri/src/features/database" + "windows/tauri/src/config/backend-capabilities.ts" ], - "implementationStatus": "implemented", - "verificationStatus": "pending" + "implementationStatus": "missing", + "verificationStatus": "not-applicable" }, "owner": "Database", "verification": "验证新增、编辑、删除、事务失败、复制和结果导出。 macOS 中文界面使用同时包含 Name、名称、Type 列的表,检查筛选、排序、批量更新和替换的列名保持原样;替换的 All columns 固定选项保留本地化,选择列后只修改对应列。 macOS 未选表/未选连接时,数据区使用共享 StatusText 操作提示,无大图标或重复标题;结构页同样使用共享提示,检查深浅主题。" diff --git a/shared/platform-feature-matrix/features/database-query-history.json b/shared/platform-feature-matrix/features/database-query-history.json index f029df9d8..892850cd7 100644 --- a/shared/platform-feature-matrix/features/database-query-history.json +++ b/shared/platform-feature-matrix/features/database-query-history.json @@ -12,10 +12,10 @@ }, "windows": { "evidence": [ - "windows/tauri/src/features/database" + "windows/tauri/src/config/backend-capabilities.ts" ], - "implementationStatus": "implemented", - "verificationStatus": "pending" + "implementationStatus": "missing", + "verificationStatus": "not-applicable" }, "owner": "Database", "verification": "执行查询、取消查询、查看 SQL 历史和分页结果,确认长结果不阻塞界面。" diff --git a/shared/platform-feature-matrix/features/database-schema.json b/shared/platform-feature-matrix/features/database-schema.json index 9c60a5daa..0f09c024e 100644 --- a/shared/platform-feature-matrix/features/database-schema.json +++ b/shared/platform-feature-matrix/features/database-schema.json @@ -12,10 +12,10 @@ }, "windows": { "evidence": [ - "windows/tauri/src/features/database" + "windows/tauri/src/config/backend-capabilities.ts" ], - "implementationStatus": "implemented", - "verificationStatus": "pending" + "implementationStatus": "missing", + "verificationStatus": "not-applicable" }, "owner": "Database", "verification": "展开数据库、Schema、表和列,验证刷新、筛选和空结果展示。" diff --git a/windows/tauri/src/features/file-system/controllers/file-utils.ts b/windows/tauri/src/features/file-system/controllers/file-utils.ts index 9213ff54b..c15bc28ad 100644 --- a/windows/tauri/src/features/file-system/controllers/file-utils.ts +++ b/windows/tauri/src/features/file-system/controllers/file-utils.ts @@ -1,3 +1,4 @@ +import { isBackendCapabilityAvailable } from "@/config/backend-capabilities"; import type { DatabaseType } from "@/features/database/types/provider.types"; import { getLanguageIdFromPath } from "@/features/editor/utils/language-id"; import { getBaseName } from "@/utils/path-helpers"; @@ -21,9 +22,13 @@ const isDuckDBFile = (path: string): boolean => { }; /** - * Get the database type from a file path, or null if not a database file + * Get the database viewer type for a file path, or null when the file should + * open through the generic text/binary path. The viewer needs the database + * backend; while that capability is unavailable, `.db` and similar files are + * not routed into a viewer whose every request is rejected. */ export const getDatabaseTypeFromPath = (path: string): DatabaseType | null => { + if (!isBackendCapabilityAvailable("database")) return null; if (isSQLiteFile(path)) return "sqlite"; if (isDuckDBFile(path)) return "duckdb"; return null; diff --git a/windows/tauri/src/features/file-system/controllers/workspace-session-restore.test.ts b/windows/tauri/src/features/file-system/controllers/workspace-session-restore.test.ts index c38f6db72..3c721ddaa 100644 --- a/windows/tauri/src/features/file-system/controllers/workspace-session-restore.test.ts +++ b/windows/tauri/src/features/file-system/controllers/workspace-session-restore.test.ts @@ -425,6 +425,18 @@ describe("shared open and restore content routing", () => { expect(await loadFileContent("app.java")).toEqual({ kind: "binary" }); }); + test("database files use the generic path while the database backend is unavailable", async () => { + classifyText.mockResolvedValue({ isPlainText: false }); + readFileContent.mockResolvedValue("SQLite format 3\0"); + for (const path of ["cache.db", "app.sqlite", "app.sqlite3", "warehouse.duckdb"]) { + expect(await loadFileContent(path)).toEqual({ kind: "binary" }); + } + + classifyText.mockResolvedValue({ isPlainText: true }); + readFileContent.mockResolvedValue("key=value\n"); + expect(await loadFileContent("settings.db")).toMatchObject({ kind: "text", content: "key=value\n" }); + }); + test("read errors are not disguised as binary files", async () => { readFileContent.mockRejectedValue(new Error("permission denied")); await expect(loadFileContent("app.properties")).rejects.toThrow("permission denied");