docs(游戏共创): 同步 AGC 动作名「开始共创」并补 5.9 证据
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Has been cancelled
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Has been cancelled
Project CI / AI game creator shell Rust crates (pull_request) Has been cancelled
Project CI / Backend tests (pull_request) Has been cancelled
Project CI / Native shell tests (pull_request) Has been cancelled
Project CI / Frontend tests (pull_request) Has been cancelled
Project CI / Repository checks (pull_request) Has been cancelled
Project CI / AI game creator shell web tests (pull_request) Has been cancelled
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Has been cancelled
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Has been cancelled
Project CI / AI game creator shell Rust crates (pull_request) Has been cancelled
Project CI / Backend tests (pull_request) Has been cancelled
Project CI / Native shell tests (pull_request) Has been cancelled
Project CI / Frontend tests (pull_request) Has been cancelled
Project CI / Repository checks (pull_request) Has been cancelled
Project CI / AI game creator shell web tests (pull_request) Has been cancelled
This commit is contained in:
@@ -137,7 +137,7 @@ stateDiagram-v2
|
||||
| --- | --- |
|
||||
| `/games/mine` 每张作品卡 | 新增「共创授权」三态设置(**只有母版**有该入口:仅允许提升,终态 `full` 时只读;**衍生作品的档位由父作品继承、是终态**,不提供该入口——入口隐藏已落地(`4f888d8c9`:网页端改为只读展示「继承自父作品」),服务端即使收到 `PUT` 也一律 409 `FORK_AUTHORIZATION_INHERITED`);新增「被改编 N」入口,弹层列出直接子代(标题 / 作者 / 代际 / 状态);提升授权后若当前公开版本没有工程源包,行内提示「上传工程源码以支持源码级改造」(上传在桌面端客户端完成,网页端只做引导) |
|
||||
| `/games/publish`、AGC 发布面板 | 新增「授权共创」三态单选(默认「禁止共创」,页面提示:开启后可被他人复刻改编,开启后不可撤销);**上架时随创建请求一起提交**(`forkAuthorization`),不必事后补一次提升;从父作品 Fork 而来时显示只读的「改编自《X》」**且档位由服务端继承父作品当时的档位**——该场景下客户端所选档位不生效(不报错,见 §2.3),且**该作品从此没有「修改授权」入口**(终态);AGC 发布面板同样只读展示「授权继承自父作品」(同轮改动) |
|
||||
| AGC 客户端 | ① 侧边栏「共创」页列出公开目录里 `forkAuthorization != forbidden` 的作品(卡片:封面 / 标题 / 作者 / 类型 / 创建时间),点卡片「Fork」→ 「Fork 工程确认页」;② `genarrative://fork?gameId=<id>` deep link **已注册**(原生解析 + 聚焦主窗口),带 `gameId` 时**直接落到确认页**、不带时回到「共创」页并如实展示链接原因;③ 手动粘贴作品 ID 的输入块已**移除**(重复入口,口径与理由见 §3.6.2) |
|
||||
| AGC 客户端 | ① 侧边栏「共创」页列出公开目录里 `forkAuthorization != forbidden` 的作品(卡片:封面 / 标题 / 作者 / 类型 / 创建时间),点卡片「开始共创」→ 确认页(标题即「开始共创」);② `genarrative://fork?gameId=<id>` deep link **已注册**(原生解析 + 聚焦主窗口),带 `gameId` 时**直接落到确认页**、不带时回到「共创」页并如实展示链接原因;③ 手动粘贴作品 ID 的输入块已**移除**(重复入口,口径与理由见 §3.6.2) |
|
||||
| `/games/detail` 详情页 | 新增「收藏」按钮(收藏 / 已收藏两态)。初始态取自公开详情的 `collected`(登录才有该字段);点击后 `PUT` / `DELETE /api/game-distribution/games/{gameId}/collection`,按钮态改用**响应里的权威投影值**(不写本地乐观状态——前端本地状态正是本功能要消灭的东西)。未公开 / 已软删除的作品返回 409,按钮按失败态提示 |
|
||||
| `/games/mine`(或「我的」入口)| 新增「我的收藏(收录)」列表:`GET /api/game-distribution/my-collections`,形状与广场一致(封面 / 标题 / 作者 / 游玩数),点击进详情。列表只含**当前公开可读**的作品;已下架作品的收藏行保留,作品重新公开后自动回来(不需要用户重新收藏) |
|
||||
|
||||
@@ -196,7 +196,7 @@ sequenceDiagram
|
||||
API->>API: 校验授权/来源版本/计算 generation 与 root → 写 lineage
|
||||
```
|
||||
|
||||
> 说明:本图是**目标形态**。唤起方式已定:**deep link `genarrative://fork?gameId=<id>` 已注册并落地**(原生解析 + 单实例聚焦,带 `gameId` 直接落到 AGC 的 Fork 工程确认页,见 §3.6.2;§7 第 10 条的其余候选不再需要);`GET …/fork-source` **M2a 已实现**(受鉴权元数据 + 取件本体,实际字段与状态码见 §3.4「登录用户」表),但本图里的响应字段名是 M2b 的目标形状,定稿一律以 §3.4 表格为准。
|
||||
> 说明:本图是**目标形态**。唤起方式已定:**deep link `genarrative://fork?gameId=<id>` 已注册并落地**(原生解析 + 单实例聚焦,带 `gameId` 直接落到 AGC 的「开始共创」确认页,见 §3.6.2;§7 第 10 条的其余候选不再需要);`GET …/fork-source` **M2a 已实现**(受鉴权元数据 + 取件本体,实际字段与状态码见 §3.4「登录用户」表),但本图里的响应字段名是 M2b 的目标形状,定稿一律以 §3.4 表格为准。
|
||||
|
||||
**C. 溯源与命名**
|
||||
|
||||
@@ -448,7 +448,7 @@ A 路线里那个必须提前知道的互斥点已经按既有做法绕开:`cr
|
||||
| `src/components/game-distribution/MyGamesPage.tsx` | 授权三态设置(只升,**仅母版**;衍生作品显示只读「继承自父作品」)、分类标签、「被改编 N」行内展开 |
|
||||
| `src/components/game-distribution/GamePublishPage.tsx` | 发布新版本的**「本次核心改动说明」**(衍生作品必填,20~500 字,前端同等校验) |
|
||||
| `src/services/gameDistributionClient.ts` | `setForkAuthorization` / `getGameLineage` / `getDerivedGames` / `setGameCollection` / `listMyCollections` / `listThemes` / `getTheme`;`getGame` 类型增量 |
|
||||
| `apps/ai-game-creator-shell` | 「共创」列表页(公开目录过滤 + 卡片入口,无粘贴输入块)、Fork 工程确认页(父作品卡 / 强制阅读 3 秒 / 真实同步阶段 / 吸附底部操作条)、发布面板(授权三态 + 衍生作品只读「继承自父作品」 + 「本次核心改动说明」)、`genarrative://fork` deep link 注册、外壳滚动链(见 §3.6.2) |
|
||||
| `apps/ai-game-creator-shell` | 「共创」列表页(公开目录过滤 + 卡片入口,无粘贴输入块)、「开始共创」确认页(父作品卡 / 强制阅读 3 秒 / 真实同步阶段 / 吸附底部操作条)、发布面板(授权三态 + 衍生作品只读「继承自父作品」 + 「本次核心改动说明」)、`genarrative://fork` deep link 注册、外壳滚动链(见 §3.6.2) |
|
||||
| `apps/admin-web/src/pages/AdminGameManagementPage.tsx` | 列表新增授权 / 代际列 |
|
||||
|
||||
#### 3.6.1 交互口径(2026-10-06 补充)
|
||||
@@ -484,17 +484,19 @@ A 路线里那个必须提前知道的互斥点已经按既有做法绕开:`cr
|
||||
- **初始适配口径(2026-10-07 复核)**:初次进入按**宽高同时 fit**(`min(scaleX, scaleY)` + `FIT_PADDING`)并**水平垂直都居中**;若这个比例低于可读下限 `READABLE_MIN_SCALE = 0.6`,就**不强行全览**,改用可读缩放 + 平移,并给出明确提示「树较大:已按可读缩放显示(其余代际在视口外),拖拽平移查看,或点「适应窗口」看全树。」——两种情况下都**不会**在没有提示的前提下把最深的代际丢在视口外。窄屏「图谱视图」另按**宽度**适配(见上文)。
|
||||
- **主干线唯一性复核(2026-10-07,真实数据)**:演示树 `共创演示·A0|星海工坊`(8 节点、`playCount` 全 0,仅 A111 = 1)实测 **每代恰好一个主干**:A0(0 代)/ A1(1 代)/ A11(2 代)/ A111(3 代);A2、A3、A12、A21 **都不是**主干。同代并列 0 热度时取「同代中**创建时间最早**」的那个(`/lineage` 契约即「代际升序、同代按创建时间升序」,布局只按输入顺序稳定取第一个),因此结果确定、不随渲染变化。**结论:主干逻辑未改**;新增「每代 isTrunk 数量恰好 1」的断言把它钉住(`lineageTreeLayout.test.ts`)。
|
||||
|
||||
#### 3.6.2 AGC 客户端:「共创」列表页与 Fork 工程确认页(2026-10-07 补充)
|
||||
#### 3.6.2 AGC 客户端:「共创」列表页与「开始共创」确认页(2026-10-07 补充)
|
||||
|
||||
对外口径只有一句,两处文案一字不差:**把平台上的作品整个工程复制到你的项目里继续改造。**(内部说明:设计意图与 git fork 同源——整份工程搬到你的项目里、副本独立;这层类比只写在这里与代码注释里,**不出现在任何用户可见文案中**。)
|
||||
|
||||
**客户端动作名统一为「开始共创」**(与网页侧同一套词):卡片按钮、确认页标题与正文、进度/错误文案(含原生 Rust 侧合成的取件错误与深链解析提示)、`aria-label`(形如「开始共创《标题》」)全部改;**内部标识保持不变**——Tauri 命令名(`create_local_project_from_platform_game`)、`.agent/fork-source.json`、协议 scheme `genarrative://fork`、组件/模块名(`ForkConfirmView`、`platform-fork/*`)、Rust 类型与埋点枚举都不改。文档里描述机制的「Fork」保留原义(它本来就是 fork)。
|
||||
|
||||
**入口只有两条**
|
||||
|
||||
- **卡片**:`src/view/co-creation/index.tsx` 顺序扫公开目录(最多 3 页 × 50,够 12 个即停)过滤 `forkAuthorization !== 'forbidden'`,卡片点「Fork」→ 确认页。
|
||||
- **卡片**:`src/view/co-creation/index.tsx` 顺序扫公开目录(最多 3 页 × 50,够 12 个即停)过滤 `forkAuthorization !== 'forbidden'`,卡片点「开始共创」→ 确认页。
|
||||
- **深链**:`genarrative://fork?gameId=<id>` 由原生解析后 `WorkspaceLauncher` 直接 `open({origin:'deep-link'})` + 切到确认页;**不带 `gameId`** 的链接回到「共创」页并把链接原因原样显示成一条提示。
|
||||
- **已移除**:手动粘贴「作品 ID 或链接」的输入块(连同 `parsePlatformGameId` / `PLATFORM_FORK_INPUT_ERROR` 死代码)。理由:深链已覆盖「从平台过来」的场景,手动粘贴属于重复入口;删掉后**深链仍直达确认页**(回归用例:`tests/appSurface/home.suite.ts` 的「深链带 gameId 时直接落到确认页」)。
|
||||
|
||||
**Fork 工程确认页**(`src/view/fork-confirm/index.tsx`)
|
||||
**「开始共创」确认页**(`src/view/fork-confirm/index.tsx`)
|
||||
|
||||
- 结构:父作品信息卡(标题 / 作者 / 授权类型 / 作品 ID,缺项逐项降级)→ 授权须知与风险说明(**五条全文**:可修改范围 / 商用权限说明 / 署名要求 / 溯源规则 / 违规后果说明)→ 工程同步(四个**原生真实**阶段:取回作品内容 / 校验摘要与字节 / 解压到项目 / 生成工程与来源记录,不造百分比)→ 底部操作条。
|
||||
- **强制阅读 = 3 秒计时门禁**(`MANDATORY_READING_SECONDS`):徽章显示 `Ns 后可确认`,按钮文案带倒计时且 `disabled`;**不要求「把须知滚到底」**——须知块**没有内层滚动容器**,全文随页面自然流动(页面滚动由外壳统一承担,见下)。
|
||||
@@ -1057,7 +1059,7 @@ procedure 另要求**受信服务身份**(归属判定靠 `owner_user_id`,
|
||||
| 收藏(收录)与「我的收藏」 | HTTP 契约 | 本地夹具脚本(收藏) | ✅ 已覆盖 |
|
||||
| 共创主题(公开读 + 后台写 + 作品详情 `themes` 增量 + 只允许根) | HTTP 契约 | 本地夹具脚本(共创主题) | ✅ 已覆盖 |
|
||||
| 贡献归集(作者视角 `GET /games/{id}/contribution`) | HTTP 契约(作者 Bearer) | 本地夹具脚本(族谱/血缘) I 段 | ✅ 已覆盖 |
|
||||
| **真实 AGC 客户端里点一遍**:共创列表 → Fork 确认 → 取件校验 → 生成工程(写 `.agent/fork-source.json`)→ **运行可用** | **已自动化(2026-10-07)**:Tauri + WebView2 通过 CDP 附着真实客户端(客户端启动时带 `--remote-debugging-port=9222`,见 `~/.config/genarrative/.env` 的 `WEBVIEW2_ADDITIONAL_BROWSER_ARGUMENTS`;探活 `curl --noproxy '*' http://127.0.0.1:9222/json/version` 应回 `Edg/…`) | `scripts/check-agc-co-creation-fork-e2e.mjs`(19 项,npm script `check:agc-co-creation-fork-e2e`):共创列表滚到底且无「直接 Fork 指定作品」输入块;确认页 3 秒门禁 + 须知无内层滚动 + 底部吸附条;Fork 后本机 `projects/gameagent-*` 的 `.agent/fork-source.json`(v2、`source: package`)、`game/dist/index.html`、无 `reference/`、`code-prototype=completed`、`versions=[initial-1]`;**运行视图可用**(无「首个可运行原型尚未完成」空态、运行表现层 + 预览 iframe) | ✅ 已覆盖 |
|
||||
| **真实 AGC 客户端里点一遍**:共创列表 → 开始共创确认 → 取件校验 → 生成工程(写 `.agent/fork-source.json`)→ **运行可用** | **已自动化(2026-10-07)**:Tauri + WebView2 通过 CDP 附着真实客户端(客户端启动时带 `--remote-debugging-port=9222`,见 `~/.config/genarrative/.env` 的 `WEBVIEW2_ADDITIONAL_BROWSER_ARGUMENTS`;探活 `curl --noproxy '*' http://127.0.0.1:9222/json/version` 应回 `Edg/…`) | `scripts/check-agc-co-creation-fork-e2e.mjs`(19 项,npm script `check:agc-co-creation-fork-e2e`):共创列表滚到底且无「直接 Fork 指定作品」输入块;确认页 3 秒门禁 + 须知无内层滚动 + 底部吸附条;Fork 后本机 `projects/gameagent-*` 的 `.agent/fork-source.json`(v2、`source: package`)、`game/dist/index.html`、无 `reference/`、`code-prototype=completed`、`versions=[initial-1]`;**运行视图可用**(无「首个可运行原型尚未完成」空态、运行表现层 + 预览 iframe) | ✅ 已覆盖 |
|
||||
| 客户端里**发布**新作品(上传发行包 → 送审 → 管理员审核 → 平台看到新节点/血缘) | 未自动化:客户端发布面板需要人工填「本次核心改动说明」等 | 平台侧同一段由 本地夹具脚本(族谱/血缘) 的发布链路 + 血缘断言覆盖 | ⏳ 待补 |
|
||||
| 窄屏三档(360 / 390 / 414)移动端形态 | 真实浏览器 | `scripts/capture-game-lineage-visual.mjs` 的 `E2E_CAPTURE_NARROW_WIDTHS=360,390,414`:深链进 `/games/lineage` **不再被「移动端仅支持作品展示」弹窗盖住**、默认大纲式缩进树(行高 ≥44、有导线与层级缩进)、长标题不横向溢出、点节点弹底部 sheet 且可关闭、选中后当前面包屑已被滚进视口 | ✅ 已覆盖(另见下方两条未修问题) |
|
||||
| 演示数据与视觉基线(供需求方验收) | 幂等灌数据 + 截图工具 | 本地演示数据灌装脚本(标题前缀 `共创演示·`,**判重不绑账号**:先查公开目录同标题再查本人 `my-games`;13 节点 / 3 棵树 / 4 作者 / 最大 3 代 / 13 张不同封面)、`scripts/capture-game-lineage-visual.mjs`(`E2E_CAPTURE_LINEAGE_URL` 开启「只截现有作品」模式) | ✅ 已覆盖 |
|
||||
@@ -1074,7 +1076,7 @@ procedure 另要求**受信服务身份**(归属判定靠 `owner_user_id`,
|
||||
| 移动端切「图谱视图」(横向画布)**不会初始定位到当前作品** | 修复前 390 宽实测:`zoom=100%`、`transform: matrix(1,0,0,1,0,0)`,画布可视区 `x 37–353`,当前作品节点头部 `x 457–633` → 0/8 节点可见。修复 `ec8f27cb2`(横版画布 + 进入时按宽度适配并定位当前作品)。复验(360/390/414 三档):`zoom=35%`、当前作品在画布内、可见节点 **7/8(360、390)/ 8/8(414)** | ✅ 已修并复验 |
|
||||
| (遗留备注)窄屏图谱视图里点卡片会跳详情 | 窄屏紧凑卡片整块是「打开详情」按钮,没有可锁定区域 → 信息面板/面包屑的窄屏验证改由**大纲形态**做(点行弹底部 sheet、面包屑出现并被滚进视口,三档均 PASS)。不是缺陷,但窄屏画布下确实没有「锁定」入口 | 📝 记录 |
|
||||
|
||||
### 5.7 AGC 客户端共创页 / Fork 确认页与外壳滚动链(2026-10-07)实施证据
|
||||
### 5.7 AGC 客户端共创页 / 「开始共创」确认页与外壳滚动链(2026-10-07)实施证据
|
||||
|
||||
| 项 | 证据 | 状态 |
|
||||
| --- | --- | --- |
|
||||
@@ -1087,7 +1089,7 @@ procedure 另要求**受信服务身份**(归属判定靠 `owner_user_id`,
|
||||
| 改动清单(提交) | 外壳滚动链 `501fd0925`(`styles.css` + `tests/launcherScrollContract.test.ts`);共创列表页与版式令牌 `2010c1382`(`view/co-creation`、`platformForkCatalog`、`platformGameForkModel`、`forkPageStyles` + 用例);确认页与发布面板 `caf7db4ba`(`view/fork-confirm`、`GameDistributionPublishPanel` + 用例) | ✅ 已提交 |
|
||||
| 真实浏览器(本次核验方式) | 一次性夹具把两页挂进与 `WindowChrome` 同构的外壳(`#root` → `.window-chrome__content` → `main.launcher-shell > aside + section.launcher-main`),真实 `styles.css` + Vite;在 1440×900 / 1000×620 / 800×600 三档量逐层计算值、滚到底后末项与页脚可见性、横向溢出;夹具用完即删(`git status` 干净) | ✅ 已验证 |
|
||||
|
||||
### 5.8 Fork 建项收口:可运行原型与初始工程版本(2026-10-07)实施证据
|
||||
### 5.8 Fork 建项收口(对外动作名「开始共创」):可运行原型与初始工程版本(2026-10-07)实施证据
|
||||
|
||||
**背景(实物证据)**:一次真实 Fork(`%APPDATA%/world.genarrative.ai-game-creator/projects/gameagent-a74aa1d9`,2026-10-06 15:27:58,`.agent/fork-source.json` = `source: package`)建出来的项目,manifest 里 **16 个 seed 任务全 `pending`(含 `code-prototype`)、没有 `versions[]`、没有 `preview`**,父作品那套可玩产物被解到 `reference/<gameId>/`(**不在预览根**)。于是运行页签命中 `run-unavailable-hint`「首个可运行原型尚未完成,运行视图暂不可用」且点击无反应;发布也被同一判据拦下。根因是 Fork 建项**没有**像 AI 直连回合收口那样登记「可运行原型」与工程内部版本,且可玩内容放错了位置。
|
||||
|
||||
@@ -1105,6 +1107,17 @@ procedure 另要求**受信服务身份**(归属判定靠 `owner_user_id`,
|
||||
|
||||
---
|
||||
|
||||
### 5.9 AGC 客户端动作名统一为「开始共创」(2026-10-07)实施证据
|
||||
|
||||
| 项 | 证据 | 状态 |
|
||||
| --- | --- | --- |
|
||||
| 改动清单(提交) | `78b6ac5a8`(15 文件:AGC 用户可见文案 + 用例) | ✅ 已提交 |
|
||||
| 渲染层文案(TS) | 卡片按钮(+ `aria-label`「开始共创《标题》」)、确认页标题 / 副标题 / 空态 / 页脚 `aria-label` / 进行中按钮、须知正文、成功通知、发布面板授权告知(`view/co-creation`、`view/fork-confirm`、`forkNotice.ts`、`usePlatformFork.ts`、`GameDistributionPublishFormView.tsx`) | ✅ 已改 |
|
||||
| 原生文案(Rust) | 取件错误(读取 / 下载 / 校验 / 解压 / 大小 / 来源 ID / 响应形状)、深链解析提示、「请先选择要开始共创的平台作品」、默认项目名「共创项目」(`game_distribution_publish.rs` / `game_fork.rs` / `game_fork/desktop.rs`) | ✅ 已改 |
|
||||
| 内部标识未动 | Tauri 命令 `create_local_project_from_platform_game`、`.agent/fork-source.json`、scheme `genarrative://fork`、`ForkConfirmView` 等组件 / 模块名、Rust 类型与字段、埋点枚举、测试名里的内部术语 | ✅ 刻意不改 |
|
||||
| 用例 | `coCreation.test.tsx`(卡片按钮可见文案与无障碍名同一套词、页面根文本不含 `Fork`)、`forkConfirm.test.tsx`(新增「用户可见文案统一叫「开始共创」,不出现 Fork 动作名」——只检查声明出来的可见节点,不做全页 `not.toContain('Fork')`)、`platformGameForkModel.test.ts`、`gameDistributionPublishForm.test.tsx`、appSurface 两个 suite | ✅ 已验证 |
|
||||
| 门禁(AGC 本工作树自跑) | `tsc` 两套 0;AGC vitest 目标文件全绿(含 appSurface 217 passed / 9 skipped);全量套件另有 11 条**与本改动无关的既有失败**(已用 stash 复验归属);`npx eslint . --ext .ts,.tsx,.js,.mjs,.cjs --max-warnings 0` 0;`npm run check:encoding` 0;`git diff --check` 0;`cargo check --tests` 0;`cargo fmt -- --check` 0;隔离 `CARGO_TARGET_DIR` 跑 `cargo test -- fork deep_link` **17 passed** | ✅ 已验证 |
|
||||
|
||||
## 6. 里程碑拆分(评审后逐个开实施计划)
|
||||
|
||||
| 里程碑 | 范围 | 交付判据 |
|
||||
|
||||
Reference in New Issue
Block a user