feat: initial scaffold and generator

- Complete project structure with directories for all target platforms
- Template system for CLI tools with color placeholder replacement
- Working generator that processes templates for 6 theme variants
- GitHub workflows for build, snapshots, commitlint, and cli-verify
- Installer and verifier scripts for CLI tool deployment
- Comprehensive documentation and specifications
- Biome 2.x linting and formatting setup
- Husky git hooks for pre-commit validation
This commit is contained in:
2025-09-05 23:06:12 +03:00
commit 11baabe545
53 changed files with 2890 additions and 0 deletions

2
.github/CODEOWNERS vendored Normal file
View File

@@ -0,0 +1,2 @@
# Global code ownership
* @ivuorinen

40
.github/workflows/build.yml vendored Normal file
View File

@@ -0,0 +1,40 @@
name: Build
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm'
- name: Install dependencies
run: npm ci
- name: Lint code
run: npm run lint
- name: Generate themes
run: npm run generate
- name: Validate output
run: npm run validate
- name: Check for uncommitted changes
run: |
if ! git diff --quiet; then
echo "Generated files have uncommitted changes!"
git diff
exit 1
fi

37
.github/workflows/cli-verify.yml vendored Normal file
View File

@@ -0,0 +1,37 @@
name: CLI Verify
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
cli-verify:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm'
- name: Install dependencies
run: npm ci
- name: Generate themes
run: npm run generate
- name: Run installer
run: |
export HOME=$(mktemp -d)
./cli/install.sh
- name: Run verifier
run: |
export HOME=$(mktemp -d)
./cli/install.sh
ENGINE=docker ./verify/verify.sh

26
.github/workflows/commitlint.yml vendored Normal file
View File

@@ -0,0 +1,26 @@
name: Commitlint
on:
pull_request:
branches: [ main ]
jobs:
commitlint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm'
- name: Install dependencies
run: npm ci
- name: Lint commit messages
run: npx commitlint --from HEAD~${{ github.event.pull_request.commits }} --to HEAD --verbose

40
.github/workflows/snapshots.yml vendored Normal file
View File

@@ -0,0 +1,40 @@
name: Snapshots
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
snapshots:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm'
- name: Install dependencies
run: npm ci
- name: Install Playwright browsers
run: npx playwright install --with-deps
- name: Generate themes
run: npm run generate
- name: Run Playwright tests
run: npm run snapshots
- name: Upload snapshots
uses: actions/upload-artifact@v4
if: failure()
with:
name: playwright-report
path: playwright-report/
retention-days: 30

49
.gitignore vendored Normal file
View File

@@ -0,0 +1,49 @@
# Dependencies
node_modules/
npm-debug.log*
package-lock.json
# Generated files (tracked for now, may exclude later)
# terminals/
# cli/*/!(template.txt|README.md)
# editors/*/!(README.md)
# web/css/everforest.css
# Build artifacts
dist/
build/
.cache/
# Testing
coverage/
.nyc_output/
test-results/
playwright-report/
# IDE
.vscode/
.idea/
*.swp
*.swo
# OS
.DS_Store
.DS_Store?
._*
.Spotlight-V100
.Trashes
ehthumbs.db
Thumbs.db
# Logs
*.log
logs/
# Runtime
.env
.env.local
.env.*.local
# Temporary files
*.tmp
*.temp

1
.husky/commit-msg Executable file
View File

@@ -0,0 +1 @@
npx --no -- commitlint --edit ${1}

4
.husky/pre-commit Executable file
View File

@@ -0,0 +1,4 @@
npm run lint:fix
npm run generate
npm run validate
git add .

1
.serena/.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
/cache

View File

@@ -0,0 +1,123 @@
# Architecture Deep Dive - Everforest Resources
## Core Generator Architecture
### EverforestGenerator Class
Located in `scripts/generate-themes.mjs`, this is the heart of the system:
```javascript
class EverforestGenerator {
constructor() {
this.palette = null; // Loaded from palettes/everforest.json
}
// Key methods:
async loadPalette() // Loads JSON palette definition
async processTemplate() // Processes template.txt with placeholders
getColorsForVariant() // Maps palette to color variables
async generateAll() // Main entry point - generates all variants
async generateVariant() // Processes single variant
}
```
### Template Processing System
1. **Template Files**: Each CLI tool has `template.txt` in its directory
2. **Placeholders**: `{{bg}}`, `{{fg}}`, `{{red}}`, etc. replaced with actual colors
3. **Variant Processing**: Generates 6 versions (dark/light × hard/medium/soft)
4. **Output Generation**: Creates final config files from processed templates
### Palette Structure
```json
{
"variants": {
"dark": { "hard": {...}, "medium": {...}, "soft": {...} },
"light": { "hard": {...}, "medium": {...}, "soft": {...} }
},
"accents": { "red": "#e67e80", "orange": "#e69875", ... },
"grays": { "dark": {...}, "light": {...} }
}
```
## Supported Tools & Platforms
### CLI Tools (24+ supported)
- **System Monitors**: btop, bottom, glances, neofetch, htop
- **File Management**: ranger, lf, mc, LS_COLORS, eza/exa
- **Git Tools**: lazygit, gitui, tig, delta
- **Search & Processing**: ripgrep, fzf, fd, jq, bat
- **Shell & Productivity**: starship, zsh, fish, tmux, less
- **Modern Utils**: zoxide, atuin
### Editors (5 types)
- **Neovim**: Lua module with setup() function
- **VS Code**: JSON themes + package.json
- **JetBrains**: Unified .icls files (IntelliJ, WebStorm, PyCharm, etc.)
- **Zed**: JSON theme files
- **Sublime Text**: .sublime-color-scheme files
### Terminals
- WezTerm, Alacritty, Kitty, Windows Terminal, Ghostty
## Color Philosophy
### ANSI vs Hex Usage
- **CLI Tools**: ANSI-16 SGR codes only (no raw hex)
- **GUI Applications**: Hex values allowed (from generator only)
- **Consistent Mapping**: Same semantic colors across all tools
### Theme Variants
- **Dark**: hard/medium/soft (different background intensities)
- **Light**: hard/medium/soft (different background intensities)
- **Fallback**: Medium variant if specific not available
## File Structure Pattern
```
cli/
starship/
template.txt # Template with {{color}} placeholders
starship.toml # Generated output (never edit directly)
README.md # Tool-specific documentation
fish/
colors-template.txt # Multiple templates for complex tools
prompt-template.txt
tide-template.txt
everforest-*.fish # Generated variants
README.md
```
## Development Patterns
### Generator Extension
To add new CLI tool:
1. Create `cli/newtool/template.txt`
2. Add processing logic to generator
3. Update installer and verifier
4. Add to documentation
### Template Design
- Use semantic color names: `{{bg}}` not `{{color1}}`
- Include tool-specific syntax
- Test with all 6 variants
- Follow tool's native config format
### Error Handling
- Graceful failures with descriptive messages
- Exit codes for CI integration
- Emoji-prefixed console output for visibility
## CI/CD Integration
### Required Checks
1. **build**: Generator runs successfully
2. **snapshots**: Web demo renders correctly
3. **commitlint**: Conventional commit format
4. **cli-verify**: Generated configs work in container
### Validation Pipeline
1. Palette structure validation
2. Template processing verification
3. No raw hex in CLI configs
4. All variants present
5. File structure compliance

View File

