aru-code 0.2.0__tar.gz → 0.4.0__tar.gz

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.
Files changed (48) hide show
  1. {aru_code-0.2.0 → aru_code-0.4.0}/PKG-INFO +14 -10
  2. {aru_code-0.2.0 → aru_code-0.4.0}/README.md +9 -8
  3. aru_code-0.4.0/aru/__init__.py +1 -0
  4. {aru_code-0.2.0 → aru_code-0.4.0}/aru/cli.py +11 -11
  5. {aru_code-0.2.0 → aru_code-0.4.0}/aru/config.py +10 -5
  6. {aru_code-0.2.0 → aru_code-0.4.0}/aru/providers.py +5 -4
  7. {aru_code-0.2.0 → aru_code-0.4.0}/aru/tools/ast_tools.py +2 -0
  8. {aru_code-0.2.0 → aru_code-0.4.0}/aru/tools/gitignore.py +2 -0
  9. {aru_code-0.2.0 → aru_code-0.4.0}/aru/tools/mcp_client.py +2 -0
  10. {aru_code-0.2.0 → aru_code-0.4.0}/aru/tools/tasklist.py +2 -0
  11. {aru_code-0.2.0 → aru_code-0.4.0}/aru_code.egg-info/PKG-INFO +14 -10
  12. {aru_code-0.2.0 → aru_code-0.4.0}/aru_code.egg-info/requires.txt +1 -0
  13. {aru_code-0.2.0 → aru_code-0.4.0}/pyproject.toml +83 -80
  14. aru_code-0.2.0/aru/__init__.py +0 -1
  15. {aru_code-0.2.0 → aru_code-0.4.0}/LICENSE +0 -0
  16. {aru_code-0.2.0 → aru_code-0.4.0}/aru/agents/__init__.py +0 -0
  17. {aru_code-0.2.0 → aru_code-0.4.0}/aru/agents/base.py +0 -0
  18. {aru_code-0.2.0 → aru_code-0.4.0}/aru/agents/executor.py +0 -0
  19. {aru_code-0.2.0 → aru_code-0.4.0}/aru/agents/planner.py +0 -0
  20. {aru_code-0.2.0 → aru_code-0.4.0}/aru/context.py +0 -0
  21. {aru_code-0.2.0 → aru_code-0.4.0}/aru/tools/__init__.py +0 -0
  22. {aru_code-0.2.0 → aru_code-0.4.0}/aru/tools/codebase.py +0 -0
  23. {aru_code-0.2.0 → aru_code-0.4.0}/aru/tools/ranker.py +0 -0
  24. {aru_code-0.2.0 → aru_code-0.4.0}/aru_code.egg-info/SOURCES.txt +0 -0
  25. {aru_code-0.2.0 → aru_code-0.4.0}/aru_code.egg-info/dependency_links.txt +0 -0
  26. {aru_code-0.2.0 → aru_code-0.4.0}/aru_code.egg-info/entry_points.txt +0 -0
  27. {aru_code-0.2.0 → aru_code-0.4.0}/aru_code.egg-info/top_level.txt +0 -0
  28. {aru_code-0.2.0 → aru_code-0.4.0}/setup.cfg +0 -0
  29. {aru_code-0.2.0 → aru_code-0.4.0}/tests/test_agents_base.py +0 -0
  30. {aru_code-0.2.0 → aru_code-0.4.0}/tests/test_ast_tools.py +0 -0
  31. {aru_code-0.2.0 → aru_code-0.4.0}/tests/test_cli.py +0 -0
  32. {aru_code-0.2.0 → aru_code-0.4.0}/tests/test_cli_advanced.py +0 -0
  33. {aru_code-0.2.0 → aru_code-0.4.0}/tests/test_cli_base.py +0 -0
  34. {aru_code-0.2.0 → aru_code-0.4.0}/tests/test_cli_completers.py +0 -0
  35. {aru_code-0.2.0 → aru_code-0.4.0}/tests/test_cli_new.py +0 -0
  36. {aru_code-0.2.0 → aru_code-0.4.0}/tests/test_cli_run_cli.py +0 -0
  37. {aru_code-0.2.0 → aru_code-0.4.0}/tests/test_cli_session.py +0 -0
  38. {aru_code-0.2.0 → aru_code-0.4.0}/tests/test_cli_shell.py +0 -0
  39. {aru_code-0.2.0 → aru_code-0.4.0}/tests/test_codebase.py +0 -0
  40. {aru_code-0.2.0 → aru_code-0.4.0}/tests/test_config.py +0 -0
  41. {aru_code-0.2.0 → aru_code-0.4.0}/tests/test_context.py +0 -0
  42. {aru_code-0.2.0 → aru_code-0.4.0}/tests/test_executor.py +0 -0
  43. {aru_code-0.2.0 → aru_code-0.4.0}/tests/test_gitignore.py +0 -0
  44. {aru_code-0.2.0 → aru_code-0.4.0}/tests/test_main.py +0 -0
  45. {aru_code-0.2.0 → aru_code-0.4.0}/tests/test_mcp_client.py +0 -0
  46. {aru_code-0.2.0 → aru_code-0.4.0}/tests/test_planner.py +0 -0
  47. {aru_code-0.2.0 → aru_code-0.4.0}/tests/test_providers.py +0 -0
  48. {aru_code-0.2.0 → aru_code-0.4.0}/tests/test_ranker.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: aru-code
