校验 AGC 发布媒体前缀与 Rust 常量一致

- check-game-distribution-dto-parity 增加发布媒体 objectKey 前缀的逐字比对
- 前缀漂移会让 UI 把沿用键当本地路径(或反之),此前无门禁覆盖
This commit is contained in:
2026-10-08 11:12:40 +08:00
parent 7591b1f9d5
commit ce32f4a1bd
@@ -26,6 +26,10 @@ const CREATOR_RUST_FILE = 'server-rs/crates/shared-contracts/src/creator.rs';
const CREATOR_TS_FILE = 'packages/shared/src/contracts/creator.ts';
const API_MODULE_FILE =
'server-rs/crates/api-server/src/modules/game_distribution.rs';
// AGC 手写的发布媒体前缀常量:Rust 的 `GAME_DISTRIBUTION_MEDIA_PREFIX` 是唯一真源,这里顺带比对,
// 因为两边都靠这段前缀区分「沿用线上 objectKey」与「项目内本地路径」。
const AGC_PUBLISH_TS_FILE =
'apps/ai-game-creator-shell/src/services/gameDistributionPublish.ts';
// ts-rs 生成的类型:结构一致性由 `check:generated-bindings` 逐字节保证,
// 本脚本不逐字段复核,只在「Rust 类型都登记过」的清单里显式跳过。
@@ -633,6 +637,31 @@ const failures = [];
const mappedRust = new Set(PAIRS.map(([rustName]) => rustName));
const mappedTs = new Set(PAIRS.map(([, tsName]) => tsName));
// 发布媒体前缀不是 DTO 字段,容易在改名 / 搬迁时两边漂移,单独钉一条逐字一致的断言。
{
const rustPrefix =
/pub const GAME_DISTRIBUTION_MEDIA_PREFIX: &str =\s*"([^"]+)";/.exec(
fs.readFileSync(RUST_FILE, 'utf8'),
)?.[1];
const agcPrefix =
/GAME_DISTRIBUTION_MEDIA_OBJECT_KEY_PREFIX\s*=\s*'([^']+)'/.exec(
fs.readFileSync(AGC_PUBLISH_TS_FILE, 'utf8'),
)?.[1];
if (!rustPrefix) {
failures.push(
'未能在 shared-contracts 解析出 GAME_DISTRIBUTION_MEDIA_PREFIX',
);
} else if (!agcPrefix) {
failures.push(
`未能在 ${AGC_PUBLISH_TS_FILE} 解析出 GAME_DISTRIBUTION_MEDIA_OBJECT_KEY_PREFIX`,
);
} else if (rustPrefix !== agcPrefix) {
failures.push(
`发布媒体 objectKey 前缀不一致:Rust=${rustPrefix} / AGC=${agcPrefix}`,
);
}
}
for (const [rustName, tsName] of PAIRS) {
const rustDefinition = rust.get(rustName);
const tsDefinition = ts.get(tsName);