Files
mnote/design/06-mindmap/done/6-mindmap-phase6-leptos-ui-shell-reuse-checklist-v1.md
T
lix-2026 5f97800489 chore: align local-first control plane and editor fixes
- wire SQLite control-plane access/session paths into Rust web local-folder routes

- preserve local Markdown attachment semantics across upload, reload, and secondary-pane resource tabs

- refresh design governance docs, Reasonix task templates, and bug records

- retire root .mcp.json local MCP config
2026-05-23 23:38:42 +08:00

42 KiB
Raw Blame History

Mindmap Phase 6 leptos-mindmap UI Shell Reuse Checklist v1

For agentic workers: REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development for independent code slices, or superpowers:executing-plans when executing this checklist in order. Steps use checkbox (- [ ]) syntax for tracking. 每完成一个节点,必须基于代码、截图或测试证据勾选对应项。

Goal: 在不恢复旧 React 主链、不直接嵌入 lx-doc Vue 应用的前提下,把当前 leptos-mindmap + simple-mind-map runtime 从“无头 runtime + 手写 chrome”推进到接近 KMind/lx-doc 可用度的 floating overlay canvas UI shell。

Architecture: Rust kernel 继续持有导图事实源和命令语义,simple-mind-map 继续作为编辑 runtime。UI schema 只描述 toolbar、sidebar、navigator、context menu 的项目和动作,不负责布局;默认宿主必须采用接近 lx-doc/KMind 的画布承载模型:runtime 作为块内无限画布底层,toolbar/sidebar/navigator/count/minimap 作为 overlay 浮在画布上,不挤压画布尺寸。当前 TypeScript NodeView 只是过渡桥接层,后续 UI shell 应迁到 Leptos/Rust 组件,避免引入更多长期前端语言/框架边界。

Tech Stack: Rust core-protocol / bridge-runtime / mnote-webleptos-tiptap NodeView、simple-mind-map、历史 React MindmapBlock 组件族、lx-doc mind-map 参考代码、Playwright smoke。


0. 当前判断

当前 Phase 6 的方向不需要改成“直接嵌入 lx-doc/mind-map”。应该继续采用:

Rust kernel truth
  -> mindmap.simple_mind_map_scene.v1
  -> leptos-tiptap NodeView
  -> simple-mind-map runtime
  -> UI shell schema / action bridge
  -> kernel command / compatPayload.patch

本 checklist 修正的是下一阶段执行重心:

  • 不再把“接入 simple-mind-map runtime”当作可用导图编辑器完成。
  • 不再继续手写一次性的功能键、选项栏和底部栏。
  • 优先复用本仓历史自研 UI 壳的配置、按钮分组、右侧栏、导航栏、MiniMap、统计、右键菜单经验。
  • lx-doc/KMind 作为视觉、命令和交互基线;历史 React 组件作为最直接的迁移素材。
  • 2026-05-11 修正:此前 schema UI 已能显示工具项,但仍采用 grid/flex 文档流布局,和 https://wanglin2.github.io/mind-map/#/、KMind 截图的“无限画布 + 浮动 UI”不一致。后续必须先迁移到 floating overlay canvas shell,再继续扩展功能语义。
  • 2026-05-11 方向约束:mnote 主体是 Rust,leptos-tiptap 也是嵌入式 Leptos 路线;mindmap UI shell 不应继续沉淀为 TypeScript DOM UI。TS 只保留 tiptap NodeView mount + simple-mind-map bridge + event/command forwarding,真正的 toolbar/sidebar/navigator/context menu 应迁移到 Leptos/Rust。

1. 参考材料

当前主线文档

  • design/06-mindmap/reference/6-mindmap-kernel-phase6-projection-editor-v1.md
  • design/06-mindmap/reference/6-mindmap-leptos-adapter-reference-notes-v1.md
  • docs/superpowers/plans/2026-05-10-mindmap-phase6-projection-editor-checklist.md

lx-doc / KMind 参考

  • design/05-editor-mainline/reference-code/lx-doc/mind-map/src/pages/Edit/components/Edit.vue
  • design/05-editor-mainline/reference-code/lx-doc/mind-map/src/pages/Edit/components/ToolbarNodeBtnList.vue
  • design/05-editor-mainline/reference-code/lx-doc/mind-map/src/pages/Edit/components/SidebarTrigger.vue
  • design/05-editor-mainline/reference-code/lx-doc/mind-map/src/pages/Edit/components/NavigatorToolbar.vue
  • design/05-editor-mainline/reference-code/lx-doc/mind-map/src/config/zh.js
  • design/05-editor-mainline/reference-code/kmind-plugin

本仓历史 UI 壳

  • wolai-frontend/src/components/editor/blocks/MindmapBlock.tsx
  • wolai-frontend/src/components/editor/blocks/MindmapToolbar.tsx
  • wolai-frontend/src/components/editor/blocks/mindmapToolbarConfig.ts
  • wolai-frontend/src/components/editor/blocks/MindmapSidebar.tsx
  • wolai-frontend/src/components/editor/blocks/mindmapSidebarConfig.ts
  • wolai-frontend/src/components/editor/blocks/MindmapNavigator.tsx
  • wolai-frontend/src/components/editor/blocks/MindmapMiniMap.tsx
  • wolai-frontend/src/components/editor/blocks/MindmapCount.tsx
  • wolai-frontend/src/components/editor/blocks/MindmapContextMenu.tsx

历史简化宿主参考

  • /mnt/Data1T/mnote-rust/components/editor/blocks/MindmapRuntimeEditor.tsx
  • /mnt/Data1T/mnote-rust/components/editor/blocks/MindmapToolbar.tsx
  • /mnt/Data1T/mnote-rust/components/editor/blocks/MindmapNavigator.tsx
  • /mnt/Data1T/mnote-rust/components/editor/blocks/MindmapMiniMap.tsx
  • /mnt/Data1T/mnote-rust/components/editor/blocks/MindmapSidebarTrigger.tsx

2. 文件职责图

  • wolai-frontend/src/lib/mindmap/mindmap-ui-schema.ts
    • 新增:toolbar、sidebar、navigator、context menu 的中立 UI schema。
  • wolai-frontend/src/lib/mindmap/mindmap-action-map.ts
    • 新增:UI action 到 simple-mind-map command、kernel command、compatPayload.patch 的映射。
  • wolai-frontend/src/lib/mindmap/mindmap-ui-state.ts
    • 新增:active node、selection、readonly、scale、panel open state、disabled state 的派生逻辑。
  • wolai-frontend/src/lib/mindmap/leptos-mindmap-adapter.ts
    • 修改:暴露 UI shell 需要的 runtime action、state subscribe、command result。
  • wolai-frontend/src/lib/mindmap/simple-mind-map-bridge.ts
    • 修改:补齐 execCommand、插件能力探测、scale/view 操作、销毁清理。
  • wolai-frontend/src/lib/mindmap/mindmap-command-diff.ts
    • 修改:补齐 toolbar/sidebar/context menu 产生的变更到 kernel command / compat patch 的转换。
  • design/05-editor-mainline/reference-code/leptos-tiptap/tiptap/src/extensions/tiptap_paragraph.ts
    • 过渡修改:NodeView 只负责挂载 runtime、Leptos/Rust UI shell 宿主和最小桥接,不再继续扩散硬编码按钮逻辑。
  • rust/spikes/leptos-tiptap-spike/generated/island/snippets/leptos-tiptap-c355e6ec24c3df4c/src/js/generated/tiptap_paragraph.js
    • 修改:同步生成后的 browser-side bridge,保持与 TS source 行为一致。
  • scripts/task166-mindmap-phase6-block-smoke.js
    • 修改:从 runtime 存在 smoke 升级为 UI shell、交互、保存、reload、截图 smoke。

Floating overlay canvas shell 约束

  • 默认 DOM 应为 canvas-layer + overlay-layersimple-mind-map runtime 充满块内画布,toolbar/sidebar/navigator/count/minimap 都位于 overlay layer。
  • toolbar 顶部居中浮动,视觉上接近 lx-doc Toolbar.vue 的 fixed toolbar,而不是文档流顶部栏。
  • sidebar trigger / panel 右侧浮动,打开 panel 时不改变 runtime 宽度,只覆盖画布右侧安全区域。
  • navigator 右下浮动,count 左下浮动,MiniMap 后续在右下 navigator 上方浮动。
  • smoke 必须断言 overlay layer 存在,runtime rect 与 editor root rect 高度/宽度接近,不因 sidebar/toolbar/navigator 被 grid/flex 挤压。

Leptos/Rust UI shell 收口约束

  • mindmap-ui-schema.ts / mindmap-action-map.ts / mindmap-ui-state.ts 当前是过渡资产;新增长期 UI 行为时应优先设计 Rust/Leptos 可消费的 schema 和 signal/state 边界。
  • tiptap_paragraph.ts 不应继续成为 toolbar/sidebar/navigator 的长期实现文件;新增复杂 UI 面板前,应先迁出到 Leptos/Rust 组件或生成的 island 组件边界。
  • 禁止恢复旧 React MindmapBlock.tsx 为默认主链,禁止直接嵌入 lx-doc Vue app,禁止新增第三套 JS UI 框架。
  • simple-mind-map 可以继续作为 runtime engine,但 UI shell 的宿主语言方向应是 Leptos/Rust。

Task 1: 冻结新阶段边界

Files:

  • Modify: design/06-mindmap/reference/6-mindmap-kernel-phase6-projection-editor-v1.md

  • Modify: docs/superpowers/plans/2026-05-10-mindmap-phase6-projection-editor-checklist.md

  • Create/Modify: design/06-mindmap/done/6-mindmap-phase6-leptos-ui-shell-reuse-checklist-v1.md

  • 明确当前 Phase 6 不是“Rust 重写 lx-doc/mind-map”,也不是“直接嵌入 lx-doc Vue app”。

    • 2026-05-11 记录:本文件“当前判断”和总设计稿第 3 节均保留三路线定位,Phase 6 主线为 leptos-mindmap
  • 明确下一阶段目标是“当前 simple-mind-map runtime + 可复用 UI shell + kernel command bridge”。

    • 2026-05-11 记录:本文件 Goal/Architecture 与总设计稿 10.2 均明确 floating overlay UI shell + command bridge。
  • 在旧 checklist 中标记:已完成项如果只覆盖 runtime 接入和最小 smoke,不代表 KMind-like UI 可用性完成。

    • 2026-05-11 更新:旧 checklist 新增 Task 13: UI Shell Reuse 后续收口,指向本文件。
  • 在设计稿中补一段“UI shell 复用策略”,指向本 checklist。

    • 2026-05-11 更新:6-mindmap-kernel-phase6-projection-editor-v1.md 新增 10.2 2026-05-11 UI shell reuse 收口状态
  • 验证:rg -n "UI shell|MindmapBlock.tsx|mindmap-ui-schema|直接嵌入 lx-doc" design/06-mindmap docs/superpowers/plans/2026-05-10-mindmap-phase6-projection-editor-checklist.md

    • 2026-05-11 通过:命令能检索到本 checklist、总设计稿、reference notes 和旧执行 checklist 的对应口径。

Task 2: 抽取历史 React UI 能力清单

