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 处引用自包含。
This commit is contained in:
Shuery committed 2026-10-02 01:27:02 +08:00
1 parent b8eee05d78
commit 3f11426964
297 files changed
+216627 -1926

No files matched your search

@@ -0,0 +1,71 @@
main_xinlin.png
size:774,920
filter:Linear,Linear
9老师_1
bounds:468,833,76,87
offsets:9,9,93,104
9老师_10
bounds:512,26,212,115
offsets:7,7,226,127
rotate:180
9老师_11
bounds:0,304,193,211
offsets:6,7,205,225
rotate:270
9老师_18
bounds:340,804,126,116
offsets:7,6,136,129
9老师_19
bounds:381,358,310,196
offsets:0,0,317,196
rotate:180
9老师_2
bounds:133,0,329,149
offsets:6,8,341,164
rotate:180
9老师_20
bounds:210,72,264,124
offsets:4,5,270,136
rotate:180
9老师_21
bounds:472,228,267,135
offsets:6,7,280,149
9老师_22
bounds:215,242,255,140
offsets:8,6,272,153
9老师_23
bounds:485,545,365,232
offsets:4,8,375,247
rotate:90
9老师_24
bounds:58,888,16,15
offsets:10,10,36,35
9老师_25
bounds:680,316,302,94
offsets:7,4,318,106
rotate:270
9老师_3
bounds:293,384,64,64
offsets:10,10,84,84
9老师_4
bounds:0,30,127,127
offsets:10,10,147,147
9老师_5
bounds:422,129,256,144
offsets:7,7,270,156
9老师_6
bounds:0,827,72,93
offsets:7,7,84,107
9老师_7
bounds:0,190,74,69
offsets:7,7,88,82
9老师_8
bounds:0,263,70,78
offsets:7,6,83,91
9老师_9
bounds:76,158,180,145
offsets:5,7,190,159
rotate:180
9老师身后光
bounds:0,448,507,472
offsets:13,13,538,504
@@ -0,0 +1 @@
{"skeleton":{"hash":"LZhrYmWpLGY","spine":"4.2.43","x":-249.94,"y":-232.53,"width":499,"height":461.97,"images":""},"bones":[{"name":"root"},{"name":"bone","parent":"root","x":-33.68,"y":-225.9},{"name":"身体","parent":"bone","x":-54.51,"y":114.84},{"name":"身体4","parent":"身体","length":48.97,"rotation":-46.02,"x":8.6,"y":-7.79},{"name":"身体5","parent":"身体4","length":47.65,"rotation":18.35,"x":48.97},{"name":"身体6","parent":"身体5","length":36.98,"rotation":18.1,"x":47.65},{"name":"身体2","parent":"身体","length":56.76,"rotation":107.65,"x":0.82,"y":0.82},{"name":"身体3","parent":"身体2","length":59.53,"rotation":-14.1,"x":55.98,"y":0.25},{"name":"头","parent":"身体3","length":82.36,"rotation":-2.98,"x":59.53},{"name":"耳朵","parent":"头","length":27.66,"rotation":-33.08,"x":127.02,"y":-49.47},{"name":"耳朵2","parent":"耳朵","length":25.57,"rotation":-29.38,"x":27.66},{"name":"耳朵3","parent":"耳朵2","length":19.03,"rotation":16.35,"x":25.8,"y":-0.12},{"name":"耳朵4","parent":"头","length":28.46,"rotation":-2.12,"x":131.26,"y":16.11},{"name":"耳朵5","parent":"耳朵4","length":23.2,"rotation":-43.45,"x":29.78,"y":-1.5},{"name":"耳朵6","parent":"耳朵5","length":21.38,"rotation":7.31,"x":23.02,"y":-0.18},{"name":"飘带19","parent":"身体3","length":49.06,"rotation":60.42,"x":47.67,"y":33.7},{"name":"飘带18","parent":"飘带19","length":41.27,"rotation":-41.71,"x":49.18,"y":-0.23},{"name":"飘带17","parent":"飘带18","length":23.29,"rotation":-46.29,"x":41.27},{"name":"飘带9","parent":"身体3","length":57.88,"rotation":-51.24,"x":52.3,"y":-22.86},{"name":"飘带8","parent":"飘带9","length":45.6,"rotation":-19.49,"x":57.88},{"name":"飘带7","parent":"飘带8","length":47.44,"rotation":-21.27,"x":45.6},{"name":"飘带6","parent":"飘带7","length":58.93,"rotation":-22.98,"x":47.44},{"name":"飘带5","parent":"飘带6","length":46.55,"rotation":10,"x":58.93},{"name":"飘带4","parent":"飘带5","length":46.53,"rotation":29.07,"x":46.55},{"name":"飘带3","parent":"飘带4","length":46.51,"rotation":31.39,"x":47.51,"y":-0.31},{"name":"飘带2","parent":"飘带3","length":30.72,"rotation":28.45,"x":46.51},{"name":"飘带","parent":"飘带2","length":31.48,"rotation":19.07,"x":30.72},{"name":"胸毛","parent":"身体3","length":42.34,"rotation":152.52,"x":77.27,"y":8.21},{"name":"胸毛2","parent":"胸毛","length":43.91,"rotation":33.33,"x":42.34},{"name":"胸毛3","parent":"胸毛2","length":25.83,"rotation":30.76,"x":43.91},{"name":"胸毛4","parent":"胸毛3","length":18.57,"rotation":23.62,"x":25.83},{"name":"胸毛5","parent":"身体3","length":45.6,"rotation":-99.36,"x":69.93,"y":-6.35},{"name":"胸毛7","parent":"胸毛5","length":51.52,"rotation":11.52,"x":45.6},{"name":"胸毛6","parent":"胸毛7","length":35.83,"rotation":12.21,"x":51.52},{"name":"胸毛8","parent":"胸毛6","length":30.6,"rotation":-9.24,"x":35.83},{"name":"翅膀","parent":"身体3","length":65.91,"rotation":-95.56,"x":57.33,"y":-2.48},{"name":"翅膀5","parent":"翅膀","length":48,"rotation":5.07,"x":64.64,"y":-0.3},{"name":"翅膀4","parent":"翅膀5","length":66.07,"rotation":-31.81,"x":48},{"name":"翅膀3","parent":"翅膀4","length":51.13,"rotation":-1.67,"x":66.07},{"name":"翅膀2","parent":"翅膀3","length":37.61,"rotation":11.74,"x":51.13},{"name":"翅膀6","parent":"翅膀5","length":38.99,"rotation":-64.81,"x":46.09,"y":-16.58},{"name":"翅膀7","parent":"翅膀6","length":28.85,"rotation":14.23,"x":38.99},{"name":"翅膀8","parent":"翅膀7","length":30.68,"rotation":16.89,"x":30.07,"y":0.96},{"name":"翅膀9","parent":"翅膀5","length":30.72,"rotation":-67.35,"x":25.75,"y":-36.8},{"name":"翅膀10","parent":"翅膀9","length":25.38,"rotation":12.32,"x":30.72},{"name":"翅膀15","parent":"身体3","length":35.64,"rotation":79.43,"x":58.28,"y":6.41},{"name":"翅膀11","parent":"翅膀15","length":47.5,"rotation":53.33,"x":30.08,"y":1.12},{"name":"翅膀12","parent":"翅膀11","length":42.79,"rotation":-24.51,"x":47.5},{"name":"翅膀13","parent":"翅膀15","length":34.62,"rotation":79.8,"x":38.47,"y":37.8},{"name":"翅膀14","parent":"翅膀13","length":23.82,"rotation":-38.74,"x":34.62},{"name":"头2","parent":"头","x":85.02,"y":5.22},{"name":"飘带后","parent":"身体3","length":72.32,"rotation":-48.12,"x":64.3,"y":-8.27},{"name":"飘带后7","parent":"飘带后","length":63.84,"rotation":-12.06,"x":72.32},{"name":"飘带后6","parent":"飘带后7","length":69.82,"rotation":-24.29,"x":63.84},{"name":"飘带后5","parent":"飘带后6","length":58.97,"rotation":-21.12,"x":69.82},{"name":"飘带后4","parent":"飘带后5","length":56.86,"rotation":-29.12,"x":58.97},{"name":"飘带后3","parent":"飘带后4","length":46.7,"rotation":-19.6,"x":58.5,"y":0.07},{"name":"飘带后2","parent":"飘带后3","length":38.67,"rotation":-23.15,"x":46.93,"y":-0.13},{"name":"bone59","parent":"飘带后","x":111.56,"y":-159.23},{"name":"飘带后8","parent":"飘带后","leLine truncated
Binary file not shown.

After

Width:  |  Height:  |  Size: 551 KiB

@@ -0,0 +1,16 @@
{
"name": "main_xinlin",
"spine": "4.2.43",
"animations": [
"animation"
],
"skins": [
"default"
],
"pages": [
"main_xinlin.png"
],
"source": "https://act.mihoyo.com/ys/event/e20260520invite-19ccy4/index.html?game_biz=hk4e_cn&mhy_presentation_style=fullscreen&mhy_auth_required=true&mhy_landscape=true&mhy_hide_status_bar=true",
"originalImages": null,
"fetchedAt": "2026-09-21T11:49:29+00:00"
}