From 797c5769b2dc01ae7c1ed236899b38ed8009234a Mon Sep 17 00:00:00 2001 From: 0xrsydn Date: Tue, 30 Sep 2025 16:36:28 +0700 Subject: [PATCH] adding specific dev language tooling shell config --- flake.lock | 74 ++++++++++++- flake.nix | 127 ++++++++++++++++++++-- modules/darwin/devtools.nix | 25 +---- modules/home/rsydn/base.nix | 24 +++- modules/home/rsydn/devtools/languages.nix | 103 ++++++++++++++++++ 5 files changed, 320 insertions(+), 33 deletions(-) create mode 100644 modules/home/rsydn/devtools/languages.nix diff --git a/flake.lock b/flake.lock index acb0b2d..9c31da9 100644 --- a/flake.lock +++ b/flake.lock @@ -113,6 +113,22 @@ "type": "github" } }, + "flake-compat_3": { + "flake": false, + "locked": { + "lastModified": 1747046372, + "narHash": "sha256-CIVLLkVgvHYbgI2UpXvIIBJ12HWgX+fjA8Xf8PUmqCY=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "9100a0f413b0c601e0533d1d94ffd501ce2e7885", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, "flake-utils": { "inputs": { "systems": "systems" @@ -167,6 +183,24 @@ "type": "github" } }, + "flake-utils_4": { + "inputs": { + "systems": "systems_5" + }, + "locked": { + "lastModified": 1731533236, + "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, "ghostty": { "inputs": { "flake-compat": "flake-compat", @@ -331,7 +365,8 @@ "home-manager": "home-manager", "nix-ai-tools": "nix-ai-tools", "nixpkgs": "nixpkgs_2", - "nvim-bundle": "nvim-bundle" + "nvim-bundle": "nvim-bundle", + "zig-overlay": "zig-overlay" } }, "rust-overlay": { @@ -416,6 +451,21 @@ "type": "github" } }, + "systems_5": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + }, "treefmt-nix": { "inputs": { "nixpkgs": [ @@ -466,6 +516,28 @@ "type": "github" } }, + "zig-overlay": { + "inputs": { + "flake-compat": "flake-compat_3", + "flake-utils": "flake-utils_4", + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1748261582, + "narHash": "sha256-3i0IL3s18hdDlbsf0/E+5kyPRkZwGPbSFngq5eToiAA=", + "owner": "mitchellh", + "repo": "zig-overlay", + "rev": "aafb1b093fb838f7a02613b719e85ec912914221", + "type": "github" + }, + "original": { + "owner": "mitchellh", + "repo": "zig-overlay", + "type": "github" + } + }, "zon2nix": { "inputs": { "nixpkgs": "nixpkgs" diff --git a/flake.nix b/flake.nix index b78d5b2..71c7136 100644 --- a/flake.nix +++ b/flake.nix @@ -17,12 +17,16 @@ nix-ai-tools.url = "github:numtide/nix-ai-tools"; nix-ai-tools.inputs.nixpkgs.follows = "nixpkgs"; + + zig-overlay.url = "github:mitchellh/zig-overlay"; + zig-overlay.inputs.nixpkgs.follows = "nixpkgs"; }; outputs = inputs@{ self, nixpkgs, darwin, home-manager, ghostty, nix-ai-tools, ... }: let inherit (nixpkgs.lib) genAttrs; + lib = nixpkgs.lib; systems = [ "aarch64-darwin" "x86_64-darwin" ]; @@ -30,6 +34,11 @@ overlaysList = [ ghostty.overlays.default ]; + zigOverlay = if builtins.hasAttr "zig-overlay" inputs then + inputs."zig-overlay" + else + null; + mkPkgs = system: import nixpkgs { inherit system; @@ -67,16 +76,116 @@ darwinConfigurations = { macbook-pro = mkDarwin { }; }; devShells = forEachSystem (system: - let pkgs = mkPkgs system; - in { - default = pkgs.mkShell { - packages = with pkgs; [ git nixfmt-classic ]; - shellHook = '' - echo "Loaded default shell for ${system}" - ''; - }; + let + pkgs = mkPkgs system; + python = if builtins.hasAttr "python312" pkgs then + pkgs.python312 + else + pkgs.python3; - }); + zigPackages = + if zigOverlay != null && builtins.hasAttr "packages" zigOverlay then + zigOverlay.packages + else + { }; + + zigCandidate = + if zigOverlay != null && system == "aarch64-darwin" then + lib.attrByPath [ system "master" "zig" ] null zigPackages + else + null; + + zigCandidateBroken = if zigCandidate != null then + if zigCandidate ? meta && zigCandidate.meta ? broken then + zigCandidate.meta.broken + else + false + else + true; + + zigFallback = pkgs.zig; + zigFallbackBroken = + if zigFallback ? meta && zigFallback.meta ? broken then + zigFallback.meta.broken + else + false; + + zigPackage = + if zigCandidate != null && zigCandidateBroken == false then + zigCandidate + else if zigFallbackBroken == false then + zigFallback + else + null; + + zlsBroken = if pkgs.zls ? meta && pkgs.zls.meta ? broken then + pkgs.zls.meta.broken + else + false; + + zigShell = + lib.optionalAttrs (zigPackage != null && zlsBroken == false) { + zig-nightly = pkgs.mkShell { + name = "zig-nightly"; + packages = + [ zigPackage pkgs.zls pkgs.pkg-config pkgs.cmake pkgs.gdb ]; + shellHook = '' + mkdir -p "$PWD/.cache/zig" + export ZIG_GLOBAL_CACHE_DIR="$PWD/.cache/zig" + echo "Zig shell using ${zigPackage.pname or "zig"} ${ + zigPackage.version or "" + }" + ''; + }; + }; + + baseShells = { + default = pkgs.mkShell { + name = "default"; + packages = with pkgs; [ git nixfmt-classic ]; + shellHook = '' + echo "Loaded default shell for ${system}" + ''; + }; + + python-uv = pkgs.mkShell { + name = "python-uv"; + packages = [ python pkgs.uv pkgs.ruff pkgs.pyright ]; + shellHook = '' + export UV_PYTHON="${python}/bin/python3" + export UV_LINK_MODE=copy + echo "Python (uv) shell ready" + ''; + }; + + go = pkgs.mkShell { + name = "go"; + packages = with pkgs; [ go gopls golangci-lint delve git ]; + shellHook = '' + mkdir -p "$PWD/.cache/go" "$PWD/.cache/gomod" + export GOPATH="$PWD/.cache/go" + export GOMODCACHE="$PWD/.cache/gomod" + echo "Go toolchain shell ready" + ''; + }; + + web-bun = pkgs.mkShell { + name = "web-bun"; + packages = with pkgs; [ + bun + nodejs_20 + yarn + esbuild + vscode-langservers-extracted + ]; + shellHook = '' + mkdir -p "$PWD/.cache/bun" + export BUN_INSTALL_CACHE="$PWD/.cache/bun" + echo "Bun/Node web shell ready" + ''; + }; + }; + in baseShells // zigShell); formatter = forEachSystem (system: (mkPkgs system).nixfmt-classic); diff --git a/modules/darwin/devtools.nix b/modules/darwin/devtools.nix index 4a5581b..6b94a53 100644 --- a/modules/darwin/devtools.nix +++ b/modules/darwin/devtools.nix @@ -12,28 +12,9 @@ in { packages = mkOption { type = types.listOf types.package; - default = with pkgs; [ - ast-grep - duckdb - ffmpeg - fzf - htop - jetbrains-mono - jq - lazydocker - lazygit - lorri - neovim - pandoc - ripgrep - tree - vim - yq - tmux - tailscale - wget - ]; - description = "System packages to install for development tooling."; + default = with pkgs; [ tailscale ]; + description = + "System packages that must be available globally across macOS."; }; }; diff --git a/modules/home/rsydn/base.nix b/modules/home/rsydn/base.nix index 5aab84a..1ce3aaa 100644 --- a/modules/home/rsydn/base.nix +++ b/modules/home/rsydn/base.nix @@ -8,6 +8,7 @@ ./shell/nushell.nix ./shell/tmux.nix ./devtools/ai-tools.nix + ./devtools/languages.nix ./devtools/default.nix ]; @@ -21,6 +22,27 @@ rsydn.devTools = { enable = lib.mkDefault true; - packages = with pkgs; [ bun cloudflared ]; + packages = with pkgs; [ + ast-grep + cloudflared + ffmpeg + fzf + htop + jetbrains-mono + jq + lazydocker + lazygit + lorri + neovim + pandoc + ripgrep + tmux + tree + vim + wget + yq + ]; }; + + rsydn.languages.enable = lib.mkDefault true; } diff --git a/modules/home/rsydn/devtools/languages.nix b/modules/home/rsydn/devtools/languages.nix new file mode 100644 index 0000000..369b170 --- /dev/null +++ b/modules/home/rsydn/devtools/languages.nix @@ -0,0 +1,103 @@ +{ config, lib, pkgs, ... }: +let + inherit (lib) mkEnableOption mkOption mkIf types warn unique; + cfg = config.rsydn.languages; + + hasPkg = name: builtins.hasAttr name pkgs; + getPkg = name: if hasPkg name then pkgs.${name} else null; + + mkToolOption = { name, defaultPackage, description }: + mkOption { + type = types.submodule { + options = { + enable = mkOption { + type = types.bool; + default = defaultPackage != null; + description = "Enable ${name} tooling globally."; + }; + package = mkOption { + type = types.nullOr types.package; + default = defaultPackage; + description = + "Package derivation to install for ${name}. Set to null to skip."; + }; + }; + }; + default = { + enable = defaultPackage != null; + package = defaultPackage; + }; + description = description; + }; + + mkToolPackages = specs: + builtins.concatMap (tool: + let toolCfg = tool.cfg; + in if toolCfg.enable then + if toolCfg.package != null then + [ toolCfg.package ] + else + warn "rsydn.languages.${tool.name}: package is null, skipping" [ ] + else + [ ]) specs; + + uvPackage = getPkg "uv"; + goPackage = getPkg "go"; + nodePackage = if builtins.hasAttr "nodejs_20" pkgs then + pkgs.nodejs_20 + else + getPkg "nodejs"; + + toolSpecs = [ + { + name = "uv"; + cfg = cfg.uv; + defaultPackage = uvPackage; + } + { + name = "go"; + cfg = cfg.go; + defaultPackage = goPackage; + } + { + name = "node"; + cfg = cfg.node; + defaultPackage = nodePackage; + } + ]; + + languagePackages = mkToolPackages toolSpecs; + +in { + options.rsydn.languages = { + enable = mkEnableOption "Language tooling packages for everyday workflows"; + + uv = mkToolOption { + name = "uv"; + defaultPackage = uvPackage; + description = "Python package installer and virtualenv manager."; + }; + + go = mkToolOption { + name = "Go"; + defaultPackage = goPackage; + description = "Go compiler and GOPATH toolchain."; + }; + + node = mkToolOption { + name = "Node.js"; + defaultPackage = nodePackage; + description = "Node.js runtime for CLI tooling."; + }; + + extraPackages = mkOption { + type = types.listOf types.package; + default = [ ]; + description = "Additional language tooling packages to install globally."; + }; + }; + + config = mkIf cfg.enable { + home.packages = unique (languagePackages ++ cfg.extraPackages); + }; +}