4.2 KiB
ai-control
Pool- und Session-Verwaltung für 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/<pool>. 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). Ohne Registry gilt das Alt-Layout: Unterordner von~/claude-projectsmit.claude-Ordner. 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 <projekt>) — ein Fenster mit eigener PTY; startet Claude Code im Projektverzeichnis mitCLAUDE_CONFIG_DIRdes zugeordneten Pools.
Laufende Projekte werden über die Terminal-Prozesse erkannt (pgrep auf --terminal <projekt>), 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
./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/<pool>/ je Pool ein Claude-Config-Verzeichnis
└── pool.json Name + Credential-Typ
<projektordner>/ beliebiger Pfad, per Registry gemappt
├── .claude/ Claude-Code-Projektkonfiguration
└── ai-control.json Pool-Zuordnung + Terminal-Einstellungen