#!/usr/bin/env node const commander = require('commander'); // Use a class override to customise the command and its subcommands. class CommandWithTrace extends commander.Command { createCommand(name) { const cmd = new CommandWithTrace(name); // Add an option to subcommands created using `.command()` cmd.option('-t, --trace', 'display extra information when run command'); return cmd; } } function inspectCommand(command) { // The option value is stored as property on command because we called .storeOptionsAsProperties() console.log(`Called '${command.name()}'`); console.log(`args: ${command.args}`); console.log('opts: %o', command.opts()); } const program = new CommandWithTrace('program') .option('-v, ---verbose') .action((options, command) => { inspectCommand(command); }); program .command('serve [params...]') .option('-p, --port ', 'port number') .action((params, options, command) => { inspectCommand(command); }); program.command('build ').action((buildTarget, options, command) => { inspectCommand(command); }); program.parse(); // Try the following: // node custom-command-class.js --help // node custom-command-class.js serve --help // node custom-command-class.js serve -t -p 80 a b c // node custom-command-class.js build --help // node custom-command-class.js build --trace foo