Files:

  • Inspect: wolai-frontend/src/components/editor/blocks/MindmapBlock.tsx

  • Inspect: wolai-frontend/src/components/editor/blocks/MindmapToolbar.tsx

  • Inspect: wolai-frontend/src/components/editor/blocks/mindmapToolbarConfig.ts

  • Inspect: wolai-frontend/src/components/editor/blocks/MindmapSidebar.tsx

  • Inspect: wolai-frontend/src/components/editor/blocks/mindmapSidebarConfig.ts

  • Inspect: wolai-frontend/src/components/editor/blocks/MindmapNavigator.tsx

  • Inspect: wolai-frontend/src/components/editor/blocks/MindmapMiniMap.tsx

  • Inspect: wolai-frontend/src/components/editor/blocks/MindmapCount.tsx

  • Inspect: wolai-frontend/src/components/editor/blocks/MindmapContextMenu.tsx

  • Output: design/06-mindmap/reference/6-mindmap-leptos-adapter-reference-notes-v1.md

  • 列出历史 toolbar 分组:历史操作、节点操作、插入扩展、样式、结构、导入导出、视图操作。

  • 列出每个 toolbar action 的旧实现来源、旧 runtime 调用、禁用条件、是否需要 active node。

  • 列出历史 sidebar panel:节点样式、基础样式、主题、结构、大纲、快捷键或设置。

  • 列出历史 navigator 能力:缩放、回根、适应画布、MiniMap、节点数/字数、只读/全屏。

  • 列出历史 context menu 能力:插入、删除、复制、粘贴、展开折叠、概要、关联线、样式。

  • 标注哪些能力第一阶段必须迁移,哪些只保留 schema 但暂不显示。

  • 验证:输出表格至少覆盖 toolbar、sidebar、navigator、context menu 四类能力,并能追溯到具体文件名。

    • 2026-05-11 输出:design/06-mindmap/reference/6-mindmap-leptos-adapter-reference-notes-v1.md 第 8 节。

Task 3: 建立中立 UI Schema

Files:

  • Create: wolai-frontend/src/lib/mindmap/mindmap-ui-schema.ts

  • Create: wolai-frontend/src/lib/mindmap/mindmap-ui-schema.test.ts

  • 定义 MindmapUiActionId,覆盖第一阶段 actionundoredoeditNodeinsertSiblingAfterinsertChilddeleteNodetaghyperlinknoteimageiconsummaryassociativeLineformulapainterimportexportsetThemesetLayoutzoomInzoomOutfitViewcenterRootsearchreadonly

  • 定义 MindmapToolbarGroup,字段包含 idlabelactionscollapsePriority

  • 定义 MindmapSidebarPanel,字段包含 idlabeliconruntimeCapabilityphase

  • 定义 MindmapNavigatorItem,字段包含 idlabelactionIdreadOnlydisplayMode

  • 定义 MindmapContextMenuItem,字段包含 idlabelactionIdrequiresNodephase

  • 导出 mindmapDefaultUiSchema,只包含第一阶段需要显示的功能。

  • 单测断言 action id 不重复、每个 toolbar action 都能在 action map 中找到占位映射、第一阶段 panel 数量不超过 5 个。

  • 验证:cd /mnt/Data1T/mnote/wolai-frontend && pnpm test -- mindmap-ui-schema

Task 4: 建立 Action Map 与禁用状态

Files:

  • Create: wolai-frontend/src/lib/mindmap/mindmap-action-map.ts

  • Create: wolai-frontend/src/lib/mindmap/mindmap-action-map.test.ts

  • Create: wolai-frontend/src/lib/mindmap/mindmap-ui-state.ts

  • Create: wolai-frontend/src/lib/mindmap/mindmap-ui-state.test.ts

  • Modify: wolai-frontend/src/lib/mindmap/leptos-mindmap-adapter.ts

  • 定义 MindmapActionTargetruntimeCommandkernelCommandcompatPatchlocalView

  • insertChild 映射到 simple-mind-map 插入子节点命令,并在成功后走 mindmap.node.insert_child 或 diff。

  • insertSiblingAfter 映射到同级插入命令,并在成功后走 mindmap.node.insert_sibling_after 或 diff。

  • deleteNode 映射到删除命令,并在成功后走 mindmap.node.delete 或 diff。

  • centerRootzoomInzoomOutfitView 映射为 runtime view action,同时产生 mindmap.view.patch

  • setThemesetLayout 映射为 mindmap.theme.setmindmap.layout.set

  • taghyperlinknoteimageiconformulapainter 第一阶段映射为 compatPayload.patch,并记录字段路径。

  • 实现 deriveMindmapUiState(),根据 active node、readonly、runtime capabilities、selection 派生 disabled state。

  • 单测覆盖:无 active node 时节点操作禁用;readonly 时编辑类 action 禁用;view action 不依赖 active node。

  • 验证:cd /mnt/Data1T/mnote/wolai-frontend && pnpm test -- mindmap-action-map mindmap-ui-state

    • 2026-05-11 补充验证:pnpm test -- mindmap-ui-schema mindmap-action-map mindmap-ui-state 通过。

Task 5: 替换 NodeView 中的硬编码 Chrome

Files:

  • Modify: design/05-editor-mainline/reference-code/leptos-tiptap/tiptap/src/extensions/tiptap_paragraph.ts

  • Modify: rust/spikes/leptos-tiptap-spike/generated/island/snippets/leptos-tiptap-c355e6ec24c3df4c/src/js/generated/tiptap_paragraph.js

  • Modify: wolai-frontend/src/lib/mindmap/leptos-mindmap-adapter.ts

  • 移除默认主链中的手写 toolbar button 列表,改为从 mindmapDefaultUiSchema.toolbarGroups 渲染。

    • 2026-05-11 验证:默认 DOM data-testid="mindmap-schema-toolbar"data-schema-source="mindmapDefaultUiSchema";截图 tmp/task166-mindmap-phase6-block-smoke/toolbar-actions.png
  • 移除默认主链中的手写 sidebar trigger 列表,改为从 mindmapDefaultUiSchema.sidebarPanels 渲染。

    • 2026-05-11 验证:默认 DOM data-testid="mindmap-schema-sidebar"data-schema-source="mindmapDefaultUiSchema";截图 tmp/task166-mindmap-phase6-block-smoke/sidebar-node-style.png
  • 移除默认主链中的固定 bottom bar 文案,改为从 navigator schema 和 runtime state 渲染。

    • 2026-05-11 验证:默认 DOM data-testid="mindmap-schema-navigator",显示节点数、字数与缩放百分比;截图 tmp/task166-mindmap-phase6-block-smoke/navigator-default.png
  • 保留最小错误层:projection_load_failedadapter_init_failedruntime_render_failedcommand_failed

  • 保留 debug fallback,但必须通过显式 debug flag 才能显示,不作为默认主链。

  • 确保 NodeView 销毁时仍调用 adapter destroy()

  • 验证:页面 DOM 中默认不再出现旧 .mnote-mindmap-node 手写节点主链;data-testid="mnote-mindmap-editor-root" 仍存在。

    • 2026-05-11 验证:node scripts/task166-mindmap-phase6-block-smoke.js 通过;tmp/task166-mindmap-phase6-block-smoke/result.jsonok=true,默认 debugChrome=false 且无手写 toolbar/sidebar/bottom bar。

