Files
Shuery 3f11426964 feat: TS 构建管线、Spine 抓取器与 wallpapers/ 唯一真相来源
把项目从「手写 dist/」改成「wallpapers/ 是唯一真相来源,dist/ 由 pnpm build 生成」,
并补上配套的类型、门禁与抓取器。一次提交落地整条管线,因为拆开会留下不能构建的中间态。

- src/:运行时与模拟器源码(TS,strict),编译到 build/ 再拷进各分发
- tools/:build / dev / check-{syntax,paths,dist},以及抓取器与回归门禁 tools/checks/
  (.scratch/ 下那批一次性脚本移入 tools/checks/ 并入库为长期门禁)
- wallpapers/:七档壁纸的源数据 + README.md(id/音频/预设的完整规范)
- docs/adr/0005-0008:构建管线与分发拓扑、模拟器契约、自包含 sim、每骨架资源布局
- .gitignore:排除 .scratch/ 的参考资料副本(上游 spine 整仓克隆 ~1.2 GB、
  抓取侦查数据 ~680 MB)与调试转储;这些是本地调查材料,补偿会让仓库无法克隆
- 归一化 .gitignore/CONTEXT.md 行尾(工作区 CRLF、索引 LF 造成的整文件假 diff)

同时修掉三档卡住构建的未完工壁纸:
- kv45 的 meta.json 里 id 还是抓取期场景名 scene_main,经 downloader promote 正名为 kv45
- shajin / zhigengniao_juheye 的 meta.json 误用了骨架描述文件(name/spine/animations/pages)、
  且都缺 preset.template.json;现按规范重建:骨架沉到 spines/<名>/(spine-ts 按 atlas 所在
  目录解析贴图页)、补上元数据与单骨架预设,并清掉 zhigengniao 骨架里指向作者机的绝对路径
- 顺带 promote 已在 sources.yml 里的 kv46(月升之前,与兽共舞)

pnpm check 五道门全绿:10 个分发 / 7 档壁纸 / 141 处引用自包含。
2026-10-02 01:27:02 +08:00

66 lines
3.1 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 20 — 游戏合集的文案取了全局 meta(collection-ys 顶着星穹铁道的标题)
Status: resolved
Type: bug
## 现象
`dist/releases/collection-ys/project.json` 的 `title` 是「【崩坏:星穹铁道】昔涟」,
而这一档收的是原神的《魔女尼可的茶会》。同批还发现 `collection-hsr` 也在用全局标题
(只是它恰好含「崩坏:星穹铁道」,所以肉眼看不出来)。
## 根因
`tools/build.ts` 的 `addGame()`:
```ts
meta: { title: vault.global.title, ... }
```
全局 `wallpapers/meta.json` 那层是给「**全部**合集」(`collection-all`)写的,
而 `wallpapers/README.md` 的三层分工写的是「**游戏**给「该游戏合集」写文案」——
**代码与规范不一致**,规范是对的。
顺带记一条同批发现、但本次没动的:`ys` 目前只有 1 档壁纸,`generateProjectJson`
按 `wallpapers.length > 1` 决定要不要 `preset`,所以 `collection-ys` 是一个**没有预设下拉的合集**,
产物行为与 `single-ys-nico-tea` 相同。
## 改动
| 文件 | 改动 |
| --- | --- |
| `tools/lib/types.ts` | `GameMeta` 增加**必填** `title` 与可选 `description` |
| `tools/lib/vault.ts` | 校验 `title` 非空;`description` 要么不写、要么非空 |
| `tools/build.ts` | `addGame()` 的文案取自**游戏级** meta,不回落全局;`description` 缺省仍按「共 N 档」生成 |
| `tools/build.ts` | 新增警告:`scope: "game"` 且 <2 档的合集("合集"名不副实) |
| `wallpapers/hsr/meta.json`、`wallpapers/ys/meta.json` | 补 `title` |
| `wallpapers/README.md` | 游戏 meta 字段表补 `title`(必填)/ `description` |
| `tools/checks/check-collection-copy.mts` | 新门禁:游戏合集的标题必须是"它自己那个游戏"的 |
## 没做(留给发布决策)
**一档的合集发不发。** `collection-ys` 现在会打警告但仍会产出。要不要在构建里跳过它
(或要求游戏 ≥2 档才生成合集),是发布范围的决定,没有替用户定;`--strict` 下这条警告会
让构建失败,需要时用它兜住。
## 验证
**先证明两条新门禁都会红。**
① 产物门禁(改动前的产物):
node tools/checks/check-collection-copy.mts
✓ collection-all 的 title 来自全局 meta → 【崩坏:星穹铁道】昔涟
✗ collection-hsr 的 title 逐字等于它自己游戏的 title → 产物 【崩坏:星穹铁道】昔涟 / 源 (未声明)
✗ collection-ys 的 title 提到了本游戏「原神」 → 【崩坏:星穹铁道】昔涟
游戏合集文案归属:失败 3 处
② 源数据门禁(临时摘掉 `wallpapers/ys/meta.json` 的 `title`,已按原字节还原):
node tools/build.ts --dry-run
构建失败:wallpapers/ys: 缺少 title(游戏合集的创意工坊标题)
**改完之后**:门禁 `通过`;`pnpm check` 全绿(typecheck / build / syntax / paths / dist 自包含);
`diff-project` 仍是那 15 处工作区演进差异,**没有一处与 title/description 有关**——
`collection-all` 的已发布文案逐字段未动。