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:
@@ -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; [
|
||||
|
||||
environment.systemPackages = lib.mkMerge [
|
||||
(lib.mkIf libvirt (with pkgs; [
|
||||
virt-manager
|
||||
qemu
|
||||
OVMF
|
||||
]))
|
||||
(lib.mkIf docker (with pkgs; [
|
||||
docker-compose
|
||||
]);
|
||||
]))
|
||||
];
|
||||
}
|
||||
|
||||
@@ -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`.
|
||||
|
||||
@@ -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