nix-config/modules/home-manager-modules/programs/vscode/claudeDev.nix

111 lines
3.5 KiB
Nix

{
lib,
pkgs,
config,
inputs,
...
}: let
pkgsRepositories = pkgs.nix-vscode-extensions.forVSCodeVersion config.programs.vscode.package.version;
pkgsRepository = pkgsRepositories.open-vsx;
mcp-nixos = inputs.mcp-nixos.packages.${pkgs.stdenv.hostPlatform.system}.default;
anyProfileHasMcpNixos = lib.any (
profile:
profile.extraExtensions.claudeDev.enable
&& profile.extraExtensions.claudeDev.mcp.nixos.enable
) (lib.attrValues config.programs.vscode.profiles);
anyProfileHasMcpEslint = lib.any (
profile:
profile.extraExtensions.claudeDev.enable
&& profile.extraExtensions.claudeDev.mcp.eslint.enable
) (lib.attrValues config.programs.vscode.profiles);
anyProfileHasMcpVitest = lib.any (
profile:
profile.extraExtensions.claudeDev.enable
&& profile.extraExtensions.claudeDev.mcp.vitest.enable
) (lib.attrValues config.programs.vscode.profiles);
anyProfileHasMcpSleep = lib.any (
profile:
profile.extraExtensions.claudeDev.enable
&& profile.extraExtensions.claudeDev.mcp.sleep.enable
) (lib.attrValues config.programs.vscode.profiles);
anyProfileHasMcp = anyProfileHasMcpNixos || anyProfileHasMcpEslint || anyProfileHasMcpVitest || anyProfileHasMcpSleep;
in {
options.programs.vscode.profiles = lib.mkOption {
type = lib.types.attrsOf (lib.types.submodule ({config, ...}: {
options = {
extraExtensions.claudeDev = {
enable = lib.mkEnableOption "should the claude-dev extension for vscode be enabled";
extension = lib.mkPackageOption pkgsRepository "claude-dev" {
default = ["saoudrizwan" "claude-dev"];
};
mcp = {
nixos = {
enable = lib.mkEnableOption "enable NixOS MCP server for Claude Dev";
};
eslint = {
enable = lib.mkEnableOption "enable ESLint MCP server for Claude Dev";
};
vitest = {
enable = lib.mkEnableOption "enable Vitest MCP server for Claude Dev";
};
sleep = {
enable = lib.mkEnableOption "enable Sleep MCP server for Claude Dev";
};
};
};
};
config = lib.mkIf config.extraExtensions.claudeDev.enable {
extensions = [
config.extraExtensions.claudeDev.extension
];
};
}));
};
config = lib.mkMerge [
(lib.mkIf anyProfileHasMcpNixos {
home.packages = [
mcp-nixos
];
})
(lib.mkIf anyProfileHasMcp {
home.file."${config.xdg.configHome}/VSCodium/User/globalStorage/saoudrizwan.claude-dev/settings/cline_mcp_settings.json" = {
text = builtins.toJSON {
mcpServers =
(lib.optionalAttrs anyProfileHasMcpNixos {
nixos = {
command = "${mcp-nixos}/bin/mcp-nixos";
};
})
// (lib.optionalAttrs anyProfileHasMcpEslint {
eslint = {
command = "${pkgs.nodejs}/bin/npx";
args = ["-y" "@eslint/mcp@latest"];
};
})
// (lib.optionalAttrs anyProfileHasMcpVitest {
vitest = {
command = "${pkgs.nodejs}/bin/npx";
args = ["-y" "@djankies/vitest-mcp"];
};
})
// (lib.optionalAttrs anyProfileHasMcpSleep {
sleep-mcp = {
command = "${pkgs.nodejs}/bin/npx";
args = ["-y" "sleep-mcp"];
};
});
};
force = true;
};
})
];
}