Task 5A: 修正为 Floating Overlay Canvas Shell

Files:

  • Modify: design/05-editor-mainline/reference-code/leptos-tiptap/tiptap/src/extensions/tiptap_paragraph.ts

  • Modify: rust/spikes/leptos-tiptap-spike/src/lib.rs

  • Modify: rust/spikes/leptos-tiptap-spike/generated/island/snippets/leptos-tiptap-c355e6ec24c3df4c/src/js/generated/tiptap_paragraph.js

  • Modify: scripts/task166-mindmap-phase6-block-smoke.js

  • NodeView 默认 DOM 改为 canvas-layer + overlay-layerruntime 不再和 sidebar 组成 grid。

    • 2026-05-11 实现:默认路径挂载 mindmap-canvas-layermindmap-overlay-layerdebug fallback 仍保留旧布局。
  • toolbar 顶部居中浮动,sidebar 右侧浮动,navigator 右下浮动,count 左下浮动。

    • 2026-05-11 截图:tmp/task166-mindmap-phase6-block-smoke/01-after-insert-floating-overlay.png
  • sidebar 打开或切换 panel 时不改变 runtime 宽度。

    • 2026-05-11 验证:sidebar 已从 workspace grid 移到 overlay layersmoke 覆盖 panel 切换截图。
  • smoke 断言 data-testid="mindmap-overlay-layer" 存在,且 runtimeBox.width / rootBox.width >= 0.9

    • 2026-05-11 验证:node scripts/task166-mindmap-phase6-block-smoke.js 通过。
  • smoke 保存 01-after-insert-floating-overlay.png,截图能看到画布底层和浮动 UI。

    • 2026-05-11 截图:tmp/task166-mindmap-phase6-block-smoke/01-after-insert-floating-overlay.png
  • 验证:cd /mnt/Data1T/mnote/design/05-editor-mainline/reference-code/leptos-tiptap/tiptap && npm run typecheck && npm run build

    • 2026-05-11 通过。
  • 验证:cd /mnt/Data1T/mnote/wolai-frontend && node scripts/build-leptos-tiptap-island.js

    • 2026-05-11 已重新生成 island。
  • 验证:cd /mnt/Data1T/mnote && node scripts/task166-mindmap-phase6-block-smoke.js

    • 2026-05-11 通过;tmp/task166-mindmap-phase6-block-smoke/result.jsonok=true

Task 5B: 收口到 Leptos/Rust UI Shell 宿主

Files:

  • Modify/Create: rust/spikes/leptos-tiptap-spike/src/lib.rs

  • Modify/Create: rust/spikes/leptos-tiptap-spike/src/mindmap_shell.rs 或同等 Leptos 组件文件

  • Modify: design/05-editor-mainline/reference-code/leptos-tiptap/tiptap/src/extensions/tiptap_paragraph.ts

  • Modify: wolai-frontend/src/lib/mindmap/leptos-mindmap-adapter.ts

  • Modify: scripts/task166-mindmap-phase6-block-smoke.js

  • 明确 tiptap_paragraph.ts 只创建 mount 容器、加载 runtime bridge、转发事件,不再直接渲染 toolbar/sidebar/navigator 长期 UI。

    • 2026-05-11 实现:默认路径只挂载 mindmap-rust-shell-mountTS 负责 simple-mind-map runtime、projection/command bridge、mnote:mindmap-shell:* 事件转发;debug fallback 仍需显式 debug flag。
  • 将 floating overlay shell 的 toolbar/sidebar/count/navigator 渲染迁到 Leptos/Rust 组件边界。

    • 2026-05-11 实现:rust/spikes/leptos-tiptap-spike/src/lib.rs 导出 mount_mindmap_shell / unmount_mindmap_shellLeptos 组件输出 mindmap-rust-shell、toolbar、sidebar、count、navigator。
  • Leptos/Rust UI shell 消费同等 schema/state/action 能力;若仍需 TS schema,必须作为临时 adapter 输入,不作为长期事实源。

    • 2026-05-11 实现:当前 TS adapter 将 mindmapDefaultUiSchemaderiveMindmapUiState() 转为 Rust shell options;后续新增长期 UI 能力应继续迁到 Rust/Leptos schema 边界。
  • Leptos/Rust UI shell 触发 action 时仍经由 adapter command bridge,不绕过 kernel command。

    • 2026-05-11 验证:Rust shell 派发 mnote:mindmap-shell:action / mnote:mindmap-shell:panelNodeView 统一转到 executeSchemaAction()applyCommandsAndRefresh()patchView
  • smoke 断言默认 UI shell 来源为 leptos-rust-shell 或等价稳定标记,而不是 typescript-nodeview-dom

    • 2026-05-11 验证:scripts/task166-mindmap-phase6-block-smoke.js 断言 data-ui-shell-source="leptos-rust-shell"data-ui-source="leptos-rust-shell"
  • 验证:cd /mnt/Data1T/mnote/design/05-editor-mainline/reference-code/leptos-tiptap/tiptap && npm run typecheck && npm run build

    • 2026-05-11 通过。
  • 验证:cd /mnt/Data1T/mnote/wolai-frontend && node scripts/build-leptos-tiptap-island.js

    • 2026-05-11 通过,island 入口包含 mount_mindmap_shell / unmount_mindmap_shell
  • 验证:cd /mnt/Data1T/mnote && node scripts/task166-mindmap-phase6-block-smoke.js

    • 2026-05-11 通过;tmp/task166-mindmap-phase6-block-smoke/result.jsonok=true,默认入口 http://127.0.0.1:3000;截图 tmp/task166-mindmap-phase6-block-smoke/01-after-insert-floating-overlay.png

Task 6: Toolbar 第一阶段迁移

