Files
gh-basher83-lunar-claude-pl…/skills/python-uv-scripts/patterns/cli-applications.md
2025-11-29 18:00:18 +08:00

2.2 KiB

CLI Application Patterns

Patterns for building command-line applications with uv scripts.

Basic CLI with Typer

#!/usr/bin/env -S uv run --script
# /// script
# requires-python = ">=3.11"
# dependencies = [
#   "typer>=0.9.0",
#   "rich>=13.0.0",
# ]
# ///

import typer
from rich import print

app = typer.Typer()

@app.command()
def main(
    name: str = typer.Argument(..., help="Your name"),
    greeting: str = typer.Option("Hello", "--greeting", "-g"),
):
    """Greet someone."""
    print(f"[green]{greeting}, {name}![/green]")

if __name__ == "__main__":
    app()

Multiple Subcommands

import typer

app = typer.Typer()

@app.command()
def create(name: str):
    """Create a new resource."""
    print(f"Creating: {name}")

@app.command()
def delete(name: str):
    """Delete a resource."""
    print(f"Deleting: {name}")

if __name__ == "__main__":
    app()

Usage:

./script.py create foo
./script.py delete bar

File Input/Output

import typer
from pathlib import Path

def process_file(
    input_file: Path = typer.Argument(..., exists=True),
    output: Path = typer.Option(None, "--output", "-o"),
):
    """Process a file."""
    content = input_file.read_text()

    # Process
    result = content.upper()

    if output:
        output.write_text(result)
        print(f"Written to: {output}")
    else:
        print(result)

Progress Bars

#!/usr/bin/env -S uv run --script
# /// script
# requires-python = ">=3.11"
# dependencies = [
#   "rich>=13.0.0",
# ]
# ///

from rich.progress import track
import time

for item in track(range(100), description="Processing..."):
    time.sleep(0.01)  # Simulate work

Formatted Tables

#!/usr/bin/env -S uv run --script
# /// script
# requires-python = ">=3.11"
# dependencies = [
#   "rich>=13.0.0",
# ]
# ///

from rich.console import Console
from rich.table import Table

console = Console()

table = Table(title="Results")
table.add_column("Name", style="cyan")
table.add_column("Status", style="green")

table.add_row("Task 1", "✓ Complete")
table.add_row("Task 2", "⏳ Pending")

console.print(table)

For complete template, see: assets/templates/cli-app.py