| name | cli-skills |
| description | CLI best practices for LlamaFarm. Covers Cobra, Bubbletea, Lipgloss patterns for Go CLI development. |
| allowed-tools | Read, Grep, Glob |
| user-invocable | false |
CLI Skills for LlamaFarm
Framework-specific patterns for the LlamaFarm CLI. These guidelines extend the shared Go skills with Cobra, Bubbletea, and Lipgloss best practices.
Tech Stack
- Go 1.24+
- Cobra (CLI framework)
- Bubbletea (TUI framework)
- Lipgloss (terminal styling)
- Bubbles (TUI components)
Directory Structure
cli/
cmd/ # Cobra command implementations
config/ # Configuration types and loading
orchestrator/ # Service management and process control
utils/ # Shared utilities (HTTP, output, logging)
version/ # Version and upgrade handling
internal/ # Internal packages (not exported)
tui/ # Reusable TUI components
buildinfo/ # Build-time information
Quick Reference
Cobra Commands
- Use
RunE over Run for error handling
- Register flags in
init() functions
- Use persistent flags for shared options
- Validate arguments with
Args field
Bubbletea TUI
- Implement
Init(), Update(), View() interface
- Use message types for state changes
- Return
tea.Cmd for async operations
- Keep state immutable in
Update()
Lipgloss Styling
- Define styles as package-level constants
- Use
lipgloss.NewStyle() for styling
- Handle terminal width dynamically
- Support color themes via style variables
Shared Go Skills
This skill extends the base Go skills. See:
CLI-Specific Checklists
Key Patterns in This Codebase
Command Registration Pattern
var myCmd = &cobra.Command{
Use: "mycommand [args]",
Short: "Brief description",
Long: `Extended description with examples.`,
Args: cobra.MaximumNArgs(1),
RunE: func(cmd *cobra.Command, args []string) error {
return nil
},
}
func init() {
rootCmd.AddCommand(myCmd)
myCmd.Flags().StringVar(&flagVar, "flag", "default", "Flag description")
}
TUI Model Pattern
type myModel struct {
viewport viewport.Model
textarea textarea.Model
width int
height int
err error
}
func (m myModel) Init() tea.Cmd {
return tea.Batch(m.textarea.Focus(), doAsyncWork())
}
func (m myModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
var cmds []tea.Cmd
switch msg := msg.(type) {
case tea.WindowSizeMsg:
m.width = msg.Width
m.height = msg.Height
case tea.KeyMsg:
switch msg.String() {
case "ctrl+c":
return m, tea.Quit
}
}
return m, tea.Batch(cmds...)
}
func (m myModel) View() string {
return lipgloss.JoinVertical(lipgloss.Left,
m.viewport.View(),
m.textarea.View(),
)
}
Output API Pattern
utils.OutputInfo("Starting service %s...", serviceName)
utils.OutputSuccess("Service started successfully")
utils.OutputError("Failed to start service: %v", err)
utils.OutputProgress("Downloading model...")
utils.OutputWarning("Service already running")
Service Orchestration Pattern
factory := GetServiceConfigFactory()
config := factory.ServerOnly(serverURL)
orchestrator.EnsureServicesOrExitWithConfig(config, "server")
config := factory.RAGCommand(serverURL)
orchestrator.EnsureServicesOrExitWithConfig(config, "server", "rag", "universal-runtime")
Guidelines
- User Experience First: CLI should feel responsive and provide clear feedback
- Graceful Degradation: Handle missing services, network errors, and timeouts gracefully
- Consistent Output: Use the output API for all user-facing messages
- Cross-Platform: Test on macOS, Linux, and Windows
- Terminal Compatibility: Test with different terminal emulators and sizes