I kept losing track of which terminal was actually waiting on me.

So I built beckoned. It watches every Claude Code, Antigravity, Gemini CLI, and Eigent session running on your machine, and sends one plain notification the moment any of them needs you. Click it and you land back in the exact window, not just the app.

terminal
$npm install -g beckoned
$beckoned-setup

Every one of these tools can notify you. None of them tell you which project.

Run more than one AI coding session at once and it gets hard to keep straight, different projects, different terminal tabs, different editor windows. One of them is sitting there waiting on a permission prompt while you're three tabs over reading something else.

beckoned doesn't replace what each tool already does. It sits underneath all of them and says this one, in that project, needs you, no matter which tool it is or how many you have open.

There's no menu bar icon, and it doesn't collect or send anything about what you're doing. It just sits there and does its one job.

Three small pieces, no dashboard

A hook, a background daemon, and your Mac's own notification center. That's the whole thing.

A tool fires its own signal

Claude Code, Antigravity, Gemini CLI, and Eigent already know when they need you, a permission prompt, a finished run. A small hook script catches that moment and forwards it.

A daemon turns it into one notification

beckoned-daemon runs quietly in the background, listens on a local socket, and folds anything from the same session into a single notification instead of a flood.

Click it, land in the right window

Clicking the notification reuses the exact window it came from where it can, instead of just switching apps and leaving you to hunt for the right tab.

What actually shows up

Here's exactly what shows up in Notification Center, worded the way you'd actually say it.

needs permission to run something
A tool is about to do something, run a command, write a file, and it's waiting on your say-so.
permission
is waiting on you
The session finished its turn and is sitting idle, ready for your next instruction.
idle
needs input
The agent hit something it can't resolve on its own and is asking you a direct question.
input
finished a task
Whatever it was running is done. Worth a look, nothing urgent.
done

Built for four tools so far

Each one signals "I need you" in its own way. The full story on how each was verified lives in EXTENDING.md.

Claude Code
The reference adapter. One global hook, covers every project on the machine.
built
Antigravity
Its own agent panel, separate from a terminal session running inside it. Set up per project.
built
Gemini CLI
One setup for the whole machine, gated by Gemini CLI's own folder trust.
built
Eigent
Needed a small patch to Eigent's own source first, since it had no hook system at all.
built

Where things stand

Tool or platformStatusNotes
Claude CodeSupportedThe reference adapter.
Antigravity (agent panel)SupportedProject-local setup, run once per project.
Gemini CLISupportedGlobal setup, gated by folder trust.
EigentSupportedRequires a patched build of Eigent.
Codex CLINot yetSignal confirmed, adapter not built.
Claude DesktopUnresolvedGenuinely inconclusive so far.
LinuxPlannednotify-send / D-Bus, scoped but not started.
WindowsPlannedToast notifications, scoped but not started.

Install

macOS only for now. Pick whichever fits how you work.

npm
# installs the CLI, compiles the native notifier
$ npm install -g beckoned

# registers the background service
$ beckoned-setup
From source
$ git clone https://github.com/Octagon-simon/beckoned
$ cd beckoned
$ ./scripts/setup.sh