CLI library for node.js
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Failed to load latest commit information.
examples v bump Sep 1, 2014
images added cupboard hooks Nov 4, 2011
lib Error handling when unknown command is called Oct 9, 2014
.cupboard v bump Sep 1, 2014
.gitignore rm node_modules Sep 1, 2014
.npmignore v bump Sep 1, 2014
MIT-LICENSE.txt added cupboard hooks Nov 4, 2011 Update Oct 8, 2015
npm-debug.log v bump Sep 1, 2014
package.json v bump Sep 1, 2014
project.sublime-project v bump Sep 1, 2014
project.sublime-workspace v bump Sep 1, 2014
project.tmproj v bump Sep 1, 2014

This library is not actively maintained.


Alt command line


  • History (up/down arrows)
  • Progress Bar
  • Loading/busy spinner
  • Password input
  • Confirmation
  • Prompt
  • Parse command line args
  • help menu, and sub help menu
  • Multi-line tables
  • Build flexible commands via beanpole
    • OR statement
    • Middleware
    • Parameters
  • Trees
  • Exposing Javascript, and calling it from the command line - inspired by mongo's CLI utilitiy

To Do:

  • Help menu api
  • Title View
  • Custom colors for each view (input, loader, progress, table, etc.): exports.colors = {}
  • Error handling (display of command not found)
  • Add transports instead of depending on native stdin/stdout
    • Ability to use online


.option(cmdOrOps, descOrCallback, callback)

Listens for a key (enter, up, left, backspace, etc.), or command. See beanpole for documentation.

Hello World:

var celeri = require('celeri');

//an option with info for the help menu
    command: 'hello :person',
    description: 'Prints "hello [person]!"',
    optional: {
        '--age': 'The person\'s age',
        '--gender': 'The person\'s gender'
}, function(data) {

   console.log("Hello %s!", data.person);

   if(data.age) console.log("%s is %d years old.", data.person, data.age); 
   if(data.gender) console.log("%s is a %s.", data.person, data.gender); 


//parse the command line args

Interactive in terminal:

# node ./cmd ↩
> hello craig ↩
hello craig!

passed as arguments:

# node ./hello hello craig --age=21 --gender=cat ↩
hello craig!
craig is 21 years old.
craig is a cat.

Help menu:

# node ./cmd help ↩

Usage: [command] --arg=value --arg2

  help        Show help menu
  [cmd] help  Show command help menu

  hello       Prints "hello [person]!""

Command Specific help menu:

# node ./cmd hello help  ↩

Prints "hello [person]!""

Usage: hello [person]

Optional Flags: 
  --age       The person's age
  --gender    The person's gender


Sets the help menu usage text

celeri.usage('[command] --arg=value');

"OR" statement:

celeri.option('hello :name OR hi :name', 'some description', function(data)
    console.log('Hello ' + +'!');
option('set address :zip OR set address :city :state :zip', function(data)
    console.log("City: %s, State: %s, Zip: %s ", || 'None provided', data.state || 'None provided',;


You can easily expose javascript functions by providing an object:

var api = {
    sayHello: function(name) {
        console.log("hello %s!", name || 'craig');

celeri.onJs({ api: api });

In terminal:

node ./hello ↩
> api.sayHello("john"); ↩
hello john!

.progress(label, percent)

var i = 0;

var interval = setInterval(function()
    celeri.progress('Label: ', i++);

    if(i == 100) clearInterval(interval);
}, 10);


var spinner = celeri.loading('Processing: ');

    spinner.done(true);//undefined = done, true = success, false = fail
}, 1000);

.prompt(label, callback)

celeri.prompt('Username: ', function(input)


.confirm(message, callback)

celeri.confirm("Do you want to continue?", function(yes)

.password(label[, mask], callback)

//mask = *
celeri.password('Password: ', '*', function(input)

//no mask
celeri.password('Password: ', function(input)


celeri.auth(function(user, pass)
    //auth here

.drawTable(objects, ops)

var objects = [

        name: 'Craig',
        age: 21,
        interests: 'Cooking, espresso, backpacking, coding'

        name: 'Tim',
        age: 21,
        interests: 'Design, Traveling, Photography'



celeri.drawTable(objects, {
    columns: ['name','age','interests']

Gives you something like:

Alt command line

Here's a multi-line table:

Alt command line


Draws a tree

//print out the contents of the celeri object

Here's another example:

Alt command line

Let's kick it up a notch

var celeri = require('../lib');

var credentials;

celeri.option('login OR login :user :pass', function(data)

    //reference to the current request
    var self = this;

    //called after auth credentials have been entered in
    function onAuth(creds)

        //credits wrong? DO NOT CONTINUE
        if(creds.user != 'user' || creds.pass != 'pass')
            return console.log("Incorrect user / pass".red);

        //otherwise, add the user to the CURRENT request so it can be passed
        //onto the next route listener
        self.user = creds.user;

        //cache the credentials so the user doesn't have to login each time
        credentials = creds;

        //not another listener? display a success response
        if(! console.log("Logged in as %s",;

    //user already logged in? pass!

    //otherwise check if the user is passed in the route
    if(data.user && data.pass)

    //or prompt for authentication
        celeri.auth(function(user, pass)
            onAuth({ user: user, pass: pass });

 * This stuff's private. The user has to be authenticated *before* this command is executed

celeri.option('login -> account', function()
    console.log('Here\'s your account info %s!',;


Here's what you get:

Alt command line