edit | blame | history | raw

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 copySource,Tab 路径切换到 Source copy.mindraw
  • 磁盘验证通过:生成 manifest.jsondrawing.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 全局链接仍按用户确认的原计划后置。