feat(installer): add software-profile multi-select
- Add select_profiles step with gum choose --no-limit - Implement state persistence and review for selected profiles - Map profiles to home.packages and system-level toggles (Docker, Steam) - Update generate_flake_config to emit profile-specific Nix snippets - Fix duplicate environment.systemPackages in virtualization.nix - Update ROADMAP.md
This commit is contained in:
@@ -39,6 +39,7 @@ LOCALE=""
|
||||
FORM_FACTOR=""
|
||||
HARDWARE_MODULES=""
|
||||
NOMARCHY_HW_OPTS=""
|
||||
SELECTED_PROFILES=""
|
||||
# "" = not yet answered; "true"/"false" set by configure_impermanence.
|
||||
ENABLE_IMPERMANENCE=""
|
||||
|
||||
@@ -95,7 +96,8 @@ save_state() {
|
||||
declare -p \
|
||||
TARGET_DRIVE USERNAME HOSTNAME TIMEZONE \
|
||||
KEYMAP_LAYOUT KEYMAP_VARIANT LOCALE FORM_FACTOR \
|
||||
ENABLE_IMPERMANENCE HARDWARE_MODULES NOMARCHY_HW_OPTS NOMARCHY_REV \
|
||||
ENABLE_IMPERMANENCE HARDWARE_MODULES NOMARCHY_HW_OPTS \
|
||||
SELECTED_PROFILES NOMARCHY_REV \
|
||||
> "$STATE_FILE"
|
||||
}
|
||||
|
||||
@@ -685,7 +687,41 @@ configure_impermanence() {
|
||||
}
|
||||
|
||||
# ============================================================================
|
||||
# STEP 8: REVIEW & CONFIRM
|
||||
# STEP 8: SOFTWARE PROFILES (OPTIONAL)
|
||||
# ============================================================================
|
||||
|
||||
select_profiles() {
|
||||
section "Software Profiles"
|
||||
|
||||
if [[ -n "$SELECTED_PROFILES" ]]; then
|
||||
success "Resumed selected profiles"
|
||||
return
|
||||
fi
|
||||
|
||||
info "Pick optional software profiles to include in your configuration."
|
||||
info "Multiple selection allowed (Space to select, Enter to confirm)."
|
||||
echo ""
|
||||
|
||||
SELECTED_PROFILES=$(nrun gum choose --no-limit --header "Select Profiles" \
|
||||
"Dev (VSCode, Git, Lazygit, Zed, Docker)" \
|
||||
"Gaming (Steam, Gamemode, Lutris, Heroic)" \
|
||||
"Office (LibreOffice, Thunderbird, Obsidian, Zotero)" \
|
||||
"Media (VLC, OBS Studio, GIMP, Inkscape, Spotify)" \
|
||||
"CLI Utils (ripgrep, fd, bat, eza, zoxide, fzf)")
|
||||
|
||||
if [[ -z "$SELECTED_PROFILES" ]]; then
|
||||
info "No profiles selected (minimal install)"
|
||||
else
|
||||
# Count selected profiles by number of lines
|
||||
local count
|
||||
count=$(echo "$SELECTED_PROFILES" | grep -c "^" || echo 0)
|
||||
success "Selected $count profile(s)"
|
||||
fi
|
||||
save_state
|
||||
}
|
||||
|
||||
# ============================================================================
|
||||
# STEP 9: REVIEW & CONFIRM
|
||||
# ============================================================================
|
||||
|
||||
review_configuration() {
|
||||
@@ -699,6 +735,7 @@ review_configuration() {
|
||||
echo " Timezone: $TIMEZONE"
|
||||
echo " Form factor: $FORM_FACTOR"
|
||||
echo " Impermanence: $ENABLE_IMPERMANENCE"
|
||||
echo " Profiles: ${SELECTED_PROFILES:-None}"
|
||||
echo " Nomarchy rev: ${NOMARCHY_REV:-main (unpinned)}"
|
||||
echo ""
|
||||
|
||||
@@ -897,6 +934,32 @@ generate_flake_config() {
|
||||
local impermanence_opt=""
|
||||
[[ "$ENABLE_IMPERMANENCE" == "true" ]] && impermanence_opt="nomarchy.system.impermanence.enable = true;"
|
||||
|
||||
local PROFILE_SYSTEM_OPTS=""
|
||||
local PROFILE_HOME_PACKAGES=""
|
||||
|
||||
while IFS= read -r profile; do
|
||||
[[ -z "$profile" ]] && continue
|
||||
case "$profile" in
|
||||
"Dev "*)
|
||||
PROFILE_SYSTEM_OPTS+=$'\n # Dev profile\n nomarchy.system.virtualization.docker.enable = true;'
|
||||
PROFILE_HOME_PACKAGES+=$'\n vscode\n zed-editor\n lazygit\n gh\n docker-compose'
|
||||
;;
|
||||
"Gaming "*)
|
||||
PROFILE_SYSTEM_OPTS+=$'\n # Gaming profile\n programs.steam.enable = true;\n programs.gamemode.enable = true;'
|
||||
PROFILE_HOME_PACKAGES+=$'\n steam\n lutris\n heroic'
|
||||
;;
|
||||
"Office "*)
|
||||
PROFILE_HOME_PACKAGES+=$'\n libreoffice\n thunderbird\n obsidian\n zotero'
|
||||
;;
|
||||
"Media "*)
|
||||
PROFILE_HOME_PACKAGES+=$'\n vlc\n obs-studio\n gimp\n inkscape\n spotify'
|
||||
;;
|
||||
"CLI Utils "*)
|
||||
PROFILE_HOME_PACKAGES+=$'\n ripgrep\n fd\n bat\n eza\n zoxide\n fzf'
|
||||
;;
|
||||
esac
|
||||
done <<< "$SELECTED_PROFILES"
|
||||
|
||||
# Pin the upstream Nomarchy flake to the exact commit we're installing
|
||||
# from so the first post-reboot `nixos-rebuild` doesn't silently pull a
|
||||
# newer main. Fall back to tracking main if we couldn't resolve a SHA.
|
||||
@@ -1009,6 +1072,7 @@ $xkb_variant_line
|
||||
nomarchy.system.formFactor = "$FORM_FACTOR";
|
||||
|
||||
$impermanence_opt
|
||||
$PROFILE_SYSTEM_OPTS
|
||||
|
||||
# Compressed RAM swap. Near-free memory headroom on small machines and
|
||||
# harmless on big ones — kernel only uses it under pressure. Disable if
|
||||
@@ -1116,6 +1180,7 @@ EOF
|
||||
btop # Resource monitor (TUI)
|
||||
fastfetch # System info at login
|
||||
chromium # Secondary browser
|
||||
$PROFILE_HOME_PACKAGES
|
||||
|
||||
# --- Editors & dev ---
|
||||
# vscode
|
||||
@@ -1234,6 +1299,7 @@ main() {
|
||||
select_hardware
|
||||
confirm_form_factor
|
||||
configure_impermanence
|
||||
select_profiles
|
||||
review_configuration
|
||||
execute_installation
|
||||
|
||||
|
||||
Reference in New Issue
Block a user