215 lines
6.3 KiB
Bash
215 lines
6.3 KiB
Bash
|
|
#!/usr/bin/env bash
|
||
|
|
# setup.sh - Claude Code bootstrap for macOS / Linux
|
||
|
|
# Usage:
|
||
|
|
# curl -fsSL https://gist.githubusercontent.com/YOUR_GIST_URL/raw/setup.sh | bash
|
||
|
|
#
|
||
|
|
# Or with parameters:
|
||
|
|
# CC_API_KEY="sk-ant-..." CC_REPO="https://github.com/org/repo" bash <(curl -fsSL https://gist.../raw/setup.sh)
|
||
|
|
|
||
|
|
set -e
|
||
|
|
|
||
|
|
CYAN='\033[0;36m'
|
||
|
|
GREEN='\033[0;32m'
|
||
|
|
RED='\033[0;31m'
|
||
|
|
GRAY='\033[0;90m'
|
||
|
|
NC='\033[0m'
|
||
|
|
|
||
|
|
step() { echo -e "\n${CYAN}[SETUP] $1${NC}"; }
|
||
|
|
ok() { echo -e " ${GREEN}OK: $1${NC}"; }
|
||
|
|
fail() { echo -e " ${RED}ERR: $1${NC}"; exit 1; }
|
||
|
|
skip() { echo -e " ${GRAY}SKIP: $1${NC}"; }
|
||
|
|
|
||
|
|
echo ""
|
||
|
|
echo -e "${CYAN} Claude Code Bootstrap - X9.cz"
|
||
|
|
echo -e " ==============================${NC}"
|
||
|
|
echo ""
|
||
|
|
|
||
|
|
# ------------------------------------------------------------
|
||
|
|
# API KEY
|
||
|
|
# ------------------------------------------------------------
|
||
|
|
API_KEY="${CC_API_KEY:-}"
|
||
|
|
if [ -z "$API_KEY" ]; then
|
||
|
|
read -rsp "Enter Anthropic API key (sk-ant-...): " API_KEY
|
||
|
|
echo ""
|
||
|
|
fi
|
||
|
|
if [[ ! "$API_KEY" == sk-* ]]; then
|
||
|
|
fail "Invalid API key"
|
||
|
|
fi
|
||
|
|
|
||
|
|
# ------------------------------------------------------------
|
||
|
|
# REPO URL
|
||
|
|
# ------------------------------------------------------------
|
||
|
|
REPO_URL="${CC_REPO:-}"
|
||
|
|
if [ -z "$REPO_URL" ]; then
|
||
|
|
read -rp "Enter repo URL (https://github.com/org/repo): " REPO_URL
|
||
|
|
fi
|
||
|
|
if [ -z "$REPO_URL" ]; then
|
||
|
|
fail "No repo URL provided"
|
||
|
|
fi
|
||
|
|
|
||
|
|
WORK_DIR="${CC_WORKDIR:-$HOME/Projects}"
|
||
|
|
|
||
|
|
# ------------------------------------------------------------
|
||
|
|
# DETECT OS
|
||
|
|
# ------------------------------------------------------------
|
||
|
|
OS="$(uname -s)"
|
||
|
|
step "Detected OS: $OS"
|
||
|
|
|
||
|
|
# ------------------------------------------------------------
|
||
|
|
# NODE.JS
|
||
|
|
# ------------------------------------------------------------
|
||
|
|
step "Checking Node.js..."
|
||
|
|
|
||
|
|
node_ok=false
|
||
|
|
if command -v node &>/dev/null; then
|
||
|
|
NODE_VER=$(node --version | sed 's/v//' | cut -d. -f1)
|
||
|
|
if [ "$NODE_VER" -ge 18 ]; then
|
||
|
|
ok "Node.js $(node --version)"
|
||
|
|
node_ok=true
|
||
|
|
fi
|
||
|
|
fi
|
||
|
|
|
||
|
|
if [ "$node_ok" = false ]; then
|
||
|
|
step "Installing Node.js..."
|
||
|
|
case "$OS" in
|
||
|
|
Darwin)
|
||
|
|
if command -v brew &>/dev/null; then
|
||
|
|
brew install node
|
||
|
|
else
|
||
|
|
step "Installing Homebrew first..."
|
||
|
|
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
|
||
|
|
brew install node
|
||
|
|
fi
|
||
|
|
;;
|
||
|
|
Linux)
|
||
|
|
# Node via NodeSource
|
||
|
|
curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash -
|
||
|
|
if command -v apt-get &>/dev/null; then
|
||
|
|
sudo apt-get install -y nodejs
|
||
|
|
elif command -v dnf &>/dev/null; then
|
||
|
|
sudo dnf install -y nodejs
|
||
|
|
elif command -v yum &>/dev/null; then
|
||
|
|
sudo yum install -y nodejs
|
||
|
|
else
|
||
|
|
fail "Cannot detect package manager. Install Node.js manually: https://nodejs.org"
|
||
|
|
fi
|
||
|
|
;;
|
||
|
|
*)
|
||
|
|
fail "Unsupported OS: $OS. Install Node.js manually: https://nodejs.org"
|
||
|
|
;;
|
||
|
|
esac
|
||
|
|
ok "Node.js installed"
|
||
|
|
fi
|
||
|
|
|
||
|
|
# ------------------------------------------------------------
|
||
|
|
# GIT
|
||
|
|
# ------------------------------------------------------------
|
||
|
|
step "Checking Git..."
|
||
|
|
|
||
|
|
if command -v git &>/dev/null; then
|
||
|
|
ok "Git available"
|
||
|
|
else
|
||
|
|
step "Installing Git..."
|
||
|
|
case "$OS" in
|
||
|
|
Darwin) brew install git ;;
|
||
|
|
Linux)
|
||
|
|
if command -v apt-get &>/dev/null; then sudo apt-get install -y git
|
||
|
|
elif command -v dnf &>/dev/null; then sudo dnf install -y git
|
||
|
|
elif command -v yum &>/dev/null; then sudo yum install -y git
|
||
|
|
else fail "Cannot install Git automatically"
|
||
|
|
fi
|
||
|
|
;;
|
||
|
|
esac
|
||
|
|
ok "Git installed"
|
||
|
|
fi
|
||
|
|
|
||
|
|
# ------------------------------------------------------------
|
||
|
|
# CLAUDE CODE
|
||
|
|
# ------------------------------------------------------------
|
||
|
|
step "Checking Claude Code..."
|
||
|
|
|
||
|
|
if command -v claude &>/dev/null; then
|
||
|
|
ok "Claude Code $(claude --version)"
|
||
|
|
else
|
||
|
|
step "Installing Claude Code..."
|
||
|
|
npm install -g @anthropic-ai/claude-code
|
||
|
|
ok "Claude Code installed"
|
||
|
|
fi
|
||
|
|
|
||
|
|
# ------------------------------------------------------------
|
||
|
|
# API KEY - ulozit
|
||
|
|
# ------------------------------------------------------------
|
||
|
|
step "Saving API key..."
|
||
|
|
|
||
|
|
SHELL_RC=""
|
||
|
|
case "$SHELL" in
|
||
|
|
*/zsh) SHELL_RC="$HOME/.zshrc" ;;
|
||
|
|
*/bash)
|
||
|
|
if [ "$OS" = "Darwin" ]; then
|
||
|
|
SHELL_RC="$HOME/.bash_profile"
|
||
|
|
else
|
||
|
|
SHELL_RC="$HOME/.bashrc"
|
||
|
|
fi
|
||
|
|
;;
|
||
|
|
*) SHELL_RC="$HOME/.profile" ;;
|
||
|
|
esac
|
||
|
|
|
||
|
|
# Odstrante stary zaznam pokud existuje
|
||
|
|
if [ -f "$SHELL_RC" ]; then
|
||
|
|
grep -v 'ANTHROPIC_API_KEY' "$SHELL_RC" > "${SHELL_RC}.tmp" && mv "${SHELL_RC}.tmp" "$SHELL_RC"
|
||
|
|
fi
|
||
|
|
|
||
|
|
echo "export ANTHROPIC_API_KEY=\"$API_KEY\"" >> "$SHELL_RC"
|
||
|
|
export ANTHROPIC_API_KEY="$API_KEY"
|
||
|
|
unset CC_API_KEY
|
||
|
|
ok "API key saved to $SHELL_RC"
|
||
|
|
|
||
|
|
# ------------------------------------------------------------
|
||
|
|
# CLONE / PULL REPO
|
||
|
|
# ------------------------------------------------------------
|
||
|
|
step "Setting up repository..."
|
||
|
|
mkdir -p "$WORK_DIR"
|
||
|
|
|
||
|
|
REPO_NAME=$(basename "$REPO_URL" .git)
|
||
|
|
TARGET_PATH="$WORK_DIR/$REPO_NAME"
|
||
|
|
|
||
|
|
if [ -d "$TARGET_PATH/.git" ]; then
|
||
|
|
step "Repo exists, pulling latest..."
|
||
|
|
git -C "$TARGET_PATH" pull
|
||
|
|
else
|
||
|
|
git clone "$REPO_URL" "$TARGET_PATH"
|
||
|
|
ok "Cloned to $TARGET_PATH"
|
||
|
|
fi
|
||
|
|
|
||
|
|
# ------------------------------------------------------------
|
||
|
|
# CLEAN SHELL HISTORY - odstranit radky s API key
|
||
|
|
# ------------------------------------------------------------
|
||
|
|
HIST_FILE="${HISTFILE:-$HOME/.bash_history}"
|
||
|
|
if [ -f "$HIST_FILE" ]; then
|
||
|
|
grep -v 'sk-ant-\|CC_API_KEY\|ANTHROPIC' "$HIST_FILE" > "${HIST_FILE}.tmp" && mv "${HIST_FILE}.tmp" "$HIST_FILE"
|
||
|
|
fi
|
||
|
|
# zsh history
|
||
|
|
ZSH_HIST="$HOME/.zsh_history"
|
||
|
|
if [ -f "$ZSH_HIST" ]; then
|
||
|
|
grep -v 'sk-ant-\|CC_API_KEY\|ANTHROPIC' "$ZSH_HIST" > "${ZSH_HIST}.tmp" && mv "${ZSH_HIST}.tmp" "$ZSH_HIST"
|
||
|
|
fi
|
||
|
|
|
||
|
|
# ------------------------------------------------------------
|
||
|
|
# LAUNCH
|
||
|
|
# ------------------------------------------------------------
|
||
|
|
echo ""
|
||
|
|
echo -e "${GREEN} =============================="
|
||
|
|
echo -e " Ready! Repo: $TARGET_PATH"
|
||
|
|
echo -e " ==============================${NC}"
|
||
|
|
echo ""
|
||
|
|
echo -e " Run: ${CYAN}source $SHELL_RC && cd $TARGET_PATH && claude${NC}"
|
||
|
|
echo ""
|
||
|
|
|
||
|
|
# Pokud je skript spusten primo (ne pres pipe), rovnou spustit
|
||
|
|
if [ -t 0 ]; then
|
||
|
|
cd "$TARGET_PATH"
|
||
|
|
# shellcheck disable=SC1090
|
||
|
|
source "$SHELL_RC"
|
||
|
|
claude
|
||
|
|
fi
|