diff --git a/src/components/PublishModal.tsx b/src/components/PublishModal.tsx index 90535af..9b953d4 100644 --- a/src/components/PublishModal.tsx +++ b/src/components/PublishModal.tsx @@ -467,6 +467,7 @@ export function PublishModal({ modrinth: selectedModrinth.map((mc_version) => ({ mc_version })), curseforge: selectedCurseforge.map((mc_version) => ({ mc_version })), }, + allMcVersions: projectVersions, cutoffMcVersion: lastVersionEnd ?? "", changelog, versionType, diff --git a/src/services/publish.schemas.ts b/src/services/publish.schemas.ts index d8e92d3..16b2cc9 100644 --- a/src/services/publish.schemas.ts +++ b/src/services/publish.schemas.ts @@ -32,6 +32,9 @@ export const PublishInputSchema = z.object({ mcVersions: z.object(createRecord( platforms, z.array(z.object({ mc_version: z.string() })) )), + // 项目全部 MC 版本(完整列表)。范围计算必须基于它:只传勾选子集会让 + // 子集末尾被误判为"最后一个版本",范围按 lastVersionEnd 一路放大到最新 MC 版本 + allMcVersions: z.array(z.string()).min(1), cutoffMcVersion: z.string(), // 最后一个版本的截止 MC 版本,两个平台共用 changelog: z.string(), versionType: BaseVersionSchema.shape.version_type, diff --git a/src/services/publish.ts b/src/services/publish.ts index ae06f72..58bc6bd 100644 --- a/src/services/publish.ts +++ b/src/services/publish.ts @@ -81,11 +81,16 @@ async function runPlatform( // 否则前端进度条会停在 running 假象里,错误也被吞掉。 let mcVersionEntries: McVersionEntry[]; try { + // 范围必须基于完整项目版本列表计算,勾选只决定发布哪些条目 + const selected = new Set(mcVersions.map((v) => v.mc_version)); mcVersionEntries = computeVersionRanges( - mcVersions.map(v => v.mc_version), + ctx.input.allMcVersions, await getGameVersionsFn(), ctx.input.cutoffMcVersion - ); + ).filter((e) => selected.has(e.version)); + if (mcVersionEntries.length !== selected.size) { + throw new Error("勾选版本与项目版本列表不一致,请刷新后重试"); + } } catch (err) { const msg = errorMessage(err); console.error(`[publish] ${platform} 准备阶段失败:`, err);