diff --git a/docs/setup/01-dev-debian-vm-setup.md b/docs/setup/01-dev-debian-vm-setup.md index 581d263..ac73680 100644 --- a/docs/setup/01-dev-debian-vm-setup.md +++ b/docs/setup/01-dev-debian-vm-setup.md @@ -160,16 +160,16 @@ The `bootstrap.sh` script runs every numbered script (`10-…` → `80-…`) in What each script does: -| Script | Effect | Idempotent? | -| ---------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------- | -| [`10-base-packages.sh`](scripts/10-base-packages.sh) | `apt update` + install the minimal set every other script depends on: `curl wget git ca-certificates gnupg build-essential pkg-config`. | ✅ | -| [`20-zsh.sh`](scripts/20-zsh.sh) | Install zsh + Oh My Zsh + Powerlevel10k + plugins (autosuggestions, syntax-highlighting). Patch `~/.zshrc` (theme + plugins + fzf hook) and `~/.bashrc` (exec zsh on interactive shells — `chsh` is blocked on the corp VM). | ✅ | -| [`30-cli-tools.sh`](scripts/30-cli-tools.sh) | Install `bat eza fd-find ripgrep fzf zoxide ncdu keychain` + `jq yq httpie make tree htop tmux direnv dnsutils unzip`. Aliases for the Debian-renamed binaries (`batcat`→`bat`, `fdfind`→`fd`). | ✅ | -| [`40-node.sh`](scripts/40-node.sh) | Install nvm. Install Node from the repo's `.nvmrc` (currently `24`). Enable corepack, pin pnpm to `package.json`'s `packageManager`. | ✅ | -| [`50-docker.sh`](scripts/50-docker.sh) | Install Docker CE + compose plugin from the Docker apt repo. Add the current user to the `docker` group. Enable `docker.service`. | ✅ | -| [`60-tuning.sh`](scripts/60-tuning.sh) | `fs.inotify.max_user_watches=524288` (Vite / Nx watch). Prompt for hostname (only if generic). Add a 4 GB swapfile if none. | ✅ | -| [`70-hardening.sh`](scripts/70-hardening.sh) | Best-effort UFW (allow SSH only, prompts before enabling), `unattended-upgrades` on security channel, `fail2ban` (opt-in — prompts before installing), sshd hardening (no root, no password — prompts before applying). **Probes before applying** — skips what's already done. | ✅ | -| [`80-dotfiles.sh`](scripts/80-dotfiles.sh) | Symlink `docs/setup/dotfiles/aliases.zsh` → `~/.oh-my-zsh/custom/aliases.zsh`. Generate `~/.gitconfig` from `docs/setup/dotfiles/gitconfig.txt`, prompt for identity (name + email). | ✅ | +| Script | Effect | Idempotent? | +| ---------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------- | +| [`10-base-packages.sh`](scripts/10-base-packages.sh) | `apt update` + install the minimal set every other script depends on: `curl wget git ca-certificates gnupg build-essential pkg-config`. | ✅ | +| [`20-zsh.sh`](scripts/20-zsh.sh) | Install zsh + Oh My Zsh + Powerlevel10k + plugins (autosuggestions, syntax-highlighting). Patch `~/.zshrc` (theme + plugins + fzf hook) and `~/.bashrc` (exec zsh on interactive shells — `chsh` is blocked on the corp VM). | ✅ | +| [`30-cli-tools.sh`](scripts/30-cli-tools.sh) | Install `bat eza fd-find ripgrep fzf zoxide ncdu keychain` + `jq yq httpie make tree htop tmux direnv dnsutils unzip`. Aliases for the Debian-renamed binaries (`batcat`→`bat`, `fdfind`→`fd`). | ✅ | +| [`40-node.sh`](scripts/40-node.sh) | Install nvm. Install Node from the repo's `.nvmrc` (currently `24`). Enable corepack, pin pnpm to `package.json`'s `packageManager`. Mirror the nvm init into `~/.zshrc` (the installer only patches `~/.bashrc`, which the zsh hand-off execs past — without this, zsh has no node/pnpm on PATH). | ✅ | +| [`50-docker.sh`](scripts/50-docker.sh) | Install Docker CE + compose plugin from the Docker apt repo. Add the current user to the `docker` group. Enable `docker.service`. | ✅ | +| [`60-tuning.sh`](scripts/60-tuning.sh) | `fs.inotify.max_user_watches=524288` (Vite / Nx watch). Prompt for hostname (only if generic). Add a 4 GB swapfile if none. | ✅ | +| [`70-hardening.sh`](scripts/70-hardening.sh) | Best-effort UFW (allow SSH only, prompts before enabling), `unattended-upgrades` on security channel, `fail2ban` (opt-in — prompts before installing), sshd hardening (no root, no password — prompts before applying). **Probes before applying** — skips what's already done. | ✅ | +| [`80-dotfiles.sh`](scripts/80-dotfiles.sh) | Symlink `docs/setup/dotfiles/aliases.zsh` → `~/.oh-my-zsh/custom/aliases.zsh`. Generate `~/.gitconfig` from `docs/setup/dotfiles/gitconfig.txt`, prompt for identity (name + email). | ✅ | After bootstrap, reload your shell to pick up the new PATH + zsh: diff --git a/docs/setup/scripts/40-node.sh b/docs/setup/scripts/40-node.sh index c91ac5a..95b3ba7 100755 --- a/docs/setup/scripts/40-node.sh +++ b/docs/setup/scripts/40-node.sh @@ -53,4 +53,27 @@ if [[ -f "$REPO_ROOT/package.json" ]]; then popd >/dev/null fi +# The nvm installer appends its init to ~/.bashrc only. But the +# interactive shell on this VM is zsh: 20-zsh.sh hands off via +# `exec zsh -l` (chsh is blocked on the corp VM). That hand-off execs +# zsh *before* the nvm block in ~/.bashrc runs, and the nvm installer +# leaves ~/.zshrc untouched — so without this, zsh sessions have +# neither node nor pnpm on PATH. Mirror the nvm init into ~/.zshrc +# (idempotent via marker, same pattern as 20-zsh.sh's .bashrc patch). +ZSHRC="$HOME/.zshrc" +[[ -f "$ZSHRC" ]] || touch "$ZSHRC" +NVM_MARKER='# Managed by docs/setup/scripts/40-node.sh — nvm init for zsh.' +if grep -qF "$NVM_MARKER" "$ZSHRC"; then + skip "nvm init already in $ZSHRC." +else + cat >> "$ZSHRC" <<'EOF' + +# Managed by docs/setup/scripts/40-node.sh — nvm init for zsh. +export NVM_DIR="$HOME/.nvm" +[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" +[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" +EOF + ok "Patched $ZSHRC with nvm init." +fi + log "Reload your shell (exec zsh -l) so nvm + node + pnpm are on PATH."