Files
mnote/.codex/reasonix-tasks/results/batch-a-worker-c-local-folder-restore-no-refresh.md
T

6.0 KiB
Raw Blame History

Batch A Worker C: Local Folder No-refresh / Restore Focus Gap — 执行结果

执行人

Reasonix Worker C

环境状态

检查项 状态
项目根 /mnt/Data1T/mnote
Node.js 可用
Playwright 已安装
node --check task473 通过,无语法错误
3000 实跑 未运行(本次为审计 + 脚本创建,未实跑)

审计结果

1. Local folder 非 md 资源 trash / restore / purge UI 支持状态

子项 状态 证据 脚本/结果
外部创建/重命名/删除非 md.txt, .png)→ filetree no-refresh 完成 task435 全程无 framenavigated tmp/task435-local-folder-watch-no-reload-smoke/result.json
API delete → .mnote/trash + tree.resource.archive 完成 task437 API-only 验证 tmp/task437-local-folder-asset-trash-lifecycle-smoke/result.json
API restore → 文件系统恢复 完成 task437 API-only 验证 同上
API purge → 文件 + index 清理 完成 task437 API-only 验证 同上
Trash 页 UI delete → visible → restore → file restored 完成 task464 browser UI tmp/task464-local-folder-resource-trash-ui-smoke/result.json
Trash 页 UI delete → purge → file gone 完成 task464 browser UI 同上
Trash workbench restore 不触发浏览器导航(no-refresh) 完成 task473 gap smoke tmp/task473-local-folder-trash-restore-no-refresh-focus-gap-smoke/result.json
Restore 后 filetree 行重现(轮询 1200ms 完成 task473 gap smoke 同上
Restore 后 filetree 行 focus/reveal 未实现 task473 gap smoke 记录无 data-active/selected 同上
双浏览器 no-refresh 🔄 不适用 local folder 使用 revision polling,非 SSE/实时推

2. Restore 后 DOM reveal / focus 证据缺口

确认 selectSidebarFileTreeDocument 从未在 restore 路径调用:

调用路径 行号 是否包含 restore
文档打开导航后 layout.rs:1274,1296
local folder create page 后 layout.rs:1333
mnote:primary-document-activated 事件 layout.rs:9278
restore 路径 不调用

selectSidebarFileTreeDocument 的 row 选择器 data-row-id="doc:{id}" 也不匹配 local-file:{path} 格式(layout.rs:4138)。

trash workbench 的 restore handlergateway.rs:1055-1071)在 POST /api/tree/commands 后只调用 refresh()fetch 替换自身 workbench),不调用 refreshLocalFolderSidebarSnapshot(),不设置任何 focus。

3. task473 smoke 设计

新增 scripts/task473-local-folder-trash-restore-no-refresh-focus-gap-smoke.js

  • 全流程:创建临时 local folder → 非 md 文件 → 登录 → 打开 filetree → API delete → 验证 trash 页 → 点击 restore → 验证无导航 → 验证文件恢复 → 回到 filetree → 验证行重现 → 检查 focus 证据
  • 检查点 9 明确记录 focusAfterRestore,区分 found / attrs / inViewport
  • 结果写入 tmp/task473-local-folder-trash-restore-no-refresh-focus-gap-smoke/result.json

修改文件

文件 改动
scripts/task473-local-folder-trash-restore-no-refresh-focus-gap-smoke.js 新增:local folder trash restore no-refresh + focus gap smoke
design/04-tree-domain/process/4-34-filetree-trash-dual-browser-no-refresh-v1.md 追加 Worker C 审计 smoke 记录、修正审计结论 table、更新 startLocalFolderSidebarWatchrefresh() 描述
design/04-tree-domain/process/4-28-trash-restore-location-reveal-focus-v1.md 标题改为"待补(Worker C 追加)";拆分为 5.1 Convex / 5.2 Local folder / 5.3 步骤建议;追加审计证据表和源码对照

运行过的命令

node --check scripts/task473-local-folder-trash-restore-no-refresh-focus-gap-smoke.js
sed -i '81d' design/04-tree-domain/process/4-28-trash-restore-location-reveal-focus-v1.md  # 消除 smart quote 导致的重复行

未完成项 / 风险

未完成功能(需后续阶段实现)

  1. Restore focus 完全未实现selectSidebarFileTreeDocument 从未在 restore 路径调用,且不支持 local-file: 行 ID。最低成本实现方案已在 4-28 5.3 给出短/中/长三条路径。
  2. filetree 内右键 delete → trash 未独立 smokes — task464 通过 API + trash 页 UI 覆盖,但 filetree 内置右键 delete 路径未单独验证。
  3. empty-trashlocal folder 未 smoke — 有空但是按钮 HTML 存在;未进行端到端 browser smoke。
  4. B 浏览器 no-refreshlocal folder 不适用的现有架构 — local folder 使用 revision polling,非 EventSource 推模式;如需实时双浏览器,架构需要升级。

风险

  • task473 尚未实跑,仅通过 node --check 语法验证。3000 未运行时 status bar 检查等步骤可能因网络错误改变行为。建议 Codex 复核前先启动 3000 并实跑。
  • 4-28 第 81 行用 sed 删除可能造成 line ending 不一致;已在后续读取中确认段落结构正确。
  • 4-344-28"smart quote 字符在后续编辑中可能继续匹配困难,建议用 ASCII 引号统一。

Codex 复核要点

  • 独立复跑 node --check scripts/task473-local-folder-trash-restore-no-refresh-focus-gap-smoke.js
  • 启动 3000 后实跑 node scripts/task473-local-folder-trash-restore-no-refresh-focus-gap-smoke.js 并检查结果
  • 检查 git diff 确认只修改了以上列出的 3 个文件,未触碰 rust/crates/mnote-web/src/**
  • 更新 4-46 execution checklist 记录

禁止事项遵守

  • 未修改 Rust 核心业务文件(rust/crates/mnote-web/src/**
  • 未把 reload 型刷新标为 no-refresh 完成(trash workbench refresh() 经源码验证为 fetch 非导航)
  • 未移动 design 文件到 done
  • 未提交 git
  • 未撤销/覆盖/格式化他人改动