同步文档:界面图参考语义建议退役
Project CI / Backend tests (pull_request) Has been cancelled
Project CI / Native shell tests (pull_request) Has been cancelled
Project CI / Frontend tests (pull_request) Has been cancelled
Project CI / Repository checks (pull_request) Has been cancelled
Project CI / AI game creator shell web tests (pull_request) Has been cancelled
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Has been cancelled
Project CI / AI game creator shell Rust crates (pull_request) Has been cancelled
Project CI / AI game creator shell Rust smoke (pull_request) Has been cancelled
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Has been cancelled
Project CI / Backend tests (pull_request) Has been cancelled
Project CI / Native shell tests (pull_request) Has been cancelled
Project CI / Frontend tests (pull_request) Has been cancelled
Project CI / Repository checks (pull_request) Has been cancelled
Project CI / AI game creator shell web tests (pull_request) Has been cancelled
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Has been cancelled
Project CI / AI game creator shell Rust crates (pull_request) Has been cancelled
Project CI / AI game creator shell Rust smoke (pull_request) Has been cancelled
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Has been cancelled
- UI 编辑器代码地图更新 resource/commands 职责、关键命令列表、两步工作流与类型文件数量 - UI 工作流资源桥接文档改为普通桥接从 structure-recognition 开始 - UI 编辑器工作流完成通知弹窗文档收敛为两个动作并删除分析参考图文案 - UI 编辑会话模块边界删除 suggestion seam 描述 - App 实施计划追加 2026-09-23 退役条目覆盖旧 slave_to 口径 - decision-log 记录退役决策、合并优先级恒 0 与无迁移后果及验证结果
This commit is contained in:
@@ -9327,3 +9327,13 @@ CI 上 `background_agent_runtime_recovers_stale_running_before_pending_task` 在
|
||||
- 决策:节点几何新增 State 级 `findStateNodePageContext`,页面选择、预览和状态迁移共享同一坐标递归入口;四类异步操作的 running/status 由 `operationLifecycle` adapter 承接。
|
||||
- 决策:结构化 LLM action 共用 `commands::utils::required_tool_arguments`,仅统一必需 tool-call 定位与有界 JSON 解析,不合并 prompt、schema 或 materializer。
|
||||
- 验证:AGC typecheck、UI State 定向 Vitest、编码检查、doc-index、diff 检查和 Tauri Rust fmt 通过;Tauri 全量 cargo check 仍受现有 platform-llm API 漂移错误阻断,与本次 UI editor 改动无关。
|
||||
|
||||
## 2026-09-23 UI 编辑器退役界面图参考语义建议
|
||||
|
||||
- 背景:UI 编辑器的“分析参考图”步骤只用一次 LLM 调用给界面图补 `name` / `description` / `role` / `slave_to`,四个字段又反过来决定结构识别的上下文分组、合并的树优先级和 Inspector 的可选项;这条链路的价值不足以支撑它引入的跨层耦合。
|
||||
- 决策:`commands/ui_design_suggestion.rs`、`suggest_ui_design_semantic` 命令与 `UIDesignImage.metadata`(含 `UIDesignImageRole`、`UIDesignImageMetadata`)整体退役,`UIDesignImage` 只剩 `path` / `pixel_size` / `pixels_per_unit`;前端从三步工作流收敛为“识别界面结构 / 自动切分素材”两步,`model.ts`、`WorkflowActionCard`、`WorkflowChecks`、完成通知、`InputSidebar`、`InspectorSidebar` 与 `ImportOverview` 同步删减。不保留兼容字段、回退路径、旧文档迁移或写回。
|
||||
- 决策:界面图之间不再有持久化关系,结构识别按“每张界面图各自一棵树、各自一个上下文”执行(删掉 `recognition_root_image_ids` / `slave_image_ids`);界面图显示名统一取 `path` 的 basename(复用 `view/project-development/resourceAssetDisplayName.ts`)。
|
||||
- 决策:多树合并暂时没有优先级来源(原优先级由 `slave_to` 祖先链计数得出),`merge` 现在把所有输入树优先级恒置 0 并留 `TODO`,合并冲突取 `merged_from` 首位成员;`ui-workflow.*` 阶段与页面级工作流不在本次范围,后续整体重写。
|
||||
- 代价与取舍:删掉 `name` / `description` 后界面图在 UI 上只能用文件名标识;合并冲突的代表节点选择不再有“优先级”依据;`role` / `slave_to` 曾承担的“主页面 + 子界面”语义彻底消失。旧 `ui_design.json` 里的 `metadata` 由 serde 默认忽略、下次保存后自然消失(`State` / `UIDesignImage` 都没有 `deny_unknown_fields`),已生成的 `ui_trees` 不受影响。
|
||||
- 影响面:`apps/ai-game-creator-shell/src-tauri/src/{main.rs,ui_editor/**}`、`src/features/ui-editor/**`、`src/view/ui-editor/**`、`src/view/project-development/index.tsx`、`tests/{uiEditorPage,uiEditorState,previewWorkspaceZoom}.test.*`、`docs/technical/【技术方案】UI编辑器代码地图与模块职责-2026-09-23.md`、`docs/【技术方案】UI工作流资源桥接与Runtime执行-2026-08-24.md`、`docs/technical/【设计】UI编辑器工作流完成通知弹窗-2026-09-04.md`、`docs/technical/【前端架构】UI编辑会话模块边界-2026-08-19.md`。
|
||||
- 验证:`cargo check` 与 `cargo test --bin genarrative-ai-game-creator-shell ui_editor`(160 passed)通过,ts-rs 重新导出 `types/UIDesignImage.ts` 并删除三个已退役类型;`npx vitest run` 定向 `uiEditorPage` / `uiEditorState` / `uiDesignStateStore` / `previewWorkspaceZoom` / `appSurface` 全绿;AGC `tsc --noEmit`、改动文件 eslint、`cargo fmt --check`、`check:encoding`、`git diff --check` 通过。整套 Rust 测试在本容器仍有 60 条环境性失败(`/sbin -> usr/bin` 让 `command.exec` 沙箱 merged-usr 预检失败),与本次改动无关。
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
|
||||
保存与代码生成共享同一份持久化 State/revision。会话层在保存或生成进行期间互斥拦截,且代码生成必须基于已加载的持久化 revision;视图层的保存按钮和“保存并返回”按钮同步遵守该互斥状态。
|
||||
|
||||
Rust UI workflow 的结构化 LLM 动作共享 `commands::utils::required_tool_arguments` seam:它只负责必需 tool-call 定位与有界 JSON 解析;prompt、schema、领域校验和 materializer 继续留在 suggestion/recognition/binding/merge 各自 command。
|
||||
Rust UI workflow 的结构化 LLM 动作共享 `commands::utils::required_tool_arguments` seam:它只负责必需 tool-call 定位与有界 JSON 解析;prompt、schema、领域校验和 materializer 继续留在 recognition/binding/merge 各自 command。
|
||||
|
||||
UI 编辑器的普通“保存”和“保存并生成代码”结果使用独立结果弹窗呈现,不在编辑器内容区追加状态条。普通保存成功仅提示保存成功;保存并生成成功展示生成器返回的项目相对路径(例如 `ui/generated-xxx.js`),复制按钮通过 Tauri clipboard manager 的 `writeText` 写入剪贴板。复制失败时保留可选中文本并提示手动复制;设置用户 fallback 后仍必须重新抛出原始错误,让 error report 链路收到未知 / 未处理的异常,不能把异常静默吞掉。此异常传播原则适用于所有 JS 边界,不限于生成路径或剪贴板。两类操作失败均在弹窗中展示;组合操作若保存成功但生成失败,明确提示项目已保存,重试动作仍复用原操作。保存并返回成功后直接返回,不打开结果弹窗;结果弹窗关闭后不保留路径状态。
|
||||
|
||||
|
||||
@@ -1,5 +1,19 @@
|
||||
# AI 游戏创作智能体 App 实施计划
|
||||
|
||||
## 2026-09-23 UI 编辑器退役界面图参考语义建议
|
||||
|
||||
本节覆盖下文“2026-08-18 UI Editor 从属页面、手势与保存失败边界”中的 `UIDesignImage.metadata.slave_to` 口径,以及“界面语义建议”相关描述。
|
||||
|
||||
UI 编辑器的“分析参考图”步骤、Rust 命令 `suggest_ui_design_semantic` 与 `UIDesignImage` 的 `metadata`(`name` / `description` / `role` / `slave_to`)整体退役,不保留兼容字段、回退路径或旧文档迁移:界面图只剩 `path`、`pixel_size`、`pixels_per_unit`;界面图之间不再存在持久化归属关系,结构识别按“每张界面图各自一棵树”执行;界面图在 UI 上的显示名统一取 `path` basename(`view/project-development/resourceAssetDisplayName.ts`),没有可选主页面过滤器、角色选择器和归属选择器。
|
||||
|
||||
多树合并当前不产生有效优先级:`merge` 的所有输入树优先级恒为 0(代码内留 `TODO`,等待重新设计),因此合并冲突时的代表节点取 `merged_from` 首位成员。旧的 `ui_design.json` 里残留的 `metadata` 字段由 serde 默认忽略,读取后不再写回;不新增拒绝或迁移逻辑。
|
||||
|
||||
| 要求 | 必须成立的行为 | 完成证据 |
|
||||
| --- | --- | --- |
|
||||
| 权威层收敛 | `resource/ui_design_image.rs` 只保留 `path` / `pixel_size` / `pixels_per_unit`;`commands/ui_design_suggestion.rs` 与 `suggest_ui_design_semantic` 注册删除;持久化校验不再有 `slave_to` 引用与环校验 | `cargo check`、`cargo test --bin genarrative-ai-game-creator-shell ui_editor`(160 passed) |
|
||||
| 前端两步工作流 | `model.ts` 只保留“识别界面结构”“自动切分素材”;`ToolNavigation` 渲染两格;suggestion 操作、结果通知分支、role/slave_to 编辑器与 `ImportOverview`(原“分析参考图”步骤概览)全部删除 | `npx vitest run uiEditorPage/uiEditorState/uiDesignStateStore/previewWorkspaceZoom/appSurface` |
|
||||
| 无迁移 | 旧文档中的 `metadata` 被静默忽略并在下次保存时消失,`ui_trees` 不受影响;不做迁移脚本或写入回填 | `persistence.rs` 既有加载/保存用例 |
|
||||
|
||||
## 2026-09-21 Godot 工作区发现放宽与内置插件行去掉手动启动
|
||||
|
||||
本节覆盖下文“打开项目自动识别 Godot”中的旧口径:判定从「唯一命中」放宽为「确定性命中」,`project.godot` 从「必须是普通文件」放宽为「按链接目标判定」。
|
||||
|
||||
@@ -16,7 +16,7 @@ view/ui-editor (页面/组件)
|
||||
```
|
||||
|
||||
- 唯一事实来源是项目内的 `ui_design` JSON 文档(含 `revision`),前端 State 只是它的编辑副本。
|
||||
- 所有跨进程类型由 Rust 经 `ts_rs` 生成到 `features/ui-editor/types/`(当前 59 个文件),前端不得手改。
|
||||
- 所有跨进程类型由 Rust 经 `ts_rs` 生成到 `features/ui-editor/types/`(当前 56 个文件),前端不得手改。
|
||||
|
||||
## Rust 侧:`src-tauri/src/ui_editor`
|
||||
|
||||
@@ -25,15 +25,15 @@ view/ui-editor (页面/组件)
|
||||
| `state/mod.rs` | 权威 State 根类型:`State`(`ui_trees` + 界面图/sprite/字体三张资源表)、`UITree`;ts-rs 导出源 |
|
||||
| `layout/` | 节点模型:`Node`、`NodeMetadata`/`StageStatus`、`ControlLayout`、`Container`、`NodeOffset`、`transform`、`ChildrenDisplayMode`(`Stack`/`Exclusive`) |
|
||||
| `component/` | 组件枚举 `Component::{Image, Text}`、`NodeComponent`(LLM 工具载荷的 `PureNode`/`WithComponent` 判别式) |
|
||||
| `resource/` | 界面图、sprite(含 `SpriteBorder` 九宫格)、字体(格式/媒体类型/CSS format)资源描述 |
|
||||
| `persistence.rs` | 文档读写、`revision` 乐观并发保存、领域校验(重复 ID、环检测、组件状态)、代码生成写盘 |
|
||||
| `resource/` | 界面图(`path` / `pixel_size` / `pixels_per_unit`)、sprite(含 `SpriteBorder` 九宫格)、字体(格式/媒体类型/CSS format)资源描述 |
|
||||
| `persistence.rs` | 文档读写、`revision` 乐观并发保存、领域校验(重复 ID、树/资源引用、组件状态)、代码生成写盘 |
|
||||
| `resource_bridge.rs` | 原型图 → `ui_design` 资源的桥接建项(持项目写锁,装 revision 0,仅首个设计图) |
|
||||
| `html_renderer/` | 由 State 生成 HTML 片段与 JS(maud + 布局/组件 CSS 映射),供预览与 `ui/generated-*.js` |
|
||||
| `commands/` | LLM 工具链:`recognition`(结构识别)、`binding`(组件绑定)、`merge`(多树合并)、`ui_design_suggestion`(参考图语义)、`separation/`(自动切分素材)、`utils.rs`(LLM 请求、重试、`required_tool_arguments`) |
|
||||
| `commands/` | LLM 工具链:`recognition`(结构识别)、`binding`(组件绑定)、`merge`(多树合并)、`separation/`(自动切分素材)、`utils.rs`(LLM 请求、重试、`required_tool_arguments`) |
|
||||
| `workflow.rs` | 游戏页级工作流:发现 `game/ui-pages.json`、准备/识别/装状态/落阶段(`reference-ready → completed`)、`@genarrative-ui-page` 标记与 receipt 校验、生成最终路由 |
|
||||
| `commands/separation/` | 切分批处理、截图/预切、sidecar 恢复(inspect / finalize / discard)、patch 回写 |
|
||||
|
||||
关键命令(`main.rs` 注册):`load_ui_design_state`、`save_ui_design_state`、`generate_ui_design_code`、`ensure_ui_design_resource_for_prototype`、`suggest_ui_design_semantic`、`recognize_ui`、`bind_components`、`merge_ui`、`separate_ui`、`inspect_separation_recovery`、`finalize_separation`、`discard_separation_recovery`。
|
||||
关键命令(`main.rs` 注册):`load_ui_design_state`、`save_ui_design_state`、`generate_ui_design_code`、`ensure_ui_design_resource_for_prototype`、`recognize_ui`、`bind_components`、`merge_ui`、`separate_ui`、`inspect_separation_recovery`、`finalize_separation`、`discard_separation_recovery`。
|
||||
|
||||
保存语义(`save_ui_design_state_at`):`Saved` / `Unchanged` / `Conflict`(返回当前快照)三态;先 `validate_state` 再持锁重读比对 `expected_revision`,成功后推进项目 revision。代码生成只接受已保存的 revision,产物路径为 `ui/generated-<stem>-<digest>.js`。
|
||||
|
||||
@@ -44,7 +44,7 @@ view/ui-editor (页面/组件)
|
||||
- `nodeTransformGeometry.ts`:State 级节点几何(页面矩形、父矩形、resize 手柄反演),预览/Inspector 共用。
|
||||
- `stateInvariants.ts`:保存前不变量 projection,给视图稳定的中文失败信息;Rust 仍是权威校验。
|
||||
- `uiDesignStateStore.ts`:`IUiDesignStateStore`(`load`/`save`/`generateCode`)+ Tauri 实现 + 内存替身。
|
||||
- 结果应用 seam:`recognition.ts`、`merge.ts`、`uiDesignSuggestions.ts`、`separationStatus.ts`(问题节点 → `NeedReview`)。
|
||||
- 结果应用 seam:`recognition.ts`、`merge.ts`、`separationStatus.ts`(问题节点 → `NeedReview`)。
|
||||
- 概览 projection:`stageStatusOverview.ts`、`separationOverview.ts`。
|
||||
- 前置校验:`requisites.ts` 在发起 LLM 操作前检查必需资源与结果完整性。
|
||||
- 适配器:`importAdapter.ts`(图片解码、批量导入、字体准备)、`uiDesignResourceBridge.ts`(原型桥接)、`useUiEditorFontFaces.ts`(私有字体族加载)、`spriteBorder.ts`。
|
||||
@@ -54,16 +54,16 @@ view/ui-editor (页面/组件)
|
||||
|
||||
- `useUiEditorPage.ts`:`useUiEditorSession` 是视图与 adapter 的唯一协调边界,产出 `input` / `canvas` / `inspector` / `workflow` / `dialogs` / `save` 六个小 projection;视图不接收完整 controller。
|
||||
- `index.tsx`:页面骨架(输入侧栏、预览、Inspector、工具栏、保存/生成结果弹窗、键盘快捷键绑定),由 `view/project-development` 挂载。
|
||||
- `model.ts`:三步工作流(分析参考图 / 识别界面结构 / 自动切分素材)、导入种类、界面图 role、操作失败文案。
|
||||
- `model.ts`:两步工作流(识别界面结构 / 自动切分素材)、导入种类、操作失败文案。
|
||||
- `operationLifecycle.ts`:suggestion/recognition/merge/separation 共用的异步操作 adapter。
|
||||
- `components/`:`InputSidebar`、`UiTreePanel`、`Inspector/*`(Transform、Components Text/Image、SpriteBorder)、`preview/*`(`PreviewWorkspace`、`UiTreeRenderer`、组件视图、排他子节点 tab、缩放/平移/拖拽手势)、工作流与结果弹窗。
|
||||
- `components/`:`InputSidebar`、`UiTreePanel`、`Inspector/*`(Transform、Components Text/Image、SpriteBorder)、`preview/*`(`PreviewWorkspace`、`UiTreeRenderer`、组件视图、排他子节点 tab、缩放/平移/拖拽手势)、工作流与结果弹窗。界面图没有独立显示名字段,列表与 Inspector 的统一显示名取 `path` basename(`view/project-development/resourceAssetDisplayName.ts`)。
|
||||
- 已退役的 render mode 由会话级开关 `showFrame` / `showOriginImage` / `showComponent` 取代。
|
||||
|
||||
## 扩展指引
|
||||
|
||||
- 新增节点/组件字段:先改 `layout/`(或 `component/`)并让 ts-rs 重新导出,再补 `stateTransition`、`stateInvariants`、`persistence::validate_node`、Inspector 与预览映射。
|
||||
- 新增 LLM 步骤:在 `commands/` 内自成 command(prompt + schema + 领域校验 + materializer),共用 `commands::utils` 的请求、重试与 tool-call 解析 seam。
|
||||
- 新增界面图 role 或状态值:改 Rust 枚举并同步 `view/ui-editor/model.ts` 的中文标签表。
|
||||
- 新增界面图字段:改 `resource/ui_design_image.rs` 后让 ts-rs 重新导出,再补 `persistence::validate_state`、导入 adapter(`features/ui-editor/importAdapter.ts`)与 Inspector / 预览展示。
|
||||
|
||||
## 关联文档
|
||||
|
||||
|
||||
@@ -2,11 +2,11 @@
|
||||
|
||||
## 目标
|
||||
|
||||
UI 编辑器的“分析参考图”“识别界面结构”“自动切分素材”三个工作流动作在每次运行结束后,用独立的阻塞通知弹窗明确反馈结果,避免仅依赖卡片内一行状态文本而被忽略。
|
||||
UI 编辑器的“识别界面结构”“自动切分素材”两个工作流动作在每次运行结束后,用独立的阻塞通知弹窗明确反馈结果,避免仅依赖卡片内一行状态文本而被忽略。
|
||||
|
||||
## 交互约定
|
||||
|
||||
- 三个动作的每次运行在终态(成功或失败)时自动弹出一次通知。
|
||||
- 两个动作的每次运行在终态(成功或失败)时自动弹出一次通知。
|
||||
- 弹窗打开期间遮挡并阻塞工作台底层交互;关闭后恢复当前步骤,不自动切换步骤、不自动重跑。
|
||||
- 使用现有 `ThemedModal` 的普通关闭行为(遮罩、Esc 和关闭按钮均可关闭)。
|
||||
- 弹窗仅承载通知,不提供“继续”“重试”或其他业务操作。
|
||||
@@ -19,7 +19,6 @@ UI 编辑器的“分析参考图”“识别界面结构”“自动切分素
|
||||
|
||||
成功状态的基线文案:
|
||||
|
||||
- 分析参考图:保留已应用的语义建议数量;若现有状态可可靠取得问题/待确认数量,则一并展示。
|
||||
- 识别界面结构:保留替换的界面树数量,并展示识别结果中的待检查/必须修复数量(若可取得)。
|
||||
- 自动切分素材:保留现有 `B/B` 批次计数,改为用户可读的切分结果。
|
||||
|
||||
@@ -28,12 +27,12 @@ UI 编辑器的“分析参考图”“识别界面结构”“自动切分素
|
||||
## 实现边界
|
||||
|
||||
- 新增独立的工作流通知弹窗组件文件,组件只负责展示和关闭,不包含工作流领域规则或后端副作用。
|
||||
- 在 UI 编辑器页面/会话投影中维护临时通知状态,并在三个异步动作的成功与失败终态写入。
|
||||
- 在 UI 编辑器页面/会话投影中维护临时通知状态,并在两个异步动作的成功与失败终态写入。
|
||||
- 不新增后端字段或公开契约;数量只能使用当前前端已有且可靠的数据。
|
||||
|
||||
## 验收
|
||||
|
||||
1. 三个动作成功和失败终态各弹出一次通知;绑定批次只弹最终一次。
|
||||
1. 两个动作成功和失败终态各弹出一次通知;绑定批次只弹最终一次。
|
||||
2. 弹窗打开时底层工作台不可操作,且无继续/重试等业务按钮。
|
||||
3. 弹窗可通过标准关闭方式退出;关闭后卡片状态仍可见。
|
||||
4. 每条成功文案保留原有数量信息并增加可用的检查数量,所有文案包含“请检查”。
|
||||
|
||||
@@ -87,9 +87,9 @@ JSON 文档读取、State 校验或 renderer 失败时,在同一引用后追
|
||||
|
||||
- 按 manifest asset id、`source.resourceId`、`source.assetObjectId` 识别已有关联,避免重复创建。
|
||||
- 没有关联时原子创建 `ui/UI 设计 N.json`,登记 `kind=ui-design-doc`、`application/json`,并把原型图作为首张页面设计图载入 State。
|
||||
- 成功后通过 `onManifestChange` 更新客户端资源投影,再打开 UI 编辑器;普通桥接从 `reference-analysis` 开始。
|
||||
- 成功后通过 `onManifestChange` 更新客户端资源投影,再打开 UI 编辑器;普通桥接从 `structure-recognition` 开始。
|
||||
|
||||
点击已有 `ui-design-doc` 资源直接打开 UI 编辑器。若 manifest 阶段为 `ui-workflow.completed`,工作台自动打开该资源的 `asset-separation` 阶段(最远步骤为 2),交给用户做最终检查和手动调整。
|
||||
点击已有 `ui-design-doc` 资源直接打开 UI 编辑器。若 manifest 阶段为 `ui-workflow.completed`,工作台自动打开该资源的 `asset-separation` 阶段(最远步骤为 `asset-separation`),交给用户做最终检查和手动调整。
|
||||
|
||||
自动切分达到返工上限的 problematic 节点会随分离 DTO 返回每节点的 `problem_history`,并由编辑器回写为 `component_status = NeedReview(...)`。`SeparationOverview` 只读取 UI State 中的状态来计数和定位;该结果仍按“已尽力完成”报告成功并执行既有 finalize,剩余节点由用户在概览定位后手动处理或再次发起分离。
|
||||
|
||||
|
||||
Reference in New Issue
Block a user