From 316e3759b8c7203ae4c631150d96787c2fdab3db Mon Sep 17 00:00:00 2001 From: AaronSu Date: Mon, 26 Oct 2026 20:08:56 +0800 Subject: [PATCH 01/29] feat(website): refresh v1.8.0 content and themed app captures (v1.5.0) --- README.en.md | 2 +- README.ja.md | 2 +- README.md | 2 +- README.zh-TW.md | 2 +- docs/code-review-graph/README.md | 2 + docs/code-review-graph/website.md | 23 +++++++++ website/DESIGN.md | 15 +++--- website/README.md | 14 ++++-- website/app/globals.css | 4 ++ website/components/GlassControls.tsx | 7 +-- website/components/MarketingPage.tsx | 29 ++++++++---- website/design/2026-10-26-screenshots.md | 57 +++++++++++++++++++++++ website/lib/site.ts | 4 +- website/package-lock.json | 4 +- website/package.json | 2 +- website/public/assets/library-dark.png | Bin 0 -> 258050 bytes website/public/assets/library.png | Bin 225746 -> 239000 bytes website/public/assets/tags-dark.png | Bin 0 -> 69592 bytes website/public/assets/tags.png | Bin 66180 -> 69558 bytes website/scripts/optimize-images.mjs | 2 + 20 files changed, 140 insertions(+), 31 deletions(-) create mode 100644 website/design/2026-10-26-screenshots.md create mode 100644 website/public/assets/library-dark.png create mode 100644 website/public/assets/tags-dark.png diff --git a/README.en.md b/README.en.md index 48c6bab..d79179a 100644 --- a/README.en.md +++ b/README.en.md @@ -41,7 +41,7 @@ Get-FileHash .\GameLibrary-Setup-v1.8.0.exe -Algorithm SHA256 ![Tag management for organizing the collection](website/public/assets/tags.png) -Captured from v1.5.5 in an isolated sample library, with the application's default covers and no personal game directories. A full recording has not been produced yet; the [recording brief](docs/demo-recording.md) is ready. +Captured from v1.8.0 in light mode, using an isolated sample library and the application's default covers, with no personal game directories. Screenshots on the marketing website match its light or dark theme. A full recording has not been produced yet; the [recording brief](docs/demo-recording.md) is ready. ## Get started diff --git a/README.ja.md b/README.ja.md index 36cba1b..4b65544 100644 --- a/README.ja.md +++ b/README.ja.md @@ -41,7 +41,7 @@ Get-FileHash .\GameLibrary-Setup-v1.8.0.exe -Algorithm SHA256 ![ゲームを整理するためのタグ管理](website/public/assets/tags.png) -v1.5.5 の独立したサンプルライブラリで撮影しています。アプリ標準のカバーを使用し、個人のゲームフォルダーは含みません。操作動画はまだ制作していません。[録画手順](docs/demo-recording.md)を用意しています。 +v1.8.0 の独立したサンプルライブラリをライトモードで撮影しています。アプリ標準のカバーを使用し、個人のゲームフォルダーは含みません。紹介サイトのスクリーンショットは、ページのライト・ダーク設定に合わせて切り替わります。操作動画はまだ制作していません。[録画手順](docs/demo-recording.md)を用意しています。 ## 使い始める diff --git a/README.md b/README.md index 3fba2f3..eda7077 100644 --- a/README.md +++ b/README.md @@ -41,7 +41,7 @@ Get-FileHash .\GameLibrary-Setup-v1.8.0.exe -Algorithm SHA256 ![标签管理:整理游戏的分类与标签](website/public/assets/tags.png) -截图来自 v1.5.5 的隔离示例库,使用应用默认封面,不包含个人游戏目录。完整录屏尚未制作;[录屏脚本](docs/demo-recording.md)已准备好。 +截图来自 v1.8.0 的隔离示例库,使用浅色模式和应用默认封面,不包含个人游戏目录。宣传网页中的截图会随网页主题切换浅色或深色。完整录屏尚未制作;[录屏脚本](docs/demo-recording.md)已准备好。 ## 三步开始 diff --git a/README.zh-TW.md b/README.zh-TW.md index 4358338..8e08a6c 100644 --- a/README.zh-TW.md +++ b/README.zh-TW.md @@ -41,7 +41,7 @@ Get-FileHash .\GameLibrary-Setup-v1.8.0.exe -Algorithm SHA256 ![標籤管理:整理遊戲的分類與標籤](website/public/assets/tags.png) -畫面取自 v1.5.5 的隔離範例遊戲庫,使用應用程式預設封面,不含個人遊戲目錄。完整操作影片尚未製作;[錄影腳本](docs/demo-recording.md)已備妥。 +畫面取自 v1.8.0 的隔離範例遊戲庫,使用淺色模式和應用程式預設封面,不含個人遊戲目錄。宣傳網頁中的截圖會隨網頁主題切換淺色或深色。完整操作影片尚未製作;[錄影腳本](docs/demo-recording.md)已備妥。 ## 三步開始 diff --git a/docs/code-review-graph/README.md b/docs/code-review-graph/README.md index c442d51..984db27 100644 --- a/docs/code-review-graph/README.md +++ b/docs/code-review-graph/README.md @@ -1,5 +1,7 @@ # GameLibrary 代码预览框架 +2026-10-26 网站 v1.5.0:下载与四语言宣传内容同步产品 v1.8.0,新增真实浅深色游戏库及标签截图,缩略图和放大图复用网页 `.dark` 主题切换。修改前已做影响分析,修改后增量解析 6 个文件,错误为空,并执行图谱变更分析。实际执行范围为素材采集、转换、源码审阅与图谱同步;网站测试、构建及浏览器验收未运行,未推送或部署。见[网站实施记录](website.md)和[截图来源](../../website/design/2026-10-26-screenshots.md)。 + 2026-10-26 优化第三轮(权限显式声明):协议里的 `GrantedPermissions` 以前所有第一方客户端都不填,宿主“null = 不限权”成了唯一实际路径。本轮新增 `ClientPermissionProfiles`(Tauri 桥接 7 项最小集合、tauri-exit 仅 `host.manage`、CLI/MCP/桌面端为目录里除 `access.admin` 外的全部权限),`HostProcessLauncher` 透传,各入口建连时显式声明;新增契约测试核对权限名拼写、真实命名管道集成测试验证受限声明、空声明与 `none` 权限的实际行为;旧 Unity 密钥经评估保留,现有回退测试依赖它。源码提交 `a5d5d4b` 后增量更新,解析错误 0,登记 425 文件、4,134 节点、40,707 边、237 条执行流与 28 个社区。Contract 59、Architecture 11、Unit 183、新增权限用例 4/4 与 HostStop E2E 3/3 通过;Integration 613 中 612 通过,唯一失败仍是既有环境依赖的 Unity 翻译用例(下载固定翻译包 + PowerShell 辅助进程,单独连跑两遍通过)。真实窗口、屏幕阅读器与真机点选未验收;未打包、推送或发布。见[优化记录](../development/2026-10-26-post-v1.7.23-optimization.md)。 2026-10-26 优化第二轮(批量 IPC 与权限收紧):`GameBatchBar` 的约 2N 次逐项 IPC 改为 `games.update_batch`、`tags.assign_batch`、`games.remove_batch` 三次批量提交(500 分块、逐项回执、每项 SAVEPOINT 隔离),Tauri 关闭 `withGlobalTauri` 并把 opener/dialog 从整套默认收紧到实际使用的三项权限,CSP 与默认不限权授权作为剩余风险写进记录。修改前核对现有 SQL 索引与 `candidates.review_batch` 先例;三个源码提交(`b331780`、`4ac962a`、`99f4d06`)后在 `99f4d06` 全量重建,解析错误 0,登记 422 文件、4,118 节点、40,622 边,检测 237 条执行流与 28 个社区,新增 `BatchRequests.cs`、`SqliteLibraryStore.Batches.cs`、`BatchWritesTests.cs`、`GameBatchBar.batch.test.tsx` 均已入图。Release 编译 0 警告 0 错误,契约 55、架构 11、单元 183、集成 609(复跑全绿)通过;前端 24 文件 143 用例、typecheck 与 `tsc && vite build` 通过;`cargo check` 通过。真实窗口、屏幕阅读器与真机批量点选未验收;未打包、推送或发布。见[优化记录](../development/2026-10-26-post-v1.7.23-optimization.md)。 diff --git a/docs/code-review-graph/website.md b/docs/code-review-graph/website.md index 5e50e67..5b5fdd9 100644 --- a/docs/code-review-graph/website.md +++ b/docs/code-review-graph/website.md @@ -1,3 +1,26 @@ +# v1.8.0 内容与主题截图 · 2026-10-26 · 网站 v1.5.0 + +本轮依据产品 v1.8.0 发布说明和当前源码更新宣传内容。GitHub Release API 确认该版为正式版且四项资产齐全。网站原先下载 v1.7.23、展示 v1.5.5 截图,现在统一指向 v1.8.0,并重新采集同版本的浅深色游戏库与标签页。来源、失败尝试和最终采集记录见[截图记录](../../website/design/2026-10-26-screenshots.md)。 + +```mermaid +flowchart LR + Routes["原四语言路由"] --> Page["MarketingPage · 新增 updates / 批量整理 / 下载说明"] + Page --> Controls["GlassControls · 原导航与截图 dialog"] + Controls --> Captures["浅深色 PNG / 响应式 WebP"] + Bootstrap["themeBootstrap / applyTheme"] --> Dark["已有 .dark 类"] + Dark --> CSS["globals.css · 选择对应主题截图"] + CSS --> Captures + Sharp["optimize-images.mjs"] --> Captures +``` + +`Screenshot` 两处调用共用主题显示规则,缩略图与原图同步切换,不增加主题监听器。四语言 `translate()`、静态导出路径、生产前缀与下载文件命名保留。导航首项改为更新入口,优势章节的原有锚点仍可用。Godot 说明依据真实检测器;Unity 安装说明注明缺失组件需要联网,避免将本地管理的离线能力扩大到翻译服务。 + +文件范围:`MarketingPage.tsx`、`GlassControls.tsx`、`globals.css`、`lib/site.ts`、图片转换脚本、网站版本清单、四张截图及对应设计/说明文档。根目录四语言 README 仅同步截图版本、主题与来源。代码修改前已调用影响分析并增量同步图谱;修改后再次更新,解析 6 个文件、错误为空。变更分析识别 5 个函数/类,未关联到执行流,并提示 5 处测试关联缺口;这是图谱的静态关联结果,不是测试执行结果。 + +本次执行真实应用截图采集与 WebP 转换。按项目约定,未运行测试、构建、lint、类型检查、网站静态门禁或网页浏览器验收;未推送或部署。既有主题用例继续覆盖 `.dark` 解析所依赖的浅色、深色、跟随系统、无效偏好及存储不可用情况,本轮未执行。回滚以本次独立网站提交为单位,同时撤回素材与网站版本,再生成旧版预览图片。 + +以下为历史记录。 + # 网站 v1.4.0 上线授权 · 2026-10-21 维护者确认本地预览视觉,并授权上传 GitHub 与上线。发布从远端 main 独立迁入本页视觉重构及两张参考海报;Next.js 和 source-map-js 采用最小安全修补版本。网站代码结构与样式沿用下方已审计实现,依赖清单不在结构图索引范围内。最终 CI、部署和线上核对结果见[发布记录](../deployment/website-v1.4.0.md)。下方未运行项描述的是初次实现阶段。 diff --git a/website/DESIGN.md b/website/DESIGN.md index 8ca4930..fcf4c56 100644 --- a/website/DESIGN.md +++ b/website/DESIGN.md @@ -56,7 +56,7 @@ spacing: # GameLibrary 宣传网页设计规范 -网站 v1.4.0,2026-10-21。用户确认采用“纸雕为底、像素点睛”:以第二张复古像素海报和第五张纸雕收藏夹海报为视觉来源,在现有静态站内重排布局与样式。它替代 v1.3.0 的灰白视觉;历史设计与交付记录保留在 [网站实施记录](../docs/code-review-graph/website.md)。 +网站 v1.5.0,2026-10-26。沿用用户确认的“纸雕为底、像素点睛”:以第二张复古像素海报和第五张纸雕收藏夹海报为视觉来源。当前补充产品 v1.8.0 的内容与浅深色实机图;历史设计与交付记录保留在 [网站实施记录](../docs/code-review-graph/website.md)。 ## 视觉来源与融合方法 @@ -83,7 +83,8 @@ spacing: |---|---| | 首屏 | 纸雕收藏夹与像素封面;Windows、稳定下载版本、安装入口、真实界面锚点、无需账号与离线管理 | | `#experience` | 目录、书架、手柄入口的像素路径;HTML 三步“扫描指定目录 → 确认游戏入口 → 从游戏库启动” | -| `#app-preview` | 完整游戏库实机图,标明 v1.5.5、简体中文和隔离示例库,点击放大;下方列识别的引擎 | +| `#app-preview` | 完整游戏库实机图,标明 v1.8.0、简体中文和隔离示例库,浅深色随网页切换,点击放大;下方列识别的引擎 | +| `#updates` | v1.8.0 的批量整理、审核选择保留、连接恢复与键盘操作改进 | | `#advantages` | 本机数据、原文件保留、审核入库、引擎识别,使用编号和分隔说明 | | `#collection` | 标签与收藏说明、原版标签截图、作为例子的纸签 | | `#translation` | Unity 翻译插件与字体配置、备份恢复;注明自配服务与因游戏而异的支持和效果 | @@ -91,16 +92,16 @@ spacing: | `#download` | 文件夹面板里的安装版、便携版、工具包、SHA-256 和发布说明 | | `#questions` / 页脚 | 六项 FAQ、真实项目链接、四语言入口 | -下载源读取 `lib/site.ts` 的公开正式版 v1.7.23;网站版本与桌面产品版本独立。本次发布已获维护者人工验收确认,未执行的自动 WebView 烟测仍保留原记录,并沿用本次验收豁免。截图中的旧图标、封面和控件不重绘成新版。宣传文案不承诺全程离线、所有游戏汉化或已验证的翻译效果。 +下载源读取 `lib/site.ts` 的公开正式版 v1.8.0;2026-10-26 已通过 GitHub Release API 核对正式版状态和四项资产。网站版本与桌面产品版本独立。截图直接来自同版本应用,采集来源见[截图记录](design/2026-10-26-screenshots.md)。宣传文案不承诺全程离线、所有游戏汉化或已验证的翻译效果。 ## 文件范围、路由与状态 -- `components/MarketingPage.tsx`:重排既有章节,加入首屏和流程插画、收藏纸签、下载面板;四语言正文仍共用 `translate()`。 +- `components/MarketingPage.tsx`:保留既有章节,增加 `#updates`,同步四语言版本说明、截图标注与下载文案;正文仍共用 `translate()`。 - `app/globals.css`:纸张/像素视觉令牌、布局、主题、原生控件和响应式样式。 -- `components/GlassControls.tsx`:保留所有交互;默认主题同步浅色;截图 `wide` 与加载优先级 `priority` 分开。 +- `components/GlassControls.tsx`:保留所有交互;截图缩略与放大各包含浅深色原图,由现有 `.dark` 类决定显示;导航加入更新入口。 - `lib/theme.ts`、三组 `layout.tsx`、现有 `scripts/theme.test.mjs`:同步浅色缺省和两套主题色。 - `public/assets/hero-paper-pixel.png`、`pixel-journey.png`、`scripts/optimize-images.mjs`:透明原图及 640/960/1440px WebP;原有实机图仍用 440/880/1320px 预览。 -- `package.json` / `package-lock.json`:网站独立版本更新到 1.4.0,不新增依赖。 +- `package.json` / `package-lock.json`:网站独立版本更新到 1.5.0,不新增依赖。 路由仍为简中 `/`、繁中 `/zh-TW/`、英文 `/en/`、日文 `/ja/`,生产前缀仍为 `/GameLibrary`。页面保留 Server Component,浏览器状态仍集中在 `GlassControls`;没有增加状态库、客户端外壳或远程字体。 @@ -108,6 +109,8 @@ spacing: 语言和主题菜单继续使用原生 `details`,手机导航和截图使用原生 `dialog`,保留 Escape、焦点恢复、菜单互斥、点击外部关闭与弹窗滚动锁定。FAQ、跳至正文、可见键盘焦点和 44px 操作区继续保留。缩略截图使用 WebP,放大仍读取原始 PNG。 +截图复用首次绘制脚本与选择器已经维护的 `.dark` 类,不另设主题状态或监听器。默认浅色、显式深色及跟随系统都使用同一个显示规则。CSS 隐藏的另一个主题图片不占布局,也不进入无障碍树。 + 1180px 以下导航收紧;920px 以下首屏与内容单列;640px 以下流程说明纵排、按钮与下载面板适配手机;360px 以下继续收敛内距和字级。长文件名允许折行,主题不会给真实截图加滤镜。减弱动画、高对比和系统强制配色都有对应规则。 ## 迁移、回滚与验收 diff --git a/website/README.md b/website/README.md index 40bc1cd..3171bea 100644 --- a/website/README.md +++ b/website/README.md @@ -1,12 +1,12 @@ # GameLibrary 宣传网站 -网站 v1.4.0 采用用户确认的“纸雕为底、像素点睛”:首屏纸雕收藏夹收纳像素风景,流程区用同组像素插画串起扫描、确认、启动。暖纸色、宋体标题、朱橙按钮、纸签和下载文件夹延续两张海报的风格。[DESIGN.md](DESIGN.md) 记录布局、改动范围、迁移与回滚;[网站实施记录](../docs/code-review-graph/website.md) 记录架构与图谱影响。 +网站 v1.5.0 沿用“纸雕为底、像素点睛”:首屏纸雕收藏夹收纳像素风景,流程区用同组像素插画串起扫描、确认、启动。暖纸色、宋体标题、朱橙按钮、纸签和下载文件夹延续两张海报的风格。[DESIGN.md](DESIGN.md) 记录布局、改动范围、迁移与回滚;[网站实施记录](../docs/code-review-graph/website.md) 记录架构与图谱影响。 沿用 Next.js 16 / React 19 / Tailwind 4 静态导出,无新增依赖。简中 `/`、繁中 `/zh-TW/`、英文 `/en/`、日文 `/ja/` 继续共用页面;生产路径前缀仍为 `/GameLibrary`。 ## 页面与交互 -- 左文右图首屏 → 三步像素路径 → 完整实机图 → 本地优势、标签收藏、Unity 翻译、启动与数据 → 文件夹下载区 → FAQ。 +- 左文右图首屏 → 三步像素路径 → 完整实机图 → v1.8.0 更新 → 本地优势、标签收藏、Unity 翻译、启动与数据 → 文件夹下载区 → FAQ。 - 新访客默认浅色,保存过的浅色、深色和跟随系统偏好继续生效。三套布局、预绘制脚本和选择器共用原主题键与逻辑。 - 菜单仍为原生 `details`,手机导航与截图查看器仍为原生 `dialog`。保留键盘、Escape、菜单互斥、焦点恢复和弹窗滚动锁定。 - 两张无文字透明插画与真实截图分开展示。手机布局、长文件名折行、减弱动画、高对比和强制配色规则已在源码中配置。 @@ -14,13 +14,19 @@ ## 素材与版本 -`public/assets/icon.png` 仍为官方平面 logo。`library.png` 和 `tags.png` 保留原版内容:v1.5.5、简体中文、隔离示例库、默认封面;点击放大读取 1320×820 PNG,不重绘成新版界面。 +`public/assets/icon.png` 仍为官方平面 logo。`library.png` 和 `tags.png` 为 v1.8.0 浅色实机图,`library-dark.png` 和 `tags-dark.png` 为同一示例库的深色图;均为 1320×820、简体中文、应用默认封面。缩略图与放大图跟随网页解析后的主题,保留已保存偏好及跟随系统的行为,不使用颜色滤镜。采集方式和来源见[截图记录](design/2026-10-26-screenshots.md)。 `hero-paper-pixel.png` 与 `pixel-journey.png` 为内置 `image_gen` 生成的透明概念插画。图中封面不是具体游戏资产,页面不以插画冒充实机。完整输入与提示词见 [素材生成记录](design/2026-10-21-art-prompts.md)。 图片管线使用已有 Sharp:截图生成 440/880/1320px WebP,插画生成 640/960/1440px WebP。PNG 源文件提交,派生 WebP 和构建文件按现有忽略规则保留在本机。 -下载版本读取 `lib/site.ts` 的正式版 v1.7.23,提供安装版、便携版、工具包和 SHA-256。维护者已确认人工验收;自动 WebView 烟测保留 not-run,本次发布沿用其验收豁免。网站版本与桌面产品版本独立。 +下载版本读取 `lib/site.ts` 的正式版 v1.8.0,提供安装版、便携版、工具包和 SHA-256。2026-10-26 已通过 GitHub Release API 核对 `draft=false`、`prerelease=false` 及四项资产;发布说明仍保留预发布阶段的旧文字,本页依据当前 Release 状态。网站版本与桌面产品版本独立。 + +## v1.5.0 本地内容更新 + +2026-10-26:四语言补充 v1.8.0 的批量整理、审核失败项保留选择、连接恢复与键盘操作改进。替换四张真实应用截图,增加主题对应的 WebP 预览;下载卡改为升级和数据保留说明。没有新增依赖或路由。 + +本次已运行截图采集及图片转换,未运行测试、构建、lint、类型检查、网站静态门禁或浏览器验收。网页尚未推送或部署,不能用历史上线记录代替本版验收。 ## v1.4.0 上线 diff --git a/website/app/globals.css b/website/app/globals.css index 50c52a7..34d1392 100644 --- a/website/app/globals.css +++ b/website/app/globals.css @@ -144,6 +144,10 @@ summary::-webkit-details-marker { display: none; } .screenshot { min-width: 0; padding: 12px; border: 1px solid var(--line); border-radius: 8px; background: var(--surface); box-shadow: 0 5px 0 color-mix(in srgb, var(--line) 65%, transparent), var(--shadow); } .screenshot-button { position: relative; display: block; width: 100%; padding: 0; border: 0; background: none; cursor: zoom-in; } .screenshot-button > img { width: 100%; border-radius: 3px; } +.app-capture-light { display: block; } +.app-capture-dark { display: none; } +.dark .app-capture-light { display: none; } +.dark .app-capture-dark { display: block; } .screenshot-button:focus-visible { outline-offset: 4px; } .expand-hint { position: absolute; right: 14px; bottom: 14px; display: grid; place-items: center; width: 38px; height: 38px; border-radius: 4px; color: var(--ink); box-shadow: var(--shadow); } figcaption { display: flex; align-items: flex-start; justify-content: space-between; gap: 16px; padding-top: 13px; color: var(--muted); font-size: 11px; } diff --git a/website/components/GlassControls.tsx b/website/components/GlassControls.tsx index d051982..0b1718f 100644 --- a/website/components/GlassControls.tsx +++ b/website/components/GlassControls.tsx @@ -27,7 +27,7 @@ export function Header({ language }: { language: Language }) { const [themeExpanded, setThemeExpanded] = useState(false); const themeLabels = { dark: t("深色", "深色", "Dark", "ダーク"), light: t("浅色", "淺色", "Light", "ライト"), system: t("跟随系统", "跟隨系統", "System", "システム") }; const sections = [ - ["advantages", t("独特优势", "獨特優勢", "Why GameLibrary", "独自の強み")], + ["updates", t("v1.8.0 更新", "v1.8.0 更新", "What's new", "v1.8.0 の更新")], ["experience", t("如何使用", "如何使用", "How it works", "使い方")], ["download", t("下载", "下載", "Download", "ダウンロード")], ["questions", t("常见问题", "常見問題", "FAQ", "よくある質問")], @@ -121,10 +121,11 @@ export function Screenshot({ name, alt, caption, language, priority = false, wid const id = useId(); const t = translate(language); const [failed, setFailed] = useState(false); + const images = [name, name.replace(".png", "-dark.png")]; return <>
{caption}
@@ -132,7 +133,7 @@ export function Screenshot({ name, alt, caption, language, priority = false, wid { if (event.target === event.currentTarget) modal.current?.close(); }}>
{caption}
- {alt} + {images.map((image, index) => {alt})}
; diff --git a/website/components/MarketingPage.tsx b/website/components/MarketingPage.tsx index 040d6bb..5fb4f6f 100644 --- a/website/components/MarketingPage.tsx +++ b/website/components/MarketingPage.tsx @@ -63,40 +63,50 @@ export default function MarketingPage({ language }: { language: Language }) {

{t("真实应用", "真實應用", "The actual app", "実際のアプリ")}

{t("封面、收藏和标签,", "封面、收藏和標籤,", "Covers, favorites, tags.", "カバーも、お気に入りも。")}{t("在同一处找到。", "在同一處找到。", "Together in one place.", "ひとつの場所に。")}

-

{t("这是 GameLibrary 的实际界面。点击图片,可以放大查看完整截图。", "這是 GameLibrary 的實際介面。點擊圖片,可以放大查看完整截圖。", "This is the real GameLibrary interface. Open the image to see the full capture.", "実際の GameLibrary の画面です。画像をクリックすると全体を拡大できます。")}

+

{t("这是 v1.8.0 的实际界面,使用独立示例库。图片随网页切换浅色或深色,点击可放大查看。", "這是 v1.8.0 的實際介面,使用獨立範例庫。圖片隨網頁切換淺色或深色,點擊可放大檢視。", "The actual v1.8.0 app, using an isolated sample library. Screenshots match the page's light or dark theme. Click to enlarge.", "独立したサンプルライブラリを使った v1.8.0 の実画面です。ページのライト・ダーク設定に合わせて切り替わり、クリックで拡大できます。")}

-
-

{t("可识别的游戏引擎", "可辨識的遊戲引擎", "Recognized game engines", "識別できるゲームエンジン")}

  • Unity
  • RPG Maker MV / MZ
  • Ren’Py
  • Kirikiri
  • Flash
+
+

{t("可识别的游戏引擎", "可辨識的遊戲引擎", "Recognized game engines", "識別できるゲームエンジン")}

  • Unity
  • Godot
  • RPG Maker MV / MZ
  • Ren’Py
  • Kirikiri
  • Flash
+
+

v1.8.0

{t("游戏多了,", "遊戲多了,", "A growing library.", "ゲームが増えても、")}{t("整理不用一项项来。", "整理不用逐項來。", "Fewer repetitive steps.", "まとめて整理できます。")}

{t("批量收藏、添加标签和移出游戏库,逐项返回结果。这一版也改进了审核、连接恢复和键盘操作。", "批次收藏、新增標籤和移出遊戲庫,逐項回傳結果。這一版也改進了審核、連線恢復和鍵盤操作。", "Favorite, tag and remove games in bulk, with a result for each item. This release also improves review, connection recovery and keyboard controls.", "お気に入り、タグ付け、登録の削除をまとめて行い、各項目の結果を確認できます。確認作業、接続の復旧、キーボード操作も改善しました。")}

+
+

01

{t("选好一批,一起整理", "選好一批,一起整理", "Organize a whole selection", "選んだゲームを一括整理")}

{t("勾选多个游戏后,一次收藏、加标签或移出库。移出记录保留原始游戏文件。", "勾選多個遊戲後,一次收藏、加標籤或移出庫。移出記錄保留原始遊戲檔案。", "Select multiple games to favorite, tag or remove them from the library together. Removing records leaves the original game files in place.", "複数のゲームを選び、お気に入り、タグ、登録の削除を一括で操作。登録を削除しても元のゲームファイルは残ります。")}

+

02

{t("审核失败,不用重新挑", "審核失敗,不用重新選", "Keep your selection after a failed review", "確認に失敗した項目は選択を保持")}

{t("审核时没处理成功的项目继续保持勾选。扫描或名称翻译遇到任务丢失、连续连接失败时,会停止等待并给出提示。", "審核時未處理成功的項目繼續保持勾選。掃描或名稱翻譯遇到工作遺失、連續連線失敗時,會停止等待並顯示提示。", "Items that fail during review stay selected. Scans and title translation stop waiting and show a message if a job disappears or the connection keeps failing.", "確認に失敗した項目は選択したまま残ります。スキャンやタイトル翻訳の処理が見つからない場合や接続が繰り返し失敗した場合は、待機を終了して知らせます。")}

+

03

{t("后台重启后,重新连接", "背景服務重啟後,重新連線", "Reconnect after a service restart", "バックグラウンドサービスの再起動後に再接続")}

{t("后台服务重启导致连接失效时,应用会重建连接并重试当前请求一次,减少手动重启程序的麻烦。", "背景服務重啟導致連線失效時,應用程式會重建連線並重試目前請求一次,減少手動重啟程式的麻煩。", "If a service restart breaks the connection, the app reconnects and retries the current request once, reducing the need to restart the app yourself.", "サービスの再起動で接続が切れた場合は再接続し、現在のリクエストを一度だけ再試行。アプリを手動で再起動する手間を減らします。")}

+

04

{t("键盘操作与阅读更清楚", "鍵盤操作與閱讀更清楚", "Clearer reading and keyboard controls", "読みやすさとキーボード操作を改善")}

{t("调整徽章文字对比度与详情面板焦点顺序,分开游戏卡的选择和启动操作;动画尊重系统的减少动态效果设置。", "調整徽章文字對比度與詳細資料面板焦點順序,分開遊戲卡的選取和啟動操作;動畫遵循系統的減少動態效果設定。", "Improved badge contrast and details-panel focus order, with separate selection and launch controls on game cards. Animations respect your system's reduced-motion setting.", "バッジの文字コントラストと詳細パネルのフォーカス順を改善し、ゲームカードの選択と起動を別の操作にしました。アニメーションは OS の動きを減らす設定に従います。")}

+
+
+

{t("独特优势", "獨特優勢", "Why GameLibrary", "独自の強み")}

{t("本地优先,", "本機優先,", "Local first. ", "ローカル優先、")}{t("文件仍归你管。", "檔案仍歸你管。", "Your files stay yours.", "ファイルはあなたのもの。")}

{t("游戏库数据保存在本机。扫描和入库保留原文件,哪些游戏进库由你确认。", "遊戲庫資料儲存在本機。掃描和入庫保留原檔案,哪些遊戲進庫由你確認。", "Library data stays on your PC. Scanning and adding games preserve original files, and you decide what enters the library.", "ライブラリのデータはこの PC に保存。スキャンや登録で元のファイルを変えず、何を登録するかは自分で決められます。")}

01

{t("数据留在本机,无需账号", "資料留在本機,無需帳號", "Data stays on your PC, no account", "データはこの PC に、アカウント不要")}

{t("游戏库、标签、设置与启动记录都保存在这台电脑上。管理本地游戏不必注册或登录,断网也能使用。", "遊戲庫、標籤、設定與啟動記錄都儲存在這台電腦上。管理本機遊戲不必註冊或登入,斷網也能使用。", "Your library, tags, settings and launch history live on this PC. You can manage local games without signing up or logging in, even offline.", "ライブラリ、タグ、設定、起動履歴はこの PC に保存されます。登録やログインなしで、オフラインでも管理できます。")}

02

{t("原文件不动", "原檔案不動", "Original files stay put", "元のファイルはそのまま")}

{t("扫描、入库和移除记录都不会搬动游戏文件。把文件移入回收站,需要你单独确认。", "掃描、入庫與移除記錄都不會搬動遊戲檔案。把檔案移入資源回收筒,需要你另行確認。", "Scanning, adding and removing records never move your game files. Sending files to the Recycle Bin needs your separate confirmation.", "スキャン、登録、登録の削除でゲームファイルを移動しません。ゴミ箱への移動は別途確認が必要です。")}

03

{t("入库前先经你确认", "入庫前先經你確認", "You confirm before it is added", "登録前にあなたが確認")}

{t("扫描只生成候选入口,核对启动文件后再加入游戏库,不会自动把一堆无关程序收进来。", "掃描只產生候選入口,核對啟動檔案後再加入遊戲庫,不會自動把一堆無關程式收進來。", "Scanning only suggests candidate launchers. You check each one before it enters the library, so unrelated programs are not added automatically.", "スキャンは候補の起動先を提示するだけ。起動ファイルを確認してから登録するので、無関係なプログラムが自動で入ることはありません。")}

-

04

{t("认得主流独立游戏引擎", "認得主流獨立遊戲引擎", "Recognizes common indie engines", "主要なインディーゲームエンジンを識別")}

{t("自动识别 Unity、RPG Maker MV / MZ、Ren’Py、Kirikiri 与 Flash,也支持手动添加 EXE、LNK 和 SWF。", "自動辨識 Unity、RPG Maker MV / MZ、Ren’Py、Kirikiri 與 Flash,也支援手動新增 EXE、LNK 和 SWF。", "Detects Unity, RPG Maker MV / MZ, Ren’Py, Kirikiri and Flash automatically, and also supports adding EXE, LNK and SWF manually.", "Unity、RPG Maker MV / MZ、Ren’Py、Kirikiri、Flash を自動で識別。EXE、LNK、SWF の手動追加にも対応します。")}

+

04

{t("认得主流独立游戏引擎", "認得主流獨立遊戲引擎", "Recognizes common indie engines", "主要なインディーゲームエンジンを識別")}

{t("自动识别 Unity、Godot、RPG Maker MV / MZ、Ren’Py、Kirikiri 与 Flash,也支持手动添加 EXE、LNK 和 SWF。", "自動辨識 Unity、Godot、RPG Maker MV / MZ、Ren’Py、Kirikiri 與 Flash,也支援手動新增 EXE、LNK 和 SWF。", "Detects Unity, Godot, RPG Maker MV / MZ, Ren’Py, Kirikiri and Flash automatically, and also supports adding EXE, LNK and SWF manually.", "Unity、Godot、RPG Maker MV / MZ、Ren’Py、Kirikiri、Flash を自動で識別。EXE、LNK、SWF の手動追加にも対応します。")}

{t("整理与查找", "整理與尋找", "Organize and find", "整理と検索")}

{t("记不住名字,", "記不住名字,", "Forgot the name? ", "名前を忘れても、")}{t("也能按标签找。", "也能依標籤找。", "Find it by tag.", "タグで探せます。")}

{t("按标题、路径或标签搜索。游戏多了,也不用逐个打开文件夹找。", "依標題、路徑或標籤搜尋。遊戲多了,也不用逐一打開資料夾找。", "Search by title, path or tag, without opening each folder to find a game.", "タイトル、パス、タグで検索できます。フォルダーをひとつずつ開いて探す手間を減らせます。")}

-

{t("标签自己定", "標籤自己訂", "Use your own tags", "自分で決めるタグ")}

{t("按引擎、类型或游玩状态分类,一个游戏可以关联多个标签。", "依引擎、類型或遊玩狀態分類,一個遊戲可關聯多個標籤。", "Group games by engine, genre or play status. A game can have more than one tag.", "エンジン、ジャンル、プレイ状況で分類。ひとつのゲームに複数のタグを付けられます。")}

+

{t("标签自己定,一批一起加", "標籤自己訂,一批一起加", "Your tags, applied in bulk", "自分のタグをまとめて付ける")}

{t("按引擎、类型或游玩状态分类,一个游戏可以关联多个标签。也可以选中多个游戏,一次加上同一标签。", "依引擎、類型或遊玩狀態分類,一個遊戲可關聯多個標籤。也可選取多個遊戲,一次加上同一標籤。", "Group games by engine, genre or play status, with multiple tags per game. Select several games to apply the same tag to all of them.", "エンジン、ジャンル、プレイ状況で分類し、ひとつのゲームに複数のタグを付けられます。複数のゲームに同じタグをまとめて設定することもできます。")}

{t("常玩的放前面", "常玩的放前面", "Keep favorites handy", "よく遊ぶゲームを手近に")}

{t("收藏常玩的游戏。给标签设置星级,常用分类就能排在前面。", "收藏常玩的遊戲。為標籤設定星級,常用分類就能排在前面。", "Favorite the games you play often. Set star ratings on tags to bring useful categories to the top.", "よく遊ぶゲームをお気に入りに登録。タグに星を付けて、よく使う分類を上に表示できます。")}

{t("标签归类更顺手", "標籤歸類更順手", "Easier tag grouping", "タグ整理がスムーズ")}

{t("在游戏详情里,把标签拖进任意分类(包括空分类),也可以改用分类选择器。", "在遊戲詳情裡,把標籤拖進任意分類(包括空分類),也可以改用分類選擇器。", "In the game details, drag a tag into any category (including empty ones), or use the category picker instead.", "ゲーム詳細で、タグを任意の分類(空の分類も含む)へドラッグ。分類の選択画面でも変更できます。")}

- +
  • {t("周末想玩", "週末想玩", "For the weekend", "週末に遊びたい")}
  • {t("轻松一刻", "輕鬆一刻", "A little downtime", "ひと息つくとき")}
  • {t("故事与冒险", "故事與冒險", "Stories & adventures", "物語と冒険")}
-

{t("中文翻译", "中文翻譯", "Chinese translation", "中国語翻訳")}

{t("Unity 游戏,", "Unity 遊戲,", "Unity games. ", "Unity ゲームにも")}{t("也能配好中文。", "也能配好中文。", "Set up Chinese translation.", "中国語を。")}

{t("给库里的 Unity 游戏配置中文翻译:离线安装固定版本的加载器与翻译插件,安装前先备份,随时可以恢复。", "為庫裡的 Unity 遊戲設定中文翻譯:離線安裝固定版本的載入器與翻譯外掛,安裝前先備份,隨時可以還原。", "Configure Chinese translation for Unity games in your library: install fixed-version loaders and a translation plugin offline, with a backup first and restore anytime.", "ライブラリの Unity ゲームに中国語翻訳を設定できます。固定バージョンのローダーと翻訳プラグインをオフラインで導入し、事前にバックアップして、いつでも復元できます。")}

{t("需自行配置翻译服务,支持情况和实际效果因游戏而异。", "需自行設定翻譯服務,支援情況和實際效果因遊戲而異。", "Bring your own translation service. Support and results vary by game.", "翻訳サービスの設定が必要です。対応状況や効果はゲームによって異なります。")}

+

{t("中文翻译", "中文翻譯", "Chinese translation", "中国語翻訳")}

{t("Unity 游戏,", "Unity 遊戲,", "Unity games. ", "Unity ゲームにも")}{t("也能配好中文。", "也能配好中文。", "Set up Chinese translation.", "中国語を。")}

{t("给库里的 Unity 游戏配置中文翻译:安装固定版本的加载器与翻译插件,安装前先备份,随时可以恢复。", "為庫裡的 Unity 遊戲設定中文翻譯:安裝固定版本的載入器與翻譯外掛,安裝前先備份,隨時可以還原。", "Configure Chinese translation for Unity games in your library: install fixed-version loaders and a translation plugin, with a backup first and restore anytime.", "ライブラリの Unity ゲームに中国語翻訳を設定できます。固定バージョンのローダーと翻訳プラグインを導入し、事前にバックアップして、いつでも復元できます。")}

{t("需自行配置翻译服务,缺少安装组件时需要联网获取。支持情况和实际效果因游戏而异。", "需自行設定翻譯服務,缺少安裝元件時需要連線取得。支援情況和實際效果因遊戲而異。", "Bring your own translation service. Missing installation components require a download. Support and results vary by game.", "翻訳サービスの設定が必要です。導入用のコンポーネントが不足している場合はダウンロードします。対応状況や効果はゲームによって異なります。")}

{t("Mono 与 IL2CPP 分别处理", "Mono 與 IL2CPP 分別處理", "Mono and IL2CPP handled separately", "Mono と IL2CPP を個別に対応")}

{t("按主程序的真实位数匹配对应的加载器与插件;识别不了或相互冲突的安装保持原样,不强行覆盖。", "依主程式的真實位元數匹配對應的載入器與外掛;辨識不了或相互衝突的安裝保持原樣,不強行覆蓋。", "The loader and plugin match the real bitness of the executable. Unknown or conflicting installs are left as they are, never overwritten by force.", "本体実行ファイルの実ビット数に合わせてローダーとプラグインを選びます。判別できない・競合する構成は元のままにし、強制的に上書きしません。")}

{t("补齐中文字体", "補齊中文字型", "Fills in Chinese fonts", "中国語フォントを補完")}

{t("为 Unity UI 与 TextMeshPro 配置可用的中文字体回退,减少菜单和对话里的缺字。", "為 Unity UI 與 TextMeshPro 設定可用的中文字型回退,減少選單和對話裡的缺字。", "Configures a usable Chinese font fallback for Unity UI and TextMeshPro, reducing missing glyphs in menus and dialogue.", "Unity UI と TextMeshPro に中国語フォントのフォールバックを設定し、メニューや会話の欠字を減らします。")}

@@ -117,6 +127,7 @@ export default function MarketingPage({ language }: { language: Language }) {

{t("数据与文件", "資料與檔案", "Data and files", "データとファイル")}

{t("游戏留在原处。", "遊戲留在原處。", "Files stay put. ", "ファイルは元の場所に。")}{t("记录保存在本机。", "記錄儲存在本機。", "Records stay local.", "登録情報はこの PC に。")}

{t("管理游戏库无需注册账号,离线也能使用。", "管理遊戲庫無需註冊帳號,離線也能使用。", "Manage your library offline, without signing up for an account.", "アカウント登録なしで、オフラインでもゲームを管理できます。")}

{t("不上传扫描结果", "不上傳掃描結果", "Scan results stay local", "スキャン結果は送信しません")}

{t("目录、标签、设置和启动历史保存在本机数据库。更新检查会访问 GitHub,启动的游戏或辅助程序可能自行联网。", "目錄、標籤、設定與啟動歷史儲存在本機資料庫。更新檢查會存取 GitHub,啟動的遊戲或輔助程式可能自行連線。", "Folders, tags, settings and launch history are stored on this PC. Update checks access GitHub; games and companion tools may make their own network requests.", "フォルダー、タグ、設定、起動履歴はこの PC に保存。更新確認は GitHub に接続します。ゲームや補助ツールは独自に通信する場合があります。")}

+

{t("按需开放操作权限", "依需要開放操作權限", "Permissions fit each client", "クライアントごとに必要な権限を設定")}

{t("桌面程序、CLI 和 MCP 分别声明需要的操作权限,不再默认获得全部能力。", "桌面程式、CLI 和 MCP 分別宣告需要的操作權限,不再預設取得全部能力。", "The desktop app, CLI and MCP server each declare the permissions they need instead of receiving every capability by default.", "デスクトップアプリ、CLI、MCP サーバーはそれぞれ必要な操作権限を申告し、すべての機能が既定で付与されることはありません。")}

{t("移除记录和删除文件分开", "移除記錄與刪除檔案分開", "Removing a record leaves the files", "登録の削除とファイル削除は別です")}

{t("扫描、入库和常规移除记录不会搬动游戏。将游戏文件移入回收站,需要单独确认,默认数据保存在 %LOCALAPPDATA%\\GameLibrary。", "掃描、入庫及一般移除記錄不會搬動遊戲。將遊戲檔案移入資源回收筒,需要另行確認,預設資料儲存在 %LOCALAPPDATA%\\GameLibrary。", "Scanning, adding games and regular record removal leave your files in place. Moving game files to the Recycle Bin requires separate confirmation. App data is stored in %LOCALAPPDATA%\\GameLibrary by default.", "スキャン、登録、通常の登録削除ではゲームを移動しません。ファイルをゴミ箱へ移す操作には、別途確認が必要です。データは標準で %LOCALAPPDATA%\\GameLibrary に保存されます。")}

@@ -127,14 +138,14 @@ export default function MarketingPage({ language }: { language: Language }) {

v{stableVersion} · {t("正式版", "正式版", "Official release", "正式版")}

{t("Windows 安装版", "Windows 安裝版", "Windows installer", "Windows インストーラー")}

{t("跟随安装向导即可使用,包含桌面程序和运行环境,无需另装 .NET。", "依照安裝精靈即可使用,包含桌面程式及執行環境,無需另裝 .NET。", "Follow the setup wizard. The desktop app and runtime are included, so no separate .NET installation is needed.", "セットアップの案内に従ってインストール。アプリと実行環境を含み、.NET の別途インストールは不要です。")}

- {installer}{t("下载安装版", "下載安裝版", "Download installer", "インストーラーをダウンロード")}

{t("维护者于 2026-10-13 确认真机验收并授权正式发布。", "維護者於 2026-10-13 確認實機驗收並授權正式發布。", "The maintainer confirmed real-machine acceptance and authorized this release on 2026-10-13.", "2026-10-13 にメンテナーが実機確認を完了し、正式公開を承認しました。")}

+ {installer}{t("下载安装版", "下載安裝版", "Download installer", "インストーラーをダウンロード")}

{t("升级前请从托盘退出应用。安装新版会保留游戏库数据与原始游戏文件。", "升級前請從系統匣結束應用程式。安裝新版會保留遊戲庫資料與原始遊戲檔案。", "Exit the app from the tray before upgrading. Your library data and original game files are preserved.", "更新前にトレイからアプリを終了してください。ライブラリのデータと元のゲームファイルは保持されます。")}

{t("其他下载", "其他下載", "Other downloads", "その他のダウンロード")}

{[ [t("便携版 · 解压运行", "可攜版 · 解壓縮執行", "Portable · Extract and run", "ポータブル版 · 解凍して実行"), `GameLibrary-Portable-win-x64-v${stableVersion}.zip`], [t("工具包 · CLI & MCP", "工具包 · CLI & MCP", "Tools · CLI & MCP", "ツール · CLI & MCP"), `GameLibrary-Tools-win-x64-v${stableVersion}.zip`], [t("SHA-256 校验清单", "SHA-256 校驗清單", "SHA-256 checksums", "SHA-256 チェックサム"), `GameLibrary-v${stableVersion}-SHA256SUMS.txt`], ].map(([label, filename]) => {label}{filename})} -

{t("Windows 程序未签名,请在下载后核对校验值。", "Windows 程式未簽署,請在下載後核對校驗值。", "Windows executables are unsigned. Verify the checksums after downloading.", "Windows 実行ファイルは未署名です。ダウンロード後にチェックサムをご確認ください。")} {t("版本说明", "版本說明", "Release notes", "リリースノート")} ↗

+

{t("Windows 程序未签名,请在下载后核对校验值。", "Windows 程式未簽署,請在下載後核對校驗值。", "Windows executables are unsigned. Verify the checksums after downloading.", "Windows 実行ファイルは未署名です。ダウンロード後にチェックサムをご確認ください。")}

diff --git a/website/design/2026-10-26-screenshots.md b/website/design/2026-10-26-screenshots.md new file mode 100644 index 0000000..44c6978 --- /dev/null +++ b/website/design/2026-10-26-screenshots.md @@ -0,0 +1,57 @@ +# v1.8.0 应用截图与网站内容更新 + +2026-10-26。网站 v1.5.0 的演示图直接采集自 v1.8.0 桌面程序,替换原来的 v1.5.5 截图。 + +## 采集来源 + +| 项目 | 记录 | +|---|---| +| 程序 | 本机最终打包暂存目录 `artifacts/dist/staging/d431c9a5e2374dddaa8367ad86d75fef/GameLibrary/GameLibrary.Desktop.exe`,文件产品版本为 1.8.0 | +| 运行方式 | 启动真实 Tauri / WebView2 程序,连接配套 Host 与桥接进程;未使用宣传片的浏览器 IPC 垫片 | +| 数据隔离 | 仅子进程设置 `GAMELIBRARY_DATA_DIR`、`WEBVIEW2_USER_DATA_FOLDER` 与本机调试端口;不修改系统或用户环境变量 | +| 示例库 | 12 个虚构标题、4 个用户标签、应用默认封面;通过公开 `roots.add`、`games.create`、`tags.create`、`tags.assign` 和 `games.update` 操作建立 | +| 文件入口 | 在本次独立目录中复制系统 `where.exe` 作为样例入口,不运行这些入口,不操作私人游戏 | +| 主题 | 通过真实 `settings.update` 写入 light / dark,重新加载后采集同一库;标签页使用应用原有“管理标签”入口 | +| 画面 | 简体中文,1320×820,截图保存原始 PNG,不重绘控件、不替换界面文字、不对截图做调色 | +| 本地证据 | `artifacts/website-captures/v1.8.0-1793015920869/capture.json`;本次采集脚本保留于 `.tmp/capture-website-v180.mjs`,不纳入发布源码 | + +首次尝试在已连接的桌面会话中初始化空库,Host 切换库纪元后旧桥接连接退出,该次未产生截图。最终先用配套 CLI 初始化新的独立库,再启动桌面程序,四张图均来自后一次成功采集。 + +| 文件 | 内容 | +|---|---| +| `public/assets/library.png` | 浅色游戏库:12 个示例条目、收藏、标签和批量操作栏 | +| `public/assets/library-dark.png` | 同一游戏库的深色模式 | +| `public/assets/tags.png` | 浅色标签管理:分类、关联游戏数、标签星级 | +| `public/assets/tags-dark.png` | 同一标签管理页的深色模式 | + +四张图已逐张查看。素材采集仅用于本次演示,不能据此宣称完成了桌面应用功能验收。 + +## 网页如何使用 + +浅色图保留 `library.png` / `tags.png` 名称,仓库 README 因而也显示浅色图。原有图片转换脚本使用 Sharp,为四张图分别生成 440、880、1320px WebP;PNG 用于放大查看。源图提交,派生图片沿用已有忽略规则。 + +`Screenshot` 的缩略图与放大图均包含浅深色素材。CSS 复用主题初始化与选择器已经维护的 `.dark` 类,控制对应图片显示;新访客默认浅色,手动选择、保存偏好及跟随系统继续使用同一份主题逻辑。没有新增主题状态、监听器、路由或依赖。截图不使用滤镜模拟主题。 + +## 内容依据与改动范围 + +2026-10-26 使用 GitHub 插件读取 [v1.8.0 Release API](https://api.github.com/repos/sumingwang233/GameLibrary/releases/tags/v1.8.0),确认 `draft=false`、`prerelease=false`,安装版、便携版、工具包与校验清单均已上传。网页下载统一指向 [v1.8.0](https://github.com/sumingwang233/GameLibrary/releases/tag/v1.8.0)。Release 正文仍含预发布阶段的旧说明,网站的正式版标记依据当前 API 状态。 + +| 宣传内容 | 源码或发布依据 | +|---|---| +| 批量收藏、标签、移出记录;审核失败项保留选择 | `docs/releases/v1.8.0.md`、`src/GameLibrary.Tauri/src/lib/hooks/`、`contracts/operations.v1.json` | +| 后台服务重启后重新连接,扫描和标题翻译停止无效等待 | `docs/releases/v1.8.0.md` 与对应客户端连接、轮询实现 | +| 徽章、焦点和减少动态效果改进;客户端显式权限 | `docs/releases/v1.8.0.md`;网页不扩大为“整个应用已通过无障碍认证” | +| Godot 识别 | `src/GameLibrary.Domain/Detection/EngineDetectorSet.cs`、`Detectors/AdditionalEngineDetector.cs` | +| 翻译组件可能需要联网下载 | `src/GameLibrary.Host/Hosting/UnityTranslationPayload.cs`;移除无条件的离线安装表述 | + +四语言同步新增 `#updates`、批量标签说明、截图版本和替代文本、升级前退出托盘及数据保留说明。合并下载区重复的发布说明入口。主导航首项改为本版更新,原 `#advantages` 章节与锚点仍保留。根目录四语言 README 仅同步当前截图来源。 + +组件继续由 `MarketingPage` 组织内容、`GlassControls` 承担交互。网站版本在 `package.json` 与 `package-lock.json` 同步为 1.5.0;桌面产品版本不改动。回滚时撤回本次网站提交,并重新生成对应版本的 WebP。 + +## 执行与待验收 + +- 已完成:真实应用截图采集、四张原图查看、现有图片转换脚本执行、源码与文案审阅、code-review-graph 更新。 +- 中文文案已按 `humanizer` 与 `shuorenhua` 整理,保留版本、条件和功能边界。 +- 未运行:测试、构建、lint、类型检查、网站静态门禁与浏览器验收;未推送或部署。 + +后续获得验证授权时,优先查看四语言的 320 / 375 / 768 / 1440px 页面、浅深主题和跟随系统、缩略图与放大图的一致性、手机导航及长标题换行,再执行现有网站检查。历史版本的通过记录不计入本轮。 diff --git a/website/lib/site.ts b/website/lib/site.ts index e3cda9a..9342f90 100644 --- a/website/lib/site.ts +++ b/website/lib/site.ts @@ -4,7 +4,7 @@ export const languages = ["zh-CN", "zh-TW", "en", "ja"] as const; export type Language = typeof languages[number]; export const languageNames: Record = { "zh-CN": "简体中文", "zh-TW": "繁體中文", en: "English", ja: "日本語" }; export const translate = (language: Language) => (zh: string, tw: string, en: string, ja: string) => [zh, tw, en, ja][languages.indexOf(language)]; -export const stableVersion = "1.7.23"; +export const stableVersion = "1.8.0"; export const prefix = process.env.NODE_ENV === "production" ? "/GameLibrary" : ""; export const repository = "https://github.com/sumingwang233/GameLibrary"; export const release = `${repository}/releases/download/v${stableVersion}/`; @@ -16,7 +16,7 @@ export function metadata(language: Language): Metadata { const t = translate(language); return { title: t("GameLibrary — 在一个地方管理本地游戏", "GameLibrary — 在一個地方管理本機遊戲", "GameLibrary — Your local games in one library", "GameLibrary — ローカルゲームをひとつのライブラリで管理"), - description: t("添加游戏目录,扫描后确认入库。用标签分类,从游戏库直接启动。无需账号,原文件留在原处。", "新增遊戲目錄,掃描後確認入庫。用標籤分類,從遊戲庫直接啟動。無需帳號,原始檔案留在原處。", "Scan your game folders, review the results, organize with tags and launch from one library. No account required. Files stay in place.", "ゲームフォルダーをスキャンし、確認して登録。タグで整理してライブラリから起動。アカウント不要で、ファイルは元の場所に残ります。"), + description: t("添加游戏目录,扫描后确认入库。批量收藏、添加标签,从游戏库直接启动。无需账号,原文件留在原处。", "新增遊戲目錄,掃描後確認入庫。批次收藏、新增標籤,從遊戲庫直接啟動。無需帳號,原始檔案留在原處。", "Scan your game folders, review the results, favorite and tag games in bulk, and launch from one library. No account required. Files stay in place.", "ゲームフォルダーをスキャンし、確認して登録。お気に入りやタグをまとめて設定し、ライブラリから起動。アカウント不要で、ファイルは元の場所に残ります。"), alternates: { canonical: origin + (language === "zh-CN" ? "" : `${language}/`), languages: { ...Object.fromEntries(languages.map(locale => [locale, origin + (locale === "zh-CN" ? "" : `${locale}/`)])), "x-default": origin }, diff --git a/website/package-lock.json b/website/package-lock.json index 96a50f8..dac5b8f 100644 --- a/website/package-lock.json +++ b/website/package-lock.json @@ -1,12 +1,12 @@ { "name": "gamelibrary-website", - "version": "1.4.0", + "version": "1.5.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "gamelibrary-website", - "version": "1.4.0", + "version": "1.5.0", "dependencies": { "next": "16.3.8", "react": "19.2.4", diff --git a/website/package.json b/website/package.json index df258ce..f737a57 100644 --- a/website/package.json +++ b/website/package.json @@ -1,6 +1,6 @@ { "name": "gamelibrary-website", - "version": "1.4.0", + "version": "1.5.0", "private": true, "scripts": { "predev": "node scripts/optimize-images.mjs", diff --git a/website/public/assets/library-dark.png b/website/public/assets/library-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..15346e7a4ee6dfc3c799ad5bf2ac46a1ec91b6c5 GIT binary patch literal 258050 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:!Y=A+d(Yn92x#5 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 z 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ℜHj4t<%Ju|aaqqn=!6#dH=5 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%0D{}nY;Cqi#(tso>OtFR9SvWuc>e%4f$!~Q9$_2## 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 z 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 Y0DGS{C(s3#AOHXW07*qoM6N<$f=f}p1ONa4 diff --git a/website/public/assets/tags-dark.png b/website/public/assets/tags-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..3e9df216cefe55c2f8e57f0d8970bedaaebd1a0b GIT binary patch literal 69592 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 literal 0 HcmV?d00001 diff --git a/website/public/assets/tags.png b/website/public/assets/tags.png index 41925d3893119b5b8d0094bf21a459129fcd3218..9fa8fa453dd02c7f2812c4a3935aedf31e7545f5 100644 GIT binary patch literal 69558 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 SsC3viN=;ewKH}c9*Z&J976VoQ literal 66180 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 Date: Tue, 27 Oct 2026 12:28:25 +0800 Subject: [PATCH 02/29] docs(architecture): refresh v1.8.0 code-review-graph snapshot --- .../architecture-overview.json | 450 ++++++++++++++++++ docs/code-review-graph/architecture.md | 140 ++++-- 2 files changed, 559 insertions(+), 31 deletions(-) create mode 100644 docs/code-review-graph/architecture-overview.json diff --git a/docs/code-review-graph/architecture-overview.json b/docs/code-review-graph/architecture-overview.json new file mode 100644 index 0000000..e5eea43 --- /dev/null +++ b/docs/code-review-graph/architecture-overview.json @@ -0,0 +1,450 @@ +{ + "status": "ok", + "summary": "Architecture: 28 communities, 24 community pairs, 15 warning(s)", + "communities": [ + { + "id": 90, + "name": "translation-game", + "size": 860, + "cohesion": 0.2032, + "dominant_language": "csharp" + }, + { + "id": 81, + "name": "hosting-translation", + "size": 673, + "cohesion": 0.363, + "dominant_language": "csharp" + }, + { + "id": 85, + "name": "components-game", + "size": 634, + "cohesion": 0.2485, + "dominant_language": "tsx" + }, + { + "id": 83, + "name": "persistence-read", + "size": 476, + "cohesion": 0.228, + "dominant_language": "csharp" + }, + { + "id": 80, + "name": "detection-game", + "size": 193, + "cohesion": 0.2363, + "dominant_language": "csharp" + }, + { + "id": 79, + "name": "game-library-desktop-async", + "size": 141, + "cohesion": 0.3593, + "dominant_language": "csharp" + }, + { + "id": 92, + "name": "detection-game-are", + "size": 136, + "cohesion": 0.2889, + "dominant_language": "csharp" + }, + { + "id": 84, + "name": "game-library-mcp-list", + "size": 131, + "cohesion": 0.5989, + "dominant_language": "csharp" + }, + { + "id": 89, + "name": "game-library-headless-e2etests-host", + "size": 52, + "cohesion": 0.2044, + "dominant_language": "csharp" + }, + { + "id": 77, + "name": "catalog-async", + "size": 48, + "cohesion": 0.5571, + "dominant_language": "csharp" + }, + { + "id": 102, + "name": "film-draw", + "size": 44, + "cohesion": 0.323, + "dominant_language": "javascript" + }, + { + "id": 78, + "name": "game-library-contracts-operation", + "size": 42, + "cohesion": 0.213, + "dominant_language": "csharp" + }, + { + "id": 88, + "name": "game-library-contract-tests-schema", + "size": 42, + "cohesion": 0.1067, + "dominant_language": "csharp" + }, + { + "id": 99, + "name": "ui-host-game", + "size": 36, + "cohesion": 0.1581, + "dominant_language": "javascript" + }, + { + "id": 76, + "name": "scripts-check", + "size": 32, + "cohesion": 0.2128, + "dominant_language": "python" + }, + { + "id": 100, + "name": "audio-db", + "size": 28, + "cohesion": 0.1456, + "dominant_language": "python" + }, + { + "id": 95, + "name": "game-library-cli-command", + "size": 23, + "cohesion": 0.3273, + "dominant_language": "csharp" + }, + { + "id": 96, + "name": "render-scene", + "size": 17, + "cohesion": 0.2491, + "dominant_language": "javascript" + }, + { + "id": 101, + "name": "components-size", + "size": 16, + "cohesion": 0.0625, + "dominant_language": "tsx" + }, + { + "id": 82, + "name": "game-library-host-client-async", + "size": 15, + "cohesion": 0.1381, + "dominant_language": "csharp" + }, + { + "id": 86, + "name": "game-library-tauri-bridge-async", + "size": 14, + "cohesion": 0.3288, + "dominant_language": "csharp" + }, + { + "id": 93, + "name": "locale-generate", + "size": 12, + "cohesion": 0.1613, + "dominant_language": "tsx" + }, + { + "id": 97, + "name": "tools-stamp", + "size": 12, + "cohesion": 0.0074, + "dominant_language": "javascript" + }, + { + "id": 94, + "name": "lib-theme", + "size": 9, + "cohesion": 0.0938, + "dominant_language": "typescript" + }, + { + "id": 75, + "name": "workflows-plan", + "size": 8, + "cohesion": 0.1071, + "dominant_language": "typescript" + }, + { + "id": 87, + "name": "game-library-architecture-version", + "size": 8, + "cohesion": 0.2, + "dominant_language": "csharp" + }, + { + "id": 98, + "name": "scripts-system", + "size": 4, + "cohesion": 0.2424, + "dominant_language": "javascript" + }, + { + "id": 91, + "name": "game-library-test-process-stub-program", + "size": 3, + "cohesion": 0.1, + "dominant_language": "csharp" + } + ], + "cross_community_edges": [ + { + "source_community": "hosting-translation", + "target_community": "translation-game", + "edge_count": 390, + "top_kinds": [ + "CALLS" + ] + }, + { + "source_community": "persistence-read", + "target_community": "translation-game", + "edge_count": 318, + "top_kinds": [ + "CALLS" + ] + }, + { + "source_community": "hosting-translation", + "target_community": "persistence-read", + "edge_count": 212, + "top_kinds": [ + "CALLS" + ] + }, + { + "source_community": "detection-game", + "target_community": "detection-game-are", + "edge_count": 154, + "top_kinds": [ + "CALLS" + ] + }, + { + "source_community": "detection-game", + "target_community": "hosting-translation", + "edge_count": 92, + "top_kinds": [ + "CALLS" + ] + }, + { + "source_community": "game-library-host-client-async", + "target_community": "translation-game", + "edge_count": 74, + "top_kinds": [ + "CALLS" + ] + }, + { + "source_community": "detection-game", + "target_community": "persistence-read", + "edge_count": 43, + "top_kinds": [ + "CALLS" + ] + }, + { + "source_community": "detection-game", + "target_community": "translation-game", + "edge_count": 34, + "top_kinds": [ + "CALLS" + ] + }, + { + "source_community": "game-library-desktop-async", + "target_community": "game-library-host-client-async", + "edge_count": 33, + "top_kinds": [ + "CALLS" + ] + }, + { + "source_community": "game-library-contracts-operation", + "target_community": "game-library-contract-tests-schema", + "edge_count": 30, + "top_kinds": [ + "CALLS" + ] + }, + { + "source_community": "game-library-contracts-operation", + "target_community": "translation-game", + "edge_count": 23, + "top_kinds": [ + "CALLS" + ] + }, + { + "source_community": "game-library-desktop-async", + "target_community": "translation-game", + "edge_count": 22, + "top_kinds": [ + "CALLS" + ] + }, + { + "source_community": "game-library-host-client-async", + "target_community": "game-library-mcp-list", + "edge_count": 17, + "top_kinds": [ + "CALLS" + ] + }, + { + "source_community": "game-library-contracts-operation", + "target_community": "hosting-translation", + "edge_count": 15, + "top_kinds": [ + "CALLS" + ] + }, + { + "source_community": "game-library-host-client-async", + "target_community": "game-library-cli-command", + "edge_count": 13, + "top_kinds": [ + "CALLS" + ] + }, + { + "source_community": "catalog-async", + "target_community": "hosting-translation", + "edge_count": 8, + "top_kinds": [ + "CALLS" + ] + }, + { + "source_community": "game-library-contracts-operation", + "target_community": "game-library-host-client-async", + "edge_count": 6, + "top_kinds": [ + "CALLS" + ] + }, + { + "source_community": "game-library-host-client-async", + "target_community": "game-library-tauri-bridge-async", + "edge_count": 6, + "top_kinds": [ + "CALLS" + ] + }, + { + "source_community": "game-library-contracts-operation", + "target_community": "game-library-desktop-async", + "edge_count": 2, + "top_kinds": [ + "CALLS" + ] + }, + { + "source_community": "translation-game", + "target_community": "game-library-cli-command", + "edge_count": 2, + "top_kinds": [ + "CALLS" + ] + }, + { + "source_community": "game-library-contracts-operation", + "target_community": "game-library-cli-command", + "edge_count": 2, + "top_kinds": [ + "CALLS" + ] + }, + { + "source_community": "game-library-contracts-operation", + "target_community": "game-library-mcp-list", + "edge_count": 2, + "top_kinds": [ + "CALLS" + ] + }, + { + "source_community": "game-library-host-client-async", + "target_community": "game-library-headless-e2etests-host", + "edge_count": 1, + "top_kinds": [ + "CALLS" + ] + }, + { + "source_community": "catalog-async", + "target_community": "translation-game", + "edge_count": 1, + "top_kinds": [ + "CALLS" + ] + } + ], + "warnings": [ + "High coupling (390 edges) between 'hosting-translation' and 'translation-game'", + "High coupling (318 edges) between 'persistence-read' and 'translation-game'", + "High coupling (212 edges) between 'hosting-translation' and 'persistence-read'", + "High coupling (154 edges) between 'detection-game' and 'detection-game-are'", + "High coupling (92 edges) between 'detection-game' and 'hosting-translation'", + "High coupling (74 edges) between 'game-library-host-client-async' and 'translation-game'", + "High coupling (43 edges) between 'detection-game' and 'persistence-read'", + "High coupling (34 edges) between 'detection-game' and 'translation-game'", + "High coupling (33 edges) between 'game-library-desktop-async' and 'game-library-host-client-async'", + "High coupling (30 edges) between 'game-library-contracts-operation' and 'game-library-contract-tests-schema'", + "High coupling (23 edges) between 'game-library-contracts-operation' and 'translation-game'", + "High coupling (22 edges) between 'game-library-desktop-async' and 'translation-game'", + "High coupling (17 edges) between 'game-library-host-client-async' and 'game-library-mcp-list'", + "High coupling (15 edges) between 'game-library-contracts-operation' and 'hosting-translation'", + "High coupling (13 edges) between 'game-library-host-client-async' and 'game-library-cli-command'" + ], + "cross_community_edges_total": 24, + "truncated": false, + "_hints": { + "next_steps": [ + { + "tool": "list_communities_tool", + "suggestion": "Drill into individual communities" + }, + { + "tool": "detect_changes_tool", + "suggestion": "See how recent changes affect the architecture" + }, + { + "tool": "list_flows_tool", + "suggestion": "Explore execution flows" + } + ], + "related": [], + "warnings": [ + "High coupling (390 edges) between 'hosting-translation' and 'translation-game'", + "High coupling (318 edges) between 'persistence-read' and 'translation-game'", + "High coupling (212 edges) between 'hosting-translation' and 'persistence-read'" + ] + }, + "context_savings": { + "estimated": true, + "saved_tokens": 233617, + "saved_percent": 99 + }, + "_graph": { + "updated_at": "2026-10-27T12:22:56", + "age_seconds": 59, + "built_at_sha": "316e3759b8c7203ae4c631150d96787c2fdab3db", + "built_on_branch": "main", + "head_sha": "316e3759b8c7203ae4c631150d96787c2fdab3db", + "head_matches_build": true + } +} diff --git a/docs/code-review-graph/architecture.md b/docs/code-review-graph/architecture.md index e7c034a..4bc063b 100644 --- a/docs/code-review-graph/architecture.md +++ b/docs/code-review-graph/architecture.md @@ -1,49 +1,127 @@ -# GameLibrary 架构预览 +# GameLibrary 当前代码架构 -v1.7.11:Unity 自动配置仍由 `UnityTranslationService` 串行协调;`UnityTranslationInspection` 核对活动加载器与非活动生成物,`UnityTranslationAssembly` 通过 .NET metadata 对受限的已核验 IL 做等长变更,`UnityTranslationFonts` 按真实 TMP 接口选择系统字体或既有字库。复用原有固定哈希 Payload 与加密文件事务,`RestoredBackupId`/恢复收据留在本机既有状态/备份边界,不新增表或 IPC。恢复保留缓存、安装拒绝未知文件,与原游戏文件修改、用户确认和密钥边界保持一致。详见 [实施记录](../development/v1.7.11-loader-compatibility-plan.md)。 +2026-10-27,主程序 v1.8.0,宣传网站 v1.5.0。基础提交为 `316e3759b8c7203ae4c631150d96787c2fdab3db`(`main`),图谱已按当前工作区增量同步,插件返回 `status: ok`,无增量解析错误。 -## 宣传网站 — 2026-10-02 / 网站 v1.1.0 +## 图谱快照 -独立 Next.js 静态站沿用服务端 `MarketingPage` 与客户端 `GlassControls`;新增繁中/日文静态路径,四语言共用版本、素材与 metadata。页面主题和浮层使用浏览器本地状态,不涉及 Host、SQLite 游戏库或桌面 IPC。真实 logo/截图、组件和路由图、验证及回滚见 [网站实施记录](website.md)。 +| 项目 | 当前值 | +| --- | ---: | +| 索引文件 | 425 | +| 节点 | 4,135 | +| 数据库关系 | 40,720 | +| 代码社区 | 28 | +| 社区间关联对 | 24 | -v1.7.0 新增名称翻译边界:React 共享作业 Hook → Host `TitlesHandler` / `JobManager` → `TitleTranslationClient` → `SqliteLibraryStore.Titles`。v1.7.1 在共享客户端成功路径收紧由连字符生成的副标题标点,手动编辑仍直接进入存储。schema 26 译名表与原文层分离;DTO 在 Host 统一解析显示名称,查询同时覆盖原文/译名;既有启动翻译工具策略不变。插件增量索引包含新增文件,快照见 [图谱入口](README.md),具体文件、网络适配和 CAS 保护见 [名称翻译](../title-translation.md)。 +语言覆盖 C#、Rust、TypeScript、TSX、JavaScript、Python 和 PowerShell。社区结构来自插件;下面的模块名称、运行链路和项目引用方向已对照源码整理。 -2026-10-01:基于 `fedc7ac` 加 v1.6.0 工作区差异,图谱覆盖 321 个源码文件。验证和权限边界见 [优化实施记录](optimization-implementation.md);本次发行构建结果见 [v1.6.0 构建记录](../releases/v1.6.0-validation.md)。 +## 运行链路 -## 客户端与会话 +```mermaid +flowchart TB + subgraph DesktopClients[本地客户端] + React[React 界面与 hooks] --> API[api.ts / Tauri invoke] + API --> Rust[Tauri Rust 壳] + Rust --> Requests[C# TauriBridge 普通请求进程] + Rust --> Events[C# TauriBridge 事件等待进程] + WPF[WPF Desktop] + CLI[CLI] + MCP[MCP 服务] + end + Requests --> Client[HostClient / HostConnection] + Events --> Client + WPF --> Client + CLI --> Client + MCP --> Client + Client --> Pipe[每库命名管道] + Pipe --> Host[HostRuntime / OperationDispatcher] + Host --> Gate[权限与会话租约 / 读快照 / 写入准入] + Gate --> Services[Host 业务处理器与后台作业] + Services --> App[Application 用例与端口] + App -->|调用存储端口| Infra[Infrastructure 实现] + Services --> Infra + Infra --> SQLite[(SQLite 游戏库)] + Infra --> Files[游戏文件 / 封面 / 备份] + Website[独立 Next.js 宣传网站] +``` + +运行图中的箭头表示请求或数据流。`Application` 调用存储端口,`Infrastructure` 实现这些端口;编译依赖方向见下一张图。 + +Rust 壳按 `operationId == "events.wait"` 选择事件通道,其余操作进入普通请求通道;两条通道分别持有 Bridge 进程。Bridge 通过标准输入输出收发 JSON,再由 `HostConnection` 连接命名管道。Host 持有游戏库连接,集中处理权限、会话和数据访问。 + +## C# 项目依赖 + +箭头严格对应各 `.csproj` 中的直接 `ProjectReference`,不展开传递引用。 ```mermaid flowchart LR - UI[Tauri / React hooks] --> Normal[普通请求 Bridge] - UI --> Events[事件等待 Bridge] - WPF[WPF] --> Client[HostClient] - CLI[CLI / MCP] --> Client - Normal --> Client - Events --> Client - Client --> Pipe[每库 named pipe] - Pipe --> Dispatch[异步 Dispatcher] - Dispatch --> Gate[会话租约 / 权限 / epoch] - Gate --> Read[独立连接 / 读快照] - Gate --> Write[单写准入 / 幂等收据] - Write --> App[Application 用例与端口] - App --> Infra[Infrastructure SQL / 文件] - App --> Domain[Domain 模型] - Infra --> DB[(SQLite)] - Read --> DB + Bridge[GameLibrary.TauriBridge] --> Client[GameLibrary.HostClient] + Desktop[GameLibrary.Desktop] --> Client + CLI[GameLibrary.Cli] --> Client + MCP[GameLibrary.Mcp] --> Client + Bridge --> Contracts[GameLibrary.Contracts] + Desktop --> Contracts + CLI --> Contracts + MCP --> Contracts + Client --> Contracts + Host[GameLibrary.Host] --> Contracts + Host --> Application[GameLibrary.Application] + Host --> Infrastructure[GameLibrary.Infrastructure] + Infrastructure --> Application + Application --> Domain[GameLibrary.Domain] ``` -列表计数、分页与附加字段共享同一读快照;只读连接不等待宿主写连接锁。启动状态查询会惰性更新进程状态,因此不放入纯只读事务。写事务提交后发布事件,定时核对和退出回调持有背景租约。 +`Domain` 和 `Contracts` 均无其他项目引用。`Application` 编排游戏目录、候选审核、备份创建和恢复用例;`Infrastructure` 提供 SQLite 与文件实现。Host 负责装配、IPC 分发以及扫描、启动、翻译等运行服务。 + +## 主要源码入口 + +以下路径相对于仓库根目录 `D:\Official\GameLibrary`。 + +| 模块 | 源文件或目录 | +| --- | --- | +| React 界面 | [App.tsx](../../src/GameLibrary.Tauri/src/App.tsx) | +| 前端共享状态 | [state.ts](../../src/GameLibrary.Tauri/src/lib/state.ts)、[hooks](../../src/GameLibrary.Tauri/src/lib/hooks/) | +| 前端请求封装 | [api.ts:118](../../src/GameLibrary.Tauri/src/lib/api.ts#L118) | +| Rust 请求与事件分流 | [lib.rs:232](../../src/GameLibrary.Tauri/src-tauri/src/lib.rs#L232) | +| C# Bridge | [BridgeServer.cs](../../src/GameLibrary.TauriBridge/BridgeServer.cs) | +| 命名管道客户端 | [HostConnection.cs:33](../../src/GameLibrary.HostClient/HostConnection.cs#L33) | +| Host 装配与生命周期 | [HostRuntime.cs](../../src/GameLibrary.Host/HostRuntime.cs) | +| 权限检查与请求分发 | [OperationDispatcher.cs:234](../../src/GameLibrary.Host/Hosting/OperationDispatcher.cs#L234) | +| 公共协议与权限配置 | [Contracts](../../src/GameLibrary.Contracts/)、[ClientPermissionProfiles.cs](../../src/GameLibrary.Contracts/ClientPermissionProfiles.cs) | +| 用例与端口 | [Application](../../src/GameLibrary.Application/) | +| 领域模型与引擎识别 | [Domain](../../src/GameLibrary.Domain/) | +| SQLite 连接与存储端口实现 | [SqliteLibraryStore.cs:16](../../src/GameLibrary.Infrastructure/Persistence/SqliteLibraryStore.cs#L16) | +| WPF / CLI / MCP 入口 | [Desktop](../../src/GameLibrary.Desktop/)、[Cli/Program.cs](../../src/GameLibrary.Cli/Program.cs)、[Mcp/Program.cs](../../src/GameLibrary.Mcp/Program.cs) | +| 独立宣传网站 | [MarketingPage.tsx](../../website/components/MarketingPage.tsx)、[GlassControls.tsx](../../website/components/GlassControls.tsx)、[app](../../website/app/) | + +## 插件原生文件与复现命令 + +| 文件 | 绝对路径 | 内容 | +| --- | --- | --- | +| 交互架构图 | `D:\Official\GameLibrary\.code-review-graph\graph.html` | 插件原生 community 视图,可搜索、缩放、查看节点 | +| D3 运行文件 | `D:\Official\GameLibrary\.code-review-graph\d3.v7.min.js` | 与 HTML 一起保留,供本地图页使用 | +| JSON 导出 | `D:\Official\GameLibrary\.code-review-graph\graph.json` | 插件导出的节点、边、社区和执行流 | +| 图谱数据库 | `D:\Official\GameLibrary\.code-review-graph\graph.db` | 插件持久化索引;以上数据库统计来自此文件 | +| 架构 API 原始结果 | `D:\Official\GameLibrary\docs\code-review-graph\architecture-overview.json` | 28 个社区、24 对关联、耦合提示和提交元数据 | +| 本文与 Mermaid 源码 | `D:\Official\GameLibrary\docs\code-review-graph\architecture.md` | 可继续编辑的运行图、项目依赖图和源码入口 | + +在仓库根目录执行: + +```powershell +code-review-graph update --repo D:\Official\GameLibrary +code-review-graph visualize --repo D:\Official\GameLibrary --mode community --format html +code-review-graph visualize --repo D:\Official\GameLibrary --mode community --format json +``` -## 用例与持久化 +`.code-review-graph` 下的导出和数据库由插件忽略,不提交到 Git;`docs/code-review-graph` 保存可跟踪的架构说明与 API 快照。 -Application 编排游戏创建/重关联、候选审核以及备份创建/恢复,Host 负责 IPC 转换、权限、作业和装配。Application 不引入 IPC/SQLite 类型;Infrastructure 实现用例实际需要的端口。 +## 读图边界 -`SqliteLibraryStore` 是连接、快照和事务入口;`LibraryCatalogStore` 按 Candidates、Games、Fingerprints、Ignores 四个 partial 拆分。候选批量采用外层事务和逐项保存点;标签排序采用单事务整批冲突回滚。 +数据库有 40,720 条关系;本次 JSON 的 `edges` 数组含 19,362 条边、`flows` 数组含 100 项。导出集合与数据库总数口径不同,应分别读取,不能把导出集合当成完整数据库。 -## 前端与协议 +32,270 条 `CALLS` 中,插件报告直接解析 9,062 条、未解析 23,208 条。跨语言 IPC、动态分发和同名方法仍需对照源码,图上的关联不能直接当作运行时调用事实。 -Provider 消费接口保留,状态实现拆为六个 hooks。事件独立长轮询通道,按域合并 250ms 刷新;封面为 64 MiB 字符串占用 LRU,保持 data URL 接口。操作目录统一生成常量、可用目录、CLI 映射及简单 MCP 包装,特殊处理保持手写。 +插件给出 15 条高耦合提示,其中包括 Host 与集成测试、Infrastructure 与集成测试的关系;测试对生产代码的引用不单独构成重构理由。生产社区中 Host 与 Infrastructure 关联 212 条,可在后续重构审计中继续追踪;本次未据此修改架构。 -## 图谱使用边界 +本次完成索引同步、原生 HTML/JSON 导出与文档更新,未运行测试、构建、lint 或类型检查。SVG 导出因本地缺少 `matplotlib` 未完成。 -本次重建为 2,818 个节点、21,526 条边、175 个执行流,无解析错误。审查上下文报告 245 个受影响节点、79 个文件,风险等级 high 表示修改范围大。图谱识别候选批量的事务/保存点/Apply 调用,但 Store 重绑委托未解析为直接 callers,必须人工核对装配及事件回调。测试统计和实际运行证据优先于图谱的测试节点/知识缺口估计。 +早期实现记录仍见 [优化实施记录](optimization-implementation.md)、[名称翻译](../title-translation.md)、[Unity 加载器兼容](../development/v1.7.11-loader-compatibility-plan.md)和[网站实施记录](website.md)。 From b1e6674b1fe18c3f97f42602aba0babe283cfffa Mon Sep 17 00:00:00 2001 From: AaronSu Date: Thu, 29 Oct 2026 18:40:43 +0800 Subject: [PATCH 03/29] fix(build): preserve compressed sidecars in desktop payload --- artifacts/tools/package_release.py | 4 ++-- docs/development/2026-10-29-rg02-plan.md | 24 +++++++++++++++++++ .../scripts/prepare_sidecars.py | 1 + 3 files changed, 27 insertions(+), 2 deletions(-) create mode 100644 docs/development/2026-10-29-rg02-plan.md diff --git a/artifacts/tools/package_release.py b/artifacts/tools/package_release.py index e670ab2..15cd9ec 100644 --- a/artifacts/tools/package_release.py +++ b/artifacts/tools/package_release.py @@ -47,9 +47,9 @@ "makensis.exe", ) DEFAULT_TIMESTAMP_URL = "http://timestamp.digicert.com" +# 普通用户载荷的 Host/TauriBridge 只取 Tauri 构建的 sidecar;此处单独发布 Tools 使用的 Console Host、CLI、MCP。 COMPONENTS = [ - ("GameLibrary.Host", "GameLibrary.Host.exe", True, True), - ("GameLibrary.TauriBridge", "GameLibrary.TauriBridge.exe", True, False), + ("GameLibrary.Host", "GameLibrary.Host.exe", False, True), ("GameLibrary.Cli", "gamelibrary.exe", False, True), ("GameLibrary.Mcp", "GameLibrary.Mcp.exe", False, True), ] diff --git a/docs/development/2026-10-29-rg02-plan.md b/docs/development/2026-10-29-rg02-plan.md new file mode 100644 index 0000000..b074bec --- /dev/null +++ b/docs/development/2026-10-29-rg02-plan.md @@ -0,0 +1,24 @@ +# RG-02:v1.8.1 体积与常驻内存优化 + +2026-10-29,用户在本会话以 `PLEASE IMPLEMENT THIS PLAN:` 批准 RG-02。随后批准复制现有前端依赖到独立 worktree,不安装或升级依赖。 + +## 范围与执行约定 + +- 基点:GitHub main `be8e143062ada4eed3fa0e7612cb1bcde76ea6db`。 +- 本地和 GitHub 分支:`codex/optimize-footprint-v1.8.1`。实现提交仅在本地保存,另获授权后推送。 +- 所有编辑、测试、编译及临时数据限定在本重构 worktree;不改 main,不操作正式实例和真实游戏库。 +- 保留 C# Host、公共 IPC、数据格式、权限和现有功能;不引入 Go、不重写业务后端、不新增依赖。 +- R0 Codex:建立分支、图谱、基线及隔离测试目录。 +- R1 dsh-go:为 Tauri sidecar 启用单文件压缩,移除普通用户载荷中被覆盖的重复 publish,保留 Tools Console Host。 +- R2 dsh-go:一个 Bridge 进程、普通请求与 events.wait 两条独立 HostConnection;私有 stdio transportId 配对、串行输出、最多两个在途请求、失败清理和幂等键保护。 +- R3 Codex:审查,运行定向测试、必要 Release 编译与短时对比;更新桌面进程数量断言和相关夹具。 +- R4 Codex:同步 v1.8.1、code-review-graph、评估及实测记录,分别提交发布链路和桥接改动。 +- 写入串行,一个执行 worker,不使用 GPU、付费 API、安装包或总打包入口。 + +## 验收与停止条件 + +保留即时通知;长轮询不阻塞普通请求;乱序/迟到响应不串线;传输失败保留幂等键;中文路径、重连和父进程退出清理保持正确,仅停止所属 Host。数据标识符使用公共序列化的真实契约值。 + +基线与候选均使用相同临时库和 Release 模式;临时测试 identifier、WebView 数据目录、TEMP/TMP 和游戏库均隔离。记录 sidecar 字节数、整棵进程树 Private Bytes、Working Set、CPU 和启动耗时,不预先承诺百分比。不得将未运行或无收益项写成完成。 + +缺依赖或隔离失效时暂停相关步骤;不自行安装或升级。发布链路和桥接改动分别提交,可分别回退;不迁移数据库,不合并 main、不打包、不发布。 diff --git a/src/GameLibrary.Tauri/scripts/prepare_sidecars.py b/src/GameLibrary.Tauri/scripts/prepare_sidecars.py index 20f2488..5421de1 100644 --- a/src/GameLibrary.Tauri/scripts/prepare_sidecars.py +++ b/src/GameLibrary.Tauri/scripts/prepare_sidecars.py @@ -37,6 +37,7 @@ def publish(project: str, executable: str, properties: list[str] | None = None) "true", "-p:PublishSingleFile=true", "-p:IncludeNativeLibrariesForSelfExtract=true", + "-p:EnableCompressionInSingleFile=true", "-p:DebugType=None", *REVISION_PROPERTIES, *(properties or []), From a73d4121a163fdf352f57bd5125e2c5e7415f6f5 Mon Sep 17 00:00:00 2001 From: AaronSu Date: Fri, 30 Oct 2026 08:38:32 +0800 Subject: [PATCH 04/29] fix(scan): preserve child discovery and prevent shortcut duplicates for v1.8.1 --- docs/code-review-graph/README.md | 2 + .../scan-boundaries-v1.8.1.md | 34 ++++ .../v1.8.1-scan-boundaries-plan.md | 43 +++++ .../Catalog/CandidateReviewService.cs | 5 + .../Detectors/AdditionalEngineDetector.cs | 4 +- src/GameLibrary.Domain/Scan/ScanRuleSet.cs | 8 +- .../Hosting/CandidateReviewHandler.cs | 24 ++- src/GameLibrary.Host/Hosting/GamesHandler.cs | 11 +- .../Scanning/GenericGameCandidateDetector.cs | 15 -- .../Scanning/ScanCandidate.cs | 34 +++- .../Scanning/ScanCandidatePersistence.cs | 33 ++++ .../Scanning/ScanIgnoreRuleSet.cs | 2 +- .../Scanning/ShortcutGameIdentity.cs | 91 ++++++++++ .../Scanning/DirectoryWalker.cs | 18 +- src/GameLibrary.Tauri/src/App.tsx | 1 - .../src/components/Sidebar.test.tsx | 18 +- .../src/components/Sidebar.tsx | 5 +- .../Manual/ManualGameTests.cs | 64 +++++++ .../Scanning/DirectoryWalkerTests.cs | 64 +++++++ .../Scanning/ScanBoundaryRegressionTests.cs | 169 ++++++++++++++++++ .../Scanning/ScanOperationTests.cs | 52 ++++++ .../Scan/ScanRuleSetTests.cs | 22 +++ 22 files changed, 683 insertions(+), 36 deletions(-) create mode 100644 docs/code-review-graph/scan-boundaries-v1.8.1.md create mode 100644 docs/development/v1.8.1-scan-boundaries-plan.md create mode 100644 src/GameLibrary.Host/Scanning/ShortcutGameIdentity.cs create mode 100644 tests/GameLibrary.IntegrationTests/Scanning/ScanBoundaryRegressionTests.cs diff --git a/docs/code-review-graph/README.md b/docs/code-review-graph/README.md index 984db27..14dbb9d 100644 --- a/docs/code-review-graph/README.md +++ b/docs/code-review-graph/README.md @@ -1,5 +1,7 @@ # GameLibrary 代码预览框架 +2026-10-30 v1.8.1 扫描补丁:盘根独立文件、ExactPath 后代遍历、LNK 去重及待确认计数。修改前查询共享扫描路径的影响上下文;修改后以 minimal 模式重建,431 文件、4,316 节点、42,388 边,解析错误 0。专项集成 83、单元 36、Sidebar 3 项及前端 typecheck 通过;Go 独立复审与真实库重复记录处理尚待完成。见[本轮结构记录](scan-boundaries-v1.8.1.md)及[已批准计划](../development/v1.8.1-scan-boundaries-plan.md)。未打包、推送或发布。 + 2026-10-26 网站 v1.5.0:下载与四语言宣传内容同步产品 v1.8.0,新增真实浅深色游戏库及标签截图,缩略图和放大图复用网页 `.dark` 主题切换。修改前已做影响分析,修改后增量解析 6 个文件,错误为空,并执行图谱变更分析。实际执行范围为素材采集、转换、源码审阅与图谱同步;网站测试、构建及浏览器验收未运行,未推送或部署。见[网站实施记录](website.md)和[截图来源](../../website/design/2026-10-26-screenshots.md)。 2026-10-26 优化第三轮(权限显式声明):协议里的 `GrantedPermissions` 以前所有第一方客户端都不填,宿主“null = 不限权”成了唯一实际路径。本轮新增 `ClientPermissionProfiles`(Tauri 桥接 7 项最小集合、tauri-exit 仅 `host.manage`、CLI/MCP/桌面端为目录里除 `access.admin` 外的全部权限),`HostProcessLauncher` 透传,各入口建连时显式声明;新增契约测试核对权限名拼写、真实命名管道集成测试验证受限声明、空声明与 `none` 权限的实际行为;旧 Unity 密钥经评估保留,现有回退测试依赖它。源码提交 `a5d5d4b` 后增量更新,解析错误 0,登记 425 文件、4,134 节点、40,707 边、237 条执行流与 28 个社区。Contract 59、Architecture 11、Unit 183、新增权限用例 4/4 与 HostStop E2E 3/3 通过;Integration 613 中 612 通过,唯一失败仍是既有环境依赖的 Unity 翻译用例(下载固定翻译包 + PowerShell 辅助进程,单独连跑两遍通过)。真实窗口、屏幕阅读器与真机点选未验收;未打包、推送或发布。见[优化记录](../development/2026-10-26-post-v1.7.23-optimization.md)。 diff --git a/docs/code-review-graph/scan-boundaries-v1.8.1.md b/docs/code-review-graph/scan-boundaries-v1.8.1.md new file mode 100644 index 0000000..80c1a63 --- /dev/null +++ b/docs/code-review-graph/scan-boundaries-v1.8.1.md @@ -0,0 +1,34 @@ +# v1.8.1 扫描边界与快捷方式身份 + +基线:`aefdb9508295568e7500ba2e4fa8d0630a5ef07e`;计划 `SCAN-181-r1`。 + +## 共享路径上的修复 + +- `ScanRuleSet` 只对用户 ExactPath 排除设置 `ExcludeDescendants=false`;Walker 在首次及续扫入口求值,跳过该目录识别但继续后代。Subtree、强制系统边界、链接与遍历预算保持原有约束。 +- `ScanCandidateCollector` 将盘根直属入口生成为 `fileGame`,保留引擎/逐入口证据;盘根不再成为 GameRoot / Flash 递归资源边界。普通安装根和 Flash 目录审核仍保留原有剪枝。 +- `ScanCandidatePersistence` 仅将本轮实际读取的盘根上、未绑定游戏的 pendingReview 旧候选转为 deferred,保留 payload/ID;事务提交后发布候选与通知更新。已接受、已绑定及用户忽略/暂缓状态不变。 +- `GenericGameCandidateDetector` 不再自动发现 LNK。`ShortcutGameIdentity` 每次落库预加载快捷方式入口索引,供扫描、手动导入和候选接受共用。相同规范化文件入口或经唯一 Unreal 打包结构验证的 wrapper/Shipping 关系才能阻止重复;同名/同祖先不能作为合并依据,歧义保留审核。无 schema 或 IPC 变化。 +- Sidebar 使用 candidates.list 的 total,不与同一批的通知数量相加。 + +```mermaid +flowchart TD + Rules[用户 ExactPath / Subtree] --> Walker[DirectoryWalker] + ManualScan[ScanningHandler] --> Walker + Reconcile[HostRuntime 周期核对] --> Walker + Walker --> Collector[ScanCandidateCollector] + Collector --> File[盘根 fileGame / 子目录 GameRoot] + File --> Persist[ScanCandidatePersistence] + Persist --> Identity[ShortcutGameIdentity] + Create[GamesHandler 手动导入] --> Identity + Review[CandidateReviewHandler 单项/批量] --> Identity + Persist --> Events[candidate / notification 更新] + Events --> Total[候选 total → Sidebar 徽标] +``` + +## 图谱与验证 + +2026-10-30 调用 code-review-graph 修改前影响上下文;本隔离工作区重建 `minimal` 图谱:431 文件、4,316 节点、42,388 边,解析错误为空;未计算云端 embedding。 + +已运行且通过:83 项专项集成回归(Walker/扫描/候选/Flash/手动导入/MCP null)、36 项规则与引擎检测单元回归、3 项 Sidebar 回归、前端 typecheck。新增手动导入顺序用例修改后再次执行,2 项通过。初轮曾因新增夹具漏填必填时间字段和错误预设 UpsertCandidate 绑定 gameId 失败,已改用真实接受流程修正;前端断言曾错误假设 accessible name 含空格,已匹配真实 DOM。 + +Go 复审与本地重复记录的安全移出仍待完成。未运行真实游戏、付费翻译 API、全量测试、安装/升级验收;未打包、推送、发布或修改版本字段。 diff --git a/docs/development/v1.8.1-scan-boundaries-plan.md b/docs/development/v1.8.1-scan-boundaries-plan.md new file mode 100644 index 0000000..e9f6746 --- /dev/null +++ b/docs/development/v1.8.1-scan-boundaries-plan.md @@ -0,0 +1,43 @@ +# SCAN-181-r1:漏扫、待确认计数与快捷方式重复入库 + +用户于当前会话回复“开始执行该计划”,并在恢复 MCP 后回复“继续”。本计划已获执行授权。 + +## 已确认的目标与边界 + +- 修复盘根上的单个引擎文件把整盘识别为游戏、阻止后代扫描的问题;独立文件仍可审核入库。 +- 恢复 `ExactPath` 只排除自身、`Subtree` 排除子树的语义,不清空用户过滤名单。 +- 待确认徽标仅使用候选总数,不叠加同一批候选的通知数。 +- 自动扫描忽略 LNK;显式手动导入快捷方式继续支持,并按可验证的实际入口/安装结构防重复。 +- 对已证实的重复快捷方式记录,仅从库中移出;保留原文件和历史元数据,不合并评分、时长等历史。 +- 无 schema / IPC 扩展。作为 v1.8.1 独立补丁交给既有版本负责人集成,不改其他工作区的版本字段与 Bridge 优化。 + +## 依据与实现 + +基线 `aefdb9508295568e7500ba2e4fa8d0630a5ef07e`。引擎检测结果进入 `ScanCandidateCollector` 后直接成为 GameRoot,`ShouldDescend` 因此剪掉盘根后代。旧 `45bfbff` 的精确忽略修复不在基线内,仅移植规则/Walker/回归部分,禁止带入旧版本字段。Sidebar 将 candidateTotal 与通知数相加造成重复计数。手动导入目前只比较 RootPath,快捷方式与目录可绕过重复检查。 + +```mermaid +flowchart LR + Scan[手动扫描 / 周期核对] --> Walker[规则与只读遍历] + Walker --> Collector[候选编排 / 盘根独立文件] + Collector --> Persist[候选去重与状态落库] + Persist --> Review[待确认候选总数] + Manual[手动 LNK 导入] --> Identity[保守入口身份核对] + Persist --> Identity +``` + +## 分工与依赖 + +| ID | 依赖 | 负责人/路由 | 所有权与交付 | 必要验证 | +| --- | --- | --- | --- | --- | +| T1 | 无 | Codex | scan-boundaries-v181 隔离工作区;扫描、规则、Sidebar、手动导入及对应回归 | 针对性代码审查 | +| T2 | T1 固定快照 | DSH Go,只读 | 独立只读快照;仅必要源码、diff、匿名 fixture;一次定向纠正额度 | 边界与去重审查,不运行游戏 | +| T3 | T1 | Codex | 修复工作区内专项回归与必要编译 | 盘根、ExactPath/Subtree/续扫、Flash、计数、快捷方式双向顺序与不同安装 | +| T4 | T2/T3 | Codex | 集成审查、本地一致性备份后通过既有移出 API 处理已证实重复 | 核对 revision/身份、文件保留、历史记录保留 | + +T2/T3 可并行;最多两个 worker,仅一个 Go 云端只读审查,无 GPU,无自动切换 API 余额。Codex 独占集成、真实数据库与验收;不把真实数据库、游戏路径、日志、会话或密钥发送云端。 + +## 停止条件与交付 + +权限/工具不可用、备份失败、记录 revision 或身份变化、重复关系无法确定时停止相关步骤。真实库操作只能使用既有一致性备份与 `games.remove(deleteFiles:false,expectedRevision)`,不直接写 SQL,不恢复整库覆盖后续用户操作。无真实游戏启动、翻译 API 调用、打包、安装、远端推送或 Release。 + +交付独立本地提交、真实专项验证结果、graph 文档更新和给 v1.8.1 集成负责人的说明。未验证项目明确保留。 diff --git a/src/GameLibrary.Application/Catalog/CandidateReviewService.cs b/src/GameLibrary.Application/Catalog/CandidateReviewService.cs index 58b7a45..abd33b4 100644 --- a/src/GameLibrary.Application/Catalog/CandidateReviewService.cs +++ b/src/GameLibrary.Application/Catalog/CandidateReviewService.cs @@ -36,6 +36,11 @@ public PreparedReview Prepare(string candidateId, int revision, string action) var candidate = store.TryGetCandidate(candidateId); CandidateReviewOutcome? error = null; if (candidate is null) error = new(candidateId, ErrorCode: "NotFound", ErrorMessage: $"候选不存在:{candidateId}"); + else if (action == "accept" && candidate.ReviewState != "accepted" + && (GameLibrary.Domain.Paths.GamePath.TryCreate(candidate.PhysicalPath).Path?.IsDriveRoot == true + || candidate.PhysicalPath.EndsWith(".lnk", StringComparison.OrdinalIgnoreCase))) + error = new(candidateId, ErrorCode: "InvalidArgument", + ErrorMessage: "磁盘根目录不能作为游戏入库;快捷方式请通过手动添加导入。请重新扫描真实游戏位置"); else if (action == "accept" && !files.Exists(candidate.PhysicalPath)) error = new(candidateId, ErrorCode: "InvalidArgument", ErrorMessage: "游戏路径已不存在,请重新扫描整理后的目录"); else if (candidate.ReviewState != "pendingReview" && !(action == "accept" && candidate.ReviewState == "accepted")) diff --git a/src/GameLibrary.Domain/Detection/Detectors/AdditionalEngineDetector.cs b/src/GameLibrary.Domain/Detection/Detectors/AdditionalEngineDetector.cs index 701c762..d48bade 100644 --- a/src/GameLibrary.Domain/Detection/Detectors/AdditionalEngineDetector.cs +++ b/src/GameLibrary.Domain/Detection/Detectors/AdditionalEngineDetector.cs @@ -42,8 +42,8 @@ public sealed class AdditionalEngineDetector(EngineId engine) : IEngineDetector var embedded = entries.Where(entry => IsGodotEmbeddedPack(snapshot, entry)).ToArray(); if (pack is null && identified.Length == 0 && embedded.Length == 0) return null; if (pack is not null) Found("godot.pack-header", pack); - if (identified.Length > 0) { entries = identified; Found("godot.pe-product", identified[0]); } - else if (embedded.Length > 0) { entries = embedded; Found("godot.embedded-pack", embedded[0]); } + if (identified.Length > 0) { entries = identified; foreach (var entry in identified) Found("godot.pe-product", entry); } + else if (embedded.Length > 0) { entries = embedded; foreach (var entry in embedded) Found("godot.embedded-pack", entry); } } else if (engine == EngineId.Unreal) { diff --git a/src/GameLibrary.Domain/Scan/ScanRuleSet.cs b/src/GameLibrary.Domain/Scan/ScanRuleSet.cs index 9615eb5..55efff4 100644 --- a/src/GameLibrary.Domain/Scan/ScanRuleSet.cs +++ b/src/GameLibrary.Domain/Scan/ScanRuleSet.cs @@ -23,18 +23,22 @@ public sealed record ScanRuleDecision public string? WinningRuleId { get; init; } + ///

    排除目录时是否剪枝子树;用户 ExactPath 只排除目录本身。 + public bool ExcludeDescendants { get; init; } = true; + public required IReadOnlyList MatchedRuleIds { get; init; } /// 深度比较(IReadOnlyList 是引用相等,record 默认相等性不适用于命中列表)。 public bool Equals(ScanRuleDecision? other) => other is not null && Outcome == other.Outcome + && ExcludeDescendants == other.ExcludeDescendants && string.Equals(WinningRuleId, other.WinningRuleId, StringComparison.Ordinal) && MatchedRuleIds.Count == other.MatchedRuleIds.Count && MatchedRuleIds.SequenceEqual(other.MatchedRuleIds, StringComparer.Ordinal); public override int GetHashCode() => - HashCode.Combine(Outcome, WinningRuleId ?? string.Empty, MatchedRuleIds.Count); + HashCode.Combine(Outcome, ExcludeDescendants, WinningRuleId ?? string.Empty, MatchedRuleIds.Count); } /// @@ -133,6 +137,8 @@ private static ScanRuleDecision Decision(ScanRule rule, List matched) => _ => ScanRuleOutcome.Continue, }, WinningRuleId = rule.RuleId, + ExcludeDescendants = rule.Action != ScanRuleAction.Exclude + || rule.Source != ScanRuleSource.User || rule.Matcher is not ExactPathMatcher, MatchedRuleIds = matched, }; } diff --git a/src/GameLibrary.Host/Hosting/CandidateReviewHandler.cs b/src/GameLibrary.Host/Hosting/CandidateReviewHandler.cs index 9ca4549..ba31fee 100644 --- a/src/GameLibrary.Host/Hosting/CandidateReviewHandler.cs +++ b/src/GameLibrary.Host/Hosting/CandidateReviewHandler.cs @@ -28,7 +28,9 @@ public Envelope CandidateReview(IpcRequest request, string action) .Review(candidateId, revision.Value, flashSelection)); } var service = new CandidateReviewService(store, new CatalogFiles()); - return ToEnvelope(request, store, service.Apply(service.Prepare(candidateId, revision.Value, action))); + var prepared = service.Prepare(candidateId, revision.Value, action); + return ToEnvelope(request, store, store.InTransaction(() => ApplyReview(service, prepared, + new ShortcutGameIdentity(store.ListGames().Where(game => game.Kind == "manualShortcut").ToArray())))); } public Envelope ReviewBatch(IpcRequest request) @@ -57,8 +59,13 @@ public Envelope ReviewBatch(IpcRequest request) var service = new CandidateReviewService(store, new CatalogFiles()); var prepared = inputs.Select(item => service.Prepare(item.Id, item.Revision, action)).ToArray(); var flashService = new FlashCandidateReviewService(store, new CatalogFiles()); - var results = store.InTransaction(() => inputs.Select((item, index) => store.InReviewSavepoint(() => - item.Flash is null ? service.Apply(prepared[index]) : flashService.Review(item.Id, item.Revision, item.Flash))).ToArray()); + var results = store.InTransaction(() => + { + var games = new ShortcutGameIdentity(store.ListGames().Where(game => game.Kind == "manualShortcut").ToArray()); + return inputs.Select((item, index) => store.InReviewSavepoint(() => + item.Flash is null ? ApplyReview(service, prepared[index], games) + : flashService.Review(item.Id, item.Revision, item.Flash))).ToArray(); + }); // Optional cover synchronization and events follow the successful outer commit. var output = results.Select(result => new { @@ -74,6 +81,17 @@ public Envelope ReviewBatch(IpcRequest request) }; } + private static CandidateReviewOutcome ApplyReview(CandidateReviewService service, + PreparedReview prepared, ShortcutGameIdentity games) + { + if (prepared.Error is null && prepared.Action == "accept" && prepared.Candidate?.GameId is null + && prepared.Game?.EntryPath is { } entry + && games.FindMatches([entry]).Count > 0) + return new(prepared.CandidateId, ErrorCode: ErrorCodes.InvalidArgument, + ErrorMessage: "该入口已通过快捷方式入库,请检查现有游戏记录"); + return service.Apply(prepared); + } + public Envelope Inspect(IpcRequest request) { var store = storeAccessor(); diff --git a/src/GameLibrary.Host/Hosting/GamesHandler.cs b/src/GameLibrary.Host/Hosting/GamesHandler.cs index 5341896..b00f550 100644 --- a/src/GameLibrary.Host/Hosting/GamesHandler.cs +++ b/src/GameLibrary.Host/Hosting/GamesHandler.cs @@ -382,7 +382,8 @@ public Envelope GamesCreate(IpcRequest request) } } - var existing = store.ListGames().FirstOrDefault(game => + var existingGames = store.ListGames(); + var existing = existingGames.FirstOrDefault(game => { var prior = Domain.Paths.GamePath.TryCreate(game.RootPath); return game.Membership == "active" @@ -394,6 +395,14 @@ public Envelope GamesCreate(IpcRequest request) return IpcRequests.InvalidArgument(request, $"该游戏位置已入库:{existing.GameId}"); } + var entries = entryPath is not null ? new[] { entryPath } + : GenericGameCandidateDetector.Inspect(new FileSystemDirectorySnapshot(normalized)).EntryCandidates + .Select(entry => Path.Combine(normalized.PhysicalPath, entry.RelativePath)).ToArray(); + var shortcutMatches = new ShortcutGameIdentity(existingGames).FindMatches(entries, importingShortcut: isShortcut); + if (shortcutMatches.Count > 0) + return IpcRequests.InvalidArgument(request, + $"该入口已关联游戏,请检查现有记录:{string.Join(", ", shortcutMatches.Select(game => game.GameId))}"); + string title; JsonElement titleElement = default; var hasTitle = request.Parameters is { ValueKind: JsonValueKind.Object } parameters diff --git a/src/GameLibrary.Host/Scanning/GenericGameCandidateDetector.cs b/src/GameLibrary.Host/Scanning/GenericGameCandidateDetector.cs index c73dc93..6f50fa0 100644 --- a/src/GameLibrary.Host/Scanning/GenericGameCandidateDetector.cs +++ b/src/GameLibrary.Host/Scanning/GenericGameCandidateDetector.cs @@ -62,11 +62,6 @@ public static GenericCandidateFinding Inspect(IDirectorySnapshot snapshot) .OrderBy(file => file, StringComparer.Ordinal) .Take(MaxDirectEntries) .ToArray(); - var shortcuts = files - .Where(file => file.EndsWith(".lnk", StringComparison.OrdinalIgnoreCase)) - .OrderBy(file => file, StringComparer.Ordinal) - .Take(Math.Max(0, MaxDirectEntries - executables.Length)) - .ToArray(); var evidence = executables .Select(file => new DetectionEvidence( @@ -75,12 +70,6 @@ public static GenericCandidateFinding Inspect(IDirectorySnapshot snapshot) EvidenceObservation.Present, EvidencePolarity.Contextual, "发现未识别引擎的直属可执行文件;需要用户审核")) - .Concat(shortcuts.Select(file => new DetectionEvidence( - "generic.shortcut", - file, - EvidenceObservation.Present, - EvidencePolarity.Contextual, - "快捷方式仅作为发现线索;接受前仍需验证目标"))) .ToArray(); var entries = executables @@ -88,10 +77,6 @@ public static GenericCandidateFinding Inspect(IDirectorySnapshot snapshot) file, 20 + EntryScoring.GameExeNameBonusFor(file), ["未识别引擎的直属 EXE;需要用户审核"])) - .Concat(shortcuts.Select(file => new EntryCandidate( - file, - 0, - ["快捷方式目标尚未验证;仅作为待审核线索"]))) .OrderByDescending(entry => entry.Score) .ThenBy(entry => entry.RelativePath, StringComparer.Ordinal) .ToArray(); diff --git a/src/GameLibrary.Host/Scanning/ScanCandidate.cs b/src/GameLibrary.Host/Scanning/ScanCandidate.cs index 641fc15..8e2214c 100644 --- a/src/GameLibrary.Host/Scanning/ScanCandidate.cs +++ b/src/GameLibrary.Host/Scanning/ScanCandidate.cs @@ -8,7 +8,7 @@ namespace GameLibrary.Host.Scanning; /// /// T05-B 扫描候选(宿主内存态;入库/审核状态机与持久化随 T11 进入)。 -/// 已知引擎证据产生 GameRoot;未知引擎的直属 EXE/LNK 产生保守待审核候选;根级独立 +/// 已知引擎证据产生 GameRoot;未知引擎的直属 EXE 产生保守待审核候选;根级独立 /// EXE/SWF 产生 FileGame。发现可启动游戏后停止遍历其子树;≥2 个直属 /// GameRoot 的父目录补充诊断用 Container(不进入待添加列表),双 high 记 EngineConflict。 /// @@ -152,12 +152,15 @@ public sealed class ScanCandidateCollector private readonly IReadOnlyList _flashRules; private readonly HashSet _flashBoundaries = new(StringComparer.OrdinalIgnoreCase); private readonly HashSet _flashCollections = new(StringComparer.OrdinalIgnoreCase); + private readonly HashSet _inspectedDriveRoots = new(StringComparer.OrdinalIgnoreCase); /// 本次作业发现的全部候选(落库与查询用)。 public IReadOnlyList Candidates => _candidates; public IReadOnlyList FlashGroups => _flashGroups; + public IReadOnlySet InspectedDriveRoots => _inspectedDriveRoots; + public int CandidateCount => _candidates.Count; public bool ShouldDescend(string directoryPath) => @@ -177,6 +180,13 @@ public ScanCandidateCollector(GamePath root, string jobId, CandidateRegistry reg /// 复用 Walker 已完成的直属枚举做只读识别,避免每个检测器重新枚举目录。 public void InspectDirectory(ScannedDirectory directory, CancellationToken ct) + { + var validation = GamePath.TryCreate(directory.PhysicalPath); + if (!validation.IsValid) return; + InspectDirectory(directory, ct, new FileSystemDirectorySnapshot(validation.Path!, directory.Directories, directory.Files)); + } + + internal void InspectDirectory(ScannedDirectory directory, CancellationToken ct, IDirectorySnapshot snapshot) { ct.ThrowIfCancellationRequested(); var validation = GamePath.TryCreate(directory.PhysicalPath); @@ -190,12 +200,32 @@ public void InspectDirectory(ScannedDirectory directory, CancellationToken ct) return; } - var snapshot = new FileSystemDirectorySnapshot(validation.Path!, directory.Directories, directory.Files); var report = Detectors.DetectAll(snapshot); var confirmed = report.Results .Where(r => r.Confidence >= DetectionConfidence.Medium && r.LikelyRootRelativePaths.Count > 0 && r.EntryCandidates.Any(entry => snapshot.FileExists(entry.RelativePath))) .ToArray(); + // 盘根是容器,直属游戏只能按文件入库,不能吞掉整盘的其他安装目录。 + if (validation.Path!.IsDriveRoot) + { + _inspectedDriveRoots.Add(validation.Path.PhysicalPath); + var genericAtRoot = GenericGameCandidateDetector.Inspect(snapshot); + var entries = confirmed.SelectMany(result => result.EntryCandidates) + .Concat(genericAtRoot.EntryCandidates) + .Where(entry => Path.GetFileName(entry.RelativePath) == entry.RelativePath + && (entry.RelativePath.EndsWith(".exe", StringComparison.OrdinalIgnoreCase) + || entry.RelativePath.EndsWith(".swf", StringComparison.OrdinalIgnoreCase))) + .GroupBy(entry => entry.RelativePath, StringComparer.OrdinalIgnoreCase); + foreach (var group in entries) + { + var entry = group.OrderByDescending(item => item.Score).First(); + var engines = confirmed.Where(result => result.EntryCandidates.Any(item => + string.Equals(item.RelativePath, entry.RelativePath, StringComparison.OrdinalIgnoreCase))).ToArray(); + AddCandidate(BuildFileCandidate(validation.Path!, entry, engines, + engines.SelectMany(result => result.Evidence).Concat(genericAtRoot.Evidence).ToArray())); + } + return; + } // 合集中的 SWF 已按用户选定入口处理;仍让其他引擎的独立安装根走原扫描流程。 if (_flashCollections.Any(parent => directory.PhysicalPath.StartsWith(parent + Path.DirectorySeparatorChar, StringComparison.OrdinalIgnoreCase)) && !confirmed.Any(item => item.Engine != EngineId.Flash)) return; diff --git a/src/GameLibrary.Host/Scanning/ScanCandidatePersistence.cs b/src/GameLibrary.Host/Scanning/ScanCandidatePersistence.cs index 7854655..564d217 100644 --- a/src/GameLibrary.Host/Scanning/ScanCandidatePersistence.cs +++ b/src/GameLibrary.Host/Scanning/ScanCandidatePersistence.cs @@ -39,11 +39,21 @@ public static void Persist( { var regroupRoots = store.ListLegacyFlashScanRoots(); var existingGames = store.ListGames(); + var shortcutGames = new ShortcutGameIdentity(existingGames.Where(game => game.Membership == "active" && game.Kind == "manualShortcut").ToArray()); var unknownGames = existingGames.Where(game => game.Membership == "active" && (string.IsNullOrWhiteSpace(game.Engine) || game.Engine == "unknown")) .ToLookup(game => game.RootPath, StringComparer.OrdinalIgnoreCase); var candidateLookup = store.ListCandidates().ToLookup(item => item.PhysicalPath, StringComparer.OrdinalIgnoreCase); var storedFlashDirectories = new HashSet(StringComparer.OrdinalIgnoreCase); + foreach (var path in collector.InspectedDriveRoots) + foreach (var prior in candidateLookup[path].Where(item => item.ReviewState == "pendingReview" && item.GameId is null)) + { + var current = store.TryGetCandidate(prior.CandidateId); + if (current is not { ReviewState: "pendingReview", GameId: null }) continue; + if (store.TransitionCandidate(current.CandidateId, "pendingReview", "deferred", current.Revision, null, utcNow) is not null) + Publish("candidate.updated", $"candidate:{current.CandidateId}", new + { candidateId = current.CandidateId, from = "pendingReview", to = "deferred", reason = "driveRootIsContainer" }); + } foreach (var candidate in collector.Candidates) { // 合集是目录结构信息,不是可启动的游戏,不能进入待添加列表。 @@ -58,6 +68,22 @@ public static void Persist( continue; } + // 快捷方式先入库、之后扫描本体也走同一身份检查;不触碰已接受的记录。 + var directory = candidate.Kind == GameLibrary.Domain.States.CandidateKind.FileGame + ? Path.GetDirectoryName(candidate.PhysicalPath)! : candidate.PhysicalPath; + var entries = candidate.EntryCandidates.Select(entry => Path.Combine(directory, + entry.RelativePath.Replace('/', Path.DirectorySeparatorChar))).ToArray(); + if (entries.Length == 1 && candidate.Flash is not { RequiresReview: true } + && shortcutGames.FindMatches(entries).Count == 1) + { + foreach (var prior in candidateLookup[candidate.PhysicalPath].Where(item => item.GameId is null + && item.ReviewState == "pendingReview")) + if (store.TransitionCandidate(prior.CandidateId, "pendingReview", "deferred", prior.Revision, null, utcNow) is not null) + Publish("candidate.updated", $"candidate:{prior.CandidateId}", new + { candidateId = prior.CandidateId, from = "pendingReview", to = "deferred", reason = "existingShortcut" }); + continue; + } + var payloadJson = WithHints( existingGames, JsonSerializer.Serialize(candidate.ToDetail(), GameLibrary.Contracts.ContractJson.Options), @@ -140,6 +166,7 @@ public static void Persist( } // T18:候选进入 pendingReview 后汇总为通知批(新候选才触发;ack/defer 的旧批不复活)。 + var pendingNotifications = store.ListNotifications("pending"); var notification = store.EnsureCandidateBatch(utcNow); if (notification is not null) { @@ -149,6 +176,12 @@ public static void Persist( $"notification:{batch.NotificationId}", new { notificationId = batch.NotificationId, title = batch.Title, count = batch.CandidateIds.Count }); } + foreach (var prior in pendingNotifications) + if (store.TryGetNotification(prior.NotificationId) is { } current + && (current.State != prior.State || !current.CandidateIds.SequenceEqual(prior.CandidateIds)) + && current.NotificationId != notification?.Batch.NotificationId) + Publish("notification.updated", $"notification:{current.NotificationId}", new + { notificationId = current.NotificationId, state = current.State, count = current.CandidateIds.Count }); return true; }); foreach (var publication in publications) diff --git a/src/GameLibrary.Host/Scanning/ScanIgnoreRuleSet.cs b/src/GameLibrary.Host/Scanning/ScanIgnoreRuleSet.cs index 68e2ef4..bbb58ca 100644 --- a/src/GameLibrary.Host/Scanning/ScanIgnoreRuleSet.cs +++ b/src/GameLibrary.Host/Scanning/ScanIgnoreRuleSet.cs @@ -6,7 +6,7 @@ namespace GameLibrary.Host.Scanning; /// /// 把持久化 ignore 规则映射为遍历层排除规则(R36 接线,补充规格 2.1): -/// ExactPath → 精确路径排除;Subtree → 分段子树排除(含子树根自身); +/// ExactPath → 只排除该路径,目录后代仍扫描;Subtree → 分段子树排除(含子树根自身); /// ConfirmedIdentity 按 gameId 绑定候选身份,遍历层无 gameId 可求值,仍由落库抑制处理。 /// OrderIndex 沿用存储顺序(created_utc, ignore_id)保证同优先级结果确定。 /// diff --git a/src/GameLibrary.Host/Scanning/ShortcutGameIdentity.cs b/src/GameLibrary.Host/Scanning/ShortcutGameIdentity.cs new file mode 100644 index 0000000..860d84e --- /dev/null +++ b/src/GameLibrary.Host/Scanning/ShortcutGameIdentity.cs @@ -0,0 +1,91 @@ +using GameLibrary.Domain.Catalog; +using GameLibrary.Domain.Detection; +using GameLibrary.Domain.Detection.Detectors; +using GameLibrary.Domain.Paths; +using GameLibrary.Infrastructure.Scanning; + +namespace GameLibrary.Host.Scanning; + +/// 只比较快捷方式与已验证入口;标题、目录前缀不能证明是同一游戏。 +internal sealed class ShortcutGameIdentity +{ + private readonly IReadOnlyList _games; + private readonly ILookup _entries; + + public ShortcutGameIdentity(IReadOnlyList games) + { + _games = games.Where(game => game.Membership == "active").ToArray(); + _entries = _games.Where(game => game.EntryPath is not null) + .Select(game => (Game: game, Key: EntryKey(game.EntryPath!))).Where(item => item.Key is not null) + .ToLookup(item => item.Key!, item => item.Game, StringComparer.OrdinalIgnoreCase); + } + + public IReadOnlyList FindMatches(IReadOnlyList entries, bool importingShortcut = false) + { + var keys = entries.Select(EntryKey).OfType().ToHashSet(StringComparer.OrdinalIgnoreCase); + if (keys.Count == 0) return []; + return keys.SelectMany(key => _entries[key]).Where(game => importingShortcut || game.Kind == "manualShortcut") + .Concat(importingShortcut ? _games.Where(game => game.EntryPath is null && keys.Any(key => + string.Equals(Path.GetDirectoryName(key), game.RootPath, StringComparison.OrdinalIgnoreCase) + && IsUniqueDirectoryEntry(game.RootPath, key))) : []) + .DistinctBy(game => game.GameId) + .ToArray(); + } + + private static bool IsUniqueDirectoryEntry(string directory, string entry) + { + if (!IsSafeFile(entry)) return false; + var snapshot = new FileSystemDirectorySnapshot(GamePath.Create(directory)); + var entries = GenericGameCandidateDetector.Inspect(snapshot).EntryCandidates; + return entries.Count == 1 && string.Equals(Path.Combine(directory, entries[0].RelativePath), entry, + StringComparison.OrdinalIgnoreCase); + } + + private static string? EntryKey(string path) + { + var validation = GamePath.TryCreate(path); + if (!validation.IsValid || !IsSafeFile(validation.Path!.PhysicalPath)) return null; + var entry = validation.Path!.PhysicalPath; + return UnrealWrapper(entry) ?? entry; + } + + private static bool IsSafeFile(string path) + { + try + { + if (!File.Exists(path)) return false; + for (var current = path; current is not null; current = Path.GetDirectoryName(current)) + if ((File.GetAttributes(current) & FileAttributes.ReparsePoint) != 0) return false; + return true; + } + catch (Exception ex) when (ex is IOException or UnauthorizedAccessException or ArgumentException) { return false; } + } + + private static string? UnrealWrapper(string entry) + { + var platform = Path.GetDirectoryName(entry); + if (platform is null || !Path.GetFileName(platform).Equals("Win64", StringComparison.OrdinalIgnoreCase) + && !Path.GetFileName(platform).Equals("Win32", StringComparison.OrdinalIgnoreCase)) return null; + var binaries = Path.GetDirectoryName(platform); + if (!string.Equals(Path.GetFileName(binaries), "Binaries", StringComparison.OrdinalIgnoreCase)) return null; + var project = Path.GetDirectoryName(binaries!); + var root = project is null ? null : Path.GetDirectoryName(project); + if (root is null || GamePath.Create(root).IsDriveRoot) return null; + var projectName = Path.GetFileName(project!); + if (!Path.GetFileName(entry).Equals(projectName + "-" + Path.GetFileName(platform) + "-Shipping.exe", + StringComparison.OrdinalIgnoreCase)) return null; + var wrapper = Path.Combine(root, projectName + ".exe"); + if (!IsSafeFile(wrapper)) return null; + try + { + var report = new AdditionalEngineDetector(EngineId.Unreal) + .Detect(new FileSystemDirectorySnapshot(GamePath.Create(root))); + return report is { EntryCandidates.Count: 1 } + && report.Evidence.Any(e => e.RuleId == "unreal.packaged-project" + && string.Equals(e.RelativePath, projectName + "/Content/Paks", StringComparison.OrdinalIgnoreCase)) + && string.Equals(report.EntryCandidates[0].RelativePath, Path.GetFileName(wrapper), StringComparison.OrdinalIgnoreCase) + ? wrapper : null; + } + catch (Exception ex) when (ex is IOException or UnauthorizedAccessException or ArgumentException) { return null; } + } +} diff --git a/src/GameLibrary.Infrastructure/Scanning/DirectoryWalker.cs b/src/GameLibrary.Infrastructure/Scanning/DirectoryWalker.cs index eef2f79..e9234ed 100644 --- a/src/GameLibrary.Infrastructure/Scanning/DirectoryWalker.cs +++ b/src/GameLibrary.Infrastructure/Scanning/DirectoryWalker.cs @@ -100,7 +100,8 @@ public sealed class PauseSignal /// /// 只读目录遍历器(ADR-0002):显式栈 DFS、分段检查取消/暂停/预算、重解析点不跟随、 -/// 目录规则 Exclude 剪枝整棵子树并计数。本类不读文件内容、不做识别。 +/// 用户 ExactPath 排除目录自身的识别,保留后代遍历;其他目录排除仍剪枝子树。 +/// 本类不读文件内容、不做识别。 /// public sealed class DirectoryWalker { @@ -197,6 +198,14 @@ private ScanCoverageData WalkCore( CountExclusion(excludedByRule, "sys.recycle"); continue; } + // 根目录和续扫目录也求值,精确忽略的目录不能成为游戏边界。 + var directoryDecision = _rules.Decide(GamePath.Create(dirPath)); + if (directoryDecision.Outcome == ScanRuleOutcome.Exclude) + { + skippedDirectories++; + CountExclusion(excludedByRule, directoryDecision.WinningRuleId!); + if (directoryDecision.ExcludeDescendants) continue; + } var enumerateStatus = TryEnumerate(dirPath, ct, out var subDirs, out var files); if (enumerateStatus != EnumerateStatus.Ok) { @@ -228,7 +237,8 @@ private ScanCoverageData WalkCore( } scannedDirectories++; - onDirectory?.Invoke(new ScannedDirectory(dirPath, depth, subDirs, files)); + if (directoryDecision.Outcome != ScanRuleOutcome.Exclude) + onDirectory?.Invoke(new ScannedDirectory(dirPath, depth, subDirs, files)); foreach (var file in files) { @@ -252,7 +262,7 @@ private ScanCoverageData WalkCore( } // 游戏边界由识别层决定;直属文件仍完整计数,资源子树不再参与发现。 - if (shouldDescend?.Invoke(dirPath) == false) + if (directoryDecision.Outcome != ScanRuleOutcome.Exclude && shouldDescend?.Invoke(dirPath) == false) { continue; } @@ -273,7 +283,7 @@ private ScanCoverageData WalkCore( } var decision = _rules.Decide(dirPathValue); - if (decision.Outcome == ScanRuleOutcome.Exclude) + if (decision.Outcome == ScanRuleOutcome.Exclude && decision.ExcludeDescendants) { skippedDirectories++; CountExclusion(excludedByRule, decision.WinningRuleId!); diff --git a/src/GameLibrary.Tauri/src/App.tsx b/src/GameLibrary.Tauri/src/App.tsx index b63f980..87ba41c 100644 --- a/src/GameLibrary.Tauri/src/App.tsx +++ b/src/GameLibrary.Tauri/src/App.tsx @@ -247,7 +247,6 @@ function App() { tags={library.tags} candidateTotal={library.candidateTotal} gameTotal={library.gameTotal} - notificationTotal={library.notifications.length} onCreateTag={() => setPrompt("tag")} /> ); diff --git a/src/GameLibrary.Tauri/src/components/Sidebar.test.tsx b/src/GameLibrary.Tauri/src/components/Sidebar.test.tsx index e5a8cdf..0a6e709 100644 --- a/src/GameLibrary.Tauri/src/components/Sidebar.test.tsx +++ b/src/GameLibrary.Tauri/src/components/Sidebar.test.tsx @@ -4,12 +4,26 @@ import { Sidebar, type SidebarProps } from "./Sidebar"; afterEach(cleanup); +it("uses the candidate total for the pending badge, independent of notification records and loaded page size", () => { + const props: SidebarProps = { + section: "library", onSectionChange: vi.fn(), viewId: "", onViewChange: vi.fn(), + favoriteOnly: false, onFavoriteChange: vi.fn(), playedOnly: false, onPlayedChange: vi.fn(), + tagId: "", onTagChange: vi.fn(), tags: [], candidateTotal: 1, gameTotal: 10, onCreateTag: vi.fn(), + }; + const view = render(); + expect(screen.getByRole("button", { name: /^待确认\s*1$/ })).toBeInTheDocument(); + view.rerender(); + expect(screen.getByRole("button", { name: /^待确认\s*101$/ })).toBeInTheDocument(); + view.rerender(); + expect(screen.getByRole("button", { name: "待确认" })).toBeInTheDocument(); +}); + it("gives the saved-folder area to tags and keeps the favorites filter", () => { render(); + candidateTotal={0} gameTotal={10} onCreateTag={vi.fn()} />); expect(screen.getByRole("button", { name: "收藏" })).toBeInTheDocument(); expect(screen.getByRole("button", { name: /unity/ })).toBeInTheDocument(); expect(screen.queryByText("收藏夹")).not.toBeInTheDocument(); @@ -21,7 +35,7 @@ it("switches played and main libraries, clears filters, and keeps tags within th section: "library", onSectionChange: vi.fn(), viewId: "", onViewChange: vi.fn(), favoriteOnly: false, onFavoriteChange: vi.fn(), playedOnly: false, onPlayedChange: vi.fn(), tagId: "", onTagChange: vi.fn(), tags: [{ tagId: "unity", name: "unity", kind: "engine", revision: 1, gameCount: 2 }], - candidateTotal: 0, gameTotal: 1, notificationTotal: 0, onCreateTag: vi.fn(), + candidateTotal: 0, gameTotal: 1, onCreateTag: vi.fn(), }; const view = render(); expect(screen.getByRole("button", { name: /全部游戏/ })).toHaveAttribute("aria-current", "page"); diff --git a/src/GameLibrary.Tauri/src/components/Sidebar.tsx b/src/GameLibrary.Tauri/src/components/Sidebar.tsx index b555c86..b52e59b 100644 --- a/src/GameLibrary.Tauri/src/components/Sidebar.tsx +++ b/src/GameLibrary.Tauri/src/components/Sidebar.tsx @@ -30,7 +30,6 @@ export interface SidebarProps { tags: TagItem[]; candidateTotal: number; gameTotal: number; - notificationTotal: number; onCreateTag: () => void; } @@ -49,11 +48,9 @@ export function Sidebar(props: SidebarProps) { tags, candidateTotal, gameTotal, - notificationTotal, onCreateTag, } = props; - const pendingBadge = candidateTotal + notificationTotal; // 标签定义仍保留在“管理标签”中;侧栏只展示当前库内至少有一个有效游戏的标签, // 并与管理页同口径按四分类分组(v1.5.5),空分组不占位。 const visibleTags = tags.filter((tag) => (tag.gameCount ?? 0) > 0); @@ -98,7 +95,7 @@ export function Sidebar(props: SidebarProps) { } label={t("待确认")} - count={pendingBadge} + count={candidateTotal} active={section === "pending"} onClick={() => onSectionChange("pending")} /> diff --git a/tests/GameLibrary.IntegrationTests/Manual/ManualGameTests.cs b/tests/GameLibrary.IntegrationTests/Manual/ManualGameTests.cs index 3c5ecad..163c341 100644 --- a/tests/GameLibrary.IntegrationTests/Manual/ManualGameTests.cs +++ b/tests/GameLibrary.IntegrationTests/Manual/ManualGameTests.cs @@ -3,6 +3,7 @@ using GameLibrary.Contracts; using GameLibrary.Contracts.Ipc; using GameLibrary.Host.Scanning; +using GameLibrary.Domain.Paths; using GameLibrary.HostClient; using GameLibrary.Infrastructure.Shell; using Xunit; @@ -269,6 +270,69 @@ public async Task WindowsShortcut_PreservesVerifiedTargetArgumentsAndWorkingDire Assert.Equal(ErrorCodes.PermissionDenied, rejected.Error!.Code); } + [Theory] + [InlineData(false)] + [InlineData(true)] + public async Task ShortcutAndUnrealDirectory_DoNotCreateDuplicateCards_InEitherOrder(bool shortcutFirst) + { + var root = Path.Combine(DataDir, "shortcut-dedupe-" + Guid.NewGuid().ToString("N")); + var game = Path.Combine(root, "Install"); + var shipping = Path.Combine(game, "Sample", "Binaries", "Win64", "Sample-Win64-Shipping.exe"); + Directory.CreateDirectory(Path.GetDirectoryName(shipping)!); + File.WriteAllText(shipping, "fixture"); + File.WriteAllText(Path.Combine(game, "Sample.exe"), "fixture"); + Directory.CreateDirectory(Path.Combine(game, "Engine")); + var packs = Path.Combine(game, "Sample", "Content", "Paks"); + Directory.CreateDirectory(packs); + File.WriteAllText(Path.Combine(packs, "Sample.pak"), "fixture"); + var link = Path.Combine(game, "Play.lnk"); + ShellLinkInterop.RunOnSta(() => + { + var shellLink = ShellLinkInterop.CreateShellLink(); + shellLink.SetPath(shipping); + shellLink.SetWorkingDirectory(Path.GetDirectoryName(shipping)!); + ((IPersistFile)shellLink).Save(link, fRemember: false); + return true; + }); + Assert.True((await InvokeAsync("roots.add", new { root })).Ok); + var store = _fixture.State.Library.Store!; + if (shortcutFirst) + { + var before = new ScanCandidateCollector(GamePath.Create(root), "before-shortcut", new()); + ScanJobRunner.Run(GamePath.Create(root), new() { JobId = "before-shortcut", Token = CancellationToken.None }, before); + ScanCandidatePersistence.Persist(store, null, before, "before-shortcut", readyForReview: true); + } + var created = await InvokeAsync("games.create", new + { + sourcePath = shortcutFirst ? link : game, idempotencyKey = Guid.NewGuid().ToString("N"), + }); + Assert.True(created.Ok, created.Error?.Message); + var duplicate = await InvokeAsync("games.create", new + { + sourcePath = shortcutFirst ? game : link, idempotencyKey = Guid.NewGuid().ToString("N"), + }); + Assert.False(duplicate.Ok); + Assert.Equal(ErrorCodes.InvalidArgument, duplicate.Error!.Code); + if (shortcutFirst) + { + var pending = Assert.Single(store.ListCandidates(), candidate => candidate.PhysicalPath == game); + var accepted = await InvokeAsync("candidates.accept", new + { + candidateId = pending.CandidateId, expectedRevision = pending.Revision, + idempotencyKey = Guid.NewGuid().ToString("N"), + }); + Assert.False(accepted.Ok); + Assert.Equal(ErrorCodes.InvalidArgument, accepted.Error!.Code); + } + var collector = new ScanCandidateCollector(GamePath.Create(root), "shortcut-after-manual", new()); + ScanJobRunner.Run(GamePath.Create(root), new() { JobId = "shortcut-after-manual", Token = CancellationToken.None }, collector); + ScanCandidatePersistence.Persist(store, null, collector, "shortcut-after-manual", readyForReview: true); + ScanCandidatePersistence.Persist(store, null, collector, "shortcut-repeat", readyForReview: true); + Assert.Single(store.ListGames(), card => card.Membership == "active" && card.RootPath.StartsWith(root, StringComparison.Ordinal)); + if (shortcutFirst) + Assert.DoesNotContain(store.ListCandidates(), candidate => candidate.PhysicalPath == game && candidate.ReviewState == "pendingReview"); + } + [Fact] public async Task CreateAndRelink_ComputeAndRefreshFingerprint() { diff --git a/tests/GameLibrary.IntegrationTests/Scanning/DirectoryWalkerTests.cs b/tests/GameLibrary.IntegrationTests/Scanning/DirectoryWalkerTests.cs index 7b74941..065f935 100644 --- a/tests/GameLibrary.IntegrationTests/Scanning/DirectoryWalkerTests.cs +++ b/tests/GameLibrary.IntegrationTests/Scanning/DirectoryWalkerTests.cs @@ -8,6 +8,70 @@ namespace GameLibrary.IntegrationTests.Scanning; /// DirectoryWalker(T02-B):只读遍历、规则剪枝、预算分段续扫、取消、深度上限。 public sealed class DirectoryWalkerTests { + [Fact] + public void Walk_ExactIgnoredDirectoryAndFile_KeepChildDiscoveryAcrossResume() + { + var root = FreshTree("walk-exact-resume"); + try + { + var collection = Path.Combine(root, "[Unity]"); + var child = Path.Combine(collection, "New Game"); + Directory.CreateDirectory(child); + var hiddenFile = Path.Combine(child, "hidden.exe"); + var visibleFile = Path.Combine(child, "Game.exe"); + File.WriteAllText(hiddenFile, "fixture"); + File.WriteAllText(visibleFile, "fixture"); + var rules = new ScanRuleSet(new[] { collection, hiddenFile }.Select((path, i) => new ScanRule + { + RuleId = "exact-" + i, Source = ScanRuleSource.User, Action = ScanRuleAction.Exclude, + Matcher = new ExactPathMatcher(GamePath.Create(path).ComparisonKey), + })); + var walker = new DirectoryWalker(GamePath.Create(root), rules, + new ScanWalkOptions { MaxDirectories = 1 }); + var files = new List(); + var inspected = new List(); + var coverage = walker.Walk(files.Add, null, CancellationToken.None, d => inspected.Add(d.PhysicalPath)); + var segments = 1; + while (coverage.ResumeTokenJson is { } resume) + { + Assert.True(++segments < 10); + coverage = walker.Resume(resume, files.Add, null, CancellationToken.None, d => inspected.Add(d.PhysicalPath)); + } + Assert.True(segments > 1); + Assert.Equal(ScanCompletion.Complete, coverage.Completion); + Assert.DoesNotContain(collection, inspected); + Assert.Contains(child, inspected); + Assert.Equal(visibleFile, Assert.Single(files).PhysicalPath); + Assert.Equal(1, coverage.SkippedFiles); + } + finally { TryCleanup(root); } + } + + [Fact] + public void Walk_SubtreeExcludedRoot_IsNotEnumerated() + { + var root = FreshTree("walk-subtree-root"); + try + { + CreateTree(root); + var rules = new ScanRuleSet([new ScanRule + { + RuleId = "subtree", Source = ScanRuleSource.User, Action = ScanRuleAction.Exclude, + Matcher = new SubtreeMatcher(root), + }]); + var files = new List(); + var inspected = new List(); + var coverage = new DirectoryWalker(GamePath.Create(root), rules) + .Walk(files.Add, null, CancellationToken.None, inspected.Add); + Assert.Empty(files); + Assert.Empty(inspected); + Assert.Equal(0, coverage.ScannedDirectories); + Assert.Equal(1, coverage.ExcludedByRule["subtree"]); + Assert.Equal(ScanCompletion.Complete, coverage.Completion); + } + finally { TryCleanup(root); } + } + [Theory] [InlineData("$RECYCLE.BIN")] [InlineData("$recycle.bin")] diff --git a/tests/GameLibrary.IntegrationTests/Scanning/ScanBoundaryRegressionTests.cs b/tests/GameLibrary.IntegrationTests/Scanning/ScanBoundaryRegressionTests.cs new file mode 100644 index 0000000..6738f6e --- /dev/null +++ b/tests/GameLibrary.IntegrationTests/Scanning/ScanBoundaryRegressionTests.cs @@ -0,0 +1,169 @@ +using System.Buffers.Binary; +using System.Text.Json; +using GameLibrary.Application.Catalog; +using GameLibrary.Contracts; +using GameLibrary.Domain.Catalog; +using GameLibrary.Domain.Detection; +using GameLibrary.Domain.Paths; +using GameLibrary.Domain.States; +using GameLibrary.Host.Hosting; +using GameLibrary.Host.Scanning; +using GameLibrary.Infrastructure.Persistence; +using GameLibrary.Infrastructure.Scanning; +using Xunit; + +namespace GameLibrary.IntegrationTests.Scanning; + +public sealed class ScanBoundaryRegressionTests : IDisposable +{ + private readonly string _root = Path.Combine(AppContext.BaseDirectory, "scan-boundary-" + Guid.NewGuid().ToString("N")); + + private string Write(string relative, byte[]? bytes = null) + { + var path = Path.Combine(_root, relative); + Directory.CreateDirectory(Path.GetDirectoryName(path)!); + File.WriteAllBytes(path, bytes ?? [0]); + return path; + } + + private static byte[] EmbeddedGodot() + { + var bytes = new byte[92]; + "GDPC"u8.CopyTo(bytes.AsSpan(16)); + BinaryPrimitives.WriteUInt32LittleEndian(bytes.AsSpan(20), 3); + BinaryPrimitives.WriteUInt32LittleEndian(bytes.AsSpan(24), 4); + BinaryPrimitives.WriteUInt64LittleEndian(bytes.AsSpan(80), 64); + "GDPC"u8.CopyTo(bytes.AsSpan(88)); + return bytes; + } + + [Fact] + public void DriveRootWithEmbeddedGodotFiles_KeepsFileEvidenceAndDiscoversChildGames() + { + Write("Standalone.exe", EmbeddedGodot()); + Write("Second.exe", EmbeddedGodot()); + var root = GamePath.Create(Path.GetPathRoot(_root)!); + var collector = new ScanCandidateCollector(root, "drive-fixture", new()); + var snapshot = new MappedSnapshot(root.PhysicalPath, new FileSystemDirectorySnapshot(GamePath.Create(_root))); + collector.InspectDirectory(new(root.PhysicalPath, 0, [], []), CancellationToken.None, snapshot); + Assert.True(collector.ShouldDescend(root.PhysicalPath)); + Assert.Equal(2, collector.Candidates.Count); + Assert.All(collector.Candidates, candidate => + { + Assert.Equal(CandidateKind.FileGame, candidate.Kind); + Assert.Equal(EngineId.Godot, Assert.Single(candidate.Engines).Engine); + var json = JsonSerializer.SerializeToElement(candidate.ToDetail(), ContractJson.Options); + Assert.Equal("godot", json.GetProperty("engines")[0].GetProperty("engine").GetString()); + }); + var child = Path.Combine(_root, "NewGame"); + Write("NewGame/Game.exe"); + Write("NewGame/UnityPlayer.dll"); + Write("NewGame/Game_Data/globalgamemanagers"); + collector.InspectDirectory(new(child, 1, Directory.GetDirectories(child), Directory.GetFiles(child)), CancellationToken.None); + Assert.Contains(collector.Candidates, candidate => candidate.PhysicalPath == child + && candidate.Engines.Any(engine => engine.Engine == EngineId.Unity)); + Assert.DoesNotContain(collector.Candidates, candidate => candidate.PhysicalPath == root.PhysicalPath); + } + + [Theory] + [InlineData("pendingReview", false, "deferred")] + [InlineData("pendingReview", true, "pendingReview")] + [InlineData("accepted", true, "accepted")] + [InlineData("ignored", false, "ignored")] + [InlineData("deferred", false, "deferred")] + public async Task InspectedDriveRoot_RetiresOnlyUnboundPending_AndSynchronizesNotifications( + string state, bool bound, string expectedState) + { + Directory.CreateDirectory(_root); + var opened = await SqliteLibraryStore.InitializeAsync(Path.Combine(_root, "db"), + new() { AppVersion = "test", ApiVersion = "1" }, CancellationToken.None); + await using var store = opened.Store!; + var drive = GamePath.Create(Path.GetPathRoot(_root)!); + var now = DateTime.UtcNow; + store.UpsertCandidate(new() + { + CandidateId = "legacy-drive", Kind = "gameRoot", PhysicalPath = drive.PhysicalPath, + RelativePath = "", PayloadJson = "{\"engines\":[{\"engine\":\"godot\"}],\"preserved\":true}", + ReviewState = bound ? "pendingReview" : state, ObservedUtc = now, UpdatedUtc = now, + }); + if (bound) + { + var current = store.TryGetCandidate("legacy-drive")!; + var accepted = store.AcceptCandidate(current.CandidateId, current.Revision, new GameCard + { + GameId = "existing-game", Title = "fixture", RootPath = drive.PhysicalPath, + Kind = "gameRoot", Membership = "active", AcceptedUtc = now, UpdatedUtc = now, + }, "godot", now); + Assert.Equal("existing-game", accepted.GameId); + if (state != "accepted") + store.TransitionCandidate(current.CandidateId, "accepted", state, accepted.Candidate.Revision, "existing-game", now); + } + store.EnsureCandidateBatch(now); + var collector = new ScanCandidateCollector(drive, "repair", new()); + // No access to the real volume: all observations are routed to the isolated fixture. + collector.InspectDirectory(new(drive.PhysicalPath, 0, [], []), CancellationToken.None, + new MappedSnapshot(drive.PhysicalPath, new FileSystemDirectorySnapshot(GamePath.Create(_root), [], []))); + ScanCandidatePersistence.Persist(store, null, collector, "repair", readyForReview: true); + var result = store.TryGetCandidate("legacy-drive")!; + Assert.Equal(expectedState, result.ReviewState); + Assert.Contains("preserved", result.PayloadJson); + Assert.Equal(bound ? "existing-game" : null, result.GameId); + var revision = result.Revision; + ScanCandidatePersistence.Persist(store, null, collector, "repair-again", readyForReview: true); + Assert.Equal(revision, store.TryGetCandidate("legacy-drive")!.Revision); + if (expectedState != "pendingReview") Assert.Empty(store.ListNotifications("pending")); + } + + [Fact] + public void AutomaticDiscovery_IgnoresShortcutFiles_ButKeepsExecutableAndChildProjects() + { + Write("Play.lnk"); + Write("Game.exe"); + Write("Child/Child.exe"); + var collector = new ScanCandidateCollector(GamePath.Create(_root), "shortcut-scan", new()); + ScanJobRunner.Run(GamePath.Create(_root), new() { JobId = "shortcut-scan", Token = CancellationToken.None }, collector); + Assert.DoesNotContain(collector.Candidates, candidate => candidate.EntryCandidates.Any(entry => entry.RelativePath.EndsWith(".lnk"))); + Assert.Contains(collector.Candidates, candidate => candidate.PhysicalPath == Path.Combine(_root, "Game.exe")); + Assert.Contains(collector.Candidates, candidate => candidate.PhysicalPath == Path.Combine(_root, "Child")); + } + + [Fact] + public void ShortcutIdentity_RequiresVerifiedEntryOrUniquePackagedUnrealProject_NotNamesOrAncestors() + { + var wrapper = Write("Install/Sample.exe"); + var shipping = Write("Install/Sample/Binaries/Win64/Sample-Win64-Shipping.exe"); + Write("Install/Sample/Content/Paks/Sample.pak"); + Directory.CreateDirectory(Path.Combine(_root, "Install/Engine")); + var game = new GameCard + { + GameId = "shortcut", Title = "same title", RootPath = Path.Combine(_root, "Install/Play.lnk"), + Kind = "manualShortcut", EntryPath = shipping, Membership = "active", + AcceptedUtc = DateTime.UtcNow, UpdatedUtc = DateTime.UtcNow, + }; + Assert.Equal(game.GameId, Assert.Single(new ShortcutGameIdentity([game]).FindMatches([wrapper])).GameId); + var other = Write("Other/Sample.exe"); + Assert.Empty(new ShortcutGameIdentity([game]).FindMatches([other])); + var unrelated = Write("Install/Other.exe"); + Assert.Empty(new ShortcutGameIdentity([game]).FindMatches([unrelated])); + // A second project/entry makes the wrapper relationship ambiguous. + Assert.Empty(new ShortcutGameIdentity([game]).FindMatches([wrapper])); + } + + public void Dispose() + { + if (Directory.Exists(_root)) Directory.Delete(_root, recursive: true); + } + + private sealed class MappedSnapshot(string root, IDirectorySnapshot inner) : IDirectorySnapshot + { + public string RootPhysicalPath => root; + public bool DirectoryExists(string path) => inner.DirectoryExists(path); + public bool FileExists(string path) => inner.FileExists(path); + public long? FileSize(string path) => inner.FileSize(path); + public IReadOnlyList ListDirectories(string path) => inner.ListDirectories(path); + public IReadOnlyList ListFiles(string path) => inner.ListFiles(path); + public FileProbe TryReadFirstBytes(string path, int count) => inner.TryReadFirstBytes(path, count); + public FileProbe TryReadBytesAt(string path, long offset, int count) => inner.TryReadBytesAt(path, offset, count); + public ExecutableIdentity? ReadExecutableIdentity(string path) => inner.ReadExecutableIdentity(path); + } +} diff --git a/tests/GameLibrary.IntegrationTests/Scanning/ScanOperationTests.cs b/tests/GameLibrary.IntegrationTests/Scanning/ScanOperationTests.cs index 2bb69ce..a52c7ad 100644 --- a/tests/GameLibrary.IntegrationTests/Scanning/ScanOperationTests.cs +++ b/tests/GameLibrary.IntegrationTests/Scanning/ScanOperationTests.cs @@ -38,6 +38,58 @@ private async Task> InvokeAsync(string operationId, object private Task> EnsureRootAsync() => InvokeAsync("roots.add", new { root = @"D:\Official\GameLibrary\artifacts\test-runs" }); + [Theory] + [InlineData(false)] + [InlineData(true)] + public async Task Rescan_ExactIgnoredCollectionDiscoversNewUnityGames_WithoutRemovingIgnore(bool scanCollectionRoot) + { + var root = CreateFixtureTree("scanop-exact-rescan"); + var collection = Path.Combine(root, "[Unity]"); + Directory.CreateDirectory(collection); + File.WriteAllText(Path.Combine(collection, "Game.exe"), "fixture"); + File.WriteAllText(Path.Combine(collection, "data.xp3"), "fixture"); + await EnsureRootAsync(); + var scanRoot = scanCollectionRoot ? collection : root; + var first = await InvokeAsync("scan.start", new { root = scanRoot, idempotencyKey = Guid.NewGuid().ToString("N") }); + Assert.True(first.Ok, first.Error?.Message); + await WaitForJobAsync(first.JobId!, "succeeded"); + var before = await InvokeAsync("candidates.list", new { jobId = first.JobId }); + var parent = before.Data.GetProperty("items").EnumerateArray() + .Single(item => item.GetProperty("physicalPath").GetString() == collection); + var ignored = await InvokeAsync("ignores.create", new + { + scope = "ExactPath", path = collection, idempotencyKey = Guid.NewGuid().ToString("N"), + }); + Assert.True(ignored.Ok, ignored.Error?.Message); + var newGames = new[] { "New Game", "新しいゲーム" }; + foreach (var name in newGames) + { + var path = Path.Combine(collection, name); + Directory.CreateDirectory(Path.Combine(path, name + "_Data")); + File.WriteAllText(Path.Combine(path, name + ".exe"), "fixture"); + File.WriteAllText(Path.Combine(path, "UnityPlayer.dll"), "fixture"); + File.WriteAllText(Path.Combine(path, name + "_Data", "globalgamemanagers"), "fixture"); + } + var rescan = await InvokeAsync("scan.start", new { root = scanRoot, idempotencyKey = Guid.NewGuid().ToString("N") }); + Assert.True(rescan.Ok, rescan.Error?.Message); + Assert.NotEqual(first.JobId, rescan.JobId); + await WaitForJobAsync(rescan.JobId!, "succeeded"); + var after = await InvokeAsync("candidates.list", new { jobId = rescan.JobId, state = "pendingReview" }); + foreach (var name in newGames) + { + var item = after.Data.GetProperty("items").EnumerateArray() + .Single(item => item.GetProperty("physicalPath").GetString() == Path.Combine(collection, name)); + Assert.Equal("gameRoot", item.GetProperty("kind").GetString()); + var detail = await InvokeAsync("candidates.get", new { candidateId = item.GetProperty("candidateId").GetString() }); + Assert.Equal("unity", detail.Data.GetProperty("detail").GetProperty("engines")[0].GetProperty("engine").GetString()); + } + var parentAfter = await InvokeAsync("candidates.get", new { candidateId = parent.GetProperty("candidateId").GetString() }); + Assert.Equal("ignored", parentAfter.Data.GetProperty("reviewState").GetString()); + var rules = await InvokeAsync("ignores.list", new { }); + Assert.Contains(rules.Data.GetProperty("items").EnumerateArray(), + rule => rule.GetProperty("ignoreId").GetString() == ignored.Data.GetProperty("ignoreId").GetString()); + } + [Fact] public async Task ScanStart_AcceptsJobAndCompletesWithCoverage() { diff --git a/tests/GameLibrary.UnitTests/Scan/ScanRuleSetTests.cs b/tests/GameLibrary.UnitTests/Scan/ScanRuleSetTests.cs index e23ae08..2585a3a 100644 --- a/tests/GameLibrary.UnitTests/Scan/ScanRuleSetTests.cs +++ b/tests/GameLibrary.UnitTests/Scan/ScanRuleSetTests.cs @@ -8,6 +8,28 @@ public sealed class ScanRuleSetTests { private static GamePath Path(string p) => GamePath.Create(p); + [Theory] + [InlineData(ScanRuleSource.User, false, false)] + [InlineData(ScanRuleSource.User, true, true)] + [InlineData(ScanRuleSource.SystemMandatory, false, true)] + [InlineData(ScanRuleSource.SystemDefault, false, true)] + public void ExclusionScope_OnlyUserExactPathPreservesDescendants( + ScanRuleSource source, bool subtree, bool excludeDescendants) + { + const string parent = @"F:\[Unity]"; + var rules = new ScanRuleSet([new ScanRule + { + RuleId = "scope", Source = source, Action = ScanRuleAction.Exclude, + Matcher = subtree ? new SubtreeMatcher(parent) : new ExactPathMatcher(Path(parent).ComparisonKey), + }]); + var decision = rules.Decide(Path(parent)); + Assert.Equal(ScanRuleOutcome.Exclude, decision.Outcome); + Assert.Equal(excludeDescendants, decision.ExcludeDescendants); + Assert.Equal(subtree ? ScanRuleOutcome.Exclude : ScanRuleOutcome.Continue, + rules.Decide(Path(parent + @"\New Game")).Outcome); + Assert.NotEqual(decision, decision with { ExcludeDescendants = !excludeDescendants }); + } + [Fact] public void EmptyRuleSet_ContinuesByDefault() { From 0b4e2618759acac01e824cbc2cb75e8f126f7456 Mon Sep 17 00:00:00 2001 From: AaronSu Date: Fri, 30 Oct 2026 08:42:10 +0800 Subject: [PATCH 05/29] fix(scan): gate legacy retirement by current root registration --- .../Hosting/CandidateReviewHandler.cs | 5 +++- .../Scanning/ScanCandidatePersistence.cs | 6 +++-- .../Scanning/ScanBoundaryRegressionTests.cs | 25 +++++++++++++++++++ 3 files changed, 33 insertions(+), 3 deletions(-) diff --git a/src/GameLibrary.Host/Hosting/CandidateReviewHandler.cs b/src/GameLibrary.Host/Hosting/CandidateReviewHandler.cs index ba31fee..c0e0820 100644 --- a/src/GameLibrary.Host/Hosting/CandidateReviewHandler.cs +++ b/src/GameLibrary.Host/Hosting/CandidateReviewHandler.cs @@ -29,6 +29,7 @@ public Envelope CandidateReview(IpcRequest request, string action) } var service = new CandidateReviewService(store, new CatalogFiles()); var prepared = service.Prepare(candidateId, revision.Value, action); + if (prepared.Error is not null || action != "accept") return ToEnvelope(request, store, service.Apply(prepared)); return ToEnvelope(request, store, store.InTransaction(() => ApplyReview(service, prepared, new ShortcutGameIdentity(store.ListGames().Where(game => game.Kind == "manualShortcut").ToArray())))); } @@ -61,7 +62,8 @@ public Envelope ReviewBatch(IpcRequest request) var flashService = new FlashCandidateReviewService(store, new CatalogFiles()); var results = store.InTransaction(() => { - var games = new ShortcutGameIdentity(store.ListGames().Where(game => game.Kind == "manualShortcut").ToArray()); + var games = new ShortcutGameIdentity(action == "accept" + ? store.ListGames().Where(game => game.Kind == "manualShortcut").ToArray() : []); return inputs.Select((item, index) => store.InReviewSavepoint(() => item.Flash is null ? ApplyReview(service, prepared[index], games) : flashService.Review(item.Id, item.Revision, item.Flash))).ToArray(); @@ -85,6 +87,7 @@ private static CandidateReviewOutcome ApplyReview(CandidateReviewService service PreparedReview prepared, ShortcutGameIdentity games) { if (prepared.Error is null && prepared.Action == "accept" && prepared.Candidate?.GameId is null + && prepared.ExpectedRevision == prepared.Candidate?.Revision && prepared.Game?.EntryPath is { } entry && games.FindMatches([entry]).Count > 0) return new(prepared.CandidateId, ErrorCode: ErrorCodes.InvalidArgument, diff --git a/src/GameLibrary.Host/Scanning/ScanCandidatePersistence.cs b/src/GameLibrary.Host/Scanning/ScanCandidatePersistence.cs index 564d217..e14e2ba 100644 --- a/src/GameLibrary.Host/Scanning/ScanCandidatePersistence.cs +++ b/src/GameLibrary.Host/Scanning/ScanCandidatePersistence.cs @@ -45,7 +45,10 @@ public static void Persist( .ToLookup(game => game.RootPath, StringComparer.OrdinalIgnoreCase); var candidateLookup = store.ListCandidates().ToLookup(item => item.PhysicalPath, StringComparer.OrdinalIgnoreCase); var storedFlashDirectories = new HashSet(StringComparer.OrdinalIgnoreCase); - foreach (var path in collector.InspectedDriveRoots) + var roots = requireRegisteredRoot ? store.ReadRoots() : []; + foreach (var path in collector.InspectedDriveRoots.Where(path => !requireRegisteredRoot + || roots.Any(root => root.Kind == "library" && RuntimeStateStore.ContainsPath(root.PhysicalPath, path)) + && !roots.Any(root => root.Kind == "manual" && RuntimeStateStore.ContainsPath(root.PhysicalPath, path)))) foreach (var prior in candidateLookup[path].Where(item => item.ReviewState == "pendingReview" && item.GameId is null)) { var current = store.TryGetCandidate(prior.CandidateId); @@ -151,7 +154,6 @@ public static void Persist( } } - var roots = requireRegisteredRoot ? store.ReadRoots() : []; foreach (var group in collector.FlashGroups.Where(group => group.Complete && (storedFlashDirectories.Contains(group.DirectoryPath) || !group.RequiresReview && group.Kind == "resources"))) { diff --git a/tests/GameLibrary.IntegrationTests/Scanning/ScanBoundaryRegressionTests.cs b/tests/GameLibrary.IntegrationTests/Scanning/ScanBoundaryRegressionTests.cs index 6738f6e..0a6b3c0 100644 --- a/tests/GameLibrary.IntegrationTests/Scanning/ScanBoundaryRegressionTests.cs +++ b/tests/GameLibrary.IntegrationTests/Scanning/ScanBoundaryRegressionTests.cs @@ -127,6 +127,31 @@ public void AutomaticDiscovery_IgnoresShortcutFiles_ButKeepsExecutableAndChildPr Assert.Contains(collector.Candidates, candidate => candidate.PhysicalPath == Path.Combine(_root, "Child")); } + [Theory] + [InlineData(null, "pendingReview")] + [InlineData("manual", "pendingReview")] + [InlineData("library", "deferred")] + public async Task DriveRootRetirement_RequiresCurrentRegisteredLibraryScope(string? rootKind, string expectedState) + { + Directory.CreateDirectory(_root); + var opened = await SqliteLibraryStore.InitializeAsync(Path.Combine(_root, "db"), + new() { AppVersion = "test", ApiVersion = "1" }, CancellationToken.None); + await using var store = opened.Store!; + var drive = GamePath.Create(Path.GetPathRoot(_root)!); + var now = DateTime.UtcNow; + if (rootKind is not null) store.UpsertRoot(new("root", drive.PhysicalPath, 1, now, rootKind), now); + store.UpsertCandidate(new() + { + CandidateId = "legacy", Kind = "gameRoot", PhysicalPath = drive.PhysicalPath, + RelativePath = "", PayloadJson = "{}", ReviewState = "pendingReview", ObservedUtc = now, UpdatedUtc = now, + }); + var collector = new ScanCandidateCollector(drive, "scope", new()); + collector.InspectDirectory(new(drive.PhysicalPath, 0, [], []), CancellationToken.None, + new MappedSnapshot(drive.PhysicalPath, new FileSystemDirectorySnapshot(GamePath.Create(_root), [], []))); + ScanCandidatePersistence.Persist(store, null, collector, "scope", readyForReview: true, requireRegisteredRoot: true); + Assert.Equal(expectedState, store.TryGetCandidate("legacy")!.ReviewState); + } + [Fact] public void ShortcutIdentity_RequiresVerifiedEntryOrUniquePackagedUnrealProject_NotNamesOrAncestors() { From 687bb4d106d9eca168b4a1bf22a98199aac96a2a Mon Sep 17 00:00:00 2001 From: AaronSu Date: Fri, 30 Oct 2026 08:58:05 +0800 Subject: [PATCH 06/29] fix(scan): retain extension-like directories and reject truncated identity proof --- .../Catalog/CandidateReviewService.cs | 2 +- .../Scanning/ShortcutGameIdentity.cs | 5 ++++- .../Scanning/ScanBoundaryRegressionTests.cs | 17 ++++++++++++++++- 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/src/GameLibrary.Application/Catalog/CandidateReviewService.cs b/src/GameLibrary.Application/Catalog/CandidateReviewService.cs index abd33b4..dbbb272 100644 --- a/src/GameLibrary.Application/Catalog/CandidateReviewService.cs +++ b/src/GameLibrary.Application/Catalog/CandidateReviewService.cs @@ -38,7 +38,7 @@ public PreparedReview Prepare(string candidateId, int revision, string action) if (candidate is null) error = new(candidateId, ErrorCode: "NotFound", ErrorMessage: $"候选不存在:{candidateId}"); else if (action == "accept" && candidate.ReviewState != "accepted" && (GameLibrary.Domain.Paths.GamePath.TryCreate(candidate.PhysicalPath).Path?.IsDriveRoot == true - || candidate.PhysicalPath.EndsWith(".lnk", StringComparison.OrdinalIgnoreCase))) + || candidate.Kind == "fileGame" && candidate.PhysicalPath.EndsWith(".lnk", StringComparison.OrdinalIgnoreCase))) error = new(candidateId, ErrorCode: "InvalidArgument", ErrorMessage: "磁盘根目录不能作为游戏入库;快捷方式请通过手动添加导入。请重新扫描真实游戏位置"); else if (action == "accept" && !files.Exists(candidate.PhysicalPath)) diff --git a/src/GameLibrary.Host/Scanning/ShortcutGameIdentity.cs b/src/GameLibrary.Host/Scanning/ShortcutGameIdentity.cs index 860d84e..5b082f8 100644 --- a/src/GameLibrary.Host/Scanning/ShortcutGameIdentity.cs +++ b/src/GameLibrary.Host/Scanning/ShortcutGameIdentity.cs @@ -78,8 +78,11 @@ private static bool IsSafeFile(string path) if (!IsSafeFile(wrapper)) return null; try { + var snapshot = new FileSystemDirectorySnapshot(GamePath.Create(root)); + // 检测器最多检查 32 个直属目录;截断的观察不能用来证明项目唯一。 + if (snapshot.ListDirectories("").Count > 32) return null; var report = new AdditionalEngineDetector(EngineId.Unreal) - .Detect(new FileSystemDirectorySnapshot(GamePath.Create(root))); + .Detect(snapshot); return report is { EntryCandidates.Count: 1 } && report.Evidence.Any(e => e.RuleId == "unreal.packaged-project" && string.Equals(e.RelativePath, projectName + "/Content/Paks", StringComparison.OrdinalIgnoreCase)) diff --git a/tests/GameLibrary.IntegrationTests/Scanning/ScanBoundaryRegressionTests.cs b/tests/GameLibrary.IntegrationTests/Scanning/ScanBoundaryRegressionTests.cs index 0a6b3c0..4943b45 100644 --- a/tests/GameLibrary.IntegrationTests/Scanning/ScanBoundaryRegressionTests.cs +++ b/tests/GameLibrary.IntegrationTests/Scanning/ScanBoundaryRegressionTests.cs @@ -9,6 +9,7 @@ using GameLibrary.Host.Hosting; using GameLibrary.Host.Scanning; using GameLibrary.Infrastructure.Persistence; +using GameLibrary.Infrastructure.Catalog; using GameLibrary.Infrastructure.Scanning; using Xunit; @@ -115,16 +116,27 @@ public async Task InspectedDriveRoot_RetiresOnlyUnboundPending_AndSynchronizesNo } [Fact] - public void AutomaticDiscovery_IgnoresShortcutFiles_ButKeepsExecutableAndChildProjects() + public async Task AutomaticDiscovery_IgnoresShortcutFiles_ButKeepsExecutableAndChildProjects() { Write("Play.lnk"); Write("Game.exe"); Write("Child/Child.exe"); + Write("Folder.lnk/Game.exe"); + Write("Folder.lnk/data.xp3"); var collector = new ScanCandidateCollector(GamePath.Create(_root), "shortcut-scan", new()); ScanJobRunner.Run(GamePath.Create(_root), new() { JobId = "shortcut-scan", Token = CancellationToken.None }, collector); Assert.DoesNotContain(collector.Candidates, candidate => candidate.EntryCandidates.Any(entry => entry.RelativePath.EndsWith(".lnk"))); Assert.Contains(collector.Candidates, candidate => candidate.PhysicalPath == Path.Combine(_root, "Game.exe")); Assert.Contains(collector.Candidates, candidate => candidate.PhysicalPath == Path.Combine(_root, "Child")); + var opened = await SqliteLibraryStore.InitializeAsync(Path.Combine(_root, "db"), + new() { AppVersion = "test", ApiVersion = "1" }, CancellationToken.None); + await using var store = opened.Store!; + ScanCandidatePersistence.Persist(store, null, collector, "shortcut-scan", readyForReview: true); + var directory = Assert.Single(store.ListCandidates(), candidate => candidate.PhysicalPath == Path.Combine(_root, "Folder.lnk")); + var service = new CandidateReviewService(store, new CatalogFiles()); + var prepared = service.Prepare(directory.CandidateId, directory.Revision, "accept"); + Assert.Null(prepared.Error); + Assert.Null(service.Apply(prepared).ErrorCode); } [Theory] @@ -172,6 +184,9 @@ public void ShortcutIdentity_RequiresVerifiedEntryOrUniquePackagedUnrealProject_ Assert.Empty(new ShortcutGameIdentity([game]).FindMatches([unrelated])); // A second project/entry makes the wrapper relationship ambiguous. Assert.Empty(new ShortcutGameIdentity([game]).FindMatches([wrapper])); + File.Delete(unrelated); + for (var index = 0; index < 33; index++) Directory.CreateDirectory(Path.Combine(_root, "Install", "extra-" + index)); + Assert.Empty(new ShortcutGameIdentity([game]).FindMatches([wrapper])); } public void Dispose() From 647a7ae2dab2bb156417a0305f59110318b805a2 Mon Sep 17 00:00:00 2001 From: AaronSu Date: Fri, 30 Oct 2026 14:12:38 +0800 Subject: [PATCH 07/29] docs: record v1.8.1 scan validation and safe duplicate cleanup --- docs/code-review-graph/README.md | 2 +- .../scan-boundaries-v1.8.1.md | 4 +- .../v1.8.1-scan-boundaries-plan.md | 4 ++ .../v1.8.1-scan-boundaries-validation.md | 51 +++++++++++++++++++ 4 files changed, 58 insertions(+), 3 deletions(-) create mode 100644 docs/development/v1.8.1-scan-boundaries-validation.md diff --git a/docs/code-review-graph/README.md b/docs/code-review-graph/README.md index 14dbb9d..6ffbe85 100644 --- a/docs/code-review-graph/README.md +++ b/docs/code-review-graph/README.md @@ -1,6 +1,6 @@ # GameLibrary 代码预览框架 -2026-10-30 v1.8.1 扫描补丁:盘根独立文件、ExactPath 后代遍历、LNK 去重及待确认计数。修改前查询共享扫描路径的影响上下文;修改后以 minimal 模式重建,431 文件、4,316 节点、42,388 边,解析错误 0。专项集成 83、单元 36、Sidebar 3 项及前端 typecheck 通过;Go 独立复审与真实库重复记录处理尚待完成。见[本轮结构记录](scan-boundaries-v1.8.1.md)及[已批准计划](../development/v1.8.1-scan-boundaries-plan.md)。未打包、推送或发布。 +2026-10-30 v1.8.1 扫描补丁:盘根独立文件、ExactPath 后代遍历、LNK 去重及待确认计数。修改前查询共享扫描路径的影响上下文;在最终源码 `687bb4d` 上以 minimal 模式重建,433 文件、4,343 节点、42,636 边,解析错误 0。分轮去重 135 项 .NET、3 项 Sidebar 及前端 typecheck 通过。按用户后续要求由 Codex 完成复核;真实库一致性备份后仅移出 1 张已证实的重复快捷方式卡,文件与元数据保留。见[本轮结构记录](scan-boundaries-v1.8.1.md)、[验证记录](../development/v1.8.1-scan-boundaries-validation.md)及[已批准计划](../development/v1.8.1-scan-boundaries-plan.md)。未打包、推送或发布。 2026-10-26 网站 v1.5.0:下载与四语言宣传内容同步产品 v1.8.0,新增真实浅深色游戏库及标签截图,缩略图和放大图复用网页 `.dark` 主题切换。修改前已做影响分析,修改后增量解析 6 个文件,错误为空,并执行图谱变更分析。实际执行范围为素材采集、转换、源码审阅与图谱同步;网站测试、构建及浏览器验收未运行,未推送或部署。见[网站实施记录](website.md)和[截图来源](../../website/design/2026-10-26-screenshots.md)。 diff --git a/docs/code-review-graph/scan-boundaries-v1.8.1.md b/docs/code-review-graph/scan-boundaries-v1.8.1.md index 80c1a63..0c671c7 100644 --- a/docs/code-review-graph/scan-boundaries-v1.8.1.md +++ b/docs/code-review-graph/scan-boundaries-v1.8.1.md @@ -27,8 +27,8 @@ flowchart TD ## 图谱与验证 -2026-10-30 调用 code-review-graph 修改前影响上下文;本隔离工作区重建 `minimal` 图谱:431 文件、4,316 节点、42,388 边,解析错误为空;未计算云端 embedding。 +2026-10-30 调用 code-review-graph 修改前影响上下文;本隔离工作区最终在源码 `687bb4d` 重建 `minimal` 图谱:433 文件、4,343 节点、42,636 边,解析错误为空,构建时 HEAD 与图谱基线一致;未计算云端 embedding。 已运行且通过:83 项专项集成回归(Walker/扫描/候选/Flash/手动导入/MCP null)、36 项规则与引擎检测单元回归、3 项 Sidebar 回归、前端 typecheck。新增手动导入顺序用例修改后再次执行,2 项通过。初轮曾因新增夹具漏填必填时间字段和错误预设 UpsertCandidate 绑定 gameId 失败,已改用真实接受流程修正;前端断言曾错误假设 accessible name 含空格,已匹配真实 DOM。 -Go 复审与本地重复记录的安全移出仍待完成。未运行真实游戏、付费翻译 API、全量测试、安装/升级验收;未打包、推送、发布或修改版本字段。 +补充注册范围、审核及目录边界回归后,分轮去重 135 项 .NET(99 集成、36 单元)通过,Sidebar 3 项及 typecheck 通过。按用户后续要求由 Codex 完成最终复核,未将中断的 Go 审查记为通过;本地一致性备份后仅移出 1 张已证实的重复快捷方式卡,保留原文件和历史元数据。详细失败轮次、验证与集成边界见[实施记录](../development/v1.8.1-scan-boundaries-validation.md)。未运行真实游戏、付费翻译 API、全量测试、安装/升级验收;未打包、推送、发布或修改版本字段。 diff --git a/docs/development/v1.8.1-scan-boundaries-plan.md b/docs/development/v1.8.1-scan-boundaries-plan.md index e9f6746..597c148 100644 --- a/docs/development/v1.8.1-scan-boundaries-plan.md +++ b/docs/development/v1.8.1-scan-boundaries-plan.md @@ -41,3 +41,7 @@ T2/T3 可并行;最多两个 worker,仅一个 Go 云端只读审查,无 GP 权限/工具不可用、备份失败、记录 revision 或身份变化、重复关系无法确定时停止相关步骤。真实库操作只能使用既有一致性备份与 `games.remove(deleteFiles:false,expectedRevision)`,不直接写 SQL,不恢复整库覆盖后续用户操作。无真实游戏启动、翻译 API 调用、打包、安装、远端推送或 Release。 交付独立本地提交、真实专项验证结果、graph 文档更新和给 v1.8.1 集成负责人的说明。未验证项目明确保留。 + +## 执行阶段调整 + +用户后续明确要求“接下来不要调用dsh了,你自己执行后续操作就行”。据此 T2 改由 Codex 自行完成源码复核,不再依赖 Go 结论;T4 在 Codex 复核与专项回归完成后执行。未扩大数据操作范围、未追加远端推送或发布授权。 diff --git a/docs/development/v1.8.1-scan-boundaries-validation.md b/docs/development/v1.8.1-scan-boundaries-validation.md new file mode 100644 index 0000000..9bc5748 --- /dev/null +++ b/docs/development/v1.8.1-scan-boundaries-validation.md @@ -0,0 +1,51 @@ +# SCAN-181-r1 实施与验证 + +基线 `aefdb9508295568e7500ba2e4fa8d0630a5ef07e`;源码提交依次为 `a73d412`、`0b4e261`、`687bb4d`;分支 `codex/fix-scan-boundaries-v1.8.1`。集成时按此顺序应用,后续文档提交不改变业务实现。 + +## 根因与结果 + +1. 盘根的 Godot 内嵌 PCK 识别正确,但候选编排把盘根当作 GameRoot,随后 `ShouldDescend` 剪掉整个盘。盘根现按独立文件产生候选,仍遍历子安装目录;普通安装根与 Flash 审核边界保留。 +2. ExactPath 与 Subtree 原先都在 Walker 中剪枝。移植旧 `45bfbff` 的共享规则/Walker 修复及专项回归,未带入旧版本字段。根目录、嵌套目录和续扫均保留精确忽略目录的后代。 +3. 待确认徽标叠加候选数与包含同一候选的通知数。改为仅显示候选 total,分页不改变总数。 +4. LNK 与目录使用不同 RootPath,原有仅按 RootPath 的检查不能防重复。自动扫描不再发现 LNK;手动导入、扫描落库和候选接受复用保守入口索引。唯一 Unreal 打包结构才能建立 wrapper/Shipping 对应关系;同名、祖先路径或歧义不会合并记录。 +5. 旧错误盘根仅在本轮实际读取、仍属注册 library 扫描范围、pendingReview 且无 gameId 绑定时转为 deferred;保留 ID/payload,事务后刷新通知。accepted、绑定游戏、用户忽略/暂缓和离线未观察分支保留。 + +## 已授权且真实执行的验证 + +在隔离 fixture 分轮执行,按 TRX testName 去重:**135 项 .NET 用例通过(99 集成、36 单元)**,另有 **3 项 Sidebar 前端用例通过**。前端 `npm run typecheck` 与 `git diff --check` 通过。相关 .NET Debug 编译随专项测试完成。 + +| 记录 | 当轮结果 | 范围 | +| --- | --- | --- | +| scan-boundaries.trx | 83/83 | Walker、扫描操作、忽略、候选编排、Flash 目录/旧数据、MCP null、手动导入 | +| scan-rules.trx | 36/36 | ScanRuleSetTests、AdditionalEngineTests | +| shortcut-order.trx | 2/2 | 手动快捷方式/目录两个顺序,先扫描再添加快捷方式后接受的防重复 | +| scan-guard-review.trx | 33/33 | 盘根、当前注册范围、候选审核及手动导入;与前几轮有重叠 | +| Sidebar.test.tsx | 3/3 | 徽标 0/1/分页 total 与既有导航 | + +新增测试的首次编译因夹具漏填 GameCard 必填时间字段及 xUnit 分析器提示失败;修正后继续。首轮集成的两个绑定保护用例暴露夹具错误:UpsertCandidate 不写 gameId,已改用真实 AcceptCandidate 建立绑定。首轮前端断言错误预设可访问名称含空格,已按真实 DOM 修正。上述修正均已重跑,不将失败轮次记为通过。 + +复跑示例: + +```powershell +dotnet test tests/GameLibrary.UnitTests/GameLibrary.UnitTests.csproj --filter "FullyQualifiedName~ScanRuleSetTests|FullyQualifiedName~AdditionalEngineTests" +dotnet test tests/GameLibrary.IntegrationTests/GameLibrary.IntegrationTests.csproj --filter "FullyQualifiedName~ScanBoundaryRegressionTests|FullyQualifiedName~DirectoryWalkerTests|FullyQualifiedName~ScanIgnoreRuleTests|FullyQualifiedName~ScanOperationTests|FullyQualifiedName~CandidateOrchestrationTests|FullyQualifiedName~FlashDirectoryReviewTests|FullyQualifiedName~FlashLegacyRegroupTests|FullyQualifiedName~CandidateReviewTests|FullyQualifiedName~ManualGameTests" +# 在 src/GameLibrary.Tauri 下: +npm test -- src/components/Sidebar.test.tsx --cache=false +npm run typecheck +``` + +## 独立复审与真实库处理 + +- Go 首轮只读复审因 Connection error 中断,没有返回结论。检查确认工作树无改动、旧 worker 进程退出;经用户确认解除占用后恢复。用户随后要求不再调用 DSH,最终审查改由 Codex 完成,未将 Go 结果记为通过。仅必要源码/匿名 fixture 曾交给该审查,无真实库、游戏数据、配置、日志或密钥上传,无 GPU 或自动余额回退。 +- Codex 自行复核了规则/遍历/盘根编排/候选落库/单项与批量接受/手动添加/通知刷新;补上 `.lnk` 后缀真实目录的接受保护,以及 Unreal 32 目录观察预算不得作为唯一性证明的保护。相关 33 项专项回归再次通过。静态复核未发现剩余阻塞问题,不代替真实扫描与 UI 验收。 +- 本地只读复核已确认一对快捷方式/本体记录及唯一 Unreal 项目关系;不在本文发布个人游戏路径或数据库记录。 +- 真实库一致性备份作业 succeeded,清单包含 550 个文件。再次确认记录 revision 与身份后,通过 games.remove(deleteFiles:false,expectedRevision) 仅移出 1 张快捷方式卡;接口返回 filesDeleted=false、recycled=false。 +- 将两条记录与备份逐字段只读比较:保留的本体卡完全不变;快捷方式卡仅 membership/revision/updated_utc 改变,其余元数据保留。快捷方式原文件和两个 EXE 仍存在;没有写游戏目录。私人恢复凭据保存在本工作区忽略的 artifacts/local-repair 下,不提交个人游戏路径或记录。 + +## 集成与未验证项目 + +补丁提交供既有 v1.8.1 负责人合入;版本真源及安装器字段由其统一登记。本工作区没有改版本、Bridge 优化、数据库结构、依赖版本或锁文件。保持公共 engine 小写、pendingReview、ExactPath/Subtree 等既有契约。 + +未运行全量测试、真实新游戏扫描/启动、在线翻译、真实 UI 点选和安装/升级验收;未替换当前运行的 v1.8.0,未打包、推送、创建 Release。不得将专项验证当成稳定发布验收。 + +回滚代码使用正常反向提交;已移出卡片保留游戏元数据和原文件,不通过恢复整个备份覆盖用户后续操作。 From fa28904da2b053c22d7c1c4fe2706a898f6f2b23 Mon Sep 17 00:00:00 2001 From: AaronSu Date: Thu, 29 Oct 2026 18:40:43 +0800 Subject: [PATCH 08/29] fix(build): preserve compressed sidecars in desktop payload --- artifacts/tools/package_release.py | 4 ++-- docs/development/2026-10-29-rg02-plan.md | 24 +++++++++++++++++++ .../scripts/prepare_sidecars.py | 1 + 3 files changed, 27 insertions(+), 2 deletions(-) create mode 100644 docs/development/2026-10-29-rg02-plan.md diff --git a/artifacts/tools/package_release.py b/artifacts/tools/package_release.py index e670ab2..15cd9ec 100644 --- a/artifacts/tools/package_release.py +++ b/artifacts/tools/package_release.py @@ -47,9 +47,9 @@ "makensis.exe", ) DEFAULT_TIMESTAMP_URL = "http://timestamp.digicert.com" +# 普通用户载荷的 Host/TauriBridge 只取 Tauri 构建的 sidecar;此处单独发布 Tools 使用的 Console Host、CLI、MCP。 COMPONENTS = [ - ("GameLibrary.Host", "GameLibrary.Host.exe", True, True), - ("GameLibrary.TauriBridge", "GameLibrary.TauriBridge.exe", True, False), + ("GameLibrary.Host", "GameLibrary.Host.exe", False, True), ("GameLibrary.Cli", "gamelibrary.exe", False, True), ("GameLibrary.Mcp", "GameLibrary.Mcp.exe", False, True), ] diff --git a/docs/development/2026-10-29-rg02-plan.md b/docs/development/2026-10-29-rg02-plan.md new file mode 100644 index 0000000..b074bec --- /dev/null +++ b/docs/development/2026-10-29-rg02-plan.md @@ -0,0 +1,24 @@ +# RG-02:v1.8.1 体积与常驻内存优化 + +2026-10-29,用户在本会话以 `PLEASE IMPLEMENT THIS PLAN:` 批准 RG-02。随后批准复制现有前端依赖到独立 worktree,不安装或升级依赖。 + +## 范围与执行约定 + +- 基点:GitHub main `be8e143062ada4eed3fa0e7612cb1bcde76ea6db`。 +- 本地和 GitHub 分支:`codex/optimize-footprint-v1.8.1`。实现提交仅在本地保存,另获授权后推送。 +- 所有编辑、测试、编译及临时数据限定在本重构 worktree;不改 main,不操作正式实例和真实游戏库。 +- 保留 C# Host、公共 IPC、数据格式、权限和现有功能;不引入 Go、不重写业务后端、不新增依赖。 +- R0 Codex:建立分支、图谱、基线及隔离测试目录。 +- R1 dsh-go:为 Tauri sidecar 启用单文件压缩,移除普通用户载荷中被覆盖的重复 publish,保留 Tools Console Host。 +- R2 dsh-go:一个 Bridge 进程、普通请求与 events.wait 两条独立 HostConnection;私有 stdio transportId 配对、串行输出、最多两个在途请求、失败清理和幂等键保护。 +- R3 Codex:审查,运行定向测试、必要 Release 编译与短时对比;更新桌面进程数量断言和相关夹具。 +- R4 Codex:同步 v1.8.1、code-review-graph、评估及实测记录,分别提交发布链路和桥接改动。 +- 写入串行,一个执行 worker,不使用 GPU、付费 API、安装包或总打包入口。 + +## 验收与停止条件 + +保留即时通知;长轮询不阻塞普通请求;乱序/迟到响应不串线;传输失败保留幂等键;中文路径、重连和父进程退出清理保持正确,仅停止所属 Host。数据标识符使用公共序列化的真实契约值。 + +基线与候选均使用相同临时库和 Release 模式;临时测试 identifier、WebView 数据目录、TEMP/TMP 和游戏库均隔离。记录 sidecar 字节数、整棵进程树 Private Bytes、Working Set、CPU 和启动耗时,不预先承诺百分比。不得将未运行或无收益项写成完成。 + +缺依赖或隔离失效时暂停相关步骤;不自行安装或升级。发布链路和桥接改动分别提交,可分别回退;不迁移数据库,不合并 main、不打包、不发布。 diff --git a/src/GameLibrary.Tauri/scripts/prepare_sidecars.py b/src/GameLibrary.Tauri/scripts/prepare_sidecars.py index 20f2488..5421de1 100644 --- a/src/GameLibrary.Tauri/scripts/prepare_sidecars.py +++ b/src/GameLibrary.Tauri/scripts/prepare_sidecars.py @@ -37,6 +37,7 @@ def publish(project: str, executable: str, properties: list[str] | None = None) "true", "-p:PublishSingleFile=true", "-p:IncludeNativeLibrariesForSelfExtract=true", + "-p:EnableCompressionInSingleFile=true", "-p:DebugType=None", *REVISION_PROPERTIES, *(properties or []), From aad378199977754a762fc4c656c5683bed578f8e Mon Sep 17 00:00:00 2001 From: AaronSu Date: Fri, 30 Oct 2026 14:19:05 +0800 Subject: [PATCH 09/29] release: prepare v1.8.1 scan fixes and packaging notes --- Directory.Build.props | 2 +- docs/releases/v1.8.1-validation.md | 7 +++ docs/releases/v1.8.1.md | 52 ++++++++++++++++++++++ src/GameLibrary.Tauri/package-lock.json | 4 +- src/GameLibrary.Tauri/package.json | 2 +- src/GameLibrary.Tauri/src-tauri/Cargo.lock | 2 +- src/GameLibrary.Tauri/src-tauri/Cargo.toml | 2 +- 7 files changed, 65 insertions(+), 6 deletions(-) create mode 100644 docs/releases/v1.8.1-validation.md create mode 100644 docs/releases/v1.8.1.md diff --git a/Directory.Build.props b/Directory.Build.props index 253020e..7533a25 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -12,7 +12,7 @@ true GameLibrary GameLibrary - 1.8.0 + 1.8.1 en-US diff --git a/docs/releases/v1.8.1-validation.md b/docs/releases/v1.8.1-validation.md new file mode 100644 index 0000000..53a6bd5 --- /dev/null +++ b/docs/releases/v1.8.1-validation.md @@ -0,0 +1,7 @@ +# GameLibrary v1.8.1 构建记录 + +范围:扫描边界、待确认计数、快捷方式身份与重复入库修复,加上已提交的 sidecar 打包修复。其他工作区未提交的 Bridge/退出优化未纳入。 + +本次构建进行中。最终源码提交、命令退出码、资产大小、SHA-256 与未执行验收将在实际打包后登记,不预填通过。 + +既有专项验证见[扫描修复验证](../development/v1.8.1-scan-boundaries-validation.md)。人工验收未完成,发布为 prerelease=true、latest=false。 diff --git a/docs/releases/v1.8.1.md b/docs/releases/v1.8.1.md new file mode 100644 index 0000000..9d59531 --- /dev/null +++ b/docs/releases/v1.8.1.md @@ -0,0 +1,52 @@ +# GameLibrary v1.8.1 · 扫描与重复入库修复(待验收) + +## 简体中文 + +修复扫描新游戏时只发现磁盘根目录、漏掉子目录游戏的问题,并阻止快捷方式与游戏本体重复入库。本次为待验收预发布,不设为 Latest。 + +### 修复 + +- 磁盘根目录中的独立 Godot EXE 按文件生成候选,扫描继续进入其他游戏目录。 +- ExactPath 忽略只跳过指定目录自身,保留子目录扫描;Subtree 和系统目录边界仍生效。 +- 待确认徽标只显示候选总数,不再把同一批候选的通知重复计数。 +- 自动扫描忽略 LNK。手动导入快捷方式、扫描本体以及接受已有候选共用保守入口身份检查,避免同一安装重复建卡;不同安装及无法确认的关系保留审核。 +- 保留 Tauri 生成的压缩 sidecar,避免桌面分发包遗漏所需的 Host/Bridge 载荷。 + +### 升级与数据保留 + +先从托盘退出旧版,再安装或替换便携版。保留游戏库数据目录和原游戏文件;本版无数据库结构迁移。升级后重新扫描游戏库,旧的未绑定磁盘根候选会在成功观察后退出待确认列表。不要把本版当作其他工作区尚未提交的 Bridge/退出优化合集。 + +### 下载 + +| 文件 | 用途 | +| --- | --- | +| GameLibrary-Setup-v1.8.1.exe | 当前用户 NSIS 安装器 | +| GameLibrary-Portable-win-x64-v1.8.1.zip | 免安装桌面包 | +| GameLibrary-Tools-win-x64-v1.8.1.zip | Host、CLI、MCP | +| GameLibrary-v1.8.1-SHA256SUMS.txt | 三个分发包的 SHA-256 | + +### 验证与限制 + +已完成的专项回归为分轮去重 135 项 .NET、3 项 Sidebar 和前端类型检查,详见[专项记录](../development/v1.8.1-scan-boundaries-validation.md)。本次打包结果另见[构建记录](v1.8.1-validation.md),未执行的项目不记为通过。真实新游戏扫描、Windows 10/11 安装/升级/卸载及四语言 DPI 人工验收尚未完成。程序未签名,Windows 可能显示未知发布者提示;校验下载文件后再安装。 + +--- + +## English + +Fixes scans that stopped at a drive root and missed new games in subfolders, and prevents duplicate shortcut/game records. This is an acceptance candidate, marked as a pre-release rather than Latest. + +### Fixes + +- Standalone Godot executables at drive roots become file candidates; scanning continues into other installations. +- ExactPath ignores preserve descendant discovery; subtree and system exclusions remain enforced. +- Pending badges count candidates once, without adding their notification count. +- Automatic scans ignore LNK files. Manual shortcut import, discovery and candidate acceptance share conservative entry checks; ambiguous or different installations remain separate. +- Desktop packages retain the compressed sidecars produced by Tauri. + +### Upgrade and downloads + +Quit the old application from its tray before upgrading. Keep the library data directory and original games; no database schema migration is introduced. Rescan after upgrading. The four assets above provide the installer, portable application, advanced tools and SHA-256 checksums. + +### Validation and limitations + +Targeted checks passed: 135 distinct .NET cases, three Sidebar cases and frontend type checking. See the linked build record for this package's actual checks. Real-game scans, Windows installation/upgrade/uninstall and multilingual DPI acceptance remain unverified. Executables are unsigned and may trigger an unknown-publisher warning. diff --git a/src/GameLibrary.Tauri/package-lock.json b/src/GameLibrary.Tauri/package-lock.json index e716a19..ccac156 100644 --- a/src/GameLibrary.Tauri/package-lock.json +++ b/src/GameLibrary.Tauri/package-lock.json @@ -1,12 +1,12 @@ { "name": "gamelibrary-tauri", - "version": "1.8.0", + "version": "1.8.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "gamelibrary-tauri", - "version": "1.8.0", + "version": "1.8.1", "dependencies": { "@tailwindcss/vite": "^4.1.18", "@tauri-apps/api": "^2", diff --git a/src/GameLibrary.Tauri/package.json b/src/GameLibrary.Tauri/package.json index 0029eb3..2984dc6 100644 --- a/src/GameLibrary.Tauri/package.json +++ b/src/GameLibrary.Tauri/package.json @@ -1,7 +1,7 @@ { "name": "gamelibrary-tauri", "private": true, - "version": "1.8.0", + "version": "1.8.1", "type": "module", "scripts": { "dev": "vite", diff --git a/src/GameLibrary.Tauri/src-tauri/Cargo.lock b/src/GameLibrary.Tauri/src-tauri/Cargo.lock index df8a47d..9bc53a1 100644 --- a/src/GameLibrary.Tauri/src-tauri/Cargo.lock +++ b/src/GameLibrary.Tauri/src-tauri/Cargo.lock @@ -1162,7 +1162,7 @@ dependencies = [ [[package]] name = "gamelibrary-desktop" -version = "1.8.0" +version = "1.8.1" dependencies = [ "serde", "serde_json", diff --git a/src/GameLibrary.Tauri/src-tauri/Cargo.toml b/src/GameLibrary.Tauri/src-tauri/Cargo.toml index 04c17fa..3b5d442 100644 --- a/src/GameLibrary.Tauri/src-tauri/Cargo.toml +++ b/src/GameLibrary.Tauri/src-tauri/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "gamelibrary-desktop" -version = "1.8.0" +version = "1.8.1" description = "GameLibrary Tauri desktop client" authors = ["GameLibrary contributors"] edition = "2021" From 5b8c4c5c16acd4923d79be080d7d32007ffd1787 Mon Sep 17 00:00:00 2001 From: AaronSu Date: Fri, 30 Oct 2026 14:31:12 +0800 Subject: [PATCH 10/29] docs(release): record v1.8.1 artifacts and acceptance limitations --- README.en.md | 2 ++ README.ja.md | 2 ++ README.md | 2 ++ README.zh-TW.md | 2 ++ docs/code-review-graph/README.md | 2 ++ docs/releases/v1.8.1-validation.md | 26 +++++++++++++++++++++++++- 6 files changed, 35 insertions(+), 1 deletion(-) diff --git a/README.en.md b/README.en.md index d79179a..0f5480a 100644 --- a/README.en.md +++ b/README.en.md @@ -8,6 +8,8 @@ # GameLibrary +**v1.8.1 acceptance pre-release** fixes missed scans, drive-root detection, pending counts and duplicate shortcut entries. See the [release notes](docs/releases/v1.8.1.md). Stable downloads below remain on v1.8.0. + Keep games scattered across your drives in one library. Choose a folder, check the launch entry, and open the game from your collection. The current formal release, **v1.8.0**, turns bulk favoriting, tagging and removal into one operation, fixes the stale bridge connection after the background service restarts and the unbounded polling retries, and narrows the installer's permission scope. Godot/MTool, Unity translation and the Played library remain available. See the [release notes](docs/releases/v1.8.0.md). diff --git a/README.ja.md b/README.ja.md index 4b65544..6953c9c 100644 --- a/README.ja.md +++ b/README.ja.md @@ -8,6 +8,8 @@ # GameLibrary +**v1.8.1 検証待ちプレリリース**:新規ゲームの検出漏れ、ドライブルートの誤認識、確認待ち件数、ショートカットの重複登録を修正します。[リリース説明](docs/releases/v1.8.1.md)。以下の安定版ダウンロードは v1.8.0 のままです。 + ドライブに散らばったゲームを、一つのライブラリに。フォルダーを選び、起動ファイルを確認すると、一覧からゲームを開けます。 現在の正式版 **v1.8.0** は、一括のお気に入り・タグ付け・ライブラリからの削除を一度の操作にまとめ、バックグラウンドサービスの再起動後に接続が失われる問題とポーリングの無限再試行を修正し、インストーラーの権限範囲を絞り込みました。Godot/MTool、Unity 翻訳、プレイ済みライブラリは引き続き利用できます。[リリース説明](docs/releases/v1.8.0.md)をご確認ください。 diff --git a/README.md b/README.md index eda7077..e5df417 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,8 @@ # GameLibrary +**待验收预发布 v1.8.1**:修复新游戏漏扫、磁盘根误识别、待确认计数及快捷方式重复入库,见[发布说明](docs/releases/v1.8.1.md)。正式版下载仍指向下方的 v1.8.0。 + 把散落在硬盘里的游戏放到一处。选好文件夹,确认启动项,就能从游戏库打开游戏。 当前正式版 **v1.8.0** 把批量收藏、批量加标签和批量移出做成一次操作,修复后台服务重启后连接失效、轮询无限重试的问题,并收窄安装配置的权限范围;此前的 Godot/MTool、Unity 翻译与已游玩游戏库保持不变。[发布说明](docs/releases/v1.8.0.md)记录本次变化与限制。 diff --git a/README.zh-TW.md b/README.zh-TW.md index 8e08a6c..0f8540d 100644 --- a/README.zh-TW.md +++ b/README.zh-TW.md @@ -8,6 +8,8 @@ # GameLibrary +**待驗收預發布 v1.8.1**:修復新遊戲漏掃、磁碟根目錄誤識別、待確認計數及捷徑重複入庫,詳見[發布說明](docs/releases/v1.8.1.md)。下方正式版下載仍為 v1.8.0。 + 把散落在硬碟裡的遊戲放到同一處。選好資料夾、確認啟動項目,就能從遊戲庫開啟遊戲。 目前正式版 **v1.8.0** 把批次收藏、批次標籤與批次移出做成一次操作,修復後台服務重新啟動後連線失效、輪詢無限重試的問題,並收窄安裝設定的權限範圍;先前的 Godot/MTool、Unity 翻譯與已遊玩遊戲庫維持不變。[發布說明](docs/releases/v1.8.0.md)記錄本次變更與限制。 diff --git a/docs/code-review-graph/README.md b/docs/code-review-graph/README.md index 6ffbe85..38be736 100644 --- a/docs/code-review-graph/README.md +++ b/docs/code-review-graph/README.md @@ -1,5 +1,7 @@ # GameLibrary 代码预览框架 +2026-10-30 v1.8.1 待验收打包:按用户选择合入已提交的 sidecar 打包修复,同步产品版本字段为 1.8.1;未纳入其他工作区未提交的 Bridge/退出优化。修改前查询影响上下文,修改后增量解析 2 个文件,解析错误 0,图谱基线为二进制源码 `aad3781`。生产发布、Tauri 与 NSIS 编译完成;本次全量门禁和人工验收未运行。四语言 README 标为待验收预发布,稳定下载保持 v1.8.0。见[构建记录](../releases/v1.8.1-validation.md)。 + 2026-10-30 v1.8.1 扫描补丁:盘根独立文件、ExactPath 后代遍历、LNK 去重及待确认计数。修改前查询共享扫描路径的影响上下文;在最终源码 `687bb4d` 上以 minimal 模式重建,433 文件、4,343 节点、42,636 边,解析错误 0。分轮去重 135 项 .NET、3 项 Sidebar 及前端 typecheck 通过。按用户后续要求由 Codex 完成复核;真实库一致性备份后仅移出 1 张已证实的重复快捷方式卡,文件与元数据保留。见[本轮结构记录](scan-boundaries-v1.8.1.md)、[验证记录](../development/v1.8.1-scan-boundaries-validation.md)及[已批准计划](../development/v1.8.1-scan-boundaries-plan.md)。未打包、推送或发布。 2026-10-26 网站 v1.5.0:下载与四语言宣传内容同步产品 v1.8.0,新增真实浅深色游戏库及标签截图,缩略图和放大图复用网页 `.dark` 主题切换。修改前已做影响分析,修改后增量解析 6 个文件,错误为空,并执行图谱变更分析。实际执行范围为素材采集、转换、源码审阅与图谱同步;网站测试、构建及浏览器验收未运行,未推送或部署。见[网站实施记录](website.md)和[截图来源](../../website/design/2026-10-26-screenshots.md)。 diff --git a/docs/releases/v1.8.1-validation.md b/docs/releases/v1.8.1-validation.md index 53a6bd5..2a6052f 100644 --- a/docs/releases/v1.8.1-validation.md +++ b/docs/releases/v1.8.1-validation.md @@ -2,6 +2,30 @@ 范围:扫描边界、待确认计数、快捷方式身份与重复入库修复,加上已提交的 sidecar 打包修复。其他工作区未提交的 Bridge/退出优化未纳入。 -本次构建进行中。最终源码提交、命令退出码、资产大小、SHA-256 与未执行验收将在实际打包后登记,不预填通过。 +## 构建信息 + +- 二进制源码提交:`aad378199977754a762fc4c656c5683bed578f8e`;构建开始时工作区干净。 +- 构建记录时间:2026-10-30T06:29:34Z。 +- 模式:`package_release.py --build-only-reason`。本次明确授权编译打包,未收到全量自动检查的另行授权。 +- Host、CLI、MCP 自包含 publish、Tauri production build、NSIS 3.12 编译均 exit 0;未签名。 +- 原始报告 `artifacts/dist/release-validation.json`、`package-log.txt` 及 `evidence/check-10/11/12/13/15.log` 保存在构建工作区,版本化副本随本地资产归档。 +- 后续提交只补 README、发布和图谱文档;资产不由该文档提交重新编译。 + +## 资产 + +| 文件 | 字节 | SHA-256 | +| --- | ---: | --- | +| GameLibrary-Setup-v1.8.1.exe | 67568493 | `9e3d62e283677dc79e8930cfd24c458b3cb779d9b7267ea889eb00dacd3efab4` | +| GameLibrary-Portable-win-x64-v1.8.1.zip | 70238548 | `d664cb57a1e76b510f6842146cd07545a511c5f8adfd5879be06fecc35dc4d70` | +| GameLibrary-Tools-win-x64-v1.8.1.zip | 101312973 | `617e04d72e05abd0e0e20994046dd448eb643612a1609d276e346dea3516e825` | +| GameLibrary-v1.8.1-SHA256SUMS.txt | 304 | `b1094a3a874b1cbedc5c7433cc90418f9d5b20e1ce50bae09d64cf8e41442bf4` | + +两个 ZIP 各含 3 个 EXE 与包内 SHA256SUMS.txt,平面布局,无 PDB、脚本或用户数据。复制到主工作区 artifacts/dist 后逐字节摘要一致;包内清单对应各 EXE。以上是分发文件的读取核对,不将其写成未运行的独立发布门禁通过。 + +## 本次未运行 + +operation 生成检查、本地化检查、发布文档门禁、dotnet format、独立全解决方案 Release build/全量测试、完整前端测试与独立 typecheck、Rust fmt、WebView smoke、独立 final asset integrity 门禁均为 not-run。生产程序已通过实际发布/构建命令编译,不把这等同于完整 Release 门禁。 + +Windows 10/11 干净环境、安装/升级/卸载、真实新游戏扫描/审核/启动、四语言 DPI/键盘人工验收均未执行。`manualAcceptance=not-run`,`stableReady=false`。 既有专项验证见[扫描修复验证](../development/v1.8.1-scan-boundaries-validation.md)。人工验收未完成,发布为 prerelease=true、latest=false。 From 320b60b42894ae4e8958421501d889b1778c082f Mon Sep 17 00:00:00 2001 From: AaronSu Date: Fri, 30 Oct 2026 14:31:50 +0800 Subject: [PATCH 11/29] docs(release): record explicit compile-only approval --- docs/releases/v1.8.1-validation.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/releases/v1.8.1-validation.md b/docs/releases/v1.8.1-validation.md index 2a6052f..915660e 100644 --- a/docs/releases/v1.8.1-validation.md +++ b/docs/releases/v1.8.1-validation.md @@ -6,7 +6,7 @@ - 二进制源码提交:`aad378199977754a762fc4c656c5683bed578f8e`;构建开始时工作区干净。 - 构建记录时间:2026-10-30T06:29:34Z。 -- 模式:`package_release.py --build-only-reason`。本次明确授权编译打包,未收到全量自动检查的另行授权。 +- 模式:`package_release.py --build-only-reason`。构建启动时未收到全量自动检查的另行授权;用户随后明确选择“仅编译打包,沿用已完成的专项回归记录”,与本次模式一致。 - Host、CLI、MCP 自包含 publish、Tauri production build、NSIS 3.12 编译均 exit 0;未签名。 - 原始报告 `artifacts/dist/release-validation.json`、`package-log.txt` 及 `evidence/check-10/11/12/13/15.log` 保存在构建工作区,版本化副本随本地资产归档。 - 后续提交只补 README、发布和图谱文档;资产不由该文档提交重新编译。 From 4f7da8a072cf815d5c4ab1f647f1a4467bccc586 Mon Sep 17 00:00:00 2001 From: AaronSu Date: Fri, 30 Oct 2026 14:35:06 +0800 Subject: [PATCH 12/29] docs(release): confirm v1.8.1 upload digests and publication --- docs/releases/v1.8.1-validation.md | 6 ++++++ docs/releases/v1.8.1.md | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/docs/releases/v1.8.1-validation.md b/docs/releases/v1.8.1-validation.md index 915660e..afb3951 100644 --- a/docs/releases/v1.8.1-validation.md +++ b/docs/releases/v1.8.1-validation.md @@ -29,3 +29,9 @@ operation 生成检查、本地化检查、发布文档门禁、dotnet format、 Windows 10/11 干净环境、安装/升级/卸载、真实新游戏扫描/审核/启动、四语言 DPI/键盘人工验收均未执行。`manualAcceptance=not-run`,`stableReady=false`。 既有专项验证见[扫描修复验证](../development/v1.8.1-scan-boundaries-validation.md)。人工验收未完成,发布为 prerelease=true、latest=false。 + +## 发布结果 + +已推送 `codex/release-v1.8.1` 与 `v1.8.1` 标签,标签目标 `320b60b`;未修改受保护的 main。GitHub [v1.8.1 Release](https://github.com/sumingwang233/GameLibrary/releases/tag/v1.8.1) 已公开,4 项资产均为 uploaded,服务器提供的 SHA-256 digest 与本地完全一致,下载地址均为 HTTPS。已实际下载公开 SHA-256 清单并比对本地副本。Latest 查询仍为 v1.8.0。 + +主工作区 artifacts/dist 已保存四项资产及 evidence-v1.8.1 中的版本化构建报告;原版本资产未覆盖。以上发布读取核对不改变完整自动门禁和人工验收的 not-run 状态。 diff --git a/docs/releases/v1.8.1.md b/docs/releases/v1.8.1.md index 9d59531..e1a5886 100644 --- a/docs/releases/v1.8.1.md +++ b/docs/releases/v1.8.1.md @@ -27,7 +27,7 @@ ### 验证与限制 -已完成的专项回归为分轮去重 135 项 .NET、3 项 Sidebar 和前端类型检查,详见[专项记录](../development/v1.8.1-scan-boundaries-validation.md)。本次打包结果另见[构建记录](v1.8.1-validation.md),未执行的项目不记为通过。真实新游戏扫描、Windows 10/11 安装/升级/卸载及四语言 DPI 人工验收尚未完成。程序未签名,Windows 可能显示未知发布者提示;校验下载文件后再安装。 +已完成的专项回归为分轮去重 135 项 .NET、3 项 Sidebar 和前端类型检查,详见[专项记录](https://github.com/sumingwang233/GameLibrary/blob/v1.8.1/docs/development/v1.8.1-scan-boundaries-validation.md)。本次打包结果另见[构建记录](https://github.com/sumingwang233/GameLibrary/blob/v1.8.1/docs/releases/v1.8.1-validation.md),未执行的项目不记为通过。真实新游戏扫描、Windows 10/11 安装/升级/卸载及四语言 DPI 人工验收尚未完成。程序未签名,Windows 可能显示未知发布者提示;校验下载文件后再安装。 --- From 8b006c63dd10441aab40bbc52d18e0d195e3edb2 Mon Sep 17 00:00:00 2001 From: AaronSu Date: Fri, 30 Oct 2026 14:43:08 +0800 Subject: [PATCH 13/29] wip(refactor): checkpoint single bridge before v1.8.1 sync --- .gitignore | 3 + Directory.Build.props | 2 +- docs/code-review-graph/architecture.md | 12 +- src/GameLibrary.Tauri/package-lock.json | 4 +- src/GameLibrary.Tauri/package.json | 2 +- .../scripts/verify_release.mjs | 24 +- src/GameLibrary.Tauri/src-tauri/Cargo.lock | 2 +- src/GameLibrary.Tauri/src-tauri/Cargo.toml | 2 +- src/GameLibrary.Tauri/src-tauri/src/lib.rs | 502 +++++++++++++++--- src/GameLibrary.TauriBridge/BridgeFrame.cs | 34 ++ src/GameLibrary.TauriBridge/BridgeServer.cs | 240 ++++++--- .../HostStopE2ETests.cs | 38 +- .../TauriBridgeE2ETests.cs | 224 ++++++++ 13 files changed, 929 insertions(+), 160 deletions(-) create mode 100644 src/GameLibrary.TauriBridge/BridgeFrame.cs create mode 100644 tests/GameLibrary.HeadlessE2ETests/TauriBridgeE2ETests.cs diff --git a/.gitignore b/.gitignore index 8869b11..325dfc5 100644 --- a/.gitignore +++ b/.gitignore @@ -22,6 +22,9 @@ TestResults/ __pycache__/ *.pyc +# RG-02 isolated builds, fixtures and measurements +/.tmp/rg02/ + # 用户笔记配置(不纳入工程版本控制) .obsidian/ diff --git a/Directory.Build.props b/Directory.Build.props index 253020e..7533a25 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -12,7 +12,7 @@ true GameLibrary GameLibrary - 1.8.0 + 1.8.1 en-US diff --git a/docs/code-review-graph/architecture.md b/docs/code-review-graph/architecture.md index e7c034a..105faf8 100644 --- a/docs/code-review-graph/architecture.md +++ b/docs/code-review-graph/architecture.md @@ -1,5 +1,11 @@ # GameLibrary 架构预览 +## RG-02 / v1.8.1(未发布) + +Tauri Rust 壳改为一个 C# Bridge 进程。普通请求和 `events.wait` 各有一条独立 HostConnection;两条通道分别串行,可同时在途。私有 stdio 使用独立 `transportId` 配对乱序响应,不改变 Host 的 `requestId`、权限、库身份或 SQLite schema。传输失败拒绝前端 invoke,保留幂等键;业务 Envelope 保持原样。 + +普通用户 sidecar 的发布来源统一为 Tauri 构建,启用单文件压缩;Tools 仍独立发布 Console Host。验证状态和资源实测见 [RG-02 记录](../development/2026-10-29-rg02-validation.md)。 + v1.7.11:Unity 自动配置仍由 `UnityTranslationService` 串行协调;`UnityTranslationInspection` 核对活动加载器与非活动生成物,`UnityTranslationAssembly` 通过 .NET metadata 对受限的已核验 IL 做等长变更,`UnityTranslationFonts` 按真实 TMP 接口选择系统字体或既有字库。复用原有固定哈希 Payload 与加密文件事务,`RestoredBackupId`/恢复收据留在本机既有状态/备份边界,不新增表或 IPC。恢复保留缓存、安装拒绝未知文件,与原游戏文件修改、用户确认和密钥边界保持一致。详见 [实施记录](../development/v1.7.11-loader-compatibility-plan.md)。 ## 宣传网站 — 2026-10-02 / 网站 v1.1.0 @@ -14,8 +20,10 @@ v1.7.0 新增名称翻译边界:React 共享作业 Hook → Host `TitlesHandle ```mermaid flowchart LR - UI[Tauri / React hooks] --> Normal[普通请求 Bridge] - UI --> Events[事件等待 Bridge] + UI[Tauri / React hooks] --> Rust[Rust / transportId] + Rust --> Bridge[单个 C# Bridge] + Bridge --> Normal[普通请求连接] + Bridge --> Events[events.wait 连接] WPF[WPF] --> Client[HostClient] CLI[CLI / MCP] --> Client Normal --> Client diff --git a/src/GameLibrary.Tauri/package-lock.json b/src/GameLibrary.Tauri/package-lock.json index e716a19..ccac156 100644 --- a/src/GameLibrary.Tauri/package-lock.json +++ b/src/GameLibrary.Tauri/package-lock.json @@ -1,12 +1,12 @@ { "name": "gamelibrary-tauri", - "version": "1.8.0", + "version": "1.8.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "gamelibrary-tauri", - "version": "1.8.0", + "version": "1.8.1", "dependencies": { "@tailwindcss/vite": "^4.1.18", "@tauri-apps/api": "^2", diff --git a/src/GameLibrary.Tauri/package.json b/src/GameLibrary.Tauri/package.json index 0029eb3..2984dc6 100644 --- a/src/GameLibrary.Tauri/package.json +++ b/src/GameLibrary.Tauri/package.json @@ -1,7 +1,7 @@ { "name": "gamelibrary-tauri", "private": true, - "version": "1.8.0", + "version": "1.8.1", "type": "module", "scripts": { "dev": "vite", diff --git a/src/GameLibrary.Tauri/scripts/verify_release.mjs b/src/GameLibrary.Tauri/scripts/verify_release.mjs index b593441..b474f64 100644 --- a/src/GameLibrary.Tauri/scripts/verify_release.mjs +++ b/src/GameLibrary.Tauri/scripts/verify_release.mjs @@ -94,7 +94,7 @@ function cdp(webSocketUrl) { function processTree() { const script = [ "Get-CimInstance Win32_Process |", - "Select-Object Name,ProcessId,ParentProcessId,ExecutablePath |", + "Select-Object Name,ProcessId,ParentProcessId,ExecutablePath,WorkingSetSize,PrivatePageCount,UserModeTime,KernelModeTime |", "ConvertTo-Json -Compress", ].join(" "); const text = execFileSync("powershell.exe", ["-NoProfile", "-Command", script], { @@ -123,6 +123,7 @@ function descendants(processes, rootPid) { const port = await freePort(); const webViewData = path.join(path.dirname(dataDirectory), "webview2"); +const startedAt = performance.now(); const desktop = spawn(executable, [], { cwd: path.dirname(executable), env: { @@ -140,6 +141,7 @@ desktop.stderr.on("data", chunk => { desktopError = (desktopError + chunk.toStri let client; try { const target = await waitForTarget(port); + const startupMs = performance.now() - startedAt; client = cdp(target.webSocketDebuggerUrl); const expression = ` (async () => { @@ -220,13 +222,29 @@ try { if (result.rootDisplay !== "flex") failures.push(`unexpected app shell display ${result.rootDisplay}`); const tree = descendants(processTree(), desktop.pid); - if (process.argv.includes("--batch-smoke") && tree.filter(process => process.Name?.toLowerCase().startsWith("gamelibrary.tauribridge")).length !== 2) - failures.push("ordinary and event bridge processes were not both active"); + if (process.argv.includes("--batch-smoke") && tree.filter(process => process.Name?.toLowerCase().startsWith("gamelibrary.tauribridge")).length !== 1) + failures.push("exactly one bridge process was not active"); const consoleHosts = tree.filter((process) => process.Name?.toLowerCase() === "conhost.exe"); if (consoleHosts.length) { failures.push(`console host descendants detected: ${consoleHosts.map((item) => `${item.ProcessId}<-parent:${item.ParentProcessId}`).join(", ")}; tree=${JSON.stringify(tree.map(({ Name, ProcessId, ParentProcessId }) => ({ Name, ProcessId, ParentProcessId })))}`); } + if (process.argv.includes("--footprint")) { + await sleep(30000); + const samples = []; + for (let index = 0; index < 7; index++) { + const processes = descendants(processTree(), desktop.pid); + samples.push({ + elapsedMs: performance.now() - startedAt, + privateBytes: processes.reduce((sum, item) => sum + Number(item.PrivatePageCount || 0), 0), + workingSetBytes: processes.reduce((sum, item) => sum + Number(item.WorkingSetSize || 0), 0), + cpuSeconds: processes.reduce((sum, item) => sum + Number(item.UserModeTime || 0) + Number(item.KernelModeTime || 0), 0) / 10000000, + bridgeCount: processes.filter(item => item.Name?.toLowerCase().startsWith("gamelibrary.tauribridge")).length, + }); + if (index < 6) await sleep(5000); + } + result.footprint = { startupMs, samples }; + } const screenshot = await client.send("Page.captureScreenshot", { format: "png", captureBeyondViewport: false }); writeFileSync(screenshotPath, Buffer.from(screenshot.data, "base64")); diff --git a/src/GameLibrary.Tauri/src-tauri/Cargo.lock b/src/GameLibrary.Tauri/src-tauri/Cargo.lock index df8a47d..9bc53a1 100644 --- a/src/GameLibrary.Tauri/src-tauri/Cargo.lock +++ b/src/GameLibrary.Tauri/src-tauri/Cargo.lock @@ -1162,7 +1162,7 @@ dependencies = [ [[package]] name = "gamelibrary-desktop" -version = "1.8.0" +version = "1.8.1" dependencies = [ "serde", "serde_json", diff --git a/src/GameLibrary.Tauri/src-tauri/Cargo.toml b/src/GameLibrary.Tauri/src-tauri/Cargo.toml index 04c17fa..3b5d442 100644 --- a/src/GameLibrary.Tauri/src-tauri/Cargo.toml +++ b/src/GameLibrary.Tauri/src-tauri/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "gamelibrary-desktop" -version = "1.8.0" +version = "1.8.1" description = "GameLibrary Tauri desktop client" authors = ["GameLibrary contributors"] edition = "2021" diff --git a/src/GameLibrary.Tauri/src-tauri/src/lib.rs b/src/GameLibrary.Tauri/src-tauri/src/lib.rs index 8169d7c..bfd7d7d 100644 --- a/src/GameLibrary.Tauri/src-tauri/src/lib.rs +++ b/src/GameLibrary.Tauri/src-tauri/src/lib.rs @@ -1,8 +1,10 @@ use serde_json::{json, Value}; +use std::collections::HashMap; use std::io::{BufRead, BufReader, Write}; use std::path::{Path, PathBuf}; use std::process::{Child, ChildStdin, ChildStdout, Command, Stdio}; -use std::sync::mpsc::{self, Receiver, RecvTimeoutError}; +use std::sync::atomic::{AtomicBool, AtomicU64, Ordering}; +use std::sync::mpsc::{self, RecvTimeoutError}; use std::sync::{Arc, Mutex}; use std::time::Duration; use tauri::menu::{Menu, MenuItem}; @@ -58,20 +60,29 @@ use std::os::windows::process::CommandExt; #[cfg(windows)] const CREATE_NO_WINDOW: u32 = 0x0800_0000; -/// bridge 响应等待上限。请求-响应严格一对一,一旦超时就无法保证下一条响应仍对应本次请求, -/// 因此超时按「bridge 挂死」处理:杀掉进程,下次请求重新拉起。 +/// bridge 响应等待上限。响应通过 transportId 与请求配对;超时/读写失败/协议损坏按 +/// 「bridge 失效」处理:同一进程的所有 pending 失败并杀掉进程,下次请求重新拉起。 const REQUEST_TIMEOUT: Duration = Duration::from_secs(120); struct BridgeProcess { - child: Child, - stdin: ChildStdin, - responses: Receiver, + child: Mutex, + stdin: Mutex>, + pending: PendingRequests, + generation: u64, +} + +/// 同一 bridge 进程的等待表。transportId 独立于 Host 的 requestId,只用于私有 stdio 配对。 +#[derive(Default)] +struct PendingRequests { + pending: Mutex>>>, + failed: AtomicBool, } #[derive(Default)] struct BridgeState { - requests: Mutex>, - events: Mutex>, + process: Mutex>>, + requests_lane: Mutex<()>, + events_lane: Mutex<()>, } /// 前端从 settings.get 读到 closeToTray 后经 set_close_to_tray 下发。 @@ -84,35 +95,180 @@ struct UiPrefsInner { #[derive(Default)] struct UiPrefs(Arc>); +enum RequestFailure { + /// Host 已明确返回 transportError:只拒绝本次 invoke,进程仍可继续服务。 + Transport(String), + /// 超时、读写失败或协议损坏:同一进程的所有等待请求都必须失败并清理。 + Broken(String), +} + +impl PendingRequests { + fn register( + &self, + transport_id: &str, + sender: mpsc::Sender>, + ) -> Result<(), String> { + let mut pending = self + .pending + .lock() + .map_err(|_| "TauriBridge 等待表锁异常".to_string())?; + if self.failed.load(Ordering::SeqCst) { + return Err("TauriBridge 已失效".to_string()); + } + pending.insert(transport_id.to_string(), sender); + Ok(()) + } + + fn unregister(&self, transport_id: &str) { + if let Ok(mut pending) = self.pending.lock() { + pending.remove(transport_id); + } + } + + fn complete(&self, transport_id: &str, reply: Result) -> bool { + let sender = self + .pending + .lock() + .ok() + .and_then(|mut pending| pending.remove(transport_id)); + match sender { + Some(sender) => { + let _ = sender.send(reply); + true + } + None => false, + } + } + + fn fail_all(&self, reason: &str) { + let senders = { + let Ok(mut pending) = self.pending.lock() else { + return; + }; + self.failed.store(true, Ordering::SeqCst); + std::mem::take(&mut *pending) + }; + for (_, sender) in senders { + let _ = sender.send(Err(reason.to_string())); + } + } + + fn is_failed(&self) -> bool { + self.failed.load(Ordering::SeqCst) + } +} + impl BridgeProcess { - fn request(&mut self, request: &Value) -> Result { - let line = serde_json::to_string(request).map_err(|error| error.to_string())?; - writeln!(self.stdin, "{line}").map_err(|error| error.to_string())?; - self.stdin.flush().map_err(|error| error.to_string())?; + fn request(&self, transport_id: &str, frame: &Value) -> Result { + if self.pending.is_failed() { + return Err(RequestFailure::Broken("TauriBridge 已失效".to_string())); + } + + let line = serde_json::to_string(frame) + .map_err(|error| RequestFailure::Transport(error.to_string()))?; + let (sender, receiver) = mpsc::channel(); + self.pending + .register(transport_id, sender) + .map_err(RequestFailure::Broken)?; + + let write_result = self + .stdin + .lock() + .map_err(|_| "TauriBridge stdin 锁异常".to_string()) + .and_then(|mut stdin| { + let stdin = stdin + .as_mut() + .ok_or_else(|| "TauriBridge stdin 已关闭".to_string())?; + writeln!(stdin, "{line}") + .and_then(|_| stdin.flush()) + .map_err(|error| format!("TauriBridge 写入失败:{error}")) + }); + if let Err(reason) = write_result { + self.pending.unregister(transport_id); + return Err(RequestFailure::Broken(reason)); + } - let response = match self.responses.recv_timeout(REQUEST_TIMEOUT) { - Ok(response) => response, + match receiver.recv_timeout(REQUEST_TIMEOUT) { + Ok(Ok(value)) if !self.pending.is_failed() => Ok(value), + Ok(Ok(_)) => Err(RequestFailure::Broken("TauriBridge 已失效".to_string())), + Ok(Err(message)) if !self.pending.is_failed() => { + Err(RequestFailure::Transport(message)) + } + Ok(Err(message)) => Err(RequestFailure::Broken(message)), Err(RecvTimeoutError::Timeout) => { - return Err(format!( + self.pending.unregister(transport_id); + Err(RequestFailure::Broken(format!( "TauriBridge 在 {} 秒内未响应,可能后台服务无响应", REQUEST_TIMEOUT.as_secs() - )); + ))) } - Err(RecvTimeoutError::Disconnected) => return Err("TauriBridge 已退出".to_string()), - }; + Err(RecvTimeoutError::Disconnected) => { + self.pending.unregister(transport_id); + Err(RequestFailure::Broken("TauriBridge 已退出".to_string())) + } + } + } - if response.trim().is_empty() { - return Err("TauriBridge 返回空响应".to_string()); + fn terminate(&self) { + self.pending.fail_all("TauriBridge 已退出"); + if let Ok(mut child) = self.child.lock() { + let _ = child.kill(); + let _ = child.wait(); } + } - serde_json::from_str(response.trim()).map_err(|error| error.to_string()) + fn close_input(&self) { + if let Ok(mut stdin) = self.stdin.try_lock() { + stdin.take(); + } } } -/// 独立线程读取 bridge stdout 并按行投递,使主调用方可以用 recv_timeout 施加超时。 -/// 子进程退出时 read_line 返回 0,线程自然结束并让 Receiver 进入 Disconnected。 -fn spawn_response_reader(stdout: ChildStdout) -> Receiver { - let (sender, receiver) = mpsc::channel(); +/// 解析私有 stdio 响应。损坏、缺少 transportId 或同时/都不带 result 与 transportError +/// 都视为协议失效,由调用方终止该进程而不猜测归属。 +fn parse_response_line(line: &str) -> Result<(String, Result), String> { + let value: Value = + serde_json::from_str(line).map_err(|_| "TauriBridge 返回了无法解析的响应".to_string())?; + let object = value + .as_object() + .ok_or_else(|| "TauriBridge 返回了非对象响应".to_string())?; + let transport_id = object + .get("transportId") + .and_then(Value::as_str) + .filter(|value| !value.is_empty()) + .ok_or_else(|| "TauriBridge 响应缺少 transportId".to_string())? + .to_string(); + + match ( + object.get("result").filter(|value| !value.is_null()), + object + .get("transportError") + .filter(|value| !value.is_null()), + ) { + (Some(result), None) => Ok((transport_id, Ok(result.clone()))), + (None, Some(error)) => { + let code = error + .get("code") + .and_then(Value::as_str) + .ok_or_else(|| "TauriBridge transportError 缺少 code".to_string())?; + let message = error + .get("message") + .and_then(Value::as_str) + .ok_or_else(|| "TauriBridge transportError 缺少 message".to_string())?; + let message = if message.is_empty() { + code.to_string() + } else { + message.to_string() + }; + Ok((transport_id, Err(message))) + } + _ => Err("TauriBridge 响应必须且只能包含 result 或 transportError".to_string()), + } +} + +/// 独立线程读取 bridge stdout 并按 transportId 投递,主调用方因此可以并发等待且不受 +/// 写入顺序影响。未知/损坏响应会失败该进程的全部 pending 并终止进程。 +fn spawn_response_reader(stdout: ChildStdout, process: Arc) { std::thread::spawn(move || { let mut reader = BufReader::new(stdout); loop { @@ -120,15 +276,38 @@ fn spawn_response_reader(stdout: ChildStdout) -> Receiver { match reader.read_line(&mut line) { Ok(0) => break, Ok(_) => { - if sender.send(line).is_err() { - break; + let trimmed = line.trim(); + if trimmed.is_empty() { + process.pending.fail_all("TauriBridge 返回空响应"); + process.terminate(); + return; + } + match parse_response_line(trimmed) { + Ok((transport_id, reply)) => { + if !process.pending.complete(&transport_id, reply) { + process + .pending + .fail_all("TauriBridge 返回了未知 transportId 的响应"); + process.terminate(); + return; + } + } + Err(reason) => { + process.pending.fail_all(&reason); + process.terminate(); + return; + } } } - Err(_) => break, + Err(_) => { + process.pending.fail_all("TauriBridge 读取失败"); + process.terminate(); + return; + } } } + process.pending.fail_all("TauriBridge 已退出"); }); - receiver } fn bridge_candidates(app: &AppHandle) -> Vec { @@ -168,7 +347,7 @@ fn bridge_candidates(app: &AppHandle) -> Vec { candidates } -fn spawn_bridge(app: &AppHandle) -> Result { +fn spawn_bridge(app: &AppHandle) -> Result, String> { let path = bridge_candidates(app) .into_iter() .find(|candidate| candidate.is_file()) @@ -192,11 +371,15 @@ fn spawn_bridge(app: &AppHandle) -> Result { .map_err(|error| format!("启动 TauriBridge 失败:{error}"))?; let stdin = child.stdin.take().ok_or("TauriBridge stdin 不可用")?; let stdout = child.stdout.take().ok_or("TauriBridge stdout 不可用")?; - Ok(BridgeProcess { - child, - stdin, - responses: spawn_response_reader(stdout), - }) + static NEXT_GENERATION: AtomicU64 = AtomicU64::new(1); + let process = Arc::new(BridgeProcess { + child: Mutex::new(child), + stdin: Mutex::new(Some(stdin)), + pending: PendingRequests::default(), + generation: NEXT_GENERATION.fetch_add(1, Ordering::Relaxed), + }); + spawn_response_reader(stdout, Arc::clone(&process)); + Ok(process) } fn host_candidates() -> Vec { @@ -219,66 +402,100 @@ fn host_candidates() -> Vec { candidates } -fn discard_bridge(bridge: &mut Option) { - if let Some(mut stale) = bridge.take() { - let _ = stale.child.kill(); - let _ = stale.child.wait(); +fn next_transport_id(generation: u64) -> String { + static NEXT_TRANSPORT_ID: AtomicU64 = AtomicU64::new(1); + format!( + "{generation}-{}", + NEXT_TRANSPORT_ID.fetch_add(1, Ordering::Relaxed) + ) +} + +fn ensure_bridge(state: &BridgeState, app: &AppHandle) -> Result, String> { + let mut slot = state + .process + .lock() + .map_err(|_| "TauriBridge 状态锁异常".to_string())?; + if let Some(current) = slot.as_ref() { + let exited = current + .child + .lock() + .map(|mut child| child.try_wait().ok().flatten().is_some()) + .unwrap_or(true); + if !exited && !current.pending.is_failed() { + return Ok(Arc::clone(current)); + } + } + + if let Some(stale) = slot.take() { + stale.pending.fail_all("TauriBridge 已退出"); + stale.terminate(); } + let process = spawn_bridge(app)?; + *slot = Some(Arc::clone(&process)); + Ok(process) +} + +/// 只清理传进来的那个进程。若它已被新进程替换,仍会失败它自己的 pending,但绝不会 +/// 清空或杀掉当前槽位里的新进程。 +fn discard_process(state: &BridgeState, process: &Arc, reason: &str) { + if let Ok(mut slot) = state.process.lock() { + if slot + .as_ref() + .is_some_and(|current| Arc::ptr_eq(current, process)) + { + *slot = None; + } + } + process.pending.fail_all(reason); + process.terminate(); } /// `#[tauri::command(async)]` 使该命令在独立线程执行而非主线程——否则阻塞式等待 bridge /// 响应会卡住整个 Tauri 事件循环(窗口拖动、其它命令全部排队)。 +/// 普通请求与 events.wait 各持一把 lane 锁,允许长轮询与普通操作同时在途,总上限两个。 #[tauri::command(async)] fn bridge_request( state: State<'_, BridgeState>, app: AppHandle, request: Value, ) -> Result { - let lane = if request.get("operationId").and_then(Value::as_str) == Some("events.wait") { - &state.events + let is_events = request.get("operationId").and_then(Value::as_str) == Some("events.wait"); + let lane = if is_events { + &state.events_lane } else { - &state.requests + &state.requests_lane }; - let mut bridge = lane.lock().map_err(|_| "TauriBridge 状态锁异常")?; - if bridge - .as_mut() - .is_some_and(|process| process.child.try_wait().ok().flatten().is_some()) - { - *bridge = None; - } - if bridge.is_none() { - *bridge = Some(spawn_bridge(&app)?); - } - - let result = bridge - .as_mut() - .expect("bridge initialized") - .request(&request); - - if result.is_err() { - // 超时或断连后请求-响应配对已不可信,丢弃进程避免读到错位的响应。 - discard_bridge(&mut bridge); + let _lane_guard = lane.lock().map_err(|_| "TauriBridge 状态锁异常")?; + + let process = ensure_bridge(&state, &app)?; + let transport_id = next_transport_id(process.generation); + let frame = json!({ "transportId": &transport_id, "request": request }); + + match process.request(&transport_id, &frame) { + Ok(result) => Ok(result), + Err(RequestFailure::Transport(message)) => Err(message), + Err(RequestFailure::Broken(message)) => { + // 超时/断连/协议损坏后该进程的配对已不可信:失败所有 pending 并清理。 + discard_process(&state, &process, &message); + Err(message) + } } - - result } #[tauri::command(async)] fn bridge_status(state: State<'_, BridgeState>) -> Result { - let mut bridge = state - .requests + let mut slot = state + .process .lock() - .map_err(|_| "TauriBridge 状态锁异常")?; - let running = bridge - .as_mut() - .map(|process| { - process + .map_err(|_| "TauriBridge 状态锁异常".to_string())?; + let running = slot.as_mut().is_some_and(|process| { + !process.pending.is_failed() + && process .child - .try_wait() - .map(|state| state.is_none()) + .lock() + .map(|mut child| child.try_wait().ok().flatten().is_none()) .unwrap_or(false) - }) - .unwrap_or(false); + }); Ok(json!({ "running": running })) } @@ -392,9 +609,10 @@ pub fn run() { .setup(|app| { #[cfg(target_os = "windows")] if let Some(window) = app.get_webview_window("main") { - taskbar_icon::set_taskbar_icon(window.hwnd()?.0)?; + taskbar_icon::set_taskbar_icon(window.hwnd()?.0) + .map_err(|error| format!("taskbar icon setup: {error}"))?; } - build_tray(app.handle())?; + build_tray(app.handle()).map_err(|error| format!("tray setup: {error}"))?; Ok(()) }) .on_window_event(|window, event| { @@ -426,14 +644,136 @@ pub fn run() { .run(|app, event| { if matches!(event, RunEvent::Exit) { if let Some(state) = app.try_state::() { - for lane in [&state.requests, &state.events] { - // Parent monitoring stops Host; avoid waiting for busy long-poll lanes. - // Closing stdin also lets an idle bridge finish gracefully. - if let Ok(mut bridge) = lane.try_lock() { - bridge.take(); + // Parent monitoring stops Host; avoid waiting for busy long-poll lanes. + // The reader owns another Arc; explicitly close stdin for graceful shutdown. + if let Ok(mut process) = state.process.try_lock() { + if let Some(process) = process.take() { + process.close_input(); } } } } }); } + +#[cfg(test)] +mod bridge_transport_tests { + use super::{parse_response_line, PendingRequests}; + use serde_json::{json, Value}; + use std::sync::mpsc; + use std::time::Duration; + + fn register( + pending: &PendingRequests, + transport_id: &str, + ) -> mpsc::Receiver> { + let (sender, receiver) = mpsc::channel(); + pending.register(transport_id, sender).unwrap(); + receiver + } + + fn result_frame(transport_id: &str, request_id: &str) -> String { + json!({ + "transportId": transport_id, + "result": { "requestId": request_id, "ok": true } + }) + .to_string() + } + + #[test] + fn routes_out_of_order_responses_by_transport_id() { + let pending = PendingRequests::default(); + let first = register(&pending, "transport-a"); + let second = register(&pending, "transport-b"); + + let (id, reply) = parse_response_line(&result_frame("transport-b", "request-b")).unwrap(); + assert!(pending.complete(&id, reply)); + let (id, reply) = parse_response_line(&result_frame("transport-a", "request-a")).unwrap(); + assert!(pending.complete(&id, reply)); + + assert_eq!(first.try_recv().unwrap().unwrap()["requestId"], "request-a"); + assert_eq!( + second.try_recv().unwrap().unwrap()["requestId"], + "request-b" + ); + } + + #[test] + fn late_response_for_removed_transport_fails_pending_and_blocks_new_requests() { + let pending = PendingRequests::default(); + let current = register(&pending, "transport-current"); + let (id, reply) = + parse_response_line(&result_frame("transport-expired", "request-old")).unwrap(); + assert!(!pending.complete(&id, reply)); + pending.fail_all("迟到的响应"); + + assert!(current.try_recv().unwrap().is_err()); + let (sender, _receiver) = mpsc::channel(); + assert!(pending.register("transport-new", sender).is_err()); + } + + #[test] + fn transport_error_is_delivered_without_failing_other_requests() { + let pending = PendingRequests::default(); + let (sender, receiver) = mpsc::channel(); + pending.register("transport-error", sender).unwrap(); + + let (id, reply) = parse_response_line( + &json!({ + "transportId": "transport-error", + "transportError": { "code": "HostUnavailable", "message": "宿主不可用" } + }) + .to_string(), + ) + .unwrap(); + assert!(pending.complete(&id, reply)); + assert_eq!(receiver.try_recv().unwrap().unwrap_err(), "宿主不可用"); + assert!(!pending.is_failed()); + } + + #[test] + fn disconnect_fails_every_pending_request() { + let pending = PendingRequests::default(); + let first = register(&pending, "transport-a"); + let second = register(&pending, "transport-b"); + pending.fail_all("TauriBridge 已退出"); + + assert_eq!( + first + .recv_timeout(Duration::from_secs(1)) + .unwrap() + .unwrap_err(), + "TauriBridge 已退出" + ); + assert_eq!( + second + .recv_timeout(Duration::from_secs(1)) + .unwrap() + .unwrap_err(), + "TauriBridge 已退出" + ); + } + + #[test] + fn rejects_corrupt_or_ambiguous_frames() { + assert!(parse_response_line("not-json").is_err()); + assert!(parse_response_line(&json!({ "transportId": "x" }).to_string()).is_err()); + assert!(parse_response_line( + &json!({ + "transportId": "x", + "result": { "ok": true }, + "transportError": { "code": "c", "message": "m" } + }) + .to_string() + ) + .is_err()); + assert!(parse_response_line( + &json!({ + "transportId": "x", + "transportError": { "code": "HostUnavailable" } + }) + .to_string() + ) + .is_err()); + } +} diff --git a/src/GameLibrary.TauriBridge/BridgeFrame.cs b/src/GameLibrary.TauriBridge/BridgeFrame.cs new file mode 100644 index 0000000..b97b972 --- /dev/null +++ b/src/GameLibrary.TauriBridge/BridgeFrame.cs @@ -0,0 +1,34 @@ +using System.Text.Json; +using System.Text.Json.Serialization; +using GameLibrary.Contracts; + +namespace GameLibrary.TauriBridge; + +/// +/// 私有 stdio 帧。transportId 只用于桥内请求/响应配对,独立于 Host 的 requestId, +/// 因此乱序响应不会覆盖或改写原有业务 ID。 +/// +public sealed record BridgeFrameRequest +{ + public required string TransportId { get; init; } + + public required BridgeRequest Request { get; init; } +} + +public sealed record BridgeFrameResponse +{ + public required string TransportId { get; init; } + + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + public Envelope? Result { get; init; } + + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + public BridgeTransportError? TransportError { get; init; } +} + +public sealed record BridgeTransportError +{ + public required string Code { get; init; } + + public required string Message { get; init; } +} diff --git a/src/GameLibrary.TauriBridge/BridgeServer.cs b/src/GameLibrary.TauriBridge/BridgeServer.cs index 53524b4..f56bf65 100644 --- a/src/GameLibrary.TauriBridge/BridgeServer.cs +++ b/src/GameLibrary.TauriBridge/BridgeServer.cs @@ -7,10 +7,23 @@ namespace GameLibrary.TauriBridge; public sealed class BridgeServer { + /// 普通请求与 events.wait 各用一条 HostConnection,两条 lane 可以同时执行。 + private sealed class Lane + { + public SemaphoreSlim Gate { get; } = new(1, 1); + + public HostConnection? Connection { get; set; } + + public string? DataDirectory { get; set; } + + public string? StopDataDirectory { get; set; } + } + private readonly TextReader _input; private readonly TextWriter _output; - private HostConnection? _connection; - private string? _dataDirectory; + private readonly object _outputLock = new(); + private readonly Lane _ordinary = new(); + private readonly Lane _events = new(); public BridgeServer(TextReader input, TextWriter output) { @@ -20,53 +33,146 @@ public BridgeServer(TextReader input, TextWriter output) public async Task RunAsync(CancellationToken cancellationToken) { - while (!cancellationToken.IsCancellationRequested) + using var runCancellation = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken); + var pending = new List(); + try { - var line = await _input.ReadLineAsync(cancellationToken).AsTask().WaitAsync(cancellationToken); - if (line is null) + while (!runCancellation.IsCancellationRequested) { - break; - } + string? line; + try + { + line = await _input.ReadLineAsync(runCancellation.Token).AsTask().WaitAsync(runCancellation.Token); + } + catch (OperationCanceledException) when (runCancellation.IsCancellationRequested) + { + break; + } + + if (line is null) + { + break; + } + + if (string.IsNullOrWhiteSpace(line)) + { + continue; + } + + BridgeFrameRequest? frame; + try + { + frame = JsonSerializer.Deserialize(line, ContractJson.Options); + } + catch (JsonException) + { + // A corrupt private frame cannot be paired safely; EOF fails all Rust waiters. + break; + } + + if (frame is null || string.IsNullOrWhiteSpace(frame.TransportId) || frame.Request is null) + { + break; + } - if (string.IsNullOrWhiteSpace(line)) + // 读取循环只负责分派:events.wait 挂起时普通请求仍能被读入并执行。 + var lane = string.Equals(frame.Request.OperationId, "events.wait", StringComparison.Ordinal) + ? _events + : _ordinary; + pending.Add(ProcessAsync(frame, lane, runCancellation.Token)); + pending.RemoveAll(task => task.IsCompleted); + } + } + finally + { + // stdin EOF / 父进程退出:取消在途 lane 工作,避免长轮询拖住桥接进程的清理。 + runCancellation.Cancel(); + try { - continue; + await Task.WhenAll(pending); } + catch (Exception) + { + // 关闭路径优先完成连接清理;单个响应写入失败不应阻止退出。 + } + + await DiscardConnectionAsync(_ordinary); + await DiscardConnectionAsync(_events); + } + } + + private async Task ProcessAsync(BridgeFrameRequest frame, Lane lane, CancellationToken cancellationToken) + { + try + { + await lane.Gate.WaitAsync(cancellationToken); + } + catch (OperationCanceledException) when (cancellationToken.IsCancellationRequested) + { + return; + } - object response; + BridgeFrameResponse response; + try + { try { - var request = JsonSerializer.Deserialize(line, ContractJson.Options) - ?? throw new InvalidOperationException("桥接请求为空"); - response = await ExecuteAsync(request, cancellationToken); + var result = await ExecuteAsync(frame.Request, lane, cancellationToken); + response = new BridgeFrameResponse + { + TransportId = frame.TransportId, + Result = result, + }; } - catch (Exception ex) when (ex is JsonException or InvalidOperationException or HostClientException) + catch (OperationCanceledException) when (cancellationToken.IsCancellationRequested) { - response = new Envelope + return; + } + catch (Exception ex) + { + var (code, message) = MapTransportError(ex); + response = new BridgeFrameResponse { - RequestId = TryGetRequestId(line), - Ok = false, - Status = OperationStatus.Failed, - Error = new RequestError - { - Code = ex is HostClientException - ? ErrorCodes.HostUnavailable - : ErrorCodes.InvalidArgument, - Message = ex.Message, - Retryable = ex is HostClientException, - }, + TransportId = frame.TransportId, + TransportError = new BridgeTransportError { Code = code, Message = message }, }; } + } + finally + { + lane.Gate.Release(); + } - await _output.WriteLineAsync(JsonSerializer.Serialize(response, ContractJson.Options)); - await _output.FlushAsync(cancellationToken); + if (!cancellationToken.IsCancellationRequested) + { + WriteResponse(response); } + } - await DiscardConnectionAsync(); + /// + /// 整行写 stdout。两条 lane 的响应可能乱序完成,加锁保证每个 JSON 帧不会被字节级穿插; + /// 响应归属由 transportId 决定,不依赖写入顺序。 + /// + private void WriteResponse(BridgeFrameResponse response) + { + var line = JsonSerializer.Serialize(response, ContractJson.Options); + lock (_outputLock) + { + try + { + _output.WriteLine(line); + _output.Flush(); + } + catch (Exception ex) when (ex is IOException or ObjectDisposedException) + { + // 父进程已关闭管道:让读取循环自行观察到 EOF 并退出。 + } + } } private async Task> ExecuteAsync( BridgeRequest request, + Lane lane, CancellationToken cancellationToken) { var dataDirectory = ResolveDataDirectory(request.DataDir); @@ -82,44 +188,49 @@ private async Task> ExecuteAsync( try { - var connection = await EnsureConnectionAsync(dataDirectory, cancellationToken); + var connection = await EnsureConnectionAsync(lane, dataDirectory, cancellationToken); return await connection.InvokeAsync(ipcRequest, cancellationToken); } catch (Exception ex) when (IsConnectionFault(ex) && !cancellationToken.IsCancellationRequested) { - // 缓存的连接已失效(宿主重启/崩溃/断线):丢弃缓存、重建宿主后同一 requestId 重试一次。 + // 本 lane 的连接已失效(宿主重启/崩溃/断线):丢弃该连接、重建宿主后同一 requestId 重试一次。 // 写操作的重复由宿主持久收据保证;非连接类错误不重试,原样上抛。 - await DiscardConnectionAsync(); - var connection = await EnsureConnectionAsync(dataDirectory, cancellationToken); + await DiscardConnectionAsync(lane); + var connection = await EnsureConnectionAsync(lane, dataDirectory, cancellationToken); return await connection.InvokeAsync(ipcRequest, cancellationToken); } } - /// 取缓存连接;数据目录变化或缓存为空时用 EnsureStartedAsync 建立新连接。 - private async Task EnsureConnectionAsync(string dataDirectory, CancellationToken cancellationToken) + private async Task EnsureConnectionAsync( + Lane lane, + string dataDirectory, + CancellationToken cancellationToken) { - if (_connection is not null - && string.Equals(_dataDirectory, dataDirectory, StringComparison.OrdinalIgnoreCase)) + if (lane.Connection is not null + && string.Equals(lane.DataDirectory, dataDirectory, StringComparison.OrdinalIgnoreCase)) { - return _connection; + return lane.Connection; } - await DiscardConnectionAsync(); - _dataDirectory = dataDirectory; - _connection = await HostProcessLauncher.EnsureStartedAsync( + await DiscardConnectionAsync(lane); + var connection = await HostProcessLauncher.EnsureStartedAsync( dataDirectory, clientName: "tauri", timeout: TimeSpan.FromSeconds(10), cancellationToken, ClientPermissionProfiles.TauriBridge); - return _connection; + lane.DataDirectory = dataDirectory; + lane.StopDataDirectory = dataDirectory; + lane.Connection = connection; + return connection; } - /// 销毁缓存连接并置空;清理期的 IO/释放异常不得中断请求路径或退出流程。 - private async Task DiscardConnectionAsync() + /// 销毁指定 lane 的缓存连接并置空;清理期的 IO/释放异常不得中断请求路径或退出流程。 + private static async Task DiscardConnectionAsync(Lane lane) { - var connection = _connection; - _connection = null; + var connection = lane.Connection; + lane.Connection = null; + lane.DataDirectory = null; if (connection is null) { return; @@ -141,13 +252,29 @@ private async Task DiscardConnectionAsync() _ => false, }; + private static (string Code, string Message) MapTransportError(Exception ex) => ex switch + { + HostClientException host => (host.Code, host.Message), + JsonException or InvalidOperationException => (ErrorCodes.InvalidArgument, ex.Message), + _ => (ErrorCodes.HostUnavailable, ex.Message), + }; + /// Only stop the connected data scope; never start a Host merely to stop it. internal async Task StopHostAsync() { - var dataDirectory = _dataDirectory; + var dataDirectories = new[] { _ordinary.StopDataDirectory, _events.StopDataDirectory } + .OfType().Distinct(StringComparer.OrdinalIgnoreCase).ToArray(); // 先清理缓存连接:宿主会话即将结束,缓存的连接句柄不再可用。 - await DiscardConnectionAsync(); - if (dataDirectory is null) return; + await DiscardConnectionAsync(_ordinary); + await DiscardConnectionAsync(_events); + foreach (var dataDirectory in dataDirectories) + { + await StopConnectedHostAsync(dataDirectory); + } + } + + private static async Task StopConnectedHostAsync(string dataDirectory) + { using var timeout = new CancellationTokenSource(TimeSpan.FromSeconds(5)); try { @@ -182,19 +309,4 @@ private static string ResolveDataDirectory(string? requested) var localAppData = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData); return Path.Combine(localAppData, "GameLibrary"); } - - private static string TryGetRequestId(string line) - { - try - { - using var document = JsonDocument.Parse(line); - return document.RootElement.TryGetProperty("requestId", out var value) - ? value.GetString() ?? $"tauri-error-{Guid.NewGuid():N}" - : $"tauri-error-{Guid.NewGuid():N}"; - } - catch (JsonException) - { - return $"tauri-error-{Guid.NewGuid():N}"; - } - } } diff --git a/tests/GameLibrary.HeadlessE2ETests/HostStopE2ETests.cs b/tests/GameLibrary.HeadlessE2ETests/HostStopE2ETests.cs index fdc2224..3496f5c 100644 --- a/tests/GameLibrary.HeadlessE2ETests/HostStopE2ETests.cs +++ b/tests/GameLibrary.HeadlessE2ETests/HostStopE2ETests.cs @@ -36,7 +36,11 @@ public async Task DesktopBridge_StopsOnlyItsHost_OnParentExitOrInputClose(bool l { var init = await Send("library.init", new { idempotencyKey = "init" }); Assert.True(init.GetProperty("ok").GetBoolean()); - await bridge.StandardInput.WriteLineAsync(JsonSerializer.Serialize(new { dataDir, requestId = "wait", operationId = "events.wait", parameters = new { timeoutMs = 30000 } })); + await bridge.StandardInput.WriteLineAsync(JsonSerializer.Serialize(new + { + transportId = Guid.NewGuid().ToString("N"), + request = new { dataDir, requestId = "wait", operationId = "events.wait", parameters = new { timeoutMs = 30000 } }, + })); await bridge.StandardInput.FlushAsync(); parent.Kill(); // Only the owned test parent; Host must exit gracefully itself. await parent.WaitForExitAsync(); @@ -60,18 +64,31 @@ public async Task DesktopBridge_StopsOnlyItsHost_OnParentExitOrInputClose(bool l async Task Send(string operation, object parameters) { - await bridge.StandardInput.WriteLineAsync(JsonSerializer.Serialize(new { dataDir, requestId = Guid.NewGuid().ToString("N"), operationId = operation, parameters })); + var transportId = Guid.NewGuid().ToString("N"); + await bridge.StandardInput.WriteLineAsync(JsonSerializer.Serialize(new + { + transportId, + request = new + { + dataDir, + requestId = Guid.NewGuid().ToString("N"), + operationId = operation, + parameters, + }, + })); await bridge.StandardInput.FlushAsync(); var response = await bridge.StandardOutput.ReadLineAsync().WaitAsync(TimeSpan.FromSeconds(15)); Assert.NotNull(response); - return JsonDocument.Parse(response).RootElement.Clone(); + using var document = JsonDocument.Parse(response); + Assert.Equal(transportId, document.RootElement.GetProperty("transportId").GetString()); + return document.RootElement.GetProperty("result").Clone(); } } [Fact] public async Task Cli_HostStop_StopsHostGracefully() { - var runId = Path.Combine(@"D:\Official\GameLibrary\artifacts\test-runs", $"e2e-stop-{Guid.NewGuid():N}"); + var runId = Path.Combine(RepoRoot(), "artifacts", "test-runs", $"e2e-stop-{Guid.NewGuid():N}"); var dataDir = Path.Combine(runId, "data"); try { @@ -136,6 +153,19 @@ await Assert.ThrowsAsync( return (process.ExitCode, await stdout, await stderr); } + private static string RepoRoot() + { + var directory = new DirectoryInfo(AppContext.BaseDirectory); + while (directory is not null + && !File.Exists(Path.Combine(directory.FullName, "Directory.Build.props"))) + { + directory = directory.Parent; + } + + Assert.False(directory is null, "未找到仓库根(向上遍历未命中 Directory.Build.props)"); + return directory!.FullName; + } + private static void TryCleanup(string path) { try diff --git a/tests/GameLibrary.HeadlessE2ETests/TauriBridgeE2ETests.cs b/tests/GameLibrary.HeadlessE2ETests/TauriBridgeE2ETests.cs new file mode 100644 index 0000000..43e1521 --- /dev/null +++ b/tests/GameLibrary.HeadlessE2ETests/TauriBridgeE2ETests.cs @@ -0,0 +1,224 @@ +using System.Diagnostics; +using System.Text.Json; +using Xunit; + +namespace GameLibrary.HeadlessE2ETests; + +/// +/// 单 Bridge 进程、双 HostConnection 的真实宿主 E2E:events.wait 挂起时普通请求仍应返回, +/// 响应按 transportId 关联;关闭 stdin 后只停止自己的数据目录 Host。 +/// +public sealed class TauriBridgeE2ETests +{ + private static string CliExe => Path.Combine(AppContext.BaseDirectory, "gamelibrary.exe"); + + [Fact] + public async Task Bridge_LongPollDoesNotBlockOrdinaryRequest_AndCleansUpOnExit() + { + var runDir = Path.Combine(RepoRoot(), "artifacts", "test-runs", $"bridge-e2e-{Guid.NewGuid():N}"); + var dataDir = Path.Combine(runDir, "data"); + using var parent = Process.Start(new ProcessStartInfo( + Path.Combine(AppContext.BaseDirectory, "GameLibrary.TestProcessStub.exe"), "--hold-ms 60000") + { + UseShellExecute = false, + CreateNoWindow = true, + RedirectStandardOutput = true, + })!; + var start = new ProcessStartInfo(Path.Combine(AppContext.BaseDirectory, "GameLibrary.TauriBridge.exe")) + { + UseShellExecute = false, + CreateNoWindow = true, + RedirectStandardInput = true, + RedirectStandardOutput = true, + RedirectStandardError = true, + }; + start.ArgumentList.Add("--parent-pid"); + start.ArgumentList.Add(parent.Id.ToString()); + using var bridge = Process.Start(start)!; + try + { + var init = await SendAsync(bridge, dataDir, "library.init", new { idempotencyKey = "init" }); + Assert.True(init.GetProperty("ok").GetBoolean()); + + // 从当前游标开始长轮询,确保本次 events.wait 真的挂起而不是先读到历史事件。 + var baseline = await SendAsync(bridge, dataDir, "events.read", new { limit = 1 }); + var cursor = baseline.GetProperty("data").GetProperty("latestCursor").GetInt64(); + + // 先用 0ms 等待预热 events lane 连接,再验证长时间挂起时普通请求不被阻塞。 + var warm = await SendAsync(bridge, dataDir, "events.wait", + new { cursor, limit = 4096, timeoutMs = 0 }); + Assert.True(warm.GetProperty("ok").GetBoolean()); + + var waitTransport = Guid.NewGuid().ToString("N"); + await SendFrameAsync(bridge, waitTransport, dataDir, "events.wait", + new { cursor, limit = 4096, timeoutMs = 30000 }); + await Task.Delay(1000); + + var firstTransport = Guid.NewGuid().ToString("N"); + var firstRequest = await SendFrameAsync(bridge, firstTransport, dataDir, "host.status", new { }); + var first = await ReadFrameAsync(bridge, TimeSpan.FromSeconds(10)); + Assert.Equal(firstTransport, first.GetProperty("transportId").GetString()); + Assert.Equal(firstRequest, first.GetProperty("result").GetProperty("requestId").GetString()); + Assert.True(first.GetProperty("result").GetProperty("ok").GetBoolean()); + var hostPid = first.GetProperty("result").GetProperty("data").GetProperty("processId").GetInt32(); + + var secondTransport = Guid.NewGuid().ToString("N"); + var secondRequest = await SendFrameAsync(bridge, secondTransport, dataDir, "host.status", new { }); + var second = await ReadFrameAsync(bridge, TimeSpan.FromSeconds(10)); + Assert.Equal(secondTransport, second.GetProperty("transportId").GetString()); + Assert.Equal(secondRequest, second.GetProperty("result").GetProperty("requestId").GetString()); + + // A rejected directory must not replace the last successfully connected shutdown scope. + var invalidTransport = Guid.NewGuid().ToString("N"); + await SendFrameAsync(bridge, invalidTransport, "relative", "host.status", new { }); + var invalid = await ReadFrameAsync(bridge, TimeSpan.FromSeconds(10)); + Assert.Equal(invalidTransport, invalid.GetProperty("transportId").GetString()); + Assert.True(invalid.TryGetProperty("transportError", out _)); + + // stdin EOF:桥接必须取消挂起的长轮询、自行退出,并通过独立权限连接停掉自己的 Host。 + bridge.StandardInput.Close(); + using var bridgeDeadline = new CancellationTokenSource(TimeSpan.FromSeconds(10)); + await bridge.WaitForExitAsync(bridgeDeadline.Token); + Assert.Equal(0, bridge.ExitCode); + + try + { + using var host = Process.GetProcessById(hostPid); + using var hostDeadline = new CancellationTokenSource(TimeSpan.FromSeconds(10)); + await host.WaitForExitAsync(hostDeadline.Token); + Assert.Equal(0, host.ExitCode); + } + catch (ArgumentException) + { + // Host 已先行退出(快速时序)。 + } + } + finally + { + if (!bridge.HasExited) { bridge.Kill(); await bridge.WaitForExitAsync(); } + if (!parent.HasExited) { parent.Kill(); await parent.WaitForExitAsync(); } + await RunCliAsync("host", "stop", "--data-dir", dataDir, "--format", "json", "--no-start"); + TryCleanup(runDir); + } + } + + [Fact] + public async Task Bridge_TransportFailure_ReturnsTransportErrorFrame() + { + var start = new ProcessStartInfo(Path.Combine(AppContext.BaseDirectory, "GameLibrary.TauriBridge.exe")) + { + UseShellExecute = false, + CreateNoWindow = true, + RedirectStandardInput = true, + RedirectStandardOutput = true, + RedirectStandardError = true, + }; + using var bridge = Process.Start(start)!; + try + { + var transportId = Guid.NewGuid().ToString("N"); + await SendFrameAsync(bridge, transportId, "relative", "host.status", new { }); + var frame = await ReadFrameAsync(bridge, TimeSpan.FromSeconds(10)); + Assert.Equal(transportId, frame.GetProperty("transportId").GetString()); + Assert.False(frame.TryGetProperty("result", out _)); + Assert.Equal("ProtocolError", frame.GetProperty("transportError").GetProperty("code").GetString()); + } + finally + { + if (!bridge.HasExited) + { + bridge.StandardInput.Close(); + using var deadline = new CancellationTokenSource(TimeSpan.FromSeconds(10)); + await bridge.WaitForExitAsync(deadline.Token); + } + } + } + + private static async Task SendFrameAsync( + Process bridge, + string transportId, + string dataDir, + string operationId, + object parameters) + { + var requestId = Guid.NewGuid().ToString("N"); + await bridge.StandardInput.WriteLineAsync(JsonSerializer.Serialize(new + { + transportId, + request = new { dataDir, requestId, operationId, parameters }, + })); + await bridge.StandardInput.FlushAsync(); + return requestId; + } + + private static async Task SendAsync( + Process bridge, + string dataDir, + string operationId, + object parameters) + { + var transportId = Guid.NewGuid().ToString("N"); + await SendFrameAsync(bridge, transportId, dataDir, operationId, parameters); + var frame = await ReadFrameAsync(bridge, TimeSpan.FromSeconds(15)); + Assert.Equal(transportId, frame.GetProperty("transportId").GetString()); + return frame.GetProperty("result").Clone(); + } + + private static async Task ReadFrameAsync(Process bridge, TimeSpan timeout) + { + var line = await bridge.StandardOutput.ReadLineAsync().WaitAsync(timeout); + Assert.NotNull(line); + using var document = JsonDocument.Parse(line); + return document.RootElement.Clone(); + } + + private static async Task<(int ExitCode, string StdOut, string StdErr)> RunCliAsync(params string[] args) + { + var startInfo = new ProcessStartInfo + { + FileName = CliExe, + RedirectStandardOutput = true, + RedirectStandardError = true, + UseShellExecute = false, + CreateNoWindow = true, + WorkingDirectory = AppContext.BaseDirectory, + }; + foreach (var arg in args) + { + startInfo.ArgumentList.Add(arg); + } + + using var process = Process.Start(startInfo)!; + var stdout = process.StandardOutput.ReadToEndAsync(); + var stderr = process.StandardError.ReadToEndAsync(); + await process.WaitForExitAsync(); + return (process.ExitCode, await stdout, await stderr); + } + + private static string RepoRoot() + { + var directory = new DirectoryInfo(AppContext.BaseDirectory); + while (directory is not null + && !File.Exists(Path.Combine(directory.FullName, "Directory.Build.props"))) + { + directory = directory.Parent; + } + + Assert.False(directory is null, "未找到仓库根(向上遍历未命中 Directory.Build.props)"); + return directory!.FullName; + } + + private static void TryCleanup(string path) + { + try + { + if (Directory.Exists(path)) + { + Directory.Delete(path, recursive: true); + } + } + catch (IOException) + { + } + } +} From 319fc4830b7748f09e712f71c6d8c4e9a7a71948 Mon Sep 17 00:00:00 2001 From: AaronSu Date: Fri, 30 Oct 2026 15:43:03 +0800 Subject: [PATCH 14/29] fix(bridge): preserve owned Host cleanup on denied parent watch --- .../scripts/verify_release.mjs | 4 +-- src/GameLibrary.TauriBridge/Program.cs | 26 ++++++++++++++++--- 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/src/GameLibrary.Tauri/scripts/verify_release.mjs b/src/GameLibrary.Tauri/scripts/verify_release.mjs index b474f64..a62d9e8 100644 --- a/src/GameLibrary.Tauri/scripts/verify_release.mjs +++ b/src/GameLibrary.Tauri/scripts/verify_release.mjs @@ -6,7 +6,7 @@ import { verifyBatch } from "./verify_batch.mjs"; const [, , executableArgument, dataDirectoryArgument, screenshotArgument, gameDirectoryArgument] = process.argv; if (!executableArgument || !dataDirectoryArgument || !screenshotArgument) { - throw new Error("usage: node verify_release.mjs [game-directory]"); + throw new Error("usage: node verify_release.mjs [game-directory] [--batch-smoke] [--footprint]"); } const executable = path.resolve(executableArgument); @@ -194,7 +194,7 @@ try { if (!evaluated) throw new Error("release WebView evaluation did not complete"); if (evaluated.exceptionDetails) throw new Error(evaluated.exceptionDetails.text); const result = evaluated.result.value; - if (gameDirectoryArgument && gameDirectoryArgument !== "--batch-smoke") { + if (gameDirectoryArgument && !gameDirectoryArgument.startsWith("--")) { const opened = await client.send("Runtime.evaluate", { expression: `(async () => { const invoke = window.__TAURI__.core.invoke; diff --git a/src/GameLibrary.TauriBridge/Program.cs b/src/GameLibrary.TauriBridge/Program.cs index a8efd7d..baa55b3 100644 --- a/src/GameLibrary.TauriBridge/Program.cs +++ b/src/GameLibrary.TauriBridge/Program.cs @@ -1,3 +1,4 @@ +using System.ComponentModel; using System.Diagnostics; using System.Text; @@ -28,8 +29,11 @@ private static async Task Main(string[] args) finally { cancellation.Cancel(); - await parentWatch; - if (parentId is not null) await server.StopHostAsync(); + try { await parentWatch; } + finally + { + if (parentId is not null) await server.StopHostAsync(); + } } } @@ -38,10 +42,26 @@ private static async Task WatchParentAsync(int id, CancellationTokenSource cance try { using var parent = Process.GetProcessById(id); - await parent.WaitForExitAsync(cancellation.Token); + try { await parent.WaitForExitAsync(cancellation.Token); } + catch (Win32Exception ex) when (ex.NativeErrorCode == 5) + { + // WaitForExitAsync opens an all-access handle on Windows; the synchronous + // wait only needs SYNCHRONIZE. Never treat denied access as an exited parent. + // ponytail: one blocking worker only on this fallback; cancellation waits at most 250ms. + await Task.Run(() => + { + while (!parent.WaitForExit(250)) + cancellation.Token.ThrowIfCancellationRequested(); + }, cancellation.Token); + } cancellation.Cancel(); } catch (ArgumentException) { cancellation.Cancel(); } catch (OperationCanceledException) when (cancellation.IsCancellationRequested) { } + catch + { + cancellation.Cancel(); + throw; + } } } From 89f4c6e1dbededf82075cf6cd80756000c78d8b3 Mon Sep 17 00:00:00 2001 From: AaronSu Date: Fri, 30 Oct 2026 15:45:01 +0800 Subject: [PATCH 15/29] chore: record v1.8.2 baseline and refactor validation gaps --- Directory.Build.props | 2 +- docs/code-review-graph/architecture.md | 2 + docs/code-review-graph/rg02-footprint.json | 15 +++ docs/development/2026-10-29-rg02-plan.md | 10 ++ docs/development/2026-10-30-rg02-metrics.json | 114 ++++++++++++++++++ .../development/2026-10-30-rg02-validation.md | 86 +++++++++++++ src/GameLibrary.Tauri/package-lock.json | 4 +- src/GameLibrary.Tauri/package.json | 2 +- src/GameLibrary.Tauri/src-tauri/Cargo.lock | 2 +- src/GameLibrary.Tauri/src-tauri/Cargo.toml | 2 +- 10 files changed, 233 insertions(+), 6 deletions(-) create mode 100644 docs/code-review-graph/rg02-footprint.json create mode 100644 docs/development/2026-10-30-rg02-metrics.json create mode 100644 docs/development/2026-10-30-rg02-validation.md diff --git a/Directory.Build.props b/Directory.Build.props index 7533a25..914a4f4 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -12,7 +12,7 @@ true GameLibrary GameLibrary - 1.8.1 + 1.8.2 en-US diff --git a/docs/code-review-graph/architecture.md b/docs/code-review-graph/architecture.md index b8834cf..e8b89f4 100644 --- a/docs/code-review-graph/architecture.md +++ b/docs/code-review-graph/architecture.md @@ -6,6 +6,8 @@ Tauri Rust 壳改为一个 C# Bridge 进程。普通请求和 `events.wait` 各 2026-10-30 改以发布分支 `codex/release-v1.8.1` 的 `4f7da8a` 为基线,保留扫描边界、快捷方式去重及现有压缩发布修复。压缩收益已属于 v1.8.1,不重复计为本轮增量;本轮验收重点是单 Bridge 的并发与占用。验证记录见 [RG-02 记录](../development/2026-10-30-rg02-validation.md)。 +本 worktree 已于 2026-10-30 增量同步结构图谱:432 个文件、4,240 个节点、42,109 条关系;其中 CALLS 有 9,336 条直接解析、24,103 条未解析。没有安装嵌入模型或宣称全部调用已解析,数值见 [本轮快照](rg02-footprint.json)。下面的 2026-10-27 社区统计及 `architecture-overview.json` 保留为历史记录。 + ## 历史图谱快照(2026-10-27) 2026-10-27,主程序 v1.8.0,宣传网站 v1.5.0。基础提交为 `316e3759b8c7203ae4c631150d96787c2fdab3db`(`main`),图谱已按当前工作区增量同步,插件返回 `status: ok`,无增量解析错误。 diff --git a/docs/code-review-graph/rg02-footprint.json b/docs/code-review-graph/rg02-footprint.json new file mode 100644 index 0000000..30c8c25 --- /dev/null +++ b/docs/code-review-graph/rg02-footprint.json @@ -0,0 +1,15 @@ +{ + "snapshotAt": "2026-10-30T15:43:16", + "repo": "GameLibrary isolated RG-02 worktree", + "branch": "codex/optimize-footprint-v1.8.1", + "sourceHeadBeforeFinalCommit": "319fc4830b7748f09e712f71c6d8c4e9a7a71948", + "releaseBaseline": "4f7da8a072cf815d5c4ab1f647f1a4467bccc586", + "version": "1.8.2-unreleased", + "postprocess": "minimal", + "files": 432, + "nodes": 4240, + "edges": 42109, + "calls": { "direct": 9336, "unresolved": 24103 }, + "embeddings": 0, + "note": "Local incremental structural graph; unresolved calls are not validated relationships. Historical architecture-overview.json remains a dated snapshot." +} diff --git a/docs/development/2026-10-29-rg02-plan.md b/docs/development/2026-10-29-rg02-plan.md index b074bec..c048bbd 100644 --- a/docs/development/2026-10-29-rg02-plan.md +++ b/docs/development/2026-10-29-rg02-plan.md @@ -1,5 +1,15 @@ # RG-02:v1.8.1 体积与常驻内存优化 +## RG-02-r2:2026-10-30 基线更新 + +用户要求根据新发布的 v1.8.1 源码继续重构。已核对 GitHub main 仍为 `be8e143`,实际发布源码为 `origin/codex/release-v1.8.1` 的 `4f7da8a072cf815d5c4ab1f647f1a4467bccc586`。旧重构快照已保存在 `8b006c6`,新发布源码经 `d4c6700` 合入当前独立分支;扫描、去重、UI 徽标修复文件与发布源码逐文件一致。 + +后续版本登记为 v1.8.2(未发布),分支名称保持 `codex/optimize-footprint-v1.8.1`,不更改 main 或远端实现提交。原定范围、测试授权和数据隔离约束继续有效。 + +R1 压缩发布修复已被 v1.8.1 纳入,现作为新基线的一部分,不重复计算其磁盘收益。R2 单 Bridge 实现继续保留;R3 增加扫描边界、忽略规则和 Sidebar 的定向回归,旧 v1.8.0 体积/内存样本不用于新版增量比较。此前测试宿主/桌面启动出现的拒绝访问均保留为失败记录,不视为新基线验收结果。 + +以下是最初获批计划的历史记录。 + 2026-10-29,用户在本会话以 `PLEASE IMPLEMENT THIS PLAN:` 批准 RG-02。随后批准复制现有前端依赖到独立 worktree,不安装或升级依赖。 ## 范围与执行约定 diff --git a/docs/development/2026-10-30-rg02-metrics.json b/docs/development/2026-10-30-rg02-metrics.json new file mode 100644 index 0000000..2549c7d --- /dev/null +++ b/docs/development/2026-10-30-rg02-metrics.json @@ -0,0 +1,114 @@ +{ + "scope": "C# Bridge(s) + Host only; no Rust shell, WebView, game or parent monitor", + "method": { + "date": "2026-10-30", + "configuration": "Release self-contained compressed win-x64", + "fixture": "separate fresh empty libraries initialized with the same operation sequence", + "warmupSeconds": 30, + "samples": 7, + "targetIntervalSeconds": 5, + "clock": "elapsed seconds include synchronous CIM query time", + "startupMsMeaning": "Bridge/Host initialization, not desktop startup", + "replicates": 1 + }, + "baseline": { + "mode": "baseline", + "startupMs": 21765.155400000367, + "ordinaryDuringWaitMs": 6.256500000745291, + "bridgeCount": 2, + "samples": [ + { + "elapsed": 56.299898699999176, + "privateBytes": 129056768, + "workingSetBytes": 302669824, + "cpuSeconds": 2.734375 + }, + { + "elapsed": 63.0520233999996, + "privateBytes": 128778240, + "workingSetBytes": 302460928, + "cpuSeconds": 2.734375 + }, + { + "elapsed": 70.18412410000019, + "privateBytes": 128778240, + "workingSetBytes": 302460928, + "cpuSeconds": 2.734375 + }, + { + "elapsed": 76.69227890000184, + "privateBytes": 128471040, + "workingSetBytes": 302264320, + "cpuSeconds": 2.734375 + }, + { + "elapsed": 83.15910480000093, + "privateBytes": 128606208, + "workingSetBytes": 302788608, + "cpuSeconds": 2.796875 + }, + { + "elapsed": 89.90887460000158, + "privateBytes": 128532480, + "workingSetBytes": 302735360, + "cpuSeconds": 2.796875 + }, + { + "elapsed": 96.98299120000229, + "privateBytes": 128532480, + "workingSetBytes": 302735360, + "cpuSeconds": 2.796875 + } + ] + }, + "candidate": { + "mode": "candidate", + "startupMs": 17220.3139000012, + "ordinaryDuringWaitMs": 21.95190000202274, + "bridgeCount": 1, + "samples": [ + { + "elapsed": 54.715302300002804, + "privateBytes": 90759168, + "workingSetBytes": 220811264, + "cpuSeconds": 3.765625 + }, + { + "elapsed": 63.80671849999999, + "privateBytes": 90628096, + "workingSetBytes": 220745728, + "cpuSeconds": 3.765625 + }, + { + "elapsed": 71.4385672999997, + "privateBytes": 90324992, + "workingSetBytes": 220565504, + "cpuSeconds": 3.765625 + }, + { + "elapsed": 78.07167490000211, + "privateBytes": 90521600, + "workingSetBytes": 221020160, + "cpuSeconds": 3.796875 + }, + { + "elapsed": 85.04544119999991, + "privateBytes": 90447872, + "workingSetBytes": 220966912, + "cpuSeconds": 3.796875 + }, + { + "elapsed": 92.59117390000029, + "privateBytes": 90447872, + "workingSetBytes": 220966912, + "cpuSeconds": 3.796875 + }, + { + "elapsed": 99.63708419999966, + "privateBytes": 90353664, + "workingSetBytes": 220917760, + "cpuSeconds": 3.796875 + } + ] + } +} diff --git a/docs/development/2026-10-30-rg02-validation.md b/docs/development/2026-10-30-rg02-validation.md new file mode 100644 index 0000000..2ebc0d1 --- /dev/null +++ b/docs/development/2026-10-30-rg02-validation.md @@ -0,0 +1,86 @@ +# RG-02-r2:基于 v1.8.1 的单 Bridge 优化记录 + +2026-10-30。状态:实现已整合,完整验收未通过;未推送实现、打包或发布。 + +## 源码与范围 + +用户要求以修复严重扫描问题后的最新版继续。核对时 GitHub main 仍为 `be8e143`,已发布 v1.8.1 的源码位于 `codex/release-v1.8.1`,提交 `4f7da8a072cf815d5c4ab1f647f1a4467bccc586`。保留重构快照 `8b006c6` 后,以合并提交 `d4c6700` 纳入该发布分支。 + +工作分支仍为 `codex/optimize-footprint-v1.8.1`,版本字段改为 v1.8.2(未发布),避免与已有正式版本混淆。所有修改、构建和合成库均位于本独立 worktree;正式实例及其游戏库未操作。 + +相对上述发布源码,以下目录的源码差异检查为零:Application、Domain、Host、Infrastructure、Tauri 的前端 src、IntegrationTests、UnitTests。因此扫描根边界、ExactPath 子目录遍历、快捷方式去重、Unreal 身份保守判定、Folder.lnk 目录及 retirement 范围修复全部保留。源码一致性不替代测试执行。 + +## 改动 + +- 一个 C# Bridge,普通请求和 `events.wait` 各持有一条 HostConnection,两条通道分别串行、彼此并行。Rust 侧最多两个请求在途。 +- 私有 stdio 帧采用独立 `transportId` 关联乱序响应。Host 的业务 `requestId`、公共 IPC、权限配置、库身份/纪元校验和 SQLite schema 不变。 +- 超时、EOF、协议损坏失败当前进程的所有等待请求;每个进程拥有自己的待响应表,旧会话不能清理替代会话。Host 已返回的业务 Envelope 与传输失败分开,前端原有幂等键保留行为不变。 +- 退出时主动关闭 Bridge stdin;C# 取消阻塞读取与长轮询,仅向成功连接过的数据目录发送 `host.stop`。无效目录请求不覆盖退出范围。 +- 本机复现 `Process.WaitForExitAsync` 拒绝访问,导致原监视任务提前故障、退出清理被跳过。现仅对 Win32 错误 5 使用同步低权限等待,250ms 检查取消;监视异常也保证执行已连接 Host 的退出清理。未改变系统权限或提权。 +- 桌面脚本增加整棵进程树采样选项,Bridge 数量断言改为一个;测试输出路径不再指向 main。 + +低权限等待依据 .NET 10 的 [Process.Windows.cs](https://github.com/dotnet/runtime/blob/v10.0.0/src/libraries/System.Diagnostics.Process/src/System/Diagnostics/Process.Windows.cs):异步事件监视经 `GetOrOpenProcessHandle` 打开进程,同步 `WaitForExitCore` 仅请求 `SYNCHRONIZE`。本机最小诊断中异步等待抛出错误 5,而有限查询可正常读取存活状态。该修正不修改 VSTest 自身,因此不解决测试宿主的同类故障。 + +## 发布体积 + +R1 的单文件压缩与去除重复 publish 已纳入正式 v1.8.1,现在属于基线。普通用户载荷继续采用 Tauri 生成的 Host/Bridge,Tools 仍使用独立 Console Host,自包含方式、文件名和布局不变。 + +| 字节数 | v1.8.1 已发布基线 | v1.8.2 当前候选 | +| --- | ---: | ---: | +| Host | 40,671,974 | 40,671,953 | +| Bridge | 37,650,530 | 37,653,970 | +| 两个 sidecar 合计 | 78,322,504 | 78,325,923 | + +本轮相对 v1.8.1 增加 3,419 字节,未取得新的磁盘节省,不将“sidecar 合计下降”记为通过。此前相对 v1.8.0 的约 49.6% sidecar 缩减已属于 v1.8.1。没有生成安装器,也没有测量下载包大小,不能由单文件压缩推算下载收益。 + +基线来自既有 `GameLibrary-Portable-win-x64-v1.8.1.zip`,SHA-256 为 `d664cb57a1e76b510f6842146cd07545a511c5f8adfd5879be06fecc35dc4d70`,与发布清单一致。解压前核对 ZIP 项目仅为三个可执行文件与清单,解压到当前 worktree 的 `.tmp/rg02/v182/baseline-v181`。未生成或修改发布包。 + +## 验证状态 + +| 项目 | 结果与范围 | +| --- | --- | +| 关键修复源码一致性、git diff --check | 通过 | +| 前端 API、事件 hooks、Sidebar 定向测试 | 3 个文件,30 项通过 | +| 前端 TypeScript 检查 | 通过 | +| Rust Release 离线单元测试 | 7 项通过:乱序关联、迟到/断连清理、传输错误、坏帧及既有目录/图标测试 | +| C# Release 编译、压缩 sidecar publish | 通过;无新增依赖 | +| .NET Bridge/HostStop E2E | testhost 在用例启动前中止,0 项执行;不是测试通过 | +| 扫描边界、目录遍历、权限及 HostConnection 回归 | 尚未在本候选上执行成功;不可借用上游结果作为本轮通过记录 | +| 真实 stdio 协议辅助探针 | v1.8.1 两 Bridge 与候选单 Bridge 均能在长轮询期间响应普通请求;独立 transportId 与业务 requestId 均核对,使用中文临时路径 | +| 父进程退出/关闭 stdin 辅助探针 | 修正前超时,stderr 显示监视错误 5;修正后两种退出路径均为 Bridge 退出码 0、所属 Host 停止,另一临时库的 Host 保持运行 | +| 桌面 Release 编译 | 通过,独立测试 identifier `com.gamelibrary.desktop.rg02test`,`--no-bundle`,没有生成安装器;Vite 保留既有大 chunk 警告 | +| 桌面启动/整棵进程树对比 | 当前 v1.8.2 在 Tauri setup 阶段报拒绝访问(os error 5),退出码 3221226505,未出现 CDP 目标;失败,未取得整棵树样本 | + +VSTest 错误来自 `ProcessManager.OpenProcess` → `EnsureWatchingForExit` → `ProcessHelper.SetExitCallback`。原始 TRX 位于 `.tmp/rg02/v182/test-results/bridge-v182.trx`。未修改工具链、ACL、全局环境或安全策略。实际游戏运行、真实库扫描、安装与更新均未验证。 + +桌面错误日志为 `.tmp/rg02/v182/desktop-smoke.log`,构建日志为 `desktop-build.log`。失败发生于应用 setup,尚不能确定具体系统限制;不把它归为已排除的环境问题,也不将历史基线启动失败替代当前基线检查。此次仅启动测试 identifier,没有启动会与正式实例冲突的原版便携包。 + +## 占用测量边界 + +先用相同操作初始化独立空库,再预热 30 秒,采样 7 次,间隔目标 5 秒;CIM 查询使实际间隔约 6–7 秒。范围仅为 C# Bridge 与 Host,不含 Rust 桌面壳、WebView、游戏进程或父进程监视。各版本只有一轮,是探索性样本,不能作为整机或整个桌面应用的内存结论。 + +最终候选在桌面编译及退出探针全部结束后重新采样,样本见 [原始数值](2026-10-30-rg02-metrics.json)。相对同一 v1.8.1 基线的结果如下: + +| 指标 | v1.8.1 基线 | 最终候选 | +| --- | ---: | ---: | +| Bridge 数量(不含 Host) | 2 | 1 | +| Private Bytes 中位数 | 122.65 MiB | 86.26 MiB | +| Working Set 求和中位数 | 288.65 MiB | 210.68 MiB | +| 长轮询期间普通请求 | 6.26ms | 21.95ms | +| 采样区间 CPU 累计增量 | 0.0625s / 40.68s | 0.03125s / 44.92s | + +Private Bytes 下降 36.39 MiB(29.7%)。Working Set 含共享页重复计算,不代表独占物理内存。普通请求均在长轮询结束前返回;单次延迟和极少的 CPU 时间不足以判断性能提升。 + +初轮候选中位数为 85.28 MiB(约降 30.5%),采于父进程监视修正之前。修正后一次采样与桌面编译重叠,作为诊断保留,不纳入正式对比。各轮均未启用 `--parent-pid`;不能据此估计监视 fallback 的整机收益。初始化耗时不是桌面启动耗时,且受首次解压和缓存影响,不宣称启动加速。 + +任务日志均在 `.tmp/rg02/v182/`:正式辅助比较采用 `baseline-probe.log` 和 `candidate-verified.log`;初轮/重叠采样分别为 `candidate-probe.log`、`candidate-final-probe.log`。退出诊断与验证见 `exit-diagnostic2.log`、`exit-scoped.log` 和 `eof-verified.log`。探针收尾后再次检查,本 worktree 没有遗留 Bridge/Host 进程。 + +## 剩余验收与交付边界 + +仍需在可正常启动 VSTest/桌面的环境完成定向 IPC、权限、重连及扫描回归,验证桌面父进程退出、只清理所属 Host,以及整个桌面进程树的占用和启动时间。单元测试不能替代这些检查,辅助探针也不能替代桌面 E2E。若继续受环境限制,可运行任务目录中的 `manual-check.ps1`,它只针对当前 worktree 和合成库,并恢复调用进程的 TEMP/TMP。 + +该脚本使用 `--no-restore`,不安装或升级依赖;如果报缓存缺失,应先停下并确认依赖操作。自动验证仍有失败/未运行项,当前提交只是可审查的本地检查点,不是 v1.8.2 的发布验收结论。 + +压缩发布修正可单独回退,单 Bridge 改动也可单独回退;不涉及数据库迁移。main、正式安装和游戏数据均保留。实现提交只存本地,推送、合并、安装器与发布仍需另行授权。 + +本地检查点:`b1e6674` 为原 R1 发布修正,`8b006c6` 为单 Bridge 快照,`d4c6700` 合入正式 v1.8.1,`319fc48` 修正受限父进程监视及脚本参数。R3 的桌面/E2E 验收仍未完成,R4 的版本与文档登记只表示草稿准备完成。 diff --git a/src/GameLibrary.Tauri/package-lock.json b/src/GameLibrary.Tauri/package-lock.json index ccac156..59ec521 100644 --- a/src/GameLibrary.Tauri/package-lock.json +++ b/src/GameLibrary.Tauri/package-lock.json @@ -1,12 +1,12 @@ { "name": "gamelibrary-tauri", - "version": "1.8.1", + "version": "1.8.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "gamelibrary-tauri", - "version": "1.8.1", + "version": "1.8.2", "dependencies": { "@tailwindcss/vite": "^4.1.18", "@tauri-apps/api": "^2", diff --git a/src/GameLibrary.Tauri/package.json b/src/GameLibrary.Tauri/package.json index 2984dc6..b4608ab 100644 --- a/src/GameLibrary.Tauri/package.json +++ b/src/GameLibrary.Tauri/package.json @@ -1,7 +1,7 @@ { "name": "gamelibrary-tauri", "private": true, - "version": "1.8.1", + "version": "1.8.2", "type": "module", "scripts": { "dev": "vite", diff --git a/src/GameLibrary.Tauri/src-tauri/Cargo.lock b/src/GameLibrary.Tauri/src-tauri/Cargo.lock index 9bc53a1..cf88302 100644 --- a/src/GameLibrary.Tauri/src-tauri/Cargo.lock +++ b/src/GameLibrary.Tauri/src-tauri/Cargo.lock @@ -1162,7 +1162,7 @@ dependencies = [ [[package]] name = "gamelibrary-desktop" -version = "1.8.1" +version = "1.8.2" dependencies = [ "serde", "serde_json", diff --git a/src/GameLibrary.Tauri/src-tauri/Cargo.toml b/src/GameLibrary.Tauri/src-tauri/Cargo.toml index 3b5d442..4ddd49f 100644 --- a/src/GameLibrary.Tauri/src-tauri/Cargo.toml +++ b/src/GameLibrary.Tauri/src-tauri/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "gamelibrary-desktop" -version = "1.8.1" +version = "1.8.2" description = "GameLibrary Tauri desktop client" authors = ["GameLibrary contributors"] edition = "2021" From 46c1812e447238451bdda958ef6435e5d24d83dd Mon Sep 17 00:00:00 2001 From: AaronSu Date: Sat, 31 Oct 2026 11:09:49 +0800 Subject: [PATCH 16/29] perf(ui): window library rows and defer hidden-window refreshes --- .../Localization/ui.json | 5 ++ src/GameLibrary.Tauri/src-tauri/src/lib.rs | 15 +++- src/GameLibrary.Tauri/src/App.tsx | 30 ++++--- .../src/components/GameCard.test.tsx | 59 +++++++++++++- .../src/components/GameCard.tsx | 8 +- .../src/components/GameGrid.tsx | 39 +++++++--- .../UnityTranslationDialog.test.tsx | 47 ++++++++++- .../src/components/UnityTranslationDialog.tsx | 44 +++++++++-- .../src/lib/hooks/hooks.test.ts | 43 +++++++++- .../src/lib/hooks/useLibraryEvents.ts | 35 ++++++--- .../src/lib/hooks/useVirtualRows.test.ts | 19 +++++ .../src/lib/hooks/useVirtualRows.ts | 78 +++++++++++++++++++ .../src/lib/windowVisibility.test.ts | 63 +++++++++++++++ .../src/lib/windowVisibility.ts | 36 +++++++++ 14 files changed, 474 insertions(+), 47 deletions(-) create mode 100644 src/GameLibrary.Tauri/src/lib/hooks/useVirtualRows.test.ts create mode 100644 src/GameLibrary.Tauri/src/lib/hooks/useVirtualRows.ts create mode 100644 src/GameLibrary.Tauri/src/lib/windowVisibility.test.ts create mode 100644 src/GameLibrary.Tauri/src/lib/windowVisibility.ts diff --git a/src/GameLibrary.Contracts/Localization/ui.json b/src/GameLibrary.Contracts/Localization/ui.json index c040df7..5abd5c6 100644 --- a/src/GameLibrary.Contracts/Localization/ui.json +++ b/src/GameLibrary.Contracts/Localization/ui.json @@ -372,6 +372,11 @@ "Unknown", "不明" ], + "正在加载…": [ + "正在載入…", + "Loading…", + "読み込み中…" + ], "正在读取设置…": [ "正在讀取設定…", "Loading settings…", diff --git a/src/GameLibrary.Tauri/src-tauri/src/lib.rs b/src/GameLibrary.Tauri/src-tauri/src/lib.rs index bfd7d7d..3f9e03b 100644 --- a/src/GameLibrary.Tauri/src-tauri/src/lib.rs +++ b/src/GameLibrary.Tauri/src-tauri/src/lib.rs @@ -9,7 +9,7 @@ use std::sync::{Arc, Mutex}; use std::time::Duration; use tauri::menu::{Menu, MenuItem}; use tauri::tray::{MouseButton, MouseButtonState, TrayIconBuilder, TrayIconEvent}; -use tauri::{AppHandle, Manager, RunEvent, State, WindowEvent}; +use tauri::{AppHandle, Emitter, Manager, RunEvent, State, WindowEvent}; use tauri_plugin_opener::OpenerExt; #[cfg(target_os = "windows")] @@ -63,6 +63,7 @@ const CREATE_NO_WINDOW: u32 = 0x0800_0000; /// bridge 响应等待上限。响应通过 transportId 与请求配对;超时/读写失败/协议损坏按 /// 「bridge 失效」处理:同一进程的所有 pending 失败并杀掉进程,下次请求重新拉起。 const REQUEST_TIMEOUT: Duration = Duration::from_secs(120); +const WINDOW_VISIBILITY_EVENT: &str = "gamelibrary-window-visibility"; struct BridgeProcess { child: Mutex, @@ -544,6 +545,7 @@ fn show_main_window(app: AppHandle) { if let Some(window) = app.get_webview_window("main") { let _ = window.unminimize(); let _ = window.show(); + let _ = window.emit(WINDOW_VISIBILITY_EVENT, true); let _ = window.set_focus(); } } @@ -616,6 +618,13 @@ pub fn run() { Ok(()) }) .on_window_event(|window, event| { + if window.label() == "main" + && matches!(event, WindowEvent::Focused(_) | WindowEvent::Resized(_)) + { + let visible = window.is_visible().unwrap_or(true) + && !window.is_minimized().unwrap_or(false); + let _ = window.emit(WINDOW_VISIBILITY_EVENT, visible); + } if let WindowEvent::CloseRequested { api, .. } = event { if window.label() != "main" { return; @@ -626,7 +635,9 @@ pub fn run() { .is_some_and(|prefs| close_to_tray_enabled(&prefs)); if want_tray { api.prevent_close(); - let _ = window.hide(); + if window.hide().is_ok() { + let _ = window.emit(WINDOW_VISIBILITY_EVENT, false); + } } } }) diff --git a/src/GameLibrary.Tauri/src/App.tsx b/src/GameLibrary.Tauri/src/App.tsx index 87ba41c..79e9a37 100644 --- a/src/GameLibrary.Tauri/src/App.tsx +++ b/src/GameLibrary.Tauri/src/App.tsx @@ -1,5 +1,5 @@ import { t } from "./lib/i18n"; -import { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from "react"; +import { lazy, Suspense, useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from "react"; import { useLanguage } from "./lib/i18n"; import { AlertCircle, Bell } from "lucide-react"; import { open } from "@tauri-apps/plugin-dialog"; @@ -10,24 +10,26 @@ import { resolveSelectedGame } from "./lib/selection"; import type { CandidateItem, GameItem, ViewItem } from "./lib/types"; import { AppShell } from "./components/AppShell"; import { TitleBar } from "./components/TitleBar"; -import { DetailSheet } from "./components/DetailSheet"; import { GameGrid } from "./components/GameGrid"; import { TitleTranslationStatus } from "./components/TitleTranslationStatus"; import { useTitleTranslation } from "./lib/hooks/useTitleTranslation"; import type { ReviewOutcome } from "./lib/hooks/useCandidateReview"; import { UnityTranslationDialog, type UnityTranslationRequest, type UnityTranslationItem } from "./components/UnityTranslationDialog"; import { LibraryToolbar } from "./components/LibraryToolbar"; -import { ReviewList, type ReviewAction } from "./components/ReviewList"; -import { RootsPanel } from "./components/RootsPanel"; +import type { ReviewAction } from "./components/ReviewList"; import { ScanProgressBar } from "./components/ScanProgressBar"; -import { SettingsDialog } from "./components/SettingsDialog"; import { Sidebar, type Section } from "./components/Sidebar"; import { SimilarNotice, type SimilarNoticeData } from "./components/SimilarNotice"; -import { TagsPanel } from "./components/TagsPanel"; import { Button } from "./components/ui/button"; import { PromptDialog } from "./components/ui/prompt-dialog"; import { TooltipProvider } from "./components/ui/tooltip"; +const DetailSheet = lazy(() => import("./components/DetailSheet").then(module => ({ default: module.DetailSheet }))); +const SettingsDialog = lazy(() => import("./components/SettingsDialog").then(module => ({ default: module.SettingsDialog }))); +const ReviewList = lazy(() => import("./components/ReviewList").then(module => ({ default: module.ReviewList }))); +const RootsPanel = lazy(() => import("./components/RootsPanel").then(module => ({ default: module.RootsPanel }))); +const TagsPanel = lazy(() => import("./components/TagsPanel").then(module => ({ default: module.TagsPanel }))); + type PromptKind = "tag" | "view" | null; function App() { @@ -252,6 +254,7 @@ function App() { ); const heading = sectionHeading(section, filters, library.views); + const loadingPanel =

    {t("正在加载…")}

    ; return ( @@ -261,6 +264,8 @@ function App() {

    {heading}

    + + {library.notifications.length > 0 && section !== "pending" && (
    +
    setFocusedId((event.target as HTMLElement).closest("[data-game-id]")?.dataset.gameId ?? null)} + onBlurCapture={event => { + if (!(event.relatedTarget instanceof Node) || !event.currentTarget.contains(event.relatedTarget)) setFocusedId(null); + }} + style={{ overflowAnchor: "none" }}> {layout === "compact" ? ( -
      - {games.map((game) => { +
        + {rows.map(row => { + const game = games[row]; const playtime = formatPlaytime(game.playtimeMinutes) || t("{0} 分钟", 0); - return
      • + return
      • ) : ( -
        - {games.map((game) => ( +
        + {rows.flatMap(row => games.slice(row * viewport.columns, (row + 1) * viewport.columns).map((game, column) => ( +
        - ))} +
        + )))}
        )} +
        {loadingMore && {t("正在加载更多…")}} diff --git a/src/GameLibrary.Tauri/src/components/UnityTranslationDialog.test.tsx b/src/GameLibrary.Tauri/src/components/UnityTranslationDialog.test.tsx index 221a1ab..91566ea 100644 --- a/src/GameLibrary.Tauri/src/components/UnityTranslationDialog.test.tsx +++ b/src/GameLibrary.Tauri/src/components/UnityTranslationDialog.test.tsx @@ -3,9 +3,13 @@ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; import { useState } from "react"; import { UnityTranslationDialog } from "./UnityTranslationDialog"; -const api = vi.hoisted(() => ({ operation: vi.fn() })); +const api = vi.hoisted(() => ({ operation: vi.fn(), visibility: undefined as ((visible: boolean) => void) | undefined })); vi.mock("../lib/api", () => ({ operation: api.operation, describeFailure: (error: Error) => error.message })); vi.mock("@tauri-apps/plugin-dialog", () => ({ open: vi.fn() })); +vi.mock("../lib/windowVisibility", () => ({ watchWindowVisibility: (changed: (visible: boolean) => void) => { + api.visibility = changed; + return () => { api.visibility = undefined; }; +} })); let state = "configured"; const item = { gameId: "game", title: "示例游戏", attemptId: "attempt", state: "configured", provider: "deepseek", profileId: "profile", tagged: true }; @@ -26,7 +30,46 @@ beforeEach(() => { return { libraryInstanceId: "library", dataEpoch: "epoch", data: { items: [{ ...item, state }], needsSettings: false } }; }); }); -afterEach(cleanup); +afterEach(() => { cleanup(); vi.useRealTimers(); }); + +it("reduces idle status polling and resumes once when a hidden window is shown", async () => { + vi.useFakeTimers(); + render(); + await act(async () => {}); + api.operation.mockClear(); + await act(async () => { await vi.advanceTimersByTimeAsync(3000); }); + expect(api.operation).not.toHaveBeenCalled(); + act(() => api.visibility?.(false)); + await act(async () => { await vi.advanceTimersByTimeAsync(30000); }); + expect(api.operation).not.toHaveBeenCalled(); + await act(async () => api.visibility?.(true)); + expect(api.operation.mock.calls.filter(([id]) => id === "unity_translation.status")).toHaveLength(1); + await act(async () => { await vi.advanceTimersByTimeAsync(2500); }); + expect(api.operation.mock.calls.filter(([id]) => id === "unity_translation.status")).toHaveLength(1); + await act(async () => { await vi.advanceTimersByTimeAsync(27500); }); + expect(api.operation.mock.calls.filter(([id]) => id === "unity_translation.status")).toHaveLength(2); +}); + +it("rechecks immediately when an event arrives during an in-flight idle status read", async () => { + vi.useFakeTimers(); + let finish!: (value: unknown) => void; + let waiting = true; + const implementation = api.operation.getMockImplementation()!; + api.operation.mockImplementation(async (id: string, ...args: unknown[]) => { + if (id === "unity_translation.status" && waiting) { + waiting = false; + return new Promise(resolve => { finish = resolve; }); + } + return implementation(id, ...args); + }); + render(); + await act(async () => {}); + act(() => { window.dispatchEvent(new Event("gamelibrary-unity-changed")); }); + await act(async () => finish({ libraryInstanceId: "library", dataEpoch: "epoch", + data: { items: [{ ...item, state: "configured" }], needsSettings: false } })); + await act(async () => { await vi.advanceTimersByTimeAsync(0); }); + expect(api.operation.mock.calls.filter(([id]) => id === "unity_translation.status")).toHaveLength(2); +}); describe("Unity translation launch confirmation", () => { it("reports manual submission immediately and forwards the backend block without launching", async () => { diff --git a/src/GameLibrary.Tauri/src/components/UnityTranslationDialog.tsx b/src/GameLibrary.Tauri/src/components/UnityTranslationDialog.tsx index 08fdfe2..0579cf6 100644 --- a/src/GameLibrary.Tauri/src/components/UnityTranslationDialog.tsx +++ b/src/GameLibrary.Tauri/src/components/UnityTranslationDialog.tsx @@ -1,11 +1,15 @@ -import { useCallback, useEffect, useRef, useState } from "react"; +import { lazy, Suspense, useCallback, useEffect, useRef, useState } from "react"; import { open } from "@tauri-apps/plugin-dialog"; import { t } from "../lib/i18n"; import { describeFailure, operation } from "../lib/api"; +import { watchWindowVisibility } from "../lib/windowVisibility"; import { Button } from "./ui/button"; import { ConfirmDialog } from "./ui/confirm-dialog"; import { Sheet } from "./ui/sheet"; -import { UnityTranslationSettingsForm, type UnityProviderInput, type UnityProviderSettings } from "./UnityTranslationSettingsForm"; +import type { UnityProviderInput, UnityProviderSettings } from "./UnityTranslationSettingsForm"; + +const UnityTranslationSettingsForm = lazy(() => import("./UnityTranslationSettingsForm") + .then(module => ({ default: module.UnityTranslationSettingsForm }))); export interface UnityTranslationRequest { gameId: string; action: "configure" | "restore" } export interface UnityTranslationItem { @@ -40,6 +44,7 @@ export function UnityTranslationDialog({ enabled, settingsOpen, onCloseSettings, // 按 gameId 记录“已发出 configure、尚未返回”的游戏。同时配置多个游戏时各自独立, // 不能再用单个 gameId:后一个会覆盖前一个,前一个的乐观行就被服务端旧状态冲掉。 const pending = useRef>(new Set()); + const activeJobs = useRef(false); const callbacks = useRef({ onCloseSettings, onReviewHandled, onRequestHandled, onPlay, onChanged, onNavigate, onStatusChange }); callbacks.current = { onCloseSettings, onReviewHandled, onRequestHandled, onPlay, onChanged, onNavigate, onStatusChange }; @@ -56,6 +61,7 @@ export function UnityTranslationDialog({ enabled, settingsOpen, onCloseSettings, if (!Array.isArray(result.data?.items) || result.data.items.some(item => !item || [item.gameId, item.title, item.attemptId, item.state, item.provider].some(value => typeof value !== "string"))) throw new Error(t("翻译插件状态不完整,请刷新后重试")); + activeJobs.current = result.data.items.some(item => ACTIVE.has(item.state)); setStatus(previous => { // 每个仍在途的 configure 游戏都保留本地乐观行(服务端此刻可能还没有它的条目, // 或者返回的是配置前的旧状态);其余条目一律采用服务端最新结果。 @@ -84,18 +90,40 @@ export function UnityTranslationDialog({ enabled, settingsOpen, onCloseSettings, alive.current = true; let timer: ReturnType | undefined; let polling = false; + let visible = true; + let disposed = false; + let refreshPending = false; const poll = async () => { - if (polling || !alive.current) return; + if (polling || disposed || !alive.current || !visible) return; polling = true; + refreshPending = false; + let failed = false; try { await refresh(); } - catch (cause) { if (alive.current) setError(describeFailure(cause)); } - finally { polling = false; if (alive.current) timer = setTimeout(() => void poll(), 2500); } + catch (cause) { failed = true; if (!disposed && alive.current) setError(describeFailure(cause)); } + finally { + polling = false; + if (!disposed && alive.current && visible) + timer = setTimeout(() => void poll(), refreshPending ? 0 : failed || activeJobs.current || pending.current.size ? 2500 : 30000); + } + }; + const changed = () => { + clearTimeout(timer); + if (!visible) return; + refreshPending = true; + void poll(); void readSettings().catch(() => undefined); }; - const changed = () => { clearTimeout(timer); void poll(); void readSettings().catch(() => undefined); }; + const stopVisibility = watchWindowVisibility(value => { + visible = value; + clearTimeout(timer); + if (visible) changed(); + }); window.addEventListener("gamelibrary-unity-changed", changed); void readSettings().catch(cause => { if (alive.current) setError(describeFailure(cause)); }); void poll(); - return () => { alive.current = false; clearTimeout(timer); window.removeEventListener("gamelibrary-unity-changed", changed); }; + return () => { + disposed = true; alive.current = false; clearTimeout(timer); stopVisibility(); + window.removeEventListener("gamelibrary-unity-changed", changed); + }; }, [enabled, refresh, readSettings]); useEffect(() => { @@ -209,7 +237,7 @@ export function UnityTranslationDialog({ enabled, settingsOpen, onCloseSettings, {review.map(item =>
        {item.title}
        )} -
        : mode === "demo" || settings ? +
        : mode === "demo" || settings ? {t("正在加载…")}

        }>
        :

        {t("正在读取设置…")}

        } {mode === "settings" && } diff --git a/src/GameLibrary.Tauri/src/lib/hooks/hooks.test.ts b/src/GameLibrary.Tauri/src/lib/hooks/hooks.test.ts index faa8dc0..21a272b 100644 --- a/src/GameLibrary.Tauri/src/lib/hooks/hooks.test.ts +++ b/src/GameLibrary.Tauri/src/lib/hooks/hooks.test.ts @@ -10,8 +10,15 @@ import { emptyFilters } from "../state"; import { OperationError } from "../api"; import type { CandidateItem, GameItem, LibraryEvent, RootItem } from "../types"; -const { call, invalidate, show } = vi.hoisted(() => ({ +const { call, invalidate, show, visibility } = vi.hoisted(() => ({ call: vi.fn(), invalidate: vi.fn(), show: vi.fn(), + visibility: { current: undefined as ((visible: boolean) => void) | undefined }, +})); +vi.mock("../windowVisibility", () => ({ + watchWindowVisibility: (changed: (visible: boolean) => void) => { + visibility.current = changed; + return () => { visibility.current = undefined; }; + }, })); vi.mock("../api", async importOriginal => ({ ...await importOriginal(), operation: call, invalidateAssets: invalidate, showMainWindow: show, @@ -160,6 +167,40 @@ it("rebuilds the cursor baseline after an epoch or cursor error", async () => { expect(refresh).toHaveBeenCalledTimes(2); }); +it("coalesces hidden-window refreshes while continuing events and launch-exit wakeup", async () => { + let reply!: (value: unknown) => void; + let cursor = 10; + call.mockImplementation(async (name: string) => name === "events.read" + ? envelope({ nextCursor: 1, latestCursor: cursor, items: [] }) + : new Promise(resolve => { reply = resolve; })); + const initialize = vi.fn(async () => {}); + const supports = () => true; + const refresh = vi.fn(async (_domains?: readonly string[]) => {}); + const bump = vi.fn(); + const exit = vi.fn(); + renderHook(() => useLibraryEvents(initialize, supports, refresh, bump, exit)); + await act(async () => {}); + refresh.mockClear(); bump.mockClear(); show.mockClear(); + act(() => visibility.current?.(false)); + const publish = async (items: LibraryEvent[]) => { + await act(async () => reply(envelope({ nextCursor: ++cursor, items }))); + await act(async () => { await vi.advanceTimersByTimeAsync(1); }); + }; + await publish([{ type: "game.updated", sequence: 11 }]); + await publish([{ type: "tag.updated", sequence: 12 }]); + await act(async () => { await vi.advanceTimersByTimeAsync(1000); }); + expect(refresh).not.toHaveBeenCalled(); + expect(bump).not.toHaveBeenCalled(); + await publish([{ type: "launch.exited", sequence: 13, payload: { gameId: "game", attemptId: "attempt" } }]); + expect(exit).toHaveBeenCalledOnce(); + expect(show).toHaveBeenCalledOnce(); + expect(refresh).not.toHaveBeenCalled(); + await act(async () => visibility.current?.(true)); + expect(refresh).toHaveBeenCalledOnce(); + expect(new Set(refresh.mock.calls[0][0])).toEqual(new Set(["games", "tags"])); + expect(bump).toHaveBeenCalledOnce(); +}); + it("preserves loaded pages on invalidation and drops responses for replaced filters", async () => { call.mockImplementation(async (_operation: string, params: { offset: number; sort: string }) => envelope({ total: 120, items: Array.from({ length: 60 }, (_, i) => game(params.offset + i)) })); diff --git a/src/GameLibrary.Tauri/src/lib/hooks/useLibraryEvents.ts b/src/GameLibrary.Tauri/src/lib/hooks/useLibraryEvents.ts index 1b2e0da..2350b0c 100644 --- a/src/GameLibrary.Tauri/src/lib/hooks/useLibraryEvents.ts +++ b/src/GameLibrary.Tauri/src/lib/hooks/useLibraryEvents.ts @@ -3,6 +3,7 @@ import { invalidateAssetChanges, invalidateAssets, operation, OperationError, sh import type { LibraryEvent } from "../types"; import type { LaunchExitNotice } from "../state"; import { ALL_DOMAINS, type DataDomain } from "./useLibraryMetadata"; +import { watchWindowVisibility } from "../windowVisibility"; export function affectedDomains(events: readonly LibraryEvent[]): Set { const domains = new Set(); @@ -28,10 +29,12 @@ export function useLibraryEvents( const nonce = useRef(0); useEffect(() => { let cancelled = false; + let visible = true; let cursor: number | undefined; let pollTimer: ReturnType | undefined; let refreshTimer: ReturnType | undefined; const pending = new Set(); + const notices = new Set(); const read = async (baseline = false) => { const result = await operation<{ nextCursor: number; latestCursor?: number; items: LibraryEvent[] }>( !baseline && supports("events.wait") ? "events.wait" : "events.read", @@ -44,28 +47,39 @@ export function useLibraryEvents( cursor = undefined; await initialize(); await read(true); - if (!cancelled) window.dispatchEvent(new Event("gamelibrary-settings-changed")); - if (!cancelled) { await refreshDomains(ALL_DOMAINS); if (!cancelled) bump(); } + if (!cancelled) { + notices.add("gamelibrary-settings-changed"); + for (const domain of ALL_DOMAINS) pending.add(domain); + await flush(); + } }; - const flush = () => { + const flush = async () => { refreshTimer = undefined; + if (cancelled || !visible) return; const domains = [...pending]; pending.clear(); - if (cancelled) return; + for (const notice of notices) window.dispatchEvent(new Event(notice)); + notices.clear(); if (domains.includes("games")) bump(); - void refreshDomains(domains); + if (domains.length) await refreshDomains(domains); }; + const stopVisibility = watchWindowVisibility(value => { + visible = value; + clearTimeout(refreshTimer); + refreshTimer = undefined; + if (visible && (pending.size || notices.size)) void flush(); + }); const poll = async () => { let failed = false; try { const batch = await read(); if (!batch || cancelled) return; if (batch.items.some(event => event.type.startsWith("settings."))) - window.dispatchEvent(new Event("gamelibrary-settings-changed")); + notices.add("gamelibrary-settings-changed"); if (batch.items.some(event => event.type.startsWith("unity_translation."))) - window.dispatchEvent(new Event("gamelibrary-unity-changed")); + notices.add("gamelibrary-unity-changed"); if (batch.items.some(event => event.type.startsWith("mtool."))) - window.dispatchEvent(new Event("gamelibrary-mtool-changed")); + notices.add("gamelibrary-mtool-changed"); for (const event of batch.items) if (event.type.startsWith("asset.")) invalidateAssetChanges(event.payload); for (const event of batch.items) { @@ -80,7 +94,8 @@ export function useLibraryEvents( void showMainWindow(); } for (const domain of affectedDomains(batch.items)) pending.add(domain); - if (pending.size && refreshTimer === undefined) refreshTimer = setTimeout(flush, 250); + if (visible && (pending.size || notices.size) && refreshTimer === undefined) + refreshTimer = setTimeout(() => void flush(), 250); } catch (cause) { failed = true; if (cause instanceof OperationError && ["CursorExpired", "DataEpochMismatch", "LibraryInstanceMismatch"].includes(cause.code)) { @@ -96,7 +111,9 @@ export function useLibraryEvents( cancelled = true; clearTimeout(pollTimer); clearTimeout(refreshTimer); + stopVisibility(); pending.clear(); + notices.clear(); }; }, [initialize, supports, refreshDomains, bump, setLaunchExit]); } diff --git a/src/GameLibrary.Tauri/src/lib/hooks/useVirtualRows.test.ts b/src/GameLibrary.Tauri/src/lib/hooks/useVirtualRows.test.ts new file mode 100644 index 0000000..7161226 --- /dev/null +++ b/src/GameLibrary.Tauri/src/lib/hooks/useVirtualRows.test.ts @@ -0,0 +1,19 @@ +import { expect, it } from "vitest"; +import { virtualRowIndices, visibleRowRange } from "./useVirtualRows"; + +it("bounds a large library to viewport rows and pins only the focused row", () => { + const range = visibleRowRange(10000, 100, 5000, 600); + expect(range).toEqual({ first: 47, last: 59 }); + const rows = virtualRowIndices(range.first, range.last, 0, 10000); + expect(rows).toHaveLength(13); + expect(rows[0]).toBe(0); + expect(rows.at(-1)).toBe(58); + expect(virtualRowIndices(47, 59, 50, 10000)).toHaveLength(12); +}); + +it("keeps empty, short, and shortened libraries within valid indices", () => { + expect(visibleRowRange(0, 100, 5000, 600)).toEqual({ first: 0, last: 0 }); + expect(visibleRowRange(1, 100, 5000, 600)).toEqual({ first: 0, last: 1 }); + expect(virtualRowIndices(0, 0, 4, 0)).toEqual([]); + expect(visibleRowRange(2, 100, -1000, 600)).toEqual({ first: 0, last: 1 }); +}); diff --git a/src/GameLibrary.Tauri/src/lib/hooks/useVirtualRows.ts b/src/GameLibrary.Tauri/src/lib/hooks/useVirtualRows.ts new file mode 100644 index 0000000..8e9ebe9 --- /dev/null +++ b/src/GameLibrary.Tauri/src/lib/hooks/useVirtualRows.ts @@ -0,0 +1,78 @@ +import { useLayoutEffect, useRef, useState, type RefObject } from "react"; + +const OVERSCAN = 3; + +export function visibleRowRange(total: number, stride: number, top: number, height: number) { + if (total === 0) return { first: 0, last: 0 }; + const first = Math.min(total - 1, Math.max(0, Math.floor(top / stride) - OVERSCAN)); + const last = Math.max(first + 1, Math.min(total, Math.ceil((top + height) / stride) + OVERSCAN)); + return { first, last }; +} + +export function virtualRowIndices(first: number, last: number, focused: number, total: number) { + const rows = Array.from({ length: Math.max(0, last - first) }, (_, index) => first + index); + // Keep the focused row mounted when the user scrolls with a mouse or touchpad. + if (focused >= 0 && focused < total && (focused < first || focused >= last)) rows.push(focused); + return rows.sort((a, b) => a - b); +} + +// ponytail: rows share a measured height; use per-row measurement if variable-height cards are introduced. +export function useVirtualRows( + count: number, + layout: "grid" | "compact", + enabled: boolean, + scrollRoot?: RefObject, +) { + const container = useRef(null); + const [viewport, setViewport] = useState({ columns: 1, stride: 320, first: 0, last: 8 }); + const gap = layout === "grid" ? 16 : 8; + + // Re-measure after commits as well: a batch-action bar can change the list's offset. + useLayoutEffect(() => { + const node = container.current; + if (!enabled || !node) return; + const root = scrollRoot?.current ?? node.closest("main"); + let frame = 0; + const measure = () => { + frame = 0; + const grid = node.querySelector("[data-virtual-grid]"); + const item = node.querySelector("[data-virtual-item]"); + if (!item) return; + const tracks = grid ? getComputedStyle(grid).gridTemplateColumns : "none"; + const columns = layout === "grid" && tracks && tracks !== "none" ? tracks.split(/\s+/).length : 1; + const measuredHeight = item.getBoundingClientRect().height; + const stride = measuredHeight > 0 ? measuredHeight + gap : layout === "compact" ? 96 : 320; + const top = (root ? root.getBoundingClientRect().top + root.clientTop : 0) - node.getBoundingClientRect().top; + const height = root?.clientHeight || globalThis.innerHeight || 800; + const range = visibleRowRange(Math.ceil(count / columns), stride, top, height); + setViewport(previous => previous.columns === columns && previous.stride === stride + && previous.first === range.first && previous.last === range.last + ? previous : { columns, stride, ...range }); + }; + const schedule = () => { + if (!frame) frame = requestAnimationFrame(measure); + }; + const source = root ?? globalThis; + source.addEventListener("scroll", schedule, { passive: true }); + globalThis.addEventListener("resize", schedule); + const observer = typeof ResizeObserver === "undefined" ? undefined : new ResizeObserver(schedule); + observer?.observe(node); + if (root) observer?.observe(root); + const item = node.querySelector("[data-virtual-item]"); + if (item) observer?.observe(item); + measure(); + return () => { + source.removeEventListener("scroll", schedule); + globalThis.removeEventListener("resize", schedule); + observer?.disconnect(); + if (frame) cancelAnimationFrame(frame); + }; + }); + + const columns = layout === "compact" ? 1 : viewport.columns; + const total = Math.ceil(count / columns); + const first = Math.min(viewport.first, Math.max(0, total - 1)); + const last = Math.min(total, Math.max(first + 1, viewport.last)); + return { container, columns, total, first, last, stride: viewport.stride, + height: Math.max(0, total * viewport.stride - gap) }; +} diff --git a/src/GameLibrary.Tauri/src/lib/windowVisibility.test.ts b/src/GameLibrary.Tauri/src/lib/windowVisibility.test.ts new file mode 100644 index 0000000..4d81482 --- /dev/null +++ b/src/GameLibrary.Tauri/src/lib/windowVisibility.test.ts @@ -0,0 +1,63 @@ +import { afterEach, beforeEach, expect, it, vi } from "vitest"; +import { watchWindowVisibility } from "./windowVisibility"; + +const native = vi.hoisted(() => ({ + enabled: true, + callback: undefined as ((event: { payload: boolean }) => void) | undefined, + stop: vi.fn(), visible: vi.fn(), minimized: vi.fn(), listen: vi.fn(), +})); +vi.mock("@tauri-apps/api/core", () => ({ isTauri: () => native.enabled })); +vi.mock("@tauri-apps/api/event", () => ({ listen: native.listen })); +vi.mock("@tauri-apps/api/window", () => ({ getCurrentWindow: () => ({ isVisible: native.visible, isMinimized: native.minimized }) })); +beforeEach(() => { + native.enabled = true; + native.stop.mockReset(); native.visible.mockReset(); native.minimized.mockReset(); native.listen.mockReset(); + native.visible.mockResolvedValue(true); native.minimized.mockResolvedValue(false); + native.listen.mockImplementation(async (_name, callback: typeof native.callback) => { + native.callback = callback; + return native.stop; + }); +}); +afterEach(() => vi.restoreAllMocks()); + +it("keeps a newer native hide event instead of a late visible snapshot and deduplicates state", async () => { + let finish!: (value: boolean) => void; + native.visible.mockImplementation(() => new Promise(resolve => { finish = resolve; })); + const changed = vi.fn(); + const stop = watchWindowVisibility(changed); + await Promise.resolve(); + native.callback?.({ payload: false }); + native.callback?.({ payload: false }); + finish(true); + await Promise.resolve(); await Promise.resolve(); + expect(changed.mock.calls).toEqual([[false]]); + native.callback?.({ payload: true }); + expect(changed.mock.calls).toEqual([[false], [true]]); + stop(); + native.callback?.({ payload: false }); + expect(changed).toHaveBeenCalledTimes(2); + expect(native.stop).toHaveBeenCalledOnce(); +}); + +it("removes a native listener that finishes registering after disposal", async () => { + let ready!: (stop: () => void) => void; + native.listen.mockImplementation(() => new Promise(resolve => { ready = resolve; })); + const stop = watchWindowVisibility(vi.fn()); + stop(); ready(native.stop); + await Promise.resolve(); + expect(native.stop).toHaveBeenCalledOnce(); + expect(native.visible).not.toHaveBeenCalled(); +}); + +it("uses document visibility in browser mode", () => { + native.enabled = false; + const hidden = vi.spyOn(document, "hidden", "get").mockReturnValue(true); + const changed = vi.fn(); + const stop = watchWindowVisibility(changed); + document.dispatchEvent(new Event("visibilitychange")); + hidden.mockReturnValue(false); + document.dispatchEvent(new Event("visibilitychange")); + expect(changed.mock.calls).toEqual([[false], [true]]); + expect(native.listen).not.toHaveBeenCalled(); + stop(); +}); diff --git a/src/GameLibrary.Tauri/src/lib/windowVisibility.ts b/src/GameLibrary.Tauri/src/lib/windowVisibility.ts new file mode 100644 index 0000000..973a17d --- /dev/null +++ b/src/GameLibrary.Tauri/src/lib/windowVisibility.ts @@ -0,0 +1,36 @@ +import { isTauri } from "@tauri-apps/api/core"; +import { listen } from "@tauri-apps/api/event"; +import { getCurrentWindow } from "@tauri-apps/api/window"; + +/** Native hide/minimize state, not focus: an unfocused window may still be visible. */ +export function watchWindowVisibility(changed: (visible: boolean) => void) { + let active = true; + let revision = 0; + let lastVisible = true; + const native = isTauri(); + let unlisten: (() => void) | undefined; + const publish = (visible: boolean) => { + revision++; + if (active && visible !== lastVisible) { + lastVisible = visible; + changed(visible); + } + }; + const fromDocument = () => { if (!native) publish(!document.hidden); }; + document.addEventListener("visibilitychange", fromDocument); + if (native) { + void listen("gamelibrary-window-visibility", event => publish(event.payload)).then(async stop => { + if (!active) { stop(); return; } + unlisten = stop; + const snapshot = revision; + const current = getCurrentWindow(); + const [visible, minimized] = await Promise.all([current.isVisible(), current.isMinimized()]); + if (active && snapshot === revision) publish(visible && !minimized); + }).catch(() => { /* Keep ordinary refresh working if native visibility is unavailable. */ }); + } else fromDocument(); + return () => { + active = false; + document.removeEventListener("visibilitychange", fromDocument); + unlisten?.(); + }; +} From d3d738798bc52a41744b5f6f6dd64cf6c5cc8472 Mon Sep 17 00:00:00 2001 From: AaronSu Date: Sat, 31 Oct 2026 11:09:53 +0800 Subject: [PATCH 17/29] perf(bridge): generate wire JSON metadata and prepare NativeAOT profile --- src/GameLibrary.Contracts/Ipc/IpcFrame.cs | 11 ++++ .../Ipc/IpcJsonContext.cs | 24 ++++++++ src/GameLibrary.HostClient/HostConnection.cs | 11 +++- .../BridgeJsonContext.cs | 17 ++++++ src/GameLibrary.TauriBridge/BridgeServer.cs | 8 ++- .../PublishProfiles/NativeAot.pubxml | 11 ++++ .../HostConnectionRecoveryTests.cs | 32 +++++++++- .../IpcJsonSerializationTests.cs | 60 +++++++++++++++++++ 8 files changed, 166 insertions(+), 8 deletions(-) create mode 100644 src/GameLibrary.Contracts/Ipc/IpcJsonContext.cs create mode 100644 src/GameLibrary.TauriBridge/BridgeJsonContext.cs create mode 100644 src/GameLibrary.TauriBridge/Properties/PublishProfiles/NativeAot.pubxml create mode 100644 tests/GameLibrary.IntegrationTests/IpcJsonSerializationTests.cs diff --git a/src/GameLibrary.Contracts/Ipc/IpcFrame.cs b/src/GameLibrary.Contracts/Ipc/IpcFrame.cs index d078550..92d7f23 100644 --- a/src/GameLibrary.Contracts/Ipc/IpcFrame.cs +++ b/src/GameLibrary.Contracts/Ipc/IpcFrame.cs @@ -1,5 +1,6 @@ using System.Buffers.Binary; using System.Text; +using System.Text.Json.Serialization.Metadata; namespace GameLibrary.Contracts.Ipc; @@ -50,6 +51,9 @@ public static async Task ReadAsync(Stream stream, CancellationToken ct) public static Task WriteJsonAsync(Stream stream, T value, CancellationToken ct) => WriteAsync(stream, System.Text.Json.JsonSerializer.SerializeToUtf8Bytes(value, ContractJson.Options), ct); + public static Task WriteJsonAsync(Stream stream, T value, JsonTypeInfo typeInfo, CancellationToken ct) => + WriteAsync(stream, System.Text.Json.JsonSerializer.SerializeToUtf8Bytes(value, typeInfo), ct); + public static async Task ReadJsonAsync(Stream stream, CancellationToken ct) { var payload = await ReadAsync(stream, ct); @@ -57,6 +61,13 @@ public static async Task ReadJsonAsync(Stream stream, CancellationToken ct ?? throw new InvalidDataException("IPC JSON 载荷反序列化为 null"); } + public static async Task ReadJsonAsync(Stream stream, JsonTypeInfo typeInfo, CancellationToken ct) + { + var payload = await ReadAsync(stream, ct); + return System.Text.Json.JsonSerializer.Deserialize(payload, typeInfo) + ?? throw new InvalidDataException("IPC JSON 载荷反序列化为 null"); + } + private static async Task ReadExactAsync(Stream stream, Memory buffer, CancellationToken ct) { var total = 0; diff --git a/src/GameLibrary.Contracts/Ipc/IpcJsonContext.cs b/src/GameLibrary.Contracts/Ipc/IpcJsonContext.cs new file mode 100644 index 0000000..ba1bac4 --- /dev/null +++ b/src/GameLibrary.Contracts/Ipc/IpcJsonContext.cs @@ -0,0 +1,24 @@ +using System.Text.Json; +using System.Text.Json.Serialization; + +namespace GameLibrary.Contracts.Ipc; + +/// Known client wire types, with the same naming, null and enum rules as ContractJson. +[JsonSourceGenerationOptions(GenerationMode = JsonSourceGenerationMode.Metadata, + PropertyNamingPolicy = JsonKnownNamingPolicy.CamelCase, PropertyNameCaseInsensitive = true, + NumberHandling = JsonNumberHandling.AllowReadingFromString)] +[JsonSerializable(typeof(IpcRequest))] +[JsonSerializable(typeof(HandshakeRequest))] +[JsonSerializable(typeof(HandshakeResponse))] +[JsonSerializable(typeof(Envelope), TypeInfoPropertyName = "JsonEnvelope")] +public partial class IpcJsonContext : JsonSerializerContext +{ + public static IpcJsonContext Wire { get; } = new(CreateWireOptions()); + + public static JsonSerializerOptions CreateWireOptions() + { + var options = new JsonSerializerOptions(JsonSerializerDefaults.Web); + options.Converters.Add(new JsonStringEnumConverter(JsonNamingPolicy.CamelCase, allowIntegerValues: false)); + return options; + } +} diff --git a/src/GameLibrary.HostClient/HostConnection.cs b/src/GameLibrary.HostClient/HostConnection.cs index ae4585e..b5c270e 100644 --- a/src/GameLibrary.HostClient/HostConnection.cs +++ b/src/GameLibrary.HostClient/HostConnection.cs @@ -105,13 +105,17 @@ public async Task> InvokeAsync(IpcRequest request, Cancell await EnsureConnectedAsync(ct); if (request.LibraryInstanceId is null && Handshake.LibraryInstanceId is not null && OperationCatalog.Catalog.Find(request.OperationId)?.RequiresIdempotencyKey == true) + { + using var nullData = JsonDocument.Parse("null"); return new Envelope { RequestId = request.RequestId, Ok = false, Status = OperationStatus.Failed, + Data = nullData.RootElement.Clone(), Error = new RequestError { Code = ErrorCodes.LibraryInstanceMismatch, Message = "库实例已变化,请重新读取状态后准备新的操作", Retryable = false }, }; + } } } } @@ -126,8 +130,8 @@ private async Task> InvokeOnceAsync( { try { - await IpcFrame.WriteJsonAsync(pipe, request, ct); - var envelope = await IpcFrame.ReadJsonAsync>(pipe, ct); + await IpcFrame.WriteJsonAsync(pipe, request, IpcJsonContext.Wire.IpcRequest, ct); + var envelope = await IpcFrame.ReadJsonAsync(pipe, IpcJsonContext.Wire.JsonEnvelope, ct); if (!string.Equals(envelope.RequestId, request.RequestId, StringComparison.Ordinal)) throw new HostClientException(HostClientErrorCodes.ProtocolError, $"响应 requestId 不匹配:期望 {request.RequestId},收到 {envelope.RequestId}"); @@ -197,8 +201,9 @@ private async Task HandshakeAsync(string? clientName, CancellationToken ct) await IpcFrame.WriteJsonAsync( pipe, new HandshakeRequest { ClientName = clientName, Permissions = _permissions }, + IpcJsonContext.Wire.HandshakeRequest, ct); - var response = await IpcFrame.ReadJsonAsync(pipe, ct); + var response = await IpcFrame.ReadJsonAsync(pipe, IpcJsonContext.Wire.HandshakeResponse, ct); if (!string.Equals(response.ApiVersion, ApiConstants.ApiVersion, StringComparison.Ordinal)) { diff --git a/src/GameLibrary.TauriBridge/BridgeJsonContext.cs b/src/GameLibrary.TauriBridge/BridgeJsonContext.cs new file mode 100644 index 0000000..f2fdf1b --- /dev/null +++ b/src/GameLibrary.TauriBridge/BridgeJsonContext.cs @@ -0,0 +1,17 @@ +using System.Text.Json.Serialization; +using GameLibrary.Contracts.Ipc; + +namespace GameLibrary.TauriBridge; + +[JsonSourceGenerationOptions(GenerationMode = JsonSourceGenerationMode.Metadata, + PropertyNamingPolicy = JsonKnownNamingPolicy.CamelCase, PropertyNameCaseInsensitive = true, + NumberHandling = JsonNumberHandling.AllowReadingFromString)] +[JsonSerializable(typeof(BridgeFrameRequest))] +[JsonSerializable(typeof(BridgeFrameResponse))] +[JsonSerializable(typeof(HostStopParameters))] +internal partial class BridgeJsonContext : JsonSerializerContext +{ + public static BridgeJsonContext Wire { get; } = new(IpcJsonContext.CreateWireOptions()); +} + +internal sealed record HostStopParameters(string IdempotencyKey); diff --git a/src/GameLibrary.TauriBridge/BridgeServer.cs b/src/GameLibrary.TauriBridge/BridgeServer.cs index f56bf65..ca20e09 100644 --- a/src/GameLibrary.TauriBridge/BridgeServer.cs +++ b/src/GameLibrary.TauriBridge/BridgeServer.cs @@ -62,7 +62,7 @@ public async Task RunAsync(CancellationToken cancellationToken) BridgeFrameRequest? frame; try { - frame = JsonSerializer.Deserialize(line, ContractJson.Options); + frame = JsonSerializer.Deserialize(line, BridgeJsonContext.Wire.BridgeFrameRequest); } catch (JsonException) { @@ -155,7 +155,7 @@ private async Task ProcessAsync(BridgeFrameRequest frame, Lane lane, Cancellatio /// private void WriteResponse(BridgeFrameResponse response) { - var line = JsonSerializer.Serialize(response, ContractJson.Options); + var line = JsonSerializer.Serialize(response, BridgeJsonContext.Wire.BridgeFrameResponse); lock (_outputLock) { try @@ -287,7 +287,9 @@ await connection.InvokeAsync(new IpcRequest { RequestId = "tauri-exit-" + Guid.NewGuid().ToString("N"), OperationId = "host.stop", - Parameters = JsonSerializer.SerializeToElement(new { idempotencyKey = "tauri-exit-" + Guid.NewGuid().ToString("N") }, ContractJson.Options), + Parameters = JsonSerializer.SerializeToElement( + new HostStopParameters("tauri-exit-" + Guid.NewGuid().ToString("N")), + BridgeJsonContext.Wire.HostStopParameters), }, timeout.Token); } catch (Exception ex) when (ex is HostClientException or IOException or OperationCanceledException) { } diff --git a/src/GameLibrary.TauriBridge/Properties/PublishProfiles/NativeAot.pubxml b/src/GameLibrary.TauriBridge/Properties/PublishProfiles/NativeAot.pubxml new file mode 100644 index 0000000..b46e560 --- /dev/null +++ b/src/GameLibrary.TauriBridge/Properties/PublishProfiles/NativeAot.pubxml @@ -0,0 +1,11 @@ + + + win-x64 + true + true + false + false + false + None + + diff --git a/tests/GameLibrary.IntegrationTests/HostConnectionRecoveryTests.cs b/tests/GameLibrary.IntegrationTests/HostConnectionRecoveryTests.cs index eab6548..78a8d92 100644 --- a/tests/GameLibrary.IntegrationTests/HostConnectionRecoveryTests.cs +++ b/tests/GameLibrary.IntegrationTests/HostConnectionRecoveryTests.cs @@ -91,15 +91,43 @@ public async Task InvokeAfterDropWithoutHost_SurfacesHostUnavailable() Assert.Equal(HostClientErrorCodes.HostUnavailable, error.Code); } + [Fact] + public async Task BootstrapWrite_AfterLibraryAppears_ReturnsSerializableIdentityFailure() + { + var directory = Path.Combine(Path.GetTempPath(), "GameLibrary-bootstrap-" + Guid.NewGuid().ToString("N")); + using var timeout = new CancellationTokenSource(TimeSpan.FromSeconds(10)); + await using var firstServer = CreateServer(directory); + var initialHandshake = HandshakeAsync(firstServer, timeout.Token, null); + await using var client = await HostConnection.ConnectAsync(directory, "test", timeout.Token); + await initialHandshake; + var request = new IpcRequest { RequestId = "bootstrap-write", OperationId = "settings.update" }; + var pending = client.InvokeAsync(request, timeout.Token); + await IpcFrame.ReadJsonAsync(firstServer, timeout.Token); + await firstServer.DisposeAsync(); + + await using var replacement = CreateServer(directory); + await HandshakeAsync(replacement, timeout.Token, "new-library"); + var result = await pending; + Assert.False(result.Ok); + Assert.Equal(ErrorCodes.LibraryInstanceMismatch, result.Error?.Code); + Assert.Equal(JsonValueKind.Null, result.Data.ValueKind); + Assert.Null(request.LibraryInstanceId); + Assert.Null(request.ExpectedDataEpoch); + using var wire = JsonDocument.Parse(JsonSerializer.Serialize(result, IpcJsonContext.Wire.JsonEnvelope)); + Assert.Equal(JsonValueKind.Null, wire.RootElement.GetProperty("data").ValueKind); + Assert.Equal("bootstrap-write", wire.RootElement.GetProperty("requestId").GetString()); + } + private static NamedPipeServerStream CreateServer(string directory) => new( ChannelNames.PipeName(DataDirectory.Resolve(directory).ComparisonKey!), PipeDirection.InOut, NamedPipeServerStream.MaxAllowedServerInstances, PipeTransmissionMode.Byte, PipeOptions.Asynchronous); - private static async Task HandshakeAsync(NamedPipeServerStream server, CancellationToken token) + private static async Task HandshakeAsync(NamedPipeServerStream server, CancellationToken token, string? libraryInstanceId = "library") { await server.WaitForConnectionAsync(token); await IpcFrame.ReadJsonAsync(server, token); - await IpcFrame.WriteJsonAsync(server, new HandshakeResponse { HostInstanceId = "test", LibraryInstanceId = "library", DataEpoch = "epoch" }, token); + await IpcFrame.WriteJsonAsync(server, new HandshakeResponse { HostInstanceId = "test", LibraryInstanceId = libraryInstanceId, + DataEpoch = libraryInstanceId is null ? null : "epoch" }, token); } private static IpcRequest Request(string id) => new() { RequestId = id, OperationId = "host.status" }; diff --git a/tests/GameLibrary.IntegrationTests/IpcJsonSerializationTests.cs b/tests/GameLibrary.IntegrationTests/IpcJsonSerializationTests.cs new file mode 100644 index 0000000..3dfb26e --- /dev/null +++ b/tests/GameLibrary.IntegrationTests/IpcJsonSerializationTests.cs @@ -0,0 +1,60 @@ +using System.Text.Json; +using GameLibrary.Contracts; +using GameLibrary.Contracts.Ipc; +using Xunit; + +namespace GameLibrary.IntegrationTests; + +public sealed class IpcJsonSerializationTests +{ + [Theory] + [InlineData(OperationStatus.Completed, "completed")] + [InlineData(OperationStatus.Accepted, "accepted")] + [InlineData(OperationStatus.Partial, "partial")] + [InlineData(OperationStatus.NeedsUserAction, "needsUserAction")] + [InlineData(OperationStatus.UnknownOutcome, "unknownOutcome")] + [InlineData(OperationStatus.Failed, "failed")] + public async Task GeneratedClientJson_PreservesContractAndFrameRoundTrip(OperationStatus status, string wireStatus) + { + using var data = JsonDocument.Parse("{\"路径\":\"D:/游戏库\"}"); + var envelope = new Envelope + { + RequestId = "request-中文", + LibraryInstanceId = "library", + DataEpoch = "epoch", + Ok = true, + Status = status, + Data = data.RootElement.Clone(), + }; + var generated = JsonSerializer.Serialize(envelope, IpcJsonContext.Wire.JsonEnvelope); + using var document = JsonDocument.Parse(generated); + using var legacy = JsonDocument.Parse(JsonSerializer.Serialize(envelope, ContractJson.Options)); + Assert.True(JsonElement.DeepEquals(legacy.RootElement, document.RootElement)); + Assert.Equal(wireStatus, document.RootElement.GetProperty("status").GetString()); + Assert.Equal(JsonValueKind.Null, document.RootElement.GetProperty("error").ValueKind); + Assert.Equal(JsonValueKind.Null, document.RootElement.GetProperty("jobId").ValueKind); + + using var stream = new MemoryStream(); + await IpcFrame.WriteJsonAsync(stream, envelope, IpcJsonContext.Wire.JsonEnvelope, CancellationToken.None); + stream.Position = 0; + var restored = await IpcFrame.ReadJsonAsync(stream, IpcJsonContext.Wire.JsonEnvelope, CancellationToken.None); + Assert.Equal(envelope.RequestId, restored.RequestId); + Assert.Equal(status, restored.Status); + Assert.Equal("D:/游戏库", restored.Data.GetProperty("路径").GetString()); + } + + [Fact] + public void GeneratedHandshakeAndRequest_PreservePermissionsIdentityAndNulls() + { + var request = new IpcRequest { RequestId = "same-id", OperationId = "host.status", + LibraryInstanceId = "library", ExpectedDataEpoch = "epoch" }; + using var generated = JsonDocument.Parse(JsonSerializer.Serialize(request, IpcJsonContext.Wire.IpcRequest)); + using var legacy = JsonDocument.Parse(JsonSerializer.Serialize(request, ContractJson.Options)); + Assert.True(JsonElement.DeepEquals(legacy.RootElement, generated.RootElement)); + var handshake = new HandshakeRequest { ClientName = "tauri", Permissions = ["games.read"] }; + using var generatedHandshake = JsonDocument.Parse(JsonSerializer.Serialize(handshake, IpcJsonContext.Wire.HandshakeRequest)); + using var legacyHandshake = JsonDocument.Parse(JsonSerializer.Serialize(handshake, ContractJson.Options)); + Assert.True(JsonElement.DeepEquals(legacyHandshake.RootElement, generatedHandshake.RootElement)); + Assert.Throws(() => JsonSerializer.Deserialize("{\"status\":1}", IpcJsonContext.Wire.JsonEnvelope)); + } +} From c6e47472ac4b4454d98a3c654925bc0e354bacce Mon Sep 17 00:00:00 2001 From: AaronSu Date: Sat, 31 Oct 2026 11:13:55 +0800 Subject: [PATCH 18/29] docs: record RG-03 implementation and deferred unified acceptance --- docs/code-review-graph/architecture.md | 8 ++ docs/code-review-graph/rg03-footprint.json | 14 +++ .../development/2026-10-30-rg02-validation.md | 2 + docs/development/2026-10-30-rg03-plan.md | 23 +++++ .../2026-10-31-rg03-implementation.md | 88 +++++++++++++++++++ 5 files changed, 135 insertions(+) create mode 100644 docs/code-review-graph/rg03-footprint.json create mode 100644 docs/development/2026-10-30-rg03-plan.md create mode 100644 docs/development/2026-10-31-rg03-implementation.md diff --git a/docs/code-review-graph/architecture.md b/docs/code-review-graph/architecture.md index e8b89f4..bf7fe3d 100644 --- a/docs/code-review-graph/architecture.md +++ b/docs/code-review-graph/architecture.md @@ -1,5 +1,13 @@ # GameLibrary 当前代码架构 +## RG-03 / v1.8.2 草稿(2026-10-31) + +在单 Bridge 基础上增加前端可见行挂载、屏外封面引用释放、隐藏期间的刷新域合并和可选界面延迟加载。SettingsProvider、事件消费、库身份失效和游戏退出唤醒仍保留。Rust 通过内部布尔事件通知窗口可见性;不是用失焦代替隐藏。 + +HostClient 与 Bridge 采用内置 JSON 源生成元数据;Host 公共 IPC、权限、状态字符串及 SQLite schema 不变。Bridge 提供显式 NativeAOT 候选配置,默认发布仍为压缩自包含方式。该配置及前端改动尚未编译或运行验收,见 [实现与统一验收清单](../development/2026-10-31-rg03-implementation.md)。 + +本轮静态图谱包含 439 个文件、4,283 个节点、42,827 条关系;CALLS 中 9,395 条直接解析、24,457 条未解析。详细数值见 [RG-03 快照](rg03-footprint.json)。这是源文件结构索引,不代表类型检查、JSON 生成代码或运行正确性。 + ## RG-02 / v1.8.2(未发布) Tauri Rust 壳改为一个 C# Bridge 进程。普通请求和 `events.wait` 各有一条独立 HostConnection;两条通道分别串行,可同时在途。私有 stdio 使用独立 `transportId` 配对乱序响应,不改变 Host 的 `requestId`、权限、库身份或 SQLite schema。传输失败拒绝前端 invoke,保留幂等键;业务 Envelope 保持原样。 diff --git a/docs/code-review-graph/rg03-footprint.json b/docs/code-review-graph/rg03-footprint.json new file mode 100644 index 0000000..5daa613 --- /dev/null +++ b/docs/code-review-graph/rg03-footprint.json @@ -0,0 +1,14 @@ +{ + "snapshotAt": "2026-10-31T11:10:10", + "branch": "codex/optimize-footprint-v1.8.1", + "sourceHeadBeforeDocumentationCommit": "d3d738798bc52a41744b5f6f6dd64cf6c5cc8472", + "releaseBaseline": "4f7da8a072cf815d5c4ab1f647f1a4467bccc586", + "version": "1.8.2-unreleased", + "postprocess": "minimal", + "files": 439, + "nodes": 4283, + "edges": 42827, + "calls": { "direct": 9395, "unresolved": 24457 }, + "embeddings": 0, + "note": "Static source index only. Tests, builds, actual generated JSON sources, NativeAOT compatibility and performance are pending unified acceptance." +} diff --git a/docs/development/2026-10-30-rg02-validation.md b/docs/development/2026-10-30-rg02-validation.md index 2ebc0d1..2441118 100644 --- a/docs/development/2026-10-30-rg02-validation.md +++ b/docs/development/2026-10-30-rg02-validation.md @@ -2,6 +2,8 @@ 2026-10-30。状态:实现已整合,完整验收未通过;未推送实现、打包或发布。 +2026-10-31 后续:按用户要求先完成重构实现、再统一验收,新增 RG-03 前端占用与 JSON/AOT 准备。本文结果保留为历史检查点,当前源码状态及统一验收入口见 [RG-03 实现记录](2026-10-31-rg03-implementation.md)。 + ## 源码与范围 用户要求以修复严重扫描问题后的最新版继续。核对时 GitHub main 仍为 `be8e143`,已发布 v1.8.1 的源码位于 `codex/release-v1.8.1`,提交 `4f7da8a072cf815d5c4ab1f647f1a4467bccc586`。保留重构快照 `8b006c6` 后,以合并提交 `d4c6700` 纳入该发布分支。 diff --git a/docs/development/2026-10-30-rg03-plan.md b/docs/development/2026-10-30-rg03-plan.md new file mode 100644 index 0000000..9313b1c --- /dev/null +++ b/docs/development/2026-10-30-rg03-plan.md @@ -0,0 +1,23 @@ +# RG-03:前端常驻占用与按需加载 + +2026-10-30,用户明确要求:“我的计划是等所有重构优化完成之后统一验收,所以请你继续重构工作吧”。据此继续同一优化目标,验收集中到实现结束后;本轮只修改源码、准备回归检查并同步静态图谱,不运行测试、构建、桌面或性能采样。 + +## 约束 + +沿用 `codex/optimize-footprint-v1.8.1` 独立 worktree 与 v1.8.2 草稿,不改 main、不推送、不打包、不安装依赖。不操作正式实例或真实游戏库。保留业务功能、数据格式、IPC 和扫描修复。Codex 串行执行,不另行发送源码到远端 worker、不使用 GPU。 + +## 任务与完成边界 + +| 任务 | 依赖 | 所有者与路径 | 实现完成条件 | +| --- | --- | --- | --- | +| F1 | 无 | Codex:GameGrid、GameCard、局部虚拟行 hook 与相关测试源码 | 大库只挂载可见行及预留行,保留焦点所在行、批量选择、触底分页和滚动位置;屏外卡片不永久保留封面引用 | +| F2 | F1 静态审查 | Codex:useLibraryEvents、windowVisibility、UnityTranslationDialog、Rust 窗口事件及相关测试源码 | 隐藏时合并普通界面刷新,继续事件消费、库身份失效处理及 launch.exited 通知;显示后补齐待刷新域;新增内部可见性事件,不修改既有 IPC 字段 | +| F3 | F2 静态审查 | Codex:App 与可选界面入口 | 设置和详情按需加载;Unity 状态监视保留常驻语义,避免因拆分丢失自动提示 | +| F4 | F3 | Codex:Bridge、HostClient、Contracts/Ipc 及序列化测试源码 | 使用内置 JSON 源生成元数据,保留公共线协议;准备 Bridge 的显式 NativeAOT 发布配置,不改变默认发布;核对工具链缓存,缺依赖不安装,试编留到统一验收 | +| F5 | F1–F4 | Codex:docs/development、code-review-graph | 静态审查、记录实际完成/待办与统一验收命令,提交本地检查点 | + +主要风险是虚拟列表的响应式尺寸、键盘焦点与页面恢复,以及隐藏期间事件合并。保留已加载的轻量游戏数据,不改变“全选已加载项”的语义。无需新增虚拟列表依赖。窗口可见性不能用失焦代替,游戏退出仍可主动唤醒窗口。 + +统一验收须覆盖网格/紧凑布局、缩放和窗口调整、长列表滚动、键盘及批量操作、封面迟到响应、隐藏期间事件与恢复、可选界面首次打开、此前 Bridge/IPC/扫描回归,以及整棵桌面进程树的真实占用。本轮不声称这些检查已通过。 + +2026-10-31 续做:F1–F4 源码已分成 `46c1812` 与 `d3d7387` 两个本地检查点;NativeAOT 为显式试验配置,未切入默认发布。源码审查发现并修正引导期重连身份拒绝结果中的未定义 JsonElement,保留其拒绝旧写入的行为。F5 的实现记录与统一验收入口见 [后续记录](2026-10-31-rg03-implementation.md)。 diff --git a/docs/development/2026-10-31-rg03-implementation.md b/docs/development/2026-10-31-rg03-implementation.md new file mode 100644 index 0000000..38c4ca5 --- /dev/null +++ b/docs/development/2026-10-31-rg03-implementation.md @@ -0,0 +1,88 @@ +# RG-03 实现记录与统一验收清单 + +2026-10-31。基于 RG-02 的 v1.8.2 草稿继续实现,遵从用户“等所有重构优化完成之后统一验收”的安排。本轮没有运行测试、类型检查、构建、桌面或性能采样;结构图谱同步属于源码静态索引,不代表运行验收。 + +分支仍为 `codex/optimize-footprint-v1.8.1`,独立 worktree 为 `C:\Users\sumingwang\.codex\worktrees\optimize-footprint-v181\GameLibrary`。main、正式实例、真实游戏库与远端实现均未操作,没有安装或升级依赖。 + +## 已写入的实现 + +| 范围 | 代码行为 | 本地提交 | +| --- | --- | --- | +| F1:列表与封面 | 网格/紧凑布局只挂载视口附近行,额外保留焦点所在行;按真实卡片尺寸与响应式列数计算位置。已加载的游戏数据、批量勾选、触底分页与滚动恢复保留。屏外卡片释放自身封面状态,继续使用既有 64 MiB 数据 URL 缓存。 | `46c1812` | +| F2:后台刷新 | Rust 在隐藏、显示及窗口状态变化时发送内部可见性事件。隐藏期间继续消费事件、处理库身份失效与游戏退出唤醒,但合并普通刷新域和插件通知;恢复可见后刷新。Unity 状态空闲兜底从 2.5 秒降为 30 秒,有活动任务或错误时仍为 2.5 秒,隐藏时不启动新轮询。 | `46c1812` | +| F3:按需加载 | 详情、设置、待审核、目录、标签面板及 Unity 设置表单采用 React lazy/Suspense。详情与设置关闭后卸载;SettingsProvider 和 Unity 状态控制器仍常驻,避免丢失外观设置或自动提示。加载提示补齐四语言。 | `46c1812` | +| F4:AOT 准备 | HostClient 握手/请求/结果及 Bridge 私有帧使用 SDK 内置的 JSON 源生成元数据。增加显式 NativeAOT 发布配置,保留默认压缩自包含发布方式。 | `d3d7387` | +| 重连结果边界 | 引导期写请求重连时若出现新的库身份,仍拒绝重绑和重发;错误结果的 data 显式为 JSON null,避免未定义 JsonElement 使错误结果无法序列化。新增对应假管道回归用例。 | `d3d7387` | + +审查期间也处理了 Unity 状态请求在途时收到新事件的情况:保留待刷新标记,在当前请求结束后立即补读,避免错过事件后等满 30 秒。每轮 effect 有自己的退出标记,已关闭的轮询不能因异步请求完成而重新挂上计时器。 + +本轮未改动 Application、Domain、Host 和 Infrastructure 的源码,保留已合入的 v1.8.1 扫描边界及去重修复。不涉及数据库迁移。IPC 长度帧、业务字段、状态字符串、空值约定、权限、库身份/纪元和 requestId 保持原设计;新增的 JSON 元数据路径仍需交叉序列化及 IPC 回归确认。 + +## 边界与限制 + +- 列表使用共享的实测行高,适用于当前等高卡片/紧凑行。以后引入可变高度正文时应改成逐行测量。已在源码标注该限制。 +- 保留轻量游戏对象以维持批量选择和分页语义;没有把“DOM 有界”描述为所有前端内存都有硬上限。缓存预算也不包含浏览器解码图像、传输中的请求或整个 WebView。 +- 仅隐藏或最小化时延后普通刷新,不把失去焦点当作隐藏;不暂停 Host 的扫描、游玩跟踪或写入操作。隐藏前已经发出的请求可以完成。 +- NativeAOT 当前是待试编的候选。本机查看到 ILCompiler 10.0.12 缓存,不代表工具链、全部还原元数据或运行兼容性已经验证。未把 PublishAot 加入默认 sidecar 脚本,尚无 AOT 体积或内存结果。 +- RG-02 的 29.7% Private Bytes 样本仅是上一代码检查点的 Bridge/Host 辅助数据,不作为本轮前端与序列化改动的收益。 + +内部事件为 `gamelibrary-window-visibility`,布尔载荷仅表示主窗口的可见/非最小化状态;不是 Host 公共 IPC。前端注册监听后再读取初始窗口状态,并隔离迟到快照和已注销监听。浏览器开发模式使用 document visibility。 + +实现采用 [React lazy](https://react.dev/reference/react/lazy) 和 [.NET JSON 源生成](https://learn.microsoft.com/en-us/dotnet/standard/serialization/system-text-json/source-generation) 的现有机制,没有添加虚拟列表或序列化依赖。NativeAOT 的适用范围及限制见 [微软文档](https://learn.microsoft.com/en-us/dotnet/core/deploying/native-aot/)。 + +## 已准备、尚未执行的回归 + +| 检查源码 | 覆盖意图 | +| --- | --- | +| useVirtualRows.test.ts | 大库窗口范围、边界收缩、空库、焦点行单独保留 | +| GameCard.test.tsx | 屏外封面引用释放、缓存复用、长列表卸载与焦点/勾选保留 | +| windowVisibility.test.ts | 原生状态快照迟到、监听注销竞态、重复事件、浏览器模式 | +| hooks.test.ts | 隐藏期间事件持续消费、刷新域合并、退出唤醒与显示后补齐 | +| UnityTranslationDialog.test.tsx | 隐藏暂停/显示恢复、空闲低频轮询、请求在途时的新事件 | +| IpcJsonSerializationTests.cs | 六种状态字符串、null 字段、中文载荷、握手权限、身份及帧往返、拒绝整数枚举 | +| HostConnectionRecoveryTests.cs | 重连/半帧/错配请求,以及引导期写入被新库身份拒绝后结果可序列化 | + +没有将新增用例计为通过,也没有沿用旧构建产物作为当前源码证据。 + +## 统一验收次序 + +以下命令仅为后续验收入口,本轮没有执行。必须在上述 worktree 运行,把 TEMP/TMP、合成游戏库、日志、解压缓存和 WebView 数据全部限定在其 `.tmp/rg03/`,并使用独立测试 identifier。只使用已有依赖;缺少缓存或还原元数据时停止,不自动安装、升级或放宽权限。 + +1. 前端定向用例与类型检查。工作目录为 `src/GameLibrary.Tauri`: + + ```powershell + npm.cmd test -- src/lib/api.test.ts src/lib/assetCache.test.ts src/lib/hooks/hooks.test.ts src/lib/hooks/useVirtualRows.test.ts src/lib/windowVisibility.test.ts src/components/GameCard.test.tsx src/components/UnityTranslationDialog.test.tsx src/components/UnityTranslationSettingsForm.test.tsx src/components/DetailSheet.test.tsx src/components/DetailSheet.gameProp.test.tsx src/components/Sidebar.test.tsx src/components/TitleBar.test.tsx src/lib/i18n.test.tsx + npm.cmd run typecheck + ``` + +2. Rust Release 单元检查。工作目录为 `src/GameLibrary.Tauri/src-tauri`: + + ```powershell + cargo test --release --lib --offline + ``` + +3. .NET 线协议、权限及恢复检查。工作目录为仓库根;设置 worktree 内的结果目录: + + ```powershell + dotnet test tests/GameLibrary.ContractTests/GameLibrary.ContractTests.csproj -c Release --no-restore --filter 'FullyQualifiedName~IpcFrameTests|FullyQualifiedName~ClientPermissionProfileTests' --results-directory .tmp/rg03/test-results + dotnet test tests/GameLibrary.IntegrationTests/GameLibrary.IntegrationTests.csproj -c Release --no-restore --filter 'FullyQualifiedName~IpcJsonSerializationTests|FullyQualifiedName~HostConnectionRecoveryTests|FullyQualifiedName~PermissionDeclarationTests|FullyQualifiedName~EventStreamTests|FullyQualifiedName~ScanBoundaryRegressionTests|FullyQualifiedName~DirectoryWalkerTests|FullyQualifiedName~ScanOperationTests' --results-directory .tmp/rg03/test-results + dotnet test tests/GameLibrary.HeadlessE2ETests/GameLibrary.HeadlessE2ETests.csproj -c Release --no-restore --filter 'FullyQualifiedName~TauriBridgeE2ETests|FullyQualifiedName~HostStopE2ETests' --results-directory .tmp/rg03/test-results + ``` + +4. 默认压缩 sidecar 与桌面 Release 编译。沿用临时配置覆盖办法,测试 identifier 与正式实例分离;使用 `--no-bundle`,不调用总打包入口。先定位此前 Tauri setup 与 VSTest 的拒绝访问,再执行桌面功能与过程检查,不能将启动失败归为已排除的环境问题。 + +5. NativeAOT 显式试编。仅对 Bridge,在仓库根执行下列候选入口;默认 Host 与正式发布脚本不变: + + ```powershell + dotnet publish src/GameLibrary.TauriBridge/GameLibrary.TauriBridge.csproj -c Release --no-restore -p:PublishProfile=NativeAot -o .tmp/rg03/native-aot + ``` + + 该命令也可能因还原元数据缺失而停止,不能自行改成在线安装。成功后必须用这一个实际 AOT 可执行文件重跑并发长轮询、中文路径、乱序关联、断连恢复、业务/传输错误和退出清理,不能拿默认测试目录中的普通 Bridge 充当 AOT 证据。比较通过后再决定是否切换默认发布。 + +6. 桌面统一人工与短时对比:网格/紧凑两布局,大库连续滚动、窗口缩放、键盘 Tab/Shift+Tab、焦点行保留、批量选择、触底分页、详情修改后滚动恢复、封面更换/迟到响应;隐藏时制造事件并恢复,检查游戏退出唤醒;首次打开各延迟模块,检查主题、语言、关闭到托盘和 Unity 自动提示。 + +7. 相同合成库和 Release 设置下,分别测试 v1.8.1、默认候选及可用的 AOT 候选。先结束编译等干扰,再预热、重复采样整棵桌面进程树的 Private Bytes、Working Set、CPU 与启动耗时;另外记录安装后文件字节数。不得由缓存预算或侧车样本推算整桌面收益。 + +## 本轮交付状态 + +F1–F4 的实现与候选配置已保存,本轮只是待统一验收的代码检查点。F5 完成静态审查、文档和结构索引同步;该索引不包含构建后生成的实际 JSON 源码。NativeAOT 默认链路切换、性能收益和全部功能验收均未宣称完成。后续仍不自动推送、合并 main、生成安装器或发布。 From 5f673846e6f5c78adbd8d00330906cffbb032700 Mon Sep 17 00:00:00 2001 From: AaronSu Date: Sat, 31 Oct 2026 12:12:53 +0800 Subject: [PATCH 19/29] perf(host): spill older completed job results to session storage --- src/GameLibrary.Host/HostRuntime.cs | 1 + .../Hosting/CompletedJobHistory.cs | 54 +++++++++++++ src/GameLibrary.Host/Hosting/JobManager.cs | 76 ++++++++++++++++++- .../Scanning/JobManagerTests.cs | 61 +++++++++++++++ 4 files changed, 188 insertions(+), 4 deletions(-) create mode 100644 src/GameLibrary.Host/Hosting/CompletedJobHistory.cs diff --git a/src/GameLibrary.Host/HostRuntime.cs b/src/GameLibrary.Host/HostRuntime.cs index c417446..47427c5 100644 --- a/src/GameLibrary.Host/HostRuntime.cs +++ b/src/GameLibrary.Host/HostRuntime.cs @@ -379,6 +379,7 @@ public async ValueTask DisposeAsync() if (_state.Suggestions is not null) await _state.Suggestions.Stopped; await _server.DisposeAsync(); await _state.Jobs.WaitForIdleAsync(); + _state.Jobs.Dispose(); await drained; if (_state.Library.Store is not null) { diff --git a/src/GameLibrary.Host/Hosting/CompletedJobHistory.cs b/src/GameLibrary.Host/Hosting/CompletedJobHistory.cs new file mode 100644 index 0000000..b288a55 --- /dev/null +++ b/src/GameLibrary.Host/Hosting/CompletedJobHistory.cs @@ -0,0 +1,54 @@ +using System.Text.Json; +using GameLibrary.Contracts; + +namespace GameLibrary.Host.Hosting; + +/// Session-only spill storage. Never reopen another session's file or delete existing files. +internal sealed class CompletedJobHistory : IDisposable +{ + internal sealed record Record(JobSnapshot Snapshot, object? Result); + private readonly object _gate = new(); + // ponytail: history keeps one small offset per job; use an on-disk index if sessions reach millions of jobs. + private readonly Dictionary _index = new(StringComparer.Ordinal); + private FileStream? _stream; + internal string? FilePath { get { lock (_gate) return _stream?.Name; } } + + public void Write(JobSnapshot snapshot, object? result) + { + var bytes = JsonSerializer.SerializeToUtf8Bytes(new Record(snapshot, result), ContractJson.Options); + lock (_gate) + { + _stream ??= new FileStream(Path.Combine(Path.GetTempPath(), $"GameLibrary-jobs-{Guid.NewGuid():N}.tmp"), + FileMode.CreateNew, FileAccess.ReadWrite, FileShare.None, 4096, + FileOptions.DeleteOnClose | FileOptions.RandomAccess); + var offset = _stream.Length; + _stream.Position = offset; + _stream.Write(bytes); + _stream.Flush(); + _index[snapshot.JobId] = (offset, bytes.Length); + } + } + + public Record? Read(string jobId) + { + lock (_gate) + { + if (!_index.TryGetValue(jobId, out var entry) || _stream is null) return null; + _stream.Position = entry.Offset; + var bytes = new byte[entry.Length]; + _stream.ReadExactly(bytes); + return JsonSerializer.Deserialize(bytes, ContractJson.Options) + ?? throw new InvalidDataException("会话作业结果损坏"); + } + } + + public void Dispose() + { + lock (_gate) + { + _stream?.Dispose(); + _stream = null; + _index.Clear(); + } + } +} diff --git a/src/GameLibrary.Host/Hosting/JobManager.cs b/src/GameLibrary.Host/Hosting/JobManager.cs index 9ce44c1..87c34d8 100644 --- a/src/GameLibrary.Host/Hosting/JobManager.cs +++ b/src/GameLibrary.Host/Hosting/JobManager.cs @@ -51,7 +51,7 @@ public sealed record JobSnapshot /// 宿主内作业管理(T05 骨架):受受理即后台执行;取消只置 cancelRequested 并在检查点生效; /// 客户端断开不影响作业。跨进程重启的持久化恢复属 T23/T27。 /// -public sealed class JobManager +public sealed class JobManager : IDisposable { private sealed class JobEntry { @@ -78,9 +78,61 @@ private sealed class JobEntry public JobSnapshot? PendingRecord; public TaskCompletionSource Completed { get; } = new(TaskCreationOptions.RunContinuationsAsynchronously); + public bool Cached; } private readonly ConcurrentDictionary _jobs = new(); + private readonly object _completedGate = new(); + private readonly Queue _completed = new(); + private readonly CompletedJobHistory _history = new(); + private readonly int _completedCapacity; + private bool _disposed; + private int _spillFailures; + + public JobManager(int completedCapacity = 128) + { + ArgumentOutOfRangeException.ThrowIfLessThan(completedCapacity, 1); + _completedCapacity = completedCapacity; + } + + internal int CachedCompletedCount { get { lock (_completedGate) return _completed.Count; } } + internal int HistorySpillFailures { get { lock (_completedGate) return _spillFailures; } } + + private void CacheCompleted(JobEntry entry) + { + if (_disposed || entry.Cached || entry.PendingRecord is not null) return; + entry.Context = null; + entry.Cts.Dispose(); + entry.Cached = true; + _completed.Enqueue(entry); + } + + private void TrimCompleted() + { + if (_disposed) return; + while (_completed.Count > _completedCapacity) + { + var oldest = _completed.Peek(); + try { _history.Write(Snapshot(oldest), oldest.FinalData); } + catch (Exception) + { + // Spill is an optimization, never grounds to lose a queryable result. + _spillFailures++; + break; + } + _jobs.TryRemove(oldest.Id, out _); + _completed.Dequeue(); + } + } + + public void Dispose() + { + lock (_completedGate) + { + _disposed = true; + _history.Dispose(); + } + } /// 作业终态指标回调(T24-B):进入 succeeded/failed/cancelled 时调用,参数为终态字符串。 public Action? OnJobFinished { get; set; } @@ -155,6 +207,7 @@ public string Create( object? initialProgress = null, bool ownsMaintenance = false) { + ObjectDisposedException.ThrowIf(_disposed, this); var lease = ownsMaintenance ? null : AcquireLibraryLease?.Invoke(); if (!ownsMaintenance && AcquireLibraryLease is not null && lease is null) throw new InvalidOperationException("库处于维护状态,不能启动作业"); @@ -185,7 +238,7 @@ public string Create( public JobSnapshot? Get(string jobId) => _jobs.TryGetValue(jobId, out var entry) ? Snapshot(entry) - : ReadRestoreHistory(jobId)?.Snapshot; + : _history.Read(jobId)?.Snapshot ?? ReadRestoreHistory(jobId)?.Snapshot; /// 请求取消:仅 running→cancelRequested;已进入终态返回 false。 public bool RequestCancel(string jobId) @@ -205,7 +258,8 @@ public bool RequestCancel(string jobId) entry.State = "cancelRequested"; } - entry.Cts.Cancel(); + try { entry.Cts.Cancel(); } + catch (ObjectDisposedException) when (IsTerminal(entry.State)) { } return true; } @@ -214,6 +268,8 @@ public bool RequestCancel(string jobId) { if (!_jobs.TryGetValue(jobId, out var entry)) { + var archived = _history.Read(jobId); + if (archived is not null) return (archived.Snapshot.State, archived.Result); var restored = ReadRestoreHistory(jobId); return restored is null ? null : (restored.Snapshot.State, restored.Result); } @@ -244,6 +300,10 @@ public bool TryFlushPendingRecords() entry.State = snapshot.State; entry.PendingRecord = null; } + if (entry.Completed.Task.IsCompleted) + { + lock (_completedGate) { CacheCompleted(entry); TrimCompleted(); } + } } return true; } @@ -299,7 +359,15 @@ private async Task RunAsync(JobEntry entry, Func> e try { OnJobFinished?.Invoke(entry.State); } catch (Exception) { } } - finally { entry.Completed.TrySetResult(); } + finally + { + lock (_completedGate) + { + try { CacheCompleted(entry); } + finally { entry.Completed.TrySetResult(); } + TrimCompleted(); + } + } } private static JobSnapshot Snapshot(JobEntry entry) => diff --git a/tests/GameLibrary.IntegrationTests/Scanning/JobManagerTests.cs b/tests/GameLibrary.IntegrationTests/Scanning/JobManagerTests.cs index 350d0d6..b410c67 100644 --- a/tests/GameLibrary.IntegrationTests/Scanning/JobManagerTests.cs +++ b/tests/GameLibrary.IntegrationTests/Scanning/JobManagerTests.cs @@ -1,4 +1,5 @@ using GameLibrary.Host.Hosting; +using System.Text.Json; using Xunit; namespace GameLibrary.IntegrationTests.Scanning; @@ -239,6 +240,66 @@ public async Task FailedFinalRecord_IsObservableAndRetriedWithoutRepeatingWork() Assert.Single(recorded, snapshot => snapshot.State == "succeeded"); } + [Fact] + public async Task CompletedCapacity_SpillsOldResultsWithoutLosingSessionQueries() + { + using var manager = new JobManager(completedCapacity: 1); + var first = manager.Create("test", context => + { + context.ReportProgress(new { value = "中文结果" }); + return Task.FromResult(JobOutcome.Succeeded()); + }); + await manager.WaitForIdleAsync(); + var recentResult = new { value = "recent" }; + var second = manager.Create("test", context => + { + context.ReportProgress(recentResult); + return Task.FromResult(JobOutcome.Succeeded()); + }); + await manager.WaitForIdleAsync(); + Assert.Equal(1, manager.CachedCompletedCount); + Assert.Equal("succeeded", manager.Get(first)!.State); + var archived = Assert.IsType(manager.TryGetProgress(first)!.Value.Data); + Assert.Equal("中文结果", archived.GetProperty("value").GetString()); + Assert.Same(recentResult, manager.TryGetProgress(second)!.Value.Data); + Assert.False(manager.RequestCancel(first)); + Assert.Equal(0, manager.ActiveJobCount()); + } + + [Fact] + public async Task FailedSpill_KeepsOriginalResultsInMemory() + { + using var manager = new JobManager(completedCapacity: 1); + var cycle = new Dictionary(); + cycle["self"] = cycle; + var id = manager.Create("test", context => + { + context.ReportProgress(cycle); + return Task.FromResult(JobOutcome.Succeeded()); + }); + await manager.WaitForIdleAsync(); + manager.Create("test", _ => Task.FromResult(JobOutcome.Succeeded())); + await manager.WaitForIdleAsync(); + Assert.Equal(2, manager.CachedCompletedCount); + Assert.True(manager.HistorySpillFailures > 0); + Assert.Same(cycle, manager.TryGetProgress(id)!.Value.Data); + } + + [Fact] + public void SessionSpill_IsDeletedOnDispose() + { + var history = new CompletedJobHistory(); + history.Write(new JobSnapshot { JobId = "job-test", Kind = "test", State = "succeeded", CreatedUtc = DateTime.UtcNow }, null); + var path = history.FilePath!; + try + { + Assert.StartsWith(Path.GetFullPath(Path.GetTempPath()), Path.GetFullPath(path)); + Assert.True(File.Exists(path)); + } + finally { history.Dispose(); } + Assert.False(File.Exists(path)); + } + private static async Task WaitForTerminalAsync(JobManager manager, string jobId) { var deadline = DateTime.UtcNow + TimeSpan.FromSeconds(60); From 20db99430c187668d71a058c1baa7a6696da1883 Mon Sep 17 00:00:00 2001 From: AaronSu Date: Sat, 31 Oct 2026 12:13:10 +0800 Subject: [PATCH 20/29] perf(ui): bound cover fetches and drop abandoned queued requests --- .../src/components/DetailSheet.tsx | 26 +++- .../src/components/GameCard.tsx | 5 +- src/GameLibrary.Tauri/src/lib/api.ts | 4 +- .../src/lib/assetCache.test.ts | 51 +++++++ src/GameLibrary.Tauri/src/lib/assetCache.ts | 136 +++++++++++++----- 5 files changed, 182 insertions(+), 40 deletions(-) diff --git a/src/GameLibrary.Tauri/src/components/DetailSheet.tsx b/src/GameLibrary.Tauri/src/components/DetailSheet.tsx index 47a6564..f203533 100644 --- a/src/GameLibrary.Tauri/src/components/DetailSheet.tsx +++ b/src/GameLibrary.Tauri/src/components/DetailSheet.tsx @@ -103,6 +103,7 @@ function DetailSheetContent({ const loadSerial = useRef(0); const profileSerial = useRef(0); const actionSerial = useRef(0); + const coverRequest = useRef(null); const [summaryDraft, setSummaryDraft] = useState(""); const [confirmRemove, setConfirmRemove] = useState(false); const [confirmDelete, setConfirmDelete] = useState(false); @@ -117,7 +118,7 @@ function DetailSheetContent({ useEffect(() => { alive.current = true; session.current++; - return () => { alive.current = false; session.current++; }; + return () => { alive.current = false; session.current++; coverRequest.current?.abort(); }; }, []); useEffect(() => { setTab(initialTab); }, [gameId, initialTab]); useEffect(() => { setConfirmDelete(false); setDeletePlan(null); }, [gameId]); @@ -144,8 +145,16 @@ function DetailSheetContent({ } }, []); + const readCover = useCallback((assetId: string) => { + coverRequest.current?.abort(); + const request = new AbortController(); + coverRequest.current = request; + return assetDataUrl(assetId, request.signal); + }, []); + const load = useCallback(async () => { if (!gameId || !alive.current) return; + coverRequest.current?.abort(); const epoch = session.current; const request = ++loadSerial.current; const profileRequest = ++profileSerial.current; @@ -163,7 +172,7 @@ function DetailSheetContent({ setTranslation(translationResult.data); const coverAssetId = currentRef.current?.coverAssetId; if (coverAssetId) { - const url = await assetDataUrl(coverAssetId).catch(() => null); + const url = await readCover(coverAssetId).catch(() => null); if (!valid() || currentRef.current?.coverAssetId !== coverAssetId) return; setCover(url); } else { @@ -173,7 +182,7 @@ function DetailSheetContent({ } catch (cause) { if (valid()) setError(describeFailure(cause)); } - }, [gameId, mergeDetail]); + }, [gameId, mergeDetail, readCover]); useEffect(() => { setCurrent(game); @@ -313,8 +322,15 @@ function DetailSheetContent({ const updateCover = async (result: { assetId: string; warning?: string }) => { if (!alive.current) return; - const url = await assetDataUrl(result.assetId); - if (!alive.current) return; + const pendingCover = readCover(result.assetId); + const request = coverRequest.current; + let url: string; + try { url = await pendingCover; } + catch (error) { + if (error instanceof DOMException && error.name === "AbortError") return; + throw error; + } + if (!alive.current || coverRequest.current !== request) return; setCover(url); await load(); await onChanged(); diff --git a/src/GameLibrary.Tauri/src/components/GameCard.tsx b/src/GameLibrary.Tauri/src/components/GameCard.tsx index 79f2e21..6b1bdcf 100644 --- a/src/GameLibrary.Tauri/src/components/GameCard.tsx +++ b/src/GameLibrary.Tauri/src/components/GameCard.tsx @@ -35,19 +35,22 @@ function GameCardImpl({ game, selected, checked, selectionDisabled, onToggle, on useEffect(() => { let active = true; + const request = new AbortController(); setCover(null); if (!visible || !game.coverAssetId) { return () => { active = false; + request.abort(); }; } - void assetDataUrl(game.coverAssetId) + void assetDataUrl(game.coverAssetId, request.signal) .then((value) => { if (active) setCover(value); }) .catch(() => undefined); return () => { active = false; + request.abort(); }; }, [game.coverAssetId, visible]); diff --git a/src/GameLibrary.Tauri/src/lib/api.ts b/src/GameLibrary.Tauri/src/lib/api.ts index a321d39..7c9cf4d 100644 --- a/src/GameLibrary.Tauri/src/lib/api.ts +++ b/src/GameLibrary.Tauri/src/lib/api.ts @@ -165,11 +165,11 @@ function validateGame(value: unknown) { } } -export function assetDataUrl(assetId: string) { +export function assetDataUrl(assetId: string, signal?: AbortSignal) { return assetCache.load(assetId, async () => { const result = await operation<{ mimeType: string; dataBase64: string }>("assets.get", { assetId }); return `data:${result.data.mimeType};base64,${result.data.dataBase64}`; - }); + }, signal); } /** diff --git a/src/GameLibrary.Tauri/src/lib/assetCache.test.ts b/src/GameLibrary.Tauri/src/lib/assetCache.test.ts index b4aa48f..7b8ed5b 100644 --- a/src/GameLibrary.Tauri/src/lib/assetCache.test.ts +++ b/src/GameLibrary.Tauri/src/lib/assetCache.test.ts @@ -2,6 +2,57 @@ import { describe, expect, it, vi } from "vitest"; import { DataUrlCache } from "./assetCache"; describe("data URL cache", () => { + it("bounds fetches and skips a queued cover after its last consumer leaves", async () => { + const cache = new DataUrlCache(1024, 1); + let finish!: (value: string) => void; + const active = cache.load("active", () => new Promise(resolve => { finish = resolve; })); + const signal = new AbortController(); + const skipped = vi.fn(async () => "old cover"); + const queued = cache.load("offscreen", skipped, signal.signal); + const rejected = expect(queued).rejects.toMatchObject({ name: "AbortError" }); + const nextFetch = vi.fn(async () => "visible cover"); + const next = cache.load("visible", nextFetch); + expect(nextFetch).not.toHaveBeenCalled(); + signal.abort(); + await rejected; + finish("first"); + await active; + await expect(next).resolves.toBe("visible cover"); + expect(skipped).not.toHaveBeenCalled(); + expect(nextFetch).toHaveBeenCalledOnce(); + }); + + it("does not cancel another consumer of the same queued asset", async () => { + const cache = new DataUrlCache(1024, 1); + let finish!: (value: string) => void; + const active = cache.load("active", () => new Promise(resolve => { finish = resolve; })); + const signal = new AbortController(); + const fetch = vi.fn(async () => "shared"); + const a = cache.load("same", fetch, signal.signal); + const b = cache.load("same", fetch); + const rejected = expect(a).rejects.toMatchObject({ name: "AbortError" }); + signal.abort(); await rejected; + finish("first"); await active; + await expect(b).resolves.toBe("shared"); + expect(fetch).toHaveBeenCalledOnce(); + }); + + it("invalidates queued work while preserving the original error of running work", async () => { + const cache = new DataUrlCache(1024, 1); + let fail!: (reason: Error) => void; + const active = cache.load("active", () => new Promise((_resolve, reject) => { fail = reject; })); + const oldFetch = vi.fn(async () => "old"); + const old = cache.load("queued", oldFetch); + const activeError = expect(active).rejects.toThrow("库已切换"); + const queuedError = expect(old).rejects.toThrow("封面已变化"); + cache.clear(); + const fresh = cache.load("queued", async () => "new"); + fail(new Error("库已切换")); + await activeError; await queuedError; + await expect(fresh).resolves.toBe("new"); + expect(oldFetch).not.toHaveBeenCalled(); + }); + it("uses string bytes and evicts the least recently read value", async () => { const cache = new DataUrlCache(24); await cache.load("a", async () => "12345"); diff --git a/src/GameLibrary.Tauri/src/lib/assetCache.ts b/src/GameLibrary.Tauri/src/lib/assetCache.ts index 0662b27..1f28d29 100644 --- a/src/GameLibrary.Tauri/src/lib/assetCache.ts +++ b/src/GameLibrary.Tauri/src/lib/assetCache.ts @@ -1,55 +1,127 @@ import { t } from "./i18n"; -/** Conservative UTF-16 string storage estimate; cached data URLs retain the public API. */ + +interface Consumer { + resolve: (value: string) => void; + reject: (reason: unknown) => void; + signal?: AbortSignal; + abort: () => void; +} +interface FetchEntry { + key: string; + generation: number; + fetch: () => Promise; + running: boolean; + consumers: Set; +} + +/** Bounded strings and fetches; abort only removes this consumer, not a shared IPC request. */ export class DataUrlCache { private values = new Map(); - private pending = new Map>(); + private pending = new Map(); + private queue: FetchEntry[] = []; + private active = 0; private generation = 0; bytes = 0; - constructor(readonly budget = 64 * 1024 * 1024) {} + constructor(readonly budget = 64 * 1024 * 1024, readonly concurrency = 2) { + if (!Number.isInteger(concurrency) || concurrency < 1) throw new RangeError("Invalid fetch concurrency"); + } + + private changed() { return new Error(t("封面已变化,请重新加载")); } clear(key?: string) { - if (key !== undefined) { - const value = this.values.get(key); - if (value !== undefined) this.bytes -= 2 * (key.length + value.length); - this.values.delete(key); - this.pending.delete(key); + if (key === undefined) { + this.generation++; + this.values.clear(); this.bytes = 0; + for (const entry of [...this.pending.values()]) this.invalidate(entry); return; } - this.generation++; - this.values.clear(); - this.pending.clear(); - this.bytes = 0; + const value = this.values.get(key); + if (value !== undefined) this.bytes -= 2 * (key.length + value.length); + this.values.delete(key); + const entry = this.pending.get(key); + if (entry) this.invalidate(entry); } - async load(key: string, fetch: () => Promise): Promise { + private invalidate(entry: FetchEntry) { + this.pending.delete(entry.key); + // Running IPC cannot be cancelled safely. Preserve its original transport/epoch error. + if (!entry.running) { + this.queue = this.queue.filter(item => item !== entry); + this.finish(entry, { error: this.changed() }); + } + } + + load(key: string, fetch: () => Promise, signal?: AbortSignal): Promise { + if (signal?.aborted) return Promise.reject(new DOMException("Aborted", "AbortError")); const cached = this.values.get(key); if (cached !== undefined) { - this.values.delete(key); - this.values.set(key, cached); - return cached; + this.values.delete(key); this.values.set(key, cached); + return Promise.resolve(cached); } - const pending = this.pending.get(key); - if (pending) return pending; - const generation = this.generation; - const request = fetch().then(value => { - if (generation !== this.generation || this.pending.get(key) !== request) - throw new Error(t("封面已变化,请重新加载")); - const cost = 2 * (key.length + value.length); + let entry = this.pending.get(key); + if (!entry) { + entry = { key, fetch, generation: this.generation, running: false, consumers: new Set() }; + this.pending.set(key, entry); + this.queue.push(entry); + } + const current = entry; + return new Promise((resolve, reject) => { + const consumer: Consumer = { resolve, reject, signal, abort: () => { + if (!current.consumers.delete(consumer)) return; + signal?.removeEventListener("abort", consumer.abort); + reject(new DOMException("Aborted", "AbortError")); + if (!current.running && current.consumers.size === 0) { + if (this.pending.get(key) === current) this.pending.delete(key); + this.queue = this.queue.filter(item => item !== current); + } + } }; + current.consumers.add(consumer); + signal?.addEventListener("abort", consumer.abort, { once: true }); + this.pump(); + }); + } + + private finish(entry: FetchEntry, result: { value: string } | { error: unknown }) { + for (const consumer of entry.consumers) { + consumer.signal?.removeEventListener("abort", consumer.abort); + if ("error" in result) consumer.reject(result.error); else consumer.resolve(result.value); + } + entry.consumers.clear(); + } + + private pump() { + while (this.active < this.concurrency && this.queue.length) { + const entry = this.queue.shift()!; + if (!entry.consumers.size || this.pending.get(entry.key) !== entry) continue; + entry.running = true; + this.active++; + void this.run(entry); + } + } + + private async run(entry: FetchEntry) { + try { + const value = await entry.fetch(); + if (entry.generation !== this.generation || this.pending.get(entry.key) !== entry) { + this.finish(entry, { error: this.changed() }); + return; + } + const cost = 2 * (entry.key.length + value.length); if (cost <= this.budget) { - while (this.bytes + cost > this.budget && this.values.size > 0) { + while (this.bytes + cost > this.budget && this.values.size) { const oldest = this.values.keys().next().value!; this.bytes -= 2 * (oldest.length + this.values.get(oldest)!.length); this.values.delete(oldest); } - this.values.set(key, value); - this.bytes += cost; + this.values.set(entry.key, value); this.bytes += cost; } - return value; - }).finally(() => { - if (this.pending.get(key) === request) this.pending.delete(key); - }); - this.pending.set(key, request); - return request; + this.finish(entry, { value }); + } catch (error) { this.finish(entry, { error }); } + finally { + if (this.pending.get(entry.key) === entry) this.pending.delete(entry.key); + this.active--; + this.pump(); + } } } From 75d203a9065992792ca50d3a2b059e4250c0ba8b Mon Sep 17 00:00:00 2001 From: AaronSu Date: Sat, 31 Oct 2026 12:13:29 +0800 Subject: [PATCH 21/29] perf(ui): refresh small known game changes without replaying pages --- src/GameLibrary.Tauri/src/App.tsx | 2 +- .../src/lib/hooks/gameChanges.test.ts | 23 ++++++ .../src/lib/hooks/hooks.test.ts | 77 +++++++++++++++++- .../src/lib/hooks/useGamesQuery.ts | 81 +++++++++++++++++-- .../src/lib/hooks/useLibraryEvents.ts | 20 ++++- src/GameLibrary.Tauri/src/lib/state.ts | 16 +++- src/GameLibrary.Tauri/src/lib/types.ts | 3 + 7 files changed, 207 insertions(+), 15 deletions(-) create mode 100644 src/GameLibrary.Tauri/src/lib/hooks/gameChanges.test.ts diff --git a/src/GameLibrary.Tauri/src/App.tsx b/src/GameLibrary.Tauri/src/App.tsx index 79e9a37..08d7de5 100644 --- a/src/GameLibrary.Tauri/src/App.tsx +++ b/src/GameLibrary.Tauri/src/App.tsx @@ -63,7 +63,7 @@ function App() { ); const [translationBusy, setTranslationBusy] = useState(false); - const games = useGamesQuery(filters, library.changeToken, translationBusy); + const games = useGamesQuery(filters, library.changeToken, translationBusy, library.gameChanges); const selected = useMemo( () => resolveSelectedGame(games.games, selectedGameId, selectedFallback), [games.games, selectedGameId, selectedFallback], diff --git a/src/GameLibrary.Tauri/src/lib/hooks/gameChanges.test.ts b/src/GameLibrary.Tauri/src/lib/hooks/gameChanges.test.ts new file mode 100644 index 0000000..11ecdfa --- /dev/null +++ b/src/GameLibrary.Tauri/src/lib/hooks/gameChanges.test.ts @@ -0,0 +1,23 @@ +import { expect, it } from "vitest"; +import { changedGameIds, stableQueryItem } from "./useGamesQuery"; +import type { GameItem } from "../types"; + +it("requires contiguous known changes, preserving unknown invalidations and bounded history", () => { + expect(changedGameIds([{ token: 2, gameIds: ["a"] }, { token: 3, gameIds: ["a", "b"] }], 1, 3)).toEqual(["a", "b"]); + expect(changedGameIds([{ token: 2, gameIds: null }, { token: 3, gameIds: ["a"] }], 1, 3)).toBeNull(); + expect(changedGameIds([{ token: 3, gameIds: ["a"] }], 1, 3)).toBeNull(); + expect(changedGameIds(undefined, 0, 1)).toBeNull(); +}); + +it("only patches items that keep membership, played filter and the actual SQL order key", () => { + const game: GameItem = { gameId: "a", title: "A", rootPath: "D:/a", kind: "folderGame", membership: "active", + played: false, favorite: false, revision: 1, acceptedUtc: "2026-01-01", updatedUtc: "2026-01-02" }; + const updated = { ...game, revision: 2, favorite: true, updatedUtc: "2026-01-03" }; + expect(stableQueryItem(game, updated, "title", false)).toBe(true); + expect(stableQueryItem(game, updated, "accepted-desc", false)).toBe(true); + expect(stableQueryItem(game, updated, "recent", false)).toBe(false); + expect(stableQueryItem(game, { ...updated, title: "Z" }, "title", false)).toBe(false); + expect(stableQueryItem(game, { ...updated, played: true }, "title", false)).toBe(false); + expect(stableQueryItem(game, { ...updated, membership: "removed" }, "title", false)).toBe(false); + expect(stableQueryItem(game, { ...updated, revision: 0 }, "title", false)).toBe(false); +}); diff --git a/src/GameLibrary.Tauri/src/lib/hooks/hooks.test.ts b/src/GameLibrary.Tauri/src/lib/hooks/hooks.test.ts index 21a272b..9f4dbbb 100644 --- a/src/GameLibrary.Tauri/src/lib/hooks/hooks.test.ts +++ b/src/GameLibrary.Tauri/src/lib/hooks/hooks.test.ts @@ -8,7 +8,7 @@ import { useTagActions } from "./useTagActions"; import { useLibraryMetadata } from "./useLibraryMetadata"; import { emptyFilters } from "../state"; import { OperationError } from "../api"; -import type { CandidateItem, GameItem, LibraryEvent, RootItem } from "../types"; +import type { CandidateItem, GameChange, GameItem, LibraryEvent, RootItem } from "../types"; const { call, invalidate, show, visibility } = vi.hoisted(() => ({ call: vi.fn(), invalidate: vi.fn(), show: vi.fn(), @@ -33,6 +33,52 @@ const candidate = (id: string): CandidateItem => ({ beforeEach(() => { vi.useFakeTimers(); call.mockReset(); invalidate.mockClear(); show.mockClear(); }); afterEach(() => { cleanup(); vi.useRealTimers(); }); +it("refreshes a small known game change without replaying loaded pages, but replays unknown changes", async () => { + const row = (id: number): GameItem => ({ ...game(id), membership: "active", played: false, + acceptedUtc: "2026-01-01", updatedUtc: "2026-01-02" }); + call.mockImplementation(async (name: string, params: { offset?: number; gameId?: string }) => + ({ ...(name === "games.get" ? envelope({ ...row(Number(params.gameId)), favorite: true, revision: 2 }) + : envelope({ total: 120, items: Array.from({ length: 60 }, (_, index) => row((params.offset ?? 0) + index)) })), + libraryInstanceId: "library", dataEpoch: "epoch" })); + const hook = renderHook(({ token, changes }: { token: number; changes: GameChange[] }) => + useGamesQuery(emptyFilters, token, false, changes), { initialProps: { token: 0, changes: [] as GameChange[] } }); + await act(async () => {}); + await act(async () => hook.result.current.loadMore()); + expect(hook.result.current.games).toHaveLength(120); + const initialReads = call.mock.calls.filter(([name]) => name === "games.list").length; + hook.rerender({ token: 1, changes: [{ token: 1, gameIds: ["0"] }] }); + await act(async () => {}); + expect(call.mock.calls.filter(([name]) => name === "games.list")).toHaveLength(initialReads); + expect(call.mock.calls.filter(([name]) => name === "games.get")).toHaveLength(1); + expect(hook.result.current.games[0].favorite).toBe(true); + expect(hook.result.current.games).toHaveLength(120); + expect(hook.result.current.total).toBe(120); + expect(hook.result.current.hasMore).toBe(false); + hook.rerender({ token: 2, changes: [{ token: 1, gameIds: ["0"] }, { token: 2, gameIds: null }] }); + await act(async () => {}); + expect(call.mock.calls.filter(([name]) => name === "games.list")).toHaveLength(initialReads + 2); +}); + +it("does not merge higher cached revisions into a different library epoch", async () => { + let epoch = "old"; + const row = (id: number): GameItem => ({ ...game(id), played: false, membership: "active", + acceptedUtc: "2026-01-01", revision: epoch === "old" ? 10 : 1, title: epoch }); + call.mockImplementation(async (name: string, params: { offset?: number; gameId?: string }) => ({ + ...envelope(name === "games.get" ? row(Number(params.gameId)) + : { total: 120, items: Array.from({ length: 60 }, (_, index) => row((params.offset ?? 0) + index)) }), + libraryInstanceId: "library", dataEpoch: epoch, + })); + const hook = renderHook(({ token, changes }: { token: number; changes: GameChange[] }) => + useGamesQuery(emptyFilters, token, false, changes), { initialProps: { token: 0, changes: [] as GameChange[] } }); + await act(async () => {}); + await act(async () => hook.result.current.loadMore()); + epoch = "restored"; + hook.rerender({ token: 1, changes: [{ token: 1, gameIds: ["0"] }] }); + await act(async () => {}); + expect(hook.result.current.games).toHaveLength(120); + expect(hook.result.current.games.every(item => item.revision === 1 && item.title === "restored")).toBe(true); +}); + it("refreshes only domains affected by events", () => { expect([...affectedDomains([{ type: "candidate.updated", sequence: 1 }])]).toEqual(["candidates", "notifications"]); expect([...affectedDomains([{ type: "tag.updated", sequence: 2 }])]).toEqual(["tags", "games"]); @@ -151,6 +197,35 @@ it("establishes a tail cursor, merges events for 250ms, and cleans up on unmount expect(refresh).toHaveBeenCalledOnce(); }); +it("coalesces known game IDs but preserves an unknown invalidation in the same batch", async () => { + let reply!: (value: unknown) => void; + let cursor = 10; + call.mockImplementation(async (name: string) => name === "events.read" + ? envelope({ nextCursor: 1, latestCursor: cursor, items: [] }) + : new Promise(resolve => { reply = resolve; })); + const initialize = async () => {}; + const supports = () => true; + const refresh = vi.fn(async () => {}); + const bump = vi.fn(); + const exit = () => {}; + renderHook(() => useLibraryEvents(initialize, supports, refresh, bump, exit)); + await act(async () => {}); + bump.mockClear(); + const publish = async (items: LibraryEvent[]) => { + cursor += items.length; + await act(async () => reply(envelope({ nextCursor: cursor, items }))); + await act(async () => { await vi.advanceTimersByTimeAsync(1); }); + }; + await publish([{ type: "game.updated", sequence: 11, payload: { gameId: "a" } }, + { type: "game.updated", sequence: 12, payload: { gameId: "b" } }]); + await act(async () => { await vi.advanceTimersByTimeAsync(250); }); + expect(bump).toHaveBeenLastCalledWith(["a", "b"]); + await publish([{ type: "game.updated", sequence: 13, payload: { gameId: "a" } }]); + await publish([{ type: "tag.updated", sequence: 14 }]); + await act(async () => { await vi.advanceTimersByTimeAsync(250); }); + expect(bump).toHaveBeenLastCalledWith(undefined); +}); + it("rebuilds the cursor baseline after an epoch or cursor error", async () => { call.mockResolvedValueOnce(envelope({ nextCursor: 1, latestCursor: 5, items: [] })) .mockRejectedValueOnce(new OperationError("CursorExpired", "expired", { ok: false, data: null, requestId: "x", status: "failed" })) diff --git a/src/GameLibrary.Tauri/src/lib/hooks/useGamesQuery.ts b/src/GameLibrary.Tauri/src/lib/hooks/useGamesQuery.ts index 06d8e66..7cf3721 100644 --- a/src/GameLibrary.Tauri/src/lib/hooks/useGamesQuery.ts +++ b/src/GameLibrary.Tauri/src/lib/hooks/useGamesQuery.ts @@ -1,9 +1,35 @@ import { useCallback, useEffect, useMemo, useRef, useState } from "react"; -import { describeFailure, operation } from "../api"; -import type { GameItem } from "../types"; +import { describeFailure, operation, TransportError } from "../api"; +import { t } from "../i18n"; +import type { GameChange, GameItem } from "../types"; import type { GameFilters } from "../state"; export const PAGE_SIZE = 60; +export function changedGameIds(changes: readonly GameChange[] | undefined, after: number, through: number): string[] | null { + if (!changes || after < 0 || through <= after) return null; + const pending = changes.filter(change => change.token > after && change.token <= through); + if (pending.length !== through - after) return null; + const ids = new Set(); + for (let index = 0; index < pending.length; index++) { + const change = pending[index]; + if (change.token !== after + index + 1 || change.gameIds === null || !change.gameIds.length) return null; + for (const id of change.gameIds) ids.add(id); + if (ids.size > 16) return null; + } + return [...ids]; +} + +/** Mirror the actual SQL membership and order keys; unknown shapes must fall back to QueryGames. */ +export function stableQueryItem(before: GameItem, after: GameItem, sort: string, played: boolean) { + const key = sort === "title" || sort === "title-desc" ? "title" + : sort === "accepted-desc" ? "acceptedUtc" + : sort === "recent" || sort === "updated-desc" ? "updatedUtc" : null; + return key !== null && before.gameId === after.gameId && after.revision >= before.revision + && before.membership === "active" && after.membership === "active" + && before.played === played && after.played === played + && typeof before[key] === "string" && before[key] === after[key]; +} + export interface GamesQuery { games: GameItem[]; total: number; @@ -30,6 +56,12 @@ export interface GamesPage { total: number; nextOffset: number | null; hasMore: boolean; + /** Client-only scope tag; never sent as a games.list parameter. */ + scope?: string | null; +} + +function libraryScope(result: { libraryInstanceId?: string | null; dataEpoch?: string | null }) { + return result.libraryInstanceId && result.dataEpoch ? JSON.stringify([result.libraryInstanceId, result.dataEpoch]) : null; } /** @@ -62,6 +94,7 @@ export function useGamesQuery( filters: GameFilters, changeToken: number, suppressAutoRefresh: boolean, + gameChanges?: readonly GameChange[], ): GamesQuery { const [games, setGames] = useState([]); const [total, setTotal] = useState(0); @@ -71,6 +104,8 @@ export function useGamesQuery( const [hasMore, setHasMore] = useState(false); const [debouncedSearch, setDebouncedSearch] = useState(filters.search); const hasLoadedRef = useRef(false); + const appliedToken = useRef(-1); + const dataScope = useRef(null); /** games 的镜像 ref:串行队列里的异步任务读它决定保留多少条,避免闭包读到旧 state。 */ const gamesRef = useRef([]); /** 下一页的原始行 offset;null=已到底。触底加载只认它,不认去重后的 games.length。 */ @@ -118,7 +153,9 @@ export function useGamesQuery( const applyResult = useCallback((items: GameItem[], page: GamesPage) => { if (!mounted.current) return; - const newer = new Map(gamesRef.current.map(item => [item.gameId, item])); + const scope = page.scope ?? null; + const newer = new Map((dataScope.current === scope ? gamesRef.current : []).map(item => [item.gameId, item])); + dataScope.current = scope; items = items.map(item => (newer.get(item.gameId)?.revision ?? 0) > item.revision ? newer.get(item.gameId)! : item); // 空页说明服务端已没有更多原始行:把游标收口,重复触底不会继续请求同一段。 const nextOffset = page.items.length === 0 ? null : page.nextOffset; @@ -140,7 +177,7 @@ export function useGamesQuery( limit: PAGE_SIZE, offset, }); - return normalizePage(result.data, offset); + return { ...normalizePage(result.data, offset), scope: libraryScope(result) }; }, [request], ); @@ -155,8 +192,34 @@ export function useGamesQuery( * 打转,而游标一定指向尚未取过的原始行。 */ const refresh = useCallback( - async (preserveLoaded: boolean, isCurrent: () => boolean = () => true) => { + async (preserveLoaded: boolean, isCurrent: () => boolean = () => true, changedIds: string[] | null = null) => { if (!mounted.current || activeRequest.current !== request || !isCurrent()) return; + // A small, known batch costs fewer reads than replaying all loaded pages. + const scope = dataScope.current; + if (scope !== null && preserveLoaded && changedIds?.length && changedIds.length < Math.ceil(gamesRef.current.length / PAGE_SIZE) + && !request.search && !request.tagId && !request.favorite && request.hasCover === undefined && !request.viewId) { + const replacements = new Map(); + let safe = true; + try { + for (const id of changedIds) { + const before = gamesRef.current.find(game => game.gameId === id); + if (!before) { safe = false; break; } + const result = await operation("games.get", { gameId: id }); + if (!mounted.current || activeRequest.current !== request || !isCurrent()) return; + if (libraryScope(result) !== scope || !stableQueryItem(before, result.data, request.sort, request.played)) { safe = false; break; } + replacements.set(id, result.data); + } + } catch { safe = false; } + if (!mounted.current || activeRequest.current !== request || !isCurrent()) return; + if (safe && [...replacements].every(([id, item]) => { + const current = gamesRef.current.find(game => game.gameId === id); + return current && stableQueryItem(current, item, request.sort, request.played); + })) { + gamesRef.current = gamesRef.current.map(game => replacements.get(game.gameId) ?? game); + setGames(gamesRef.current); + return; + } + } let page = await queryPage(0); if (!mounted.current || activeRequest.current !== request || !isCurrent()) return; const previousCount = preserveLoaded ? gamesRef.current.length : 0; @@ -169,6 +232,7 @@ export function useGamesQuery( && items.length < previousCount && items.length < page.total && fetched < maxPages; fetched++) { const more = await queryPage(page.nextOffset); if (!mounted.current || activeRequest.current !== request || !isCurrent()) return; + if (more.scope !== page.scope) throw new TransportError(t("库已切换,已丢弃旧响应")); // 空页=服务端没有更多行:终止补页,并把游标收口。 if (more.items.length === 0) { page = more; break; } for (const item of more.items) { @@ -199,7 +263,9 @@ export function useGamesQuery( void (async () => { try { // 经串行队列执行:与进行中的触底加载互斥,避免两者交叉覆盖 gamesRef。 - await enqueue(() => refresh(!isFilterChange && hasLoadedRef.current, () => !cancelled)); + await enqueue(() => refresh(!isFilterChange && hasLoadedRef.current, () => !cancelled, + changedGameIds(gameChanges, appliedToken.current, changeToken))); + if (!cancelled && mounted.current && activeRequest.current === request) appliedToken.current = changeToken; } catch (cause) { if (!cancelled) setError(describeFailure(cause)); } finally { @@ -213,7 +279,7 @@ export function useGamesQuery( cancelled = true; }; // 保留调用方主动抑制自动刷新接口;扫描本身不再阻止读取。 - }, [enqueue, refresh, request, resetResult, changeToken, suppressAutoRefresh]); + }, [enqueue, refresh, request, resetResult, changeToken, suppressAutoRefresh, gameChanges]); const loadMore = useCallback(() => { const offset = cursorRef.current; @@ -223,6 +289,7 @@ export function useGamesQuery( if (!mounted.current || activeRequest.current !== request) return; const page = await queryPage(offset); if (!mounted.current || activeRequest.current !== request) return; + if (page.scope !== dataScope.current) throw new TransportError(t("库已切换,已丢弃旧响应")); const seen = new Set(gamesRef.current.map((item) => item.gameId)); const merged = [...gamesRef.current]; for (const item of page.items) { diff --git a/src/GameLibrary.Tauri/src/lib/hooks/useLibraryEvents.ts b/src/GameLibrary.Tauri/src/lib/hooks/useLibraryEvents.ts index 2350b0c..64b05ac 100644 --- a/src/GameLibrary.Tauri/src/lib/hooks/useLibraryEvents.ts +++ b/src/GameLibrary.Tauri/src/lib/hooks/useLibraryEvents.ts @@ -22,7 +22,7 @@ export function affectedDomains(events: readonly LibraryEvent[]): Set Promise, supports: (name: string) => boolean, - refreshDomains: (domains: readonly DataDomain[]) => Promise, bump: () => void, + refreshDomains: (domains: readonly DataDomain[]) => Promise, bump: (gameIds?: readonly string[]) => void, setLaunchExit: (notice: LaunchExitNotice) => void, ) { const seen = useRef(new Set()); @@ -35,6 +35,7 @@ export function useLibraryEvents( let refreshTimer: ReturnType | undefined; const pending = new Set(); const notices = new Set(); + let gameIds: Set | null = new Set(); const read = async (baseline = false) => { const result = await operation<{ nextCursor: number; latestCursor?: number; items: LibraryEvent[] }>( !baseline && supports("events.wait") ? "events.wait" : "events.read", @@ -50,6 +51,7 @@ export function useLibraryEvents( if (!cancelled) { notices.add("gamelibrary-settings-changed"); for (const domain of ALL_DOMAINS) pending.add(domain); + gameIds = null; await flush(); } }; @@ -57,10 +59,12 @@ export function useLibraryEvents( refreshTimer = undefined; if (cancelled || !visible) return; const domains = [...pending]; + const changedGames = gameIds; + gameIds = new Set(); pending.clear(); for (const notice of notices) window.dispatchEvent(new Event(notice)); notices.clear(); - if (domains.includes("games")) bump(); + if (domains.includes("games")) bump(changedGames === null ? undefined : [...changedGames]); if (domains.length) await refreshDomains(domains); }; const stopVisibility = watchWindowVisibility(value => { @@ -93,7 +97,17 @@ export function useLibraryEvents( setLaunchExit({ attemptId: id, gameId: payload.gameId, nonce: ++nonce.current }); void showMainWindow(); } - for (const domain of affectedDomains(batch.items)) pending.add(domain); + for (const event of batch.items) { + const domains = affectedDomains([event]); + for (const domain of domains) pending.add(domain); + if (!domains.has("games") || gameIds === null) continue; + const payload = event.payload as { gameId?: unknown } | undefined; + if (event.type !== "game.updated" || typeof payload?.gameId !== "string" || !payload.gameId) gameIds = null; + else { + gameIds.add(payload.gameId); + if (gameIds.size > 16) gameIds = null; + } + } if (visible && (pending.size || notices.size) && refreshTimer === undefined) refreshTimer = setTimeout(() => void flush(), 250); } catch (cause) { diff --git a/src/GameLibrary.Tauri/src/lib/state.ts b/src/GameLibrary.Tauri/src/lib/state.ts index 2ff2253..8be62a1 100644 --- a/src/GameLibrary.Tauri/src/lib/state.ts +++ b/src/GameLibrary.Tauri/src/lib/state.ts @@ -12,7 +12,7 @@ import { } from "react"; import { operation, OperationError } from "./api"; import { planWithMTool } from "./mtool"; -import type { Envelope } from "./types"; +import type { Envelope, GameChange } from "./types"; import { discoverLaunchProfiles, LaunchProfileSelectionRequired, selectLaunchProfile, type ProfileList } from "./launchProfiles"; import { useLibraryMetadata } from "./hooks/useLibraryMetadata"; import { useLibraryEvents } from "./hooks/useLibraryEvents"; @@ -105,6 +105,7 @@ interface LibraryController { error: string | null; /** 每次收到库事件自增,作为查询侧的失效信号。 */ changeToken: number; + gameChanges?: readonly GameChange[]; /** * feat-2:最近一次 launch.exited 事件(游戏进程退出)。事件流按游标消费、 * Host 侧同一 attempt 只发一次(HostRuntime.cs:235 状态门),这里再按 attemptId @@ -143,6 +144,8 @@ function useLibraryController(): LibraryController { candidateLoading, candidateHasMore, loadMoreCandidates, metaLoading, error, setError, refreshMeta, refreshDomains, initialize, supports } = useLibraryMetadata(); const [changeToken, setChangeToken] = useState(0); + const changeSerial = useRef(0); + const [gameChanges, setGameChanges] = useState([]); const [launchExit, setLaunchExit] = useState(null); const mounted = useRef(true); @@ -154,8 +157,13 @@ function useLibraryController(): LibraryController { }; }, []); - const bump = useCallback(() => { - if (mounted.current) setChangeToken((token) => token + 1); + const bump = useCallback((gameIds?: readonly string[]) => { + if (!mounted.current) return; + const token = ++changeSerial.current; + const ids = Array.isArray(gameIds) && gameIds.length > 0 && gameIds.length <= 16 + && gameIds.every(id => typeof id === "string" && id.length > 0) ? [...gameIds] : null; + setGameChanges(previous => [...previous.slice(-15), { token, gameIds: ids }]); + setChangeToken(token); }, []); useLibraryEvents(initialize, supports, refreshDomains, bump, setLaunchExit); @@ -310,6 +318,7 @@ function useLibraryController(): LibraryController { metaLoading, error, changeToken, + gameChanges, launchExit, scanning, scanProgress, @@ -344,6 +353,7 @@ function useLibraryController(): LibraryController { metaLoading, error, changeToken, + gameChanges, launchExit, scanning, scanProgress, diff --git a/src/GameLibrary.Tauri/src/lib/types.ts b/src/GameLibrary.Tauri/src/lib/types.ts index 4a9cc3e..1cc66ba 100644 --- a/src/GameLibrary.Tauri/src/lib/types.ts +++ b/src/GameLibrary.Tauri/src/lib/types.ts @@ -227,6 +227,9 @@ export interface LibrarySettings { cacheParentDirectory?: string | null; } +/** Bounded UI invalidation history; null means the change cannot be narrowed safely. */ +export interface GameChange { token: number; gameIds: readonly string[] | null } + export interface LibraryEvent { sequence: number; type: string; From d4342ee72784b4ebc7fde47d5cd8a981b45de622 Mon Sep 17 00:00:00 2001 From: AaronSu Date: Sat, 31 Oct 2026 12:16:00 +0800 Subject: [PATCH 22/29] docs: record RG-04 implementation and pending unified acceptance --- docs/code-review-graph/architecture.md | 6 ++ docs/code-review-graph/rg04-footprint.json | 14 ++++ .../2026-10-31-rg03-implementation.md | 2 + .../2026-10-31-rg04-implementation.md | 64 +++++++++++++++++++ docs/development/2026-10-31-rg04-plan.md | 16 +++++ 5 files changed, 102 insertions(+) create mode 100644 docs/code-review-graph/rg04-footprint.json create mode 100644 docs/development/2026-10-31-rg04-implementation.md create mode 100644 docs/development/2026-10-31-rg04-plan.md diff --git a/docs/code-review-graph/architecture.md b/docs/code-review-graph/architecture.md index bf7fe3d..64bbe49 100644 --- a/docs/code-review-graph/architecture.md +++ b/docs/code-review-graph/architecture.md @@ -1,5 +1,11 @@ # GameLibrary 当前代码架构 +## RG-04 / v1.8.2 草稿(2026-10-31) + +JobManager 正常情况下只保留最近 128 个可淘汰终态对象,其余结果暂存到独占、关闭即删除的会话文件,按轻量索引回读;转存失败或终态记录待重试时保留对象。不是跨重启历史库,也没有增加 SQLite schema。封面缓存增加两个并发名额和按消费者取消的队列。已知小批游戏变更在成员、排序、库身份及纪元均安全时局部更新,其余完整重查。 + +本轮静态图谱包含 441 个文件、4,321 个节点、43,356 条关系;CALLS 直接解析 9,491 条、未解析 24,660 条。见 [RG-04 快照](rg04-footprint.json)与[实施及统一验收增量清单](../development/2026-10-31-rg04-implementation.md)。本轮未运行测试、构建或性能实测;以下 RG-03/02 数值保留为历史快照。 + ## RG-03 / v1.8.2 草稿(2026-10-31) 在单 Bridge 基础上增加前端可见行挂载、屏外封面引用释放、隐藏期间的刷新域合并和可选界面延迟加载。SettingsProvider、事件消费、库身份失效和游戏退出唤醒仍保留。Rust 通过内部布尔事件通知窗口可见性;不是用失焦代替隐藏。 diff --git a/docs/code-review-graph/rg04-footprint.json b/docs/code-review-graph/rg04-footprint.json new file mode 100644 index 0000000..3635662 --- /dev/null +++ b/docs/code-review-graph/rg04-footprint.json @@ -0,0 +1,14 @@ +{ + "snapshotAt": "2026-10-31T12:13:40", + "branch": "codex/optimize-footprint-v1.8.1", + "sourceHeadBeforeDocumentationCommit": "75d203a9065992792ca50d3a2b059e4250c0ba8b", + "releaseBaseline": "4f7da8a072cf815d5c4ab1f647f1a4467bccc586", + "version": "1.8.2-unreleased", + "postprocess": "minimal", + "files": 441, + "nodes": 4321, + "edges": 43356, + "calls": { "direct": 9491, "unresolved": 24660 }, + "embeddings": 0, + "note": "Static source index only. Job history spill, cover scheduling, incremental refresh and earlier RG-03 changes await unified tests, builds and desktop performance acceptance." +} diff --git a/docs/development/2026-10-31-rg03-implementation.md b/docs/development/2026-10-31-rg03-implementation.md index 38c4ca5..325b384 100644 --- a/docs/development/2026-10-31-rg03-implementation.md +++ b/docs/development/2026-10-31-rg03-implementation.md @@ -86,3 +86,5 @@ ## 本轮交付状态 F1–F4 的实现与候选配置已保存,本轮只是待统一验收的代码检查点。F5 完成静态审查、文档和结构索引同步;该索引不包含构建后生成的实际 JSON 源码。NativeAOT 默认链路切换、性能收益和全部功能验收均未宣称完成。后续仍不自动推送、合并 main、生成安装器或发布。 + +后续新增作业结果转存、封面队列和保守增量刷新,见 [RG-04 实施与统一验收增量清单](2026-10-31-rg04-implementation.md)。统一验收须合并该清单,不能只运行本记录的早期用例列表。 diff --git a/docs/development/2026-10-31-rg04-implementation.md b/docs/development/2026-10-31-rg04-implementation.md new file mode 100644 index 0000000..e7f5293 --- /dev/null +++ b/docs/development/2026-10-31-rg04-implementation.md @@ -0,0 +1,64 @@ +# RG-04 实施记录:作业结果、封面队列与增量刷新 + +2026-10-31。按用户“那就继续”的授权实施 [RG-04 计划](2026-10-31-rg04-plan.md),沿用 v1.8.2 草稿和隔离分支 `codex/optimize-footprint-v1.8.1`。本轮由 Codex 串行写入,没有向其他服务发送源码。 + +工作目录:`C:\Users\sumingwang\.codex\worktrees\optimize-footprint-v181\GameLibrary`。没有改动 main、正式游戏库或正式实例,也没有安装依赖、推送实现提交、打包或发布。 + +## 本地源码检查点 + +| 任务 | 提交 | 实现 | +| --- | --- | --- | +| J1 | `5f67384` | JobManager 默认保留最近 128 个可淘汰终态对象;更旧结果转存到会话临时文件,保留查询 | +| C1 | `20db994` | 封面数据请求并发上限为 2;同一资产共享请求,按消费者取消排队工作 | +| Q1 | `75d203a` | 小批、已知游戏变更优先读取单条;不能证明成员和排序不变时保留完整查询 | + +这些提交是实现检查点,尚未通过统一验收。前轮虚拟行、隐藏刷新合并、延迟模块、源生成 JSON 和 NativeAOT 候选仍见 [RG-03 实施记录](2026-10-31-rg03-implementation.md)。 + +## 实现边界 + +作业结果:`CompletedJobHistory` 用一个独占、关闭即删除的随机会话文件保存 JSON 结果,内存只留 jobId 到文件位置的索引。不重新打开旧文件、不删除既有文件、不增加数据库表或迁移。旧结果回读为 JSON,公开响应形状保持;近期对象保留原类型。Host 等待作业停止后关闭该文件。 + +转存成功后才移除原对象。转存失败时保留原对象并计数,终态记录仍待重试的作业也不淘汰;因此 128 是正常转存时的近期终态目标,不是总作业内存硬上限。运行中作业、待记录重试对象、每个历史作业的轻量索引及回读缓冲仍占内存。该方案以会话临时磁盘和查询 I/O 换取旧结果对象释放;索引和临时文件随作业数增长,尚无磁盘或内存收益实测。 + +封面队列:沿用 64 MiB 字符串缓存预算,最多启动两个 fetch。卡片屏外、卸载或详情读取被替代时只取消自己的消费者;最后一个消费者离开后移除尚未启动的任务。已发出的 IPC 仍完成并占用并发名额,避免误取消共享调用。库或资产失效后,迟到成功结果不得写回缓存;已经在途的原始传输/纪元错误继续返回。预算不包含解码图像、队列外的 WebView 数据或整个进程占用。 + +增量刷新:事件层最多合并 16 个已知 `game.updated` ID,控制器最多保存 16 轮失效记录。未知事件、记录断档或超限均标为完整失效。只有变更条数少于已加载页数、条目已加载、查询没有额外筛选,且库身份、数据纪元、活动成员、played 条件、实际 SQL 排序键和 revision 均安全时,才替换对应对象并保留分页游标。搜索、标签、收藏筛选、封面筛选、视图及不确定排序均完整查询;显式 reload 也完整查询。 + +不同库/纪元的分页响应不能拼接,旧纪元的较高 revision 也不能覆盖新纪元结果。隐藏期间的事件消费、合并刷新和游戏退出唤醒逻辑保留。Host 公共 IPC、SQLite schema、跨层字符串和发布配置均未因 RG-04 改变。 + +## 已准备的回归源码 + +| 文件 | 新增覆盖意图 | +| --- | --- | +| JobManagerTests.cs | 容量超限后查询中文结果、近期对象身份、转存失败保留结果、会话文件关闭删除 | +| assetCache.test.ts | 并发上限、最后消费者取消后跳过排队请求、共享请求单消费者取消、清理队列并保留在途错误 | +| gameChanges.test.ts | 连续失效历史、未知变更/断档回退、排序键、played/成员变化和旧 revision | +| hooks.test.ts | 已知 ID 合并与未知失效保留、已加载多页的局部刷新/完整重查、跨纪元较低 revision 恢复 | + +本轮只做源码静态复核和结构索引同步。没有运行测试、构建、lint、类型检查、桌面启动或性能采样;表中用例不能记为通过,旧 RG-02 样本也不能证明 RG-03/04 收益。 + +## 统一验收增量清单 + +继续使用 [RG-03 的完整验收次序](2026-10-31-rg03-implementation.md#统一验收次序)。以下只是待执行入口;执行时必须把 TEMP/TMP、合成库、日志、解压缓存和 WebView 数据限定在本 worktree 的 `.tmp/rg04/`,桌面使用独立测试 identifier。只使用已有依赖,缺失时停止。 + +在前端目录的原定用例列表中增加 `src/lib/hooks/gameChanges.test.ts`;`assetCache.test.ts`、`hooks.test.ts`、详情和卡片用例继续运行。可单独定位本轮新增逻辑: + +```powershell +npm.cmd test -- src/lib/assetCache.test.ts src/lib/hooks/gameChanges.test.ts src/lib/hooks/hooks.test.ts src/components/GameCard.test.tsx src/components/DetailSheet.test.tsx src/components/DetailSheet.gameProp.test.tsx +``` + +在仓库根增加作业专项检查,覆盖新容量逻辑及已有记录重试用例: + +```powershell +dotnet test tests/GameLibrary.IntegrationTests/GameLibrary.IntegrationTests.csproj -c Release --no-restore --filter 'FullyQualifiedName~JobManagerTests' --results-directory .tmp/rg04/test-results +``` + +统一功能验收还须检查:终态持久化重试与取消竞态;超过 128 个完成作业后的历史查询及 Host 退出清理;封面快速滚动、共享消费者、修改/切库期间的迟到结果;默认及其他排序、搜索/标签/收藏/played/封面/视图筛选、触底和详情修改后的滚动;隐藏后积累未知事件、库切换及恢复后的列表一致性。 + +性能对比继续使用相同合成库、Release 设置与预热方式,记录整棵桌面进程树、启动耗时和文件字节数。另比较连续作业前后内存、会话临时文件增长与历史查询耗时,以及封面加载/刷新次数。NativeAOT 仍是显式候选,必须试编并对实际产物回归后才能考虑切换默认。 + +## 图谱与交付状态 + +源码检查点 `75d203a9065992792ca50d3a2b059e4250c0ba8b` 的图谱使用本 worktree 作为显式 repo_root,minimal 后处理,无嵌入模型。解析无错误,索引 441 个文件、4,321 个节点、43,356 条关系;CALLS 直接解析 9,491 条、未解析 24,660 条。见 [RG-04 快照](../code-review-graph/rg04-footprint.json)。这些是结构数据,不是编译或功能证据。 + +J1、C1、Q1 的实现与回归源码已提交,D1 文档和图谱同步完成;运行正确性、性能收益、NativeAOT 默认切换及整体验收仍待执行。不将源码完成等同于验收完成。 diff --git a/docs/development/2026-10-31-rg04-plan.md b/docs/development/2026-10-31-rg04-plan.md new file mode 100644 index 0000000..d00e7b5 --- /dev/null +++ b/docs/development/2026-10-31-rg04-plan.md @@ -0,0 +1,16 @@ +# RG-04:作业结果、封面队列与增量刷新 + +2026-10-31,用户在三项后续优化建议后明确回复“那就继续”。沿用 v1.8.2 草稿、独立 worktree 和 `codex/optimize-footprint-v1.8.1`,Codex 串行执行;不另行发送源码、不使用 GPU、不安装依赖、不改 main、不推送或打包。按已有安排,本轮只实现并准备回归,运行验收统一进行。 + +| 任务 | 负责人/所有权 | 交付边界 | +| --- | --- | --- | +| J1 | Codex:JobManager、会话结果暂存、Host 退出及相关测试 | 近期终态对象数量有界;旧结果转存到独占、关闭即删除的会话临时文件,保留轻量索引及查询;转存失败或终态持久化待重试时不淘汰;恢复作业原持久化逻辑不变 | +| C1 | Codex:assetCache、api、GameCard/DetailSheet 及相关测试 | 限制封面请求并发;共享同一资产请求,按消费者取消尚未启动的排队工作,不能取消其他消费者;库/资产失效隔离迟到结果 | +| Q1 | Codex:事件汇总、LibraryController、useGamesQuery 及相关测试 | 只对可证明不影响当前查询成员和排序的变化局部更新;其余事件保留完整重查及已有分页/滚动修复;隐藏事件合并仍有效 | +| D1 | Codex:图谱及 docs/development | 保存源码检查点、已实现与待统一验收项目;不预先宣称性能收益 | + +写入按 J1、C1、Q1、D1 顺序进行。没有数据库迁移;会话结果暂存不是跨重启历史库。作业归档通过 JSON 保留公开结果形状;近期内存结果保留原对象类型,旧结果按 JSON 回读。临时文件仅由应用创建,使用 CreateNew、独占共享与 DeleteOnClose,不删除既有文件;测试 TEMP/TMP 仍须限定在 worktree。 + +统一验收增加:超过终态容量后的历史查询、转存失败不丢结果、持久化重试/取消竞态、暂存文件关闭清理;封面并发、共享请求与单消费者取消、过期队列、资产失效;保守增量刷新和完整重查选择、排序/筛选及分页回归。结果暂存失败可使缓存暂时超过目标容量,数据完整性优先。 + +实现检查点及尚未运行的统一验收入口见 [RG-04 实施记录](2026-10-31-rg04-implementation.md)。 From cd3a051c30a2d41e1b0e6a14cd14a792b583f3d9 Mon Sep 17 00:00:00 2001 From: AaronSu Date: Sat, 31 Oct 2026 13:00:55 +0800 Subject: [PATCH 23/29] fix(build): keep virtual row regression compatible with ES2020 --- src/GameLibrary.Tauri/src/lib/hooks/useVirtualRows.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/GameLibrary.Tauri/src/lib/hooks/useVirtualRows.test.ts b/src/GameLibrary.Tauri/src/lib/hooks/useVirtualRows.test.ts index 7161226..0fd73cf 100644 --- a/src/GameLibrary.Tauri/src/lib/hooks/useVirtualRows.test.ts +++ b/src/GameLibrary.Tauri/src/lib/hooks/useVirtualRows.test.ts @@ -7,7 +7,7 @@ it("bounds a large library to viewport rows and pins only the focused row", () = const rows = virtualRowIndices(range.first, range.last, 0, 10000); expect(rows).toHaveLength(13); expect(rows[0]).toBe(0); - expect(rows.at(-1)).toBe(58); + expect(rows[rows.length - 1]).toBe(58); expect(virtualRowIndices(47, 59, 50, 10000)).toHaveLength(12); }); From d16dd17e11b643c330b5cdc1909d2f787eb14419 Mon Sep 17 00:00:00 2001 From: AaronSu Date: Sat, 31 Oct 2026 13:07:38 +0800 Subject: [PATCH 24/29] docs: record v1.8.2 local installer acceptance build --- .gitignore | 3 ++ .../2026-10-31-rg04-implementation.md | 2 + .../2026-10-31-v1.8.2-acceptance-build.md | 45 +++++++++++++++++++ 3 files changed, 50 insertions(+) create mode 100644 docs/development/2026-10-31-v1.8.2-acceptance-build.md diff --git a/.gitignore b/.gitignore index 325dfc5..df7cc1c 100644 --- a/.gitignore +++ b/.gitignore @@ -25,6 +25,9 @@ __pycache__/ # RG-02 isolated builds, fixtures and measurements /.tmp/rg02/ +# Local installer candidate build logs and isolated tool caches +/.tmp/rg05/ + # 用户笔记配置(不纳入工程版本控制) .obsidian/ diff --git a/docs/development/2026-10-31-rg04-implementation.md b/docs/development/2026-10-31-rg04-implementation.md index e7f5293..c96f2ee 100644 --- a/docs/development/2026-10-31-rg04-implementation.md +++ b/docs/development/2026-10-31-rg04-implementation.md @@ -62,3 +62,5 @@ dotnet test tests/GameLibrary.IntegrationTests/GameLibrary.IntegrationTests.cspr 源码检查点 `75d203a9065992792ca50d3a2b059e4250c0ba8b` 的图谱使用本 worktree 作为显式 repo_root,minimal 后处理,无嵌入模型。解析无错误,索引 441 个文件、4,321 个节点、43,356 条关系;CALLS 直接解析 9,491 条、未解析 24,660 条。见 [RG-04 快照](../code-review-graph/rg04-footprint.json)。这些是结构数据,不是编译或功能证据。 J1、C1、Q1 的实现与回归源码已提交,D1 文档和图谱同步完成;运行正确性、性能收益、NativeAOT 默认切换及整体验收仍待执行。不将源码完成等同于验收完成。 + +用户随后授权生成本机验收安装包;v1.8.2 的生产编译、NSIS 打包及未运行项目另见 [本地验收构建记录](2026-10-31-v1.8.2-acceptance-build.md)。这不改变本轮原始未执行记录,也不代表实机验收通过。 diff --git a/docs/development/2026-10-31-v1.8.2-acceptance-build.md b/docs/development/2026-10-31-v1.8.2-acceptance-build.md new file mode 100644 index 0000000..5ad244c --- /dev/null +++ b/docs/development/2026-10-31-v1.8.2-acceptance-build.md @@ -0,0 +1,45 @@ +# v1.8.2 本地安装验收构建 + +2026-10-31,用户授权:“更新版本号,打包一下安装包,我在本机实机测试验收一下”。本次交付本地待验收构建,未推送、创建远程 Release、安装或启动候选程序;未操作正式游戏库或终止正式实例。 + +## 版本与来源 + +- 版本真源 `Directory.Build.props` 及 Tauri package.json、npm lock、Cargo.toml、Cargo.lock 产品条目均为 `1.8.2`;打包入口的一致性断言通过,安装器文件和产品版本均为 `1.8.2`。 +- 分支:`codex/optimize-footprint-v1.8.1`。 +- 构建源码:`cd3a051c30a2d41e1b0e6a14cd14a792b583f3d9`,包括 RG-02/03/04 和本次 ES2020 回归源码编译修正。 +- 生产链路仍是压缩自包含 sidecar,NativeAOT 只保留候选配置,没有切入本包。 +- `release-validation.json` 保留原始 `sourceDirty: true`:构建入口取状态时,`.tmp/rg05` 的包装脚本和隔离缓存尚未加入忽略。生产源码已提交;后续补上该临时目录的忽略规则,没有改写构建报告。 + +## 本地交付 + +产物目录相对本 worktree:`artifacts/dist/v1.8.2-rg04-20261031-acceptance/`。 + +| 文件 | 字节数 | +| --- | ---: | +| GameLibrary-Setup-v1.8.2.exe | 67,649,300 | +| GameLibrary-Portable-win-x64-v1.8.2.zip | 70,313,501 | +| GameLibrary-Tools-win-x64-v1.8.2.zip | 101,355,601 | + +安装器 SHA-256:`a3d3696dd0650f936947c1a158ad3da67e564438c7591a9e029e8fb99102d035`。同目录的 `GameLibrary-v1.8.2-SHA256SUMS.txt` 保存三个包的校验和;`release-validation.json`、`RELEASE-CHECKLIST.md`、`package-log.txt` 和 `evidence/` 保存构建证据。未进行 Authenticode 签名,未读取或使用签名凭据。 + +## 执行与限制 + +使用现有 `artifacts/tools/package_release.py --build-only-reason ... --dist ... --makensis ...`,仅编译打包。NSIS 3.12 编译器复用 `D:/Official/GameLibrary/artifacts/toolchain/nsis-3.12/nsis-3.12/makensis.exe`,输出全部指向本 worktree。TEMP/TMP、解压目录、CLI home、HTTP/npm 缓存位于 `.tmp/rg05/`;Cargo 离线,NuGet 仅用已有包缓存和空的本地源,没有安装或升级依赖。 + +| 检查 | 状态与证据 | +| --- | --- | +| Host、CLI、MCP Release 发布 | passed,evidence/check-10.log 至 check-12.log | +| Bridge 与后台 Host sidecar、前端、Tauri Release | passed,evidence/check-13.log;前端生产构建包含 tsc,Rust release 编译成功 | +| NSIS 安装器编译 | passed,evidence/check-15.log;使用 /WX | +| 独立测试、格式化、独立 typecheck 和发布门禁 | not-run,按 build-only 模式记录;生产构建内的 tsc 不等同独立测试通过 | +| 桌面烟测、安装/升级/卸载、真实游戏、性能 | not-run,供用户实机验收;stableReady 为 false | + +两次失败尝试留在相邻目录:首次隔离 CLI home 改变默认 NuGet 缓存位置,离线还原失败;指定已有缓存后,前端编译发现回归源码使用 ES2022 的 Array.at,与 ES2020 目标不符。修为普通索引并提交后,本次完整打包成功。未跳过编译错误,也未把失败目录当成交付包。 + +首次 SDK 初始化日志还输出了“已安装 ASP.NET Core HTTPS 开发证书”的提示。后续设置进程级 `DOTNET_GENERATE_ASPNET_CERTIFICATE=false`;没有执行证书删除、信任或查询命令,未核查证书库实际变动。未修改系统或用户环境变量。 + +## 实机验收范围 + +可先使用示例库或库副本验收安装与 v1.8.2 启动,再检查扫描/审核/启动和游玩记录。重点覆盖大库两种布局的滚动、缩放、键盘焦点与批量选择,分页后修改详情/封面,排序和筛选后刷新,隐藏到托盘后的事件补齐与游戏退出唤醒,以及长时间运行后的历史作业查询。 + +完整边界和待执行自动回归见 [RG-03](2026-10-31-rg03-implementation.md) 与 [RG-04](2026-10-31-rg04-implementation.md)。本次包没有运行时内存或性能测量结果,不能据打包成功宣称优化验收通过。 From 8a303d04113c0edaeaf40bc40267462b4311f7a7 Mon Sep 17 00:00:00 2001 From: AaronSu Date: Sat, 31 Oct 2026 13:13:33 +0800 Subject: [PATCH 25/29] docs: correct local installer handoff for workspace integrity labels --- docs/development/2026-10-31-v1.8.2-acceptance-build.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/docs/development/2026-10-31-v1.8.2-acceptance-build.md b/docs/development/2026-10-31-v1.8.2-acceptance-build.md index 5ad244c..ee9f943 100644 --- a/docs/development/2026-10-31-v1.8.2-acceptance-build.md +++ b/docs/development/2026-10-31-v1.8.2-acceptance-build.md @@ -43,3 +43,13 @@ 可先使用示例库或库副本验收安装与 v1.8.2 启动,再检查扫描/审核/启动和游玩记录。重点覆盖大库两种布局的滚动、缩放、键盘焦点与批量选择,分页后修改详情/封面,排序和筛选后刷新,隐藏到托盘后的事件补齐与游戏退出唤醒,以及长时间运行后的历史作业查询。 完整边界和待执行自动回归见 [RG-03](2026-10-31-rg03-implementation.md) 与 [RG-04](2026-10-31-rg04-implementation.md)。本次包没有运行时内存或性能测量结果,不能据打包成功宣称优化验收通过。 + +## 本机交付修正:NSIS 临时文件错误 + +用户运行原始 EXE 后报告 `Error writing temporary file. Make sure your temp folder is valid.`。只读排查确认:worktree 根目录具有可继承的 Low Mandatory Level,安装器 EXE 也继承该标签;普通 TEMP 目录存在且没有低完整性标签,C 盘剩余约 19.6 GB;安装器 SHA-256 与原始清单一致。 + +[Windows 完整性控制文档](https://learn.microsoft.com/en-us/windows/win32/secauthz/mandatory-integrity-control)说明,启动程序的完整性不高于可执行文件标签,低完整性进程不能写入中完整性对象。这解释了从本 worktree 直接运行安装器时的临时文件错误。未修改任何 ACL、完整性标签、系统 TEMP/TMP 或权限策略;没有重新运行安装器、安装程序或操作真实数据。 + +补充本地交付容器:`local-handoff/GameLibrary-Setup-v1.8.2.zip`,67,649,454 字节,SHA-256 为 `d78cc5a18cc756c7af23913b3423437352ea7d4a334b2dfd6185864ab70c9e64`。ZIP 仅含原始安装器,已回读核对内部 EXE 字节哈希一致,extra fields 为空,不携带 NTFS 安全描述符。这是封装校验,不是安装烟测。 + +请用 Windows 资源管理器将 ZIP 解压到“下载”或桌面等普通目录,再运行其中的 EXE;不要解压回该 worktree。源安装器、版本和原始构建报告保持原样,补充容器的校验和及说明在 `local-handoff/SHA256SUMS.txt` 和 `README-zh-CN.txt`。修正后的实际安装结果仍待用户验收。 From dd13b8d1045355a2adcaadff635527d998dc85e7 Mon Sep 17 00:00:00 2001 From: AaronSu Date: Sat, 31 Oct 2026 13:43:21 +0800 Subject: [PATCH 26/29] chore(release): prepare v1.8.2 and record maintainer acceptance --- README.en.md | 2 + README.ja.md | 2 + README.md | 2 + README.zh-TW.md | 2 + docs/releases/v1.8.2-manual-acceptance.md | 11 +++ docs/releases/v1.8.2.md | 68 +++++++++++++++++++ src/GameLibrary.Tauri/src-tauri/src/lib.rs | 4 +- .../HostConnectionRecoveryTests.cs | 8 ++- .../IpcJsonSerializationTests.cs | 9 ++- .../Manual/ManualGameTests.cs | 11 +-- .../Scanning/DirectoryWalkerTests.cs | 4 +- .../Scanning/JobManagerTests.cs | 2 +- .../Scanning/ScanBoundaryRegressionTests.cs | 43 +++++++++--- .../Scanning/ScanOperationTests.cs | 4 +- 14 files changed, 148 insertions(+), 24 deletions(-) create mode 100644 docs/releases/v1.8.2-manual-acceptance.md create mode 100644 docs/releases/v1.8.2.md diff --git a/README.en.md b/README.en.md index 0f5480a..2704023 100644 --- a/README.en.md +++ b/README.en.md @@ -8,6 +8,8 @@ # GameLibrary +**Current source: v1.8.2.** The single Bridge and library/cover resource changes passed the maintainer's local manual acceptance. Release preparation is in progress; automated results are recorded separately. + **v1.8.1 acceptance pre-release** fixes missed scans, drive-root detection, pending counts and duplicate shortcut entries. See the [release notes](docs/releases/v1.8.1.md). Stable downloads below remain on v1.8.0. Keep games scattered across your drives in one library. Choose a folder, check the launch entry, and open the game from your collection. diff --git a/README.ja.md b/README.ja.md index 6953c9c..b60d19d 100644 --- a/README.ja.md +++ b/README.ja.md @@ -8,6 +8,8 @@ # GameLibrary +**現在のソースは v1.8.2 です。** 単一 Bridge と一覧・カバーのリソース最適化は、保守担当者の実機検証を通過しました。Release 準備中で、自動検証結果は別途記録します。 + **v1.8.1 検証待ちプレリリース**:新規ゲームの検出漏れ、ドライブルートの誤認識、確認待ち件数、ショートカットの重複登録を修正します。[リリース説明](docs/releases/v1.8.1.md)。以下の安定版ダウンロードは v1.8.0 のままです。 ドライブに散らばったゲームを、一つのライブラリに。フォルダーを選び、起動ファイルを確認すると、一覧からゲームを開けます。 diff --git a/README.md b/README.md index e5df417..d84ec89 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,8 @@ # GameLibrary +**当前源码 v1.8.2**:单 Bridge、列表与封面占用优化已通过维护者本机人工验收,正在整理 Release;自动验证以本次发布记录为准。 + **待验收预发布 v1.8.1**:修复新游戏漏扫、磁盘根误识别、待确认计数及快捷方式重复入库,见[发布说明](docs/releases/v1.8.1.md)。正式版下载仍指向下方的 v1.8.0。 把散落在硬盘里的游戏放到一处。选好文件夹,确认启动项,就能从游戏库打开游戏。 diff --git a/README.zh-TW.md b/README.zh-TW.md index 0f8540d..4bcc25c 100644 --- a/README.zh-TW.md +++ b/README.zh-TW.md @@ -8,6 +8,8 @@ # GameLibrary +**目前原始碼 v1.8.2**:單 Bridge、清單與封面資源最佳化已通過維護者本機人工驗收,正在整理 Release;自動驗證以本次發布紀錄為準。 + **待驗收預發布 v1.8.1**:修復新遊戲漏掃、磁碟根目錄誤識別、待確認計數及捷徑重複入庫,詳見[發布說明](docs/releases/v1.8.1.md)。下方正式版下載仍為 v1.8.0。 把散落在硬碟裡的遊戲放到同一處。選好資料夾、確認啟動項目,就能從遊戲庫開啟遊戲。 diff --git a/docs/releases/v1.8.2-manual-acceptance.md b/docs/releases/v1.8.2-manual-acceptance.md new file mode 100644 index 0000000..3885f63 --- /dev/null +++ b/docs/releases/v1.8.2-manual-acceptance.md @@ -0,0 +1,11 @@ +# v1.8.2 维护者本机人工验收 + +2026-10-31,当前会话中维护者明确反馈: + +> 人工验收通过,没有可见bug,将当前branch并入main,并更新版本号,打包release + +本机人工验收状态:passed。对应此前交付的 v1.8.2 构建,二进制源码为 `cd3a051c30a2d41e1b0e6a14cd14a792b583f3d9`,安装器 SHA-256 为 `a3d3696dd0650f936947c1a158ad3da67e564438c7591a9e029e8fb99102d035`。维护者在收到 ZIP 交付说明后提供上述结论,见 [构建与本地交付记录](../development/2026-10-31-v1.8.2-acceptance-build.md)。 + +该确认覆盖维护者的本机使用结果,未逐项声明 Windows 10/11 干净环境、全部 DPI/语言、安装升级卸载矩阵或量化性能结果。自动测试、构建和发布完整性检查分别登记,不由此推定为 passed。 + +本次授权覆盖将当前重构分支合入 main、同步 v1.8.2 版本和生成 Release 产物。原 main 的未提交文件保留,构建与测试继续在重构 worktree 进行;不操作正式游戏库或终止正式实例。 diff --git a/docs/releases/v1.8.2.md b/docs/releases/v1.8.2.md new file mode 100644 index 0000000..5d9d65f --- /dev/null +++ b/docs/releases/v1.8.2.md @@ -0,0 +1,68 @@ +# GameLibrary v1.8.2 · 桌面资源占用优化 + +## 简体中文 + +减少桌面后台进程和大库界面的资源保留,继续使用现有游戏库数据格式。维护者本机人工验收已通过;自动验证和最终发布状态另见本次构建记录。 + +### 主要变化 + +- 两个常驻 Bridge 合并为一个,普通操作和事件长轮询使用独立连接,等待事件期间仍可处理操作。 +- 网格和紧凑布局只挂载可见行及邻近行;封面按需读取、限制并发,屏外或关闭详情后移除排队消费者。 +- 隐藏窗口时合并普通刷新,显示后补齐;保留事件消费和游戏退出唤醒,空闲 Unity 状态查询降低频率。 +- 详情、设置等按需加载;近期作业结果保留在内存,旧结果在当前会话暂存并可查询,转存失败时保留原结果。 +- 小批已知游戏变更可局部刷新;排序、筛选、库身份或纪元不确定时完整重查。 + +### 修复 + +- 父进程退出监视遇到拒绝访问时使用受限回退,保留只停止所属 Host 的清理边界。 +- 跨库/纪元的分页不再拼接,旧纪元较高 revision 不覆盖恢复后的记录。 +- 保留 v1.8.1 的扫描边界、候选计数、快捷方式去重和压缩 sidecar 发布修复。 + +### 升级与数据保留 + +先从托盘退出旧版,再安装新版或替换便携版程序。保留游戏库数据目录及原游戏文件;本版没有数据库结构迁移。默认仍为自包含压缩 sidecar,NativeAOT 候选未启用。 + +### 下载 + +| 文件 | 用途 | +| --- | --- | +| GameLibrary-Setup-v1.8.2.exe | 当前用户 NSIS 安装器 | +| GameLibrary-Portable-win-x64-v1.8.2.zip | 免安装桌面包 | +| GameLibrary-Tools-win-x64-v1.8.2.zip | Host、CLI、MCP | +| GameLibrary-v1.8.2-SHA256SUMS.txt | 三个分发包的 SHA-256 | + +### 验证与限制 + +[维护者本机人工验收](v1.8.2-manual-acceptance.md)通过,无可见 bug。自动门禁按本次实际结果分别登记,未执行不计通过。整棵桌面进程树的内存收益及完整 Windows/DPI 验收矩阵未量化确认。程序未签名,Windows 可能提示未知发布者。 + +--- + +## English + +Reduces desktop background processes and retained library UI resources while preserving existing library data formats. The maintainer's local manual acceptance passed; automated checks are recorded separately. + +### Highlights + +- One resident Bridge with independent request and event connections. +- Windowed grid/compact rows, bounded cover fetching and cancellation per consumer. +- Deferred ordinary refreshes while hidden, continued event consumption and game-exit wakeup, and slower idle Unity polling. +- On-demand dialogs and session storage for older completed job results, retaining memory results if storage fails. +- Conservative incremental updates with full-query fallback for uncertain membership, ordering or library epochs. + +### Fixes + +- Access-denied fallback for parent exit monitoring while preserving owned-Host cleanup. +- No page mixing across library identities or epochs, and no stale revision merge after restore. +- Retains v1.8.1 scanning and sidecar publishing fixes. + +### Upgrade and data preservation + +Quit the old application from the tray before upgrading. Keep the library data directory and original games; no database schema migration is introduced. Default sidecars remain compressed and self-contained; NativeAOT remains an optional candidate. + +### Downloads + +The four assets listed above provide the installer, portable desktop, advanced tools and SHA-256 manifest. + +### Validation and limitations + +The maintainer reported local manual acceptance passed with no visible bugs. Automated gates retain their actual status. Full Windows/DPI matrices and whole-desktop memory gains remain unverified. Executables are unsigned and may trigger an unknown-publisher warning. diff --git a/src/GameLibrary.Tauri/src-tauri/src/lib.rs b/src/GameLibrary.Tauri/src-tauri/src/lib.rs index 3f9e03b..047c010 100644 --- a/src/GameLibrary.Tauri/src-tauri/src/lib.rs +++ b/src/GameLibrary.Tauri/src-tauri/src/lib.rs @@ -621,8 +621,8 @@ pub fn run() { if window.label() == "main" && matches!(event, WindowEvent::Focused(_) | WindowEvent::Resized(_)) { - let visible = window.is_visible().unwrap_or(true) - && !window.is_minimized().unwrap_or(false); + let visible = + window.is_visible().unwrap_or(true) && !window.is_minimized().unwrap_or(false); let _ = window.emit(WINDOW_VISIBILITY_EVENT, visible); } if let WindowEvent::CloseRequested { api, .. } = event { diff --git a/tests/GameLibrary.IntegrationTests/HostConnectionRecoveryTests.cs b/tests/GameLibrary.IntegrationTests/HostConnectionRecoveryTests.cs index 78a8d92..d4e59c0 100644 --- a/tests/GameLibrary.IntegrationTests/HostConnectionRecoveryTests.cs +++ b/tests/GameLibrary.IntegrationTests/HostConnectionRecoveryTests.cs @@ -126,8 +126,12 @@ private static async Task HandshakeAsync(NamedPipeServerStream server, Cancellat { await server.WaitForConnectionAsync(token); await IpcFrame.ReadJsonAsync(server, token); - await IpcFrame.WriteJsonAsync(server, new HandshakeResponse { HostInstanceId = "test", LibraryInstanceId = libraryInstanceId, - DataEpoch = libraryInstanceId is null ? null : "epoch" }, token); + await IpcFrame.WriteJsonAsync(server, new HandshakeResponse + { + HostInstanceId = "test", + LibraryInstanceId = libraryInstanceId, + DataEpoch = libraryInstanceId is null ? null : "epoch" + }, token); } private static IpcRequest Request(string id) => new() { RequestId = id, OperationId = "host.status" }; diff --git a/tests/GameLibrary.IntegrationTests/IpcJsonSerializationTests.cs b/tests/GameLibrary.IntegrationTests/IpcJsonSerializationTests.cs index 3dfb26e..7464bd1 100644 --- a/tests/GameLibrary.IntegrationTests/IpcJsonSerializationTests.cs +++ b/tests/GameLibrary.IntegrationTests/IpcJsonSerializationTests.cs @@ -46,8 +46,13 @@ public async Task GeneratedClientJson_PreservesContractAndFrameRoundTrip(Operati [Fact] public void GeneratedHandshakeAndRequest_PreservePermissionsIdentityAndNulls() { - var request = new IpcRequest { RequestId = "same-id", OperationId = "host.status", - LibraryInstanceId = "library", ExpectedDataEpoch = "epoch" }; + var request = new IpcRequest + { + RequestId = "same-id", + OperationId = "host.status", + LibraryInstanceId = "library", + ExpectedDataEpoch = "epoch" + }; using var generated = JsonDocument.Parse(JsonSerializer.Serialize(request, IpcJsonContext.Wire.IpcRequest)); using var legacy = JsonDocument.Parse(JsonSerializer.Serialize(request, ContractJson.Options)); Assert.True(JsonElement.DeepEquals(legacy.RootElement, generated.RootElement)); diff --git a/tests/GameLibrary.IntegrationTests/Manual/ManualGameTests.cs b/tests/GameLibrary.IntegrationTests/Manual/ManualGameTests.cs index 163c341..b525713 100644 --- a/tests/GameLibrary.IntegrationTests/Manual/ManualGameTests.cs +++ b/tests/GameLibrary.IntegrationTests/Manual/ManualGameTests.cs @@ -2,8 +2,8 @@ using System.Text.Json; using GameLibrary.Contracts; using GameLibrary.Contracts.Ipc; -using GameLibrary.Host.Scanning; using GameLibrary.Domain.Paths; +using GameLibrary.Host.Scanning; using GameLibrary.HostClient; using GameLibrary.Infrastructure.Shell; using Xunit; @@ -304,12 +304,14 @@ public async Task ShortcutAndUnrealDirectory_DoNotCreateDuplicateCards_InEitherO } var created = await InvokeAsync("games.create", new { - sourcePath = shortcutFirst ? link : game, idempotencyKey = Guid.NewGuid().ToString("N"), + sourcePath = shortcutFirst ? link : game, + idempotencyKey = Guid.NewGuid().ToString("N"), }); Assert.True(created.Ok, created.Error?.Message); var duplicate = await InvokeAsync("games.create", new { - sourcePath = shortcutFirst ? game : link, idempotencyKey = Guid.NewGuid().ToString("N"), + sourcePath = shortcutFirst ? game : link, + idempotencyKey = Guid.NewGuid().ToString("N"), }); Assert.False(duplicate.Ok); Assert.Equal(ErrorCodes.InvalidArgument, duplicate.Error!.Code); @@ -318,7 +320,8 @@ public async Task ShortcutAndUnrealDirectory_DoNotCreateDuplicateCards_InEitherO var pending = Assert.Single(store.ListCandidates(), candidate => candidate.PhysicalPath == game); var accepted = await InvokeAsync("candidates.accept", new { - candidateId = pending.CandidateId, expectedRevision = pending.Revision, + candidateId = pending.CandidateId, + expectedRevision = pending.Revision, idempotencyKey = Guid.NewGuid().ToString("N"), }); Assert.False(accepted.Ok); diff --git a/tests/GameLibrary.IntegrationTests/Scanning/DirectoryWalkerTests.cs b/tests/GameLibrary.IntegrationTests/Scanning/DirectoryWalkerTests.cs index 065f935..6548114 100644 --- a/tests/GameLibrary.IntegrationTests/Scanning/DirectoryWalkerTests.cs +++ b/tests/GameLibrary.IntegrationTests/Scanning/DirectoryWalkerTests.cs @@ -23,7 +23,9 @@ public void Walk_ExactIgnoredDirectoryAndFile_KeepChildDiscoveryAcrossResume() File.WriteAllText(visibleFile, "fixture"); var rules = new ScanRuleSet(new[] { collection, hiddenFile }.Select((path, i) => new ScanRule { - RuleId = "exact-" + i, Source = ScanRuleSource.User, Action = ScanRuleAction.Exclude, + RuleId = "exact-" + i, + Source = ScanRuleSource.User, + Action = ScanRuleAction.Exclude, Matcher = new ExactPathMatcher(GamePath.Create(path).ComparisonKey), })); var walker = new DirectoryWalker(GamePath.Create(root), rules, diff --git a/tests/GameLibrary.IntegrationTests/Scanning/JobManagerTests.cs b/tests/GameLibrary.IntegrationTests/Scanning/JobManagerTests.cs index b410c67..b7de495 100644 --- a/tests/GameLibrary.IntegrationTests/Scanning/JobManagerTests.cs +++ b/tests/GameLibrary.IntegrationTests/Scanning/JobManagerTests.cs @@ -1,5 +1,5 @@ -using GameLibrary.Host.Hosting; using System.Text.Json; +using GameLibrary.Host.Hosting; using Xunit; namespace GameLibrary.IntegrationTests.Scanning; diff --git a/tests/GameLibrary.IntegrationTests/Scanning/ScanBoundaryRegressionTests.cs b/tests/GameLibrary.IntegrationTests/Scanning/ScanBoundaryRegressionTests.cs index 4943b45..510cfd5 100644 --- a/tests/GameLibrary.IntegrationTests/Scanning/ScanBoundaryRegressionTests.cs +++ b/tests/GameLibrary.IntegrationTests/Scanning/ScanBoundaryRegressionTests.cs @@ -8,8 +8,8 @@ using GameLibrary.Domain.States; using GameLibrary.Host.Hosting; using GameLibrary.Host.Scanning; -using GameLibrary.Infrastructure.Persistence; using GameLibrary.Infrastructure.Catalog; +using GameLibrary.Infrastructure.Persistence; using GameLibrary.Infrastructure.Scanning; using Xunit; @@ -83,17 +83,27 @@ public async Task InspectedDriveRoot_RetiresOnlyUnboundPending_AndSynchronizesNo var now = DateTime.UtcNow; store.UpsertCandidate(new() { - CandidateId = "legacy-drive", Kind = "gameRoot", PhysicalPath = drive.PhysicalPath, - RelativePath = "", PayloadJson = "{\"engines\":[{\"engine\":\"godot\"}],\"preserved\":true}", - ReviewState = bound ? "pendingReview" : state, ObservedUtc = now, UpdatedUtc = now, + CandidateId = "legacy-drive", + Kind = "gameRoot", + PhysicalPath = drive.PhysicalPath, + RelativePath = "", + PayloadJson = "{\"engines\":[{\"engine\":\"godot\"}],\"preserved\":true}", + ReviewState = bound ? "pendingReview" : state, + ObservedUtc = now, + UpdatedUtc = now, }); if (bound) { var current = store.TryGetCandidate("legacy-drive")!; var accepted = store.AcceptCandidate(current.CandidateId, current.Revision, new GameCard { - GameId = "existing-game", Title = "fixture", RootPath = drive.PhysicalPath, - Kind = "gameRoot", Membership = "active", AcceptedUtc = now, UpdatedUtc = now, + GameId = "existing-game", + Title = "fixture", + RootPath = drive.PhysicalPath, + Kind = "gameRoot", + Membership = "active", + AcceptedUtc = now, + UpdatedUtc = now, }, "godot", now); Assert.Equal("existing-game", accepted.GameId); if (state != "accepted") @@ -154,8 +164,14 @@ public async Task DriveRootRetirement_RequiresCurrentRegisteredLibraryScope(stri if (rootKind is not null) store.UpsertRoot(new("root", drive.PhysicalPath, 1, now, rootKind), now); store.UpsertCandidate(new() { - CandidateId = "legacy", Kind = "gameRoot", PhysicalPath = drive.PhysicalPath, - RelativePath = "", PayloadJson = "{}", ReviewState = "pendingReview", ObservedUtc = now, UpdatedUtc = now, + CandidateId = "legacy", + Kind = "gameRoot", + PhysicalPath = drive.PhysicalPath, + RelativePath = "", + PayloadJson = "{}", + ReviewState = "pendingReview", + ObservedUtc = now, + UpdatedUtc = now, }); var collector = new ScanCandidateCollector(drive, "scope", new()); collector.InspectDirectory(new(drive.PhysicalPath, 0, [], []), CancellationToken.None, @@ -173,9 +189,14 @@ public void ShortcutIdentity_RequiresVerifiedEntryOrUniquePackagedUnrealProject_ Directory.CreateDirectory(Path.Combine(_root, "Install/Engine")); var game = new GameCard { - GameId = "shortcut", Title = "same title", RootPath = Path.Combine(_root, "Install/Play.lnk"), - Kind = "manualShortcut", EntryPath = shipping, Membership = "active", - AcceptedUtc = DateTime.UtcNow, UpdatedUtc = DateTime.UtcNow, + GameId = "shortcut", + Title = "same title", + RootPath = Path.Combine(_root, "Install/Play.lnk"), + Kind = "manualShortcut", + EntryPath = shipping, + Membership = "active", + AcceptedUtc = DateTime.UtcNow, + UpdatedUtc = DateTime.UtcNow, }; Assert.Equal(game.GameId, Assert.Single(new ShortcutGameIdentity([game]).FindMatches([wrapper])).GameId); var other = Write("Other/Sample.exe"); diff --git a/tests/GameLibrary.IntegrationTests/Scanning/ScanOperationTests.cs b/tests/GameLibrary.IntegrationTests/Scanning/ScanOperationTests.cs index a52c7ad..044d36e 100644 --- a/tests/GameLibrary.IntegrationTests/Scanning/ScanOperationTests.cs +++ b/tests/GameLibrary.IntegrationTests/Scanning/ScanOperationTests.cs @@ -58,7 +58,9 @@ public async Task Rescan_ExactIgnoredCollectionDiscoversNewUnityGames_WithoutRem .Single(item => item.GetProperty("physicalPath").GetString() == collection); var ignored = await InvokeAsync("ignores.create", new { - scope = "ExactPath", path = collection, idempotencyKey = Guid.NewGuid().ToString("N"), + scope = "ExactPath", + path = collection, + idempotencyKey = Guid.NewGuid().ToString("N"), }); Assert.True(ignored.Ok, ignored.Error?.Message); var newGames = new[] { "New Game", "新しいゲーム" }; From 2cecef0ad0cbb23d2517b85a485c6ff4f776b062 Mon Sep 17 00:00:00 2001 From: AaronSu Date: Sat, 31 Oct 2026 13:48:18 +0800 Subject: [PATCH 27/29] fix(ci): align website release link gate with current download UI --- scripts/check_website.py | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/scripts/check_website.py b/scripts/check_website.py index 4811066..e65f4a5 100644 --- a/scripts/check_website.py +++ b/scripts/check_website.py @@ -157,8 +157,8 @@ def resolve(file, path): for page in pages.values(): if {i for i in cn.ids if not i.startswith("_")} != {i for i in page.ids if not i.startswith("_")}: errors.append("translated pages have different section IDs") - if downloads(cn) != downloads(page) or len(downloads(page)) != 6: - errors.append("release links must match across languages (three packages, checksums, stable notes, prerelease)") + if downloads(cn) != downloads(page) or len(downloads(page)) != 5: + errors.append("release links must match across languages (three packages, checksums, stable notes)") if not any("prefers-reduced-motion" in style for style in styles): errors.append("compiled styles need a reduced-motion rule") try: @@ -192,6 +192,21 @@ def self_test(): (root / "index.html").write_text('', encoding="utf-8") (root / "test.css").write_text('body{color:#111d23}', encoding="utf-8") assert any("reduced-motion" in error for error in validate(root)) + release = "https://github.com/sumingwang233/GameLibrary/releases/" + urls = [release + "download/v1.8.0/" + name for name in ( + "GameLibrary-Setup-v1.8.0.exe", "GameLibrary-Portable-win-x64-v1.8.0.zip", + "GameLibrary-Tools-win-x64-v1.8.0.zip", "GameLibrary-v1.8.0-SHA256SUMS.txt")] + urls.append(release + "tag/v1.8.0") + links = "".join(f'Download' for url in urls) + for locale in ("", "zh-TW", "en", "ja"): + folder = root / locale + folder.mkdir(exist_ok=True) + (folder / "index.html").write_text(links, encoding="utf-8") + assert not any("release links" in error for error in validate(root)) + (root / "en/index.html").write_text(links.replace("v1.8.0", "v1.8.1"), encoding="utf-8") + assert any("release links" in error for error in validate(root)) + (root / "en/index.html").write_text(links.replace(f'Download', ""), encoding="utf-8") + assert any("release links" in error for error in validate(root)) print("Website gate regression check passed.") From c21ba153224c33aed0b8758606f59e5f27d9b62a Mon Sep 17 00:00:00 2001 From: AaronSu Date: Sat, 31 Oct 2026 14:06:45 +0800 Subject: [PATCH 28/29] docs(release): finalize v1.8.2 prerelease assets and validation --- README.en.md | 18 ++++----- README.ja.md | 18 ++++----- README.md | 18 ++++----- README.zh-TW.md | 18 ++++----- docs/releases/v1.8.2-validation.md | 59 ++++++++++++++++++++++++++++++ docs/releases/v1.8.2.md | 10 ++--- website/lib/site.ts | 2 +- 7 files changed, 101 insertions(+), 42 deletions(-) create mode 100644 docs/releases/v1.8.2-validation.md diff --git a/README.en.md b/README.en.md index 2704023..3f1fe0e 100644 --- a/README.en.md +++ b/README.en.md @@ -8,34 +8,34 @@ # GameLibrary -**Current source: v1.8.2.** The single Bridge and library/cover resource changes passed the maintainer's local manual acceptance. Release preparation is in progress; automated results are recorded separately. +**v1.8.2 pre-release:** single Bridge and library/cover optimizations passed local manual acceptance. [Release](https://github.com/sumingwang233/GameLibrary/releases/tag/v1.8.2) · [Validation](docs/releases/v1.8.2-validation.md). Stable downloads remain on v1.8.1. + -**v1.8.1 acceptance pre-release** fixes missed scans, drive-root detection, pending counts and duplicate shortcut entries. See the [release notes](docs/releases/v1.8.1.md). Stable downloads below remain on v1.8.0. Keep games scattered across your drives in one library. Choose a folder, check the launch entry, and open the game from your collection. The current formal release, **v1.8.0**, turns bulk favoriting, tagging and removal into one operation, fixes the stale bridge connection after the background service restarts and the unbounded polling retries, and narrows the installer's permission scope. Godot/MTool, Unity translation and the Played library remain available. See the [release notes](docs/releases/v1.8.0.md). -**[Download the Windows installer](https://github.com/sumingwang233/GameLibrary/releases/download/v1.8.0/GameLibrary-Setup-v1.8.0.exe)** · [All releases](https://github.com/sumingwang233/GameLibrary/releases) · [Report an issue](https://github.com/sumingwang233/GameLibrary/issues) +**[Download the Windows installer](https://github.com/sumingwang233/GameLibrary/releases/download/v1.8.1/GameLibrary-Setup-v1.8.1.exe)** · [All releases](https://github.com/sumingwang233/GameLibrary/releases) · [Report an issue](https://github.com/sumingwang233/GameLibrary/issues) [Download](#download) · [Screenshots](#demo) · [Get started](#start) · [FAQ](#faq) ## Download -The current formal release is **v1.8.0**, targeting **Windows 10 / 11 x64**. Automated checks cover build, tests, type checking, formatting and packaging; results and exit codes are in the [release record](docs/releases/v1.8.0-validation.md). Manual acceptance was confirmed by the maintainer. The installer is unsigned, so Windows may warn about an unknown publisher. +The current public stable release is **v1.8.1**, targeting **Windows 10 / 11 x64**. Actual build and validation results are in the [release record](docs/releases/v1.8.1-validation.md). The installer is unsigned and may trigger an unknown-publisher warning. | File | Use | |---|---| -| [`GameLibrary-Setup-v1.8.0.exe`](https://github.com/sumingwang233/GameLibrary/releases/download/v1.8.0/GameLibrary-Setup-v1.8.0.exe) | Recommended. Current-user installer with a choice of installation folder. | -| [`GameLibrary-Portable-win-x64-v1.8.0.zip`](https://github.com/sumingwang233/GameLibrary/releases/download/v1.8.0/GameLibrary-Portable-win-x64-v1.8.0.zip) | Extract and run GameLibrary.Desktop.exe. | -| [`GameLibrary-Tools-win-x64-v1.8.0.zip`](https://github.com/sumingwang233/GameLibrary/releases/download/v1.8.0/GameLibrary-Tools-win-x64-v1.8.0.zip) | Host, CLI and MCP for command-line use and automation. | -| [`GameLibrary-v1.8.0-SHA256SUMS.txt`](https://github.com/sumingwang233/GameLibrary/releases/download/v1.8.0/GameLibrary-v1.8.0-SHA256SUMS.txt) | SHA-256 checksums for the three packages above. | +| [`GameLibrary-Setup-v1.8.1.exe`](https://github.com/sumingwang233/GameLibrary/releases/download/v1.8.1/GameLibrary-Setup-v1.8.1.exe) | Recommended. Current-user installer with a choice of installation folder. | +| [`GameLibrary-Portable-win-x64-v1.8.1.zip`](https://github.com/sumingwang233/GameLibrary/releases/download/v1.8.1/GameLibrary-Portable-win-x64-v1.8.1.zip) | Extract and run GameLibrary.Desktop.exe. | +| [`GameLibrary-Tools-win-x64-v1.8.1.zip`](https://github.com/sumingwang233/GameLibrary/releases/download/v1.8.1/GameLibrary-Tools-win-x64-v1.8.1.zip) | Host, CLI and MCP for command-line use and automation. | +| [`GameLibrary-v1.8.1-SHA256SUMS.txt`](https://github.com/sumingwang233/GameLibrary/releases/download/v1.8.1/GameLibrary-v1.8.1-SHA256SUMS.txt) | SHA-256 checksums for the three packages above. | The executables and installer are not Authenticode-signed. Windows may show an unknown-publisher warning. Download from this repository and compare the hash with the same-version checksum file: ```powershell -Get-FileHash .\GameLibrary-Setup-v1.8.0.exe -Algorithm SHA256 +Get-FileHash .\GameLibrary-Setup-v1.8.1.exe -Algorithm SHA256 ``` diff --git a/README.ja.md b/README.ja.md index b60d19d..bb6239a 100644 --- a/README.ja.md +++ b/README.ja.md @@ -8,34 +8,34 @@ # GameLibrary -**現在のソースは v1.8.2 です。** 単一 Bridge と一覧・カバーのリソース最適化は、保守担当者の実機検証を通過しました。Release 準備中で、自動検証結果は別途記録します。 +**v1.8.2 プレリリース**:単一 Bridge と一覧・カバーの最適化は実機検証を通過しました。[リリース](https://github.com/sumingwang233/GameLibrary/releases/tag/v1.8.2) · [検証記録](docs/releases/v1.8.2-validation.md)。安定版は v1.8.1 です。 + -**v1.8.1 検証待ちプレリリース**:新規ゲームの検出漏れ、ドライブルートの誤認識、確認待ち件数、ショートカットの重複登録を修正します。[リリース説明](docs/releases/v1.8.1.md)。以下の安定版ダウンロードは v1.8.0 のままです。 ドライブに散らばったゲームを、一つのライブラリに。フォルダーを選び、起動ファイルを確認すると、一覧からゲームを開けます。 現在の正式版 **v1.8.0** は、一括のお気に入り・タグ付け・ライブラリからの削除を一度の操作にまとめ、バックグラウンドサービスの再起動後に接続が失われる問題とポーリングの無限再試行を修正し、インストーラーの権限範囲を絞り込みました。Godot/MTool、Unity 翻訳、プレイ済みライブラリは引き続き利用できます。[リリース説明](docs/releases/v1.8.0.md)をご確認ください。 -**[Windows インストーラーをダウンロード](https://github.com/sumingwang233/GameLibrary/releases/download/v1.8.0/GameLibrary-Setup-v1.8.0.exe)** · [すべてのリリース](https://github.com/sumingwang233/GameLibrary/releases) · [不具合の報告](https://github.com/sumingwang233/GameLibrary/issues) +**[Windows インストーラーをダウンロード](https://github.com/sumingwang233/GameLibrary/releases/download/v1.8.1/GameLibrary-Setup-v1.8.1.exe)** · [すべてのリリース](https://github.com/sumingwang233/GameLibrary/releases) · [不具合の報告](https://github.com/sumingwang233/GameLibrary/issues) [ダウンロード](#download) · [画面](#demo) · [使い始める](#start) · [よくある質問](#faq) ## ダウンロード -現在の正式リリースは **v1.8.0** で、対象は **Windows 10 / 11 x64** です。ビルド、テスト、型チェック、フォーマット、パッケージングを含む自動チェックを実施し、結果と終了コードは[リリース記録](docs/releases/v1.8.0-validation.md)にあります。手動確認はメンテナーが実施済みです。インストーラーは未署名のため、Windows が不明な発行元として警告する場合があります。 +現在の正式リリースは **v1.8.1** で、対象は **Windows 10 / 11 x64** です。実際のビルドと検証結果は[リリース記録](docs/releases/v1.8.1-validation.md)を参照してください。インストーラーは未署名です。 | ファイル | 用途 | |---|---| -| [`GameLibrary-Setup-v1.8.0.exe`](https://github.com/sumingwang233/GameLibrary/releases/download/v1.8.0/GameLibrary-Setup-v1.8.0.exe) | 推奨。現在のユーザー向け。インストール先を選択できます。 | -| [`GameLibrary-Portable-win-x64-v1.8.0.zip`](https://github.com/sumingwang233/GameLibrary/releases/download/v1.8.0/GameLibrary-Portable-win-x64-v1.8.0.zip) | 展開して GameLibrary.Desktop.exe を実行します。 | -| [`GameLibrary-Tools-win-x64-v1.8.0.zip`](https://github.com/sumingwang233/GameLibrary/releases/download/v1.8.0/GameLibrary-Tools-win-x64-v1.8.0.zip) | コマンドラインや自動化向けの Host、CLI、MCP。 | -| [`GameLibrary-v1.8.0-SHA256SUMS.txt`](https://github.com/sumingwang233/GameLibrary/releases/download/v1.8.0/GameLibrary-v1.8.0-SHA256SUMS.txt) | 上記 3 パッケージの SHA-256 チェックサム。 | +| [`GameLibrary-Setup-v1.8.1.exe`](https://github.com/sumingwang233/GameLibrary/releases/download/v1.8.1/GameLibrary-Setup-v1.8.1.exe) | 推奨。現在のユーザー向け。インストール先を選択できます。 | +| [`GameLibrary-Portable-win-x64-v1.8.1.zip`](https://github.com/sumingwang233/GameLibrary/releases/download/v1.8.1/GameLibrary-Portable-win-x64-v1.8.1.zip) | 展開して GameLibrary.Desktop.exe を実行します。 | +| [`GameLibrary-Tools-win-x64-v1.8.1.zip`](https://github.com/sumingwang233/GameLibrary/releases/download/v1.8.1/GameLibrary-Tools-win-x64-v1.8.1.zip) | コマンドラインや自動化向けの Host、CLI、MCP。 | +| [`GameLibrary-v1.8.1-SHA256SUMS.txt`](https://github.com/sumingwang233/GameLibrary/releases/download/v1.8.1/GameLibrary-v1.8.1-SHA256SUMS.txt) | 上記 3 パッケージの SHA-256 チェックサム。 | 実行ファイルとインストーラーは Authenticode 未署名です。Windows が発行元不明の警告を表示する場合があります。このリポジトリから取得し、同じ版のチェックサムと照合してください。 ```powershell -Get-FileHash .\GameLibrary-Setup-v1.8.0.exe -Algorithm SHA256 +Get-FileHash .\GameLibrary-Setup-v1.8.1.exe -Algorithm SHA256 ``` diff --git a/README.md b/README.md index d84ec89..7093b9d 100644 --- a/README.md +++ b/README.md @@ -8,34 +8,34 @@ # GameLibrary -**当前源码 v1.8.2**:单 Bridge、列表与封面占用优化已通过维护者本机人工验收,正在整理 Release;自动验证以本次发布记录为准。 +**v1.8.2 预发布**:单 Bridge、列表与封面占用优化已通过本机人工验收。[发布说明](https://github.com/sumingwang233/GameLibrary/releases/tag/v1.8.2) · [验证记录](docs/releases/v1.8.2-validation.md)。正式版下载保持 v1.8.1。 + -**待验收预发布 v1.8.1**:修复新游戏漏扫、磁盘根误识别、待确认计数及快捷方式重复入库,见[发布说明](docs/releases/v1.8.1.md)。正式版下载仍指向下方的 v1.8.0。 把散落在硬盘里的游戏放到一处。选好文件夹,确认启动项,就能从游戏库打开游戏。 当前正式版 **v1.8.0** 把批量收藏、批量加标签和批量移出做成一次操作,修复后台服务重启后连接失效、轮询无限重试的问题,并收窄安装配置的权限范围;此前的 Godot/MTool、Unity 翻译与已游玩游戏库保持不变。[发布说明](docs/releases/v1.8.0.md)记录本次变化与限制。 -**[下载 Windows 安装版](https://github.com/sumingwang233/GameLibrary/releases/download/v1.8.0/GameLibrary-Setup-v1.8.0.exe)** · [所有版本](https://github.com/sumingwang233/GameLibrary/releases) · [反馈问题](https://github.com/sumingwang233/GameLibrary/issues) +**[下载 Windows 安装版](https://github.com/sumingwang233/GameLibrary/releases/download/v1.8.1/GameLibrary-Setup-v1.8.1.exe)** · [所有版本](https://github.com/sumingwang233/GameLibrary/releases) · [反馈问题](https://github.com/sumingwang233/GameLibrary/issues) [下载](#download) · [界面](#demo) · [开始使用](#start) · [常见问题](#faq) ## 下载 -目前公开正式版为 **v1.8.0**,面向 **Windows 10 / 11 x64**。自动检查覆盖构建、测试、类型检查、格式与打包,结果和退出码见[发行记录](docs/releases/v1.8.0-validation.md);人工验收由维护者确认。安装包未签名,Windows 可能提示未知发布者。 +目前公开正式版为 **v1.8.1**,面向 **Windows 10 / 11 x64**。构建与验证的实际结果见[发行记录](docs/releases/v1.8.1-validation.md)。安装包未签名,Windows 可能提示未知发布者。 | 文件 | 适合谁 | |---|---| -| [`GameLibrary-Setup-v1.8.0.exe`](https://github.com/sumingwang233/GameLibrary/releases/download/v1.8.0/GameLibrary-Setup-v1.8.0.exe) | 推荐。当前用户安装器,可选择安装目录。 | -| [`GameLibrary-Portable-win-x64-v1.8.0.zip`](https://github.com/sumingwang233/GameLibrary/releases/download/v1.8.0/GameLibrary-Portable-win-x64-v1.8.0.zip) | 解压后运行 GameLibrary.Desktop.exe。 | -| [`GameLibrary-Tools-win-x64-v1.8.0.zip`](https://github.com/sumingwang233/GameLibrary/releases/download/v1.8.0/GameLibrary-Tools-win-x64-v1.8.0.zip) | Host、CLI 和 MCP,供命令行与自动化使用。 | -| [`GameLibrary-v1.8.0-SHA256SUMS.txt`](https://github.com/sumingwang233/GameLibrary/releases/download/v1.8.0/GameLibrary-v1.8.0-SHA256SUMS.txt) | 上面三个下载包的 SHA-256 校验清单。 | +| [`GameLibrary-Setup-v1.8.1.exe`](https://github.com/sumingwang233/GameLibrary/releases/download/v1.8.1/GameLibrary-Setup-v1.8.1.exe) | 推荐。当前用户安装器,可选择安装目录。 | +| [`GameLibrary-Portable-win-x64-v1.8.1.zip`](https://github.com/sumingwang233/GameLibrary/releases/download/v1.8.1/GameLibrary-Portable-win-x64-v1.8.1.zip) | 解压后运行 GameLibrary.Desktop.exe。 | +| [`GameLibrary-Tools-win-x64-v1.8.1.zip`](https://github.com/sumingwang233/GameLibrary/releases/download/v1.8.1/GameLibrary-Tools-win-x64-v1.8.1.zip) | Host、CLI 和 MCP,供命令行与自动化使用。 | +| [`GameLibrary-v1.8.1-SHA256SUMS.txt`](https://github.com/sumingwang233/GameLibrary/releases/download/v1.8.1/GameLibrary-v1.8.1-SHA256SUMS.txt) | 上面三个下载包的 SHA-256 校验清单。 | 程序与安装器未进行 Authenticode 签名,Windows 可能提示未知发布者。请从本仓库下载,并用同版本校验清单核对文件: ```powershell -Get-FileHash .\GameLibrary-Setup-v1.8.0.exe -Algorithm SHA256 +Get-FileHash .\GameLibrary-Setup-v1.8.1.exe -Algorithm SHA256 ``` diff --git a/README.zh-TW.md b/README.zh-TW.md index 4bcc25c..4c607d4 100644 --- a/README.zh-TW.md +++ b/README.zh-TW.md @@ -8,34 +8,34 @@ # GameLibrary -**目前原始碼 v1.8.2**:單 Bridge、清單與封面資源最佳化已通過維護者本機人工驗收,正在整理 Release;自動驗證以本次發布紀錄為準。 +**v1.8.2 預發布**:單 Bridge、清單與封面最佳化已通過本機人工驗收。[發布說明](https://github.com/sumingwang233/GameLibrary/releases/tag/v1.8.2) · [驗證紀錄](docs/releases/v1.8.2-validation.md)。正式版下載維持 v1.8.1。 + -**待驗收預發布 v1.8.1**:修復新遊戲漏掃、磁碟根目錄誤識別、待確認計數及捷徑重複入庫,詳見[發布說明](docs/releases/v1.8.1.md)。下方正式版下載仍為 v1.8.0。 把散落在硬碟裡的遊戲放到同一處。選好資料夾、確認啟動項目,就能從遊戲庫開啟遊戲。 目前正式版 **v1.8.0** 把批次收藏、批次標籤與批次移出做成一次操作,修復後台服務重新啟動後連線失效、輪詢無限重試的問題,並收窄安裝設定的權限範圍;先前的 Godot/MTool、Unity 翻譯與已遊玩遊戲庫維持不變。[發布說明](docs/releases/v1.8.0.md)記錄本次變更與限制。 -**[下載 Windows 安裝版](https://github.com/sumingwang233/GameLibrary/releases/download/v1.8.0/GameLibrary-Setup-v1.8.0.exe)** · [所有版本](https://github.com/sumingwang233/GameLibrary/releases) · [回報問題](https://github.com/sumingwang233/GameLibrary/issues) +**[下載 Windows 安裝版](https://github.com/sumingwang233/GameLibrary/releases/download/v1.8.1/GameLibrary-Setup-v1.8.1.exe)** · [所有版本](https://github.com/sumingwang233/GameLibrary/releases) · [回報問題](https://github.com/sumingwang233/GameLibrary/issues) [下載](#download) · [畫面](#demo) · [開始使用](#start) · [常見問題](#faq) ## 下載 -目前公開正式版為 **v1.8.0**,面向 **Windows 10 / 11 x64**。自動檢查涵蓋建置、測試、型別檢查、格式與封裝,結果與結束碼見[發行記錄](docs/releases/v1.8.0-validation.md);人工驗收由維護者確認。安裝檔未簽章,Windows 可能提示未知發行者。 +目前公開正式版為 **v1.8.1**,面向 **Windows 10 / 11 x64**。建置與驗證的實際結果見[發行紀錄](docs/releases/v1.8.1-validation.md)。安裝檔未簽章,Windows 可能提示未知發行者。 | 檔案 | 用途 | |---|---| -| [`GameLibrary-Setup-v1.8.0.exe`](https://github.com/sumingwang233/GameLibrary/releases/download/v1.8.0/GameLibrary-Setup-v1.8.0.exe) | 建議使用。可選擇安裝位置的目前使用者安裝程式。 | -| [`GameLibrary-Portable-win-x64-v1.8.0.zip`](https://github.com/sumingwang233/GameLibrary/releases/download/v1.8.0/GameLibrary-Portable-win-x64-v1.8.0.zip) | 解壓縮後執行 GameLibrary.Desktop.exe。 | -| [`GameLibrary-Tools-win-x64-v1.8.0.zip`](https://github.com/sumingwang233/GameLibrary/releases/download/v1.8.0/GameLibrary-Tools-win-x64-v1.8.0.zip) | Host、CLI 與 MCP,供命令列與自動化使用。 | -| [`GameLibrary-v1.8.0-SHA256SUMS.txt`](https://github.com/sumingwang233/GameLibrary/releases/download/v1.8.0/GameLibrary-v1.8.0-SHA256SUMS.txt) | 上述三個下載包的 SHA-256 校驗清單。 | +| [`GameLibrary-Setup-v1.8.1.exe`](https://github.com/sumingwang233/GameLibrary/releases/download/v1.8.1/GameLibrary-Setup-v1.8.1.exe) | 建議使用。可選擇安裝位置的目前使用者安裝程式。 | +| [`GameLibrary-Portable-win-x64-v1.8.1.zip`](https://github.com/sumingwang233/GameLibrary/releases/download/v1.8.1/GameLibrary-Portable-win-x64-v1.8.1.zip) | 解壓縮後執行 GameLibrary.Desktop.exe。 | +| [`GameLibrary-Tools-win-x64-v1.8.1.zip`](https://github.com/sumingwang233/GameLibrary/releases/download/v1.8.1/GameLibrary-Tools-win-x64-v1.8.1.zip) | Host、CLI 與 MCP,供命令列與自動化使用。 | +| [`GameLibrary-v1.8.1-SHA256SUMS.txt`](https://github.com/sumingwang233/GameLibrary/releases/download/v1.8.1/GameLibrary-v1.8.1-SHA256SUMS.txt) | 上述三個下載包的 SHA-256 校驗清單。 | 程式與安裝程式尚未進行 Authenticode 簽章,Windows 可能提示未知發行者。請從本儲存庫下載,並比對同版本的校驗清單: ```powershell -Get-FileHash .\GameLibrary-Setup-v1.8.0.exe -Algorithm SHA256 +Get-FileHash .\GameLibrary-Setup-v1.8.1.exe -Algorithm SHA256 ``` diff --git a/docs/releases/v1.8.2-validation.md b/docs/releases/v1.8.2-validation.md new file mode 100644 index 0000000..b41642b --- /dev/null +++ b/docs/releases/v1.8.2-validation.md @@ -0,0 +1,59 @@ +# GameLibrary v1.8.2 构建与验证记录 + +维护者于 2026-10-31 确认本机人工验收通过,并授权合入 main、同步版本和生成 Release;随后明确确认“同时上传 GitHub Release”。完整稳定门禁未齐时按已确认方式预发布,不设 Latest。 + +## 构建来源 + +- 生产二进制源码:`2cecef0ad0cbb23d2517b85a485c6ff4f776b062`,构建入口记录工作区干净。 +- 版本真源与 Tauri/npm/Cargo 产品条目一致,均为 `1.8.2`。 +- 构建完成时间:`2026-10-31T05:55:03.768502+00:00`。 +- 所有编辑、构建、临时库与本地证据仍在重构 worktree;main 原有未提交文件保留。 +- 默认继续使用压缩自包含 sidecar;未启用 NativeAOT,没有数据库迁移。 +- 本次后续改动仅整理说明、图谱及网站稳定版下载元数据;不改变上述桌面二进制的业务源码。 + +本地资产及原始打包报告位于 `artifacts/dist/v1.8.2/`;独立门禁日志位于 `artifacts/release-v1.8.2/evidence/`。打包入口使用 build-only 模式避免重复运行独立检查或启动正式实例,各项验证以独立证据补充,不由编译成功推定测试通过。 + +## 分发资产 + +| 文件 | 字节数 | SHA-256 | +| --- | ---: | --- | +| GameLibrary-Setup-v1.8.2.exe | 67,642,158 | `e0af595b9235f950b225e04d08efc028bd4209cb7f4486f7864becef24d370aa` | +| GameLibrary-Portable-win-x64-v1.8.2.zip | 70,313,455 | `8d601f03463a5de435e5d236b476be5c755b9a65e8e2a4410611a69d85099270` | +| GameLibrary-Tools-win-x64-v1.8.2.zip | 101,355,509 | `c0ec7179a594c74277440cc3da266c70ea24236ac5543ecbfaf3b49abf059ac9` | + +`GameLibrary-v1.8.2-SHA256SUMS.txt` 包含这三个包的哈希。两个 ZIP 均为平面布局,各含三个 EXE 与包内清单;分发完整性门禁已核对外部及包内哈希。程序未签名,安装时可能提示未知发布者。 + +## 自动验证 + +| 项目 | 结果与证据 | +| --- | --- | +| operation 生成、本地化、README/Release 门禁 | passed,本地独立日志 | +| .NET format | passed,本地和 Windows CI | +| 全解决方案 Release build | passed,本地零警告、零错误;Windows CI 亦通过 | +| 前端 | 27 文件、162 项测试通过;typecheck 与生产构建通过 | +| Rust | 7 项 Release 单元测试通过;fmt 及 Windows CI cargo check 通过 | +| .NET 全量测试 | 919 项通过,零失败、零跳过,见下表及 CI 日志 | +| Host/CLI/MCP publish、Bridge/后台 Host sidecar、Tauri Release | passed,本次打包 evidence/check-10.log 至 check-13.log | +| NSIS 编译 | passed,使用 /WX,evidence/check-15.log | +| ZIP、外部清单、包内清单 | passed,独立 final-asset-integrity.log | + +完整 Windows CI 证据:[运行 41173783985](https://github.com/sumingwang233/GameLibrary/actions/runs/41173783985),对应 `dd13b8d1045355a2adcaadff635527d998dc85e7`。该提交到生产源码提交 `2cecef0` 之间只修改网站检查脚本,`src/` 与 `tests/` 内容一致。合并前的最终检查另由 [PR #2](https://github.com/sumingwang233/GameLibrary/pull/2) 保存;不把进行中或失败的检查记为通过。 + +| 测试程序集 | passed | failed | skipped | +| --- | ---: | ---: | ---: | +| ArchitectureTests | 11 | 0 | 0 | +| ContractTests | 59 | 0 | 0 | +| UnitTests | 187 | 0 | 0 | +| HeadlessE2ETests | 21 | 0 | 0 | +| IntegrationTests | 641 | 0 | 0 | +| 合计 | 919 | 0 | 0 | + +最初网站检查仍要求页面存在一个已移除的预发布链接。修正为当前正式版的三包、清单和说明共五个链接,保留四语言一致性检查,并补上缺失链接和版本不一致的负例。相关独立自检通过;完整网站构建由 PR 的 Website 工作流验证。网站工作流未获部署授权,不触发 Pages 发布。 + +## 人工确认与保留项 + +[维护者本机人工验收记录](v1.8.2-manual-acceptance.md)为 passed,对应此前的 v1.8.2 安装验收构建。最终产物因源码提交元数据和格式整理而重新编译,未声称维护者再次安装了这些最终字节。 + +最终资产的自动 WebView/CDP 烟测仍为 not-run;Windows 10/11 干净环境、安装/升级/卸载和全部语言/DPI 矩阵未逐项确认。整棵桌面进程树的量化收益未测,不承诺百分比。`stableReady=false`;这些限制保留在预发布说明和报告中。 + +本地 worktree 及其 EXE 具有 Low 完整性标签,直接运行安装器会受到普通临时目录写入限制。GitHub 下载及 ZIP 正常解压到普通目录的交付方式避免传播该文件标签;不通过修改系统权限解决此问题。原始诊断见[本地交付记录](../development/2026-10-31-v1.8.2-acceptance-build.md)。 diff --git a/docs/releases/v1.8.2.md b/docs/releases/v1.8.2.md index 5d9d65f..3d48f7c 100644 --- a/docs/releases/v1.8.2.md +++ b/docs/releases/v1.8.2.md @@ -1,8 +1,8 @@ -# GameLibrary v1.8.2 · 桌面资源占用优化 +# GameLibrary v1.8.2 · 桌面资源占用优化(预发布) ## 简体中文 -减少桌面后台进程和大库界面的资源保留,继续使用现有游戏库数据格式。维护者本机人工验收已通过;自动验证和最终发布状态另见本次构建记录。 +减少桌面后台进程和大库界面的资源保留,继续使用现有游戏库数据格式。维护者本机人工验收已通过;本次作为预发布,不替换 v1.8.1 的 Latest。 ### 主要变化 @@ -33,13 +33,13 @@ ### 验证与限制 -[维护者本机人工验收](v1.8.2-manual-acceptance.md)通过,无可见 bug。自动门禁按本次实际结果分别登记,未执行不计通过。整棵桌面进程树的内存收益及完整 Windows/DPI 验收矩阵未量化确认。程序未签名,Windows 可能提示未知发布者。 +[维护者本机人工验收](https://github.com/sumingwang233/GameLibrary/blob/v1.8.2/docs/releases/v1.8.2-manual-acceptance.md)通过,无可见 bug。919 项 .NET、162 项前端及 7 项 Rust 测试通过,构建、格式、类型及分发完整性检查见[验证记录](https://github.com/sumingwang233/GameLibrary/blob/v1.8.2/docs/releases/v1.8.2-validation.md)。最终产物的自动 WebView/CDP 烟测尚未执行,完整 Windows/DPI 矩阵与整桌面量化收益仍待确认。程序未签名,Windows 可能提示未知发布者。 --- ## English -Reduces desktop background processes and retained library UI resources while preserving existing library data formats. The maintainer's local manual acceptance passed; automated checks are recorded separately. +Reduces desktop background processes and retained library UI resources while preserving existing library data formats. The maintainer's local manual acceptance passed. This is a pre-release and does not replace v1.8.1 as Latest. ### Highlights @@ -65,4 +65,4 @@ The four assets listed above provide the installer, portable desktop, advanced t ### Validation and limitations -The maintainer reported local manual acceptance passed with no visible bugs. Automated gates retain their actual status. Full Windows/DPI matrices and whole-desktop memory gains remain unverified. Executables are unsigned and may trigger an unknown-publisher warning. +The maintainer reported local manual acceptance passed with no visible bugs. Tests passed: 919 .NET, 162 frontend and seven Rust cases. See the linked validation record for build, formatting, type and package-integrity results. Automatic WebView/CDP smoke on the final artifacts was not run; full Windows/DPI matrices and whole-desktop memory gains remain unverified. Executables are unsigned and may trigger an unknown-publisher warning. diff --git a/website/lib/site.ts b/website/lib/site.ts index 9342f90..d845449 100644 --- a/website/lib/site.ts +++ b/website/lib/site.ts @@ -4,7 +4,7 @@ export const languages = ["zh-CN", "zh-TW", "en", "ja"] as const; export type Language = typeof languages[number]; export const languageNames: Record = { "zh-CN": "简体中文", "zh-TW": "繁體中文", en: "English", ja: "日本語" }; export const translate = (language: Language) => (zh: string, tw: string, en: string, ja: string) => [zh, tw, en, ja][languages.indexOf(language)]; -export const stableVersion = "1.8.0"; +export const stableVersion = "1.8.1"; export const prefix = process.env.NODE_ENV === "production" ? "/GameLibrary" : ""; export const repository = "https://github.com/sumingwang233/GameLibrary"; export const release = `${repository}/releases/download/v${stableVersion}/`; From 1cbc515b4a42122c6950d8d712aa0a99c32fdc09 Mon Sep 17 00:00:00 2001 From: AaronSu Date: Sat, 31 Oct 2026 14:07:49 +0800 Subject: [PATCH 29/29] docs(graph): snapshot v1.8.2 release source and validation boundaries --- docs/code-review-graph/README.md | 2 ++ docs/code-review-graph/architecture.md | 4 ++++ docs/code-review-graph/rg05-release.json | 14 ++++++++++++++ 3 files changed, 20 insertions(+) create mode 100644 docs/code-review-graph/rg05-release.json diff --git a/docs/code-review-graph/README.md b/docs/code-review-graph/README.md index 38be736..48a6a94 100644 --- a/docs/code-review-graph/README.md +++ b/docs/code-review-graph/README.md @@ -1,5 +1,7 @@ # GameLibrary 代码预览框架 +2026-10-31 v1.8.2 发布整理:维护者本机人工验收通过;919 项 .NET、162 项前端和 7 项 Rust 测试通过。图谱已按本 worktree 同步为 441 文件、4,321 节点、43,381 关系,无解析错误。最终自动 WebView 烟测、完整 Windows/DPI 矩阵及整桌面收益保留未验证状态,预发布不设 Latest。见[发布记录](../releases/v1.8.2-validation.md)及[结构快照](rg05-release.json)。 + 2026-10-30 v1.8.1 待验收打包:按用户选择合入已提交的 sidecar 打包修复,同步产品版本字段为 1.8.1;未纳入其他工作区未提交的 Bridge/退出优化。修改前查询影响上下文,修改后增量解析 2 个文件,解析错误 0,图谱基线为二进制源码 `aad3781`。生产发布、Tauri 与 NSIS 编译完成;本次全量门禁和人工验收未运行。四语言 README 标为待验收预发布,稳定下载保持 v1.8.0。见[构建记录](../releases/v1.8.1-validation.md)。 2026-10-30 v1.8.1 扫描补丁:盘根独立文件、ExactPath 后代遍历、LNK 去重及待确认计数。修改前查询共享扫描路径的影响上下文;在最终源码 `687bb4d` 上以 minimal 模式重建,433 文件、4,343 节点、42,636 边,解析错误 0。分轮去重 135 项 .NET、3 项 Sidebar 及前端 typecheck 通过。按用户后续要求由 Codex 完成复核;真实库一致性备份后仅移出 1 张已证实的重复快捷方式卡,文件与元数据保留。见[本轮结构记录](scan-boundaries-v1.8.1.md)、[验证记录](../development/v1.8.1-scan-boundaries-validation.md)及[已批准计划](../development/v1.8.1-scan-boundaries-plan.md)。未打包、推送或发布。 diff --git a/docs/code-review-graph/architecture.md b/docs/code-review-graph/architecture.md index 64bbe49..7c5f13c 100644 --- a/docs/code-review-graph/architecture.md +++ b/docs/code-review-graph/architecture.md @@ -1,5 +1,9 @@ # GameLibrary 当前代码架构 +## v1.8.2 发布整理(2026-10-31) + +维护者本机人工验收通过,919 项 .NET、162 项前端和 7 项 Rust 测试通过;最终自动 WebView 烟测及完整 Windows/DPI 矩阵保留未验证状态,按授权准备预发布、不设 Latest。当前图谱为 441 文件、4,321 节点、43,381 关系,CALLS 直接解析 9,494 条、未解析 24,669 条。见 [发布快照](rg05-release.json)与[构建验证记录](../releases/v1.8.2-validation.md)。结构索引不能代替运行验收。 + ## RG-04 / v1.8.2 草稿(2026-10-31) JobManager 正常情况下只保留最近 128 个可淘汰终态对象,其余结果暂存到独占、关闭即删除的会话文件,按轻量索引回读;转存失败或终态记录待重试时保留对象。不是跨重启历史库,也没有增加 SQLite schema。封面缓存增加两个并发名额和按消费者取消的队列。已知小批游戏变更在成员、排序、库身份及纪元均安全时局部更新,其余完整重查。 diff --git a/docs/code-review-graph/rg05-release.json b/docs/code-review-graph/rg05-release.json new file mode 100644 index 0000000..94bf714 --- /dev/null +++ b/docs/code-review-graph/rg05-release.json @@ -0,0 +1,14 @@ +{ + "snapshotAt": "2026-10-31T14:06:47", + "branch": "codex/optimize-footprint-v1.8.1", + "sourceHeadBeforeGraphDocumentationCommit": "c21ba153224c33aed0b8758606f59e5f27d9b62a", + "binarySourceCommit": "2cecef0ad0cbb23d2517b85a485c6ff4f776b062", + "version": "1.8.2", + "postprocess": "minimal", + "files": 441, + "nodes": 4321, + "edges": 43381, + "calls": { "direct": 9494, "unresolved": 24669 }, + "embeddings": 0, + "note": "Release source index. Maintainer local manual acceptance passed. 919 .NET, 162 frontend and 7 Rust tests passed; final automatic WebView smoke and full Windows/DPI matrix remain unverified. Prerelease, not Latest." +}

    V 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 z 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�lw3rCGwu;hK7trJLb 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 literal 225746 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