changes for a better approach

This commit is contained in:
2024-12-12 18:57:35 +01:00
parent 7db810c04f
commit 78b0172772
7 changed files with 285 additions and 148 deletions

View File

@@ -1,88 +1,96 @@
-- lua/chatgpt_nvim/init.lua
-- Modified to:
-- 1) Use YAML for config and response parsing.
-- 2) Assume ChatGPT response is YAML of form:
-- files:
-- - path: "somefile.lua"
-- content: |
-- multi line
-- content
--
local M = {}
local context = require('chatgpt_nvim.context')
local handler = require('chatgpt_nvim.handler')
local config = require('chatgpt_nvim.config')
local ok_yaml, lyaml = pcall(require, "lyaml")
local function copy_to_clipboard(text)
vim.fn.setreg('+', text)
end
-- Parse the response from ChatGPT in YAML.
local function parse_response(raw)
if not ok_yaml then
vim.api.nvim_err_writeln("lyaml is not available. Please install lyaml for YAML parsing.")
return nil
end
local ok, data = pcall(lyaml.load, raw)
if not ok or not data then
vim.api.nvim_err_writeln("Failed to parse YAML response.")
return nil
end
-- lyaml.load returns a list of documents. We assume only one document is given.
data = data[1]
return data
end
function M.run_chatgpt_command()
-- Prompt the user for input
local conf = config.load()
local user_input = vim.fn.input("Message for O1 Model: ")
if user_input == "" then
print("No input provided.")
return
end
local project_structure = context.get_project_structure()
local dirs = conf.directories or {"."}
local project_structure = context.get_project_structure(dirs)
local all_files = context.get_project_files(dirs)
local file_sections = context.get_file_contents(all_files)
local current_file_content, current_file_path = context.get_current_file()
local readme_content = context.get_readme_content()
local sections = {
"Following you will get instructions for a development project. First you get a prompt of the user which starts with \"<<<CGP User Message\" in a line and ends with \"<<<CGP User Message End\" in a line.",
"\nThen you get the project structure which starts with \"<<<CGPT Project Structure\" in a line and ends with \"<<<CGPT Project Structure End\" in a line",
"\nThen you get the current file for context. It contains at the first line the file path, followed by its content.It starts with \"<<<CGPT Current File\" in a line and ends with \"<<<CGPT Current File End\" in a line",
"\nLastly you get the content of the README.md for context if it is present. It starts with \"<<<CGPT README\" in a line and ends with \"<<<CGPT README End\" in a line",
"\nReturn code blocks for the changes.",
"\nIf it makes sense, also update the README.md to reflect the changes made.",
"\n\n<<<CGPT User Message\n",
conf.initial_prompt .. "\n",
user_input,
"\n<<<CGPT User Message END",
"\n\n<<<CGPT Project Structure\n",
"\n\nproject structure:\n",
project_structure,
"\n<<<CGPT Project Structure END",
"\n\n<<<CGPT Current File\n",
current_file_path .. "\n" .. current_file_content,
"\n\n<<<CGPT Current File END\n",
"\n\nproject files:\n"
}
if readme_content then
table.insert(sections, "\n\n<<<CGPT README\n" .. readme_content .. "\n<<<CGPT README END")
end
-- Add all other files in configured directories
table.insert(sections, file_sections)
local prompt = table.concat(sections, "\n")
-- Copy prompt to clipboard so user can paste it into the website form.
vim.fn.setreg('+', prompt)
print("Prompt copied to clipboard! Please paste it into the website form and get the response from the ChatGPT O1 model.")
print("Press <Enter> once you've pasted the prompt into the website and have the first file ready to copy.")
vim.fn.input("") -- wait for user to press Enter
-- Copy prompt to clipboard
copy_to_clipboard(prompt)
print("Prompt copied to clipboard! Please paste it into the ChatGPT O1 model and get the YAML response.")
end
while true do
local another = vim.fn.input("Do you want to paste another file? (y/n): ")
if another:lower() ~= "y" then
handler.finish()
break
function M.run_chatgpt_paste_command()
print("Reading ChatGPT YAML response from clipboard...")
local raw = handler.get_clipboard_content()
if raw == "" then
vim.api.nvim_err_writeln("Clipboard is empty. Please copy the YAML response from ChatGPT first.")
return
end
local data = parse_response(raw)
if not data or not data.files then
vim.api.nvim_err_writeln("No 'files' field found in the YAML response.")
return
end
for _, fileinfo in ipairs(data.files) do
if fileinfo.path and fileinfo.content then
handler.write_file(fileinfo.path, fileinfo.content)
print("Wrote file: " .. fileinfo.path)
else
vim.api.nvim_err_writeln("Invalid file entry. Must have 'path' and 'content'.")
end
-- Ask user for filepath
local filepath = ""
while true do
print("Please copy the FILE PATH (the first line of the code block) to your clipboard.")
print("Press <Enter> when done.")
vim.fn.input("") -- Wait for user confirmation
filepath = handler.get_clipboard_content()
if filepath == "" then
vim.api.nvim_err_writeln("Clipboard is empty. Please copy the file path and try again.")
else
print("Got file path: " .. filepath)
break
end
end
-- Ask user for file content
local filecontent = ""
while true do
print("Now copy the FILE CONTENT (everything after the first line) to your clipboard.")
print("Press <Enter> when done.")
vim.fn.input("") -- Wait for user confirmation
filecontent = handler.get_clipboard_content()
if filecontent == "" then
vim.api.nvim_err_writeln("Clipboard is empty. Please copy the file content and try again.")
else
break
end
end
handler.write_file(filepath, filecontent)
print("Wrote file: " .. filepath)
end
end