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.
Files changed (148) hide show
  1. astra_cli_agent-0.1.2/LICENSE +21 -0
  2. astra_cli_agent-0.1.2/PKG-INFO +207 -0
  3. astra_cli_agent-0.1.2/README.md +169 -0
  4. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/pyproject.toml +7 -1
  5. astra_cli_agent-0.1.2/src/astra/__init__.py +8 -0
  6. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/cli/chat.py +3 -2
  7. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/cli/rendering.py +19 -7
  8. astra_cli_agent-0.1.0/PKG-INFO +0 -130
  9. astra_cli_agent-0.1.0/README.md +0 -96
  10. astra_cli_agent-0.1.0/src/astra/__init__.py +0 -1
  11. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/.env.example +0 -0
  12. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/.github/workflows/ci.yml +0 -0
  13. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/.github/workflows/release.yml +0 -0
  14. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/.gitignore +0 -0
  15. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/HANDOFF.md +0 -0
  16. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/docs/ARCHITECTURE.md +0 -0
  17. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/agents/__init__.py +0 -0
  18. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/agents/base.py +0 -0
  19. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/agents/coder_agent.py +0 -0
  20. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/agents/debug_agent.py +0 -0
  21. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/agents/docker_agent.py +0 -0
  22. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/agents/documentation_agent.py +0 -0
  23. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/agents/file_agent.py +0 -0
  24. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/agents/git_agent.py +0 -0
  25. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/agents/kubernetes_agent.py +0 -0
  26. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/agents/mcp_agent.py +0 -0
  27. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/agents/memory_agent.py +0 -0
  28. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/agents/planner_agent.py +0 -0
  29. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/agents/research_agent.py +0 -0
  30. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/agents/retrieve_agent.py +0 -0
  31. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/agents/reviewer_agent.py +0 -0
  32. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/cli/__init__.py +0 -0
  33. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/cli/app.py +0 -0
  34. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/cli/ingest.py +0 -0
  35. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/cli/mcp.py +0 -0
  36. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/cli/memory.py +0 -0
  37. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/cli/setup.py +0 -0
  38. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/cli/single.py +0 -0
  39. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/config/__init__.py +0 -0
  40. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/config/defaults.yaml +0 -0
  41. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/config/profiles/.gitkeep +0 -0
  42. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/core/__init__.py +0 -0
  43. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/core/confirm.py +0 -0
  44. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/core/events.py +0 -0
  45. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/core/exceptions.py +0 -0
  46. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/core/graph.py +0 -0
  47. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/core/json_stream.py +0 -0
  48. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/core/onboarding.py +0 -0
  49. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/core/settings.py +0 -0
  50. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/core/state.py +0 -0
  51. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/llm/__init__.py +0 -0
  52. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/llm/cost.py +0 -0
  53. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/llm/litellm_client.py +0 -0
  54. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/llm/ollama_client.py +0 -0
  55. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/llm/provider.py +0 -0
  56. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/llm/router.py +0 -0
  57. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/memory/__init__.py +0 -0
  58. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/memory/chunking.py +0 -0
  59. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/memory/embeddings.py +0 -0
  60. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/memory/models.py +0 -0
  61. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/memory/retriever.py +0 -0
  62. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/memory/store.py +0 -0
  63. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/memory/vector_store.py +0 -0
  64. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/models/__init__.py +0 -0
  65. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/models/tool_result.py +0 -0
  66. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/prompts/.gitkeep +0 -0
  67. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/tools/__init__.py +0 -0
  68. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/tools/code/__init__.py +0 -0
  69. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/tools/code/backend.py +0 -0
  70. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/tools/code/tools.py +0 -0
  71. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/tools/docker/__init__.py +0 -0
  72. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/tools/docker/backend.py +0 -0
  73. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/tools/docker/tools.py +0 -0
  74. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/tools/filesystem/__init__.py +0 -0
  75. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/tools/filesystem/backend.py +0 -0
  76. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/tools/filesystem/tools.py +0 -0
  77. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/tools/git/__init__.py +0 -0
  78. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/tools/git/backend.py +0 -0
  79. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/tools/git/tools.py +0 -0
  80. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/tools/kubernetes/__init__.py +0 -0
  81. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/tools/kubernetes/backend.py +0 -0
  82. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/tools/kubernetes/tools.py +0 -0
  83. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/tools/mcp/__init__.py +0 -0
  84. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/tools/mcp/backend.py +0 -0
  85. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/tools/mcp/client.py +0 -0
  86. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/tools/mcp/discovery.py +0 -0
  87. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/tools/registry.py +0 -0
  88. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/tools/shell/__init__.py +0 -0
  89. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/tools/shell/backend.py +0 -0
  90. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/tools/shell/tools.py +0 -0
  91. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/tools/web/__init__.py +0 -0
  92. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/tools/web/backend.py +0 -0
  93. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/tools/web/tools.py +0 -0
  94. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/utils/__init__.py +0 -0
  95. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/src/astra/utils/logging.py +0 -0
  96. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/tests/e2e/.gitkeep +0 -0
  97. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/tests/e2e/test_e2e_live_groq.py +0 -0
  98. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/tests/fixtures/mcp_fixture_server.py +0 -0
  99. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/tests/integration/.gitkeep +0 -0
  100. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/tests/integration/_helpers.py +0 -0
  101. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/tests/integration/conftest.py +0 -0
  102. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/tests/integration/test_cli_ask.py +0 -0
  103. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/tests/integration/test_cli_confirm_gate.py +0 -0
  104. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/tests/integration/test_cli_ingest_and_retrieval.py +0 -0
  105. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/tests/integration/test_cli_mcp.py +0 -0
  106. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/tests/integration/test_cli_run_pipeline.py +0 -0
  107. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/tests/unit/.gitkeep +0 -0
  108. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/tests/unit/conftest.py +0 -0
  109. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/tests/unit/test_agents.py +0 -0
  110. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/tests/unit/test_chat.py +0 -0
  111. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/tests/unit/test_chunking.py +0 -0
  112. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/tests/unit/test_cli.py +0 -0
  113. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/tests/unit/test_code_backend.py +0 -0
  114. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/tests/unit/test_code_tools.py +0 -0
  115. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/tests/unit/test_docker_agent.py +0 -0
  116. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/tests/unit/test_docker_backend.py +0 -0
  117. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/tests/unit/test_docker_tools.py +0 -0
  118. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/tests/unit/test_file_agent.py +0 -0
  119. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/tests/unit/test_filesystem_backend.py +0 -0
  120. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/tests/unit/test_filesystem_tools.py +0 -0
  121. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/tests/unit/test_git_agent.py +0 -0
  122. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/tests/unit/test_git_backend.py +0 -0
  123. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/tests/unit/test_git_tools.py +0 -0
  124. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/tests/unit/test_graph.py +0 -0
  125. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/tests/unit/test_json_stream.py +0 -0
  126. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/tests/unit/test_kubernetes_agent.py +0 -0
  127. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/tests/unit/test_kubernetes_backend.py +0 -0
  128. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/tests/unit/test_kubernetes_tools.py +0 -0
  129. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/tests/unit/test_llm_adapters.py +0 -0
  130. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/tests/unit/test_llm_cost.py +0 -0
  131. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/tests/unit/test_llm_router.py +0 -0
  132. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/tests/unit/test_llm_router_streaming.py +0 -0
  133. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/tests/unit/test_mcp_agent.py +0 -0
  134. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/tests/unit/test_mcp_backend.py +0 -0
  135. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/tests/unit/test_mcp_client.py +0 -0
  136. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/tests/unit/test_mcp_discovery.py +0 -0
  137. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/tests/unit/test_mcp_http_transport.py +0 -0
  138. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/tests/unit/test_memory_agent.py +0 -0
  139. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/tests/unit/test_memory_store.py +0 -0
  140. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/tests/unit/test_onboarding.py +0 -0
  141. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/tests/unit/test_rag_e2e.py +0 -0
  142. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/tests/unit/test_research_agent.py +0 -0
  143. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/tests/unit/test_setup.py +0 -0
  144. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/tests/unit/test_shell_backend.py +0 -0
  145. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/tests/unit/test_shell_tools.py +0 -0
  146. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/tests/unit/test_vector_store.py +0 -0
  147. {astra_cli_agent-0.1.0 → astra_cli_agent-0.1.2}/tests/unit/test_web_backend.py +0 -0
  148. {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
+ [![PyPI](https://img.shields.io/pypi/v/astra-cli-agent.svg)](https://pypi.org/project/astra-cli-agent/)
51
+ [![Python](https://img.shields.io/pypi/pyversions/astra-cli-agent.svg)](https://pypi.org/project/astra-cli-agent/)
52
+ [![CI](https://github.com/Subharjun/astra-cli-agent/actions/workflows/ci.yml/badge.svg)](https://github.com/Subharjun/astra-cli-agent/actions/workflows/ci.yml)
53
+ [![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](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
+ [![PyPI](https://img.shields.io/pypi/v/astra-cli-agent.svg)](https://pypi.org/project/astra-cli-agent/)
13
+ [![Python](https://img.shields.io/pypi/pyversions/astra-cli-agent.svg)](https://pypi.org/project/astra-cli-agent/)
14
+ [![CI](https://github.com/Subharjun/astra-cli-agent/actions/workflows/ci.yml/badge.svg)](https://github.com/Subharjun/astra-cli-agent/actions/workflows/ci.yml)
15
+ [![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](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.0"
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
- console.print("[bold cyan]Astra chat[/bold cyan] — type /help for commands, /exit to leave.")
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
- console.print(
17
- Panel.fit(
18
- "[bold cyan]Astra[/bold cyan] your terminal AI developer assistant",
19
- border_style="cyan",
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:
@@ -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
- ```