Files:

  • Modify: wolai-frontend/src/lib/mindmap/mindmap-ui-schema.ts

  • Modify: wolai-frontend/src/lib/mindmap/mindmap-action-map.ts

  • Modify: wolai-frontend/src/lib/mindmap/leptos-mindmap-adapter.ts

  • Modify: scripts/task166-mindmap-phase6-block-smoke.js

  • 顶部 toolbar 显示:撤销、重做、同级节点、子节点、删除、标签、超链接、备注、图片、图标、概要、关联线、公式、格式刷、导入、导出。

    • 2026-05-11 验证:node scripts/task166-mindmap-phase6-block-smoke.js 断言上述 action id 均存在;截图 tmp/task166-mindmap-phase6-block-smoke/toolbar-actions.png
  • toolbar 分组、图标尺寸、按钮间距对齐 KMind/lx-doc 的工作台密度,不做大卡片式按钮。

    • 2026-05-11 实现:rust/spikes/leptos-tiptap-spike/src/lib.rs 新增 schema toolbar group、tool icon/label 紧凑样式;截图 tmp/task166-mindmap-phase6-block-smoke/01-after-insert-schema-ui.png
  • active node 为空时禁用节点相关按钮。

    • 2026-05-11 实现:Rust shell 消费 deriveMindmapUiState() 派生的 disabled state;节点类 action 依赖 activeNodeId
  • readonly 时禁用所有编辑类按钮,保留缩放、搜索、回根。

    • 2026-05-11 验证:node scripts/task166-mindmap-phase6-block-smoke.jsverifyReadonlyToolbarState() 覆盖 readonly 开关后编辑按钮禁用、view 按钮保留可用。
  • 点击“子节点”后真实插入节点,截图可见新增节点。

    • 2026-05-11 验证:toolbarActions.insertChildOk=true,截图 tmp/task166-mindmap-phase6-block-smoke/03-after-toolbar-actions.png
  • 点击“同级节点”后真实插入同级节点,截图可见新增节点。

    • 2026-05-11 验证:toolbarActions.insertSiblingOk=true,节点数从 5 增至 6。
  • 点击“删除”后真实删除选中节点,并能 reload 后保持。

    • 2026-05-11 验证:toolbarActions.deleteOk=true,删除后节点数为 5,reload 后仍为 5。
  • 验证:smoke 输出 toolbar action 结果 JSON,包含 insertChildOkinsertSiblingOkdeleteOk

    • 2026-05-11 通过:tmp/task166-mindmap-phase6-block-smoke/result.jsontoolbarActions={insertChildOk:true,insertSiblingOk:true,deleteOk:true}

Task 7: Sidebar 第一阶段迁移

Files:

  • Modify: wolai-frontend/src/lib/mindmap/mindmap-ui-schema.ts

  • Modify: wolai-frontend/src/lib/mindmap/mindmap-action-map.ts

  • Modify: wolai-frontend/src/lib/mindmap/leptos-mindmap-adapter.ts

  • Modify: scripts/task166-mindmap-phase6-block-smoke.js

  • 右侧栏触发器显示:节点样式、导图样式、主题、结构、大纲。

    • 2026-05-11 验证:smoke 断言 nodeStylebaseStylethemestructureoutline 均存在。
  • 打开一个 panel 时不挤压或遮挡主要画布节点。

    • 2026-05-11 验证:Task 5A/5B smoke 断言 runtimeBox.width / rootBox.width >= 0.9runtimeBox.height / rootBox.height >= 0.85sidebar 位于 floating overlay,不改变 runtime 尺寸。
  • 主题 panel 第一阶段至少提供默认主题和 KMind-like 主题切换。

    • 2026-05-11 实现:Rust/Leptos sidebar body 渲染 theme-classictheme-classic4NodeView bridge 将选择转为 setTheme kernel command。验证:node scripts/task166-mindmap-phase6-block-smoke.jssidebarActions.themeOk=truereload 后 theme=classic4 保持;截图 tmp/task166-mindmap-phase6-block-smoke/sidebar-theme.pngsidebar-actions.png
  • 结构 panel 第一阶段至少提供逻辑结构、右侧结构、鱼骨或树形结构中的可用子集。

    • 2026-05-11 实现:Rust/Leptos sidebar body 渲染 logicalStructuremindMapfishbone 结构选项;NodeView bridge 将选择转为 setLayout kernel command。验证:node scripts/task166-mindmap-phase6-block-smoke.jssidebarActions.layoutOk=truereload 后 layout=mindMap 保持;截图 tmp/task166-mindmap-phase6-block-smoke/sidebar-structure.png
  • 大纲 panel 只从 projection/runtime 派生,不创建第二份树真相。

    • 2026-05-11 实现:NodeView 每次 mount Rust shell 时从当前 runtime snapshot / projection root 派生 bodyItems,Rust shell 只渲染传入列表,不维护第二份树状态。验证:sidebarActions.outlineDerivedOk=true,输出 outline items 包含当前导图节点文本;截图 tmp/task166-mindmap-phase6-block-smoke/sidebar-outline.png
  • 节点样式和导图样式的暂未语义化字段走 compatPayload.patch

    • 2026-05-11 实现:sidebar option 派发 source=sidebarcompatPath;节点样式写入 nodes.$active.data.fillColor,导图样式写入 compatPayload.style.map.lineStyle。验证:sidebarActions.nodeStyleCompatOk=truesidebarActions.baseStyleCompatOk=truereload 后保持;截图 tmp/task166-mindmap-phase6-block-smoke/sidebar-node-style.pngsidebar-base-style.png
  • 验证:smoke 能打开每个 panel,并保存 sidebar-node-style.pngsidebar-theme.pngsidebar-structure.pngsidebar-outline.png

    • 2026-05-11 通过:node scripts/task166-mindmap-phase6-block-smoke.js 保存四张 sidebar 截图。

Task 8: Navigator / MiniMap / Count 迁移

