npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

commander-pro

v4.0.0

Published

进阶 CLI 框架 v4 — Advanced CLI framework with subcommands, auto validation, help, completions, plugins, remote command loading, and interactive prompts

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-pro

Quick 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.fish

Subcommands, 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