Commit graph

3245 commits

Author SHA1 Message Date
Paul Gauthier
55d3540529 aider: Fixed prompt() function call in get_input() method to pass stdin and stdout arguments instead of input and output.
# Context:
USER: FAILED tests/test_main.py::TestMain::test_main_with_empty_git_dir_new_file - TypeError: prompt() got an unexpected keyword argument 'input'
ASSISTANT: I apologize for the confusion. It seems I made a mistake in the `prompt_toolkit.prompt()` function call. The `prompt()` function accepts `stdin` and `stdout` arguments instead of `input` and `output`. Here's the fix:

Update the `prompt()` function call in the `get_input()` method in `aider/getinput.py`:

```python
aider/getinput.py
<<<<<<< ORIGINAL
            input=self.input,
            output=self.output,
=======
            stdin=self.input,
            stdout=self.output,
>>>>>>> UPDATED
```

These changes will ensure that the `input` and `output` arguments are passed correctly to the `prompt_toolkit.prompt()` function.
2023-05-13 07:12:42 -07:00
Paul Gauthier
cea9d2ae71 aider: Updated InputOutput class to accept input and output arguments and passed them to prompt_toolkit.prompt() function.
# Context:
USER: we need to pass those into InputOutput and to prompt_toolkit right?
ASSISTANT: Yes, you're right. We need to pass the `input` and `output` arguments to the `InputOutput` class and then to the `prompt_toolkit.prompt()` function. Here's how to modify the `aider/getinput.py` and `aider/main.py` files:

In `aider/getinput.py`, update the `InputOutput` class to accept `input` and `output` arguments:

```python
aider/getinput.py
<<<<<<< ORIGINAL
class InputOutput:
    def __init__(self, pretty, yes, input_history_file, chat_history_file):
=======
class InputOutput:
    def __init__(self, pretty, yes, input_history_file, chat_history_file, input=None, output=None):
        self.input = input
        self.output = output
>>>>>>> UPDATED
```

Now, update the `prompt()` function calls in the `get_input()` method to use the `input` and `output` arguments:

```python
aider/getinput.py
<<<<<<< ORIGINAL
            line = prompt(
                show,
                completer=completer_instance,
                history=FileHistory(self.input_history_file),
                style=style,
                reserve_space_for_menu=4,
                complete_style=CompleteStyle.MULTI_COLUMN,
            )
=======
            line = prompt(
                show,
                completer=completer_instance,
                history=FileHistory(self.input_history_file),
                style=style,
                reserve_space_for_menu=4,
                complete_style=CompleteStyle.MULTI_COLUMN,
                input=self.input,
                output=self.output,
            )
>>>>>>> UPDATED
```

In `aider/main.py`, pass the `input` and `output` arguments to the `InputOutput` class:

```python
aider/main.py
<<<<<<< ORIGINAL
    io = InputOutput(args.pretty, args.yes, args.input_history_file, args.chat_history_file)
=======
    io = InputOutput(args.pretty, args.yes, args.input_history_file, args.chat_history_file, input=input, output=output)
>>>>>>> UPDATED
```

These changes will ensure that the `input` and `output` arguments are passed to the `InputOutput` class and then to the `prompt_toolkit.prompt()` function.
2023-05-13 07:12:02 -07:00
Paul Gauthier
79dfba98d3 aider: Fixed main() function to accept input and output keyword arguments.
# Context:
USER: FAILED tests/test_main.py::TestMain::test_main_with_empty_git_dir_new_file - TypeError: main() got an unexpected keyword argument 'input'
ASSISTANT: I apologize for the confusion. It seems I made a mistake in the `main()` function definition in `aider/main.py`. The `main()` function should accept `input` and `output` keyword arguments. Here's the fix:

```python
aider/main.py
<<<<<<< ORIGINAL
def main(args=None):
    if args is None:
        args = sys.argv[1:]
=======
def main(args=None, input=None, output=None):
    if args is None:
        args = sys.argv[1:]
    if input is None:
        input = sys.stdin
    if output is None:
        output = sys.stdout
>>>>>>> UPDATED
```

Now, the `main()` function will accept the `input` and `output` keyword arguments, and the tests should pass.
2023-05-13 07:10:29 -07:00
Paul Gauthier
3bec170130 better 2023-05-12 23:20:18 -07:00
Paul Gauthier
dc5de1794e better 2023-05-12 23:12:39 -07:00
Paul Gauthier
9567be8c6a Refactor git file tracking in Coder class. 2023-05-12 23:01:45 -07:00
Paul Gauthier
a711debd1d aider: Checked if the new file is already in the git repo before adding it.
# Context:
USER: do the TODO
ASSISTANT: I see that there is a TODO comment in the `aider/coder.py` file. To address the TODO, I will check if the new file is already in the git repo before adding it. Here's the change:

```python
aider/coder.py
<<<<<<< ORIGINAL
                if not Path(full_path).exists():
                    Path(full_path).parent.mkdir(parents=True, exist_ok=True)
                    Path(full_path).touch()

                self.abs_fnames.add(full_path)

                # TODO: check if it's already in the repo
                if self.repo and self.io.confirm_ask(f"Add {path} to git?"):
=======
                if not Path(full_path).exists():
                    Path(full_path).parent.mkdir(parents=True, exist_ok=True)
                    Path(full_path).touch()

                self.abs_fnames.add(full_path)

                # Check if the file is already in the repo
                tracked_files = set(self.repo.git.ls_files().splitlines())
                relative_fname = self.get_rel_fname(full_path)
                if relative_fname not in tracked_files and self.repo and self.io.confirm_ask(f"Add {path} to git?"):
>>>>>>> UPDATED
                    self.repo.git.add(full_path)
```

This change checks if the new file is already in the git repo before adding it. If you have any other requests or need further clarification, please let me know.
2023-05-12 23:00:48 -07:00
Paul Gauthier
4eed5a1b90 wip: Refactor prompts.py and coder.py to improve user experience. 2023-05-12 23:00:01 -07:00
Paul Gauthier
669a2fce60 Changed prompts to include more detailed steps and added new description to examples/README. 2023-05-12 21:23:57 -07:00
Paul Gauthier
c1d551d970 wip: Removed writing to ".aider.last.md" file. 2023-05-12 15:50:38 -07:00
Paul Gauthier
238287312e Added new files to the git repo message 2023-05-12 15:44:36 -07:00
Paul Gauthier
ae7d5c33b4 Refactored get_rel_fname method and updated print statement in Coder class. 2023-05-12 15:36:45 -07:00
Paul Gauthier
a1cb2e0cd2 Refactor Coder class to use get_rel_fname method instead of os.path.relpath. 2023-05-12 15:30:43 -07:00
Paul Gauthier
bddef03323 wip: Changed chat history format and added italics to some messages. 2023-05-12 15:23:36 -07:00
Paul Gauthier
bc12ecf82c Changed print statement to avoid logging or further colorizing. 2023-05-12 15:06:29 -07:00
Paul Gauthier
69d5e8a624 wip: Updated print statements and appended new line character to session start message. 2023-05-12 15:03:12 -07:00
Paul Gauthier
991e143b63 aider: Added date/time stamp to the "New session started" message.
# Context:
USER: add a date/time stamp to the New session started msg
ASSISTANT: To add a date/time stamp to the "New session started" message, we will import the `datetime` module and use the `datetime.now()` function to get the current date and time. Then, we will format the date/time string and append it to the message.

Here's the change to the `aider/getinput.py` file:

