From 2d5ff939b0a55f0a143927fb52f3ff386077c22b Mon Sep 17 00:00:00 2001 From: ARCIII <88923299+ArmandoCIII@users.noreply.github.com> Date: Sat, 15 Mar 2025 09:44:33 -0400 Subject: [PATCH] assistant/codecompanion-nvim: init (#707) * assistant/codecompanion-nvim: init * assistant/codecompanion-nvim: PR review revisions --------- Co-authored-by: raf --- configuration.nix | 1 + docs/release-notes/rl-0.8.md | 2 + .../codecompanion/codecompanion-nvim.nix | 278 ++++++++++++++++++ .../assistant/codecompanion/config.nix | 27 ++ .../assistant/codecompanion/default.nix | 6 + modules/plugins/assistant/default.nix | 1 + npins/sources.json | 12 + 7 files changed, 327 insertions(+) create mode 100644 modules/plugins/assistant/codecompanion/codecompanion-nvim.nix create mode 100644 modules/plugins/assistant/codecompanion/config.nix create mode 100644 modules/plugins/assistant/codecompanion/default.nix diff --git a/configuration.nix b/configuration.nix index 692337db..a243c970 100644 --- a/configuration.nix +++ b/configuration.nix @@ -234,6 +234,7 @@ isMaximal: { enable = false; cmp.enable = isMaximal; }; + codecompanion-nvim.enable = false; }; session = { diff --git a/docs/release-notes/rl-0.8.md b/docs/release-notes/rl-0.8.md index bd52df0d..9f05f60a 100644 --- a/docs/release-notes/rl-0.8.md +++ b/docs/release-notes/rl-0.8.md @@ -167,10 +167,12 @@ [ARCIII](https://github.com/ArmandoCIII): [leetcode.nvim]: https://github.com/kawre/leetcode.nvim +[codecompanion-nvim]: https://github.com/olimorris/codecompanion.nvim - Add `vim.languages.zig.dap` support through pkgs.lldb dap adapter. Code Inspiration from `vim.languages.clang.dap` implementation. - Add [leetcode.nvim] plugin under `vim.utility.leetcode-nvim`. +- Add [codecompanion.nvim] plugin under `vim.assistant.codecompanion-nvim`. [nezia1](https://github.com/nezia1): diff --git a/modules/plugins/assistant/codecompanion/codecompanion-nvim.nix b/modules/plugins/assistant/codecompanion/codecompanion-nvim.nix new file mode 100644 index 00000000..9ebe30c0 --- /dev/null +++ b/modules/plugins/assistant/codecompanion/codecompanion-nvim.nix @@ -0,0 +1,278 @@ +{lib, ...}: let + inherit (lib.options) mkOption mkEnableOption; + inherit (lib.types) int str enum nullOr attrs; + inherit (lib.nvim.types) mkPluginSetupOption luaInline; +in { + options.vim.assistant = { + codecompanion-nvim = { + enable = mkEnableOption "complementary neovim plugin for codecompanion.nvim"; + + setupOpts = mkPluginSetupOption "codecompanion-nvim" { + opts = { + send_code = mkEnableOption "code from being sent to the LLM."; + + log_level = mkOption { + type = enum ["DEBUG" "INFO" "ERROR" "TRACE"]; + default = "ERROR"; + description = "Change the level of logging."; + }; + + language = mkOption { + type = str; + default = "English"; + description = "Specify which language an LLM should respond in."; + }; + }; + + display = { + diff = { + enabled = + mkEnableOption "" + // { + default = true; + description = "a diff view to see the changes made by the LLM."; + }; + + close_chat_at = mkOption { + type = int; + default = 240; + description = '' + Close an open chat buffer if the + total columns of your display are less than... + ''; + }; + + layout = mkOption { + type = enum ["vertical" "horizontal"]; + default = "vertical"; + description = "Type of split for default provider."; + }; + + provider = mkOption { + type = enum ["default" "mini_diff"]; + default = "default"; + description = "The preferred kind of provider."; + }; + }; + + inline = { + layout = mkOption { + type = enum ["vertical" "horizontal" "buffer"]; + default = "vertical"; + description = "Customize how output is created in new buffer."; + }; + }; + + chat = { + auto_scroll = mkEnableOption "automatic page scrolling."; + + show_settings = mkEnableOption '' + LLM settings to appear at the top of the chat buffer. + ''; + + start_in_insert_mode = mkEnableOption '' + opening the chat buffer in insert mode. + ''; + + show_header_separator = mkEnableOption '' + header separators in the chat buffer. + + Set this to false if you're using an + external markdown formatting plugin. + ''; + + show_references = + mkEnableOption "" + // { + default = true; + description = "references in the chat buffer."; + }; + + show_token_count = + mkEnableOption "" + // { + default = true; + description = "the token count for each response."; + }; + + intro_message = mkOption { + type = str; + default = "Welcome to CodeCompanion ✨! Press ? for options."; + description = "Message to appear in chat buffer."; + }; + + separator = mkOption { + type = str; + default = "─"; + description = '' + The separator between the + different messages in the chat buffer. + ''; + }; + + icons = { + pinned_buffer = mkOption { + type = str; + default = " "; + description = "The icon to represent a pinned buffer."; + }; + + watched_buffer = mkOption { + type = str; + default = "👀 "; + description = "The icon to represent a watched buffer."; + }; + }; + }; + + action_palette = { + width = mkOption { + type = int; + default = 95; + description = "Width of the action palette."; + }; + + height = mkOption { + type = int; + default = 10; + description = "Height of the action palette."; + }; + + prompt = mkOption { + type = str; + default = "Prompt "; + description = "Prompt used for interactive LLM calls."; + }; + + provider = mkOption { + type = enum ["default" "telescope" "mini_pick"]; + default = "default"; + description = "Provider used for the action palette."; + }; + + opts = { + show_default_actions = + mkEnableOption "" + // { + default = true; + description = "showing default actions in the action palette."; + }; + + show_default_prompt_library = + mkEnableOption "" + // { + default = true; + description = '' + showing default prompt library in the action palette. + ''; + }; + }; + }; + }; + + adapters = mkOption { + type = nullOr luaInline; + default = null; + description = "An adapter is what connects Neovim to an LLM."; + }; + + strategies = { + chat = { + adapter = mkOption { + type = nullOr str; + default = null; + description = "Adapter used for the chat strategy."; + }; + + keymaps = mkOption { + type = nullOr attrs; + default = null; + description = "Define or override the default keymaps."; + }; + + variables = mkOption { + type = nullOr luaInline; + default = null; + description = '' + Define your own variables + to share specific content. + ''; + }; + + slash_commands = mkOption { + type = nullOr luaInline; + default = null; + description = '' + Slash Commands (invoked with /) let you dynamically + insert context into the chat buffer, + such as file contents or date/time. + ''; + }; + + tools = mkOption { + type = nullOr attrs; + default = null; + description = '' + Configure tools to perform specific + tasks when invoked by an LLM. + ''; + }; + + roles = mkOption { + type = nullOr luaInline; + default = null; + description = '' + The chat buffer places user and LLM responses under a H2 header. + These can be customized in the configuration. + ''; + }; + }; + + inline = { + adapter = mkOption { + type = nullOr str; + default = null; + description = "Adapter used for the inline strategy."; + }; + + variables = mkOption { + type = nullOr luaInline; + default = null; + description = '' + Define your own variables + to share specific content. + ''; + }; + + keymaps = { + accept_change = { + n = mkOption { + type = str; + default = "ga"; + description = "Accept the suggested change."; + }; + }; + + reject_change = { + n = mkOption { + type = str; + default = "gr"; + description = "Reject the suggested change."; + }; + }; + }; + }; + }; + + prompt_library = mkOption { + type = nullOr attrs; + default = null; + description = '' + A prompt library is a collection of prompts + that can be used in the action palette. + ''; + }; + }; + }; + }; +} diff --git a/modules/plugins/assistant/codecompanion/config.nix b/modules/plugins/assistant/codecompanion/config.nix new file mode 100644 index 00000000..6b427d28 --- /dev/null +++ b/modules/plugins/assistant/codecompanion/config.nix @@ -0,0 +1,27 @@ +{ + config, + lib, + ... +}: let + inherit (lib.modules) mkIf; + + cfg = config.vim.assistant.codecompanion-nvim; +in { + config = mkIf cfg.enable { + vim = { + startPlugins = [ + "plenary-nvim" + ]; + + lazy.plugins = { + codecompanion-nvim = { + package = "codecompanion-nvim"; + setupModule = "codecompanion"; + inherit (cfg) setupOpts; + }; + }; + + treesitter.enable = true; + }; + }; +} diff --git a/modules/plugins/assistant/codecompanion/default.nix b/modules/plugins/assistant/codecompanion/default.nix new file mode 100644 index 00000000..7f7b4452 --- /dev/null +++ b/modules/plugins/assistant/codecompanion/default.nix @@ -0,0 +1,6 @@ +{ + imports = [ + ./config.nix + ./codecompanion-nvim.nix + ]; +} diff --git a/modules/plugins/assistant/default.nix b/modules/plugins/assistant/default.nix index 5b5cf323..697d54f6 100644 --- a/modules/plugins/assistant/default.nix +++ b/modules/plugins/assistant/default.nix @@ -2,5 +2,6 @@ imports = [ ./chatgpt ./copilot + ./codecompanion ]; } diff --git a/npins/sources.json b/npins/sources.json index daad4177..a1d5d19c 100644 --- a/npins/sources.json +++ b/npins/sources.json @@ -243,6 +243,18 @@ "url": "https://github.com/ray-x/cmp-treesitter/archive/958fcfa0d8ce46d215e19cc3992c542f576c4123.tar.gz", "hash": "05as01c2f7i20zkzpqbq9n8ji9bcwd678ixmxnrz9vmz5zsj8q7i" }, + "codecompanion-nvim": { + "type": "Git", + "repository": { + "type": "GitHub", + "owner": "olimorris", + "repo": "codecompanion.nvim" + }, + "branch": "main", + "revision": "dd81bd9176daba9ea507cd0457f662c0a15c001f", + "url": "https://github.com/olimorris/codecompanion.nvim/archive/dd81bd9176daba9ea507cd0457f662c0a15c001f.tar.gz", + "hash": "09a20q1hshp07nf9n8w4cxpa8s32vwyd4ya0gdnx5jp7g00dksrg" + }, "codewindow-nvim": { "type": "Git", "repository": {