{ config, pkgs, lib, caveman, oh-my-claudecode, ... }: { home.username = "l-wyatt"; home.homeDirectory = "/home/l-wyatt"; home.stateVersion = "25.11"; # Don't change after first setup # Packages for this user home.packages = with pkgs; [ kdePackages.kate # nvim firefox git zsh python3 nmap file freerdp bitwarden-desktop bitwarden-cli lunarvim minicom kicad ghostty gnupg pinentry-gnome3 gnomeExtensions.blur-my-shell gnomeExtensions.just-perfection gnomeExtensions.arc-menu freecad gtk3 # Provides org.gtk.Settings.FileChooser schema for FreeCAD nodejs # Required by claude-code and oh-my-claudecode (HUD, npm plugins) ]; # -------------------------- # | Hyprland Configuration | # -------------------------- # Set keybinds wayland.windowManager.hyprland = { enable = true; settings = { exec-once = [ "hyprpaper" ]; "$mod" = "SUPER"; bind = [ "$mod, Q, exec, konsole" "$mod, C, killactive" "$mod, M, exit" "$mod, F, exec, firefox" ]; decoration = { rounding = 10; blur.enabled = true; }; }; }; # Create hyprpaper config home.file.".config/hypr/hyprpaper.conf" = { text = '' preload = ~/Pictures/background.jpg wallpaper = eDP-1,~/Pictures/background.jpg splash = false ''; force = true; }; # Enable Zsh and configure it programs.zsh = { enable = true; oh-my-zsh.enable = true; oh-my-zsh.theme = "agnoster"; initContent = '' export SHELL=$(which zsh) alias nix-shell='nix-shell --run $SHELL' # Auto-update nixpkgs-unstable (for claude-code) on rebuild nixos-rebuild() { if [[ "$1" == "switch" || "$1" == "boot" || "$1" == "test" ]]; then echo "Updating nixpkgs-unstable for latest Claude Code..." nix flake update nixpkgs-unstable --flake /home/l-wyatt/Documents/nixos-configuration fi command sudo nixos-rebuild "$@" --flake /home/l-wyatt/Documents/nixos-configuration } nix() { if [[ $1 == "develop" ]]; then shift command nix develop "$@" -c $SHELL else command nix "$@" fi } if [ -n "$NIX_PROJECT_SHELL" ]; then PROMPT="($NIX_PROJECT_SHELL)$PROMPT" fi # Only start tmux if we're in an interactive terminal if [ -z "$TMUX" ] && [ "$TERM" != "linux" ]; then exec tmux fi ''; }; # Configure cursor theme home.pointerCursor = { gtk.enable = true; x11.enable = true; name = "Adwaita"; package = pkgs.adwaita-icon-theme; size = 24; }; # Set Ghostty as default terminal dconf.settings = { "org/gnome/desktop/default-applications/terminal" = { exec = "ghostty"; exec-arg = ""; }; "org/gnome/crypto/cache" = { enable-ssh-agent = false; }; }; # Disable GCR ssh-agent so gpg-agent handles SSH systemd.user.sockets.gcr-ssh-agent.Install.WantedBy = lib.mkForce []; # GPG configuration programs.gpg = { enable = true; settings = { keyserver = "hkps://keys.openpgp.org"; keyid-format = "0xlong"; with-fingerprint = true; personal-cipher-preferences = "AES256 AES192 AES"; personal-digest-preferences = "SHA512 SHA384 SHA256"; personal-compress-preferences = "ZLIB BZIP2 ZIP Uncompressed"; }; scdaemonSettings = { disable-ccid = true; }; }; # Manage your git configuration declaratively programs.git = { enable = true; signing = { key = "0xADCEAC560B498269"; signByDefault = true; }; settings = { user = { name = "0xWheatyz"; email = "wyatt@leeworks.dev"; }; pull.rebase = "false"; init.defaultBranch = "master"; push.autoSetupRemote = "true"; alias.lg = "log --graph --pretty=format:'%C(yellow)%h%Creset -%C(red)%d%Creset %s %Cgreen(%cr)%Creset %C(bold blue)<%an>%Creset' --abbrev-commit"; }; }; # Enable tmux (terminal multiplexing) programs.tmux = { enable = true; # Optional: customize tmux settings extraConfig = '' # Enable mouse support set -g mouse on # Start window numbering at 1 set -g base-index 1 # Set terminal colors set -g default-terminal "screen-256color" ''; }; # Neovim management - using kickstart.nvim via flake # Basic fallback config (uncomment if not using the flake) #programs.neovim = { # enable = true; # defaultEditor = true; # # # Load Lua config inline # extraLuaConfig = '' # vim.opt.number = true # vim.opt.tabstop = 2 # vim.opt.shiftwidth = 2 # vim.opt.expandtab = true # vim.opt.relativenumber = true # # require("telescope").setup {} # require("nvim-treesitter.configs").setup { highlight = { enable = true } } # ''; # # plugins = with pkgs.vimPlugins; [ # telescope-nvim # nvim-treesitter # nvim-lspconfig # gruvbox # ]; #}; # Use kickstart.nvim configuration from flake programs.neovim-kickstart.enable = true; # Claude Code skills (managed declaratively via flake inputs) home.file.".claude/skills/caveman" = { source = "${caveman}/skills/caveman"; recursive = true; }; home.file.".claude/skills/caveman-help" = { source = "${caveman}/skills/caveman-help"; recursive = true; }; home.file.".claude/skills" = { source = "${oh-my-claudecode}/skills"; recursive = true; }; # Claude Code agents (managed declaratively via flake inputs) home.file.".claude/agents" = { source = "${oh-my-claudecode}/agents"; recursive = true; }; # Claude Code configuration home.file.".claude/CLAUDE.md" = { text = builtins.readFile "${oh-my-claudecode}/CLAUDE.md" + '' ## Commit Behavior After completing each logical unit of work, use the /commit skill to stage and commit changes before proceeding to the next task. Do not batch unrelated changes into a single commit. Do not wait to be asked. ''; force = true; }; home.file.".claude/commands/commit.md" = { text = '' --- description: Stage and commit changes as a conventional commit with one logical unit per commit --- Review the current working tree with `git status` and `git diff --staged` and `git diff`. Then do the following: 1. Identify the smallest logical unit of change present. If multiple unrelated changes exist, only stage and commit one unit at a time — leave the rest unstaged. 2. Stage only the files (or hunks via `git add -p`) relevant to that logical unit. 3. Write a commit message following the Conventional Commits format: (): Types: feat, fix, docs, style, refactor, perf, test, chore, ci - scope is optional but use it when the change is clearly scoped to a module, package, or domain - description: lowercase, imperative mood, no trailing period, max ~72 chars - if the change warrants a body, add it after a blank line 4. Run `git commit` with that message. Never use `--no-verify`. 5. Report what was committed and what (if anything) remains uncommitted. ''; force = true; }; home.file.".claude/settings.json" = { text = builtins.toJSON { permissions = { allow = [ "Edit" "Write" "Bash(git:*)" "Bash(nix-shell:*)" "Bash(nix eval:*)" "Bash(nix flake check:*)" ]; }; alwaysThinkingEnabled = true; includeCoAuthoredBy = false; statusLine = { type = "command"; command = "node \${CLAUDE_CONFIG_DIR:-$HOME/.claude}/hud/omc-hud.mjs"; }; env = { CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS = "1"; OMC_PLUGIN_ROOT = "${oh-my-claudecode}"; }; teammateMode = "tmux"; }; force = true; }; programs.ssh = { enable = true; enableDefaultConfig = false; matchBlocks = { "*" = { controlMaster = "auto"; controlPersist = "1m"; controlPath = "~/.ssh/cm-%r@%h:%p"; }; "vps" = { hostname = "45.79.198.105"; user = "wyatt"; port = 22; }; # No terminal access to this machine "_JumpHost" = { hostname = "localhost"; port = 2222; user = "wyatt"; proxyJump = "vps"; }; "home" = { hostname = "10.0.0.20"; port = 22; user = "l-wyatt"; proxyJump = "_JumpHost"; }; "git" = { hostname = "10.0.1.10"; port = 22; user = "git"; }; }; # extraConfig = '' # Host * # ControlMaster auto # ControlPersist 1m # ControlPath /tmp/cm-%r@%h:%p # ''; }; }