跳到正文

agy-staff

它把 Google 的 Antigravity CLI 雇成一名员工。宿主 agent——Claude Code、Codex 或 Pi——留住决策权,把调研、评审和范围明确的改动交给一个跑在后台的 Gemini 3.8 Flash 员工,用一个 job id 来回传话。

Screenshot of agy-staff
编辑截图, 1 Oct 2026agy-staff ↗

这是什么

Google 自家的编码 agent 就是 Antigravity CLI,这个项目把它雇了下来:一个伴随脚本把 agy 包起来,交给 Claude Code、Codex 或 Pi 当作一位可以派活的同事。五个 persona 分工——ask 负责无工具的一次性问答,staffer 接一般委托,另有 researcher、reviewer(代码与方案两种)和 implementer——每一个都固定在 Gemini 3.8 Flash 的某一档推理强度上;再有一个 lead 技能告诉宿主 agent 哪些交出去、哪些自己留着。只有 ask 在同一次调用里给答案,另外四个返回一个 job id 和一条 wait 命令,跑在独立的 worker 进程里,把 spec、日志、结果与终态都留在仓库的 .agy-staff/ 下。它在 2026-08-18 出现,随后一个月里发了十二个版本,MIT 许可,到 9 月底有 696 个星和两个未关的 issue。

谁做的仓库背后的账号 2022-04-18 注册,31 个公开仓库,147 个关注者,签名写着「think twice」,公司一栏填的是 Google,个人站点是 lastwhisper.dev。该仓库 52 次提交里有 50 次来自这个账号,且分散在两个作者名下——pkuwkl 39 次、LastWhisper 11 次。另外两位 Shen-18 与 solitudealma 各贡献一次提交。

它是怎么搭起来的

组成 · 6

整个运行时就是一个伴随脚本,围着它的技能全是文档——这一点决定了大部分设计。因为派活的一方就是个普通 shell 使用者,worker 做的事必须能表达成一条命令:一个退出码、磁盘上的文件、以及有上限的一段文字;又因为 agent 循环归宿主所有,插件从不试图调度、唤醒或通知,只交回一个 job id,让宿主自己决定什么时候去等。状态按仓库而不是全局存放——代码旁边的 .agy-staff/ 里放着会话、任务 spec、日志、结果、原始事件流与快照——所以任务能在同一份检出里被查看、续跑或重启;而这个目录是把自己追加进 .git/info/exclude,不是被跟踪的 .gitignore,因为它是本机的临时物,写进一个会被提交的文件就等于改动了所有人的仓库。两档权限、默认不受限,让常见路径免于 setup,同时留着加固的口子。最后它是一个很薄的启动器:准备提示词、派出进程、汇报工作区状态、收集结果;它刻意不解析交付契约,也不替谁去执行提交、推送或开 pull request。

companion/
运行时本体,四个模块,除 Node 标准库外别无依赖:88 KB 的入口管模式、任务管理与 setup;17 KB 的流式执行器管进程清理与截止时间;7.7 KB 的观察模块管事件解析、进度快照与输出预算;4.5 KB 的锁管状态写入与失效锁恢复。
skills/ 与 pi-skills/
七份规范技能——ask、staffer、researcher、reviewer、implementer、lead 与 jobs——其中 reviewer 与 jobs 各带一个 references 目录,供需要时展开细节。Pi 目录是从规范目录机械生成的:加上 agy- 前缀、改写兄弟引用;贡献指南明确要求改规范文件、绝不改生成物,两者之间由一个生成器和一个一致性检查把门。
templates/
五份给派活模式共用的提示词模板,从 254 字节的 ask 到 3 KB 的 implement;另有一份 harness 兼容说明,由生成的 Pi 技能追加,要求缺某个工具的宿主去找等价做法,而不是把要求丢掉。
插件清单
一份 Claude Code 插件清单,外加它自托管的 marketplace 文件;一份 Codex 插件清单和一份 Codex marketplace 文件;以及一个兼任 Pi 清单、npm 文件白名单与验证命令落点的 package.json——同一个脚本,靠三套各自的安装仪式送到三个宿主手里。
tests/
25 个文件、219 KB。标准套件离线运行,用临时仓库、临时 HOME 目录和一个假的 agy;最大的几个文件覆盖模式行为、恢复回归、Windows 进程处理与开发体验;对真实 agy 的验证是另开的可选套件。
docs/ 与 scripts/
一份 38 KB 的参考文档和它的中文对照、一份写给另一个编码 agent 读的 13 KB 安装指南、十一个 release notes 文件,以及生成 Pi 技能、徽章、logo 与图示的脚本。文档按规矩成对维护:改一份就要改它的对照。

