Commit graph

7087 commits

Author SHA1 Message Date
Paul Gauthier
c40d763bce aider: Added /exit command to aider/commands.py.
# Context:
USER: add an /exit command which calls sys.exit
ASSISTANT: To add an `/exit` command, we need to modify the `commands.py` file to add a new command method and update the `is_command` and `run` methods to recognize and execute the new command. We also need to import `sys` to use `sys.exit()`.

Here are the changes:

```python
aider/commands.py
<<<<<<< ORIGINAL
from . import io
=======
import sys
from . import io
>>>>>>> UPDATED
```

```python
aider/commands
^C KeyboardInterrupt
USER: I added the content of these additional files: aider/commands.py
ASSISTANT: I apologize for the confusion. Here are the changes to add the `/exit` command to the `aider/commands.py` file:

```python
aider/commands.py
<<<<<<< ORIGINAL
import os
import git
import subprocess
import shlex
=======
import sys
import os
import git
import subprocess
import shlex
>>>>>>> UPDATED
```

```python
aider/commands.py
<<<<<<< ORIGINAL
        commands = ["/help"]
=======
        commands = ["/help", "/exit"]
>>>>>>> UPDATED
```

```python
aider/commands.py
<<<<<<< ORIGINAL
        else:
            self.io.tool_error(f"Error: {first_word} is not a valid command.")
=======
        elif first_word == "/exit":
            self.cmd_exit()
        else:
            self.io.tool_error(f"Error: {first_word} is not a valid command.")
>>>>>>> UPDATED
```

```python
aider/commands.py
<<<<<<< ORIGINAL
    def cmd_ls(self, args):
        "List all known files and those included in the chat session"
=======
    def cmd_exit(self):
        "Exit the application"
        sys.exit()

    def cmd_ls(self, args):
        "List all known files and those included in the chat session"
>>>>>>> UPDATED
```

These changes will add the `/exit` command to the list of commands, recognize it when entered, and call the `cmd_exit` method to exit the application using `sys.exit()`.
2023-05-26 12:16:59 -07:00
Paul Gauthier
599a3b2730 wip 2023-05-25 10:45:57 -07:00
Paul Gauthier
959f577aba wip 2023-05-25 10:01:01 -07:00
Paul Gauthier
46dc24afce Merge branch 'main' into call-graph 2023-05-25 08:54:03 -07:00
Paul Gauthier
4f1ec79220 Improved RateLimitError message 2023-05-25 08:53:55 -07:00
Paul Gauthier
f70aea7cd1 noop 2023-05-25 08:49:40 -07:00
Paul Gauthier
da8a85fea6 wip 2023-05-25 06:39:40 -07:00
Paul Gauthier
407e47b6ed wip 2023-05-24 22:26:48 -07:00
Paul Gauthier
a1b5206345 wip 2023-05-24 22:04:43 -07:00
Paul Gauthier
43b79b0c2d refac 2023-05-24 21:39:36 -07:00
Paul Gauthier
3ecf008478 refac 2023-05-24 21:31:08 -07:00
Paul Gauthier
60031ecd29 fixed bug found by testing 2023-05-24 19:09:05 -07:00
Paul Gauthier
dcf1bbf20e renamed ctags->repomap 2023-05-24 18:55:47 -07:00
Paul Gauthier
e7489a3d44 refac 2023-05-24 18:54:50 -07:00
Paul Gauthier
4366de4080 avoid useless / prefix 2023-05-24 14:38:30 -07:00
Paul Gauthier
020c276ecf with-colon 2023-05-24 14:32:25 -07:00
Paul Gauthier
7b685ce089 use the tree to render the plain file list 2023-05-24 14:31:32 -07:00
Paul Gauthier
80a2f10e83 refactor 2023-05-24 14:17:13 -07:00
Paul Gauthier
a1c0a84f74 cleanup 2023-05-24 14:08:39 -07:00
Paul Gauthier
873df7b77c rename 2023-05-24 14:07:02 -07:00
Paul Gauthier
a725e18ad1 refac 2023-05-24 14:03:06 -07:00
Paul Gauthier
27199becd4 refac 2023-05-24 14:01:38 -07:00
Paul Gauthier
69b180cffc expert 2023-05-24 13:43:16 -07:00
Paul Gauthier
fed1265bb4 prompt golf 2023-05-23 15:42:51 -07:00
Paul Gauthier
7c1112ab20 choose whether/which token map to use based on tokenized size 2023-05-23 15:40:32 -07:00
Paul Gauthier
2238900b34 prompt golf 2023-05-23 15:20:13 -07:00
Paul Gauthier
51471ca951 wip 2023-05-23 12:19:46 -07:00
Paul Gauthier
8773a3c47d only map <100 files 2023-05-23 12:06:18 -07:00
Paul Gauthier
781016b93c Added census chat 2023-05-23 11:41:09 -07:00
Paul Gauthier
c239b7f49c Added ctags --extras=-F to avoid mapping file-private symbols 2023-05-23 07:05:33 -07:00
Paul Gauthier
8a528b655d use tab in ctag maps 2023-05-23 06:54:14 -07:00
Paul Gauthier
560e427684 aider: Updated default values of pretty and yes to True and False respectively in the InputOutput class constructor.
# Context:
USER: give inputoutput defaults of pretty=true and yes=false
ASSISTANT: To update the default values of `pretty` and `yes` in the `InputOutput` class, I will modify the `__init__` method in the `io.py` file.

```python
aider/io.py
<<<<<<< ORIGINAL
    def __init__(self, pretty, yes, input_history_file=None, chat_history_file=None, input=None, output=None):