3
- Version: 0.2.0
3
+ Version: 0.4.0
4
4
  Summary: A Claude Code clone built with Agno agents
5
5
  Author-email: Estevao <estevaofon@gmail.com>
6
6
  License-Expression: MIT
@@ -11,9 +11,11 @@ Keywords: ai,coding-assistant,claude,cli,agents
11
11
  Classifier: Development Status :: 3 - Alpha
12
12
  Classifier: Environment :: Console
13
13
  Classifier: Intended Audience :: Developers
14
+ Classifier: Programming Language :: Python :: 3.11
15
+ Classifier: Programming Language :: Python :: 3.12
14
16
  Classifier: Programming Language :: Python :: 3.13
15
17
  Classifier: Topic :: Software Development :: Libraries :: Application Frameworks
16
- Requires-Python: >=3.13
18
+ Requires-Python: >=3.11
17
19
  Description-Content-Type: text/markdown
18
20
  License-File: LICENSE
19
21
  Requires-Dist: agno<3,>=2.5.10
@@ -27,6 +29,7 @@ Requires-Dist: tree-sitter>=0.23
27
29
  Requires-Dist: tree-sitter-python>=0.23
28
30
  Requires-Dist: mcp>=1.0
29
31
  Requires-Dist: openai>=2.29.0
32
+ Requires-Dist: pytest-asyncio>=1.3.0
30
33
  Provides-Extra: dev
31
34
  Requires-Dist: pytest>=8.0; extra == "dev"
32
35
  Requires-Dist: pytest-asyncio>=0.23; extra == "dev"
@@ -45,10 +48,8 @@ Dynamic: license-file
45
48
  # aru
46
49
 
