Commit graph

420 commits

Author SHA1 Message Date
Paul Gauthier
a87de46371 aider: Split file content into words based on non-alphanumeric characters using re module in FileContentCompleter.
# Context:
USER: have FileContentCompleter(Completer) split the files into words on non-alphanums. so each word is a contiguous sequence of alphanums. non-alphanums are ignored, and only used to split.
ASSISTANT: To make the `FileContentCompleter` split the file content into words based on non-alphanumeric characters, you can use the `re` module to split the content. Here's the change you need to make:

```python
aider/getinput.py
<<<<<<< ORIGINAL
            for word in content.split():
=======
            import re
            for word in re.split(r'\W+', content):
>>>>>>> UPDATED
```

This change imports the `re` module and uses the `re.split()` function with the pattern `\W+` to split the content into words based on non-alphanumeric characters.
2023-05-09 14:12:49 -07:00
Paul Gauthier
0fdd5d101b added aider: prefix to gpt generated edits 2023-05-09 14:06:26 -07:00
Paul Gauthier
a7490cdb24 updated readme 2023-05-09 14:01:15 -07:00
Paul Gauthier
581d405a72 updated readme 2023-05-09 13:52:26 -07:00
Paul Gauthier
220ec4c2c7 updated readme 2023-05-09 13:50:17 -07:00
Paul Gauthier
fb4f57941a updated readme 2023-05-09 13:46:59 -07:00
Paul Gauthier
507df10f1d updated readme 2023-05-09 13:43:54 -07:00
Paul Gauthier
1bd5086020 updated readme 2023-05-09 13:36:48 -07:00
Paul Gauthier
227c5e368a stronger prompt for past tense commit messages 2023-05-09 13:34:36 -07:00
Paul Gauthier
66b8c19c1c WIP: Add ask parameter to show_diffs in coder.py. 2023-05-09 13:22:23 -07:00
Paul Gauthier
60879d3168 WIP: Changed prefix text and added new line to all_content. 2023-05-09 13:21:37 -07:00
Paul Gauthier
ceeb1d8610 Send gpt the list of files in the repo too 2023-05-09 13:18:57 -07:00
Paul Gauthier
1ba8e59c53 Add files listing to files_content when self.repo is not None in get_files_messages method.
# Context:
USER: in get_files_messages(self): if self.repo is not none, then get a listing of the files in the repo and add it to all_content
ASSISTANT: To add a listing of the files in the repo to `all_content` when `self.repo` is not `None`, you can modify the `get_files_messages` method as follows:

```python
aider/coder.py
<<<<<<< ORIGINAL
    def get_files_messages(self):

        files_content = prompts.files_content_prefix
        files_content += self.get_files_content()

        all_content = files_content
=======
    def get_files_messages(self):

        files_content = prompts.files_content_prefix
        files_content += self.get_files_content()

        if self.repo is not None:
            tracked_files = set(self.repo.git.ls_files().splitlines())
            files_listing = "\n".join(tracked_files)
            files_content += f"\n\nFiles in the repo:\n{files_listing}\n"

        all_content = files_content
>>>>>>> UPDATED
```

This change adds a conditional block to check if `self.repo` is not `None` and then retrieves the list of tracked files in the repo. It then adds the files listing to `files_content` before assigning it to `all_content`.
2023-05-09 13:15:22 -07:00
Paul Gauthier
e2b5c6074f lint 2023-05-09 13:10:38 -07:00
Paul Gauthier
2391c2e49b lint 2023-05-09 13:09:05 -07:00
Paul Gauthier
e6a1a677a4 updated readme 2023-05-09 13:08:57 -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
0782e50f6d WIP: Refactor Coder class constructor to remove default value for history_file parameter. 2023-05-09 12:59:21 -07:00
Paul Gauthier
8df0971b4f WIP: Updated commit_system prompt to instruct user to speak in past tense. 2023-05-09 12:50:45 -07:00
Paul Gauthier
15d48ff34c updated readme with asciinema 2023-05-09 12:48:57 -07:00
Paul Gauthier
875d9f8c9b Added yes defaults 2023-05-09 12:48:50 -07:00
Paul Gauthier
8654a4201f WIP: Change output file name from "tmp.last-edit.md" to ".aider.last.md". 2023-05-09 12:42:27 -07:00
Paul Gauthier
97cf30b0f0 WIP: Fix GitPython issue with GitDB in coder.py. 2023-05-09 12:41:38 -07:00
Paul Gauthier
e72ea5f2f0 updated readme 2023-05-09 12:12:16 -07:00
Paul Gauthier
68b9581188 updated readme 2023-05-09 12:02:49 -07:00
Paul Gauthier
f2dcfe3723 updated readme 2023-05-09 11:56:23 -07:00
Paul Gauthier
4aa46c2714 updated readme 2023-05-09 11:52:32 -07:00
Paul Gauthier
bcc8b29cf7 Add "Features" section to README.md file.
# Context:
USER: add a features section
ASSISTANT: To add a features section, I will update the README.md file. Here's the change:

```python
README.md
<<<<<<< ORIGINAL
Aider is a command-line tool that allows you to chat with GPT about your code.
It can make changes, improvements, and bug fixes to your code with the assistance of GPT.
=======
Aider is a command-line tool that allows you to chat with GPT about your code.
It can make changes, improvements, and bug fixes to your code with the assistance of GPT.

## Features

* Chat with GPT about your code
* Make changes, improvements, and bug fixes to your code
* Automatically commit changes to a Git repository
* Colorized output for better readability
* Supports multiple source code files
>>>>>>> UPDATED
```

This change adds a "Features" section to the README.md file, listing some of the main features of the Aider tool.
2023-05-09 11:42:43 -07:00
Paul Gauthier
402d4e4720 readme edits 2023-05-09 11:41:58 -07:00
Paul Gauthier
eb1372236d Update README.md with installation and usage instructions for Aider tool.
# Context:
USER: Use ORIGINAL/UPDATE format to provide a README.md for this tool
ASSISTANT: Here's a basic README.md for the Aider tool using the ORIGINAL/UPDATED format:

```
README.md
<<<<<<< ORIGINAL

=======
# Aider

Aider is a command-line tool that allows you to chat with GPT about your code. It helps you to make changes, improvements, and bug fixes to your code with the assistance of GPT.

## Installation

1. Clone the repository.
2. Install the required packages using `pip install -r requirements.txt`.
3. Set up your OpenAI API key as an environment variable `OPENAI_API_KEY`.

## Usage

Run the Aider tool by executing the following command:

```
python -m aider.main <file1> <file2> ...
```

Replace `<file1>`, `<file2>`, etc., with the paths to the source code files you want to work on.

You can also use additional command-line options to customize the behavior of the tool. For more information, run:

```
python -m aider.main --help
```
>>>>>>> UPDATED
```

This will create a README.md file with a brief description, installation, and usage instructions for the Aider tool.
2023-05-09 11:40:27 -07:00
Paul Gauthier
c1e4f0d7e7 Initial commit: Added new files to the git repo: README.md 2023-05-09 11:38:44 -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
0cfbabb03b Handle InvalidGitRepositoryError by replacing list comprehension with for loop and try-except.
# Context:
USER: unroll the list comprehension so we can try/catch the exception below which is thrown for files not in any git repo

  File "/Users/gauthier/Projects/aider/aider/coder.py", line 68, in <genexpr>
    git.Repo(fname, search_parent_directories=True).git_dir
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/gauthier/tmp/try-aider/.venv/lib/python3.11/site-packages/git/repo/base.py", line 265, in __init__
    raise InvalidGitRepositoryError(epath)
git.exc.InvalidGitRepositoryError: /Users/gauthier/tmp/try-aider/tmp.py

