同步文档:界面图参考语义建议退役
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:
2026-09-23 13:30:13 +08:00
parent 81dc7b0cd6
commit 26c6bdbbd5
6 changed files with 40 additions and 17 deletions
@@ -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. 每条成功文案保留原有数量信息并增加可用的检查数量,所有文案包含“请检查”。