Files:

  • Modify: wolai-frontend/src/lib/mindmap/mindmap-ui-schema.ts

  • Modify: wolai-frontend/src/lib/mindmap/leptos-mindmap-adapter.ts

  • Modify: scripts/task166-mindmap-phase6-block-smoke.js

  • 底部栏显示节点数、字数、当前缩放百分比。

    • 2026-05-11 验证:smoke 断言 navigator stats 包含“节点”,zoom 包含 %;截图 tmp/task166-mindmap-phase6-block-smoke/navigator-default.png
  • “回根节点”调用 runtime center root,并写入 view patch。

    • 2026-05-11 验证:node scripts/task166-mindmap-phase6-block-smoke.js 通过;navigatorActions.centerRootOk=true,通过浮动 navigator 按钮触发并观测到 patchView POST。
  • 缩放加减按钮调用 runtime zoom,并写入 view patch。

    • 2026-05-11 验证:navigatorActions.zoomOk=trueviewScale=1.2,截图 tmp/task166-mindmap-phase6-block-smoke/navigator-zoomed.png
  • 搜索入口调用 simple-mind-map Search 插件或当前 adapter 搜索入口。

    • 2026-05-11 实现:Rust/Leptos navigator search input 派发 search actionNodeView adapter 记录当前搜索入口状态与 query;后续可替换为 Search 插件面板。验证:navigatorActions.searchOk=true
  • MiniMap 第一阶段可折叠显示,但按钮和容器状态必须稳定。

    • 2026-05-11 实现:Rust/Leptos shell 增加 MiniMap 开关和稳定 overlay 容器;不恢复旧 React MiniMap。验证:navigatorActions.minimapOk=true,截图 tmp/task166-mindmap-phase6-block-smoke/navigator-minimap.png
  • 底部栏在窄屏下不覆盖节点编辑区域。

    • 2026-05-11 验证:当前 smoke 断言 runtime 仍保持 runtimeBox.width/rootBox.width >= 0.9runtimeBox.height/rootBox.height >= 0.85navigator/MiniMap 均在 overlay layer,不改变 runtime 尺寸。
  • 验证:smoke 保存 navigator-default.pngnavigator-zoomed.pngnavigator-minimap.png

    • 2026-05-11 通过:node scripts/task166-mindmap-phase6-block-smoke.js 输出 ok=true,截图路径包含三张 navigator 截图。

Task 9: Context Menu 迁移

Files:

  • Modify: wolai-frontend/src/lib/mindmap/mindmap-ui-schema.ts

  • Modify: wolai-frontend/src/lib/mindmap/mindmap-action-map.ts

  • Modify: wolai-frontend/src/lib/mindmap/leptos-mindmap-adapter.ts

  • Modify: scripts/task166-mindmap-phase6-block-smoke.js

  • 右键节点时显示节点 context menu。

    • 2026-05-11 实现:NodeView capture 阶段监听 contextmenu,检测 .smm-node 后打开节点菜单。验证:node scripts/task166-mindmap-phase6-block-smoke.jscontextMenuActions.nodeMenuOk=true;截图 tmp/task166-mindmap-phase6-block-smoke/context-menu-actions.png
  • 右键画布时显示画布 context menu,节点专属操作禁用或隐藏。

    • 2026-05-11 验证:smoke 右键 runtime 空白区后 contextMenuActions.canvasMenuOk=true,且 canvas 菜单不包含 insertChild
  • 节点 menu 第一阶段包含:插入子节点、插入同级节点、删除、展开/收起、概要、关联线、复制文本。

    • 2026-05-11 验证:smoke 断言节点菜单包含 insertChildinsertSiblingAfterdeleteNodesummaryassociativeLineexpandCollapsecopyNodeTextcopyTextOk=trueinsertChildOk=true
  • 画布 menu 第一阶段包含:回根节点、适应画布、搜索、只读切换。

    • 2026-05-11 验证:smoke 断言画布菜单包含 centerRootfitViewsearchreadonly
  • 所有 context menu action 复用 mindmap-action-map.ts,不新增第二套动作逻辑。

    • 2026-05-11 实现:mindmap-ui-schema.ts 新增 expandCollapsecopyNodeTextmindmap-action-map.ts 将其映射为 localView;菜单点击统一调用 executeSchemaAction()。说明:context menu DOM 当前仍由 NodeView 过渡渲染,后续可按 Task 5B 同样迁入 Rust/Leptos shell。
  • 验证:smoke 能打开节点右键菜单和画布右键菜单,并保存截图。

    • 2026-05-11 通过:node scripts/task166-mindmap-phase6-block-smoke.js 输出 ok=true;截图 tmp/task166-mindmap-phase6-block-smoke/context-menu-actions.png

Task 10: Command Bridge 与保存闭环补齐

Files:

  • Modify: wolai-frontend/src/lib/mindmap/mindmap-command-diff.ts

  • Modify: wolai-frontend/src/lib/mindmap/leptos-mindmap-adapter.ts

  • Modify: rust/crates/bridge-runtime/src/lib.rs

  • Modify: rust/crates/core-protocol/src/mindmap.rs

  • Modify: scripts/task166-mindmap-phase6-block-smoke.js

  • data_change 能识别文本更新、插入子节点、插入同级节点、删除节点、移动节点。

    • 2026-05-11 验证:mindmap-command-diff.test.ts 覆盖文本、插入、删除、移动 diff;node scripts/task166-mindmap-phase6-block-smoke.js 覆盖 toolbar/context menu 插入与删除保存闭环。
  • view_data_change 能转成 mindmap.view.patch

    • 2026-05-11 验证:navigator 回根与缩放触发 view patchsmoke 输出 navigatorActions.centerRootOk=truenavigatorActions.zoomOk=trueviewScale=1.2
  • toolbar/sidebar/context menu 触发的动作都能落到 kernel commandcompatPayload.patch

    • 2026-05-11 验证:toolbar 插入/删除、sidebar 主题/结构、context menu 插入均通过 smokesidebar 节点样式/导图样式走 compat patch,结果为 nodeStyleCompatOk=truebaseStyleCompatOk=true
  • 每个 compatPayload.patch 记录字段路径、来源 action、runtime revision、kernel revision。

    • 2026-05-11 实现:mindmap-command-diff.tsMindmapCompatPayloadPatch 增加 actionIdruntimeRevisionkernelRevisionNodeView bridge 注入 action/revision 元信息。
  • command 失败时显示 command_failed,并保留失败 action id 和错误消息。

    • 2026-05-11 实现:NodeView command 失败时写入 data-command-failed-actiondata-command-failed-message;本轮 smoke 未再复现删除节点 400。
  • reload 后仍能看到 toolbar 插入/删除/主题/结构/view 的已保存结果。

    • 2026-05-11 验证:smoke 保存并校验 04-after-reload.png;输出 toolbarActions.deleteOk=truesidebarActions.themeOk=truesidebarActions.layoutOk=trueviewScale=1.2
  • 验证:cd /mnt/Data1T/mnote/rust && cargo test -p core-protocol mindmap

    • 2026-05-11 通过:3 passed。
  • 验证:cd /mnt/Data1T/mnote/rust && cargo test -p bridge-runtime mindmap

    • 2026-05-11 通过:14 passed。
  • 验证:cd /mnt/Data1T/mnote/wolai-frontend && pnpm test -- mindmap-command-diff leptos-mindmap-adapter

    • 2026-05-11 通过:实际匹配全量 106 files416 tests passed。

