Skip to content

[Batch 5/6] refactor(devboard): cell-manifest 双份 types.ts 漂移守卫 Medium→Hard #36

Open

Description

@ghbvf

来源:PR #34(Batch 5 · Cells)六维度 review · 包边界 + TS 维度 Cx3 finding,留待人工决策。

现状

CellManifest / CellEntry / CellSlice 类型在两处手工维护双份:

  • tools/cell-manifest/src/types.ts(工具本地,自包含)
  • packages/devboard/src/manifest/types.ts(包内 canonical)

漂移守卫依赖生成物 cells.generated.ts 上的 : CellManifest(import 自 devboard ./types)注解,在 @gocell/devboard typecheck 时触发。

问题:守卫实为 Medium 而非注释所称 Hard

注解只能守住「生成物结构满足 devboard 类型」单向约束。若开发者只在 devboard types.ts 加一个可选字段、未同步 tool 的 types.ts,生成物会少该字段但 typecheck 仍通过(CellManifest 非 exact type)→ 静默漂移。按 ai-robust.md,手工双份 + 单向 typecheck 属 Medium,不是「违反不可表达」的 Hard。

约束

工具须自包含(ai-robust.md/工具注释:node 脚本不可 reach 进 package 的 src/),故无法直接 import devboard 类型 —— 双份是该约束的必然结果。

三级方案

  • 最小:保留双份,修正 tool types.ts 文件头注释,将守卫如实标注为 Medium(不再声称 Hard)。
  • 彻底:以 codegen 单源派生 tool 的 types.ts(从 devboard canonical 类型生成)+ CI git diff --exit-code 守门 → 升级为 Hard(违反不可表达),与 tools/codegen + contracts 守门同构。
  • 重构:把 CellManifest 类型抽到一个无运行时依赖的纯类型入口(如 @gocell/contracts 风格的只读类型包),tool 与 devboard 共同消费单源。

关联

.claude/rules/gocellweb/ai-robust.md(三档分级 / 载体决策 / Soft 严禁立项)。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or requestfrontend前端 gocell-web

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions