adding specific dev language tooling shell config

This commit is contained in:
Rasyidan Akbar F. 2025-09-30 16:36:28 +07:00
commit 797c5769b2
5 changed files with 320 additions and 33 deletions

74
flake.lock generated
View file

@ -113,6 +113,22 @@
"type": "github" "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": { "flake-utils": {
"inputs": { "inputs": {
"systems": "systems" "systems": "systems"
@ -167,6 +183,24 @@
"type": "github" "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": { "ghostty": {
"inputs": { "inputs": {
"flake-compat": "flake-compat", "flake-compat": "flake-compat",
@ -331,7 +365,8 @@
"home-manager": "home-manager", "home-manager": "home-manager",
"nix-ai-tools": "nix-ai-tools", "nix-ai-tools": "nix-ai-tools",
"nixpkgs": "nixpkgs_2", "nixpkgs": "nixpkgs_2",
"nvim-bundle": "nvim-bundle" "nvim-bundle": "nvim-bundle",
"zig-overlay": "zig-overlay"
} }
}, },
"rust-overlay": { "rust-overlay": {
@ -416,6 +451,21 @@
"type": "github" "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": { "treefmt-nix": {
"inputs": { "inputs": {
"nixpkgs": [ "nixpkgs": [
@ -466,6 +516,28 @@
"type": "github" "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": { "zon2nix": {
"inputs": { "inputs": {
"nixpkgs": "nixpkgs" "nixpkgs": "nixpkgs"

127
flake.nix
View file

@ -17,12 +17,16 @@
nix-ai-tools.url = "github:numtide/nix-ai-tools"; nix-ai-tools.url = "github:numtide/nix-ai-tools";
nix-ai-tools.inputs.nixpkgs.follows = "nixpkgs"; nix-ai-tools.inputs.nixpkgs.follows = "nixpkgs";
zig-overlay.url = "github:mitchellh/zig-overlay";
zig-overlay.inputs.nixpkgs.follows = "nixpkgs";
}; };
outputs = outputs =
inputs@{ self, nixpkgs, darwin, home-manager, ghostty, nix-ai-tools, ... }: inputs@{ self, nixpkgs, darwin, home-manager, ghostty, nix-ai-tools, ... }:
let let
inherit (nixpkgs.lib) genAttrs; inherit (nixpkgs.lib) genAttrs;
lib = nixpkgs.lib;
systems = [ "aarch64-darwin" "x86_64-darwin" ]; systems = [ "aarch64-darwin" "x86_64-darwin" ];
@ -30,6 +34,11 @@
overlaysList = [ ghostty.overlays.default ]; overlaysList = [ ghostty.overlays.default ];
zigOverlay = if builtins.hasAttr "zig-overlay" inputs then
inputs."zig-overlay"
else
null;
mkPkgs = system: mkPkgs = system:
import nixpkgs { import nixpkgs {
inherit system; inherit system;
@ -67,16 +76,116 @@
darwinConfigurations = { macbook-pro = mkDarwin { }; }; darwinConfigurations = { macbook-pro = mkDarwin { }; };
devShells = forEachSystem (system: devShells = forEachSystem (system:
let pkgs = mkPkgs system; let
in { pkgs = mkPkgs system;
default = pkgs.mkShell { python = if builtins.hasAttr "python312" pkgs then
packages = with pkgs; [ git nixfmt-classic ]; pkgs.python312
shellHook = '' else
echo "Loaded default shell for ${system}" 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); formatter = forEachSystem (system: (mkPkgs system).nixfmt-classic);

View file

@ -12,28 +12,9 @@ in {
packages = mkOption { packages = mkOption {
type = types.listOf types.package; type = types.listOf types.package;
default = with pkgs; [ default = with pkgs; [ tailscale ];
ast-grep description =
duckdb "System packages that must be available globally across macOS.";
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.";
}; };
}; };

View file

@ -8,6 +8,7 @@
./shell/nushell.nix ./shell/nushell.nix
./shell/tmux.nix ./shell/tmux.nix
./devtools/ai-tools.nix ./devtools/ai-tools.nix
./devtools/languages.nix
./devtools/default.nix ./devtools/default.nix
]; ];
@ -21,6 +22,27 @@
rsydn.devTools = { rsydn.devTools = {
enable = lib.mkDefault true; 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;
} }

View file

@ -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);
};
}