# Claude Code 代码依赖图：找出循环 import，并验证拆分后受影响文件

dependency-cruiser真实解析六个TS模块，循环违规由1降为0；JSON输出的advisedExitCode用作CI失败合同。

## 环境

- Node.js 24+；进入 reference 后 npm install。依赖为锁定的直接版本，首次安装需要网络。

## 启动

~~~sh
cd reference
npm install
node verify.mjs
# 运行后查看原生结果阅读器（读取records.json）
python3 -m http.server 8787
# 打开 http://127.0.0.1:8787/report.html
~~~

## 七步操作

1. 准备六个模块

下载六份原创TypeScript模块，a导入b、b导入c、c再导入a，另有独立类型与UI模块。这个循环确实存在于源码，不是手工画的架构示意。

2. 配置循环规则

使用dependency-cruiser解析实际import，配置no-circular规则，并安装兼容的TypeScript转译器。仅安装分析器而缺转译器可能得到空模块图。

3. 读取真实依赖

输出JSON后先核对totalCruised与依赖数量，不能把空报告当作没有循环。每条边都来自解析器的resolved路径。

4. 查看循环链条

查看实际报告中的a→b→c→a环与规则错误。JSON输出模式的进程退出码可能为0，应读summary.advisedExitCode并由CI包装器转为失败。

5. 隔离共享依赖

将c改为不依赖a的共享叶子函数，保留a和b调用链。这个修复针对输入里的循环，不宣称删除任何import都能保持项目行为。

6. 重新分析图

再次运行原生分析器，循环违规由1变为0；比较修改前后边集合，确认被移除的是回到a的边，而非漏扫整个src目录。

7. 接入退出合同

下载前后报告与源码，接入构建时使用建议退出码。让Claude Code扩展路径别名时，应新增真实别名输入再核对解析结果；本题未执行账号会话。

## 目录身份

- starter：待完成的任务接口与原创输入，TODO不是已完成实现。
- reference：作者原生完成参考和实际产物。records.json/browser-result.json为本地实测记录，不是AI助手回复。
- TASK.md：可交给相应AI助手的原始任务合同。该助手账号生成会话未运行。

## 依赖与许可

原创教学代码以MIT许可提供。第三方项目、模型及浏览器遵循其自身许可。第三方依赖由本地安装获取，不包含node_modules、模型权重、WASM运行时、数据库、缓存或凭据。

## 官方依据

- https://github.com/sverweij/dependency-cruiser
