agentleFS
ryanmacleanryanmaclean/skills/at-tui/SKILL.md

at-tui

Skill1 starsChanged 49 days agoMITView on GitHub

Auto-Tundra TUI agent interface. Use when you need to inspect project state, navigate tabs, query beads/agents/sessions, or automate TUI interactions from an agent context. The TUI can run headless for programmatic access.

The file

We split this skill into the rules it gives an agent

1 rule. About 0 are common, 0 are distinctive, and 1 is very specific to this project.

  • ≈0

    Common · estimate

    Many files like this have a rule of this kind.

  • ≈0

    Distinctive · estimate

    This author's own choices. Worth a look.

  • 1

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Very specific:

    When not in --offline mode, a background thread polls the at-bridge API every 5 seconds:

    line 225

≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

Auto-Tundra TUI — Agent Interface Guide

The at-tui crate provides a ratatui terminal dashboard that agents can drive programmatically. Use it to inspect auto-tundra project state, navigate beads/agents/sessions, and automate workflows.

Quick Start

# Interactive mode with demo data
cargo run -p at-tui -- --offline

# Interactive mode connected to running daemon
cargo run -p at-tui -- --api http://localhost:9090

# Headless mode (agent automation — JSON in/out, no rendering)
echo '{"cmd":"query_state"}' | cargo run -p at-tui -- --headless --offline

# Headless with live API
printf '{"cmd":"tab","args":[2]}\n{"cmd":"query_tab"}\n' | cargo run -p at-tui -- --headless

Architecture

Agent (stdin JSON) ──┐
Human (keyboard)  ───┤──► AppCommand dispatcher ──► App state ──► Renderer (or JSON stdout)
API (at-bridge)   ───┘                                              ↑ skipped in --headless

Three input modes:

  1. Keyboard — vim-style keys (human)
  2. : command mode — type :tab 3 in the status bar
  3. --headless stdin pipe — send JSON commands, receive JSON responses

CLI Flags

