Commit graph

531 commits

Author SHA1 Message Date
Paul Gauthier
fbbb4fe1af pass input/output as None to use stdin/out 2023-05-13 08:16:02 -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
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
5e593eb631 handle no args properly 2023-05-11 20:56:09 -07:00
Paul Gauthier
ed6ceae544 cleanup 2023-05-11 20:45:20 -07:00
Paul Gauthier
dabda6c5ea aider: Replaced console.reset() with reset_terminal() from rich.console module to reset the terminal without clearing the screen.
# Context:
USER: AttributeError: 'Console' object has no attribute 'reset'
ASSISTANT: I apologize for the confusion. It seems I made a mistake in my previous suggestion. The `rich` library does not have a `reset()` method for the `Console` object. Instead, you can use the `reset_terminal()` function from the `rich.console` module. Here's the change for `aider/main.py`:

```python
aider/main.py
<<<<<<< ORIGINAL
from rich.console import Console
=======
from rich.console import Console, reset_terminal
>>>>>>> UPDATED

aider/main.py
<<<<<<< ORIGINAL
    console = Console()
    console.reset()
=======
    reset_terminal()
>>>>>>> UPDATED
```

This change imports the `reset_terminal()` function from the `rich.console` module and replaces the `console.reset()` call with `reset_terminal()` at the end of the `main()` function to reset the terminal without clearing the screen.
2023-05-11 20:44:46 -07:00
Paul Gauthier
0ef2790464 aider: Replaced console.clear() with console.reset() to disable funky terminal modes.
# Context:
USER: i don't want to clear the screen. just disable any funky terminal modes
ASSISTANT: I apologize for the confusion. If you want to disable any funky terminal modes without clearing the screen, you can use the `rich` library's `reset()` method. Here's the change for `aider/main.py`:

```python
aider/main.py
<<<<<<< ORIGINAL
    coder.run()
    console = Console()
    console.clear()
=======
    coder.run()
    console = Console()
    console.reset()
>>>>>>> UPDATED
```

This change replaces the `console.clear()` call with `console.reset()` at the end of the `main()` function to reset the terminal without clearing the screen.
2023-05-11 20:44:01 -07:00
Paul Gauthier
71116a771b aider: Added rich library to reset the terminal at the end of main() function.
# Context:
USER: at the end of main() reset the terminal
ASSISTANT: I need to see the contents of `aider/main.py` to make the requested changes. Please provide the content of that file.
USER: Please note that I shared content of these additional files: aider/main.py
ASSISTANT: I apologize for the oversight. I see the content of `aider/main.py` now. To reset the terminal at the end of the `main()` function, you can use the `os.system()` function with the appropriate command for your operating system. Here's the change for `aider/main.py`:

```python
aider/main.py
<<<<<<< ORIGINAL

^C KeyboardInterrupt
USER: no i need pure python. can rich do it?
ASSISTANT: Yes, you can use the `rich` library to reset the terminal using pure Python. First, you need to import the `Console` class from the `rich.console` module. Then, create a `Console` instance and call its `clear()` method at the end of the `main()` function. Here's the change for `aider/main.py`:

```python
aider/main.py
<<<<<<< ORIGINAL
import os
import sys
import argparse
from dotenv import load_dotenv
from aider.coder import Coder
=======
import os
import sys
import argparse
from dotenv import load_dotenv
from aider.coder import Coder
from rich.console import Console
>>>>>>> UPDATED

aider/main.py
<<<<<<< ORIGINAL
    coder.run()
=======
    coder.run()
    console = Console()
    console.clear()
>>>>>>> UPDATED
```

This change imports the `Console` class from the `rich.console` module and adds the `console.clear()` call at the end of the `main()` function to reset the terminal.
2023-05-11 20:43:11 -07:00
Paul Gauthier
d44f732d3b main should use argv if args not provided 2023-05-11 20:34:46 -07:00
Paul Gauthier
0dd35cdaee aider: Added a new argument --yes to always say yes to every confirmation and passed it to the Coder class.
# Context:
USER: add a new arg --yes without env. pass it to Coder and store in self.yes. "Always say yes to every confirmation"
ASSISTANT: To add a new argument `--yes` and pass it to the `Coder` class, we need to make changes in `aider/main.py` and `aider/coder.py`.

In `aider/main.py`, add the new argument `--yes` to the argument parser and pass it to the `Coder` class.

```python
aider/main.py
<<<<<<< ORIGINAL
    parser.add_argument(
        "--show-diffs",
        action="store_true",
        help=f"Show diffs when committing changes (default: False, ${env_prefix}SHOW_DIFFS)",
        default=bool(int(os.environ.get(f"{env_prefix}SHOW_DIFFS", 0))),
    )
