voidx 2.0.0__tar.gz → 2.0.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 (180) hide show
  1. {voidx-2.0.0 → voidx-2.0.2}/PKG-INFO +12 -3
  2. {voidx-2.0.0 → voidx-2.0.2}/README.md +11 -2
  3. {voidx-2.0.0 → voidx-2.0.2}/pyproject.toml +1 -1
  4. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/__init__.py +1 -1
  5. {voidx-2.0.0 → voidx-2.0.2}/src/voidx.egg-info/PKG-INFO +12 -3
  6. {voidx-2.0.0 → voidx-2.0.2}/tests/test_npm_package.py +12 -19
  7. {voidx-2.0.0 → voidx-2.0.2}/setup.cfg +0 -0
  8. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/agent/__init__.py +0 -0
  9. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/agent/agents.py +0 -0
  10. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/agent/attachments.py +0 -0
  11. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/agent/graph/__init__.py +0 -0
  12. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/agent/graph/compaction.py +0 -0
  13. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/agent/graph/contracts.py +0 -0
  14. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/agent/graph/core.py +0 -0
  15. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/agent/graph/permissions.py +0 -0
  16. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/agent/graph/run_loop.py +0 -0
  17. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/agent/graph/runtime.py +0 -0
  18. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/agent/graph/streaming.py +0 -0
  19. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/agent/graph/subagent.py +0 -0
  20. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/agent/graph/tool_execution.py +0 -0
  21. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/agent/intent_refinement.py +0 -0
  22. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/agent/message_rows.py +0 -0
  23. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/agent/runtime_context.py +0 -0
  24. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/agent/slash/__init__.py +0 -0
  25. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/agent/slash/code_ide.py +0 -0
  26. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/agent/slash/handler.py +0 -0
  27. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/agent/slash/lsp.py +0 -0
  28. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/agent/slash/mcp.py +0 -0
  29. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/agent/slash/model.py +0 -0
  30. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/agent/slash/runtime.py +0 -0
  31. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/agent/slash/skills.py +0 -0
  32. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/agent/state.py +0 -0
  33. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/agent/task_state.py +0 -0
  34. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/agent/tool_filters.py +0 -0
  35. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/agent/tool_messages.py +0 -0
  36. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/config.py +0 -0
  37. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/llm/__init__.py +0 -0
  38. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/llm/catalog.py +0 -0
  39. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/llm/compaction.py +0 -0
  40. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/llm/context.py +0 -0
  41. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/llm/instruction.py +0 -0
  42. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/llm/provider.py +0 -0
  43. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/llm/usage.py +0 -0
  44. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/lsp/__init__.py +0 -0
  45. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/lsp/client.py +0 -0
  46. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/lsp/config.py +0 -0
  47. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/lsp/detector.py +0 -0
  48. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/lsp/errors.py +0 -0
  49. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/lsp/manager.py +0 -0
  50. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/lsp/schema.py +0 -0
  51. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/lsp/service.py +0 -0
  52. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/main.py +0 -0
  53. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/mcp/__init__.py +0 -0
  54. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/mcp/client.py +0 -0
  55. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/mcp/manager.py +0 -0
  56. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/mcp/schema.py +0 -0
  57. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/mcp/tool.py +0 -0
  58. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/mcp_servers/__init__.py +0 -0
  59. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/mcp_servers/web.py +0 -0
  60. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/memory/__init__.py +0 -0
  61. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/memory/context_frames.py +0 -0
  62. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/memory/model_profiles.py +0 -0
  63. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/memory/runtime_state.py +0 -0
  64. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/memory/session.py +0 -0
  65. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/memory/store.py +0 -0
  66. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/memory/transcript.py +0 -0
  67. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/permission/__init__.py +0 -0
  68. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/permission/engine.py +0 -0
  69. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/permission/evaluate.py +0 -0
  70. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/permission/sandbox.py +0 -0
  71. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/permission/schema.py +0 -0
  72. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/permission/service.py +0 -0
  73. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/permission/wildcard.py +0 -0
  74. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/skills/__init__.py +0 -0
  75. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/skills/bundled/superpowers/brainstorming/SKILL.md +0 -0
  76. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/skills/bundled/superpowers/receiving-code-review/SKILL.md +0 -0
  77. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/skills/bundled/superpowers/requesting-code-review/SKILL.md +0 -0
  78. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/skills/bundled/superpowers/systematic-debugging/SKILL.md +0 -0
  79. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/skills/bundled/superpowers/test-driven-development/SKILL.md +0 -0
  80. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/skills/bundled/superpowers/verification-before-completion/SKILL.md +0 -0
  81. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/skills/bundled/superpowers/writing-design-docs/SKILL.md +0 -0
  82. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/skills/bundled/superpowers/writing-design-docs/templates/api-doc.md +0 -0
  83. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/skills/bundled/superpowers/writing-design-docs/templates/prd.md +0 -0
  84. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/skills/bundled/superpowers/writing-design-docs/templates/readme.md +0 -0
  85. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/skills/bundled/superpowers/writing-design-docs/templates/rfc.md +0 -0
  86. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/skills/bundled/superpowers/writing-design-docs/templates/tech-design.md +0 -0
  87. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/skills/bundled/superpowers/writing-plans/SKILL.md +0 -0
  88. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/skills/policy.py +0 -0
  89. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/skills/registry.py +0 -0
  90. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/skills/runtime.py +0 -0
  91. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/skills/schema.py +0 -0
  92. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/skills/service.py +0 -0
  93. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/tools/__init__.py +0 -0
  94. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/tools/agent.py +0 -0
  95. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/tools/base.py +0 -0
  96. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/tools/bash.py +0 -0
  97. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/tools/clarify.py +0 -0
  98. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/tools/doc_template.py +0 -0
  99. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/tools/file_ops.py +0 -0
  100. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/tools/lsp.py +0 -0
  101. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/tools/on_intent.py +0 -0
  102. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/tools/plan_checkpoint.py +0 -0
  103. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/tools/registry.py +0 -0
  104. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/tools/repomap.py +0 -0
  105. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/tools/search.py +0 -0
  106. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/tools/task_status.py +0 -0
  107. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/tools/task_tracker.py +0 -0
  108. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/tools/todo.py +0 -0
  109. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/tools/web_content.py +0 -0
  110. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/tools/web_mcp.py +0 -0
  111. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/tools/webfetch.py +0 -0
  112. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/tools/websearch.py +0 -0
  113. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/ui/__init__.py +0 -0
  114. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/ui/commands.py +0 -0
  115. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/ui/frontend.py +0 -0
  116. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/ui/gateway/__init__.py +0 -0
  117. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/ui/gateway/bootstrap.py +0 -0
  118. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/ui/gateway/server.py +0 -0
  119. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/ui/gateway/session.py +0 -0
  120. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/ui/output/__init__.py +0 -0
  121. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/ui/output/browse.py +0 -0
  122. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/ui/output/capture.py +0 -0
  123. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/ui/output/console/__init__.py +0 -0
  124. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/ui/output/console/app.py +0 -0
  125. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/ui/output/console/formatting.py +0 -0
  126. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/ui/output/console/streaming.py +0 -0
  127. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/ui/output/diff.py +0 -0
  128. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/ui/output/dock/__init__.py +0 -0
  129. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/ui/output/dock/app.py +0 -0
  130. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/ui/output/dock/formatting.py +0 -0
  131. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/ui/output/dock/nodes.py +0 -0
  132. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/ui/output/dock/state.py +0 -0
  133. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/ui/output/events/__init__.py +0 -0
  134. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/ui/output/events/schema.py +0 -0
  135. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/ui/output/tree.py +0 -0
  136. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/ui/output/types.py +0 -0
  137. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/ui/protocol/__init__.py +0 -0
  138. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/ui/protocol/commands.py +0 -0
  139. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/ui/protocol/envelope.py +0 -0
  140. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/ui/protocol/requests.py +0 -0
  141. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/ui/protocol/schema.py +0 -0
  142. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/ui/protocol/transcript.py +0 -0
  143. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/ui/session.py +0 -0
  144. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/ui/tools/__init__.py +0 -0
  145. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/ui/tools/attachment_tokens.py +0 -0
  146. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/ui/tools/clipboard_image.py +0 -0
  147. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/ui/tools/code_ide.py +0 -0
  148. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/ui/tools/file_picker.py +0 -0
  149. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/ui/transcript.py +0 -0
  150. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/ui/tui/__init__.py +0 -0
  151. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/ui/tui/app.py +0 -0
  152. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/ui/tui/helpers.py +0 -0
  153. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/ui/tui/input.py +0 -0
  154. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/ui/tui/panels.py +0 -0
  155. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/ui/tui/parser.py +0 -0
  156. {voidx-2.0.0 → voidx-2.0.2}/src/voidx/ui/tui/renderer.py +0 -0
  157. {voidx-2.0.0 → voidx-2.0.2}/src/voidx.egg-info/SOURCES.txt +0 -0
  158. {voidx-2.0.0 → voidx-2.0.2}/src/voidx.egg-info/dependency_links.txt +0 -0
  159. {voidx-2.0.0 → voidx-2.0.2}/src/voidx.egg-info/entry_points.txt +0 -0
  160. {voidx-2.0.0 → voidx-2.0.2}/src/voidx.egg-info/requires.txt +0 -0
  161. {voidx-2.0.0 → voidx-2.0.2}/src/voidx.egg-info/top_level.txt +0 -0
  162. {voidx-2.0.0 → voidx-2.0.2}/tests/test_clipboard_image.py +0 -0
  163. {voidx-2.0.0 → voidx-2.0.2}/tests/test_code_ide.py +0 -0
  164. {voidx-2.0.0 → voidx-2.0.2}/tests/test_compaction.py +0 -0
  165. {voidx-2.0.0 → voidx-2.0.2}/tests/test_config.py +0 -0
  166. {voidx-2.0.0 → voidx-2.0.2}/tests/test_llm_provider.py +0 -0
  167. {voidx-2.0.0 → voidx-2.0.2}/tests/test_llm_usage.py +0 -0
  168. {voidx-2.0.0 → voidx-2.0.2}/tests/test_lsp.py +0 -0
  169. {voidx-2.0.0 → voidx-2.0.2}/tests/test_main.py +0 -0
  170. {voidx-2.0.0 → voidx-2.0.2}/tests/test_mcp.py +0 -0
  171. {voidx-2.0.0 → voidx-2.0.2}/tests/test_pure_tui.py +0 -0
  172. {voidx-2.0.0 → voidx-2.0.2}/tests/test_scrollback_flush.py +0 -0
  173. {voidx-2.0.0 → voidx-2.0.2}/tests/test_skills.py +0 -0
  174. {voidx-2.0.0 → voidx-2.0.2}/tests/test_startup.py +0 -0
  175. {voidx-2.0.0 → voidx-2.0.2}/tests/test_tree_smoke.py +0 -0
  176. {voidx-2.0.0 → voidx-2.0.2}/tests/test_ui_diff.py +0 -0
  177. {voidx-2.0.0 → voidx-2.0.2}/tests/test_ui_events.py +0 -0
  178. {voidx-2.0.0 → voidx-2.0.2}/tests/test_ui_frontend_protocol.py +0 -0
  179. {voidx-2.0.0 → voidx-2.0.2}/tests/test_ui_gateway.py +0 -0
  180. {voidx-2.0.0 → voidx-2.0.2}/tests/test_ui_session_changes.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: voidx
3
- Version: 2.0.0
3
+ Version: 2.0.2
4
4
  Summary: A coding agent that quantifies everything and solves with tools, not fuzzy prompts.
5
5
  Requires-Python: >=3.11
6
6
  Description-Content-Type: text/markdown
@@ -31,13 +31,13 @@ voidx is a terminal AI coding agent built in Python.
31
31
  macOS / Linux:
32
32
 
33
33
  ```bash
34
- curl -fsSL https://raw.githubusercontent.com/chikhamx/voidx/main/scripts/install.sh | bash
34
+ curl -fsSL https://raw.githubusercontent.com/chikhamx/voidx/master/scripts/install.sh | bash
35
35
  ```
36
36
 
37
37
  Windows (PowerShell):
38
38
 
39
39
  ```powershell
40
- irm https://raw.githubusercontent.com/chikhamx/voidx/main/scripts/install.ps1 | iex
40
+ irm https://raw.githubusercontent.com/chikhamx/voidx/master/scripts/install.ps1 | iex
41
41
  ```
42
42
 
43
43
  The installer downloads a standalone Python runtime and sets up voidx in an
@@ -57,6 +57,15 @@ npm install -g @chikhamx/voidx
57
57
  voidx
58
58
  ```
59
59
 
60
+ ### From source
61
+
62
+ ```bash
63
+ git clone https://github.com/chikhamx/voidx.git
64
+ cd voidx
65
+ pip install -e .
66
+ voidx
67
+ ```
68
+
60
69
  ### China / slow network
61
70
 
62
71
  Set mirror environment variables before running any install method:
@@ -9,13 +9,13 @@ voidx is a terminal AI coding agent built in Python.
9
9
  macOS / Linux:
10
10
 
11
11
  ```bash
