Development
Building
Plain go build produces a binary reporting dev as its version. Use the Makefile to embed a semantic version or cross-compile releases:
# TUI main binary and auth helper with the injected version
make build VERSION=v1.2.3
# Cross-compile all release binaries (macOS, Linux, Windows) to dist/ and generate SHA256SUMS
make dist VERSION=v1.2.3
# Equivalent plain builds (version reports "dev")
go build -o lazyteams .
go build -o lazyteams-auth ./cmd/auth-helper/Check the embedded version with:
./lazyteams --version
./lazyteams-auth --versionRunning
# First time: capture tokens (opens Firefox, login once)
./lazyteams-auth
# Run the TUI
./lazyteams
# Run the TUI with diagnostic mode enabled
./lazyteams --debug
# Renew tokens manually when expired
./lazyteams-auth --renew <token_type>
# View auth helper diagnostics interactively
./lazyteams-auth --renew <token_type> --show --debugTesting
The project uses the standard Go testing framework with automated GitHub Actions for Continuous Integration. The CI pipeline also runs security checks:
govulncheck— scans dependencies and the standard library for known vulnerabilities (none found on Go 1.26.6+).gitleaks— scans the full push range for accidentally committed secrets.
# Run all unit tests
go test ./...
# Run code vetting
go vet ./...Contributing
- Adhere to Single Responsibility Principle.
- No CGO or external dependencies unless strictly necessary.
- Keep UI layer separate from domain logic — use
tea.Cmdfor async operations.
Coding Standards
| Area | Convention |
|---|---|
| UI State Machine | Changes via Bubble Tea Update function |
| Input Validation | Network-sensitive inputs strictly validated |
| ANSI Styling | Use lipgloss exclusively |
| Concurrency | Buffered channels as semaphores for network calls |
| HTTP Client | All requests through internal/graph/client.go |
Dependencies
| Package | Version | Usage |
|---|---|---|
charmbracelet/bubbletea | v1.3.10 | TUI framework (Elm Architecture) |
charmbracelet/lipgloss | v1.1.0 | Terminal styles and layout |
charmbracelet/bubbles | (indirect) | UI components (viewport, textinput) |
playwright-go (mxschmitt/playwright-go) | v0.6100.0 | Browser automation (auth helper only) |
Release Process
Releases are tag-driven: CI builds, checksums and publishes the final binaries.
Update
go.modif dependencies changed.Validate and push the release tag:
bashmake release VERSION=v1.2.3This command automatically:
- Validates the version format (
vX.Y.Z). - Ensures your working directory has no uncommitted changes.
- Pushes both the current branch and the new tag to GitHub.
- Validates the version format (
The GitHub Actions release workflow cross-compiles all platforms via
make dist, writes theSHA256SUMS, and creates the GitHub Release with auto-generated notes (attaching the cross-compiled binaries for Linux, macOS, and Windows for both amd64 and arm64 architectures).