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

3.1 KiB
Raw Permalink Blame History

21 — 资源布局迁移(ADR 0008)的漏网之鱼

Status: resolved Type: bug

现象

ADR 0008 把 wallpapers/ 的资源从按类型分(effects/ + images/)改成按骨架分 (spines/<骨架名>/ + scene/)。迁移完成后,四处没跟上:

  • wallpapers/hsr/kv37/spines/kv37/kv37.json 与 wallpapers/hsr/xilian/spines/xilian/xilian.json 里作者的目录字段还指着旧布局: "images": "../images/"(kv37 另有一处 "audio": "../audios")。 ys 的 16 具骨架(下载器 promote.py 产出)已经是空串 / 没有该键——只有 hsr 这两具手改过的存量。
  • wallpapers/README.md 的目录树(第 17-34 行)与第六节是新布局,但第五节的 preset 示例 (单骨架与场景各一处)和第七节「加一档新壁纸」第 4 步还写着 ./images/、./effects/。 另外「加一个新游戏」还漏了上一轮才变成必填的 title。
  • 代码注释里的旧目录举例:tools/lib/bundle.ts(4 处)、tools/lib/generate.ts 的 assetRelIn 注释、src/runtime/index.ts 的基准说明。
  • ADR 0001 第 7 行与 ADR 0005 第 43 行仍断言"三层同名目录不变"——被 ADR 0008 取代后, 没有任何地方声明这次取代。

影响

images / audio 这两个字段今天的运行时并不读:播放器调的是 loadTextureAtlas(config.atlasUrl), 单参 ⇒ pathPrefix 为空,贴图页按 atlas 所在目录解析;skeleton.images 只进 skeletonData.imagesPath。 所以这不是渲染故障,而是数据与规范不一致;真正的危险是以后有人用上共享贴图或事件音, 它会静默指向一个不存在的路径。文档与注释那两半则是纯粹的误导。

改动

文件 改动
wallpapers/hsr/{kv37,xilian}/spines/*/*.json images / audio 归一化成空串
wallpapers/README.md 第五、七节示例改新布局;第六节补"骨架 json 作者目录字段留空串"规则;「加新游戏」补 title
tools/lib/bundle.ts、tools/lib/generate.ts、src/runtime/index.ts 注释里的旧目录举例更新
docs/adr/0001、docs/adr/0005 就地标注"已被 ADR 0008 取代"(沿用 ADR 0002 的删除线惯例)
docs/adr/0008 顶部补"取代 ADR 0001 第 7 行 / ADR 0005 第 43 行"

验证

pnpm build 六个分发全过;pnpm check 全绿(含 check-collection-copy); dist/releases 里 ../images/ 零命中——旧前缀没有跟着产物上传 (../audios/、../../audios/ 在合集里命中是设计如此:合集 preset.js 在下一层,音频在分发根,见 ADR 0005)。

顺带发现(本次没动)

wallpapers/ys/nico-tea/spines/<骨架名>/meta.json 是下载器写的逐骨架来源记录 (spine 版本 / 动画 / 皮肤 / 贴图页 / 来源 URL,见 tools/downloader/README.md)。 copyWallpaperAssets 按目录整体搬 spines/,所以这些记录会跟着分发一起上传(hsr 的骨架没有)。 来源 URL 留在发布物里是否合适,是产品决定;要清掉就得让搬移跳过 spines/**/meta.json。