initial commit

This commit is contained in:
2025-11-23 09:07:39 -08:00
commit e118a4eb44
21 changed files with 1551 additions and 0 deletions

134
scripts/apps.sh Executable file
View File

@@ -0,0 +1,134 @@
#!/usr/bin/env bash
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
source "$SCRIPT_DIR/../lib/common.sh"
source "$SCRIPT_DIR/../lib/package.sh"
log_info "Installing applications"
# VSCodium
if command_exists codium || command_exists code; then
log_success "VSCodium/VSCode already installed"
else
log_info "Installing VSCodium"
case "$OS_TYPE" in
macos)
install_cask vscodium
;;
debian)
wget -qO - https://gitlab.com/paulcarroty/vscodium-deb-rpm-repo/raw/master/pub.gpg \
| gpg --dearmor \
| maybe_sudo dd of=/usr/share/keyrings/vscodium-archive-keyring.gpg
echo 'deb [ signed-by=/usr/share/keyrings/vscodium-archive-keyring.gpg ] https://download.vscodium.com/debs vscodium main' \
| maybe_sudo tee /etc/apt/sources.list.d/vscodium.list
update_package_cache
install_package codium
;;
arch)
install_aur vscodium-bin
;;
esac
fi
# 1Password
if command_exists 1password || [ -d "/Applications/1Password.app" ] 2>/dev/null; then
log_success "1Password already installed"
else
log_info "Installing 1Password"
case "$OS_TYPE" in
macos)
install_cask 1password
;;
debian)
curl -sS https://downloads.1password.com/linux/keys/1password.asc | \
maybe_sudo gpg --dearmor --output /usr/share/keyrings/1password-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/1password-archive-keyring.gpg] https://downloads.1password.com/linux/debian/$(dpkg --print-architecture) stable main" | \
maybe_sudo tee /etc/apt/sources.list.d/1password.list
maybe_sudo mkdir -p /etc/debsig/policies/AC2D62742012EA22/
curl -sS https://downloads.1password.com/linux/debian/debsig/1password.pol | \
maybe_sudo tee /etc/debsig/policies/AC2D62742012EA22/1password.pol
maybe_sudo mkdir -p /usr/share/debsig/keyrings/AC2D62742012EA22
curl -sS https://downloads.1password.com/linux/keys/1password.asc | \
maybe_sudo gpg --dearmor --output /usr/share/debsig/keyrings/AC2D62742012EA22/debsig.gpg
update_package_cache
install_package 1password
;;
arch)
install_aur 1password
;;
esac
fi
# Obsidian
if command_exists obsidian || [ -d "/Applications/Obsidian.app" ] 2>/dev/null; then
log_success "Obsidian already installed"
else
log_info "Installing Obsidian"
case "$OS_TYPE" in
macos)
install_cask obsidian
;;
debian)
TEMP_DIR=$(mktemp -d)
cd "$TEMP_DIR"
wget -q "https://github.com/obsidianmd/obsidian-releases/releases/download/v1.5.3/obsidian_1.5.3_amd64.deb"
maybe_sudo dpkg -i obsidian_*.deb
maybe_sudo apt-get install -f -y
cd -
rm -rf "$TEMP_DIR"
;;
arch)
install_aur obsidian
;;
esac
fi
# Google Chrome
if command_exists google-chrome || command_exists google-chrome-stable || [ -d "/Applications/Google Chrome.app" ] 2>/dev/null; then
log_success "Google Chrome already installed"
else
log_info "Installing Google Chrome"
case "$OS_TYPE" in
macos)
install_cask google-chrome
;;
debian)
TEMP_DIR=$(mktemp -d)
cd "$TEMP_DIR"
wget -q https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
maybe_sudo dpkg -i google-chrome-stable_current_amd64.deb
maybe_sudo apt-get install -f -y
cd -
rm -rf "$TEMP_DIR"
;;
arch)
install_aur google-chrome
;;
esac
fi
# Todoist
if command_exists todoist || [ -d "/Applications/Todoist.app" ] 2>/dev/null; then
log_success "Todoist already installed"
else
log_info "Installing Todoist"
case "$OS_TYPE" in
macos)
install_cask todoist
;;
debian)
# Install via snap
if ! command_exists snap; then
log_info "Installing snapd"
maybe_sudo apt-get install -y snapd
fi
maybe_sudo snap install todoist
;;
arch)
install_aur todoist-appimage
;;
esac
fi
log_success "Applications installed"

66
scripts/golang.sh Executable file
View File

@@ -0,0 +1,66 @@
#!/usr/bin/env bash
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
source "$SCRIPT_DIR/../lib/common.sh"
GO_VERSION="1.23.3"
GO_INSTALL_DIR="/usr/local/go"
log_info "Installing Go ${GO_VERSION}"
if [ -d "$GO_INSTALL_DIR" ] && [ -f "$GO_INSTALL_DIR/bin/go" ]; then
CURRENT_VERSION=$($GO_INSTALL_DIR/bin/go version | awk '{print $3}' | sed 's/go//')
if [ "$CURRENT_VERSION" = "$GO_VERSION" ]; then
log_success "Go ${GO_VERSION} already installed"
exit 0
else
log_info "Upgrading Go from ${CURRENT_VERSION} to ${GO_VERSION}"
maybe_sudo rm -rf "$GO_INSTALL_DIR"
fi
fi
# Detect architecture
ARCH=$(uname -m)
case "$ARCH" in
x86_64)
GO_ARCH="amd64"
;;
aarch64|arm64)
GO_ARCH="arm64"
;;
*)
log_error "Unsupported architecture: $ARCH"
exit 1
;;
esac
# Detect OS
if is_macos; then
GO_OS="darwin"
else
GO_OS="linux"
fi
GO_TARBALL="go${GO_VERSION}.${GO_OS}-${GO_ARCH}.tar.gz"
GO_URL="https://go.dev/dl/${GO_TARBALL}"
log_info "Downloading Go from ${GO_URL}"
TEMP_DIR=$(mktemp -d)
cd "$TEMP_DIR"
if ! curl -fsSL -o "$GO_TARBALL" "$GO_URL"; then
log_error "Failed to download Go"
rm -rf "$TEMP_DIR"
exit 1
fi
log_info "Extracting Go to ${GO_INSTALL_DIR}"
maybe_sudo tar -C /usr/local -xzf "$GO_TARBALL"
cd -
rm -rf "$TEMP_DIR"
log_success "Go ${GO_VERSION} installed to ${GO_INSTALL_DIR}"
log_info "Add to PATH: export PATH=\$PATH:/usr/local/go/bin"