ASSISTANT: To unroll the list comprehension and handle the exception, we can replace it with a for loop and use try-except to catch the `InvalidGitRepositoryError`.

```python
aider/coder.py
<<<<<<< ORIGINAL
        repo_paths = list(
            git.Repo(fname, search_parent_directories=True).git_dir
            for fname in self.fnames
        )
=======
        repo_paths = []
        for fname in self.fnames:
            try:
                repo_path = git.Repo(fname, search_parent_directories=True).git_dir
                repo_paths.append(repo_path)
            except git.exc.InvalidGitRepositoryError:
                pass
>>>>>>> UPDATED
```

This change will catch the `InvalidGitRepositoryError` and continue processing the remaining files.
2023-05-09 11:31:52 -07:00
Paul Gauthier
132e0a687f WIP: Refactor imports and remove unused code in coder.py. 2023-05-09 11:30:34 -07:00
Paul Gauthier
3ff28a111b initial 2023-05-09 11:00:32 -07:00
Paul Gauthier
2333e62b6a Add setup.py file that reads requirements.txt for dependencies and sets up CLI script.
# Context:
USER: make a setup.py for this project. it includes a cli script in main(). have setup.py read requirements.txt to get the install_requires
ASSISTANT: To create a `setup.py` file for this project, we'll use the `setuptools` package. We'll also read the `requirements.txt` file to get the `install_requires` dependencies. Here's the change:

```python
setup.py
<<<<<<< ORIGINAL

=======
from setuptools import setup, find_packages

with open("requirements.txt") as f:
    requirements = f.read().splitlines()

setup(
    name="aider",
    version="0.1.0",
    packages=find_packages(),
    install_requires=requirements,
    entry_points={
        "console_scripts": [
            "aider = aider.main:main",
        ],
    },
)
>>>>>>> UPDATED
```

This will create a `setup.py` file that reads the `requirements.txt` file for dependencies and sets up the CLI script for the `main()` function in `aider.main`.
2023-05-09 10:57:56 -07:00
Paul Gauthier
e32fb7c033 Initial commit: Added new files to the git repo: setup.py 2023-05-09 10:56:14 -07:00
Paul Gauthier
ff887b5c3e initial 2023-05-09 10:55:05 -07:00
Paul Gauthier
984e2f78ce moved into subdir 2023-05-09 10:52:18 -07:00
Paul Gauthier
a6b9023079 WIP: Change default history file name to ".aider.history 2023-05-09 10:51:43 -07:00
Paul Gauthier
786fb61bad changed name to aider, improved help 2023-05-09 10:24:28 -07:00
Paul Gauthier
1475e0d0fd Replace hardcoded "$CODER_" strings with f-strings that use the env_prefix variable.
# Context:
USER: You missed a bunch of explicit $CODER_xxx
ASSISTANT: I apologize for that. I will replace the remaining hardcoded "$CODER_" strings with f-strings that use the `env_prefix` variable.

```python
main.py
<<<<<<< ORIGINAL
        help="Disable pretty output of GPT responses ($CODER_PRETTY)",
=======
        help=f"Disable pretty output of GPT responses (${{{env_prefix}}}PRETTY)",
>>>>>>> UPDATED

main.py
<<<<<<< ORIGINAL
        help="Commit dirty files without confirmation (default: False, $CODER_COMMIT_DIRTY)",
=======
        help=f"Commit dirty files without confirmation (default: False, ${{{env_prefix}}}COMMIT_DIRTY)",
>>>>>>> UPDATED
```

Please let me know if there are any other instances that need to be updated.
2023-05-09 10:19:18 -07:00
Paul Gauthier
66058fd123 Replace hardcoded strings with f-strings that use env_prefix.
# Context:
USER: change all the hardcoded $CODER_... strings to be f-strings that use env_prefix
ASSISTANT: I will replace the hardcoded "$CODER_" strings with f-strings that use the `env_prefix` variable.

