Skip to content
yykauePublic

About

珍藏每一次冒险。一个基于 **Electron + React + TypeScript** 的本地游戏存档管理器,支持 Windows 与 macOS Apple Silicon

Resources

Stars

1 star

Watchers

0 watching

Forks

Repository files navigation

SaveHub

简体中文 | English

珍藏每一次冒险。一个基于 Electron + React + TypeScript 的本地游戏存档管理器,支持 Windows 与 macOS Apple Silicon。

开始使用

Windows:打开 release/1.1.5/win-unpacked/SaveHub.exe,或使用 release/1.1.5/ 下的安装包、便携版。整个 win-unpacked 文件夹需要一起保留,不能只复制其中的 EXE。先关闭正在运行的旧版,再打开新版;已有资料库可直接使用。

  1. 首次启动时资料库为空,点击「添加游戏」,可选模板或从空白开始。打开「游戏设置」。确认当前系统的游戏存档根目录与要备份的相对路径。
  2. 关闭游戏,点击「创建新存档」,填写名称与备注。
  3. 点击某份存档的「读档」,确认游戏及会写入文件的云同步已关闭。弹窗以红色大字提醒,无需额外勾选,直接点击「确认读档」。应用先自动保存当前进度并校验,成功后才恢复选中的内容;自动保存失败会停止读档。
  4. 要撤销读档,在时光轴右侧的「读档恢复点」中找到 读档前 · …,点击恢复即可。

模板创建的游戏可编辑或移除,也可以添加任意游戏。图标支持内置图形与本地 PNG / JPG / WebP / ICO 图片。图片导入后会复制到配置中,不依赖原文件继续存在。

全部游戏

「全部游戏」是工作空间第一个菜单和默认首页,融合游戏概览与管理功能。可切换卡片/列表两种展示风格,搜索、勾选状态在切换和主题返回后保留,展示方式会记住。两种视图均可添加、编辑、删除、找回、导入,以及导出单个/所选/全部游戏。

  • 删除默认保留游戏配置和全部存档。勾选「一并永久删除该游戏的全部存档记录」后,会彻底移除游戏配置、整个游戏资料库目录及全部记录,包括保护、收藏、回收站记录和读档恢复点,不再出现在可找回列表中;游戏原始存档目录不受影响。
  • 导出默认只包含名称、图标、配色、两套系统路径等游戏配置。勾选「一并导出存档记录」后,同时包含全部存档及原有状态、时间、备注和校验信息。
  • 导入时选择整个游戏导出文件夹,也可选择其中的单个游戏文件夹。重复游戏按标识或名称匹配,提供逐项及批量「覆盖、跳过、两者并存」;覆盖只更新配置并保留已有存档,跳过游戏也跳过随包存档。
  • 含存档的包在下一步单独处理存档冲突,沿用现有覆盖限制及事务回滚。游戏和存档在最终点击「执行导入」前均不写入;任一步取消都不修改资料库。导入后请检查本机游戏路径。

完整格式和验证说明见 游戏管理说明与验收。当前 1.1.5 整改与实际包验证范围见整改执行结果。

可选模板与旧存档导入

新资料库为空。添加游戏时可选择艾尔登法环、杀戮尖塔、黑暗之魂 II 模板,填写名称、图标和常用存档项;实际存档根目录及 Steam 账号子目录由用户选择。应用不会自动读取桌面的 shell 脚本,也不注入作者电脑的 Steam 路径。

旧脚本的 source 对应原备份目录。应用创建的新存档使用独立资料库和 UUID,不再根据目录数量决定编号,也不会覆盖旧的 ArchiveFile…。

「导入旧存档」会复制旧目录内所有 ArchiveFile… 子目录,兼容 ArchiveFile0、ArchiveFile10th-DLC-1st-1level 等自定义后缀。「导入存档」还接受单个旧存档目录、以名称命名的单份导出目录及其批量导出根目录,也兼容旧版 manifest.json / collection.json 导出。发现重复时,在一个对话框中列出所有重复项,每项可独立选择覆盖、跳过或两者并存,也可批量设置后逐项调整,最后点击「执行导入」。确认前不会写入本批任何存档,取消会取消整批导入。

