补充AGC资源kind枚举化规范

新增资源 kind 枚举化主规范与边界。

新增词汇审计、Rust 绑定、写入清理三个里程碑。

新增 shell-only 资源 kind 扫描 todo 清单。

通过文档索引、编码与 diff 检查。
This commit is contained in:
2026-09-15 15:12:24 +08:00
parent 70a2246e8b
commit 6f2137cbb0
7 changed files with 266 additions and 2 deletions
+2
View File
@@ -25,6 +25,8 @@
## AI 游戏创作与 Agent Runtime
- [AGC 资源 kind 枚举化契约](./technical/【技术方案】AI游戏创作智能体App实施计划-2026-06-24.md#2026-09-15-gamecreationapp-资源-kind-枚举化当前权威口径)GameCreationApp 资源 kind 的 Rust enum、ts-rs 绑定、Unknown 可观测性和 shell 内重构边界。
- [策划 Agent 生产迁移与工作区浏览](./technical/【技术方案】策划Agent生产迁移与工作区浏览-2026-09-10.md):实施中;以自由协作原型为行为基线,复用生产基建,采用阶段审批与用户工作区文件浏览。无旧 V2 会话的策划入口切换到新设计 Agent。
- [LLM 累计额度结算](./technical/【技术方案】LLM累计额度结算-2026-09-05.md):Router 累计额度、首次基线与原子钱包结算。
@@ -0,0 +1,43 @@
# 【实施计划】AGC 资源 kind 词汇审计与绑定架构
| 字段 | 值 |
| --- | --- |
| Milestone | `docs/project-memory/plans/【里程碑】AGC资源kind枚举化词汇审计与绑定架构-2026-09-15.md` |
| Status | ready |
| Owner | Codex |
## 修改边界
允许修改:
- 主规范中的资源 kind 当前口径;
- `docs/project-memory/plans/` 下本任务的里程碑/实施计划;
- `docs/project-memory/todos/` 下本任务的扫描清单;
- 为审计提供只读扫描脚本(如确有必要,脚本也只覆盖 shell)。
明确不修改:
- `apps/ai-game-creator-shell` 业务代码;
- server-side 代码、OpenAPI、SpacetimeDB schema
- MIME、`source.kind``generationKind` 和其他字符串领域。
## 实现顺序
1. 按“manifest asset kind / 其他字段 / 仅文本同名”三类扫描 shell 的 `kind``assetKind``asset_kind` 和 manifest 构造器。
2. 对每个候选值回到调用上下文,标记生产写入、读取投影、协议输入、测试 fixture 或纯文本/路径。
3. 对照 api-server 当前有效资源 kind,排除 legacy、billing/storage synthetic taxonomy 和开放字段。
4. 记录正式候选 enum、Unknown 输入行为、保留字符串字段和后续 PR 边界。
5. 形成下一里程碑的文件级修改顺序和验证矩阵;本里程碑结束后暂停,等待验收。
## 验证命令
1. `rg -n 'kind|assetKind|asset_kind' apps/ai-game-creator-shell/src apps/ai-game-creator-shell/src-tauri/src`
2. `npm run check:doc-index`
3. `npm run check:encoding`
4. `git diff --check`
## 风险与回滚点
- 风险:同一字符串可能是 manifest kind、workflow kind 或路径名;任何未回到上下文确认的替换都禁止进入代码。
- 风险:shared-contracts 被多个 server crate 使用;ts-rs 生成必须通过 feature/独立入口隔离默认构建。
- 回滚点:本里程碑只有文档和审计清单变更;若词汇边界未能闭合,删除本计划和 todo,不进入代码里程碑。
@@ -0,0 +1,38 @@
# 【里程碑】AGC 资源 kind 枚举化 Rust 绑定与内部收紧
| 字段 | 值 |
| --- | --- |
| Version | 1.0 |
| Status | planned |
| Date | 2026-09-15 |
| Parent Spec | `docs/technical/【技术方案】AI游戏创作智能体App实施计划-2026-06-24.md` |
## 目标
将 GameCreationApp 资源 kind 从 shell 内裸字符串收紧为 Rust `GameCreationAppAssetKind`,并生成 shell 专属 TypeScript 绑定;所有同语义内部字段使用该类型,未知输入解析为 `Unknown` 并记录日志。
## 范围
- Rust enum、serde kebab-case、`Unknown` 与 category 派生边界。
- ts-rs feature-gated 生成入口、生成文件和 verify 门禁。
- `packages/shared/src/contracts/gameCreationApp.ts` 中重复的资源 kind 手写契约迁入 shell 生成绑定后的删除/收口。
- shell 内资源 kind 参数、投影、筛选、Agent 资源引用和 manifest 读写边界的类型收紧。
## 不在范围内
- server-side 其他 `asset_kind`、External API DTO、SpacetimeDB schema。
- `source.kind``generationKind`、MIME 和文件格式。
- 其他领域字段为配合本里程碑进行“顺手枚举化”。
## 依赖与前置条件
- 词汇审计里程碑通过并关闭所有阻塞项。
- 生成目录、TS 导入路径、Unknown 日志字段和 writer 禁止主动写 Unknown 的规则已确认。
## 验收标准
- [ ] Rust enum 与生成的 TS 绑定值逐项一致,JSON 使用 kebab-case。
- [ ] 未知输入得到 `Unknown`,日志包含原始值与调用上下文。
- [ ] 生产 writer 不再接受裸 `string` 作为 GameCreationApp kind。
- [ ] `font``audio``sound-effect``background-music` 均有真实生产路径或明确的测试证据。
- [ ] 旧 alias 不再由共享契约转换为 canonical。
@@ -0,0 +1,37 @@
# 【里程碑】AGC 资源 kind 枚举化写入方清理与验证
| 字段 | 值 |
| --- | --- |
| Version | 1.0 |
| Status | planned |
| Date | 2026-09-15 |
| Parent Spec | `docs/technical/【技术方案】AI游戏创作智能体App实施计划-2026-06-24.md` |
## 目标
逐处修正 shell 内仍产生非正式 GameCreationApp kind 的生产代码;保留仅属于 workflow、generation、路径或其他领域的字符串,并为这些边界补充清晰类型/命名说明而不扩大本 PR。
## 范围
- manifest 登记、恢复、回填、资源替换、画板/图集导出、字体导入、上传推断和 Agent 资源登记。
- shell 前端资源投影、筛选和资源引用消费方。
- 删除 alias/fallback 生产逻辑及其只服务于旧值的测试。
- 为每个仍保留的非 manifest kind 字符串补充 todo,转入后续独立 PR。
## 不在范围内
- 不改 `source.kind``generationKind` 等其他字段,即使它们恰好使用同名值。
- 不修改 server-side 代码或公开 API。
- 不实现字体格式/MIME enum`font` 只作为本次 manifest asset kind 成员。
## 依赖与前置条件
- Rust/TS 绑定里程碑通过。
- 写入方扫描清单中每个 alias 都已有“manifest kind / 其他领域 / 删除”结论。
## 验收标准
- [ ] 新建、导入、生成、恢复、替换路径不会写入未纳入 enum 的 manifest kind。
- [ ] 未知外部值只进入 `Unknown` 并有 trace,不会被静默改成 `image``asset`
- [ ] `source.kind``generationKind` 的既有字符串行为不变。
- [ ] 定向 Rust、TS、绑定生成、编码和 diff 检查通过。
@@ -0,0 +1,46 @@
# 【里程碑】AGC 资源 kind 枚举化词汇审计与绑定架构
| 字段 | 值 |
| --- | --- |
| Version | 1.0 |
| Status | approved |
| Date | 2026-09-15 |
| Parent Spec | `docs/technical/【技术方案】AI游戏创作智能体App实施计划-2026-06-24.md` |
## 目标
`apps/ai-game-creator-shell` 内建立唯一的 GameCreationApp 资源 kind 领域边界:Rust enum 是权威,TypeScript 由 `ts-rs` 生成;先完成全量词汇审计和生成架构合同,再进入业务代码替换。
## 范围
- 审计 shell 内所有可能表示 GameCreationApp 资源 kind 的字段、构造器、写入边界、筛选器、资源投影、Agent 资源引用和测试 fixture。
- 以 api-server 当前仍有效的同语义 kind 作为命名与 serde 值参考,并评估 shell 当前实际生产 kind;排除 api-server legacy、billing/storage taxonomy 和其他开放领域。
- 确认 Rust enum、`Unknown`、kebab-case JSON 和 ts-rs 生成文件的归属、生成命令与校验门禁。
- 形成逐项 todo:当前值、真实语义、生产/测试状态、目标 enum、是否改写、验证方式。
## 不在范围内
- 不扫描或修改 server-side 代码;api-server 只提供词汇参考。
- 不改 `mediaType`、MIME、文件扩展名、`source.kind``source.generationKind`、任务/工作流 kind、路径名或 tracking scope。
- 不在本里程碑修改 manifest writer、前端消费方或公开 API。
- 不实现旧 manifest migration、alias 表或 fallback 清理。
## 依赖与前置条件
- 主规范已确认资源 kind 候选集合、`Unknown` 语义和 shell 边界。
- `shared-contracts` 当前被 server-rs 多个 crate 使用,ts-rs 生成能力必须 feature-gated 或由独立生成入口启用,不能污染默认 SpacetimeDB/WASM 构建。
- 当前已有 Tauri ts-rs 生成测试可作为生成命令形态参考,但不复用 UI Editor 类型目录作为资源契约目录。
## 验收标准
- [ ] shell 内 manifest 资源 kind 的生产写入点、解析点、投影点和测试 fixture 有完整清单。
- [ ] 每个旧值均已标注为:正式 GameCreationApp kind、其他领域字符串、legacy/错误 fallback;没有只按 grep 结果猜测的条目。
- [ ] api-server 有效值、shell 扩展值和排除值各有明确依据。
- [ ] 生成架构不会要求 server-side 默认构建安装 ts-rs。
- [ ] todo 清单的每项都有关闭条件和对应验证证据。
## 证据要求
- 自动化:raw kind 扫描脚本/报告、Rust/TS 生成试验、serde kebab-case round-trip 试验。
- 文档:主规范、todo 清单、下一里程碑实施计划互相链接且无冲突。
- 边界:至少覆盖 `font``audio``sound-effect``background-music``Unknown`,以及 `source.kind`/`generationKind` 不误收编。
@@ -0,0 +1,86 @@
# 【待办】AGC 资源 kind 枚举化扫描清单
| 字段 | 值 |
| --- | --- |
| 状态 | open |
| 创建日期 | 2026-09-15 |
| 所属主规范 | `docs/technical/【技术方案】AI游戏创作智能体App实施计划-2026-06-24.md` |
| 关闭条件 | shell 内所有 GameCreationApp 资源 kind 候选均完成语义归类、代码处理决定和验证证据记录 |
## 扫描规则
只扫描 `apps/ai-game-creator-shell``server-rs` 只作为 api-server 有效词汇参考,不把 server-side `asset_kind` 纳入本清单迁移。
每个命中必须回到上下文并填写:位置、当前值、真实语义、是否进入 manifest、是否生产写入、目标类型、处理动作、验证证据。
## 首轮候选分组
### 必须审计为 GameCreationAppAssetKind
- `image`
- `scene`
- `character`
- `character-animation`
- `icon`
- `icon-spritesheet`
- `icon-spec`
- `ui-design`
- `ui-design-doc`
- `publication-material`
- `spec`
- `video`
- `audio`
- `sound-effect`
- `background-music`
- `font`
- `document`
- `code`
- `unknown`
### 已发现的非 canonical 候选,必须逐处判定
- `asset`
- `ui`
- `animation`
- `game-background`
- `character-art`
- `game-art`
- `illustration`
- `art-spritesheet`
- `art-spritesheet-slice`
- `ui-prototype`
- `game-entry`
- `game-script`
- `game-style`
### 明确暂不纳入本 PR
- `source.kind`
- `source.generationKind`
- MIME / `mediaType` / 文件扩展名
- workflow、generation、task、path、tracking、plugin 等其他 kind 字段
## 初始文件入口
- `src-tauri/src/assets.rs`
- `src-tauri/src/commands.rs`
- `src-tauri/src/project/manifest.rs`
- `src-tauri/src/project/resource_editor.rs`
- `src-tauri/src/ui_editor/`
- `src-tauri/src/agent/direct_runtime.rs`
- `src-tauri/src/agent/direct_tool_bridge.rs`
- `src-tauri/src/agent/generation/`
- `src-tauri/src/agent/runtime_actions/`
- `src/features/project-development/`
- `src/features/project-workspace/`
- `src/features/resource-canvas/`
- `src/features/ui-editor/`
## 当前未决项
- [ ] 逐处确认 `asset` 是错误 fallback 还是其他领域标识。
- [ ] 逐处确认 `art-spritesheet` / `art-spritesheet-slice` 是 manifest kind 还是图集 workflow 标识。
- [ ] 逐处确认 `game-background` / `game-art` / `illustration` / `character-art` 的写入边界。
- [ ] 逐处确认 `ui` / `ui-prototype` 是否仍有生产 manifest writer。
- [ ] 确认 `Unknown` 的 tracing 字段和 writer 禁止规则。
- [ ] 确认 ts-rs 生成文件的实际路径、生成命令和 CI verify 实现。
@@ -1,5 +1,17 @@
# AI 游戏创作智能体 App 实施计划
## 2026-09-15 GameCreationApp 资源 kind 枚举化(当前权威口径)
本节覆盖并替代下方 2026-09-09 资源 kind 别名、canonical fallback 与读时自愈相关口径。当前仍在开发期,不为旧本地 manifest 提供 migration、alias 兼容或静默转换;旧值只会在解析时落入 `Unknown` 并记录结构化日志,后续按扫描清单清理产生旧值的代码。
本次重构范围限定在 `apps/ai-game-creator-shell` 内表达 **GameCreationApp 资源 kind** 的字段、参数、投影、筛选和 manifest 读写边界。`mediaType`、MIME、文件扩展名、`source.kind``source.generationKind`、任务/工作流 kind、路径名,以及 server-side 其他 `asset_kind` 不在本次重构范围内,继续使用各自现有类型。
Rust 侧在 `server-rs/crates/shared-contracts` 维护唯一权威 `GameCreationAppAssetKind` enum,并使用 `serde` kebab-case 序列化;`Unknown` 是正式解析结果,序列化值为 `unknown`。TypeScript 绑定由 `ts-rs` 从 Rust 生成到 `apps/ai-game-creator-shell` 内,删除 `packages/shared/src/contracts/gameCreationApp.ts` 中重复的手写 kind 契约。正常写入路径不得主动构造 `Unknown`;未知外部值进入 `Unknown` 时必须记录原始值、来源和调用上下文的 `tracing`/日志。
当前候选正式成员以 api-server 仍有效的资源 kind 命名为基线,并保留 shell 已实际使用的字体与通用音频语义:`image``scene``character``character-animation``icon``icon-spritesheet``icon-spec``ui-design``ui-design-doc``publication-material``spec``video``audio``sound-effect``background-music``font``document``code``unknown``audio` 表示通用上传音频,`sound-effect``background-music` 表示更具体的生成/资源语义,不因同属 `audio` category 而合并。`asset``ui``animation``game-background``art-spritesheet` 等旧值必须逐处审计:进入 GameCreationAppAssetKind 的生产写入改为正式成员;仅作为 workflow、generation、路径或协议标识的值保持原字段,留待后续独立 PR。
实施要求:先完成 shell 内 raw kind / typed kind 扫描清单与生产写入审计,再分小提交实现 Rust enum、生成绑定、内部字段收紧、写入方修正、Unknown 可观测性和旧 alias 删除。每个提交只形成一个可验证的深模块,不把不同领域的字符串类型强行合并;完成后补充 `ts-rs` 生成/校验门禁、serde round-trip、未知值日志和所有 manifest writer 的 canonical/Unknown 边界测试。
## 2026-09-12 已有项目打开响应性
DirectProject 工作区只恢复自身对话,不按专业 Agent 默认任务占位行批量读取旧会话或生成专业 Agent 文本回执。专业 Agent 结果加载 effect 必须以当前 Runtime 模式为边界,并在模式切换时清空旧结果。仍供开发入口使用的 `read_local_conversation` 在 blocking worker 内完整执行权限校验、会话目录解析和历史读取,避免文件访问或锁等待阻塞 Tauri 窗口线程。
@@ -32,9 +44,9 @@ DirectProject 自身的 `read_direct_project_conversation` 也必须在 blocking
## 2026-09-09 manifest 资源功能分类与自定义标签(数据层)
本地 manifest 资产条目末尾新增 `category`(单值,6 类 `ui-interaction / character / scene / audio / document / unclassified`,默认 `unclassified`)与 `tags`(字符串数组,默认空数组);字段始终序列化,不进 api-server、外部 OpenAPI 或 SpacetimeDB schema。默认分类`GAME_CREATION_APP_ASSET_CATEGORY_BY_KIND` 按 canonical kind 穷举映射`icon / icon-spritesheet / icon-spec / ui-design → ui-interaction``character / character-animation → character``scene → scene``audio / sound-effect / background-music → audio``document / spec → document``image / video / code / publication-material → unclassified`alias 表**大小写不敏感**(UI 设计资产的现役写入侧写的是大写 `"UI"``font` 是字体上传登记的 kind),`"UI" → ui-design → ui-interaction``font → document → document`;其余映射不到 canonical kind 的原始 kind(例如 `test`)才经 `canonicalGameCreationAppAssetKind``image`、归 `unclassified`。读显示口径在 TS`gameCreationAppAssetCategory`)与 Rust`game_creation_app_asset_effective_category`)同构,写回 manifest 必须用落盘原值 `gameCreationAppAssetPersistedCategory`
本地 manifest 资产条目末尾新增 `category`(单值,6 类 `ui-interaction / character / scene / audio / document / unclassified`,默认 `unclassified`)与 `tags`(字符串数组,默认空数组);字段始终序列化,不进 api-server、外部 OpenAPI 或 SpacetimeDB schema。默认分类继续由资源 kind 到 category 的显式映射决定`icon / icon-spritesheet / icon-spec / ui-design → ui-interaction``character / character-animation → character``scene → scene``audio / sound-effect / background-music → audio``document / spec / font → document``image / video / code / publication-material / unknown → unclassified`。kind 枚举、未知值与写入边界以本文件顶部 2026-09-15 口径为准;本节不再定义 alias、canonical fallback 或旧 manifest 自愈
历史 manifest 缺少字段时读取按 `kind` 派生分类、`tags` 取空数组;显式写入的合法分类原样保留,未知分类字符串按前向兼容退回 `kind` 派生。新建资源条目写 `kind` 派生默认值,更新既有条目保留已有 `category` / `tags`,不覆盖用户值。`tags` 归一化(trim、去空、去重)只以纯函数交付,本轮不接入写入路径。本轮不做任何 UI(画布功能画布与筛选、@ 面板标签筛选、标签管理面板)、数据迁移脚本、标签库聚合派生与 Agent 检索工具
开发期 manifest 只按当前枚举解析;旧字段兼容、迁移脚本与 alias 不属于当前目标。新建资源条目必须由已验证的 `GameCreationAppAssetKind` 写入;未知输入只能产生 `Unknown` 解析结果并记录日志,不能由 writer 静默改成其他 kind。`tags` 归一化(trim、去空、去重)保持现有规则。本节原有 UI、标签库和 Agent 检索范围不因本次 kind 枚举化扩大
## 2026-09-08 Web 游戏 npm 与 Phaser 4 产物合同