FlagDescription
--offlineUse demo data, don't connect to at-bridge
--api <url>API base URL (default: http://localhost:9090)
--headlessNo terminal rendering; JSON stdin/stdout only

17 Tabs

#KeyNameData
01DashboardKPI cards, agent summary, activity feed
12AgentsAgent table (name, role, CLI, status)
23Beads5-column kanban (Backlog→Done)
34SessionsTerminal sessions table
45ConvoysProgress gauges per convoy
56CostsToken usage & cost breakdown
67AnalyticsAnalytics dashboard
78ConfigConfig file viewer
89MCPMCP server status
90 / RRoadmapPriority-sorted feature list
10IIdeationSplit pane: ideas + detail
11WWorktreesGit worktree status
12GGitHub IssuesSplit pane: issues + detail
13PGitHub PRsSplit pane: PRs + detail
14SStacksStacked diffs tree view
15XContextContext steering levels + memory
16LChangelogCollapsible version history

Headless JSON Protocol

Sending Commands

Two formats accepted (both work in headless):

JSON format (recommended for agents):

{"cmd":"tab","args":[3]}
{"cmd":"query_state"}
{"cmd":"select","args":[2]}
{"cmd":"query_selected"}
{"cmd":"query_tab"}
{"cmd":"quit"}

Text format (also works):

:tab 3
:query state
:select 2
:query selected
:quit

Command Reference

CommandJSONTextDescription
Switch tab{"cmd":"tab","args":[N]}:tab NGo to tab N (0-16)
Next tab{"cmd":"next_tab"}:nextCycle forward
Prev tab{"cmd":"prev_tab"}:prevCycle backward
Select item{"cmd":"select","args":[N]}:select NSelect item N in list
Move up{"cmd":"up"}:upPrevious item
Move down{"cmd":"down"}:downNext item
Move left{"cmd":"left"}:leftKanban/sub-tab left
Move right{"cmd":"right"}:rightKanban/sub-tab right
Refresh{"cmd":"refresh"}:refreshReload config
Query state{"cmd":"query_state"}:query stateFull state JSON
Query tab{"cmd":"query_tab"}:query tabCurrent tab data JSON
Query selected{"cmd":"query_selected"}:query selectedSelected item JSON
Quit{"cmd":"quit"}:quitExit TUI

Response Format

Events (emitted automatically):

{"event":"started","tabs":17,"offline":true}
{"event":"tab_changed","tab":3,"tab_name":"Sessions"}
{"event":"data_refreshed","agents":5,"beads":12}
{"event":"ok"}
{"event":"quit"}
{"event":"error","message":"unknown command: foo"}

Query responses (raw JSON, not wrapped in event):

query_state:

{
  "current_tab": 0,
  "tab_name": "Dashboard",
  "selected_index": 0,
  "api_connected": false,
  "offline": true,
  "counts": {
    "agents": 5, "beads": 10, "sessions": 4, "convoys": 3,
    "costs": 4, "mcp_servers": 4, "worktrees": 3,
    "github_issues": 3, "github_prs": 2, "roadmap_items": 4,
    "ideas": 3, "stacks": 3, "changelog": 2, "memory_entries": 2
  }
}

query_tab (example for Sessions tab):

[
  {"id":"sess-01","agent":"mayor-alpha","cli_type":"Claude","status":"running","duration":"12m 34s","cpu":"2.1%"},
  {"id":"sess-02","agent":"deacon-bravo","cli_type":"Claude","status":"running","duration":"8m 12s","cpu":"1.4%"}
]

query_selected (example for a bead):

{"id":"bd-002","title":"Implement auth module","status":"Slung","lane":"Critical"}

Agent Workflow Examples

Inspect all beads

printf '{"cmd":"tab","args":[2]}\n{"cmd":"query_tab"}\n{"cmd":"quit"}\n' \
  | cargo run -p at-tui -- --headless --offline 2>/dev/null \
  | grep '^\[' | jq .

Check which agents are active

printf '{"cmd":"tab","args":[1]}\n{"cmd":"query_tab"}\n{"cmd":"quit"}\n' \
  | cargo run -p at-tui -- --headless 2>/dev/null \
  | grep '^\[' | jq '[.[] | select(.status == "Active")]'

Get GitHub issues

printf '{"cmd":"tab","args":[12]}\n{"cmd":"query_tab"}\n{"cmd":"quit"}\n' \
  | cargo run -p at-tui -- --headless 2>/dev/null \
  | grep '^\[' | jq '[.[] | select(.state == "open")]'

Multi-step inspection

cat <<'EOF' | cargo run -p at-tui -- --headless --offline 2>/dev/null
{"cmd":"query_state"}
{"cmd":"tab","args":[14]}
{"cmd":"query_tab"}
{"cmd":"tab","args":[2]}
{"cmd":"select","args":[1]}
{"cmd":"query_selected"}
{"cmd":"quit"}
EOF

Key Files

FilePurpose
crates/at-tui/src/main.rsEntry point, CLI args, event loop, headless mode
crates/at-tui/src/app.rsApp state, 17 tab data, key handler, apply_data()
crates/at-tui/src/command.rsAppCommand enum, text/JSON parsers, executor
crates/at-tui/src/api_client.rsBlocking HTTP client for at-bridge REST API
crates/at-tui/src/ui.rsMaster renderer, tab bar with badges, command bar
crates/at-tui/src/tabs/*.rsIndividual tab renderers (17 files)
crates/at-tui/src/effects.rstachyonfx visual effects (fade, sweep, glow, burst)
crates/at-tui/src/widgets/toast.rs, gauge_bar.rs, status_bar.rs, help_modal.rs

Keyboard Shortcuts (Interactive Mode)

KeyAction
1-9Switch to tab 1-9
0Switch to tab 10 (Roadmap)
R/I/W/G/P/S/X/LJump to Roadmap/Ideation/Worktrees/Issues/PRs/Stacks/Context/Changelog
Tab / Shift-TabCycle tabs forward/backward
j/k or ↓/↑Navigate list items
h/l or ←/→Kanban columns (Beads) / sub-tabs (Context)
EnterToggle expand/collapse (Changelog)
:Enter command mode
?Help modal
rRefresh config
qQuit

API Data Refresh

When not in --offline mode, a background thread polls the at-bridge API every 5 seconds:

  • Endpoints: /api/agents, /api/beads, /api/kpi, /api/sessions, /api/convoys, /api/costs, /api/mcp/servers, /api/worktrees, /api/github/issues, /api/github/prs, /api/roadmap, /api/ideation/ideas, /api/stacks, /api/changelog, /api/memory
  • Data flows via flume channel from refresh thread → main thread
  • Status bar shows: LIVE (connected), OFFLINE (demo data), ... (connecting)

Development Notes

  • Binary crate ([[bin]]), no [lib] — tests use #[path = "..."] includes
  • Build: cargo build -p at-tui
  • Test: cargo test -p at-tui (114 tests)
  • App::new(offline: bool) — pass true for demo data
  • Effects: EffectManager wraps tachyonfx, called in ui::render() after widgets
  • Toast: app.toasts.push(Toast::new("message", ToastLevel::Success))

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.