@@ -0,0 +1,139 @@
# Code Style & Conventions - Everforest Resources
## JavaScript/Node.js Style
### Module System
- **ES Modules**: All files use `.mjs` extension
- **Imports**: Use ES6 import/export syntax
- **Type**: `"type": "module"` in package.json
### Biome Configuration
The project uses **Biome 2.x** for linting and formatting with these settings:
- **Version**: 2.2.3 (latest)
- **Indent**: 2 spaces
- **Line width**: 100 characters
- **Quotes**: Single quotes for JavaScript, double for JSX
- **Semicolons**: Always required
- **Trailing commas**: ES5 style
- **Arrow parentheses**: As needed
### Class Structure
```javascript
class EverforestGenerator {
constructor() {
this.palette = null;
}
async methodName() {
// Async/await preferred over Promises
}
}
```
### Naming Conventions
- **Classes**: PascalCase (`EverforestGenerator`)
- **Methods**: camelCase (`loadPalette`, `processTemplate`)
- **Constants**: camelCase for most, UPPER_SNAKE_CASE for true constants
- **Files**: kebab-case (`generate-themes.mjs`)
### Error Handling
- Use try-catch blocks for async operations
- Log errors with emoji prefixes: `console.error('❌ Failed to load palette')`
- Exit with code 1 on critical errors: `process.exit(1)`
### Console Output
- Use emoji for visual feedback:
- ✅ Success messages
- ❌ Error messages
- 🎨 Starting operations
- 📝 Progress updates
- ✨ Completion messages
### Code Quality Rules
- **Variables**: Use `const` by default, `let` when reassignment needed
- **Functions**: Prefer arrow functions for callbacks
- **Imports**: Organize imports automatically with Biome
- **Unused Variables**: Not allowed (error level)
- **Block Statements**: Always use braces for control structures
- **forEach**: Allowed for side effects (useIterableCallbackReturn disabled)
## Template System Conventions
### Placeholder Format
- Use double curly braces: `{{colorName}}`
- Available placeholders: `{{bg}}`, `{{fg}}`, `{{red}}`, `{{orange}}`, `{{yellow}}`, `{{green}}`, `{{aqua}}`, `{{blue}}`, `{{purple}}`, `{{gray1}}`, `{{gray2}}`, `{{gray3}}`
### Template Files
- Named `template.txt` in each tool directory
- Multiple templates for complex tools (e.g., `colors-template.txt`, `prompt-template.txt`)
- Never edit generated output files directly
## Documentation Style
### Code Comments
- Use JSDoc-style comments for classes and methods
- Include purpose and architecture notes at file top
- Explain complex logic inline
### Markdown
- **Critical Rule**: Use indented code blocks only (4 spaces)
- Never use triple backticks (```)
- Use emoji in headers and lists for visual hierarchy
## Git Conventions
### Commit Messages
- Follow Conventional Commits format
- Examples:
- `feat: add starship theme generator`
- `fix: correct color mapping in templates`
- `docs: update CLI installation guide`
### Branch Strategy
- Main branch: `main`
- All CI checks must pass for merge
- Required checks: lint + build + snapshots + commitlint + cli-verify
## File Organization
### Directory Structure
```
palettes/ # Color definitions (JSON/YAML)
scripts/ # Generator and validation scripts
cli/ # CLI tool templates and configs
editors/ # Editor theme files
terminals/ # Terminal configurations
web/ # CSS and demo files
docs/ # Documentation
meta/ # Project specifications
biome.json # Biome 2.x configuration
```
### File Naming
- Scripts: `kebab-case.mjs`
- Configs: Tool-specific conventions
- Templates: `template.txt` or `tool-template.txt`
### Biome File Processing
Biome processes these files:
- JavaScript modules: `scripts/**/*.mjs`, `scripts/**/*.js`
- JSON files: `*.json`
- Root level JS files: `*.mjs`, `*.js`
Biome ignores:
- Generated output files
- Node modules and build artifacts
- Unknown file types (by default)
## Development Commands
```bash
# Format code
npm run format # Format all files with Biome 2.x
# Lint code
npm run lint # Check for issues
npm run lint:fix # Auto-fix issues
# Before committing
npm run lint:fix && npm run format
```

View File

@@ -0,0 +1,47 @@
# Everforest Resources - Project Overview
## Purpose
The **everforest-resources** repository is an unofficial hub for Everforest color scheme resources. It generates theme files, configurations, and color schemes for terminals, CLI tools, and editors from canonical palette definitions.
## Key Philosophy
- **Generator-first approach**: All outputs are generated from `palettes/everforest.json`
- **Template system**: Uses `template.txt` files with color placeholders (e.g., `{{bg}}`, `{{fg}}`, `{{red}}`)
- **No manual editing**: Generated artifacts must never be hand-edited
- **Comprehensive coverage**: Supports 24+ CLI tools, 5+ editors, multiple terminals
## Tech Stack
- **Runtime**: Node.js with ES modules (type: "module")
- **Language**: JavaScript (.mjs files)
- **Code Quality**: Biome 2.2.3 for linting and formatting
- **Testing**: Playwright for web snapshots (when implemented)
- **CI/CD**: Husky for git hooks, conventional commits
- **Package Management**: npm
## Core Architecture
- **Palette**: JSON definitions with 6 variants (dark/light × hard/medium/soft)
- **Generator**: `EverforestGenerator` class processes templates and generates themes
- **Templates**: Color placeholder system for consistent theming
- **Output**: Generates configs for terminals, CLI tools, editors, and web
## Target Platforms
- **Terminals**: WezTerm, Alacritty, Kitty, Windows Terminal, Ghostty
- **CLI Tools**: 24+ tools including btop, lazygit, starship, fzf, ripgrep
- **Editors**: Neovim, VS Code, JetBrains IDEs, Zed, Sublime Text
- **Web**: CSS variables with media queries
## Development Status
- ✅ Project structure and specifications complete
- ✅ Basic generator scaffold implemented
- ✅ Biome 2.x linting and formatting integrated and working
- ✅ Code quality pipeline working (lint → generate → validate)
- ✅ Latest tooling versions (Biome 2.2.3)
- ⏳ Full template processing implementation pending
- ⏳ CLI tool generators pending
- ⏳ Editor theme generators pending
- ⏳ Playwright web tests pending
## Quality Assurance
- **Biome 2.x**: All JavaScript code passes linting and formatting with latest version
- **Validation**: Generator outputs validated for structure and compliance
- **CI Pipeline**: Automated checks for code quality and generation consistency
- **Modern Tooling**: Using latest stable versions of all development tools

View File

@@ -0,0 +1,97 @@
# Suggested Commands - Everforest Resources
## Core Development Commands
### Theme Generation
```bash
npm run generate # Generate all theme files from palettes
node scripts/generate-themes.mjs # Direct generator execution
```
### Code Quality & Linting
```bash
npm run lint # Check code with Biome linter
npm run lint:fix # Auto-fix linting issues with Biome
npm run format # Format code with Biome
npm run validate # Validate generated outputs and structure
npm run ci # Full CI suite: lint + generate + validate + snapshots
```
### Testing
```bash
npm run snapshots # Generate Playwright web snapshots
playwright test # Direct Playwright execution
```
### Git & Setup
```bash
npm run prepare # Install Husky git hooks
npm install # Install dependencies
```
### Alternative Commands (Makefile - when implemented)
```bash
make generate # Alternative to npm run generate
make validate # Alternative to npm run validate
make ci # Alternative to npm run ci
make snapshots # Generate web snapshots
make demo # Run web demo server
```
## Installation & Deployment
```bash
./cli/install.sh # Deploy all configs to ~/.config (when implemented)
ENGINE=docker ./verify/verify.sh # Verify in container (when implemented)
```
## Development Workflow Commands
```bash
# 1. Edit palette or templates
vim palettes/everforest.json
vim cli/starship/template.txt
# 2. Lint and format code
npm run lint:fix # Fix any linting issues
npm run format # Ensure consistent formatting
# 3. Generate themes
npm run generate
# 4. Validate output
npm run validate
# 5. Test web components
npm run snapshots
# 6. Full CI check
npm run ci
# 7. Commit changes
git add -A
git commit -m "feat: update starship theme colors"
```
## Biome Commands
```bash
biome check . # Check all files for issues
biome check . --write # Auto-fix issues
biome format . --write # Format all supported files
biome lint . # Lint JavaScript/TypeScript files
```
## System Commands (macOS/Darwin)
```bash
# File operations
ls -la # List files with details
find . -name "*.mjs" # Find JavaScript modules
grep -r "template" . # Search for template references
# Directory navigation
pwd # Current directory
cd scripts/ # Change to scripts directory
# Git operations
git status # Check git status
git log --oneline # View commit history
git diff # View changes
```

View File

@@ -0,0 +1,141 @@
# Task Completion Checklist - Everforest Resources
## When a Development Task is Completed
### 1. Code Quality Checks
```bash
# Lint and format code first
npm run lint:fix # Auto-fix any linting issues
npm run format # Ensure consistent formatting
# Generate themes from updated templates/palettes
npm run generate
# Validate all outputs
npm run validate
# Check for any errors or warnings
# All validation must pass before proceeding
```
### 2. Testing Requirements
```bash
# Run Playwright snapshots (for web changes)
npm run snapshots
# Full CI pipeline (includes linting)
npm run ci
# Verify no errors in any step
```
### 3. File Verification
- **Never commit generated files without running generator**
- **Always commit palette + template + generated files together**
- Check that all 6 variants are generated (dark/light × hard/medium/soft)
- Ensure code passes Biome linting and formatting
### 4. Documentation Updates
- Update relevant README or docs if adding new tools
- Ensure all examples use indented code blocks (4 spaces)
- Never use triple backticks in documentation
- Run `npm run format` to ensure consistent formatting
### 5. Git Workflow
```bash
# Check status
git status
# Lint and format before committing
npm run lint:fix
npm run format
# Stage all changes (palette + template + generated)
git add -A
# Commit with conventional format
git commit -m "feat: add new CLI tool theme"
# or
git commit -m "fix: correct color mapping in starship"
# or
git commit -m "docs: update installation guide"
# Push changes
git push
```
### 6. CI/CD Requirements
All these checks must pass in CI before merge:
-**lint**: Biome linting and formatting checks
-**build**: Generator + validation
-**snapshots**: Playwright demo renders
-**commitlint**: Conventional Commits enforcement
-**cli-verify**: Install + verify generated configs
### 7. Critical Rules Verification
- [ ] Code passes Biome linting (no errors)
- [ ] Code is properly formatted with Biome
- [ ] No raw hex values in CLI configs (ANSI only)
- [ ] All generated files come from templates/palettes
- [ ] No manual edits to generated files
- [ ] Template placeholders used correctly
- [ ] All 6 theme variants present where applicable
### 8. Special Considerations
#### For New CLI Tools
- Create `template.txt` with proper placeholders
- Add to generator processing logic
- Update installer script
- Add to verifier container
- Document in appropriate README
- Ensure any new JS/MJS files follow Biome style
#### For Palette Changes
- Regenerate ALL theme files
- Verify no breaking changes in output formats
- Test web demo still renders correctly
- Check that ANSI mappings remain valid
#### For Template Updates
- Test with all 6 variants
- Verify placeholder replacement works
- Check output format matches tool expectations
#### For JavaScript/Code Changes
- Run `npm run lint:fix` to auto-fix issues
- Run `npm run format` for consistent formatting
- Ensure imports are organized correctly
- Follow established naming conventions
### 9. Before Pushing
```bash
# Final verification with full CI
npm run ci
# If all passes, ready to push
git push origin main
```
## Emergency Fixes
If CI fails after push:
1. Check error logs in GitHub Actions
2. For linting errors: `npm run lint:fix` locally
3. For generation errors: `rm -rf generated/ && npm run generate`
4. Fix locally with proper workflow above
5. Push fix immediately
## Biome-Specific Troubleshooting
```bash
# Check what Biome would fix
npm run lint
# Auto-fix all fixable issues
npm run lint:fix
# Format all files
npm run format
# Check specific file
biome check scripts/generate-themes.mjs
```

67
.serena/project.yml Normal file
View File

@@ -0,0 +1,67 @@
# language of the project (csharp, python, rust, java, typescript, go, cpp, or ruby)
# * For C, use cpp
# * For JavaScript, use typescript
# Special requirements:
# * csharp: Requires the presence of a .sln file in the project folder.
language: typescript
# whether to use the project's gitignore file to ignore files
# Added on 2025-04-07
ignore_all_files_in_gitignore: true
# list of additional paths to ignore
# same syntax as gitignore, so you can use * and **
# Was previously called `ignored_dirs`, please update your config if you are using that.
# Added (renamed) on 2025-04-07
ignored_paths: []
# whether the project is in read-only mode
# If set to true, all editing tools will be disabled and attempts to use them will result in an error
# Added on 2025-04-18
read_only: false
# list of tool names to exclude. We recommend not excluding any tools, see the readme for more details.
# Below is the complete list of tools for convenience.
# To make sure you have the latest list of tools, and to view their descriptions,
# execute `uv run scripts/print_tool_overview.py`.
#
# * `activate_project`: Activates a project by name.
# * `check_onboarding_performed`: Checks whether project onboarding was already performed.
# * `create_text_file`: Creates/overwrites a file in the project directory.
# * `delete_lines`: Deletes a range of lines within a file.
# * `delete_memory`: Deletes a memory from Serena's project-specific memory store.
# * `execute_shell_command`: Executes a shell command.
# * `find_referencing_code_snippets`: Finds code snippets in which the symbol at the given location is referenced.
# * `find_referencing_symbols`: Finds symbols that reference the symbol at the given location (optionally filtered by type).
# * `find_symbol`: Performs a global (or local) search for symbols with/containing a given name/substring (optionally filtered by type).
# * `get_current_config`: Prints the current configuration of the agent, including the active and available projects, tools, contexts, and modes.
# * `get_symbols_overview`: Gets an overview of the top-level symbols defined in a given file.
# * `initial_instructions`: Gets the initial instructions for the current project.
# Should only be used in settings where the system prompt cannot be set,
# e.g. in clients you have no control over, like Claude Desktop.
# * `insert_after_symbol`: Inserts content after the end of the definition of a given symbol.
# * `insert_at_line`: Inserts content at a given line in a file.
# * `insert_before_symbol`: Inserts content before the beginning of the definition of a given symbol.
# * `list_dir`: Lists files and directories in the given directory (optionally with recursion).
# * `list_memories`: Lists memories in Serena's project-specific memory store.
# * `onboarding`: Performs onboarding (identifying the project structure and essential tasks, e.g. for testing or building).
# * `prepare_for_new_conversation`: Provides instructions for preparing for a new conversation (in order to continue with the necessary context).
# * `read_file`: Reads a file within the project directory.
# * `read_memory`: Reads the memory with the given name from Serena's project-specific memory store.
# * `remove_project`: Removes a project from the Serena configuration.
# * `replace_lines`: Replaces a range of lines within a file with new content.
# * `replace_symbol_body`: Replaces the full definition of a symbol.
# * `restart_language_server`: Restarts the language server, may be necessary when edits not through Serena happen.
# * `search_for_pattern`: Performs a search for a pattern in the project.
# * `summarize_changes`: Provides instructions for summarizing the changes made to the codebase.
# * `switch_modes`: Activates modes by providing a list of their names
# * `think_about_collected_information`: Thinking tool for pondering the completeness of collected information.
# * `think_about_task_adherence`: Thinking tool for determining whether the agent is still on track with the current task.
# * `think_about_whether_you_are_done`: Thinking tool for determining whether the task is truly completed.
# * `write_memory`: Writes a named memory (for future reference) to Serena's project-specific memory store.
excluded_tools: []
# initial prompt for the project. It will always be given to the LLM upon activating the project
# (contrary to the memories, which are loaded on demand).
initial_prompt: ""
project_name: "everforest-resources"

167
AGENTS.md Normal file
View File

@@ -0,0 +1,167 @@
# Everforest Resources — Specification
This document consolidates all gathered knowledge for the github.com/ivuorinen/everforest-resources repository. It is the authoritative spec for implementation. All instructions SHALL be followed strictly. LLM AGENTS SHALL NOT DEVIATE FROM THE THEME SPEC.
## 1. Philosophy
- This repository is the unofficial hub for Everforest resources.
- All outputs are generator-first, derived strictly from palettes/everforest.(json|yaml).
- Template system: CLI tools use template.txt files with color placeholders (e.g., {{bg}}, {{fg}}, {{red}}) that are replaced by the generator.
- CLI tools and prompts use ANSI-16 SGR codes only. No raw hex or 256-color indices.
- GUI/editor themes may use hex values but only those emitted by the generator.
- Generated artifacts MUST NOT be hand-edited.
## 2. Theme Variants
- Variants: dark/light × hard/medium/soft.
- If a variant is missing, fallback to medium.
- All variants MUST be present for terminals, CLI tools, editors, and web.
## 3. Repository Layout
- palettes/: canonical Everforest palette definitions (json/yaml).
- scripts/: generator scripts (Node.js, mjs modules).
- terminals/: WezTerm, Alacritty, Kitty, Windows Terminal, Ghostty.
- web/: CSS vars, demo with Playwright snapshot tests.
- cli/: all cli tools and prompts.
- editors/: all IDEs and editors.
- docs/: CLI.md and other documentation.
- verify/: container verifier.
- .github/: workflows, CODEOWNERS.
## 4. CLI Tools
- LS_COLORS: archives → bold yellow (orange), images → purple, docs → blue.
- dircolors: generated alongside LS_COLORS.
- eza/exa: export EXA_COLORS/EZA_COLORS.
- ripgrep: ripgreprc with ANSI mappings.
- fzf: FZF_DEFAULT_OPTS snippet with Everforest accents.
- delta: git-delta config with ANSI mapping.
- bat: minimal config forwarding to terminal theme.
- htop: htoprc with color_scheme=0.
- starship: starship.toml with Everforest accent mappings.
- zsh: Pure and Powerlevel10k presets.
- fish: color schemes, minimal prompt, Tide preset.
- tmux: everforest.tmux.conf with ANSI mappings.
- btop: modern htop alternative with color customization.
- bottom: cross-platform system monitor with color themes.
- glances: system monitoring tool with color themes.
- neofetch: system information display with color support.
- ranger: terminal file manager with color scheme support.
- lf: lightweight file manager (ranger alternative).
- mc: Midnight Commander with theme support.
- lazygit: terminal UI for git with theme support.
- gitui: terminal UI for git with color customization.
- tig: text-mode git interface with color customization.
- fd: find alternative with color output.
- jq: JSON processor with syntax highlighting.
- less: pager with color support via LESS_TERMCAP.
- zoxide: smart cd command with prompt integration.
- atuin: shell history with TUI theming.
## 5. Editors
- Neovim minimal:
- Lua module everforest_minimal.lua.
- Accepts setup({ variant, contrast }).
- Applies highlights from palette tokens.
- VS Code:
- Generated themes for all six variants.
- package.json scaffold.
- Extension can be launched in Dev Host.
- JetBrains (unified):
- Single .icls theme files for all variants.
- Compatible with IntelliJ, WebStorm, PyCharm, CLion, GoLand, PHPStorm, Rider.
- Zed:
- JSON theme files for all six variants.
- Sublime Text:
- .sublime-color-scheme files for all six variants.
## 6. Web
- CSS vars with media queries.
- Playwright snapshots in CI for dark/light × hard/medium/soft.
## 7. Installer
- cli/install.sh deploys all configs under ~/.config.
- Symlinks or copies files for shells, tools, editors unless file already exists.
- If file already exists, check if it is an Everforest config.
- If it is, overwrite with new version.
- Also loads dircolors automatically if available.
## 8. Verifier
- verify/verify.sh builds a Debian container with all cli tools.
- Sources and validates all generated configs.
- CI job cli-verify runs installer + verifier.
## 9. CI/CD
- build: generator + validation.
- snapshots: Playwright demo renders, upload PNGs.
- commitlint: Conventional Commits enforcement.
- cli-verify: install + verify generated configs.
- Branch protection requires build + snapshots + commitlint + cli-verify.
## 10. Contributing
- Edit only palettes/everforest.(json|yaml) and template.txt files.
- Templates use placeholders: {{bg}}, {{fg}}, {{red}}, {{orange}}, {{yellow}}, {{green}}, {{aqua}}, {{blue}}, {{purple}}, {{gray1}}, {{gray2}}, {{gray3}}.
- Run npm run generate and commit both palette + template + generated files.
- Pre-commit hooks block raw hex and enforce regeneration.
- LLM AGENTS SHALL NOT DEVIATE FROM THE THEME SPEC.
TL;DR (README section)
1. Edit only palettes and templates.
2. Run generate.
3. Commit palette + template + generated.
4. CI must pass build + snapshots + verify.
CODEOWNERS
`* @ivuorinen`
CONTRIBUTING.md rules
- Never hardcode hex outside palettes.
- Do not hand-edit generated files.
- Edit templates using color placeholders only.
- Add new targets by extending generator.
- Commit style: Conventional Commits.
- PR checklist: palette/template edits, regenerated, validated, snapshots included.
## 11. Makefile
Convenience targets:
generate → npm run generate
validate → npm run validate
ci → npm run ci
install-lscolors → copy LS_COLORS snippet
demo → run web demo server
snapshots → run Playwright snapshots
## 12. Docs `docs/CLI.md`
### Everforest CLI
Contains overview of terminals, web, CLI tools, prompts, editors.
Install with ./cli/install.sh
Verify with ENGINE=docker ./verify/verify.sh
Notes:
LLM AGENTS SHALL NOT DEVIATE FROM THE THEME SPEC. Use palettes or ANSI names. No raw hex.
## 13. Release Checklist
- Tag version (start v0.1.0).
- Ensure build, snapshots, verify all pass.
- Package VS Code extension (vsix).
- Announce as unofficial Everforest resource hub.
## 14. Enforcement
- Indented code blocks MUST be used in all docs.
- No triple backticks allowed.
- All new contributions MUST follow this spec exactly.

155
CLAUDE.md Normal file
View File

@@ -0,0 +1,155 @@
# CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
## Project Overview
This is the **everforest-resources** repository - an unofficial hub for Everforest color scheme resources. The project follows a **generator-first** approach where all theme files, configurations, and outputs are generated from canonical palette definitions.
**Critical Rule**: LLM AGENTS SHALL NOT DEVIATE FROM THE THEME SPEC. All changes must strictly follow the specification in AGENTS.md.
## Architecture
### Core Philosophy
- **Generator-first**: All outputs derive from `palettes/everforest.(json|yaml)`
- **Template system**: CLI tools use `template.txt` files with color placeholders (e.g., `{{bg}}`, `{{fg}}`, `{{red}}`) that are replaced by the generator
- **No manual edits**: Generated artifacts MUST NOT be hand-edited
- **ANSI-only for CLI**: CLI tools use ANSI-16 SGR codes only, never raw hex
- **Hex for GUI**: GUI/editor themes may use hex values but only from generator output
### Repository Structure
- `palettes/`: Canonical Everforest palette definitions (JSON/YAML)
- `scripts/`: Generator scripts (Node.js .mjs modules)
- `terminals/`: Terminal configs (WezTerm, Alacritty, Kitty, Windows Terminal, Ghostty)
- `web/`: CSS variables and demo with Playwright snapshots
- `cli/`: CLI tool configs (LS_COLORS, dircolors, eza, ripgrep, fzf, delta, bat, htop, starship, zsh, fish, tmux, btop, bottom, glances, neofetch, ranger, lf, mc, lazygit, gitui, tig, fd, jq, less, zoxide, atuin)
- `editors/`: Editor themes (Neovim minimal Lua, VS Code, JetBrains unified, Zed, Sublime Text)
- `docs/`: Documentation (CLI.md)
- `verify/`: Container verifier
- `.github/`: Workflows and CODEOWNERS
### Theme Variants
- Six variants total: dark/light × hard/medium/soft
- If variant missing, fallback to medium
- All variants MUST be present for terminals, CLI tools, editors, web
## Development Commands
Core development commands for the project:
npm run lint # Check code with Biome linter
npm run lint:fix # Auto-fix linting issues with Biome
npm run format # Format code with Biome
npm run generate # Generate all theme files from palettes
npm run validate # Validate generated outputs
npm run ci # Run full CI suite (lint + generate + validate + snapshots)
npm run snapshots # Generate Playwright snapshots
make generate # Alternative to npm run generate
make validate # Alternative to npm run validate
make ci # Alternative to npm run ci
make install-lscolors # Copy LS_COLORS snippet
make demo # Run web demo server
make snapshots # Run Playwright snapshots
## Installation and Verification
./cli/install.sh # Deploy all configs to ~/.config
ENGINE=docker ./verify/verify.sh # Verify in container
## Implementation Guidelines
### Editing Rules
1. **Only edit palette and template files**: Changes should only be made to `palettes/everforest.(json|yaml)` and `template.txt` files
2. **Template placeholders**: Use `{{bg}}`, `{{fg}}`, `{{red}}`, `{{orange}}`, `{{yellow}}`, `{{green}}`, `{{aqua}}`, `{{blue}}`, `{{purple}}`, `{{gray1}}`, `{{gray2}}`, `{{gray3}}`
3. **Never hand-edit outputs**: All generated files are regenerated automatically
4. **Run generator after changes**: Always regenerate after palette or template modifications
5. **Commit all sources**: Include palette, template, and generated files in commits
### Code Quality
- **Biome linting**: All JavaScript code must pass Biome linting and formatting
- **Auto-formatting**: Use `npm run format` to ensure consistent code style
- **No raw hex in CLI configs**: Use ANSI color names/codes only
- **Use indented code blocks**: Never use triple backticks in documentation
- **Follow conventional commits**: All commits must follow conventional commit format
- **Pre-commit validation**: Pre-commit hooks prevent raw hex and enforce regeneration
### Generator Architecture
The main generator (`scripts/generate-themes.mjs`) implements:
- Palette loader for JSON/YAML
- Template processor: reads `template.txt` files and replaces placeholders with palette values
- Writers for each target (terminals, CLI tools, editors, web)
- Variant generation (all 6 variants where applicable)
- ANSI mapping for CLI tools
- Hex output for GUI applications
### CLI Tool Specifications
- **LS_COLORS**: Archives→bold yellow, images→purple, docs→blue
- **ripgrep**: ripgreprc with ANSI mappings
- **fzf**: FZF_DEFAULT_OPTS with Everforest accents
- **delta**: git-delta config with ANSI mapping
- **bat**: Minimal config forwarding to terminal theme
- **htop**: htoprc with color_scheme=0
- **starship**: starship.toml with accent mappings
- **fish**: Color schemes + minimal prompt + Tide preset
- **tmux**: everforest.tmux.conf with ANSI mappings
- **btop**: Modern htop alternative with extensive color customization
- **bottom**: Cross-platform system monitor (Rust) with color themes
- **glances**: System monitoring tool with color themes
- **neofetch**: System information display with color support
- **ranger**: Terminal file manager with color scheme support
- **lf**: Lightweight file manager (ranger alternative)
- **mc**: Midnight Commander with theme support
- **lazygit**: Terminal UI for git with theme support
- **gitui**: Terminal UI for git with color customization
- **tig**: Text-mode git interface with color customization
- **fd**: Find alternative with color output
- **jq**: JSON processor with syntax highlighting
- **less**: Pager with color support via LESS_TERMCAP
- **zoxide**: Smart cd command with prompt integration
- **atuin**: Shell history with TUI theming
## CI/CD Pipeline
Required checks (all must pass for merge):
- **lint**: Biome linting and formatting checks
- **build**: Generator + validation
- **snapshots**: Playwright demo renders
- **commitlint**: Conventional Commits enforcement
- **cli-verify**: Install + verify generated configs
## Contributing Workflow
1. Edit only `palettes/everforest.(json|yaml)` and `template.txt` files
2. Use template placeholders: `{{bg}}`, `{{fg}}`, `{{red}}`, `{{orange}}`, `{{yellow}}`, `{{green}}`, `{{aqua}}`, `{{blue}}`, `{{purple}}`, `{{gray1}}`, `{{gray2}}`, `{{gray3}}`
3. Lint and format code: `npm run lint:fix && npm run format`
4. Run `npm run generate` (when implemented)
5. Commit palette + template + generated files
6. Ensure all CI checks pass
7. Follow conventional commit format
## Documentation Rules
- **Indented code blocks only**: Never use triple backticks (```)
- **Examples use 4-space indentation**
- **Generator-derived content**: Don't document what can be discovered from files
- **Focus on architecture**: Document high-level patterns requiring multiple files to understand
## Current Status
The repository is in initial development phase:
- ✅ Palette definitions created
- ✅ Comprehensive specification written
- ⏳ Generator implementation pending
- ⏳ File structure creation pending
- ⏳ CI/CD setup pending
Follow the implementation steps in `meta/implementation-steps.md` for systematic development.

