File size: 7,422 Bytes
5134cea | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 | # Claude Code Harness — Referenz für AI Engineers
> Zielgruppe: Samuel (kennt Claude Code). Fokus: Tuning, Config, Betrieb — kein Onboarding.
---
## 1. Architektur
Claude Code ist kein Wrapper, sondern ein natives Harness mit direktem API-Zugriff. Die Architektur besteht aus fünf Schichten:
```
CLAUDE.md (global + per-project) ← deklarative Verhaltenssteuerung
↓
settings.json / settings.local.json ← Permissions, Hooks, Modell
↓
Hooks (5 Lifecycle-Points) ← Prozess-Steuerung
↓
Agents / Skills / Commands ← Capability-Erweiterung
↓
MCP-Tools ← externe Tool-Integration
```
**Lifecycle-Points:**
| Hook | Zeitpunkt | Kann blocken? |
|---|---|---|
| `SessionStart` | Session-Init | nein |
| `UserPromptSubmit` | vor LLM-Call | ja (additionalContext-Injection) |
| `PreToolUse` | vor Tool-Aufruf | ja (Blocking-Gate) |
| `PostToolUse` | nach Tool-Aufruf | nein |
| `Stop` | Session-Ende | nein |
**Config-Hierarchie (letzte Regel gewinnt nicht — Regeln akkumulieren):**
```
~/.claude/settings.json
~/.claude/settings.local.json (Overrides)
~/.claude/CLAUDE.md (globale Verhaltensregeln)
<project-root>/CLAUDE.md (projektspezifische Regeln)
```
---
## 2. Konfiguration
### settings.json — Hauptfelder
```jsonc
{
"model": "claude-opus-4-6", // Default-Modell
"env": {
"CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS": "1"
},
"permissions": {
"allow": ["Edit", "Write", "Glob", "Grep", "Agent", "Bash(git*)"],
"deny": ["Bash(rm*)", "Bash(apt*)", "Bash(dd*)"]
},
"hooks": {
"PreToolUse": [
{ "matcher": "Agent", "hooks": [{"type": "command", "command": "~/.claude/hooks/enforce-background-agents.py"}] }
],
"UserPromptSubmit": [
{ "hooks": [{"type": "command", "command": "~/.claude/hooks/hook_inject.py"}] }
]
}
}
```
**Bash-Permissions nutzen Glob-Pattern:**
- `Bash(git*)` — alle git-Befehle
- `Bash(python3 /home/*)` — python3 mit absolutem Pfad
- `Bash(*)` — alles (gefährlich, nur in settings.local.json)
### settings.local.json — Lokale Overrides
Nicht ins Git. Für Permissions die auf dem eigenen Rechner OK sind, aber nicht im Repo.
```jsonc
{
"permissions": {
"allow": ["Bash(gh api*)", "Bash(python3*)"]
}
}
```
### CLAUDE.md — Verhaltenssteuerung
Nicht wie ein Config-File behandeln — ist ein Aufmerksamkeitsbudget. Jede Regel konkurriert um Kontext.
**Kritische Faustregel:** Weniger Regeln, schärfer formuliert > viele Regeln, weich formuliert. Ab ~50 Regeln sinkt die Compliance messbar.
---
## 3. Tuning
### Hook hinzufügen
```jsonc
// In settings.json, hooks.[HookPoint]:
{
"matcher": "Write", // Tool-Name oder "" für alle
"hooks": [{
"type": "command",
"command": "~/.claude/hooks/my-hook.py"
}]
}
```
Hook-Script bekommt JSON via stdin (`tool`, `input`, `session_id`). Exit-Code 0 = erlaubt, non-zero = geblockt (nur PreToolUse).
### Skill erstellen
```
~/.claude/skills/my-skill/SKILL.md
```
Frontmatter + Inhalt. Wird via `/my-skill` getriggert. Skills sind Kontext-Injektionen, keine Tools.
### Agent definieren
```markdown
---
name: my-agent
model: claude-sonnet-4-6
tools: [Read, Edit, Write, Bash]
subagent_type: general
---
Hier steht das System-Prompt des Agents.
```
Datei nach `~/.claude/agents/my-agent.md`. Agents erben alle aktiven Hooks — kein selektives Gate pro Agent möglich (aktuelles Limitation).
### Custom Command erstellen
```
~/.claude/commands/my-cmd.md
```
Wird via `/my-cmd` aufgerufen. Verhält sich wie ein Slash-Command der den Datei-Inhalt als System-Prompt setzt.
### Modell wechseln
```jsonc
// settings.json:
"model": "claude-sonnet-4-6"
```
Kein Runtime-Switching ohne Session-Neustart. Subagents können über Frontmatter ein anderes Modell nutzen.
### Statusline anpassen
`~/.claude/statusline.sh` liest JSON von stdin (Context%, Token-Usage, Git-Branch, aktive Hooks) und gibt ANSI-formatierte Ausgabe zurück. Direktes Bash/Python-Skript, editierbar ohne Neustart.
### Sidecar-NG Integration (Samuel's Setup)
Der `UserPromptSubmit`-Hook ruft `hook_inject.py` auf. Dieser klassifiziert den Prompt (Keyword-First → LLM-Fallback) und injiziert `additionalContext` in den Hook-Response. Die Injection landet im nächsten LLM-Call, nicht im Session-Kontext dauerhaft.
**Bekannter Bug #13650:** SessionStart-Injections werden verworfen. Workaround: Injection über `UserPromptSubmit` statt `SessionStart`.
---
## 4. Vor- und Nachteile
### Vorteile
| Feature | Bewertung |
|---|---|
| Hook-System | Stärkstes auf dem Markt — PreToolUse-Blocking ist einzigartig |
| Subagent-System | 21 typisierte Agents, parallele Ausführung, Background-Support |
| CLAUDE.md | Deklarative Verhaltenssteuerung ohne Code |
| Plan Mode (`--plan`) | Strukturiertes Denken vor Implementierung |
| MCP-Integration | Externe Tools (Gemini, OpenCode) nativ einbindbar |
| Tooling-Ökosystem | Skills + Commands + Agents + Hooks + Statusline kombinierbar |
### Nachteile
| Problem | Impact |
|---|---|
| Kostenstruktur | Opus ~$15/1M Tokens — teuerster Harness |
| Modell-Lock | Nur Anthropic-Modelle, kein Runtime-Switch |
| Attention Budget | >50 CLAUDE.md-Regeln → messbare Compliance-Degradation |
| Session Hoarding | Lange Sessions akkumulieren toten Kontext |
| Hook-Freeze | Hooks-Änderungen erfordern Session-Neustart |
| Kein SessionEnd-Hook | Cleanup nach Session-Ende nicht möglich |
| Bug #13650 | SessionStart additionalContext wird verworfen |
| Hook-Inheritance | Subagents erben alle Hooks — keine differenzierten Gates |
---
## 5. Referenz
### Dateipfade
| Pfad | Zweck |
|---|---|
| `~/.claude/settings.json` | Hauptconfig: Modell, Permissions, Hooks |
| `~/.claude/settings.local.json` | Lokale Overrides (nicht im Git) |
| `~/.claude/CLAUDE.md` | Globale Verhaltensregeln |
| `~/.claude/agents/` | Agent-Definitionen (21 aktive) |
| `~/.claude/skills/` | Skill-Definitionen |
| `~/.claude/commands/` | Custom Slash-Commands |
| `~/.claude/hooks/` | Hook-Scripts |
| `~/.claude/statusline.sh` | Statusbar-Script |
| `~/.claude/usage/*.jsonl` | Token-Tracking |
| `~/.claude/events/*.jsonl` | Event-Logs (Telemetrie) |
### Aktive Hooks (Samuel's Setup)
| Hook | Trigger | Funktion |
|---|---|---|
| `enforce-background-agents.py` | PreToolUse → Agent | Blockt Agent-Calls ohne `run_in_background` |
| `coach-before.sh` | SessionStart | Rotiert Playbook-Regeln, Streak-Counter |
| `event_logger.py` | alle Events | JSON-Telemetrie aller Tool-Calls |
| `gsd-context-monitor.js` | PostToolUse | Context-Window-Überwachung |
| `hook_inject.py` (Sidecar-NG) | UserPromptSubmit | Prompt-Klassifikation + Context-Injection |
### Wichtige Befehle
```bash
claude # Session starten (Standard-Modell aus settings.json)
claude --plan # Plan Mode — denkt vor Implementierung
/compact # Context komprimieren (lossless summary)
/status # Session-Status: Context%, Token-Usage, aktive Hooks
/my-skill # Skill triggern (Dateiname ohne .md)
```
### Debugging
```bash
# Hook-Output testen (stdin simulieren):
echo '{"tool":"Write","input":{"file_path":"/tmp/test"}}' | ~/.claude/hooks/my-hook.py
# Event-Logs lesen:
# ~/.claude/events/YYYY-MM-DD.jsonl
# Token-Usage prüfen:
# ~/.claude/usage/YYYY-MM.jsonl
```
|