Files
SpineWallpaper/.scratch/build-pipeline/issues/13-combo-and-dev-flag-bugs.md
T
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.5 KiB
Raw Blame History

13 — 下拉框自绘,以及热更新暴露出的两个调试服 bug

Status: resolved Type: task

需求

把下拉选项框的样式同步一下

上一轮我说过:"官方那个深色高亮当前项的下拉,用 color-scheme: dark 让原生 select 的弹出层走深色就够了……如果你觉得弹出层样式还是差得多,我再换成自绘的。" —— 现在换成自绘了。

为什么必须自绘

原生 <select> 的弹出列表由操作系统绘制,CSS 完全够不着。color-scheme: dark 只能把它整体变暗, 做不出官方那种"当前项高亮 + 悬停高亮"的列表——那需要控制每一行。

自绘之后闭合态与展开态都归自己管:

  • 闭合态:#2a2a2e 底、#3a3a40 边、当前项文字 + 右侧 ▼
  • 展开态:#232327 底、当前项 #3c3c46 高亮、悬停 #34343a
  • 键盘 Esc 收起、点外面收起、下方放不下就翻到上方

弹层挂在 documentElement 下(同面板与取色器):挂在面板里会被 paintProps 重画时销毁, 挂在 body 里会被翻转/颜色选项的 transform/filter 波及。

顺带修掉的两个调试服 bug

做这一轮验证时撞出来的,都不是新引入的,是一直都在:

① pnpm dev --with-sim 根本起不来

parseArgs 把 --with-sim 当未知参数拒掉,而 main() 里那段 process.argv.includes("--with-sim") 永远走不到——这个开关一直是死代码。 现在显式放行并写进 HELP。

② 热更新重建会丢掉 --with-sim

初始构建带了 --with-sim,重建那一行没带。于是 pnpm dev --with-sim 在第一次保存后 会被悄悄换成干净构建——产物里的模拟器没了,而没人会想到是"保存"干的。 现在两处共用同一份 buildFlags。

一次差点混过去的空验证

第 ② 条我第一次是这么"验证"的:起调试服、改个 CSS、数一下模拟器还在不在 —— 结果是 4,看起来修好了。

其实调试服因为参数不认识根本没起来(就是 bug ①)。没有重建,当然还是 4。

一个不检查前置条件的验证,等于没有验证。

重写成 tools/checks/verify-dev-flags.mts:第一件事就是 fetch("/") 断言服务活着,不活就直接抛; 第二件事用"调试服已经能取到新 CSS"作为重建完成的判据,而不是干等固定秒数。

并且证明它会红:不带 --with-sim 启动、产物里先放好模拟器,跑同一个脚本 → ✗ --with-sim 在热更新重建后仍然生效 → 4 → 0。红了才说明它真的在测这件事。

验证

  • tools/checks/verify-panel.mts 第 ⑨ 组:点开下拉 → 两个预设都在、当前项恰好一个高亮、 弹层在 documentElement 下、选完收起、值下发给壁纸(preset=kv37)、按钮文字跟着换
  • tools/checks/verify-dev-flags.mts:见上(含变红验证)
  • 其余回归全绿:pnpm check、调试服与浏览器冒烟、热更新、四档自包含包 file://、 静态托管预览、发布产物差异仅来自 use_custom_audio、6 组渲染与重构前逐像素相同

出图:tools/checks/shot-panel.mts 现在出三张——面板、取色器、下拉展开。

一处没查清的抖动

同一批里 verify-panel 曾失败过一次(连续跑两次 smoke 之后),单独跑与再跑两次都通过, 错误输出被 Select-Object -Last 1 截掉了,没留下现场。不确定是测试自身的问题还是环境抖动, 记在这里而不是当作没发生。再出现的话先保留完整输出。