feat: parse and conditionally add cursor rules to system prompt (#2385)
This commit is contained in:
@@ -388,6 +388,8 @@ function M.generate_prompts(opts)
|
|||||||
|
|
||||||
local agents_rules = Prompts.get_agents_rules_prompt()
|
local agents_rules = Prompts.get_agents_rules_prompt()
|
||||||
if agents_rules then system_prompt = system_prompt .. "\n\n" .. agents_rules end
|
if agents_rules then system_prompt = system_prompt .. "\n\n" .. agents_rules end
|
||||||
|
local cursor_rules = Prompts.get_cursor_rules_prompt(selected_files)
|
||||||
|
if cursor_rules then system_prompt = system_prompt .. "\n\n" .. cursor_rules end
|
||||||
|
|
||||||
---@type AvantePromptOptions
|
---@type AvantePromptOptions
|
||||||
return {
|
return {
|
||||||
|
|||||||
@@ -233,4 +233,52 @@ function M.get_agents_rules_prompt()
|
|||||||
return nil
|
return nil
|
||||||
end
|
end
|
||||||
|
|
||||||
|
---@param selected_files AvanteSelectedFile[]
|
||||||
|
---@return string | nil
|
||||||
|
function M.get_cursor_rules_prompt(selected_files)
|
||||||
|
local Utils = require("avante.utils")
|
||||||
|
local project_root = Utils.get_project_root()
|
||||||
|
local accumulated_content = ""
|
||||||
|
|
||||||
|
---@type string[]
|
||||||
|
local mdc_files = vim.fn.globpath(Utils.join_paths(project_root, ".cursor/rules"), "*.mdc", false, true)
|
||||||
|
for _, file_path in ipairs(mdc_files) do
|
||||||
|
---@type string[]
|
||||||
|
local content = vim.fn.readfile(file_path)
|
||||||
|
if content[1] ~= "---" or content[5] ~= "---" then goto continue end
|
||||||
|
local header, body = table.concat(content, "\n", 2, 4), table.concat(content, "\n", 6)
|
||||||
|
local _description, globs, alwaysApply = header:match("description:%s*(.*)\nglobs:%s*(.*)\nalwaysApply:%s*(.*)")
|
||||||
|
|
||||||
|
if not globs then goto continue end
|
||||||
|
globs = vim.trim(globs)
|
||||||
|
-- TODO: When empty string, this means the agent should request for this rule ad-hoc.
|
||||||
|
if globs == "" then goto continue end
|
||||||
|
local globs_array = vim.split(globs, ",%s*")
|
||||||
|
local path_regexes = {} ---@type string[]
|
||||||
|
for _, glob in ipairs(globs_array) do
|
||||||
|
path_regexes[#path_regexes + 1] = glob:gsub("%*%*", ".+"):gsub("%*", "[^/]*")
|
||||||
|
path_regexes[#path_regexes + 1] = glob:gsub("%*%*/", ""):gsub("%*", "[^/]*")
|
||||||
|
end
|
||||||
|
local always_apply = alwaysApply == "true"
|
||||||
|
|
||||||
|
if always_apply then
|
||||||
|
accumulated_content = accumulated_content .. "\n" .. body
|
||||||
|
else
|
||||||
|
local matched = false
|
||||||
|
for _, selected_file in ipairs(selected_files) do
|
||||||
|
for _, path_regex in ipairs(path_regexes) do
|
||||||
|
if string.match(selected_file.path, path_regex) then
|
||||||
|
accumulated_content = accumulated_content .. "\n" .. body
|
||||||
|
matched = true
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if matched then break end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
::continue::
|
||||||
|
end
|
||||||
|
return accumulated_content ~= "" and accumulated_content or nil
|
||||||
|
end
|
||||||
|
|
||||||
return M
|
return M
|
||||||
|
|||||||
Reference in New Issue
Block a user