=======
    parser.add_argument(
        "--show-diffs",
        action="store_true",
        help=f"Show diffs when committing changes (default: False, ${env_prefix}SHOW_DIFFS)",
        default=bool(int(os.environ.get(f"{env_prefix}SHOW_DIFFS", 0))),
    )
    parser.add_argument(
        "--yes",
        action="store_true",
        help="Always say yes to every confirmation",
    )
>>>>>>> UPDATED
```

```python
aider/main.py
<<<<<<< ORIGINAL
    coder = Coder(args.model, fnames, pretty, args.history_file, args.show_diffs, args.auto_commits)
=======
    coder = Coder(args.model, fnames, pretty, args.history_file, args.show_diffs, args.auto_commits, args.yes)
>>>>>>> UPDATED
```

In `aider/coder.py`, add the `yes` parameter to the `Coder` class and store it in `self.yes`.

```python
aider/coder.py
<<<<<<< ORIGINAL
    def __init__(self, main_model, fnames, pretty, history_file, show_diffs, auto_commits):
=======
    def __init__(self, main_model, fnames, pretty, history_file, show_diffs, auto_commits, yes):
>>>>>>> UPDATED
```

```python
aider/coder.py
<<<<<<< ORIGINAL
        self.show_diffs = show_diffs
=======
        self.show_diffs = show_diffs
        self.yes = yes
>>>>>>> UPDATED
```

Now, the `--yes` argument is added and passed to the `Coder` class. You can use `self.yes` in the `Coder` class to determine if the user wants to always say yes to every confirmation.
2023-05-11 17:41:23 -07:00
Paul Gauthier
490a6999fb allow main() w/o args 2023-05-11 17:28:03 -07:00
Paul Gauthier
7c50fd654a aider: Passed argv to main() and parse_args().
# Context:
USER: have __main__ pass argv to main(). then pass that into parse_args
ASSISTANT: To pass `argv` to `main()` and then pass it to `parse_args`, you need to modify the `main()` function definition to accept an argument and pass `sys.argv[1:]` to it. Then, pass the argument to `parse_args()`.

Here's the change:

```python
aider/main.py
<<<<<<< ORIGINAL
def main():
=======
def main(argv):
>>>>>>> UPDATED

aider/main.py
<<<<<<< ORIGINAL
    args = parser.parse_args()
=======
    args = parser.parse_args(argv)
>>>>>>> UPDATED

aider/main.py
<<<<<<< ORIGINAL
    status = main()
=======
    status = main(sys.argv[1:])
>>>>>>> UPDATED
```
2023-05-11 17:16:40 -07:00
Paul Gauthier
b018eade37 aider: Added auto_commits as a new argument to the Coder() class and updated main() function to pass the argument.
# Context:
USER: add auto_commits as a new arg to Coder(). assign it to self.auto_commit
ASSISTANT: To add `auto_commits` as a new argument to the `Coder()` class and assign it to `self.auto_commit`, you need to update the `__init__` method in the `aider/coder.py` file:

```python
aider/coder.py
<<<<<<< ORIGINAL
    def __init__(self, main_model, fnames, pretty, history_file, show_diffs):
=======
    def __init__(self, main_model, fnames, pretty, history_file, show_diffs, auto_commits):
>>>>>>> UPDATED
        self.history_file = history_file

        # ... (rest of the code remains unchanged)

        self.show_diffs = show_diffs
<<<<<<< ORIGINAL
=======
        self.auto_commit = auto_commits
>>>>>>> UPDATED
```

Then, update the `main()` function in the `aider/main.py` file to pass the `auto_commits` argument when creating a new `Coder` instance:

```python
aider/main.py
<<<<<<< ORIGINAL
    coder = Coder(args.model, fnames, pretty, args.history_file, args.show_diffs)
=======
    coder = Coder(args.model, fnames, pretty, args.history_file, args.show_diffs, args.auto_commits)
>>>>>>> UPDATED
    coder.commit(ask=True, prefix="wip: ", which="repo_files")

    # ... (rest of the code remains unchanged)
