9.7 KiB
9.7 KiB
3-10 [process] Rust Web 3000 Tree / Editor Runtime Integration Checklist v1
更新时间:2026-04-29
对应计划:
/mnt/Data1T/mnote/design/03-rust-web/process/3-9-rust-web-3000-tree-editor-runtime-integration-plan-v1.md参考输入:
- 当前 3000 截图:
/mnt/Data1T/mnote/tmp/image copy 32.png- 当前 shell parity checklist:
/mnt/Data1T/mnote/design/03-rust-web/process/3-8-rust-web-3000-wolai-ui-parity-checklist-v1.md- Page Aggregate 对齐主线:
/mnt/Data1T/mnote/design/05-editor-mainline/process/5-6-page-aggregate-alignment-checklist-v1.md
1. 当前结论
当前已经完成的是:
3000默认由mnote-web监听。3000根页已经有 Wolai 风格 workspace shell。- 根页包含左栏、顶栏、右下浮动按钮和
data-mnote-shell="workspace"。 /documents/:id已有 Rust Web document shell、Page Aggregate marker 和data-editor-host="leptos_tiptap_island"marker。
当前没有完成的是:
- 左栏
我的页面显示真实 file/page tree rows,而不是空 section。 - 根页正文不再使用设计稿静态链接列表作为伪主内容。
- active page selection 能从 projection / recent / URL 一致落到 sidebar 和 document shell。
/documents/:id浏览器运行态能挂载data-testid="mnote-leptos-tiptap-island-editor-root"。.ProseMirror[contenteditable="true"]可见、可输入、可保存、reload 后可读回。- smoke 能区分“只有外壳 UI”与“真实树和编辑器已接入”。
一句话判断:
需要继续规划并执行下一阶段;3-8 只应视为 shell/UI parity,不能视为文件树、页面树和主编辑区 runtime parity。
2. 不可误判为完成的情况
- 只看到
data-testid="wolai-sidebar",不算页面树接入。 - 只看到
我的页面文案,不算真实树接入。 - 只看到正文静态链接列表,不算 Page Aggregate 主内容接入。
- 只看到
data-editor-host="leptos_tiptap_island",不算 editor island 已 hydrate。 - 只看到
#mnote-editor-island空占位,不算主编辑区完成。 - 只在 fixture gateway 下通过,不算当前真实
3000主链完成。
3. Phase E-0:冻结真实树和编辑器失败用例
目标:让当前截图暴露的问题可以自动失败。
- 新增
scripts/task120-rust-web-tree-integration-smoke.js。 task120通过POST /api/tree/commands action=create创建临时根页面。task120创建临时子页面并记录workspaceId/documentId。task120断言GET /或/documents/:id的左栏包含data-testid="wolai-sidebar-row"。task120断言临时页面 row 的data-node-id等于真实 document id。task120断言 active row 有data-active="true"或等价稳定标记。task120点击 row 后能打开 Rust Web/documents/:id。task120用purge清理临时页面。- 新增
scripts/task121-rust-web-editor-island-hydration-smoke.js。 task121断言data-testid="mnote-leptos-tiptap-island-editor-root"可见。task121断言.editor-surface .ProseMirror[contenteditable="true"]可见。task121输入唯一文本并触发保存。task121reload 后仍能读回唯一文本。task121拉取/api/page-aggregate/:id后能读回保存内容或版本变化。task119增加负向断言,不能只靠.mnote-home-links静态列表通过。
验证命令:
cd /mnt/Data1T/mnote
MNOTE_UI_BASE_URL=http://127.0.0.1:3000 node scripts/task120-rust-web-tree-integration-smoke.js
MNOTE_UI_BASE_URL=http://127.0.0.1:3000 node scripts/task121-rust-web-editor-island-hydration-smoke.js
4. Phase E-1:workspace sidebar 接入真实 projection rows
目标:左栏 我的页面 不再是空 section,而是 projection 驱动的真实页面树。
WorkspaceShellProjection.myPageItems来源于sidebar_tree/sidebar.dataset.list/ kernel projection。WorkspaceShellProjection.starredItems来源于真实 projection,不硬编码。render_workspace_shell_sidebar_html输出data-testid="wolai-sidebar-row"。- 每个 row 输出
data-node-id。 - 子页面 row 输出
data-parent-id或等价层级标记。 - active row 输出
data-active="true"。 - 空 workspace 输出明确 empty state,不回到设计稿静态链接列表。
- Cargo 测试覆盖 root/child/active/empty 四类输入。
验证命令:
cd /mnt/Data1T/mnote/rust
cargo test -p mnote-web workspace_shell
5. Phase E-2:根路径接入 active page / empty workspace
目标:GET / 选择真实 active page 或显示真实空 workspace,不再把设计稿静态首页当主编辑区。
gateway.rs::root_entry选择顺序固定为pageId> recent cookie > projection active > first page > empty workspace。- 有 active page 时,根路径渲染或跳转到真实 document shell。
- 无 active page 时,根路径显示空 workspace state。
- 根页不再输出
.mnote-home-links静态设计稿列表作为主内容。 - recent page cookie 与 document shell 打开行为一致。
- Rust 测试覆盖 root selection 顺序。
task118/task119仍通过。
验证命令:
cd /mnt/Data1T/mnote/rust
cargo test -p mnote-web root_entry
cd /mnt/Data1T/mnote
MNOTE_UI_BASE_URL=http://127.0.0.1:3000 node scripts/task118-rust-web-wolai-ui-parity-smoke.js
MNOTE_UI_BASE_URL=http://127.0.0.1:3000 node scripts/task119-rust-web-wolai-visual-regression-smoke.js
6. Phase E-3:document shell 接上真实 Page Aggregate 与 page tree
目标:文档页标题、页面树、正文 bootstrap 来自同一份 Page Aggregate / projection。
/documents/:id标题来自 Page Aggregatehead.title。- breadcrumb / topbar active title 与 Page Aggregate 标题一致。
- 左栏 active row 与当前 document id 一致。
- 页面内 page tree / subtree 使用 Page Aggregate
tree.pageSubtree或 kernelpage_treeprojection。 - HTML 内嵌
__MNOTE_PAGE_AGGREGATE__。 - HTML 内嵌
__MNOTE_EDITOR_BOOTSTRAP__。 - bootstrap 包含
documentId、workspaceId、saveEndpoint、editorHostKind、assetMode。 - 不从 URL 或静态 fallback 重新推导第二份页面真相。
验证命令:
cd /mnt/Data1T/mnote/rust
cargo test -p mnote-web document_shell page_aggregate
cd /mnt/Data1T/mnote
MNOTE_UI_BASE_URL=http://127.0.0.1:3000 node scripts/task115-rust-web-document-shell-smoke.js
7. Phase E-4:挂载 leptos-tiptap island 并证明可编辑
目标:主编辑区不是 marker,而是浏览器内真实可编辑 runtime。
- Rust document shell 输出稳定 mount root。
- 前端 island adapter 能读取
__MNOTE_PAGE_AGGREGATE__。 - 前端 island adapter 能读取
__MNOTE_EDITOR_BOOTSTRAP__。 leptos_tiptap_island成为 active host。- 页面出现
data-testid="mnote-leptos-tiptap-island-editor-root"。 - 页面出现
.editor-surface .ProseMirror[contenteditable="true"]。 data-editor-host-active="leptos_tiptap_island"或等价 observability 可见。- BlockNote 没有成为默认主编辑器。
- 输入文本能保存。
- reload 后文本仍在。
验证命令:
cd /mnt/Data1T/mnote
MNOTE_UI_BASE_URL=http://127.0.0.1:3000 node scripts/task121-rust-web-editor-island-hydration-smoke.js
8. Phase E-5:树事件与编辑保存联动回归
目标:树和编辑器不是一次性 SSR,而是接入当前 Rust Web transport / realtime 主链。
- 新建页面后
/api/tree/events或 projection reload 可看到新增节点。 - 重命名页面后 sidebar row title 更新。
- 删除 / purge 页面后 sidebar row 消失。
- 编辑保存走
/api/documents/save或约定 Rust Web save endpoint。 - 保存后
/api/page-aggregate/:id能看到正文变化或 revision 变化。 task114、task115、task118、task119、task120、task121在当前 3000 全部通过。
验证命令:
cd /mnt/Data1T/mnote
MNOTE_UI_BASE_URL=http://127.0.0.1:3000 node scripts/task114-rust-web-gateway-entry-smoke.js
MNOTE_UI_BASE_URL=http://127.0.0.1:3000 node scripts/task115-rust-web-document-shell-smoke.js
MNOTE_UI_BASE_URL=http://127.0.0.1:3000 node scripts/task118-rust-web-wolai-ui-parity-smoke.js
MNOTE_UI_BASE_URL=http://127.0.0.1:3000 node scripts/task119-rust-web-wolai-visual-regression-smoke.js
MNOTE_UI_BASE_URL=http://127.0.0.1:3000 node scripts/task120-rust-web-tree-integration-smoke.js
MNOTE_UI_BASE_URL=http://127.0.0.1:3000 node scripts/task121-rust-web-editor-island-hydration-smoke.js
9. Harness 映射建议
本 checklist 建立阶段不直接修改 harness-tasks.json。若进入执行,建议追加:
| 新任务 | Phase | 标题 | 优先级 |
|---|---|---|---|
task-034 |
E-0 | 冻结真实树和编辑器 hydration 失败用例 | P0 |
task-035 |
E-1 | workspace sidebar 接入真实 projection rows | P0 |
task-036 |
E-2 | 根路径接入 active page / empty workspace | P0 |
task-037 |
E-3 | document shell 接上真实 Page Aggregate 与 page tree | P0 |
task-038 |
E-4 | 挂载 leptos-tiptap island 并证明可编辑 | P0 |
task-039 |
E-5 | 树事件与编辑保存联动回归 | P1 |
10. 完成判定
task120在当前3000通过。task121在当前3000通过。- 左栏页面树来自真实 projection。
- 根页不再用设计稿静态列表伪装主内容。
- 文档页有真实
leptos-tiptap可编辑 surface。 - 保存后 Page Aggregate / reload 可读回。
3-8可移动到done后,本 checklist 才能进入完成评估。