🍺 Homebrew 更新周报 # 20261027 | 这一周,工具开始假设 agent 不止一个

前两周的列表还是单数的。 一个 agent、一个终端、一个会话、一个套件——0930 给它上锁,1010 让它的东西流动,1017 把它的协议两端补齐。

这周的列表突然全是复数。 every agent's model、discover agents across endpoints、running coding agents in parallel、connecting and coordinating AI agents。翻完二十个 formula 和二十五个 cask,我没找到一件是"给一个 agent 用的"。

不是一个模型切换器,
是一个叫 magpie 的本地网关——跑在 127.0.0.1:3425,让 Claude Code、Codex、Gemini CLI 各自用别家的模型,还能把你在订阅里的登录变成所有 agent 的 provider;
不是一个权限扫描器,
是一个叫 kontext 的运行时策略——装在 agent 的 hook 上而不是进程外面,动作执行前判一次,把判断和结果记进账本,而且判不出来就放行;
不是一个更好的 grep,
是一个叫 zvec-grep 的检索层——ripgrep、BM25、向量三合一,卖点是"更少的工具调用、更少的 token";
不是又一批编辑器,
是 ArtCraft 把 filmcraft 和 pdfcraft 的 CLI 送进 core,描述第一次写成"CLI and MCP server"——同一个引擎,人一个入口,agent 一个入口。


本周一句话总结

这一周的关键变化不是 agent 工具变多了,是工具的默认假设换了:从"你有一个 agent"变成"你有一堆 agent"。具体表现是三样东西第一次被从 agent 内部搬出来单独发货——模型(magpie)、身份与策略(kontext)、工作区索引(zvec-grep)。搬出来之后,它们都成了可以单独替换、单独审计、单独出问题的层。


本周新增工具速览

🧪 New Formulae

名称 中文说明
filmcraft-cli FilmCraft 的 headless CLI + MCP server,编辑/渲染/导出视频工程(0.13.0)
pdfcraft-cli PdfCraft 的 headless CLI + MCP server,创建/编辑/检查/填写 PDF(0.14.0)
kontext AI agent 的身份、凭据与治理:发现 agent、映射权限、动作前策略 + 审计账本
zvec-grep 给人和 agent 的本地混合检索:ripgrep + BM25 + 向量,索引存在 .zvec-grep/
gitea-cli Gitea 官方命令行
gitea-importer 把 GitHub / GitLab / Gitea 的仓库迁移进 Gitea
ascelerate App Store Connect API 的命令行
buildkite Buildkite 的命令行客户端
dep-scan OWASP 出品的依赖与容器镜像安全/风险审计
openssh-sk-provider 给系统 OpenSSH 用的独立 FIDO2 安全密钥 provider(sk-libfido2)
erpc 容错 RPC 代理,带 re-org 感知的永久缓存(区块链 RPC)
xfr 带 TUI 的网络带宽测试
worldmonitor World Monitor 全球情报 API 的 CLI
tpcgen-cli 快速生成 TPC-H / TPC-DS 测试数据(DataFusion 生态)
ng-log C++ 应用级日志库
bqlog 腾讯的跨语言日志库
icu4c@79 ICU 79 的版本化 formula(keg-only)
cellpose 细胞与细胞核分割的通用算法
slivar 用表达式过滤、注释基因变异(trio / cohort)
annotsv 结构变异(SV)的注释与排序

注: GitHub API 把 spidermonkey 153.5.1 标成了 new formula,但它其实是从 140.17.0 跳上来的版本更新。按提交历史核对后没算进新增。


🧩 New Casks

