fix: execute command tool, improving prompts

This commit is contained in:
2025-01-31 18:22:57 +01:00
parent a27e3da769
commit deaec8094b
4 changed files with 24 additions and 7 deletions

View File

@@ -2,8 +2,6 @@ project_name: "chatgpt.vim"
default_prompt_blocks: default_prompt_blocks:
- "basic-prompt" - "basic-prompt"
- "secure-coding" - "secure-coding"
initial_files:
- "README.md"
debug: false debug: false
improved_debug: false improved_debug: false

View File

@@ -342,7 +342,7 @@ local M = {
- Always start with 1 or 2, but afterwards you can mix 1, 2, 3, and 4 as needed. - Always start with 1 or 2, but afterwards you can mix 1, 2, 3, and 4 as needed.
- Include `project_name: "my_project"` whenever you call `tools`. - Include `project_name: "my_project"` whenever you call `tools`.
- Keep each tool call in the `tools` array (multiple if needed). - Keep each tool call in the `tools` array (multiple if needed).
- **Never write to a file you havent read** in this session (unless creating a new file). - **Never write to a file you havent read** in this session and already got the content from an response (unless creating a new file).
- Follow secure coding guidelines (input validation, least privilege, no sensitive info in logs, etc.). - Follow secure coding guidelines (input validation, least privilege, no sensitive info in logs, etc.).
- When done, provide a final answer **without** calling any tools. - When done, provide a final answer **without** calling any tools.
]], ]],

View File

@@ -1,17 +1,36 @@
local M = {} local M = {}
M.run = function(tool_call, conf, prompt_user_tool_accept, is_subpath, read_file) M.run = function(tool_call, conf, prompt_user_tool_accept, is_subpath, read_file)
-- Validate the command exists
local cmd = tool_call.command local cmd = tool_call.command
if not cmd then if not cmd then
return "[executeCommand] Missing 'command'." return "[executeCommand] Missing 'command'."
end end
local handle = io.popen(cmd)
-- Capture stderr and stdout together by redirecting stderr to stdout
-- This will help diagnose if there's an error causing no output
cmd = cmd .. " 2>&1"
-- Attempt to popen the command
local handle = io.popen(cmd, "r")
if not handle then if not handle then
return string.format("Tool [executeCommand '%s'] FAILED to popen.", cmd) return string.format("Tool [executeCommand '%s'] FAILED to popen.", cmd)
end end
-- Read the full output (stdout + stderr)
local result = handle:read("*a") or "" local result = handle:read("*a") or ""
handle:close()
return string.format("Tool [executeCommand '%s'] Result:\n%s", cmd, result) -- Attempt to close, capturing exit info
local _, exit_reason, exit_code = handle:close()
-- Provide a richer summary including exit code and reason
return string.format(
"Tool [executeCommand '%s'] exited with code %s (%s)\n%s",
cmd,
tostring(exit_code),
tostring(exit_reason),
result
)
end end
return M return M

View File

@@ -25,7 +25,7 @@ M.available_tools = {
{ {
name = "executeCommand", name = "executeCommand",
usage = "Run a shell command. Provide { tool='executeCommand', command='...' }", usage = "Run a shell command. Provide { tool='executeCommand', command='...' }",
explanation = "Use with caution, especially for destructive operations (rm, sudo, etc.)." explanation = "Just run one single command per tool invocation, without comment. It must be a single line. Use with caution, especially for destructive operations (rm, sudo, etc.)."
}, },
} }