{ lib, config, pkgs, flakeRoot, import-tree, home-manager, ... }: let hostname = "traveldroid"; modulesPath = "${flakeRoot}/generated/modules/${hostname}"; usersPath = "${flakeRoot}/generated/users"; # Import raw modules (might be functions) hostModulesRaw = import-tree modulesPath; globalUsersRaw = import-tree usersPath; # Helper to fully evaluate import-tree nodes into module sets evalModule = m: if lib.isFunction m then m { lib = lib; pkgs = pkgs; config = config; flakeRoot = flakeRoot; home-manager = home-manager; } else m; # Evaluate all modules into sets hostModules = lib.mapAttrsToList (_: mod: evalModule mod) hostModulesRaw; globalUsers = lib.mapAttrsToList (_: mod: evalModule mod) globalUsersRaw; # Merge all evaluated modules allModules = hostModules ++ globalUsers; # Merge all _module.args.hmUsers allHmUsers = lib.foldl' (acc: m: let hmUsers = if (builtins.hasAttr "_module" m) && (builtins.hasAttr "args" m._module) && (builtins.hasAttr "hmUsers" m._module.args) then m._module.args.hmUsers else {}; in acc // hmUsers ) {} allModules; in { ################################# # Core system config ################################# networking.hostName = hostname; system.stateVersion = "26.05"; ################################# # Imports ################################# imports = [ ./boot.nix ./hardware-configuration.nix home-manager.nixosModules.home-manager ] ++ allModules; ################################# # Home Manager integration ################################# home-manager.useGlobalPkgs = true; home-manager.useUserPackages = true; # Inject the merged users directly under Home Manager home-manager.users = allHmUsers; ################################# # Example: system packages ################################# environment.systemPackages = [ pkgs.dconf ]; programs.dconf.enable = true; }