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

935 lines
26 KiB
Markdown
Raw Normal View History

# 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`。**