I’ve played around with this a bit while building my DesktopGPT plugin that connects ChatGPT to your local files and applications.
The most reliable (but still finicky) way that I found is with simple find and replace. This obviously has its own downsides (like replacing parts of the code you didn’t intend to), but this was never an issue for me since there was always enough code context in the search string to uniquely identify the part of the code that needs fixing.
Here is an example from my early testing.
The commands that ChatGPT issued in the last response were:
{
"directoryName": "file:///Users/dounan/dev/desktop-gpt/mac/DesktopGPT/DesktopGPT/",
"filePath": "RemoteControlViewModel.swift",
"searchString": " webSocketTask.resume()\n self.webSocketTask = webSocketTask\n \n listenForCommands()\n }",
"replacementString": " webSocketTask.resume()\n self.webSocketTask = webSocketTask\n \n handleConnectionEstablished()\n listenForCommands()\n }\n \n private func handleConnectionEstablished() {\n DispatchQueue.main.async {\n self.status = \"Connected\"\n }\n }"
}
{
"directoryName": "file:///Users/dounan/dev/desktop-gpt/mac/DesktopGPT/DesktopGPT/",
"filePath": "RemoteControlViewModel.swift",
"searchString": " self?.showErrorNotification(message: \"Connection failed: \\(error.localizedDescription)\")\n }\n }\n }\n }",
"replacementString": " self?.showErrorNotification(message: \"Connection failed: \\(error.localizedDescription)\")\n self?.retryConnection()\n }\n }\n }\n }\n \n private func retryConnection() {\n DispatchQueue.main.asyncAfter(deadline: .now() + retryInterval) { [weak self] in\n self?.connectToServer()\n }\n // Increase the retry interval for the next attempt, up to a maximum of 10 seconds.\n retryInterval = min(retryInterval * 2, 10.0)\n }\n \n private var retryInterval: TimeInterval = 1.0"
}