Repository navigation
Expand file tree
/
Copy pathbootstrap.sh
More file actions
executable file
·107 lines (94 loc) · 3.81 KB
/
Copy pathbootstrap.sh
File metadata and controls
executable file
·107 lines (94 loc) · 3.81 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
#!/usr/bin/env bash
# bootstrap.sh — sets up a fresh macOS machine from scratch.
# Run once: ./bootstrap.sh
# Subsequent runs are safe — all steps are idempotent.
set -euo pipefail
DOTFILES="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
step() { echo; echo "==> $*"; }
# =============================================================================
# 1. Homebrew
# =============================================================================
step "Homebrew"
if ! command -v brew &>/dev/null; then
echo " Installing Homebrew..."
tmpscript="$(mktemp)"
curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh -o "$tmpscript"
bash "$tmpscript"
rm "$tmpscript"
# Add brew to PATH for the rest of this script
if [ -x /opt/homebrew/bin/brew ]; then
eval "$(/opt/homebrew/bin/brew shellenv)" # Apple Silicon
elif [ -x /usr/local/bin/brew ]; then
eval "$(/usr/local/bin/brew shellenv)" # Intel
fi
else
echo " Homebrew already installed — skipping"
fi
# =============================================================================
# 2. Brew bundle (nvm, golang, vscode, gh, neovim, casks …)
# =============================================================================
step "Brew bundle"
brew update --quiet
brew bundle --file="$DOTFILES/Brewfile" --no-lock
# =============================================================================
# 3. oh-my-zsh
# =============================================================================
step "oh-my-zsh"
if [ ! -d "$HOME/.oh-my-zsh" ]; then
echo " Installing oh-my-zsh..."
tmpscript="$(mktemp)"
curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh -o "$tmpscript"
bash "$tmpscript" --unattended --keep-zshrc
rm "$tmpscript"
else
echo " oh-my-zsh already installed — skipping"
fi
# =============================================================================
# 4. Node.js via nvm
# =============================================================================
step "nvm + Node.js LTS"
export NVM_DIR="$HOME/.nvm"
# Source nvm from brew location
[ -s "/opt/homebrew/opt/nvm/nvm.sh" ] && . "/opt/homebrew/opt/nvm/nvm.sh"
[ -s "/usr/local/opt/nvm/nvm.sh" ] && . "/usr/local/opt/nvm/nvm.sh" # Intel
if command -v nvm &>/dev/null; then
nvm install --lts
nvm alias default lts/*
else
echo " WARNING: nvm not found — skipping Node.js install"
fi
# =============================================================================
# 5. SDKMan (Java / Kotlin / Scala version manager)
# =============================================================================
step "SDKMan"
if [ ! -d "$HOME/.sdkman" ]; then
echo " Installing SDKMan..."
tmpscript="$(mktemp)"
curl -fsSL https://get.sdkman.io -o "$tmpscript"
bash "$tmpscript"
rm "$tmpscript"
else
echo " SDKMan already installed — skipping"
fi
# =============================================================================
# 6. GitHub Copilot CLI (gh extension)
# Requires: gh auth login — skipped if not authenticated
# =============================================================================
step "GitHub Copilot CLI extension"
if gh auth status &>/dev/null; then
if ! gh extension list 2>/dev/null | grep -q "gh-copilot"; then
echo " Installing gh copilot extension..."
gh extension install github/gh-copilot
else
echo " gh copilot extension already installed — skipping"
fi
else
echo " gh not authenticated — skipping (run: gh auth login, then: gh extension install github/gh-copilot)"
fi
# =============================================================================
# 7. Symlinks (install.sh)
# =============================================================================
step "Dotfiles symlinks"
bash "$DOTFILES/install.sh"
echo
echo "All done! Open a new terminal (or run: source ~/.zshrc) to pick up all changes."