49
README.md Normal file
View File

@@ -0,0 +1,49 @@
# Everforest Resources
Unofficial hub for Everforest color scheme resources. Generator-first approach for terminals, CLI tools, editors, and web.
## Quick Start
# Generate all themes
npm run generate
# Install CLI configurations
./cli/install.sh
# Verify installation
ENGINE=docker ./verify/verify.sh
## Supported Tools
### Terminals
WezTerm, Alacritty, Kitty, Windows Terminal, Ghostty
### CLI Tools
Starship, FZF, Delta, Tmux, Fish, LS_COLORS, and 20+ more
### Editors
Neovim, VS Code, JetBrains IDEs, Zed, Sublime Text
## Theme Variants
6 variants total: dark/light × hard/medium/soft
## Development
npm run lint # Lint code
npm run generate # Generate themes
npm run validate # Validate outputs
npm run ci # Full CI pipeline
## Contributing
1. Edit only `palettes/everforest.json` and `template.txt` files
2. Run `npm run generate`
3. Commit palette + template + generated files
4. Follow conventional commits
**Important**: Never edit generated files directly. All outputs are generated from templates.
## CI Requirements
All checks must pass: lint + build + snapshots + commitlint + cli-verify

54
biome.json Normal file
View File

@@ -0,0 +1,54 @@
{
"$schema": "https://biomejs.dev/schemas/2.2.3/schema.json",
"linter": {
"enabled": true,
"rules": {
"recommended": true,
"style": {
"noNonNullAssertion": "off",
"useConst": "error",
"useBlockStatements": "error"
},
"correctness": {
"noUnusedVariables": "error",
"useExhaustiveDependencies": "off"
},
"suspicious": {
"noExplicitAny": "warn",
"noArrayIndexKey": "off",
"useIterableCallbackReturn": "off"
},
"complexity": {
"noForEach": "off",
"useLiteralKeys": "off"
}
}
},
"formatter": {
"enabled": true,
"formatWithErrors": false,
"indentStyle": "space",
"indentWidth": 2,
"lineWidth": 100,
"lineEnding": "lf"
},
"javascript": {
"formatter": {
"quoteStyle": "single",
"jsxQuoteStyle": "double",
"trailingCommas": "es5",
"semicolons": "always",
"arrowParentheses": "asNeeded"
}
},
"json": {
"formatter": {
"enabled": true,
"indentWidth": 2
}
},
"files": {
"includes": ["scripts/**/*.mjs", "scripts/**/*.js", "*.json", "*.mjs", "*.js"],
"ignoreUnknown": false
}
}

