我们用一个周末构建了一个自主代码守护者

我们带着一个疯狂的目标参加了 JacHacks。

构建一个监控代码仓库的工具。它必须能发现可疑的依赖项变更。它必须在沙箱中运行这些依赖项以证明其恶意性。然后,它必须编写修复方案并提交 pull request。直到最后,整个过程无需人工干预。

我们将其命名为 GhostWatch。它在智能体赛道(agentic track)中获得了第二名。

以下是我们的构建过程以及我们的心得体会。

问题所在

标准的代码审查有两个主要缺陷:

  • 工具无法识别“爆炸半径”(blast radius)。一个函数的变更可能会破坏远处的其他文件。大多数工具不会去查看它们之间的关联。
  • 供应链攻击可以绕过审查。攻击者可以直接向注册表推送中毒版本。由于没有 pull request 可供审查,你只能在损害发生后才察觉。

我们的解决方案

我们构建了一个具有空间感知能力的系统。我们使用 Jac 将代码库建模为一个图(graph)。

在这个图中:

  • 文件是节点(nodes)。
  • 导入(imports)是边(edges)。

为了寻找爆炸半径,我们不是靠猜测,而是进行图遍历(graph walk)。这使得安全逻辑具有确定性和可解释性。

技术栈

我们使用了 Jac,而不是原始的 Python 和手动调用 LLM。这改变了我们的工作方式:

  • 代码库本身就是数据结构。
  • 内置持久化。我们的仓库图在重启后依然存在,无需独立的数据库。
  • LLM 集成是无缝的。我们只需使用一个关键字,就能将一个函数转换为返回类型化对象的 LLM 调用。

难点

这并不容易。我们遇到了几个障碍:

  • 新语法:Jac 使用分号、大括号以及像 has 这样特定的关键字,而不是 Python 中的 self。我们头几个小时都在修复解析错误。
  • React 陷阱:我曾尝试原地修改列表(mutate lists in place),这导致前端无法更新。我不得不改为重新赋值列表以触发重新渲染(re-renders)。
  • 文档缺失:由于部分文档不够详尽,环境搭建花费的时间比预期的要长。

为什么这很重要

大多数智能体(agent)系统都需要你手动管理状态、编排(orchestration)和序列化。而使用 Jac,图(graph)本身就是一种语言结构。系统架构与我们正在解决的问题完美契合。

这个项目并不完美。沙箱使用的是本地子进程(subprocesses),而不是云端微型虚拟机(microVMs)。我们保留了这些不足,因为黑客松的成果不应该带有虚假的修饰。

观看演示:https://www.youtube.com/watch?v=ZN0UVnNUpRs

查看代码:https://github.com/ayushmk7/GhostWatch

来源:https://dev.to/ayushmk/we-built-an-autonomous-code-guardian-in-a-weekend-heres-what-happened-4982

可选的学习社区:https://t.me/GyaanSetuAi