# T-WIN-012 「关于」清单展示当前版本号 - **状态**: done - **依赖**: T-WIN-010 - **文档**: v1.6 §11(版本号展示) ## 目标 Windows 客户端在**「关于」清单**中展示当前运行版本号,且版本号只有一处权威定义。 ## 方案 | 项 | 做法 | |--|--| | 唯一来源 | `project.godot` 的 `application/config/version`(运行期用 `ProjectSettings.get_setting` 读取) | | 界面位置 | 关于页面新增「清单」区块,逐行「标签:值」 | | 禁止重复 | 界面代码中**不出现版本号字面量**;由 `test_about.gd` 反例防护 | `src/ui/about_screen.gd` 新增两个可直接单测的纯函数: - `app_version()` —— 返回 `vX.Y.Z` 的来源值(唯一来源); - `about_manifest()` —— 返回清单各行(版本 / 引擎 / 契约版本 / 接收协议 / 接收地址 / 服务端地址 / 隐私说明)。 `about_manifest()` 读取 `AppConfig` 时走 `get_node_or_null("AppConfig")`, 因为无头测试以 `--script` 运行**没有 autoload**,直接引用会在解析期报错。 ## 顺带修正:契约版本不能再用单个常量 `Credits.CONTRACT_VERSION` 原为单个常量 `0.1.0`,但六项契约现在各自独立递增 (`rest-api 0.5.0` / `data-models 0.7.0` / `skeleton-topology 0.2.0` …)。 改为 `Credits.CONTRACT_VERSIONS` 字典 + `version_of()` / `summary()`, 并让 `test_credits.gd` 逐项与 `contracts/VERSION` 双向核对 (新增契约若忘记同步展示,测试直接失败)。 ## 验收(文档 §11.3) | 验收项 | 结果 | |--|--| | 关于清单可见 `vX.Y.Z` | ✅ 清单首行「客户端版本:v0.2.0」 | | 与导出产物文件名一致 | ✅ `opendance-windows-v0.2.0.zip` | | 与 `project.yaml` / `project.godot` 一致 | ✅ 测试 `test_version_is_semver_and_matches_project_yaml` 核对 | | 界面代码无版本号字面量 | ✅ 测试 `test_version_not_hardcoded_in_ui_sources` 核对 |