#!/usr/bin/env bash
set -euo pipefail

usage() {
  cat <<'EOF'
usage: buildbuddy-bazel-poc [changed-path ...] [bazel args...]

Runs the optional BuildBuddy/Bazel lane selected by BUILDBUDDY_BAZEL_COMMAND.
Cargo remains the default developer path; this script is for opt-in remote
execution/cache experiments and CI gates.

Common commands:
  workspace-test             Full Bazel workspace test lane.
  workspace-test-rbe         Remote-compatible workspace test lane.
  workspace-fast-rbe         Cargo-fast-equivalent remote workspace test lane.
  workspace-unit-rbe         Unit-test-only remote workspace test lane.
  workspace-integration-fast-rbe
                            Integration-fast remote workspace test lane.
  workspace-fast-clippy-rbe  Fast tests plus clippy aspect.
  workspace-build-clippy-rbe Build/clippy labels for the workspace build set.
  ci-prebuild-rbe          Build the non-live CI workspace graph to warm remote cache.
  e2e-system-rbe           Bazel-native system e2e suite with runfile binaries.
  e2e-fast-rbe             Bazel-native fast e2e lane.
  e2e-live-rbe             Bazel-native live e2e lane.
  e2e-smoke-rbe            Build the Bazel-native smoke e2e foundation.
  e2e-smoke-remote-rbe     Run e2e-smoke fully on BuildBuddy macOS RBE.
  e2e-auth-rbe             Bazel-native release-grade auth smoke lane.
  machine-authority-rbe    Bazel-native machine authority lane.
  rmat-audit-rbe           Bazel-native RMAT + ownership audit lane.
  seam-inventory-rbe       Bazel-native strict seam inventory lane.
  fmt-static-rbe           Bazel-native formatting and static source gates.
  feature-clippy-rbe       Bazel-native clippy lane for feature-covered build labels.
  sdk-suites-rbe           Bazel-native SDK parity and wrapper coverage lane.
  wasm-contract-rbe        Bazel-native WASM contract lane.
  wasm-check-rbe           Bazel-native WASM compilation check lane.
  security-audit-rbe       Bazel-native dependency/security audit lane.
  minimal-feature-builds-rbe
                            Cargo-equivalent minimal feature lane as a Bazel test action.
  feature-matrix-lib-rbe    Cargo-equivalent library feature matrix as parallel Bazel test actions.
  feature-matrix-surface-rbe
                            Bazel-native surface feature matrix build targets.
  fast-test                  Root //:fast_tests suite.
  owned-fast-test <path>     Owning fast suite or exact fast test for a path.
  owned-build <path>         Owning build label for a path.
  owned-clippy-rbe <path>    Owning build/test labels with clippy -D warnings.
  affected-*                 Reverse-dependency variants of owned-* commands.

Examples:
  BUILDBUDDY_BAZEL_COMMAND=workspace-fast-rbe scripts/buildbuddy-bazel-poc --jobs=64
  BUILDBUDDY_BAZEL_COMMAND=owned-clippy-rbe scripts/buildbuddy-bazel-poc meerkat/src/lib.rs --jobs=64

Use scripts/buildbuddy-changed-gate --dry-run <path> to inspect selected labels
without running Bazel.
EOF
}

case "${1:-}" in
  -h|--help)
    usage
    exit 0
    ;;
esac

workspace_root="$(git rev-parse --show-toplevel)"
source "${workspace_root}/scripts/build-backend-env"
meerkat_bazel_backend="${MEERKAT_BAZEL_BACKEND:-buildbuddy-hosted}"
if [[ "${meerkat_bazel_backend}" != "gcp-local" ]]; then
  meerkat_load_local_secrets_env "${workspace_root}"
fi

if [[ "${meerkat_bazel_backend}" != "gcp-local" && -z "${BUILDBUDDY_API_KEY:-}" && -f "${HOME}/.zshrc" ]]; then
  key_line="$(grep -m1 -E '^[[:space:]]*(export[[:space:]]+)?BUILDBUDDY_API_KEY=' "${HOME}/.zshrc" || true)"
  if [[ -n "${key_line}" ]]; then
    key_value="${key_line#*=}"
    key_value="${key_value%%[[:space:]]#*}"
    key_value="${key_value%\"}"
    key_value="${key_value#\"}"
    key_value="${key_value%\'}"
    key_value="${key_value#\'}"
    if [[ -n "${key_value}" && "${key_value}" != *'$'* && "${key_value}" != *'`'* ]]; then
      BUILDBUDDY_API_KEY="${key_value}"
      export BUILDBUDDY_API_KEY
    fi
  fi
fi
if [[ "${meerkat_bazel_backend}" != "gcp-local" && -z "${BUILDBUDDY_API_KEY:-}" && -f "${HOME}/.zshrc" ]]; then
  BUILDBUDDY_API_KEY="$(zsh -lc 'source ~/.zshrc >/dev/null 2>&1 || true; print -r -- ${BUILDBUDDY_API_KEY-}')"
  export BUILDBUDDY_API_KEY
fi

if [[ "${meerkat_bazel_backend}" != "gcp-local" && -z "${BUILDBUDDY_API_KEY:-}" ]]; then
  echo "error: BUILDBUDDY_API_KEY is not set" >&2
  exit 1
