diff --git a/core/system/virtualization.nix b/core/system/virtualization.nix index 3b707a9..7680eab 100644 --- a/core/system/virtualization.nix +++ b/core/system/virtualization.nix @@ -19,15 +19,18 @@ in # `nomarchy.system.virtualization.libvirt.enable = true;`. The user must # be in the `libvirtd` group to drive virsh / virt-manager. virtualisation.libvirtd.enable = lib.mkIf libvirt true; - environment.systemPackages = lib.mkIf libvirt (with pkgs; [ - virt-manager - qemu - OVMF - ]); # Optional: Docker + docker-compose. virtualisation.docker.enable = lib.mkIf docker true; - environment.systemPackages = lib.mkIf docker (with pkgs; [ - docker-compose - ]); + + environment.systemPackages = lib.mkMerge [ + (lib.mkIf libvirt (with pkgs; [ + virt-manager + qemu + OVMF + ])) + (lib.mkIf docker (with pkgs; [ + docker-compose + ])) + ]; } diff --git a/docs/ROADMAP.md b/docs/ROADMAP.md index 2dc96d4..cb721f9 100644 --- a/docs/ROADMAP.md +++ b/docs/ROADMAP.md @@ -19,7 +19,6 @@ Guardrails (apply when adding anything): ### Now (ready to pick up) -- **Software-profile multi-select in the installer.** Carryover from the old TODO. Add a `gum choose --no-limit` step in `installer/install.sh` (between hardware and impermanence) for opt-in profiles (Dev, Gaming, Office, Media, …). Each profile maps to a list of `home.packages` and optional `nomarchy.system.*` toggles emitted into the generated `home.nix`/`system.nix`. - **Form-factor → laptop preset auto-enable.** When the installer writes `nomarchy.system.formFactor = "laptop"`, also flip on a yet-to-be-built laptop preset (TLP, brightness keys, lid handling). The option exists; the preset module doesn't. ### Next (bigger lifts that build on Now) @@ -127,6 +126,7 @@ Each PR description should reference the row(s) in `docs/SCRIPTS.md` it closes, (Move items here when they land — keep them brief, link the commit/PR.) +- _2026-04-25_ — Software-profile multi-select in the installer. Users can now pick Dev, Gaming, Office, Media, and CLI Utils profiles during install; logic emits corresponding `home.packages` and system toggles into the generated config. - _2026-04-25_ — Pillar 3 Phase B: script & menu audit. Ported/implemented/stubbed ~40 scripts including `nomarchy-version`, `nomarchy-debug`, `nomarchy-reinstall`, `nomarchy-rollback`, `nomarchy-update-firmware`, `nomarchy-pkg-*`, and `nomarchy-theme-*` wrappers. Moved desktop scripts to packaged utility directory. - _2026-04-25_ — Docker & fwupd support. Added `nomarchy.system.virtualization.docker.enable` and `nomarchy.hardware.fwupd` options. Wires system services and adds `docker-compose` and `fwupdmgr` to PATH. - _2026-04-25_ — Installer VM testing. Added `installerVm` to flake nixosConfigurations, packages, and apps. `nomarchy-test-installer` now uses `nix run .#installerVm`. diff --git a/installer/install.sh b/installer/install.sh index 990e6bc..e396cf5 100755 --- a/installer/install.sh +++ b/installer/install.sh @@ -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