我重新构建了我的“git blame for AI”工具的安装——六个步骤合并为一步

发布: (2026年5月1日 GMT+8 09:27)
14 分钟阅读
原文: Dev.to

I’m ready to translate the article for you, but I need the full text you’d like translated. Could you please paste the content (or the portion you want translated) here? I’ll keep the source line, formatting, markdown, and any code blocks or URLs exactly as they are.

Source: https://example.com/your-original-post

一周前,我发布了 Selvedge,一个捕获 AI 代理更改代码原因的 MCP 服务器

快速背景(如果你错过了第一篇文章)

AI 代理在写代码时会即时拥有完整的意图,但会话结束后,这些意图就消失了。Selvedge 能够实时捕获这些意图,由代理本身在上下文中记录。六个月后,你可以运行:

selvedge blame users.email

并得到一条关于该列存在原因的完整句子。

最初的发布进行得还算顺利:几百次安装、少量星标、在 dev.to 和 HN 上各有一篇帖子,转化率比我预期的要好。虽然没有出现戏剧性的增长,但用户流失的形态提供了有价值的洞见,这也是我在本周末发布的 v0.3.4 版本的主要关注点。

安装是瓶颈,我一直在自欺

我知道安装体验并不理想。README 的第一版让你完成六件事:

  1. pip install selvedge
  2. cd your-project && selvedge init
  3. 打开 ~/.claude/config.json 并添加 mcpServers.selvedge 块。希望你的 JSON 写得正确。
  4. 打开项目的 CLAUDE.md(或新建一个)。粘贴系统提示,告诉代理在触及列、函数、环境变量或依赖时调用 log_change
  5. selvedge install-hook,这样 post‑commit 可以将事件关联到提交。
  6. 重启 Claude Code,因为 MCP 配置不会热加载。

在 README 与编辑器之间来回切换四次。其中一步——第三步——是“手动编辑 JSON 文件”,大约八秒就会让好奇心消失。第五步,post‑commit hook,在 macOS 上使用 Tower、GitKraken 等 GUI 客户端提交时会悄然失效,因为 git 启动时的 PATH 被剥离,而 selvedge 不在其中。我在 v0.3.2 中专门写了 selvedge doctor 来应对这个 bug。之所以会出现这个 bug,是因为安装过程没有让人注意到 hook 的存在,从而导致它失败。

实际的安装指标大致符合预期:

  • 人们执行了 pip install
  • 有些人运行了 selvedge init
  • 更少的用户真正走到 tool_calls 开始发送到服务器的阶段——这才是我真正关心的。

JSON 编辑和 CLAUDE.md 编辑正是卡点所在。

v0.3.4:一键式设置

v0.3.4 将所有步骤合并为一个命令:

pip install selvedge
cd your-project
selvedge setup

向导会:

  • 读取 ~/.claude/config.json~/.cursor/mcp.json,并查找 .github/copilot-instructions.md——取决于你实际拥有的文件。
  • 写入 MCP 条目。
  • 将系统提示块写入你的 CLAUDE.md.cursorrules,使用哨兵括号标记,这样下次我更新推荐块时,你只需重新运行 selvedge prompt --install,它会就地打补丁而不干扰文件的其他部分。
  • 运行 selvedge init
  • 安装 hook。
  • 在每个文件被修改前在旁边生成 .bak,因此如果出现错误调用,你可以恢复。

在已经配置好的项目上重新运行是无操作的。对于 CI 或 devcontainer.jsonpostCreateCommand,可以使用:

selvedge setup --non-interactive --yes

就这么简单。Selvedge 的“有趣”部分——实时推理捕获、实体级历史、变更集——如果没人能通过安装环节就毫无意义。六个手动步骤让所有本可能尝试的用户望而却步,而一个命令则不会。

关于在该类别中不再是唯一的存在

自从发布帖子以来,另一件事也发生了变化:“AI 版 git blame”这一领域迅速变得拥挤。AgentDiff、Origin、Git AI、BlamePrompt——全部是真实的工具,均在活跃开发中,且有数个背后有明确团队支持。当我一周前发布第一篇文章时,我只知道大约一个直接竞争者。现在我已经看到四五个。

这其实没问题。这说明这个问题足够真实,以至于不止一个人决定去解决它。但这也意味着我需要明确说明有什么不同,因为如果你单独阅读每个工具的 README,合理的结论是它们都在做同样的事。

实际有什么不同? 何时 捕获推理过程

工具推理来源粒度机制
Selvedge实时捕获,由产生变更的同一上下文中的代理完成实体(DB 列、表、环境变量、依赖、API 路由、函数)MCP 服务器 — 代理在工作进行时调用
AgentDiff会后由 Claude Haiku 根据会话结束时的 diff 推断Git 前/后提交钩子
Origin提交时捕获Git 钩子
Git AI归属元数据Git 钩子 + Agent Trace 联盟
BlamePrompt仅限 PromptGit 钩子

大多数这些工具会等到提交时,然后让第二个 LLM 查看 diff 并解释发生了什么变化。这是一种合理的做法,输出在首次阅读时看起来也不错,但它并不是代理实际的推理——代理拥有的是提示、对话历史、用户的真实需求以及模型对这些内容的解释。事后解释器只能看到 diff,因此只能生成看似合理的内容。

