Add auto-install for missing prerequisites
- New lib/prereqs.sh: detects distro (Arch, Debian/Ubuntu, RHEL/Fedora, openSUSE) and installs git + podman/docker if missing - Podman preferred over docker; user chooses if neither present - Docker install also enables systemd service and adds user to docker group - README updated: prereqs table now shows auto-install support Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
8d089c05a2
commit
452a603cdf
3 changed files with 154 additions and 20 deletions
14
README.md
14
README.md
|
|
@ -23,12 +23,16 @@ Open in devcontainer → start Context Studio → talk to your agent team.
|
||||||
|
|
||||||
## 📋 Prerequisites
|
## 📋 Prerequisites
|
||||||
|
|
||||||
| | Tool | Purpose |
|
| | Tool | Notes |
|
||||||
|---|------|---------|
|
|---|------|---------|
|
||||||
| 🔀 | `git` | Clone repos |
|
| 🔀 | `git` | Auto-installed if missing |
|
||||||
| 🐳 | `docker` or `podman` | Run devcontainer |
|
| 🐳 | `podman` _(preferred)_ or `docker` | Auto-installed if missing |
|
||||||
| 🔑 | SSH key → `github.com` | Access context-studio-core |
|
| 🔑 | SSH key → `github.com` | Must be set up manually |
|
||||||
| 🗝️ | `ANTHROPIC_API_KEY` | Claude agents |
|
| 🗝️ | `ANTHROPIC_API_KEY` | Must be set in your environment |
|
||||||
|
|
||||||
|
**Auto-install supported on:** Arch · Debian/Ubuntu · RHEL/Fedora · openSUSE
|
||||||
|
|
||||||
|
> The wizard detects your distro and installs `git` and `podman`/`docker` automatically if they are missing. SSH key and API key must be set up by you.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
|
||||||
144
lib/prereqs.sh
Normal file
144
lib/prereqs.sh
Normal file
|
|
@ -0,0 +1,144 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
# prereqs.sh — detect distro, install missing prerequisites
|
||||||
|
|
||||||
|
# Detect package manager / distro family
|
||||||
|
detect_distro() {
|
||||||
|
if command -v pacman &>/dev/null; then echo "arch";
|
||||||
|
elif command -v apt-get &>/dev/null; then echo "debian";
|
||||||
|
elif command -v dnf &>/dev/null; then echo "rhel";
|
||||||
|
elif command -v yum &>/dev/null; then echo "rhel-yum";
|
||||||
|
elif command -v zypper &>/dev/null; then echo "suse";
|
||||||
|
else echo "unknown";
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
install_pkg() {
|
||||||
|
local pkg="$1"
|
||||||
|
local distro
|
||||||
|
distro="$(detect_distro)"
|
||||||
|
|
||||||
|
info "Installing $pkg (distro: $distro)..."
|
||||||
|
case "$distro" in
|
||||||
|
arch)
|
||||||
|
sudo pacman -Sy --noconfirm "$pkg" ;;
|
||||||
|
debian)
|
||||||
|
sudo apt-get update -qq && sudo apt-get install -y "$pkg" ;;
|
||||||
|
rhel)
|
||||||
|
sudo dnf install -y "$pkg" ;;
|
||||||
|
rhel-yum)
|
||||||
|
sudo yum install -y "$pkg" ;;
|
||||||
|
suse)
|
||||||
|
sudo zypper install -y "$pkg" ;;
|
||||||
|
*)
|
||||||
|
die "Unsupported distro — please install $pkg manually." ;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
ensure_git() {
|
||||||
|
if command -v git &>/dev/null; then
|
||||||
|
success "git: $(git --version)"
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
warn "git not found."
|
||||||
|
ask_yn _install "Install git now?" "y"
|
||||||
|
[[ "$_install" != "y" ]] && die "git is required."
|
||||||
|
install_pkg git
|
||||||
|
command -v git &>/dev/null || die "git installation failed."
|
||||||
|
success "git installed: $(git --version)"
|
||||||
|
}
|
||||||
|
|
||||||
|
ensure_container_runtime() {
|
||||||
|
# Already available?
|
||||||
|
if command -v podman &>/dev/null; then
|
||||||
|
CONTAINER_CMD="podman"
|
||||||
|
success "podman: $(podman --version)"
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
if command -v docker &>/dev/null; then
|
||||||
|
CONTAINER_CMD="docker"
|
||||||
|
success "docker: $(docker --version | head -1)"
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
warn "No container runtime found (podman or docker)."
|
||||||
|
echo ""
|
||||||
|
echo -e " ${CYAN}podman${RESET} is preferred (rootless, no daemon)"
|
||||||
|
echo -e " ${CYAN}docker${RESET} is the alternative"
|
||||||
|
echo ""
|
||||||
|
ask_choice _runtime "Which would you like to install?" \
|
||||||
|
"podman (recommended)" \
|
||||||
|
"docker"
|
||||||
|
|
||||||
|
case "$_runtime" in
|
||||||
|
podman*)
|
||||||
|
_install_podman
|
||||||
|
CONTAINER_CMD="podman"
|
||||||
|
;;
|
||||||
|
docker*)
|
||||||
|
_install_docker
|
||||||
|
CONTAINER_CMD="docker"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
command -v "$CONTAINER_CMD" &>/dev/null \
|
||||||
|
|| die "$CONTAINER_CMD installation failed. Please install manually."
|
||||||
|
success "$CONTAINER_CMD installed: $($CONTAINER_CMD --version | head -1)"
|
||||||
|
}
|
||||||
|
|
||||||
|
_install_podman() {
|
||||||
|
local distro
|
||||||
|
distro="$(detect_distro)"
|
||||||
|
case "$distro" in
|
||||||
|
arch) install_pkg podman ;;
|
||||||
|
debian) install_pkg podman ;;
|
||||||
|
rhel) install_pkg podman ;;
|
||||||
|
rhel-yum) install_pkg podman ;;
|
||||||
|
suse) install_pkg podman ;;
|
||||||
|
*) die "Unsupported distro — install podman manually: https://podman.io/getting-started/installation" ;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
_install_docker() {
|
||||||
|
local distro
|
||||||
|
distro="$(detect_distro)"
|
||||||
|
case "$distro" in
|
||||||
|
arch)
|
||||||
|
install_pkg docker
|
||||||
|
sudo systemctl enable --now docker
|
||||||
|
sudo usermod -aG docker "$USER"
|
||||||
|
warn "Added $USER to docker group — log out and back in for it to take effect."
|
||||||
|
;;
|
||||||
|
debian)
|
||||||
|
install_pkg docker.io
|
||||||
|
sudo systemctl enable --now docker
|
||||||
|
sudo usermod -aG docker "$USER"
|
||||||
|
warn "Added $USER to docker group — log out and back in for it to take effect."
|
||||||
|
;;
|
||||||
|
rhel)
|
||||||
|
install_pkg docker
|
||||||
|
sudo systemctl enable --now docker
|
||||||
|
sudo usermod -aG docker "$USER"
|
||||||
|
warn "Added $USER to docker group — log out and back in for it to take effect."
|
||||||
|
;;
|
||||||
|
rhel-yum)
|
||||||
|
install_pkg docker
|
||||||
|
sudo systemctl enable --now docker
|
||||||
|
sudo usermod -aG docker "$USER"
|
||||||
|
warn "Added $USER to docker group — log out and back in for it to take effect."
|
||||||
|
;;
|
||||||
|
suse)
|
||||||
|
install_pkg docker
|
||||||
|
sudo systemctl enable --now docker
|
||||||
|
sudo usermod -aG docker "$USER"
|
||||||
|
warn "Added $USER to docker group — log out and back in for it to take effect."
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
die "Unsupported distro — install docker manually: https://docs.docker.com/engine/install/" ;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
check_prerequisites() {
|
||||||
|
header "Checking Prerequisites"
|
||||||
|
ensure_git
|
||||||
|
ensure_container_runtime
|
||||||
|
}
|
||||||
16
wizard.sh
16
wizard.sh
|
|
@ -7,25 +7,11 @@ set -euo pipefail
|
||||||
WIZARD_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
WIZARD_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||||
|
|
||||||
source "$WIZARD_DIR/lib/utils.sh"
|
source "$WIZARD_DIR/lib/utils.sh"
|
||||||
|
source "$WIZARD_DIR/lib/prereqs.sh"
|
||||||
source "$WIZARD_DIR/lib/core.sh"
|
source "$WIZARD_DIR/lib/core.sh"
|
||||||
source "$WIZARD_DIR/lib/project.sh"
|
source "$WIZARD_DIR/lib/project.sh"
|
||||||
source "$WIZARD_DIR/lib/workflow.sh"
|
source "$WIZARD_DIR/lib/workflow.sh"
|
||||||
|
|
||||||
# ── Prerequisites ──────────────────────────────────────────────────────────
|
|
||||||
check_prerequisites() {
|
|
||||||
header "Checking Prerequisites"
|
|
||||||
require_cmd git
|
|
||||||
if command -v docker &>/dev/null; then
|
|
||||||
CONTAINER_CMD="docker"
|
|
||||||
elif command -v podman &>/dev/null; then
|
|
||||||
CONTAINER_CMD="podman"
|
|
||||||
else
|
|
||||||
die "Neither docker nor podman found. Install one to use devcontainers."
|
|
||||||
fi
|
|
||||||
success "git: $(git --version)"
|
|
||||||
success "$CONTAINER_CMD: $($CONTAINER_CMD --version | head -1)"
|
|
||||||
}
|
|
||||||
|
|
||||||
# ── Project info ───────────────────────────────────────────────────────────
|
# ── Project info ───────────────────────────────────────────────────────────
|
||||||
collect_project_info() {
|
collect_project_info() {
|
||||||
header "Project Details"
|
header "Project Details"
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue