## Discover Nix files ### Rule Use `util.collectNixFiles` to discover Nix files. Do not use `builtins.readDir` with a `.nix` suffix filter for this purpose. Pass `util` to Nix functions that need the helper. ### Rationale `util.collectNixFiles` centralizes recursive discovery of Nix files. Repository Nix code uses one implementation. ## Remove Nix file suffixes with the utility ### Rule Use `util.removeNixSuffix` to derive a Nix name from a path. Do not call `lib.removeSuffix ".nix"` outside the utility definition. ### Rationale The utility centralizes Nix file-name normalization. ## Use executable helpers for package commands ### Rule Use `lib.getExe` for a package's main executable. Use `lib.getExe'` for a package's non-main executable. Do not build executable paths with `"${pkg}/bin/name"` when an executable helper names the target. Use `lib.getExe' config.programs..package "tool"` when a command follows a configured package option. ### Rationale Executable helpers select the package output that contains binaries. They make package ownership explicit. `lib.getExe'` prevents calls to a package's main executable when code needs another tool. ## Prefer NixOS package ownership for commands ### Rule Use `pkgs.` for Home Manager tools. Use `config.programs..package` when a NixOS module owns the package selection. Do not read `config.home-manager.users..programs..package` for command paths. ### Rationale Home Manager uses the NixOS package set in this repository. `pkgs.` avoids dependency paths through the user tree under Home Manager. Configured NixOS package options preserve package selection when a module owns the tool.