12
- curl -fsSL https://raw.githubusercontent.com/chikhamx/voidx/main/scripts/install.sh | bash
12
+ curl -fsSL https://raw.githubusercontent.com/chikhamx/voidx/master/scripts/install.sh | bash
13
13
  ```
14
14
 
15
15
  Windows (PowerShell):
16
16
 
17
17
  ```powershell
18
- irm https://raw.githubusercontent.com/chikhamx/voidx/main/scripts/install.ps1 | iex
18
+ irm https://raw.githubusercontent.com/chikhamx/voidx/master/scripts/install.ps1 | iex
19
19
  ```
20
20
 
21
21
  The installer downloads a standalone Python runtime and sets up voidx in an
@@ -35,6 +35,15 @@ npm install -g @chikhamx/voidx
35
35
  voidx
36
36
  ```
37
37
 
38
+ ### From source
39
+
40
+ ```bash
41
+ git clone https://github.com/chikhamx/voidx.git
42
+ cd voidx
43
+ pip install -e .
44
+ voidx
45
+ ```
46
+
38
47
  ### China / slow network
39
48
 
40
49
  Set mirror environment variables before running any install method:
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "voidx"
3
- version = "2.0.0"
3
+ version = "2.0.2"
4
4
  description = "A coding agent that quantifies everything and solves with tools, not fuzzy prompts."
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.11"
@@ -1,3 +1,3 @@
1
1
  """VoidX - A coding agent that quantifies everything."""
