Documentation
¶
Overview ¶
Package ui provides the terminal user interface.
Package ui provides the terminal user interface.
Index ¶
- Constants
- Variables
- func CloseLogger()
- func GetDefaultProjectColor(index int) string
- func GetThemeBorderColors() (normal, highlighted lipgloss.Color)
- func GetThemeCardColors() (bg, fg lipgloss.Color)
- func Icon(unicodeIcon, asciiIcon string) string
- func IconArrowDown() string
- func IconArrowLeft() string
- func IconArrowRight() string
- func IconArrowUp() string
- func IconBacklog() string
- func IconBlocked() string
- func IconDefault() string
- func IconDone() string
- func IconInProgress() string
- func IconPin() string
- func IconProcessing() string
- func IconShiftDown() string
- func IconShiftUp() string
- func IsGlobalDangerousMode() bool
- func ListThemes() []string
- func LoadProjectColors(database *db.DB)
- func LoadThemeFromDB(getSetting func(string) (string, error))
- func LogPath() string
- func PRDiffStats(pr *github.PRInfo) string
- func PRDiffStatsBright(pr *github.PRInfo) string
- func PRDiffStatsPlain(pr *github.PRInfo) string
- func PRStatusBadge(pr *github.PRInfo) string
- func PRStatusDescription(pr *github.PRInfo) string
- func PRStatusIcon(pr *github.PRInfo) string
- func ProjectColor(project string) lipgloss.Color
- func RingBell()
- func SetProjectColor(project, color string)
- func SetProjectColors(colors map[string]string)
- func SetTheme(name string) error
- func SetThemeFromJSON(data string) error
- func StatusColor(status string) lipgloss.Color
- func StatusIcon(status string) string
- func StatusStyle(status string) lipgloss.Style
- func SupportsUnicode() bool
- func TaskIndexFromShortcut(shortcut string) int
- func TaskShortcutHint(visibleIndex int) string
- func ThemeToJSON(theme Theme) (string, error)
- type AppModel
- func (m *AppModel) DumpDebugStateToFile(path string) error
- func (m *AppModel) GenerateDebugState() DebugState
- func (m *AppModel) Init() tea.Cmd
- func (m *AppModel) SetDebugStatePath(path string)
- func (m *AppModel) SetTasks(tasks []*db.Task)
- func (m *AppModel) Update(msg tea.Msg) (tea.Model, tea.Cmd)
- func (m *AppModel) View() string
- type AttachmentsModel
- type CommandPaletteModel
- func (m *CommandPaletteModel) Init() tea.Cmd
- func (m *CommandPaletteModel) IsAICommandRequest() bool
- func (m *CommandPaletteModel) IsCancelled() bool
- func (m *CommandPaletteModel) Projects() []*db.Project
- func (m *CommandPaletteModel) RawInput() string
- func (m *CommandPaletteModel) SelectedTask() *db.Task
- func (m *CommandPaletteModel) SetSize(width, height int)
- func (m *CommandPaletteModel) Update(msg tea.Msg) (*CommandPaletteModel, tea.Cmd)
- func (m *CommandPaletteModel) View() string
- type DebugColumn
- type DebugDashboard
- type DebugDetail
- type DebugFilter
- type DebugForm
- type DebugModals
- type DebugNotification
- type DebugSize
- type DebugState
- type DebugTask
- type DetailModel
- func (m *DetailModel) ClaudePaneID() string
- func (m *DetailModel) Cleanup()
- func (m *DetailModel) CleanupWithoutSaving()
- func (m *DetailModel) ClearPaneState()
- func (m *DetailModel) GetServerURL() string
- func (m *DetailModel) HandleLogsLoaded(msg logsLoadedMsg)
- func (m *DetailModel) HasRunningShellProcess() bool
- func (m *DetailModel) InFeedbackMode() bool
- func (m *DetailModel) IsFocused() bool
- func (m *DetailModel) IsShellPaneHidden() bool
- func (m *DetailModel) Refresh() tea.Cmd
- func (m *DetailModel) RefreshFocusState()
- func (m *DetailModel) RefreshPanesCmd() tea.Cmd
- func (m *DetailModel) SetPRInfo(prInfo *github.PRInfo)
- func (m *DetailModel) SetPosition(position, total int)
- func (m *DetailModel) SetSize(width, height int)
- func (m *DetailModel) StartTmuxTicker() tea.Cmd
- func (m *DetailModel) Task() *db.Task
- func (m *DetailModel) ToggleShellPane()
- func (m *DetailModel) Update(msg tea.Msg) (*DetailModel, tea.Cmd)
- func (m *DetailModel) UpdateTask(t *db.Task)
- func (m *DetailModel) View() string
- type FileBrowserModel
- func (m *FileBrowserModel) CurrentDir() string
- func (m *FileBrowserModel) Init() tea.Cmd
- func (m *FileBrowserModel) OnCancel(fn func())
- func (m *FileBrowserModel) OnSelect(fn func(path string))
- func (m *FileBrowserModel) SetSize(width, height int)
- func (m *FileBrowserModel) Update(msg tea.Msg) (*FileBrowserModel, tea.Cmd)
- func (m *FileBrowserModel) View() string
- type FilterAutocompleteModel
- func (m *FilterAutocompleteModel) HasResults() bool
- func (m *FilterAutocompleteModel) MoveDown()
- func (m *FilterAutocompleteModel) MoveUp()
- func (m *FilterAutocompleteModel) Reset()
- func (m *FilterAutocompleteModel) Select() string
- func (m *FilterAutocompleteModel) SetQuery(query string)
- func (m *FilterAutocompleteModel) View() string
- type FormField
- type FormModel
- func (m *FormModel) GetAttachment() string
- func (m *FormModel) GetAttachments() []string
- func (m *FormModel) GetDBTask() *db.Task
- func (m *FormModel) Init() tea.Cmd
- func (m *FormModel) OriginalProject() string
- func (m *FormModel) ProjectChanged() bool
- func (m *FormModel) SetQueue(queue bool)
- func (m *FormModel) SetSize(width, height int)
- func (m *FormModel) Update(msg tea.Msg) (tea.Model, tea.Cmd)
- func (m *FormModel) View() string
- type KanbanBoard
- func (k *KanbanBoard) ClearOriginColumn()
- func (k *KanbanBoard) ColumnCount() int
- func (k *KanbanBoard) FocusColumn(colIdx int)
- func (k *KanbanBoard) GetOpenBlockerCount(taskID int64) int
- func (k *KanbanBoard) GetPRInfo(taskID int64) *github.PRInfo
- func (k *KanbanBoard) GetTaskPosition() (int, int)
- func (k *KanbanBoard) HandleClick(x, y int) *db.Task
- func (k *KanbanBoard) HasNextTask() bool
- func (k *KanbanBoard) HasOriginColumn() bool
- func (k *KanbanBoard) HasPrevTask() bool
- func (k *KanbanBoard) HasRunningProcess(taskID int64) bool
- func (k *KanbanBoard) IsBlockedByDeps(taskID int64) bool
- func (k *KanbanBoard) IsColumnCollapsed(colIdx int) bool
- func (k *KanbanBoard) IsEmpty() bool
- func (k *KanbanBoard) IsMobileMode() bool
- func (k *KanbanBoard) JumpToPinned()
- func (k *KanbanBoard) JumpToUnpinned()
- func (k *KanbanBoard) MoveDown()
- func (k *KanbanBoard) MoveLeft()
- func (k *KanbanBoard) MoveRight()
- func (k *KanbanBoard) MoveUp()
- func (k *KanbanBoard) NeedsInput(taskID int64) bool
- func (k *KanbanBoard) RefreshTheme()
- func (k *KanbanBoard) SelectByShortcut(num int) *db.Task
- func (k *KanbanBoard) SelectTask(id int64) bool
- func (k *KanbanBoard) SelectedTask() *db.Task
- func (k *KanbanBoard) SetBlockedByDeps(blockedByDeps map[int64]int)
- func (k *KanbanBoard) SetHiddenDoneCount(count int)
- func (k *KanbanBoard) SetOriginColumn()
- func (k *KanbanBoard) SetPRInfo(taskID int64, info *github.PRInfo)
- func (k *KanbanBoard) SetRunningProcesses(running map[int64]bool)
- func (k *KanbanBoard) SetSize(width, height int)
- func (k *KanbanBoard) SetTasks(tasks []*db.Task)
- func (k *KanbanBoard) SetTasksNeedingInput(needsInput map[int64]bool)
- func (k *KanbanBoard) ToggleColumnCollapse(colIdx int)
- func (k *KanbanBoard) TotalTaskCount() int
- func (k *KanbanBoard) View() string
- type KanbanColumn
- type KeyMap
- type RetryModel
- func (m *RetryModel) GetAttachment() string
- func (m *RetryModel) GetAttachments() []string
- func (m *RetryModel) GetFeedback() string
- func (m *RetryModel) Init() tea.Cmd
- func (m *RetryModel) SetSize(width, height int)
- func (m *RetryModel) Update(msg tea.Msg) (*RetryModel, tea.Cmd)
- func (m *RetryModel) View() string
- type SettingsModel
- type TaskRefAutocompleteModel
- func (m *TaskRefAutocompleteModel) Dismiss()
- func (m *TaskRefAutocompleteModel) GetCursorPos() int
- func (m *TaskRefAutocompleteModel) GetQueryLength() int
- func (m *TaskRefAutocompleteModel) GetReference() string
- func (m *TaskRefAutocompleteModel) HasResults() bool
- func (m *TaskRefAutocompleteModel) IsDismissed() bool
- func (m *TaskRefAutocompleteModel) MoveDown()
- func (m *TaskRefAutocompleteModel) MoveUp()
- func (m *TaskRefAutocompleteModel) Reset()
- func (m *TaskRefAutocompleteModel) Select()
- func (m *TaskRefAutocompleteModel) SelectedTask() *db.Task
- func (m *TaskRefAutocompleteModel) SetQuery(query string, cursorPos int)
- func (m *TaskRefAutocompleteModel) View() string
- type Theme
- type UILogger
- type View
Constants ¶
const ( // Unicode icons IconBacklogUnicode = "◦" IconInProgressUnicode = "▶" IconBlockedUnicode = "⚠" IconDoneUnicode = "✓" IconPinUnicode = "📌" IconWarningUnicode = "⚠" IconArrowUpUnicode = "↑" IconArrowDownUnicode = "↓" IconArrowLeftUnicode = "←" IconArrowRightUnicode = "→" IconShiftUpUnicode = "⇧↑" IconShiftDownUnicode = "⇧↓" // ASCII fallbacks IconBacklogASCII = "o" IconInProgressASCII = ">" IconProcessingASCII = "~" IconBlockedASCII = "!" IconDoneASCII = "*" IconPinASCII = "P" IconWarningASCII = "!" IconArrowUpASCII = "^" IconArrowDownASCII = "v" IconArrowLeftASCII = "<" IconArrowRightASCII = ">" IconShiftUpASCII = "^^" IconShiftDownASCII = "vv" IconProcessingUnicode = "⋯" IconDefaultUnicode = "·" IconDefaultASCII = "." )
Icon constants - Unicode and ASCII versions
const MobileWidthThreshold = 80
MobileWidthThreshold is the minimum width for showing all columns. Below this, only the selected column is shown.
Variables ¶
var ( // Primary colors ColorPrimary = lipgloss.Color("#61AFEF") // Soft blue (OneDark default) ColorSecondary = lipgloss.Color("#56B6C2") // Cyan ColorSuccess = lipgloss.Color("#98C379") // Green ColorWarning = lipgloss.Color("#E5C07B") // Yellow ColorError = lipgloss.Color("#E06C75") // Red ColorDangerous = lipgloss.Color("#E06C75") // Red (same as error, for dangerous mode indicator) ColorMuted = lipgloss.Color("#5C6370") // Gray // Status colors ColorInProgress = lipgloss.Color("#D19A66") // Orange ColorDone = lipgloss.Color("#98C379") // Green ColorBlocked = lipgloss.Color("#E06C75") // Red // Default project colors palette - used when no color is set // These are distinct, visually pleasing colors for project labels DefaultProjectColors = []string{ "#C678DD", "#61AFEF", "#56B6C2", "#98C379", "#E5C07B", "#E06C75", "#D19A66", "#ABB2BF", } // Type colors (fixed, not theme-dependent) ColorCode = lipgloss.Color("#C678DD") // Purple ColorWriting = lipgloss.Color("#E5C07B") // Yellow ColorThinking = lipgloss.Color("#56B6C2") // Cyan )
Colors - these are updated by refreshStyles() when theme changes
var ( // Text styles Bold = lipgloss.NewStyle().Bold(true) Dim = lipgloss.NewStyle().Foreground(ColorMuted) Title = lipgloss.NewStyle().Bold(true).Foreground(ColorPrimary) Subtitle = lipgloss.NewStyle().Foreground(ColorSecondary) Success = lipgloss.NewStyle().Foreground(ColorSuccess) Warning = lipgloss.NewStyle().Foreground(ColorWarning) Error = lipgloss.NewStyle().Foreground(ColorError) AttachmentChip = lipgloss.NewStyle(). Border(lipgloss.RoundedBorder()). BorderForeground(ColorMuted). Foreground(ColorMuted). Padding(0, 1) AttachmentChipSelected = lipgloss.NewStyle(). Border(lipgloss.RoundedBorder()). BorderForeground(ColorPrimary). Foreground(ColorPrimary). Bold(true). Padding(0, 1) // Status badges StatusInProgress = lipgloss.NewStyle(). Foreground(ColorInProgress). SetString("⋯") StatusDone = lipgloss.NewStyle(). Foreground(ColorDone). SetString("✓") StatusBlocked = lipgloss.NewStyle(). Foreground(ColorBlocked). SetString("!") // Box styles Box = lipgloss.NewStyle(). Border(lipgloss.RoundedBorder()). BorderForeground(ColorMuted). Padding(0, 1) FocusedBox = lipgloss.NewStyle(). Border(lipgloss.RoundedBorder()). BorderForeground(ColorPrimary). Padding(0, 1) // List item styles ListItem = lipgloss.NewStyle(). PaddingLeft(2) SelectedListItem = lipgloss.NewStyle(). PaddingLeft(2). Foreground(ColorPrimary). Bold(true) // Help bar HelpBar = lipgloss.NewStyle(). Foreground(ColorMuted). Padding(1, 0) HelpKey = lipgloss.NewStyle(). Foreground(ColorSecondary). Bold(true) HelpDesc = lipgloss.NewStyle(). Foreground(ColorMuted) // Header Header = lipgloss.NewStyle(). Bold(true). Foreground(ColorPrimary). Padding(0, 1). MarginBottom(1) // Tag styles ProjectTag = lipgloss.NewStyle(). Foreground(ColorSecondary). Bold(true) TypeTag = lipgloss.NewStyle(). Foreground(ColorMuted). Italic(true) )
Base styles - these are updated by refreshStyles() when theme changes
var ( ColorPROpen = lipgloss.Color("#98C379") // Green - ready to merge ColorPRDraft = lipgloss.Color("#5C6370") // Gray - draft ColorPRMerged = lipgloss.Color("#C678DD") // Purple - merged ColorPRClosed = lipgloss.Color("#E06C75") // Red - closed ColorPRPending = lipgloss.Color("#E5C07B") // Yellow - checks running ColorPRFailing = lipgloss.Color("#E06C75") // Red - checks failing )
PR status colors
var ( ColorDiffAdd = lipgloss.Color("#98C379") // Green for additions (bright) ColorDiffDel = lipgloss.Color("#E06C75") // Red for deletions (bright) ColorDiffAddDim = lipgloss.Color("#5C7A4A") // Dim green for unselected ColorDiffDelDim = lipgloss.Color("#8B4C52") // Dim red for unselected )
Diff stat colors (git-style green/red)
var BuiltinThemes = map[string]Theme{ "onedark": OneDarkTheme, "default": DefaultTheme, "nord": NordTheme, "gruvbox": GruvboxTheme, "catppuccin": CatppuccinTheme, "dracula": DraculaTheme, }
BuiltinThemes contains all built-in themes.
var CatppuccinTheme = Theme{
Name: "catppuccin",
Primary: "#CBA6F7",
Secondary: "#89DCEB",
Muted: "#6C7086",
Success: "#A6E3A1",
Warning: "#F9E2AF",
Error: "#F38BA8",
InProgress: "#FAB387",
Done: "#A6E3A1",
Blocked: "#F38BA8",
Backlog: "#6C7086",
CardBg: "#313244",
CardFg: "#CDD6F4",
CardBorder: "#45475A",
CardBorderHi: "#CBA6F7",
ColumnBorder: "#45475A",
ColumnBorderHi: "#CBA6F7",
}
CatppuccinTheme is inspired by Catppuccin Mocha - soothing pastel colors.
var DefaultTheme = Theme{
Name: "default",
Primary: "#7C3AED",
Secondary: "#06B6D4",
Muted: "#6B7280",
Success: "#10B981",
Warning: "#F59E0B",
Error: "#EF4444",
InProgress: "#9A9463",
Done: "#10B981",
Blocked: "#EF4444",
Backlog: "#6B7280",
CardBg: "#333333",
CardFg: "#FFFFFF",
CardBorder: "#6B7280",
CardBorderHi: "#7C3AED",
ColumnBorder: "#6B7280",
ColumnBorderHi: "#7C3AED",
}
DefaultTheme is the original purple-heavy theme.
var DraculaTheme = Theme{
Name: "dracula",
Primary: "#BD93F9",
Secondary: "#8BE9FD",
Muted: "#6272A4",
Success: "#50FA7B",
Warning: "#F1FA8C",
Error: "#FF5555",
InProgress: "#FFB86C",
Done: "#50FA7B",
Blocked: "#FF5555",
Backlog: "#6272A4",
CardBg: "#44475A",
CardFg: "#F8F8F2",
CardBorder: "#6272A4",
CardBorderHi: "#BD93F9",
ColumnBorder: "#6272A4",
ColumnBorderHi: "#BD93F9",
}
DraculaTheme is inspired by the Dracula color scheme - vibrant purples and pinks.
var GruvboxTheme = Theme{
Name: "gruvbox",
Primary: "#83A598",
Secondary: "#B8BB26",
Muted: "#665C54",
Success: "#B8BB26",
Warning: "#FABD2F",
Error: "#FB4934",
InProgress: "#FE8019",
Done: "#B8BB26",
Blocked: "#FB4934",
Backlog: "#665C54",
CardBg: "#3C3836",
CardFg: "#EBDBB2",
CardBorder: "#504945",
CardBorderHi: "#83A598",
ColumnBorder: "#504945",
ColumnBorderHi: "#83A598",
}
GruvboxTheme is inspired by the Gruvbox color scheme - retro, earthy tones.
var NordTheme = Theme{
Name: "nord",
Primary: "#88C0D0",
Secondary: "#81A1C1",
Muted: "#4C566A",
Success: "#A3BE8C",
Warning: "#EBCB8B",
Error: "#BF616A",
InProgress: "#D08770",
Done: "#A3BE8C",
Blocked: "#BF616A",
Backlog: "#4C566A",
CardBg: "#3B4252",
CardFg: "#ECEFF4",
CardBorder: "#4C566A",
CardBorderHi: "#88C0D0",
ColumnBorder: "#4C566A",
ColumnBorderHi: "#88C0D0",
}
NordTheme is inspired by the Nord color palette - arctic, bluish tones.
var OneDarkTheme = Theme{
Name: "onedark",
Primary: "#61AFEF",
Secondary: "#56B6C2",
Muted: "#5C6370",
Success: "#98C379",
Warning: "#E5C07B",
Error: "#E06C75",
InProgress: "#D19A66",
Done: "#98C379",
Blocked: "#E06C75",
Backlog: "#5C6370",
CardBg: "#3E4451",
CardFg: "#ABB2BF",
CardBorder: "#3E4451",
CardBorderHi: "#61AFEF",
ColumnBorder: "#3E4451",
ColumnBorderHi: "#61AFEF",
}
OneDarkTheme is inspired by Atom's One Dark theme - subtle and easy on the eyes.
Functions ¶
func GetDefaultProjectColor ¶
GetDefaultProjectColor returns a default color for a project based on its index. Used when a project doesn't have a color set.
func GetThemeBorderColors ¶
GetThemeBorderColors returns border colors from the current theme.
func GetThemeCardColors ¶
GetThemeCardColors returns card-specific colors from the current theme.
func IconInProgress ¶
func IconInProgress() string
IconInProgress returns the in-progress status icon.
func IconProcessing ¶
func IconProcessing() string
IconProcessing returns the processing status icon.
func IsGlobalDangerousMode ¶
func IsGlobalDangerousMode() bool
IsGlobalDangerousMode returns true if the system is running in global dangerous mode. This is set by the WORKTREE_DANGEROUS_MODE=1 environment variable.
func ListThemes ¶
func ListThemes() []string
ListThemes returns the names of all built-in themes (sorted).
func LoadProjectColors ¶
LoadProjectColors loads all project colors from the database into the cache.
func LoadThemeFromDB ¶
LoadThemeFromDB loads and applies the saved theme from the database. If no theme is saved or the theme is invalid, OneDark is used as the default.
func PRDiffStats ¶
PRDiffStats returns a formatted diff stats string like "+123 -45" with dim colors. Use this for unselected items. Returns empty string if no changes or PR is nil.
func PRDiffStatsBright ¶
PRDiffStatsBright returns diff stats with bright colors (for selected items).
func PRDiffStatsPlain ¶
PRDiffStatsPlain returns diff stats without color (for selected items with inverted bg).
func PRStatusBadge ¶
PRStatusBadge returns a styled badge for a PR status.
func PRStatusDescription ¶
PRStatusDescription returns a human-readable description of PR status.
func PRStatusIcon ¶
PRStatusIcon returns just the icon character for a PR status (without styling). This is useful for creating consistently-sized badges with different color schemes.
func ProjectColor ¶
ProjectColor returns the color for a project. It uses the cached color from the database, or falls back to a default color.
func RingBell ¶
func RingBell()
RingBell sends the BEL character (\a) to the terminal to trigger an audible bell. It writes directly to /dev/tty to bypass any stdout buffering that might occur when running inside a TUI framework like Bubble Tea.
func SetProjectColor ¶
func SetProjectColor(project, color string)
SetProjectColor sets the color for a single project.
func SetProjectColors ¶
SetProjectColors updates the project color cache with colors from the database. This should be called when projects are loaded.
func SetThemeFromJSON ¶
SetThemeFromJSON sets a custom theme from JSON.
func StatusColor ¶
StatusColor returns the background color for a status.
func StatusIcon ¶
StatusIcon returns the icon for a given status.
func StatusStyle ¶
StatusStyle returns the style for a given status.
func SupportsUnicode ¶
func SupportsUnicode() bool
SupportsUnicode returns true if the terminal likely supports Unicode characters. It checks LANG, LC_ALL, and LC_CTYPE environment variables for UTF-8 indicators.
func TaskIndexFromShortcut ¶
TaskIndexFromShortcut converts a shortcut string to a 1-indexed visible task index. Returns 0 if the shortcut is invalid.
func TaskShortcutHint ¶
TaskShortcutHint returns the keyboard shortcut hint for a visible task. Tasks 1-9 use single digits "1"-"9". Tasks 10-18 use double digits "11", "22", "33", etc. Returns empty string for tasks beyond 18.
func ThemeToJSON ¶
ThemeToJSON serializes a theme to JSON.
Types ¶
type AppModel ¶
type AppModel struct {
// contains filtered or unexported fields
}
AppModel is the main application model.
func NewAppModel ¶
func NewAppModel(database *db.DB, exec *executor.Executor, workingDir string, version ...string) *AppModel
NewAppModel creates a new application model.
func (*AppModel) DumpDebugStateToFile ¶
DumpDebugStateToFile writes the current debug state to a file.
func (*AppModel) GenerateDebugState ¶
func (m *AppModel) GenerateDebugState() DebugState
GenerateDebugState creates a snapshot of the current application state.
func (*AppModel) SetDebugStatePath ¶
SetDebugStatePath sets the path for dumping debug state.
type AttachmentsModel ¶
type AttachmentsModel struct {
// contains filtered or unexported fields
}
AttachmentsModel displays and manages task attachments.
func NewAttachmentsModel ¶
NewAttachmentsModel creates a new attachments view.
func (*AttachmentsModel) AddFile ¶
func (m *AttachmentsModel) AddFile(path string) tea.Cmd
AddFile adds a file to the task's attachments.
func (*AttachmentsModel) Init ¶
func (m *AttachmentsModel) Init() tea.Cmd
Init initializes the model.
func (*AttachmentsModel) Update ¶
func (m *AttachmentsModel) Update(msg tea.Msg) (*AttachmentsModel, tea.Cmd)
Update handles messages.
func (*AttachmentsModel) View ¶
func (m *AttachmentsModel) View() string
View renders the attachments view.
type CommandPaletteModel ¶
type CommandPaletteModel struct {
// contains filtered or unexported fields
}
CommandPaletteModel represents the Command+P task switcher and AI command input.
func NewCommandPaletteModel ¶
func NewCommandPaletteModel(database *db.DB, tasks []*db.Task, width, height int) *CommandPaletteModel
NewCommandPaletteModel creates a new command palette model.
func (*CommandPaletteModel) Init ¶
func (m *CommandPaletteModel) Init() tea.Cmd
Init initializes the command palette.
func (*CommandPaletteModel) IsAICommandRequest ¶
func (m *CommandPaletteModel) IsAICommandRequest() bool
IsAICommandRequest returns true if the user pressed Enter with text that should go to AI.
func (*CommandPaletteModel) IsCancelled ¶
func (m *CommandPaletteModel) IsCancelled() bool
IsCancelled returns true if the user cancelled the palette.
func (*CommandPaletteModel) Projects ¶
func (m *CommandPaletteModel) Projects() []*db.Project
Projects returns the available projects for AI context.
func (*CommandPaletteModel) RawInput ¶
func (m *CommandPaletteModel) RawInput() string
RawInput returns the raw input text for AI command processing.
func (*CommandPaletteModel) SelectedTask ¶
func (m *CommandPaletteModel) SelectedTask() *db.Task
SelectedTask returns the selected task, or nil if cancelled.
func (*CommandPaletteModel) SetSize ¶
func (m *CommandPaletteModel) SetSize(width, height int)
SetSize updates the command palette dimensions.
func (*CommandPaletteModel) Update ¶
func (m *CommandPaletteModel) Update(msg tea.Msg) (*CommandPaletteModel, tea.Cmd)
Update handles messages.
func (*CommandPaletteModel) View ¶
func (m *CommandPaletteModel) View() string
View renders the command palette.
type DebugColumn ¶
type DebugDashboard ¶
type DebugDashboard struct {
Columns []DebugColumn `json:"columns"`
FocusedColumn int `json:"focused_column"`
SelectedTask int64 `json:"selected_task_id,omitempty"`
}
type DebugDetail ¶
type DebugFilter ¶
type DebugModals ¶
type DebugModals struct {
ActiveConfirm string `json:"active_confirm,omitempty"` // "delete", "close", "archive", "quit", etc.
}
type DebugNotification ¶
type DebugState ¶
type DebugState struct {
View string `json:"view"`
Size DebugSize `json:"size"`
Dashboard *DebugDashboard `json:"dashboard,omitempty"`
Detail *DebugDetail `json:"detail,omitempty"`
Form *DebugForm `json:"form,omitempty"`
Modals *DebugModals `json:"modals,omitempty"`
Filter *DebugFilter `json:"filter,omitempty"`
Notification *DebugNotification `json:"notification,omitempty"`
Timestamp time.Time `json:"timestamp"`
}
DebugState represents the application state as a "Text DOM" for AI agents.
type DetailModel ¶
type DetailModel struct {
// contains filtered or unexported fields
}
DetailModel represents the task detail view.
func NewDetailModel ¶
func NewDetailModel(t *db.Task, database *db.DB, exec *executor.Executor, width, height int, focusExecutor bool) (*DetailModel, tea.Cmd)
NewDetailModel creates a new detail model. Returns the model and an optional command for async pane setup. If focusExecutor is true, the executor pane will be focused after panes are joined.
func (*DetailModel) ClaudePaneID ¶
func (m *DetailModel) ClaudePaneID() string
ClaudePaneID returns the tmux pane ID where Claude is running.
func (*DetailModel) Cleanup ¶
func (m *DetailModel) Cleanup()
Cleanup should be called when leaving detail view. It saves the current pane height before breaking the panes.
func (*DetailModel) CleanupWithoutSaving ¶
func (m *DetailModel) CleanupWithoutSaving()
CleanupWithoutSaving cleans up panes without saving the height. Use this during task transitions (prev/next) to avoid rounding errors that accumulate with each transition and cause the pane to shrink.
func (*DetailModel) ClearPaneState ¶
func (m *DetailModel) ClearPaneState()
ClearPaneState clears the cached pane state without breaking panes. Use this when the tmux window has been recreated externally (e.g., dangerous mode toggle).
func (*DetailModel) GetServerURL ¶
func (m *DetailModel) GetServerURL() string
GetServerURL returns the server URL if a server is listening on the task's port.
func (*DetailModel) HandleLogsLoaded ¶
func (m *DetailModel) HandleLogsLoaded(msg logsLoadedMsg)
HandleLogsLoaded processes the result of async log loading.
func (*DetailModel) HasRunningShellProcess ¶
func (m *DetailModel) HasRunningShellProcess() bool
HasRunningShellProcess returns true if the shell pane has a running process.
func (*DetailModel) InFeedbackMode ¶
func (m *DetailModel) InFeedbackMode() bool
InFeedbackMode returns false - use tmux pane for interaction.
func (*DetailModel) IsFocused ¶
func (m *DetailModel) IsFocused() bool
IsFocused returns true if the detail pane is the active tmux pane.
func (*DetailModel) IsShellPaneHidden ¶
func (m *DetailModel) IsShellPaneHidden() bool
IsShellPaneHidden returns true if the shell pane is currently hidden.
func (*DetailModel) Refresh ¶
func (m *DetailModel) Refresh() tea.Cmd
Refresh reloads task and logs from database. Returns a tea.Cmd if async work (like log loading) needs to happen.
func (*DetailModel) RefreshFocusState ¶
func (m *DetailModel) RefreshFocusState()
RefreshFocusState is a lightweight refresh that only updates focus state. Used by the fast focus tick for responsive dimming without full refresh overhead.
func (*DetailModel) RefreshPanesCmd ¶
func (m *DetailModel) RefreshPanesCmd() tea.Cmd
RefreshPanesCmd returns a command to refresh the tmux panes. Use this after ClearPaneState() to rejoin panes to a recreated window.
func (*DetailModel) SetPRInfo ¶
func (m *DetailModel) SetPRInfo(prInfo *github.PRInfo)
SetPRInfo sets the PR info for this task.
func (*DetailModel) SetPosition ¶
func (m *DetailModel) SetPosition(position, total int)
SetPosition updates the task's position in its column.
func (*DetailModel) SetSize ¶
func (m *DetailModel) SetSize(width, height int)
SetSize updates the viewport size.
func (*DetailModel) StartTmuxTicker ¶
func (m *DetailModel) StartTmuxTicker() tea.Cmd
StartTmuxTicker is no longer needed - real tmux pane handles display.
func (*DetailModel) ToggleShellPane ¶
func (m *DetailModel) ToggleShellPane()
ToggleShellPane toggles the visibility of the shell pane. When hidden, the shell pane is moved to the daemon window and Claude expands to full width. When shown, the shell pane is rejoined from the daemon or a new one is created.
func (*DetailModel) Update ¶
func (m *DetailModel) Update(msg tea.Msg) (*DetailModel, tea.Cmd)
Update handles messages.
func (*DetailModel) UpdateTask ¶
func (m *DetailModel) UpdateTask(t *db.Task)
UpdateTask updates the task and refreshes the view.
type FileBrowserModel ¶
type FileBrowserModel struct {
// contains filtered or unexported fields
}
FileBrowserModel is a directory browser for selecting paths.
func NewFileBrowserModel ¶
func NewFileBrowserModel(startPath string, width, height int) *FileBrowserModel
NewFileBrowserModel creates a new file browser starting at the given path.
func (*FileBrowserModel) CurrentDir ¶
func (m *FileBrowserModel) CurrentDir() string
CurrentDir returns the currently displayed directory.
func (*FileBrowserModel) Init ¶
func (m *FileBrowserModel) Init() tea.Cmd
Init initializes the model.
func (*FileBrowserModel) OnCancel ¶
func (m *FileBrowserModel) OnCancel(fn func())
OnCancel sets the callback for when browsing is cancelled.
func (*FileBrowserModel) OnSelect ¶
func (m *FileBrowserModel) OnSelect(fn func(path string))
OnSelect sets the callback for when a path is selected.
func (*FileBrowserModel) SetSize ¶
func (m *FileBrowserModel) SetSize(width, height int)
SetSize updates the browser size.
func (*FileBrowserModel) Update ¶
func (m *FileBrowserModel) Update(msg tea.Msg) (*FileBrowserModel, tea.Cmd)
Update handles messages.
func (*FileBrowserModel) View ¶
func (m *FileBrowserModel) View() string
View renders the file browser.
type FilterAutocompleteModel ¶
type FilterAutocompleteModel struct {
// contains filtered or unexported fields
}
FilterAutocompleteModel provides project name autocomplete for the filter.
func NewFilterAutocompleteModel ¶
func NewFilterAutocompleteModel(database *db.DB) *FilterAutocompleteModel
NewFilterAutocompleteModel creates a new filter autocomplete model.
func (*FilterAutocompleteModel) HasResults ¶
func (m *FilterAutocompleteModel) HasResults() bool
func (*FilterAutocompleteModel) MoveDown ¶
func (m *FilterAutocompleteModel) MoveDown()
func (*FilterAutocompleteModel) MoveUp ¶
func (m *FilterAutocompleteModel) MoveUp()
func (*FilterAutocompleteModel) Reset ¶
func (m *FilterAutocompleteModel) Reset()
func (*FilterAutocompleteModel) Select ¶
func (m *FilterAutocompleteModel) Select() string
Select returns the selected project name.
func (*FilterAutocompleteModel) SetQuery ¶
func (m *FilterAutocompleteModel) SetQuery(query string)
SetQuery filters projects based on query and resets selection.
func (*FilterAutocompleteModel) View ¶
func (m *FilterAutocompleteModel) View() string
View renders the dropdown.
type FormModel ¶
type FormModel struct {
// contains filtered or unexported fields
}
FormModel represents the new task form.
func NewEditFormModel ¶
func NewEditFormModel(database *db.DB, task *db.Task, width, height int, availableExecutors []string) *FormModel
NewEditFormModel creates a form model pre-populated with an existing task's data for editing.
func NewFormModel ¶
func NewFormModel(database *db.DB, width, height int, workingDir string, availableExecutors []string) *FormModel
NewFormModel creates a new form model.
func (*FormModel) GetAttachment ¶
GetAttachment returns the first attachment for backwards compatibility.
func (*FormModel) GetAttachments ¶
GetAttachments returns the parsed attachment file paths.
func (*FormModel) OriginalProject ¶
OriginalProject returns the original project when editing.
func (*FormModel) ProjectChanged ¶
ProjectChanged returns true if the project was changed during editing. Only relevant when isEdit is true.
type KanbanBoard ¶
type KanbanBoard struct {
// contains filtered or unexported fields
}
KanbanBoard manages the kanban board state.
func NewKanbanBoard ¶
func NewKanbanBoard(width, height int) *KanbanBoard
NewKanbanBoard creates a new kanban board.
func (*KanbanBoard) ClearOriginColumn ¶
func (k *KanbanBoard) ClearOriginColumn()
ClearOriginColumn clears the origin column, returning to normal navigation.
func (*KanbanBoard) ColumnCount ¶
func (k *KanbanBoard) ColumnCount() int
ColumnCount returns the number of columns.
func (*KanbanBoard) FocusColumn ¶
func (k *KanbanBoard) FocusColumn(colIdx int)
FocusColumn moves selection to a specific column by index. If the column is collapsed, it will be uncollapsed first.
func (*KanbanBoard) GetOpenBlockerCount ¶
func (k *KanbanBoard) GetOpenBlockerCount(taskID int64) int
GetOpenBlockerCount returns the number of open blockers for a task. Returns 0 if the task has no blockers.
func (*KanbanBoard) GetPRInfo ¶
func (k *KanbanBoard) GetPRInfo(taskID int64) *github.PRInfo
GetPRInfo returns the PR info for a task.
func (*KanbanBoard) GetTaskPosition ¶
func (k *KanbanBoard) GetTaskPosition() (int, int)
GetTaskPosition returns the position of the currently selected task in its column. Returns (position, total) where position is 1-indexed, or (0, 0) if no task is selected.
func (*KanbanBoard) HandleClick ¶
func (k *KanbanBoard) HandleClick(x, y int) *db.Task
HandleClick handles a mouse click at the given coordinates. Returns the clicked task if a task card was clicked, nil otherwise. Also updates the selection to the clicked task.
func (*KanbanBoard) HasNextTask ¶
func (k *KanbanBoard) HasNextTask() bool
HasNextTask returns true if there is a next task in the current column. Returns false if already at the last task or no tasks exist.
func (*KanbanBoard) HasOriginColumn ¶
func (k *KanbanBoard) HasOriginColumn() bool
HasOriginColumn returns true if an origin column is set.
func (*KanbanBoard) HasPrevTask ¶
func (k *KanbanBoard) HasPrevTask() bool
HasPrevTask returns true if there is a previous task in the current column. Returns false if already at the first task or no tasks exist.
func (*KanbanBoard) HasRunningProcess ¶
func (k *KanbanBoard) HasRunningProcess(taskID int64) bool
HasRunningProcess returns true if the task has a running shell process.
func (*KanbanBoard) IsBlockedByDeps ¶
func (k *KanbanBoard) IsBlockedByDeps(taskID int64) bool
IsBlockedByDeps returns true if the task is blocked by dependencies.
func (*KanbanBoard) IsColumnCollapsed ¶
func (k *KanbanBoard) IsColumnCollapsed(colIdx int) bool
IsColumnCollapsed returns true if the column at the given index is collapsed.
func (*KanbanBoard) IsEmpty ¶
func (k *KanbanBoard) IsEmpty() bool
IsEmpty returns true if all columns have no tasks.
func (*KanbanBoard) IsMobileMode ¶
func (k *KanbanBoard) IsMobileMode() bool
IsMobileMode returns true if the board should show single-column mode.
func (*KanbanBoard) JumpToPinned ¶
func (k *KanbanBoard) JumpToPinned()
JumpToPinned moves selection to the first pinned task in the current column. If there are no pinned tasks, moves to the top of the column.
func (*KanbanBoard) JumpToUnpinned ¶
func (k *KanbanBoard) JumpToUnpinned()
JumpToUnpinned moves selection to the first unpinned task in the current column. If all tasks are pinned or there are no tasks, stays at current position.
func (*KanbanBoard) MoveDown ¶
func (k *KanbanBoard) MoveDown()
MoveDown moves selection down within the current column. If at the bottom, wraps around to the top.
func (*KanbanBoard) MoveLeft ¶
func (k *KanbanBoard) MoveLeft()
MoveLeft moves selection to the left column, skipping collapsed columns.
func (*KanbanBoard) MoveRight ¶
func (k *KanbanBoard) MoveRight()
MoveRight moves selection to the right column, skipping collapsed columns.
func (*KanbanBoard) MoveUp ¶
func (k *KanbanBoard) MoveUp()
MoveUp moves selection up within the current column. If at the top, wraps around to the bottom.
func (*KanbanBoard) NeedsInput ¶
func (k *KanbanBoard) NeedsInput(taskID int64) bool
NeedsInput returns true if the task has an active input notification.
func (*KanbanBoard) RefreshTheme ¶
func (k *KanbanBoard) RefreshTheme()
RefreshTheme updates column colors after a theme change.
func (*KanbanBoard) SelectByShortcut ¶
func (k *KanbanBoard) SelectByShortcut(num int) *db.Task
SelectByShortcut selects the Nth visible task in the current column (1-18). Returns the selected task, or nil if the shortcut doesn't correspond to a visible task.
func (*KanbanBoard) SelectTask ¶
func (k *KanbanBoard) SelectTask(id int64) bool
SelectTask selects a task by ID.
func (*KanbanBoard) SelectedTask ¶
func (k *KanbanBoard) SelectedTask() *db.Task
SelectedTask returns the currently selected task.
func (*KanbanBoard) SetBlockedByDeps ¶
func (k *KanbanBoard) SetBlockedByDeps(blockedByDeps map[int64]int)
SetBlockedByDeps updates the map of tasks blocked by dependencies. The map contains task ID -> number of open blockers.
func (*KanbanBoard) SetHiddenDoneCount ¶
func (k *KanbanBoard) SetHiddenDoneCount(count int)
SetHiddenDoneCount sets the number of done tasks not shown in the kanban.
func (*KanbanBoard) SetOriginColumn ¶
func (k *KanbanBoard) SetOriginColumn()
SetOriginColumn sets the origin column for detail view navigation. This preserves the column context even if the task moves to a different column.
func (*KanbanBoard) SetPRInfo ¶
func (k *KanbanBoard) SetPRInfo(taskID int64, info *github.PRInfo)
SetPRInfo updates the PR info for a task.
func (*KanbanBoard) SetRunningProcesses ¶
func (k *KanbanBoard) SetRunningProcesses(running map[int64]bool)
SetRunningProcesses updates the map of tasks with running shell processes.
func (*KanbanBoard) SetSize ¶
func (k *KanbanBoard) SetSize(width, height int)
SetSize updates the board dimensions.
func (*KanbanBoard) SetTasks ¶
func (k *KanbanBoard) SetTasks(tasks []*db.Task)
SetTasks updates the tasks in the kanban board.
func (*KanbanBoard) SetTasksNeedingInput ¶
func (k *KanbanBoard) SetTasksNeedingInput(needsInput map[int64]bool)
SetTasksNeedingInput updates the map of tasks waiting for user input.
func (*KanbanBoard) ToggleColumnCollapse ¶
func (k *KanbanBoard) ToggleColumnCollapse(colIdx int)
ToggleColumnCollapse toggles the collapsed state of a column. Cannot collapse the currently selected column.
func (*KanbanBoard) TotalTaskCount ¶
func (k *KanbanBoard) TotalTaskCount() int
TotalTaskCount returns the total number of tasks across all columns.
type KanbanColumn ¶
type KanbanColumn struct {
Title string
Status string // The status this column represents
Tasks []*db.Task
Color lipgloss.Color
Icon string // Visual icon for the column
}
KanbanColumn represents a column in the kanban board.
type KeyMap ¶
type KeyMap struct {
Left key.Binding
Right key.Binding
Up key.Binding
Down key.Binding
Enter key.Binding
Back key.Binding
New key.Binding
Edit key.Binding
Queue key.Binding
Retry key.Binding
Close key.Binding
Archive key.Binding
Delete key.Binding
Refresh key.Binding
Settings key.Binding
Help key.Binding
Quit key.Binding
ChangeStatus key.Binding
CommandPalette key.Binding
ToggleDangerous key.Binding
TogglePin key.Binding
Filter key.Binding
OpenWorktree key.Binding
ToggleShellPane key.Binding
JumpToNotification key.Binding
// Column focus shortcuts
FocusBacklog key.Binding
FocusInProgress key.Binding
FocusBlocked key.Binding
FocusDone key.Binding
// Jump to pinned/unpinned tasks
JumpToPinned key.Binding
JumpToUnpinned key.Binding
// Column collapse
CollapseBacklog key.Binding
CollapseDone key.Binding
// Open browser
OpenBrowser key.Binding
// Quick approve/deny for executor prompts
ApprovePrompt key.Binding
DenyPrompt key.Binding
// Spotlight mode
Spotlight key.Binding
SpotlightSync key.Binding
// Quick input focus
QuickInput key.Binding
}
KeyMap defines key bindings.
func ApplyKeybindingsConfig ¶
func ApplyKeybindingsConfig(km KeyMap, cfg *config.KeybindingsConfig) KeyMap
ApplyKeybindingsConfig applies custom keybindings from a config to the KeyMap. Only non-nil config values override the defaults.
func LoadKeyMap ¶
func LoadKeyMap() KeyMap
LoadKeyMap loads the KeyMap from the config file, falling back to defaults.
type RetryModel ¶
type RetryModel struct {
// contains filtered or unexported fields
}
RetryModel handles retrying a blocked/failed task with optional feedback.
func NewRetryModel ¶
NewRetryModel creates a new retry model.
func (*RetryModel) GetAttachment ¶
func (m *RetryModel) GetAttachment() string
GetAttachment returns the first attachment path.
func (*RetryModel) GetAttachments ¶
func (m *RetryModel) GetAttachments() []string
GetAttachments returns all attachment paths.
func (*RetryModel) GetFeedback ¶
func (m *RetryModel) GetFeedback() string
GetFeedback returns the feedback text.
func (*RetryModel) SetSize ¶
func (m *RetryModel) SetSize(width, height int)
SetSize updates the size.
func (*RetryModel) Update ¶
func (m *RetryModel) Update(msg tea.Msg) (*RetryModel, tea.Cmd)
Update handles messages.
type SettingsModel ¶
type SettingsModel struct {
// contains filtered or unexported fields
}
SettingsModel represents the settings view.
func NewSettingsModel ¶
func NewSettingsModel(database *db.DB, width, height int) *SettingsModel
NewSettingsModel creates a new settings model.
func (*SettingsModel) SetSize ¶
func (m *SettingsModel) SetSize(width, height int)
SetSize updates the view size.
func (*SettingsModel) Update ¶
func (m *SettingsModel) Update(msg tea.Msg) (*SettingsModel, tea.Cmd)
Update handles messages.
type TaskRefAutocompleteModel ¶
type TaskRefAutocompleteModel struct {
// contains filtered or unexported fields
}
TaskRefAutocompleteModel provides inline autocomplete for task references (#123). It appears as a floating dropdown when the user types '#' in a text field.
func NewTaskRefAutocompleteModel ¶
func NewTaskRefAutocompleteModel(database *db.DB, width int) *TaskRefAutocompleteModel
NewTaskRefAutocompleteModel creates a new task reference autocomplete model.
func (*TaskRefAutocompleteModel) Dismiss ¶
func (m *TaskRefAutocompleteModel) Dismiss()
Dismiss closes the autocomplete without selecting.
func (*TaskRefAutocompleteModel) GetCursorPos ¶
func (m *TaskRefAutocompleteModel) GetCursorPos() int
GetCursorPos returns the position where '#' was typed.
func (*TaskRefAutocompleteModel) GetQueryLength ¶
func (m *TaskRefAutocompleteModel) GetQueryLength() int
GetQueryLength returns the length of the query (including #).
func (*TaskRefAutocompleteModel) GetReference ¶
func (m *TaskRefAutocompleteModel) GetReference() string
GetReference returns the task reference string (e.g., "#123 (Task Title)") for the selected task.
func (*TaskRefAutocompleteModel) HasResults ¶
func (m *TaskRefAutocompleteModel) HasResults() bool
HasResults returns true if there are matching tasks.
func (*TaskRefAutocompleteModel) IsDismissed ¶
func (m *TaskRefAutocompleteModel) IsDismissed() bool
IsDismissed returns true if the autocomplete was dismissed.
func (*TaskRefAutocompleteModel) MoveDown ¶
func (m *TaskRefAutocompleteModel) MoveDown()
MoveDown moves selection down.
func (*TaskRefAutocompleteModel) MoveUp ¶
func (m *TaskRefAutocompleteModel) MoveUp()
MoveUp moves selection up.
func (*TaskRefAutocompleteModel) Reset ¶
func (m *TaskRefAutocompleteModel) Reset()
Reset resets the autocomplete state.
func (*TaskRefAutocompleteModel) Select ¶
func (m *TaskRefAutocompleteModel) Select()
Select confirms the current selection.
func (*TaskRefAutocompleteModel) SelectedTask ¶
func (m *TaskRefAutocompleteModel) SelectedTask() *db.Task
SelectedTask returns the selected task, or nil if none selected.
func (*TaskRefAutocompleteModel) SetQuery ¶
func (m *TaskRefAutocompleteModel) SetQuery(query string, cursorPos int)
SetQuery sets the search query and filters tasks.
func (*TaskRefAutocompleteModel) View ¶
func (m *TaskRefAutocompleteModel) View() string
View renders the autocomplete dropdown.
type Theme ¶
type Theme struct {
Name string `json:"name"`
// Core colors
Primary string `json:"primary"` // Main accent color (selections, highlights)
Secondary string `json:"secondary"` // Secondary accent (links, tags)
Muted string `json:"muted"` // Dimmed text, borders
// Semantic colors
Success string `json:"success"` // Success states, done
Warning string `json:"warning"` // Warning states
Error string `json:"error"` // Error states, blocked
// Status colors
InProgress string `json:"in_progress"` // Queued/processing tasks
Done string `json:"done"` // Completed tasks
Blocked string `json:"blocked"` // Blocked tasks
Backlog string `json:"backlog"` // Backlog tasks
// Card colors
CardBg string `json:"card_bg"` // Selected card background
CardFg string `json:"card_fg"` // Selected card foreground
CardBorder string `json:"card_border"` // Card border
CardBorderHi string `json:"card_border_hi"` // Highlighted card border
ColumnBorder string `json:"column_border"` // Column border
ColumnBorderHi string `json:"column_border_hi"` // Selected column border
}
Theme defines all colors used in the UI.
type UILogger ¶
type UILogger struct {
// contains filtered or unexported fields
}
UILogger provides file-based logging for the UI package. Logs are written to ~/.local/share/task/ui.log
func GetLogger ¶
func GetLogger() *UILogger
GetLogger returns the singleton UI logger instance. Call CloseLogger() when the application exits.
type View ¶
type View int
View represents the current view.
const ( ViewDashboard View = iota ViewDetail ViewNewTask ViewNewTaskConfirm ViewEditTask ViewProjectChangeConfirm // Confirmation when changing a task's project ViewDeleteConfirm ViewCloseConfirm ViewArchiveConfirm ViewQuitConfirm ViewSettings ViewRetry ViewAttachments ViewChangeStatus ViewCommandPalette )