From e73cc0c0f584864fe887e9c4e5ca61a47d71e1cc Mon Sep 17 00:00:00 2001 From: 0xrsydn Date: Tue, 21 Oct 2025 16:16:50 +0700 Subject: [PATCH] feat: configuring shell & add fish shell --- devshells/default.nix | 49 ++++++++++++++++++- flake.nix | 31 ++++++++++-- modules/darwin/home/default.nix | 8 ++- modules/darwin/system.nix | 5 +- modules/home/rsydn/base.nix | 3 +- modules/home/rsydn/shell/fish.nix | 17 +++++++ modules/home/rsydn/shell/nushell.nix | 13 ++--- .../home/rsydn/shell/oh-my-posh/default.nix | 13 +++++ modules/nixos/home/default.nix | 3 ++ modules/nixos/system.nix | 10 ++++ 10 files changed, 130 insertions(+), 22 deletions(-) create mode 100644 modules/home/rsydn/shell/fish.nix create mode 100644 modules/home/rsydn/shell/oh-my-posh/default.nix create mode 100644 modules/nixos/home/default.nix create mode 100644 modules/nixos/system.nix diff --git a/devshells/default.nix b/devshells/default.nix index 88a7781..c0c3b43 100644 --- a/devshells/default.nix +++ b/devshells/default.nix @@ -1,8 +1,50 @@ { pkgs, ... }: -pkgs.mkShell { +let + # MCP wrapper script that ensures Python is available for GUI apps + mcpNixosWrapper = pkgs.writeShellScriptBin "mcp-nixos-wrapper" '' + export PATH="${pkgs.python3}/bin:${pkgs.uv}/bin:$PATH" + exec ${pkgs.uv}/bin/uvx mcp-nixos "$@" + ''; + + # Generate MCP configs for GUI applications + mcpConfigForGUI = pkgs.writeText "mcp_settings.json" (builtins.toJSON { + mcpServers = { + nixos = { + type = "stdio"; + command = "${mcpNixosWrapper}/bin/mcp-nixos-wrapper"; + args = [ ]; + }; + }; + }); + + # Script to install MCP configs for Claude Code and Codex + installMcpConfigs = pkgs.writeShellScriptBin "install-mcp-configs" '' + set -e + echo "Installing MCP configurations..." + + mkdir -p "$HOME/.config/claude-code" + mkdir -p "$HOME/.config/codex" + + cp ${mcpConfigForGUI} "$HOME/.config/claude-code/mcp_settings.json" + cp ${mcpConfigForGUI} "$HOME/.config/codex/mcp_settings.json" + + echo "✓ Installed MCP config to ~/.config/claude-code/mcp_settings.json" + echo "✓ Installed MCP config to ~/.config/codex/mcp_settings.json" + echo "" + echo "Restart Claude Code and Codex to apply changes." + ''; + +in pkgs.mkShell { name = "default"; - packages = with pkgs; [ git nixfmt-classic uv ]; + packages = with pkgs; [ + git + nixfmt-classic + uv + python3 + mcpNixosWrapper + installMcpConfigs + ]; shellHook = '' export DOTFILES_ROOT="$PWD" export XDG_CACHE_HOME="$DOTFILES_ROOT/.cache" @@ -18,5 +60,8 @@ pkgs.mkShell { echo "Loaded default shell for dotfiles development" echo "MCP helper alias ready: mcp-nixos" + echo "" + echo "To install MCP configs for Claude Code and Codex, run:" + echo " install-mcp-configs" ''; } diff --git a/flake.nix b/flake.nix index 26b52cd..ad02f5a 100644 --- a/flake.nix +++ b/flake.nix @@ -28,7 +28,9 @@ inherit (nixpkgs.lib) genAttrs; lib = nixpkgs.lib; - systems = [ "aarch64-darwin" "x86_64-darwin" ]; + darwinSystems = [ "aarch64-darwin" "x86_64-darwin" ]; + linuxSystems = [ "x86_64-linux" "aarch64-linux" ]; + systems = darwinSystems ++ linuxSystems; forEachSystem = f: genAttrs systems (system: f system); @@ -46,7 +48,8 @@ config.allowUnfree = true; }; - sharedModules = [ ./modules/darwin/system.nix ]; + sharedDarwinModules = [ ./modules/darwin/system.nix ]; + sharedNixosModules = [ ./modules/nixos/system.nix ]; user = "rasyidanakbar"; @@ -56,14 +59,12 @@ in darwin.lib.darwinSystem { inherit system pkgs; specialArgs = { inherit inputs overlaysList user; }; - modules = sharedModules ++ extraModules ++ [ + modules = sharedDarwinModules ++ extraModules ++ [ home-manager.darwinModules.home-manager { nix.registry.self.flake = self; nixpkgs.overlays = overlaysList; - users.users.${user}.home = "/Users/${user}"; - home-manager.useGlobalPkgs = true; home-manager.useUserPackages = true; home-manager.backupFileExtension = "backup"; @@ -72,8 +73,28 @@ } ]; }; + mkNixos = { system ? "x86_64-linux", extraModules ? [ ] + , homeFile ? ./modules/nixos/home/default.nix }: + let pkgs = mkPkgs system; + in lib.nixosSystem { + inherit system pkgs; + specialArgs = { inherit inputs overlaysList user; }; + modules = sharedNixosModules ++ extraModules ++ [ + home-manager.nixosModules.home-manager + { + nix.registry.self.flake = self; + nixpkgs.overlays = overlaysList; + + home-manager.useGlobalPkgs = true; + home-manager.useUserPackages = true; + home-manager.extraSpecialArgs = { inherit inputs user; }; + home-manager.users.${user} = import homeFile; + } + ]; + }; in { darwinConfigurations = { macbook-pro = mkDarwin { }; }; + nixosConfigurations = { }; devShells = forEachSystem (system: let diff --git a/modules/darwin/home/default.nix b/modules/darwin/home/default.nix index 67fa374..d227980 100644 --- a/modules/darwin/home/default.nix +++ b/modules/darwin/home/default.nix @@ -1,5 +1,9 @@ { config, pkgs, lib, ... }: { # Import shared cross-platform home configuration - imports = - [ ../../home/rsydn/base.nix ./programs/aerospace ./programs/ghostty.nix ]; + imports = [ + ../../home/rsydn/base.nix + ../../home/rsydn/shell/nushell.nix + ./programs/aerospace + ./programs/ghostty.nix + ]; } diff --git a/modules/darwin/system.nix b/modules/darwin/system.nix index fe4f7bb..82898d4 100644 --- a/modules/darwin/system.nix +++ b/modules/darwin/system.nix @@ -25,7 +25,10 @@ environment.shells = [ pkgs.nushell ]; - users.users.${user}.shell = pkgs.nushell; + users.users.${user} = { + home = lib.mkDefault "/Users/${user}"; + shell = pkgs.nushell; + }; system = { primaryUser = user; diff --git a/modules/home/rsydn/base.nix b/modules/home/rsydn/base.nix index 3bd2242..bd8e61a 100644 --- a/modules/home/rsydn/base.nix +++ b/modules/home/rsydn/base.nix @@ -4,7 +4,6 @@ imports = [ ./programs/helix.nix ./programs/neovim.nix - ./shell/nushell.nix ./shell/tmux.nix ./devtools/ai-tools.nix ./devtools/languages.nix @@ -57,7 +56,7 @@ node.enable = true; }; - rsydn.secrets = { + rsydn.secrets = lib.mkIf pkgs.stdenv.hostPlatform.isDarwin { enable = lib.mkDefault true; defaultSopsFile = ../../../secrets/local-ai-tokens.sops.yaml; secrets = { diff --git a/modules/home/rsydn/shell/fish.nix b/modules/home/rsydn/shell/fish.nix new file mode 100644 index 0000000..a413eb2 --- /dev/null +++ b/modules/home/rsydn/shell/fish.nix @@ -0,0 +1,17 @@ +{ config, pkgs, lib, ... }: { + imports = [ ./oh-my-posh ]; + + programs.fish = { + enable = true; + interactiveShellInit = '' + set -g fish_greeting "" + set -gx EDITOR nvim + set -gx VISUAL nvim + ''; + }; + + programs.oh-my-posh.enableFishIntegration = lib.mkDefault true; + + # Ensure fish is available for login shells on Linux hosts. + home.packages = lib.mkAfter [ pkgs.fish ]; +} diff --git a/modules/home/rsydn/shell/nushell.nix b/modules/home/rsydn/shell/nushell.nix index 19188ef..a8c594d 100644 --- a/modules/home/rsydn/shell/nushell.nix +++ b/modules/home/rsydn/shell/nushell.nix @@ -1,8 +1,5 @@ { config, pkgs, lib, ... }: let - themeName = "capr4n.omp.json"; - themeSource = ./oh-my-posh/capr4n.omp.json; - themeConfigPath = "${config.xdg.configHome}/oh-my-posh/${themeName}"; profileBin = "${config.home.profileDirectory}/bin"; systemBin = "/run/current-system/sw/bin"; defaultBin = "/nix/var/nix/profiles/default/bin"; @@ -28,6 +25,8 @@ let formatPathList = paths: lib.concatMapStrings (path: " \"${path}\"\n") paths; in { + imports = [ ./oh-my-posh ]; + programs.nushell.enable = lib.mkDefault true; programs.nushell.extraConfig = '' @@ -115,11 +114,5 @@ in { load-secret "firecrawl-api-key" "FIRECRAWL_API_KEY" ''; - programs.oh-my-posh = { - enable = lib.mkDefault true; - enableNushellIntegration = lib.mkDefault true; - configFile = themeConfigPath; - }; - - xdg.configFile."oh-my-posh/${themeName}".source = themeSource; + programs.oh-my-posh.enableNushellIntegration = lib.mkDefault true; } diff --git a/modules/home/rsydn/shell/oh-my-posh/default.nix b/modules/home/rsydn/shell/oh-my-posh/default.nix new file mode 100644 index 0000000..4e38644 --- /dev/null +++ b/modules/home/rsydn/shell/oh-my-posh/default.nix @@ -0,0 +1,13 @@ +{ config, lib, ... }: +let + themeName = "capr4n.omp.json"; + themeSource = ./capr4n.omp.json; + themeConfigPath = "${config.xdg.configHome}/oh-my-posh/${themeName}"; +in { + programs.oh-my-posh = { + enable = lib.mkDefault true; + configFile = themeConfigPath; + }; + + xdg.configFile."oh-my-posh/${themeName}".source = themeSource; +} diff --git a/modules/nixos/home/default.nix b/modules/nixos/home/default.nix new file mode 100644 index 0000000..867d3dc --- /dev/null +++ b/modules/nixos/home/default.nix @@ -0,0 +1,3 @@ +{ config, pkgs, lib, ... }: { + imports = [ ../../home/rsydn/base.nix ../../home/rsydn/shell/fish.nix ]; +} diff --git a/modules/nixos/system.nix b/modules/nixos/system.nix new file mode 100644 index 0000000..74a6cc2 --- /dev/null +++ b/modules/nixos/system.nix @@ -0,0 +1,10 @@ +{ config, pkgs, lib, user, ... }: { + users.users.${user} = { + isNormalUser = lib.mkDefault true; + extraGroups = lib.mkDefault [ "wheel" "networkmanager" ]; + home = lib.mkDefault "/home/${user}"; + shell = lib.mkDefault pkgs.fish; + }; + + programs.fish.enable = lib.mkDefault true; +}