108
scripts/packages.sh Executable file
View File

@@ -0,0 +1,108 @@
#!/usr/bin/env bash
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
source "$SCRIPT_DIR/../lib/common.sh"
source "$SCRIPT_DIR/../lib/package.sh"
log_info "Installing packages"
# Essential packages
PACKAGES=(
"git"
"curl"
"wget"
"tmux"
"jq"
"fzf"
"ripgrep"
)
# Modern CLI tools
MODERN_TOOLS=(
"starship"
"zoxide"
"eza"
"fd"
"gh"
)
# Install essential packages
for pkg in "${PACKAGES[@]}"; do
if command_exists "$pkg" || command_exists "${pkg}find" 2>/dev/null; then
log_success "$pkg already installed"
else
log_info "Installing $pkg"
case "$pkg" in
fd)
install_package fd fd-find fd
;;
*)
install_package "$pkg"
;;
esac
fi
done
# Install modern tools
for tool in "${MODERN_TOOLS[@]}"; do
if command_exists "$tool"; then
log_success "$tool already installed"
continue
fi
log_info "Installing $tool"
case "$tool" in
starship)
if is_debian; then
curl -sS https://starship.rs/install.sh | sh -s -- -y
else
install_package starship
fi
;;
zoxide)
if is_debian && ! package_installed zoxide; then
install_cargo zoxide
else
install_package zoxide
fi
;;
eza)
if is_debian && ! package_installed eza; then
if command_exists exa; then
log_success "exa (predecessor) already installed"
else
install_cargo eza
fi
else
install_package eza
fi
;;
gh)
if is_debian && ! package_installed gh; then
maybe_sudo mkdir -p -m 755 /etc/apt/keyrings
wget -qO- https://cli.github.com/packages/githubcli-archive-keyring.gpg | maybe_sudo tee /etc/apt/keyrings/githubcli-archive-keyring.gpg > /dev/null
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main" | maybe_sudo tee /etc/apt/sources.list.d/github-cli.list > /dev/null
update_package_cache
fi
install_package gh gh github-cli
;;
*)
install_package "$tool"
;;
esac
done
# Install TPM (Tmux Plugin Manager)
TPM_DIR="${XDG_CONFIG_HOME:-$HOME/.config}/tmux/plugins/tpm"
if [ ! -d "$TPM_DIR" ]; then
log_info "Installing TPM (Tmux Plugin Manager)"
ensure_dir "$(dirname "$TPM_DIR")"
git clone https://github.com/tmux-plugins/tpm "$TPM_DIR"
log_success "TPM installed"
else
log_success "TPM already installed"
fi
log_success "All packages installed"

60
scripts/plan9port.sh Executable file
View File

@@ -0,0 +1,60 @@
#!/usr/bin/env bash
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
source "$SCRIPT_DIR/../lib/common.sh"
PLAN9_INSTALL_DIR="/usr/local/plan9"
log_info "Installing plan9port"
if [ -d "$PLAN9_INSTALL_DIR" ] && [ -f "$PLAN9_INSTALL_DIR/bin/9" ]; then
log_success "plan9port already installed at ${PLAN9_INSTALL_DIR}"
exit 0
fi
# Install build dependencies
log_info "Installing build dependencies"
if is_macos; then
# macOS needs Xcode Command Line Tools
if ! xcode-select -p >/dev/null 2>&1; then
log_error "Xcode Command Line Tools required. Run: xcode-select --install"
exit 1
fi
elif is_debian; then
maybe_sudo apt-get install -y build-essential libx11-dev libxt-dev libxext-dev libfontconfig1-dev
elif is_arch; then
maybe_sudo pacman -S --noconfirm --needed base-devel xorg-server-devel fontconfig
fi
log_info "Cloning plan9port repository"
TEMP_DIR=$(mktemp -d)
cd "$TEMP_DIR"
if ! git clone https://github.com/9fans/plan9port.git plan9; then
log_error "Failed to clone plan9port"
rm -rf "$TEMP_DIR"
exit 1
fi
cd plan9
log_info "Building plan9port (this may take a while)"
if ! ./INSTALL; then
log_error "Failed to build plan9port"
cd -
rm -rf "$TEMP_DIR"
exit 1
fi
log_info "Installing to ${PLAN9_INSTALL_DIR}"
cd ..
maybe_sudo mv plan9 "$PLAN9_INSTALL_DIR"
cd -
rm -rf "$TEMP_DIR"
log_success "plan9port installed to ${PLAN9_INSTALL_DIR}"
log_info "Add to environment:"
log_info " export PLAN9=${PLAN9_INSTALL_DIR}"
log_info " export PATH=\$PATH:\$PLAN9/bin"