Zum Inhalt springen

Aktionen & der Exec-Server

Bauen, testen, starten — die wiederkehrenden Kommandos eines Projekts sind Aktionen, definiert in .agent/actions.json und sichtbar im Aktionen-Tab der App (Favoriten an die Toolbar pinnen, Shortcuts vergeben).

Eine Aktion läuft als argv ohne Shell&&, Pipes und $(…) funktionieren dort nicht. Zusammengesetzte Kommandos gehören in ein Skript:

{
"name": "Build app",
"command": "sh scripts/app-build.sh"
}

Aktionen können vor dem Lauf auch Eingaben abfragen — Text, Zahl, Datei, Ordner, Auswahl, Farbe — eingesetzt in {name}-Platzhalter im Kommando.

Eine sandboxed Mac-App darf keine beliebigen Prozesse starten. Also führt die App selbst nichts aus: Sie verbindet sich als MCP-Client mit einem lokalen Exec-Server (Standard http://127.0.0.1:8765/mcp, pro Projekt konfigurierbar in .agent/settings.json). Jeder Server, der den Exec-Vertrag spricht, funktioniert; die App ist server-agnostisch. Du startest den Server; ein grünes Blitz-Symbol in der App heißt: verbunden.

Das Sicherheitsmodell sitzt dazwischen:

  • Allowlist (.agent/exec-allowlist.json): Kommandos, die ein erlaubtes Muster deckt, laufen; alles andere wird als Pending-Request geparkt, den du in der App bestätigst — einmal oder dauerhaft.
  • Das Arbeitsverzeichnis ist fest der Projekt-Root, und jeder Lauf hat ein Timeout.

Aktions-Ausgabe streamt live, mit Stop-Knopf (Verbindungsabbruch killt den Prozess) und Fortschritt aus [n/m]-Markern. Zwei Erweiterungen:

  • Charts — eine JSON-Zeile wie {"kind":"chart", …} in der Ausgabe wird als echtes Diagramm gerendert; ein Profiling-Skript kann sein Ergebnis zeigen statt Spalten zu drucken.
  • Tool-UI-Panels — eine Aktion der Form toolui:<kind> <paramsJSON> (etwa toolui:sqlite {"path": "{file}"}) öffnet lokal ein interaktives Panel, ganz ohne Server.

Eine Regel spannt sich über all diese Dateien: keine Secrets im Repository. Tokens leben im Schlüsselbund oder kommen als Umgebungsreferenz wie ${MY_TOKEN} — wenn eine Konfiguration scheinbar ein Klartext-Secret braucht, ist das eine Frage an den Owner, kein Commit.