Commit graph

466 commits

Author SHA1 Message Date
Paul Gauthier
0b8690654e aider: Added dry_run parameter to do_replace function and passed it from Coder class.
# Context:
USER: pass dry run into do_replace and only write to the file if false
ASSISTANT: To implement this change, we need to modify the `do_replace` function in the `aider/utils.py` file. We will add a new parameter `dry_run` to the function and only write to the file if `dry_run` is `False`.

Here's the change:

```python
aider/utils.py
<<<<<<< ORIGINAL
def do_replace(fname, before_text, after_text):
=======
def do_replace(fname, before_text, after_text, dry_run=False):
>>>>>>> UPDATED
    before_text = strip_quoted_wrapping(before_text, fname)
    after_text = strip_quoted_wrapping(after_text, fname)
    fname = Path(fname)

    # does it want to make a new file?
    if not fname.exists() and not before_text.strip():
        fname.touch()

    content = fname.read_text()

    if not before_text.strip():
        if content:
            new_content = content + after_text
        else:
            # first populating an empty file
            new_content = after_text
    else:
        new_content = replace_most_similar_chunk(content, before_text, after_text)
        if not new_content:
            return

    if not dry_run:
        fname.write_text(new_content)
    return True
```

Now, you need to pass the `dry_run` parameter from the `Coder` class in the `aider/coder.py` file to the `do_replace` function. Here's the change:

```python
aider/coder.py
<<<<<<< ORIGINAL
if utils.do_replace(full_path, original, updated):
=======
if utils.do_replace(full_path, original, updated, self.dry_run):
>>>>>>> UPDATED
    self.io.tool(f"Applied edit to {path}")
else:
    self.io.tool_error(f"Failed to apply edit to {path}")
```

These changes will ensure that the file is only written to when `dry_run` is `False`.
2023-05-14 10:14:20 -07:00
Paul Gauthier
a8acca9366 aider: Added a --dry-run argument to the main.py file and passed it to the Coder class, setting the self.dry_run attribute in the Coder class.
# Context:
USER: add a --dry-run arg, no env, default false. pass it into Coder and set self.dry_run
ASSISTANT: I will add a `--dry-run` argument to the `main.py` file and pass it to the `Coder` class. Then, I will set the `self.dry_run` attribute in the `Coder` class.

Here are the 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(
        "--dry-run",
        action="store_true",
        help="Perform a dry run without applying changes (default: False)",
        default=False,
    )
    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
```

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

    coder = Coder(
        args.model,
        fnames,
        pretty,
        args.show_diffs,
        args.auto_commits,
        io,
    )
=======
    io = InputOutput(
        args.pretty,
        args.yes,
        args.input_history_file,
        args.chat_history_file,
        input=input,
        output=output,
    )

    coder = Coder(
        args.model,
        fnames,
        pretty,
        args.show_diffs,
        args.auto_commits,
        io,
        args.dry_run,
    )
>>>>>>> UPDATED
```

```python
aider/coder.py
<<<<<<< ORIGINAL
    def __init__(self, main_model, fnames, pretty, show_diffs, auto_commits, io):
        self.abs_fnames = set()

        self.io = io

        self.auto_commits = auto_commits
=======
    def __init__(self, main_model, fnames, pretty, show_diffs, auto_commits, io, dry_run):
        self.abs_fnames = set()

        self.io = io

        self.auto_commits = auto_commits
        self.dry_run = dry_run
>>>>>>> UPDATED
```

Please review the changes and let me know if you need any further modifications.
2023-05-14 10:06:16 -07:00
Paul Gauthier
708653290f Creating empty file 2023-05-14 09:09:37 -07:00
Paul Gauthier
3f26a3ec05 main prompt in normal mixed case 2023-05-14 08:19:32 -07:00
Paul Gauthier
70ea500783 improved --no-auto-commits support 2023-05-14 07:37:04 -07:00
Paul Gauthier
78b1296e0e Added auto_commit method to Coder class. 2023-05-14 07:23:20 -07:00
Paul Gauthier
9c2f8e22d8 wip: Refactor file mentions check in Coder class to strip away all kinds of quotes and drop sentence punctuation. 2023-05-13 15:21:26 -07:00
Paul Gauthier
4d800b1e31 adopt EDIT BLOCK as the nomenclature in the prompt 2023-05-13 15:13:40 -07:00
Paul Gauthier
ed6efbcfb3 wip: Removed suggested commit message prompt. 2023-05-13 13:19:36 -07:00
Paul Gauthier
b9d07e5eec wip: Refactor coder.py to improve commit message display. 2023-05-13 13:18:58 -07:00
Paul Gauthier
06818156cf wip: Changed append_chat_history to use blockquote instead of italics. 2023-05-13 13:17:40 -07:00
Paul Gauthier
04565b9181 wip: Changed the help message for using gpt-3.5-turbo model and updated the example docs. 2023-05-13 10:31:21 -07:00
Paul Gauthier
0110f86c7f wip: Added KeyboardInterrupt error message to coder.py. 2023-05-13 10:10:00 -07:00
Paul Gauthier
e3f523d427 aider: Fixed cmd_undo function to catch GitCommandError exception when trying to get the remote head of the current branch using origin/<branch_name> instead of origin/HEAD.
# Context:
USER: README.md> /undo

Traceback (most recent call last):
  File "/Users/gauthier/Projects/aider/.venv/bin/aider", line 8, in <module>
    sys.exit(main())
             ^^^^^^
  File "/Users/gauthier/Projects/aider/aider/main.py", line 113, in main
    coder.run()
  File "/Users/gauthier/Projects/aider/aider/coder.py", line 178, in run
    new_user_message = self.run_loop()
                       ^^^^^^^^^^^^^^^
  File "/Users/gauthier/Projects/aider/aider/coder.py", line 223, in run_loop
    return self.commands.run(inp)
           ^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/gauthier/Projects/aider/aider/commands.py", line 62, in run
    return self.do_run(matching_commands[0][1:], rest_inp)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/gauthier/Projects/aider/aider/commands.py", line 44, in do_run
    return cmd_method(args)
           ^^^^^^^^^^^^^^^^
  File "/Users/gauthier/Projects/aider/aider/commands.py", line 96, in cmd_undo
    remote_head = self.coder.repo.git.rev_parse("origin/HEAD")
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/gauthier/Projects/aider/.venv/lib/python3.11/site-packages/git/cmd.py", line 741, in <lambda>
    return lambda *args, **kwargs: self._call_process(name, *args, **kwargs)
                                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/gauthier/Projects/aider/.venv/lib/python3.11/site-packages/git/cmd.py", line 1315, in _call_process
    return self.execute(call, **exec_kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/gauthier/Projects/aider/.venv/lib/python3.11/site-packages/git/cmd.py", line 1109, in execute
    raise GitCommandError(redacted_command, status, stderr_value, stdout_value)
git.exc.GitCommandError: Cmd('git') failed due to: exit code(128)
  cmdline: git rev-parse origin/HEAD
  stdout: 'origin/HEAD'
  stderr: 'fatal: ambiguous argument 'origin/HEAD': unknown revision or path not in the working tree.

ASSISTANT: It seems like there is an issue with the `cmd_undo` function in the `aider/commands.py` file. The error is caused by the `self.coder.repo.git.rev_parse("origin/HEAD")` line. To fix this issue, we can check if the remote "origin" exists before trying to get the remote head.

Here's the change I suggest:

```python
aider/commands.py
<<<<<<< ORIGINAL
        if has_origin:
            remote_head = self.coder.repo.git.rev_parse("origin/HEAD")
=======
        if has_origin:
            try:
                remote_head = self.coder.repo.git.rev_parse("origin/HEAD")
            except git.exc.GitCommandError:
                self.io.tool_error("Error: Unable to get the remote 'origin/HEAD'.")
                return
>>>>>>> UPDATED
```

This change will catch the `GitCommandError` exception and display an error message instead of raising
^C KeyboardInterrupt
USER: the error occurred on a repo with an origin. Is `origin/HEAD` a valid way to check the head of the current branch's remote?
ASSISTANT: I apologize for the confusion. You are correct that `origin/HEAD` is not the proper way to check the head of the current branch's remote. Instead, we should use `origin/<branch_name>` to get the remote head of the current branch. Here's the updated change:

```python
aider/commands.py
<<<<<<< ORIGINAL
        if has_origin:
            remote_head = self.coder.repo.git.rev_parse("origin/HEAD")
=======
        if has_origin:
            current_branch = self.coder.repo.active_branch.name
            try:
                remote_head = self.coder.repo.git.rev_parse(f"origin/{current_branch}")
            except git.exc.GitCommandError:
                self.io.tool_error(f"Error: Unable to get the remote 'origin/{current_branch}'.")
                return
>>>>>>> UPDATED
```

This change will get the name of the current active branch and use it to check the remote head of the current branch.
2023-05-13 09:55:00 -07:00
Paul Gauthier
83c47eef62 aider: Added conditional check to see if the repo has an origin before comparing local and remote commit hashes in cmd_undo.
# Context:
USER: not all repos have an origin. only do that check if the repo does
ASSISTANT: To check if the repo has an origin, we can use `self.coder.repo.remotes` to see if there is a remote named "origin". We will add a conditional check before comparing the local and remote commit hashes.

```python
aider/commands.py
<<<<<<< ORIGINAL
    def cmd_undo(self, args):
        "Undo the last git commit if it was done by aider"
        if not self.coder.repo:
            self.io.tool_error("No git repository found.")
            return

        if self.coder.repo.is_dirty():
            self.io.tool_error("The repository has uncommitted changes. Please commit or stash them before undoing.")
            return

        local_head = self.coder.repo.git.rev_parse("HEAD")
        remote_head = self.coder.repo.git.rev_parse("origin/HEAD")

        if local_head == remote_head:
            self.io.tool_error("The last commit has already been pushed to the origin. Undoing is not possible.")
            return

        last_commit = self.coder.repo.head.commit
=======
    def cmd_undo(self, args):
        "Undo the last git commit if it was done by aider"
        if not self.coder.repo:
            self.io.tool_error("No git repository found.")
            return

        if self.coder.repo.is_dirty():
            self.io.tool_error("The repository has uncommitted changes. Please commit or stash them before undoing.")
            return

        local_head = self.coder.repo.git.rev_parse("HEAD")
        has_origin = any(remote.name == "origin" for remote in self.coder.repo.remotes)

        if has_origin:
            remote_head = self.coder.repo.git.rev_parse("origin/HEAD")
            if local_head == remote_head:
                self.io.tool_error("The last commit has already been pushed to the origin. Undoing is not possible.")
                return

        last_commit = self.coder.repo.head.commit
>>>>>>> UPDATED
```
2023-05-13 09:51:57 -07:00
Paul Gauthier
84b3a1756d aider: Added check to prevent undoing a commit that has already been pushed to origin.
# Context:
USER: also check to make sure the commit hasn't already been pushed to origin
ASSISTANT: To check if the commit has already been pushed to the origin, we can compare the local and remote commit hashes. We will add a check using `self.coder.repo.git.rev_parse("HEAD")` and `self.coder.repo.git.rev_parse("origin/HEAD")` before performing the undo operation.

```python
aider/commands.py
<<<<<<< ORIGINAL
    def cmd_undo(self, args):
        "Undo the last git commit if it was done by aider"
        if not self.coder.repo:
            self.io.tool_error("No git repository found.")
            return

        if self.coder.repo.is_dirty():
            self.io.tool_error("The repository has uncommitted changes. Please commit or stash them before undoing.")
            return

        last_commit = self.coder.repo.head.commit
=======
    def cmd_undo(self, args):
        "Undo the last git commit if it was done by aider"
        if not self.coder.repo:
            self.io.tool_error("No git repository found.")
            return

        if self.coder.repo.is_dirty():
            self.io.tool_error("The repository has uncommitted changes. Please commit or stash them before undoing.")
            return

        local_head = self.coder.repo.git.rev_parse("HEAD")
        remote_head = self.coder.repo.git.rev_parse("origin/HEAD")

        if local_head == remote_head:
            self.io.tool_error("The last commit has already been pushed to the origin. Undoing is not possible.")
            return

        last_commit = self.coder.repo.head.commit
>>>>>>> UPDATED
```
2023-05-13 09:48:30 -07:00
Paul Gauthier
e74c90037c removed nested call to io.tool_error 2023-05-13 09:47:08 -07:00
Paul Gauthier
2b6ea21a0b aider: Added check to ensure the repo isn't dirty before undoing.
# Context:
USER: in /undo make sure the repo isn't dirty before undoing
ASSISTANT: To ensure the repo isn't dirty before undoing, we will add a check using `self.coder.repo.is_dirty()` before performing the undo operation.

```python
aider/commands.py
<<<<<<< ORIGINAL
    def cmd_undo(self, args):
        "Undo the last git commit if it was done by aider"
        if not self.coder.repo:
            self.io.tool_error("No git repository found.")
            return

        last_commit = self.coder.repo.head.commit
=======
    def cmd_undo(self, args):
        "Undo the last git commit if it was done by aider"
        if not self.coder.repo:
            self.io.tool_error("No git repository found.")
            return

        if self.coder.repo.is_dirty():
            self.io.tool_error("The repository has uncommitted changes. Please commit or stash them before undoing.")
            return

        last_commit = self.coder.repo.head.commit
>>>>>>> UPDATED
```
2023-05-13 09:46:21 -07:00
Paul Gauthier
d1a98c83f5 wip: Added prompt import to getinput.py. 2023-05-13 08:16:31 -07:00
Paul Gauthier
fbbb4fe1af pass input/output as None to use stdin/out 2023-05-13 08:16:02 -07:00
Paul Gauthier
ac92ccac5c aider: Replaced prompt() with PromptSession() to correctly pass input and output arguments.
# Context:
USER: prompt_toolkit.shortcuts.prompt(message: AnyFormattedText | None = None, *, history: History | None = None, editing_mode: EditingMode | None = None, refresh_interval: float | None = None, vi_mode: bool | None = None, lexer: Lexer | None = None, completer: Completer | None = None, complete_in_thread: bool | None = None, is_password: bool | None = None, key_bindings: KeyBindingsBase | None = None, bottom_toolbar: AnyFormattedText | None = None, style: BaseStyle | None = None, color_depth: ColorDepth | None = None, cursor: AnyCursorShapeConfig = None, include_default_pygments_style: FilterOrBool | None = None, style_transformation: StyleTransformation | None = None, swap_light_and_dark_colors: FilterOrBool | None = None, rprompt: AnyFormattedText | None = None, multiline: FilterOrBool | None = None, prompt_continuation: PromptContinuationText | None = None, wrap_lines: FilterOrBool | None = None, enable_history_search: FilterOrBool | None = None, search_ignore_case: FilterOrBool | None = None, complete_while_typing: FilterOrBool | None = None, validate_while_typing: FilterOrBool | None = None, complete_style: CompleteStyle | None = None, auto_suggest: AutoSuggest | None = None, validator: Validator | None = None, clipboard: Clipboard | None = None, mouse_support: FilterOrBool | None = None, input_processors: list[Processor] | None = None, placeholder: AnyFormattedText | None = None, reserve_space_for_menu: int | None = None, enable_system_prompt: FilterOrBool | None = None, enable_suspend: FilterOrBool | None = None, enable_open_in_editor: FilterOrBool | None = None, tempfile_suffix: str | Callable[[], str] | None = None, tempfile: str | Callable[[], str] | None = None, default: str = '', accept_default: bool = False, pre_run: Callable[[], None] | None = None) → str

ASSISTANT: I apologize for the confusion earlier. It seems that the `prompt_toolkit.prompt()` function does not accept `stdin` and `stdout` arguments directly. Instead, we need to use the `Application` class from `prompt_toolkit` to create a custom application with the desired input and output. Here's how to modify the `aider/getinput.py` file:

First, import the necessary classes and functions from `prompt_tool
^C KeyboardInterrupt
USER: class prompt_toolkit.shortcuts.PromptSession(message: AnyFormattedText = '', *, multiline: FilterOrBool = False, wrap_lines: FilterOrBool = True, is_password: FilterOrBool = False, vi_mode: bool = False, editing_mode: EditingMode = <EditingMode.EMACS: 'EMACS'>, complete_while_typing: FilterOrBool = True, validate_while_typing: FilterOrBool = True, enable_history_search: FilterOrBool = False, search_ignore_case: FilterOrBool = False, lexer: Lexer | None = None, enable_system_prompt: FilterOrBool = False, enable_suspend: FilterOrBool = False, enable_open_in_editor: FilterOrBool = False, validator: Validator | None = None, completer: Completer | None = None, complete_in_thread: bool = False, reserve_space_for_menu: int = 8, complete_style: CompleteStyle = <CompleteStyle.COLUMN: 'COLUMN'>, auto_suggest: AutoSuggest | None = None, style: BaseStyle | None = None, style_transformation: StyleTransformation | None = None, swap_light_and_dark_colors: FilterOrBool = False, color_depth: ColorDepth | None = None, cursor: AnyCursorShapeConfig = None, include_default_pygments_style: FilterOrBool = True, history: History | None = None, clipboard: Clipboard | None = None, prompt_continuation: PromptContinuationText | None = None, rprompt: AnyFormattedText = None, bottom_toolbar: AnyFormattedText = None, mouse_support: FilterOrBool = False, input_processors: list[Processor] | None = None, placeholder: AnyFormattedText | None = None, key_bindings: KeyBindingsBase | None = None, erase_when_done: bool = False, tempfile_suffix: str | Callable[[], str] | None = '.txt', tempfile: str | Callable[[], str] | None = None, refresh_interval: float = 0, input: Input | None = None, output: Output | None = None)
ASSISTANT: Thank you for providing the `PromptSession` class information. We can use the `PromptSession` class to create a custom session with the desired input and output. Here's how to modify the `aider/getinput.py` file:

First, import the `PromptSession` class from `prompt_toolkit.shortcuts`:

```python
aider/getinput.py
<<<<<<< ORIGINAL
from prompt_toolkit import prompt
=======
from prompt_toolkit.shortcuts import PromptSession
>>>>>>> UPDATED
```

Now, update the `get_input()` method to use the `PromptSession` class:

```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,
                input=self.input,
                output=self.output,
            )
=======
            session = PromptSession(
                message=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,
            )
            line = session.prompt()
>>>>>>> UPDATED
```

These changes will ensure that the `input` and `output` arguments are passed correctly to the `prompt_toolkit`'s `PromptSession` class.
2023-05-13 07:14:54 -07:00
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