Skip to content
51 changes: 49 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
### Documentation and Other Notes
## Documentation and Other Notes
* [Agent Mode](https://github.com/dwash96/aider-ce/blob/main/aider/website/docs/config/agent-mode.md)
* [MCP Configuration](https://github.com/dwash96/aider-ce/blob/main/aider/website/docs/config/mcp.md)
* [Session Management](https://github.com/dwash96/aider-ce/blob/main/aider/website/docs/sessions.md)
* [Aider Original Documentation (still mostly applies)](https://aider.chat/)
* [Changelog](https://github.com/dwash96/aider-ce/blob/main/CHANGELOG.md)
* [Discord Community](https://discord.gg/McwdCRuqkJ)

### Installation Instructions
## Installation Instructions
This project can be installed using several methods:

### Package Installation
Expand All @@ -29,6 +29,53 @@ uv tool install --python python3.12 aider-ce

Use the tool installation so aider doesn't interfere with your development environment

## Configuration

The documentation above contains the full set of allowed configuration options
but I highly recommend using an `.aider.conf.yml` file. A good place to get started is:

```yaml
model: <model of your choice>
agent: true
analytics: false
auto-commits: true
auto-save: true
auto-load: true
check-update: true
debug: false
enable-context-compaction: true
env-file: .aider.env
multiline: true
preserve-todo-list: true
show-model-warnings: true
watch-files: true
agent-config: |
{
"large_file_token_threshold": 12500,
"skip_cli_confirmations": false
}
mcp-servers: |
{
"mcpServers":
{
"context7":{
"transport":"http",
"url":"https://mcp.context7.com/mcp"
}
}
}
```

Use the adjacent .aider.env file to store model api keys as environment variables, e.g:

```
ANTHROPIC_API_KEY="..."
GEMINI_API_KEY="..."
OPENAI_API_KEY="..."
OPENROUTER_API_KEY="..."
DEEPSEEK_API_KEY="..."
```

## Project Roadmap/Goals

The current priorities are to improve core capabilities and user experience of the Aider project
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.88.25.dev"
__version__ = "0.88.26.dev"
safe_version = __version__

try:
Expand Down
7 changes: 3 additions & 4 deletions aider/coders/base_coder.py
Original file line number Diff line number Diff line change
Expand Up @@ -479,6 +479,7 @@ def __init__(
self.dry_run = dry_run
self.pretty = self.io.pretty
self.linear_output = linear_output
self.io.linear = linear_output
self.main_model = main_model

# Set the reasoning tag name based on model settings or default
Expand Down Expand Up @@ -1137,11 +1138,11 @@ async def _run_linear(self, with_message=None, preproc=True):
await self.io.recreate_input()
await self.io.input_task
user_message = self.io.input_task.result()

self.io.tool_output("Processing...\n")
self.io.output_task = asyncio.create_task(self.generate(user_message, preproc))

await self.io.output_task

self.io.tool_output("Finished.")
self.io.ring_bell()
user_message = None
self.auto_save_session()
Expand Down Expand Up @@ -2334,7 +2335,6 @@ async def process_tool_calls(self, tool_call_response):
self._print_tool_call_info(server_tool_calls)

if await self.io.confirm_ask("Run tools?", group_response="Run MCP Tools"):
await self.io.recreate_input()
tool_responses = await self._execute_tool_calls(server_tool_calls)

# Add all tool responses
Expand Down Expand Up @@ -2836,7 +2836,6 @@ async def check_for_file_mentions(self, content):
if await self.io.confirm_ask(
"Add file to the chat?", subject=rel_fname, group=group, allow_never=True
):
await self.io.recreate_input()
self.add_rel_fname(rel_fname)
added_fnames.append(rel_fname)
else:
Expand Down
1 change: 0 additions & 1 deletion aider/commands.py
Original file line number Diff line number Diff line change
Expand Up @@ -414,7 +414,6 @@ async def cmd_lint(self, args="", fnames=None):
)

lint_coder.add_rel_fname(fname)
await self.coder.io.recreate_input()
await lint_coder.run_one(errors, preproc=False)
lint_coder.abs_fnames = set()

Expand Down
27 changes: 23 additions & 4 deletions aider/io.py
Original file line number Diff line number Diff line change
Expand Up @@ -348,6 +348,7 @@ def __init__(
self.coder = None
self.input_task = None
self.output_task = None
self.linear = False

# State tracking for confirmation input
self.confirmation_in_progress = False
Expand Down Expand Up @@ -529,7 +530,7 @@ def stop_spinner(self):

def get_bottom_toolbar(self):
"""Get the current spinner frame and text for the bottom toolbar."""
if not self.spinner_running or not self.spinner_frames:
if not self.spinner_running or not self.spinner_frames or self.linear:
return None

frame = self.spinner_frames[self.spinner_frame_index]
Expand Down Expand Up @@ -1402,14 +1403,32 @@ def stream_output(self, text, final=False):

self._stream_buffer = incomplete_line

should_print = False
should_reset = False

if not final:
if len(lines) > 1:
should_print = True
else:
# Ensure any remaining buffered content is printed using the full response
should_print = True
should_reset = True

if should_print:
try:
self.console.print(
Text.from_ansi(output) if self.has_ansi_codes(output) else output
)
else:
# Ensure any remaining buffered content is printed using the full response
self.console.print(Text.from_ansi(output) if self.has_ansi_codes(output) else output)
except Exception as e:
if self.verbose:
print(e)

self.console.print(
(Text.from_ansi(output)) if self.has_ansi_codes(output) else output,
markup=False,
)

if should_reset:
self.reset_streaming_response()

def remove_consecutive_empty_strings(self, string_list):
Expand Down
Loading
Loading