docs: 继续收口设计稿状态与主线口径
This commit is contained in:
-541
@@ -1,541 +0,0 @@
|
||||
# 5-10 [process] Wolai 页面设置与 AI 交互壳对齐方案 v1
|
||||
|
||||
> 更新时间:2026-05-06
|
||||
>
|
||||
> 关联文档:
|
||||
> - `/mnt/Data1T/mnote/ARCHITECTURE.md`
|
||||
> - `/mnt/Data1T/mnote/design/01-05-current-priority-overview.md`
|
||||
> - `/mnt/Data1T/mnote/design/05-editor-mainline/process/5-5-page-aggregate-single-truth-alignment-v1.md`
|
||||
> - `/mnt/Data1T/mnote/design/05-editor-mainline/process/5-6-page-aggregate-alignment-checklist-v1.md`
|
||||
> - `/mnt/Data1T/mnote/design/05-editor-mainline/process/5-7-wolai-page-tree-main-editor-experience-restoration-v1.md`
|
||||
> - `/mnt/Data1T/mnote/design/05-editor-mainline/process/5-9-wolai-aline-continuous-checklist-v1.md`
|
||||
> - `/mnt/Data1T/mnote/design/07-ai/process/7-phase7-ai-kernel-projection-plan-v4.md`
|
||||
> - `/mnt/Data1T/mnote/design/08-wolai-aline-test-flow/process/wolai-aline-test-flow-v1.md`
|
||||
|
||||
## 1. 文档目的
|
||||
|
||||
这份文档只回答一个问题:
|
||||
|
||||
> **在不制造第二份页面真相、不重开一条 AI 执行面的前提下,如何把 `3000` 文档页的“页面设置”和“AI 界面”收口成更接近 Wolai 的交互壳。**
|
||||
|
||||
这次不处理整条文档页体验复刻,也不把评论、协作、演示模式一起打包推进。
|
||||
|
||||
本轮优先级固定为:
|
||||
|
||||
1. 页面设置入口与面板形态
|
||||
2. 页面级 AI 入口与右侧抽屉
|
||||
3. 两者与现有 `Page Aggregate` / `mnote-cli` 主线的接线方式
|
||||
|
||||
一句话收口:
|
||||
|
||||
> **先把“入口和容器”做对,再逐项把内部动作接到现有正式命令链。**
|
||||
|
||||
---
|
||||
|
||||
## 2. 当前判断
|
||||
|
||||
### 2.1 当前 `3000` 的问题不是“没有能力”,而是“能力挂错了壳”
|
||||
|
||||
当前仓库里已经有可复用能力:
|
||||
|
||||
- 页面设置 UI 已存在:`PageOptionsSidebar`
|
||||
- 页面设置写链已存在:`page.layout.updateOptions`
|
||||
- 页面 AI host 已存在:`DocumentAiAgentPanel`
|
||||
- AI 执行面已收口到 `mnote-cli` host / client
|
||||
- 评论 drawer、历史 drawer、分享 dialog 都已有各自最小实现
|
||||
|
||||
但当前现网文档页仍然存在两个明显错位:
|
||||
|
||||
- 页面设置还是“右侧整块 inspector”思路,不是 Wolai 的右上角 `...` 贴边 popover
|
||||
- 页面 AI 主要还是顶栏“页面AI”按钮思路,不是 Wolai 的右下角浮动入口 + 右侧抽屉
|
||||
|
||||
因此本轮不应重写一套新产品,而应优先做:
|
||||
|
||||
> **现有能力重新编排到正确交互壳。**
|
||||
|
||||
### 2.2 当前不该做的事
|
||||
|
||||
本轮明确不做:
|
||||
|
||||
- 不新造第二套页面设置数据结构
|
||||
- 不新造第二套页面 AI runtime
|
||||
- 不把 Web AI 面板重新升格成独立 AI 编排主线
|
||||
- 不为了像 Wolai 而把评论、协作、成员、演示模式一并拉进首批实现
|
||||
- 不在 Rust SSR 和 React compat 层同时各做一套相同按钮逻辑
|
||||
|
||||
---
|
||||
|
||||
## 3. Wolai 基线
|
||||
|
||||
2026-05-06 已通过 `wolai-aline` 基线取证得到当前 Wolai 行为证据,截图目录:
|
||||
|
||||
- `/mnt/Data1T/mnote/tmp/wolai-editor-parity/page-settings-ai-baseline/`
|
||||
|
||||
关键结论如下。
|
||||
|
||||
### 3.1 页面设置
|
||||
|
||||
- 入口位于右上角 `...`
|
||||
- hover tooltip 为“页面选项和全局选项”
|
||||
- 点击后打开右侧贴边 `popover`,不是 modal,也不是新页面
|
||||
- URL 保持不变
|
||||
- 没有遮罩,不压暗背景
|
||||
- 关闭方式为:
|
||||
- `Esc`
|
||||
- 点击页面空白处
|
||||
- 再次点击同一入口
|
||||
- 顶部为 `页面选项 / 自定义页面 / 全局选项` 三个 tab
|
||||
- 可见开关为 checkbox 形态
|
||||
- 当前主 tab 内有:
|
||||
- `自适应宽度`
|
||||
- `小字体`
|
||||
- `标题目录`
|
||||
- `标题自动编号`
|
||||
- `编辑保护`
|
||||
- 下方还有动作项:
|
||||
- `删除页面`
|
||||
- `移动到...`
|
||||
- `嵌入到...`
|
||||
- `页面历史...`
|
||||
- `公开分享页面...`
|
||||
|
||||
### 3.2 AI 界面
|
||||
|
||||
- 入口位于右下角浮动 `AI` 按钮
|
||||
- 点击后打开右侧抽屉,不改 URL
|
||||
- 抽屉没有遮罩,不压暗背景
|
||||
- 当前关闭方式只有右上角 `X`
|
||||
- `Esc` 无效
|
||||
- 点击页面空白处无效
|
||||
- 入口按钮在抽屉打开后被覆盖,不承担 toggle 关闭语义
|
||||
- 抽屉标题为“智能问答”
|
||||
- 中部存在推荐问题/快捷入口
|
||||
- 底部存在会话区、模型入口、输入框和发送按钮
|
||||
|
||||
这说明本轮对齐的最小行为合同已经足够明确:
|
||||
|
||||
> **页面设置是“顶栏入口 + 贴边 popover”;页面 AI 是“右下角入口 + 右侧抽屉”。**
|
||||
|
||||
---
|
||||
|
||||
## 4. 设计原则
|
||||
|
||||
### 4.1 页面设置继续服从 `Page Aggregate`
|
||||
|
||||
页面设置只能是:
|
||||
|
||||
- `pageOptions`
|
||||
- `editorRuntimePageOptions`
|
||||
- 对应的 `page.layout.updateOptions`
|
||||
|
||||
不能变成:
|
||||
|
||||
- 某个单独 UI 组件内部维护的临时配置真相
|
||||
- 一套只在文档页壳层生效、却不进入主编辑器 runtime 的新设置体系
|
||||
|
||||
因此,页面设置改造的重点不是多做几个开关,而是:
|
||||
|
||||
> **把现有设置项放进更接近 Wolai 的容器,同时继续显式区分“已正式接通”和“仅保存字段/待接通”。**
|
||||
|
||||
### 4.2 页面 AI 继续服从 `CLI-first`
|
||||
|
||||
页面 AI 界面可以继续做产品壳,但它不能重新变成独立执行面。
|
||||
|
||||
当前长期方向已经明确:
|
||||
|
||||
- `mnote-cli` 是唯一长期 agent 执行面
|
||||
- Web AI 面板只是 host / client
|
||||
|
||||
因此本轮 AI 界面改造只处理:
|
||||
|
||||
- 入口位置
|
||||
- 抽屉壳形态
|
||||
- 页面级上下文绑定
|
||||
- 与现有 `DocumentAiAgentPanel` 的挂载方式
|
||||
|
||||
本轮不处理:
|
||||
|
||||
- AI runtime 重写
|
||||
- 新模型编排
|
||||
- 新工具协议
|
||||
- 第二套全局 AI 路由
|
||||
|
||||
### 4.3 先对齐容器语义,再推进动作项
|
||||
|
||||
Wolai 里页面设置和 AI 的第一感受,首先是:
|
||||
|
||||
- 从哪里打开
|
||||
- 打开成什么容器
|
||||
- URL 是否变化
|
||||
- 如何关闭
|
||||
|
||||
这四项比内部是否一开始就全部可用更重要。
|
||||
|
||||
因此本轮优先级必须是:
|
||||
|
||||
1. 入口位置和按钮密度对齐
|
||||
2. 容器形态和开关语义对齐
|
||||
3. 内部动作项逐项复用现有能力
|
||||
|
||||
---
|
||||
|
||||
## 5. 本轮范围
|
||||
|
||||
### 5.1 范围内
|
||||
|
||||
- 文档页 owner 态右上角 `...` 页面设置入口
|
||||
- 页面设置 `popover` 容器
|
||||
- 页面设置 `tablist` 和最小项分组
|
||||
- 页面设置最小动作项接线策略
|
||||
- 文档页右下角浮动 `AI` 入口
|
||||
- 页面 AI 右侧抽屉容器
|
||||
- 页面 AI 与现有 `DocumentAiAgentPanel` 的页面级绑定
|
||||
- 相应 smoke、截图和差异矩阵
|
||||
|
||||
### 5.2 暂不进入本轮
|
||||
|
||||
- 演示模式
|
||||
- 页面评论
|
||||
- 页面协作
|
||||
- 成员邀请
|
||||
- 完整公开分享体验重做
|
||||
- 全局 AI 面板收口
|
||||
- 帮助中心浮动入口的完整 Wolai 化
|
||||
- AI 内部推荐内容、模型文案、提示词体系大改
|
||||
|
||||
补充:
|
||||
|
||||
- `页面历史...` 和 `公开分享页面...` 因为当前已有最小能力,可以作为本轮页面设置动作项的优先复用对象
|
||||
- 评论、协作、成员这类能力虽然在 Wolai 顶栏可见,但当前不进入首批实现
|
||||
|
||||
---
|
||||
|
||||
## 6. 目标交互合同
|
||||
|
||||
## 6.1 页面设置
|
||||
|
||||
### 6.1.1 入口
|
||||
|
||||
- 入口继续位于文档页右上角操作区
|
||||
- 视觉上以 `...` 弱按钮承载
|
||||
- tooltip 调整为“页面选项和全局选项”
|
||||
- 不再把“页面设置”理解成常驻右侧栏
|
||||
|
||||
### 6.1.2 容器
|
||||
|
||||
- 使用右侧贴边 `popover`
|
||||
- 不使用全屏 modal
|
||||
- 不使用带遮罩的 `Sheet`
|
||||
- 打开后 URL 不变
|
||||
- 面板宽度以 Wolai 的紧凑设置面板为准,不沿用当前宽侧栏比例
|
||||
|
||||
### 6.1.3 关闭语义
|
||||
|
||||
- `Esc` 关闭
|
||||
- 点击空白关闭
|
||||
- 再次点击入口关闭
|
||||
|
||||
### 6.1.4 内容结构
|
||||
|
||||
顶部固定三 tab:
|
||||
|
||||
- `页面选项`
|
||||
- `自定义页面`
|
||||
- `全局选项`
|
||||
|
||||
页面选项首批保留并对齐的设置项:
|
||||
|
||||
- `wideLayout`
|
||||
- `smallText`
|
||||
- `showToc`
|
||||
- `showHeadingNumbers`
|
||||
- `protectEditing`
|
||||
|
||||
自定义页面首批保留:
|
||||
|
||||
- `pageFont`
|
||||
- `layoutDensity`
|
||||
- `collapseBacklinks`
|
||||
- `hideChildPages`
|
||||
- `showBlockRefCount`
|
||||
- `embedDefaultBlockId`
|
||||
|
||||
全局选项首批只保留当前已有全局偏好中与文档体验直接相关的最小项,不在本轮扩面。
|
||||
|
||||
### 6.1.5 动作项
|
||||
|
||||
页面设置面板中的动作项分三类:
|
||||
|
||||
1. 本轮直接接线
|
||||
- `页面历史...`
|
||||
- `公开分享页面...`
|
||||
|
||||
2. 本轮保留入口但延后落地
|
||||
- `移动到...`
|
||||
- `嵌入到...`
|
||||
- `删除页面`
|
||||
|
||||
3. 本轮不放入页面设置面板
|
||||
- 评论
|
||||
- 协作
|
||||
- 成员邀请
|
||||
- 演示模式
|
||||
|
||||
设计原因:
|
||||
|
||||
- `历史` 和 `分享` 当前已有组件可复用
|
||||
- `移动到 / 嵌入到 / 删除` 与树命令、确认流和 picker 交互更深,应拆成后续小任务
|
||||
- 评论/协作不在本轮优先级内
|
||||
|
||||
## 6.2 页面 AI
|
||||
|
||||
### 6.2.1 入口
|
||||
|
||||
- 文档页主入口改为右下角浮动 `AI` 按钮
|
||||
- 顶栏“页面AI”不再作为主入口
|
||||
- 首批可以先去掉顶栏 `页面AI`,或把它降为 debug/临时入口,不再作为默认视觉路径
|
||||
|
||||
### 6.2.2 容器
|
||||
|
||||
- 使用右侧抽屉
|
||||
- 不使用遮罩
|
||||
- 打开后 URL 不变
|
||||
- 抽屉属于“页面级 AI”,不是全局 AI
|
||||
|
||||
### 6.2.3 关闭语义
|
||||
|
||||
- 右上角 `X` 关闭
|
||||
- `Esc` 不关闭
|
||||
- 点击页面空白不关闭
|
||||
- 不要求入口按钮承担 toggle 关闭
|
||||
|
||||
### 6.2.4 内容结构
|
||||
|
||||
抽屉内部继续复用现有 `DocumentAiAgentPanel` 与其 runtime。
|
||||
|
||||
本轮只改:
|
||||
|
||||
- 外层 chrome
|
||||
- 标题区与关闭按钮
|
||||
- 页面级容器布局
|
||||
- 文档页入口位置和打开方式
|
||||
|
||||
本轮不改:
|
||||
|
||||
- `mnote-cli` 执行链
|
||||
- 工具注册表
|
||||
- 页面 AI 读写命令族
|
||||
- AI 输出协议
|
||||
|
||||
### 6.2.5 页面级与全局级边界
|
||||
|
||||
页面文档内优先展示“页面级 AI”。
|
||||
|
||||
全局 AI 继续保留其现有能力,但不在本轮文档页里抢主入口。长期关系应为:
|
||||
|
||||
- 文档页浮动 AI:页面上下文优先
|
||||
- 全局 AI:跨页面/全局工作区能力
|
||||
|
||||
---
|
||||
|
||||
## 7. 实现落点
|
||||
|
||||
## 7.1 顶栏与入口层
|
||||
|
||||
当前文档页右上角操作主入口仍由:
|
||||
|
||||
- `wolai-frontend/src/components/breadcrumb.tsx`
|
||||
|
||||
负责。
|
||||
|
||||
因此本轮入口层优先落在 React compat 主路径,而不是先去大改 Rust SSR 占位按钮。
|
||||
|
||||
首批调整建议:
|
||||
|
||||
- `Breadcrumb` 负责右上角 `...` 入口
|
||||
- `Breadcrumb` 不再突出“页面AI”主按钮
|
||||
- 浮动 AI 入口改由文档页内容壳或页面级 host 提供
|
||||
|
||||
理由:
|
||||
|
||||
- 当前现网入口真正在这里
|
||||
- 直接改这里可以最小改动验证体验
|
||||
- 先把交互壳对齐,再决定 Rust SSR 侧是否同步收口
|
||||
|
||||
## 7.2 页面设置面板组件
|
||||
|
||||
当前 `PageOptionsSidebar` 是一个“常驻侧栏”组件,形态上不适合直接复用为 Wolai popover。
|
||||
|
||||
建议拆成两层:
|
||||
|
||||
1. `PageOptionsPanelContent`
|
||||
- 只负责 tab、设置项、动作项内容
|
||||
- 不假设自己是 `aside`
|
||||
|
||||
2. `PageOptionsPopover`
|
||||
- 负责定位、宽度、开关语义、关闭语义
|
||||
- 作为文档页 owner 态页面设置入口的正式容器
|
||||
|
||||
同时保留:
|
||||
|
||||
- `PageOptionsSidebar`
|
||||
|
||||
作为兼容/开发容器,避免 dev playground 与旧测试全部失效。
|
||||
|
||||
### 7.2.1 页面设置状态
|
||||
|
||||
当前 `usePageLayoutStore.showInspector` 语义过于偏“右侧常驻 inspector”。
|
||||
|
||||
本轮建议把它改造成更接近“页面 chrome 状态”的命名,例如:
|
||||
|
||||
- `pageSettingsOpen`
|
||||
|
||||
或等价 surface state,但不要把 AI 和页面设置混成一个大 store。
|
||||
|
||||
最小原则:
|
||||
|
||||
- 页面设置开关状态独立
|
||||
- 不影响 AI drawer store
|
||||
- 不重新发明 `pageOptions` 数据真相
|
||||
|
||||
## 7.3 页面设置动作项接线
|
||||
|
||||
动作项接线优先复用现有能力:
|
||||
|
||||
- `页面历史...` -> `DocumentHistoryDrawer`
|
||||
- `公开分享页面...` -> `DocumentShareDialog`
|
||||
|
||||
本轮延后:
|
||||
|
||||
- `移动到...`
|
||||
- `嵌入到...`
|
||||
- `删除页面`
|
||||
|
||||
这些项可以先作为 disabled/coming soon,或只在 checklist 中保留为后续项,但不要假装完成。
|
||||
|
||||
## 7.4 页面 AI host
|
||||
|
||||
页面 AI 的正式 runtime 继续使用:
|
||||
|
||||
- `DocumentAiAgentPanel`
|
||||
- `DocumentAiAgentPanel.runtime`
|
||||
|
||||
本轮只需要把“谁来打开它、以什么容器打开它”改对。
|
||||
|
||||
建议:
|
||||
|
||||
- 页面级浮动 AI 入口挂在 `DocumentContent` 这一层
|
||||
- 页面 AI 打开状态继续用 `useAiAgentUiStore.documentAgentOpen`
|
||||
- 页面 AI 可用态继续由 `DocumentAiAgentPanel` mount 生命周期维护
|
||||
|
||||
需要避免:
|
||||
|
||||
- 再新增一份 `PageAiDrawer` 独立 runtime
|
||||
- 把页面 AI 又接回 `GlobalAiAgentHost`
|
||||
|
||||
## 7.5 与 Rust SSR 的关系
|
||||
|
||||
Rust `mnote-web` 当前在文档壳中已有顶栏占位按钮与右下角浮动按钮。
|
||||
|
||||
本轮不把 Rust SSR 作为首批真实交互 owner,原因是:
|
||||
|
||||
- 当前现网文档页真实入口仍由 React compat 壳主导
|
||||
- 先在 React compat 层做对入口与容器,风险更低
|
||||
- 等行为稳定后,再决定是否把 Rust SSR 占位按钮收口到同一 contract
|
||||
|
||||
这意味着本轮的正确做法是:
|
||||
|
||||
> **先统一产品行为合同,再决定是否让 Rust SSR 与 React compat 共用同一套入口渲染。**
|
||||
|
||||
---
|
||||
|
||||
## 8. 分阶段实施建议
|
||||
|
||||
## 8.1 Phase A:设计与基线冻结
|
||||
|
||||
- 固定 Wolai 页面设置和 AI 抽屉的动作链基线
|
||||
- 新增专属 checklist
|
||||
- 明确哪些页面设置项本轮保留、隐藏、降级
|
||||
- 明确页面 AI 与全局 AI 的入口边界
|
||||
|
||||
## 8.2 Phase B:页面设置交互壳
|
||||
|
||||
- 把 `PageOptionsSidebar` 抽成可复用内容组件
|
||||
- 文档页顶栏 `...` 接入 `PageOptionsPopover`
|
||||
- 对齐关闭语义、URL 不变、无遮罩
|
||||
- 最小接线 `历史` 与 `分享`
|
||||
|
||||
## 8.3 Phase C:页面 AI 交互壳
|
||||
|
||||
- 增加右下角浮动 `AI` 入口
|
||||
- 让页面 AI 通过右侧抽屉打开
|
||||
- 去掉顶栏“页面AI”主入口地位
|
||||
- 对齐 AI drawer 的关闭语义
|
||||
|
||||
## 8.4 Phase D:动作项与回归补齐
|
||||
|
||||
- 页面设置中逐步接通 `移动到 / 嵌入到 / 删除`
|
||||
- 评估是否追加帮助浮动入口对齐
|
||||
- 为 owner/published 两种状态补差异 smoke
|
||||
|
||||
---
|
||||
|
||||
## 9. 风险与约束
|
||||
|
||||
### 9.1 双 owner 风险
|
||||
|
||||
当前 `3000` 仍有:
|
||||
|
||||
- Rust SSR 产品壳
|
||||
- React compat 真正交互壳
|
||||
|
||||
如果同时在两边各自补交互,容易再次分裂。
|
||||
|
||||
本轮约束:
|
||||
|
||||
> **入口行为先只认一套真实 owner。**
|
||||
|
||||
### 9.2 页面设置“看起来能改,实际没生效”的风险
|
||||
|
||||
这仍是页面设置线的核心风险。
|
||||
|
||||
本轮约束:
|
||||
|
||||
- 未接通项继续显式降级
|
||||
- 不因为换成 Wolai 容器就把所有项都宣称正式可用
|
||||
|
||||
### 9.3 页面 AI 重复造轮子的风险
|
||||
|
||||
如果为了像 Wolai 而新做一层 AI drawer runtime,会直接偏离 `CLI-first`。
|
||||
|
||||
本轮约束:
|
||||
|
||||
> **页面 AI 只换壳,不换执行面。**
|
||||
|
||||
### 9.4 范围失控风险
|
||||
|
||||
页面设置一旦带上评论、成员、协作、演示模式,很容易从“交互壳对齐”膨胀成“整页顶栏重做”。
|
||||
|
||||
本轮约束:
|
||||
|
||||
- 优先做页面设置
|
||||
- 优先做页面 AI
|
||||
- 其他项延后
|
||||
|
||||
---
|
||||
|
||||
## 10. 验收标准
|
||||
|
||||
只有同时满足以下条件,才可以说这条线进入实现阶段:
|
||||
|
||||
- 页面设置入口、容器、关闭语义已和 Wolai 基线一致
|
||||
- 页面 AI 入口、容器、关闭语义已和 Wolai 基线一致
|
||||
- 页面设置仍继续走 `page.layout.updateOptions`
|
||||
- 页面 AI 仍继续走 `DocumentAiAgentPanel -> mnote-cli`
|
||||
- 没有新增第二套页面设置真相
|
||||
- 没有新增第二套页面 AI 执行面
|
||||
- 评论、协作、成员、演示模式没有被混入首批范围
|
||||
|
||||
本轮完成后的正确口径应是:
|
||||
|
||||
> **文档页“页面设置”和“AI 界面”的交互壳开始按 Wolai 收口,但页面域单一真源与 CLI-first AI 的主线保持不变。**
|
||||
-359
@@ -1,359 +0,0 @@
|
||||
# 5-11 [process] Wolai 页面设置与 AI 交互壳连续执行 checklist v1
|
||||
|
||||
> 更新时间:2026-05-06
|
||||
>
|
||||
> 本清单服务于:
|
||||
> - `/mnt/Data1T/mnote/design/05-editor-mainline/process/5-10-wolai-page-settings-and-ai-surface-alignment-v1.md`
|
||||
>
|
||||
> 执行口径继续统一服从:
|
||||
> - `/home/lix/.codex/skills/wolai-aline/SKILL.md`
|
||||
> - `/mnt/Data1T/mnote/design/08-wolai-aline-test-flow/process/wolai-aline-test-flow-v1.md`
|
||||
|
||||
## 1. 使用方式
|
||||
|
||||
每次只领取一个最小行为,按下面闭环推进:
|
||||
|
||||
1. 用一句话定义行为,例如“右上角 `...` 打开页面设置 popover 且 URL 不变”。
|
||||
2. 派 subagent 先取 Wolai 基线。
|
||||
3. 主线程复核截图并填写差异矩阵。
|
||||
4. 新增或更新本地 smoke,先让当前实现失败。
|
||||
5. 小范围实现,不新造第二份页面真相或 AI 执行面。
|
||||
6. 运行本地 smoke 和相关单测。
|
||||
7. 再派 subagent 对 Wolai 与本地复测。
|
||||
8. 主线程复核最终截图。
|
||||
9. 更新本清单状态、证据路径和剩余差异。
|
||||
|
||||
状态标记:
|
||||
|
||||
- `TODO`:未开始
|
||||
- `BASELINE`:Wolai 基线已取
|
||||
- `RED`:本地失败 smoke 已存在
|
||||
- `GREEN`:本地实现与 smoke 已通过
|
||||
- `PARITY`:subagent 复测和主线程截图复核通过
|
||||
- `BLOCKED`:存在阻塞
|
||||
|
||||
---
|
||||
|
||||
## 2. 当前基线证据
|
||||
|
||||
2026-05-06 已完成 Wolai 页面设置与 AI 界面的只读基线取证,目录:
|
||||
|
||||
- `/mnt/Data1T/mnote/tmp/wolai-editor-parity/page-settings-ai-baseline/`
|
||||
|
||||
当前已确认事实:
|
||||
|
||||
| 项 | Wolai 证据 | 当前结论 |
|
||||
| --- | --- | --- |
|
||||
| 页面设置入口 | `/mnt/Data1T/mnote/tmp/wolai-editor-parity/page-settings-ai-baseline/10-page-settings-open.png` | 右上角 `...` 打开右侧贴边 popover,URL 不变 |
|
||||
| 页面设置关闭 | `/mnt/Data1T/mnote/tmp/wolai-editor-parity/page-settings-ai-baseline/11-page-settings-after-esc.png` `/mnt/Data1T/mnote/tmp/wolai-editor-parity/page-settings-ai-baseline/13-page-settings-after-outside-click.png` `/mnt/Data1T/mnote/tmp/wolai-editor-parity/page-settings-ai-baseline/15-page-settings-after-reclick.png` | `Esc`、点击空白、再次点击入口都可关闭 |
|
||||
| 页面设置结构 | `/mnt/Data1T/mnote/tmp/wolai-editor-parity/page-settings-ai-baseline/10-page-settings-open.json` | 3 个 tab,内部主控件是 checkbox 形态 |
|
||||
| AI 入口 | `/mnt/Data1T/mnote/tmp/wolai-editor-parity/page-settings-ai-baseline/20-ai-open.png` | 右下角浮动 `AI` 按钮打开右侧抽屉,URL 不变 |
|
||||
| AI 关闭 | `/mnt/Data1T/mnote/tmp/wolai-editor-parity/page-settings-ai-baseline/21-ai-after-esc.png` `/mnt/Data1T/mnote/tmp/wolai-editor-parity/page-settings-ai-baseline/23-ai-after-outside-click.png` `/mnt/Data1T/mnote/tmp/wolai-editor-parity/page-settings-ai-baseline/27-ai-after-close-button.png` | `Esc` 和点击空白无效,只能点右上角 `X` |
|
||||
| AI 结构 | `/mnt/Data1T/mnote/tmp/wolai-editor-parity/page-settings-ai-baseline/20-ai-open.json` | 标题“智能问答”,有会话区、模型区、输入框和发送按钮 |
|
||||
|
||||
### 2.1 用户追加截图复核(2026-05-06)
|
||||
|
||||
用户追加的当前 `3000` 截图:
|
||||
|
||||
- `/mnt/Data1T/mnote/tmp/image copy 44.png`
|
||||
- `/mnt/Data1T/mnote/tmp/image copy 45.png`
|
||||
|
||||
当前补充判断:
|
||||
|
||||
- `image copy 44.png` 和 `image copy 45.png` 暴露的是三类真实问题:页面设置 tab-panel 混显、页面设置保存后回退、页面 AI 抽屉没有真实文本返回。
|
||||
- 这三类问题已经在本轮代码修复中逐项落地:
|
||||
- `styles.rs`:补 `[hidden]` surface 样式,修复 `页面选项 / 自定义页面 / 全局选项` 混显。
|
||||
- `documents.rs + bridge-runtime + document.rs + layout.rs`:修复页面设置写链、读链和 SSR 首屏注入,解决“闪一下又复原”。
|
||||
- `compat.rs + layout.rs`:修复真实 `/api/ai-agent/run` 返回文本,页面 AI 默认 provider 对齐为 `hermes`。
|
||||
|
||||
---
|
||||
|
||||
## 3. 通用证据矩阵
|
||||
|
||||
每项必须记录下列字段:
|
||||
|
||||
| 字段 | 要求 |
|
||||
| --- | --- |
|
||||
| Wolai 截图 | 绝对路径,保存在 `/mnt/Data1T/mnote/tmp/wolai-editor-parity/<task>/` |
|
||||
| 本地截图 | 同视口、同动作链截图 |
|
||||
| 入口 | 按钮、菜单、浮动入口、快捷键 |
|
||||
| 关闭路径 | `Esc`、点击空白、再次点击入口、关闭按钮 |
|
||||
| URL | 操作前后是否变化 |
|
||||
| 容器类型 | `popover`、`drawer`、`sheet`、`modal` |
|
||||
| 控件类型 | `checkbox`、`button`、`tab`、`textarea` 等 |
|
||||
| 控件状态 | `checked`、`selected`、`focused`、`disabled`、`active` |
|
||||
| DOM/ARIA | `role`、`aria-*`、`data-testid`、可聚焦性 |
|
||||
| smoke | 对应 `scripts/task*-smoke.js` 或测试文件 |
|
||||
| 剩余差异 | 不允许只写“基本一致” |
|
||||
|
||||
---
|
||||
|
||||
## 4. Phase A:页面设置基线与壳层
|
||||
|
||||
| ID | 状态 | 任务 | 验收要点 |
|
||||
| --- | --- | --- | --- |
|
||||
| A1 | BASELINE | Wolai 页面设置基线 | 已有 2026-05-06 Wolai 基线截图和 JSON |
|
||||
| A2 | GREEN | 本地页面设置入口现状基线 | `task160` 已记录并复测当前文档页右上角 `更多` 打开页面设置容器,URL 不变 |
|
||||
| A3 | GREEN | 页面设置入口 tooltip | `task160` 已断言入口 `title="页面选项和全局选项"` |
|
||||
| A4 | GREEN | 页面设置容器类型 | `task160` 已断言本地打开右侧贴边 `popover`,不再是空按钮 active |
|
||||
| A5 | GREEN | 页面设置 URL 合同 | `task160` 已断言打开和关闭页面设置时 URL 不变化 |
|
||||
| A6 | GREEN | 页面设置关闭语义 | `task160` 已断言 `Esc`、点击空白、再次点击入口全部有效 |
|
||||
| A7 | GREEN | 页面设置 3 tab | `task160` 已在真实后端端口上断言 `页面选项 / 自定义页面 / 全局选项` 的 tab-panel 隔离行为 |
|
||||
| A8 | GREEN | 页面选项主控件形态 | `task160` 已断言首 tab 使用 checkbox 行,而不是旧 inspector 大块按钮 |
|
||||
| A9 | GREEN | 最小设置项保留清单 | `task160` 已断言 `wideLayout / smallText / showToc / showHeadingNumbers / protectEditing` 出现在首 tab |
|
||||
| A10 | GREEN | 未接通项显式降级 | `task160` 已断言 `showToc / protectEditing` 当前 disabled 且带“待接线”说明 |
|
||||
|
||||
### 4.1 本阶段 smoke 建议
|
||||
|
||||
- `scripts/task160-wolai-page-settings-shell-smoke.js`
|
||||
|
||||
首轮最小断言建议:
|
||||
|
||||
- 点击右上角 `...` 后 URL 不变
|
||||
- 出现页面设置 `popover`
|
||||
- 出现三 tab
|
||||
- `Esc` 可关闭
|
||||
- 点击页面空白可关闭
|
||||
- 再次点击入口可关闭
|
||||
|
||||
### 4.2 task160 页面设置壳执行记录
|
||||
|
||||
2026-05-06 已新增并执行 `scripts/task160-wolai-page-settings-shell-smoke.js`,用于固化 A2-A7 的本地 RED 基线。
|
||||
|
||||
RED:
|
||||
|
||||
- 命令:`node scripts/task160-wolai-page-settings-shell-smoke.js`
|
||||
- 结果:失败
|
||||
- 失败信息:`页面设置入口必须打开右侧贴边 popover`
|
||||
- 当前本地状态:
|
||||
- 点击右上角 `更多` 后 URL 保持文档页不变
|
||||
- 顶栏 `更多` 获得焦点,但没有打开页面设置容器
|
||||
- 当前页面中未出现页面设置 popover;探测到的唯一 `tablist` 仍是左侧 `我的页面 / Explorer / +`
|
||||
|
||||
证据路径:
|
||||
|
||||
- 本地点击后截图:`/mnt/Data1T/mnote/tmp/wolai-editor-parity/task160-page-settings-shell/01-after-click-more.png`
|
||||
- 本地点击后状态:`/mnt/Data1T/mnote/tmp/wolai-editor-parity/task160-page-settings-shell/01-after-click-more.json`
|
||||
- 本地失败截图:`/mnt/Data1T/mnote/tmp/wolai-editor-parity/task160-page-settings-shell/failure.png`
|
||||
- 本地失败状态:`/mnt/Data1T/mnote/tmp/wolai-editor-parity/task160-page-settings-shell/failure-state.json`
|
||||
|
||||
当前判断:
|
||||
|
||||
- A2 已有本地基线
|
||||
- A4 已形成真实 RED
|
||||
- A5 目前从 failure-state 可见点击后 URL 未变化,但完整打开/关闭合同仍待容器实现后继续验证
|
||||
- A6-A7 仍待容器出现后继续验证
|
||||
|
||||
GREEN:
|
||||
|
||||
- 命令:`node scripts/task160-wolai-page-settings-shell-smoke.js`
|
||||
- 结果:通过
|
||||
- 当前通过行为:
|
||||
- 右上角 `更多` 打开页面设置 `popover`
|
||||
- URL 保持不变
|
||||
- `Esc`、点击空白、再次点击入口均可关闭
|
||||
- 顶部存在 `页面选项 / 自定义页面 / 全局选项`
|
||||
- 页面设置首 tab 使用 checkbox 行
|
||||
- `showToc / protectEditing` 当前显式降级
|
||||
|
||||
新增证据:
|
||||
|
||||
- `task160` 最终截图:
|
||||
- `/mnt/Data1T/mnote/tmp/wolai-editor-parity/task160-page-settings-shell/01-after-click-more.png`
|
||||
- `/mnt/Data1T/mnote/tmp/wolai-editor-parity/task160-page-settings-shell/02-after-esc.png`
|
||||
- `/mnt/Data1T/mnote/tmp/wolai-editor-parity/task160-page-settings-shell/03-after-outside-click.png`
|
||||
- `/mnt/Data1T/mnote/tmp/wolai-editor-parity/task160-page-settings-shell/04-after-reclick.png`
|
||||
|
||||
修复补充(2026-05-06):
|
||||
|
||||
- 在 `styles.rs` 中补了 `.wolai-page-settings-section[hidden] { display: none !important; }`
|
||||
- `task160` 随后已在真实后端端口 `41327` 上验证 `页面选项` 不再混出 `自定义页面` 字段,`自定义页面 / 全局选项` 的 panel 行为恢复正常
|
||||
|
||||
---
|
||||
|
||||
## 5. Phase B:页面设置动作项与现有能力接线
|
||||
|
||||
| ID | 状态 | 任务 | 验收要点 |
|
||||
| --- | --- | --- | --- |
|
||||
| B1 | GREEN | `页面历史...` 接线 | `task160` 已断言页面设置动作项可打开 Rust Web 页面历史抽屉 |
|
||||
| B2 | GREEN | `公开分享页面...` 接线 | `task160` 已断言页面设置动作项可打开 Rust Web 公开分享对话框 |
|
||||
| B3 | GREEN | `移动到...` 入口策略 | `task160` 已断言当前显式为 disabled/placeholder |
|
||||
| B4 | GREEN | `嵌入到...` 入口策略 | `task160` 已断言当前显式为 disabled/placeholder |
|
||||
| B5 | GREEN | `删除页面` 入口策略 | `task160` 已断言当前显式为 disabled/placeholder |
|
||||
| B6 | GREEN | 统计信息布局 | `task160` 已断言底部存在紧凑统计信息区 |
|
||||
| B7 | GREEN | 页面设置项真实生效 | `task160` 已在真实后端端口上断言 `wideLayout`、`layoutDensity` 持久化并在刷新后回读成功 |
|
||||
|
||||
### 5.1 本阶段 smoke 建议
|
||||
|
||||
- 在 `task160` 基础上扩展动作项断言
|
||||
- 新增针对已接通选项的可见结果断言
|
||||
|
||||
最低要求:
|
||||
|
||||
- 历史入口可打开现有历史抽屉
|
||||
- 分享入口可打开现有分享对话框
|
||||
- `wideLayout`、`smallText`、`layoutDensity` 这类已接通项能在页面可见变化中被捕获
|
||||
|
||||
### 5.2 task160 Phase B 执行记录
|
||||
|
||||
2026-05-06 `task160` 已继续覆盖 B1-B7,当前通过:
|
||||
|
||||
- `页面历史...` 可打开 `data-testid="wolai-page-history-drawer"`
|
||||
- `公开分享页面...` 可打开 `data-testid="wolai-page-share-dialog"`
|
||||
- `移动到... / 嵌入到... / 删除页面` 当前显式 disabled
|
||||
- 页面设置底部显示字数、字符、块数、待办统计
|
||||
- `wideLayout` 写链真实命中 `/api/documents/options`
|
||||
- `layoutDensity` 写链真实命中 `/api/documents/options`
|
||||
- `wideLayout` 打开后 `.document-shell` 宽度真实增大
|
||||
|
||||
修复补充(2026-05-06):
|
||||
|
||||
- 先修了 `mnote-web` 页面设置 route payload 与 `bridge-runtime` command plan:不再把 `workspaceId` 和一组 `null` 选项继续下发到 `documents:updateOptions`
|
||||
- 再修了 `DocumentPage` 的 SSR `data-page-*` 首屏注入,以及 `SIDEBAR_TREE_JS` 初始化顺序,避免在 `__MNOTE_PAGE_AGGREGATE__` 还未进入 DOM 时把默认 page options 缓存死
|
||||
- 之后通过真实后端端口 `41327` 验证:
|
||||
- `/api/documents/options` 返回 200
|
||||
- `/api/page-aggregate/:id` 能读回 `wideLayout=true`、`layoutDensity=compact`
|
||||
- `task160` 刷新后 checkbox 和壳层 attr 不再回退
|
||||
|
||||
---
|
||||
|
||||
## 6. Phase C:页面 AI 入口与抽屉壳
|
||||
|
||||
| ID | 状态 | 任务 | 验收要点 |
|
||||
| --- | --- | --- | --- |
|
||||
| C1 | BASELINE | Wolai 页面 AI 基线 | 已有 2026-05-06 Wolai 基线截图和 JSON |
|
||||
| C2 | GREEN | 本地页面 AI 入口现状基线 | `task161` 已记录并复测右下角 AI 可打开页面 AI 抽屉,URL 不变 |
|
||||
| C3 | GREEN | 页面 AI 主入口迁到右下角 | `task161` 已断言页面级 AI 主入口为右下角浮动按钮 |
|
||||
| C4 | GREEN | 顶栏 `页面AI` 降级 | `task161` 已断言顶栏不再保留 `页面AI` 主入口 |
|
||||
| C5 | GREEN | 页面 AI 容器类型 | `task161` 已断言页面 AI 以右侧抽屉打开、无遮罩、不跳新页面 |
|
||||
| C6 | GREEN | 页面 AI 关闭语义 | `task161` 已断言 `Esc`、点击空白无效,右上角 `X` 有效 |
|
||||
| C7 | GREEN | 页面 AI 页面级绑定 | `task161` 已断言 `/api/ai-agent/run` 请求体携带当前 `documentId` 与 `pageOptions` |
|
||||
| C8 | GREEN | 页面 AI 执行面不分裂 | 真实 `/api/ai-agent/run` 已改为 `Next 兼容优先 -> 本地 mnote-cli fallback -> 旧 orchestrator 兜底`;`task162` 已验证真实页面可返回文本结果 |
|
||||
| C9 | GREEN | AI chrome 与 Wolai 接近 | `task161` 已断言标题、输入区、`新会话 / 历史会话 / mnote-cli` chrome 可见 |
|
||||
|
||||
### 6.1 本阶段 smoke 建议
|
||||
|
||||
- `scripts/task161-wolai-page-ai-shell-smoke.js`
|
||||
|
||||
首轮最小断言建议:
|
||||
|
||||
- 点击右下角 AI 后 URL 不变
|
||||
- 打开右侧抽屉
|
||||
- 抽屉无遮罩
|
||||
- `Esc` 不关闭
|
||||
- 点击页面空白不关闭
|
||||
- 点右上角关闭按钮可关闭
|
||||
|
||||
### 6.2 task161 页面 AI 壳执行记录
|
||||
|
||||
2026-05-06 已新增并执行 `scripts/task161-wolai-page-ai-shell-smoke.js`,用于固化 C2-C6 的本地 RED 基线。
|
||||
|
||||
RED:
|
||||
|
||||
- 命令:`node scripts/task161-wolai-page-ai-shell-smoke.js`
|
||||
- 结果:失败
|
||||
- 失败信息:`页面 AI 入口必须打开右侧抽屉`
|
||||
- 当前本地状态:
|
||||
- 点击右下角 `AI 助手` 后 URL 保持文档页不变
|
||||
- 浮动 AI 按钮没有打开抽屉
|
||||
- 当前页面中未出现页面 AI 容器、关闭按钮、标题或输入框
|
||||
|
||||
证据路径:
|
||||
|
||||
- 本地点击后截图:`/mnt/Data1T/mnote/tmp/wolai-editor-parity/task161-page-ai-shell/01-after-click-ai.png`
|
||||
- 本地点击后状态:`/mnt/Data1T/mnote/tmp/wolai-editor-parity/task161-page-ai-shell/01-after-click-ai.json`
|
||||
- 本地失败截图:`/mnt/Data1T/mnote/tmp/wolai-editor-parity/task161-page-ai-shell/failure.png`
|
||||
- 本地失败状态:`/mnt/Data1T/mnote/tmp/wolai-editor-parity/task161-page-ai-shell/failure-state.json`
|
||||
|
||||
当前判断:
|
||||
|
||||
- C2 已有本地基线
|
||||
- C5 已形成真实 RED
|
||||
- C6 仍待抽屉出现后继续验证
|
||||
- C7-C8 仍待实现阶段继续验证
|
||||
|
||||
GREEN:
|
||||
|
||||
- 命令:`node scripts/task161-wolai-page-ai-shell-smoke.js`
|
||||
- 结果:通过
|
||||
- 当前通过行为:
|
||||
- 右下角 AI 入口打开页面级右侧抽屉
|
||||
- URL 保持不变
|
||||
- `Esc` 和点击空白不会关闭
|
||||
- 右上角关闭按钮可关闭
|
||||
- 抽屉标题、输入区、会话/模型 chrome 可见
|
||||
- 发送动作继续命中 `/api/ai-agent/run`
|
||||
- 请求体继续携带当前 `documentId` 与 `pageOptions`
|
||||
|
||||
新增证据:
|
||||
|
||||
- `task161` 最终截图:
|
||||
- `/mnt/Data1T/mnote/tmp/wolai-editor-parity/task161-page-ai-shell/01-after-click-ai.png`
|
||||
- `/mnt/Data1T/mnote/tmp/wolai-editor-parity/task161-page-ai-shell/02-after-esc.png`
|
||||
- `/mnt/Data1T/mnote/tmp/wolai-editor-parity/task161-page-ai-shell/03-after-outside-click.png`
|
||||
- `/mnt/Data1T/mnote/tmp/wolai-editor-parity/task161-page-ai-shell/04-after-close-button.png`
|
||||
|
||||
修复补充(2026-05-06):
|
||||
|
||||
- `compat.rs` 的 `/api/ai-agent/run` 已改为:
|
||||
- 先尝试代理到 Next 的 `/api/ai-agent/run`
|
||||
- 失败时本地直接 `mnote-cli` host fallback
|
||||
- 再失败才走旧 orchestrator
|
||||
- 同时补了认证头显式转发,避免被 Next 侧 307 `/auth` 拦截
|
||||
- 页面 AI drawer 默认 provider 改为 `hermes`
|
||||
- 新增 `task162-wolai-page-ai-real-response-smoke.js`,并在真实后端端口 `41327` 上验证:页面 AI 不再显示 `page_ai_failed_502` / “没有返回文本结果”,而是会回填真实文本
|
||||
|
||||
### 6.3 task162 页面 AI 真实返回执行记录
|
||||
|
||||
2026-05-06 已新增并执行 `scripts/task162-wolai-page-ai-real-response-smoke.js`,用于补齐 C8 的真实返回验证。
|
||||
|
||||
- 命令:`MNOTE_UI_BASE_URL=http://127.0.0.1:41327 node scripts/task162-wolai-page-ai-real-response-smoke.js`
|
||||
- 结果:通过
|
||||
- 当前通过行为:
|
||||
- 页面 AI 不再出现 `page_ai_failed_502`
|
||||
- 不再显示“当前页面 AI 已接通 \`mnote-cli\`,但这次没有返回文本结果。”
|
||||
- 页面 AI 会回填真实 `mnote-cli` 输出文本
|
||||
|
||||
---
|
||||
|
||||
## 7. Phase D:页面 AI 与页面设置的集成护栏
|
||||
|
||||
| ID | 状态 | 任务 | 验收要点 |
|
||||
| --- | --- | --- | --- |
|
||||
| D1 | GREEN | 不新造页面设置真相 | 页面设置继续围绕 `currentPageOptions -> /api/documents/options -> page.layout.updateOptions` |
|
||||
| D2 | GREEN | 不新造 AI 执行面 | 页面 AI 继续围绕 `/api/ai-agent/run -> mnote-cli` |
|
||||
| D3 | GREEN | 文档页 owner 行为合同固定 | `task160/task161` 已断言 owner 态页面设置和 AI 都不跳新页面、不改 URL |
|
||||
| D4 | GREEN | mobile / 窄屏退化 | `task160/task161` 已断言移动视口下 popover / drawer 不超出视口 |
|
||||
| D5 | GREEN | React compat 与 Rust SSR 边界 | 本轮实现仅落在 `mnote-web` Rust SSR 壳、脚本与样式;未再把入口回接 React compat |
|
||||
| D6 | GREEN | checklist 与失败模式回填 | 已向 `wolai-aline/references/failure-patterns.md` 新增“本地 3000 进程未重启,smoke 误打旧实现” |
|
||||
|
||||
---
|
||||
|
||||
## 8. Deferred 清单
|
||||
|
||||
以下项当前明确延后,不混入首批验收:
|
||||
|
||||
| ID | 状态 | 任务 | 说明 |
|
||||
| --- | --- | --- | --- |
|
||||
| X1 | TODO | 演示模式 | 不是本轮页面设置与 AI 壳的主线 |
|
||||
| X2 | TODO | 页面评论 | 用户已明确可延后 |
|
||||
| X3 | TODO | 页面协作 | 用户已明确可延后 |
|
||||
| X4 | TODO | 成员邀请 | 顶栏 owner 态能力,后续单拆 |
|
||||
| X5 | TODO | 全局 AI 入口重构 | 本轮只做页面级 AI |
|
||||
| X6 | TODO | 帮助浮动入口完全对齐 | 本轮优先 AI,不把帮助入口一起扩面 |
|
||||
|
||||
---
|
||||
|
||||
## 9. 完成判定
|
||||
|
||||
本清单只有在以下条件同时成立时,才可以视为本轮设计进入可实现状态:
|
||||
|
||||
- 页面设置 `popover` 行为已通过本地 smoke 和 Wolai 基线复核
|
||||
- 页面 AI 抽屉行为已通过本地 smoke 和 Wolai 基线复核
|
||||
- 页面设置仍然围绕 `page.layout.updateOptions`
|
||||
- 页面 AI 仍然围绕 `/api/ai-agent/run -> mnote-cli`
|
||||
- deferred 项没有被误报为已完成
|
||||
|
||||
本轮完成后的正确口径:
|
||||
|
||||
> **页面设置与页面 AI 的交互壳已开始对齐 Wolai,但评论、协作、成员、演示模式仍是后续独立任务。**
|
||||
@@ -6,7 +6,7 @@
|
||||
>
|
||||
> 现在的问题不再是“这套模板能不能迁进来”,而是:
|
||||
>
|
||||
> **我们已经做出了一版 `leptos-tiptap` 编辑器,接下来应该从官方模板中保留什么行为模型,并优先把它接入主编辑器。**
|
||||
> **默认主编辑器已经切到页面内 `leptos-tiptap` island;当前问题转为:应该从官方模板保留什么行为模型,并优先把哪些能力继续收口到当前主编辑器主链。**
|
||||
|
||||
## 1. 修正后的总判断
|
||||
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
|
||||
这份文档只解决一个已经开始偏掉的问题:
|
||||
|
||||
> **当 `mnote` 决定继续采用 `Tiptap + leptos-tiptap` 作为主编辑器输入 runtime 时,如何避免把“过渡桥接层”误当成“Rust + Leptos 主线已经成立”。**
|
||||
> **当 `mnote` 已经采用 `Tiptap + leptos-tiptap` 作为默认主编辑器输入 runtime 时,如何避免把剩余过渡适配层误当成“Rust + Leptos 主线已经完全成立”。**
|
||||
|
||||
当前需要纠偏的不是:
|
||||
|
||||
@@ -50,27 +50,26 @@
|
||||
|
||||
### 2.2 当前偏差也已经很明确
|
||||
|
||||
当前未提交改动里的主要偏差不是“换成了 `leptos-tiptap`”,而是:
|
||||
当前需要继续纠偏的主要偏差不是“换成了 `leptos-tiptap`”,而是:
|
||||
|
||||
- 在真实文档页主链里,已经把 `BlockNoteEditor` 直接替成了新的 `EditorHost`
|
||||
- 默认文档页主链虽然已经切到页面内 `leptos-tiptap` island
|
||||
- `/mnt/Data1T/mnote/wolai-frontend/src/components/editor/document-content.tsx`
|
||||
- 这个 `EditorHost` 当前又固定只挂 `leptos-tiptap`
|
||||
- `/mnt/Data1T/mnote/wolai-frontend/src/components/editor/editor-host.tsx`
|
||||
- 当前 host 的真实承载方式是 `iframe + postMessage + 8123 runtime + TS converter + 旧 /api/documents/save`
|
||||
- `/mnt/Data1T/mnote/wolai-frontend/src/components/editor/leptos-tiptap-editor-host.tsx`
|
||||
- 但仍保留 TS converter、fallback host、兼容保存链与部分 host/runtime 过渡层
|
||||
- `/mnt/Data1T/mnote/wolai-frontend/src/lib/documents/tiptap-content-converter.ts`
|
||||
- `/mnt/Data1T/mnote/wolai-frontend/src/components/editor/blocknote-editor.tsx`
|
||||
|
||||
这条线的问题不是“代码不能运行”,而是:
|
||||
|
||||
> **它把 `leptos-tiptap` 先落成了一个“跨 iframe 的外来 runtime”,而不是一个真正受 Rust truth 和 Leptos 页面模型约束的主编辑区。**
|
||||
> **它虽然已经是页面内主编辑器,但剩余 fallback / adapter / 兼容保存链还没有完全退到过渡边界。**
|
||||
|
||||
### 2.3 当前最该回退的不是 Tiptap,而是默认主链切换方式
|
||||
|
||||
当前最该回退的是:
|
||||
当前最该继续收口的是:
|
||||
|
||||
- **默认主文档页直接切到 `iframe host`**
|
||||
- **把 TS converter + `/api/documents/save` 当成正式保存边界**
|
||||
- **把 `documentEditorHost = leptos_tiptap` 提前写成事实默认值**
|
||||
- **把 TS converter 继续降级为过渡适配层**
|
||||
- **把 fallback host / 兼容保存链继续收回到非主路径**
|
||||
- **让默认 `leptos-tiptap` 主链更多直接消费 Rust-first projection / command 边界**
|
||||
|
||||
当前不该回退的是:
|
||||
|
||||
|
||||
+3
-3
@@ -133,12 +133,12 @@
|
||||
|
||||
| 项 | Wolai Hermes | 本地 `3000` | 后续处理 |
|
||||
| --- | --- | --- | --- |
|
||||
| 首屏入口 | owner 登录态直接显示 `Hermes` 正文页,标题、正文、页面树同屏 | 默认是聚合 / 预览壳,正文编辑器需点击 `打开当前页面` 才出现 | 拆成 P0/P1 独立任务;先用 smoke 固化“普通文档首屏直接进入正文体验”或明确产品降级 |
|
||||
| 首屏入口 | owner 登录态直接显示 `Hermes` 正文页,标题、正文、页面树同屏 | `task130` 后已改为根页直接进入 document shell + editor island;历史上曾停留在聚合 / 预览壳 | 后续仅继续收口侧栏数据、视觉密度与 owner/published 状态差异 |
|
||||
| 侧栏数据与选中态 | 真实空间树,当前页在 `个人 / 软件开发 / Hermes` 路径下,红色选中态明显 | anonymous 示例树,当前页为 `1111`,行密度和图标体系仍偏本地化 | Sidebar checklist 必须同时验视觉和真实 active path |
|
||||
| 搜索入口 | 左侧放大镜可打开全局搜索;本轮 `Ctrl+K` 未稳定打开,`Ctrl+P` 在另一轮可 toggle | 顶栏搜索可打开;侧栏搜索曾修为 modal;`Ctrl+P` 可 toggle | 搜索任务不得只测一个入口;需记录每个入口、快捷键和 URL |
|
||||
| 搜索控件 | modal 居中,遮罩、结果行、快捷键提示完整;switch 视觉可见 | modal 结构接近,`role="switch"` 可测;不同输入下结果为空或本地数据结果 | switch 默认状态必须同时记录截图和 `aria-checked`,结果态需拆数据差异与控件差异 |
|
||||
| 搜索结果 | 输入 `Hermes` 命中页面和块,结果有红色高亮和路径 | 本地同词可出现空态或示例数据结果,取决于当前页面数据 | 建立固定本地 fixture 或 smoke 种子,不能用随机工作区数据验视觉 |
|
||||
| 正文编辑区 | 首屏正文 `contenteditable=true`,标题也可编辑 | 首屏无可见编辑区;点击后出现 title textarea 与 `.tiptap.ProseMirror` | 文档画布任务必须先消除“打开当前页面”入口语义差异或显式记录降级 |
|
||||
| 正文编辑区 | 首屏正文 `contenteditable=true`,标题也可编辑 | 当前已在首屏直接出现主编辑区;剩余差异转为标题区、正文密度与块交互细节 | 文档画布任务继续聚焦主编辑器体验,而不是首屏入口纠偏 |
|
||||
| 编辑焦点风险 | Wolai 标题和正文均可编辑,测试输入曾误落到标题,已清理 | 本地输入 / 撤销可完成,但页面结构不同 | editable-test mode 前必须先断言焦点 block 类型,优先在正文末尾新建唯一测试块 |
|
||||
| 块 hover | 正文块左侧出现轻量块控制入口,视觉很克制 | 本地显示 `+` 与拖拽/块句柄按钮,但位置、密度、内容列差异明显 | E2-E4 必须以截图和 hover 点位复核,不可只看按钮存在 |
|
||||
|
||||
@@ -357,7 +357,7 @@ mnote 当前差距:
|
||||
|
||||
- 当前本地文档页标题偏靠左且偏低,内容列与真实 Wolai 相比没有稳定对齐。
|
||||
- 当前显示“个人空间 / 工作区首页”元信息和横向分割线,这不是 Wolai 普通文档页默认观感。
|
||||
- 当前正文首块是“打开当前页面”链接,和目标 `Hermes` 的普通块 / 任务块 / 段落展示差异较大。
|
||||
- 历史上首屏正文首块曾是“打开当前页面”链接;`task130` 之后这条差异已收口,当前重点转向主编辑区密度、块 hover 和 toolbar 细节。
|
||||
- 右下角绿色 AI 浮动按钮比 Wolai 更重,真实 Wolai 是更轻的 AI 方形入口和问号入口。
|
||||
|
||||
### 4.5 主编辑器块级体验
|
||||
|
||||
@@ -27,17 +27,16 @@
|
||||
|
||||
| 项 | Wolai 证据 | 本地证据 | 当前结论 |
|
||||
| --- | --- | --- | --- |
|
||||
| 首屏 | `/mnt/Data1T/mnote/tmp/wolai-editor-parity/doc-baseline-mini/wolai-initial.png` | `/mnt/Data1T/mnote/tmp/wolai-editor-parity/doc-baseline-mini/local-initial.png` | 本地首屏仍是聚合/预览壳,需点击 `打开当前页面` 才进入正文,和 Wolai 直接正文页不一致 |
|
||||
| 首屏 | `/mnt/Data1T/mnote/tmp/wolai-editor-parity/doc-baseline-mini/wolai-initial.png` | `/mnt/Data1T/mnote/tmp/wolai-editor-parity/doc-baseline-mini/local-initial.png` | 历史基线显示本地首屏曾停留在聚合/预览壳;该差异已由 `task130` 收口,当前保留为基线证据 |
|
||||
| 搜索 modal | `/mnt/Data1T/mnote/tmp/wolai-editor-parity/baseline-20260430/wolai-03-search-modal-controls-filled.png` | `/mnt/Data1T/mnote/tmp/wolai-editor-parity/baseline-20260430/local-03-search-modal-controls-filled.png` | 容器接近;结果态、数据、入口矩阵仍需拆开验;switch 状态必须截图 + `aria-checked` 双证据 |
|
||||
| 块 hover | `/mnt/Data1T/mnote/tmp/wolai-editor-parity/baseline-20260430/wolai-08-block-hover-insert-entry.png` | `/mnt/Data1T/mnote/tmp/wolai-editor-parity/baseline-20260430/local-14-block-hover-insert-entry.png` | 本地已有 `+` 与手柄入口,但位置、密度、页面状态不同,不可判定已对齐 |
|
||||
| 编辑清理 | `/mnt/Data1T/mnote/tmp/wolai-editor-parity/baseline-20260430/wolai-14-title-suffix-after.png` | `/mnt/Data1T/mnote/tmp/wolai-editor-parity/baseline-20260430/local-16-editor-after-undo-cleanup.png` | Wolai 标题和正文都可编辑,editable-test 前必须先确认焦点 block 类型 |
|
||||
|
||||
当前必须优先拆解的差异:
|
||||
当前仍需优先拆解的差异:
|
||||
|
||||
1. 普通文档首屏入口语义:Wolai 直接显示正文页,本地仍需点击 `打开当前页面`。
|
||||
2. 搜索入口矩阵:Wolai 左侧搜索可打开,`Ctrl+K` 本轮未稳定;本地顶栏搜索可打开,侧栏入口和快捷键要继续按 smoke 验证。
|
||||
3. 搜索结果数据:Wolai 对 `Hermes` 有真实结果,本地依赖当前工作区示例数据;后续需要固定 fixture 或种子。
|
||||
4. 编辑器测试焦点:写入前必须确认当前焦点在正文测试块,不在标题或 breadcrumb 渲染副本。
|
||||
1. 搜索入口矩阵:Wolai 左侧搜索可打开,`Ctrl+K` 本轮未稳定;本地侧栏入口和快捷键要继续按 smoke 验证。
|
||||
2. 搜索结果数据:Wolai 对 `Hermes` 有真实结果,本地依赖当前工作区示例数据;后续需要固定 fixture 或种子。
|
||||
3. 编辑器测试焦点:写入前必须确认当前焦点在正文测试块,不在标题或 breadcrumb 渲染副本。
|
||||
|
||||
|
||||
### 2.1 task129 Phase A 执行记录
|
||||
@@ -69,8 +68,7 @@ subagent 复测:
|
||||
主线程截图复核结论:
|
||||
|
||||
- Wolai Hermes 为 owner 登录态,直接显示正文页和 `全网公开` 状态。
|
||||
- 本地 `3000` 工作区可见,但首屏仍停留在聚合 / 预览入口,需要点击 `打开当前页面` 才进入正文。
|
||||
- `task129` 只证明取证工具链可用,不证明 UI 已对齐;后续首个实现任务应优先处理 `D9 普通文档首屏入口语义`。
|
||||
- `task129` 只证明取证工具链可用,不证明 UI 已对齐;其中暴露出的 `D9 普通文档首屏入口语义` 已在后续 `task130` 中收口。
|
||||
|
||||
### 2.2 task130 D9 执行记录
|
||||
|
||||
|
||||
Reference in New Issue
Block a user