Documentation
¶
Overview ¶
Package cli provides the CLI runtime and utilities.
Package cli provides the CLI runtime and utilities.
Package cli provides the CLI runtime and utilities.
The CLI uses the Core framework for its own runtime. Usage is simple:
cli.Init(cli.Options{AppName: "core"})
defer cli.Shutdown()
cli.Success("Done!")
cli.Error("Failed")
if cli.Confirm("Proceed?") { ... }
// When you need the Core instance
c := cli.Core()
Package cli provides common utilities and styles for CLI commands.
This package contains:
- Terminal styling using lipgloss with Tailwind colours
- Unicode symbols for consistent visual indicators
- Helper functions for common output patterns
- Git and GitHub CLI utilities
Index ¶
- Constants
- Variables
- func ArbitraryArgs() cobra.PositionalArgs
- func As(err error, target any) bool
- func Bold(text string) string
- func BoldStr(msg string) string
- func BoolFlag(cmd *Command, ptr *bool, name, short string, def bool, usage string)
- func Bullet(text string) string
- func CheckMark(present bool) string
- func CheckMarkCustom(present bool, presentStyle, absentStyle lipgloss.Style, ...) string
- func CheckResult(ok bool, name string, version string) string
- func Choose[T any](prompt string, items []T, opts ...ChooseOption[T]) T
- func ChooseAction[T any](verb, subject string, items []T, opts ...ChooseOption[T]) T
- func ChooseMulti[T any](prompt string, items []T, opts ...ChooseOption[T]) []T
- func ChooseMultiAction[T any](verb, subject string, items []T, opts ...ChooseOption[T]) []T
- func CommandStr(cmd string) string
- func Confirm(prompt string, opts ...ConfirmOption) bool
- func ConfirmAction(verb, subject string, opts ...ConfirmOption) bool
- func ConfirmDangerousAction(verb, subject string) bool
- func Context() context.Context
- func Core() *framework.Core
- func Dim(msg string)
- func DimStr(msg string) string
- func Err(format string, args ...any) error
- func Error(msg string)
- func ErrorStr(msg string) string
- func ExactArgs(n int) cobra.PositionalArgs
- func Execute() error
- func Fatal(err error)
- func FatalWrap(err error, msg string)
- func FatalWrapVerb(err error, verb, subject string)
- func Fatalf(format string, args ...any)
- func FmtDim(text string) string
- func FmtError(msg string) string
- func FmtInfo(msg string) string
- func FmtSuccess(msg string) string
- func FmtTitle(text string) string
- func FmtWarning(msg string) string
- func FormatAge(t time.Time) string
- func FormatCoverage(percent float64) string
- func FormatCoverageCustom(percent, highThreshold, medThreshold float64) string
- func FormatPriority(level string) string
- func FormatSeverity(level string) string
- func FormatTaskStatus(status string) string
- func GhAuthenticated() bool
- func GitClone(ctx context.Context, org, repo, path string) error
- func Header(title string, withSeparator bool) string
- func Highlight(text string) string
- func Indent(level int, text string) string
- func Info(msg string)
- func InfoStr(msg string) string
- func Init(opts Options) error
- func IntFlag(cmd *Command, ptr *int, name, short string, def int, usage string)
- func Is(err, target error) bool
- func IsStderrTTY() bool
- func IsStdinTTY() bool
- func IsTTY() bool
- func Itoa(n int) string
- func Itoa64(n int64) string
- func Join(errs ...error) error
- func KeyValue(key, value string) string
- func KeyValueBold(key, value string) string
- func Label(text string) string
- func LabelValue(label, value string) string
- func LabelValueStyled(label, value string, valueStyle lipgloss.Style) string
- func Line(key string, args ...any)
- func LogDebug(msg string)
- func LogError(msg string)
- func LogInfo(msg string)
- func LogWarn(msg string)
- func Main()
- func MaximumNArgs(n int) cobra.PositionalArgs
- func MinimumNArgs(n int) cobra.PositionalArgs
- func NewI18nService(opts I18nOptions) func(*framework.Core) (any, error)
- func NewLogService(opts LogOptions) func(*framework.Core) (any, error)
- func NoArgs() cobra.PositionalArgs
- func Number(n int) string
- func Path(p string) string
- func Pending(msg string) string
- func PersistentBoolFlag(cmd *Command, ptr *bool, name, short string, def bool, usage string)
- func PersistentStringFlag(cmd *Command, ptr *string, name, short, def, usage string)
- func ProgressLabel(label string) string
- func Question(prompt string, opts ...QuestionOption) string
- func QuestionAction(verb, subject string, opts ...QuestionOption) string
- func RegisterCommands(fn CommandRegistration)
- func RootCmd() *cobra.Command
- func Run(ctx context.Context) error
- func RunWithTimeout(timeout time.Duration) func()
- func Scanln(a ...any) (int, error)
- func Separator(width int) string
- func Shutdown()
- func Skip(msg string) string
- func Sprint(args ...any) string
- func Sprintf(format string, args ...any) string
- func StatusLine(parts ...string) string
- func StatusPart(count int, label string, style lipgloss.Style) string
- func StatusPrefix(style lipgloss.Style) string
- func StatusText(text string, style lipgloss.Style) string
- func StringFlag(cmd *Command, ptr *string, name, short, def, usage string)
- func StringSliceFlag(cmd *Command, ptr *[]string, name, short string, def []string, usage string)
- func Styled(style lipgloss.Style, text string) string
- func Styledf(style lipgloss.Style, format string, args ...any) string
- func Success(msg string)
- func SuccessStr(msg string) string
- func T(key string, args ...map[string]any) string
- func Title(msg string)
- func TreeItem(text string, isLast bool) string
- func Truncate(s string, max int) string
- func Warning(msg string)
- func WarningStr(msg string) string
- func Wrap(err error, msg string) error
- func WrapAction(err error, verb string) error
- func WrapVerb(err error, verb, subject string) error
- type ChooseOption
- type Command
- func NewCommand(use, short, long string, run func(cmd *Command, args []string) error) *Command
- func NewGroup(use, short, long string) *Command
- func NewRun(use, short, long string, run func(cmd *Command, args []string)) *Command
- func WithArgs(cmd *Command, args cobra.PositionalArgs) *Command
- func WithExample(cmd *Command, example string) *Command
- type CommandRegistration
- type ConfirmOption
- type Daemon
- type DaemonOptions
- type HealthCheck
- type HealthServer
- type I18nOptions
- type I18nService
- func (s *I18nService) AvailableLanguages() []string
- func (s *I18nService) ClearMissingKeys()
- func (s *I18nService) Language() string
- func (s *I18nService) MissingKeys() []i18n.MissingKey
- func (s *I18nService) Mode() i18n.Mode
- func (s *I18nService) OnStartup(ctx context.Context) error
- func (s *I18nService) SetLanguage(lang string)
- func (s *I18nService) SetMode(mode i18n.Mode)
- func (s *I18nService) T(key string, args ...map[string]any) string
- type LogLevel
- type LogOptions
- type LogService
- type Mode
- type Options
- type PIDFile
- type QueryTranslate
- type QuestionOption
- type SignalOption
- type Table
- type TableRow
Constants ¶
const ( // AppName is the CLI application name. AppName = "core" // AppVersion is the CLI application version. AppVersion = "0.1.0" )
const ( LogLevelQuiet = log.LevelQuiet LogLevelError = log.LevelError LogLevelWarn = log.LevelWarn LogLevelInfo = log.LevelInfo LogLevelDebug = log.LevelDebug )
const ( ColourBlue50 = lipgloss.Color("#eff6ff") ColourBlue100 = lipgloss.Color("#dbeafe") ColourBlue200 = lipgloss.Color("#bfdbfe") ColourBlue300 = lipgloss.Color("#93c5fd") ColourBlue400 = lipgloss.Color("#60a5fa") ColourBlue500 = lipgloss.Color("#3b82f6") ColourBlue600 = lipgloss.Color("#2563eb") ColourBlue700 = lipgloss.Color("#1d4ed8") ColourGreen400 = lipgloss.Color("#4ade80") ColourGreen500 = lipgloss.Color("#22c55e") ColourGreen600 = lipgloss.Color("#16a34a") ColourRed400 = lipgloss.Color("#f87171") ColourRed500 = lipgloss.Color("#ef4444") ColourRed600 = lipgloss.Color("#dc2626") ColourAmber400 = lipgloss.Color("#fbbf24") ColourAmber500 = lipgloss.Color("#f59e0b") ColourAmber600 = lipgloss.Color("#d97706") ColourOrange500 = lipgloss.Color("#f97316") ColourYellow500 = lipgloss.Color("#eab308") ColourEmerald500 = lipgloss.Color("#10b981") ColourPurple500 = lipgloss.Color("#a855f7") ColourViolet400 = lipgloss.Color("#a78bfa") ColourViolet500 = lipgloss.Color("#8b5cf6") ColourIndigo500 = lipgloss.Color("#6366f1") ColourCyan500 = lipgloss.Color("#06b6d4") ColourGray50 = lipgloss.Color("#f9fafb") ColourGray100 = lipgloss.Color("#f3f4f6") ColourGray200 = lipgloss.Color("#e5e7eb") ColourGray300 = lipgloss.Color("#d1d5db") ColourGray400 = lipgloss.Color("#9ca3af") ColourGray500 = lipgloss.Color("#6b7280") ColourGray600 = lipgloss.Color("#4b5563") ColourGray700 = lipgloss.Color("#374151") ColourGray800 = lipgloss.Color("#1f2937") ColourGray900 = lipgloss.Color("#111827") )
Tailwind colours for consistent theming across the CLI.
const ( // Status indicators SymbolCheck = "✓" // Success, pass, complete SymbolCross = "✗" // Error, fail, incomplete SymbolWarning = "⚠" // Warning, caution SymbolInfo = "ℹ" // Information SymbolQuestion = "?" // Unknown, needs attention SymbolSkip = "○" // Skipped, neutral SymbolDot = "●" // Active, selected SymbolCircle = "◯" // Inactive, unselected // Arrows and pointers SymbolArrowRight = "→" SymbolArrowLeft = "←" SymbolArrowUp = "↑" SymbolArrowDown = "↓" SymbolPointer = "▶" // Decorative SymbolBullet = "•" SymbolDash = "─" SymbolPipe = "│" SymbolCorner = "└" SymbolTee = "├" SymbolSeparator = " │ " // Progress SymbolSpinner = "⠋" // First frame of braille spinner SymbolPending = "…" )
Symbols for consistent visual indicators across commands.
Variables ¶
var ( // RepoNameStyle highlights repository names (blue, bold). RepoNameStyle = lipgloss.NewStyle(). Bold(true). Foreground(ColourBlue500) // SuccessStyle indicates successful operations (green, bold). SuccessStyle = lipgloss.NewStyle(). Bold(true). Foreground(ColourGreen500) // ErrorStyle indicates errors and failures (red, bold). ErrorStyle = lipgloss.NewStyle(). Bold(true). Foreground(ColourRed500) // WarningStyle indicates warnings and cautions (amber, bold). WarningStyle = lipgloss.NewStyle(). Bold(true). Foreground(ColourAmber500) // InfoStyle for informational messages (blue). InfoStyle = lipgloss.NewStyle(). Foreground(ColourBlue400) // DimStyle for secondary/muted text (gray). DimStyle = lipgloss.NewStyle(). Foreground(ColourGray500) // MutedStyle for very subtle text (darker gray). MutedStyle = lipgloss.NewStyle(). Foreground(ColourGray600) // ValueStyle for data values and output (light gray). ValueStyle = lipgloss.NewStyle(). Foreground(ColourGray200) // AccentStyle for highlighted values (cyan). AccentStyle = lipgloss.NewStyle(). Foreground(ColourCyan500) // LinkStyle for URLs and clickable references (blue, underlined). LinkStyle = lipgloss.NewStyle(). Foreground(ColourBlue500). Underline(true) // HeaderStyle for section headers (light gray, bold). HeaderStyle = lipgloss.NewStyle(). Bold(true). Foreground(ColourGray200) // TitleStyle for command titles (blue, bold). TitleStyle = lipgloss.NewStyle(). Bold(true). Foreground(ColourBlue500) // BoldStyle for emphasis without colour. BoldStyle = lipgloss.NewStyle(). Bold(true) // CodeStyle for inline code or paths. CodeStyle = lipgloss.NewStyle(). Foreground(ColourGray300). Background(ColourGray800). Padding(0, 1) // KeyStyle for labels/keys in key-value pairs. KeyStyle = lipgloss.NewStyle(). Foreground(ColourGray400) // NumberStyle for numeric values. NumberStyle = lipgloss.NewStyle(). Foreground(ColourBlue300) // PrNumberStyle for pull request numbers (purple, bold). PrNumberStyle = lipgloss.NewStyle(). Bold(true). Foreground(ColourPurple500) // AccentLabelStyle for highlighted labels (violet). AccentLabelStyle = lipgloss.NewStyle(). Foreground(ColourViolet400) // StageStyle for pipeline/QA stage headers (indigo, bold). StageStyle = lipgloss.NewStyle(). Bold(true). Foreground(ColourIndigo500) )
Terminal styles using Tailwind colour palette. These are shared across command packages for consistent output.
var ( // StatusPendingStyle for pending/waiting states. StatusPendingStyle = lipgloss.NewStyle().Foreground(ColourGray500) // StatusRunningStyle for in-progress states. StatusRunningStyle = lipgloss.NewStyle().Foreground(ColourBlue500) // StatusSuccessStyle for completed/success states. StatusSuccessStyle = lipgloss.NewStyle().Foreground(ColourGreen500) // StatusErrorStyle for failed/error states. StatusErrorStyle = lipgloss.NewStyle().Foreground(ColourRed500) // StatusWarningStyle for warning states. StatusWarningStyle = lipgloss.NewStyle().Foreground(ColourAmber500) )
var ( // CoverageHighStyle for good coverage (80%+). CoverageHighStyle = lipgloss.NewStyle().Foreground(ColourGreen500) // CoverageMedStyle for moderate coverage (50-79%). CoverageMedStyle = lipgloss.NewStyle().Foreground(ColourAmber500) // CoverageLowStyle for low coverage (<50%). CoverageLowStyle = lipgloss.NewStyle().Foreground(ColourRed500) )
var ( // PriorityHighStyle for high/critical priority (red, bold). PriorityHighStyle = lipgloss.NewStyle().Bold(true).Foreground(ColourRed500) // PriorityMediumStyle for medium priority (amber). PriorityMediumStyle = lipgloss.NewStyle().Foreground(ColourAmber500) // PriorityLowStyle for low priority (green). PriorityLowStyle = lipgloss.NewStyle().Foreground(ColourGreen500) )
var ( // SeverityCriticalStyle for critical issues (red, bold). SeverityCriticalStyle = lipgloss.NewStyle().Bold(true).Foreground(ColourRed500) // SeverityHighStyle for high severity issues (orange, bold). SeverityHighStyle = lipgloss.NewStyle().Bold(true).Foreground(ColourOrange500) // SeverityMediumStyle for medium severity issues (amber). SeverityMediumStyle = lipgloss.NewStyle().Foreground(ColourAmber500) // SeverityLowStyle for low severity issues (gray). SeverityLowStyle = lipgloss.NewStyle().Foreground(ColourGray500) )
var ( // GitDirtyStyle for uncommitted changes (red). GitDirtyStyle = lipgloss.NewStyle().Foreground(ColourRed500) // GitAheadStyle for unpushed commits (green). GitAheadStyle = lipgloss.NewStyle().Foreground(ColourGreen500) // GitBehindStyle for unpulled commits (amber). GitBehindStyle = lipgloss.NewStyle().Foreground(ColourAmber500) // GitCleanStyle for clean state (gray). GitCleanStyle = lipgloss.NewStyle().Foreground(ColourGray500) // GitConflictStyle for merge conflicts (red, bold). GitConflictStyle = lipgloss.NewStyle().Bold(true).Foreground(ColourRed500) )
var ( // DeploySuccessStyle for successful deployments (emerald). DeploySuccessStyle = lipgloss.NewStyle().Foreground(ColourEmerald500) // DeployPendingStyle for pending deployments (amber). DeployPendingStyle = lipgloss.NewStyle().Foreground(ColourAmber500) // DeployFailedStyle for failed deployments (red). DeployFailedStyle = lipgloss.NewStyle().Foreground(ColourRed500) )
var ( // BoxStyle creates a rounded border box. BoxStyle = lipgloss.NewStyle(). Border(lipgloss.RoundedBorder()). BorderForeground(ColourGray600). Padding(0, 1) // BoxHeaderStyle for box titles. BoxHeaderStyle = lipgloss.NewStyle(). Bold(true). Foreground(ColourBlue400). MarginBottom(1) // ErrorBoxStyle for error message boxes. ErrorBoxStyle = lipgloss.NewStyle(). Border(lipgloss.RoundedBorder()). BorderForeground(ColourRed500). Padding(0, 1) // SuccessBoxStyle for success message boxes. SuccessBoxStyle = lipgloss.NewStyle(). Border(lipgloss.RoundedBorder()). BorderForeground(ColourGreen500). Padding(0, 1) )
var Style = struct { // Text styles Dim lipgloss.Style Muted lipgloss.Style Bold lipgloss.Style Value lipgloss.Style Accent lipgloss.Style Code lipgloss.Style Key lipgloss.Style Number lipgloss.Style Link lipgloss.Style Header lipgloss.Style Title lipgloss.Style Stage lipgloss.Style PrNum lipgloss.Style AccentL lipgloss.Style // Status styles Success lipgloss.Style Error lipgloss.Style Warning lipgloss.Style Info lipgloss.Style // Git styles Dirty lipgloss.Style Ahead lipgloss.Style Behind lipgloss.Style Clean lipgloss.Style Conflict lipgloss.Style // Repo name style Repo lipgloss.Style // Coverage styles CoverageHigh lipgloss.Style CoverageMed lipgloss.Style CoverageLow lipgloss.Style // Priority styles PriorityHigh lipgloss.Style PriorityMedium lipgloss.Style PriorityLow lipgloss.Style // Severity styles SeverityCritical lipgloss.Style SeverityHigh lipgloss.Style SeverityMedium lipgloss.Style SeverityLow lipgloss.Style // Status indicator styles StatusPending lipgloss.Style StatusRunning lipgloss.Style StatusSuccess lipgloss.Style StatusError lipgloss.Style StatusWarning lipgloss.Style // Deploy styles DeploySuccess lipgloss.Style DeployPending lipgloss.Style DeployFailed lipgloss.Style // Box styles Box lipgloss.Style BoxHeader lipgloss.Style ErrorBox lipgloss.Style SuccessBox lipgloss.Style }{ Dim: DimStyle, Muted: MutedStyle, Bold: BoldStyle, Value: ValueStyle, Accent: AccentStyle, Code: CodeStyle, Key: KeyStyle, Number: NumberStyle, Link: LinkStyle, Header: HeaderStyle, Title: TitleStyle, Stage: StageStyle, PrNum: PrNumberStyle, AccentL: AccentLabelStyle, Success: SuccessStyle, Error: ErrorStyle, Warning: WarningStyle, Info: InfoStyle, Dirty: GitDirtyStyle, Ahead: GitAheadStyle, Behind: GitBehindStyle, Clean: GitCleanStyle, Conflict: GitConflictStyle, Repo: RepoNameStyle, CoverageHigh: CoverageHighStyle, CoverageMed: CoverageMedStyle, CoverageLow: CoverageLowStyle, PriorityHigh: PriorityHighStyle, PriorityMedium: PriorityMediumStyle, PriorityLow: PriorityLowStyle, SeverityCritical: SeverityCriticalStyle, SeverityHigh: SeverityHighStyle, SeverityMedium: SeverityMediumStyle, SeverityLow: SeverityLowStyle, StatusPending: StatusPendingStyle, StatusRunning: StatusRunningStyle, StatusSuccess: StatusSuccessStyle, StatusError: StatusErrorStyle, StatusWarning: StatusWarningStyle, DeploySuccess: DeploySuccessStyle, DeployPending: DeployPendingStyle, DeployFailed: DeployFailedStyle, Box: BoxStyle, BoxHeader: BoxHeaderStyle, ErrorBox: ErrorBoxStyle, SuccessBox: SuccessBoxStyle, }
Styles provides namespaced access to CLI styles. Usage: cli.Style.Dim.Render("text"), cli.Style.Success.Render("done")
Functions ¶
func ArbitraryArgs ¶
func ArbitraryArgs() cobra.PositionalArgs
ArbitraryArgs returns a PositionalArgs that accepts any arguments.
func As ¶
As finds the first error in err's tree that matches target. This is a re-export of errors.As for convenience.
func BoolFlag ¶
BoolFlag adds a boolean flag to a command. The value will be stored in the provided pointer.
var verbose bool cli.BoolFlag(cmd, &verbose, "verbose", "v", false, "Enable verbose output")
func CheckMark ¶
CheckMark returns a styled checkmark (✓) or dash (—) based on presence. Useful for showing presence/absence in tables and lists.
func CheckMarkCustom ¶
func CheckMarkCustom(present bool, presentStyle, absentStyle lipgloss.Style, presentSymbol, absentSymbol string) string
CheckMarkCustom returns a styled indicator with custom symbols and styles.
func CheckResult ¶
CheckResult formats a check result with name and optional version. Used for environment checks like `✓ go 1.22.0` or `✗ docker`.
func Choose ¶
func Choose[T any](prompt string, items []T, opts ...ChooseOption[T]) T
Choose prompts the user to select from a list of items. Returns the selected item. Uses simple numbered selection for terminal compatibility.
choice := Choose("Select a file:", files)
choice := Choose("Select a file:", files, WithDisplay(func(f File) string { return f.Name }))
func ChooseAction ¶
func ChooseAction[T any](verb, subject string, items []T, opts ...ChooseOption[T]) T
ChooseAction prompts for selection using grammar composition.
file := ChooseAction("select", "file", files)
func ChooseMulti ¶
func ChooseMulti[T any](prompt string, items []T, opts ...ChooseOption[T]) []T
ChooseMulti prompts the user to select multiple items from a list. Returns the selected items. Uses space-separated numbers or ranges.
choices := ChooseMulti("Select files:", files)
choices := ChooseMulti("Select files:", files, WithDisplay(func(f File) string { return f.Name }))
Input format:
- "1 3 5" - select items 1, 3, and 5
- "1-3" - select items 1, 2, and 3
- "1 3-5" - select items 1, 3, 4, and 5
- "" (empty) - select none
func ChooseMultiAction ¶
func ChooseMultiAction[T any](verb, subject string, items []T, opts ...ChooseOption[T]) []T
ChooseMultiAction prompts for multiple selections using grammar composition.
files := ChooseMultiAction("select", "files", files)
func CommandStr ¶
CommandStr renders a command string in code style.
func Confirm ¶
func Confirm(prompt string, opts ...ConfirmOption) bool
Confirm prompts the user for yes/no confirmation. Returns true if the user enters "y" or "yes" (case-insensitive).
Basic usage:
if Confirm("Delete file?") { ... }
With options:
if Confirm("Save changes?", DefaultYes()) { ... }
if Confirm("Dangerous!", Required()) { ... }
if Confirm("Auto-continue?", Timeout(30*time.Second)) { ... }
func ConfirmAction ¶
func ConfirmAction(verb, subject string, opts ...ConfirmOption) bool
ConfirmAction prompts for confirmation of an action using grammar composition.
if ConfirmAction("delete", "config.yaml") { ... }
if ConfirmAction("save", "changes", DefaultYes()) { ... }
func ConfirmDangerousAction ¶
ConfirmDangerousAction prompts for double confirmation of a dangerous action. Shows initial question, then a "Really verb subject?" confirmation.
if ConfirmDangerousAction("delete", "config.yaml") { ... }
func Err ¶
Err creates a new error from a format string. This is a direct replacement for fmt.Errorf.
func ExactArgs ¶
func ExactArgs(n int) cobra.PositionalArgs
ExactArgs returns a PositionalArgs that accepts exactly N arguments.
func Execute ¶
func Execute() error
Execute runs the CLI root command. Returns an error if the command fails.
func FatalWrap ¶
FatalWrap prints a wrapped error message and exits with code 1. Does nothing if err is nil.
cli.FatalWrap(err, "load config") // Prints "✗ load config: <error>" and exits
func FatalWrapVerb ¶
FatalWrapVerb prints a wrapped error using i18n grammar and exits with code 1. Does nothing if err is nil.
cli.FatalWrapVerb(err, "load", "config") // Prints "✗ Failed to load config: <error>" and exits
func FmtSuccess ¶
FmtSuccess returns a styled success message with checkmark.
func FmtWarning ¶
FmtWarning returns a styled warning message with warning symbol.
func FormatAge ¶
FormatAge formats a time as a human-readable age string. Examples: "5m ago", "2h ago", "3d ago", "1w ago", "2mo ago"
func FormatCoverage ¶
FormatCoverage formats a coverage percentage with colour based on thresholds. High (green) >= 80%, Medium (amber) >= 50%, Low (red) < 50%.
func FormatCoverageCustom ¶
FormatCoverageCustom formats coverage with custom thresholds.
func FormatPriority ¶
FormatPriority returns styled text for a priority level.
func FormatSeverity ¶
FormatSeverity returns styled text for a severity level.
func FormatTaskStatus ¶
FormatTaskStatus returns styled text for a task status. Supports: pending, in_progress, completed, blocked, failed.
func GhAuthenticated ¶
func GhAuthenticated() bool
GhAuthenticated checks if the GitHub CLI is authenticated. Returns true if 'gh auth status' indicates a logged-in user.
func GitClone ¶
GitClone clones a GitHub repository to the specified path. Prefers 'gh repo clone' if authenticated, falls back to SSH.
func Init ¶
Init initialises the global CLI runtime. Call this once at startup (typically in main.go or cmd.Execute).
func IntFlag ¶
IntFlag adds an integer flag to a command. The value will be stored in the provided pointer.
var count int cli.IntFlag(cmd, &count, "count", "n", 10, "Number of items")
func Is ¶
Is reports whether any error in err's tree matches target. This is a re-export of errors.Is for convenience.
func Itoa ¶
Itoa converts an integer to a string. This is a convenience function similar to strconv.Itoa.
func Join ¶
Join returns an error that wraps the given errors. This is a re-export of errors.Join for convenience.
func KeyValueBold ¶
KeyValueBold returns a styled "key: value" with bold value.
func Label ¶
Label returns a styled label for key-value display. Example: Label("Status") -> "Status:" in dim gray
func LabelValue ¶
LabelValue returns a styled "label: value" pair. Example: LabelValue("Branch", "main") -> "Branch: main"
func LabelValueStyled ¶
LabelValueStyled returns a styled "label: value" pair with custom value style.
func Line ¶
Line translates a key via i18n.T and prints with newline. If no key is provided, prints an empty line.
cli.Line("i18n.progress.check") // prints "Checking...\n"
cli.Line("cmd.dev.ci.short") // prints translated text + \n
cli.Line("greeting", map[string]any{"Name": "World"}) // with args
cli.Line("") // prints empty line
func LogDebug ¶
func LogDebug(msg string)
LogDebug logs a debug message if log service is available.
func LogError ¶
func LogError(msg string)
LogError logs an error message if log service is available.
func Main ¶
func Main()
Main initialises and runs the CLI application. This is the main entry point for the CLI. Exits with code 1 on error.
func MaximumNArgs ¶
func MaximumNArgs(n int) cobra.PositionalArgs
MaximumNArgs returns a PositionalArgs that accepts maximum N arguments.
func MinimumNArgs ¶
func MinimumNArgs(n int) cobra.PositionalArgs
MinimumNArgs returns a PositionalArgs that accepts minimum N arguments.
func NewI18nService ¶
func NewI18nService(opts I18nOptions) func(*framework.Core) (any, error)
NewI18nService creates an i18n service factory.
func NewLogService ¶
func NewLogService(opts LogOptions) func(*framework.Core) (any, error)
NewLogService creates a log service factory with CLI styling.
func NoArgs ¶
func NoArgs() cobra.PositionalArgs
NoArgs returns a PositionalArgs that accepts no arguments.
func PersistentBoolFlag ¶
PersistentBoolFlag adds a persistent boolean flag (inherited by subcommands).
func PersistentStringFlag ¶
PersistentStringFlag adds a persistent string flag (inherited by subcommands).
func ProgressLabel ¶
ProgressLabel returns a dimmed label with colon for progress output. Example: ProgressLabel("Installing") -> "Installing:" in dim gray
func Question ¶
func Question(prompt string, opts ...QuestionOption) string
Question prompts the user for text input.
name := Question("Enter your name:")
name := Question("Enter your name:", WithDefault("Anonymous"))
name := Question("Enter your name:", RequiredInput())
func QuestionAction ¶
func QuestionAction(verb, subject string, opts ...QuestionOption) string
QuestionAction prompts for text input using grammar composition.
name := QuestionAction("rename", "old.txt")
func RegisterCommands ¶
func RegisterCommands(fn CommandRegistration)
RegisterCommands registers a function that adds commands to the CLI. Call this in your package's init() to register commands.
func init() {
cli.RegisterCommands(AddCommands)
}
func AddCommands(root *cobra.Command) {
root.AddCommand(myCmd)
}
func Run ¶
Run blocks until context is cancelled or signal received. Simple helper for daemon mode without advanced features.
cli.Init(cli.Options{AppName: "myapp"})
defer cli.Shutdown()
cli.Run(cli.Context())
func RunWithTimeout ¶
RunWithTimeout wraps Run with a graceful shutdown timeout. The returned function should be deferred to replace cli.Shutdown().
cli.Init(cli.Options{AppName: "myapp"})
shutdown := cli.RunWithTimeout(30 * time.Second)
defer shutdown()
cli.Run(cli.Context())
func Sprint ¶
Sprint formats using the default formats for its operands. This is a direct replacement for fmt.Sprint.
func StatusLine ¶
StatusLine creates a pipe-separated status line from parts. Each part should be pre-styled.
func StatusPart ¶
StatusPart creates a styled count + label for status lines. Example: StatusPart(5, "repos", SuccessStyle) -> "5 repos" in green
func StatusPrefix ¶
StatusPrefix returns a styled ">>" prefix for status messages.
func StatusText ¶
StatusText creates a styled label for status lines. Example: StatusText("clean", SuccessStyle) -> "clean" in green
func StringFlag ¶
StringFlag adds a string flag to a command. The value will be stored in the provided pointer.
var output string cli.StringFlag(cmd, &output, "output", "o", "", "Output file path")
func StringSliceFlag ¶
StringSliceFlag adds a string slice flag to a command. The value will be stored in the provided pointer.
var tags []string cli.StringSliceFlag(cmd, &tags, "tag", "t", nil, "Tags to apply")
func Styled ¶
Styled returns text formatted with a style. Example: cli.Styled(cli.Style.Success, "Done!")
func Styledf ¶
Styledf returns formatted text with a style. Example: cli.Styledf(cli.Style.Success, "Processed %d items", count)
func SuccessStr ¶
SuccessStr returns a success-styled string with checkmark.
func T ¶
T translates a key using the CLI's i18n service. Falls back to the global i18n.T if CLI not initialised.
func WarningStr ¶
WarningStr returns a warning-styled string with warning symbol.
func Wrap ¶
Wrap wraps an error with a message. Returns nil if err is nil.
return cli.Wrap(err, "load config") // "load config: <original error>"
func WrapAction ¶
WrapAction wraps an error using i18n grammar for "Failed to verb". Uses the i18n.ActionFailed function for proper grammar composition. Returns nil if err is nil.
return cli.WrapAction(err, "connect") // "Failed to connect: <original error>"
Types ¶
type ChooseOption ¶
type ChooseOption[T any] func(*chooseConfig[T])
ChooseOption configures Choose behaviour.
func Display ¶
func Display[T any](fn func(T) string) ChooseOption[T]
Display sets a custom display function for items. Alias for WithDisplay for shorter syntax.
Choose("Select:", items, Display(func(f File) string { return f.Name }))
func Filter ¶
func Filter[T any]() ChooseOption[T]
Filter enables type-to-filter functionality. Users can type to narrow down the list of options. Note: This is a hint for interactive UIs; the basic CLI Choose implementation uses numbered selection which doesn't support filtering.
func Multi ¶
func Multi[T any]() ChooseOption[T]
Multi allows multiple selections. Use ChooseMulti instead of Choose when this option is needed.
func WithDefaultIndex ¶
func WithDefaultIndex[T any](idx int) ChooseOption[T]
WithDefaultIndex sets the default selection index (0-based).
func WithDisplay ¶
func WithDisplay[T any](fn func(T) string) ChooseOption[T]
WithDisplay sets a custom display function for items.
type Command ¶
Command is the cobra command type. Re-exported for convenience so packages don't need to import cobra directly.
func NewCommand ¶
NewCommand creates a new command with a RunE handler. This is the standard way to create commands that may return errors.
cmd := cli.NewCommand("build", "Build the project", "", func(cmd *cli.Command, args []string) error {
// Build logic
return nil
})
func NewGroup ¶
NewGroup creates a new command group (no RunE). Use this for parent commands that only contain subcommands.
devCmd := cli.NewGroup("dev", "Development commands", "")
devCmd.AddCommand(buildCmd, testCmd)
func NewRun ¶
NewRun creates a new command with a simple Run handler (no error return). Use when the command cannot fail.
cmd := cli.NewRun("version", "Show version", "", func(cmd *cli.Command, args []string) {
cli.Println("v1.0.0")
})
func WithArgs ¶
func WithArgs(cmd *Command, args cobra.PositionalArgs) *Command
WithArgs sets the Args validation function for a command. Returns the command for chaining.
cmd := cli.NewCommand("build", "Build", "", run).WithArgs(cobra.ExactArgs(1))
func WithExample ¶
WithExample sets the Example field for a command. Returns the command for chaining.
type CommandRegistration ¶
CommandRegistration is a function that adds commands to the root.
type ConfirmOption ¶
type ConfirmOption func(*confirmConfig)
ConfirmOption configures Confirm behaviour.
func DefaultYes ¶
func DefaultYes() ConfirmOption
DefaultYes sets the default response to "yes" (pressing Enter confirms).
func Required ¶
func Required() ConfirmOption
Required prevents empty responses; user must explicitly type y/n.
func Timeout ¶
func Timeout(d time.Duration) ConfirmOption
Timeout sets a timeout after which the default response is auto-selected. If no default is set (not Required and not DefaultYes), defaults to "no".
Confirm("Continue?", Timeout(30*time.Second)) // Auto-no after 30s
Confirm("Continue?", DefaultYes(), Timeout(10*time.Second)) // Auto-yes after 10s
type Daemon ¶
type Daemon struct {
// contains filtered or unexported fields
}
Daemon manages daemon lifecycle.
func NewDaemon ¶
func NewDaemon(opts DaemonOptions) *Daemon
NewDaemon creates a daemon runner with the given options.
func (*Daemon) HealthAddr ¶
HealthAddr returns the health server address, or empty if disabled.
func (*Daemon) Run ¶
Run blocks until the context is cancelled or a signal is received. Handles graceful shutdown with the configured timeout.
type DaemonOptions ¶
type DaemonOptions struct {
// PIDFile path for single-instance enforcement.
// Leave empty to skip PID file management.
PIDFile string
// ShutdownTimeout is the maximum time to wait for graceful shutdown.
// Default: 30 seconds.
ShutdownTimeout time.Duration
// HealthAddr is the address for health check endpoints.
// Example: ":8080", "127.0.0.1:9000"
// Leave empty to disable health checks.
HealthAddr string
// HealthChecks are additional health check functions.
HealthChecks []HealthCheck
// OnReload is called when SIGHUP is received.
// Use for config reloading. Leave nil to ignore SIGHUP.
OnReload func() error
}
DaemonOptions configures daemon mode execution.
type HealthCheck ¶
type HealthCheck func() error
HealthCheck is a function that returns nil if healthy.
type HealthServer ¶
type HealthServer struct {
// contains filtered or unexported fields
}
HealthServer provides a minimal HTTP health check endpoint.
func NewHealthServer ¶
func NewHealthServer(addr string) *HealthServer
NewHealthServer creates a health check server.
func (*HealthServer) AddCheck ¶
func (h *HealthServer) AddCheck(check HealthCheck)
AddCheck registers a health check function.
func (*HealthServer) Addr ¶
func (h *HealthServer) Addr() string
Addr returns the actual address the server is listening on. Useful when using port 0 for dynamic port assignment.
func (*HealthServer) SetReady ¶
func (h *HealthServer) SetReady(ready bool)
SetReady sets the readiness status.
func (*HealthServer) Start ¶
func (h *HealthServer) Start() error
Start begins serving health check endpoints. Endpoints:
- /health - liveness probe (always 200 if server is up)
- /ready - readiness probe (200 if ready, 503 if not)
type I18nOptions ¶
type I18nOptions struct {
// Language overrides auto-detection (e.g., "en-GB", "de")
Language string
// Mode sets the translation mode (Normal, Strict, Collect)
Mode i18n.Mode
}
I18nOptions configures the i18n service.
type I18nService ¶
type I18nService struct {
*framework.ServiceRuntime[I18nOptions]
// contains filtered or unexported fields
}
I18nService wraps i18n as a Core service.
func (*I18nService) AvailableLanguages ¶
func (s *I18nService) AvailableLanguages() []string
AvailableLanguages returns all available languages.
func (*I18nService) ClearMissingKeys ¶
func (s *I18nService) ClearMissingKeys()
ClearMissingKeys resets the collected missing keys.
func (*I18nService) Language ¶
func (s *I18nService) Language() string
Language returns the current language.
func (*I18nService) MissingKeys ¶
func (s *I18nService) MissingKeys() []i18n.MissingKey
MissingKeys returns all missing keys collected in collect mode. Call this at the end of a QA session to report missing translations.
func (*I18nService) Mode ¶
func (s *I18nService) Mode() i18n.Mode
Mode returns the current translation mode.
func (*I18nService) OnStartup ¶
func (s *I18nService) OnStartup(ctx context.Context) error
OnStartup initialises the i18n service.
func (*I18nService) SetLanguage ¶
func (s *I18nService) SetLanguage(lang string)
SetLanguage changes the current language.
func (*I18nService) SetMode ¶
func (s *I18nService) SetMode(mode i18n.Mode)
SetMode changes the translation mode.
type LogService ¶
LogService wraps log.Service with CLI styling.
type Mode ¶
type Mode int
Mode represents the CLI execution mode.
func DetectMode ¶
func DetectMode() Mode
DetectMode determines the execution mode based on environment. Checks CORE_DAEMON env var first, then TTY status.
type Options ¶
type Options struct {
AppName string
Version string
Services []framework.Option // Additional services to register
// OnReload is called when SIGHUP is received (daemon mode).
// Use for configuration reloading. Leave nil to ignore SIGHUP.
OnReload func() error
}
Options configures the CLI runtime.
type PIDFile ¶
type PIDFile struct {
// contains filtered or unexported fields
}
PIDFile manages a process ID file for single-instance enforcement.
type QueryTranslate ¶
QueryTranslate requests a translation.
type QuestionOption ¶
type QuestionOption func(*questionConfig)
QuestionOption configures Question behaviour.
func WithDefault ¶
func WithDefault(value string) QuestionOption
WithDefault sets the default value shown in brackets.
func WithValidator ¶
func WithValidator(fn func(string) error) QuestionOption
WithValidator adds a validation function for the response.
type SignalOption ¶
type SignalOption func(*signalService)
SignalOption configures signal handling.
func WithReloadHandler ¶
func WithReloadHandler(fn func() error) SignalOption
WithReloadHandler sets a callback for SIGHUP.