#!/usr/bin/env bash # ============================================================================ # Dotfiles Shell Analytics (Arch/CachyOS) # ============================================================================ set -e # Color codes readonly RED='\033[0;31m' readonly GREEN='\033[0;32m' readonly YELLOW='\033[1;33m' readonly BLUE='\033[0;34m' readonly CYAN='\033[0;36m' readonly MAGENTA='\033[0;35m' readonly NC='\033[0m' # ============================================================================ # MOTD-style header # ============================================================================ _M_WIDTH=66 print_header() { local user="${USER:-root}" local hostname="${HOSTNAME:-$(hostname -s 2>/dev/null)}" local script_name="dotfiles-stats" local datetime=$(date '+%a %b %d %H:%M') # Colors local _M_RESET=$'\033[0m' local _M_BOLD=$'\033[1m' local _M_DIM=$'\033[2m' local _M_BLUE=$'\033[38;5;39m' local _M_GREY=$'\033[38;5;242m' # Build horizontal line local hline="" for ((i=0; i<_M_WIDTH; i++)); do hline+="═"; done local inner=$((_M_WIDTH - 2)) # Header content local h_left="✦ ${user}@${hostname}" local h_center="${script_name}" local h_right="${datetime}" local h_pad=$(((inner - ${#h_left} - ${#h_center} - ${#h_right}) / 2)) local h_spaces="" for ((i=0; i/dev/null | sort | uniq -c | sort -k2n | while read count hour; do local bar_length=$((count / 5)) local bar=$(printf '█%.0s' $(seq 1 $bar_length)) printf " ${CYAN}%02d:00${NC} ${MAGENTA}%5d${NC} ${GREEN}${bar}${NC}\n" "$hour" "$count" done else echo " ${YELLOW}⚠${NC} Zsh history file required for hourly breakdown" fi echo "" } show_dirs() { print_section "Most Visited Directories" echo "" if [[ -f "$HOME/.zsh_history" ]]; then grep "cd " "$HOME/.zsh_history" | awk '{print $NF}' | sort | uniq -c | \ sort -rn | head -15 | while read count dir; do printf " ${CYAN}%4d${NC} ${YELLOW}%s${NC}\n" "$count" "$dir" done else echo " ${YELLOW}⚠${NC} Zsh history file required" fi echo "" } show_git_breakdown() { print_section "Git Command Breakdown" echo "" local total=$(get_history | grep "^git" | wc -l) if [[ $total -eq 0 ]]; then echo " ${YELLOW}No git commands found${NC}" return fi get_history | grep "^git " | awk '{print $2}' | sort | uniq -c | sort -rn | \ head -10 | while read count subcmd; do local percent=$((count * 100 / total)) printf " ${YELLOW}git %-15s${NC} ${CYAN}%4d${NC} (${MAGENTA}%3d%%${NC})\n" \ "$subcmd" "$count" "$percent" done echo "" } # ============================================================================ # Main # ============================================================================ main() { print_header case "${1:-dashboard}" in dashboard) show_dashboard ;; top) show_top_n "${2:-20}" ;; suggest) show_suggestions ;; breakdown) show_breakdown ;; heatmap) show_heatmap ;; dirs) show_dirs ;; git) show_git_breakdown ;; export) # Export as JSON echo "{" echo " \"total_commands\": $(get_history | wc -l)," echo " \"unique_commands\": $(get_history | sort | uniq | wc -l)," echo " \"timestamp\": \"$(date -Iseconds)\"" echo "}" ;; *) echo "Usage: $0 {dashboard|top [n]|suggest|breakdown|heatmap|dirs|git|export}" echo "" echo "Commands:" echo " dashboard Show full dashboard (default)" echo " top [n] Show top N commands (default: 20)" echo " suggest Suggest aliases" echo " breakdown Command category breakdown" echo " heatmap Activity by hour" echo " dirs Most visited directories" echo " git Git command breakdown" echo " export Export as JSON" exit 1 ;; esac } main "$@"