{"ok":true,"service":"kig","transport":"POST /op/<name> mit JSON-Body und Header Authorization: Bearer <token>. GET / = dieser Katalog (ohne Auth). GET /healthz = Lebenszeichen. Meta-Ops: whoami, log_query.","ops":[{"name":"whoami","zweck":"Nenne Identitaet, erlaubte Operationen und Scope des aufrufenden Agenten.","args":[],"liefert":"{ok, agent, ops, scope, write_scope}"},{"name":"log_query","zweck":"Eigenes Aktivitaets-Log abfragen (KEIN SQL): feste Filter op/status/seit/limit. Fuer beliebige SQL-Abfragen nutze die Operation query.","args":["op","status","seit","limit"],"liefert":"{ok, zeilen, anzahl}"},{"name":"rotate","zweck":"Stellt dem aufrufenden Agenten ein neues Token aus (Self-Service-Rotation; alte dynamische Tokens werden ungueltig). Einmalige Rueckgabe.","args":[],"liefert":"{ok, token, hinweis}"},{"name":"read","zweck":"Liefert den Inhalt einer Datei innerhalb des Agent-Scope.","args":{"pfad":{"typ":"string","pflicht":true,"beschreibung":"Dateipfad, relativ zum Scope oder absolut innerhalb des Scope"}},"liefert":"{ok:true, bytes:int, inhalt:string}"},{"name":"search","zweck":"Literale Teilstring-Suche in Dateien innerhalb des Agent-Scope.","args":{"muster":{"typ":"string","pflicht":true,"beschreibung":"literaler Suchstring"},"glob":{"typ":"string","pflicht":false,"beschreibung":"Dateifilter auf den Dateinamen, z.B. *.php"},"pfad":{"typ":"string","pflicht":false,"beschreibung":"Unterverzeichnis innerhalb des Scope"}},"liefert":"{ok:true, treffer:[{pfad,zeile,text}], anzahl:int, abgeschnitten:bool}"},{"name":"list","zweck":"Listet die Eintraege eines Verzeichnisses (eine Ebene) innerhalb des Agent-Scope.","args":{"pfad":{"typ":"string","pflicht":false,"beschreibung":"Verzeichnis relativ zum Scope; leer = Scope-Wurzel"}},"liefert":"{ok:true, pfad:string, eintraege:[{name,typ,bytes}], anzahl:int}"},{"name":"stat","zweck":"Prueft Existenz und liefert Metadaten (Typ, Bytes, mtime) eines Pfades innerhalb des Agent-Scope.","args":{"pfad":{"typ":"string","pflicht":true,"beschreibung":"Pfad relativ zum Scope oder absolut innerhalb des Scope"}},"liefert":"{ok:true, existiert:bool, typ?:string, bytes?:int, mtime?:int}"},{"name":"symbols","zweck":"Listet PHP-Symbole (Klasse, Interface, Trait, Enum, Funktion/Methode) einer Datei mit Zeilennummer.","args":{"pfad":{"typ":"string","pflicht":true,"beschreibung":"PHP-Datei relativ zum Scope oder absolut innerhalb des Scope"}},"liefert":"{ok:true, symbole:[{art,name,zeile}], anzahl:int}"},{"name":"plan_create","zweck":"Validiert einen Plan (spec/plan/acceptance/rollback) und persistiert ihn; liefert eine plan_id.","args":{"spec":{"typ":"string","pflicht":true,"beschreibung":"Ist-Zustand und Ziel"},"plan":{"typ":"string","pflicht":true,"beschreibung":"nummerierte Schritte"},"acceptance":{"typ":"string","pflicht":true,"beschreibung":"ausfuehrbares Abnahmekriterium (enthaelt einen Befehl)"},"rollback":{"typ":"string","pflicht":true,"beschreibung":"konkreter Rueckweg"},"titel":{"typ":"string","pflicht":false,"beschreibung":"Kurztitel"}},"liefert":"{ok:true, plan_id:string}"},{"name":"plan_get","zweck":"Liefert einen zuvor mit plan_create angelegten Plan per plan_id.","args":{"id":{"typ":"string","pflicht":true,"beschreibung":"plan_id aus plan_create"}},"liefert":"{ok:true, plan:{...}}"},{"name":"plan_remove","zweck":"Loescht einen Plan anhand seiner id aus dem Plan-Store.","args":{"id":{"typ":"string","pflicht":true,"beschreibung":"Plan-id im Format plan_YYYYMMDD_HHMMSS_xxxxxxxx"}},"liefert":"{ok:true, geloescht:bool}"},{"name":"create","zweck":"Legt eine neue Datei im Agent-Scope an (atomar, lint fuer .php, precond: Pfad existiert NICHT).","args":{"pfad":{"typ":"string","pflicht":true,"beschreibung":"neuer Dateipfad im Scope"},"inhalt":{"typ":"string","pflicht":true,"beschreibung":"Dateiinhalt"}},"liefert":"{ok:true, aktion:create, pfad, bytes}"},{"name":"edit","zweck":"Ersetzt den Inhalt einer bestehenden Datei (atomar, lint fuer .php, precond: Pfad existiert).","args":{"pfad":{"typ":"string","pflicht":true,"beschreibung":"bestehender Dateipfad im Scope"},"inhalt":{"typ":"string","pflicht":true,"beschreibung":"neuer vollstaendiger Dateiinhalt"}},"liefert":"{ok:true, aktion:edit, pfad, bytes}"},{"name":"remove","zweck":"Loescht eine Datei im Agent-Scope (precond: Pfad existiert).","args":{"pfad":{"typ":"string","pflicht":true,"beschreibung":"zu loeschender Dateipfad im Scope"},"grund":{"typ":"string","pflicht":false,"beschreibung":"Begruendung (Audit)"}},"liefert":"{ok:true, aktion:remove, pfad}"},{"name":"move","zweck":"Verschiebt oder benennt eine Datei im Agent-Scope um (precond: von existiert, nach existiert NICHT).","args":{"von":{"typ":"string","pflicht":true,"beschreibung":"Quellpfad (existiert)"},"nach":{"typ":"string","pflicht":true,"beschreibung":"Zielpfad (existiert nicht)"}},"liefert":"{ok:true, aktion:move, von, nach}"},{"name":"secret_scan","zweck":"Durchsucht Dateien im Agent-Scope nach Geheimnis-Mustern (Private Keys, API-Keys, Passwoerter, Bearer-Token); maskiert den Fund und legt die geprueften Muster offen.","args":{"pfad":{"typ":"string","pflicht":false,"beschreibung":"Unterverzeichnis im Scope; leer = Scope-Wurzel"}},"liefert":"{ok:true, funde:[{pfad,zeile,muster,auszug}], anzahl:int, gepruefte_muster:[string]}"},{"name":"lint","zweck":"Prueft die PHP-Syntax einer Datei (php -l) im Agent-Scope.","args":{"pfad":{"typ":"string","pflicht":true,"beschreibung":"PHP-Datei im Scope"}},"liefert":"{ok:true, syntax:\"ok\"|\"fehler\", meldung:string}"},{"name":"typecheck","zweck":"Fuehrt eine phpstan-Analyse fuer einen Pfad im Agent-Scope aus (Subprozess).","args":{"ziel":{"typ":"string","pflicht":true,"beschreibung":"Datei oder Verzeichnis im Scope"}},"liefert":"{ok:true, code:int, befunde:string}"},{"name":"test","zweck":"Fuehrt phpunit im Agent-Scope aus, wenn eine phpunit-Konfiguration (phpunit.xml oder phpunit.xml.dist) existiert; sonst wird ausgefuehrt=false mit Hinweis geliefert.","args":{"filter":{"typ":"string","pflicht":false,"beschreibung":"optionaler phpunit --filter Ausdruck"}},"liefert":"{ok:true, ausgefuehrt:bool, code?:int, ausgabe?:string, hinweis?:string}"},{"name":"impact","zweck":"Findet die Definition eines PHP-Symbols und alle Referenzen darauf im Agent-Scope (Auswirkungs-/Blast-Radius).","args":{"ziel":{"typ":"string","pflicht":true,"beschreibung":"Symbolname (Klasse/Funktion/Methode), z.B. GateException"}},"liefert":"{ok:true, ziel, definition:{pfad,zeile}|null, referenzen:[{pfad,zeile,text}], anzahl:int}"},{"name":"layer_check","zweck":"Prueft PHP-Dateien im Scope auf Schichtverstoesse: eine Domain/Core-Datei darf keine Infrastructure/Http/Persistence-Namespaces importieren.","args":{"pfad":{"typ":"string","pflicht":false,"beschreibung":"Unterverzeichnis im Scope; leer = Scope-Wurzel"}},"liefert":"{ok:true, verstoesse:[{pfad,zeile,von,nach,import}], anzahl:int, regel:string}"},{"name":"query","zweck":"Fuehrt eine beliebige read-only SQL-Abfrage (nur SELECT/WITH; DML/DDL wird mit 403 abgelehnt) gegen den Datenstore aus, z.B. die Tabelle log. Fuer das eigene Aktivitaets-Log mit festen Filtern nutze stattdessen log_query.","args":{"sql":{"typ":"string","pflicht":true,"beschreibung":"einzelnes SELECT/WITH-Statement; DML/DDL wird abgelehnt"}},"liefert":"{ok:true, zeilen:[{...}], anzahl:int}"},{"name":"run_tool","zweck":"Fuehrt ein lesendes Werkzeug aus einer festen Allowlist aus (php_version, composer_validate, git_log, git_status); kein freier Befehl.","args":{"name":{"typ":"string","pflicht":true,"beschreibung":"eines aus der Allowlist: php_version, composer_validate, git_log, git_status"}},"liefert":"{ok:true, name:string, code:int, ausgabe:string}"},{"name":"task_create","zweck":"Task anlegen; validator-Gate (spec/plan/acceptance/rollback).","args":["typ","titel","spec","plan","acceptance","rollback","affected"],"liefert":"{ok, task_id, status}"},{"name":"task_supervise","zweck":"Task validieren, Findings speichern, Status -> bereit.","args":["id"],"liefert":"{ok, status, findings}"},{"name":"task_show","zweck":"eigenen Task + Findings zeigen.","args":["id"],"liefert":"{ok, task, findings}"},{"name":"task_list","zweck":"eigene Tasks auflisten.","args":[],"liefert":"{ok, tasks}"},{"name":"task_update","zweck":"Entwurfs-Feld korrigieren.","args":["id","feld","wert"],"liefert":"{ok}"},{"name":"run_start","zweck":"Run starten (Task muss bereit sein).","args":["task_id"],"liefert":"{ok, run_id}"},{"name":"run_verify","zweck":"php -l auf den affected .php des Tasks.","args":["run_id"],"liefert":"{ok, checks, bestanden}"},{"name":"run_finish","zweck":"Run abschliessen (status fertig|fehlgeschlagen).","args":["run_id","status","report"],"liefert":"{ok, status}"},{"name":"run_evidence","zweck":"Run + Findings + gebundene Mutationen des zugehoerigen Tasks.","args":["run_id"],"liefert":"{ok, run, findings, mutationen}"},{"name":"vhost_list","zweck":"Listet die von kig betreuten Caddy-vhosts (Scope vhost).","args":[],"liefert":"{ok, vhosts}"},{"name":"vhost_setzen","zweck":"Erzeugt einen Deploy-Request fuer eine Caddy-vhost-Datei <host>.caddy (Scope vhost); root-Deploy validiert und publiziert.","args":["host","config"],"liefert":"{ok, host, angefordert}"},{"name":"vhost_entfernen","zweck":"Erzeugt einen Remove-Request fuer eine Caddy-vhost-Datei <host>.caddy (Scope vhost); root-Deploy validiert und publiziert.","args":["host"],"liefert":"{ok, host, entfernt, angefordert}"},{"name":"dienst_status","zweck":"Status eines Systemdienstes via systemctl is-active (Scope dienst:<name>).","args":["dienst"],"liefert":"{ok, dienst, status}"},{"name":"dienst_reload","zweck":"Fordert FrankenPHP-reload via DevOps-Queue an (root-Watcher; Scope dienst:frankenphp).","args":[],"liefert":"{ok, ausgabe}"},{"name":"dienst_restart","zweck":"Fordert FrankenPHP-restart via DevOps-Queue an (root-Watcher; Scope dienst:frankenphp).","args":[],"liefert":"{ok, ausgabe}"},{"name":"db_info","zweck":"Lesende Cluster-Auskunft datenbanken|rollen|extensionen (Scope db.read).","args":["aktion"],"liefert":"{ok, aktion, eintraege}"},{"name":"db_admin","zweck":"Fuehrt Admin-SQL (DDL/DML) als Superuser aus (Scope db.ddl).","args":["sql"],"liefert":"{ok, daten|zeilen}"},{"name":"db_extension","zweck":"CREATE EXTENSION IF NOT EXISTS <name> als Superuser (Scope db.ddl).","args":["name"],"liefert":"{ok, extension}"},{"name":"age_cypher","zweck":"openCypher-Abfrage auf einem Apache-AGE-Graphen (Scope age).","args":["graph","query"],"liefert":"{ok, graph, ergebnis}"},{"name":"site_liste","zweck":"Listet ausgelieferte Sites (Host + Backend-Ziel), aus den Edge-Stubs abgeleitet (Scope site.read).","args":[],"liefert":"{ok, sites:[{host, ziel}]}"},{"name":"site_status","zweck":"Status einer Site: vorhanden + Backend-Ziel (Scope site.read).","args":["host"],"liefert":"{ok, host, vorhanden, ziel}"},{"name":"site_anlegen","zweck":"Fordert das Anlegen einer neuen Site an (Queue-Request; dry_run:true liefert nur den Plan). Scope site:admin.","args":["host","dry_run"],"liefert":"{ok, dry_run|angefordert, plan}"},{"name":"site_entfernen","zweck":"Fordert das Entfernen einer Site an (Queue-Request; dry_run:true nur Plan). Scope site:admin.","args":["host","dry_run"],"liefert":"{ok, dry_run|angefordert}"}]}