
gluegun-patterns
by vanman2024
A comprehensive plugin for building professional CLI tools with best practices across multiple frameworks (Click, Typer, Commander.js, yargs, Cobra, clap)
SKILL.md
name: gluegun-patterns description: Gluegun CLI toolkit patterns for TypeScript-powered command-line apps. Use when building CLI tools, creating command structures, implementing template systems, filesystem operations, HTTP utilities, prompts, or plugin architectures with Gluegun. allowed-tools: Read, Write, Edit, Bash, Glob
Gluegun CLI Toolkit Patterns
Provides comprehensive patterns and templates for building TypeScript-powered CLI applications using the Gluegun toolkit. Gluegun offers parameters, templates, filesystem operations, HTTP utilities, prompts, and extensible plugin architecture.
Core Capabilities
Gluegun provides these essential toolbox features:
- Parameters - Command-line arguments and options parsing
- Template - EJS-based file generation from templates
- Filesystem - File and directory operations (fs-jetpack)
- System - Execute external commands and scripts
- HTTP - API interactions with axios/apisauce
- Prompt - Interactive user input with enquirer
- Print - Colorful console output with colors/ora
- Patching - Modify existing file contents
- Semver - Version string manipulation
- Plugin System - Extensible command architecture
Instructions
Building a Basic CLI
-
Initialize Gluegun CLI structure:
import { build } from 'gluegun' const cli = build() .brand('mycli') .src(__dirname) .plugins('./node_modules', { matching: 'mycli-*', hidden: true }) .help() .version() .create() -
Create command structure:
- Commands go in
src/commands/directory - Each command exports a
GluegunCommandobject - Use templates from
templates/directory - Reference template:
templates/commands/basic-command.ts.ejs
- Commands go in
-
Implement command with toolbox:
module.exports = { name: 'generate', run: async (toolbox) => { const { template, print, parameters } = toolbox const name = parameters.first await template.generate({ template: 'model.ts.ejs', target: `src/models/${name}.ts`, props: { name } }) print.success(`Generated ${name} model`) } }
Template System
-
Template file structure:
- Store templates in
templates/directory - Use EJS syntax:
<%= variable %>,<%- unescaped %> - Reference:
templates/toolbox/template-examples.ejs
- Store templates in
-
Generate files from templates:
await template.generate({ template: 'component.tsx.ejs', target: `src/components/${name}.tsx`, props: { name, style: 'functional' } }) -
Helper functions:
props.camelCase- camelCase conversionprops.pascalCase- PascalCase conversionprops.kebabCase- kebab-case conversion- Reference:
scripts/template-helpers.ts
Filesystem Operations
-
Common operations (fs-jetpack):
// Read/write files const config = await filesystem.read('config.json', 'json') await filesystem.write('output.txt', data) // Directory operations await filesystem.dir('src/components') const files = filesystem.find('src', { matching: '*.ts' }) // Copy/move/remove await filesystem.copy('template', 'output') await filesystem.move('old.txt', 'new.txt') await filesystem.remove('temp') -
Path utilities:
filesystem.path('src', 'commands') // Join paths filesystem.cwd() // Current directory filesystem.separator // OS-specific separator
HTTP Utilities
-
API interactions:
const api = http.create({ baseURL: 'https://api.example.com', headers: { 'Authorization': 'Bearer token' } }) const response = await api.get('/users') const result = await api.post('/users', { name: 'John' }) -
Error handling:
if (!response.ok) { print.error(response.problem) return }
Interactive Prompts
-
User input patterns:
// Ask question const result = await prompt.ask({ type: 'input', name: 'name', message: 'What is your name?' }) // Confirm action const proceed = await prompt.confirm('Continue?') // Select from list const choice = await prompt.ask({ type: 'select', name: 'framework', message: 'Choose framework:', choices: ['React', 'Vue', 'Angular'] }) -
Multi-select and complex forms:
- Reference:
examples/prompts/multi-select.ts - See:
templates/toolbox/prompt-examples.ts.ejs
- Reference:
Plugin Architecture
-
Create extensible plugins:
// Plugin structure export default (toolbox) => { const { filesystem, template } = toolbox // Add custom extension toolbox.myFeature = { doSomething: () => { /* ... */ } } } -
Load plugins:
cli.plugins('./node_modules', { matching: 'mycli-*' }) cli.plugins('./plugins', { matching: '*.js' }) -
Plugin examples:
- Reference:
examples/plugin-system/custom-plugin.ts - See:
templates/plugins/plugin-template.ts.ejs
- Reference:
Print Utilities
-
Colorful output:
print.info('Information message') print.success('Success message') print.warning('Warning message') print.error('Error message') print.highlight('Highlighted text') print.muted('Muted text') -
Spinners and progress:
const spinner = print.spin('Loading...') await doWork() spinner.succeed('Done!') // Or fail spinner.fail('Something went wrong') -
Tables and formatting:
print.table([ ['Name', 'Age'], ['John', '30'], ['Jane', '25'] ])
System Commands
-
Execute external commands:
const output = await system.run('npm install') const result = await system.exec('git status') // Spawn with options await system.spawn('npm run build', { stdio: 'inherit' }) -
Check command availability:
const hasGit = await system.which('git')
File Patching
- Modify existing files:
// Add line after pattern await patching.update('package.json', (content) => { const pkg = JSON.parse(content) pkg.scripts.build = 'tsc' return JSON.stringify(pkg, null, 2) }) // Insert import statement await patching.insert('src/index.ts', 'import { Router } from "express"')
Validation Scripts
Use these scripts to validate Gluegun CLI implementations:
scripts/validate-cli-structure.sh- Check directory structurescripts/validate-commands.sh- Verify command formatscripts/validate-templates.sh- Check template syntaxscripts/test-cli-build.sh- Run full CLI build test
Templates
Command Templates
templates/commands/basic-command.ts.ejs- Simple commandtemplates/commands/generator-command.ts.ejs- File generatortemplates/commands/api-command.ts.ejs- HTTP interaction
Extension Templates
templates/extensions/custom-toolbox.ts.ejs- Toolbox extensiontemplates/extensions/helper-functions.ts.ejs- Utility functions
Plugin Templates
templates/plugins/plugin-template.ts.ejs- Plugin structuretemplates/plugins/plugin-with-commands.ts.ejs- Plugin with commands
Toolbox Templates
templates/toolbox/template-examples.ejs- Template patternstemplates/toolbox/prompt-examples.ts.ejs- Prompt patternstemplates/toolbox/filesystem-examples.ts.ejs- Filesystem patterns
Examples
Basic CLI Example
See examples/basic-cli/ for complete working CLI:
- Simple command structure
- Template generation
- User prompts
- File operations
Plugin System Example
See examples/plugin-system/ for extensible architecture:
- Plugin loading
- Custom toolbox extensions
- Command composition
Template Generator Example
See examples/template-generator/ for advanced patterns:
- Multi-file generation
- Conditional templates
- Helper functions
Best Practices
-
Command Organization
- One command per file
- Group related commands in subdirectories
- Use clear, descriptive command names
-
Template Design
- Keep templates simple and focused
- Use helper functions for complex logic
- Document template variables
-
Error Handling
- Check HTTP response status
- Validate user input from prompts
- Provide helpful error messages
-
Plugin Architecture
- Make plugins optional
- Document plugin interfaces
- Version plugin APIs
-
Testing
- Test commands in isolation
- Mock filesystem operations
- Validate template output
Security Considerations
- Never hardcode API keys in templates
- Use environment variables for secrets
- Validate all user input from prompts
- Sanitize file paths from parameters
- Check filesystem permissions before operations
Requirements
- Node.js 14+ or TypeScript 4+
- Gluegun package:
npm install gluegun - EJS for templates (included)
- fs-jetpack for filesystem (included)
- enquirer for prompts (included)
Related Documentation
- Gluegun Official Docs: https://infinitered.github.io/gluegun/
- GitHub Repository: https://github.com/infinitered/gluegun
- EJS Templates: https://ejs.co/
- fs-jetpack: https://github.com/szwacz/fs-jetpack
Purpose: Enable rapid CLI development with Gluegun patterns and best practices Load when: Building CLI tools, command structures, template systems, or plugin architectures
Score
Total Score
Based on repository quality metrics
SKILL.mdファイルが含まれている
ライセンスが設定されている
100文字以上の説明がある
GitHub Stars 100以上
3ヶ月以内に更新
10回以上フォークされている
オープンIssueが50未満
プログラミング言語が設定されている
1つ以上のタグが設定されている
Reviews
Reviews coming soon


