bogyman
Rust · single binary · macOS & Linux · MIT

Your agents haunt you.
Haunt them back.

Six Claude Code and Codex sessions, and every one of them wants something from you: a permission, an answer, a nudge. bogyman is the thing under your desk that knows which agent has been waiting longest, what it's stuck on, and chases you down to deal with it. It never touches your terminals, tmux, or worktrees. It just stares.

Bogyman, a scruffy ghost with half-closed eyes, looking unimpressed
…you there?
~/dev — who's haunting me?
$ bogyman waiting
  VENDOR   HOST       SESSION               WAITING FOR               AGE      CWD
● claude   terminal   flaky-test-fix        permission · npm test     9m12s    tag-web
● claude   desktop    Auth module refactor  question · 2 options      4m03s    tag-web
● codex    terminal   deps-audit            sandbox · registry.npm    41s      hapio

$ bogyman focus flaky
cc-1f0e2c9a (flaky-test-fix): raised the Ghostty tab on /dev/ttys004

$ bogyman status
●3 ▶2 ✓1
<10 mshook path. never blocks an agent
3 hoststerminal · agent view · Claude Desktop
0tmux, worktrees, or daemons required
--jsonon every command

Four hauntings. One list.

Bogyman watches the sessions you already started and answers the questions you keep alt-tabbing to answer yourself.

Triage

Blocked sessions, oldest wait first, with the reason: permission, question, sandbox, expired login. One command to jump there.

Progress

What each session is doing now, turn count, elapsed time, and task progress — 3/7 · write tests — when the vendor emits it.

Cost & quota

The model each session runs, token totals and the last reply for Codex, read from the vendors' own files and CLIs. No scraping, no guessing.

Control

Send a message, raise the right tab, attach to a background job, or resume one that ended — wrapping codex queue and claude attach so you never hunt for a window.

A day haunted by Bogyman

The loop most people settle into once the bogyman moves in. Every step is one command; every command has --json.

  1. 01 · morning Start work however you like

    Three claude tabs, two Codex sessions, one task in the Desktop Code tab. The bogyman notices each one on its first hook.

    claude --bg "fix flaky tests" codex --session-name deps-audit
  2. 02 · glance Keep the count in your prompt

    Put bogyman status in starship, tmux, or your shell prompt. Cache only, under 20 ms. Or start the daemon and get a notification the moment a session blocks.

    bogyman status ●2 ▶3 ✓1 bogyman daemon start
  3. 03 · triage Answer the oldest wait first

    bogyman waiting lists blocked sessions by wait age. bogyman focus raises the tab, attaches to a background job, fronts Desktop, or resumes a session that ended.

    bogyman waiting bogyman focus flaky
  4. 04 · unblock Reply without attaching

    Send a one-line answer and move on. Or let a supervising Claude session read bogyman ls --json and do the nudging.

    bogyman send deps "use pnpm" bogyman ls --json | jq '.data.sessions'

The CLI

Twelve commands. Human tables on a TTY, TSV when piped, JSON when asked. Exit codes you can branch on.

bogyman ls

Every live session, grouped blocked / working / done. --watch redraws each second and polls claude agents too.

bogyman waiting

Blocked only, oldest first. Exit 3 when empty, so it works in && chains.

bogyman status

One line for prompts and status bars. Cache only, <20 ms, templatable.

bogyman focus <id>

Raise the tab (Ghostty, iTerm2, Terminal, WezTerm, kitty, tmux), attach a background job, front Desktop, or resume one that ended.

bogyman send <id> "…"

Deliver a message. Wraps codex queue and Claude's reply path.

bogyman show <id>

Full record plus the last 20 events. --open jumps to the transcript.

bogyman install

Merges hooks into Claude and Codex settings. Idempotent, backed up, reversible.

bogyman doctor

Vendor versions, hooks registered, daemon health, last event per collector.

bogyman daemon

Optional poller for claude agents --json and Codex rollouts, plus notifications. install runs it at login via launchd or systemd.

bogyman gc

Prune records older than retention_days (default 7).

bogyman uninstall

Removes only bogyman's hook entries. Your other hooks stay untouched.

bogyman … --json

One envelope for every command: schema, command, ok, then data or error. Failures are JSON too.

$ bogyman ls --json | jq '.data.sessions[] | select(.state=="blocked") | {name, host, waiting_for, since}'
{ "name": "flaky-test-fix", "host": "terminal", "waiting_for": "permission_prompt", "since": "2026-10-26T21:03:11Z" }
{ "name": "Auth module refactor", "host": "desktop", "waiting_for": "question", "since": "2026-10-26T21:08:40Z" }
$ bogyman show zzz --json
{"schema":1,"command":"show","ok":false,"error":{"message":"no session matches 'zzz'","exit":1}}

What bogyman can see

Only what's on your disk. A bogyman that can't see under the bed stays quiet about it, so cloud sessions stay out of the list instead of showing a guess.

SurfaceStateBlocked vs doneDetailSource
Claude Code · terminal tabFullCorrectturns, tasks, modelhooks + sessions/
Claude Code · agent view / --bgFullCorrectexact wait reason, attach idclaude agents --json
Claude Desktop · Code tab, localFullCorrectmodel, Desktop's turn summaryhooks + session index
Claude Desktop · Code tab, SSH / WSLPlannedIndex onlytitlesession index
Codex CLIFullCorrectmodel, tokens, last message, namehooks + rollouts
Cowork · localNot shown——inside Cowork's VM
Cloud sessions · Chat tab · Cowork cloudNot shown——not on disk

Install in a minute

curl -fsSL https://raw.githubusercontent.com/soleo/bogyman-cli/main/install.sh | sh

One line, no package manager. Verifies the download against the release checksums and installs to ~/.local/bin. Or brew install soleo/tap/bogyman, or cargo install --git https://github.com/soleo/bogyman-cli bogyman-cli.

$ bogyman install         # wires Claude + Codex hooks
$ bogyman doctor          # both vendors report events
$ bogyman daemon install  # optional: notifications
  • Merges into ~/.claude/settings.json and ~/.codex/hooks.json; existing hooks untouched; a .bogyman-bak is written first.
  • Nothing leaves your machine. Stores summaries and the first 200 characters of what a session is waiting on — never full prompts.
  • Claude Code ≥ 2.1.139 and Codex ≥ 0.130 for full coverage; degrades gracefully below.

How it works

  1. 1
    Hooks push events.

    bogyman hook runs on PermissionRequest, Notification, Stop, TaskCompleted, SessionEnd. Appends one row to SQLite, exits in <10 ms, never returns a decision.

  2. 2
    Pollers fill in detail.

    Every query tails Codex rollouts for model, tokens and the last reply. The optional daemon also polls claude agents --json for background sessions and exact wait reasons, and sends the notifications.

  3. 3
    One record per session.

    Vendor, host, cwd, state, waiting_for, wait age, task progress. The CLI, the JSON, and any future UI read only this.

What it is not

Not a spawner. Not a kanban. Not a tmux layout. Not a cost dashboard. Those exist, a hundred times over. Bogyman is the thin layer that lurks alongside whatever you already use and answers one question well.

Roadmap

v0.1Hook collectors; ls / waiting / status / show / send / --watch / --jsonshipped
v0.2claude agents + Codex rollout pollers, focus, daemon, notificationsshipped
v0.3Homebrew tap, Claude Desktop session indexshipped
v1+Web view on the same store, Gemini / OpenCode collectors, cloud sessions, team modelater

Let something else do the haunting.

Bogyman is being built in the open. Star the repo to follow, or leave an email and the bogyman will find you when the next release ships.