# ai-control Pool- und Session-Verwaltung für [Claude Code](https://claude.com/claude-code) auf macOS — als Tray-App mit eingebautem Terminal. Linux- und Windows-Integration folgen. > Der gesamte Code dieses Projekts wurde von Claude (Claude Code) generiert. ## Zweck Wer Claude Code mit mehreren Accounts bzw. Credential-Sets betreibt, muss pro Session das richtige `CLAUDE_CONFIG_DIR` samt Keychain-Eintrag treffen. ai-control macht daraus Klicks: - **Pools** — benannte Credential-Sets (OAuth-Login oder API-Key) unter `~/.config/ai-control/pools/`. Jeder Pool ist ein eigenständiges Claude-Config-Verzeichnis mit eigenem Keychain-Eintrag. - **Projekte** — beliebige Verzeichnisse, gemappt über eine Registry (`~/.config/ai-control/projects.json`, Name → Pfad; Home-Pfade als `~/…` und damit maschinenübergreifend stabil). Jedem Projekt ist ein Pool zugeordnet; dazu Terminal-Einstellungen (Theme, Icon, Fenstertitel). - **Sessions** — pro Projekt ein eingebautes Terminal (xterm.js + PTY), das Claude Code mit der Pool-Umgebung startet. Jedes Terminal läuft als eigener Prozess mit eigenem Dock-Icon und Cmd-Tab-Eintrag. - **Tray** — die App selbst ist eine reine Menüleisten-App ohne Dock-Eintrag. Das Tray-Menü listet alle Projekte mit Icon und Status-Punkt (grün = läuft); Klick startet das Projekt oder holt das laufende Terminal nach vorn. - **Session-Watcher** — erkennt das Ende einer Session über das Verschwinden des Terminal-Prozesses und synct dann (opt-in) das Git-Repo, in dem das Projekt liegt: add → commit → pull --rebase → push. ## Projektaufbau ``` ├── index.html Haupt-UI (Projekt-/Pool-Verwaltung) ├── terminal.html Terminal-Fenster (xterm.js) ├── src/ Frontend: Vue 3 + TypeScript ├── src-tauri/ │ ├── src/lib.rs Tauri-Commands: Projekte, Pools, Keychain, │ │ OAuth-Login, Tray-Menü, Session-Watcher │ ├── src/terminal.rs PTY-Sessions (portable-pty), Terminal-Fenster, │ │ Dock-Icon, Fokussieren laufender Terminals │ └── icons/ App- und Tray-Icons ├── dev.sh Entwicklungsmodus (tauri dev) └── build.sh Release-Build (.app-Bundle) ``` Zwei Prozessrollen aus einem Binary: - **Haupt-App** (`ai-control`) — Tray, Hauptfenster, Verwaltung, Watcher. - **Terminal-Prozess** (`ai-control --terminal `) — ein Fenster mit eigener PTY; startet Claude Code im Projektverzeichnis mit `CLAUDE_CONFIG_DIR` des zugeordneten Pools. Laufende Projekte werden über die Terminal-Prozesse erkannt (`pgrep` auf `--terminal `), ohne Zustandsdatei. ## Tooling | Bereich | Stack | |-----------|-------| | Shell | Tauri 2 (Rust) | | Frontend | Vue 3, TypeScript, Vite | | Terminal | xterm.js, portable-pty | | macOS | objc2 / objc2-app-kit (Dock-Icon, Fenster-Fokus, Tray) | | Secrets | keyring (macOS Keychain) | ## Entwicklung ```sh ./dev.sh # tauri dev mit Hot-Reload ./build.sh # Release-Build; Bundle landet in src-tauri/target/release/bundle/macos.noindex/ ``` `build.sh` verschiebt das Bundle in ein `.noindex`-Verzeichnis und trägt es aus Launch Services aus, damit Spotlight nur die installierte Kopie findet. Installation: `ai-control.app` nach `~/Applications` kopieren. Voraussetzungen: Rust (stable), Node.js/npm, macOS. `dev.sh`/`build.sh` erwarten `CARGO_HOME`/`RUSTUP_HOME` unter `~/tools/` — bei Standard-Installation die beiden Exporte in den Skripten anpassen. ## Konfigurationslayout ``` ~/.config/ai-control/ ├── settings.json App-Einstellungen (z. B. syncOnSessionEnd) ├── projects.json Projekt-Registry: Name → Ordner └── pools// je Pool ein Claude-Config-Verzeichnis └── pool.json Name + Credential-Typ / beliebiger Pfad, per Registry gemappt ├── .claude/ Claude-Code-Projektkonfiguration └── ai-control.json Pool-Zuordnung + Terminal-Einstellungen ```