API Reference
createCLI
Create a new CLI instance with configuration
createCLI
Creates a new CLI instance with global configuration.
Syntax
function createCLI(config: CLIConfig): CLIParameters
config
The configuration object for your CLI.
interface CLIConfig {
name: string
version: string
description?: string
commands?: {
manifest?: string
}
plugins?: PluginConfig[]
}Returns
A CLI instance with the following methods:
interface CLI {
command(cmd: Command): void
load(manifest: CommandManifest): Promise<void>
init(): Promise<void>
run(argv?: string[]): Promise<void>
}Examples
Basic Usage
import { createCLI } from '@bunli/core'
const cli = createCLI({
name: 'my-cli',
version: '1.0.0',
description: 'My awesome CLI tool'
})
// Add commands
cli.command({
name: 'hello',
description: 'Say hello',
handler: async () => {
console.log('Hello, World!')
}
})
// Run the CLI
await cli.run()With Command Manifest
import { createCLI } from '@bunli/core'
const cli = createCLI({
name: 'my-cli',
version: '1.0.0',
description: 'My CLI with lazy-loaded commands',
commands: {
manifest: './commands/manifest.js'
}
})
// Initialize (loads manifest)
await cli.init()
// Run the CLI
await cli.run()Loading Commands Manually
import { createCLI } from '@bunli/core'
import manifest from './commands/manifest.js'
const cli = createCLI({
name: 'my-cli',
version: '1.0.0'
})
// Load commands from manifest
await cli.load(manifest)
// Run the CLI
await cli.run()With Plugins
import { createCLI } from '@bunli/core'
import { configMergerPlugin } from '@bunli/plugin-config'
import { aiAgentPlugin } from '@bunli/plugin-ai-detect'
const cli = await createCLI({
name: 'my-cli',
version: '1.0.0',
plugins: [
// Load configuration from files
configMergerPlugin(),
// Detect AI agents
aiAgentPlugin({ verbose: true })
] as const // Use 'as const' for better type inference
})
// Commands can access plugin store
cli.command({
name: 'info',
handler: async ({ context }) => {
if (context?.env.isAIAgent) {
console.log('Running in AI agent!')
console.log(`Agents: ${context.store.aiAgents.join(', ')}`)
}
}
})
await cli.run()CLI Methods
command(cmd)
Add a command to the CLI.
cli.command({
name: 'build',
description: 'Build the project',
handler: async () => {
// Command implementation
}
})load(manifest)
Load commands from a manifest for lazy loading.
const manifest = {
build: () => import('./commands/build.js'),
test: () => import('./commands/test.js'),
deploy: () => import('./commands/deploy.js')
}
await cli.load(manifest)init()
Initialize the CLI. This loads commands from the manifest if configured.
await cli.init()run(argv?)
Run the CLI with the given arguments. If no arguments are provided, uses process.argv.slice(2).
// Use process arguments
await cli.run()
// Use custom arguments
await cli.run(['build', '--watch'])Automatic Features
When you create a CLI with createCLI, you get:
- Automatic help generation -
--helpflag shows available commands - Version display -
--versionflag shows CLI version - Command routing - Automatically routes to the correct command
- Error handling - Friendly error messages for unknown commands
- Nested command support - Commands can have subcommands
- Alias support - Commands can have shortcuts
- Plugin system - Extend functionality with type-safe plugins
- Type-safe context - Plugin stores are fully typed in commands
Help Output
Running with --help shows:
$ my-cli --help
my-cli v1.0.0
My awesome CLI tool
Commands:
hello Say hello
build Build the project
test Run testsError Handling
Unknown commands show helpful messages:
$ my-cli unknown
Unknown command: unknownThe CLI automatically handles help flags at any level. For example, my-cli build --help shows help for the build command specifically.
See Also
- defineCommand - Define type-safe commands
- Plugins - Learn about the plugin system
- Plugin API - Plugin API reference
- Command Manifests - Learn about lazy loading
- Configuration - CLI configuration options