Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Use when building CLI tools, implementing argument parsing, or adding interactive prompts. Invoke for parsing flags and subcommands, displaying progress bars and spinners, generating bash/zsh/fish completion scripts, CLI design, shell completions, and cross-platform terminal applications using commander, click, typer, or cobra.
.claude/skills/jeffallan-cli-developer/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-17 | ✓→✗ | ▼ Worse | 33% | 0% |
| case-04 | ✓→✓ | = Same ✓ | 33% | 0% |
| case-05 | ✓→✓ | = Same ✓ | 112% | 0% |
| case-06 | ✓→✓ | = Same ✓ | 101% | 0% |
| case-07 | ✓→✓ | = Same ✓ | 66% | 0% |
--help output before writing code.<cli> --help to verify help text renders correctly and <cli> --version to confirm version output.Load detailed guidance based on context:
| Topic | Reference | Load When | |-------|-----------|-----------| | Design Patterns | references/design-patterns.md | Subcommands, flags, config, architecture | | Node.js CLIs | references/node-cli.md | commander, yargs, inquirer, chalk | | Python CLIs | references/python-cli.md | click, typer, argparse, rich | | Go CLIs | references/go-cli.md | cobra, viper, bubbletea | | UX Patterns | references/ux-patterns.md | Progress bars, colors, help text |
js#!/usr/bin/env node // npm install commander const { program } = require('commander'); program .name('mytool') .description('Example CLI') .version('1.0.0'); program .command('greet <name>') .description('Greet a user') .option('-l, --loud', 'uppercase the greeting') .action((name, opts) => { const msg = `Hello, ${name}!`; console.log(opts.loud ? msg.toUpperCase() : msg); }); program.parse();
For Python (click/typer) and Go (cobra) quick-start examples, see references/python-cli.md and references/go-cli.md.
--help and --version flagsjs // Node.js const useColor = process.stdout.isTTY; python # Python import sys use_color = sys.stdout.isatty() go // Go import "golang.org/x/term" useColor := term.IsTerminal(int(os.Stdout.Fd()))
os.homedir() / os.UserHomeDir() / Path.home() instead.When implementing CLI features, provide:
CLI frameworks (commander, yargs, oclif, click, typer, argparse, cobra, viper), terminal UI (chalk, inquirer, rich, bubbletea), testing (snapshot testing, E2E), distribution (npm, pip, homebrew, releases), performance optimization
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 28,520 | 27,685 | -3% | 1 | 1 | 0% | 5,593 | 6,842 | +22% | 0 | 0 | — |
case-02 | fail→fail | 25,629 | 24,900 | -3% | 1 | 1 | 0% | 4,997 | 5,896 | +18% | 0 | 0 | — |
case-03 | fail→fail | 32,046 | 29,407 | -8% | 1 | 1 | 0% | 6,191 | 7,210 | +16% | 0 | 0 | — |
case-04 | pass→pass | 11,509 | 8,052 | -30% | 1 | 1 | 0% | 1,841 | 2,452 | +33% | 0 | 0 | — |
case-05 | pass→pass | 9,431 | 11,313 | +20% | 1 | 1 | 0% | 1,508 | 3,192 | +112% | 0 | 0 | — |
case-06 | pass→pass | 5,938 | 7,976 | +34% | 1 | 1 | 0% | 1,236 | 2,487 | +101% | 0 | 0 | — |
case-07 | pass→pass | 13,242 | 14,849 | +12% | 1 | 1 | 0% | 2,306 | 3,832 | +66% | 0 | 0 | — |
case-08 | pass→pass | 11,955 | 12,088 | +1% | 1 | 1 | 0% | 2,101 | 3,225 | +53% | 0 | 0 | — |
case-09 | fail→fail | 17,287 | 15,200 | -12% | 1 | 1 | 0% | 2,872 | 3,590 | +25% | 0 | 0 | — |
case-10 | pass→pass | 17,417 | 13,520 | -22% | 1 | 1 | 0% | 2,813 | 3,534 | +26% | 0 | 0 | — |
case-11 | pass→pass | 11,860 | 13,031 | +10% | 1 | 1 | 0% | 2,248 | 3,093 | +38% | 0 | 0 | — |
case-12 | pass→pass | 13,611 | 18,996 | +40% | 1 | 1 | 0% | 2,514 | 4,767 | +90% | 0 | 0 | — |
case-13 | pass→pass | 11,739 | 10,383 | -12% | 1 | 1 | 0% | 2,142 | 2,842 | +33% | 0 | 0 | — |
case-14 | pass→pass | 11,182 | 11,638 | +4% | 1 | 1 | 0% | 2,067 | 3,165 | +53% | 0 | 0 | — |
case-15 | pass→pass | 7,037 | 10,539 | +50% | 1 | 1 | 0% | 1,307 | 2,947 | +125% | 0 | 0 | — |
case-16 | pass→pass | 19,281 | 18,489 | -4% | 1 | 1 | 0% | 3,559 | 4,591 | +29% | 0 | 0 | — |
case-17 | pass→fail | 14,359 | 11,961 | -17% | 1 | 1 | 0% | 2,432 | 3,225 | +33% | 0 | 0 | — |
case-18 | pass→pass | 9,130 | 6,814 | -25% | 1 | 1 | 0% | 1,534 | 2,125 | +39% | 0 | 0 | — |
case-19 | pass→pass | 11,386 | 12,924 | +14% | 1 | 1 | 0% | 2,169 | 3,343 | +54% | 0 | 0 | — |
case-20 | pass→pass | 15,498 | 11,123 | -28% | 1 | 1 | 0% | 1,919 | 2,891 | +51% | 0 | 0 | — |
case-21 | pass→pass | 13,179 | 9,667 | -27% | 1 | 1 | 0% | 2,015 | 2,708 | +34% | 0 | 0 | — |
case-22 | pass→pass | 10,776 | 9,585 | -11% | 1 | 1 | 0% | 1,676 | 2,571 | +53% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of -5 percentage points is the difference between those two pass rates over the 22 comparable cases. 1 case got worse with the skill loaded, and it is included in that figure.
Other measured skills in the registry, with their headline benchmark lift.