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.
Files changed (178) hide show
  1. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/PKG-INFO +1 -1
  2. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/pyproject.toml +1 -1
  3. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/cli/cli.py +41 -0
  4. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/cli/entrypoint.py +10 -0
  5. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/cli/textual_ui/app.py +2 -2
  6. codemaster_cli-2.4.0/vibe/cli/textual_ui/widgets/banner/petit_chat.py +176 -0
  7. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/cli/update_notifier/adapters/github_update_gateway.py +1 -1
  8. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/cli/update_notifier/update.py +1 -1
  9. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/agents/manager.py +1 -0
  10. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/agents/models.py +21 -0
  11. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/config.py +316 -6
  12. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/prompts/__init__.py +1 -0
  13. codemaster_cli-2.4.0/vibe/core/prompts/gitmaster.md +38 -0
  14. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/tools/base.py +8 -6
  15. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/tools/builtins/bash.py +153 -56
  16. codemaster_cli-2.4.0/vibe/core/tools/builtins/git_clone.py +861 -0
  17. codemaster_cli-2.4.0/vibe/core/tools/builtins/prompts/git_clone.md +43 -0
  18. codemaster_cli-2.4.0/vibe/core/tools/builtins/prompts/gitmaster.md +38 -0
  19. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/types.py +5 -9
  20. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/utils.py +6 -6
  21. codemaster_cli-2.4.0/vibe/setup/onboarding/screens/provider_selection.py +184 -0
  22. codemaster_cli-2.2.0/vibe/cli/textual_ui/widgets/banner/petit_chat.py +0 -195
  23. codemaster_cli-2.2.0/vibe/setup/onboarding/screens/provider_selection.py +0 -87
  24. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/.gitignore +0 -0
  25. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/README.md +0 -0
  26. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/docs/README.md +0 -0
  27. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/scripts/README.md +0 -0
  28. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/__init__.py +0 -0
  29. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/acp/__init__.py +0 -0
  30. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/acp/acp_agent_loop.py +0 -0
  31. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/acp/entrypoint.py +0 -0
  32. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/acp/tools/__init__.py +0 -0
  33. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/acp/tools/base.py +0 -0
  34. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/acp/tools/builtins/bash.py +0 -0
  35. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/acp/tools/builtins/read_file.py +0 -0
  36. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/acp/tools/builtins/search_replace.py +0 -0
  37. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/acp/tools/builtins/todo.py +0 -0
  38. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/acp/tools/builtins/write_file.py +0 -0
  39. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/acp/tools/session_update.py +0 -0
  40. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/acp/utils.py +0 -0
  41. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/cli/__init__.py +0 -0
  42. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/cli/autocompletion/__init__.py +0 -0
  43. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/cli/autocompletion/base.py +0 -0
  44. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/cli/autocompletion/path_completion.py +0 -0
  45. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/cli/autocompletion/slash_command.py +0 -0
  46. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/cli/clipboard.py +0 -0
  47. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/cli/commands.py +0 -0
  48. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/cli/history_manager.py +0 -0
  49. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/cli/plan_offer/adapters/http_whoami_gateway.py +0 -0
  50. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/cli/plan_offer/decide_plan_offer.py +0 -0
  51. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/cli/plan_offer/ports/whoami_gateway.py +0 -0
  52. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/cli/terminal_setup.py +0 -0
  53. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/cli/textual_ui/__init__.py +0 -0
  54. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/cli/textual_ui/ansi_markdown.py +0 -0
  55. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/cli/textual_ui/app.tcss +0 -0
  56. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/cli/textual_ui/external_editor.py +0 -0
  57. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/cli/textual_ui/handlers/__init__.py +0 -0
  58. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/cli/textual_ui/handlers/event_handler.py +0 -0
  59. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/cli/textual_ui/widgets/__init__.py +0 -0
  60. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/cli/textual_ui/widgets/approval_app.py +0 -0
  61. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/cli/textual_ui/widgets/banner/banner.py +0 -0
  62. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/cli/textual_ui/widgets/braille_renderer.py +0 -0
  63. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/cli/textual_ui/widgets/chat_input/__init__.py +0 -0
  64. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/cli/textual_ui/widgets/chat_input/body.py +0 -0
  65. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/cli/textual_ui/widgets/chat_input/completion_manager.py +0 -0
  66. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/cli/textual_ui/widgets/chat_input/completion_popup.py +0 -0
  67. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/cli/textual_ui/widgets/chat_input/container.py +0 -0
  68. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/cli/textual_ui/widgets/chat_input/text_area.py +0 -0
  69. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/cli/textual_ui/widgets/compact.py +0 -0
  70. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/cli/textual_ui/widgets/config_app.py +0 -0
  71. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/cli/textual_ui/widgets/context_progress.py +0 -0
  72. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/cli/textual_ui/widgets/load_more.py +0 -0
  73. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/cli/textual_ui/widgets/loading.py +0 -0
  74. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/cli/textual_ui/widgets/messages.py +0 -0
  75. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/cli/textual_ui/widgets/no_markup_static.py +0 -0
  76. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/cli/textual_ui/widgets/path_display.py +0 -0
  77. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/cli/textual_ui/widgets/proxy_setup_app.py +0 -0
  78. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/cli/textual_ui/widgets/question_app.py +0 -0
  79. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/cli/textual_ui/widgets/spinner.py +0 -0
  80. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/cli/textual_ui/widgets/status_message.py +0 -0
  81. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/cli/textual_ui/widgets/teleport_message.py +0 -0
  82. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/cli/textual_ui/widgets/tool_widgets.py +0 -0
  83. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/cli/textual_ui/widgets/tools.py +0 -0
  84. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/cli/textual_ui/windowing/__init__.py +0 -0
  85. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/cli/textual_ui/windowing/history.py +0 -0
  86. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/cli/textual_ui/windowing/history_windowing.py +0 -0
  87. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/cli/textual_ui/windowing/state.py +0 -0
  88. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/cli/update_notifier/__init__.py +0 -0
  89. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/cli/update_notifier/adapters/filesystem_update_cache_repository.py +0 -0
  90. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/cli/update_notifier/adapters/pypi_update_gateway.py +0 -0
  91. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/cli/update_notifier/ports/update_cache_repository.py +0 -0
  92. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/cli/update_notifier/ports/update_gateway.py +0 -0
  93. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/cli/update_notifier/whats_new.py +0 -0
  94. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/__init__.py +0 -0
  95. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/agent_loop.py +0 -0
  96. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/agents/__init__.py +0 -0
  97. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/auth/__init__.py +0 -0
  98. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/auth/crypto.py +0 -0
  99. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/auth/github.py +0 -0
  100. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/autocompletion/__init__.py +0 -0
  101. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/autocompletion/completers.py +0 -0
  102. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/autocompletion/file_indexer/__init__.py +0 -0
  103. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/autocompletion/file_indexer/ignore_rules.py +0 -0
  104. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/autocompletion/file_indexer/indexer.py +0 -0
  105. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/autocompletion/file_indexer/store.py +0 -0
  106. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/autocompletion/file_indexer/watcher.py +0 -0
  107. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/autocompletion/fuzzy.py +0 -0
  108. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/autocompletion/path_prompt.py +0 -0
  109. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/autocompletion/path_prompt_adapter.py +0 -0
  110. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/config_PATCH_INSTRUCTIONS.md +0 -0
  111. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/llm/__init__.py +0 -0
  112. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/llm/backend/anthropic.py +0 -0
  113. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/llm/backend/base.py +0 -0
  114. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/llm/backend/factory.py +0 -0
  115. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/llm/backend/generic.py +0 -0
  116. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/llm/backend/mistral.py +0 -0
  117. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/llm/backend/vertex.py +0 -0
  118. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/llm/exceptions.py +0 -0
  119. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/llm/format.py +0 -0
  120. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/llm/message_utils.py +0 -0
  121. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/llm/types.py +0 -0
  122. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/middleware.py +0 -0
  123. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/output_formatters.py +0 -0
  124. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/paths/__init__.py +0 -0
  125. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/paths/config_paths.py +0 -0
  126. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/paths/global_paths.py +0 -0
  127. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/programmatic.py +0 -0
  128. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/prompts/cli.md +0 -0
  129. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/prompts/compact.md +0 -0
  130. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/prompts/dangerous_directory.md +0 -0
  131. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/prompts/explore.md +0 -0
  132. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/prompts/project_context.md +0 -0
  133. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/prompts/tests.md +0 -0
  134. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/proxy_setup.py +0 -0
  135. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/session/session_loader.py +0 -0
  136. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/session/session_logger.py +0 -0
  137. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/session/session_migration.py +0 -0
  138. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/skills/__init__.py +0 -0
  139. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/skills/manager.py +0 -0
  140. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/skills/models.py +0 -0
  141. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/skills/parser.py +0 -0
  142. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/system_prompt.py +0 -0
  143. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/telemetry/__init__.py +0 -0
  144. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/telemetry/send.py +0 -0
  145. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/teleport/errors.py +0 -0
  146. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/teleport/git.py +0 -0
  147. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/teleport/nuage.py +0 -0
  148. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/teleport/teleport.py +0 -0
  149. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/teleport/types.py +0 -0
  150. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/tools/builtins/ask_user_question.py +0 -0
  151. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/tools/builtins/grep.py +0 -0
  152. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/tools/builtins/prompts/__init__.py +0 -0
  153. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/tools/builtins/prompts/ask_user_question.md +0 -0
  154. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/tools/builtins/prompts/bash.md +0 -0
  155. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/tools/builtins/prompts/grep.md +0 -0
  156. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/tools/builtins/prompts/read_file.md +0 -0
  157. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/tools/builtins/prompts/search_replace.md +0 -0
  158. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/tools/builtins/prompts/task.md +0 -0
  159. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/tools/builtins/prompts/todo.md +0 -0
  160. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/tools/builtins/prompts/write_file.md +0 -0
  161. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/tools/builtins/read_file.py +0 -0
  162. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/tools/builtins/search_replace.py +0 -0
  163. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/tools/builtins/task.py +0 -0
  164. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/tools/builtins/todo.py +0 -0
  165. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/tools/builtins/write_file.py +0 -0
  166. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/tools/manager.py +0 -0
  167. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/tools/mcp.py +0 -0
  168. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/tools/ui.py +0 -0
  169. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/core/trusted_folders.py +0 -0
  170. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/setup/onboarding/__init__.py +0 -0
  171. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/setup/onboarding/base.py +0 -0
  172. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/setup/onboarding/onboarding.tcss +0 -0
  173. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/setup/onboarding/screens/__init__.py +0 -0
  174. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/setup/onboarding/screens/api_key.py +0 -0
  175. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/setup/onboarding/screens/welcome.py +0 -0
  176. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/setup/trusted_folders/trust_folder_dialog.py +0 -0
  177. {codemaster_cli-2.2.0 → codemaster_cli-2.4.0}/vibe/setup/trusted_folders/trust_folder_dialog.tcss +0 -0
  178. {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.2.0
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,6 @@
1
1
  [project]
2
2
  name = "codemaster-cli"
3
- version = "2.2.0"
3
+ version = "2.4.0"
4
4
  description = "CLI coding assistant with local LLM support via Ollama"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.12"
@@ -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: vibe --continue")
1526
- print(f"Or: vibe --resume {session_id}")
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": "mistral-vibe-update-notifier",
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 mistral-vibe", "brew upgrade mistral-vibe"]
125
+ UPDATE_COMMANDS = ["uv tool upgrade codemaster", "brew upgrade codemaster"]
126
126
 
127
127
 
128
128
  async def do_update() -> bool:
@@ -149,6 +149,7 @@ class AgentManager:
149
149
  BuiltinAgentName.PLAN,
150
150
  BuiltinAgentName.ACCEPT_EDITS,
151
151
  BuiltinAgentName.AUTO_APPROVE,
152
+ BuiltinAgentName.GITMASTER,
152
153
  ]
153
154
  primary_agents = [
154
155
  name
@@ -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
  }