Commit f7b9c8a
Add theme system with 349 embedded themes and UI framework integration (#1764)
* Add theme system with 349 embedded themes and UI framework integration
Implement comprehensive theme system for Atmos CLI with 349 embedded terminal
themes from charmbracelet/vhs (MIT licensed), enabling users to customize the
appearance of all CLI output including markdown rendering, tables, log output,
and status messages.
Theme Architecture:
- Registry pattern for managing 349 embedded themes
- 16 ANSI colors → 30+ semantic color mappings (Primary, Success, Error, etc.)
- ColorScheme → StyleSet pipeline generates 50+ lipgloss styles
- Theme-aware Glamour markdown rendering
- Theme-aware charm/log styles with colored level badges
UI Framework Integration:
- Replaced hard-coded colors in pkg/ui/formatter.go with theme.GetCurrentStyles()
- Markdown rendering now uses theme.GetGlamourStyleForTheme()
- Removed obsolete generateStyleSet() and selectMarkdownStyle() functions
- Updated pkg/ui/interfaces.go to use theme.StyleSet
CLI Commands:
- atmos theme list [--recommended] - List available themes
- atmos theme show <name> - Preview theme with color palette and samples
- atmos list themes [--all] - Alias for theme list
Configuration:
- ATMOS_THEME env var (highest priority)
- THEME env var (fallback)
- settings.terminal.theme in atmos.yaml
- Default theme (lowest priority)
14 Recommended Themes:
default, Dracula, Catppuccin Mocha, Catppuccin Latte, Tokyo Night, Nord,
Gruvbox Dark, Gruvbox Light, GitHub Dark, GitHub Light, One Dark,
Solarized Dark, Solarized Light, Material
Deprecation:
- Added deprecation notices to legacy color constants in pkg/ui/theme/colors.go
- Provided migration guide from ColorGreen/ColorRed/etc to theme.GetCurrentStyles()
- Legacy Styles and Colors structs marked deprecated with examples
Test Coverage:
- 89.6% coverage for theme package (73 tests)
- Comprehensive tests for registry, schemes, styles, tables, log styles
- Integration tests for theme commands
- All UI framework tests pass
Claude Code Tooling:
- Added .claude/agents/tui-expert.md - Expert agent for theme system
- Added .claude/agents/README.md - Index of available agents
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <[email protected]>
* [autofix.ci] apply automated fixes
* test: regenerate CLI snapshots to include new theme command
Update help output snapshots to reflect the new 'theme' command added to
Atmos CLI. The theme command now appears in both the main help output and
the command list when an invalid command is provided.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <[email protected]>
* refactor: use ui.Write() for theme command output instead of fmt.Fprint
Replace direct stderr writes (fmt.Fprint(os.Stderr)) with ui.Write() calls
to follow Atmos I/O conventions. This ensures consistent output handling
across the CLI and respects the UI channel separation (stderr for UI,
stdout for data).
Changes:
- cmd/theme_list.go: Use ui.Write() for theme list output
- cmd/theme_show.go: Use ui.Write() for theme preview output
- cmd/list_themes.go: Use ui.Write() for theme list alias output
- Add pkg/ui import to all theme command files
- Remove os package import (no longer needed)
The theme implementation follows Atmos error handling best practices:
- Sentinel errors (ErrThemeNotFound, ErrInvalidTheme) defined in registry
- All errors wrapped with %w for proper error chains
- No string comparison on errors (tests use errors.Is pattern)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <[email protected]>
* docs: update TUI expert agent with UI package integration guidelines
Add comprehensive UI package integration section to the TUI expert agent,
documenting the proper use of ui.Success/Error/Warning/Info functions and
the separation between data channel (stdout) and UI channel (stderr).
Changes:
- Add UI Package Integration section with output function reference
- Document decision tree for choosing correct output method
- Add anti-patterns section showing incorrect approaches
- Include theme show command example explaining when to use lipgloss vs UI functions
- Add comment to theme_show.go explaining why it uses lipgloss directly
The theme show command is a preview/demo that intentionally uses lipgloss
styles directly to show what the theme looks like, rather than using
ui.Success/Error/etc for its output. This is the correct pattern for
preview commands.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <[email protected]>
* Fix TUI expert agent: correct data channel methods
- Change ui.Data().Write() → data.Write() from pkg/data package
- Add formatted UI variants: Successf, Errorf, Warningf, Infof
- Update decision tree to show correct package usage
- Fix anti-patterns to reference correct data package methods
The data channel uses IOLib methods from pkg/data, not ui.Data().
* Clarify ui.Markdown() vs ui.MarkdownMessage() usage
ui.Markdown() → stdout (data channel) for pipeable help/docs
ui.MarkdownMessage() → stderr (UI channel) for UI messages
Updated decision tree to make this distinction clearer.
* Add data.Markdown() for consistency with data channel contract
- Add data.Markdown() and data.Markdownf() functions
- Connect markdown rendering via data.SetMarkdownRenderer() in root.go
- Deprecate ui.Markdown() in favor of data.Markdown()
- Add comprehensive Logging vs UI Output guidance to TUI expert
- Update TUI expert examples to use data.Markdown()
- Fix errcheck warnings in theme commands (return ui.Write() errors)
- Disable function-length warning for CreateTable (62 lines, limit 60)
Key principles documented:
- Data channel (stdout) via pkg/data - pipeable output
- UI channel (stderr) via pkg/ui - human messages
- Log channel (side) via pkg/logger - technical details
- Default log level: warn (only warnings affecting current session)
- Can emit both UI messages and logs for same event
Contract: data.* → stdout, ui.* → stderr, log.* → side channel
* Remove incorrect deprecation notices from ui.Markdown()
ui.Markdown() and ui.Markdownf() are NOT deprecated - they're correctly
implemented to write to stdout (data channel). The functions are working
as intended for help text and documentation output.
No migration needed - these functions are the correct API.
* Refactor CreateTable to eliminate function-length linting issue
Break down 62-line CreateTable function into smaller, focused helpers:
- CreateTable (14 lines) - main coordinator
- applyTableBorders (16 lines) - border configuration logic
- applyBorderedStyle (3 lines) - full borders
- applyMinimalStyle (8 lines) - header separator only
- applyPlainStyle (7 lines) - no borders
- applyFullBorders (10 lines) - override borders
- applyTableStyle (14 lines) - style function application
Benefits:
- Each function has single responsibility
- More testable (can test border logic separately)
- Easier to understand and maintain
- Passes linting without disabling rules
- All existing tests pass
* Fix theme command issues and color scheme caching
- Fix case-sensitive theme comparison: use strings.EqualFold for Dracula vs dracula
- Remove 'theme set' from help examples (command not implemented)
- Fix typo: sourceElipsisLen → sourceEllipsisLen in cmd/list_themes.go
- Fix InitializeStyles color scheme caching:
- Add lastColorScheme variable to cache scheme
- Don't clear currentThemeName in InitializeStyles (retain manually-passed scheme)
- Update color getters to use cached scheme (avoid redundant unmarshalling)
- Cache scheme in all initialization paths
Fixes:
- Theme comparisons now work case-insensitively
- Color getters no longer redundantly unmarsh all JSON
- Manually-passed schemes are retained correctly
* Fix theme command edge cases and add defensive nil guards
- Add test for registry error path in scheme_test.go
- Documents expected behavior when NewRegistry fails
- Verifies nil scheme is returned on error
- Fix case-sensitive active theme indicators in cmd/theme_list.go
- Line 133: Use strings.EqualFold for active indicator (formatThemeRow)
- Line 214: Use strings.EqualFold for active indicator (formatSimpleThemeList)
- Now 'dracula' and 'Dracula' both show active indicator
- Add nil guard for config.Styles in pkg/ui/theme/table.go
- Prevents panic when config or config.Styles is nil
- Returns neutral style without TableHeader/TableRow inheritance
- Defensive programming for edge cases
All tests passing.
* Refactor theme commands for testability and increase test coverage
what
- Extracted theme business logic from cmd/ to pkg/ui/theme for testability
- Reduced theme_show.go from 397 lines to 42 lines (90% reduction)
- Reduced theme_list.go from 271 lines to 54 lines (80% reduction)
- Added comprehensive unit tests for pkg/data package
- Added unit tests for theme show and list functionality
- Improved overall test coverage significantly
- Removed obsolete cmd/list_themes_test.go (functionality moved to pkg)
why
- cmd/ files were difficult to test (0.96% coverage for theme_show.go)
- Business logic mixed with presentation logic violated separation of concerns
- Low test coverage (21.73% for pkg/data, <30% for theme commands)
- CodeCov patch coverage requirement is 80% minimum
references
- Follows architectural patterns from CLAUDE.md
- Implements testability best practices
- Addresses codecov coverage requirements
Coverage improvements:
- pkg/data: 21.73% → 95.6% (+73.87%)
- pkg/ui/theme: Combined coverage now 91.0%
- cmd/theme_show.go: Simplified to thin wrapper (42 lines)
- cmd/theme_list.go: Simplified to thin wrapper (54 lines)
Technical changes:
- Created pkg/ui/theme/show.go with ShowTheme() and helper functions
- Created pkg/ui/theme/list.go with ListThemes() and helper functions
- Added comprehensive tests in show_test.go and list_test.go
- Added tests for Markdown() and Markdownf() in data_test.go
- All business logic now testable without CLI infrastructure
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <[email protected]>
* Add test for registry error path in GetColorSchemeForTheme
what
- Added TestGetColorSchemeForTheme_RegistryError to verify error handling
- Test temporarily corrupts themesJSON to force LoadThemes() failure
- Uses defer to restore original themesJSON, preventing side effects
- Verifies error is returned and scheme is nil on failure
- Improved test coverage from 91.0% to 91.5%
why
- Previous test only documented expected behavior without testing it
- Error path was untested, leaving critical failure case unverified
- Need to ensure GetColorSchemeForTheme properly propagates errors
references
- Addresses code review feedback on scheme_test.go lines 127-171
- Follows testing best practices with proper cleanup in defer
- Uses require.Error and require.Nil for proper assertions
Technical approach:
- Temporarily replaces package-level themesJSON variable
- Forces json.Unmarshal to fail with invalid JSON
- Verifies error propagation through NewRegistry → GetColorSchemeForTheme
- Restores original state in defer to prevent test pollution
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <[email protected]>
* Add Self-Maintenance and Relevant PRDs sections to TUI expert agent
what
- Added Self-Maintenance section with dependency tracking and update process
- Added Relevant PRDs section with search/read/follow instructions
- Updated frontmatter model field from 'inherit' to 'sonnet'
- File size increased from 22KB to 25KB (still well under 40KB limit)
why
- Agent lacked self-maintenance capability (PRD requirement)
- No PRD awareness section with proper structure
- 'inherit' model field less explicit than 'sonnet'
- Addresses critical gaps identified in agent review
references
- Implements PRD requirements from docs/prd/claude-agent-architecture.md
- Follows agent-developer.md patterns for self-maintenance
- Addresses agent review feedback on tui-expert configuration
Technical changes:
- Self-Maintenance monitors: CLAUDE.md, pkg/ui/theme/, pkg/ui/, pkg/data/
- Update triggers: PRD changes, CLAUDE.md changes, theme refactors
- Update process includes user confirmation before changes
- Relevant PRDs section guides pattern discovery and adherence
- Search commands for finding theme/TUI/UI-related PRDs
File size: 22KB → 25KB (still under 40KB limit)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <[email protected]>
* Fix TUI expert agent to use correct ui.* and data.* methods
what
- Removed all incorrect fmt.Print*/fmt.Fprintln references
- Fixed to use ui.Write/ui.Writeln instead of fmt.Println
- Corrected markdown usage: ui.Markdown() not data.Markdown()
- Updated decision trees to show ui.Markdown for help/docs (stdout)
- Updated all code examples to use ui.Success/Error/Warning/Info
- Removed inappropriate Attribution section about Charmbracelet themes
- Clarified output channels in all examples and decision trees
why
- Agent was incorrectly teaching to use fmt.Println (anti-pattern)
- data.Markdown() doesn't exist - should be ui.Markdown()
- Attribution section was irrelevant to TUI expert role
- Examples showed old patterns instead of correct ui.* methods
- Confused developers about correct I/O channel usage
references
- CLAUDE.md I/O and UI Usage section
- pkg/ui/formatter.go ui.Markdown() implementation (line 80 writes to stdout)
- pkg/ui/*.go for correct UI method usage
Technical changes:
- Pattern 1 example: fmt.Println(styles.Success.Render()) → ui.Success()
- Task examples: fmt.Fprintln(os.Stderr, styles.*) → ui.Success/Error/Warning/Info()
- Decision tree: Added ui.Markdown() for formatted docs (stdout)
- Decision tree: Clarified ui.MarkdownMessage() for UI messages (stderr)
- Removed 11 lines of Attribution section about Charmbracelet
- Updated "Common Tasks" section to show correct patterns
File size: 25KB → 25KB (minor reduction from removing attribution)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <[email protected]>
* Remove icons from style.Render examples in TUI expert to avoid confusion
- Changed status message examples from icon-based to descriptive text
- Updated examples: 'Success' -> 'This is a success message'
- Added comment clarifying these are for demo/preview output only
- Reinforces that developers should use ui.Success/Error/etc for actual status
- Prevents confusion about manual icon usage vs automatic icon handling
* Fix theme tests to use actual theme names from registry
- Updated test data to use actual theme names that exist in themes.json
- Changed lowercase names (dracula, monokai) to proper case (Dracula, Material)
- Replaced non-existent themes (Nord, Solarized Dark) with existing ones (Catppuccin Mocha/Latte)
- Fixed log level assertion: ERRO → EROR (Charmbracelet log format)
- Fixed footer message test expectation: star note includes 'recommended' text
- All theme package tests now passing
* Use 4-character log level format: DEBU/INFO/WARN/ERRO/FATA
- Reverted to 4-character format for consistent alignment across all log levels
- DEBU (debug), INFO (info), WARN (warning), ERRO (error), FATA (fatal)
- All levels align to same width for cleaner terminal output
- Updated both color and no-color log styles
- Updated test expectations to match format
* Integrate theme-aware log styles into Atmos logger
- Logger now uses theme colors from configured theme (default, Dracula, etc.)
- Respects --no-color and NO_COLOR environment variable
- Log levels use themed background colors: DEBU, INFO, WARN, ERRO, FATA
- Fallback to default styles if theme loading fails
- TRCE level added for trace logging (matches DEBU style)
- Improves visual consistency between UI output and log messages
* Refactor theme commands to use command registry pattern
- Created cmd/theme/ package following version command structure
- Moved theme.go, theme_list.go, theme_show.go to cmd/theme/ directory
- Implemented ThemeCommandProvider for registry integration
- Added SetAtmosConfig() for dependency injection
- Added perf.Track() to list and show subcommands
- Updated root.go to import theme package and set config
- Removed direct RootCmd.AddCommand() calls in favor of registry
- Commands now organized: cmd/theme/theme.go (main), list.go, show.go
- Follows same pattern as cmd/version/ for consistency
* Add explicit invocation triggers to TUI expert agent
- Added 'Invoke when:' section to frontmatter with 8 specific scenarios
- Added 'Do NOT invoke for:' anti-patterns section
- Added comprehensive 'When to Invoke This Agent' section
- Specified proactive invocation triggers for Claude Code
- Listed code patterns that should trigger invocation (lipgloss.Color, fmt.Fprintf)
- Listed keywords that suggest TUI work (theme, color, styling, TUI)
- Added agent coordination guidance
- Updated 'Your Role' section to be more active and specific
- Follows agent-developer pattern for consistency
* Add explicit review/audit triggers to agent-developer invocation
- Added 'User asks to review, audit, or validate an existing agent'
- Added 'Agent invocation triggers are unclear or need clarification'
- Makes it clearer when to invoke agent-developer for agent reviews
- Addresses case where user asks to 'review' or 'confirm' agent instructions
* Regenerate snapshot for themed logger with 4-character log format
- Updated snapshot for atmos_describe_config_imports test
- Log format changed from 'DEBU' to ' DEBU ' (with padding)
- Reflects themed logger changes with consistent 4-character alignment
- All log levels now have consistent spacing for visual alignment
* Regenerate snapshots for themed logger format changes
- Updated atmos_describe_configuration snapshot
- Updated Valid_Log_Level_in_Config_File snapshot
- Both reflect log format change from 'DEBU' to ' DEBU ' (with padding)
- Consistent with themed logger 4-character alignment
* Regenerate all remaining snapshots for themed logger format
- Regenerated 8 additional test snapshots
- All reflect log format change from 'DEBU' to ' DEBU ' (with padding)
- Tests affected:
- Valid_Log_Level_in_Environment_Variable
- Valid_log_level_in_env_should_be_priortized_over_config
- Valid_log_level_in_flag_should_be_priortized_over_env_and_config
- Valid_log_file_in_env_should_be_priortized_over_config
- Valid_log_file_in_flag_should_be_priortized_over_env_and_config
- atmos_vendor_pull_using_SSH
- atmos_vendor_pull_component_using_SSH
- atmos_vendor_pull_with_custom_detector_and_handling_credentials_leakage
- Total: 11 snapshots regenerated for themed logger changes
* Force color output in theme log preview demo
- Added termenv import for color profile control
- Set logger color profile to TrueColor in GenerateLogDemo
- Fixes log output preview showing plain text instead of colored badges
- Log levels now display with theme-specific background colors:
- DEBU (cyan), INFO (purple), WARN (yellow), ERRO (red)
- Ensures 4-character log format (DEBU, INFO, WARN, ERRO) is visible
- Previously logged to buffer without colors due to non-TTY detection
* Fix log badge contrast with WCAG luminance calculation
Use WCAG relative luminance formula with sRGB gamma correction to
automatically choose black or white text color based on background
brightness. This ensures readable contrast for all theme colors.
- Add getContrastTextColor() function with WCAG formula
- Apply automatic contrast to all log level badges (DEBU, INFO, WARN, ERRO, FATA)
- Extract magic numbers to named constants for linter compliance
- Use existing intBitSize constant from show.go
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <[email protected]>
* Add newline after theme usage instructions
Fix missing newline causing debug logs to appear on the same line as
the YAML config output. Adds lineBreak after formatUsageInstructions()
to ensure proper spacing before subsequent log output.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <[email protected]>
* Condense TUI expert agent to meet size limit
Reduce tui-expert.md from 27,252 bytes to 23,818 bytes (12.6% reduction):
- Remove redundant "When to Invoke This Agent" section (covered in frontmatter)
- Condense "File Organization" from detailed tree structure to compact list
- Simplify "Self-Maintenance" section to essential info
Now under 25KB limit while preserving all critical guidance.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <[email protected]>
* Fix GitHub Action 404 error when updating PR comments
Add graceful error handling and fallback when updating existing PR
comments fails with 404 (comment may have been deleted):
- Add error handling with || fallback to create new comment
- Add debug output showing comment ID lookup result
- Prevents action failure when comment doesn't exist
This fixes the issue where the action tries to update a comment that
may have been deleted or doesn't exist, causing a 404 error.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <[email protected]>
* Fix nil pointer bugs and improve sRGB gamma calculation
**Nil pointer fixes:**
- Add nil-checks in applyBorderedStyle() and applyFullBorders()
- Fallback to config.BorderStyle when config.Styles is nil
- Prevents panic when table functions called without StyleSet
**sRGB gamma correction fix:**
- Replace incorrect squared-multiplication with proper math.Pow()
- Implement correct WCAG relative luminance formula: pow((v+0.055)/1.055, 2.4)
- Import math package for accurate gamma correction
**Test coverage improvements:**
- Add comprehensive unit tests for theme commands
- Test command structure, flags, and argument validation
- Test ThemeCommandProvider registry pattern
- Test SetAtmosConfig dependency injection
These fixes address code review feedback and improve code correctness.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <[email protected]>
* Improve GitHub Action comment formatting and messaging
Fix PR comment formatting issues and improve clarity:
**Formatting fixes:**
- Prefix file list items with `>` to keep them inside warning block
- Properly indent bash multiline string to satisfy YAML parser
- Ensure all content renders within warning callout
- Use $'\n' for newlines in bash strings
**Messaging improvements:**
- Change "compress" to "refactor" for better clarity
- Detect file type (CLAUDE.md vs agent files) from input patterns
- Dynamic titles: "CLAUDE.md Too Large" vs "Claude agent file Too Large"
- Dynamic action text based on what's being checked
- Clearer context about what files are being validated
**Example output:**
```markdown
> [!WARNING]
> #### Claude Agent Files Too Large
>
> The following modified Claude agent files exceed the **25000 byte** size limit:
> - `tui-expert.md`: **25014 bytes** (over by 14 bytes, ~0%)
>
> **Action needed:** Please refactor the oversized agent files. Consider:
```
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <[email protected]>
* Fix GitHub Action comment to match correct format
Move "Action needed" section outside warning block to match example:
- Warning block contains only: title, description, and file list
- Action needed and suggestions are regular text below the warning
- Removes `>` prefix from action items so they render outside admonition
**Correct format:**
```markdown
> [!WARNING]
> #### Claude Agent Files Too Large
>
> The following modified files exceed the **25000 byte** size limit:
> - `tui-expert.md`: **25014 bytes** (over by 14 bytes, ~0%)
**Action needed:** Please refactor the oversized agent files. Consider:
- Removing verbose explanations
- Consolidating redundant examples
```
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <[email protected]>
* Use embedded markdown for theme command examples
Follow Atmos convention of embedding usage examples from markdown files:
- Create cmd/theme/markdown/ directory with usage files
- Add atmos_theme_list_usage.md with list examples
- Add atmos_theme_show_usage.md with show examples
- Update list.go to use //go:embed for themeListUsage
- Update show.go to use //go:embed for themeShowUsage
This matches the pattern used by other commands (version, auth) and ensures
examples are properly formatted and maintainable.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <[email protected]>
* Add theme command documentation to website
Copy theme command documentation from research-themes branch and update
to match current implementation:
**Added documentation:**
- website/docs/cli/commands/theme/list.mdx - atmos theme list command
- website/docs/cli/commands/theme/show.mdx - atmos theme show command
- website/docs/cli/commands/list/themes.mdx - atmos list themes alias
**Updates from original:**
- Fix output table format to show "Rec" column instead of star indicator
- Update example outputs to match actual command output
- Clarify theme configuration options (env var vs atmos.yaml)
- Add proper column alignment in Terminal examples
Documentation includes:
- Usage examples and command syntax
- Flag descriptions
- Output format explanations
- Theme selection tips
- Related commands and cross-references
- Attribution and license information
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <[email protected]>
* docs: fix theme command documentation punctuation and default behavior
- Add missing period to terminal emulator projects line
- Clarify default behavior of theme list command
* STDIN
1 Add Conductor configuration for website development
2
3 - Add conductor.json with setup and run scripts for Docusaurus
4 - Fix Node.js compatibility in fetch-latest-release plugin
5 - Remove require('node-fetch') to use built-in fetch API
6 - Configure pnpm with --shamefully-hoist for dependency resolution
7
8 🤖 Generated with [Claude Code](https://claude.com/claude-code)
9
10 Co-Authored-By: Claude <[email protected]>
* STDIN
1 Add pnpm lock file for Conductor workspace setup
2
3 🤖 Generated with [Claude Code](https://claude.com/claude-code)
4
5 Co-Authored-By: Claude <[email protected]>
* Revert " STDIN"
This reverts commit cb35e35.
* STDIN
1 Add pnpm-lock.yaml to gitignore for Conductor workspaces
2
3 Project uses npm (package-lock.json), but Conductor workspaces
4 use pnpm for better performance. Ignore workspace-specific lock file.
5
6 🤖 Generated with [Claude Code](https://claude.com/claude-code)
7
8 Co-Authored-By: Claude <[email protected]>
* STDIN
1 docs: recommend pnpm over npm for website development
2
3 Update website README to recommend pnpm as the preferred package manager
4 for better performance and disk space efficiency. Include fallback
5 instructions for npm users.
6
7 🤖 Generated with [Claude Code](https://claude.com/claude-code)
8
9 Co-Authored-By: Claude <[email protected]>
* docs: add usage page for theme command
Create main usage page for the theme command that provides overview,
quick start guide, and configuration instructions. This fixes the
broken link when clicking the theme command in documentation.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <[email protected]>
* docs: add category config for theme command
Add _category_.json to enable proper navigation and linking for the
theme command documentation. This links the category to the usage page.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <[email protected]>
* docs: add theme commands to screengrab generation list
Add theme, theme list, and theme show commands to the demo-stacks.txt
file for screengrab generation. Screengrabs will be generated in CI.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <[email protected]>
* docs: improve theme command intro to emphasize customization
Update intro text to highlight personalization and make it more inviting.
Focus on making Atmos your own through theme customization.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <[email protected]>
* feat: copy themes.json to website static during build
Add prebuild script to copy themes.json from pkg/ui/theme/ to
website/static/ to serve theme data without duplication or symlinks.
The file is gitignored as it's generated during build.
This allows the website to fetch and display available themes
dynamically from the single source of truth.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <[email protected]>
* feat: add ThemeGallery component to display available themes
Create ThemeGallery component that:
- Fetches themes from /themes.json endpoint
- Displays theme cards with color palettes
- Shows theme metadata (dark/light, recommended)
- Provides copy-ready environment variable commands
- Supports filtering by recommended themes
Add gallery to theme usage page to showcase available themes
with visual previews and easy configuration.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <[email protected]>
* docs: standardize on pnpm and fix punctuation in website README
Remove npm fallback options and make pnpm the standard package manager.
Add trailing periods to all instruction lines for consistency.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <[email protected]>
* feat: add dedicated themes page with searchable gallery
Create a dedicated themes browse page with:
- Full-text search across theme names, types, authors, and colors
- Real-time filtering with result counts
- Brute-force search (e.g., 'dracula light' finds matches)
- Responsive search input with focus states
Move theme galleries from usage page to dedicated browse page to
avoid overwhelming the main command documentation.
Update ThemeGallery component to support optional search feature
controlled by 'searchable' prop.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <[email protected]>
* docs: reorganize theme documentation structure
Move configuration instructions from gallery page to usage page.
Add tip admonition on gallery page pointing to usage page for
configuration details.
This centralizes all usage/configuration documentation on the
usage page while keeping the gallery focused on browsing themes.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <[email protected]>
* docs: rename themes page to browse and update blog post
Rename /cli/commands/theme/themes to /cli/commands/theme/browse
for clearer URL structure.
Update blog post to mention theme gallery with link to browse
pre-configured themes with visual previews.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <[email protected]>
* STDIN
1 feat: Add color palette column to theme list command
2
3 Enhances `atmos theme list` command with a visual color palette preview, displaying 8 colored blocks representing each theme's color scheme (background, foreground, and main ANSI colors).
4
5 **Changes:**
6 - Added `formatColorPalette()` function to render colored blocks using lipgloss
7 - Updated table headers to include "Palette" column
8 - Updated `getCellStyle()` to handle the new palette column (index 3)
9 - Fixed TTY detection to use `IsTTYSupportForStderr()` since output goes to stderr via `ui.Write()`
10 - Updated non-TTY simple format to show "8 colors" placeholder
11
12 **Implementation:**
13 - Uses same 8-color selection as the web gallery component
14 - Renders colored Unicode block characters (█) with actual theme hex colors
15 - Gracefully degrades to text in non-TTY environments
16
17 This provides users with an at-a-glance preview of theme colors directly in the CLI, matching the visual experience of the theme browse page on the documentation site.
18
19 🤖 Generated with [Claude Code](https://claude.com/claude-code)
20
21 Co-Authored-By: Claude <[email protected]>
* STDIN
1 fix: Use background color for palette blocks to ensure visibility
2
3 Changes the color palette visualization from foreground-colored block characters (█) to background-colored spaces. This ensures all 8 color blocks are equally visible regardless of the theme colors.
4
5 **Problem:**
6 - Dark colors (like black) were invisible on dark terminal backgrounds
7 - Light colors (like white) were invisible on light terminal backgrounds
8 - Made some palettes appear to have fewer blocks than others
9
10 **Solution:**
11 - Use `Background()` instead of `Foreground()` for color application
12 - Render space character instead of block character (█)
13 - Every palette now shows exactly 8 equally-sized, equally-visible blocks
14
15 This matches standard color swatch behavior in design tools where you see the actual color fill.
16
17 🤖 Generated with [Claude Code](https://claude.com/claude-code)
18
19 Co-Authored-By: Claude <[email protected]>
* STDIN
1 Revert "fix: Use background color for palette blocks to ensure visibility"
2
3 This reverts commit 98479c014e7cc3c8bd3a1c25c4fb1ca42e65c18c.
4
5 The block character (█) with foreground color provides better visual appearance than background-colored spaces. While some dark/light colors may have reduced visibility on matching terminal backgrounds, this is acceptable and matches standard terminal color display behavior.
6
7 The color order remains consistent with the web gallery:
8 Background, Foreground, Red, Green, Yellow, Blue, Magenta, Cyan
9
10 🤖 Generated with [Claude Code](https://claude.com/claude-code)
11
12 Co-Authored-By: Claude <[email protected]>
* fix: Add extra space before star indicator for better visibility
Adds an additional space before the ★ character in theme names to improve visual spacing and ensure the star character renders at full size in the table.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <[email protected]>
* refactor: Move star indicator to status column instead of theme name
Moves the recommended theme indicator (★) from being appended to the theme name to being displayed in the first status column. This provides cleaner separation and better visual alignment.
**Changes:**
- Status column now shows: ">" for active theme, "★" for recommended theme, or empty
- Removed star suffix from theme names
- Updated table styling to apply special styling to status column for recommended themes
- Simplified non-TTY output by removing separate "Rec" column
- Updated `isRecommendedTheme()` to check status column instead of name suffix
**Benefits:**
- Cleaner theme names without suffixes
- Better visual alignment in table
- Star character renders at full size in dedicated column
- Consistent status indicator location
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <[email protected]>
* feat: Use green dot indicator for active theme
Replaces the ">" indicator with a green "●" (U+25CF BLACK CIRCLE) for the active theme, matching the style used in `atmos version list` for the current version.
**Changes:**
- Active theme now shows green "●" instead of ">"
- Uses lipgloss color "10" (green) for the dot in TTY mode
- Plain "●" in non-TTY mode
- Updated `isActiveRow()` to detect the dot character
**Benefits:**
- Consistent visual language across Atmos commands
- More visually distinct than ">"
- Green color immediately indicates "current/active" status
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <[email protected]>
* fix: Right-align status indicator column
Adds right alignment to the status indicator column (first column) to better position the active/recommended indicators (● and ★).
**Changes:**
- Added `.Align(lipgloss.Right)` to the status column base style
- Indicators now right-align within the column for better visual spacing
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <[email protected]>
* fix: Make status indicator column narrower
Reduces the status indicator column to minimal width (1 character) by removing extra spaces from the indicators. With right alignment, the indicators (● and ★) now sit closer to the theme names.
**Changes:**
- Removed trailing space from status indicators
- Changed simple format from 2-char to 1-char column width
- Indicators are just the character itself with right alignment handling spacing
**Result:**
- More compact table layout
- Better visual proximity between status indicator and theme name
- Consistent with version list table styling
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <[email protected]>
* refactor: Rename "default" theme to "atmos"
Renames the default theme from "default" to "atmos" for better branding and to position it near the top of alphabetically sorted theme lists.
**Changes:**
- Renamed theme in themes.json from "default" to "atmos"
- Updated RecommendedThemes list to use "atmos"
- Updated all fallback references to use "atmos" theme
- Updated registry validation to check for "atmos" theme
- Updated all test files to reference "atmos" instead of "default"
**Benefits:**
- Better brand alignment (Atmos native theme)
- Alphabetical sorting places it near the top of theme lists
- More descriptive name for the built-in theme
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <[email protected]>
* fix: Update atmos theme URL to atmos.tools
Changes the source URL for the atmos theme from cloudposse.com to atmos.tools for better product branding.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <[email protected]>
* feat: Add styling to theme list footer messages
Applies UI styling to the footer messages in theme list output:
- Theme count message uses Info style (cyan with ℹ icon)
- Active theme message uses Success style (green with ✓ icon)
**Changes:**
- Updated `buildFooterMessage()` to accept `styles` parameter
- Applied `styles.Info.Render()` to theme count message
- Applied `styles.Success.Render()` to active theme message
- Removed redundant `Footer` style wrapping since messages are now styled individually
**Result:**
More visually appealing footer with color-coded status information that matches the UI patterns used elsewhere in Atmos.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <[email protected]>
* fix: Use ui.Info() and ui.Success() for theme list footer
Properly uses the ui package functions for footer messages instead of theme styles:
- `ui.Info()` for theme count message (cyan ℹ icon)
- `ui.Success()` for active theme message (green ✓ icon)
**Changes:**
- Moved footer rendering from pkg/ui/theme to cmd/theme/list
- Added metadata fields to ListThemesResult (ThemeCount, ActiveTheme, ShowStars, RecommendedOnly)
- Removed buildFooterMessage function
- Footer now uses actual ui.Info() and ui.Success() methods
**Benefits:**
- Correct usage of ui package patterns
- Footer messages write directly to stderr with proper styling
- Consistent with other Atmos commands
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <[email protected]>
* [autofix.ci] apply automated fixes
* fix: Add spacing between theme list table and footer
Adds newline after table output to create proper spacing between the
table and footer messages (theme count and active theme).
**Before:**
Table rows ran directly into footer messages with no separation.
**After:**
Clean blank line separates table from info/success footer messages.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <[email protected]>
* refactor: Use themed style for active status indicator in theme list
Replaces hardcoded lipgloss.Color("10") with the theme's Selected style
for the active status indicator (●) in `atmos theme list`. This ensures
the indicator respects the configured theme and accessibility settings.
**Changes:**
- Removed hardcoded color from `formatThemeRow()` in list.go
- Status indicator now passes plain "●" character to table styling
- Table's `getActiveColumnStyle()` applies `styles.Selected` color via Inherit()
- Updated all tests to reflect new structure:
- Changed ">" to "●" for active indicator
- Updated column count from 4 to 5 (added palette column)
- Fixed row structure expectations in tests
- Removed `TestBuildFooterMessage` (footer moved to command level)
- Updated test data for "atmos" theme rename (was "default")
- Fixed URL expectations (https://atmos.tools)
- Corrected sort order expectations (case-insensitive)
**Behavior:**
- Active theme: Uses Selected style color (theme-aware)
- Recommended theme: Uses TableSpecial style (gold)
- Inactive theme: No color styling
- Gracefully handles nil styles with base styling fallback
This completes the refactor to ensure all terminal UI elements respect
the user's theme configuration and accessibility preferences.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <[email protected]>
* refactor: Extract UTF-8 icons to constants in theme package
Creates a centralized constants file for all UTF-8 terminal icons used
throughout the theme system. This improves maintainability, reduces
duplication, and makes it easier to locate and update icon usage.
**New file:**
- `pkg/ui/theme/icons.go` - Defines icon constants with documentation
**Icon constants:**
- IconActive ("●") - Active/selected item indicator
- IconRecommended ("★") - Recommended item indicator
- IconCheckmark ("✓") - Success/completion indicator
- IconXMark ("✗") - Error/failure indicator
- IconWarning ("⚠") - Warning indicator
- IconInfo ("ℹ") - Information indicator
- IconColorBlock ("█") - Color palette block character
**Updated files:**
- cmd/theme/list.go - Use IconRecommended for footer message
- pkg/ui/theme/colors.go - Use IconCheckmark in deprecated Styles
- pkg/ui/theme/list.go - Use icons for status indicators and palette
- pkg/ui/theme/show.go - Use IconRecommended for recommended badge
- pkg/ui/theme/styles.go - Use IconCheckmark and IconXMark
- pkg/ui/theme/table.go - Use icons for row detection functions
- All test files - Use icon constants instead of literals
**Benefits:**
- Single source of truth for icon definitions
- Easy to update all icon usage across codebase
- Improved code documentation with icon descriptions
- Better IDE autocomplete and type safety
- Consistent icon usage throughout theme system
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <[email protected]>
* docs: Add blog post about terminal themes
Creates a blog post introducing the terminal theme system in Atmos,
including how to browse, preview, and configure themes.
**Content:**
- Overview of what themes are and how they work
- Links to theme gallery for browsing 350+ available themes
- Basic usage examples (list, show, configure)
- Configuration options (atmos.yaml and environment variables)
- Links to complete documentation
**Style:**
- Concise and informative without hyperbole
- Focuses on practical usage and getting started
- Includes direct links to relevant documentation pages
- Matches existing blog post format and tone
This provides users with a clear introduction to the theme system
and easy access to the theme gallery and documentation.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <[email protected]>
* docs: Remove theme system from zero-config blog post
Removes the theme system mention from the "What's Next" section of the
zero-config terminal output blog post, since themes now have their own
dedicated blog post (2025-11-08-terminal-themes.mdx).
**Changes:**
- Removed theme system bullet point from "What's Next" section
- Kept other future enhancements (progress bars, prompts, spinners)
This keeps each blog post focused on a single topic and avoids
duplication between the zero-config I/O post and the dedicated
themes post.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <[email protected]>
* [autofix.ci] apply automated fixes
* refactor: Break down GetStyles function into smaller helpers
Extracts complex nested struct initialization from GetStyles into 7 focused helper functions:
- getTableHeaderStyle() - Table header styling
- getTableActiveStyle() - Active row styling
- getBorderStyle() - Border styling
- getPagerStyles() - Pager component styles
- getTUIStyles() - TUI component styles
- getDiffStyles() - Diff/output styles
- getHelpStyles() - Help/documentation styles
This improves readability and removes the need for function length lint suppressions.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <[email protected]>
* docs: Enhance ListThemesOptions doc comment
Improves the documentation for ListThemesOptions to clearly explain:
- What the type configures (which themes to display and how to mark them)
- RecommendedOnly field: filters to show only recommended themes
- ActiveTheme field: specifies which theme to highlight as active
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <[email protected]>
* fix: Scan all cells for recommended theme indicator
Changes isRecommendedTheme to check all cells in rowData instead of only the first column. This correctly detects the IconRecommended marker regardless of which column it appears in.
Previously used strings.HasPrefix on rowData[0], which would miss the marker when appended to other columns like the theme name.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <[email protected]>
* docs: Enhance documentation for ListThemesResult and TableStyle types
Add comprehensive Go doc comments for exported types to satisfy project
documentation guidelines and linter requirements.
- ListThemesResult: Expanded comment to describe all fields including
output string, error, theme count, active theme, star visibility,
and recommended-only flag
- TableStyle: Enhanced comment to explain the three supported table
design styles (bordered, minimal, plain)
Both comments now follow the mandatory style: start with type name,
end with periods, and provide clear descriptions of purpose and usage.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <[email protected]>
* updates
---------
Co-authored-by: Claude <[email protected]>
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
Co-authored-by: Claude (via Conductor) <[email protected]>
Co-authored-by: aknysh <[email protected]>1 parent 1d84eab commit f7b9c8a
File tree
73 files changed
+18603
-360
lines changed- .claude/agents
- .github/actions/check-claude-md-size
- cmd
- theme
- markdown
- demo/screengrabs
- pkg
- config
- data
- schema
- ui
- theme
- tests/snapshots
- website
- blog
- docs/cli/commands
- list
- theme
- plugins/fetch-latest-release
- src/components/ThemeGallery
- static
Some content is hidden
Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
73 files changed
+18603
-360
lines changed| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
11 | 11 | | |
12 | 12 | | |
13 | 13 | | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
14 | 20 | | |
15 | 21 | | |
16 | 22 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
5 | 5 | | |
6 | 6 | | |
7 | 7 | | |
| 8 | + | |
8 | 9 | | |
9 | 10 | | |
10 | 11 | | |
| 12 | + | |
11 | 13 | | |
12 | 14 | | |
13 | 15 | | |
| |||
0 commit comments