feat(modules): system package catalog and development tooling

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Padreug 2026-06-28 06:48:07 +02:00
commit 2289f91048
2 changed files with 677 additions and 0 deletions

475
modules/development.nix Normal file
View file

@ -0,0 +1,475 @@
{
config,
pkgs,
lib,
...
}:
let
inherit (lib) mkIf;
cfg = config.omni;
omni = config.omni.lib;
in
{
config = mkIf (config.omni.packs.development.enable or false) {
# Development tools
environment.systemPackages = with pkgs; [
# Version control
git
git-lfs
lazygit
gh
gitlab
hub
# Editors and IDEs
# neovim (configured via home-manager programs.neovim)
claude-code
opencode
pi-coding-agent
vscode
vim
emacs
# Language servers and tools
# Nix
nil
nixfmt
statix
deadnix
nixd
alejandra
# Rust
rustc
cargo
rustfmt
rust-analyzer
clippy
cargo-watch
cargo-edit
cargo-audit
bacon
# Go
go
gopls
gotools
go-tools
golangci-lint
delve
gomodifytags
gotests
impl
# Python
python3
python3Packages.pip
python3Packages.virtualenv
python3Packages.black
python3Packages.pylint
python3Packages.pytest
python3Packages.ipython
pyright
ruff
# Node.js
nodejs
pnpm
yarn
typescript
typescript-language-server
eslint
prettier
nodemon
deno
bun
# C/C++
gcc
clang
cmake
gnumake
gdb
lldb
clang-tools
ccls
bear
valgrind
# Java
jdk
maven
gradle
jdt-language-server
# Julia
julia-bin
# Database tools
postgresql
mysql84
sqlite
redis
mongodb
dbeaver-bin
# Container tools
docker
docker-compose
podman
buildah
skopeo
dive
lazydocker
# Kubernetes tools
kubectl
kubernetes-helm
k9s
kind
minikube
kustomize
kubectx
stern
kubecolor
# Cloud tools
awscli2
google-cloud-sdk
azure-cli
terraform
terragrunt
ansible
vagrant
packer
# API development
httpie
curl
postman
insomnia
grpcurl
evans
# Build tools
bazel
meson
ninja
scons
# Documentation tools
mdbook
hugo
mkdocs
sphinx
# Performance tools
hyperfine
flamegraph
perf-tools
heaptrack
# Network tools
wireshark
tcpdump
nmap
netcat
socat
mtr
# Misc development utilities
jq
yq-go
fx
direnv
watchexec
entr
tmux
tmuxinator
asciinema
tokei
cloc
tree-sitter
# Custom development scripts
(writeShellScriptBin "dev-postgres" ''
#!/usr/bin/env bash
echo "Starting PostgreSQL development container..."
docker run --rm -d \
--name dev-postgres \
-e POSTGRES_PASSWORD=postgres \
-p 5432:5432 \
postgres:15-alpine
echo "PostgreSQL running on localhost:5432"
echo "Username: postgres, Password: postgres"
echo "Stop with: docker stop dev-postgres"
'')
(writeShellScriptBin "dev-redis" ''
#!/usr/bin/env bash
echo "Starting Redis development container..."
docker run --rm -d \
--name dev-redis \
-p 6379:6379 \
redis:alpine
echo "Redis running on localhost:6379"
echo "Stop with: docker stop dev-redis"
'')
(writeShellScriptBin "dev-mysql" ''
#!/usr/bin/env bash
echo "Starting MySQL development container..."
docker run --rm -d \
--name dev-mysql \
-e MYSQL_ROOT_PASSWORD=mysql \
-p 3306:3306 \
mysql:8
echo "MySQL running on localhost:3306"
echo "Username: root, Password: mysql"
echo "Stop with: docker stop dev-mysql"
'')
(writeShellScriptBin "dev-mongodb" ''
#!/usr/bin/env bash
echo "Starting MongoDB development container..."
docker run --rm -d \
--name dev-mongodb \
-p 27017:27017 \
mongo:latest
echo "MongoDB running on localhost:27017"
echo "Stop with: docker stop dev-mongodb"
'')
(writeShellScriptBin "dev-env" ''
#!/usr/bin/env bash
# Create a development shell for a specific language
case "$1" in
rust)
nix-shell -p rustc cargo rustfmt rust-analyzer clippy
;;
go)
nix-shell -p go gopls gotools
;;
python)
nix-shell -p python3 python3Packages.pip python3Packages.virtualenv
;;
node)
nix-shell -p nodejs pnpm
;;
c|cpp)
nix-shell -p gcc cmake gnumake gdb
;;
julia)
nix-shell -p julia-bin
;;
*)
echo "Usage: dev-env <language>"
echo "Supported languages: rust, go, python, node, c, cpp, julia"
exit 1
;;
esac
'')
(writeShellScriptBin "dev-project" ''
#!/usr/bin/env bash
# Initialize a new development project
PROJECT_NAME="$1"
PROJECT_TYPE="$2"
if [ -z "$PROJECT_NAME" ] || [ -z "$PROJECT_TYPE" ]; then
echo "Usage: dev-project <name> <type>"
echo "Types: rust, go, python, node, nix"
exit 1
fi
mkdir -p "$PROJECT_NAME"
cd "$PROJECT_NAME"
case "$PROJECT_TYPE" in
rust)
cargo init
echo "use flake" > .envrc
cat > flake.nix << 'EOF'
{
description = "Rust development environment";
inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
outputs = { self, nixpkgs }:
let pkgs = nixpkgs.legacyPackages.x86_64-linux;
in {
devShells.x86_64-linux.default = pkgs.mkShell {
packages = with pkgs; [ rustc cargo rustfmt rust-analyzer clippy ];
};
};
}
EOF
;;
go)
go mod init "$PROJECT_NAME"
echo "use flake" > .envrc
cat > flake.nix << 'EOF'
{
description = "Go development environment";
inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
outputs = { self, nixpkgs }:
let pkgs = nixpkgs.legacyPackages.x86_64-linux;
in {
devShells.x86_64-linux.default = pkgs.mkShell {
packages = with pkgs; [ go gopls gotools ];
};
};
}
EOF
;;
python)
echo "use flake" > .envrc
cat > flake.nix << 'EOF'
{
description = "Python development environment";
inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
outputs = { self, nixpkgs }:
let pkgs = nixpkgs.legacyPackages.x86_64-linux;
in {
devShells.x86_64-linux.default = pkgs.mkShell {
packages = with pkgs; [
python3 python3Packages.pip python3Packages.virtualenv
];
shellHook = "python -m venv .venv && source .venv/bin/activate";
};
};
}
EOF
;;
node)
npm init -y
echo "use flake" > .envrc
cat > flake.nix << 'EOF'
{
description = "Node.js development environment";
inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
outputs = { self, nixpkgs }:
let pkgs = nixpkgs.legacyPackages.x86_64-linux;
in {
devShells.x86_64-linux.default = pkgs.mkShell {
packages = with pkgs; [ nodejs pnpm ];
};
};
}
EOF
;;
nix)
echo "use flake" > .envrc
cat > flake.nix << 'EOF'
{
description = "Nix development environment";
inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
outputs = { self, nixpkgs }:
let pkgs = nixpkgs.legacyPackages.x86_64-linux;
in {
packages.x86_64-linux.default = pkgs.hello;
devShells.x86_64-linux.default = pkgs.mkShell {
packages = with pkgs; [ nixfmt nil ];
};
};
}
EOF
;;
*)
echo "Unknown project type: $PROJECT_TYPE"
exit 1
;;
esac
git init
direnv allow
echo "Project '$PROJECT_NAME' created with $PROJECT_TYPE template"
echo "Run 'direnv allow' to activate the development environment"
'')
];
# Development services
services = {
# PostgreSQL
postgresql = {
enable = false; # Set to true to enable
package = pkgs.postgresql_15;
dataDir = "/var/lib/postgresql/15";
authentication = ''
local all all trust
host all all 127.0.0.1/32 trust
host all all ::1/128 trust
'';
};
# Redis
redis.servers."" = {
enable = false; # Set to true to enable
port = 6379;
bind = "127.0.0.1";
};
# MySQL/MariaDB
mysql = {
enable = false; # Set to true to enable
package = pkgs.mariadb;
settings = {
mysqld = {
bind-address = "127.0.0.1";
port = 3306;
};
};
};
};
# VSCode settings
environment.variables = {
# Enable VSCode to use Wayland
NIXOS_OZONE_WL = "1";
};
# Development shell environments
programs.direnv = {
enable = true;
nix-direnv.enable = true;
};
# Git configuration
programs.git = {
enable = true;
lfs.enable = true;
config = {
init.defaultBranch = "main";
core = {
editor = "nvim";
autocrlf = "input";
};
pull.rebase = false;
push.autoSetupRemote = true;
};
};
# Enable lorri for automatic nix-shell
services.lorri.enable = true;
# nix-ld: lets unpatched binaries (Julia native deps like Makie/CUDA/MKL,
# vendor SDKs, etc.) dlopen shared libraries at runtime. Libraries listed
# here become available via $NIX_LD_LIBRARY_PATH.
programs.nix-ld = {
enable = true;
libraries = with pkgs; [
libGL
libglvnd
libx11
];
};
};
}