修复 Windows 升级后"数据为空 + 应用无限重启"严重问题 — v0.5.2 在 Windows 从旧版升级后,如果新 `userData` 目录被检测为空,渲染进程会自动触发恢复流程,主进程随即 `app.relaunch() + app.quit()`;叠加 electron-updater 的 `autoInstallOnAppQuit=true`,会让每次退出都重装 pending 包并再次空库启动,形成无限重启循环。现移除渲染端自动恢复(必须由用户在 `DataRecoveryDialog` 点击确认),主进程对 `performRecovery` 增加会话级防抖,所有平台统一关闭 `autoInstallOnAppQuit`,并将 `bootstrapPromptWorkspace` 包裹为 try/catch,避免工作区初始化失败阻塞启动
新增启动诊断日志 — 关键启动事件(DB 初始化、恢复候选检测、恢复执行与结果)现会以 JSON 行写入 `<userData>/logs/startup.log`,便于用户在反馈升级/恢复问题时提供可分析的上下文;日志超过 512KB 自动轮转
️ 工作区引导重构为"四象限 + 双向合并":`bootstrapPromptWorkspace` 不再无条件 `rmSync(promptsDir)` 再导出;现在按 `DB 空 / 工作区空` 组合分四种情形处理:两边都空时 noop;仅 DB 有数据按文件真源导出;仅工作区有数据反向导入 DB;两边都有数据则按 `updatedAt` 做 newer-wins 合并。DB 端 `updated_at` 的 INTEGER/string 类型不一致已由统一的 `toEpochMs()` 比较路径消除。工作区侧被删除/重命名的遗留目录不再直接 `rmSync`,而是移动到 `<workspace>/.trash/<ISO>/` 并保留最近 5 个快照,支持 `EXDEV` 跨卷降级
首次升级前自动快照 SQLite 文件 — 从旧版本首次启动 0.5.3 时,会把 `prompthub.db` 复制为 `prompthub.db.backup-before-0.5.3.<timestamp>.db`,并写入 marker 文件保证幂等,避免合并逻辑万一出错时没有可回滚的索引层;新建或体积小于 4 KB 的全新 DB 不会写入 marker,避免污染首次启动路径
数据恢复后禁止"复活" — `DataRecoveryDialog` 成功执行 `performRecovery` 后,会在 userData 下写入 `.restore-in-progress` 标记;下次启动时 `bootstrapPromptWorkspace` 检测到该标记会跳过 "WS→DB 反向导入" 阶段,改为以恢复后的 DB 为真源重建工作区,彻底避免旧工作区把已删除的数据又"导入"回来
同 id 冲突改为 newer-wins + 隔离而非删除 — 工作区反向导入时若出现多个 Prompt 目录携带同一个 `id`,按 `updatedAt` 选胜者,其余副本会被移动到 `<workspace>/.trash/conflicts/` 下保留(仍受 `.trash` 保留策略约束),而不是被直接覆盖或丢弃
启动日志脱敏 — `startup.log` 中的用户数据路径、数据源路径、应用数据路径会把用户主目录前缀替换为 `~`,避免用户分享日志时泄露真实用户名