refactor: centralize workstation HM base and derive terminal from user metadata

This commit is contained in:
2026-04-21 22:10:11 +02:00
parent d252de8a3a
commit 055a139fd2
13 changed files with 213 additions and 66 deletions
+5 -1
View File
@@ -1,3 +1,7 @@
{
lib,
terminalPackage,
}:
{ {
settingsVersion = 53; settingsVersion = 53;
bar = { bar = {
@@ -255,7 +259,7 @@
pinnedApps = [ ]; pinnedApps = [ ];
useApp2Unit = false; useApp2Unit = false;
sortByMostUsed = true; sortByMostUsed = true;
terminalCommand = "kitty -e"; terminalCommand = "${lib.getExe terminalPackage} -e";
customLaunchPrefixEnabled = false; customLaunchPrefixEnabled = false;
customLaunchPrefix = ""; customLaunchPrefix = "";
viewMode = "grid"; viewMode = "grid";
-18
View File
@@ -1,18 +0,0 @@
{ config, ... }:
let
homeModules = config.flake.modules.homeManager;
in
{
flake.modules.homeManager.cli-base = {
imports = [
homeModules.terminal
homeModules.shell
homeModules.neovim
homeModules.nh
homeModules.git
homeModules.dev-tools
homeModules.podman
homeModules.ai
];
};
}
+1 -8
View File
@@ -4,13 +4,6 @@ let
in in
{ {
flake.modules.homeManager.ergon-workstation = { flake.modules.homeManager.ergon-workstation = {
imports = [ imports = [ homeModules.workstation-base ];
homeModules.cli-base
homeModules.desktop-session
homeModules.personal-productivity
homeModules.ssh-client
homeModules.sops
homeModules.nix
];
}; };
} }
-12
View File
@@ -1,12 +0,0 @@
{ config, ... }:
let
homeModules = config.flake.modules.homeManager;
in
{
flake.modules.homeManager.kiri-server = {
imports = [
homeModules.cli-base
homeModules.syncthing
];
};
}
+1 -6
View File
@@ -5,12 +5,7 @@ in
{ {
flake.modules.homeManager.kiri-workstation = { flake.modules.homeManager.kiri-workstation = {
imports = [ imports = [
homeModules.cli-base homeModules.workstation-base
homeModules.desktop-session
homeModules.personal-productivity
homeModules.ssh-client
homeModules.sops
homeModules.nix
homeModules.syncthing homeModules.syncthing
homeModules.qbittorrent-client homeModules.qbittorrent-client
]; ];
+4
View File
@@ -35,6 +35,10 @@ let
type = lib.types.str; type = lib.types.str;
}; };
terminalPackageAttr = lib.mkOption {
type = lib.types.str;
};
nixosConfigurationPath = lib.mkOption { nixosConfigurationPath = lib.mkOption {
type = lib.types.str; type = lib.types.str;
default = "${config.homeDirectory}/.config/nixos"; default = "${config.homeDirectory}/.config/nixos";
+5 -1
View File
@@ -1,6 +1,10 @@
{
lib,
terminalPackage,
}:
{ {
"Mod+Return" = { "Mod+Return" = {
action.spawn = "kitty"; action.spawn = "${lib.getExe terminalPackage}";
hotkey-overlay.title = "Terminal"; hotkey-overlay.title = "Terminal";
}; };
"Mod+B" = { "Mod+B" = {
+29 -1
View File
@@ -41,8 +41,27 @@
inherit (display) mode; inherit (display) mode;
} }
) config.meta.host.displays; ) config.meta.host.displays;
rawTerminalAttrPath = lib.splitString "." config.meta.user.terminalPackageAttr;
terminalAttrPath =
if rawTerminalAttrPath != [ ] && builtins.head rawTerminalAttrPath == "pkgs" then
builtins.tail rawTerminalAttrPath
else
rawTerminalAttrPath;
terminalPackage = lib.attrByPath terminalAttrPath null pkgs;
hasMainProgram = terminalPackage != null && terminalPackage ? meta.mainProgram;
in in
{ {
assertions = [
{
assertion = terminalPackage != null;
message = "Unknown terminal package `${config.meta.user.terminalPackageAttr}` for user `${config.meta.user.name}`.";
}
{
assertion = hasMainProgram;
message = "Terminal package `${config.meta.user.terminalPackageAttr}` must define `meta.mainProgram`.";
}
];
home.sessionVariables.NIXOS_OZONE_WL = "1"; home.sessionVariables.NIXOS_OZONE_WL = "1";
dconf.settings = { dconf.settings = {
@@ -123,7 +142,16 @@
mouse.accel-speed = 0.4; mouse.accel-speed = 0.4;
}; };
binds = import ./_bindings.nix; binds =
if hasMainProgram then
import ./_bindings.nix {
inherit
lib
terminalPackage
;
}
else
{ };
}; };
}; };
} }
+74 -13
View File
@@ -5,26 +5,59 @@
}: }:
let let
homeModules = config.flake.modules.homeManager; homeModules = config.flake.modules.homeManager;
baseSettings = import ./_noctalia-config.nix; mkPortableSettings =
portableSettings = lib.recursiveUpdate baseSettings { baseSettings:
bar.widgets.right = baseSettings.bar.widgets.right ++ [ lib.recursiveUpdate baseSettings {
{ bar.widgets.right = baseSettings.bar.widgets.right ++ [
id = "Battery"; {
} id = "Battery";
]; }
}; ];
};
in in
{ {
flake.modules.homeManager.noctalia = flake.modules.homeManager.noctalia =
{ {
inputs, inputs,
config,
lib, lib,
pkgs, pkgs,
... ...
}: }:
let
rawTerminalAttrPath = lib.splitString "." config.meta.user.terminalPackageAttr;
terminalAttrPath =
if rawTerminalAttrPath != [ ] && builtins.head rawTerminalAttrPath == "pkgs" then
builtins.tail rawTerminalAttrPath
else
rawTerminalAttrPath;
terminalPackage = lib.attrByPath terminalAttrPath null pkgs;
hasMainProgram = terminalPackage != null && terminalPackage ? meta.mainProgram;
baseSettings =
if hasMainProgram then
import ./_noctalia-config.nix {
inherit
lib
terminalPackage
;
}
else
{ };
in
{ {
imports = [ inputs.noctalia.homeModules.default ]; imports = [ inputs.noctalia.homeModules.default ];
assertions = [
{
assertion = terminalPackage != null;
message = "Unknown terminal package `${config.meta.user.terminalPackageAttr}` for user `${config.meta.user.name}`.";
}
{
assertion = hasMainProgram;
message = "Terminal package `${config.meta.user.terminalPackageAttr}` must define `meta.mainProgram`.";
}
];
programs.noctalia-shell = { programs.noctalia-shell = {
enable = true; enable = true;
package = lib.mkForce ( package = lib.mkForce (
@@ -37,9 +70,37 @@ in
}; };
}; };
flake.modules.homeManager.noctalia-portable = { flake.modules.homeManager.noctalia-portable =
imports = [ homeModules.noctalia ]; {
config,
programs.noctalia-shell.settings = lib.mkForce portableSettings; lib,
}; pkgs,
...
}:
let
rawTerminalAttrPath = lib.splitString "." config.meta.user.terminalPackageAttr;
terminalAttrPath =
if rawTerminalAttrPath != [ ] && builtins.head rawTerminalAttrPath == "pkgs" then
builtins.tail rawTerminalAttrPath
else
rawTerminalAttrPath;
terminalPackage = lib.attrByPath terminalAttrPath null pkgs;
hasMainProgram = terminalPackage != null && terminalPackage ? meta.mainProgram;
baseSettings =
if hasMainProgram then
import ./_noctalia-config.nix {
inherit
lib
terminalPackage
;
}
else
{ };
in
{
imports = [ homeModules.noctalia ];
programs.noctalia-shell.settings = lib.mkForce (
if hasMainProgram then mkPortableSettings baseSettings else { }
);
};
} }
+39 -2
View File
@@ -1,10 +1,47 @@
{ {
flake.modules.homeManager.terminal = flake.modules.homeManager.terminal =
{ pkgs, ... }:
{ {
config,
lib,
pkgs,
...
}:
let
rawTerminalAttrPath = lib.splitString "." config.meta.user.terminalPackageAttr;
terminalAttrPath =
if rawTerminalAttrPath != [ ] && builtins.head rawTerminalAttrPath == "pkgs" then
builtins.tail rawTerminalAttrPath
else
rawTerminalAttrPath;
terminalPackage = lib.attrByPath terminalAttrPath null pkgs;
hasTerminalPackage = terminalPackage != null;
hasMainProgram = hasTerminalPackage && terminalPackage ? meta.mainProgram;
terminalDesktopId =
if hasMainProgram then "${terminalPackage.meta.mainProgram}.desktop" else null;
in
{
assertions = [
{
assertion = hasTerminalPackage;
message = "Unknown terminal package `${config.meta.user.terminalPackageAttr}` for user `${config.meta.user.name}`.";
}
{
assertion = hasMainProgram;
message = "Terminal package `${config.meta.user.terminalPackageAttr}` must define `meta.mainProgram`.";
}
{
assertion = hasMainProgram && builtins.pathExists "${terminalPackage}/share/applications/${terminalDesktopId}";
message = "Terminal package `${config.meta.user.terminalPackageAttr}` must provide `${terminalDesktopId}`.";
}
{
assertion = hasMainProgram && terminalPackage.meta.mainProgram == "kitty";
message = "The terminal feature currently only supports kitty-specific Home Manager configuration.";
}
];
xdg.terminal-exec = { xdg.terminal-exec = {
enable = true; enable = true;
settings.default = [ "kitty.desktop" ]; settings.default = lib.optional (terminalDesktopId != null) terminalDesktopId;
}; };
programs.kitty = { programs.kitty = {
+19
View File
@@ -1,6 +1,7 @@
{ config, ... }: { config, ... }:
let let
nixosModules = config.flake.modules.nixos; nixosModules = config.flake.modules.nixos;
homeModules = config.flake.modules.homeManager;
in in
{ {
flake.modules.nixos.workstation-base = { flake.modules.nixos.workstation-base = {
@@ -26,4 +27,22 @@ in
programs.nix-ld.enable = true; programs.nix-ld.enable = true;
environment.localBinInPath = true; environment.localBinInPath = true;
}; };
flake.modules.homeManager.workstation-base = {
imports = [
homeModules.terminal
homeModules.shell
homeModules.neovim
homeModules.nh
homeModules.git
homeModules.dev-tools
homeModules.podman
homeModules.ai
homeModules.desktop-session
homeModules.personal-productivity
homeModules.ssh-client
homeModules.sops
homeModules.nix
];
};
} }
+34 -4
View File
@@ -10,8 +10,33 @@ let
in in
{ {
flake.modules.nixos.orion-admin = flake.modules.nixos.orion-admin =
{ pkgs, ... }:
{ {
config,
lib,
pkgs,
...
}:
let
rawTerminalAttrPath = lib.splitString "." config.meta.host.users.kiri.terminalPackageAttr;
terminalAttrPath =
if rawTerminalAttrPath != [ ] && builtins.head rawTerminalAttrPath == "pkgs" then
builtins.tail rawTerminalAttrPath
else
rawTerminalAttrPath;
terminalPackage = lib.attrByPath terminalAttrPath null pkgs;
in
{
assertions = [
{
assertion = terminalPackage != null;
message = "Unknown terminal package `${config.meta.host.users.kiri.terminalPackageAttr}` for user `kiri`.";
}
{
assertion = terminalPackage != null && lib.elem "terminfo" terminalPackage.outputs;
message = "Terminal package `${config.meta.host.users.kiri.terminalPackageAttr}` must provide a `terminfo` output for `orion`.";
}
];
users.users.kiri = { users.users.kiri = {
linger = true; linger = true;
openssh.authorizedKeys.keys = [ openssh.authorizedKeys.keys = [
@@ -20,8 +45,9 @@ in
}; };
environment.systemPackages = [ environment.systemPackages = [
pkgs.kitty ] ++ lib.optional (terminalPackage != null && lib.elem "terminfo" terminalPackage.outputs) (
]; lib.getOutput "terminfo" terminalPackage
);
}; };
flake.modules.nixos.orion = metaLib.mkHost { flake.modules.nixos.orion = metaLib.mkHost {
@@ -45,7 +71,11 @@ in
(metaLib.mkHostUser { (metaLib.mkHostUser {
account = metaLib.users.kiri; account = metaLib.users.kiri;
needsPassword = false; needsPassword = false;
homeImports = [ homeModules.kiri-server ]; homeImports = [
homeModules.shell
homeModules.git
homeModules.syncthing
];
}) })
./_hardware.nix ./_hardware.nix
./_disk.nix ./_disk.nix
+2
View File
@@ -4,6 +4,7 @@ let
name = "kiri"; name = "kiri";
realName = "Jelle Spreeuwenberg"; realName = "Jelle Spreeuwenberg";
homeDirectory = "/home/kiri"; homeDirectory = "/home/kiri";
terminalPackageAttr = "kitty";
emails = { emails = {
main = { main = {
address = "mail@jelles.net"; address = "mail@jelles.net";
@@ -32,6 +33,7 @@ let
name = "ergon"; name = "ergon";
realName = "Jelle Spreeuwenberg"; realName = "Jelle Spreeuwenberg";
homeDirectory = "/home/ergon"; homeDirectory = "/home/ergon";
terminalPackageAttr = "kitty";
emails = { emails = {
work = { work = {
address = "jelle.spreeuwenberg@yookr.org"; address = "jelle.spreeuwenberg@yookr.org";