Go Skills for LlamaFarm CLI
Shared Go best practices for LlamaFarm CLI development. These guidelines ensure idiomatic, maintainable, and secure Go code.
Tech Stack
-
Go 1.24+
-
Cobra (CLI framework)
-
Bubbletea (TUI framework)
-
Lipgloss (terminal styling)
Directory Structure
cli/ cmd/ # Command implementations config/ # Configuration types and loading orchestrator/ # Service management utils/ # Shared utilities version/ # Version and upgrade handling internal/ # Internal packages tui/ # TUI components buildinfo/ # Build information
Quick Reference
Error Handling
-
Always wrap errors with context: fmt.Errorf("operation failed: %w", err)
-
Use sentinel errors for expected conditions: var ErrNotFound = errors.New("not found")
-
Check errors immediately after function calls
Concurrency
-
Use sync.Mutex for shared state protection
-
Use sync.RWMutex when reads dominate writes
-
Use channels for goroutine communication
-
Always use defer for mutex unlocks
Testing
-
Use table-driven tests for comprehensive coverage
-
Use interfaces for mockability
-
Test file names: *_test.go in same package
Security
-
Never log credentials or tokens
-
Redact sensitive headers in debug logs
-
Validate all external input
-
Use context.Context for cancellation
Checklist Files
File Description
patterns.md Idiomatic Go patterns
concurrency.md Goroutines, channels, sync
error-handling.md Error wrapping, sentinels
testing.md Table-driven tests, mocks
security.md Input validation, secure coding
Go Proverbs to Remember
-
"Don't communicate by sharing memory; share memory by communicating"
-
"Errors are values"
-
"A little copying is better than a little dependency"
-
"Clear is better than clever"
-
"Design the architecture, name the components, document the details"
Common Patterns in This Codebase
HTTP Client Interface
type HTTPClient interface { Do(req *http.Request) (*http.Response, error) }
Process Management with Mutex
type ProcessManager struct { mu sync.RWMutex processes map[string]*ProcessInfo }
Cobra Command Pattern
var myCmd = &cobra.Command{ Use: "mycommand", Short: "Brief description", RunE: func(cmd *cobra.Command, args []string) error { // Implementation return nil }, }
Bubbletea Model Pattern
type myModel struct { // State fields }
func (m myModel) Init() tea.Cmd { return nil } func (m myModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) { /* ... */ } func (m myModel) View() string { return "" }