diff --git a/HISTORY.md b/HISTORY.md index 92530ea68..d04306507 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -13,6 +13,16 @@ - Add common file types (`.svg`, `.pdf`) to the default list of ignored files for AI comment scanning (`--watch`). - Skip scanning files larger than 1MB for AI comments (`--watch`). - Aider wrote 67% of the code in this release. +### main branch + +- Set development version to 0.82.4.dev. +- Improved cost calculation using `litellm.completion_cost` where available. +- Fixed linter command execution on Windows by adopting `oslex` for argument quoting, by Titusz Pan. +- Enabled support for `thinking_tokens` and `reasoning_effort` parameters for OpenRouter models. +- Added support for `gemini-2.5-pro-preview-05-06` models. +- Added model settings for `openrouter/google/gemini-2.5-pro-preview-03-25`. +- Aider wrote 67% of the code in this release. + ### Aider v0.82.2 diff --git a/aider/website/HISTORY.md b/aider/website/HISTORY.md index 82a2527a1..cc39db23b 100644 --- a/aider/website/HISTORY.md +++ b/aider/website/HISTORY.md @@ -37,6 +37,16 @@ cog.out(text) - Add common file types (`.svg`, `.pdf`) to the default list of ignored files for AI comment scanning (`--watch`). - Skip scanning files larger than 1MB for AI comments (`--watch`). - Aider wrote 67% of the code in this release. +### main branch + +- Set development version to 0.82.4.dev. +- Improved cost calculation using `litellm.completion_cost` where available. +- Fixed linter command execution on Windows by adopting `oslex` for argument quoting, by Titusz Pan. +- Enabled support for `thinking_tokens` and `reasoning_effort` parameters for OpenRouter models. +- Added support for `gemini-2.5-pro-preview-05-06` models. +- Added model settings for `openrouter/google/gemini-2.5-pro-preview-03-25`. +- Aider wrote 67% of the code in this release. + ### Aider v0.82.2 diff --git a/aider/website/assets/sample-analytics.jsonl b/aider/website/assets/sample-analytics.jsonl index 5127072c9..c90524869 100644 --- a/aider/website/assets/sample-analytics.jsonl +++ b/aider/website/assets/sample-analytics.jsonl @@ -1,9 +1,3 @@ -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745173231} -{"event": "model warning", "properties": {"main_model": "gemini/REDACTED", "weak_model": "gemini/REDACTED", "editor_model": "gemini/REDACTED"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745173234} -{"event": "exit", "properties": {"reason": "Keyboard interrupt during model warnings"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745173235} -{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745173477} -{"event": "repo", "properties": {"num_files": 613}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745173478} -{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745173478} {"event": "cli session", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "udiff"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745173478} {"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745173651} {"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "udiff", "prompt_tokens": 13344, "completion_tokens": 1294, "total_tokens": 14638, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1745173666} @@ -998,3 +992,9 @@ {"event": "repo", "properties": {"num_files": 617}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746660774} {"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746660774} {"event": "exit", "properties": {"reason": "Completed lint/test/commit"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746660777} +{"event": "launched", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746661684} +{"event": "no-repo", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746661684} +{"event": "auto_commits", "properties": {"enabled": true}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746661684} +{"event": "message_send_starting", "properties": {}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746661684} +{"event": "message_send", "properties": {"main_model": "gemini/gemini-2.5-pro-exp-03-25", "weak_model": "gemini/gemini-2.0-flash", "editor_model": "gemini/gemini-2.5-pro-exp-03-25", "edit_format": "udiff-simple", "prompt_tokens": 6018, "completion_tokens": 231, "total_tokens": 6249, "cost": 0, "total_cost": 0.0}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746661749} +{"event": "exit", "properties": {"reason": "Completed --message"}, "user_id": "c42c4e6b-f054-44d7-ae1f-6726cc41da88", "time": 1746661749} diff --git a/aider/website/docs/faq.md b/aider/website/docs/faq.md index 856713cb0..871a030b0 100644 --- a/aider/website/docs/faq.md +++ b/aider/website/docs/faq.md @@ -264,9 +264,9 @@ tr:hover { background-color: #f5f5f5; } - - - + + + diff --git a/tests/basic/test_linter.py b/tests/basic/test_linter.py index 60132b565..46b02a367 100644 --- a/tests/basic/test_linter.py +++ b/tests/basic/test_linter.py @@ -41,6 +41,7 @@ class TestLinter(unittest.TestCase): if os.name != "nt": self.skipTest("This test only runs on Windows") from pathlib import Path + root = Path(__file__).parent.parent.parent.absolute().as_posix() linter = Linter(encoding="utf-8", root=root) result = linter.run_cmd("dir", "tests\\basic", "code") @@ -57,6 +58,27 @@ class TestLinter(unittest.TestCase): self.assertIsNotNone(result) self.assertIn("Error message", result.text) + def test_run_cmd_with_special_chars(self): + with patch("subprocess.Popen") as mock_popen: + mock_process = MagicMock() + mock_process.returncode = 1 + mock_process.stdout.read.side_effect = ("Error message", None) + mock_popen.return_value = mock_process + + # Test with a file path containing special characters + special_path = "src/(main)/product/[id]/page.tsx" + result = self.linter.run_cmd("eslint", special_path, "code") + + # Verify that the command was constructed correctly + mock_popen.assert_called_once() + call_args = mock_popen.call_args[0][0] + + self.assertIn(special_path, call_args) + + # The result should contain the error message + self.assertIsNotNone(result) + self.assertIn("Error message", result.text) + if __name__ == "__main__": unittest.main()
Model NameTotal TokensPercent
gemini/gemini-2.5-pro-exp-03-251,315,56467.0%
gemini/gemini-2.5-pro-preview-03-25442,01922.5%
o3138,8427.1%
gemini/gemini-2.5-pro-exp-03-251,321,81367.1%
gemini/gemini-2.5-pro-preview-03-25442,01922.4%
o3138,8427.0%
openrouter/anthropic/claude-3.7-sonnet41,0172.1%
gemini/gemini-2.5-flash-preview-04-1710,3050.5%
gemini/gemini-2.5-pro-preview-05-068,5760.4%