Conversation
- Skip API key screen for providers without api_key_env_var (ollama, llamacpp, qwencode) - Show completion message after setup - Update tests and documentation - Remove unnecessary files
Signed-off-by: OEvortex <abhat8283@gmail.com>
- Updated all instances of "vibe" to "revibe" in paths, configuration, and tool descriptions. - Modified the Grep tool to use ".revibeignore" instead of ".vibeignore". - Adjusted installation scripts and test cases to reflect the new naming convention. - Enhanced the QwenBackend class by simplifying authentication handling and improving error management. - Added new model configurations and updated existing ones in model_config.py. - Improved system prompt generation by modularizing tool prompt sections. - Updated tests to ensure compatibility with the new naming and structure. Signed-off-by: OEvortex <abhat8283@gmail.com>
- Add animated 'ReVibe' text logo to setup completion screen with gradient colors - Extend provider help URLs to include Hugging Face and Cerebras - Update CHANGELOG.md for version 0.2.0 with new features
- Change setup completion title to 'Setup Completed' with gradient animation - Add Qwen installation and authentication instructions for qwencode provider - Update README.md with qwencode setup instructions - Refactor code to reduce nesting and improve maintainability
Signed-off-by: OEvortex <abhat8283@gmail.com>
There was a problem hiding this comment.
Pull request overview
This pull request completes a comprehensive rebrand from "Mistral Vibe" to "ReVibe," encompassing repository ownership migration, configuration directory restructuring, tool renaming, and extensive documentation updates. The changes affect all layers of the application including core configuration, CLI tools, build scripts, and user-facing documentation.
- Complete migration from
.vibeto.revibeconfiguration directories across the codebase - Repository ownership transfer from
mistralai/mistral-vibetoOEvortex/revibein all workflow files and documentation - Tool display name changes (grep → find) with enhanced documentation and multiple new HuggingFace models
Reviewed changes
Copilot reviewed 47 out of 49 changed files in this pull request and generated 21 comments.
Show a summary per file
| File | Description |
|---|---|
uv.lock |
Version downgraded from 1.4.0 to 0.2.0 for the rebrand |
tests/**/*.py |
Updated test fixtures to use .revibe instead of .vibe, patch paths updated for rebranding |
revibe/core/paths/*.py |
Migrated all global and config path constants from VIBE_HOME to REVIBE_HOME and .vibe to .revibe |
revibe/core/tools/builtins/grep.py |
Renamed tool display name to "Find", updated ignore file from .vibeignore to .revibeignore |
revibe/core/tools/builtins/prompts/*.md |
Updated tool documentation with new branding and renamed grep to find |
revibe/core/model_config.py |
Added 15+ new HuggingFace models, disambiguated duplicate model aliases with provider suffixes |
revibe/core/llm/backend/qwen/handler.py |
Refactored streaming methods into smaller helper functions for improved maintainability |
revibe/core/config.py |
Updated environment prefix from VIBE_ to REVIBE_, improved model/provider handling for dynamic loading |
revibe/cli/**/*.py |
Updated CLI help text, widget logic, and entrypoint references to use .revibe paths |
revibe/setup/**/*.py |
Enhanced onboarding UX with gradient animations, improved provider-specific API key handling |
revibe/acp/acp_agent.py |
Updated ACP agent metadata from "Mistral Vibe" to "ReVibe" |
scripts/install.sh |
Simplified installation flow, updated command names to revibe and revibe-acp |
README.md |
Complete rewrite with modern formatting, clearer structure, and ReVibe branding |
CHANGELOG.md |
Added comprehensive release notes for v0.2.0 including new features and breaking changes |
.github/workflows/*.yml |
Updated repository references and binary names across CI, release, and build workflows |
pyproject.toml |
Updated project URLs to point to OEvortex/revibe |
revibe-acp.spec |
Updated PyInstaller spec with corrected data paths for the rebrand |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| def test_api_key_input_handles_no_env_var_provider() -> None: | ||
| provider = ProviderConfig( | ||
| name="anthropic", | ||
| api_base="https://api.anthropic.com", | ||
| api_key_env_var="ANTHROPIC_API_KEY", | ||
| name="ollama", | ||
| api_base="http://127.0.0.1:11434/v1", | ||
| api_key_env_var="", # No API key required | ||
| ) | ||
| widget = ApiKeyInput(provider) | ||
|
|
||
| # Create env file with one existing key | ||
| initial_content = "OPENAI_API_KEY=sk-test-123\n" | ||
| temp_env_file.write_text(initial_content, encoding="utf-8") | ||
|
|
||
| # Append new key | ||
| new_key = "sk-ant-test-456" | ||
| env_var_line = f"{provider.api_key_env_var}={new_key}" | ||
| existing_content = temp_env_file.read_text(encoding="utf-8") | ||
| temp_env_file.write_text(existing_content + env_var_line + "\n", encoding="utf-8") | ||
|
|
||
| # Verify both keys are present | ||
| content = temp_env_file.read_text(encoding="utf-8") | ||
| assert "OPENAI_API_KEY=sk-test-123" in content | ||
| assert "ANTHROPIC_API_KEY=sk-ant-test-456" in content | ||
| # Check that the provider is set correctly | ||
| assert widget.provider.name == "ollama" | ||
| assert widget.provider.api_key_env_var == "" |
There was a problem hiding this comment.
The removed test_append_new_api_key test validates the functionality of appending a new API key when other keys already exist in the .env file. This test case is completely removed and not replaced with equivalent coverage. The new test test_api_key_input_handles_no_env_var_provider tests a different scenario. Consider restoring this test or adding equivalent coverage for the append functionality.
| MAX_COMMAND_DISPLAY_LENGTH = 30 | ||
| command = event.args.command.strip() | ||
| if len(command) > 30: | ||
| command = command[:27] + "..." | ||
| if len(command) > MAX_COMMAND_DISPLAY_LENGTH: | ||
| command = command[:MAX_COMMAND_DISPLAY_LENGTH - 3] + "..." |
There was a problem hiding this comment.
The magic numbers 20 and 30 for maximum display length should be extracted as named constants for better maintainability. Consider defining them at the module level as MAX_PATTERN_DISPLAY_LENGTH and MAX_COMMAND_DISPLAY_LENGTH respectively.
| ```xml | ||
| <tool_call> | ||
| <tool_name>grep</tool_name> | ||
| <tool_name>find</tool_name> | ||
| <parameters> | ||
| <pattern>your regex pattern</pattern> | ||
| <path>directory or file to search</path> | ||
| <pattern>your_regex_pattern</pattern> | ||
| <path>.</path> | ||
| <max_matches>100</max_matches> | ||
| <use_default_ignore>true</use_default_ignore> | ||
| </parameters> | ||
| </tool_call> | ||
| ``` |
There was a problem hiding this comment.
The help text mentions "find" as the tool name in XML format examples, but the actual tool_name in the XML should be "grep" to match the tool registration. The disconnect between the display name "Find" and the actual tool name "grep" will cause confusion when users try to use the tool. Either update the XML examples to use <tool_name>grep</tool_name> or rename the tool registration to "find".
| <!-- Find function definition --> | ||
| <tool_call> | ||
| <tool_name>find</tool_name> | ||
| <parameters> | ||
| <pattern>def process_data</pattern> | ||
| <path>src</path> | ||
| </parameters> | ||
| </tool_call> | ||
|
|
||
| <!-- Search for class usage --> | ||
| <tool_call> | ||
| <tool_name>grep</tool_name> | ||
| <tool_name>find</tool_name> | ||
| <parameters> | ||
| <pattern>def build_payload</pattern> | ||
| <path>revibe/core</path> | ||
| <pattern>\bUserModel\b</pattern> | ||
| <path>.</path> | ||
| </parameters> | ||
| </tool_call> | ||
|
|
||
| <!-- Search for TODOs across repo --> | ||
| <!-- Find all TODO comments --> | ||
| <tool_call> | ||
| <tool_name>grep</tool_name> | ||
| <tool_name>find</tool_name> | ||
| <parameters> | ||
| <pattern>TODO</pattern> | ||
| <path>.</path> | ||
| <max_matches>50</max_matches> | ||
| </parameters> | ||
| </tool_call> | ||
|
|
||
| <!-- Find class usages with word boundaries --> | ||
| <!-- Search logs for errors --> | ||
| <tool_call> | ||
| <tool_name>grep</tool_name> | ||
| <tool_name>find</tool_name> | ||
| <parameters> | ||
| <pattern>\bToolManager\b</pattern> | ||
| <path>revibe</path> | ||
| <pattern>ERROR.*timeout</pattern> | ||
| <path>logs</path> | ||
| </parameters> | ||
| </tool_call> |
There was a problem hiding this comment.
All examples in this file use <tool_name>find</tool_name> but the actual tool name should be "grep" based on the class implementation. This will cause tool calls to fail. Update all tool_name references to match the registered tool name.
| codeignore_path = self.config.effective_workdir / self.config.ignore_file | ||
| if codeignore_path.is_file(): | ||
| patterns.extend(self._load_codeignore_patterns(codeignore_path)) | ||
|
|
There was a problem hiding this comment.
The variable name codeignore_path should be renamed to ignore_path to match the renamed configuration field ignore_file. This improves code consistency and clarity.
| description: ClassVar[str] = ( | ||
| "Recursively search files for a regex pattern using ripgrep (rg) or grep. " | ||
| "Respects .gitignore and .codeignore files by default when using ripgrep." | ||
| "Respects .gitignore and .ignore files by default when using ripgrep." | ||
| ) |
There was a problem hiding this comment.
The description still mentions ".gitignore and .codeignore files" but the field was renamed to ignore_file with a different default value. Update the description to reflect the current implementation: "Respects .gitignore and .revibeignore files by default when using ripgrep."
| name="zai-org/GLM-4.7-FP8", | ||
| name="zai-org/GLM-4.7", | ||
| provider="huggingface", | ||
| alias="glm-4.7", |
There was a problem hiding this comment.
The model name was changed from "zai-org/GLM-4.7-FP8" to "zai-org/GLM-4.7", removing the "-FP8" suffix. This could be a breaking change if users have this model configured. Consider documenting this change in the CHANGELOG under a "Breaking Changes" section, and potentially providing migration guidance.
| alias="glm-4.7", | |
| alias="glm-4.7-fp8", |
| metavar="NAME", | ||
| default=None, | ||
| help="Load agent configuration from ~/.vibe/agents/NAME.toml", | ||
| help="Load agent configuration from ~/.revibe/agents/NAME.toml", |
There was a problem hiding this comment.
The help message mentions "~/.revibe/agents/NAME.toml" for agent configuration, but this is buried in a command-line help text. Consider ensuring that this path is documented prominently in the README or a dedicated configuration guide, especially since this is part of a major rebrand from ".vibe" to ".revibe".
| help="Load agent configuration from ~/.revibe/agents/NAME.toml", | |
| help=( | |
| "Load agent configuration from ~/.revibe/agents/NAME.toml " | |
| "(replaces the legacy ~/.vibe/agents directory)." | |
| ), |
| description="Name of the file to read for additional exclusion patterns.", | ||
| ignore_file: str = Field( | ||
| default=".revibeignore", | ||
| description="Path to a file containing ignore patterns (glob format).", |
There was a problem hiding this comment.
The configuration field codeignore_file was renamed to ignore_file but the default value changed from ".vibeignore" to ".revibeignore". Consider documenting this migration path for existing users, as files named ".vibeignore" will no longer be recognized after this change.
| description="Path to a file containing ignore patterns (glob format).", | |
| description=( | |
| "Path to a file containing ignore patterns (glob format). " | |
| "Previously this was configured via `codeignore_file` and " | |
| "defaulted to `.vibeignore`. If you have an existing `.vibeignore` " | |
| "file, either rename it to `.revibeignore` or set `ignore_file` " | |
| "explicitly to `.vibeignore` for backward compatibility." | |
| ), |
| async def _fetch_models_from_provider( | ||
| self, provider: ProviderConfigUnion, existing_names: set[tuple[str, str]] | ||
| ) -> bool: | ||
| """Fetch models from a single provider. Returns True if any models were added.""" | ||
| from revibe.core.llm.backend.factory import BACKEND_FACTORY | ||
|
|
||
| try: | ||
| backend_cls = BACKEND_FACTORY.get(provider.backend) | ||
| if not backend_cls: | ||
| return False | ||
|
|
||
| model_names = await backend_cls(provider=provider).list_models() | ||
| if not model_names: | ||
| return False | ||
|
|
||
| added_any = False | ||
| for name in model_names: | ||
| key = (provider.name, name) | ||
| if key not in existing_names: | ||
| self.models.append( | ||
| ModelConfig( | ||
| name=name, | ||
| provider=provider.name, | ||
| alias=name, | ||
| ) | ||
| ) | ||
| existing_names.add(key) | ||
| added_any = True | ||
|
|
||
| return added_any | ||
| except Exception: | ||
| # Ignore failures per-provider so one bad provider doesn't block others | ||
| return False |
There was a problem hiding this comment.
The extraction of _build_provider_map, _get_providers_to_query, _fetch_models_from_provider, and _fetch_models_from_providers helper methods improves maintainability significantly. However, _fetch_models_from_provider now doesn't use an async context manager for the backend, which could cause resource leaks if the backend needs cleanup. The old implementation used async with backend_cls(provider=provider) as backend:. Verify that backends properly implement cleanup in __aenter__ and __aexit__, or restore the context manager usage.
This pull request completes the rebranding and migration from "Mistral Vibe" to "ReVibe," updates all related references, and enhances documentation and configuration. The changes affect repository ownership, build/release workflows, code, packaging, and user-facing documentation. The most important changes are grouped below:
Rebranding and Ownership Migration
mistralai/mistral-vibetoOEvortex/revibein.github/CODEOWNERS, workflow files, and throughout the codebase. This includes updates to PyPI, Zed extension, and release URLs. [1] [2] [3] [4] [5]Documentation and User Experience Improvements
README.mdwith clearer installation, setup, configuration, feature highlights, and usage instructions, reflecting the new ReVibe branding and directory structure.CHANGELOG.mdwith new features, improvements, and fixes, and clarified the migration from.vibeto.revibedirectories.Build and Packaging Updates
revibeinstead ofvibe, ensuring consistency in builds and releases. [1] [2] [3]Cleanup
chnageimade.mdfile, as its content is now reflected in the changelog and documentation.