3.6 KiB

Dev Environment Setup

Template for Part 1 of the setup script. All steps are idempotent.

Homebrew PATH

if ! grep -q 'brew shellenv' ~/.zprofile 2>/dev/null; then
  echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> ~/.zprofile
fi
eval "$(/opt/homebrew/bin/brew shellenv)"

Packages

Install via brew (skip if present):

for pkg in neovim tmux git starship gh node; do
  if brew list "$pkg" &>/dev/null; then
    echo "  $pkg: installed"
  else
    brew install "$pkg"
  fi
done

Bun via official installer (not in Homebrew):

if [ -x ~/.bun/bin/bun ]; then
  echo "  bun: installed"
else
  curl -fsSL https://bun.sh/install | bash
fi

Git Identity

Set global git identity if not configured. Use env vars or defaults:

if [ -z "$(git config --global user.name)" ]; then
  git config --global user.name "${GIT_USER_NAME:-$(whoami)}"
  git config --global user.email "${GIT_USER_EMAIL:-$(whoami)@users.noreply.github.com}"
fi

For GitHub accounts, use the noreply email: <username>@users.noreply.github.com

gh Authentication

After installing gh, the user must run gh auth login interactively (browser or token flow). Then set up the git credential helper so git push works over HTTPS without prompting:

gh auth setup-git

This is critical for headless servers where HTTPS git push would otherwise fail with "could not read Username: Device not configured".

Git Repos

Three repos should be initialized and pushed after setup:

  • ~/.agents — Signet agent identity (initialized by signet, not the script)
  • ~/.<client> — Server config and scripts (set via CLIENT_DIR env var)
  • ~/.config/nvim — Nvim config (cloned from source, may be re-pointed)

Each repo uses upstream as the remote name. The script attempts to push all repos that have an upstream remote configured.

Nvim Config

Clone nvim config (default: Nicholai's from Gitea, override with NVIM_REPO):

if [ -d ~/.config/nvim/.git ]; then
  echo "already cloned"
else
  mkdir -p ~/.config
  git clone "$NVIM_REPO" ~/.config/nvim
fi

config.json

Generate if not present. Adapt paths per machine (Mac uses ~/Documents/, ~/Developer/, etc.). Template:

{
    "paths": {
        "obsidianVault": "~/Documents/obsidian-vault/",
        "srcDirectory": "~/Developer/",
        "scriptsDirectory": "~/scripts/",
        "wallpaperScript": "~/scripts/pywal/wallpapermenu.sh"
    },
    "editor": {
        "tabSize": 4,
        "scrollOffset": 8,
        "theme": "wave"
    },
    "ai": {
        "model": "claude-sonnet-4-5",
        "openCodeModel": "anthropic/claude-sonnet-4-5"
    },
    "lsp": {
        "servers": ["ts_ls", "eslint", "jsonls", "html", "cssls", "tailwindcss"]
    },
    "treesitter": {
        "languages": ["lua", "vim", "bash", "javascript", "typescript", "tsx", "json", "yaml", "html", "css"]
    }
}
ln -sf ~/.config/nvim/dotfiles/.tmux.conf ~/.tmux.conf
ln -sf ~/.config/nvim/dotfiles/starship.toml ~/.config/starship.toml

Nvim Plugins

nvim --headless "+Lazy! sync" +qa 2>/dev/null || true

Shell Aliases

Append to ~/.zshrc if not already present (check for marker comment # Added by nvim dotfiles setup). Include:

  • Git shortcuts: gs, ga, gc, gp, gl
  • Claude aliases: cldy, cldyh, cldys, cldyo
  • Directory aliases: .., ..., ...., home, cd.., chpwd, mkdirg
  • Editor: EDITOR=nvim, VISUAL=nvim, alias vim=nvim
  • Prompt: eval "$(starship init zsh)"

tmux Terminal Fix

Ensure tmux.conf has this line for backspace over SSH:

set -ga terminal-overrides ",*:Tc,*:kbs=\177"