test: 收口本地文件夹垃圾箱 A3 smoke
This commit is contained in:
+9
-6
@@ -1,6 +1,6 @@
|
||||
# 4-34 Filetree Trash Dual Browser No Refresh v1
|
||||
|
||||
> 状态:process
|
||||
> 状态:done
|
||||
> 创建时间:2026-05-15
|
||||
> 所属主线:04-tree-domain / VSCode Explorer 文件树与垃圾箱闭环
|
||||
> 来源:`design/10-review/07-vscode-explorer-filetree-trash-gap-review.md` 阶段 8
|
||||
@@ -19,8 +19,8 @@
|
||||
| 普通附件 file asset | A 创建/上传或 seed 后 B File Tree 可见 | A 删除后 B File Tree 消失、Trash 可见 | A 恢复后 B File Tree 可见、Trash 消失 | A 彻底删除后 B Trash 消失 | A 清空资源垃圾箱后 B Trash 清空 | 记录 `tree.resource.*` / compat alias 与实时来源 |
|
||||
| mindmap | A 新建 mindmap 后 B File Tree 可见 | A 删除后 B File Tree 消失、Trash 可见 | A 恢复后 B File Tree 可见、Trash 消失 | A 彻底删除后 B Trash 消失 | A 清空资源垃圾箱后 B Trash 清空 | 记录 mindmap route 仍为 compat alias |
|
||||
| table | A 新建/seed table 后 B File Tree 可见 | A 删除后 B File Tree 消失、Trash 可见 | A 恢复后 B File Tree 可见、Trash 消失 | A 彻底删除后 B Trash 消失 | A 清空资源垃圾箱后 B Trash 清空 | 记录 table route 仍为 compat alias |
|
||||
| local folder Markdown | 外部创建 `.md` 后 page/file tree 可见 | 本地删除进入 `.mnote/trash` | restore 回原路径 | purge 后原文件与 trash 均不存在 | 可选本地 trash 清空 | 必须记录是否发生 reload,不能把 reload 型刷新标为 no-refresh |
|
||||
| local folder 非 md 资源 | ✅ task435 外部 create/rename/delete 无 reload | ✅ task437 API archive + task464 UI trash | ✅ task437 API restore + task473 UI restore no-refresh + focus/reveal | ✅ task437 API purge + task464 UI purge | ❌ 未覆盖(empty-trash smoke 未编写) | task435/437/464/473 覆盖;restore focus 缺口已关闭,见 task473 |
|
||||
| local folder Markdown | 外部创建 `.md` 后 page/file tree 可见 | ✅ task475 API archive(delete 后进入 `.mnote/trash`,trash-index 记录 `local-md:*`) | ✅ task475 API restore(`.md` 回原路径,trash 文件消失,index 清理) | ✅ task475 API purge(源路径与 trash 路径均不存在,index 清理) | ✅ task474 UI empty-trash(清空页面垃圾箱,confirm dialog → refresh(),无导航) | task475 覆盖 loose Markdown API trash lifecycle;task474 覆盖 empty-trash UI;bundled Markdown 由 Rust 单测覆盖 |
|
||||
| local folder 非 md 资源 | ✅ task435 外部 create/rename/delete 无 reload | ✅ task437 API archive + task464 UI trash | ✅ task437 API restore + task473 UI restore no-refresh + focus/reveal | ✅ task437 API purge + task464 UI purge | ✅ task474 UI empty-trash(清空资源垃圾箱,confirm dialog → refresh(),无导航) | task435/437/464/473 覆盖;restore focus 缺口已关闭,见 task473;task474 覆盖 empty-trash UI |
|
||||
|
||||
## 3. 分批执行
|
||||
|
||||
@@ -95,11 +95,14 @@
|
||||
- `/api/local-folder/events` 订阅该 watcher,主要服务打开的本地 Markdown document session。
|
||||
- 主 tree 的 local folder 模式不接 `/api/tree/events`,而是轮询 `/api/tree/local-folder-watch`(`startLocalFolderSidebarWatch`,1200ms 间隔)。revision 变化时调用 `refreshLocalFolderSidebarSnapshot()` 重渲染 filetree,**不触发 `window.location.reload()`**。Rust 单元测试 `sidebar_tree_runtime_polls_local_folder_without_browser_reload` 验证了 SSR template 中不含 reload 语句。
|
||||
- trash workbench 的 local folder restore/purge 使用 `refresh()`(gateway.rs:1040-1060):`fetch` + `DOMParser` 替换 workbench `innerHTML`,不触发浏览器导航。但 restore/purge 完成后不调用 `refreshLocalFolderSidebarSnapshot()`,filetree 更新依赖下次轮询触发。
|
||||
- `task163-local-folder-unified-tree-browser-smoke.js` 已覆盖外部新增 Markdown、外部新增 / 删除 `watcher-asset.txt` 的可见性;`task435-local-folder-watch-no-reload-smoke` 已覆盖 Markdown 与非 md 外部 create/rename/delete 无 reload;非 md trash/restore/purge 已由 task437(API)和 task464(UI)覆盖;local folder Markdown 自身 trash lifecycle(archive/restore/purge through tree commands)仍未编写独立 smoke。
|
||||
- `task163-local-folder-unified-tree-browser-smoke.js` 已覆盖外部新增 Markdown、外部新增 / 删除 `watcher-asset.txt` 的可见性;`task435-local-folder-watch-no-reload-smoke` 已覆盖 Markdown 与非 md 外部 create/rename/delete 无 reload;非 md trash/restore/purge 已由 task437(API)和 task464(UI)覆盖;local folder Markdown 自身 trash lifecycle(archive/restore/purge through tree commands)已由 task475 覆盖(API-only:loose Markdown 的 delete → trash 进入/restore 恢复/purge 清理)。
|
||||
- `task435-local-folder-watch-no-reload-smoke` 已通过:外部非 md 文件(`.txt`、`.png`)的 create / rename / delete 在 filetree 中无刷新可见更新,全程无 `framenavigated`。(结果:`tmp/task435-local-folder-watch-no-reload-smoke/result.json`)
|
||||
- `task437-local-folder-asset-trash-lifecycle-smoke` 已通过(API-only):`tree.resource.archive` / `restore` / `purge` 的 canonicalCommand 与文件系统一致性。(结果:`tmp/task437-local-folder-asset-trash-lifecycle-smoke/result.json`)
|
||||
- `task464-local-folder-resource-trash-ui-smoke` 已通过(Browser UI):trash 页中 delete→visible / restore→file restored / purge→file gone 完整 UI 流程。(结果:`tmp/task464-local-folder-resource-trash-ui-smoke/result.json`)
|
||||
- `task473-local-folder-trash-restore-no-refresh-focus-gap-smoke` 新增并已由 Codex + Reasonix Browser Worker 实跑:验证 trash workbench 的 restore 操作为 fetch 型 `refresh()`(`restoreNavFree.delta=0`,不触发浏览器导航),restore 后 filetree 通过轮询显示恢复行(`fileReappearsInFiletree=true`)。2026-05-21/22 Codex 修复并复跑后,恢复行出现 focus 证据(`data-active="true"`),focus gap 已关闭。(结果:`tmp/task473-local-folder-trash-restore-no-refresh-focus-gap-smoke/result.json`;浏览器证据:`tmp/reasonix-batch-a-browser-task473-2026-05-21/`)
|
||||
- `task475-local-folder-markdown-trash-lifecycle-smoke` 已通过(API-only):验证 loose Markdown 页面在 `/api/tree/commands` 的 delete(archive)→ restore → 再次 delete → purge 完整生命周期,文件系统与 `trash-index.json` 一致性。当前实现中 loose Markdown 的 delete/restore/purge 响应不含 `canonicalCommand` 字段(与 `trash_local_raw_file` 不同)。bundled Markdown 未覆盖(bundle 涉及目录整体移动/恢复,由 Rust 单测 `local_tree_command_manages_loose_markdown_like_regular_file` 和 `local_tree_command_delete_page_bundle_directory_uses_page_trash` 覆盖)。(结果:`tmp/task475-local-folder-markdown-trash-lifecycle-smoke/result.json`)
|
||||
- `task474-local-folder-empty-trash-ui-smoke` 新增:验证 local folder trash workbench 的清空页面垃圾箱(`local-empty-documents`)和清空资源垃圾箱(`local-empty-resources`)按钮操作。点击按钮后 accept confirm dialog,`refresh()` 以 fetch+DOMParser 替换 innerHTML,不触发浏览器导航;断言对应 trash row 消失、`trash-index.json` 对应 entry 清理、trash 文件删除。结果写入 `tmp/task474-local-folder-empty-trash-ui-smoke/result.json`。
|
||||
- 2026-05-21:Codex 在最新临时 `mnote-web` `http://127.0.0.1:3014` 上复跑 `task474` / `task475` 均通过;Reasonix Browser Worker 输出 `tmp/reasonix-batch-a3-browser-task474-empty-trash-2026-05-21/`,截图显示清空后页面与资源均为 0,两个清空按钮 disabled。
|
||||
|
||||
通过后才允许在 10-review 中把 local folder 阶段 8 子项勾选;如果仍发生 reload,只能标为“reload 型刷新可见”,不能标为 no-refresh。
|
||||
|
||||
@@ -116,12 +119,12 @@
|
||||
|
||||
- 3000 常驻进程可能是旧 `mnote-web` 二进制;修改 Rust 后做 smoke 时必须重启 3000,或用新编译的临时 3001 并在结果中明确记录。
|
||||
- 资源生命周期中,普通附件 file asset 已进入正式 `tree.resource.*`;mindmap / table 仍是 compat route,阶段 8 只验证 no-refresh,不改变 cutover 口径。
|
||||
- local folder Markdown watcher 只有部分历史覆盖,且主 tree filetree 当前是 revision polling + reload;非 md 本地资源文件 watcher / trash / restore / purge 已由 task435(外部 create/rename/delete)、task437(API trash lifecycle)、task464(trash UI)、task473(restore no-refresh + focus/reveal)分项覆盖;local folder Markdown trash lifecycle 仍未编写独立 smoke。
|
||||
- local folder Markdown watcher 只有部分历史覆盖,且主 tree filetree 当前是 revision polling;非 md 本地资源文件 watcher / trash / restore / purge 已由 task435(外部 create/rename/delete)、task437(API trash lifecycle)、task464(trash UI)、task473(restore no-refresh + focus/reveal)分项覆盖;local folder empty-trash UI(md 页面 + 非 md 资源)已由 task474 覆盖;local folder Markdown loose page trash lifecycle 已由 task475(API)覆盖;bundled Markdown 由 Rust 单测覆盖,尚未编写独立 smoke。
|
||||
- `resync_required` delta 不是数据替换本身,必须伴随后续 snapshot / resync 或客户端主动拉取 snapshot;后续新增资源 route 时必须补事件合同回归。
|
||||
|
||||
## 6. 完成标准
|
||||
|
||||
- `design/10-review/07-vscode-explorer-filetree-trash-gap-review.md` 阶段 8 的 Convex 页面、普通附件、mindmap、table checklist 全部有对应 smoke 证据。
|
||||
- local folder 子项必须有 task435/437/464/473 或等价 smoke 证据;若仍发生 reload,保持未完成 no-refresh 状态。restore focus 已由 task473 关闭,不再视为 blocker。
|
||||
- local folder 子项必须有 task435/437/464/473/474/475 或等价 smoke 证据;若仍发生 reload,保持未完成 no-refresh 状态。restore focus 已由 task473 关闭,不再视为 blocker。
|
||||
- 每个 smoke 结果写入 `tmp/task43*-*/result.json`,并在 10-review 中记录命令、对象、实时来源和剩余边界。
|
||||
- 不再用单浏览器 no-refresh、API purge 成功或 Convex query 成功替代双浏览器 UI no-refresh。
|
||||
+2
-1
@@ -6,7 +6,7 @@
|
||||
>
|
||||
> 阶段:Batch A / P0 清验证阻塞
|
||||
>
|
||||
> 当前状态:`PROCESS`
|
||||
> 当前状态:`DONE`
|
||||
|
||||
## 1. 目标
|
||||
|
||||
@@ -134,3 +134,4 @@ Codex 必须复核浏览器测试结果;不能只相信 worker 文字总结。
|
||||
- 2026-05-21:Codex 复核 Reasonix 截图和 JSON:task471 的多选删除截图与 DOM / trash index 断言一致;task430/task473 截图只作为浏览器可打开佐证,最终状态以 smoke `result.json` 为准。
|
||||
- 2026-05-28:Batch A2 / Worker C — 修改 task473 完成条件为要求 `hasFocusEvidence===true`,使 focus gap 从"记录缺口但 ok:true"变为"记录缺口且 ok:false(直至 focus 修复)";更新 4-34 覆盖矩阵将非 md 资源行从"待定"写实为 task435/437/464/473 分项覆盖并标注 focus gap open;更新 4-34 审计结论、边界描述和完成标准以反映实际 smoke 覆盖;追加本执行记录。本轮目标:关闭 task473 的 focus gap 作为可检测的回归测试。
|
||||
- 2026-05-21/22:Codex 接手 Batch A2 / Worker B 卡住项,修复 local folder restore 后 filetree focus/reveal:trash workbench restore 写入 pending row-id,filetree 初始加载与 polling 刷新通过 `schedulePendingLocalFolderRestoreFocus()` 重放聚焦;`task473` 在临时 3012 新进程上实跑通过,`focusAfterRestore.attrs.data-active="true"`。`4-28` 已满足归档条件并移动到 `done/`;`4-34` 仍保留在 `process/`,因为 local folder empty-trash / Markdown trash lifecycle 仍未完整覆盖。
|
||||
- 2026-05-21:Batch A3 收口。Reasonix Worker A/B 新增 `task474-local-folder-empty-trash-ui-smoke.js` 与 `task475-local-folder-markdown-trash-lifecycle-smoke.js`;Codex 在最新临时 `mnote-web` `http://127.0.0.1:3014` 上复跑两条 smoke 均通过。Reasonix Browser Worker 输出 `tmp/reasonix-batch-a3-browser-task474-empty-trash-2026-05-21/`,截图显示 local folder trash 清空后页面/资源均为 0。`4-34` 与本执行总 checklist 满足归档条件,移动到 `done/`。
|
||||
+121
@@ -0,0 +1,121 @@
|
||||
# 4-47 [process] Batch A3 Local Folder Trash Final Smoke Checklist v1
|
||||
|
||||
> 创建时间:2026-05-21
|
||||
>
|
||||
> 上位入口:`design/01-tree-first-graph-kernel/process/1-8-mvp-post-process-execution-order-v1.md`
|
||||
>
|
||||
> 阶段:Batch A / P0 剩余 local folder trash smoke 收口
|
||||
>
|
||||
> 当前状态:`DONE`
|
||||
|
||||
## 1. 目标
|
||||
|
||||
关闭 `4-34` 和 `4-46` 中 Batch A 剩余的 local folder 垃圾箱验证缺口:
|
||||
|
||||
- local folder empty-trash UI smoke。
|
||||
- local folder Markdown 页面自身的 archive / restore / purge smoke。
|
||||
- 根据真实 smoke 结果判断 `4-34` / `4-46` 是否可归档到 `done/`。
|
||||
|
||||
本阶段不改 delete 默认进入垃圾箱的语义,不把 reload 型刷新伪装成 no-refresh,不扩新产品面。
|
||||
|
||||
## 2. 当前剩余缺口
|
||||
|
||||
- `4-34` 中 local folder 非 md 资源 empty-trash 已由 `task474` 覆盖。
|
||||
- `4-34` 中 local folder Markdown 自身 trash lifecycle 已由 `task475` 覆盖。
|
||||
- `4-46` Batch A 执行总 checklist 已满足归档条件。
|
||||
|
||||
## 3. Reasonix Worker 拆分
|
||||
|
||||
### Worker A:local folder empty-trash UI smoke
|
||||
|
||||
Owner:
|
||||
|
||||
- 可新增 `scripts/task474-local-folder-empty-trash-ui-smoke.js`
|
||||
- `design/04-tree-domain/process/4-34-filetree-trash-dual-browser-no-refresh-v1.md`
|
||||
- `.codex/reasonix-tasks/results/batch-a3-worker-a-empty-trash.md`
|
||||
|
||||
目标:
|
||||
|
||||
- 构造 local folder 临时 root,同时放入 markdown 页面和非 md 资源。
|
||||
- 通过 tree command 或 UI 将它们移动到 `.mnote/trash`。
|
||||
- 打开 `/trash?sourceKind=local_folder&rootUri=...`,分别点击“清空页面垃圾箱”和“清空资源垃圾箱”。
|
||||
- 断言对应行消失、文件系统 trash 文件消失、`trash-index.json` 对应 entry 清理。
|
||||
- 记录点击清空期间无非预期 browser navigation。
|
||||
|
||||
验收:
|
||||
|
||||
```bash
|
||||
node --check scripts/task474-local-folder-empty-trash-ui-smoke.js
|
||||
MNOTE_WEB_SMOKE_BASE_URL=http://127.0.0.1:<port> PLAYWRIGHT_CHROMIUM_EXECUTABLE_PATH=/usr/bin/google-chrome-stable node scripts/task474-local-folder-empty-trash-ui-smoke.js
|
||||
```
|
||||
|
||||
### Worker B:local folder Markdown trash lifecycle smoke
|
||||
|
||||
Owner:
|
||||
|
||||
- 可新增 `scripts/task475-local-folder-markdown-trash-lifecycle-smoke.js`
|
||||
- `design/04-tree-domain/process/4-34-filetree-trash-dual-browser-no-refresh-v1.md`
|
||||
- `.codex/reasonix-tasks/results/batch-a3-worker-b-markdown-lifecycle.md`
|
||||
|
||||
目标:
|
||||
|
||||
- 构造 loose Markdown 和/或 bundled Markdown 页面。
|
||||
- 通过 `/api/tree/commands` 验证 Markdown 页面的 `delete` / `restore` / `purge`。
|
||||
- 断言 canonical command、源路径、trash 路径、`trash-index.json` 和恢复后的 documentId 与文件系统一致。
|
||||
- 这是生命周期 smoke,不要求 UI 截图;浏览器可见性由 Worker A 和后续 Browser Worker 覆盖。
|
||||
|
||||
验收:
|
||||
|
||||
```bash
|
||||
node --check scripts/task475-local-folder-markdown-trash-lifecycle-smoke.js
|
||||
MNOTE_WEB_SMOKE_BASE_URL=http://127.0.0.1:<port> node scripts/task475-local-folder-markdown-trash-lifecycle-smoke.js
|
||||
```
|
||||
|
||||
### Worker C:文档归档审查
|
||||
|
||||
Owner:
|
||||
|
||||
- `design/04-tree-domain/process/4-34-filetree-trash-dual-browser-no-refresh-v1.md`
|
||||
- `design/04-tree-domain/process/4-46-batch-a-filetree-action-trash-smoke-execution-checklist-v1.md`
|
||||
- 如条件满足,可移动到 `design/04-tree-domain/done/`
|
||||
- `.codex/reasonix-tasks/results/batch-a3-worker-c-doc-archive.md`
|
||||
|
||||
目标:
|
||||
|
||||
- 在 Worker A/B smoke 结果可复核后,判断 `4-34` 是否满足归档条件。
|
||||
- 判断 `4-46` 是否已经完成 Batch A P0,是否可以归档。
|
||||
- 若仍有缺口,必须写明 blocker 与下一步,不得强行移动。
|
||||
|
||||
验收:
|
||||
|
||||
```bash
|
||||
git diff --name-status
|
||||
```
|
||||
|
||||
## 4. Codex 复核项
|
||||
|
||||
- [x] 读取 Worker A/B 输出;Worker C 由 Codex 本地完成归档审查。
|
||||
- [x] 独立审查 diff,确认无越权修改。
|
||||
- [x] 运行新增脚本 `node --check`。
|
||||
- [x] 在最新 mnote-web 临时端口 `3014` 上实跑新增 smoke。
|
||||
- [x] 完成后拆 Browser Worker 复测关键 UI smoke 并核验截图。
|
||||
- [ ] `git diff --check`、`codegraph sync .` 后提交。
|
||||
|
||||
## 5. 完成条件
|
||||
|
||||
- `task474` 或等价 smoke 覆盖 local folder empty-trash UI。
|
||||
- `task475` 或等价 smoke 覆盖 local folder Markdown archive / restore / purge。
|
||||
- `4-34` / `4-46` 状态与真实证据一致。
|
||||
- 浏览器 worker 输出截图和 `result.json` 已由 Codex 复核。
|
||||
- 本阶段完成后由 Codex 提交 git。
|
||||
|
||||
## 6. 执行结果
|
||||
|
||||
- `task474-local-folder-empty-trash-ui-smoke.js` 新增并通过:local folder 页面垃圾箱与资源垃圾箱清空 UI、confirm、无导航、trash-index 清理、文件删除。
|
||||
- `task475-local-folder-markdown-trash-lifecycle-smoke.js` 新增并通过:loose Markdown 页面 delete / restore / purge 生命周期与文件系统一致。
|
||||
- Codex 复核命令:
|
||||
- `node --check scripts/task474-local-folder-empty-trash-ui-smoke.js`
|
||||
- `node --check scripts/task475-local-folder-markdown-trash-lifecycle-smoke.js`
|
||||
- `MNOTE_WEB_SMOKE_BASE_URL=http://127.0.0.1:3014 PLAYWRIGHT_CHROMIUM_EXECUTABLE_PATH=/usr/bin/google-chrome-stable node scripts/task474-local-folder-empty-trash-ui-smoke.js`
|
||||
- `MNOTE_WEB_SMOKE_BASE_URL=http://127.0.0.1:3014 node scripts/task475-local-folder-markdown-trash-lifecycle-smoke.js`
|
||||
- Reasonix Browser Worker 复测输出:`tmp/reasonix-batch-a3-browser-task474-empty-trash-2026-05-21/`,核心截图 `trash-workbench-empty.png` 已由 Codex 查看。
|
||||
Reference in New Issue
Block a user