
Adding A Command
Creates a new CLI command following the Commander.js pattern in src/commands/.
Install
npx skills add caliber-ai-org/ai-setup --skill adding-a-command -g -a claude-code -y- Repository
- caliber-ai-org/ai-setup1.3k
- Category
- Engineering
- Updated
- 1mo ago
- License
- MIT
- Context cost
- Mediumabout 1,863 tokens
- Runs scripts
- No, instructions only
What it does
Creates a new CLI command following the Commander.js pattern in src/commands/. Handles command registration in src/cli.ts, telemetry tracking via tracked() wrapper, and option parsing. Use when user says add command, new CLI command, create subcommand, or adds files to src/commands/. Do NOT use for modifying existing commands or fixing bugs in existing commands.
Adding a Command
Critical
- Export pattern: Command must export a named async function:
export async function myCommand(options?: OptionType). Never use default exports. - Registration in cli.ts: Every command must be imported and registered with
.command()chain insrc/cli.ts, wrapped withtracked()for telemetry. - Error signaling: Use
throw new Error('__exit__')to exit gracefully without printing the error message. Use chalk for user-facing messages. - Options typing: Commands receiving options must define a TypeScript interface for those options. Pass options as a destructured object parameter.
Instructions
-
Create the command file at
src/commands/{commandName}.tswith named async export.- Signature:
export async function {commandName}Command(options?: { optionName?: optionType }) { ... } - Import only what you need (avoid kitchen-sink imports).
- Return void (handle all output via console.log or chalk).
- Verify the file follows the naming convention: camelCase function + "Command" suffix.
- Signature:
-
Handle errors consistently: Wrap error-prone operations in try/catch. Distinguish between user errors and system errors:
- User error (bad input):
console.error(chalk.red('message')); throw new Error('__exit__'); - System error (missing dependency):
throw new Error('Detailed error message');, this will print and exit with code 1. - Parse-like errors: Use ora spinner with
.fail()before throwing. - This step prevents double error printing in bin.ts.
- User error (bad input):
