Web UI / Schema Editor(第三阶段)
第三阶段第一项:为策划与程序提供 Schema 的 Web 编辑入口。红线不变: 不做 Excel 编辑器、不做游戏逻辑框架;Web UI 只做 Schema 的门面,不做 数据运行库。
定位
Cage 的 CLI 是编译链事实接口;Web UI 是同一核心的另一个门面: 编辑器不解析、不渲染 YAML,只与 core 交换文档并委托校验。所有编辑 语义(19 种字段类型、约束、引用、targets 可见性、表达式规则)都来自 cage-core,前端不做任何规则复制。
架构决策
交换模型 = 现有 serde Canonical 形状
编辑器文档就是 Schema 的 serde 形状,与 Configuration Snapshot 里 的 schema.json、HTTP API 同一文档,一份文档三处消费:
snapshot/schema.json ≡ cage-core::edit::to_editor_json ≡ HTTP GET /api/schema编辑器 JSON 保持插入序(表/字段按文档顺序),省略 skip_serializing_if 覆盖的可选字段,default 无 skip 属性故显式为 null(前端两者皆可编辑)。
保存 = 规范化 YAML 单文件写回
编辑器面向合并后的规范 Schema(cli 装载时把 schemas/ 下多文件合并 成一张 Schema,编辑器即增值这一形态),保存写回为单文件 canonical YAML(to_canonical_yaml):同 Schema → 同字节(含唯一结尾换行), 经 from_canonical_yaml 回环幂等。多文件拆分是作者侧的持久化选择, 编辑器不产生拆分产物。确定性契约:编辑器保存的 YAML 经 cage build 得到的产物,与手写同一 Schema 构建的产物逐字节一致。生成器只见过 Schema 值,编辑回环只要保值的即满足。
E1701 编辑态错误族
编辑文档无法反序列化为 Schema(语法/形状/未知 kind)报 E1701, 铺 JSON 路径(tables.Item.fields.id.type)定位到具体输入(前端的 高亮锚点);schema 内部一致性(主键缺失、引用悬空)仍走 L1 的 E1004。两类错误分开,编辑器与校验器各自汇报。
无 node 前端工具链
前端是 docs/public 下静态单页(vanilla ES 模块),cage web 直接 伺服。编辑器链路不引入 Node/npm 构建链,cargo 一键即得(文档站自身 用 VitePress 构建,与编辑器无关)。
现状
W1 已实装:编辑器交换模型(cage-core::edit)
W2 已实装:cage web 本地 HTTP 服务(cage-cli/src/web.rs)
W3 已实装:Schema 编辑器前端(docs/public/editor/,编译期嵌入)
W4 已实装:编辑流程定稿 + 示例工程冒烟 + CI
W5 已实装:项目状态面(U1,路线见 UI 门面)
W6 已实装:产物浏览(U2a,路线见 UI 门面)
W7 已实装:targets 徽标 + profile 作用域视图(U2b,路线见 UI 门面)
W8 已实装:快照 / 分层 diff / registry 浏览(U3,路线见 UI 门面)
路线图
第三阶段 W 系列与后续 UI 增量至此全部完成(W1 交换模型 → W2 本地服务 → W3 编辑器前端 → W4 文档与示例 → W5 项目状态面 → W6 产物浏览 → W7 作用域视图 → W8 快照 / 分层 diff / registry 浏览)。 示例入口:examples/web-smoke.sh(CI 同款)。后续 UI 增量的路线与 拍板见 UI 门面。