From 4bc45eec584bfecfd90eae9248bf4801490e60d6 Mon Sep 17 00:00:00 2001 From: "Aaron D. Lee" Date: Thu, 25 Dec 2025 12:05:20 -0500 Subject: [PATCH] Dotfiles update 2025-12-25 12:05 --- dotfiles-refactor.tar.gz | Bin 19876 -> 0 bytes dotfiles-refactor/REFACTORING-GUIDE.md | 258 -------- dotfiles-refactor/bin/dotfiles-compile.sh | 119 ---- dotfiles-refactor/bin/dotfiles-doctor.sh | 256 -------- dotfiles-refactor/bin/dotfiles-stats.sh | 110 ---- dotfiles-refactor/bin/dotfiles-sync.sh | 162 ----- dotfiles-refactor/bin/dotfiles-update.sh | 79 --- dotfiles-refactor/bin/dotfiles-vault.sh | 138 ---- dotfiles-refactor/bin/dotfiles-version.sh | 88 --- dotfiles-refactor/setup/setup-espanso.sh | 208 ------ dotfiles-refactor/setup/setup-wizard.sh | 175 ----- .../zsh/functions/python-templates.zsh | 616 ------------------ dotfiles-refactor/zsh/lib/bootstrap.zsh | 135 ---- dotfiles-refactor/zsh/lib/colors.zsh | 86 --- dotfiles-refactor/zsh/lib/config.zsh | 154 ----- dotfiles-refactor/zsh/lib/utils.zsh | 215 ------ 16 files changed, 2799 deletions(-) delete mode 100644 dotfiles-refactor.tar.gz delete mode 100644 dotfiles-refactor/REFACTORING-GUIDE.md delete mode 100644 dotfiles-refactor/bin/dotfiles-compile.sh delete mode 100644 dotfiles-refactor/bin/dotfiles-doctor.sh delete mode 100644 dotfiles-refactor/bin/dotfiles-stats.sh delete mode 100644 dotfiles-refactor/bin/dotfiles-sync.sh delete mode 100644 dotfiles-refactor/bin/dotfiles-update.sh delete mode 100644 dotfiles-refactor/bin/dotfiles-vault.sh delete mode 100644 dotfiles-refactor/bin/dotfiles-version.sh delete mode 100644 dotfiles-refactor/setup/setup-espanso.sh delete mode 100644 dotfiles-refactor/setup/setup-wizard.sh delete mode 100644 dotfiles-refactor/zsh/functions/python-templates.zsh delete mode 100644 dotfiles-refactor/zsh/lib/bootstrap.zsh delete mode 100644 dotfiles-refactor/zsh/lib/colors.zsh delete mode 100644 dotfiles-refactor/zsh/lib/config.zsh delete mode 100644 dotfiles-refactor/zsh/lib/utils.zsh diff --git a/dotfiles-refactor.tar.gz b/dotfiles-refactor.tar.gz deleted file mode 100644 index 5e5d40a501205831d893622322e59fb456d75463..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19876 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 b`n&$Fzw7V%yZ)}fQ+)p)JsL|_0FVIyaEEoK diff --git a/dotfiles-refactor/REFACTORING-GUIDE.md b/dotfiles-refactor/REFACTORING-GUIDE.md deleted file mode 100644 index 8316e4b..0000000 --- a/dotfiles-refactor/REFACTORING-GUIDE.md +++ /dev/null @@ -1,258 +0,0 @@ -# Dotfiles Refactoring Guide - -This document explains the refactoring changes made to eliminate code duplication and improve maintainability. - -## Summary of Changes - -| Change | Impact | Lines Saved | -|--------|--------|-------------| -| Centralized header with `bootstrap.zsh` | All scripts use one source pattern | ~150 lines | -| Template-driven Python projects | `python-templates.zsh` refactored | ~60 lines | -| Unified config/color loading | Single entry point for dependencies | ~80 lines | - -**Total estimated reduction: ~290 lines of duplicated code** - ---- - -## 1. New File: `zsh/lib/bootstrap.zsh` - -### Purpose -Single entry point for all scripts to source. Handles loading config, colors, and utils in the correct order with proper fallbacks. - -### Usage - -**In bash scripts:** -```bash -#!/usr/bin/env bash -source "${DOTFILES_HOME:-$HOME/.dotfiles}/zsh/lib/bootstrap.zsh" 2>/dev/null || { - # Minimal fallback only if bootstrap unavailable - df_print_header() { echo "=== $1 ==="; } -} -``` - -**In zsh functions:** -```zsh -source "${0:A:h}/../lib/bootstrap.zsh" 2>/dev/null || \ -source "$HOME/.dotfiles/zsh/lib/bootstrap.zsh" 2>/dev/null -``` - -### What It Provides -After sourcing `bootstrap.zsh`, you have access to: -- All `DF_*` color variables -- All `df_print_*` functions -- All `df_*` utility functions -- All config variables from `dotfiles.conf` - ---- - -## 2. Enhanced: `zsh/lib/utils.zsh` - -### New Functions Added - -```zsh -# Build a horizontal line -_df_hline "═" 66 # Returns: ══════════... - -# Print MOTD-style header for scripts -df_print_header "script-name" -# Output: -# ╒══════════════════════════════════════════════════════════════════╕ -# │ ✦ user@hostname script-name Thu Dec 25 14:30 │ -# ╘══════════════════════════════════════════════════════════════════╛ - -# Print simpler header for functions -df_print_func_name "Function Name" -# Output: -# ╒══════════════════════════════════════════════════════════════════╕ -# │ Function Name Thu Dec 25 14:30 │ -# ╘══════════════════════════════════════════════════════════════════╛ - -# Print divider line -df_print_divider -``` - ---- - -## 3. Refactored: `zsh/functions/python-templates.zsh` - -### Before (Duplicated Pattern) -Each function repeated ~15 lines: -```zsh -py-flask() { - _py_check_name "$1" || return 1 - df_print_func_name "Flask Project: $1" - mkdir -p "$1"/{app,tests} - # ... flask-specific setup ... - _py_venv "$1" - _py_gitignore "$1" - _py_git "$1" - df_print_success "Created: $1" - _py_next "$1" -} -``` - -### After (Template-Driven) -```zsh -# Common creation function handles all boilerplate -_py_create_project() { - local name="$1" template="$2" display_name="$3" extra_info="$4" - - _py_check_name "$name" || return 1 - df_print_func_name "${display_name}: ${name}" - mkdir -p "$name" - - # Run template-specific setup - local packages=$("_py_template_${template}" "$name") - - # Common finalization - _py_venv "$name" - [[ -n "$packages" ]] && _py_install "$name" $packages - _py_gitignore "$name" - _py_git "$name" - df_print_success "Created: $name" - _py_next_steps "$name" "$extra_info" -} - -# Each public function is now one line -py-flask() { _py_create_project "$1" "flask" "Flask Project" "Run: python app.py"; } -py-fastapi() { _py_create_project "$1" "fastapi" "FastAPI Project" "Docs: localhost:8000/docs"; } -``` - -### New Features Added -- `py-templates` - List all available templates -- Better pyproject.toml support for CLI projects -- Improved file templates with more comments - ---- - -## 4. Refactored Bin Scripts - -All scripts in `bin/` now follow this pattern: - -```bash -#!/usr/bin/env bash -# ============================================================================ -# Script Name -# ============================================================================ - -# Source bootstrap (provides colors, config, and utility functions) -source "${DOTFILES_HOME:-$HOME/.dotfiles}/zsh/lib/bootstrap.zsh" 2>/dev/null || { - # Minimal fallback if bootstrap unavailable - DF_GREEN=$'\033[0;32m' DF_NC=$'\033[0m' - df_print_header() { echo "=== $1 ==="; } - df_print_success() { echo -e "${DF_GREEN}✓${DF_NC} $1"; } -} - -# Script logic... - -main() { - df_print_header "script-name" - # ... -} - -main "$@" -``` - -### Scripts Updated -- `dotfiles-doctor.sh` -- `dotfiles-sync.sh` -- `dotfiles-update.sh` -- `dotfiles-version.sh` -- `dotfiles-stats.sh` -- `dotfiles-vault.sh` -- `dotfiles-compile.sh` -- `setup/setup-espanso.sh` -- `setup/setup-wizard.sh` - ---- - -## How to Apply These Changes - -### Option 1: Replace Files -Copy the refactored files over your existing ones: - -```bash -# Backup first -cp -r ~/.dotfiles ~/.dotfiles.backup.$(date +%Y%m%d) - -# Copy new lib files -cp /path/to/refactor/zsh/lib/*.zsh ~/.dotfiles/zsh/lib/ - -# Copy new bin scripts -cp /path/to/refactor/bin/*.sh ~/.dotfiles/bin/ - -# Copy new function file -cp /path/to/refactor/zsh/functions/python-templates.zsh ~/.dotfiles/zsh/functions/ - -# Copy new setup scripts -cp /path/to/refactor/setup/*.sh ~/.dotfiles/setup/ -``` - -### Option 2: Gradual Migration -1. First add `bootstrap.zsh` - it won't break anything -2. Update one script at a time to use bootstrap -3. Update `python-templates.zsh` last - ---- - -## Verification - -After applying changes, verify everything works: - -```bash -# Reload shell -source ~/.zshrc - -# Test health check -dfd - -# Test version -dfv - -# Test Python templates -py-templates -py-new test-project -rm -rf test-project - -# Test that headers display correctly -dotfiles-doctor.sh -dotfiles-stats.sh -``` - ---- - -## File Structure After Refactoring - -``` -~/.dotfiles/ -├── zsh/ -│ ├── lib/ -│ │ ├── bootstrap.zsh # NEW: Single entry point -│ │ ├── config.zsh # Loads dotfiles.conf -│ │ ├── colors.zsh # Color definitions -│ │ └── utils.zsh # ENHANCED: Centralized headers -│ └── functions/ -│ └── python-templates.zsh # REFACTORED: Template-driven -├── bin/ -│ ├── dotfiles-doctor.sh # REFACTORED: Uses bootstrap -│ ├── dotfiles-sync.sh # REFACTORED: Uses bootstrap -│ ├── dotfiles-update.sh # REFACTORED: Uses bootstrap -│ ├── dotfiles-version.sh # REFACTORED: Uses bootstrap -│ ├── dotfiles-stats.sh # REFACTORED: Uses bootstrap -│ ├── dotfiles-vault.sh # REFACTORED: Uses bootstrap -│ └── dotfiles-compile.sh # REFACTORED: Uses bootstrap -└── setup/ - ├── setup-espanso.sh # REFACTORED: Uses bootstrap - └── setup-wizard.sh # REFACTORED: Uses bootstrap -``` - ---- - -## Benefits - -1. **Single Source of Truth**: Header formatting defined once in `utils.zsh` -2. **Easier Maintenance**: Change header style in one place, affects all scripts -3. **Consistent Appearance**: All scripts look the same -4. **Smaller Files**: Each bin script is ~30-50 lines shorter -5. **Better Fallbacks**: `bootstrap.zsh` handles missing files gracefully -6. **Template System**: Adding new Python project types is now trivial diff --git a/dotfiles-refactor/bin/dotfiles-compile.sh b/dotfiles-refactor/bin/dotfiles-compile.sh deleted file mode 100644 index 945255c..0000000 --- a/dotfiles-refactor/bin/dotfiles-compile.sh +++ /dev/null @@ -1,119 +0,0 @@ -#!/usr/bin/env zsh -# ============================================================================ -# Dotfiles Compile - Pre-compile zsh files for faster loading -# ============================================================================ - -set -e - -# Source bootstrap -source "${DOTFILES_HOME:-$HOME/.dotfiles}/zsh/lib/bootstrap.zsh" 2>/dev/null || { - DF_GREEN=$'\033[0;32m' DF_YELLOW=$'\033[1;33m' DF_CYAN=$'\033[0;36m' - DF_NC=$'\033[0m' - DOTFILES_HOME="${DOTFILES_HOME:-$HOME/.dotfiles}" - df_print_header() { echo "=== $1 ==="; } - df_print_success() { echo -e "${DF_GREEN}✓${DF_NC} $1"; } -} - -# ============================================================================ -# Functions -# ============================================================================ - -compile_file() { - local file="$1" - - if [[ -f "$file" ]]; then - if [[ ! -f "${file}.zwc" ]] || [[ "$file" -nt "${file}.zwc" ]]; then - if zcompile "$file" 2>/dev/null; then - echo -e "${DF_GREEN}✓${DF_NC} Compiled: ${file##*/}" - else - echo -e "${DF_YELLOW}⚠${DF_NC} Skipped: ${file##*/}" - fi - else - echo -e "${DF_CYAN}○${DF_NC} Current: ${file##*/}" - fi - fi -} - -clean_compiled() { - echo "Removing compiled files..." - - local count=0 - - # Remove .zwc files in dotfiles directory - for zwc in "$DOTFILES_HOME"/**/*.zwc(N); do - rm -f "$zwc" - ((count++)) - done - - # Remove home directory compiled files - rm -f ~/.zshrc.zwc ~/.zshenv.zwc ~/.zprofile.zwc 2>/dev/null - - echo -e "${DF_GREEN}✓${DF_NC} Removed $count compiled files" -} - -compile_all() { - echo -e "${DF_CYAN}Compiling zsh files for faster startup...${DF_NC}" - echo "" - - echo "Core files:" - compile_file ~/.zshrc - compile_file ~/.zshenv - compile_file ~/.zprofile - echo "" - - echo "Dotfiles:" - compile_file "$DOTFILES_HOME/zsh/.zshrc" - compile_file "$DOTFILES_HOME/zsh/aliases.zsh" - - # Lib files - for file in "$DOTFILES_HOME/zsh/lib"/*.zsh(N); do - compile_file "$file" - done - - # Function files - for file in "$DOTFILES_HOME/zsh/functions"/*.zsh(N); do - compile_file "$file" - done - - # Theme files - for file in "$DOTFILES_HOME/zsh/themes"/*.zsh-theme(N); do - compile_file "$file" - done - echo "" - - # Oh-My-Zsh (optional) - if [[ -d ~/.oh-my-zsh ]]; then - echo "Oh-My-Zsh (optional):" - compile_file ~/.oh-my-zsh/oh-my-zsh.sh - echo "" - fi - - echo -e "${DF_GREEN}✓${DF_NC} Compilation complete" - echo "" - echo "To measure startup time:" - echo " time zsh -i -c exit" - echo " hyperfine 'zsh -i -c exit' # More accurate" -} - -show_help() { - echo "Usage: dotfiles-compile.sh [OPTIONS]" - echo "" - echo "Compile zsh files to bytecode for faster shell startup." - echo "" - echo "Options:" - echo " (none) Compile all zsh files" - echo " --clean Remove all compiled (.zwc) files" - echo " --help Show this help" -} - -# ============================================================================ -# Main -# ============================================================================ - -df_print_header "dotfiles-compile" - -case "${1:-}" in - --clean|-c) clean_compiled ;; - --help|-h) show_help ;; - *) compile_all ;; -esac diff --git a/dotfiles-refactor/bin/dotfiles-doctor.sh b/dotfiles-refactor/bin/dotfiles-doctor.sh deleted file mode 100644 index 60c2c16..0000000 --- a/dotfiles-refactor/bin/dotfiles-doctor.sh +++ /dev/null @@ -1,256 +0,0 @@ -#!/usr/bin/env bash -# ============================================================================ -# Dotfiles Health Check (Arch/CachyOS) -# ============================================================================ -# Usage: -# dotfiles-doctor.sh # Run all checks -# dotfiles-doctor.sh --fix # Attempt automatic fixes -# dotfiles-doctor.sh --quick # Quick essential checks only -# ============================================================================ - -# Source bootstrap (provides colors, config, and utility functions) -source "${DOTFILES_HOME:-$HOME/.dotfiles}/zsh/lib/bootstrap.zsh" 2>/dev/null || { - echo "Warning: bootstrap.zsh not found, using fallbacks" - DF_RED=$'\033[0;31m' DF_GREEN=$'\033[0;32m' DF_YELLOW=$'\033[1;33m' - DF_BLUE=$'\033[0;34m' DF_CYAN=$'\033[0;36m' DF_NC=$'\033[0m' - DOTFILES_HOME="${DOTFILES_HOME:-$HOME/.dotfiles}" - df_print_header() { echo "=== $1 ==="; } - df_print_success() { echo -e "${DF_GREEN}✓${DF_NC} $1"; } - df_print_error() { echo -e "${DF_RED}✗${DF_NC} $1" >&2; } - df_print_warning() { echo -e "${DF_YELLOW}⚠${DF_NC} $1"; } -} - -# ============================================================================ -# Parse Arguments -# ============================================================================ - -DO_FIX=false -QUICK_MODE=false - -for arg in "$@"; do - case "$arg" in - --fix) DO_FIX=true ;; - --quick) QUICK_MODE=true ;; - --help|-h) - echo "Usage: dotfiles-doctor.sh [OPTIONS]" - echo "" - echo "Options:" - echo " --fix Attempt automatic fixes for issues" - echo " --quick Run quick essential checks only" - echo " --help Show this help" - exit 0 - ;; - esac -done - -# ============================================================================ -# Tracking Variables -# ============================================================================ - -TOTAL_CHECKS=0 -PASSED_CHECKS=0 -FAILED_CHECKS=0 -WARNING_CHECKS=0 -FIXED_CHECKS=0 - -# ============================================================================ -# Check Helper Functions -# ============================================================================ - -print_section() { echo -e "\n${DF_BLUE}▶${DF_NC} $1"; } - -check_pass() { - ((PASSED_CHECKS++)) - ((TOTAL_CHECKS++)) - echo -e " ${DF_GREEN}✓${DF_NC} $1" -} - -check_fail() { - ((FAILED_CHECKS++)) - ((TOTAL_CHECKS++)) - echo -e " ${DF_RED}✗${DF_NC} $1" -} - -check_warn() { - ((WARNING_CHECKS++)) - ((TOTAL_CHECKS++)) - echo -e " ${DF_YELLOW}⚠${DF_NC} $1" -} - -check_fixed() { - ((FIXED_CHECKS++)) - echo -e " ${DF_CYAN}⚙${DF_NC} Fixed: $1" -} - -# ============================================================================ -# Check Functions -# ============================================================================ - -check_os() { - print_section "Operating System" - - if [[ "$OSTYPE" == "linux-gnu"* ]]; then - if grep -qi "cachyos" /etc/os-release 2>/dev/null; then - check_pass "Running CachyOS" - elif grep -qi "arch" /etc/os-release 2>/dev/null; then - check_pass "Running Arch Linux" - else - check_fail "Not running on Arch/CachyOS" - fi - else - check_fail "Not running on Linux" - fi - - check_pass "Kernel: $(uname -r)" -} - -check_shell() { - print_section "Shell Configuration" - - [[ -f "$HOME/.zshrc" ]] && check_pass "Zsh configuration exists" || check_fail "Zsh configuration missing" - [[ "$SHELL" == *"zsh"* ]] && check_pass "Zsh is default shell" || check_warn "Zsh is not default shell" - - if command -v zsh &>/dev/null; then - check_pass "Zsh version: $(zsh --version | awk '{print $2}')" - fi -} - -check_symlinks() { - print_section "Symlinks" - - local symlinks=( - "$HOME/.zshrc" - "$HOME/.gitconfig" - "$HOME/.vimrc" - "$HOME/.tmux.conf" - ) - - for symlink in "${symlinks[@]}"; do - if [[ -L "$symlink" ]]; then - if [[ -e "$symlink" ]]; then - check_pass "$(basename "$symlink") → $(readlink "$symlink")" - else - check_fail "$(basename "$symlink") is broken symlink" - if [[ "$DO_FIX" == true ]]; then - rm "$symlink" - check_fixed "Removed broken symlink: $(basename "$symlink")" - fi - fi - elif [[ -f "$symlink" ]]; then - check_warn "$(basename "$symlink") is regular file (not symlink)" - fi - done -} - -check_pacman() { - print_section "Package Manager" - - if ! command -v pacman &>/dev/null; then - check_fail "Pacman not found" - return - fi - - check_pass "Pacman available" - - if command -v paru &>/dev/null; then - check_pass "AUR helper: paru" - elif command -v yay &>/dev/null; then - check_pass "AUR helper: yay" - else - check_warn "No AUR helper installed (paru or yay recommended)" - fi -} - -check_optional_tools() { - print_section "Optional Tools" - - local tools=("fzf" "bat" "eza" "tmux" "nvim") - for tool in "${tools[@]}"; do - command -v "$tool" &>/dev/null && check_pass "$tool" || check_warn "$tool not installed" - done -} - -check_dotfiles_dir() { - print_section "Dotfiles Directory" - - if [[ ! -d "$DOTFILES_HOME" ]]; then - check_fail "Dotfiles not found" - return - fi - - check_pass "Dotfiles: $DOTFILES_HOME" - - [[ -f "$DOTFILES_HOME/dotfiles.conf" ]] && check_pass "Config file exists" || check_warn "Config file missing" - [[ -d "$DOTFILES_HOME/.git" ]] && check_pass "Git repo initialized" || check_warn "Not a git repository" - - check_pass "Version: ${DOTFILES_VERSION:-unknown}" - check_pass "Display width: ${DF_WIDTH:-66}" -} - -check_bin_scripts() { - print_section "Bin Scripts" - - local scripts=( - "dotfiles-doctor.sh" - "dotfiles-sync.sh" - "dotfiles-update.sh" - "dotfiles-version.sh" - ) - - for script in "${scripts[@]}"; do - if [[ -x "$HOME/.local/bin/$script" ]]; then - check_pass "$script" - elif [[ -f "$HOME/.local/bin/$script" ]]; then - check_warn "$script exists but not executable" - if [[ "$DO_FIX" == true ]]; then - chmod +x "$HOME/.local/bin/$script" - check_fixed "Made executable: $script" - fi - else - check_fail "$script not linked" - fi - done -} - -# ============================================================================ -# Summary -# ============================================================================ - -print_summary() { - local width="${DF_WIDTH:-66}" - echo "" - printf "${DF_CYAN}─%.0s${DF_NC}" $(seq 1 "$width") - echo "" - - if [[ $FAILED_CHECKS -eq 0 ]]; then - echo -e "${DF_GREEN}✓${DF_NC} All checks passed ($PASSED_CHECKS/$TOTAL_CHECKS)" - else - echo -e "${DF_RED}✗${DF_NC} Issues found: $FAILED_CHECKS failed, $WARNING_CHECKS warnings" - fi - - [[ $FIXED_CHECKS -gt 0 ]] && echo -e "${DF_CYAN}⚙${DF_NC} Auto-fixed: $FIXED_CHECKS issues" - echo "" -} - -# ============================================================================ -# Main -# ============================================================================ - -main() { - df_print_header "dotfiles-doctor" - - check_os - check_pacman - check_shell - check_dotfiles_dir - check_symlinks - - if [[ "$QUICK_MODE" != true ]]; then - check_optional_tools - check_bin_scripts - fi - - print_summary -} - -main "$@" diff --git a/dotfiles-refactor/bin/dotfiles-stats.sh b/dotfiles-refactor/bin/dotfiles-stats.sh deleted file mode 100644 index ae6b51e..0000000 --- a/dotfiles-refactor/bin/dotfiles-stats.sh +++ /dev/null @@ -1,110 +0,0 @@ -#!/usr/bin/env bash -# ============================================================================ -# Dotfiles Shell Analytics (Arch/CachyOS) -# ============================================================================ - -set -e - -# Source bootstrap -source "${DOTFILES_HOME:-$HOME/.dotfiles}/zsh/lib/bootstrap.zsh" 2>/dev/null || { - DF_RED=$'\033[0;31m' DF_GREEN=$'\033[0;32m' DF_YELLOW=$'\033[1;33m' - DF_BLUE=$'\033[0;34m' DF_CYAN=$'\033[0;36m' DF_MAGENTA=$'\033[0;35m' - DF_NC=$'\033[0m' - df_print_header() { echo "=== $1 ==="; } -} - -# ============================================================================ -# Helper Functions -# ============================================================================ - -print_section() { - echo "" - echo -e "${DF_BLUE}▶${DF_NC} $1" - echo -e "${DF_CYAN}─────────────────────────────────────────────────────────────${DF_NC}" -} - -get_history() { - if [[ -f "$HOME/.zsh_history" ]]; then - # Handle zsh extended history format - grep -I "^:" "$HOME/.zsh_history" 2>/dev/null | cut -d';' -f2 || cat "$HOME/.zsh_history" - elif [[ -f "$HOME/.bash_history" ]]; then - cat "$HOME/.bash_history" - fi -} - -# ============================================================================ -# Analytics Functions -# ============================================================================ - -show_dashboard() { - print_section "Command History Dashboard" - - local total=$(get_history | wc -l) - local unique=$(get_history | sort -u | wc -l) - - echo -e " ${DF_CYAN}Total Commands:${DF_NC} $total" - echo -e " ${DF_CYAN}Unique Commands:${DF_NC} $unique" - echo "" - - print_section "Top 15 Commands" - get_history | awk '{print $1}' | sort | uniq -c | sort -rn | head -15 | while read count cmd; do - printf " %-25s ${DF_GREEN}%5d${DF_NC}\n" "$cmd" "$count" - done - echo "" -} - -show_top() { - local count="${1:-20}" - print_section "Top $count Commands" - get_history | awk '{print $1}' | sort | uniq -c | sort -rn | head -"$count" | while read cnt cmd; do - printf " %-25s ${DF_GREEN}%5d${DF_NC}\n" "$cmd" "$cnt" - done -} - -show_git_stats() { - print_section "Git Command Breakdown" - get_history | grep "^git " | awk '{print $2}' | sort | uniq -c | sort -rn | head -10 | while read count subcmd; do - printf " git %-20s ${DF_GREEN}%5d${DF_NC}\n" "$subcmd" "$count" - done -} - -show_dirs() { - print_section "Most Visited Directories" - get_history | grep "^cd " | awk '{print $2}' | sort | uniq -c | sort -rn | head -10 | while read count dir; do - printf " %-30s ${DF_GREEN}%5d${DF_NC}\n" "$dir" "$count" - done -} - -show_help() { - echo "Usage: dotfiles-stats.sh [COMMAND]" - echo "" - echo "Commands:" - echo " dashboard Full analytics dashboard (default)" - echo " top [n] Top N commands (default: 20)" - echo " git Git command breakdown" - echo " dirs Most visited directories" - echo " help Show this help" -} - -# ============================================================================ -# Main -# ============================================================================ - -main() { - df_print_header "dotfiles-stats" - - case "${1:-dashboard}" in - dashboard) show_dashboard ;; - top) show_top "${2:-20}" ;; - git) show_git_stats ;; - dirs) show_dirs ;; - help|--help|-h) show_help ;; - *) - echo "Unknown command: $1" - show_help - exit 1 - ;; - esac -} - -main "$@" diff --git a/dotfiles-refactor/bin/dotfiles-sync.sh b/dotfiles-refactor/bin/dotfiles-sync.sh deleted file mode 100644 index 8dc0364..0000000 --- a/dotfiles-refactor/bin/dotfiles-sync.sh +++ /dev/null @@ -1,162 +0,0 @@ -#!/usr/bin/env bash -# ============================================================================ -# Dotfiles Synchronization (Arch/CachyOS) -# ============================================================================ - -set -e - -# Source bootstrap (provides colors, config, and utility functions) -source "${DOTFILES_HOME:-$HOME/.dotfiles}/zsh/lib/bootstrap.zsh" 2>/dev/null || { - DF_RED=$'\033[0;31m' DF_GREEN=$'\033[0;32m' DF_YELLOW=$'\033[1;33m' - DF_BLUE=$'\033[0;34m' DF_CYAN=$'\033[0;36m' DF_NC=$'\033[0m' - DOTFILES_HOME="${DOTFILES_HOME:-$HOME/.dotfiles}" - df_print_header() { echo "=== $1 ==="; } - df_print_success() { echo -e "${DF_GREEN}✓${DF_NC} $1"; } - df_print_error() { echo -e "${DF_RED}✗${DF_NC} $1" >&2; } - df_print_warning() { echo -e "${DF_YELLOW}⚠${DF_NC} $1"; } -} - -# ============================================================================ -# Helper Functions -# ============================================================================ - -print_status() { echo -e "${DF_CYAN}⎯${DF_NC} $1"; } -print_section() { echo ""; echo -e "${DF_BLUE}▶${DF_NC} $1"; } - -# ============================================================================ -# Sync Functions -# ============================================================================ - -check_git_repo() { - if ! git -C "$DOTFILES_HOME" rev-parse --git-dir > /dev/null 2>&1; then - df_print_error "Not a git repository: $DOTFILES_HOME" - exit 1 - fi -} - -get_sync_status() { - cd "$DOTFILES_HOME" - local local_commits=$(git rev-list --count @{u}..HEAD 2>/dev/null || echo 0) - local remote_commits=$(git rev-list --count HEAD..@{u} 2>/dev/null || echo 0) - echo "$local_commits:$remote_commits" -} - -show_status() { - print_section "Sync Status" - cd "$DOTFILES_HOME" - - print_status "Local branch: $(git rev-parse --abbrev-ref HEAD)" - print_status "Last commit: $(git log -1 --pretty=format:'%h - %s' 2>/dev/null || echo 'N/A')" - - local status=$(get_sync_status) - local local_commits="${status%:*}" - local remote_commits="${status#*:}" - - echo "" - [[ $local_commits -gt 0 ]] && df_print_warning "$local_commits commit(s) ahead of remote" - [[ $remote_commits -gt 0 ]] && df_print_warning "$remote_commits commit(s) behind remote" - [[ $local_commits -eq 0 && $remote_commits -eq 0 ]] && df_print_success "In sync with remote" -} - -show_status_short() { - cd "$DOTFILES_HOME" - local changes=$(git status --porcelain | wc -l) - local status=$(get_sync_status) - local local_commits="${status%:*}" - local remote_commits="${status#*:}" - - if [[ $changes -gt 0 ]]; then - echo -e " ${DF_YELLOW}⚠${DF_NC} Dotfiles: ${changes} local change(s) not pushed" - elif [[ $local_commits -gt 0 ]]; then - echo -e " ${DF_YELLOW}⚠${DF_NC} Dotfiles: ${local_commits} commit(s) not pushed" - elif [[ $remote_commits -gt 0 ]]; then - echo -e " ${DF_YELLOW}⚠${DF_NC} Dotfiles: ${remote_commits} commit(s) behind remote" - fi -} - -pull_changes() { - print_section "Pulling Changes" - cd "$DOTFILES_HOME" - - print_status "Fetching from remote..." - git fetch origin - - if git pull origin; then - df_print_success "Changes pulled" - else - df_print_success "Already up to date" - fi -} - -push_changes() { - local commit_msg="$1" - print_section "Pushing Changes" - cd "$DOTFILES_HOME" - - if ! git status --porcelain | grep -q .; then - df_print_warning "No local changes to push" - return - fi - - print_status "Staging changes..." - git add -A - - if [[ -z "$commit_msg" ]]; then - read -p "Commit message: " commit_msg - [[ -z "$commit_msg" ]] && { df_print_error "Commit cancelled"; return 1; } - fi - - git commit -m "$commit_msg" - git push origin - df_print_success "Changes pushed" -} - -# ============================================================================ -# Main -# ============================================================================ - -main() { - check_git_repo - - case "${1:-status}" in - status) - if [[ "$2" == "-s" || "$2" == "--short" ]]; then - show_status_short - else - df_print_header "dotfiles-sync" - show_status - fi - ;; - push) - df_print_header "dotfiles-sync" - shift - push_changes "$*" - ;; - pull) - df_print_header "dotfiles-sync" - pull_changes - ;; - -s|--short) - show_status_short - ;; - --help|-h) - echo "Usage: dotfiles-sync.sh [COMMAND]" - echo "" - echo "Commands:" - echo " status [-s] Show sync status (default)" - echo " push [message] Push changes to remote" - echo " pull Pull changes from remote" - echo "" - echo "Options:" - echo " -s, --short Short status output" - echo " --help Show this help" - ;; - *) - echo "Unknown command: $1" - echo "Use --help for usage information" - exit 1 - ;; - esac -} - -main "$@" diff --git a/dotfiles-refactor/bin/dotfiles-update.sh b/dotfiles-refactor/bin/dotfiles-update.sh deleted file mode 100644 index 621e9da..0000000 --- a/dotfiles-refactor/bin/dotfiles-update.sh +++ /dev/null @@ -1,79 +0,0 @@ -#!/usr/bin/env bash -# ============================================================================ -# Update Dotfiles Script -# ============================================================================ - -set -e - -# ============================================================================ -# Parse Arguments First (before sourcing, in case we need --help) -# ============================================================================ - -SKIP_DEPS=true -PULL_ONLY=false - -for arg in "$@"; do - case "$arg" in - --skip-deps) SKIP_DEPS=true ;; - --with-deps) SKIP_DEPS=false ;; - --pull-only) PULL_ONLY=true ;; - --help|-h) - echo "Usage: dotfiles-update.sh [OPTIONS]" - echo "" - echo "Options:" - echo " --skip-deps Skip dependency check (default for updates)" - echo " --with-deps Run full dependency check" - echo " --pull-only Only git pull, don't re-run install script" - echo " --help Show this help message" - exit 0 - ;; - esac -done - -# ============================================================================ -# Source Bootstrap -# ============================================================================ - -source "${DOTFILES_HOME:-$HOME/.dotfiles}/zsh/lib/bootstrap.zsh" 2>/dev/null || { - DF_GREEN=$'\033[0;32m' DF_YELLOW=$'\033[1;33m' DF_RED=$'\033[0;31m' - DF_CYAN=$'\033[0;36m' DF_NC=$'\033[0m' - DOTFILES_HOME="${DOTFILES_HOME:-$HOME/.dotfiles}" - DOTFILES_BRANCH="${DOTFILES_BRANCH:-main}" - df_print_header() { echo "=== $1 ==="; } - df_print_success() { echo -e "${DF_GREEN}✓${DF_NC} $1"; } - df_print_error() { echo -e "${DF_RED}✗${DF_NC} $1" >&2; } - df_print_warning() { echo -e "${DF_YELLOW}⚠${DF_NC} $1"; } - df_print_step() { echo -e "${DF_GREEN}==>${DF_NC} $1"; } -} - -# ============================================================================ -# Main -# ============================================================================ - -df_print_header "dotfiles-update" - -if [[ ! -d "$DOTFILES_HOME" ]]; then - df_print_error "Dotfiles directory not found: $DOTFILES_HOME" - exit 1 -fi - -cd "$DOTFILES_HOME" - -df_print_step "Updating dotfiles from repository..." - -if git pull origin "${DOTFILES_BRANCH:-main}"; then - df_print_success "Dotfiles updated successfully" - - if [[ "$PULL_ONLY" == true ]]; then - echo "" - df_print_success "Pull complete (--pull-only mode)" - exit 0 - fi - - echo "" - df_print_success "Update complete!" - echo -e "Reload your shell: ${DF_CYAN}reload${DF_NC} or ${DF_CYAN}source ~/.zshrc${DF_NC}" -else - df_print_error "Failed to update dotfiles" - exit 1 -fi diff --git a/dotfiles-refactor/bin/dotfiles-vault.sh b/dotfiles-refactor/bin/dotfiles-vault.sh deleted file mode 100644 index 3c6f1f8..0000000 --- a/dotfiles-refactor/bin/dotfiles-vault.sh +++ /dev/null @@ -1,138 +0,0 @@ -#!/usr/bin/env bash -# ============================================================================ -# Dotfiles Secrets Vault (Arch/CachyOS) -# ============================================================================ - -set -e - -# Source bootstrap -source "${DOTFILES_HOME:-$HOME/.dotfiles}/zsh/lib/bootstrap.zsh" 2>/dev/null || { - DF_RED=$'\033[0;31m' DF_GREEN=$'\033[0;32m' DF_YELLOW=$'\033[1;33m' - DF_BLUE=$'\033[0;34m' DF_CYAN=$'\033[0;36m' DF_NC=$'\033[0m' - DOTFILES_HOME="${DOTFILES_HOME:-$HOME/.dotfiles}" - df_print_header() { echo "=== $1 ==="; } - df_print_success() { echo -e "${DF_GREEN}✓${DF_NC} $1"; } - df_print_error() { echo -e "${DF_RED}✗${DF_NC} $1" >&2; } -} - -# ============================================================================ -# Configuration -# ============================================================================ - -readonly VAULT_DIR="${DOTFILES_HOME}/vault" -readonly VAULT_FILE="${VAULT_DIR}/secrets.enc" - -# ============================================================================ -# Helper Functions -# ============================================================================ - -print_section() { echo ""; echo -e "${DF_BLUE}▶${DF_NC} $1"; } - -get_cipher() { - if command -v age &>/dev/null; then - echo "age" - elif command -v gpg &>/dev/null; then - echo "gpg" - else - df_print_error "No encryption tool available (install 'age' or 'gpg')" - exit 1 - fi -} - -# ============================================================================ -# Vault Functions -# ============================================================================ - -init_vault() { - print_section "Initializing Vault" - - mkdir -p "$VAULT_DIR" - chmod 700 "$VAULT_DIR" - - if [[ ! -f "$VAULT_FILE" ]]; then - echo "{}" > "$VAULT_FILE" - df_print_success "Vault initialized at $VAULT_DIR" - else - df_print_success "Vault already exists" - fi -} - -vault_list() { - print_section "Stored Secrets" - - if [[ ! -f "$VAULT_FILE" ]]; then - df_print_error "No vault file found. Run: vault init" - return 1 - fi - - local keys=$(cat "$VAULT_FILE" | grep -o '"[^"]*":' | sed 's/"//g;s/:$//') - - if [[ -z "$keys" ]]; then - echo " (no secrets stored)" - else - echo "$keys" | while read key; do - echo -e " ${DF_CYAN}•${DF_NC} $key" - done - fi - echo "" -} - -vault_status() { - print_section "Vault Status" - - if [[ ! -d "$VAULT_DIR" ]]; then - echo -e " ${DF_YELLOW}⚠${DF_NC} Vault not initialized" - echo " Run: vault init" - return - fi - - if [[ ! -f "$VAULT_FILE" ]]; then - echo -e " ${DF_YELLOW}⚠${DF_NC} Vault file not found" - return - fi - - local cipher=$(get_cipher) - local key_count=$(cat "$VAULT_FILE" | grep -o '"[^"]*":' | wc -l) - - echo -e " ${DF_CYAN}Location:${DF_NC} $VAULT_FILE" - echo -e " ${DF_CYAN}Encryption:${DF_NC} $cipher" - echo -e " ${DF_CYAN}Secrets:${DF_NC} $key_count" - echo "" -} - -show_help() { - echo "Usage: dotfiles-vault.sh [COMMAND]" - echo "" - echo "Commands:" - echo " init Initialize the vault" - echo " list, ls List all secret keys" - echo " status Show vault status" - echo " help Show this help" - echo "" - echo "The vault uses 'age' or 'gpg' for encryption." -} - -# ============================================================================ -# Main -# ============================================================================ - -main() { - df_print_header "dotfiles-vault" - - # Auto-init if vault doesn't exist - [[ ! -d "$VAULT_DIR" ]] && init_vault - - case "${1:-list}" in - init) init_vault ;; - list|ls) vault_list ;; - status) vault_status ;; - help|--help|-h) show_help ;; - *) - echo "Unknown command: $1" - show_help - exit 1 - ;; - esac -} - -main "$@" diff --git a/dotfiles-refactor/bin/dotfiles-version.sh b/dotfiles-refactor/bin/dotfiles-version.sh deleted file mode 100644 index 0e88403..0000000 --- a/dotfiles-refactor/bin/dotfiles-version.sh +++ /dev/null @@ -1,88 +0,0 @@ -#!/usr/bin/env bash -# ============================================================================ -# Dotfiles Version Checker -# ============================================================================ - -# ============================================================================ -# Parse Arguments First -# ============================================================================ - -CHECK_ONLY=false - -for arg in "$@"; do - case "$arg" in - --check|-c) CHECK_ONLY=true ;; - --help|-h) - echo "Usage: dotfiles-version.sh [OPTIONS]" - echo "" - echo "Options:" - echo " --check, -c Output version only (for scripts)" - echo " --help Show this help" - exit 0 - ;; - esac -done - -# ============================================================================ -# Source Bootstrap -# ============================================================================ - -source "${DOTFILES_HOME:-$HOME/.dotfiles}/zsh/lib/bootstrap.zsh" 2>/dev/null || { - DF_GREEN=$'\033[0;32m' DF_CYAN=$'\033[0;36m' DF_NC=$'\033[0m' - DOTFILES_HOME="${DOTFILES_HOME:-$HOME/.dotfiles}" - DOTFILES_VERSION="${DOTFILES_VERSION:-unknown}" - DOTFILES_BRANCH="${DOTFILES_BRANCH:-main}" - DF_WIDTH="${DF_WIDTH:-66}" - df_print_header() { echo "=== $1 ==="; } -} - -# ============================================================================ -# Version Info Functions -# ============================================================================ - -get_local_commit() { - if [[ -d "${DOTFILES_HOME}/.git" ]]; then - cd "$DOTFILES_HOME" - git rev-parse --short HEAD 2>/dev/null || echo "unknown" - else - echo "not a git repo" - fi -} - -get_local_date() { - if [[ -d "${DOTFILES_HOME}/.git" ]]; then - cd "$DOTFILES_HOME" - git log -1 --format="%ci" 2>/dev/null | cut -d' ' -f1 || echo "unknown" - else - echo "unknown" - fi -} - -# ============================================================================ -# Main -# ============================================================================ - -main() { - local local_commit=$(get_local_commit) - local local_date=$(get_local_date) - - # Short output for scripts - if [[ "$CHECK_ONLY" == true ]]; then - echo "Version: ${DOTFILES_VERSION} (${local_commit})" - exit 0 - fi - - # Full output - df_print_header "dotfiles-version" - - echo -e "${DF_CYAN}Local:${DF_NC}" - echo -e " Version: ${DF_GREEN}${DOTFILES_VERSION}${DF_NC}" - echo -e " Commit: ${local_commit}" - echo -e " Date: ${local_date}" - echo -e " Path: ${DOTFILES_HOME}" - echo -e " Branch: ${DOTFILES_BRANCH}" - echo -e " Width: ${DF_WIDTH}" - echo "" -} - -main "$@" diff --git a/dotfiles-refactor/setup/setup-espanso.sh b/dotfiles-refactor/setup/setup-espanso.sh deleted file mode 100644 index 2f9a52a..0000000 --- a/dotfiles-refactor/setup/setup-espanso.sh +++ /dev/null @@ -1,208 +0,0 @@ -#!/usr/bin/env bash -# ============================================================================ -# Espanso Setup and Configuration Script -# ============================================================================ - -set -e - -# Source bootstrap -source "${DOTFILES_HOME:-$HOME/.dotfiles}/zsh/lib/bootstrap.zsh" 2>/dev/null || { - DF_GREEN=$'\033[0;32m' DF_YELLOW=$'\033[1;33m' DF_RED=$'\033[0;31m' - DF_BLUE=$'\033[0;34m' DF_CYAN=$'\033[0;36m' DF_NC=$'\033[0m' - DOTFILES_HOME="${DOTFILES_HOME:-$HOME/.dotfiles}" - df_print_header() { echo "=== $1 ==="; } - df_print_success() { echo -e "${DF_GREEN}✓${DF_NC} $1"; } - df_print_error() { echo -e "${DF_RED}✗${DF_NC} $1" >&2; } - df_print_warning() { echo -e "${DF_YELLOW}⚠${DF_NC} $1"; } - df_print_step() { echo -e "${DF_GREEN}==>${DF_NC} $1"; } -} - -# ============================================================================ -# Helper Functions -# ============================================================================ - -ask_yes_no() { - local prompt="$1" - local default="${2:-y}" - local yn_prompt="[Y/n]" - [[ "$default" == "n" ]] && yn_prompt="[y/N]" - - read -p "$prompt $yn_prompt: " response - response=${response:-$default} - [[ "$response" =~ ^[Yy]$ ]] -} - -# ============================================================================ -# Espanso Functions -# ============================================================================ - -check_espanso() { - if ! command -v espanso &>/dev/null; then - df_print_error "espanso is not installed" - echo "Install with: paru -S espanso-wayland # or espanso-x11" - exit 1 - fi - df_print_success "espanso installed: $(espanso --version)" -} - -show_espanso_status() { - df_print_step "Checking espanso status" - - if espanso status 2>/dev/null | grep -q "running"; then - df_print_success "espanso service is running" - else - df_print_warning "espanso service is not running" - if ask_yes_no "Start espanso service?"; then - espanso service start - df_print_success "espanso service started" - fi - fi -} - -personalize_config() { - df_print_step "Personalizing espanso configuration" - - local personal_file="$HOME/.config/espanso/match/personal.yml" - - if [[ ! -f "$personal_file" ]]; then - df_print_warning "Personal config not found, creating from template..." - mkdir -p "$(dirname "$personal_file")" - - cat > "$personal_file" << 'EOF' -# ============================================================================ -# Personal Espanso Snippets -# ============================================================================ - -matches: - - trigger: "..myemail" - replace: "your.email@example.com" - - - trigger: "..myname" - replace: "Your Full Name" - - - trigger: "..myphone" - replace: "+1 (555) 123-4567" - - - trigger: "..myweb" - replace: "https://yourwebsite.com" - - - trigger: "..mygithub" - replace: "https://github.com/yourusername" - - - trigger: "..sig" - replace: | - Best regards, - Your Full Name - your.email@example.com -EOF - df_print_success "Created personal.yml template" - fi - - echo "" - echo "Personalizing your espanso configuration" - echo "(Press Enter to keep existing values)" - echo "" - - # Get current values or use config defaults - local fullname="${USER_FULLNAME:-}" - local email="${USER_EMAIL:-}" - local phone="${USER_PHONE:-}" - local website="${USER_WEBSITE:-}" - local github="${USER_GITHUB:-}" - - [[ -z "$fullname" ]] && read -p "Your full name: " fullname - [[ -z "$email" ]] && read -p "Your email: " email - [[ -z "$phone" ]] && read -p "Your phone (optional): " phone - [[ -z "$website" ]] && read -p "Your website (optional): " website - [[ -z "$github" ]] && read -p "Your GitHub username (optional): " github - - # Create backup - cp "$personal_file" "$personal_file.backup" - - # Update values if provided - [[ -n "$email" ]] && sed -i "s/your.email@example.com/$email/g" "$personal_file" - [[ -n "$fullname" ]] && sed -i "s/Your Full Name/$fullname/g" "$personal_file" - [[ -n "$phone" ]] && sed -i "s/+1 (555) 123-4567/$phone/g" "$personal_file" - [[ -n "$website" ]] && sed -i "s|https://yourwebsite.com|$website|g" "$personal_file" - [[ -n "$github" ]] && sed -i "s/yourusername/$github/g" "$personal_file" - - df_print_success "Personal configuration updated!" - df_print_warning "Backup saved to: $personal_file.backup" -} - -install_packages() { - df_print_step "Installing espanso packages" - - echo "" - echo "Available packages:" - echo " 1. emoji - Emoji snippets (:smile: → 😊)" - echo " 2. greek-letters - Greek letters (:alpha: → α)" - echo " 3. math - Math symbols (:sum: → ∑)" - echo "" - - ask_yes_no "Install emoji package?" && { - espanso install emoji --force 2>/dev/null - df_print_success "Emoji package installed" - } - - ask_yes_no "Install greek-letters package?" && { - espanso install greek-letters --force 2>/dev/null - df_print_success "Greek letters package installed" - } - - ask_yes_no "Install math package?" && { - espanso install math --force 2>/dev/null - df_print_success "Math package installed" - } -} - -show_usage_tips() { - df_print_step "Usage tips" - - cat << EOF - -${DF_GREEN}Espanso Quick Start:${DF_NC} - -${DF_YELLOW}Toggle on/off:${DF_NC} ALT+SHIFT+E -${DF_YELLOW}Search menu:${DF_NC} ALT+SPACE - -${DF_YELLOW}Basic triggers:${DF_NC} - ..date → Current date (YYYY-MM-DD) - ..time → Current time (HH:MM:SS) - ..shrug → ¯\\_(ツ)_/¯ - ..myemail → Your email - -${DF_YELLOW}Commands:${DF_NC} - espanso status Check if running - espanso restart Restart service - espanso log View logs - -EOF -} - -# ============================================================================ -# Main -# ============================================================================ - -main() { - df_print_header "setup-espanso" - - check_espanso - show_espanso_status - - echo "" - ask_yes_no "Personalize your configuration?" && personalize_config - - echo "" - ask_yes_no "Install additional packages?" && install_packages - - echo "" - show_usage_tips - - echo "" - df_print_success "Espanso setup complete!" - echo "" - echo "Try typing ${DF_YELLOW}..date${DF_NC} in any application to test!" -} - -main "$@" diff --git a/dotfiles-refactor/setup/setup-wizard.sh b/dotfiles-refactor/setup/setup-wizard.sh deleted file mode 100644 index 0a7e8c2..0000000 --- a/dotfiles-refactor/setup/setup-wizard.sh +++ /dev/null @@ -1,175 +0,0 @@ -#!/usr/bin/env bash -# ============================================================================ -# Dotfiles Interactive Setup Wizard -# ============================================================================ - -set -e - -# Source bootstrap -source "${DOTFILES_HOME:-$HOME/.dotfiles}/zsh/lib/bootstrap.zsh" 2>/dev/null || { - DF_GREEN=$'\033[0;32m' DF_YELLOW=$'\033[1;33m' DF_RED=$'\033[0;31m' - DF_BLUE=$'\033[0;34m' DF_CYAN=$'\033[0;36m' DF_NC=$'\033[0m' - DF_BOLD=$'\033[1m' DF_DIM=$'\033[2m' - DOTFILES_HOME="${DOTFILES_HOME:-$HOME/.dotfiles}" - DOTFILES_VERSION="${DOTFILES_VERSION:-1.0.0}" - DF_WIDTH="${DF_WIDTH:-66}" - df_print_header() { echo "=== $1 ==="; } - df_print_success() { echo -e "${DF_GREEN}✓${DF_NC} $1"; } -} - -# ============================================================================ -# Gum Detection (for prettier TUI) -# ============================================================================ - -HAS_GUM=false -command -v gum &>/dev/null && HAS_GUM=true - -wizard_confirm() { - local prompt="$1" - local default="${2:-yes}" - - if [[ "$HAS_GUM" == true ]]; then - if [[ "$default" == "yes" ]]; then - gum confirm --default=yes "$prompt" - else - gum confirm --default=no "$prompt" - fi - else - local yn_prompt="[Y/n]" - [[ "$default" == "no" ]] && yn_prompt="[y/N]" - read -p "$prompt $yn_prompt: " response - response=${response:-${default:0:1}} - [[ "$response" =~ ^[Yy] ]] - fi -} - -wizard_input() { - local prompt="$1" - local default="$2" - - if [[ "$HAS_GUM" == true ]]; then - gum input --placeholder "$default" --value "$default" --prompt "$prompt: " - else - read -p "$prompt [$default]: " response - echo "${response:-$default}" - fi -} - -wizard_choose() { - local prompt="$1" - shift - local options=("$@") - - if [[ "$HAS_GUM" == true ]]; then - printf '%s\n' "${options[@]}" | gum choose --header "$prompt" - else - echo "$prompt" - local i=1 - for opt in "${options[@]}"; do - echo " $i) $opt" - ((i++)) - done - read -p "Choice [1]: " choice - choice=${choice:-1} - echo "${options[$((choice-1))]}" - fi -} - -# ============================================================================ -# Wizard Steps -# ============================================================================ - -step_welcome() { - clear - df_print_header "setup-wizard" - - echo -e "${DF_BOLD}Welcome to Dotfiles Setup Wizard${DF_NC}" - echo -e "${DF_DIM}Version: $DOTFILES_VERSION | Display Width: $DF_WIDTH${DF_NC}" - echo "" - - wizard_confirm "Ready to begin?" || { - echo "Setup cancelled." - exit 0 - } -} - -step_user_info() { - echo "" - echo -e "${DF_BLUE}▶${DF_NC} Personal Information" - echo "" - - USER_FULLNAME=$(wizard_input "Full Name" "${USER_FULLNAME:-}") - USER_EMAIL=$(wizard_input "Email" "${USER_EMAIL:-}") - USER_GITHUB=$(wizard_input "GitHub Username" "${USER_GITHUB:-}") -} - -step_features() { - echo "" - echo -e "${DF_BLUE}▶${DF_NC} Feature Selection" - echo "" - - MOTD_STYLE=$(wizard_choose "MOTD Style:" "compact" "mini" "full" "none") - - wizard_confirm "Enable smart suggestions (typo correction)?" && ENABLE_SMART_SUGGESTIONS="true" || ENABLE_SMART_SUGGESTIONS="false" - wizard_confirm "Enable command palette (Ctrl+Space)?" && ENABLE_COMMAND_PALETTE="true" || ENABLE_COMMAND_PALETTE="false" -} - -step_summary() { - echo "" - echo -e "${DF_GREEN}✓${DF_NC} Configuration Summary" - echo "" - echo " Name: $USER_FULLNAME" - echo " Email: $USER_EMAIL" - echo " GitHub: $USER_GITHUB" - echo " MOTD Style: $MOTD_STYLE" - echo " Smart Suggestions: $ENABLE_SMART_SUGGESTIONS" - echo " Command Palette: $ENABLE_COMMAND_PALETTE" - echo "" - - if wizard_confirm "Save this configuration?"; then - save_config - df_print_success "Configuration saved!" - else - echo "Configuration not saved." - fi -} - -save_config() { - local config_file="$DOTFILES_HOME/dotfiles.conf" - - # Update values in config file - if [[ -f "$config_file" ]]; then - sed -i "s/^USER_FULLNAME=.*/USER_FULLNAME=\"$USER_FULLNAME\"/" "$config_file" - sed -i "s/^USER_EMAIL=.*/USER_EMAIL=\"$USER_EMAIL\"/" "$config_file" - sed -i "s/^USER_GITHUB=.*/USER_GITHUB=\"$USER_GITHUB\"/" "$config_file" - sed -i "s/^MOTD_STYLE=.*/MOTD_STYLE=\"$MOTD_STYLE\"/" "$config_file" - sed -i "s/^ENABLE_SMART_SUGGESTIONS=.*/ENABLE_SMART_SUGGESTIONS=\"$ENABLE_SMART_SUGGESTIONS\"/" "$config_file" - sed -i "s/^ENABLE_COMMAND_PALETTE=.*/ENABLE_COMMAND_PALETTE=\"$ENABLE_COMMAND_PALETTE\"/" "$config_file" - fi -} - -step_next() { - echo "" - df_print_success "Setup Complete!" - echo "" - echo -e "${DF_DIM}Next steps:${DF_NC}" - echo " 1. Reload your shell: source ~/.zshrc" - echo " 2. Run health check: dfd" - echo " 3. Explore commands: dotfiles-cli help" - echo "" -} - -# ============================================================================ -# Main -# ============================================================================ - -main() { - step_welcome - step_user_info - step_features - step_summary - step_next -} - -# Only run if executed directly (not sourced) -[[ "${BASH_SOURCE[0]}" == "${0}" ]] && main "$@" diff --git a/dotfiles-refactor/zsh/functions/python-templates.zsh b/dotfiles-refactor/zsh/functions/python-templates.zsh deleted file mode 100644 index 95d396b..0000000 --- a/dotfiles-refactor/zsh/functions/python-templates.zsh +++ /dev/null @@ -1,616 +0,0 @@ -# ============================================================================ -# Python Project Template Functions -# ============================================================================ -# Template-driven project scaffolding for Python applications. -# Eliminates code duplication by using a common creation function. -# ============================================================================ - -# Source bootstrap (handles all dependencies) -source "${0:A:h}/../lib/bootstrap.zsh" 2>/dev/null || \ -source "$HOME/.dotfiles/zsh/lib/bootstrap.zsh" 2>/dev/null - -# ============================================================================ -# Configuration -# ============================================================================ - -typeset -g PY_PYTHON="${PY_PYTHON:-python3}" -typeset -g PY_VENV="${PY_VENV:-venv}" -typeset -g PY_GIT_INIT="${PY_GIT_INIT:-true}" - -# ============================================================================ -# Internal Helper Functions -# ============================================================================ - -# Validate project name and ensure directory doesn't exist -_py_check_name() { - [[ -z "$1" ]] && { df_print_warning "Project name required"; return 1; } - [[ -d "$1" ]] && { df_print_warning "Directory '$1' already exists"; return 1; } - return 0 -} - -# Create and activate virtual environment -_py_venv() { - local project_dir="$1" - df_print_step "Creating virtual environment" - "$PY_PYTHON" -m venv "$project_dir/$PY_VENV" - df_print_success "Created: $PY_VENV" -} - -# Install packages into project's venv -_py_install() { - local project_dir="$1" - shift - local packages=("$@") - - [[ ${#packages[@]} -eq 0 ]] && return 0 - - df_print_step "Installing: ${packages[*]}" - "$project_dir/$PY_VENV/bin/pip" install "${packages[@]}" -q -} - -# Create standard .gitignore for Python projects -_py_gitignore() { - local project_dir="$1" - cat > "$project_dir/.gitignore" << 'EOF' -# Python -__pycache__/ -*.py[cod] -*$py.class -*.so -.Python -build/ -develop-eggs/ -dist/ -downloads/ -eggs/ -.eggs/ -lib/ -lib64/ -parts/ -sdist/ -var/ -wheels/ -*.egg-info/ -.installed.cfg -*.egg - -# Virtual environments -venv/ -.venv/ -ENV/ -env/ - -# IDE -.idea/ -.vscode/ -*.swp -*.swo - -# Testing -.pytest_cache/ -.coverage -htmlcov/ -.tox/ -.nox/ - -# Type checking -.mypy_cache/ -.dmypy.json - -# Environment -.env -.env.* -*.log - -# Distribution -*.manifest -*.spec -EOF - df_print_success "Created .gitignore" -} - -# Initialize git repository -_py_git() { - local project_dir="$1" - [[ "$PY_GIT_INIT" != "true" ]] && return 0 - - ( - cd "$project_dir" - git init -q - git add . - git commit -q -m "Initial commit" - ) - df_print_success "Git initialized" -} - -# Print next steps for user -_py_next_steps() { - local project_dir="$1" - local extra_info="$2" - - echo "" - df_print_section "Next steps" - df_print_indent "cd $project_dir" - df_print_indent "source $PY_VENV/bin/activate" - [[ -n "$extra_info" ]] && df_print_indent "$extra_info" -} - -# ============================================================================ -# Template Definitions -# ============================================================================ -# Each template function creates type-specific files and returns packages to install - -_py_template_basic() { - local name="$1" - - # Create directory structure - mkdir -p "$name"/{src,tests} - touch "$name/src/__init__.py" "$name/tests/__init__.py" - - # Create main.py - cat > "$name/src/main.py" << 'EOF' -#!/usr/bin/env python3 -"""Main entry point.""" - - -def main(): - """Main function.""" - print("Hello, World!") - - -if __name__ == "__main__": - main() -EOF - - # Create requirements.txt - cat > "$name/requirements.txt" << 'EOF' -# Project dependencies -# Add your dependencies here -EOF - - # Return packages to install (none for basic) - echo "" -} - -_py_template_flask() { - local name="$1" - - # Create directory structure - mkdir -p "$name"/{app/{templates,static/css},tests} - - # Create app/__init__.py - cat > "$name/app/__init__.py" << 'EOF' -"""Flask application factory.""" -from flask import Flask - - -def create_app(config_name=None): - """Create and configure the Flask application.""" - app = Flask(__name__) - - # Load configuration - app.config.from_mapping( - SECRET_KEY='dev', - DEBUG=True, - ) - - # Register blueprints - from app.routes import main - app.register_blueprint(main) - - return app -EOF - - # Create app/routes.py - cat > "$name/app/routes.py" << 'EOF' -"""Main application routes.""" -from flask import Blueprint, render_template - -main = Blueprint('main', __name__) - - -@main.route('/') -def index(): - """Home page.""" - return render_template('index.html') - - -@main.route('/health') -def health(): - """Health check endpoint.""" - return {'status': 'ok'} -EOF - - # Create template - cat > "$name/app/templates/index.html" << 'EOF' - - - - - - Flask App - - - -