同一游戏中,再次导入同一个来源目录会识别为重复,即使该来源的内容已经更新;不同来源目录不会仅因内容相同而合并。默认选择跳过。覆盖先复制并校验,再替换选中的已有记录,保留其 ID、创建时间、收藏标记及所在分类状态,并更新修改时间;同一来源已有多份记录时,可指定覆盖目标。受保护的本地记录不能覆盖,只能跳过或两者并存。未受保护的已收藏、回收站、读档恢复点及已移除的恢复点均可覆盖;选择覆盖时,下方显示本地状态标记和提醒。损坏或永久删除未完成的记录仍需先处理异常。两者并存会生成独立 ID,并在名称后添加 (2)、 (3) 等编号。覆盖失败会还原原记录,意外中断后在下次启动时恢复。结果分别列出新导入、已覆盖、两者并存、已跳过与失败;导入源文件始终保留。

导入与导出期间显示进度条、百分比、当前阶段及正在处理的记录或文件。整批进度覆盖校验、复制和最终整理;复制大文件时按已复制字节更新。

功能

  • 多游戏独立配置与独立存档库,Windows / macOS 路径分别保存。
  • 一次备份多个文件或目录,递归保留空目录、文件内容与修改时间。
  • 存档命名、备注、收藏、保护标记、搜索、完整性校验、导入、导出。
  • 点击存档名称、创建时间、文件大小表头切换正序或倒序,默认创建时间倒序;名称支持自然数字排序。
  • 勾选单份或全选当前列表,批量保护、取消保护、移入回收站、找回、导出;保护操作分别提供“所选”和“全部”两个按钮。
  • 收藏仅是星标,允许删除。单份和批量删除确认会醒目提示已收藏记录的数量,批量清单逐项标出“已收藏”,确认后正常移入回收站并保留收藏标记。
  • 保护存档禁止删除;所选记录中只要含有保护存档,整批删除就会被拦截,须先取消保护。保护和取消保护不会生成副本。
  • 「全部存档」包含所有未删除的手动和导入记录,包含已收藏、保护存档;两者只是筛选标记,不移动记录或产生副本。回收站、读档恢复点不计入其中。
  • 批量导出只选一次目标目录;「导出全部」导出当前标签页中的全部记录,不受搜索影响。在已收藏、保护存档和回收站标签页中,分别只导出对应标签页的存档。
  • 恢复前自动创建独立的读档恢复点,事务式替换、失败回滚、下次启动恢复未完成事务。
  • 读档恢复点支持多选、全选后移除;回收站和已移除的恢复点支持多选、全选后找回或永久删除。永久删除须二次确认,真实移除磁盘文件,无法找回。
  • 默认删除游戏保留配置与备份,可在「全部游戏 → 已删除游戏」或设置中找回;勾选一并删除存档后,配置和资料库目录均物理删除,无法找回。
  • 四种持久化主题:宣纸水墨、通透科技、霓虹赛博朋克、磨砂玻璃。右上角为唯一主题入口;再次点击返回上次页面,保留游戏、筛选、搜索、排序、勾选和滚动位置。
  • 支持简体中文与英文(English)双语界面切换,默认中文;可在右上角工具栏或「设置与关于」中切换并持久化保存。
  • 路由、筛选、排序、主题与弹窗变化带过渡效果;遵循系统的减少动态效果设置。
  • 本地文件处理,不需要账号或服务器。不会自动同步、定时备份或检测游戏进程。

存档与标记

每份手动创建或导入的存档只有一个 ID 和一份原始内容。收藏、保护、回收站修改这份记录的标记,切换标记不会生成副本。

视图 显示范围
全部存档 所有未删除的手动或导入存档,包含已收藏和保护记录;不含回收站及读档恢复点
已收藏 带收藏标记且不在回收站的记录;可同时有保护标记
保护存档 带保护标记且不在回收站的记录
回收站 已移除的手动或导入记录;可找回并保留原有标记,也可确认后永久删除
读档恢复点 读档前自动保存的进度,独立展示,不计入全部存档;可恢复游戏进度或移除
已移除的恢复点 从读档恢复点移除的记录;可找回到恢复点列表,或确认后永久删除

