docs: update rust web design status

This commit is contained in:
lix-2026
2026-04-29 16:33:15 +08:00
parent 6ddc95412c
commit 559c5ce652
4 changed files with 563 additions and 20 deletions
@@ -0,0 +1,49 @@
# 3-12 [done] Rust Web 3000 Stitch UI Parity Checklist v1
> 更新时间:2026-04-29
>
> 迁入 done:本清单所有输入、约束、实施项与验收项均已完成,并已通过 Rust 单测与 task119/task120/task121/task122 smoke 复核。
>
> 目标:以 `design/design/stitch/260429` 的 Stitch 产物为视觉基准,把 3000 的 Rust Web 页面推进到更接近目标 UI,同时保留真实页面树、文件树、页面新建和 `leptos-tiptap` runtime。
## 输入基准
- [x] 读取 Stitch 设计系统:`DESIGN.md`
- [x] 读取 Stitch 静态结构:`code.html`
- [x] 查看目标截图:`screen.png`
- [x] 对比当前 3000 截图:`/mnt/Data1T/mnote/tmp/image copy 33.png`
## 约束
- [x] 不直接整包复制 Stitch HTML,避免绕开 Rust projection / tree shell / editor island。
- [x] 不恢复 Next.js 为主入口,3000 继续由 `mnote-web` 承载。
- [x] 页面树、文件树、新建页面、正文编辑继续使用当前已接入的运行链路。
- [x] 不引入 Tailwind CDN、Google Fonts、远程图片作为运行依赖。
## 实施项
- [x] 侧栏外壳对齐 Stitch:240px 左栏、浅灰无硬边框、工作区头像/标题、快捷操作区、底部入口。
- [x] 侧栏内容对齐 Stitch:星标置顶、我的页面、Explorer tab 同屏呈现,并保留真实页面树和文件树 DOM/testid。
- [x] 页面树/文件树行样式对齐 Stitch:12px 层级缩进、14px 文本、soft-bleed hover、当前页选中态。
- [x] 顶栏对齐 Stitch:44px 高度、左侧面包屑、右侧 Public/收藏/历史/AI/搜索/更多工具。
- [x] 文档画布对齐 Stitch:居中 880px 内容列、80px 顶部留白、页面图标、标题、元信息、分割线。
- [x] `leptos-tiptap` 外壳对齐 Stitch:编辑器跟随文档列宽、正文 16px/1.6、空态提示不遮挡真实编辑器。
- [x] 浮动按钮对齐 Stitch:右下帮助按钮 + 绿色 AI 圆形按钮。
- [x] 首页 active page 链路不退化:根页仍能看到真实 sidebar,并可打开当前页。
- [x] 验证 Rust 单测和关键 smoke,确保树与编辑器 runtime 未断开。
## 验收
- [x] `cargo test -p mnote-web` 通过。
- [x] 至少一个文档 shell smoke 通过,确认 `wolai-sidebar`、页面树、文件树、`leptos_tiptap_island` 仍存在。
- [x] 如 3000 服务可用,使用浏览器截图或 DOM 检查确认首屏侧栏、顶栏、文档画布接近 Stitch 目标。
## 验证记录
- [x] `cargo test -p mnote-web`126 个单测通过,doc tests 4 个 ignored。
- [x] `node scripts/task119-rust-web-wolai-visual-regression-smoke.js`:通过,截图 `test-results/task119-rust-web-wolai-visual-regression-root.png`
- [x] `node scripts/task120-rust-web-tree-integration-smoke.js`:通过。
- [x] `node scripts/task121-rust-web-editor-island-hydration-smoke.js`:通过,确认 hydrate、输入、保存、reload 读回。
- [x] `node scripts/task122-rust-web-create-page-ui-smoke.js`:通过,确认侧栏 `+` 新建页面并进入文档页。
- [x] 手动 Playwright 截图:`test-results/task123-stitch-document-parity.png`,确认文档页头、真实页面树/文件树、编辑器正文列对齐。
- [x] 修复 `我的页面 / Explorer` 切换:文件树不再作为第二个独立 Explorer section 渲染,点击 Explorer tab 后切换到文件树 panel。
@@ -1,6 +1,6 @@
# 3-1 [process] Rust Web 长期架构实施清单 v2
> 更新时间:2026-04-28
> 更新时间:2026-04-29
>
> 基于以下实际状态重写:
> - 当前未提交代码
@@ -29,6 +29,8 @@
> 这份清单仍保留为 Rust Web 分阶段全景参考,但当前最近一步不再是泛化推进全部 `Phase`,
> 而是优先推进 `Page Aggregate`、`tree command cutover`、`tree realtime event stream`。
> 当前执行优先级请先看 `/mnt/Data1T/mnote/design/01-05-current-priority-overview.md`。
>
> 复核补充(2026-04-29):`3000` 默认 owner 已是 `mnote-web`,根页 / 文档页 / `tree events` / `leptos-tiptap` island 已进入 Rust Web 主链;本清单继续保留在 `process/`,因为主 API 全量迁移、旧 Next/React 链清理、Search/AI/Mindmap 轻壳化仍未完成。
---
@@ -41,6 +43,7 @@
- [x] `Phase 0` 的文档化边界梳理已经完成
- [x] `Phase 1` 已落了一个最小 `axum` Web 骨架:`rust/crates/mnote-web/`
- [x] `Phase 1` 已不再只是空骨架,现已包含 kernel / bridge / compat sidebar 的真实查询接缝
- [x] `Phase 1` 已成为 `3000` 主 Web 入口 owner,根页、文档页、tree stream 与主要 shell marker 均由 `mnote-web` 输出
- [x] `Phase 2` 文档阅读态分离已经有实质代码
- [x] `Phase 3` 主 Sidebar 已出现 `kernelSidebarTree` 消费接缝
- [x] `Phase 4` 搜索已做 host/runtime 拆分,并开始返回 `nodeId` / `subtreeRootId` / `evidence`
@@ -50,8 +53,9 @@
### 2.2 但大部分阶段都只是“部分落地”
- [ ] `Phase 1` 还不是主 Web 路径,只是 Rust Web skeleton
- [ ] `Phase 3` Sidebar 仍是超大客户端组件,其他树域也未统一切到 kernel projection
- [x] `Phase 1` 已不再只是 skeleton`3000` 默认 owner 已是 Rust Web,根页 / 文档页 SSR 产品壳已进入主路径
- [ ] `Phase 1` 的主 API 全量迁移与 legacy compat 清理仍未完成
- [ ] `Phase 3` legacy Sidebar 仍是超大客户端组件;当前 Rust Web 3000 已有页面树 / 文件树 SSR tab host,但 live stream 消费侧还未完全闭环
- [ ] `Phase 4` 搜索仍是前端 runtime 主导,不是 server-first 搜索页
- [ ] `Phase 5` AI runtime 仍然很重,只是懒挂载了
- [ ] `Phase 6` Mindmap 仍然是重前端交互壳,不是独立对象页壳
@@ -60,7 +64,7 @@
### 2.3 结论
> **当前真实状态不是“Phase 0 ~ 8 已全部完成”,而是“Phase 0 基本完成,Phase 1/2/4/5/6/7 处于不同程度的部分落地,Phase 3 仍需继续收口;Phase 8 已完成主入口 owner cutover,但旧 Next/React 链仍作为 legacy compat / island source 保留”。**
> **当前真实状态不是“Phase 0 ~ 8 已全部完成”,而是“Phase 0 的 Rust Web 主入口和页面壳目标已完成,但主 API 迁移仍处于部分落地;Phase 2/4/5/6/7 处于不同程度的部分落地,Phase 3 的 3000 SSR 树壳已补实但 legacy Sidebar 与 live stream 消费侧仍需继续收口;Phase 8 已完成主入口 owner cutover,但旧 Next/React 链仍作为 legacy compat / island source 保留”。**
---
@@ -99,7 +103,7 @@
| 阶段 | v1 口径 | 当前真实状态 | 说明 |
| --- | --- | --- | --- |
| Phase 0 | 边界冻结 | `DONE` | 文档、候选模块、边界口径已经成形,但性能基线更多还是文档定义,不是完整观测系统 |
| Phase 1 | Rust Web 基础层 | `PARTIAL` | `mnote-web`创建,`axum` 骨架已存在,且已补 bridge route、通用 query transport 与 Sidebar compat 切流入口,但仍不是整个产品的主 Web 入口 |
| Phase 1 | Rust Web 基础层 | `PARTIAL` 接近 `DONE` | `mnote-web`成为 `3000` 主 Web 入口 owner,根页 / 文档页 SSR 产品壳、tree stream 与关键 API 接缝已落地;主 API 全量迁移、compat 清理与 legacy island source 清理仍未完成 |
| Phase 2 | 文档阅读页 server-first 化 | `PARTIAL` 接近 `DONE` | 阅读态/编辑态已明显分离,但仍有旧链回退和大量客户端状态集中在 `DocumentContent` |
| Phase 3 | Sidebar / 树结构 Rust 化 | `PARTIAL` 偏早期 | 主 Sidebar 已以 `kernelSidebarTree` 作为主树来源,但整体仍是超大客户端组件 |
| Phase 4 | 搜索 Rust 化与 island 化 | `PARTIAL` | host/runtime 懒加载拆分已做,结果形状也开始带 `nodeId` / `subtreeRootId` / `evidence`,但仍未完成 server-first 搜索页 |
@@ -136,7 +140,7 @@
## 6. Phase 1Rust Web 基础层落地
**当前状态:`PARTIAL`**
**当前状态:`PARTIAL` 接近 `DONE`;主入口和页面壳已完成,主 API 迁移与 compat 清理仍未完成**
### 6.1 已落地事实
@@ -158,22 +162,29 @@
- [compat.rs](/mnt/Data1T/mnote/rust/crates/mnote-web/src/routes/compat.rs)
- [x] kernel sidebar route 已通过 `sidebar.dataset.list` runtime plan + 通用 query transport 读取数据集
- [kernel.rs](/mnt/Data1T/mnote/rust/crates/mnote-web/src/routes/kernel.rs)
- [x] `3000` 默认 owner 已是 `mnote-web``GET /` 返回 Rust Web workspace shell
- [gateway.rs](/mnt/Data1T/mnote/rust/crates/mnote-web/src/gateway.rs)
- [home.rs](/mnt/Data1T/mnote/rust/crates/mnote-web/src/ssr/pages/home.rs)
- [x] 已有主页面壳 SSR`/documents/:id` 输出 Rust Web document shell、Page Aggregate marker 与 `leptos_tiptap_island` marker
- [web_shell.rs](/mnt/Data1T/mnote/rust/crates/mnote-web/src/routes/web_shell.rs)
- [document.rs](/mnt/Data1T/mnote/rust/crates/mnote-web/src/ssr/pages/document.rs)
- [x] Rust Web 已承接 tree commands、tree events、page aggregate、document save/title/options 等当前 3000 主链关键接缝
- [x] 已用 task114/task115/task118/task119/task120/task121/task122 建立页面壳级和树 / 编辑器 runtime smoke 验证
### 6.2 明确还没完成
### 6.2 仍未完成
- [ ] `mnote-web` 还不是主 Web 服务入口
- [ ] 还没有主页面壳 SSR
- [ ] 还没有主 API 大面积从 Next route 切到 Rust Web
- [ ] 主 API 还没有大面积全量从 Next route / legacy compat 迁出
- [ ] 当前 `compat_next_base_path` 仍说明它还带有兼容层属性,不是唯一承载层
- [ ] fixture 已收口到测试/开发边界,但这还不等于整个产品流量已经全面切到 Rust Web
- [ ] 还不能说“后续页面迁移已不依赖 Next API route 作为唯一入口”,只能说“已经开始脱钩”
- [ ] Next App Router / React islands 仍作为 legacy compat 与部分 bundle source 保留
- [ ] 复杂 runtime、OnlyOffice、历史 debug 链与旧前端代码还未完全清理
### 6.3 v2 后续任务
- [ ]`mnote-web` 从 skeleton 提升为真实服务入口
- [ ] 把 sidebar kernel route 上的 fixture fallback 收到测试/开发边界,承接一条真实页面壳真实查询主链
- [ ] 明确 Next -> Rust Web 的流量切换边界
- [ ] 增加主 API / 页面壳级集成验证,而不只是 `cargo check`
- [x]`mnote-web` 从 skeleton 提升为真实服务入口
- [x] 把 sidebar kernel route 上的 fixture fallback 收到测试/开发边界,承接真实页面壳真实查询主链
- [x] 明确 Next -> Rust Web 的流量切换边界`3000``mnote-web`Next 降为 legacy compat / island source
- [x] 增加页面壳级集成验证,而不只是 `cargo check`
- [ ] 继续迁移剩余主 API,收缩 `compat_next_base_path` 与 legacy upstream 依赖
---
@@ -222,13 +233,16 @@
- [sidebar.tsx](/mnt/Data1T/mnote/wolai-frontend/src/components/sidebar/sidebar.tsx)
- [x] 已补统一 `page_tree` projection protocol,并让 `PrivateTree` / 文件树 / move-embed picker 共用
- [tree-projection.ts](/mnt/Data1T/mnote/wolai-frontend/src/lib/tree-projection.ts)
- [x] Rust Web 3000 workspace shell 已接入真实页面树 / 文件树 tab host、真实 row、UI 新建页面和 active page 链路
- [workspace_shell.rs](/mnt/Data1T/mnote/rust/crates/mnote-web/src/workspace_shell.rs)
- [layout.rs](/mnt/Data1T/mnote/rust/crates/mnote-web/src/ssr/pages/layout.rs)
### 8.2 当前真实问题
- [ ] `Sidebar` 仍然是超大客户端组件
- [sidebar.tsx](/mnt/Data1T/mnote/wolai-frontend/src/components/sidebar/sidebar.tsx)
- [ ] 页面树 / 文件树虽然已统一协议,但整体执行面仍主要在客户端
- [ ] `buildDocumentTree(...)` 仅剩兼容 helper 与旧单测,不再位于树域主路径
- [ ] 页面树 / 文件树虽然已统一协议,legacy Next 侧整体执行面仍主要在客户端;当前 Rust Web 3000 SSR 壳也尚未直接消费 live EventSource
- [x] `buildDocumentTree(...)` 仅剩兼容 helper 与旧单测,不再位于树域主路径
- [ ] 主布局仍然默认常驻挂载 Sidebar
- [ ] 还不能叫“服务端输出 + 局部 island”,现在更像“服务端首包 + 超大客户端壳”
@@ -1,6 +1,6 @@
# 3-3 [process] Rust Web Tree Realtime Event Stream 方案 v1
> 更新时间:2026-04-17
> 更新时间:2026-04-29
>
> 关联文档:
> - `/mnt/Data1T/mnote/design/02-convex-rust-long-term-architecture/process/2-tree-first-graph-convex-rust-long-term-architecture-v1.md`
@@ -256,3 +256,25 @@ Rust Web 负责:
- Rust Web 提供正式实时 transport
- 前端只消费 projection snapshot 与 tree delta
- iframe/postMessage tree shell 不是正式 realtime 主链
## 9. 当前实现复核(2026-04-29
这份方案继续留在 `process/`,因为 Rust Web transport 已落地,但当前 `3000` 的 Rust SSR tree/sidebar 消费侧还没有完整闭环到 live stream。
### 9.1 已完成
- [x] Rust Web 已暴露正式 `/api/tree/events`,并返回 `x-mnote-web-owner: mnote-web``x-mnote-tree-stream-owner: rust-web`
- [x] `/api/tree/events` 已能输出 workspace / subtree snapshot。
- [x] `stream_support.rs` 已有 cursor、delta、resync 的基础判定逻辑。
- [x] `/api/stream/events` 与 WebSocket snapshot / resync 骨架已存在。
- [x] legacy React 侧已有 `useSidebarTreeStream``EventSource` consumer,并有协议 / delta 单测。
- [x] `task112` / `task120` 已覆盖 `/api/tree/events` snapshot 可用性。
### 9.2 仍未完成
- [ ] 当前 Rust Web 3000 SSR workspace/sidebar shell 还没有直接挂载 live `EventSource` consumer;它主要依赖 SSR snapshot 与交互后重读。
- [ ] delta / resync 尚缺面向当前 3000 Rust shell 的浏览器级 smoke。
- [ ] Sidebar、page subtree、filetree 还没有全部统一到同一条 live stream cache。
- [ ] WS 目前只证明 snapshot/resync 骨架,尚未成为主实时链路。
- [ ] 不能把本稿移动到 `done/`,直到 `3000` 当前主界面的树消费侧也完成 snapshot + delta + resync 验收。