ui

package
v0.14.4 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Feb 3, 2026 License: MIT Imports: 46 Imported by: 0

Documentation

Overview

Package ui provides the terminal user interface for beads_viewer. This file implements the BackgroundWorker for off-thread data processing.

Package ui provides the history view for displaying bead-to-commit correlations.

Package ui provides the terminal user interface for beads_viewer. This file implements the DataSnapshot type for thread-safe UI rendering.

tree.go - Hierarchical tree view for epic/task/subtask relationships (bv-gllx)

Index

Constants

View Source
const (
	ColOpen       = 0
	ColInProgress = 1
	ColBlocked    = 2
	ColClosed     = 3
)

Column indices for the Kanban board

View Source
const (
	SplitViewThreshold     = 100
	WideViewThreshold      = 140
	UltraWideViewThreshold = 180
)

View width thresholds for adaptive layout

View Source
const (
	SpaceXS = 1
	SpaceSM = 2
	SpaceMD = 3
	SpaceLG = 4
	SpaceXL = 6
)

Spacing constants for consistent layout (in characters)

View Source
const ContextHelpTriggerKey = "~"

ContextHelpTriggerKey defines the key for context-specific help. Default is tilde (~) as it's Shift+backtick, easy to remember.

View Source
const SwimLaneModeCount = 3

SwimLaneModeCount is the total number of swimlane modes for cycling

View Source
const TreeStateVersion = 1

TreeStateVersion is the current schema version for tree persistence

View Source
const TutorialTriggerKey = "`"

TutorialTriggerKey defines the key used to trigger the tutorial directly. Default is backtick (`) since CapsLock is unreliable.

Variables

View Source
var (
	// Base colors - Light mode uses darker colors for contrast on white backgrounds
	ColorBg          = lipgloss.AdaptiveColor{Light: "#FFFFFF", Dark: "#282A36"}
	ColorBgDark      = lipgloss.AdaptiveColor{Light: "#F5F5F5", Dark: "#1E1F29"}
	ColorBgSubtle    = lipgloss.AdaptiveColor{Light: "#E8E8E8", Dark: "#363949"}
	ColorBgHighlight = lipgloss.AdaptiveColor{Light: "#D0D0D0", Dark: "#44475A"}
	ColorText        = lipgloss.AdaptiveColor{Light: "#1A1A1A", Dark: "#F8F8F2"}
	ColorSubtext     = lipgloss.AdaptiveColor{Light: "#555555", Dark: "#BFBFBF"}
	ColorMuted       = lipgloss.AdaptiveColor{Light: "#666666", Dark: "#6272A4"}

	// Primary accent colors
	ColorPrimary   = lipgloss.AdaptiveColor{Light: "#6B47D9", Dark: "#BD93F9"}
	ColorSecondary = lipgloss.AdaptiveColor{Light: "#555555", Dark: "#6272A4"}
	ColorInfo      = lipgloss.AdaptiveColor{Light: "#006080", Dark: "#8BE9FD"}
	ColorSuccess   = lipgloss.AdaptiveColor{Light: "#007700", Dark: "#50FA7B"}
	ColorWarning   = lipgloss.AdaptiveColor{Light: "#B06800", Dark: "#FFB86C"}
	ColorDanger    = lipgloss.AdaptiveColor{Light: "#CC0000", Dark: "#FF5555"}

	// Status colors
	ColorStatusOpen       = lipgloss.AdaptiveColor{Light: "#007700", Dark: "#50FA7B"}
	ColorStatusInProgress = lipgloss.AdaptiveColor{Light: "#006080", Dark: "#8BE9FD"}
	ColorStatusBlocked    = lipgloss.AdaptiveColor{Light: "#CC0000", Dark: "#FF5555"}
	ColorStatusDeferred   = lipgloss.AdaptiveColor{Light: "#B06800", Dark: "#FFB86C"} // Orange - on ice
	ColorStatusPinned     = lipgloss.AdaptiveColor{Light: "#0066CC", Dark: "#6699FF"} // Blue - persistent
	ColorStatusHooked     = lipgloss.AdaptiveColor{Light: "#008080", Dark: "#00CED1"} // Teal - agent-attached
	ColorStatusReview     = lipgloss.AdaptiveColor{Light: "#6B47D9", Dark: "#BD93F9"} // Purple - awaiting review
	ColorStatusClosed     = lipgloss.AdaptiveColor{Light: "#555555", Dark: "#6272A4"}
	ColorStatusTombstone  = lipgloss.AdaptiveColor{Light: "#888888", Dark: "#44475A"} // Muted gray - deleted

	// Status background colors (for badges) - subtle backgrounds
	ColorStatusOpenBg       = lipgloss.AdaptiveColor{Light: "#D4EDDA", Dark: "#1A3D2A"}
	ColorStatusInProgressBg = lipgloss.AdaptiveColor{Light: "#D1ECF1", Dark: "#1A3344"}
	ColorStatusBlockedBg    = lipgloss.AdaptiveColor{Light: "#F8D7DA", Dark: "#3D1A1A"}
	ColorStatusDeferredBg   = lipgloss.AdaptiveColor{Light: "#FFE8CC", Dark: "#3D2A1A"} // Orange bg
	ColorStatusPinnedBg     = lipgloss.AdaptiveColor{Light: "#CCE5FF", Dark: "#1A2A44"} // Blue bg
	ColorStatusHookedBg     = lipgloss.AdaptiveColor{Light: "#CCFFFF", Dark: "#1A3D3D"} // Teal bg
	ColorStatusReviewBg     = lipgloss.AdaptiveColor{Light: "#E8DDFF", Dark: "#2A1A44"} // Purple bg
	ColorStatusClosedBg     = lipgloss.AdaptiveColor{Light: "#E2E3E5", Dark: "#2A2A3D"}
	ColorStatusTombstoneBg  = lipgloss.AdaptiveColor{Light: "#D0D0D0", Dark: "#1E1F29"} // Dark bg

	// Priority colors
	ColorPrioCritical = lipgloss.AdaptiveColor{Light: "#CC0000", Dark: "#FF5555"}
	ColorPrioHigh     = lipgloss.AdaptiveColor{Light: "#B06800", Dark: "#FFB86C"}
	ColorPrioMedium   = lipgloss.AdaptiveColor{Light: "#808000", Dark: "#F1FA8C"}
	ColorPrioLow      = lipgloss.AdaptiveColor{Light: "#007700", Dark: "#50FA7B"}

	// Priority background colors
	ColorPrioCriticalBg = lipgloss.AdaptiveColor{Light: "#F8D7DA", Dark: "#3D1A1A"}
	ColorPrioHighBg     = lipgloss.AdaptiveColor{Light: "#FFE8CC", Dark: "#3D2A1A"}
	ColorPrioMediumBg   = lipgloss.AdaptiveColor{Light: "#FFF3CD", Dark: "#3D3D1A"}
	ColorPrioLowBg      = lipgloss.AdaptiveColor{Light: "#D4EDDA", Dark: "#1A3D2A"}

	// Type colors
	ColorTypeBug     = lipgloss.AdaptiveColor{Light: "#CC0000", Dark: "#FF5555"}
	ColorTypeFeature = lipgloss.AdaptiveColor{Light: "#B06800", Dark: "#FFB86C"}
	ColorTypeTask    = lipgloss.AdaptiveColor{Light: "#808000", Dark: "#F1FA8C"}
	ColorTypeEpic    = lipgloss.AdaptiveColor{Light: "#6B47D9", Dark: "#BD93F9"}
	ColorTypeChore   = lipgloss.AdaptiveColor{Light: "#006080", Dark: "#8BE9FD"}
)
View Source
var (
	// PanelStyle is the default style for unfocused panels
	PanelStyle = lipgloss.NewStyle().
				Border(lipgloss.RoundedBorder()).
				BorderForeground(ColorBgHighlight)

	// FocusedPanelStyle is the style for focused panels
	FocusedPanelStyle = lipgloss.NewStyle().
						Border(lipgloss.RoundedBorder()).
						BorderForeground(ColorPrimary)
)
View Source
var ContextHelpContent = map[Context]string{
	ContextList:           contextHelpList,
	ContextGraph:          contextHelpGraph,
	ContextBoard:          contextHelpBoard,
	ContextInsights:       contextHelpInsights,
	ContextHistory:        contextHelpHistory,
	ContextDetail:         contextHelpDetail,
	ContextSplit:          contextHelpSplit,
	ContextFilter:         contextHelpFilter,
	ContextLabelPicker:    contextHelpLabelPicker,
	ContextRecipePicker:   contextHelpRecipePicker,
	ContextHelp:           contextHelpHelp,
	ContextTimeTravel:     contextHelpTimeTravel,
	ContextLabelDashboard: contextHelpLabelDashboard,
	ContextAttention:      contextHelpAttention,
	ContextAgentPrompt:    contextHelpAgentPrompt,
	ContextCassSession:    contextHelpCassSession,
}

ContextHelpContent contains compact help content for each context. This is used when user triggers context-specific help (e.g., double-tap backtick). Content should fit on one screen (~20 lines) without scrolling.

View Source
var HeatmapGradientColors = []lipgloss.Color{
	lipgloss.Color("#1a1a2e"),
	lipgloss.Color("#16213e"),
	lipgloss.Color("#0f4c75"),
	lipgloss.Color("#3282b8"),
	lipgloss.Color("#bbe1fa"),
	lipgloss.Color("#f7dc6f"),
	lipgloss.Color("#e94560"),
	lipgloss.Color("#ff2e63"),
}

HeatmapGradientColors defines the color gradient for enhanced heatmap (bv-t4yg) Ordered from cold (low count) to hot (high count)

View Source
var RepoColors = []lipgloss.AdaptiveColor{
	{Light: "#CC5555", Dark: "#FF6B6B"},
	{Light: "#3BA89E", Dark: "#4ECDC4"},
	{Light: "#3891A6", Dark: "#45B7D1"},
	{Light: "#6B9E87", Dark: "#96CEB4"},
	{Light: "#AA7AAA", Dark: "#DDA0DD"},
	{Light: "#C4A93D", Dark: "#F7DC6F"},
	{Light: "#9370A8", Dark: "#BB8FCE"},
	{Light: "#5A9BC2", Dark: "#85C1E9"},
}

RepoColors maps repo prefixes to distinctive colors for visual differentiation These colors are designed to be visible on both light and dark backgrounds

Functions

func BuildHybridMetricsCmd added in v0.11.0

func BuildHybridMetricsCmd(issues []model.Issue) tea.Cmd

BuildHybridMetricsCmd computes metrics for hybrid scoring asynchronously.

func BuildSemanticIndexCmd added in v0.10.3

func BuildSemanticIndexCmd(issues []model.Issue) tea.Cmd

BuildSemanticIndexCmd builds or updates the semantic index for the given issues.

func CheckAgentFileCmd added in v0.10.3

func CheckAgentFileCmd(workDir string) tea.Cmd

CheckAgentFileCmd returns a command that checks if we should prompt for AGENTS.md

func CheckUpdateCmd

func CheckUpdateCmd() tea.Cmd

CheckUpdateCmd returns a command that checks for updates

func ComputeAttentionView added in v0.10.3

func ComputeAttentionView(issues []model.Issue, width int) (string, error)

ComputeAttentionView builds a pre-rendered table for label attention This keeps the TUI layer simple and deterministic for tests.

func ComputeSemanticFilterCmd added in v0.10.3

func ComputeSemanticFilterCmd(s *SemanticSearch, term string) tea.Cmd

ComputeSemanticFilterCmd computes semantic filter results asynchronously.

func ContextFromFocus added in v0.10.3

func ContextFromFocus(f focus) string

contextFromFocus returns the context string for the current focus

func ExtractRepoPrefix

func ExtractRepoPrefix(id string) string

ExtractRepoPrefix extracts the repository prefix from a namespaced issue ID. For example, "api-AUTH-123" returns "api", "web-UI-1" returns "web". If no prefix is detected (no separator), returns empty string.

func FlowMatrixView added in v0.10.3

func FlowMatrixView(flow analysis.CrossLabelFlow, width int) string

FlowMatrixView is the legacy function for backward compatibility It now returns a simple text summary pointing to the interactive view

func FormatAgeBadge added in v0.10.3

func FormatAgeBadge(t time.Time) string

FormatAgeBadge returns a compact age string with timer emoji (e.g., "3d ⏱")

func FormatRecipeInfo

func FormatRecipeInfo(r *recipe.Recipe) string

FormatRecipeInfo returns a formatted string for the active recipe display

func FormatTimeRel

func FormatTimeRel(t time.Time) string

FormatTimeRel returns a relative time string (e.g., "2h ago", "3d ago")

func GetAgeColor added in v0.10.3

func GetAgeColor(t time.Time) lipgloss.AdaptiveColor

GetAgeColor returns a color based on staleness: green (<7 days), yellow (7-30 days), red (>30 days)

func GetAgeDays added in v0.10.3

func GetAgeDays(t time.Time) int

GetAgeDays returns the number of days since the given time

func GetContextHelp added in v0.10.3

func GetContextHelp(ctx Context) string

GetContextHelp returns the help content for a given context. Falls back to generic help if the context has no specific content.

func GetHeatGradientColor added in v0.10.3

func GetHeatGradientColor(intensity float64, t Theme) lipgloss.Color

GetHeatGradientColor returns an interpolated color for heatmap intensity (0-1) (bv-t4yg)

func GetHeatGradientColorBg added in v0.10.3

func GetHeatGradientColorBg(intensity float64) (bg lipgloss.Color, fg lipgloss.Color)

GetHeatGradientColorBg returns a background-friendly color for heatmap cell (bv-t4yg) Returns both the background color and appropriate foreground for contrast

func GetHeatmapColor

func GetHeatmapColor(score float64, t Theme) lipgloss.TerminalColor

GetHeatmapColor returns a color based on score (0-1)

func GetPriorityIcon

func GetPriorityIcon(priority int) string

GetPriorityIcon returns the emoji for a priority level

func GetPriorityLabel added in v0.10.3

func GetPriorityLabel(priority int) string

GetPriorityLabel returns a compact text label for priority (P0, P1, etc.)

func GetRepoColor

func GetRepoColor(prefix string) lipgloss.AdaptiveColor

GetRepoColor returns a consistent color for a repo prefix based on hash

func GetStatusIcon

func GetStatusIcon(s string) string

GetStatusIcon returns a colored icon for a status

func GetTriggerKeyHint added in v0.10.3

func GetTriggerKeyHint() string

GetTriggerKeyHint returns a user-friendly hint for the trigger keys.

func GetTutorialProgressManager added in v0.10.3

func GetTutorialProgressManager() *tutorialProgressManager

GetTutorialProgressManager returns the singleton progress manager.

func GetTypeIconMD

func GetTypeIconMD(t string) string

GetTypeIconMD returns the emoji icon for an issue type (for markdown)

func IsCapsLock added in v0.10.3

func IsCapsLock(msg tea.KeyMsg) bool

IsCapsLock attempts to detect if a key message is CapsLock. This is best-effort and may not work on all terminals.

Returns false if uncertain - users should use the alternative trigger key.

func IsContextHelpTrigger added in v0.10.3

func IsContextHelpTrigger(msg tea.KeyMsg) bool

IsContextHelpTrigger checks if the key message is the context help trigger. This provides direct access to context help without double-tap.

func IsTutorialTrigger added in v0.10.3

func IsTutorialTrigger(msg tea.KeyMsg) bool

IsTutorialTrigger checks if the key message is the tutorial trigger key. This is the reliable way to trigger the tutorial.

func LoadHistoryCmd added in v0.10.3

func LoadHistoryCmd(issues []model.Issue, beadsPath string) tea.Cmd

LoadHistoryCmd returns a command that loads history data in the background

func PerformUpdateCmd added in v0.11.3

func PerformUpdateCmd() tea.Cmd

PerformUpdateCmd returns a command that performs the update in the background.

func ReadyTimeoutCmd added in v0.10.3

func ReadyTimeoutCmd() tea.Cmd

ReadyTimeoutCmd returns a command that sends ReadyTimeoutMsg after 100ms. This ensures the TUI doesn't hang on "Initializing..." if the terminal is slow to report its size (common in tmux, SSH, some terminal emulators).

func RenderContextHelp added in v0.10.3

func RenderContextHelp(ctx Context, theme Theme, width, height int) string

RenderContextHelp renders the context-specific help modal. This is a compact modal (~60 chars wide) that shows quick reference info.

func RenderDependencyTree

func RenderDependencyTree(node *DependencyNode) string

RenderDependencyTree renders a dependency tree as a formatted string

func RenderDivider

func RenderDivider(width int) string

RenderDivider renders a horizontal divider line

func RenderMiniBar

func RenderMiniBar(value float64, width int, t Theme) string

RenderMiniBar renders a mini horizontal bar for a value between 0 and 1

func RenderPriorityBadge

func RenderPriorityBadge(priority int) string

RenderPriorityBadge returns a styled priority badge Priority values: 0=Critical, 1=High, 2=Medium, 3=Low, 4=Backlog

func RenderRankBadge

func RenderRankBadge(rank, total int) string

RenderRankBadge renders a rank badge like "#1" with color based on percentile

func RenderRepoBadge

func RenderRepoBadge(prefix string) string

RenderRepoBadge creates a compact colored badge for a repository prefix Example: "api" -> "[API]" with distinctive color

func RenderSparkline

func RenderSparkline(val float64, width int) string

RenderSparkline creates a textual bar chart of value (0.0 - 1.0)

func RenderStatusBadge

func RenderStatusBadge(status string) string

RenderStatusBadge returns a styled status badge

func RenderStructuredPage added in v0.10.4

func RenderStructuredPage(page StructuredTutorialPage, theme Theme, width int) string

RenderStructuredPage renders a structured tutorial page

func RenderSubtleDivider

func RenderSubtleDivider(width int) string

RenderSubtleDivider renders a more subtle divider using dots

func StartBackgroundWorkerCmd added in v0.13.0

func StartBackgroundWorkerCmd(w *BackgroundWorker) tea.Cmd

StartBackgroundWorkerCmd starts the background worker and triggers an initial refresh.

func TreeStatePath added in v0.12.0

func TreeStatePath(beadsDir string) string

TreeStatePath returns the path to the tree state file. By default this is .beads/tree-state.json in the current directory. The beadsDir parameter allows overriding the .beads directory location (e.g., from BEADS_DIR environment variable).

func TutorialProgressPath added in v0.10.3

func TutorialProgressPath() string

TutorialProgressPath returns the path to the tutorial progress config file.

func WaitForBackgroundWorkerMsgCmd added in v0.13.0

func WaitForBackgroundWorkerMsgCmd(w *BackgroundWorker) tea.Cmd

WaitForBackgroundWorkerMsgCmd waits for the next BackgroundWorker message.

func WaitForPhase2Cmd

func WaitForPhase2Cmd(stats *analysis.GraphStats) tea.Cmd

WaitForPhase2Cmd returns a command that waits for Phase 2 and sends Phase2ReadyMsg

func WatchFileCmd

func WatchFileCmd(w *watcher.Watcher) tea.Cmd

WatchFileCmd returns a command that waits for file changes and sends FileChangedMsg

Types

type ActionableModel

type ActionableModel struct {
	// contains filtered or unexported fields
}

ActionableModel represents the actionable items view grouped by tracks

func NewActionableModel

func NewActionableModel(plan analysis.ExecutionPlan, theme Theme) ActionableModel

NewActionableModel creates a new actionable view from execution plan

func (*ActionableModel) MoveDown

func (m *ActionableModel) MoveDown()

MoveDown moves selection down

func (*ActionableModel) MoveUp

func (m *ActionableModel) MoveUp()

MoveUp moves selection up

func (*ActionableModel) PageDown added in v0.10.3

func (m *ActionableModel) PageDown()

PageDown moves selection down by a page

func (*ActionableModel) PageUp added in v0.10.3

func (m *ActionableModel) PageUp()

PageUp moves selection up by a page

func (*ActionableModel) Render

func (m *ActionableModel) Render() string

Render renders the actionable view with polished card-based layout

func (*ActionableModel) SelectedIssueID

func (m *ActionableModel) SelectedIssueID() string

SelectedIssueID returns the ID of the currently selected issue

func (*ActionableModel) SetSize

func (m *ActionableModel) SetSize(width, height int)

SetSize updates the view dimensions

type AgentFileCheckMsg added in v0.10.3

type AgentFileCheckMsg struct {
	ShouldPrompt bool
	FilePath     string
	FileType     string
}

AgentFileCheckMsg is sent after checking for AGENTS.md integration (bv-i8dk)

type AgentPromptModal added in v0.10.3

type AgentPromptModal struct {
	// contains filtered or unexported fields
}

AgentPromptModal is a modal dialog for the AGENTS.md prompt.

func NewAgentPromptModal added in v0.10.3

func NewAgentPromptModal(filePath, fileType string, theme Theme) AgentPromptModal

NewAgentPromptModal creates a new AGENTS.md prompt modal.

func (AgentPromptModal) CenterModal added in v0.10.3

func (m AgentPromptModal) CenterModal(termWidth, termHeight int) string

CenterModal returns the modal view centered in the given dimensions.

func (AgentPromptModal) FilePath added in v0.10.3

func (m AgentPromptModal) FilePath() string

FilePath returns the path of the file to modify.

func (AgentPromptModal) Result added in v0.10.3

Result returns the user's choice, or AgentPromptPending if still deciding.

func (*AgentPromptModal) SetSize added in v0.10.3

func (m *AgentPromptModal) SetSize(width, height int)

SetSize sets the modal dimensions.

func (AgentPromptModal) Update added in v0.10.3

func (m AgentPromptModal) Update(msg tea.Msg) (AgentPromptModal, tea.Cmd)

Update handles input for the modal.

func (AgentPromptModal) View added in v0.10.3

func (m AgentPromptModal) View() string

View renders the modal.

type AgentPromptResult added in v0.10.3

type AgentPromptResult int

AgentPromptResult represents the user's choice on the AGENTS.md prompt.

const (
	AgentPromptPending AgentPromptResult = iota
	AgentPromptAccept
	AgentPromptDecline
	AgentPromptNeverAsk
)

type BackgroundWorker added in v0.12.1

type BackgroundWorker struct {
	// contains filtered or unexported fields
}

BackgroundWorker manages background processing of beads data. It owns the file watcher, implements coalescing, and builds snapshots off the UI thread.

func NewBackgroundWorker added in v0.12.1

func NewBackgroundWorker(cfg WorkerConfig) (*BackgroundWorker, error)

NewBackgroundWorker creates a new background worker.

func (*BackgroundWorker) Done added in v0.13.0

func (w *BackgroundWorker) Done() <-chan struct{}

Done is closed when the worker is stopped.

func (*BackgroundWorker) ForceRefresh added in v0.13.0

func (w *BackgroundWorker) ForceRefresh()

ForceRefresh triggers immediate processing, bypassing debounce and content-hash dedup so the UI can deterministically refresh even when the data is "fresh".

func (*BackgroundWorker) GetSnapshot added in v0.12.1

func (w *BackgroundWorker) GetSnapshot() *DataSnapshot

GetSnapshot returns the current snapshot (may be nil).

func (*BackgroundWorker) Health added in v0.13.0

func (w *BackgroundWorker) Health() WorkerHealth

func (*BackgroundWorker) LastError added in v0.12.1

func (w *BackgroundWorker) LastError() *WorkerError

LastError returns the most recent error (nil if last operation succeeded).

func (*BackgroundWorker) LastHash added in v0.12.1

func (w *BackgroundWorker) LastHash() string

LastHash returns the content hash from the last successful snapshot build. Useful for testing and debugging.

func (*BackgroundWorker) Messages added in v0.13.0

func (w *BackgroundWorker) Messages() <-chan tea.Msg

Messages returns a channel of Bubble Tea messages emitted by the worker. The channel is owned by the worker and is never closed; use Done() to stop waiting.

func (*BackgroundWorker) Metrics added in v0.13.0

func (w *BackgroundWorker) Metrics() WorkerMetrics

Metrics returns the latest metrics snapshot.

func (*BackgroundWorker) ProcessingDuration added in v0.14.0

func (w *BackgroundWorker) ProcessingDuration() time.Duration

ProcessingDuration returns how long the worker has been in the processing state. Returns 0 if not currently processing.

func (*BackgroundWorker) ResetHash added in v0.12.1

func (w *BackgroundWorker) ResetHash()

ResetHash clears the stored content hash, forcing the next buildSnapshot to process even if content is unchanged. Useful for testing.

func (*BackgroundWorker) SetRecipe added in v0.13.0

func (w *BackgroundWorker) SetRecipe(r *recipe.Recipe)

SetRecipe updates the worker's current recipe and triggers a refresh (bv-2h40). This allows Phase 3 view builders to incorporate recipe/filter state off-thread.

func (*BackgroundWorker) Start added in v0.12.1

func (w *BackgroundWorker) Start() error

Start begins watching for file changes and processing in the background. Start is idempotent - calling it multiple times has no effect. Returns error if the worker has been stopped.

func (*BackgroundWorker) State added in v0.12.1

func (w *BackgroundWorker) State() WorkerState

State returns the current worker state.

func (*BackgroundWorker) Stop added in v0.12.1

func (w *BackgroundWorker) Stop()

Stop halts the background worker and cleans up resources. Stop is idempotent - calling it multiple times has no effect.

func (*BackgroundWorker) TriggerRefresh added in v0.12.1

func (w *BackgroundWorker) TriggerRefresh()

TriggerRefresh manually triggers a refresh of the data. Has no effect if the worker is stopped or already processing.

func (*BackgroundWorker) WatcherChanged added in v0.12.1

func (w *BackgroundWorker) WatcherChanged() <-chan struct{}

WatcherChanged returns the watcher's change notification channel. This is useful for integration with existing code.

func (*BackgroundWorker) WatcherInfo added in v0.13.0

func (w *BackgroundWorker) WatcherInfo() (polling bool, fsType watcher.FilesystemType, pollInterval time.Duration)

type BoardModel

type BoardModel struct {
	// contains filtered or unexported fields
}

BoardModel represents the Kanban board view with adaptive columns

func NewBoardModel

func NewBoardModel(issues []model.Issue, theme Theme) BoardModel

NewBoardModel creates a new Kanban board from the given issues

func (*BoardModel) AppendSearchChar added in v0.10.3

func (b *BoardModel) AppendSearchChar(ch rune)

AppendSearchChar adds a character to the search query

func (*BoardModel) BackspaceSearch added in v0.10.3

func (b *BoardModel) BackspaceSearch()

BackspaceSearch removes the last character from search query

func (*BoardModel) CancelSearch added in v0.10.3

func (b *BoardModel) CancelSearch()

CancelSearch exits search mode and clears results

func (*BoardModel) ClearWaitingForG added in v0.10.3

func (b *BoardModel) ClearWaitingForG()

ClearWaitingForG clears the gg combo state

func (*BoardModel) CollapseExpanded added in v0.10.3

func (b *BoardModel) CollapseExpanded()

CollapseExpanded collapses any currently expanded card

func (*BoardModel) ColumnCount

func (b *BoardModel) ColumnCount(col int) int

ColumnCount returns the number of issues in a column

func (*BoardModel) CycleSwimLaneMode added in v0.10.3

func (b *BoardModel) CycleSwimLaneMode()

CycleSwimLaneMode cycles to the next swimlane mode and regroups issues (bv-wjs0)

func (*BoardModel) DetailScrollDown added in v0.10.3

func (b *BoardModel) DetailScrollDown(lines int)

DetailScrollDown scrolls the detail panel down

func (*BoardModel) DetailScrollUp added in v0.10.3

func (b *BoardModel) DetailScrollUp(lines int)

DetailScrollUp scrolls the detail panel up

func (*BoardModel) FinishSearch added in v0.10.3

func (b *BoardModel) FinishSearch()

FinishSearch exits search mode but keeps results for n/N navigation

func (*BoardModel) GetEmptyColumnVisibilityMode added in v0.10.3

func (b *BoardModel) GetEmptyColumnVisibilityMode() string

GetEmptyColumnVisibilityMode returns the current visibility mode name (bv-tf6j)

func (*BoardModel) GetExpandedID added in v0.10.3

func (b *BoardModel) GetExpandedID() string

GetExpandedID returns the ID of the currently expanded card (empty if none)

func (*BoardModel) GetSwimLaneMode added in v0.10.3

func (b *BoardModel) GetSwimLaneMode() SwimLaneMode

GetSwimLaneMode returns the current swimlane mode (bv-wjs0)

func (*BoardModel) GetSwimLaneModeName added in v0.10.3

func (b *BoardModel) GetSwimLaneModeName() string

GetSwimLaneModeName returns the display name for the current swimlane mode (bv-wjs0)

func (*BoardModel) HasExpandedCard added in v0.10.3

func (b *BoardModel) HasExpandedCard() bool

HasExpandedCard returns true if any card is currently expanded

func (*BoardModel) HiddenColumnCount added in v0.10.3

func (b *BoardModel) HiddenColumnCount() int

HiddenColumnCount returns the number of empty columns currently hidden (bv-tf6j)

func (*BoardModel) HideDetail added in v0.10.3

func (b *BoardModel) HideDetail()

HideDetail hides the detail panel

func (*BoardModel) IsCardExpanded added in v0.10.3

func (b *BoardModel) IsCardExpanded(id string) bool

IsCardExpanded returns true if the specified card is currently expanded

func (*BoardModel) IsDetailShown added in v0.10.3

func (b *BoardModel) IsDetailShown() bool

IsDetailShown returns whether detail panel is visible

func (*BoardModel) IsMatchHighlighted added in v0.10.3

func (b *BoardModel) IsMatchHighlighted(colIdx, rowIdx int) bool

IsMatchHighlighted returns true if position is current search match

func (*BoardModel) IsSearchMatch added in v0.10.3

func (b *BoardModel) IsSearchMatch(colIdx, rowIdx int) bool

IsSearchMatch returns true if position matches the search query

func (*BoardModel) IsSearchMode added in v0.10.3

func (b *BoardModel) IsSearchMode() bool

IsSearchMode returns whether search mode is active

func (*BoardModel) IsWaitingForG added in v0.10.3

func (b *BoardModel) IsWaitingForG() bool

IsWaitingForG returns whether we're waiting for second g

func (*BoardModel) JumpToColumn added in v0.10.3

func (b *BoardModel) JumpToColumn(colIdx int)

JumpToColumn jumps directly to a specific column (1-4 maps to 0-3)

func (*BoardModel) JumpToFirstColumn added in v0.10.3

func (b *BoardModel) JumpToFirstColumn()

JumpToFirstColumn jumps to the first non-empty column (H key)

func (*BoardModel) JumpToLastColumn added in v0.10.3

func (b *BoardModel) JumpToLastColumn()

JumpToLastColumn jumps to the last non-empty column (L key)

func (*BoardModel) MoveDown

func (b *BoardModel) MoveDown()

Navigation methods

func (*BoardModel) MoveLeft

func (b *BoardModel) MoveLeft()

func (*BoardModel) MoveRight

func (b *BoardModel) MoveRight()

func (*BoardModel) MoveToBottom

func (b *BoardModel) MoveToBottom()

func (*BoardModel) MoveToTop

func (b *BoardModel) MoveToTop()

func (*BoardModel) MoveUp

func (b *BoardModel) MoveUp()

func (*BoardModel) NextMatch added in v0.10.3

func (b *BoardModel) NextMatch()

NextMatch jumps to the next search match (n key)

func (*BoardModel) PageDown

func (b *BoardModel) PageDown(visibleRows int)

func (*BoardModel) PageUp

func (b *BoardModel) PageUp(visibleRows int)

func (*BoardModel) PrevMatch added in v0.10.3

func (b *BoardModel) PrevMatch()

PrevMatch jumps to the previous search match (N key)

func (*BoardModel) SearchCursorPos added in v0.10.3

func (b *BoardModel) SearchCursorPos() int

SearchCursorPos returns current match position (1-indexed for display)

func (*BoardModel) SearchMatchCount added in v0.10.3

func (b *BoardModel) SearchMatchCount() int

SearchMatchCount returns the number of matches

func (*BoardModel) SearchQuery added in v0.10.3

func (b *BoardModel) SearchQuery() string

SearchQuery returns the current search query

func (*BoardModel) SelectIssueByID added in v0.13.0

func (b *BoardModel) SelectIssueByID(id string) bool

SelectIssueByID attempts to focus and select the given issue ID on the board. Returns true if the issue was found in the current board columns.

func (*BoardModel) SelectedIssue

func (b *BoardModel) SelectedIssue() *model.Issue

SelectedIssue returns the currently selected issue, or nil if none

func (*BoardModel) SetIssues

func (b *BoardModel) SetIssues(issues []model.Issue)

SetIssues updates the board data, typically after filtering

func (*BoardModel) SetSnapshot added in v0.13.0

func (b *BoardModel) SetSnapshot(s *DataSnapshot)

SetSnapshot updates the board data directly from a DataSnapshot (bv-guxz). This avoids UI-thread grouping/sorting work when the full dataset is shown.

func (*BoardModel) SetWaitingForG added in v0.10.3

func (b *BoardModel) SetWaitingForG()

SetWaitingForG sets the gg combo state

func (*BoardModel) ShowDetail added in v0.10.3

func (b *BoardModel) ShowDetail()

ShowDetail shows the detail panel

func (*BoardModel) StartSearch added in v0.10.3

func (b *BoardModel) StartSearch()

StartSearch enters search mode

func (*BoardModel) ToggleDetail added in v0.10.3

func (b *BoardModel) ToggleDetail()

ToggleDetail toggles the detail panel visibility

func (*BoardModel) ToggleEmptyColumns added in v0.10.3

func (b *BoardModel) ToggleEmptyColumns()

ToggleEmptyColumns cycles through empty column visibility modes (bv-tf6j) nil (auto) -> true (show all) -> false (hide empty) -> nil (auto)

func (*BoardModel) ToggleExpand added in v0.10.3

func (b *BoardModel) ToggleExpand()

ToggleExpand toggles inline expansion for the selected card If a different card is expanded, it collapses that and expands the new one

func (*BoardModel) TotalCount

func (b *BoardModel) TotalCount() int

TotalCount returns the total number of issues across all columns

func (BoardModel) View

func (b BoardModel) View(width, height int) string

View renders the Kanban board with adaptive columns

type BoardState added in v0.13.0

type BoardState struct {
	ByStatus   [4][]model.Issue
	ByPriority [4][]model.Issue
	ByType     [4][]model.Issue
}

BoardState contains precomputed Kanban columns for each swimlane mode. This lets the UI swap board data in O(1) when the full dataset is shown.

func (*BoardState) ColumnsForMode added in v0.13.0

func (s *BoardState) ColumnsForMode(mode SwimLaneMode) [4][]model.Issue

type Bullet added in v0.10.4

type Bullet struct {
	Items []string
}

Bullet renders a bulleted list with elegant bullet characters

func (Bullet) Render added in v0.10.4

func (b Bullet) Render(theme Theme, width int) string

type CapsLockTimerExpiredMsg added in v0.10.3

type CapsLockTimerExpiredMsg struct{}

CapsLockTimerExpiredMsg is sent when the single-tap timer expires. This signals that the user intended a single tap (full tutorial) rather than a double-tap (context help).

type CapsLockTracker added in v0.10.3

type CapsLockTracker struct {
	// contains filtered or unexported fields
}

CapsLockTracker tracks CapsLock-style key presses for double-tap detection. It works with any configured trigger key, not just CapsLock.

func NewCapsLockTracker added in v0.10.3

func NewCapsLockTracker() *CapsLockTracker

NewCapsLockTracker creates a new tracker with the default 300ms threshold.

func NewCapsLockTrackerWithThreshold added in v0.10.3

func NewCapsLockTrackerWithThreshold(threshold time.Duration) *CapsLockTracker

NewCapsLockTrackerWithThreshold creates a tracker with a custom threshold.

func (*CapsLockTracker) HandlePress added in v0.10.3

func (c *CapsLockTracker) HandlePress() (TutorialTrigger, tea.Cmd)

HandlePress processes a trigger key press and returns the appropriate command. Call this when the tutorial trigger key is detected.

Returns: - TriggerContextHelp if this is a double-tap (< threshold since last) - TriggerNone with a timer command if this might be a single tap

func (*CapsLockTracker) HandleTimerExpired added in v0.10.3

func (c *CapsLockTracker) HandleTimerExpired() TutorialTrigger

HandleTimerExpired processes the timer expiration message. Call this when CapsLockTimerExpiredMsg is received.

Returns TriggerFullTutorial if we were waiting for potential double-tap.

func (*CapsLockTracker) IsPending added in v0.10.3

func (c *CapsLockTracker) IsPending() bool

IsPending returns true if waiting for potential double-tap.

func (*CapsLockTracker) Reset added in v0.10.3

func (c *CapsLockTracker) Reset()

Reset clears the tracker state.

type CassSessionModal added in v0.10.3

type CassSessionModal struct {
	// contains filtered or unexported fields
}

CassSessionModal displays correlated cass sessions for a bead. It shows session previews with agent name, timestamp, match reason, and snippet.

func NewCassSessionModal added in v0.10.3

func NewCassSessionModal(beadID string, result cass.CorrelationResult, theme Theme) CassSessionModal

NewCassSessionModal creates a modal from correlation results.

func (CassSessionModal) CenterModal added in v0.10.3

func (m CassSessionModal) CenterModal(termWidth, termHeight int) string

CenterModal returns the modal view centered in the given dimensions.

func (CassSessionModal) HasSessions added in v0.10.3

func (m CassSessionModal) HasSessions() bool

HasSessions returns true if there are sessions to display.

func (*CassSessionModal) SetSize added in v0.10.3

func (m *CassSessionModal) SetSize(width, height int)

SetSize sets the modal dimensions based on terminal size.

func (CassSessionModal) Update added in v0.10.3

func (m CassSessionModal) Update(msg tea.Msg) (CassSessionModal, tea.Cmd)

Update handles input for the modal.

func (CassSessionModal) View added in v0.10.3

func (m CassSessionModal) View() string

View renders the modal.

type Code added in v0.10.4

type Code struct {
	Text string
}

Code renders a code block with left accent border

func (Code) Render added in v0.10.4

func (c Code) Render(theme Theme, width int) string

type ColumnStats added in v0.10.3

type ColumnStats struct {
	Total        int           // Total issues in column
	P0Count      int           // Critical priority count
	P1Count      int           // High priority count
	BlockedCount int           // Issues with blocking dependencies
	OldestAge    time.Duration // Age of oldest item
}

ColumnStats holds computed statistics for a board column (bv-nl8a)

type CommitListEntry added in v0.10.3

type CommitListEntry struct {
	SHA       string
	ShortSHA  string
	Message   string
	Author    string
	Timestamp string
	FileCount int
	BeadIDs   []string // Beads related to this commit
}

CommitListEntry represents a commit in git-centric mode (bv-tl3n)

type Context added in v0.10.3

type Context string

Context represents the current UI context for context-sensitive help

const (
	// Overlays (highest priority)
	ContextLabelPicker        Context = "label-picker"
	ContextRecipePicker       Context = "recipe-picker"
	ContextHelp               Context = "help"
	ContextQuitConfirm        Context = "quit-confirm"
	ContextLabelHealthDetail  Context = "label-health-detail"
	ContextLabelDrilldown     Context = "label-drilldown"
	ContextLabelGraphAnalysis Context = "label-graph-analysis"
	ContextTimeTravelInput    Context = "time-travel-input"
	ContextAlerts             Context = "alerts"
	ContextRepoPicker         Context = "repo-picker"
	ContextAgentPrompt        Context = "agent-prompt"
	ContextCassSession        Context = "cass-session"

	// Views
	ContextInsights       Context = "insights"
	ContextFlowMatrix     Context = "flow-matrix"
	ContextGraph          Context = "graph"
	ContextBoard          Context = "board"
	ContextActionable     Context = "actionable"
	ContextHistory        Context = "history"
	ContextSprint         Context = "sprint"
	ContextLabelDashboard Context = "label-dashboard"
	ContextAttention      Context = "attention"

	// Detail states
	ContextSplit      Context = "split"
	ContextDetail     Context = "detail"
	ContextTimeTravel Context = "time-travel"

	// Filter state
	ContextFilter Context = "filter"

	// Default
	ContextList Context = "list"
)

func (Context) Description added in v0.10.3

func (c Context) Description() string

ContextDescription returns a human-readable description of the context. Useful for status messages or debugging.

func (Context) IsOverlay added in v0.10.3

func (c Context) IsOverlay() bool

IsOverlay returns true if the context is an overlay (modal/popup)

func (Context) IsView added in v0.10.3

func (c Context) IsView() bool

IsView returns true if the context is a full view (not overlay or default list)

func (Context) TutorialPages added in v0.10.3

func (c Context) TutorialPages() []int

TutorialPages returns the recommended tutorial page IDs for this context. Used to provide context-sensitive help.

type DataSnapshot added in v0.12.1

type DataSnapshot struct {
	// Core data
	Issues   []model.Issue           // All issues (sorted)
	IssueMap map[string]*model.Issue // Lookup by ID

	// ViewIssues are the issues included in the current view context (e.g. recipe).
	// When empty, callers should fall back to Issues.
	ViewIssues []model.Issue

	// Graph analysis
	Analyzer *analysis.Analyzer
	Analysis *analysis.GraphStats
	Insights analysis.Insights

	// Computed statistics
	CountOpen    int
	CountReady   int
	CountBlocked int
	CountClosed  int

	// Pre-computed UI data (Phase 3 will populate these)
	// For now, they're nil and the UI computes on demand
	ListItems     []IssueItem // Pre-built list items with scores
	TriageScores  map[string]float64
	TriageReasons map[string]analysis.TriageReasons
	QuickWinSet   map[string]bool
	BlockerSet    map[string]bool
	UnblocksMap   map[string][]string
	// TreeRoots and TreeNodeMap contain a pre-built parent/child tree for the Tree view.
	// These are computed off-thread by SnapshotBuilder to avoid UI-thread work when
	// entering the tree view for large datasets.
	TreeRoots   []*IssueTreeNode
	TreeNodeMap map[string]*IssueTreeNode
	// BoardState contains pre-built Kanban board columns for each swimlane mode (bv-guxz).
	BoardState *BoardState
	// GraphLayout contains pre-built graph view data (blockers/dependents, sorted IDs, ranks)
	// to avoid rebuilding graph structures on the UI thread (bv-za8z).
	GraphLayout *GraphLayout

	// Metadata
	CreatedAt  time.Time // When this snapshot was built
	DataHash   string    // Hash of source data for cache validation
	RecipeName string    // Active recipe name for this snapshot (bv-2h40)
	RecipeHash string    // Fingerprint of active recipe for this snapshot (bv-4ilb)
	// DatasetTier is a tiered performance mode for large datasets (bv-9thm).
	// When unknown, normal behavior applies.
	DatasetTier datasetTier
	// SourceIssueCountHint is an approximate total issue count from the source file
	// (e.g., JSONL line count). This may be 0 if unavailable.
	SourceIssueCountHint int
	// LoadedOpenOnly indicates the snapshot intentionally excluded closed/tombstone
	// issues for performance (huge tier).
	LoadedOpenOnly bool
	// TruncatedCount is an approximate count of issues excluded by load policy.
	// This may include invalid/empty lines when computed from a line count hint.
	TruncatedCount int
	// LargeDatasetWarning is a short, user-facing warning to show in the footer.
	LargeDatasetWarning string
	// LoadWarningCount is the number of non-fatal parse warnings encountered while loading.
	// In TUI mode, warnings must not be printed to stderr during render.
	LoadWarningCount int

	// Phase 2 analysis status
	// Phase2Ready is true when expensive metrics (PageRank, Betweenness, etc.) are computed
	// UI can render immediately with Phase 1 data, then refresh when Phase 2 completes
	Phase2Ready bool

	// Incremental update metadata (bv-5mzz).
	IssueDiff      *analysis.IssueDiff
	IssueDiffStats IssueDiffStats
	// IncrementalListUsed reports whether list items were rebuilt incrementally.
	IncrementalListUsed bool

	// Error state (for graceful degradation)
	LoadError    error     // Non-nil if last load had recoverable errors
	ErrorTime    time.Time // When error occurred
	StaleWarning bool      // True if data is from previous successful load
	// contains filtered or unexported fields
}

DataSnapshot is an immutable, self-contained representation of all data the UI needs to render. Once created, it never changes - this is critical for thread safety when the background worker is building the next snapshot.

The UI thread reads exclusively from its current snapshot pointer. When a new snapshot is ready, the UI swaps the pointer atomically.

func (*DataSnapshot) Age added in v0.12.1

func (s *DataSnapshot) Age() time.Duration

Age returns how long ago this snapshot was created.

func (*DataSnapshot) GetGraphStats added in v0.12.1

func (s *DataSnapshot) GetGraphStats() *analysis.GraphStats

GetGraphStats returns the GraphStats pointer for Phase 2 waiting. Callers can use stats.WaitForPhase2() to block until Phase 2 completes.

func (*DataSnapshot) GetIssue added in v0.12.1

func (s *DataSnapshot) GetIssue(id string) *model.Issue

GetIssue returns an issue by ID, or nil if not found.

func (*DataSnapshot) IsEmpty added in v0.12.1

func (s *DataSnapshot) IsEmpty() bool

IsEmpty returns true if the snapshot has no issues.

type DependencyNode

type DependencyNode struct {
	ID       string
	Title    string
	Status   string
	Type     string // "root", "blocks", "related", etc.
	Children []*DependencyNode
}

DependencyNode represents a visual node in the dependency tree

func BuildDependencyTree

func BuildDependencyTree(rootID string, issueMap map[string]*model.Issue, maxDepth int) *DependencyNode

BuildDependencyTree constructs a tree from dependencies for visualization. maxDepth limits recursion to prevent infinite loops and performance issues. Set maxDepth to 0 for unlimited depth (use with caution).

type DiffStatus

type DiffStatus int

DiffStatus represents the diff state of an issue in time-travel mode

const (
	DiffStatusNone     DiffStatus = iota // No diff or not in time-travel mode
	DiffStatusNew                        // Issue was added since comparison point
	DiffStatusClosed                     // Issue was closed since comparison point
	DiffStatusModified                   // Issue was modified since comparison point
)

func (DiffStatus) Badge

func (s DiffStatus) Badge() string

DiffBadge returns the badge string for a diff status

type Divider added in v0.10.4

type Divider struct{}

Divider renders a horizontal divider line for visual separation

func (Divider) Render added in v0.10.4

func (d Divider) Render(theme Theme, width int) string

type FileChangedMsg

type FileChangedMsg struct{}

FileChangedMsg is sent when the beads file changes on disk

type FileTreeNode added in v0.10.3

type FileTreeNode struct {
	Name        string          // File or directory name
	Path        string          // Full path
	IsDir       bool            // True if directory
	Children    []*FileTreeNode // Child nodes (for directories)
	ChangeCount int             // Number of commits touching this path
	Expanded    bool            // True if directory is expanded
	Level       int             // Nesting depth for indentation
}

FileTreeNode represents a node in the file tree (bv-190l)

type FlowMatrixModel added in v0.10.3

type FlowMatrixModel struct {
	// contains filtered or unexported fields
}

FlowMatrixModel renders an interactive dependency flow dashboard showing how labels block each other with visual impact indicators

func NewFlowMatrixModel added in v0.10.3

func NewFlowMatrixModel(theme Theme) FlowMatrixModel

NewFlowMatrixModel creates a new flow matrix dashboard

func (*FlowMatrixModel) GoToEnd added in v0.10.3

func (m *FlowMatrixModel) GoToEnd()

GoToEnd moves cursor to the last item

func (*FlowMatrixModel) GoToStart added in v0.10.3

func (m *FlowMatrixModel) GoToStart()

GoToStart moves cursor to the first item

func (*FlowMatrixModel) MoveDown added in v0.10.3

func (m *FlowMatrixModel) MoveDown()

MoveDown moves the cursor down by one

func (*FlowMatrixModel) MoveUp added in v0.10.3

func (m *FlowMatrixModel) MoveUp()

MoveUp moves the cursor up by one

func (*FlowMatrixModel) OpenDrilldown added in v0.10.3

func (m *FlowMatrixModel) OpenDrilldown()

OpenDrilldown opens the drill-down view for the selected label

func (*FlowMatrixModel) SelectedDrilldownIssue added in v0.10.3

func (m *FlowMatrixModel) SelectedDrilldownIssue() *model.Issue

SelectedDrilldownIssue returns the currently selected issue in drilldown mode

func (*FlowMatrixModel) SelectedLabel added in v0.10.3

func (m *FlowMatrixModel) SelectedLabel() string

SelectedLabel returns the currently selected label (for drill-down from parent)

func (*FlowMatrixModel) SetData added in v0.10.3

func (m *FlowMatrixModel) SetData(flow *analysis.CrossLabelFlow, issues []model.Issue)

SetData initializes the model with flow data

func (*FlowMatrixModel) SetSize added in v0.10.3

func (m *FlowMatrixModel) SetSize(width, height int)

SetSize sets the available rendering dimensions

func (*FlowMatrixModel) TogglePanel added in v0.10.3

func (m *FlowMatrixModel) TogglePanel()

TogglePanel switches focus between the labels list and detail panel

func (*FlowMatrixModel) Update added in v0.10.3

func (m *FlowMatrixModel) Update(msg tea.KeyMsg) tea.Cmd

Update handles keyboard input

func (FlowMatrixModel) View added in v0.10.3

func (m FlowMatrixModel) View() string

View renders the flow matrix dashboard

type FlowStep added in v0.10.4

type FlowStep struct {
	Label string
	Color lipgloss.AdaptiveColor
}

type GraphLayout added in v0.13.0

type GraphLayout struct {
	// Relationships (blocks/dependents)
	Blockers   map[string][]string // What each issue depends on (blocks this issue)
	Dependents map[string][]string // What depends on each issue (this issue blocks)

	// Navigation order (all IDs in the snapshot)
	SortedIDs []string

	// Metric ranks (1 = best, higher = worse). Missing ranks imply "unknown".
	RankPageRank     map[string]int
	RankBetweenness  map[string]int
	RankEigenvector  map[string]int
	RankHubs         map[string]int
	RankAuthorities  map[string]int
	RankCriticalPath map[string]int
	RankInDegree     map[string]int
	RankOutDegree    map[string]int
}

GraphLayout contains precomputed data used by the graph view. This intentionally focuses on the current ASCII graph view needs (relationships + ranks), not geometric coordinates.

func (*GraphLayout) UpdatePhase2Ranks added in v0.13.0

func (l *GraphLayout) UpdatePhase2Ranks(stats *analysis.GraphStats)

type GraphModel

type GraphModel struct {
	// contains filtered or unexported fields
}

GraphModel represents the dependency graph view with visual ASCII art visualization

func NewGraphModel

func NewGraphModel(issues []model.Issue, insights *analysis.Insights, theme Theme) GraphModel

NewGraphModel creates a new graph view from issues

func (*GraphModel) MoveDown

func (g *GraphModel) MoveDown()

func (*GraphModel) MoveLeft

func (g *GraphModel) MoveLeft()

func (*GraphModel) MoveRight

func (g *GraphModel) MoveRight()

func (*GraphModel) MoveUp

func (g *GraphModel) MoveUp()

Navigation

func (*GraphModel) PageDown

func (g *GraphModel) PageDown()

func (*GraphModel) PageUp

func (g *GraphModel) PageUp()

func (*GraphModel) ScrollLeft

func (g *GraphModel) ScrollLeft()

func (*GraphModel) ScrollRight

func (g *GraphModel) ScrollRight()

func (*GraphModel) SelectByID added in v0.10.3

func (g *GraphModel) SelectByID(id string) bool

SelectByID selects an issue by its ID (bv-xf4p)

func (*GraphModel) SelectedIssue

func (g *GraphModel) SelectedIssue() *model.Issue

func (*GraphModel) SetIssues

func (g *GraphModel) SetIssues(issues []model.Issue, insights *analysis.Insights)

SetIssues updates the graph data preserving the selected issue if possible

func (*GraphModel) SetSnapshot added in v0.13.0

func (g *GraphModel) SetSnapshot(snapshot *DataSnapshot)

SetSnapshot updates the graph data from a pre-built DataSnapshot (bv-za8z). This avoids rebuilding blockers/dependents and metric ranks on the UI thread.

func (*GraphModel) TotalCount

func (g *GraphModel) TotalCount() int

func (*GraphModel) View

func (g *GraphModel) View(width, height int) string

View renders the visual graph view

type Highlight added in v0.10.4

type Highlight struct {
	Text  string
	Color lipgloss.AdaptiveColor
}

Highlight renders inline highlighted/emphasized text

func (Highlight) Render added in v0.10.4

func (h Highlight) Render(theme Theme, width int) string

type HistoryLoadedMsg added in v0.10.3

type HistoryLoadedMsg struct {
	Report *correlation.HistoryReport
	Error  error
}

HistoryLoadedMsg is sent when background history loading completes

type HistoryModel added in v0.10.3

type HistoryModel struct {
	// contains filtered or unexported fields
}

HistoryModel represents the TUI view for bead history and code correlations

func NewHistoryModel added in v0.10.3

func NewHistoryModel(report *correlation.HistoryReport, theme Theme) HistoryModel

NewHistoryModel creates a new history view from a correlation report

func (*HistoryModel) CancelSearch added in v0.10.3

func (h *HistoryModel) CancelSearch()

CancelSearch cancels the search and clears the query

func (*HistoryModel) ClearFileFilter added in v0.10.3

func (h *HistoryModel) ClearFileFilter()

ClearFileFilter clears the file filter

func (*HistoryModel) ClearSearch added in v0.10.3

func (h *HistoryModel) ClearSearch()

ClearSearch clears the search query but keeps search mode active

func (*HistoryModel) ClearSessionCache added in v0.10.3

func (h *HistoryModel) ClearSessionCache()

ClearSessionCache clears all cached sessions (bv-pr1l)

func (*HistoryModel) CollapseFileNode added in v0.10.3

func (h *HistoryModel) CollapseFileNode()

CollapseFileNode collapses the selected node if it's an expanded directory

func (*HistoryModel) CycleConfidence added in v0.10.3

func (h *HistoryModel) CycleConfidence()

CycleConfidence cycles through common confidence thresholds (0, 0.5, 0.75, 0.9)

func (*HistoryModel) FileTreeHasFocus added in v0.10.3

func (h *HistoryModel) FileTreeHasFocus() bool

FileTreeHasFocus returns whether the file tree has focus

func (*HistoryModel) GetFileFilter added in v0.10.3

func (h *HistoryModel) GetFileFilter() string

GetFileFilter returns the current file filter

func (*HistoryModel) GetFilteredCommitList added in v0.10.3

func (h *HistoryModel) GetFilteredCommitList() []CommitListEntry

GetFilteredCommitList returns the filtered commit list for git mode

func (*HistoryModel) GetHistoryForBead added in v0.10.3

func (h *HistoryModel) GetHistoryForBead(beadID string) *correlation.BeadHistory

GetHistoryForBead returns the history for a specific bead ID

func (*HistoryModel) GetMinConfidence added in v0.10.3

func (h *HistoryModel) GetMinConfidence() float64

GetMinConfidence returns the current minimum confidence threshold

func (*HistoryModel) GetSearchModeName added in v0.10.3

func (h *HistoryModel) GetSearchModeName() string

GetSearchModeName returns a human-readable name for the current search mode

func (*HistoryModel) GetSessionsForBead added in v0.10.3

func (h *HistoryModel) GetSessionsForBead(beadID string) []cass.ScoredResult

GetSessionsForBead returns cached sessions for a bead (bv-pr1l)

func (*HistoryModel) HasReport added in v0.10.3

func (h *HistoryModel) HasReport() bool

HasReport returns true if history data is loaded

func (*HistoryModel) HasSessionsForBead added in v0.10.3

func (h *HistoryModel) HasSessionsForBead(beadID string) bool

HasSessionsForBead returns true if sessions are cached for the given bead (bv-pr1l)

func (*HistoryModel) IsDetailFocused added in v0.10.3

func (h *HistoryModel) IsDetailFocused() bool

IsDetailFocused returns true if the detail pane has focus (bv-190l)

func (*HistoryModel) IsFileTreeVisible added in v0.10.3

func (h *HistoryModel) IsFileTreeVisible() bool

IsFileTreeVisible returns whether the file tree panel is visible

func (*HistoryModel) IsGitMode added in v0.10.3

func (h *HistoryModel) IsGitMode() bool

IsGitMode returns true if in git-centric view mode

func (*HistoryModel) IsSearchActive added in v0.10.3

func (h *HistoryModel) IsSearchActive() bool

IsSearchActive returns whether search input is active

func (*HistoryModel) MoveDown added in v0.10.3

func (h *HistoryModel) MoveDown()

MoveDown moves selection down in the current focus pane

func (*HistoryModel) MoveDownFileTree added in v0.10.3

func (h *HistoryModel) MoveDownFileTree()

MoveDownFileTree moves selection down in the file tree

func (*HistoryModel) MoveDownGit added in v0.10.3

func (h *HistoryModel) MoveDownGit()

MoveDownGit moves selection down in git mode

func (*HistoryModel) MoveUp added in v0.10.3

func (h *HistoryModel) MoveUp()

MoveUp moves selection up in the current focus pane

func (*HistoryModel) MoveUpFileTree added in v0.10.3

func (h *HistoryModel) MoveUpFileTree()

MoveUpFileTree moves selection up in the file tree

func (*HistoryModel) MoveUpGit added in v0.10.3

func (h *HistoryModel) MoveUpGit()

MoveUpGit moves selection up in git mode

func (*HistoryModel) NextCommit added in v0.10.3

func (h *HistoryModel) NextCommit()

NextCommit moves to the next commit within the selected bead (J key)

func (*HistoryModel) NextRelatedBead added in v0.10.3

func (h *HistoryModel) NextRelatedBead()

NextRelatedBead moves to the next related bead in git mode (J key)

func (*HistoryModel) PrevCommit added in v0.10.3

func (h *HistoryModel) PrevCommit()

PrevCommit moves to the previous commit within the selected bead (K key)

func (*HistoryModel) PrevRelatedBead added in v0.10.3

func (h *HistoryModel) PrevRelatedBead()

PrevRelatedBead moves to the previous related bead in git mode (K key)

func (*HistoryModel) SearchQuery added in v0.10.3

func (h *HistoryModel) SearchQuery() string

SearchQuery returns the current search query

func (*HistoryModel) SelectFile added in v0.10.3

func (h *HistoryModel) SelectFile()

SelectFile sets the file filter to the selected file

func (*HistoryModel) SelectedBeadID added in v0.10.3

func (h *HistoryModel) SelectedBeadID() string

SelectedBeadID returns the currently selected bead ID

func (*HistoryModel) SelectedCommit added in v0.10.3

func (h *HistoryModel) SelectedCommit() *correlation.CorrelatedCommit

SelectedCommit returns the currently selected commit

func (*HistoryModel) SelectedFileName added in v0.10.3

func (h *HistoryModel) SelectedFileName() string

SelectedFileName returns the name of the selected file/directory

func (*HistoryModel) SelectedFileNode added in v0.10.3

func (h *HistoryModel) SelectedFileNode() *FileTreeNode

SelectedFileNode returns the currently selected file tree node

func (*HistoryModel) SelectedGitCommit added in v0.10.3

func (h *HistoryModel) SelectedGitCommit() *CommitListEntry

SelectedGitCommit returns the selected commit in git mode

func (*HistoryModel) SelectedHistory added in v0.10.3

func (h *HistoryModel) SelectedHistory() *correlation.BeadHistory

SelectedHistory returns the currently selected bead history

func (*HistoryModel) SelectedRelatedBeadID added in v0.10.3

func (h *HistoryModel) SelectedRelatedBeadID() string

SelectedRelatedBeadID returns the currently selected related bead ID in git mode

func (*HistoryModel) SetAuthorFilter added in v0.10.3

func (h *HistoryModel) SetAuthorFilter(author string)

SetAuthorFilter sets the author filter and rebuilds the list

func (*HistoryModel) SetFileTreeFocus added in v0.10.3

func (h *HistoryModel) SetFileTreeFocus(focus bool)

SetFileTreeFocus sets the file tree focus state

func (*HistoryModel) SetMinConfidence added in v0.10.3

func (h *HistoryModel) SetMinConfidence(conf float64)

SetMinConfidence sets the minimum confidence threshold and rebuilds the list

func (*HistoryModel) SetReport added in v0.10.3

func (h *HistoryModel) SetReport(report *correlation.HistoryReport)

SetReport updates the history data

func (*HistoryModel) SetSessionsForBead added in v0.10.3

func (h *HistoryModel) SetSessionsForBead(beadID string, sessions []cass.ScoredResult)

SetSessionsForBead stores correlated sessions for a bead in the cache (bv-pr1l) This is called when sessions are loaded asynchronously from the main model.

func (*HistoryModel) SetSize added in v0.10.3

func (h *HistoryModel) SetSize(width, height int)

SetSize updates the view dimensions

func (*HistoryModel) StartSearch added in v0.10.3

func (h *HistoryModel) StartSearch()

StartSearch activates the search input

func (*HistoryModel) StartSearchWithMode added in v0.10.3

func (h *HistoryModel) StartSearchWithMode(mode historySearchMode)

StartSearchWithMode activates search with a specific mode

func (*HistoryModel) ToggleExpand added in v0.10.3

func (h *HistoryModel) ToggleExpand()

ToggleExpand expands/collapses the commits for the selected bead

func (*HistoryModel) ToggleExpandFile added in v0.10.3

func (h *HistoryModel) ToggleExpandFile()

ToggleExpandFile expands or collapses the selected directory

func (*HistoryModel) ToggleFileTree added in v0.10.3

func (h *HistoryModel) ToggleFileTree()

ToggleFileTree toggles the file tree panel visibility

func (*HistoryModel) ToggleFocus added in v0.10.3

func (h *HistoryModel) ToggleFocus()

ToggleFocus cycles through panes based on current layout (bv-xrfh)

func (*HistoryModel) ToggleViewMode added in v0.10.3

func (h *HistoryModel) ToggleViewMode()

ToggleViewMode switches between Bead mode and Git mode

func (*HistoryModel) UpdateSearchInput added in v0.10.3

func (h *HistoryModel) UpdateSearchInput(msg interface{})

UpdateSearchInput updates the search input model (call from Update)

func (*HistoryModel) View added in v0.10.3

func (h *HistoryModel) View() string

View renders the history view

type HybridMetricsReadyMsg added in v0.11.0

type HybridMetricsReadyMsg struct {
	Cache search.MetricsCache
	Error error
}

HybridMetricsReadyMsg is emitted when hybrid metrics are ready for scoring.

type IdleGCConfig added in v0.13.0

type IdleGCConfig struct {
	Enabled     bool
	Threshold   time.Duration
	CheckEvery  time.Duration
	MinInterval time.Duration
	GCPercent   int
}

type InfoBox added in v0.10.4

type InfoBox struct {
	Title   string
	Content string
	Color   lipgloss.AdaptiveColor
}

InfoBox renders a highlighted info box with title and content

func (InfoBox) Render added in v0.10.4

func (ib InfoBox) Render(theme Theme, width int) string

type InsightsModel

type InsightsModel struct {
	// contains filtered or unexported fields
}

InsightsModel is an interactive insights dashboard

func NewInsightsModel

func NewInsightsModel(ins analysis.Insights, issueMap map[string]*model.Issue, theme Theme) InsightsModel

NewInsightsModel creates a new interactive insights model

func (*InsightsModel) HeatmapBack added in v0.10.3

func (m *InsightsModel) HeatmapBack()

HeatmapBack exits drill-down mode

func (*InsightsModel) HeatmapCellCount added in v0.10.3

func (m *InsightsModel) HeatmapCellCount() int

HeatmapCellCount returns the count in the currently selected cell

func (*InsightsModel) HeatmapEnter added in v0.10.3

func (m *InsightsModel) HeatmapEnter()

HeatmapEnter enters drill-down mode for the selected cell

func (*InsightsModel) HeatmapMoveDown added in v0.10.3

func (m *InsightsModel) HeatmapMoveDown()

HeatmapMoveDown moves selection down in heatmap (to higher depth)

func (*InsightsModel) HeatmapMoveLeft added in v0.10.3

func (m *InsightsModel) HeatmapMoveLeft()

HeatmapMoveLeft moves selection left in heatmap (to lower score)

func (*InsightsModel) HeatmapMoveRight added in v0.10.3

func (m *InsightsModel) HeatmapMoveRight()

HeatmapMoveRight moves selection right in heatmap (to higher score)

func (*InsightsModel) HeatmapMoveUp added in v0.10.3

func (m *InsightsModel) HeatmapMoveUp()

HeatmapMoveUp moves selection up in heatmap (to lower depth)

func (*InsightsModel) HeatmapSelectedIssueID added in v0.10.3

func (m *InsightsModel) HeatmapSelectedIssueID() string

HeatmapSelectedIssueID returns the currently selected issue ID in heatmap mode

func (*InsightsModel) IsHeatmapDrillDown added in v0.10.3

func (m *InsightsModel) IsHeatmapDrillDown() bool

IsHeatmapDrillDown returns whether we're in drill-down mode

func (*InsightsModel) MoveDown

func (m *InsightsModel) MoveDown()

func (*InsightsModel) MoveUp

func (m *InsightsModel) MoveUp()

Navigation methods

func (*InsightsModel) NextPanel

func (m *InsightsModel) NextPanel()

func (*InsightsModel) PrevPanel

func (m *InsightsModel) PrevPanel()

func (*InsightsModel) ScrollDetailDown added in v0.10.3

func (m *InsightsModel) ScrollDetailDown()

ScrollDetailDown scrolls the detail panel viewport down

func (*InsightsModel) ScrollDetailUp added in v0.10.3

func (m *InsightsModel) ScrollDetailUp()

ScrollDetailUp scrolls the detail panel viewport up

func (*InsightsModel) SelectedIssueID

func (m *InsightsModel) SelectedIssueID() string

SelectedIssueID returns the currently selected issue ID

func (*InsightsModel) SetInsights

func (m *InsightsModel) SetInsights(ins analysis.Insights)

func (*InsightsModel) SetRecommendations added in v0.10.3

func (m *InsightsModel) SetRecommendations(recs []analysis.Recommendation, dataHash string)

SetRecommendations sets the full recommendations with breakdown data (bv-93)

func (*InsightsModel) SetSize

func (m *InsightsModel) SetSize(w, h int)

func (*InsightsModel) SetTopPicks added in v0.10.3

func (m *InsightsModel) SetTopPicks(picks []analysis.TopPick)

SetTopPicks sets the priority triage recommendations (bv-91)

func (*InsightsModel) ToggleCalculation

func (m *InsightsModel) ToggleCalculation()

func (*InsightsModel) ToggleExplanations

func (m *InsightsModel) ToggleExplanations()

func (*InsightsModel) ToggleHeatmap added in v0.10.3

func (m *InsightsModel) ToggleHeatmap()

ToggleHeatmap toggles between priority list and heatmap view (bv-95)

func (*InsightsModel) View

func (m *InsightsModel) View() string

View renders the insights dashboard (pointer receiver to persist scroll state)

type IssueDelegate

type IssueDelegate struct {
	Theme             Theme
	ShowPriorityHints bool
	PriorityHints     map[string]*analysis.PriorityRecommendation
	WorkspaceMode     bool // When true, shows repo prefix badges
	ShowSearchScores  bool // Show semantic/hybrid score badge when search is active
}

IssueDelegate renders issue items in the list

func (IssueDelegate) Height

func (d IssueDelegate) Height() int

func (IssueDelegate) Render

func (d IssueDelegate) Render(w io.Writer, m list.Model, index int, listItem list.Item)

func (IssueDelegate) Spacing

func (d IssueDelegate) Spacing() int

func (IssueDelegate) Update

func (d IssueDelegate) Update(msg tea.Msg, m *list.Model) tea.Cmd

type IssueDiffStats added in v0.13.0

type IssueDiffStats struct {
	Changed int
	Total   int
	Ratio   float64
}

IssueDiffStats summarizes the change volume between snapshots.

type IssueItem

type IssueItem struct {
	Issue      model.Issue
	GraphScore float64
	Impact     float64
	DiffStatus DiffStatus // Diff state for time-travel mode
	RepoPrefix string     // Repository prefix for workspace mode (e.g., "api", "web")

	// Semantic/hybrid search scores (set when search is active)
	SearchScore      float64
	SearchTextScore  float64
	SearchComponents map[string]float64
	SearchScoreSet   bool

	// Triage insights (bv-151)
	TriageScore   float64  // Unified triage score (0-1)
	TriageReason  string   // Primary reason for recommendation
	TriageReasons []string // All triage reasons
	IsQuickWin    bool     // True if identified as a quick win
	IsBlocker     bool     // True if this item blocks significant downstream work
	UnblocksCount int      // Number of items this unblocks
}

IssueItem wraps model.Issue to implement list.Item

func (IssueItem) Description

func (i IssueItem) Description() string

func (IssueItem) FilterValue

func (i IssueItem) FilterValue() string

func (IssueItem) Title

func (i IssueItem) Title() string

type IssueTreeNode added in v0.12.0

type IssueTreeNode struct {
	Issue    *model.Issue     // Reference to the actual issue
	Children []*IssueTreeNode // Child nodes
	Expanded bool             // Is this node expanded?
	Depth    int              // Nesting level (0 = root)
	Parent   *IssueTreeNode   // Back-reference for navigation
}

IssueTreeNode represents a node in the hierarchical issue tree

type KeyBinding added in v0.10.4

type KeyBinding struct {
	Key  string
	Desc string
}

KeyBinding represents a single key binding

type KeyTable added in v0.10.4

type KeyTable struct {
	Bindings []KeyBinding
}

KeyTable renders a table of key bindings using lipgloss/table for proper alignment

func (KeyTable) Render added in v0.10.4

func (kt KeyTable) Render(theme Theme, width int) string

type LabelDashboardModel added in v0.10.3

type LabelDashboardModel struct {
	// contains filtered or unexported fields
}

LabelDashboardModel renders a lightweight table of label health

func NewLabelDashboardModel added in v0.10.3

func NewLabelDashboardModel(theme Theme) LabelDashboardModel

func (*LabelDashboardModel) SetData added in v0.10.3

func (m *LabelDashboardModel) SetData(labels []analysis.LabelHealth)

func (*LabelDashboardModel) SetSize added in v0.10.3

func (m *LabelDashboardModel) SetSize(width, height int)

func (*LabelDashboardModel) Update added in v0.10.3

func (m *LabelDashboardModel) Update(msg tea.KeyMsg) (string, tea.Cmd)

Update handles navigation keys; returns selected label on enter

func (LabelDashboardModel) View added in v0.10.3

func (m LabelDashboardModel) View() string

type LabelGraphAnalysisResult added in v0.10.3

type LabelGraphAnalysisResult struct {
	Label        string
	Subgraph     analysis.LabelSubgraph
	PageRank     analysis.LabelPageRankResult
	CriticalPath analysis.LabelCriticalPathResult
}

LabelGraphAnalysisResult holds label-specific graph analysis results (bv-109)

type LabelPickerModel added in v0.10.3

type LabelPickerModel struct {
	// contains filtered or unexported fields
}

LabelPickerModel provides a fuzzy search popup for quick label filtering

func NewLabelPickerModel added in v0.10.3

func NewLabelPickerModel(labels []string, counts map[string]int, theme Theme) LabelPickerModel

NewLabelPickerModel creates a new label picker with fuzzy search labels should be pre-sorted by count descending (from LabelExtractionResult.TopLabels)

func (*LabelPickerModel) FilteredCount added in v0.10.3

func (m *LabelPickerModel) FilteredCount() int

FilteredCount returns the number of filtered labels

func (*LabelPickerModel) InputValue added in v0.10.3

func (m *LabelPickerModel) InputValue() string

InputValue returns the current input value

func (*LabelPickerModel) MoveDown added in v0.10.3

func (m *LabelPickerModel) MoveDown()

MoveDown moves selection down

func (*LabelPickerModel) MoveUp added in v0.10.3

func (m *LabelPickerModel) MoveUp()

MoveUp moves selection up

func (*LabelPickerModel) Reset added in v0.10.3

func (m *LabelPickerModel) Reset()

Reset clears the input and resets selection

func (*LabelPickerModel) SelectedLabel added in v0.10.3

func (m *LabelPickerModel) SelectedLabel() string

SelectedLabel returns the currently selected label

func (*LabelPickerModel) SetLabels added in v0.10.3

func (m *LabelPickerModel) SetLabels(labels []string, counts map[string]int)

SetLabels updates the available labels with their counts

func (*LabelPickerModel) SetSize added in v0.10.3

func (m *LabelPickerModel) SetSize(width, height int)

SetSize updates the picker dimensions

func (*LabelPickerModel) UpdateInput added in v0.10.3

func (m *LabelPickerModel) UpdateInput(msg interface{})

UpdateInput processes a key message for the text input

func (*LabelPickerModel) View added in v0.10.3

func (m *LabelPickerModel) View() string

View renders the label picker overlay

type MarkdownRenderer added in v0.10.3

type MarkdownRenderer struct {
	// contains filtered or unexported fields
}

MarkdownRenderer provides theme-aware markdown rendering using glamour. It detects the terminal's color scheme and uses appropriate styles.

func NewMarkdownRenderer added in v0.10.3

func NewMarkdownRenderer(width int) *MarkdownRenderer

NewMarkdownRenderer creates a new markdown renderer using built-in styles. It uses Dracula style for dark terminals and a light style for light terminals. Prefer NewMarkdownRendererWithTheme for consistent styling with the bv Theme.

func NewMarkdownRendererWithTheme added in v0.10.3

func NewMarkdownRendererWithTheme(width int, theme Theme) *MarkdownRenderer

NewMarkdownRendererWithTheme creates a markdown renderer using custom colors that match the provided Theme for visual consistency.

func (*MarkdownRenderer) IsDarkMode added in v0.10.3

func (mr *MarkdownRenderer) IsDarkMode() bool

IsDarkMode returns whether the renderer is using dark mode styling.

func (*MarkdownRenderer) Render added in v0.10.3

func (mr *MarkdownRenderer) Render(markdown string) (string, error)

Render converts markdown content to styled terminal output.

func (*MarkdownRenderer) SetWidth added in v0.10.3

func (mr *MarkdownRenderer) SetWidth(width int)

SetWidth updates the word wrap width and recreates the renderer. If the renderer was created with a theme, the theme is preserved. Width is only updated if the new renderer is created successfully.

func (*MarkdownRenderer) SetWidthWithTheme added in v0.10.3

func (mr *MarkdownRenderer) SetWidthWithTheme(width int, theme Theme)

SetWidthWithTheme updates width and recreates renderer with theme colors. This also updates the stored theme for future SetWidth calls. If width is the same but theme differs, the renderer is still recreated with the new theme. Falls back to built-in styles if custom theme fails.

type MetricInfo

type MetricInfo struct {
	Icon        string
	Title       string
	ShortDesc   string
	WhatIs      string
	WhyUseful   string
	HowToUse    string
	FormulaHint string
}

MetricInfo contains explanation for each metric

type MetricPanel

type MetricPanel int

MetricPanel represents each panel type in the insights view

const (
	PanelBottlenecks MetricPanel = iota
	PanelKeystones
	PanelInfluencers
	PanelHubs
	PanelAuthorities
	PanelCores
	PanelArticulation
	PanelSlack
	PanelCycles
	PanelPriority // Agent-first priority recommendations
	PanelCount    // Sentinel for wrapping
)

type Model

type Model struct {
	// contains filtered or unexported fields
}

Model is the main Bubble Tea model for the beads viewer

func NewModel

func NewModel(issues []model.Issue, activeRecipe *recipe.Recipe, beadsPath string) Model

NewModel creates a new Model from the given issues beadsPath is the path to the beads.jsonl file for live reload support

func (Model) CurrentContext added in v0.10.3

func (m Model) CurrentContext() Context

CurrentContext returns the current UI context identifier. This is used for context-sensitive help (e.g., double-tap CapsLock). Priority order: overlays → views → detail states → filter → default

func (*Model) EnableWorkspaceMode

func (m *Model) EnableWorkspaceMode(info WorkspaceInfo)

EnableWorkspaceMode configures the model for workspace (multi-repo) view

func (Model) FilteredIssues

func (m Model) FilteredIssues() []model.Issue

FilteredIssues returns the currently visible issues (exposed for testing)

func (Model) FocusState added in v0.12.0

func (m Model) FocusState() string

FocusState returns the current focus state as a string for testing (bv-5e5q). This enables testing focus transitions without exposing the internal focus type.

func (Model) Init

func (m Model) Init() tea.Cmd

func (Model) IsActionableView added in v0.12.0

func (m Model) IsActionableView() bool

IsActionableView returns true if the actionable view is active (bv-5e5q).

func (Model) IsBoardView added in v0.12.0

func (m Model) IsBoardView() bool

IsBoardView returns true if the board view is active (bv-5e5q).

func (Model) IsGraphView added in v0.12.0

func (m Model) IsGraphView() bool

IsGraphView returns true if the graph view is active (bv-5e5q).

func (Model) IsHistoryView added in v0.12.0

func (m Model) IsHistoryView() bool

IsHistoryView returns true if the history view is active (bv-5e5q).

func (Model) IsTimeTravelMode

func (m Model) IsTimeTravelMode() bool

IsTimeTravelMode returns whether time-travel mode is active

func (Model) IsWorkspaceMode

func (m Model) IsWorkspaceMode() bool

IsWorkspaceMode returns whether workspace mode is active

func (*Model) RenderDebugView added in v0.10.3

func (m *Model) RenderDebugView(viewName string, width, height int) string

RenderDebugView renders a specific view for debugging purposes. This is used by --debug-render to capture TUI output without running interactively.

func (*Model) SetFilter

func (m *Model) SetFilter(f string)

SetFilter sets the current filter and applies it (exposed for testing)

func (*Model) Stop

func (m *Model) Stop()

Stop cleans up resources (file watcher, instance lock, background worker, etc.) Should be called when the program exits

func (Model) TimeTravelDiff

func (m Model) TimeTravelDiff() *analysis.SnapshotDiff

TimeTravelDiff returns the current diff (nil if not in time-travel mode)

func (Model) Update

func (m Model) Update(msg tea.Msg) (tea.Model, tea.Cmd)

func (Model) View

func (m Model) View() string

type Note added in v0.10.4

type Note struct {
	Text string
}

Note renders an info-style note box

func (Note) Render added in v0.10.4

func (n Note) Render(theme Theme, width int) string

type Paragraph added in v0.10.4

type Paragraph struct {
	Text string
}

Paragraph is a simple text paragraph

func (Paragraph) Render added in v0.10.4

func (p Paragraph) Render(theme Theme, width int) string

type Phase2ReadyMsg

type Phase2ReadyMsg struct {
	Stats    *analysis.GraphStats // The stats that completed, to detect stale messages
	Insights analysis.Insights    // Precomputed insights for Phase 2 metrics
}

Phase2ReadyMsg is sent when async graph analysis Phase 2 completes

type Phase2UpdateMsg added in v0.12.1

type Phase2UpdateMsg struct {
	DataHash string // Content hash to verify this matches current snapshot
}

Phase2UpdateMsg is sent when Phase 2 analysis completes. This allows the UI to update without waiting for full rebuild. The UI should check DataHash matches current snapshot before using.

type ProgressIndicator added in v0.10.4

type ProgressIndicator struct {
	Current int
	Total   int
	Label   string
}

ProgressIndicator shows a visual progress indicator (dots or bar style)

func (ProgressIndicator) Render added in v0.10.4

func (pi ProgressIndicator) Render(theme Theme, width int) string

type ReadyTimeoutMsg added in v0.10.3

type ReadyTimeoutMsg struct{}

ReadyTimeoutMsg is sent after a short delay to ensure the UI becomes ready even if the terminal doesn't send WindowSizeMsg promptly (bv-7wl7)

type RecipePickerModel

type RecipePickerModel struct {
	// contains filtered or unexported fields
}

RecipePickerModel represents the recipe picker overlay

func NewRecipePickerModel

func NewRecipePickerModel(recipes []recipe.Recipe, theme Theme) RecipePickerModel

NewRecipePickerModel creates a new recipe picker

func (*RecipePickerModel) MoveDown

func (m *RecipePickerModel) MoveDown()

MoveDown moves selection down

func (*RecipePickerModel) MoveUp

func (m *RecipePickerModel) MoveUp()

MoveUp moves selection up

func (*RecipePickerModel) RecipeCount

func (m *RecipePickerModel) RecipeCount() int

RecipeCount returns the number of recipes

func (*RecipePickerModel) SelectedIndex

func (m *RecipePickerModel) SelectedIndex() int

SelectedIndex returns the current selection index

func (*RecipePickerModel) SelectedRecipe

func (m *RecipePickerModel) SelectedRecipe() *recipe.Recipe

SelectedRecipe returns the currently selected recipe

func (*RecipePickerModel) SetSize

func (m *RecipePickerModel) SetSize(width, height int)

SetSize updates the picker dimensions

func (*RecipePickerModel) View

func (m *RecipePickerModel) View() string

View renders the recipe picker overlay

type RepoPickerModel added in v0.10.3

type RepoPickerModel struct {
	// contains filtered or unexported fields
}

RepoPickerModel represents the repository filter picker overlay (workspace mode).

func NewRepoPickerModel added in v0.10.3

func NewRepoPickerModel(repos []string, theme Theme) RepoPickerModel

NewRepoPickerModel creates a new repo picker. By default, all repos are selected.

func (*RepoPickerModel) MoveDown added in v0.10.3

func (m *RepoPickerModel) MoveDown()

MoveDown moves selection down.

func (*RepoPickerModel) MoveUp added in v0.10.3

func (m *RepoPickerModel) MoveUp()

MoveUp moves selection up.

func (*RepoPickerModel) SelectAll added in v0.10.3

func (m *RepoPickerModel) SelectAll()

SelectAll selects all repos.

func (RepoPickerModel) SelectedRepos added in v0.10.3

func (m RepoPickerModel) SelectedRepos() map[string]bool

SelectedRepos returns the selected repos as a map (repo -> true).

func (*RepoPickerModel) SetActiveRepos added in v0.10.3

func (m *RepoPickerModel) SetActiveRepos(active map[string]bool)

SetActiveRepos initializes selection from the currently active repo filter (nil = all).

func (*RepoPickerModel) SetSize added in v0.10.3

func (m *RepoPickerModel) SetSize(width, height int)

SetSize updates the picker dimensions.

func (*RepoPickerModel) ToggleSelected added in v0.10.3

func (m *RepoPickerModel) ToggleSelected()

ToggleSelected toggles the selected state of the current repo.

func (*RepoPickerModel) View added in v0.10.3

func (m *RepoPickerModel) View() string

View renders the repo picker overlay.

type Section added in v0.10.4

type Section struct {
	Title string
}

Section is a styled section header with subtle underline decoration

func (Section) Render added in v0.10.4

func (s Section) Render(theme Theme, width int) string

type SemanticFilterResultMsg added in v0.10.3

type SemanticFilterResultMsg struct {
	Term    string
	Results []list.Rank
}

SemanticFilterResultMsg is emitted when async semantic filter results are ready.

type SemanticIndexReadyMsg added in v0.10.3

type SemanticIndexReadyMsg struct {
	Embedder  search.Embedder
	Index     *search.VectorIndex
	IndexPath string
	Loaded    bool
	Stats     search.IndexSyncStats
	Error     error
}

SemanticIndexReadyMsg is emitted when the semantic index build/update completes.

type SemanticScore added in v0.11.0

type SemanticScore struct {
	Score      float64
	TextScore  float64
	Components map[string]float64
}

SemanticScore captures semantic/hybrid scoring details for a single issue.

type SemanticSearch added in v0.10.3

type SemanticSearch struct {
	// contains filtered or unexported fields
}

func NewSemanticSearch added in v0.10.3

func NewSemanticSearch() *SemanticSearch

func (*SemanticSearch) ClearPending added in v0.10.3

func (s *SemanticSearch) ClearPending()

ClearPending clears the pending term (e.g., when user stops filtering)

func (*SemanticSearch) ClearScores added in v0.11.0

func (s *SemanticSearch) ClearScores()

ClearScores clears cached scores.

func (*SemanticSearch) ComputeSemanticResults added in v0.10.3

func (s *SemanticSearch) ComputeSemanticResults(term string) []list.Rank

ComputeSemanticResults computes semantic similarity results synchronously. This should be called from an async tea.Cmd, not from Filter.

func (*SemanticSearch) Filter added in v0.10.3

func (s *SemanticSearch) Filter(term string, targets []string) []list.Rank

Filter implements list.FilterFunc, returning ranks sorted by semantic similarity. This is non-blocking: returns cached results or fuzzy fallback immediately, and marks the term as pending for async computation.

func (*SemanticSearch) GetLastQueryTime added in v0.10.3

func (s *SemanticSearch) GetLastQueryTime() time.Time

GetLastQueryTime returns when the last filter query was made (for debouncing)

func (*SemanticSearch) GetPendingTerm added in v0.10.3

func (s *SemanticSearch) GetPendingTerm() string

GetPendingTerm returns the term awaiting async semantic computation, if any

func (*SemanticSearch) ResetCache added in v0.11.0

func (s *SemanticSearch) ResetCache()

ResetCache clears cached semantic results and scores.

func (*SemanticSearch) Scores added in v0.11.0

func (s *SemanticSearch) Scores(term string) (map[string]SemanticScore, bool)

Scores returns scores for a specific term if available.

func (*SemanticSearch) SetCachedResults added in v0.10.3

func (s *SemanticSearch) SetCachedResults(term string, results []list.Rank)

SetCachedResults stores semantic filter results and clears pending state if matching

func (*SemanticSearch) SetDocs added in v0.11.0

func (s *SemanticSearch) SetDocs(docs map[string]string)

func (*SemanticSearch) SetHybridConfig added in v0.11.0

func (s *SemanticSearch) SetHybridConfig(enabled bool, preset search.PresetName)

SetHybridConfig updates hybrid scoring configuration.

func (*SemanticSearch) SetIDs added in v0.10.3

func (s *SemanticSearch) SetIDs(ids []string)

func (*SemanticSearch) SetIndex added in v0.10.3

func (s *SemanticSearch) SetIndex(idx *search.VectorIndex, embedder search.Embedder)

func (*SemanticSearch) SetMetricsCache added in v0.11.0

func (s *SemanticSearch) SetMetricsCache(cache search.MetricsCache)

SetMetricsCache sets the metrics cache used for hybrid scoring.

func (*SemanticSearch) SetScores added in v0.11.0

func (s *SemanticSearch) SetScores(term string, scores map[string]SemanticScore)

SetScores stores the latest scores for a given term.

func (*SemanticSearch) Snapshot added in v0.10.3

func (s *SemanticSearch) Snapshot() semanticSearchSnapshot

type ShortcutsSidebar added in v0.10.3

type ShortcutsSidebar struct {
	// contains filtered or unexported fields
}

ShortcutsSidebar provides a toggleable panel showing context-aware keyboard shortcuts Unlike the help overlay, this can remain visible while working (bv-3qi5)

func NewShortcutsSidebar added in v0.10.3

func NewShortcutsSidebar(theme Theme) ShortcutsSidebar

NewShortcutsSidebar creates a new shortcuts sidebar

func (*ShortcutsSidebar) ResetScroll added in v0.10.3

func (s *ShortcutsSidebar) ResetScroll()

ResetScroll resets scroll position to top

func (*ShortcutsSidebar) ScrollDown added in v0.10.3

func (s *ShortcutsSidebar) ScrollDown()

ScrollDown scrolls the sidebar content down

func (*ShortcutsSidebar) ScrollPageDown added in v0.10.3

func (s *ShortcutsSidebar) ScrollPageDown()

ScrollPageDown scrolls down by a page

func (*ShortcutsSidebar) ScrollPageUp added in v0.10.3

func (s *ShortcutsSidebar) ScrollPageUp()

ScrollPageUp scrolls up by a page

func (*ShortcutsSidebar) ScrollUp added in v0.10.3

func (s *ShortcutsSidebar) ScrollUp()

ScrollUp scrolls the sidebar content up

func (*ShortcutsSidebar) SetContext added in v0.10.3

func (s *ShortcutsSidebar) SetContext(ctx string)

SetContext updates the current context for filtering shortcuts

func (*ShortcutsSidebar) SetSize added in v0.10.3

func (s *ShortcutsSidebar) SetSize(width, height int)

SetSize updates the sidebar dimensions

func (*ShortcutsSidebar) View added in v0.10.3

func (s *ShortcutsSidebar) View() string

View renders the sidebar

func (*ShortcutsSidebar) Width added in v0.10.3

func (s *ShortcutsSidebar) Width() int

Width returns the fixed width of the sidebar

type ShowTutorialMsg added in v0.10.3

type ShowTutorialMsg struct {
	ContextOnly bool   // If true, show context-specific help only
	Context     string // Current context identifier (used when ContextOnly is true)
}

ShowTutorialMsg signals the main model to show the tutorial.

type SnapshotBuilder added in v0.12.1

type SnapshotBuilder struct {
	// contains filtered or unexported fields
}

SnapshotBuilder constructs DataSnapshots from raw data. This is used by the BackgroundWorker to build new snapshots.

func NewSnapshotBuilder added in v0.12.1

func NewSnapshotBuilder(issues []model.Issue) *SnapshotBuilder

NewSnapshotBuilder creates a builder for constructing a DataSnapshot.

func (*SnapshotBuilder) Build added in v0.12.1

func (b *SnapshotBuilder) Build() *DataSnapshot

Build constructs the final immutable DataSnapshot. This performs all necessary computations that should happen in the background. Uses AnalyzeAsync() so Phase 2 metrics compute in background - check Phase2Ready or call GetGraphStats().WaitForPhase2() if you need Phase 2 data immediately.

func (*SnapshotBuilder) WithAnalysis added in v0.12.1

func (b *SnapshotBuilder) WithAnalysis(a *analysis.GraphStats) *SnapshotBuilder

WithAnalysis sets the pre-computed analysis (for when we have cached results).

func (*SnapshotBuilder) WithBuildConfig added in v0.13.0

func (b *SnapshotBuilder) WithBuildConfig(cfg snapshotBuildConfig) *SnapshotBuilder

func (*SnapshotBuilder) WithPreviousSnapshot added in v0.13.0

func (b *SnapshotBuilder) WithPreviousSnapshot(prev *DataSnapshot, diff *analysis.IssueDiff) *SnapshotBuilder

WithPreviousSnapshot enables incremental list-item rebuilds when possible.

func (*SnapshotBuilder) WithRecipe added in v0.13.0

func (b *SnapshotBuilder) WithRecipe(r *recipe.Recipe) *SnapshotBuilder

type SnapshotErrorMsg added in v0.12.1

type SnapshotErrorMsg struct {
	Err         error
	Recoverable bool // True if we expect to recover on next file change
}

SnapshotErrorMsg is sent to the UI when snapshot building fails.

type SnapshotReadyMsg added in v0.12.1

type SnapshotReadyMsg struct {
	Snapshot      *DataSnapshot
	FileChangeAt  time.Time
	SentAt        time.Time
	SnapshotVer   uint64
	QueueDepth    int64
	CoalesceCount int64
}

SnapshotReadyMsg is sent to the UI when a new snapshot is ready.

type SortMode added in v0.10.3

type SortMode int

SortMode represents the current list sorting mode (bv-3ita)

const (
	SortDefault     SortMode = iota // Priority asc, then created desc (original default)
	SortCreatedAsc                  // By creation date, oldest first
	SortCreatedDesc                 // By creation date, newest first
	SortPriority                    // By priority only (ascending)
	SortUpdated                     // By last update, newest first

)

func (SortMode) String added in v0.10.3

func (s SortMode) String() string

String returns a human-readable label for the sort mode

type Spacer added in v0.10.4

type Spacer struct {
	Lines int
}

Spacer adds vertical space

func (Spacer) Render added in v0.10.4

func (s Spacer) Render(theme Theme, width int) string

type StatusFlow added in v0.10.4

type StatusFlow struct {
	Steps []FlowStep
}

StatusFlow renders a status flow diagram using lipgloss boxes with elegant arrows

func (StatusFlow) Render added in v0.10.4

func (sf StatusFlow) Render(theme Theme, width int) string

type StructuredTutorialPage added in v0.10.4

type StructuredTutorialPage struct {
	ID       string
	Title    string
	Section  string
	Elements []TutorialElement
	Contexts []string // Which view contexts this page applies to (empty = all)
}

StructuredTutorialPage represents a tutorial page with typed elements

type StyledTable added in v0.10.4

type StyledTable struct {
	Headers []string
	Rows    [][]string
}

StyledTable renders a full table with headers using lipgloss/table

func (StyledTable) Render added in v0.10.4

func (st StyledTable) Render(theme Theme, width int) string

type SwimLaneMode added in v0.10.3

type SwimLaneMode int

SwimLaneMode determines how cards are grouped into columns (bv-wjs0)

const (
	SwimByStatus   SwimLaneMode = iota // Default: Open | In Progress | Blocked | Closed
	SwimByPriority                     // P0 Critical | P1 High | P2 Medium | P3+ Other
	SwimByType                         // Bug | Feature | Task | Epic
)

type Theme

type Theme struct {
	Renderer *lipgloss.Renderer

	// Colors
	Primary   lipgloss.AdaptiveColor
	Secondary lipgloss.AdaptiveColor
	Subtext   lipgloss.AdaptiveColor

	// Status
	Open       lipgloss.AdaptiveColor
	InProgress lipgloss.AdaptiveColor
	Blocked    lipgloss.AdaptiveColor
	Deferred   lipgloss.AdaptiveColor
	Pinned     lipgloss.AdaptiveColor
	Hooked     lipgloss.AdaptiveColor
	Closed     lipgloss.AdaptiveColor
	Tombstone  lipgloss.AdaptiveColor

	// Types
	Bug     lipgloss.AdaptiveColor
	Feature lipgloss.AdaptiveColor
	Task    lipgloss.AdaptiveColor
	Epic    lipgloss.AdaptiveColor
	Chore   lipgloss.AdaptiveColor

	// UI Elements
	Border    lipgloss.AdaptiveColor
	Highlight lipgloss.AdaptiveColor
	Muted     lipgloss.AdaptiveColor

	// Styles
	Base     lipgloss.Style
	Selected lipgloss.Style
	Column   lipgloss.Style
	Header   lipgloss.Style

	// Pre-computed delegate styles (bv-o4cj optimization)
	// These are created once at startup instead of per-frame
	MutedText         lipgloss.Style // Age, muted info
	InfoText          lipgloss.Style // Comments
	InfoBold          lipgloss.Style // Search scores
	SecondaryText     lipgloss.Style // ID, assignee
	PrimaryBold       lipgloss.Style // Selection indicator
	PriorityUpArrow   lipgloss.Style // Priority hint ↑
	PriorityDownArrow lipgloss.Style // Priority hint ↓
	TriageStar        lipgloss.Style // Top pick ⭐
	TriageUnblocks    lipgloss.Style // Unblocks indicator 🔓
	TriageUnblocksAlt lipgloss.Style // Secondary unblocks ↪
}

func DefaultTheme

func DefaultTheme(r *lipgloss.Renderer) Theme

DefaultTheme returns the standard Dracula-inspired theme (adaptive)

func (Theme) GetStatusColor

func (t Theme) GetStatusColor(s string) lipgloss.AdaptiveColor

func (Theme) GetTypeIcon

func (t Theme) GetTypeIcon(typ string) (string, lipgloss.AdaptiveColor)

type TimelineEntry added in v0.10.3

type TimelineEntry struct {
	Timestamp  time.Time
	EntryType  timelineEntryType
	Label      string  // Event type name or commit SHA
	Detail     string  // Full message or event detail
	Confidence float64 // For commits: correlation confidence (0-1)
	EventType  string  // For events: "created", "claimed", "closed", etc.

	// Session fields (bv-pr1l)
	SessionAgent        string  // For sessions: "claude", "cursor", etc.
	SessionMessageCount int     // For sessions: number of messages in session
	SessionPath         string  // For sessions: path to session file
	SessionScore        float64 // For sessions: correlation score
}

TimelineEntry represents a single entry in the timeline visualization (bv-1x6o)

type Tip added in v0.10.4

type Tip struct {
	Text string
}

Tip renders a highlighted tip/note box with lightbulb icon

func (Tip) Render added in v0.10.4

func (t Tip) Render(theme Theme, width int) string

type Tree added in v0.10.4

type Tree struct {
	Root     string
	Children []TutorialTreeNode
}

Tree renders a hierarchical tree structure using lipgloss/tree

func (Tree) Render added in v0.10.4

func (t Tree) Render(theme Theme, width int) string

type TreeModel added in v0.12.0

type TreeModel struct {
	// contains filtered or unexported fields
}

TreeModel manages the hierarchical tree view state

func NewTreeModel added in v0.12.0

func NewTreeModel(theme Theme) TreeModel

NewTreeModel creates an empty tree model

func (*TreeModel) Build added in v0.12.0

func (t *TreeModel) Build(issues []model.Issue)

Build constructs the tree from issues using parent-child dependencies. Implementation for bv-j3ck.

func (*TreeModel) BuildFromSnapshot added in v0.13.0

func (t *TreeModel) BuildFromSnapshot(snapshot *DataSnapshot)

BuildFromSnapshot wires the tree view to precomputed tree data from a DataSnapshot. This avoids building the parent/child structure on the UI thread when the snapshot already contains it (bv-t435).

func (*TreeModel) CollapseAll added in v0.12.0

func (t *TreeModel) CollapseAll()

CollapseAll collapses all nodes in the tree.

func (*TreeModel) CollapseOrJumpToParent added in v0.12.0

func (t *TreeModel) CollapseOrJumpToParent()

CollapseOrJumpToParent handles the ← / h key: - If node has children and is expanded: collapse it - If node is collapsed or is a leaf: jump to parent

func (*TreeModel) ExpandAll added in v0.12.0

func (t *TreeModel) ExpandAll()

ExpandAll expands all nodes in the tree.

func (*TreeModel) ExpandOrMoveToChild added in v0.12.0

func (t *TreeModel) ExpandOrMoveToChild()

ExpandOrMoveToChild handles the → / l key: - If node has children and is collapsed: expand it - If node has children and is expanded: move to first child - If node is a leaf: do nothing

func (*TreeModel) GetPriorityColor added in v0.12.0

func (t *TreeModel) GetPriorityColor(priority int) lipgloss.AdaptiveColor

GetPriorityColor returns the color for a priority level.

func (*TreeModel) GetSelectedID added in v0.12.0

func (t *TreeModel) GetSelectedID() string

GetSelectedID returns the ID of the currently selected issue, or empty string.

func (*TreeModel) GetViewportOffset added in v0.12.0

func (t *TreeModel) GetViewportOffset() int

GetViewportOffset returns the current viewport offset (for testing/debugging).

func (*TreeModel) IsBuilt added in v0.12.0

func (t *TreeModel) IsBuilt() bool

IsBuilt returns whether the tree has been built.

func (*TreeModel) JumpToBottom added in v0.12.0

func (t *TreeModel) JumpToBottom()

JumpToBottom moves cursor to the last node.

func (*TreeModel) JumpToParent added in v0.12.0

func (t *TreeModel) JumpToParent()

JumpToParent moves cursor to the parent of the currently selected node. If already at a root node, does nothing.

func (*TreeModel) JumpToTop added in v0.12.0

func (t *TreeModel) JumpToTop()

JumpToTop moves cursor to the first node.

func (*TreeModel) MoveDown added in v0.12.0

func (t *TreeModel) MoveDown()

MoveDown moves the cursor down in the flat list.

func (*TreeModel) MoveUp added in v0.12.0

func (t *TreeModel) MoveUp()

MoveUp moves the cursor up in the flat list.

func (*TreeModel) NodeCount added in v0.12.0

func (t *TreeModel) NodeCount() int

NodeCount returns the total number of visible nodes.

func (*TreeModel) PageDown added in v0.12.0

func (t *TreeModel) PageDown()

PageDown moves cursor down by half a viewport.

func (*TreeModel) PageUp added in v0.12.0

func (t *TreeModel) PageUp()

PageUp moves cursor up by half a viewport.

func (*TreeModel) RootCount added in v0.12.0

func (t *TreeModel) RootCount() int

RootCount returns the number of root nodes.

func (*TreeModel) SelectByID added in v0.12.0

func (t *TreeModel) SelectByID(id string) bool

SelectByID moves cursor to the node with the given issue ID. Returns true if found, false otherwise. Useful for preserving cursor position after rebuild.

func (*TreeModel) SelectedIssue added in v0.12.0

func (t *TreeModel) SelectedIssue() *model.Issue

SelectedIssue returns the currently selected issue, or nil if none.

func (*TreeModel) SelectedNode added in v0.12.0

func (t *TreeModel) SelectedNode() *IssueTreeNode

SelectedNode returns the currently selected tree node, or nil if none.

func (*TreeModel) SetBeadsDir added in v0.12.0

func (t *TreeModel) SetBeadsDir(dir string)

SetBeadsDir sets the beads directory for persistence (bv-19vz). This should be called before any expand/collapse operations if a custom beads directory is desired. If not called, defaults to ".beads" in cwd.

func (*TreeModel) SetSize added in v0.12.0

func (t *TreeModel) SetSize(width, height int)

SetSize updates the available dimensions for the tree view

func (*TreeModel) ToggleExpand added in v0.12.0

func (t *TreeModel) ToggleExpand()

ToggleExpand expands or collapses the currently selected node.

func (*TreeModel) View added in v0.12.0

func (t *TreeModel) View() string

View renders the tree view. Implementation for bv-1371, updated for windowed rendering (bv-db02). Only renders visible nodes based on viewportOffset and height for O(viewport) performance instead of O(n) where n is total nodes.

type TreeState added in v0.12.0

type TreeState struct {
	Version  int             `json:"version"`  // Schema version (currently 1)
	Expanded map[string]bool `json:"expanded"` // Issue ID -> explicitly set state
}

TreeState represents the persistent state of the tree view (bv-zv7p). This is saved to .beads/tree-state.json to preserve expand/collapse state across sessions.

File format (JSON):

{
  "version": 1,
  "expanded": {
    "bv-123": true,   // explicitly expanded
    "bv-456": false   // explicitly collapsed
  }
}

Design notes:

  • Only stores explicit user changes; nodes not in the map use default behavior
  • Default: expanded for depth < 2, collapsed otherwise
  • Version field enables future schema migrations
  • Corrupted/missing file = use defaults (graceful degradation)

func DefaultTreeState added in v0.12.0

func DefaultTreeState() *TreeState

DefaultTreeState returns a new TreeState with sensible defaults

type TreeViewMode added in v0.12.0

type TreeViewMode int

TreeViewMode determines what relationships are displayed

const (
	TreeModeHierarchy TreeViewMode = iota // parent-child deps (default)
	TreeModeBlocking                      // blocking deps (future)
)

type TutorialElement added in v0.10.4

type TutorialElement interface {
	Render(theme Theme, width int) string
}

TutorialElement is the interface for renderable tutorial content

type TutorialKeyBindings added in v0.10.3

type TutorialKeyBindings struct {
	DirectTutorial  string // Key for direct tutorial access (default: `)
	ContextHelp     string // Key for direct context help (default: ~)
	HelpModalSpace  bool   // Whether Space in help modal opens tutorial
	DoubleTapEnable bool   // Whether double-tap detection is enabled
}

