diff --git a/docs/technical/【技术方案】UI编辑器自动分离工作流-2026-09-08.md b/docs/technical/【技术方案】UI编辑器自动分离工作流-2026-09-08.md index 2ec3ae1b1..f3620ee74 100644 --- a/docs/technical/【技术方案】UI编辑器自动分离工作流-2026-09-08.md +++ b/docs/technical/【技术方案】UI编辑器自动分离工作流-2026-09-08.md @@ -64,6 +64,17 @@ - 每次重做产生新的 SpriteAssetId,不假设 NodeId 到 SpriteAssetId 的稳定映射。 - sidecar 中的图片保留,正式 SpriteAsset 的最终清理策略列 TODO。 +## 前端正式接入 + +- UI 编辑器点击“自动分离”时,前端只调用一次 `separate_ui`,消费完整 `SeparationDTO`;separation 内部 batch 不向前端暴露,也不在 UI 中显示 batch 进度。 +- 如果 sidecar 已存在未完成的 `state.json`,点击入口时先打开独立弹窗,由用户选择“继续上次分离”或“开始新的分离”。继续复用 sidecar 的 pending tree;重新开始只替换当前 `state.json`,不删除 sidecar 图片。 +- `BoundNode.cut_image_path` 必须是项目根相对路径。前端使用现有 `import_local_project_image_assets` 登记 cut 图片;由于该通用命令单次最多 100 个路径,前端可以在资源登记阶段按 100 条分组调用,但这不属于 separation batch,也不向用户展示。 +- 现有本地资源导入按清洗后的文件名 stem 与内容摘要生成目标路径;相同目标路径直接复用已有 manifest asset ID,内容不同则拒绝覆盖或生成不同摘要路径。前端不自行猜测 SpriteAsset 是否存在,也不从 NodeId 派生 SpriteAssetId。 +- 全部可登记图片完成导入后,前端在一个 `runWithStateLocked` 中复用 `addSpriteAssets` 的内部 State 变换逻辑,加入返回的 SpriteAsset 并回填仍匹配 Node 的第一个未绑定 Image component,最后一次性提交 State。公开 `addSpriteAssets` 的普通 mutation guard 不放宽。 +- UI tree 在 separation 期间发生变化时,已登记的 cut 图片和可匹配节点的回填保留;找不到 Node 或没有未绑定 Image 的结果产生明确问题提示,不回滚已登记资源,不静默跳过。 +- State 保存成功后才调用 `finalize_separation` 删除 sidecar `state.json`;登记、回填或保存失败时保留 sidecar,允许下次选择继续。sidecar 图片按当前 debug 策略保留。 +- 本次只替换 UI 编辑器独立页面的 `bindComponents` 前端入口。`binding.rs`、`bind_components` Tauri 命令及 Runtime `workflow.rs` 的旧 binding 链路暂列后续退役/迁移事项。 + ## 重启与 Raw GPT Image 2 - 已保存的 separation state 是跨重启继续工作的最小单位;重启后从上一个已保存 batch 的状态继续。 @@ -77,7 +88,7 @@ - `Vec` 重构为一种组件类型最多一个的容器。 - 当前第一个 Image component 回填规则的正式替代方案。 - 正在执行 batch 的持久化和恢复。 -- 前端复制、登记 SpriteAsset、回填 State 的精确 IPC/提交合同。 +- 前端登记 SpriteAsset、回填 State、sidecar 恢复弹窗和 `finalize_separation` 的实现与测试。 - 临时图片清理/归档策略。 - 手动抠图能力。 - problematic 对更高层 workflow 完成门禁的最终定义。