Oxc · Biome · 게이트웨이 · 원격 Mac · 2026
2026 OpenClaw 프론트 실전:
원격 Mac에서 Oxlint·Biome JSON → 단일 PR 게이트 요약·코멘트
2026-04-29
프론트 · CI 게이트 설계
약 9분 읽기
대상: 고속 린터와 Biome를 같이 쓰면서 PR마다 한 장 요약만 남기려는 팀. OpenClaw형 게이트웨이가 원격 Mac 워커에서 두 JSON을 합쳐 임계·코멘트까지 처리합니다. 토큰은 E2E 토큰 요약, 다른 JSON 병합은 별도 가이드, 브라우저 전 검증은 Playwright 샤드와 순서를 맞추세요.
키워드: OpenClaw · Oxlint · Biome · 원격 Mac · PR 게이트
00 통증과 도구 역할 표
스키마 불일치는 중복·누락을 낳고 절대 경로는 리뷰 표시를 흔듭니다. 봇 코멘트가 여러 개면 신호가 묻힙니다. 원격 Mac에 바이너리를 캐시하면 대용량 트리 비용이 줄어듭니다.
| 관심사 | 고속 린터 쪽 | Biome 쪽 |
|---|---|---|
| 처리량 | 러스트·병렬 | 포맷·린트 통합 |
| 정책 | 규칙 차단 | 어시스트·임포트 |
| 병합 | 오류 문자열 매핑 | 코드·범위 정규화 |
01 HowTo 체크리스트
로컬·CI·원격 Mac 동일 순서.
- 이십이 메이저 이상·도구 버전 핀.
- oxlint JSON을 리포트 경로에만 기록.
- Biome 리포터 JSON을 같은 디렉터리에 기록.
- 해시·풀 번호·루트 힌트를 게이트웨이로 업로드.
- 병합·임계·마크다운·기계용 게이트 파일 생성.
- 선택 채팅 호출 후 댓글 API 멱등 갱신.
02 JSON 산출
자동화는 디스크만 쓰고 게이트웨이는 크기·괄호로 잘림을 검사합니다.
package.json 예시
{
"engines": { "node": ">=22" },
"scripts": {
"lint:ox:json": "mkdir -p .openclaw/reports && oxlint --format json . > .openclaw/reports/oxlint.json",
"lint:biome:json": "mkdir -p .openclaw/reports && biome check --reporter=json . > .openclaw/reports/biome.json",
"lint:fast:json": "npm run lint:ox:json && npm run lint:biome:json"
}
}
실험 리포터면 마이너 핀과 스냅샷을 권장합니다.
03 게이트웨이 임계 표
임계는 게이트웨이 설정에만 두고 하드는 항상 실패로 고정합니다.
| 신호 | 하드 실패 조건 | 권장 소프트 상한 |
|---|---|---|
| 린터 오류 등급 | 0 초과 금지 | 없음 |
| Biome 오류 | 0 초과 금지 | 없음 |
| 합산 경고 | 릴리스만 하드 | ≤24 |
| PR 본문 길이 | 거부 시 실패 | ≤32k 절단 |
인용 가능 정보 상위 규칙 다섯·파일 다섯까지만 표기. lint_gate에 버전 필드. REPO_ROOT로 절대경로 제거. 사백이십구·오류 다섯번대만 댓글 재시도.
04 선택: 게이트웨이와 호환 채팅 클라이언트 연결
마크다운 이후에만 호환 채팅 API를 호출합니다. 키는 게이트웨이 환경에만 두고 순서는 병합·임계·선택 채팅·코멘트로 고정하면 모델 장애가 머지를 막지 않습니다.
05 멱등 코멘트·재시도·절단
숨은 마커로 봇 코멘트를 하나만 유지합니다. 사백이십구·오류 다섯번대만 재시도하고 비공개 URL은 넣지 마세요. 도움말 링크로 대체합니다.
셸 래퍼
#!/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
한 줄로 정리
디렉터리 계약과 임계를 게이트웨이에 두면 한 번의 풀 코멘트로 끝납니다.