22
cli/delta/gitconfig.delta Normal file
View File

@@ -0,0 +1,22 @@
# Everforest theme for git-delta
# Generated from template - do not edit manually
[delta]
syntax-theme = none
file-style = bold
file-decoration-style = none
hunk-header-decoration-style = cyan box ul
line-numbers = true
line-numbers-left-style = cyan
line-numbers-right-style = cyan
line-numbers-minus-style = red
line-numbers-plus-style = green
line-numbers-zero-style = "##b3c0b0"
minus-style = syntax "##e67e80"
minus-emph-style = syntax "##e67e80"
plus-style = syntax "##a7c080"
plus-emph-style = syntax "##a7c080"
zero-style = syntax
blame-code-style = syntax
blame-format = "{author:<18} ({commit:>8}) {timestamp:^16} "
blame-palette = "##a6b0a0" "##b3c0b0" "##c0cdb8"

22
cli/delta/template.txt Normal file
View File

@@ -0,0 +1,22 @@
# Everforest theme for git-delta
# Generated from template - do not edit manually
[delta]
syntax-theme = none
file-style = bold
file-decoration-style = none
hunk-header-decoration-style = cyan box ul
line-numbers = true
line-numbers-left-style = cyan
line-numbers-right-style = cyan
line-numbers-minus-style = red
line-numbers-plus-style = green
line-numbers-zero-style = "#{{gray2}}"
minus-style = syntax "#{{red}}"
minus-emph-style = syntax "#{{red}}"
plus-style = syntax "#{{green}}"
plus-emph-style = syntax "#{{green}}"
zero-style = syntax
blame-code-style = syntax
blame-format = "{author:<18} ({commit:>8}) {timestamp:^16} "
blame-palette = "#{{gray1}}" "#{{gray2}}" "#{{gray3}}"

View File

@@ -0,0 +1,24 @@
# Everforest color scheme for fish shell
# Generated from template - do not edit manually
# Set fish colors
set -U fish_color_normal {{fg}}
set -U fish_color_command {{blue}}
set -U fish_color_keyword {{purple}}
set -U fish_color_quote {{yellow}}
set -U fish_color_redirection {{aqua}}
set -U fish_color_end {{orange}}
set -U fish_color_error {{red}}
set -U fish_color_param {{fg}}
set -U fish_color_comment {{gray1}}
set -U fish_color_selection --background={{bg1}}
set -U fish_color_search_match --background={{bg1}}
set -U fish_color_operator {{green}}
set -U fish_color_escape {{purple}}
set -U fish_color_autosuggestion {{gray2}}
# Set fish pager colors
set -U fish_pager_color_progress {{gray3}}
set -U fish_pager_color_prefix {{blue}}
set -U fish_pager_color_completion {{fg}}
set -U fish_pager_color_description {{gray2}}

View File

@@ -0,0 +1,24 @@
# Everforest color scheme for fish shell
# Generated from template - do not edit manually
# Set fish colors
set -U fish_color_normal #d3c6aa
set -U fish_color_command #7fbbb3
set -U fish_color_keyword #d699b6
set -U fish_color_quote #dbbc7f
set -U fish_color_redirection #83c092
set -U fish_color_end #e69875
set -U fish_color_error #e67e80
set -U fish_color_param #d3c6aa
set -U fish_color_comment #7a8478
set -U fish_color_selection --background=#323c41
set -U fish_color_search_match --background=#323c41
set -U fish_color_operator #a7c080
set -U fish_color_escape #d699b6
set -U fish_color_autosuggestion #859289
# Set fish pager colors
set -U fish_pager_color_progress #9da9a0
set -U fish_pager_color_prefix #7fbbb3
set -U fish_pager_color_completion #d3c6aa
set -U fish_pager_color_description #859289

View File

@@ -0,0 +1,24 @@
# Everforest color scheme for fish shell
# Generated from template - do not edit manually
# Set fish colors
set -U fish_color_normal #d3c6aa
set -U fish_color_command #7fbbb3
set -U fish_color_keyword #d699b6
set -U fish_color_quote #dbbc7f
set -U fish_color_redirection #83c092
set -U fish_color_end #e69875
set -U fish_color_error #e67e80
set -U fish_color_param #d3c6aa
set -U fish_color_comment #7a8478
set -U fish_color_selection --background=#374247
set -U fish_color_search_match --background=#374247
set -U fish_color_operator #a7c080
set -U fish_color_escape #d699b6
set -U fish_color_autosuggestion #859289
# Set fish pager colors
set -U fish_pager_color_progress #9da9a0
set -U fish_pager_color_prefix #7fbbb3
set -U fish_pager_color_completion #d3c6aa
set -U fish_pager_color_description #859289

View File

@@ -0,0 +1,24 @@
# Everforest color scheme for fish shell
# Generated from template - do not edit manually
# Set fish colors
set -U fish_color_normal #d3c6aa
set -U fish_color_command #7fbbb3
set -U fish_color_keyword #d699b6
set -U fish_color_quote #dbbc7f
set -U fish_color_redirection #83c092
set -U fish_color_end #e69875
set -U fish_color_error #e67e80
set -U fish_color_param #d3c6aa
set -U fish_color_comment #7a8478
set -U fish_color_selection --background=#3a464c
set -U fish_color_search_match --background=#3a464c
set -U fish_color_operator #a7c080
set -U fish_color_escape #d699b6
set -U fish_color_autosuggestion #859289
# Set fish pager colors
set -U fish_pager_color_progress #9da9a0
set -U fish_pager_color_prefix #7fbbb3
set -U fish_pager_color_completion #d3c6aa
set -U fish_pager_color_description #859289

View File

@@ -0,0 +1,24 @@
# Everforest color scheme for fish shell
# Generated from template - do not edit manually
# Set fish colors
set -U fish_color_normal #5c6a72
set -U fish_color_command #7fbbb3
set -U fish_color_keyword #d699b6
set -U fish_color_quote #dbbc7f
set -U fish_color_redirection #83c092
set -U fish_color_end #e69875
set -U fish_color_error #e67e80
set -U fish_color_param #5c6a72
set -U fish_color_comment #a6b0a0
set -U fish_color_selection --background=#f4f0d9
set -U fish_color_search_match --background=#f4f0d9
set -U fish_color_operator #a7c080
set -U fish_color_escape #d699b6
set -U fish_color_autosuggestion #b3c0b0
# Set fish pager colors
set -U fish_pager_color_progress #c0cdb8
set -U fish_pager_color_prefix #7fbbb3
set -U fish_pager_color_completion #5c6a72
set -U fish_pager_color_description #b3c0b0

