return { { "NickvanDyke/opencode.nvim", dependencies = { "folke/snacks.nvim", "ThePrimeagen/harpoon", }, ---@type opencode.Config opts = { auto_reload = true, -- Automatically reload buffers edited by opencode auto_focus = false, -- Focus the opencode window after prompting win = { position = "right", enter = false, width = 0.4, -- 40% of screen width }, context = { -- Custom context: include harpooned files in prompts ["@harpoon"] = function() local ok, harpoon = pcall(require, "harpoon") if not ok then return nil end local list = harpoon:list() if not list or list:length() == 0 then return nil end local paths = {} for i = 1, list:length() do local item = list:get(i) if item and item.value then table.insert(paths, item.value) end end if #paths == 0 then return nil end return "Harpooned files:\n" .. table.concat(paths, "\n") end, }, }, -- stylua: ignore keys = { -- Core commands { "kk", function() require("opencode").toggle() end, desc = "Toggle opencode" }, { "ka", function() require("opencode").ask() end, desc = "Ask opencode", mode = { "n", "v" } }, { "kA", function() require("opencode").ask("@file ") end, desc = "Ask opencode about current file", mode = { "n", "v" } }, { "kn", function() require("opencode").command("/new") end, desc = "New session" }, -- Code understanding { "ke", function() require("opencode").prompt("Explain @cursor and its context") end, desc = "Explain code near cursor" }, { "kE", function() require("opencode").prompt("Explain @selection in detail") end, desc = "Explain selection", mode = "v" }, -- Code review & quality { "kr", function() require("opencode").prompt("Review @file for correctness and readability") end, desc = "Review file" }, { "kg", function() require("opencode").prompt("Review @diff for bugs, edge cases, and improvements") end, desc = "Review git diff" }, { "kq", function() require("opencode").prompt("Help me fix these issues from @quickfix") end, desc = "Fix quickfix items" }, -- Code fixes & improvements { "kf", function() require("opencode").prompt("Fix these @diagnostics") end, desc = "Fix errors" }, { "ko", function() require("opencode").prompt("Optimize @selection for performance and readability") end, desc = "Optimize selection", mode = "v" }, { "kR", function() require("opencode").prompt("Refactor @selection to be more maintainable") end, desc = "Refactor selection", mode = "v" }, -- Code generation { "kd", function() require("opencode").prompt("Add documentation comments for @selection") end, desc = "Document selection", mode = "v" }, { "kt", function() require("opencode").prompt("Add tests for @selection") end, desc = "Test selection", mode = "v" }, -- Harpoon integration { "kh", function() require("opencode").ask("@harpoon ") end, desc = "Ask about harpooned files" }, { "kH", function() require("opencode").prompt("Analyze the relationships between @harpoon and suggest improvements") end, desc = "Analyze harpooned files" }, }, }, }