From 206794f78c942aabc9b4b9383a134d166df08f66 Mon Sep 17 00:00:00 2001 From: QiuSW <105186638@qq.com> Date: Mon, 27 Jul 2026 11:25:59 +0800 Subject: [PATCH] docs: define portable config migration --- .gitignore | 4 +++- docs/02-requirements.md | 4 +++- docs/04-architecture.md | 2 ++ docs/06-tasks.md | 3 ++- docs/07-user-stories.md | 5 +++++ docs/08-interaction-checklist.md | 2 ++ docs/api.md | 10 +++++++++ docs/current-state.md | 5 +++-- docs/tasks/T-403.md | 36 ++++++++++++++++++++++++++++++++ 9 files changed, 66 insertions(+), 5 deletions(-) create mode 100644 docs/tasks/T-403.md diff --git a/.gitignore b/.gitignore index eb6176a..d38e6d0 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,8 @@ dist/ *.log *.db *.db-* +/config.json +/config.json.bak +/.config-*.tmp .vscode/ .idea/ - diff --git a/docs/02-requirements.md b/docs/02-requirements.md index df8fd70..7ee4df4 100644 --- a/docs/02-requirements.md +++ b/docs/02-requirements.md @@ -20,6 +20,7 @@ | BR-016 | 每个已保存实例有独立、持久化的首选远程调试端口;它与运行时实际端口分离,未启动实例仍可在列表看到建议端口。 | P1 | | BR-017 | 用户可以仅通过已验证的 loopback CDP 端点查看 Chub 实例的页面目标(标签页)标题、脱敏 URL 和类型;该功能不得控制页面、关闭标签页或接管外部浏览器。 | P1 | | BR-018 | Chub 运行时提供一个 Windows 通知区域图标,允许显示主窗口、刷新已保存实例状态和显式退出应用;图标及菜单不得绕过实例授权边界或泄露实例路径、URL、代理等敏感信息。 | P1 | +| BR-019 | Chub 默认将本地 `config.json` 保存到正在执行的 `chub.exe` 同级目录;首次使用新位置时安全迁移旧 `%APPDATA%\\chub\\config.json`,新位置既有配置永不被旧配置覆盖。 | P1 | ## 验收标准 @@ -46,7 +47,8 @@ - 页面目标列表只显示标题、类型和移除 userinfo、query、fragment 的 URL;不得保存、记录、发布或展示 CDP WebSocket URL,也不得发送导航、关闭、创建或脚本执行命令。 - 通知区域仅显示一个 Chub 图标;Tooltip 仅含非敏感汇总状态。双击或默认菜单项显示并置前主窗口,刷新命令仍只检查已保存实例,退出命令走明确的应用退出协调流程。 - 图标创建失败、Explorer 重启、菜单关闭和应用退出不会阻塞 UI 帧,也不会导致浏览器启动、关闭、接管或按进程名枚举。退出时必须移除图标;外部 Chrome/Edge 永远不因通知区域命令被停止。 +- 默认配置路径必须由实际可执行文件路径解析,而非当前工作目录;迁移只在新位置不存在且旧配置存在、可读取、可校验时执行。迁移使用现有原子写入并保留旧配置恢复备份;目标目录不可写或旧配置畸形时,不创建半成品配置、不静默回退或混合两个配置来源,并给出可恢复诊断。 ## 不做 -全局杀 Chrome/Edge、自动登录、页面操作、验证码处理、平台 API 集成、远程控制和跨用户权限提升;通过 CDP 管理或关闭外部实例。首个 CDP 查看版本不提供物理窗口 ID 或分组,后续仅在经过独立安全评审的 WebSocket CDP 任务中考虑。首个通知区域版本不改变窗口关闭语义、不把关闭按钮隐藏到通知区域,也不在菜单中直接启动、停止、重启或删除实例。 +全局杀 Chrome/Edge、自动登录、页面操作、验证码处理、平台 API 集成、远程控制和跨用户权限提升;通过 CDP 管理或关闭外部实例。首个 CDP 查看版本不提供物理窗口 ID 或分组,后续仅在经过独立安全评审的 WebSocket CDP 任务中考虑。首个通知区域版本不改变窗口关闭语义、不把关闭按钮隐藏到通知区域,也不在菜单中直接启动、停止、重启或删除实例。首个便携配置版本不提供 UI 路径选择、自动合并多个 `config.json`、网络同步或安装版的 AppData 回退;可配置路径参数另行评审。 diff --git a/docs/04-architecture.md b/docs/04-architecture.md index 7deb83b..c53dbc6 100644 --- a/docs/04-architecture.md +++ b/docs/04-architecture.md @@ -16,6 +16,7 @@ Platform Windows ├─ loopback CDP target reader (read-only `/json/list`) ├─ remote-debug port allocator ├─ instance status refresher + ├─ portable config path resolver / legacy migrator └─ notification-area adapter (Windows Shell) ↓ Chrome / Edge processes @@ -46,6 +47,7 @@ UI/CLI 不直接操作 `exec.Cmd`、Win32 handle 或数据库。Application 层 - 受管退出监控:仅为当前会话由 Chub 启动并获得进程句柄的实例建立一个 `Wait` 监控任务。退出事件携带实例 ID、启动代次和 PID,UI 仅在三者仍匹配且当前未处于 Chub 请求的停止中时,将运行时状态改为“已退出”并排队显示提示;过期事件、外部实例和应用退出后的监控取消均不得生成意外退出提示。 - CDP 页面目标查看:UI 仅将当前已保存实例快照交给后台 adapter;adapter 只接受“运行中”或“外部已关联”的有效实际端口,先复核对应 browser kind 的 loopback `/json/version`,再读取同一端口的 `/json/list`。结果 DTO 仅含 target ID、标题、类型和脱敏 URL;UI 以实例 ID、端口和请求代次丢弃过期结果。该链路不建立 WebSocket、不开启页面控制,也不提供物理窗口 ID。 - 通知区域:Windows platform adapter 在独立原生消息循环中管理一个图标、Tooltip 和原生菜单,向 `cmd/chub` 发送仅含“显示主窗口 / 刷新状态 / 退出应用”的 typed command。应用 coordinator 决定如何显示 Gio 窗口、发起既有刷新或执行退出清理;adapter 不持有浏览器进程句柄,不调用浏览器启动/停止接口。图标状态仅来自非敏感实例计数;Explorer 重启后重新注册,应用结束前删除图标。首版不拦截 Gio 的窗口关闭消息,也不隐藏主窗口。 +- 配置定位与迁移:`config.OpenDefault()` 先用 `os.Executable()` 的目录解析目标 `config.json`,不依赖工作目录。目标文件已存在时直接使用它;目标不存在时仅尝试读取旧 `%APPDATA%\\chub\\config.json`,通过现有 decode/normalize 校验后以 Store 原子写入目标,并把旧文件保留为只读恢复备份。迁移失败不会写入目标、不会删除旧文件、不会回退到 AppData 继续运行;应用层只显示可恢复的启动诊断,不显示配置内容。CLI 与 GUI 共用该入口,避免出现不同配置来源。 Chrome 和 Edge 共用大部分 Chromium 参数,但 executable 默认路径、进程名称和安装方式不同,通过 `BrowserDefinition` 封装差异。CDP 端点只绑定 `127.0.0.1`;端口号和 `/json/version` 是诊断数据,WebSocket URL 不进入持久化、事件或普通 UI 文案。`/json/list` 仅用于只读页面目标信息;URL 在 DTO 边界移除 userinfo、query 和 fragment。 diff --git a/docs/06-tasks.md b/docs/06-tasks.md index d17b971..11c007d 100644 --- a/docs/06-tasks.md +++ b/docs/06-tasks.md @@ -53,7 +53,8 @@ | --- | --- | --- | --- | | T-401 | 已验证实例的 CDP 页面目标只读查看 | T-302,T-303,T-310 | DONE | | T-402 | Windows 通知区域入口与显式退出协调 | T-303,T-305,T-307 | TODO | +| T-403 | 便携配置路径与安全 legacy 迁移 | T-202,T-309 | TODO | ## Backlog -关闭窗口时隐藏到通知区域与单实例激活、CDP tab/window 管理、导入导出启动配置、进程资源监控、多用户权限和远程主机管理。 +关闭窗口时隐藏到通知区域与单实例激活、可配置配置路径与安装版 AppData 策略、CDP tab/window 管理、导入导出启动配置、进程资源监控、多用户权限和远程主机管理。 diff --git a/docs/07-user-stories.md b/docs/07-user-stories.md index 65ac9c0..3db80fe 100644 --- a/docs/07-user-stories.md +++ b/docs/07-user-stories.md @@ -15,6 +15,7 @@ | US-011 | 用户手动关闭 Chub 启动的 Chrome/Edge 后,可以立即获知该实例已退出,并重新启动该实例。 | P1 | | US-012 | 用户可以查看已验证运行实例的 CDP 页面目标标题、脱敏 URL 和类型,而不会向浏览器发送控制命令。 | P1 | | US-013 | 用户可以从 Windows 通知区域快速显示 Chub、刷新已保存实例状态或明确退出应用,而不会在菜单中误操作浏览器实例。 | P1 | +| US-014 | 用户复制或升级 Chub 后,实例配置与程序一同保存在可执行文件目录;首次升级会安全带入旧 AppData 配置且不丢失已有新配置。 | P1 | ## 验收场景 @@ -57,3 +58,7 @@ CLI/API 返回稳定错误码和结构化数据;未知 PID、身份不匹配 ### US-013 Windows 通知区域入口 给定 Chub 正在运行,Windows 通知区域出现一个 Chub 图标;用户双击图标或选择默认“显示 Chub”命令后,主窗口显示并置前。用户选择“刷新实例状态”后,Chub 沿用页面刷新相同的已保存实例范围和后台去重规则。用户选择“退出 Chub”后,应用进入明确退出协调流程并清理图标;该菜单不列出实例,也不提供启动、停止、重启、删除或外部接管。Explorer 重启后图标会恢复,图标失效仅显示可恢复诊断,不影响窗口和浏览器实例。首版关闭主窗口仍按原退出语义处理,不会自动隐藏到通知区域。 + +### US-014 便携配置迁移 + +给定用户从 `build\\chub.exe` 或已发布目录启动 Chub,配置读取和后续保存均使用同级 `config.json`,不受启动脚本或当前工作目录影响。给定目标配置不存在且旧 `%APPDATA%\\chub\\config.json` 合法,Chub 校验旧配置并原子写入目标,旧文件作为恢复备份保留。给定目标配置已存在,Chub 只读取目标,不覆盖、合并或删除它。给定目标目录不可写或旧配置畸形,Chub 不创建新文件、不丢失旧文件,显示可恢复的配置诊断;不得静默切回 AppData 造成后续配置分叉。 diff --git a/docs/08-interaction-checklist.md b/docs/08-interaction-checklist.md index 276c820..3478685 100644 --- a/docs/08-interaction-checklist.md +++ b/docs/08-interaction-checklist.md @@ -15,6 +15,7 @@ | IX-011 | 实例首选调试端口 | 新建/编辑端口推荐、列表建议/准备/实际/外部文案、启动回退与保存 | 旧配置迁移、重复/非法端口、外部冲突、启动失败、外部关联、过期结果 | P1 | | IX-012 | CDP 页面目标查看 | 编辑弹层的“查看标签页”、只读目标列表与关闭 | 无可验证端口、读取中、空列表、读取失败、状态变更、Escape/焦点回归 | P1 | | IX-013 | Windows 通知区域 | 图标双击/默认显示、原生菜单刷新与退出 | 图标创建失败、Explorer 重启、窗口最小化、菜单关闭、刷新中、应用退出 | P1 | +| IX-014 | 配置启动与迁移 | exe 同级配置解析、legacy 配置迁移和可恢复失败反馈 | 新配置、合法 legacy、目标优先、畸形 legacy、目标目录不可写、重复启动 | P1 | ## 通用规则 @@ -33,3 +34,4 @@ - 调试端口的“建议/准备/实际/外部”必须同时以文字和数值表达,不能将首选端口称为已监听端口。创建和停止实例编辑使用首选端口输入;运行中、启动中、停止中和外部关联实例只读。推荐仅基于 Chub 保存实例,系统端口复检与 CDP 校验只在后台启动任务执行;回退不得使用其他 Chub 实例的逻辑预留端口。 - CDP 页面目标查看是只读、可关闭的临时对话框:入口仅对已有实际已验证端口的“运行中”或“外部已关联”实例可用;打开后焦点位于关闭按钮,Escape 关闭并回到“查看标签页”入口。读取中、空列表和错误均用文字表达,错误不丢失编辑输入;结果只含标题、类型和脱敏 URL,不能把目标 ID、WebSocket URL 或物理窗口 ID当作控制授权。 - 通知区域图标是 Windows 原生的辅助入口,不替代页面内可键盘访问的实例操作。图标默认项为“显示 Chub”,双击同效;右键菜单顺序固定为显示、刷新、分隔线、退出。刷新复用页面刷新命令并在进行中禁用重复项;退出是应用级命令,不能伪装为关闭单个浏览器。Tooltip 使用文字汇总,不含实例名称或敏感字段。菜单关闭不改变状态;图标失效或 Explorer 重启后后台重建,不抢焦点。首版不提供“关闭时隐藏到通知区域”。 +- 配置迁移不是用户可编辑表单:应用启动时在 platform 层完成,GUI frame 不读取或写入文件。成功迁移仅以不打扰操作的文本说明来源已更新;失败时保留实例列表输入与当前可见页面,给出“程序目录中的 config.json 无法使用;请检查目录权限或恢复旧配置”的可恢复提示,不能显示完整配置、代理地址或用户路径。无需 HTML 原型,因为不新增可操作控件;需以真实 Windows 文件权限和 CLI/GUI 启动验证。 diff --git a/docs/api.md b/docs/api.md index 70f2f4c..03037ac 100644 --- a/docs/api.md +++ b/docs/api.md @@ -69,6 +69,16 @@ type TrayState struct { 原生 adapter 通过结果通道发布 `TrayCommand`,并只接收 `TrayState` 汇总来更新 Tooltip 或图标状态。不得在 DTO 中放入实例名称、路径、URL、代理、PID、CDP 地址或平台句柄;`TrayCommand` 不是实例启动、停止、重启、删除或接管 API。 +本地配置入口统一为: + +```go +func DefaultPath() (string, error) //