astra-cli-agent 0.1.0__tar.gz → 0.1.2__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.
- astra_cli_agent-0.1.2/LICENSE +21 -0
- astra_cli_agent-0.1.2/PKG-INFO +207 -0
- astra_cli_agent-0.1.2/README.md +169 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/pyproject.toml +7 -1
- astra_cli_agent-0.1.2/src/astra/__init__.py +8 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/cli/chat.py +3 -2
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/cli/rendering.py +19 -7
- astra_cli_agent-0.1.0/PKG-INFO +0 -130
- astra_cli_agent-0.1.0/README.md +0 -96
- astra_cli_agent-0.1.0/src/astra/__init__.py +0 -1
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/.env.example +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/.github/workflows/ci.yml +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/.github/workflows/release.yml +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/.gitignore +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/HANDOFF.md +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/docs/ARCHITECTURE.md +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/agents/__init__.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/agents/base.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/agents/coder_agent.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/agents/debug_agent.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/agents/docker_agent.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/agents/documentation_agent.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/agents/file_agent.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/agents/git_agent.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/agents/kubernetes_agent.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/agents/mcp_agent.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/agents/memory_agent.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/agents/planner_agent.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/agents/research_agent.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/agents/retrieve_agent.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/agents/reviewer_agent.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/cli/__init__.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/cli/app.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/cli/ingest.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/cli/mcp.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/cli/memory.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/cli/setup.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/cli/single.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/config/__init__.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/config/defaults.yaml +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/config/profiles/.gitkeep +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/core/__init__.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/core/confirm.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/core/events.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/core/exceptions.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/core/graph.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/core/json_stream.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/core/onboarding.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/core/settings.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/core/state.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/llm/__init__.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/llm/cost.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/llm/litellm_client.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/llm/ollama_client.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/llm/provider.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/llm/router.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/memory/__init__.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/memory/chunking.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/memory/embeddings.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/memory/models.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/memory/retriever.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/memory/store.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/memory/vector_store.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/models/__init__.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/models/tool_result.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/prompts/.gitkeep +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/tools/__init__.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/tools/code/__init__.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/tools/code/backend.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/tools/code/tools.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/tools/docker/__init__.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/tools/docker/backend.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/tools/docker/tools.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/tools/filesystem/__init__.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/tools/filesystem/backend.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/tools/filesystem/tools.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/tools/git/__init__.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/tools/git/backend.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/tools/git/tools.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/tools/kubernetes/__init__.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/tools/kubernetes/backend.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/tools/kubernetes/tools.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/tools/mcp/__init__.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/tools/mcp/backend.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/tools/mcp/client.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/tools/mcp/discovery.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/tools/registry.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/tools/shell/__init__.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/tools/shell/backend.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/tools/shell/tools.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/tools/web/__init__.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/tools/web/backend.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/tools/web/tools.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/utils/__init__.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/utils/logging.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/tests/e2e/.gitkeep +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/tests/e2e/test_e2e_live_groq.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/tests/fixtures/mcp_fixture_server.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/tests/integration/.gitkeep +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/tests/integration/_helpers.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/tests/integration/conftest.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/tests/integration/test_cli_ask.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/tests/integration/test_cli_confirm_gate.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/tests/integration/test_cli_ingest_and_retrieval.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/tests/integration/test_cli_mcp.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/tests/integration/test_cli_run_pipeline.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/tests/unit/.gitkeep +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/tests/unit/conftest.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/tests/unit/test_agents.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/tests/unit/test_chat.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/tests/unit/test_chunking.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/tests/unit/test_cli.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/tests/unit/test_code_backend.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/tests/unit/test_code_tools.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/tests/unit/test_docker_agent.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/tests/unit/test_docker_backend.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/tests/unit/test_docker_tools.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/tests/unit/test_file_agent.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/tests/unit/test_filesystem_backend.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/tests/unit/test_filesystem_tools.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/tests/unit/test_git_agent.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/tests/unit/test_git_backend.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/tests/unit/test_git_tools.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/tests/unit/test_graph.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/tests/unit/test_json_stream.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/tests/unit/test_kubernetes_agent.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/tests/unit/test_kubernetes_backend.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/tests/unit/test_kubernetes_tools.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/tests/unit/test_llm_adapters.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/tests/unit/test_llm_cost.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/tests/unit/test_llm_router.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/tests/unit/test_llm_router_streaming.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/tests/unit/test_mcp_agent.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/tests/unit/test_mcp_backend.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/tests/unit/test_mcp_client.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/tests/unit/test_mcp_discovery.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/tests/unit/test_mcp_http_transport.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/tests/unit/test_memory_agent.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/tests/unit/test_memory_store.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/tests/unit/test_onboarding.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/tests/unit/test_rag_e2e.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/tests/unit/test_research_agent.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/tests/unit/test_setup.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/tests/unit/test_shell_backend.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/tests/unit/test_shell_tools.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/tests/unit/test_vector_store.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/tests/unit/test_web_backend.py +0 -0
- {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/tests/unit/test_web_tools.py +0 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Astra CLI contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: astra-cli-agent
|
|
3
|
+
Version: 0.1.2
|
|
4
|
+
Summary: Astra — a terminal AI assistant that understands natural language and drives your dev tools.
|
|
5
|
+
Project-URL: Homepage, https://github.com/Subharjun/astra-cli-agent
|
|
6
|
+
Project-URL: Issues, https://github.com/Subharjun/astra-cli-agent/issues
|
|
7
|
+
Author: Astra CLI contributors
|
|
8
|
+
License: MIT
|
|
9
|
+
License-File: LICENSE
|
|
10
|
+
Keywords: agent,ai,cli,developer-tools,langgraph
|
|
11
|
+
Classifier: Environment :: Console
|
|
12
|
+
Classifier: Intended Audience :: Developers
|
|
13
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
14
|
+
Classifier: Programming Language :: Python :: 3
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
16
|
+
Requires-Python: >=3.12
|
|
17
|
+
Requires-Dist: faiss-cpu>=1.8
|
|
18
|
+
Requires-Dist: httpx>=0.27
|
|
19
|
+
Requires-Dist: langgraph>=0.2
|
|
20
|
+
Requires-Dist: litellm>=1.44
|
|
21
|
+
Requires-Dist: mcp>=1.0
|
|
22
|
+
Requires-Dist: prompt-toolkit>=3.0
|
|
23
|
+
Requires-Dist: pydantic-settings>=2.3
|
|
24
|
+
Requires-Dist: pydantic>=2.7
|
|
25
|
+
Requires-Dist: pyfiglet>=1.0
|
|
26
|
+
Requires-Dist: python-dotenv>=1.0
|
|
27
|
+
Requires-Dist: pyyaml>=6.0
|
|
28
|
+
Requires-Dist: rich>=13.7
|
|
29
|
+
Requires-Dist: sentence-transformers>=3.0
|
|
30
|
+
Requires-Dist: typer>=0.12
|
|
31
|
+
Provides-Extra: dev
|
|
32
|
+
Requires-Dist: mypy>=1.10; extra == 'dev'
|
|
33
|
+
Requires-Dist: pytest-cov>=5.0; extra == 'dev'
|
|
34
|
+
Requires-Dist: pytest>=8.0; extra == 'dev'
|
|
35
|
+
Requires-Dist: ruff>=0.5; extra == 'dev'
|
|
36
|
+
Requires-Dist: types-pyyaml>=6.0; extra == 'dev'
|
|
37
|
+
Description-Content-Type: text/markdown
|
|
38
|
+
|
|
39
|
+
# Astra CLI
|
|
40
|
+
|
|
41
|
+
**A terminal AI assistant that understands natural language and drives your developer
|
|
42
|
+
tools** — git, docker, kubernetes, filesystem, code, shell, web research, and MCP plugins
|
|
43
|
+
— through a multi-agent LangGraph pipeline with local memory, RAG, and multi-provider LLM
|
|
44
|
+
fallback.
|
|
45
|
+
|
|
46
|
+
```
|
|
47
|
+
$ astra "what's the git status here, and run the linter"
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
[](https://pypi.org/project/astra-cli-agent/)
|
|
51
|
+
[](https://pypi.org/project/astra-cli-agent/)
|
|
52
|
+
[](https://github.com/Subharjun/astra-cli-agent/actions/workflows/ci.yml)
|
|
53
|
+
[](LICENSE)
|
|
54
|
+
|
|
55
|
+
---
|
|
56
|
+
|
|
57
|
+
## What it does
|
|
58
|
+
|
|
59
|
+
Every request goes through a real multi-agent pipeline — a router+planner picks the right
|
|
60
|
+
agent(s) and breaks the request into steps, worker agents execute them against real tools,
|
|
61
|
+
a reviewer agent checks the output and can loop back for a revision — not a single prompt
|
|
62
|
+
wrapping a shell call.
|
|
63
|
+
|
|
64
|
+
| Domain | Agent | Capabilities |
|
|
65
|
+
|---|---|---|
|
|
66
|
+
| Git | `GitAgent` | status, diff, log, blame, branch, commit (auto-generates messages), push, merge, checkout, stash |
|
|
67
|
+
| Filesystem & code | `FileAgent` | read/write/move/delete files, lint & format (`ruff`), run tests (`pytest`), symbol search |
|
|
68
|
+
| Shell | `FileAgent` | runs arbitrary commands behind a hard denylist + confirmation gate |
|
|
69
|
+
| Docker | `DockerAgent` | ps, images, build, run, logs, exec, inspect, rm/rmi, prune |
|
|
70
|
+
| Kubernetes | `KubernetesAgent` | get/describe pods, deployments, services, nodes; apply, scale, rollout restart, delete, exec |
|
|
71
|
+
| Web research | `ResearchAgent` | GitHub repo/issue search, Stack Overflow search, general web search, fetch-with-citation |
|
|
72
|
+
| Debugging | `DebugAgent` | root-causes errors and stack traces, proposes concrete fixes |
|
|
73
|
+
| Documentation | `DocumentationAgent` | writes docstrings, README sections, usage guides |
|
|
74
|
+
| MCP | `MCPAgent` | connects to any configured MCP server (stdio, HTTP, or SSE) and discovers/calls its tools |
|
|
75
|
+
|
|
76
|
+
Also included:
|
|
77
|
+
|
|
78
|
+
- **Safety by default** — risky operations (`git push`, file delete, shell, container/exec
|
|
79
|
+
commands) require interactive confirmation unless you pass `--yes`; a shell denylist
|
|
80
|
+
blocks obviously destructive commands (`rm -rf /`, fork bombs, `curl | sh`, etc.)
|
|
81
|
+
regardless of confirmation.
|
|
82
|
+
- **Local memory + RAG** — `astra ingest .` indexes a codebase (SQLite + FAISS); relevant
|
|
83
|
+
chunks are pulled into the planner's context automatically on later requests.
|
|
84
|
+
- **Multi-provider LLM fallback** — Groq → Anthropic → OpenAI → local Ollama, tries each in
|
|
85
|
+
order and falls through on failure.
|
|
86
|
+
- **`astra chat`** — an interactive REPL with real token-level streaming, tab-completion,
|
|
87
|
+
and persistent history.
|
|
88
|
+
- **Cost/token tracking** — `astra memory costs` shows a real per-provider/per-model
|
|
89
|
+
breakdown and daily spend trend, no external service required.
|
|
90
|
+
- **First-run onboarding** — `astra setup` walks you through picking a provider and tests
|
|
91
|
+
your key with a real request before saving it.
|
|
92
|
+
|
|
93
|
+
See [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md) for the full design and
|
|
94
|
+
[HANDOFF.md](HANDOFF.md) for exactly what's built, what's tested, and what's left.
|
|
95
|
+
|
|
96
|
+
## Install
|
|
97
|
+
|
|
98
|
+
```bash
|
|
99
|
+
pip install astra-cli-agent
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
or with [uv](https://docs.astral.sh/uv/) / [pipx](https://pipx.pypa.io/) (recommended —
|
|
103
|
+
installs it in an isolated environment while still putting `astra` on your PATH):
|
|
104
|
+
|
|
105
|
+
```bash
|
|
106
|
+
uv tool install astra-cli-agent
|
|
107
|
+
# or
|
|
108
|
+
pipx install astra-cli-agent
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
This installs the `astra` command — the PyPI distribution name (`astra-cli-agent`) is
|
|
112
|
+
different from the command you actually run, since `astra-cli` was already taken by an
|
|
113
|
+
unrelated project.
|
|
114
|
+
|
|
115
|
+
Requires Python 3.12+.
|
|
116
|
+
|
|
117
|
+
## Quickstart
|
|
118
|
+
|
|
119
|
+
Astra needs at least one LLM provider before it can answer anything. Run the setup wizard
|
|
120
|
+
once:
|
|
121
|
+
|
|
122
|
+
```bash
|
|
123
|
+
astra setup
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
Pick a provider (Groq, Anthropic, OpenAI, or a local Ollama server) and paste a key — it's
|
|
127
|
+
tested with one real, cheap request before being saved to `~/.astra/.env` (never logged,
|
|
128
|
+
never committed). Don't have a key yet? [Groq's free tier](https://console.groq.com/keys)
|
|
129
|
+
is the fastest way to try Astra.
|
|
130
|
+
|
|
131
|
+
If you skip this step, the first command that actually needs an LLM (`ask`, a bare prompt,
|
|
132
|
+
or `chat`) will offer to run the wizard for you automatically.
|
|
133
|
+
|
|
134
|
+
Then just talk to it — **from inside whatever project directory you want it to act on**,
|
|
135
|
+
since every tool call is scoped to your current working directory:
|
|
136
|
+
|
|
137
|
+
```bash
|
|
138
|
+
astra hello # sanity check: install, config, provider status
|
|
139
|
+
astra ask "what's 12 * 8" # one-shot LLM call, no agent pipeline
|
|
140
|
+
astra "what's the git status here" # routes to GitAgent
|
|
141
|
+
astra "create a file called notes.md with a todo list"
|
|
142
|
+
astra "run the linter on this project"
|
|
143
|
+
astra ingest . # index this codebase for retrieval
|
|
144
|
+
astra "which file implements the fallback router" # answer grounded in the ingested code
|
|
145
|
+
astra chat # interactive REPL, streaming + history
|
|
146
|
+
astra memory costs # real cost/token breakdown for this session
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
Risky operations prompt for confirmation by default:
|
|
150
|
+
|
|
151
|
+
```bash
|
|
152
|
+
astra "delete the file scratch.txt" # asks first
|
|
153
|
+
astra "delete the file scratch.txt" --yes # skips the prompt
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
> Astra performs real actions when you approve them — it's not a dry-run tool. Try it in a
|
|
157
|
+
> throwaway directory first if you want to get a feel for it before pointing it at
|
|
158
|
+
> something you care about.
|
|
159
|
+
|
|
160
|
+
## Configuration
|
|
161
|
+
|
|
162
|
+
Astra reads settings in order (each layer overrides the previous):
|
|
163
|
+
|
|
164
|
+
1. packaged defaults (`src/astra/config/defaults.yaml`)
|
|
165
|
+
2. `~/.astra/config.yaml` (user overrides)
|
|
166
|
+
3. environment variables, e.g. `ASTRA_APP__LOG_LEVEL=DEBUG`
|
|
167
|
+
|
|
168
|
+
Provider API keys and other secrets live in `~/.astra/.env` (written by `astra setup`) —
|
|
169
|
+
global, not tied to any one project. Conversation history and cost tracking live in
|
|
170
|
+
`~/.astra/astra.db`.
|
|
171
|
+
|
|
172
|
+
## MCP servers
|
|
173
|
+
|
|
174
|
+
Add entries under `mcp.servers` in `~/.astra/config.yaml` to give Astra access to any MCP
|
|
175
|
+
server's tools/resources/prompts — same shape as Claude Desktop's `mcpServers` config for
|
|
176
|
+
stdio transport, plus `http`/`sse` for already-running remote servers:
|
|
177
|
+
|
|
178
|
+
```yaml
|
|
179
|
+
mcp:
|
|
180
|
+
servers:
|
|
181
|
+
- name: my-server
|
|
182
|
+
command: npx
|
|
183
|
+
args: ["-y", "@some/mcp-server"]
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
`astra mcp tools` lists everything discovered from your configured servers.
|
|
187
|
+
|
|
188
|
+
## Contributing / development
|
|
189
|
+
|
|
190
|
+
```bash
|
|
191
|
+
git clone https://github.com/Subharjun/astra-cli-agent.git
|
|
192
|
+
cd astra-cli-agent
|
|
193
|
+
uv venv && source .venv/bin/activate
|
|
194
|
+
uv pip install -e ".[dev]"
|
|
195
|
+
|
|
196
|
+
pytest
|
|
197
|
+
ruff check .
|
|
198
|
+
mypy src
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
CI (`.github/workflows/ci.yml`) runs the same three commands on every push and PR to
|
|
202
|
+
`main`. Releases (`.github/workflows/release.yml`) publish to PyPI via trusted publishing
|
|
203
|
+
(OIDC) when a GitHub Release is published — no token stored in this repo.
|
|
204
|
+
|
|
205
|
+
## License
|
|
206
|
+
|
|
207
|
+
[MIT](LICENSE)
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
# Astra CLI
|
|
2
|
+
|
|
3
|
+
**A terminal AI assistant that understands natural language and drives your developer
|
|
4
|
+
tools** — git, docker, kubernetes, filesystem, code, shell, web research, and MCP plugins
|
|
5
|
+
— through a multi-agent LangGraph pipeline with local memory, RAG, and multi-provider LLM
|
|
6
|
+
fallback.
|
|
7
|
+
|
|
8
|
+
```
|
|
9
|
+
$ astra "what's the git status here, and run the linter"
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
[](https://pypi.org/project/astra-cli-agent/)
|
|
13
|
+
[](https://pypi.org/project/astra-cli-agent/)
|
|
14
|
+
[](https://github.com/Subharjun/astra-cli-agent/actions/workflows/ci.yml)
|
|
15
|
+
[](LICENSE)
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## What it does
|
|
20
|
+
|
|
21
|
+
Every request goes through a real multi-agent pipeline — a router+planner picks the right
|
|
22
|
+
agent(s) and breaks the request into steps, worker agents execute them against real tools,
|
|
23
|
+
a reviewer agent checks the output and can loop back for a revision — not a single prompt
|
|
24
|
+
wrapping a shell call.
|
|
25
|
+
|
|
26
|
+
| Domain | Agent | Capabilities |
|
|
27
|
+
|---|---|---|
|
|
28
|
+
| Git | `GitAgent` | status, diff, log, blame, branch, commit (auto-generates messages), push, merge, checkout, stash |
|
|
29
|
+
| Filesystem & code | `FileAgent` | read/write/move/delete files, lint & format (`ruff`), run tests (`pytest`), symbol search |
|
|
30
|
+
| Shell | `FileAgent` | runs arbitrary commands behind a hard denylist + confirmation gate |
|
|
31
|
+
| Docker | `DockerAgent` | ps, images, build, run, logs, exec, inspect, rm/rmi, prune |
|
|
32
|
+
| Kubernetes | `KubernetesAgent` | get/describe pods, deployments, services, nodes; apply, scale, rollout restart, delete, exec |
|
|
33
|
+
| Web research | `ResearchAgent` | GitHub repo/issue search, Stack Overflow search, general web search, fetch-with-citation |
|
|
34
|
+
| Debugging | `DebugAgent` | root-causes errors and stack traces, proposes concrete fixes |
|
|
35
|
+
| Documentation | `DocumentationAgent` | writes docstrings, README sections, usage guides |
|
|
36
|
+
| MCP | `MCPAgent` | connects to any configured MCP server (stdio, HTTP, or SSE) and discovers/calls its tools |
|
|
37
|
+
|
|
38
|
+
Also included:
|
|
39
|
+
|
|
40
|
+
- **Safety by default** — risky operations (`git push`, file delete, shell, container/exec
|
|
41
|
+
commands) require interactive confirmation unless you pass `--yes`; a shell denylist
|
|
42
|
+
blocks obviously destructive commands (`rm -rf /`, fork bombs, `curl | sh`, etc.)
|
|
43
|
+
regardless of confirmation.
|
|
44
|
+
- **Local memory + RAG** — `astra ingest .` indexes a codebase (SQLite + FAISS); relevant
|
|
45
|
+
chunks are pulled into the planner's context automatically on later requests.
|
|
46
|
+
- **Multi-provider LLM fallback** — Groq → Anthropic → OpenAI → local Ollama, tries each in
|
|
47
|
+
order and falls through on failure.
|
|
48
|
+
- **`astra chat`** — an interactive REPL with real token-level streaming, tab-completion,
|
|
49
|
+
and persistent history.
|
|
50
|
+
- **Cost/token tracking** — `astra memory costs` shows a real per-provider/per-model
|
|
51
|
+
breakdown and daily spend trend, no external service required.
|
|
52
|
+
- **First-run onboarding** — `astra setup` walks you through picking a provider and tests
|
|
53
|
+
your key with a real request before saving it.
|
|
54
|
+
|
|
55
|
+
See [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md) for the full design and
|
|
56
|
+
[HANDOFF.md](HANDOFF.md) for exactly what's built, what's tested, and what's left.
|
|
57
|
+
|
|
58
|
+
## Install
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
pip install astra-cli-agent
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
or with [uv](https://docs.astral.sh/uv/) / [pipx](https://pipx.pypa.io/) (recommended —
|
|
65
|
+
installs it in an isolated environment while still putting `astra` on your PATH):
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
uv tool install astra-cli-agent
|
|
69
|
+
# or
|
|
70
|
+
pipx install astra-cli-agent
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
This installs the `astra` command — the PyPI distribution name (`astra-cli-agent`) is
|
|
74
|
+
different from the command you actually run, since `astra-cli` was already taken by an
|
|
75
|
+
unrelated project.
|
|
76
|
+
|
|
77
|
+
Requires Python 3.12+.
|
|
78
|
+
|
|
79
|
+
## Quickstart
|
|
80
|
+
|
|
81
|
+
Astra needs at least one LLM provider before it can answer anything. Run the setup wizard
|
|
82
|
+
once:
|
|
83
|
+
|
|
84
|
+
```bash
|
|
85
|
+
astra setup
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
Pick a provider (Groq, Anthropic, OpenAI, or a local Ollama server) and paste a key — it's
|
|
89
|
+
tested with one real, cheap request before being saved to `~/.astra/.env` (never logged,
|
|
90
|
+
never committed). Don't have a key yet? [Groq's free tier](https://console.groq.com/keys)
|
|
91
|
+
is the fastest way to try Astra.
|
|
92
|
+
|
|
93
|
+
If you skip this step, the first command that actually needs an LLM (`ask`, a bare prompt,
|
|
94
|
+
or `chat`) will offer to run the wizard for you automatically.
|
|
95
|
+
|
|
96
|
+
Then just talk to it — **from inside whatever project directory you want it to act on**,
|
|
97
|
+
since every tool call is scoped to your current working directory:
|
|
98
|
+
|
|
99
|
+
```bash
|
|
100
|
+
astra hello # sanity check: install, config, provider status
|
|
101
|
+
astra ask "what's 12 * 8" # one-shot LLM call, no agent pipeline
|
|
102
|
+
astra "what's the git status here" # routes to GitAgent
|
|
103
|
+
astra "create a file called notes.md with a todo list"
|
|
104
|
+
astra "run the linter on this project"
|
|
105
|
+
astra ingest . # index this codebase for retrieval
|
|
106
|
+
astra "which file implements the fallback router" # answer grounded in the ingested code
|
|
107
|
+
astra chat # interactive REPL, streaming + history
|
|
108
|
+
astra memory costs # real cost/token breakdown for this session
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
Risky operations prompt for confirmation by default:
|
|
112
|
+
|
|
113
|
+
```bash
|
|
114
|
+
astra "delete the file scratch.txt" # asks first
|
|
115
|
+
astra "delete the file scratch.txt" --yes # skips the prompt
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
> Astra performs real actions when you approve them — it's not a dry-run tool. Try it in a
|
|
119
|
+
> throwaway directory first if you want to get a feel for it before pointing it at
|
|
120
|
+
> something you care about.
|
|
121
|
+
|
|
122
|
+
## Configuration
|
|
123
|
+
|
|
124
|
+
Astra reads settings in order (each layer overrides the previous):
|
|
125
|
+
|
|
126
|
+
1. packaged defaults (`src/astra/config/defaults.yaml`)
|
|
127
|
+
2. `~/.astra/config.yaml` (user overrides)
|
|
128
|
+
3. environment variables, e.g. `ASTRA_APP__LOG_LEVEL=DEBUG`
|
|
129
|
+
|
|
130
|
+
Provider API keys and other secrets live in `~/.astra/.env` (written by `astra setup`) —
|
|
131
|
+
global, not tied to any one project. Conversation history and cost tracking live in
|
|
132
|
+
`~/.astra/astra.db`.
|
|
133
|
+
|
|
134
|
+
## MCP servers
|
|
135
|
+
|
|
136
|
+
Add entries under `mcp.servers` in `~/.astra/config.yaml` to give Astra access to any MCP
|
|
137
|
+
server's tools/resources/prompts — same shape as Claude Desktop's `mcpServers` config for
|
|
138
|
+
stdio transport, plus `http`/`sse` for already-running remote servers:
|
|
139
|
+
|
|
140
|
+
```yaml
|
|
141
|
+
mcp:
|
|
142
|
+
servers:
|
|
143
|
+
- name: my-server
|
|
144
|
+
command: npx
|
|
145
|
+
args: ["-y", "@some/mcp-server"]
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
`astra mcp tools` lists everything discovered from your configured servers.
|
|
149
|
+
|
|
150
|
+
## Contributing / development
|
|
151
|
+
|
|
152
|
+
```bash
|
|
153
|
+
git clone https://github.com/Subharjun/astra-cli-agent.git
|
|
154
|
+
cd astra-cli-agent
|
|
155
|
+
uv venv && source .venv/bin/activate
|
|
156
|
+
uv pip install -e ".[dev]"
|
|
157
|
+
|
|
158
|
+
pytest
|
|
159
|
+
ruff check .
|
|
160
|
+
mypy src
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
CI (`.github/workflows/ci.yml`) runs the same three commands on every push and PR to
|
|
164
|
+
`main`. Releases (`.github/workflows/release.yml`) publish to PyPI via trusted publishing
|
|
165
|
+
(OIDC) when a GitHub Release is published — no token stored in this repo.
|
|
166
|
+
|
|
167
|
+
## License
|
|
168
|
+
|
|
169
|
+
[MIT](LICENSE)
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "astra-cli-agent"
|
|
7
|
-
version = "0.1.
|
|
7
|
+
version = "0.1.2"
|
|
8
8
|
description = "Astra — a terminal AI assistant that understands natural language and drives your dev tools."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.12"
|
|
@@ -18,6 +18,7 @@ classifiers = [
|
|
|
18
18
|
"Environment :: Console",
|
|
19
19
|
"Intended Audience :: Developers",
|
|
20
20
|
]
|
|
21
|
+
|
|
21
22
|
dependencies = [
|
|
22
23
|
"typer>=0.12",
|
|
23
24
|
"rich>=13.7",
|
|
@@ -32,6 +33,7 @@ dependencies = [
|
|
|
32
33
|
"sentence-transformers>=3.0",
|
|
33
34
|
"mcp>=1.0",
|
|
34
35
|
"prompt-toolkit>=3.0",
|
|
36
|
+
"pyfiglet>=1.0",
|
|
35
37
|
]
|
|
36
38
|
|
|
37
39
|
[project.optional-dependencies]
|
|
@@ -43,6 +45,10 @@ dev = [
|
|
|
43
45
|
"types-PyYAML>=6.0",
|
|
44
46
|
]
|
|
45
47
|
|
|
48
|
+
[project.urls]
|
|
49
|
+
Homepage = "https://github.com/Subharjun/astra-cli-agent"
|
|
50
|
+
Issues = "https://github.com/Subharjun/astra-cli-agent/issues"
|
|
51
|
+
|
|
46
52
|
[project.scripts]
|
|
47
53
|
astra = "astra.cli.app:main"
|
|
48
54
|
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
from importlib.metadata import PackageNotFoundError, version
|
|
2
|
+
|
|
3
|
+
try:
|
|
4
|
+
__version__ = version("astra-cli-agent")
|
|
5
|
+
except PackageNotFoundError:
|
|
6
|
+
# Editable/source checkout with no installed distribution metadata yet (e.g. before the
|
|
7
|
+
# first `pip install -e .`) — matches pyproject.toml's version so it's never stale.
|
|
8
|
+
__version__ = "0.1.2"
|
|
@@ -17,7 +17,7 @@ from prompt_toolkit import PromptSession
|
|
|
17
17
|
from prompt_toolkit.completion import WordCompleter
|
|
18
18
|
from prompt_toolkit.history import FileHistory
|
|
19
19
|
|
|
20
|
-
from astra.cli.rendering import console, make_stream_printer, print_error
|
|
20
|
+
from astra.cli.rendering import console, make_stream_printer, print_banner, print_error
|
|
21
21
|
from astra.core.graph import AstraGraph, build_default_graph
|
|
22
22
|
from astra.core.settings import Settings
|
|
23
23
|
from astra.memory.store import MemoryStore
|
|
@@ -89,7 +89,8 @@ def run_chat(settings: Settings, assume_yes: bool = False) -> None:
|
|
|
89
89
|
|
|
90
90
|
graph = build_default_graph(settings, on_reviewer_chunk=_dispatch)
|
|
91
91
|
|
|
92
|
-
|
|
92
|
+
print_banner()
|
|
93
|
+
console.print("type /help for commands, /exit to leave.\n")
|
|
93
94
|
|
|
94
95
|
while True:
|
|
95
96
|
try:
|
|
@@ -5,20 +5,32 @@ from __future__ import annotations
|
|
|
5
5
|
from collections.abc import Callable
|
|
6
6
|
|
|
7
7
|
from rich.console import Console
|
|
8
|
-
from rich.panel import Panel
|
|
9
8
|
from rich.status import Status
|
|
10
9
|
|
|
11
10
|
console = Console()
|
|
12
11
|
error_console = Console(stderr=True, style="bold red")
|
|
13
12
|
|
|
13
|
+
# Top-to-bottom gradient applied to the figlet banner's lines, cyan through violet — purely
|
|
14
|
+
# cosmetic, no meaning attached to the specific stops.
|
|
15
|
+
_BANNER_GRADIENT = ["#22d3ee", "#38bdf8", "#818cf8", "#a78bfa", "#e879f9"]
|
|
16
|
+
|
|
14
17
|
|
|
15
18
|
def print_banner() -> None:
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
19
|
+
"""Big, colored "ASTRA" wordmark shown at the start of the commands a human actually
|
|
20
|
+
reads interactively (`hello`, `setup`, `chat`) — not on every invocation, since `ask`/
|
|
21
|
+
`run` are also used non-interactively/scripted and shouldn't pay for it or clutter
|
|
22
|
+
piped output."""
|
|
23
|
+
import pyfiglet # lazy: only the three banner-printing commands need this at all
|
|
24
|
+
from rich.text import Text
|
|
25
|
+
|
|
26
|
+
banner = Text()
|
|
27
|
+
art_lines = pyfiglet.figlet_format("ASTRA", font="slant").split("\n")
|
|
28
|
+
for i, line in enumerate(art_lines):
|
|
29
|
+
if not line.strip():
|
|
30
|
+
continue
|
|
31
|
+
banner.append(line + "\n", style=f"bold {_BANNER_GRADIENT[i % len(_BANNER_GRADIENT)]}")
|
|
32
|
+
console.print(banner, no_wrap=True)
|
|
33
|
+
console.print(" [dim italic]your terminal AI developer assistant[/dim italic]\n")
|
|
22
34
|
|
|
23
35
|
|
|
24
36
|
def print_error(message: str) -> None:
|
astra_cli_agent-0.1.0/PKG-INFO
DELETED
|
@@ -1,130 +0,0 @@
|
|
|
1
|
-
Metadata-Version: 2.4
|
|
2
|
-
Name: astra-cli-agent
|
|
3
|
-
Version: 0.1.0
|
|
4
|
-
Summary: Astra — a terminal AI assistant that understands natural language and drives your dev tools.
|
|
5
|
-
Author: Astra CLI contributors
|
|
6
|
-
License: MIT
|
|
7
|
-
Keywords: agent,ai,cli,developer-tools,langgraph
|
|
8
|
-
Classifier: Environment :: Console
|
|
9
|
-
Classifier: Intended Audience :: Developers
|
|
10
|
-
Classifier: License :: OSI Approved :: MIT License
|
|
11
|
-
Classifier: Programming Language :: Python :: 3
|
|
12
|
-
Classifier: Programming Language :: Python :: 3.12
|
|
13
|
-
Requires-Python: >=3.12
|
|
14
|
-
Requires-Dist: faiss-cpu>=1.8
|
|
15
|
-
Requires-Dist: httpx>=0.27
|
|
16
|
-
Requires-Dist: langgraph>=0.2
|
|
17
|
-
Requires-Dist: litellm>=1.44
|
|
18
|
-
Requires-Dist: mcp>=1.0
|
|
19
|
-
Requires-Dist: prompt-toolkit>=3.0
|
|
20
|
-
Requires-Dist: pydantic-settings>=2.3
|
|
21
|
-
Requires-Dist: pydantic>=2.7
|
|
22
|
-
Requires-Dist: python-dotenv>=1.0
|
|
23
|
-
Requires-Dist: pyyaml>=6.0
|
|
24
|
-
Requires-Dist: rich>=13.7
|
|
25
|
-
Requires-Dist: sentence-transformers>=3.0
|
|
26
|
-
Requires-Dist: typer>=0.12
|
|
27
|
-
Provides-Extra: dev
|
|
28
|
-
Requires-Dist: mypy>=1.10; extra == 'dev'
|
|
29
|
-
Requires-Dist: pytest-cov>=5.0; extra == 'dev'
|
|
30
|
-
Requires-Dist: pytest>=8.0; extra == 'dev'
|
|
31
|
-
Requires-Dist: ruff>=0.5; extra == 'dev'
|
|
32
|
-
Requires-Dist: types-pyyaml>=6.0; extra == 'dev'
|
|
33
|
-
Description-Content-Type: text/markdown
|
|
34
|
-
|
|
35
|
-
# Astra CLI
|
|
36
|
-
|
|
37
|
-
A terminal-based AI assistant that understands natural language and drives your
|
|
38
|
-
developer tools — git, docker, kubernetes, code, and more — through a multi-agent
|
|
39
|
-
LangGraph pipeline with local memory and RAG.
|
|
40
|
-
|
|
41
|
-
> All 18 build phases are complete. See [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md) for
|
|
42
|
-
> the full design and [HANDOFF.md](HANDOFF.md) for exactly what's done and what's left
|
|
43
|
-
> (mostly external setup — PyPI trusted publishing, a working LangSmith key, a local k8s
|
|
44
|
-
> cluster).
|
|
45
|
-
|
|
46
|
-
## Install
|
|
47
|
-
|
|
48
|
-
Once published, install with:
|
|
49
|
-
|
|
50
|
-
```bash
|
|
51
|
-
pip install astra-cli-agent # or: uv tool install astra-cli-agent
|
|
52
|
-
```
|
|
53
|
-
|
|
54
|
-
This installs the `astra` command on your PATH — the PyPI distribution name
|
|
55
|
-
(`astra-cli-agent`) is different from the command you actually run.
|
|
56
|
-
|
|
57
|
-
### Install (development)
|
|
58
|
-
|
|
59
|
-
```bash
|
|
60
|
-
uv venv
|
|
61
|
-
source .venv/bin/activate
|
|
62
|
-
uv pip install -e ".[dev]"
|
|
63
|
-
```
|
|
64
|
-
|
|
65
|
-
or with plain pip:
|
|
66
|
-
|
|
67
|
-
```bash
|
|
68
|
-
python -m venv .venv
|
|
69
|
-
source .venv/bin/activate
|
|
70
|
-
pip install -e ".[dev]"
|
|
71
|
-
```
|
|
72
|
-
|
|
73
|
-
## Getting started
|
|
74
|
-
|
|
75
|
-
Astra needs at least one LLM provider before it can answer anything. The first time you
|
|
76
|
-
run a command that needs one (`astra ask`, `astra "<prompt>"`, `astra chat`) with none
|
|
77
|
-
configured, it offers to walk you through setup right there — same as most terminal AI
|
|
78
|
-
tools do on first run. You can also trigger it directly:
|
|
79
|
-
|
|
80
|
-
```bash
|
|
81
|
-
astra setup
|
|
82
|
-
```
|
|
83
|
-
|
|
84
|
-
This walks you through picking a provider (Groq, Anthropic, OpenAI, or a local Ollama
|
|
85
|
-
server), pastes-and-tests your API key with one real, cheap request before saving it, and
|
|
86
|
-
writes it to `~/.astra/.env` — never logged, never committed. Run it again any time to
|
|
87
|
-
add more providers (recommended, so `FallbackRouter` has something to fall back to).
|
|
88
|
-
|
|
89
|
-
```bash
|
|
90
|
-
astra hello # sanity check: confirms install + config + whether a provider is set up
|
|
91
|
-
astra version # print installed version
|
|
92
|
-
astra ask "..." # one-shot LLM call, no agent pipeline
|
|
93
|
-
astra "explain this code" # full natural-language agent pipeline
|
|
94
|
-
astra chat # interactive REPL with streaming, history, autocomplete
|
|
95
|
-
```
|
|
96
|
-
|
|
97
|
-
## Configuration
|
|
98
|
-
|
|
99
|
-
Astra reads, in order (each layer overrides the previous):
|
|
100
|
-
|
|
101
|
-
1. packaged defaults (`src/astra/config/defaults.yaml`)
|
|
102
|
-
2. `~/.astra/config.yaml` (user overrides)
|
|
103
|
-
3. environment variables, e.g. `ASTRA_APP__LOG_LEVEL=DEBUG`
|
|
104
|
-
|
|
105
|
-
Provider API keys live in `~/.astra/.env` (written by `astra setup`) or a project-local
|
|
106
|
-
`.env` (copy `.env.example` to get started by hand instead of the wizard).
|
|
107
|
-
|
|
108
|
-
## Releasing (maintainers)
|
|
109
|
-
|
|
110
|
-
CI (`.github/workflows/ci.yml`) runs ruff/mypy/pytest on every push and PR to `main`.
|
|
111
|
-
|
|
112
|
-
Publishing to PyPI (`.github/workflows/release.yml`) uses PyPI's trusted-publishing (OIDC)
|
|
113
|
-
flow — no token stored in this repo. One-time setup required on PyPI, done once by
|
|
114
|
-
whoever owns the `astra-cli-agent` project there:
|
|
115
|
-
|
|
116
|
-
1. Register the `astra-cli-agent` project on PyPI (or claim it if unclaimed).
|
|
117
|
-
2. In that project's PyPI settings → Publishing, add a trusted publisher: this GitHub repo,
|
|
118
|
-
workflow file `release.yml`, environment name `pypi`.
|
|
119
|
-
3. In this repo's GitHub settings → Environments, create an environment named `pypi`
|
|
120
|
-
(ideally with a required-reviewer rule, so a published Release doesn't auto-publish
|
|
121
|
-
without a human glance).
|
|
122
|
-
4. Cut a GitHub Release (tag + "Publish release" in the UI) — that triggers the workflow.
|
|
123
|
-
|
|
124
|
-
## Development
|
|
125
|
-
|
|
126
|
-
```bash
|
|
127
|
-
pytest
|
|
128
|
-
ruff check .
|
|
129
|
-
mypy src
|
|
130
|
-
```
|