2
2
 
3
- __version__ = "2.0.0"
3
+ __version__ = "2.0.2"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: voidx
3
- Version: 2.0.0
3
+ Version: 2.0.2
4
4
  Summary: A coding agent that quantifies everything and solves with tools, not fuzzy prompts.
5
5
  Requires-Python: >=3.11
6
6
  Description-Content-Type: text/markdown
@@ -31,13 +31,13 @@ voidx is a terminal AI coding agent built in Python.
31
31
  macOS / Linux:
32
32
 
33
33
  ```bash
34
- curl -fsSL https://raw.githubusercontent.com/chikhamx/voidx/main/scripts/install.sh | bash
34
+ curl -fsSL https://raw.githubusercontent.com/chikhamx/voidx/master/scripts/install.sh | bash
35
35
  ```
36
36
 
37
37
  Windows (PowerShell):
38
38
 
39
39
  ```powershell
40
- irm https://raw.githubusercontent.com/chikhamx/voidx/main/scripts/install.ps1 | iex
40
+ irm https://raw.githubusercontent.com/chikhamx/voidx/master/scripts/install.ps1 | iex
41
41
  ```
42
42
 
43
43
  The installer downloads a standalone Python runtime and sets up voidx in an
@@ -57,6 +57,15 @@ npm install -g @chikhamx/voidx
57
57
  voidx
