chatmcp-cli 0.1.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- aider/__init__.py +20 -0
- aider/__main__.py +4 -0
- aider/_version.py +21 -0
- aider/analytics.py +250 -0
- aider/args.py +926 -0
- aider/args_formatter.py +228 -0
- aider/coders/__init__.py +34 -0
- aider/coders/architect_coder.py +48 -0
- aider/coders/architect_prompts.py +40 -0
- aider/coders/ask_coder.py +9 -0
- aider/coders/ask_prompts.py +35 -0
- aider/coders/base_coder.py +2483 -0
- aider/coders/base_prompts.py +60 -0
- aider/coders/chat_chunks.py +64 -0
- aider/coders/context_coder.py +53 -0
- aider/coders/context_prompts.py +75 -0
- aider/coders/editblock_coder.py +657 -0
- aider/coders/editblock_fenced_coder.py +10 -0
- aider/coders/editblock_fenced_prompts.py +143 -0
- aider/coders/editblock_func_coder.py +141 -0
- aider/coders/editblock_func_prompts.py +27 -0
- aider/coders/editblock_prompts.py +174 -0
- aider/coders/editor_diff_fenced_coder.py +9 -0
- aider/coders/editor_diff_fenced_prompts.py +11 -0
- aider/coders/editor_editblock_coder.py +8 -0
- aider/coders/editor_editblock_prompts.py +18 -0
- aider/coders/editor_whole_coder.py +8 -0
- aider/coders/editor_whole_prompts.py +10 -0
- aider/coders/help_coder.py +16 -0
- aider/coders/help_prompts.py +46 -0
- aider/coders/patch_coder.py +706 -0
- aider/coders/patch_prompts.py +161 -0
- aider/coders/search_replace.py +757 -0
- aider/coders/shell.py +37 -0
- aider/coders/single_wholefile_func_coder.py +102 -0
- aider/coders/single_wholefile_func_prompts.py +27 -0
- aider/coders/udiff_coder.py +429 -0
- aider/coders/udiff_prompts.py +115 -0
- aider/coders/udiff_simple.py +14 -0
- aider/coders/udiff_simple_prompts.py +25 -0
- aider/coders/wholefile_coder.py +144 -0
- aider/coders/wholefile_func_coder.py +134 -0
- aider/coders/wholefile_func_prompts.py +27 -0
- aider/coders/wholefile_prompts.py +67 -0
- aider/commands.py +1665 -0
- aider/copypaste.py +72 -0
- aider/deprecated.py +126 -0
- aider/diffs.py +128 -0
- aider/dump.py +29 -0
- aider/editor.py +147 -0
- aider/exceptions.py +107 -0
- aider/format_settings.py +26 -0
- aider/gui.py +545 -0
- aider/help.py +163 -0
- aider/help_pats.py +19 -0
- aider/history.py +143 -0
- aider/io.py +1175 -0
- aider/linter.py +304 -0
- aider/llm.py +47 -0
- aider/main.py +1267 -0
- aider/mdstream.py +243 -0
- aider/models.py +1286 -0
- aider/onboarding.py +428 -0
- aider/openrouter.py +128 -0
- aider/prompts.py +64 -0
- aider/queries/tree-sitter-language-pack/README.md +7 -0
- aider/queries/tree-sitter-language-pack/arduino-tags.scm +5 -0
- aider/queries/tree-sitter-language-pack/c-tags.scm +9 -0
- aider/queries/tree-sitter-language-pack/chatito-tags.scm +16 -0
- aider/queries/tree-sitter-language-pack/commonlisp-tags.scm +122 -0
- aider/queries/tree-sitter-language-pack/cpp-tags.scm +15 -0
- aider/queries/tree-sitter-language-pack/csharp-tags.scm +26 -0
- aider/queries/tree-sitter-language-pack/d-tags.scm +26 -0
- aider/queries/tree-sitter-language-pack/dart-tags.scm +92 -0
- aider/queries/tree-sitter-language-pack/elisp-tags.scm +5 -0
- aider/queries/tree-sitter-language-pack/elixir-tags.scm +54 -0
- aider/queries/tree-sitter-language-pack/elm-tags.scm +19 -0
- aider/queries/tree-sitter-language-pack/gleam-tags.scm +41 -0
- aider/queries/tree-sitter-language-pack/go-tags.scm +42 -0
- aider/queries/tree-sitter-language-pack/java-tags.scm +20 -0
- aider/queries/tree-sitter-language-pack/javascript-tags.scm +88 -0
- aider/queries/tree-sitter-language-pack/lua-tags.scm +34 -0
- aider/queries/tree-sitter-language-pack/ocaml-tags.scm +115 -0
- aider/queries/tree-sitter-language-pack/ocaml_interface-tags.scm +98 -0
- aider/queries/tree-sitter-language-pack/pony-tags.scm +39 -0
- aider/queries/tree-sitter-language-pack/properties-tags.scm +5 -0
- aider/queries/tree-sitter-language-pack/python-tags.scm +14 -0
- aider/queries/tree-sitter-language-pack/r-tags.scm +21 -0
- aider/queries/tree-sitter-language-pack/racket-tags.scm +12 -0
- aider/queries/tree-sitter-language-pack/ruby-tags.scm +64 -0
- aider/queries/tree-sitter-language-pack/rust-tags.scm +60 -0
- aider/queries/tree-sitter-language-pack/solidity-tags.scm +43 -0
- aider/queries/tree-sitter-language-pack/swift-tags.scm +51 -0
- aider/queries/tree-sitter-language-pack/udev-tags.scm +20 -0
- aider/queries/tree-sitter-languages/README.md +23 -0
- aider/queries/tree-sitter-languages/c-tags.scm +9 -0
- aider/queries/tree-sitter-languages/c_sharp-tags.scm +46 -0
- aider/queries/tree-sitter-languages/cpp-tags.scm +15 -0
- aider/queries/tree-sitter-languages/dart-tags.scm +91 -0
- aider/queries/tree-sitter-languages/elisp-tags.scm +8 -0
- aider/queries/tree-sitter-languages/elixir-tags.scm +54 -0
- aider/queries/tree-sitter-languages/elm-tags.scm +19 -0
- aider/queries/tree-sitter-languages/go-tags.scm +30 -0
- aider/queries/tree-sitter-languages/hcl-tags.scm +77 -0
- aider/queries/tree-sitter-languages/java-tags.scm +20 -0
- aider/queries/tree-sitter-languages/javascript-tags.scm +88 -0
- aider/queries/tree-sitter-languages/kotlin-tags.scm +27 -0
- aider/queries/tree-sitter-languages/ocaml-tags.scm +115 -0
- aider/queries/tree-sitter-languages/ocaml_interface-tags.scm +98 -0
- aider/queries/tree-sitter-languages/php-tags.scm +26 -0
- aider/queries/tree-sitter-languages/python-tags.scm +12 -0
- aider/queries/tree-sitter-languages/ql-tags.scm +26 -0
- aider/queries/tree-sitter-languages/ruby-tags.scm +64 -0
- aider/queries/tree-sitter-languages/rust-tags.scm +60 -0
- aider/queries/tree-sitter-languages/scala-tags.scm +65 -0
- aider/queries/tree-sitter-languages/typescript-tags.scm +41 -0
- aider/reasoning_tags.py +82 -0
- aider/repo.py +623 -0
- aider/repomap.py +847 -0
- aider/report.py +200 -0
- aider/resources/__init__.py +3 -0
- aider/resources/model-metadata.json +468 -0
- aider/resources/model-settings.yml +1767 -0
- aider/run_cmd.py +132 -0
- aider/scrape.py +284 -0
- aider/sendchat.py +61 -0
- aider/special.py +203 -0
- aider/urls.py +17 -0
- aider/utils.py +338 -0
- aider/versioncheck.py +113 -0
- aider/voice.py +187 -0
- aider/waiting.py +221 -0
- aider/watch.py +318 -0
- aider/watch_prompts.py +12 -0
- aider/website/Gemfile +8 -0
- aider/website/_includes/blame.md +162 -0
- aider/website/_includes/get-started.md +22 -0
- aider/website/_includes/help-tip.md +5 -0
- aider/website/_includes/help.md +24 -0
- aider/website/_includes/install.md +5 -0
- aider/website/_includes/keys.md +4 -0
- aider/website/_includes/model-warnings.md +67 -0
- aider/website/_includes/multi-line.md +22 -0
- aider/website/_includes/python-m-aider.md +5 -0
- aider/website/_includes/recording.css +228 -0
- aider/website/_includes/recording.md +34 -0
- aider/website/_includes/replit-pipx.md +9 -0
- aider/website/_includes/works-best.md +1 -0
- aider/website/_sass/custom/custom.scss +103 -0
- aider/website/docs/config/adv-model-settings.md +1881 -0
- aider/website/docs/config/aider_conf.md +527 -0
- aider/website/docs/config/api-keys.md +90 -0
- aider/website/docs/config/dotenv.md +478 -0
- aider/website/docs/config/editor.md +127 -0
- aider/website/docs/config/model-aliases.md +103 -0
- aider/website/docs/config/options.md +843 -0
- aider/website/docs/config/reasoning.md +209 -0
- aider/website/docs/config.md +44 -0
- aider/website/docs/faq.md +378 -0
- aider/website/docs/git.md +76 -0
- aider/website/docs/index.md +47 -0
- aider/website/docs/install/codespaces.md +39 -0
- aider/website/docs/install/docker.md +57 -0
- aider/website/docs/install/optional.md +100 -0
- aider/website/docs/install/replit.md +8 -0
- aider/website/docs/install.md +115 -0
- aider/website/docs/languages.md +264 -0
- aider/website/docs/legal/contributor-agreement.md +111 -0
- aider/website/docs/legal/privacy.md +104 -0
- aider/website/docs/llms/anthropic.md +77 -0
- aider/website/docs/llms/azure.md +48 -0
- aider/website/docs/llms/bedrock.md +132 -0
- aider/website/docs/llms/cohere.md +34 -0
- aider/website/docs/llms/deepseek.md +32 -0
- aider/website/docs/llms/gemini.md +49 -0
- aider/website/docs/llms/github.md +105 -0
- aider/website/docs/llms/groq.md +36 -0
- aider/website/docs/llms/lm-studio.md +39 -0
- aider/website/docs/llms/ollama.md +75 -0
- aider/website/docs/llms/openai-compat.md +39 -0
- aider/website/docs/llms/openai.md +58 -0
- aider/website/docs/llms/openrouter.md +78 -0
- aider/website/docs/llms/other.md +103 -0
- aider/website/docs/llms/vertex.md +50 -0
- aider/website/docs/llms/warnings.md +10 -0
- aider/website/docs/llms/xai.md +53 -0
- aider/website/docs/llms.md +54 -0
- aider/website/docs/more/analytics.md +122 -0
- aider/website/docs/more/edit-formats.md +116 -0
- aider/website/docs/more/infinite-output.md +137 -0
- aider/website/docs/more-info.md +8 -0
- aider/website/docs/recordings/auto-accept-architect.md +31 -0
- aider/website/docs/recordings/dont-drop-original-read-files.md +35 -0
- aider/website/docs/recordings/index.md +21 -0
- aider/website/docs/recordings/model-accepts-settings.md +69 -0
- aider/website/docs/recordings/tree-sitter-language-pack.md +80 -0
- aider/website/docs/repomap.md +112 -0
- aider/website/docs/scripting.md +100 -0
- aider/website/docs/troubleshooting/aider-not-found.md +24 -0
- aider/website/docs/troubleshooting/edit-errors.md +76 -0
- aider/website/docs/troubleshooting/imports.md +62 -0
- aider/website/docs/troubleshooting/models-and-keys.md +54 -0
- aider/website/docs/troubleshooting/support.md +79 -0
- aider/website/docs/troubleshooting/token-limits.md +96 -0
- aider/website/docs/troubleshooting/warnings.md +12 -0
- aider/website/docs/troubleshooting.md +11 -0
- aider/website/docs/usage/browser.md +57 -0
- aider/website/docs/usage/caching.md +49 -0
- aider/website/docs/usage/commands.md +132 -0
- aider/website/docs/usage/conventions.md +119 -0
- aider/website/docs/usage/copypaste.md +121 -0
- aider/website/docs/usage/images-urls.md +48 -0
- aider/website/docs/usage/lint-test.md +118 -0
- aider/website/docs/usage/modes.md +211 -0
- aider/website/docs/usage/not-code.md +179 -0
- aider/website/docs/usage/notifications.md +87 -0
- aider/website/docs/usage/tips.md +79 -0
- aider/website/docs/usage/tutorials.md +30 -0
- aider/website/docs/usage/voice.md +121 -0
- aider/website/docs/usage/watch.md +294 -0
- aider/website/docs/usage.md +92 -0
- aider/website/share/index.md +101 -0
- chatmcp_cli-0.1.0.dist-info/METADATA +502 -0
- chatmcp_cli-0.1.0.dist-info/RECORD +228 -0
- chatmcp_cli-0.1.0.dist-info/WHEEL +5 -0
- chatmcp_cli-0.1.0.dist-info/entry_points.txt +3 -0
- chatmcp_cli-0.1.0.dist-info/licenses/LICENSE.txt +202 -0
- chatmcp_cli-0.1.0.dist-info/top_level.txt +1 -0
aider/linter.py
ADDED
@@ -0,0 +1,304 @@
|
|
1
|
+
import os
|
2
|
+
import re
|
3
|
+
import subprocess
|
4
|
+
import sys
|
5
|
+
import traceback
|
6
|
+
import warnings
|
7
|
+
from dataclasses import dataclass
|
8
|
+
from pathlib import Path
|
9
|
+
|
10
|
+
import oslex
|
11
|
+
from grep_ast import TreeContext, filename_to_lang
|
12
|
+
from grep_ast.tsl import get_parser # noqa: E402
|
13
|
+
|
14
|
+
from aider.dump import dump # noqa: F401
|
15
|
+
from aider.run_cmd import run_cmd_subprocess # noqa: F401
|
16
|
+
|
17
|
+
# tree_sitter is throwing a FutureWarning
|
18
|
+
warnings.simplefilter("ignore", category=FutureWarning)
|
19
|
+
|
20
|
+
|
21
|
+
class Linter:
|
22
|
+
def __init__(self, encoding="utf-8", root=None):
|
23
|
+
self.encoding = encoding
|
24
|
+
self.root = root
|
25
|
+
|
26
|
+
self.languages = dict(
|
27
|
+
python=self.py_lint,
|
28
|
+
)
|
29
|
+
self.all_lint_cmd = None
|
30
|
+
|
31
|
+
def set_linter(self, lang, cmd):
|
32
|
+
if lang:
|
33
|
+
self.languages[lang] = cmd
|
34
|
+
return
|
35
|
+
|
36
|
+
self.all_lint_cmd = cmd
|
37
|
+
|
38
|
+
def get_rel_fname(self, fname):
|
39
|
+
if self.root:
|
40
|
+
try:
|
41
|
+
return os.path.relpath(fname, self.root)
|
42
|
+
except ValueError:
|
43
|
+
return fname
|
44
|
+
else:
|
45
|
+
return fname
|
46
|
+
|
47
|
+
def run_cmd(self, cmd, rel_fname, code):
|
48
|
+
cmd += " " + oslex.quote(rel_fname)
|
49
|
+
|
50
|
+
returncode = 0
|
51
|
+
stdout = ""
|
52
|
+
try:
|
53
|
+
returncode, stdout = run_cmd_subprocess(
|
54
|
+
cmd,
|
55
|
+
cwd=self.root,
|
56
|
+
encoding=self.encoding,
|
57
|
+
)
|
58
|
+
except OSError as err:
|
59
|
+
print(f"Unable to execute lint command: {err}")
|
60
|
+
return
|
61
|
+
errors = stdout
|
62
|
+
if returncode == 0:
|
63
|
+
return # zero exit status
|
64
|
+
|
65
|
+
res = f"## Running: {cmd}\n\n"
|
66
|
+
res += errors
|
67
|
+
|
68
|
+
return self.errors_to_lint_result(rel_fname, res)
|
69
|
+
|
70
|
+
def errors_to_lint_result(self, rel_fname, errors):
|
71
|
+
if not errors:
|
72
|
+
return
|
73
|
+
|
74
|
+
linenums = []
|
75
|
+
filenames_linenums = find_filenames_and_linenums(errors, [rel_fname])
|
76
|
+
if filenames_linenums:
|
77
|
+
filename, linenums = next(iter(filenames_linenums.items()))
|
78
|
+
linenums = [num - 1 for num in linenums]
|
79
|
+
|
80
|
+
return LintResult(text=errors, lines=linenums)
|
81
|
+
|
82
|
+
def lint(self, fname, cmd=None):
|
83
|
+
rel_fname = self.get_rel_fname(fname)
|
84
|
+
try:
|
85
|
+
code = Path(fname).read_text(encoding=self.encoding, errors="replace")
|
86
|
+
except OSError as err:
|
87
|
+
print(f"Unable to read {fname}: {err}")
|
88
|
+
return
|
89
|
+
|
90
|
+
if cmd:
|
91
|
+
cmd = cmd.strip()
|
92
|
+
if not cmd:
|
93
|
+
lang = filename_to_lang(fname)
|
94
|
+
if not lang:
|
95
|
+
return
|
96
|
+
if self.all_lint_cmd:
|
97
|
+
cmd = self.all_lint_cmd
|
98
|
+
else:
|
99
|
+
cmd = self.languages.get(lang)
|
100
|
+
|
101
|
+
if callable(cmd):
|
102
|
+
lintres = cmd(fname, rel_fname, code)
|
103
|
+
elif cmd:
|
104
|
+
lintres = self.run_cmd(cmd, rel_fname, code)
|
105
|
+
else:
|
106
|
+
lintres = basic_lint(rel_fname, code)
|
107
|
+
|
108
|
+
if not lintres:
|
109
|
+
return
|
110
|
+
|
111
|
+
res = "# Fix any errors below, if possible.\n\n"
|
112
|
+
res += lintres.text
|
113
|
+
res += "\n"
|
114
|
+
res += tree_context(rel_fname, code, lintres.lines)
|
115
|
+
|
116
|
+
return res
|
117
|
+
|
118
|
+
def py_lint(self, fname, rel_fname, code):
|
119
|
+
basic_res = basic_lint(rel_fname, code)
|
120
|
+
compile_res = lint_python_compile(fname, code)
|
121
|
+
flake_res = self.flake8_lint(rel_fname)
|
122
|
+
|
123
|
+
text = ""
|
124
|
+
lines = set()
|
125
|
+
for res in [basic_res, compile_res, flake_res]:
|
126
|
+
if not res:
|
127
|
+
continue
|
128
|
+
if text:
|
129
|
+
text += "\n"
|
130
|
+
text += res.text
|
131
|
+
lines.update(res.lines)
|
132
|
+
|
133
|
+
if text or lines:
|
134
|
+
return LintResult(text, lines)
|
135
|
+
|
136
|
+
def flake8_lint(self, rel_fname):
|
137
|
+
fatal = "E9,F821,F823,F831,F406,F407,F701,F702,F704,F706"
|
138
|
+
flake8_cmd = [
|
139
|
+
sys.executable,
|
140
|
+
"-m",
|
141
|
+
"flake8",
|
142
|
+
f"--select={fatal}",
|
143
|
+
"--show-source",
|
144
|
+
"--isolated",
|
145
|
+
rel_fname,
|
146
|
+
]
|
147
|
+
|
148
|
+
text = f"## Running: {' '.join(flake8_cmd)}\n\n"
|
149
|
+
|
150
|
+
try:
|
151
|
+
result = subprocess.run(
|
152
|
+
flake8_cmd,
|
153
|
+
capture_output=True,
|
154
|
+
text=True,
|
155
|
+
check=False,
|
156
|
+
encoding=self.encoding,
|
157
|
+
errors="replace",
|
158
|
+
cwd=self.root,
|
159
|
+
)
|
160
|
+
errors = result.stdout + result.stderr
|
161
|
+
except Exception as e:
|
162
|
+
errors = f"Error running flake8: {str(e)}"
|
163
|
+
|
164
|
+
if not errors:
|
165
|
+
return
|
166
|
+
|
167
|
+
text += errors
|
168
|
+
return self.errors_to_lint_result(rel_fname, text)
|
169
|
+
|
170
|
+
|
171
|
+
@dataclass
|
172
|
+
class LintResult:
|
173
|
+
text: str
|
174
|
+
lines: list
|
175
|
+
|
176
|
+
|
177
|
+
def lint_python_compile(fname, code):
|
178
|
+
try:
|
179
|
+
compile(code, fname, "exec") # USE TRACEBACK BELOW HERE
|
180
|
+
return
|
181
|
+
except Exception as err:
|
182
|
+
end_lineno = getattr(err, "end_lineno", err.lineno)
|
183
|
+
line_numbers = list(range(err.lineno - 1, end_lineno))
|
184
|
+
|
185
|
+
tb_lines = traceback.format_exception(type(err), err, err.__traceback__)
|
186
|
+
last_file_i = 0
|
187
|
+
|
188
|
+
target = "# USE TRACEBACK"
|
189
|
+
target += " BELOW HERE"
|
190
|
+
for i in range(len(tb_lines)):
|
191
|
+
if target in tb_lines[i]:
|
192
|
+
last_file_i = i
|
193
|
+
break
|
194
|
+
|
195
|
+
tb_lines = tb_lines[:1] + tb_lines[last_file_i + 1 :]
|
196
|
+
|
197
|
+
res = "".join(tb_lines)
|
198
|
+
return LintResult(text=res, lines=line_numbers)
|
199
|
+
|
200
|
+
|
201
|
+
def basic_lint(fname, code):
|
202
|
+
"""
|
203
|
+
Use tree-sitter to look for syntax errors, display them with tree context.
|
204
|
+
"""
|
205
|
+
|
206
|
+
lang = filename_to_lang(fname)
|
207
|
+
if not lang:
|
208
|
+
return
|
209
|
+
|
210
|
+
# Tree-sitter linter is not capable of working with typescript #1132
|
211
|
+
if lang == "typescript":
|
212
|
+
return
|
213
|
+
|
214
|
+
try:
|
215
|
+
parser = get_parser(lang)
|
216
|
+
except Exception as err:
|
217
|
+
print(f"Unable to load parser: {err}")
|
218
|
+
return
|
219
|
+
|
220
|
+
tree = parser.parse(bytes(code, "utf-8"))
|
221
|
+
|
222
|
+
try:
|
223
|
+
errors = traverse_tree(tree.root_node)
|
224
|
+
except RecursionError:
|
225
|
+
print(f"Unable to lint {fname} due to RecursionError")
|
226
|
+
return
|
227
|
+
|
228
|
+
if not errors:
|
229
|
+
return
|
230
|
+
|
231
|
+
return LintResult(text="", lines=errors)
|
232
|
+
|
233
|
+
|
234
|
+
def tree_context(fname, code, line_nums):
|
235
|
+
context = TreeContext(
|
236
|
+
fname,
|
237
|
+
code,
|
238
|
+
color=False,
|
239
|
+
line_number=True,
|
240
|
+
child_context=False,
|
241
|
+
last_line=False,
|
242
|
+
margin=0,
|
243
|
+
mark_lois=True,
|
244
|
+
loi_pad=3,
|
245
|
+
# header_max=30,
|
246
|
+
show_top_of_file_parent_scope=False,
|
247
|
+
)
|
248
|
+
line_nums = set(line_nums)
|
249
|
+
context.add_lines_of_interest(line_nums)
|
250
|
+
context.add_context()
|
251
|
+
s = "s" if len(line_nums) > 1 else ""
|
252
|
+
output = f"## See relevant line{s} below marked with █.\n\n"
|
253
|
+
output += fname + ":\n"
|
254
|
+
output += context.format()
|
255
|
+
|
256
|
+
return output
|
257
|
+
|
258
|
+
|
259
|
+
# Traverse the tree to find errors
|
260
|
+
def traverse_tree(node):
|
261
|
+
errors = []
|
262
|
+
if node.type == "ERROR" or node.is_missing:
|
263
|
+
line_no = node.start_point[0]
|
264
|
+
errors.append(line_no)
|
265
|
+
|
266
|
+
for child in node.children:
|
267
|
+
errors += traverse_tree(child)
|
268
|
+
|
269
|
+
return errors
|
270
|
+
|
271
|
+
|
272
|
+
def find_filenames_and_linenums(text, fnames):
|
273
|
+
"""
|
274
|
+
Search text for all occurrences of <filename>:\\d+ and make a list of them
|
275
|
+
where <filename> is one of the filenames in the list `fnames`.
|
276
|
+
"""
|
277
|
+
pattern = re.compile(r"(\b(?:" + "|".join(re.escape(fname) for fname in fnames) + r"):\d+\b)")
|
278
|
+
matches = pattern.findall(text)
|
279
|
+
result = {}
|
280
|
+
for match in matches:
|
281
|
+
fname, linenum = match.rsplit(":", 1)
|
282
|
+
if fname not in result:
|
283
|
+
result[fname] = set()
|
284
|
+
result[fname].add(int(linenum))
|
285
|
+
return result
|
286
|
+
|
287
|
+
|
288
|
+
def main():
|
289
|
+
"""
|
290
|
+
Main function to parse files provided as command line arguments.
|
291
|
+
"""
|
292
|
+
if len(sys.argv) < 2:
|
293
|
+
print("Usage: python linter.py <file1> <file2> ...")
|
294
|
+
sys.exit(1)
|
295
|
+
|
296
|
+
linter = Linter(root=os.getcwd())
|
297
|
+
for file_path in sys.argv[1:]:
|
298
|
+
errors = linter.lint(file_path)
|
299
|
+
if errors:
|
300
|
+
print(errors)
|
301
|
+
|
302
|
+
|
303
|
+
if __name__ == "__main__":
|
304
|
+
main()
|
aider/llm.py
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
import importlib
|
2
|
+
import os
|
3
|
+
import warnings
|
4
|
+
|
5
|
+
from aider.dump import dump # noqa: F401
|
6
|
+
|
7
|
+
warnings.filterwarnings("ignore", category=UserWarning, module="pydantic")
|
8
|
+
|
9
|
+
AIDER_SITE_URL = "https://aider.chat"
|
10
|
+
AIDER_APP_NAME = "Aider"
|
11
|
+
|
12
|
+
os.environ["OR_SITE_URL"] = AIDER_SITE_URL
|
13
|
+
os.environ["OR_APP_NAME"] = AIDER_APP_NAME
|
14
|
+
os.environ["LITELLM_MODE"] = "PRODUCTION"
|
15
|
+
|
16
|
+
# `import litellm` takes 1.5 seconds, defer it!
|
17
|
+
|
18
|
+
VERBOSE = False
|
19
|
+
|
20
|
+
|
21
|
+
class LazyLiteLLM:
|
22
|
+
_lazy_module = None
|
23
|
+
|
24
|
+
def __getattr__(self, name):
|
25
|
+
if name == "_lazy_module":
|
26
|
+
return super()
|
27
|
+
self._load_litellm()
|
28
|
+
return getattr(self._lazy_module, name)
|
29
|
+
|
30
|
+
def _load_litellm(self):
|
31
|
+
if self._lazy_module is not None:
|
32
|
+
return
|
33
|
+
|
34
|
+
if VERBOSE:
|
35
|
+
print("Loading litellm...")
|
36
|
+
|
37
|
+
self._lazy_module = importlib.import_module("litellm")
|
38
|
+
|
39
|
+
self._lazy_module.suppress_debug_info = True
|
40
|
+
self._lazy_module.set_verbose = False
|
41
|
+
self._lazy_module.drop_params = True
|
42
|
+
self._lazy_module._logging._disable_debugging()
|
43
|
+
|
44
|
+
|
45
|
+
litellm = LazyLiteLLM()
|
46
|
+
|
47
|
+
__all__ = [litellm]
|