TutorialKeyBindings holds configurable key bindings for tutorial access.

func DefaultTutorialKeyBindings added in v0.10.3

func DefaultTutorialKeyBindings() TutorialKeyBindings

DefaultTutorialKeyBindings returns the default key binding configuration.

func (TutorialKeyBindings) IsContextHelp added in v0.10.3

func (b TutorialKeyBindings) IsContextHelp(msg tea.KeyMsg) bool

IsContextHelp checks if the key matches the context help binding.

func (TutorialKeyBindings) IsDirectTutorial added in v0.10.3

func (b TutorialKeyBindings) IsDirectTutorial(msg tea.KeyMsg) bool

IsDirectTutorial checks if the key matches the direct tutorial binding.

type TutorialModel added in v0.10.3

type TutorialModel struct {
	// contains filtered or unexported fields
}

TutorialModel manages the tutorial overlay state.

func NewTutorialModel added in v0.10.3

func NewTutorialModel(theme Theme) TutorialModel

NewTutorialModel creates a new tutorial model with default pages.

func (TutorialModel) CenterTutorial added in v0.10.3

func (m TutorialModel) CenterTutorial(termWidth, termHeight int) string

CenterTutorial returns the tutorial view centered in the terminal.

func (TutorialModel) CurrentPageID added in v0.10.3

func (m TutorialModel) CurrentPageID() string

CurrentPageID returns the ID of the current page.

func (*TutorialModel) HasViewedPage added in v0.10.3

func (m *TutorialModel) HasViewedPage(pageID string) bool

HasViewedPage returns whether a page has been viewed (from persisted data).

func (TutorialModel) Init added in v0.10.3

func (m TutorialModel) Init() tea.Cmd

Init initializes the tutorial model.

func (TutorialModel) IsComplete added in v0.10.3

func (m TutorialModel) IsComplete() bool

IsComplete returns true if all pages have been viewed.

func (*TutorialModel) JumpToPage added in v0.10.3

func (m *TutorialModel) JumpToPage(index int)

JumpToPage jumps to a specific page index.

func (*TutorialModel) JumpToSection added in v0.10.3

func (m *TutorialModel) JumpToSection(sectionID string)

JumpToSection jumps to the first page in a section.

func (*TutorialModel) LoadProgress added in v0.10.3

func (m *TutorialModel) LoadProgress()

LoadProgress loads saved progress into the tutorial model.

func (*TutorialModel) MarkViewed added in v0.10.3

func (m *TutorialModel) MarkViewed(pageID string)

MarkViewed marks a page as viewed.

func (*TutorialModel) NextPage added in v0.10.3

func (m *TutorialModel) NextPage()

NextPage advances to the next page.

func (*TutorialModel) PrevPage added in v0.10.3

func (m *TutorialModel) PrevPage()

PrevPage goes to the previous page.

func (TutorialModel) Progress added in v0.10.3

func (m TutorialModel) Progress() map[string]bool

Progress returns the progress map for persistence.

func (*TutorialModel) ResetClose added in v0.10.3

func (m *TutorialModel) ResetClose()

ResetClose resets the close flag (call after handling close) (bv-wdsd).

func (*TutorialModel) SaveProgress added in v0.10.3

func (m *TutorialModel) SaveProgress() error

SaveProgress saves current tutorial progress (call on exit).

func (*TutorialModel) SetContext added in v0.10.3

func (m *TutorialModel) SetContext(ctx string)

SetContext sets the current view context for filtering.

func (*TutorialModel) SetContextMode added in v0.10.3

func (m *TutorialModel) SetContextMode(enabled bool)

SetContextMode enables or disables context-based filtering.

func (*TutorialModel) SetProgress added in v0.10.3

func (m *TutorialModel) SetProgress(progress map[string]bool)

SetProgress restores progress from persistence.

func (*TutorialModel) SetSize added in v0.10.3

func (m *TutorialModel) SetSize(width, height int)

