diff --git a/home/coding/editor/neovim.nix b/home/coding/editor/neovim.nix index 9c555c4..79c101e 100644 --- a/home/coding/editor/neovim.nix +++ b/home/coding/editor/neovim.nix @@ -1,17 +1,7 @@ # NeoVim base configuration via m3ta-nixpkgs coding.editors module. -{ - config, - lib, - ... -}: -with lib; let - cfg = config.coding.editors.neovim; -in { - # coding.editors.neovim is provided by inputs.m3ta-nixpkgs.homeManagerModules.default - options.coding.editors.neovim.enable = mkEnableOption "enable NeoVim editor"; - - config = mkIf cfg.enable { - # NeoVim configuration is managed by the m3ta-nixpkgs coding.editors module. - # Additional host-specific overrides can be added here. - }; +# The option `coding.editors.neovim.enable` is declared by +# inputs.m3ta-nixpkgs.homeManagerModules.default — no re-declaration here. +{...}: { + # Placeholder for host-agnostic NeoVim overrides. + # Set coding.editors.neovim.enable = true in per-host files to activate. } diff --git a/home/coding/lsp/servers.nix b/home/coding/lsp/servers.nix index 935855e..0e01947 100644 --- a/home/coding/lsp/servers.nix +++ b/home/coding/lsp/servers.nix @@ -15,7 +15,7 @@ in { # Nix nixd # General - nodePackages.typescript-language-server + typescript-language-server tailwindcss-language-server ]; }; diff --git a/home/desktop/theme/wallpapers.nix b/home/desktop/theme/wallpapers.nix index 2b8617d..bcf6c34 100644 --- a/home/desktop/theme/wallpapers.nix +++ b/home/desktop/theme/wallpapers.nix @@ -12,7 +12,7 @@ in { config = mkIf cfg { xdg.configFile."hypr/wallpapers" = { # Wallpapers are stored relative to the home/m3tam3re directory. - source = ../../../m3tam3re/wallpapers; + source = ../../m3tam3re/wallpapers; recursive = true; }; }; diff --git a/home/lib/default.nix b/home/lib/default.nix new file mode 100644 index 0000000..d527a28 --- /dev/null +++ b/home/lib/default.nix @@ -0,0 +1,81 @@ +# home/lib/default.nix +# Profile loading utilities for home-manager configurations. +# +# Usage: +# let homeLib = import ../lib { inherit lib; }; +# in { +# imports = [ +# (homeLib.mkHomeConfig { profiles = ["coding" "gaming"]; context = "desktop"; }) +# ]; +# } +{ lib }: + +let + inherit (lib) optional; + + # Infrastructure layer — nixpkgs overlays, nix-colors, m3ta-nixpkgs modules. + # Always loaded on every host. + commonModule = ../common; + + # Base user environment — shell (nushell, starship), CLI tools, secrets. + # Always loaded on every host. + baseModule = ../base; + + # Context-specific modules — desktop and server are mutually exclusive. + contextModuleMap = { + desktop = ../desktop; + server = ../server; + }; + + # Profile modules — freely combinable additions on top of base + context. + profileModuleMap = { + coding = ../coding; + gaming = ../profiles/gaming; + media = ../profiles/media; + }; + +in { + # Generate a home-manager module with imports based on profiles and context. + # + # Args: + # profiles: list of profile names (e.g. ["coding" "gaming" "media"]) + # context: host context, one of "desktop" | "server" | null + # + # Returns: a home-manager module attrset with imports and assertions. + # Desktop and server contexts are mutually exclusive by design — passing + # any value other than "desktop", "server", or null causes an assertion + # failure at evaluation time. + mkHomeConfig = { + profiles ? [], + context ? null, + }: + let + contextImport = + if context == "desktop" then [ contextModuleMap.desktop ] + else if context == "server" then [ contextModuleMap.server ] + else []; + + activeProfiles = builtins.filter + (profileName: builtins.hasAttr profileName profileModuleMap) + profiles; + + profileImports = map (profileName: profileModuleMap.${profileName}) activeProfiles; + + contextStr = if context == null then "null" else context; + + in { + imports = + [ commonModule baseModule ] + ++ contextImport + ++ profileImports; + + assertions = [ + { + assertion = builtins.elem context [ "desktop" "server" null ]; + message = + "m3ta home: context must be 'desktop', 'server', or null" + + " (got: '${contextStr}')"; + } + ]; + }; +} diff --git a/home/m3tam3re/m3-aether.nix b/home/m3tam3re/m3-aether.nix index 0f6c41d..510fbb5 100644 --- a/home/m3tam3re/m3-aether.nix +++ b/home/m3tam3re/m3-aether.nix @@ -1,17 +1,33 @@ +# m3-aether — cloud VM. +# Context: server | Profiles: (none) { + lib, + ... +}: +let + homeLib = import ../lib { inherit lib; }; +in { imports = [ - ../common - ../features/cli + (homeLib.mkHomeConfig { + profiles = [ ]; + context = "server"; + }) ./home-server.nix + # Fish shell — no equivalent in new base module yet + ../features/cli/fish.nix ]; - features = { - cli = { - fish.enable = true; - fzf.enable = true; - nitch.enable = true; - secrets.enable = false; + # Base CLI tools (new namespace) + base = { + shell = { starship.enable = true; }; + cliTools = { + fzf.enable = true; + nitch.enable = true; + }; }; + + # Fish shell (legacy — no new equivalent yet) + features.cli.fish.enable = true; } diff --git a/home/m3tam3re/m3-ares.nix b/home/m3tam3re/m3-ares.nix index 43f03dd..9e2b0aa 100644 --- a/home/m3tam3re/m3-ares.nix +++ b/home/m3tam3re/m3-ares.nix @@ -1,74 +1,115 @@ +# m3-ares — TUXEDO laptop desktop workstation. +# Context: desktop | Profiles: coding, gaming, media { config, lib, ... }: +let + homeLib = import ../lib { inherit lib; }; +in with lib; { imports = [ - ../common + (homeLib.mkHomeConfig { + profiles = [ "coding" "gaming" "media" ]; + context = "desktop"; + }) ./home.nix - ../features/cli - ../features/coding - ../features/desktop + # Fish shell — no equivalent in new base module yet + ../features/cli/fish.nix ]; config = mkMerge [ { + # Base CLI tools (new namespace) + base = { + shell = { + nushell.enable = true; + starship.enable = true; + }; + cliTools = { + fzf.enable = true; + nitch.enable = true; + television.enable = true; + }; + secrets.enable = true; + }; + + # Fish shell (legacy — features namespace, no new equivalent yet) + features.cli.fish.enable = true; + + # Desktop features (new namespace) + desktop = { + wm = { + hyprland.enable = true; + rofi.enable = true; + wayland.enable = true; + }; + apps = { + crypto.enable = true; + obsidian.enable = true; + office.enable = true; + }; + theme = { + fonts.enable = true; + wallpapers.enable = true; + }; + }; + + # Coding environment + coding = { + editors = { + neovim.enable = true; + zed.enable = true; + }; + lsp.enable = true; + }; + + # Gaming profile features + profiles.gaming = { + steam.enable = true; + gamescope.enable = true; + }; + + # Media profile features + profiles.media = { + obs.enable = true; + ffmpeg.enable = true; + kdenlive.enable = true; + ytDlp.enable = true; + }; + xdg = { - # TODO: better structure enable = true; configFile."mimeapps.list".force = true; mimeApps = { enable = true; associations.added = { - "application/zip" = ["org.gnome.FileRoller.desktop"]; - "application/csv" = ["calc.desktop"]; - "application/pdf" = ["vivaldi-stable.desktop"]; - "x-scheme-handler/http" = ["vivaldi-stable.desktop"]; - "x-scheme-handler/https" = ["vivaldi-stable.desktop"]; + "application/zip" = [ "org.gnome.FileRoller.desktop" ]; + "application/csv" = [ "calc.desktop" ]; + "application/pdf" = [ "vivaldi-stable.desktop" ]; + "x-scheme-handler/http" = [ "vivaldi-stable.desktop" ]; + "x-scheme-handler/https" = [ "vivaldi-stable.desktop" ]; }; defaultApplications = { - "application/zip" = ["org.gnome.FileRoller.desktop"]; - "application/csv" = ["calc.desktop"]; - "application/pdf" = ["vivaldi-stable.desktop"]; - "application/md" = ["dev.zed.Zed.desktop"]; - "application/text" = ["dev.zed.Zed.desktop"]; - "x-scheme-handler/http" = ["vivaldi-stable.desktop"]; - "x-scheme-handler/https" = ["vivaldi-stable.desktop"]; + "application/zip" = [ "org.gnome.FileRoller.desktop" ]; + "application/csv" = [ "calc.desktop" ]; + "application/pdf" = [ "vivaldi-stable.desktop" ]; + "application/md" = [ "dev.zed.Zed.desktop" ]; + "application/text" = [ "dev.zed.Zed.desktop" ]; + "x-scheme-handler/http" = [ "vivaldi-stable.desktop" ]; + "x-scheme-handler/https" = [ "vivaldi-stable.desktop" ]; }; }; }; - features = { - cli = { - fish.enable = true; - nushell.enable = true; - fzf.enable = true; - nitch.enable = true; - secrets.enable = true; - starship.enable = true; - television.enable = true; - }; - desktop = { - coding.enable = true; - crypto.enable = true; - gaming.enable = true; - hyprland.enable = true; - media.enable = true; - obsidian.enable = true; - office.enable = true; - rofi.enable = true; - fonts.enable = true; - wayland.enable = true; - wallpapers = true; - }; - }; } - (mkIf config.features.desktop.hyprland.enable { + # Host-specific Hyprland monitor and workspace layout + (mkIf config.desktop.wm.hyprland.enable { wayland.windowManager.hyprland = { enable = true; settings = { - exec-once = ["tuxedo-backlight"]; + exec-once = [ "tuxedo-backlight" ]; monitor = [ "eDP-1,preferred,0x0,1.25" "HDMI-A-1,1920x1080@120,2560x0,1" diff --git a/home/m3tam3re/m3-atlas.nix b/home/m3tam3re/m3-atlas.nix index 1738953..161798f 100644 --- a/home/m3tam3re/m3-atlas.nix +++ b/home/m3tam3re/m3-atlas.nix @@ -1,19 +1,33 @@ +# m3-atlas — primary server, Traefik hub and container host. +# Context: server | Profiles: coding { + lib, + ... +}: +let + homeLib = import ../lib { inherit lib; }; +in { imports = [ - ../common - ../features/cli - ../features/coding/opencode.nix + (homeLib.mkHomeConfig { + profiles = [ "coding" ]; + context = "server"; + }) ./home-server.nix ]; - coding.editors.neovim.enable = true; - features = { - cli = { + + # Base CLI tools (new namespace) + base = { + shell = { nushell.enable = true; + starship.enable = true; + }; + cliTools = { fzf.enable = true; nitch.enable = true; - secrets.enable = false; - starship.enable = true; zellij.enable = true; }; }; + + # Coding environment + coding.editors.neovim.enable = true; } diff --git a/home/m3tam3re/m3-daedalus.nix b/home/m3tam3re/m3-daedalus.nix index 370ca5d..f97209c 100644 --- a/home/m3tam3re/m3-daedalus.nix +++ b/home/m3tam3re/m3-daedalus.nix @@ -1,74 +1,105 @@ +# m3-daedalus — portable laptop (standalone home-manager). +# Context: desktop | Profiles: coding, media { config, lib, ... }: -with lib; let - cfg = config.features.desktop.hyprland; -in { +let + homeLib = import ../lib { inherit lib; }; +in +with lib; { imports = [ - ../common + (homeLib.mkHomeConfig { + profiles = [ "coding" "media" ]; + context = "desktop"; + }) ./home.nix - ../features/cli - ../features/coding - ../features/desktop - #./services/librechat.nix + # Fish shell — no equivalent in new base module yet + ../features/cli/fish.nix ]; - options.features.desktop.hyprland.enable = - mkEnableOption "enable Hyprland"; - config = mkMerge [ - # Base configuration { + # Base CLI tools (new namespace) + base = { + shell = { + nushell.enable = true; + starship.enable = true; + }; + cliTools = { + fzf.enable = true; + nitch.enable = true; + television.enable = true; + }; + secrets.enable = true; + }; + + # Fish shell (legacy — no new equivalent yet) + features.cli.fish.enable = true; + + # Desktop features (new namespace) + desktop = { + wm = { + hyprland.enable = false; + rofi.enable = true; + wayland.enable = false; + }; + apps = { + obsidian.enable = true; + office.enable = false; + crypto.enable = false; + }; + theme = { + fonts.enable = true; + wallpapers.enable = false; + }; + }; + + # Coding environment + coding = { + editors = { + neovim.enable = true; + zed.enable = true; + }; + lsp.enable = true; + }; + + # Media profile features + profiles.media = { + obs.enable = false; + ffmpeg.enable = false; + kdenlive.enable = false; + ytDlp.enable = true; + }; + xdg = { - # TODO: better structure enable = true; configFile."mimeapps.list".force = true; mimeApps = { enable = true; associations.added = { - "application/zip" = ["org.gnome.FileRoller.desktop"]; - "application/csv" = ["calc.desktop"]; - "application/pdf" = ["vivaldi-stable.desktop"]; - "x-scheme-handler/http" = ["vivaldi-stable.desktop"]; - "x-scheme-handler/https" = ["vivaldi-stable.desktop"]; + "application/zip" = [ "org.gnome.FileRoller.desktop" ]; + "application/csv" = [ "calc.desktop" ]; + "application/pdf" = [ "vivaldi-stable.desktop" ]; + "x-scheme-handler/http" = [ "vivaldi-stable.desktop" ]; + "x-scheme-handler/https" = [ "vivaldi-stable.desktop" ]; }; defaultApplications = { - "application/zip" = ["org.gnome.FileRoller.desktop"]; - "application/csv" = ["calc.desktop"]; - "application/pdf" = ["vivaldi-stable.desktop"]; - "application/md" = ["dev.zed.Zed.desktop"]; - "application/text" = ["dev.zed.Zed.desktop"]; - "x-scheme-handler/http" = ["vivaldi-stable.desktop"]; - "x-scheme-handler/https" = ["vivaldi-stable.desktop"]; + "application/zip" = [ "org.gnome.FileRoller.desktop" ]; + "application/csv" = [ "calc.desktop" ]; + "application/pdf" = [ "vivaldi-stable.desktop" ]; + "application/md" = [ "dev.zed.Zed.desktop" ]; + "application/text" = [ "dev.zed.Zed.desktop" ]; + "x-scheme-handler/http" = [ "vivaldi-stable.desktop" ]; + "x-scheme-handler/https" = [ "vivaldi-stable.desktop" ]; }; }; }; - features = { - cli = { - fish.enable = true; - nushell.enable = true; - fzf.enable = true; - nitch.enable = true; - secrets.enable = true; - starship.enable = true; - }; - desktop = { - coding.enable = true; - crypto.enable = false; - gaming.enable = false; - hyprland.enable = false; - media.enable = true; - office.enable = false; - rofi.enable = true; - fonts.enable = true; - wayland.enable = false; - }; - }; } - (mkIf cfg.enable { + # Host-specific Hyprland layout — only applies when hyprland is enabled + (mkIf config.desktop.wm.hyprland.enable { wayland.windowManager.hyprland = { enable = true; settings = { diff --git a/home/m3tam3re/m3-helios.nix b/home/m3tam3re/m3-helios.nix index 0f6c41d..27f6b41 100644 --- a/home/m3tam3re/m3-helios.nix +++ b/home/m3tam3re/m3-helios.nix @@ -1,17 +1,33 @@ +# m3-helios — AdGuard DNS and internal routing server. +# Context: server | Profiles: (none) { + lib, + ... +}: +let + homeLib = import ../lib { inherit lib; }; +in { imports = [ - ../common - ../features/cli + (homeLib.mkHomeConfig { + profiles = [ ]; + context = "server"; + }) ./home-server.nix + # Fish shell — no equivalent in new base module yet + ../features/cli/fish.nix ]; - features = { - cli = { - fish.enable = true; - fzf.enable = true; - nitch.enable = true; - secrets.enable = false; + # Base CLI tools (new namespace) + base = { + shell = { starship.enable = true; }; + cliTools = { + fzf.enable = true; + nitch.enable = true; + }; }; + + # Fish shell (legacy — no new equivalent yet) + features.cli.fish.enable = true; } diff --git a/home/m3tam3re/m3-hermes.nix b/home/m3tam3re/m3-hermes.nix index 0f6c41d..a70e6b3 100644 --- a/home/m3tam3re/m3-hermes.nix +++ b/home/m3tam3re/m3-hermes.nix @@ -1,17 +1,33 @@ +# m3-hermes — secondary server. +# Context: server | Profiles: (none) { + lib, + ... +}: +let + homeLib = import ../lib { inherit lib; }; +in { imports = [ - ../common - ../features/cli + (homeLib.mkHomeConfig { + profiles = [ ]; + context = "server"; + }) ./home-server.nix + # Fish shell — no equivalent in new base module yet + ../features/cli/fish.nix ]; - features = { - cli = { - fish.enable = true; - fzf.enable = true; - nitch.enable = true; - secrets.enable = false; + # Base CLI tools (new namespace) + base = { + shell = { starship.enable = true; }; + cliTools = { + fzf.enable = true; + nitch.enable = true; + }; }; + + # Fish shell (legacy — no new equivalent yet) + features.cli.fish.enable = true; } diff --git a/home/m3tam3re/m3-kratos.nix b/home/m3tam3re/m3-kratos.nix index 70c5824..7d23493 100644 --- a/home/m3tam3re/m3-kratos.nix +++ b/home/m3tam3re/m3-kratos.nix @@ -1,69 +1,106 @@ +# m3-kratos — AMD desktop workstation. +# Context: desktop | Profiles: coding, gaming, media { config, lib, ... }: +let + homeLib = import ../lib { inherit lib; }; +in with lib; { imports = [ - ../common + (homeLib.mkHomeConfig { + profiles = [ "coding" "gaming" "media" ]; + context = "desktop"; + }) ./home.nix - ../features/cli - ../features/coding - ../features/desktop ]; config = mkMerge [ { + # Base CLI tools (new namespace) + base = { + shell = { + nushell.enable = true; + starship.enable = true; + }; + cliTools = { + fzf.enable = true; + nitch.enable = true; + television.enable = true; + }; + secrets.enable = true; + }; + + # Desktop features (new namespace) + desktop = { + wm = { + hyprland.enable = true; + rofi.enable = true; + wayland.enable = true; + }; + apps = { + crypto.enable = true; + obsidian.enable = true; + office.enable = true; + }; + theme = { + fonts.enable = true; + wallpapers.enable = true; + }; + }; + + # Coding environment + coding = { + editors = { + neovim.enable = true; + zed.enable = true; + }; + lsp.enable = true; + }; + + # Gaming profile features + profiles.gaming = { + steam.enable = true; + gamescope.enable = true; + }; + + # Media profile features + profiles.media = { + obs.enable = true; + ffmpeg.enable = true; + kdenlive.enable = true; + ytDlp.enable = true; + }; + xdg = { - # TODO: better structure enable = true; configFile."mimeapps.list".force = true; mimeApps = { enable = true; associations.added = { - "application/zip" = ["org.gnome.FileRoller.desktop"]; - "application/csv" = ["calc.desktop"]; - "application/pdf" = ["vivaldi-stable.desktop"]; - "x-scheme-handler/http" = ["vivaldi-stable.desktop"]; - "x-scheme-handler/https" = ["vivaldi-stable.desktop"]; + "application/zip" = [ "org.gnome.FileRoller.desktop" ]; + "application/csv" = [ "calc.desktop" ]; + "application/pdf" = [ "vivaldi-stable.desktop" ]; + "x-scheme-handler/http" = [ "vivaldi-stable.desktop" ]; + "x-scheme-handler/https" = [ "vivaldi-stable.desktop" ]; }; defaultApplications = { - "application/zip" = ["org.gnome.FileRoller.desktop"]; - "application/csv" = ["calc.desktop"]; - "application/pdf" = ["vivaldi-stable.desktop"]; - "application/md" = ["dev.zed.Zed.desktop"]; - "application/text" = ["dev.zed.Zed.desktop"]; - "x-scheme-handler/http" = ["vivaldi-stable.desktop"]; - "x-scheme-handler/https" = ["vivaldi-stable.desktop"]; + "application/zip" = [ "org.gnome.FileRoller.desktop" ]; + "application/csv" = [ "calc.desktop" ]; + "application/pdf" = [ "vivaldi-stable.desktop" ]; + "application/md" = [ "dev.zed.Zed.desktop" ]; + "application/text" = [ "dev.zed.Zed.desktop" ]; + "x-scheme-handler/http" = [ "vivaldi-stable.desktop" ]; + "x-scheme-handler/https" = [ "vivaldi-stable.desktop" ]; }; }; }; - features = { - cli = { - nushell.enable = true; - fzf.enable = true; - nitch.enable = true; - secrets.enable = true; - starship.enable = true; - television.enable = true; - }; - desktop = { - crypto.enable = true; - coding.enable = true; - gaming.enable = true; - hyprland.enable = true; - media.enable = true; - obsidian.enable = true; - office.enable = true; - rofi.enable = true; - fonts.enable = true; - wayland.enable = true; - wallpapers = true; - }; - }; } - (mkIf config.features.desktop.hyprland.enable { + # Host-specific Hyprland monitor and workspace layout (dual 1440p monitors) + (mkIf config.desktop.wm.hyprland.enable { wayland.windowManager.hyprland = { enable = true; settings = { @@ -80,7 +117,6 @@ with lib; { "6, monitor:DP-2" "7, monitor:DP-2" ]; - windowrule = [ "match:class dev.zed.Zed, workspace 1" "match:class Msty, workspace 1"