{ inputs, ... }:
{
  imports = [
    ./devshell.nix
    ./list-plugins
    ./package-tests.nix
    ./template-tests.nix
    ./tests.nix
    inputs.git-hooks.flakeModule
    inputs.treefmt-nix.flakeModule
  ];

  perSystem =
    {
      pkgs,
      system,
      ...
    }:
    {
      treefmt.config = {
        projectRootFile = "flake.nix";
        flakeCheck = true;

        programs = {
          isort.enable = true;
          nixfmt = {
            enable = true;
            package = pkgs.nixfmt-rfc-style;
          };
          prettier = {
            enable = true;
            excludes = [ "**.md" ];
          };
          ruff = {
            check = true;
            format = true;
          };
          statix = {
            enable = true;
            disabled-lints = [
              # We often use `nullable == true`
              "bool_comparison"
            ];
          };
          stylua.enable = true;
          shfmt.enable = true;
          # FIXME: re-enable on darwin, currently broken: taplo with options '[format]' failed to apply: exit status 101
          taplo.enable = pkgs.stdenv.isLinux;
        };

        settings = {
          global.excludes = [
            ".editorconfig"
            ".envrc"
            ".git-blame-ignore-revs"
            ".gitignore"
            "LICENSE"
            "flake.lock"
            "**.md"
            "**.scm"
            "**.svg"
            "**/man/*.5"
            # Those files are generated by pytest-regression, which then `diff`s them.
            # Formatting them will make the tests fail.
            "docs/gfm-alerts-to-admonitions/tests/**/*.yml"
          ];
          formatter.ruff-format.options = [ "--isolated" ];
        };
      };

      pre-commit = {
        # We have a treefmt check already, so this is redundant.
        # We also can't run the test if it includes running `nix build`,
        # since the nix CLI can't build within a derivation builder.
        check.enable = false;

        settings.hooks = {
          deadnix = {
            enable = true;

            settings = {
              noLambdaArg = true;
              noLambdaPatternNames = true;
              edit = true;
            };
          };
          treefmt.enable = true;
          typos = {
            enable = true;
            excludes = [ "generated/*" ];
          };
          maintainers = {
            enable = true;
            name = "maintainers";
            description = "Check maintainers when it is modified.";
            files = "^lib/maintainers[.]nix$";
            package = pkgs.nix;
            entry = "nix build --no-link --print-build-logs";
            args = [ ".#checks.${system}.maintainers" ];
            pass_filenames = false;
          };
          plugins-by-name = {
            enable = true;
            name = "plugins-by-name";
            description = "Check `plugins/by-name` when it's modified.";
            files = "^(?:tests/test-sources/)?plugins/by-name/";
            package = pkgs.nix;
            entry = "nix build --no-link --print-build-logs";
            args = [ ".#checks.${system}.plugins-by-name" ];
            pass_filenames = false;
          };
        };
      };
    };
}
