2026 OpenClaw Frontend-Praxis:
OpenAPI-Vertrags-diff + Smoke-curl auf Remote Mac
Wenn Ihr Frontend gegen REST-Backends ausgeliefert wird, liefern zwei günstige Gates den schnellsten Feedback-Kreislauf: ein OpenAPI-Vertrags-diff gegen eine vertrauenswürdige Baseline und ein gestapelter Smoke-Lauf mit curl gegen echte URLs. Auf einem Remote Mac können Sie dasselbe Skript ausführen, das OpenClaw nach Installation oder vor dem Deploy triggert, maschinenlesbare Reports unter .openclaw/reports ablegen und den Agenten einen kurzen Fehlerkurzbericht (Failure Summary) erzeugen lassen — für Chat, Tickets oder Merge-Requests. Dieser Artikel liefert reproduzierbare Schritte, ausführbare Befehlsvorlagen, ein HowTo (spiegelbar in JSON-LD), eine FAQ zu Reihenfolge, Flakiness und aufgeteilten Specs sowie eine CTA ohne Login.
01 Warum Vertrags-diff und curl-Smoke verketten
Der OpenAPI-Diff beantwortet, ob sich das Versprechen der API breaking geändert hat: entfernte Pfade, strengere Request-Bodies, umbenannte Enums. Er läuft offline gegen Dateien — deterministisch und schnell. Smoke-curl prüft, ob der laufende Dienst die Basics noch erfüllt: Health, Auth-Handshake, eine Handvoll read-only-Sonden, von denen das UI abhängt. Zusammen trennen sie „Spec ist abgewandert“ von „Deployment ist krank“ — genau die Zweiteilung, die OpenClaw an die richtige Rolle routen kann.
Ein Remote-Mac-Mini-ähnlicher Host lohnt sich, wenn dieses Gate neben Safari- oder WebKit-Checks, Storybook-Builds oder anderem macOS-nativen Schritten in einer Pre-Release-Kette steckt. Brauchen Sie nur HTTP und JSON, reichen Linux-Runner; der Gewinn hier ist ein Artefaktbaum und eine Agenten-Konfiguration.
02 OpenClaw installieren und CLI-Werkzeuge
Folgen Sie der aktuellen OpenClaw-Installationsanleitung Ihrer Edition und prüfen Sie, dass der Agent Shell-Befehle im Repo-Workspace auf dem Remote Mac ausführen darf. Pinnen Sie Node mit fnm use oder nvm use an .nvmrc, damit Diff-Skripte und optionale npm-OpenAPI-Tools zur CI passen.
- OpenClaw-Dienst: Agent installieren und registrieren; Lesezugriff auf das Repo, Schreibzugriff auf
.openclaw/reports(Verzeichnis in.gitignore). - Vertrags-diff-CLI:
oasdiffper Homebrew (brew install oasdiff) oder DevDependency wie@pb33f/openapi-changes; Version im Lockfile fixieren. - Smoke-Helfer: macOS bringt
curlmit;jqfür JSON-Formung (brew install jq). - Optional Bündeln: Bei
$ref-Splits@redocly/clioder@apidevtools/swagger-clizum Vorbündeln vor dem Diff.
Ein Wrapper, z. B. scripts/api-gate.sh, schreibt immer drei Artefakte: openapi-diff.json (bzw. Ihr Diff-Output), smoke-curl.ndjson und api_gate_summary.json. OpenClaw führt nur dieses Skript per Webhook oder Zeitplan aus; ein Parse-Schritt liest nur die Summary — so bleiben Benachrichtigungen klein und stabil über CLI-Upgrades hinweg.
03 HowTo: reproduzierbare Pipeline
Legen Sie pro Commit ein Verzeichnis an: .openclaw/reports/$(git rev-parse HEAD). Exportieren Sie BASE_URL und Bearer-Token aus dem Secret-Store; niemals Geheimnisse in die Summary echoen. Holen Sie die goldene OpenAPI-Datei vom letzten Release-Tag oder aus dem Artefakt-Bucket. Laufen Sie den Diff zuerst; überschreiten Breaking-Änderungen die Policy, brechen Sie ab — schreiben Sie dennoch eine partielle Summary, damit Reviewer sehen, dass curl bewusst übersprungen wurde.
Für Smoke-Anfragen halten Sie eine tab-separierte Datei mit Spalten wie name, method, path, expect. Zeilen parsen, BASE_URL voranstellen, HTTP-Status und Laufzeit protokollieren. Fehler, wenn der Code nicht in der Allow-List liegt oder TLS/DNS scheitert. Nach der Schleife Zähler aggregieren und die ersten N fehlgeschlagenen Zeilen listen — das ist der Rohstoff für den generierten Fehlerkurzbericht.
BASE_URL und Credentials wechseln. Diese Parität macht OpenClaw-Summaries mit GitHub-Actions-Logs vergleichbar.04 Ausführbare Befehlsvorlagen
Blöcke kopieren und Pfade/URLs anpassen. Exakte oasdiff-Flags hängen von der installierten Version ab — gängig sind oasdiff breaking plus --format json oder -f json. Passen Sie jq an die JSON-Form Ihres CLI-Outputs an.
export REPORT_DIR=".openclaw/reports/$(git rev-parse HEAD)"
mkdir -p "$REPORT_DIR"
# Optional: npx @redocly/cli bundle openapi/openapi.yaml -o "$REPORT_DIR/bundled.yaml"
set +e
oasdiff breaking openapi/baseline.yaml openapi/openapi.yaml \
--format json > "$REPORT_DIR/openapi-diff.json" 2>&1
DIFF_EXIT=$?
set -e
# Viele Installationen exit ≠ 0 bei Breaking — JSON und Exit-Code behalten
jq -n --argjson diffexit "$DIFF_EXIT" '{breaking_cli_exit:$diffexit}' \
> "$REPORT_DIR/openapi-diff.counts.json"
# Optional: Zähler aus dem JSON-Körper, sobald die Struktur feststeht
: "${BASE_URL:?set BASE_URL}"
SMOKE_FAIL=0
> "$REPORT_DIR/smoke-curl.ndjson"
while IFS=$'\t' read -r name method path expect; do
[[ "$name" =~ ^# ]] && continue
[[ -z "$name" ]] && continue
code=$(curl -sS -o /dev/null -w "%{http_code}" -X "$method" "${BASE_URL}${path}" -H "Authorization: Bearer ${API_TOKEN}")
echo "{\"name\":\"$name\",\"method\":\"$method\",\"path\":\"$path\",\"expect\":$expect,\"actual\":$code}" >> "$REPORT_DIR/smoke-curl.ndjson"
if [[ "$code" != "$expect" ]]; then SMOKE_FAIL=$((SMOKE_FAIL+1)); fi
done < scripts/smoke_requests.tsv
echo "{\"failed_requests\":$SMOKE_FAIL}" > "$REPORT_DIR/smoke-curl.summary.json"
jq -s 'add' \
"$REPORT_DIR/openapi-diff.counts.json" \
"$REPORT_DIR/smoke-curl.summary.json" \
| jq --arg sha "$(git rev-parse --short HEAD)" \
'. + {commit:$sha, gate:"api_smoke_openapi"}' \
> "$REPORT_DIR/api_gate_summary.json"
jq -r '"## API-Gate\n- commit: \(.commit)\n- openapi_diff_cli_exit: \(.breaking_cli_exit // "n/a")\n- smoke_failures: \(.failed_requests // 0)\n"' \
"$REPORT_DIR/api_gate_summary.json" > "$REPORT_DIR/api_gate_summary.md"
05 CI-Reihenfolge und verwandte Gates
| Phase | Typischer Befehl | Hinweis |
|---|---|---|
| Install | npm ci / pnpm install --frozen-lockfile |
Node an .nvmrc |
| OpenAPI-Diff | scripts/api-gate.sh --diff-only |
Schnell fail bei Breaking-Drift |
| Lint / Typen | npm run lint, tsc --noEmit |
Lint-JSON-Guide |
| Build | npm run build |
Vor Browser oder E2E |
| Smoke-curl | scripts/api-gate.sh --smoke |
Erreichbare BASE_URL nötig |
| Browser-Smoke | Playwright webkit | Pre-Deploy-Smoke |
06 FAQ
Soll OpenAPI-Diff vor oder nach dem Frontend-Build laufen? Früh, direkt nach Install und Spec-Fetch — günstig und fängt Vertragsdrift vor langen Bundler-Läufen. Danach Tests, Build, dann curl-Smoke.
Wie vermeide ich flaky Smoke-curl? Bounded Retry für Transienten, Endpunkte pinnen, idempotente GETs oder Smoke-Mandanten, Laufzeiten mitschreiben, damit Agenten Timeouts von echten HTTP-Fehlern trennen.
Viele YAML-Dateien im Spec? Vor dem Diff bündeln; Bundle im CI-Cache mit Generator-Version und Lockfile-Hash als Schlüssel.
Mac vs. Linux-CI? Reiner Diff+curl läuft auf Linux gut. Remote Mac, wenn Sie dieselbe OpenClaw-Kette mit Safari, nativen Tools oder macOS-only-Schritten fahren und Artefakte nicht splitten wollen.
Baseline-OpenAPI pinnen, jede Änderung nach JSON differenzieren, tab-gesteuerten curl-Stapel fahren und beides in api_gate_summary.json für OpenClaw mergen. Ein Wrapper-Skript, ein Report-Ordner pro Commit, strikte Secret-Hygiene — so bleibt der Ablauf auf Remote Mac und in der CI reproduzierbar. Safari oder vereinheitlichte Automatisierung? Dann die Kette auf Apple Silicon neben unseren weiteren OpenClaw-Artikeln — weniger Übergaben zwischen Runnern.