diff --git a/flake.nix b/flake.nix index d36170b..c11803e 100644 --- a/flake.nix +++ b/flake.nix @@ -34,6 +34,18 @@ url = "github:nix-community/nix-index-database"; inputs.nixpkgs.follows = "nixpkgs"; }; + # treefmt-nix: one multi-language formatter driving `nix fmt` and the + # formatting flake check (nixfmt + shfmt + prettier). + treefmt-nix = { + url = "github:numtide/treefmt-nix"; + inputs.nixpkgs.follows = "nixpkgs"; + }; + # git-hooks.nix: declarative pre-commit hooks (nixfmt/deadnix/statix), + # installed into the repo via the devShell. + git-hooks = { + url = "github:cachix/git-hooks.nix"; + inputs.nixpkgs.follows = "nixpkgs"; + }; }; outputs = @@ -53,7 +65,7 @@ let # claude-code tracks nixpkgs-unstable regardless of the pinned nixpkgs. overlays = [ - (final: prev: { + (_final: prev: { claude-code = (import nixpkgs-unstable { inherit (prev.stdenv.hostPlatform) system; @@ -245,7 +257,7 @@ ]; homeModules = [ ./lyrathorpe/home - ./system/modules/work/default.nix + ./lyrathorpe/home/work.nix ]; }; }; @@ -268,6 +280,13 @@ }; in { + # flake-parts modules: treefmt-nix wires `nix fmt` + a formatting check; + # git-hooks.nix wires the pre-commit check + devShell installation script. + imports = [ + inputs.treefmt-nix.flakeModule + inputs.git-hooks.flakeModule + ]; + systems = [ "x86_64-linux" "aarch64-linux" @@ -279,26 +298,60 @@ # nixpkgs instance for that system. Outputs here become per-system # attrsets automatically (e.g. devShells..default). perSystem = - { pkgs, ... }: + { config, pkgs, ... }: { - # `nix fmt` formatter for the repo. - formatter = pkgs.nixfmt; + # treefmt drives `nix fmt` and the formatting check below. nixfmt + # stays the .nix formatter (the tree is already nixfmt-formatted); + # shfmt covers shell and prettier covers markdown/yaml/json. + treefmt = { + projectRootFile = "flake.nix"; + programs.nixfmt.enable = true; + programs.shfmt.enable = true; + programs.prettier.enable = true; + # Generated hardware-configuration.nix files are not hand-edited. + settings.global.excludes = [ "*/hardware-configuration.nix" ]; + }; + + # Pre-commit hooks: format + lint gate run on commit. The same hooks + # are exposed as a flake check (pre-commit.check.enable defaults true). + pre-commit.settings.hooks = { + nixfmt-rfc-style.enable = true; + deadnix = { + enable = true; + # Unused module args ({config,lib,pkgs,...}) are normal; only flag + # genuinely dead bindings. + settings.noLambdaPatternNames = true; + }; + statix.enable = true; # reads .statix.toml (repeated_keys/empty_pattern disabled) + }; + + # treefmt-nix exposes its own `checks.treefmt`; alias it to + # `formatting` so the existing CI gate (.#checks.*.formatting) keeps + # working without churn. + checks.formatting = config.treefmt.build.check inputs.self; + + # deadnix / statix lints as standalone flake checks so `nix flake + # check` flags dead code and antipatterns independently of pre-commit. + checks.deadnix = pkgs.runCommandLocal "check-deadnix" { nativeBuildInputs = [ pkgs.deadnix ]; } '' + deadnix --fail --no-lambda-pattern-names ${./.} && touch $out + ''; + checks.statix = pkgs.runCommandLocal "check-statix" { nativeBuildInputs = [ pkgs.statix ]; } '' + statix check ${./.} && touch $out + ''; # `nix develop` shell with the tooling needed to hack on this flake. + # shellHook installs the git pre-commit hooks into the working tree. devShells.default = pkgs.mkShellNoCC { packages = with pkgs; [ nixfmt nil git + deadnix + statix + treefmt ]; + shellHook = config.pre-commit.installationScript; }; - - checks.formatting = - pkgs.runCommandLocal "check-formatting" { nativeBuildInputs = [ pkgs.nixfmt ]; } - '' - # Generated hardware-configuration.nix files are excluded. - nixfmt --check $(find ${./.} -name '*.nix' -not -name 'hardware-configuration.nix') && touch $out - ''; }; # Realise the host tables: each entry becomes a {nixos,darwin}Configuration. diff --git a/lyrathorpe/home/README.md b/lyrathorpe/home/README.md index 0307a28..6a402f0 100644 --- a/lyrathorpe/home/README.md +++ b/lyrathorpe/home/README.md @@ -6,11 +6,11 @@ home-manager — edit the listed file and rebuild, never the generated dotfiles. Keyboard shortcuts have their own reference: [`KEYBINDINGS.md`](./KEYBINDINGS.md). -| Area | Defined in | -| --- | --- | -| zsh, CLI tools, tmux, ssh, auto-tmux | [`shell.nix`](./shell.nix) | -| git (+ delta, commitizen) | [`git.nix`](./git.nix) | -| vim | [`editor.nix`](./editor.nix) | +| Area | Defined in | +| ------------------------------------- | ----------------------------------------------------- | +| zsh, CLI tools, tmux, ssh, auto-tmux | [`shell.nix`](./shell.nix) | +| git (+ delta, commitizen) | [`git.nix`](./git.nix) | +| vim | [`editor.nix`](./editor.nix) | | GUI apps, GTK/Firefox theming, cursor | [`desktop.nix`](./desktop.nix) (graphical hosts only) | Shared by every host via [`default.nix`](./default.nix); the work box also layers @@ -21,30 +21,40 @@ on top (work email, its own ssh config, extra packages). ## zsh -| Feature | Notes | -| --- | --- | -| oh-my-zsh | plugins `git`, `man`, `sudo` (Esc-Esc to prepend sudo), `colored-man-pages`, `extract`; theme `robbyrussell` | -| Autosuggestion | fish-style history suggestions as you type (→ to accept) | -| Syntax highlighting | commands coloured by validity as you type | -| Completion | menu completion; the dump is rebuilt on every activation (see Maintenance) | -| History | 100k in-memory/on-disk, deduped, space-prefixed commands ignored, timestamped, **shared live across sessions** | +| Feature | Notes | +| ------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------ | +| oh-my-zsh | plugins `git`, `man`, `sudo` (Esc-Esc to prepend sudo), `colored-man-pages`, `extract`; theme `robbyrussell` | +| Autosuggestion | fish-style history suggestions as you type (→ to accept) | +| Syntax highlighting | commands coloured by validity as you type | +| Completion | menu completion; the dump is rebuilt on every activation (see Maintenance) | +| History | 100k in-memory/on-disk, deduped, space-prefixed commands ignored, timestamped, **shared live across sessions** | | History substring search | type a fragment, then ↑/↓ cycles matching past commands — works in foot, iTerm2 and the Linux TTY (both CSI and SS3 arrow encodings bound) | -| Prompt | hostname is prefixed when over SSH | +| Prompt | hostname is prefixed when over SSH | **Aliases:** `ls`/`ll`/`la`/`lt` → `eza` (icons + git), `cls` → `clear`. git aliases live in git.nix (below). ## CLI tools -| Tool | What it gives you | -| --- | --- | -| `fzf` | `Ctrl-R` fuzzy history, `Ctrl-T` file picker, `Alt-C` fuzzy cd | -| `zoxide` | `z ` jumps to frecent directories | -| `direnv` + `nix-direnv` | per-project environments auto-loaded on `cd` (cached Nix dev shells) | -| `eza` | modern `ls` (drives the ls aliases) | -| `bat` | syntax-highlighting pager; behaves like `cat` when piped | -| `nix-index` | `command-not-found`: an unknown command tells you which Nix package provides it (prebuilt DB, no manual indexing) | -| `comma` (`,`) | run an uninstalled program once: `, cowsay hi` | -| `nh` | nicer `nixos-rebuild`/`home-manager` with diffs; `$NH_FLAKE` set to the repo. No scheduled GC (it could reap paths a running generation still references) — collect garbage manually with `nh clean all` / `nix-collect-garbage -d` | +| Tool | What it gives you | +| ----------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `fzf` | `Ctrl-R` fuzzy history, `Ctrl-T` file picker, `Alt-C` fuzzy cd (Catppuccin-themed) | +| `zoxide` | `z ` jumps to frecent directories | +| `direnv` + `nix-direnv` | per-project environments auto-loaded on `cd` (cached Nix dev shells) | +| `eza` | modern `ls` (drives the ls aliases) | +| `bat` | syntax-highlighting pager (Catppuccin Mocha theme); behaves like `cat` when piped; also the `MANPAGER` | +| `ripgrep` / `fd` | fast search (`rg`) and find (`fd`); also back `fzf` | +| `jq` / `btop` | JSON processor; resource monitor | +| `gh` / `tea` | GitHub and Gitea (`code.emmathe.dev`) CLIs; `gh` uses SSH | +| `nix-index` | `command-not-found`: an unknown command tells you which Nix package provides it (prebuilt DB, no manual indexing) | +| `comma` (`,`) | run an uninstalled program once: `, cowsay hi` | +| `nh` | nicer `nixos-rebuild`/`home-manager` with diffs; `$NH_FLAKE` set to the repo. No scheduled GC (it could reap paths a running generation still references) — collect garbage manually with `nh clean all` / `nix-collect-garbage -d` | + +**Theming:** `fzf`, `bat` and `git`'s `delta` pager are all Catppuccin Mocha, +driven from the shared `../catppuccin-mocha.nix` palette / the catppuccin/bat +theme. + +**Env & defaults:** `xdg.enable` on; `PAGER`/`MANPAGER` (bat)/`VISUAL` set in +`default.nix`; `xdg.mimeApps` maps web→Firefox, directories→nemo (`desktop.nix`). ## tmux @@ -54,18 +64,18 @@ exists, else create). Panes run a plain non-login zsh. It deliberately does **no fire for SSH sessions, VS Code's integrated terminal, already-inside-tmux, or non-interactive shells. Escape hatch: `NO_TMUX=1 ` opens a bare shell. -| Setting | Value | -| --- | --- | -| Mode keys | vi | -| Mouse | on | -| Scrollback | 500000 lines | -| `escape-time` | 10ms (the 500ms default lagged vim's ESC) | -| `focus-events` | on (vim autoread) | -| `base-index` / `pane-base-index` | 1 | -| Splits | `prefix s` vertical, `prefix v` horizontal (stock `%`/`"` unbound) | -| Pane nav | `Alt`+arrows (no prefix) | -| Terminal | `default-terminal tmux-256color`; truecolor advertised per outer terminal (`foot*`, `xterm-256color`/iTerm2) via `terminal-features … RGB` | -| Clipboard | `set-clipboard on`; foot `terminal-features` advertise truecolor/sync/OSC52/title/cursor | +| Setting | Value | +| -------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------ | +| Mode keys | vi | +| Mouse | on | +| Scrollback | 500000 lines | +| `escape-time` | 10ms (the 500ms default lagged vim's ESC) | +| `focus-events` | on (vim autoread) | +| `base-index` / `pane-base-index` | 1 | +| Splits | `prefix s` vertical, `prefix v` horizontal (stock `%`/`"` unbound) | +| Pane nav | `Alt`+arrows (no prefix) | +| Terminal | `default-terminal tmux-256color`; truecolor advertised per outer terminal (`foot*`, `xterm-256color`/iTerm2) via `terminal-features … RGB` | +| Clipboard | `set-clipboard on`; foot `terminal-features` advertise truecolor/sync/OSC52/title/cursor | **Plugins:** `sensible`, `vim-tmux-navigator` (Ctrl-h/j/k/l across vim ↔ tmux), `yank`, `catppuccin` (Mocha statusline), `resurrect` + `continuum` @@ -77,7 +87,7 @@ glyphs — see Fonts. **JetBrainsMono Nerd Font** is installed on every host (in `common-nixos.nix`, because tmux runs everywhere; the Mac installs it to `/Library/Fonts` via the Darwin config). foot uses it as its main font automatically. iTerm2's font is a -GUI setting — set it to *JetBrainsMono Nerd Font* (Settings → Profiles → Text → +GUI setting — set it to _JetBrainsMono Nerd Font_ (Settings → Profiles → Text → Font) so the tmux statusline glyphs render instead of `?`. ## git @@ -85,33 +95,33 @@ Font) so the tmux statusline glyphs render instead of `?`. Pager is **delta**. **commitizen** is installed on every host; `cz` defaults to Conventional Commits. -| Aliases | | -| --- | --- | -| `st` `co` `sw` `br` `ci` | status / checkout / switch / branch / commit | -| `last` `unstage` | last commit / unstage | -| `lg` | graph log, all branches | -| `cz` `cc` | `git cz ` (e.g. `git cz c`) and `git cc` → commitizen prompt | +| Aliases | | +| ------------------------ | ----------------------------------------------------------------- | +| `st` `co` `sw` `br` `ci` | status / checkout / switch / branch / commit | +| `last` `unstage` | last commit / unstage | +| `lg` | graph log, all branches | +| `cz` `cc` | `git cz ` (e.g. `git cz c`) and `git cc` → commitizen prompt | -| Behaviour | | -| --- | --- | -| Pulls | rebase, with autostash + autosquash | -| Fetch | prune deleted remote branches | -| Conflicts | `zdiff3` (shows the common ancestor) | -| Diffs | histogram algorithm, colour-moved | -| `rerere` | remembers + replays conflict resolutions | -| Commit editor | full diff shown (`commit.verbose`) | -| Misc | branches sorted by date, `column.ui = auto`, `help.autocorrect = prompt`, `push.autoSetupRemote` | -| Global ignores | `result`, `result-*`, `.direnv`, `*.swp`, `.DS_Store` | -| Signing | SSH commit + tag signing (`mkDefault`, so a host without the key in its agent can disable it). Personal email `iam@emmathe.dev`; the work box overrides email + signing. | +| Behaviour | | +| -------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| Pulls | rebase, with autostash + autosquash | +| Fetch | prune deleted remote branches | +| Conflicts | `zdiff3` (shows the common ancestor) | +| Diffs | histogram algorithm, colour-moved | +| `rerere` | remembers + replays conflict resolutions | +| Commit editor | full diff shown (`commit.verbose`) | +| Misc | branches sorted by date, `column.ui = auto`, `help.autocorrect = prompt`, `push.autoSetupRemote` | +| Global ignores | `result`, `result-*`, `.direnv`, `*.swp`, `.DS_Store` | +| Signing | SSH commit + tag signing (`mkDefault`, so a host without the key in its agent can disable it). Personal email `iam@emmathe.dev`; the work box overrides email + signing. | ## ssh -| Feature | Notes | -| --- | --- | -| ssh-agent | runs on Linux (launchd on macOS); keys added on **first use** so the passphrase is typed once per login session — this also feeds git commit signing | -| macOS | `UseKeychain` caches the passphrase in the login keychain (guarded by `IgnoreUnknown`, so a non-Apple `ssh` skips it instead of erroring) | -| Gitea remote | `code.emmathe.dev` → `HostName 10.187.1.76` (DNS-override), `Port 30009`, user `git`, dedicated key, `identitiesOnly` | -| Defaults | the module's deprecated default block is opted out; equivalents kept under `settings."*"` | +| Feature | Notes | +| ------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------- | +| ssh-agent | runs on Linux (launchd on macOS); keys added on **first use** so the passphrase is typed once per login session — this also feeds git commit signing | +| macOS | `UseKeychain` caches the passphrase in the login keychain (guarded by `IgnoreUnknown`, so a non-Apple `ssh` skips it instead of erroring) | +| Gitea remote | `code.emmathe.dev` → `HostName 10.187.1.76` (DNS-override), `Port 30009`, user `git`, dedicated key, `identitiesOnly` | +| Defaults | the module's deprecated default block is opted out; equivalents kept under `settings."*"` | The **work box keeps its own `~/.ssh/config`** (home-manager's `programs.ssh` is forced off there) but still runs the agent. @@ -126,10 +136,10 @@ forced off there) but still runs the agent. ## Per-host differences -| | Personal Linux (sway) | macOS | Work WSL (EDaaS) | -| --- | --- | --- | --- | -| Auto-tmux | yes (foot/TTY) | yes (iTerm2) | yes (WSL shell) | -| git email | `iam@emmathe.dev` | `iam@emmathe.dev` | `…@citrix.com` (work) | -| ssh config managed | yes | yes | no (keeps corporate config) | -| ssh-agent | yes | launchd | yes (work module) | -| GUI / theming (desktop.nix) | yes | no | no | +| | Personal Linux (sway) | macOS | Work WSL (EDaaS) | +| --------------------------- | --------------------- | ----------------- | --------------------------- | +| Auto-tmux | yes (foot/TTY) | yes (iTerm2) | yes (WSL shell) | +| git email | `iam@emmathe.dev` | `iam@emmathe.dev` | `…@citrix.com` (work) | +| ssh config managed | yes | yes | no (keeps corporate config) | +| ssh-agent | yes | launchd | yes (work module) | +| GUI / theming (desktop.nix) | yes | no | no | diff --git a/lyrathorpe/home/default.nix b/lyrathorpe/home/default.nix index 6ef9d42..d07a9c7 100644 --- a/lyrathorpe/home/default.nix +++ b/lyrathorpe/home/default.nix @@ -9,5 +9,26 @@ ./editor.nix ]; + # Manage the XDG base-directory layout and ~/.config files. Tools above + # (bat themes, gh config, ...) write under xdg.configHome; enabling this + # makes the paths explicit and consistent across hosts. No regression: the + # defaults match the conventional ~/.config, ~/.cache, ~/.local/share. + xdg.enable = true; + + # Editor itself comes from vim.defaultEditor (sets $EDITOR). Round out the + # rest of the standard env. desktop.nix adds its own Wayland session vars; + # home-manager merges the two attrsets, so these do not clash. + home.sessionVariables = { + VISUAL = "vim"; + PAGER = "less -FRX"; # -F quit-if-one-screen, -R raw colour, -X no clear + # Render man pages through bat (themed): col strips backspace overstrike, + # bat -l man -p highlights without its own pager decorations. + MANPAGER = "sh -c 'col -bx | bat -l man -p'"; + }; + + # Pinned to the release first installed on these hosts, NOT the current + # nixpkgs (26.05). stateVersion freezes stateful defaults (file locations, + # service data formats) to that release; bumping it silently migrates that + # state and can break it. Leave it -- it is intentional, not stale. home.stateVersion = "25.05"; } diff --git a/lyrathorpe/home/desktop.nix b/lyrathorpe/home/desktop.nix index 77e374d..c278b5f 100644 --- a/lyrathorpe/home/desktop.nix +++ b/lyrathorpe/home/desktop.nix @@ -27,6 +27,30 @@ XDG_CURRENT_DESKTOP = "sway"; }; + # Default apps for the desktop (writes ~/.config/mimeapps.list). Firefox owns + # the web; nemo owns directories/file URIs; images, PDFs and plain text open + # in Firefox too -- no dedicated GUI viewer/editor is installed and vim is + # terminal-only (no usable GUI .desktop for double-click handoff). Kept + # minimal -- only the handlers actually present on these hosts. + xdg.mimeApps = { + enable = true; + defaultApplications = { + "text/html" = "firefox.desktop"; + "x-scheme-handler/http" = "firefox.desktop"; + "x-scheme-handler/https" = "firefox.desktop"; + "x-scheme-handler/about" = "firefox.desktop"; + "x-scheme-handler/unknown" = "firefox.desktop"; + "inode/directory" = "nemo.desktop"; + "image/png" = "firefox.desktop"; + "image/jpeg" = "firefox.desktop"; + "image/gif" = "firefox.desktop"; + "image/webp" = "firefox.desktop"; + "image/svg+xml" = "firefox.desktop"; + "application/pdf" = "firefox.desktop"; + "text/plain" = "firefox.desktop"; + }; + }; + # Theme GTK apps (nemo, etc.) to match the Catppuccin Mocha desktop. Under # Sway there is no XSettings daemon, so GTK reads these from the generated # ~/.config/gtk-{3,4}.0/settings.ini directly. The Mocha theme is dark by diff --git a/lyrathorpe/home/git.nix b/lyrathorpe/home/git.nix index 2b1f819..d539e6a 100644 --- a/lyrathorpe/home/git.nix +++ b/lyrathorpe/home/git.nix @@ -37,6 +37,17 @@ colorMoved = "default"; }; rerere.enabled = true; # remember + replay conflict resolutions + + # delta pager config (programs.delta is enabled below, with git + # integration; these keys land under [delta] in the git config). + # syntax-theme reuses the Catppuccin Mocha tmTheme vendored for bat in + # shell.nix -- delta reads bat's theme directory. + delta = { + syntax-theme = "Catppuccin Mocha"; + navigate = true; # n/N to jump between diff hunks + line-numbers = true; + side-by-side = true; + }; commit.verbose = true; # full diff in the commit-message editor branch.sort = "-committerdate"; # most-recent branches first column.ui = "auto"; diff --git a/lyrathorpe/home/shell.nix b/lyrathorpe/home/shell.nix index eae0552..e4cdbbb 100644 --- a/lyrathorpe/home/shell.nix +++ b/lyrathorpe/home/shell.nix @@ -5,6 +5,10 @@ inputs, ... }: +let + # Shared Catppuccin Mocha palette: raw 6-hex strings, no leading "#". + ctp = import ../catppuccin-mocha.nix; +in { imports = [ # Prebuilt nix-index database -> working command-not-found @@ -12,6 +16,16 @@ inputs.nix-index-database.homeModules.default ]; + # CLI staples wanted on every host (search, parse, monitor). ripgrep/fd also + # back fzf and editor integrations; tea is the Gitea CLI for code.emmathe.dev. + home.packages = [ + pkgs.ripgrep + pkgs.fd + pkgs.jq + pkgs.btop + pkgs.tea + ]; + programs.zsh = { enable = true; enableCompletion = true; @@ -99,6 +113,23 @@ programs.fzf = { enable = true; enableZshIntegration = true; + # Catppuccin Mocha colours (rendered into FZF_DEFAULT_OPTS --color). Each + # value needs a leading "#"; the palette stores raw hex. + colors = { + "bg" = "#${ctp.base}"; + "bg+" = "#${ctp.surface1}"; # current line / selected row + "fg" = "#${ctp.text}"; + "fg+" = "#${ctp.text}"; + "hl" = "#${ctp.blue}"; # match highlights + "hl+" = "#${ctp.blue}"; + "header" = "#${ctp.red}"; + "info" = "#${ctp.mauve}"; + "marker" = "#${ctp.green}"; + "pointer" = "#${ctp.pink}"; + "prompt" = "#${ctp.mauve}"; + "spinner" = "#${ctp.pink}"; + "border" = "#${ctp.surface1}"; + }; }; # Frecency directory jumping: `z `. @@ -120,8 +151,22 @@ icons = "auto"; # boolean form is deprecated }; - # Syntax-highlighting pager, used as `bat` (acts like cat when piped). - programs.bat.enable = true; + # Syntax-highlighting pager, used as `bat` (acts like cat when piped). bat + # ships no Catppuccin theme, so vendor the upstream tmTheme from catppuccin/bat + # (delta in git.nix reuses it as its syntax-theme). + programs.bat = { + enable = true; + config.theme = "Catppuccin Mocha"; + themes."Catppuccin Mocha" = { + src = pkgs.fetchFromGitHub { + owner = "catppuccin"; + repo = "bat"; + rev = "6810349b28055dce54076712fc05fc68da4b8ec0"; + sha256 = "1y5sfi7jfr97z1g6vm2mzbsw59j1jizwlmbadvmx842m0i5ak5ll"; + }; + file = "themes/Catppuccin Mocha.tmTheme"; + }; + }; # command-not-found backed by the prebuilt nix-index DB (module imported # above). `comma` runs an uninstalled program once: `, cowsay hi`. @@ -138,6 +183,13 @@ flake = "$HOME/code/nixfiles"; }; + # GitHub CLI. Prefer SSH for any git operations it drives, matching the + # ssh-based remotes used elsewhere. + programs.gh = { + enable = true; + settings.git_protocol = "ssh"; + }; + programs.tmux = { enable = true; reverseSplit = true; diff --git a/system/modules/work/default.nix b/lyrathorpe/home/work.nix similarity index 100% rename from system/modules/work/default.nix rename to lyrathorpe/home/work.nix diff --git a/statix.toml b/statix.toml new file mode 100644 index 0000000..748238f --- /dev/null +++ b/statix.toml @@ -0,0 +1,8 @@ +# statix lint config. Two default lints are disabled because they flag this +# repo's intentional house style, not bugs: +# repeated_keys - we use `foo.a = ...; foo.b = ...;` (dotted) over nesting. +# empty_pattern - module files use `{ ... }:` / `{ }:` deliberately. +disabled = [ + "repeated_keys", + "empty_pattern", +]