在存档的「更多操作」中添加或取消保护标记。侧栏、游戏卡片、时光轴及全部存档统计均采用「全部存档」范围。收藏或保护前后,记录的 ID、文件目录和数量不变;同一份记录可同时出现在全部存档、已收藏、保护存档三个视图中。保护标记限制普通删除和永久删除,不限制读档和导出;收藏仅用于标记和筛选,不阻止删除。

回收站中的存档不能修改保护标记,工具栏不显示「所选保护/所选取消保护」和「全部保护/全部取消保护」按钮,单份菜单中的保护操作仍禁用;需要先找回,再标记保护。旧版本已在回收站中标记保护的记录也需先找回,才能取消保护。批量保护请求只要包含回收站记录,就会在修改任何记录前停止。

「全选当前列表」只选择当前搜索和筛选后可见的有效存档;切换筛选或搜索会清空选择,每个游戏独立保留列表状态。批量保护的“所选”按钮只处理勾选项;“全部”按钮处理当前标签页的全部存档,不受搜索影响。例如,在「已收藏」中只修改收藏记录的保护标记;在「保护存档」中可一次取消该标签页全部记录的保护,取消后这些记录退出该标签页。单份收藏与取消收藏仍通过每行星标操作。

在回收站以外的标签页,两个保护按钮都按各自范围内的记录状态切换:

范围内的状态 所选按钮 全部按钮 点击结果
全部已保护 所选取消保护 全部取消保护 统一取消保护
全部未保护 所选保护 全部保护 统一添加保护
保护与未保护混合 所选保护 全部保护 统一添加保护
没有记录 所选保护(禁用) 全部保护(禁用) 不执行操作

保护操作使用绿色盾牌勾选图标,取消保护使用琥珀色盾牌划线图标,两类按钮的文字、边框及背景颜色均有区别,四种主题均适配。

「导出所选」也能导出保护或回收站中的完整记录。「导出全部」始终按当前标签页的完整范围导出,包括被搜索隐藏的记录;当前标签页没有记录时禁用。回收站中即使没有正常存档,也能导出回收站的完整记录。读档恢复点仍通过独立入口导出。

普通存档删除后进入「回收站」;读档恢复点移除后进入「已移除的恢复点」。这一步只改标记,文件仍在。两个已删除列表均可勾选多份或全选,再点击「找回所选」或「永久删除所选」;恢复点的正常列表也支持多选和全选后移除。「找回」只恢复列表记录,不把内容写入游戏;只有「读档」或恢复点的「恢复」会替换游戏进度。

永久删除的确认框会列出将删除的记录并明确提示“无法恢复”。包含收藏时继续醒目标记,不增加额外阻断;包含保护时必须先找回并取消保护,再移入回收站删除。永久删除成功后,备份目录、原始内容及记录清单一并移除,不能在应用中再次找回,游戏当前存档不受影响。

所有导出(单份、所选、当前标签页全部记录,以及读档恢复点)都会在所选位置新建一个「游戏名-存档导出」外层文件夹。内部保留以存档名称命名的文件夹和导入清单,名称文件夹内就是原始游戏存档。例如:

所选导出目录/
  游戏名-存档导出/
    A/                       存档 A 的实际文件与目录
    B/                       存档 B 的实际文件与目录
    C/                       存档 C 的实际文件与目录
    .savehub-exports/         导入所需的名称、标记与校验清单

每次导出生成独立的外层文件夹,已有同名文件或目录时自动加 (2)、 (3) 等后缀;同一批次内的重名存档也会自动编号,不覆盖现有文件。文件夹名称中的非法字符会替换,原始游戏名和存档名称仍保存在清单中。所有内容先复制并校验,再输出名称目录;正常失败会清理本次输出,保留已有文件。移动或分享整个外层文件夹即可保留原名称、备注、收藏与保护标记,导入时直接选择这个文件夹即可;也可选择里面的单份名称文件夹。旧版没有外层文件夹的命名导出及 manifest.json / collection.json 导出仍可导入。单独导出的普通回收站记录作为新记录导入后不再标记为已删除;恢复点导入保留其恢复点类型及已移除状态。覆盖时以本地记录状态为准。

