Merge branch 'master' of http://82.157.175.59:3000/GenarrativeAI/Genarrative
Some checks failed
CI / verify (push) Has been cancelled
Some checks failed
CI / verify (push) Has been cancelled
This commit is contained in:
@@ -0,0 +1,27 @@
|
|||||||
|
# 抓大鹅创作入口敬请期待 2026-05-01
|
||||||
|
|
||||||
|
## 1. 背景
|
||||||
|
|
||||||
|
抓大鹅 Match3D 玩法域已存在创作工作区、结果承接和后续后端接入文档,但当前产品节奏需要先收起创作页入口,避免玩家从创作页直接进入未完全开放的抓大鹅创作链路。
|
||||||
|
|
||||||
|
## 2. 落地边界
|
||||||
|
|
||||||
|
本轮只调整平台创作入口展示与点击防线:
|
||||||
|
|
||||||
|
1. `PLATFORM_CREATION_TYPES` 中 `match3d` 保持展示,标题仍为 `抓大鹅`。
|
||||||
|
2. `match3d` 的副标题与 badge 统一显示 `敬请期待`。
|
||||||
|
3. `match3d.locked` 设为 `true`,创作页首屏卡片和创作类型弹层都会变为不可点击。
|
||||||
|
4. 平台分流回调继续保留 `match3d` 防御返回,避免旧 UI 状态或旧入口绕过锁定态。
|
||||||
|
|
||||||
|
## 3. 非目标
|
||||||
|
|
||||||
|
1. 不删除 `src/components/match3d-creation/`、`src/services/match3d-creation/` 或已完成的 Match3D 玩法域代码。
|
||||||
|
2. 不修改 SpacetimeDB 表、procedure、bindings 或 `migration.rs`。
|
||||||
|
3. 不改变已发布抓大鹅作品的详情、运行态和后续恢复入口能力。
|
||||||
|
|
||||||
|
## 4. 验收点
|
||||||
|
|
||||||
|
1. 创作页能看到 `抓大鹅` 卡片。
|
||||||
|
2. 该卡片显示 `敬请期待`,且按钮 disabled。
|
||||||
|
3. 创作类型弹层中的 `抓大鹅` 同样显示 `敬请期待`,且不可点击。
|
||||||
|
4. 相关测试、类型检查和编码检查通过。
|
||||||
@@ -13,6 +13,7 @@
|
|||||||
- [MATCH3D_F1_CREATION_ENTRY_AND_AGENT_UI_2026-04-30.md](./MATCH3D_F1_CREATION_ENTRY_AND_AGENT_UI_2026-04-30.md):记录抓大鹅 F1 创作入口、Agent 工作区、参考图入口、本地 mock client 与后续 B5 HTTP facade 替换点。
|
- [MATCH3D_F1_CREATION_ENTRY_AND_AGENT_UI_2026-04-30.md](./MATCH3D_F1_CREATION_ENTRY_AND_AGENT_UI_2026-04-30.md):记录抓大鹅 F1 创作入口、Agent 工作区、参考图入口、本地 mock client 与后续 B5 HTTP facade 替换点。
|
||||||
- [MATCH3D_F2_RESULT_AND_PUBLISH_2026-04-30.md](./MATCH3D_F2_RESULT_AND_PUBLISH_2026-04-30.md):冻结抓大鹅 F2 结果页、基础信息编辑、发布前试玩入口、发布门槛、自动保存和已发布作品二次编辑恢复口径。
|
- [MATCH3D_F2_RESULT_AND_PUBLISH_2026-04-30.md](./MATCH3D_F2_RESULT_AND_PUBLISH_2026-04-30.md):冻结抓大鹅 F2 结果页、基础信息编辑、发布前试玩入口、发布门槛、自动保存和已发布作品二次编辑恢复口径。
|
||||||
- [MATCH3D_SPACETIME_CLIENT_AND_API_FACADE_2026-04-30.md](./MATCH3D_SPACETIME_CLIENT_AND_API_FACADE_2026-04-30.md):记录抓大鹅 B4+B5 已落地的 SpacetimeDB bindings、`spacetime-client` facade、`api-server` HTTP 路由、shared contract 对齐和验收命令。
|
- [MATCH3D_SPACETIME_CLIENT_AND_API_FACADE_2026-04-30.md](./MATCH3D_SPACETIME_CLIENT_AND_API_FACADE_2026-04-30.md):记录抓大鹅 B4+B5 已落地的 SpacetimeDB bindings、`spacetime-client` facade、`api-server` HTTP 路由、shared contract 对齐和验收命令。
|
||||||
|
- [MATCH3D_CREATION_ENTRY_COMING_SOON_2026-05-01.md](./MATCH3D_CREATION_ENTRY_COMING_SOON_2026-05-01.md):记录抓大鹅创作页入口临时改为“敬请期待”、不可点击,以及保留既有 Match3D 能力不删除的边界。
|
||||||
- [PLATFORM_MOBILE_BOTTOM_DOCK_VIEWPORT_FIX_2026-04-30.md](./PLATFORM_MOBILE_BOTTOM_DOCK_VIEWPORT_FIX_2026-04-30.md):记录平台首页底部 dock 在手机浏览器地址栏展开时脱离可见区域的根因,以及 `100dvh`、固定底部锚点和安全区占位的修复口径。
|
- [PLATFORM_MOBILE_BOTTOM_DOCK_VIEWPORT_FIX_2026-04-30.md](./PLATFORM_MOBILE_BOTTOM_DOCK_VIEWPORT_FIX_2026-04-30.md):记录平台首页底部 dock 在手机浏览器地址栏展开时脱离可见区域的根因,以及 `100dvh`、固定底部锚点和安全区占位的修复口径。
|
||||||
- [SPACETIMEDB_JSON_STRING_MIGRATION_PROCEDURE_2026-04-27.md](./SPACETIMEDB_JSON_STRING_MIGRATION_PROCEDURE_2026-04-27.md):记录 SpacetimeDB private 表迁移 JSON 导出/导入 procedure、迁移操作员授权、HTTP 413 分片导入、Jenkins 自动迁移回灌和导入脚本参数。
|
- [SPACETIMEDB_JSON_STRING_MIGRATION_PROCEDURE_2026-04-27.md](./SPACETIMEDB_JSON_STRING_MIGRATION_PROCEDURE_2026-04-27.md):记录 SpacetimeDB private 表迁移 JSON 导出/导入 procedure、迁移操作员授权、HTTP 413 分片导入、Jenkins 自动迁移回灌和导入脚本参数。
|
||||||
- [JENKINS_SPACETIMEDB_DATABASE_MIGRATION_PIPELINES_2026-04-29.md](./JENKINS_SPACETIMEDB_DATABASE_MIGRATION_PIPELINES_2026-04-29.md):记录 `Genarrative-Database-Export` / `Genarrative-Database-Import` 两条 SCM-backed 数据库迁移流水线参数、默认 dry-run、token 边界和 `CHUNK_SIZE` 413 规避参数。
|
- [JENKINS_SPACETIMEDB_DATABASE_MIGRATION_PIPELINES_2026-04-29.md](./JENKINS_SPACETIMEDB_DATABASE_MIGRATION_PIPELINES_2026-04-29.md):记录 `Genarrative-Database-Export` / `Genarrative-Database-Import` 两条 SCM-backed 数据库迁移流水线参数、默认 dry-run、token 边界和 `CHUNK_SIZE` 413 规避参数。
|
||||||
|
|||||||
@@ -106,12 +106,17 @@ test('creation hub reflects updated draft title summary and counts after rerende
|
|||||||
expect(screen.queryByText('地点 4')).toBeNull();
|
expect(screen.queryByText('地点 4')).toBeNull();
|
||||||
const rpgButton = screen.getByRole('button', { name: /角色扮演/u });
|
const rpgButton = screen.getByRole('button', { name: /角色扮演/u });
|
||||||
const puzzleButton = screen.getByRole('button', { name: /拼图.*创意礼物/u });
|
const puzzleButton = screen.getByRole('button', { name: /拼图.*创意礼物/u });
|
||||||
|
const match3dButton = screen.getByRole('button', { name: /抓大鹅/u });
|
||||||
expect(
|
expect(
|
||||||
puzzleButton.compareDocumentPosition(rpgButton) &
|
puzzleButton.compareDocumentPosition(rpgButton) &
|
||||||
Node.DOCUMENT_POSITION_FOLLOWING,
|
Node.DOCUMENT_POSITION_FOLLOWING,
|
||||||
).toBeTruthy();
|
).toBeTruthy();
|
||||||
expect((rpgButton as HTMLButtonElement).disabled).toBe(true);
|
expect((rpgButton as HTMLButtonElement).disabled).toBe(true);
|
||||||
expect(within(rpgButton).getAllByText('敬请期待').length).toBeGreaterThan(0);
|
expect(within(rpgButton).getAllByText('敬请期待').length).toBeGreaterThan(0);
|
||||||
|
expect((match3dButton as HTMLButtonElement).disabled).toBe(true);
|
||||||
|
expect(
|
||||||
|
within(match3dButton).getAllByText('敬请期待').length,
|
||||||
|
).toBeGreaterThan(0);
|
||||||
expect(puzzleButton).toBeTruthy();
|
expect(puzzleButton).toBeTruthy();
|
||||||
expect(screen.queryByRole('button', { name: /大鱼吃小鱼/u })).toBeNull();
|
expect(screen.queryByRole('button', { name: /大鱼吃小鱼/u })).toBeNull();
|
||||||
|
|
||||||
|
|||||||
@@ -1645,7 +1645,12 @@ export function PlatformEntryFlowShellImpl({
|
|||||||
|
|
||||||
const handleCreationHubCreateType = useCallback(
|
const handleCreationHubCreateType = useCallback(
|
||||||
(type: PlatformCreationTypeId) => {
|
(type: PlatformCreationTypeId) => {
|
||||||
if (type === 'rpg' || type === 'airp' || type === 'visual-novel') {
|
if (
|
||||||
|
type === 'rpg' ||
|
||||||
|
type === 'match3d' ||
|
||||||
|
type === 'airp' ||
|
||||||
|
type === 'visual-novel'
|
||||||
|
) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1660,13 +1665,6 @@ export function PlatformEntryFlowShellImpl({
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (type === 'match3d') {
|
|
||||||
runProtectedAction(() => {
|
|
||||||
void openMatch3DAgentWorkspace();
|
|
||||||
});
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (type === 'puzzle') {
|
if (type === 'puzzle') {
|
||||||
runProtectedAction(() => {
|
runProtectedAction(() => {
|
||||||
void openPuzzleAgentWorkspace();
|
void openPuzzleAgentWorkspace();
|
||||||
@@ -1675,7 +1673,6 @@ export function PlatformEntryFlowShellImpl({
|
|||||||
},
|
},
|
||||||
[
|
[
|
||||||
openBigFishAgentWorkspace,
|
openBigFishAgentWorkspace,
|
||||||
openMatch3DAgentWorkspace,
|
|
||||||
openPuzzleAgentWorkspace,
|
openPuzzleAgentWorkspace,
|
||||||
prepareCreationLaunch,
|
prepareCreationLaunch,
|
||||||
runProtectedAction,
|
runProtectedAction,
|
||||||
@@ -4560,9 +4557,7 @@ export function PlatformEntryFlowShellImpl({
|
|||||||
});
|
});
|
||||||
}}
|
}}
|
||||||
onSelectMatch3D={() => {
|
onSelectMatch3D={() => {
|
||||||
runProtectedAction(() => {
|
// 抓大鹅创作入口当前为敬请期待;保留回调防御,避免旧入口绕过锁定态。
|
||||||
void openMatch3DAgentWorkspace();
|
|
||||||
});
|
|
||||||
}}
|
}}
|
||||||
onSelectPuzzle={() => {
|
onSelectPuzzle={() => {
|
||||||
runProtectedAction(() => {
|
runProtectedAction(() => {
|
||||||
|
|||||||
@@ -68,9 +68,9 @@ export const PLATFORM_CREATION_TYPES: PlatformCreationTypeCard[] = [
|
|||||||
{
|
{
|
||||||
id: 'match3d',
|
id: 'match3d',
|
||||||
title: '抓大鹅',
|
title: '抓大鹅',
|
||||||
subtitle: '经典消除玩法',
|
subtitle: '敬请期待',
|
||||||
badge: '可创建',
|
badge: '敬请期待',
|
||||||
locked: false,
|
locked: true,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: 'airp',
|
id: 'airp',
|
||||||
|
|||||||
Reference in New Issue
Block a user