
# Kommandozeilenschnittstelle

Die `keenauth`-Kommandozeilenschnittstelle (CLI) ruft die Verwaltungs-API aus einem Terminal oder einem Skript auf. Jeder Befehl umhüllt genau eine typisierte Methode des Go-SDK, daher verhalten sich CLI und API gleich. Es gibt noch kein Installationspaket.

## Authentifizierung und Ziel

Die CLI liest ihre Zugangsdaten ausschließlich aus der Umgebung. Der API-Schlüssel wird nie als Flag akzeptiert, damit er nicht in Ihrem Shell-Verlauf landet.

| Variable | Erforderlich | Beschreibung |
|---|---|---|
| `KEENAUTH_API_KEY` | ja | Schlüssel der Verwaltungs-API. Fehlt er, beendet sich der Befehl mit Code 3. |
| `KEENAUTH_BASE_URL` | ja, sofern `--base-url` nicht angegeben ist | Basis-URL der Verwaltungs-API Ihrer Umgebung. |

Statt eines API-Schlüssels können Sie sich mit Ihrem Dashboard-Konto anmelden: `keenauth login`, danach `keenauth env use <environment_id>`. Die Sitzung wird nur verwendet, wenn `KEENAUTH_API_KEY` nicht gesetzt ist; die Adresse der Umgebung stammt dann aus der Control Plane (siehe [Anmelden mit keenauth login](/docs/cli/login)).

Das Flag `--base-url` überschreibt `KEENAUTH_BASE_URL` für einen einzelnen Befehl. Die CLI gibt den API-Schlüssel niemals aus; taucht er in einer Serverantwort auf, wird er durch `[redacted]` ersetzt.

## Befehle

Befehle folgen dem Muster `keenauth <group> <action> [arguments] [flags]`. Führen Sie `keenauth --help` oder `keenauth <group> --help` aus, um die vollständige Liste zu sehen.

| Gruppe | Aktionen |
|---|---|
| `users` | `list`, `search`, `get`, `create`, `update`, `delete`, `block`, `unblock`, `cancel-deletion`, `authenticators list`, `authenticators delete`, `authenticators reset`, `authenticators reactivate`, `send-password-reset`, `send-verification-email`, `emails send-verification`, `start-recovery`, `logs list` |
| `applications` | `list`, `create`, `get`, `update`, `delete`, `get-api-grant`, `put-api-grant`, `delete-api-grant`, `credentials list`, `credentials create`, `credentials delete` |
| `apis` | `list`, `create`, `get`, `update`, `delete` |
| `connections` | `list`, `create`, `get`, `update`, `delete`, `activate`, `deactivate` |
| `identity-settings` | `get`, `update` |
| `environment-settings` | `get`, `update` |
| `config` | `export` (ohne `-o` gibt sie YAML aus), `plan -f <file>` (zeigt im Terminal einen lesbaren Diff), `plans get`, `apply <plan_id>` (fragt nach einer Bestätigung; `--secrets-from-env` liest Geheimnisse aus Umgebungsvariablen, `--confirm-deletion <kind>/<key>`), `promote --from <env> --to <env>` (exportiert, plant, zeigt den Diff und wendet nach Bestätigung an; siehe [Konfiguration mit keenauth config promote übernehmen](/docs/cli/config-promote)) |
| `api-keys` | `list`, `get`, `create`, `rotate`, `revoke` |
| `logs` | `list`, `get`, `tail` (folgt neuen Datensätzen; `--type`, `--user`, `--org`; siehe [Logs mit keenauth logs tail verfolgen](/docs/cli/tail)) |
| `support-access-grants` | `list`, `get`, `create`, `delete` (siehe [Support-Zugriff gewähren mit keenauth support-access-grants](/docs/cli/support-access-grants)) |
| `directories` | `simulate <directory_id> --scenario <name>` (führt ein SCIM-Simulator-Szenario in Entwicklung und Staging aus; siehe [SCIM-Provisioning testen mit keenauth directories simulate](/docs/cli/directories-simulate)) |
| `audit` | `verify` (prüft einen heruntergeladenen Audit-Export offline; siehe [Audit-Exporte prüfen mit keenauth audit verify](/docs/cli/audit-verify)) |
| `branding` | `get`, `update`, `applications get`, `applications put`, `organizations get`, `organizations put`, `css put`, `page-template put`, `publish`, `rollback`, `versions list`, `texts get`, `texts put`, `texts delete` |
| `signing-keys` | `list`, `rotate`, `policy get`, `policy update` |
| `events` | `tail` (folgt Kundenereignissen über die Event-API; siehe [Ereignisse verfolgen mit keenauth events tail](/docs/cli/events-tail)), `get <event ID>` (ein Ereignis, genau so wie vom Server gesendet) |
| `mock` | `serve` startet einen lokalen OIDC-Mock-Server für Offline-Tests; er benötigt keinen API-Schlüssel (siehe [Lokaler Mock-Server](/docs/cli/mock-server)) |
| `test` | `login --user <+test address>` meldet einen Testbenutzer mit dem festen Code in einer `development`-Umgebung an und gibt die Tokens aus; er benötigt keinen API-Schlüssel (siehe [Testbenutzer anmelden mit keenauth test login](/docs/cli/test-login)) |
| `webhooks` | `listen --forward-to <local URL>` leitet die Ereignisse einer `development`- oder `staging`-Umgebung an Ihren Rechner weiter, signiert mit einem temporären Geheimnis (siehe [Webhooks lokal testen mit keenauth webhooks listen](/docs/cli/webhooks-listen)) |
| `login`, `logout`, `whoami`, `env` | `login` (`--web`, `--insecure-storage`), `logout`, `whoami`, `env use <environment_id>`, `env list`: melden Sie sich mit Ihrem Dashboard-Konto statt mit einem API-Schlüssel an (siehe [Anmelden mit keenauth login](/docs/cli/login)) |