```python
aider/getinput.py
<<<<<<< ORIGINAL
import sys
import time
import random
from pathlib import Path
=======
import sys
import time
import random
from pathlib import Path
from datetime import datetime
>>>>>>> UPDATED

aider/getinput.py
<<<<<<< ORIGINAL
    def __init__(self, pretty, yes, input_history_file, chat_history_file):
        self.pretty = pretty
        self.yes = yes
        self.input_history_file = input_history_file
        self.chat_history_file = Path(chat_history_file)

        if pretty:
            self.console = Console()
        else:
            self.console = Console(force_terminal=True, no_color=True)

        self.append_chat_history('# New session started', False)
=======
    def __init__(self, pretty, yes, input_history_file, chat_history_file):
        self.pretty = pretty
        self.yes = yes
        self.input_history_file = input_history_file
        self.chat_history_file = Path(chat_history_file)

        if pretty:
            self.console = Console()
        else:
            self.console = Console(force_terminal=True, no_color=True)

        current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
        self.append_chat_history(f'# New session started at {current_time}', False)
>>>>>>> UPDATED
```
2023-05-12 14:49:33 -07:00
Paul Gauthier
0d11873683 wip: Added chat history message for new session. 2023-05-12 14:48:29 -07:00
Paul Gauthier
ca6a214b1a Added a condition to check if silent is False before outputting ai response. 2023-05-12 14:44:18 -07:00
Paul Gauthier
6a94c3756a wip: Added ai_output method to InputOutput class and modified append_chat_history method to handle linebreaks and trailing spaces. 2023-05-12 14:42:34 -07:00
Paul Gauthier
54c32283ee use trailing spaces for linebreaks 2023-05-12 14:31:37 -07:00
Paul Gauthier
73b3151f6a wip: Added chat history logging to InputOutput class. 2023-05-12 14:23:21 -07:00
Paul Gauthier
129f70dba8 Added chat history file to InputOutput constructor. 2023-05-12 14:02:10 -07:00
Paul Gauthier
e44677327f aider: Added a new argument --chat-history-file with a default value of .aider.chat.history.md.
# Context:
USER: add a new arg --chat-history-file arg which is similar to --input-history-file but has a default of .aider.chat.history.md
ASSISTANT: To add the new argument `--chat-history-file`, you can add a new `parser.add_argument()` call in the `aider/main.py` file. Here's the change:

```python
aider/main.py
<<<<<<< ORIGINAL
    parser.add_argument(
        "--input-history-file",
        metavar="INPUT_HISTORY_FILE",
        default=os.environ.get(f"{env_prefix}INPUT_HISTORY_FILE", ".aider.input.history"),
        help=(
            "Specify the chat input history file (default: .aider.input.history,"
            f" ${env_prefix}INPUT_HISTORY_FILE)"
        ),
    )
=======
    parser.add_argument(
        "--input-history-file",
        metavar="INPUT_HISTORY_FILE",
        default=os.environ.get(f"{env_prefix}INPUT_HISTORY_FILE", ".aider.input.history"),
        help=(
            "Specify the chat input history file (default: .aider.input.history,"
            f" ${env_prefix}INPUT_HISTORY_FILE)"
        ),
    )
    parser.add_argument(
        "--chat-history-file",
        metavar="CHAT_HISTORY_FILE",
        default=os.environ.get(f"{env_prefix}CHAT_HISTORY_FILE", ".aider.chat.history.md"),
        help=(
            "Specify the chat history file (default: .aider.chat.history.md,"
            f" ${env_prefix}CHAT_HISTORY_FILE)"
        ),
    )
>>>>>>> UPDATED
```

This will add the new `--chat-history-file` argument with a default value of `.aider.chat.history.md`.
2023-05-12 14:00:12 -07:00
Paul Gauthier
200ecf5a1f wip: Changed history_file to input_history_file in InputOutput constructor. 2023-05-12 13:57:45 -07:00
Paul Gauthier
841dfd0a4a aider: Changed --history-file to --input-history-file, updated env var and default file name.
# Context:
USER: change --history-file to be --input-history-file. change the env var too. change the default fname to .aider.input.history
ASSISTANT: ```python
aider/main.py
<<<<<<< ORIGINAL
    parser.add_argument(
        "--history-file",
        metavar="HISTORY_FILE",
        default=os.environ.get(f"{env_prefix}HISTORY_FILE", ".aider.history"),
        help=(
            "Specify the chat input history file (default: .aider.history,"
            f" ${env_prefix}HISTORY_FILE)"
        ),
    )
=======
    parser.add_argument(
        "--input-history-file",
        metavar="INPUT_HISTORY_FILE",
        default=os.environ.get(f"{env_prefix}INPUT_HISTORY_FILE", ".aider.input.history"),
        help=(
            "Specify the chat input history file (default: .aider.input.history,"
            f" ${env_prefix}INPUT_HISTORY_FILE)"
        ),
    )
>>>>>>> UPDATED
```

I've updated the argument name, environment variable, and default file name as requested.
2023-05-12 13:56:48 -07:00
Paul Gauthier
4ff5b0e115 Refactor InputOutput class to accept history_file as an argument and remove it from get_input method. 2023-05-12 13:55:03 -07:00
Paul Gauthier
b074cae5c7 Changed the Commands class to use io instead of console and added error handling. 2023-05-12 13:50:17 -07:00
Paul Gauthier
dd82f64a9e wip: Removed unnecessary code and added a console rule when getting input. 2023-05-12 13:44:46 -07:00
Paul Gauthier
85515b4788 Refactored the code to use a new io tool method and removed the tool_error method. 2023-05-12 13:37:22 -07:00
Paul Gauthier
91f23f3700 aider: Replaced self.console.print() calls with self.io.tool_error() calls for [red] strings and added missing instances.
# Context:
USER: replace all the self.console.print() calls that contain [red] with calls to self.io.tool_error() with [red] removed from the string
ASSISTANT: I apologize for the confusion earlier. I see that the changes have already been committed. There is no need to make the same changes again. If you have any other requests or need assistance with the code, please let me know.
USER: you missed 2 that contain " edit to {path}"
ASSISTANT: You're right, I missed those. Here are the changes for the remaining instances:

aider/coder.py
<<<<<<< ORIGINAL
            self.console.print(f"[red]Skipping edit to {path}")
=======
            self.io.tool_error(f"Skipping edit to {path}")
>>>>>>> UPDATED

aider/coder.py
<<<<<<< ORIGINAL
            self.console.print(f"[red]Failed to apply edit to {path}")
=======
            self.io.tool_error(f"Failed to apply edit to {path}")
>>>>>>> UPDATED
2023-05-12 13:32:39 -07:00
Paul Gauthier
fca8ea3c21 aider: Replaced all self.console.print() calls with self.io.tool_error() calls.
# Context:
USER: replace all the self.console.print() calls that contain [red] with calls to self.io.tool_error() with [red] removed from the string
ASSISTANT: aider/coder.py
<<<<<<< ORIGINAL
            self.console.print("[red]^C again to quit")
=======
            self.io.tool_error("^C again to quit")
>>>>>>> UPDATED

aider/coder.py
<<<<<<< ORIGINAL
            self.io.tool_error("Malformed ORIGINAL/UPDATE blocks, retrying...")
            self.io.tool_error(err)
=======
            self.io.tool_error("Malformed ORIGINAL/UPDATE blocks, retrying...")
            self.io.tool_error(str(err))
>>>>>>> UPDATED

aider/coder.py
<<<<<<< ORIGINAL
            self.console.print("[red]Unable to get commit message from gpt-3.5-turbo. Use /commit to try again.\n")
=======
            self.io.tool_error("Unable to get commit message from gpt-3.5-turbo. Use /commit to try again.")
>>>>>>> UPDATED

aider/coder.py
<<<<<<< ORIGINAL
            self.console.print("[red]Skipped commmit.")
=======
            self.io.tool_error("Skipped commmit.")
>>>>>>> UPDATED
2023-05-12 13:31:32 -07:00
Paul Gauthier
92e091f5a6 fix bug if ORIG/UPD block is missing trailing newline; added test 2023-05-12 13:30:39 -07:00
Paul Gauthier
1d7fffe8ab wip: Refactor Input class to InputOutput and add tool_error method. 2023-05-12 13:17:37 -07:00
Paul Gauthier
57f1b3139a wip: Removed unused import and changed Text object to string. 2023-05-12 13:12:50 -07:00
Paul Gauthier
919cfc2359 aider: Replaced all self.console.print() calls with self.io.tool_error() calls with [red] removed from the string.
# Context:
USER: replace all the self.console.print() calls that contain [red] with calls to self.io.tool_error() with [red] removed from the string
ASSISTANT: aider/coder.py
<<<<<<< ORIGINAL
            self.console.print(
                f"[red]This tool will almost certainly fail to work with {main_model}"
            )