取舍,以及它替代了什么

  • 做一个委派接口,而不是去要宿主工具那样的调度权 替代 把自己做成拥有通知或调度特权的原生工具

    issue #13 里写明的目标是「agent-native」的异步子 agent 工具:能渐进披露上下文,交回控制权时带上足够做判断的信息。同一段里也划了界——这并不意味着插件拥有和宿主原生工具一样的通知或调度特权。实现也确实如此:没有额外的守护进程,也没有调度器。

  • 默认不加限制,加固改成可选的标志 替代 0.1 那种先跑 setup 才能用的失败即拒默认

    迁移表写得很直白:0.1 把 research 与 review 默认设为受限,除非先跑过 setup;0.2 反过来让不受限成为默认,--restricted 才是你真正会去用的那个标志。README 把代价写在旁边——这些提示词层面的指令并不提供权限隔离,而没有允许清单的受限运行只会以一次空回复成功收场。

  • 干脆不再切分命令行 替代 给「参数到哪结束」写一条更聪明的规则

    shell 本来就已经切好了 argv,第二次切分让一句提到 git diff --check 的任务以未知选项报错收场。修法不是更好的边界规则,而是停止切分:每次调用只允许一个任务来源,并且任务文本一个字节都不看。

  • 评审用话描述,而不是把 diff 递过去 替代 --diff-file、--pr、--target 这类标志

    reviewer 自己用 gh pr view、git diff 和读文件去收集证据,遇到模糊之处是报告而不是猜。撤掉这些标志让模板保持为一个中立的骨架,代码评审与方案评审两套轴线和输出格式,改由 reviewer 技能从两份参考文件里拼进任务文本。

  • 超时与崩溃之后不自动重试 替代 自动用更大的预算把活重跑一遍

    硬超时与 AGY 超时都产出终态并附带恢复元数据——把上一次的超时翻倍、上限 120 分钟、一条可以照抄的续跑命令,外加 requires_user_confirmation——调用方必须先问用户。一次跑了十分钟、确实改过东西、然后撞上上限的实现任务,此前会被报成彻底失败,尽管 agy 已经返回了一个本可以接着用的 conversation id;这也是超时后来变成「待查看的状态」而不是终点的原因。

依据README.md(10,272 字节)、docs/REFERENCE.md(38 KB)——模式与默认值表、两档权限模型、标志表、任务文本规则、jobs 与状态一节、0.1 到 0.4.5 的迁移表、以及 Windows 说明——加上 companion/、templates/、skills/ 与 tests/ 下的文件体积、109 项文件树,以及 issue 与 pull request 1、2、3、5、6、8、9、10、11、13、16、17、19、20、21、22、23、24 的正文。

制作过程

