用 agent 改完代码,最难受的不是写,是审。PR 里三十个文件、一半是格式化和改名,真正动了逻辑的可能就三处,看的人得自己把它们挖出来。GitHub 上刚冒出来的 perspica 就是冲这件事做的,而且它是本地工具,不联网也能跑。
它用 tree-sitter 把改动前后的两个版本都解析一遍,先把机械噪声分出去:格式化、只改注释、纯改名、整段搬走没改、生成和 vendored 文件,全部折叠;再给剩下的每一处命名——改名(连函数体一起改了也算)、签名变化(新参数必填还是可选)、依赖变化、抽成新函数、跨文件移动、每个函数里的逻辑变化。更有用的是它去查普通 diff 看不见的三类问题:改了名或删掉的名字在仓库里还有引用;签名变了但调用点没跟着更新(只在真会破坏调用者的改动上报警);这次改动留下的死代码。最后给一个阅读顺序:从入口一路往下走到被改的函数,并标出哪些改动被测试真正覆盖到。
和 agent 会话打通那一段最有意思。如果这批改动来自你自己的 Claude Code 或 Codex 会话,perspica 会把你当时的提示词翻出来;配合可选的 LLM 分析,每组改动会被标成 asked(附一句与你提示词逐字比对过的引用)或者 agent's call——后者是 agent 自己拿的主意,优先看这些。它只读你自己的改动(未提交的工作,或用你 git 身份提交的 commit),别人的 PR 不会去翻你的会话,加 --no-sessions 可以彻底关掉。
不挂模型也能用:一个本地二进制,典型 PR 几百毫秒出结果,同样输入永远同样输出,不需要 API key。想要意图分组、风险等级和摘要就加 -s,这时它优先用你本机的 Claude Code 登录,其次读 ANTHROPIC_API_KEY / OPENAI_API_KEY,或者走 Ollama 本地模型(gemma4:12b 约 16 GB 内存,qwen3-coder:30b 要 32 GB);本地模型慢一些,M4 Pro 上十个文件的 PR 大约一分钟。分析结果落在 .git/perspica/,重开或重跑不会重复花钱,--fresh 才强制重算。官方说明里发出去的只有改动清单和改动过的代码,不是整文件。
上手三步:cargo install perspica(macOS / Linux / Windows 的现成二进制在 仓库 Releases);进到仓库跑 perspica,加 --web 会在 127.0.0.1:7890 开浏览器视图,--pr 123 直接看 GitHub PR(依赖 gh),--branch develop、--staged、--git main...feature、--git HEAD~3 对应不同对比范围,--json 给机器读;想看意图分组就加 -s,默认模型是 claude-opus-5-5,sonnet 更快,haiku 适合快速过一遍。
边界也说清楚:语义分析覆盖 TypeScript/JavaScript(含 TSX/JSX)、Python、Rust、Go、Java、C,其他语言只按普通行 diff 显示;跨文件调用图按名字匹配、且要求调用方确实 import 了被调用模块,动态调用这种要靠运行时才确定的关系它可能漏;LLM 给的部分在界面上明确标成不确定,和静态分析结果分开摆;项目本身极早期(仓库只有个位数星、两次提交),别当成有长期维护承诺的基础设施;跑本地模型 16 GB 内存是起步线,小机器别硬上。
什么人该现在就试:天天用 Claude Code 或 Codex 产代码、合并前想有人帮自己把改动分个类的人。它不替代你的判断,只是把“到底改了什么”摊在面前——尤其是 agent 自己决定的那几处。第一次用,挑一个你最近拿 agent 改过的仓库跑 perspica --web,先看 agent's call 那几组,你就知道接下来该问什么了。
登录 后参与评论