diff --git a/modules/development.nix b/modules/development.nix new file mode 100644 index 0000000..6b5025e --- /dev/null +++ b/modules/development.nix @@ -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 " + 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 " + 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 + ]; + }; + + }; +} diff --git a/modules/packages.nix b/modules/packages.nix new file mode 100644 index 0000000..57c4eab --- /dev/null +++ b/modules/packages.nix @@ -0,0 +1,202 @@ +{ + config, + pkgs, + lib, + ... +}: + +let + inherit (lib) + mkEnableOption + mkOption + mkIf + types + optionals + ; + cfg = config.omni; + omni = config.omni.lib; +in +{ + options.omni.packages = { + enable = mkEnableOption "Omnixient packages"; + + exclude = mkOption { + type = types.listOf types.str; + default = [ ]; + example = [ + "discord" + "spotify" + "steam" + ]; + description = "List of package names to exclude from installation"; + }; + + categories = { + base = mkEnableOption "Base system packages" // { + default = true; + }; + }; + }; + + config = mkIf (cfg.enable or true) { + # Wire package categories to feature flags via mkDefault (overridable) + omni.packages.categories = { + }; + + environment.systemPackages = + with pkgs; + omni.filterPackages ( + # Base system packages (always installed) + [ + # Core utilities + coreutils + util-linux + binutils + pciutils + usbutils + lshw + + # File management + file + tree + ncdu + duf + dust + + # Networking + iproute2 + iputils + dnsutils + nettools + nmap + wget + curl + aria2 + + # Archives + zip + unzip + p7zip + rar + unrar + xz + + # System monitoring + btop + htop + iotop + iftop + nethogs + lsof + sysstat + + # Text processing + vim + gnused + gawk + jq + yq-go + ripgrep + fd + bat + eza + fzf + zoxide + + # Version control + git + git-lfs + lazygit + gh + + # Terminal multiplexers + tmux + screen + + # System tools + rsync + rclone + age + sops + gnupg + pass + pwgen + + # Shell and prompts + bash + zsh + fish + starship + oh-my-posh + + # Package management helpers + nix-index + nix-tree + nix-diff + nixfmt + nil + statix + deadnix + cachix + lorri + direnv + ] + ); # End of filterPackages + + # Font packages + fonts.packages = with pkgs; [ + # Nerd fonts (for icons in terminal) + nerd-fonts.jetbrains-mono + nerd-fonts.fira-code + nerd-fonts.hack + nerd-fonts.iosevka + nerd-fonts.meslo-lg + nerd-fonts.sauce-code-pro + nerd-fonts.ubuntu-mono + nerd-fonts.droid-sans-mono + nerd-fonts.roboto-mono + nerd-fonts.inconsolata + + # System fonts + noto-fonts + noto-fonts-cjk-sans + noto-fonts-color-emoji + liberation_ttf + ubuntu-classic + roboto + open-sans + lato + + # Programming fonts + jetbrains-mono + fira-code + hasklig + victor-mono + + # Icon fonts + font-awesome + material-icons + material-design-icons + ]; + + # Enable font configuration + fonts.fontconfig = { + enable = true; + defaultFonts = { + serif = [ + "Noto Serif" + "Liberation Serif" + ]; + sansSerif = [ + "Noto Sans" + "Liberation Sans" + ]; + monospace = [ + "JetBrainsMono Nerd Font" + "Noto Sans Mono" + ]; + emoji = [ "Noto Color Emoji" ]; + }; + }; + }; +}