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.
- {multacd-2.0.0b2 → multacd-2.0.0b3}/.github/workflows/release.yml +1 -1
- {multacd-2.0.0b2 → multacd-2.0.0b3}/CHANGELOG.md +14 -2
- {multacd-2.0.0b2 → multacd-2.0.0b3}/PKG-INFO +3 -2
- {multacd-2.0.0b2 → multacd-2.0.0b3}/core/version.py +1 -1
- {multacd-2.0.0b2 → multacd-2.0.0b3}/pyproject.toml +7 -2
- {multacd-2.0.0b2 → multacd-2.0.0b3}/requirements.txt +2 -1
- {multacd-2.0.0b2 → multacd-2.0.0b3}/roadmap/ROADMAP.md +48 -1
- {multacd-2.0.0b2 → multacd-2.0.0b3}/scripts/install.sh +26 -10
- {multacd-2.0.0b2 → multacd-2.0.0b3}/search_providers/exa.py +1 -1
- {multacd-2.0.0b2 → multacd-2.0.0b3}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/.github/pull_request_template.md +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/.github/workflows/test.yml +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/.gitignore +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/CONTRIBUTING.md +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/DESIGN.md +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/LICENSE +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/README.md +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/briefing/__init__.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/briefing/generator.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/briefing/privacy.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/briefing/sources/__init__.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/briefing/sources/git_source.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/briefing/sources/news_source.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/briefing/sources/todo_source.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/core/__init__.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/core/agent_loop.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/core/clipboard.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/core/codebase.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/core/config.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/core/llm_client.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/core/mode_manager.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/core/permissions.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/core/plugin_loader.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/core/prompt_composer.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/core/providers/__init__.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/core/providers/__main__.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/core/providers/anthropic.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/core/providers/openai_compat.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/core/research/__init__.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/core/research/bus.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/core/research/orchestrator.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/core/research/query_generator.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/core/updater.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/daemon/__init__.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/daemon/ipc.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/daemon/process.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/docs/configuration.md +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/docs/index.md +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/docs/install.md +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/docs/mkdocs.yml +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/docs/modes/coding.md +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/docs/modes/personal.md +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/docs/modes/research.md +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/docs/plugins.md +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/docs/quickstart.md +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/main.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/memory/__init__.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/memory/context.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/memory/store.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/multacd.spec +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/plan/PLAN-phase1.md +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/plan/PLAN-phase2.md +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/plugins/README.md +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/plugins/example_plugin.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/scheduler/__init__.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/scheduler/engine.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/scheduler/jobs/__init__.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/scheduler/jobs/briefing_job.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/scheduler/jobs/research_job.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/scripts/install.ps1 +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/search_providers/__init__.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/search_providers/__main__.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/search_providers/base.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/search_providers/brave.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/search_providers/duckduckgo.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/search_providers/serpapi.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/search_providers/tavily.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/soul.md +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/tests/__init__.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/tests/conftest.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/tests/integration/__init__.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/tests/integration/test_agent_loop.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/tests/test_selftests.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/tests/unit/__init__.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/tests/unit/test_binary.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/tests/unit/test_config.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/tests/unit/test_docs.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/tests/unit/test_entrypoint.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/tests/unit/test_github.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/tests/unit/test_installer.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/tests/unit/test_permissions.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/tests/unit/test_plugin_loader.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/tests/unit/test_privacy_filter.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/tests/unit/test_search_providers/__init__.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/tests/unit/test_search_providers/test_tavily.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/tests/unit/test_tools/__init__.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/tests/unit/test_tools/test_bash.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/tests/unit/test_tools/test_read_file.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/tests/unit/test_tools/test_web_scrape.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/tests/unit/test_tools/test_write_file.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/tests/unit/test_updater.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/tg/__init__.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/tg/access_control.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/tg/agent.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/tg/bot.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/tg/file_handler.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/tg/formatter.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/tg/handlers.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/__init__.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/agent/__init__.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/agent/ask.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/agent/skill.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/agent/task.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/agent/todo_write.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/code/__init__.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/code/lint_python.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/code/run_python.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/code/run_tests.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/codebase/__init__.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/codebase/scan_codebase.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/common.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/filesystem/__init__.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/filesystem/apply_patch.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/filesystem/delete_file.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/filesystem/edit_file.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/filesystem/glob.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/filesystem/grep.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/filesystem/list_dir.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/filesystem/move_file.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/filesystem/multi_edit.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/filesystem/read_file.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/filesystem/read_many_files.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/filesystem/write_file.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/git/__init__.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/git/_helper.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/git/git_add.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/git/git_branch.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/git/git_checkout.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/git/git_commit.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/git/git_diff.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/git/git_log.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/git/git_merge.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/git/git_pull.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/git/git_push.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/git/git_status.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/memory/__init__.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/memory/forget.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/memory/recall.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/memory/remember.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/personal/__init__.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/personal/cancel_job.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/personal/daemon_status.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/personal/generate_briefing.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/personal/get_jobs.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/personal/schedule_job.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/personal/send_telegram.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/personal/user_manager.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/registry.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/research/__init__.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/research/deep_research.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/research/export_research.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/research/quick_research.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/research/web_scrape.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/research/web_search.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/shell/__init__.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/shell/bash.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/streaming.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/web/__init__.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/tools/web/web_fetch.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/tui/__init__.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/tui/app.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/tui/icons.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/tui/screens/__init__.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/tui/screens/main_screen.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/tui/screens/setup_wizard.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/tui/themes/__init__.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/tui/themes/__main__.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/tui/tokens.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/tui/widgets/__init__.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/tui/widgets/chat_panel.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/tui/widgets/confirm_dialog.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/tui/widgets/diff_viewer.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/tui/widgets/file_tree.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/tui/widgets/info_panel.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/tui/widgets/input_bar.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/tui/widgets/model_selector.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/tui/widgets/permission_popup.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/tui/widgets/slash_palette.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/tui/widgets/sources_panel.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/tui/widgets/status_bar.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/tui/widgets/thinking_bar.py +0 -0
- {multacd-2.0.0b2 → multacd-2.0.0b3}/tui/widgets/tool_activity.py +0 -0
|
@@ -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
|
|
13
|
-
atau binary dari halaman
|
|
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.
|
|
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.
|
|
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.
|
|
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",
|
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|