---
name: click
description: Best practices for building CLI applications with Click including commands, groups, options, and testing.
---

# Skill: Click

Best practices for building CLI applications with Click including commands, groups, options, and testing.

## When to Use

Apply this skill when building command-line interfaces with Click — commands, groups, options, arguments, and prompts.

## Commands

-   Use `@click.command()` for single commands, `@click.group()` for multi-command CLIs.
-   Declare options with `@click.option()` and positional args with `@click.argument()`.
-   Use `help=` on every option and command for auto-generated help text.
-   Use `envvar=` to allow environment variable fallback for sensitive options.

## Groups

-   Organize subcommands with `@click.group()` and `group.add_command()`.
-   Use `@click.pass_context` to share state between group and subcommands.

## Type Safety

-   Use Click's built-in types (`click.Path(exists=True)`, `click.Choice([...])`, `click.IntRange()`).
-   Use callbacks for custom validation.

## Testing

-   Use `click.testing.CliRunner()` for testing commands without subprocess overhead.
-   Assert on `result.exit_code` and `result.output`.
-   Use `mix_stderr=False` to test stderr separately.

## Pitfalls

-   Don't use `sys.exit()` — use `click.exceptions.Exit` or return from the command.
-   Don't use `print()` — use `click.echo()` for proper encoding handling.
-   Always handle `KeyboardInterrupt` / abort prompts gracefully.
