SuperAPI AI 工具集

setup-ts-deep-modules

编程与开发

查看项目

更新于 10-28 16:13

技能介绍

用途 该技能用于在 TypeScript 仓库中建立并强制“深模块”边界:一个包用很小的公开接口(包根目录下的入口文件)暴露大量行为,子文件夹中的实现细节对外不可见。目标是让入口点成为从外部进入包的唯一通道。

主要能力

  1. 环境检测:根据锁文件识别包管理器(pnpm-lock.yaml 对应 pnpm,yarn.lock 对应 yarn,bun.lock 或 bun.lockb 对应 bun,否则 npm);确定包根目录(优先仓库实际布局,仅当 src/packages 是约定目标时使用);检查是否已有 .dependency-cruiser.* 配置,存在则合并而不覆盖。
  2. 安装 dependency-cruiser:核对其 Node 引擎与支持的 TypeScript 编译器版本范围,作为 devDependency 安装,保留项目现有编译器版本。
  3. 写入配置:将模板复制为仓库根目录的 .dependency-cruiser.cjs,设置 PACKAGES_ROOT,确认平铺包结构与 tests/ 位置,转义根路径中的正则字符,并适配实际入口点和 TypeScript 配置。
  4. 接入检查:添加 lint:boundaries 脚本,扫描包目录及所有可能导入包的外部源码根(如 depcruise src 或 depcruise packages apps),并并入已有的 typecheck 总检查命令(check / ci / validate);不改动 tsconfig,不添加路径别名。
  5. 生成示例包(仅在用户要求时):index.ts 作为入口并委托给内部文件,lib/impl.ts 为内部实现,tests/example.test.ts 仅从入口导入。
  6. 验证规则生效:干净状态下 lint:boundaries 必须通过且扫描到预期模块;临时在测试中加入深层导入,必须以 tests-through-entrypoints 失败;临时从包外源码深层导入内部文件,必须以 entrypoint-boundary-from-app 失败并列出该导入者;恢复后必须再次通过。扫描文件为零或缺少转译器警告均视为配置失败。
  7. 文档化约定:在包目录写 README.md,说明布局(入口在根、lib/ 放实现、tests/ 放测试)、“只能通过包入口点导入”、如何运行 lint:boundaries,并明确不鼓励 barrel 文件;然后在 CLAUDE.md(若无则 AGENTS.md,都没有则创建)加一行指向该文档。

五类规则 入口点边界:包外代码(应用代码或其它包)只能导入该包根目录文件;包内自由互导;测试文件可导入任意包入口点及自身 tests/ 夹具,但不可导入任何包子文件夹内部;禁止依赖循环;以入口点代替 barrel 汇总(鼓励多个小入口如 index.ts、client.ts、server.ts)。分层(哪些包可依赖哪些包)不在本技能范围,配置中留注释占位。

适用场景 希望统一 TypeScript 单体仓库或工作区中包的公开边界、隐藏实现细节、用自动化检查防止深层导入和循环依赖的团队。

限制与注意事项 仅针对 TypeScript 仓库与 dependency-cruiser;依赖包管理器检测和现有仓库布局,需用户确认包根目录;已有配置需合并而非覆盖;规则通过依赖路径深度判断公开/私有,根文件为入口,任意子文件夹均视为私有;包为平铺一层;配置须用 .cjs 以保证 module.exports 在 "type": "module" 仓库中可用;如仓库无总检查脚本,需自行将 lint:boundaries 加入 CI。分层规则暂未提供具体实现。