aider-ce 0.88.5__py3-none-any.whl → 0.88.6.dev6__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 +2 -1
- aider/commands.py +197 -10
- aider/exceptions.py +3 -0
- aider/io.py +17 -11
- aider/repo.py +1 -1
- aider/website/docs/sessions.md +182 -0
- {aider_ce-0.88.5.dist-info → aider_ce-0.88.6.dev6.dist-info}/METADATA +3 -1
- {aider_ce-0.88.5.dist-info → aider_ce-0.88.6.dev6.dist-info}/RECORD +14 -13
- {aider_ce-0.88.5.dist-info → aider_ce-0.88.6.dev6.dist-info}/WHEEL +0 -0
- {aider_ce-0.88.5.dist-info → aider_ce-0.88.6.dev6.dist-info}/entry_points.txt +0 -0
- {aider_ce-0.88.5.dist-info → aider_ce-0.88.6.dev6.dist-info}/licenses/LICENSE.txt +0 -0
- {aider_ce-0.88.5.dist-info → aider_ce-0.88.6.dev6.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.88.
|
|
32
|
-
__version_tuple__ = version_tuple = (0, 88,
|
|
31
|
+
__version__ = version = '0.88.6.dev6'
|
|
32
|
+
__version_tuple__ = version_tuple = (0, 88, 6, 'dev6')
|
|
33
33
|
|
|
34
34
|
__commit_id__ = commit_id = None
|
aider/coders/base_coder.py
CHANGED
|
@@ -1928,6 +1928,7 @@ class Coder:
|
|
|
1928
1928
|
self.usage_report = None
|
|
1929
1929
|
exhausted = False
|
|
1930
1930
|
interrupted = False
|
|
1931
|
+
|
|
1931
1932
|
try:
|
|
1932
1933
|
while True:
|
|
1933
1934
|
try:
|
|
@@ -2461,7 +2462,7 @@ class Coder:
|
|
|
2461
2462
|
return (server.name, server_tools)
|
|
2462
2463
|
except Exception as e:
|
|
2463
2464
|
if server.name != "unnamed-server":
|
|
2464
|
-
self.io.tool_warning(f"Error initializing MCP server {server.name}
|
|
2465
|
+
self.io.tool_warning(f"Error initializing MCP server {server.name}: {e}")
|
|
2465
2466
|
return None
|
|
2466
2467
|
|
|
2467
2468
|
async def get_all_server_tools():
|
aider/commands.py
CHANGED
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
import asyncio
|
|
2
2
|
import glob
|
|
3
|
+
import json
|
|
3
4
|
import os
|
|
4
5
|
import re
|
|
5
6
|
import subprocess
|
|
6
7
|
import sys
|
|
7
8
|
import tempfile
|
|
9
|
+
import time
|
|
8
10
|
from collections import OrderedDict
|
|
11
|
+
from datetime import datetime
|
|
9
12
|
from os.path import expanduser
|
|
10
13
|
from pathlib import Path
|
|
11
14
|
|
|
@@ -1490,19 +1493,12 @@ class Commands:
|
|
|
1490
1493
|
edit_format=edit_format,
|
|
1491
1494
|
summarize_from_coder=False,
|
|
1492
1495
|
num_cache_warming_pings=0,
|
|
1496
|
+
aider_commit_hashes=self.coder.aider_commit_hashes,
|
|
1493
1497
|
)
|
|
1494
1498
|
|
|
1495
1499
|
user_msg = args
|
|
1496
|
-
await coder.run(user_msg)
|
|
1497
|
-
|
|
1498
|
-
# Use the provided placeholder if any
|
|
1499
|
-
raise SwitchCoder(
|
|
1500
|
-
edit_format=self.coder.edit_format,
|
|
1501
|
-
summarize_from_coder=False,
|
|
1502
|
-
from_coder=coder,
|
|
1503
|
-
show_announcements=False,
|
|
1504
|
-
placeholder=placeholder,
|
|
1505
|
-
)
|
|
1500
|
+
await coder.run(user_msg, False)
|
|
1501
|
+
self.coder.aider_commit_hashes = coder.aider_commit_hashes
|
|
1506
1502
|
|
|
1507
1503
|
def get_help_md(self):
|
|
1508
1504
|
"Show help about all commands in markdown"
|
|
@@ -2035,6 +2031,197 @@ class Commands:
|
|
|
2035
2031
|
announcements = "\n".join(self.coder.get_announcements())
|
|
2036
2032
|
self.io.tool_output(announcements)
|
|
2037
2033
|
|
|
2034
|
+
def _get_session_directory(self):
|
|
2035
|
+
"""Get the session storage directory, creating it if needed"""
|
|
2036
|
+
session_dir = Path(self.coder.root) / ".aider" / "sessions"
|
|
2037
|
+
session_dir.mkdir(parents=True, exist_ok=True)
|
|
2038
|
+
return session_dir
|
|
2039
|
+
|
|
2040
|
+
def _get_session_file_path(self, session_name):
|
|
2041
|
+
"""Get the full path for a session file"""
|
|
2042
|
+
session_dir = self._get_session_directory()
|
|
2043
|
+
# Sanitize the session name to be filesystem-safe
|
|
2044
|
+
safe_name = re.sub(r"[^a-zA-Z0-9_.-]", "_", session_name)
|
|
2045
|
+
return session_dir / f"{safe_name}.json"
|
|
2046
|
+
|
|
2047
|
+
def _find_session_file(self, session_name):
|
|
2048
|
+
"""Find a session file by name, checking both name-based and full path"""
|
|
2049
|
+
# First check if it's a full path
|
|
2050
|
+
if Path(session_name).exists():
|
|
2051
|
+
return Path(session_name)
|
|
2052
|
+
|
|
2053
|
+
# Then check in the sessions directory
|
|
2054
|
+
session_file = self._get_session_file_path(session_name)
|
|
2055
|
+
if session_file.exists():
|
|
2056
|
+
return session_file
|
|
2057
|
+
|
|
2058
|
+
return None
|
|
2059
|
+
|
|
2060
|
+
def cmd_save_session(self, args):
|
|
2061
|
+
"""Save the current chat session to a named file in .aider/sessions/"""
|
|
2062
|
+
if not args.strip():
|
|
2063
|
+
self.io.tool_error("Please provide a session name.")
|
|
2064
|
+
return
|
|
2065
|
+
|
|
2066
|
+
session_name = args.strip()
|
|
2067
|
+
session_file = self._get_session_file_path(session_name)
|
|
2068
|
+
|
|
2069
|
+
# Collect session data
|
|
2070
|
+
session_data = {
|
|
2071
|
+
"version": "1.0",
|
|
2072
|
+
"timestamp": time.time(),
|
|
2073
|
+
"session_name": session_name,
|
|
2074
|
+
"model": self.coder.main_model.name,
|
|
2075
|
+
"edit_format": self.coder.edit_format,
|
|
2076
|
+
"chat_history": {
|
|
2077
|
+
"done_messages": self.coder.done_messages,
|
|
2078
|
+
"cur_messages": self.coder.cur_messages,
|
|
2079
|
+
},
|
|
2080
|
+
"files": {
|
|
2081
|
+
"editable": [self.coder.get_rel_fname(f) for f in self.coder.abs_fnames],
|
|
2082
|
+
"read_only": [self.coder.get_rel_fname(f) for f in self.coder.abs_read_only_fnames],
|
|
2083
|
+
"read_only_stubs": [
|
|
2084
|
+
self.coder.get_rel_fname(f) for f in self.coder.abs_read_only_stubs_fnames
|
|
2085
|
+
],
|
|
2086
|
+
},
|
|
2087
|
+
"settings": {
|
|
2088
|
+
"root": self.coder.root,
|
|
2089
|
+
"auto_commits": self.coder.auto_commits,
|
|
2090
|
+
"auto_lint": self.coder.auto_lint,
|
|
2091
|
+
"auto_test": self.coder.auto_test,
|
|
2092
|
+
},
|
|
2093
|
+
}
|
|
2094
|
+
|
|
2095
|
+
try:
|
|
2096
|
+
with open(session_file, "w", encoding="utf-8") as f:
|
|
2097
|
+
json.dump(session_data, f, indent=2, ensure_ascii=False)
|
|
2098
|
+
self.io.tool_output(f"Session saved to: {session_file}")
|
|
2099
|
+
except Exception as e:
|
|
2100
|
+
self.io.tool_error(f"Error saving session: {e}")
|
|
2101
|
+
|
|
2102
|
+
def cmd_list_sessions(self, args):
|
|
2103
|
+
"""List all saved sessions in .aider/sessions/"""
|
|
2104
|
+
session_dir = self._get_session_directory()
|
|
2105
|
+
session_files = list(session_dir.glob("*.json"))
|
|
2106
|
+
|
|
2107
|
+
if not session_files:
|
|
2108
|
+
self.io.tool_output("No saved sessions found.")
|
|
2109
|
+
return
|
|
2110
|
+
|
|
2111
|
+
self.io.tool_output("Saved sessions:")
|
|
2112
|
+
for session_file in sorted(session_files):
|
|
2113
|
+
try:
|
|
2114
|
+
with open(session_file, "r", encoding="utf-8") as f:
|
|
2115
|
+
session_data = json.load(f)
|
|
2116
|
+
session_name = session_data.get("session_name", session_file.stem)
|
|
2117
|
+
timestamp = session_data.get("timestamp", 0)
|
|
2118
|
+
model = session_data.get("model", "unknown")
|
|
2119
|
+
edit_format = session_data.get("edit_format", "unknown")
|
|
2120
|
+
|
|
2121
|
+
# Format timestamp
|
|
2122
|
+
if timestamp:
|
|
2123
|
+
date_str = datetime.fromtimestamp(timestamp).strftime("%Y-%m-%d %H:%M")
|
|
2124
|
+
else:
|
|
2125
|
+
date_str = "unknown date"
|
|
2126
|
+
|
|
2127
|
+
self.io.tool_output(
|
|
2128
|
+
f" {session_name} (model: {model}, format: {edit_format}, {date_str})"
|
|
2129
|
+
)
|
|
2130
|
+
except Exception as e:
|
|
2131
|
+
self.io.tool_output(f" {session_file.stem} [error reading: {e}]")
|
|
2132
|
+
|
|
2133
|
+
def cmd_load_session(self, args):
|
|
2134
|
+
"""Load a saved session by name or file path"""
|
|
2135
|
+
if not args.strip():
|
|
2136
|
+
self.io.tool_error("Please provide a session name or file path.")
|
|
2137
|
+
return
|
|
2138
|
+
|
|
2139
|
+
session_name = args.strip()
|
|
2140
|
+
session_file = self._find_session_file(session_name)
|
|
2141
|
+
|
|
2142
|
+
if not session_file:
|
|
2143
|
+
self.io.tool_error(f"Session not found: {session_name}")
|
|
2144
|
+
self.io.tool_output("Use /list-sessions to see available sessions.")
|
|
2145
|
+
return
|
|
2146
|
+
|
|
2147
|
+
try:
|
|
2148
|
+
with open(session_file, "r", encoding="utf-8") as f:
|
|
2149
|
+
session_data = json.load(f)
|
|
2150
|
+
except Exception as e:
|
|
2151
|
+
self.io.tool_error(f"Error loading session: {e}")
|
|
2152
|
+
return
|
|
2153
|
+
|
|
2154
|
+
# Verify session format
|
|
2155
|
+
if not isinstance(session_data, dict) or "version" not in session_data:
|
|
2156
|
+
self.io.tool_error("Invalid session format.")
|
|
2157
|
+
return
|
|
2158
|
+
|
|
2159
|
+
# Load session data
|
|
2160
|
+
try:
|
|
2161
|
+
# Clear current state
|
|
2162
|
+
self.coder.abs_fnames = set()
|
|
2163
|
+
self.coder.abs_read_only_fnames = set()
|
|
2164
|
+
self.coder.abs_read_only_stubs_fnames = set()
|
|
2165
|
+
self.coder.done_messages = []
|
|
2166
|
+
self.coder.cur_messages = []
|
|
2167
|
+
|
|
2168
|
+
# Load chat history
|
|
2169
|
+
chat_history = session_data.get("chat_history", {})
|
|
2170
|
+
self.coder.done_messages = chat_history.get("done_messages", [])
|
|
2171
|
+
self.coder.cur_messages = chat_history.get("cur_messages", [])
|
|
2172
|
+
|
|
2173
|
+
# Load files
|
|
2174
|
+
files = session_data.get("files", {})
|
|
2175
|
+
for rel_fname in files.get("editable", []):
|
|
2176
|
+
abs_fname = self.coder.abs_root_path(rel_fname)
|
|
2177
|
+
if os.path.exists(abs_fname):
|
|
2178
|
+
self.coder.abs_fnames.add(abs_fname)
|
|
2179
|
+
else:
|
|
2180
|
+
self.io.tool_warning(f"File not found, skipping: {rel_fname}")
|
|
2181
|
+
|
|
2182
|
+
for rel_fname in files.get("read_only", []):
|
|
2183
|
+
abs_fname = self.coder.abs_root_path(rel_fname)
|
|
2184
|
+
if os.path.exists(abs_fname):
|
|
2185
|
+
self.coder.abs_read_only_fnames.add(abs_fname)
|
|
2186
|
+
else:
|
|
2187
|
+
self.io.tool_warning(f"File not found, skipping: {rel_fname}")
|
|
2188
|
+
|
|
2189
|
+
for rel_fname in files.get("read_only_stubs", []):
|
|
2190
|
+
abs_fname = self.coder.abs_root_path(rel_fname)
|
|
2191
|
+
if os.path.exists(abs_fname):
|
|
2192
|
+
self.coder.abs_read_only_stubs_fnames.add(abs_fname)
|
|
2193
|
+
else:
|
|
2194
|
+
self.io.tool_warning(f"File not found, skipping: {rel_fname}")
|
|
2195
|
+
|
|
2196
|
+
# Load settings
|
|
2197
|
+
settings = session_data.get("settings", {})
|
|
2198
|
+
if "auto_commits" in settings:
|
|
2199
|
+
self.coder.auto_commits = settings["auto_commits"]
|
|
2200
|
+
if "auto_lint" in settings:
|
|
2201
|
+
self.coder.auto_lint = settings["auto_lint"]
|
|
2202
|
+
if "auto_test" in settings:
|
|
2203
|
+
self.coder.auto_test = settings["auto_test"]
|
|
2204
|
+
|
|
2205
|
+
self.io.tool_output(
|
|
2206
|
+
f"Session loaded: {session_data.get('session_name', session_file.stem)}"
|
|
2207
|
+
)
|
|
2208
|
+
self.io.tool_output(
|
|
2209
|
+
f"Model: {session_data.get('model', 'unknown')}, Edit format:"
|
|
2210
|
+
f" {session_data.get('edit_format', 'unknown')}"
|
|
2211
|
+
)
|
|
2212
|
+
|
|
2213
|
+
# Show summary
|
|
2214
|
+
num_messages = len(self.coder.done_messages) + len(self.coder.cur_messages)
|
|
2215
|
+
num_files = (
|
|
2216
|
+
len(self.coder.abs_fnames)
|
|
2217
|
+
+ len(self.coder.abs_read_only_fnames)
|
|
2218
|
+
+ len(self.coder.abs_read_only_stubs_fnames)
|
|
2219
|
+
)
|
|
2220
|
+
self.io.tool_output(f"Loaded {num_messages} messages and {num_files} files")
|
|
2221
|
+
|
|
2222
|
+
except Exception as e:
|
|
2223
|
+
self.io.tool_error(f"Error applying session data: {e}")
|
|
2224
|
+
|
|
2038
2225
|
def cmd_copy_context(self, args=None):
|
|
2039
2226
|
"""Copy the current chat context as markdown, suitable to paste into a web UI"""
|
|
2040
2227
|
|
aider/exceptions.py
CHANGED
aider/io.py
CHANGED
|
@@ -991,7 +991,7 @@ class InputOutput:
|
|
|
991
991
|
else:
|
|
992
992
|
style = dict()
|
|
993
993
|
|
|
994
|
-
self.
|
|
994
|
+
self.stream_print(Text(inp), **style)
|
|
995
995
|
|
|
996
996
|
def user_input(self, inp, log_only=True):
|
|
997
997
|
if not log_only:
|
|
@@ -1245,23 +1245,23 @@ class InputOutput:
|
|
|
1245
1245
|
message = Text(message)
|
|
1246
1246
|
|
|
1247
1247
|
style = dict()
|
|
1248
|
-
|
|
1249
1248
|
if self.pretty:
|
|
1250
|
-
color = ensure_hash_prefix(color) if color else None
|
|
1251
1249
|
if color:
|
|
1252
|
-
style["color"] = color
|
|
1250
|
+
style["color"] = ensure_hash_prefix(color)
|
|
1251
|
+
|
|
1252
|
+
style = RichStyle(**style)
|
|
1253
1253
|
|
|
1254
1254
|
try:
|
|
1255
|
-
self.stream_print(message, style=
|
|
1255
|
+
self.stream_print(message, style=style)
|
|
1256
1256
|
except UnicodeEncodeError:
|
|
1257
1257
|
# Fallback to ASCII-safe output
|
|
1258
1258
|
if isinstance(message, Text):
|
|
1259
1259
|
message = message.plain
|
|
1260
1260
|
message = str(message).encode("ascii", errors="replace").decode("ascii")
|
|
1261
|
-
self.stream_print(message, style=
|
|
1261
|
+
self.stream_print(message, style=style)
|
|
1262
1262
|
|
|
1263
|
-
|
|
1264
|
-
|
|
1263
|
+
def tool_success(self, message="", strip=True):
|
|
1264
|
+
self._tool_message(message, strip, self.user_input_color)
|
|
1265
1265
|
|
|
1266
1266
|
def tool_error(self, message="", strip=True):
|
|
1267
1267
|
self.num_error_outputs += 1
|
|
@@ -1309,7 +1309,7 @@ class InputOutput:
|
|
|
1309
1309
|
else:
|
|
1310
1310
|
show_resp = Text(message or "(empty response)")
|
|
1311
1311
|
|
|
1312
|
-
self.
|
|
1312
|
+
self.stream_print(show_resp)
|
|
1313
1313
|
|
|
1314
1314
|
def render_markdown(self, text):
|
|
1315
1315
|
output = StringIO()
|
|
@@ -1352,12 +1352,18 @@ class InputOutput:
|
|
|
1352
1352
|
|
|
1353
1353
|
if not final:
|
|
1354
1354
|
if len(lines) > 1:
|
|
1355
|
-
self.console.print(
|
|
1355
|
+
self.console.print(
|
|
1356
|
+
Text.from_ansi(output) if self.has_ansi_codes(output) else output
|
|
1357
|
+
)
|
|
1356
1358
|
else:
|
|
1357
1359
|
# Ensure any remaining buffered content is printed using the full response
|
|
1358
|
-
self.console.print(output)
|
|
1360
|
+
self.console.print(Text.from_ansi(output) if self.has_ansi_codes(output) else output)
|
|
1359
1361
|
self.reset_streaming_response()
|
|
1360
1362
|
|
|
1363
|
+
def has_ansi_codes(self, s: str) -> bool:
|
|
1364
|
+
"""Check if a string contains the ANSI escape character."""
|
|
1365
|
+
return "\x1b" in s
|
|
1366
|
+
|
|
1361
1367
|
def reset_streaming_response(self):
|
|
1362
1368
|
self._stream_buffer = ""
|
|
1363
1369
|
self._stream_line_count = 0
|
aider/repo.py
CHANGED
|
@@ -310,7 +310,7 @@ class GitRepo:
|
|
|
310
310
|
# Perform the commit
|
|
311
311
|
self.repo.git.commit(cmd)
|
|
312
312
|
commit_hash = self.get_head_commit_sha(short=True)
|
|
313
|
-
self.io.
|
|
313
|
+
self.io.tool_success(f"Commit {commit_hash} {commit_message}")
|
|
314
314
|
return commit_hash, commit_message
|
|
315
315
|
|
|
316
316
|
except ANY_GIT_ERROR as err:
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
# Session Management
|
|
2
|
+
|
|
3
|
+
Aider provides session management commands that allow you to save, load, and manage your chat sessions. This is particularly useful for:
|
|
4
|
+
|
|
5
|
+
- Continuing work on complex projects across multiple sessions
|
|
6
|
+
- Recreating specific development environments
|
|
7
|
+
- Archiving important conversations and file configurations
|
|
8
|
+
|
|
9
|
+
## Session Commands
|
|
10
|
+
|
|
11
|
+
### `/save-session <name>`
|
|
12
|
+
Save the current chat session to a named file in `.aider/sessions/`.
|
|
13
|
+
|
|
14
|
+
**Usage:**
|
|
15
|
+
```
|
|
16
|
+
/save-session my-project-session
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
**What gets saved:**
|
|
20
|
+
- Chat history (both done and current messages)
|
|
21
|
+
- All files in the chat (editable, read-only, and read-only stubs)
|
|
22
|
+
- Current model and edit format settings
|
|
23
|
+
- Auto-commit, auto-lint, and auto-test settings
|
|
24
|
+
- Session metadata (timestamp, version)
|
|
25
|
+
|
|
26
|
+
### `/load-session <name>`
|
|
27
|
+
Load a previously saved session by name or file path.
|
|
28
|
+
|
|
29
|
+
**Usage:**
|
|
30
|
+
```
|
|
31
|
+
/load-session my-project-session
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
**What gets loaded:**
|
|
35
|
+
- Restores chat history and file configurations
|
|
36
|
+
- Recreates the exact session state
|
|
37
|
+
- Preserves all settings and model configurations
|
|
38
|
+
|
|
39
|
+
### `/list-sessions`
|
|
40
|
+
List all available saved sessions in `.aider/sessions/`.
|
|
41
|
+
|
|
42
|
+
**Usage:**
|
|
43
|
+
```
|
|
44
|
+
/list-sessions
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
**Shows:**
|
|
48
|
+
- Session names
|
|
49
|
+
- Model used
|
|
50
|
+
- Edit format
|
|
51
|
+
- Creation timestamp
|
|
52
|
+
|
|
53
|
+
## How Sessions Work
|
|
54
|
+
|
|
55
|
+
### Session Storage
|
|
56
|
+
Sessions are stored as JSON files in the `.aider/sessions/` directory within your project. Each session file contains:
|
|
57
|
+
|
|
58
|
+
```json
|
|
59
|
+
{
|
|
60
|
+
"version": "1.0",
|
|
61
|
+
"timestamp": 1700000000,
|
|
62
|
+
"session_name": "my-session",
|
|
63
|
+
"model": "gpt-4",
|
|
64
|
+
"edit_format": "diff",
|
|
65
|
+
"chat_history": {
|
|
66
|
+
"done_messages": [...],
|
|
67
|
+
"cur_messages": [...]
|
|
68
|
+
},
|
|
69
|
+
"files": {
|
|
70
|
+
"editable": ["file1.py", "file2.js"],
|
|
71
|
+
"read_only": ["docs/README.md"],
|
|
72
|
+
"read_only_stubs": []
|
|
73
|
+
},
|
|
74
|
+
"settings": {
|
|
75
|
+
"root": "/path/to/project",
|
|
76
|
+
"auto_commits": true,
|
|
77
|
+
"auto_lint": false,
|
|
78
|
+
"auto_test": false
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
### Session File Location
|
|
84
|
+
- **Relative paths**: Files within your project are stored with relative paths
|
|
85
|
+
- **Absolute paths**: External files are stored with absolute paths
|
|
86
|
+
|
|
87
|
+
## Use Cases
|
|
88
|
+
|
|
89
|
+
### Project Continuation
|
|
90
|
+
```
|
|
91
|
+
# Start working on a project
|
|
92
|
+
/add src/main.py src/utils.py
|
|
93
|
+
# ... have a conversation ...
|
|
94
|
+
/save-session my-project
|
|
95
|
+
|
|
96
|
+
# Later, continue where you left off
|
|
97
|
+
/load-session my-project
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
### Multiple Contexts
|
|
101
|
+
```
|
|
102
|
+
# Work on frontend
|
|
103
|
+
/add src/components/*.jsx src/styles/*.css
|
|
104
|
+
/save-session frontend-work
|
|
105
|
+
|
|
106
|
+
# Switch to backend
|
|
107
|
+
/reset
|
|
108
|
+
/add server/*.py database/*.sql
|
|
109
|
+
/save-session backend-work
|
|
110
|
+
|
|
111
|
+
# Easily switch between contexts
|
|
112
|
+
/load-session frontend-work
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
## Best Practices
|
|
116
|
+
|
|
117
|
+
### Naming Conventions
|
|
118
|
+
- Use descriptive names: `feature-auth-session`, `bugfix-issue-123`
|
|
119
|
+
- Include dates if needed: `2024-01-project-setup`
|
|
120
|
+
|
|
121
|
+
### File Management
|
|
122
|
+
- Session files include all file paths, so they work best when project structure is stable
|
|
123
|
+
- External files (outside the project root) are stored with absolute paths
|
|
124
|
+
- Missing files are skipped with warnings during loading
|
|
125
|
+
|
|
126
|
+
### Version Control
|
|
127
|
+
- Consider adding `.aider/sessions/` to your `.gitignore` if sessions contain sensitive information
|
|
128
|
+
|
|
129
|
+
## Troubleshooting
|
|
130
|
+
|
|
131
|
+
### Session Not Found
|
|
132
|
+
If `/load-session` reports "Session not found":
|
|
133
|
+
- Check that the session file exists in `.aider/sessions/`
|
|
134
|
+
- Verify the session name matches exactly
|
|
135
|
+
- Use `/list-sessions` to see available sessions
|
|
136
|
+
|
|
137
|
+
### Missing Files
|
|
138
|
+
If files are reported as missing during loading:
|
|
139
|
+
- The files may have been moved or deleted
|
|
140
|
+
- Session files store relative paths, so directory structure changes can affect this
|
|
141
|
+
- External files must exist at their original locations
|
|
142
|
+
|
|
143
|
+
### Corrupted Sessions
|
|
144
|
+
If a session fails to load:
|
|
145
|
+
- Check the session file is valid JSON
|
|
146
|
+
- Verify the session version is compatible
|
|
147
|
+
- Try creating a new session and compare file structures
|
|
148
|
+
|
|
149
|
+
## Related Commands
|
|
150
|
+
- `/reset` - Clear chat history and drop files (useful before loading a session)
|
|
151
|
+
|
|
152
|
+
## Examples
|
|
153
|
+
|
|
154
|
+
### Complete Workflow
|
|
155
|
+
```
|
|
156
|
+
# Start a new project session
|
|
157
|
+
/add package.json src/main.js src/components/
|
|
158
|
+
# ... work on the project ...
|
|
159
|
+
/save-session react-project
|
|
160
|
+
|
|
161
|
+
# Later, continue working
|
|
162
|
+
/load-session react-project
|
|
163
|
+
# All files and chat history are restored
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
### Session with External Files
|
|
167
|
+
```
|
|
168
|
+
# Include documentation from outside the project
|
|
169
|
+
/read-only ~/docs/api-reference.md
|
|
170
|
+
/save-session project-with-docs
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
### Multiple Model Sessions
|
|
174
|
+
```
|
|
175
|
+
# Save session with specific model
|
|
176
|
+
/model gpt-4
|
|
177
|
+
/save-session gpt4-session
|
|
178
|
+
|
|
179
|
+
# Try different model
|
|
180
|
+
/model claude-3
|
|
181
|
+
/save-session claude-session
|
|
182
|
+
```
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: aider-ce
|
|
3
|
-
Version: 0.88.
|
|
3
|
+
Version: 0.88.6.dev6
|
|
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
|
|
@@ -146,6 +146,8 @@ This project aims to be compatible with upstream Aider, but with priority commit
|
|
|
146
146
|
|
|
147
147
|
### Other Notes
|
|
148
148
|
* [MCP Configuration](https://github.com/dwash96/aider-ce/blob/main/aider/website/docs/config/mcp.md)
|
|
149
|
+
* [Session Management](https://github.com/dwash96/aider-ce/blob/main/aider/website/docs/sessions.md)
|
|
150
|
+
|
|
149
151
|
|
|
150
152
|
### Installation Instructions
|
|
151
153
|
This project can be installed using several methods:
|
|
@@ -1,23 +1,23 @@
|
|
|
1
|
-
aider/__init__.py,sha256=
|
|
1
|
+
aider/__init__.py,sha256=ShiJeSj_EA3vHqLbL-zE-RnZh6EeHXx-4-2YtV1hEcw,496
|
|
2
2
|
aider/__main__.py,sha256=Vdhw8YA1K3wPMlbJQYL5WqvRzAKVeZ16mZQFO9VRmCo,62
|
|
3
|
-
aider/_version.py,sha256=
|
|
3
|
+
aider/_version.py,sha256=qLEpNi3hbuA34zKfoh1P9yPnnrXnPbjrXa8tRXEYqj4,719
|
|
4
4
|
aider/analytics.py,sha256=c5ujaCcMc3yG-9rz_0oSsqBwmVQRxJnui6iE_yDyY_M,7507
|
|
5
5
|
aider/args.py,sha256=r9xdhB44K4LF2ru-cbOdaoHYzvG6CyViwcw9QRewEKw,33145
|
|
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=XxqOuOolx7jzvpfQKMojWlUFcJNohEUOcwziMgOuJME,88965
|
|
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
|
|
12
12
|
aider/dump.py,sha256=-naWnGTc0-lAe_93WxBTpunPRfzNlUK7Q5zgXOprHfA,653
|
|
13
13
|
aider/editor.py,sha256=_WAipJYEOx-q69mPp_hHAQ2yfeoZklBYjS0rTLxCHEA,4364
|
|
14
|
-
aider/exceptions.py,sha256=
|
|
14
|
+
aider/exceptions.py,sha256=HO3SkFDgZTUDEjukT_wVgeu1GC7enmYffmA0_aPZfyY,4041
|
|
15
15
|
aider/format_settings.py,sha256=wHW4bLTKwqUKDGX4onxirC4cNgeJ-lHPuS1H04_R444,1041
|
|
16
16
|
aider/gui.py,sha256=JnHvli1JTCGHAgsOZ8HkAWOKAFxmngbyviZIJeYvjsw,17573
|
|
17
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=083Gm7KxNo1PXMFHYiChigxCbRzmLkfNlesODdCC-eY,6067
|
|
20
|
-
aider/io.py,sha256=
|
|
20
|
+
aider/io.py,sha256=Hj0AJqsFMTpMzlPS7_ONAJRr72RCIYhIIcL7nTsd_d4,56812
|
|
21
21
|
aider/linter.py,sha256=t5jwWZ1dvIzRtig1kTSjzl6u1LRfw0e19qwNIen2jAg,7998
|
|
22
22
|
aider/llm.py,sha256=dtT0mavXP1SyR0Zu_ysZXKdbs3y53q2PevvDKBUrs6s,1505
|
|
23
23
|
aider/main.py,sha256=3IE18moiAP2nXs-NY_PJKk8PXS_pdzMvbefoNfT9CnQ,46520
|
|
@@ -27,7 +27,7 @@ aider/onboarding.py,sha256=pMWl--NOH_hb4w1wVxLmv8W0akcrilo1Pxf9XUSqBXs,16135
|
|
|
27
27
|
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
|
-
aider/repo.py,sha256=
|
|
30
|
+
aider/repo.py,sha256=34RGHEBOIEvhStQ4Xr4bNp7kgExAkR-caNMLN-ijboc,22924
|
|
31
31
|
aider/repomap.py,sha256=KA-ucbHNiLqHQ-iaCyPX5otJdugqexRUY0bwyaLPBlE,35082
|
|
32
32
|
aider/report.py,sha256=WobVDEK6YxB0GpHrF5twTfUYH5dsNWFIHFsB9lds7E8,5899
|
|
33
33
|
aider/run_cmd.py,sha256=9-NpSL4hlqIndf_EN1jnmWfjX7vIPbDgKgGPGRAr2Rw,4223
|
|
@@ -46,7 +46,7 @@ aider/coders/architect_coder.py,sha256=O5KIf__Ka0bgtCUhYWUmAb08aCS6Nq-CdVWWa-VNK
|
|
|
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=fNHPICmmXygdqyQxGrNs6467z0O_OifiiZETGsva_AI,132707
|
|
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=_RSzu6ptHo2lkTN7-e9TpcZKzqbQF2eNX5MkyswGm3s,1577
|
|
@@ -199,6 +199,7 @@ aider/website/docs/llms.md,sha256=fq0VL5uzXFBCbXRbltIcuH-AO5gB36Cw3k26nX5hcIA,15
|
|
|
199
199
|
aider/website/docs/more-info.md,sha256=rNeoFIwC7bYcW78YaUFMnoWA8nowuNTGPo3RInPnU48,124
|
|
200
200
|
aider/website/docs/repomap.md,sha256=rEHIhD1mwEu1lRFVAVEY73AvEHQXvmLygMuJVbrx7sg,3900
|
|
201
201
|
aider/website/docs/scripting.md,sha256=Fj0J3BLUTUAoUFBMpk1Kayj1paU1c_fXyg-5ZlVFKIU,3123
|
|
202
|
+
aider/website/docs/sessions.md,sha256=d2iy8pBWTEMdfHQ8q3Ki_F_eBBzSyWgK2GuUjA_jr1s,4474
|
|
202
203
|
aider/website/docs/troubleshooting.md,sha256=UYFgCP8zhJxGJqo4PI0-J-EB-zZ9HtRsIKfCP-qa9lg,218
|
|
203
204
|
aider/website/docs/usage.md,sha256=LMQpEDZ7rUYgmXN2HYbKg2W2h5sTASlkj89MRHw99rY,3592
|
|
204
205
|
aider/website/docs/config/adv-model-settings.md,sha256=SGQ-64IUQv7w5uG6sSfrvXRmbik6tUyS4KvwI7Z3uhM,60372
|
|
@@ -263,9 +264,9 @@ aider/website/docs/usage/tutorials.md,sha256=ZKBztbUtucHOiv9h8gvWiWTP6MTSsFyz4mA
|
|
|
263
264
|
aider/website/docs/usage/voice.md,sha256=BtX7pHRgHRWUmrNbS4JssC-SO8RrJ_OetBCtIYpO0pU,3452
|
|
264
265
|
aider/website/docs/usage/watch.md,sha256=OVF14lGtv1vhSXRE8PpxQ3YW-uXSifarUbmLBjmLRyA,7940
|
|
265
266
|
aider/website/share/index.md,sha256=P51aDw9AT8AVbsU7v6g1tWuMjly7y_plM_ZI1ScaT8Y,3172
|
|
266
|
-
aider_ce-0.88.
|
|
267
|
-
aider_ce-0.88.
|
|
268
|
-
aider_ce-0.88.
|
|
269
|
-
aider_ce-0.88.
|
|
270
|
-
aider_ce-0.88.
|
|
271
|
-
aider_ce-0.88.
|
|
267
|
+
aider_ce-0.88.6.dev6.dist-info/licenses/LICENSE.txt,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
|
|
268
|
+
aider_ce-0.88.6.dev6.dist-info/METADATA,sha256=1njZp1Nm8iKoLgVL64UmyNTH2ln0xoVP7SkeM4h5St0,20927
|
|
269
|
+
aider_ce-0.88.6.dev6.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
270
|
+
aider_ce-0.88.6.dev6.dist-info/entry_points.txt,sha256=qUBEUd84DYNEHFSgZbgsjgsrAABxqwOj-Dwut9pHZx0,45
|
|
271
|
+
aider_ce-0.88.6.dev6.dist-info/top_level.txt,sha256=uwOA6ycgSiRLrBsaRBcIeN_eBKAX78U01_KDEHR8mBk,6
|
|
272
|
+
aider_ce-0.88.6.dev6.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|