# Dev Environment Setup Template for Part 1 of the setup script. All steps are idempotent. ## Homebrew PATH ```bash 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): ```bash 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): ```bash 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: ```bash 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: `@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: ```bash 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) - `~/.` — 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`): ```bash 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: ```json { "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"] } } ``` ## Dotfile Symlinks ```bash ln -sf ~/.config/nvim/dotfiles/.tmux.conf ~/.tmux.conf ln -sf ~/.config/nvim/dotfiles/starship.toml ~/.config/starship.toml ``` ## Nvim Plugins ```bash 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" ```