f70b1d3a1b
CI / commits (pull_request) Successful in 2m52s
CI / check (pull_request) Successful in 3m3s
CI / scan (pull_request) Successful in 3m11s
CI / a11y (pull_request) Successful in 3m5s
Docs site / build (pull_request) Successful in 3m10s
CI / perf (pull_request) Successful in 6m53s
New procedure in docs/setup/01-dev-debian-vm-setup.md targeting the new dev VM (10.100.201.21, Debian 13) that replaces the WSL workflow. The existing setup files are renumbered (01->02, 02->03, 03->04) to free prefix 01 for the default flow. 10 modular idempotent scripts under docs/setup/scripts/ install the stack: zsh + Oh My Zsh + Powerlevel10k + plugins, modern CLI tooling (bat, eza, fd-find, ripgrep, fzf, zoxide, ncdu, keychain + dev extras), nvm + Node from .nvmrc + corepack + pnpm, Docker CE + compose plugin, inotify watches + swap + hostname tuning, best-effort UFW + sshd hardening that probes-before-applying, and notes/aliases.zsh + notes/gitconfig.txt installation. A systemd template (apf-portal-infra@.service) auto-starts the local dev infra stack at boot per user. .devcontainer/ ships a VSCode Dev Container spec pinning Node 24 and attaching to the host's apf-portal-dev Compose network so postgres / redis / otel resolve by DNS from inside the container. initializeCommand fails fast if the infra hasn't been brought up yet. CLAUDE.md Environment conventions documents the two envs (local + development) plus the hybrid sub-mode (workstation IDE + VM infra via SSH LocalForward) and the two IDE flows (Remote-SSH + Devcontainer). Adjacent follow-ups (not in this PR): preview infra on the GitLab VM (10.100.201.10), GitLab Runner migration alongside the Gitea -> GitLab cutover, private dotfiles repo.
79 lines
2.9 KiB
Bash
Executable File
79 lines
2.9 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# Wire up the project-specific dotfiles:
|
|
# - symlink notes/aliases.zsh → ~/.oh-my-zsh/custom/aliases.zsh
|
|
# - copy notes/gitconfig.txt to ~/.gitconfig and overlay your identity
|
|
set -euo pipefail
|
|
# shellcheck source=./lib.sh
|
|
source "$(cd "$(dirname "$0")" && pwd)/lib.sh"
|
|
require_debian
|
|
require_not_root
|
|
|
|
REPO_ROOT="$(git rev-parse --show-toplevel 2>/dev/null || true)"
|
|
if [[ -z "$REPO_ROOT" ]]; then
|
|
err "Run from inside a git checkout of apf_portal."
|
|
exit 1
|
|
fi
|
|
|
|
# ─── 1. Aliases ───────────────────────────────────────────────────────
|
|
SOURCE_ALIASES="$REPO_ROOT/notes/aliases.zsh"
|
|
if [[ ! -f "$SOURCE_ALIASES" ]]; then
|
|
err "$SOURCE_ALIASES not found."
|
|
exit 1
|
|
fi
|
|
|
|
OMZ_CUSTOM="${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}"
|
|
if [[ ! -d "$OMZ_CUSTOM" ]]; then
|
|
err "$OMZ_CUSTOM not found — run 20-zsh.sh first."
|
|
exit 1
|
|
fi
|
|
|
|
TARGET_ALIASES="$OMZ_CUSTOM/aliases.zsh"
|
|
if [[ -L "$TARGET_ALIASES" \
|
|
&& "$(readlink -f "$TARGET_ALIASES")" == "$(readlink -f "$SOURCE_ALIASES")" ]]; then
|
|
skip "aliases.zsh symlink already correct."
|
|
else
|
|
if [[ -e "$TARGET_ALIASES" || -L "$TARGET_ALIASES" ]]; then
|
|
backup="$TARGET_ALIASES.bak.$(date +%s)"
|
|
mv "$TARGET_ALIASES" "$backup"
|
|
warn "Existing $TARGET_ALIASES backed up to $backup."
|
|
fi
|
|
ln -s "$SOURCE_ALIASES" "$TARGET_ALIASES"
|
|
ok "Linked $TARGET_ALIASES → $SOURCE_ALIASES."
|
|
fi
|
|
|
|
# ─── 2. gitconfig — copy + identity overlay ───────────────────────────
|
|
SOURCE_GITCONFIG="$REPO_ROOT/notes/gitconfig.txt"
|
|
if [[ ! -f "$SOURCE_GITCONFIG" ]]; then
|
|
err "$SOURCE_GITCONFIG not found."
|
|
exit 1
|
|
fi
|
|
|
|
TARGET_GITCONFIG="$HOME/.gitconfig"
|
|
if [[ -f "$TARGET_GITCONFIG" ]] && ! confirm "$TARGET_GITCONFIG exists — overwrite (existing backed up)?"; then
|
|
skip "Keeping existing $TARGET_GITCONFIG."
|
|
else
|
|
if [[ -f "$TARGET_GITCONFIG" ]]; then
|
|
cp "$TARGET_GITCONFIG" "$TARGET_GITCONFIG.bak.$(date +%s)"
|
|
fi
|
|
|
|
# Prompt for identity. Defaults: pre-existing config values, else blank.
|
|
current_name="$(git config --global user.name 2>/dev/null || true)"
|
|
current_email="$(git config --global user.email 2>/dev/null || true)"
|
|
read -r -p "Git user.name [${current_name:-<required>}]: " new_name
|
|
new_name="${new_name:-$current_name}"
|
|
read -r -p "Git user.email [${current_email:-<required>}]: " new_email
|
|
new_email="${new_email:-$current_email}"
|
|
if [[ -z "$new_name" || -z "$new_email" ]]; then
|
|
err "Both user.name and user.email are required."
|
|
exit 1
|
|
fi
|
|
|
|
cp "$SOURCE_GITCONFIG" "$TARGET_GITCONFIG"
|
|
# `git config --global` finds and rewrites the [user] section
|
|
# cleanly even when the source carries a different identity.
|
|
git config --global user.name "$new_name"
|
|
git config --global user.email "$new_email"
|
|
|
|
ok "Wrote $TARGET_GITCONFIG with identity $new_name <$new_email>."
|
|
fi
|