Task 11: KMind/lx-doc 视觉对齐

Files:

  • Modify: design/05-editor-mainline/reference-code/leptos-tiptap/tiptap/src/extensions/tiptap_paragraph.ts

  • Modify: relevant generated JS island file

  • Modify: wolai-frontend/src/lib/mindmap/mindmap-ui-schema.ts

  • Modify: scripts/task166-mindmap-phase6-block-smoke.js

  • Reference Image: tmp/image copy 60.png

  • Reference Image: tmp/image copy 70.png

  • Current Evidence: tmp/image copy 79.png

  • 默认根节点、二级节点、分支节点、概要线的视觉结果接近 KMind/lx-doc,而不是只显示基础节点和错位连线。

    • 2026-05-11 实现:真实 simple-mind-map runtime 负责节点、连线、概要线渲染;当前截图能看到根节点、二级节点、分支主题和概要括号线。剩余差异:默认主题色仍未完全等同 image copy 60.png 的红/蓝 KMind 配色,后续可继续细化 themeConfig。
  • toolbar、右侧触发器、底部栏呈现为编辑工作台 chrome,不占据画布主体。

    • 2026-05-11 实现:Leptos/Rust shell 的 toolbar、sidebar、navigator、count 均为 floating overlay;新截图 tmp/task166-mindmap-phase6-block-smoke/01-after-insert-floating-overlay.png 显示 UI 浮在画布上,不再挤压 runtime。
  • 连线对齐节点中心或 runtime 默认锚点,无明显错位。

    • 2026-05-11 验证:当前连线由 simple-mind-map runtime 生成;人工查看 04-after-reload.png 未见此前手写线条错位问题。
  • 画布初始视口能看到完整示例导图,不需要用户手动拖拽才能判断是否渲染成功。

    • 2026-05-11 修复:simple-mind-map-bridge.ts 不再用固定 fit:false 覆盖 runtimeOptions;默认 fit:true01-after-insert-floating-overlay.png 中示例导图完整可见。
  • 禁止用说明性大字、调试文案或状态卡片占据导图首屏。

    • 2026-05-11 验证:默认首屏为真实 runtime + floating UIdebug fallback 仍需显式 debug flag。
  • 验证:人工对照 image copy 60.png / image copy 70.png / 当前 smoke 截图,记录剩余差异到 checklist 或 reference notes。

    • 2026-05-11 对照:当前已具备无限画布底层、浮动 toolbar、右侧栏、底部 navigator、概要线和完整初始视口;剩余差异为图标体系、默认主题色、工具栏按钮分组密度和高级面板内容仍未完全复刻 lx-doc/KMind。

Task 12: Browser Smoke 升级

