陶泥儿导出收敛为单一发布入口并把线上值内联到字段

- 移除独立「打包」按钮与「发行包」卡片,发布入口不套卡片,内部先跑打包
- 线上值逐字段内联到对应输入框下方,退役 OnlineValuesCard
- 线上值进项目自动读取,失败按固定间隔静默自动重试,去掉「重新读取」手动入口
- 读取失败时提示正在自动重试,发布入口保持停住
- 同步陶泥儿面板测试与技术方案/实施计划文档
This commit is contained in:
2026-10-07 14:09:26 +08:00
parent 11c8c2789a
commit 9a653c8382
11 changed files with 384 additions and 391 deletions
@@ -5,9 +5,9 @@
陶泥儿(Taonier)导出采用与小红书同构的**文件草稿 + agent 适配打包**模式:草稿 `.export/taonier.json` 是唯一真相,打包由 `vite-export-taonier` skill 与项目 `build:taonier` 脚本完成,发布媒体向游戏分发 API **formdata 原始二进制直传**。
- 草稿:`.export/taonier.json`,形状 `{ form: { title, summary, category, coverPath, screenshotPaths[] } }`;内容 hash 冲突逐字段选择,宿主零业务校验,校验只在前端 `taonierFields`。
- 打包:项目 `package.json` 提供 `build:taonier`(既有 `command.exec` 的 `build:*` 白名单),由 skill `vite-export-taonier` 的 `vite.config.taonier.mjs` 构建到 `dist-taonier`、`pack.mjs` 打成 `.export/taonier.zip`;**标准 `build`/`dist` 不被占用**。宿主只运行脚本并校验产物(普通文件、非空、非符号链接、能作为 ZIP 打开、根有 `index.html`、读取安全线 512 MiB),并按 `shared-contracts` 的 `GAME_DISTRIBUTION_MAX_PACKAGE_BYTES`(平台发行包上限 200 MiB)在构建收尾与发布读包两处预检,超限当场给「精简资源后重新导出再发布」,不等上传吃服务端 413;读取安全线与平台上限不是一个概念。
- 打包:项目 `package.json` 提供 `build:taonier`(既有 `command.exec` 的 `build:*` 白名单),由 skill `vite-export-taonier` 的 `vite.config.taonier.mjs` 构建到 `dist-taonier`、`pack.mjs` 打成 `.export/taonier.zip`;**标准 `build`/`dist` 不被占用**。宿主只运行脚本并校验产物(普通文件、非空、非符号链接、能作为 ZIP 打开、根有 `index.html`、读取安全线 512 MiB),并按 `shared-contracts` 的 `GAME_DISTRIBUTION_MAX_PACKAGE_BYTES`(平台发行包上限 200 MiB)在构建收尾与发布读包两处预检,超限当场给「精简资源后重新导出再发布」,不等上传吃服务端 413;读取安全线与平台上限不是一个概念。面板只给一颗「打包并发布」入口(打包是发布的第一步),不再有独立的打包步骤或按钮。
- 适配与错误:未适配弹「让陶泥儿帮我调通」;adapt/fill/repair 三类指令与小红书一致,失败现场原样转发 code agent;「帮我填」只写元数据,不改打包适配。
- 线上值:草稿是唯一真相;读命令额外返回只读线上值(live game 行),不自动 seed/回填;文案字段与图片均可「沿用线上值」,图片路径为空表示沿用(发布时带线上 objectKey)。
- 线上值:草稿是唯一真相;读命令额外返回只读线上值(live game 行),不自动 seed/回填;面板把线上值**逐字段内联**挂在对应输入框下方(比当前值小一行),首次发布线上为空时不铺空对照;读取自动进行、失败按固定间隔静默自动重试,界面不提供手动「重新读取」入口;文案字段与图片均可「沿用线上值」,图片路径为空表示沿用(发布时带线上 objectKey)。
- 退役收口:`exports/` 目录、历史试玩包链、`prepare/upload/list` 命令、生成任务产物声明、prompts、run-trace 白名单与排除列表都不再存在;AI 资料建议与封面生成、`useGameDistributionPublishForm`/`GameDistributionPublishFormView`/`GamePublishBlockedDialog` 一并删除,保留发布进度对话框。
- 发布媒体:`POST /api/game-distribution/games`、`POST .../versions`、`PATCH .../my-games/{id}` 收 `multipart/form-data`(元数据文本 + 封面/截图原始二进制 + 沿用 objectKey);整包仍走 raw/chunked。AGC 发布命令所需的本地图路径由发布面板(UI 表单)随命令传入,**不再回读 `.export/taonier.json` 草稿注册表**:文字字段与本地媒体路径都取 `packageAll()` 落定的同一份权威表单,面板看到的值就是提交的值。图片落项目快照桶 `agc/project-snapshots/v1/game-distribution/media/...`,不建 `asset_object`;公开读走 `GET /api/game-distribution/media/read-url`(及 `read-bytes`),判定 = 已发布且 active 的 game 且 objectKey 命中封面/截图,不经素材库 ACL。作者预览自己作品的线上封面/截图走 owner 作用域 `GET /api/game-distribution/my-games/{gameId}/media/read-url`(需 bearer,判定 = 作品归属 + objectKey 命中该作品当前媒体),未发布 / 待审 / 被驳回也能换签;AGC `resolve_preview_url` 已切到该路由,不再走素材库 `/api/assets/read-url`。硬切,无旧 JSON/assetId 兼容。
- 验收:草稿/打包/失败转发/沿用线上值与发布直传的定向测试;真实 vite 工程首轮适配与一次真实发布 smoke。