用 AI 分析 Dependabot/Renovate PR 中的 breaking changes 影响。可直接用于简化 CI 工作流和 PR 审查流程。
今天,我们正式发布 fossabot:一个用于制定战略性依赖更新方案的新型 AI Agent,并由一套全面的准确性、一致性和正确性评估框架提供支撑。
fossabot 能像工程师一样交付完整成果,包括研究新版本、分析对应用的影响,并在必要时调整代码。该产品践行了我们对依赖更新自动化的理念,也延续了收购 EdgeBit 时的愿景。
fossabot 目前已开放公开预览,现阶段主要聚焦 JavaScript 和 TypeScript 生态系统。
十年来,FOSSA 一直帮助企业抵御两大类开源风险:合规风险和安全风险。如今,我们发现第三类风险正在浮现:依赖变动过于频繁,而更新却长期停滞。
AI coding Agent 正以前所未有的速度创建新代码仓库和依赖树,快到我们根本跟不上。
与此同时,作为核心资产的应用却无法跟上上游项目的快速演进,只能越落越远。
这两种情况都不理想,但 fossabot 可以提供帮助——就像让你最优秀的工程师全天候管理依赖更新一样。
问题的根源在于,每家企业的依赖更新机制都存在缺陷。为什么?因为现有工具无法像工程师那样制定战略性的更新方案。
企业通常只关注如何用最小幅度的更新修复一条告警,结果下个月还要再来一遍。没有人有时间研究如何把某个 package 升级到最新版本,以及这种升级能给应用带来哪些收益。
作为依赖更新 AI Agent,fossabot 能够处理复杂度很高的大型升级——这类任务通常必须由高级工程师完成,因为它们往往会意外演变成长达数小时的研究与编码工作。
我建议合并这次从 lodash 4.17.20 到 4.17.21 的更新。这是一个 patch release,修复了多项安全漏洞,并包含性能改进。你的应用对 lodash 的使用方式与本次更新兼容。
分析了 components/、utils/ 和 services/ 中使用 lodash 工具函数的 47 个文件
确认没有 deprecated method 或 breaking change 会影响你的代码库
修复 merge 函数中的 prototype pollution 漏洞
改进 template method 的输入验证
增强 defaultsDeep 的数据清理能力
fossabot 最初只是一个内部工具,但很快就成为我们的工程师和受信任测试人员不可或缺的助手,因此我们决定将它作为公开预览版本发布,供所有人使用。
fossabot 以 GitHub app 的形式提供,所有用户每月都能获得 15 美元的免费使用额度。
fossabot 能提出战略性的更新建议,是因为它能够权衡风险与收益,结合你的应用理解 breaking change,甚至可以调整代码以适配更新的编程范式。
Dependabot 或 Renovate 等现有更新工具无法完成这类推理,因此最终往往只能被配置成一种“笨拙”的工作模式,例如只允许 patch release。
此外,机械地执行更新并不是最困难、最耗时的部分。真正漫长的是研究更新内容并理解它会给应用带来哪些风险,而这最终导致大多数更新被无限期地扔进 backlog。
fossabot 的分析会判断一次更新对你的具体代码库以及依赖使用方式有何影响,而不是靠猜测判断兼容性,因此能够进行更明智的推理。
分析结果看起来几乎完全准确。
对于是否应该合并,它给出的整体判断非常出色。你可以借此快速处理那些容易解决的问题,把精力集中在规模更大的升级上。
这类推理的示例包括:
使用重写后的 React library,并更新组件以采用更现代的语法
安全地升级 library 的 major version,因为你使用 API 的方式具有前向兼容性
调整代码,以适配 patch update 中未明确声明的行为变化
下面是这类推理实际运行时的部分摘录:
fossabot 将静态分析提供的确凿事实,与可扩展且注重细节的 AI 完美结合起来。
fossabot 的表现能够超过人类工程师,因为它可以把工作扩展到正常人不可能达到的程度。它研究得更深入、更细致、持续时间也更长,同时能完整记住你的 first-party code、依赖代码,以及 library 的 release notes、migration guides 和文档。
人类可能工作一小时后就会感到疲惫,甚至几分钟后就会如此;但 fossabot 会一直工作,直到对每个发生修改的函数完成分诊,并理解这些修改对整个代码库产生的全部影响。
没有哪个工程师能够掌握依赖使用情况的全貌,尤其是在涉及多个团队时。fossabot 能够吸收更多分析结果,并理解更多关联关系,规模远超人脑所能梳理的范围。
客户告诉我们,评估一次变更需要投入多少工作,有时和执行更新本身一样困难。当 fossabot 接管依赖更新后,你可以跳过所有这些繁琐工作,直接收到已经完成的任务,并由它交付到 pull request 中。
fossabot 清楚自身的能力边界,也可以请求协助,完成更新落地前的“最后一公里”。凭借我们的评估框架,以及对不同更新类型进行分类的能力,我们相信 fossabot 足以处理 JavaScript/TypeScript 生态系统中复杂度很高的大型更新。
今年早些时候,FOSSA 的工程师提出一个假设:只要提供正确的上下文,我们就可以消除依赖更新中的繁琐工作。我们开始构建一套定制 AI 框架,为其提供来自 FOSSA 依赖元数据扫描的详细信息、升级路径指导,以及开源项目健康度信号。它随后发展成一个强大的 breaking change 检测引擎,其分析的细致程度与准确性至今仍不断给我们带来惊喜。
发现 breaking change 之后,下一个挑战是检测它对每位客户代码库的影响。静态分析是完成这项工作的理想工具,这促成了我们与 EdgeBit 的合作,以及最终对它的收购。EdgeBit 开创了一种专为依赖更新场景设计的新型分析方法。
静态分析可以防止 AI Agent 犯下低级错误。根据我们的经验,它与 AI Agent 和 sub-agent 所带来的适度模糊性形成了完美平衡。fossabot 类似一种“专注型 Agent”:整体形态接近一条追求确定性的 pipeline,同时也包含 Agent 式的执行步骤。
在持续迭代 fossabot 的过程中,我们很快意识到,评估框架和 ground truth dataset 与工具本身同等重要;从很多方面来看,构建它们的难度也不亚于编写代码。
fossabot 会根据一组经过验证的依赖更新,持续评估自身的准确性、一致性和正确性(Accuracy, Consistency, Correctness,ACC)。这些更新包含程度各异的 breaking change、不同数量的代码变更行,并覆盖真实应用中对这些 library 的各种使用方式。
这个过程很快揭示了一项关键经验:加权评分在评估中至关重要。false positive——工具错误地将某个 breaking change 判定为安全——可能造成业务中断并损害用户信任,其代价远高于 false negative——将一次安全更新标记为需要额外审查。这个阶段也帮助我们推翻了一些早期过于简单的假设,例如认为所有 major version upgrade 都必然包含 breaking change 的错误观念。
我们的公开预览首先面向 JavaScript/TypeScript 生态系统,因为该领域的 ACC dataset 已经足够充实。随着我们建立更多 ground truth,其他生态系统也会很快跟进。
我们相信,fossabot 从诞生之初就确立的几项设计决策,使其成为一个值得信赖的基础:
在关键步骤中追求确定性
聪明地运用静态分析
利用 AI 锲而不舍、注重细节的特点
根据 ACC ground truth 衡量自身表现
我们希望 fossabot 能赢得你的信任,也非常期待你提供反馈,无论是指出哪些分析表现出色,还是哪些地方仍需改进。
fossabot 的公开预览版本以 GitHub app 的形式提供。每位用户都可以获得 15 美元的分析额度,并且每月都会恢复额度。让依赖更新尽情跑起来吧!
目前,fossabot 会自动分析由 Dependabot、Renovate 或 Snyk 创建的 Pull Request。很快,fossabot 将开始创建自己的 PR,并在此之前完成规划和分析。
欢迎联系我们获取 fossabot 演示,让我们一起研究如何帮助你的团队补上积压的依赖更新。