diff --git a/apps/ai-game-creator-shell/src-tauri/src/desktop.rs b/apps/ai-game-creator-shell/src-tauri/src/desktop.rs index c11a2e712..d151b385f 100644 --- a/apps/ai-game-creator-shell/src-tauri/src/desktop.rs +++ b/apps/ai-game-creator-shell/src-tauri/src/desktop.rs @@ -626,6 +626,7 @@ pub(super) fn run() { list_platform_game_catalog, read_public_game_cover_preview, read_public_game_detail, + read_local_project_fork_source, read_game_distribution_publication, publish_local_project_game, read_game_creator_app_config, diff --git a/apps/ai-game-creator-shell/src-tauri/src/game_distribution_publish.rs b/apps/ai-game-creator-shell/src-tauri/src/game_distribution_publish.rs index e034a41d7..b7200ba1b 100644 --- a/apps/ai-game-creator-shell/src-tauri/src/game_distribution_publish.rs +++ b/apps/ai-game-creator-shell/src-tauri/src/game_distribution_publish.rs @@ -1762,6 +1762,9 @@ pub(crate) async fn publish_local_project_game( include_project_bundle: Option, // 买断价(整数泥点,`0` 表示免费)。旧前端不传时为 `None`,按免费提交,保持向后兼容。 price_mud_points: Option, + // 衍生作品的「本次核心改动说明」(母版可空):面板采集后原样透传;必填与长度规则只在服务端 + // (`game_distribution_change_summary_violation`),这里不预校验,避免两套判据漂移。 + change_summary: Option, ) -> Result { let snapshot = require_platform_session()?; let app_data_dir = app @@ -1915,9 +1918,12 @@ pub(crate) async fn publish_local_project_game( // 买断价随版本冻结;面板已本地校验,这里透传服务端口径的整数泥点。 price_mud_points, game_metadata: metadata, - // 二创「本次核心改动说明」:AGC 目前没有收集它的入口(发布设置页由另一条链路接线), - // 服务端把 `None` 当「未填写」且序列化时省略该键,因此与旧客户端行为一致。 - change_summary: None, + // 二创「本次核心改动说明」:面板采集后原样透传;必填与长度规则只在服务端 + // (`game_distribution_change_summary_violation`),这里不预校验,避免两套判据漂移。 + // trim 后为空按「未填写」处理,与契约的 skip_serializing_if 语义一致。 + change_summary: change_summary + .map(|value| value.trim().to_string()) + .filter(|value| !value.is_empty()), }; let version_value = request_json( &client, diff --git a/apps/ai-game-creator-shell/src-tauri/src/game_fork/desktop.rs b/apps/ai-game-creator-shell/src-tauri/src/game_fork/desktop.rs index 206381116..105c4c590 100644 --- a/apps/ai-game-creator-shell/src-tauri/src/game_fork/desktop.rs +++ b/apps/ai-game-creator-shell/src-tauri/src/game_fork/desktop.rs @@ -85,6 +85,22 @@ fn emit_fork_stage(app: &tauri::AppHandle, stage: ForkSyncStage) { } } +/// 读本项目的改编来源记录(`.agent/fork-source.json`)。 +/// +/// 发布面板用它判断「这是不是衍生作品」:衍生作品的「本次核心改动说明」必填、授权档位继承父作品 +/// 且不可选(服务端口径)。文件缺失/损坏按「不是衍生作品」处理(`None`),与发布链路读它时的口径 +/// 一致——同一个可选元数据文件不该让面板报错。 +#[tauri::command] +pub(crate) fn read_local_project_fork_source( + project_path: String, +) -> Result, String> { + let root = Path::new(project_path.trim()); + if root.as_os_str().is_empty() { + return Err("读取改编来源需要本地项目路径".to_string()); + } + Ok(read_project_fork_source(root)) +} + /// 从平台作品 Fork:按取件形态建成项目。 /// /// - `source: "project"`(工程源包):解压即得作者的工程,再走标准初始化补 `.agent` 身份。