From 29881e5f2c91ea97602452024e153c62c47fa0b9 Mon Sep 17 00:00:00 2001 From: Zhe Yu Date: Thu, 21 Aug 2025 17:02:35 +0800 Subject: [PATCH 1/2] refactor(nvim): Relax schema requirements for CodeCompanion tools (#273) --- .../codecompanion/files_rm_tool.lua | 23 ++++++------------ .../integrations/codecompanion/query_tool.lua | 24 +++++++++---------- .../codecompanion/vectorise_tool.lua | 23 ++++-------------- 3 files changed, 23 insertions(+), 47 deletions(-) diff --git a/lua/vectorcode/integrations/codecompanion/files_rm_tool.lua b/lua/vectorcode/integrations/codecompanion/files_rm_tool.lua index b14aa175..570d2bad 100644 --- a/lua/vectorcode/integrations/codecompanion/files_rm_tool.lua +++ b/lua/vectorcode/integrations/codecompanion/files_rm_tool.lua @@ -9,7 +9,7 @@ local default_opts = { include_in_toolbox = false, } ----@alias FilesRmArgs { paths: string[], project_root: string } +---@alias FilesRmArgs { paths: string[], project_root: string? } ---@param opts VectorCode.CodeCompanion.FilesRmToolOpts ---@return CodeCompanion.Tools @@ -37,11 +37,10 @@ return function(opts) }, project_root = { type = "string", - description = "The project that the files belong to. Either use a path from the `vectorcode_ls` tool, or leave empty to use the current git project. If the user did not specify a path, use empty string for this parameter.", + description = "The project that the files belong to. Either use a path from the `vectorcode_ls` tool, or omit this parameter to use the current git project. If the user did not specify a path, omit this parameter.", }, }, - required = { "paths", "project_root" }, - additionalProperties = false, + required = { "paths" }, }, strict = true, }, @@ -52,25 +51,17 @@ return function(opts) ---@return nil|{ status: string, data: string } function(tools, action, _, cb) local args = { "files", "rm", "--pipe" } - local project_root = vim.fs.abspath(vim.fs.normalize(action.project_root or "")) - if project_root ~= "" then + if action.project_root then + local project_root = vim.fs.abspath(vim.fs.normalize(action.project_root)) local stat = vim.uv.fs_stat(project_root) if stat and stat.type == "directory" then vim.list_extend(args, { "--project_root", project_root }) else return { status = "error", data = "Invalid path " .. project_root } end - else - project_root = vim.fs.root(".", { ".vectorcode", ".git" }) or "" - if project_root == "" then - return { - status = "error", - data = "Please specify a project root. You may use the `vectorcode_ls` tool to find a list of existing projects.", - } - end end - if project_root ~= "" then - action.project_root = project_root + if action.paths == nil or #action.paths == 0 then + return { status = "error", data = "Please specify at least one path." } end vim.list_extend( args, diff --git a/lua/vectorcode/integrations/codecompanion/query_tool.lua b/lua/vectorcode/integrations/codecompanion/query_tool.lua index 85386082..18b55e14 100644 --- a/lua/vectorcode/integrations/codecompanion/query_tool.lua +++ b/lua/vectorcode/integrations/codecompanion/query_tool.lua @@ -10,7 +10,7 @@ local logger = vc_config.logger local job_runner = nil ----@alias QueryToolArgs { project_root:string, count: integer, query: string[], allow_summary: boolean, deduplicate: boolean } +---@alias QueryToolArgs { project_root:string?, count: integer?, query: string[], allow_summary: boolean?, deduplicate: boolean? } ---@type VectorCode.CodeCompanion.QueryToolOpts local default_query_options = { @@ -259,7 +259,7 @@ local function generate_summary(result, summarise_opts, cmd, callback) if summarise_opts.enabled - and cmd.allow_summary + and cmd.allow_summary ~= false and type(callback) == "function" and #result > 0 then @@ -365,6 +365,10 @@ return check_cli_wrap(function(opts) action ) + if action.deduplicate == nil then + action.deduplicate = opts.no_duplicate + end + job_runner = cc_common.initialise_runner(opts.use_lsp) assert(job_runner ~= nil, "Jobrunner not initialised!") assert( @@ -381,15 +385,15 @@ return check_cli_wrap(function(opts) local args = { "query" } vim.list_extend(args, action.query) - vim.list_extend(args, { "--pipe", "-n", tostring(action.count) }) + vim.list_extend( + args, + { "--pipe", "-n", tostring(action.count or opts.default_num) } + ) if opts.chunk_mode then vim.list_extend(args, { "--include", "path", "chunk" }) else vim.list_extend(args, { "--include", "path", "document" }) end - if action.project_root == "" then - action.project_root = nil - end if action.project_root ~= nil then action.project_root = vim.fs.normalize(action.project_root) if @@ -523,7 +527,7 @@ If a query returned empty or repeated results, you should avoid using these quer }, project_root = { type = "string", - description = "Project path to search within (must be from 'ls' results or user instructions). Use empty string for the current project. If the user did not specify a project, assume that they're referring to the current project and use an empty string for this parameter. If this fails, use the `vectorcode_ls` tool and ask the user to clarify the project.", + description = "Project path to search within (must be from 'ls' results or user instructions). If the user did not specify a project, you may omit this parameter and the tool will try to query from the current project. If this fails, use the `vectorcode_ls` tool and ask the user to clarify the project.", }, allow_summary = { type = "boolean", @@ -544,14 +548,8 @@ DO NOT MODIFY UNLESS INSTRUCTED BY THE USER, OR A PREVIOUS QUERY RETURNED NO RES }, required = { "query", - "count", - "project_root", - "allow_summary", - "deduplicate", }, - additionalProperties = false, }, - strict = true, }, }, output = { diff --git a/lua/vectorcode/integrations/codecompanion/vectorise_tool.lua b/lua/vectorcode/integrations/codecompanion/vectorise_tool.lua index 2e7b2138..e3ac0e9b 100644 --- a/lua/vectorcode/integrations/codecompanion/vectorise_tool.lua +++ b/lua/vectorcode/integrations/codecompanion/vectorise_tool.lua @@ -4,7 +4,7 @@ local cc_common = require("vectorcode.integrations.codecompanion.common") local vc_config = require("vectorcode.config") local logger = vc_config.logger ----@alias VectoriseToolArgs { paths: string[], project_root: string } +---@alias VectoriseToolArgs { paths: string[], project_root: string? } ---@alias VectoriseResult { add: integer, update: integer, removed: integer } @@ -56,13 +56,11 @@ The paths should be accurate (DO NOT ASSUME A PATH EXIST) and case case-sensitiv }, project_root = { type = "string", - description = "The project that the files belong to. Either use a path from the `vectorcode_ls` tool, or leave empty to use the current git project. If the user did not specify a path, use empty string for this parameter.", + description = "The project that the files belong to. Either use a path from the `vectorcode_ls` tool, or leave empty to use the current git project. If the user did not specify a path, you may omit this parameter.", }, }, - required = { "paths", "project_root" }, - additionalProperties = false, + required = { "paths" }, }, - strict = true, }, }, cmds = { @@ -71,25 +69,14 @@ The paths should be accurate (DO NOT ASSUME A PATH EXIST) and case case-sensitiv ---@return nil|{ status: string, data: string } function(tools, action, _, cb) local args = { "vectorise", "--pipe" } - local project_root = vim.fs.abspath(vim.fs.normalize(action.project_root or "")) - if project_root ~= "" then + if action.project_root then + local project_root = vim.fs.abspath(vim.fs.normalize(action.project_root)) local stat = vim.uv.fs_stat(project_root) if stat and stat.type == "directory" then vim.list_extend(args, { "--project_root", project_root }) else return { status = "error", data = "Invalid path " .. project_root } end - else - project_root = vim.fs.root(".", { ".vectorcode", ".git" }) or "" - if project_root == "" then - return { - status = "error", - data = "Please specify a project root. You may use the `vectorcode_ls` tool to find a list of existing projects.", - } - end - end - if project_root ~= "" then - action.project_root = project_root end if vim.iter(action.paths):any(function(p) From 0df544572bf4d19ccd95e31187aa77446eed5a25 Mon Sep 17 00:00:00 2001 From: Zhe Yu Date: Fri, 22 Aug 2025 10:37:53 +0800 Subject: [PATCH 2/2] chore(nvim): Update descriptions for codecompanion tools --- .../integrations/codecompanion/files_ls_tool.lua | 8 +++++++- .../integrations/codecompanion/files_rm_tool.lua | 8 +++++++- .../integrations/codecompanion/query_tool.lua | 16 +++++++++++++--- .../codecompanion/vectorise_tool.lua | 12 +++++++++--- 4 files changed, 36 insertions(+), 8 deletions(-) diff --git a/lua/vectorcode/integrations/codecompanion/files_ls_tool.lua b/lua/vectorcode/integrations/codecompanion/files_ls_tool.lua index 7dbe0fd6..98fd6e31 100644 --- a/lua/vectorcode/integrations/codecompanion/files_ls_tool.lua +++ b/lua/vectorcode/integrations/codecompanion/files_ls_tool.lua @@ -67,7 +67,13 @@ Retrieve a list of files that have been added to the database for a given projec properties = { project_root = { type = "string", - description = "The project for which the indexed files will be listed. Leave this empty for the current project.", + description = [[ +The project that the files belong to. +The value should be one of the following: +- One of the paths from the `vectorcode_ls` tool; +- User input; +- `null` (omit this parameter), which means the current project, if found. +]], }, }, }, diff --git a/lua/vectorcode/integrations/codecompanion/files_rm_tool.lua b/lua/vectorcode/integrations/codecompanion/files_rm_tool.lua index 570d2bad..a002f583 100644 --- a/lua/vectorcode/integrations/codecompanion/files_rm_tool.lua +++ b/lua/vectorcode/integrations/codecompanion/files_rm_tool.lua @@ -37,7 +37,13 @@ return function(opts) }, project_root = { type = "string", - description = "The project that the files belong to. Either use a path from the `vectorcode_ls` tool, or omit this parameter to use the current git project. If the user did not specify a path, omit this parameter.", + description = [[ +The project that the files belong to. +The value should be one of the following: +- One of the paths from the `vectorcode_ls` tool; +- User input; +- `null` (omit this parameter), which means the current project, if found. + ]], }, }, required = { "paths" }, diff --git a/lua/vectorcode/integrations/codecompanion/query_tool.lua b/lua/vectorcode/integrations/codecompanion/query_tool.lua index 18b55e14..411c5616 100644 --- a/lua/vectorcode/integrations/codecompanion/query_tool.lua +++ b/lua/vectorcode/integrations/codecompanion/query_tool.lua @@ -520,14 +520,20 @@ If a query returned empty or repeated results, you should avoid using these quer count = { type = "integer", description = string.format( - "Number of documents or chunks to retrieve, must be positive. Use %d by default. Do not query for more than %d.", + "Number of documents or chunks to retrieve, must be positive. The default value of this parameter is %d. Do not query for more than %d results.", tonumber(opts.default_num), tonumber(opts.max_num) ), }, project_root = { type = "string", - description = "Project path to search within (must be from 'ls' results or user instructions). If the user did not specify a project, you may omit this parameter and the tool will try to query from the current project. If this fails, use the `vectorcode_ls` tool and ask the user to clarify the project.", + description = [[ +The project that the files belong to. +The value should be one of the following: +- One of the paths from the `vectorcode_ls` tool; +- User input; +- `null` (omit this parameter), which means the current project, if found. + ]], }, allow_summary = { type = "boolean", @@ -617,7 +623,11 @@ DO NOT MODIFY UNLESS INSTRUCTED BY THE USER, OR A PREVIOUS QUERY RETURNED NO RES return process_result(res) end) :totable()), - string.format("**VectorCode Tool**: Retrieved %d %s(s)", stdout.count, mode) + string.format( + "**VectorCode `query` Tool**: Retrieved %d %s(s)", + stdout.count, + mode + ) ) if not opts.chunk_mode then for _, result in pairs(stdout.raw_results) do diff --git a/lua/vectorcode/integrations/codecompanion/vectorise_tool.lua b/lua/vectorcode/integrations/codecompanion/vectorise_tool.lua index e3ac0e9b..d26dde05 100644 --- a/lua/vectorcode/integrations/codecompanion/vectorise_tool.lua +++ b/lua/vectorcode/integrations/codecompanion/vectorise_tool.lua @@ -56,7 +56,13 @@ The paths should be accurate (DO NOT ASSUME A PATH EXIST) and case case-sensitiv }, project_root = { type = "string", - description = "The project that the files belong to. Either use a path from the `vectorcode_ls` tool, or leave empty to use the current git project. If the user did not specify a path, you may omit this parameter.", + description = [[ +The project that the files belong to. +The value should be one of the following: +- One of the paths from the `vectorcode_ls` tool; +- User input; +- `null` (omit this parameter), which means the current project, if found. +]], }, }, required = { "paths" }, @@ -126,7 +132,7 @@ The paths should be accurate (DO NOT ASSUME A PATH EXIST) and case case-sensitiv stderr = cc_common.flatten_table_to_string(stderr) tools.chat:add_tool_output( self, - string.format("**VectorCode Vectorise Tool: %s", stderr) + string.format("**VectorCode `vectorise` Tool: %s", stderr) ) end, ---@param self CodeCompanion.Tools.Tool @@ -138,7 +144,7 @@ The paths should be accurate (DO NOT ASSUME A PATH EXIST) and case case-sensitiv tools.chat:add_tool_output( self, string.format( - [[**VectorCode Vectorise Tool**: + [[**VectorCode `vectorise` Tool**: - New files added: %d - Existing files updated: %d - Orphaned files removed: %d