agt is a transcript TUI and agent CLI combined into one.
Features:
- View agent transcripts in a TUI view with vim-style navigation
- Start or resume your session within agt, with intelligent terminal cropping to provide a seamless experience
- Use your favourite harness -- supports Claude Code and Cursor Agent -- always compatible with latest releases
- Drill down into nested tool calls and sub-agent sessions
- Customize tool call formatting and colour palette to your preferences
- Enjoy a smooth and speedy experience regardless of session length
Philosophy:
First-party harnesses provide the best performanceand enable users to stay on the cutting edge of agentic coding. However, they are limited in terms of customizability, especially when it comes to the user interface. There are customizable options, but they often come with trade offs in performance, API cost and usability.
agt aims to change that, by providing a lightweight and well-designed TUI wrapper around the agent CLI. With agt, you can keep using your favourite first-party harness, while customizing how your transcript looks.
Project status:
- Supports Claude Code and Cursor Agent
- Provides good TUI-based agentic coding and drill-down experience
- Good defaults but limited customizability
cargo installIf you don't have Cargo installed yet, you can use the rustup installer.
agt uses hooks to detect session changes, so the following setup is required to use agt to start sessions. You can audit the hook source code in src/cmd_hook.rs.
- Cursor Agent: Run
agt install-hooks cursor. This addsagt hookto your~/.cursor/hooks.json. - Claude: No setup required -- hooks are configured using an auto-loaded plugin using the
--plugin-dirflag.
To open the transcript picker:
# Run from your project workspace:
agtSelect a transcript by pressing Enter. When in a transcript:
- Press Ctrl-Y to resume session.
- When the chat is in focus, press Ctrl-O to return to normal mode. When in normal mode, press Esc or Ctrl-O to return to chat.
- Press Ctrl-X to open the transcript picker again.
- To exit the app, exit the agent CLI first (e.g. by pressing Ctrl-D twice), then press q.
You can also open agt to a session directly:
# Open a session by session ID
agt claude:<uuid>
agt cursor:<uuid>
# Open session and resume
agt --resume claude:<uuid>
# New session
agt claude
agt cursor- Press
h / j / k / lor arrow keys to navigate between messages. - Press
[[and]]to navigate by turn. - Press
Ctrl-N/Ctrl-Pto scroll by line, andCtrl-D/Ctrl-Uto scroll by half page. - Press
Spaceto drill down: it cycles between collapsed, show more and expand children. - On a table, press
Enterto navigate between cells. Resize column by- / =. - Press
rto view raw message in a JSON viewer. - Press
?to view all key shortcuts.
Auto-detects pbpaste, xsel and xclip. Falls back to OSC 52 (terminal escape sequences).
- Press
Y / yyto copy markdown. - Press
ytto copy plain text. - Press
yrto copy raw.
~/.config/agent-transcript/ ($XDG_CONFIG_HOME/agent-transcript/)
config.toml # Main configuration file
palettes/*.toml # Custom palettes
styles/*.toml # Custom styles
- Default config: src/default.toml
- Default palette: src/theme/dark.toml, src/theme/light.toml
- Default styles: src/theme/styles.toml
The default config is always loaded, so you only need to specify your overrides.
In config.toml:
[agents.claude]
binary = "claude" # Configure command to use
extra_args = [] # Extra args to pass to the agent CLIThe UI initializer sets the default UI state based on message type and tag:
[transforms.ui_initializer.types.UserMessage]
expanded = true # Whether children are shown
show_more = true # Whether to show more than one line of content
tags = {
attachment = { expanded = false, show_more = false }
}Message types:
| Message type | Supported tags |
|---|---|
| UserMessage | attachment |
| AgentMessage | |
| ToolCall | success, error |
| ToolResult | |
| Thinking | redacted |
| Container | |
| TaskSummary | |
| System |
The tool formatter allow customizing the format of the Bracket(param) line of a tool call.
Example:
[[transforms.tool_formatter.rules]]
providers = ["cursor"]
tools = ["Shell"]
template = "{{command}}"To disable default rules:
[transforms.tool_formatter]
disable_defaults = trueNOTE: Make sure you use [[transforms.tool_formatter.rules]] rather than [[transforms.tool_formatter.default_rules]].
The tool grouper allows grouping of tool calls by tool name.
Example:
[[transforms.tool_grouper.groups]]
name = "File reads"
tools = ["Read", "Glob", "Grep", "LS"]
min_count = 2
expanded = false
shorten_as_glob = trueTo disable default groups:
[transforms.tool_grouper]
disable_defaults = trueExperimental.
In config.toml:
[theme]
mode = "auto" # auto | light | dark
dark = "dark" # Name of the dark palette to use: {config_dir}/palettes/{name}.toml
light = "light" # Name of the light palette to use: {config_dir}/palettes/{name}.toml
styles = "styles" # Name of the styles to use: {config_dir}/styles/{name}.tomlPalettes define colour tokens, which are used by the styles file to determine how to render messages. Refer to the default palette and styles files for more information.
Feel free to open issues or discussions. Pull requests are currently not accepted.