SuperClaude/setup/utils/updater.py
Mithun Gowda B 89a5cf33d6
Fixes and improvement (#378)
* Fix: Install only selected MCP servers and ensure valid empty backups

This commit addresses two separate issues:

1.  **MCP Installation:** The `install` command was installing all MCP servers instead of only the ones selected by the user. The `_install` method in `setup/components/mcp.py` was iterating through all available servers, not the user's selection. This has been fixed to respect the `selected_mcp_servers` configuration. A new test has been added to verify this fix.

2.  **Backup Creation:** The `create_backup` method in `setup/core/installer.py` created an invalid `.tar.gz` file when the backup source was empty. This has been fixed to ensure that a valid, empty tar archive is always created. A test was added for this as well.
Co-authored-by: Mithun Gowda B <mithungowda.b7411@gmail.com>
Co-authored-by: Jules <jules-ai-assistant@users.noreply.github.com>

* Fix: Correct installer validation for MCP and MCP Docs components

This commit fixes a validation issue in the installer where it would incorrectly fail after a partial installation of MCP servers.

The `MCPComponent` validation logic was checking for all "required" servers, regardless of whether they were selected by the user. This has been corrected to only validate the servers that were actually installed, by checking against the list of installed servers stored in the metadata. The metadata storage has also been fixed to only record the installed servers.

The `MCPDocsComponent` was failing validation because it was not being registered in the metadata if no documentation files were installed. This has been fixed by ensuring the post-installation hook runs even when no files are copied.

New tests have been added for both components to verify the corrected logic.

Co-authored-by: Mithun Gowda B <mithungowda.b7411@gmail.com>
Co-authored-by: Jules <jules-ai-assistant@users.noreply.github.com>

* Fix: Allow re-installation of components and correct validation logic

This commit fixes a bug that prevented new MCP servers from being installed on subsequent runs of the installer. It also fixes the validation logic that was causing failures after a partial installation.

The key changes are:
1.  A new `is_reinstallable` method has been added to the base `Component` class. This allows certain components (like the `mcp` component) to be re-run even if they are already marked as installed.
2.  The installer logic has been updated to respect this new method.
3.  The `MCPComponent` now correctly stores only the installed servers in the metadata.
4.  The validation logic for `MCPComponent` and `MCPDocsComponent` has been corrected to prevent incorrect failures.

New tests have been added to verify all aspects of the new logic.

Co-authored-by: Mithun Gowda B <mithungowda.b7411@gmail.com>
Co-authored-by: Jules <jules-ai-assistant@users.noreply.github.com>

* feat: Display authors in UI header and update author info

This commit implements the user's request to display author names and emails in the UI header of the installer.

The key changes are:
1.  The `__email__` field in `SuperClaude/__init__.py` has been updated to include both authors' emails.
2.  The `display_header` function in `setup/utils/ui.py` has been modified to read the author and email information and display it.
3.  A new test has been added to `tests/test_ui.py` to verify the new UI output.

Co-authored-by: Mithun Gowda B <mithungowda.b7411@gmail.com>
Co-authored-by: Jules <jules-ai-assistant@users.noreply.github.com>

* feat: Version bump to 4.1.0 and various fixes

This commit prepares the project for the v4.1.0 release. It includes a version bump across all relevant files and incorporates several bug fixes and feature enhancements from recent tasks.

Key changes in this release:

- **Version Bump**: The project version has been updated from 4.0.9 to 4.1.0 in all configuration files, documentation, and source code.

- **Installer Fixes**:
  - Components can now be marked as `reinstallable`, allowing them to be re-run on subsequent installations. This fixes a bug where new MCP servers could not be added.
  - The validation logic for `mcp` and `mcp_docs` components has been corrected to avoid incorrect failures.
  - A bug in the backup creation process that created invalid empty archives has been fixed.

- **UI Enhancements**:
  - Author names and emails are now displayed in the installer UI header.

- **Metadata Updates**:
  - Mithun Gowda B has been added as an author.

- **New Tests**:
  - Comprehensive tests have been added for the installer logic, MCP components, and UI changes to ensure correctness and prevent regressions.

Co-authored-by: Mithun Gowda B <mithungowda.b7411@gmail.com>
Co-authored-by: Jules <jules-ai-assistant@users.noreply.github.com>

* fix: Resolve dependencies for partial installs and other fixes

This commit addresses several issues, the main one being a dependency resolution failure during partial installations.

Key changes:
- **Dependency Resolution**: The installer now correctly resolves the full dependency tree when a user requests to install a subset of components. This fixes the "Unknown component: core" error.
- **Component Re-installation**: A new `is_reinstallable` flag allows components like `mcp` to be re-run on subsequent installs, enabling the addition of new servers.
- **Validation Logic**: The validation for `mcp` and `mcp_docs` has been corrected to avoid spurious failures.
- **UI and Metadata**: Author information has been added to the UI header and source files.
- **Version Bump**: The project version has been updated to 4.1.0.
- **Tests**: New tests have been added to cover all the above changes.

Co-authored-by: Mithun Gowda B <mithungowda.b7411@gmail.com>
Co-authored-by: Jules <jules-ai-assistant@users.noreply.github.com>

* fix: Installer fixes and version bump to 4.1.0

This commit includes a collection of fixes for the installer logic, UI enhancements, and a version bump to 4.1.0.

Key changes:
- **Dependency Resolution**: The installer now correctly resolves the full dependency tree for partial installations, fixing the "Unknown component: core" error.
- **Component Re-installation**: A new `is_reinstallable` flag allows components like `mcp` to be re-run to add new servers.
- **MCP Installation**: The non-interactive installation of the `mcp` component now correctly prompts the user to select servers.
- **Validation Logic**: The post-installation validation logic has been corrected to only validate components from the current session and to use the correct list of installed servers.
- **UI & Metadata**: Author information has been added to the UI and source files.
- **Version Bump**: The project version has been updated from 4.0.9 to 4.1.0 across all files.
- **Tests**: New tests have been added to cover all the bug fixes.

Co-authored-by: Mithun Gowda B <mithungowda.b7411@gmail.com>
Co-authored-by: Jules <jules-ai-assistant@users.noreply.github.com>

* feat: Add --authors flag and multiple installer fixes

This commit introduces the `--authors` flag to display author information and includes a collection of fixes for the installer logic.

Key changes:
- **New Feature**: Added an `--authors` flag that displays the names, emails, and GitHub usernames of the project authors.
- **Dependency Resolution**: Fixed a critical bug where partial installations would fail due to unresolved dependencies.
- **Component Re-installation**: Added a mechanism to allow components to be "reinstallable", fixing an issue that prevented adding new MCP servers on subsequent runs.
- **MCP Installation**: The non-interactive installation of the `mcp` component now correctly prompts for server selection.
- **Validation Logic**: Corrected the post-installation validation to prevent spurious errors.
- **Version Bump**: The project version has been updated to 4.1.0.
- **Metadata**: Author and GitHub information has been added to the source files.
- **UI**: The installer header now displays author information.
- **Tests**: Added new tests for all new features and bug fixes.

Co-authored-by: Mithun Gowda B <mithungowda.b7411@gmail.com>
Co-authored-by: Jules <jules-ai-assistant@users.noreply.github.com>

* Add Docker support and framework enhancements

- Add serena-docker.json MCP configuration
- Update MCP configs and installer components
- Enhance CLI commands with new functionality
- Add symbols utility for framework operations
- Improve UI and logging components

🤖 Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>

* Bump version from 4.1.1 to 4.1.2

- Update version across all package files
- Update documentation and README files
- Update Python module version strings
- Update feature configuration files

🤖 Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>
Co-Authored-By: Mithun Gowda B <mithungowda.b7411@gmail.com>

* Bump version from 4.1.2 to 4.1.3

- Update version across all package files
- Update documentation and README files
- Update Python module version strings
- Update feature configuration files

🤖 Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>
Co-Authored-By: Mithun Gowda B <mithungowda.b7411@gmail.com>

* Fix home directory detection for immutable distros

- Add get_home_directory() function to handle /var/home/$USER paths
- Support Fedora Silverblue, Universal Blue, and other immutable distros
- Replace all Path.home() calls throughout the setup system
- Add fallback methods for edge cases and compatibility
- Create test script for immutable distro validation

Fixes:
- Incorrect home path detection on immutable Linux distributions
- Installation failures on Fedora Silverblue/Universal Blue
- Issues with Claude Code configuration paths

Technical changes:
- New get_home_directory() in utils/environment.py
- Updated all CLI commands, validators, and core components
- Maintains backward compatibility with standard systems
- Robust fallback chain for edge cases

🤖 Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>
Co-Authored-By: Mithun Gowda B <mithungowda.b7411@gmail.com>

* Fix circular import and complete immutable distro support

- Move get_home_directory() to separate paths.py module
- Resolve circular import between environment.py and logger.py
- Update all import statements across the setup system
- Verify functionality with comprehensive testing

Technical changes:
- Created setup/utils/paths.py for path utilities
- Updated imports in all affected modules
- Maintains full backward compatibility
- Fixes installation on immutable distros

Testing completed:
-  Basic home directory detection works
-  Installation system integration works
-  Environment utilities integration works
-  Immutable distro logic validated

🤖 Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>
Co-Authored-By: Mithun Gowda B <mithungowda.b7411@gmail.com>

* Fix mcp_docs installation bugs

- Fix mcp_docs component incorrectly marking as installed when no MCP servers selected
- Add MCP server selection prompt when mcp_docs component is explicitly requested
- Return False instead of calling _post_install() when no servers selected or files found
- Add user-friendly warning when mcp_docs requested without server selection
- Remove mcp_docs from installation when no servers are available

🤖 Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>

* Fix MCP server name mapping for documentation files

- Add mapping for sequential-thinking -> MCP_Sequential.md
- Add mapping for morphllm-fast-apply -> MCP_Morphllm.md
- Ensures mcp_docs installation works with all MCP server naming conventions

🤖 Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>

* Enable mcp_docs component reinstallation

- Add is_reinstallable() method returning True to allow repeat installations
- Fixes issue where mcp_docs was skipped on subsequent installation attempts
- Enables users to change MCP server selections and update documentation

🤖 Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>

* Fix repeat installation issues for mcp_docs

- Ensure mcp component is auto-added when mcp_docs is selected with servers
- Fix component_files tracking to only include successfully copied files
- Ensures CLAUDE.md gets properly updated with MCP documentation imports
- Fixes issue where MCP servers weren't installed on repeat attempts

🤖 Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>

* Fix MCP component metadata tracking and debug logging

- Fix servers_count to track actually installed servers instead of total available
- Add installed_servers list to metadata for better tracking
- Add debug logging to trace component auto-addition
- Ensures MCP component appears properly in metadata when servers are installed

🤖 Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>

* Fix pyproject.toml license format and add missing classifier

- Fix license format from string to {text = "MIT"} format
- Add missing "License :: OSI Approved :: MIT License" classifier
- Fix indentation consistency in classifiers section
- Resolves setup.py installation errors and PEP 621 compliance

🤖 Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>

* Fix MCP incremental installation and auto-detection system

PROBLEM FIXED:
- MCP component only registered servers selected during current session
- mcp_docs component only installed docs for newly selected servers
- Users had to reinstall everything when adding new MCP servers
- Installation failed if no servers selected but servers existed

SOLUTION IMPLEMENTED:
- Add auto-detection of existing MCP servers from config files (.claude.json, claude_desktop_config.json)
- Add CLI detection via 'claude mcp list' output parsing
- Add smart server merging (existing + selected + previously installed)
- Add server name normalization for common variations
- Fix CLI logic to allow mcp_docs installation without server selection
- Add graceful error handling for corrupted configs

KEY FEATURES:
 Auto-detects existing MCP servers from multiple config locations
 Supports incremental installation (add new servers without breaking existing)
 Works with or without --install-dir argument
 Handles server name variations (sequential vs sequential-thinking, etc.)
 Maintains metadata persistence across installation sessions
 Graceful fallback when config files are corrupted
 Compatible with both interactive and non-interactive modes

TESTED SCENARIOS:
- Fresh installation with no MCP servers 
- Auto-detection with existing servers 
- Incremental server additions 
- Mixed mode (new + existing servers) 
- Error handling with corrupted configs 
- Default vs custom installation directories 
- Interactive vs command-line modes 

Files changed:
- setup/cli/commands/install.py: Allow mcp_docs auto-detection mode
- setup/components/mcp.py: Add comprehensive auto-detection logic
- setup/components/mcp_docs.py: Add auto-detection for documentation

🤖 Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>

* Integrate SuperClaude framework flags into help command

ENHANCEMENT:
- Add comprehensive flag documentation to /sc:help command
- Include all 25 SuperClaude framework flags with descriptions
- Organize flags into logical categories (Mode, MCP, Analysis, Execution, Output)
- Add practical usage examples showing flag combinations
- Include flag priority rules and precedence hierarchy

NEW SECTIONS ADDED:
 Mode Activation Flags (5 flags): --brainstorm, --introspect, --task-manage, --orchestrate, --token-efficient
 MCP Server Flags (8 flags): --c7, --seq, --magic, --morph, --serena, --play, --all-mcp, --no-mcp
 Analysis Depth Flags (3 flags): --think, --think-hard, --ultrathink
 Execution Control Flags (6 flags): --delegate, --concurrency, --loop, --iterations, --validate, --safe-mode
 Output Optimization Flags (3 flags): --uc, --scope, --focus
 Flag Priority Rules: Clear hierarchy and precedence guidelines
 Usage Examples: 4 practical examples showing real-world flag combinations

IMPACT:
- Users can now discover all SuperClaude capabilities from /sc:help
- Single source of truth for commands AND flags
- Improved discoverability of advanced features
- Clear guidance on flag usage and combinations
- Help content nearly doubled (68 → 148 lines) with valuable reference information

Files changed:
- SuperClaude/Commands/help.md: Integrate FLAGS.md content with structured tables and examples

🤖 Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>

* Remove non-existent commands from modes.md documentation

PROBLEM FIXED:
- Documentation contained references to fake/non-existent commands
- Commands like sc:fix, sc:simple-pix, sc:update, sc:develop, sc:modernize, sc:simple-fix don't exist in CLI
- Confusing users who try to use these commands and get errors
- Inconsistency between documentation and actual SuperClaude command availability

COMMANDS REMOVED/REPLACED:
 /sc:simple-fix →  /sc:troubleshoot (real command)
 /sc:develop →  /sc:implement (real command)
 /sc:modernize →  /sc:improve (real command)

AFFECTED FILES:
- Docs/User-Guide/modes.md: Fixed all non-existent command references
- Docs/User-Guide-jp/modes.md: Fixed Japanese translation with same issues
- Docs/User-Guide-zh/modes.md: Fixed Chinese translation with same issues

VERIFICATION:
 All remaining /sc: commands verified to exist in SuperClaude/Commands/
 No more references to fake commands in any language version
 Examples now use only real, working SuperClaude commands
 User experience improved - no more confusion from non-working commands

REAL COMMANDS REFERENCED:
- /sc:analyze, /sc:brainstorm, /sc:help, /sc:implement
- /sc:improve, /sc:reflect, /sc:troubleshoot
- All verified to exist in CLI implementation

🤖 Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>

* Version bump to 4.1.4

CHANGELOG:
 Added comprehensive flag documentation to /sc:help command
 Fixed MCP incremental installation and auto-detection system
 Cleaned up documentation by removing non-existent commands
 Enhanced user experience with complete capability reference

VERSION UPDATES:
- Updated VERSION file: 4.1.3 → 4.1.4
- Updated pyproject.toml: 4.1.3 → 4.1.4
- Updated package.json: 4.1.3 → 4.1.4
- Updated all Python __init__.py fallback versions
- Updated all documentation references across all languages
- Updated setup/data/features.json component versions
- Updated CHANGELOG.md with comprehensive 4.1.4 release notes

SCOPE OF CHANGES:
📦 Core files: VERSION, pyproject.toml, package.json, __init__.py files
📚 Documentation: All .md files across English, Japanese, Chinese
🔧 Setup files: features.json, base.py version references
📝 Project files: README files, CHANGELOG, SECURITY, CONTRIBUTING

VERIFICATION:
 No remaining 4.1.3 references found
 29 files now properly reference 4.1.4
 All language versions consistently updated
 Package metadata properly versioned for distribution

🤖 Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>

---------

Co-authored-by: google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com>
Co-authored-by: Jules <jules-ai-assistant@users.noreply.github.com>
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Happy <yesreply@happy.engineering>
2025-09-20 14:08:42 +05:30

314 lines
10 KiB
Python

"""
Auto-update checker for SuperClaude Framework
Checks PyPI for newer versions and offers automatic updates
"""
import os
import sys
import json
import time
import subprocess
from pathlib import Path
from typing import Optional, Tuple
from packaging import version
import urllib.request
import urllib.error
from datetime import datetime, timedelta
from .ui import display_info, display_warning, display_success, Colors
from .logger import get_logger
from .paths import get_home_directory
class UpdateChecker:
"""Handles automatic update checking for SuperClaude"""
PYPI_URL = "https://pypi.org/pypi/SuperClaude/json"
CACHE_FILE = get_home_directory() / ".claude" / ".update_check"
CHECK_INTERVAL = 86400 # 24 hours in seconds
TIMEOUT = 2 # seconds
def __init__(self, current_version: str):
"""
Initialize update checker
Args:
current_version: Current installed version
"""
self.current_version = current_version
self.logger = get_logger()
def should_check_update(self, force: bool = False) -> bool:
"""
Determine if we should check for updates based on last check time
Args:
force: Force check regardless of last check time
Returns:
True if update check should be performed
"""
if force:
return True
if not self.CACHE_FILE.exists():
return True
try:
with open(self.CACHE_FILE, 'r') as f:
data = json.load(f)
last_check = data.get('last_check', 0)
# Check if 24 hours have passed
if time.time() - last_check > self.CHECK_INTERVAL:
return True
except (json.JSONDecodeError, KeyError):
return True
return False
def save_check_timestamp(self):
"""Save the current timestamp as last check time"""
self.CACHE_FILE.parent.mkdir(parents=True, exist_ok=True)
data = {}
if self.CACHE_FILE.exists():
try:
with open(self.CACHE_FILE, 'r') as f:
data = json.load(f)
except:
pass
data['last_check'] = time.time()
with open(self.CACHE_FILE, 'w') as f:
json.dump(data, f)
def get_latest_version(self) -> Optional[str]:
"""
Query PyPI for the latest version of SuperClaude
Returns:
Latest version string or None if check fails
"""
try:
# Create request with timeout
req = urllib.request.Request(
self.PYPI_URL,
headers={'User-Agent': 'SuperClaude-Updater'}
)
# Set timeout for the request
with urllib.request.urlopen(req, timeout=self.TIMEOUT) as response:
data = json.loads(response.read().decode())
latest = data.get('info', {}).get('version')
if self.logger:
self.logger.debug(f"Latest PyPI version: {latest}")
return latest
except (urllib.error.URLError, urllib.error.HTTPError, json.JSONDecodeError) as e:
if self.logger:
self.logger.debug(f"Failed to check PyPI: {e}")
return None
except Exception as e:
if self.logger:
self.logger.debug(f"Unexpected error checking updates: {e}")
return None
def compare_versions(self, latest: str) -> bool:
"""
Compare current version with latest version
Args:
latest: Latest version string
Returns:
True if update is available
"""
try:
return version.parse(latest) > version.parse(self.current_version)
except Exception:
return False
def detect_installation_method(self) -> str:
"""
Detect how SuperClaude was installed (pip, pipx, etc.)
Returns:
Installation method string
"""
# Check pipx first
try:
result = subprocess.run(
['pipx', 'list'],
capture_output=True,
text=True,
timeout=2
)
if 'SuperClaude' in result.stdout or 'superclaude' in result.stdout:
return 'pipx'
except:
pass
# Check if pip installation exists
try:
result = subprocess.run(
[sys.executable, '-m', 'pip', 'show', 'SuperClaude'],
capture_output=True,
text=True,
timeout=2
)
if result.returncode == 0:
# Check if it's a user installation
if '--user' in result.stdout or get_home_directory() in Path(result.stdout):
return 'pip-user'
return 'pip'
except:
pass
return 'unknown'
def get_update_command(self) -> str:
"""
Get the appropriate update command based on installation method
Returns:
Update command string
"""
method = self.detect_installation_method()
commands = {
'pipx': 'pipx upgrade SuperClaude',
'pip-user': 'pip install --upgrade --user SuperClaude',
'pip': 'pip install --upgrade SuperClaude',
'unknown': 'pip install --upgrade SuperClaude'
}
return commands.get(method, commands['unknown'])
def show_update_banner(self, latest: str, auto_update: bool = False) -> bool:
"""
Display update available banner
Args:
latest: Latest version available
auto_update: Whether to auto-update without prompting
Returns:
True if user wants to update
"""
update_cmd = self.get_update_command()
# Display banner
print(f"\n{Colors.CYAN}+================================================+{Colors.RESET}")
print(f"{Colors.CYAN}{Colors.YELLOW} 🚀 Update Available: {self.current_version}{latest} {Colors.CYAN}{Colors.RESET}")
print(f"{Colors.CYAN}{Colors.GREEN} Run: {update_cmd:<30} {Colors.CYAN}{Colors.RESET}")
print(f"{Colors.CYAN}+================================================+{Colors.RESET}\n")
if auto_update:
return True
# Check if running in non-interactive mode
if not sys.stdin.isatty():
return False
# Prompt user
try:
response = input(f"{Colors.YELLOW}Would you like to update now? (y/N): {Colors.RESET}").strip().lower()
return response in ['y', 'yes']
except (EOFError, KeyboardInterrupt):
return False
def perform_update(self) -> bool:
"""
Execute the update command
Returns:
True if update succeeded
"""
update_cmd = self.get_update_command()
print(f"{Colors.CYAN}🔄 Updating SuperClaude...{Colors.RESET}")
try:
result = subprocess.run(
update_cmd.split(),
capture_output=False,
text=True
)
if result.returncode == 0:
display_success("Update completed successfully!")
print(f"{Colors.YELLOW}Please restart SuperClaude to use the new version.{Colors.RESET}")
return True
else:
display_warning("Update failed. Please run manually:")
print(f" {update_cmd}")
return False
except Exception as e:
display_warning(f"Could not auto-update: {e}")
print(f"Please run manually: {update_cmd}")
return False
def check_and_notify(self, force: bool = False, auto_update: bool = False) -> bool:
"""
Main method to check for updates and notify user
Args:
force: Force check regardless of last check time
auto_update: Automatically update if available
Returns:
True if update was performed
"""
# Check if we should skip based on environment variable
if os.getenv('SUPERCLAUDE_NO_UPDATE_CHECK', '').lower() in ['true', '1', 'yes']:
return False
# Check if auto-update is enabled via environment
if os.getenv('SUPERCLAUDE_AUTO_UPDATE', '').lower() in ['true', '1', 'yes']:
auto_update = True
# Check if enough time has passed
if not self.should_check_update(force):
return False
# Get latest version
latest = self.get_latest_version()
if not latest:
return False
# Save timestamp
self.save_check_timestamp()
# Compare versions
if not self.compare_versions(latest):
return False
# Show banner and potentially update
if self.show_update_banner(latest, auto_update):
return self.perform_update()
return False
def check_for_updates(current_version: str = None, **kwargs) -> bool:
"""
Convenience function to check for updates
Args:
current_version: Current installed version (defaults to reading from setup)
**kwargs: Additional arguments passed to check_and_notify
Returns:
True if update was performed
"""
if current_version is None:
from setup import __version__
current_version = __version__
checker = UpdateChecker(current_version)
return checker.check_and_notify(**kwargs)