#!/usr/bin/env sh # copilot-update.sh # Zieht die neueste Version des Copilot-Setup-Repos und aktualisiert: # - Dieses Script selbst (~/.local/bin/copilot-update.sh) # - Globale Git-Templates (~/.git-templates/) # - VS Code Prompt-Dateien # - Git-Hooks im aktuellen Repo (pre-commit) # - .github/copilot-instructions.md (Framework-Sektion immer, Projekt-Teil bleibt) # # Usage: # copilot-update.sh # aktuelles Verzeichnis (Git-Repo optional) # git copilot-update # via Git-Alias SETUP_REPO_SSH="ssh://git@192.168.178.6:2222/cschulz/rd13_copilot_setup.git" SETUP_REPO_HTTP="http://192.168.178.6:8083/cschulz/rd13_copilot_setup.git" CACHE_DIR="${COPILOT_SETUP_DIR:-$HOME/.copilot-setup}" echo "=== Copilot Update ===" # ── 1. Setup-Repo Cache aktuell halten ─────────────────────────────────────── if [ -d "$CACHE_DIR/.git" ]; then echo " → Pulling latest from setup repo..." if git -C "$CACHE_DIR" pull --ff-only --quiet 2>/dev/null; then echo " ✓ Cache aktualisiert: $CACHE_DIR" else echo " ✗ git pull fehlgeschlagen – versuche neu zu klonen..." rm -rf "$CACHE_DIR" fi fi if [ ! -d "$CACHE_DIR/.git" ]; then echo " → Klone Setup-Repo (SSH)..." if git clone --quiet "$SETUP_REPO_SSH" "$CACHE_DIR" 2>/dev/null; then echo " ✓ Geklont via SSH" else echo " ✗ SSH fehlgeschlagen – versuche HTTP-Fallback..." if git clone --quiet "$SETUP_REPO_HTTP" "$CACHE_DIR" 2>/dev/null; then echo " ✓ Geklont via HTTP" else echo "" echo " ✗ FEHLER: Setup-Repo nicht erreichbar." echo " SSH: $SETUP_REPO_SSH" echo " HTTP: $SETUP_REPO_HTTP" exit 1 fi fi fi SOURCE="$CACHE_DIR" # ── 1b. Self-update: dieses Script selbst aktualisieren ───────────────────── SELF="$HOME/.local/bin/copilot-update.sh" if [ -f "$SOURCE/scripts/copilot-update.sh" ]; then if ! cmp -s "$SOURCE/scripts/copilot-update.sh" "$SELF" 2>/dev/null; then cp "$SOURCE/scripts/copilot-update.sh" "$SELF" chmod +x "$SELF" echo " ✓ copilot-update.sh selbst aktualisiert – starte neue Version..." exec "$SELF" "$@" fi fi GIT_TEMPLATE_DIR="$HOME/.git-templates" # ── 2. ~/.git-templates/ aktualisieren ────────────────────────────────────── mkdir -p "$GIT_TEMPLATE_DIR/.github" "$GIT_TEMPLATE_DIR/.vscode" \ "$GIT_TEMPLATE_DIR/hooks" "$GIT_TEMPLATE_DIR/docs" \ "$GIT_TEMPLATE_DIR/history/summary" cp "$SOURCE/git-templates/.github/copilot-instructions.md" "$GIT_TEMPLATE_DIR/.github/" cp "$SOURCE/git-templates/.vscode/settings.json" "$GIT_TEMPLATE_DIR/.vscode/" cp "$SOURCE/git-templates/.vscode/extensions.json" "$GIT_TEMPLATE_DIR/.vscode/" cp "$SOURCE/git-templates/hooks/pre-commit" "$GIT_TEMPLATE_DIR/hooks/" chmod +x "$GIT_TEMPLATE_DIR/hooks/pre-commit" if [ -f "$SOURCE/git-templates/hooks/post-merge" ]; then cp "$SOURCE/git-templates/hooks/post-merge" "$GIT_TEMPLATE_DIR/hooks/" chmod +x "$GIT_TEMPLATE_DIR/hooks/post-merge" fi cp "$SOURCE/git-templates/docs/USER.md" "$GIT_TEMPLATE_DIR/docs/" cp "$SOURCE/git-templates/docs/ADMIN.md" "$GIT_TEMPLATE_DIR/docs/" cp "$SOURCE/git-templates/docs/MAINTAINER.md" "$GIT_TEMPLATE_DIR/docs/" cp "$SOURCE/git-templates/history/summary/PROJECT_CONTEXT.md" "$GIT_TEMPLATE_DIR/history/summary/" echo " ✓ ~/.git-templates/ aktualisiert" # ── 3. VS Code Prompt-Dateien aktualisieren ─────────────────────────────────── if [ -d "$HOME/.vscode-server/data/User" ]; then VSCODE_USER="$HOME/.vscode-server/data/User" elif [ -d "$HOME/Library/Application Support/Code/User" ]; then VSCODE_USER="$HOME/Library/Application Support/Code/User" else VSCODE_USER="$HOME/.config/Code/User" fi if [ -d "$VSCODE_USER" ]; then mkdir -p "$VSCODE_USER/prompts" PROMPTS_UPDATED=0 for f in "$SOURCE/prompts/"*.prompt.md; do fname="$(basename "$f")" cp "$f" "$VSCODE_USER/prompts/$fname" PROMPTS_UPDATED=$((PROMPTS_UPDATED + 1)) done echo " ✓ $PROMPTS_UPDATED Prompt-Dateien aktualisiert → $VSCODE_USER/prompts/" else echo " ─ VS Code User-Verzeichnis nicht gefunden, Prompts übersprungen" fi # ── 4. Repo-lokale Updates (nur wenn in einem Git-Repo) ────────────────────── REPO_ROOT=$(git rev-parse --show-toplevel 2>/dev/null) if [ -z "$REPO_ROOT" ]; then echo "" echo " ─ Kein Git-Repo erkannt – repo-lokale Updates übersprungen" echo "" echo "=== Done ===" exit 0 fi echo "" echo " Git-Repo erkannt: $REPO_ROOT" # ── 4a. Git-Hooks aktualisieren ─────────────────────────────────────────────── HOOKS_DIR="$REPO_ROOT/.git/hooks" mkdir -p "$HOOKS_DIR" HOOKS_UPDATED=0 for hook in pre-commit; do if [ -f "$SOURCE/git-templates/hooks/$hook" ]; then cp "$SOURCE/git-templates/hooks/$hook" "$HOOKS_DIR/$hook" chmod +x "$HOOKS_DIR/$hook" HOOKS_UPDATED=$((HOOKS_UPDATED + 1)) echo " ✓ .git/hooks/$hook aktualisiert" fi done if [ "$HOOKS_UPDATED" -eq 0 ]; then echo " ─ Keine Hook-Templates gefunden" fi # ── 4b. copilot-instructions.md: Framework-Sektion immer aktualisieren ───────── # Die Datei besteht aus zwei Teilen: # 1) Framework-Sektion (bis zum ersten ---): Session-Protokoll, Verbotene Aktionen # 2) Projekt-Sektion (ab ---): Stack, Architecture, Conventions (repo-spezifisch) # Der Framework-Teil wird immer aus dem Template aktualisiert. # Der Projekt-Teil bleibt unverändert. COPILOT_INSTRUCTIONS="$REPO_ROOT/.github/copilot-instructions.md" TEMPLATE_INSTRUCTIONS="$SOURCE/git-templates/.github/copilot-instructions.md" if [ -f "$COPILOT_INSTRUCTIONS" ] && [ -f "$TEMPLATE_INSTRUCTIONS" ]; then # Framework-Sektion aus Template (alles vor erstem ---) framework=$(awk '/^---$/{exit} {print}' "$TEMPLATE_INSTRUCTIONS") # Projekt-Sektion aus Ziel-Datei (ab erstem --- inkl.) project=$(awk '/^---$/{found=1} found{print}' "$COPILOT_INSTRUCTIONS") if [ -n "$project" ]; then printf '%s\n%s\n' "$framework" "$project" > "$COPILOT_INSTRUCTIONS" echo " ✓ .github/copilot-instructions.md Framework-Sektion aktualisiert" else # Keine Projekt-Sektion vorhanden (noch nicht angepasst) – komplett ersetzen cp "$TEMPLATE_INSTRUCTIONS" "$COPILOT_INSTRUCTIONS" echo " ✓ .github/copilot-instructions.md aktualisiert (noch nicht angepasst)" fi else echo " ─ .github/copilot-instructions.md nicht vorhanden, übersprungen" fi echo "" echo "=== Done ===" echo "Tipp: 'git copilot-update' jederzeit ausführen um Templates aktuell zu halten."