Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Hook-Pipeline

Die precc-hook-Binary ist der Kern von PRECC. Sie sitzt zwischen Claude Code und der Shell und verarbeitet jeden Bash-Befehl in unter 5 Millisekunden.

Wie Claude Code den Hook aufruft

Claude Code unterstützt PreToolUse-Hooks – externe Programme, die Werkzeugeingaben vor der Ausführung inspizieren und ändern können. Wenn Claude einen Bash-Befehl ausführen will, sendet es JSON an precc-hook über stdin und liest die Antwort von stdout.

Pipeline-Stufen

Claude Code
    |
    v
+---------------------------+
| 1. Parse JSON stdin       |  Read the command from Claude Code
+---------------------------+
    |
    v
+---------------------------+
| 2. Skill matching         |  Query heuristics.db for matching skills (Pillar 4)
+---------------------------+
    |
    v
+---------------------------+
| 3. Directory correction   |  Resolve correct working directory (Pillar 1)
+---------------------------+
    |
    v
+---------------------------+
| 4. GDB check              |  Detect debug opportunities (Pillar 2)
+---------------------------+
    |
    v
+---------------------------+
| 5. RTK rewriting          |  Apply command rewrites for token savings
+---------------------------+
    |
    v
+---------------------------+
| 6. Emit JSON stdout       |  Return modified command to Claude Code
+---------------------------+
    |
    v
  Shell executes corrected command

Beispiel: JSON Ein- und Ausgabe

Eingabe (von Claude Code)

{
  "tool_input": {
    "command": "cargo build"
  }
}

PRECC erkennt, dass das aktuelle Verzeichnis kein Cargo.toml hat, aber ./myapp/Cargo.toml existiert.

Ausgabe (an Claude Code)

{
  "hookSpecificOutput": {
    "updatedInput": {
      "command": "cd /home/user/projects/myapp && cargo build"
    }
  }
}

Wenn keine Änderung nötig ist, ist updatedInput.command leer und Claude Code verwendet den ursprünglichen Befehl.

Stufendetails

Stufe 1: JSON parsen

Liest das vollständige JSON-Objekt von stdin. Extrahiert tool_input.command. Bei einem Parsing-Fehler beendet sich der Hook sofort und Claude Code verwendet den ursprünglichen Befehl (Fail-Open-Design).

Stufe 2: Skill-Matching

Fragt die SQLite-Heuristik-Datenbank nach Skills ab, deren Trigger-Muster zum Befehl passt. Skills werden in Prioritätsreihenfolge geprüft. Sowohl eingebaute TOML-Skills als auch geminte Skills werden ausgewertet.

Stufe 3: Verzeichniskorrektur

Prüft bei Build-Befehlen (cargo, go, make, npm, python usw.), ob die erwartete Projektdatei im aktuellen Verzeichnis existiert. Falls nicht, durchsucht es benachbarte Verzeichnisse nach der nächstgelegenen Übereinstimmung und stellt cd <dir> && voran.

Der Verzeichnisscan verwendet einen zwischengespeicherten Dateisystemindex mit 5 Sekunden TTL für hohe Geschwindigkeit.

Stufe 4: GDB-Prüfung

Wenn der Befehl wahrscheinlich einen Absturz verursacht (z.B. Ausführen einer Debug-Binary), kann PRECC GDB-Wrapper vorschlagen oder injizieren, um strukturierte Debug-Ausgaben statt roher Absturz-Logs zu erfassen.

Stufe 5: RTK-Umschreibung

Wendet RTK-Regeln (Rewrite Toolkit) an, die ausführliche Befehle kürzen, verrauschte Ausgaben unterdrücken oder Befehle für Token-Effizienz umstrukturieren.

Stufe 6: JSON ausgeben

Serialisiert den geänderten Befehl zurück zu JSON und schreibt ihn auf stdout. Wenn keine Änderungen vorgenommen wurden, signalisiert die Ausgabe Claude Code, den ursprünglichen Befehl zu verwenden.

Leistung

Die gesamte Pipeline wird in unter 5 Millisekunden (p99) abgeschlossen. Wichtige Optimierungen:

  • SQLite im WAL-Modus für sperrfreie parallele Lesezugriffe
  • Vorkompilierte Regex-Muster für Skill-Matching
  • Zwischengespeicherte Dateisystem-Scans (5 Sekunden TTL)
  • Keine Netzwerkaufrufe im Hot Path
  • Fail-Open: Jeder Fehler fällt auf den ursprünglichen Befehl zurück

Den Hook manuell testen

Sie können den Hook direkt aufrufen:

$ echo '{"tool_input":{"command":"cargo build"}}' | precc-hook
{"hookSpecificOutput":{"updatedInput":{"command":"cd /home/user/myapp && cargo build"}}}