From 615e7fa953f30794db3ea5f15bf02d4fed9ff5cf Mon Sep 17 00:00:00 2001 From: "Sol Astrius (Daniel Gorlov)" Date: Fri, 27 Mar 2026 04:04:55 +0200 Subject: [PATCH 1/2] feat: add NixOS support with flake.nix, .envrc, and installer detection --- .envrc | 1 + flake.nix | 40 ++++++++++++++++++++++++++++++++++++++++ install.sh | 24 ++++++++++++++++++++++++ 3 files changed, 65 insertions(+) create mode 100644 .envrc create mode 100644 flake.nix diff --git a/.envrc b/.envrc new file mode 100644 index 0000000..3550a30 --- /dev/null +++ b/.envrc @@ -0,0 +1 @@ +use flake diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..7af5eae --- /dev/null +++ b/flake.nix @@ -0,0 +1,40 @@ +{ + description = "Nerve — self-hosted AI agent runtime"; + + inputs = { + nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable"; + flake-utils.url = "github:numtide/flake-utils"; + }; + + outputs = { self, nixpkgs, flake-utils }: + flake-utils.lib.eachDefaultSystem (system: + let + pkgs = nixpkgs.legacyPackages.${system}; + in + { + devShells.default = pkgs.mkShell { + packages = with pkgs; [ + # Core tools + uv + nodejs_22 + git + + # Native libs for Python wheel builds (bcrypt, cryptography, aiosqlite, etc.) + openssl + sqlite + libffi + pkg-config + ]; + + env = { + # Let uv manage Python — don't pull it from Nix + UV_PYTHON_PREFERENCE = "only-managed"; + }; + + shellHook = '' + # Help native builds find nix-provided libs + export LD_LIBRARY_PATH="${pkgs.lib.makeLibraryPath [ pkgs.openssl pkgs.sqlite pkgs.libffi ]}:$LD_LIBRARY_PATH" + ''; + }; + }); +} diff --git a/install.sh b/install.sh index ecf5df2..38438f4 100755 --- a/install.sh +++ b/install.sh @@ -94,6 +94,8 @@ detect_os() { DISTRO="arch"; PKG_MGR="pacman" ;; opensuse*) DISTRO="suse"; PKG_MGR="zypper" ;; + nixos) + DISTRO="nixos"; PKG_MGR="nix" ;; *) DISTRO="${ID:-unknown}" ;; esac @@ -115,6 +117,17 @@ detect_os() { esac } +# --- NixOS helper --- + +nixos_require() { + local tool="$1" + if command_exists "$tool"; then return 0; fi + error "$tool is required but not found." + error "On NixOS, enter the dev shell first: nix develop" + error "Or install $tool in your system/user profile." + exit 1 +} + # --- Dependency: git --- ensure_git() { @@ -123,6 +136,8 @@ ensure_git() { return fi + if [ "$DISTRO" = "nixos" ]; then nixos_require git; return; fi + info "git is not installed" if [ "$HAS_SUDO" = "0" ] && [ "$OS" = "linux" ]; then error "git is required but sudo is not available. Install git manually and re-run." @@ -162,6 +177,8 @@ ensure_uv() { return fi + if [ "$DISTRO" = "nixos" ]; then nixos_require uv; return; fi + info "Installing uv (Python package manager)..." curl -LsSf https://astral.sh/uv/install.sh | sh @@ -214,6 +231,11 @@ ensure_python() { # Last resort: system packages warn "uv python install failed. Trying system packages..." + if [ "$DISTRO" = "nixos" ]; then + error "uv python install failed. On NixOS, ensure you're in the dev shell: nix develop" + exit 1 + fi + if [ "$HAS_SUDO" = "0" ] && [ "$OS" = "linux" ]; then error "Cannot install Python: no sudo and uv python install failed." error "Install Python 3.12+ manually and re-run." @@ -276,6 +298,8 @@ ensure_node() { warn "Node.js $(node --version) is too old (need v${MIN_NODE_MAJOR}+)" fi + if [ "$DISTRO" = "nixos" ]; then nixos_require node; return; fi + info "Node.js ${MIN_NODE_MAJOR}+ is not installed" if [ "$HAS_SUDO" = "0" ] && [ "$OS" = "linux" ]; then From 15f2ff751eb976be585104f0d54b4c07bd6a5371 Mon Sep 17 00:00:00 2001 From: "Sol Astrius (Daniel Gorlov)" Date: Fri, 27 Mar 2026 04:07:01 +0200 Subject: [PATCH 2/2] chore: add flake.lock --- flake.lock | 61 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 flake.lock diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..088a973 --- /dev/null +++ b/flake.lock @@ -0,0 +1,61 @@ +{ + "nodes": { + "flake-utils": { + "inputs": { + "systems": "systems" + }, + "locked": { + "lastModified": 1731533236, + "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1774273680, + "narHash": "sha256-a++tZ1RQsDb1I0NHrFwdGuRlR5TORvCEUksM459wKUA=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "fdc7b8f7b30fdbedec91b71ed82f36e1637483ed", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "flake-utils": "flake-utils", + "nixpkgs": "nixpkgs" + } + }, + "systems": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +}