diff --git a/Makefile b/Makefile index 6d727f521..573a9d297 100644 --- a/Makefile +++ b/Makefile @@ -933,6 +933,18 @@ lua-check-neovim: ## Check Neovim configuration. echo "❌ Neovim configuration has errors"; \ exit 1; \ fi + @echo "🔑 Checking for keymap conflicts..." + @TMPFILE=$$(mktemp /tmp/nvim-keymap-check-XXXXXX.lua); \ + OVERLAPS=$$(nvim -u "$(PWD)/home-manager/programs/neovim/init.lua" --headless "$$TMPFILE" \ + -c "checkhealth which-key" -c "qa" 2>&1 | grep "WARNING" | grep -i "overlaps with"); \ + rm -f "$$TMPFILE"; \ + if [ -n "$$OVERLAPS" ]; then \ + echo "❌ Keymap overlaps found:"; \ + echo "$$OVERLAPS"; \ + exit 1; \ + else \ + echo "✅ No keymap overlaps"; \ + fi @echo "✅ Neovim configuration is valid" .PHONY: lua-check-neovim-dev diff --git a/config/claude/activate.sh b/config/claude/activate.sh index 2b7bdcf40..18d77d4d8 100755 --- a/config/claude/activate.sh +++ b/config/claude/activate.sh @@ -5,5 +5,9 @@ set -euo pipefail SETTINGS_JSON="$1" mkdir -p ~/.claude -cp -f "$SETTINGS_JSON" ~/.claude/settings.json +_TMP=$(mktemp) +jq --arg host "$(hostname)" ' + . * (.hostOverrides[$host] // {}) | del(.hostOverrides) +' "$SETTINGS_JSON" >"$_TMP" +mv "$_TMP" ~/.claude/settings.json chmod 644 ~/.claude/settings.json diff --git a/config/claude/settings.json b/config/claude/settings.json index 95053e0ad..93616c2e5 100644 --- a/config/claude/settings.json +++ b/config/claude/settings.json @@ -518,5 +518,12 @@ }, "skipDangerousModePermissionPrompt": true, "defaultMode": "bypassPermissions", - "teammateMode": "tmux" + "teammateMode": "tmux", + "hostOverrides": { + "matic": { + "enabledPlugins": { + "mempalace@mempalace": false + } + } + } } diff --git a/home-manager/packages/default.nix b/home-manager/packages/default.nix index 2011bf32e..847c5b1a2 100644 --- a/home-manager/packages/default.nix +++ b/home-manager/packages/default.nix @@ -64,15 +64,9 @@ with pkgs; jujutsu just k6 - k9s - kind - kubeconform - kubectl - kubectx - kubernetes-helm - kustomize (if stdenv.isLinux && isDesktop then llama-cpp.override { vulkanSupport = true; } else llama-cpp) llm + lsof mariadb mise mkcert @@ -94,6 +88,7 @@ with pkgs; tmuxinator tokei tree + tree-sitter turso-cli uv victorialogs @@ -117,8 +112,6 @@ with pkgs; cmake codex collectd - docker - docker-compose fwupd gcc gemini-cli @@ -163,6 +156,7 @@ with pkgs; ffmpeg file-roller gedit + ghostscript ghostty github-desktop gnome-calculator @@ -187,9 +181,11 @@ with pkgs; hyprshell hyprshot hyprsunset + imagemagick libnotify linux-wallpaperengine loupe + mermaid-cli mpv nautilus networkmanagerapplet @@ -207,6 +203,7 @@ with pkgs; slack slurp swappy + tectonic telegram-desktop totem v4l-utils diff --git a/home-manager/programs/default.nix b/home-manager/programs/default.nix index b4984b8b1..672ff14fb 100644 --- a/home-manager/programs/default.nix +++ b/home-manager/programs/default.nix @@ -11,6 +11,7 @@ let cass = import ./cass; clang = import ./clang; dart = import ./dart; + docker = import ./docker; delta = import ./delta; direnv = import ./direnv; elixir = import ./elixir; @@ -24,6 +25,7 @@ let go = import ./go; haskell = import ./haskell; java = import ./java; + k8s = import ./k8s; kotlin = import ./kotlin; lazydocker = import ./lazydocker; lazygit = import ./lazygit; @@ -59,6 +61,7 @@ in cass clang dart + docker delta direnv elixir @@ -72,6 +75,7 @@ in go haskell java + k8s kotlin lazydocker lazygit diff --git a/home-manager/programs/docker/default.nix b/home-manager/programs/docker/default.nix new file mode 100644 index 000000000..e288abc8f --- /dev/null +++ b/home-manager/programs/docker/default.nix @@ -0,0 +1,8 @@ +{ pkgs, ... }: +{ + home.packages = with pkgs; [ + docker + docker-compose + dockerfile-language-server + ]; +} diff --git a/home-manager/programs/go/default.nix b/home-manager/programs/go/default.nix index 486a10570..f6e4e4c25 100644 --- a/home-manager/programs/go/default.nix +++ b/home-manager/programs/go/default.nix @@ -1,7 +1,8 @@ -{ pkgs, ... }: +{ pkgs, lib, ... }: { home.packages = with pkgs; [ go + (lib.lowPrio gotools) gopls ]; } diff --git a/home-manager/programs/k8s/default.nix b/home-manager/programs/k8s/default.nix new file mode 100644 index 000000000..88f14adc8 --- /dev/null +++ b/home-manager/programs/k8s/default.nix @@ -0,0 +1,12 @@ +{ pkgs, ... }: +{ + home.packages = with pkgs; [ + k9s + kind + kubeconform + kubectl + kubectx + kubernetes-helm + kustomize + ]; +} diff --git a/home-manager/programs/lua/default.nix b/home-manager/programs/lua/default.nix index 9d1220dcf..e7a2f6b34 100644 --- a/home-manager/programs/lua/default.nix +++ b/home-manager/programs/lua/default.nix @@ -3,5 +3,6 @@ home.packages = with pkgs; [ lua lua-language-server + stylua ]; } diff --git a/home-manager/programs/neovim/lua/config/ai.lua b/home-manager/programs/neovim/lua/config/ai.lua index 41df3ad75..cdf909a50 100644 --- a/home-manager/programs/neovim/lua/config/ai.lua +++ b/home-manager/programs/neovim/lua/config/ai.lua @@ -52,10 +52,6 @@ vim.keymap.set({ "n", "x" }, "go", function() return require("opencode").operator("@this ") end, { expr = true, desc = "Add range to opencode" }) -vim.keymap.set("n", "goo", function() - return require("opencode").operator("@this ") .. "_" -end, { expr = true, desc = "Add line to opencode" }) - -- Scroll keymaps for opencode session vim.keymap.set("n", "", function() require("opencode").command("session.half.page.up") diff --git a/home-manager/programs/neovim/lua/config/completion.lua b/home-manager/programs/neovim/lua/config/completion.lua index 76885a135..611466c0e 100644 --- a/home-manager/programs/neovim/lua/config/completion.lua +++ b/home-manager/programs/neovim/lua/config/completion.lua @@ -73,7 +73,7 @@ cmp.setup.cmdline(":", { -- GitHub Copilot helper with inline suggestions disabled by default. -- From: https://github.com/zbirenbaum/copilot.lua require("copilot").setup({ - suggestion = { enabled = false }, + suggestion = { enabled = true }, panel = { enabled = false }, }) diff --git a/home-manager/programs/neovim/lua/config/keymaps.lua b/home-manager/programs/neovim/lua/config/keymaps.lua index d566b7ed3..53c527a27 100644 --- a/home-manager/programs/neovim/lua/config/keymaps.lua +++ b/home-manager/programs/neovim/lua/config/keymaps.lua @@ -48,8 +48,8 @@ keymap("n", "q", function() vim.cmd("Bdelete") end end, { noremap = true, silent = true, desc = "Close window / delete buffer" }) --- @keymap bad: Wipe all buffers -keymap("n", "bad", ":%bwipeout!:intro", { noremap = true, silent = true, desc = "Wipe all buffers" }) +-- @keymap BD: Wipe all buffers +keymap("n", "BD", ":%bwipeout!:intro", { noremap = true, silent = true, desc = "Wipe all buffers" }) -- @keymap w: Write file keymap("n", "w", ":write", { noremap = true, silent = true, desc = "Save file" }) -- @keymap W: Save all and quit @@ -199,18 +199,18 @@ keymap( ":Gitsigns preview_hunk_inline", { noremap = true, silent = true, desc = "Preview hunk inline" } ) --- @keymap hs: Stage hunk (Gitsigns) -keymap("n", "hs", ":Gitsigns stage_hunk", { noremap = true, silent = true, desc = "Stage hunk" }) --- @keymap hr: Reset hunk (Gitsigns) -keymap("n", "hr", ":Gitsigns reset_hunk", { noremap = true, silent = true, desc = "Reset hunk" }) --- @keymap hp: Preview hunk (Gitsigns) -keymap("n", "hp", ":Gitsigns preview_hunk", { noremap = true, silent = true, desc = "Preview hunk" }) --- @keymap hb: Blame line (Gitsigns) -keymap("n", "hb", ":Gitsigns blame_line", { noremap = true, silent = true, desc = "Blame line" }) --- @keymap hn: Next hunk (Gitsigns) -keymap("n", "hn", ":Gitsigns next_hunk", { noremap = true, silent = true, desc = "Next hunk" }) --- @keymap hN: Prev hunk (Gitsigns) -keymap("n", "hN", ":Gitsigns prev_hunk", { noremap = true, silent = true, desc = "Prev hunk" }) +-- @keymap Hs: Stage hunk (Gitsigns) +keymap("n", "Hs", ":Gitsigns stage_hunk", { noremap = true, silent = true, desc = "Stage hunk" }) +-- @keymap Hr: Reset hunk (Gitsigns) +keymap("n", "Hr", ":Gitsigns reset_hunk", { noremap = true, silent = true, desc = "Reset hunk" }) +-- @keymap Hp: Preview hunk (Gitsigns) +keymap("n", "Hp", ":Gitsigns preview_hunk", { noremap = true, silent = true, desc = "Preview hunk" }) +-- @keymap Hb: Blame line (Gitsigns) +keymap("n", "Hb", ":Gitsigns blame_line", { noremap = true, silent = true, desc = "Blame line" }) +-- @keymap Hn: Next hunk (Gitsigns) +keymap("n", "Hn", ":Gitsigns next_hunk", { noremap = true, silent = true, desc = "Next hunk" }) +-- @keymap HN: Prev hunk (Gitsigns) +keymap("n", "HN", ":Gitsigns prev_hunk", { noremap = true, silent = true, desc = "Prev hunk" }) -- @keymap gs: Fugitive vertical diff split (current file vs index) keymap("n", "gs", ":Gvdiffsplit", { noremap = true, silent = true, desc = "Diff split (index)" }) -- @keymap gS: Fugitive diff split vs HEAD @@ -277,8 +277,8 @@ keymap("n", "xl", "Trouble loclist toggle", { noremap = true, s keymap("n", "]d", vim.diagnostic.goto_next, { desc = "Next Diagnostic" }) -- @keymap [d: Go to previous diagnostic keymap("n", "[d", vim.diagnostic.goto_prev, { desc = "Previous Diagnostic" }) --- @keymap dl: Show line diagnostics -keymap("n", "dl", vim.diagnostic.open_float, { desc = "Line Diagnostics" }) +-- @keymap xd: Show line diagnostics +keymap("n", "xd", vim.diagnostic.open_float, { desc = "Line Diagnostics" }) -- ==================================================================================== -- FFF.NVIM (Fast Fuzzy File Finder) @@ -327,8 +327,8 @@ keymap("n", "ov", ":OtherVSplit", { noremap = true, silent = true, d -- @keymap os: Navigate to related file in horizontal split keymap("n", "os", ":OtherSplit", { noremap = true, silent = true, desc = "Related file (split)" }) --- @keymap gco: Generate code annotation (neogen) -keymap("n", "gco", ":Neogen", { noremap = true, silent = true, desc = "Generate annotation" }) +-- @keymap ca: Generate code annotation (neogen) +keymap("n", "ca", ":Neogen", { noremap = true, silent = true, desc = "Generate annotation" }) -- @keymap st: Toggle treesitter split/join -- Treesitter-based split/join helper for code structures. @@ -393,6 +393,17 @@ keymap("n", "ac", function() require("sidekick.cli").toggle({ name = "claude", focus = true }) end, { noremap = true, silent = true, desc = "Sidekick Claude" }) +-- ==================================================================================== +-- PLUGIN KEYMAP OVERRIDES +-- ==================================================================================== +-- nvim-surround v4: keymaps no longer configured via setup(); delete directly. +require("nvim-surround").setup({}) +pcall(vim.keymap.del, "n", "yss") +pcall(vim.keymap.del, "n", "ySS") + +-- Remove Neovim built-in gcc shorthand; gc_ achieves the same result. +pcall(vim.keymap.del, "n", "gcc") + -- ==================================================================================== -- WHICH-KEY GROUPS -- ==================================================================================== @@ -405,7 +416,7 @@ wk.add({ { "f", group = "Find/Files" }, { "x", group = "Trouble/Diagnostics" }, { "c", group = "Code" }, - { "h", group = "Hunk (Git)" }, + { "H", group = "Hunk (Git)" }, }) -- ==================================================================================== diff --git a/home-manager/programs/neovim/lua/config/treesitter.lua b/home-manager/programs/neovim/lua/config/treesitter.lua index 9762a80ac..5a5c91e5a 100644 --- a/home-manager/programs/neovim/lua/config/treesitter.lua +++ b/home-manager/programs/neovim/lua/config/treesitter.lua @@ -14,10 +14,6 @@ require("nvim-autopairs").setup() -- From: https://github.com/windwp/nvim-ts-autotag require("nvim-ts-autotag").setup() --- Modern surround manipulation for parentheses, brackets, tags, etc. --- From: https://github.com/kylechui/nvim-surround -require("nvim-surround").setup() - -- Highlights and lists TODO/FIXME/NOTE-style comments across projects. -- From: https://github.com/folke/todo-comments.nvim require("todo-comments").setup() diff --git a/home-manager/programs/neovim/lua/config/ui.lua b/home-manager/programs/neovim/lua/config/ui.lua index e4274a5da..ad207a22e 100644 --- a/home-manager/programs/neovim/lua/config/ui.lua +++ b/home-manager/programs/neovim/lua/config/ui.lua @@ -104,16 +104,16 @@ require("nvim-tree").setup({ vim.keymap.set("n", "i", api.node.open.horizontal, opts("Open: Horizontal Split")) -- @keymap a: Add file/folder (nvim-tree) vim.keymap.set("n", "a", api.fs.create, opts("Create")) - -- @keymap d: Delete file/folder (nvim-tree) - vim.keymap.set("n", "d", api.fs.remove, opts("Delete")) + -- @keymap D: Delete file/folder (nvim-tree) + vim.keymap.set("n", "D", api.fs.remove, opts("Delete")) -- @keymap r: Rename file/folder (nvim-tree) vim.keymap.set("n", "r", api.fs.rename, opts("Rename")) - -- @keymap y: Copy absolute path (nvim-tree) - vim.keymap.set("n", "y", api.fs.copy.absolute_path, opts("Copy Absolute Path")) - -- @keymap Y: Copy relative path (nvim-tree) - vim.keymap.set("n", "Y", api.fs.copy.relative_path, opts("Copy Relative Path")) - -- @keymap c: Change directory (nvim-tree) - vim.keymap.set("n", "c", api.tree.change_root_to_node, opts("CD")) + -- @keymap Y: Copy absolute path (nvim-tree) + vim.keymap.set("n", "Y", api.fs.copy.absolute_path, opts("Copy Absolute Path")) + -- @keymap : Copy relative path (nvim-tree) + vim.keymap.set("n", "", api.fs.copy.relative_path, opts("Copy Relative Path")) + -- @keymap C: Change directory (nvim-tree) + vim.keymap.set("n", "C", api.tree.change_root_to_node, opts("CD")) -- @keymap u: Go to parent directory (nvim-tree) vim.keymap.set("n", "u", api.tree.change_root_to_parent, opts("Up")) -- @keymap q: Close tree (nvim-tree) @@ -155,7 +155,13 @@ require("which-key").setup({}) -- Shows non-blocking LSP progress spinners in the corner. -- From: https://github.com/j-hui/fidget.nvim -require("fidget").setup({}) +require("fidget").setup({ + notification = { + window = { + avoid = { "NvimTree" }, + }, + }, +}) -- Makes directories editable as buffers for quick navigation. -- From: https://github.com/stevearc/oil.nvim diff --git a/home-manager/programs/neovim/nvim-pack-lock.json b/home-manager/programs/neovim/nvim-pack-lock.json index 48031dac7..4fc554ddc 100644 --- a/home-manager/programs/neovim/nvim-pack-lock.json +++ b/home-manager/programs/neovim/nvim-pack-lock.json @@ -1,7 +1,7 @@ { "plugins": { "LuaSnip": { - "rev": "3732756842a2f7e0e76a7b0487e9692072857277", + "rev": "dae4f5aaa3574bd0c2b9dd20fb9542a02c10471c", "src": "https://github.com/L3MON4D3/LuaSnip" }, "auto-dark-mode.nvim": { @@ -54,7 +54,7 @@ "src": "https://github.com/zbirenbaum/copilot-cmp" }, "copilot.lua": { - "rev": "4383e05a47493d7ff77b058c0548129eb38ec7fb", + "rev": "8e2a91828210d6043744468f6d7027d256a41f42", "src": "https://github.com/zbirenbaum/copilot.lua" }, "dracula.nvim": { @@ -90,7 +90,7 @@ "src": "https://github.com/lewis6991/gitsigns.nvim" }, "grug-far.nvim": { - "rev": "b58b2d65863f4ebad88b10a1ddd519e5380466e0", + "rev": "dc4684e163971bb1f5bfb93fbd4bb3e892bf9b15", "src": "https://github.com/MagicDuck/grug-far.nvim" }, "gruvbox.nvim": { @@ -142,15 +142,15 @@ "src": "https://github.com/kylechui/nvim-surround" }, "nvim-tree.lua": { - "rev": "3fb91e18a727ecc0385637895ec397dea90be42a", + "rev": "b3772adec8db61ba9098c5624a0823a77be3a23d", "src": "https://github.com/nvim-tree/nvim-tree.lua" }, "nvim-treesitter": { - "rev": "42fc28ba918343ebfd5565147a42a26580579482", + "rev": "2f5d4c3f3c675962242096bcc8e586d76dd72eb2", "src": "https://github.com/nvim-treesitter/nvim-treesitter" }, "nvim-treesitter-context": { - "rev": "660861b1849256398f70450afdf93908d28dc945", + "rev": "9a8e39993e3b895601bf8227124a48ea8268149e", "src": "https://github.com/nvim-treesitter/nvim-treesitter-context" }, "nvim-treesitter-endwise": { @@ -194,7 +194,7 @@ "src": "https://github.com/folke/sidekick.nvim" }, "snacks.nvim": { - "rev": "fe7cfe9800a182274d0f868a74b7263b8c0c020b", + "rev": "a049339328e2599ad6e85a69fa034ac501e921b2", "src": "https://github.com/folke/snacks.nvim" }, "telescope-fzf-native.nvim": { @@ -210,7 +210,7 @@ "src": "https://github.com/nvim-telescope/telescope-ui-select.nvim" }, "telescope.nvim": { - "rev": "83a3a713d6b2d2a408491a1b959e55a7fa8678e8", + "rev": "5255aa27c422de944791318024167ad5d40aad20", "src": "https://github.com/nvim-telescope/telescope.nvim" }, "todo-comments.nvim": { diff --git a/home-manager/programs/nix/default.nix b/home-manager/programs/nix/default.nix index 30314cc14..ef34d68e8 100644 --- a/home-manager/programs/nix/default.nix +++ b/home-manager/programs/nix/default.nix @@ -2,6 +2,7 @@ { home.packages = with pkgs; [ nixd + nixfmt ]; } diff --git a/home-manager/programs/node/default.nix b/home-manager/programs/node/default.nix index 668a08354..ed07a114f 100644 --- a/home-manager/programs/node/default.nix +++ b/home-manager/programs/node/default.nix @@ -3,5 +3,7 @@ home.packages = with pkgs; [ nodejs typescript-language-server + vscode-langservers-extracted + vtsls ]; } diff --git a/home-manager/programs/python/default.nix b/home-manager/programs/python/default.nix index fcca6f482..3a667cacf 100644 --- a/home-manager/programs/python/default.nix +++ b/home-manager/programs/python/default.nix @@ -1,6 +1,7 @@ { pkgs, ... }: { home.packages = with pkgs; [ + black python3 pyright ]; diff --git a/scripts/llm-update.sh b/scripts/llm-update.sh index 604ab80fd..3b31ed998 100755 --- a/scripts/llm-update.sh +++ b/scripts/llm-update.sh @@ -29,7 +29,8 @@ add_model_override() { local key="$1" local suffix="$2" local value="$3" - local placeholder="__$(echo "${key}-${suffix}" | tr 'a-z-' 'A-Z_')__" + local placeholder + placeholder="__$(echo "${key}-${suffix}" | tr 'a-z-' 'A-Z_')__" sed_args+=(-e "s|${placeholder}|${value}|g") }