diff --git a/dotfiles-refactor.tar.gz b/dotfiles-refactor.tar.gz deleted file mode 100644 index 5e5d40a..0000000 Binary files a/dotfiles-refactor.tar.gz and /dev/null differ 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"; }