Recent Runs:
- Root cause: zone markers add ~2 visible chars inside panelStyle.Width(),
causing any line at exactly innerW to wrap into two rows
- Fix: build plain text to safeW=innerW-4, hard-cap with rune slice before
applying color; drop mode column (color already conveys status)
Server Detail:
- Root cause: padANSI(nameStr+icon, nameW) breaks when Nerd Font icon renders
2 cols but lipgloss measures it as 1, pushing the state badge to the next line
- Fix: label:value layout — each row is independent; Name on row 1, then
State/Group side-by-side on row 2, Drift row 3, Error row 4, findings hint row 5
- Group info restored in right column of State row
Fleet Summary compliance results:
- Root cause: padRight(pb, innerW-14) expanded the label to ~95 chars, pushing
status to the far right edge and off-screen on narrower terminals
- Fix: truncate pb to innerW/3, then "name: status" — compact, always visible
- Removed icon from status text (the isolated X far right was confusing per UX)
Sidebar:
- Collapsed mode (w=8): icon + 3-char abbreviation (SRV/JOB/CFG) so tabs
are always readable regardless of Nerd Font rendering quality
- Expanded mode (w=20): icon + full label
- Update sidebar width tests (6→8, 18→20)
- Update server detail test: Group label IS shown in the 2-column layout
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Recent Runs: fix selection highlight causing a blank line by dropping
runSelectedBg.Width(innerW) in favour of colorStyle.Background(colorSelected);
dynamically size playbook column to fit innerW so lines never wrap
- Panel alignment: pad renderServersPanel and renderRecentRunsPanel content
to exactly (h-2) lines before rendering so both columns reach the same
height regardless of data volume
- Run Details log: render findings as a structured STATUS/HOST/TASK/DETAIL
table in the scrollable viewport; fall back to raw log if no findings
- Fleet Summary: spread the four stat badges evenly across the full panel
width using per-badge cell centering; remove blank line between header
and badges; make topH dynamic (5 → grows with compliance results)
- Server Detail: 2-column layout — name+state badge on row 1, drift
count+group on row 2; group info added back now space is used properly
- Sidebar: increase collapsed/expanded widths (4→6, 14→18); center icons
in collapsed mode for better visual weight; change Servers icon to
nf-fa-sitemap (distinct from hamburger bars)
- Tests: update sidebarWidth expectations to match new widths
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Phase 1 — Layout: remove paths from title bar (moved to Config tab); fold
Scan Results panel into Fleet Summary with live compliance progress; fix
panel misalignment by removing free-floating status bar; simplify Server
Detail to name/drift/error only; redesign Recent Runs to 1-line-per-run
RAG-colored rows sorted by descending run number; add full command line to
Run Details screen.
Phase 2 — Mouse (bubblezone v1.0.0): replace coordinate-math hit-testing
with zone.Mark()/zone.Get().InBounds() for server rows, run rows, sidebar
tabs, and hamburger toggle. Double-click on a run opens details.
Phase 3 — Icons & sidebar: add iconSet struct with Icons singleton and
Get(name) dynamic lookup; Nerd Font glyphs for all actions; collapsed
sidebar shows tab icons only, expanded shows icon+label; m key or mouse
click on hamburger toggles; footer hints updated with icons.
Phase 4 — Config tab: show PlaybookDir and InventoryPath at top.
Tests: 21 UI tests covering truncate edge cases, fleet counts, group
sorting, icon dispatch, drift icons, sidebar width, menu toggle key,
fleet summary compliance display, title bar paths removal, server detail
field removal, recent runs format, seq numbering, and style uniqueness.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Builds on initial v1 with: compliance job scheduling and result tracking,
structured run history with findings/log storage, host-level drift details
view, git-backed playbook/inventory support, and comprehensive test coverage
across all packages.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Keyboard-first Go TUI for homelab Ansible management built with
Bubble Tea, Bubbles, and Lip Gloss.
Screens: home (server table + recent runs), add/edit server form,
4-step check/apply wizard with live output streaming, and run
details log viewer.
Packages:
- internal/config — config.yaml persistence
- internal/inventory — YAML Ansible inventory CRUD
- internal/playbooks — playbook directory discovery
- internal/ansible — argv construction + PLAY RECAP parsing
- internal/history — JSON run records and log files
- internal/runner — streaming exec via io.Pipe
- internal/ui — full Bubble Tea UI with mouse support
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>