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

101 lines
6.0 KiB
Markdown
Raw Normal View History

2026-05-21 11:01:17 +08:00
# 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 步骤建议;追加审计证据表和源码对照 |
## 运行过的命令
```bash
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-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-46` execution checklist 记录
## 禁止事项遵守
- ✅ 未修改 Rust 核心业务文件(`rust/crates/mnote-web/src/**`
- ✅ 未把 reload 型刷新标为 no-refresh 完成(trash workbench `refresh()` 经源码验证为 fetch 非导航)
- ✅ 未移动 design 文件到 done
- ✅ 未提交 git
- ✅ 未撤销/覆盖/格式化他人改动