前两周的列表还是单数的。 一个 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 个配置文件里被搬到一个端口上
每个 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 上,判不出来就放行
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 的搜索不是准不准,是花多少上下文
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
上期 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 projectspdfcraft-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"复数设计
同一周还进了三个 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,一次装齐?