Welcome to Flask

-

Your application is running!

- - -EOF - - # Create basic CSS - cat > "$name/app/static/css/style.css" << 'EOF' -body { - font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; - max-width: 800px; - margin: 0 auto; - padding: 2rem; -} -EOF - - # Create run script - cat > "$name/app.py" << 'EOF' -#!/usr/bin/env python3 -"""Application entry point.""" -from app import create_app - -app = create_app() - -if __name__ == '__main__': - app.run(debug=True, host='0.0.0.0', port=5000) -EOF - - # Create requirements.txt - cat > "$name/requirements.txt" << 'EOF' -Flask>=3.0.0 -python-dotenv>=1.0.0 -EOF - - # Return packages to install - echo "flask python-dotenv" -} - -_py_template_fastapi() { - local name="$1" - - # Create directory structure - mkdir -p "$name"/{app/{routers,models},tests} - touch "$name/app/__init__.py" "$name/app/routers/__init__.py" "$name/app/models/__init__.py" - - # Create app/main.py - cat > "$name/app/main.py" << 'EOF' -"""FastAPI application.""" -from fastapi import FastAPI -from fastapi.middleware.cors import CORSMiddleware - -app = FastAPI( - title="FastAPI App", - description="A FastAPI application", - version="0.1.0", -) - -# Configure CORS -app.add_middleware( - CORSMiddleware, - allow_origins=["*"], - allow_credentials=True, - allow_methods=["*"], - allow_headers=["*"], -) - - -@app.get("/") -async def root(): - """Root endpoint.""" - return {"message": "Hello, World!"} - - -@app.get("/health") -async def health(): - """Health check endpoint.""" - return {"status": "ok"} -EOF - - # Create run script - cat > "$name/run.py" << 'EOF' -#!/usr/bin/env python3 -"""Development server entry point.""" -import uvicorn - -if __name__ == "__main__": - uvicorn.run( - "app.main:app", - host="0.0.0.0", - port=8000, - reload=True, - ) -EOF - - # Create requirements.txt - cat > "$name/requirements.txt" << 'EOF' -fastapi>=0.109.0 -uvicorn[standard]>=0.27.0 -python-dotenv>=1.0.0 -EOF - - # Return packages to install - echo "fastapi uvicorn python-dotenv" -} - -_py_template_cli() { - local name="$1" - local pkg_name="${name//-/_}" # Replace hyphens with underscores for Python - - # Create directory structure - mkdir -p "$name"/{src/"$pkg_name",tests} - - # Create package __init__.py - cat > "$name/src/$pkg_name/__init__.py" << EOF -"""${name} - A command-line tool.""" -__version__ = "0.1.0" -EOF - - # Create CLI entry point - cat > "$name/src/$pkg_name/cli.py" << 'EOF' -#!/usr/bin/env python3 -"""Command-line interface.""" -import click - - -@click.group() -@click.version_option() -def cli(): - """A command-line tool.""" - pass - - -@cli.command() -@click.argument('name', default='World') -def greet(name): - """Greet someone by name.""" - click.echo(f"Hello, {name}!") - - -@cli.command() -@click.option('--verbose', '-v', is_flag=True, help='Enable verbose output') -def info(verbose): - """Show application information.""" - click.echo("CLI Application v0.1.0") - if verbose: - click.echo("Built with Click") - - -if __name__ == '__main__': - cli() -EOF - - # Create pyproject.toml for modern packaging - cat > "$name/pyproject.toml" << EOF -[build-system] -requires = ["setuptools>=61.0"] -build-backend = "setuptools.build_meta" - -[project] -name = "$name" -version = "0.1.0" -description = "A command-line tool" -readme = "README.md" -requires-python = ">=3.8" -dependencies = [ - "click>=8.1.0", -] - -[project.scripts] -$name = "${pkg_name}.cli:cli" - -[project.optional-dependencies] -dev = [ - "pytest>=7.0", - "pytest-cov", -] -EOF - - # Create requirements.txt (for compatibility) - cat > "$name/requirements.txt" << 'EOF' -click>=8.1.0 -EOF - - # Create README - cat > "$name/README.md" << EOF -# ${name} - -A command-line tool. - -## Installation - -\`\`\`bash -pip install -e . -\`\`\` - -## Usage - -\`\`\`bash -${name} --help -${name} greet World -\`\`\` -EOF - - # Return packages to install - echo "click" -} - -_py_template_data() { - local name="$1" - - # Create directory structure - mkdir -p "$name"/{notebooks,data/{raw,processed},src,tests} - touch "$name/src/__init__.py" - - # Create main analysis script - cat > "$name/src/analysis.py" << 'EOF' -#!/usr/bin/env python3 -"""Data analysis module.""" -import pandas as pd -import numpy as np - - -def load_data(filepath): - """Load data from CSV file.""" - return pd.read_csv(filepath) - - -def basic_stats(df): - """Calculate basic statistics.""" - return df.describe() - - -if __name__ == "__main__": - print("Data Science Project") - print(f"NumPy version: {np.__version__}") - print(f"Pandas version: {pd.__version__}") -EOF - - # Create sample notebook - cat > "$name/notebooks/01_exploration.ipynb" << 'EOF' -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": ["# Data Exploration\n", "\n", "Initial data exploration notebook."] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": ["import pandas as pd\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "\n", "%matplotlib inline"] - } - ], - "metadata": { - "kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, - "language_info": {"name": "python", "version": "3.10.0"} - }, - "nbformat": 4, - "nbformat_minor": 4 -} -EOF - - # Create requirements.txt - cat > "$name/requirements.txt" << 'EOF' -pandas>=2.0.0 -numpy>=1.24.0 -matplotlib>=3.7.0 -seaborn>=0.12.0 -jupyter>=1.0.0 -scikit-learn>=1.3.0 -EOF - - # Create .gitkeep files - touch "$name/data/raw/.gitkeep" "$name/data/processed/.gitkeep" - - # Return packages to install - echo "pandas numpy matplotlib seaborn jupyter scikit-learn" -} - -# ============================================================================ -# Main Project Creation Function -# ============================================================================ - -_py_create_project() { - local name="$1" - local template="$2" - local display_name="$3" - local extra_info="$4" - - # Validate - _py_check_name "$name" || return 1 - - # Print header - df_print_func_name "${display_name}: ${name}" - - # Create base directory - mkdir -p "$name" - - # Run template-specific setup and capture packages - local packages - packages=$("_py_template_${template}" "$name") - - # Common setup steps - _py_venv "$name" - - # Install template-specific packages - if [[ -n "$packages" ]]; then - _py_install "$name" $packages - fi - - # Finalization - _py_gitignore "$name" - _py_git "$name" - - df_print_success "Created: $name" - _py_next_steps "$name" "$extra_info" -} - -# ============================================================================ -# Public API Functions -# ============================================================================ - -py-new() { - _py_create_project "$1" "basic" "Python Project" -} - -py-flask() { - _py_create_project "$1" "flask" "Flask Project" "Run: python app.py" -} - -py-fastapi() { - _py_create_project "$1" "fastapi" "FastAPI Project" "Run: python run.py | Docs: http://localhost:8000/docs" -} - -py-cli() { - _py_create_project "$1" "cli" "CLI Project" "Install: pip install -e ." -} - -py-data() { - _py_create_project "$1" "data" "Data Science Project" "Start Jupyter: jupyter notebook" -} - -# Quick venv activation helper -venv() { - local venv_dirs=("venv" ".venv" "env" ".env") - for dir in "${venv_dirs[@]}"; do - if [[ -f "$dir/bin/activate" ]]; then - source "$dir/bin/activate" - df_print_success "Activated: $dir" - return 0 - fi - done - df_print_error "No virtual environment found" - df_print_info "Create one with: python -m venv venv" - return 1 -} - -# List available templates -py-templates() { - df_print_func_name "Python Project Templates" - echo "" - df_print_indent "py-new Basic Python project" - df_print_indent "py-flask Flask web application" - df_print_indent "py-fastapi FastAPI REST API" - df_print_indent "py-cli CLI tool with Click" - df_print_indent "py-data Data science project" - echo "" - df_print_info "Example: py-flask mywebapp" -} - -# ============================================================================ -# Aliases -# ============================================================================ - -alias pynew='py-new' -alias pyflask='py-flask' -alias pyfast='py-fastapi' -alias pycli='py-cli' -alias pydata='py-data' -alias pytemplates='py-templates' diff --git a/dotfiles-refactor/zsh/lib/bootstrap.zsh b/dotfiles-refactor/zsh/lib/bootstrap.zsh deleted file mode 100644 index 5868b21..0000000 --- a/dotfiles-refactor/zsh/lib/bootstrap.zsh +++ /dev/null @@ -1,135 +0,0 @@ -# ============================================================================ -# Dotfiles Bootstrap - Single Entry Point -# ============================================================================ -# This is the ONE file to source in all scripts and functions. -# It handles loading config, colors, and utils in the correct order with -# proper fallbacks. -# -# Usage in zsh functions: -# source "${0:A:h}/../lib/bootstrap.zsh" -# -# Usage in bash scripts: -# source "${DOTFILES_HOME:-$HOME/.dotfiles}/zsh/lib/bootstrap.zsh" -# -# After sourcing, you have access to: -# - All DF_* color variables -# - All df_print_* functions -# - All df_* utility functions -# - All config variables from dotfiles.conf -# ============================================================================ - -# Prevent double-sourcing (works in both bash and zsh) -[[ -n "$_DF_BOOTSTRAP_LOADED" ]] && return 0 - -# ============================================================================ -# Determine Dotfiles Root -# ============================================================================ - -_df_find_root() { - # Check common locations in order of preference - local locations=( - "${DOTFILES_DIR}" - "${DOTFILES_HOME}" - "$HOME/.dotfiles" - ) - - for loc in "${locations[@]}"; do - [[ -n "$loc" && -d "$loc" && -f "$loc/dotfiles.conf" ]] && { - echo "$loc" - return 0 - } - done - - # Fallback: try to find from script location (zsh) - if [[ -n "$ZSH_VERSION" ]]; then - local script_dir="${0:A:h}" - # Walk up looking for dotfiles.conf - while [[ "$script_dir" != "/" ]]; do - [[ -f "$script_dir/dotfiles.conf" ]] && { echo "$script_dir"; return 0; } - script_dir="${script_dir:h}" - done - fi - - # Last resort - echo "$HOME/.dotfiles" -} - -# Set the root directory -typeset -g _DF_ROOT="$(_df_find_root)" -typeset -g DOTFILES_DIR="$_DF_ROOT" -typeset -g DOTFILES_HOME="$_DF_ROOT" - -# ============================================================================ -# Source Core Files (in correct order) -# ============================================================================ - -# 1. Config first (sets DF_WIDTH, MOTD_STYLE, etc.) -if [[ -f "$_DF_ROOT/zsh/lib/config.zsh" ]]; then - source "$_DF_ROOT/zsh/lib/config.zsh" -else - # Minimal fallback config - typeset -g DOTFILES_VERSION="${DOTFILES_VERSION:-1.0.0}" - typeset -g DF_WIDTH="${DF_WIDTH:-66}" - typeset -g MOTD_STYLE="${MOTD_STYLE:-compact}" - typeset -g DOTFILES_BRANCH="${DOTFILES_BRANCH:-main}" -fi - -# 2. Colors second -if [[ -f "$_DF_ROOT/zsh/lib/colors.zsh" ]]; then - source "$_DF_ROOT/zsh/lib/colors.zsh" -else - # Minimal fallback colors - typeset -g DF_RED=$'\033[0;31m' - typeset -g DF_GREEN=$'\033[0;32m' - typeset -g DF_YELLOW=$'\033[1;33m' - typeset -g DF_BLUE=$'\033[0;34m' - typeset -g DF_CYAN=$'\033[0;36m' - typeset -g DF_NC=$'\033[0m' - typeset -g DF_GREY=$'\033[38;5;242m' - typeset -g DF_LIGHT_BLUE=$'\033[38;5;39m' - typeset -g DF_LIGHT_GREEN=$'\033[38;5;82m' - typeset -g DF_BOLD=$'\033[1m' - typeset -g DF_DIM=$'\033[2m' -fi - -# 3. Utils last (depends on config and colors) -if [[ -f "$_DF_ROOT/zsh/lib/utils.zsh" ]]; then - source "$_DF_ROOT/zsh/lib/utils.zsh" -fi - -# ============================================================================ -# Ensure Critical Functions Exist -# ============================================================================ -# If utils.zsh failed to load, provide minimal implementations - -if ! declare -f df_print_header &>/dev/null; then - df_print_header() { - local name="${1:-script}" - echo "" - echo "=== ${name} ===" - echo "" - } -fi - -if ! declare -f df_print_func_name &>/dev/null; then - df_print_func_name() { - echo "--- ${1:-function} ---" - } -fi - -if ! declare -f df_print_success &>/dev/null; then - df_print_success() { echo "✓ $1"; } - df_print_error() { echo "✗ $1" >&2; } - df_print_warning() { echo "⚠ $1"; } - df_print_info() { echo "ℹ $1"; } - df_print_step() { echo "==> $1"; } -fi - -# ============================================================================ -# Mark as Loaded -# ============================================================================ - -typeset -g _DF_BOOTSTRAP_LOADED=1 - -# Export for subshells (bash compatibility) -export DOTFILES_DIR DOTFILES_HOME DOTFILES_VERSION DF_WIDTH diff --git a/dotfiles-refactor/zsh/lib/colors.zsh b/dotfiles-refactor/zsh/lib/colors.zsh deleted file mode 100644 index fcd510c..0000000 --- a/dotfiles-refactor/zsh/lib/colors.zsh +++ /dev/null @@ -1,86 +0,0 @@ -# ============================================================================ -# Shared Color Definitions for Dotfiles -# ============================================================================ -# Source this file in scripts and functions to get consistent color support. -# -# Usage in zsh functions: -# source "${0:A:h}/../lib/colors.zsh" -# -# Usage in bash scripts: -# source "$HOME/.dotfiles/zsh/lib/colors.zsh" -# -# All variables are prefixed with DF_ (dotfiles) to avoid conflicts. -# ============================================================================ - -# Prevent double-sourcing -[[ -n "$_DF_COLORS_LOADED" ]] && return 0 -typeset -g _DF_COLORS_LOADED=1 - -# ============================================================================ -# Standard Colors (ANSI escape codes) -# ============================================================================ - -typeset -g DF_RED=$'\033[0;31m' -typeset -g DF_GREEN=$'\033[0;32m' -typeset -g DF_YELLOW=$'\033[1;33m' -typeset -g DF_BLUE=$'\033[0;34m' -typeset -g DF_MAGENTA=$'\033[0;35m' -typeset -g DF_CYAN=$'\033[0;36m' -typeset -g DF_WHITE=$'\033[0;37m' - -# Bold variants -typeset -g DF_BOLD_RED=$'\033[1;31m' -typeset -g DF_BOLD_GREEN=$'\033[1;32m' -typeset -g DF_BOLD_YELLOW=$'\033[1;33m' -typeset -g DF_BOLD_BLUE=$'\033[1;34m' -typeset -g DF_BOLD_MAGENTA=$'\033[1;35m' -typeset -g DF_BOLD_CYAN=$'\033[1;36m' -typeset -g DF_BOLD_WHITE=$'\033[1;37m' - -# Text styles -typeset -g DF_BOLD=$'\033[1m' -typeset -g DF_DIM=$'\033[2m' -typeset -g DF_ITALIC=$'\033[3m' -typeset -g DF_UNDERLINE=$'\033[4m' -typeset -g DF_RESET=$'\033[0m' -typeset -g DF_NC=$'\033[0m' # Alias for reset (No Color) - -# ============================================================================ -# 256-Color Palette (used in theme and MOTD) -# ============================================================================ - -typeset -g DF_GREY=$'\033[38;5;242m' -typeset -g DF_LIGHT_GREY=$'\033[38;5;248m' -typeset -g DF_DARK_GREY=$'\033[38;5;239m' -typeset -g DF_ORANGE=$'\033[38;5;208m' -typeset -g DF_LIGHT_ORANGE=$'\033[38;5;220m' -typeset -g DF_PINK=$'\033[38;5;213m' -typeset -g DF_PURPLE=$'\033[38;5;141m' -typeset -g DF_LIGHT_BLUE=$'\033[38;5;39m' -typeset -g DF_LIGHT_GREEN=$'\033[38;5;82m' -typeset -g DF_BRIGHT_GREEN=$'\033[38;5;118m' -typeset -g DF_TEAL=$'\033[38;5;51m' - -# ============================================================================ -# Semantic Colors (for consistent UI) -# ============================================================================ - -typeset -g DF_SUCCESS="$DF_GREEN" -typeset -g DF_ERROR="$DF_RED" -typeset -g DF_WARNING="$DF_YELLOW" -typeset -g DF_INFO="$DF_CYAN" -typeset -g DF_HINT="$DF_DIM" -typeset -g DF_ACCENT="$DF_BLUE" -typeset -g DF_MUTED="$DF_GREY" - -# ============================================================================ -# Bash Compatibility -# ============================================================================ - -# For bash scripts, export as regular variables too -if [[ -n "$BASH_VERSION" ]]; then - export DF_RED DF_GREEN DF_YELLOW DF_BLUE DF_MAGENTA DF_CYAN DF_WHITE - export DF_BOLD DF_DIM DF_RESET DF_NC - export DF_GREY DF_LIGHT_BLUE DF_LIGHT_GREEN - export DF_SUCCESS DF_ERROR DF_WARNING DF_INFO -fi diff --git a/dotfiles-refactor/zsh/lib/config.zsh b/dotfiles-refactor/zsh/lib/config.zsh deleted file mode 100644 index 4f714e5..0000000 --- a/dotfiles-refactor/zsh/lib/config.zsh +++ /dev/null @@ -1,154 +0,0 @@ -# ============================================================================ -# Dotfiles Configuration Loader -# ============================================================================ -# This file loads dotfiles.conf and sets up all configuration variables. -# It serves as the bridge between dotfiles.conf and the rest of the system. -# -# Source this file to get access to all configuration: -# source "${0:A:h}/config.zsh" -# -# This file: -# 1. Finds and sources dotfiles.conf -# 2. Sets sensible defaults for any missing values -# 3. Exports variables for use in subshells/scripts -# ============================================================================ - -# Prevent double-sourcing -[[ -n "$_DF_CONFIG_LOADED" ]] && return 0 - -# ============================================================================ -# Find and Source dotfiles.conf -# ============================================================================ - -_df_find_config() { - local locations=( - "${DOTFILES_DIR}/dotfiles.conf" - "${DOTFILES_HOME}/dotfiles.conf" - "$HOME/.dotfiles/dotfiles.conf" - "${0:A:h}/../../dotfiles.conf" - ) - - for loc in "${locations[@]}"; do - [[ -f "$loc" ]] && { echo "$loc"; return 0; } - done - return 1 -} - -_DF_CONFIG_FILE=$(_df_find_config) - -if [[ -n "$_DF_CONFIG_FILE" && -f "$_DF_CONFIG_FILE" ]]; then - source "$_DF_CONFIG_FILE" - typeset -g _DF_CONFIG_LOADED=1 -else - # Config file not found - set critical defaults - typeset -g _DF_CONFIG_LOADED=1 -fi - -# ============================================================================ -# Set Defaults for Any Missing Values -# ============================================================================ -# These defaults ensure scripts work even if dotfiles.conf is incomplete - -# Core Settings -typeset -g DOTFILES_VERSION="${DOTFILES_VERSION:-1.0.0}" -typeset -g DOTFILES_DIR="${DOTFILES_DIR:-$HOME/.dotfiles}" -typeset -g DOTFILES_HOME="${DOTFILES_HOME:-$DOTFILES_DIR}" # Alias for compatibility -typeset -g DOTFILES_BRANCH="${DOTFILES_BRANCH:-main}" -typeset -g DOTFILES_BACKUP_PREFIX="${DOTFILES_BACKUP_PREFIX:-$HOME/.dotfiles_backup}" - -# GitHub Settings -typeset -g DOTFILES_GITHUB_USER="${DOTFILES_GITHUB_USER:-adlee-was-taken}" -typeset -g DOTFILES_REPO_NAME="${DOTFILES_REPO_NAME:-dotfiles}" -typeset -g DOTFILES_REPO_URL="${DOTFILES_REPO_URL:-https://github.com/${DOTFILES_GITHUB_USER}/${DOTFILES_REPO_NAME}.git}" -typeset -g DOTFILES_RAW_URL="${DOTFILES_RAW_URL:-https://raw.githubusercontent.com/${DOTFILES_GITHUB_USER}/${DOTFILES_REPO_NAME}/${DOTFILES_BRANCH}}" - -# Display Settings -typeset -g DF_WIDTH="${DF_WIDTH:-66}" -typeset -g ENABLE_MOTD="${ENABLE_MOTD:-true}" -typeset -g MOTD_STYLE="${MOTD_STYLE:-compact}" -typeset -g MOTD_SHOW_FAILED_SERVICES="${MOTD_SHOW_FAILED_SERVICES:-true}" -typeset -g MOTD_SHOW_UPDATES="${MOTD_SHOW_UPDATES:-true}" - -# Theme Settings -typeset -g ZSH_THEME_NAME="${ZSH_THEME_NAME:-adlee}" -typeset -g THEME_TIMER_THRESHOLD="${THEME_TIMER_THRESHOLD:-10}" -typeset -g THEME_PATH_TRUNCATE_LENGTH="${THEME_PATH_TRUNCATE_LENGTH:-32}" - -# Feature Toggles -typeset -g ENABLE_SMART_SUGGESTIONS="${ENABLE_SMART_SUGGESTIONS:-true}" -typeset -g ENABLE_COMMAND_PALETTE="${ENABLE_COMMAND_PALETTE:-true}" -typeset -g ENABLE_SHELL_ANALYTICS="${ENABLE_SHELL_ANALYTICS:-false}" -typeset -g ENABLE_VAULT="${ENABLE_VAULT:-true}" -typeset -g DOTFILES_AUTO_SYNC_CHECK="${DOTFILES_AUTO_SYNC_CHECK:-true}" - -# Btrfs Settings -typeset -g BTRFS_DEFAULT_MOUNT="${BTRFS_DEFAULT_MOUNT:-/}" - -# Snapper Settings -typeset -g SNAPPER_CONFIG="${SNAPPER_CONFIG:-root}" -typeset -g LIMINE_CONF="${LIMINE_CONF:-/boot/limine.conf}" - -# Tmux Settings -typeset -g TW_SESSION_PREFIX="${TW_SESSION_PREFIX:-work}" -typeset -g TW_DEFAULT_TEMPLATE="${TW_DEFAULT_TEMPLATE:-dev}" - -# Python Template Settings -typeset -g PY_TEMPLATE_BASE_DIR="${PY_TEMPLATE_BASE_DIR:-$HOME/projects}" -typeset -g PY_TEMPLATE_PYTHON="${PY_TEMPLATE_PYTHON:-python3}" -typeset -g PY_TEMPLATE_VENV_NAME="${PY_TEMPLATE_VENV_NAME:-venv}" -typeset -g PY_TEMPLATE_USE_POETRY="${PY_TEMPLATE_USE_POETRY:-false}" -typeset -g PY_TEMPLATE_GIT_INIT="${PY_TEMPLATE_GIT_INIT:-true}" - -# SSH Settings -typeset -g SSH_AUTO_TMUX="${SSH_AUTO_TMUX:-true}" -typeset -g SSH_TMUX_SESSION_PREFIX="${SSH_TMUX_SESSION_PREFIX:-ssh}" -typeset -g SSH_SYNC_DOTFILES="${SSH_SYNC_DOTFILES:-ask}" - -# Password Manager Settings -typeset -g PW_CLIP_TIME="${PW_CLIP_TIME:-45}" - -# Package Manager -typeset -g AUR_HELPER="${AUR_HELPER:-auto}" - -# Git Settings (with fallbacks to user identity) -typeset -g GIT_USER_NAME="${GIT_USER_NAME:-$USER_FULLNAME}" -typeset -g GIT_USER_EMAIL="${GIT_USER_EMAIL:-$USER_EMAIL}" -typeset -g GIT_DEFAULT_BRANCH="${GIT_DEFAULT_BRANCH:-main}" - -# ============================================================================ -# Export for Bash Scripts -# ============================================================================ -# Bash scripts can't see typeset -g, so we export key variables - -export DOTFILES_VERSION DOTFILES_DIR DOTFILES_HOME DOTFILES_BRANCH -export DOTFILES_GITHUB_USER DOTFILES_REPO_NAME DOTFILES_REPO_URL DOTFILES_RAW_URL -export DF_WIDTH MOTD_STYLE -export ZSH_THEME_NAME - -# ============================================================================ -# Helper Function: Get Config Value -# ============================================================================ -# Usage: df_config "VARIABLE_NAME" "default_value" - -df_config() { - local var_name="$1" - local default="$2" - local value="${(P)var_name}" - echo "${value:-$default}" -} - -# ============================================================================ -# Helper Function: Show Config Summary -# ============================================================================ - -df_show_config() { - echo "Dotfiles Configuration" - echo "======================" - echo "Config File: ${_DF_CONFIG_FILE:-not found}" - echo "Version: $DOTFILES_VERSION" - echo "Directory: $DOTFILES_DIR" - echo "Branch: $DOTFILES_BRANCH" - echo "Display Width: $DF_WIDTH" - echo "MOTD Style: $MOTD_STYLE" - echo "Theme: $ZSH_THEME_NAME" -} diff --git a/dotfiles-refactor/zsh/lib/utils.zsh b/dotfiles-refactor/zsh/lib/utils.zsh deleted file mode 100644 index 0413667..0000000 --- a/dotfiles-refactor/zsh/lib/utils.zsh +++ /dev/null @@ -1,215 +0,0 @@ -# ============================================================================ -# Shared Utility Functions for Zsh Dotfiles -# ============================================================================ -# Common helper functions used across multiple function files. -# -# This file is typically sourced via bootstrap.zsh, which handles loading -# config.zsh and colors.zsh first. -# -# Direct usage (if needed): -# source "${0:A:h}/../lib/utils.zsh" -# ============================================================================ - -# Prevent double-sourcing -[[ -n "$_DF_UTILS_LOADED" ]] && return 0 -typeset -g _DF_UTILS_LOADED=1 - -# ============================================================================ -# Source Dependencies (if not already loaded via bootstrap) -# ============================================================================ - -_df_lib_dir="${0:A:h}" -[[ ! -d "$_df_lib_dir" ]] && _df_lib_dir="$HOME/.dotfiles/zsh/lib" - -# Source config if not already loaded -[[ -z "$_DF_CONFIG_LOADED" ]] && { - source "${_df_lib_dir}/config.zsh" 2>/dev/null || \ - source "$HOME/.dotfiles/zsh/lib/config.zsh" 2>/dev/null || { - typeset -g DOTFILES_DIR="${DOTFILES_DIR:-$HOME/.dotfiles}" - typeset -g DOTFILES_HOME="${DOTFILES_HOME:-$DOTFILES_DIR}" - typeset -g DOTFILES_VERSION="${DOTFILES_VERSION:-unknown}" - typeset -g DF_WIDTH="${DF_WIDTH:-66}" - } -} - -# Source colors if not already loaded -[[ -z "$_DF_COLORS_LOADED" ]] && { - source "${_df_lib_dir}/colors.zsh" 2>/dev/null || \ - source "$HOME/.dotfiles/zsh/lib/colors.zsh" 2>/dev/null || { - typeset -g DF_RED=$'\033[0;31m' DF_GREEN=$'\033[0;32m' DF_YELLOW=$'\033[1;33m' - typeset -g DF_BLUE=$'\033[0;34m' DF_CYAN=$'\033[0;36m' DF_NC=$'\033[0m' - typeset -g DF_GREY=$'\033[38;5;242m' DF_LIGHT_BLUE=$'\033[38;5;39m' - typeset -g DF_LIGHT_GREEN=$'\033[38;5;82m' DF_BOLD=$'\033[1m' DF_DIM=$'\033[2m' - } -} - -unset _df_lib_dir - -# ============================================================================ -# Header Box Drawing (Centralized Implementation) -# ============================================================================ -# These functions eliminate header duplication across all scripts. - -# Build a horizontal line of specified character and width -# Usage: _df_hline "═" 66 -_df_hline() { - local char="${1:-═}" - local width="${2:-$DF_WIDTH}" - local line="" - for ((i=0; i${DF_NC} $1"; } -df_print_success() { echo -e "${DF_GREEN}✓${DF_NC} $1"; } -df_print_error() { echo -e "${DF_RED}✗${DF_NC} $1" >&2; } -df_print_warning() { echo -e "${DF_YELLOW}⚠${DF_NC} $1"; } -df_print_info() { echo -e "${DF_CYAN}ℹ${DF_NC} $1"; } -df_print_section() { echo -e "${DF_CYAN}$1:${DF_NC}"; } -df_print_indent() { echo " $1"; } - -# ============================================================================ -# Command Dependency Checking -# ============================================================================ - -df_cmd_exists() { command -v "$1" &>/dev/null; } - -df_require_cmd() { - local cmd="$1" - local package="${2:-$1}" - - if ! command -v "$cmd" &>/dev/null; then - df_print_error "$cmd not installed" - echo "Install: sudo pacman -S $package" - return 1 - fi - return 0 -} - -# ============================================================================ -# User Confirmation -# ============================================================================ - -df_confirm() { - local prompt="$1" - local response - - if [[ -n "$ZSH_VERSION" ]]; then - read -q "response?$prompt [y/N]: " - echo - [[ "$response" =~ ^[Yy]$ ]] - else - read -p "$prompt [y/N]: " response - [[ "$response" =~ ^[Yy]$ ]] - fi -} - -df_confirm_warning() { - df_print_warning "$1" - df_confirm "Continue?" -} - -# ============================================================================ -# File/Directory Helpers -# ============================================================================ - -df_in_git_repo() { git rev-parse --git-dir &>/dev/null 2>&1; } -df_git_root() { git rev-parse --show-toplevel 2>/dev/null; } -df_ensure_dir() { [[ ! -d "$1" ]] && mkdir -p "$1"; } - -df_ensure_file() { - local file="$1" content="${2:-}" - if [[ ! -f "$file" ]]; then - df_ensure_dir "$(dirname "$file")" - [[ -n "$content" ]] && echo "$content" > "$file" || touch "$file" - fi -} - -# ============================================================================ -# Environment Checks -# ============================================================================ - -df_in_tmux() { [[ -n "$TMUX" ]]; } -df_is_btrfs() { [[ "$(df -T / 2>/dev/null | awk 'NR==2 {print $2}')" == "btrfs" ]]; } - -# ============================================================================ -# FZF Helpers -# ============================================================================ - -df_fzf_opts() { echo "--height=50% --layout=reverse --border=rounded"; }