--- name: git-permission-scope-offen description: "Plan — Git/cd/Datei-Operationen prompt-frei, aber strukturell auf die additionalDirectories des Projekts beschränkt; via update_scripts-Command generiert" metadata: node_type: memory type: project originSessionId: febf94f9-e40c-4832-b02b-908ec923f9ed --- Geklärt (Stand 2026-06-20). Ziel: Im Projekt sollen Git, Verzeichniswechsel, Lesen und Schreiben **ohne Permission-Prompt** laufen — aber strukturell beschränkt auf die Verzeichnisse des jeweiligen Projekts (die `permissions.additionalDirectories` der Projekt-`settings.json`). Kein globales `git`, kein globales `cd`. Für limbach sind das `~/projects/limbach` und `~/claude-projects/limbach`; das Prinzip gilt projektweise für jedes Projekt. Grundunterschied im Permission-Modell: - **Bash-Regeln matchen den Befehls-String, nicht das Arbeitsverzeichnis** — eine verzeichnis-beschränkte Bash-Regel ist nicht ausdrückbar. Lösung: Wrapper-Skripte, die das Zielverzeichnis fest verdrahten; nur der Wrapper-Aufruf wird erlaubt. - **Datei-Tools (`Read`/`Edit`/`Write`) lassen sich auf Pfad-Globs beschränken** — hier geht die echte Verzeichnis-Beschränkung direkt. Plan — ein `update_scripts`-Command, der im aktuellen Projektordner die `additionalDirectories` aus der Settings liest und daraus generiert: 1. **git-Wrapper** (analog [[git-sync]], aber für interaktives git): Skript führt `git -C …` aus, Dirs fest aus den additionalDirectories. Permission-Regel: nur `Bash(:*)`. Aufruf bekommt Zielverzeichnis als Argument. 2. **cd-Aliasse** `cd-project-root` / `cd-claude-root`: exakte Bash-Regeln je Pfad statt `cd:*`, z. B. `Bash(cd ~/projects/limbach)` und `Bash(cd ~/claude-projects/limbach)`. cwd persistiert zwischen Bash-Calls, reicht zum Springen. 3. **Read/Edit/Write-Globs** je Verzeichnis: `Read(~/projects/limbach/**)`, `Edit(~/projects/limbach/**)`, `Write(~/projects/limbach/**)` und analog für `~/claude-projects/limbach/**`. Damit läuft Coden in genau diesen Dirs prompt-frei, außerhalb wird weiter gefragt. Aufräumen: globales `Bash(cd:*)` in `~/claude-projects/global/settings.json` (Symlink-Ziel von `~/.claude/settings.json`) wieder entfernen — vom User als „Mist" bewertet. Globale git-Regeln (`git add/commit/push/…:*`) ebenfalls raus, sobald die Wrapper stehen. Hintergrund: `git-sync` ist davon getrennt (synct alle Repos batch-weise, [[git-sync]]). Ursache früherer Prompts war u. a. das Bündeln von Git mit Nicht-Git-Befehlen (`cd … && ls`, `printf > datei`) in einer Zeile — Permission-Matching prüft jedes `&&`-Segment einzeln; die Wrapper umgehen das.