SetSize sets the tutorial dimensions and updates the markdown renderer.

func (TutorialModel) ShouldClose added in v0.10.3

func (m TutorialModel) ShouldClose() bool

ShouldClose returns true if user requested to close the tutorial (bv-wdsd).

func (TutorialModel) Update added in v0.10.3

func (m TutorialModel) Update(msg tea.Msg) (TutorialModel, tea.Cmd)

Update handles keyboard input for the tutorial with focus management (bv-wdsd).

func (TutorialModel) View added in v0.10.3

func (m TutorialModel) View() string

View renders the tutorial overlay.

type TutorialPage added in v0.10.3

type TutorialPage struct {
	ID       string   // Unique identifier (e.g., "intro", "navigation")
	Title    string   // Page title displayed in header
	Content  string   // Markdown content
	Section  string   // Parent section for TOC grouping
	Contexts []string // Which view contexts this page applies to (empty = all)
}

TutorialPage represents a single page of tutorial content.

type TutorialProgress added in v0.10.3

type TutorialProgress struct {
	ViewedPages    map[string]bool `json:"viewed_pages"`     // page ID → viewed
	LastPageID     string          `json:"last_page_id"`     // Resume point
	LastViewedTime time.Time       `json:"last_viewed_time"` // When last viewed
	CompletedOnce  bool            `json:"completed_once"`   // Has seen all pages at least once
}

