Gunshi is a modern javascript command-line library
Tip
gunshi (軍師) is a position in ancient Japanese samurai battle in which a samurai devised strategies and gave orders. That name is inspired by the word "command".
Gunshi is designed to simplify the creation of modern command-line interfaces:
- 📏 Simple & Universal: Run the commands with simple API and support universal runtime.
- ⚙️ Declarative configuration: Configure command modules declaratively for better organization and maintainability.
- 🛡️ Type Safe: TypeScript support with type-safe argument parsing and option resolution by args-tokens
- 🧩 Composable: Create modular sub-commands that can be composed together for complex CLIs.
- ⏳ Lazy & Async: Load command modules lazily and execute them asynchronously for better performance.
- 📜 Auto usage generation: Generate helpful usage messages automatically for your commands.
- 🎨 Custom usage generation: Customize how usage messages are generated to match your CLI's style.
- 🌍 Internationalization: Support multiple languages with built-in i18n, locale resource lazy loading and i18n library integration.
# npm
npm install --save gunshi
## pnpm
pnpm add gunshi
## yarn
yarn add gunshi
## deno
deno add jsr:@kazupon/gunshi
## bun
bun add gunshi
import { cli } from 'gunshi'
// define a command with declarative configuration, using commandable object
const command = {
name: 'greet',
description: 'A greeting command',
options: {
name: {
type: 'string',
short: 'n',
description: 'Name to greet'
},
greeting: {
type: 'string',
short: 'g',
default: 'Hello',
description: 'Greeting to use (default: "Hello")'
},
times: {
type: 'number',
short: 't',
default: 1,
description: 'Number of times to repeat the greeting (default: 1)'
}
},
run: ctx => {
const { name = 'World', greeting, times } = ctx.values
for (let i = 0; i < times; i++) {
console.log(`${greeting}, ${name}!`)
}
}
}
// run a command that is defined above
// (the 3rd argument of `cli` is the command option)
await cli(process.argv.slice(2), command, {
name: 'my-app',
version: '1.0.0',
description: 'My CLI application'
})
About more details and usage, see documentations
- pnpmc: PNPM Catalogs Tooling
If you are interested in contributing to gunshi
, I highly recommend checking out the contributing guidelines here. You'll find all the relevant information such as how to make a PR, how to setup development) etc., there.
This project is inspired and powered by:
citty
, created by UnJS team and contributorsordana
, createdy by sapphi-red, inspired documentation generation- cline and claude 3.7 sonnet, examples and docs is generated
Thank you!
The development of Gunish is supported by my OSS sponsors!