multacd 2.0.0b2__tar.gz → 2.0.0b3__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 (193) hide show
  1. {multacd-2.0.0b2 → multacd-2.0.0b3}/.github/workflows/release.yml +1 -1
  2. {multacd-2.0.0b2 → multacd-2.0.0b3}/CHANGELOG.md +14 -2
  3. {multacd-2.0.0b2 → multacd-2.0.0b3}/PKG-INFO +3 -2
  4. {multacd-2.0.0b2 → multacd-2.0.0b3}/core/version.py +1 -1
  5. {multacd-2.0.0b2 → multacd-2.0.0b3}/pyproject.toml +7 -2
  6. {multacd-2.0.0b2 → multacd-2.0.0b3}/requirements.txt +2 -1
  7. {multacd-2.0.0b2 → multacd-2.0.0b3}/roadmap/ROADMAP.md +48 -1
  8. {multacd-2.0.0b2 → multacd-2.0.0b3}/scripts/install.sh +26 -10
  9. {multacd-2.0.0b2 → multacd-2.0.0b3}/search_providers/exa.py +1 -1
  10. {multacd-2.0.0b2 → multacd-2.0.0b3}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  11. {multacd-2.0.0b2 → multacd-2.0.0b3}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  12. {multacd-2.0.0b2 → multacd-2.0.0b3}/.github/pull_request_template.md +0 -0
  13. {multacd-2.0.0b2 → multacd-2.0.0b3}/.github/workflows/test.yml +0 -0
  14. {multacd-2.0.0b2 → multacd-2.0.0b3}/.gitignore +0 -0
  15. {multacd-2.0.0b2 → multacd-2.0.0b3}/CONTRIBUTING.md +0 -0
  16. {multacd-2.0.0b2 → multacd-2.0.0b3}/DESIGN.md +0 -0
  17. {multacd-2.0.0b2 → multacd-2.0.0b3}/LICENSE +0 -0
  18. {multacd-2.0.0b2 → multacd-2.0.0b3}/README.md +0 -0
  19. {multacd-2.0.0b2 → multacd-2.0.0b3}/briefing/__init__.py +0 -0
  20. {multacd-2.0.0b2 → multacd-2.0.0b3}/briefing/generator.py +0 -0
  21. {multacd-2.0.0b2 → multacd-2.0.0b3}/briefing/privacy.py +0 -0
  22. {multacd-2.0.0b2 → multacd-2.0.0b3}/briefing/sources/__init__.py +0 -0
  23. {multacd-2.0.0b2 → multacd-2.0.0b3}/briefing/sources/git_source.py +0 -0
  24. {multacd-2.0.0b2 → multacd-2.0.0b3}/briefing/sources/news_source.py +0 -0
  25. {multacd-2.0.0b2 → multacd-2.0.0b3}/briefing/sources/todo_source.py +0 -0
  26. {multacd-2.0.0b2 → multacd-2.0.0b3}/core/__init__.py +0 -0
  27. {multacd-2.0.0b2 → multacd-2.0.0b3}/core/agent_loop.py +0 -0
  28. {multacd-2.0.0b2 → multacd-2.0.0b3}/core/clipboard.py +0 -0
  29. {multacd-2.0.0b2 → multacd-2.0.0b3}/core/codebase.py +0 -0
  30. {multacd-2.0.0b2 → multacd-2.0.0b3}/core/config.py +0 -0
  31. {multacd-2.0.0b2 → multacd-2.0.0b3}/core/llm_client.py +0 -0
  32. {multacd-2.0.0b2 → multacd-2.0.0b3}/core/mode_manager.py +0 -0
  33. {multacd-2.0.0b2 → multacd-2.0.0b3}/core/permissions.py +0 -0
  34. {multacd-2.0.0b2 → multacd-2.0.0b3}/core/plugin_loader.py +0 -0
  35. {multacd-2.0.0b2 → multacd-2.0.0b3}/core/prompt_composer.py +0 -0
  36. {multacd-2.0.0b2 → multacd-2.0.0b3}/core/providers/__init__.py +0 -0
  37. {multacd-2.0.0b2 → multacd-2.0.0b3}/core/providers/__main__.py +0 -0
  38. {multacd-2.0.0b2 → multacd-2.0.0b3}/core/providers/anthropic.py +0 -0
  39. {multacd-2.0.0b2 → multacd-2.0.0b3}/core/providers/openai_compat.py +0 -0
  40. {multacd-2.0.0b2 → multacd-2.0.0b3}/core/research/__init__.py +0 -0
  41. {multacd-2.0.0b2 → multacd-2.0.0b3}/core/research/bus.py +0 -0
  42. {multacd-2.0.0b2 → multacd-2.0.0b3}/core/research/orchestrator.py +0 -0
  43. {multacd-2.0.0b2 → multacd-2.0.0b3}/core/research/query_generator.py +0 -0
  44. {multacd-2.0.0b2 → multacd-2.0.0b3}/core/updater.py +0 -0
  45. {multacd-2.0.0b2 → multacd-2.0.0b3}/daemon/__init__.py +0 -0
  46. {multacd-2.0.0b2 → multacd-2.0.0b3}/daemon/ipc.py +0 -0
  47. {multacd-2.0.0b2 → multacd-2.0.0b3}/daemon/process.py +0 -0
  48. {multacd-2.0.0b2 → multacd-2.0.0b3}/docs/configuration.md +0 -0
  49. {multacd-2.0.0b2 → multacd-2.0.0b3}/docs/index.md +0 -0
  50. {multacd-2.0.0b2 → multacd-2.0.0b3}/docs/install.md +0 -0
  51. {multacd-2.0.0b2 → multacd-2.0.0b3}/docs/mkdocs.yml +0 -0
  52. {multacd-2.0.0b2 → multacd-2.0.0b3}/docs/modes/coding.md +0 -0
  53. {multacd-2.0.0b2 → multacd-2.0.0b3}/docs/modes/personal.md +0 -0
  54. {multacd-2.0.0b2 → multacd-2.0.0b3}/docs/modes/research.md +0 -0
  55. {multacd-2.0.0b2 → multacd-2.0.0b3}/docs/plugins.md +0 -0
  56. {multacd-2.0.0b2 → multacd-2.0.0b3}/docs/quickstart.md +0 -0
  57. {multacd-2.0.0b2 → multacd-2.0.0b3}/main.py +0 -0
  58. {multacd-2.0.0b2 → multacd-2.0.0b3}/memory/__init__.py +0 -0
  59. {multacd-2.0.0b2 → multacd-2.0.0b3}/memory/context.py +0 -0
  60. {multacd-2.0.0b2 → multacd-2.0.0b3}/memory/store.py +0 -0
  61. {multacd-2.0.0b2 → multacd-2.0.0b3}/multacd.spec +0 -0
  62. {multacd-2.0.0b2 → multacd-2.0.0b3}/plan/PLAN-phase1.md +0 -0
  63. {multacd-2.0.0b2 → multacd-2.0.0b3}/plan/PLAN-phase2.md +0 -0
  64. {multacd-2.0.0b2 → multacd-2.0.0b3}/plugins/README.md +0 -0
  65. {multacd-2.0.0b2 → multacd-2.0.0b3}/plugins/example_plugin.py +0 -0
  66. {multacd-2.0.0b2 → multacd-2.0.0b3}/scheduler/__init__.py +0 -0
  67. {multacd-2.0.0b2 → multacd-2.0.0b3}/scheduler/engine.py +0 -0
  68. {multacd-2.0.0b2 → multacd-2.0.0b3}/scheduler/jobs/__init__.py +0 -0
  69. {multacd-2.0.0b2 → multacd-2.0.0b3}/scheduler/jobs/briefing_job.py +0 -0
  70. {multacd-2.0.0b2 → multacd-2.0.0b3}/scheduler/jobs/research_job.py +0 -0
  71. {multacd-2.0.0b2 → multacd-2.0.0b3}/scripts/install.ps1 +0 -0
  72. {multacd-2.0.0b2 → multacd-2.0.0b3}/search_providers/__init__.py +0 -0
  73. {multacd-2.0.0b2 → multacd-2.0.0b3}/search_providers/__main__.py +0 -0
  74. {multacd-2.0.0b2 → multacd-2.0.0b3}/search_providers/base.py +0 -0
  75. {multacd-2.0.0b2 → multacd-2.0.0b3}/search_providers/brave.py +0 -0
  76. {multacd-2.0.0b2 → multacd-2.0.0b3}/search_providers/duckduckgo.py +0 -0
  77. {multacd-2.0.0b2 → multacd-2.0.0b3}/search_providers/serpapi.py +0 -0
  78. {multacd-2.0.0b2 → multacd-2.0.0b3}/search_providers/tavily.py +0 -0
  79. {multacd-2.0.0b2 → multacd-2.0.0b3}/soul.md +0 -0
  80. {multacd-2.0.0b2 → multacd-2.0.0b3}/tests/__init__.py +0 -0
  81. {multacd-2.0.0b2 → multacd-2.0.0b3}/tests/conftest.py +0 -0
  82. {multacd-2.0.0b2 → multacd-2.0.0b3}/tests/integration/__init__.py +0 -0
  83. {multacd-2.0.0b2 → multacd-2.0.0b3}/tests/integration/test_agent_loop.py +0 -0
  84. {multacd-2.0.0b2 → multacd-2.0.0b3}/tests/test_selftests.py +0 -0
  85. {multacd-2.0.0b2 → multacd-2.0.0b3}/tests/unit/__init__.py +0 -0
  86. {multacd-2.0.0b2 → multacd-2.0.0b3}/tests/unit/test_binary.py +0 -0
  87. {multacd-2.0.0b2 → multacd-2.0.0b3}/tests/unit/test_config.py +0 -0
  88. {multacd-2.0.0b2 → multacd-2.0.0b3}/tests/unit/test_docs.py +0 -0
  89. {multacd-2.0.0b2 → multacd-2.0.0b3}/tests/unit/test_entrypoint.py +0 -0
  90. {multacd-2.0.0b2 → multacd-2.0.0b3}/tests/unit/test_github.py +0 -0
  91. {multacd-2.0.0b2 → multacd-2.0.0b3}/tests/unit/test_installer.py +0 -0
  92. {multacd-2.0.0b2 → multacd-2.0.0b3}/tests/unit/test_permissions.py +0 -0
  93. {multacd-2.0.0b2 → multacd-2.0.0b3}/tests/unit/test_plugin_loader.py +0 -0
  94. {multacd-2.0.0b2 → multacd-2.0.0b3}/tests/unit/test_privacy_filter.py +0 -0
  95. {multacd-2.0.0b2 → multacd-2.0.0b3}/tests/unit/test_search_providers/__init__.py +0 -0
  96. {multacd-2.0.0b2 → multacd-2.0.0b3}/tests/unit/test_search_providers/test_tavily.py +0 -0
  97. {multacd-2.0.0b2 → multacd-2.0.0b3}/tests/unit/test_tools/__init__.py +0 -0
  98. {multacd-2.0.0b2 → multacd-2.0.0b3}/tests/unit/test_tools/test_bash.py +0 -0
  99. {multacd-2.0.0b2 → multacd-2.0.0b3}/tests/unit/test_tools/test_read_file.py +0 -0
  100. {multacd-2.0.0b2 → multacd-2.0.0b3}/tests/unit/test_tools/test_web_scrape.py +0 -0
  101. {multacd-2.0.0b2 → multacd-2.0.0b3}/tests/unit/test_tools/test_write_file.py +0 -0
  102. {multacd-2.0.0b2 → multacd-2.0.0b3}/tests/unit/test_updater.py +0 -0
  103. {multacd-2.0.0b2 → multacd-2.0.0b3}/tg/__init__.py +0 -0
  104. {multacd-2.0.0b2 → multacd-2.0.0b3}/tg/access_control.py +0 -0
  105. {multacd-2.0.0b2 → multacd-2.0.0b3}/tg/agent.py +0 -0
  106. {multacd-2.0.0b2 → multacd-2.0.0b3}/tg/bot.py +0 -0
  107. {multacd-2.0.0b2 → multacd-2.0.0b3}/tg/file_handler.py +0 -0
  108. {multacd-2.0.0b2 → multacd-2.0.0b3}/tg/formatter.py +0 -0
  109. {multacd-2.0.0b2 → multacd-2.0.0b3}/tg/handlers.py +0 -0
  110. {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/__init__.py +0 -0
  111. {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/agent/__init__.py +0 -0
  112. {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/agent/ask.py +0 -0
  113. {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/agent/skill.py +0 -0
  114. {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/agent/task.py +0 -0
  115. {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/agent/todo_write.py +0 -0
  116. {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/code/__init__.py +0 -0
  117. {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/code/lint_python.py +0 -0
  118. {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/code/run_python.py +0 -0
  119. {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/code/run_tests.py +0 -0
  120. {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/codebase/__init__.py +0 -0
  121. {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/codebase/scan_codebase.py +0 -0
  122. {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/common.py +0 -0
  123. {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/filesystem/__init__.py +0 -0
  124. {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/filesystem/apply_patch.py +0 -0
  125. {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/filesystem/delete_file.py +0 -0
  126. {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/filesystem/edit_file.py +0 -0
  127. {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/filesystem/glob.py +0 -0
  128. {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/filesystem/grep.py +0 -0
  129. {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/filesystem/list_dir.py +0 -0
  130. {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/filesystem/move_file.py +0 -0
  131. {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/filesystem/multi_edit.py +0 -0
  132. {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/filesystem/read_file.py +0 -0
  133. {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/filesystem/read_many_files.py +0 -0
  134. {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/filesystem/write_file.py +0 -0
  135. {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/git/__init__.py +0 -0
  136. {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/git/_helper.py +0 -0
  137. {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/git/git_add.py +0 -0
  138. {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/git/git_branch.py +0 -0
  139. {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/git/git_checkout.py +0 -0
  140. {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/git/git_commit.py +0 -0
  141. {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/git/git_diff.py +0 -0
  142. {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/git/git_log.py +0 -0
  143. {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/git/git_merge.py +0 -0
  144. {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/git/git_pull.py +0 -0
  145. {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/git/git_push.py +0 -0
  146. {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/git/git_status.py +0 -0
  147. {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/memory/__init__.py +0 -0
  148. {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/memory/forget.py +0 -0
  149. {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/memory/recall.py +0 -0
  150. {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/memory/remember.py +0 -0
  151. {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/personal/__init__.py +0 -0
  152. {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/personal/cancel_job.py +0 -0
  153. {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/personal/daemon_status.py +0 -0
  154. {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/personal/generate_briefing.py +0 -0
  155. {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/personal/get_jobs.py +0 -0
  156. {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/personal/schedule_job.py +0 -0
  157. {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/personal/send_telegram.py +0 -0
  158. {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/personal/user_manager.py +0 -0
  159. {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/registry.py +0 -0
  160. {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/research/__init__.py +0 -0
  161. {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/research/deep_research.py +0 -0
  162. {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/research/export_research.py +0 -0
  163. {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/research/quick_research.py +0 -0
  164. {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/research/web_scrape.py +0 -0
  165. {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/research/web_search.py +0 -0
  166. {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/shell/__init__.py +0 -0
  167. {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/shell/bash.py +0 -0
  168. {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/streaming.py +0 -0
  169. {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/web/__init__.py +0 -0
  170. {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/web/web_fetch.py +0 -0
  171. {multacd-2.0.0b2 → multacd-2.0.0b3}/tui/__init__.py +0 -0
  172. {multacd-2.0.0b2 → multacd-2.0.0b3}/tui/app.py +0 -0
  173. {multacd-2.0.0b2 → multacd-2.0.0b3}/tui/icons.py +0 -0
  174. {multacd-2.0.0b2 → multacd-2.0.0b3}/tui/screens/__init__.py +0 -0
  175. {multacd-2.0.0b2 → multacd-2.0.0b3}/tui/screens/main_screen.py +0 -0
  176. {multacd-2.0.0b2 → multacd-2.0.0b3}/tui/screens/setup_wizard.py +0 -0
  177. {multacd-2.0.0b2 → multacd-2.0.0b3}/tui/themes/__init__.py +0 -0
  178. {multacd-2.0.0b2 → multacd-2.0.0b3}/tui/themes/__main__.py +0 -0
  179. {multacd-2.0.0b2 → multacd-2.0.0b3}/tui/tokens.py +0 -0
  180. {multacd-2.0.0b2 → multacd-2.0.0b3}/tui/widgets/__init__.py +0 -0
  181. {multacd-2.0.0b2 → multacd-2.0.0b3}/tui/widgets/chat_panel.py +0 -0
  182. {multacd-2.0.0b2 → multacd-2.0.0b3}/tui/widgets/confirm_dialog.py +0 -0
  183. {multacd-2.0.0b2 → multacd-2.0.0b3}/tui/widgets/diff_viewer.py +0 -0
  184. {multacd-2.0.0b2 → multacd-2.0.0b3}/tui/widgets/file_tree.py +0 -0
  185. {multacd-2.0.0b2 → multacd-2.0.0b3}/tui/widgets/info_panel.py +0 -0
  186. {multacd-2.0.0b2 → multacd-2.0.0b3}/tui/widgets/input_bar.py +0 -0
  187. {multacd-2.0.0b2 → multacd-2.0.0b3}/tui/widgets/model_selector.py +0 -0
  188. {multacd-2.0.0b2 → multacd-2.0.0b3}/tui/widgets/permission_popup.py +0 -0
  189. {multacd-2.0.0b2 → multacd-2.0.0b3}/tui/widgets/slash_palette.py +0 -0
  190. {multacd-2.0.0b2 → multacd-2.0.0b3}/tui/widgets/sources_panel.py +0 -0
  191. {multacd-2.0.0b2 → multacd-2.0.0b3}/tui/widgets/status_bar.py +0 -0
  192. {multacd-2.0.0b2 → multacd-2.0.0b3}/tui/widgets/thinking_bar.py +0 -0
  193. {multacd-2.0.0b2 → multacd-2.0.0b3}/tui/widgets/tool_activity.py +0 -0
@@ -101,7 +101,7 @@ jobs:
101
101
 
102
102
  ```bash
103
103
  pkg install -y python git
104
- pip install "multacd==2.0.0b2" --pre
104
+ pip install "multacd==2.0.0b3"
105
105
  ```
106
106
 
107
107
  Windows (PowerShell):
@@ -2,6 +2,17 @@
2
2
 
3
3
  Format: Keep a Changelog. Versi: Semantic Versioning.
4
4
 
5
+ ## [2.0.0b3] - 2026-09-12
6
+
7
+ Beta v2 ketiga — benerin install Termux (#24): `exa-py` jadi extra
8
+ opsional `[exa]` (rantai Rust jiter tanpa wheel Android), installer
9
+ langsung jalur pip di Termux (tanpa nyoba binary 404), pin beta exact
10
+ tanpa `--pre` (deps resolve stabil, anti httpx-dev/apscheduler-alpha).
11
+
12
+ Install beta: `pip install "multacd==2.0.0b3"` (tanpa --pre!)
13
+ atau binary dari halaman GitHub prerelease (Linux/macOS/Windows —
14
+ Termux wajib pip).
15
+
5
16
  ## [2.0.0b2] - 2026-09-12
6
17
 
7
18
  Beta v2 kedua: cabut LiteLLM, ganti provider native (httpx, 2 adapter
@@ -9,8 +20,9 @@ SSE: OpenAI-compatible + Anthropic) — install pip Termux ringan tanpa
9
20
  Rust, binary susut 91MB ke 56MB. Cost estimasi lokal ala OpenCode
10
21
  tampil di info panel. Interface stream_completion tidak berubah.
11
22
 
12
- Install beta: `pip install --pre "multacd==2.0.0b2"` (PyPI pre-release)
13
- atau binary dari halaman GitHub prerelease.
23
+ Install beta: `pip install "multacd==2.0.0b2"` (tanpa --pre; pin exact
24
+ otomatis boleh beta, deps tetap stabil) atau binary dari halaman
25
+ GitHub prerelease.
14
26
 
15
27
  ## [2.0.0b1] - 2026-09-12
16
28
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: multacd
3
- Version: 2.0.0b2
3
+ Version: 2.0.0b3
4
4
  Summary: Agentic TUI for coding, research, and personal automation
5
5
  Project-URL: Homepage, https://github.com/prototypeall850-creator/multacd
6
6
  Project-URL: Issues, https://github.com/prototypeall850-creator/multacd/issues
@@ -18,7 +18,6 @@ Classifier: Topic :: Terminals
18
18
  Requires-Python: >=3.10
19
19
  Requires-Dist: apscheduler>=3.10.0
20
20
  Requires-Dist: beautifulsoup4>=4.12.0
21
- Requires-Dist: exa-py>=1.0.0
22
21
  Requires-Dist: httpx>=0.27.0
23
22
  Requires-Dist: markdownify>=0.12.0
24
23
  Requires-Dist: pydantic>=2.0
@@ -32,6 +31,8 @@ Requires-Dist: pytest-asyncio; extra == 'dev'
32
31
  Requires-Dist: pytest-cov; extra == 'dev'
33
32
  Requires-Dist: pytest>=8.0.0; extra == 'dev'
34
33
  Requires-Dist: ruff>=0.4.0; extra == 'dev'
34
+ Provides-Extra: exa
35
+ Requires-Dist: exa-py>=1.0.0; extra == 'exa'
35
36
  Description-Content-Type: text/markdown
36
37
 
37
38
  # ⚡ multacd
@@ -8,7 +8,7 @@ Saat bump versi (Step 10 → 1.0.0): ubah pyproject + FALLBACK di sini.
8
8
 
9
9
  from __future__ import annotations
10
10
 
11
- FALLBACK = "2.0.0b2" # beta v2; samakan dengan pyproject.toml
11
+ FALLBACK = "2.0.0b3" # beta v2; samakan dengan pyproject.toml
12
12
 
13
13
 
14
14
  def get_version() -> str:
@@ -8,7 +8,7 @@ build-backend = "hatchling.build"
8
8
 
9
9
  [project]
10
10
  name = "multacd"
11
- version = "2.0.0b2"
11
+ version = "2.0.0b3"
12
12
  description = "Agentic TUI for coding, research, and personal automation"
13
13
  readme = "README.md"
14
14
  requires-python = ">=3.10"
@@ -34,12 +34,17 @@ dependencies = [
34
34
  "beautifulsoup4>=4.12.0",
35
35
  "markdownify>=0.12.0",
36
36
  "tavily-python>=0.3.0",
37
- "exa-py>=1.0.0",
38
37
  "python-telegram-bot>=21.0",
39
38
  "APScheduler>=3.10.0",
40
39
  ]
41
40
 
42
41
  [project.optional-dependencies]
42
+ # Exa search: rantai exa-py -> openai -> jiter (Rust, tanpa wheel Android).
43
+ # Default install wajib murni-wheel (Termux). Butuh Exa:
44
+ # pip install "multacd[exa]"
45
+ exa = [
46
+ "exa-py>=1.0.0",
47
+ ]
43
48
  dev = [
44
49
  "pytest>=8.0.0",
45
50
  "pytest-cov",
@@ -7,6 +7,7 @@ pytest>=8.0.0
7
7
  beautifulsoup4>=4.12.0
8
8
  markdownify>=0.12.0
9
9
  tavily-python>=0.3.0
10
- exa-py>=1.0.0
10
+ # exa-py OPSIONAL (rantai Rust jiter, tanpa wheel Android):
11
+ # pip install "multacd[exa]"
11
12
  python-telegram-bot>=21.0
12
13
  APScheduler>=3.10.0
@@ -185,7 +185,6 @@ Fitur yang mungkin masuk v1.1.0:
185
185
  More themes (Tokyo Night, Nord, Dracula)
186
186
 
187
187
  Fitur yang mungkin masuk v1.2.0:
188
- LSP integration (Language Server Protocol) untuk coding agent
189
188
  Multi-project workspace (bisa kelola beberapa project sekaligus)
190
189
  Voice input (via Whisper API)
191
190
 
@@ -199,6 +198,54 @@ Redesign v2 full bebas (dikerjakan sekarang, baseline Termux v0.119):
199
198
  Shell: splash v2 + layout hemat (done)
200
199
  Done: model selector (S12, Ctrl+O + /model), info panel (S11, Ctrl+I)
201
200
  Research context (round/sources/token ~) tampil di info panel mode /research
201
+ Done b2: provider LLM native (cabut LiteLLM, 2 adapter SSE),
202
+ cost estimasi lokal di info panel, binary 91MB ke 56MB
203
+ ```
204
+
205
+ ### Inspirasi opencode — Tier 1 (gas dulu, effort kecil)
206
+
207
+ ```
208
+ Urutan saran: /undo → AGENTS.md → @mention → sessions → commands.
209
+ Satu kelar langsung beta + test Termux, jangan ditumpuk.
210
+
211
+ 1. /undo + /redo — revert perubahan agent per langkah.
212
+ Fondasi ada (git flow + branch dialog): catat file sentuh per turn,
213
+ undo = git checkout file itu. Bikin user berani nyuruh agent.
214
+ 2. Custom slash commands (~/.multacd/commands/*.md) — file markdown
215
+ jadi command (/review, /commit, /rilis). Loader + daftar ke palette.
216
+ 3. AGENTS.md per-proyek + /init — agent baca pola proyek sebelum kerja.
217
+ soul.md global + codebase scan sudah ada; tambah baca AGENTS.md di
218
+ root proyek + command /init buat generate otomatis.
219
+ 4. @ file mention di input — ketik @ muncul fuzzy finder file buat
220
+ ditempel ke prompt. Selector fuzzy + grouping sudah ada.
221
+ 5. Sessions persist — history chat ke SQLite (memory SQLite sudah ada),
222
+ /resume + list sesi lama. Sekarang konteks hilang tiap keluar.
223
+ ```
224
+
225
+ ### Inspirasi opencode — Tier 2 (effort sedang, naik kelas)
226
+
227
+ ```
228
+ 6. Keybinds custom di config — semua shortcut bisa di-remap (Textual
229
+ support binding override, tinggal baca dari config).
230
+ 7. Formatters otomatis — habis agent edit file, jalanin formatter
231
+ (ruff format, prettier) sesuai tipe file. Pasangan /undo.
232
+ 8. Subagents paralel — agent utama bisa delegasi riset background
233
+ (pola kurasi/live paralel wizard sudah ada).
234
+ 9. /share — export satu sesi penuh ke markdown rapi + copy
235
+ (versi murah tanpa server; mirip /copy yang sudah ada).
236
+ 10. MCP client — ngomong ke MCP server, buka ekosistem tool ke luar.
237
+ Standar industri; nambah deps + kompleksitas, timbang saat eksekusi.
238
+ ```
239
+
240
+ ### Ditunda / skip (sadar, bukan lupa)
241
+
242
+ ```
243
+ LSP integration — berat RAM/CPU, musuh Termux. Codebase scan cukup
244
+ untuk 80% kasus. (Coret dari rencana v1.2.0 di bawah.)
245
+ IDE extension / desktop app / web UI — identitas multacd = TUI +
246
+ Telegram. Fokus.
247
+ Model terkurasi via server (ala Zen) — butuh server + key sendiri,
248
+ lawan arah BYOK murni.
202
249
  ```
203
250
 
204
251
  ---
@@ -58,16 +58,7 @@ pip_fallback() {
58
58
  if is_termux; then
59
59
  # Jujur: binary rilis (build ubuntu glibc) TIDAK jalan di Termux
60
60
  # (bionic libc) — Termux wajib jalur pip.
61
- echo "Termux terdeteksi — pakai jalur pip (binary rilis tidak kompatibel)."
62
- echo ""
63
- echo " 1. Siapkan toolchain (sekali saja):"
64
- echo " pkg install -y python git curl"
65
- echo " (ringan: tanpa kompilasi Rust — dependensi wheel murni)"
66
- echo ""
67
- echo " 2. Install multacd:"
68
- echo " pip install \"git+https://github.com/$REPO\""
69
- echo ""
70
- echo " 3. Jalankan: multacd"
61
+ termux_pip_guide
71
62
  exit 1
72
63
  fi
73
64
  echo "Install binary gagal / platform belum ada binary-nya."
@@ -76,8 +67,33 @@ pip_fallback() {
76
67
  echo "Lalu jalankan: multacd"
77
68
  }
78
69
 
70
+ termux_pip_guide() {
71
+ # Pin beta exact TANPA --pre: pip tetap boleh install versi beta yang
72
+ # dipin, sementara dependensi resolve ke versi stabil (anti httpx-dev /
73
+ # apscheduler-alpha / pydantic-beta). --pre bocor ke semua deps!
74
+ echo "Termux terdeteksi — pakai jalur pip (binary rilis tidak kompatibel)."
75
+ echo ""
76
+ echo " 1. Siapkan toolchain (sekali saja):"
77
+ echo " pkg install -y python git curl"
78
+ echo " (ringan: tanpa kompilasi Rust — dependensi wheel murni)"
79
+ echo ""
80
+ echo " 2. Install multacd:"
81
+ echo " pip install \"multacd==2.0.0b3\""
82
+ echo ""
83
+ echo " 3. Jalankan: multacd"
84
+ echo ""
85
+ echo " Opsional (provider search Exa, butuh Rust — lewati kalau ragu):"
86
+ echo " pip install \"multacd[exa]\""
87
+ }
88
+
79
89
  main() {
80
90
  local platform url tmp dest_dir dest
91
+ # Termux: tidak ada binary yang kompatibel (glibc vs bionic) — jangan
92
+ # buang waktu nyoba unduh URL yang pasti 404, langsung panduan pip.
93
+ if is_termux; then
94
+ termux_pip_guide
95
+ exit 1
96
+ fi
81
97
  platform="$(detect_platform)"
82
98
  if [ "$platform" = "unsupported" ]; then
83
99
  pip_fallback "platform tidak dikenal ($(uname -s)/$(uname -m))."
@@ -55,7 +55,7 @@ class ExaProvider(SearchProvider):
55
55
  from exa_py import Exa
56
56
  except ImportError as e:
57
57
  raise SearchProviderError(
58
- "SDK exa-py belum install. Jalankan: pip install exa-py"
58
+ 'SDK exa-py belum install. Jalankan: pip install "multacd[exa]"'
59
59
  ) from e
60
60
  try:
61
61
  client = Exa(api_key=self._api_key)
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