home / skills / autumnsgrove / groveengine / rich-terminal-output
This skill helps you build compelling CLI output using Rich to render tables, panels, progress bars, and syntax highlighting.
npx playbooks add skill autumnsgrove/groveengine --skill rich-terminal-outputReview the files below or copy the command above to add this skill to your agents.
---
name: rich-terminal-output
description: Create beautiful terminal output with Rich library including tables, progress bars, panels, and syntax highlighting. Use when building CLI applications or enhancing terminal output in Python.
---
# Rich Terminal Output Skill
## When to Activate
Activate this skill when:
- Building CLI applications
- Displaying structured data (tables)
- Showing progress for long operations
- Creating error/status panels
- Pretty-printing objects for debugging
- Enhancing logging output
## Installation
```bash
uv add rich
# Quick test
python -c "from rich import print; print('[bold green]Rich working![/]')"
```
## Core Concepts
### Console Object
```python
from rich.console import Console
console = Console()
# Basic output
console.print("Hello, World!")
# Styled output
console.print("[bold red]Error:[/] Something went wrong")
console.print("[green]Success![/] Operation completed")
```
### Markup Syntax
```python
"[bold]Bold[/]"
"[italic]Italic[/]"
"[red]Red text[/]"
"[blue on white]Blue on white background[/]"
"[bold red]Combined styles[/]"
"[link=https://example.com]Click here[/]"
```
### Drop-in Print Replacement
```python
from rich import print
print("[bold cyan]Styled text[/]")
print({"key": "value"}) # Auto-pretty-prints
```
## Tables
```python
from rich.console import Console
from rich.table import Table
console = Console()
table = Table(title="User List")
table.add_column("ID", style="cyan", justify="right")
table.add_column("Name", style="magenta")
table.add_column("Email", style="green")
table.add_column("Status", justify="center")
table.add_row("1", "Alice", "[email protected]", "✓ Active")
table.add_row("2", "Bob", "[email protected]", "✓ Active")
table.add_row("3", "Charlie", "[email protected]", "✗ Inactive")
console.print(table)
```
## Panels
```python
from rich.console import Console
from rich.panel import Panel
console = Console()
# Simple panel
console.print(Panel("Operation completed!"))
# Styled panel
console.print(Panel(
"[green]All tests passed![/]\n\n"
"Total: 42 tests\n"
"Time: 3.2s",
title="Test Results",
border_style="green"
))
# Error panel
console.print(Panel(
"[red]Connection refused[/]\n\n"
"Host: localhost:5432",
title="[bold red]Error[/]",
border_style="red"
))
```
## Progress Bars
### Simple Progress
```python
from rich.progress import track
import time
for item in track(range(100), description="Processing..."):
time.sleep(0.01)
```
### Multiple Tasks
```python
from rich.progress import Progress
with Progress() as progress:
task1 = progress.add_task("[red]Downloading...", total=100)
task2 = progress.add_task("[green]Processing...", total=100)
while not progress.finished:
progress.update(task1, advance=0.9)
progress.update(task2, advance=0.6)
time.sleep(0.02)
```
## Syntax Highlighting
```python
from rich.console import Console
from rich.syntax import Syntax
console = Console()
code = '''
def hello():
print("Hello, World!")
'''
syntax = Syntax(code, "python", theme="monokai", line_numbers=True)
console.print(syntax)
```
## Tree Displays
```python
from rich.console import Console
from rich.tree import Tree
console = Console()
tree = Tree("[bold blue]MyProject/[/]")
src = tree.add("[bold]src/[/]")
src.add("main.py")
src.add("config.py")
tests = tree.add("[bold]tests/[/]")
tests.add("test_main.py")
console.print(tree)
```
## Logging Integration
```python
import logging
from rich.logging import RichHandler
logging.basicConfig(
level=logging.INFO,
format="%(message)s",
handlers=[RichHandler(rich_tracebacks=True)]
)
logger = logging.getLogger("myapp")
logger.info("Application started")
logger.error("Connection failed")
```
## Pretty Tracebacks
```python
from rich.traceback import install
# Call once at startup
install(show_locals=True)
# All exceptions now have beautiful tracebacks
```
## Common Pitfalls
### Reuse Console Instance
```python
# ❌ Bad
def show(msg):
Console().print(msg) # Creates new instance each time
# ✅ Good
console = Console()
def show(msg):
console.print(msg)
```
### Escape User Input
```python
from rich.markup import escape
username = "user[admin]"
# ❌ Bad - brackets break markup
console.print(f"[blue]{username}[/]")
# ✅ Good
console.print(f"[blue]{escape(username)}[/]")
```
### Handle Non-TTY
```python
import sys
console = Console(force_terminal=sys.stdout.isatty())
```
## CLI Application Pattern
```python
import click
from rich.console import Console
from rich.panel import Panel
console = Console()
@click.command()
@click.argument('filename')
def process(filename):
console.print(f"[bold]Processing:[/] {filename}")
with console.status("[bold green]Working..."):
result = do_work(filename)
if result.success:
console.print(Panel(
f"[green]Processed {result.count} items[/]",
title="Success"
))
else:
console.print(f"[red]Error:[/] {result.error}")
```
## When NOT to Use Rich
- Non-interactive scripts (output piped)
- Server-side logging
- Performance-critical loops
- Minimal dependency requirements
## Related Resources
See `AgentUsage/rich_formatting.md` for complete documentation including:
- Advanced table customization
- Spinner and status displays
- Console recording
- Integration patterns
This skill helps you create beautiful terminal output with the Python Rich library: tables, progress bars, panels, syntax highlighting, trees, and pretty tracebacks. It is designed for CLI applications and developer tools that need structured, readable, and styled console feedback. Use it to make terminal output more informative and visually clear without complex terminal handling.
The skill provides patterns and ready-to-use snippets that build on Rich objects like Console, Table, Panel, Progress, Syntax, Tree, and RichHandler for logging. It shows how to instantiate and reuse Console, render styled markup, stream progress for single or multiple tasks, and integrate rich tracebacks and logging. Examples cover common flows: printing tables, showing status spinners, displaying panels for success/error, and pretty-printing code and exceptions.
Will Rich break output when piped to a file?
By default Rich detects TTY; configure Console(force_terminal=False) or check sys.stdout.isatty() and fall back to plain output when piped.
How do I avoid markup injection from user input?
Use rich.markup.escape on any user-provided strings before placing them inside markup tags.