38 Datei(en) geändert. Erzeugt von .vault-tools/auto-push/werkzeuge_spiegel.py.
3.5 KiB
3.5 KiB
type, title, status, summary, tags, created, updated
| type | title | status | summary | tags | created | updated | ||
|---|---|---|---|---|---|---|---|---|
| resource | shell_wache.py | active | Codedoku zum PreToolUse-Hook, der im Befehl des Bash-Werkzeugs vier Windows-Shell-Fallen erkennt und einen Hinweis in den Kontext gibt, ohne je abzulehnen. |
|
2026-10-30 | 2026-10-30 |
Werkzeug: ENTWURF.md
shell_wache.py
Wofür
- Warnt vor
python -Iohne-X utf8,python3,bashohne Pfad aus cmd, PowerShell oder Python undpkill -f, bevor das Bash-Werkzeug den Befehl ausführt.
Ablauf
- Claude Code startet das Skript vor jedem Aufruf des Bash-Werkzeugs, eingetragen in
.claude/settings.jsonunterPreToolUse, MatcherBash, alspython -I -X utf8, Zeitlimit 10 s. lies_eingabe()liest stdin als Bytes und holttool_input.command. Kaputte Eingabe ergibt den Grund für[eingabe], ein leerer Befehl bleibt still.- Die vier Detektoren in
DETEKTORENlaufen je in eigenemtry. Ein Absturz darin wird[intern], die übrigen laufen weiter. baue_text()setzt Kopfzeile und je getroffenem Schlüssel eine Zeile ausHINWEISEzusammen.melde()schreibt genau ein JSON-Objekt mithookSpecificOutput.additionalContext. Ohne Befund schreibt das Skript nichts.- Das Skript endet immer mit Exit 0.
# Regressionstreiber: Grundlinie, dann alle Fälle, je Fall ein eigener Prozess
python -I -X utf8 .vault-tools/shell-wache/faelle_shell_wache.py
# Gegen eine mutierte Kopie: Pfad zum Hook als erstes Argument
python -I -X utf8 .vault-tools/shell-wache/faelle_shell_wache.py /pfad/zur/kopie/shell_wache.py
Annahmen
- Claude Code liefert die Hook-Eingabe als JSON mit
tool_nameundtool_input.command. Belegt am 2026-10-30 in einer frischen Sitzung mit Claude Code 2.1.309: Im Transkript stehenhook_successundhook_additional_contextfürPreToolUse:Bash. additionalContextbei PreToolUse erreicht das Modell. Belegt in derselben Probe: Das Modell gab den Hinweis wörtlich wieder.- Das Bash-Werkzeug ist die Git-Bash. Ein
bashauf oberster Ebene ist dort/usr/bin/bash(type -a bash, 2026-10-30) und bleibt still. - Eine geänderte
settings.jsonwirkt in laufenden Sitzungen sofort. Am 2026-10-30 schlug der Hook in der Sitzung, die ihn eingetragen hat, beim nächsten Bash-Aufruf an.
Was beim Anfassen weh tut
- Nie Exit 2 und nie
permissionDecision. Exit 2 lehnt den Befehl ab,allowüberspringt die Berechtigungsabfrage. Beides fängt der Treiber, die letzte Schranke in__main__hält Exit 0 auch bei Absturz. - Keine Importe aus dem eigenen Ordner.
python -Inimmt den Skriptordner aussys.path. - Erwähnungen schlagen an. Ein Befehl, der
pkill -fnur als Text enthält, löst den Hinweis aus. Das ist eine benannte Lücke, kein Fehler. Wer sie schließen will, braucht eine Shell-Grammatik, keinen weiteren regulären Ausdruck. - Die Linux-Weiche gilt für den ganzen Befehl. Wer sie auf Zeilen einschränkt, macht
ssh h python - <<'EOF'mit["bash"im Heredoc laut. - Zwei Mutanten sind wirkungslos:
-cnicht als Ende der Python-Optionen zu werten und einen leeren Befehl an die Detektoren zu geben. In beiden Fällen ändert sich keine Ausgabe, deshalb fängt sie kein Fall. - Ein neues Muster braucht einen Treffer- und einen Gegenfall im Treiber, je am Anfang und am Ende des Befehls, und einen Rotlauf mit gelöschtem Detektor.
- Probe-Eingaben mit Backslash legst du mit dem Write-Werkzeug an. Ein
printfmit\\in einem Bash-Aufruf kam am 2026-10-30 als einzelnes\an, und der Hook meldete richtig „kein JSON“.