#!/usr/bin/env bash set -euo pipefail # Validate dependencies if ! command -v docker &> /dev/null; then echo "Error: docker is required but not installed." >&2 exit 1 fi if ! command -v docker compose &> /dev/null; then echo "Error: docker compose is required but not installed." >&2 exit 1 fi SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" COMPOSE_FILE="${SCRIPT_DIR}/docker-compose.yml" export LOCAL_UID="${USER_ID_OVERRIDE:-$(id -u)}" export LOCAL_GID="${GROUP_ID_OVERRIDE:-$(id -g)}" export LOCAL_USERNAME="${USERNAME_OVERRIDE:-toolbox}" if [[ ! -f "${COMPOSE_FILE}" ]]; then echo "Error: docker-compose.yml not found at ${COMPOSE_FILE}" >&2 exit 1 fi ACTION="${1:-up}" shift || true if [[ "${ACTION}" == "up" ]]; then # Create necessary directories for the toolbox tools mkdir -p "${HOME}/.local/share/mise" "${HOME}/.cache/mise" mkdir -p "${HOME}/.config" "${HOME}/.local/share" mkdir -p "${HOME}/.cache/openai" "${HOME}/.cache/gemini" "${HOME}/.cache/qwen" "${HOME}/.cache/code" "${HOME}/.cache/opencode" mkdir -p "${HOME}/.config/openai" "${HOME}/.config/gemini" "${HOME}/.config/qwen" "${HOME}/.config/code" "${HOME}/.config/opencode" fi case "${ACTION}" in up) docker compose -f "${COMPOSE_FILE}" up --build --detach "$@" echo "Container started. Use 'docker exec -it $(basename "$SCRIPT_DIR" | sed 's/toolbox-//') zsh' to access the shell." ;; down) docker compose -f "${COMPOSE_FILE}" down "$@" echo "Container stopped." ;; *) echo "Usage: $0 [up|down] [additional docker compose args]" >&2 exit 1 ;; esac