Listenbefehle akzeptieren `--limit`, `--after`, `--before` und `--order`. Gibt es weitere Ergebnisse, wird der nächste Cursor als `more results: --after <cursor>` auf stderr ausgegeben.

## Ausgabeformat

`--output` (`-o`) wählt `table`, `json` oder `yaml`. Ohne das Flag gibt die CLI im Terminal eine Tabelle aus, sonst JSON. JSON und YAML enthalten die API-Antwort unverändert und werden nie übersetzt, sodass Skripte sich darauf verlassen können. Ergebnisse gehen an stdout; Fehler, Hinweise und die Zeile `etag` gehen an stderr.

## Anfragekörper

Befehle, die einen Körper senden, akzeptieren für jedes flache Feld ein Flag, benannt nach dem JSON-Schlüssel mit Bindestrichen (`phone_number` wird zu `--phone-number`). Verschachtelte Objekte werden mit `--data` angegeben:

- `--data @file.json` liest den Körper aus einer Datei.
- `--data -` liest den Körper von der Standardeingabe.

Flags überschreiben die Felder der Datei. Ein Körper ist auf 4 MiB begrenzt.

```sh
keenauth users create --email ada@example.com
keenauth apis create --data @api.json
echo '{"name":"Orders"}' | keenauth apis update api_123 --data - --if-match '"v3"'
```

## Optimistische Parallelität: `--if-match` und das etag

Aktualisierungs- und Löschbefehle für Anwendungen, APIs und Verbindungen erfordern `--if-match`; `users update` akzeptiert es. Der Wert ist das `ETag` der Version, die Sie ändern möchten. Der Server lehnt die Anfrage ab, wenn sich die Ressource inzwischen geändert hat. `identity-settings update` erfordert es ebenfalls. `environment-settings update` erfordert es ebenfalls. Schreibvorgänge am Branding-Entwurf (`branding update`, `branding applications put`, `branding organizations put`, `branding css put`, `branding page-template put`) erfordern es ebenfalls.

Jeder `get`-Befehl (`users`, `applications`, `apis`, `connections`, `identity-settings`, `environment-settings`) gibt die Antwort-`ETag` auf stderr aus, damit stdout sauber bleibt:

```sh
$ keenauth apis get api_123
{ ... }
etag: "v3"
$ keenauth apis update api_123 --name Orders --if-match '"v3"'
```

Die Zeile `etag` wird nicht zur JSON- oder YAML-Ausgabe hinzugefügt.

