Repository navigation
v0.5.2 · 修掉三处写坏数据的真实缺陷 + API 默认全展开
Normify v0.5.2 · 修掉三处会写坏数据的真实缺陷
把整个项目描述成一棵"人机共读"的分形模块树:AI 分析与创作,确定性引擎校验、编译与渲染。
这一版没有新功能,只把三处会让工具自己产出非法数据的真实缺陷修掉 —— 都是 0.4.1 时代就存在、
在伴随开发里会真实踩到的坑。
🎯 三处修复
① normify_module_upsert 的必填表不再丢失(工具契约)
parameters.required 此前是 undefined,frontmatter 的 9 个必填字段(uid / id / parent / name / description /
source / revision / updated_at / fingerprint)在模型侧与运行时校验里全部消失,空参调用也不会被拦截。
根因是嵌套 schema 被二次编译:moduleParams() 返回已编译的 JSON Schema,再被
params({ frontmatter: moduleParams() }) 编译一次时,内层的对象级 required: [...] 被整段丢掉。
- 修复:
moduleParams()改为返回作者态 schema(required: true内联),由外层params()统一编译;
toJsonSchema()同时改成幂等(保留并合并对象级required数组),任何嵌套复用都不再丢约束。 - 实测:
parameters.required = ["frontmatter"]、frontmatter.required9 项齐全、空参调用返回args/missing。
② normify_module_move 迁移渲染数据时重写内容(不再"搬个坏文件过去")
迁移时按字节复制 renders/*.json,id / order / groups.children / edge_hints 还停在旧 id 世界,
旧父级的 order 也仍指向已迁出的子模块 —— move 一完成,normify_validate 立刻报
layout/id-mismatch、layout/order-child、layout/group-child、layout/groups-empty、layout/hint-endpoint。
- 修复:迁移时用新 id 重写渲染数据(
id/order/groups.children/edge_hints,并按新子模块集合过滤);
旧父级去掉已迁出子模块的引用(空组/空字段整体删除,mode: groups无组时一并摘除);
新父级把新 id 补进order;dry_run新增detail.layout_rewrites列出原地重写清单。 - 渲染数据本身解析失败时按原样搬运 + 回报
layout/unparsed-carried警告(不再静默吞掉)。 - 实测:move 前 0 error → 修复前 move 后 8–9 error → 修复后 0 error。
③ 叶子晋升为容器时,API 不再留在容器上
writeModuleFile() 的自动晋升与 promoteModule() 的显式晋升都只把 x.md 改成 x/index.md,
不清理 frontmatter 里的 apis,于是晋升后项目必然卡在 api/non-leaf(容器不允许声明 API)。
- 修复:两条晋升路径都会摘掉容器上的
apis(无 API 时仍走原来的"改名即晋升",字节不变),
并回报structure/api-dropped-on-promote警告,附丢失的 API 键清单与建议(写回合适的叶子)。
upsert/promote/move/batch/patch/refresh都会把该警告带回给调用方。
✨ 行为变更:API 默认全展开
渲染数据字段 max_api_rows 的缺省值由 6 改为 0 = 全部展开 —— 叶子上的 API 一行都不折叠,
箭头可以精确锚定到每一条 API 行。需要收窄时显式写 1..48。既有数据集不写该字段即等于"全展开",无需改动。
✅ 验证
| 项目 | 结果 |
|---|---|
tests/regression-0.5.2.mjs(新增,锁定三处缺陷) |
34 项断言全绿 |
tests/engine-e2e.mjs |
PASS |
tests/companion-e2e.mjs |
PASS(原"记录 0.4.1 缺陷"的断言反转为"必须重写内容 + move 后 L2 = 0 error") |
tsc -p tsconfig.json(strict / declaration) |
0 error |
📦 安装
Invoke-WebRequest -Uri "https://github.com/yan-mc/dsh-normify/releases/download/v0.5.2/dsh-external-dsh-normify-0.5.2.tgz" -OutFile "dsh-external-dsh-normify-0.5.2.tgz"curl -L -o dsh-external-dsh-normify-0.5.2.tgz \
https://github.com/yan-mc/dsh-normify/releases/download/v0.5.2/dsh-external-dsh-normify-0.5.2.tgz然后按 README「安装」 把包登记进 profile 的 dependencies + dsh.profile.bundles,重启 DSH。