From 3fed4112c4fab80fe770a6d2636d11c33d59076e Mon Sep 17 00:00:00 2001 From: Malo Bourgon Date: Mon, 24 Mar 2025 13:54:31 -0700 Subject: [PATCH] claude-code: add module --- modules/modules.nix | 1 + modules/programs/claude-code.nix | 75 +++++++++++++++++++ tests/default.nix | 2 + .../modules/programs/claude-code/default.nix | 1 + tests/modules/programs/claude-code/test.nix | 17 +++++ 5 files changed, 96 insertions(+) create mode 100644 modules/programs/claude-code.nix create mode 100644 tests/modules/programs/claude-code/default.nix create mode 100644 tests/modules/programs/claude-code/test.nix diff --git a/modules/modules.nix b/modules/modules.nix index 68bdf73e3..522624bf6 100644 --- a/modules/modules.nix +++ b/modules/modules.nix @@ -81,6 +81,7 @@ let ./programs/cava.nix ./programs/cavalier.nix ./programs/chromium.nix + ./programs/claude-code.nix ./programs/cmus.nix ./programs/command-not-found/command-not-found.nix ./programs/comodoro.nix diff --git a/modules/programs/claude-code.nix b/modules/programs/claude-code.nix new file mode 100644 index 000000000..61c3b645e --- /dev/null +++ b/modules/programs/claude-code.nix @@ -0,0 +1,75 @@ +{ config, lib, pkgs, ... }: + +let + inherit (lib) mkIf mkOption types; + cfg = config.programs.claude-code; +in { + meta.maintainers = with lib.maintainers; [ malo ]; + + options.programs.claude-code = { + enable = lib.mkEnableOption "Claude Code CLI"; + + package = lib.mkPackageOption pkgs "claude-code" { }; + + disableAutoUpdate = mkOption { + type = types.bool; + default = true; + description = '' + Whether to disable the automatic update check on startup. + This is recommended when using home-manager to manage {command}`claude`. + ''; + }; + + enableOptionalDependencies = mkOption { + type = types.bool; + default = false; + description = '' + Whether to install the optional dependencies for {command}`claude`. + This includes: + - {command}`git` (for git operations) + - {command}`rg` (for code search) + - {command}`gh` (GitHub CLI, for GitHub operations) + - {command}`glab` (GitLab CLI, for GitLab operations) + ''; + }; + + withGitHubCLI = mkOption { + type = types.bool; + default = cfg.enableOptionalDependencies; + description = '' + Whether to enable GitHub CLI ({command}`gh`) as a dependency. + This is useful if you work with GitHub repositories. + + Defaults to the value of {option}`programs.claude-code.enableOptionalDependencies`. + ''; + }; + + withGitLabCLI = mkOption { + type = types.bool; + default = cfg.enableOptionalDependencies; + description = '' + Whether to install GitLab CLI ({command}`glab`) as a dependency. + This is useful if you work with GitLab repositories. + + Defaults to the value of {option}`programs.claude-code.enableOptionalDependencies`. + ''; + }; + }; + + config = mkIf cfg.enable { + home.packages = [ cfg.package ] ++ lib.optional cfg.withGitLabCLI pkgs.glab; + + # Enable integrated modules for dependencies when needed + programs.git.enable = mkIf cfg.enableOptionalDependencies true; + programs.gh.enable = mkIf cfg.withGitHubCLI true; + programs.ripgrep.enable = mkIf cfg.enableOptionalDependencies true; + + # Add activation script to disable auto-updates if the user wants that + home.activation.disableClaudeAutoUpdates = lib.mkIf cfg.disableAutoUpdate + (lib.hm.dag.entryAfter [ "writeBoundary" ] '' + $DRY_RUN_CMD ${ + lib.getExe cfg.package + } config set -g autoUpdaterStatus disabled || true + ''); + }; +} diff --git a/tests/default.nix b/tests/default.nix index 427f4e87a..128985238 100644 --- a/tests/default.nix +++ b/tests/default.nix @@ -83,6 +83,7 @@ let "btop" "carapace" "cava" + "claude-code" "cmus" "comodoro" "darcs" @@ -294,6 +295,7 @@ in import nmtSrc { ./modules/programs/btop ./modules/programs/carapace ./modules/programs/cava + ./modules/programs/claude-code ./modules/programs/cmus ./modules/programs/comodoro ./modules/programs/darcs diff --git a/tests/modules/programs/claude-code/default.nix b/tests/modules/programs/claude-code/default.nix new file mode 100644 index 000000000..82ca7ddce --- /dev/null +++ b/tests/modules/programs/claude-code/default.nix @@ -0,0 +1 @@ +{ claude-code = ./test.nix; } diff --git a/tests/modules/programs/claude-code/test.nix b/tests/modules/programs/claude-code/test.nix new file mode 100644 index 000000000..7ae9889f2 --- /dev/null +++ b/tests/modules/programs/claude-code/test.nix @@ -0,0 +1,17 @@ +{ pkgs, ... }: + +{ + nixpkgs.overlays = [ + (self: super: { + claude-code = pkgs.writeShellScriptBin "claude" '' + echo "Claude Code CLI mock" + ''; + }) + ]; + + programs.claude-code = { enable = true; }; + + nmt.script = '' + assertFileRegex activate "claude config set -g autoUpdaterStatus disabled" + ''; +}