bootstrap.sh empfiehlt fnm statt nvm für Node.js-Installation und gibt klare Installationsbefehle statt eines #-Kommentars aus. Neue Entwicklungs- regel: systemverändernde Scripts nie zum Testen ausführen. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
169 lines
4.6 KiB
Bash
Executable File
169 lines
4.6 KiB
Bash
Executable File
#!/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 fnm &>/dev/null; then
|
|
eval "$(fnm env 2>/dev/null)" || true
|
|
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 (Node.js nicht vorhanden)"
|
|
missing_other+=("curl -fsSL https://fnm.vercel.app/install | bash"
|
|
"fnm install --lts"
|
|
"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
|