跳转至主要内容 (Skip to content)
上晋 / blog

默默合并的百余个 PR:Google Jules 如何帮我打磨心迹

•上晋
从代码库建议到定期巡检,聊聊 Google Jules 异步编码代理如何帮我接管心迹的日常技术债,以及"开 PR - AI 审查 - @jules 修复 - 本地 Agent 批量合并"的协同工作流。
目录点击折叠/展开

最近社区里一直零星有些关于 Google Jules v2 要发布的消息,传了挺久,但等来等去始终没见官宣。仔细看现在的 Jules,似乎也已经有阵子没什么实质动静了。

在很多人眼里,Jules 大概属于那种“食之无味”的工具:Discord 和社交平台上常能看到有人吐槽它难用,在如今各种终端 Agent 和编辑器插件百花齐放的环境下,真正日常在用它的人看起来也寥寥无几。

但我自己其实一直没停用它,而且感觉它实打实帮我分担了不少琐碎的累活。前段时间我翻了翻心迹(ThoughtEcho)的代码提交记录,连我自己都有些意外:不知不觉间,Jules 已经为心迹贡献了百余个 Pull Request,并且全都被我合入了主分支。

既然 v2 还在路上,索性写篇博客聊聊:这个在不少人眼里“没什么人用、甚至有点不好用”的异步工具,到底是怎么帮我默默打磨心迹的,以及我围绕它搭出来的那套几乎不用怎么操心的协同工作流。


一、独立开发的痛点:谁来给代码库“扫灰”?

很多人觉得 Jules 鸡肋,很大程度上是因为对它的预期错位了——如果指望它像 Codex 那样实时帮你写业务大功能,它跑在云端、周期又长,确实很难称手。

但在我独立维护心迹的过程中,最耗费心力的往往不是写核心功能,而是那些无穷无尽的边角技术债:

  • 某处正则表达式每次调用都在动态编译,白白浪费 CPU;
  • 某个高频字符串处理逻辑在大文本下频繁触发垃圾回收(GC);
  • 底层不少核心纯工具函数长期裸奔,缺乏边界单元测试;
  • 还有更现实的一点:平时用 AI 辅助写代码写爽了,大模型随手生成的 UI 提示和报错文案,往往带着浓厚的系统底层黑话(比如“静默同步失败”、“需要多语言及 Emoji 字体文件”)。

这些问题不致命,应用依然能跑,但它们就像散落在地板上的碎石子。我明知道它们在那里,但我很难每天专门抽出一两个小时,去把每个文件翻一遍做这些枯燥的“扫灰”工作。

这就是 Google Jules 帮我最大的地方。它不是那种等你呼唤的即时助手,它靠的是代码库建议(Suggested Tasks)和定期任务(Scheduled Tasks)。在云端静默巡检,主动把这些边角料捞出来,打包成 PR 递到我面前。


二、从 3 个默认模板到专属战队:心迹的定制配置

在 Jules 控制台里,官方默认提供了三个很克制的定期维护模板:

  1. 性能(Performance):抓内存占用、GC 压力与高频循环耗时;
  2. 设计与可访问性(Design):给缺少 Tooltip 的图标按钮补充无障碍标签,统合 Design Token;
  3. 安全(Security):扫描凭据泄露风险与未设防的敏感操作。

这三个默认项适合通用项目打底,但心迹是一个跨 Windows、Android 和 iOS 的 Flutter 笔记应用,本地有 SQLite 数据库、有 Quill 富文本 Delta 解析、还有 WebDAV 同步,痛点要复杂得多。

为了让它真正切中我的日常痛点,我在默认模板之外扩充了专门的定期任务,并在仓库的 .jules/ 目录下给它划分了专职的分工角色:

  • 📏 标尺 / Caliper(测试):专挑那些我觉得“太简单不可能错”而长期没测的纯函数,补齐无依赖单元测试;
  • ✍️ Quill(文案与去黑话):专治其他 AI 在写界面时随手留下的技术黑话,把底层系统逻辑翻译回用户能听懂的实际收益;
  • 🩺 Guardian / 🛡️ Aegis(健壮性与安全):专查 Dart 代码里不设防的弱类型强转,给复杂 JSON 反序列化与数据库事务加上防御。