Files:

  • Modify: scripts/task166-mindmap-phase6-block-smoke.js

  • Output: tmp/task166-mindmap-phase6-block-smoke/result.json

  • Output: tmp/task166-mindmap-phase6-block-smoke/*.png

  • smoke 使用真实测试账号登录 http://127.0.0.1:3000/

    • 2026-05-11 验证:tree-shell-smoke-helpers.js 使用 mnote.e2e@example.com / “测试账号快速登录”,本轮 smoke baseUrl 为 http://127.0.0.1:3000
  • smoke 插入或打开 mindmap block 后断言 simple-mind-map canvas/SVG 容器非零尺寸。

    • 2026-05-11 验证:assertMindmapReady() 断言 simple-mind-map-runtime、runtime box、节点数和边数。
  • smoke 断言 toolbar、sidebar trigger、bottom navigator、context menu 入口存在。

    • 2026-05-11 验证:smoke 断言 mindmap-schema-toolbarmindmap-schema-sidebarmindmap-schema-navigatormindmap-schema-count,并打开节点/画布 context menu。
  • smoke 执行插入子节点、插入同级节点、删除节点、缩放、回根节点。

    • 2026-05-11 验证:输出 toolbarActions.insertChildOk/insertSiblingOk/deleteOk=truenavigatorActions.centerRootOk/zoomOk=true
  • smoke 打开右侧栏的主题、结构、大纲 panel。

    • 2026-05-11 验证:截图包含 sidebar-theme.pngsidebar-structure.pngsidebar-outline.png
  • smoke reload 后断言已编辑文本、节点数量、view state 至少一项保持。

    • 2026-05-11 验证:reload 后断言编辑文本、节点数量、主题、结构、节点样式、导图样式;view scale 输出为 1.2
  • smoke 输出 okdocumentIdmindmapIdnodeCountedgeCounttoolbarActionssidebarPanelsnavigatorActionscontextMenuActionsscreenshots

    • 2026-05-11 验证:tmp/task166-mindmap-phase6-block-smoke/result.json 输出 ok=truedocumentIdmindmapIdnodeCount=6edgeCount=5toolbarActionssidebarActionsnavigatorActionscontextMenuActionsscreenshots
  • smoke 失败时必须标出阶段:projection_load_failedadapter_init_failedruntime_render_failedui_shell_missingcommand_failedreload_mismatch

    • 2026-05-11 实现:失败分支从 error message / error layer 归类 failureStage,并保存 99-failure.png
  • 验证:node /mnt/Data1T/mnote/scripts/task166-mindmap-phase6-block-smoke.js

    • 2026-05-11 通过:ok=true,截图已刷新。

Task 13: 旧实现边界收口

Files:

  • Modify: wolai-frontend/src/components/editor/blocks/MindmapBlock.tsx

  • Modify: wolai-frontend/src/components/editor/blocks/MindmapToolbar.tsx

  • Modify: wolai-frontend/src/components/editor/blocks/MindmapSidebar.tsx

  • Modify: wolai-frontend/src/components/editor/blocks/MindmapNavigator.tsx

  • Modify: wolai-frontend/src/components/editor/blocks/MindmapContextMenu.tsx

  • Modify: wolai-frontend/src/components/editor/editor-host-config.test.ts

  • 给旧 React mindmap 组件族补清晰注释:legacy/reference/compat,不是 3000 文档页默认主链。

    • 2026-05-11 实现:MindmapBlock.tsxMindmapToolbar.tsxMindmapSidebar.tsxMindmapNavigator.tsxMindmapContextMenu.tsxMindmapMiniMap.tsxMindmapCount.tsxMindmapSidebarTrigger.tsx 顶部均标注 legacy/reference/compat 边界。
  • 默认文档页 host 为 leptos_tiptap_island 时,不加载旧 React MindmapBlock 作为主编辑路径。

    • 2026-05-11 验证:editor-host-config.test.ts 断言默认 host 为 leptos_tiptap_islandblocknote/旧 debug host 均折返 island。
  • 历史 toolbar/sidebar/navigator/context menu 只能作为 schema 抽取来源,不在运行时并行挂两套 UI。

    • 2026-05-11 验证:smoke 断言默认不存在旧 mindmap-command-toolbarmindmap-sidebarmindmap-bottom-bar fallback。
  • 保留旧组件用于对照、独立迁移或回收,不在本任务中删除。

    • 2026-05-11 处理:旧 React 组件族仍被独立导图页 /mindmap/[docId]/[mindmapId] 引用,暂不移动;已删除重复的 wolai-frontend/src/app/dev/mindmap/page.tsx,对应副本保留在 recycle/wolai-frontend/src/app/dev/mindmap/page.tsx
  • 静态测试禁止把 .mnote-mindmap-react-mountwindow.__mindmapInstance 作为 Phase 6 成功条件。

    • 2026-05-11 实现:editor-host-config.test.ts 新增 Phase 6 mindmap 成功选择器断言,成功条件限定为 mnote-mindmap-editor-rootsimple-mind-map-runtimemindmap-rust-shell
  • 验证:cd /mnt/Data1T/mnote/wolai-frontend && pnpm test -- editor-host-config

    • 2026-05-11 通过:实际匹配全量 106 files418 tests passed。

Task 14: 文档与执行记录

Files:

  • Modify: design/06-mindmap/reference/6-mindmap-kernel-phase6-projection-editor-v1.md

  • Modify: design/06-mindmap/reference/6-mindmap-leptos-adapter-reference-notes-v1.md

  • Modify: design/06-mindmap/done/6-mindmap-phase6-leptos-ui-shell-reuse-checklist-v1.md

  • Modify: docs/superpowers/plans/2026-05-10-mindmap-phase6-projection-editor-checklist.md

  • 在总设计稿中明确:UI shell reuse 是 leptos-mindmap 的 Phase 6 后续收口,不改变 kernel-first 主合同。

    • 2026-05-11 更新:6-mindmap-kernel-phase6-projection-editor-v1.md 新增 10.2 UI shell reuse 收口状态,指向本 checklist。
  • 在 reference notes 中补历史 React UI 壳能力表。

    • 2026-05-11 已完成:6-mindmap-leptos-adapter-reference-notes-v1.md 第 8 节覆盖 toolbar、sidebar、navigator/MiniMap/count、context menu。
  • 在旧执行 checklist 中补一条链接,说明后续 UI 可用度按本 checklist 继续。

    • 2026-05-11 更新:docs/superpowers/plans/2026-05-10-mindmap-phase6-projection-editor-checklist.md 新增 Task 13: UI Shell Reuse 后续收口
  • 每完成一个 task,在本文件勾选对应节点,并附验证命令或截图路径。

    • 2026-05-11 已按 Task 10-13 补充命令、截图和 result.json 证据。
  • 如果某项被后续实现废弃,移动到“暂不做项”并写明原因,不静默删除。

    • 2026-05-11 当前没有静默删除项;context menu DOM 仍标记为 NodeView 过渡层,未误报为纯 Rust shell。

退出标准

  • 当前文档页 mindmap block 默认使用真实 simple-mind-map runtime,而不是手写 SVG/DOM 假导图。
  • toolbar、sidebar、navigator、context menu 都来自可复用 UI schema 或等价配置,不再散落为 NodeView 内硬编码按钮。
  • 第一阶段常用操作可用:插入子节点、插入同级节点、删除、编辑文本、缩放、回根、主题切换、结构切换、大纲查看。
  • 所有编辑动作都经过 kernel command 或 compatPayload.patch,不把整棵 runtime data 作为 canonical truth。
  • smoke 有插入后、操作后、打开侧栏后、打开右键菜单后、reload 后截图。
  • 人工对照 tmp/image copy 60.pngtmp/image copy 70.png,当前实现已经呈现为可用工作台,而不是“无头 runtime + 临时按钮”。

暂不做项

  • 不直接把 lx-doc Vue2 应用作为 mnote 文档页内嵌主链。
  • 不恢复旧 React MindmapBlock.tsx 为默认编辑器主链。
  • 不在本阶段 Rust-native 重写 simple-mind-map layout / hit-test / renderer。
  • 不在本阶段完整复刻 KMind 多根、MOC、思源块镜像、PDF 标注、全量导入导出、主题设计器。
  • 不删除历史 React mindmap 文件;先作为迁移参考和 compat 资产保留。
  • 旧 React MindmapBlock.tsx 组件族暂不移动到 recycle,直到 /mindmap/[docId]/[mindmapId] 独立页切到同一 leptos-mindmap adapter contract;当前只回收重复 dev 路由。