{
  lib,
  inputs,
  config,
  partitionStack,
  ...
}:
{
  imports = [
    ./flake-modules
    ./ci.nix
    ./lib.nix
    ./legacy-packages.nix
    ./nixvim-configurations.nix
    ./overlays.nix
    ./packages.nix
    ./templates.nix
    ./wrappers.nix
    inputs.flake-parts.flakeModules.partitions
  ];

  # Define flake partitions
  # Each has a `module`, assigned to the partition's submodule,
  # and an `extraInputsFlake`, used for its inputs.
  # See https://flake.parts/options/flake-parts-partitions.html
  partitions = {
    dev = {
      module = ./dev;
      extraInputsFlake = ./dev;
    };
  };

  # Specify which outputs are defined by which partitions
  partitionedAttrs = {
    ci = "dev";
    checks = "dev";
    devShells = "dev";
    formatter = "dev";
  };

  # For any output attrs normally defined by the root flake configuration,
  # any exceptions must be manually propagated from the `dev` partition.
  #
  # NOTE: Attrs should be explicitly propagated at the deepest level.
  # Otherwise the partition won't be lazy, making it pointless.
  # E.g. propagate `packages.${system}.foo` instead of `packages.${system}`
  # See: https://github.com/hercules-ci/flake-parts/issues/258
  perSystem =
    { system, ... }:
    {
      packages = lib.optionalAttrs (partitionStack == [ ]) {
        # Propagate `packages` from the `dev` partition:
        inherit (config.partitions.dev.module.flake.packages.${system})
          list-plugins
          ;
      };
    };
}
