# 2026-06-25 Mindraw 另存 ## 用户目标 继续推进 `.mindraw` Phase 2:在普通原生 Save As 面板无法直接创建 `.mindraw` 目录包后,补齐可真实使用的显式 `.mindraw` 另存路径。仍不进入 macOS package 注册、全局链接 runtime 或完整生产迁移。 ## 已完成事项 - 新增后端 Tauri 命令 `save_mindraw_package_as`,使用 Mindraw save panel filter,并把非 `.mindraw` 选择路径归一为 `.mindraw`。 - 新增 `ensure_mindraw_save_path()` 和对应 Rust 单测,覆盖无扩展/错误扩展时的 `.mindraw` 路径归一。 - 前端新增 `saveCurrentFileAsMindrawPackage()`,接入 `File > Save As Mindraw Package...` 菜单命令。 - 专用另存会先 flush active editor snapshot,传入其他 dirty tab 路径用于后端覆盖保护,并在保存成功后把当前 tab adopted 到新 `.mindraw` 包路径。 - 默认保存名改为 `原名 copy.mindraw`,避免从 `Source.excalidraw` 另存到同目录时 macOS save panel 因同 basename 源文件禁用 Save。 - 真实 debug app smoke 验证通过:从 `/private/tmp/mindraw-save-mindraw-as-check/Source.excalidraw` 直接另存为 `Source copy.mindraw`,Save 按钮可用,保存后文件树显示 `Source copy` 和 `Source`,Tab 路径切换到 `Source copy.mindraw`。 - 磁盘验证通过:生成 `manifest.json`、`drawing.excalidraw`、`.assets/`,且 `manifest.scene.sha256` 与实际 drawing sha256 一致。 - 修复 `Cmd+Shift+S` 被前端普通保存快捷键拦截的问题:`Cmd/Ctrl+S` 现在只处理无 Shift 的普通保存,让 native menu accelerator 触发 Save As。 - 新增 `useKeyboardShortcuts` 测试,覆盖 `Cmd/Ctrl+S` 前端保存和 `Cmd/Ctrl+Shift+S` 留给原生菜单。 - 真实 debug app smoke 验证通过:打开 `/private/tmp/mindraw-shortcut-saveas-check/Source.excalidraw` 后按 `Cmd+Shift+S`,已触发普通 Save As sheet。 - 补齐 `.mindraw` 失败态摘要:缺 `.assets` 显示 assets directory missing/invalid;缺 `drawing.excalidraw` 显示 scene missing/damaged/invalid;包内文件缺失不再被误判为顶层文件不存在。 - 真实 debug app 失败态矩阵验证通过:damaged manifest、damaged scene、hash mismatch、illegal asset path、missing assets、missing manifest、missing scene 7 个坏包均弹出明确 Mindraw package 失败文案,并保持 `00-valid.mindraw` active。 - 复核真实 Finder 拖放:使用 debug app、Finder reveal、Computer Use、`open -R`、Finder 列表视图 / 外部目录变体、`cliclick` 快速与慢速拖放多次尝试;均未触发 Mindraw drop,最后一次慢速 `cliclick` 拖放卡住后中断。本项继续记录为 NOT VERIFIED,不签 PASS。 - 测试结束后已停止 debug app、恢复 `/Users/ar/Library/Application Support/com.mindraw.desktop/preferences.json`,删除 `/tmp/mindraw-save-mindraw-as-check`、`/tmp/mindraw-shortcut-saveas-check`、`/tmp/mindraw-failure-matrix-check`、`/tmp/mindraw-finder-drag-check`、`/tmp/mindraw-finder-drag-external` 和临时偏好备份。 ## 关键决策 - 保留普通 `File > Save As...` 的已知边界:该系统面板仍不能通过 `.mindraw` 文件名启用 Save,也没有暴露 Mindraw filter 选择器。 - 当前 `.mindraw` 用户可用另存路径明确为专用 `File > Save As Mindraw Package...`。 - 不因为专用另存通过而改变“不注册 macOS package、不提前 Phase 3.5”的边界。 ## 文件变更 - `src-tauri/src/lib.rs` - `src-tauri/src/menu.rs` - `src/hooks/useMenuHandler.ts` - `src/hooks/useMenuHandler.test.ts` - `src/hooks/useKeyboardShortcuts.ts` - `src/hooks/useKeyboardShortcuts.test.tsx` - `src/store/useStore.ts` - `src/store/useStore.test.ts` - `02-P/qa/mindraw-phase2-runtime-check.md` - `02-P/plan-progress.markdown` - `CODEGRAPH.md` ## 验证结果 - `npm run test:run -- src/hooks/useKeyboardShortcuts.test.tsx`:PASS,1 个测试文件,2 个测试通过。 - `npm run test:run -- src/store/useStore.test.ts`:PASS,34 个测试通过。 - `npm run test:run -- src/lib/imageDrop.test.ts src/hooks/useMenuHandler.test.ts src/hooks/useKeyboardShortcuts.test.tsx src/lib/documentFormat.test.ts src/store/useStore.test.ts`:PASS,5 个测试文件,70 个测试通过。 - `cargo test --locked --manifest-path src-tauri/Cargo.toml mindraw_package_tests`:PASS,19 个测试通过。 - `npm run build`:PASS。 - `cargo check --manifest-path src-tauri/Cargo.toml`:PASS。 - `npm run tauri -- build --debug --bundles app`:PASS。 - 真实 debug app 专用另存 smoke:PASS。 - 真实 debug app `Cmd+Shift+S` 普通 Save As smoke:PASS。 - 真实 debug app 7 个坏包失败态矩阵 smoke:PASS。 - 真实 Finder 拖放 smoke:NOT VERIFIED,自动化未能可靠形成 Finder 文件 drop 事件;前端文档拖放路径分流仍有自动化覆盖。 ## 未决问题 - 真实 Finder 拖放 `.mindraw` 到 App 仍需人工或更稳定 UI 自动化复测。 - 原生 folder picker 直接选择 `.mindraw` 普通目录包、Finder / `open -a` 直接打开普通目录包仍受 MVP 不注册 package 的边界限制。 - 权限不足、非目录路径等扩展失败态仍未做真实矩阵。 ## 后续建议 - 下一步继续 Phase 2 剩余 QA:真实 Finder 拖放、权限不足等扩展失败态。 - Phase 2 收口后再进入 Phase 3 导出互通;Phase 3.5 全局链接仍按用户确认的原计划后置。