# 2026-06-25 Mindraw 拖放 ## 用户目标 继续推进 `.mindraw` Phase 2:验证并补齐 Tauri 目录包相关的选择、打开、保存、watch、拖放、路径校验和失败态,不进入全局链接 runtime 或 macOS package 注册。 ## 已完成事项 - 补齐 Finder/Tauri drop 的文档路径分流:拖放路径中如果包含顶层 `.mindraw` 包或 `.excalidraw` 文件,先按文档打开;同批图片路径不再继续导入。 - 空画布状态也挂载 drop root,使没有 active file 时具备接收文档 drop 的前端路径。 - 增加自动化覆盖: - `getSupportedDroppedDocumentPaths()` 保留顶层 `.mindraw` / `.excalidraw`,拒绝 `.mindraw/drawing.excalidraw` 内部路径并去重。 - `openDroppedDocuments()` 打开 `.mindraw` 包,且不会触发图片导入。 - 非文档路径返回 `false`,不调用 Tauri。 - 补强 Save As 失败态后端测试: - 目标 `.mindraw` 已在其他 dirty tab 打开时拒绝覆盖。 - 无效 scene content 另存为 `.mindraw` 时不留下半包目录。 - 补齐 `.mindraw` 核心打开失败态文案: - manifest 损坏提示 manifest missing/damaged/invalid。 - scene/hash 异常提示 scene damaged 或 hash mismatch。 - 非法资产路径提示 unsafe asset path。 - 保留后端 Details,失败时不切换当前 active tab。 - 重建本地 QA debug `.app`。 - 尝试真实 Finder 拖放 smoke:使用 `/tmp/mindraw-phase2-drag-check`、debug bundle、Finder reveal、`cliclick` 和 Computer Use 多次尝试;多屏坐标和工具 drag 接口未能稳定形成可被 Tauri 接收的 Finder 文件 drop 事件,因此该项未签 PASS。 - 完成原生 folder picker smoke: - 直接输入 `.mindraw` 包路径会进入包目录内部,不能作为包路径返回。 - 回到父目录后选中 `PickBoard.mindraw`,`Open` 仍禁用,不能直接选择普通目录包。 - 选择父目录后,App 文件树显示 `PickBoard`,点击节点可成功打开 `.mindraw` tab。 - Picker smoke 清理时曾并行删除偏好备份导致自动恢复失败;随后已按 smoke 前可观察状态把 `last_directory` 修复为 `/Users/ar/Desktop`,并移除临时 recent 项。 - 完成 macOS 菜单结构修复: - 发现 Tauri 自定义菜单首个 submenu 被 macOS 当作应用菜单,导致 `Open Directory`、`Save`、`Save As...` 误挂到 `Mindraw` 应用菜单下,菜单栏缺少独立 `File`。 - 在 `src-tauri/src/menu.rs` 新增标准 macOS app menu,把 `File` 放回独立菜单;macOS `Quit` 回到应用菜单。 - 验证 `osascript` 返回菜单栏 `Apple, Mindraw, File, Edit, View, Window, Help`,`File` 菜单含 `Open Directory`、`New File`、`Save`、`Save As...`、`Export as Obsidian Excalidraw...`、`Recent Directories`。 - 完成 Save As 原生面板 smoke: - `File > Save As...` 可打开系统 Save sheet。 - `Cmd+Shift+S` 在 Computer Use smoke 中未打开 sheet,需后续真实键盘或更稳定自动化复测。 - Save sheet 中 `SaveCopy.mindraw` 保持 Save disabled,`SaveCopy.excalidraw` 可启用 Save;当前 `.add_filter("Mindraw", ["mindraw"])` 不足以让用户通过原生 save panel 直接创建 `.mindraw` 包。 ## 关键决策 - 不把自动化通过等同于真实 Finder 拖放 PASS;QA 报告中明确写为“真实 Finder 拖放 smoke 未可靠完成”。 - 不改变此前“不注册 macOS package、不提前 Phase 3.5”的边界;Finder / `open -a` 直接打开普通 `.mindraw` 目录包仍记录为 Phase 2 边界/后续 package 或 deep link 问题。 ## 文件变更 - `src/lib/imageDrop.ts` - `src/lib/imageDrop.test.ts` - `src/hooks/useMenuHandler.ts` - `src/hooks/useMenuHandler.test.ts` - `src/components/ExcalidrawEditor.tsx` - `src-tauri/src/menu.rs` - `02-P/qa/mindraw-phase2-runtime-check.md` - `02-P/plan-progress.markdown` - `CODEGRAPH.md` ## 验证结果 - `npm run test:run -- src/lib/imageDrop.test.ts src/hooks/useMenuHandler.test.ts src/lib/documentFormat.test.ts src/store/useStore.test.ts`:PASS,4 个测试文件,64 个测试通过。 - `cargo test --locked --manifest-path src-tauri/Cargo.toml mindraw_package_tests`:PASS,17 个测试通过。 - `cargo check --manifest-path src-tauri/Cargo.toml`:PASS。 - `npm run build`:PASS。 - `npm run tauri -- build --debug --bundles app`:PASS,生成本地 QA debug `.app`;菜单修复后已重新运行。 - macOS 菜单结构 smoke:PASS,`File` 菜单恢复独立。 - Save As 原生面板 smoke:PARTIAL / FAIL,菜单项能打开 sheet,但 `.mindraw` 文件名不能启用 Save;`Cmd+Shift+S` 仍待复测。 - `git diff --check`:PASS。 - `cargo fmt --manifest-path src-tauri/Cargo.toml`:未执行成功,当前 stable toolchain 未安装 `cargo-fmt` / `rustfmt`。 ## 未决问题 - 真实 Finder 拖放 `.mindraw` 到 App 仍需人工或更稳定 UI 自动化复测。 - 原生 Save As 直接创建 `.mindraw` 包已实测未达标,需要后续专门入口、默认保存策略或文件选择器方案。 - `Cmd+Shift+S` Save As 快捷键在本轮自动化 smoke 中未触发,需要真实键盘或更稳定自动化复测。 - 真实 Finder 拖放 smoke 和更完整失败态人工矩阵仍未完成。 - 原生 folder picker 直接选择 `.mindraw` 包已实测失败;后续若要直接选包,需要 macOS package 注册、deep link 或专门“Open Mindraw Package”入口。 - Finder / `open -a` 直接打开普通 `.mindraw` 目录包仍受“不注册 macOS package”的 MVP 边界限制。 ## 后续建议 - 下一步优先收口 Phase 2 剩余可验证项:Save As `.mindraw` 原生面板方案、`Cmd+Shift+S` 复测、真实 Finder 拖放、失败态文案矩阵。 - 如果继续卡在真实 Finder 拖放自动化,应让人工手测补证据,或先建立可稳定触发 Tauri `onDragDropEvent` 的 UI 自动化方案。