feat(agc): 发布透传二创核心改动说明并暴露本地来源记录

This commit is contained in:
2026-10-06 18:24:57 +08:00
parent bd73acfccd
commit 6ae7913cd2
3 changed files with 26 additions and 3 deletions
@@ -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,
@@ -1762,6 +1762,9 @@ pub(crate) async fn publish_local_project_game(
include_project_bundle: Option<bool>,
// 买断价(整数泥点,`0` 表示免费)。旧前端不传时为 `None`,按免费提交,保持向后兼容。
price_mud_points: Option<u64>,
// 衍生作品的「本次核心改动说明」(母版可空):面板采集后原样透传;必填与长度规则只在服务端
// (`game_distribution_change_summary_violation`),这里不预校验,避免两套判据漂移。
change_summary: Option<String>,
) -> Result<GameDistributionPublishResult, String> {
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,
@@ -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<Option<ProjectForkSourceRecord>, 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` 身份。