名称 中文说明
magpie 给 AI coding agent 的本地模型网关(菜单栏 + CLI + TUI)
kero 为 agent 优化的终端:会话跑在 kerod 里,且自带一个 agent 可驱动的 CLI
diri 并行跑 coding agent 的终端工作区(一个 agent 能再开若干子 agent + worktree)
tutti 多人、多 agent 的实时协作空间
pen agentic 设计画布
airbuild 让 AI agent 构建 iOS 应用并处理 App Store 审核
tamery AI 驱动的数据库客户端(从 conar 改名)
keyboop 键盘布局切换 + 本地语音听写
peel 卸载器与磁盘空间清理
wblock Safari 广告拦截
clamshell 合盖保持运行,同时关掉内建屏幕
hotkeyclash 快捷键冲突检测
zeal 离线文档浏览器
writer 本地优先的 Markdown 编辑器
sound-studio 录音与音频编辑
sprites Fly.io Sprites 的命令行
opendisplay-receiver 把一台电脑变成 OpenDisplay 的第二块屏
prusaslicer@preview PrusaSlicer 3.0 预览版(alpha12)
omniwm@canary OmniWM 平铺窗口管理器的 canary 通道
font-mengshen-regular 萌神拼音字体
font-nordwand-mono Nordwand Mono 字体
textus * WYSIWYG Markdown 编辑器,内置 AI 写作(上期已列)
status-trio * 把 Wi-Fi / 电池 / 音量合成一个菜单栏图标(上期已列)
rew * REW 房间声学测量(上期已列)
artcraft-launcher * ArtCraft 套件的安装与更新器(上期已列)

* 这四个在上一期表格里已经出现过,但 GitHub 上的合并时间是 10 月 18–19 日——上期的窗口比标题日期多划了两天。这期剔出正文,只留表里记账。

另外本期还有两个 add Google Fonts 的批量 PR,一次带入多套字体 cask,未逐项列出。


值得留意的几个方向

magpie:模型从 30 个配置文件里被搬到一个端口上

magpie 的模型选择器:左边是 Claude Code 和 Codex,右边是 DeepSeek、Kimi、GLM、Qwen 的模型列表

每个 agent 都在自己的文件里存模型:自己的格式、自己的 key、自己的 base URL。你在 Claude Pro 上付的钱,只在 Claude Code 里有效;在一个 agent 里换模型,等于去改它的配置文件,再记住你改过什么。

magpie 把这件事挪到一个本地端口上:127.0.0.1:3425。它同时说 OpenAI Chat、OpenAI Responses、Anthropic Messages、Gemini 四套方言,并在中间互相翻译——流式、tool calls、reasoning 都翻。想接一个没被官方支持的客户端,不用等适配:把它的 base URL 指过来就行。

菜单栏里是一个列表:左边是装在这台机器上的 agent,右边是可以选的模型,写成 provider/model。选完它不是覆盖整个配置文件,而是原子地改掉那一个值——注释、顺序、格式都留着;切回原生模型,原样还给你。Profiles 把几十个 agent 的配置存成一个名字("Budget"、"Focus"),一键换一整组。

三个细节让我停下来:

  • Claude 那一栏它不是伪造 API,是驱动本机真正的 claude 二进制,再用 MCP 把你 agent 的工具桥过去。
  • 掩码的占位符对同一个值是稳定的({{API_KEY_k3v9x2mq}}),所以 prompt cache 和 thinking signature 不会被打断;掩码失败时请求直接扣住不发(503)。
  • 路由组里的 smart 策略,挑"额度没用完、且最早到重置时间"的那个订阅,把重置前的浪费降到最低。

最后一条说明了 magpie 真正的产品判断:它假设你有多个订阅、多个账号、多个额度周期。这不是模型选择器,是模型层的调度器。

至于把 Claude Pro / ChatGPT 的登录当 provider 借给别的 agent 用——这件事在不在各家的 ToS 里,得自己判断。magpie 留了开关:Settings → Privacy → Subscription accounts,或者 MAGPIE_NO_ACCOUNTS=1 临时关掉。


kontext:策略装在 hook 上,判不出来就放行

Kontext 的 banner:AI Agent Runtime Security,Discovery / Policy enforcement / Auditability

0930 的 hol-guard 把 agent 的 syscall 当防火墙来管:套在进程外面,看它要动什么。kontext 选了另一层——agent 自己的 hook。它不包进程,装完 kontext setup 之后你照常用 Claude Code 或 Codex,不用换启动方式。

它做四件事:发现这台机器上有哪些 agent、把每个 agent 能碰到的东西列成权限图、在动作执行前按本地策略判一次、把判断和结果写进一个 authorization ledger(agent、session、action、决策、结果)。

agent 想执行一个动作
        │
        ▼
  pre-action hook ──► 本地策略
        │                 │
        │      ┌──────────┴───────────┐
        │      ▼                      ▼
        │   完成的 deny            没有结论
        │      │             (报错/策略缺失/过期/
        │      │              身份不明/daemon 挂了)
        │      ▼                      ▼
        └─►  拦截                 放行 + 记为 failure

这张图里最值得看的是右边那条:策略报错、策略缺失/损坏/过期、身份不明确、daemon 挂了或太慢——全都放行,并且在活动记录里记成一次 failure。README 写得很直白:只有"已完成的 deny"和"必需的审批拿不到"才真的拦。

这是一个明确的取舍。安全产品通常把"不确定"当"拒绝";kontext 把"不确定"当"这次不管,但留证据"。理由是它站在 agent 的同步 hook 上,daemon 一抖动就阻塞,你所有 agent 会一起卡死。它选了可用性,把风险转成可审计性。

代价写在同一页:策略由组织在云端 dashboard 下发,本机只留 runtime 和 keychain 里的 install token。本地决策、组织分发——对个人用户是重量级,对公司是刚需。


zvec-grep:agent 的搜索不是准不准,是花多少上下文

zvec-grep 的演示:装 agent 集成、索引一个工作区、让 agent 直接搜

zg 把三件事收到一个接口后面:ripgrep 的字面/正则、BM25 的关键词排序、向量的语义召回。索引存在项目根的 .zvec-grep/ 里,默认本地,连 embedding 都可以用本地模型(potion-retrieval-32m)。背后是阿里的 zvec,TypeScript 实现进了 Homebrew,Rust 实现在仓库里单独目录并行开发。

README 的卖点不是"更准",是这一句:更少的工具调用、更少的 token、更少的噪音。结果带来源位置、按相关度排序,agent 拿到证据就能停,不用 grep 一遍再 read 十个文件。

这句话把检索从"功能"变成了"预算"。当 agent 的成本主要是上下文,搜索的第一指标就不再是召回率,而是"要几次调用才能收工"。这也解释了为什么它同时提供 MCP 集成——它默认调用方是 agent,不是人。

我的保留也在这里:索引是工作区的第二份副本(.zvec-grep/),会过期、会占空间、会在 git status 里出现。装之前我会先确认它有没有 clean 和忽略规则这一层。


filmcraft-cli 与 pdfcraft-cli:同一个引擎,描述里第一次写了 MCP

FilmCraft 的编辑器界面:时间线、色彩、关键帧,CLI 读写的是同一份工程文件

上期 photocraft-cli 的描述是 Headless PhotoCraft **engine** to convert, inspect and batch-edit images——一个引擎。这期两个新 CLI 的描述变了:

  • filmcraft-cli:Headless FilmCraft CLI and MCP server to edit, render and export video projects
  • pdfcraft-cli:Headless PdfCraft CLI and MCP server to create, edit, inspect and fill PDFs

差的不是措辞,是入口数量。FilmCraft 的 GUI 是一个完整的非编:工程、时间线、色彩、关键帧、导出;CLI 读同一份工程文件,做批量渲染和导出;现在再加上 MCP,agent 可以直接开工程、改时间线、导一条片子出来。

ArtCraft 现在的版图是:13 个 GUI 应用 + 3 个 headless CLI(photocraft / filmcraft / pdfcraft)+ 1 个 launcher,共享一套 Rust 引擎和一套工程格式。创作者用 GUI,脚本用 CLI,agent 用 MCP——同一份工程,三种操作者。

这件事的分量在"同时发货"四个字。大多数桌面软件把 agent 接口做成事后插件或云端 API;ArtCraft 是 GUI 和 CLI/MCP 一起进包管理器。上期我们说"套件自己站出来介绍自己了",这期它把介绍词改成了给 agent 听的那一版。


三个终端,都按"agents"复数设计

diri:左边项目、中间 agent 会话、右边 changes,截图里一行是 diri - spawn_agents (3 agents) tutti:multi-user, multi-agent real-time collaboration space

同一周还进了三个 GUI,简介都带 agents:

  • kero — "Terminal app optimised for agents"。会话跑在 kerod 这个 daemon 里,关窗不结束;每个 pane 有 working / waiting / idle / error / exited 状态,⌘J 跳到需要你的那个;渲染底层是 libghostty。最扎人的一句在 README 里:"A CLI agents can drive"——kero new、split、type、wait、read screen,终端给自己开了一个给 agent 用的接口。
  • diri — "Terminal workspace for running coding agents in parallel"。一个 agent 会再开三个带 worktree 的子 agent,左边项目、中间会话、右边 changes。
  • tutti — "multi-user, multi-agent real-time collaboration space"。多人 + 多 agent 在同一个空间里,还有一个 Agent Board。

三家的答法不同:kero 把终端本身变成 agent 的操作对象,diri 把并行做成树,tutti 把人放回同一个房间。但前提是同一个:默认你手上不止一个 agent。

这是连续第四周出现"agent 的终端/工作区"。前几周我把它们当同一条线看,这周不太一样了——0930 的 ccmux 是给多个 agent 一个调度器,1010 的 nodeterm 是给多个会话一张画布,而这一周的三家开始争论并行的形状:平铺、树、还是房间。同一层上出现互相不兼容的形状,通常说明这一层还没定。


一点个人感受

  • 我不会装 airbuild。 它的简介是"AI agents that build iOS apps and handle App Store review"——省掉的不是编译,是证书、描述文件、审核回复那一整套账号权限。让 agent 拿到这些,等于把开发者账号的信任边界交出去。有意思的是它和 kontext 同一周上架:一个把 agent 的手伸进 App Store,一个给 agent 的手装策略。Homebrew 现在同时卖油门和刹车。
  • spidermonkey 被 GitHub API 标成了 new formula,其实它是从 140.17.0 跳到 153.5.1。 上期的教训是"brew update 的输出要交叉验证",这周要再进一步:API 的 label 也是二手信息,提交历史才是一手。我核了 commit 才没把它写进新增表。
  • 上期表格里的四个 cask 其实是本期才合并的(10 月 18–19 日)。这说明窗口边界比标题日期宽。我不想把它写成"更正"——它更像一个提醒:周报的"这一周"从来不是一个干净的七天,你只能把边界说清楚,不能假装它不存在。

结语

上期结尾我留了一个问题:MCP 两端都在 Homebrew 了,谁来定义 agent 跨机器的"会话可移植"?

这一周没有答案。但出现了三个前置条件:

magpie 把模型从 agent 的配置文件里抽出来,放上 127.0.0.1:3425;
kontext 把身份和策略从 agent 内部抽出来,挂在它的 hook 上;
zvec-grep 把工作区的索引抽出来,放进 .zvec-grep/。

当这三样都不在 agent 里面,"会话"才第一次成为一个可以搬的东西——因为搬家要搬的本来就不是进程,是它依赖的模型、身份和记忆。

所以下期的钩子不是"会话会不会可移植",而是:这三层现在各是一个单体——magpie 只管模型,kontext 只管策略,zg 只管索引。下一个上架的,会不会是一个把它们串起来的 control plane?或者更可能的——Homebrew 出现第一个 umbrella formula,brew install agent-runtime,一次装齐?