## Destruktive Befehle und `--yes`

Befehle, die löschen oder sperren, fragen im Terminal nach einer Bestätigung (`[y/N]`). Lehnen Sie ab, endet der Befehl mit Code 1 und gibt `aborted` aus. Wenn die Standardeingabe kein Terminal ist, wird der Befehl nur ausgeführt, wenn Sie `--yes` (`-y`) übergeben; andernfalls endet er mit Code 2, bevor eine Anfrage gesendet wird.

## Exit-Codes

| Code | Bedeutung |
|---|---|
| `0` | Erfolg. |
| `1` | Server- oder Betriebsfehler, eine abgelehnte Bestätigung oder ein Netzwerkfehler. |
| `2` | Nutzungsfehler: unbekannter Befehl oder Flag, ein fehlendes Argument, ein ungültiger Körper oder `--yes` fehlt in einem nicht interaktiven Terminal. |
| `3` | Authentifizierungsfehler: der Schlüssel fehlt, oder der Server antwortete mit 401 oder 403. |
| `4` | Der Tarif umfasst die Funktion nicht (`403` mit `plan_feature_unavailable`). |

Bei Serverfehlern gibt die CLI `error`, `code`, `status`, `detail`, `request_id` sowie eine Zeile `field` je Validierungsfehler auf stderr aus. Geben Sie beim Kontakt mit dem Support den `request_id` an.

## Sprache

Für menschenlesbaren Text (Hilfe, Eingabeaufforderungen, Fehler, Tabellenüberschriften) stehen Türkisch (`tr`), Englisch (`en`), Französisch (`fr`), Deutsch (`de`), Koreanisch (`ko`), Japanisch (`ja`), Italienisch (`it`) und Spanisch (`es`) zur Verfügung. Die Sprache wird aus der ersten gesetzten dieser Variablen entnommen: `KEENAUTH_LANG`, `LC_ALL`, `LC_MESSAGES`, `LANG` (zum Beispiel wählt `tr_TR.UTF-8` `tr`). Ein leerer oder nicht unterstützter Wert wählt Englisch, und fehlt eine Meldung in einer Sprache, wird auf Englisch zurückgegriffen.

Maschinenlesbare Ausgabe wird nie übersetzt: JSON- und YAML-Feldnamen und -Werte, das Problem `code` und die Bezeichnungen `code`, `status` und `request_id` bleiben in jeder Sprache gleich. Meldungen, die vom Server stammen, werden so angezeigt, wie der Server sie gesendet hat.

```sh
KEENAUTH_LANG=de keenauth users list --help
```

## Anwendungsanmeldedaten

`keenauth applications credentials list|create|delete` verwaltet Client-Geheimnisse und registrierte öffentliche Schlüssel einer Anwendung. Diese Befehle verwenden `--if-match` nicht.

```sh
keenauth applications credentials create app_123 --type client-secret --expires-at 2027-01-01T00:00:00Z
keenauth applications credentials create app_123 --type public-key --jwk-file key.pub.jwk
keenauth applications credentials delete app_123 cred_456 --yes
```

Ein Client-Geheimnis wird einmal auf stdout ausgegeben, zusammen mit einer einmaligen Warnung auf stderr. `--jwk-file` nimmt genau einen öffentlichen JWK (höchstens 16 KiB) entgegen; eine Datei mit privaten Bestandteilen wird abgelehnt, bevor eine Anfrage gesendet wird.

## API-Schlüssel

`keenauth api-keys list|get|create|rotate|revoke` verwaltet die Verwaltungs-API-Schlüssel der Umgebung. Diese Befehle verwenden `--if-match` nicht.

```sh
keenauth api-keys create --name ci --type restricted --permissions users:read,users:write --expires-at 2027-10-01T00:00:00Z
keenauth api-keys rotate key_123 --overlap-hours 24
keenauth api-keys revoke key_123 --reason leaked --yes
```

Der Rohschlüssel von `create` und `rotate` wird einmal auf stdout ausgegeben, zusammen mit einer einmaligen Warnung auf stderr; er kann nicht erneut abgerufen werden. `list` und `get` geben nur Metadaten aus.
