#!/usr/bin/env bash set -euo pipefail ROOT_DIR="$(CDPATH='' cd -- "$(dirname -- "${BASH_SOURCE[0]}")/.." && pwd)" OUTPUT_PATH="${ROOT_DIR}/.ai/environment/tools.raw.yaml" MODE="${1:---check}" usage() { cat <<'EOF' Usage: bash scripts/collect-dev-environment.sh --check bash scripts/collect-dev-environment.sh --write Modes: --check Print the raw project-relevant environment inventory. --write Write the raw inventory to .ai/environment/tools.raw.yaml. EOF } ensure_supported_mode() { case "${MODE}" in --check|--write) ;; *) usage exit 1 ;; esac } command_path() { local tool="$1" if command -v "${tool}" >/dev/null 2>&1; then command -v "${tool}" else printf '%s' "" fi } command_installed() { local tool="$1" if command -v "${tool}" >/dev/null 2>&1; then printf 'true' else printf 'false' fi } command_version() { local tool="$1" if ! command -v "${tool}" >/dev/null 2>&1; then printf '%s' "not-installed" return fi case "${tool}" in dotnet) dotnet --version 2>/dev/null || printf '%s' "unknown" ;; python3) python3 --version 2>/dev/null || printf '%s' "unknown" ;; node) node --version 2>/dev/null || printf '%s' "unknown" ;; npm) npm --version 2>/dev/null || printf '%s' "unknown" ;; bun) bun --version 2>/dev/null || printf '%s' "unknown" ;; git) git --version 2>/dev/null || printf '%s' "unknown" ;; rg) rg --version 2>/dev/null | head -n 1 || printf '%s' "unknown" ;; jq) jq --version 2>/dev/null || printf '%s' "unknown" ;; docker) docker --version 2>/dev/null || printf '%s' "unknown" ;; bash) bash --version 2>/dev/null | head -n 1 || printf '%s' "unknown" ;; *) "${tool}" --version 2>/dev/null | head -n 1 || printf '%s' "unknown" ;; esac } python_package_version() { local package_name="$1" python3 - "${package_name}" <<'PY' from importlib import metadata import sys package_name = sys.argv[1] try: print(metadata.version(package_name)) except metadata.PackageNotFoundError: print("not-installed") PY } python_package_installed() { local package_name="$1" local version version="$(python_package_version "${package_name}")" if [[ "${version}" == "not-installed" ]]; then printf 'false' else printf 'true' fi } read_os_release() { local key="$1" python3 - "$key" <<'PY' import pathlib import sys target_key = sys.argv[1] values = {} for line in pathlib.Path("/etc/os-release").read_text(encoding="utf-8").splitlines(): if "=" not in line: continue key, value = line.split("=", 1) values[key] = value.strip().strip('"') print(values.get(target_key, "unknown")) PY } collect_inventory() { local os_name distro version_id kernel shell_name wsl_enabled wsl_version timestamp os_name="$(uname -s)" distro="$(read_os_release PRETTY_NAME)" version_id="$(read_os_release VERSION_ID)" kernel="$(uname -r)" shell_name="$(basename "${SHELL:-bash}")" timestamp="$(date -u +"%Y-%m-%dT%H:%M:%SZ")" if grep -qi microsoft /proc/version 2>/dev/null; then wsl_enabled="true" else wsl_enabled="false" fi if command -v wslinfo >/dev/null 2>&1; then wsl_version="$(wslinfo --wsl-version 2>/dev/null || printf '%s' "unknown")" else wsl_version="unknown" fi cat < "${OUTPUT_PATH}" printf 'Wrote %s\n' "${OUTPUT_PATH}" else collect_inventory fi