```
2023-05-11 15:45:31 -07:00
Paul Gauthier
8bcbc5b0de Changed help text for disabling auto commit of changes. 2023-05-11 15:43:57 -07:00
Paul Gauthier
37741bed2a aider: Reversed the logic of the --no-auto-commits variable, storing to an "auto_commits" var with default value of True, and updated the environment variable to AUTO_COMMITS in aider/main.py.
# Context:
USER: reverse the logic of the --no-aut-commits variable, so it's storing to an "auto_commits" var. default is true. env is AUTO_COMMITS. but keep the switch as --no-auto-commits
ASSISTANT: To reverse the logic of the `--no-auto-commits` variable, we need to change the variable name to `auto_commits`, set its default value to `True`, and update the environment variable to `AUTO_COMMITS`. Please provide the contents of the file where this variable is defined, so I can suggest the necessary changes.
USER: Please note that I shared content of these additional files: aider/main.py
ASSISTANT: I apologize for the oversight. Here are the changes to reverse the logic of the `--no-auto-commits` variable in the `aider/main.py` file:

```python
aider/main.py
<<<<<<< ORIGINAL
    parser.add_argument(
        "--no-auto-commits",
        action="store_true",
        help=f"Do not automatically commit changes (default: False, ${env_prefix}NO_AUTO_COMMITS)",
        default=bool(int(os.environ.get(f"{env_prefix}NO_AUTO_COMMITS", 0))),
    )
=======
    parser.add_argument(
        "--no-auto-commits",
        action="store_false",
        dest="auto_commits",
        help=f"Do not automatically commit changes (default: True, ${env_prefix}AUTO_COMMITS)",
        default=bool(int(os.environ.get(f"{env_prefix}AUTO_COMMITS", 1))),
    )
>>>>>>> UPDATED
```

This change will store the value of the `--no-auto-commits` flag in the `auto_commits` variable, with a default value of `True`. The environment variable is also updated to `AUTO_COMMITS`.
2023-05-11 15:43:18 -07:00
Paul Gauthier
a6d9581e5f aider: Added a --no-auto-commits argument and an environment variable.
# Context:
USER: add a --no-auto-commits arg and env var "Do not automatically commit changes"
ASSISTANT: To add a `--no-auto-commits` argument and an environment variable, we will update the `aider/main.py` file. We will add a new argument to the `argparse.ArgumentParser` and use the environment variable to set its default value.

```python
aider/main.py
<<<<<<< ORIGINAL
    parser.add_argument(
        "--show-diffs",
        action="store_true",
        help=f"Show diffs when committing changes (default: False, ${env_prefix}SHOW_DIFFS)",
        default=bool(int(os.environ.get(f"{env_prefix}SHOW_DIFFS", 0))),
    )
=======
    parser.add_argument(
        "--no-auto-commits",
        action="store_true",
        help=f"Do not automatically commit changes (default: False, ${env_prefix}NO_AUTO_COMMITS)",
        default=bool(int(os.environ.get(f"{env_prefix}NO_AUTO_COMMITS", 0))),
    )
    parser.add_argument(
        "--show-diffs",
        action="store_true",
        help=f"Show diffs when committing changes (default: False, ${env_prefix}SHOW_DIFFS)",
        default=bool(int(os.environ.get(f"{env_prefix}SHOW_DIFFS", 0))),
    )
>>>>>>> UPDATED
```

Now, you can use the `--no-auto-commits` argument when running the script, and it will also read the `AIDER_NO_AUTO_COMMITS` environment variable to set its default value.
2023-05-11 15:41:09 -07:00
Paul Gauthier
14b45f40f6 finishing support for which=repo_files 2023-05-11 09:22:51 -07:00
Paul Gauthier
6e1282202d aider: Changed nargs attribute of "files" argument to make it optional.
# Context:
USER: make the file args optionall. the user can run the command without specifying files.
ASSISTANT: To make the file arguments optional, we need to change the nargs attribute of the "files" argument in the ArgumentParser.

```python
aider/main.py
<<<<<<< ORIGINAL
    parser.add_argument(
        "files",
        metavar="FILE",
        nargs="+",
        help="a list of source code files",
    )
=======
    parser.add_argument(
        "files",
        metavar="FILE",
        nargs="*",
        help="a list of source code files (optional)",
    )
>>>>>>> UPDATED
```
2023-05-10 19:28:58 -07:00
Paul Gauthier
1fedba8505 aider: Added environment variable override for --model command-line argument.
# Context:
USER: add an env override for --model
ASSISTANT: I will add an environment variable override for the `--model` command-line argument in the `aider/main.py` file.

```python
aider/main.py
<<<<<<< ORIGINAL
    parser.add_argument(
        "--model",
        metavar="MODEL",
        default="gpt-4",
        help="Specify the model to use for the main chat (default: gpt-4)",
    )
=======
    parser.add_argument(
        "--model",
        metavar="MODEL",
        default=os.environ.get(f"{env_prefix}MODEL", "gpt-4"),
        help=f"Specify the model to use for the main chat (default: gpt-4, ${env_prefix}MODEL)",
    )