=======
    def __init__(self, pretty=True, yes=False, input_history_file=None, chat_history_file=None, input=None, output=None):
>>>>>>> UPDATED
```
2023-05-23 06:05:48 -07:00
Paul Gauthier
e09b1cf2d7 Changed /commit command to commit outstanding changes to the repo instead of chat session files. 2023-05-22 09:54:37 -07:00
Paul Gauthier
4f2e1d14ef sort the file list in the prompt 2023-05-20 07:28:23 -07:00
Paul Gauthier
ffe3da4df1 do not sent file lists longer than 100 files 2023-05-19 16:17:40 -07:00
paul-gauthier
7d08c346bb
Merge pull request #4 from mobyvb/prompt-compression
aider/prompts.py: reduce token size of prompts
2023-05-19 16:10:26 -07:00
Paul Gauthier
c441906a22 aider: Made -v a short option for --verbose.
# Context:
USER: make -v short for --verbose
ASSISTANT: To make `-v` a short option for `--verbose`, you can modify the `aider/main.py` file. Here's the change:

```python
aider/main.py
<<<<<<< ORIGINAL
    parser.add_argument(
        "--verbose",
        action="store_true",
        help="Enable verbose output",
        default=False,
    )
=======
    parser.add_argument(
        "-v", "--verbose",
        action="store_true",
        help="Enable verbose output",
        default=False,
    )
>>>>>>> UPDATED
```
2023-05-19 10:57:59 -07:00
Paul Gauthier
7e6ea0660d Refactor show_messages function to accept an optional title parameter and remove unused code. 2023-05-19 10:57:24 -07:00
Paul Gauthier
10e38e1fe9 aider: Added --verbose option to enable verbose output.
# Context:
USER: Add --verbose with no env default. pass into Coder and set self.verbose
ASSISTANT: To add the `--verbose` option, we need to modify the `aider/main.py` file. Here's the step-by-step process:

1. Add the `--verbose` argument to the `argparse.ArgumentParser` in the `main` function.
2. Pass the `args.verbose` value to the `Coder` class when initializing it.
3. Update the `Coder` class in the `aider/coder.py` file to accept the `verbose` parameter and set `self.verbose`.

Here are the changes to the code:

```python
aider/main.py
<<<<<<< ORIGINAL
    parser.add_argument(
        "--yes",
        action="store_true",
        help="Always say yes to every confirmation",
        default=False,
    )
=======
    parser.add_argument(
        "--yes",
        action="store_true",
        help="Always say yes to every confirmation",
        default=False,
    )
    parser.add_argument(
        "--verbose",
        action="store_true",
        help="Enable verbose output",
        default=False,
    )
>>>>>>> UPDATED
```

```python
aider/main.py
<<<<<<< ORIGINAL
    coder = Coder(
        io,
        main_model=args.model,
        fnames=args.files,
        pretty=args.pretty,
        show_diffs=args.show_diffs,
        auto_commits=args.auto_commits,
        dry_run=args.dry_run,
        use_ctags=args.ctags,
    )
=======
    coder = Coder(
        io,
        main_model=args.model,
        fnames=args.files,
        pretty=args.pretty,
        show_diffs=args.show_diffs,
        auto_commits=args.auto_commits,
        dry_run=args.dry_run,
        use_ctags=args.ctags,
        verbose=args.verbose,
    )
