6.0 KiB
6.0 KiB
AGENTS.md
Overview
Nix flake managing 3 devices: Mac Mini, MacBook Air (both aarch64-darwin via nix-darwin), and a Windows PC via NixOS-WSL (x86_64-linux). Single user imbytecat everywhere. Uses Lix (not stock Nix).
Architecture
flake.nix
├── darwinConfigurations.mac-mini (aarch64-darwin)
├── darwinConfigurations.macbook-air (aarch64-darwin)
└── nixosConfigurations.wsl (x86_64-linux)
lib/default.nix— buildersmkDarwin/mkNixos, sharedsshKeysconstant (passed viaspecialArgs),homeManagerConfighelpermodules/shared/— both platforms: nix/nixpkgs settings (Lix, overlays), fonts,programs.fish.enable,services.openssh.enable,programs._1password.enablemodules/darwin/— macOS: system preferences, homebrew (casks/brews/masApps), usermodules/nixos/— NixOS: system packages, locale/timezone, docker, userhome/— home-manager (shared across all hosts viauseGlobalPkgs), catppuccin themehosts/*/— per-host overrides (mac-mini: 24/7 server; macbook-air: portable; wsl: NixOS-WSL)overlays/+pkgs/— custom packages (comment-checker)
Config flows: hosts/* (host-specific) → modules/* (platform) → home/* (user-level, cross-platform)
Commands
# Justfile shortcuts (preferred)
just rebuild mac-mini # rebuild macOS host
just rebuild macbook-air
just rebuild # rebuild WSL (linux default)
just rollback # rollback to previous generation (linux only)
just check # eval configs without building (platform-aware)
just update # nix flake update
just up nixpkgs # update a single flake input
just clean # nix-collect-garbage -d (user-level only)
just lsp mac-mini # generate .vscode/settings.json for nixd option completion
# Direct
sudo darwin-rebuild switch --flake .#mac-mini
sudo nixos-rebuild switch --flake .#wsl
# First-time macOS bootstrap (nix-darwin not yet installed)
sudo nix run nix-darwin -- switch --flake .#mac-mini
# First-time WSL bootstrap (fresh NixOS-WSL has no git)
nix-shell -p git --run "git clone <repo-url> ~/nix-config"
cd ~/nix-config && sudo nixos-rebuild switch --flake .#wsl
Critical gotchas
- Shared settings live in
modules/shared/: Fish, openssh, 1password, fonts, nix settings are enabled once in shared — don't re-declare in platform modules. - SSH keys are centralized: Defined as
sshKeysinlib/default.nix, passed viaspecialArgs. Don't hardcode keys in platform modules. - NixOS default shell aliases are force-cleared:
hosts/wsl/default.nixsetsenvironment.shellAliases = lib.mkForce {}to remove NixOS defaults (l,ll,ls). All shell aliases are managed exclusively by Home Manager (eza integration +fish.nix). Don't setenvironment.shellAliasesin NixOS modules — it would be ignored anyway. - Neovim uses lazyvim-nix:
programs.lazyviminhome/dev/neovim.nixmanages neovim via thelazyvim-nixflake input (loaded assharedModulesinlib/default.nix). Catppuccin nvim integration is explicitly disabled (catppuccin.nvim.enable = false) because LazyVim manages its own colorscheme. - catppuccin module names: Home-manager uses
catppuccin.homeModules.catppuccin(inhome/default.nix). NixOS usescatppuccin.nixosModules.catppuccin(inlib/default.nix). Don't use the oldhomeManagerModulesname. - Homebrew
cleanup = "zap": Any brew formula/cask NOT declared inmodules/darwin/default.nixWILL be removed on rebuild. Be comprehensive. Casks from taps need full path (e.g."goooler/repo/fl-clash"). - mise for version management: Configured via
programs.miseinhome/dev/languages.nix. Config trusts all config paths (trusted_config_paths = [ "/" ]). - Ghostty is macOS-only:
programs.ghostty.enable = pkgs.stdenv.isDarwinwithpackage = null(installed via Homebrew cask). Terminfo is propagated to NixOS viaghostty.terminfoinmodules/nixos/default.nix.
Secrets (1Password CLI)
- Not sops-nix — secrets are injected at shell startup via
op inject(1Password CLI). - Template:
home/shell/fish.nixgenerates~/.config/op-env/env.tplwithop://references (safe to commit). - Fish function
op-envruns on interactive shell init, callingop inject --in-fileto set env vars. - Auth via
OP_SERVICE_ACCOUNT_TOKENenv var (set in~/.config/fish/local.fish, which is gitignored vialocal.fishinconf.d).
Shell
Fish (not zsh). All tool integrations use enableFishIntegration. Key files:
home/shell/fish.nix— abbreviations, aliases, interactiveShellInit, 1Passwordop-envhome/shell/tools.nix— fzf, atuin, zoxide (--cmd cd), direnv, bat, eza (enableFishIntegration = trueprovidesls/ll/la/lt/llaaliases;fish.nixoverridesll/lla), yazi, btop, zellijhome/shell/starship.nix— prompthome/shell/ghostty.nix— Ghostty terminal config (macOS only)
Home Manager option API
These options were renamed in recent home-manager; use the new names:
programs.git.settings.user.{name,email}(notuserName/userEmail)programs.git.settings.*(notextraConfig)programs.delta.{enable,options}(notprograms.git.delta.*)programs.delta.enableGitIntegration = true(must be explicit)programs.ssh.matchBlocks."*".addKeysToAgent(not top-leveladdKeysToAgent)programs.ssh.enableDefaultConfig = false(set explicitly)
Nix LSP & formatter
- LSP:
nixd(notnil). Provides nixpkgs/option completion. - Formatter:
nixfmt. Run:nixfmt <file.nix> - Both installed via
home/dev/languages.nix. - VSCode settings for nixd option completion:
just lsp <host>(generates.vscode/settings.jsonfrom.vscode/settings.base.json; the generated file is gitignored).
Tool usage
- Always use the
nixos_nixMCP tool when searching for nix-darwin / NixOS / home-manager options. Query withsource=darwin/nixos/home-managerandtype=options/packagesto find available options before writing config. Do not guess option names or value types — verify first.