mirror of
https://github.com/Aider-AI/aider.git
synced 2025-05-30 09:14:59 +00:00

# Aider chat conversation: USER: https://github.com/paul-gauthier/aider/issues/662 https://github.com/paul-gauthier/aider/issues/662: [Skip to content](#start-of-content) ## Navigation Menu Toggle navigation [](https://github.com/) [Sign in](/login?return_to=https%3A%2F%2Fgithub.com%2Fpaul-gauthier%2Faider%2Fissues%2F662) - Product - [](https://github.com/features/actions) Actions Automate any workflow - [](https://github.com/features/packages) Packages Host and manage packages - [](https://github.com/features/security) Security Find and fix vulnerabilities - [](https://github.com/features/codespaces) Codespaces Instant dev environments - [](https://github.com/features/copilot) GitHub Copilot Write better code with AI - [](https://github.com/features/code-review) Code review Manage code changes - [](https://github.com/features/issues) Issues Plan and track work - [](https://github.com/features/discussions) Discussions Collaborate outside of code Explore - [All features](https://github.com/features) - [Documentation](https://docs.github.com) - [GitHub Skills](https://skills.github.com) - [Blog](https://github.blog) - Solutions For - [Enterprise](https://github.com/enterprise) - [Teams](https://github.com/team) - [Startups](https://github.com/enterprise/startups) - [Education](https://education.github.com) By Solution - [CI/CD & Automation](https://github.com/solutions/ci-cd) - [DevOps](https://github.com/solutions/devops) - [DevSecOps](https://resources.github.com/devops/fundamentals/devsecops) Resources - [Learning Pathways](https://resources.github.com/learn/pathways) - [White papers, Ebooks, Webinars](https://resources.github.com) - [Customer Stories](https://github.com/customer-stories) - [Partners](https://partner.github.com) - Open Source - [](/sponsors) GitHub Sponsors Fund open source developers - [](https://github.com/readme) The ReadME Project GitHub community articles Repositories - [Topics](https://github.com/topics) - [Trending](https://github.com/trending) - [Collections](https://github.com/collections) - Enterprise - [](/enterprise) Enterprise platform AI-powered developer platform Available add-ons - [](https://github.com/enterprise/advanced-security) Advanced Security Enterprise-grade security features - [](/features/copilot#enterprise) GitHub Copilot Enterprise-grade AI features - [](/premium-support) Premium Support Enterprise-grade 24/7 support - [Pricing](https://github.com/pricing) Search or jump to\... # Search code, repositories, users, issues, pull requests\... Search Clear [Search syntax tips](https://docs.github.com/search-github/github-code-search/understanding-github-code-search-syntax) # Provide feedback We read every piece of feedback, and take your input very seriously. Include my email address so I can be contacted Cancel Submit feedback # Saved searches ## Use saved searches to filter your results more quickly Name Query To see all available qualifiers, see our [documentation](https://docs.github.com/search-github/github-code-search/understanding-github-code-search-syntax). Cancel Create saved search [Sign in](/login?return_to=https%3A%2F%2Fgithub.com%2Fpaul-gauthier%2Faider%2Fissues%2F662) [Sign up](/signup?ref_cta=Sign+up&ref_loc=header+logged+out&ref_page=%2F%3Cuser-name%3E%2F%3Crepo-name%3E%2Fvoltron%2Fissues_fragments%2Fissue_layout&source=header-repo&source_repo=paul-gauthier%2Faider) You signed in with another tab or window. [Reload]() to refresh your session. You signed out in another tab or window. [Reload]() to refresh your session. You switched accounts on another tab or window. [Reload]() to refresh your session. Dismiss alert {{ message }} ::: {role="main"} [paul-gauthier](/paul-gauthier) / **[aider](/paul-gauthier/aider)** Public - [Notifications](/login?return_to=%2Fpaul-gauthier%2Faider) You must be signed in to change notification settings - [Fork 1.1k](/login?return_to=%2Fpaul-gauthier%2Faider) - [ Star 11.3k](/login?return_to=%2Fpaul-gauthier%2Faider) - [Code ](/paul-gauthier/aider) - [Issues 59](/paul-gauthier/aider/issues) - [Pull requests 14](/paul-gauthier/aider/pulls) - [Actions ](/paul-gauthier/aider/actions) - [Projects 0](/paul-gauthier/aider/projects) - [Security](/paul-gauthier/aider/security) - [Insights ](/paul-gauthier/aider/pulse) Additional navigation options - [ Code ](/paul-gauthier/aider) - [ Issues ](/paul-gauthier/aider/issues) - [ Pull requests ](/paul-gauthier/aider/pulls) - [ Actions ](/paul-gauthier/aider/actions) - [ Projects ](/paul-gauthier/aider/projects) - [ Security ](/paul-gauthier/aider/security) - [ Insights ](/paul-gauthier/aider/pulse) New issue **Have a question about this project?** Sign up for a free GitHub account to open an issue and contact its maintainers and the community. [Sign up for GitHub](/signup?return_to=%2Fpaul-gauthier%2Faider%2Fissues%2Fnew%2Fchoose) By clicking "Sign up for GitHub", you agree to our [terms of service](https://docs.github.com/terms) and [privacy statement](https://docs.github.com/privacy). We'll occasionally send you account related emails. Already on GitHub? [Sign in](/login?return_to=%2Fpaul-gauthier%2Faider%2Fissues%2Fnew%2Fchoose) to your account [Jump to bottom](#issue-comment-box) # Ugly crash during startup when `~/.gitconfig` is missing \[user\] #662 Open [Megamannen](/Megamannen) opened this issue Jun 10, 2024 · 1 comment Open # [Ugly crash during startup when `~/.gitconfig` is missing \[user\]](#top) #662 [Megamannen](/Megamannen) opened this issue Jun 10, 2024 · 1 comment ## Comments [](/Megamannen) Copy link ### **[Megamannen](/Megamannen)** commented [Jun 10, 2024](#issue-2343705266) +-----------------------------------------------------------------------+ | ### Issue | | | | This is my `~/.gitconfig` | | | | | | | | [safe] | | directory = /home/mega/Projects | | | | | | | | | | | | | | | | This is the output: | | | | | | | | aider | | Traceback (most recent call last): | | File "/usr/lib/python3.12/configparser.py", line 767, in get | | value = d[option] | | ~^^^^^^^^ | | File "/u | | sr/lib/python3.12/collections/__init__.py", line 1015, in __getitem__ | | return self.__m | | issing__(key) # support subclasses that define __missing__ | | ^^^^^^^^^^^^^^^^^^^^^ | | File "/u | | sr/lib/python3.12/collections/__init__.py", line 1007, in __missing__ | | raise KeyError(key) | | KeyError: 'name' | | | | | | During handling of the above exception, another exception occurred: | | | | Traceback (most recent call last): | | File "/home/mega/.local/bin/aider", line 8, in <module> | | sys.exit(main()) | | ^^^^^^ | | File "/home/mega/.local/share/pipx/venvs/aide | | r-chat/lib/python3.12/site-packages/aider/main.py", line 306, in main | | git_root = setup_git(git_root, io) | | ^^^^^^^^^^^^^^^^^^^^^^^ | | File "/home/mega/.local/share/pipx/venvs/aider-ch | | at/lib/python3.12/site-packages/aider/main.py", line 68, in setup_git | | user_name = config.get_value("user", "name", None) | | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | | File "/home/mega/.local/share/pipx/venvs/aider-cha | | t/lib/python3.12/site-packages/git/config.py", line 793, in get_value | | valuestr = self.get(section, option) | | ^^^^^^^^^^^^^^^^^^^^^^^^^ | | File "/home/mega/.local/share/pipx/venvs/aider-chat/lib/pyth | | on3.12/site-packages/git/config.py", line 114, in assure_data_present | | return func(self, *args, **kwargs) | | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ | | File "/usr/lib/python3.12/configparser.py", line 770, in get | | raise NoOptionError(option, section) | | configparser.NoOptionError: No option 'name' in section: 'user' | | | | | | | | | | | | | | | | I added my user info to .gitconfig and it works | | | | ### Version and model info | | | | Aider: v0.37.0 | +-----------------------------------------------------------------------+ | | | | | The text was updated successfully, but these errors were encountered: | | | | | +-----------------------------------------------------------------------+ All reactions Copy link Owner ### **[paul-gauthier](/paul-gauthier)** commented [Jun 10, 2024](#issuecomment-2159441132) +-----------------------------------------------------------------------+ | Thanks for trying aider and filing this issue. | | | | I am unable to reproduce this issue. I made my `~/.gitconfig` the | | same as yours and aider does the expected thing: | | | | | | | | $ git init | | | | $ aider | | Update git name with: git config user.name "Your Name" | | Update git email with: git config user.email "you@example.com" | | ... | | | | | | | | | | | | | | | | Can you describe more clearly how to reproduce? | +-----------------------------------------------------------------------+ All reactions Sorry, something went wrong. [Sign up for free](/join?source=comment-repo) **to join this conversation on GitHub**. Already have an account? [Sign in to comment](/login?return_to=https%3A%2F%2Fgithub.com%2Fpaul-gauthier%2Faider%2Fissues%2F662) Assignees No one assigned Labels None yet Projects None yet Milestone No milestone Development No branches or pull requests 2 participants ::: ## Footer [](https://github.com) © 2024 GitHub, Inc. ### Footer navigation - [Terms](https://docs.github.com/site-policy/github-terms/github-terms-of-service) - [Privacy](https://docs.github.com/site-policy/privacy-policies/github-privacy-statement) - [Security](https://github.com/security) - [Status](https://www.githubstatus.com/) - [Docs](https://docs.github.com/) - [Contact](https://support.github.com?tags=dotcom-footer) - Manage cookies - Do not share my personal information You can't perform that action at this time. ASSISTANT: To address the issue described in https://github.com/paul-gauthier/aider/issues/662, we need to handle the case where the `~/.gitconfig` file is missing or does not contain the `user.name` entry. The most likely file to need changes is: - `aider/main.py` Please add `aider/main.py` to the chat so I can propose the necessary changes. USER: I added these files to the chat: aider/main.py. If you need to propose edits to other existing files not already added to the chat, you *MUST* tell the me their full path names and ask me to *add the files to the chat*. End your reply and wait for my approval. You can keep asking if you then decide you need to edit more files. ASSISTANT: To handle the case where the `~/.gitconfig` file is missing or does not contain the `user.name` entry, we need to catch the `configparser.NoOptionError` exception and handle it gracefully. Here are the changes needed: 1. Modify the `setup_git` function to handle the `configparser.NoOptionError` exception. aider/main.py ```python <<<<<<< SEARCH except configparser.NoSectionError: ======= except (configparser.NoSectionError, configparser.NoOptionError): >>>>>>> REPLACE ``` This change will ensure that the code handles the case where the `user.name` or `user.email` is missing in the `~/.gitconfig` file without crashing.
466 lines
13 KiB
Python
466 lines
13 KiB
Python
import configparser
|
|
import os
|
|
import re
|
|
import sys
|
|
from pathlib import Path
|
|
|
|
import git
|
|
from dotenv import load_dotenv
|
|
from streamlit.web import cli
|
|
|
|
from aider import __version__, models, utils
|
|
from aider.args import get_parser
|
|
from aider.coders import Coder
|
|
from aider.commands import SwitchModel
|
|
from aider.io import InputOutput
|
|
from aider.litellm import litellm # noqa: F401; properly init litellm on launch
|
|
from aider.repo import GitRepo
|
|
from aider.versioncheck import check_version
|
|
|
|
from .dump import dump # noqa: F401
|
|
|
|
|
|
def get_git_root():
|
|
"""Try and guess the git repo, since the conf.yml can be at the repo root"""
|
|
try:
|
|
repo = git.Repo(search_parent_directories=True)
|
|
return repo.working_tree_dir
|
|
except git.InvalidGitRepositoryError:
|
|
return None
|
|
|
|
|
|
def guessed_wrong_repo(io, git_root, fnames, git_dname):
|
|
"""After we parse the args, we can determine the real repo. Did we guess wrong?"""
|
|
|
|
try:
|
|
check_repo = Path(GitRepo(io, fnames, git_dname).root).resolve()
|
|
except FileNotFoundError:
|
|
return
|
|
|
|
# we had no guess, rely on the "true" repo result
|
|
if not git_root:
|
|
return str(check_repo)
|
|
|
|
git_root = Path(git_root).resolve()
|
|
if check_repo == git_root:
|
|
return
|
|
|
|
return str(check_repo)
|
|
|
|
|
|
def setup_git(git_root, io):
|
|
repo = None
|
|
if git_root:
|
|
repo = git.Repo(git_root)
|
|
elif io.confirm_ask("No git repo found, create one to track GPT's changes (recommended)?"):
|
|
git_root = str(Path.cwd().resolve())
|
|
repo = git.Repo.init(git_root)
|
|
io.tool_output("Git repository created in the current working directory.")
|
|
check_gitignore(git_root, io, False)
|
|
|
|
if not repo:
|
|
return
|
|
|
|
user_name = None
|
|
user_email = None
|
|
with repo.config_reader() as config:
|
|
try:
|
|
user_name = config.get_value("user", "name", None)
|
|
except (configparser.NoSectionError, configparser.NoOptionError):
|
|
pass
|
|
try:
|
|
user_email = config.get_value("user", "email", None)
|
|
except configparser.NoSectionError:
|
|
pass
|
|
|
|
if user_name and user_email:
|
|
return repo.working_tree_dir
|
|
|
|
with repo.config_writer() as git_config:
|
|
if not user_name:
|
|
git_config.set_value("user", "name", "Your Name")
|
|
io.tool_error('Update git name with: git config user.name "Your Name"')
|
|
if not user_email:
|
|
git_config.set_value("user", "email", "you@example.com")
|
|
io.tool_error('Update git email with: git config user.email "you@example.com"')
|
|
|
|
return repo.working_tree_dir
|
|
|
|
|
|
def check_gitignore(git_root, io, ask=True):
|
|
if not git_root:
|
|
return
|
|
|
|
try:
|
|
repo = git.Repo(git_root)
|
|
if repo.ignored(".aider"):
|
|
return
|
|
except git.exc.InvalidGitRepositoryError:
|
|
pass
|
|
|
|
pat = ".aider*"
|
|
|
|
gitignore_file = Path(git_root) / ".gitignore"
|
|
if gitignore_file.exists():
|
|
content = io.read_text(gitignore_file)
|
|
if content is None:
|
|
return
|
|
if pat in content.splitlines():
|
|
return
|
|
else:
|
|
content = ""
|
|
|
|
if ask and not io.confirm_ask(f"Add {pat} to .gitignore (recommended)?"):
|
|
return
|
|
|
|
if content and not content.endswith("\n"):
|
|
content += "\n"
|
|
content += pat + "\n"
|
|
io.write_text(gitignore_file, content)
|
|
|
|
io.tool_output(f"Added {pat} to .gitignore")
|
|
|
|
|
|
def format_settings(parser, args):
|
|
show = scrub_sensitive_info(args, parser.format_values())
|
|
show += "\n"
|
|
show += "Option settings:\n"
|
|
for arg, val in sorted(vars(args).items()):
|
|
if val:
|
|
val = scrub_sensitive_info(args, str(val))
|
|
show += f" - {arg}: {val}\n"
|
|
return show
|
|
|
|
|
|
def scrub_sensitive_info(args, text):
|
|
# Replace sensitive information with placeholder
|
|
if text and args.openai_api_key:
|
|
text = text.replace(args.openai_api_key, "***")
|
|
if text and args.anthropic_api_key:
|
|
text = text.replace(args.anthropic_api_key, "***")
|
|
return text
|
|
|
|
|
|
def launch_gui(args):
|
|
from aider import gui
|
|
|
|
print()
|
|
print("CONTROL-C to exit...")
|
|
|
|
target = gui.__file__
|
|
|
|
st_args = ["run", target]
|
|
|
|
st_args += [
|
|
"--browser.gatherUsageStats=false",
|
|
"--runner.magicEnabled=false",
|
|
"--server.runOnSave=false",
|
|
]
|
|
|
|
if "-dev" in __version__:
|
|
print("Watching for file changes.")
|
|
else:
|
|
st_args += [
|
|
"--global.developmentMode=false",
|
|
"--server.fileWatcherType=none",
|
|
"--client.toolbarMode=viewer", # minimal?
|
|
]
|
|
|
|
st_args += ["--"] + args
|
|
|
|
cli.main(st_args)
|
|
|
|
# from click.testing import CliRunner
|
|
# runner = CliRunner()
|
|
# from streamlit.web import bootstrap
|
|
# bootstrap.load_config_options(flag_options={})
|
|
# cli.main_run(target, args)
|
|
# sys.argv = ['streamlit', 'run', '--'] + args
|
|
|
|
|
|
def parse_lint_cmds(lint_cmds, io):
|
|
err = False
|
|
res = dict()
|
|
for lint_cmd in lint_cmds:
|
|
if re.match(r"^[a-z]+:.*", lint_cmd):
|
|
pieces = lint_cmd.split(":")
|
|
lang = pieces[0]
|
|
cmd = lint_cmd[len(lang) + 1 :]
|
|
lang = lang.strip()
|
|
else:
|
|
lang = None
|
|
cmd = lint_cmd
|
|
|
|
cmd = cmd.strip()
|
|
|
|
if cmd:
|
|
res[lang] = cmd
|
|
else:
|
|
io.tool_error(f'Unable to parse --lint-cmd "{lint_cmd}"')
|
|
io.tool_error('The arg should be "language: cmd --args ..."')
|
|
io.tool_error('For example: --lint-cmd "python: flake8 --select=E9"')
|
|
err = True
|
|
if err:
|
|
return
|
|
return res
|
|
|
|
|
|
def main(argv=None, input=None, output=None, force_git_root=None, return_coder=False):
|
|
if argv is None:
|
|
argv = sys.argv[1:]
|
|
|
|
if force_git_root:
|
|
git_root = force_git_root
|
|
else:
|
|
git_root = get_git_root()
|
|
|
|
conf_fname = Path(".aider.conf.yml")
|
|
|
|
default_config_files = [conf_fname.resolve()] # CWD
|
|
if git_root:
|
|
git_conf = Path(git_root) / conf_fname # git root
|
|
if git_conf not in default_config_files:
|
|
default_config_files.append(git_conf)
|
|
default_config_files.append(Path.home() / conf_fname) # homedir
|
|
default_config_files = list(map(str, default_config_files))
|
|
|
|
parser = get_parser(default_config_files, git_root)
|
|
args = parser.parse_args(argv)
|
|
|
|
if args.gui and not return_coder:
|
|
launch_gui(argv)
|
|
return
|
|
|
|
if args.dark_mode:
|
|
args.user_input_color = "#32FF32"
|
|
args.tool_error_color = "#FF3333"
|
|
args.assistant_output_color = "#00FFFF"
|
|
args.code_theme = "monokai"
|
|
|
|
if args.light_mode:
|
|
args.user_input_color = "green"
|
|
args.tool_error_color = "red"
|
|
args.assistant_output_color = "blue"
|
|
args.code_theme = "default"
|
|
|
|
if return_coder and args.yes is None:
|
|
args.yes = True
|
|
|
|
io = InputOutput(
|
|
args.pretty,
|
|
args.yes,
|
|
args.input_history_file,
|
|
args.chat_history_file,
|
|
input=input,
|
|
output=output,
|
|
user_input_color=args.user_input_color,
|
|
tool_output_color=args.tool_output_color,
|
|
tool_error_color=args.tool_error_color,
|
|
dry_run=args.dry_run,
|
|
encoding=args.encoding,
|
|
)
|
|
|
|
fnames = [str(Path(fn).resolve()) for fn in args.files]
|
|
if len(args.files) > 1:
|
|
good = True
|
|
for fname in args.files:
|
|
if Path(fname).is_dir():
|
|
io.tool_error(f"{fname} is a directory, not provided alone.")
|
|
good = False
|
|
if not good:
|
|
io.tool_error(
|
|
"Provide either a single directory of a git repo, or a list of one or more files."
|
|
)
|
|
return 1
|
|
|
|
git_dname = None
|
|
if len(args.files) == 1:
|
|
if Path(args.files[0]).is_dir():
|
|
if args.git:
|
|
git_dname = str(Path(args.files[0]).resolve())
|
|
fnames = []
|
|
else:
|
|
io.tool_error(f"{args.files[0]} is a directory, but --no-git selected.")
|
|
return 1
|
|
|
|
# We can't know the git repo for sure until after parsing the args.
|
|
# If we guessed wrong, reparse because that changes things like
|
|
# the location of the config.yml and history files.
|
|
if args.git and not force_git_root:
|
|
right_repo_root = guessed_wrong_repo(io, git_root, fnames, git_dname)
|
|
if right_repo_root:
|
|
return main(argv, input, output, right_repo_root, return_coder=return_coder)
|
|
|
|
if not args.skip_check_update:
|
|
check_version(io.tool_error)
|
|
|
|
if args.check_update:
|
|
update_available = check_version(lambda msg: None)
|
|
return 0 if not update_available else 1
|
|
|
|
if args.models:
|
|
models.print_matching_models(io, args.models)
|
|
return 0
|
|
|
|
if args.git:
|
|
git_root = setup_git(git_root, io)
|
|
if args.gitignore:
|
|
check_gitignore(git_root, io)
|
|
|
|
if args.verbose:
|
|
show = format_settings(parser, args)
|
|
io.tool_output(show)
|
|
|
|
cmd_line = " ".join(sys.argv)
|
|
cmd_line = scrub_sensitive_info(args, cmd_line)
|
|
io.tool_output(cmd_line, log_only=True)
|
|
|
|
if args.env_file:
|
|
load_dotenv(args.env_file)
|
|
|
|
if args.anthropic_api_key:
|
|
os.environ["ANTHROPIC_API_KEY"] = args.anthropic_api_key
|
|
|
|
if args.openai_api_key:
|
|
os.environ["OPENAI_API_KEY"] = args.openai_api_key
|
|
if args.openai_api_base:
|
|
os.environ["OPENAI_API_BASE"] = args.openai_api_base
|
|
if args.openai_api_version:
|
|
os.environ["OPENAI_API_VERSION"] = args.openai_api_version
|
|
if args.openai_api_type:
|
|
os.environ["OPENAI_API_TYPE"] = args.openai_api_type
|
|
if args.openai_organization_id:
|
|
os.environ["OPENAI_ORGANIZATION"] = args.openai_organization_id
|
|
|
|
main_model = models.Model(args.model, weak_model=args.weak_model)
|
|
|
|
lint_cmds = parse_lint_cmds(args.lint_cmd, io)
|
|
if lint_cmds is None:
|
|
return 1
|
|
|
|
if args.show_model_warnings:
|
|
models.sanity_check_models(io, main_model)
|
|
|
|
try:
|
|
coder = Coder.create(
|
|
main_model=main_model,
|
|
edit_format=args.edit_format,
|
|
io=io,
|
|
##
|
|
fnames=fnames,
|
|
git_dname=git_dname,
|
|
pretty=args.pretty,
|
|
show_diffs=args.show_diffs,
|
|
auto_commits=args.auto_commits,
|
|
dirty_commits=args.dirty_commits,
|
|
dry_run=args.dry_run,
|
|
map_tokens=args.map_tokens,
|
|
verbose=args.verbose,
|
|
assistant_output_color=args.assistant_output_color,
|
|
code_theme=args.code_theme,
|
|
stream=args.stream,
|
|
use_git=args.git,
|
|
voice_language=args.voice_language,
|
|
aider_ignore_file=args.aiderignore,
|
|
max_chat_history_tokens=args.max_chat_history_tokens,
|
|
restore_chat_history=args.restore_chat_history,
|
|
auto_lint=args.auto_lint,
|
|
auto_test=args.auto_test,
|
|
lint_cmds=lint_cmds,
|
|
test_cmd=args.test_cmd,
|
|
)
|
|
|
|
except ValueError as err:
|
|
io.tool_error(str(err))
|
|
return 1
|
|
|
|
if return_coder:
|
|
return coder
|
|
|
|
coder.show_announcements()
|
|
|
|
if args.show_prompts:
|
|
coder.cur_messages += [
|
|
dict(role="user", content="Hello!"),
|
|
]
|
|
messages = coder.format_messages()
|
|
utils.show_messages(messages)
|
|
return
|
|
|
|
if args.commit:
|
|
coder.commands.cmd_commit()
|
|
return
|
|
|
|
if args.lint:
|
|
coder.commands.cmd_lint(fnames=fnames)
|
|
return
|
|
|
|
if args.test:
|
|
if not args.test_cmd:
|
|
io.tool_error("No --test-cmd provided.")
|
|
return 1
|
|
test_errors = coder.commands.cmd_test(args.test_cmd)
|
|
if test_errors:
|
|
coder.run(test_errors)
|
|
return
|
|
|
|
if args.show_repo_map:
|
|
repo_map = coder.get_repo_map()
|
|
if repo_map:
|
|
io.tool_output(repo_map)
|
|
return
|
|
|
|
if args.apply:
|
|
content = io.read_text(args.apply)
|
|
if content is None:
|
|
return
|
|
coder.partial_response_content = content
|
|
coder.apply_updates()
|
|
return
|
|
|
|
if "VSCODE_GIT_IPC_HANDLE" in os.environ:
|
|
args.pretty = False
|
|
io.tool_output("VSCode terminal detected, pretty output has been disabled.")
|
|
|
|
io.tool_output("Use /help to see in-chat commands, run with --help to see cmd line args")
|
|
|
|
if git_root and Path.cwd().resolve() != Path(git_root).resolve():
|
|
io.tool_error(
|
|
"Note: in-chat filenames are always relative to the git working dir, not the current"
|
|
" working dir."
|
|
)
|
|
|
|
io.tool_error(f"Cur working dir: {Path.cwd()}")
|
|
io.tool_error(f"Git working dir: {git_root}")
|
|
|
|
if args.message:
|
|
io.add_to_input_history(args.message)
|
|
io.tool_output()
|
|
coder.run(with_message=args.message)
|
|
return
|
|
|
|
if args.message_file:
|
|
try:
|
|
message_from_file = io.read_text(args.message_file)
|
|
io.tool_output()
|
|
coder.run(with_message=message_from_file)
|
|
except FileNotFoundError:
|
|
io.tool_error(f"Message file not found: {args.message_file}")
|
|
return 1
|
|
except IOError as e:
|
|
io.tool_error(f"Error reading message file: {e}")
|
|
return 1
|
|
return
|
|
|
|
while True:
|
|
try:
|
|
coder.run()
|
|
return
|
|
except SwitchModel as switch:
|
|
coder = Coder.create(main_model=switch.model, io=io, from_coder=coder)
|
|
coder.show_announcements()
|
|
|
|
|
|
if __name__ == "__main__":
|
|
status = main()
|
|
sys.exit(status)
|