6.0 KiB
6.0 KiB
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 handler(gateway.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、更新 startLocalFolderSidebarWatch 与 refresh() 描述 |
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 导致的重复行
未完成项 / 风险
未完成功能(需后续阶段实现)
- Restore focus 完全未实现 —
selectSidebarFileTreeDocument从未在 restore 路径调用,且不支持local-file:行 ID。最低成本实现方案已在 4-285.3给出短/中/长三条路径。 - filetree 内右键 delete → trash 未独立 smokes —
task464通过 API + trash 页 UI 覆盖,但 filetree 内置右键 delete 路径未单独验证。 - empty-trash(local folder) 未 smoke — 有空但是按钮 HTML 存在;未进行端到端 browser smoke。
- B 浏览器 no-refresh(local folder) 不适用的现有架构 — local folder 使用 revision polling,非 EventSource 推模式;如需实时双浏览器,架构需要升级。
风险
task473尚未实跑,仅通过node --check语法验证。3000 未运行时 status bar 检查等步骤可能因网络错误改变行为。建议 Codex 复核前先启动 3000 并实跑。4-28第 81 行用sed删除可能造成 line ending 不一致;已在后续读取中确认段落结构正确。4-34和4-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-46execution checklist 记录
禁止事项遵守
- ✅ 未修改 Rust 核心业务文件(
rust/crates/mnote-web/src/**) - ✅ 未把 reload 型刷新标为 no-refresh 完成(trash workbench
refresh()经源码验证为 fetch 非导航) - ✅ 未移动 design 文件到 done
- ✅ 未提交 git
- ✅ 未撤销/覆盖/格式化他人改动