Gunshi
Gunshi: Modern javascript command-line library
Install / Use
/learn @kazupon/GunshiREADME
Gunshi is a modern javascript command-line library
<!-- eslint-disable markdown/no-missing-label-refs --><!-- eslint-enable markdown/no-missing-label-refs -->[!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".
✨ Features
Gunshi is designed to simplify the creation of modern command-line interfaces:
- 📏 Simple & Universal: Run commands with simple API and support for universal runtime (Node.js, Deno, Bun).
- ⚙️ Declarative & Type Safe: Configure commands declaratively with full TypeScript support and type-safe argument parsing by args-tokens
- 🧩 Composable & Lazy: Create modular sub-commands with context sharing and lazy loading for better performance.
- 🎨 Flexible Rendering: Customize usage generation, validation errors, and help messages with pluggable renderers.
- 🌍 Internationalization: Built with global users in mind, featuring locale-aware design, resource management, and multi-language support.
- 🔌 Pluggable: Extensible plugin system with dependency management and lifecycle hooks for modular CLI development.
📡 Status
- v0.27: stable
💿 Installation
# npm
npm install --save gunshi
## pnpm
pnpm add gunshi
## yarn
yarn add gunshi
## deno
deno add jsr:@gunshi/gunshi
## bun
bun add gunshi
🚀 Usage
import { cli } from 'gunshi'
// define a command with declarative configuration, using commandable object
const command = {
name: 'greet',
description: 'A greeting command',
args: {
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
💁♀️ Showcases
- pnpmc: PNPM Catalogs Tooling
- sourcemap-publisher: A tool to publish sourcemaps externally and rewrite sourcemap URLs at pre-publish time
- curxy: An proxy worker for using ollama in cursor
- SiteMCP: Fetch an entire site and use it as an MCP Server
- ccusage: A CLI tool for analyzing Claude Code usage from local JSONL files
- varlock: Enhanced .env file loader, using @decorator style comments to add validation, type-safety, and more
🙌 Contributing guidelines
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.
💖 Credits
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!
🤝 Sponsors
The development of Gunshi is supported by my OSS sponsors!
<p align="center"> <a href="https://cdn.jsdelivr.net/gh/kazupon/sponsors/sponsors.svg"> <img alt="sponsor" src='https://cdn.jsdelivr.net/gh/kazupon/sponsors/sponsors.svg'/> </a> </p>©️ License
<!-- Badges -->Related Skills
node-connect
342.5kDiagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps
frontend-design
85.3kCreate distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
openai-whisper-api
342.5kTranscribe audio via OpenAI Audio Transcriptions API (Whisper).
qqbot-media
342.5kQQBot 富媒体收发能力。使用 <qqmedia> 标签,系统根据文件扩展名自动识别类型(图片/语音/视频/文件)。
