Create distinctive, user-respecting command-line interfaces with exceptional UX. Use this skill when the user asks to build CLI tools, scripts, or terminal applications...
This skill guides creation of command-line interfaces that respect users' time and intelligence. Implement real working CLIs with exceptional attention to ergonomics, error handling, and composability.
The user provides CLI requirements: a tool, script, or terminal application to build. They may include context about the purpose, target users, or technical constraints.
Before coding, understand the context and commit to a clear interaction model:
CLIs are conversations. Every invocation is a turn in a dialogue. Design for the user who runs your command wrong the first time—that's the normal case.
Then implement working code that is:
Simple by default, power available. The 90% use case should require zero flags. Advanced options exist but don't clutter basic usage.
Process files efficiently.
Options:
-o, --output
Run 'mytool --help-all' for advanced options.
Errors are teaching moments. Tell users what went wrong, why, and how to fix it.
Did you mean one of these? ./configs/config.yaml ./config.yml
Run 'mytool --help' for usage.
Human-readable by default. Machine-readable on request.
$ mytool status --json {"database":{"ok":true,"latency_ms":15},"cache":{"ok":true,"latency_ms":3},"api":{"ok":false,"error":"timeout"}}
Respect TTY detection—no colors in pipes. Confirm state changes ("Created config.json"). Show progress for anything over 1 second.
--output), short flags for frequency (-o)--help, --version, --verbose, --quiet, --dry-run, --force, --json$ mytool -v process data.csv # -v = --verbose $ mytool process data.csv -v # same result, order doesn't matter $ mytool --dry-run delete old/ # shows what would be deleted
- for stdin/stdoutApply configuration in this order: Flags → Environment → Project config → User config → Defaults.
Avoid hostile errors that leave users stranded:
Avoid breaking conventions that users expect:
-help instead of --help → Use GNU-style double-dash for long flagscmd -v file and cmd file -v work the sameAvoid user-hostile defaults:
--force to skip confirmation--yes or flag alternativesAvoid output crimes:
isatty() and respect NO_COLORYour CLI is well-designed when:
cmd --help gives them enough to complete basic tasks--json, no interactive prompts block automationA single-purpose tool needs minimal flags and maximum clarity—think cat, wc, head.
A multi-command suite needs consistent subcommand structure, shared flags, and shell completions—think git, docker, kubectl.
Don't add a plugin system to a grep replacement. Don't force a simple tool into a subcommand hierarchy it doesn't need.
The best CLIs feel like they were written by someone who uses the terminal 8 hours a day and has strong opinions about what makes tools pleasant to use. Channel that energy.