tael

Crates.iotael
lib.rstael
version0.2.0
created_at2025-12-30 22:32:08.780033+00
updated_at2025-12-30 22:32:08.780033+00
descriptionTerminal-agnostic agent inbox TUI - track AI assistant status across panes
homepage
repositoryhttps://github.com/Mootikins/tael
max_upload_size
id2013523
size1,582,658
Matthew Krohn (Mootikins)

documentation

README

tael mascot

tael

Terminal-Agnostic Event Lister

CI Crates.io License: MIT

A lightweight TUI for tracking AI agent status across terminal panes.
Know when your agents need attention without constantly checking each pane.

Named after Tael, the purple fairy from Zelda: Majora's Mask.

Features

  • Terminal-agnostic: Works with Zellij, tmux, WezTerm, or any terminal
  • Interactive TUI: Navigate with vim keys, press Enter to jump to pane
  • Lightweight: Single Rust binary, no daemon required
  • Simple protocol: Markdown-based persistence, easy to integrate

Installation

cargo install tael

Or build from source:

git clone https://github.com/Mootikins/tael
cd tael
cargo install --path .

Usage

# Open interactive TUI (default)
tael

# Add an item with attributes
tael add -a "msg=claude-code: Waiting for input" -a pane=42 -a proj=myproject

# Add with JSON stdin (extract fields with @.field syntax)
echo '{"message":"Auth needed"}' | tael add -a "msg=@.message" -a pane=42

# Claude Code preset (extracts message/type from JSON stdin)
echo "$NOTIFICATION_JSON" | tael add --from-claude-code -a pane=$PANE_ID

# List items (with optional grouping)
tael list
tael list --group-by proj
tael list --group-by status,proj

# Remove item by pane
tael remove -a pane=42

# Clear all
tael clear

# Launch TUI in a floating pane (Zellij only)
tael float
tael float -p bottom-left --width 40% --height 60%

TUI Keybindings

Key Action
j / Move down
k / Move up
Enter Focus pane (jump to it)
d Delete selected item
p Pin floating pane (Zellij only)
r Reload inbox
q / Esc Quit

Integration

Claude Code Hooks

Add to ~/.claude/settings.json:

{
  "hooks": {
    "Notification": [
      {
        "matcher": "",
        "hooks": [
          {
            "type": "command",
            "command": "tael add --from-claude-code -a pane=$ZELLIJ_PANE_ID -a proj=$(basename $PWD) -a branch=$(git branch --show-current 2>/dev/null)"
          }
        ]
      }
    ],
    "Stop": [
      {
        "matcher": "",
        "hooks": [
          {
            "type": "command",
            "command": "tael remove -a pane=$ZELLIJ_PANE_ID"
          }
        ]
      }
    ]
  }
}

The --from-claude-code flag reads JSON from stdin and extracts message and notification_type fields automatically.

Zellij Keybinding

Add to your Zellij config to toggle the inbox with a hotkey:

keybinds {
    shared {
        bind "Alt i" {
            Run "tael" {
                floating true
                close_on_exit true
            }
        }
    }
}

tmux

For tmux, set the focus command via environment or CLI flag:

export TAEL_FOCUS_CMD="tmux select-pane -t {pane_id}"

Or pass directly:

tael --focus-cmd "tmux select-pane -t {pane_id}"

Configuration

tael is configured entirely via CLI flags and environment variables (no config files).

Flag Env Variable Description
--focus-cmd TAEL_FOCUS_CMD Command to focus a pane (use {pane_id} placeholder)
-f, --file TAEL_INBOX_FILE Override inbox file path
--group-by - Group items by attribute (e.g., status,proj)

Focus command is auto-detected for Zellij and tmux if not specified.

Environment Variables

Variable Description
ZELLIJ_PANE_ID Auto-used for pane ID in Zellij hooks
ZELLIJ_SESSION_NAME Used for per-session inbox file naming
TMUX Detected for tmux focus command auto-config

How It Works

  1. Agents (Claude Code, etc.) call tael add when they need attention
  2. Agents call tael remove when they're done or user responds
  3. You open tael TUI to see all waiting agents at a glance
  4. Press Enter to jump directly to the pane that needs you

Inbox is stored as Markdown in ~/.local/share/tael/<session>.md, making it easy to inspect or edit manually.

License

MIT

Commit count: 0

cargo fmt