From f66af81da24ebff1724470f281dc61263edcaac8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Tr=C3=B6ger?= Date: Tue, 21 Apr 2026 08:05:47 +0200 Subject: [PATCH] =?UTF-8?q?feat:=20Erg=C3=A4nze=20/script-Skill=20f=C3=BCr?= =?UTF-8?q?=20Bash-Script-Lifecycle?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Neuer Skill /script mit Repo-Check, Opus-Planung, Sonnet-Implementierung, Shellcheck-Pflicht, Test-Empfehlungen, /ship - auto-format.sh lintet .sh-Dateien via shellcheck - bootstrap.sh installiert shellcheck automatisch - /story speichert Pläne jetzt unter /plans/ und bricht ohne Git-Repo ab - CLAUDE.md-Tabellen für Skills, Hooks und Tools ergänzt --- CLAUDE.md | 4 +- bootstrap.sh | 9 ++ hooks/auto-format.sh | 5 ++ skills/script/SKILL.md | 99 ++++++++++++++++++++++ skills/story/SKILL.md | 10 +++ skills/story/references/phase-2-planung.md | 2 +- 6 files changed, 127 insertions(+), 2 deletions(-) create mode 100644 skills/script/SKILL.md diff --git a/CLAUDE.md b/CLAUDE.md index d6ff9cb..44f5ee4 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -24,6 +24,7 @@ Das Bootstrap-Skript installiert alle Tools, erstellt alle Symlinks und richtet | `jq` | Statusline-Parsing | `apt install jq` | | `ruff` | Python-Formatter (Hook) | `pipx install ruff` | | `eslint` | JS/TS/Vue-Formatter (Hook) | Projektabhängig | +| `shellcheck` | Bash-Linter (Hook + /script) | `apt install shellcheck` | | `secret-tool` | Gitea-Token abrufen | `apt install libsecret-tools` | | `gh` | GitHub CLI | `apt install gh` | | `go` + `gitea-mcp` | Gitea-MCP-Binary | `go install gitea.com/gitea/gitea-mcp@latest` | @@ -95,6 +96,7 @@ Kurzbefehl für den gesamten Ablauf: `/story` | `/go` | `skills/go/SKILL.md` | test-runner → code-simplifier → Gitea-PR | | `/ship` | `skills/ship/SKILL.md` | Commit → Push → PR → Merge → Cleanup (finales Kommando) | | `/plan-review` | `skills/plan-review/SKILL.md` | Startet plan-reviewer-Agent (Opus, fork) | +| `/script` | `skills/script/SKILL.md` | Bash-Script-Lifecycle: Planung (Opus) → Implementierung (Sonnet) → Shellcheck + Test-Empfehlungen → /ship | | `/story` | `skills/story/SKILL.md` | Voller Lifecycle von Research bis PR | | `/workflow-review` | `skills/workflow-review/SKILL.md` | Opus reviewt alle Skills/Konfig → Umsetzungsplan für Sonnet | @@ -111,7 +113,7 @@ Kurzbefehl für den gesamten Ablauf: `/story` | Event | Trigger | Skript | Aktion | |---|---|---|---| -| `PostToolUse` | Edit / Write | `hooks/auto-format.sh` | `ruff` (Python) oder `eslint --fix` (JS/TS/Vue) | +| `PostToolUse` | Edit / Write | `hooks/auto-format.sh` | `ruff` (Python), `eslint --fix` (JS/TS/Vue) oder `shellcheck` (Bash) | | `Stop` | Session-Ende | `hooks/verify-on-stop.sh` | Uncommittete Änderungen anzeigen | `auto-format.sh` liest den Dateipfad aus `$CLAUDE_TOOL_INPUT_FILE_PATH` und erkennt den Typ anhand der Dateiendung. diff --git a/bootstrap.sh b/bootstrap.sh index e991a62..8ed7c2a 100755 --- a/bootstrap.sh +++ b/bootstrap.sh @@ -66,6 +66,15 @@ else echo "✓ ruff installiert" fi +# --- shellcheck (Bash-Lint-Hook + /script) --- +if command -v shellcheck &>/dev/null; then + echo "✓ shellcheck $(shellcheck --version | awk '/^version:/ {print $2}')" +else + echo " shellcheck fehlt – installiere via apt..." + sudo apt-get install -y shellcheck + echo "✓ shellcheck installiert" +fi + # --- gitea-mcp Binary --- if [[ -x ~/go/bin/gitea-mcp ]]; then echo "✓ gitea-mcp vorhanden" diff --git a/hooks/auto-format.sh b/hooks/auto-format.sh index 968cab4..67cfdfa 100755 --- a/hooks/auto-format.sh +++ b/hooks/auto-format.sh @@ -28,6 +28,11 @@ case "$EXT" in fi fi ;; + sh) + if command -v shellcheck &>/dev/null; then + shellcheck "$FILE" || true + fi + ;; esac exit 0 diff --git a/skills/script/SKILL.md b/skills/script/SKILL.md new file mode 100644 index 0000000..19f6843 --- /dev/null +++ b/skills/script/SKILL.md @@ -0,0 +1,99 @@ +--- +description: Bash-Script-Lifecycle nach Best Practices — Planung (Opus) → Implementierung (Sonnet) → Linting + Test-Empfehlungen → /ship. Aktivieren wenn ein neues Bash-Script erstellt oder ein bestehendes Bash-Script substanziell erweitert werden soll, auch wenn der User nur "schreib mir ein Script" oder "automatisier das per Bash" sagt. Nicht verwenden für andere Shells (sh/zsh/fish), Python-/Node-Scripts, einfache Einzeiler/Aliase, reine Refactorings oder Bug-Fixes an bestehendem Verhalten. +model: claude-opus-4-6 +--- + +# /script — Bash-Script-Lifecycle + +Führe den Bash-Script-Lifecycle vollständig durch. **Warte nach jeder Phase auf Bestätigung.** + +## Vorab: Repository-Check + +```bash +git rev-parse --show-toplevel +``` + +Scheitert der Befehl: **Abbruch**. Der Skill arbeitet ausschließlich innerhalb eines Repos, damit Plan und Script gemeinsam versioniert werden. Meldung an den User: + +> "Kein Git-Repository gefunden. Starte `/script` erst nach `git init` oder aus einem bestehenden Repo." + +## Phase 1: Planung (Opus) + +Aktiviere den Plan-Modus (`EnterPlanMode`). + +Wenn das Script auf spezifische Tools/Libraries aufsetzt (z.B. `jq`, `gh`, `yq`, Framework-CLIs), Dokumentation via Context-7 abrufen — nur wenn inhaltlich nützlich: + +``` +mcp__plugin_context7_context7__resolve-library-id +mcp__plugin_context7_context7__query-docs +``` + +Plan-Inhalt: + +- **Zweck:** Was das Script löst, ein bis zwei Sätze +- **CLI-Interface:** Positionsargumente und Flags (`--help`, `--dry-run` Pflicht bei destruktiven Aktionen, `--verbose`, ggf. `--yes`) +- **Abhängigkeiten:** Externe CLI-Tools, werden am Script-Start per `command -v` geprüft +- **Error-Handling:** Cleanup-Strategie (`trap`), definierte Exit-Codes (0 Erfolg, 1 Fehler, 2 Usage, weitere dokumentiert) +- **Log-/Konsolenausgabe:** `log_info`/`log_warn`/`log_error`, Fehler nach `stderr`, TTY-Farben (`[[ -t 1 ]]`) +- **Dry-Run:** Welche Aktionen werden durch Log-Ausgabe ersetzt +- **User-Einbindung:** Rückfragen bei irreversiblen Operationen (`read -p`), `--yes` für nicht-interaktive Ausführung +- **Test-Szenarien:** Konkrete Aufrufe für die spätere Verifikation + +Speichere den Plan unter `/plans/script-.md` (Verzeichnis bei Bedarf anlegen). + +Präsentiere den Plan dem User. Warte auf Bestätigung bevor Phase 2 startet. + +## Phase 2: Implementierung (Sonnet) + +Wechsle das Modell: `/model claude-sonnet-4-6`. + +Feature-Branch anlegen: + +```bash +git checkout -b feat/script- +``` + +Bash-spezifische Leitplanken (globale CLAUDE.md deckt den Rest ab): + +- Shebang `#!/usr/bin/env bash`, direkt danach `set -euo pipefail` und `IFS=$'\n\t'` +- Quoting konsequent: `"$var"`, Arrays als `"${array[@]}"` +- `main()`-Funktion am Dateiende, aufgerufen mit `main "$@"` +- Script ausführbar machen: `chmod +x ` + +## Phase 3: Linting + Test-Empfehlungen + +**Linting (Pflicht):** + +```bash +shellcheck