Transcript
00:00:00这是 Fallo,一个针对 TypeScript 和 JavaScript 的代码智能工具,它可以分析整个代码库中的死代码、重复、不必要的复杂性等。
00:00:10这意味着无需组合使用 Knip、JS-CPD 和 ESLint,就能防止你的 AI 代理发布劣质代码。
00:00:17它由 Rust 构建并支持 90 多个插件,这意味着它开箱即可与大多数框架和流行包配合使用。
00:00:23但它仅支持 JavaScript 和 TypeScript 这一点,使得它对 AI 辅助编码者的吸引力稍打折扣。
00:00:29点击订阅,让我们一探究竟。
00:00:30这是我正在开发的一个项目,它能为视频和图像添加电影胶片质感。
00:00:39它主要由 Claude Code 构建,因此会有一定程度的 AI 痕迹。
00:00:43这里还有一个针对该项目新功能的 PR,稍后我会详细介绍,只要 GitHub 没把它意外搞丢。
00:00:51首先,我将使用 BunX 运行带有 summary 标志的 Fallo,这意味着我无需安装它。
00:00:56这会生成我项目的快照,显示死代码摘要、重复项以及复杂性健康摘要。
00:01:02如果我们检查 Git 状态,它添加了一个包含缓存的新 .fallo 目录。
00:01:07这意味着后续运行该命令会更快,且包含快照和任何插件信息。
00:01:12现在,你可能注意到这里的健康度比阈值高出了 41。
00:01:16那么,这代表什么意思呢?
00:01:17Fallo 的健康评分是通过计算圈复杂度(Cyclomatic Complexity)和认知复杂度(Cognitive Complexity)得出的。
00:01:24它使用一些公式来计算复杂度密度。
00:01:27而在下方,所有这些数据都被用来计算可维护性指数,也就是我们在这里看到的评分。
00:01:33基于这个评分,它检测到我有 41 个文件需要重构。
00:01:38从这里开始,我们可以运行任何这些命令,来获取特定区域的更详细报告。
00:01:43因此,如果我想专注于健康度,我们可以运行这个命令。
00:01:46过了一会儿,它列出了所有存在不同健康问题的文件。
00:01:49注意,如果你想知道 CRAP 代表什么,它是“变更风险反模式”的缩写,
00:01:55你可以在文档中了解所有相关信息。
00:01:57但这种详细程度非常便于 AI 代理遵循并了解需要修复的内容。
00:02:00事实上,我认为重复项更容易跟进,因为它给出了确切的文件和具体的行号。
00:02:06所以我们现在先看这个。
00:02:07如果愿意,我们可以添加 fallo 配置文件,为 fallo 提供有关某些模式或你想要忽略的依赖项的信息,
00:02:14以及设置一些自定义重复设置、健康设置并添加边界(Boundaries),
00:02:18这是一种声明哪些目录可以从哪些其他目录导入的非常酷的方式。
00:02:23但这些对我的需求来说太复杂了,所以目前我们将坚持使用默认设置。
00:02:27现在从这里,我们可以运行 fallo fix 命令,或者添加 dry run 标志来查看它具体会做什么,
00:02:32也就是尝试解决所有可修复的问题类型。
00:02:35你可以看到,它将移除一堆导出项。
00:02:38但实际上我不信任 Fallo 运行自动修复,因为它对我的代码背景了解不多,
00:02:43比如每个函数的作用以及所有内容是如何协同工作的。
00:02:46因此,我不使用 fix 标志,而是将 Fallo 连接到我的 AI 代理,
00:02:49你可以通过 MCP 服务器或使用 VS Code 插件来完成,我猜它也能与 Cursor 配合使用。
00:02:55但我将保持简单,直接安装 Fallo Skill,它包含了一些护栏、代理规则和一些常见陷阱。
00:03:03安装好 Skill 后,我将运行 Claude Code,并给它一个提示语:研究这个项目以了解代码的工作原理,
00:03:10然后运行 Fallo 来处理重复代码,确保移除它不会破坏核心功能。
00:03:16完成后,将更改放入一个功能分支中,并运行测试以确保应用按预期工作。
00:03:22我们可以看到,这里加载了 Fallo Skill。
00:03:24然后它运行 fallo dupes 命令,并获取格式化后的 JSON 导出,这是一种机器友好的格式。
00:03:29大约四分钟后,Claude 完成了三个文件的修复,而不是 Fallo 建议的所有文件,
00:03:34主要是因为其他的是测试文件,而测试文件有时本就该有重复代码。
00:03:39我还让它创建了一个 PR,如果我们查看一下,它增加了 54 行代码并移除了 43 行。
00:03:46但这是因为我要求它添加一个 Fallo 配置文件,大约有 20 行,用于在未来的报告中忽略所有测试文件。
00:03:54当然,我们应该继续沿着这条思路,使用 Claude Code 或任何其他代理来修复复杂度问题或任何死代码。
00:04:00但 Fallo 也可以审查 PR。
00:04:02看看我之前给你们展示的这个 PR,运行 fallo audit 命令将检查该分支相对于 main 分支的任何问题,以便我们只修复特定问题。
00:04:12如果我们想基于不同的分支,只需使用 base 标志即可。
00:04:16如果我们也不想每次使用 Fallo 时都反复提示 Claude,我们可以运行 setup hooks 命令,它会为 Fallo 生成一些 Claude Code 钩子。
00:04:24Fallo 还可以作为带有 PR 注释的 GitHub Action 运行。
00:04:28它支持工作区(Workspaces)。
00:04:30它可以导出健康徽章并支持基线(Baselines),这意味着当前的问题可以随着时间的推移逐步修复。
00:04:35CI 只会捕获新问题,这对于修复具有大量问题的庞大项目非常有用。
00:04:41它基本上有很多功能,但几乎所有功能都是静态代码分析,这意味着它实际上并不执行你的函数。
00:04:49如果你想要能够执行的功能,那么 Fallo 支持一种称为“运行时智能(Runtime Intelligence)”的功能,告诉你在生产环境中遇到真实流量时触发了哪些函数。
00:04:59它通过使用 V8 运行时覆盖率来实现这一点,并通过一个可以在本地运行或部署到任何地方的 sidecar 将结果合并到现有的健康报告中。
00:05:08但当然,这是一个付费功能,这也在情理之中。
00:05:11总的来说,Fallo 是一个非常出色的工具,我会更多地使用它,尽管我觉得它的功能非常多,而且仅支持 JavaScript 技术栈。
00:05:19虽然其他语言也有各自的工具,但我不确定是否有工具能像 Fallo 这样将所有内容整合得这么好。我认为它的创作者 Bart 在开发此工具方面做得很好,它实际上在开始基于图的分析之前,使用 OXC 进行解析、语义分析和模块解析。
00:05:36所以基本上,它永远不会离开 JavaScript,我相信这让尤雨溪非常高兴——不是因为 JavaScript 部分,而是因为 OXC 部分,因为这是他通过 VoidZero 资助的工具。
00:05:46说到尤雨溪,如果你想听我们向他“拷问”关于 VoidZero、Vite、React Server Components 是否是个好主意以及介于两者之间的一切,请查看这个视频,这是一个一小时长的播客,我认为这是我最喜欢的作品之一。