47
50
  An intelligent coding assistant for the terminal, powered by LLMs and [Agno](https://github.com/agno-agi/agno) agents.
48
- </br></br>
49
- <img width="600" alt="image" src="https://github.com/user-attachments/assets/36001faa-3163-4374-84fd-da8704a4ed9d" />
50
-
51
51
 
52
+ ![0329(3)](https://github.com/user-attachments/assets/e84d5139-ebaa-4d12-bbae-628fae7dbc7a)
52
53
 
53
54
  ## Highlights
54
55
 
@@ -142,6 +143,7 @@ By default, aru uses **Claude Sonnet 4.6** (Anthropic). You can switch to any su
142
143
  | **OpenAI** | `/model openai/gpt-4o` | `OPENAI_API_KEY` | `pip install "aru-code[openai]"` |
143
144
  | **Groq** | `/model groq/llama-3.3-70b-versatile` | `GROQ_API_KEY` | `pip install "aru-code[groq]"` |
144
145
  | **OpenRouter** | `/model openrouter/deepseek/deepseek-chat-v3-0324` | `OPENROUTER_API_KEY` | `pip install "aru-code[openai]"` |
146
+ | **MiniMax** | `/model openrouter/minimax/minimax-m2.7` | `OPENROUTER_API_KEY` | `pip install "aru-code[openai]"` |
145
147
 
146
148
  To install all providers at once:
147
149
 
@@ -167,9 +169,10 @@ You can set the default provider/model in `aru.json` so you don't need to switch
167
169
 
168
170
  ```json
169
171
  {
170
- "models": {
171
- "default": "openrouter/deepseek/deepseek-chat-v3-0324",
172
+ "default_model": "openrouter/minimax/minimax-m2.7",
173
+ "model_aliases": {
172
174
  "minimax": "openrouter/minimax/minimax-m2.5",
175
+ "minimax-m2.7": "openrouter/minimax/minimax-m2.7",
173
176
  "deepseek-v3": "openrouter/deepseek/deepseek-chat-v3-0324",
174
177
  "sonnet-4-6": "anthropic/claude-sonnet-4-6",
175
178
  "opus-4-6": "anthropic/claude-opus-4-6"
@@ -177,7 +180,7 @@ You can set the default provider/model in `aru.json` so you don't need to switch
177
180
  }
178
181
  ```
179
182
 
180
- The `default` field sets the main model. The other fields are aliases that can be used with `/model <alias>`.
183
+ The `default_model` field sets the main model. The `model_aliases` are shortcuts that can be used with `/model <alias>`.
181
184
 
182
185
  #### Custom providers
183
186
 
@@ -188,12 +191,13 @@ You can configure custom providers with specific token limits:
188
191
  "providers": {
189
192
  "deepseek": {
190
193
  "models": {
191
- "deepseek-chat-v3-0324": {"id": "deepseek-chat-v3-0324", "max_tokens": 16384}
194
+ "deepseek-chat-v3-0324": { "max_tokens": 16384 }
192
195
  }
193
196
  },
194
197
  "openrouter": {
195
198
  "models": {
196
- "minimax/minimax-m2.5": {"id": "minimax/minimax-m2.5", "max_tokens": 65536}
199
+ "minimax/minimax-m2.5": { "max_tokens": 65536 },
200
+ "minimax/minimax-m2.7": { "max_tokens": 131072 }
197
201
  }
198
202
  }
199
203
  }
@@ -1,10 +1,8 @@
1
1
  # aru
2
2
 
3
3
  An intelligent coding assistant for the terminal, powered by LLMs and [Agno](https://github.com/agno-agi/agno) agents.
4
- </br></br>
5
- <img width="600" alt="image" src="https://github.com/user-attachments/assets/36001faa-3163-4374-84fd-da8704a4ed9d" />
6
-
7
4
 
5
+ ![0329(3)](https://github.com/user-attachments/assets/e84d5139-ebaa-4d12-bbae-628fae7dbc7a)
8
6
 
9
7
  ## Highlights
10
8
 
@@ -98,6 +96,7 @@ By default, aru uses **Claude Sonnet 4.6** (Anthropic). You can switch to any su
98
96
  | **OpenAI** | `/model openai/gpt-4o` | `OPENAI_API_KEY` | `pip install "aru-code[openai]"` |
99
97
  | **Groq** | `/model groq/llama-3.3-70b-versatile` | `GROQ_API_KEY` | `pip install "aru-code[groq]"` |
100
98
  | **OpenRouter** | `/model openrouter/deepseek/deepseek-chat-v3-0324` | `OPENROUTER_API_KEY` | `pip install "aru-code[openai]"` |
99
+ | **MiniMax** | `/model openrouter/minimax/minimax-m2.7` | `OPENROUTER_API_KEY` | `pip install "aru-code[openai]"` |
101
100
 
102
101
  To install all providers at once:
103
102
 
@@ -123,9 +122,10 @@ You can set the default provider/model in `aru.json` so you don't need to switch
123
122
 
124
123
  ```json
125
124
  {
126
- "models": {
127
- "default": "openrouter/deepseek/deepseek-chat-v3-0324",
125
+ "default_model": "openrouter/minimax/minimax-m2.7",
126
+ "model_aliases": {
128
127
  "minimax": "openrouter/minimax/minimax-m2.5",
128
+ "minimax-m2.7": "openrouter/minimax/minimax-m2.7",
129
129
  "deepseek-v3": "openrouter/deepseek/deepseek-chat-v3-0324",
130
130
  "sonnet-4-6": "anthropic/claude-sonnet-4-6",
131
131
  "opus-4-6": "anthropic/claude-opus-4-6"
@@ -133,7 +133,7 @@ You can set the default provider/model in `aru.json` so you don't need to switch
133
133
  }
134
134
  ```
135
135
 
136
- The `default` field sets the main model. The other fields are aliases that can be used with `/model <alias>`.
136
+ The `default_model` field sets the main model. The `model_aliases` are shortcuts that can be used with `/model <alias>`.
137
137
 
138
138
  #### Custom providers
139
139
 
@@ -144,12 +144,13 @@ You can configure custom providers with specific token limits:
144
144
  "providers": {
145
145
  "deepseek": {
146
146
  "models": {
147
- "deepseek-chat-v3-0324": {"id": "deepseek-chat-v3-0324", "max_tokens": 16384}
147
+ "deepseek-chat-v3-0324": { "max_tokens": 16384 }
148
148
  }
149
149
  },
150
150
  "openrouter": {
151
151
  "models": {
152
- "minimax/minimax-m2.5": {"id": "minimax/minimax-m2.5", "max_tokens": 65536}
152
+ "minimax/minimax-m2.5": { "max_tokens": 65536 },
153
+ "minimax/minimax-m2.7": { "max_tokens": 131072 }
153
154
  }
154
155
  }
155
156
  }
@@ -0,0 +1 @@
1
+ __version__ = "0.4.0"
@@ -1,5 +1,7 @@
1
1
  """Interactive CLI for aru - a Claude Code clone."""
2
2
 
3
+ from __future__ import annotations
4
+
3
5
  import asyncio
4
6
  import hashlib
5
7
  import json
@@ -1687,7 +1689,7 @@ async def run_cli(skip_permissions: bool = False, resume_id: str | None = None):
1687
1689
  """Sync the model IDs to the tools module from the session's model_ref."""
1688
1690
  set_model_id(sess.model_id)
1689
1691
  # Determine small model for sub-agents based on provider
1690
- small_ref = config.model_defaults.get("small") if config else None
1692
+ small_ref = config.model_aliases.get("small") if config else None
1691
1693
  if not small_ref:
1692
1694
  provider_key, _ = resolve_model_ref(sess.model_ref)
1693
1695
  # Use same provider but pick a small/fast model
@@ -1740,8 +1742,8 @@ async def run_cli(skip_permissions: bool = False, resume_id: str | None = None):
1740
1742
  else:
1741
1743
  session = Session()
1742
1744
  # Apply default model from config if set
1743
- if config.model_defaults.get("default"):
1744
- session.model_ref = config.model_defaults["default"]
1745
+ if config.default_model:
1746
+ session.model_ref = config.default_model
1745
1747
  _sync_model(session)
1746
1748
  _render_home(session, skip_permissions)
1747
1749
 
@@ -1824,13 +1826,11 @@ async def run_cli(skip_permissions: bool = False, resume_id: str | None = None):
1824
1826
  console.print(f"[bold]Current model:[/bold] {session.model_display} ({session.model_id})")
1825
1827
  console.print()
1826
1828
  # Show model aliases from aru.json
1827
- if config.model_defaults:
1828
- non_default = {k: v for k, v in config.model_defaults.items() if k != "default"}
1829
- if non_default:
1830
- console.print("[bold]Model aliases (aru.json):[/bold]")
1831
- for alias, ref in non_default.items():
1832
- console.print(f" [cyan]{alias}[/cyan] → {ref}")
1833
- console.print()
1829
+ if config.model_aliases:
1830
+ console.print("[bold]Model aliases (aru.json):[/bold]")
1831
+ for alias, ref in config.model_aliases.items():
1832
+ console.print(f" [cyan]{alias}[/cyan] → {ref}")
1833
+ console.print()
1834
1834
  console.print("[bold]Aliases:[/bold]")
1835
1835
  for alias, ref in MODEL_ALIASES.items():
1836
1836
  console.print(f" [cyan]{alias}[/cyan] → {ref}")
@@ -1845,7 +1845,7 @@ async def run_cli(skip_permissions: bool = False, resume_id: str | None = None):
1845
1845
  arg_lower = arg.lower()
1846
1846
  try:
1847
1847
  # Resolve config aliases (aru.json "models" section) first
1848
- resolved_ref = config.model_defaults.get(arg_lower, arg_lower) if config.model_defaults else arg_lower
1848
+ resolved_ref = config.model_aliases.get(arg_lower, arg_lower) if config.model_aliases else arg_lower
1849
1849
  # Validate the model reference resolves to a known provider
1850
1850
  provider_key, model_name = resolve_model_ref(resolved_ref)
1851
1851
  from aru.providers import get_provider
@@ -8,6 +8,8 @@ Supports:
8
8
  Follows the Gemini .agents convention for cross-platform compatibility.
9
9
  """
10
10
 
11
+ from __future__ import annotations
12
+
11
13
  import json
12
14
  import os
13
15
  from dataclasses import dataclass, field
@@ -44,7 +46,8 @@ class AgentConfig:
44
46
  commands: dict[str, CustomCommand] = field(default_factory=dict)
45
47
  skills: dict[str, Skill] = field(default_factory=dict)
46
48
  permissions: dict[str, Any] = field(default_factory=dict)
47
- model_defaults: dict[str, str] = field(default_factory=dict)
49
+ default_model: str | None = None
50
+ model_aliases: dict[str, str] = field(default_factory=dict)
48
51
  plan_reviewer: bool = True
49
52
 
50
53
  @property
@@ -211,12 +214,14 @@ def load_config(cwd: str | None = None) -> AgentConfig:
211
214
  if "permission" in data:
212
215
  config.permissions = data["permission"]
213
216
  # Load provider configuration
214
- if "providers" in data or "models" in data:
217
+ if "providers" in data:
215
218
  from aru.providers import load_providers_from_config
216
219
  load_providers_from_config(data)
217
- # Store model defaults for CLI
218
- if "models" in data and isinstance(data["models"], dict):
219
- config.model_defaults = data["models"]
220
+ # Store default model and aliases for CLI
221
+ if "default_model" in data:
222
+ config.default_model = data["default_model"]
223
+ if "model_aliases" in data and isinstance(data["model_aliases"], dict):
224
+ config.model_aliases = data["model_aliases"]
220
225
  if "plan_reviewer" in data:
221
226
  config.plan_reviewer = bool(data["plan_reviewer"])
222
227
  break
@@ -141,6 +141,11 @@ def load_providers_from_config(config_data: dict[str, Any]):
141
141
 
142
142
  Expected format in aru.json:
143
143
  {
144
+ "default_model": "anthropic/claude-sonnet-4-5",
145
+ "model_aliases": {
146
+ "small": "anthropic/claude-haiku-4-5",
147
+ "deepseek-v3": "openrouter/deepseek/deepseek-chat-v3-0324"
148
+ },
144
149
  "providers": {
145
150
  "ollama": {
146
151
  "base_url": "http://localhost:11434",
@@ -157,10 +162,6 @@ def load_providers_from_config(config_data: dict[str, Any]):
157
162
  "my-model": {"id": "my-model-v1"}
158
163
  }
159
164
  }
160
- },
161
- "models": {
162
- "default": "anthropic/claude-sonnet-4-5",
163
- "small": "anthropic/claude-haiku-4-5"
164
165
  }
165
166
  }
166
167
  """
@@ -1,5 +1,7 @@
1
1
  """AST-based code analysis tools using tree-sitter."""
2
2
 
3
+ from __future__ import annotations
4
+
3
5
  import os
4
6
  import re
5
7
  from typing import Any
@@ -1,5 +1,7 @@
1
1
  """Gitignore-aware file filtering for codebase operations."""
2
2
 
3
+ from __future__ import annotations
4
+
3
5
  import os
4
6
  from typing import Iterator
5
7
 
@@ -1,5 +1,7 @@
1
1
  """Model Context Protocol (MCP) client manager and tool generation."""
2
2
 
3
+ from __future__ import annotations
4
+
3
5
  import asyncio
4
6
  import json
5
7
  import os
@@ -5,6 +5,8 @@ to plan and track subtasks within each plan step. Inspired by Claude Code
5
5
  and Antigravity's task management approach.
6
6
  """
7
7
 
8
+ from __future__ import annotations
9
+
8
10
  import threading
9
11
 
10
12
  from rich.console import Console, Group
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: aru-code
3
- Version: 0.2.0
3
+ Version: 0.4.0
4
4
  Summary: A Claude Code clone built with Agno agents
5
5
  Author-email: Estevao <estevaofon@gmail.com>
6
6
  License-Expression: MIT
@@ -11,9 +11,11 @@ Keywords: ai,coding-assistant,claude,cli,agents
11
11
  Classifier: Development Status :: 3 - Alpha
12
12
  Classifier: Environment :: Console
13
13
  Classifier: Intended Audience :: Developers
14
+ Classifier: Programming Language :: Python :: 3.11
15
+ Classifier: Programming Language :: Python :: 3.12
14
16
  Classifier: Programming Language :: Python :: 3.13
15
17
  Classifier: Topic :: Software Development :: Libraries :: Application Frameworks
16
- Requires-Python: >=3.13
18
+ Requires-Python: >=3.11
17
19
  Description-Content-Type: text/markdown
18
20
  License-File: LICENSE
19
21
  Requires-Dist: agno<3,>=2.5.10
@@ -27,6 +29,7 @@ Requires-Dist: tree-sitter>=0.23
27
29
  Requires-Dist: tree-sitter-python>=0.23
28
30
  Requires-Dist: mcp>=1.0
29
31
  Requires-Dist: openai>=2.29.0
32
+ Requires-Dist: pytest-asyncio>=1.3.0
30
33
  Provides-Extra: dev
31
34
  Requires-Dist: pytest>=8.0; extra == "dev"
32
35
  Requires-Dist: pytest-asyncio>=0.23; extra == "dev"
@@ -45,10 +48,8 @@ Dynamic: license-file
45
48
  # aru
46
49
 
47
50
  An intelligent coding assistant for the terminal, powered by LLMs and [Agno](https://github.com/agno-agi/agno) agents.
48
- </br></br>
49
- <img width="600" alt="image" src="https://github.com/user-attachments/assets/36001faa-3163-4374-84fd-da8704a4ed9d" />
50
-
51
51
 
52
+ ![0329(3)](https://github.com/user-attachments/assets/e84d5139-ebaa-4d12-bbae-628fae7dbc7a)
52
53
 
53
54
  ## Highlights
54
55
 
@@ -142,6 +143,7 @@ By default, aru uses **Claude Sonnet 4.6** (Anthropic). You can switch to any su
142
143
  | **OpenAI** | `/model openai/gpt-4o` | `OPENAI_API_KEY` | `pip install "aru-code[openai]"` |
143
144
  | **Groq** | `/model groq/llama-3.3-70b-versatile` | `GROQ_API_KEY` | `pip install "aru-code[groq]"` |
144
145
  | **OpenRouter** | `/model openrouter/deepseek/deepseek-chat-v3-0324` | `OPENROUTER_API_KEY` | `pip install "aru-code[openai]"` |
146
+ | **MiniMax** | `/model openrouter/minimax/minimax-m2.7` | `OPENROUTER_API_KEY` | `pip install "aru-code[openai]"` |
145
147
 
146
148
  To install all providers at once:
147
149
 
@@ -167,9 +169,10 @@ You can set the default provider/model in `aru.json` so you don't need to switch
167
169
 
168
170
  ```json
169
171
  {
170
- "models": {
171
- "default": "openrouter/deepseek/deepseek-chat-v3-0324",
172
+ "default_model": "openrouter/minimax/minimax-m2.7",
173
+ "model_aliases": {
172
174
  "minimax": "openrouter/minimax/minimax-m2.5",
175
+ "minimax-m2.7": "openrouter/minimax/minimax-m2.7",
173
176
  "deepseek-v3": "openrouter/deepseek/deepseek-chat-v3-0324",
174
177
  "sonnet-4-6": "anthropic/claude-sonnet-4-6",
175
178
  "opus-4-6": "anthropic/claude-opus-4-6"
@@ -177,7 +180,7 @@ You can set the default provider/model in `aru.json` so you don't need to switch
177
180
  }
178
181
  ```
179
182
 
180
- The `default` field sets the main model. The other fields are aliases that can be used with `/model <alias>`.
183
+ The `default_model` field sets the main model. The `model_aliases` are shortcuts that can be used with `/model <alias>`.
181
184
 
182
185
  #### Custom providers
183
186
 
@@ -188,12 +191,13 @@ You can configure custom providers with specific token limits:
188
191
  "providers": {
189
192
  "deepseek": {
190
193
  "models": {
191
- "deepseek-chat-v3-0324": {"id": "deepseek-chat-v3-0324", "max_tokens": 16384}
194
+ "deepseek-chat-v3-0324": { "max_tokens": 16384 }
192
195
  }
193
196
  },
194
197
  "openrouter": {
195
198
  "models": {
196
- "minimax/minimax-m2.5": {"id": "minimax/minimax-m2.5", "max_tokens": 65536}
199
+ "minimax/minimax-m2.5": { "max_tokens": 65536 },
200
+ "minimax/minimax-m2.7": { "max_tokens": 131072 }
197
201
  }
198
202
  }
199
203
  }
@@ -9,6 +9,7 @@ tree-sitter>=0.23
9
9
  tree-sitter-python>=0.23
10
10
  mcp>=1.0
11
11
  openai>=2.29.0
12
+ pytest-asyncio>=1.3.0
12
13
 
13
14
  [all-providers]
14
15
  openai>=1.0
@@ -1,80 +1,83 @@
1
- [build-system]
2
- requires = ["setuptools>=75.0", "wheel"]
3
- build-backend = "setuptools.build_meta"
4
-
5
- [project]
6
- name = "aru-code"
7
- version = "0.2.0"
8
- description = "A Claude Code clone built with Agno agents"
9
- readme = "README.md"
10
- license = "MIT"
11
- requires-python = ">=3.13"
12
- authors = [
13
- { name = "Estevao", email = "estevaofon@gmail.com" },
14
- ]
15
- keywords = ["ai", "coding-assistant", "claude", "cli", "agents"]
16
- classifiers = [
17
- "Development Status :: 3 - Alpha",
18
- "Environment :: Console",
19
- "Intended Audience :: Developers",
20
- "Programming Language :: Python :: 3.13",
21
- "Topic :: Software Development :: Libraries :: Application Frameworks",
22
- ]
23
-
24
- dependencies = [
25
- "agno>=2.5.10,<3",
26
- "anthropic",
27
- "httpx",
28
- "pathspec>=0.12",
29
- "python-dotenv>=1.2.2",
30
- "prompt-toolkit>=3.0",
31
- "rich",
32
- "tree-sitter>=0.23",
33
- "tree-sitter-python>=0.23",
34
- "mcp>=1.0",
35
- "openai>=2.29.0",
36
- ]
37
-
38
- [project.urls]
39
- Homepage = "https://github.com/estevaofon/aru"
40
- Repository = "https://github.com/estevaofon/aru"
41
- Issues = "https://github.com/estevaofon/aru/issues"
42
-
43
- [project.optional-dependencies]
44
- dev = [
45
- "pytest>=8.0",
46
- "pytest-asyncio>=0.23",
47
- ]
48
- openai = ["openai>=1.0"]
49
- ollama = ["ollama>=0.4"]
50
- groq = ["groq>=0.4"]
51
- all-providers = [
52
- "openai>=1.0",
53
- "ollama>=0.4",
54
- "groq>=0.4",
55
- ]
56
-
57
- [project.scripts]
58
- aru = "aru.cli:main"
59
-
60
- [tool.pytest.ini_options]
61
- testpaths = ["tests"]
62
- python_files = ["test_*.py"]
63
- python_classes = ["Test*"]
64
- python_functions = ["test_*"]
65
- asyncio_mode = "auto"
66
- asyncio_default_fixture_loop_scope = "function"
67
- addopts = [
68
- "-v",
69
- "--strict-markers",
70
- "--tb=short",
71
- ]
72
- markers = [
73
- "slow: marks tests as slow (deselect with '-m \"not slow\"')",
74
- "integration: marks tests as integration tests",
75
- ]
76
-
77
- [dependency-groups]
78
- dev = [
79
- "pytest-cov>=7.1.0",
80
- ]
1
+ [build-system]
2
+ requires = ["setuptools>=75.0", "wheel"]
3
+ build-backend = "setuptools.build_meta"
4
+
5
+ [project]
6
+ name = "aru-code"
7
+ version = "0.4.0"
8
+ description = "A Claude Code clone built with Agno agents"
9
+ readme = "README.md"
10
+ license = "MIT"
11
+ requires-python = ">=3.11"
12
+ authors = [
13
+ { name = "Estevao", email = "estevaofon@gmail.com" },
14
+ ]
15
+ keywords = ["ai", "coding-assistant", "claude", "cli", "agents"]
16
+ classifiers = [
17
+ "Development Status :: 3 - Alpha",
18
+ "Environment :: Console",
19
+ "Intended Audience :: Developers",
20
+ "Programming Language :: Python :: 3.11",
21
+ "Programming Language :: Python :: 3.12",
22
+ "Programming Language :: Python :: 3.13",
23
+ "Topic :: Software Development :: Libraries :: Application Frameworks",
24
+ ]
25
+
26
+ dependencies = [
27
+ "agno>=2.5.10,<3",
28
+ "anthropic",
29
+ "httpx",
30
+ "pathspec>=0.12",
31
+ "python-dotenv>=1.2.2",
32
+ "prompt-toolkit>=3.0",
33
+ "rich",
34
+ "tree-sitter>=0.23",
35
+ "tree-sitter-python>=0.23",
36
+ "mcp>=1.0",
37
+ "openai>=2.29.0",
38
+ "pytest-asyncio>=1.3.0",
39
+ ]
40
+
41
+ [project.urls]
42
+ Homepage = "https://github.com/estevaofon/aru"
43
+ Repository = "https://github.com/estevaofon/aru"
44
+ Issues = "https://github.com/estevaofon/aru/issues"
45
+
46
+ [project.optional-dependencies]
47
+ dev = [
48
+ "pytest>=8.0",
49
+ "pytest-asyncio>=0.23",
50
+ ]
51
+ openai = ["openai>=1.0"]
52
+ ollama = ["ollama>=0.4"]
53
+ groq = ["groq>=0.4"]
54
+ all-providers = [
55
+ "openai>=1.0",
56
+ "ollama>=0.4",
57
+ "groq>=0.4",
58
+ ]
59
+
60
+ [project.scripts]
61
+ aru = "aru.cli:main"
62
+
63
+ [tool.pytest.ini_options]
64
+ testpaths = ["tests"]
65
+ python_files = ["test_*.py"]
66
+ python_classes = ["Test*"]
67
+ python_functions = ["test_*"]
68
+ asyncio_mode = "auto"
69
+ asyncio_default_fixture_loop_scope = "function"
70
+ addopts = [
71
+ "-v",
72
+ "--strict-markers",
73
+ "--tb=short",
74
+ ]
75
+ markers = [
76
+ "slow: marks tests as slow (deselect with '-m \"not slow\"')",
77
+ "integration: marks tests as integration tests",
78
+ ]
79
+
80
+ [dependency-groups]
81
+ dev = [
82
+ "pytest-cov>=7.1.0",
83
+ ]
@@ -1 +0,0 @@
1
- __version__ = "0.1.0"
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes