# PR·push 서버 게이트 — 표준 액션만 쓴다(사내 시크릿·조직 워크플로 불의존, 어느 레포에서든 동작).
#
# 왜 자립형인가: 이 템플릿은 사내 밖에서도 쓸 수 있어야 하는데, 예전엔 조직 전용
# 공용 워크플로와 org 시크릿에 걸려 있었다.
# 그러면 조직 밖에서 만든 프로젝트는 첫 PR부터 CI가 실패하고, 사용자는 원인을 알 수 없다.
# 검사 내용은 로컬 하드 관문과 같은 것(pnpm verify)을 쓴다 — 로컬에서 통과한 게 CI에서
# 다른 이유로 떨어지면 그때부터 사람이 CI를 신뢰하지 않는다.
name: CI

on:
  # PR 없이 main에 바로 푸시하는 루프(비개발자 경로)에서도 서버 검사가 한 번은 돌아야 한다 —
  # pull_request 전용이면 이 앱들은 CI를 한 번도 통과하지 않은 채 배포된다(실사용 관찰).
  push:
    branches: [main]
  pull_request:
    branches: [main, 'feature/**']
    types: [opened, synchronize, reopened, ready_for_review]

concurrency:
  group: ci-${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
  cancel-in-progress: true

permissions:
  contents: read

jobs:
  quality:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - uses: actions/setup-node@v4
        with:
          node-version-file: .nvmrc

      - run: corepack enable pnpm

      - uses: actions/cache@v4
        with:
          path: ~/.local/share/pnpm/store
          key: pnpm-${{ runner.os }}-${{ hashFiles('pnpm-lock.yaml') }}
          restore-keys: pnpm-${{ runner.os }}-

      - run: pnpm install --frozen-lockfile

      # 로컬 하드 관문과 같은 것 — 10게이트(lint·format·경계·구조·타입·테스트·smell·slop·knip·대비) + build
      - name: verify (전체 게이트)
        run: pnpm verify

      # 게이트 자체가 조용히 죽었는지. 룰을 고친 PR에서는 이게 유일한 안전망이다.
      - name: gate-selftest (게이트 생존)
        run: pnpm gate:selftest

  secrets-scan:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0

      # 키·토큰이 커밋에 섞여 들어가는 건 로컬 게이트가 못 잡는다(.claude/rules/security.md).
      # 액션 대신 릴리스 바이너리를 직접 받는다 — 조직 라이선스 키를 요구하는 액션에 묶이지 않으려고.
      - name: Gitleaks
        run: |
          VERSION=8.28.0
          curl -sSfL "https://github.com/gitleaks/gitleaks/releases/download/v${VERSION}/gitleaks_${VERSION}_linux_x64.tar.gz" \
            | tar -xz -C /tmp gitleaks
          /tmp/gitleaks detect --source . --config .gitleaks.toml --redact --no-banner
