commander-pro
v4.0.0
Published
进阶 CLI 框架 v4 — Advanced CLI framework with subcommands, auto validation, help, completions, plugins, remote command loading, and interactive prompts
Maintainers
Readme
commander-pro v4
进阶 CLI 框架 — Advanced Node.js CLI framework.
Subcommands, auto validation, plugins, remote command loading, dynamic shell completions, interactive prompts.
npm install commander-proQuick Start
const { program } = require('commander-pro')
program.name('my-cli').version('1.0.0')
program
.command('deploy')
.argument('<env>', '', { choices: ['dev', 'staging', 'prod'] })
.option('--tag <t>', '', { default: 'latest' })
.action((env, opts) => {
console.log(`Deploy to ${env} with ${opts.tag}`)
})
program.parse(process.argv)Remote Command Loading (v4)
Load command definitions from a remote HTTP endpoint at runtime.
One-time fetch
const cli = new Program({ name: 'my-cli' })
await cli.fetchRemote('https://api.example.com/commands', {
executeUrl: 'https://api.example.com/execute',
timeout: 10000,
})Auto-refresh
cli.loadRemote('https://api.example.com/commands', {
executeUrl: 'https://api.example.com/execute',
interval: 60000, // refresh every 60s
cacheFile: '/tmp/remote-commands.json', // offline fallback
headers: { 'Authorization': 'Bearer token123' },
})Remote commands format
The remote endpoint should return JSON:
{
"commands": [
{
"name": "deploy",
"description": "Deploy to environment",
"arguments": [
{ "spec": "<env>", "description": "Environment name" }
],
"options": [
{ "flags": "--tag <t>", "description": "Docker tag" }
]
},
{
"name": "status",
"description": "Check system status"
}
],
"execute": "https://api.example.com/execute"
}Remote execution
When a remote command is invoked, it POSTs to the execute URL with:
{
"command": "deploy",
"arguments": ["production"],
"options": { "tag": "v2.0" }
}The execute endpoint returns:
{ "output": "Deploying production with tag v2.0...", "error": null }The execute URL can be set globally (in the response) or per-command.
Plugin System
cli.use({
name: 'aws',
commands: [{
name: 's3', arguments: ['<action>'],
action: (action, opts) => { console.log('s3 ' + action) },
}],
})
cli.loadPlugins() // auto-discover from node_modules
cli.loadCommands('./commands.js')Shell Completions
my-cli completion bash >> ~/.bashrc
my-cli completion fish > ~/.config/fish/completions/my-cli.fishSubcommands, Arguments, Options
cli.command('config').command('set')
.argument('<key>').argument('<value>')
.option('--env <e>', '', { choices: ['dev', 'prod'] })
.action((k, v, opts) => { ... })Interactive Prompts
cli.command('init').argument('[name]').interactive(true)API
Program
new Program(options) · .use(plugin) · .loadPlugins() · .loadCommands(file) · .loadRemote(url, opts) · .fetchRemote(url, opts) · .parse(argv) · .completion(shell) · .exitOverride()
RemoteLoader
new RemoteLoader(program, opts) · .load() · .start() · .stop()
Plugin
new Plugin(spec) · Plugin.load(filepath) · Plugin.discover(name)
License
MIT
