claudeers.

🔓 unclaimed — this page was auto-generated from GitHub. Are you the creator?

Claim this page →
// Automation & Workflows

gentle-agent-state

See which AI coding agent needs you — right in your tmux tab bar. A colored dot per window (working/blocked/idle) with off-screen sound alerts. Works with op…

Actively maintained
99/100
last commit 8 days ago
last release none
releases 0
open issues 2
// install
git clone https://github.com/Gentleman-Programming/gentle-agent-state

gentle-agent-state

See when an AI agent needs you without hunting through panes.

gentle-agent-state connects AI coding agents to your terminal multiplexer. Agents emit lifecycle events, this project normalizes them into working, blocked, and idle, then shows the state in tmux or Zellij.

  • tmux: colored dots in the window/tab bar, rolled up from all panes.
  • Zellij: the tab title rolls up agent state; the exact agent pane title changes too.
  • Agents: opencode, pi, Claude Code, and Codex.
  ● 1 api      ● 2 claude      3 notes
  └ working    └ blocked       └ idle
  (orange)     (red, beeps)    (no dot)

Quick path

git clone https://github.com/Gentleman-Programming/gentle-agent-state.git
cd gentle-agent-state
./install.sh --all

Then restart your agents inside tmux or Zellij.

For tmux, either open a fresh tmux session or reload your config:

tmux source-file ~/.config/tmux/tmux.conf

Want only specific agents?

./install.sh --with-opencode --with-pi
./install.sh --with-claude --with-codex

What you get

StateMeaningtmux displayZellij displayAlert
workingAgent is running🟠 orange dottab suffix + pane title: api ● agent workingnone
blockedAgent is waiting for you🔴 red dottab suffix + pane title: api ● agent blockedsound + flash/message
idleAgent finished or is not runningno dotoriginal tab + pane titles restoredsound after busy state

tmux behavior

The window dot shows the worst state across panes:

blocked > working > idle

So if any pane in a tmux window is blocked, that window turns red.

Zellij behavior

Zellij does not expose tmux-style window user options, so the backend uses native renaming actions instead. The tab title keeps its original name and appends the worst state across panes in that tab, while the exact agent pane title shows its own state. Original tab names are remembered and restored when the tab returns to idle.


Supported agents

AgentInstall flagInstall target
opencode--with-opencode~/.config/opencode/plugins/gentle-agent-state.js
pi--with-pi~/.pi/agent/extensions/gentle-agent-state.ts
Claude Code--with-claudemerges hooks into ~/.claude/settings.json
Codex--with-codexmerges hooks into ~/.codex/hooks.json
all detected--allevery detected agent config directory

Adapters are opt-in. The installer only touches agents you request, except --all, which selects agents whose config directories already exist.

Claude/Codex hook merging is append-only and idempotent. Existing hooks are kept. Legacy tmux-agent-state hook commands are migrated to the neutral gentle-agent-state core path.


Requirements

Required:

  • bash
  • jq
  • python3
  • either tmux or zellij

Optional sound players:

  • macOS: afplay
  • Linux/BSD: paplay, canberra-gtk-play, or aplay

No sound player? Nothing breaks; alerts just become visual/state-only.


Configuration

Env varDefaultEffect
AGENT_SOUND_BLOCKEDmacOS Funk.aiff, Linux dialog-warning.ogasound when an agent becomes blocked
AGENT_SOUND_IDLEmacOS Glass.aiff, Linux complete.ogasound when a busy agent finishes
HERDR_ENV=1unsetdisables every adapter so Herdr can own integration

tmux colors

tmux dot colors live in tmux/agents.conf:

StateColor
blocked#e82424
working#dca561

Edit those values if your theme needs different colors.


How it works

Every agent has its own event dialect. gentle-agent-state keeps that complexity at the edge with thin adapters:

opencode ┐
pi       ├──▶  agent-report.sh  ──▶  tmux backend
Claude   │                       └─▶  Zellij backend
Codex    ┘

The core vocabulary is deliberately small:

Canonical stateExample source event
workingprompt submitted, tool started, session active
blockedpermission request, user question, approval needed
idlestop, turn complete, session idle

This is an anti-corruption layer: adding a new agent should require one adapter, not changes to every multiplexer backend.

Installed core files