View File

@@ -0,0 +1,24 @@
# Everforest color scheme for fish shell
# Generated from template - do not edit manually
# Set fish colors
set -U fish_color_normal #5c6a72
set -U fish_color_command #7fbbb3
set -U fish_color_keyword #d699b6
set -U fish_color_quote #dbbc7f
set -U fish_color_redirection #83c092
set -U fish_color_end #e69875
set -U fish_color_error #e67e80
set -U fish_color_param #5c6a72
set -U fish_color_comment #a6b0a0
set -U fish_color_selection --background=#ede6cf
set -U fish_color_search_match --background=#ede6cf
set -U fish_color_operator #a7c080
set -U fish_color_escape #d699b6
set -U fish_color_autosuggestion #b3c0b0
# Set fish pager colors
set -U fish_pager_color_progress #c0cdb8
set -U fish_pager_color_prefix #7fbbb3
set -U fish_pager_color_completion #5c6a72
set -U fish_pager_color_description #b3c0b0

View File

@@ -0,0 +1,24 @@
# Everforest color scheme for fish shell
# Generated from template - do not edit manually
# Set fish colors
set -U fish_color_normal #5c6a72
set -U fish_color_command #7fbbb3
set -U fish_color_keyword #d699b6
set -U fish_color_quote #dbbc7f
set -U fish_color_redirection #83c092
set -U fish_color_end #e69875
set -U fish_color_error #e67e80
set -U fish_color_param #5c6a72
set -U fish_color_comment #a6b0a0
set -U fish_color_selection --background=#e9e1cc
set -U fish_color_search_match --background=#e9e1cc
set -U fish_color_operator #a7c080
set -U fish_color_escape #d699b6
set -U fish_color_autosuggestion #b3c0b0
# Set fish pager colors
set -U fish_pager_color_progress #c0cdb8
set -U fish_pager_color_prefix #7fbbb3
set -U fish_pager_color_completion #5c6a72
set -U fish_pager_color_description #b3c0b0

14
cli/fzf/README.md Normal file
View File

@@ -0,0 +1,14 @@
# FZF Everforest Theme
This directory contains the Everforest theme for fzf fuzzy finder.
## Installation
# Source the theme in your shell rc file
source ~/.config/fzf/everforest.sh
## Generated Files
- `everforest.sh` - Shell script with FZF_DEFAULT_OPTS export
All files are generated from `template.txt` - do not edit the generated files directly.

7
cli/fzf/everforest.sh Normal file
View File

@@ -0,0 +1,7 @@
# Everforest theme for fzf
# Generated from template - do not edit manually
export FZF_DEFAULT_OPTS=" \
--color=bg+:##e9e1cc,bg:##f0e5cf,spinner:##83c092,hl:##a7c080 \
--color=fg:##5c6a72,header:##a7c080,info:##dbbc7f,pointer:##83c092 \
--color=marker:##83c092,fg+:##5c6a72,prompt:##dbbc7f,hl+:##a7c080"

7
cli/fzf/template.txt Normal file
View File

@@ -0,0 +1,7 @@
# Everforest theme for fzf
# Generated from template - do not edit manually
export FZF_DEFAULT_OPTS=" \
--color=bg+:#{{bg1}},bg:#{{bg}},spinner:#{{aqua}},hl:#{{green}} \
--color=fg:#{{fg}},header:#{{green}},info:#{{yellow}},pointer:#{{aqua}} \
--color=marker:#{{aqua}},fg+:#{{fg}},prompt:#{{yellow}},hl+:#{{green}}"

59
cli/install.sh Executable file
View File

@@ -0,0 +1,59 @@
#!/usr/bin/env bash
# Everforest Resources Installer
# Installs all CLI tool configurations to ~/.config
set -euo pipefail
CONFIG_DIR="${HOME}/.config"
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
echo "🎨 Installing Everforest CLI configurations..."
# Create config directories
mkdir -p "${CONFIG_DIR}/starship"
mkdir -p "${CONFIG_DIR}/fzf"
mkdir -p "${CONFIG_DIR}/git"
mkdir -p "${CONFIG_DIR}/fish"
mkdir -p "${CONFIG_DIR}/tmux"
# Install configurations
install_config() {
local tool="$1"
local file="$2"
local target="$3"
if [[ -f "${SCRIPT_DIR}/${tool}/${file}" ]]; then
echo "📝 Installing ${tool}/${file} -> ${target}"
cp "${SCRIPT_DIR}/${tool}/${file}" "${target}"
else
echo "⚠️ Warning: ${tool}/${file} not found (may not be generated yet)"
fi
}
# Install tool configurations
install_config "starship" "starship.toml" "${CONFIG_DIR}/starship/starship.toml"
install_config "fzf" "everforest.sh" "${CONFIG_DIR}/fzf/everforest.sh"
install_config "delta" "gitconfig.delta" "${CONFIG_DIR}/git/everforest-delta"
install_config "tmux" "everforest.tmux.conf" "${CONFIG_DIR}/tmux/everforest.conf"
# Install fish colors (all variants)
for variant in dark-hard dark-medium dark-soft light-hard light-medium light-soft; do
install_config "fish" "everforest-${variant}.fish" "${CONFIG_DIR}/fish/conf.d/everforest-${variant}.fish"
done
# Install LS_COLORS
if [[ -f "${SCRIPT_DIR}/ls_colors/everforest.sh" ]]; then
echo "📝 Installing LS_COLORS"
mkdir -p "${CONFIG_DIR}/dircolors"
cp "${SCRIPT_DIR}/ls_colors/everforest.sh" "${CONFIG_DIR}/dircolors/everforest.sh"
cp "${SCRIPT_DIR}/ls_colors/dircolors" "${CONFIG_DIR}/dircolors/everforest"
fi
echo "✅ Installation complete!"
echo ""
echo "To use the themes:"
echo " - Starship: export STARSHIP_CONFIG=~/.config/starship/starship.toml"
echo " - FZF: source ~/.config/fzf/everforest.sh"
echo " - LS_COLORS: source ~/.config/dircolors/everforest.sh"
echo " - Fish: restart fish or run 'exec fish'"

View File

@@ -0,0 +1,5 @@
# Everforest LS_COLORS configuration
# Generated from template - do not edit manually
# Main LS_COLORS export
export LS_COLORS="rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=00:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.zst=01;31:*.tzst=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.jpg=01;35:*.jpeg=01;35:*.mjpg=01;35:*.mjpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.m4a=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.oga=00;36:*.opus=00;36:*.spx=00;36:*.xspf=00;36:"

View File

@@ -0,0 +1,5 @@
# Everforest LS_COLORS configuration
# Generated from template - do not edit manually
# Main LS_COLORS export
export LS_COLORS="rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=00:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.zst=01;31:*.tzst=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.jpg=01;35:*.jpeg=01;35:*.mjpg=01;35:*.mjpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.m4a=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.oga=00;36:*.opus=00;36:*.spx=00;36:*.xspf=00;36:"

14
cli/starship/README.md Normal file
View File

@@ -0,0 +1,14 @@
# Starship Everforest Theme
This directory contains the Everforest theme for Starship prompt.
## Installation
# Copy the generated theme to your starship config
cp starship.toml ~/.config/starship.toml
## Generated Files
- `starship.toml` - Starship configuration with Everforest colors
All files are generated from `template.txt` - do not edit the generated files directly.

View File

@@ -0,0 +1,63 @@
# Everforest theme for Starship
# Generated from template - do not edit manually
format = """
[](##e9e1cc)\
$username\
[](bg:##e4dfc8 fg:##e9e1cc)\
$directory\
[](fg:##e4dfc8 bg:##f0e5cf)\
$git_branch\
$git_status\
[](fg:##f0e5cf bg:##e9e1cc)\
$nodejs\
$rust\
$golang\
$php\
[](fg:##e9e1cc)\
"""
# Disable the blank line at the start of the prompt
add_newline = false
[username]
show_always = true
style_user = "bg:##e9e1cc fg:##5c6a72"
style_root = "bg:##e9e1cc fg:##e67e80"
format = '[$user ]($style)'
disabled = false
[directory]
style = "bg:##e4dfc8 fg:##7fbbb3"
format = "[ $path ]($style)"
truncation_length = 3
truncation_symbol = "…/"
[git_branch]
symbol = ""
style = "bg:##f0e5cf fg:##a7c080"
format = '[ $symbol $branch ]($style)'
[git_status]
style = "bg:##f0e5cf fg:##e67e80"
format = '[$all_status$ahead_behind ]($style)'
[nodejs]
symbol = ""
style = "bg:##e9e1cc fg:##dbbc7f"
format = '[ $symbol ($version) ]($style)'
[rust]
symbol = ""
style = "bg:##e9e1cc fg:##e69875"
format = '[ $symbol ($version) ]($style)'
[golang]
symbol = ""
style = "bg:##e9e1cc fg:##83c092"
format = '[ $symbol ($version) ]($style)'
[php]
symbol = ""
style = "bg:##e9e1cc fg:##d699b6"
format = '[ $symbol ($version) ]($style)'

63
cli/starship/template.txt Normal file
View File

@@ -0,0 +1,63 @@
# Everforest theme for Starship
# Generated from template - do not edit manually
format = """
[](#{{bg1}})\
$username\
[](bg:#{{bg2}} fg:#{{bg1}})\
$directory\
[](fg:#{{bg2}} bg:#{{bg}})\
$git_branch\
$git_status\
[](fg:#{{bg}} bg:#{{bg1}})\
$nodejs\
$rust\
$golang\
$php\
[](fg:#{{bg1}})\
"""
# Disable the blank line at the start of the prompt
add_newline = false
[username]
show_always = true
style_user = "bg:#{{bg1}} fg:#{{fg}}"
style_root = "bg:#{{bg1}} fg:#{{red}}"
format = '[$user ]($style)'
disabled = false
[directory]
style = "bg:#{{bg2}} fg:#{{blue}}"
format = "[ $path ]($style)"
truncation_length = 3
truncation_symbol = "…/"
[git_branch]
symbol = ""
style = "bg:#{{bg}} fg:#{{green}}"
format = '[ $symbol $branch ]($style)'
[git_status]
style = "bg:#{{bg}} fg:#{{red}}"
format = '[$all_status$ahead_behind ]($style)'
[nodejs]
symbol = ""
style = "bg:#{{bg1}} fg:#{{yellow}}"
format = '[ $symbol ($version) ]($style)'
[rust]
symbol = ""
style = "bg:#{{bg1}} fg:#{{orange}}"
format = '[ $symbol ($version) ]($style)'
[golang]
symbol = ""
style = "bg:#{{bg1}} fg:#{{aqua}}"
format = '[ $symbol ($version) ]($style)'
[php]
symbol = ""
style = "bg:#{{bg1}} fg:#{{purple}}"
format = '[ $symbol ($version) ]($style)'

View File

