- Add bubbletea and bubbles dependencies - Create internal/tui/feed package with: - model.go: Main bubbletea model with agent tree and event stream - view.go: Rendering logic with lipgloss styling - keys.go: Vim-style key bindings (j/k, tab, /, q) - styles.go: Color palette and component styles - events.go: Event source from bd activity - Update gt feed to use TUI by default (--plain for text mode) - TUI features: agent tree by role, event stream, keyboard nav Closes gt-be0as, gt-lexye, gt-1uhmj 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
119 lines
2.6 KiB
Go
119 lines
2.6 KiB
Go
// Package feed provides a TUI for the Gas Town activity feed.
|
|
package feed
|
|
|
|
import "github.com/charmbracelet/lipgloss"
|
|
|
|
// Color palette
|
|
var (
|
|
colorPrimary = lipgloss.Color("12") // Blue
|
|
colorSuccess = lipgloss.Color("10") // Green
|
|
colorWarning = lipgloss.Color("11") // Yellow
|
|
colorError = lipgloss.Color("9") // Red
|
|
colorDim = lipgloss.Color("8") // Gray
|
|
colorHighlight = lipgloss.Color("14") // Cyan
|
|
colorAccent = lipgloss.Color("13") // Magenta
|
|
)
|
|
|
|
// Styles for the feed TUI
|
|
var (
|
|
// Header styles
|
|
HeaderStyle = lipgloss.NewStyle().
|
|
Bold(true).
|
|
Foreground(colorPrimary).
|
|
Padding(0, 1)
|
|
|
|
TitleStyle = lipgloss.NewStyle().
|
|
Bold(true).
|
|
Foreground(lipgloss.Color("15"))
|
|
|
|
FilterStyle = lipgloss.NewStyle().
|
|
Foreground(colorDim)
|
|
|
|
// Agent tree styles
|
|
TreePanelStyle = lipgloss.NewStyle().
|
|
Border(lipgloss.RoundedBorder()).
|
|
BorderForeground(colorDim).
|
|
Padding(0, 1)
|
|
|
|
RigStyle = lipgloss.NewStyle().
|
|
Bold(true).
|
|
Foreground(colorPrimary)
|
|
|
|
RoleStyle = lipgloss.NewStyle().
|
|
Foreground(colorAccent)
|
|
|
|
AgentNameStyle = lipgloss.NewStyle().
|
|
Foreground(lipgloss.Color("15"))
|
|
|
|
AgentActiveStyle = lipgloss.NewStyle().
|
|
Foreground(colorSuccess)
|
|
|
|
AgentIdleStyle = lipgloss.NewStyle().
|
|
Foreground(colorDim)
|
|
|
|
// Event stream styles
|
|
StreamPanelStyle = lipgloss.NewStyle().
|
|
Border(lipgloss.RoundedBorder()).
|
|
BorderForeground(colorDim).
|
|
Padding(0, 1)
|
|
|
|
TimestampStyle = lipgloss.NewStyle().
|
|
Foreground(colorDim)
|
|
|
|
EventCreateStyle = lipgloss.NewStyle().
|
|
Foreground(colorSuccess)
|
|
|
|
EventUpdateStyle = lipgloss.NewStyle().
|
|
Foreground(colorPrimary)
|
|
|
|
EventCompleteStyle = lipgloss.NewStyle().
|
|
Foreground(colorSuccess).
|
|
Bold(true)
|
|
|
|
EventFailStyle = lipgloss.NewStyle().
|
|
Foreground(colorError).
|
|
Bold(true)
|
|
|
|
EventDeleteStyle = lipgloss.NewStyle().
|
|
Foreground(colorWarning)
|
|
|
|
// Status bar styles
|
|
StatusBarStyle = lipgloss.NewStyle().
|
|
Background(lipgloss.Color("236")).
|
|
Foreground(colorDim).
|
|
Padding(0, 1)
|
|
|
|
HelpKeyStyle = lipgloss.NewStyle().
|
|
Foreground(colorHighlight).
|
|
Bold(true)
|
|
|
|
HelpDescStyle = lipgloss.NewStyle().
|
|
Foreground(colorDim)
|
|
|
|
// Focus indicator
|
|
FocusedBorderStyle = lipgloss.NewStyle().
|
|
Border(lipgloss.RoundedBorder()).
|
|
BorderForeground(colorPrimary).
|
|
Padding(0, 1)
|
|
|
|
// Role icons
|
|
RoleIcons = map[string]string{
|
|
"mayor": "🎩",
|
|
"witness": "👁",
|
|
"refinery": "🏭",
|
|
"crew": "👷",
|
|
"polecat": "😺",
|
|
"deacon": "🔔",
|
|
}
|
|
|
|
// Event symbols
|
|
EventSymbols = map[string]string{
|
|
"create": "+",
|
|
"update": "→",
|
|
"complete": "✓",
|
|
"fail": "✗",
|
|
"delete": "⊘",
|
|
"pin": "📌",
|
|
}
|
|
)
|