aider-ce 0.87.6.dev1__py3-none-any.whl → 0.87.7.dev11__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.
Potentially problematic release.
This version of aider-ce might be problematic. Click here for more details.
- aider/__init__.py +1 -1
- aider/_version.py +2 -2
- aider/coders/base_coder.py +57 -9
- aider/commands.py +206 -66
- aider/help.py +1 -1
- aider/io.py +86 -35
- aider/main.py +2 -1
- aider/queries/tree-sitter-languages/julia-tags.scm +60 -0
- aider/repomap.py +32 -0
- aider/scrape.py +1 -1
- {aider_ce-0.87.6.dev1.dist-info → aider_ce-0.87.7.dev11.dist-info}/METADATA +3 -1
- {aider_ce-0.87.6.dev1.dist-info → aider_ce-0.87.7.dev11.dist-info}/RECORD +16 -15
- {aider_ce-0.87.6.dev1.dist-info → aider_ce-0.87.7.dev11.dist-info}/WHEEL +0 -0
- {aider_ce-0.87.6.dev1.dist-info → aider_ce-0.87.7.dev11.dist-info}/entry_points.txt +0 -0
- {aider_ce-0.87.6.dev1.dist-info → aider_ce-0.87.7.dev11.dist-info}/licenses/LICENSE.txt +0 -0
- {aider_ce-0.87.6.dev1.dist-info → aider_ce-0.87.7.dev11.dist-info}/top_level.txt +0 -0
aider/__init__.py
CHANGED
aider/_version.py
CHANGED
|
@@ -28,7 +28,7 @@ version_tuple: VERSION_TUPLE
|
|
|
28
28
|
commit_id: COMMIT_ID
|
|
29
29
|
__commit_id__: COMMIT_ID
|
|
30
30
|
|
|
31
|
-
__version__ = version = '0.87.
|
|
32
|
-
__version_tuple__ = version_tuple = (0, 87,
|
|
31
|
+
__version__ = version = '0.87.7.dev11'
|
|
32
|
+
__version_tuple__ = version_tuple = (0, 87, 7, 'dev11')
|
|
33
33
|
|
|
34
34
|
__commit_id__ = commit_id = None
|
aider/coders/base_coder.py
CHANGED
|
@@ -91,6 +91,7 @@ all_fences = [
|
|
|
91
91
|
class Coder:
|
|
92
92
|
abs_fnames = None
|
|
93
93
|
abs_read_only_fnames = None
|
|
94
|
+
abs_read_only_stubs_fnames = None
|
|
94
95
|
repo = None
|
|
95
96
|
last_aider_commit_hash = None
|
|
96
97
|
aider_edited_files = None
|
|
@@ -184,8 +185,10 @@ class Coder:
|
|
|
184
185
|
# Bring along context from the old Coder
|
|
185
186
|
update = dict(
|
|
186
187
|
fnames=list(from_coder.abs_fnames),
|
|
187
|
-
# Copy read-only files
|
|
188
|
-
|
|
188
|
+
read_only_fnames=list(from_coder.abs_read_only_fnames), # Copy read-only files
|
|
189
|
+
read_only_stubs_fnames=list(
|
|
190
|
+
from_coder.abs_read_only_stubs_fnames
|
|
191
|
+
), # Copy read-only stubs
|
|
189
192
|
done_messages=done_messages,
|
|
190
193
|
cur_messages=from_coder.cur_messages,
|
|
191
194
|
aider_commit_hashes=from_coder.aider_commit_hashes,
|
|
@@ -301,6 +304,10 @@ class Coder:
|
|
|
301
304
|
rel_fname = self.get_rel_fname(fname)
|
|
302
305
|
lines.append(f"Added {rel_fname} to the chat (read-only).")
|
|
303
306
|
|
|
307
|
+
for fname in self.abs_read_only_stubs_fnames:
|
|
308
|
+
rel_fname = self.get_rel_fname(fname)
|
|
309
|
+
lines.append(f"Added {rel_fname} to the chat (read-only stub).")
|
|
310
|
+
|
|
304
311
|
if self.done_messages:
|
|
305
312
|
lines.append("Restored previous conversation history.")
|
|
306
313
|
|
|
@@ -319,6 +326,7 @@ class Coder:
|
|
|
319
326
|
fnames=None,
|
|
320
327
|
add_gitignore_files=False,
|
|
321
328
|
read_only_fnames=None,
|
|
329
|
+
read_only_stubs_fnames=None,
|
|
322
330
|
show_diffs=False,
|
|
323
331
|
auto_commits=True,
|
|
324
332
|
dirty_commits=True,
|
|
@@ -420,6 +428,7 @@ class Coder:
|
|
|
420
428
|
self.abs_fnames = set()
|
|
421
429
|
self.abs_read_only_fnames = set()
|
|
422
430
|
self.add_gitignore_files = add_gitignore_files
|
|
431
|
+
self.abs_read_only_stubs_fnames = set()
|
|
423
432
|
|
|
424
433
|
if cur_messages:
|
|
425
434
|
self.cur_messages = cur_messages
|
|
@@ -513,6 +522,17 @@ class Coder:
|
|
|
513
522
|
else:
|
|
514
523
|
self.io.tool_warning(f"Error: Read-only file {fname} does not exist. Skipping.")
|
|
515
524
|
|
|
525
|
+
if read_only_stubs_fnames:
|
|
526
|
+
self.abs_read_only_stubs_fnames = set()
|
|
527
|
+
for fname in read_only_stubs_fnames:
|
|
528
|
+
abs_fname = self.abs_root_path(fname)
|
|
529
|
+
if os.path.exists(abs_fname):
|
|
530
|
+
self.abs_read_only_stubs_fnames.add(abs_fname)
|
|
531
|
+
else:
|
|
532
|
+
self.io.tool_warning(
|
|
533
|
+
f"Error: Read-only (stub) file {fname} does not exist. Skipping."
|
|
534
|
+
)
|
|
535
|
+
|
|
516
536
|
if map_tokens is None:
|
|
517
537
|
use_repo_map = main_model.use_repo_map
|
|
518
538
|
map_tokens = 1024
|
|
@@ -647,6 +667,10 @@ class Coder:
|
|
|
647
667
|
content = self.io.read_text(_fname)
|
|
648
668
|
if content is not None:
|
|
649
669
|
all_content += content + "\n"
|
|
670
|
+
for _fname in self.abs_read_only_stubs_fnames:
|
|
671
|
+
content = self.io.read_text(_fname)
|
|
672
|
+
if content is not None:
|
|
673
|
+
all_content += content + "\n"
|
|
650
674
|
|
|
651
675
|
lines = all_content.splitlines()
|
|
652
676
|
good = False
|
|
@@ -720,6 +744,7 @@ class Coder:
|
|
|
720
744
|
|
|
721
745
|
def get_read_only_files_content(self):
|
|
722
746
|
prompt = ""
|
|
747
|
+
# Handle regular read-only files
|
|
723
748
|
for fname in self.abs_read_only_fnames:
|
|
724
749
|
content = self.io.read_text(fname)
|
|
725
750
|
if content is not None and not is_image_file(fname):
|
|
@@ -764,6 +789,17 @@ class Coder:
|
|
|
764
789
|
prompt += content
|
|
765
790
|
|
|
766
791
|
prompt += f"{self.fence[1]}\n"
|
|
792
|
+
|
|
793
|
+
# Handle stub files
|
|
794
|
+
for fname in self.abs_read_only_stubs_fnames:
|
|
795
|
+
if not is_image_file(fname):
|
|
796
|
+
relative_fname = self.get_rel_fname(fname)
|
|
797
|
+
prompt += "\n"
|
|
798
|
+
prompt += f"{relative_fname} (stub)"
|
|
799
|
+
prompt += f"\n{self.fence[0]}\n"
|
|
800
|
+
stub = self.get_file_stub(fname)
|
|
801
|
+
prompt += stub
|
|
802
|
+
prompt += f"{self.fence[1]}\n"
|
|
767
803
|
return prompt
|
|
768
804
|
|
|
769
805
|
def get_cur_message_text(self):
|
|
@@ -818,7 +854,10 @@ class Coder:
|
|
|
818
854
|
|
|
819
855
|
all_abs_files = set(self.get_all_abs_files())
|
|
820
856
|
repo_abs_read_only_fnames = set(self.abs_read_only_fnames) & all_abs_files
|
|
821
|
-
|
|
857
|
+
repo_abs_read_only_stubs_fnames = set(self.abs_read_only_stubs_fnames) & all_abs_files
|
|
858
|
+
chat_files = (
|
|
859
|
+
set(self.abs_fnames) | repo_abs_read_only_fnames | repo_abs_read_only_stubs_fnames
|
|
860
|
+
)
|
|
822
861
|
other_files = all_abs_files - chat_files
|
|
823
862
|
|
|
824
863
|
repo_content = self.repo_map.get_repo_map(
|
|
@@ -877,7 +916,9 @@ class Coder:
|
|
|
877
916
|
]
|
|
878
917
|
|
|
879
918
|
# Handle image files
|
|
880
|
-
images_message = self.get_images_message(
|
|
919
|
+
images_message = self.get_images_message(
|
|
920
|
+
list(self.abs_read_only_fnames) + list(self.abs_read_only_stubs_fnames)
|
|
921
|
+
)
|
|
881
922
|
if images_message is not None:
|
|
882
923
|
readonly_messages += [
|
|
883
924
|
images_message,
|
|
@@ -998,15 +1039,17 @@ class Coder:
|
|
|
998
1039
|
|
|
999
1040
|
def get_input(self):
|
|
1000
1041
|
inchat_files = self.get_inchat_relative_files()
|
|
1001
|
-
|
|
1002
|
-
|
|
1042
|
+
all_read_only_fnames = self.abs_read_only_fnames | self.abs_read_only_stubs_fnames
|
|
1043
|
+
all_read_only_files = [self.get_rel_fname(fname) for fname in all_read_only_fnames]
|
|
1044
|
+
all_files = sorted(set(inchat_files + all_read_only_files))
|
|
1003
1045
|
edit_format = "" if self.edit_format == self.main_model.edit_format else self.edit_format
|
|
1004
1046
|
return self.io.get_input(
|
|
1005
1047
|
self.root,
|
|
1006
1048
|
all_files,
|
|
1007
1049
|
self.get_addable_relative_files(),
|
|
1008
1050
|
self.commands,
|
|
1009
|
-
self.abs_read_only_fnames,
|
|
1051
|
+
abs_read_only_fnames=self.abs_read_only_fnames,
|
|
1052
|
+
abs_read_only_stubs_fnames=self.abs_read_only_stubs_fnames,
|
|
1010
1053
|
edit_format=edit_format,
|
|
1011
1054
|
)
|
|
1012
1055
|
|
|
@@ -2220,7 +2263,8 @@ class Coder:
|
|
|
2220
2263
|
|
|
2221
2264
|
# Get basenames of files already in chat or read-only
|
|
2222
2265
|
existing_basenames = {os.path.basename(f) for f in self.get_inchat_relative_files()} | {
|
|
2223
|
-
os.path.basename(self.get_rel_fname(f))
|
|
2266
|
+
os.path.basename(self.get_rel_fname(f))
|
|
2267
|
+
for f in self.abs_read_only_fnames | self.abs_read_only_stubs_fnames
|
|
2224
2268
|
}
|
|
2225
2269
|
|
|
2226
2270
|
mentioned_rel_fnames = set()
|
|
@@ -2639,6 +2683,9 @@ class Coder:
|
|
|
2639
2683
|
|
|
2640
2684
|
return cur + new
|
|
2641
2685
|
|
|
2686
|
+
def get_file_stub(self, fname):
|
|
2687
|
+
return RepoMap.get_file_stub(fname, self.io)
|
|
2688
|
+
|
|
2642
2689
|
def get_rel_fname(self, fname):
|
|
2643
2690
|
try:
|
|
2644
2691
|
return os.path.relpath(fname, self.root)
|
|
@@ -2675,7 +2722,8 @@ class Coder:
|
|
|
2675
2722
|
all_files = set(self.get_all_relative_files())
|
|
2676
2723
|
inchat_files = set(self.get_inchat_relative_files())
|
|
2677
2724
|
read_only_files = set(self.get_rel_fname(fname) for fname in self.abs_read_only_fnames)
|
|
2678
|
-
|
|
2725
|
+
stub_files = set(self.get_rel_fname(fname) for fname in self.abs_read_only_stubs_fnames)
|
|
2726
|
+
return all_files - inchat_files - read_only_files - stub_files
|
|
2679
2727
|
|
|
2680
2728
|
def check_for_dirty_commit(self, path):
|
|
2681
2729
|
if not self.repo:
|
aider/commands.py
CHANGED
|
@@ -416,6 +416,7 @@ class Commands:
|
|
|
416
416
|
|
|
417
417
|
def _drop_all_files(self):
|
|
418
418
|
self.coder.abs_fnames = set()
|
|
419
|
+
self.coder.abs_read_only_stubs_fnames = set()
|
|
419
420
|
|
|
420
421
|
# When dropping all files, keep those that were originally provided via args.read
|
|
421
422
|
if self.original_read_only_fnames:
|
|
@@ -553,6 +554,15 @@ class Commands:
|
|
|
553
554
|
file_res.sort()
|
|
554
555
|
res.extend(file_res)
|
|
555
556
|
|
|
557
|
+
# stub files
|
|
558
|
+
for fname in self.coder.abs_read_only_stubs_fnames:
|
|
559
|
+
relative_fname = self.coder.get_rel_fname(fname)
|
|
560
|
+
if not is_image_file(relative_fname):
|
|
561
|
+
stub = self.coder.get_file_stub(fname)
|
|
562
|
+
content = f"{relative_fname} (stub)\n{fence}\n" + stub + "{fence}\n"
|
|
563
|
+
tokens = self.coder.main_model.token_count(content)
|
|
564
|
+
res.append((tokens, f"{relative_fname} (read-only stub)", "/drop to remove"))
|
|
565
|
+
|
|
556
566
|
self.io.tool_output(
|
|
557
567
|
f"Approximate context window usage for {self.coder.main_model.name}, in tokens:"
|
|
558
568
|
)
|
|
@@ -747,6 +757,9 @@ class Commands:
|
|
|
747
757
|
fname = f'"{fname}"'
|
|
748
758
|
return fname
|
|
749
759
|
|
|
760
|
+
def completions_raw_read_only_stub(self, document, complete_event):
|
|
761
|
+
return self.completions_raw_read_only(document, complete_event)
|
|
762
|
+
|
|
750
763
|
def completions_raw_read_only(self, document, complete_event):
|
|
751
764
|
# Get the text before the cursor
|
|
752
765
|
text = document.text_before_cursor
|
|
@@ -923,6 +936,17 @@ class Commands:
|
|
|
923
936
|
if abs_file_path in self.coder.abs_fnames:
|
|
924
937
|
self.io.tool_error(f"{matched_file} is already in the chat as an editable file")
|
|
925
938
|
continue
|
|
939
|
+
elif abs_file_path in self.coder.abs_read_only_stubs_fnames:
|
|
940
|
+
if self.coder.repo and self.coder.repo.path_in_repo(matched_file):
|
|
941
|
+
self.coder.abs_read_only_stubs_fnames.remove(abs_file_path)
|
|
942
|
+
self.coder.abs_fnames.add(abs_file_path)
|
|
943
|
+
self.io.tool_output(
|
|
944
|
+
f"Moved {matched_file} from read-only (stub) to editable files in the chat"
|
|
945
|
+
)
|
|
946
|
+
else:
|
|
947
|
+
self.io.tool_error(
|
|
948
|
+
f"Cannot add {matched_file} as it's not part of the repository"
|
|
949
|
+
)
|
|
926
950
|
elif abs_file_path in self.coder.abs_read_only_fnames:
|
|
927
951
|
if self.coder.repo and self.coder.repo.path_in_repo(matched_file):
|
|
928
952
|
self.coder.abs_read_only_fnames.remove(abs_file_path)
|
|
@@ -962,7 +986,10 @@ class Commands:
|
|
|
962
986
|
|
|
963
987
|
def completions_drop(self):
|
|
964
988
|
files = self.coder.get_inchat_relative_files()
|
|
965
|
-
read_only_files = [
|
|
989
|
+
read_only_files = [
|
|
990
|
+
self.coder.get_rel_fname(fn)
|
|
991
|
+
for fn in self.coder.abs_read_only_fnames | self.coder.abs_read_only_stubs_fnames
|
|
992
|
+
]
|
|
966
993
|
all_files = files + read_only_files
|
|
967
994
|
all_files = [self.quote_fname(fn) for fn in all_files]
|
|
968
995
|
return all_files
|
|
@@ -989,6 +1016,26 @@ class Commands:
|
|
|
989
1016
|
"Symbol Outline",
|
|
990
1017
|
]
|
|
991
1018
|
|
|
1019
|
+
def _handle_read_only_files(self, expanded_word, file_set, description=""):
|
|
1020
|
+
"""Handle read-only files with substring matching and samefile check"""
|
|
1021
|
+
matched = []
|
|
1022
|
+
for f in file_set:
|
|
1023
|
+
if expanded_word in f:
|
|
1024
|
+
matched.append(f)
|
|
1025
|
+
continue
|
|
1026
|
+
|
|
1027
|
+
# Try samefile comparison for relative paths
|
|
1028
|
+
try:
|
|
1029
|
+
abs_word = os.path.abspath(expanded_word)
|
|
1030
|
+
if os.path.samefile(abs_word, f):
|
|
1031
|
+
matched.append(f)
|
|
1032
|
+
except (FileNotFoundError, OSError):
|
|
1033
|
+
continue
|
|
1034
|
+
|
|
1035
|
+
for matched_file in matched:
|
|
1036
|
+
file_set.remove(matched_file)
|
|
1037
|
+
self.io.tool_output(f"Removed {description} file {matched_file} from the chat")
|
|
1038
|
+
|
|
992
1039
|
def cmd_drop(self, args=""):
|
|
993
1040
|
"Remove files from the chat session to free up context space"
|
|
994
1041
|
|
|
@@ -1014,25 +1061,13 @@ class Commands:
|
|
|
1014
1061
|
# Expand tilde in the path
|
|
1015
1062
|
expanded_word = os.path.expanduser(word)
|
|
1016
1063
|
|
|
1017
|
-
# Handle read-only files
|
|
1018
|
-
|
|
1019
|
-
|
|
1020
|
-
|
|
1021
|
-
|
|
1022
|
-
|
|
1023
|
-
|
|
1024
|
-
# Try samefile comparison for relative paths
|
|
1025
|
-
try:
|
|
1026
|
-
abs_word = os.path.abspath(expanded_word)
|
|
1027
|
-
if os.path.samefile(abs_word, f):
|
|
1028
|
-
read_only_matched.append(f)
|
|
1029
|
-
except (FileNotFoundError, OSError):
|
|
1030
|
-
continue
|
|
1031
|
-
|
|
1032
|
-
for matched_file in read_only_matched:
|
|
1033
|
-
self.coder.abs_read_only_fnames.remove(matched_file)
|
|
1034
|
-
self.io.tool_output(f"Removed read-only file {matched_file} from the chat")
|
|
1035
|
-
files_changed = True
|
|
1064
|
+
# Handle read-only files
|
|
1065
|
+
self._handle_read_only_files(
|
|
1066
|
+
expanded_word, self.coder.abs_read_only_fnames, "read-only"
|
|
1067
|
+
)
|
|
1068
|
+
self._handle_read_only_files(
|
|
1069
|
+
expanded_word, self.coder.abs_read_only_stubs_fnames, "read-only (stub)"
|
|
1070
|
+
)
|
|
1036
1071
|
|
|
1037
1072
|
# For editable files, use glob if word contains glob chars, otherwise use substring
|
|
1038
1073
|
if any(c in expanded_word for c in "*?[]"):
|
|
@@ -1269,6 +1304,7 @@ class Commands:
|
|
|
1269
1304
|
other_files = []
|
|
1270
1305
|
chat_files = []
|
|
1271
1306
|
read_only_files = []
|
|
1307
|
+
read_only_stub_files = []
|
|
1272
1308
|
for file in files:
|
|
1273
1309
|
abs_file_path = self.coder.abs_root_path(file)
|
|
1274
1310
|
if abs_file_path in self.coder.abs_fnames:
|
|
@@ -1281,7 +1317,12 @@ class Commands:
|
|
|
1281
1317
|
rel_file_path = self.coder.get_rel_fname(abs_file_path)
|
|
1282
1318
|
read_only_files.append(rel_file_path)
|
|
1283
1319
|
|
|
1284
|
-
|
|
1320
|
+
# Add read-only stub files
|
|
1321
|
+
for abs_file_path in self.coder.abs_read_only_stubs_fnames:
|
|
1322
|
+
rel_file_path = self.coder.get_rel_fname(abs_file_path)
|
|
1323
|
+
read_only_stub_files.append(rel_file_path)
|
|
1324
|
+
|
|
1325
|
+
if not chat_files and not other_files and not read_only_files and not read_only_stub_files:
|
|
1285
1326
|
self.io.tool_output("\nNo files in chat, git repo, or read-only list.")
|
|
1286
1327
|
return
|
|
1287
1328
|
|
|
@@ -1290,10 +1331,13 @@ class Commands:
|
|
|
1290
1331
|
for file in other_files:
|
|
1291
1332
|
self.io.tool_output(f" {file}")
|
|
1292
1333
|
|
|
1293
|
-
|
|
1334
|
+
# Read-only files:
|
|
1335
|
+
if read_only_files or read_only_stub_files:
|
|
1294
1336
|
self.io.tool_output("\nRead-only files:\n")
|
|
1295
1337
|
for file in read_only_files:
|
|
1296
1338
|
self.io.tool_output(f" {file}")
|
|
1339
|
+
for file in read_only_stub_files:
|
|
1340
|
+
self.io.tool_output(f" {file} (stub)")
|
|
1297
1341
|
|
|
1298
1342
|
if chat_files:
|
|
1299
1343
|
self.io.tool_output("\nFiles in chat:\n")
|
|
@@ -1530,38 +1574,26 @@ class Commands:
|
|
|
1530
1574
|
except Exception as e:
|
|
1531
1575
|
self.io.tool_error(f"Error processing clipboard content: {e}")
|
|
1532
1576
|
|
|
1533
|
-
def
|
|
1534
|
-
"""
|
|
1535
|
-
With no args, opens a fuzzy finder to select files from the repo.
|
|
1536
|
-
If no files are selected, converts all editable files in chat to read-only.
|
|
1537
|
-
"""
|
|
1577
|
+
def _cmd_read_only_base(self, args, source_set, target_set, source_mode, target_mode):
|
|
1578
|
+
"""Base implementation for read-only and read-only-stub commands"""
|
|
1538
1579
|
if not args.strip():
|
|
1539
|
-
|
|
1540
|
-
|
|
1541
|
-
|
|
1542
|
-
|
|
1543
|
-
|
|
1544
|
-
|
|
1545
|
-
|
|
1546
|
-
|
|
1547
|
-
|
|
1548
|
-
|
|
1549
|
-
|
|
1550
|
-
|
|
1551
|
-
|
|
1552
|
-
|
|
1553
|
-
|
|
1554
|
-
|
|
1555
|
-
|
|
1556
|
-
self.coder.abs_fnames.remove(fname)
|
|
1557
|
-
self.coder.abs_read_only_fnames.add(fname)
|
|
1558
|
-
rel_fname = self.coder.get_rel_fname(fname)
|
|
1559
|
-
self.io.tool_output(f"Converted {rel_fname} to read-only")
|
|
1560
|
-
else:
|
|
1561
|
-
self.io.tool_output("No files selected.")
|
|
1562
|
-
return
|
|
1563
|
-
|
|
1564
|
-
args = " ".join([self.quote_fname(f) for f in selected_files])
|
|
1580
|
+
# Handle editable files
|
|
1581
|
+
for fname in list(self.coder.abs_fnames):
|
|
1582
|
+
self.coder.abs_fnames.remove(fname)
|
|
1583
|
+
target_set.add(fname)
|
|
1584
|
+
rel_fname = self.coder.get_rel_fname(fname)
|
|
1585
|
+
self.io.tool_output(f"Converted {rel_fname} from editable to {target_mode}")
|
|
1586
|
+
|
|
1587
|
+
# Handle source set files if provided
|
|
1588
|
+
if source_set:
|
|
1589
|
+
for fname in list(source_set):
|
|
1590
|
+
source_set.remove(fname)
|
|
1591
|
+
target_set.add(fname)
|
|
1592
|
+
rel_fname = self.coder.get_rel_fname(fname)
|
|
1593
|
+
self.io.tool_output(
|
|
1594
|
+
f"Converted {rel_fname} from {source_mode} to {target_mode}"
|
|
1595
|
+
)
|
|
1596
|
+
return
|
|
1565
1597
|
|
|
1566
1598
|
filenames = parse_quoted_filenames(args)
|
|
1567
1599
|
all_paths = []
|
|
@@ -1596,13 +1628,28 @@ class Commands:
|
|
|
1596
1628
|
for path in sorted(all_paths):
|
|
1597
1629
|
abs_path = self.coder.abs_root_path(path)
|
|
1598
1630
|
if os.path.isfile(abs_path):
|
|
1599
|
-
self._add_read_only_file(
|
|
1631
|
+
self._add_read_only_file(
|
|
1632
|
+
abs_path,
|
|
1633
|
+
path,
|
|
1634
|
+
target_set,
|
|
1635
|
+
source_set,
|
|
1636
|
+
source_mode=source_mode,
|
|
1637
|
+
target_mode=target_mode,
|
|
1638
|
+
)
|
|
1600
1639
|
elif os.path.isdir(abs_path):
|
|
1601
|
-
self._add_read_only_directory(abs_path, path)
|
|
1640
|
+
self._add_read_only_directory(abs_path, path, source_set, target_set, target_mode)
|
|
1602
1641
|
else:
|
|
1603
1642
|
self.io.tool_error(f"Not a file or directory: {abs_path}")
|
|
1604
1643
|
|
|
1605
|
-
def _add_read_only_file(
|
|
1644
|
+
def _add_read_only_file(
|
|
1645
|
+
self,
|
|
1646
|
+
abs_path,
|
|
1647
|
+
original_name,
|
|
1648
|
+
target_set,
|
|
1649
|
+
source_set,
|
|
1650
|
+
source_mode="read-only",
|
|
1651
|
+
target_mode="read-only",
|
|
1652
|
+
):
|
|
1606
1653
|
if is_image_file(original_name) and not self.coder.main_model.info.get("supports_vision"):
|
|
1607
1654
|
self.io.tool_error(
|
|
1608
1655
|
f"Cannot add image file {original_name} as the"
|
|
@@ -1610,38 +1657,123 @@ class Commands:
|
|
|
1610
1657
|
)
|
|
1611
1658
|
return
|
|
1612
1659
|
|
|
1613
|
-
if abs_path in
|
|
1614
|
-
self.io.tool_error(f"{original_name} is already in the chat as a
|
|
1660
|
+
if abs_path in target_set:
|
|
1661
|
+
self.io.tool_error(f"{original_name} is already in the chat as a {target_mode} file")
|
|
1615
1662
|
return
|
|
1616
1663
|
elif abs_path in self.coder.abs_fnames:
|
|
1617
1664
|
self.coder.abs_fnames.remove(abs_path)
|
|
1618
|
-
|
|
1665
|
+
target_set.add(abs_path)
|
|
1666
|
+
self.io.tool_output(
|
|
1667
|
+
f"Moved {original_name} from editable to {target_mode} files in the chat"
|
|
1668
|
+
)
|
|
1669
|
+
elif source_set and abs_path in source_set:
|
|
1670
|
+
source_set.remove(abs_path)
|
|
1671
|
+
target_set.add(abs_path)
|
|
1619
1672
|
self.io.tool_output(
|
|
1620
|
-
f"Moved {original_name} from
|
|
1673
|
+
f"Moved {original_name} from {source_mode} to {target_mode} files in the chat"
|
|
1621
1674
|
)
|
|
1622
1675
|
else:
|
|
1623
|
-
|
|
1624
|
-
self.io.tool_output(f"Added {original_name} to
|
|
1676
|
+
target_set.add(abs_path)
|
|
1677
|
+
self.io.tool_output(f"Added {original_name} to {target_mode} files.")
|
|
1625
1678
|
|
|
1626
|
-
def _add_read_only_directory(
|
|
1679
|
+
def _add_read_only_directory(
|
|
1680
|
+
self, abs_path, original_name, source_set, target_set, target_mode
|
|
1681
|
+
):
|
|
1627
1682
|
added_files = 0
|
|
1628
1683
|
for root, _, files in os.walk(abs_path):
|
|
1629
1684
|
for file in files:
|
|
1630
1685
|
file_path = os.path.join(root, file)
|
|
1631
1686
|
if (
|
|
1632
1687
|
file_path not in self.coder.abs_fnames
|
|
1633
|
-
and file_path not in
|
|
1688
|
+
and file_path not in target_set
|
|
1689
|
+
and (source_set is None or file_path not in source_set)
|
|
1634
1690
|
):
|
|
1635
|
-
|
|
1691
|
+
target_set.add(file_path)
|
|
1636
1692
|
added_files += 1
|
|
1637
1693
|
|
|
1638
1694
|
if added_files > 0:
|
|
1639
1695
|
self.io.tool_output(
|
|
1640
|
-
f"Added {added_files} files from directory {original_name} to
|
|
1696
|
+
f"Added {added_files} files from directory {original_name} to {target_mode} files."
|
|
1641
1697
|
)
|
|
1642
1698
|
else:
|
|
1643
1699
|
self.io.tool_output(f"No new files added from directory {original_name}.")
|
|
1644
1700
|
|
|
1701
|
+
def cmd_read_only(self, args):
|
|
1702
|
+
"Add files to the chat that are for reference only, or turn added files to read-only"
|
|
1703
|
+
if not args.strip():
|
|
1704
|
+
# If no args provided, use fuzzy finder to select files to add as read-only
|
|
1705
|
+
all_files = self.coder.get_all_relative_files()
|
|
1706
|
+
files_in_chat = self.coder.get_inchat_relative_files()
|
|
1707
|
+
addable_files = sorted(set(all_files) - set(files_in_chat))
|
|
1708
|
+
if not addable_files:
|
|
1709
|
+
# If no files available to add, convert all editable files to read-only
|
|
1710
|
+
self._cmd_read_only_base(
|
|
1711
|
+
"",
|
|
1712
|
+
source_set=self.coder.abs_read_only_stubs_fnames,
|
|
1713
|
+
target_set=self.coder.abs_read_only_fnames,
|
|
1714
|
+
source_mode="read-only (stub)",
|
|
1715
|
+
target_mode="read-only",
|
|
1716
|
+
)
|
|
1717
|
+
return
|
|
1718
|
+
selected_files = run_fzf(addable_files, multi=True)
|
|
1719
|
+
if not selected_files:
|
|
1720
|
+
# If user didn't select any files, convert all editable files to read-only
|
|
1721
|
+
self._cmd_read_only_base(
|
|
1722
|
+
"",
|
|
1723
|
+
source_set=self.coder.abs_read_only_stubs_fnames,
|
|
1724
|
+
target_set=self.coder.abs_read_only_fnames,
|
|
1725
|
+
source_mode="read-only (stub)",
|
|
1726
|
+
target_mode="read-only",
|
|
1727
|
+
)
|
|
1728
|
+
return
|
|
1729
|
+
args = " ".join([self.quote_fname(f) for f in selected_files])
|
|
1730
|
+
|
|
1731
|
+
self._cmd_read_only_base(
|
|
1732
|
+
args,
|
|
1733
|
+
source_set=self.coder.abs_read_only_stubs_fnames,
|
|
1734
|
+
target_set=self.coder.abs_read_only_fnames,
|
|
1735
|
+
source_mode="read-only (stub)",
|
|
1736
|
+
target_mode="read-only",
|
|
1737
|
+
)
|
|
1738
|
+
|
|
1739
|
+
def cmd_read_only_stub(self, args):
|
|
1740
|
+
"Add files to the chat as read-only stubs, or turn added files to read-only (stubs)"
|
|
1741
|
+
if not args.strip():
|
|
1742
|
+
# If no args provided, use fuzzy finder to select files to add as read-only stubs
|
|
1743
|
+
all_files = self.coder.get_all_relative_files()
|
|
1744
|
+
files_in_chat = self.coder.get_inchat_relative_files()
|
|
1745
|
+
addable_files = sorted(set(all_files) - set(files_in_chat))
|
|
1746
|
+
if not addable_files:
|
|
1747
|
+
# If no files available to add, convert all editable files to read-only stubs
|
|
1748
|
+
self._cmd_read_only_base(
|
|
1749
|
+
"",
|
|
1750
|
+
source_set=self.coder.abs_read_only_fnames,
|
|
1751
|
+
target_set=self.coder.abs_read_only_stubs_fnames,
|
|
1752
|
+
source_mode="read-only",
|
|
1753
|
+
target_mode="read-only (stub)",
|
|
1754
|
+
)
|
|
1755
|
+
return
|
|
1756
|
+
selected_files = run_fzf(addable_files, multi=True)
|
|
1757
|
+
if not selected_files:
|
|
1758
|
+
# If user didn't select any files, convert all editable files to read-only stubs
|
|
1759
|
+
self._cmd_read_only_base(
|
|
1760
|
+
"",
|
|
1761
|
+
source_set=self.coder.abs_read_only_fnames,
|
|
1762
|
+
target_set=self.coder.abs_read_only_stubs_fnames,
|
|
1763
|
+
source_mode="read-only",
|
|
1764
|
+
target_mode="read-only (stub)",
|
|
1765
|
+
)
|
|
1766
|
+
return
|
|
1767
|
+
args = " ".join([self.quote_fname(f) for f in selected_files])
|
|
1768
|
+
|
|
1769
|
+
self._cmd_read_only_base(
|
|
1770
|
+
args,
|
|
1771
|
+
source_set=self.coder.abs_read_only_fnames,
|
|
1772
|
+
target_set=self.coder.abs_read_only_stubs_fnames,
|
|
1773
|
+
source_mode="read-only",
|
|
1774
|
+
target_mode="read-only (stub)",
|
|
1775
|
+
)
|
|
1776
|
+
|
|
1645
1777
|
def cmd_map(self, args):
|
|
1646
1778
|
"Print out the current repository map"
|
|
1647
1779
|
repo_map = self.coder.get_repo_map()
|
|
@@ -1743,6 +1875,14 @@ class Commands:
|
|
|
1743
1875
|
f.write(f"/read-only {rel_fname}\n")
|
|
1744
1876
|
else:
|
|
1745
1877
|
f.write(f"/read-only {fname}\n")
|
|
1878
|
+
# Write commands to add read-only stubs files
|
|
1879
|
+
for fname in sorted(self.coder.abs_read_only_stubs_fnames):
|
|
1880
|
+
# Use absolute path for files outside repo root, relative path for files inside
|
|
1881
|
+
if Path(fname).is_relative_to(self.coder.root):
|
|
1882
|
+
rel_fname = self.coder.get_rel_fname(fname)
|
|
1883
|
+
f.write(f"/read-only-stub {rel_fname}\n")
|
|
1884
|
+
else:
|
|
1885
|
+
f.write(f"/read-only-stub {fname}\n")
|
|
1746
1886
|
|
|
1747
1887
|
self.io.tool_output(f"Saved commands to {args.strip()}")
|
|
1748
1888
|
except Exception as e:
|
aider/help.py
CHANGED
aider/io.py
CHANGED
|
@@ -71,6 +71,31 @@ def restore_multiline(func):
|
|
|
71
71
|
return wrapper
|
|
72
72
|
|
|
73
73
|
|
|
74
|
+
def without_input_history(func):
|
|
75
|
+
"""Decorator to temporarily disable history saving for the prompt session buffer."""
|
|
76
|
+
|
|
77
|
+
@functools.wraps(func)
|
|
78
|
+
def wrapper(self, *args, **kwargs):
|
|
79
|
+
orig_buf_append = None
|
|
80
|
+
try:
|
|
81
|
+
orig_buf_append = self.prompt_session.default_buffer.append_to_history
|
|
82
|
+
self.prompt_session.default_buffer.append_to_history = (
|
|
83
|
+
lambda: None
|
|
84
|
+
) # Replace with no-op
|
|
85
|
+
except AttributeError:
|
|
86
|
+
pass
|
|
87
|
+
|
|
88
|
+
try:
|
|
89
|
+
return func(self, *args, **kwargs)
|
|
90
|
+
except Exception:
|
|
91
|
+
raise
|
|
92
|
+
finally:
|
|
93
|
+
if orig_buf_append:
|
|
94
|
+
self.prompt_session.default_buffer.append_to_history = orig_buf_append
|
|
95
|
+
|
|
96
|
+
return wrapper
|
|
97
|
+
|
|
98
|
+
|
|
74
99
|
class CommandCompletionException(Exception):
|
|
75
100
|
"""Raised when a command should use the normal autocompleter instead of
|
|
76
101
|
command-specific completion."""
|
|
@@ -554,6 +579,7 @@ class InputOutput:
|
|
|
554
579
|
addable_rel_fnames,
|
|
555
580
|
commands,
|
|
556
581
|
abs_read_only_fnames=None,
|
|
582
|
+
abs_read_only_stubs_fnames=None,
|
|
557
583
|
edit_format=None,
|
|
558
584
|
):
|
|
559
585
|
self.rule()
|
|
@@ -567,9 +593,15 @@ class InputOutput:
|
|
|
567
593
|
rel_read_only_fnames = [
|
|
568
594
|
get_rel_fname(fname, root) for fname in (abs_read_only_fnames or [])
|
|
569
595
|
]
|
|
570
|
-
|
|
596
|
+
rel_read_only_stubs_fnames = [
|
|
597
|
+
get_rel_fname(fname, root) for fname in (abs_read_only_stubs_fnames or [])
|
|
598
|
+
]
|
|
599
|
+
show = self.format_files_for_input(
|
|
600
|
+
rel_fnames, rel_read_only_fnames, rel_read_only_stubs_fnames
|
|
601
|
+
)
|
|
571
602
|
|
|
572
603
|
prompt_prefix = ""
|
|
604
|
+
|
|
573
605
|
if edit_format:
|
|
574
606
|
prompt_prefix += edit_format
|
|
575
607
|
if self.multiline_mode:
|
|
@@ -591,7 +623,8 @@ class InputOutput:
|
|
|
591
623
|
addable_rel_fnames,
|
|
592
624
|
commands,
|
|
593
625
|
self.encoding,
|
|
594
|
-
abs_read_only_fnames=abs_read_only_fnames
|
|
626
|
+
abs_read_only_fnames=(abs_read_only_fnames or set())
|
|
627
|
+
| (abs_read_only_stubs_fnames or set()),
|
|
595
628
|
)
|
|
596
629
|
)
|
|
597
630
|
|
|
@@ -853,6 +886,7 @@ class InputOutput:
|
|
|
853
886
|
return False
|
|
854
887
|
|
|
855
888
|
@restore_multiline
|
|
889
|
+
@without_input_history
|
|
856
890
|
def confirm_ask(
|
|
857
891
|
self,
|
|
858
892
|
question,
|
|
@@ -1186,67 +1220,84 @@ class InputOutput:
|
|
|
1186
1220
|
print(err)
|
|
1187
1221
|
self.chat_history_file = None # Disable further attempts to write
|
|
1188
1222
|
|
|
1189
|
-
def format_files_for_input(self, rel_fnames, rel_read_only_fnames):
|
|
1223
|
+
def format_files_for_input(self, rel_fnames, rel_read_only_fnames, rel_read_only_stubs_fnames):
|
|
1190
1224
|
# Optimization for large number of files
|
|
1191
|
-
total_files =
|
|
1225
|
+
total_files = (
|
|
1226
|
+
len(rel_fnames)
|
|
1227
|
+
+ len(rel_read_only_fnames or [])
|
|
1228
|
+
+ len(rel_read_only_stubs_fnames or [])
|
|
1229
|
+
)
|
|
1192
1230
|
|
|
1193
1231
|
# For very large numbers of files, use a summary display
|
|
1194
1232
|
if total_files > 50:
|
|
1195
1233
|
read_only_count = len(rel_read_only_fnames or [])
|
|
1234
|
+
stub_file_count = len(rel_read_only_stubs_fnames or [])
|
|
1196
1235
|
editable_count = len([f for f in rel_fnames if f not in (rel_read_only_fnames or [])])
|
|
1197
1236
|
|
|
1198
1237
|
summary = f"{editable_count} editable file(s)"
|
|
1199
1238
|
if read_only_count > 0:
|
|
1200
1239
|
summary += f", {read_only_count} read-only file(s)"
|
|
1240
|
+
if stub_file_count > 0:
|
|
1241
|
+
summary += f", {stub_file_count} stub file(s)"
|
|
1201
1242
|
summary += " (use /ls to list all files)\n"
|
|
1202
1243
|
return summary
|
|
1203
1244
|
|
|
1204
1245
|
# Original implementation for reasonable number of files
|
|
1205
1246
|
if not self.pretty:
|
|
1206
|
-
|
|
1207
|
-
|
|
1208
|
-
|
|
1209
|
-
|
|
1210
|
-
|
|
1211
|
-
for
|
|
1212
|
-
|
|
1213
|
-
|
|
1214
|
-
|
|
1215
|
-
|
|
1216
|
-
|
|
1247
|
+
lines = []
|
|
1248
|
+
# Handle regular read-only files
|
|
1249
|
+
for fname in sorted(rel_read_only_fnames or []):
|
|
1250
|
+
lines.append(f"{fname} (read only)")
|
|
1251
|
+
# Handle stub files separately
|
|
1252
|
+
for fname in sorted(rel_read_only_stubs_fnames or []):
|
|
1253
|
+
lines.append(f"{fname} (read only stub)")
|
|
1254
|
+
# Handle editable files
|
|
1255
|
+
for fname in sorted(rel_fnames):
|
|
1256
|
+
if fname not in rel_read_only_fnames and fname not in rel_read_only_stubs_fnames:
|
|
1257
|
+
lines.append(fname)
|
|
1258
|
+
return "\n".join(lines) + "\n"
|
|
1217
1259
|
|
|
1218
1260
|
output = StringIO()
|
|
1219
1261
|
console = Console(file=output, force_terminal=False)
|
|
1220
1262
|
|
|
1221
|
-
|
|
1222
|
-
|
|
1223
|
-
|
|
1224
|
-
if read_only_files:
|
|
1225
|
-
# Use shorter of abs/rel paths for readonly files
|
|
1263
|
+
# Handle read-only files
|
|
1264
|
+
if rel_read_only_fnames or rel_read_only_stubs_fnames:
|
|
1226
1265
|
ro_paths = []
|
|
1227
|
-
|
|
1266
|
+
# Regular read-only files
|
|
1267
|
+
for rel_path in sorted(rel_read_only_fnames or []):
|
|
1228
1268
|
abs_path = os.path.abspath(os.path.join(self.root, rel_path))
|
|
1229
|
-
ro_paths.append(
|
|
1230
|
-
|
|
1231
|
-
|
|
1232
|
-
|
|
1233
|
-
|
|
1234
|
-
|
|
1235
|
-
|
|
1236
|
-
|
|
1269
|
+
ro_paths.append(abs_path if len(abs_path) < len(rel_path) else rel_path)
|
|
1270
|
+
# Stub files with (stub) marker
|
|
1271
|
+
for rel_path in sorted(rel_read_only_stubs_fnames or []):
|
|
1272
|
+
abs_path = os.path.abspath(os.path.join(self.root, rel_path))
|
|
1273
|
+
path = abs_path if len(abs_path) < len(rel_path) else rel_path
|
|
1274
|
+
ro_paths.append(f"{path} (stub)")
|
|
1275
|
+
|
|
1276
|
+
if ro_paths:
|
|
1277
|
+
files_with_label = ["Readonly:"] + ro_paths
|
|
1278
|
+
read_only_output = StringIO()
|
|
1279
|
+
Console(file=read_only_output, force_terminal=False).print(
|
|
1280
|
+
Columns(files_with_label)
|
|
1281
|
+
)
|
|
1282
|
+
read_only_lines = read_only_output.getvalue().splitlines()
|
|
1283
|
+
console.print(Columns(files_with_label))
|
|
1284
|
+
|
|
1285
|
+
# Handle editable files
|
|
1286
|
+
editable_files = [
|
|
1287
|
+
f
|
|
1288
|
+
for f in sorted(rel_fnames)
|
|
1289
|
+
if f not in rel_read_only_fnames and f not in rel_read_only_stubs_fnames
|
|
1290
|
+
]
|
|
1237
1291
|
if editable_files:
|
|
1238
|
-
|
|
1239
|
-
|
|
1240
|
-
|
|
1241
|
-
files_with_label = [Text("Editable:")] + text_editable_files
|
|
1292
|
+
files_with_label = editable_files
|
|
1293
|
+
if rel_read_only_fnames or rel_read_only_stubs_fnames:
|
|
1294
|
+
files_with_label = ["Editable:"] + editable_files
|
|
1242
1295
|
editable_output = StringIO()
|
|
1243
1296
|
Console(file=editable_output, force_terminal=False).print(Columns(files_with_label))
|
|
1244
1297
|
editable_lines = editable_output.getvalue().splitlines()
|
|
1245
|
-
|
|
1246
1298
|
if len(read_only_lines) > 1 or len(editable_lines) > 1:
|
|
1247
1299
|
console.print()
|
|
1248
1300
|
console.print(Columns(files_with_label))
|
|
1249
|
-
|
|
1250
1301
|
return output.getvalue()
|
|
1251
1302
|
|
|
1252
1303
|
|
aider/main.py
CHANGED
|
@@ -211,7 +211,7 @@ def check_streamlit_install(io):
|
|
|
211
211
|
io,
|
|
212
212
|
"streamlit",
|
|
213
213
|
"You need to install the aider browser feature",
|
|
214
|
-
["aider-
|
|
214
|
+
["aider-ce[browser]"],
|
|
215
215
|
)
|
|
216
216
|
|
|
217
217
|
|
|
@@ -991,6 +991,7 @@ def main(argv=None, input=None, output=None, force_git_root=None, return_coder=F
|
|
|
991
991
|
repo=repo,
|
|
992
992
|
fnames=fnames,
|
|
993
993
|
read_only_fnames=read_only_fnames,
|
|
994
|
+
read_only_stubs_fnames=[],
|
|
994
995
|
show_diffs=args.show_diffs,
|
|
995
996
|
auto_commits=args.auto_commits,
|
|
996
997
|
dirty_commits=args.dirty_commits,
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
;; derived from: https://github.com/tree-sitter/tree-sitter-julia
|
|
2
|
+
;; License: MIT
|
|
3
|
+
|
|
4
|
+
(module
|
|
5
|
+
name: (identifier) @name.definition.module) @definition.module
|
|
6
|
+
|
|
7
|
+
(module
|
|
8
|
+
name: (scoped_identifier) @name.definition.module) @definition.module
|
|
9
|
+
|
|
10
|
+
(struct_definition
|
|
11
|
+
name: (type_identifier) @name.definition.class) @definition.class
|
|
12
|
+
|
|
13
|
+
(mutable_struct_definition
|
|
14
|
+
name: (type_identifier) @name.definition.class) @definition.class
|
|
15
|
+
|
|
16
|
+
(abstract_type_declaration
|
|
17
|
+
name: (type_identifier) @name.definition.class) @definition.class
|
|
18
|
+
|
|
19
|
+
(constant_assignment
|
|
20
|
+
left: (identifier) @name.definition.class) @definition.class
|
|
21
|
+
|
|
22
|
+
(function_definition
|
|
23
|
+
name: (identifier) @name.definition.function) @definition.function
|
|
24
|
+
|
|
25
|
+
(function_definition
|
|
26
|
+
name: (scoped_identifier) @name.definition.function) @definition.function
|
|
27
|
+
|
|
28
|
+
(assignment
|
|
29
|
+
left: (call_expression
|
|
30
|
+
function: (identifier) @name.definition.function)) @definition.function
|
|
31
|
+
|
|
32
|
+
(method_definition
|
|
33
|
+
name: (identifier) @name.definition.method) @definition.method
|
|
34
|
+
|
|
35
|
+
(macro_definition
|
|
36
|
+
name: (identifier) @name.definition.macro) @definition.macro
|
|
37
|
+
|
|
38
|
+
(macro_call
|
|
39
|
+
name: (identifier) @name.reference.call) @reference.call
|
|
40
|
+
|
|
41
|
+
(call_expression
|
|
42
|
+
function: (identifier) @name.reference.call) @reference.call
|
|
43
|
+
|
|
44
|
+
(call_expression
|
|
45
|
+
function: (scoped_identifier) @name.reference.call) @reference.call
|
|
46
|
+
|
|
47
|
+
(type_expression
|
|
48
|
+
name: (type_identifier) @name.reference.type) @reference.type
|
|
49
|
+
|
|
50
|
+
(constant_assignment
|
|
51
|
+
left: (identifier) @name.definition.constant) @definition.constant
|
|
52
|
+
|
|
53
|
+
(export_statement
|
|
54
|
+
(identifier) @name.reference.export) @reference.export
|
|
55
|
+
|
|
56
|
+
(using_statement
|
|
57
|
+
(identifier) @name.reference.module) @reference.module
|
|
58
|
+
|
|
59
|
+
(import_statement
|
|
60
|
+
(identifier) @name.reference.module) @reference.module
|
aider/repomap.py
CHANGED
|
@@ -102,6 +102,38 @@ class RepoMap:
|
|
|
102
102
|
# Add more based on tree-sitter queries if needed
|
|
103
103
|
}
|
|
104
104
|
|
|
105
|
+
@staticmethod
|
|
106
|
+
def get_file_stub(fname, io):
|
|
107
|
+
"""Generate a complete structural outline of a source code file.
|
|
108
|
+
|
|
109
|
+
Args:
|
|
110
|
+
fname (str): Absolute path to the source file
|
|
111
|
+
io: InputOutput instance for file operations
|
|
112
|
+
|
|
113
|
+
Returns:
|
|
114
|
+
str: Formatted outline showing the file's structure
|
|
115
|
+
"""
|
|
116
|
+
# Use cached instance if available
|
|
117
|
+
if not hasattr(RepoMap, "_stub_instance"):
|
|
118
|
+
RepoMap._stub_instance = RepoMap(map_tokens=0, io=io)
|
|
119
|
+
|
|
120
|
+
rm = RepoMap._stub_instance
|
|
121
|
+
|
|
122
|
+
rel_fname = rm.get_rel_fname(fname)
|
|
123
|
+
|
|
124
|
+
# Reuse existing tag parsing
|
|
125
|
+
tags = rm.get_tags(fname, rel_fname)
|
|
126
|
+
if not tags:
|
|
127
|
+
return "# No outline available"
|
|
128
|
+
|
|
129
|
+
# Get all definition lines
|
|
130
|
+
lois = [tag.line for tag in tags if tag.kind == "def"]
|
|
131
|
+
|
|
132
|
+
# Reuse existing tree rendering
|
|
133
|
+
outline = rm.render_tree(fname, rel_fname, lois)
|
|
134
|
+
|
|
135
|
+
return f"{outline}"
|
|
136
|
+
|
|
105
137
|
def __init__(
|
|
106
138
|
self,
|
|
107
139
|
map_tokens=1024,
|
aider/scrape.py
CHANGED
|
@@ -42,7 +42,7 @@ def install_playwright(io):
|
|
|
42
42
|
if has_pip and has_chromium:
|
|
43
43
|
return True
|
|
44
44
|
|
|
45
|
-
pip_cmd = utils.get_pip_install(["aider-
|
|
45
|
+
pip_cmd = utils.get_pip_install(["aider-ce[playwright]"])
|
|
46
46
|
chromium_cmd = "-m playwright install --with-deps chromium"
|
|
47
47
|
chromium_cmd = [sys.executable] + chromium_cmd.split()
|
|
48
48
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: aider-ce
|
|
3
|
-
Version: 0.87.
|
|
3
|
+
Version: 0.87.7.dev11
|
|
4
4
|
Summary: Aider is AI pair programming in your terminal
|
|
5
5
|
Project-URL: Homepage, https://github.com/dwash96/aider-ce
|
|
6
6
|
Classifier: Development Status :: 4 - Beta
|
|
@@ -93,6 +93,7 @@ This project aims to be compatible with upstream Aider, but with priority commit
|
|
|
93
93
|
* [Map Cache Location Config: #2911](https://github.com/Aider-AI/aider/pull/2911)
|
|
94
94
|
* [Enhanced System Prompts: #3804](https://github.com/Aider-AI/aider/pull/3804)
|
|
95
95
|
* [Repo Map File Name Truncation Fix: #4320](https://github.com/Aider-AI/aider/pull/4320)
|
|
96
|
+
* [Read Only Stub Files For Context Window Management : #3056](https://github.com/Aider-AI/aider/pull/3056)
|
|
96
97
|
|
|
97
98
|
### Other Updates
|
|
98
99
|
|
|
@@ -108,6 +109,7 @@ This project aims to be compatible with upstream Aider, but with priority commit
|
|
|
108
109
|
* [Edit Before Adding Files and Reflecting](https://github.com/dwash96/aider-ce/pull/22)
|
|
109
110
|
* [Fix Deepseek model configurations](https://github.com/Aider-AI/aider/commit/c839a6dd8964d702172cae007375e299732d3823)
|
|
110
111
|
* [Relax Version Pinning For Easier Distribution](https://github.com/dwash96/aider-ce/issues/18)
|
|
112
|
+
* [Remove Confirm Responses from History](https://github.com/Aider-AI/aider/pull/3958)
|
|
111
113
|
|
|
112
114
|
### Other Notes
|
|
113
115
|
* [MCP Configuration](https://github.com/dwash96/aider-ce/blob/main/aider/website/docs/config/mcp.md)
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
aider/__init__.py,sha256=
|
|
1
|
+
aider/__init__.py,sha256=sBT6unAQIv2JlQ0UoaNBwwMxi65ZLpviMGyRLbk7SSY,496
|
|
2
2
|
aider/__main__.py,sha256=Vdhw8YA1K3wPMlbJQYL5WqvRzAKVeZ16mZQFO9VRmCo,62
|
|
3
|
-
aider/_version.py,sha256=
|
|
3
|
+
aider/_version.py,sha256=HDFK5zgSFoctKeBa4GGB9G8KVUj7B1jw-DH8hFrnNj8,721
|
|
4
4
|
aider/analytics.py,sha256=c5ujaCcMc3yG-9rz_0oSsqBwmVQRxJnui6iE_yDyY_M,7507
|
|
5
5
|
aider/args.py,sha256=yjfHJm-eKBEXJ7MlqoGQEjkFhBlCvGtwp44AajAtROs,32491
|
|
6
6
|
aider/args_formatter.py,sha256=CBRnzHyZk-fFCK0ekAzb6C4PPJOU-VTpWIIsJe3qUhk,6369
|
|
7
7
|
aider/change_tracker.py,sha256=djUlUuewhwRAlC0x6jIUZNpn6_PK1YyiNTMYvlvDeTE,4884
|
|
8
|
-
aider/commands.py,sha256=
|
|
8
|
+
aider/commands.py,sha256=TfOJyqjNQ78eTghzQFHiIpuJ2fIfNw2vbmF1nkQmZ5k,80010
|
|
9
9
|
aider/copypaste.py,sha256=J99QrXILUED_GPdEqxt7WjGZ5if8sfy0VQTzsV2jBrE,2095
|
|
10
10
|
aider/deprecated.py,sha256=SNeAWR7ih87F5AyFpC4pxRoJAaw8measBW583w0EUT8,4277
|
|
11
11
|
aider/diffs.py,sha256=y6_rxIKe3FPCIsVy_RRkHdofguYOhYBr2Oytr5AqjHI,3028
|
|
@@ -14,13 +14,13 @@ aider/editor.py,sha256=_WAipJYEOx-q69mPp_hHAQ2yfeoZklBYjS0rTLxCHEA,4364
|
|
|
14
14
|
aider/exceptions.py,sha256=W9Qw83348Xl0KwSMc1jYNZ-o8Ok65rBAuB1Mz9P6fUk,3914
|
|
15
15
|
aider/format_settings.py,sha256=wHW4bLTKwqUKDGX4onxirC4cNgeJ-lHPuS1H04_R444,1041
|
|
16
16
|
aider/gui.py,sha256=JnHvli1JTCGHAgsOZ8HkAWOKAFxmngbyviZIJeYvjsw,17573
|
|
17
|
-
aider/help.py,sha256=
|
|
17
|
+
aider/help.py,sha256=wExA1E9vuJccKBH1VvKmH-zJqFi-vhNc0n3CD3Y-8fI,4432
|
|
18
18
|
aider/help_pats.py,sha256=syn7pSVJdcf8uMKTxnZUZBQu-r8JMAi-rrC-k2er1Fk,376
|
|
19
19
|
aider/history.py,sha256=r3OP3kVxl6-PZmXEI9oK1mVAM-hYCbUqacISz4e_khY,5957
|
|
20
|
-
aider/io.py,sha256=
|
|
20
|
+
aider/io.py,sha256=gecsU8k3TOywKynspE_6GvcHNnopbRvIMa5xWBSTpv4,47538
|
|
21
21
|
aider/linter.py,sha256=t5jwWZ1dvIzRtig1kTSjzl6u1LRfw0e19qwNIen2jAg,7998
|
|
22
22
|
aider/llm.py,sha256=fGCemP1X9MBwrDfsTKGJ_1sx-yKz3DyoOvxZYOkvGak,1103
|
|
23
|
-
aider/main.py,sha256=
|
|
23
|
+
aider/main.py,sha256=LyHwjkxz3_7tH_jerneLpDVzMY7svkkLW2NGXmfEzY8,45034
|
|
24
24
|
aider/mdstream.py,sha256=fS9iQUQmIJPEMo7o1psPGE2yYj31MI3m3msdN-jEzUw,7594
|
|
25
25
|
aider/models.py,sha256=hic7Wb8cwudH9fkfJykxEP8k98nNROBwDkbNHWnW3OE,47146
|
|
26
26
|
aider/onboarding.py,sha256=XdCPsi6idsRvV0TsnaBOk0QoH-g3KgctafSMxoxvx6k,16105
|
|
@@ -28,10 +28,10 @@ aider/openrouter.py,sha256=FAdv7L8xgILXgmC_b1gnuYJStmpaPyiZMp-7nSdInlQ,4642
|
|
|
28
28
|
aider/prompts.py,sha256=Qv-JS8BzGjusEPmR3-qmjjvN3S9mb7W4KpWiGui-Jk0,1954
|
|
29
29
|
aider/reasoning_tags.py,sha256=VOg5wM7JSrMo47OyS1FFuLrr2cp2KyutEC4_zsUsCbY,2288
|
|
30
30
|
aider/repo.py,sha256=ZLq0E6gwm7KabzYASib-7bqv-E55JZOWCpXfC3IZJeE,22922
|
|
31
|
-
aider/repomap.py,sha256=
|
|
31
|
+
aider/repomap.py,sha256=WRdBrP6GT8JxlHyqBxUcuVk9NemcJl0aJFain2z0KOY,33331
|
|
32
32
|
aider/report.py,sha256=WobVDEK6YxB0GpHrF5twTfUYH5dsNWFIHFsB9lds7E8,5899
|
|
33
33
|
aider/run_cmd.py,sha256=9-NpSL4hlqIndf_EN1jnmWfjX7vIPbDgKgGPGRAr2Rw,4223
|
|
34
|
-
aider/scrape.py,sha256=
|
|
34
|
+
aider/scrape.py,sha256=RyKlO3cN2QvfovaLQFJNx8j1Zaz6Qx2wqWhYO9H2Yug,8334
|
|
35
35
|
aider/sendchat.py,sha256=Gq5A5E2kEg0MPE3tTKulhQseroXCwsGtLDH_OEHB2-4,1854
|
|
36
36
|
aider/special.py,sha256=OhsBWWM-DWwjWbi6kE7EqR4CiUfyJ6qJuCgcmywZSAc,4415
|
|
37
37
|
aider/urls.py,sha256=W0OL4pahSIZAaSUHPvn9KPN1aIkXE5nAKcizMKy4EKg,1122
|
|
@@ -46,7 +46,7 @@ aider/coders/architect_coder.py,sha256=b7KqtivnllPdyMfxbnEUd9G0C1ZFaiappV25Rz0Dk
|
|
|
46
46
|
aider/coders/architect_prompts.py,sha256=R0_KxZjo-km_yNaeDAquDP9qfp3IdWgrdMirCWe0RIE,1658
|
|
47
47
|
aider/coders/ask_coder.py,sha256=Omk4Ih8-prefkMZ_jnRS3faoW5CQUakHOvZ-s7piM3U,210
|
|
48
48
|
aider/coders/ask_prompts.py,sha256=W6HwDUfzfOLt9q8sl6rw7fN7b5ND90FkxCZrtrWl5vY,1171
|
|
49
|
-
aider/coders/base_coder.py,sha256=
|
|
49
|
+
aider/coders/base_coder.py,sha256=913yo4jkpjxwATUYP_oApz088i2dL4bfzEzVyLmtC4M,112125
|
|
50
50
|
aider/coders/base_prompts.py,sha256=O3bBjhf0hgvtKbQ9QyOMnRy8LrmfLyT9dVAcXxHS_3k,3659
|
|
51
51
|
aider/coders/chat_chunks.py,sha256=8HPet6cmQdgWvaA_tGpinO4ASMst53uTcSEtNVTYDXE,1981
|
|
52
52
|
aider/coders/context_coder.py,sha256=Y5LdIaYHywMB03lXsmHTYsDnyHIHJ6FNZLMWa9wjArs,1571
|
|
@@ -127,6 +127,7 @@ aider/queries/tree-sitter-languages/go-tags.scm,sha256=mHtS5NEuxWJGfVz1rq4YlJRMY
|
|
|
127
127
|
aider/queries/tree-sitter-languages/hcl-tags.scm,sha256=yOVCBeF4C3ZrFG-gg0adWg2QkxylPcI2dbVeEgD7EPE,2137
|
|
128
128
|
aider/queries/tree-sitter-languages/java-tags.scm,sha256=7WKb-djGv0Ief6XEWQPYpfLpgJHtMPPukIUi55PegvE,627
|
|
129
129
|
aider/queries/tree-sitter-languages/javascript-tags.scm,sha256=svVct6pxbcYP_-xEBwzGy6t1SlN7ajkEUCivUkBZn_Q,2251
|
|
130
|
+
aider/queries/tree-sitter-languages/julia-tags.scm,sha256=OdZDoUUljhmY5gnKlRPebbA6lh4OC3RuN4kpJqpKCGs,1719
|
|
130
131
|
aider/queries/tree-sitter-languages/kotlin-tags.scm,sha256=ugk8v7Or3PXiBk-_HfZznwLuV-b-s3TYm03Wm3q2h_o,632
|
|
131
132
|
aider/queries/tree-sitter-languages/matlab-tags.scm,sha256=GqF7QBytU-xGkcUWkGlMi7iJ7XnmmoMFB_mtMKXaJgw,309
|
|
132
133
|
aider/queries/tree-sitter-languages/ocaml-tags.scm,sha256=NAcyzmQuQPUjkchrQvcfhsvKqdcqbAt5eFb1chfEhMA,2695
|
|
@@ -256,9 +257,9 @@ aider/website/docs/usage/tutorials.md,sha256=ZKBztbUtucHOiv9h8gvWiWTP6MTSsFyz4mA
|
|
|
256
257
|
aider/website/docs/usage/voice.md,sha256=BtX7pHRgHRWUmrNbS4JssC-SO8RrJ_OetBCtIYpO0pU,3452
|
|
257
258
|
aider/website/docs/usage/watch.md,sha256=OVF14lGtv1vhSXRE8PpxQ3YW-uXSifarUbmLBjmLRyA,7940
|
|
258
259
|
aider/website/share/index.md,sha256=P51aDw9AT8AVbsU7v6g1tWuMjly7y_plM_ZI1ScaT8Y,3172
|
|
259
|
-
aider_ce-0.87.
|
|
260
|
-
aider_ce-0.87.
|
|
261
|
-
aider_ce-0.87.
|
|
262
|
-
aider_ce-0.87.
|
|
263
|
-
aider_ce-0.87.
|
|
264
|
-
aider_ce-0.87.
|
|
260
|
+
aider_ce-0.87.7.dev11.dist-info/licenses/LICENSE.txt,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
|
|
261
|
+
aider_ce-0.87.7.dev11.dist-info/METADATA,sha256=-4jIUenEPFsRRyujDIQlJm-W8lNRmoe4yPb1tDuZqoE,18248
|
|
262
|
+
aider_ce-0.87.7.dev11.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
263
|
+
aider_ce-0.87.7.dev11.dist-info/entry_points.txt,sha256=OxI0JxfyJrc24nTmsdvpaWUx8Flz2huOij_-ifp-48w,69
|
|
264
|
+
aider_ce-0.87.7.dev11.dist-info/top_level.txt,sha256=uwOA6ycgSiRLrBsaRBcIeN_eBKAX78U01_KDEHR8mBk,6
|
|
265
|
+
aider_ce-0.87.7.dev11.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|