aider-ce 0.87.5.dev15__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 CHANGED
@@ -1,6 +1,6 @@
1
1
  from packaging import version
2
2
 
3
- __version__ = "0.87.6.dev"
3
+ __version__ = "0.87.7.dev"
4
4
  safe_version = __version__
5
5
 
6
6
  try:
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.5.dev15'
32
- __version_tuple__ = version_tuple = (0, 87, 5, 'dev15')
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
@@ -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
- read_only_fnames=list(from_coder.abs_read_only_fnames),
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
- chat_files = set(self.abs_fnames) | repo_abs_read_only_fnames
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(self.abs_read_only_fnames)
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
- read_only_files = [self.get_rel_fname(fname) for fname in self.abs_read_only_fnames]
1002
- all_files = sorted(set(inchat_files + read_only_files))
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)) for f in self.abs_read_only_fnames
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
- return all_files - inchat_files - read_only_files
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 = [self.coder.get_rel_fname(fn) for fn in self.coder.abs_read_only_fnames]
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 with substring matching and samefile check
1018
- read_only_matched = []
1019
- for f in self.coder.abs_read_only_fnames:
1020
- if expanded_word in f:
1021
- read_only_matched.append(f)
1022
- continue
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
- if not chat_files and not other_files and not read_only_files:
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
- if read_only_files:
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 cmd_read_only(self, args):
1534
- """Add files to the chat that are for reference only, or turn added files to read-only.
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
- if self.coder.repo:
1540
- all_files = self.coder.repo.get_tracked_files()
1541
- else:
1542
- all_files = self.coder.get_all_relative_files()
1543
-
1544
- if not all_files and not self.coder.abs_fnames:
1545
- self.io.tool_output("No files in the repo or chat to make read-only.")
1546
- return
1547
-
1548
- selected_files = []
1549
- if all_files:
1550
- selected_files = run_fzf(all_files, multi=True)
1551
-
1552
- if not selected_files:
1553
- # Fallback behavior: convert all editable files to read-only
1554
- if self.coder.abs_fnames:
1555
- for fname in list(self.coder.abs_fnames):
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(abs_path, path)
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(self, abs_path, original_name):
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 self.coder.abs_read_only_fnames:
1614
- self.io.tool_error(f"{original_name} is already in the chat as a read-only file")
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
- self.coder.abs_read_only_fnames.add(abs_path)
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 editable to read-only files in the chat"
1673
+ f"Moved {original_name} from {source_mode} to {target_mode} files in the chat"
1621
1674
  )
1622
1675
  else:
1623
- self.coder.abs_read_only_fnames.add(abs_path)
1624
- self.io.tool_output(f"Added {original_name} to read-only files.")
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(self, abs_path, original_name):
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 self.coder.abs_read_only_fnames
1688
+ and file_path not in target_set
1689
+ and (source_set is None or file_path not in source_set)
1634
1690
  ):
1635
- self.coder.abs_read_only_fnames.add(file_path)
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 read-only files."
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
@@ -17,7 +17,7 @@ warnings.simplefilter("ignore", category=FutureWarning)
17
17
 
18
18
  def install_help_extra(io):
19
19
  pip_install_cmd = [
20
- "aider-chat[help]",
20
+ "aider-ce[help]",
21
21
  "--extra-index-url",
22
22
  "https://download.pytorch.org/whl/cpu",
23
23
  ]
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
- show = self.format_files_for_input(rel_fnames, rel_read_only_fnames)
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 = len(rel_fnames) + len(rel_read_only_fnames or [])
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
- read_only_files = []
1207
- for full_path in sorted(rel_read_only_fnames or []):
1208
- read_only_files.append(f"{full_path} (read only)")
1209
-
1210
- editable_files = []
1211
- for full_path in sorted(rel_fnames):
1212
- if full_path in rel_read_only_fnames:
1213
- continue
1214
- editable_files.append(f"{full_path}")
1215
-
1216
- return "\n".join(read_only_files + editable_files) + "\n"
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
- read_only_files = sorted(rel_read_only_fnames or [])
1222
- editable_files = [f for f in sorted(rel_fnames) if f not in rel_read_only_fnames]
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
- for rel_path in read_only_files:
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(Text(abs_path if len(abs_path) < len(rel_path) else rel_path))
1230
-
1231
- files_with_label = [Text("Readonly:")] + ro_paths
1232
- read_only_output = StringIO()
1233
- Console(file=read_only_output, force_terminal=False).print(Columns(files_with_label))
1234
- read_only_lines = read_only_output.getvalue().splitlines()
1235
- console.print(Columns(files_with_label))
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
- text_editable_files = [Text(f) for f in editable_files]
1239
- files_with_label = text_editable_files
1240
- if read_only_files:
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-chat[browser]"],
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-chat[playwright]"])
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.5.dev15
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=LWj2sw4A4BDQQ6ijpD78hwJMJg_j530bpiLPpghY03M,496
1
+ aider/__init__.py,sha256=sBT6unAQIv2JlQ0UoaNBwwMxi65ZLpviMGyRLbk7SSY,496
2
2
  aider/__main__.py,sha256=Vdhw8YA1K3wPMlbJQYL5WqvRzAKVeZ16mZQFO9VRmCo,62
3
- aider/_version.py,sha256=qQW5j1_8gMHF86LZit1yRddSbDKkM3RGYxR63CNueI0,721
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=uhJC21k7ARzBXTQRlvwQ_SPf9b2z9Ct-YisCGCfQ2Fw,73679
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=Q8KS0G05Ick2YsVetpj9lAlNH3WjJTHg3t8sf5ZwlC0,4434
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=ncUO5OFbNIBW6Pd7yaBnJL-_JP7ejDftDN8t1mr4hT4,45534
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=mC6-Q2UQG8-vWWG4GbkOY_vSk4I212pBEzCSs-i9-A0,44997
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=LU5QGiHX2TBJnHH8bXVdZ0UdhsIuz9Gz11HoxPay550,32365
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=Ei4Jy1xUsVD4lmuyVMONAVVHEB03hiVsGuE54etY4G0,8336
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=nNX-pm-jTU_tdUvsK4ybZTGM1pYqECKzwZ7ObzRe2nQ,109882
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.5.dev15.dist-info/licenses/LICENSE.txt,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
260
- aider_ce-0.87.5.dev15.dist-info/METADATA,sha256=M0L6DI9sQXHO85F70rUEsOMOi17thp8uN9yLgXgXBIU,18053
261
- aider_ce-0.87.5.dev15.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
262
- aider_ce-0.87.5.dev15.dist-info/entry_points.txt,sha256=OxI0JxfyJrc24nTmsdvpaWUx8Flz2huOij_-ifp-48w,69
263
- aider_ce-0.87.5.dev15.dist-info/top_level.txt,sha256=uwOA6ycgSiRLrBsaRBcIeN_eBKAX78U01_KDEHR8mBk,6
264
- aider_ce-0.87.5.dev15.dist-info/RECORD,,
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,,