flake.nix
1{
2 description = "Local code review tool (lcr) — GitHub PR-like diff view for AI-assisted development";
3
4 inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
5
6 outputs =
7 { self, nixpkgs }:
8 let
9 systems = [
10 "x86_64-linux"
11 "aarch64-linux"
12 "x86_64-darwin"
13 "aarch64-darwin"
14 ];
15 forAllSystems = f: nixpkgs.lib.genAttrs systems (system: f system);
16 pkgJson = builtins.fromJSON (builtins.readFile ./package.json);
17 in
18 {
19 packages = forAllSystems (
20 system:
21 let
22 pkgs = nixpkgs.legacyPackages.${system};
23 nodejs = pkgs.nodejs;
24 # NOTE: pnpm 11 ignores manage-package-manager-versions=false and tries
25 # to self-download the packageManager-pinned pnpm 12.6.0. pnpm 10
26 # honors the setting and installs this lockfile (lockfileVersion 9.0).
27 pnpm = pkgs.pnpm_10;
28 lcr = pkgs.stdenv.mkDerivation (finalAttrs: {
29 pname = "local-code-review";
30 version = pkgJson.version;
31 src = ./.;
32
33 pnpmDeps = pkgs.fetchPnpmDeps {
34 inherit (finalAttrs) pname version src;
35 pnpm = pnpm;
36 fetcherVersion = 3;
37 hash = "sha256-1lXrCe9FN7JXvijG+hxIgT9SuSs83T6fxsvGwwJtAHo=";
38 };
39
40 nativeBuildInputs = [
41 nodejs
42 pnpm
43 pkgs.pnpmConfigHook
44 pkgs.makeWrapper
45 ];
46
47 buildPhase = ''
48 runHook preBuild
49 pnpm run build
50 runHook postBuild
51 '';
52
53 installPhase = ''
54 runHook preInstall
55
56 # Drop devDependencies so the runtime closure stays small.
57 # build/ copies only what it needs; node_modules must keep
58 # runtime deps (ws, simple-git, shiki, open, node-pty).
59 pnpm prune --prod
60
61 mkdir -p $out/lib/lcr
62 cp -a build bin node_modules package.json $out/lib/lcr/
63
64 makeWrapper ${nodejs}/bin/node $out/bin/lcr \
65 --add-flags "$out/lib/lcr/bin/lcr.js"
66 runHook postInstall
67 '';
68
69 meta = {
70 description = pkgJson.description;
71 homepage = "https://git.kilimanjaro.io/local-code-review";
72 license = pkgs.lib.licenses.mit;
73 mainProgram = "lcr";
74 platforms = systems;
75 };
76 });
77 in
78 {
79 inherit lcr;
80 default = lcr;
81 }
82 );
83
84 apps = forAllSystems (system: {
85 default = {
86 type = "app";
87 program = "${self.packages.${system}.lcr}/bin/lcr";
88 };
89 });
90
91 overlays.default = final: prev: {
92 lcr = self.packages.${final.stdenv.hostPlatform.system}.lcr;
93 };
94
95 formatter = forAllSystems (system: nixpkgs.legacyPackages.${system}.nixfmt);
96 };
97}