set shell := ["bash", "-c"] git := "true" flake := "true" flatpak := "true" # Show this interactive menu default: @just --choose _git-sync: @if [ -n "$(git status --porcelain)" ]; then \ if git status --porcelain | grep -q "flake.lock"; then \ echo ">> flake.lock is dirty. Resetting to avoid pull conflicts..."; \ git checkout flake.lock; \ fi; \ if [ -n "$(git status --porcelain)" ]; then \ echo ">> Stashing remaining local changes..."; \ git stash; \ git pull --ff-only --recurse-submodules; \ git submodule update --remote --recursive; \ git stash pop; \ else \ git pull --ff-only --recurse-submodules; \ git submodule update --remote --recursive; \ fi; \ else \ git pull --ff-only --recurse-submodules; \ git submodule update --remote --recursive; \ fi _flake-update: nix flake update # Safely commit the lockfile changes commit-lock: git add flake.lock git commit -m "chore: update flake.lock" || echo "No changes to commit" # Sync git and update flake inputs (override with git=false or flake=false) prebuild: @if [ "{{git}}" == "true" ]; then \ echo ">> Syncing Git..."; \ just _git-sync; \ fi @if [ "{{flake}}" == "true" ]; then \ echo ">> Updating Flake..."; \ just _flake-update; \ fi _update-root: @if [ -f /etc/NIXOS ] && grep -q "nixos" /etc/os-release 2>/dev/null; then \ sudo nixos-rebuild switch --flake .?submodules=1#$(hostname); \ fi # Rebuild and switch NixOS system configuration update-root: prebuild _update-root # Install Home Manager standalone (useful for initial non-NixOS setup) install-home: home-manager switch --flake .?submodules=1#$(whoami)@core \ --extra-experimental-features nix-command \ --extra-experimental-features flakes _update-home: home-manager switch --flake .?submodules=1#$(whoami)@$(hostname) \ || home-manager switch --flake .?submodules=1#$(whoami)@core # Rebuild and switch Home Manager configuration update-home: prebuild _update-home # Quick update skipping git and flake syncs quick-update: just git=false flake=false update # Update the system without fetching the latest git commits nogit-update: just git=false update # Update and clean up Flatpak packages update-flatpaks: @if [ "{{flatpak}}" == "true" ] && command -v flatpak &> /dev/null; then \ echo ">> Updating Flatpaks..."; \ flatpak update -y; \ flatpak uninstall --unused -y; \ else \ echo ">> Flatpak not found or disabled. Skipping."; \ fi # View the 5 most recent NixOS and Home Manager generations history: @echo ">> System Generations:" @nix-env -p /nix/var/nix/profiles/system --list-generations | tail -n 5 @echo "\n>> Home Manager Generations:" @home-manager generations | head -n 5 # Open a Nix REPL loaded with the current flake repl: nix repl --file flake.nix # Fully update the system, home-manager, and flatpaks update: prebuild _update-root _update-home update-flatpaks # Preview system changes without activating them dry-run: prebuild sudo nixos-rebuild dry-activate --flake .?submodules=1#$(hostname) # Run Nix and Flatpak garbage collection. Optionally specify age (e.g., 'just cleanup 7d') cleanup days="": @if [ -n "{{days}}" ]; then \ echo ">> Deleting system generations older than {{days}}..."; \ sudo nix-collect-garbage --delete-older-than {{days}}; \ fi @echo ">> Cleaning Nix Store..." nix-store --gc nix-store --optimise @if command -v flatpak &> /dev/null; then \ echo ">> Cleaning unused Flatpaks..."; \ flatpak uninstall --unused -y; \ fi # Open the editor (nvim, yazi, or heh) for a target edit target: @direnv exec . scripts/edit.py "{{target}}" # Edit packages.nix for a specific system/user (run 'just packages help' for flags) packages *flags: @direnv exec . scripts/packages.bb {{flags}} # Bootstrap a fresh system from the repo bootstrap: @direnv exec . scripts/bootstrap.py