最近在跟AI协作写代码时,遇到一个很普遍的烦恼——项目代码越写越“脏”,尤其是TypeScript和JavaScript项目。通常的做法是让第二个Agent做Review,比如Claude Code写完代码后,再用Codex去检查。但时间一长,项目里还是积累了大量未使用的export、多余的依赖,package.json也越来越臃肿。关键是,这些问题ESLint根本发现不了。
后来发现了一个叫Fallow的静态代码分析工具,GitHub地址是github.com/fallow-rs/f…。它是用Rust开发的代码清理神器,专门用来揪出TypeScript和JavaScript项目中的死代码、重复代码,以及依赖管理方面的隐患。
Fallow 的安装与常用命令
安装非常简便:
npm install --save-dev fallow
常用命令覆盖了多个高频场景,方便快速清理项目:
# 全量分析
npx fallow
# 只检测死代码
npx fallow dead-code
# 检测重复代码
npx fallow dupes
# 变更风险评估
npx fallow audit
# 预览清理结果(不实际修改文件)
npx fallow fix --dry-run
实际项目测试
拿自己的项目You Pencil做了实测。虽然平时已经有意进行代码清理,但扫完之后还是发现了不少隐藏的死代码和冗余。控制台输出内容太长,不便阅读。后来索性把结果导出成Markdown格式,让AI直接读取分析:
npx fallow --format markdown > .fallow-report.md
然后告诉Claude Code去处理报告中的问题项。
把 Fallow 集成到 Claude Code / Codex 工作流
手动执行依然有些繁琐,于是直接把这步嵌入到自动化工作流中。
Fallow内置了一个agent hook安装器,可以自动生成配置:
npx fallow hooks install --target agent --agent claude
执行后会在 .claude/ 下生成两个文件:
.claude/settings.json
.claude/hooks/fallow-gate.sh
其中 settings.json 配置了一个Claude Code的PreToolUse hook。也就是说,每次Claude准备执行Bash命令前,都会先经过 fallow-gate.sh 这道关卡。
整体流程大致如下:
- Claude 执行
git commit - hook 拦截,自动运行
fallow audit - 如果检查失败,脚本 exit 2,并将结果输出到 stderr
- Claude 收到错误信息,自行尝试修复
- 修复完成后,重新 commit
最终形成一个自动循环:commit 被拦住 → 读取错误信息 → 自动修复 → 再次尝试 commit。
Codex的配置方式类似:
# Codex:自动在 AGENTS.md 中追加 managed block
npx fallow hooks install --target agent --agent codex
人工改代码,也最好加一道拦截
上面那套主要针对AI产生的代码,但很多脏东西其实也是开发人员手动改出来的。所以后来又在Git层加了一层hook:
npx fallow hooks install --target git
这样无论谁提交代码,都得先过一遍死代码和依赖检查。
目前的用法
走完这套流程之后,项目确实干净了不少,维护起来也更省心了。
