aru-code 0.3.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.3.0 → aru_code-0.4.0}/PKG-INFO +11 -13
  2. {aru_code-0.3.0 → aru_code-0.4.0}/README.md +9 -12
  3. aru_code-0.4.0/aru/__init__.py +1 -0
  4. {aru_code-0.3.0 → aru_code-0.4.0}/aru/cli.py +9 -11
  5. {aru_code-0.3.0 → aru_code-0.4.0}/aru/config.py +8 -5
  6. {aru_code-0.3.0 → aru_code-0.4.0}/aru/providers.py +5 -4
  7. {aru_code-0.3.0 → aru_code-0.4.0}/aru_code.egg-info/PKG-INFO +11 -13
  8. {aru_code-0.3.0 → aru_code-0.4.0}/aru_code.egg-info/requires.txt +1 -0
  9. {aru_code-0.3.0 → aru_code-0.4.0}/pyproject.toml +83 -82
  10. aru_code-0.3.0/aru/__init__.py +0 -1
  11. {aru_code-0.3.0 → aru_code-0.4.0}/LICENSE +0 -0
  12. {aru_code-0.3.0 → aru_code-0.4.0}/aru/agents/__init__.py +0 -0
  13. {aru_code-0.3.0 → aru_code-0.4.0}/aru/agents/base.py +0 -0
  14. {aru_code-0.3.0 → aru_code-0.4.0}/aru/agents/executor.py +0 -0
  15. {aru_code-0.3.0 → aru_code-0.4.0}/aru/agents/planner.py +0 -0
  16. {aru_code-0.3.0 → aru_code-0.4.0}/aru/context.py +0 -0
  17. {aru_code-0.3.0 → aru_code-0.4.0}/aru/tools/__init__.py +0 -0
  18. {aru_code-0.3.0 → aru_code-0.4.0}/aru/tools/ast_tools.py +0 -0
  19. {aru_code-0.3.0 → aru_code-0.4.0}/aru/tools/codebase.py +0 -0
  20. {aru_code-0.3.0 → aru_code-0.4.0}/aru/tools/gitignore.py +0 -0
  21. {aru_code-0.3.0 → aru_code-0.4.0}/aru/tools/mcp_client.py +0 -0
  22. {aru_code-0.3.0 → aru_code-0.4.0}/aru/tools/ranker.py +0 -0
  23. {aru_code-0.3.0 → aru_code-0.4.0}/aru/tools/tasklist.py +0 -0
  24. {aru_code-0.3.0 → aru_code-0.4.0}/aru_code.egg-info/SOURCES.txt +0 -0
  25. {aru_code-0.3.0 → aru_code-0.4.0}/aru_code.egg-info/dependency_links.txt +0 -0
  26. {aru_code-0.3.0 → aru_code-0.4.0}/aru_code.egg-info/entry_points.txt +0 -0
  27. {aru_code-0.3.0 → aru_code-0.4.0}/aru_code.egg-info/top_level.txt +0 -0
  28. {aru_code-0.3.0 → aru_code-0.4.0}/setup.cfg +0 -0
  29. {aru_code-0.3.0 → aru_code-0.4.0}/tests/test_agents_base.py +0 -0
  30. {aru_code-0.3.0 → aru_code-0.4.0}/tests/test_ast_tools.py +0 -0
  31. {aru_code-0.3.0 → aru_code-0.4.0}/tests/test_cli.py +0 -0
  32. {aru_code-0.3.0 → aru_code-0.4.0}/tests/test_cli_advanced.py +0 -0
  33. {aru_code-0.3.0 → aru_code-0.4.0}/tests/test_cli_base.py +0 -0
  34. {aru_code-0.3.0 → aru_code-0.4.0}/tests/test_cli_completers.py +0 -0
  35. {aru_code-0.3.0 → aru_code-0.4.0}/tests/test_cli_new.py +0 -0
  36. {aru_code-0.3.0 → aru_code-0.4.0}/tests/test_cli_run_cli.py +0 -0
  37. {aru_code-0.3.0 → aru_code-0.4.0}/tests/test_cli_session.py +0 -0
  38. {aru_code-0.3.0 → aru_code-0.4.0}/tests/test_cli_shell.py +0 -0
  39. {aru_code-0.3.0 → aru_code-0.4.0}/tests/test_codebase.py +0 -0
  40. {aru_code-0.3.0 → aru_code-0.4.0}/tests/test_config.py +0 -0
  41. {aru_code-0.3.0 → aru_code-0.4.0}/tests/test_context.py +0 -0
  42. {aru_code-0.3.0 → aru_code-0.4.0}/tests/test_executor.py +0 -0
  43. {aru_code-0.3.0 → aru_code-0.4.0}/tests/test_gitignore.py +0 -0
  44. {aru_code-0.3.0 → aru_code-0.4.0}/tests/test_main.py +0 -0
  45. {aru_code-0.3.0 → aru_code-0.4.0}/tests/test_mcp_client.py +0 -0
  46. {aru_code-0.3.0 → aru_code-0.4.0}/tests/test_planner.py +0 -0
  47. {aru_code-0.3.0 → aru_code-0.4.0}/tests/test_providers.py +0 -0
  48. {aru_code-0.3.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.3.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
@@ -29,6 +29,7 @@ Requires-Dist: tree-sitter>=0.23
29
29
  Requires-Dist: tree-sitter-python>=0.23
30
30
  Requires-Dist: mcp>=1.0
31
31
  Requires-Dist: openai>=2.29.0
32
+ Requires-Dist: pytest-asyncio>=1.3.0
32
33
  Provides-Extra: dev
33
34
  Requires-Dist: pytest>=8.0; extra == "dev"
34
35
  Requires-Dist: pytest-asyncio>=0.23; extra == "dev"
@@ -47,14 +48,8 @@ Dynamic: license-file
47
48
  # aru
48
49
 
49
50
  An intelligent coding assistant for the terminal, powered by LLMs and [Agno](https://github.com/agno-agi/agno) agents.
50
- </br></br>
51
- <img width="600" alt="image" src="https://github.com/user-attachments/assets/36001faa-3163-4374-84fd-da8704a4ed9d" />
52
-
53
-
54
-
55
- https://github.com/user-attachments/assets/17674bfc-3d49-4e25-bdc7-dc445d5a089d
56
-
57
51
 
52
+ ![0329(3)](https://github.com/user-attachments/assets/e84d5139-ebaa-4d12-bbae-628fae7dbc7a)
58
53
 
59
54
  ## Highlights
60
55
 
@@ -148,6 +143,7 @@ By default, aru uses **Claude Sonnet 4.6** (Anthropic). You can switch to any su
148
143
  | **OpenAI** | `/model openai/gpt-4o` | `OPENAI_API_KEY` | `pip install "aru-code[openai]"` |
149
144
  | **Groq** | `/model groq/llama-3.3-70b-versatile` | `GROQ_API_KEY` | `pip install "aru-code[groq]"` |
150
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]"` |
151
147
 
152
148
  To install all providers at once:
153
149
 
@@ -173,9 +169,10 @@ You can set the default provider/model in `aru.json` so you don't need to switch
173
169
 
174
170
  ```json
175
171
  {
176
- "models": {
177
- "default": "openrouter/deepseek/deepseek-chat-v3-0324",
172
+ "default_model": "openrouter/minimax/minimax-m2.7",
173
+ "model_aliases": {
178
174
  "minimax": "openrouter/minimax/minimax-m2.5",
175
+ "minimax-m2.7": "openrouter/minimax/minimax-m2.7",
179
176
  "deepseek-v3": "openrouter/deepseek/deepseek-chat-v3-0324",
180
177
  "sonnet-4-6": "anthropic/claude-sonnet-4-6",
181
178
  "opus-4-6": "anthropic/claude-opus-4-6"
@@ -183,7 +180,7 @@ You can set the default provider/model in `aru.json` so you don't need to switch
183
180
  }
184
181
  ```
185
182
 
186
- 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>`.
187
184
 
188
185
  #### Custom providers
189
186
 
@@ -194,12 +191,13 @@ You can configure custom providers with specific token limits:
194
191
  "providers": {
195
192
  "deepseek": {
196
193
  "models": {
197
- "deepseek-chat-v3-0324": {"id": "deepseek-chat-v3-0324", "max_tokens": 16384}
194
+ "deepseek-chat-v3-0324": { "max_tokens": 16384 }
198
195
  }
199
196
  },
200
197
  "openrouter": {
201
198
  "models": {
202
- "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 }
203
201
  }
204
202
  }
205
203
  }
@@ -1,14 +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
-
8
-
9
- https://github.com/user-attachments/assets/17674bfc-3d49-4e25-bdc7-dc445d5a089d
10
-
11
4
 
5
+ ![0329(3)](https://github.com/user-attachments/assets/e84d5139-ebaa-4d12-bbae-628fae7dbc7a)
12
6
 
13
7
  ## Highlights
14
8
 
@@ -102,6 +96,7 @@ By default, aru uses **Claude Sonnet 4.6** (Anthropic). You can switch to any su
102
96
  | **OpenAI** | `/model openai/gpt-4o` | `OPENAI_API_KEY` | `pip install "aru-code[openai]"` |
103
97
  | **Groq** | `/model groq/llama-3.3-70b-versatile` | `GROQ_API_KEY` | `pip install "aru-code[groq]"` |
104
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]"` |
105
100
 
106
101
  To install all providers at once:
107
102
 
@@ -127,9 +122,10 @@ You can set the default provider/model in `aru.json` so you don't need to switch
127
122
 
128
123
  ```json
129
124
  {
130
- "models": {
131
- "default": "openrouter/deepseek/deepseek-chat-v3-0324",
125
+ "default_model": "openrouter/minimax/minimax-m2.7",
126
+ "model_aliases": {
132
127
  "minimax": "openrouter/minimax/minimax-m2.5",
128
+ "minimax-m2.7": "openrouter/minimax/minimax-m2.7",
133
129
  "deepseek-v3": "openrouter/deepseek/deepseek-chat-v3-0324",
134
130
  "sonnet-4-6": "anthropic/claude-sonnet-4-6",
135
131
  "opus-4-6": "anthropic/claude-opus-4-6"
@@ -137,7 +133,7 @@ You can set the default provider/model in `aru.json` so you don't need to switch
137
133
  }
138
134
  ```
139
135
 
140
- 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>`.
141
137
 
142
138
  #### Custom providers
143
139
 
@@ -148,12 +144,13 @@ You can configure custom providers with specific token limits:
148
144
  "providers": {
149
145
  "deepseek": {
150
146
  "models": {
151
- "deepseek-chat-v3-0324": {"id": "deepseek-chat-v3-0324", "max_tokens": 16384}
147
+ "deepseek-chat-v3-0324": { "max_tokens": 16384 }
152
148
  }
153
149
  },
154
150
  "openrouter": {
155
151
  "models": {
156
- "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 }
157
154
  }
158
155
  }
159
156
  }
@@ -0,0 +1 @@
1
+ __version__ = "0.4.0"
@@ -1689,7 +1689,7 @@ async def run_cli(skip_permissions: bool = False, resume_id: str | None = None):
1689
1689
  """Sync the model IDs to the tools module from the session's model_ref."""
1690
1690
  set_model_id(sess.model_id)
1691
1691
  # Determine small model for sub-agents based on provider
1692
- small_ref = config.model_defaults.get("small") if config else None
1692
+ small_ref = config.model_aliases.get("small") if config else None
1693
1693
  if not small_ref:
1694
1694
  provider_key, _ = resolve_model_ref(sess.model_ref)
1695
1695
  # Use same provider but pick a small/fast model
@@ -1742,8 +1742,8 @@ async def run_cli(skip_permissions: bool = False, resume_id: str | None = None):
1742
1742
  else:
1743
1743
  session = Session()
1744
1744
  # Apply default model from config if set
1745
- if config.model_defaults.get("default"):
1746
- session.model_ref = config.model_defaults["default"]
1745
+ if config.default_model:
1746
+ session.model_ref = config.default_model
1747
1747
  _sync_model(session)
1748
1748
  _render_home(session, skip_permissions)
1749
1749
 
@@ -1826,13 +1826,11 @@ async def run_cli(skip_permissions: bool = False, resume_id: str | None = None):
1826
1826
  console.print(f"[bold]Current model:[/bold] {session.model_display} ({session.model_id})")
1827
1827
  console.print()
1828
1828
  # Show model aliases from aru.json
1829
- if config.model_defaults:
1830
- non_default = {k: v for k, v in config.model_defaults.items() if k != "default"}
1831
- if non_default:
1832
- console.print("[bold]Model aliases (aru.json):[/bold]")
1833
- for alias, ref in non_default.items():
1834
- console.print(f" [cyan]{alias}[/cyan] → {ref}")
1835
- 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()
1836
1834
  console.print("[bold]Aliases:[/bold]")
1837
1835
  for alias, ref in MODEL_ALIASES.items():
1838
1836
  console.print(f" [cyan]{alias}[/cyan] → {ref}")
@@ -1847,7 +1845,7 @@ async def run_cli(skip_permissions: bool = False, resume_id: str | None = None):
1847
1845
  arg_lower = arg.lower()
1848
1846
  try:
1849
1847
  # Resolve config aliases (aru.json "models" section) first
1850
- 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
1851
1849
  # Validate the model reference resolves to a known provider
1852
1850
  provider_key, model_name = resolve_model_ref(resolved_ref)
1853
1851
  from aru.providers import get_provider
@@ -46,7 +46,8 @@ class AgentConfig:
46
46
  commands: dict[str, CustomCommand] = field(default_factory=dict)
47
47
  skills: dict[str, Skill] = field(default_factory=dict)
48
48
  permissions: dict[str, Any] = field(default_factory=dict)
49
- 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)
50
51
  plan_reviewer: bool = True
51
52
 
52
53
  @property
@@ -213,12 +214,14 @@ def load_config(cwd: str | None = None) -> AgentConfig:
213
214
  if "permission" in data:
214
215
  config.permissions = data["permission"]
215
216
  # Load provider configuration
216
- if "providers" in data or "models" in data:
217
+ if "providers" in data:
217
218
  from aru.providers import load_providers_from_config
218
219
  load_providers_from_config(data)
219
- # Store model defaults for CLI
220
- if "models" in data and isinstance(data["models"], dict):
221
- 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"]
222
225
  if "plan_reviewer" in data:
223
226
  config.plan_reviewer = bool(data["plan_reviewer"])
224
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,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: aru-code
3
- Version: 0.3.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
@@ -29,6 +29,7 @@ Requires-Dist: tree-sitter>=0.23
29
29
  Requires-Dist: tree-sitter-python>=0.23
30
30
  Requires-Dist: mcp>=1.0
31
31
  Requires-Dist: openai>=2.29.0
32
+ Requires-Dist: pytest-asyncio>=1.3.0
32
33
  Provides-Extra: dev
33
34
  Requires-Dist: pytest>=8.0; extra == "dev"
34
35
  Requires-Dist: pytest-asyncio>=0.23; extra == "dev"
@@ -47,14 +48,8 @@ Dynamic: license-file
47
48
  # aru
48
49
 
49
50
  An intelligent coding assistant for the terminal, powered by LLMs and [Agno](https://github.com/agno-agi/agno) agents.
50
- </br></br>
51
- <img width="600" alt="image" src="https://github.com/user-attachments/assets/36001faa-3163-4374-84fd-da8704a4ed9d" />
52
-
53
-
54
-
55
- https://github.com/user-attachments/assets/17674bfc-3d49-4e25-bdc7-dc445d5a089d
56
-
57
51
 
52
+ ![0329(3)](https://github.com/user-attachments/assets/e84d5139-ebaa-4d12-bbae-628fae7dbc7a)
58
53
 
59
54
  ## Highlights
60
55
 
@@ -148,6 +143,7 @@ By default, aru uses **Claude Sonnet 4.6** (Anthropic). You can switch to any su
148
143
  | **OpenAI** | `/model openai/gpt-4o` | `OPENAI_API_KEY` | `pip install "aru-code[openai]"` |
149
144
  | **Groq** | `/model groq/llama-3.3-70b-versatile` | `GROQ_API_KEY` | `pip install "aru-code[groq]"` |
150
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]"` |
151
147
 
152
148
  To install all providers at once:
153
149
 
@@ -173,9 +169,10 @@ You can set the default provider/model in `aru.json` so you don't need to switch
173
169
 
174
170
  ```json
175
171
  {
176
- "models": {
177
- "default": "openrouter/deepseek/deepseek-chat-v3-0324",
172
+ "default_model": "openrouter/minimax/minimax-m2.7",
173
+ "model_aliases": {
178
174
  "minimax": "openrouter/minimax/minimax-m2.5",
175
+ "minimax-m2.7": "openrouter/minimax/minimax-m2.7",
179
176
  "deepseek-v3": "openrouter/deepseek/deepseek-chat-v3-0324",
180
177
  "sonnet-4-6": "anthropic/claude-sonnet-4-6",
181
178
  "opus-4-6": "anthropic/claude-opus-4-6"
@@ -183,7 +180,7 @@ You can set the default provider/model in `aru.json` so you don't need to switch
183
180
  }
184
181
  ```
185
182
 
186
- 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>`.
187
184
 
188
185
  #### Custom providers
189
186
 
@@ -194,12 +191,13 @@ You can configure custom providers with specific token limits:
194
191
  "providers": {
195
192
  "deepseek": {
196
193
  "models": {
197
- "deepseek-chat-v3-0324": {"id": "deepseek-chat-v3-0324", "max_tokens": 16384}
194
+ "deepseek-chat-v3-0324": { "max_tokens": 16384 }
198
195
  }
199
196
  },
200
197
  "openrouter": {
201
198
  "models": {
202
- "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 }
203
201
  }
204
202
  }
205
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,82 +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.3.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
- ]
39
-
40
- [project.urls]
41
- Homepage = "https://github.com/estevaofon/aru"
42
- Repository = "https://github.com/estevaofon/aru"
43
- Issues = "https://github.com/estevaofon/aru/issues"
44
-
45
- [project.optional-dependencies]
46
- dev = [
47
- "pytest>=8.0",
48
- "pytest-asyncio>=0.23",
49
- ]
50
- openai = ["openai>=1.0"]
51
- ollama = ["ollama>=0.4"]
52
- groq = ["groq>=0.4"]
53
- all-providers = [
54
- "openai>=1.0",
55
- "ollama>=0.4",
56
- "groq>=0.4",
57
- ]
58
-
59
- [project.scripts]
60
- aru = "aru.cli:main"
61
-
62
- [tool.pytest.ini_options]
63
- testpaths = ["tests"]
64
- python_files = ["test_*.py"]
65
- python_classes = ["Test*"]
66
- python_functions = ["test_*"]
67
- asyncio_mode = "auto"
68
- asyncio_default_fixture_loop_scope = "function"
69
- addopts = [
70
- "-v",
71
- "--strict-markers",
72
- "--tb=short",
73
- ]
74
- markers = [
75
- "slow: marks tests as slow (deselect with '-m \"not slow\"')",
76
- "integration: marks tests as integration tests",
77
- ]
78
-
79
- [dependency-groups]
80
- dev = [
81
- "pytest-cov>=7.1.0",
82
- ]
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.3.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
File without changes