| name | aoe |
| description | Use when launching, monitoring, or controlling AI coding agents (Claude Code, Codex, OpenCode, etc.) in tmux via Agent of Empires (aoe). Covers creating sessions, capturing agent output, running parallel worktree agents, and organizing work into groups and profiles. Prefer aoe over raw tmux for agent management. |
| version | 1.0.0 |
| author | njbrake (Agent of Empires) |
| license | MIT |
| metadata | {"hermes":{"tags":["coding-agents","tmux","orchestration","sessions","worktrees","automation"],"related_skills":["subagent-driven-development"]}} |
Agent of Empires (aoe)
Overview
aoe creates, manages, and monitors AI coding agent sessions (Claude Code, Codex, OpenCode, and others) inside tmux. Each session is an agent process with an ID, title, tool, project path, and live status. Use aoe instead of raw tmux commands whenever the work is about coding agents: it tracks status, captures output, manages git worktrees for parallel branches, and organizes sessions into groups and profiles.
When to Use
- Launching one or more AI coding agents on project directories.
- Monitoring agent progress (waiting vs running vs idle).
- Capturing agent output for review.
- Organizing agents into groups or profiles.
- Setting up parallel worktree-based development.
Don't use for: general tmux window/pane management unrelated to coding agents.
Requirements
The aoe and tmux binaries must be on PATH, and commands run through a shell. Install aoe from https://github.com/agent-of-empires/agent-of-empires.
Core Concepts
- Session: An agent process running in a tmux session. Each has an ID, title, tool (e.g.
claude), and project path.
- Group: A named folder for organizing sessions (supports nesting with
/, e.g. backend/api).
- Profile: A separate workspace with its own sessions and config. Use
-p <name> globally or set AGENT_OF_EMPIRES_PROFILE.
- Status: One of
running, waiting, idle, stopped, error, starting, unknown.
Adding Sessions
aoe add . -t "my feature"
aoe add /path/to/repo -t "API work" -g backend -l
aoe add . -t "codex session" -c codex
aoe add . -t "fix-123" -w fix/issue-123 -l
aoe add . -t "sandboxed" -s -l
aoe add . -t "sub task" -P <parent-id>
aoe add . -t "yolo" -y -l
Listing Sessions
aoe list
aoe list --json
aoe list --all
JSON shape (aoe list --json):
[
{
"id": "a1b2c3d4-...",
"title": "my feature",
"path": "/home/user/project",
"group": "backend",
"tool": "claude",
"command": "claude",
"profile": "default",
"created_at": "2025-01-01T00:00:00Z",
"workspace_repos": []
}
]
command is omitted when empty; worktree appears only for worktree-backed sessions. list --json does not include live status: use aoe status --json or aoe session capture --json for that.
Session Lifecycle
aoe session start <id-or-title>
aoe session stop <id-or-title>
aoe session restart <id-or-title>
aoe session attach <id-or-title>
Inspecting Sessions
aoe session show <id-or-title> --json
aoe session capture <id-or-title> --json
aoe session capture <id-or-title> -n 100 --strip-ansi
aoe session capture <id-or-title>
aoe status --json
aoe status -q
JSON shape (aoe session capture --json):
{
"id": "a1b2c3d4-...",
"title": "my feature",
"status": "waiting",
"tool": "claude",
"content": "... pane text ...",
"lines": 50
}
JSON shape (aoe session show --json):
{
"id": "a1b2c3d4-...",
"title": "my feature",
"path": "/home/user/project",
"group": "backend",
"tool": "claude",
"command": "claude",
"status": "running",
"profile": "default"
}
parent_session_id is included only for sub-sessions.
JSON shape (aoe status --json):
{
"waiting": 1,
"running": 2,
"idle": 1,
"stopped": 1,
"error": 0,
"total": 5
}
Auto-detection (inside a tmux pane)
When called from within an aoe-managed tmux session, the identifier can be omitted:
aoe session show
aoe session capture
aoe session current --json
Renaming and Organizing
aoe session rename <id> -t "new title"
aoe session rename <id> -g "new/group"
aoe group create mygroup
aoe group move <id-or-title> mygroup
aoe group list --json
aoe group delete mygroup --force
Profiles
aoe profile list
aoe profile create staging
aoe profile delete staging
aoe profile default staging
aoe -p staging list
Worktrees
aoe worktree list
aoe worktree info <id-or-title>
aoe worktree cleanup -f
Removing Sessions
aoe remove <id-or-title>
aoe remove <id-or-title> --delete-worktree --force
Workflow Patterns
Single agent
aoe add /path/to/repo -t "feature X" -l
aoe session capture "feature X" --json
Parallel worktree agents
aoe add . -t "issue-100" -w fix/issue-100 -l
aoe add . -t "issue-101" -w fix/issue-101 -l
aoe add . -t "issue-102" -w fix/issue-102 -l
aoe status --json
Monitoring loop
Poll all sessions until none are running or waiting:
while true; do
status=$(aoe status --json)
waiting=$(echo "$status" | jq '.waiting')
running=$(echo "$status" | jq '.running')
if [ "$running" -eq 0 ] && [ "$waiting" -eq 0 ]; then
echo "All agents finished"
break
fi
echo "Running: $running, Waiting: $waiting"
sleep 30
done
Capture and review
for id in $(aoe list --json | jq -r '.[].id'); do
echo "=== $id ==="
aoe session capture "$id" -n 100 --strip-ansi
echo
done
Common Pitfalls
- Expecting
aoe list --json to carry live status. It does not. The fields are static session metadata (path, group, tool, command, etc.). For status, call aoe status --json or aoe session capture --json.
- Using raw
tmux to start or stop agents. That bypasses aoe's tracking; the session's status and metadata go stale. Always use aoe session start/stop/restart.
- Forgetting
-l/--launch. aoe add creates a session but does not start it unless you pass -l.
- Running across the wrong profile. Sessions are profile-scoped; use
-p <name> or set AGENT_OF_EMPIRES_PROFILE when scripting, and aoe list --all to see everything.
Verification Checklist