{ description = "Mistral Vibe!"; inputs = { nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; flake-utils.url = "github:numtide/flake-utils"; pyproject-nix = { url = "github:pyproject-nix/pyproject.nix"; inputs.nixpkgs.follows = "nixpkgs"; }; uv2nix = { url = "github:pyproject-nix/uv2nix"; inputs.pyproject-nix.follows = "pyproject-nix"; inputs.nixpkgs.follows = "nixpkgs"; }; pyproject-build-systems = { url = "github:pyproject-nix/build-system-pkgs"; inputs.pyproject-nix.follows = "pyproject-nix"; inputs.uv2nix.follows = "uv2nix"; inputs.nixpkgs.follows = "nixpkgs"; }; }; outputs = { self, nixpkgs, flake-utils, uv2nix, pyproject-nix, pyproject-build-systems, ... }: flake-utils.lib.eachDefaultSystem (system: let inherit (nixpkgs) lib; workspace = uv2nix.lib.workspace.loadWorkspace {workspaceRoot = ./.;}; overlay = workspace.mkPyprojectOverlay { sourcePreference = "wheel"; # sdist if you want }; pyprojectOverrides = final: prev: { # NOTE: If a package complains about a missing dependency (such # as setuptools), you can add it here. untokenize = prev.untokenize.overrideAttrs (old: { buildInputs = (old.buildInputs or []) ++ final.resolveBuildSystem {setuptools = [];}; }); }; pkgs = import nixpkgs { inherit system; }; python = pkgs.python312; # Construct package set pythonSet = # Use base package set from pyproject.nix builders (pkgs.callPackage pyproject-nix.build.packages { inherit python; }).overrideScope ( lib.composeManyExtensions [ pyproject-build-systems.overlays.default overlay pyprojectOverrides ] ); inherit (pkgs.callPackages pyproject-nix.build.util { }) mkApplication; in { packages.default = mkApplication { venv = pythonSet.mkVirtualEnv "mistralai-vibe-env" workspace.deps.default; package = pythonSet.mistral-vibe; }; apps = { default = { type = "app"; program = "${self.packages.${system}.default}/bin/vibe"; }; }; devShells = { default = let editableOverlay = workspace.mkEditablePyprojectOverlay { root = "$REPO_ROOT"; }; editablePythonSet = pythonSet.overrideScope ( lib.composeManyExtensions [ editableOverlay # Apply fixups for building an editable package of your workspace packages (final: prev: { mistralai-vibe = prev.mistralai-vibe.overrideAttrs (old: { # It's a good idea to filter the sources going into an editable build # so the editable package doesn't have to be rebuilt on every change. src = lib.fileset.toSource { root = old.src; fileset = lib.fileset.unions [ (old.src + "/pyproject.toml") (old.src + "/README.md") ]; }; nativeBuildInputs = old.nativeBuildInputs ++ final.resolveBuildSystem { editables = []; }; }); }) ] ); virtualenv = editablePythonSet.mkVirtualEnv "mistralai-vibe-dev-env" workspace.deps.all; in pkgs.mkShell { packages = [ virtualenv pkgs.uv ]; env = { # Don't create venv using uv UV_NO_SYNC = "1"; # Force uv to use Python interpreter from venv UV_PYTHON = "${virtualenv}/bin/python"; # Prevent uv from downloading managed Python's UV_PYTHON_DOWNLOADS = "never"; }; shellHook = '' # Undo dependency propagation by nixpkgs. unset PYTHONPATH # Get repository root using git. This is expanded at runtime by the editable `.pth` machinery. export REPO_ROOT=$(git rev-parse --show-toplevel) ''; }; }; }); }