38 KiB
当前创作流程链路前后端脚本重构执行方案
更新时间:2026-04-21
0. 文档目标
本文件只服务一件事:
把当前“创作入口 -> Agent 会话 -> 世界底稿 -> 结果页编辑 -> 自动保存 -> 作品库 -> 进入世界”这条链路上的前后端脚本,整理成一份可以直接指导后续编码拆分的执行方案。
本轮不直接改业务逻辑,只明确:
- 当前链路上的真实脚本地图
- 当前可读性差、可扩展性差的结构性问题
- 目标分层与真相源边界
- 文件级拆分建议
- 分阶段落地计划与验收标准
1. 范围与依据
1.1 本文覆盖的创作链路
平台创作入口
-> Agent session 创建 / 恢复
-> Agent 对话与 action 执行
-> foundation draft 生成
-> 角色图 / 地点图 / 分幕图 / 动作资产生成与同步
-> 结果页编辑
-> 自动保存到作品库
-> works 聚合展示 / 恢复创作
-> 进入游戏世界
1.2 本文主要依据
docs/audits/AGENT_TO_DRAFT_TO_WORLD_PIPELINE_AUDIT_2026-04-20.mddocs/technical/AGENT_RESULT_PROFILE_SYNC_PHASE1_2026-04-20.mddocs/technical/AGENT_RESULT_PROFILE_SYNC_PHASE2_2026-04-20.mddocs/technical/AGENT_RESULT_PROFILE_SYNC_PHASE3_2026-04-20.mddocs/audits/engineering/FRONTEND_LOGIC_BACKEND_MIGRATION_AUDIT_2026-04-21.mddocs/technical/CURRENT_AGENT_CREATION_FLOW_STAGE4_CLEANUP_CHECK_2026-04-21.mddocs/technical/AGENT_DRAFT_RESULT_AUTOSAVE_DB_CHECK_2026-04-21.md
2. 当前链路脚本地图
2.1 前端主链脚本
| 文件 | 当前职责 | 当前问题 |
|---|---|---|
src/components/game-shell/PreGameSelectionFlow.tsx |
平台 tab、详情页、创作入口、Agent session 创建与恢复、operation 轮询、结果页自动保存、session 同步、进入世界前同步、works/library/gallery/history/save 拉取 | 单文件承载过多流程编排,页面壳层、状态机、网络请求、自动保存和世界进入逻辑混在一起,是当前前端最大热点 |
src/components/custom-world-home/CustomWorldCreationHub.tsx |
创作中心 works 展示、继续创作、草稿与已发布作品入口 | 读模型已经存在,但与平台壳层仍有状态耦合,入口职责还没有完全收口 |
src/components/CustomWorldResultView.tsx |
结果页预览、结果页内生成角色/地点、结果页内触发编辑、资产调试面板 | 结果页同时是预览层、编辑层、生成层,仍保留 legacy profile 直改能力 |
src/components/CustomWorldEntityEditorModal.tsx |
世界、封面、营地、角色、地点等多种对象编辑,以及部分资产与运行时预览能力 | 单文件过大,编辑表单、资产工作流、运行时预览混合,后续很难局部扩展 |
src/components/CustomWorldRoleAssetStudioModal.tsx |
角色主图候选、动作生成、动作发布、缓存读写 | 视觉生成、动作生成、缓存、发布四类职责耦合在一个模态层里 |
src/services/customWorldAgentDraftResult.ts |
Agent session draftProfile -> legacy CustomWorldProfile 的桥接编译与资产合并 |
前端承担了结构化编译责任,是“前端只做表现”边界下最应继续收缩的兼容层 |
src/services/aiService.ts |
Agent session、消息流、operation、旧 custom world 相关请求、若干结果页生成动作 | custom world 相关 API 与 story/chat/legacy AI 接口混放,不利于链路收口 |
src/services/storageService.ts |
works、library、gallery、browse history、save archive、profile dashboard | custom world 作品链 API 与通用 runtime 存储 API 混放,边界不清晰 |
2.2 后端主链脚本
| 文件 | 当前职责 | 当前问题 |
|---|---|---|
packages/shared/src/contracts/customWorldAgent.ts |
session、message、draft、asset、works、action、operation 契约 | 契约体量过大,action 定义与后端真实执行能力存在漂移 |
server-node/src/routes/customWorldAgent.ts |
Agent session 与 action 路由入口 | 应继续保持薄路由,但当前下游编排层过重,路由可读性受限 |
server-node/src/routes/runtimeRoutes.ts |
works、library、gallery、runtime 相关通用路由 | custom world 作品链路仍混在 runtime 大路由里,不利于独立演进 |
server-node/src/services/customWorldAgentOrchestrator.ts |
session 生命周期、消息处理、action 分发、result sync、派生状态拼装、suggested actions、质量状态拼装 | 当前后端最大热点之一,承担了过多业务分支和字段同步细节 |
server-node/src/services/customWorldAgentSessionStore.ts |
session 创建、读写、兼容旧结构补齐、snapshot 输出 | store、兼容转换、session factory 三类职责还没有拆开 |
server-node/src/services/customWorldAgentFoundationDraftService.ts |
eight-anchor / intent -> foundation draft;内部依赖 runtime profile 编译再转回 draft | 存在“先编 legacy runtime profile,再转回 foundation draft”的双重编译 |
server-node/src/modules/custom-world/runtimeProfile.ts |
custom world runtime profile 规范化、构建、编译、属性 schema、场景章节处理 | 文件过大,normalize/build/schema/scene/role 等职责全部堆在一起 |
server-node/src/repositories/runtimeRepository.ts |
save/settings/custom world profiles/custom world sessions/browse history 等仓储 | 仓储按技术分组,不按领域分组;custom world 相关方法和通用 runtime 方法耦合 |
server-node/src/services/customWorldWorkSummaryService.ts |
聚合 Agent 草稿与已发布 profile,生成 works 读模型 | 汇总逻辑、展示语义、metadata 回退混在一起,适合作为独立 read model 层继续收口 |
2.3 当前链路上的次级执行模块
以下脚本不是主入口,但属于链路中的重要执行点,后续重构不能绕开:
server-node/src/services/customWorldAgentEntityGenerationService.tsserver-node/src/services/customWorldAgentAutoAssetService.tsserver-node/src/services/customWorldAgentAssetBridgeService.tsserver-node/src/services/customWorldAgentDraftCompiler.tsserver-node/src/services/customWorldAgentRoleAssetStateService.ts
这些模块后续要继续明确边界:
- 生成型 service 只负责生成结果
- bridge / sync 型 service 只负责把已确认结果写回 session
- snapshot / read model 型 service 只负责组织前端展示数据
3. 当前结构性问题
3.1 前端壳层承担了过多编排责任
PreGameSelectionFlow.tsx 当前既是平台页面壳层,又是创作流程控制器,还同时负责:
- Agent session 创建与恢复
- operation 轮询
- works、gallery、history、save、dashboard 拉取
- 结果页自动保存
- 结果页改动同步回 session
- 进入世界前同步
这会导致:
- 页面组件一改就容易碰到主链数据流
- 自动保存与页面切换耦合过紧
- 后续任何新增 action 都会继续堆进壳层文件
3.2 前端仍在承担结果 profile 编译责任
buildCustomWorldProfileFromAgentDraft() 仍是当前 session draft -> result profile 的关键桥接点。
这意味着:
- Agent session 不是最终唯一真相源
- 前端在裁决字段取舍、默认值、资产合并
- 自动保存和进入世界依赖的是前端重编译结果,而不是服务端正式输出
这与“前端只做表现,逻辑和数据收回 Express 后端”的项目约束不一致。
3.3 结果页仍是 legacy 编辑器兼容工作台
CustomWorldResultView.tsx、CustomWorldEntityEditorModal.tsx、CustomWorldRoleAssetStudioModal.tsx 当前仍然存在:
- 直接改 legacy
CustomWorldProfile - 直接调用 legacy 生成接口补角色、地点
- 资产工坊直接处理缓存、候选、发布
结果页就不只是“预览 / 发布前收口层”,而是独立并行编辑器。
3.4 后端编排层和编译层都过重
customWorldAgentOrchestrator.ts 与 runtimeProfile.ts 是当前两个最明显的大文件热点:
- 一个同时承担 message orchestration、action dispatch、result sync、snapshot 拼装
- 一个同时承担 runtime normalize、schema build、scene chapter compile、role build
结果是:
- 新增 action 成本高
- 新增字段时容易遗漏多个分支
- 单测很难精准覆盖局部职责
3.5 works、library、publish、enter world 仍没有完全收成单一路径
当前仍然是:
- Agent session 草稿链
- 已保存 profile 链
- 结果页 legacy profile 直改链
- works 聚合读模型链
多条 pipeline 并存会继续放大桥接层复杂度。
4. 目标分层架构
4.1 目标原则
后续重构必须统一遵守 5 条原则:
- Agent session 是创作态唯一真相源。
- 服务端编译结果预览是结果页唯一数据来源。
- published profile 是进入世界与作品库持久化的正式真相。
- 前端只保留展示状态、交互状态、表单草稿态,不再承担结构化编译。
- action 能力由后端注册表统一声明,前端不再假设 contract 中定义的 action 一定真实可用。
4.2 目标链路
前端平台壳层
-> custom world 专属 client
-> Agent route / works route / library route
-> session application service
-> action registry
-> foundation / entity / asset / publish domain services
-> session store / custom world repository
-> 服务端 result preview compiler
-> 前端结果页展示与编辑
-> 服务端 autosave / publish / enter-world gate
4.3 三类真相源
后续必须严格区分三类数据:
| 数据 | 真相位置 | 用途 |
|---|---|---|
| 创作态 session | Agent session store | 对话、草稿、锁定、suggested actions、asset 覆盖率、阶段状态 |
| 结果页预览态 result preview | 服务端 preview compiler 输出 | 结果页展示、结果页局部编辑回填、自动保存前比对 |
| 已发布世界 profile | custom world profile repository | 作品库、发布态、进入世界、对外展示 |
前端不再把 draftProfile -> runtime profile 编译结果视为正式真相,只能把它视为临时兼容输出,且这条兼容层要持续收缩。
4.4 RPG 创作流程脚本命名规范
这套创作流程只服务 RPG 类型游戏,后续命名不能继续沿用过于泛化的 customWorld、runtime、flow 混搭口径,而应把“RPG 创作域”显式写进命名里。
命名目标
- 让人一眼看出这是 RPG 世界创作链,不是通用世界编辑器。
- 让文件名能直接表达层级:页面壳层、工作流、应用服务、编译器、仓储、读模型。
- 避免继续出现“同一文件名里既有业务域又有历史兼容语义”的情况。
推荐命名根
后续新建或重命名文件时,优先使用下面 3 类命名根:
rpgCreation:用于前端创作流程壳层、workflow、client、view modelrpgWorld:用于后端世界草稿、世界预览、世界发布、世界仓储rpgAgent:用于 Agent session、message turn、action executor、snapshot
命名规则
- 前端组件文件使用
RpgCreation前缀。 - 前端 hooks / workflow 文件使用
useRpgCreation前缀。 - 前端 client / adapter / mapper 文件使用
rpgCreation前缀。 - 后端应用服务文件使用
RpgAgent或RpgWorld前缀。 - 后端仓储文件使用
RpgWorld...Repository或RpgAgent...Repository。 - 共享契约文件使用
rpgCreation...或rpgAgent...小驼峰命名。 - 禁止再新增过于泛化的
customWorld*Service.ts、customWorld*Flow.tsx作为新主命名。
文件命名示例
前端示例
src/components/game-shell/rpg-creation-flow/RpgCreationShell.tsxsrc/components/game-shell/rpg-creation-flow/useRpgCreationPlatformBootstrap.tssrc/components/game-shell/rpg-creation-flow/useRpgCreationSessionController.tssrc/components/rpg-creation-result/RpgCreationResultView.tsxsrc/components/rpg-creation-editor/RpgCreationRoleEditorSection.tsxsrc/services/rpg-creation/rpgCreationAgentClient.tssrc/services/rpg-creation/rpgCreationPreviewAdapter.ts
后端示例
server-node/src/routes/rpgCreationAgentRoutes.tsserver-node/src/routes/rpgWorldLibraryRoutes.tsserver-node/src/services/RpgAgentOrchestrator.tsserver-node/src/services/RpgAgentActionRegistry.tsserver-node/src/services/RpgWorldPreviewCompiler.tsserver-node/src/repositories/RpgWorldProfileRepository.tsserver-node/src/repositories/RpgAgentSessionRepository.ts
共享契约示例
packages/shared/src/contracts/rpgAgentSession.tspackages/shared/src/contracts/rpgAgentActions.tspackages/shared/src/contracts/rpgCreationPreview.tspackages/shared/src/contracts/rpgCreationWorkSummary.ts
兼容期命名策略
因为当前主链已有大量 customWorld* 文件,重构期间采用“两段式迁移”:
- 第一阶段先新增按规范命名的新目录和 façade。
- 第二阶段再把旧
customWorld*文件逐步迁到rpgCreation* / rpgWorld* / rpgAgent*命名。
命名禁忌
后续重构中禁止继续出现以下命名问题:
- 一个文件名同时表达多个层级,例如
FlowServiceController。 - 用
runtime指代创作态脚本。 - 用
customWorld指代实际上只服务 RPG 创作链的新模块。 - 用
Helper、Utils、Manager作为主业务模块名。
5. 前端重构拆分方案
5.1 PreGameSelectionFlow.tsx 拆分方案
现状问题
当前文件同时承担“平台壳层 + 数据加载器 + 创作流程控制器 + 自动保存协调器 + 世界进入协调器”五类职责。
目标拆分
保留 PreGameSelectionFlow.tsx 作为页面壳层,只负责:
- stage 切换
- 组件装配
- 视觉级 loading / error 展示
从该文件中拆出以下模块:
src/components/game-shell/custom-world-flow/useCustomWorldPlatformBootstrap.tssrc/components/game-shell/custom-world-flow/useCustomWorldWorkEntries.tssrc/components/game-shell/custom-world-flow/useCustomWorldAgentSessionController.tssrc/components/game-shell/custom-world-flow/useCustomWorldAgentOperationPolling.tssrc/components/game-shell/custom-world-flow/useCustomWorldResultAutosave.tssrc/components/game-shell/custom-world-flow/useCustomWorldEnterWorld.tssrc/components/game-shell/custom-world-flow/useCustomWorldDetailNavigation.ts
编码要求
- 壳层文件内不再直接拼接 route path。
- 壳层文件内不再直接包含自动保存防抖实现。
- 壳层文件内不再直接包含 session -> result profile 编译细节。
- 壳层文件内不再直接处理 works/library/history/save 的多路请求编排。
5.2 custom world 专属 client 拆分方案
现状问题
aiService.ts 和 storageService.ts 中 custom world 相关接口已经比较多,继续堆在通用 service 里会加重跨域耦合。
目标拆分
新增 custom world 专属 client 目录:
src/services/custom-world/customWorldAgentClient.tssrc/services/custom-world/customWorldWorkClient.tssrc/services/custom-world/customWorldLibraryClient.tssrc/services/custom-world/customWorldAssetClient.ts
保留边界
aiService.ts只保留 story/chat/通用 AI 能力。storageService.ts只保留 save/settings/profile dashboard 等通用 runtime 存储。- custom world 相关请求全部从通用 service 中迁出后,旧导出保留一个阶段的兼容别名,再统一删除。
5.3 CustomWorldResultView.tsx 拆分方案
现状问题
该文件同时承担结果概览、实体目录、结果页动作、局部生成动作和调试面板。
目标拆分
保留 CustomWorldResultView.tsx 作为结果页组合壳层,并拆出:
src/components/custom-world-result/CustomWorldResultHeader.tsxsrc/components/custom-world-result/CustomWorldResultActionBar.tsxsrc/components/custom-world-result/CustomWorldResultEntitySection.tsxsrc/components/custom-world-result/CustomWorldAssetCoveragePanel.tsxsrc/components/custom-world-result/CustomWorldAssetDebugPanel.tsxsrc/components/custom-world-result/useCustomWorldResultActions.ts
边界要求
- 结果页只调用 custom world 专属 client。
- 结果页不再直接依赖 legacy 生成函数作为长期主链能力。
- 调试面板与正式结果页逻辑隔离,避免调试代码继续污染主流程组件。
5.4 CustomWorldEntityEditorModal.tsx 拆分方案
现状问题
该文件把 world / cover / camp / role / landmark / chapter 编辑全部放在一个文件里,且还混入运行时预览与资产工作流。
目标拆分
保留 modal 壳层,拆出:
src/components/custom-world-editor/CustomWorldWorldEditorSection.tsxsrc/components/custom-world-editor/CustomWorldCoverEditorSection.tsxsrc/components/custom-world-editor/CustomWorldCampEditorSection.tsxsrc/components/custom-world-editor/CustomWorldRoleEditorSection.tsxsrc/components/custom-world-editor/CustomWorldLandmarkEditorSection.tsxsrc/components/custom-world-editor/CustomWorldSceneChapterEditorSection.tsxsrc/components/custom-world-editor/customWorldResultFormMapper.ts
边界要求
- 编辑 section 只负责表单表现。
- 提交 patch、差异比较、字段清洗都收口到独立 mapper / mutation 层。
- 运行时预览和战斗预览不继续堆在结果编辑主链文件里。
5.5 CustomWorldRoleAssetStudioModal.tsx 拆分方案
现状问题
角色图候选、动作模板、动作生成、缓存恢复、结果发布都在一个文件里,后续加“场景资产工坊”时会继续复制相同问题。
目标拆分
建议拆为:
src/components/custom-world-asset-studio/useRoleVisualCandidateWorkflow.tssrc/components/custom-world-asset-studio/useRoleAnimationWorkflow.tssrc/components/custom-world-asset-studio/roleAssetStudioModel.tssrc/components/custom-world-asset-studio/roleAssetStudioPublishClient.tssrc/components/custom-world-asset-studio/CustomWorldRoleAssetStudioModal.tsx
边界要求
- 缓存模型独立于 UI。
- 发布动作只负责把“已确认资产结果”提交给后端。
- 动作生成参数模板不要散落在 UI 文件里。
5.6 customWorldAgentDraftResult.ts 收缩方案
当前定位
这是当前最重要的前端兼容桥接层。
过渡策略
阶段一不直接删除,但要改名并收缩定位:
- 建议迁为
src/services/custom-world/customWorldResultPreviewAdapter.ts - 只保留“服务端 result preview -> 前端 view model”的轻量适配
- 禁止继续在其中新增业务裁决和字段拼装逻辑
长期目标
服务端提供正式 result preview 输出后,前端不再执行 draftProfile -> CustomWorldProfile 编译,本文件可以在后续阶段物理删除。
6. 后端重构拆分方案
6.1 route 层收口
当前问题
customWorldAgent.ts 与 runtimeRoutes.ts 的下游能力边界还不够清晰,custom world 作品链仍混在 runtime 大路由里。
目标拆分
server-node/src/routes/customWorldAgent.ts只保留 Agent session / action / operation 路由。- 从
server-node/src/routes/runtimeRoutes.ts中拆出:server-node/src/routes/customWorldWorks.tsserver-node/src/routes/customWorldLibrary.tsserver-node/src/routes/customWorldGallery.ts
编码要求
- 路由层只做鉴权、请求校验、应用服务调用、响应映射。
- 不在路由层拼装 session 派生状态。
- 不在路由层做 draft / profile 字段兼容转换。
6.2 customWorldAgentOrchestrator.ts 拆分方案
当前问题
该文件当前同时承担:
- message turn 处理
- action 分发
- session 读写
- result profile sync
- suggested actions 生成
- 派生状态与 operation 文案拼装
目标拆分
保留 customWorldAgentOrchestrator.ts 作为应用服务 façade,只负责主链事务编排,并拆出:
server-node/src/services/customWorldAgentMessageTurnService.tsserver-node/src/services/customWorldAgentActionRegistry.tsserver-node/src/services/customWorldAgentActionExecutors/server-node/src/services/customWorldAgentResultSyncService.tsserver-node/src/services/customWorldAgentSuggestedActionService.tsserver-node/src/services/customWorldAgentSnapshotBuilder.tsserver-node/src/services/customWorldAgentQualityGateService.ts
关键要求
action -> executor必须通过注册表映射,不再在 orchestrator 里堆分支。publish_world、generate_scene_assets、expand_long_tail等 contract 中存在的 action,要么接入真实 executor,要么明确标记为未开放并返回禁用原因。sync_result_profile的字段回写细节只允许出现在独立 sync service 中。
6.3 customWorldAgentSessionStore.ts 拆分方案
当前问题
store 当前混合了:
- session factory
- session persistence
- 旧结构兼容补齐
- snapshot 输出
目标拆分
server-node/src/services/customWorldAgentSessionFactory.tsserver-node/src/services/customWorldAgentSessionCompatibility.tsserver-node/src/services/customWorldAgentSessionStore.tsserver-node/src/repositories/customWorldAgentSessionRepository.ts
关键要求
- session store 只保留高层读写接口。
- 兼容 legacy session 的逻辑单独隔离,避免污染新字段演进。
- persistence adapter 不再依赖 runtime 仓储大文件直接暴露全部能力。
6.4 customWorldAgentFoundationDraftService.ts 拆分方案
当前问题
当前 foundation draft 生成还带着“runtime profile 双重编译”的历史包袱。
目标拆分
server-node/src/services/customWorldAgentFoundationInputBuilder.tsserver-node/src/services/customWorldAgentFoundationLlmService.tsserver-node/src/services/customWorldAgentFoundationNormalizer.tsserver-node/src/services/customWorldAgentFoundationDraftService.tsserver-node/src/services/customWorldAgentResultPreviewCompiler.ts
关键要求
- foundation draft 生成与 runtime preview 编译彻底拆开。
- 不再通过“先编 legacy runtime profile,再转回 foundation draft”维持主链。
legacyResultProfile只作为阶段性兼容字段存在,禁止继续扩大依赖面。
6.5 runtimeProfile.ts 拆分方案
当前问题
这是当前 custom world runtime 编译中心,但文件过大,后续继续在原文件上叠加只会放大维护成本。
目标拆分
新增目录:
server-node/src/modules/custom-world/runtime-profile/index.tsserver-node/src/modules/custom-world/runtime-profile/normalizeShared.tsserver-node/src/modules/custom-world/runtime-profile/normalizeRole.tsserver-node/src/modules/custom-world/runtime-profile/normalizeLandmark.tsserver-node/src/modules/custom-world/runtime-profile/normalizeSceneChapter.tsserver-node/src/modules/custom-world/runtime-profile/normalizeCamp.tsserver-node/src/modules/custom-world/runtime-profile/buildCompiledProfile.tsserver-node/src/modules/custom-world/runtime-profile/buildAttributeSchema.tsserver-node/src/modules/custom-world/runtime-profile/creatorIntentBridge.ts
过渡策略
- 原
runtimeProfile.ts先保留为 façade 导出层。 - 新调用逐步改走目录化模块。
- 旧导出在阶段性兼容完成后再统一清理。
6.6 仓储层与 works 聚合层拆分方案
当前问题
runtimeRepository.ts 与 customWorldWorkSummaryService.ts 目前都承担了过多跨域职责。
目标拆分
建议把 runtimeRepository.ts 拆成:
server-node/src/repositories/runtimeSaveRepository.tsserver-node/src/repositories/runtimeSettingsRepository.tsserver-node/src/repositories/customWorldProfileRepository.tsserver-node/src/repositories/customWorldAgentSessionRepository.tsserver-node/src/repositories/profileBrowseHistoryRepository.ts
建议把 customWorldWorkSummaryService.ts 拆成:
server-node/src/services/customWorldWorkSummaryAssembler.tsserver-node/src/services/customWorldWorkCoverResolver.tsserver-node/src/services/customWorldWorkSummaryService.ts
关键要求
- works service 只做读模型聚合,不直接承担 session 兼容修补。
- repository 按领域而不是按技术杂糅方式拆开。
- works 聚合输出必须稳定支持“继续创作”和“进入世界”两个入口判定。
6.7 结果预览与发布链统一方案
当前问题
当前“结果页可进入世界”和“正式发布”还不是一条统一主链。
目标方案
后续增加服务端 result preview / publish gate 之后,统一为:
结果页编辑
-> 服务端写回 session patch
-> 服务端编译 result preview
-> 自动保存或发布
-> 发布校验
-> 生成 published profile
-> 进入世界
关键要求
- 进入世界前不再绕开 publish gate。
qualityFindings与 blocker 要成为真实 gate,而不是仅展示字段。- 自动保存保存的是“服务端确认后的 preview / profile”,而不是前端私有重编译产物。
7. 共享契约重构方案
7.1 customWorldAgent.ts 拆分建议
建议拆为以下契约文件,再由 index 统一 re-export:
packages/shared/src/contracts/customWorldAgentAnchors.tspackages/shared/src/contracts/customWorldAgentDraft.tspackages/shared/src/contracts/customWorldAgentActions.tspackages/shared/src/contracts/customWorldAgentSession.tspackages/shared/src/contracts/customWorldWorkSummary.ts
7.2 契约演进要求
后续 contract 调整需要新增两类约束:
supportedActions或等价能力矩阵,由后端真实注册表生成,前端只消费它,不再根据类型字面量自行假设按钮可用。resultPreview或独立 preview contract,明确区分“session 草稿”和“结果页预览”。
7.3 兼容字段处理
以下字段或能力要被明确标为“兼容过渡态”:
legacyResultProfile- 前端
buildCustomWorldProfileFromAgentDraft() - 结果页直接调用 legacy 生成函数补实体
所有新功能禁止再建立对这些兼容字段的新增依赖。
8. 测试与文档同步方案
8.1 测试分层
后续重构至少补齐 4 层测试:
- unit tests:针对 result sync、action registry、foundation normalizer、runtime preview compiler
- contract tests:针对 session snapshot、works summary、preview contract
- integration tests:覆盖“创建 session -> 发消息 -> draft foundation -> 编辑结果 -> 自动保存 -> 继续创作”
- regression tests:覆盖角色图、地点图、分幕图、动作资产字段不会在 session 重编译中回退
8.2 fixture 要求
建议补充固定 fixture:
- 最小 eight-anchor session fixture
- foundation draft fixture
- result preview fixture
- published profile fixture
这样 runtime compiler、autosave、works 聚合三条链可以共享相同样本。
8.3 文档同步要求
每完成一个阶段,至少同步更新:
- 本执行方案
docs/technical/README.md- 与本阶段对应的阶段性技术文档
- 若边界发生变化,还要同步相关 PRD / 审计文档口径
9. 可并行重构工作包
本次执行计划需要拆成多个可同时推进的工作部分,避免所有人都集中修改同一个热点文件。
并行原则如下:
- 每个工作包只负责一组清晰模块。
- 每个工作包必须有明确写入边界。
- 同一阶段允许并行,但禁止多人同时大改同一核心文件。
- 先做 façade 和新目录,再做调用迁移,最后做旧层清理。
9.1 工作包 A:命名规范与目录骨架
目标
先建立 RPG 创作域的新命名与目录骨架,给后续并行迁移提供统一落点。
负责范围
- 前端
src/components/game-shell/rpg-creation-flow/ - 前端
src/components/rpg-creation-result/ - 前端
src/components/rpg-creation-editor/ - 前端
src/services/rpg-creation/ - 后端
server-node/src/routes/下 RPG 创作相关新路由文件 - 后端
server-node/src/services/下 RPG 创作相关 façade 文件 - 共享契约新文件骨架
写入边界
- 可以新建目录和 façade 文件。
- 可以改文档和导出索引。
- 不负责大规模迁移老逻辑。
前置依赖
无,可最先开始。
9.2 工作包 B:前端平台壳层与流程编排拆分
目标
把 PreGameSelectionFlow.tsx 从大编排文件拆成壳层 + hooks。
负责范围
PreGameSelectionFlow.tsx- 平台 bootstrap、session controller、operation polling、detail navigation 相关 hooks
- 平台侧 works / dashboard / save / history 拉取协调
写入边界
- 主要修改前端壳层与流程 hooks。
- 不直接改后端 route / service 语义。
- 不承担结果页编辑器拆分。
前置依赖
最好在工作包 A 的目录骨架准备好后开始。
9.3 工作包 C:前端结果页与编辑器拆分
目标
把结果页、实体编辑器、角色资产工坊拆成组合壳层与独立 section / workflow。
负责范围
CustomWorldResultView.tsxCustomWorldEntityEditorModal.tsxCustomWorldRoleAssetStudioModal.tsx- 结果页 action hooks、表单 mapper、资产 workflow
写入边界
- 主要改结果页与编辑器相关前端组件。
- 允许补前端 view model 与 mapper。
- 不直接改平台壳层主状态编排。
前置依赖
依赖工作包 A 的命名规范与目录落点,和工作包 B 并行。
9.4 工作包 D:前端 custom world client 收口
目标
把 custom world 专属接口从 aiService.ts、storageService.ts 中迁出。
负责范围
aiService.tsstorageService.ts- 新增
rpgCreation*Client文件 - 调整前端调用导入路径
写入边界
- 只负责 API client 与请求封装。
- 不负责结果页 UI 拆分。
- 不负责后端业务实现重构。
前置依赖
依赖工作包 A 的命名和目录约束;可与 B、C 并行。
9.5 工作包 E:后端 Agent 编排拆分
目标
拆解 customWorldAgentOrchestrator.ts,引入 registry、snapshot builder、result sync service。
负责范围
customWorldAgentOrchestrator.ts- action registry
- action executors
- result sync service
- snapshot builder
- quality gate service
写入边界
- 主改后端应用服务层。
- 不负责 runtime profile 编译模块的目录化拆分。
- 不负责前端壳层迁移。
前置依赖
建议在工作包 A 后开始;可与 B、C、D 并行。
9.6 工作包 F:后端 session/store/repository 拆分
目标
拆出 session factory、compatibility、repository adapter,并把 custom world 仓储从 runtime 大仓储中分离。
负责范围
customWorldAgentSessionStore.tsruntimeRepository.tscustomWorldWorkSummaryService.ts- 新 session repository / profile repository / work summary assembler
写入边界
- 主改后端持久化与读模型层。
- 不负责 action executor 细节。
- 不负责前端调用改造。
前置依赖
与工作包 E 有接口协作关系,但可以并行推进,最终通过 façade 汇合。
9.7 工作包 G:后端 preview compiler 与 runtime profile 目录化
目标
把 runtimeProfile.ts 拆成目录化模块,并引入服务端 result preview compiler。
负责范围
runtimeProfile.tsruntime-profile/新目录- result preview compiler
- foundation draft 与 preview 编译的边界收口
写入边界
- 只负责编译层、normalize 层和 preview 输出。
- 不直接重构路由层。
- 不直接迁前端组件。
前置依赖
与工作包 E、F 并行,但在主链接入前需要先和 E 对齐 preview contract。
9.8 工作包 H:共享契约与测试基建
目标
拆分共享契约,补齐 fixture、contract tests、integration tests。
负责范围
packages/shared/src/contracts/- preview / action / session / works summary 契约
- fixture
- unit / contract / integration / regression tests
写入边界
- 契约变更必须同步测试。
- 不直接承担业务 UI 拆分。
- 不直接承担数据库仓储重构。
前置依赖
可从工作包 A 开始先建骨架,随后跟随 B 到 G 持续补齐。
9.9 并行推进关系
推荐并行顺序如下:
第一批并行:
工作包 A + 工作包 H
第二批并行:
工作包 B + 工作包 C + 工作包 D + 工作包 E + 工作包 F + 工作包 G
第三批收口:
把 B~H 的 façade 接回主链
-> 联调自动保存 / works / publish / enter world
-> 清理旧兼容层
9.10 并行协作约束
为避免多人互相覆盖,本轮建议遵守:
- 工作包 B 独占
PreGameSelectionFlow.tsx。 - 工作包 C 独占
CustomWorldResultView.tsx、CustomWorldEntityEditorModal.tsx、CustomWorldRoleAssetStudioModal.tsx。 - 工作包 D 独占
aiService.ts、storageService.ts。 - 工作包 E 独占
customWorldAgentOrchestrator.ts。 - 工作包 F 独占
customWorldAgentSessionStore.ts、runtimeRepository.ts、customWorldWorkSummaryService.ts。 - 工作包 G 独占
runtimeProfile.ts及其新目录。 - 工作包 H 独占 shared contracts 主文件和测试 fixture 总目录。
10. 分阶段落地计划
Phase 0:冻结口径与清点兼容层
目标
把当前链路拆分前的边界先冻结,避免后续一边拆一边新增同类耦合。
工作项
- 完成本文档并作为后续施工总口径
- 标记兼容层:
customWorldAgentDraftResult.ts、legacyResultProfile、结果页 legacy 生成动作 - 列出当前 action contract 与真实 executor 的对照表
验收标准
- 团队对“session / preview / published profile”三类真相源达成一致
- 新需求不再默认往
PreGameSelectionFlow.tsx和customWorldAgentOrchestrator.ts继续堆逻辑
Phase 1:目录骨架、命名规范与前端拆分并行启动
目标
先建立 RPG 创作域的新目录和命名规范,并把前端热点文件拆成可维护结构,但不改当前主流程行为。
工作项
- 完成工作包 A
- 完成工作包 B
- 完成工作包 C
- 完成工作包 D
验收标准
PreGameSelectionFlow.tsx只剩 stage 与组件装配逻辑- 通用 service 中不再继续新增 custom world workflow 接口
- 自动保存、session 恢复、进入世界逻辑都有独立 hook / coordinator
- 新增文件遵循 RPG 创作域命名规范
Phase 2:后端应用服务、仓储、编译层并行拆分
目标
把后端主链从“大 orchestrator + 大 store + 大 compiler”拆成 registry + services + repositories + compiler modules。
工作项
- 完成工作包 E
- 完成工作包 F
- 完成工作包 G
- 工作包 H 同步补 contract 与测试
验收标准
customWorldAgentOrchestrator.ts不再包含具体字段回写实现- action 的启用 / 禁用状态可由后端统一描述
- session 兼容逻辑可以脱离 store 单独测试
runtimeProfile.ts已退化为 façade 或兼容导出层
Phase 3:结果预览编译后移到后端
目标
消除前端“本地编译结果 profile”的主链地位。
工作项
- 新增服务端 result preview compiler
- 结果页改为消费服务端 preview
customWorldAgentDraftResult.ts改为薄适配层
验收标准
- 前端不再把
buildCustomWorldProfileFromAgentDraft()作为正式编译步骤 - 自动保存与 session 同步都基于服务端确认后的 preview
- 结果页字段回退问题不再依赖前端兼容修补
Phase 4:发布链、自动保存链、进入世界链统一
目标
把“可玩”与“已发布”的门槛统一到后端。
工作项
- 打通 publish gate
- 把
qualityFindings/ blocker 接成真实阻断条件 - enter world 统一走服务端发布态或明确允许的预览态
验收标准
- 前端不能绕开 publish / gate 直接进世界
- works、library、enter world 三处状态语义一致
- 发布失败可以给出明确 blocker 与恢复入口
Phase 5:兼容层清理
目标
在主链稳定后,物理清理历史桥接层和重复 pipeline。
工作项
- 删除前端 draft result 编译桥
- 删除结果页 legacy 直改链的残余入口
- 清理 contract 中已废弃 action / 字段
验收标准
- 创作主链只剩 session -> preview -> published profile 三层
- 不再存在“前端本地编译 profile 才能自动保存”的依赖
- 文档、契约、测试口径一致
11. 本次执行约束
后续按本文落地时,需要持续遵守以下约束:
- 不做大爆炸式重写,按阶段保留 façade 与兼容层。
- 不新开平行系统,优先在现有创作中心、结果页、Agent 工作区上做结构拆分。
- 前端新增文件优先按“壳层 / hook / client / section”拆,不把逻辑再塞回组件文件。
- 后端新增文件优先按“route / application service / domain service / repository / compiler”拆,不再继续扩大大文件。
- 每个阶段完成后同步文档与测试,不允许代码结构已经迁移但文档还停留在旧链路口径。
12. 结论
当前创作流程的核心问题,不是单点 bug,而是:
前端壳层、前端兼容编译层、后端编排层、后端 runtime 编译层同时过重,导致整条创作链处在“多条 pipeline 并存、桥接层过多、职责分层混乱”的过渡态。
后续重构的正确方向不是继续在热点文件上补判断,而是按本文把主链收成:
session 真相源 -> 服务端 preview 编译 -> published profile 发布态
只有这样,当前链路的可读性、可扩展性和后续功能落地稳定性,才会一起提升。