From 28319183b63b99cbca49d7a4c1129ebb6494d6d6 Mon Sep 17 00:00:00 2001 From: DragonSlayer_14 Date: Sun, 6 Sep 2026 12:17:57 +0200 Subject: [PATCH] feat(hyprland): add Junie CLI and AwesomeJunieSkills to first-login setup Co-authored-by: Junie --- .../hypr/scripts/install-dots-prompt.sh | 116 ++++++++++++++++-- stages/07-skel-and-user.sh | 6 +- stages/09-hyprland.sh | 2 +- 3 files changed, 107 insertions(+), 17 deletions(-) diff --git a/data/skel/.config/hypr/scripts/install-dots-prompt.sh b/data/skel/.config/hypr/scripts/install-dots-prompt.sh index 0af1d6f..b520dfa 100755 --- a/data/skel/.config/hypr/scripts/install-dots-prompt.sh +++ b/data/skel/.config/hypr/scripts/install-dots-prompt.sh @@ -1,10 +1,9 @@ #!/usr/bin/env bash # ============================================================================== # ~/.config/hypr/scripts/install-dots-prompt.sh -# Fragt nach der Anmeldung nach der gewünschten Dotfiles-Konfiguration: -# 1) LinuxBeginnings Hyprland-Dotfiles (GitHub) -# 2) Eigenes Git-Repository als ~/.config klonen -# 3) Überspringen (rudimentäre Basiskonfiguration beibehalten) +# Ersteinrichtung beim ersten Login: +# 1) Desktop-Konfiguration (LinuxBeginnings Hyprland-Dots oder eigenes Git-Repo) +# 2) Installation der JetBrains Junie CLI & AwesomeJunieSkills # ============================================================================== set -euo pipefail @@ -29,7 +28,7 @@ fi # starte das Skript in einem Kitty-Fenster: if [[ ! -t 0 || ! -t 1 ]]; then if command -v kitty >/dev/null 2>&1; then - exec kitty --title "Dotfiles Setup & Konfiguration" bash -c "$0 --in-terminal; echo; read -r -p 'Drücke Enter zum Schließen...' || true" + exec kitty --title "System-Ersteinrichtung & Dotfiles" bash -c "$0 --in-terminal; echo; read -r -p 'Drücke Enter zum Schließen...' || true" else exit 0 fi @@ -50,12 +49,97 @@ mark_as_prompted() { touch "$MARKER_FILE" 2>/dev/null || true } +install_junie_cli_and_skills() { + printf "\n" + printf "%b\n" "${CLR_BOLD}${CLR_CYAN}==============================================================================${CLR_RESET}" + printf "%b\n" "${CLR_BOLD}${CLR_CYAN} JetBrains Junie CLI & AwesomeJunieSkills Installation ${CLR_RESET}" + printf "%b\n" "${CLR_BOLD}${CLR_CYAN}==============================================================================${CLR_RESET}" + printf "\n" + + # 1. JetBrains Junie CLI installieren + printf "%b\n" "${CLR_CYAN}[1/2] Installiere JetBrains Junie CLI...${CLR_RESET}" + if command -v curl >/dev/null 2>&1; then + if curl -fsSL https://junie.jetbrains.com/install.sh | bash; then + printf "%b\n" "${CLR_GREEN}[✓] JetBrains Junie CLI erfolgreich installiert.${CLR_RESET}" + else + printf "%b\n" "${CLR_YELLOW}[WARNUNG] Installation von JetBrains Junie CLI fehlgeschlagen oder unterbrochen.${CLR_RESET}" + fi + else + printf "%b\n" "${CLR_RED}[FEHLER] 'curl' ist nicht installiert. Junie CLI konnte nicht geladen werden.${CLR_RESET}" + fi + + # 2. AwesomeJunieSkills im Benutzer-Skillverzeichnis (~/.junie/skills) klonen / aktualisieren + printf "\n" + printf "%b\n" "${CLR_CYAN}[2/2] Installiere AwesomeJunieSkills im Benutzer-Skillverzeichnis (~/.junie/skills)...${CLR_RESET}" + local skills_dir="$HOME/.junie/skills" + local repo_dir="$skills_dir/awesome-junie-skills" + mkdir -p "$skills_dir" + + if command -v git >/dev/null 2>&1; then + if [[ -d "$repo_dir/.git" ]]; then + printf "%b\n" "${CLR_BLUE}[INFO] Repository existiert bereits in $repo_dir. Führe 'git pull' aus...${CLR_RESET}" + if git -C "$repo_dir" pull --ff-only 2>/dev/null; then + printf "%b\n" "${CLR_GREEN}[✓] AwesomeJunieSkills erfolgreich aktualisiert.${CLR_RESET}" + else + printf "%b\n" "${CLR_YELLOW}[WARNUNG] 'git pull' in $repo_dir fehlgeschlagen.${CLR_RESET}" + fi + else + printf "%b\n" "${CLR_BLUE}[INFO] Klone AwesomeJunieSkills nach $repo_dir...${CLR_RESET}" + rm -rf "$repo_dir" 2>/dev/null || true + if git clone https://github.com/alebaffa/awesome-junie-skills.git "$repo_dir"; then + printf "%b\n" "${CLR_GREEN}[✓] AwesomeJunieSkills erfolgreich nach $repo_dir geklont.${CLR_RESET}" + else + printf "%b\n" "${CLR_YELLOW}[WARNUNG] Klonen von AwesomeJunieSkills fehlgeschlagen.${CLR_RESET}" + fi + fi + + # Symlinks für alle Skills im Skill-Hauptordner erstellen + if [[ -d "$repo_dir" ]]; then + local count=0 + for skill_path in "$repo_dir"/*; do + if [[ -d "$skill_path" && -f "$skill_path/SKILL.md" ]]; then + local s_name + s_name="$(basename "$skill_path")" + ln -sfn "$skill_path" "$skills_dir/$s_name" + ((count++)) || true + fi + done + printf "%b\n" "${CLR_GREEN}[✓] $count Skills verknüpft in '$skills_dir' (kann via 'git pull' in '$repo_dir' aktualisiert werden).${CLR_RESET}" + fi + + # Junie config.json konfigurieren (skill-locations) + mkdir -p "$HOME/.junie" + local config_file="$HOME/.junie/config.json" + if command -v python3 >/dev/null 2>&1; then + python3 -c " +import json, os +cfg_path = os.path.expanduser('$config_file') +repo_path = os.path.expanduser('$repo_dir') +data = {} +if os.path.exists(cfg_path): + try: + with open(cfg_path, 'r', encoding='utf-8') as f: + data = json.load(f) + except Exception: + data = {} +locs = data.get('skill-locations', []) +if repo_path not in locs: + locs.append(repo_path) +data['skill-locations'] = locs +with open(cfg_path, 'w', encoding='utf-8') as f: + json.dump(data, f, indent=2) +" 2>/dev/null || true + fi + else + printf "%b\n" "${CLR_RED}[FEHLER] 'git' ist nicht installiert. AwesomeJunieSkills konnte nicht eingerichtet werden.${CLR_RESET}" + fi +} + install_linuxbeginnings() { printf "\n" printf "%b\n" "${CLR_GREEN}${CLR_BOLD}[INFO] Starte Installation der LinuxBeginnings Hyprland-Dotfiles...${CLR_RESET}" printf "\n" if command -v curl >/dev/null 2>&1; then - mark_as_prompted sh <(curl -fsSL https://raw.githubusercontent.com/LinuxBeginnings/Hyprland-Dots/main/Distro-Hyprland.sh) else printf "%b\n" "${CLR_RED}[FEHLER] 'curl' ist nicht installiert. Bitte installieren Sie curl und wiederholen Sie den Vorgang.${CLR_RESET}" @@ -142,8 +226,6 @@ clone_custom_repo() { printf "%b\n" "${CLR_GREEN}${CLR_BOLD}[ERFOLG] Repository wurde erfolgreich nach ~/.config geklont!${CLR_RESET}" printf "%b\n" " - Ihr gesamter ${CLR_BOLD}~/.config${CLR_RESET}-Ordner ist nun das Git-Repository." printf "%b\n" " - Vorherige Konfigurationen wurden gesichert in: ${CLR_BOLD}${backup_dir}${CLR_RESET}" - - mark_as_prompted # Hyprland-Konfiguration neu laden falls aktiv if command -v hyprctl >/dev/null 2>&1; then @@ -154,7 +236,7 @@ clone_custom_repo() { fi printf "\n" - printf "%b\n" "${CLR_GREEN}Einrichtung abgeschlossen!${CLR_RESET}" + printf "%b\n" "${CLR_GREEN}Dotfiles-Einrichtung abgeschlossen!${CLR_RESET}" return 0 else printf "\n" @@ -216,11 +298,8 @@ while true; do break ;; 3) - mark_as_prompted printf "\n" - printf "%b\n" "${CLR_YELLOW}[INFO] Einrichtung übersprungen. Die Basiskonfiguration bleibt aktiv.${CLR_RESET}" - printf "%b\n" "Sie können dieses Menü jederzeit erneut aufrufen mit:" - printf "%b\n" " ${CLR_BOLD}~/.config/hypr/scripts/install-dots-prompt.sh --force${CLR_RESET}" + printf "%b\n" "${CLR_YELLOW}[INFO] Dotfiles-Einrichtung übersprungen. Die Basiskonfiguration bleibt aktiv.${CLR_RESET}" break ;; *) @@ -228,3 +307,14 @@ while true; do ;; esac done + +# JetBrains Junie CLI & AwesomeJunieSkills installieren +install_junie_cli_and_skills + +# Marker-Datei setzen +mark_as_prompted + +printf "\n" +printf "%b\n" "${CLR_GREEN}${CLR_BOLD}[✓] Ersteinrichtung vollständig abgeschlossen!${CLR_RESET}" +printf "%b\n" "Sie können dieses Menü jederzeit erneut aufrufen mit:" +printf "%b\n" " ${CLR_BOLD}~/.config/hypr/scripts/install-dots-prompt.sh --force${CLR_RESET}" diff --git a/stages/07-skel-and-user.sh b/stages/07-skel-and-user.sh index 4dd2b2a..9b0a371 100755 --- a/stages/07-skel-and-user.sh +++ b/stages/07-skel-and-user.sh @@ -37,7 +37,7 @@ grep -q '^source /etc/profile' /etc/zsh/zprofile 2>/dev/null || echo 'source /et # 2. Provision /etc/skel for Future New Users log_substep "Provisioning /etc/skel with default templates and configs..." -mkdir -p /etc/skel/Templates +mkdir -p /etc/skel/Templates /etc/skel/.junie/skills if [[ -d "$SCRIPT_DIR/data/skel/Templates" ]]; then cp -r "$SCRIPT_DIR"/data/skel/Templates/* /etc/skel/Templates/ 2>/dev/null || true fi @@ -55,7 +55,7 @@ chown -R root:root /etc/skel # 3. Synchronize User Environment for Target User log_substep "Synchronizing Dotfiles & Templates into $TARGET_HOME..." -mkdir -p "$TARGET_HOME/Templates" "$TARGET_HOME/.config" +mkdir -p "$TARGET_HOME/Templates" "$TARGET_HOME/.config" "$TARGET_HOME/.junie/skills" # Backup existing .zshrc if present if [[ -f "$TARGET_HOME/.zshrc" ]]; then @@ -91,7 +91,7 @@ if [[ ! -d "$TARGET_HOME/.oh-my-zsh" ]]; then fi # Fix ownership -chown -R "$TARGET_USER:$TARGET_USER" "$TARGET_HOME/.zshrc" "$TARGET_HOME/Templates" "$TARGET_HOME/.config" +chown -R "$TARGET_USER:$TARGET_USER" "$TARGET_HOME/.zshrc" "$TARGET_HOME/Templates" "$TARGET_HOME/.config" "$TARGET_HOME/.junie" if [[ -d "$TARGET_HOME/.oh-my-zsh" ]]; then chown -R "$TARGET_USER:$TARGET_USER" "$TARGET_HOME/.oh-my-zsh" fi diff --git a/stages/09-hyprland.sh b/stages/09-hyprland.sh index 3e47253..e3e84d3 100644 --- a/stages/09-hyprland.sh +++ b/stages/09-hyprland.sh @@ -67,5 +67,5 @@ chown -R "$TARGET_USER:$TARGET_USER" "$TARGET_HOME/.config/hypr" log_success "Rudimentary Hyprland configuration deployed:" log_info " - SUPER+ENTER: Kitty Terminal" log_info " - SUPER+Q: Close Active Window" -log_info " - Login Prompt: Asks user after login to choose Dotfiles setup (LinuxBeginnings or custom Git repo for ~/.config)" +log_info " - Login Prompt: Asks user after login to choose Dotfiles setup & installs JetBrains Junie CLI + AwesomeJunieSkills" log_success "Stage 09: Hyprland Desktop installation & configuration completed successfully!"