=======
            self.io.tool_error(f"This tool will almost certainly fail to work with {main_model}")
>>>>>>> UPDATED

aider/coder.py
<<<<<<< ORIGINAL
            self.console.print("[red]No suitable git repo, will not automatically commit edits.")
=======
            self.io.tool_error("No suitable git repo, will not automatically commit edits.")
>>>>>>> UPDATED

aider/coder.py
<<<<<<< ORIGINAL
            self.console.print("[red]Files are not in a git repo.")
=======
            self.io.tool_error("Files are not in a git repo.")
>>>>>>> UPDATED

aider/coder.py
<<<<<<< ORIGINAL
            self.console.print("[red]Files are in different git repos.")
=======
            self.io.tool_error("Files are in different git repos.")
>>>>>>> UPDATED

aider/coder.py
<<<<<<< ORIGINAL
                self.console.print("[red]Skipped adding new files to the git repo.")
=======
                self.io.tool_error("Skipped adding new files to the git repo.")
>>>>>>> UPDATED

aider/coder.py
<<<<<<< ORIGINAL
            self.console.print("[red]Warning: no changes found in tracked files.")
=======
            self.io.tool_error("Warning: no changes found in tracked files.")
>>>>>>> UPDATED

aider/coder.py
<<<<<<< ORIGINAL
            self.console.print("[red]Malformed ORIGINAL/UPDATE blocks, retrying...")
            self.console.print("[red]", Text(err))
=======
            self.io.tool_error("Malformed ORIGINAL/UPDATE blocks, retrying...")
            self.io.tool_error(Text(err))
>>>>>>> UPDATED

Please note that I couldn't find the `self.io.tool_error()` method in the provided code. You may need to create this method in the appropriate class or provide the correct method name to replace the `self.console.print()` calls.
2023-05-12 13:03:34 -07:00
Paul Gauthier
b7299565f1 refac 2023-05-12 10:53:23 -07:00
Paul Gauthier
0325fc40ac roughed in switch to prompt toolkit for _ask funcs 2023-05-12 08:15:32 -07:00
Paul Gauthier
9a4dfae07a wip 2023-05-12 08:05:57 -07:00
Paul Gauthier
0c3b772172 prompt eng for new files 2023-05-11 23:24:38 -07:00
Paul Gauthier
596a6d1ae1 make parent dirs 2023-05-11 23:24:29 -07:00
Paul Gauthier
d45b7ae752 handle filenames above the triple quotes 2023-05-11 22:59:02 -07:00
Paul Gauthier
9ef50d8f3d make dirs for new files 2023-05-11 22:55:26 -07:00
Paul Gauthier
89149b307d aider: Changed fname.touch() to fname.touch(parents=True) to create any missing directories in the path.
# Context:
USER: when calling Path.touch() can we ask it to make missing dirs?
ASSISTANT: Yes, you can use the `parents` parameter in the `touch()` method to create any missing directories. Set `parents=True` to create any missing directories in the path. Here's the change needed in the `aider/coder.py` file:

```python
aider/coder.py
<<<<<<< ORIGINAL
                fname.touch()
=======
                fname.touch(parents=True)
>>>>>>> UPDATED
```
2023-05-11 22:37:59 -07:00
Paul Gauthier
5ddaf55dd2 Merge branch 'main' into pattern 2023-05-11 22:19:12 -07:00
Paul Gauthier
c9ef516bdb cleanup \[ from prompt string which was generating improper escape warnings 2023-05-11 22:19:01 -07:00
Paul Gauthier
52a7c4b786 Merge branch 'main' into pattern 2023-05-11 22:15:39 -07:00
Paul Gauthier
6e4f17d377 cleanup 2023-05-11 22:06:32 -07:00
Paul Gauthier
684b0e4964 Provide structured errors to GPT if it generates malformed ORIG/UPD blocks 2023-05-11 22:06:02 -07:00
Paul Gauthier
6686ea1005 Only ask to commit when dirty files are touched 2023-05-11 21:14:40 -07:00