2026 OpenClaw Frontend auf dem Remote Mac:
Ein Gate-Digest aus ESLint-JSON + Stylelint-JSON — PR-lesbare Kommentare
Zielgruppe: Frontend-Teams, die statische Prüfungen fest in der CI verankern und dieselben Signale in eine KI-gestützte Release-Zusammenfassung einspeisen wollen — ohne zwei parallele Erzählungen (Terminal-ESLint hier, Stylelint-Wand dort). Schlagworte: OpenClaw, ESLint JSON, Stylelint, Remote Mac, PR-Zusammenfassung. Dieses HowTo setzt Node 22+ auf allen Workern und ein OpenClaw-nahes Gateway neben Ihrem Git-Host voraus: Es nimmt maschinenlesbare Reports auf, wendet Policy an und liefert einen Markdown-Block, den Reviewer:innen inline lesen. Ergänzend helfen ESLint- und Stylelint-JSON → Fix-Branch-Schritte sowie Token-scoped Automation für E2E-Summaries, wenn Sie Geheimnisse verdrahten.
00 HowTo: reproduzierbare Checkliste
Führen Sie diese Schritte auf jedem Worker aus — inklusive gemietetem Remote Mac — damit lokale Reproduktion, CI und Gateway dieselben Pfade sehen und nichts geraten muss.
- Abhängigkeiten mit derselben Node-22+-Hauptversion wie in der CI installieren; optional
enginesin derpackage.jsonfestziehen. - ESLint JSON mit
eslint . -f json -o .openclaw/reports/eslint.json(flat-config-tauglich) und Stylelint mitstylelint "**/*.{css,scss}" --formatter json -o .openclaw/reports/stylelint.jsonerzeugen. - Die CI lädt beide Dateien (oder sendet sie per POST) zum OpenClaw-Gateway und übergibt
GIT_SHA,PR_NUMBERund optionalBASE_REF. - Das Gateway führt ein Merge-Skript aus (siehe unten), schreibt
pr_lint_gate_summary.md, setzt den Exit-Status nach Schwellen und ruft den Git-Provider auf, um einen PR-Kommentar zu setzen oder zu aktualisieren. - Downstream-KI-Jobs lesen nur den zusammengeführten Summary-Pfad — Prompts bleiben klein und deterministisch, was in der 2026er OpenClaw-Toolkette der übliche Kompromiss zwischen Kontextbudget und Treue ist.
In längeren Pipelines sollte die JSON-Erzeugung vor schweren Browser-Stufen stehen; eine kompatible Stufenliste finden Sie bei Playwright-Shard-Reports auf Remote Mac.
01 Lokal und CI: Ausgabeformate vereinheitlichen
Wenn Entwicklerrechner und CI-Runner unterschiedliche Formatter, Pfade oder Plugin-Versionen nutzen, zählt das Gateway doppelt oder übersieht Meldungen. Lösung: ein fester Vertrag, keine stillschweigende Konvention.
Pfadnormalisierung: ESLint liefert oft absolute filePath-Werte pro Dateiobjekt; Stylelint setzt source ebenfalls häufig absolut. Auf dem Gateway strippen Sie das Repository-Root-Präfix, damit Gruppierungsschlüssel repo-relativ sind. So bleiben Zeilen in der PR-Zusammenfassung stabil, selbst wenn /Users/ci/… und /Volumes/dev/… auseinanderlaufen.
Formatter erzwingen: In der CI niemals das TTY-Standardformat verwenden. Immer explizit -f json bzw. --formatter json setzen und mit -o in Dateien schreiben, damit stdout für andere Tools frei bleibt. Auf Apple-Silicon-Runnern beeinflussen npm_config_arch und native Add-ons nur dann die JSON-Form, wenn Lint-Plugins Binärmodule laden — die Schemaform von ESLint JSON und Stylelint sollte identisch bleiben.
Skriptausschnitt — package.json (Node 22+):
{
"engines": { "node": ">=22" },
"scripts": {
"lint:eslint:json": "mkdir -p .openclaw/reports && eslint . -f json -o .openclaw/reports/eslint.json",
"lint:stylelint:json": "mkdir -p .openclaw/reports && stylelint \"**/*.{css,scss}\" --formatter json -o .openclaw/reports/stylelint.json",
"lint:json:all": "npm run lint:eslint:json && npm run lint:stylelint:json"
}
}
02 Gateway: Aggregation und Schwellenwerte
Die Aufgabe des Gateways ist nicht, Linter erneut auszuführen — es merged ESLint JSON (pro Datei messages mit severity) und Stylelint-Arrays (warnings, errored) zu einem Objekt lint_gate/v1: Summen, Top-Regeln, problematischste Dateien, Tool-Herkunft. Davon leiten sich sowohl menschliches Markdown als auch Maschinenkonsumenten (Slack, LLM) ab.
Schwellen: ESLint-Schwere 2 und Stylelint-Läufe mit errored: true gelten als harte Fehler. Für Warnungen empfiehlt sich ein eingechecktes Warn-Budget (YAML), etwa max_stylelint_warnings: 12 auf Release-Branches, während Feature-Branches warn-only bleiben dürfen. Das Gateway vergleicht gezählte Werte mit diesen Budgets und setzt HTTP-Status bzw. CI-Exitcodes — klar getrennt von „Merge-Skript lief technisch durch, Policy sagt rot“.
Skriptausschnitt — Merge-Gerüst (Node 22, ESM):
// tools/merge-lint-gate.mjs — auf dem OpenClaw-Gateway nach Eingang der Reports
import { readFile, writeFile } from "node:fs/promises";
const root = process.env.REPO_ROOT ?? "";
const strip = (p) => (p && p.startsWith(root) ? p.slice(root.length + 1) : p);
const eslint = JSON.parse(await readFile(".openclaw/reports/eslint.json", "utf8"));
const style = JSON.parse(await readFile(".openclaw/reports/stylelint.json", "utf8"));
const rows = [];
for (const f of Array.isArray(eslint) ? eslint : []) {
for (const m of f.messages ?? []) {
rows.push({ tool: "eslint", file: strip(f.filePath), rule: m.ruleId ?? "syntax", sev: m.severity });
}
}
for (const f of Array.isArray(style) ? style : []) {
for (const w of f.warnings ?? []) {
rows.push({ tool: "stylelint", file: strip(f.source), rule: w.rule ?? "unknown", sev: w.severity });
}
}
const gate = {
version: 1,
errors: rows.filter((r) => r.sev === 2 || r.sev === "error").length,
warnings: rows.filter((r) => r.sev === 1 || r.sev === "warning").length,
topRules: /* nach rule gruppieren, Top N */ [],
};
await writeFile(".openclaw/reports/lint_gate.json", JSON.stringify(gate, null, 2));
topRules füllen Sie mit Ihrem Reducer; versionieren Sie das ausgegebene JSON-Schema, damit OpenClaw-Prompts zuverlässig lint_gate/v1 referenzieren können.
03 Fehlschlag-Retries und Kürzungsstrategie
Zwei Fehlerklassen brauchen zwei Policies. Transport und Provider-Limits (429, 5xx, TLS-Ruckler) sollten mit exponentiellem Backoff und Jitter wiederholt werden — besonders wenn ein Remote Mac viele PRs von derselben IP bündelt. Lint-Fehlschläge blind zu retrien verschleiert echte Baumfehler; sinnvoll ist nur ein erneuter Lauf, wenn Sie unvollständiges JSON erkennen (z. B. leeres Array bei abgebrochenem Prozess).
Kürzung: Befunde pro Regel begrenzen (z. B. fünf Dateien) und die Markdown-PR-Zusammenfassung in der Zeilenzahl deckeln (z. B. 120 Zeilen). Anhängen: „Gekürzt: N weitere Befunde ausgelassen — siehe CI-Artefakte eslint.json / stylelint.json.“ Diese Dateinamen sind unbedenklich; lange Base64-Blobs gehören nicht in PR-Kommentare.
Skriptausschnitt — begrenzte Retry-Hülle in der Shell:
#!/usr/bin/env bash
set -euo pipefail
attempt=0 max=4
until node tools/post-pr-lint-summary.mjs; do
code=$?
attempt=$((attempt + 1))
if [[ "$code" -eq 77 ]] && [[ "$attempt" -lt "$max" ]]; then
sleep $((2 ** attempt + RANDOM % 3))
continue
fi
exit "$code"
done
Reservieren Sie Exit 77 (oder vergleichbar) in post-pr-lint-summary.mjs für „retrybarer Provider-Fehler“, damit gedrosselte APIs nicht mit einem kaputten Lint-Baum verwechselt werden.
04 Git-Provider-Kommentar-API: Entwurf (ohne login-geschützte private URLs)
Die meisten Teams nutzen entweder REST-„Issue-Kommentar am Pull Request“-Endpunkte oder Review-Kommentare, die am Diff verankert sind. Beides lässt sich mit OpenClaw betreiben, solange das Gateway ein scoped Token hält (feingranularer PAT, GitHub-App-Installationstoken, GitLab-Job-Token usw.).
Idempotenz: Einen versteckten HTML-Kommentar-Marker wie <!-- openclaw-lint-gate:deadbeef --> voranstellen, abgeleitet aus Repository, PR-Nummer und Hash der Lint-Eingaben. Bei jedem Lauf vorherige Bot-Kommentare nach diesem Marker durchsuchen und in-place aktualisieren statt zehn Duplikate bei CI-Requeues.
Was nicht in den Kommentar gehört: Keine privaten Preview-URLs, die eine Organisations-Anmeldung erzwingen — Reviewer:innen ohne Zugriff sehen tote Links, und Suchmaschinen können Titel preisgeben. Neutral formulieren: „Siehe CI-Job #12345, Artefaktbereich“ oder nur öffentliche Doku verlinken. Vertiefte Details: gekürzte Snippets im Kommentar oder maschinenlesbares JSON als normales CI-Artefakt mit üblichen Berechtigungen.
Minimaler POST (illustrativ): HTTP POST /repos/{owner}/{repo}/issues/{pr_number}/comments mit JSON { "body": "<markdown-digest>" } und Authorization: Bearer …. GitLab oder Bitbucket mappen Sie auf die jeweilige Ressource; das OpenClaw-Gateway braucht nur einen dünnen Adapter pro Host — ohne irgendwo private URLs abzulegen, die ein Login erzwingen.
Wenn ESLint JSON und Stylelint einen gemeinsamen Pfadvertrag und einen Merge-Schritt auf dem OpenClaw-Gateway teilen, wird Ihre PR-Zusammenfassung zu einer einzigen Gate-Erzählung: Zähler, Top-Regeln, begrenzte Dateilisten und eine klare Pass/Fail-Zeile — ideal für Menschen und für nachgelagerte CI- plus KI-Digeste auf einem Remote Mac.
Mehr auf der Website: Startseite, Hilfe-Center und der vollständige Blog-Index.
Denselben OpenClaw-Lint-Gate auf einem dedizierten Remote Mac fahren
Wenn Sie deterministische Node-22+-Worker neben Safari- und WebKit-Smokes brauchen, mieten Sie einen Apple-Silicon-Remote Mac für Gateway und CI. Öffnen Sie kaufen.html, vergleichen Sie Tarife und schließen Sie die Bestellung ohne Konto anzulegen — passend für Teams, die OpenClaw, ESLint JSON und Stylelint in einer Pipeline standardisieren.