cli-kit
A command line application toolkit for Node.js.

Features
- Command line parsing
- Support for command hierarchies
- Auto-generated help
- CLI template engine
- External CLI extensions
- Automatic Node.js version enforcement
Installation
npm i cli-kit --save
Usage
import CLI from 'cli-kit';
(async () => {
const { argv, _ } = await new CLI({
options: {
'-f, --force': 'use the force',
'--timeout [value]': {
desc: 'the timeout duration',
type: 'int'
}
}
}).exec();
console.log('options:', argv);
console.log('args:', _);
})();
Architecture
In cli-kit, commands and options are grouped into "contexts". The main CLI instance defines the
"global context". Each command defines a new context. Each context can have its own commands,
options, and arguments. What you end up with is a hierarchy of contexts.
When cli-kit parses the command line arguments, it will check each argument against the global
context to see if the argument can be identified as a known command, option, or argument. If it
finds a command, it adds the command's context to a stack and re-parses any unidentified arguments.
This allows you to create deep and dynamic hierarchies of commands, options, and arguments.
API
class CLI
A CLI
intance defines a global context for which you add commands, options, and arguments.
Extends Context
> HookEmitter
.
constuctor(opts)
Example
const cli = new CLI({
args: [
'<arg1>',
'[arg2]',
'arg3',
{
name: 'arg4',
desc: undefined,
hidden: false,
multiple: false,
required: false,
type: 'string'
},
'arg4...'
],
camelCase: true,
commands: {
'some-command': {
action({ argv, _ }) {
console.log('options:', argv);
console.log('args:', _);
},
aliases: [ 'another-command' ],
args: [],
camelCase: true,
commands: {},
desc: undefined,
hidden: false,
options: {},
title: undefined
}
},
defaultCommand: undefined,
desc: undefined,
help: true,
helpExitCode: undefined,
name: 'program',
options: {
},
title: 'Global',
version: null
});
exec(args)
Parses the command line args and executes a command, if found.
-
args
: Array<String>
(optional)
An array of arguments. Each argument is expected to be a string.
Defaults to process.argv.slice(2)
.
Returns a Promise
that resolves an Arguments
object. This object will contain the parsed options
in argv
and arguments in _
.
Example
cli.exec()
.then(({ argv, _ }) => {
console.log('options:', argv);
console.log('args:', _);
});
class Context
Base class for CLI
and Command
classes.
Extends HookEmitter
.
argument(arg)
Adds an argument to a CLI
or Command
.
-
arg
: Argument
, Object
, or String
.
An argument descriptor. Either an Argument
instance or an Object
to pass into a Argument
constructor.
An argument requires a name
.
Returns a reference to the CLI
or Command
.
Example
cli.argument('foo');
cli.argument('[wiz]');
cli.argument('<pow>');
cli.argument({
name: 'bar',
type: 'int'
});
cli.argument(new Argument('baz'));
command(cmd, opts)
Adds a command to a CLI
or Command
.
TODO
option(optOrFormat, group, params)
Adds an option or group of options to a CLI
or Command
.
TODO
cli-kit vs other libraries
General | cli-kit | Caporal.js | Commander.js | dashdash | fields | getopts | inquirer | meow | minimist | mri | oclif | prompt | promptly | prompts | yargs |
---|
Latest version | 0.4.1 | 1.1.0 | 2.19.0 | 1.14.1 | 0.1.24 | 2.2.3 | 6.2.1 | 5.0.0 | 1.2.0 | 1.1.1 | 1.12.7 | 1.0.0 | 3.0.3 | 2.0.0 | 12.0.5 |
Actively maintained (within last year) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :warning: Last release Dec 2016 | :warning: Last release Jul 2015 | :white_check_mark: | :white_check_mark: | :white_check_mark: | :warning: Last release Sep 2015 | :white_check_mark: | :white_check_mark: | :warning: Last release Mar 2016 | :white_check_mark: | :white_check_mark: | :white_check_mark: |
License | MIT | MIT | MIT | MIT | MIT | MIT | MIT | MIT | MIT | MIT | MIT | MIT | MIT | MIT | MIT |
Language | JavaScript | JavaScript | JavaScript | JavaScript | JavaScript | JavaScript | JavaScript | JavaScript | JavaScript | JavaScript | TypeScript | JavaScript | JavaScript | JavaScript | JavaScript |
Async/promise support | :white_check_mark: | :white_check_mark: 1 | :x: | :x: | :x: | :x: | :white_check_mark: | :x: | :x: | :x: | :white_check_mark: 1 | :x: | :white_check_mark: | :white_check_mark: | :x: |
Data type coercion | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :white_check_mark: | :x: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | :x: | :white_check_mark: | :white_check_mark: |
User-defined input/output stream | :white_check_mark: | :x: | :x: | :x: | :x: | :x: | :white_check_mark: | :x: | :x: | :x: | :x: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: |
Parsing | cli-kit | Caporal.js | Commander.js | dashdash | fields | getopts | inquirer | meow | minimist | mri | oclif | prompt | promptly | prompts | yargs |
---|
Command | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | n/a | :x: | n/a | :x: | :x: | :x: | :white_check_mark: | n/a | n/a | n/a | :white_check_mark: |
Command aliases | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | n/a | :x: | n/a | :x: | :x: | :x: | :white_check_mark: | n/a | n/a | n/a | :white_check_mark: |
Subcommands | :white_check_mark: | :warning: 2 | :warning: 3 | :x: | n/a | :x: | n/a | :x: | :x: | :x: | :white_check_mark: | n/a | n/a | n/a | :warning: 2 |
Options | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | n/a | :white_check_mark: | n/a | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | n/a | n/a | n/a | :white_check_mark: |
Options aliases | :white_check_mark: | :x: | :x: | :white_check_mark: | n/a | :white_check_mark: | n/a | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | n/a | n/a | n/a | :white_check_mark: |
Custom option validator | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | n/a | :x: | n/a | :x: | :x: | :x: | :white_check_mark: | n/a | n/a | n/a | :x: 4 |
Flags (true/false) | :white_check_mark: | :x: | :white_check_mark: | :white_check_mark: | n/a | :white_check_mark: | n/a | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | n/a | n/a | n/a | :white_check_mark: |
Flag negation (--no-<name> ) | :white_check_mark: | :x: | :white_check_mark: | :x: | n/a | :x: | n/a | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | n/a | n/a | n/a | :white_check_mark: |
Argument support | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | n/a | :white_check_mark: | n/a | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | n/a | n/a | n/a | :white_check_mark: |
Custom argument validator | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | n/a | :x: | n/a | :x: | :x: | :x: | :white_check_mark: | n/a | n/a | n/a | :white_check_mark: |
Stop parsing -- | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | n/a | :white_check_mark: | n/a | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | n/a | n/a | n/a | :white_check_mark: |
Default option/argument values | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | n/a | :white_check_mark: | n/a | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | n/a | n/a | n/a | :white_check_mark: |
Environment variable support | :white_check_mark: | :x: | :x: | :white_check_mark: | n/a | :x: | n/a | :x: | :x: | :x: | :white_check_mark: | n/a | n/a | n/a | :white_check_mark: 5 |
Auto-generated help screen | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: 6 | n/a | :x: | n/a | :white_check_mark: | :x: | :x: | :white_check_mark: | n/a | n/a | n/a | :white_check_mark: |
Custom help exit code | :white_check_mark: | :x: | :x: | :x: | n/a | :x: | n/a | :white_check_mark: | :x: | :x: | :x: | n/a | n/a | n/a | :x: |
Prompting | cli-kit | Caporal.js | Commander.js | dashdash | fields | getopts | inquirer | meow | minimist | mri | oclif | prompt | promptly | prompts | yargs |
---|
Single-line text prompting | :grey_question: | n/a | n/a | n/a | :white_check_mark: | n/a | :white_check_mark: | n/a | n/a | n/a | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | n/a |
Multi-line text prompting | :grey_question: | n/a | n/a | n/a | :x: | n/a | :x: | n/a | n/a | n/a | :x: | :x: | :x: | :x: | n/a |
Password prompting | :grey_question: | n/a | n/a | n/a | :white_check_mark: | n/a | :white_check_mark: | n/a | n/a | n/a | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | n/a |
Confirm (yes/no) prompting | :grey_question: | n/a | n/a | n/a | :white_check_mark: 7 | n/a | :white_check_mark: | n/a | n/a | n/a | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | n/a |
Press any key to continue prompting | :grey_question: | n/a | n/a | n/a | :x: | n/a | :x: | n/a | n/a | n/a | :white_check_mark: | :x: | :white_check_mark: | :x: | n/a |
Inline list prompting | :grey_question: | n/a | n/a | n/a | :white_check_mark: 7 | n/a | :white_check_mark: 8 | n/a | n/a | n/a | :x: | :x: | :x: | :white_check_mark: 9 | n/a |
Numbered select list prompting | :grey_question: | n/a | n/a | n/a | :white_check_mark: | n/a | :white_check_mark: | n/a | n/a | n/a | :x: | :x: | :x: | :x: | n/a |
Scrollable select list prompting | :grey_question: | n/a | n/a | n/a | :x: | n/a | :white_check_mark: | n/a | n/a | n/a | :x: | :x: | :x: | :white_check_mark: | n/a |
Multi-select/checkbox list prompting | :grey_question: | n/a | n/a | n/a | :x: | n/a | :white_check_mark: | n/a | n/a | n/a | :x: | :x: | :x: | :white_check_mark: | n/a |
File/directory prompting | :grey_question: | n/a | n/a | n/a | :white_check_mark: | n/a | :white_check_mark: 10 | n/a | n/a | n/a | :x: | :x: | :x: | :x: | n/a |
Numeric-only prompting | :grey_question: | n/a | n/a | n/a | :x: | n/a | :x: | n/a | n/a | n/a | :x: | :x: | :x: | :white_check_mark: | n/a |
Date/time prompting | :grey_question: | n/a | n/a | n/a | :x: | n/a | :white_check_mark: 11 | n/a | n/a | n/a | :x: | :x: | :x: | :x: | n/a |
Multiple prompt chaining | :grey_question: | n/a | n/a | n/a | :white_check_mark: | n/a | :white_check_mark: | n/a | n/a | n/a | :x: | :x: | :x: | :white_check_mark: | n/a |
External editor support | :grey_question: | n/a | n/a | n/a | :x: | n/a | :white_check_mark: | n/a | n/a | n/a | :x: | :x: | :x: | :x: | n/a |
Custom value formatter/transformer | :grey_question: | n/a | n/a | n/a | :white_check_mark: 12 | n/a | :white_check_mark: 13 | n/a | n/a | n/a | :x: | :white_check_mark: 14 | :white_check_mark: 12 | :white_check_mark: | n/a |
Custom validation | :grey_question: | n/a | n/a | n/a | :x: | n/a | :white_check_mark: | n/a | n/a | n/a | :x: | :white_check_mark: | :white_check_mark: | :white_check_mark: | n/a |
Default prompt values | :grey_question: | n/a | n/a | n/a | :white_check_mark: | n/a | :white_check_mark: | n/a | n/a | n/a | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | n/a |
Prompt history | :grey_question: | n/a | n/a | n/a | :white_check_mark: | n/a | :white_check_mark: 15 | n/a | n/a | n/a | :x: | :white_check_mark: | :x: | :x: | n/a |
Auto-suggest mismatch | :grey_question: | n/a | n/a | n/a | :white_check_mark: | n/a | :white_check_mark: 16 | n/a | n/a | n/a | :x: | :white_check_mark: | :x: | :x: | n/a |
Autocomplete | :grey_question: | n/a | n/a | n/a | :white_check_mark: | n/a | :white_check_mark: | n/a | n/a | n/a | :x: | :x: | :x: | :white_check_mark: | n/a |
Custom prompt types/plugins | :grey_question: | n/a | n/a | n/a | :x: | n/a | :white_check_mark: | n/a | n/a | n/a | :x: | :x: | :x: | :x: | n/a |
Multiple answers (repeat prompt) | :grey_question: | n/a | n/a | n/a | :x: | n/a | :x: | n/a | n/a | n/a | :x: | :x: | :x: | :white_check_mark: | n/a |
Logging | cli-kit | Caporal.js | Commander.js | dashdash | fields | getopts | inquirer | meow | minimist | mri | oclif | prompt | promptly | prompts | yargs |
---|
Application logging | :white_check_mark: | :white_check_mark: 17 | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | :white_check_mark: | n/a | n/a | n/a | n/a |
Application debug logging | :white_check_mark: 18 | :x: | n/a | n/a | n/a | n/a | n/a | :white_check_mark: | n/a | :x: | :x: | n/a | n/a | n/a | n/a |
Internal debug logging | :white_check_mark: 18 | :x: | n/a | n/a | :x: | :x: | n/a | n/a | n/a | n/a | :white_check_mark: 19 | n/a | n/a | n/a | n/a |
Misc | cli-kit | Caporal.js | Commander.js | dashdash | fields | getopts | inquirer | meow | minimist | mri | oclif | prompt | promptly | prompts | yargs |
---|
Dedicated website | :white_check_mark: | :x: | :x: | :x: | :x: | :x: | :x: | :x: | :x: | :x: | :white_check_mark: | :x: | :x: | :x: | :white_check_mark: |
External CLI extensions | :white_check_mark: | :x: | :x: | :x: | n/a | n/a | n/a | :white_check_mark: | :x: | :x: | :white_check_mark: | n/a | n/a | n/a | :x: |
Internal hook system | :white_check_mark: | :x: | :x: | :x: | :x: | :x: | :x: | :x: | :x: | :x: | :white_check_mark: | :x: | :x: | :x: | :x: |
Bash completion | :grey_question: | :white_check_mark: | :x: | :white_check_mark: | n/a | :x: | n/a | :x: | :x: | :x: | :x: | n/a | n/a | n/a | :x: |
REPL | :grey_question: | :x: | :x: | :x: | :x: | :x: | :x: | :x: | :x: | :x: | :x: | :x: | :x: | :x: | :x: |
Built-in i18n support | :grey_question: | :x: | :x: | :x: | :white_check_mark: | :x: | :x: | :x: | :x: | :x: | :x: | :x: | :x: | :x: | :x: |
Project generator CLI | :grey_question: | :x: | :white_check_mark: 20 | :x: | :x: | :x: | :x: | :x: | :x: | :x: | :white_check_mark: | :x: | :x: | :x: | :white_check_mark: 21 |
Built-in update notifications | :grey_question: | :x: | :x: | :x: | :x: | :x: | :x: | :x: | :x: | :x: | :x: | :x: | :x: | :x: | :x: |
:sparkles: If you find any inaccuracies (aside from the version numbers), please feel free to submit a PR.
Who Uses cli-kit?
License
MIT