180 lines
5.5 KiB
Bash
Executable File
180 lines
5.5 KiB
Bash
Executable File
#!/usr/bin/env bash
|
||
# Compound Engineering environment health check
|
||
# Outputs a formatted diagnostic report in one pass
|
||
|
||
set -o pipefail
|
||
|
||
# =====================================================
|
||
# Dependency config
|
||
# =====================================================
|
||
# Format: name|tier|install_cmd|url
|
||
# Tiers: recommended (flagged if missing), optional (noted if missing)
|
||
# To add a dependency: add a line here. No other changes needed.
|
||
|
||
deps=(
|
||
"agent-browser|recommended|CI=true npm install -g agent-browser --no-audit --no-fund --loglevel=error && agent-browser install && npx skills add https://github.com/vercel-labs/agent-browser --skill agent-browser -g -y|https://github.com/vercel-labs/agent-browser"
|
||
"gh|recommended|NONINTERACTIVE=1 HOMEBREW_NO_AUTO_UPDATE=1 brew install -q gh|https://cli.github.com"
|
||
"jq|recommended|NONINTERACTIVE=1 HOMEBREW_NO_AUTO_UPDATE=1 brew install -q jq|https://jqlang.github.io/jq/"
|
||
"vhs|recommended|NONINTERACTIVE=1 HOMEBREW_NO_AUTO_UPDATE=1 brew install -q vhs|https://github.com/charmbracelet/vhs"
|
||
"silicon|recommended|NONINTERACTIVE=1 HOMEBREW_NO_AUTO_UPDATE=1 brew install -q silicon|https://github.com/Aloxaf/silicon"
|
||
"ffmpeg|recommended|NONINTERACTIVE=1 HOMEBREW_NO_AUTO_UPDATE=1 brew install -q ffmpeg|https://ffmpeg.org/download.html"
|
||
)
|
||
|
||
# =====================================================
|
||
# Args
|
||
# =====================================================
|
||
# --version VERSION (optional) plugin version to display (passed by the agent)
|
||
|
||
plugin_version=""
|
||
while [ $# -gt 0 ]; do
|
||
case "$1" in
|
||
--version) [ -n "$2" ] && plugin_version="$2" && shift 2 || shift ;;
|
||
*) shift ;;
|
||
esac
|
||
done
|
||
|
||
# =====================================================
|
||
# Helpers
|
||
# =====================================================
|
||
|
||
ok() { echo " 🟢 $1"; }
|
||
fail() { echo " 🔴 $1"; }
|
||
warn() { echo " 🟡 $1"; }
|
||
skip() { echo " ➖ $1"; }
|
||
detail() { echo " $1"; }
|
||
section() { echo ""; echo " $1"; }
|
||
|
||
has_brew=$(command -v brew >/dev/null 2>&1 && echo "yes" || echo "no")
|
||
in_repo=$(git rev-parse --is-inside-work-tree >/dev/null 2>&1 && echo "yes" || echo "no")
|
||
|
||
# =====================================================
|
||
# Check tools
|
||
# =====================================================
|
||
|
||
cli_ok=0; cli_total=0; issues=0
|
||
|
||
results=()
|
||
for entry in "${deps[@]}"; do
|
||
IFS='|' read -r name tier install_cmd url <<< "$entry"
|
||
cli_total=$((cli_total + 1))
|
||
if command -v "$name" >/dev/null 2>&1; then
|
||
cli_ok=$((cli_ok + 1))
|
||
results+=("$name|$tier|ok|$install_cmd|$url")
|
||
else
|
||
results+=("$name|$tier|missing|$install_cmd|$url")
|
||
fi
|
||
done
|
||
|
||
# =====================================================
|
||
# Project checks (repo only)
|
||
# =====================================================
|
||
|
||
legacy_cfg="skip"
|
||
repo_cfg_gitignore="skip"
|
||
example_cfg="skip"
|
||
|
||
if [ "$in_repo" = "yes" ]; then
|
||
repo_root=$(git rev-parse --show-toplevel 2>/dev/null)
|
||
legacy_cfg="missing"
|
||
[ -f "$repo_root/compound-engineering.local.md" ] && legacy_cfg="present"
|
||
|
||
if [ -e "$repo_root/.compound-engineering/config.local.yaml" ] || [ -d "$repo_root/.compound-engineering" ]; then
|
||
if git check-ignore -q "$repo_root/.compound-engineering/config.local.yaml" 2>/dev/null; then
|
||
repo_cfg_gitignore="ok"
|
||
else
|
||
repo_cfg_gitignore="missing"
|
||
fi
|
||
fi
|
||
|
||
script_dir="$(cd "$(dirname "$0")" && pwd)"
|
||
template="$script_dir/../references/config-template.yaml"
|
||
example="$repo_root/.compound-engineering/config.local.example.yaml"
|
||
if [ ! -f "$example" ]; then
|
||
example_cfg="missing"
|
||
elif [ -f "$template" ] && ! diff -q "$template" "$example" >/dev/null 2>&1; then
|
||
example_cfg="outdated"
|
||
else
|
||
example_cfg="ok"
|
||
fi
|
||
fi
|
||
|
||
# =====================================================
|
||
# Output
|
||
# =====================================================
|
||
|
||
echo ""
|
||
if [ -n "$plugin_version" ]; then
|
||
ok "Plugin version v${plugin_version}"
|
||
fi
|
||
|
||
# --- Tools ---
|
||
|
||
section "Tools ${cli_ok}/${cli_total}"
|
||
|
||
for result in "${results[@]}"; do
|
||
IFS='|' read -r name tier status install_cmd url <<< "$result"
|
||
if [ "$status" = "ok" ]; then
|
||
ok "$name"
|
||
else
|
||
warn "$name"
|
||
issues=$((issues + 1))
|
||
case "$install_cmd" in
|
||
*brew\ install*)
|
||
if [ "$has_brew" = "yes" ]; then detail "$install_cmd"
|
||
else detail "$url"; fi ;;
|
||
*)
|
||
detail "$install_cmd"
|
||
detail "$url" ;;
|
||
esac
|
||
fi
|
||
done
|
||
|
||
# --- Project ---
|
||
|
||
if [ "$in_repo" = "yes" ]; then
|
||
has_project_issues="no"
|
||
|
||
if [ "$legacy_cfg" = "present" ]; then
|
||
has_project_issues="yes"
|
||
fi
|
||
if [ "$repo_cfg_gitignore" = "missing" ]; then
|
||
has_project_issues="yes"
|
||
fi
|
||
if [ "$example_cfg" = "missing" ] || [ "$example_cfg" = "outdated" ]; then
|
||
has_project_issues="yes"
|
||
fi
|
||
|
||
if [ "$has_project_issues" = "yes" ]; then
|
||
section "Project"
|
||
|
||
if [ "$legacy_cfg" = "present" ]; then
|
||
warn "Outdated Compound Engineering config in this repo"
|
||
issues=$((issues + 1))
|
||
fi
|
||
|
||
if [ "$repo_cfg_gitignore" = "missing" ]; then
|
||
warn "Local config not safely gitignored"
|
||
issues=$((issues + 1))
|
||
fi
|
||
|
||
if [ "$example_cfg" = "missing" ]; then
|
||
warn "Example config missing (.compound-engineering/config.local.example.yaml)"
|
||
issues=$((issues + 1))
|
||
elif [ "$example_cfg" = "outdated" ]; then
|
||
warn "Example config outdated (new settings available)"
|
||
issues=$((issues + 1))
|
||
fi
|
||
fi
|
||
fi
|
||
|
||
# --- Bottom line ---
|
||
|
||
echo ""
|
||
if [ "$issues" -eq 0 ]; then
|
||
echo " ✅ All clear ${cli_ok}/${cli_total} tools"
|
||
else
|
||
echo " ⚠️ ${issues} issue(s) found ${cli_ok}/${cli_total} tools"
|
||
fi
|
||
|
||
echo ""
|