#!/usr/bin/env bash # # governance-check.sh — local/CI parity governance gate for the Seahaven backend. # # Runs the fast-path gates (G1 restore, G2 ArchitectureTests, G3 changed-file # formatting) exactly as the `architecture-quality` workflow does. A green run # here means the same thing locally and in CI. See QUALITY_GATES.md. # # Full build + test (G4/G5) are NOT run here; run them separately: # dotnet build SeaHavenIndustries.sln -c Release # dotnet test SeaHavenIndustries.sln -c Release --no-build # # Usage: # bash scripts/governance-check.sh # BASE_REF=origin/dev bash scripts/governance-check.sh # BASE_REF= HEAD_REF= bash scripts/governance-check.sh set -euo pipefail SOLUTION="SeaHavenIndustries.sln" ARCH_TEST_PROJECT="Api.SeaHavenIndustries.Tests/Api.SeaHavenIndustries.Tests.csproj" # Comparison point for changed-file formatting. Default to the dev integration # branch locally; CI overrides BASE_REF/HEAD_REF with the PR base/head SHAs. BASE_REF="${BASE_REF:-origin/dev}" HEAD_REF="${HEAD_REF:-HEAD}" log() { printf '\n\033[1m== %s ==\033[0m\n' "$1"; } ok() { printf '\033[32mPASS\033[0m %s\n' "$1"; } bad() { printf '\033[31mFAIL\033[0m %s\n' "$1"; } # Resolve the base ref before using it for a diff. if ! git rev-parse --verify --quiet "${BASE_REF}^{commit}" >/dev/null; then bad "G3: BASE_REF '${BASE_REF}' does not resolve to a commit (run: git fetch origin)." exit 1 fi log "G1: restore" dotnet restore "$SOLUTION" ok "G1: restore" log "G2: architecture boundary tests (dependency direction)" dotnet test "$ARCH_TEST_PROJECT" \ --no-restore \ --filter "FullyQualifiedName~ArchitectureTests" \ --nologo ok "G2: ArchitectureTests" log "G3: changed-file formatting (${BASE_REF}..${HEAD_REF})" changed_cs=() while IFS= read -r f; do changed_cs+=("$f") done < <( git diff --name-only --diff-filter=ACMR "${BASE_REF}" "${HEAD_REF}" -- '*.cs' ) if (( ${#changed_cs[@]} == 0 )); then printf '\033[33mSKIP\033[0m G3: no changed C# files between %s..%s\n' "${BASE_REF}" "${HEAD_REF}" else printf ' checking %d changed C# file(s)\n' "${#changed_cs[@]}" dotnet format "$SOLUTION" \ --no-restore \ --verify-no-changes \ --include "${changed_cs[@]}" ok "G3: changed-file formatting" fi log "governance-check: all fast-path gates passed"