flk 0.6.1

A CLI tool for managing flake.nix devShell environments
Documentation
{
  description = "Development environment managed by flk";

  inputs = {
    nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
    flake-utils.url = "github:numtide/flake-utils";
    profile-lib.url = "github:AEduardo-dev/nix-profile-lib";
  };

  outputs = inputs @ {
    self,
    nixpkgs,
    flake-utils,
    ...
  }: let
    base = import ./.flk inputs;
    cargoToml = (nixpkgs.lib.importTOML ./Cargo.toml).package;
  in
    nixpkgs.lib.recursiveUpdate base
    (flake-utils.lib.eachDefaultSystem (system: let
      pkgs = import nixpkgs {inherit system;};

      flkPackage = pkgs.rustPlatform.buildRustPackage {
        pname = cargoToml.name;
        version = cargoToml.version;
        src = ./.;
        cargoLock.lockFile = ./Cargo.lock;
        doCheck = false; # Disable tests: nixpkgs exposure is limited in sandboxed builds
      };
      # API documentation (cargo doc)
      flkApiDocs = pkgs.rustPlatform.buildRustPackage {
        pname = "${cargoToml.name}-api-docs";
        version = cargoToml.version;
        src = ./.;
        cargoLock.lockFile = ./Cargo.lock;

        buildPhase = ''
          cargo doc --no-deps --document-private-items
        '';

        installPhase = ''
          mkdir -p $out/docs
          cp -r target/doc/* $out/docs/
        '';

        doCheck = false;
      };

      # User guide documentation (mdBook)
      flkUserDocs = pkgs.stdenv.mkDerivation {
        pname = "${cargoToml.name}-user-docs";
        version = cargoToml.version;
        src = ./flk-book;

        nativeBuildInputs = [pkgs.mdbook];

        buildPhase = ''
          # Copy source to a writable directory
          cp -r $src $TMPDIR/docs
          chmod -R +w $TMPDIR/docs
          cd $TMPDIR/docs

          # Build the book
          mdbook build
        '';

        installPhase = ''
          mkdir -p $out/docs
          cp -r $TMPDIR/docs/book $out/docs/
        '';
      };

      # Combined documentation package
      flkDocs = pkgs.stdenv.mkDerivation {
        pname = "${cargoToml.name}-docs";
        version = cargoToml.version;

        dontUnpack = true;

        installPhase = ''
          mkdir -p $out/docs

          # Copy user guide to root
          cp -r ${flkUserDocs}/* $out/docs/

          # Copy API docs to /api subdirectory
          mkdir -p $out/docs/api
          cp -r ${flkApiDocs}/* $out/docs/api/
        '';
      };
    in {
      packages = {
        flk = flkPackage;
        docs = flkDocs;
        api-docs = flkApiDocs;
        user-docs = flkUserDocs;
        default = flkPackage;
      };

      apps.flk = {
        type = "app";
        program = "${flkPackage}/bin/${cargoToml.name}";
      };

      # Overlay to expose flk as pkgs.flk
      overlay = final: prev: {
        flk = self.packages.${final.system}.flk;
      };
    }));
}