>>>>>>> UPDATED
```

```python
aider/coder.py
<<<<<<< ORIGINAL
    def __init__(
        self,
        io,
        main_model="gpt-4",
        fnames=None,
        pretty=True,
        show_diffs=False,
        auto_commits=True,
        dry_run=False,
        use_ctags=False,
    ):
=======
    def __init__(
        self,
        io,
        main_model="gpt-4",
        fnames=None,
        pretty=True,
        show_diffs=False,
        auto_commits=True,
        dry_run=False,
        use_ctags=False,
        verbose=False,
    ):
        self.verbose = verbose
>>>>>>> UPDATED
```
2023-05-19 10:55:48 -07:00
Paul Gauthier
b82bb65b86 help msg for --ctags 2023-05-19 10:49:11 -07:00
Paul Gauthier
32e40a3e1c aider: Prevent gpt-3.5-turbo from generating commit messages for diffs larger than 4k tokens and catch InvalidRequestError.
# Context:
USER: `Coder.get_commit_message()` uses gpt-3.5-turbo to summarize the diffs into a sensible commit message. If the diff is large, it exceeds the 4K context window.

A simple fix would be:

1. Check if the diff is close to or larger than 4 kbytes (4k tokens * 4 bytes/token) and don't even bother sending the messages to gpt. Just return.
2. Catch the `openai.error.InvalidRequestError` and just return.

Maybe print a nice tool_error() message for each of these.

ASSISTANT: To implement the suggested changes, we will modify the `get_commit_message()` method in the `aider/coder.py` file. Here are the step-by-step changes:

1. Check if the length of `diffs` is close to or larger than 4 kbytes (4k tokens * 4 bytes/token). If it is, print an error message and return.
2. Catch the `openai.error.InvalidRequestError` exception when calling `self.send()` and print an error message, then return.

Here are the code changes:

```python
aider/coder.py
<<<<<<< ORIGINAL
    def get_commit_message(self, diffs, context):
        diffs = "# Diffs:\n" + diffs

        messages = [
            dict(role="system", content=prompts.commit_system),
            dict(role="user", content=context + diffs),
        ]

        commit_message, interrupted = self.send(
            messages,
            model="gpt-3.5-turbo",
            silent=True,
        )
=======
    def get_commit_message(self, diffs, context):
        if len(diffs) >= 4 * 1024 * 4:
            self.io.tool_error("Diff is too large for gpt-3.5-turbo to generate a commit message.")
            return

        diffs = "# Diffs:\n" + diffs

        messages = [
            dict(role="system", content=prompts.commit_system),
            dict(role="user", content=context + diffs),
        ]

        try:
            commit_message, interrupted = self.send(
                messages,
                model="gpt-3.5-turbo",
                silent=True,
            )
        except openai.error.InvalidRequestError:
            self.io.tool_error("Failed to generate commit message using gpt-3.5-turbo due to an invalid request.")
            return
>>>>>>> UPDATED
```
2023-05-19 10:41:43 -07:00
Paul Gauthier
af85c81c13 fixed missing case of just the filename 2023-05-19 10:32:55 -07:00
Paul Gauthier
046e6ed9d4 aider: Added in-memory cache to get_tags function using a tuple (filename, root_dname) as the cache key.
# Context:
USER: add an in memory cache to get_tags that only updates if the st_mtime of the filename changes
ASSISTANT: To implement an in-memory cache for the `get_tags` function, we will need to modify the `aider/ctags.py` file. We will use a dictionary to store the cache and check the file's modification time to decide whether to update the cache or not.

Here are the steps to implement the cache:

1. Create a global variable `TAGS_CACHE` to store the cache.
2. In the `get_tags` function, check if the filename is in the cache and if the modification time has not changed.
3. If the conditions in step 2 are met, return the cached value.
4. If the conditions in step 2 are not met, update the cache with the new tags and return them.

Here are the changes to the `aider/ctags.py` file:

```python
aider/ctags.py
<<<<<<< ORIGINAL
import os
import json
import sys
import subprocess

# from aider.dump import dump
=======
import os
import json
import sys
import subprocess

# Global cache for tags
TAGS_CACHE = {}

# from aider.dump import dump
>>>>>>> UPDATED
```

```python
aider/ctags.py
<<<<<<< ORIGINAL
def get_tags(filename, root_dname):
    cmd = ["ctags", "--fields=+S", "--output-format=json", filename]
    output = subprocess.check_output(cmd).decode("utf-8")
    output = output.splitlines()