58
58
  ```
59
59
 
60
+ ### From source
61
+
62
+ ```bash
63
+ git clone https://github.com/chikhamx/voidx.git
64
+ cd voidx
65
+ pip install -e .
66
+ voidx
67
+ ```
68
+
60
69
  ### China / slow network
61
70
 
62
71
  Set mirror environment variables before running any install method:
@@ -81,12 +81,11 @@ def test_npm_launcher_rejects_old_explicit_python(tmp_path):
81
81
 
82
82
 
83
83
  @pytest.mark.skipif(NODE is None, reason="node is not installed")
84
- def test_npm_launcher_does_not_search_system_python(tmp_path):
85
- """voidx.js must not fall back to system Python when bundled Python is missing."""
84
+ def test_npm_launcher_falls_back_to_system_python(tmp_path):
85
+ """voidx.js falls back to system Python when bundled Python is missing (v1.x upgrade path)."""
86
86
  if sys.platform == "win32":
87
87
  pytest.skip("uses a POSIX environment")
88
- # No bundled Python, no VOIDX_PYTHON — should fail with a clear message
89
- # about reinstalling, not about system Python.
88
+ # No bundled Python, no VOIDX_PYTHON — should try system Python as fallback.
90
89
  env = {
91
90
  "PATH": os.environ.get("PATH", ""),
92
91
  "VOIDX_NPM_HOME": str(tmp_path / "home"),
@@ -98,13 +97,10 @@ def test_npm_launcher_does_not_search_system_python(tmp_path):
98
97
  text=True,
99
98
  capture_output=True,
100
99
  )
101
- assert result.returncode == 1
102
- # Must NOT mention system python commands like python3, python, py -3
103
- assert "python3" not in result.stderr
104
- assert "python3.12" not in result.stderr
105
- assert "python3.11" not in result.stderr
106
- # Must mention reinstalling / bundled Python
107
- assert "reinstall" in result.stderr.lower() or "npm install" in result.stderr.lower()
100
+ # With system Python available, fallback should work (exit 0 or 1 from voidx itself)
101
+ # Without system Python, should fail with a clear message
102
+ if result.returncode == 1:
103
+ assert "npm install" in result.stderr.lower() or "python 3.11" in result.stderr.lower()
108
104
 
109
105
 
110
106
  @pytest.mark.skipif(NODE is None, reason="node is not installed")
@@ -152,8 +148,8 @@ def test_npm_launcher_selectPython_uses_bundled_only(tmp_path):
152
148
 
153
149
 
154
150
  @pytest.mark.skipif(NODE is None, reason="node is not installed")
155
- def test_npm_launcher_selectPython_fails_without_bundled(tmp_path):
156
- """selectPython must throw when bundled Python is missing and no VOIDX_PYTHON."""
151
+ def test_npm_launcher_selectPython_falls_back_to_system(tmp_path):
152
+ """selectPython falls back to system Python when bundled Python is missing."""
157
153
  env = {
158
154
  "PATH": os.environ.get("PATH", ""),
159
155
  "VOIDX_NPM_HOME": str(tmp_path / "home"),
@@ -161,7 +157,7 @@ def test_npm_launcher_selectPython_fails_without_bundled(tmp_path):
161
157
  result = subprocess.run(
162
158
  [NODE, "-e", (
163
159
  "const m = require('./npm/bin/voidx.js');"
164
- "try { m.selectPython(process.env); console.log('NO_ERROR'); }"
160
+ "try { const p = m.selectPython(process.env); console.log('OK:' + p.label); }"
165
161
  "catch(e) { console.log('ERROR:' + e.message); }"
166
162
  )],
167
163
  cwd=ROOT,
@@ -170,11 +166,8 @@ def test_npm_launcher_selectPython_fails_without_bundled(tmp_path):
170
166
  capture_output=True,
171
167
  )
172
168
  assert result.returncode == 0, result.stderr
173
- assert result.stdout.startswith("ERROR:")
174
- # Must NOT suggest installing system Python
175
- assert "brew install" not in result.stdout
176
- assert "apt install" not in result.stdout
177
- assert "python.org" not in result.stdout
169
+ # Should either find a system Python or report a clear error
170
+ assert result.stdout.startswith("OK:") or result.stdout.startswith("ERROR:")
178
171
 
179
172
 
180
173
  @pytest.mark.skipif(NODE is None, reason="node is not installed")
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
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
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
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
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes