bubble-tea-scaffolder — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited bubble-tea-scaffolder (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
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 |
package 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)
}
}package 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(),
)
}package 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 }package 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"))
)require (
github.com/charmbracelet/bubbletea v0.25.0
github.com/charmbracelet/bubbles v0.17.0
github.com/charmbracelet/lipgloss v0.9.0
)~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.