deepagents-architectur…
Guides architectural decisions for Deep Agents applications. Use when deciding between Deep Agents vs alternatives, choosing…
Reviews BubbleTea TUI code for proper Elm architecture, model/update/view patterns, and Lipgloss styling. Use when reviewing terminal UI code using charmbracelet/bubbletea.
Claude Code
$ npx -y skills add existential-birds/beagle --skill bubbletea-code-review --agent claude-code
Codex
$ npx skills add existential-birds/beagle --skill bubbletea-code-review -a codex -y
Cursor
$ npx skills add existential-birds/beagle --skill bubbletea-code-review -a cursor -y
Gemini CLI
$ npx skills add existential-birds/beagle --skill bubbletea-code-review -a gemini-cli -y
GitHub Copilot
$ npx skills add existential-birds/beagle --skill bubbletea-code-review -a github-copilot -y
OpenCode
$ npx skills add existential-birds/beagle --skill bubbletea-code-review -a opencode -y
Windsurf
$ npx skills add existential-birds/beagle --skill bubbletea-code-review -a windsurf -y
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.
Guides architectural decisions for Deep Agents applications. Use when deciding between Deep Agents vs alternatives, choosing…
Reviews Deep Agents code for bugs, anti-patterns, and improvements. Use when reviewing code that uses create_deep_agent,…
Implements agents using Deep Agents. Use when building agents with create_deep_agent, configuring backends, defining subagents,…
Guides architectural decisions for LangGraph applications. Use when deciding between LangGraph vs alternatives, choosing state…
Reviews LangGraph code for bugs, anti-patterns, and improvements. Use when reviewing code that uses StateGraph, nodes, edges,…
Implements stateful agent graphs using LangGraph. Use when building graphs, adding nodes/edges, defining state schemas,…
You MUST use this before any creative work - creating features, building components, adding functionality, modifying behavior, or…
Ask which skill or flow fits your situation. A router over the skills in this repo.