github mcthesw/game-save-manager v1.8.0

one day ago

云同步基础设施、Ludusavi 存档识别与 Archive V2

本次更新带来了云同步状态管理Ludusavi 游戏存档自动识别Archive V2 格式Windows 注册表备份等重大功能,同时包含大量安全加固、性能优化和架构升级,因此版本号直接跨越到了V1.8.0。

✨ 核心功能亮点

  • 🎮 Ludusavi 存档自动识别

    • 集成 Ludusavi 数据库,添加游戏时可自动匹配存档路径,无需手动查找。
    • 通过 rust-embed 压缩内嵌 manifest,离线可用。(后续考虑出不带manifest版本,因为体积较大)
    • 批量导入失败时提供详细原因和注册表路径说明。
    • image
  • ☁️ 云同步基础设施

    • 同步状态面板:新增 Overview 页面,展示同步结果、待处理状态和最近同步时间。
    • 多设备位置跟踪:以"每设备独立位置"替代全局单一位置,支持并行分支和同设备分叉识别。
    • 后台非阻塞同步:云同步通过后台任务管理器执行,不再阻塞 UI。
    • 统一流式传输层:带 Hook 扩展点的流式传输抽象,统一上传/下载路径。
    • image
  • 📦 压缩预设与 Archive V2 格式

    • 可选压缩预设(仅存储 / 快速 / 标准 / 极限),使用 Zstd 替代 BZip2。
    • 支持同名文件。
  • 🔐 存档完整性校验

    • 新增 XXH3 哈希校验,恢复前自动验证归档完整性,阻止损坏存档被应用。
  • 🪟 Windows 注册表备份

    • 支持备份和恢复注册表中的游戏存档数据,附带源指纹。
  • ⏪ 撤销上次恢复

    • 管理页面新增"撤销上次应用的快照",误操作可一键回退。
    • image
  • 💾 额外覆盖备份管理

    • 新增对额外覆盖备份(Extra Overwrite Backups)的管理功能。
    • image
  • ⚡ 智能跳过未变更备份

    • 定时备份使用 XXH3 指纹,文件未变化时自动跳过。

🖥️ 界面与体验优化

  • 🔤 自定义字体与外观设置:支持自定义字体和外观配置。
  • 🔧 路径变量编辑器改版:全新设计,状态展示更清晰。
  • 📋 批量删除快照:支持多选快照一键批量删除。
  • 🔔 统一反馈与通知系统:集中式通知系统,统一 z-index 管理。
image

🐛 Bug 修复

  • 云同步安全增强:修复下载/写入失败时可能丢失已有文件的问题,强化原子回滚。
  • 单次写入后端防护:修复对不支持覆盖写入的后端的上传保护。
  • 时间戳语义修复:修复 ZIP 时间戳保留的兼容性问题。
  • Zip Slip 安全修复:防止 ZIP 路径穿越攻击。
  • 备份并发错误处理:修复 backup_all 中信号量获取错误传播。
  • 云同步禁用报错:修复禁用时触发 unknown-backend 错误。
  • 日志修复:修复日志按钮位置并改善日志轮转。
  • 同名文件限制移除:移除添加游戏时过时的同名文件限制。

⚡ 性能优化

  • 定时与批量备份路径优化,减少不必要的 IO。
  • 侧边栏列表渲染开销降低,搜索时自动展开。
  • 快照表格排序与选择性能增强。

🛠️ 开发者可能关心的变更

  • 生命周期 Hook 管线:typed snapshot hook pipeline,围绕快照创建/删除、恢复前/后等事件的可组合钩子。
  • IPC 层重构:game draft input + 后端 ID 分配,暴露 typed hook 和 sync 命令。
  • Pre-commit Hooks:Husky + lint-staged + clippy fix + typecheck 预提交检查。
  • 依赖升级:rgsm 核心版本更新至 1.8.0。
  • JSON 格式变更
    • 同步状态采用多设备位置跟踪结构。
    • 归档元数据升级为 V2 格式,含压缩预设和 XXH3 哈希。
    • 存档配置新增 save_unit_id 字段。
  • 新增 Criterion 压缩算法基准测试。

🚀 发布

不知道下载哪个?推荐使用 Portable 版本(便携版),如果无法启动可能是缺少了 Webview2


Features

  • ludusavi: ✨ auto-detect save locations via Ludusavi database #264 (Sworld)
  • ludusavi: ⚡ compress bundled Ludusavi manifest via rust-embed #264 (Sworld)
  • import: enhance game import process with detailed failure reasons and registry path handling #264 (Sworld)
  • ui: add custom font settings and appearance configuration #274 (Sworld)
  • ui: implement centralized user feedback and notification system with z-index management #276 (Sworld)
  • backup: ✨ managing extra overwrite backups #288 (Sworld)
  • backup: ✨ skip unchanged timer auto backups with xxh3 fingerprinting and archive module refactor #309 (Sworld)
  • path-variable: ✨ revamp path variable editor and status UX #312 (Sworld)
  • ui: ✨ add cloud sync status panel and settings #314 (Sworld)
  • backup: ✨ add batch_delete_snapshots command #314 (Sworld)
  • manage: ✨ add undo last applied snapshot #315 (Sworld)
  • backup: ✨ add compression presets and archive V2 format #317 (Sworld)
  • backup: ✨ add stable save-unit IDs for archive prefix #320 (Sworld)
  • backup: 🛡️ add archive hash (XXH3) for integrity verification #322 (Sworld)
  • backup: 🗃️ add WinRegistry backup with source fingerprint #322 (Sworld)
  • backup: 🗃️ add sync metadata and config backup foundation #325 (Sworld)
  • hooks: ✨ add typed snapshot hook pipeline #325 (Sworld)
  • cloud-sync: ✨ add sync state and session orchestration #325 (Sworld)
  • frontend: ✨ harden sync settings workflows #325 (Sworld)
  • ui: ✨ improve sync UX and player-facing copy #325 (Sworld)

Bug Fixes

  • ui: resolve deprecation warnings and improve settings organization #285 (Sworld)
  • sync: 🐛 avoid unknown-backend error when disabled #287 (Sworld)
  • correct test directory path by adding trailing slash #292 (banzhe)
  • disable directory creation and deletion checks for unsupported backends #305 (Sworld)
  • cloud-sync: 🚑 preserve existing files on download/write failures #307 (Sworld)
  • cloud-sync: 🚑 harden atomic rollback errors and unify local atomic write path #307 (Sworld)
  • backup: 🐛 preserve zip timestamp semantics and legacy compatibility #308 (Sworld)
  • backup: 🐛 preserve restored mtime and harden archive tests #308 (Sworld)
  • add-game: 💄 remove border from launch-path picker button #312 (Sworld)
  • path-variable: 🐛 scope suggestion scrolling to current input instance #312 (Sworld)
  • manage: 🐛 address undo review feedback #315 (Sworld)
  • backup: 🐛 handle semaphore acquire errors in backup_all #316 (Sworld)
  • addgame: 🐛 remove outdated same-name file restriction #317 (Sworld)
  • backup: 🔒 prevent zip slip and fix archive metadata #317 (Sworld)
  • backup: 🔒 validate save-unit IDs and isolate test config paths #320 (Sworld)
  • logging: fix log button location and improve log rotation #323 (Claude)
  • backup: 🐛 harden registry cross-platform handling and verify UI #322 (Sworld)
  • cloud-sync: 🐛 guard single-write backends in transfer uploads #333 (Sworld)

Documentation

  • architecture: 📝 document cloud sync layering, IPC facade boundary, and test gates #307 (Sworld)
  • agents: 📝 require TDD-first workflow for bug fixes #308 (Sworld)
  • 📝 add pre-commit checks and i18n guidelines to AGENTS.md #314 (Sworld)
  • 📝 add V2.0 roadmap #317 (Sworld)

Code Refactoring

  • composables: extract reusable logic from MainSideBar and Settings #285 (Sworld)
  • cloud-sync: 🏗️ add unified streaming transfer layer with hook extension points #307 (Sworld)
  • cloud-sync: ⚡ migrate full sync flows to unified streaming transfers #307 (Sworld)
  • backup: 🚚 route always-sync snapshot upload through transfer layer #307 (Sworld)
  • backup: 🚚 rename backup test support module to utils #309 (Sworld)
  • cloud-sync: ♻️ non-blocking cloud sync via background task manager #314 (Sworld)
  • ipc: ♻️ use game draft input and backend ID allocation #320 (Sworld)
  • backup: ♻️ harden registry checks and stream archive hashing #322 (Sworld)
  • ipc: ♻️ expose typed hook and sync commands #325 (Sworld)
  • sync: ♻️ separate per-device snapshot positions #325 (Sworld)
  • hooks: ♻️ rebuild hook pipeline around explicit contexts #325 (Sworld)

Performance Improvements

  • backup: ⚡ optimize timer and batch backup path #316 (Sworld)
  • sidebar: ⚡ reduce list overhead and expand on search #316 (Sworld)
  • table: ⚡ enhance table performance with optimized sorting and selection features #316 (Sworld)
  • benchmarks: ⚡ add compression algorithms benchmark with Criterion #316 (Sworld)

Tests

  • cloud-sync: ✅ add streaming regression tests and clean up formatting #307 (Sworld)
  • backup: ✅ add end-to-end and legacy timestamp regression tests #308 (Sworld)
  • backup: 🧪 move backup tests into dedicated module #309 (Sworld)

Continuous Integration

  • hooks: 🔧 setup husky with lint-staged, clippy fix, and typecheck #330 (Sworld)

Chores

  • ludusavi: 📦 vendor ludusavi-manifest snapshot #264 (Sworld)
  • i18n: add English translation #264 (Sworld)
  • update version to 1.7.0 #274 (Sworld)
  • deps: bump bytes from 1.9.0 to 1.11.1 in /src-tauri #300 (dependabot[bot])
  • path-variable: ♻️ remove debug logs from device fetch flow #312 (Sworld)
  • release: bump version to 1.8.0 and update roadmap #332 (Sworld)

Commits

  • ee77617: fix(backup,sidebar): 🐛 propagate join errors and harden sidebar search behavior (Sworld) #316

Don't miss a new game-save-manager release

NewReleases is sending notifications on new releases.