跳转到内容
关系图谱

setup-ts-deep-modules(Matt)

336 字 1 分钟

属性 8
repo
mattpocock_skills
skill
setup-ts-deep-modules
source
mattpocock_skills/skills/in-progress/setup-ts-deep-modules/SKILL.md
invoke
user
phase
build
cost
low
status
beta
local
same
一句话

给 TypeScript repo 接 dependency-cruiser,把每个 package 逼成深模块:子目录全私有、只能从包根 entry point 进、测试也只能走 entry point,最后实测规则真的咬人。

何时用 ​

  • 适合:想在 TS 多包 repo 强制深模块边界(matt-codebase-design 的那套理论落地成 lint)。
  • 不适合:单包无包结构的小项目;beta 技能,插件不装。

怎么用 ​

text
/setup-ts-deep-modules
  1. 探测:包管理器(锁文件判定)、packages 根(有 src/ 用 src/packages 否则 packages)、已有 .dependency-cruiser.* 就合并不覆盖。
  2. 装 dependency-cruiser,写 .cjs 配置落实四条 error 规则:entry-point 边界、包内自由、测试走 entry point、无环。
  3. 加 lint:boundaries 脚本(depcruise <packages-root>)并折进总的 check 命令;不动 tsconfig、不加 alias。
  4. 脚手架 <packages-root>/example/ 模板包:index.ts 入口、lib/impl.ts 内部件、tests/example.test.ts 只测入口。
  5. 验证咬人:lint 过 → 临时加 deep import → 必须失败(tests-through-entrypoints)→ 还原再过。
  6. 在 packages 目录写 README 约定(明确 discourage barrel file),并在 CLAUDE.md/AGENTS.md 加一行 context pointer。

产出 ​

  • dependency-cruiser 配置、lint:boundaries 脚本、example 模板包、packages README 约定。

要点与坑 ​

  • 配置里的 $1 反向引用是让包内互通、外人进不来的关键,别拍平成逐包规则。
  • 公私按「是否在子目录」判定,不写死 lib/tests 目录名;包是 flat 的,不许包里有包。

关联 ​