diff options
author | polwex <polwex@sortug.com> | 2025-06-27 08:46:50 +0700 |
---|---|---|
committer | polwex <polwex@sortug.com> | 2025-06-27 08:46:50 +0700 |
commit | 8be9a806a93b02eada372f3993c34bc6b2f26fea (patch) | |
tree | 28e576a39ad50aede8f849860f4f4192fd3b7402 | |
parent | f0ada28815f35f160f0e85101728d215c0f7d7f9 (diff) |
lets see geminis chops...
-rw-r--r-- | flake.nix | 27 | ||||
-rw-r--r-- | gemini.nix | 95 |
2 files changed, 122 insertions, 0 deletions
@@ -66,8 +66,35 @@ # 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 + ; + }; + # gemini-cli = pkgs.buildNpmPackage { + # name = "gemini-cli"; + # src = pkgs.fetchFromGitHub { + # owner = "google-gemini"; + # repo = "gemini-cli"; + # rev = "bf873a1d85d4400fd22c175db0f3b80a47bc27fb"; + # sha256 = "QllEB3FAhp9lVOBkAE09Sw8IqOjRpaIMXAcY8dGbgw0="; + # }; + # npmDepsHash = "qimhi2S8fnUbIq2MPU1tlvj5k9ZChY7kzxLrYqy9FXI="; + # }; in { devShells.default = pkgs.mkShell rec { + packages = [gemini-cli]; buildInputs = nativeBuildInputs ++ (with pkgs.ocamlPackages; [utop]); diff --git a/gemini.nix b/gemini.nix new file mode 100644 index 0000000..a94cac6 --- /dev/null +++ b/gemini.nix @@ -0,0 +1,95 @@ +{ + lib, + buildNpmPackage, + fetchFromGitHub, + fetchNpmDeps, + writeShellApplication, + cacert, + curl, + gnused, + jq, + nix-prefetch-github, + prefetch-npm-deps, +}: +buildNpmPackage (finalAttrs: { + pname = "gemini-cli"; + version = "0.1.5"; + + src = fetchFromGitHub { + owner = "google-gemini"; + repo = "gemini-cli"; + # Currently there's no release tag + rev = "bf873a1d85d4400fd22c175db0f3b80a47bc27fb"; + sha256 = "QllEB3FAhp9lVOBkAE09Sw8IqOjRpaIMXAcY8dGbgw0="; + }; + + npmDeps = fetchNpmDeps { + inherit (finalAttrs) src; + hash = "sha256-qimhi2S8fnUbIq2MPU1tlvj5k9ZChY7kzxLrYqy9FXI="; + }; + + preConfigure = '' + mkdir -p packages/generated + echo "export const GIT_COMMIT_INFO = { commitHash: '${finalAttrs.src.rev}' };" > packages/generated/git-commit.ts + ''; + + installPhase = '' + runHook preInstall + + mkdir -p "$out/lib" + + cp -r node_modules "$out/lib/" + + rm -f "$out/lib/node_modules/@google/gemini-cli" + rm -f "$out/lib/node_modules/@google/gemini-cli-core" + + cp -r packages/cli "$out/lib/node_modules/@google/gemini-cli" + cp -r packages/core "$out/lib/node_modules/@google/gemini-cli-core" + + mkdir -p "$out/bin" + ln -s ../lib/node_modules/@google/gemini-cli/dist/index.js "$out/bin/gemini" + + runHook postInstall + ''; + + postInstall = '' + chmod +x "$out/bin/gemini" + ''; + + passthru.updateScript = lib.getExe (writeShellApplication { + name = "gemini-cli-update-script"; + runtimeInputs = [ + cacert + curl + gnused + jq + nix-prefetch-github + prefetch-npm-deps + ]; + text = '' + latest_version=$(curl -s "https://raw.githubusercontent.com/google-gemini/gemini-cli/main/package-lock.json" | jq -r '.version') + latest_rev=$(curl -s "https://api.github.com/repos/google-gemini/gemini-cli/commits/main" | jq -r '.sha') + + src_hash=$(nix-prefetch-github google-gemini gemini-cli --rev "$latest_rev" | jq -r '.hash') + + temp_dir=$(mktemp -d) + curl -s "https://raw.githubusercontent.com/google-gemini/gemini-cli/$latest_rev/package-lock.json" > "$temp_dir/package-lock.json" + npm_deps_hash=$(prefetch-npm-deps "$temp_dir/package-lock.json") + rm -rf "$temp_dir" + + sed -i "s|version = \".*\";|version = \"$latest_version\";|" "pkgs/by-name/ge/gemini-cli/package.nix" + sed -i "s|rev = \".*\";|rev = \"$latest_rev\";|" "pkgs/by-name/ge/gemini-cli/package.nix" + sed -i "/src = fetchFromGitHub/,/};/s|hash = \".*\";|hash = \"$src_hash\";|" "pkgs/by-name/ge/gemini-cli/package.nix" + sed -i "/npmDeps = fetchNpmDeps/,/};/s|hash = \".*\";|hash = \"$npm_deps_hash\";|" "pkgs/by-name/ge/gemini-cli/package.nix" + ''; + }); + + meta = { + description = "AI agent that brings the power of Gemini directly into your terminal"; + homepage = "https://github.com/google-gemini/gemini-cli"; + license = lib.licenses.asl20; + maintainers = with lib.maintainers; [donteatoreo]; + platforms = lib.platforms.all; + mainProgram = "gemini"; + }; +}) |