Building CLI Tools
Create command-line tools with Node.js. Learn argument parsing and colors.
Building CLI Tools
Node.js is perfect for creating command-line tools.
Basic CLI Script
```javascript #!/usr/bin/env node
console.log('Hello from CLI!'); ```
```bash chmod +x cli.js ./cli.js ```
Parsing Arguments with Commander
```bash npm install commander ```
```javascript #!/usr/bin/env node const { program } = require('commander');
program .name('my-tool') .description('A useful CLI tool') .version('1.0.0');
program .command('create <name>') .description('Create a new project') .option('-t, --template <type>', 'Template type', 'basic') .action((name, options) => { console.log(`Creating project: ${name}`); console.log(`Template: ${options.template}`); });
program .command('list') .description('List all projects') .action(() => { console.log('Listing projects...'); });
program.parse(); ```
**Usage:** ```bash my-tool create my-app --template react my-tool list ```
Adding Colors
```bash npm install chalk ```
```javascript const chalk = require('chalk');
console.log(chalk.green('✓ Success!')); console.log(chalk.red('✗ Error occurred')); console.log(chalk.yellow('⚠ Warning')); console.log(chalk.blue('ℹ Info')); ```
Interactive Prompts
```bash npm install inquirer ```
```javascript const inquirer = require('inquirer');
async function getUserInput() { const answers = await inquirer.prompt([ { type: 'input', name: 'projectName', message: 'Project name:', default: 'my-app' }, { type: 'list', name: 'template', message: 'Choose template:', choices: ['React', 'Vue', 'Express'] }, { type: 'confirm', name: 'installDeps', message: 'Install dependencies?', default: true } ]); return answers; }
const config = await getUserInput(); console.log(config); ```
Progress Indicators
```bash npm install ora ```
```javascript const ora = require('ora');
const spinner = ora('Installing packages...').start();
setTimeout(() => { spinner.succeed('Packages installed!'); }, 3000); ```
Real Example: Project Generator
```javascript #!/usr/bin/env node const { program } = require('commander'); const inquirer = require('inquirer'); const chalk = require('chalk'); const ora = require('ora'); const fs = require('fs');
program .command('create <name>') .action(async (name) => { const answers = await inquirer.prompt([ { type: 'list', name: 'template', message: 'Choose template:', choices: ['React', 'Vue', 'Express'] } ]); const spinner = ora('Creating project...').start(); fs.mkdirSync(name); fs.writeFileSync(`${name}/package.json`, JSON.stringify({ name, version: '1.0.0', template: answers.template }, null, 2)); spinner.succeed(chalk.green(`Project ${name} created!`)); });
program.parse(); ```
Publishing to npm
```json { "name": "my-cli-tool", "version": "1.0.0", "bin": { "my-tool": "./cli.js" }, "dependencies": { "commander": "^11.0.0", "chalk": "^5.3.0" } } ```
```bash npm publish
npm install -g my-cli-tool
my-tool create my-app ```
Key Takeaway
Use commander for arguments, chalk for colors, inquirer for prompts, ora for spinners. Add shebang and bin field in package.json. Publish to npm for global installation.