TutorialProgress tracks which tutorial pages have been viewed. This persists across sessions so users can see their progress.

type TutorialTreeNode added in v0.12.0

type TutorialTreeNode struct {
	Label    string
	Children []TutorialTreeNode
}

TutorialTreeNode is a simple tree node for tutorial rendering. Named to avoid collision with TreeNode in tree.go (bv-gllx feature).

type TutorialTrigger added in v0.10.3

type TutorialTrigger int

TutorialTrigger represents what action to take when tutorial key is pressed.

const (
	TriggerNone TutorialTrigger = iota
	TriggerFullTutorial
	TriggerContextHelp
)

func (TutorialTrigger) String added in v0.10.3

func (t TutorialTrigger) String() string

String returns a human-readable description of the trigger.

type UpdateCompleteMsg added in v0.11.3

type UpdateCompleteMsg struct {
	Success     bool
	Message     string
	NewVersion  string
	BackupPath  string
	RequireRoot bool
}

UpdateCompleteMsg is sent when the update completes

type UpdateModal added in v0.11.3

type UpdateModal struct {
	// contains filtered or unexported fields
}

UpdateModal displays the update confirmation and progress.

func NewUpdateModal added in v0.11.3

func NewUpdateModal(newVersion, releaseURL string, theme Theme) UpdateModal

