Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Generate Bubble Tea (Go) TUI application structure with models, commands, and views using the Elm architecture.
.claude/skills/a5c-ai-bubble-tea-scaffolder/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-05 | ✓→✓ | = Same ✓ | -20% | 0% |
| case-01 | ✗→✗ | = Same ✗ | 32% | 0% |
| case-02 | ✗→✗ | = Same ✗ | -30% | 0% |
| case-03 | ✗→✗ | = Same ✗ | -14% | 0% |
| case-04 | ✗→✗ | = Same ✗ | 178% | 0% |
Generate Bubble Tea TUI applications with Go and Elm architecture.
Invoke this skill when you need to:
| Parameter | Type | Required | Description | |-----------|------|----------|-------------| | projectName | string | Yes | Project name | | modulePath | string | Yes | Go module path | | components | array | No | Component definitions |
gopackage main import ( "fmt" "os" tea "github.com/charmbracelet/bubbletea" ) func main() { p := tea.NewProgram(initialModel(), tea.WithAltScreen()) if _, err := p.Run(); err != nil { fmt.Printf("Error: %v", err) os.Exit(1) } }
gopackage main import ( "github.com/charmbracelet/bubbles/list" "github.com/charmbracelet/bubbles/textinput" tea "github.com/charmbracelet/bubbletea" "github.com/charmbracelet/lipgloss" ) type model struct { list list.Model textInput textinput.Model err error quitting bool } func initialModel() model { ti := textinput.New() ti.Placeholder = "Enter search term..." ti.Focus() items := []list.Item{ item{title: "Option 1", desc: "First option"}, item{title: "Option 2", desc: "Second option"}, } l := list.New(items, list.NewDefaultDelegate(), 0, 0) l.Title = "Select an option" return model{ textInput: ti, list: l, } } func (m model) Init() tea.Cmd { return textinput.Blink } func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { switch msg := msg.(type) { case tea.KeyMsg: switch msg.String() { case "ctrl+c", "q": m.quitting = true return m, tea.Quit case "enter": // Handle selection return m, nil } case tea.WindowSizeMsg: m.list.SetSize(msg.Width, msg.Height-4) } var cmd tea.Cmd m.list, cmd = m.list.Update(msg) return m, cmd } func (m model) View() string { if m.quitting { return "Goodbye!\n" } return lipgloss.JoinVertical( lipgloss.Left, m.textInput.View(), m.list.View(), ) }
gopackage main type item struct { title string desc string } func (i item) Title() string { return i.title } func (i item) Description() string { return i.desc } func (i item) FilterValue() string { return i.title }
gopackage main import "github.com/charmbracelet/lipgloss" var ( titleStyle = lipgloss.NewStyle(). Bold(true). Foreground(lipgloss.Color("205")). MarginBottom(1) selectedStyle = lipgloss.NewStyle(). Foreground(lipgloss.Color("170")). Bold(true) normalStyle = lipgloss.NewStyle(). Foreground(lipgloss.Color("252")) helpStyle = lipgloss.NewStyle(). Foreground(lipgloss.Color("241")) )
gorequire ( github.com/charmbracelet/bubbletea v0.25.0 github.com/charmbracelet/bubbles v0.17.0 github.com/charmbracelet/lipgloss v0.9.0 )
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 18,488 | 18,655 | +1% | 1 | 1 | 0% | 4,188 | 5,510 | +32% | 0 | 0 | — |
case-02 | fail→fail | 11,416 | 3,074 | -73% | 1 | 1 | 0% | 2,326 | 1,633 | -30% | 0 | 0 | — |
case-03 | fail→fail | 9,824 | 3,331 | -66% | 1 | 1 | 0% | 2,022 | 1,738 | -14% | 0 | 0 | — |
case-04 | fail→fail | 2,946 | 2,040 | -31% | 1 | 1 | 0% | 500 | 1,389 | +178% | 0 | 0 | — |
case-05 | pass→pass | 11,675 | 4,550 | -61% | 1 | 1 | 0% | 2,325 | 1,871 | -20% | 0 | 0 | — |
case-06 | fail→fail | 14,499 | 5,192 | -64% | 1 | 1 | 0% | 2,272 | 2,014 | -11% | 0 | 0 | — |
case-07 | fail→fail | 5,947 | 5,244 | -12% | 1 | 1 | 0% | 1,176 | 1,991 | +69% | 0 | 0 | — |
case-08 | fail→fail | 10,263 | 4,084 | -60% | 1 | 1 | 0% | 2,074 | 1,854 | -11% | 0 | 0 | — |
case-09 | fail→fail | 4,525 | 4,275 | -6% | 1 | 1 | 0% | 890 | 1,759 | +98% | 0 | 0 | — |
case-10 | fail→fail | 3,274 | 3,071 | -6% | 1 | 1 | 0% | 579 | 1,654 | +186% | 0 | 0 | — |
case-11 | fail→fail | 8,719 | 4,700 | -46% | 1 | 1 | 0% | 1,839 | 2,068 | +12% | 0 | 0 | — |
case-12 | fail→fail | 9,778 | 6,060 | -38% | 1 | 1 | 0% | 2,004 | 2,326 | +16% | 0 | 0 | — |
case-13 | fail→fail | 4,681 | 2,899 | -38% | 1 | 1 | 0% | 992 | 1,609 | +62% | 0 | 0 | — |
case-14 | fail→fail | 8,263 | 3,658 | -56% | 1 | 1 | 0% | 1,658 | 1,768 | +7% | 0 | 0 | — |
case-15 | fail→fail | 11,647 | 6,416 | -45% | 1 | 1 | 0% | 2,372 | 2,330 | -2% | 0 | 0 | — |
case-16 | fail→fail | 13,251 | 7,605 | -43% | 1 | 1 | 0% | 2,395 | 2,483 | +4% | 0 | 0 | — |
case-17 | fail→fail | 3,352 | 3,429 | +2% | 1 | 1 | 0% | 633 | 1,673 | +164% | 0 | 0 | — |
case-18 | fail→fail | 12,570 | 10,290 | -18% | 1 | 1 | 0% | 2,653 | 3,469 | +31% | 0 | 0 | — |
case-19 | fail→fail | 7,466 | 6,992 | -6% | 1 | 1 | 0% | 1,451 | 2,309 | +59% | 0 | 0 | — |
case-20 | fail→fail | 9,080 | 7,218 | -21% | 1 | 1 | 0% | 2,105 | 2,549 | +21% | 0 | 0 | — |
case-21 | fail→fail | 4,586 | 3,293 | -28% | 1 | 1 | 0% | 877 | 1,684 | +92% | 0 | 0 | — |
case-22 | fail→fail | 5,354 | 2,112 | -61% | 1 | 1 | 0% | 837 | 1,405 | +68% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of -100 percentage points is the difference between those two pass rates over the 22 comparable cases. 1 case got worse with the skill loaded, and it is included in that figure.
Other measured skills in the registry, with their headline benchmark lift.