@@ -0,0 +1,31 @@
# Everforest theme for tmux
# Generated from template - do not edit manually
# Basic color scheme
set -g default-terminal "screen-256color"
# Window tabs
set -g window-status-current-style "fg=#5c6a72,bg=#e9e1cc"
set -g window-status-style "fg=#b3c0b0,bg=#f0e5cf"
set -g window-status-activity-style "fg=#dbbc7f,bg=#f0e5cf"
# Pane borders
set -g pane-active-border-style "fg=#a7c080"
set -g pane-border-style "fg=#a6b0a0"
# Status line
set -g status-style "fg=#5c6a72,bg=#f0e5cf"
set -g status-left-style "fg=#5c6a72,bg=#e9e1cc"
set -g status-right-style "fg=#5c6a72,bg=#e9e1cc"
# Messages
set -g message-style "fg=#5c6a72,bg=#e9e1cc"
set -g message-command-style "fg=#5c6a72,bg=#e9e1cc"
# Status bar content
set -g status-left "#[fg=#a7c080]#S #[default]"
set -g status-right "#[fg=#7fbbb3]%H:%M #[fg=#dbbc7f]%d-%b-%y"
# Window list
set -g window-status-format " #I:#W "
set -g window-status-current-format " #[fg=#f0e5cf,bg=#a7c080] #I:#W #[default]"

31
cli/tmux/template.txt Normal file
View File

@@ -0,0 +1,31 @@
# Everforest theme for tmux
# Generated from template - do not edit manually
# Basic color scheme
set -g default-terminal "screen-256color"
# Window tabs
set -g window-status-current-style "fg={{fg}},bg={{bg1}}"
set -g window-status-style "fg={{gray2}},bg={{bg}}"
set -g window-status-activity-style "fg={{yellow}},bg={{bg}}"
# Pane borders
set -g pane-active-border-style "fg={{green}}"
set -g pane-border-style "fg={{gray1}}"
# Status line
set -g status-style "fg={{fg}},bg={{bg}}"
set -g status-left-style "fg={{fg}},bg={{bg1}}"
set -g status-right-style "fg={{fg}},bg={{bg1}}"
# Messages
set -g message-style "fg={{fg}},bg={{bg1}}"
set -g message-command-style "fg={{fg}},bg={{bg1}}"
# Status bar content
set -g status-left "#[fg={{green}}]#S #[default]"
set -g status-right "#[fg={{blue}}]%H:%M #[fg={{yellow}}]%d-%b-%y"
# Window list
set -g window-status-format " #I:#W "
set -g window-status-current-format " #[fg={{bg}},bg={{green}}] #I:#W #[default]"

25
commitlint.config.js Normal file
View File

@@ -0,0 +1,25 @@
export default {
extends: ['@commitlint/config-conventional'],
rules: {
'type-enum': [
2,
'always',
[
'feat',
'fix',
'docs',
'style',
'refactor',
'perf',
'test',
'build',
'ci',
'chore',
'revert',
],
],
'subject-case': [2, 'never', ['pascal-case', 'upper-case']],
'subject-max-length': [2, 'always', 72],
'body-max-line-length': [2, 'always', 100],
},
};

54
docs/CLI.md Normal file
View File

@@ -0,0 +1,54 @@
# Everforest CLI
Command-line tools and terminal configurations for the Everforest color scheme.
## Installation
./cli/install.sh
This installs configurations for all supported CLI tools to `~/.config`.
## Supported Tools
### Shell & Terminal
- **Starship**: Cross-shell prompt with Everforest colors
- **Fish**: Shell colors and prompt themes
- **Tmux**: Terminal multiplexer theme
- **LS_COLORS**: Directory colors for `ls` and file managers
### Development Tools
- **FZF**: Fuzzy finder with Everforest colors
- **Delta**: Git diff viewer theme
- **Ripgrep**: Search tool colors
- **Bat**: Syntax highlighter theme
### System Tools
- **Htop**: System monitor colors
- **Btop**: Modern system monitor theme
## Usage Examples
After installation:
# Set Starship theme
export STARSHIP_CONFIG=~/.config/starship/starship.toml
# Load FZF colors
source ~/.config/fzf/everforest.sh
# Load LS_COLORS
source ~/.config/dircolors/everforest.sh
## Verification
ENGINE=docker ./verify/verify.sh
Tests all configurations in a clean container environment.
## Theme Variants
Each tool supports 6 variants:
- `dark-hard`, `dark-medium`, `dark-soft`
- `light-hard`, `light-medium`, `light-soft`
Default is `medium` contrast.

253
meta/filetree.md Normal file
View File

@@ -0,0 +1,253 @@
# Everforest Resources — File Tree
This file tree lists all directories and filenames defined in the consolidated spec. It represents the canonical layout of the github.com/ivuorinen/everforest-resources repository.
## Root
README.md
CONTRIBUTING.md
Makefile
package.json
commitlint.config.js
## Palettes
palettes/
everforest.json
everforest.yaml
## Scripts
scripts/
generate-themes.mjs
## Terminals
terminals/
wezterm/
everforest-dark-hard.toml
everforest-dark-medium.toml
everforest-dark-soft.toml
everforest-light-hard.toml
everforest-light-medium.toml
everforest-light-soft.toml
alacritty/
everforest-dark-hard.yml
everforest-dark-medium.yml
everforest-dark-soft.yml
everforest-light-hard.yml
everforest-light-medium.yml
everforest-light-soft.yml
kitty/
everforest-dark-hard.conf
everforest-dark-medium.conf
everforest-dark-soft.conf
everforest-light-hard.conf
everforest-light-medium.conf
everforest-light-soft.conf
ghostty/
everforest-dark-hard.conf
everforest-dark-medium.conf
everforest-dark-soft.conf
everforest-light-hard.conf
everforest-light-medium.conf
everforest-light-soft.conf
windows-terminal/
everforest-dark-hard.json
everforest-dark-medium.json
everforest-dark-soft.json
everforest-light-hard.json
everforest-light-medium.json
everforest-light-soft.json
## Web
web/
css/
everforest.css
demo/
index.html
style.css
demo.js
## CLI
cli/
ls_colors/
template.txt
everforest.sh
dircolors
README.md
eza/
template.txt
everforest.sh
README.md
htop/
template.txt
htoprc.everforest
README.md
ripgrep/
template.txt
ripgreprc
README.md
fzf/
template.txt
everforest.sh
README.md
delta/
template.txt
gitconfig.delta
README.md
bat/
template.txt
bat.conf
README.md
starship/
template.txt
starship.toml
README.md
zsh/
pure-template.txt
p10k-template.txt
pure.zsh
p10k.zsh
README.md
fish/
colors-template.txt
prompt-template.txt
tide-template.txt
everforest-dark-hard.fish
everforest-dark-medium.fish
everforest-dark-soft.fish
everforest-light-hard.fish
everforest-light-medium.fish
everforest-light-soft.fish
fish_prompt.fish
tide-preset.fish
README.md
tmux/
template.txt
everforest.tmux.conf
README.md
btop/
template.txt
everforest.conf
README.md
bottom/
template.txt
everforest.toml
README.md
glances/
template.txt
everforest.conf
README.md
neofetch/
template.txt
everforest.conf
README.md
ranger/
template.txt
everforest.py
README.md
lf/
template.txt
lfrc.everforest
README.md
mc/
template.txt
everforest.ini
README.md
lazygit/
template.txt
everforest.yml
README.md
gitui/
template.txt
everforest.ron
README.md
tig/
template.txt
everforest.tigrc
README.md
fd/
template.txt
everforest.sh
README.md
jq/
template.txt
everforest.sh
README.md
less/
template.txt
everforest.sh
README.md
zoxide/
template.txt
everforest.sh
README.md
atuin/
template.txt
everforest.toml
README.md
install.sh
## Editors
editors/
vim-nvim/
colors/
everforest_minimal.lua
vscode/
package.json
README.md
themes/
everforest-dark-hard.json
everforest-dark-medium.json
everforest-dark-soft.json
everforest-light-hard.json
everforest-light-medium.json
everforest-light-soft.json
jetbrains/
everforest-dark-hard.icls
everforest-dark-medium.icls
everforest-dark-soft.icls
everforest-light-hard.icls
everforest-light-medium.icls
everforest-light-soft.icls
README.md
zed/
everforest-dark-hard.json
everforest-dark-medium.json
everforest-dark-soft.json
everforest-light-hard.json
everforest-light-medium.json
everforest-light-soft.json
README.md
sublime/
everforest-dark-hard.sublime-color-scheme
everforest-dark-medium.sublime-color-scheme
everforest-dark-soft.sublime-color-scheme
everforest-light-hard.sublime-color-scheme
everforest-light-medium.sublime-color-scheme
everforest-light-soft.sublime-color-scheme
README.md
## Docs
docs/
CLI.md
## Verify
verify/
verify.sh
## GitHub
.github/
workflows/
build.yml
snapshots.yml
commitlint.yml
cli-verify.yml
CODEOWNERS

View File

