Files
youle_cocos/cocoscreator_projects/scripts/lib/paths.mjs
T
joywayerandClaude Opus 5 5708926711 fix(skin): 修复最终评审发现的 6 处缺陷(junction 排除失效/meta 静默丢失等)
跨任务视角发现的问题: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>
2026-08-27 23:15:28 +08:00

42 lines
1.6 KiB
JavaScript

import { fileURLToPath } from 'node:url';
import { dirname, join, resolve } from 'node:path';
import { readFileSync, readdirSync, existsSync } from 'node:fs';
// 本文件位于 <monorepo>/scripts/lib/paths.mjs → 上溯两级为 monorepo 根
export const ROOT = resolve(dirname(fileURLToPath(import.meta.url)), '..', '..');
export const HOST_PROJECT = join(ROOT, 'YouleNexus');
export const FRAMEWORK_SRC = join(HOST_PROJECT, 'assets', 'framework');
export const GAMES_DIR = join(ROOT, 'games');
export const SEED_DIR = join(ROOT, 'templates', 'game-seed');
export const BUILD_WORKSPACE = join(ROOT, 'build-workspace');
// 子游戏的皮肤覆盖目录
export function gameOverrideDir(projectDir) {
return join(projectDir, 'assets', 'game', 'override');
}
// 某工程(宿主真源,或实体化后的临时工作区)的 framework/ui 目录。
// check-skin 与 build-game(composeSkin) 共用同一份推导,不各自拼路径(唯一权威)。
export function frameworkUiDirOf(projectDir) {
return join(projectDir, 'assets', 'framework', 'ui');
}
export const FRAMEWORK_UI_DIR = frameworkUiDirOf(HOST_PROJECT);
export function readCreatorVersion(projectDir) {
try {
const pkg = JSON.parse(readFileSync(join(projectDir, 'package.json'), 'utf8'));
return pkg?.creator?.version ?? null;
} catch {
return null;
}
}
export function listGameProjects(gamesDir = GAMES_DIR) {
if (!existsSync(gamesDir)) return [];
return readdirSync(gamesDir, { withFileTypes: true })
.filter((d) => d.isDirectory())
.map((d) => join(gamesDir, d.name))
.filter((dir) => existsSync(join(dir, 'package.json')));
}