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,261 @@
jh03_46kv_boss.png
size:2036,2007
filter:Linear,Linear
scale:0.44
boss_上半身
bounds:1264,1218,411,396
boss_发梢1
bounds:628,888,44,123
offsets:4,4,51,130
boss_发梢10
bounds:355,1283,123,211
offsets:2,1,129,216
rotate:90
boss_发梢11
bounds:1867,1118,96,279
offsets:3,3,101,285
boss_发梢112
bounds:1829,1800,197,207
offsets:2,3,202,212
boss_发梢12
bounds:0,491,67,158
offsets:4,4,74,165
boss_发梢13
bounds:791,1931,47,67
offsets:4,4,55,75
boss_发梢14
bounds:0,1853,13,25
offsets:4,4,20,33
boss_发梢15
bounds:217,656,67,127
offsets:4,3,75,133
boss_发梢2
bounds:900,669,62,104
offsets:3,4,68,112
boss_发梢22
bounds:676,0,244,230
offsets:2,2,249,235
boss_发梢33
bounds:1184,1187,339,167
offsets:3,6,343,176
boss_发梢4
bounds:542,1089,102,63
offsets:4,3,110,70
boss_发梢44
bounds:209,7,331,121
offsets:2,2,336,126
boss_发梢5
bounds:68,1924,46,20
offsets:3,4,51,27
boss_发梢55
bounds:565,103,254,287
offsets:0,2,255,290
boss_发梢6
bounds:0,1153,55,109
offsets:4,4,62,117
boss_发梢66
bounds:1305,1915,162,52
offsets:4,4,170,59
boss_发梢7
bounds:642,1568,76,79
offsets:3,4,82,86
boss_发梢77
bounds:811,1292,185,107
offsets:4,4,192,115
boss_发梢8
bounds:1080,1756,77,70
offsets:4,3,84,77
boss_发梢88
bounds:1297,899,117,182
offsets:4,3,123,188
boss_发梢9
bounds:491,217,73,137
offsets:4,3,81,143
boss_右手
bounds:193,1208,304,307
boss_大嘴
bounds:154,55,411,323
offsets:4,2,417,327
boss_头发222
bounds:740,1343,520,522
boss_底发
bounds:1621,1227,585,298
offsets:2,1,589,299
rotate:90
boss_脸
bounds:0,1088,175,95
offsets:3,4,181,103
boss_袖子1
bounds:1594,764,442,496
offsets:0,2,442,498
rotate:180
boss_袖子2
bounds:1337,21,363,286
offsets:3,2,369,290
rotate:270
boss_袖子201
bounds:1549,1816,299,191
offsets:2,3,304,197
boss_袖子3
bounds:0,142,158,191
offsets:3,3,164,197
boss_角
bounds:679,810,364,446
offsets:0,0,364,710
rotate:270
boss_饰品1
bounds:295,1182,395,183
offsets:1,2,397,186
hua_10
bounds:498,1329,37,29
hua_11
bounds:629,1976,36,31
hua_12
bounds:0,1920,64,87
hua_13
bounds:572,1978,53,29
hua_14
bounds:693,1952,31,55
hua_2
bounds:1122,496,678,429
offsets:0,55,678,484
rotate:180
hua_5
bounds:68,1948,63,59
hua_6
bounds:255,1521,37,32
hua_7
bounds:394,1511,31,26
hua_8
bounds:195,1985,50,22
hua_9
bounds:170,1372,35,56
offsets:0,0,35,111
人泛光8
bounds:1074,1264,92,64
offsets:2,1,106,68
卷轴上
bounds:22,296,1139,330
offsets:0,0,1139,470
卷轴下
bounds:663,199,996,382
卷轴中
bounds:0,868,1760,799
offsets:29,0,1789,799
rotate:180
朽叶_上半身
bounds:378,435,370,477
offsets:0,60,370,537
rotate:90
朽叶_下睫毛
bounds:28,1608,29,37
offsets:1,3,33,41
朽叶_中指
bounds:737,1878,66,129
朽叶_发梢1
bounds:655,1232,161,132
offsets:3,4,167,136
朽叶_发梢10
bounds:1679,1243,73,171
offsets:3,4,80,178
朽叶_发梢11
bounds:245,1553,73,105
offsets:3,4,80,113
朽叶_发梢1a
bounds:1886,1479,98,236
offsets:4,3,104,242
朽叶_发梢2
bounds:1220,309,184,192
offsets:4,3,192,198
朽叶_发梢2a
bounds:1140,1599,78,230
offsets:4,3,85,237
朽叶_发梢3
bounds:1142,290,113,206
offsets:3,2,118,212
朽叶_发梢3a
bounds:1362,675,54,160
offsets:4,4,62,168
朽叶_发梢4
bounds:0,52,72,164
offsets:3,4,79,172
朽叶_发梢5
bounds:567,1227,141,146
offsets:3,3,147,153
朽叶_发梢6
bounds:48,4,113,167
offsets:3,3,120,173
朽叶_发梢7
bounds:298,526,89,206
offsets:2,3,93,213
朽叶_发梢8
bounds:965,1844,81,163
offsets:4,4,90,171
朽叶_发梢9
bounds:1293,1952,55,216
offsets:4,3,62,222
rotate:90
朽叶_右手
bounds:1618,94,539,370
offsets:0,40,539,410
rotate:270
朽叶_尾指
bounds:164,1095,117,58
offsets:0,1,117,59
朽叶_左手臂
bounds:817,507,242,401
offsets:0,1,320,687
rotate:90
朽叶_底发
bounds:924,267,249,249
offsets:4,3,257,255
朽叶_手掌
bounds:824,1863,134,144
朽叶_手臂
bounds:154,1432,97,139
offsets:0,0,98,139
朽叶_拇指
bounds:856,668,54,116
offsets:0,0,54,119
朽叶_无名指
bounds:954,1297,121,89
offsets:0,1,123,90
朽叶_珍珠1
bounds:129,1487,24,40
朽叶_眉毛
bounds:135,1971,56,36
朽叶_眼球
bounds:67,1571,22,27
朽叶_眼白
bounds:0,1882,34,34
朽叶_眼睑
bounds:97,1531,59,46
朽叶_脸
bounds:1129,878,164,238
朽叶_衣袖1
bounds:30,535,197,265
rotate:90
朽叶_衣袖2
bounds:513,826,125,119
朽叶_食指
bounds:1219,1730,68,126
offsets:0,2,69,129
杏花1
bounds:0,1360,808,647
offsets:0,82,809,781
杏花2
bounds:1019,1545,677,462
offsets:53,40,730,536
杏花3
bounds:476,929,171,170
offsets:1,0,172,170
花补充
bounds:0,736,520,347
jh03_46kv_boss_2.png
size:402,371
filter:Linear,Linear
scale:0.44
hua_3
bounds:0,0,402,371
offsets:0,5,402,384
@@ -0,0 +1 @@
{"skeleton":{"hash":"raOoJY+0PCQ","spine":"4.2.43","x":-1242.17,"y":-804.4,"width":2687.68,"height":1496.18,"images":""},"bones":[{"name":"root","x":125.07,"y":-197.68,"scaleX":0.44,"scaleY":0.44},{"name":"boss+朽叶","parent":"root","x":-3585.64,"y":2682.07},{"name":"朽叶","parent":"boss+朽叶","x":1791.22,"y":-3165.23},{"name":"boss+卷轴","parent":"boss+朽叶","x":5318.19,"y":-2712.03},{"name":"朽叶_上半身2","parent":"朽叶","length":411.85,"rotation":83.01,"x":-20.81,"y":-30.17},{"name":"朽叶_上半身3","parent":"朽叶_上半身2","length":608.33,"rotation":-5.91,"x":411.85},{"name":"朽叶_上半身4","parent":"朽叶_上半身3","length":266.48,"rotation":35.73,"x":626.02,"y":2.39},{"name":"朽叶_发梢1","parent":"朽叶_上半身4","x":279.91,"y":-1.07},{"name":"朽叶_发梢3","parent":"朽叶_发梢1","length":61.3,"rotation":-151.93,"x":418.7,"y":63.33},{"name":"朽叶_发梢4","parent":"朽叶_发梢3","length":77.73,"rotation":-17.22,"x":61.77,"y":-0.58},{"name":"朽叶_发梢5","parent":"朽叶_发梢4","length":62.82,"rotation":-12.9,"x":78.35,"y":-0.41},{"name":"朽叶_发梢6","parent":"朽叶_发梢5","length":68.66,"rotation":-1.18,"x":62.82},{"name":"朽叶_发梢7","parent":"朽叶_发梢6","length":68.72,"rotation":-14.02,"x":68.66},{"name":"朽叶_发梢8","parent":"朽叶_发梢7","length":54.04,"rotation":-13.49,"x":68.72},{"name":"朽叶_发梢9","parent":"朽叶_发梢8","length":63.09,"rotation":-13.52,"x":54.04},{"name":"朽叶_发梢2","parent":"朽叶_发梢1","length":74.71,"rotation":-155.41,"x":431.93,"y":39.21},{"name":"朽叶_发梢10","parent":"朽叶_发梢2","length":84.13,"rotation":-0.99,"x":74.71},{"name":"朽叶_发梢11","parent":"朽叶_发梢10","length":66.78,"rotation":-2.79,"x":84.14},{"name":"朽叶_发梢12","parent":"朽叶_发梢11","length":73.49,"rotation":-4.81,"x":66.78},{"name":"朽叶_发梢13","parent":"朽叶_发梢12","length":92.93,"rotation":-1.97,"x":73.49},{"name":"朽叶_发梢14","parent":"朽叶_发梢13","length":56.91,"rotation":-3.59,"x":91.74,"y":0.89},{"name":"朽叶_发梢15","parent":"朽叶_发梢14","length":75.07,"rotation":-25.31,"x":56.91},{"name":"朽叶_发梢16","parent":"朽叶_发梢1","length":59.29,"rotation":-142.93,"x":409.5,"y":20.42},{"name":"朽叶_发梢17","parent":"朽叶_发梢16","length":70.72,"rotation":-3.76,"x":59.29},{"name":"朽叶_发梢18","parent":"朽叶_发梢17","length":49.96,"rotation":-2.67,"x":70.72},{"name":"朽叶_发梢19","parent":"朽叶_发梢18","length":59.52,"rotation":9,"x":49.96},{"name":"朽叶_发梢20","parent":"朽叶_发梢19","length":71.5,"rotation":2.29,"x":59.52},{"name":"朽叶_发梢21","parent":"朽叶_发梢20","length":40.3,"rotation":-12.27,"x":72.85,"y":0.63},{"name":"朽叶_发梢22","parent":"朽叶_发梢21","length":73.63,"rotation":-17.36,"x":40.3},{"name":"朽叶_发梢23","parent":"朽叶_发梢1","length":69.17,"rotation":87.94,"x":345.85,"y":51.25},{"name":"朽叶_发梢24","parent":"朽叶_发梢23","length":61.72,"rotation":60.22,"x":69.17},{"name":"朽叶_发梢25","parent":"朽叶_发梢24","length":57.9,"rotation":24.65,"x":61.72},{"name":"朽叶_发梢26","parent":"朽叶_发梢25","length":64.37,"rotation":-9.01,"x":59.65,"y":-2.03},{"name":"朽叶_发梢27","parent":"朽叶_发梢26","length":56.58,"rotation":-3.62,"x":64.37},{"name":"朽叶_发梢28","parent":"朽叶_发梢27","length":50.9,"rotation":-9.72,"x":56.58},{"name":"朽叶_发梢29","parent":"朽叶_发梢1","length":65.6,"rotation":105.72,"x":388.04,"y":93.98},{"name":"朽叶_发梢30","parent":"朽叶_发梢29","length":70.19,"rotation":22.98,"x":65.6},{"name":"朽叶_发梢31","parent":"朽叶_发梢30","length":57.71,"rotation":13.53,"x":70.19},{"name":"朽叶_发梢32","parent":"朽叶_发梢31","length":57.85,"rotation":-10.98,"x":57.71},{"name":"朽叶_发梢33","parent":"朽叶_发梢32","length":65.32,"rotation":14.09,"x":57.85},{"name":"朽叶_发梢34","parent":"朽叶_发梢33","length":71.02,"rotation":17.83,"x":65.32},{"name":"朽叶_发梢35","parent":"朽叶_发梢1","length":64.48,"rotation":137.18,"x":393,"y":114.96},{"name":"朽叶_发梢36","parent":"朽叶_发梢35","length":69.79,"rotation":4.73,"x":64.48},{"name":"朽叶_发梢37","parent":"朽叶_发梢36","length":59.22,"rotation":8.13,"x":69.79},{"name":"朽叶_发梢38","parent":"朽叶_发梢37","length":80.21,"rotation":5.81,"x":59.22},{"name":"朽叶_发梢39","parent":"朽叶_发梢38","length":56.98,"rotation":-1.15,"x":80.22,"y":-0.61},{"name":"朽叶_发梢40","parent":"朽叶_发梢39","length":71.18,"rotation":6.41,"x":56.98},{"name":"朽叶_发梢41","parent":"朽叶_发梢40","length":69.49,"rotation":14.01,"x":71.18},{"name":"朽叶_发梢3a","parent":"朽叶_发梢1","length":58.78,"rotation":165.55,"x":261.11,"y":189.75},{"name":"朽叶_发梢3a2","parent":"朽叶_发梢3a","length":80.25,"rotation":-0.93,"x":59.39,"y":-0.09},{"name":"朽叶_发梢3a3","parent":"朽叶_发梢3a2","lLine truncated
Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 129 KiB

@@ -0,0 +1,17 @@
{
"name": "jh03_46kv_boss",
"spine": "4.2.43",
"animations": [
"loop3"
],
"skins": [
"default"
],
"pages": [
"jh03_46kv_boss.png",
"jh03_46kv_boss_2.png"
],
"source": "https://act.mihoyo.com/puzzle/hkrpg/e20260913version_fasf13434_77d1c0e99b/index.html?game_biz=hkrpg_cn&mhy_presentation_style=fullscreen&mhy_landscape=true&mhy_hide_status_bar=true&mode=fullscreen&win_mode=fullscreen&isBili=1",
"originalImages": null,
"fetchedAt": "2026-09-22T00:37:28+00:00"
}