bigarrow 实测:让 AI 编程 Agent 在你屏幕上画一支大箭头,「该你点了」不用再猜

用 Claude Code 或 Codex 干活的人大概率遇到过这个场景:Agent 改完代码、跑完测试,然后在终端里打出一行”请在弹窗中点击允许”——而你根本没在看那个终端。等你十分钟切回来,会话早就超时了。10 月 8 日上线的一个开源小工具把这件事解决得非常直白:让 Agent 直接在你屏幕上画一支大箭头,指着那个该你点的按钮。

它叫 bigarrow(仓库名 big-arrow-on-the-screen),10 月 9 日冲上 Hacker News 首页时拿到了 377 分和 165 条评论。我在 M4 MacBook(macOS 26.5.2)上把 0.4.5 版本完整装了一遍:坐标定位、真实绘制、PNG 渲染、生命周期管理、Claude Code 技能安装、错误码矩阵,全部实测通过,过程中踩到三个坑也一次说清。

GitHub 仓库只有 458 个星(截至 10 月 10 日早上),但它两天从 0 到 HN 首页的速度说明痛点是真的。先看官方 README 里那句定位语:

你的 Agent 能重构一个 monorepo、写数据库迁移、给你讲明白单子,但当它需要你点一个按钮时,只能往你根本没看的终端里打印”请点击弹窗中的 Allow”。bigarrow 给了它一根手指。

它是什么,更重要的是它不是什么

bigarrow 是一个纯 Swift 编写的 macOS 命令行工具,外加一份给 Claude Code 和 Codex 用的技能文件。核心能力就一件事:在所有窗口之上画一支大箭头加一块标语牌,指着你指定的位置。

有三条设计边界值得单独说,因为它们决定了这工具敢不敢用:

只指,不点。 它永远不会点击、打字或截屏。遇到 2FA 验证码、支付确认、法律条款勾选这类”Agent 不该替你做”的操作,它指给你看,决定权在你。仓库描述里特意写了一句”我们查了两遍,里面没有 AI”。

点击穿透,不抢焦点。 箭头浮在屏幕最上层(屏幕保护程序层级),但键盘焦点纹丝不动。官方博客说这是全项目最难修的一个 bug:macOS 的应用循环会在没有终端的进程里悄悄激活自己,他们最后绕开 NSApplication.run() 自己泵事件才解决,测试里专门断言”最前台应用永远不变”。箭头头部和目标区域以外的点击会直接穿透到下面的应用,点箭头本身则把它关掉。

自己打扫自己。 每支箭头都有寿命:point 默认 8 秒,start 默认 300 秒,画它的 Agent 进程退出时跟着消失,或者你点一下、跑一条 bigarrow stop。不存在”Agent 忘了清理留下一屏幕箭头”的问题。

绘制动作本身不需要任何 macOS 权限。需要权限的是”找到目标”这个环节,而且权限是授给运行它的宿主应用(终端、VS Code、Claude Code),不是授给 bigarrow 自己——这个设计细节后面实测部分会展开。

安装实测:brew 会让你装 Xcode,直接下 Release 包

按 README 的首选方式走 Homebrew:

Bash
brew install franzenzenhofer/tap/bigarrow

结果直接报错:A full installation of Xcode.app 16.0 is required to compile this software。这个 brew 公式是源码构建,机器上只装了 Command Line Tools 的话过不去。我的机器正好没有完整版 Xcode,于是换了第二条路——GitHub Releases 提供预编译的 universal 二进制,v0.4.5 的包只有 1.75MB:

Bash
curl -L -o bigarrow.tar.gz \
  "https://github.com/franzenzenhofer/big-arrow-on-the-screen/releases/download/v0.4.5/bigarrow-v0.4.5-macos-universal.tar.gz"

# 校验官方 sha256(发布页同名 .sha256 文件)
shasum -a 256 bigarrow.tar.gz
# 186d03005176bb6981c087992152cf63db043ccedc5583bc4314a471704d7543,与官方一致

tar -xzf bigarrow.tar.gz
# 注意:解压出来是 bigarrow-v0.4.5/ 目录,二进制在里面,不在包根
sudo cp bigarrow-v0.4.5/bigarrow /usr/local/bin/

这里有安装环节的第一个小坑:tar 包解压出来是一个带版本号的目录,bigarrow 二进制、README、LICENSE 和技能文件都在目录里面。习惯性 cp bigarrow /usr/local/bin/ 会直接报文件不存在。

装完跑 bigarrow --version 确认 0.4.5,然后先跑一次体检:

Bash
bigarrow doctor

我机器上的真实输出:

Bash
bigarrow 0.4.5 on macOS 26.5.2
drawing:          no permission needed
accessibility:    missing (for --element, --until-click)
screen recording: missing (for --window App:title)
permissions belong to: WorkBuddy (com.tencent.workbuddy.mac)
peekaboo:         not on PATH (optional)
displays (global top-left points, separate Spaces: no):
  1: origin 0,0  1920x1080 @1x  id 48

最值得留意的是 permissions belong to 这一行:权限归属检查的不是 bigarrow,而是启动它的宿主应用。我在 WorkBuddy 的工具终端里跑,它就检查 WorkBuddy 的权限;你从 Terminal 跑,就是 Terminal;从 VS Code 集成终端跑,就是 VS Code。这就是 README 表格里”macOS 把权限授给启动 bigarrow 的应用”的具体含义。doctor 还会列出显示器信息,坐标体系是全局左上原点的逻辑点(跟辅助功能 API 和 Peekaboo 报告的一致),多显示器和 Retina 缩放都不用你换算。

三种定位方式与退出码矩阵

Agent 为什么要用它?因为 bigarrow 的每个命令都支持 --json 输出和有意义的退出码:0 成功、2 输入错误、3 目标解析不了、4 权限缺失。Agent 拿到结构化的失败原因就能自己决定下一步。我把这四类全部实测了一遍。

坐标定位(零权限)先来一次不真画的 --dry-run,让 Agent 在动手前确认布局:

Bash
bigarrow point --at 760,500 --text "测试坐标" --dry-run --json

返回的 JSON 里 target.source 是 coordinate,sign 数组给出了标语牌的落点和尺寸([388.5, 715.9, 227, 84]),dryRun: true 确认什么都没画。去掉 --dry-run 换成 --duration 3 真画一支,返回里多出两个有信息量的字段:dismissedAfter: 3.39、dismissedReason: "timeout"——屏幕上确实出现了一支带中文标语的箭头,3.4 秒后自动消失,中文渲染没有任何问题。

按元素定位是它区别于”截图标箭头”工具的核心能力,走的是 macOS 辅助功能 API。但我故意在权限缺失的状态下测了这条路径,两次失败的返回都很有教学价值:

Bash
# 目标应用没开
bigarrow point --element "Allow" --app "System Settings" --json
# {"code":3,"error":"no running app matches 'System Settings'; apps with windows: Google Chrome"}
# 退出码 3,还顺带告诉你现在有窗口的应用只有哪些

# 应用开着,但宿主没有辅助功能权限
bigarrow elements --app "Google Chrome" --json
# {"code":4,"error":"Listing UI elements needs Accessibility permission for
#  WorkBuddy (com.tencent.workbuddy.mac), not for bigarrow: turn it on in
#  System Settings > Privacy & Security > Accessibility, then restart that app."}

退出码 4 的报错把三件事一次说清:缺什么权限、授给哪个应用、去系统设置的哪个面板开。这种报错质量在命令行工具里相当罕见,Agent 拿到这段 JSON 甚至不需要人类解释就能引导你完成授权。还有个细节:--app "System Settings" 这种带窗口标题的定位在 macOS 26 上还需要录屏权限(系统开始隐藏窗口标题了),普通 --app 应用名 则不用。

错误输入的退出码 2 同样实测过:--at "abc" 返回 'abc' is not 2 comma-separated numbers, example: 760,500——错误信息里直接给了正确格式示例。

PNG 渲染:不碰屏幕就能验证效果

--png 是个很聪明的设计:把箭头直接渲染成透明背景 PNG 文件,不上屏。这让无头环境(CI、脚本、远程 Agent)也能产出”指引图”贴进文档,也让我能在文章里给你看真实渲染结果:

Bash
bigarrow point --at 700,400 --text "PNG 渲染测试" --png /tmp/bigarrow_demo.png --json

渲染出来的 PNG 我逐张验证过:红色弯箭头从标语牌指向目标点,中文文字清晰无乱码;--style ring --shape zigzag 出来的是橙色锯齿描边圈,--style box --shape spiral 是青色方框外加一圈螺旋线——四种形状(bend/straight/zigzag/spiral)、三种样式(arrow/ring/box)、S/M/L 三档尺寸、十种颜色加十六进制自定义,排列组合全在参数里。

一个细节要提醒:标语里 {{482913}} 这种双花括号语法在屏幕上会渲染成一键复制按钮(点一下就把值粘进目标输入框,官方演示用它来传 2FA 验证码),但 --png 导出的图里它就是字面文本——静态图渲染不包含交互组件,做文档插图时别指望读者能点。

start/stop 与技能安装

需要长时间停留的指引用 start + stop:

Bash
bigarrow start --at 800,300 --text "start 生命周期" --json
# {"detached":true,"ok":true,"pid":43025,...}
bigarrow stop --json
# {"cleared":[43025],"ok":true}
bigarrow stop --json
# {"cleared":[],"ok":true}

start 立即返回并在后台驻留(detached: true),stop 返回它清掉了哪些 pid,再 stop 一次返回空数组——幂等,重复调用不报错。官方 README 还给了一套自动清理方案:把 bigarrow stop --hook 挂成 Claude Code 的 UserPromptSubmit 钩子,你一开口回复,上一轮的箭头就自动消失。

最后一步,把技能装给编程 Agent:

Bash
bigarrow install-skill

这里踩到第三个坑:我用的是从 Release 包手动拷贝的二进制,install-skill 报 cannot find the shipped skill folder near /usr/local/bin/bigarrow; pass --source——它默认去可执行文件旁边找技能目录,而我把二进制单独拷出来了。解法是把 --source 指到包里的技能目录(注意要指到 big-arrow 这一层,指到上一级会报 no SKILL.md):

Bash
bigarrow install-skill --source bigarrow-v0.4.5/share/bigarrow/skill/big-arrow
# Claude Code skill installed at ~/.claude/skills/big-arrow
# Codex skill installed at ~/.agents/skills/big-arrow

装出来的 SKILL.md 只有 63 行(外加 50 行参考文档),但规则写得相当克制:”标语必须是一个完整的句子,写明动作和后果”(”Franz, click Pay: 49 EUR to Hetzner”,而不是光写”点这里”)、”标语牌被点掉说明人看到了,检查结果别重画”、时间敏感场景加 --color red --say 语音播报。frontmatter 里 allowed-tools: Bash(bigarrow:*) 把技能权限收得很紧。命令行里如果用 brew 正常安装,install-skill 不需要 --source,上面这两个坑都只在手动拷贝二进制时出现。

什么场景值得装

写到这里可以给个准确定位:这是给”人机协作循环”补最后一块拼图的工具。之前写过的 Claude Code Mods 管的是改写 Agent 的行为规则,REA 给它装逆向工程的手,Agent Reach 给它装联网的眼睛,Mellum2.1 提供跑在本地的干活大脑,而 bigarrow 解决的是最朴素的问题——当循环走到”只有人类能做的那一步”时,怎么把你准时叫回来、并且不用猜该点哪里。

最适合它的三个场景:一是权限授权和 2FA 这类人工步骤,Agent 开好系统设置面板、把箭头钉在那个开关上,你只需动手;二是多窗口多标签的定位(--window "Google Chrome:Pull request" 能先把那个窗口和标签切到前台再指);三是远程指导和演示录屏——--png 出图直接进文档,--say 语音喊人(这个功能我没实测,不想在工作时间让电脑突然说话,但实现就是调 macOS 自带的 say 命令)。

边界也要说清:它的 --element 能力依赖应用的辅助功能暴露,原生 App 和 Electron 应用没问题,Chrome 网页内元素要给浏览器加 --force-renderer-accessibility 启动参数才行(README 标注 2026 年 10 月验证过,我没有实际测网页内定位);另外项目发布刚两天,458 个星属于非常早期的阶段,API 未来有变动可能,介意的话可以把版本号钉在 0.4.5。

工具很小,但值得装:一条 curl 命令、一个 6MB 二进制、零权限即可绘制、MIT 协议。下次你的 Agent 再在终端里喊”请点击允许”的时候,让它把箭头画到你眼前。

(HN 上那条 377 分的讨论里,作者 Franz Enzenhofer 本人在评论区逐条回复实现细节,好奇点击穿透和焦点保持是怎么做的可以直接去翻。)

推荐阅读

  • JetBrains 开源 Mellum2.1 实测:SWE-bench 从 2 分涨到 47 分的 12B 编程 Agent 模型,M4 上 7.5GB 就能跑

    JetBrains 10 月 8 日开源的 Mellum2.1 是 12B 总参、每 token 只激活 2.5B 的编程 Agent 模型,SWE-bench Verified 从 2.0 涨到 4…

  • EmbeddingGemma 2 上手指南:740M 参数把文字、图片、音频压进同一个向量空间,M4 本机实测

    Google 刚开源的 EmbeddingGemma 2 是一个 740M 参数的多模态嵌入模型,能把文本、代码、图片、视频、音频统一映射到同一个 768 维向量空间。本文在 M4 Mac 上实测:从…

  • REA 冲上 Trending 第一当天实测:给 AI 编程工具装上逆向工程之手,Mac 上的 4 个坑我先踩了

    REA 是发布首日就冲上 GitHub Trending 榜首的开源项目:用 MCP 把 Ghidra、Hopper 等逆向工具接给 Claude Code、Cursor 这类编程 Agent,让 A…

  • Agent Reach 实测:一条命令给 AI Agent 装上联网能力,B站搜索免 Key 跑通

    AI Agent 写代码很利索,联网取资料就抓瞎:Twitter API 收费、Reddit 403、B站风控、小红书登录墙。GitHub 9.2 万星的 Agent Reach 把十几个平台的接入选…