CLI & Headless
Überblick
Theron läuft auch ohne Fenster – mit denselben Agents und Prozessen wie in der App. Drei Wege:
- Konsole:
theron executeführt einen Prozess in einem Ordner aus – im Terminal, in CI oder per Cronjob. Rückfragen beantwortest du in der Konsole oder auf dem Theron-Server, oder Theron entscheidet mit-qselbst. - Slave:
theron --listenmacht einen Rechner zum Worker, den deine App steuert. Alles läuft dort weiter, auch wenn die App geschlossen ist. - Headless-Worker: derselbe Slave als Docker-Image mit eingebautem Claude Code – z. B. als Pod in Kubernetes.
Alle Builds enthalten Theron als kompilierten Maschinencode. Die Agents arbeiten mit Claude Code auf dem jeweiligen Rechner – mit deinem Claude-Abo – oder mit lokalen Modellen über OpenCode.
Installieren
- Auf deinem Rechner: In der App unter Einstellungen → Konsole · Befehl „theron“ →
„Befehl einrichten“. Er landet unter
~/.local/bin/theron(macOS, Linux) bzw.%LOCALAPPDATA%\Theron\bin\theron.cmd(Windows) und nutzt dieselben Daten wie die App. - Auf Servern: den eigenständigen Download von der Startseite nehmen (macOS, Windows, Linux x86_64/ARM64) und
entpacken; das Programm ist
theron/theronbzw.theron\theron.exe. Kein Qt, keine Oberfläche. macOS:xattr -dr com.apple.quarantine theron. - Claude-Login: einmal
claudeim Terminal starten und anmelden. Auf Rechnern ohne Browser erzeugst du lokal mitclaude setup-tokeneinen langlebigen Token und setzt ihn dort alsCLAUDE_CODE_OAUTH_TOKEN– das nutzt dein Abo, keine API-Kosten. - Daten: wie die App unter
~/Library/Application Support/Theron(macOS),%APPDATA%\Theron(Windows) bzw.~/.local/share/theron(Linux); mitTHERON_DATA=/pfadwoanders.
Befehle
| Befehl | Wirkung |
|---|---|
theron execute PROZESS [ORDNER] ["AUFTRAG"] [-q] [--no-server] | Einen Prozess ausführen (Alias: run). Details unten. |
theron processes | Vorhandene Prozesse auflisten. |
theron export PROZESS DATEI.theron | Einen Prozess samt Agents und Wissen exportieren. |
theron config [show] | Einstellungen anzeigen. |
theron config server ADRESSE TOKEN · … server off | Mit dem Theron-Server verbinden (prüft die Verbindung) bzw. trennen. |
theron config sync on|off [--knowledge on|off] [--memory on|off] [--databases on|off] | Prozesse und Agents über den Server abgleichen – auf Wunsch mit Wissen, Memorys und Datenbanken. |
theron config language de|en | Sprache von Theron. |
theron sync | Jetzt mit dem Server abgleichen. |
theron status · theron version | Version, Datenordner, Server, Sync, Claude-CLI. |
theron --listen HOST:PORT [--token TOKEN] [--no-plugins] | Als Slave starten (siehe unten). |
theron plugin list|install|remove|enable|disable|new|pack|keygen|trust … | Plugins verwalten und bauen – siehe Plugins. |
Prozesse ausführen
- Prozess: eine in der App exportierte
.theron-Datei (sie wird nur für diesen Lauf importiert) oder der Name eines vorhandenen Prozesses – z. B. aus der Bibliothek, die du mittheron config sync onundtheron syncvom Server holst. - Ordner: das Arbeitsverzeichnis der Agents (Standard: das aktuelle). Jeder Ordner bekommt ein eigenes Projekt „CLI · ordner“ – sein Verlauf bleibt erhalten.
- Auftrag: als Argument, mit
-von stdin oder aus einerTHERON.md,AUFTRAG.mdbzw.TASK.mdim Ordner. - Rückfragen: Theron zeigt sie in der Konsole mit nummerierten Antworten (★ = empfohlen); du antwortest mit der
Nummer, mehreren Nummern (
1,3) oder eigenem Text. Ist ein Server verbunden, erscheint der Lauf dort als eigener Client „Rechner · CLI · ordner“ – die erste Antwort gilt, egal wo. Eine leere Zeile im Chat beendet den Lauf, Strg + C hält ihn an. -q(autonom): keine Rückfragen – Theron entscheidet selbst nach bestem Wissen. Bleibt er hängen (mehr als 25 eigene Antworten oder wiederholt ohne Fortschritt), endet der Lauf.--no-server: auch mit eingerichtetem Server nur lokal.- Exit-Code:
0Ziel erreicht ·1Ziel nicht erreicht oder Fehler ·2falscher Aufruf ·3mit-qabgebrochen. - Mehrere Läufe gleichzeitig (auch in verschiedenen Ordnern) stören sich nicht – auch nicht mit der laufenden App.
Cronjobs & CI
# jede Nacht um 3 Uhr: Abhängigkeiten aktualisieren, Theron entscheidet selbst 0 3 * * * cd /srv/shop && theron execute "Dependency-Update" . -q >> /var/log/theron.log 2>&1 # in einer CI-Pipeline: Review eines Merge-Requests aus einer exportierten Prozessdatei theron execute review.theron . "Prüfe die Änderungen dieses Merge-Requests" -q || exit 1
Im Cronjob fehlt oft der PATH – dann den vollen Pfad zu theron angeben. Mit eingerichtetem
Server siehst du nächtliche Läufe im Web-UI.
Slave-Betrieb: theron --listen
Ein Slave ist Theron ohne Fenster, den deine App steuert. Starte ihn auf dem Rechner, auf dem gearbeitet werden soll:
theron config server https://theron.example.com TOKEN # optional: Rückfragen im Web-UI theron --listen 0.0.0.0:7531 --token GEHEIM
Er zeigt Adresse, Token und den Fingerprint seines Zertifikats (Zertifikat und Token liegen im Datenordner unter
slave/ und bleiben gleich). Ohne --token erzeugt er einen und merkt ihn sich.
- App verbinden: Einstellungen → Slave: Host, Port und Token, „Verbindung prüfen“ und den Fingerprint mit der Ausgabe des Slaves vergleichen. Die App startet neu; unten steht „SLAVE · host:port · VERBUNDEN“. Zurück zum lokalen Betrieb: Haken entfernen.
- Was wo läuft: Tasks, THERON, Konzepter, KI-Entwürfe und jeder Modellaufruf laufen auf dem Slave – mit seinem Claude-Login. Die App hat eine Kopie seiner Daten und zeigt alles live; Nutzung und Modellliste kommen vom Slave.
- Ordner und Dateien: Arbeitsordner, Gedächtnis und Wissen liegen auf dem Slave; Pfade sind Pfade dort. Anhänge und Wissensdateien lädt die App hoch (bis 40 MB je Vorgang).
- App zu, Arbeit läuft: Der Slave macht weiter und stellt Rückfragen auf dem Theron-Server. Öffnest du die App wieder, holt sie alle Änderungen nach und zeigt den aktuellen Stand.
- Sicherheit: TLS mit dem eigenen Zertifikat des Slaves (die App prüft den Fingerprint und verbindet sich nie mit einem anderen Rechner) plus Token. Öffne den Port nur dort, wo deine App ihn erreichen muss.
Headless-Worker (Docker)
Das Image enthält Claude Code und Theron als Slave. Es enthält keine Zugangsdaten – dein Claude-Login kommt beim Start dazu.
docker run -d --name theron-worker --restart unless-stopped -p 7531:7531 -v theron:/data \ -e THERON_SLAVE_TOKEN=geheim -e CLAUDE_CODE_OAUTH_TOKEN=… -e THERON_NAME=worker-1 \ mibexx1985/theron-headless docker logs theron-worker | grep Fingerprint
Offline: das Archiv von der Startseite mit docker load -i theron-headless-image-amd64.tar.gz laden.
| Variable | Bedeutung |
|---|---|
CLAUDE_CODE_OAUTH_TOKEN | Dein Claude-Abo (einmal lokal: claude setup-token) – nutzt die Limits deines Abos, keine API-Kosten. |
THERON_SLAVE_TOKEN | Token für deine App; leer = einmal erzeugt und in /data gespeichert. |
THERON_NAME | Name in der App und auf dem Server (Standard: Hostname des Containers). |
THERON_SERVER_URL, THERON_SERVER_TOKEN | Optional: Verbindung zum Theron-Server (Rückfragen im Web). |
THERON_SYNC | on: Prozesse und Agents mit dem Server abgleichen. |
THERON_LANGUAGE | de oder en. |
THERON_PLUGIN_PACKAGES | Ordner mit .theronplugin-Dateien, die bei jedem Start installiert werden (Standard /data/plugin-packages). |
THERON_LISTEN | Adresse (Standard 0.0.0.0:7531). |
THERON_ALLOW_API_KEY | 1: auch ANTHROPIC_API_KEY nutzen (kostenpflichtige API). Ohne wird ein API-Key ignoriert. |
/dataenthält Zertifikat (gleichbleibender Fingerprint), Datenbank, Arbeitsordner und Claude-Einstellungen – immer als Volume einbinden.- Werkzeuge ergänzen: Das Image bringt git, curl, ripgrep und jq mit. Für deinen Stack baust du darauf auf, z. B.
FROM mibexx1985/theron-headlessundRUN apt-get install -y nodejs npm(alsUSER root, danach zurück aufUSER 10001).
Kubernetes
Ein vollständiges Beispiel: Secret mit Slave-Token, Claude-Token und optional Server-Token, ein Volume für
/data, ein Deployment mit genau einem Pod (Strategie Recreate) und ein Service.
apiVersion: v1
kind: Secret
metadata: { name: theron-headless, namespace: theron }
stringData:
slave-token: "LANGER-ZUFALLS-TOKEN" # openssl rand -base64 24
claude-oauth-token: "…" # claude setup-token
server-token: "…" # optional: Theron-Server
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata: { name: theron-headless-data, namespace: theron }
spec:
accessModes: [ReadWriteOnce]
resources: { requests: { storage: 20Gi } }
---
apiVersion: apps/v1
kind: Deployment
metadata: { name: theron-headless, namespace: theron }
spec:
replicas: 1
strategy: { type: Recreate } # one pod per /data volume
selector: { matchLabels: { app: theron-headless } }
template:
metadata: { labels: { app: theron-headless } }
spec:
securityContext: { fsGroup: 10001 }
containers:
- name: theron-headless
image: mibexx1985/theron-headless:latest
ports: [{ name: slave, containerPort: 7531 }]
env:
- { name: THERON_NAME, value: "k8s-worker" }
- name: THERON_SLAVE_TOKEN
valueFrom: { secretKeyRef: { name: theron-headless, key: slave-token } }
- name: CLAUDE_CODE_OAUTH_TOKEN
valueFrom: { secretKeyRef: { name: theron-headless, key: claude-oauth-token } }
- { name: THERON_SERVER_URL, value: "https://theron.example.com" } # optional
- name: THERON_SERVER_TOKEN
valueFrom: { secretKeyRef: { name: theron-headless, key: server-token, optional: true } }
volumeMounts: [{ name: data, mountPath: /data }]
readinessProbe: { tcpSocket: { port: slave }, periodSeconds: 10 }
resources: { requests: { cpu: 500m, memory: 1Gi }, limits: { memory: 6Gi } }
volumes: [{ name: data, persistentVolumeClaim: { claimName: theron-headless-data } }]
---
apiVersion: v1
kind: Service
metadata: { name: theron-headless, namespace: theron }
spec:
type: LoadBalancer # or NodePort – not an HTTP ingress
selector: { app: theron-headless }
ports: [{ name: slave, port: 7531, targetPort: slave }]
Mit kubectl apply -f theron-headless.yaml anlegen.
- Die Verbindung ist reines TLS mit Fingerprint-Prüfung – sie geht direkt zum Pod (LoadBalancer oder NodePort), nicht über einen HTTP-Ingress.
- Den Fingerprint zeigt
kubectl logs deploy/theron-headless | grep Fingerprint. - Mehrere Worker: je Worker ein eigenes Deployment mit eigenem Volume und Namen.