codemaster-cli 2.2.0__tar.gz → 2.4.0__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.
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/PKG-INFO +1 -1
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/pyproject.toml +1 -1
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/cli/cli.py +41 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/cli/entrypoint.py +10 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/cli/textual_ui/app.py +2 -2
- codemaster_cli-2.4.0/vibe/cli/textual_ui/widgets/banner/petit_chat.py +176 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/cli/update_notifier/adapters/github_update_gateway.py +1 -1
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/cli/update_notifier/update.py +1 -1
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/agents/manager.py +1 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/agents/models.py +21 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/config.py +316 -6
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/prompts/__init__.py +1 -0
- codemaster_cli-2.4.0/vibe/core/prompts/gitmaster.md +38 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/tools/base.py +8 -6
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/tools/builtins/bash.py +153 -56
- codemaster_cli-2.4.0/vibe/core/tools/builtins/git_clone.py +861 -0
- codemaster_cli-2.4.0/vibe/core/tools/builtins/prompts/git_clone.md +43 -0
- codemaster_cli-2.4.0/vibe/core/tools/builtins/prompts/gitmaster.md +38 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/types.py +5 -9
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/utils.py +6 -6
- codemaster_cli-2.4.0/vibe/setup/onboarding/screens/provider_selection.py +184 -0
- codemaster_cli-2.2.0/vibe/cli/textual_ui/widgets/banner/petit_chat.py +0 -195
- codemaster_cli-2.2.0/vibe/setup/onboarding/screens/provider_selection.py +0 -87
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/.gitignore +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/README.md +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/docs/README.md +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/scripts/README.md +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/__init__.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/acp/__init__.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/acp/acp_agent_loop.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/acp/entrypoint.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/acp/tools/__init__.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/acp/tools/base.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/acp/tools/builtins/bash.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/acp/tools/builtins/read_file.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/acp/tools/builtins/search_replace.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/acp/tools/builtins/todo.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/acp/tools/builtins/write_file.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/acp/tools/session_update.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/acp/utils.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/cli/__init__.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/cli/autocompletion/__init__.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/cli/autocompletion/base.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/cli/autocompletion/path_completion.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/cli/autocompletion/slash_command.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/cli/clipboard.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/cli/commands.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/cli/history_manager.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/cli/plan_offer/adapters/http_whoami_gateway.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/cli/plan_offer/decide_plan_offer.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/cli/plan_offer/ports/whoami_gateway.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/cli/terminal_setup.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/cli/textual_ui/__init__.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/cli/textual_ui/ansi_markdown.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/cli/textual_ui/app.tcss +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/cli/textual_ui/external_editor.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/cli/textual_ui/handlers/__init__.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/cli/textual_ui/handlers/event_handler.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/cli/textual_ui/widgets/__init__.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/cli/textual_ui/widgets/approval_app.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/cli/textual_ui/widgets/banner/banner.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/cli/textual_ui/widgets/braille_renderer.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/cli/textual_ui/widgets/chat_input/__init__.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/cli/textual_ui/widgets/chat_input/body.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/cli/textual_ui/widgets/chat_input/completion_manager.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/cli/textual_ui/widgets/chat_input/completion_popup.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/cli/textual_ui/widgets/chat_input/container.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/cli/textual_ui/widgets/chat_input/text_area.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/cli/textual_ui/widgets/compact.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/cli/textual_ui/widgets/config_app.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/cli/textual_ui/widgets/context_progress.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/cli/textual_ui/widgets/load_more.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/cli/textual_ui/widgets/loading.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/cli/textual_ui/widgets/messages.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/cli/textual_ui/widgets/no_markup_static.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/cli/textual_ui/widgets/path_display.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/cli/textual_ui/widgets/proxy_setup_app.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/cli/textual_ui/widgets/question_app.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/cli/textual_ui/widgets/spinner.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/cli/textual_ui/widgets/status_message.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/cli/textual_ui/widgets/teleport_message.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/cli/textual_ui/widgets/tool_widgets.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/cli/textual_ui/widgets/tools.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/cli/textual_ui/windowing/__init__.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/cli/textual_ui/windowing/history.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/cli/textual_ui/windowing/history_windowing.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/cli/textual_ui/windowing/state.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/cli/update_notifier/__init__.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/cli/update_notifier/adapters/filesystem_update_cache_repository.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/cli/update_notifier/adapters/pypi_update_gateway.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/cli/update_notifier/ports/update_cache_repository.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/cli/update_notifier/ports/update_gateway.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/cli/update_notifier/whats_new.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/__init__.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/agent_loop.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/agents/__init__.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/auth/__init__.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/auth/crypto.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/auth/github.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/autocompletion/__init__.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/autocompletion/completers.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/autocompletion/file_indexer/__init__.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/autocompletion/file_indexer/ignore_rules.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/autocompletion/file_indexer/indexer.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/autocompletion/file_indexer/store.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/autocompletion/file_indexer/watcher.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/autocompletion/fuzzy.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/autocompletion/path_prompt.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/autocompletion/path_prompt_adapter.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/config_PATCH_INSTRUCTIONS.md +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/llm/__init__.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/llm/backend/anthropic.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/llm/backend/base.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/llm/backend/factory.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/llm/backend/generic.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/llm/backend/mistral.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/llm/backend/vertex.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/llm/exceptions.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/llm/format.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/llm/message_utils.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/llm/types.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/middleware.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/output_formatters.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/paths/__init__.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/paths/config_paths.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/paths/global_paths.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/programmatic.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/prompts/cli.md +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/prompts/compact.md +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/prompts/dangerous_directory.md +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/prompts/explore.md +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/prompts/project_context.md +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/prompts/tests.md +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/proxy_setup.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/session/session_loader.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/session/session_logger.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/session/session_migration.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/skills/__init__.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/skills/manager.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/skills/models.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/skills/parser.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/system_prompt.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/telemetry/__init__.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/telemetry/send.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/teleport/errors.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/teleport/git.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/teleport/nuage.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/teleport/teleport.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/teleport/types.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/tools/builtins/ask_user_question.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/tools/builtins/grep.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/tools/builtins/prompts/__init__.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/tools/builtins/prompts/ask_user_question.md +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/tools/builtins/prompts/bash.md +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/tools/builtins/prompts/grep.md +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/tools/builtins/prompts/read_file.md +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/tools/builtins/prompts/search_replace.md +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/tools/builtins/prompts/task.md +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/tools/builtins/prompts/todo.md +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/tools/builtins/prompts/write_file.md +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/tools/builtins/read_file.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/tools/builtins/search_replace.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/tools/builtins/task.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/tools/builtins/todo.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/tools/builtins/write_file.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/tools/manager.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/tools/mcp.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/tools/ui.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/trusted_folders.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/setup/onboarding/__init__.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/setup/onboarding/base.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/setup/onboarding/onboarding.tcss +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/setup/onboarding/screens/__init__.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/setup/onboarding/screens/api_key.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/setup/onboarding/screens/welcome.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/setup/trusted_folders/trust_folder_dialog.py +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/setup/trusted_folders/trust_folder_dialog.tcss +0 -0
- {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/whats_new.md +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: codemaster-cli
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.4.0
|
|
4
4
|
Summary: CLI coding assistant with local LLM support via Ollama
|
|
5
5
|
Project-URL: Homepage, https://github.com/marshal0004/CodeMaster
|
|
6
6
|
Project-URL: Repository, https://github.com/marshal0004/CodeMaster
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
import argparse
|
|
4
|
+
import subprocess
|
|
4
5
|
import sys
|
|
5
6
|
|
|
6
7
|
from rich import print as rprint
|
|
@@ -21,6 +22,12 @@ from vibe.core.types import LLMMessage, OutputFormat, Role
|
|
|
21
22
|
from vibe.core.utils import ConversationLimitException, logger
|
|
22
23
|
from vibe.setup.onboarding import run_onboarding
|
|
23
24
|
|
|
25
|
+
# Optional imports — graceful fallback if not installed
|
|
26
|
+
try:
|
|
27
|
+
from loguru import logger as loguru_logger
|
|
28
|
+
except ImportError:
|
|
29
|
+
loguru_logger = None # type: ignore[assignment]
|
|
30
|
+
|
|
24
31
|
|
|
25
32
|
def get_initial_agent_name(args: argparse.Namespace) -> str:
|
|
26
33
|
if args.prompt is not None and args.agent == BuiltinAgentName.DEFAULT:
|
|
@@ -113,6 +120,29 @@ def load_session(
|
|
|
113
120
|
sys.exit(1)
|
|
114
121
|
|
|
115
122
|
|
|
123
|
+
def notify(title: str, message: str) -> None:
|
|
124
|
+
"""Send a desktop notification using notify-send (Linux)."""
|
|
125
|
+
try:
|
|
126
|
+
subprocess.run(
|
|
127
|
+
["notify-send", "--app-name=codeMaster", "-t", "5000", title, message],
|
|
128
|
+
timeout=5,
|
|
129
|
+
check=False,
|
|
130
|
+
capture_output=True,
|
|
131
|
+
)
|
|
132
|
+
except (FileNotFoundError, OSError):
|
|
133
|
+
pass
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
def setup_logging(verbose: bool = False) -> None:
|
|
137
|
+
"""Configure logging based on verbosity."""
|
|
138
|
+
if loguru_logger is not None:
|
|
139
|
+
loguru_logger.remove()
|
|
140
|
+
loguru_logger.add(
|
|
141
|
+
sys.stderr,
|
|
142
|
+
level="DEBUG" if verbose else "INFO",
|
|
143
|
+
format="<green>{time}</green> | <level>{level}</level> | {message}",
|
|
144
|
+
)
|
|
145
|
+
|
|
116
146
|
def _load_messages_from_previous_session(
|
|
117
147
|
agent_loop: AgentLoop, loaded_messages: list[LLMMessage]
|
|
118
148
|
) -> None:
|
|
@@ -125,6 +155,9 @@ def run_cli(args: argparse.Namespace) -> None:
|
|
|
125
155
|
load_dotenv_values()
|
|
126
156
|
bootstrap_config_files()
|
|
127
157
|
|
|
158
|
+
# Setup logging based on verbose flag
|
|
159
|
+
setup_logging(verbose=args.verbose)
|
|
160
|
+
|
|
128
161
|
if args.setup:
|
|
129
162
|
run_onboarding()
|
|
130
163
|
sys.exit(0)
|
|
@@ -177,12 +210,20 @@ def run_cli(args: argparse.Namespace) -> None:
|
|
|
177
210
|
if loaded_messages:
|
|
178
211
|
_load_messages_from_previous_session(agent_loop, loaded_messages)
|
|
179
212
|
|
|
213
|
+
# Notify task start if enabled
|
|
214
|
+
if args.notify:
|
|
215
|
+
notify("Task Started", "Your task is running...")
|
|
216
|
+
|
|
180
217
|
run_textual_ui(
|
|
181
218
|
agent_loop=agent_loop,
|
|
182
219
|
initial_prompt=args.initial_prompt or stdin_prompt,
|
|
183
220
|
teleport_on_start=args.teleport,
|
|
184
221
|
)
|
|
185
222
|
|
|
223
|
+
# Notify task completion if enabled
|
|
224
|
+
if args.notify:
|
|
225
|
+
notify("Task Complete", "Your task finished successfully!")
|
|
226
|
+
|
|
186
227
|
except (KeyboardInterrupt, EOFError):
|
|
187
228
|
rprint("\n[dim]Bye![/]")
|
|
188
229
|
sys.exit(0)
|
|
@@ -100,6 +100,16 @@ def parse_arguments() -> argparse.Namespace:
|
|
|
100
100
|
metavar="SESSION_ID",
|
|
101
101
|
help="Resume a specific session by its ID (supports partial matching)",
|
|
102
102
|
)
|
|
103
|
+
parser.add_argument(
|
|
104
|
+
"--notify",
|
|
105
|
+
action="store_true",
|
|
106
|
+
help="Enable desktop notifications for long-running tasks",
|
|
107
|
+
)
|
|
108
|
+
parser.add_argument(
|
|
109
|
+
"--verbose",
|
|
110
|
+
action="store_true",
|
|
111
|
+
help="Enable verbose logging (DEBUG=true for API tracing)",
|
|
112
|
+
)
|
|
103
113
|
return parser.parse_args()
|
|
104
114
|
|
|
105
115
|
|
|
@@ -1522,8 +1522,8 @@ def _print_session_resume_message(session_id: str | None) -> None:
|
|
|
1522
1522
|
return
|
|
1523
1523
|
|
|
1524
1524
|
print()
|
|
1525
|
-
print("To continue this session, run:
|
|
1526
|
-
print(f"Or:
|
|
1525
|
+
print("To continue this session, run: codemaster --continue")
|
|
1526
|
+
print(f"Or: codemaster --resume {session_id}")
|
|
1527
1527
|
|
|
1528
1528
|
|
|
1529
1529
|
def run_textual_ui(
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
from typing import Any
|
|
3
|
+
|
|
4
|
+
from textual.app import ComposeResult
|
|
5
|
+
from textual.timer import Timer
|
|
6
|
+
from textual.widgets import Static
|
|
7
|
+
|
|
8
|
+
from vibe.cli.textual_ui.widgets.braille_renderer import render_braille
|
|
9
|
+
|
|
10
|
+
WIDTH = 22
|
|
11
|
+
HEIGHT = 12
|
|
12
|
+
|
|
13
|
+
# BOLD M PATH - Using thick lines (3 dots wide)
|
|
14
|
+
# Each point will have surrounding dots to make it BOLD/THICK
|
|
15
|
+
|
|
16
|
+
def make_thick_dot(x: int, y: int) -> list[complex]:
|
|
17
|
+
"""Create a thick dot (3x3 cluster) at position"""
|
|
18
|
+
dots = []
|
|
19
|
+
for dx in [-1, 0, 1]:
|
|
20
|
+
for dy in [-1, 0, 1]:
|
|
21
|
+
new_x = x + dx
|
|
22
|
+
new_y = y + dy
|
|
23
|
+
# Keep within bounds
|
|
24
|
+
if 0 <= new_x < WIDTH and 0 <= new_y < HEIGHT:
|
|
25
|
+
dots.append(new_x + new_y * 1j)
|
|
26
|
+
return dots
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def make_medium_dot(x: int, y: int) -> list[complex]:
|
|
30
|
+
"""Create a medium dot (cross pattern) at position"""
|
|
31
|
+
dots = [x + y * 1j] # Center
|
|
32
|
+
for dx, dy in [(0, -1), (0, 1), (-1, 0), (1, 0), (-1, -1), (1, -1), (-1, 1), (1, 1)]:
|
|
33
|
+
new_x = x + dx
|
|
34
|
+
new_y = y + dy
|
|
35
|
+
if 0 <= new_x < WIDTH and 0 <= new_y < HEIGHT:
|
|
36
|
+
dots.append(new_x + new_y * 1j)
|
|
37
|
+
return dots
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
# M PATH - Main path points (same size as cat: 22x12)
|
|
41
|
+
# The M spans from x=1 to x=20, y=0 to y=11
|
|
42
|
+
M_PATH_POINTS = [
|
|
43
|
+
# Left vertical line (bottom to top) - x=2
|
|
44
|
+
(2, 11), (2, 10), (2, 9), (2, 8), (2, 7), (2, 6), (2, 5), (2, 4), (2, 3), (2, 2), (2, 1), (2, 0),
|
|
45
|
+
|
|
46
|
+
# Diagonal down-right to middle peak
|
|
47
|
+
(3, 1), (4, 2), (5, 3), (6, 4), (7, 5), (8, 6), (9, 6), (10, 6), (11, 6),
|
|
48
|
+
|
|
49
|
+
# Diagonal up-right to top
|
|
50
|
+
(12, 5), (13, 4), (14, 3), (15, 2), (16, 1), (17, 0),
|
|
51
|
+
|
|
52
|
+
# Right vertical line (top to bottom) - x=18
|
|
53
|
+
(18, 0), (18, 1), (18, 2), (18, 3), (18, 4), (18, 5), (18, 6), (18, 7), (18, 8), (18, 9), (18, 10), (18, 11),
|
|
54
|
+
]
|
|
55
|
+
|
|
56
|
+
# Trail length for the comet effect
|
|
57
|
+
TRAIL_LENGTH = 6
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
class PetitChat(Static):
|
|
61
|
+
def __init__(self, animate: bool = True, **kwargs: Any) -> None:
|
|
62
|
+
super().__init__(**kwargs, classes="banner-chat")
|
|
63
|
+
self._path_index = 0
|
|
64
|
+
self._trail: list[tuple[int, int]] = []
|
|
65
|
+
self._permanent_dots: set[complex] = set()
|
|
66
|
+
self._do_animate = animate
|
|
67
|
+
self._freeze_requested = False
|
|
68
|
+
self._timer: Timer | None = None
|
|
69
|
+
self._phase = "drawing" # "drawing", "glowing", "waiting"
|
|
70
|
+
self._glow_cycle = 0
|
|
71
|
+
|
|
72
|
+
def _get_current_dots(self) -> set[complex]:
|
|
73
|
+
"""Get all dots to render with bold effect"""
|
|
74
|
+
dots: set[complex] = set()
|
|
75
|
+
|
|
76
|
+
# Add permanent M shape (already drawn parts)
|
|
77
|
+
dots.update(self._permanent_dots)
|
|
78
|
+
|
|
79
|
+
if self._phase == "drawing":
|
|
80
|
+
# Add trail with fading thickness
|
|
81
|
+
for i, (tx, ty) in enumerate(self._trail):
|
|
82
|
+
# Older trail = smaller dots
|
|
83
|
+
if i < 2:
|
|
84
|
+
# Smallest trail dots
|
|
85
|
+
dots.add(tx + ty * 1j)
|
|
86
|
+
elif i < 4:
|
|
87
|
+
# Medium trail dots
|
|
88
|
+
for d in make_medium_dot(tx, ty)[:5]:
|
|
89
|
+
dots.add(d)
|
|
90
|
+
else:
|
|
91
|
+
# Larger trail dots
|
|
92
|
+
for d in make_medium_dot(tx, ty):
|
|
93
|
+
dots.add(d)
|
|
94
|
+
|
|
95
|
+
# Add current position - BIGGEST and BOLDEST
|
|
96
|
+
if self._path_index < len(M_PATH_POINTS):
|
|
97
|
+
cx, cy = M_PATH_POINTS[self._path_index]
|
|
98
|
+
for d in make_thick_dot(cx, cy):
|
|
99
|
+
dots.add(d)
|
|
100
|
+
|
|
101
|
+
elif self._phase == "glowing":
|
|
102
|
+
# Pulsing glow effect
|
|
103
|
+
if self._glow_cycle % 6 < 3:
|
|
104
|
+
# Add extra sparkles at key points
|
|
105
|
+
sparkle_points = [
|
|
106
|
+
(2, 0), (2, 11), # Left top and bottom
|
|
107
|
+
(18, 0), (18, 11), # Right top and bottom
|
|
108
|
+
(10, 6), # Middle point
|
|
109
|
+
]
|
|
110
|
+
for sx, sy in sparkle_points:
|
|
111
|
+
for d in make_thick_dot(sx, sy):
|
|
112
|
+
dots.add(d)
|
|
113
|
+
|
|
114
|
+
return dots
|
|
115
|
+
|
|
116
|
+
def compose(self) -> ComposeResult:
|
|
117
|
+
initial_dots = self._get_current_dots()
|
|
118
|
+
yield Static(render_braille(initial_dots, WIDTH, HEIGHT), classes="petit-chat")
|
|
119
|
+
|
|
120
|
+
def on_mount(self) -> None:
|
|
121
|
+
self._inner = self.query_one(".petit-chat", Static)
|
|
122
|
+
if self._do_animate:
|
|
123
|
+
self._timer = self.set_interval(0.06, self._apply_next_transition)
|
|
124
|
+
|
|
125
|
+
def freeze_animation(self) -> None:
|
|
126
|
+
self._freeze_requested = True
|
|
127
|
+
|
|
128
|
+
def _apply_next_transition(self) -> None:
|
|
129
|
+
if self._freeze_requested and self._phase == "waiting":
|
|
130
|
+
if self._timer:
|
|
131
|
+
self._timer.stop()
|
|
132
|
+
self._timer = None
|
|
133
|
+
return
|
|
134
|
+
|
|
135
|
+
if self._phase == "drawing":
|
|
136
|
+
if self._path_index < len(M_PATH_POINTS):
|
|
137
|
+
# Get current point
|
|
138
|
+
cx, cy = M_PATH_POINTS[self._path_index]
|
|
139
|
+
|
|
140
|
+
# Add BOLD dots to permanent M
|
|
141
|
+
for d in make_thick_dot(cx, cy):
|
|
142
|
+
self._permanent_dots.add(d)
|
|
143
|
+
|
|
144
|
+
# Update trail
|
|
145
|
+
self._trail.append((cx, cy))
|
|
146
|
+
if len(self._trail) > TRAIL_LENGTH:
|
|
147
|
+
self._trail.pop(0)
|
|
148
|
+
|
|
149
|
+
self._path_index += 1
|
|
150
|
+
else:
|
|
151
|
+
# Finished drawing
|
|
152
|
+
self._phase = "glowing"
|
|
153
|
+
self._trail.clear()
|
|
154
|
+
|
|
155
|
+
elif self._phase == "glowing":
|
|
156
|
+
self._glow_cycle += 1
|
|
157
|
+
if self._glow_cycle > 20:
|
|
158
|
+
self._phase = "waiting"
|
|
159
|
+
self._glow_cycle = 0
|
|
160
|
+
|
|
161
|
+
elif self._phase == "waiting":
|
|
162
|
+
self._glow_cycle += 1
|
|
163
|
+
if self._glow_cycle > 10:
|
|
164
|
+
self._reset_animation()
|
|
165
|
+
|
|
166
|
+
# Update display
|
|
167
|
+
self._inner.update(render_braille(self._get_current_dots(), WIDTH, HEIGHT))
|
|
168
|
+
|
|
169
|
+
def _reset_animation(self) -> None:
|
|
170
|
+
"""Reset to start drawing again"""
|
|
171
|
+
self._path_index = 0
|
|
172
|
+
self._trail.clear()
|
|
173
|
+
self._permanent_dots.clear()
|
|
174
|
+
self._phase = "drawing"
|
|
175
|
+
self._glow_cycle = 0
|
|
176
|
+
|
|
@@ -31,7 +31,7 @@ class GitHubUpdateGateway(UpdateGateway):
|
|
|
31
31
|
async def fetch_update(self) -> Update | None:
|
|
32
32
|
headers = {
|
|
33
33
|
"Accept": "application/vnd.github+json",
|
|
34
|
-
"User-Agent": "
|
|
34
|
+
"User-Agent": "codemaster-update-notifier",
|
|
35
35
|
}
|
|
36
36
|
if self._token:
|
|
37
37
|
headers["Authorization"] = f"Bearer {self._token}"
|
|
@@ -122,7 +122,7 @@ async def get_update_if_available(
|
|
|
122
122
|
return UpdateAvailability(latest_version=update.latest_version, should_notify=True)
|
|
123
123
|
|
|
124
124
|
|
|
125
|
-
UPDATE_COMMANDS = ["uv tool upgrade
|
|
125
|
+
UPDATE_COMMANDS = ["uv tool upgrade codemaster", "brew upgrade codemaster"]
|
|
126
126
|
|
|
127
127
|
|
|
128
128
|
async def do_update() -> bool:
|
|
@@ -38,6 +38,7 @@ class BuiltinAgentName(StrEnum):
|
|
|
38
38
|
ACCEPT_EDITS = "accept-edits"
|
|
39
39
|
AUTO_APPROVE = "auto-approve"
|
|
40
40
|
EXPLORE = "explore"
|
|
41
|
+
GITMASTER = "gitmaster"
|
|
41
42
|
|
|
42
43
|
|
|
43
44
|
@dataclass(frozen=True)
|
|
@@ -113,10 +114,30 @@ EXPLORE = AgentProfile(
|
|
|
113
114
|
overrides={"enabled_tools": ["grep", "read_file"], "system_prompt_id": "explore"},
|
|
114
115
|
)
|
|
115
116
|
|
|
117
|
+
GITMASTER = AgentProfile(
|
|
118
|
+
name=BuiltinAgentName.GITMASTER,
|
|
119
|
+
display_name="GitMaster",
|
|
120
|
+
description="Specialized agent for cloning GitHub repositories and exploring codebases",
|
|
121
|
+
safety=AgentSafety.NEUTRAL,
|
|
122
|
+
agent_type=AgentType.AGENT,
|
|
123
|
+
overrides={
|
|
124
|
+
"system_prompt_id": "gitmaster",
|
|
125
|
+
"tools": {
|
|
126
|
+
"git_clone": {"permission": "always"},
|
|
127
|
+
"read_file": {"permission": "always"},
|
|
128
|
+
"grep": {"permission": "always"},
|
|
129
|
+
"bash": {"permission": "ask"},
|
|
130
|
+
"todo": {"permission": "always"},
|
|
131
|
+
"task": {"permission": "always"},
|
|
132
|
+
},
|
|
133
|
+
},
|
|
134
|
+
)
|
|
135
|
+
|
|
116
136
|
BUILTIN_AGENTS: dict[str, AgentProfile] = {
|
|
117
137
|
BuiltinAgentName.DEFAULT: DEFAULT,
|
|
118
138
|
BuiltinAgentName.PLAN: PLAN,
|
|
119
139
|
BuiltinAgentName.ACCEPT_EDITS: ACCEPT_EDITS,
|
|
120
140
|
BuiltinAgentName.AUTO_APPROVE: AUTO_APPROVE,
|
|
121
141
|
BuiltinAgentName.EXPLORE: EXPLORE,
|
|
142
|
+
BuiltinAgentName.GITMASTER: GITMASTER,
|
|
122
143
|
}
|