# AGENTS.md - NixOS Flake Configuration ## Before Starting Work Run `hostname` to identify current machine. Hostname = flake config name (e.g., `frame12` → `.#frame12`). ## Repository Structure ``` flake.nix # Defines all nixosConfigurations / # Per-host configs (frame12, nate, jaci, scrappy, nate-work, luci) default.nix # Host entry point, sets deskCfg or serverConfig desktop-configuration.nix # Desktop systems only modules/ # Host-specific modules (niri, home-manager, user) nixos/hardware-configuration.nix # Auto-generated, do not edit shared/ # Reusable modules imported by hosts modules/ # apps/, home-manager/, services/, system/, user/ server-configuration.nix # Server base (luci uses this) ``` **Host types:** - **Desktop** (frame12, nate, jaci, nate-work, scrappy): Use `deskCfg` options, Home Manager, Stylix theming - **Server** (luci): Uses `serverConfig` options, minimal packages ## Build/Test Commands ```bash nix flake check # Validate syntax nix build .#nixosConfigurations..config.system.build.toplevel --dry-run # Must be done by user, agent lacks admin privileges. sudo nixos-rebuild test --flake .# # Test without switching sudo nixos-rebuild switch --flake .# # Apply changes ``` ## Key Patterns **Configuration options:** Desktops set `deskCfg = { userName, hostName, de }`, servers set `serverConfig = { userName, hostName, hostId, ... }` **Module structure:** Options in `options.`, config in `config = lib.mkIf cfg.enable { ... }` **Home Manager:** User config in `/modules/home-manager/home.nix`, packages in `home.packages` **Shared imports:** `../shared/modules/` for reusable modules ## Code Style - Nix expression language, 2-4 space indent - camelCase options (`userName`), kebab-case hostnames, underscores for modules (`main_user`) - `lib.mkOption` with types (`lib.types.str`, `lib.types.bool`), `lib.mkEnableOption` for toggles - `lib.mkIf` for conditionals, `lib.mkMerge` for combining sets - Minimal comments; use self-documenting option descriptions