```python
main.py
<<<<<<< ORIGINAL
        default=os.environ.get("CODER_HISTORY_FILE", ".coder.history"),
        help="Specify the history file (default: .coder.history, $CODER_HISTORY_FILE)",
=======
        default=os.environ.get(f"{env_prefix}HISTORY_FILE", ".coder.history"),
        help="Specify the history file (default: .coder.history, ${env_prefix}HISTORY_FILE)",
>>>>>>> UPDATED

main.py
<<<<<<< ORIGINAL
        default=bool(int(os.environ.get(env_prefix + "PRETTY", 1))),
=======
        default=bool(int(os.environ.get(f"{env_prefix}PRETTY", 1))),
>>>>>>> UPDATED

main.py
<<<<<<< ORIGINAL
        default=bool(int(os.environ.get(env_prefix + "COMMIT_DIRTY", 0))),
=======
        default=bool(int(os.environ.get(f"{env_prefix}COMMIT_DIRTY", 0))),
>>>>>>> UPDATED
```
2023-05-09 10:18:11 -07:00
Paul Gauthier
c6197fd121 WIP: Refactor Coder class to use set instead of dict for fnames. 2023-05-09 10:15:33 -07:00
Paul Gauthier
82cf653d73 refactored into getinput 2023-05-09 10:11:54 -07:00
Paul Gauthier
6419e6c390 Move get_input function into utils.py and update the call to get_input in coder.py to use the new utils.get_input function.
# Context:
USER: move get_input into utils. pass in history_file and fnames as params rather than referencing them with self.
ASSISTANT: To move the `get_input` function into `utils.py`, we will remove it from the `Coder` class in `coder.py` and add it to `utils.py`. We will also update the function to accept `history_file` and `fnames` as parameters.

```python
coder.py
<<<<<<< ORIGINAL
    def get_input(self):
        inp = ""
        multiline_input = False

        style = Style.from_dict({'': 'green'})

        while True:
            completer_instance = FileContentCompleter(self.fnames)
            if multiline_input:
                show = ". "
            else:
                show = "> "

            try:
                line = prompt(
                    show,
                    completer=completer_instance,
                    history=FileHistory(self.history_file),
                    style=style,
                )
            except EOFError:
                return
            if line.strip() == "{" and not multiline_input:
                multiline_input = True
                continue
            elif line.strip() == "}" and multiline_input:
                break
            elif multiline_input:
                inp += line + "\n"
            else:
                inp = line
                break

        print()
        return inp
=======
>>>>>>> UPDATED
```

```python
utils.py
<<<<<<< ORIGINAL
=======
def get_input(history_file, fnames):
    inp = ""
    multiline_input = False

    style = Style.from_dict({'': 'green'})

    while True:
        completer_instance = FileContentCompleter(fnames)
        if multiline_input:
            show = ". "
        else:
            show = "> "

        try:
            line = prompt(
                show,
                completer=completer_instance,
                history=FileHistory(history_file),
                style=style,
            )
        except EOFError:
            return
        if line.strip() == "{" and not multiline_input:
            multiline_input = True
            continue
        elif line.strip() == "}" and multiline_input:
            break
        elif multiline_input:
            inp += line + "\n"
        else:
            inp = line
            break

    print()
    return inp
>>>>>>> UPDATED
```

Now, update the call to `get_input` in `coder.py` to use the new `utils.get_input` function:

```python
coder.py
<<<<<<< ORIGINAL
        inp = self.get_input()
=======
        inp = utils.get_input(self.history_file, self.fnames)
>>>>>>> UPDATED
```
2023-05-09 10:09:42 -07:00
Paul Gauthier
64c3af37df WIP: Add pretty print to run_loop method. 2023-05-09 09:57:41 -07:00
Paul Gauthier
85fb17710f WIP: Add prompt_toolkit style and use it in prompt. 2023-05-09 09:54:50 -07:00