Skip to content

chore: dev → main(阻断测试/自测构建写生产配置) - #498

Merged
feigeCode merged 3 commits into
mainfrom
dev
Nov 2, 2026
Merged

feigeCode merged 3 commits into
mainfrom
dev

Conversation

@feigeCode

Copy link
Copy Markdown
Owner

背景

2026-11-01 生产 ~/.config/navop/settings.json 被重置成默认值。今天在本机复现并定位:

cargo test -p db_view --lib sql_editor_installs_mouse_hover_provider_only_when_enabled 里调用 AppSettings::update_and_save,测试进程的 AppPaths 未初始化,app_dirs::config_dir() 回落成 ~/.config/navop,整份原子写把生产配置覆盖成 AppSettings::default()(残留指纹 sql_editor_hover_enabled=true,默认 false)。随后安装版启动加载这份默认值并连存两次,把唯一一代 .bak 顶掉,好配置永久丢失。

改动

  • 保存硬闸:AppSettings::save 在 app paths 未初始化时拒绝落盘;从读不出/解析不了的 settings.json 起步时本次运行也不再写盘。
  • 隔离按可执行文件来源判定:target/{debug,release}、targets、~/.cargo/bin 一律走 ~/.navop-dev(含 release 自测与本地打包 .app),不再读写生产目录与生产 keychain。
  • 多代备份:.bak/.bak.1/.bak.2 三代轮转,临时文件名带 pid,避免并发写穿。
  • 收编隔离缺口:db_view hover 用例改写到临时目录;notes 默认根跟随 AppPaths;开发构建跳过全局 skills 安装;开发构建 worktree 落 ~/.navop-dev/worktrees。

验证

  • cargo check -p one-core -p notes -p workspace_explorer -p db_view -p navop_app --tests 无新增告警。
  • cargo test -p one-core --lib app_paths::(含新的来源判定用例)与 settings::tests 全绿。
  • 复跑事故用例:写入落到 $TMPDIR/navop-db-view-tests-<pid>,生产 settings.json md5 与 mtime 不变。

说明

不含 CHANGELOG 与版本 bump。

beta-release.sh 原来默认 REMOTE=cnb,tag 只推到 CNB 不会触发
release-trigger.yml,beta 构建根本不会开始。改为默认 origin,并新增
MIRROR_REMOTE=cnb 在成功后镜像推一份 dev 与 tag(失败只警告):
tag 唯一性预检也同时检查两个远端。
2026-11-01 生产 settings.json 被重置的根因已复现:`cargo test -p db_view`
的用例在 app paths 未初始化时调用 `AppSettings::update_and_save`,目录经
`app_dirs::config_dir()` 回落成 `~/.config/navop`,整份写入把设置写成默认值。

- settings 保存加硬闸:app paths 未初始化时拒绝落盘;从无法读取/解析的
  settings.json 起步时本次运行也不再写盘(坏文件已隔离为 .corrupt-*)。
- 隔离判定从「构建 profile」扩展为「可执行文件来源」:`target/{debug,release}`、
  `targets`、`~/.cargo/bin` 一律走 `~/.navop-dev`,release 自测不再读写生产目录
  与生产 keychain。
- `settings.json.bak` 保留三代(.bak/.bak.1/.bak.2),临时文件名带进程号,
  避免单代备份被启动期连续 save 顶掉、以及双实例并发写穿。
- db_view hover 用例把 app paths 指到临时目录;notes 默认根跟随 AppPaths;
  开发构建跳过全局 skills 安装;开发构建的 worktree 落 `~/.navop-dev/worktrees`。
侧栏拖动的宽度换算依赖 workspace_bounds,而它此前由
WorkspaceResizeEventHandler::prepaint 用元素自身 bounds 写入。该元素是
h_flex 里 0×0 的弹性子项,落在工作区右缘、垂直居中,于是:

- 左侧:`鼠标 x - 工作区右缘` 恒为负,每次拖动都被夹到最小宽度
  (280),表现为「移到左边后拖不动」。
- 底部:`工作区中线 - 鼠标 y` 同样为负,也被夹到最小宽度。
- 右侧:元素右缘恰好等于工作区右缘,才碰巧正常。

改为在工作区根 h_flex 上用 on_prepaint 捕获真实 bounds(与 db_view 的
写法一致),事件处理元素只保留鼠标监听。内嵌 dock(TerminalView 嵌入
资源工作台)的 view_bounds 同样从 window.bounds() 改为 dock 根元素的
on_prepaint,避免视图不在窗口原点时换算偏移。

新增两条契约测试分别锁定工作区与内嵌 dock 的 bounds 来源。

验证:cargo test -p terminal_view --lib 572 passed。
@feigeCode
feigeCode merged commit 361ee5b into main Nov 2, 2026
8 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant