跨任务视角发现的问题:Critical1 materialize.mjs 的 junction 排除比较在 Windows 上因长路径前缀恒假、从未生效,且测试夹具的 junction 指向真源自身, 掩盖了此问题;Critical2 composeSkin 例外通道在 uuid 缺失/框架侧无 meta 时 静默失败,违反第二准则;Important3 可覆盖范围误把 theme/ 下的框架 TS 代码 也纳入;Important5 cli-entry 测试漏注册 check-skin/build-game;Important6 composeSkin 与 check-skin 各自拼路径,未共用 paths.mjs 权威推导;Important7 --platform 缺值时静默落到默认平台。逐条修复并补测试,Critical1 用诱饵框架 目录验证过能真正杀掉该 bug(变异推演见 fix report)。 spec §5 step5 的 dist/<name>/ 拷贝按要求标注为本期未实现,不实现。 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
41 lines
1.6 KiB
JavaScript
41 lines
1.6 KiB
JavaScript
#!/usr/bin/env node
|
|
import { join } from 'node:path';
|
|
import { existsSync } from 'node:fs';
|
|
import { pathToFileURL } from 'node:url';
|
|
import { FRAMEWORK_UI_DIR, GAMES_DIR, gameOverrideDir } from './lib/paths.mjs';
|
|
import { listCoverableAssets, validateOverrides } from './lib/skin.mjs';
|
|
|
|
/** 校验某子游戏的皮肤覆盖。opts 可注入路径用于测试。 */
|
|
export function checkSkin(gameName, opts = {}) {
|
|
const gamesDir = opts.gamesDir ?? GAMES_DIR;
|
|
const frameworkUiDir = opts.frameworkUiDir ?? FRAMEWORK_UI_DIR;
|
|
|
|
const projectDir = join(gamesDir, gameName);
|
|
if (!existsSync(projectDir)) {
|
|
throw new Error(`找不到子游戏工程:${projectDir}`);
|
|
}
|
|
// override 目录不存在 = 该子游戏不换肤,合法
|
|
const { matched, errors } = validateOverrides(frameworkUiDir, gameOverrideDir(projectDir));
|
|
return { matched, errors, frameworkTotal: listCoverableAssets(frameworkUiDir).length };
|
|
}
|
|
|
|
// CLI 入口:有错误则退出码 1
|
|
if (process.argv[1] && import.meta.url === pathToFileURL(process.argv[1]).href) {
|
|
const name = process.argv[2];
|
|
if (!name) {
|
|
console.error('用法: npm run check-skin <game>');
|
|
process.exit(1);
|
|
}
|
|
const { matched, errors, frameworkTotal } = checkSkin(name);
|
|
console.log(`皮肤命中 ${matched.length} 处,框架可覆盖资源共 ${frameworkTotal} 个`);
|
|
if (errors.length === 0) {
|
|
console.log('OK: override 全部合法。');
|
|
process.exit(0);
|
|
}
|
|
console.error(`\n发现 ${errors.length} 处问题(子游戏 ${name}):`);
|
|
for (const e of errors) {
|
|
console.error(` [${e.code}] ${e.path}\n ${e.message}`);
|
|
}
|
|
process.exit(1);
|
|
}
|