{ inputs = { flake-utils.url = "github:numtide/flake-utils"; nixpkgs.url = "github:nixos/nixpkgs/nixpkgs-unstable"; ocaml.url = "github:nix-ocaml/nix-overlays"; ocaml.inputs.nixpkgs.follows = "nixpkgs"; # it's broken wtf # lsp.url = "github:ocaml/ocaml-lsp"; # lsp.inputs.nixpkgs.follows = "nixpkgs"; }; outputs = { self, nixpkgs, ocaml, flake-utils, }: flake-utils.lib.eachDefaultSystem (system: let pkgs = import nixpkgs { inherit system; overlays = [ ocaml.overlays.default (final: prev: { # This ensures we consistently use one version of ocaml packages ocamlPackages = prev.ocaml-ng.ocamlPackages_5_3; ocaml = prev.ocaml-ng.ocamlPackages_5_3.ocaml; }) ]; }; quickjs = pkgs.ocamlPackages.buildDunePackage { name = "quickjs"; pname = "quickjs"; version = "0.1.2"; src = pkgs.fetchFromGitHub { fetchSubmodules = true; owner = "ml-in-barcelona"; repo = "quickjs.ml"; rev = "5c4aa494acdf0f7b83a7b135b4ecd5d086cc1c64"; sha256 = "2rHyfc4Ru5fjuQY5xueJRSXBcVofVvPDagN0sFL7/nY="; }; buildInputs = [pkgs.git]; propagatedBuildInputs = [ pkgs.git pkgs.ocamlPackages.alcotest pkgs.ocamlPackages.integers pkgs.ocamlPackages.ctypes ]; }; server-reason-react = pkgs.ocamlPackages.buildDunePackage { pname = "server-reason-react"; version = "0.4.0"; src = pkgs.fetchFromGitHub { owner = "polwex"; repo = "server-reason-react"; # rev = "d5dd436b0a447ff0a82f9a8d7a02f102139299a9"; rev = "f9955158d42f87a902ff32e05629a1a4d72c1d7f"; sha256 = "EoG6fTW2mAGge/hm0Z0mQOyxE2zIEXvRnu2KtUfWEqw="; }; propagatedBuildInputs = with pkgs.ocamlPackages; [ melange ppxlib ocaml_pcre lwt lwt_ppx uri quickjs # yojson uucp ]; nativeBuildInputs = with pkgs.ocamlPackages; [ reason melange # reason-native.refmett ]; }; # lib = pkgs.lib if unavailable gemini-cli = pkgs.callPackage ./gemini.nix { inherit (pkgs) buildNpmPackage fetchFromGitHub fetchNpmDeps cacert curl gnused jq nix-prefetch-github prefetch-npm-deps writeShellApplication ; }; mlx-repo = pkgs.fetchFromGitHub { owner = "ocaml-mlx"; repo = "mlx"; rev = "aa59db58c948f93ab960c63e127f0f5c41d8530c"; sha256 = "g2v6U4lubYIVKUkU0j+OwtPxK9tKvleuX+vA4ljJ1bA="; }; mlx = pkgs.ocamlPackages.buildDunePackage { pname = "mlx"; version = "0.9.0"; src = mlx-repo; propagatedBuildInputs = with pkgs.ocamlPackages; [ ppxlib ocaml-compiler-libs ]; }; ocamlmerlinmlx = pkgs.ocamlPackages.buildDunePackage { pname = "ocamlmerlin-mlx"; version = "0.9.0"; src = mlx-repo; nativeBuildInputs = with pkgs.ocamlPackages; [ cppo ]; propagatedBuildInputs = with pkgs.ocamlPackages; [ ppxlib merlin-lib csexp ]; }; # lsp-repo = pkgs.fetchFromGitHub { # owner = "ocaml"; # repo = "ocaml-lsp"; # rev = "4483b5b9cb3c58d09cfd113394f3ced8fea11f50"; # sha256 = "+h8XzJutCT587XrLg/rC/c7TXsnm84BEtvUj4CfFqaM="; # }; # jsonrpc = pkgs.ocamlPackages.buildDunePackage { # pname = "jsonrpc"; # version = "1.23.0"; # src = lsp-repo; # }; # lsp = pkgs.ocamlPackages.buildDunePackage { # pname = "lsp"; # version = "1.23.0"; # src = lsp-repo; # propagatedBuildInputs = with pkgs.ocamlPackages; [ # yojson # uutf # ppx_yojson_conv # jsonrpc # ]; # }; # ocaml-lsp = pkgs.ocamlPackages.buildDunePackage { # pname = "ocaml-lsp-server"; # version = "1.23.0"; # src = lsp-repo; # nativeBuildInputs = with pkgs.ocamlPackages; [merlin-lib]; # propagatedBuildInputs = with pkgs.ocamlPackages; [ # lsp # jsonrpc # stdune # dune-build-info # ocamlc-loc # ocamlformat-rpc-lib # dune-rpc # re # merlin-lib # spawn # chrome-trace # fiber # camlp-streams # astring # ]; # }; in { devShells.default = pkgs.mkShell rec { ANTHROPIC_BASE_URL = "https://api.moonshot.ai/anthropic"; ANTHROPIC_AUTH_TOKEN = "sk-JXxvETDsMRTX7CP69dQZ34PTELQWVHAEk0PSxGDUh3OlnFWx"; packages = [gemini-cli]; buildInputs = nativeBuildInputs ++ (with pkgs.ocamlPackages; [utop]); nativeBuildInputs = with pkgs.ocamlPackages; [ pkgs.openjdk17 pkgs.nodejs pkgs.tailwindcss_4 pkgs.sqlite pkgs.dune_3 pkgs.ocaml pkgs.opam findlib ocamlformat # ocaml-lsp mlx ocamlmerlinmlx # ocamlformat-mlx melange-json-native ppx_rapper ppx_rapper_eio yojson eio_main piaf routes # caqti-dynload # caqti-driver-postgresql caqti-driver-sqlite3 ppx_expect logs # reason server-reason-react ]; }; }); }