把项目从「手写 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 处引用自包含。
52 lines
2.3 KiB
TypeScript
52 lines
2.3 KiB
TypeScript
// 给"还原后的面板"拍图。用真实 CDP:把指针移到右边缘让面板滑出,等过渡走完再截。
|
|
// 出两张:面板本体、以及点色块弹出的取色器。
|
|
// 用法:node tools/checks/shot-panel.mts [base] [outDir]
|
|
import { mkdir, writeFile } from "node:fs/promises";
|
|
import { withPage, sleep } from "../cdp.mjs";
|
|
|
|
const BASE = process.argv[2] ?? "http://127.0.0.1:5173";
|
|
const OUT_DIR = (process.argv[3] ?? ".scratch/shots").replace(/[\\/]+$/, "");
|
|
const W = 1280;
|
|
const H = 900;
|
|
|
|
await mkdir(OUT_DIR, { recursive: true });
|
|
|
|
await withPage({ width: W, height: H, profile: "tools/.cache/edge-panel-shot" }, async ({ send, evaluate }) => {
|
|
await send("Page.navigate", { url: `${BASE}/release/collection-all/` });
|
|
await sleep(3500);
|
|
|
|
const shoot = async (name) => {
|
|
const shot = await send("Page.captureScreenshot", { format: "png" });
|
|
const path = `${OUT_DIR}/${name}.png`;
|
|
await writeFile(path, Buffer.from(shot.data, "base64"));
|
|
console.log(` 已保存 ${path}`);
|
|
};
|
|
|
|
// 指针移到右边缘 → 面板滑出(这是它唯一的打开方式)
|
|
await send("Input.dispatchMouseEvent", { type: "mouseMoved", x: W - 8, y: H / 2, button: "none", buttons: 0 });
|
|
await sleep(500);
|
|
console.log(` 面板状态 data-open=${await evaluate(`document.getElementById("wesim").dataset.open`)}`);
|
|
await shoot("panel-official-look");
|
|
|
|
// 点色块 → 取色器
|
|
await evaluate(`document.querySelector("#wesim .swatch").click()`);
|
|
await sleep(400);
|
|
console.log(` 取色器已打开:${await evaluate(`!!document.getElementById("wesim-picker")`)}`);
|
|
await shoot("panel-color-picker");
|
|
|
|
// 收起取色器,再展开「壁纸预设切换」的下拉
|
|
await evaluate(`document.querySelector("#wesim-picker .pk-foot button:not(.primary)").click()`);
|
|
await sleep(200);
|
|
await evaluate(`(function(){
|
|
var rows = document.querySelectorAll("#wesim .body .row");
|
|
for (var i = 0; i < rows.length; i++) {
|
|
var l = rows[i].querySelector(".label");
|
|
if (l && l.textContent === "壁纸预设切换") { rows[i].querySelector(".combo-btn").click(); return true; }
|
|
}
|
|
return false;
|
|
})()`);
|
|
await sleep(300);
|
|
console.log(` 下拉已展开:${await evaluate(`!!document.getElementById("wesim-combo")`)}`);
|
|
await shoot("panel-combo-open");
|
|
});
|