macbook-setup/diagnose-claude-profiles.sh

170 lines
7.3 KiB
Bash
Executable file

#!/usr/bin/env bash
# diagnose-claude-profiles.sh
# Prueft ob die Claude Code Multi-Profile-Einrichtung korrekt ist
# Verwendung: bash diagnose-claude-profiles.sh
RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m'; BLUE='\033[0;34m'; NC='\033[0m'
ok() { echo -e "${GREEN}[OK] $*${NC}"; }
warn() { echo -e "${YELLOW}[WARN] $*${NC}"; }
fail() { echo -e "${RED}[FAIL] $*${NC}"; }
info() { echo -e "${BLUE}[INFO] $*${NC}"; }
ISSUES=0
issue() { fail "$*"; ((ISSUES++)); }
echo ""
echo "============================================"
echo " Claude Code Profile - Diagnose"
echo "============================================"
# ── 1. Binary ──────────────────────────────────────────────────────────
echo -e "\n=== 1. claude Binary ==="
CLAUDE_BIN=$(command -v claude 2>/dev/null || true)
if [[ -n "$CLAUDE_BIN" ]]; then
ok "claude gefunden: $CLAUDE_BIN"
CLAUDE_VERSION=$(claude --version 2>/dev/null || echo "Version nicht lesbar")
info "Version: $CLAUDE_VERSION"
else
issue "claude Binary nicht gefunden"
info "PATH: $PATH"
# npm global bin pruefen
NPM_BIN=$(npm bin -g 2>/dev/null || npm root -g 2>/dev/null | sed 's|/node_modules||')
if [[ -n "$NPM_BIN" ]]; then
info "npm global bin: $NPM_BIN"
if [[ -f "$NPM_BIN/claude" ]]; then
warn "claude liegt in $NPM_BIN aber ist nicht im PATH"
fi
fi
fi
# ── 2. npm Paket ───────────────────────────────────────────────────────
echo -e "\n=== 2. npm Paket ==="
if npm list -g @anthropic-ai/claude-code --depth=0 2>/dev/null | grep -q claude-code; then
PKG=$(npm list -g @anthropic-ai/claude-code --depth=0 2>/dev/null | grep claude-code)
ok "Paket installiert: $PKG"
else
issue "@anthropic-ai/claude-code nicht als npm-Globalpaket installiert"
info "Fix: npm install -g @anthropic-ai/claude-code"
fi
# ── 3. Config-Verzeichnisse ────────────────────────────────────────────
echo -e "\n=== 3. Config-Verzeichnisse ==="
for dir in ~/.claude-priv ~/.claude-work; do
expanded="${dir/#\~/$HOME}"
if [[ -d "$expanded" ]]; then
COUNT=$(ls -A "$expanded" 2>/dev/null | wc -l)
ok "$dir existiert ($COUNT Eintraege)"
else
issue "$dir fehlt"
info "Fix: bash setup-claude-profiles.sh"
fi
done
if [[ -d "$HOME/.claude" && ! -L "$HOME/.claude" ]]; then
warn "~/.claude existiert noch als echtes Verzeichnis (sollte nicht mehr da sein)"
info "Eventuell wurde setup-claude-profiles.sh nicht vollstaendig ausgefuehrt"
fi
# ── 4. Symlinks in ~/.claude-work ─────────────────────────────────────
echo -e "\n=== 4. Symlinks ==="
for item in projects settings.json; do
link="$HOME/.claude-work/$item"
expected_target="$HOME/.claude-priv/$item"
if [[ -L "$link" ]]; then
actual=$(readlink "$link")
resolved=$(readlink -f "$link" 2>/dev/null || echo "BROKEN")
if [[ "$resolved" == "BROKEN" || ! -e "$resolved" ]]; then
issue "$link -> $actual (BROKEN - Ziel existiert nicht)"
info "Fix: rm $link && ln -s $expected_target $link"
else
ok "$link -> $actual"
fi
elif [[ -e "$link" ]]; then
warn "$link existiert, ist aber kein Symlink (echte Datei/Verzeichnis)"
else
issue "$link fehlt (kein Symlink)"
info "Fix: ln -s $expected_target $link"
fi
done
# ── 5. Auth-Token ──────────────────────────────────────────────────────
echo -e "\n=== 5. Auth-Token ==="
for profile in priv work; do
dir="$HOME/.claude-${profile}"
# Claude speichert Credentials in verschiedenen Dateien je nach Version
found_token=0
for credfile in ".credentials.json" "auth.json" ".auth"; do
if [[ -f "$dir/$credfile" ]]; then
SIZE=$(wc -c < "$dir/$credfile")
if [[ "$SIZE" -gt 10 ]]; then
ok "~/.claude-${profile}/$credfile vorhanden (${SIZE} Bytes)"
found_token=1
break
fi
fi
done
if [[ "$found_token" -eq 0 ]]; then
# Alle JSON-Dateien anzeigen die Token enthalten koennten
JSON_FILES=$(find "$dir" -maxdepth 2 -name "*.json" 2>/dev/null | head -5)
if [[ -n "$JSON_FILES" ]]; then
warn "~/.claude-${profile}: kein bekanntes Credential-File, vorhandene JSON-Dateien:"
echo "$JSON_FILES" | while read -r f; do info " $f ($(wc -c < "$f") Bytes)"; done
else
issue "~/.claude-${profile}: KEIN Credential-File gefunden - Login noetig"
info "Fix: CLAUDE_CONFIG_DIR=~/.claude-${profile} command claude /login"
fi
fi
done
# ── 6. .zshrc Aliases ─────────────────────────────────────────────────
echo -e "\n=== 6. .zshrc Aliases ==="
ZSHRC="$HOME/.zshrc"
if [[ ! -f "$ZSHRC" ]]; then
issue "$ZSHRC fehlt"
else
if grep -q "claude-profiles-start" "$ZSHRC"; then
ok ".zshrc: claude-profiles Block vorhanden"
# Aliases einzeln pruefen
for alias_name in claude-priv claude-work claude-account; do
if grep -q "$alias_name" "$ZSHRC"; then
ok " $alias_name definiert"
else
issue " $alias_name fehlt in .zshrc"
fi
done
else
issue ".zshrc: claude-profiles Block fehlt komplett"
info "Fix: bash setup-claude-profiles.sh"
fi
fi
# Aktuelle Shell-Aliases pruefen (falls .zshrc geladen ist)
echo ""
info "Aktive Aliases in dieser Shell:"
alias claude-priv 2>/dev/null && true || warn " claude-priv: nicht aktiv (source ~/.zshrc noetig?)"
alias claude-work 2>/dev/null && true || warn " claude-work: nicht aktiv (source ~/.zshrc noetig?)"
# ── 7. Verzeichnis-Inhalt (Info) ───────────────────────────────────────
echo -e "\n=== 7. Inhalt ~/.claude-priv ==="
if [[ -d "$HOME/.claude-priv" ]]; then
ls -la "$HOME/.claude-priv/" 2>/dev/null
fi
# ── Zusammenfassung ────────────────────────────────────────────────────
echo ""
echo "============================================"
if [[ "$ISSUES" -eq 0 ]]; then
ok "Keine Probleme gefunden"
echo -e "${GREEN} Alles sieht gut aus.${NC}"
echo " Wenn claude trotzdem nicht funktioniert: Login erneuern mit"
echo " CLAUDE_CONFIG_DIR=~/.claude-priv command claude /login"
else
fail "$ISSUES Problem(e) gefunden - siehe [FAIL] Zeilen oben"
echo " Haeufigstes Fix-All:"
echo " bash setup-claude-profiles.sh # Verzeichnisse + Aliases reparieren"
echo " source ~/.zshrc # Aliases neu laden"
echo " claude-account priv # Neu anmelden"
fi
echo "============================================"
echo ""