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

101 lines
6.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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
- ✅ 未撤销/覆盖/格式化他人改动