PathPurpose
~/.config/agent-state/scripts/agent-report.shneutral dispatcher
~/.config/agent-state/scripts/tmux-agent-report.shtmux backend
~/.config/agent-state/scripts/zellij-agent-report.shZellij backend
~/.config/agent-state/scripts/hook-adapter.shClaude/Codex hook adapter

tmux-specific files

PathPurpose
~/.config/tmux/agents.conftab dots, hooks, visual bell
~/.config/tmux/scripts/agent-status.shclears stale blocked states when panes become visible
~/.config/tmux/scripts/agent-statusline.shkeeps the self-heal heartbeat in status-right

Troubleshooting

I installed it, but nothing changes

Check that you restarted the agent process after installing the adapter. Most agents load plugins/extensions only on startup.

tmux dots do not appear

Reload tmux config:

tmux source-file ~/.config/tmux/tmux.conf

Then confirm your config sources the generated file:

grep agents.conf ~/.config/tmux/tmux.conf ~/.tmux.conf 2>/dev/null

Zellij tab or pane title does not change

Confirm the agent is running inside Zellij and has a pane id:

echo "$ZELLIJ_PANE_ID"
zellij action rename-pane --pane-id "$ZELLIJ_PANE_ID" "test-pane"
zellij action undo-rename-pane --pane-id "$ZELLIJ_PANE_ID"
zellij action current-tab-info
zellij action rename-tab "test-tab"
zellij action undo-rename-tab

Claude or Codex hooks do not fire

Re-run the installer for that agent and inspect the hook file:

./install.sh --with-claude
jq '.hooks' ~/.claude/settings.json

./install.sh --with-codex
jq '.hooks' ~/.codex/hooks.json

I use Herdr

Set HERDR_ENV=1. All adapters exit early and let Herdr own the integration.


Uninstall

./uninstall.sh

This removes:

  • the neutral core scripts;
  • tmux agents.conf and generated tmux scripts;
  • the tmux source line from ~/.config/tmux/tmux.conf or ~/.tmux.conf;
  • opencode/pi adapter files;
  • Claude/Codex hooks added by this project.

Other hooks and user configuration are preserved.


Development notes

Run quick checks before opening a PR:

bash -n install.sh uninstall.sh scripts/*.sh tmux/scripts/*.sh
node --check adapters/opencode/gentle-agent-state.js

A useful smoke test is installing into a temporary home:

tmp="$(mktemp -d)"
HOME="$tmp" ./install.sh
HOME="$tmp" ./uninstall.sh

License

MIT — see LICENSE.

// compatibility

Platformscli, api
Operating systems
AI compatibilityclaude
LicenseMIT
Pricingopen-source
LanguageShell

// faq

What is gentle-agent-state?

See which AI coding agent needs you — right in your tmux tab bar. A colored dot per window (working/blocked/idle) with off-screen sound alerts. Works with opencode, pi, Claude Code & Codex.. It is open-source on GitHub.

Is gentle-agent-state free to use?

gentle-agent-state is open-source under the MIT license, so it is free to use.

What category does gentle-agent-state belong to?

gentle-agent-state is listed under devtools in the Claudeers registry of Claude-compatible tools.

0 views
39 stars
unclaimed
updated 12 days ago

// embed badge

gentle-agent-state on Claudeers
[![Claudeers](https://claudeers.com/api/badge/gentle-agent-state.svg)](https://claudeers.com/gentle-agent-state)

// retro hit counter

gentle-agent-state hit counter
[![Hits](https://claudeers.com/api/counter/gentle-agent-state.svg)](https://claudeers.com/gentle-agent-state)

// reviews

// guestbook

0/500

// related in Automation & Workflows

🔓

The agent that grows with you

// automationNousResearch/Python211,605MIT[ claude ]
🔓

The API to search, scrape, and interact with the web at scale. 🔥

// automationfirecrawl/TypeScript143,720AGPL-3.0[ claude ]
🔓

🌐 Make websites accessible for AI agents. Automate tasks online with ease.

// automationbrowser-use/Python103,709MIT[ claude ]
🔓

An open-source long-horizon SuperAgent harness that researches, codes, and creates. With the help of sandboxes, memories, tools, skill, subagents and message…

// automationbytedance/Python76,016MIT[ claude ]
→ see how gentle-agent-state connects across the ecosystem