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:
Link Description
go-skills/SKILL.md Overview and quick reference
go-skills/patterns.md Idiomatic Go patterns
go-skills/concurrency.md Goroutines, channels, sync
go-skills/error-handling.md Error wrapping, sentinels
go-skills/testing.md Table-driven tests, mocks
go-skills/security.md Input validation, secure coding
CLI-Specific Checklists
File Description
cobra.md Cobra command patterns, flags, validation
bubbletea.md Bubbletea Model/Update/View patterns
performance.md CLI-specific optimizations
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 {
// Implementation with error returns
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
// Use the output API for consistent messaging 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
// Ensure services are running before operations factory := GetServiceConfigFactory() config := factory.ServerOnly(serverURL) orchestrator.EnsureServicesOrExitWithConfig(config, "server")
// Or with multiple services 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