Merge remote-tracking branch 'origin/master' into fix/mobile-style
Project CI / AI game creator shell Rust crates (pull_request) Successful in 1m29s
Project CI / AI game creator shell Rust smoke (pull_request) Successful in 1m55s
Project CI / Backend tests (pull_request) Successful in 4m9s
Project CI / Frontend tests (pull_request) Successful in 2m15s
Project CI / Native shell tests (pull_request) Successful in 6m6s
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Successful in 8m53s
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Successful in 9m38s
Project CI / AI game creator shell web tests (pull_request) Successful in 1m45s
Project CI / Repository checks (pull_request) Successful in 2m44s
Project CI / AI game creator shell Rust crates (pull_request) Successful in 1m29s
Project CI / AI game creator shell Rust smoke (pull_request) Successful in 1m55s
Project CI / Backend tests (pull_request) Successful in 4m9s
Project CI / Frontend tests (pull_request) Successful in 2m15s
Project CI / Native shell tests (pull_request) Successful in 6m6s
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Successful in 8m53s
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Successful in 9m38s
Project CI / AI game creator shell web tests (pull_request) Successful in 1m45s
Project CI / Repository checks (pull_request) Successful in 2m44s
# Conflicts: # docs/project-memory/shared-memory/decision-log.md # docs/project-memory/shared-memory/pitfalls.md
This commit is contained in:
@@ -23,6 +23,7 @@
|
||||
- [外部 OpenAPI 与 API Key 接入方案](./【后端架构】外部OpenAPI与APIKey接入方案-2026-06-19.md)
|
||||
- [外部 MCP 语义工具说明与参数设计](./technical/【技术方案】外部MCP语义工具说明与参数设计-2026-09-23.md):15 个新增语义工具与全部原工具并存,复用现有 External API;包含工具说明、action、参数、幂等和兼容合同。
|
||||
- [External v1 OpenAPI](./openapi/genarrative-external-v1.openapi.json):公开 HTTP 契约唯一机器可读来源。
|
||||
- [External v1 游戏场景生成路由](./technical/【技术方案】ExternalV1游戏场景生成路由-2026-09-24.md):external v1 结构化场景生成专用路由与 AGC 美术包背景阶段迁移合同。
|
||||
|
||||
## AI 游戏创作与 Agent Runtime
|
||||
|
||||
|
||||
@@ -1052,7 +1052,60 @@
|
||||
"$ref": "#/components/responses/UpstreamError"
|
||||
}
|
||||
},
|
||||
"description": "支持普通生图、规范图、角色图、快速编辑参考图、UI 设计图和宣发素材生成。kind 可取 spec、character、quick-edit、ui-design、publication-material。"
|
||||
"description": "支持普通生图、规范图、角色图、快速编辑参考图、UI 设计图和宣发素材生成。kind 可取 spec、character、quick-edit、ui-design、publication-material。游戏场景不接受本接口的 kind/assetKind = scene,必须使用 /api/external/v1/editor/scenes/generations 提交结构化场景意图。"
|
||||
}
|
||||
},
|
||||
"/api/external/v1/editor/scenes/generations": {
|
||||
"post": {
|
||||
"x-mcp-excluded": true,
|
||||
"tags": ["Editor Images"],
|
||||
"operationId": "generateExternalEditorScene",
|
||||
"summary": "生成编辑器游戏场景(结构化场景意图)",
|
||||
"description": "只接受结构化场景意图:sceneContent + stylePreset(custom 时必须提供 customStyle),完整 Provider Prompt 由服务端组装,不接受调用方提交的完整 prompt。入队后按 kind/assetKind = scene 持久化,产物保存 scene.generate V2 配方;队列、计费、资源入库与画布写回与站内场景路由一致。",
|
||||
"security": [
|
||||
{
|
||||
"ExternalApiKey": []
|
||||
}
|
||||
],
|
||||
"parameters": [
|
||||
{
|
||||
"$ref": "#/components/parameters/IdempotencyKey"
|
||||
}
|
||||
],
|
||||
"requestBody": {
|
||||
"required": true,
|
||||
"content": {
|
||||
"application/json": {
|
||||
"schema": {
|
||||
"$ref": "#/components/schemas/EditorSceneGenerationRequest"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"responses": {
|
||||
"202": {
|
||||
"description": "生成任务已持久化入队",
|
||||
"content": {
|
||||
"application/json": {
|
||||
"schema": {
|
||||
"$ref": "#/components/schemas/ExternalEditorGenerationSubmissionResponse"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"400": {
|
||||
"$ref": "#/components/responses/BadRequest"
|
||||
},
|
||||
"401": {
|
||||
"$ref": "#/components/responses/Unauthorized"
|
||||
},
|
||||
"403": {
|
||||
"$ref": "#/components/responses/Forbidden"
|
||||
},
|
||||
"502": {
|
||||
"$ref": "#/components/responses/UpstreamError"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"/api/external/v1/editor/images/edits": {
|
||||
@@ -2965,6 +3018,69 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"EditorSceneGenerationRequest": {
|
||||
"type": "object",
|
||||
"required": ["sceneContent", "stylePreset"],
|
||||
"properties": {
|
||||
"sceneContent": {
|
||||
"type": "string",
|
||||
"minLength": 1,
|
||||
"description": "画面内容(结构化场景意图主体)。纯空白在入队前返回 400。"
|
||||
},
|
||||
"stylePreset": {
|
||||
"type": "string",
|
||||
"enum": ["anime", "watercolor", "flat", "stop-motion", "custom"],
|
||||
"description": "视觉风格预设。custom 时必须同时提供非空 customStyle,否则返回 400。"
|
||||
},
|
||||
"customStyle": {
|
||||
"type": ["string", "null"],
|
||||
"description": "自定义画风描述,仅 stylePreset = custom 时使用。"
|
||||
},
|
||||
"model": {
|
||||
"type": ["string", "null"],
|
||||
"description": "图片模型,省略时使用服务端默认场景模型。"
|
||||
},
|
||||
"aspectRatio": {
|
||||
"type": ["string", "null"],
|
||||
"default": "16:9"
|
||||
},
|
||||
"imageSize": {
|
||||
"type": ["string", "null"],
|
||||
"default": "1K"
|
||||
},
|
||||
"referenceImageSrcs": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "string"
|
||||
},
|
||||
"description": "可选参考图,沿用普通图片生成的参考图口径。"
|
||||
},
|
||||
"projectId": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"generationInputs": {
|
||||
"$ref": "#/components/schemas/JsonValue",
|
||||
"description": "场景配方由服务端重建;仅保留 source 精确等于 ai-game-creator-client 的客户端来源标记,用于选择 AGC 队列结果与幂等命名空间。调用方 fields、action 和引用 provenance 不会覆盖服务端配方。"
|
||||
},
|
||||
"assetFolderId": {
|
||||
"type": ["string", "null"]
|
||||
},
|
||||
"assetLabel": {
|
||||
"type": ["string", "null"],
|
||||
"description": "省略或纯空白时统一使用「游戏场景」。"
|
||||
},
|
||||
"canvasCompletion": {
|
||||
"anyOf": [
|
||||
{
|
||||
"$ref": "#/components/schemas/EditorCanvasGenerationCompletion"
|
||||
},
|
||||
{
|
||||
"type": "null"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
},
|
||||
"EditorImageGenerationRequest": {
|
||||
"type": "object",
|
||||
"required": ["prompt"],
|
||||
|
||||
@@ -27,9 +27,25 @@ docs/project-memory/
|
||||
- `plans/` 只保存正在执行、具有明确剩余项和验收门禁的计划;完成或作废后立即删除,稳定结论融合进当前专题或共享记忆。
|
||||
- `todos/` 只保存真实开放、有人接手即可执行的事项;每项应写明状态、下一决策点和关闭条件。已退役对象不保留未来 TODO。
|
||||
- 分支、提交、测试轮次和阶段流水账不进入长期记忆;需要追溯时使用 Git 历史。
|
||||
- `decision-log.md` 与 `pitfalls.md` 可以直接修改、合并和删除旧条目:被覆盖的决定、退役对象专属说明和重复记录不继续保留;仍有效的风险、兼容约束和未完成事项应保留或融合到当前专题。
|
||||
- 自动验证检查实际代码、配置和行为,不要求决策记录或踩坑记录包含固定措辞,也不强制把同一规则复制到多个记忆文件。
|
||||
- 若本目录与代码或最新 `docs/` 冲突,以代码和最新专题为准,并在同次变更中修正记忆。
|
||||
- 禁止写入个人配置、API Key、Token、Cookie、会话记录、认证文件、本地私密路径、构建产物、日志、缓存和数据库 dump。
|
||||
|
||||
## 决策记录格式
|
||||
|
||||
以下格式按需使用,简单决策不必凑齐所有字段。
|
||||
|
||||
```md
|
||||
## YYYY-MM-DD 决策标题
|
||||
|
||||
- 背景:为什么需要这个决策
|
||||
- 决策:最终决定是什么
|
||||
- 影响范围:涉及哪些模块/文档/流程
|
||||
- 验证方式:如何确认决策仍有效
|
||||
- 关联文档:相关 PRD、技术文档、提交或 Issue
|
||||
```
|
||||
|
||||
## RAG 索引
|
||||
|
||||
本目录是本地 RAG 的高权重索引源,但检索结果只作为候选上下文。索引脚本位于 `scripts/rag/`;运行时依赖和 `.rag/` 数据默认不安装、不提交,启用前需先征得用户确认。
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
| 字段 | 值 |
|
||||
| --- | --- |
|
||||
| Version | 1.0 |
|
||||
| Status | runtime-smoke-passed(存储原语、服务端入口、原生上传器、渲染进程接线与真实栈分片续传 smoke 均已落地) |
|
||||
| Status | implemented-awaiting-runtime-acceptance(存储原语、服务端入口、原生上传器、渲染进程接线与真实栈分片续传 smoke 均已落地) |
|
||||
| Date | 2026-09-23 |
|
||||
| Parent Milestone | `docs/project-memory/plans/【里程碑】AGC发行包分片续传上传-2026-09-23.md` |
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
| 字段 | 值 |
|
||||
| --------- | ----------------------------------------------------------------------------------- |
|
||||
| Milestone | `docs/project-memory/plans/【里程碑】AGC客户端更新切换到官方更新插件-2026-09-17.md` |
|
||||
| Status | ready |
|
||||
| Status | implemented-awaiting-runtime-acceptance |
|
||||
| Owner | Codex |
|
||||
|
||||
## 修改边界
|
||||
@@ -35,3 +35,11 @@
|
||||
- Windows 安装模式由插件配置决定(本里程碑固定 `quiet`,与旧 PowerShell `/S` 一致);若改为 `passive` 会多出安装进度条 UI。
|
||||
- 插件在 Windows 上安装成功后自行退出进程,前端不再有机会更新界面;提示面板的完成态只在 macOS / Linux 可见。
|
||||
- 回滚点:改动集中在客户端与配置,回滚后即可退回自研链路;旧 OSS `agc/latest.json` 在发布管线渠道化前不删除。
|
||||
|
||||
## 本轮复核(2026-09-24)
|
||||
|
||||
状态原为 `approved` / `ready`(规范评审态),实现其实已经落地,本轮按当前工作树复核并改记为 `implemented-awaiting-runtime-acceptance`:
|
||||
|
||||
- 原生侧接入官方插件:`apps/ai-game-creator-shell/src-tauri/Cargo.toml` 有 `tauri-plugin-updater = "2.11.0"`;`tauri.conf.json` 打开 `createUpdaterArtifacts` 并写入 `plugins.updater.pubkey` 与渠道端点。
|
||||
- 自研更新链路已删除:`download_ai_game_creator_update` / `install_ai_game_creator_update` / `check_ai_game_creator_update` 在 `src-tauri/src` 与 `src` 内均无命中;前端更新服务 `src/services/appUpdate.ts` 只消费官方插件包,而该包是 IPC 薄壳,网络与安装都在 Rust 侧。
|
||||
- 未执行(需要签名私钥与发布授权):真实签名打包、真实 OSS 发布、安装后真机升级与回滚。
|
||||
|
||||
@@ -0,0 +1,54 @@
|
||||
# 【实施计划】AGC 工作区偏好 IO 下沉 Rust
|
||||
|
||||
Version: `v1`
|
||||
Status: `implemented-awaiting-runtime-acceptance`
|
||||
Date: `2026-09-23`
|
||||
Parent Spec: `docs/project-memory/plans/【里程碑】AGC工作区偏好IO下沉Rust-2026-09-23.md`
|
||||
|
||||
## 修改边界
|
||||
|
||||
1. 新增 `src-tauri/src/workspace_preferences.rs`:定义版本化 AppData JSON、路径规范化、原子写入、command 输入/输出和偏好变更事件。
|
||||
2. 在 `main.rs` 注册 typed commands;首页自动建项和模板建项由 Rust command 内部读取项目创建目录,保持现有目录安全校验。
|
||||
3. `features/app-shell/model.ts` 保留纯校验/展示模型,移除 `localStorage` 读写,新增一次快照/迁移所需的 invoke façade。
|
||||
4. `useProjectCreationDirectory.ts` 与 `useRecentProjects.ts` 订阅 Rust 事件,首次挂载读取一次快照;浏览器/Vitest 无 Tauri 时保留内存 fallback,不恢复周期轮询。
|
||||
5. 增加 Rust/React 定向测试,更新现有 localStorage 断言为 command/event 合同;不修改 auth、wallet、prompt polish 和 Home draft。
|
||||
|
||||
## 实施顺序
|
||||
|
||||
- 先完成 Rust 偏好模块和单测,再注册 command/event,最后切换 React 读取/写入边界。
|
||||
- 先让自动建项闭环不再传 `projectsRoot`,再切换模板建项;确认旧参数仍兼容后删除前端读取。
|
||||
- 迁移旧 localStorage 只做一次、在 Tauri 环境显式触发;迁移失败不得覆盖 Rust 已存在值。
|
||||
|
||||
## 验证命令
|
||||
|
||||
```text
|
||||
cargo fmt --manifest-path apps/ai-game-creator-shell/src-tauri/Cargo.toml -- --check
|
||||
cargo test --manifest-path apps/ai-game-creator-shell/src-tauri/Cargo.toml workspace_preferences
|
||||
npm exec vitest run -- apps/ai-game-creator-shell/tests/projectCreationDirectory.test.ts apps/ai-game-creator-shell/tests/recentProjectsHook.test.tsx
|
||||
npm --prefix apps/ai-game-creator-shell run typecheck
|
||||
npm run ai-game-creator-shell:check:web
|
||||
npm run check:encoding
|
||||
npm run check:doc-index
|
||||
git diff --check
|
||||
```
|
||||
|
||||
## 风险与回滚点
|
||||
|
||||
- AppData 偏好文件不可写时,读取继续返回安全空态,写入返回可见错误;React 不回退到隐式 `localStorage` 持久化。
|
||||
- 旧 localStorage 键可能包含无效或已不存在的路径,迁移只接受规范化绝对路径,并受 Rust 端每次建项校验保护。
|
||||
- 若事件订阅竞态导致首次通知丢失,挂载快照读取作为唯一补读;不引入 `setInterval`。
|
||||
|
||||
## 当前验证记录
|
||||
|
||||
- Rust workspace preference 定向测试:`3 passed / 0 failed`。
|
||||
- React 定向测试:`projectCreationDirectory.test.ts` 与 `recentProjectsHook.test.tsx` 共 `7 passed`。
|
||||
- AGC TypeScript:`npx tsc -p tsconfig.json --noEmit` 通过;定向 Prettier 与新 Rust 模块 rustfmt 检查通过。
|
||||
- 完整 `npm --prefix apps/ai-game-creator-shell run typecheck` 已通过,发行 typed command allowlist 已同步。
|
||||
|
||||
## 本轮取证(2026-09-24)
|
||||
|
||||
- 行为合同 1/2/3(偏好文件缺失不阻断启动、最近工作区最多 8 条去重幂等、创建目录只表达意图且建项仍过 Rust 门禁):`cargo test --manifest-path apps/ai-game-creator-shell/src-tauri/Cargo.toml --offline -- workspace_preferences --test-threads=1` → **6 passed**。
|
||||
- 范围项(React 不再直接访问 `localStorage`、建项不再由 React 传 `projectsRoot`):`rg localStorage apps/ai-game-creator-shell/src` 只剩 `features/app-shell/workspacePreferences.ts` 的旧键迁移 shim(`isTestRuntime()` 门控);`rg projectsRoot apps/ai-game-creator-shell/src` **0 命中**。
|
||||
- 前端 façade:`npx vitest run tests/recentProjectsHook.test.tsx tests/projectCreationDirectory.test.ts --root apps/ai-game-creator-shell` → **5 + 4 passed**(命令/事件投影、失败重试与偏好读写)。
|
||||
- Rust 侧变异验证(2026-09-24):把 `MAX_RECENT_WORKSPACES` 从 8 改成 16 后,`normalizes_recent_paths_with_a_strict_eight_item_limit` 立刻红(`left: 10, right: 8`),说明「最近项目最多 8 条」这条上限确实被钉住;改回后 `workspace_preferences` 定向用例 exit 0。
|
||||
- 仍未验证(需要真实客户端):多窗口并发改偏好、事件丢一次后的受控快照读取、真实建项落到用户所选目录。
|
||||
@@ -0,0 +1,79 @@
|
||||
# 【实施计划】AGC 工作区网络 I/O 下沉 Rust
|
||||
|
||||
Version: `v1`
|
||||
Status: `implemented-awaiting-runtime-acceptance`
|
||||
Date: `2026-09-23`
|
||||
Parent Spec: `docs/project-memory/plans/【里程碑】AGC工作区网络IO下沉Rust-2026-09-23.md`
|
||||
|
||||
## 修改顺序
|
||||
|
||||
1. 先盘点现有 Rust HTTP/auth/session facade 与发行/资源命令,冻结 typed request/response 和事件名。
|
||||
2. **发行链路(已完成)**:新增 `game_distribution_publish.rs` typed facade 和五个 Tauri commands;创建游戏、创建版本、分片上传、送审、灰度读取、资料建议、封面价格/生成与队列收口均由 Rust 持有。保留既有分片上传 command 与幂等/续传语义,React service 只保留 `invoke` façade。
|
||||
3. **模型目录闭环(已完成)**:官方 `/api/llm/models` 改由 Rust typed command 持有会话与 HTTP;React 只消费目录投影。素材库/素材直传仍待后续切片。
|
||||
4. 为每条命令补 Rust 单测、前端 invoke/事件测试和静止状态无轮询断言。
|
||||
5. 更新主规范、事件目录与验证记录;账户/钱包调用保留并明确排除。
|
||||
|
||||
## 验证命令
|
||||
|
||||
- `npm --prefix apps/ai-game-creator-shell run typecheck`
|
||||
- `npm run ai-game-creator-shell:check:web`
|
||||
- `cargo fmt --all --manifest-path apps/ai-game-creator-shell/src-tauri/Cargo.toml -- --check`
|
||||
- 相关 Rust `cargo test --locked` 定向测试
|
||||
- `cargo test --manifest-path apps/ai-game-creator-shell/src-tauri/Cargo.toml game_distribution_publish`
|
||||
- `npx vitest run apps/ai-game-creator-shell/tests/gameDistributionPublish.test.ts`
|
||||
- `npm run check:encoding`
|
||||
- `npm run check:doc-index`
|
||||
- `git diff --check`
|
||||
|
||||
## 回滚点
|
||||
|
||||
保留现有 Rust 上传命令和旧 TS service 的提交边界;迁移每个 typed facade 时先让 Rust command 可独立读取/写入,再切换 React 调用方,避免出现“旧网络调用已删但新 command 未注册”的窗口。不得用重新启用 React 轮询作为回滚。
|
||||
|
||||
## 当前批次证据:官方模型目录
|
||||
|
||||
- 新增 Tauri typed command load_game_creator_llm_models;Rust 持有当前平台会话、固定 API origin、Bearer、AGC marker、响应 envelope 解析、1 MiB 响应上限和账号身份代次复核。
|
||||
- React llmModelCatalog 在 Tauri 官方目录路径只通过 typed invoke 读取;自定义模型继续使用本地配置,浏览器无 native host 时保留兼容读取。
|
||||
- Rust 定向测试 4/4、clientApi 与 ConversationModelSelect 定向测试 38/38、appSurface 211 passed / 9 skipped。
|
||||
- typecheck 的 tsc 与 skill-pack、check:encoding、check:doc-index、git diff --check 通过;check-config 仍受共享工作树既有发行命令缺口阻断,发行资料 facade 另按本实施计划处理。
|
||||
|
||||
## 当前切片证据(2026-09-23)
|
||||
|
||||
- `apps/ai-game-creator-shell/src-tauri/src/game_distribution_publish.rs` 读取 Rust `platform_session` 的 user/token/origin,只接受结构化参数;每个 HTTP 步骤复核身份代次,保留 Bearer、`X-Genarrative-Client: agc`、响应 envelope、幂等键和稳定错误分类。
|
||||
- `publish_local_project_game` 在 Rust 内完成本地包暂存、创建 game/version、分片续传和 submit;渲染进程不再取得 token、origin 或整包字节。已有 `upload_local_project_game_package` command 未改动。
|
||||
- 封面异步任务由 Rust 以有界 1.6 秒间隔、20 分钟/800 次上限等待;React 不再执行远端 job 轮询。
|
||||
- `npx vitest run apps/ai-game-creator-shell/tests/gameDistributionPublish.test.ts`:7 passed;`npm exec tsc -- --noEmit -p apps/ai-game-creator-shell/tsconfig.json` 通过。
|
||||
- `cargo test --manifest-path apps/ai-game-creator-shell/src-tauri/Cargo.toml game_distribution_publish`:4 passed;`rustfmt --edition 2021 --check` 针对新 Rust 文件通过。
|
||||
- 尚未宣称全部工作区网络已迁移:素材库/素材上传、账户刷新、错误上报及其它 clientApi 链路仍在各自里程碑范围内;真实 Tauri + Provider/生产发行 smoke 仍待环境验证。
|
||||
- 发行 facade 追加 session identity 保护:每个 JSON 步骤与每个分片前重新读取当前 token,换号/origin 变化失败关闭;旧 native-only 分片 command 保留显式 token 兼容,不属于 React 工作区入口。
|
||||
|
||||
## 当前切片证据:编辑器素材库与预览
|
||||
|
||||
- 范围补充:远程导入同步改成 assetId-only,删除旧 remoteAssets/objectKey/downloadUrl 透传。UI 继续传现有 import policy/requirements;Rust 复用账户素材导入核心,按实际字节落实单文件/批次上限和正式 kind,预览字节不作为导入事实。预览切换/卸载后迟到响应不能回写。
|
||||
- Rust 新增 read_editor_asset_library:复用当前账号 session、账户素材静态图片筛选和安全投影,只返回 folders/assets 展示字段、稳定 assetId、尺寸/大小和 previewAvailable;不序列化 objectKey、imageSrc、assetObjectId、token 或本地路径。
|
||||
- Rust 新增 read_editor_asset_preview:按当前账号 assetId 重新解析权威素材,有界下载并校验图片大小、Content-Type/magic、重定向和 session identity,返回 data URL;没有稳定 objectKey/legacy path 的记录失败关闭。
|
||||
- React AssetImporter/ImageImporterPreview 改为 editorAssetHost typed invoke;旧 loadEditorAssetLibrary/resolveClientAssetReadUrl 不再由该入口调用。import_ui_editor_assets 的旧 remote 入参保留,downloadUrl 暂由 Rust 返回的 data URL 提供,Rust 兼容解析该 data URL,WebView 不再直接发素材预览/导入网络请求。
|
||||
- Rust 定向资源投影/预览 data URL/legacy import 测试 13/13、AssetImporter 定向测试 4/4、AGC typecheck tsc/skill-pack 通过;待补完整 web gate、编码/文档索引/diff 检查后再提交该切片验收。
|
||||
|
||||
## 当前切片证据:素材上传与错误报告(2026-09-24)
|
||||
|
||||
- 新增 `src-tauri/src/platform_asset_upload.rs` 与命令 `upload_platform_media_asset`:凭证申请、对象存储表单直传、confirm、会话身份复核和地址白名单全部在 Rust;React `assetDirectUpload.ts` 只读取用户选择的文件字节并提交结构化元数据,不再持有 token、拼 URL 或发平台请求。
|
||||
- 新增 `src-tauri/src/error_report/submit.rs` 与命令 `submit_error_report`:Rust 持有 origin、Bearer、稳定 submissionId(按事件 ID 派生)与 envelope 解析;React 只提交脱敏事件、说明与诊断日志,`errorReporting.ts` 不再 import `fetchClientHttp` / `getStoredAuthAccessToken` / `getClientServerBaseUrl`。
|
||||
- 渲染层偏好补齐:`chatPromptPolish` 的「不再提醒」从 localStorage 迁到 Rust 客户端偏好(`set_chat_prompt_polish_reminder_disabled` + 既有偏好事件),组件改为「挂载读一次快照 + 订阅事件」,并修掉迟到快照覆盖用户新选择的竞态。
|
||||
- 验证:Rust 定向 `platform_asset_upload` 3/3、`error_report::submit` 4/4、`workspace_preferences` 4/4;前端定向 `assetDirectUpload` 3/3、`errorReporting` 11/11、`ErrorReportDialog` 3/3、`chatPromptPolish` 18/18、`resourceReferenceInput` 43/43;`npm run ai-game-creator-shell:check:web` 1857 passed / 14 skipped;编码、文档索引、`git diff --check`、`cargo fmt --check` 通过。
|
||||
|
||||
## 当前切片证据:账户与钱包(2026-09-24)
|
||||
|
||||
- 新增 `src-tauri/src/account_api.rs` 与五个命令(recharge-center / wallet-ledger / create order / confirm wechat order / redeem code):Rust 从当前平台会话取 origin 与 Bearer,解析 envelope 并映射稳定错误分类;401 返回 `authentication-required` 由渲染层按既有会话续期链路重试一次,付费订单未知结果不自动重放。
|
||||
- 渲染层新增 `src/services/accountHost.ts` 与 `src/services/platformSessionRetry.ts`;`useAccountWallet` 与 `stores/useWalletStore` 改为 typed invoke,`clientApi` 不再承载账户与钱包请求。Direct Codex 的登录失效判定与账户命令共用同一份分类,避免两处口径漂移。
|
||||
- 验证:Rust 定向 `account_api` 4/4;前端定向 `accountHost` 3/3、`walletStore` 14/14;`npm run ai-game-creator-shell:check:web` 186 passed / 1857 passed / 14 skipped;编码、文档索引、`git diff --check`、`cargo fmt --check` 通过。
|
||||
- 仍未迁移:登录、验证码、refresh、登出与开发服务器选择,见 `【里程碑】AGC认证会话与账户网络下沉Rust-2026-09-24.md`;真实账号登录/续期/微信支付仍需环境证据。
|
||||
|
||||
## 本轮取证(2026-09-24)
|
||||
|
||||
- 验收 1(React 不再直连):`rg "requestClientApi|fetchClientHttp|accessToken|refreshToken" apps/ai-game-creator-shell/src` → **0 命中**;`rg projectsRoot apps/ai-game-creator-shell/src` → 0 命中。
|
||||
- 验收 3(静止时无 React 轮询):`rg setInterval apps/ai-game-creator-shell/src` 只剩两类非远端任务——计时/动画(`AuthenticatedClient` 的登录耗时与验证码倒计时、`useLiveNow`、`useDesignReplyAnimation`、`DirectProjectConversation` 的本地时钟)和拖拽重复器(`TransformEditor`)。
|
||||
- 验收 4/5 的定向用例:`npx vitest run tests/gameDistributionPublish.test.ts tests/assetDirectUpload.test.ts tests/pluginHost.test.ts tests/directActiveTurns.test.tsx tests/resourceCanvasAssetGenerationQueue.test.ts tests/recentProjectsHook.test.tsx tests/projectCreationDirectory.test.ts --root apps/ai-game-creator-shell` → **7 文件 / 63 passed**。
|
||||
- 变异验证(2026-09-24):拿掉 `platform_asset_upload::validate_upload_host` 的「只允许回环 http 与 `*.aliyuncs.com` https」判定后,`validates_upload_hosts_without_accepting_arbitrary_origins` 精确挂在 `https://evil.example.com/upload` 那条断言上,证明这条防任意主机上传的用例不是空跑;改回后该用例与 `corrupt_or_foreign_session_files`(见认证里程碑)各自 exit 0。
|
||||
- 脱敏用例的强度复核(2026-09-24):禁用 `error_report::sanitize::redact_urls` 后,只有 `keeps_api_route_while_redacting_url_origin_and_query`(精确相等断言)变红,`redacts_credentials_urls_paths_and_ids` 仍然通过——`PATH_PATTERN` 的盘符分支大小写不敏感,`http://` 里的 `p:` 也会命中并把整段 URL 吞成 `http<path>`,所以「URL 被换成占位符」这件事当时没有被断言到。已给该用例补一条 `assert!(sanitized.contains("<url>"))`:规则禁用时新断言精确变红,恢复后 `error_report` 定向用例全绿(sanitize 4 条 + submit 4 条)。
|
||||
- 变异验证之三/四(2026-09-24):① 去掉 `error_report::submit::stable_submission_id` 里的 `ids.sort_unstable()` 后,`submission_id_is_stable_and_order_independent` 立刻红(同一批事件两种顺序给出两个不同 `agc-error-report-*`),证明「同批重放命中服务端幂等键」的排序不变性被守住;② 把 `account_api::map_http_error` 的 401 分支前缀 `authentication-required: ` 去掉后,`expires_and_permissions_keep_stable_categories` 精确变红——这正是渲染层 `platformSessionRetry` 用来决定「续期一次再重放」的分类契约,两端各有一条用例钉住。改回后 `account_api::tests` 与 `error_report::submit::tests` 各自 exit 0。
|
||||
- 仍未验证(需要真实环境):真实 OSS 发行包上传与送审、真实账户下的发行资料生成、发布取消/未知结果的端到端表现。
|
||||
@@ -3,7 +3,7 @@
|
||||
| 字段 | 值 |
|
||||
| --------- | ------------------------------------------------------------------------- |
|
||||
| Milestone | `docs/project-memory/plans/【里程碑】AGC更新发布管线渠道化-2026-09-17.md` |
|
||||
| Status | ready |
|
||||
| Status | implemented-awaiting-runtime-acceptance |
|
||||
| Owner | Codex |
|
||||
|
||||
## 修改边界
|
||||
@@ -35,3 +35,12 @@
|
||||
- 签名缺失即失败关闭:构建机未注入签名私钥时发布中止,不产生半成品清单。
|
||||
- 渠道端点写进产物:渠道名一旦发布不可改名(改名等于已发布客户端再也找不到更新)。
|
||||
- 回滚点:发布脚本与流水线都在本里程碑内,回滚后客户端仍可用原先的自研清单协议;迁移桥可独立停用。
|
||||
|
||||
## 本轮复核(2026-09-24)
|
||||
|
||||
状态原为 `approved` / `ready`(规范评审态),实现其实已经落地,本轮按当前工作树复核并改记为 `implemented-awaiting-runtime-acceptance`:
|
||||
|
||||
- 渠道单点定义 `apps/ai-game-creator-shell/scripts/channel-identity.mjs`;`build-release.mjs` 由它解析渠道,渠道清单 URL 与构建期端点随渠道变化。
|
||||
- 流水线渠道参数:`jenkins/Jenkinsfile.ai-game-creator-shell-build` 有 `AGC_UPDATE_CHANNEL`(dev / release / 自定义小写名)并把部署目标绑定为渠道对应的构建分区。
|
||||
- 定向测试(本轮实跑):`node --test apps/ai-game-creator-shell/scripts/build-release.test.mjs apps/ai-game-creator-shell/scripts/release-oss.test.mjs apps/ai-game-creator-shell/scripts/prepare-macos-codex.test.mjs apps/ai-game-creator-shell/scripts/cargo-features.test.mjs` → **60 passed / 0 failed**,含 `channel manifest carries version, platform keys and signature`、`missing signature fails the channel manifest closed`、`channel manifest URL and build-time endpoint follow the channel`、`release windows uploads only its own partition and cannot write the dev bridge`。
|
||||
- 未执行(需要签名私钥与发布授权):真实签名打包、真实 OSS 上传、各渠道真机升级验证。
|
||||
|
||||
@@ -0,0 +1,49 @@
|
||||
# 【实施计划】AGC 本地状态事件化第一批
|
||||
|
||||
Version: `v1`
|
||||
Status: `implemented-awaiting-runtime-acceptance`
|
||||
Date: `2026-09-23`
|
||||
Parent Spec: `docs/project-memory/plans/【里程碑】AGC渲染层事件化与Rust数据源-2026-09-23.md`
|
||||
|
||||
## 修改边界
|
||||
|
||||
1. `src-tauri/src/agent/direct_runtime` 与 `runtime_driver`:增加活动回合快照事件,在注册、状态变化和 guard 释放后发送;不改变既有 Tauri command 与运行语义。
|
||||
2. `src/features/agent-runtime/directActiveTurns.ts`:订阅事件并去重,首次只读一次快照,移除 5 秒定时器。
|
||||
3. `src-tauri/src/asset_generation_tasks.rs`:账本写入成功后发送项目任务变更事件;`resourceCanvasAssetGenerationQueue.ts` 通过事件唤醒单次读取,恢复/丢事件仍允许显式读取。
|
||||
4. `src-tauri/src/plugin_host.rs`:插件状态变更后发送插件快照事件;`RuntimeConfigDialog.tsx` 订阅事件并移除 1 秒定时器。
|
||||
5. 对应 Vitest/Rust 测试与必要的 AGC 文档更新。
|
||||
6. `direct_thread_manager`、Tauri handler 与聊天订阅 hook 补幂等 unsubscribe;`App.tsx` 保存失败后解除自触发重写,定向覆盖故障注入与策略读取单飞。
|
||||
|
||||
## 实施顺序
|
||||
|
||||
- 先增加 Rust 事件与单元测试,再改 React 订阅,避免出现“旧读取已删、新事件未发”的中间态。
|
||||
- 事件 handler 只接受当前项目/当前代次,按内容签名去重;清理函数必须幂等。
|
||||
- 事件不可用时只保留首次快照与用户触发的显式刷新,不增加隐式定时器。
|
||||
|
||||
## 验证命令
|
||||
|
||||
- `npm exec vitest run -- apps/ai-game-creator-shell/tests/directActiveTurns.test.tsx apps/ai-game-creator-shell/tests/resourceCanvasAssetGenerationQueue.test.ts apps/ai-game-creator-shell/tests/tauriEventSubscription.test.ts`
|
||||
- `npm exec vitest run -- apps/ai-game-creator-shell/tests/appSurface.test.ts`
|
||||
- `npm --prefix apps/ai-game-creator-shell run typecheck`
|
||||
- 对 AGC 壳 Rust 运行相关单测分片或定向 `cargo test`
|
||||
- `npm run check:encoding`
|
||||
- `git diff --check`
|
||||
|
||||
## 回滚点
|
||||
|
||||
事件名与 payload 是内部 Tauri 合同;若运行时验证发现订阅或事件顺序问题,可保留 Rust 事件发送、临时恢复一次性快照读取,并回退 React reducer,不修改持久化账本和既有 command。
|
||||
|
||||
## 当前验证记录
|
||||
|
||||
- `npm run ai-game-creator-shell:check:web`:类型检查、配置契约和 AGC Web 全量门禁通过,`1858 passed / 14 skipped`。
|
||||
- 定向事件/生命周期测试:`41 passed`;其中活动回合 `11/11`、资源生成队列 `19/19`、线程订阅 `2/2`。
|
||||
- Rust 定向测试:Direct Thread Manager `13/13`、活动回合快照 `1/1`、素材生成账本 `15/15`、插件宿主 `17/17`。
|
||||
- `cargo fmt --check`、`npm run check:encoding`、`npm run check:doc-index`、`git diff --check` 通过。
|
||||
- 未验证真实 Provider、打包后 Tauri 窗口时延和外部发行网络迁移;账户、素材上传、错误上报与发行网络仍按后续里程碑保留。官方模型目录已在本轮单独由 `load_game_creator_llm_models` 下沉到 Rust,但不能据此宣称全部 React 网络 I/O 已归 Rust。
|
||||
|
||||
## 本轮取证(2026-09-24)
|
||||
|
||||
- 验收 1(活动回合与素材任务不再定时轮询):`rg setInterval apps/ai-game-creator-shell/src` 全仓只剩计时/动画与拖拽重复器;`directActiveTurns.ts` 走 `DIRECT_ACTIVE_TURNS_CHANGED_EVENT` 事件 + 单飞读取并在注释里写明「不恢复定时轮询」,`resourceCanvasAssetGenerationQueue.ts` 走 `game-creator-asset-generation-task-changed` 事件(Rust 在账本状态变更处 emit),事件桥不可用时才回退注入的 wait。
|
||||
- 验收 3/7(订阅先于快照、重复事件不换数组身份、卸载后迟到事件不写回、subscriber 幂等注销):`npx vitest run tests/directActiveTurns.test.tsx tests/resourceCanvasAssetGenerationQueue.test.ts --root apps/ai-game-creator-shell` → **11 + 19 passed**;Rust 侧 `cargo test --manifest-path apps/ai-game-creator-shell/src-tauri/Cargo.toml --offline -- direct_thread_manager --test-threads=1` → **13 passed**。
|
||||
- 验收 4(插件状态:进入读一次 + 事件更新 + 显式刷新):`npx vitest run tests/pluginHost.test.ts --root apps/ai-game-creator-shell` → **14 passed**。
|
||||
- 仍未验证(需要真实客户端):长回合中插件状态事件与素材任务事件的真实时序、真实 Provider 生成下的任务账本事件密度。
|
||||
@@ -3,7 +3,7 @@
|
||||
| 字段 | 值 |
|
||||
| --- | --- |
|
||||
| Version | 1.0 |
|
||||
| Status | in-progress |
|
||||
| Status | implemented-awaiting-runtime-acceptance |
|
||||
| Date | 2026-09-24 |
|
||||
| Parent Milestone | `docs/project-memory/plans/【里程碑】AGC模型目录上游同步-2026-09-24.md` |
|
||||
|
||||
@@ -34,3 +34,12 @@
|
||||
- **混合版本**:module 的缺行语义变化要求 module 与 api-server 同批发布/回滚;未升级的 api-server 会把自己的 AGC 接口打到 `503`(后台 DTO 未变,admin-web 可独立发布)。回滚点必须同时覆盖 module 与 api-server。
|
||||
- **存量目录**:结构合法的旧目录(含 `quality/fast`)不会自动重建,需要 owner 在后台修改或清空该行后重启。
|
||||
- **目录规模**:目录项上限仍是 32;上游在售模型超过 32 条时同步会失败并记录原因,需要 owner 在后台维护子集。
|
||||
|
||||
## 本轮核对(2026-09-28)
|
||||
|
||||
上游已用同主题提交落地,合并后工作树与计划完全对齐:
|
||||
|
||||
- `module-runtime`:`AgcModelCatalog::from_upstream_models`(含 slug/默认项/32 项上限与单测)在 `server-rs/crates/module-runtime/src/agc_models.rs`。
|
||||
- `api-server`:`ensure_agc_model_catalog_initialized` 在 `src/agc_models.rs`,接线在 `src/main.rs`(启动期按 HTTP 角色调用,失败只记 error),未初始化统一 `503` 与 `AGC_MODEL_CATALOG_NOT_INITIALIZED` 语义在 `agc_models.rs` 里。
|
||||
- 上游提交:`4234a21ee 服务端:AGC 模型目录缺配置时改为启动期从上游同步,保留原目录格式`;本地真实上游 smoke(清空目录 → 启动日志「已按上游模型列表初始化 AGC 模型目录 revision=1 model_count=6」→ `GET /api/llm/models` 返回原名 → 上游不可达时 503 且不写替代目录)已经记在 `decision-log` 里。
|
||||
- 仍待补:生产发布(module 与 api-server 必须同批发布/回滚)与超过 32 条上游模型时的 owner 维护动作,都属于外部环境/发布范畴。
|
||||
@@ -3,7 +3,7 @@
|
||||
| 字段 | 值 |
|
||||
| --- | --- |
|
||||
| Milestone | `docs/project-memory/plans/【里程碑】AGC渠道安装身份隔离-2026-09-21.md` |
|
||||
| Status | ready |
|
||||
| Status | implemented-awaiting-runtime-acceptance |
|
||||
| Owner | 当前 Agent |
|
||||
|
||||
## 修改边界
|
||||
@@ -54,3 +54,8 @@
|
||||
- `channel-identity.mjs` 是展示名单一来源。发布构建将同一 `productName` 同时注入 Tauri 安装配置、原生窗口标题和 `VITE_AGC_PRODUCT_NAME`;React 自绘标题栏及关于/运行时配置展示从该注入值读取。
|
||||
- 因此 Windows NSIS 默认生成的快捷方式、开始菜单/卸载注册表展示名随 Tauri `productName` 变为 `陶泥儿开发版`;未新增自定义注册表或快捷方式实现。
|
||||
- 静态 Tauri 基线配置同步为 `陶泥儿开发版`,本地壳与正式 `dev` 包的显示名保持一致。
|
||||
|
||||
## 本轮复验(2026-09-24)
|
||||
|
||||
- `node --test apps/ai-game-creator-shell/scripts/build-release.test.mjs apps/ai-game-creator-shell/scripts/release-oss.test.mjs apps/ai-game-creator-shell/scripts/prepare-macos-codex.test.mjs apps/ai-game-creator-shell/scripts/cargo-features.test.mjs`:**60 passed / 0 failed**,含「release / beta 的 Windows 与 macOS 构建只写自己渠道分区、不能写 dev 桥」四条分区隔离用例。
|
||||
- 仍未执行:真实渠道打包(需要签名私钥与发号/上传授权)、双渠道真机并存安装、macOS 构建节点实跑。
|
||||
|
||||
@@ -0,0 +1,46 @@
|
||||
# 【实施计划】AGC 渲染层下沉与最新 master 对齐
|
||||
|
||||
| 字段 | 值 |
|
||||
| --- | --- |
|
||||
| Milestone | `docs/project-memory/plans/【里程碑】AGC渲染层下沉与最新master对齐-2026-09-28.md` |
|
||||
| Status | implemented-awaiting-runtime-acceptance |
|
||||
| Owner | Codex |
|
||||
|
||||
## 一句话交付结果
|
||||
|
||||
`codex/agc-renderer-io-downshift` 合入 `origin/master` 后,AGC 渲染层仍然是「只做展示与交互」的离线前端,
|
||||
网络 IO 与正式数据仍全部在 Rust 侧,且首页「运行中的项目」、封面生成队列与维护态提示三种能力在合并后
|
||||
行为正确、有定向测试证明。
|
||||
|
||||
## 任务清单
|
||||
|
||||
1. 冲突收口:机械冲突按「本分支退役渲染层传输」取舍(nginx SPA 白名单、`.gitignore`、mobile 脚本、
|
||||
capabilities 描述、已退役计划随 master 删除、测试保留双方)。
|
||||
2. 活动回合事实源统一:删除 `direct_runtime` 里的重复快照函数;把 `emit_direct_active_turns_changed()`
|
||||
移到 Direct 线程管理器的登记 / 进度 / 收口变更点;迁移对应的 Rust 用例。
|
||||
3. 封面生成补 `generationInputs`,并为「队列未完成 → 轮询 → 拿到素材 ID」保留 Rust 侧用例。
|
||||
4. 维护态:Rust 给出稳定分类标记,渲染层在统一的 invoke 边界消费该标记并广播 `CLIENT_MAINTENANCE_EVENT`;
|
||||
`MaintenanceNotice.tsx` 与 `tests/maintenanceNotice.test.tsx` 跟着新入口更新。
|
||||
5. 文档收口:保留双方条目的冲突文档合并;`decision-log` / `pitfalls` 追加本轮结论;实施计划与里程碑
|
||||
回写取证。
|
||||
|
||||
## 证据要求
|
||||
|
||||
- 每个任务都要有可复跑的定向用例,并在本计划内写明命令与结果。
|
||||
- 涉及行为变化的用例必须做变异验证:拿掉修复后用例变红。
|
||||
- 区分「源码级通过」与「需要真实客户端 / 真实 Provider 才能取得的运行时证据」。
|
||||
|
||||
## 完成后的临时文档处理
|
||||
|
||||
本里程碑验收通过后,把仍然有效的长期边界同步回现行技术方案与项目记忆,再删除本里程碑与实施计划两份
|
||||
临时文档。
|
||||
|
||||
## 本轮取证(2026-09-28)
|
||||
|
||||
五步任务全部落地,逐条证据与「与 master 既定决策的分歧」见同名里程碑的《本轮取证》一节,这里只记范围事实:
|
||||
|
||||
1. 冲突收口:29 处冲突全部解决,机械取舍按「本分支退役渲染层传输」定向(nginx SPA 白名单、`.gitignore`、mobile 检查脚本、capabilities 描述、两个已退役计划随 master 删除、测试保留双方)。
|
||||
2. 活动回合事实源统一:删除 `direct_runtime` 的第二份快照与旧注册表的通知位点,改由 Direct 线程管理器三处变更点广播;Rust 定向用例 17 passed。
|
||||
3. 封面生成补 `generationInputs`:`tests/gameDistributionPublish.test.ts` 7 passed。
|
||||
4. 维护态:Rust 统一分类 + 单一事件,渲染层只订阅;Rust 1 passed、Web 2 passed。
|
||||
5. 文档收口:`decision-log` 与 `pitfalls` 各追加一条 2026-09-28 记录;两份冲突文档保留双方条目。
|
||||
@@ -1,7 +1,7 @@
|
||||
# AGC 画布交互稳定性修复实施计划
|
||||
|
||||
- Date: 2026-09-16
|
||||
- Status: awaiting-runtime-acceptance
|
||||
- Status: implemented-awaiting-runtime-acceptance
|
||||
- Milestone: [画布交互稳定性修复](./【里程碑】AGC画布交互稳定性修复-2026-09-16.md)
|
||||
|
||||
## 修改顺序与边界
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# AGC 统一错误诊断与验收反馈实施计划
|
||||
|
||||
Version: 1.0
|
||||
Status: active
|
||||
Status: implemented-awaiting-runtime-acceptance
|
||||
Date: 2026-09-15
|
||||
Parent Milestone: `【里程碑】AGC统一错误诊断与验收反馈-2026-09-15.md`
|
||||
|
||||
@@ -40,3 +40,24 @@ Parent Milestone: `【里程碑】AGC统一错误诊断与验收反馈-2026-09-1
|
||||
- `apps/ai-game-creator-shell/src/components/modal/MaintenanceNotice.tsx` 在客户端根部统一展示不可被局部业务兜底替代的大弹窗;发布、上传、资源换签等共用 `requestClientApi` 的请求均进入同一出口。
|
||||
- 普通 500、资源损坏和本地 `blob:` 图片预览失败不自动归类为维护;图片换签接口在维护期间失败时会触发统一弹窗,但本地刚选中的图片预览仍不依赖后端。
|
||||
- 验收补充:维护期间发布接口不能只显示“创建平台游戏失败”等局部文案;维护弹窗出现一次即可覆盖并发失败请求,关闭后业务页仍可重试。
|
||||
## 当前进度(2026-09-24)
|
||||
|
||||
- 已落地并验证:统一错误事件模型与脱敏(`cargo test --manifest-path apps/ai-game-creator-shell/src-tauri/Cargo.toml --offline -- --test-threads=1 runtime_error` → 7 passed)、DirectProject 失败安全投影与项目内 sidecar、下一轮诊断上下文、app-server 终态与超时分类、试玩 attempt 上限。
|
||||
- 本轮补缺口:渲染层取回 `detailRef` 的口径抽成 `apps/ai-game-creator-shell/src/services/agentRuntimeErrorDetail.ts`,新增 `tests/agentRuntimeErrorDetail.test.ts`(4 条);Rust 侧新增 `direct_codex_failure_text_keeps_the_detail_ref_marker_for_the_renderer` 钉住同一份文案。两侧用例互相引用用例名,改文案或改解析都会变红(文案标记过去只在渲染层内联正则里,两侧都没有测试)。
|
||||
- 仍未完成的是验收标准 6 的交互项:诊断正文目前随失败文案一次性读回并展示,尚未做成「点击详情后才读取」的展开入口。要继续的话先在主规范里定交互,再改 UI;在那之前本里程碑保持 `active`,不按已完成收口。
|
||||
|
||||
## 报告缺口关闭(2026-09-24)
|
||||
|
||||
上一轮记录里「验收标准 6 的交互项未完成」已经实现,本轮把计划从 `active` 改记为 `implemented-awaiting-runtime-acceptance`:
|
||||
|
||||
- 修掉一个真实缺陷:Native 已经下发 `direct-codex-failure:v2`(在 v1 之上多了 `code=` 与末尾 `;详情:<detailRef>`),但渲染层映射只认 v1,任何 DirectProject 失败都被兜底成「执行失败,请稍后重试」,Rust 精心产出的阶段、摘要与建议全部被丢掉。现在 v1 / v2 共用同一套脱敏与阶段映射(v2 用例在 `tests/agentRuntimeModel.test.ts`,移除 v2 分支该用例变红;2026-09-24 复核:把正则里的 `:v2` 改成 `:v3` 后该文件精确 1 条失败、其余 18 条通过,声明已被独立复现)。
|
||||
- 失败提示不再预读也不内联诊断正文:控制器只把安全 `publicText` 交给面板,`detailRef` 与提示文案分开持有;聊天状态栏下方新增「查看详情 / 收起详情」入口,展开时才调用 `read_agent_runtime_error_detail`(原生命令仍做目录校验与二次脱敏),读不到只显示一句说明,不影响提示本身。
|
||||
- 钉住这条交互的用例:`tests/appSurface/chat-composer.suite.ts` 的「失败提示保留可执行原因,诊断正文只在「查看详情」时读取」(断言点击前没有 `read_agent_runtime_error_detail` 调用、正文不在提示或历史消息里,点击后按 `projectPath + detailRef` 读取并展示,再点收起)。
|
||||
- 自动化:`npx vitest run tests/agentRuntimeModel.test.ts tests/agentRuntimeErrorDetail.test.ts`(23 passed)、`npx vitest run tests/appSurface.test.ts`(191 passed / 9 skipped)、`npx tsc -p apps/ai-game-creator-shell/tsconfig.json --noEmit`、`cargo test --manifest-path apps/ai-game-creator-shell/src-tauri/Cargo.toml --offline -- --test-threads=1 runtime_error`(7 passed)。
|
||||
- 仍未验证(需要真实账号与 Provider):真实失败回合下从提示进入详情、以及下一轮追问从历史读取失败证据的端到端表现。
|
||||
|
||||
## 2026-09-28 上游取代:诊断详情入口按 master 收口
|
||||
|
||||
合并 `origin/master` 时发现上游提交 `5398a53e6 宿主与前端:用户可见文案不再带诊断引用,失败也进错误上报池` 已经明确退役本计划第 6 条的「查看详情」交互:失败文案不再带 `;详情:…` 引用,`read_agent_runtime_error_detail` 命令与渲染层 `agentRuntimeErrorDetail.ts` 一并删除,失败线索只留在 `.agent/runtime/errors`、应用日志与错误上报池。
|
||||
|
||||
本里程碑接受上游口径,主题的其余验收(统一错误事件、失败安全投影、下一轮诊断上下文、终态分类、试玩 attempt 上限、v1/v2 文案映射)保持不变;本次对齐删除了该交互的专属实现与用例,失败说明继续由 `turn.completed.failure` 事件投影成同一份安全文案。结论同时记入 `decision-log` 2026-09-28 条目。
|
||||
@@ -0,0 +1,65 @@
|
||||
# 【实施计划】AGC 认证会话与账户网络下沉 Rust
|
||||
|
||||
Version: `v1`
|
||||
Status: `implemented-awaiting-runtime-acceptance`
|
||||
Date: `2026-09-24`
|
||||
Parent Spec: `docs/project-memory/plans/【里程碑】AGC认证会话与账户网络下沉Rust-2026-09-24.md`
|
||||
|
||||
## 修改边界
|
||||
|
||||
1. 新增 `src-tauri/src/auth_session.rs`:AppData 私有凭据文件(`client-session.json`)、
|
||||
origin 校验、refresh cookie 解析与原子写入、并发续期合并、401 续期重放与事件发送。
|
||||
2. 新增 `src-tauri/src/account_api.rs`:profile dashboard / 充值中心 / 创建订单 /
|
||||
确认微信充值 / 钱包账单 / 兑换码 typed commands。
|
||||
3. `src-tauri/src/main.rs` 注册新 command 与新模块;`platform_asset_upload.rs`、
|
||||
`game_distribution_publish.rs`、`llm_catalog.rs`、`error_report/submit.rs` 改为经
|
||||
`auth_session` 获取会话并在 401 时续期重放一次,而不是只读当前快照。
|
||||
4. 渲染层 `clientAuth.ts`、`clientHttp.ts`、`clientApi.ts`、`platformSession.ts`、
|
||||
`AuthenticatedClient.tsx`、`useAccountWallet.ts`、`stores/useWalletStore.ts`
|
||||
改为 typed invoke / 事件;
|
||||
|
||||
## 修改顺序
|
||||
|
||||
1. 先落 Rust 凭据存储与 origin 校验,配单元测试;此时尚无调用方,不改变现役行为。
|
||||
2. 落认证 commands 与事件,Rust 内部安装/清除本地运行时会话(复用既有
|
||||
`install_platform_session` / `clear_platform_session` 与 Runner 传播),保留旧 command。
|
||||
3. 落账户/钱包 commands,复用同一会话获取与 401 续期重放。
|
||||
4. 切换渲染层:`AuthenticatedClient` 与钱包改为 command/事件;删除 token 持久化与
|
||||
`fetchClientHttp` 直连调用点。
|
||||
5. 最后清理:删除 `clientApi`/`clientHttp` 中已无调用方的直连实现与旧 localStorage 迁移键,
|
||||
更新主规范与共享记忆。
|
||||
|
||||
## 验证命令
|
||||
|
||||
- `cargo test --manifest-path apps/ai-game-creator-shell/src-tauri/Cargo.toml auth_session`
|
||||
- `cargo test --manifest-path apps/ai-game-creator-shell/src-tauri/Cargo.toml account_api`
|
||||
- `npm --prefix apps/ai-game-creator-shell run typecheck`
|
||||
- `npx vitest run apps/ai-game-creator-shell/tests/clientAuth.test.ts apps/ai-game-creator-shell/tests/accountWallet.test.tsx`
|
||||
- `npm run ai-game-creator-shell:check:web`
|
||||
- `cargo fmt --manifest-path apps/ai-game-creator-shell/src-tauri/Cargo.toml -- --check`
|
||||
- `npm run check:encoding`、`npm run check:doc-index`、`git diff --check`
|
||||
|
||||
## 风险与回滚点
|
||||
|
||||
- refresh 凭据落盘是本计划的最高风险项:必须使用与其它 AGC 私有文件相同的 ACL/普通文件
|
||||
门禁,并且只写 refresh cookie(不写 access token)。
|
||||
- 401 续期重放必须只重放一次;付费创建订单的未知结果按 `result-unknown` 处理,不自动重放。
|
||||
- 回滚点:保留旧 `install/clear_platform_account_session` 与旧 `clientAuth` 分支直到验收;
|
||||
回退时删除 Rust 凭据文件即回到未登录状态。
|
||||
|
||||
## 当前验证记录(2026-09-24)
|
||||
|
||||
- 新增 `src-tauri/src/auth_session.rs`:AppData 私有 `client-session.json`(Unix 0o600、Windows reparse 检查、私有目录树与原子替换)、origin 校验(纯 origin、非本机必须 HTTPS、发布构建限渠道 origin)、refresh cookie 解析与轮换、登录/验证码/续期/登出 HTTP、`install_client_session_locally` / `clear_client_session_locally` 复用既有 Runner 传播与 app-server 停机路径。
|
||||
- 新增 6 条 typed command:`read_client_auth_state`、`refresh_client_auth_session`、`send_client_phone_login_code`、`login_client_with_password`、`login_client_with_phone_code`、`logout_client_session`,并发出 `agc-client-auth-state-changed` 状态事件(只含状态、用户展示字段与 origin)。
|
||||
- 路由语义分离:会话路由的 401/403 归类成 `authentication-required` / `permission-denied`(可据此清会话),登录路由保留服务端原因(「手机号或密码错误」),避免把用户输入错误显示成登录失效。
|
||||
- Direct 回合保活改为 Rust 持有:`DirectTaonierActiveInvocationGuard` 在登记回合时启动 `spawn_client_session_keepalive`(30 秒 tick、按 access token 签发时间 4 分钟后才真正续期,drop 即 abort),渲染层删除 5 分钟 `setInterval` 与 `DIRECT_CODEX_SESSION_KEEPALIVE_MS`;401 补续期重试路径保留。\n- 渲染层:`clientAuth.ts` 收敛为 typed invoke façade;`platformSession.ts` 收敛为身份代次投影(Rust 事件驱动,同一账号续期不推进代次);`AuthenticatedClient` 的三态恢复、登录、登出全部改走 command/事件;服务器选择迁到 Rust 客户端偏好(`set_client_server_selection`)。
|
||||
- 删除:`services/clientApi.ts`、`clientHttp` 的 `fetchClientHttp`/超时封装/服务器选择 localStorage、`clientAuth` 的 token 持久化、`install/clear/read platform_account_session` 三条渲染层写入入口(Rust 认证内部直接调用)。渲染层 `src` 内已无 `fetch(`、无 access token / refresh cookie 读写。
|
||||
- 验证:Rust 定向 `auth_session` 12/12(含并发续期复用、事件不含凭据、保活窗口判定与未初始化不启动任务)、`direct_runtime` 97/97、`workspace_preferences` 6/6、`account_api` 4/4、`platform_asset_upload` 3/3、`error_report::submit` 4/4;前端 `clientAuthHost` 6/6、`conversationModelSelect` 29/29、`useTemplateLibrary` 11/11、appSurface 认证切片 12/12;`npm run ai-game-creator-shell:check:web` 184 passed / 1800 passed / 14 skipped;`cargo fmt --check`、`check:encoding`、`check:doc-index`、`git diff --check` 通过。
|
||||
- 未验证:真实账号登录/续期/登出、微信支付、多窗口并发刷新、真实 Provider 回合跨 token 过期的保活,仍需环境证据。Direct 回合的 5 分钟保活仍由渲染层定时触发(真正续期已在 Rust),后续可改为由 Rust 在出站调用前按到期时间自续期。
|
||||
|
||||
## 本轮取证(2026-09-24)
|
||||
|
||||
- 原生定向(同一批过滤一次跑完 42 项):`cargo test --manifest-path apps/ai-game-creator-shell/src-tauri/Cargo.toml --offline -- workspace_preferences account_api platform_asset_upload auth_session error_report::submit direct_thread_manager --test-threads=1` → **42 passed**。
|
||||
- 分组明细:`auth_session::` **12 passed**(会话存储所有权与权限、origin 校验、6 条命令的错误分类)、`account_api::` **4 passed**、`platform_asset_upload::` **3 passed**、`workspace_preferences` 6、`direct_thread_manager` 13、`error_report::submit` 含在其中。
|
||||
- 结构:`rg "accessToken|refreshToken" apps/ai-game-creator-shell/src` → 0 命中(渲染层不再持有凭据);`localStorage` 只剩偏好迁移 shim。
|
||||
- 仍未验证(需要真实账号):真实登录/续期/登出、微信支付、多窗口并发刷新、真实 Provider 回合跨 token 过期。
|
||||
@@ -1,7 +1,7 @@
|
||||
# AGC 资源 JSON 语义识别实施计划
|
||||
|
||||
- Date: 2026-09-16
|
||||
- Status: awaiting-runtime-acceptance
|
||||
- Status: implemented-awaiting-runtime-acceptance
|
||||
- Milestone: [AGC 资源 JSON 语义识别](./【里程碑】AGC资源JSON语义识别-2026-09-16.md)
|
||||
|
||||
## 实施边界
|
||||
|
||||
@@ -1,61 +0,0 @@
|
||||
# 【实施计划】AGC 资源 kind Rust 枚举与 ts-rs 绑定
|
||||
|
||||
| 字段 | 值 |
|
||||
| --- | --- |
|
||||
| Milestone | `docs/project-memory/plans/【里程碑】AGC资源kind枚举化Rust绑定与内部收紧-2026-09-15.md` |
|
||||
| Status | complete |
|
||||
| Owner | Codex |
|
||||
|
||||
## 修改边界
|
||||
|
||||
允许修改:
|
||||
|
||||
- `server-rs/crates/shared-contracts` 内 GameCreationApp 资源 kind 的独立 Rust 模块;
|
||||
- shared-contracts 的可选 ts-rs 绑定 feature;
|
||||
- ai-game-creator-shell 的 shared-contracts feature 引用和生成测试入口;
|
||||
- shell 内生成的 GameCreationApp kind TypeScript 文件;
|
||||
- 对应 Rust/TS 定向测试与文档 todo 证据。
|
||||
|
||||
本切片已落地:
|
||||
|
||||
- `GameCreationAppAssetManifestEntry.kind` 由 `String` 收紧为 `GameCreationAppAssetKind`:这是公开 Rust 类型的破坏性变更,按「不写历史兼容代码」直接改类型,不加兼容层、不做数据迁移;manifest 反序列化未知值收口为 `Unknown`。
|
||||
- 上传内容推断的字体写入 `Font`,未知上传类型写入 `Unknown`;图集切片 manifest 写入 `Icon`。
|
||||
- shell 内 manifest kind 的写入侧与读取侧统一为正式枚举成员:资源登记、字体导入、direct runtime 产物、平台美术登记与恢复、manifest 必填校验、资源编辑派生、UI 设计桥接与工作流。
|
||||
- 资源编辑请求的 `sourceSubtype` 只传正式枚举成员;资源编辑内部源身份拆成「正式 kind / 项目版本 / Agent 回执」三类,项目版本与 Agent 回执不再冒充 manifest kind。
|
||||
- ts-rs 绑定改由 `cargo test export_bindings` 生成:枚举自带 `#[ts(export, export_to = …/src/contracts/generated/)]`;退役的 `BindingDTO` / `BindingChange` 不再导出,手写的 `exports_ui_editor_types` 已删除。
|
||||
- `packages/shared/src/contracts/generated/` 作为受控生成目录在 `.prettierrc.json` 中使用与 ts-rs 原始输出一致的格式选项,并在 `.gitattributes` 标记为 `linguist-generated`;生成文件仍参与 Prettier/ESLint 检查,`cargo test export_bindings` 可幂等复现且不再污染工作树。
|
||||
- `Unknown` 表示解析边界无法判定的输入;写入方可以保留该结果,但必须明确决定拒绝写入或交由后续归类,不得把它误写成某个具体 kind。
|
||||
- shell TS 资源引用边界消费生成绑定,资源 kind 集合从生成的 union 穷举派生,并为未知值保留原始值与上下文日志。
|
||||
- api-server 图片快速编辑来源校验改为严格解析 `GameCreationAppAssetKind`,只允许共享枚举的静态图片成员;删除原有 legacy/兼容字符串白名单,退役值不再放行。
|
||||
|
||||
明确不修改:
|
||||
|
||||
- `category`、`mediaType`、`source.kind`、`source.generationKind`;
|
||||
- api-server 的其他资源 taxonomy、SpacetimeDB schema、OpenAPI;本切片只改图片快速编辑的 GameCreationApp manifest 来源校验。
|
||||
- shared-contracts 的 canonical alias 表与读时自愈:alias 表已删除,严格解析和 `Unknown` 口径保持不变;
|
||||
- `packages/shared` 中重复的资源 kind 手写契约与其余前端裸 `string` 字段(后续切片)。
|
||||
|
||||
## 实现顺序
|
||||
|
||||
1. 新建独立 kind 模块,定义当前正式成员:17 个现有 canonical kind + `font` + `Unknown`,serde 使用 kebab-case。
|
||||
2. 为 enum 增加可选 ts-rs derive,默认 shared-contracts 构建不引入 ts-rs。
|
||||
3. 让 shell 的 shared-contracts 依赖打开绑定 feature;生成目录 2026-09-17 起收敛到 `packages/shared/src/contracts/generated/`(kind 是跨端契约,不再放 shell 私有目录)。
|
||||
4. 增加 Rust serde round-trip 与 Unknown 解析/序列化测试;TS 侧不再手写生成值集合,改为从生成 union 穷举派生。
|
||||
未知值通过 `parse_with_context` 收口到 `Unknown`,并把原始值与解析上下文交给壳层注册的 `app_log!` 回调(2026-09-17 起不再用 `tracing` / `kind-observability`)。
|
||||
5. 运行 shared-contracts 与 shell 定向测试,并用 `export_bindings` 复现生成文件;完成后将稳定结论回写里程碑并关闭本计划。
|
||||
|
||||
## 验证命令
|
||||
|
||||
1. `cargo fmt --all -- --check`
|
||||
2. `cargo test --locked -p shared-contracts game_creation_app --manifest-path server-rs/Cargo.toml`
|
||||
3. `cargo test --locked -p shared-contracts --features ts-bindings export_bindings --manifest-path server-rs/Cargo.toml`(生成 `packages/shared/src/contracts/generated/GameCreationAppAssetKind.ts`)
|
||||
4. `cargo test --locked --manifest-path apps/ai-game-creator-shell/src-tauri/Cargo.toml export_bindings`(生成 shell 自己的 ts-rs 绑定)
|
||||
5. `npx vitest run apps/ai-game-creator-shell/tests/assetKind.test.ts packages/shared/src/contracts/gameCreationApp.test.ts`(解析 Rust 源码的 `assetKindCanonicalMapping.test.ts` 2026-09-17 已删除:手写词汇表被移除后它没有比对对象)
|
||||
6. `npm run check:encoding`
|
||||
7. `git diff --check`
|
||||
|
||||
## 风险与回滚点
|
||||
|
||||
- 风险:ts-rs 默认生成 enum/union 形态与 serde rename 不一致;必须以生成文件和 round-trip 测试为准。
|
||||
- 风险:shared-contracts 被 SpacetimeDB/WASM 使用;ts-rs 必须是 optional feature,默认构建不可依赖。
|
||||
- 回滚点:本切片仅新增 enum/绑定,不改变现有 manifest JSON 解析;若生成链路不稳定,可回滚本提交而不影响现有业务。
|
||||
@@ -1,43 +0,0 @@
|
||||
# 【实施计划】AGC 资源 kind 词汇审计与绑定架构
|
||||
|
||||
| 字段 | 值 |
|
||||
| --- | --- |
|
||||
| Milestone | `docs/project-memory/plans/【里程碑】AGC资源kind枚举化词汇审计与绑定架构-2026-09-15.md` |
|
||||
| Status | complete |
|
||||
| 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,不进入代码里程碑。
|
||||
@@ -2,6 +2,8 @@
|
||||
|
||||
对应:[里程碑](./【里程碑】AGC资源菜单收纳-2026-09-17.md),Issue #409,产品已确认方案 A。
|
||||
|
||||
Status: implemented-awaiting-runtime-acceptance
|
||||
|
||||
## PR #410 CI 修复
|
||||
|
||||
以远端合并提交 959beebf 为基线:修复菜单文件 import 排序、Web 角标结构断言、活动回合空快照与晚到请求竞态;窗口发布次数断言对齐稳定快照合同。原生 HTTP scope 检查对齐官方 updater 当前权限,不恢复退役 OSS 白名单;Rust 图集测试补齐显式切片模式与 strict schema 字段,不放宽正式校验。按故障项定向测试后运行前端全套及原生契约检查;Rust 使用独立 target,实际未执行的检查必须单独列出。推送需再次确认。
|
||||
@@ -14,3 +16,10 @@
|
||||
4. 并行执行定向 Vitest、AGC 类型检查、编码与文档索引检查,再自审整体调用链。
|
||||
|
||||
风险:portal 浮层点击外部判定、缩放角标与拖拽冲突、原测试依赖完整工具栏。回滚仅撤销本分支 UI 与文档修改;无数据迁移。首个检查点为组件用例通过,第二个为工作台集成与类型检查。真实客户端未测则明确保留待验收状态。
|
||||
|
||||
## 本轮复验(2026-09-24)
|
||||
|
||||
- 共用收纳控件与 UI 基元:`npx vitest run packages/shared/src/components/OverflowActions.test.tsx packages/shared/src/components/ui.test.tsx` → **14 passed**(浮层开关、外部关闭、键盘、视口约束与表格/标签等基元语义)。
|
||||
- AGC 资源画布菜单与卡面:`npx vitest run tests/resourceCanvasBottomToolbar.test.tsx tests/resourceCanvasCardName.test.tsx tests/resourceCanvasToolbarModel.test.ts`(`--root apps/ai-game-creator-shell`)→ **39 passed**。
|
||||
- 全量界面门禁:`npm run ai-game-creator-shell:check:web` → 185 files passed / 1 skipped、1806 tests passed(含工作台整表回归)。
|
||||
- 仍未验收(人工、需要真实客户端):真实客户端视觉、原生保存对话框、触摸板操作手感。
|
||||
|
||||
@@ -49,3 +49,9 @@
|
||||
- 音频自带的 operation 幂等账本与任务账本是两层身份:任务 id 取 operation id,重试复用同一对 operation / 幂等键;不得为「省事」在重试时换新的请求身份(那是一次新的付费生成)。
|
||||
- 账本 `kind` 为音频时,`restore` 的入口文案若查不到工具栏模型会退化成素材名:入口文案必须由工具栏模型派生,避免恢复后文案漂移。
|
||||
- 后台跑生成会让「项目 revision CAS」窗口从提交前移到派发时刻:冲突时按失败收口(不静默重试),避免把生成写到非预期基线。
|
||||
|
||||
## 本轮复验(2026-09-24)
|
||||
|
||||
- 原生后台任务账本:`cargo test --manifest-path apps/ai-game-creator-shell/src-tauri/Cargo.toml --offline -- --test-threads=1 asset_generation_tasks` → **15 passed / 0 failed**(任务入账、阶段投影、终态收口与事件通知路径)。
|
||||
- 前端队列与面板:`npx vitest run tests/resourceCanvasAssetGenerationQueue.test.ts tests/resourceCanvasAssetGenerationTasksPanel.test.tsx --root apps/ai-game-creator-shell` → 与批量标签同批执行通过(队列单飞、事件唤醒回退、面板状态投影)。
|
||||
- 仍未验证(需要真实平台生成与账号):真实音频生成经后台任务账本跑到终态、失败重试与跨项目切换表现。
|
||||
|
||||
@@ -1,68 +0,0 @@
|
||||
# AGC 项目创建目录可选实施计划
|
||||
|
||||
Version: 1.0
|
||||
Status: active
|
||||
Date: 2026-09-17
|
||||
Related Spec: `docs/technical/【技术方案】AGC模板库与模板建项-2026-09-17.md`、`docs/【技术方案】AGC异步操作可恢复闭环-2026-09-14.md`
|
||||
|
||||
## 目标
|
||||
|
||||
让用户在 AGC 里能自己选项目创建目录:首页「做游戏 / 做方案」自动建项与模板库「使用模板」建项都落在用户选定的目录下;不选时保持 AGC 管理的默认位置(`<app_data>/projects`),行为与现状一致。
|
||||
|
||||
## 交接结果
|
||||
|
||||
- `create_automatic_local_game_project`、`create_automatic_local_game_project_from_template` 新增可选参数 `projectsRoot`;为空时由 Rust 侧回落到默认目录。
|
||||
- `pick_local_project_directory` 新增可选参数 `title`(只接受短标题,其余回退「选择游戏项目目录」)。
|
||||
- 新增用户偏好「项目创建目录」:`localStorage` 键 `genarrative-ai-game-creator.project-creation-directory.v1`。
|
||||
- 入口在客户端设置里:侧边栏「配置」→ 设置分类「工作区」;`RuntimeConfigDialog` 内用 `useProjectCreationDirectory` 展示与改选目录,不经过首页或模板库页头。
|
||||
- 首页「做游戏 / 做方案」与模板库「使用模板」建项时读取同一份偏好,用户不需要在建项前再选一次。
|
||||
|
||||
## 行为契约
|
||||
|
||||
- 允许的来源只有一个:本机原生目录选择器(`pick_local_project_directory`)。它返回的目录已在选择时按 user-selected 范围做过一次加固,构成「用户显式选择」边界。
|
||||
- Rust 侧 `validate_requested_game_project_creation_root` 对传入目录要求:非空、绝对路径、无控制字符、已存在的普通目录(符号链接 / Windows reparse point / 普通文件一律拒绝),并通过 `prepare_game_creator_project_root_for_read`(user-selected 范围的一次性修复)。目录不存在时不代为创建,直接失败。
|
||||
- 建出的项目目录仍在所选目录下按 `gameagent-<8位短ID>` 命名,项目名、`.agent` 初始化、首轮投递与既有自动建项完全一致。
|
||||
- 偏好只保存「用户意图」,不是授权凭据:存储被外部改动最坏只是回退默认位置或一次可见的建项失败,不会跳过 Rust 门禁。
|
||||
- 该偏好是客户端本地设置,不写入 `read_game_creator_app_config` / 保存设置的那份运行时配置:在「工作区」里选择目录当场生效,与「保存设置」按钮无关。
|
||||
- 「恢复默认位置」清空偏好即回到应用数据目录;既有项目不迁移。
|
||||
|
||||
## 步骤
|
||||
|
||||
1. **Rust 建项入口**
|
||||
- `commands.rs`:新增 `validate_requested_game_project_creation_root` / `resolve_game_project_creation_root`,`create_automatic_local_game_project` 接受 `projects_root`;`pick_local_project_directory` 接受 `title`。
|
||||
- `template_library.rs`:模板建项复用同一解析函数。
|
||||
- 交付:两条定向单测(校验矩阵、在指定创建目录下建项)。
|
||||
- 验收:`cargo test --bin genarrative-ai-game-creator-shell creation_root` 全绿。
|
||||
|
||||
2. **前端偏好与入口**
|
||||
- `features/app-shell/model.ts`:`normalizeProjectCreationDirectory` / `readProjectCreationDirectory` / `writeProjectCreationDirectory` / `projectCreationDirectoryLabel`。
|
||||
- `useProjectCreationDirectory`:选择目录、恢复默认、状态文案(失败在设置页字段内可见)。
|
||||
- `RuntimeConfigDialog` 新增「工作区」设置分类,承载「项目创建目录」字段与「选择目录 / 恢复默认位置」动作。
|
||||
- `useHomeProjectCreation` 与 `useTemplateLibrary` 在建项时带上 `projectsRoot`。
|
||||
- 交付:偏好模型 4 项单测、设置页 1 项交互测试、appSurface 1 项「设置里选目录后建项」端到端场景。
|
||||
- 验收:`npx vitest run apps/ai-game-creator-shell/tests/projectCreationDirectory.test.ts apps/ai-game-creator-shell/tests/appSurface.test.ts` 全绿。
|
||||
|
||||
3. **文档与共享记忆**
|
||||
- 本实施计划;模板库技术方案的命令表补 `projectsRoot`;`decision-log.md` 记录偏好键与命令参数;`pitfalls.md` 说明用户自选目录与 AGC 管理目录的关系。
|
||||
- 验收:`node scripts/check-doc-index.mjs` 通过。
|
||||
|
||||
## 验证命令
|
||||
|
||||
```bash
|
||||
cargo check --manifest-path apps/ai-game-creator-shell/src-tauri/Cargo.toml --bin genarrative-ai-game-creator-shell
|
||||
cargo test --manifest-path apps/ai-game-creator-shell/src-tauri/Cargo.toml --bin genarrative-ai-game-creator-shell creation_root
|
||||
cargo test --manifest-path apps/ai-game-creator-shell/src-tauri/Cargo.toml --bin genarrative-ai-game-creator-shell template_library
|
||||
cd apps/ai-game-creator-shell && npx tsc -p tsconfig.json --noEmit
|
||||
npx vitest run apps/ai-game-creator-shell/tests
|
||||
npm run check:encoding
|
||||
node scripts/check-doc-index.mjs
|
||||
git diff --check
|
||||
```
|
||||
|
||||
手动验收(客户端内):侧边栏「配置」→「工作区」→「选择目录」选 `F:\Projects\我的游戏`,回首页建项后项目目录应为 `F:\Projects\我的游戏\gameagent-<8位>`;模板库「使用模板」建项同样落在该目录;点「恢复默认位置」后再建项回到应用数据目录。
|
||||
|
||||
## 风险与回退
|
||||
|
||||
- **自选目录无法加固**:`Documents` 等带受保护继承 ACL 的位置可能加固失败。失败发生在选择器或建项前置校验阶段,报错可见且不会留下半成品项目;用户改选其它目录或用默认位置即可。
|
||||
- **偏好漂移**:偏好只是提示值,每次建项都会重新校验;存储被改坏不会绕过门禁。
|
||||
- **回退**:删掉偏好键(或点「恢复默认位置」)即回到默认目录;需要彻底移除该能力时,去掉两个命令的可选参数与设置页字段即可,Rust 默认路径逻辑不变。
|
||||
@@ -1,7 +1,7 @@
|
||||
# AGC 项目定时快照上传实施计划
|
||||
|
||||
Version: 1.0
|
||||
Status: active
|
||||
Status: implemented-awaiting-runtime-acceptance
|
||||
Date: 2026-09-17
|
||||
Parent Milestone: `【里程碑】AGC项目定时快照上传-2026-09-17.md`
|
||||
|
||||
@@ -41,3 +41,13 @@ Parent Milestone: `【里程碑】AGC项目定时快照上传-2026-09-17.md`
|
||||
- 数据出境边界(2026-09-22 修订):只上传项目目录内普通文件。`.agent` 承载项目身份与 Agent 状态,整目录上传(含 conversations、logs、runtime、checkpoint、`agent.db`);`.git`、构建产物、临时文件与凭据类文件仍不在白名单内。该修订只作用于快照同步,项目索引与 checkpoint 继续排除整个 `.agent`。
|
||||
- 服务端未配置 bucket 时客户端必须失败关闭,不能把本地索引推进成"已同步",否则后续同步会漏传。
|
||||
- 回滚:客户端可停用触发接线(保留模块与测试)即可回到无上传行为;服务端路由与配置项可单独移除,不影响既有 OSS 前缀与错误报告链路。
|
||||
|
||||
## 本轮验证(2026-09-24)
|
||||
|
||||
- 客户端定向:`cargo test --manifest-path apps/ai-game-creator-shell/src-tauri/Cargo.toml project_snapshot -- --test-threads=1` → 24 passed / 1 ignored(ignored 是真实 OSS live smoke)。
|
||||
- 服务端定向:`cargo test -p api-server project_snapshot -- --test-threads=1` → 21 passed / 1 ignored(ignored 需要私有 OSS 环境文件的只读用例)。
|
||||
- 本轮补上验收标准 10 的缺口:回收选择抽成纯函数 `plan_project_snapshot_reclamation`,新增 3 条用例覆盖「只回收上一版登记过的对象」「上一版清单读不到时一张都不删」「单轮回收有上限」,并做过变异验证(把保留判据退化成只看路径时该用例变红)。2026-09-24 独立复核:把 `retained` 从 `(路径, 字节数, 摘要)` 三元组退化成只收路径后,`project_snapshot_reclamation_retires_only_objects_the_previous_manifest_registered` 精确红在这一条(同路径但内容已变的 `game/index.html` 旧对象不再进回收计划),另两条回收用例仍绿(2 passed / 1 failed);改回后 3 条全绿、`cargo fmt --check` 通过。
|
||||
- 主规范已补「验收面 → 用例」对照表:`docs/technical/【技术方案】AI游戏创作智能体App实施计划-2026-06-24.md` 的 2026-09-17 小节。
|
||||
- 仍未取得证据:真实 OSS 往返、开发态打开项目的索引写入与日志、关窗触发的那一次同步。
|
||||
|
||||
因此本计划从 `active` 改为 `implemented-awaiting-runtime-acceptance`:行为与定向测试已经落地,缺的是环境侧证据,不替用户签收。
|
||||
|
||||
@@ -1,20 +0,0 @@
|
||||
Version: 1
|
||||
Status: active
|
||||
Date: 2026-09-15
|
||||
Parent Spec: 【里程碑】AGC首页策划补全入口-2026-09-15.md
|
||||
|
||||
## 修改顺序
|
||||
|
||||
1. 在 `view/home/index.tsx` 增加本地复选框状态与入口切换清理。
|
||||
2. 将游戏勾选状态映射到既有 `ProjectStartMode`。
|
||||
3. 增加启动模式纯函数测试,覆盖模式分流;首页显示边界和切换清理作为后续组件测试补充项。
|
||||
|
||||
## 验证
|
||||
|
||||
- AGC 首页相关定向测试。
|
||||
- AGC 前端 typecheck。
|
||||
- `npm run check:encoding` 与 `git diff --check`。
|
||||
|
||||
## 当前验证边界
|
||||
|
||||
本次已交付测试覆盖 `planning` / `direct-build` 模式分流;“策划补全”复选框的显示边界及切换创作类型后的状态清理尚未有组件级自动化测试,需后续补充 `HomeView` 测试时完成。
|
||||
@@ -1,5 +1,5 @@
|
||||
Version: 1.0
|
||||
Status: implemented; real-project runtime smoke pending
|
||||
Status: implemented-awaiting-runtime-acceptance(真实项目 runtime smoke 待补)
|
||||
Date: 2026-09-14
|
||||
Parent Milestone: docs/project-memory/plans/【里程碑】DirectProject Phaser迁移闭环-2026-09-14.md
|
||||
|
||||
|
||||
@@ -1,27 +0,0 @@
|
||||
# 【实施计划】DirectProject Skill 提及输入提示
|
||||
|
||||
| 字段 | 值 |
|
||||
| --------- | ----------------------------------------------------------------------------------- |
|
||||
| Milestone | `docs/project-memory/plans/【里程碑】DirectProject Skill提及输入提示-2026-09-15.md` |
|
||||
| Status | in-progress |
|
||||
| Owner | Codex |
|
||||
|
||||
## 代码边界
|
||||
|
||||
- 前端:`features/project-workspace/ResourceReferenceInput.tsx`、`ResourceReferenceNode.tsx`、`resourceReferences.ts`、生成绑定及聊天入口透传。
|
||||
- Rust:`agent/direct_codex_user_item/model.rs`、`validation.rs`、`wire.rs`、`codex_app_server/mod.rs` 与对应测试。
|
||||
- 文档:父规范与本里程碑/实施计划。
|
||||
|
||||
## 小切片顺序
|
||||
|
||||
1. 先扩展前端 Skill catalog/节点/草稿 content,保持素材行为不变并补前端测试。
|
||||
2. 扩展 canonical Rust part 与 ts-rs 绑定,补序列化和失败校验测试。
|
||||
3. 接通 Codex wire `type: skill` 转换和受控路径解析,补历史/重放测试。
|
||||
4. 完成入口透传、定向验证和文档证据;每个切片单独中文提交。
|
||||
|
||||
## 验证与回滚
|
||||
|
||||
- `npm --prefix apps/ai-game-creator-shell run typecheck`
|
||||
- 相关 Vitest 与 `cargo test --manifest-path apps/ai-game-creator-shell/src-tauri/Cargo.toml direct_codex`
|
||||
- `npm run check:encoding`、`npm run check:doc-index`、`git diff --check`
|
||||
- 每个切片只改计划列出的文件;若 Codex wire 协议或 Skill catalog 来源不确定,停在该切片并先更新规范。
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user