Monorepo structure
Bunli uses Bun workspaces to manage multiple packages:Core packages
@bunli/core
The heart of Bunli, providing:- Command definitions via
defineCommandanddefineGroup - Option schemas with
option()helper - CLI creation through
createCLI() - Plugin system with
PluginManager - Argument parsing using standard CLI conventions
- Config loading from
bunli.config.ts
src/types.ts- Core type definitionssrc/cli.ts- CLI class implementationsrc/parser.ts- Argument parsingsrc/config.ts- Configuration schemasrc/plugin/- Plugin system
@bunli/tui
Terminal UI components built on OpenTUI:- Components - ProgressBar, Select, Table, Charts
- Hooks - useKeyboard, useRenderer, useTerminalDimensions
- Styling - Colors, text attributes, theming
@bunli/runtime
Prompt and renderer runtime infrastructure:- Prompt API -
prompt()for interactive input - Spinner factory -
spinner()for loading states - Event handling - Keyboard and signal management
- Transport layer - Renderer communication
@bunli/utils
Shared utilities:- Colors - Terminal color utilities
- Validation - Schema validation helpers
CLI toolchain
bunli
Development CLI with commands:bunli dev- Hot-reload development modebunli build- Build and optionally compile to binarybunli test- Run tests with coveragebunli generate- Generate TypeScript typesbunli completions- Generate shell completions
packages/cli/src/commands/
create-bunli
Scaffolding tool for new projects:- basic - Minimal CLI setup
- advanced - CLI with plugins and TUI
- monorepo - Multi-package CLI project
packages/create-bunli/templates/
@bunli/generator
Generates TypeScript type definitions from command files:Plugin architecture
Plugins extend Bunli’s functionality through lifecycle hooks and typed stores.Plugin structure
Plugin lifecycle
Plugin store access
Commands access plugin stores through the context:Built-in plugins
@bunli/plugin-ai-detect Detects AI coding assistants from environment variables:Command execution flow
Here’s how a command flows through Bunli from invocation to completion:Step-by-step breakdown
1. CLI creationpackages/core/src/cli.ts
2. Command registration
packages/core/src/parser.ts
Parsing follows POSIX conventions:
- Short flags:
-n Aliceor-nAlice - Long flags:
--name Aliceor--name=Alice - Boolean flags:
--loudor--no-loud - Positional arguments:
command arg1 arg2
OptionValidationError with context.
Location: packages/core/src/validation.ts
6. Plugin hooks
packages/core/src/plugin/manager.ts
7. Command execution
Commands receive a rich context object:
packages/core/src/types.ts (HandlerArgs)
Type generation
Bunli generates TypeScript definitions from your commands for type-safe programmatic execution.Generated types
Type-safe execution
Configuration system
Bunli loads configuration frombunli.config.ts in your project root:
packages/core/src/config.ts
Error handling
Bunli usesbetter-result for type-safe error handling:
InvalidConfigError- Configuration validation failedCommandNotFoundError- Command doesn’t existCommandExecutionError- Command handler threwOptionValidationError- Option validation failedPluginLoadError- Plugin failed to loadPluginHookError- Plugin hook threw error
packages/core/src/plugin/errors.ts
Next steps
Commands
Learn how to define commands
Options
Work with command options
Plugins
Create your own plugins
TUI Components
Build interactive UIs