Smooth CLI operator for building command-line applications with subcommands, options, and automated help text generation.
npx @tessl/cli install tessl/npm-sade@1.8.0Sade is a small but powerful tool for building command-line interface (CLI) applications for Node.js that are fast, responsive, and helpful. It enables default commands, git-like subcommands, option flags with aliases, default option values with type-casting, required-vs-optional argument handling, command validation, and automated help text generation.
npm install --save sadeconst sade = require('sade');For ES modules:
import sade from 'sade';const sade = require('sade');
const prog = sade('my-cli');
prog
.version('1.0.5')
.option('--global, -g', 'An example global flag')
.option('-c, --config', 'Provide path to custom config', 'foo.config.js');
prog
.command('build <src> <dest>')
.describe('Build the source directory. Expects an `index.js` entry file.')
.option('-o, --output', 'Change the name of the output file', 'bundle.js')
.example('build src build --global --config my-conf.js')
.example('build app public -o main.js')
.action((src, dest, opts) => {
console.log(`> building from ${src} to ${dest}`);
console.log('> these are extra opts', opts);
});
prog.parse(process.argv);Sade is built around several key components:
Core factory function for creating CLI program instances with optional single-command mode.
/**
* Creates a new Sade CLI program instance
* @param {string} name - The name/usage pattern of the CLI program
* @param {boolean} [isSingle] - Enable single-command mode
* @returns {Sade} Chainable Sade instance
*/
function sade(name, isSingle);System for defining commands with usage patterns, descriptions, and argument handling.
/**
* Define a new command with usage pattern and options
* @param {string} usage - Command usage pattern with arguments
* @param {string} [desc] - Command description
* @param {object} [opts] - Options including alias and default
* @returns {Sade} Chainable instance
*/
command(usage, desc, opts);
/**
* Add description to current command
* @param {string|string[]} text - Description text
* @returns {Sade} Chainable instance
*/
describe(text);
/**
* Define aliases for current command
* @param {...string} names - Alias names
* @returns {Sade} Chainable instance
*/
alias(...names);Option flag system with aliases, descriptions, and default values.
/**
* Add option flag to current command
* @param {string} flags - Flag pattern (e.g., '-f, --force')
* @param {string} [desc] - Option description
* @param {*} [value] - Default value
* @returns {Sade} Chainable instance
*/
option(flags, desc, value);
/**
* Set program version
* @param {string} str - Version string
* @returns {Sade} Chainable instance
*/
version(str);
/**
* Add usage example to current command
* @param {string} str - Example usage string
* @returns {Sade} Chainable instance
*/
example(str);Action handler system for command execution and argument parsing.
/**
* Attach callback handler to current command
* @param {function} handler - Command handler function
* @returns {Sade} Chainable instance
*/
action(handler);
/**
* Parse command line arguments and execute appropriate handler
* @param {string[]} arr - Command line arguments (typically process.argv)
* @param {object} [opts] - Parsing options
* @returns {void|object} Void (executes handler) or LazyOutput if opts.lazy = true
*/
parse(arr, opts);Automated help text generation and display system.
/**
* Display help text for command or general help
* @param {string} [cmd] - Command name for specific help
* @returns {void} Prints to console
*/
help(cmd);// TypeScript definitions for better IDE support
interface Sade {
command(usage: string, description?: string, options?: CommandOptions): Sade;
option(flag: string, description?: string, value?: Value): Sade;
action(handler: Handler): Sade;
describe(text: Arrayable<string>): Sade;
alias(...names: string[]): Sade;
example(usage: string): Sade;
parse(arr: string[], opts: { lazy: true } & ParseOptions): LazyOutput;
parse(arr: string[], opts?: { lazy?: boolean } & ParseOptions): void;
version(value: string): Sade;
help(cmd?: string): void;
}
interface CommandOptions {
alias?: Arrayable<string>;
default?: boolean;
}
interface ParseOptions {
lazy?: boolean;
alias?: Record<string, string | string[]>;
default?: Record<string, any>;
unknown?: (flag: string) => string | void;
// Additional mri parsing options are also supported
}
interface LazyOutput {
name: string;
handler: Handler;
args: string[];
}
type Handler = (...args: any[]) => any;
type Value = number | string | boolean | null;
type Arrayable<T> = T | T[];