5 个阶段
  1. 01

    一个月,十二个版本,一份真的做完的清单

    仓库建于 2026-08-18,标着「first public release」的 v0.3.0 当天下午就发了;到 2026-09-15 的 v0.7.3 为止一共十二个版本,中间还有一个从未变成 release 的 v0.3.1 标签,而 release notes 只覆盖了其中十一个。这一个月里有 52 次提交——八月 40 次、九月 12 次——版本标题读起来像一份被做完的计划,而不是流水账:personas、implementer continuation、opaque task text、换默认模型、防误报崩溃、流式观察与恢复、带工作区挂载的恢复补丁、用 AGY 做任务编排,最后连着三个版本处理 Windows。最早的一次提交甚至早于仓库的创建日期,正是它把项目开了头:一个把 agy 包成单一大脑、带模式、任务与 setup 的包装脚本。技术栈是 JavaScript,除 Node 标准库外没有运行时依赖,MIT 许可;到九月底是 696 个星、46 个 fork、1 个 watcher 和两个未关的 issue——一个想接入第二种宿主 CLI,一个提议给员工开一个能在会话结束后留下结论的频道。42 条提交带共同作者尾注,其中 40 条写的是 Claude——37 条 Fable 5、3 条 Fable 5.1;提交过的三个账号里,有两个各只贡献了一次。

  2. 02

    两个 agent 之间真正传递的东西

    没有共享内存,没有请求—响应式的 API,也没有守护进程:两个 agent 之间真正传递的是一条 shell 命令、一个文件和一个 id。那些 persona 技能是写给宿主 agent 的说明,由宿主自己拼出并执行 node companion/agy-companion.mjs <mode> --prompt …。伴随脚本只按 shell 交付的原样解析一次 argv,不重新切分、不解释引号、不检查任务文本的任何一个字节,于是一句提到 git diff --check 的任务会逐字节送到 agy,而不会被当成伴随脚本的选项——这正是 v0.4.5 删掉位置参数式任务文本、改为只接受 --prompt、--prompt-file、--stdin 三者之一的原因。后台模式里,伴随脚本先写一份 job spec,再把自己以分离进程的形式起成 _worker <job-id>;这个 worker 拉起 agy 子进程,持续读它的 stream-json 输出,并把事件解析成有上限的进度快照。它还会用 --add-dir <repoRoot> 挂上工作区,而这一点在受限路径上曾经是缺的:修之前,每一次受限运行都以成功状态和一句空回复收场。什么给调用者看、什么是机器细节分得很干净:结果与工作树告警走 stdout,带模式、权限档、模型、耗时、token 数与 conversation id 的遥测行走 stderr 和任务日志。跨轮次的连续性挂在 agy 自己的 conversation id 上,记录在仓库的 .agy-staff/state.json 里,continue 与 restart 之后复用的就是它。

  3. 03

    员工的权限到哪里为止

    每个 persona 都是固定的,不能调:ask 同步且不带工具,另外四个交回一个 job id,没有任何标志能改变执行方式。推理强度同样钉死——ask 低、staffer 与 reviewer 中、researcher 与 implementer 高——所以派活的意思是挑一位同事,而不是调一个模型。职责边界写在 lead 技能里,而这个月最后一次发版正是因为边界写得不够利落:宿主可以一边把查历史派出去、一边继续自己做大量本地调查,于是用户得亲手去拨派活与等待这两件事。v0.7.3 把它换成一条通用默认——先把任务框清楚,把成块的实质工作派出去,等结果,评估,然后再跟进、接手或交付——验收则要求与任务相称的产物和证据,并保留几种例外:小而已经弄明白的活、等待期间可以做的有用工作、以及结果到手后的聚焦验证。员工能做什么由提示词而不是权限决定:四份模板默认拒绝不可逆或昂贵的动作,而同一套提示词会精确打开任务明确授权的那些。上面还压着三道 git 护栏——implement 可以在脏工作区里开工,并拿到一份有上限的、已被改动路径的摘要;research 与 review 则前后各取一次 git status --porcelain——README 用一句话给这一切划了界:这些提示词层面的指令并不提供权限隔离。

  4. 04

    失败是一个待查看的状态,不是一次重试

    运行时里没有任何东西会自己重试:伴随脚本从不自动重试。跑到时间上限的任务会停在一个终态上,并带上恢复所需的元数据——requires_user_confirmation、把上一次超时翻倍且上限 120 分钟的 suggested_timeout、以及一条可以照抄的续跑命令——调用它的 agent 必须先问用户是继续还是停下。硬超时与 AGY 报出的超时被分成 reason=hard_timeout 和 reason=response_timeout 两种;只要还有已知的 conversation,两者都会变成 attention 与退出码 5,没有的话任务就停在 error。恢复是一次显式的新任务,与旧任务关联;而当要续的任务还在跑时,continue 会直接拒绝——后续不会被排队,调用方得先等或先取消。中间产物遵循同样的直觉:无告警地成功之后,原始事件流与快照会被删掉;失败、取消与硬超时则把它们留着,于是半成品可以先被查看,再决定要不要续。同一种直觉还修掉了一个从未成立过的崩溃报告:在一个沙箱环境里启动、在另一个里收取的任务,因为读它的地方看不见 worker 的 PID 而被判成崩溃;如今被误判的任务从启动它的那个环境去看时会自愈回运行中。

  5. 05

    Windows 的两周,和一份被完整保留的贡献

    这个仓库此前从没在 Windows 上跑过:代码里没有任何 windowsHide,也没有任何 win32 分支,持续集成只跑 Ubuntu。有用户先尝到了后果:派一个后台任务会不停弹出控制台窗口,cancel 和关掉终端都停不下来,直到从任务管理器里杀掉那棵 node.exe。修法由一位贡献者从状态锁开始,因为在 Windows 上拿到的是 EPERM 与 EBUSY;维护者把它补完,等同一批工作又长出一个 pull request 时,他把自己那些提交推到了贡献者的分支上,好让原作者留住这个 pull request。持续集成被拆成三个作业,Windows 测试放在人工批准闸门后面,因为一次 Windows 跑很慢。最好的那个 bug 出现在最后:在 Windows 上,分离出去的 worker 会把已经退出的派发者的 PID 留作自己的父进程,而 Windows 很快复用 PID,一旦被复用,一个毫不相干的孤儿看上去就像子进程并被杀掉,只留下一个没有状态文件、日志正好 178 字节的消失任务,而任何内部错误路径都产不出这种结果。修法是只在子进程创建时间晚于父进程时才跟随这条父子链接,并让领头那个用 taskkill /PID <pid> /F,而不是 /T。参考文档至今仍把 Windows 支持称作尽力而为,并注明它还没有拿真实的 Windows agy 安装验证过。

相关档案

全部档案 →