Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
1bbfa72
feature: repomap cache directory configuration setting
coredevorg Apr 22, 2025
ac40a4c
add test results for gpt-oss-120b (high) to polyglot leaderboard
Oct4Pie Aug 6, 2025
2f5bb77
Merge pull request #4412 from Oct4Pie/bench/gpt-oss-120b-high
paul-gauthier Aug 11, 2025
9fda5c9
chore: Update polyglot leaderboard model name and command
paul-gauthier Aug 11, 2025
0a88f7c
feat: Add EthicalAds script and ad placement
paul-gauthier Aug 11, 2025
da45632
fix: Adjust ad placement for narrow screens
paul-gauthier Aug 11, 2025
5761b08
refactor: Remove unused ad styles from head_custom.html
paul-gauthier Aug 12, 2025
450a535
feat: Add reasoning_effort setting to gpt-5 models
paul-gauthier Aug 13, 2025
2b98a9e
copy
paul-gauthier Aug 13, 2025
07e2559
copy
paul-gauthier Aug 13, 2025
b8b521f
version bump to 0.86.1
paul-gauthier Aug 13, 2025
59250e0
set version to 0.86.2.dev
paul-gauthier Aug 13, 2025
32faf82
chore: Update base image to python:3.10-slim-bookworm
paul-gauthier Aug 13, 2025
441e97e
Bump Version
dwash96 Aug 16, 2025
1b82d2a
Add asyncio locking/cancellation protection
dwash96 Aug 16, 2025
1417864
#14: Fix debian trixie font deps so continer can build
dwash96 Aug 17, 2025
be73197
Merge remote-tracking branch 'map-cache-location/repomap-root-patch' …
dwash96 Aug 17, 2025
a2efa1e
Update README.md to list changes with Aider Upstream
dwash96 Aug 17, 2025
c1c848e
Merge remote-tracking branch 'main/main' into v0.87.2
dwash96 Aug 17, 2025
3b5f975
Update README.md for clearer MCP Configuration
dwash96 Aug 17, 2025
e52e752
Update Github Workflow to handle publishing aider-ce as a distinct pa…
dwash96 Aug 17, 2025
4437537
#8 - Updates per pre-commit hooks:
dwash96 Aug 17, 2025
854c7c4
#8 - Update base_coder for flake8 in pipeline, run python tests in de…
dwash96 Aug 17, 2025
64cf2bb
Fix more pre-commit pipeline errors and tests
dwash96 Aug 17, 2025
9ccdbd0
Mock Playwright after playwright install happens so the mock properly…
dwash96 Aug 17, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .flake8
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
[flake8]
ignore = E203,W503
max-line-length = 100
max-line-length = 120
8 changes: 4 additions & 4 deletions .github/workflows/check_pypi_version.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,22 +15,22 @@ jobs:
runs-on: ubuntu-latest
strategy:
matrix:
python-version: ["3.10", "3.11", "3.12"]
python-version: ["3.12", "3.11", "3.10"]

steps:
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python-version }}

- name: Install aider-chat
run: pip install aider-chat
- name: Install aider-ce
run: pip install aider-ce

- name: Get installed aider version
id: installed_version
run: |
set -x # Enable debugging output
aider_version_output=$(aider --version)
aider_version_output=$(aider-ce --version)
if [ $? -ne 0 ]; then
echo "Error: 'aider --version' command failed."
exit 1
Expand Down
27 changes: 3 additions & 24 deletions .github/workflows/docker-build-test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ jobs:
file: ./docker/Dockerfile
platforms: linux/amd64,linux/arm64
push: false
target: aider
target: aider-ce

- name: Build Docker images (Push)
if: ${{ github.event_name != 'pull_request' }}
Expand All @@ -60,26 +60,5 @@ jobs:
file: ./docker/Dockerfile
platforms: linux/amd64,linux/arm64
push: true
tags: ${{ secrets.DOCKERHUB_USERNAME }}/aider:dev
target: aider

- name: Build Docker full image (PR)
if: ${{ github.event_name == 'pull_request' }}
uses: docker/build-push-action@v5
with:
context: .
file: ./docker/Dockerfile
platforms: linux/amd64,linux/arm64
push: false
target: aider-full

- name: Build Docker full image (Push)
if: ${{ github.event_name != 'pull_request' }}
uses: docker/build-push-action@v5
with:
context: .
file: ./docker/Dockerfile
platforms: linux/amd64,linux/arm64
push: true
tags: ${{ secrets.DOCKERHUB_USERNAME }}/aider-full:dev
target: aider-full
tags: ${{ secrets.DOCKERHUB_USERNAME }}/aider-ce:dev
target: aider-ce
17 changes: 3 additions & 14 deletions .github/workflows/docker-release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -35,18 +35,7 @@ jobs:
platforms: linux/amd64,linux/arm64
push: true
tags: |
${{ secrets.DOCKERHUB_USERNAME }}/aider:${{ github.ref_name }}
${{ secrets.DOCKERHUB_USERNAME }}/aider:latest
target: aider
${{ secrets.DOCKERHUB_USERNAME }}/aider-ce:${{ github.ref_name }}
${{ secrets.DOCKERHUB_USERNAME }}/aider-ce:latest
target: aider-ce

- name: Build and push Docker full image
uses: docker/build-push-action@v5
with:
context: .
file: ./docker/Dockerfile
platforms: linux/amd64,linux/arm64
push: true
tags: |
${{ secrets.DOCKERHUB_USERNAME }}/aider-full:${{ github.ref_name }}
${{ secrets.DOCKERHUB_USERNAME }}/aider-full:latest
target: aider-full
2 changes: 1 addition & 1 deletion .github/workflows/issues.yml
Original file line number Diff line number Diff line change
Expand Up @@ -25,5 +25,5 @@ jobs:

- name: Run issues script
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
GITHUB_TOKEN: ${{ secrets.REPO_GITHUB_TOKEN }}
run: python scripts/issues.py --yes
2 changes: 1 addition & 1 deletion .github/workflows/ubuntu-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ jobs:
runs-on: ubuntu-latest
strategy:
matrix:
python-version: ["3.10", "3.11", "3.12"]
python-version: ["3.12", "3.11", "3.10"]

steps:
- name: Check out repository
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/windows-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ jobs:
runs-on: windows-latest
strategy:
matrix:
python-version: ["3.10", "3.11", "3.12"]
python-version: ["3.12", "3.11", "3.10"]

steps:
- name: Check out repository
Expand Down
8 changes: 4 additions & 4 deletions .github/workflows/windows_check_pypi_version.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ jobs:
runs-on: windows-latest
strategy:
matrix:
python-version: ["3.10", "3.11", "3.12"]
python-version: ["3.12", "3.11", "3.10"]
defaults:
run:
shell: pwsh # Use PowerShell for all run steps
Expand All @@ -26,14 +26,14 @@ jobs:
with:
python-version: ${{ matrix.python-version }}

- name: Install aider-chat
run: pip install aider-chat
- name: Install aider-ce
run: pip install aider-ce

- name: Get installed aider version
id: installed_version
run: |
Write-Host "Running 'aider --version'..."
$aider_version_output = aider --version
$aider_version_output = aider-ce --version
if ($LASTEXITCODE -ne 0) {
Write-Error "Error: 'aider --version' command failed."
exit 1
Expand Down
32 changes: 32 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,39 @@
## Fork Additions

This project aims to be compatible with upstream Aider, but with priority commits merged in and with some opportunistic bug fixes and optimizations

### Merged PRs

* [MCP: #3937](https://github.com/Aider-AI/aider/pull/3937)
* [MCP Multi Tool Response](https://github.com/quinlanjager/aider/pull/1)
* [Navigator Mode: #3781](https://github.com/Aider-AI/aider/pull/3781)
* [Navigator Mode Large File Count](https://github.com/Aider-AI/aider/commit/b88a7bda649931798209945d9687718316c7427f)
* [Qwen 3: #4383](https://github.com/Aider-AI/aider/pull/4383)
* [Fuzzy Search: #4366](https://github.com/Aider-AI/aider/pull/4366)
* [Map Cache Location Config: #2911](https://github.com/Aider-AI/aider/pull/2911)
* [Enhanced System Prompts: #3804](https://github.com/Aider-AI/aider/pull/3804)
* [Repo Map File Name Truncation Fix: #4320](https://github.com/Aider-AI/aider/pull/4320)

### Other Updates

* [Added Remote MCP Tool Calls With HTTP Streaming](https://github.com/Aider-AI/aider/commit/a86039f73579df7c32fee910967827c9fccdec0d)
* [Enforce single tool call at a time](https://github.com/Aider-AI/aider/commit/3346c3e6194096cef64b1899b017bde36a65f794)
* [Upgraded MCP dep to 1.12.3 for Remote MCP Tool Calls](https://github.com/dwash96/aider-ce/commit/a91ee1c03627a31093364fd2a09e654781b1b879)
* [Updated base Python version to 3.12 to better support navigator mode (might consider undoing this, if dependency list supports it)](https://github.com/dwash96/aider-ce/commit/9ed416d523c11362a3ba9fc4c02134e0e79d41fc)
* [Suppress LiteLLM asyncio errors that clutter output](https://github.com/Aider-AI/aider/issues/6)
* [Updated Docker File Build Process](https://github.com/Aider-AI/aider/commit/cbab01458d0a35c03b30ac2f6347a74fc2b9f662)
* [Manually install necessary ubuntu dependencies](https://github.com/dwash96/aider-ce/issues/14)
* [.gitignore updates](https://github.com/dwash96/aider-ce/commit/7c7e803fa63d1acd860eef1423e5a03220df6017)
* [Experimental Context Compaction For Longer Running Generation Tasks](https://github.com/Aider-AI/aider/issues/6)

### Other Notes
* [MCP Configuration](https://github.com/dwash96/aider/blob/main/aider-ce/website/docs/config/mcp.md)

<p align="center">
<a href="https://aider.chat/"><img src="https://aider.chat/assets/logo.svg" alt="Aider Logo" width="300"></a>
</p>


<h1 align="center">
AI Pair Programming in Your Terminal
</h1>
Expand Down
2 changes: 1 addition & 1 deletion aider/__init__.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
from packaging import version

__version__ = "0.87.1.dev"
__version__ = "0.87.2.dev"
safe_version = __version__

try:
Expand Down
10 changes: 10 additions & 0 deletions aider/args.py
Original file line number Diff line number Diff line change
Expand Up @@ -305,6 +305,16 @@ def get_parser(default_config_files, git_root):
" minified JS files etc. (default: 100)"
),
)
group.add_argument(
"--map-cache-dir",
metavar="MAP_CACHE_DIR",
dest="map_cache_dir",
default=".",
help=(
"Directory for the repository map cache .aider.tags.cache.v3"
" (default: current directory)"
),
)

##########
group = parser.add_argument_group("History Files")
Expand Down
84 changes: 42 additions & 42 deletions aider/change_tracker.py
Original file line number Diff line number Diff line change
@@ -1,31 +1,32 @@
import time
import uuid
from collections import defaultdict
from datetime import datetime


class ChangeTracker:
"""
Tracks changes made to files for the undo functionality.
This enables granular editing operations with the ability to undo specific changes.
"""

def __init__(self):
self.changes = {} # change_id -> change_info
self.files_changed = defaultdict(list) # file_path -> [change_ids]

def track_change(self, file_path, change_type, original_content, new_content,
metadata=None, change_id=None):

def track_change(
self, file_path, change_type, original_content, new_content, metadata=None, change_id=None
):
"""
Record a change to enable future undo operations.

Parameters:
- file_path: Path to the file that was changed
- change_type: Type of change (e.g., 'replacetext', 'insertlines')
- original_content: Original content before the change
- new_content: New content after the change
- metadata: Additional information about the change (line numbers, positions, etc.)
- change_id: Optional custom ID for the change (if None, one will be generated)

Returns:
- change_id: Unique identifier for the change
"""
Expand All @@ -39,77 +40,76 @@ def track_change(self, file_path, change_type, original_content, new_content,

# Defensive check: Ensure the ID isn't literally the string 'False' or boolean False
# which might indicate an upstream issue or unexpected input.
if current_change_id == 'False' or current_change_id is False:
# Log a warning? For now, generate a new ID to prevent storing False.
print(f"Warning: change_id evaluated to False for {file_path}. Generating new ID.")
current_change_id = self._generate_change_id()

if current_change_id == "False" or current_change_id is False:
# Log a warning? For now, generate a new ID to prevent storing False.
print(f"Warning: change_id evaluated to False for {file_path}. Generating new ID.")
current_change_id = self._generate_change_id()

change = {
# Use the confirmed string ID here
'id': current_change_id,
'file_path': file_path,
'type': change_type,
'original': original_content,
'new': new_content,
'metadata': metadata or {},
'timestamp': time.time()
"id": current_change_id,
"file_path": file_path,
"type": change_type,
"original": original_content,
"new": new_content,
"metadata": metadata or {},
"timestamp": time.time(),
}

# Use the confirmed string ID for storage and return
self.changes[current_change_id] = change
self.files_changed[file_path].append(current_change_id)
return current_change_id

def undo_change(self, change_id):
"""
Get information needed to reverse a specific change by ID.

Parameters:
- change_id: ID of the change to undo

Returns:
- (success, message, change_info): Tuple with success flag, message, and change information
"""
if change_id not in self.changes:
return False, f"Change ID {change_id} not found", None

change = self.changes[change_id]

# Mark this change as undone by removing it from the tracking dictionaries
self.files_changed[change['file_path']].remove(change_id)
if not self.files_changed[change['file_path']]:
del self.files_changed[change['file_path']]
self.files_changed[change["file_path"]].remove(change_id)
if not self.files_changed[change["file_path"]]:
del self.files_changed[change["file_path"]]

# Keep the change in the changes dict but mark it as undone
change['undone'] = True
change['undone_at'] = time.time()
change["undone"] = True
change["undone_at"] = time.time()

return True, f"Undid change {change_id} in {change['file_path']}", change

def get_last_change(self, file_path):
"""
Get the most recent change for a specific file.

Parameters:
- file_path: Path to the file

Returns:
- change_id or None if no changes found
"""
changes = self.files_changed.get(file_path, [])
if not changes:
return None
return changes[-1]

def list_changes(self, file_path=None, limit=10):
"""
List recent changes, optionally filtered by file.

Parameters:
- file_path: Optional path to filter changes by file
- limit: Maximum number of changes to list

Returns:
- List of change dictionaries
"""
Expand All @@ -120,14 +120,14 @@ def list_changes(self, file_path=None, limit=10):
else:
# Get all changes
changes = list(self.changes.values())

# Filter out undone changes and sort by timestamp (most recent first)
changes = [c for c in changes if not c.get('undone', False)]
changes = sorted(changes, key=lambda c: c['timestamp'], reverse=True)
changes = [c for c in changes if not c.get("undone", False)]
changes = sorted(changes, key=lambda c: c["timestamp"], reverse=True)

# Apply limit
return changes[:limit]

def _generate_change_id(self):
"""Generate a unique ID for a change."""
return str(uuid.uuid4())[:8] # Short, readable ID
2 changes: 1 addition & 1 deletion aider/coders/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@
from .editor_editblock_coder import EditorEditBlockCoder
from .editor_whole_coder import EditorWholeFileCoder
from .help_coder import HelpCoder
from .patch_coder import PatchCoder
from .navigator_coder import NavigatorCoder
from .patch_coder import PatchCoder
from .udiff_coder import UnifiedDiffCoder
from .udiff_simple import UnifiedDiffSimpleCoder
from .wholefile_coder import WholeFileCoder
Expand Down
Loading
Loading