101 lines
6.0 KiB
Markdown
101 lines
6.0 KiB
Markdown
# 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-trash(local folder)** 未 smoke — 有空但是按钮 HTML 存在;未进行端到端 browser smoke。
|
|||
|
|
4. **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-46` execution checklist 记录
|
|||
|
|
|
|||
|
|
## 禁止事项遵守
|
|||
|
|
|
|||
|
|
- ✅ 未修改 Rust 核心业务文件(`rust/crates/mnote-web/src/**`)
|
|||
|
|
- ✅ 未把 reload 型刷新标为 no-refresh 完成(trash workbench `refresh()` 经源码验证为 fetch 非导航)
|
|||
|
|
- ✅ 未移动 design 文件到 done
|
|||
|
|
- ✅ 未提交 git
|
|||
|
|
- ✅ 未撤销/覆盖/格式化他人改动
|