NewUpdateModal creates a new update modal.

func (UpdateModal) CenterModal added in v0.11.3

func (m UpdateModal) CenterModal(termWidth, termHeight int) string

CenterModal returns the modal view centered in the given dimensions.

func (UpdateModal) IsCancelled added in v0.11.3

func (m UpdateModal) IsCancelled() bool

IsCancelled returns true if user selected Cancel

func (UpdateModal) IsComplete added in v0.11.3

func (m UpdateModal) IsComplete() bool

IsComplete returns true if the update is done (success or error)

func (UpdateModal) IsConfirming added in v0.11.3

func (m UpdateModal) IsConfirming() bool

IsConfirming returns true if the modal is in confirm state

func (UpdateModal) IsInProgress added in v0.11.3

func (m UpdateModal) IsInProgress() bool

IsInProgress returns true if the update is in progress

func (*UpdateModal) SetSize added in v0.11.3

func (m *UpdateModal) SetSize(width, height int)

SetSize sets the modal dimensions based on terminal size.

func (UpdateModal) Update added in v0.11.3

func (m UpdateModal) Update(msg tea.Msg) (UpdateModal, tea.Cmd)

Update handles input for the modal.

func (UpdateModal) View added in v0.11.3

func (m UpdateModal) View() string

View renders the modal.

type UpdateMsg

type UpdateMsg struct {
	TagName string
	URL     string
}

UpdateMsg is sent when a new version is available

type UpdateProgress added in v0.11.3

type UpdateProgress struct {
	BytesDownloaded int64
	TotalBytes      int64
	Stage           string
}

UpdateProgress represents progress during download

type UpdateProgressMsg added in v0.11.3

type UpdateProgressMsg struct {
	Progress UpdateProgress
}

UpdateProgressMsg is sent during the update process

type UpdateState added in v0.11.3

type UpdateState int

UpdateState represents the current state of the update process

const (
	UpdateStateIdle UpdateState = iota
	UpdateStateConfirm
	UpdateStateDownloading
	UpdateStateVerifying
	UpdateStateInstalling
	UpdateStateSuccess
	UpdateStateError
)

type ValueProp added in v0.10.4

type ValueProp struct {
	Icon string
	Text string
}

ValueProp renders a value proposition with styled number icon

func (ValueProp) Render added in v0.10.4

func (vp ValueProp) Render(theme Theme, width int) string

type VelocityComparisonModel added in v0.10.3

type VelocityComparisonModel struct {
	// contains filtered or unexported fields
}

VelocityComparisonModel shows side-by-side velocity comparison for all labels

func NewVelocityComparisonModel added in v0.10.3

func NewVelocityComparisonModel(theme Theme) VelocityComparisonModel

NewVelocityComparisonModel creates a new velocity comparison view

func (*VelocityComparisonModel) DataCount added in v0.10.3

func (m *VelocityComparisonModel) DataCount() int

DataCount returns the number of labels

func (*VelocityComparisonModel) MoveDown added in v0.10.3

func (m *VelocityComparisonModel) MoveDown()

MoveDown moves cursor down

func (*VelocityComparisonModel) MoveUp added in v0.10.3

func (m *VelocityComparisonModel) MoveUp()

MoveUp moves cursor up

func (*VelocityComparisonModel) SelectedLabel added in v0.10.3

func (m *VelocityComparisonModel) SelectedLabel() string

SelectedLabel returns the currently selected label

func (*VelocityComparisonModel) SetData added in v0.10.3

func (m *VelocityComparisonModel) SetData(issues []model.Issue)

SetData updates the view with computed velocity data

func (*VelocityComparisonModel) SetSize added in v0.10.3

func (m *VelocityComparisonModel) SetSize(width, height int)

SetSize updates the view dimensions

func (*VelocityComparisonModel) View added in v0.10.3

func (m *VelocityComparisonModel) View() string

View renders the velocity comparison table

type Warning added in v0.10.4

type Warning struct {
	Text string
}

Warning renders a warning box with alert styling

func (Warning) Render added in v0.10.4

func (w Warning) Render(theme Theme, width int) string

type WorkerConfig added in v0.12.1

type WorkerConfig struct {
	BeadsPath     string
	DebounceDelay time.Duration
	MessageBuffer int // Buffer size for worker -> UI messages (default: 8)

	IdleGC *IdleGCConfig

	// Watchdog configuration (bv-03h1). Zero values use defaults.
	HeartbeatInterval time.Duration // default: 5s
	WatchdogInterval  time.Duration // default: 10s
	HeartbeatTimeout  time.Duration // default: 30s
	ProcessingTimeout time.Duration // default: 30s
	MaxRecoveries     int           // default: 3
}

WorkerConfig configures the BackgroundWorker.

type WorkerError added in v0.12.1

type WorkerError struct {
	Phase   string    // "load", "parse", "analyze_phase1", "analyze_phase2"
	Cause   error     // The underlying error
	Time    time.Time // When the error occurred
	Retries int       // Number of retry attempts
}

WorkerError wraps errors with phase and retry context.

func (WorkerError) Error added in v0.12.1

func (e WorkerError) Error() string

func (WorkerError) Unwrap added in v0.12.1

func (e WorkerError) Unwrap() error

type WorkerHealth added in v0.13.0

type WorkerHealth struct {
	Started       bool
	Alive         bool
	LastHeartbeat time.Time
	RecoveryCount int
	UptimeSince   time.Time

	IdleGCEnabled      bool
	IdleGCCount        uint64
	IdleGCTotal        time.Duration
	IdleGCLastDuration time.Duration
	IdleGCLastAt       time.Time
}

type WorkerLogLevel added in v0.13.0

type WorkerLogLevel int

WorkerLogLevel controls background worker log verbosity.

const (
	LogLevelNone WorkerLogLevel = iota
	LogLevelError
	LogLevelWarn
	LogLevelInfo
	LogLevelDebug
	LogLevelTrace
)

func (WorkerLogLevel) String added in v0.13.0

func (l WorkerLogLevel) String() string

type WorkerMetrics added in v0.13.0

type WorkerMetrics struct {
	ProcessingCount      uint64
	ProcessingDuration   time.Duration
	Phase1Duration       time.Duration
	Phase2Duration       time.Duration
	CoalesceCount        int64
	QueueDepth           int64
	SnapshotVersion      uint64
	SnapshotSizeBytes    int64
	PoolHits             uint64
	PoolMisses           uint64
	GCPauseDelta         time.Duration
	SwapLatency          time.Duration
	UIUpdateLatency      time.Duration
	LastFileChangeAt     time.Time
	LastSnapshotReadyAt  time.Time
	IncrementalListCount uint64
	FullListCount        uint64
	IncrementalListRatio float64
}

WorkerMetrics captures the most recent metrics snapshot.

type WorkerState added in v0.12.1

type WorkerState int

WorkerState represents the current state of the background worker.

const (
	// WorkerIdle means the worker is waiting for file changes.
	WorkerIdle WorkerState = iota
	// WorkerProcessing means the worker is building a new snapshot.
	WorkerProcessing
	// WorkerStopped means the worker has been stopped.
	WorkerStopped
)

type WorkspaceInfo

type WorkspaceInfo struct {
	Enabled      bool
	RepoCount    int
	FailedCount  int
	TotalIssues  int
	RepoPrefixes []string
}

WorkspaceInfo contains workspace loading metadata for TUI display

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL