From 3a0233253c1a2b2639cbb3b6038d79f6b333f52a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Tr=C3=B6ger?= Date: Sun, 19 Apr 2026 13:39:02 +0200 Subject: [PATCH 1/3] =?UTF-8?q?bootstrap:=20Voraussetzungen=20automatisch?= =?UTF-8?q?=20pr=C3=BCfen=20und=20installieren?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit jq, ruff und secret-tool werden bei Bedarf via apt/pipx installiert. Fehlender Gitea-Token wird interaktiv abgefragt und im Keyring gespeichert. Co-Authored-By: Claude Sonnet 4.6 --- bootstrap.sh | 56 ++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 52 insertions(+), 4 deletions(-) diff --git a/bootstrap.sh b/bootstrap.sh index 635ea3f..0d700f3 100755 --- a/bootstrap.sh +++ b/bootstrap.sh @@ -31,7 +31,55 @@ chmod +x "$REPO/hooks/"*.sh echo "✓ Hooks ausführbar" echo "" -echo "Setup abgeschlossen. Voraussetzungen prüfen:" -echo " - secret-tool: secret-tool lookup user claude-code token gitea" -echo " - ruff: ruff --version" -echo " - jq: jq --version" +echo "=== Voraussetzungen prüfen ===" + +# --- jq --- +if command -v jq &>/dev/null; then + echo "✓ jq $(jq --version)" +else + echo " jq fehlt – installiere via apt..." + sudo apt-get install -y jq + echo "✓ jq installiert" +fi + +# --- ruff --- +if command -v ruff &>/dev/null; then + echo "✓ ruff $(ruff --version)" +else + echo " ruff fehlt – installiere via pipx..." + if ! command -v pipx &>/dev/null; then + sudo apt-get install -y pipx + pipx ensurepath + fi + pipx install ruff + echo "✓ ruff installiert" +fi + +# --- secret-tool + Gitea-Token --- +if ! command -v secret-tool &>/dev/null; then + echo " secret-tool fehlt – installiere libsecret-tools..." + sudo apt-get install -y libsecret-tools + echo "✓ secret-tool installiert" +else + echo "✓ secret-tool vorhanden" +fi + +echo " Gitea-Token prüfen..." +if secret-tool lookup user claude-code token gitea &>/dev/null; then + echo "✓ Gitea-Token vorhanden" +else + echo "" + echo " Gitea-Token für claude-code nicht gefunden." + read -r -p " Gitea-Token eingeben (https://gitea.troeger-net.org): " GITEA_TOKEN + if [[ -n "${GITEA_TOKEN// /}" ]]; then + echo -n "$GITEA_TOKEN" | secret-tool store \ + --label="Gitea claude-code token" \ + user claude-code token gitea + echo "✓ Gitea-Token gespeichert" + else + echo "⚠ Kein Token eingegeben – übersprungen" + fi +fi + +echo "" +echo "✓ Bootstrap abgeschlossen" -- 2.54.0 From 899bf201c7b1932e13d77423afbd39003d8c0ea8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Tr=C3=B6ger?= Date: Sun, 19 Apr 2026 13:53:29 +0200 Subject: [PATCH 2/3] bootstrap: Gitea-MCP und context7 automatisch einrichten MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - gitea-mcp Binary via go install installieren falls fehlend - gitea MCP-Server via `claude mcp add --scope user` registrieren - context7 Plugin-Aktivierung prüfen und bei Fehlen warnen - Wrapper-Skript löst GITEA_ACCESS_TOKEN zur Laufzeit via secret-tool auf - mcpServers-Block aus settings.json entfernt (wird von Claude Code ignoriert) Co-Authored-By: Claude Sonnet 4.6 --- bootstrap.sh | 28 +++++++++++ dotfiles/gitea-mcp-wrapper.sh | 3 ++ dotfiles/settings.json | 94 +++++++++++++++++------------------ 3 files changed, 78 insertions(+), 47 deletions(-) create mode 100755 dotfiles/gitea-mcp-wrapper.sh diff --git a/bootstrap.sh b/bootstrap.sh index 0d700f3..08149ed 100755 --- a/bootstrap.sh +++ b/bootstrap.sh @@ -24,6 +24,8 @@ 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" # Hooks ausführbar machen @@ -55,6 +57,32 @@ else echo "✓ ruff installiert" fi +# --- gitea-mcp Binary --- +if [[ -x ~/go/bin/gitea-mcp ]]; then + echo "✓ gitea-mcp vorhanden" +else + echo " gitea-mcp fehlt – installiere via go install..." + go install gitea.com/gitea/gitea-mcp@latest + echo "✓ gitea-mcp installiert" +fi + +# --- context7 Plugin-Check --- +if claude mcp list 2>/dev/null | grep -q "context7"; then + echo "✓ context7 Plugin aktiv" +else + echo "⚠ context7 Plugin nicht aktiv – prüfe enabledPlugins in settings.json" + echo " Ggf. Claude Code neu starten oder Plugin manuell aktivieren." +fi + +# --- gitea-mcp in Claude Code registrieren --- +if claude mcp list 2>/dev/null | grep -q "^gitea:"; then + echo "✓ gitea MCP bereits registriert" +else + echo " Registriere gitea MCP..." + claude mcp add --scope user gitea -- bash ~/.claude/gitea-mcp-wrapper.sh + echo "✓ gitea MCP registriert" +fi + # --- secret-tool + Gitea-Token --- if ! command -v secret-tool &>/dev/null; then echo " secret-tool fehlt – installiere libsecret-tools..." diff --git a/dotfiles/gitea-mcp-wrapper.sh b/dotfiles/gitea-mcp-wrapper.sh new file mode 100755 index 0000000..a8f5e9a --- /dev/null +++ b/dotfiles/gitea-mcp-wrapper.sh @@ -0,0 +1,3 @@ +#!/bin/bash +exec env GITEA_ACCESS_TOKEN="$(secret-tool lookup user claude-code token gitea)" \ + ~/go/bin/gitea-mcp -host https://gitea.troeger-net.org diff --git a/dotfiles/settings.json b/dotfiles/settings.json index d68f633..1f6174e 100644 --- a/dotfiles/settings.json +++ b/dotfiles/settings.json @@ -1,50 +1,50 @@ { - "permissions": { - "allow": [ - "Bash(npm run build:*)", - "Bash(grep:*)", - "Bash(xargs:*)", - "WebSearch", - "Bash(npm install)", - "Bash(curl:*)", - "Bash(ls:*)", - "Bash(python3:*)" - ], - "defaultMode": "default" - }, - "statusLine": { - "type": "command", - "command": "bash ~/.claude/statusline-command.sh" - }, - "enabledPlugins": { - "typescript-lsp@claude-plugins-official": true, - "frontend-design@claude-plugins-official": true, - "context7@claude-plugins-official": true, - "code-review@claude-plugins-official": true, - "code-simplifier@claude-plugins-official": true - }, - "language": "German", - "hooks": { - "PostToolUse": [ - { - "matcher": "Edit|Write", - "hooks": [ - { - "type": "command", - "command": "bash /mnt/projekte/claude-workflow/hooks/auto-format.sh" - } - ] - } - ], - "Stop": [ - { - "hooks": [ - { - "type": "command", - "command": "bash /mnt/projekte/claude-workflow/hooks/verify-on-stop.sh" - } - ] - } + "permissions": { + "allow": [ + "Bash(npm run build:*)", + "Bash(grep:*)", + "Bash(xargs:*)", + "WebSearch", + "Bash(npm install)", + "Bash(curl:*)", + "Bash(ls:*)", + "Bash(python3:*)" + ], + "defaultMode": "default" + }, + "hooks": { + "PostToolUse": [ + { + "matcher": "Edit|Write", + "hooks": [ + { + "type": "command", + "command": "bash /mnt/projekte/claude-workflow/hooks/auto-format.sh" + } ] - } + } + ], + "Stop": [ + { + "hooks": [ + { + "type": "command", + "command": "bash /mnt/projekte/claude-workflow/hooks/verify-on-stop.sh" + } + ] + } + ] + }, + "statusLine": { + "type": "command", + "command": "bash ~/.claude/statusline-command.sh" + }, + "enabledPlugins": { + "typescript-lsp@claude-plugins-official": true, + "frontend-design@claude-plugins-official": true, + "context7@claude-plugins-official": true, + "code-review@claude-plugins-official": true, + "code-simplifier@claude-plugins-official": true + }, + "language": "German" } -- 2.54.0 From 7c63684e5c26789d0b73284f4a3b4648de771fd8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Tr=C3=B6ger?= Date: Sun, 19 Apr 2026 14:09:25 +0200 Subject: [PATCH 3/3] =?UTF-8?q?bootstrap:=20gh-Installation=20erg=C3=A4nze?= =?UTF-8?q?n,=20Fehlende-Tools-Policy=20in=20CLAUDE.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - bootstrap.sh: gh CLI automatisch installieren falls nicht vorhanden - dotfiles/CLAUDE.md: Policy für fehlende Tools dokumentiert (kein Workaround, User informieren + bootstrap.sh ergänzen) Co-Authored-By: Claude Sonnet 4.6 --- bootstrap.sh | 9 +++++++++ dotfiles/CLAUDE.md | 8 ++++++++ 2 files changed, 17 insertions(+) diff --git a/bootstrap.sh b/bootstrap.sh index 08149ed..2a5bdfc 100755 --- a/bootstrap.sh +++ b/bootstrap.sh @@ -35,6 +35,15 @@ echo "✓ Hooks ausführbar" echo "" echo "=== Voraussetzungen prüfen ===" +# --- gh (GitHub CLI, wird auch für Gitea-PRs genutzt) --- +if command -v gh &>/dev/null; then + echo "✓ gh $(gh --version | head -1)" +else + echo " gh fehlt – installiere via apt..." + sudo apt-get install -y gh + echo "✓ gh installiert" +fi + # --- jq --- if command -v jq &>/dev/null; then echo "✓ jq $(jq --version)" diff --git a/dotfiles/CLAUDE.md b/dotfiles/CLAUDE.md index 08d02cd..9b1da29 100644 --- a/dotfiles/CLAUDE.md +++ b/dotfiles/CLAUDE.md @@ -39,6 +39,14 @@ PRs muessen jedes Akzeptanzkriterium einzeln als Checkbox auflisten und bestaeti Niemals direkt auf `main` committen. Alle Aenderungen ueber Feature-Branches und PRs. +## Fehlende Tools + +Wenn ein benötigtes CLI-Tool fehlt: **nicht** mit Workarounds (curl, rohe API-Calls) umgehen. Stattdessen: + +1. User informieren welches Tool fehlt und den Installations-Befehl nennen +2. User führt den Befehl in einer separaten Konsole aus (sudo funktioniert dort) +3. Tool danach in `bootstrap.sh` aufnehmen, damit es auf allen Maschinen automatisch installiert wird + ## Gitea-Integration Instanz: `https://gitea.troeger-net.org`. Bot-User `claude-code`, Token: `GITEA_TOKEN=$(secret-tool lookup user claude-code token gitea)`. Bot hat nur Collaborator-Rechte. -- 2.54.0