# 15 — single 分发目录名改成 `single-<游戏id>-<壁纸id>` Status: resolved Type: task ## 需求 > single 的发布目录结构调整:single-game-name ## 改动 | | 旧 | 新 | | --- | --- | --- | | 单档 | `wallpaper-<壁纸id>` | `single-<游戏id>-<壁纸id>` | | 游戏合集 | `collection-<游戏id>` | 不变 | | 全部合集 | `collection-all` | 不变 | 实际产物: ``` dist/releases/single-hsr-kv37 dist/releases/single-hsr-xilian dist/releases/collection-hsr dist/releases/collection-all ``` 一处代码改动(`tools/build.ts`): ```ts dir: `single-${wallpaper.gameId}-${wallpaper.id}`, ``` **为什么用 id 而不是 `meta.name`**:`kv37` 的 `meta.name` 是 `「成为昨天的明天」`。 目录名带中文与 `「」` 与项目既有约定("目录名与选择键一律用 id,不用显示名,避免中文路径")冲突, 而 `wallpapers/<游戏>/<壁纸>` 这两级目录本来就是 id。所以 `game` = `gameId`、`name` = 壁纸 id。 ## 改名本身是小事,暴露出的东西是大事 改完重建,`pnpm check` 全绿,但 `smoke-dev` 报了 12 处失败、`smoke-sim` 直接抛异常。 **根因:调试服在启动时把 `dist-map.json` 读进内存,之后一直用那一份。** 磁盘上已经是 `single-hsr-kv37`,服务端还按 `wallpaper-kv37` 校验 → 整档 404。 这不是改名带来的新问题,是**一直存在**的:加一档新壁纸、加一个游戏、甚至改个分发目录名, 都必须重启调试服才认。索引页(`indexPage()`)本来就是每次重读,只有 `handle()` 用了启动时那份—— 两处不一致才是真正的问题。 现在 `handle()` 每次请求重读 `dist-map.json`。这个文件很小,调试服也不在乎这点开销。 ## 顺带 `.scratch/` 里 11 个脚本硬编码了旧目录名,全部更新;`CONTEXT.md` 与 ADR 0005 / 0007 同步。 确认过**没有任何代码按目录名前缀反推类型**(那样改名会静默失效),类型一律走 `dist-map.json` 的 `type` 字段。 ## 验证 - `pnpm check`:4 个分发全部按新名构建,`check:dist` 通过 - 调试服:冒烟、浏览器冒烟、面板还原度、热更新全过(重启后) - 四档自包含包 `file://` 全过(新目录名) - 静态托管预览全过 - `test-sim-gate` / `test-inline-guard` / `test-transform-module` 全过 - 发布产物差异仍**只**来自 `use_custom_audio`;6 组渲染与重构前逐像素相同 - `single-hsr-kv37` 的目录结构确认:`index.html` / `project.json` / `preset.js` / `scripts/` / `styles/` / `images/` / `effects/` / `audios/`