From software-craft
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. Generates well-crafted CLIs that follow platform conventions and treat users as humans, not machines.
How this skill is triggered — by the user, by Claude, or both
Slash command
/software-craft:cli-designThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
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.
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.
<cli_design_thinking>
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:
<cli_ux_guidelines>
Simple by default, power available. The 90% use case should require zero flags. Advanced options exist but don't clutter basic usage.
<example_good title="Progressive help">
$ mytool --help Usage: mytool
Process files efficiently.
Options: -o, --output Output location (default: stdout) -h, --help Show this help
Run 'mytool --help-all' for advanced options. </example_good>
Errors are teaching moments. Tell users what went wrong, why, and how to fix it.
<example_bad title="Hostile error"> $ mytool config.yaml Error: invalid input </example_bad>
<example_good title="Helpful error"> $ mytool config.yaml Error: Cannot read 'config.yaml': file not found
Did you mean one of these? ./configs/config.yaml ./config.yml
Run 'mytool --help' for usage. </example_good>
Human-readable by default. Machine-readable on request.
<example_good title="Output modes">
$ mytool status ✓ Database: connected (15ms) ✓ Cache: healthy (3ms) ✗ API: timeout after 5000ms
$ mytool status --json {"database":{"ok":true,"latency_ms":15},"cache":{"ok":true,"latency_ms":3},"api":{"ok":false,"error":"timeout"}} </example_good>
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<example_good title="Standard flags"> $ mytool --version mytool 2.1.0
$ 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 </example_good>
- for stdin/stdout<example_good title="Stdin support"> $ cat data.csv | mytool process - $ mytool process - < data.csv $ mytool process data.csv -o - # output to stdout </example_good>
Apply configuration in this order: Flags → Environment → Project config → User config → Defaults.
<example_good title="Config precedence"> $ mytool --output /tmp/out.txt # 1. Flag wins $ MYTOOL_OUTPUT=/var/out.txt mytool # 2. Env var
</example_good> </cli_ux_guidelines>
<cli_anti_patterns>
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_COLOR<cli_success_criteria>
Your CLI is well-designed when:
cmd --help gives them enough to complete basic tasks--json, no interactive prompts block automation<cli_complexity_matching>
A 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. </cli_complexity_matching>
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.
npx claudepluginhub bengous/claude-code-plugins --plugin software-craftDesigns CLI surfaces including args/flags/subcommands/help/output/errors/config for new tools. Audits existing CLIs for consistency, composability, and agent ergonomics.
Designs, reviews, and improves CLI user interfaces: command structures, subcommands, flags, arguments, help text, and terminal output formatting. For new CLI tools or usability enhancements.
CLI application design: argument conventions, output streams, exit codes, configuration hierarchy, interactive modes, and terminal UX. Invoke whenever task involves any interaction with command-line tools or terminal applications — building, reviewing, debugging, or designing CLI interfaces.