更实用的是 Jules 的记忆机制。在提 PR 时,Jules 常常会把碰壁学到的教训追加到 .jules/<角色>.md 里。比如在 bolt.md 记录“高频调用的方法中,字面量 RegExp 会重复触发编译开销,必须提取为 static final”。下一次同一个任务再跑时,它是带着这些记忆进场的,不会在同一个坑里反复跌倒。


三、实战战果:这些 PR 到底帮我处理了什么?

看数字容易觉得抽象,翻看心迹这几个月合并的提交,有几个真实的例子非常典型:

1. 消除高频操作里的 N+1 删除瓶颈(PR #571)

聊天会话列表每次加载,都会触发一次空会话清理。原本的逻辑是遍历需要删除的会话,每条单独发起一次 SQLite DELETE 请求——平时感觉不出来,但空会话积累到几百条时,几百次独立的 IPC 通信会让这个动作整体耗时超过 2 秒。Jules 把它重构成收集 ID 后批量 WHERE id IN (...) 提交,实测清理耗时从 2826ms 直降到 352ms,缩短了 87.5%。这种散落在日常代码里的 N+1 隐患,靠人肉 review 很难系统性发现,它却能逐一揪出。

2. 主动标记数据库迁移工具里的边界写法(PR #414)

数据库升级脚本里有一处 ALTER TABLE 语句,列名是通过字符串拼接构建的——DDL 操作本身不支持标准的 ? 占位符,这类写法在极端条件下理论上存在非预期执行的可能,也容易触发静态安全扫描告警。Jules 在例行巡检中把这处逻辑标记出来,补上了标识符白名单校验(^[a-zA-Z_][a-zA-Z0-9_]*$),把潜在的边界情况关在了门外。这不是正在发生的问题,但能在它成为问题之前就被发现,正是定期巡检的价值所在。

3. 给 AI 分析的数据解析加上容错保护(PR #561)

心迹的 AI 笔记分析功能需要解析服务端返回的 JSON。服务端偶尔会以驼峰命名(如 analysisType)替代下划线(analysis_type),或以数字类型返回某些字段——这些细微差异在正常情况下不会出现,但在网络抖动、版本切换或同步边界场景下,旧解析器遇到这类非标返回就会异常退出,导致分析页面白屏。Jules 逐字段补上了类型容错和命名别名支持,让解析在各种边缘情况下都能平稳降级。

4. 洗掉 AI 写代码时留下的生硬黑话(PR #600)

现在借助 AI 写代码很普遍,但大模型随手生成的 UI 提示往往带着极其浓厚的“机器味”。比如之前在设置页和同步报错里,AI 随手写的是“静默同步失败”、“需要多语言及 Emoji 字体文件”。用户看到只会觉得生硬又困惑。Jules 的文案任务定期扫一遍,全部帮我改成了“自动在后台同步”、“首次使用时会自动下载字体包,完成后即可离线使用”这种说人话、重收益的自然表达。


四、一个人维护,如何跟上百余个 PR?我的协同工作流

一个人独立维护一个项目,面对 Jules 频繁开出的 PR,如果每一个都要拉到本地人肉核对,不仅省不下精力,反而会变成新的心智负担。

我之所以能平稳地把这些 PR 都消化进主分支,关键在于我搭建了一套近乎全自动的闭环流水线:

  1. 触发任务:要么是它后台自己扫出来的“代码库建议”我顺手点批准,要么是配好的定期任务按时在云端唤醒它跑任务开 PR;

  2. AI 代码审查当第一道守门员:PR 提出来后我根本不急着看,GitHub 上的 CodeRabbit 会在几分钟内自动 review。空指针、逻辑漏洞、漏掉的测试用例先被它筛一遍;

  3. 过审直接合,不过直接在评论区 @jules:如果审查全绿、CI 门禁通过,我用手机扫一眼 diff 觉得合理就直接点 Merge;如果审查挑出了毛病(比如指出“这里少考虑了 null 兜底”),我直接把审查建议原样粘进 PR 评论区 @jules。它自己拉回去重新思考、推新的 commit,直到审查全绿;

  4. 攒多了让本地 Coding Agent 批量合并:要是几天忙主线没看 GitHub,仓库里很容易攒下十来个通过审查的小 PR。我不需要在网页上挨个点,直接在本地终端唤出 Coding Agent 扔一句话:

    “把远端所有通过审查且没有冲突的 Jules PR 拉下来跑一遍本地回归,没问题全部批量合并。” 本地 Agent 自动切分支、跑测试脚本、核对无误后一口气 squash merge 进主分支。我一嘴吩咐,流水线自己跑完。


五、聊聊它的不完美,以及对 Jules v2 的期待

说了这么多好处,我绝不是想把它吹捧成万无一失的银弹。

如果你常逛 Jules 官方 Discord 的 feedback 频道,就会发现社区里的吐槽一直很多,而且很多毛病我自己也实打实遇到过:

  • 任务偶发卡死与超时:有时候一个简单的改动在云端沙箱跑着跑着就彻底转圈,或者突然报网络内部错误;
  • Git 状态犯迷糊:偶尔会提一些没有任何实质修改的空 commit,或者在分支合并上搞出奇怪的冲突;
  • 改动容易越界:改着改着手伸长了,把不相干的文件、甚至是自己的草稿笔记(比如 .jules/ 里的临时记录)顺手打包进了 PR;
  • 多轮交互打转:在评论区 @jules 修正稍微复杂点的问题时,偶尔会出现“前脚刚按建议修好 A,后脚又把 B 改坏”的窘境。

但为什么哪怕它有一身毛病,我依然让它在心迹的日常维护链路里跑着,并且一路合并了百余次?

因为我对它的定位非常清晰:我从来没指望它能替我写出什么惊世骇俗的大架构,它只要稳定地把这些边角活持续接过去就足够了。

写代码最消磨创造力的,往往不是设计核心架构,而是你明明知道项目里有一堆积压的边角事项——这里少个单测、那里有个内存浪费、某处文案像机器写的——但你每天就那点精力,必须全部押在主线推进上。久而久之,技术债越堆越高,项目越来越沉。

Jules 帮我最大的地方,就是把这种“食之无味、弃之可惜、但对代码健康至关重要”的琐碎脏活,以极低的心智成本接了过去。即便它偶尔出错,前有 AI 代码审查拦着,后有本地测试兜着,代价完全可控;而它做对的那些微小改动,换来的是心迹今天实打实的工程质量。

现在社区都在期待 Jules v2。就我自己的日常体验来说,愿望其实非常具体:

  • 自动读取 AI 代码审查并自主闭环:现在还需要我把 CodeRabbit 的审查建议复制到评论区 @jules,如果未来它能自动监听 PR 里的 Review 意见并主动触发自测修复,整个协作流水线才算真正实现全自动;
  • 接入更新的底座模型:进一步提高生成代码的质量和工程健壮性,少一点机械式的反复打转,更好地理解现代框架的惯用法;
  • 让“代码库建议”更上一层楼:目前的建议大多还停留在显性的 #TODO 和局部性能优化。希望能给出更多、更深维度的建议——比如主动嗅探出模块间的隐式耦合、未被防范的并发竞态,或者深层的架构坏味道;
  • 基础沙箱体验磨平:云端环境稳定点别总卡死,长上下文跨多文件时能更聪明一点,别把刚修好的东西又悄悄改回去。

如果你也是一个人维护一个项目,真的可以考虑在云端常驻这么一个异步维护代理。繁杂琐碎的脏活累活让它去跑,你把最宝贵的时间和心力,留给真正有创造力的部分。


辅助创作:Gemini 3.8 Flash · 审校:Claude Sonnet 4.6