diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml deleted file mode 100644 index 64d9d42..0000000 --- a/.github/workflows/build.yml +++ /dev/null @@ -1,40 +0,0 @@ -name: Build - -on: - push: - branches: [main] - pull_request: - branches: [main] - -jobs: - build: - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - - - name: Setup Node.js - uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5.0.0 - with: - node-version-file: ".nvmrc" - 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 diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ec901a0..40194cb 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -28,6 +28,7 @@ jobs: generate: name: Generate Themes runs-on: ubuntu-latest + needs: lint steps: - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 @@ -57,8 +58,9 @@ jobs: echo "✅ All generated files are up to date" test: - name: Test Web Components + name: Test Web Components & Snapshots runs-on: ubuntu-latest + needs: generate steps: - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 @@ -74,9 +76,15 @@ jobs: - name: Install Playwright browsers run: npx playwright install --with-deps - - name: Run Playwright tests + - name: Generate themes + run: npm run generate + + - name: Run Playwright e2e tests run: npm run test:e2e + - name: Generate snapshots + run: npm run snapshots + - name: Upload Playwright report uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 if: always() @@ -88,6 +96,7 @@ jobs: verify-installation: name: Verify Installation Scripts runs-on: ${{ matrix.os }} + needs: generate strategy: matrix: os: [ubuntu-latest, macos-latest] @@ -142,6 +151,7 @@ jobs: build-stats: name: Build Statistics runs-on: ubuntu-latest + needs: generate if: github.event_name == 'push' && github.ref == 'refs/heads/main' steps: - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 diff --git a/.github/workflows/cli-verify.yml b/.github/workflows/cli-verify.yml deleted file mode 100644 index 3772c43..0000000 --- a/.github/workflows/cli-verify.yml +++ /dev/null @@ -1,37 +0,0 @@ -name: CLI Verify - -on: - push: - branches: [main] - pull_request: - branches: [main] - -jobs: - cli-verify: - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - - - name: Setup Node.js - uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5.0.0 - with: - node-version-file: ".nvmrc" - 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 diff --git a/.github/workflows/snapshots.yml b/.github/workflows/snapshots.yml deleted file mode 100644 index 28f193f..0000000 --- a/.github/workflows/snapshots.yml +++ /dev/null @@ -1,40 +0,0 @@ -name: Snapshots - -on: - push: - branches: [main] - pull_request: - branches: [main] - -jobs: - snapshots: - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - - - name: Setup Node.js - uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5.0.0 - with: - node-version-file: ".nvmrc" - 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@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 - if: failure() - with: - name: playwright-report - path: playwright-report/ - retention-days: 30 diff --git a/install.sh b/install.sh index 3ef0bd7..44f2aeb 100755 --- a/install.sh +++ b/install.sh @@ -29,7 +29,7 @@ log_header() { echo -e "${PURPLE}🎨 $1${NC}"; } # Usage information usage() { - cat </dev/null 2>&1 + command -v "$1" >/dev/null 2>&1 } check_directory() { - [[ -d "$1" ]] + [[ -d "$1" ]] } check_config_dir() { - local dir="$1" - [[ -d "$CONFIG_DIR/$dir" ]] || [[ -d "$HOME/.$dir" ]] || [[ -d "$HOME/Library/Application Support/$dir" ]] + local dir="$1" + [[ -d "$CONFIG_DIR/$dir" ]] || [[ -d "$HOME/.$dir" ]] || [[ -d "$HOME/Library/Application Support/$dir" ]] +} + +# Check if tool is available (installed or has config directory) +check_tool_available() { + local tool="$1" + local config_dir="$2" + + if check_tool "$tool"; then + return 0 + elif check_config_dir "$config_dir"; then + return 0 + else + return 1 + fi +} + +# Install with tool availability check +install_tool_config() { + local tool_name="$1" + local config_name="$2" + local src="$3" + local dest="$4" + local display_name="$5" + + if check_tool_available "$tool_name" "$config_name"; then + install_file "$src" "$dest" "$display_name" + else + log_info "Skipping $display_name (tool not installed and no config directory found)" + fi } # Validate variant validate_variant() { - local valid_variants=("dark-hard" "dark-medium" "dark-soft" "light-hard" "light-medium" "light-soft") - for valid in "${valid_variants[@]}"; do - [[ "$VARIANT" == "$valid" ]] && return 0 - done - log_error "Invalid variant: $VARIANT" - echo "Valid variants: ${valid_variants[*]}" - exit 1 + local valid_variants=("dark-hard" "dark-medium" "dark-soft" "light-hard" "light-medium" "light-soft") + for valid in "${valid_variants[@]}"; do + [[ "$VARIANT" == "$valid" ]] && return 0 + done + log_error "Invalid variant: $VARIANT" + echo "Valid variants: ${valid_variants[*]}" + exit 1 } # Create backup create_backup() { - [[ "$CREATE_BACKUP" == "false" ]] && return + [[ "$CREATE_BACKUP" == "false" ]] && return - log_info "Creating backup at $BACKUP_DIR" - mkdir -p "$BACKUP_DIR" + log_info "Creating backup at $BACKUP_DIR" + mkdir -p "$BACKUP_DIR" - # Backup common config directories - for dir in alacritty kitty wezterm starship tmux htop fish nvim vscode; do - if [[ -d "$CONFIG_DIR/$dir" ]]; then - cp -r "$CONFIG_DIR/$dir" "$BACKUP_DIR/" 2>/dev/null || true - fi - done + # Backup common config directories + for dir in alacritty kitty wezterm starship tmux htop fish nvim vscode; do + if [[ -d "$CONFIG_DIR/$dir" ]]; then + cp -r "$CONFIG_DIR/$dir" "$BACKUP_DIR/" 2>/dev/null || true + fi + done - log_success "Backup created at $BACKUP_DIR" + log_success "Backup created at $BACKUP_DIR" } # Install file with safety checks install_file() { - local src="$1" - local dest="$2" - local name="$3" + local src="$1" + local dest="$2" + local name="$3" - if [[ ! -f "$src" ]]; then - log_warning "$name source file not found: $src" - return 1 - fi + if [[ ! -f "$src" ]]; then + log_warning "$name source file not found: $src" + return 1 + fi - if [[ -f "$dest" && "$FORCE" == "false" ]]; then - log_warning "$name already exists: $dest (use --force to overwrite)" - return 1 - fi + if [[ -f "$dest" && "$FORCE" == "false" ]]; then + log_warning "$name already exists: $dest (use --force to overwrite)" + return 1 + fi - if [[ "$DRY_RUN" == "true" ]]; then - log_info "[DRY RUN] Would install $name: $src -> $dest" - return 0 - fi + if [[ "$DRY_RUN" == "true" ]]; then + log_info "[DRY RUN] Would install $name: $src -> $dest" + return 0 + fi - mkdir -p "$(dirname "$dest")" - cp "$src" "$dest" - log_success "Installed $name" + mkdir -p "$(dirname "$dest")" + cp "$src" "$dest" + log_success "Installed $name" } # Install terminal themes install_terminals() { - log_header "Installing Terminal Themes ($VARIANT)" + log_header "Installing Terminal Themes ($VARIANT)" - # Alacritty - if check_tool "alacritty" || check_config_dir "alacritty"; then - install_file \ - "$SCRIPT_DIR/terminals/alacritty/everforest-$VARIANT.yml" \ - "$CONFIG_DIR/alacritty/themes/everforest-$VARIANT.yml" \ - "Alacritty theme" + # Alacritty + install_tool_config "alacritty" "alacritty" \ + "$SCRIPT_DIR/terminals/alacritty/everforest-$VARIANT.yml" \ + "$CONFIG_DIR/alacritty/themes/everforest-$VARIANT.yml" \ + "Alacritty theme" + + # Kitty + install_tool_config "kitty" "kitty" \ + "$SCRIPT_DIR/terminals/kitty/everforest-$VARIANT.conf" \ + "$CONFIG_DIR/kitty/themes/everforest-$VARIANT.conf" \ + "Kitty theme" + + # WezTerm + install_tool_config "wezterm" "wezterm" \ + "$SCRIPT_DIR/terminals/wezterm/everforest-$VARIANT.lua" \ + "$CONFIG_DIR/wezterm/colors/everforest-$VARIANT.lua" \ + "WezTerm theme" + + # Windows Terminal (if on Windows or WSL) + if [[ -n "${WSL_DISTRO_NAME:-}" ]] || command -v wsl.exe >/dev/null 2>&1; then + local wt_dest="$HOME/AppData/Local/Packages/Microsoft.WindowsTerminal_8wekyb3d8bbwe/LocalState" + if [[ -d "$wt_dest" ]]; then + install_file \ + "$SCRIPT_DIR/terminals/windows-terminal/everforest-$VARIANT.json" \ + "$wt_dest/everforest-$VARIANT.json" \ + "Windows Terminal theme" else - log_info "Skipping Alacritty (not installed)" + log_info "Skipping Windows Terminal (config directory not found)" fi + fi - # Kitty - if check_tool "kitty" || check_config_dir "kitty"; then - install_file \ - "$SCRIPT_DIR/terminals/kitty/everforest-$VARIANT.conf" \ - "$CONFIG_DIR/kitty/themes/everforest-$VARIANT.conf" \ - "Kitty theme" - else - log_info "Skipping Kitty (not installed)" - fi - - # WezTerm - if check_tool "wezterm" || check_config_dir "wezterm"; then - install_file \ - "$SCRIPT_DIR/terminals/wezterm/everforest-$VARIANT.lua" \ - "$CONFIG_DIR/wezterm/colors/everforest-$VARIANT.lua" \ - "WezTerm theme" - else - log_info "Skipping WezTerm (not installed)" - fi - - # Windows Terminal (if on Windows or WSL) - if [[ -n "${WSL_DISTRO_NAME:-}" ]] || command -v wsl.exe >/dev/null 2>&1; then - local wt_dest="$HOME/AppData/Local/Packages/Microsoft.WindowsTerminal_8wekyb3d8bbwe/LocalState" - if [[ -d "$wt_dest" ]]; then - install_file \ - "$SCRIPT_DIR/terminals/windows-terminal/everforest-$VARIANT.json" \ - "$wt_dest/everforest-$VARIANT.json" \ - "Windows Terminal theme" - fi - fi - - # Ghostty - if check_tool "ghostty" || check_config_dir "ghostty"; then - install_file \ - "$SCRIPT_DIR/terminals/ghostty/everforest-$VARIANT.conf" \ - "$CONFIG_DIR/ghostty/themes/everforest-$VARIANT.conf" \ - "Ghostty theme" - else - log_info "Skipping Ghostty (not installed)" - fi + # Ghostty + install_tool_config "ghostty" "ghostty" \ + "$SCRIPT_DIR/terminals/ghostty/everforest-$VARIANT.conf" \ + "$CONFIG_DIR/ghostty/themes/everforest-$VARIANT.conf" \ + "Ghostty theme" } # Install editor themes install_editors() { - log_header "Installing Editor Themes ($VARIANT)" + log_header "Installing Editor Themes ($VARIANT)" - # Neovim + # Neovim + install_file \ + "$SCRIPT_DIR/editors/vim-nvim/everforest-$VARIANT.lua" \ + "$CONFIG_DIR/nvim/colors/everforest-$VARIANT.lua" \ + "Neovim theme" + + # VS Code + local vscode_dir="$HOME/.vscode/extensions" + [[ -d "$HOME/.vscode-insiders/extensions" ]] && vscode_dir="$HOME/.vscode-insiders/extensions" + + if [[ -d "$vscode_dir" ]]; then + mkdir -p "$vscode_dir/everforest-themes/themes" install_file \ - "$SCRIPT_DIR/editors/vim-nvim/everforest-$VARIANT.lua" \ - "$CONFIG_DIR/nvim/colors/everforest-$VARIANT.lua" \ - "Neovim theme" + "$SCRIPT_DIR/editors/vscode/everforest-theme-$VARIANT.json" \ + "$vscode_dir/everforest-themes/themes/everforest-$VARIANT.json" \ + "VS Code theme" + fi - # VS Code - local vscode_dir="$HOME/.vscode/extensions" - [[ -d "$HOME/.vscode-insiders/extensions" ]] && vscode_dir="$HOME/.vscode-insiders/extensions" - - if [[ -d "$vscode_dir" ]]; then - mkdir -p "$vscode_dir/everforest-themes/themes" - install_file \ - "$SCRIPT_DIR/editors/vscode/everforest-theme-$VARIANT.json" \ - "$vscode_dir/everforest-themes/themes/everforest-$VARIANT.json" \ - "VS Code theme" + # JetBrains + local jetbrains_config="" + for ide in IntelliJIdea PyCharm WebStorm PhpStorm GoLand RustRover; do + local config_path="$HOME/Library/Application Support/JetBrains/$ide*/colors" + if [[ -d $config_path ]]; then + install_file \ + "$SCRIPT_DIR/editors/jetbrains/everforest-$VARIANT.xml" \ + "$config_path/everforest-$VARIANT.icls" \ + "JetBrains theme" + break fi + done - # JetBrains - local jetbrains_config="" - for ide in IntelliJIdea PyCharm WebStorm PhpStorm GoLand RustRover; do - local config_path="$HOME/Library/Application Support/JetBrains/$ide*/colors" - if [[ -d $config_path ]]; then - install_file \ - "$SCRIPT_DIR/editors/jetbrains/everforest-$VARIANT.xml" \ - "$config_path/everforest-$VARIANT.icls" \ - "JetBrains theme" - break - fi - done + # Zed + install_file \ + "$SCRIPT_DIR/editors/zed/everforest-$VARIANT.json" \ + "$CONFIG_DIR/zed/themes/everforest-$VARIANT.json" \ + "Zed theme" - # Zed + # Sublime Text + local sublime_packages="$HOME/Library/Application Support/Sublime Text/Packages/User" + [[ ! -d "$sublime_packages" ]] && sublime_packages="$HOME/.config/sublime-text/Packages/User" + + if [[ -d "$sublime_packages" ]]; then install_file \ - "$SCRIPT_DIR/editors/zed/everforest-$VARIANT.json" \ - "$CONFIG_DIR/zed/themes/everforest-$VARIANT.json" \ - "Zed theme" - - # Sublime Text - local sublime_packages="$HOME/Library/Application Support/Sublime Text/Packages/User" - [[ ! -d "$sublime_packages" ]] && sublime_packages="$HOME/.config/sublime-text/Packages/User" - - if [[ -d "$sublime_packages" ]]; then - install_file \ - "$SCRIPT_DIR/editors/sublime/everforest-$VARIANT.tmTheme" \ - "$sublime_packages/everforest-$VARIANT.tmTheme" \ - "Sublime Text theme" - fi + "$SCRIPT_DIR/editors/sublime/everforest-$VARIANT.tmTheme" \ + "$sublime_packages/everforest-$VARIANT.tmTheme" \ + "Sublime Text theme" + fi } # Install CLI tools install_cli() { - log_header "Installing CLI Tools ($VARIANT)" + log_header "Installing CLI Tools ($VARIANT)" - # Core shell tools - if check_tool "starship"; then - install_file \ - "$SCRIPT_DIR/cli/starship/starship-$VARIANT.toml" \ - "$CONFIG_DIR/starship/themes/everforest-$VARIANT.toml" \ - "Starship theme" - else - log_info "Skipping Starship prompt (not installed)" - fi + # Core shell tools + install_tool_config "starship" "starship" \ + "$SCRIPT_DIR/cli/starship/starship-$VARIANT.toml" \ + "$CONFIG_DIR/starship/themes/everforest-$VARIANT.toml" \ + "Starship theme" - install_file \ - "$SCRIPT_DIR/cli/fish/everforest-$VARIANT.fish" \ - "$CONFIG_DIR/fish/conf.d/everforest-$VARIANT.fish" \ - "Fish colors" + install_tool_config "fish" "fish" \ + "$SCRIPT_DIR/cli/fish/everforest-$VARIANT.fish" \ + "$CONFIG_DIR/fish/conf.d/everforest-$VARIANT.fish" \ + "Fish colors" - # File and directory tools - install_file \ - "$SCRIPT_DIR/cli/ls_colors/everforest-$VARIANT.sh" \ - "$CONFIG_DIR/dircolors/everforest.sh" \ - "LS_COLORS" + # File and directory tools + install_file \ + "$SCRIPT_DIR/cli/ls_colors/everforest-$VARIANT.sh" \ + "$CONFIG_DIR/dircolors/everforest.sh" \ + "LS_COLORS" - install_file \ - "$SCRIPT_DIR/cli/eza/everforest-$VARIANT.sh" \ - "$CONFIG_DIR/eza/theme.sh" \ - "eza colors" + install_tool_config "eza" "eza" \ + "$SCRIPT_DIR/cli/eza/everforest-$VARIANT.sh" \ + "$CONFIG_DIR/eza/theme.sh" \ + "eza colors" - # Git tools - install_file \ - "$SCRIPT_DIR/cli/delta/gitconfig-$VARIANT.delta" \ - "$CONFIG_DIR/git/everforest-delta" \ - "Git delta" + # Git tools + install_file \ + "$SCRIPT_DIR/cli/delta/gitconfig-$VARIANT.delta" \ + "$CONFIG_DIR/git/everforest-delta" \ + "Git delta" - install_file \ - "$SCRIPT_DIR/cli/lazygit/config-$VARIANT.yml" \ - "$CONFIG_DIR/lazygit/themes/everforest-$VARIANT.yml" \ - "LazyGit theme" + install_tool_config "lazygit" "lazygit" \ + "$SCRIPT_DIR/cli/lazygit/config-$VARIANT.yml" \ + "$CONFIG_DIR/lazygit/themes/everforest-$VARIANT.yml" \ + "LazyGit theme" - install_file \ - "$SCRIPT_DIR/cli/gitui/theme-$VARIANT.ron" \ - "$CONFIG_DIR/gitui/themes/everforest-$VARIANT.ron" \ - "GitUI theme" + install_tool_config "gitui" "gitui" \ + "$SCRIPT_DIR/cli/gitui/theme-$VARIANT.ron" \ + "$CONFIG_DIR/gitui/themes/everforest-$VARIANT.ron" \ + "GitUI theme" - # System monitoring - install_file \ - "$SCRIPT_DIR/cli/htop/htoprc-$VARIANT" \ - "$CONFIG_DIR/htop/themes/everforest-$VARIANT" \ - "htop theme" + # System monitoring + install_tool_config "htop" "htop" \ + "$SCRIPT_DIR/cli/htop/htoprc-$VARIANT" \ + "$CONFIG_DIR/htop/themes/everforest-$VARIANT" \ + "htop theme" - install_file \ - "$SCRIPT_DIR/cli/btop/everforest-$VARIANT.theme" \ - "$CONFIG_DIR/btop/themes/everforest.theme" \ - "btop theme" + install_tool_config "btop" "btop" \ + "$SCRIPT_DIR/cli/btop/everforest-$VARIANT.theme" \ + "$CONFIG_DIR/btop/themes/everforest.theme" \ + "btop theme" - install_file \ - "$SCRIPT_DIR/cli/bottom/bottom-$VARIANT.toml" \ - "$CONFIG_DIR/bottom/themes/everforest-$VARIANT.toml" \ - "bottom theme" + install_tool_config "bottom" "bottom" \ + "$SCRIPT_DIR/cli/bottom/bottom-$VARIANT.toml" \ + "$CONFIG_DIR/bottom/themes/everforest-$VARIANT.toml" \ + "bottom theme" - # Other tools - if check_tool "fzf"; then - install_file \ - "$SCRIPT_DIR/cli/fzf/everforest-$VARIANT.sh" \ - "$CONFIG_DIR/fzf/everforest.sh" \ - "FZF colors" - else - log_info "Skipping FZF colors (not installed)" - fi + # Other tools + install_tool_config "fzf" "fzf" \ + "$SCRIPT_DIR/cli/fzf/everforest-$VARIANT.sh" \ + "$CONFIG_DIR/fzf/everforest.sh" \ + "FZF colors" - install_file \ - "$SCRIPT_DIR/cli/tmux/everforest.tmux-$VARIANT.conf" \ - "$CONFIG_DIR/tmux/themes/everforest.conf" \ - "tmux theme" + install_tool_config "tmux" "tmux" \ + "$SCRIPT_DIR/cli/tmux/everforest.tmux-$VARIANT.conf" \ + "$CONFIG_DIR/tmux/themes/everforest.conf" \ + "tmux theme" } # Install web resources install_web() { - log_header "Installing Web Resources ($VARIANT)" + log_header "Installing Web Resources ($VARIANT)" - local web_dir="$HOME/.everforest-web" - mkdir -p "$web_dir" + local web_dir="$HOME/.everforest-web" + mkdir -p "$web_dir" + install_file \ + "$SCRIPT_DIR/web/css/everforest-$VARIANT.css" \ + "$web_dir/everforest-$VARIANT.css" \ + "CSS theme" + + # Copy demo files + if [[ -f "$SCRIPT_DIR/docs/examples/web-demo.html" ]]; then install_file \ - "$SCRIPT_DIR/web/css/everforest-$VARIANT.css" \ - "$web_dir/everforest-$VARIANT.css" \ - "CSS theme" + "$SCRIPT_DIR/docs/examples/web-demo.html" \ + "$web_dir/demo.html" \ + "Web demo" + fi - # Copy demo files - if [[ -f "$SCRIPT_DIR/docs/examples/web-demo.html" ]]; then - install_file \ - "$SCRIPT_DIR/docs/examples/web-demo.html" \ - "$web_dir/demo.html" \ - "Web demo" - fi - - log_info "Web resources installed to $web_dir" + log_info "Web resources installed to $web_dir" } # Print post-installation instructions print_instructions() { - log_header "Installation Complete!" + log_header "Installation Complete!" - cat <