deepagents-architectur…
Guides architectural decisions for Deep Agents applications. Use when deciding between Deep Agents vs alternatives, choosing backend strategies, designing…
Reviews BubbleTea TUI code for proper Elm architecture, model/update/view patterns, and Lipgloss styling. Use when reviewing terminal UI code using charmbracelet/bubbletea.
$ npx -y skills add existential-birds/beagle --skill bubbletea-code-review --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/bubbletea-code-reviewContext preview
The summary Claude sees to decide when to auto-load this skill.
Reviews BubbleTea TUI code for proper Elm architecture, model/update/view patterns, and Lipgloss styling. Use when reviewing terminal UI code using charmbracelet/bubbletea.
name: bubbletea-code-review description: Reviews BubbleTea TUI code for proper Elm architecture, model/update/view patterns, and Lipgloss styling. Use when reviewing terminal UI code using charmbracelet/bubbletea.
Advance only when each **pass condition** is objectively true (reduces false positives on `tea.Cmd` and unsubstantiated blocking claims):
| Gate | Pass condition | |------|----------------| | **G1 — Anti–false-positive** | You skimmed **NOT Issues** below **or** read [references/elm-architecture.md](references/elm-architecture.md) **before** recording a finding about `tea.Cmd` returns, value receivers on `Update`, or nested child `Update`. | | **G2 — Evidence for blocking / suspicious I/O** | Each Critical/Major finding names **file path + line** (or a short quoted snippet) showing the blocking call, `huh.Form.Run` in the wrong place, or other asserted anti-pattern—not a hypothetical. | | **G3 — Verification** | Before publishing review output, you applied the **[review-verification-protocol](../review-verification-protocol/SKILL.md)** to each proposed finding. |
| Issue Type | Reference | |------------|-----------| | Elm architecture, tea.Cmd as data | [references/elm-architecture.md](references/elm-architecture.md) | | Model state, message handling | [references/model-update.md](references/model-update.md) | | View rendering, Lipgloss styling | [references/view-styling.md](references/view-styling.md) | | Component composition, Huh forms | [references/composition.md](references/composition.md) | | Bubbles components (list, table, etc.) | [references/bubbles-components.md](references/bubbles-components.md) |
**Read [elm-architecture.md](references/elm-architecture.md) first!** The most common review mistake is flagging correct patterns as bugs.
| Pattern | Why It's Correct | |---------|------------------| | `return m, m.loadData()` | `tea.Cmd` is returned immediately; runtime executes async | | Value receiver on `Update()` | Standard BubbleTea pattern; model returned by value | | Nested `m.child, cmd = m.child.Update(msg)` | Normal component composition | | Helper functions returning `tea.Cmd` | Creates command descriptor, no I/O in Update | | `tea.Batch(cmd1, cmd2)` | Commands execute concurrently by runtime |
| Pattern | Why It's Wrong | |---------|----------------| | `os.ReadFile()` in Update | Blocks UI thread | | `http.Get()` in Update | Network I/O blocks | | `time.Sleep()` in Update | Freezes UI | | `<-channel` in Update (blocking) | May block indefinitely | | `huh.Form.Run()` in Update | Blocking call |
// BAD - mutates model
func (m Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
m.items = append(m.items, newItem) // mutation!
return m, nil
}
// GOOD - returns new model
func (m Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
newItems := make([]Item, len(m.items)+1)
copy(newItems, m.items)
newItems[len(m.items)] = newItem
m.items = newItems
return m, nil
}// BAD - blocking in Update
func (m Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
data, _ := os.ReadFile("config.json") // blocks UI!
m.config = parse(data)
return m, nil
}
// GOOD - use commands
func (m Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
return m, loadConfigCmd()
}
func loadConfigCmd() tea.Cmd {
return func() tea.Msg {
data, err := os.ReadFile("config.json")
if err != nil {
return errMsg{err}
}
return configLoadedMsg{parse(data)}
}
}// BAD - creates new style each render
func (m Model) View() string {
style := lipgloss.NewStyle().Bold(true).Foreground(lipgloss.Color("205"))
return style.Render("Hello")
}
// GOOD - define styles at package level or in model
var titleStyle = lipgloss.NewStyle().Bold(true).Foreground(lipgloss.Color("205"))
func (m Model) View() string {
return titleStyle.Render("Hello")
}1. Is Update() free of blocking I/O? (NOT: "is the cmd helper blocking?") 2. Is the model immutable in Update? 3. Are Lipgloss styles defined once, not in View? 4. Is WindowSizeMsg handled for resizing? 5. Are key bindings documented with help.KeyMap? 6. Are Bubbles components sized correctly?
Image: NASA, Public Domain. Source Beagle is an Agent Skills marketplace: framework-aware code review, documentation, testing, architectural analysis, and git workflows for any compatible coding agent.
Repo: existential-birds/beagle
Guides architectural decisions for Deep Agents applications. Use when deciding between Deep Agents vs alternatives, choosing backend strategies, designing…
Reviews Deep Agents code for bugs, anti-patterns, and improvements. Use when reviewing code that uses create_deep_agent, backends, subagents, middleware, or…
Implements agents using Deep Agents. Use when building agents with create_deep_agent, configuring backends, defining subagents, adding middleware, or setting…
Guides architectural decisions for LangGraph applications. Use when deciding between LangGraph vs alternatives, choosing state management strategies, designing…
Reviews LangGraph code for bugs, anti-patterns, and improvements. Use when reviewing code that uses StateGraph, nodes, edges, checkpointing, or other LangGraph…
Implements stateful agent graphs using LangGraph. Use when building graphs, adding nodes/edges, defining state schemas, implementing checkpointing, handling…