1.0.0 的自动保护副本仍在原位置,自 1.1.0 起显示在「读档恢复点」,不复制或迁移文件。1.1.2 继续保留「保护存档」手动标记与「读档恢复点」自动备份的独立分类,并将禁止删除的规则从收藏调整为保护。1.1.3 将全部存档视图统一为包含收藏与保护标记的记录,并新增批量永久删除与找回。1.1.4 要求先找回回收站记录才能修改保护标记,并为所有导出增加独立外层文件夹。1.1.5 引入恢复点 5/15 双队列管理与稳定时间戳淘汰、20 MiB 分类滚动日志、读档事务回滚与崩溃隔离、空间预算预检及全游戏工作区管理。已有标记和原始存档内容不需要迁移。

存储与恢复规则

默认资料库位于 Electron 的 userData 目录,精确路径在「设置与关于」中显示:Windows 通常为 %APPDATA%\SaveHub,macOS 通常为 ~/Library/Application Support/SaveHub。开发模式使用项目内的 .local-data。可用 SAVEHUB_DATA_DIR 指向单独的资料库进行测试或本地部署;不要让两个进程共用同一资料库。

SaveHub/
  library.json                    游戏资料、主题与界面语言
  library.json.previous           上一次配置
  vault/<game-id>/
    game.json                     自定义游戏资料
    snapshots/<snapshot-id>/
      manifest.json               路径、时间、备注、标记、SHA-256 校验清单
      payload/                    原始存档内容
  transactions/                   恢复事务日志
  import-transactions/            导入覆盖事务日志,完成后清理

存档不是压缩包,可以直接检查其文件。读档只替换配置的相对路径,其他游戏文件不受影响;被替换目录内新出现的文件会移除,以保持完整恢复语义。读档恢复点也会记录原本不存在的路径,恢复它时这些路径会重新不存在。

复制先写入暂存目录,再比较源文件、复制文件和校验清单;验证成功后才提交。恢复先验证备份,再生成自动恢复点,再在目标磁盘暂存,通过逐项重命名替换。恢复失败时还原原文件;异常中断后根据事务日志恢复。失败暂存目录和日志保留供诊断。它们可能占用额外空间。普通移除只改变记录状态,不释放文件;在回收站或已移除的恢复点中执行永久删除才释放相应备份内容。恢复点按下述数量规则自动清理。

永久删除前检查整批记录身份、删除状态、保护标记和路径安全。每份记录开始删除前持久化清理状态;若文件占用或应用中断,重新打开后仍显示“永久删除未完成”,可再次永久删除以继续清理。已开始清理的记录可能不完整,禁止找回、编辑、保护或导出;批量结果会分别列出成功与失败。

为了避免越界写入,拒绝绝对的备份项、..、父子路径重叠、大小写冲突、Windows 保留名称、符号链接与目录联接。选中的根目录和子路径必须可读写;资料库不能与要备份的内容重叠。目录在磁盘上尚未存在时,请先启动游戏创建存档,或手动建立正确目录。

关闭游戏与云同步十分重要:应用会检测复制和替换前后的变化,但不能阻止其他进程同时写入。系统权限错误、磁盘故障或外部程序持续修改文件仍可能需要人工恢复;应用会保留保护副本与事务记录。

Windows 与 macOS

使用同一套 Electron 和 Node 文件实现,无 Bash、盘符替换命令或 rm -rf 依赖。macOS 的预设路径留空,需要选择实际存档位置;应用兼容 macOS 不代表游戏本身有 macOS 原生版本。通过 Wine / CrossOver 运行的游戏可以选择兼容层中的实际目录。SaveHub 不转换游戏存档格式。

最低系统要求依据当前 Electron 运行时:Windows 10 及以上,macOS 13 Ventura 及以上。Mac 发行目标只配置 arm64,不构建 Intel 版本。Windows 当前提供 x64 版本。

历史版本验证(不代表本轮 1.1.5):2026-11-03 已在 Apple Silicon Mac(macOS 26.6)完成源码测试、四项 GUI 测试和 pnpm dist:mac 打包,并在打包后的 .app 上通过基础 GUI 测试。Mac 包使用 ad-hoc 签名(build.mac.identity: "-"),可避免未签名包下载后被提示“已损坏”;其他 Mac 首次打开仍需在“隐私与安全性”中允许。发布给其他用户前,需要配置 Apple Developer 签名与公证(届时删除 identity: "-");本项目未包含证书或公证凭据。Windows 包也未配置代码签名。

恢复点保留与日志

  • 每游戏默认保留 5 个读档恢复点 / 15 个已移除的恢复点。设置页配置全局数量,游戏设置可分别覆盖或继承全局。只接受包含 0 的安全自然数,0 表示不保留。
  • 两队列均按记录的修改时间 updatedAt淘汰最早记录。活动队列超额先移入已移除队列,后者超额物理删除,不额外弹出提示;收藏或保护标记不豁免恢复点数量限制。普通存档不受此策略影响。
  • 导入数量超过保留限制时,先完成整批导入,再整理这两个队列;导入游戏包时,同样在全部游戏与随包存档处理完成后执行。设置为 0 也遵循此顺序,导入结果中的成功数量表示已成功导入的记录,整理后留存数量可能更少。
  • 活动上限为 N,本次找回 K 条,须满足 N > 0 且 1 ≤ K ≤ N。超限整批拒绝,N=0 时单个和批量均不可找回。找回后修改时间更新为当前时间,保留创建时间,再统一清理两队列;活动队列已满仍可找回符合数量限制的记录。
  • 包括 0/0 设置在内,事务 safety 副本均保留到提交或失败恢复完成。旧库采用 5/15,缺失 updatedAt 时使用合法创建时间;旧 maxRestorePoints=0 不再表示无限保留。升级现有库前请确认新数量规则。
  • 运行日志按类型和操作分类,可在「设置与关于 → 日志保留」配置全部日志的总容量,默认 20 MB(20,971,520 字节)。只接受非负整数,超额全局淘汰最早的完整记录;减少容量后立即整理。0 会清空已有运行日志并停止保留新日志,重启仍生效;事务恢复文件不受影响。设置页也可打开日志目录。

开发与构建

完整操作步骤见 开发、构建、运行与发布指南,包括环境安装、所有项目命令、生产预览、实际安装包验证、摘要审计、Windows / macOS 打包、CI、远程发布及中断恢复。

1.1.5 的源码、检查和实际 Windows 包证据见整改执行结果。历史 1.1.4 产物与验收继续保留,macOS Apple Silicon 的本轮实机验证需在对应平台运行。

SaveHub 的新 Logo 以 S 形存档轨迹与保存节点组成,采用深青、浅色与红色。应用侧栏、启动页、关于与帮助、浏览器标签和桌面图标使用同一设计;SVG、1024 像素 PNG 与多尺寸 Windows ICO 位于 build/。修改与生成方式见 Logo 资源说明。

Git 管理源码、测试脚本、构建配置、pnpm 锁文件、build/ 中的图标及手写文档。依赖、构建产物、本地存档、测试数据、自动生成的截图与验收 JSON、日志和本机环境配置由 .gitignore 排除;忽略规则不会删除现有文件。

本轮报告、截图和 trace 写入 test-results/,docs/screenshots/ 保留历史证据;发行审计 JSON 由本机或 CI 检查生成。环境变量示例 .env.example 及共享 VS Code 配置可以提交。

环境:Node.js 22.12+(建议 24),pnpm 11.25.0。

pnpm install --frozen-lockfile
pnpm dev                 # Vite + Electron,使用 .local-data
pnpm lint
pnpm format:check
pnpm check:contracts
pnpm test:e2e            # Playwright 运行器、独立报告和 trace
node scripts/test-package.mjs # 验证当前平台的实际应用包
node scripts/benchmark.mjs    # 摘要缓存与真实文件读写测量
node scripts/benchmark-ui.mjs # 100 / 1,000 / 10,000 条摘要的界面测量
pnpm checksums
pnpm test                # 临时文件上的真实存储测试
pnpm build               # 类型检查 + 前端生产构建
pnpm build:icons         # 修改 Logo SVG 后重新生成 PNG 和 Windows ICO
pnpm test:ui             # Electron 端到端测试、四主题截图
pnpm test:interactions   # 主题返回、批量操作、标记、排序与过渡验证
pnpm test:deletion       # 回收站和恢复点的批量找回、物理删除及中断重试
pnpm test:import         # 重复导入的逐项选择、混合执行、取消与四主题界面
pnpm test:games          # 全部游戏拖拽排序、卡片/列表切换、两阶段导入导出与彻底删除
pnpm test:retention      # 双队列恢复点保留策略、超限拦截与 0 容量禁用验证
pnpm test:optimizations  # 覆盖状态提醒、日志容量、导入导出进度和无勾选读档提示
pnpm pack:win            # Windows 解包版
pnpm dist:win            # Windows 安装版 + 便携版
pnpm pack:mac            # macOS arm64 解包版(.app)
pnpm dist:mac            # 在 Mac 上构建 arm64 DMG + ZIP
pnpm test:portable       # Windows 便携版的解包、启动与存读档验证
pnpm audit:release       # 核对当前平台包内代码与发行文件摘要

构建完成后 pnpm start 可使用 Electron 打开生产界面。所有依赖版本已固定,并提供 pnpm-lock.yaml。安装时会获取官方 Electron 运行时;网络不通时可参考 Electron 安装文档 的镜像配置,文件仍使用包内的官方摘要校验。

.github/workflows/build.yml 对 PR 执行 Windows 必要检查,对主分支和标签执行 Windows x64 / macOS arm64 完整源码及实际包验证。标签创建经审计的 draft Release,正式发布仍需手动进行。本轮尚未执行远端 CI。

项目结构

electron/storage.mjs       备份、完整恢复、校验、事务回滚、导入导出
electron/presets.mjs       显式旧脚本文本解析与测试 fixture 辅助
electron/main.mjs          Electron 窗口、原生对话框、IPC 权限边界
electron/i18n.mjs          主进程与存储层的多语言字典与翻译解析
electron/preload.cjs       最小化、明确列举的 renderer API
electron/retention.mjs     双队列保留与整批找回约束
electron/restore-transaction.mjs 读档提交、回滚与启动恢复
electron/classified-logger.mjs 可配置总容量的分类日志(默认 20 MB)
shared/                   共享 IPC 契约、文案与可选模板
src/pages/、src/hooks/     独立页面与数据操作 hook
src/i18n/                 前端多语言配置(支持语言注册表、中英字典与类型安全键值)
src/App.tsx               游戏库、存档时光轴、编辑表单、主题与语言选择
src/format.ts             多语言日期、游戏名与文件大小格式化
src/SnapshotList.tsx      标记视图、复选、批量操作与表头排序
src/RestorePoints.tsx     恢复点与已移除恢复点的选择、找回及删除
src/ImportDialog.tsx      重复导入的逐项处理选择、批量设置及结果
src/motion.ts             页面过渡及减少动态效果适配
src/art.tsx               本地 SVG 场景与游戏图形
src/styles.css            布局与交互样式
src/list.css              列表、批量操作、恢复点和过渡样式
src/themes.css            四套完整视觉主题
tests/contracts.ts        编译期跨进程 IPC 契约与类型检查
tests/storage.test.mjs    文件操作与恢复机制测试
tests/games.test.mjs      游戏排序、导入导出、冲突处理与整库彻底清理测试
tests/import.test.mjs     混合导入、覆盖回滚和真实进程中断恢复测试
tests/optimization.test.mjs 覆盖状态矩阵、导入后保留整理、进度单调性与日志容量测试
tests/remediation.test.mjs 损坏事务隔离、恢复边界表、IPC 参数校验与空间预算测试
tests/e2e/desktop.spec.ts Playwright 桌面端到端测试运行器入口
scripts/smoke.mjs          独立测试资料库上的 Electron 端到端检查
scripts/interactions.mjs  主题返回、选择排序、批量文件操作与状态语义检查
scripts/deletion-interactions.mjs 回收站与恢复点的实际找回、删除和重试
scripts/import-interactions.mjs 重复导入、取消、逐项处理与四主题界面验证
scripts/game-interactions.mjs 全部游戏拖拽排序、视图切换、两阶段导入导出与彻底清理
scripts/retention-interactions.mjs 恢复点双队列保留、批量找回上限与空库初始化验证
scripts/optimization-interactions.mjs 本地状态提醒、进度条、日志容量与读档警告验证
scripts/portable-smoke.mjs 单文件便携版的实际启动与存读档检查
scripts/test-package.mjs  针对当前平台打包产物的端到端回归入口
scripts/test-apfs.mjs     Apple Silicon 大小写敏感/不敏感 APFS 磁盘映像验证
scripts/test-installer.ps1 Windows NSIS 安装、已安装程序回归与卸载验证
scripts/benchmark.mjs     存储摘要缓存与真实 payload 读写性能基准
scripts/benchmark-ui.mjs  100 / 1,000 / 10,000 条摘要的界面性能基准
scripts/audit-release.mjs  包内源码与发行文件摘要核对
scripts/e2e-harness.mjs   E2E 启动、程序身份、trace、报告与清理
test-results/            分次测试报告、截图和 trace

Electron 启用 context isolation、sandbox,关闭 Node integration,拒绝导航和额外窗口,并校验 IPC 主窗口与 frame 来源,遵循 Electron 安全指南。渲染层不能直接访问文件系统。主题与插画均随应用打包,无在线字体或图片依赖。

验证记录

tests/storage.test.mjs 覆盖真实复制与 SHA-256、完整目录替换、多游戏隔离、恢复点撤销、缺失路径恢复、损坏备份拦截、文件变化拦截、失败回滚、启动恢复、符号链接保护、旧备份去重、导出重导入、回收站、配置持久化及并发拒绝。新增验证包含物理删除后文件消失、整批预检与保护拦截、删除中断后重启及重试、恢复点批量找回、收藏允许删除与标记保留、保护删除拦截、批量保护范围与部分失败、读档前自动保存的先后顺序与失败中止、名称目录直接导出、名称冲突和非法字符、导出失败清理及旧导出格式兼容。Windows 备份临时目录提交遇到短暂占用时最多重试 4 次、累计等待 500 毫秒;持续权限错误仍会报错,不会覆盖已有提交目录。

scripts/smoke.mjs 使用独立的合成游戏文件启动真实 Electron,操作创建存档、搜索收藏、确认读档、验证磁盘内容、回收站、增删游戏与四种主题。截图展示的是测试示例,不是用户的真实游戏进度。测试结束会清理本轮测试数据,不读取或覆盖真实游戏存档。

2026-11-02 重复导入功能的验证:73 项存储测试全部通过,含重复导入的混合选择、取消、覆盖失败回滚、两处真实进程中断后的恢复及提交后的清理重试。生产构建与严格 TypeScript 检查通过;基础界面 11 项、交互 16 项、删除专项 6 项、导入专项 6 项均通过,渲染错误为 0。导入专项还验证了四主题最小窗口布局、批量设置保留已选覆盖目标,以及确认前新旧存档均不写入。报告位于 docs/screenshots/import-verification.json,界面截图为 import-conflicts-*.png 和 import-results.png。本次未重新打包或验证 macOS 运行。

同日的回收站工具栏与 Logo 更新已通过生产构建、严格 TypeScript 检查及三套 Electron 界面回归:基础界面 12 项、交互 16 项、删除专项 6 项,渲染错误为 0。已确认回收站的两种所选保护按钮均不显示,其他标签页的保护操作正常;新 Logo 在四主题中加载正常,Windows ICO 可由系统图像接口读取。PNG 尺寸、ICO 的 7 个尺寸图层及构建后的 SVG 与设计源文件一致性均已核对。预览与回收站截图分别为 docs/screenshots/savehub-logo.png、trash-toolbar.png。

单文件便携版由 NSIS 启动器解包后再启动 Electron;scripts/portable-smoke.mjs 通过仅用于测试的本机调试端口连接实际窗口,验证当前版本与界面资源、启动、存档、读档、自动恢复点及退出。它不依赖启动器转发调试器标准输出。当前交付证据见 1.1.5 验收记录 与 1.1.5 整改执行结果;1.1.4 验收记录;1.1.3 历史记录、1.1.2 历史记录、1.1.1 历史记录、1.1.0 历史记录与 1.0.0 历史记录继续保留。

About

珍藏每一次冒险。一个基于 **Electron + React + TypeScript** 的本地游戏存档管理器,支持 Windows 与 macOS Apple Silicon

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages