Files
mnote/design/06-mindmap/process/6-mindmap-kernel-phase6-projection-editor-v1.md
T

935 lines
26 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 6 [process] Mindmap Kernel Phase 6:降级为 Projection / Editor v1
> 更新时间:2026-04-22
>
> 当前主线依据:
> - `/mnt/Data1T/mnote/design/01-05-current-priority-overview.md`
> - `/mnt/Data1T/mnote/design/01-tree-first-graph-kernel/process/1-tree-first-graph-kernel-v1.md`
> - `/mnt/Data1T/mnote/design/04-tree-domain/process/4-sidebar-pagetree-filetree-rust-web-rebuild-v1.md`
> - `/mnt/Data1T/mnote/design/03-rust-web/process/3-rust-web-long-term-architecture-v1.md`
>
> 历史参考:
> - `/mnt/Data1T/mnote/design/01-tree-first-graph-kernel/process/1-1-tree-first-graph-kernel-checklist-v2.md`
> - `/mnt/Data1T/mnote/design/old/05-editor-mainline/process/ai-first-rust-block-editor-baseline-v1.md`
## 1. 文档目的
这份文档用于重写 `Kernel Phase 6` 的落地口径。
这里仍沿用 `Phase 6` 命名,是为了保留与旧阶段拆分的一致性;当前执行依据应以 `design/01-05-current-priority-overview.md` 和相关现行主线文档为准,不再以 `1-1-tree-first-graph-kernel-checklist-v2.md` 作为唯一推进入口。
这里回答的不是:
- “要不要马上把导图 UI 全量重写成 Rust”
而是:
> **在当前仓库代码现实下,Mindmap 如何从独立对象中心,降级成 `tree-first graph kernel` 的一种 projection / editor。**
这份文档必须同时满足三件事:
- 服从 `tree-first graph kernel` 主线
- 对齐当前仓库里的真实实现,而不是抽象设想
- 给出可迁移、可双写、可分阶段切流的方案
---
## 2. 先给结论
结论固定如下:
> **Mindmap 后续必须进行 Rust 内核化重构,但重构重点不是先替换 `simple-mind-map` 画布,而是先把“导图真相、导图命令、导图 projection、AI 工具入口”切到 Rust kernel。**
换句话说:
- **必须 Rust 化的部分**
- 导图事实源
- 导图命令层
- 导图 projection 层
- AI / CLI 直接调用的导图工具层
- **不必第一阶段 Rust 化的部分**
- 具体画布渲染器
- 工具栏、缩略图、拖拽动画、局部 DOM 细节
因此:
> **Phase 6 的正确目标不是“把导图换个前端库”,而是“让导图不再以 `simple-mind-map` JSON 为系统真相”。**
---
## 3. 当前代码现实
当前导图主链已经部分接入 Rust runtime,但整体仍然是“前端重交互壳 + blob 持久化 + Rust compat 工具”的形态,还不是 kernel truth。
### 3.1 前端主壳仍然由 `simple-mind-map` 驱动
当前主组件:
- `/mnt/Data1T/mnote/wolai-frontend/src/components/editor/blocks/MindmapBlock.tsx`
现状特征:
- 直接加载 `simple-mind-map` 与大量插件
- 同时承担内嵌块、独立页、全屏态、工具栏、缩略图、右键菜单、图片处理、导入导出
- 直接调用:
- `mindmap.setData(...)`
- `mindmap.getData(...)`
- `mindmap.execCommand(...)`
- 直接请求:
- `fetch(/api/mindmap/${docId}/${mindmapId})`
这说明当前导图编辑器仍然以画布库数据结构为第一现场。
### 3.2 当前所谓 projection 仍然是前端摘要层,不是 kernel projection
当前文件:
- `/mnt/Data1T/mnote/wolai-frontend/src/lib/mindmap/mindmap-projection.ts`
当前 `buildMindmapProjection(...)` 的本质是:
- 接受一份 raw mindmap blob
-`simple-mind-map` 兼容归一化
- 输出一个前端摘要对象
- 同时保留 `data` 原始树
这意味着当前 projection 还是:
- **blob 的摘要**
而不是:
- **kernel subtree / graph 的正式投影**
### 3.3 当前持久化仍然是整棵导图 blob
当前持久化主链:
- `/mnt/Data1T/mnote/wolai-frontend/convex/mindmaps.ts`
- `/mnt/Data1T/mnote/wolai-frontend/src/app/api/mindmap/[docId]/[mindmapId]/route.ts`
现状特征:
- `mindmaps.get` 返回整棵 `data`
- `mindmaps.put` 写回整棵 `data`
- `mindmaps` 表持有的是一份完整导图 JSON
- 独立页服务端入口仍然走:
- `mindmaps.get`
- 然后在前端侧 `buildMindmapProjection(...)`
这说明当前“导图真相”依然是:
- **可直接存取的一整棵导图 blob**
而不是:
- **kernel node / edge / subtree**
### 3.4 Rust runtime 已经介入,但仍是 compat mindmap 树语义
当前 Rust 侧相关实现:
- `/mnt/Data1T/mnote/rust/crates/core-protocol/src/mindmap.rs`
- `/mnt/Data1T/mnote/rust/crates/bridge-runtime/src/lib.rs`
已存在的事实:
- Rust 侧已经有:
- `MindmapTreeNode`
- `MindmapOp`
- `mindmap_get`
- `mindmap_get_subtree`
- `mindmap_put`
- `mindmap_apply_ops`
- `mindmap_outline_to_mindmap`
- `bridge-runtime` 已能在 Rust 内部应用 `MindmapOp`
但这些能力当前本质上仍然是:
- 对一棵 `MindmapTreeNode` JSON 树做读取、修改、返回
不是:
-`KernelNode` / `KernelEdge` / `KernelSubtree` 做正式操作
### 3.5 Kernel 协议已具备导图进入统一内核的入口
当前 kernel 类型:
- `/mnt/Data1T/mnote/rust/crates/core-protocol/src/kernel.rs`
已经有:
- `KernelNodeType::Mindmap`
- `KernelNodeType::MindmapNode`
- `KernelProjectionKind::Mindmap`
这说明协议层已经承认:
> **导图应该属于统一 kernel,而不是永远停留在专用 blob 协议。**
问题不在方向,而在主线尚未切换完成。
---
## 4. 当前架构问题
如果继续维持当前模式,会有四类问题。
### 4.1 导图真相仍被视图库数据结构绑架
现在真正被保存、被读取、被回写的是:
- `simple-mind-map` 兼容树
这会导致:
- 领域模型被 UI 库字段形状反向约束
- 导图语义无法稳定进入 kernel
- 不同视图无法共享统一对象真相
### 4.2 AI 仍然不是直接操作 kernel
虽然已经有 `mindmap_apply_ops` 等工具,但它们当前语义仍然是:
- 取出一棵树
- 在 runtime 里改树
- 返回新树
这仍然不是:
- 直接创建 `mindmap_node`
- 直接移动 subtree
- 直接挂接 reference edge
因此 AI 还没有真正“直接写导图内核”。
### 4.3 导图还没有进入统一 projection 家族
当前 Sidebar / 页面树 / 文件树 正在往 kernel projection 收敛。
但导图仍然主要是:
- 专用 route
- 专用 blob
- 专用前端大组件
这会让导图继续成为一个旁路系统。
### 4.4 前端壳过重,迁移边界不清
`MindmapBlock.tsx` 当前同时承担:
- 读取
- 兼容转换
- 渲染
- 编辑
- 保存
- 资产替换
- 导入导出
- 页面模式切换
这意味着:
> **只要导图真相还留在这里,Phase 6 就不会真正成立。**
---
## 5. Phase 6 的正确目标
Phase 6 的正确目标固定为:
> **让 Mindmap 从“独立对象中心 + blob 真相 + 前端重壳”降级成“kernel subtree / graph 的一种 projection 与 editor”。**
再收口成一句:
> **Mindmap 不是对象真相层,Mindmap 只是树/图真相的一种空间化编辑视图。**
这意味着:
- 导图不能再拥有第二份对象真相
- 导图不能再以整棵 blob 作为长期 canonical model
- 导图编辑器只能操作 kernel
- 导图 route 只能消费 kernel projection
---
## 6. 目标分层
长期建议把导图域拆成四层。
### 6.1 Kernel Truth
这一层只存系统真相。
建议对象:
- `mindmap`
- 作为导图根容器节点
- `mindmap_node`
- 作为导图树节点
- `reference edge`
- 作为节点到页面、附件、PDF anchor、summary、ai_note 的横向关系
这层只负责:
- 节点存在性
- 父子结构
- sibling 顺序
- 节点稳定 ID
- 节点元信息
- 引用边
- 审计与版本
### 6.2 Mindmap Projection Layer
这一层负责把 kernel truth 投影为导图视图可消费的数据。
长期至少应有两类 projection
- `mindmap_preview`
- 给文档内嵌卡片、轻量预览使用
- `mindmap_editor`
- 给导图独立页、沉浸编辑器使用
这层输出的应是:
- 稳定 node id
- parent / child 关系
- sibling order
- depth
- child count
- 引用摘要
- capability flags
- 视图提示信息
而不是直接把前端控件内部状态回吐出去。
### 6.3 Editor Adapter Layer
这一层负责:
- 把 kernel projection 转成 `simple-mind-map` 当前所需的数据形状
- 把画布交互翻译成 kernel command
这一层是 compat adapter,不是事实源。
### 6.4 View Shell
这一层只负责:
- 画布
- 工具栏
- 右键菜单
- 缩略图
- 全屏壳
- 交互状态
这里可以继续用 `simple-mind-map` 过渡,但不能再持有对象真相。
---
## 7. 哪些语义必须进入 kernel
下面这些语义必须进入 kernel,而不是继续停留在 `simple-mind-map` blob 中。
### 7.1 节点级稳定语义
- `mindmap` 根节点
- `mindmap_node` 子节点
- `title / text`
- `note`
- `hyperlink`
- `refs`
- `collapsed`
- sibling 排序键
- 节点归档/删除状态
### 7.2 树语义
- 创建子节点
- 创建同级节点
- 重命名
- 移动 subtree
- 重排顺序
- 删除 subtree
### 7.3 图语义
- 节点引用页面
- 节点引用块
- 节点引用附件
- 节点引用 PDF 页码/anchor
- AI 生成节点引用证据节点
### 7.4 审计语义
- command id
- trace id
- actor id
- revision / version
---
## 8. 哪些语义不应进入 kernel
下面这些内容不应进入 kernel truth。
- 当前缩放比例
- 当前视口位置
- 当前选中节点
- minimap 展开状态
- 文本编辑框 DOM 状态
- 鼠标拖拽中的临时态
- 纯视图级动画状态
- `simple-mind-map` 内部 history 栈
- 仅服务当前画布库的缓存字段
这些内容属于:
- editor session state
- view shell state
不是 kernel truth。
---
## 9. 命令层重构口径
当前 `mindmap_apply_ops``mindmap_put` 不能再继续被当作长期真相接口。
### 9.1 `mindmap_put`
长期应降级为:
- 导入整图
- 替换快照
- 迁移回放
- 故障恢复
不应再作为常规编辑主路径。
### 9.2 `mindmap_apply_ops`
长期应保留,但语义要改。
它应变成:
- **compat facade**
内部行为应是:
-`MindmapOp` 翻译成 kernel command 序列
例如:
- `addChild`
- `kernel.node.create`
- `addSiblingAfter`
- `kernel.node.create` + sibling order 调整
- `updateText`
- `kernel.node.update`
- `setHyperlink`
- `kernel.node.update`
- `setRefs`
- `kernel.edge.attach` / `kernel.edge.detach`
- `deleteNode`
- `kernel.subtree.delete``kernel.node.archive`
也就是说:
> **`mindmap_apply_ops` 可以继续存在,但它不能继续直接修改一棵 compat 树。**
### 9.3 新的正式命令面
Phase 6 后导图应以 kernel command 为正式写面:
- `create_node`
- `update_node`
- `move_subtree`
- `reorder_siblings`
- `archive_node`
- `restore_node`
- `attach_edge`
- `detach_edge`
如果 kernel 当前缺少某些命令,就应在 Phase 6 补入,而不是继续把缺口留给前端 blob。
---
## 10. Projection 重构口径
当前导图 route 仍然主要走:
- `mindmaps.get`
然后前端:
- `buildMindmapProjection(...)`
这条链必须调整。
### 10.1 正式读路径
长期正式读路径应是:
- `kernel.project_view`
- projection=`mindmap`
而不是:
- `mindmaps.get`
- 返回 raw blob
### 10.2 Projection 输出要求
导图 projection 输出至少应包括:
- `projection_id`
- `root_node_id`
- `items`
- `edges`
- `depth`
- `sort_key`
- `expand_hint`
- `capability_flags`
- `resource_meta`
### 10.3 前端 adapter 的角色
前端可以继续存在一个:
- `projection -> simple-mind-map` adapter
但这层只能是 view adapter。
它不能再同时承担:
- canonical model
- 持久化模型
- AI 写入模型
---
## 11. AI / CLI 口径
如果目标是“AI 能直接编写思维导图,而不是外挂组件”,那 Phase 6 的 AI 路线必须明确。
### 11.1 AI 读取导图
AI 应读取:
- kernel subtree
- mindmap projection
- node refs / evidence
而不是只读取一棵视图库 JSON。
### 11.2 AI 修改导图
AI 应直接发 kernel command,或通过 compat facade 发命令。
正确路径应是:
- AI 意图
- tool / command plan
- kernel command
- projection 刷新
不是:
- AI 输出一整棵导图 JSON
- 再整体覆盖保存
### 11.3 AI 生成导图
`mindmap_outline_to_mindmap` 这类能力可以保留,但输出应优先写入:
- `mindmap`
- `mindmap_node`
- `reference edge`
而不是先生成一棵孤立 blob 再把它塞进存储。
---
## 12. 与当前代码对应的重构任务
### 12.1 Rust 协议层
需要重构或补充:
- `/mnt/Data1T/mnote/rust/crates/core-protocol/src/kernel.rs`
- `/mnt/Data1T/mnote/rust/crates/core-protocol/src/mindmap.rs`
建议动作:
- 保留 `MindmapOp` 作为 compat DTO
- 不再把 `MindmapTreeNode` 当长期 canonical model
- 为导图补齐正式 projection / command 契约
### 12.2 Rust runtime
需要重构:
- `/mnt/Data1T/mnote/rust/crates/bridge-runtime/src/lib.rs`
建议动作:
- 增加正式 `mindmap` projection builder
-`mindmap_apply_ops` 改成 command translator
-`mindmaps.get` 逐步降级为 compat query
- 新增或补齐导图相关 kernel command
### 12.3 前端 mindmap adapter
需要重构:
- `/mnt/Data1T/mnote/wolai-frontend/src/lib/mindmap/mindmap-projection.ts`
- `/mnt/Data1T/mnote/wolai-frontend/src/lib/mindmap/mindmapOps.ts`
建议动作:
- `mindmap-projection.ts`
- 从“blob 摘要器”转成“kernel projection adapter”
- `mindmapOps.ts`
- 从“本地真相修改器”降级为 compat / fallback 层
### 12.4 前端视图壳
需要重构:
- `/mnt/Data1T/mnote/wolai-frontend/src/components/editor/blocks/MindmapBlock.tsx`
- `/mnt/Data1T/mnote/wolai-frontend/src/app/mindmap/[docId]/[mindmapId]/page.tsx`
- `/mnt/Data1T/mnote/wolai-frontend/src/app/mindmap/[docId]/[mindmapId]/mindmap-page-client.tsx`
建议动作:
- 将读取从 `mindmaps.get` 切到 kernel projection
- 将写入从 `getData()/POST whole blob` 切到命令流
-`MindmapBlock.tsx` 缩成 view shell + adapter
### 12.5 持久化与兼容层
需要重构:
- `/mnt/Data1T/mnote/wolai-frontend/convex/mindmaps.ts`
- `/mnt/Data1T/mnote/wolai-frontend/src/app/api/mindmap/[docId]/[mindmapId]/route.ts`
建议动作:
- 迁移期允许双写
- 长期让 `mindmaps` 表退到 compat snapshot / import-export 层
- 正式真相切到 kernel backing store
---
## 13. 迁移分期
### 13.1 Phase 6-A:冻结边界
目标:
- 停止在前端和 compat blob 上继续追加长期业务语义
详细 checklist
- [ ] 冻结口径:
- 明确 `MindmapTreeNode` 只作为 compat DTO
- 明确 `mindmaps` blob 只作为过渡存储,不再新增长期业务语义
- 明确 `simple-mind-map` 只作为 renderer / editor adapter,不再定义系统真相
- [ ] 协议边界盘点:
- 盘点 `/mnt/Data1T/mnote/rust/crates/core-protocol/src/mindmap.rs` 中哪些字段属于 compat 语义
- 盘点 `/mnt/Data1T/mnote/rust/crates/core-protocol/src/kernel.rs` 中已有 `mindmap` / `mindmap_node` / `projection` 能力
- 列出 Phase 6 后必须新增的 kernel command / projection 契约缺口
- [ ] 前端边界盘点:
- 盘点 `/mnt/Data1T/mnote/wolai-frontend/src/components/editor/blocks/MindmapBlock.tsx` 中哪些逻辑属于真相层
- 将这些逻辑标记为后续待迁移:
- 读主链
- 写主链
- 本地摘要
- 引用回写
- 资产 URL 反写
- 明确哪些逻辑继续保留在 view shell:
- 画布渲染
- 右键菜单
- 工具栏
- 缩略图
- 全屏壳
- [ ] 持久化边界盘点:
- 盘点 `/mnt/Data1T/mnote/wolai-frontend/convex/mindmaps.ts` 的现有字段与索引
- 盘点 `/mnt/Data1T/mnote/wolai-frontend/src/app/api/mindmap/[docId]/[mindmapId]/route.ts` 的现有读写语义
- 明确哪些接口后续降级为 compat:
- `mindmaps.get`
- `mindmaps.put`
- `mindmaps.delete`
- `mindmaps.restore`
- [ ] AI / CLI 边界盘点:
- 盘点 `mindmap_get` / `mindmap_get_subtree` / `mindmap_put` / `mindmap_apply_ops`
- 标注哪些工具后续保留为 facade,哪些应切到 kernel command
- 明确 AI 不再以“整图 JSON 覆盖”作为长期主路径
- [ ] 文档口径冻结:
- 当前文档作为 Phase 6 主文档继续维护
- checklist / architecture / 后续任务拆分不再把导图描述为独立事实源
- 新增导图相关设计时默认引用本文件,而不是继续围绕 `simple-mind-map` 数据结构展开
- [ ] 代码约束冻结:
- 在未完成 Phase 6-B 之前,不再给 `MindmapTreeNode` 增加新的长期业务字段
- 在未完成 Phase 6-C 之前,不再新增新的“整图读取后本地改树再整体提交”的主路径
- 在未完成 Phase 6-D 之前,不再新增绕过 kernel 的 AI 写入链路
出阶段判定:
- [ ] 新导图语义默认先判断是否落 kernel,而不是先落前端 blob
- [ ] `MindmapBlock.tsx` 不再继续承担新的长期对象真相职责
- [ ] 团队已统一接受:
- compat blob 不是长期真相
- `simple-mind-map` 不是对象中心
- Phase 6 后正式主线是 kernel truth + projection + adapter
### 13.2 Phase 6-B:先切读路径
目标:
- 独立页与内嵌预览先读取正式 kernel projection
详细 checklist
- [ ] 定义 projection 家族:
- 定义 `mindmap_preview` projection
- 定义 `mindmap_editor` projection
- 明确两者共享的稳定字段:
- `projection_id`
- `root_node_id`
- `items`
- `edges`
- `capability_flags`
- `resource_meta`
- [ ] 定义 projection item 结构:
- 稳定 node id
- `parent_id`
- `sort_key`
- `depth`
- `child_count`
- `title/text`
- `collapsed`
- `refs summary`
- `style hint`
- [ ] Rust runtime 补 projection builder
-`/mnt/Data1T/mnote/rust/crates/bridge-runtime/src/lib.rs` 中增加正式 `mindmap` projection builder
-`kernel.project_view` 可返回 `KernelProjectionKind::Mindmap`
- 明确 preview 与 editor 的输出差异,不再直接返回 compat 整树
- [ ] 前端 adapter 改造:
-`/mnt/Data1T/mnote/wolai-frontend/src/lib/mindmap/mindmap-projection.ts` 从“blob 摘要器”改为“kernel projection adapter”
- 把 adapter 输出限定为 `simple-mind-map` 所需最小数据形状
- 不再让 adapter 同时承担 canonical model 职责
- [ ] 独立页读路径切换:
- `/mnt/Data1T/mnote/wolai-frontend/src/app/mindmap/[docId]/[mindmapId]/page.tsx`
改为优先读取 kernel projection
- SSR 初始数据不再以 `mindmaps.get` raw blob 为主
- `mindmap-page-client.tsx` 仅接收 projection / adapter 输出
- [ ] 文档内嵌预览切换:
- 内嵌卡片优先消费 `mindmap_preview`
- 预览态不再默认依赖整棵 blob
- 轻量预览和沉浸编辑使用不同 projection,避免主编辑壳过早挂载
- [ ] 兼容回退策略:
- kernel projection 不可用时,可临时回退到 compat `mindmaps.get`
- 回退路径必须显式标记为 compat/fallback
- 回退逻辑不得反向成为新主路径
- [ ] 可观测性与追踪:
- projection 响应带 `request_id` / `trace_id`
- 前端记录当前页面命中的 projection 来源:
- kernel
- compat fallback
- 为后续切流留出观测点
- [ ] 测试与验收:
- 增加 runtime 单测:`mindmap_preview` / `mindmap_editor` 输出稳定
- 增加 adapter 单测:projection -> `simple-mind-map` data
- 增加独立页 smoke:首屏读 projection 成功
- 增加内嵌态 smoke:文档页不再依赖整图 blob 才能显示摘要
出阶段判定:
- [ ] 独立页正式主读链已经是 kernel projection
- [ ] 文档内嵌预览正式主读链已经是 preview projection
- [ ] compat `mindmaps.get` 只作为 fallback,而不是默认主链
- [ ] 前端已有清晰的 `projection -> adapter -> renderer` 三层边界
### 13.3 Phase 6-C:再切写路径
目标:
- 常规编辑改为命令流
详细 checklist
- [ ] 明确正式写面:
- `create_node`
- `update_node`
- `move_subtree`
- `reorder_siblings`
- `archive_node`
- `restore_node`
- `attach_edge`
- `detach_edge`
- [ ] 补齐 kernel command 缺口:
- 若当前 kernel 缺少 sibling reorder 命令,需补齐
- 若当前 kernel 缺少 subtree archive/delete 语义,需补齐
- 若当前 kernel 缺少导图节点 refs 的 attach/detach 语义,需补齐
- [ ] compat `MindmapOp` 到 kernel command 的翻译表落地:
- `addChild`
- `addSiblingAfter`
- `updateText`
- `setHyperlink`
- `setRefs`
- `appendNote`
- `deleteNode`
- 为每个 op 指定唯一的 kernel command 映射与错误语义
- [ ] Rust runtime 改造:
- `/mnt/Data1T/mnote/rust/crates/bridge-runtime/src/lib.rs`
中的 `mindmap_apply_ops` 改为 command translator
- 不再直接对 compat 树做 canonical 修改
- 执行完成后返回:
- command 执行结果
- 最新 projection 或 refresh token
- trace / audit 信息
- [ ] 前端保存链改造:
- `MindmapBlock.tsx` 中工具栏操作不再默认走 `getData()/POST whole blob`
- 节点编辑、移动、删除、引用更新都发命令,而不是整体回传 snapshot
- 本地只保留短暂 optimistic state,不再作为长期真相
- [ ] 导图 route 改造:
- `/api/mindmap/[docId]/[mindmapId]`
`POST` 从常规编辑主入口降级
- 新增或切换到专用 command route / command envelope
- `mindmap_put` 只保留:
- 导入
- 替换快照
- 恢复
- 迁移回放
- [ ] 双写与迁移策略:
- 迁移期允许 kernel truth + compat snapshot 双写
- 双写失败时要有清晰告警,不得静默漂移
- 明确哪一侧是主真相,哪一侧只是镜像
- [ ] 冲突与审计:
- 所有命令返回 revision / version
- 写入链保留 `command_id` / `request_id` / `trace_id`
- 并发冲突时优先按 kernel command 冲突规则处理,而不是前端最后一次整图覆盖
- [ ] 测试与验收:
- runtime 单测:各类 `MindmapOp` 均正确翻译为 kernel command
- route 单测:常规编辑不再依赖整图 `put`
- UI smoke:增删改拖拽节点后可稳定刷新 projection
- 回归测试:导入/恢复仍可通过 `mindmap_put` 正常工作
出阶段判定:
- [ ] 常规编辑链路已经以 kernel command 为主
- [ ] `mindmap_put` 已从常规编辑主链退出
- [ ] 前端不再依赖 `getData()` 作为长期提交真相
- [ ] compat snapshot 即使保留,也只是双写镜像或导入导出格式
### 13.4 Phase 6-D:统一 AI / CLI
目标:
- AI / CLI 改为直接操作 kernel truth
详细 checklist
- [ ] AI 工具口径统一:
- 明确 AI 读导图优先读取 kernel projection / subtree
- 明确 AI 写导图优先发送 kernel command
- 明确 AI 不再以“输出完整 mindmap JSON 并整体覆盖”作为主模式
- [ ] compat tool 重构:
- `mindmap_get`
降级为 compat read facade
- `mindmap_get_subtree`
降级为 compat read facade
- `mindmap_apply_ops`
降级为 compat write facade
- `mindmap_put`
降级为导入/恢复工具
- [ ] 新 kernel-aware tool 面补齐:
- 面向 node / subtree / edge 的导图工具定义
- 工具参数默认使用:
- `nodeId`
- `rootNodeId`
- `workspaceId`
- `pageId`
- `edgeType`
- 避免继续以 compat `uid + whole tree` 为中心
- [ ] AI host/runtime 接缝改造:
- 导图 agent route 优先走 kernel-aware tool
- `mindmap_outline_to_mindmap` 的输出优先落 kernel truth
- AI 修改后的刷新结果优先返回 projection,而不是 raw blob
- [ ] CLI 改造:
- CLI 新增或切换到导图 kernel command 子命令
- 现有 `mindmap get/put/op` 标记 compat/legacy 语义
- CLI smoke 优先验证 kernel command 与 projection 输出
- [ ] 权限与审计:
- AI / CLI 导图写入保留 actor / trace / command id
- 区分:
- 用户直接编辑
- AI 代理修改
- 导入/恢复
- 确保后续 bridge log / audit 能区分来源
- [ ] 结果返回规范:
- AI / CLI 执行导图写命令后,默认返回:
- command 执行结果
- 受影响 node / edge
- 最新 projection 摘要
- 非必要不再回传整棵 compat 树
- [ ] 迁移与兼容:
- 迁移期 compat tools 仍可保留
- 但默认优先级必须低于 kernel-aware tools
- 新增 AI 能力时不得再优先扩写 compat blob 工具
- [ ] 测试与验收:
- AI tool 单测:至少一条创建节点、修改节点、挂接 refs 的链路走 kernel command
- CLI smoke:至少一条真实导图操作链不依赖整图覆盖
- 回归测试:compat tool 仍可用于迁移和紧急 fallback
出阶段判定:
- [ ] AI 已能直接创建、修改、移动导图节点与引用边
- [ ] CLI 已能直接操作导图 kernel truth
- [ ] compat tools 只剩 facade / import-export / fallback 职责
- [ ] 导图 AI / CLI 主链已经和 Sidebar / 页面树 / 阅读页一样,正式回到统一 kernel command / projection 体系
### 13.5 Phase 6-E:压缩旧壳
目标:
-`MindmapBlock.tsx` 收缩为可替换 view shell
要求:
- 真相、命令、projection 已完全外移
- 前端只剩渲染与交互适配
---
## 14. 完成判定
只有同时满足下面几条,才能说 `Kernel Phase 6` 完成。
- [ ] 导图正式事实源已经进入 kernel node / edge / subtree
- [ ] 导图独立页读取的是 kernel projection,而不是 `mindmaps.get` raw blob
- [ ] 文档内嵌导图读取的是 preview projection,而不是前端直接拼整棵树
- [ ] 常规编辑操作已经回写 kernel command,而不是 `POST` 整棵 `getData()`
- [ ] AI / CLI 可以直接创建、修改、移动导图节点,而不依赖整图覆盖
- [ ] `simple-mind-map` 已经退到 renderer / adapter 层
- [ ] `mindmaps` blob 存储已降级为 compat snapshot 或导入导出用途
---
## 15. 非目标
这阶段不以这些事情为主目标:
- 立即把整个导图画布改写成 Rust 前端
- 立即替换全部导图 UI 细节
-`simple-mind-map` 的所有样式字段完整提升为 kernel 语义
- 在第一阶段就清空全部历史兼容接口
Phase 6 的重点只有一个:
> **先把导图真相、导图命令、导图 projection 从前端 blob 体系里拔出来,正式并入 `tree-first graph kernel`。**