diff --git a/docs/02-requirements.md b/docs/02-requirements.md index b8fdbad..2632871 100644 --- a/docs/02-requirements.md +++ b/docs/02-requirements.md @@ -25,6 +25,7 @@ | BR-021 | 设置中的 Chrome 与 Edge 可执行文件路径必须支持 Windows 原生 `.exe` 文件选择;标准安装路径搜索必须在对应字段旁可感知地报告搜索、取消、确认当前路径、更新路径或失败,且不丢失已有输入。 | P1 | | BR-022 | 删除实例确认框默认只删除 Chub 实例配置;用户可显式、默认未勾选地选择同时删除该实例的 User Data Dir。数据删除必须在后台重新确认目标目录未被 Chub 或外部浏览器占用,并通过绝对路径、非卷根及非链接边界校验;失败时保留实例配置和目录。 | P1 | | BR-023 | 默认 User Data Dir 与日志目录以实际 `chub.exe` 所在的程序目录为基准,分别解析为 `user_data_dirs` 与 `logs`;新建实例名称必须唯一,且默认 profile 子目录须由安全化名称与稳定 ID 组成。 | P1 | +| BR-024 | 实例列表的数据行最小高度为现有标准行的 200%,以提高多列信息、行选择和启动/编辑/删除操作在鼠标与触控下的可辨识性;不得改变列、操作顺序、键盘语义或虚拟滚动。 | P1 | ## 验收标准 @@ -59,6 +60,7 @@ - “程序目录”始终指实际 `chub.exe` 的父目录,不能使用快捷方式、终端或服务改变的当前工作目录。设置页默认以“跟随程序目录”模式展示 `\\user_data_dirs` 与 `\\logs`;用户选择自定义绝对目录后仅影响后续新建实例或后续日志写入,已有实例目录绝不自动移动。旧配置中的空值或历史内置默认迁移为跟随程序目录,其他非空值保留为自定义目录。 - 创建和编辑实例均要求名称去首尾空白后在 Windows 不区分大小写语义下唯一;重复名称在名称字段旁提示“实例名称已存在,请更换”,不清除输入。创建时默认目录为 `\\instance-<安全化名称>-<短稳定 ID>`;安全化必须拒绝或替换 Windows 非法字符、保留设备名、尾部空格/句点和路径过长,安全化后冲突也必须拒绝。实例改名不得重命名、复制或删除既有 User Data Dir。 - 浏览器启动前必须在后台创建并验证目标 User Data Dir 的可写性;目录创建、权限、路径或长度失败时不得启动浏览器,并给出不含敏感信息的可恢复错误。日志目录同样在后台验证;无法写入时保留设置输入并提示用户改为可写目录,不能静默改用当前工作目录或泄露代理、Cookie、Token。 +- 实例列表每条数据行在 100% 缩放下的最小高度为当前标准行高度的两倍;在 200% 缩放、长中文路径或状态文本下可继续向下扩展而不裁切。表头与行间距、列宽、行内操作顺序及单击/双击/Enter 的既有语义不变。 ## 不做 diff --git a/docs/06-tasks.md b/docs/06-tasks.md index a96749e..8b7fb7e 100644 --- a/docs/06-tasks.md +++ b/docs/06-tasks.md @@ -58,6 +58,7 @@ | T-405 | 设置浏览器 executable 选择与可感知搜索反馈 | T-205,T-206,T-207 | DONE | | T-406 | 实例删除确认中的 User Data Dir 显式删除 | T-301,T-303,T-305 | DONE | | T-407 | 便携默认目录、实例名称唯一与启动目录预检 | T-403,T-404,T-405 | DONE | +| T-408 | 实例列表数据行 200% 高度与可访问密度 | T-208,T-306,T-310 | DOING | ## Backlog diff --git a/docs/07-user-stories.md b/docs/07-user-stories.md index 932b788..06c291d 100644 --- a/docs/07-user-stories.md +++ b/docs/07-user-stories.md @@ -20,6 +20,7 @@ | US-016 | 用户可以从设置页选择 Chrome 或 Edge 的本机可执行文件,或搜索标准安装位置,并立即知道当前路径是否已确认或被更新。 | P1 | | US-017 | 用户删除实例时默认只移除配置;在浏览器已停止且明确勾选后,可以同时删除该实例的 User Data Dir。 | P1 | | US-018 | 用户可让新实例数据与日志默认跟随 chub.exe 所在目录,并通过唯一实例名称获得可读、独立且可写的默认 User Data Dir。 | P1 | +| US-019 | 用户可以在实例列表中更清楚地阅读每条实例记录,并更稳妥地点击启动、编辑或删除操作,而不会改变既有快捷键和行操作规则。 | P1 | ## 验收场景 diff --git a/docs/08-interaction-checklist.md b/docs/08-interaction-checklist.md index bae90b0..e0d8ec8 100644 --- a/docs/08-interaction-checklist.md +++ b/docs/08-interaction-checklist.md @@ -20,6 +20,7 @@ | IX-016 | 设置浏览器 executable 路径 | Chrome/Edge 选择本机 `.exe`、搜索标准安装位置与取消 | 选择中、用户取消、选择失败、非法结果、搜索中、取消、路径更新、确认当前路径、未找到、切换页面 | P1 | | IX-017 | 实例删除及数据删除 | 删除配置确认、显式勾选 User Data Dir、后台占用复核和文件删除 | 默认配置删除、已勾选、运行/外部禁用、删除中、用户取消、占用、路径拒绝、权限/I/O 失败、成功、迟到结果 | P1 | | IX-018 | 便携目录与实例名称 | 程序目录默认模式、自定义目录、实例名称唯一与默认 profile 名称 | 初始默认、自定义、恢复默认、复制 exe、重名、非法/超长名称、安全化冲突、创建目录/日志目录权限失败、编辑改名 | P1 | +| IX-019 | 实例列表行密度 | 数据行 200% 最小高度、行内文本与操作垂直居中 | 0/1/多行、长路径、长状态、窄窗口、100%–200% 缩放、鼠标、键盘与触控 | P1 | ## 通用规则 @@ -44,3 +45,4 @@ - 浏览器 executable 路径的“选择”和“搜索”是字段级异步操作:选择中禁止同一字段重复打开,搜索中按钮显示“取消”。每个结果都紧邻其 Chrome/Edge 路径字段显示,不能只写到需滚动才能看见的页面底部。用户取消、系统错误、空结果或不为绝对 `.exe` 的结果均保留原输入;搜索命中当前值时显示明确确认而不是静默完成。两个字段、页面切换和迟到结果彼此隔离;键盘与触控均可触发“选择”和“搜索/取消”。本次是既有控件的局部行为修复,不新增信息架构或视觉模式,因此无需改动 HTML 原型;须以真实 Windows 文件对话框 smoke 验收。 - 实例删除确认框默认焦点在“取消”,Escape/关闭与取消同效。默认“删除实例”只删除配置,并明确 User Data Dir 保留;“同时删除 User Data Dir 中的数据”是默认未选中的业务复选框,不与行选择混淆。勾选后显示完整目录和不可恢复警告,确认按钮使用具体“删除实例及数据”文案;仅“已退出”/“启动失败”可勾选,其他状态禁用且说明原因。数据删除中弹层保持、背景不可用且不提供伪取消;结果通过实例 ID、目录快照和请求代次过滤。成功后焦点回到可预测的相邻实例操作;检查、占用、边界、权限或 I/O 失败时保留当前实例、勾选和弹层,并说明目录与配置均未删除、可先停止浏览器或检查权限后重试。 - 设置页的“默认 User Data Dir”和“日志目录”默认显示“跟随程序目录(chub.exe 所在目录)”解析后的绝对路径,不能称为或使用当前工作目录;每项提供“选择目录”和“恢复程序目录默认”。自定义目录不会移动已有 profile。新建与编辑名称在提交时就地校验:去首尾空白、大小写无关重复、安全化后目录冲突、Windows 非法/保留/超长名称均定位到名称字段,保留用户输入;成功创建的默认目录使用 `instance-<安全化名称>-<短ID>`,改名不改目录。目录创建/写入预检在后台,提交中禁用重复操作;失败时不启动浏览器、保留表单和路径,并给出“选择可写目录”的恢复路径。验证键盘、中文输入法、200% 缩放、长中文名称、只读程序目录和复制 exe 后的 portable/default-custom 切换。 +- 实例列表数据行保持两倍标准最小高度并让文字、状态与行内操作在行内垂直居中。该最小高度随 DPI 缩放;长路径、长中文实例名或状态可向下扩展,不能裁切或挤压启动、编辑、删除的命中区。行内控件先消费事件,单击、双击、Enter、F5、删除确认和焦点恢复的既有规则不变;无需 HTML 原型,因为不新增导航、控件、状态或信息架构。 diff --git a/docs/current-state.md b/docs/current-state.md index 9734ab3..a062fe1 100644 --- a/docs/current-state.md +++ b/docs/current-state.md @@ -3,7 +3,7 @@ ## 快照 - 日期:2026-07-27 -- 阶段:Phase 4 CDP 只读观察与后台入口(T-301 至 T-310、T-201 至 T-208、T-401、T-403 至 T-407 已完成;T-402 已规划) +- 阶段:Phase 4 CDP 只读观察与后台入口(T-301 至 T-310、T-201 至 T-208、T-401、T-403 至 T-407 已完成;T-402 已规划;T-408 进行中) - 代码:已建立 Go module `chub`、`cmd/chub` 入口、结构化文件日志、浏览器 domain/application 合约、Chrome/Edge 参数/发现模块、启动 registry、Windows 身份/占用检查、loopback CDP 端口分配与端点校验、受限 CDP 目标读取、exe 同级 JSON 配置与 legacy 安全迁移、优雅关闭、Job Object、真实 Chrome/Edge smoke、启动恢复、CLI JSON 合约、应用内事件总线、UI 状态测试和 Windows smoke 脚本,T-001 至 T-003、T-101 至 T-104、T-201 至 T-208、T-301 至 T-310、T-401、T-403 至 T-407 已完成 - UI:Gio 双页 Shell 使用左侧“实例/设置”导航;实例页以等宽“新建实例 / 刷新实例状态”命令区开始,窄内容区自动堆叠。列表固定显示实例名称、浏览器类型、用户数据目录、代理名称、调试端口、状态和带边框的操作列;代理列只由稳定 `ProxyID` 解析当前名称(无代理时显示“无代理”),长名称省略且不挤压操作列。端口列在未启动/已退出时显示“建议 {端口}”、启动中显示“准备 {端口}”、托管运行显示“实际 {端口}”、外部关联显示“外部 {端口}”,避免将持久首选端口误作监听事实。新建表单从设置的起始端口推荐最低未冲突端口,并基于设置的默认目录预填 `instance-<安全实例名>-<短 ID>`;portable 默认目录始终跟随实际 exe 同级 `user_data_dirs`,自定义目录只影响后续新建实例。实例名称会在保存前按 Windows 规则校验,并以大小写无关方式保持唯一;改名不会移动已有 profile。编辑停止实例可修改首选端口;启动后台会先创建并验证指定 User Data Dir 可写,再优先该端口并避开其他实例的首选/实际端口,成功回退后才保存新的首选值。操作顺序固定为启动/停止(或重新检测)、编辑、删除,删除与相邻操作保持更大间距以降低误点。主操作在已退出时启动,在 Chub 托管运行或调试不可用时显示停止,在启动/停止中禁用,在外部关联、外部占用或未知占用时仅重新检测;优雅停止通过后台 adapter 验证 registry 的 PID/profile 身份并等待其释放,绝不按进程名关闭或接管外部 Chrome/Edge。刷新通过后台回调只检查已保存实例,以配置快照丢弃编辑或删除后的过期结果;它结合 Chub registry、指定 profile 的外部占用证据和 loopback CDP 端点更新状态,但不扫描、接管或关闭其他 Chrome/Edge。双击、Enter 或编辑图标打开实例编辑弹层,支持名称、浏览器类型、User Data Dir、启动 URL、首选端口、以“名称 · 地址”显示的代理选择和只读实际端口;保存保留未公开启动选项,Escape 对脏表单先请求确认,活跃/外部关联实例锁定身份约束字段。设置页使用完整代理地址选择器、代理名称与地址输入及保存/删除操作;选择会回填名称和地址,保存按稳定 `proxyId` 新增或更新并校验名称/地址唯一性,删除未引用代理前必须确认,仍被实例引用的代理会被拒绝。设置页的默认 User Data Dir 与日志目录显示 portable/custom 来源,可通过原生选择器改为自定义路径或恢复为程序目录默认;日志目录在后台探测成功后写入 `chub.log`,不会回退 cwd。新建、编辑和删除实例会保存到本地配置;四个设置路径有独立异步可取消搜索,切换页面后输入和任务状态保留;设置页 Chrome/Edge 路径已接入后台 Windows 原生 `.exe` 选择器,选择和搜索结果始终显示在对应字段旁;命中已填路径会明确确认而非静默完成。新建实例表单使用 Label、Windows 原生目录选择器和 Chrome/Edge RadioButton;CLI `list/events` 已可用,`start/stop/restart` 等待 BrowserManager adapter - T-307:本应用会话启动的受管 Chrome/Edge 根进程由单实例后台 `Wait` 监控;意外退出按 ID、启动代次和 PID 验证后立即变为“已退出”,清空运行时 PID/端口,并以可关闭、可合并的提示告知用户。提示关闭后焦点回到启动操作;Chub 请求停止、外部实例、过期事件和应用关闭取消监控均不提示。 @@ -18,7 +18,8 @@ - T-405:已完成 Windows `OpenFileDialog` executable picker、Chrome/Edge 后台结果通道与字段级状态反馈。搜索同路径时明确确认当前路径可用;选择取消或错误保留输入,选择成功只更新目标字段。已通过单元测试、竞态检测、vet、无控制台打包,以及真实原生对话框取消/预选 Chrome `.exe` 返回 smoke。 - T-406:已完成实例删除确认中的 User Data Dir 显式删除。默认仅删除配置;数据删除必须显式勾选且只对已退出/启动失败实例开放。后台在删除前复核 Chub/external profile 占用,目录删除拒绝不安全路径、卷根、文件、链接和 Windows 重解析点;失败与过期结果均保留配置和目录。 - T-407:已完成 portable/custom 默认目录来源持久化、实际 exe 同级 `user_data_dirs`/`logs` 解析、历史内置目录迁移、目录选择和恢复默认操作。新实例默认 profile 为安全化名称加短 ID,名称按 Windows 规则和大小写无关方式校验;启动前后台创建并探测 User Data Dir,失败时不启动浏览器。日志目录在后台验证后写入 `chub.log`,不会退回 cwd。已通过单元测试、竞态检测、vet 与无控制台 GUI 打包。 -- blocker:无;下一任务为 T-402。 +- T-408:进行中。将实例列表数据行提升为标准高度的 200%,保留表头、列权重、虚拟滚动及所有行/键盘操作语义。 +- blocker:无;当前任务为 T-408,随后恢复 T-402。 ## 当前目录 diff --git a/docs/tasks/T-408.md b/docs/tasks/T-408.md new file mode 100644 index 0000000..b2cf810 --- /dev/null +++ b/docs/tasks/T-408.md @@ -0,0 +1,34 @@ +--- +id: T-408 +title: 实例列表数据行 200% 高度与可访问密度 +phase: 4 +deps: [T-208, T-306, T-310] +status: DOING +created: 2026-07-28 +owner: codex +--- + +## 需求与背景 + +实例列表当前以行内图标的自然高度决定数据行高度,长路径、状态文字和多个行操作在高 DPI、触控或快速点击时显得过于紧凑。用户要求将实例列表数据行高度增加到当前标准行的 200%。 + +## 方案与边界 + +- 将实例列表数据行的自然最小高度从当前 30 dp 提升为 60 dp(200%);高度使用 Gio `unit.Dp`,因此继续遵循 Windows DPI 缩放。 +- 只设置数据行的最小高度,并使既有文本、状态和操作区保持垂直居中;内容在 200% 缩放、中文长文本或未来更高控件时可自然扩展,禁止以固定最大高度裁切。 +- 保留现有表头、列权重、行间距、列表虚拟化、行选择、双击/Enter 编辑,以及启动、编辑、删除按钮的顺序、标签、焦点和命中优先级。行内操作不冒泡为行操作。 +- 使用命名布局常量和单元测试锁定“标准高度 × 2”的契约,避免未来图标尺寸变动意外缩小行高。 +- 这是局部密度与可访问性调整,不新增信息架构、状态或可操作控件;因此无需修改已确认 HTML 原型。 + +## 验收要点 + +- 自动化:验证数据行最小高度为标准行高度的两倍,且现有列权重与操作布局契约不变。`go test ./internal/ui`、`go test ./...`、`go vet ./...`、`cmd /c build.bat` 通过。 +- Windows smoke:在 100% 与 200% 缩放、窄窗口和长中文路径下,数据行高度明显为原标准行的两倍或可继续扩展;文本、状态、启动/编辑/删除图标垂直居中且可点击,滚动、双击、Enter、F5 和删除确认行为不变。 +- 无障碍:启动、编辑、删除图标仍有不重叠的可见可用命中区;键盘焦点、选中行背景和长文本不依赖颜色或裁切传达信息。 + +## 执行记录 + +- 状态:DOING +- 变更:已定义高度、保持虚拟化和输入语义的实现边界;待提交文档后实现。 +- 验证:待执行。 +- 阻塞:无。