=======
def get_tags(filename, root_dname):
    # Check if the file is in the cache and if the modification time has not changed
    file_mtime = os.path.getmtime(filename)
    if filename in TAGS_CACHE and TAGS_CACHE[filename]["mtime"] == file_mtime:
        return TAGS_CACHE[filename]["tags"]

    cmd = ["ctags", "--fields=+S", "--output-format=json", filename]
    output = subprocess.check_output(cmd).decode("utf-8")
    output = output.splitlines()
>>>>>>> UPDATED
```

```python
aider/ctags.py
<<<<<<< ORIGINAL
    for line in output:
        tag = json.loads(line)
        path = tag.get("path")
        scope = tag.get("scope")
        kind = tag.get("kind")
        name = tag.get("name")
        signature = tag.get("signature")

        last = name
        if signature:
            last += " " + signature

        res = split_path(path, root_dname)
        if scope:
            res.append(scope)
        res += [kind, last]

        yield res
=======
    tags = []
    for line in output:
        tag = json.loads(line)
        path = tag.get("path")
        scope = tag.get("scope")
        kind = tag.get("kind")
        name = tag.get("name")
        signature = tag.get("signature")

        last = name
        if signature:
            last += " " + signature

        res = split_path(path, root_dname)
        if scope:
            res.append(scope)
        res += [kind, last]
        tags.append(res)

    #
^C KeyboardInterrupt
USER: sorry, please do that again. but set key=(filename, root_dname) and use that as the cache key
ASSISTANT: No problem. I will modify the cache implementation to use a tuple (filename, root_dname) as the cache key. Here are the updated changes to the `aider/ctags.py` file:

```python
aider/ctags.py
<<<<<<< ORIGINAL
import os
import json
import sys
import subprocess

# from aider.dump import dump
=======
import os
import json
import sys
import subprocess

# Global cache for tags
TAGS_CACHE = {}

# from aider.dump import dump
>>>>>>> UPDATED
```

```python
aider/ctags.py
<<<<<<< ORIGINAL
def get_tags(filename, root_dname):
    cmd = ["ctags", "--fields=+S", "--output-format=json", filename]
    output = subprocess.check_output(cmd).decode("utf-8")
    output = output.splitlines()
=======
def get_tags(filename, root_dname):
    # Check if the file is in the cache and if the modification time has not changed
    file_mtime = os.path.getmtime(filename)
    cache_key = (filename, root_dname)
    if cache_key in TAGS_CACHE and TAGS_CACHE[cache_key]["mtime"] == file_mtime:
        return TAGS_CACHE[cache_key]["tags"]

    cmd = ["ctags", "--fields=+S", "--output-format=json", filename]
    output = subprocess.check_output(cmd).decode("utf-8")
    output = output.splitlines()
>>>>>>> UPDATED
```

```python
aider/ctags.py
<<<<<<< ORIGINAL
    for line in output:
        tag = json.loads(line)
        path = tag.get("path")
        scope = tag.get("scope")
        kind = tag.get("kind")
        name = tag.get("name")
        signature = tag.get("signature")

        last = name
        if signature:
            last += " " + signature

        res = split_path(path, root_dname)
        if scope:
            res.append(scope)
        res += [kind, last]

        yield res
=======
    tags = []
    for line in output:
        tag = json.loads(line)
        path = tag.get("path")
        scope = tag.get("scope")
        kind = tag.get("kind")
        name = tag.get("name")
        signature = tag.get("signature")

        last = name
        if signature:
            last += " " + signature

        res = split_path(path, root_dname)
        if scope:
            res.append(scope)
        res += [kind, last]
        tags.append(res)

    # Update the cache
    TAGS_CACHE[cache_key] = {"mtime": file_mtime, "tags": tags}

    return tags
>>>>>>> UPDATED
```
2023-05-19 10:32:02 -07:00
Paul Gauthier
9a243d7adc sssh 2023-05-19 10:19:23 -07:00
Paul Gauthier
1391e9de9b aider: Updated cmd_run method in aider/commands.py to use the io version of Confirm.ask().
# Context:
USER: in commands, switch the Confirm.ask() calls to use the io versions
ASSISTANT: I will update the `cmd_add` method in the `aider/commands.py` file to use the `io` versions of `Confirm.ask()`.

^C KeyboardInterrupt
USER: switch the Confirm.ask() calls to use the io versions
ASSISTANT: I will update the `cmd_add` method in the `aider/commands.py` file to use the `io` versions of `Confirm.ask()`.

