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

31 lines
1.9 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.
# 03 — 自包含包的门禁必须是会失败的检查
Status: resolved
Type: task
## 问题
"自包含"是自包含包的全部意义,不能靠"我记得内联了"。需要在 `check:dist` 里对每个 `sim/index.html` 断言没有外部依赖。
## 答案
三项断言:没有 `<script type="module">`、标签上没有 `http(s)://`、没有 `file:///` 与根绝对路径。
**两个必须处理的细节**:
1. **扫描前剥掉内联脚本的内容。** spine-player 是整份内联的,内部带着编辑器示例模板,含 `<script src="https://…">` 字符串;直接扫整页会把它们当依赖,四个分发全报假阳性。
2. **剥除时只删标签之间的内容,保留开标签本身。** 第一版写成整体替换,把开标签一起删了,于是所有 `<script src=…>` 都不再被检查——门禁看着在跑,实际只查得到 `<link>`。
## 验证
`tools/checks/test-sim-gate.mts` 往页面注入四种外部依赖(外链 script、`file:///`、根绝对路径、`type=module`),确认每种都被拦下,且干净页面通过。
第 2 个细节就是这个测试发现的:**一个从不失败的检查等于没有检查**,所以门禁本身要有测试。
## 附带:内联脚本的 `</script` 守卫
同一类问题还有一处:内联脚本体里若出现 `</script`,会**提前终止** script 元素,后面的代码变成页面文本。当前所有被内联的源码都不含这个串,但这是个沉默的陷阱,所以 `buildSimPage` 加了一道构建期断言(`tools/checks/test-inline-guard.mts` 验证它有效)。
**守卫自身也要测,而且第一版就写错了**:它把 driver 也一起查了,而 driver 本来就是一个完整的 `<script>…</script>` 块、收尾标签是它自己的,于是干净源码立刻构建失败。守卫只查纯 JS 体(spine-player、模拟器段、运行时段)。