fix(acceptance): 首轮 Windows 验收 7 项缺陷回修(docs/14)

P0 快捷键让行判定补 recoveryDismissed,点过「稍后再说」不再全失效;
P1 冲突重载加 force 绕过防竞态守卫;路径分隔符 joinPath 原生化 +
samePath 归一化比较;.source-cm 补文档字色;
P2 turndown 启用 GFM 插件(HTML 导入不再丢表格);任务复选框去掉
click preventDefault(浏览器激活撤销覆盖视觉同步);
P3 新增 syncEditorContent:干净标签的挂载/卸载序列化回写同步基线,
切标签不再误标未保存。vitest 74 通过 + 2 跳过。
This commit is contained in:
Muse
2026-11-14 11:08:24 +08:00
parent 947154892c
commit 9bd3f3de97
12 changed files with 179 additions and 36 deletions

View File

@@ -0,0 +1,49 @@
# 验收缺陷回修报告(对应 docs/13 首轮 Windows 验收,2026-11-14)
用户真机验收结论「未通过」,报回 7 项缺陷(P0×1、P1×3、P2×2、P3×1),全部已修。
验证:`npx tsc -b` 0 错误;`npx vitest run` **74 通过 + 2 跳过**(新增回归 3 例:tabs 基线同步、复选框点击同步、HTML 表格导入);`npm run build` 通过。本地未推送,待复验。
## P0 全局快捷键全失效(恢复弹窗点过「稍后再说」后)
- 根因:审计修复时给全局快捷键加的「任一弹窗打开时让行」判定用了 `recoveryOffer.length > 0`,没算「已点稍后再说」的状态——草稿记录还在库里,offer 就一直在,判定恒真,Ctrl+N/O/S/F/W 全部被让行。
- 修复:判定改为 `recoveryOffer.length > 0 && !recoveryDismissed`,与渲染条件一致。
## P1 B3 冲突「重新加载磁盘版本」无效
- 根因:审计 A3 的防竞态守卫(脏标签不许自动重载)把冲突弹窗这条「用户主动丢弃本地修改」的路径也挡了——弹窗关了、正文没换。
- 修复:reloadTabFromDisk 增加 `force` 参数;自动轮询走守卫路径,冲突弹窗的「重新加载」传 force 绕过守卫(卸载回写闸门仍生效,不会被旧编辑器盖回)。
## P1 D3/B12 路径分隔符不一致
- 根因:`joinPath` 恒用 `/` 拼在 Windows 反斜杠目录后面,造出 `...\ws/d3-new.md`,与 Rust/对话框返回的 `...\ws\d3-new.md` 字符串比较对不上:重命名后已开标签不跟随、删除后标签不关(进而又触发「已被外部删除」的误报提示,盖掉删除成功的提示;B12 本身已进回收站)。
- 修复:双管——`joinPath` 按父目录既有分隔符拼接(Windows 生成原生反斜杠路径);同时新增 `samePath` 归一化比较,用在打开去重、重命名查标签、恢复查标签、删除关标签(含子路径前缀判定)全部路径比较点。
## P1 E2 源码模式浅纸浅字
- 根因:`.source-cm` 没设文字色,继承了 UI 的 `--text`(深色 UI 下近白色),而纸面是文档主题的浅色(Notion #fbfbfa),浅字压浅纸。
- 修复:按建议 `.source-cm { color: var(--doc-ink); caret-color: var(--doc-ink) }`,源码明暗此前已按 paperTone 选过 CodeMirror 主题,这次把容器继承色也对齐到文档字色。
## P2 E6 HTML 导入丢表格
- 根因:turndown 未启用 GFM 插件,表格整段丢失(标题/列表正常)。
- 修复:新增依赖 turndown-plugin-gfm@1.0.2(MIT),htmlToMarkdown 启用 `gfm`(表格/删除线/任务列表一并补齐),附本地类型声明。回归测试:HTML 表格导入后生成标准 GFM 表格。
## P2 C3 任务复选框视觉不同步
- 根因:click 处理里 `e.preventDefault()`——浏览器对 checkbox 的激活语义是「点击先翻转、事件被取消则退回原值」,退回动作发生在事件结束后,正好把 NodeView update() 刚同步好的 `input.checked` 又退回去;`data-checked` 是普通属性不受影响,症状正是「数据变了、勾没变」。
- 修复:click 不再 preventDefault(原生翻转与文档翻转方向一致,update 再按文档值对齐);取不到节点时手工把视觉退回文档值。回归测试:真实 click 后 `input.checked` 与序列化结果一致。
## P3 切标签后旧文档偶发误标未保存
- 根因:编辑器挂载/卸载的序列化回写与磁盘原文存在规范化差异(表格对齐冒号、欢迎页内容最典型),回写经普通 updateContent 落地后 content≠savedContent,干净文档被标脏,进而触发自动保存与恢复记录。
- 修复:新增 reducer 动作 `syncEditorContent`——标签原本干净时,正文与基线一起对齐(规范化不算编辑);已脏时与普通更新无异。只走两条通道:挂载完成后的首次序列化对齐(EditorPane onSyncInitial)、卸载最终回写(onFinalMarkdown,含原有的重载闸门)。实时输入仍走 updateContent,脏标记语义不变。回归测试已加。
## 复验建议(对应 docs/13 条目)
P0 复验:留一份草稿 → 点「稍后再说」→ Ctrl+N 应能新建。
B3 复验:按原步骤点「重新加载」应换成磁盘版本且标签变干净。
D3/B12 复验:工作区里新建的文档重命名/删除,已开标签应跟随/关闭,提示不再被「已被外部删除」覆盖。
E2 复验:深色 UI + Notion 切源码模式,文字应为深色(rgb 55,53,47 量级)。
E6 复验:导含表格的 HTML,表格应以 GFM 表格出现。
C3 复验:点任务复选框,勾选视觉立即跟随。
P3 复验:打开欢迎页/含表格的文档来回切标签,不应出现未保存圆点。