用 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:
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:
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,然后先跑一次体检:
bigarrow doctor我机器上的真实输出:
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 在动手前确认布局:
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。但我故意在权限缺失的状态下测了这条路径,两次失败的返回都很有教学价值:
# 目标应用没开
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)也能产出”指引图”贴进文档,也让我能在文章里给你看真实渲染结果:
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:
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:
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):
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 本人在评论区逐条回复实现细节,好奇点击穿透和焦点保持是怎么做的可以直接去翻。)