Files
cdp_hub/docs/tasks/T-407.md
T

36 lines
3.9 KiB
Markdown

---
id: T-407
title: 便携默认目录、实例名称唯一与启动目录预检
phase: 4
deps: [T-403, T-404, T-405]
status: DOING
created: 2026-07-27
owner: codex
---
## 需求与背景
复制 `chub.exe` 后,设置默认目录与新建实例默认 profile 必须跟随实际程序位置,而非快捷方式或终端当前工作目录。当前新建默认路径使用稳定 ID,缺少用户可读名称、名称唯一约束和启动前目录可写预检;程序目录受保护时 Edge/Chrome 可能在创建 profile 后立即退出,用户只能看到泛化退出提示。
## 方案与边界
- 定义“程序目录”为 `filepath.Dir(os.Executable())`。portable 默认 User Data Dir 与日志目录分别为 `<exe-dir>\\user_data_dirs`、`<exe-dir>\\logs`;不得使用 `os.Getwd()`。设置为每个目录持久化 portable/custom 来源:portable 随实际 exe 在下次启动重新解析,custom 为用户显式选择的绝对路径。旧空值及历史内置默认迁移 portable,其他非空值保留 custom;不移动既有实例目录或日志文件。
- 设置页路径字段展示实际解析路径与“跟随程序目录”说明,保留目录选择,并增加“恢复程序目录默认”。修改默认 User Data Dir 只影响后续新建实例;修改日志目录只影响后续日志写入。UI 不执行目录 I/O。
- 新建/编辑实例在提交时检查名称:去首尾空白,Windows 大小写无关唯一,并在安全化目录名后再检查冲突。重复或无效名称显示字段级“实例名称已存在,请更换”或对应修复说明,保留输入并聚焦名称。配置存储同样复核,防御手工 JSON 或并发写入。
- 新实例先分配稳定 ID;默认目录为 `<default-dir>\\instance-<safe-name>-<short-id>`。安全化处理 Windows 非法字符、保留设备名、尾部空格/句点与最大路径长度;编辑改名绝不重命名或复制现有 profile。用户仍可在停止实例时选择其他绝对目录。
- `InstanceDataPreparer` 在后台启动 adapter 中创建目标目录并验证可写;失败时不调用浏览器 launcher,返回稳定且无敏感信息的错误,UI 保留实例设置并给出“选择可写目录”的恢复提示。日志目录同样由后台/启动协调层创建与验证;不允许静默回退到当前工作目录。
- 本任务不实现目录迁移、已有实例 profile 重命名、按名称接管外部浏览器、全盘目录扫描或目录权限提升;不记录代理、Cookie、Token 或认证信息。
## 验收要点
- 自动化:覆盖 portable/custom 目录解析、历史设置迁移、实际 exe 目录而非 cwd、默认实例目录安全化/稳定 ID、Windows 保留名/非法字符/尾部句点/长路径、名称大小写重复和安全化冲突、编辑排除自身、config 边界重复拒绝、后台目录创建/不可写/取消与启动前拒绝。`go test ./...`、`go test -race ./cmd/chub ./internal/ui ./internal/platform/config ./internal/platform/files`、`go vet ./...`、`cmd /c build.bat` 通过。
- Windows smoke:将 exe 放入可写临时目录后,设置默认路径显示该 exe 同级 `user_data_dirs`/`logs`;快捷方式不同工作目录不改变结果。新建“审核 Edge”生成可读且独立的目录;重名、非法名称和受保护目录均在启动前给出可恢复提示,且 Edge/Chrome 不会被拉起。改名不移动既有 profile;选择自定义目录后仅新建实例使用它。
- 交互与无障碍:字段 Label、帮助、错误和恢复操作可用 Tab、Space/Enter 完成;错误不只用颜色,提交失败保留表单和输入法状态。窄窗口、200% 缩放、长中文名称、高对比度和浅/深色下路径与按钮重排可读。
## 执行记录
- 状态:DOING
- 变更:已完成需求、架构、API、用户故事、交互清单和原型验收场景定义;待提交文档后实现。
- 验证:待执行。
- 阻塞:无。