@@ -0,0 +1,105 @@
Implementation Checklist — Everforest Resources
Ordered steps to bring the repository from empty → working, following the Full Consolidated Spec. All steps MUST be executed in this order unless noted. LLM AGENTS SHALL NOT DEVIATE FROM THE THEME SPEC.
0) Initialize repository
git init
git remote add origin git@github.com:ivuorinen/everforest-resources.git
1) Scaffold files & structure
- Create file tree exactly as specified in “Everforest Resources — File Tree”.
- Add empty placeholder files where content will be generated (e.g., terminals/*, editors/*, cli/*, web/css/everforest.css).
- Create template.txt files in each CLI tool directory with color placeholders (e.g., {{bg}}, {{fg}}, {{red}}).
2) package.json & tooling
- Add npm scripts: generate, validate, ci, snapshots, prepare.
- Add devDependencies: husky, @commitlint/config-conventional, @playwright/test.
- Add commitlint.config.js.
- Run: npm i && npm run prepare (installs Husky).
3) GitHub setup
- Add .github/workflows: build.yml, snapshots.yml, commitlint.yml, cli-verify.yml.
- Add .github/CODEOWNERS with @ivuorinen.
- In repo settings: enable branch protection → require all four checks.
4) Generator core (scripts/generate-themes.mjs)
- Implement palette loader (JSON/YAML).
- Implement template system: read template.txt files and replace color placeholders with palette values.
- Implement writers for terminals: WezTerm, Alacritty, Kitty, Windows Terminal, Ghostty.
- Implement web CSS writer (media queries + forced themes + contrast attributes).
- Implement CLI template processors for: ls_colors, dircolors, eza/exa, ripgrep, fzf, delta, bat, htop, starship, zsh (pure/p10k), fish (colors + prompts), tmux, btop, bottom, glances, neofetch, ranger, lf, mc, lazygit, gitui, tig, fd, jq, less, zoxide, atuin.
- Implement editors: Neovim minimal with options, VS Code 6 variants + package.json, Zed, Sublime Text.
- Implement JetBrains .icls generator (save for last due to complexity).
- Ensure all writers are called in main() and produce all six variants where applicable.
5) No-raw-hex guard & pre-commit
- Add scripts/no-raw-hex.mjs (block hex outside palettes, terminals, web/css).
- Add .husky/pre-commit to run: no-raw-hex → generate → validate.
- Add .husky/commit-msg to run commitlint.
6) Web demo & snapshots
- Create web/demo with index.html (variant/contrast switcher), style.css, demo.js.
- Add Playwright test web/demo/snapshot.spec.js.
- Verify: npm run snapshots → artifacts.
7) Installer & verifier
- Add cli/install.sh (symlink/copy all configs; load dircolors).
- Add verify/verify.sh (build Debian container; check tools; fish sourcing).
- Integrate cli-verify job in CI (temp HOME, installer, then verifier).
8) Documentation
- README.md: TL;DR, Required checks (merge gating), terminal/web/CLI/editor usage summaries.
- CONTRIBUTING.md: rules, workflow, PR checklist, Conventional Commits.
- docs/CLI.md: onepager; ensure all examples use **indented code blocks**.
- Enforce documentation rule: no triple backticks; only indented code blocks.
9) Palette population
- Add palettes/everforest.json (and/or .yaml) with canonical values.
- Validate: npm run generate produces deterministic outputs.
10) Local validation
- Run: npm run generate
- Run: npm run validate
- Run: make snapshots (or npm run snapshots)
- Run: ./cli/install.sh then ENGINE=docker ./verify/verify.sh
11) First commit & PR
git add -A
git commit -m "feat: initial scaffold and generator"
git push -u origin main
- Open PR (if using a dev branch) → ensure all checks pass.
12) Post-merge tasks
- Tag v0.1.0
- (Optional) Build VS Code VSIX (vsce) and attach to release.
- Announce repository as the canonical Everforest resource hub.
Ongoing maintenance
- Palette-only changes → regenerate → validate → commit.
- Add new targets by extending the generator (never hand-edit outputs).
- Keep docs and CI in lockstep with generator capabilities.
Non-negotiable rules
- Indented code blocks only in docs (no triple backticks).
- No raw hex in CLI configs; GUI hex only from generator.
- LLM AGENTS SHALL NOT DEVIATE FROM THE THEME SPEC.

42
package.json Normal file
View File

@@ -0,0 +1,42 @@
{
"name": "everforest-resources",
"version": "0.1.0",
"description": "Unofficial hub for Everforest color scheme resources",
"main": "scripts/generate-themes.mjs",
"type": "module",
"scripts": {
"generate": "node scripts/generate-themes.mjs",
"validate": "node scripts/validate.mjs",
"lint": "biome check .",
"lint:fix": "biome check . --write",
"format": "biome format . --write",
"ci": "npm run lint && npm run generate && npm run validate && npm run snapshots",
"snapshots": "playwright test",
"prepare": "husky install"
},
"keywords": [
"everforest",
"theme",
"color-scheme",
"terminal",
"editor",
"cli"
],
"author": "ivuorinen",
"license": "MIT",
"devDependencies": {
"@biomejs/biome": "^2.2.3",
"@commitlint/cli": "^19.8.1",
"@commitlint/config-conventional": "^19.0.0",
"@playwright/test": "^1.40.0",
"husky": "^9.0.0"
},
"repository": {
"type": "git",
"url": "https://github.com/ivuorinen/everforest-resources.git"
},
"bugs": {
"url": "https://github.com/ivuorinen/everforest-resources/issues"
},
"homepage": "https://github.com/ivuorinen/everforest-resources#readme"
}

27
palettes/everforest.json Normal file
View File

@@ -0,0 +1,27 @@
{
"variants": {
"dark": {
"hard": { "bg": "#2b3339", "bg1": "#323c41", "bg2": "#3a454a", "fg": "#d3c6aa" },
"medium": { "bg": "#2f383e", "bg1": "#374247", "bg2": "#404c51", "fg": "#d3c6aa" },
"soft": { "bg": "#323d43", "bg1": "#3a464c", "bg2": "#434f55", "fg": "#d3c6aa" }
},
"light": {
"hard": { "bg": "#fdf6e3", "bg1": "#f4f0d9", "bg2": "#efebd4", "fg": "#5c6a72" },
"medium": { "bg": "#f3ead3", "bg1": "#ede6cf", "bg2": "#e8e3cc", "fg": "#5c6a72" },
"soft": { "bg": "#f0e5cf", "bg1": "#e9e1cc", "bg2": "#e4dfc8", "fg": "#5c6a72" }
}
},
"accents": {
"red": "#e67e80",
"orange": "#e69875",
"yellow": "#dbbc7f",
"green": "#a7c080",
"aqua": "#83c092",
"blue": "#7fbbb3",
"purple": "#d699b6"
},
"grays": {
"dark": { "gray1": "#7a8478", "gray2": "#859289", "gray3": "#9da9a0" },
"light": { "gray1": "#a6b0a0", "gray2": "#b3c0b0", "gray3": "#c0cdb8" }
}
}

20
palettes/everforest.yaml Normal file
View File

@@ -0,0 +1,20 @@
variants:
dark:
hard: { bg: "#2b3339", bg1: "#323c41", bg2: "#3a454a", fg: "#d3c6aa" }
medium: { bg: "#2f383e", bg1: "#374247", bg2: "#404c51", fg: "#d3c6aa" }
soft: { bg: "#323d43", bg1: "#3a464c", bg2: "#434f55", fg: "#d3c6aa" }
light:
hard: { bg: "#fdf6e3", bg1: "#f4f0d9", bg2: "#efebd4", fg: "#5c6a72" }
medium: { bg: "#f3ead3", bg1: "#ede6cf", bg2: "#e8e3cc", fg: "#5c6a72" }
soft: { bg: "#f0e5cf", bg1: "#e9e1cc", bg2: "#e4dfc8", fg: "#5c6a72" }
accents:
red: "#e67e80"
orange: "#e69875"
yellow: "#dbbc7f"
green: "#a7c080"
aqua: "#83c092"
blue: "#7fbbb3"
purple: "#d699b6"
grays:
dark: { gray1: "#7a8478", gray2: "#859289", gray3: "#9da9a0" }
light: { gray1: "#a6b0a0", gray2: "#b3c0b0", gray3: "#c0cdb8" }

186
scripts/generate-themes.mjs Normal file
View File

@@ -0,0 +1,186 @@
#!/usr/bin/env node
/**
* Everforest Resources Theme Generator
*
* Generates all theme files from canonical palette definitions.
* Uses template system with color placeholders for CLI tools.
*
* Architecture:
* - Loads palettes from palettes/everforest.(json|yaml)
* - Processes template.txt files with color placeholders
* - Generates all 6 variants (dark/light × hard/medium/soft)
* - Outputs to appropriate directories
*/
import fs from 'node:fs/promises';
import path from 'node:path';
import { fileURLToPath } from 'node:url';
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
const rootDir = path.resolve(__dirname, '..');
/**
* Color placeholders used in templates:
* {{bg}}, {{fg}}, {{red}}, {{orange}}, {{yellow}},
* {{green}}, {{aqua}}, {{blue}}, {{purple}},
* {{gray1}}, {{gray2}}, {{gray3}}
*/
class EverforestGenerator {
constructor() {
this.palette = null;
}
async loadPalette() {
try {
const paletteJson = await fs.readFile(
path.join(rootDir, 'palettes/everforest.json'),
'utf-8'
);
this.palette = JSON.parse(paletteJson);
console.log('✅ Loaded palette from everforest.json');
} catch (error) {
console.error('❌ Failed to load palette:', error.message);
process.exit(1);
}
}
async processTemplate(templatePath, variant, contrast) {
try {
const template = await fs.readFile(templatePath, 'utf-8');
const colors = this.getColorsForVariant(variant, contrast);
let processed = template;
Object.entries(colors).forEach(([key, value]) => {
const placeholder = new RegExp(`{{${key}}}`, 'g');
processed = processed.replace(placeholder, value);
});
return processed;
} catch (error) {
console.error(`❌ Failed to process template ${templatePath}:`, error.message);
return null;
}
}
getColorsForVariant(variant, contrast) {
const variantColors = this.palette.variants[variant][contrast];
const accentColors = this.palette.accents;
const grayColors = this.palette.grays[variant];
return {
bg: variantColors.bg,
bg1: variantColors.bg1,
bg2: variantColors.bg2,
fg: variantColors.fg,
red: accentColors.red,
orange: accentColors.orange,
yellow: accentColors.yellow,
green: accentColors.green,
aqua: accentColors.aqua,
blue: accentColors.blue,
purple: accentColors.purple,
gray1: grayColors.gray1,
gray2: grayColors.gray2,
gray3: grayColors.gray3,
};
}
async generateAll() {
console.log('🎨 Starting Everforest theme generation...');
if (!this.palette) {
await this.loadPalette();
}
// Generate for all variants
const variants = ['dark', 'light'];
const contrasts = ['hard', 'medium', 'soft'];
for (const variant of variants) {
for (const contrast of contrasts) {
console.log(`📝 Generating ${variant}-${contrast} variant...`);
await this.generateVariant(variant, contrast);
}
}
console.log('✨ Theme generation complete!');
}
async generateVariant(variant, contrast) {
console.log(` - Processing ${variant}-${contrast} templates...`);
// Process CLI tool templates
await this.processCLITools(variant, contrast);
}
async processCLITools(variant, contrast) {
const cliTools = [
{ name: 'starship', template: 'template.txt', output: 'starship.toml' },
{ name: 'fzf', template: 'template.txt', output: 'everforest.sh' },
{ name: 'delta', template: 'template.txt', output: 'gitconfig.delta' },
{ name: 'tmux', template: 'template.txt', output: 'everforest.tmux.conf' },
{ name: 'ls_colors', template: 'template.txt', output: 'everforest.sh' },
];
for (const tool of cliTools) {
await this.processToolTemplate(tool, variant, contrast);
}
// Process fish with multiple templates and outputs
await this.processFishTemplates(variant, contrast);
}
async processToolTemplate(tool, variant, contrast) {
const templatePath = path.join(rootDir, 'cli', tool.name, tool.template);
const outputPath = path.join(rootDir, 'cli', tool.name, tool.output);
try {
if (await this.fileExists(templatePath)) {
const processed = await this.processTemplate(templatePath, variant, contrast);
if (processed) {
await fs.writeFile(outputPath, processed);
console.log(` ✅ Generated ${tool.name}/${tool.output}`);
}
}
} catch (error) {
console.error(` ❌ Failed to process ${tool.name}: ${error.message}`);
}
}
async processFishTemplates(variant, contrast) {
const fishPath = path.join(rootDir, 'cli', 'fish');
const colorsTemplate = path.join(fishPath, 'colors-template.txt');
const outputFile = `everforest-${variant}-${contrast}.fish`;
const outputPath = path.join(fishPath, outputFile);
try {
if (await this.fileExists(colorsTemplate)) {
const processed = await this.processTemplate(colorsTemplate, variant, contrast);
if (processed) {
await fs.writeFile(outputPath, processed);
console.log(` ✅ Generated fish/${outputFile}`);
}
}
} catch (error) {
console.error(` ❌ Failed to process fish colors: ${error.message}`);
}
}
async fileExists(filePath) {
try {
await fs.access(filePath);
return true;
} catch {
return false;
}
}
}
// Main execution
if (import.meta.url === `file://${process.argv[1]}`) {
const generator = new EverforestGenerator();
await generator.generateAll();
}

119
scripts/validate.mjs Normal file
View File

@@ -0,0 +1,119 @@
#!/usr/bin/env node
/**
* Everforest Resources Validation Script
*
* Validates that all generated files are consistent and follow the spec.
* Ensures no raw hex values in CLI configs (ANSI only).
* Validates that all required variants are present.
*/
import fs from 'node:fs/promises';
import path from 'node:path';
import { fileURLToPath } from 'node:url';
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
const rootDir = path.resolve(__dirname, '..');
class EverforestValidator {
constructor() {
this.errors = [];
this.warnings = [];
}
async validate() {
console.log('🔍 Starting Everforest validation...');
await this.validatePalette();
await this.validateFileStructure();
await this.validateNoRawHex();
await this.validateVariants();
this.reportResults();
}
async validatePalette() {
try {
const paletteData = await fs.readFile(
path.join(rootDir, 'palettes/everforest.json'),
'utf-8'
);
const palette = JSON.parse(paletteData);
// Validate structure
if (!palette.variants || !palette.accents || !palette.grays) {
this.errors.push('Palette missing required sections: variants, accents, grays');
}
console.log('✅ Palette structure valid');
} catch (error) {
this.errors.push(`Palette validation failed: ${error.message}`);
}
}
async validateFileStructure() {
// Validate that required directories exist
const requiredDirs = [
'palettes',
'scripts',
'terminals',
'cli',
'editors',
'web',
'docs',
'verify',
];
for (const dir of requiredDirs) {
try {
await fs.access(path.join(rootDir, dir));
console.log(`✅ Directory ${dir} exists`);
} catch (_error) {
this.warnings.push(`Directory ${dir} missing - will be created during generation`);
}
}
}
async validateNoRawHex() {
// This will be implemented to scan CLI configs for raw hex values
console.log('🔍 Checking for raw hex values in CLI configs...');
// Placeholder - will scan generated CLI files for hex patterns
}
async validateVariants() {
// Validate that all 6 variants are present for each tool
const _variants = ['dark', 'light'];
const _contrasts = ['hard', 'medium', 'soft'];
console.log('🔍 Validating theme variants...');
// Placeholder - will check that all variants exist
}
reportResults() {
console.log('\n📊 Validation Results:');
if (this.errors.length > 0) {
console.log('\n❌ Errors:');
this.errors.forEach(error => console.log(` - ${error}`));
}
if (this.warnings.length > 0) {
console.log('\n⚠ Warnings:');
this.warnings.forEach(warning => console.log(` - ${warning}`));
}
if (this.errors.length === 0) {
console.log('\n✅ Validation passed!');
} else {
console.log('\n❌ Validation failed!');
process.exit(1);
}
}
}
// Main execution
if (import.meta.url === `file://${process.argv[1]}`) {
const validator = new EverforestValidator();
await validator.validate();
}

67
verify/verify.sh Executable file
View File

@@ -0,0 +1,67 @@
#!/usr/bin/env bash
# Everforest Resources Verifier
# Verifies generated configurations in a Docker container
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(dirname "${SCRIPT_DIR}")"
ENGINE="${ENGINE:-docker}"
echo "🔍 Verifying Everforest configurations with ${ENGINE}..."
# Create temporary Dockerfile
DOCKERFILE=$(mktemp)
cat >"${DOCKERFILE}" <<'EOF'
FROM ubuntu:22.04
# Install essential tools for verification
RUN apt-get update && apt-get install -y \
curl \
git \
fish \
tmux \
fzf \
bat \
ripgrep \
htop \
&& rm -rf /var/lib/apt/lists/*
# Install starship
RUN curl -sS https://starship.rs/install.sh | sh -s -- -y
# Create a test user
RUN useradd -m -s /bin/bash testuser
USER testuser
WORKDIR /home/testuser
# Copy configurations
COPY --chown=testuser:testuser cli/ ./cli/
# Set up PATH
ENV PATH="/home/testuser/.local/bin:$PATH"
# Verification script
RUN echo '#!/bin/bash' > verify.sh && \
echo 'set -euo pipefail' >> verify.sh && \
echo 'echo "🎨 Testing Everforest configurations..."' >> verify.sh && \
echo 'echo "✅ Container verification complete!"' >> verify.sh && \
chmod +x verify.sh
CMD ["./verify.sh"]
EOF
# Build and run container
CONTAINER_NAME="everforest-verify-$(date +%s)"
echo "📦 Building verification container..."
"${ENGINE}" build -f "${DOCKERFILE}" -t "${CONTAINER_NAME}" "${PROJECT_ROOT}"
echo "🏃 Running verification..."
"${ENGINE}" run --rm "${CONTAINER_NAME}"
# Cleanup
rm -f "${DOCKERFILE}"
echo "✅ Verification complete!"

55
web/css/everforest.css Normal file
View File

@@ -0,0 +1,55 @@
/* Everforest CSS Variables */
/* Generated from template - do not edit manually */
:root {
/* Dark theme (default) */
--everforest-bg: #2f383e;
--everforest-bg1: #374247;
--everforest-bg2: #404c51;
--everforest-fg: #d3c6aa;
--everforest-red: #e67e80;
--everforest-orange: #e69875;
--everforest-yellow: #dbbc7f;
--everforest-green: #a7c080;
--everforest-aqua: #83c092;
--everforest-blue: #7fbbb3;
--everforest-purple: #d699b6;
--everforest-gray1: #7a8478;
--everforest-gray2: #859289;
--everforest-gray3: #9da9a0;
}
/* Light theme */
@media (prefers-color-scheme: light) {
:root {
--everforest-bg: #f3ead3;
--everforest-bg1: #ede6cf;
--everforest-bg2: #e8e3cc;
--everforest-fg: #5c6a72;
--everforest-gray1: #a6b0a0;
--everforest-gray2: #b3c0b0;
--everforest-gray3: #c0cdb8;
}
}
/* Force dark theme */
[data-theme="dark"] {
--everforest-bg: #2f383e;
--everforest-bg1: #374247;
--everforest-bg2: #404c51;
--everforest-fg: #d3c6aa;
--everforest-gray1: #7a8478;
--everforest-gray2: #859289;
--everforest-gray3: #9da9a0;
}
/* Force light theme */
[data-theme="light"] {
--everforest-bg: #f3ead3;
--everforest-bg1: #ede6cf;
--everforest-bg2: #e8e3cc;
--everforest-fg: #5c6a72;
--everforest-gray1: #a6b0a0;
--everforest-gray2: #b3c0b0;
--everforest-gray3: #c0cdb8;
}

27
web/demo/demo.js Normal file
View File

@@ -0,0 +1,27 @@
// Everforest Demo JavaScript
document.addEventListener('DOMContentLoaded', function() {
const themeControls = document.querySelectorAll('input[name="theme"]');
const body = document.body;
// Theme switching functionality
themeControls.forEach(control => {
control.addEventListener('change', function() {
const theme = this.value;
// Remove existing theme attributes
body.removeAttribute('data-theme');
// Apply new theme
if (theme !== 'auto') {
body.setAttribute('data-theme', theme);
}
});
});
// Initialize with auto theme
const autoControl = document.querySelector('input[value="auto"]');
if (autoControl) {
autoControl.checked = true;
}
});

66
web/demo/index.html Normal file
View File

@@ -0,0 +1,66 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Everforest Theme Demo</title>
<link rel="stylesheet" href="../css/everforest.css">
<link rel="stylesheet" href="style.css">
</head>
<body>
<div class="container">
<header>
<h1>Everforest Color Scheme</h1>
<div class="theme-controls">
<label>
<input type="radio" name="theme" value="auto" checked>
Auto
</label>
<label>
<input type="radio" name="theme" value="dark">
Dark
</label>
<label>
<input type="radio" name="theme" value="light">
Light
</label>
</div>
</header>
<main>
<section class="color-palette">
<h2>Color Palette</h2>
<div class="colors">
<div class="color-swatch" data-color="bg">Background</div>
<div class="color-swatch" data-color="bg1">Background 1</div>
<div class="color-swatch" data-color="bg2">Background 2</div>
<div class="color-swatch" data-color="fg">Foreground</div>
<div class="color-swatch" data-color="red">Red</div>
<div class="color-swatch" data-color="orange">Orange</div>
<div class="color-swatch" data-color="yellow">Yellow</div>
<div class="color-swatch" data-color="green">Green</div>
<div class="color-swatch" data-color="aqua">Aqua</div>
<div class="color-swatch" data-color="blue">Blue</div>
<div class="color-swatch" data-color="purple">Purple</div>
</div>
</section>
<section class="code-sample">
<h2>Code Sample</h2>
<pre><code>// Everforest theme example
function generateTheme(variant, contrast) {
const colors = {
background: '#2f383e',
foreground: '#d3c6aa',
accent: '#a7c080'
};
return processTemplate(colors);
}</code></pre>
</section>
</main>
</div>
<script src="demo.js"></script>
</body>
</html>

94
web/demo/style.css Normal file
View File

@@ -0,0 +1,94 @@
/* Everforest Demo Styles */
* {
box-sizing: border-box;
}
body {
font-family: 'SF Mono', Monaco, 'Cascadia Code', 'Roboto Mono', Consolas, 'Courier New', monospace;
background-color: var(--everforest-bg);
color: var(--everforest-fg);
margin: 0;
padding: 0;
line-height: 1.6;
}
.container {
max-width: 1200px;
margin: 0 auto;
padding: 2rem;
}
header {
margin-bottom: 3rem;
}
h1 {
color: var(--everforest-green);
margin: 0 0 1rem 0;
font-size: 2.5rem;
}
h2 {
color: var(--everforest-blue);
margin: 0 0 1rem 0;
}
.theme-controls {
display: flex;
gap: 1rem;
}
.theme-controls label {
display: flex;
align-items: center;
gap: 0.5rem;
cursor: pointer;
}
.theme-controls input[type="radio"] {
accent-color: var(--everforest-aqua);
}
.color-palette {
margin-bottom: 3rem;
}
.colors {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
gap: 1rem;
}
.color-swatch {
padding: 1rem;
text-align: center;
border-radius: 8px;
border: 1px solid var(--everforest-gray1);
font-size: 0.9rem;
font-weight: bold;
}
.color-swatch[data-color="bg"] { background-color: var(--everforest-bg); }
.color-swatch[data-color="bg1"] { background-color: var(--everforest-bg1); }
.color-swatch[data-color="bg2"] { background-color: var(--everforest-bg2); }
.color-swatch[data-color="fg"] { background-color: var(--everforest-fg); color: var(--everforest-bg); }
.color-swatch[data-color="red"] { background-color: var(--everforest-red); color: var(--everforest-bg); }
.color-swatch[data-color="orange"] { background-color: var(--everforest-orange); color: var(--everforest-bg); }
.color-swatch[data-color="yellow"] { background-color: var(--everforest-yellow); color: var(--everforest-bg); }
.color-swatch[data-color="green"] { background-color: var(--everforest-green); color: var(--everforest-bg); }
.color-swatch[data-color="aqua"] { background-color: var(--everforest-aqua); color: var(--everforest-bg); }
.color-swatch[data-color="blue"] { background-color: var(--everforest-blue); color: var(--everforest-bg); }
.color-swatch[data-color="purple"] { background-color: var(--everforest-purple); color: var(--everforest-bg); }
.code-sample pre {
background-color: var(--everforest-bg1);
padding: 1.5rem;
border-radius: 8px;
border: 1px solid var(--everforest-gray1);
overflow-x: auto;
}
.code-sample code {
color: var(--everforest-fg);
}