skills/python-typer/SKILL.md
Use when building or structuring Python CLI commands with Typer, including commands, options, and multi-command apps.
npx skillsauth add narumiruna/agent-skills python-typerInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Use Typer for ergonomic CLI construction. Core principle: keep command wiring thin, explicit, and testable while moving business logic into regular Python functions.
uv add typer
| Task | Pattern |
| --- | --- |
| Single command | @app.command() |
| Options | function args with defaults |
| Multiple commands | multiple @app.command() |
| Module run | uv run python -m <package>.cli --help |
| Script run | uv run python cli.py --help |
| CLI tests | CliRunner().invoke(app, [...]) |
typer.Typer() app in cli.py.if __name__ == "__main__": app() for script/module execution or a project console script in pyproject.toml.uv run python -m <module> or uv run python cli.py.typer.testing.CliRunner.import typer
app = typer.Typer()
@app.command()
def greet(name: str, count: int = 1) -> None:
for _ in range(count):
typer.echo(f"Hello, {name}!")
if __name__ == "__main__":
app()
Usage:
uv run python cli.py --help
uv run python cli.py Alice
uv run python cli.py Alice --count 3
Module entry point:
uv run python -m my_package.cli --help
Multiple commands:
import typer
app = typer.Typer()
@app.command()
def create(name: str) -> None:
"""Create a new item."""
typer.echo(f"Creating {name}...")
@app.command()
def delete(name: str, force: bool = False) -> None:
"""Delete an item."""
if not force:
if not typer.confirm(f"Delete {name}?"):
raise typer.Abort()
typer.echo(f"Deleted {name}")
if __name__ == "__main__":
app()
CLI test:
from typer.testing import CliRunner
from my_package.cli import app
runner = CliRunner()
def test_greet() -> None:
result = runner.invoke(app, ["Alice", "--count", "2"])
assert result.exit_code == 0
assert "Hello, Alice!" in result.stdout
if __name__ == "__main__" for script entry.uv run.development
Maintains concise repository MEMORY.md notes for gotchas, stale memory corrections, and durable user preferences. Use at the start of repository conversations, when the user mentions MEMORY.md, when an error should be remembered to avoid repeating it, or when MEMORY.md content may be wrong.
testing
Use only when the user explicitly names the work-log-writer skill; never auto-activate from generic work log, daily log, EOD summary, status update, or date-range summary requests.
development
Use when implementing non-trivial code changes that should follow TDD (write a failing test first, make the smallest passing change, then refactor safely).
tools
Use when designing, implementing, reviewing, or debugging Codex CLI hooks, including `hooks.json`, `.codex/hooks.json`, feature-flag setup, matcher behavior, event-specific stdin/stdout payloads, and hook scripts for `SessionStart`, `PreToolUse`, `PostToolUse`, `UserPromptSubmit`, or `Stop`.