From 6b4c6b8a63cfa1c9025b0752ec3d8af114aff743 Mon Sep 17 00:00:00 2001 From: Linghong Date: Wed, 23 Sep 2026 14:25:02 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E7=AD=96=E5=88=92=20Agen?= =?UTF-8?q?t=20=E6=8F=90=E7=A4=BA=E8=AF=8D=E5=A5=91=E7=BA=A6=E8=AF=AF?= =?UTF-8?q?=E5=88=A0=20(#494)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 恢复策划产物路径及模板、示例资源定位。 恢复决定台账 D-xx 编号与跨文档引用。 恢复验收及 Skill 标识和阶段审批成功条件。 保留战斗系统示例非必读约定。 Reviewed-on: http://genarrative-station/git/GenarrativeAI/Genarrative/pulls/494 Co-authored-by: Linghong Co-committed-by: Linghong --- .../phase-context/overview-card.md | 2 +- .../src-tauri/design-agent/resources/SKILL.md | 40 ++++++++++------- .../resources/exemplars/decision-log.md | 44 +++++++++---------- .../resources/exemplars/overview-card.md | 10 ++--- .../exemplars/stardew-architecture.md | 4 +- .../exemplars/stardew-tdd-art-bible.md | 2 +- .../resources/exemplars/stardew-tdd-tech.md | 12 ++--- .../exemplars/tdd-art-bible-SKILL.md | 6 +-- .../resources/exemplars/tdd-data-SKILL.md | 5 ++- .../resources/exemplars/tdd-tech-SKILL.md | 6 +-- .../system-types/01_核心玩法编排/SKILL.md | 5 ++- .../system-types/01_核心玩法编排/模板.md | 2 +- .../system-types/02_时间与日程/SKILL.md | 5 ++- .../system-types/02_时间与日程/模板.md | 2 +- .../system-types/03_生产种植经营/SKILL.md | 5 ++- .../system-types/03_生产种植经营/模板.md | 2 +- .../system-types/04_地图与探索/SKILL.md | 5 ++- .../system-types/04_地图与探索/模板.md | 2 +- .../system-types/05_采集与支线活动/SKILL.md | 3 +- .../system-types/05_采集与支线活动/模板.md | 2 +- .../system-types/06_战斗与敌人/SKILL.md | 5 ++- .../system-types/06_战斗与敌人/模板.md | 2 +- .../system-types/07_物品背包与制作/SKILL.md | 5 ++- .../system-types/07_物品背包与制作/模板.md | 2 +- .../system-types/08_成长与技能/SKILL.md | 5 ++- .../system-types/08_成长与技能/模板.md | 2 +- .../system-types/09_NPC关系与任务/SKILL.md | 3 +- .../system-types/09_NPC关系与任务/模板.md | 2 +- .../system-types/10_经济与商店/SKILL.md | 5 ++- .../system-types/10_经济与商店/模板.md | 2 +- .../system-types/11_事件与节日/SKILL.md | 5 ++- .../system-types/11_事件与节日/模板.md | 2 +- .../system-types/12_UI与文本呈现/SKILL.md | 5 ++- .../system-types/12_UI与文本呈现/模板.md | 2 +- .../resources/skills/architecture.md | 18 +++++--- .../design-agent/resources/skills/concept.md | 18 +++++--- .../design-agent/resources/skills/systems.md | 21 ++++++--- .../design-agent/resources/skills/tdd.md | 8 ++-- .../resources/skills/top_design.md | 20 ++++++--- .../resources/templates/analysis.md | 8 ++-- .../resources/templates/architecture.md | 2 +- .../resources/templates/concept-design.md | 2 +- .../resources/templates/stardew-analysis.md | 26 +++++------ .../resources/templates/tdd-art-bible.md | 2 +- .../resources/templates/tdd-data.md | 4 +- .../resources/templates/tdd-master.md | 4 +- .../resources/templates/tdd-tech.md | 6 +-- .../resources/templates/top-design.md | 2 +- .../src-tauri/design-agent/system-prompt.md | 2 +- .../src-tauri/src/tests/project_tools.rs | 1 - .../src-tauri/src/tests/provider.rs | 3 +- .../src-tauri/src/tests/response_stream.rs | 16 +++---- docs/project-memory/shared-memory/pitfalls.md | 4 ++ ...】策划Agent生产迁移与工作区浏览-2026-09-10.md | 7 +++ 54 files changed, 217 insertions(+), 168 deletions(-) diff --git a/apps/ai-game-creator-shell/src-tauri/design-agent/phase-context/overview-card.md b/apps/ai-game-creator-shell/src-tauri/design-agent/phase-context/overview-card.md index 801255760..8754cf2cc 100644 --- a/apps/ai-game-creator-shell/src-tauri/design-agent/phase-context/overview-card.md +++ b/apps/ai-game-creator-shell/src-tauri/design-agent/phase-context/overview-card.md @@ -1,4 +1,4 @@ -概念阶段定稿时,创建或更新速览卡。下面是速览卡的参考结构;根据游戏类型、项目规模和用户要求选择适用字段,同类内容可以合并,复杂项目可以增加必要字段。表格和列表中的示例行按实际对象逐行扩展: +概念阶段定稿时,创建或更新 `project/速览卡.md`。下面是速览卡的参考结构;根据游戏类型、项目规模和用户要求选择适用字段,同类内容可以合并,复杂项目可以增加必要字段。表格和列表中的示例行按实际对象逐行扩展: # 速览卡:《游戏名》 diff --git a/apps/ai-game-creator-shell/src-tauri/design-agent/resources/SKILL.md b/apps/ai-game-creator-shell/src-tauri/design-agent/resources/SKILL.md index 4a5ae9af5..981b5f77f 100644 --- a/apps/ai-game-creator-shell/src-tauri/design-agent/resources/SKILL.md +++ b/apps/ai-game-creator-shell/src-tauri/design-agent/resources/SKILL.md @@ -137,14 +137,15 @@ description: 写游戏策划案(GDD)概念层时使用。把一句话游戏 不放分析文档——本文件只放已决论证与登记。 - 条目格式:`## 问题:<一句话>` + 状态(agent_proposal / user_confirmed / - superseded,登记编号:__)+ 广度分析(牵动面+候选 ≥2)+ 深度分析 + superseded,登记 D-__)+ 广度分析(牵动面+候选 ≥2)+ 深度分析 (逐候选利弊依据,必须引 T 原则/锚点/张力编号,写不出依据的偏好不进分析) + 综合判断(建议取 __ 因为 __;推翻条件:__)。 - 分诊三条件全满足才进:① 影响项目方向或边界;② ≥2 合理候选;③ 一时定不了。 不满足的:就地小权衡直接进登记表一行,不写条目。 - 本层标准两问:① 什么是本项目不可替代的核心承诺;② 什么内容扩张会稀释它。 - 数量纪律:概念期问题通常 ≤3;开始堆第 4 问时先怀疑概念层没想清楚,重读定调记录而不是继续开新争议。 -- user_confirmed 后三件事:结论一句话迁入对应结论文档节(留修订痕迹);登记表加行(编号全项目连续,跨层引用写登记编号);本条目保留原状态记录不删。 +- user_confirmed 后三件事:结论一句话迁入 design.md 对应节(留修订痕迹); + 登记表加行(编号全项目连续,跨层引用写 D-__);本条目改状态记 D 号保留不删。 推翻时新增行挂旧行编号,旧行不删。 @@ -321,14 +322,15 @@ __(多短一段玩法体现独有乐趣——原型只做这一个单位)。 不放分析文档——本文件只放已决论证与登记。 - 条目格式:`## 问题:<一句话>` + 状态(agent_proposal / user_confirmed / - superseded,登记编号:__)+ 广度分析(牵动面+候选 ≥2)+ 深度分析 + superseded,登记 D-__)+ 广度分析(牵动面+候选 ≥2)+ 深度分析 (逐候选利弊依据,必须引 T 原则/锚点/张力编号,写不出依据的偏好不进分析) + 综合判断(建议取 __ 因为 __;推翻条件:__)。 - 分诊三条件全满足才进:① 影响项目方向或边界;② ≥2 合理候选;③ 一时定不了。 不满足的:就地小权衡直接进登记表一行,不写条目。 - 本层标准两问:① 一天/一局怎样形成清楚但不拖沓的循环;② 风险、收益与长期成长怎样互相支撑。 - 数量纪律:顶层期问题通常 ≤5(结构性争议天然更多);堆问题时先回读第 1 节定位句。 -- user_confirmed 后三件事:结论一句话迁入对应结论文档节(留修订痕迹);登记表加行(编号全项目连续,跨层引用写登记编号);本条目保留原状态记录不删。 +- user_confirmed 后三件事:结论一句话迁入 design.md 对应节(留修订痕迹); + 登记表加行(编号全项目连续,跨层引用写 D-__);本条目改状态记 D 号保留不删。 推翻时新增行挂旧行编号,旧行不删。 @@ -486,14 +488,15 @@ P1/P2 可用能力表(能力/说明)控制颗粒度。 不放分析文档——本文件只放已决论证与登记。 - 条目格式:`## 问题:<一句话>` + 状态(agent_proposal / user_confirmed / - superseded,登记编号:__)+ 广度分析(牵动面+候选 ≥2)+ 深度分析 + superseded,登记 D-__)+ 广度分析(牵动面+候选 ≥2)+ 深度分析 (逐候选利弊依据,必须引 T 原则/锚点/张力编号,写不出依据的偏好不进分析) + 综合判断(建议取 __ 因为 __;推翻条件:__)。 - 分诊三条件全满足才进:① 影响项目方向或边界;② ≥2 合理候选;③ 一时定不了。 不满足的:就地小权衡直接进登记表一行,不写条目。 - 本层标准问题:结构级争议——接口统一、系统归并、主数据归属划分。 - 数量纪律:按需;架构期问题多为接口与归属二义。 -- user_confirmed 后三件事:结论一句话迁入对应结论文档节(留修订痕迹);登记表加行(编号全项目连续,跨层引用写登记编号);本条目保留原状态记录不删。 +- user_confirmed 后三件事:结论一句话迁入 design.md 对应节(留修订痕迹); + 登记表加行(编号全项目连续,跨层引用写 D-__);本条目改状态记 D 号保留不删。 推翻时新增行挂旧行编号,旧行不删。 @@ -584,14 +587,15 @@ description: 写单个系统的设计文档(Sxx)时的总纲——通用纪 不放分析文档——本文件只放已决论证与登记。 - 条目格式:`## 问题:<一句话>` + 状态(agent_proposal / user_confirmed / - superseded,登记编号:__)+ 广度分析(牵动面+候选 ≥2)+ 深度分析 + superseded,登记 D-__)+ 广度分析(牵动面+候选 ≥2)+ 深度分析 (逐候选利弊依据,必须引 T 原则/锚点/张力编号,写不出依据的偏好不进分析) + 综合判断(建议取 __ 因为 __;推翻条件:__)。 - 分诊三条件全满足才进:① 影响项目方向或边界;② ≥2 合理候选;③ 一时定不了。 不满足的:就地小权衡直接进登记表一行,不写条目。 - 本层标准问题:① 本系统与相邻系统的边界在哪;② 本系统内部哪个规则影响顶层取舍。条目标系统号(如 S06)。 - 数量纪律:按需;每系统通常 0~1 条,超了先回读架构职责表。 -- user_confirmed 后三件事:结论一句话迁入对应结论文档节(留修订痕迹);登记表加行(编号全项目连续,跨层引用写登记编号);本条目保留原状态记录不删。 +- user_confirmed 后三件事:结论一句话迁入 design.md 对应节(留修订痕迹); + 登记表加行(编号全项目连续,跨层引用写 D-__);本条目改状态记 D 号保留不删。 推翻时新增行挂旧行编号,旧行不删。 @@ -839,14 +843,15 @@ description: 写游戏策划案(GDD)概念层时使用。把一句话游戏 不放分析文档——本文件只放已决论证与登记。 - 条目格式:`## 问题:<一句话>` + 状态(agent_proposal / user_confirmed / - superseded,登记编号:__)+ 广度分析(牵动面+候选 ≥2)+ 深度分析 + superseded,登记 D-__)+ 广度分析(牵动面+候选 ≥2)+ 深度分析 (逐候选利弊依据,必须引 T 原则/锚点/张力编号,写不出依据的偏好不进分析) + 综合判断(建议取 __ 因为 __;推翻条件:__)。 - 分诊三条件全满足才进:① 影响项目方向或边界;② ≥2 合理候选;③ 一时定不了。 不满足的:就地小权衡直接进登记表一行,不写条目。 - 本层标准两问:① 什么是本项目不可替代的核心承诺;② 什么内容扩张会稀释它。 - 数量纪律:概念期问题通常 ≤3;开始堆第 4 问时先怀疑概念层没想清楚,重读定调记录而不是继续开新争议。 -- user_confirmed 后三件事:结论一句话迁入对应结论文档节(留修订痕迹);登记表加行(编号全项目连续,跨层引用写登记编号);本条目保留原状态记录不删。 +- user_confirmed 后三件事:结论一句话迁入 design.md 对应节(留修订痕迹); + 登记表加行(编号全项目连续,跨层引用写 D-__);本条目改状态记 D 号保留不删。 推翻时新增行挂旧行编号,旧行不删。 @@ -1025,14 +1030,15 @@ __(多短一段玩法体现独有乐趣——原型只做这一个单位)。 不放分析文档——本文件只放已决论证与登记。 - 条目格式:`## 问题:<一句话>` + 状态(agent_proposal / user_confirmed / - superseded,登记编号:__)+ 广度分析(牵动面+候选 ≥2)+ 深度分析 + superseded,登记 D-__)+ 广度分析(牵动面+候选 ≥2)+ 深度分析 (逐候选利弊依据,必须引 T 原则/锚点/张力编号,写不出依据的偏好不进分析) + 综合判断(建议取 __ 因为 __;推翻条件:__)。 - 分诊三条件全满足才进:① 影响项目方向或边界;② ≥2 合理候选;③ 一时定不了。 不满足的:就地小权衡直接进登记表一行,不写条目。 - 本层标准两问:① 一天/一局怎样形成清楚但不拖沓的循环;② 风险、收益与长期成长怎样互相支撑。 - 数量纪律:顶层期问题通常 ≤5(结构性争议天然更多);堆问题时先回读第 1 节定位句。 -- user_confirmed 后三件事:结论一句话迁入对应结论文档节(留修订痕迹);登记表加行(编号全项目连续,跨层引用写登记编号);本条目保留原状态记录不删。 +- user_confirmed 后三件事:结论一句话迁入 design.md 对应节(留修订痕迹); + 登记表加行(编号全项目连续,跨层引用写 D-__);本条目改状态记 D 号保留不删。 推翻时新增行挂旧行编号,旧行不删。 @@ -1192,14 +1198,15 @@ P1/P2 可用能力表(能力/说明)控制颗粒度。 不放分析文档——本文件只放已决论证与登记。 - 条目格式:`## 问题:<一句话>` + 状态(agent_proposal / user_confirmed / - superseded,登记编号:__)+ 广度分析(牵动面+候选 ≥2)+ 深度分析 + superseded,登记 D-__)+ 广度分析(牵动面+候选 ≥2)+ 深度分析 (逐候选利弊依据,必须引 T 原则/锚点/张力编号,写不出依据的偏好不进分析) + 综合判断(建议取 __ 因为 __;推翻条件:__)。 - 分诊三条件全满足才进:① 影响项目方向或边界;② ≥2 合理候选;③ 一时定不了。 不满足的:就地小权衡直接进登记表一行,不写条目。 - 本层标准问题:结构级争议——接口统一、系统归并、主数据归属划分。 - 数量纪律:按需;架构期问题多为接口与归属二义。 -- user_confirmed 后三件事:结论一句话迁入对应结论文档节(留修订痕迹);登记表加行(编号全项目连续,跨层引用写登记编号);本条目保留原状态记录不删。 +- user_confirmed 后三件事:结论一句话迁入 design.md 对应节(留修订痕迹); + 登记表加行(编号全项目连续,跨层引用写 D-__);本条目改状态记 D 号保留不删。 推翻时新增行挂旧行编号,旧行不删。 @@ -1292,14 +1299,15 @@ description: 写单个系统的设计文档(Sxx)时的总纲——通用纪 不放分析文档——本文件只放已决论证与登记。 - 条目格式:`## 问题:<一句话>` + 状态(agent_proposal / user_confirmed / - superseded,登记编号:__)+ 广度分析(牵动面+候选 ≥2)+ 深度分析 + superseded,登记 D-__)+ 广度分析(牵动面+候选 ≥2)+ 深度分析 (逐候选利弊依据,必须引 T 原则/锚点/张力编号,写不出依据的偏好不进分析) + 综合判断(建议取 __ 因为 __;推翻条件:__)。 - 分诊三条件全满足才进:① 影响项目方向或边界;② ≥2 合理候选;③ 一时定不了。 不满足的:就地小权衡直接进登记表一行,不写条目。 - 本层标准问题:① 本系统与相邻系统的边界在哪;② 本系统内部哪个规则影响顶层取舍。条目标系统号(如 S06)。 - 数量纪律:按需;每系统通常 0~1 条,超了先回读架构职责表。 -- user_confirmed 后三件事:结论一句话迁入对应结论文档节(留修订痕迹);登记表加行(编号全项目连续,跨层引用写登记编号);本条目保留原状态记录不删。 +- user_confirmed 后三件事:结论一句话迁入 design.md 对应节(留修订痕迹); + 登记表加行(编号全项目连续,跨层引用写 D-__);本条目改状态记 D 号保留不删。 推翻时新增行挂旧行编号,旧行不删。 diff --git a/apps/ai-game-creator-shell/src-tauri/design-agent/resources/exemplars/decision-log.md b/apps/ai-game-creator-shell/src-tauri/design-agent/resources/exemplars/decision-log.md index b0ec9d25b..b4ad33295 100644 --- a/apps/ai-game-creator-shell/src-tauri/design-agent/resources/exemplars/decision-log.md +++ b/apps/ai-game-creator-shell/src-tauri/design-agent/resources/exemplars/decision-log.md @@ -3,7 +3,7 @@ 版本:v3 | 规则:台账放活队列——design 只放结论、分析只放论证、决定与开放问题住这里。编号连续不复用;被推翻的行标 overturned 挂新行,不删行。 状态六态:`confirmed`(用户亲口/亲选)/ `auto_decided`(技术类代决,必带理由+推翻条件,用户一键可翻)/ `default_pending`(默认建议兜底,用户未点头)/ `prototype_pending`(待原型验证)/ `pending_user`(等用户拍板)/ `overturned`(被推翻,挂旧行编号)。 -> 编号口径:前面各项与全局分析登记一致;其中若干为"就地小权衡,直接登记未开条目",此处按登记口径展开。后续项在技术文档期新增,并与开放问题回执互引。 +> 编号口径:D-01~D-13 与 templates/stardew-analysis.md 台账节选一致(D-04~D-06、D-08~D-10、D-12 原为"就地小权衡,直接登记未开条目",此处按登记口径展开);D-14 起为技术文档期新增,与 stardew-tdd-tech.md 开放问题回执互引。 ## 当前待办(活队列) @@ -11,20 +11,20 @@ | 编号 | 决定 | 层 | 谁 | 依据 | 推翻条件 | 状态 | |---|---|---|---|---|---|---| -| 体力共享 | 体力与战斗共享单池 | TDD | user | 风险资源统一制造取舍(概念张力一);**暂按共享实现,改单拆只需改 S02 成本入口** | 战斗参与率实测过低(玩家回避矿井) | pending_user(暂按共享实现) | -| 背包容量 | 背包格子制 vs 重量制 | TDD | user | 格子制直觉、重量制焦虑感与 T5"休闲不打卡"冲突;暂按格子制实现、存档预留 capacity_type 字段 | 格子管理成为主要负面反馈 | pending_user(B 级阻断存档结构,暂按格子制) | +| D-14 | 体力与战斗共享单池 | TDD | user | 风险资源统一制造取舍(概念张力一);**暂按共享实现,改单拆只需改 S02 成本入口** | 战斗参与率实测过低(玩家回避矿井) | pending_user(暂按共享实现) | +| D-15 | 背包格子制 vs 重量制 | TDD | user | 格子制直觉、重量制焦虑感与 T5"休闲不打卡"冲突;暂按格子制实现、存档预留 capacity_type 字段 | 格子管理成为主要负面反馈 | pending_user(B 级阻断存档结构,暂按格子制) | ### 待原型验证(prototype_pending) | 编号 | 决定 | 层 | 谁 | 依据 | 推翻条件 | 状态 | |---|---|---|---|---|---|---| -| 判定手感 | 战斗判定窗口手感(前摇帧数/无敌帧 450ms 基准) | 系统 | user | 数值可定、手感不可纸面验证 | 原型显示节奏拖慢/玩家困惑 | prototype_pending(规则本体见 战斗判定 confirmed) | +| D-13b | 战斗判定窗口手感(前摇帧数/无敌帧 450ms 基准) | 系统 | user | 数值可定、手感不可纸面验证 | 原型显示节奏拖慢/玩家困惑 | prototype_pending(规则本体见 D-13 confirmed) | ### 默认建议兜底(default_pending) | 编号 | 决定 | 层 | 谁 | 依据 | 推翻条件 | 状态 | |---|---|---|---|---|---|---| -| 天气数值 | 天气权重表具体数值(晴/雨/风暴按季节) | TDD | agent | 概念层只定"雨免浇水"定性;数值推内容期填 | 前 5 日出现连续 3 日雨/全无雨 | default_pending(默认值已进数据表,带 designer_note) | +| D-19 | 天气权重表具体数值(晴/雨/风暴按季节) | TDD | agent | 概念层只定"雨免浇水"定性;数值推内容期填 | 前 5 日出现连续 3 日雨/全无雨 | default_pending(默认值已进数据表,带 designer_note) | ## 已采用决定 @@ -32,35 +32,35 @@ | 编号 | 决定 | 层 | 谁 | 依据 | 推翻条件 | 状态 | |---|---|---|---|---|---|---| -| 基调定位 | 定调:牧场物语系参照、治愈慢节奏 | 概念 | user | 用户原始需求 | — | confirmed | -| 范围约束 | 单人体验,无多人 | 概念 | user | 概念层非目标 | — | confirmed | -| 战斗定位 | 战斗保持伴生风险,不做装备驱动主轴 | 概念 | user | 概念期问题一 | 矿井流失率过半且归因战斗 | confirmed | -| 日目标 | 日目标自设,季节与社区提供低频牵引 | 顶层 | user | 顶层期问题一 | 新手周流失归因无方向 | confirmed | -| 活动接口 | 采集/钓鱼/战斗统一"活动结果"接口 | 架构 | user | 架构期问题一 | 第三活动类型出现结构性差异 | confirmed | -| 战斗判定 | 战斗采用节奏/指令判定 | 系统 | user | S06 问题一 | 原型显示节奏拖慢/玩家困惑 | confirmed(手感部分拆 判定手感 prototype_pending) | +| D-01 | 定调:牧场物语系参照、治愈慢节奏 | 概念 | user | 用户原始需求 | — | confirmed | +| D-02 | 单人体验,无多人 | 概念 | user | 概念层非目标 | — | confirmed | +| D-03 | 战斗保持伴生风险,不做装备驱动主轴 | 概念 | user | 概念期问题一 | 矿井流失率过半且归因战斗 | confirmed | +| D-07 | 日目标自设,季节与社区提供低频牵引 | 顶层 | user | 顶层期问题一 | 新手周流失归因无方向 | confirmed | +| D-11 | 采集/钓鱼/战斗统一"活动结果"接口 | 架构 | user | 架构期问题一 | 第三活动类型出现结构性差异 | confirmed | +| D-13 | 战斗采用节奏/指令判定 | 系统 | user | S06 问题一 | 原型显示节奏拖慢/玩家困惑 | confirmed(手感部分拆 D-13b prototype_pending) | ### 技术代决(auto_decided——带理由与推翻条件,用户一键可翻) | 编号 | 决定 | 层 | 谁 | 依据(理由) | 推翻条件 | 状态 | |---|---|---|---|---|---|---| -| 时间片 | 时间片制:700ms=10 游戏分钟 | 概念 | agent | 原作实证节拍;一天≈14 分钟真实时间贴合 T5"休闲" | 内测一天体感过短/过长 | auto_decided | -| 区域切换 | 分区域切换(区域独立场景,非连续地图) | 概念 | agent | 概念层"不是什么:无边界开放世界";区域小网络全部步行可达 | 场景切换成为移动负担反馈 | auto_decided | -| 季节周期 | 28 日/季、四季/年 | 顶层 | agent | 季节窗口制造"本季计划"节奏(支柱二) | 换季频率在测试中被无视 | auto_decided | -| 营业条件 | 商店营业时段走条件表 | 架构 | agent | 与配方/区域解锁共用 check(condition_id) 单一入口 | 条件表规模膨胀难维护 | auto_decided | -| 日终结算 | 出货箱日终统一结算 | 架构 | agent | 收入集中进日终面板,强化"一天一结算"叙事;商店现卖保留即时通道 | 玩家普遍绕开出货箱 | auto_decided | -| 工具占用 | 工具升级期间该工具不可用 | 系统 | agent | 升级=时间成本换效率(顶层张力二);备用旧工具暂不做(开放问题) | 升级期挫败感集中爆发 | auto_decided | -| 矿井生成 | 矿井逐层生成本期不做(P2) | TDD | agent | GDD 已标"不做无限地牢";首期按布局池 8~12 模板拼装 | 内测要求深度爬塔玩法 | auto_decided | -| 换装范围 | 换装首期 5 层(基础体/裤/衣/发型/饰件),非 19 层 | TDD | agent | 外观自定义非首期卖点;层结构预留到 19 层 | 外观系统成核心诉求 | auto_decided | -| 品质三档 | 作物品质三档:普通/银/金 | TDD | agent | 经济分层需要(即时变现 vs 等待升值的取舍) | 银金档无人区分、一律普通出售 | auto_decided | +| D-04 | 时间片制:700ms=10 游戏分钟 | 概念 | agent | 原作实证节拍;一天≈14 分钟真实时间贴合 T5"休闲" | 内测一天体感过短/过长 | auto_decided | +| D-05 | 分区域切换(区域独立场景,非连续地图) | 概念 | agent | 概念层"不是什么:无边界开放世界";区域小网络全部步行可达 | 场景切换成为移动负担反馈 | auto_decided | +| D-06 | 28 日/季、四季/年 | 顶层 | agent | 季节窗口制造"本季计划"节奏(支柱二) | 换季频率在测试中被无视 | auto_decided | +| D-09 | 商店营业时段走条件表 | 架构 | agent | 与配方/区域解锁共用 check(condition_id) 单一入口 | 条件表规模膨胀难维护 | auto_decided | +| D-10 | 出货箱日终统一结算 | 架构 | agent | 收入集中进日终面板,强化"一天一结算"叙事;商店现卖保留即时通道 | 玩家普遍绕开出货箱 | auto_decided | +| D-12 | 工具升级期间该工具不可用 | 系统 | agent | 升级=时间成本换效率(顶层张力二);备用旧工具暂不做(开放问题) | 升级期挫败感集中爆发 | auto_decided | +| D-16 | 矿井逐层生成本期不做(P2) | TDD | agent | GDD 已标"不做无限地牢";首期按布局池 8~12 模板拼装 | 内测要求深度爬塔玩法 | auto_decided | +| D-17 | 换装首期 5 层(基础体/裤/衣/发型/饰件),非 19 层 | TDD | agent | 外观自定义非首期卖点;层结构预留到 19 层 | 外观系统成核心诉求 | auto_decided | +| D-18 | 作物品质三档:普通/银/金 | TDD | agent | 经济分层需要(即时变现 vs 等待升值的取舍) | 银金档无人区分、一律普通出售 | auto_decided | ### 已推翻(overturned——旧行保留,挂新行) | 编号 | 决定 | 层 | 谁 | 依据 | 推翻条件 | 状态 | |---|---|---|---|---|---|---| -| 早期品质两档 | 作物品质两档:普通/银 | TDD | agent | 早期小权衡:两档最简 | — | **overturned → 品质三档**(经济分层不足,改三档;铱档留 P1) | +| D-08 | 作物品质两档:普通/银 | TDD | agent | 早期小权衡:两档最简 | — | **overturned → D-18**(经济分层不足,改三档;铱档留 P1) | ## 队列纪律(使用说明) -- 新决定入队:取下一个可用登记编号,并保持连续不复用;就现代决可登记不开条目,但状态必须写 auto_decided 并带理由+推翻条件。 +- 新决定入队:拿下一号(当前最大 D-19,下一号 D-20);就现代决可登记不开条目,但状态必须写 auto_decided 并带理由+推翻条件。 - 用户翻案:旧行标 overturned 挂新行,受影响文档节重写(本台账只记录,不代改)。 - 概念层变更定稿后:速览卡"决定状态与原型验证项"字段随本文件最新版同步。 diff --git a/apps/ai-game-creator-shell/src-tauri/design-agent/resources/exemplars/overview-card.md b/apps/ai-game-creator-shell/src-tauri/design-agent/resources/exemplars/overview-card.md index 3d1bf962d..68a55e87f 100644 --- a/apps/ai-game-creator-shell/src-tauri/design-agent/resources/exemplars/overview-card.md +++ b/apps/ai-game-creator-shell/src-tauri/design-agent/resources/exemplars/overview-card.md @@ -52,8 +52,8 @@ Web 浏览器运行 · 双视口(桌面/移动)· 键鼠/触屏双输入 · - 达标再扩展:玩家能自述明日计划后,才加社交深度与矿井分层。 ## 12. 决定状态与原型验证项(依据决策台账) -- 已确认(confirmed):总体基调 / 单人范围 / 战斗伴生 / 日目标自设 / 活动统一接口 / 战斗节奏判定。 -- 技术代决(auto_decided,可一键翻案):时间片 / 区域切换 / 季节周期 / 营业条件 / 日终结算 / 工具占用 / 矿井生成 P2 / 换装 5 层 / 品质三档(推翻早期品质两档)。 -- 等拍板(pending_user):体力战斗是否共享单池(暂按共享实现);背包格子/重量(暂按格子制,B 级阻断存档结构)。 -- 待原型(prototype_pending):战斗判定窗口手感(前摇帧数/450ms 无敌帧基准)。 -- 默认兜底(default_pending):天气权重数值(默认已入表,带 designer_note)。 +- 已确认(confirmed):定调 D-01 / 单人 D-02 / 战斗伴生 D-03 / 日目标自设 D-07 / 活动统一接口 D-11 / 战斗节奏判定 D-13。 +- 技术代决(auto_decided,可一键翻案):D-04 时间片 / D-05 分区域切换 / D-06 28 日季 / D-09 营业条件 / D-10 出货箱日终 / D-12 工具占用 / D-16 矿井生成 P2 / D-17 换装 5 层 / D-18 品质三档(推翻 D-08 两档)。 +- 等拍板(pending_user):D-14 体力战斗是否共享单池(暂按共享实现);D-15 背包格子/重量(暂按格子制,B 级阻断存档结构)。 +- 待原型(prototype_pending):D-13b 战斗判定窗口手感(前摇帧数/450ms 无敌帧基准)。 +- 默认兜底(default_pending):D-19 天气权重数值(默认已入表,带 designer_note)。 diff --git a/apps/ai-game-creator-shell/src-tauri/design-agent/resources/exemplars/stardew-architecture.md b/apps/ai-game-creator-shell/src-tauri/design-agent/resources/exemplars/stardew-architecture.md index c31ba1f04..b81f74342 100644 --- a/apps/ai-game-creator-shell/src-tauri/design-agent/resources/exemplars/stardew-architecture.md +++ b/apps/ai-game-creator-shell/src-tauri/design-agent/resources/exemplars/stardew-architecture.md @@ -8,7 +8,7 @@ > 玩家在有限的时间与体力下,通过农场、探索与社交三组活动系统产出资源与关系,经物品与经济系统转化为投资,由时间系统推进日终,把一天的成果变成下一天的选择。 变更记录: -- 2026-09-05:战斗与敌人系统定为伴生风险定位,深度刻意受限,不进入最小闭环核心链(依据:概念分析 战斗定位)。 +- 2026-09-05:战斗与敌人系统定为伴生风险定位,深度刻意受限,不进入最小闭环核心链(依据:概念分析 D-03)。 ## 系统地图 @@ -66,7 +66,7 @@ P0 段: 负责一天制的节奏规则:什么时候推进日期、哪些系统收到跨天 tick、日终结算何时发生。它不负责奖励结算,也不负责作物成长规则——只负责"什么时候"和"谁被通知"。 ### S06 战斗与敌人系统 -负责战斗内状态、敌人行为与战利品请求。它不直接修改商店价格或 NPC 好感,不负责角色长期成长;战利品只提交请求,由 S07 物品系统入账。定位是矿井探索的风险与节奏变化,不是成长主轴(战斗定位)。 +负责战斗内状态、敌人行为与战利品请求。它不直接修改商店价格或 NPC 好感,不负责角色长期成长;战利品只提交请求,由 S07 物品系统入账。定位是矿井探索的风险与节奏变化,不是成长主轴(D-03)。 ### S07 物品、背包与制作系统 负责物品身份、容器、堆叠与配方队列。它是全项目的公共语言层——任何系统的产出都以 `item_id` 入账;它不负责物品的经济价值平衡,价格只由 S09 维护。 diff --git a/apps/ai-game-creator-shell/src-tauri/design-agent/resources/exemplars/stardew-tdd-art-bible.md b/apps/ai-game-creator-shell/src-tauri/design-agent/resources/exemplars/stardew-tdd-art-bible.md index 3f774a412..87ecd930c 100644 --- a/apps/ai-game-creator-shell/src-tauri/design-agent/resources/exemplars/stardew-tdd-art-bible.md +++ b/apps/ai-game-creator-shell/src-tauri/design-agent/resources/exemplars/stardew-tdd-art-bible.md @@ -77,6 +77,6 @@ | # | 问题 | 去向 | |---|---|---| -| 1 | 换装系统首期是否做全 19 层(或缩到 5 层) | → 台账代决(建议首期 5 层:基础体/裤/衣/发型/饰件;台账 换装范围) | +| 1 | 换装系统首期是否做全 19 层(或缩到 5 层) | → 台账代决(建议首期 5 层:基础体/裤/衣/发型/饰件;台账 D-17) | | 2 | 锚点图方向需用户确认 | → 施工期提案卡 | | 3 | 位图字体 vs 矢量像素风字体 | → 小批阶段随 UI 套件定 | diff --git a/apps/ai-game-creator-shell/src-tauri/design-agent/resources/exemplars/stardew-tdd-tech.md b/apps/ai-game-creator-shell/src-tauri/design-agent/resources/exemplars/stardew-tdd-tech.md index a688eca27..64481d930 100644 --- a/apps/ai-game-creator-shell/src-tauri/design-agent/resources/exemplars/stardew-tdd-tech.md +++ b/apps/ai-game-creator-shell/src-tauri/design-agent/resources/exemplars/stardew-tdd-tech.md @@ -116,7 +116,7 @@ | 需求 | 用什么 | 来源与版本 | 实例化参数 | |---|---|---|---| -| Web 游戏开发规范 | 浏览器游戏开发规范 | 当前版 | 双视口/双输入/本地预览/纯 HTML 交付 | +| Web 游戏开发规范 | agc-web-game-development | `skill@当前版` | 双视口/双输入/本地预览/纯 HTML 交付 | | 地图渲染 | Canvas 2D 自研渲染器 | 手写(JSON 地图数据) | 四层结构(对齐原作 xTile 层语义) | | 音频 | 原生 WebAudio | 浏览器内置 API | BGM/SFX 双通道 | @@ -124,9 +124,9 @@ | 项 | 规定 | 依据 | |---|---|---| -| 瓦片地图结构 | 16px 网格;农场 80×65、小镇 50×40、矿井按层生成 | 台账 区域切换(区域分场景,非连续地图) | +| 瓦片地图结构 | 16px 网格;农场 80×65、小镇 50×40、矿井按层生成 | 台账 D-05(区域分场景,非连续地图) | | 镜头 | 跟随玩家+边界钳制;无缩放(固定整数倍) | GDD 顶层(无镜头玩法) | -| 场景切换 | 农场↔小镇↔矿井走连接点淡入淡出 ≤1s | 概念 区域切换 定案"分区域切换" | +| 场景切换 | 农场↔小镇↔矿井走连接点淡入淡出 ≤1s | 概念 D-05 定案"分区域切换" | | 关卡数据 | `data/maps/*.json`(自定义 JSON:层/网格/对象点) | 契约 v2 | ## 输入与操作 @@ -167,6 +167,6 @@ | # | 问题 | 去向 | |---|---|---| -| 1 | 背包格子还是重量容量(影响存档与 UI 结构) | → 概念层决策卡(B 级阻断,台账 背包容量) | -| 2 | 矿井逐层生成是否本期做 | → 台账代决(建议 P2,GDD 已标"不做无限地牢";台账 矿井生成) | -| 3 | 体力是否与战斗共享单池 | → 台账 体力共享(B 级待拍,暂按共享实现) | +| 1 | 背包格子还是重量容量(影响存档与 UI 结构) | → 概念层决策卡(B 级阻断,台账 D-15) | +| 2 | 矿井逐层生成是否本期做 | → 台账代决(建议 P2,GDD 已标"不做无限地牢";台账 D-16) | +| 3 | 体力是否与战斗共享单池 | → 台账 D-14(B 级待拍,暂按共享实现) | diff --git a/apps/ai-game-creator-shell/src-tauri/design-agent/resources/exemplars/tdd-art-bible-SKILL.md b/apps/ai-game-creator-shell/src-tauri/design-agent/resources/exemplars/tdd-art-bible-SKILL.md index 5b596f99d..0aaf5924d 100644 --- a/apps/ai-game-creator-shell/src-tauri/design-agent/resources/exemplars/tdd-art-bible-SKILL.md +++ b/apps/ai-game-creator-shell/src-tauri/design-agent/resources/exemplars/tdd-art-bible-SKILL.md @@ -1,12 +1,12 @@ --- name: game-tdd-02-art-bible description: 写"美术圣经"(美术侧)分册时使用。与总纲(技术文档层总纲分册)配套。 - 读者:美术 / 素材生产。 + 配套模板:templates/tdd-art-bible.md。配套金样:exemplars/stardew-tdd-art-bible.md。读者:美术 / 素材生产。 --- # 美术圣经 · 美术侧写法(策划 · TDD 分册之二) -> 本文件承载美术侧的写作流程。 +> 本文件承载美术侧的写作流程;模板在 templates/tdd-art-bible.md(保持纯净),金样在 exemplars/stardew-tdd-art-bible.md。 ## 一、这一件的判断立场 @@ -33,7 +33,7 @@ description: 写"美术圣经"(美术侧)分册时使用。与总纲(技 对象(资产总清单的范围)、物品表(item_id 绑定依据,数据侧已定)、 可复用画风规范。 2. 本件在数据侧表结构定稿后开写(素材清单引用 item_id)。 -3. 读取对应金样了解契约表与资产状态表包含的信息类型(同层只读一次)。 +3. 读取金样 exemplars/stardew-tdd-art-bible.md 了解契约表与资产状态表包含的信息类型(同层只读一次)。 ## 三、怎么写(模板即流程,按节) diff --git a/apps/ai-game-creator-shell/src-tauri/design-agent/resources/exemplars/tdd-data-SKILL.md b/apps/ai-game-creator-shell/src-tauri/design-agent/resources/exemplars/tdd-data-SKILL.md index 0b178e483..3eefe8b8c 100644 --- a/apps/ai-game-creator-shell/src-tauri/design-agent/resources/exemplars/tdd-data-SKILL.md +++ b/apps/ai-game-creator-shell/src-tauri/design-agent/resources/exemplars/tdd-data-SKILL.md @@ -1,13 +1,14 @@ --- name: game-tdd-03-data-config description: 写"数据与配表"(数据侧)分册时使用。与总纲(技术文档层总纲分册)配套。 + 配套模板:templates/tdd-data.md。配套金样:exemplars/stardew-tdd-data.md。 底料:归 TDD 素材两份提取件(S06 数值结构+架构字段字典,随包附件)。 读者:数值策划 + 程序。 --- # 数据与配表 · 数据侧写法(策划 · TDD 分册之三) -> 本文件承载数据侧的写作流程。 +> 本文件承载数据侧的写作流程;模板在 templates/tdd-data.md(保持纯净),金样在 exemplars/stardew-tdd-data.md。 > 两份提取件是本件的现成实料:引用规则、示例表、验收七查直接改造成文。 ## 一、这一件的判断立场 @@ -33,7 +34,7 @@ description: 写"数据与配表"(数据侧)分册时使用。与总纲( (架构层的定性基准,在本件落成前 N 日验算)。 2. 先读两份提取件:字段字典全套规则与验收模板已在那里成文,本件是 项目实例化,不是重新发明。 -3. 读取对应金样了解数据清单、验算表与验收结论包含的信息类型(同层只读一次)。 +3. 读取金样 exemplars/stardew-tdd-data.md 了解数据清单、验算表与验收结论包含的信息类型(同层只读一次)。 ## 三、怎么写(模板即流程,按节) diff --git a/apps/ai-game-creator-shell/src-tauri/design-agent/resources/exemplars/tdd-tech-SKILL.md b/apps/ai-game-creator-shell/src-tauri/design-agent/resources/exemplars/tdd-tech-SKILL.md index a358d41e2..9602213ca 100644 --- a/apps/ai-game-creator-shell/src-tauri/design-agent/resources/exemplars/tdd-tech-SKILL.md +++ b/apps/ai-game-creator-shell/src-tauri/design-agent/resources/exemplars/tdd-tech-SKILL.md @@ -1,12 +1,12 @@ --- name: game-tdd-01-tech description: 写"技术实现"(程序侧)分册时使用。与总纲(技术文档层总纲分册)配套。 - 读者:工程师。 + 配套模板:templates/tdd-tech.md。配套金样:exemplars/stardew-tdd-tech.md。读者:工程师。 --- # 技术实现 · 程序侧写法(策划 · TDD 分册之一) -> 本文件承载程序侧的写作流程。 +> 本文件承载程序侧的写作流程;模板在 templates/tdd-tech.md(保持纯净),金样在 exemplars/stardew-tdd-tech.md。 ## 一、这一件的判断立场 @@ -28,7 +28,7 @@ description: 写"技术实现"(程序侧)分册时使用。与总纲(技 1. 输入齐了吗:架构层系统范围表+P0 清单(拆模块依据)、数据侧表结构契约 (加载与校验要引用)、可复用能力选型(实现类需求先查现成能力,不自造轮子)。 2. 读总纲判断立场;本件在数据侧表结构定稿后开写。 -3. 读取对应金样了解技术实现文档包含的信息类型(同层只读一次)。 +3. 读取金样 exemplars/stardew-tdd-tech.md 了解技术实现文档包含的信息类型(同层只读一次)。 ## 三、怎么写(模板即流程,按节) diff --git a/apps/ai-game-creator-shell/src-tauri/design-agent/resources/modules/system-types/01_核心玩法编排/SKILL.md b/apps/ai-game-creator-shell/src-tauri/design-agent/resources/modules/system-types/01_核心玩法编排/SKILL.md index 81c77fd7c..0194f6120 100644 --- a/apps/ai-game-creator-shell/src-tauri/design-agent/resources/modules/system-types/01_核心玩法编排/SKILL.md +++ b/apps/ai-game-creator-shell/src-tauri/design-agent/resources/modules/system-types/01_核心玩法编排/SKILL.md @@ -1,8 +1,9 @@ -### C2 01_核心玩法编排 · 系统写法 +### C2 01_核心玩法编排/SKILL.md(→ modules/system-types/01_核心玩法编排/SKILL.md) --- name: gdd-sys-01-orchestration -description: 写"核心玩法/日循环编排"类系统文档时使用。 +description: 写"核心玩法/日循环编排"类系统文档时使用。与 skills/systems.md + 配套(通用纪律不在此重复)。配套模板:modules/system-types/01_核心玩法编排/模板.md。 --- # 核心玩法编排 · 系统写法 diff --git a/apps/ai-game-creator-shell/src-tauri/design-agent/resources/modules/system-types/01_核心玩法编排/模板.md b/apps/ai-game-creator-shell/src-tauri/design-agent/resources/modules/system-types/01_核心玩法编排/模板.md index 9cd4e875f..614b9acca 100644 --- a/apps/ai-game-creator-shell/src-tauri/design-agent/resources/modules/system-types/01_核心玩法编排/模板.md +++ b/apps/ai-game-creator-shell/src-tauri/design-agent/resources/modules/system-types/01_核心玩法编排/模板.md @@ -1,4 +1,4 @@ -### C2 01_核心玩法编排 · 模板 +### C2 01_核心玩法编排/模板.md(→ modules/system-types/01_核心玩法编排/模板.md) # __系统:S__(核心玩法编排类) diff --git a/apps/ai-game-creator-shell/src-tauri/design-agent/resources/modules/system-types/02_时间与日程/SKILL.md b/apps/ai-game-creator-shell/src-tauri/design-agent/resources/modules/system-types/02_时间与日程/SKILL.md index 4eae39bd7..8fcbc2d6f 100644 --- a/apps/ai-game-creator-shell/src-tauri/design-agent/resources/modules/system-types/02_时间与日程/SKILL.md +++ b/apps/ai-game-creator-shell/src-tauri/design-agent/resources/modules/system-types/02_时间与日程/SKILL.md @@ -1,8 +1,9 @@ -### C2 02_时间与日程 · 系统写法 +### C2 02_时间与日程/SKILL.md(→ modules/system-types/02_时间与日程/SKILL.md) --- name: gdd-sys-02-time-schedule -description: 写"时间与日程"类系统文档时使用。 +description: 写"时间与日程"类系统文档时使用。与 skills/systems.md 配套。 + 配套模板:modules/system-types/02_时间与日程/模板.md。 --- # 时间与日程 · 系统写法 diff --git a/apps/ai-game-creator-shell/src-tauri/design-agent/resources/modules/system-types/02_时间与日程/模板.md b/apps/ai-game-creator-shell/src-tauri/design-agent/resources/modules/system-types/02_时间与日程/模板.md index e94c82c13..5225e8ff4 100644 --- a/apps/ai-game-creator-shell/src-tauri/design-agent/resources/modules/system-types/02_时间与日程/模板.md +++ b/apps/ai-game-creator-shell/src-tauri/design-agent/resources/modules/system-types/02_时间与日程/模板.md @@ -1,4 +1,4 @@ -### C2 02_时间与日程 · 模板 +### C2 02_时间与日程/模板.md(→ modules/system-types/02_时间与日程/模板.md) # __系统:S__(时间与日程类) diff --git a/apps/ai-game-creator-shell/src-tauri/design-agent/resources/modules/system-types/03_生产种植经营/SKILL.md b/apps/ai-game-creator-shell/src-tauri/design-agent/resources/modules/system-types/03_生产种植经营/SKILL.md index 9b62fe526..98d0e87e1 100644 --- a/apps/ai-game-creator-shell/src-tauri/design-agent/resources/modules/system-types/03_生产种植经营/SKILL.md +++ b/apps/ai-game-creator-shell/src-tauri/design-agent/resources/modules/system-types/03_生产种植经营/SKILL.md @@ -1,8 +1,9 @@ -### C2 03_生产种植经营 · 系统写法 +### C2 03_生产种植经营/SKILL.md(→ modules/system-types/03_生产种植经营/SKILL.md) --- name: gdd-sys-03-farm-production -description: 写"生产/种植经营"类系统文档时使用。 +description: 写"生产/种植经营"类系统文档时使用。与 skills/systems.md 配套。 + 配套模板:modules/system-types/03_生产种植经营/模板.md。 --- # 生产种植经营 · 系统写法 diff --git a/apps/ai-game-creator-shell/src-tauri/design-agent/resources/modules/system-types/03_生产种植经营/模板.md b/apps/ai-game-creator-shell/src-tauri/design-agent/resources/modules/system-types/03_生产种植经营/模板.md index af55e3a22..81c0341fe 100644 --- a/apps/ai-game-creator-shell/src-tauri/design-agent/resources/modules/system-types/03_生产种植经营/模板.md +++ b/apps/ai-game-creator-shell/src-tauri/design-agent/resources/modules/system-types/03_生产种植经营/模板.md @@ -1,4 +1,4 @@ -### C2 03_生产种植经营 · 模板 +### C2 03_生产种植经营/模板.md(→ modules/system-types/03_生产种植经营/模板.md) # __系统:S__(生产种植经营类) diff --git a/apps/ai-game-creator-shell/src-tauri/design-agent/resources/modules/system-types/04_地图与探索/SKILL.md b/apps/ai-game-creator-shell/src-tauri/design-agent/resources/modules/system-types/04_地图与探索/SKILL.md index 1c991acde..cca360aa9 100644 --- a/apps/ai-game-creator-shell/src-tauri/design-agent/resources/modules/system-types/04_地图与探索/SKILL.md +++ b/apps/ai-game-creator-shell/src-tauri/design-agent/resources/modules/system-types/04_地图与探索/SKILL.md @@ -1,8 +1,9 @@ -### C2 04_地图与探索 · 系统写法 +### C2 04_地图与探索/SKILL.md(→ modules/system-types/04_地图与探索/SKILL.md) --- name: gdd-sys-04-map-exploration -description: 写"地图与探索"类系统文档时使用。 +description: 写"地图与探索"类系统文档时使用。与 skills/systems.md 配套。 + 配套模板:modules/system-types/04_地图与探索/模板.md。 --- # 地图与探索 · 系统写法 diff --git a/apps/ai-game-creator-shell/src-tauri/design-agent/resources/modules/system-types/04_地图与探索/模板.md b/apps/ai-game-creator-shell/src-tauri/design-agent/resources/modules/system-types/04_地图与探索/模板.md index 5af7b454c..5129075c0 100644 --- a/apps/ai-game-creator-shell/src-tauri/design-agent/resources/modules/system-types/04_地图与探索/模板.md +++ b/apps/ai-game-creator-shell/src-tauri/design-agent/resources/modules/system-types/04_地图与探索/模板.md @@ -1,4 +1,4 @@ -### C2 04_地图与探索 · 模板 +### C2 04_地图与探索/模板.md(→ modules/system-types/04_地图与探索/模板.md) # __系统:S__(地图与探索类) diff --git a/apps/ai-game-creator-shell/src-tauri/design-agent/resources/modules/system-types/05_采集与支线活动/SKILL.md b/apps/ai-game-creator-shell/src-tauri/design-agent/resources/modules/system-types/05_采集与支线活动/SKILL.md index c29a2c125..8aaa8fbae 100644 --- a/apps/ai-game-creator-shell/src-tauri/design-agent/resources/modules/system-types/05_采集与支线活动/SKILL.md +++ b/apps/ai-game-creator-shell/src-tauri/design-agent/resources/modules/system-types/05_采集与支线活动/SKILL.md @@ -1,8 +1,9 @@ -### C2 05_采集与支线活动 · 系统写法 +### C2 05_采集与支线活动/SKILL.md(→ modules/system-types/05_采集与支线活动/SKILL.md) --- name: gdd-sys-05-gathering-activities description: 写"采集与支线活动"类系统文档(采集/钓鱼/挖矿等侧挂轻活动)时使用。 + 与 skills/systems.md 配套。配套模板:modules/system-types/05_采集与支线活动/模板.md。 --- # 采集与支线活动 · 系统写法 diff --git a/apps/ai-game-creator-shell/src-tauri/design-agent/resources/modules/system-types/05_采集与支线活动/模板.md b/apps/ai-game-creator-shell/src-tauri/design-agent/resources/modules/system-types/05_采集与支线活动/模板.md index 33e6f2548..f2bc9a509 100644 --- a/apps/ai-game-creator-shell/src-tauri/design-agent/resources/modules/system-types/05_采集与支线活动/模板.md +++ b/apps/ai-game-creator-shell/src-tauri/design-agent/resources/modules/system-types/05_采集与支线活动/模板.md @@ -1,4 +1,4 @@ -### C2 05_采集与支线活动 · 模板 +### C2 05_采集与支线活动/模板.md(→ modules/system-types/05_采集与支线活动/模板.md) # __系统:S__(采集与支线活动类) diff --git a/apps/ai-game-creator-shell/src-tauri/design-agent/resources/modules/system-types/06_战斗与敌人/SKILL.md b/apps/ai-game-creator-shell/src-tauri/design-agent/resources/modules/system-types/06_战斗与敌人/SKILL.md index 40b7359a8..88ca94814 100644 --- a/apps/ai-game-creator-shell/src-tauri/design-agent/resources/modules/system-types/06_战斗与敌人/SKILL.md +++ b/apps/ai-game-creator-shell/src-tauri/design-agent/resources/modules/system-types/06_战斗与敌人/SKILL.md @@ -1,8 +1,9 @@ -### C2 06_战斗与敌人 · 系统写法 +### C2 06_战斗与敌人/SKILL.md(→ modules/system-types/06_战斗与敌人/SKILL.md) --- name: gdd-sys-06-combat -description: 写"战斗与敌人"类系统文档时使用。 +description: 写"战斗与敌人"类系统文档时使用。与 skills/systems.md 配套。 + 配套模板:modules/system-types/06_战斗与敌人/模板.md。 --- # 战斗与敌人 · 系统写法 diff --git a/apps/ai-game-creator-shell/src-tauri/design-agent/resources/modules/system-types/06_战斗与敌人/模板.md b/apps/ai-game-creator-shell/src-tauri/design-agent/resources/modules/system-types/06_战斗与敌人/模板.md index fb9799353..cb583d10f 100644 --- a/apps/ai-game-creator-shell/src-tauri/design-agent/resources/modules/system-types/06_战斗与敌人/模板.md +++ b/apps/ai-game-creator-shell/src-tauri/design-agent/resources/modules/system-types/06_战斗与敌人/模板.md @@ -1,4 +1,4 @@ -### C2 06_战斗与敌人 · 模板 +### C2 06_战斗与敌人/模板.md(→ modules/system-types/06_战斗与敌人/模板.md) # __系统:S__(战斗与敌人类) diff --git a/apps/ai-game-creator-shell/src-tauri/design-agent/resources/modules/system-types/07_物品背包与制作/SKILL.md b/apps/ai-game-creator-shell/src-tauri/design-agent/resources/modules/system-types/07_物品背包与制作/SKILL.md index a3cc3b8c7..3e8bc760c 100644 --- a/apps/ai-game-creator-shell/src-tauri/design-agent/resources/modules/system-types/07_物品背包与制作/SKILL.md +++ b/apps/ai-game-creator-shell/src-tauri/design-agent/resources/modules/system-types/07_物品背包与制作/SKILL.md @@ -1,8 +1,9 @@ -### C2 07_物品背包与制作 · 系统写法 +### C2 07_物品背包与制作/SKILL.md(→ modules/system-types/07_物品背包与制作/SKILL.md) --- name: gdd-sys-07-items-crafting -description: 写"物品、背包与制作"类系统文档时使用。 +description: 写"物品、背包与制作"类系统文档时使用。与 skills/systems.md 配套。 + 配套模板:modules/system-types/07_物品背包与制作/模板.md。 --- # 物品、背包与制作 · 系统写法 diff --git a/apps/ai-game-creator-shell/src-tauri/design-agent/resources/modules/system-types/07_物品背包与制作/模板.md b/apps/ai-game-creator-shell/src-tauri/design-agent/resources/modules/system-types/07_物品背包与制作/模板.md index 260c2568a..7330baac0 100644 --- a/apps/ai-game-creator-shell/src-tauri/design-agent/resources/modules/system-types/07_物品背包与制作/模板.md +++ b/apps/ai-game-creator-shell/src-tauri/design-agent/resources/modules/system-types/07_物品背包与制作/模板.md @@ -1,4 +1,4 @@ -### C2 07_物品背包与制作 · 模板 +### C2 07_物品背包与制作/模板.md(→ modules/system-types/07_物品背包与制作/模板.md) # __系统:S__(物品、背包与制作类) diff --git a/apps/ai-game-creator-shell/src-tauri/design-agent/resources/modules/system-types/08_成长与技能/SKILL.md b/apps/ai-game-creator-shell/src-tauri/design-agent/resources/modules/system-types/08_成长与技能/SKILL.md index 55447af11..1bad1bf92 100644 --- a/apps/ai-game-creator-shell/src-tauri/design-agent/resources/modules/system-types/08_成长与技能/SKILL.md +++ b/apps/ai-game-creator-shell/src-tauri/design-agent/resources/modules/system-types/08_成长与技能/SKILL.md @@ -1,8 +1,9 @@ -### C2 08_成长与技能 · 系统写法 +### C2 08_成长与技能/SKILL.md(→ modules/system-types/08_成长与技能/SKILL.md) --- name: gdd-sys-08-progression -description: 写"成长与技能"类系统文档时使用。 +description: 写"成长与技能"类系统文档时使用。与 skills/systems.md 配套。 + 配套模板:modules/system-types/08_成长与技能/模板.md。 --- # 成长与技能 · 系统写法 diff --git a/apps/ai-game-creator-shell/src-tauri/design-agent/resources/modules/system-types/08_成长与技能/模板.md b/apps/ai-game-creator-shell/src-tauri/design-agent/resources/modules/system-types/08_成长与技能/模板.md index 670facf35..61502e11c 100644 --- a/apps/ai-game-creator-shell/src-tauri/design-agent/resources/modules/system-types/08_成长与技能/模板.md +++ b/apps/ai-game-creator-shell/src-tauri/design-agent/resources/modules/system-types/08_成长与技能/模板.md @@ -1,4 +1,4 @@ -### C2 08_成长与技能 · 模板 +### C2 08_成长与技能/模板.md(→ modules/system-types/08_成长与技能/模板.md) # __系统:S__(成长与技能类) diff --git a/apps/ai-game-creator-shell/src-tauri/design-agent/resources/modules/system-types/09_NPC关系与任务/SKILL.md b/apps/ai-game-creator-shell/src-tauri/design-agent/resources/modules/system-types/09_NPC关系与任务/SKILL.md index edf63ee9c..24b13c8dc 100644 --- a/apps/ai-game-creator-shell/src-tauri/design-agent/resources/modules/system-types/09_NPC关系与任务/SKILL.md +++ b/apps/ai-game-creator-shell/src-tauri/design-agent/resources/modules/system-types/09_NPC关系与任务/SKILL.md @@ -1,8 +1,9 @@ -### C2 09_NPC关系与任务 · 系统写法 +### C2 09_NPC关系与任务/SKILL.md(→ modules/system-types/09_NPC关系与任务/SKILL.md) --- name: gdd-sys-09-npc-quest description: 写"NPC、关系与任务"类系统文档时使用(覆盖关系与任务两个职责)。 + 与 skills/systems.md 配套。配套模板:modules/system-types/09_NPC关系与任务/模板.md。 --- # NPC、关系与任务 · 系统写法 diff --git a/apps/ai-game-creator-shell/src-tauri/design-agent/resources/modules/system-types/09_NPC关系与任务/模板.md b/apps/ai-game-creator-shell/src-tauri/design-agent/resources/modules/system-types/09_NPC关系与任务/模板.md index fdb9d9fd7..5c8154289 100644 --- a/apps/ai-game-creator-shell/src-tauri/design-agent/resources/modules/system-types/09_NPC关系与任务/模板.md +++ b/apps/ai-game-creator-shell/src-tauri/design-agent/resources/modules/system-types/09_NPC关系与任务/模板.md @@ -1,4 +1,4 @@ -### C2 09_NPC关系与任务 · 模板 +### C2 09_NPC关系与任务/模板.md(→ modules/system-types/09_NPC关系与任务/模板.md) # __系统:S__(NPC、关系与任务类) diff --git a/apps/ai-game-creator-shell/src-tauri/design-agent/resources/modules/system-types/10_经济与商店/SKILL.md b/apps/ai-game-creator-shell/src-tauri/design-agent/resources/modules/system-types/10_经济与商店/SKILL.md index 366eb865f..f33cffb10 100644 --- a/apps/ai-game-creator-shell/src-tauri/design-agent/resources/modules/system-types/10_经济与商店/SKILL.md +++ b/apps/ai-game-creator-shell/src-tauri/design-agent/resources/modules/system-types/10_经济与商店/SKILL.md @@ -1,8 +1,9 @@ -### C2 10_经济与商店 · 系统写法 +### C2 10_经济与商店/SKILL.md(→ modules/system-types/10_经济与商店/SKILL.md) --- name: gdd-sys-10-economy-shop -description: 写"经济与商店"类系统文档时使用。 +description: 写"经济与商店"类系统文档时使用。与 skills/systems.md 配套。 + 配套模板:modules/system-types/10_经济与商店/模板.md。 --- # 经济与商店 · 系统写法 diff --git a/apps/ai-game-creator-shell/src-tauri/design-agent/resources/modules/system-types/10_经济与商店/模板.md b/apps/ai-game-creator-shell/src-tauri/design-agent/resources/modules/system-types/10_经济与商店/模板.md index 6112f31d2..49d2e04ec 100644 --- a/apps/ai-game-creator-shell/src-tauri/design-agent/resources/modules/system-types/10_经济与商店/模板.md +++ b/apps/ai-game-creator-shell/src-tauri/design-agent/resources/modules/system-types/10_经济与商店/模板.md @@ -1,4 +1,4 @@ -### C2 10_经济与商店 · 模板 +### C2 10_经济与商店/模板.md(→ modules/system-types/10_经济与商店/模板.md) # __系统:S__(经济与商店类) diff --git a/apps/ai-game-creator-shell/src-tauri/design-agent/resources/modules/system-types/11_事件与节日/SKILL.md b/apps/ai-game-creator-shell/src-tauri/design-agent/resources/modules/system-types/11_事件与节日/SKILL.md index cee3def12..f311ce52b 100644 --- a/apps/ai-game-creator-shell/src-tauri/design-agent/resources/modules/system-types/11_事件与节日/SKILL.md +++ b/apps/ai-game-creator-shell/src-tauri/design-agent/resources/modules/system-types/11_事件与节日/SKILL.md @@ -1,8 +1,9 @@ -### C2 11_事件与节日 · 系统写法 +### C2 11_事件与节日/SKILL.md(→ modules/system-types/11_事件与节日/SKILL.md) --- name: gdd-sys-11-events-festivals -description: 写"事件与节日"类系统文档时使用。 +description: 写"事件与节日"类系统文档时使用。与 skills/systems.md 配套。 + 配套模板:modules/system-types/11_事件与节日/模板.md。 --- # 事件与节日 · 系统写法 diff --git a/apps/ai-game-creator-shell/src-tauri/design-agent/resources/modules/system-types/11_事件与节日/模板.md b/apps/ai-game-creator-shell/src-tauri/design-agent/resources/modules/system-types/11_事件与节日/模板.md index b187cd7f9..fb185c168 100644 --- a/apps/ai-game-creator-shell/src-tauri/design-agent/resources/modules/system-types/11_事件与节日/模板.md +++ b/apps/ai-game-creator-shell/src-tauri/design-agent/resources/modules/system-types/11_事件与节日/模板.md @@ -1,4 +1,4 @@ -### C2 11_事件与节日 · 模板 +### C2 11_事件与节日/模板.md(→ modules/system-types/11_事件与节日/模板.md) # __系统:S__(事件与节日类) diff --git a/apps/ai-game-creator-shell/src-tauri/design-agent/resources/modules/system-types/12_UI与文本呈现/SKILL.md b/apps/ai-game-creator-shell/src-tauri/design-agent/resources/modules/system-types/12_UI与文本呈现/SKILL.md index 456eac729..4b1d2e979 100644 --- a/apps/ai-game-creator-shell/src-tauri/design-agent/resources/modules/system-types/12_UI与文本呈现/SKILL.md +++ b/apps/ai-game-creator-shell/src-tauri/design-agent/resources/modules/system-types/12_UI与文本呈现/SKILL.md @@ -1,8 +1,9 @@ -### C2 12_UI与文本呈现 · 系统写法 +### C2 12_UI与文本呈现/SKILL.md(→ modules/system-types/12_UI与文本呈现/SKILL.md) --- name: gdd-sys-12-ui-text -description: 写"UI 与文本呈现"类系统文档时使用。 +description: 写"UI 与文本呈现"类系统文档时使用。与 skills/systems.md 配套。 + 配套模板:modules/system-types/12_UI与文本呈现/模板.md。 --- # UI 与文本呈现 · 系统写法 diff --git a/apps/ai-game-creator-shell/src-tauri/design-agent/resources/modules/system-types/12_UI与文本呈现/模板.md b/apps/ai-game-creator-shell/src-tauri/design-agent/resources/modules/system-types/12_UI与文本呈现/模板.md index 7e6c304d9..edc9dc909 100644 --- a/apps/ai-game-creator-shell/src-tauri/design-agent/resources/modules/system-types/12_UI与文本呈现/模板.md +++ b/apps/ai-game-creator-shell/src-tauri/design-agent/resources/modules/system-types/12_UI与文本呈现/模板.md @@ -1,4 +1,4 @@ -### C2 12_UI与文本呈现 · 模板 +### C2 12_UI与文本呈现/模板.md(→ modules/system-types/12_UI与文本呈现/模板.md) # __系统:S__(UI 与文本呈类) diff --git a/apps/ai-game-creator-shell/src-tauri/design-agent/resources/skills/architecture.md b/apps/ai-game-creator-shell/src-tauri/design-agent/resources/skills/architecture.md index 5b53da5e2..f33f15cfb 100644 --- a/apps/ai-game-creator-shell/src-tauri/design-agent/resources/skills/architecture.md +++ b/apps/ai-game-creator-shell/src-tauri/design-agent/resources/skills/architecture.md @@ -4,7 +4,8 @@ name: game-gdd-architecture description: 写游戏策划案(GDD)系统架构时使用。在顶层设计定稿之后, 把顶层的系统范围表正式切成 Sxx 系统:编号、职责、依赖、数据流、优先级, - 并向系统文档交付目录映射与 MVP 闭环。 + 并向系统文档交付目录映射与 MVP 闭环。配套:templates/architecture.md、 + templates/analysis.md(全局一份)、exemplars/stardew-architecture.md、templates/stardew-analysis.md(全局一份)。 --- # 系统架构写法(策划 · 系统架构分册) @@ -30,7 +31,8 @@ description: 写游戏策划案(GDD)系统架构时使用。在顶层设计 ## 二、动笔前 1. 顶层设计已定稿可用——把它的**系统范围表**(粗清单)和**顶层定稿约束** 摊开当输入;切分是对粗清单的正式化(拆、并、裁都在这层做)。 -2. 读取对应示例了解内容组织方式,然后按对应模板填写。 +2. 读取 exemplars/stardew-architecture.md 了解内容组织方式, + 然后往 templates/architecture.md 里填。 3. 记住顶层的核心循环图——切完必须跑覆盖检查。 ## 三、架构设计的组织维度:写什么、为什么、怎么咬合 @@ -76,7 +78,7 @@ description: 写游戏策划案(GDD)系统架构时使用。在顶层设计 三方一致、主数据归属唯一;**对下**目录映射 + MVP 闭环喂系统文档。 ## 四、怎么写(模板参考结构,建议按此组织) -(本节是带写法要领的教学版;实际填写使用对应纯净模板。) +(本节是带写法要领的教学版;实际填写的纯净模板在 templates/architecture.md) ### 1. 架构定位与目标 本阶段确定"哪些系统支撑一轮玩法",不展开单系统内部规则。 @@ -137,17 +139,21 @@ P1/P2 可用能力表(能力/说明)控制颗粒度。 ## 五、分析文档(全局一份,按层分节) -**全局共用一份分析文档**:论证按发生层归节,决定登记表全项目共用,跨层引用只查这里。已决论证与登记写入分析文档,灵感池、代决、待原型等活队列写入决策台账。 +**全局共用 `project/analysis.md`**:论证按发生层归节,决定登记表全项目共用, +跨层引用查这里。模板与例子:资源 `templates/analysis.md`、 +`templates/stardew-analysis.md`。已决论证与登记写入分析文档, +灵感池、代决、待原型等活队列写入决策台账。 - 条目格式:`## 问题:<一句话>` + 状态(agent_proposal / user_confirmed / - superseded,登记编号:__)+ 广度分析(牵动面+候选 ≥2)+ 深度分析 + superseded,登记 D-__)+ 广度分析(牵动面+候选 ≥2)+ 深度分析 (逐候选利弊依据,必须引 T 原则/锚点/张力编号,写不出依据的偏好不进分析) + 综合判断(建议取 __ 因为 __;推翻条件:__)。 - 分诊三条件全满足才进:① 影响项目方向或边界;② ≥2 合理候选;③ 一时定不了。 不满足的:就地小权衡直接进登记表一行,不写条目。 - 本层标准问题:结构级争议——接口统一、系统归并、主数据归属划分。 - 数量纪律:按需;架构期问题多为接口与归属二义。 -- user_confirmed 后三件事:结论一句话迁入对应结论文档节(留修订痕迹);登记表加行(编号全项目连续,跨层引用写登记编号);本条目保留原状态记录不删。 +- user_confirmed 后三件事:结论一句话迁入 design.md 对应节(留修订痕迹); + 登记表加行(编号全项目连续,跨层引用写 D-__);本条目改状态记 D 号保留不删。 推翻时新增行挂旧行编号,旧行不删。 diff --git a/apps/ai-game-creator-shell/src-tauri/design-agent/resources/skills/concept.md b/apps/ai-game-creator-shell/src-tauri/design-agent/resources/skills/concept.md index faf90d3ab..b2e8b1fb2 100644 --- a/apps/ai-game-creator-shell/src-tauri/design-agent/resources/skills/concept.md +++ b/apps/ai-game-creator-shell/src-tauri/design-agent/resources/skills/concept.md @@ -4,7 +4,8 @@ name: game-gdd-concept description: 写游戏策划案(GDD)概念层时使用。把一句话游戏想法写成一份 "一次写对、之后不动"的立项概念文档——它是后续所有设计争议的仲裁依据。 - 任何游戏类型通用。 + 任何游戏类型通用。配套:templates/concept-design.md、templates/analysis.md(全局一份)、 + exemplars/stardew-concept.md、templates/stardew-analysis.md(全局一份)。 --- # 概念层写法(策划 · 概念层分册) @@ -30,7 +31,8 @@ description: 写游戏策划案(GDD)概念层时使用。把一句话游戏 ## 二、动笔前 1. 拿到用户真实回答过的定调信息(参照对象、题材偏好、压力档位)。 没有 → 先问一个定调问题,禁止自问自答充当用户。 -2. 读取对应示例了解内容组织方式,然后按对应模板填写。 +2. 读取 exemplars/stardew-concept.md 了解内容组织方式, + 然后往 templates/concept-design.md 里填。 3. 零参照时在文档头注明"零参照"。 ## 三、概念设计的组织维度:写什么、为什么、怎么咬合 @@ -72,7 +74,7 @@ description: 写游戏策划案(GDD)概念层时使用。把一句话游戏 **对上**边界画线防止越层。九节不是清单,是一台咬合的机器。 ## 四、怎么写(模板参考结构,建议按此组织) -(本节是带写法要领的教学版;实际填写使用对应纯净模板。) +(本节是带写法要领的教学版;实际填写的纯净模板在 templates/concept-design.md) ### 1. 一句话概念 《__》是一款 __(品类与融合):玩家通过 __,把 __ 逐步 __。 @@ -131,17 +133,21 @@ description: 写游戏策划案(GDD)概念层时使用。把一句话游戏 ## 五、分析文档(全局一份,按层分节) -**全局共用一份分析文档**:论证按发生层归节,决定登记表全项目共用,跨层引用只查这里。已决论证与登记写入分析文档,灵感池、代决、待原型等活队列写入决策台账。 +**全局共用 `project/analysis.md`**:论证按发生层归节,决定登记表全项目共用, +跨层引用查这里。模板与例子:资源 `templates/analysis.md`、 +`templates/stardew-analysis.md`。已决论证与登记写入分析文档, +灵感池、代决、待原型等活队列写入决策台账。 - 条目格式:`## 问题:<一句话>` + 状态(agent_proposal / user_confirmed / - superseded,登记编号:__)+ 广度分析(牵动面+候选 ≥2)+ 深度分析 + superseded,登记 D-__)+ 广度分析(牵动面+候选 ≥2)+ 深度分析 (逐候选利弊依据,必须引 T 原则/锚点/张力编号,写不出依据的偏好不进分析) + 综合判断(建议取 __ 因为 __;推翻条件:__)。 - 分诊三条件全满足才进:① 影响项目方向或边界;② ≥2 合理候选;③ 一时定不了。 不满足的:就地小权衡直接进登记表一行,不写条目。 - 本层标准两问:① 什么是本项目不可替代的核心承诺;② 什么内容扩张会稀释它。 - 数量纪律:概念期问题通常 ≤3;开始堆第 4 问时先怀疑概念层没想清楚,重读定调记录而不是继续开新争议。 -- user_confirmed 后三件事:结论一句话迁入对应结论文档节(留修订痕迹);登记表加行(编号全项目连续,跨层引用写登记编号);本条目保留原状态记录不删。 +- user_confirmed 后三件事:结论一句话迁入 design.md 对应节(留修订痕迹); + 登记表加行(编号全项目连续,跨层引用写 D-__);本条目改状态记 D 号保留不删。 推翻时新增行挂旧行编号,旧行不删。 diff --git a/apps/ai-game-creator-shell/src-tauri/design-agent/resources/skills/systems.md b/apps/ai-game-creator-shell/src-tauri/design-agent/resources/skills/systems.md index 76c0f64ce..d361488b4 100644 --- a/apps/ai-game-creator-shell/src-tauri/design-agent/resources/skills/systems.md +++ b/apps/ai-game-creator-shell/src-tauri/design-agent/resources/skills/systems.md @@ -3,12 +3,14 @@ --- name: game-gdd-system-doc description: 写单个系统的设计文档(Sxx)时的总纲——通用纪律、十二类常见内容、 - 红线与分析文档格式。 + 红线与分析文档格式。每类系统的专属写法与模板在 modules/system-types/ 下对应目录的 SKILL.md + 与对应模块的模板.md 里,按需取用。 --- # 系统文档写法(策划 · 系统文档分册 · 总纲) -> 本文件是系统文档层的总纲;通用纪律不在各系统写法里重复。 +> 本文件是系统文档层的总纲;各系统的专属写法在 `modules/system-types/` 下对应目录的 `SKILL.md`, + 专属模板在 `modules/system-types/` 对应目录的 `模板.md`。通用纪律不在各系统 skill 里重复。 ## 〇、结构适配原则 @@ -26,7 +28,8 @@ description: 写单个系统的设计文档(Sxx)时的总纲——通用纪 ## 二、动笔前 1. 架构已定稿:找到本系统的 Sxx 编号、职责表行、依赖方向——这是合同。 -2. 选择最接近的系统类型(可组合,如"钓鱼"=采集+战斗的判定部分),使用对应的系统写法与模板。 +2. 在 01~12 文件夹里选最接近的系统类型(可组合,如"钓鱼"=05 采集+06 战斗 + 的判定部分),读取对应的 `SKILL.md` 与 `模板.md`。 3. 该文件夹标注"参考例子"的,可先读例子了解写法。 ## 三、常见内容总览:写什么、为什么、怎么咬合 @@ -54,7 +57,7 @@ description: 写单个系统的设计文档(Sxx)时的总纲——通用纪 职责边界;**对下**第 7 节交接喂 TDD。 ## 四、常见内容的参考写法 -(各系统类型的特殊写法与纯净模板按对应类型取用。) +(各系统类型的特殊写法见对应文件夹 SKILL.md;纯净模板在其 模板.md) 1 系统目的:若删除它,__ 会塌——一句话说不出 = 该系统不该存在。 2 支撑体验:对应顶层目标第__条、调性原则第__条。 @@ -71,17 +74,21 @@ description: 写单个系统的设计文档(Sxx)时的总纲——通用纪 ## 五、分析文档(全局一份,按层分节) -**全局共用一份分析文档**:论证按发生层归节,决定登记表全项目共用,跨层引用只查这里。已决论证与登记写入分析文档,灵感池、代决、待原型等活队列写入决策台账。 +**全局共用 `project/analysis.md`**:论证按发生层归节,决定登记表全项目共用, +跨层引用查这里。模板与例子:资源 `templates/analysis.md`、 +`templates/stardew-analysis.md`。已决论证与登记写入分析文档, +灵感池、代决、待原型等活队列写入决策台账。 - 条目格式:`## 问题:<一句话>` + 状态(agent_proposal / user_confirmed / - superseded,登记编号:__)+ 广度分析(牵动面+候选 ≥2)+ 深度分析 + superseded,登记 D-__)+ 广度分析(牵动面+候选 ≥2)+ 深度分析 (逐候选利弊依据,必须引 T 原则/锚点/张力编号,写不出依据的偏好不进分析) + 综合判断(建议取 __ 因为 __;推翻条件:__)。 - 分诊三条件全满足才进:① 影响项目方向或边界;② ≥2 合理候选;③ 一时定不了。 不满足的:就地小权衡直接进登记表一行,不写条目。 - 本层标准问题:① 本系统与相邻系统的边界在哪;② 本系统内部哪个规则影响顶层取舍。条目标系统号(如 S06)。 - 数量纪律:按需;每系统通常 0~1 条,超了先回读架构职责表。 -- user_confirmed 后三件事:结论一句话迁入对应结论文档节(留修订痕迹);登记表加行(编号全项目连续,跨层引用写登记编号);本条目保留原状态记录不删。 +- user_confirmed 后三件事:结论一句话迁入 design.md 对应节(留修订痕迹); + 登记表加行(编号全项目连续,跨层引用写 D-__);本条目改状态记 D 号保留不删。 推翻时新增行挂旧行编号,旧行不删。 diff --git a/apps/ai-game-creator-shell/src-tauri/design-agent/resources/skills/tdd.md b/apps/ai-game-creator-shell/src-tauri/design-agent/resources/skills/tdd.md index fadd678ac..9a9ca73af 100644 --- a/apps/ai-game-creator-shell/src-tauri/design-agent/resources/skills/tdd.md +++ b/apps/ai-game-creator-shell/src-tauri/design-agent/resources/skills/tdd.md @@ -100,16 +100,16 @@ GDD 喂的(系统文档交接节就是订单);程序侧的加载与验证 ## A1 概念层分册(简介) -本分册说明概念设计的目标、边界、核心张力、分析记录和交接要求。完整内容见对应分册与模板。 +本分册说明概念设计的目标、边界、核心张力、分析记录和交接要求。完整内容请阅读 `resources/skills/concept.md`;概念设计模板请阅读 `resources/templates/concept-design.md`。 ## A2 顶层设计分册(简介) -本分册说明顶层循环、资源流、节奏、取舍、范围和验证标准。完整内容见对应分册与模板。 +本分册说明顶层循环、资源流、节奏、取舍、范围和验证标准。完整内容请阅读 `resources/skills/top_design.md`;顶层设计模板请阅读 `resources/templates/top-design.md`。 ## A3 系统架构分册(简介) -本分册说明系统职责、依赖、数据归属、MVP 闭环、目录映射和架构校验。完整内容见对应分册与模板。 +本分册说明系统职责、依赖、数据归属、MVP 闭环、目录映射和架构校验。完整内容请阅读 `resources/skills/architecture.md`;架构模板请阅读 `resources/templates/architecture.md`。 ## A4 系统文档分册(简介) -本分册说明单个系统的职责、规则、输入输出、反馈、边界、验证和分析记录。完整内容见对应分册;系统类型的专属写法和模板按需取用对应类型。 +本分册说明单个系统的职责、规则、输入输出、反馈、边界、验证和分析记录。完整内容请阅读 `resources/skills/systems.md`;系统类型的专属写法和模板请按需阅读 `modules/system-types/` 下对应分册。 diff --git a/apps/ai-game-creator-shell/src-tauri/design-agent/resources/skills/top_design.md b/apps/ai-game-creator-shell/src-tauri/design-agent/resources/skills/top_design.md index 067e72c8e..cfd2439d7 100644 --- a/apps/ai-game-creator-shell/src-tauri/design-agent/resources/skills/top_design.md +++ b/apps/ai-game-creator-shell/src-tauri/design-agent/resources/skills/top_design.md @@ -4,7 +4,8 @@ name: game-gdd-top-design description: 写游戏策划案(GDD)顶层设计时使用。在概念层定稿之后, 回答"玩家为什么一直玩"——把概念变成可玩的时间结构(循环/资源/取舍/节奏), - 并向架构层交付系统范围。 + 并向架构层交付系统范围。配套:templates/top-design.md、templates/analysis.md(全局一份)、 + exemplars/stardew-top-design.md、templates/stardew-analysis.md(全局一份)。 --- # 顶层设计写法(策划 · 顶层设计分册) @@ -28,8 +29,9 @@ description: 写游戏策划案(GDD)顶层设计时使用。在概念层定 - 你不替概念层翻案(张力与定稿已定),也不替架构层拆系统(只划边界)。 ## 二、动笔前 -1. 概念层结论文档已定稿可用——顶层定位与取舍表直接从它长出来。 -2. 读取对应示例了解内容组织方式,然后按对应模板填写。 +1. 概念层 design.md 已定稿可用——顶层定位与取舍表直接从它长出来。 +2. 读取 exemplars/stardew-top-design.md 了解内容组织方式, + 往 templates/top-design.md 里填。 3. 把概念层已确认的核心张力作为输入;存在对应取舍时再挂上编号。 ## 三、顶层设计的组织维度:写什么、为什么、怎么咬合 @@ -83,7 +85,7 @@ description: 写游戏策划案(GDD)顶层设计时使用。在概念层定 顶层定稿当架构的紧箍咒、验证标准当原型试玩判据。 ## 四、怎么写(模板参考结构,建议按此组织) -(本节是带写法要领的教学版;实际填写使用对应纯净模板。) +(本节是带写法要领的教学版;实际填写的纯净模板在 templates/top-design.md) ### 1. 顶层定位与规模锚点 承接概念定稿说明核心定位;存在容易混淆的方向时,说明排除方向及理由,表述按项目需要组织。 @@ -160,17 +162,21 @@ __(多短一段玩法体现独有乐趣——原型只做这一个单位)。 ## 五、分析文档(全局一份,按层分节) -**全局共用一份分析文档**:论证按发生层归节,决定登记表全项目共用,跨层引用只查这里。已决论证与登记写入分析文档,灵感池、代决、待原型等活队列写入决策台账。 +**全局共用 `project/analysis.md`**:论证按发生层归节,决定登记表全项目共用, +跨层引用查这里。模板与例子:资源 `templates/analysis.md`、 +`templates/stardew-analysis.md`。已决论证与登记写入分析文档, +灵感池、代决、待原型等活队列写入决策台账。 - 条目格式:`## 问题:<一句话>` + 状态(agent_proposal / user_confirmed / - superseded,登记编号:__)+ 广度分析(牵动面+候选 ≥2)+ 深度分析 + superseded,登记 D-__)+ 广度分析(牵动面+候选 ≥2)+ 深度分析 (逐候选利弊依据,必须引 T 原则/锚点/张力编号,写不出依据的偏好不进分析) + 综合判断(建议取 __ 因为 __;推翻条件:__)。 - 分诊三条件全满足才进:① 影响项目方向或边界;② ≥2 合理候选;③ 一时定不了。 不满足的:就地小权衡直接进登记表一行,不写条目。 - 本层标准两问:① 一天/一局怎样形成清楚但不拖沓的循环;② 风险、收益与长期成长怎样互相支撑。 - 数量纪律:顶层期问题通常 ≤5(结构性争议天然更多);堆问题时先回读第 1 节定位句。 -- user_confirmed 后三件事:结论一句话迁入对应结论文档节(留修订痕迹);登记表加行(编号全项目连续,跨层引用写登记编号);本条目保留原状态记录不删。 +- user_confirmed 后三件事:结论一句话迁入 design.md 对应节(留修订痕迹); + 登记表加行(编号全项目连续,跨层引用写 D-__);本条目改状态记 D 号保留不删。 推翻时新增行挂旧行编号,旧行不删。 diff --git a/apps/ai-game-creator-shell/src-tauri/design-agent/resources/templates/analysis.md b/apps/ai-game-creator-shell/src-tauri/design-agent/resources/templates/analysis.md index 7b34ce3a4..56ec881d8 100644 --- a/apps/ai-game-creator-shell/src-tauri/design-agent/resources/templates/analysis.md +++ b/apps/ai-game-creator-shell/src-tauri/design-agent/resources/templates/analysis.md @@ -1,4 +1,4 @@ -### C1 分析模板(全局一份) +### C1 模板_分析.md(全局一份;→ templates/analysis.md) # 分析:《游戏名》 @@ -10,7 +10,7 @@ ## 概念期问题(通常 ≤3 条) ## 问题:__(一句话) -状态:agent_proposal / user_confirmed / superseded(登记编号:__) +状态:agent_proposal / user_confirmed / superseded(登记 D-__) - 广度分析:牵动面(波及哪些锚点/张力/节)+ 候选方向(≥2) - 深度分析:逐候选 利/弊/依据(必须引定调记录 T 原则、锚点、张力编号或参照资料,写不出依据的偏好不进分析) - 综合判断:建议取 __,因为 __。推翻条件:__。 @@ -35,7 +35,7 @@ | D# | 决定 | 层 | 权威 | 依据 | 推翻条件 | 状态 | |---|---|---|---|---|---|---| -| __ | __ | 概念 | user / agent(代决带理由) | 本文件问题__ / T__ | __ | 已确认/已推翻/待原型 | +| D-01 | __ | 概念 | user / agent(代决带理由) | 本文件问题__ / T__ | __ | 已确认/已推翻/待原型 | -- 登记编号全项目连续;跨层引用直接写登记编号;推翻时新增行挂旧行编号,旧行不删。 +- 编号全项目连续;跨层引用直接写"D-__";推翻时新增行挂旧行编号,旧行不删。 - 就地小权衡(不满足分诊三条件的)直接登记一行,不写问题条目。 diff --git a/apps/ai-game-creator-shell/src-tauri/design-agent/resources/templates/architecture.md b/apps/ai-game-creator-shell/src-tauri/design-agent/resources/templates/architecture.md index 4e0840f0c..e6d8d5e85 100644 --- a/apps/ai-game-creator-shell/src-tauri/design-agent/resources/templates/architecture.md +++ b/apps/ai-game-creator-shell/src-tauri/design-agent/resources/templates/architecture.md @@ -1,4 +1,4 @@ -### C1 系统架构模板 +### C1 模板_系统架构.md(→ templates/architecture.md) 本模板是参考结构,不是固定清单。只有需要独立职责、状态或数据边界的部分才拆成系统;简单项目可以合并系统和章节,复杂项目可以增加必要的系统与校验。表格中的示例行可按实际系统、风险和问题扩展,不代表数量上限。 diff --git a/apps/ai-game-creator-shell/src-tauri/design-agent/resources/templates/concept-design.md b/apps/ai-game-creator-shell/src-tauri/design-agent/resources/templates/concept-design.md index d5747c313..36fc4dc79 100644 --- a/apps/ai-game-creator-shell/src-tauri/design-agent/resources/templates/concept-design.md +++ b/apps/ai-game-creator-shell/src-tauri/design-agent/resources/templates/concept-design.md @@ -1,4 +1,4 @@ -### C1 概念设计模板 +### C1 模板_概念设计.md(→ templates/concept-design.md) 本模板是参考结构,不是固定清单。填写前按项目类型、规模和用户要求筛选章节与字段;同类内容可合并,若某节对项目没有实际意义则删除,复杂项目可增加必要内容。表格和列表中的示例项可按实际内容扩展,不代表数量上限。 diff --git a/apps/ai-game-creator-shell/src-tauri/design-agent/resources/templates/stardew-analysis.md b/apps/ai-game-creator-shell/src-tauri/design-agent/resources/templates/stardew-analysis.md index 4c51b7828..a08d153c6 100644 --- a/apps/ai-game-creator-shell/src-tauri/design-agent/resources/templates/stardew-analysis.md +++ b/apps/ai-game-creator-shell/src-tauri/design-agent/resources/templates/stardew-analysis.md @@ -1,4 +1,4 @@ -### C1 星露谷分析示例(分析金样) +### C1 例子_星露谷_分析.md(分析金样;→ templates/stardew-analysis.md) # 分析:《星露谷物语》 @@ -8,7 +8,7 @@ ## 概念期问题 ## 问题:矿井战斗要不要做成装备驱动的成长主轴? -状态:user_confirmed(登记 战斗定位) +状态:user_confirmed(登记 D-03) - 广度分析:牵动锚点"目标体验"(掌控感与紧张的比例)、"不是什么"表第 3 行、核心张力第 3 条(稳定经营 vs 未知探索)。候选:A 战斗做成装备驱动主轴之一;B 战斗保持伴生风险,深度刻意受限。 - 深度分析:A 利:矿井更耐玩,长期目标多一条。弊:需要装备与难度曲线支撑,时间重量与农场主轴抢位,动摇"治愈"基调(违反 T1)。B 利:保住生活模拟纯度,战斗作为探索的节奏变化存在。弊:战斗型玩家留存偏弱——但受众映射显示目标玩家(牧场物语系)本不以战斗为主诉求。 @@ -18,7 +18,7 @@ ## 顶层期问题 ## 问题:一个游戏日怎样保持"想做的事多于做得到的"而不变成打卡负担? -状态:user_confirmed(登记 日目标) +状态:user_confirmed(登记 D-07) - 广度分析:牵动锚点"目标体验"(掌控感与治愈的配比)、张力第 1 条(时间与体力有限)、节奏结构日内层、失败与回收档位。候选:A 收紧——每日固定目标与奖励;B 放宽——去掉每日压力;C 保留时间/体力约束,目标完全由玩家自设。 - 深度分析:A 利:方向感强。弊:把休闲变成每日打卡义务,直接命中跑偏风险第 2 条(违反 T5)。B 利:最松弛。弊:没有取舍就没有"今天的选择",张力第 1 条落空。C 利:约束存在但重量自选;节日与季节提供低频外部节拍。弊:部分玩家需要更明确指引——可由社区修复目标与任务系统补位。 @@ -28,7 +28,7 @@ ## 架构期问题 ## 问题:采集、钓鱼与战斗要不要共享统一的"活动结果"接口? -状态:user_confirmed(登记 活动接口) +状态:user_confirmed(登记 D-11) - 广度分析:牵动 S05/S06 的输出边界、S07 物品系统入账方式、依赖与数据流图活动侧。候选:A 三系统各自定义产出结构;B 统一"活动结果"接口(活动类型+结果列表+条件),三系统只填参数。 - 深度分析:A 利:各系统自由。弊:S07 要维护三种入账协议;任务系统验证"完成了一次采集/战斗"需分别适配——职责表里 S05/S06 的"不负责"列都指向 S07,接口不统一把适配成本堆给公共层。B 利:产出、经验、任务进度走同一条管线,S07 与 S11 只适配一次;新增活动类型不动公共层。弊:接口要预留类型差异(战利品请求/钓鱼品质),设计不当会把差异塞进自由字段。 @@ -38,10 +38,10 @@ ## 系统期问题 ## S06:战斗操作深度选哪一档? -状态:user_confirmed(登记 战斗判定;手感部分 prototype_pending) +状态:user_confirmed(登记 D-13;手感部分 prototype_pending) - 广度分析:牵动玩家行动动词组、状态与规则的判定方式、顶层规模锚点(操作复杂度=低)、"不是什么"表第 3 行。候选:A 实时轻操作(移动+攻击+闪避);B 节奏/指令判定(时机窗口确认)。 -- 深度分析:A 利:紧张感即时、反馈直接。弊:与顶层"操作复杂度低"直接冲突,敌人一多把轻度风险推成动作压力,动摇治愈基调(T1)。B 利:判定即反馈,压力可通过窗口宽度调节;与"伴生风险"定位相容(战斗定位)。弊:判定窗口的手感无法纸面验证——需原型。 +- 深度分析:A 利:紧张感即时、反馈直接。弊:与顶层"操作复杂度低"直接冲突,敌人一多把轻度风险推成动作压力,动摇治愈基调(T1)。B 利:判定即反馈,压力可通过窗口宽度调节;与"伴生风险"定位相容(D-03)。弊:判定窗口的手感无法纸面验证——需原型。 - 综合判断:建议 B 为设计方向:节奏/指令判定承载轻度战斗;判定窗口手感在登记表标"待原型验证"。 推翻条件:原型显示节奏判定拖慢探索节奏,或玩家反馈"按键时机莫名其妙"。 @@ -53,11 +53,11 @@ | D# | 决定 | 层 | 权威 | 依据 | 推翻条件 | 状态 | |---|---|---|---|---|---|---| -| 基调定位 | 定调:牧场物语系参照、治愈慢节奏 | 概念 | user | 用户原始需求 | — | 已确认 | -| 范围约束 | 单人体验,无多人 | 概念 | user | 概念层非目标 | — | 已确认 | -| 战斗定位 | 战斗保持伴生风险,不做装备驱动主轴 | 概念 | user | 概念期问题一 | 矿井流失率过半且归因战斗 | 已确认 | -| 日目标 | 日目标自设,季节与社区提供低频牵引 | 顶层 | user | 顶层期问题一 | 新手周流失归因无方向 | 已确认 | -| 活动接口 | 采集/钓鱼/战斗统一"活动结果"接口 | 架构 | user | 架构期问题一 | 第三活动类型出现结构性差异 | 已确认 | -| 战斗判定 | 战斗采用节奏/指令判定;窗口手感待原型 | 系统 | user | S06 问题一 | 原型显示节奏拖慢/玩家困惑 | 已确认(手感 prototype_pending) | +| D-01 | 定调:牧场物语系参照、治愈慢节奏 | 概念 | user | 用户原始需求 | — | 已确认 | +| D-02 | 单人体验,无多人 | 概念 | user | 概念层非目标 | — | 已确认 | +| D-03 | 战斗保持伴生风险,不做装备驱动主轴 | 概念 | user | 概念期问题一 | 矿井流失率过半且归因战斗 | 已确认 | +| D-07 | 日目标自设,季节与社区提供低频牵引 | 顶层 | user | 顶层期问题一 | 新手周流失归因无方向 | 已确认 | +| D-11 | 采集/钓鱼/战斗统一"活动结果"接口 | 架构 | user | 架构期问题一 | 第三活动类型出现结构性差异 | 已确认 | +| D-13 | 战斗采用节奏/指令判定;窗口手感待原型 | 系统 | user | S06 问题一 | 原型显示节奏拖慢/玩家困惑 | 已确认(手感 prototype_pending) | -(部分小权衡直接登记、未单开条目;登记编号连续且不复用。) +(D-04~D-06、D-08~D-10、D-12 为就地小权衡,直接登记未开条目;编号连续不复用。) diff --git a/apps/ai-game-creator-shell/src-tauri/design-agent/resources/templates/tdd-art-bible.md b/apps/ai-game-creator-shell/src-tauri/design-agent/resources/templates/tdd-art-bible.md index b96c412d1..3577752f6 100644 --- a/apps/ai-game-creator-shell/src-tauri/design-agent/resources/templates/tdd-art-bible.md +++ b/apps/ai-game-creator-shell/src-tauri/design-agent/resources/templates/tdd-art-bible.md @@ -1,4 +1,4 @@ -### C3 美术圣经模板 +### C3 02_美术圣经/模板.md(→ templates/tdd-art-bible.md) 本模板是美术实施的参考结构。按项目实际需要选择角色、场景、UI、动画和素材契约;没有对应资产类型时删除相应章节,复杂项目可增加必要的视觉规则。表格和资产条目可按实际内容扩展,不代表数量上限。 diff --git a/apps/ai-game-creator-shell/src-tauri/design-agent/resources/templates/tdd-data.md b/apps/ai-game-creator-shell/src-tauri/design-agent/resources/templates/tdd-data.md index 8654c1c39..244e8063b 100644 --- a/apps/ai-game-creator-shell/src-tauri/design-agent/resources/templates/tdd-data.md +++ b/apps/ai-game-creator-shell/src-tauri/design-agent/resources/templates/tdd-data.md @@ -1,10 +1,10 @@ -### C3 数据与配表模板 +### C3 03_数据与配表/模板.md(→ templates/tdd-data.md) 本模板是数据与配表的参考结构。只有项目实际存在配置、枚举、关系或条件数据时才建立对应表和校验;简单项目可以直接写配置约定,复杂项目再拆分表结构与验算流程。表格中的示例行可按实际数据、字段和验算项扩展,不代表数量上限。 # 数据与配表:《游戏名》 -> 状态:{structuring / filling / accepted} | 基于:各系统交接节汇总 | 验收记录标识:{id};最新结论 __ +> 状态:{structuring / filling / accepted} | 基于:各系统交接节汇总 | 验收:check@{id} 最新结论 __ ## 数据表总清单 diff --git a/apps/ai-game-creator-shell/src-tauri/design-agent/resources/templates/tdd-master.md b/apps/ai-game-creator-shell/src-tauri/design-agent/resources/templates/tdd-master.md index e84f51b4d..1285e9f6f 100644 --- a/apps/ai-game-creator-shell/src-tauri/design-agent/resources/templates/tdd-master.md +++ b/apps/ai-game-creator-shell/src-tauri/design-agent/resources/templates/tdd-master.md @@ -1,4 +1,4 @@ -### C3 TDD 总册模板 +### C3 模板_TDD总册.md(→ templates/tdd-master.md) 本模板是 TDD 总册的参考结构。只建立当前项目实际需要的技术、美术、数据和索引内容;没有对应方向时不创建空分册,复杂项目可以增加施工所需的分册。表格中的示例行可按实际分册、问题和验收项扩展,不代表数量上限。 @@ -48,7 +48,7 @@ | # | 来源件 | 问题 | 去向 | 状态 | |---|---|---|---|---| -| __ | 01/02/03 | __ | 决策卡 / 登记编号 / 分册修订 | __ | +| __ | 01/02/03 | __ | 决策卡 / 台账 id / 分册修订 | __ | (B 级阻断项单独置顶;本视图为临时审阅清单,结论回写各分册与台账。) diff --git a/apps/ai-game-creator-shell/src-tauri/design-agent/resources/templates/tdd-tech.md b/apps/ai-game-creator-shell/src-tauri/design-agent/resources/templates/tdd-tech.md index c7d8db279..166e0aa10 100644 --- a/apps/ai-game-creator-shell/src-tauri/design-agent/resources/templates/tdd-tech.md +++ b/apps/ai-game-creator-shell/src-tauri/design-agent/resources/templates/tdd-tech.md @@ -1,4 +1,4 @@ -### C3 技术实现模板 +### C3 01_技术实现/模板.md(→ templates/tdd-tech.md) 本模板是技术实现的参考结构。按当前运行时、系统复杂度和用户要求选择章节;没有对应系统、界面、输入、音频或存档需求时,删除相应内容,复杂项目可增加施工所需章节。表格和系统条目可按实际实现范围扩展,不代表数量上限。 @@ -58,11 +58,11 @@ - 目录结构:__(承架构层目录映射:入口/场景/系统模块各在哪)。 - 命名与边界:__(文件前缀、模块间允许的调用方向)。 -## 外部依赖与可复用能力 +## 外部库与 skill 引用 | 需求 | 用什么 | 来源与版本 | 实例化参数 | |---|---|---|---| -| __ | __ | 复用能力(记录版本)/ CDN / 手写 | __ | +| __ | __ | `skill@版本` / CDN / 手写 | __ | ## 场景与镜头 diff --git a/apps/ai-game-creator-shell/src-tauri/design-agent/resources/templates/top-design.md b/apps/ai-game-creator-shell/src-tauri/design-agent/resources/templates/top-design.md index 34e884fa5..437fcc545 100644 --- a/apps/ai-game-creator-shell/src-tauri/design-agent/resources/templates/top-design.md +++ b/apps/ai-game-creator-shell/src-tauri/design-agent/resources/templates/top-design.md @@ -1,4 +1,4 @@ -### C1 顶层设计模板 +### C1 模板_顶层设计.md(→ templates/top-design.md) 填写前按项目实际存在的循环、资源、时间层级和用户要求筛选本模板的章节;同类内容可合并,复杂项目可增加必要内容。表格、列表和循环示例按实际内容扩展。 diff --git a/apps/ai-game-creator-shell/src-tauri/design-agent/system-prompt.md b/apps/ai-game-creator-shell/src-tauri/design-agent/system-prompt.md index a701357cf..deb3a18c0 100644 --- a/apps/ai-game-creator-shell/src-tauri/design-agent/system-prompt.md +++ b/apps/ai-game-creator-shell/src-tauri/design-agent/system-prompt.md @@ -13,6 +13,6 @@ 阶段获批后,产物中已经采用的方案作为后续工作的依据,并保留原有决策来源。用户主动质疑或出现新的约束冲突时,再重新讨论相关决定。 -用户说“继续”时,继续推进当前阶段最有价值的工作。在五个策划阶段中,判断本阶段已完成并准备交用户检阅时,应调用 `submit_phase_for_approval` 正式提交审批。 +用户说“继续”时,继续推进当前阶段最有价值的工作。在五个策划阶段中,判断本阶段已完成并准备交用户检阅时,应调用 `submit_phase_for_approval`;只有该工具调用成功,才算正式提交审批。 用户口头表示已经批准或要求进入下一阶段时,先调用 `get_workflow_status` 确认当前阶段;只有该阶段已批准,才进入下一阶段,不得自行推进阶段。 diff --git a/apps/ai-game-creator-shell/src-tauri/src/tests/project_tools.rs b/apps/ai-game-creator-shell/src-tauri/src/tests/project_tools.rs index 7636655ef..8d75193af 100644 --- a/apps/ai-game-creator-shell/src-tauri/src/tests/project_tools.rs +++ b/apps/ai-game-creator-shell/src-tauri/src/tests/project_tools.rs @@ -1011,7 +1011,6 @@ async fn background_agent_runtime_file_delete_confirmation_replans_after_stale_p let replanning_request = receiver .recv_timeout(Duration::from_secs(10)) .expect("same-run replanning request after stale delete approval"); - assert!(replanning_request.contains("design-stale-delete-confirm-run")); assert!(replanning_request.contains("projectRevisionDrift=true")); assert!(replanning_request.contains("旧动作未执行")); diff --git a/apps/ai-game-creator-shell/src-tauri/src/tests/provider.rs b/apps/ai-game-creator-shell/src-tauri/src/tests/provider.rs index 2834c0a52..63a4ac218 100644 --- a/apps/ai-game-creator-shell/src-tauri/src/tests/provider.rs +++ b/apps/ai-game-creator-shell/src-tauri/src/tests/provider.rs @@ -5492,7 +5492,7 @@ async fn background_agent_runtime_repairs_malformed_tool_plan_in_same_run() { let initial_request = receiver .recv_timeout(Duration::from_secs(2)) .expect("initial tool plan request"); - assert!(initial_request.contains(run_id)); + assert!(initial_request.contains("验证 malformed 工具计划可在同一 run 自动修复")); assert!(!initial_request.contains("上一条输出不符合工具计划协议")); assert!(mock_http_request_json(&initial_request)["tools"] .as_array() @@ -5500,7 +5500,6 @@ async fn background_agent_runtime_repairs_malformed_tool_plan_in_same_run() { let repair_request = receiver .recv_timeout(Duration::from_secs(2)) .expect("tool plan repair request"); - assert!(repair_request.contains(run_id)); assert!(repair_request.contains("\"role\":\"assistant\"")); assert!(repair_request.contains("格式损坏")); assert!(repair_request.contains("上一条输出不符合工具计划协议")); diff --git a/apps/ai-game-creator-shell/src-tauri/src/tests/response_stream.rs b/apps/ai-game-creator-shell/src-tauri/src/tests/response_stream.rs index ccb92dcac..4ea9eda6f 100644 --- a/apps/ai-game-creator-shell/src-tauri/src/tests/response_stream.rs +++ b/apps/ai-game-creator-shell/src-tauri/src/tests/response_stream.rs @@ -1957,7 +1957,7 @@ fn finalization_resume_discards_unpersisted_reply_after_revision_drift() { let request = receiver .recv_timeout(Duration::from_secs(2)) .expect("stale prepared finalization must replan"); - assert!(request.contains(run_id)); + assert!(request.contains("丢弃恢复时已经过期的 finalization")); let runtime = wait_for_agent_runtime_idle(&root, "design-director"); assert_eq!(runtime.phase, "completed"); assert_eq!(runtime.run_id, run_id); @@ -2651,11 +2651,11 @@ async fn background_finalization_replans_same_run_after_cross_agent_revision_dri let initial_plan_request = request_receiver .recv_timeout(Duration::from_secs(2)) .expect("initial convergence plan request"); - assert!(initial_plan_request.contains(run_id)); + assert!(initial_plan_request.contains("在当前项目 revision 上验证后给出最终结论")); let stale_final_reply_request = request_receiver .recv_timeout(Duration::from_secs(2)) .expect("blocked stale final reply request"); - assert!(stale_final_reply_request.contains(run_id)); + assert!(stale_final_reply_request.contains("在当前项目 revision 上验证后给出最终结论")); assert!( !game_creator_agent_runtime_task_lock_is_available(&root, "design-director") .expect("inspect lock while final reply is blocked"), @@ -2677,8 +2677,6 @@ async fn background_finalization_replans_same_run_after_cross_agent_revision_dri let replanned_request = request_receiver .recv_timeout(Duration::from_secs(30)) .expect("same run replanning request"); - assert!(replanned_request.contains(run_id)); - assert!(replanned_request.contains(&session_id)); assert!(replanned_request.contains("runtime.verification")); assert!(replanned_request.contains("currentRevision=2")); assert!( @@ -2689,13 +2687,12 @@ async fn background_finalization_replans_same_run_after_cross_agent_revision_dri let verified_request = request_receiver .recv_timeout(Duration::from_secs(10)) .expect("request after current revision verification"); - assert!(verified_request.contains(run_id)); assert!(verified_request.contains("project.verify")); assert!(verified_request.contains("AGENT_RUNTIME_CURRENT_REVISION_OK")); let current_final_reply_request = request_receiver .recv_timeout(Duration::from_secs(30)) .expect("current final reply request"); - assert!(current_final_reply_request.contains(run_id)); + assert!(current_final_reply_request.contains("在当前项目 revision 上验证后给出最终结论")); let runtime = wait_for_agent_runtime_idle(&root, "design-director"); wait_for_provider_handoff_terminal_cleanup(&root, "design-director", run_id); @@ -2830,8 +2827,6 @@ async fn read_only_background_finalization_replans_when_reply_revision_becomes_s let replanned_request = request_receiver .recv_timeout(Duration::from_secs(30)) .expect("read-only same-run replanning request"); - assert!(replanned_request.contains(run_id)); - assert!(replanned_request.contains(&session_id)); assert!(replanned_request.contains("responseRevision=0")); assert!(replanned_request.contains("currentRevision=1")); let runtime = wait_for_agent_runtime_idle(&root, "design-director"); @@ -3024,7 +3019,6 @@ async fn stale_finalization_context_survives_restart_before_same_run_replanning( let replanned_request = request_receiver .recv_timeout(Duration::from_secs(2)) .expect("restart replanning request"); - assert!(replanned_request.contains(run_id)); assert!(replanned_request.contains("currentRevision=2")); let verified_request = request_receiver .recv_timeout(Duration::from_secs(10)) @@ -3033,7 +3027,7 @@ async fn stale_finalization_context_survives_restart_before_same_run_replanning( let final_reply_request = request_receiver .recv_timeout(Duration::from_secs(2)) .expect("restart final reply request"); - assert!(final_reply_request.contains(run_id)); + assert!(final_reply_request.contains("重启后继续验证当前 revision")); let runtime = read_game_creator_agent_runtime_at(&root, "design-director") .expect("read completed restart runtime") diff --git a/docs/project-memory/shared-memory/pitfalls.md b/docs/project-memory/shared-memory/pitfalls.md index d269c8c32..54c8f7deb 100644 --- a/docs/project-memory/shared-memory/pitfalls.md +++ b/docs/project-memory/shared-memory/pitfalls.md @@ -1,5 +1,9 @@ # 踩坑与排障记录 +## 策划 Agent 提示词中的相对路径不要当作内部实现删去 + +`project/...` 是 Agent 读写策划工作区的目标路径,`resources/...` 是查找内置分册、模板和例子的资源定位;即使阶段上下文也注入了同一产物路径,提示词里的路径仍是 Agent 需要的契约。清理宿主实现细节时不要误删这些相对路径,具体用法见[策划 Agent 路径说明](../../technical/【技术方案】策划Agent生产迁移与工作区浏览-2026-09-10.md#6-阶段与提示词注入)。 + ## AGC 素材直传的 OSS 权限必须同步到 Native shell 契约检查 - **现象**:Native shell CI 在 `check:native-shells:contract` 的 HTTP scope 检查失败,尚未准备 Rust 缓存;后续导出步骤正常退出但实际跳过,导致 master 缓存产物缺组、自动镜像刷新等待。 diff --git a/docs/technical/【技术方案】策划Agent生产迁移与工作区浏览-2026-09-10.md b/docs/technical/【技术方案】策划Agent生产迁移与工作区浏览-2026-09-10.md index 5aae2efe7..ecbb3008a 100644 --- a/docs/technical/【技术方案】策划Agent生产迁移与工作区浏览-2026-09-10.md +++ b/docs/technical/【技术方案】策划Agent生产迁移与工作区浏览-2026-09-10.md @@ -276,6 +276,13 @@ concept → top_design → architecture → systems → tdd → consultant `systems: []` 是已确定的行为,不是迁移时需要补齐的缺口。`project/analysis.md`、`project/决策台账.md`、`project/dialog.md` 保持原型中的共享过程文件口径,不升级为新的审批必需项。速览卡保留原型结构提示,但 Runtime 与 UI 不解析其章节或内容字段。 +提示词中的路径是策划 Agent 使用的相对路径约定: + +- `project/...` 以策划工作区为根,Agent 将其传给 `read_file`、`write_file`、`patch_file` 等文件工具来读取和维护正式产物及过程文件。宿主将它映射到项目的 `design_artifacts/project/...`;阶段审批按登记的相对路径检查必需产物。提示词写明 `project/速览卡.md`、`project/analysis.md` 等目标位置,是在告诉 Agent 文件应写在哪里,并非泄露宿主绝对路径。 +- `resources/skills/...`、`resources/templates/...`、`resources/exemplars/...` 和 `resources/modules/system-types/...` 指向随应用发布的固定策划资源包,用于定位分册、模板、例子及系统类型资料,不是策划工作区的写入目标。资源目录在 `resources/catalog.json` 中登记相对路径与资源 ID;Agent 可用 `list_resources` 查 ID,再用 `read_resource` 按 ID 读取。分册中省略 `resources/` 前缀的 `templates/...` 等写法仍指同一资源包内的位置。 + +这些路径直接服务于 Agent 的文件操作和资源查阅,属于提示词应保留的契约;即使阶段上下文也注入了某条产物路径,分册和模板中的路径仍提供目标文件与交叉引用的具体定位。去除客户端与宿主实现细节时,不应把这类相对路径当作意外暴露的内部实现;宿主安装目录、项目绝对路径及会话控制文件位置才不属于 Agent 的操作输入。 + 过程文档记录关键依据、决定和待办,不要求实时完整,也不应重复正式设计文档;阶段提交前补齐影响验收的关键记录。顶层设计的分册、模板和示例保留核心定位及按需说明的易混淆方向与排除理由,不强制使用固定的“不是 X,而是 Y”句式。 进入下一阶段必须由用户批准触发。Runtime 推进后向 Agent 追加明确的用户行为语义,例如“用户已批准上一阶段,现在进入顶层设计阶段”,避免 Agent 误认为 Runtime 自行推进。 From 8dc0da4608102e7e75d93b1ee80c43657b016b67 Mon Sep 17 00:00:00 2001 From: kdletters Date: Wed, 23 Sep 2026 14:47:43 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E5=AE=8C=E5=96=84=20AGC=20=E5=8F=91?= =?UTF-8?q?=E5=B8=83=E5=89=8D=E5=8E=9F=E5=9E=8B=E9=97=A8=E7=A6=81=E4=B8=8E?= =?UTF-8?q?=E8=BF=9B=E5=BA=A6=E5=BC=B9=E7=AA=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 发布前校验可运行原型,未完成时禁止触发用户项目构建 缺失发布说明时自动生成 exports/README.md 移除发布流程的聊天确认卡,新增全屏发布进度弹窗 补充前后端回归测试与项目决策文档 --- .../src-tauri/src/project/export.rs | 78 +++++- .../src-tauri/src/tests/project.rs | 90 ++++++- apps/ai-game-creator-shell/src/App.tsx | 162 ++++++------ .../GamePublishProgressDialog.tsx | 58 +++++ apps/ai-game-creator-shell/src/styles.css | 82 ++++++ .../tests/gamePublishFeedback.test.tsx | 241 +++++++++--------- .../shared-memory/decision-log.md | 7 + ...案】AI游戏创作智能体App实施计划-2026-06-24.md | 2 +- 8 files changed, 499 insertions(+), 221 deletions(-) create mode 100644 apps/ai-game-creator-shell/src/components/game-distribution/GamePublishProgressDialog.tsx diff --git a/apps/ai-game-creator-shell/src-tauri/src/project/export.rs b/apps/ai-game-creator-shell/src-tauri/src/project/export.rs index 214b3f16d..6b66c9420 100644 --- a/apps/ai-game-creator-shell/src-tauri/src/project/export.rs +++ b/apps/ai-game-creator-shell/src-tauri/src/project/export.rs @@ -27,15 +27,7 @@ pub(crate) fn export_local_project_package_at( ) -> Result { validate_project_root(root)?; super::verification::validate_project_game_entry(root)?; - ensure_project_export_package_dir(root, "exports")?; - let readme_path = resolve_local_project_path(root, "exports/README.md")?; - if !readme_path.is_file() { - return Err("导出试玩包前需要先生成 exports/README.md".to_string()); - } - let readme_metadata = checked_export_package_metadata(&readme_path, "exports/README.md")?; - if !readme_metadata.is_file() { - return Err("导出试玩包前需要先生成 exports/README.md".to_string()); - } + ensure_project_export_readme(root)?; let files = collect_project_export_package_files(root)?; let total_bytes = files.iter().map(|(_, _, size)| *size).sum::(); @@ -140,6 +132,20 @@ pub(crate) fn export_local_project_package_at( /// 给足时间但必须有界),避免发布路径越过校验器允许的区间。 pub(crate) const PUBLISH_BUILD_TIMEOUT_SECONDS: u64 = 300; +fn project_has_runnable_prototype(manifest: &GameCreationAppManifest) -> bool { + let has_completed_prototype_task = manifest.tasks.iter().any(|task| { + task.id == "code-prototype" && task.status == GameCreationAppTaskStatus::Completed + }); + let has_running_preview = manifest.preview.as_ref().is_some_and(|preview| { + preview.status == GameCreationAppPreviewStatus::Running + && preview + .url + .as_deref() + .is_some_and(|url| !url.trim().is_empty()) + }); + has_completed_prototype_task || has_running_preview +} + /// 找到声明了 `scripts.build` 的 npm 工作目录(项目根或 `game/` 子工程)。 /// /// 只读 `package.json`,不执行任何东西;真正的执行交给 `project.verify` 的受控 @@ -256,6 +262,12 @@ pub(crate) async fn export_local_project_package_for_publish_at( if validate_project_game_entry(root).is_ok() { return export_local_project_package_at(root); } + let manifest = read_manifest_for_project(root)?; + if !project_has_runnable_prototype(&manifest) { + return Err( + "首个可运行原型尚未完成,暂不能发布;请先完成可运行原型并通过运行验证。".to_string(), + ); + } let plan = resolve_publish_build_plan(root)?; // `game/` 子工程构建前必须先有依赖:缺 node_modules 时由发布流程自己补一次安装, // 否则作者要点两次(先 bootstrap 再发布)。 @@ -477,6 +489,54 @@ pub(crate) fn list_local_project_export_packages_at( }) } +/// 发布导出前确保 `exports/README.md` 存在。 +/// +/// 缺失时按项目 manifest 生成最小发布说明;已有文件原样保留,避免覆盖作者或 Agent 的正式文案。 +/// README 本身仍沿用试玩包的普通文件 / 符号链接安全口径。 +fn ensure_project_export_readme(root: &Path) -> Result { + let readme_path = resolve_local_project_path(root, "exports/README.md")?; + match fs::symlink_metadata(&readme_path) { + Ok(metadata) => { + if metadata.file_type().is_symlink() { + return Err("试玩包不能包含符号链接:exports/README.md".to_string()); + } + if !metadata.is_file() { + return Err("exports/README.md 必须是普通文件".to_string()); + } + } + Err(error) if error.kind() == std::io::ErrorKind::NotFound => { + let manifest = read_manifest_for_project(root)?; + let content = render_project_export_readme(&manifest); + write_game_creator_private_file(&readme_path, content.as_bytes(), "试玩包发布说明")?; + } + Err(error) => { + return Err(format!( + "读取 exports/README.md 元数据失败:{}: {error}", + readme_path.display() + )); + } + } + Ok(readme_path) +} + +fn render_project_export_readme(manifest: &GameCreationAppManifest) -> String { + let title = manifest.name.trim(); + let title = if title.is_empty() { + "试玩游戏" + } else { + title + }; + let summary = manifest + .goal + .as_deref() + .map(str::trim) + .filter(|value| !value.is_empty()) + .unwrap_or("这是一个可直接在浏览器中试玩的游戏原型。"); + format!( + "# {title} 试玩说明\n\n## 简介\n\n{summary}\n\n## 试玩方式\n\n- 解压试玩包后打开根目录的 `index.html`。\n- 使用游戏内提示开始试玩。\n\n## 反馈\n\n请记录问题发生步骤、预期结果和实际结果,便于快速定位。\n" + ) +} + pub(crate) fn collect_project_export_package_files( root: &Path, ) -> Result, String> { diff --git a/apps/ai-game-creator-shell/src-tauri/src/tests/project.rs b/apps/ai-game-creator-shell/src-tauri/src/tests/project.rs index 9b0f1a480..4a1a034fb 100644 --- a/apps/ai-game-creator-shell/src-tauri/src/tests/project.rs +++ b/apps/ai-game-creator-shell/src-tauri/src/tests/project.rs @@ -4018,6 +4018,12 @@ writeFileSync('dist/assets/app.js', 'document.documentElement.dataset.autoBuild "#, ) .expect("write build script"); + update_manifest_task_status_at( + &root, + "code-prototype", + GameCreationAppTaskStatus::Completed, + ) + .expect("mark prototype completed"); write_local_project_file_at(&root, "exports/README.md", "publish notes").expect("write readme"); let result = export_local_project_package_for_publish_at(&root) @@ -4045,13 +4051,21 @@ async fn publish_export_skips_build_when_playable_entry_exists() { .expect("project init"); write_local_project_file_at(&root, "game/index.html", &fake_llm_game_draft().game_html) .expect("write playable html"); - write_local_project_file_at(&root, "exports/README.md", "publish notes").expect("write readme"); let result = export_local_project_package_for_publish_at(&root) .await - .expect("已有可玩入口时直接导出"); + .expect("已有可玩入口且缺少 README 时应自动生成并直接导出"); assert!(result.package_relative_path.ends_with(".zip")); + let readme = fs::read_to_string(root.join("exports/README.md")).expect("read generated readme"); + assert!(readme.contains("# 已构建发布项目 试玩说明"), "{readme}"); + let payload = read_local_project_export_package_at(&root, &result.package_relative_path) + .expect("read publishable package"); + assert!(payload.files.iter().any(|file| file.path == "index.html")); + assert!(payload + .files + .iter() + .any(|file| file.path == "exports/README.md")); let log = fs::read_to_string(root.join(".agent/logs/command.log")).unwrap_or_default(); assert!( !log.contains("project.verify build"), @@ -4061,11 +4075,56 @@ async fn publish_export_skips_build_when_playable_entry_exists() { fs::remove_dir_all(root).ok(); } +#[tokio::test] +async fn publish_export_blocks_build_until_runnable_prototype_is_completed() { + let root = unique_project_path(); + init_local_game_project_at(&root, "project-prototype-pending", "原型未完成项目") + .expect("project init"); + fs::write( + root.join("package.json"), + serde_json::to_string_pretty(&serde_json::json!({ + "name": "publish-prototype-pending-fixture", + "private": true, + "scripts": { "build": "node build-should-not-run.mjs" } + })) + .expect("serialize package json"), + ) + .expect("write package json"); + fs::write( + root.join("build-should-not-run.mjs"), + "import { writeFileSync } from 'node:fs'; writeFileSync('build-ran.txt', 'yes');", + ) + .expect("write build marker script"); + + let error = export_local_project_package_for_publish_at(&root) + .await + .expect_err("原型未完成时禁止触发用户项目构建"); + + assert!( + error.contains("首个可运行原型尚未完成"), + "错误应说明原型未完成:{error}" + ); + assert!(!root.join("build-ran.txt").exists()); + let log = fs::read_to_string(root.join(".agent/logs/command.log")).unwrap_or_default(); + assert!( + !log.contains("project.verify build"), + "原型未完成时不应执行项目构建:{log}" + ); + + fs::remove_dir_all(root).ok(); +} + #[tokio::test] async fn publish_export_reports_actionable_error_without_entry_or_build_script() { let root = unique_project_path(); init_local_game_project_at(&root, "project-no-entry", "缺少可玩入口项目") .expect("project init"); + update_manifest_task_status_at( + &root, + "code-prototype", + GameCreationAppTaskStatus::Completed, + ) + .expect("mark prototype completed"); // 脚手架默认带 build 脚本;这里改成只有 check 脚本,模拟“没有可玩产物且没有构建脚本”。 fs::write( root.join("game/package.json"), @@ -4103,6 +4162,10 @@ fn local_project_export_package_publish_payload_contains_bytes_and_file_digests( write_local_project_file_at(&root, "exports/README.md", "publish notes").expect("write readme"); let exported = export_local_project_package_at(&root).expect("export package"); + assert_eq!( + fs::read_to_string(root.join("exports/README.md")).unwrap(), + "publish notes" + ); let payload = read_local_project_export_package_at(&root, &exported.package_relative_path) .expect("read publish payload"); @@ -4251,18 +4314,29 @@ fn local_project_export_package_rejects_symlink_runtime_dirs_and_readme() { } #[test] -fn local_project_export_package_requires_playable_html_and_readme() { +fn local_project_export_package_generates_missing_readme_after_playable_html() { let root = unique_project_path(); init_existing_html_project_at(&root, "project-1", "像素动作原型").expect("project init"); - let missing_readme = + let missing_entry = export_local_project_package_at(&root).expect_err("default html is not playable"); - assert!(missing_readme.contains("游戏入口必须包含可渲染画布")); + assert!(missing_entry.contains("游戏入口必须包含可渲染画布")); write_local_project_file_at(&root, "game/index.html", &fake_llm_game_draft().game_html) .expect("write playable html"); - let missing_readme = - export_local_project_package_at(&root).expect_err("readme should be required"); - assert!(missing_readme.contains("exports/README.md")); + fs::remove_dir_all(root.join("exports")).expect("remove exports dir"); + + let exported = + export_local_project_package_at(&root).expect("missing readme should be generated"); + let readme = fs::read_to_string(root.join("exports/README.md")).expect("read generated readme"); + assert!(readme.contains("# 像素动作原型 试玩说明"), "{readme}"); + assert!(readme.contains("解压试玩包后打开根目录"), "{readme}"); + + let payload = read_local_project_export_package_at(&root, &exported.package_relative_path) + .expect("read generated package"); + assert!(payload + .files + .iter() + .any(|file| file.path == "exports/README.md")); fs::remove_dir_all(root).ok(); } diff --git a/apps/ai-game-creator-shell/src/App.tsx b/apps/ai-game-creator-shell/src/App.tsx index d3f1a814a..0351188c0 100644 --- a/apps/ai-game-creator-shell/src/App.tsx +++ b/apps/ai-game-creator-shell/src/App.tsx @@ -48,6 +48,10 @@ import type { TauriInvoke, } from './app/types'; import { GameDistributionPublishPanel } from './components/game-distribution/GameDistributionPublishPanel'; +import { + GamePublishProgressDialog, + type GamePublishProgressState, +} from './components/game-distribution/GamePublishProgressDialog'; import { agentConversationId, agentRuntimeStateFromResult, @@ -368,6 +372,8 @@ export function App({ const [publishPackageResult, setPublishPackageResult] = useState(null); const [publishPanelOpen, setPublishPanelOpen] = useState(false); + const [publishProgress, setPublishProgress] = + useState(null); // 发布灰度:只有命中的账号才把「发布到游戏广场」入口交给聊天头;读取失败按不开放处理。 const [gamePublishAllowed, setGamePublishAllowed] = useState(false); const [projectChatError, setProjectChatError] = useState(''); @@ -1126,40 +1132,6 @@ export function App({ } } - async function queueProjectPolicyConfirmationIfNeeded( - invoke: TauriInvoke, - commandId: GameCreationAppCommandDescriptor['id'], - projectPath: string, - detail: string, - readyMessage: string, - onConfirm: () => void, - ) { - const policyView = await invoke( - 'read_project_permission_policy', - { projectPath }, - ); - if (policyView.policy.deniedCommands.includes(commandId)) { - const message = `项目权限策略拒绝执行:${commandId}`; - markProjectPolicyDenied(commandId, message); - setMessages((current) => [ - ...current, - { role: 'assistant', text: message }, - ]); - directProjectChatRef.current?.announce(message); - return true; - } - if (!policyView.policy.confirmCommands.includes(commandId)) { - return false; - } - requestProjectPolicyConfirmation(commandId, projectPath, detail, onConfirm); - setMessages((current) => [ - ...current, - { role: 'assistant', text: readyMessage }, - ]); - directProjectChatRef.current?.announce(readyMessage); - return true; - } - async function denyPendingCommandIfNeeded( commandId: GameCreationAppCommandDescriptor['id'], projectPath: string | null, @@ -1206,8 +1178,8 @@ export function App({ /** * 导出试玩包并打开发布面板。 * - * 权限口径沿用本地命令:`project.export_package` 需要确认时先入队,确认后再导出; - * 导出结果只留在壳里,发布面板关闭即丢弃,不写入项目。 + * 发布不再走旧的聊天确认卡:点击后立即打开全屏进度弹窗并锁住工作区, + * 导出失败在弹窗内回显;成功后才切换到发布资料面板。 */ /** * 发布相关提示同时写工作台状态与 DirectProject 对话。 @@ -1232,52 +1204,42 @@ export function App({ announcePublishMessage('先打开一个项目再发布'); return; } - // 权限查询也可能慢或挂住,先回一条即时反馈,别让按钮看起来没反应。 - announcePublishMessage('正在检查发布权限…'); - const runExport = async () => { - // 导出可能包含构建步骤,再回一条即时反馈。 - announcePublishMessage('正在构建并打包试玩包,请稍候…'); - try { - const result = await invoke( - 'export_local_project_package', - { projectPath: nextProjectPath }, - ); - announcePublishMessage( - `已构建并打包试玩包:${result.packageRelativePath}`, - ); - setPublishPackageResult(result); - setPublishPanelOpen(true); - appendLocalPermissionLog( - nextProjectPath, - 'command.auto', - 'project.export_package', - ); - } catch (error) { - announcePublishMessage( - error instanceof Error ? error.message : String(error), - ); - } - }; - try { - const queued = await queueProjectPolicyConfirmationIfNeeded( - invoke, - 'project.export_package', - nextProjectPath, - '导出试玩包并打开「发布到游戏广场」面板。', - '导出试玩包需要确认,确认后继续。', - () => void runExport(), - ); - if (!queued) { - await runExport(); - } - } catch (error) { - // 权限查询失败也必须回话:onClick 的 Promise 没有 catch 时用户只会看到 - // 「点了没反应」,这里把它收敛成聊天里的可读错误。 + const publishManifest = manifestRef.current; + const hasCompletedPrototype = publishManifest.tasks.some( + (task) => task.id === 'code-prototype' && task.status === 'completed', + ); + const hasRunningPreview = + publishManifest.preview?.status === 'running' && + Boolean(publishManifest.preview.url?.trim()); + if (!hasCompletedPrototype && !hasRunningPreview) { announcePublishMessage( - `发布前权限检查失败:${ - error instanceof Error ? error.message : String(error) - }`, + '首个可运行原型尚未完成,暂不能发布;请先完成可运行原型并通过运行验证。', ); + return; + } + setPublishProgress({ + phase: 'running', + message: '正在构建并打包试玩包,请稍候…', + }); + try { + const result = await invoke( + 'export_local_project_package', + { projectPath: nextProjectPath }, + ); + setPublishProgress(null); + setPublishPackageResult(result); + setPublishPanelOpen(true); + appendLocalPermissionLog( + nextProjectPath, + 'command.auto', + 'project.export_package', + ); + } catch (error) { + setPublishProgress({ + phase: 'failed', + message: '发布失败', + detail: error instanceof Error ? error.message : String(error), + }); } } @@ -1723,20 +1685,40 @@ export function App({ return true; } try { - const paused = await queueProjectPolicyConfirmationIfNeeded( - invoke, + const policyView = await invoke( + 'read_project_permission_policy', + { projectPath: input.projectPath }, + ); + if (policyView.policy.deniedCommands.includes('conversation.write')) { + const message = '项目权限策略拒绝执行:conversation.write'; + markProjectPolicyDenied('conversation.write', message); + setMessages((current) => [ + ...current, + { role: 'assistant', text: message }, + ]); + directProjectChatRef.current?.announce(message); + return false; + } + if (!policyView.policy.confirmCommands.includes('conversation.write')) { + projectConversationWriteConfirmedRef.current = input.projectPath; + return true; + } + requestProjectPolicyConfirmation( 'conversation.write', input.projectPath, '写入 DirectProject 对话历史', - 'DirectProject 对话写入需要确认。', () => { projectConversationWriteConfirmedRef.current = input.projectPath; input.onConfirmed(); }, ); - if (paused) return false; - projectConversationWriteConfirmedRef.current = input.projectPath; - return true; + const message = 'DirectProject 对话写入需要确认。'; + setMessages((current) => [ + ...current, + { role: 'assistant', text: message }, + ]); + directProjectChatRef.current?.announce(message); + return false; } catch (error) { if (localProjectPathRef.current === input.projectPath) { setProjectChatError( @@ -2351,6 +2333,10 @@ export function App({ packageResult={publishPackageResult} onClose={() => setPublishPanelOpen(false)} /> + setPublishProgress(null)} + /> ); } @@ -2502,6 +2488,10 @@ export function App({ packageResult={publishPackageResult} onClose={() => setPublishPanelOpen(false)} /> + setPublishProgress(null)} + /> ); } diff --git a/apps/ai-game-creator-shell/src/components/game-distribution/GamePublishProgressDialog.tsx b/apps/ai-game-creator-shell/src/components/game-distribution/GamePublishProgressDialog.tsx new file mode 100644 index 000000000..b784c2b9d --- /dev/null +++ b/apps/ai-game-creator-shell/src/components/game-distribution/GamePublishProgressDialog.tsx @@ -0,0 +1,58 @@ +import { CircleAlert, LoaderCircle } from 'lucide-react'; + +import { ThemedModal } from '../modal/ThemedModal'; + +export type GamePublishProgressState = + | { + phase: 'running'; + message: string; + } + | { + phase: 'failed'; + message: string; + detail: string; + }; + +export function GamePublishProgressDialog({ + progress, + onClose, +}: { + progress: GamePublishProgressState | null; + onClose: () => void; +}) { + const failed = progress?.phase === 'failed'; + return ( + + +

{failed ? '发布失败' : '正在发布'}

+

+ {failed ? progress.detail : progress?.message} +

+ {failed ? ( + + ) : ( + 发布完成前请保持客户端开启,页面暂时不可操作。 + )} +
+ ); +} diff --git a/apps/ai-game-creator-shell/src/styles.css b/apps/ai-game-creator-shell/src/styles.css index 41a36fceb..75c0b2d0e 100644 --- a/apps/ai-game-creator-shell/src/styles.css +++ b/apps/ai-game-creator-shell/src/styles.css @@ -9588,6 +9588,88 @@ iframe.preview-frame { gap: 4px; } +.game-publish-progress-overlay { + position: fixed; + z-index: 500; + inset: 0; + background: rgb(35 24 19 / 62%); + backdrop-filter: blur(3px); + pointer-events: auto; +} + +.game-publish-progress-dialog { + display: grid; + width: min(440px, calc(100vw - 40px)); + outline: none; + justify-items: center; + gap: 12px; + padding: 28px; + border: 1px solid #e4c8ba; + border-radius: 18px; + box-shadow: 0 24px 64px rgb(62 37 27 / 28%); + text-align: center; +} + +.game-publish-progress-dialog h2, +.game-publish-progress-dialog p, +.game-publish-progress-dialog small { + margin: 0; +} + +.game-publish-progress-dialog h2 { + font-size: 18px; +} + +.game-publish-progress-dialog p, +.game-publish-progress-dialog small { + color: #8f7367; + font-size: 12px; +} + +.game-publish-progress-dialog p[role='alert'] { + max-height: 180px; + overflow: auto; + color: #a33f2a; + text-align: left; + white-space: pre-wrap; +} + +.game-publish-progress-icon { + display: grid; + width: 52px; + height: 52px; + border-radius: 16px; + background: #f6dfd0; + color: #c7653d; + place-items: center; +} + +.game-publish-progress-icon.is-failed { + background: #f8d8d0; + color: #b43c25; +} + +.game-publish-progress-icon .is-spinning { + animation: app-update-spin 0.9s linear infinite; +} + +.game-publish-progress-dialog button { + min-width: 96px; + padding: 8px 16px; + border: 0; + border-radius: 8px; + outline: none; + background: #c7653d; + box-shadow: 0 0 0 0 rgb(199 101 61 / 0%); + color: #fff; + cursor: pointer; + font-weight: 700; +} + +.game-publish-progress-dialog button:focus-visible { + box-shadow: 0 0 0 3px rgb(199 101 61 / 28%); +} + .game-approval-backdrop { position: fixed; top: var(--window-chrome-height); diff --git a/apps/ai-game-creator-shell/tests/gamePublishFeedback.test.tsx b/apps/ai-game-creator-shell/tests/gamePublishFeedback.test.tsx index baa020d5b..a05b8ce65 100644 --- a/apps/ai-game-creator-shell/tests/gamePublishFeedback.test.tsx +++ b/apps/ai-game-creator-shell/tests/gamePublishFeedback.test.tsx @@ -2,9 +2,11 @@ /** * 客户端「发布」入口的可见反馈。 * - * DirectProject 项目不发工作台状态行,发布动作的提示必须回到项目对话; - * 权限要求确认时也要在聊天里给出确认/取消,否则表现就是「点了没反应」。 + * 发布动作使用独立的全屏进度弹窗,不回到旧的聊天确认卡片; + * 失败必须留在弹窗内可见,成功后自动切换到发布资料面板。 */ +import { readFileSync } from 'node:fs'; + import { beforeEach, describe, it, vi } from 'vitest'; import type { GameCreationAppManifest } from '../../../packages/shared/src/contracts/gameCreationApp'; @@ -20,6 +22,12 @@ import { waitFor, within, } from './appSurface/harness'; +import { repoPath } from './repoPath'; +import { + declaration, + parseStyleSheet, + resolveDeclarations, +} from './styleCascade'; const readGamePublishAvailabilityMock = vi.hoisted(() => vi.fn(async () => true), @@ -39,18 +47,41 @@ vi.mock('../src/services/gameDistributionPublish', async (importOriginal) => { const PROJECT_PATH = '/tmp/game-publish-feedback-project'; const PROJECT_ID = 'game-publish-feedback-project'; +function withPrototypeStatus( + manifest: GameCreationAppManifest, + status: 'pending' | 'completed', +): GameCreationAppManifest { + return { + ...manifest, + tasks: manifest.tasks.map((task) => + task.id === 'code-prototype' ? { ...task, status } : task, + ), + }; +} + function createFixtureManifest(): GameCreationAppManifest { - return createGameCreationAppManifest(PROJECT_ID, '发布反馈项目'); + return withPrototypeStatus( + createGameCreationAppManifest(PROJECT_ID, '发布反馈项目'), + 'completed', + ); +} + +function createPendingPrototypeManifest(): GameCreationAppManifest { + return withPrototypeStatus( + createGameCreationAppManifest(PROJECT_ID, '原型未完成项目'), + 'pending', + ); } function installTauri( options: { exportPackage?: () => unknown; + manifest?: GameCreationAppManifest; policy?: ReturnType; readPolicy?: () => unknown; } = {}, ) { - const manifest = createFixtureManifest(); + const manifest = options.manifest ?? createFixtureManifest(); const chatHarness = createProjectChatRuntimeHarness({ projectPath: PROJECT_PATH, }); @@ -82,12 +113,11 @@ function installTauri( return { invoke }; } -function renderPublishProject() { +function renderPublishProject( + manifest: GameCreationAppManifest = createFixtureManifest(), +) { return render( - , + , ); } @@ -125,76 +155,115 @@ function createConfirmPolicy() { }; } +function createDeferred() { + let resolve!: (value: T) => void; + let reject!: (reason?: unknown) => void; + const promise = new Promise((resolvePromise, rejectPromise) => { + resolve = resolvePromise; + reject = rejectPromise; + }); + return { promise, resolve, reject }; +} + describe('客户端发布入口的可见反馈', () => { - it('导出成功时先回即时反馈,再回结果并打开发布面板', async () => { - installTauri({ exportPackage: createExportPackageResult }); - renderPublishProject(); + it('首个可运行原型未完成时直接阻止发布,不触发用户项目构建', async () => { + const exportPackage = vi.fn(createExportPackageResult); + const manifest = createPendingPrototypeManifest(); + installTauri({ exportPackage, manifest }); + + renderPublishProject(manifest); const surface = await clickPublish(); await waitFor(() => { - expect(surface.textContent ?? '').toContain('正在检查发布权限…'); expect(surface.textContent ?? '').toContain( - '正在构建并打包试玩包,请稍候…', - ); - expect(surface.textContent ?? '').toContain( - '已构建并打包试玩包:exports/game.zip', + '首个可运行原型尚未完成,暂不能发布', ); }); + expect(surface.textContent ?? '').not.toContain('正在检查发布权限…'); + expect(exportPackage).not.toHaveBeenCalled(); + }); + + it('发布时显示全屏进度遮罩,成功后收起进度并打开发布面板', async () => { + const deferred = + createDeferred>(); + const exportPackage = vi.fn(() => deferred.promise); + installTauri({ exportPackage }); + renderPublishProject(); + + fireEvent.click( + await screen.findByRole('button', { name: '发布到游戏广场' }), + ); + + const progressDialog = await screen.findByRole('dialog', { + name: '发布进度', + }); + expect(progressDialog.textContent ?? '').toContain( + '正在构建并打包试玩包,请稍候…', + ); + expect(progressDialog.textContent ?? '').toContain( + '发布完成前请保持客户端开启,页面暂时不可操作。', + ); + expect( + progressDialog.closest('.game-publish-progress-overlay'), + ).not.toBeNull(); + expect(exportPackage).toHaveBeenCalledTimes(1); + expect(screen.queryByText('导出试玩包需要确认,确认后继续。')).toBeNull(); + + deferred.resolve(createExportPackageResult()); + await waitFor(() => { + expect(screen.queryByRole('dialog', { name: '发布进度' })).toBeNull(); + }); expect( await screen.findByRole('dialog', { name: '发布到游戏广场' }), ).not.toBeNull(); }); - it('导出失败时把可读错误写回项目对话', async () => { + it('发布失败时在进度弹窗里显示错误并允许关闭', async () => { installTauri({ exportPackage: () => { - throw new Error('导出试玩包前需要先生成 exports/README.md'); + throw new Error('构建可玩版本失败:缺少入口'); }, }); renderPublishProject(); - const surface = await clickPublish(); + fireEvent.click( + await screen.findByRole('button', { name: '发布到游戏广场' }), + ); + + const failureDialog = await screen.findByRole('dialog', { + name: '发布失败', + }); + expect(failureDialog.textContent ?? '').toContain( + '构建可玩版本失败:缺少入口', + ); + fireEvent.click( + within(failureDialog).getByRole('button', { name: '关闭' }), + ); await waitFor(() => { - expect(surface.textContent ?? '').toContain( - '导出试玩包前需要先生成 exports/README.md', - ); + expect(screen.queryByRole('dialog', { name: '发布失败' })).toBeNull(); }); }); - it('策略要求确认时在 DirectProject 里展示确认卡片,确认后继续导出', async () => { - const exportPackage = vi.fn(createExportPackageResult); - installTauri({ exportPackage, policy: createConfirmPolicy() }); - renderPublishProject(); - - const publish = await screen.findByRole('button', { - name: '发布到游戏广场', - }); - fireEvent.click(publish); - - const commandLabel = await screen.findByText('project.export_package'); - const card = commandLabel.closest('.pending-command'); - expect(card).not.toBeNull(); - expect(exportPackage).not.toHaveBeenCalled(); - expect( - within(card as HTMLElement).getByText( - '导出试玩包并打开「发布到游戏广场」面板。', + it('发布进度遮罩固定覆盖整个工作区并压暗背景', () => { + const rules = parseStyleSheet( + readFileSync( + repoPath('apps/ai-game-creator-shell/src/styles.css'), + 'utf8', ), - ).not.toBeNull(); - - fireEvent.click( - within(card as HTMLElement).getByRole('button', { name: '确认' }), ); - await waitFor(() => expect(exportPackage).toHaveBeenCalledTimes(1)); - const surface = await screen.findByLabelText('陶泥儿项目对话'); - expect(surface.textContent ?? '').toContain( - '正在构建并打包试玩包,请稍候…', - ); - expect(surface.textContent ?? '').toContain( - '已构建并打包试玩包:exports/game.zip', + const overlay = resolveDeclarations( + rules, + ['.game-publish-progress-overlay'], + 1440, ); + expect(declaration(overlay, 'position')).toBe('fixed'); + expect(declaration(overlay, 'inset')).toBe('0'); + expect(declaration(overlay, 'z-index')).toBe('500'); + expect(declaration(overlay, 'pointer-events')).toBe('auto'); + expect(declaration(overlay, 'background')).toBe('rgb(35 24 19 / 62%)'); }); - it('取消权限确认时把取消结果写回项目对话', async () => { + it('策略要求确认时不再回到聊天确认卡片,直接进入进度弹窗', async () => { const exportPackage = vi.fn(createExportPackageResult); installTauri({ exportPackage, policy: createConfirmPolicy() }); renderPublishProject(); @@ -202,71 +271,9 @@ describe('客户端发布入口的可见反馈', () => { fireEvent.click( await screen.findByRole('button', { name: '发布到游戏广场' }), ); - const commandLabel = await screen.findByText('project.export_package'); - const card = commandLabel.closest('.pending-command'); - expect(card).not.toBeNull(); - fireEvent.click( - within(card as HTMLElement).getByRole('button', { name: '取消' }), - ); - const surface = await screen.findByLabelText('陶泥儿项目对话'); - await waitFor(() => { - expect(surface.textContent ?? '').toContain('已取消导出本地试玩包'); - }); - expect(exportPackage).not.toHaveBeenCalled(); - }); - - it('确认时策略已改为拒绝,也要把拒绝原因写回项目对话', async () => { - const exportPackage = vi.fn(createExportPackageResult); - let denyOnNextPolicyRead = false; - installTauri({ - exportPackage, - readPolicy: () => { - if (!denyOnNextPolicyRead) return createConfirmPolicy(); - return { - path: '.agent/policy.json', - policy: { - deniedCommands: ['project.export_package'], - confirmCommands: [], - }, - }; - }, - }); - renderPublishProject(); - - fireEvent.click( - await screen.findByRole('button', { name: '发布到游戏广场' }), - ); - const commandLabel = await screen.findByText('project.export_package'); - const card = commandLabel.closest('.pending-command'); - expect(card).not.toBeNull(); - denyOnNextPolicyRead = true; - fireEvent.click( - within(card as HTMLElement).getByRole('button', { name: '确认' }), - ); - - const surface = await screen.findByLabelText('陶泥儿项目对话'); - await waitFor(() => { - expect(surface.textContent ?? '').toContain( - '项目权限策略拒绝执行:project.export_package', - ); - }); - expect(exportPackage).not.toHaveBeenCalled(); - }); - - it('权限查询失败时也在项目对话里回显错误', async () => { - installTauri({ - readPolicy: () => { - throw new Error('策略文件损坏'); - }, - }); - renderPublishProject(); - - const surface = await clickPublish(); - await waitFor(() => { - expect(surface.textContent ?? '').toContain( - '发布前权限检查失败:策略文件损坏', - ); - }); + await waitFor(() => expect(exportPackage).toHaveBeenCalledTimes(1)); + expect(screen.queryByText('project.export_package')).toBeNull(); + expect(screen.queryByText('导出试玩包需要确认,确认后继续。')).toBeNull(); }); }); diff --git a/docs/project-memory/shared-memory/decision-log.md b/docs/project-memory/shared-memory/decision-log.md index e35ac4bff..f1b42991f 100644 --- a/docs/project-memory/shared-memory/decision-log.md +++ b/docs/project-memory/shared-memory/decision-log.md @@ -1,5 +1,12 @@ # 决策记录 +## 2026-09-23 AGC 发布前先守可运行原型门禁 + +- 背景:客户端已经显示“首个可运行原型尚未完成,运行视图暂不可用”,但发布入口仍会先执行用户项目的 `build`,导致未完成原型也进入构建并在后续失败。 +- 决策:`project.export_package` 的发布专用导出链路先检查可玩入口;没有入口时,只有 `code-prototype` 已完成或存在运行中的预览才允许执行 `build`,否则直接返回“首个可运行原型尚未完成,暂不能发布”。发布不再进入聊天确认卡,改为独立全屏进度弹窗;运行中遮罩覆盖整个工作区并阻止交互,失败留在弹窗内,成功后切换到发布资料面板。 +- 边界:已有可运行入口仍直接打包;原型已完成但缺构建产物时保留原有自动构建;缺失 `exports/README.md` 仍在导出前自动生成。 +- 验证:Rust `publish_export` 4/4、前端发布相关测试 16/16、AGC `tsc`、编码检查和 `git diff --check` 通过。 + ## 2026-09-22 Direct 埋点与业务持久化锁隔离 - Direct 采集身份和最新成果编号改由独立纯内存状态保存,初始化时从最终执行账本冻结项目与原 run 身份;成果采集、预览采集上下文和终态成果读取不再争用业务落盘锁。 diff --git a/docs/technical/【技术方案】AI游戏创作智能体App实施计划-2026-06-24.md b/docs/technical/【技术方案】AI游戏创作智能体App实施计划-2026-06-24.md index a311db87c..10b7897e9 100644 --- a/docs/technical/【技术方案】AI游戏创作智能体App实施计划-2026-06-24.md +++ b/docs/technical/【技术方案】AI游戏创作智能体App实施计划-2026-06-24.md @@ -1334,7 +1334,7 @@ game-project/ - 聊天输入 `/commands` 会只读列出 Tauri runtime 暴露的受限命令白名单,读取失败或非 Tauri 环境下回退到共享契约默认列表;该命令不执行白名单命令,也不要求先初始化项目。 - 聊天输入 `/smoke` 会生成待确认的 `command.run_limited` 内置命令,当前只映射到白名单 `game.static_smoke`,不开放任意命令解析。 - 聊天输入 `/run` 会生成待确认的 `game.run_local` 内置命令,确认后复用白名单 `game.static_smoke` 运行当前 `game/index.html`,通过后启动只读本地 HTTP 预览并切换到客户端内运行视图;该命令不开放任意 shell。 -- 聊天输入 `/export` 会生成待确认的 `project.export_package` 内置命令,确认后只把 `game/**`、`assets/**` 和 `exports/README.md` 打包到 `exports/playtest-package-*.zip`;导出前重新校验 `game/index.html` 是可试玩自包含 HTML,拒绝符号链接和越界路径,不把 `.agent/`、`memory/`、日志、trace、运行时配置或密钥文件写入 ZIP。 +- 聊天输入 `/export` 会生成待确认的 `project.export_package` 内置命令,确认后只把 `game/**`、`assets/**` 和 `exports/README.md` 打包到 `exports/playtest-package-*.zip`;缺少 `exports/README.md` 时先按项目 manifest 生成最小试玩说明,已有文件原样保留。发布前若 `code-prototype` 未完成且没有运行中的预览,直接阻止发布,不触发用户项目构建;可运行原型完成后才允许按 `build` 脚本补齐产物。发布进度使用独立模态弹窗展示,遮罩覆盖整个工作区并阻止交互,不再使用聊天确认卡;导出前重新校验可玩入口,拒绝符号链接和越界路径,不把 `.agent/`、`memory/`、日志、trace、运行时配置或密钥文件写入 ZIP。 - 聊天输入 `/exports` 会只读执行 `project.export_list`,列出当前项目 `exports/playtest-package-*.zip` 历史试玩包,并提供显示目录或继续 `/export` 的草稿;该命令不删除文件、不分享文件、不新增面板。 - 聊天输入 `/preview` 会生成待确认的 `preview.start` 内置命令,确认后启动只读本地 HTTP 预览并切换到客户端内运行视图;`/open-preview` 在本地项目已初始化后生成待确认的 `preview.open`,只激活当前授权项目对应的 `127.0.0.1` 运行容器;`/preview-status` 只查询当前授权项目的本地 HTTP 预览并写入 `preview.status` 命令日志;`/preview-stop` 只停止当前项目预览,不展示或停止其它项目遗留的全局预览。 - 聊天输入 `/memory [short|long|blackboard]` 读取短期、长期或黑板记忆;`/remember [short|long|blackboard] 内容` 生成待确认的 `memory.write` 并追加短期、长期或黑板记忆,未写 scope 时默认追加长期记忆;主窗口“记到黑板”“覆盖黑板”“清空黑板”只填入 `/remember blackboard `、`/memory-set blackboard ` 或 `/forget-memory blackboard` 草稿,仍由用户补内容并走聊天确认;`/memory-set [short|long|blackboard] 内容` 生成待确认的 `memory.write` 并覆盖保存对应记忆;`/forget-memory [short|long|blackboard]` 生成待确认的 `memory.delete`。