プログラミング
AIエージェントが画面に大きな矢印、ボックス、テキストを描画できるようにする
Let your AI agents paint big arrows, boxes and text on your screen (github.com)
要約
AIエージェントがユーザーに操作を促す際に、画面上に矢印やテキストで指示を表示できるmacOS用CLIツール「bigarrow」を紹介。これは、AIが人間による操作(許可、クリックなど)を必要とする場面で、ユーザーに分かりやすく注意を促すためのツールであり、フォーカスを奪わず、透過性があり、様々なカスタマイズが可能。
全文翻訳
AIエージェントが画面に大きな矢印、ボックス、テキストを描画できるようにする
big-arrow-on-the-screen (bigarrow): 小さなmacOS CLIとエージェントスキル。クリック透過、フォーカスを奪わず、自動で消えます。MITライセンス。
あなたのAIエージェントは、モノレポのリファクタリング、マイグレーションの記述、モナドの説明などができますが、ボタンを1つクリックする必要がある場合、見ていないターミナルに「ダイアログで許可をクリックしてください」と表示します。bigarrowはそれに指を与えます。
bigarrow point --element "Allow" --app "System Settings" --text "Franz, click Allow"
大きくてフレンドリーな矢印が、サイン付きで、あらゆるものの最上に現れ、対象を指し示し、そして再び消えます。クリック透過で、フォーカスを奪わず、全てのディスプレイとスペースで動作し、描画のために一切の許可を必要としません。これは小さなSwiftバイナリです。デーモン、メニューバーアイコン、アカウント、テレメトリ、そして、二度確認しましたが、AIは一切含まれていません。これは矢印です。
これは実際には何のためか?良い質問です。矢印は何千年もの間存在してきました。変わったのは何か?ソフトウェアエージェントが今やMac上で実際の作業を行い、そして同じ壁にぶつかり続けていることです。それは人間だけができる部分です。「許可をクリックしてください」。macOSのパーミッションプロンプト、OAuthの同意画面、「~で開く?」ダイアログ。エージェントはボタンを見つけることができますが、あなたのためにそれを押すことはできませんし、できません。今や、それを指し示すことができます。「あなたの番です」。2FAコード、CAPTCHA、パスキー、支払い確認、署名、法的チェックボックス。エージェントが自分でクリックすべきではないもの。それは指し示し、あなたは決定し、それは続行します。
「こっちのウィンドウだよ、あっちじゃない」
Chromeのウィンドウが14個あります。エージェントはそれがどれを意味するかを知っています: --window "Google Chrome:Pull request」。タブさえも選びます: --app "Google Chrome:Pull request」。
「君が必要なんだ、そして君はコーヒーを作っている」
--sayはサインを読み上げます。あなたのMacは文字通りあなたをデスクに戻るように呼びかけます。
ガイド付きセットアップとオンボーディング。
人間をステップバイステップで設定ペインを通して案内します:開始、彼らが操作するまで待機、停止、次のステップ。製品ツアーのように、製品なしで。
リモートヘルプ。
「いや、別の歯車アイコンだよ」。説明する代わりに、それを指し示します。
デモ、スクリーンキャスト、ドキュメント。
録画中に重要なものをハイライトするか、ドキュメントのために--pngで直接PNGにレンダリングします。
デバッグ座標。
アクセシビリティ、スクリーンショット、またはPeekabooの座標が正しいか確信が持てませんか?それらを指し示し、確認してください。--dry-run --jsonは、描画せずにどこを指し示すかを示します。
誰もが経験した状況
中立的なデモダイアログでステージングされ、クリーンなCIランナーで実際のbigarrowで録画されました(BACKDROP_ARGS=--cover scripts/funny-scenes.sh)。ダイアログは偽物です。感情は本物です。
--color green --shape zigzag --color orange --color purple --close-button、なぜなら人間が最後に言葉を発するからです
3つの星、1つのボタン、曖昧さゼロ
--style box --corners sharp、そしてmacOSのパーミッションに関するレッスン
--shape spiral: サインの周りを一周してから、ボタンへ
これは何ではないか:人間向けの画面注釈ツール、クリックボット、またはスクリーンショットツール。決してクリック、タイプ、または何もキャプチャしません。ただ指し示すだけです。意図的に。
インストール
brew install franzenzenhofer/tap/bigarrow
bigarrow install-skill # Claude Code (~/.claude/skills) と Codex (~/.agents/skills) を教える
ソースから: swift build -c release (Xcode 16以降、macOS 14以降)、バイナリは.build/release/bigarrowにあります。
エージェントが必要とする3つのコマンド
bigarrow point --element "Allow" --app "System Settings" --text "Franz, click Allow" # ラベルで
bigarrow point --at 760,500 --text "Franz, click HERE" # 座標で
bigarrow start --window "Safari:Inbox" --text "This window" && bigarrow stop # 停止するまで
全ての矢印は自分で終了します。忘れたエージェントの後始末をする必要はありません:
時間制限
bigarrow point ... --duration 10 (デフォルト8秒; 開始300秒; --duration 0 = 無制限)
開始と停止
bigarrow start ... はすぐに返ります; bigarrow stop (または stop --all) はそれを削除します
エージェントは矢印を描画したエージェントプロセスが終了すると消えます (CLAUDE_PID、またはBIGARROW_OWNER_PID)
人間が応答する
bigarrow stop --hook は Claude Code UserPromptSubmit フックとして、そのセッションの矢印をクリアします
人間がそれを閉じる
--close-buttonはサインの右端にクリック可能なXを付けます(オプトイン)
ターゲット:
--at X,Y, --rect X,Y,W,H, --mouse, --window App[:title], --element Label --app App, --peekaboo ID --snapshot see.json (Peekabooの see --json から)。座標はグローバルな左上論理点、スペース、アクセシビリティ、CGWindowList、Peekabooが報告するものです。
--display N は --at と --rect を1つのディスプレイに相対的にします。
矢印はそれが指し示すアプリに紐づいています。
--app App[:window or tab title] (または --window) は、そのアプリ、ウィンドウ、またはChrome/Safariタブを最初に前面に表示します。なぜなら、ターミナルの後ろに隠れているウィンドウを指し示すのは非常に不便だからです。そして、別のアプリがターゲットを覆っている間、矢印は隠れ、それと一緒に戻ってきます。
--no-raise はあなたのウィンドウをそのままにします。
bigarrow elements --app X は --element がマッチできるものをリストします。
bigarrow doctor はパーミッション、それらの所有者、およびあなたのディスプレイを表示します。
全てのコマンドは --json を取ります。
終了コード: 0 OK、2 不正な入力、3 ターゲットが見つかりません、4 パーミッション不足。
エージェントは終了コードを愛しています。人間はそれを許容します。
見た目
それは矢印なので、見た目に不合理な時間を費やしました。クリーンなテストマシンでの実際のスクリーンショット、白、macOSグレー、ダーク、ブラック、レッド、そして賑やかなウェブページでの6つの見た目:
--shape bend|straight|zigzag|spiral (zigzagは本当に緊急の場合に; spiralはサインの周りを一周してから指し示す、見逃すことが不可能でなければならない場合)
--style arrow|ring|box; リングとボックスは境界線のみなので、その下のものが見えます
--size S|M|L, --corners round|sharp
--color red|orange|yellow|green|teal|blue|purple|pink|black|white|#RRGGBB
--border shadow|white-black|black: デフォルトはドロップシャドウ付きの白い境界線(明るい色の上で暗い色)です; white-blackはシャドウの代わりに白い境界線の外側に細い黒い縁を付けます; blackは単に細い黒い輪郭です
全ての色はあなた次第です: --border-color, --text-color, --edge-color、そしてXの場合は --close-color と --close-x-color。省略された場合、それぞれが読みやすい色を自分で選びます
--close-buttonはサインの右端(白い円、矢印の色でX)にXを配置します。そこではテキストを覆ったり、画面から外れたりしません
--follow はウィンドウまたは要素と一緒に移動します、--until-click はターゲットのクリックで終了します、--say はサインを話します
一度に複数の矢印は、そのサインがお互いの邪魔にならないように保ちます
矢幹は、丸い角に当たらないようにフレアされたジョイントを通してサインから伸びます。scripts/gallery.pyは全ての組み合わせをオフスクリーンでレンダリングし、全てのジョイント(接合部)にズームします。なぜなら、ジョイントの継ぎ目は、明らかに受け入れられなかったからです。
FAQ
画面録画またはアクセシビリティは必要ですか?
描画にはどちらも必要ありません。--element、elements、--until-click、およびfront --windowはアクセシビリティを使用します。これはmacOSがあなたのシェル(Terminal, iTerm2, Ghostty, VS Code, Claude)を実行しているアプリに付与するもので、bigarrow自体には決して付与されません。bigarrow doctorは、そのアプリの名前を挙げ、終了コード4はエージェントに何を要求すべきかを正確に伝えます。
--window App:titleはウィンドウタイトルを読み取ります。macOS 26は画面録画なしではこれを隠します; --window Appだけでは何も必要ありません。
タイピング中にフォーカスを奪いますか?
いいえ。それがプロジェクトで最も難しいバグでした:NSApplication.run()は、ターミナルを持たないプロセスを静かにアクティブ化するため、デタッチされた矢印がフォーカスを奪いました。bigarrowは代わりに自分でイベントをポンプ処理し、テストでは最前面のアプリが変わらないことを確認します。
クリック透過できますか?
はい、サインと矢幹以外はどこでも可能です:そこにクリックすると矢印が消えます(ポインターの下でわずかに暗くなり、それを伝えます)。ターゲットまたは矢印の頭の近くをクリックすると、アプリに直接透過します。矢印をクリックしてもフォーカスは奪われません。
複数のディスプレイ?フルスクリーンアプリ?ステージマネージャー?スペース?
はい、はい、はい、はい。メインディスプレイの左側または上側(負の座標)のディスプレイも含まれます。矢印が表示されているディスプレイを抜くと、矢印は丁寧に消えます。検証マトリックスを参照してください。
パルスする矢印はどれくらいのCPUを消費しますか?