```python
aider/commands.py
<<<<<<< ORIGINAL
                if self.coder.repo is not None:
                    create_file = self.io.confirm_ask(
                        (
                            f"No files matched
^C KeyboardInterrupt
USER: no, they already do. cmd_run
ASSISTANT: I apologize for the confusion. I will update the `cmd_run` method in the `aider/commands.py` file to use the `io` version of `Confirm.ask()`.

```python
aider/commands.py
<<<<<<< ORIGINAL
        ok = Confirm.ask("Add the output to the chat?", default="y")
=======
        ok = self.io.confirm_ask("Add the output to the chat?", default="y")
>>>>>>> UPDATED
```
2023-05-19 10:18:49 -07:00
Paul Gauthier
f6aaa19299 implement --ctags 2023-05-19 10:07:52 -07:00
Paul Gauthier
68c58ea394 aider: Added --ctags argument and environment variable to pass to Coder class.
# Context:
USER: add a --ctags arg and env var. pass it to Coder to set self.use_ctags
ASSISTANT: To add a `--ctags` argument and environment variable, and pass it to the `Coder` class, follow these steps:

1. Modify `aider/main.py` to add the `--ctags` argument and read the environment variable.
2. Modify the `Coder` class in `aider/coder.py` to accept the `use_ctags` parameter and set it as an instance variable.

Here are the necessary code changes:

```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(
        "--ctags",
        action="store_true",
        help=f"Use ctags for file listing (default: False, ${env_prefix}CTAGS)",
        default=bool(int(os.environ.get(f"{env_prefix}CTAGS", 0))),
    )
>>>>>>> UPDATED
```

```python
aider/main.py
<<<<<<< ORIGINAL
    coder = Coder(
        io,
        main_model=args.model,
        fnames=args.files,
        pretty=args.pretty,
        show_diffs=args.show_diffs,
        auto_commits=args.auto_commits,
        dry_run=args.dry_run,
    )
=======
    coder = Coder(
        io,
        main_model=args.model,
        fnames=args.files,
        pretty=args.pretty,
        show_diffs=args.show_diffs,
        auto_commits=args.auto_commits,
        dry_run=args.dry_run,
        use_ctags=args.ctags,
    )
>>>>>>> UPDATED
```

```python
aider/coder.py
<<<<<<< ORIGINAL
    def __init__(
        self,
        io,
        main_model="gpt-4",
        fnames=None,
        pretty=True,
        show_diffs=False,
        auto_commits=True,
        dry_run=False,
    ):
=======
    def __init__(
        self,
        io,
        main_model="gpt-4",
        fnames=None,
        pretty=True,
        show_diffs=False,
        auto_commits=True,
        dry_run=False,
        use_ctags=False,
    ):
        self.use_ctags = use_ctags
>>>>>>> UPDATED
```

These changes add the `--ctags` argument, read the environment variable, and pass the `use_ctags` parameter to the `Coder` class.
2023-05-19 10:02:21 -07:00
Paul Gauthier
8f7d7685d6 improved prompting around ctags 2023-05-19 09:54:27 -07:00
Paul Gauthier
680fc45fb3 improved prompting, fix ctags bug 2023-05-19 09:47:06 -07:00
Paul Gauthier
4593e7812c aider: Replaced Confirm.ask() calls with self.io.confirm_ask() in commands.py.
# Context:
USER: in commands, switch the ask() calls to use the io versions
ASSISTANT: I need to see the content of the `commands.py` file to make the necessary changes. Please provide the content of the file.
USER: Please note that I shared content of these additional files: aider/commands.py
ASSISTANT: I apologize for the oversight. I will now make the necessary changes to the `commands.py` file.

```python
aider/commands.py
<<<<<<< ORIGINAL
                    create_file = Confirm.ask(
                        (
                            f"No files matched '{word}'. Do you want to create the file and add it"
                            " to git?"
                        ),
                    )
                else:
                    create_file = Confirm.ask(
                        f"No files matched '{word}'. Do you want to create the file?"
                    )
=======
                    create_file = self.io.confirm_ask(
                        (
                            f"No files matched '{word}'. Do you want to create the file and add it"
                            " to git?"
                        ),
                    )
                else:
                    create_file = self.io.confirm_ask(
                        f"No files matched '{word}'. Do you want to create the file?"
                    )
>>>>>>> UPDATED
```

I have replaced the `Confirm.ask()` calls with `self.io.confirm_ask()` as requested.
2023-05-19 09:20:54 -07:00