name: CI

on:
  push:
    branches: [main, dev]
  pull_request:
    branches: [main, dev]

# 同一分支新 push 取消上一次未完成的运行，省 CI 时间。
concurrency:
  group: ci-${{ github.ref }}
  cancel-in-progress: true

jobs:
  go:
    name: Go · build + vet + test
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-go@v5
        with:
          go-version: "1.25"
          cache-dependency-path: "**/go.sum"
      - name: build + vet + test（4 模块；bus 用内嵌 NATS，无需外部服务）
        run: |
          set -e
          for m in sundynix-shared sundynix-gateway sundynix-dispatcher sundynix-mcp-go; do
            echo "::group::$m"
            (cd "$m" && go build ./... && go vet ./... && go test ./...)
            echo "::endgroup::"
          done

  web:
    name: Frontend · tsc
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
      matrix:
        dir: [sundynix-desktop/frontend, sundynix-admin]
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: "20"
          cache: npm
          cache-dependency-path: ${{ matrix.dir }}/package-lock.json
      - name: install + typecheck
        working-directory: ${{ matrix.dir }}
        run: |
          npm ci
          npx tsc --noEmit

  py:
    name: mcp-py · sandbox guard
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-python@v5
        with:
          python-version: "3.11"
          cache: pip
      - name: install + test（无 Docker 时测降级路径）
        working-directory: sundynix-mcp-py
        run: |
          python -m pip install --upgrade pip
          python -m pip install -e . pytest
          PYTHONPATH=src:tests python -m pytest tests/ -q || \
          PYTHONPATH=src:tests python -c "import test_sandbox as t; \
            fns=[getattr(t,n) for n in dir(t) if n.startswith('test_')]; \
            [ (f(),print('PASS',f.__name__)) for f in fns ]; print(f'{len(fns)} passed')"