看似合理并不总是正确。
如果你将 INTEGER cents 改为 DECIMAL(10,2) 是因为用户报告了国际交易的四舍五入错误,这才是实际原因。如果第二个 LLM 在几个月后查看这个 diff,它可能会写出类似 “提升了货币值的精度” 的描述——在一般意义上是对的,但在你想弄清下次需要对哪些货币进行回归测试时,这种描述毫无用处。

Selvedge 的推理就是做出变更的代理所写的内容。它来源于产生变更的同一上下文窗口。没有第二个模型,也没有额外的推断。并且因为它就是代理拥有的内容,空的 reasoning 字段本身也是有用的信息——它表明代理没有记录任何理由。

实体归属,简要说明

还有一点稍有不同:大多数工具归属 。Selvedge 归属 实体
当你在代码库中调查某件事时,你不会搜索 “users.py 第 40 行到 48 行”;而是搜索 users.emailSTRIPE_SECRET_KEY/api/v1/checkout。这正是 Selvedge 所存储的内容:

users.email           DB column
users                 DB table
src/auth.py::login    Function in a file
api/v1/users          API route
deps/stripe           Dependency
env/STRIPE_SECRET_KEY Environment variable

selvedge diff users 会返回 usersusers.email 以及 users. 下的所有其他实体的事件。任何前缀都可以这样使用。

我曾考虑是否也要归属行(更细粒度,像其他工具那样),但最终决定 这么做。行会漂移。重命名会破坏归属。将一个函数重构到三个文件会使所有引用原位置的记录失效。实体的粘性要比行更强。

更改集

Selvedge 提供的另一项我在其他地方未见的功能是 更改集——一个可以附加到任何事件的 slug,这样以后你就可以把某个特性的所有事件全部拉出来,无论它涉及了多少实体或跨越了多少 PR。

示例: Stripe 计费。
在真实代码库中的一次计费上线会触及 users 表的新列、两个新的环境变量、三个新的 API 路由、一个新依赖、代码库中四个函数,并且会在一个月内分成八个小 PR 合并,因为没有人愿意审查一次巨大的差异。

六个月后,有人需要审计哪些代码行涉及支付数据——出于合规、事故调查或重构的需要。git log 在这种情况下毫无用处。每个 PR 的标题都很通用(“更新计费”、 “接入 webhook”、 “修复迁移中的拼写错误”),跨域的关联信息已经丢失。

如果这项工作中的每个事件都标记为 changeset:add-stripe-billing,你可以运行:

selvedge changeset add-stripe-billing

并获取 每一个 参与该更改的 每一个 实体的 所有 事件,以及代理对每个事件的推理。这是一种汇总视图。就我所知,其他人并没有存储这种信息,因为它需要在每次变更时捕获推理,而这只有在实时捕获的情况下才可行。

Agent Trace

几位用户在第一篇文章后私信我询问 Agent Trace。Cursor 和 Cognition 在一月发布了一个 RFC,提出了一个用于 AI 代码归属追踪的开放标准:JSON 记录、文件/行粒度、刻意与存储方式无关。Cloudflare、Vercel、Google Jules、Amp、OpenCode 和 git‑ai 都已签署。

Selvedge 并不是在与其竞争;它是 producer(生成器)。

  • Agent Trace = 线缆格式。
  • Selvedge = 填充该线缆格式的一种方式(实时、由代理在更改发生时生成)。

导出设计位于 docs/agent-trace-interop.md。我将在 v0.3.5 或 v0.4 中发布实际的 selvedge export --format agent-trace 标志。

尝试一下

pip install selvedge
cd your-project
selvedge setup

然后在该目录启动一个代理会话,做一次非平凡的更改,并在另一个终端运行:

selvedge watch

你应该会看到事件流动,因为代理调用了 log_change。当出现几条记录后:

selvedge blame

推理过程是实时捕获的——这就是整个产品。

如果 selvedge watch 没有任何输出,运行:

selvedge doctor

它会告诉你哪个步骤在悄悄出错(仍然有一些边缘情况会静默失效;我正在处理它们)。

接下来是什么,我想要的反馈

第 3 阶段 的路线图是 team‑sync 故事——Postgres 后端、HTTP API、多个开发者共享历史而不共享 SQLite 文件。我还没有确定日期。本地 SQLite 版本已经为单独开发者和小团队提供了完整功能,前提是他们可以共享文件。

反馈请求: 当你尝试时,selvedge setup 在哪里选择了错误的默认值?Cursor 和 Copilot 路径比 Claude Code 那个更新——我使用它们的次数更少,测试覆盖率存在,但并非来自真实使用。如果向导中的某些内容让你感到惊讶,打开一个 issue 是你能做的最有帮助的事。

github.com/masondelan/selvedge — issues 和私信都可以。

0 浏览
Back to Blog

相关文章

阅读更多 »

模型越智能,节省越多。

神话:更智能的模型会让插件变得多余。自从 WOZCODE 推出以来,许多 Claude Code 高级用户低声说插件的优势将会消失。