Files
ai-control/README.md
T

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-projects mit .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 mit CLAUDE_CONFIG_DIR des 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