Gluegun is a delightful toolkit for building Node-based command-line interfaces (CLIs) in TypeScript or modern JavaScript, with support for:
π― parameters - command-line arguments and options
π template - generating files from templates
π patching - manipulating file contents
πΎ filesystem - moving files and directories around
β system - executing other command-line scripts
π
http - interacting with API servers
π prompt - auto-complete prompts
π print - printing pretty colors and tables
π©β
π» strings - manipulating strings & template data
In addition, gluegun
supports expanding your CLI's ecosystem with a robust set of easy-to-write plugins and extensions.
You might want to use Gluegun if:
- You need to build a CLI app
- You want to have powerful tools at your fingertips
- And you don't want to give up flexibility at the same time
If so ... welcome!
Just run the gluegun
CLI like this:
# spin up your new CLI
npx gluegun new movies
# choose TypeScript or Modern JavaScript
# now jump into the source
cd movies
# and link your new executable
yarn link
# and run it!
movies help
You should see your new CLI help. Open the folder in your favorite editor and start building your CLI!
Let's start with what a gluegun
CLI looks like.
// in movie/src/cli.[js|ts]...
// ready
const { build } = require('gluegun')
// aim
const movieCLI = build('movie')
.src(`${__dirname}/core-plugins`)
.plugins('node_modules', { matching: 'movie-*' })
.help()
.version()
.defaultCommand()
.create()
// fire!
movieCLI.run()
Commands
Commands are simple objects that provide a name, optional aliases, and a function to run.
// in movie/src/commands/foo.js
module.exports = {
name: 'foo',
alias: 'f',
run: async function(toolbox) {
// gluegun provides all these features and more!
const { system, print, filesystem, strings } = toolbox
// ...and be the CLI you wish to see in the world
const awesome = strings.trim(await system.run('whoami'))
const moreAwesome = strings.kebabCase(`${awesome} and a keyboard`)
const contents = `π¨ Warning! ${moreAwesome} coming thru! π¨`
const home = process.env['HOME']
filesystem.write(`${home}/realtalk.json`, { contents })
print.info(`${print.checkmark} Citius`)
print.warning(`${print.checkmark} Altius`)
print.success(`${print.checkmark} Fortius`)
}
}
See the toolbox api docs for more details on what you can do.
See the runtime docs for more details on building your own CLI and join us in the #gluegun channel of the Infinite Red Community Slack (community.infinite.red) to get friendly help!
- Ignite CLI - React Native CLI and starter kit
- Solidarity - audits your system dependencies so you can develop in peace
- AWS Amplify CLI - A CLI toolchain for simplifying serverless web and mobile development
- Sara Vieira's Fiddly - Create beautiful and simple HTML pages from your Readme.md files - https://fiddly.netlify.com
- Graph CLI - CLI for building and managing subgraphs that index data from Ethereum and IPFS - https://thegraph.com/explorer
- Vts - Vanilla TypeScript library starter CLI tool
We've assembled an all-star cast of libraries to help you build your CLI.
βοΈ ejs for templating
βοΈ semver for version investigations
βοΈ fs-jetpack for the filesystem
βοΈ yargs-parser, enquirer, colors, ora and cli-table3 for the command line
βοΈ axios & apisauce for web & apis
βοΈ cosmiconfig for flexible configuration
βοΈ cross-spawn for running sub-commands
βοΈ execa for running more sub-commands
βοΈ node-which for finding executables
βοΈ pluralize for manipulating strings
Node.js 8.0+ is required. If you need to support Node 7.6, use Gluegun 3.x.
Here are a few community CLIs based on Gluegun plus some plugins you can use. Is yours missing? Send a PR to add it!
- Gluegun-Menu - A command menu for Gluegun-based CLIs
- Gluegun CLI-Starter - A CLI Starter for your next Gluegun CLI project
Gluegun is sponsored by Infinite Red, a premium custom mobile app and web design and development agency. We are a team of designers and developers distributed across the USA and based near Portland, Oregon. Our specialties are UI/UX design, React and React Native, Node, and more. Email hello@infinite.red if you'd like to talk about your project!