fi
if [[ "${meerkat_bazel_backend}" == "gcp-buildbuddy" && -z "${BUILDBUDDY_GRPC_URL:-${BUILDBUDDY_ENDPOINT:-}}" ]]; then
  echo "error: BUILDBUDDY_GRPC_URL is required for MEERKAT_BAZEL_BACKEND=gcp-buildbuddy" >&2
  exit 1
fi

if [[ -n "${BUILDBUDDY_BB:-}" ]]; then
  bb_bin="${BUILDBUDDY_BB}"
elif command -v bb >/dev/null 2>&1; then
  bb_bin="bb"
elif [[ -x "${XDG_CACHE_HOME:-${HOME}/.cache}/meerkat/buildbuddy-cli/5.0.350/bin/bb" ]]; then
  bb_bin="${XDG_CACHE_HOME:-${HOME}/.cache}/meerkat/buildbuddy-cli/5.0.350/bin/bb"
elif [[ -x /tmp/buildbuddy-poc/bin/bb ]]; then
  bb_bin="/tmp/buildbuddy-poc/bin/bb"
else
  echo "error: bb is not installed; run make buildbuddy-install or set BUILDBUDDY_BB" >&2
  exit 1
fi

config="${BUILDBUDDY_BAZEL_CONFIG:-buildbuddy}"
command="${BUILDBUDDY_BAZEL_COMMAND:-build}"
requested_command="${command}"
extra_args=()
fast_test_tag_filters="-local,-e2e,-system,-live,-integration,-slow,-required-feature,-trybuild,-snapshot,-fixture"
e2e_test_env=(
  --test_env=ANTHROPIC_API_KEY
  --test_env=RKAT_ANTHROPIC_API_KEY
  --test_env=OPENAI_API_KEY
  --test_env=RKAT_OPENAI_API_KEY
  --test_env=GEMINI_API_KEY
  --test_env=RKAT_GEMINI_API_KEY
  --test_env=GOOGLE_API_KEY
  --test_env=GOOGLE_APPLICATION_CREDENTIALS
  --test_env=GOOGLE_APPLICATION_CREDENTIALS_JSON
  --test_env=MEERKAT_E2E_AUTH_OPENAI_OAUTH_TOKENS_JSON
  --test_env=MEERKAT_E2E_AUTH_ANTHROPIC_MODEL
  --test_env=MEERKAT_E2E_AUTH_GEMINI_MODEL
  --test_env=MEERKAT_E2E_AUTH_VERTEX_CANARY
  --test_env=PATH
  --test_env=HOME
  --test_env=CARGO_HOME
  --test_env=TEST
  --test_env=SCENARIO
  --test_env=SUITE
  --test_env=MEERKAT_CLEAN_E2E_SCENARIO_TARGETS
  --test_env=MEERKAT_STRICT_E2E_PREREQS=1
)
gcp_buildbuddy_test_env=()
if [[ "${meerkat_bazel_backend}" == "gcp-buildbuddy" ]]; then
  gcp_cargo_home="${MEERKAT_HOST_CARGO_HOME:-/usr/local/cargo}"
  gcp_buildbuddy_test_env+=(
    --test_env="CARGO_HOME=${gcp_cargo_home}"
    --test_env="MEERKAT_HOST_CARGO_HOME=${gcp_cargo_home}"
    --test_env=CARGO_NET_GIT_FETCH_WITH_CLI=true
  )
fi
case "${command}" in
  workspace-test)
    command="test"
    config="${BUILDBUDDY_BAZEL_CONFIG:-buildbuddy-macos-rbe}"
    default_target="//..."
    host_cargo_home="${CARGO_HOME:-${HOME}/.cargo}"
    extra_args+=(
      --test_env="MEERKAT_HOST_CARGO_HOME=${host_cargo_home}"
      --build_tests_only
      --test_output=errors
      --test_summary=terse
      --color=no
      --curses=no
    )
    ;;
  workspace-test-rbe)
    command="test"
    config="${BUILDBUDDY_BAZEL_CONFIG:-buildbuddy-macos-rbe}"
    default_target="//..."
    extra_args+=(
      --build_tests_only
      --test_tag_filters=-local
      --test_output=errors
      --test_summary=terse
      --color=no
      --curses=no
    )
    ;;
  workspace-fast-rbe)
    command="test"
    config="${BUILDBUDDY_BAZEL_CONFIG:-buildbuddy-macos-rbe}"
    default_target="//..."
    extra_args+=(
      --build_tests_only
      --test_tag_filters="${fast_test_tag_filters}"
      --test_output=errors
      --test_summary=terse
      --color=no
      --curses=no
    )
    ;;
  workspace-unit-rbe)
    command="test"
    config="${BUILDBUDDY_BAZEL_CONFIG:-buildbuddy-macos-rbe}"
    default_target="//..."
    extra_args+=(
      --build_tests_only
      --test_tag_filters="unit,-local,-e2e,-system,-live,-integration,-slow,-required-feature,-trybuild,-snapshot,-fixture"
      --test_output=errors
      --test_summary=terse
      --color=no
      --curses=no
    )
    ;;
  workspace-integration-fast-rbe)
    command="test"
    config="${BUILDBUDDY_BAZEL_CONFIG:-buildbuddy-macos-rbe}"
    default_target="//..."
    extra_args+=(
      --build_tests_only
      --test_tag_filters="integration,-local,-e2e,-system,-live,-slow,-required-feature,-trybuild,-snapshot,-fixture"
      --test_output=errors
      --test_summary=terse
      --color=no
      --curses=no
    )
    ;;
  workspace-test-clippy-rbe)
    command="test"
    config="${BUILDBUDDY_BAZEL_CONFIG:-buildbuddy-macos-rbe}"
    default_target="//..."
    extra_args+=(
      --build_tests_only
      --test_tag_filters=-local
      --test_output=errors
      --test_summary=terse
      --color=no
      --curses=no
      --aspects="@rules_rust//rust:defs.bzl%rust_clippy_aspect"
      --output_groups="+clippy_checks"
      --@rules_rust//rust/settings:clippy_flag=-Dwarnings
    )
    ;;
  workspace-fast-clippy-rbe)
    command="test"
    config="${BUILDBUDDY_BAZEL_CONFIG:-buildbuddy-macos-rbe}"
    default_target="//..."
    extra_args+=(
      --build_tests_only
      --test_tag_filters="${fast_test_tag_filters}"
      --test_output=errors
      --test_summary=terse
      --color=no
      --curses=no
      --aspects="@rules_rust//rust:defs.bzl%rust_clippy_aspect"
      --output_groups="+clippy_checks"
      --@rules_rust//rust/settings:clippy_flag=-Dwarnings
    )
    ;;
  ci-prebuild-rbe)
    command="build"
    config="${BUILDBUDDY_BAZEL_CONFIG:-buildbuddy-macos-rbe}"
    default_target="//..."
    extra_args+=(
      --build_tag_filters=-local,-manual,-e2e,-system,-live,-slow,-required-feature,-trybuild,-snapshot,-fixture,-cargo-equivalent,-requires-network
      --remote_download_minimal
      --color=no
      --curses=no
    )
    ;;
  e2e-system-rbe)
    command="test"
    config="${BUILDBUDDY_BAZEL_CONFIG:-buildbuddy-macos-rbe}"
    default_target="//:e2e_system_tests"
    extra_args+=(
      "${e2e_test_env[@]}"
      --build_tests_only
      --test_output=errors
      --test_summary=terse
      --color=no
      --curses=no
    )
    ;;
  e2e-fast-rbe)
    command="test"
    config="${BUILDBUDDY_BAZEL_CONFIG:-buildbuddy-macos-rbe}"
    default_target="//tests/integration:e2e_fast_lane_test"
    extra_args+=(
      "${e2e_test_env[@]}"
      --test_output=errors
      --test_summary=terse
      --color=no
      --curses=no
    )
    ;;
  e2e-live-rbe)
    command="test"
    config="${BUILDBUDDY_BAZEL_CONFIG:-buildbuddy-macos-rbe}"
    default_target="//tests/integration:e2e_live_lane_test"
    extra_args+=(
      "${e2e_test_env[@]}"
      --test_arg=--ignored
      --test_arg=--test-threads=1
      --test_output=errors
      --test_summary=terse
      --color=no
      --curses=no
    )
    ;;
  e2e-auth-rbe)
    command="test"
    config="${BUILDBUDDY_BAZEL_CONFIG:-buildbuddy-macos-rbe}"
    default_target="//tests/integration:e2e_auth_lane_test"
    extra_args+=(
      "${e2e_test_env[@]}"
      --test_arg=--ignored
      --test_arg=--test-threads=1
      --test_output=errors
      --test_summary=terse
      --color=no
      --curses=no
    )
    ;;
  e2e-smoke-rbe)
    command="build"
    config="${BUILDBUDDY_BAZEL_CONFIG:-buildbuddy-macos-rbe}"
    default_target="@wasm_pack_darwin_arm64//:wasm-pack //tests/integration:e2e_smoke_lane_test //tests/integration:e2e_artifacts_bin //meerkat-cli:rkat //meerkat-cli:cli_mobpack_live_smoke_test //meerkat-cli:live_smoke_cli_test //meerkat-mcp-server:rkat_mcp_bin //meerkat-mob:smoke_mob_flow_runtime_test //meerkat-mob:smoke_mob_generated_image_comms_test //meerkat-mob:smoke_mob_resume_test //meerkat-rest:rkat_rest_bin //meerkat-rpc:rkat_rpc_bin //meerkat-rpc:live_smoke_rpc_test //tests/integration:smoke_shared_realm_test"
    extra_args+=(
      --remote_download_outputs=toplevel
      --color=no
      --curses=no
    )
    ;;
  e2e-smoke-remote-rbe)
    command="test"
    config="${BUILDBUDDY_BAZEL_CONFIG:-buildbuddy-macos-rbe}"
    default_target="//:e2e_smoke_remote_test"
    extra_args+=(
      "${e2e_test_env[@]}"
      --nocache_test_results
      --test_output=errors
      --test_summary=terse
      --color=no
      --curses=no
    )
    ;;
  machine-authority-rbe)
    command="test"
    config="${BUILDBUDDY_BAZEL_CONFIG:-buildbuddy-macos-rbe}"
    default_target="//xtask:machine_verify_all_tlc_test //xtask:machines_contracts_test //xtask:protocol_codegen_drift_test //meerkat-machine-codegen:render_contracts_test //meerkat-machine-codegen:runtime_alphabet_parity_test //meerkat-machine-codegen:runtime_schema_parity_test"
    extra_args+=(
      --test_output=errors
      --test_summary=terse
      --color=no
      --curses=no
    )
    ;;
  rmat-audit-rbe)
    command="test"
    config="${BUILDBUDDY_BAZEL_CONFIG:-buildbuddy-macos-rbe}"
    default_target="//:audit_effect_authority_test //xtask:rmat_audit_test //xtask:rmat_strict_test"
    extra_args+=(
      --test_output=errors
      --test_summary=terse
      --color=no
      --curses=no
    )
    ;;
  seam-inventory-rbe)
    command="test"
    config="${BUILDBUDDY_BAZEL_CONFIG:-buildbuddy-macos-rbe}"
    default_target="//xtask:seam_inventory_strict_test"
    extra_args+=(
      --test_output=errors
      --test_summary=terse
      --color=no
      --curses=no
    )
    ;;
  fmt-static-rbe)
    command="test"
    config="${BUILDBUDDY_BAZEL_CONFIG:-buildbuddy-macos-rbe}"
    default_target="//xtask:buildbuddy_static_lanes_test"
    extra_args+=(
      --test_output=errors
      --test_summary=terse
      --color=no
      --curses=no
    )
    ;;
  feature-clippy-rbe)
    command="build"
    config="${BUILDBUDDY_BAZEL_CONFIG:-buildbuddy-macos-rbe}"
    default_target=""
    extra_args+=(
      --aspects="@rules_rust//rust:defs.bzl%rust_clippy_aspect"
      --output_groups="+clippy_checks"
      --@rules_rust//rust/settings:clippy_flag=-Dwarnings
      --color=no
      --curses=no
    )
    ;;
  sdk-suites-rbe)
    command="test"
    config="${BUILDBUDDY_BAZEL_CONFIG:-buildbuddy-macos-rbe}"
    default_target="//tools/buildbuddy:sdk_suites_cargo_equivalent_test"
    extra_args+=(
      --test_output=errors
      --test_summary=terse
      --color=no
      --curses=no
    )
    ;;
  release-validate-rbe)
    command="test"
    config="${BUILDBUDDY_BAZEL_CONFIG:-buildbuddy-macos-rbe}"
    default_target="//tools/buildbuddy:release_validate_cargo_equivalent_test"
    extra_args+=(
      --test_output=errors
      --test_summary=terse
      --color=no
      --curses=no
    )
    ;;
  release-build-macos-arm64)
    command="build"
    config="${BUILDBUDDY_BAZEL_CONFIG:-buildbuddy-macos-rbe}"
    default_target="//meerkat-cli:rkat //meerkat-rpc:rkat_rpc_bin //meerkat-rest:rkat_rest_bin //meerkat-mcp-server:rkat_mcp_bin"
    extra_args+=(--compilation_mode=opt --remote_download_outputs=toplevel)
    ;;
  release-build-macos-x86)
    command="build"
    config="${BUILDBUDDY_BAZEL_CONFIG:-buildbuddy-macos-rbe}"
    default_target="//meerkat-cli:rkat //meerkat-rpc:rkat_rpc_bin //meerkat-rest:rkat_rest_bin //meerkat-mcp-server:rkat_mcp_bin"
    extra_args+=(--compilation_mode=opt --remote_download_outputs=toplevel --platforms=//platforms:macos_x86_64)
    ;;
  release-build-linux-x86)
    command="build"
    config="${BUILDBUDDY_BAZEL_CONFIG:-buildbuddy-linux-rbe}"
    default_target="//meerkat-cli:rkat //meerkat-rpc:rkat_rpc_bin //meerkat-rest:rkat_rest_bin //meerkat-mcp-server:rkat_mcp_bin"
    extra_args+=(--compilation_mode=opt --remote_download_outputs=toplevel)
    ;;
  release-build-linux-arm64)
    command="build"
    config="${BUILDBUDDY_BAZEL_CONFIG:-buildbuddy-linux-arm64-rbe}"
    default_target="//meerkat-cli:rkat //meerkat-rpc:rkat_rpc_bin //meerkat-rest:rkat_rest_bin //meerkat-mcp-server:rkat_mcp_bin"
    extra_args+=(--compilation_mode=opt --remote_download_outputs=toplevel --linkopt=-fuse-ld=bfd)
    ;;
  release-build-windows-x86)
    command="build"
    config="${BUILDBUDDY_BAZEL_CONFIG:-buildbuddy-windows-rbe}"
    default_target="//meerkat-cli:rkat //meerkat-rpc:rkat_rpc_bin //meerkat-rest:rkat_rest_bin //meerkat-mcp-server:rkat_mcp_bin"
    msvc_ver="${BUILDBUDDY_WINDOWS_MSVC_VERSION:-14.42.34433}"
    msvc_edition="${BUILDBUDDY_WINDOWS_MSVC_EDITION:-Professional}"
    msvc_root="C:/Program Files/Microsoft Visual Studio/2022/${msvc_edition}"
    winsdk_ver="${BUILDBUDDY_WINDOWS_SDK_VERSION:-10.0.26100.0}"
    winsdk_root="C:/Program Files (x86)/Windows Kits/10"
    extra_args+=(
      --compilation_mode=opt
      --remote_download_outputs=toplevel
      "--action_env=PATH=${msvc_root}/VC/Tools/MSVC/${msvc_ver}/bin/HostX64/x64;${winsdk_root}/bin/${winsdk_ver}/x64;C:/Windows/System32"
      "--action_env=LIB=${msvc_root}/VC/Tools/MSVC/${msvc_ver}/lib/x64;${winsdk_root}/Lib/${winsdk_ver}/um/x64;${winsdk_root}/Lib/${winsdk_ver}/ucrt/x64"
      "--action_env=INCLUDE=${msvc_root}/VC/Tools/MSVC/${msvc_ver}/include;${winsdk_root}/Include/${winsdk_ver}/ucrt;${winsdk_root}/Include/${winsdk_ver}/um;${winsdk_root}/Include/${winsdk_ver}/shared;${winsdk_root}/Include/${winsdk_ver}/cppwinrt;${winsdk_root}/Include/${winsdk_ver}/winrt"
      --action_env=TEMP
      --action_env=TMP
      --host_action_env=TEMP
      --host_action_env=TMP
    )
    ;;
  wasm-contract-rbe)
    command="test"
    config="${BUILDBUDDY_BAZEL_CONFIG:-buildbuddy-macos-rbe}"
    default_target="//tools/buildbuddy:wasm_contract_cargo_equivalent_tests"
    extra_args+=(
      --test_output=errors
      --test_summary=terse
      --color=no
      --curses=no
    )
    ;;
  wasm-check-rbe)
    command="test"
    config="${BUILDBUDDY_BAZEL_CONFIG:-buildbuddy-macos-rbe}"
    default_target="//tools/buildbuddy:wasm_check_cargo_equivalent_test"
    extra_args+=(
      --test_output=errors
      --test_summary=terse
      --color=no
      --curses=no
    )
    ;;
  security-audit-rbe)
    command="test"
    config="${BUILDBUDDY_BAZEL_CONFIG:-buildbuddy-macos-rbe}"
    default_target="//tools/buildbuddy:security_audit_cargo_equivalent_test"
    extra_args+=(
      --test_output=errors
      --test_summary=terse
      --color=no
      --curses=no
    )
    ;;
  minimal-feature-builds-rbe)
    command="test"
    config="${BUILDBUDDY_BAZEL_CONFIG:-buildbuddy-macos-rbe}"
    default_target="//tools/buildbuddy:minimal_feature_builds_cargo_equivalent_test"
    extra_args+=(
      --test_output=errors
      --test_summary=terse
      --color=no
      --curses=no
    )
    ;;
  feature-matrix-lib-rbe)
    command="test"
    config="${BUILDBUDDY_BAZEL_CONFIG:-buildbuddy-macos-rbe}"
    default_target="//tools/buildbuddy:feature_matrix_lib_cargo_equivalent_tests"
    extra_args+=(
      --test_output=errors
      --test_summary=terse
      --color=no
      --curses=no
    )
    ;;
  feature-matrix-surface-rbe)
    command="build"
    config="${BUILDBUDDY_BAZEL_CONFIG:-buildbuddy-macos-rbe}"
    default_target="//:surface_feature_matrix_builds"
    extra_args+=(
      --color=no
      --curses=no
    )
    ;;
  e2e-system-local)
    command="test"
    config="${BUILDBUDDY_BAZEL_CONFIG:-buildbuddy-macos-rbe}"
    default_target="//:e2e_system_tests"
    extra_args+=(
      --spawn_strategy=local
      --jobs="${BUILDBUDDY_LOCAL_JOBS:-8}"
      --test_output=errors
      --test_summary=terse
      --color=no
      --curses=no
    )
    ;;
  workspace-test-local)
    command="test"
    config="${BUILDBUDDY_BAZEL_CONFIG:-buildbuddy-macos-rbe}"
    default_target="//..."
    host_cargo_home="${CARGO_HOME:-${HOME}/.cargo}"
    extra_args+=(
      --test_env="MEERKAT_HOST_CARGO_HOME=${host_cargo_home}"
      --build_tests_only
      --spawn_strategy=local
      --jobs="${BUILDBUDDY_LOCAL_JOBS:-8}"
      --test_output=errors
      --test_summary=terse
      --color=no
      --curses=no
    )
    ;;
  fast-test)
    command="test"
    config="${BUILDBUDDY_BAZEL_CONFIG:-buildbuddy-macos-rbe-fast}"
    default_target="//:fast_tests"
    extra_args+=(
      --test_output=errors
      --test_summary=terse
      --color=no
      --curses=no
    )
    ;;
  fast-test-local)
    command="test"
    config="${BUILDBUDDY_BAZEL_CONFIG:-buildbuddy-macos-rbe-fast}"
    default_target="//:fast_tests"
    extra_args+=(
      --spawn_strategy=local
      --jobs="${BUILDBUDDY_LOCAL_JOBS:-8}"
      --test_output=errors
      --test_summary=terse
      --color=no
      --curses=no
    )
    ;;
  affected-fast-test)
    command="test"
    config="${BUILDBUDDY_BAZEL_CONFIG:-buildbuddy-macos-rbe-fast}"
    default_target=""
    extra_args+=(
      --test_output=errors
      --test_summary=terse
      --color=no
      --curses=no
    )
    ;;
  affected-fast-test-local)
    command="test"
    config="${BUILDBUDDY_BAZEL_CONFIG:-buildbuddy-macos-rbe-fast}"
    default_target=""
    extra_args+=(
      --spawn_strategy=local
      --jobs="${BUILDBUDDY_LOCAL_JOBS:-8}"
      --test_output=errors
      --test_summary=terse
      --color=no
      --curses=no
    )
    ;;
  owned-fast-test)
    command="test"
    config="${BUILDBUDDY_BAZEL_CONFIG:-buildbuddy-macos-rbe-fast}"
    default_target=""
    extra_args+=(
      --test_output=errors
      --test_summary=terse
      --color=no
      --curses=no
    )
    ;;
  owned-fast-test-local)
    command="test"
    config="${BUILDBUDDY_BAZEL_CONFIG:-buildbuddy-macos-rbe-fast}"
    default_target=""
    extra_args+=(
      --spawn_strategy=local
      --jobs="${BUILDBUDDY_LOCAL_JOBS:-8}"
      --test_output=errors
      --test_summary=terse
      --color=no
      --curses=no
    )
    ;;
  clippy)
    command="build"
    config="${BUILDBUDDY_BAZEL_CONFIG:-buildbuddy-macos-rbe}"
    default_target="//..."
    extra_args+=(
      --aspects="@rules_rust//rust:defs.bzl%rust_clippy_aspect"
      --output_groups="+clippy_checks"
      --@rules_rust//rust/settings:clippy_flag=-Dwarnings
    )
    ;;
  clippy-rbe)
    command="build"
    config="${BUILDBUDDY_BAZEL_CONFIG:-buildbuddy-macos-rbe}"
    default_target="//..."
    extra_args+=(
      --build_tag_filters=-local,-manual,-noclippy
      --aspects="@rules_rust//rust:defs.bzl%rust_clippy_aspect"
      --output_groups="+clippy_checks"
      --@rules_rust//rust/settings:clippy_flag=-Dwarnings
    )
    ;;
  affected-clippy | owned-clippy)
    command="build"
    config="${BUILDBUDDY_BAZEL_CONFIG:-buildbuddy-macos-rbe}"
    default_target=""
    extra_args+=(
      --aspects="@rules_rust//rust:defs.bzl%rust_clippy_aspect"
      --output_groups="+clippy_checks"
      --@rules_rust//rust/settings:clippy_flag=-Dwarnings
    )
    ;;
  affected-clippy-rbe | owned-clippy-rbe)
    command="build"
    config="${BUILDBUDDY_BAZEL_CONFIG:-buildbuddy-macos-rbe}"
    default_target=""
    extra_args+=(
      --aspects="@rules_rust//rust:defs.bzl%rust_clippy_aspect"
      --output_groups="+clippy_checks"
      --@rules_rust//rust/settings:clippy_flag=-Dwarnings
    )
    ;;
  workspace-build-clippy-rbe)
    command="build"
    config="${BUILDBUDDY_BAZEL_CONFIG:-buildbuddy-macos-rbe}"
    default_target=""
    extra_args+=(
      --aspects="@rules_rust//rust:defs.bzl%rust_clippy_aspect"
      --output_groups="+clippy_checks"
      --@rules_rust//rust/settings:clippy_flag=-Dwarnings
    )
    ;;
  owned-build)
    command="build"
    config="${BUILDBUDDY_BAZEL_CONFIG:-buildbuddy-macos-rbe}"
    default_target=""
    ;;
  owned-build-local)
    command="build"
    config="${BUILDBUDDY_BAZEL_CONFIG:-buildbuddy-macos-rbe}"
    default_target=""
    extra_args+=(
      --spawn_strategy=local
      --jobs="${BUILDBUDDY_LOCAL_JOBS:-8}"
    )
    ;;
  affected-build)
    command="build"
    config="${BUILDBUDDY_BAZEL_CONFIG:-buildbuddy-macos-rbe}"
    default_target=""
    ;;
  affected-build-local)
    command="build"
    config="${BUILDBUDDY_BAZEL_CONFIG:-buildbuddy-macos-rbe}"
    default_target=""
    extra_args+=(
      --spawn_strategy=local
      --jobs="${BUILDBUDDY_LOCAL_JOBS:-8}"
    )
    ;;
  *)
    default_target="//meerkat-machine-dsl-core:meerkat_machine_dsl_core"
    ;;
esac
if [[ "${requested_command}" == affected-fast-test || "${requested_command}" == affected-fast-test-local || "${requested_command}" == owned-fast-test || "${requested_command}" == owned-fast-test-local || "${requested_command}" == owned-build || "${requested_command}" == owned-build-local || "${requested_command}" == affected-build || "${requested_command}" == affected-build-local || "${requested_command}" == affected-clippy || "${requested_command}" == affected-clippy-rbe || "${requested_command}" == owned-clippy || "${requested_command}" == owned-clippy-rbe || "${requested_command}" == workspace-build-clippy-rbe || "${requested_command}" == feature-clippy-rbe ]]; then
  selector_args=()
  if [[ "${requested_command}" == workspace-build-clippy-rbe || "${requested_command}" == feature-clippy-rbe ]]; then
    selector_args+=(--all --build)
  fi
  if [[ "${requested_command}" == owned-fast-test || "${requested_command}" == owned-fast-test-local || "${requested_command}" == owned-build || "${requested_command}" == owned-build-local || "${requested_command}" == owned-clippy || "${requested_command}" == owned-clippy-rbe ]]; then
    selector_args+=(--owned)
  fi
  if [[ "${requested_command}" == owned-build || "${requested_command}" == owned-build-local || "${requested_command}" == affected-build || "${requested_command}" == affected-build-local ]]; then
    selector_args+=(--build)
  fi
  if [[ "${requested_command}" == owned-clippy || "${requested_command}" == owned-clippy-rbe || "${requested_command}" == affected-clippy || "${requested_command}" == affected-clippy-rbe ]]; then
    selector_args+=(--clippy)
  fi
  if [[ $# -gt 0 && "${1}" != -* ]]; then
    changed_paths=()
    while [[ $# -gt 0 && "${1}" != -* ]]; do
      changed_paths+=("${1}")
      shift
    done
    target="$("./scripts/bazel-affected-fast-tests.mjs" "${selector_args[@]}" "${changed_paths[@]}")"
  else
    target="$("./scripts/bazel-affected-fast-tests.mjs" "${selector_args[@]}")"
  fi
elif [[ $# -gt 0 && "${1}" != -* ]]; then
  target="${1}"
  shift
else
  target="${default_target}"
fi

module_lock_backup=""
secret_bazelrc=""
cleanup() {
  if [[ -n "${module_lock_backup}" && -f "${module_lock_backup}" ]]; then
    cp -p "${module_lock_backup}" "${lockfile}"
    rm -f "${module_lock_backup}"
    module_lock_backup=""
  fi
  if [[ -n "${secret_bazelrc}" ]]; then
    rm -f "${secret_bazelrc}"
    secret_bazelrc=""
  fi
}
trap cleanup EXIT

startup_args=()
startup_args+=(--bazelrc="${workspace_root}/.bazelrc")
if [[ "${meerkat_bazel_backend}" != "gcp-local" ]]; then
  secret_bazelrc="$(mktemp "${TMPDIR:-/tmp}/meerkat-buildbuddy-auth.XXXXXX")"
  chmod 600 "${secret_bazelrc}"
  printf 'build --remote_header=x-buildbuddy-api-key=%s\n' "${BUILDBUDDY_API_KEY}" >"${secret_bazelrc}"
  startup_args+=(--bazelrc="${secret_bazelrc}")
fi
if [[ -z "${BUILDBUDDY_NO_DEFAULT_OUTPUT_BASE:-}" ]]; then
  if [[ -z "${BUILDBUDDY_OUTPUT_BASE:-}" ]]; then
    cache_root="${MEERKAT_BUILDBUDDY_OUTPUT_ROOT:-${XDG_CACHE_HOME:-${HOME}/.cache}/meerkat/buildbuddy-bazel}"
    workspace_hash="$(printf '%s' "${workspace_root}" | shasum -a 256 | awk '{print substr($1, 1, 16)}')"
    lane_key="${BUILDBUDDY_OUTPUT_LANE:-${requested_command}-${config}}"
    agent_lane="${BUILDBUDDY_AGENT_LANE:-${RUST_LANE_ID:-${CODEX_AGENT_ID:-}}}"
    if [[ -n "${agent_lane}" ]]; then
      lane_key="${lane_key}-${agent_lane}"
    fi
    lane_key="$(printf '%s' "${lane_key}" | tr -c 'A-Za-z0-9_.-' '-')"
    BUILDBUDDY_OUTPUT_BASE="${cache_root}/$(basename "${workspace_root}")-${workspace_hash}-${lane_key}"
  fi
fi
if [[ -n "${BUILDBUDDY_OUTPUT_BASE:-}" ]]; then
  mkdir -p "$(dirname "${BUILDBUDDY_OUTPUT_BASE}")"
  startup_args+=(--output_base="${BUILDBUDDY_OUTPUT_BASE}")
fi
if [[ -z "${BUILDBUDDY_NO_DEFAULT_MAX_IDLE:-}" ]]; then
  BUILDBUDDY_MAX_IDLE_SECS="${BUILDBUDDY_MAX_IDLE_SECS:-600}"
fi
if [[ -n "${BUILDBUDDY_MAX_IDLE_SECS:-}" ]]; then
  startup_args+=(--max_idle_secs="${BUILDBUDDY_MAX_IDLE_SECS}")
fi

lockfile="${workspace_root}/MODULE.bazel.lock"
module_lock_args=()
if [[ -n "${BUILDBUDDY_KEEP_LOCK_REFRESH:-}" ]]; then
  echo "warning: BUILDBUDDY_KEEP_LOCK_REFRESH is ignored by local BuildBuddy runs; refresh Bazel metadata explicitly outside normal local lanes" >&2
fi
if [[ -f "${lockfile}" ]]; then
  module_lock_backup="$(mktemp "${TMPDIR:-/tmp}/meerkat-module-lock.XXXXXX")"
  cp -p "${lockfile}" "${module_lock_backup}"
fi
module_lock_args+=(--lockfile_mode="${BUILDBUDDY_LOCKFILE_MODE:-error}")

common_args=()
if [[ -z "${BUILDBUDDY_NO_DEFAULT_REPOSITORY_CACHE:-}" ]]; then
  BUILDBUDDY_REPOSITORY_CACHE="${BUILDBUDDY_REPOSITORY_CACHE:-${MEERKAT_BUILDBUDDY_REPOSITORY_CACHE:-/tmp/meerkat-bazel-repository-cache}}"
fi
if [[ -n "${BUILDBUDDY_REPOSITORY_CACHE:-}" ]]; then
  mkdir -p "${BUILDBUDDY_REPOSITORY_CACHE}"
  common_args+=(--repository_cache="${BUILDBUDDY_REPOSITORY_CACHE}")
fi

apple_platform_args=()
if [[ "${config}" == buildbuddy-macos-rbe* ]]; then
  macos_sdk_version="${BUILDBUDDY_MACOS_SDK_VERSION:-26.4}"
  macos_minimum_os="${BUILDBUDDY_MACOS_MINIMUM_OS:-13.0}"
  xcode_version="${BUILDBUDDY_XCODE_VERSION:-26.4.0}"
  apple_platform_args+=(
    --macos_sdk_version="${macos_sdk_version}"
    --macos_minimum_os="${macos_minimum_os}"
    --host_macos_minimum_os="${macos_minimum_os}"
    --xcode_version_config=//platforms:rbe_xcodes
    --xcode_version="${xcode_version}"
  )
fi

bb_args=()
if [[ "${#startup_args[@]}" -gt 0 ]]; then
  bb_args+=("${startup_args[@]}")
fi
bb_args+=("${command}")
if [[ "${#module_lock_args[@]}" -gt 0 ]]; then
  bb_args+=("${module_lock_args[@]}")
fi
if [[ "${#common_args[@]}" -gt 0 ]]; then
  bb_args+=("${common_args[@]}")
fi
bb_args+=(
  --config="${config}"
)
if [[ "${meerkat_bazel_backend}" == "gcp-local" ]]; then
  if [[ -n "${MEERKAT_BAZEL_DISK_CACHE:-}" ]]; then
    mkdir -p "${MEERKAT_BAZEL_DISK_CACHE}"
    bb_args+=(--disk_cache="${MEERKAT_BAZEL_DISK_CACHE}")
  fi
fi
buildbuddy_remote_url="${BUILDBUDDY_GRPC_URL:-${BUILDBUDDY_ENDPOINT:-}}"
if [[ "${meerkat_bazel_backend}" != "gcp-local" && -n "${buildbuddy_remote_url}" ]]; then
  buildbuddy_remote_url="${buildbuddy_remote_url%/}"
  case "${buildbuddy_remote_url}" in
    grpc://*|grpcs://*) ;;
    http://*) buildbuddy_remote_url="grpc://${buildbuddy_remote_url#http://}" ;;
    https://*) buildbuddy_remote_url="grpcs://${buildbuddy_remote_url#https://}" ;;
    *) buildbuddy_remote_url="grpcs://${buildbuddy_remote_url}" ;;
  esac

  buildbuddy_endpoint_host="${buildbuddy_remote_url#grpc://}"
  buildbuddy_endpoint_host="${buildbuddy_endpoint_host#grpcs://}"
  buildbuddy_endpoint_host="${buildbuddy_endpoint_host%%/*}"
  buildbuddy_endpoint_host="${buildbuddy_endpoint_host%%:*}"
  if [[ "${meerkat_bazel_backend}" == "gcp-buildbuddy" ]]; then
    case "${buildbuddy_endpoint_host}" in
      buildbuddy.io|*.buildbuddy.io)
        echo "error: refusing hosted BuildBuddy endpoint for gcp-buildbuddy: ${buildbuddy_endpoint_host}" >&2
        exit 1
        ;;
    esac
  fi

  buildbuddy_results_url="${BUILDBUDDY_HTTP_URL:-}"
  if [[ -z "${buildbuddy_results_url}" ]]; then
    buildbuddy_endpoint="${buildbuddy_remote_url#grpc://}"
    buildbuddy_endpoint="${buildbuddy_endpoint#grpcs://}"
    buildbuddy_endpoint="${buildbuddy_endpoint%%/*}"
    if [[ "${buildbuddy_remote_url}" == grpc://* ]]; then
      buildbuddy_endpoint="${buildbuddy_endpoint%:1985}:8080"
      buildbuddy_results_url="http://${buildbuddy_endpoint}"
    else
      buildbuddy_endpoint="${buildbuddy_endpoint%:1986}"
      buildbuddy_results_url="https://${buildbuddy_endpoint}"
    fi
  fi
  buildbuddy_results_url="${buildbuddy_results_url%/}"
  case "${buildbuddy_results_url}" in
    */invocation)
      buildbuddy_results_url="${buildbuddy_results_url}/"
      ;;
    */invocation/)
      ;;
    *)
      buildbuddy_results_url="${buildbuddy_results_url}/invocation/"
      ;;
  esac
  bb_args+=(
    --bes_results_url="${buildbuddy_results_url}"
    --bes_backend="${buildbuddy_remote_url}"
    --remote_cache="${buildbuddy_remote_url}"
    --remote_executor="${buildbuddy_remote_url}"
  )
fi
if [[ "${#apple_platform_args[@]}" -gt 0 ]]; then
  bb_args+=("${apple_platform_args[@]}")
fi
if [[ "${#gcp_buildbuddy_test_env[@]}" -gt 0 ]]; then
  bb_args+=("${gcp_buildbuddy_test_env[@]}")
fi
if [[ "${#extra_args[@]}" -gt 0 ]]; then
  bb_args+=("${extra_args[@]}")
fi
if [[ -n "${target}" ]]; then
  target_args=(${target})
  if [[ "${#target_args[@]}" -gt 0 ]]; then
    bb_args+=("${target_args[@]}")
  fi
fi
bb_args+=("$@")

set +e
"${bb_bin}" "${bb_args[@]}"
status="$?"
set -e

cleanup
trap - EXIT

exit "${status}"
