#!/bin/bash set -euo pipefail REPO="$(cd "$(dirname "$0")" && pwd)" echo "=== Claude-Workflow Bootstrap ===" # --- Symlinks und Berechtigungen --- mkdir -p ~/.claude/skills for d in "$REPO/skills/"/*/; do name=$(basename "$d") ln -sfn "$d" ~/.claude/skills/"$name" done echo " Skills verlinkt" mkdir -p ~/.claude/agents for f in "$REPO/agents/"*.md; do ln -sf "$f" ~/.claude/agents/ done echo " Agents verlinkt" ln -sf "$REPO/dotfiles/CLAUDE.md" ~/.claude/CLAUDE.md ln -sf "$REPO/dotfiles/settings.json" ~/.claude/settings.json ln -sf "$REPO/dotfiles/statusline-command.sh" ~/.claude/statusline-command.sh ln -sf "$REPO/dotfiles/gitea-mcp-wrapper.sh" ~/.claude/gitea-mcp-wrapper.sh chmod +x "$REPO/dotfiles/gitea-mcp-wrapper.sh" echo " Dotfiles verlinkt" ln -sfn "$REPO/hooks" ~/.claude/hooks chmod +x "$REPO/hooks/"*.sh echo " Hooks verlinkt und ausfuehrbar" # --- Voraussetzungen pruefen --- echo "" echo "=== Voraussetzungen ===" missing_apt=() missing_other=() check_cmd() { local cmd="$1" local version_info="$2" if command -v "$cmd" &>/dev/null; then echo " OK $cmd ($version_info)" return 0 else echo " FEHLT $cmd" return 1 fi } check_cmd "gh" "$(gh --version 2>/dev/null | head -1 || true)" \ || missing_apt+=("gh") check_cmd "jq" "$(jq --version 2>/dev/null || true)" \ || missing_apt+=("jq") check_cmd "shellcheck" "$(shellcheck --version 2>/dev/null | awk '/^version:/ {print $2}' || true)" \ || missing_apt+=("shellcheck") if command -v pipx &>/dev/null; then check_cmd "ruff" "$(ruff --version 2>/dev/null || true)" \ || missing_other+=("pipx install ruff") else if ! command -v ruff &>/dev/null; then echo " FEHLT ruff (pipx ebenfalls nicht vorhanden)" missing_apt+=("pipx") missing_other+=("pipx ensurepath" "pipx install ruff") else echo " OK ruff ($(ruff --version 2>/dev/null || true))" fi fi if command -v npm &>/dev/null; then check_cmd "markdownlint-cli2" "$(markdownlint-cli2 --version 2>/dev/null | head -1 || true)" \ || missing_other+=("npm install -g markdownlint-cli2") else if ! command -v markdownlint-cli2 &>/dev/null; then echo " FEHLT markdownlint-cli2 (npm nicht vorhanden)" echo " Node.js zuerst installieren, z.B. via nvm" missing_other+=("# Node.js installieren: https://github.com/nvm-sh/nvm" "npm install -g markdownlint-cli2") else echo " OK markdownlint-cli2 ($(markdownlint-cli2 --version 2>/dev/null | head -1 || true))" fi fi if command -v go &>/dev/null; then if [[ -x ~/go/bin/gitea-mcp ]]; then echo " OK gitea-mcp" else echo " FEHLT gitea-mcp" missing_other+=("go install gitea.com/gitea/gitea-mcp@latest") fi else if [[ ! -x ~/go/bin/gitea-mcp ]]; then echo " FEHLT gitea-mcp (go nicht vorhanden)" missing_apt+=("golang-go") missing_other+=("go install gitea.com/gitea/gitea-mcp@latest") else echo " OK gitea-mcp" fi fi # --- Claude-Code-Integrationen --- echo "" echo "=== Claude-Code-Integrationen ===" if command -v claude &>/dev/null; then if claude mcp list 2>/dev/null | grep -q "context7"; then echo " OK context7 Plugin" else echo " FEHLT context7 Plugin -- in Claude Code aktivieren" fi if claude mcp list 2>/dev/null | grep -q "^gitea:"; then echo " OK gitea MCP" else echo " FEHLT gitea MCP" missing_other+=("claude mcp add --scope user gitea -- bash ~/.claude/gitea-mcp-wrapper.sh") fi else echo " claude CLI nicht gefunden -- MCP-Checks uebersprungen" fi # --- Gitea-Token --- GITEA_TOKEN_FILE="$HOME/.config/gitea/token" echo "" echo "=== Gitea-Token ===" if [[ -f "$GITEA_TOKEN_FILE" ]]; then echo " OK $GITEA_TOKEN_FILE" else echo " FEHLT $GITEA_TOKEN_FILE" missing_other+=("mkdir -p ~/.config/gitea && chmod 700 ~/.config/gitea" "echo 'DEIN_TOKEN' > ~/.config/gitea/token && chmod 600 ~/.config/gitea/token") fi # --- Zusammenfassung --- echo "" if [[ ${#missing_apt[@]} -eq 0 && ${#missing_other[@]} -eq 0 ]]; then echo "Alles vorhanden. Keine weiteren Schritte noetig." else echo "=== Fehlende Pakete installieren ===" echo "Folgende Befehle ausfuehren:" echo "" if [[ ${#missing_apt[@]} -gt 0 ]]; then echo " sudo apt-get install -y ${missing_apt[*]}" fi for cmd in "${missing_other[@]}"; do echo " $cmd" done echo "" echo "Danach bootstrap.sh erneut ausfuehren zur Kontrolle." fi