A Python CLI feels small until every project repeats the same setup: argument parsing, config files, terminal UX, packaging, tests, and CI.
Before writing the business logic, I want this checklist covered.
The checklist
- Commands: clear command groups, help text, useful defaults, dry-run mode.
- Config: YAML/env loading, validation, path expansion, explicit precedence.
- Output: Rich tables/progress, machine-readable JSON mode, non-zero exits for automation.
- Tests: pytest, Click CliRunner coverage, config fixtures, failure-path checks.
- Packaging: pyproject.toml, console script entry point, reproducible dev commands.
- CI: lint, type check, tests, build on every push.
The point
The value of a CLI is the workflow it automates. The plumbing should be boring, repeatable, and already wired before you start.
CLIKit packages this foundation as a reusable Click + Rich + YAML config + pytest + GitHub Actions template.