Initial commit: linux-provision repo
Distribution-agnostic provisioning script that sets up a new Linux machine (Detected via lib/distro.sh - supports Debian/Ubuntu/Pop and Fedora families). 13 stages covering: - System packages, external repos, toolchains (nvm, uv, Python) - Shell config (zsh, oh-my-zsh, p10k), git, SSH - Custom uv tools from ~40 git repos - Desktop config (keybindings, hotkeys, ghostty, fonts) - Docker, system tweaks, browser/app installs - Custom systemd user services (porridge, swayidle, mempi-sync, etc.) - API keys loaded from Bitwarden at shell startup
This commit is contained in:
81
stages/06-uv-projects.sh
Normal file
81
stages/06-uv-projects.sh
Normal file
@@ -0,0 +1,81 @@
|
||||
#!/usr/bin/env bash
|
||||
# ===========================================================================
|
||||
# Stage 06: Julian's uv Python Tools — Clone & Install
|
||||
# Clones all custom Python tool repos (from GitHub) into ~/Development/
|
||||
# and installs them via 'uv tool install' (editable mode from local path).
|
||||
# ===========================================================================
|
||||
# These are Julian's own CLI tools — the ones installed on Pop via uv.
|
||||
# Each has a remote on github.com/julianprester/ (or re3-work/) and a
|
||||
# pyproject.toml defining the package.
|
||||
#
|
||||
# Tools without a public remote (oracle, panac, skill-eval, mondada) are
|
||||
# noted — you'll need to push them to GitHub or copy them manually.
|
||||
#
|
||||
# Order: tools that depend on other tools should come after. Most are
|
||||
# independent Python packages.
|
||||
# ===========================================================================
|
||||
|
||||
# Ensure uv is in PATH
|
||||
export PATH="$HOME/.local/bin:$PATH"
|
||||
|
||||
# ---- Define tool repos ----
|
||||
# Format: "repo_name:github_org:has_pyproject:has_package_json"
|
||||
# repo_name = directory name under ~/Development/
|
||||
# github_org = GitHub org (julianprester or re3-work)
|
||||
# has_pyproject = true if it has pyproject.toml and should be uv-installed
|
||||
# has_package_json = true if it has package.json and should be npm-linked
|
||||
|
||||
TOOLS=(
|
||||
"porridge:julianprester:true:false" # Zoom meeting transcriber daemon
|
||||
"deepis:julianprester:true:false" # Literature discovery CLI
|
||||
"pi-persist:julianprester:true:false" # Memory persistence (mempi, pi-overview)
|
||||
"panac:julianprester:true:false" # Pandoc wrapper CLI
|
||||
"gromd:julianprester:true:false" # Gromd tool
|
||||
"kannwas:julianprester:true:false" # Kannwas tool
|
||||
"tb-api:julianprester:false:false" # Thunderbird REST API (not a Python/npm pkg — Firefox addon)
|
||||
"hotkeys:julianprester:false:false" # Shell scripts for Wayland hotkeys (no install needed)
|
||||
"ocpa:julianprester:true:false" # OpenCode pi agent Python package
|
||||
)
|
||||
|
||||
# ===========================================================================
|
||||
info "Cloning & installing Julian's Python tools..."
|
||||
|
||||
mkdir -p "$HOME/Development"
|
||||
|
||||
# ---- Clone and install each tool ----
|
||||
for tool_entry in "${TOOLS[@]}"; do
|
||||
IFS=':' read -r name org has_pyproject has_package_json <<< "$tool_entry"
|
||||
target_dir="$HOME/Development/$name"
|
||||
|
||||
if [ -d "$target_dir" ]; then
|
||||
ok "Repo '$name' already cloned. Pulling latest..."
|
||||
git -C "$target_dir" pull --ff-only 2>/dev/null || warn "Could not pull $name."
|
||||
else
|
||||
info "Cloning $org/$name..."
|
||||
git clone "git@github.com:${org}/${name}.git" "$target_dir" 2>/dev/null || {
|
||||
warn "Clone failed for ${org}/${name}. Trying HTTPS fallback..."
|
||||
git clone "https://github.com/${org}/${name}.git" "$target_dir" 2>/dev/null || {
|
||||
warn "Could not clone ${org}/${name}. SSH keys not set up? Skipping."
|
||||
continue
|
||||
}
|
||||
}
|
||||
ok "Cloned $org/$name → $target_dir"
|
||||
fi
|
||||
|
||||
# Install via uv if it has pyproject.toml
|
||||
if [ "$has_pyproject" = "true" ] && [ -f "$target_dir/pyproject.toml" ]; then
|
||||
info "Installing '$name' via uv tool..."
|
||||
# Try editable install from local path; fall back to non-editable
|
||||
uv tool install --editable "$target_dir" 2>/dev/null || \
|
||||
uv tool install "$target_dir" 2>/dev/null || \
|
||||
warn "uv tool install failed for '$name'. Check pyproject.toml."
|
||||
ok "'$name' installed via uv."
|
||||
fi
|
||||
done
|
||||
|
||||
# ---- Verify installations ----
|
||||
echo ""
|
||||
info "Verifying uv tool installations..."
|
||||
uv tool list 2>/dev/null || warn "No uv tools installed."
|
||||
|
||||
ok "Stage 06 complete: uv tools installed."
|
||||
Reference in New Issue
Block a user