Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Build CLI tools with Commander.js. Use when creating command-line applications, parsing arguments, implementing subcommands, or building developer tools with flags and options.
.claude/skills/terminalskills-commander/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-08 | ✗→✓ | ▲ Improved | -10% | 0% |
| case-11 | ✗→✓ | ▲ Improved | -3% | 0% |
| case-18 | ✗→✓ | ▲ Improved | 17% | 0% |
| case-19 | ✗→✓ | ▲ Improved | -3% | 0% |
| case-21 | ✗→✓ | ▲ Improved | -24% | 0% |
Commander is the standard library for building Node.js CLIs. Parse arguments, define subcommands, generate help text, and handle options. Powers thousands of CLIs including create-react-app, eslint, and prisma.
typescript// cli.ts — CLI with commands and options import { Command } from 'commander' const program = new Command() .name('mytools') .description('Developer productivity toolkit') .version('1.0.0') program .command('init') .description('Initialize a new project') .argument('<name>', 'project name') .option('-t, --template <type>', 'project template', 'default') .option('--no-git', 'skip git initialization') .option('-d, --dry-run', 'show what would be created') .action(async (name, opts) => { console.log(`Creating project: ${name}`) console.log(`Template: ${opts.template}`) if (opts.dryRun) { console.log('(dry run)'); return } await createProject(name, opts) }) program .command('deploy') .description('Deploy to production') .option('-e, --env <environment>', 'target environment', 'production') .option('--force', 'skip confirmation') .action(async (opts) => { if (!opts.force) { const ok = await confirm(`Deploy to ${opts.env}?`) if (!ok) process.exit(0) } await deploy(opts.env) }) program.parse()
json{ "name": "mytools", "bin": { "mytools": "./dist/cli.js" }, "scripts": { "build": "tsc", "dev": "tsx src/cli.ts" } }
bash# Development npx tsx src/cli.ts init my-project --template react # After build + npm link mytools init my-project --template react mytools deploy --env staging mytools --help
--help from your command definitions.argument() for required positional args, option() for flags.--no-* flags automatically create boolean negations (e.g., --no-git → opts.git === false).| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | pass→pass | 11,260 | 11,908 | +6% | 1 | 1 | 0% | 2,279 | 2,851 | +25% | 0 | 0 | — |
case-02 | pass→pass | 9,944 | 9,358 | -6% | 1 | 1 | 0% | 2,043 | 2,177 | +7% | 0 | 0 | — |
case-03 | pass→pass | 12,952 | 9,489 | -27% | 1 | 1 | 0% | 2,567 | 2,702 | +5% | 0 | 0 | — |
case-04 | pass→pass | 13,456 | 7,898 | -41% | 1 | 1 | 0% | 2,573 | 2,163 | -16% | 0 | 0 | — |
case-05 | pass→pass | 10,068 | 3,490 | -65% | 1 | 1 | 0% | 1,894 | 1,203 | -36% | 0 | 0 | — |
case-06 | pass→pass | 8,025 | 2,932 | -63% | 1 | 1 | 0% | 1,691 | 1,105 | -35% | 0 | 0 | — |
case-07 | pass→pass | 7,773 | 3,360 | -57% | 1 | 1 | 0% | 1,725 | 1,189 | -31% | 0 | 0 | — |
case-08 | fail→pass | 8,206 | 4,261 | -48% | 1 | 1 | 0% | 1,569 | 1,409 | -10% | 0 | 0 | — |
case-09 | pass→pass | 9,352 | 3,933 | -58% | 1 | 1 | 0% | 1,810 | 1,352 | -25% | 0 | 0 | — |
case-10 | pass→pass | 11,583 | 4,716 | -59% | 1 | 1 | 0% | 2,239 | 1,477 | -34% | 0 | 0 | — |
case-11 | fail→pass | 8,224 | 4,055 | -51% | 1 | 1 | 0% | 1,340 | 1,304 | -3% | 0 | 0 | — |
case-12 | pass→pass | 11,358 | 5,703 | -50% | 1 | 1 | 0% | 2,208 | 1,383 | -37% | 0 | 0 | — |
case-13 | pass→pass | 10,093 | 4,037 | -60% | 1 | 1 | 0% | 1,932 | 1,332 | -31% | 0 | 0 | — |
case-14 | pass→pass | 7,487 | 3,997 | -47% | 1 | 1 | 0% | 1,448 | 1,255 | -13% | 0 | 0 | — |
case-15 | pass→pass | 15,464 | 3,803 | -75% | 1 | 1 | 0% | 2,249 | 1,395 | -38% | 0 | 0 | — |
case-16 | pass→pass | 3,108 | 2,633 | -15% | 1 | 1 | 0% | 491 | 1,020 | +108% | 0 | 0 | — |
case-17 | pass→pass | 6,480 | 5,133 | -21% | 1 | 1 | 0% | 1,218 | 1,659 | +36% | 0 | 0 | — |
case-18 | fail→pass | 4,655 | 3,427 | -26% | 1 | 1 | 0% | 863 | 1,010 | +17% | 0 | 0 | — |
case-19 | fail→pass | 13,209 | 8,074 | -39% | 1 | 1 | 0% | 2,122 | 2,050 | -3% | 0 | 0 | — |
case-20 | pass→pass | 15,086 | 9,862 | -35% | 1 | 1 | 0% | 2,513 | 2,388 | -5% | 0 | 0 | — |
case-21 | fail→pass | 8,827 | 4,034 | -54% | 1 | 1 | 0% | 1,698 | 1,288 | -24% | 0 | 0 | — |
case-22 | pass→pass | 6,169 | 3,509 | -43% | 1 | 1 | 0% | 1,154 | 1,298 | +12% | 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 +23 percentage points is the difference between those two pass rates over the 22 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.