or run

npx @tessl/cli init
Log in

Version

Tile

Overview

Evals

Files

docs

cli-builder.mdcommand-system.mdfilesystem-tools.mdhttp-tools.mdindex.mdpackage-manager-tools.mdpatching-tools.mdprint-tools.mdprompt-tools.mdsemver-tools.mdstring-tools.mdsystem-tools.mdtemplate-tools.md
tile.json

cli-builder.mddocs/

CLI Builder

Core builder API providing a fluent interface for creating and configuring CLI applications with commands, plugins, extensions, and runtime behavior.

Capabilities

Build Function

Factory function to create a new CLI builder instance.

/**
 * Creates a new CLI builder instance
 * @param brand - Optional brand name for the CLI (used for configuration files)
 * @returns Builder instance for fluent configuration
 */
function build(brand?: string): Builder;

Usage Example:

import { build } from "gluegun";

const cli = build("my-cli")
  .src(`${__dirname}/commands`)
  .help()
  .version()
  .create();

Builder Class

Fluent API for configuring CLI applications before creating the runtime.

interface Builder {
  /**
   * Set the CLI brand name used for configuration file discovery
   * @param value - Brand name (lowercase, numbers, letters, dashes only)
   * @returns Builder instance for chaining
   */
  brand(value: string): Builder;

  /**
   * Exclude core extensions for performance optimization
   * @param excludes - Array of extension names to exclude
   * @returns Builder instance for chaining
   */
  exclude(excludes: string[]): Builder;

  /**
   * Set the source directory for default commands and extensions
   * @param value - Path to source directory
   * @param options - Additional plugin loading options
   * @returns Builder instance for chaining
   */
  src(value: string, options?: GluegunLoadOptions): Builder;

  /**
   * Add a single plugin directory
   * @param value - Plugin directory path
   * @param options - Additional loading options
   * @returns Builder instance for chaining
   */
  plugin(value: string, options?: GluegunLoadOptions): Builder;

  /**
   * Add a directory containing multiple plugins
   * @param value - Directory path with plugin subdirectories
   * @param options - Loading options with optional matching pattern
   * @returns Builder instance for chaining
   */
  plugins(value: string, options?: GluegunLoadOptions & GluegunMultiLoadOptions): Builder;

  /**
   * Add default help command handler
   * @param command - Optional custom help command function or object
   * @returns Builder instance for chaining
   */
  help(command?: any): Builder;

  /**
   * Add default version command handler
   * @param command - Optional custom version command function or object
   * @returns Builder instance for chaining
   */
  version(command?: any): Builder;

  /**
   * Set default command that runs when no other command matches
   * @param command - Optional custom default command function or object
   * @returns Builder instance for chaining
   */
  defaultCommand(command?: any): Builder;

  /**
   * Add an arbitrary command to the CLI
   * @param command - Command definition object
   * @returns Builder instance for chaining
   */
  command(command: GluegunCommand): Builder;

  /**
   * Enable random update checking
   * @param frequency - Percentage frequency of update checks (0-100)
   * @returns Builder instance for chaining
   */
  checkForUpdates(frequency: number): Builder;

  /**
   * Create the configured runtime instance
   * @returns Runtime instance ready for execution
   */
  create(): Runtime;
}

Usage Examples:

import { build } from "gluegun";

// Basic CLI with help and version
const basicCLI = build("basic")
  .help()
  .version()
  .create();

// Advanced CLI with plugins and custom commands
const advancedCLI = build("advanced")
  .src(`${__dirname}/src`)
  .plugins("node_modules", { matching: "advanced-*" })
  .plugin("./custom-plugin")
  .exclude(["semver", "http"])
  .help()
  .version()
  .defaultCommand()
  .checkForUpdates(10) // 10% chance
  .create();

// Run the CLI
await advancedCLI.run();

Runtime Class

The executable runtime created by the builder that manages command execution and plugin loading.

interface Runtime {
  /**
   * Execute CLI commands with optional parameters
   * @param rawCommand - Command string or options object
   * @param extraOptions - Additional execution options
   * @returns Promise resolving to toolbox instance
   */
  run(rawCommand?: string | Options, extraOptions?: Options): Promise<GluegunToolbox>;

  /**
   * Load core extensions into the runtime
   * @param exclude - Array of extension names to exclude
   */
  addCoreExtensions(exclude?: string[]): void;

  /**
   * Add a command to the runtime
   * @param command - Command definition
   * @returns Runtime instance for chaining
   */
  addCommand(command: GluegunCommand): Runtime;

  /**
   * Add a toolbox extension to the runtime
   * @param name - Extension name
   * @param setup - Extension setup function
   * @returns Runtime instance for chaining
   */
  addExtension(name: string, setup: any): Runtime;

  /**
   * Set the default plugin directory
   * @param directory - Plugin directory path
   * @param options - Loading options
   * @returns Runtime instance for chaining
   */
  addDefaultPlugin(directory: string, options?: GluegunLoadOptions): Runtime;

  /**
   * Load a plugin from a directory
   * @param directory - Plugin directory path
   * @param options - Loading options
   * @returns Loaded plugin instance or null if failed
   */
  addPlugin(directory: string, options?: GluegunLoadOptions): Plugin | null;

  /**
   * Load multiple plugins from a directory
   * @param directory - Directory containing plugin subdirectories
   * @param options - Loading options with matching pattern
   * @returns Array of loaded plugin instances
   */
  addPlugins(directory: string, options?: GluegunLoadOptions & GluegunMultiLoadOptions): Plugin[];

  /** CLI brand name */
  brand?: string;
  /** Loaded plugins */
  plugins: Plugin[];
  /** Available extensions */
  extensions: Extension[];
  /** Available commands */
  commands: Command[];
  /** Default configuration */
  defaults: Options;
  /** Update check enabled flag */
  checkUpdate: boolean;
}

Plugin Loading Options

interface GluegunLoadOptions {
  /** Hide plugin from CLI help listings */
  hidden?: boolean;
  /** Glob patterns for command files (default: ['*.js', '*.ts']) */
  commandFilePattern?: string[];
  /** Glob patterns for extension files (default: ['*.js', '*.ts']) */
  extensionFilePattern?: string[];
  /** Require plugin directory to exist */
  required?: boolean;
  /** Override plugin name */
  name?: string;
  /** Pre-loaded command objects */
  preloadedCommands?: object[];
}

interface GluegunMultiLoadOptions {
  /** Glob pattern to match plugin directories */
  matching?: string;
}

Plugin Loading Examples:

// Load plugins with specific patterns
const cli = build("my-cli")
  .plugins("./plugins", {
    matching: "my-cli-*",
    commandFilePattern: ["commands/*.js"],
    extensionFilePattern: ["extensions/*.js"]
  })
  .create();

// Load hidden plugin
const cli = build("my-cli")
  .plugin("./internal-plugin", { hidden: true })
  .create();