Package Exports
- cac
This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (cac) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.
Readme

Introduction
Command And Conquer, the queen living in your command line, is a minimalistic but pluggable CLI framework.
Install
yarn add cac
Table of contents
Usage
Use ./examples/simple.js
as example:
const cac = require('cac')
const cli = cac()
// Add a default command
const defaultCommand = cli.command('*', {
desc: 'The default command'
}, (input, flags) => {
if (flags.age) {
console.log(`${input[0]} is ${flags.age} years old`)
}
})
defaultCommand.option('age', {
desc: 'tell me the age'
})
// Add a sub command
cli.command('bob', {
desc: 'Command for bob'
}, () => {
console.log('This is a command dedicated to bob!')
})
// Bootstrap the CLI app
cli.parse()
Then run it:

And the Help Documentation is ready out of the box:

The Help Documentation will be command-specific when you are using --help
with a sub command, like below:

Friends
Projects that use CAC:
- SAO: ⚔️ Futuristic scaffolding tool.
- DocPad: 🏹 Powerful Static Site Generator.
- Poi: ⚡️ Delightful web development.
- bili: 🥂 Schweizer Armeemesser for bundling JavaScript libraries.
- lass: 💁🏻 Scaffold a modern package boilerplate for Node.js.
- Feel free to add yours here...
Documentation
CLI instance
You can create a CLI instance as follows:
const cli = cac(options)
options
argument is optional here:
options.bin
: The CLI bin name to show in help message when--help
flag is used.options.defaultOpts
: By default we add serveral global command options like--help
and--version
, however you can disable them all by setting it tofalse
or configure them individually as follow:options.defaultOpts.help
:true
Show help message when--help
flag is used, alias flag-h
.options.defaultOpts.version
:true
Show version number when--version
flag is used, alias flag-v
.
cli.option(name, [option])
Register an option globally, i.e. for all commands
- name:
string
option name - option:
object
string
- desc:
string
description - alias:
string
Array<string>
option name alias - type:
string
option type, valid values:boolean
string
- default:
any
option default value - required:
boolean
mark option as required - choices:
Array<any>
limit valid values for the option
- desc:
cli.command(name, [option], [handler])
- name:
string
- option:
object
string
(string
is used asdesc
)- desc:
string
description - alias:
string
Array<string>
command name alias - examples:
Array<string>
command examples - match:
(name: string) => boolean
A custom command matcher
- desc:
- handler:
function
command handler- input:
Array<string>
cli arguments - flags:
object
cli flags
- input:
const command = cli.command('init', 'init a new project', (input, flags) => {
const folderName = input[0]
console.log(`init project in folder ${folderName}`)
})
cli.command
returns a command instance.
command
command.option(name, [option])
Same as cli.option but it adds options for specified command.
cli.parse([argv], [option])
- argv:
Array<string>
Defaults toprocess.argv.slice(2)
- option
- run:
boolean
Defaults totrue
Run command after parsed argv.
- run:
cli.showHelp()
Display cli helps, must be called after cli.parse()
cli.use(plugin)
- plugin:
Plugin
Array<Plugin>
Apply a plugin to cli instance:
cli.use(plugin(options))
function plugin(options) {
return cli => {
// do something...
}
}
cli.bin
Type: string
The filename of executed file.
e.g. It's cli.js
when you run node ./cli.js
.
cli.argv
A getter which simply returns cli.parse(null, { run: false })
cli.extraHelp(help)
Add extra help messages to the bottom of help.
help
Type: string
object
The help
could be a string
or in { title, body }
format.
Events
error
Error handler for errors in your command handler:
cli.on('error', err => {
console.error('command failed:', err)
process.exit(1)
})
parsed
Emit after CAC parsed cli arguments:
cli.on('parsed', (command, input, flags) => {
// command might be undefined
})
executed
Emit after CAC executed commands or outputed help / version number:
cli.on('executed', (command, input, flags) => {
// command might be undefined
})
FAQ
Why not commander.js
yargs
caporal.js
or meow
?
CAC
is simpler and less opinionated comparing to commander.js
yargs
caporal.js
.
Commander.js does not support chaining option which is a feature I like a lot. It's not really actively maintained at the time of writing either.
Yargs has a powerful API, but it's so massive that my brain trembles. Meow is simple and elegant but I have to manully construct the help message, which will be annoying. And I want it to support sub-command too.
And none of them are pluggable.
So why creating a new thing instead of pull request?
I would ask me myself why there's preact
instead of PR to react
, and why yarn
instead of PR to npm
? It's obvious.
CAC is kind of like a combination of the simplicity of Meow and the powerful features of the rest. And our help log is inspired by Caporal.js, I guess it might be the most elegant one out there?

How is the name written and pronounced?
CAC, not Cac or cac, pronounced C-A-C
.
And this project is dedicated to our lovely C.C. sama. Maybe CAC stands for C&C as well :P

Contributing
- Fork it!
- Create your feature branch:
git checkout -b my-new-feature
- Commit your changes:
git commit -am 'Add some feature'
- Push to the branch:
git push origin my-new-feature
- Submit a pull request :D
Author
cac © egoist, Released under the MIT License.
Authored and maintained by egoist with help from contributors (list).
egoist.moe · GitHub @egoist · Twitter @_egoistlily