>>>>>>> UPDATED
```

Now, the `--model` command-line argument can be overridden using the `AIDER_MODEL` environment variable.
2023-05-10 17:57:51 -07:00
Paul Gauthier
4c139ee0a2 wip: Changed the help message for the history file and removed the commit-dirty option, added a debug option to apply changes from a file. 2023-05-10 17:54:49 -07:00
Paul Gauthier
0fdd5d101b added aider: prefix to gpt generated edits 2023-05-09 14:06:26 -07:00
Paul Gauthier
540c0b10b9 Add --show-diffs parameter and only print diffs if it is set to True.
# Context:
USER: add a --show-diffs parameter  which defaults to false. allow an env var to override the default. pass this to Coder.__init__() and use it to set a self.show_diffs. only self.console.print(Text(diffs)) if it is true.
ASSISTANT: To add a `--show-diffs` parameter with a default value of `False` and allow an environment variable to override the default, we will make changes to `aider/main.py`. We will also pass this value to `Coder.__init__()` and use it to set `self.show_diffs`. Finally, we will only print the diffs if `self.show_diffs` is `True`.

Here are the changes:

```python
aider/main.py
<<<<<<< ORIGINAL
        default=bool(int(os.environ.get(f"{env_prefix}COMMIT_DIRTY", 0))),
    )
    args = parser.parse_args()
=======
        default=bool(int(os.environ.get(f"{env_prefix}COMMIT_DIRTY", 0))),
    )
    parser.add_argument(
        "--show-diffs",
        action="store_true",
        help=f"Show diffs when committing changes (default: False, ${env_prefix}SHOW_DIFFS)",
        default=bool(int(os.environ.get(f"{env_prefix}SHOW_DIFFS", 0))),
    )
    args = parser.parse_args()
>>>>>>> UPDATED
```

```python
aider/main.py
<<<<<<< ORIGINAL
    coder = Coder(args.model, fnames, pretty, args.history_file)
=======
    coder = Coder(args.model, fnames, pretty, args.history_file, args.show_diffs)
>>>>>>> UPDATED
```

```python
aider/coder.py
<<<<<<< ORIGINAL
    def __init__(self, main_model, files, pretty, history_file):
=======
    def __init__(self, main_model, files, pretty, history_file, show_diffs):
>>>>>>> UPDATED
```

```python
aider/coder.py
<<<<<<< ORIGINAL
        self.pretty = pretty
=======
        self.pretty = pretty
        self.show_diffs = show_diffs
>>>>>>> UPDATED
```

```python
aider/coder.py
<<<<<<< ORIGINAL
        self.console.print(Text(diffs))
=======
        if self.show_diffs:
            self.console.print(Text(diffs))
>>>>>>> UPDATED
```

These changes will add the `--show-diffs` parameter and only print the diffs if the parameter is set to `True`.
2023-05-09 13:04:43 -07:00
Paul Gauthier
a591c09a1a fixed import 2023-05-09 11:36:46 -07:00
Paul Gauthier
a2eb1aff11 Use relative import for Coder class in main.py
# Context:
USER: $ python3 ./aider/main.py
Traceback (most recent call last):
  File "/Users/gauthier/Projects/aider/./aider/main.py", line 5, in <module>
    from aider.coder import Coder
ModuleNotFoundError: No module named 'aider'

ASSISTANT: It seems like there is an issue with importing the `Coder` class from the `aider` package. To fix this, you can try adding the current directory to the `sys.path`. Here's the change you need to make in the `aider/main.py` file:

```python
aider/main.py
<<<<<<< ORIGINAL
import os
import sys
import argparse
from dotenv import load_dotenv
from aider.coder import Coder
=======
import os
import sys
sys.path.append(os.path.dirname(os.path
^C KeyboardInterrupt
USER: i would rather not do that. is there a different way to do the import so that it works both when the aider package is pip installed and also when its being run from the repo checkout?
ASSISTANT: Yes, you can use a relative import instead of an absolute import. This will work both when the package is installed via pip and when it's being run from the repo checkout. Here's the change you need to make in the `aider/main.py` file:

```python
aider/main.py
<<<<<<< ORIGINAL
from dotenv import load_dotenv
from aider.coder import Coder
=======
from dotenv import load_dotenv
from .coder import Coder
>>>>>>> UPDATED
```

This change replaces the absolute import with a relative import, which should resolve the `ModuleNotFoundError`.
2023-05-09 11:34:07 -07:00
Paul Gauthier
8e79a7cf9b WIP: Refactor import statement for Coder in main.py. 2023-05-09 11:32:52 -07:00
Paul Gauthier
984e2f78ce moved into subdir 2023-05-09 10:52:18 -07:00
Renamed from main.py (Browse further)