2025-08-14 08:56:04 +05:30
|
|
|
"""
|
|
|
|
|
Abstract base class for installable components
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
from abc import ABC, abstractmethod
|
|
|
|
|
from typing import List, Dict, Tuple, Optional, Any
|
|
|
|
|
from pathlib import Path
|
|
|
|
|
import json
|
2025-08-14 22:03:34 +02:00
|
|
|
from ..services.files import FileService
|
|
|
|
|
from ..services.settings import SettingsService
|
2025-08-14 08:56:04 +05:30
|
|
|
from ..utils.logger import get_logger
|
|
|
|
|
from ..utils.security import SecurityValidator
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class Component(ABC):
|
|
|
|
|
"""Base class for all installable components"""
|
|
|
|
|
|
|
|
|
|
def __init__(self, install_dir: Optional[Path] = None, component_subdir: Path = Path('')):
|
|
|
|
|
"""
|
|
|
|
|
Initialize component with installation directory
|
|
|
|
|
|
|
|
|
|
Args:
|
|
|
|
|
install_dir: Target installation directory (defaults to ~/.claude)
|
|
|
|
|
"""
|
|
|
|
|
from .. import DEFAULT_INSTALL_DIR
|
2025-08-14 22:03:34 +02:00
|
|
|
# Initialize logger first
|
2025-08-14 08:56:04 +05:30
|
|
|
self.logger = get_logger()
|
2025-08-14 22:03:34 +02:00
|
|
|
# Resolve path safely
|
|
|
|
|
self.install_dir = self._resolve_path_safely(install_dir or DEFAULT_INSTALL_DIR)
|
|
|
|
|
self.settings_manager = SettingsService(self.install_dir)
|
2025-08-14 08:56:04 +05:30
|
|
|
self.component_files = self._discover_component_files()
|
2025-08-14 22:03:34 +02:00
|
|
|
self.file_manager = FileService()
|
2025-08-14 08:56:04 +05:30
|
|
|
self.install_component_subdir = self.install_dir / component_subdir
|
|
|
|
|
|
|
|
|
|
@abstractmethod
|
|
|
|
|
def get_metadata(self) -> Dict[str, str]:
|
|
|
|
|
"""
|
|
|
|
|
Return component metadata
|
|
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
Dict containing:
|
|
|
|
|
- name: Component name
|
|
|
|
|
- version: Component version
|
|
|
|
|
- description: Component description
|
|
|
|
|
- category: Component category (core, command, integration, etc.)
|
|
|
|
|
"""
|
|
|
|
|
pass
|
Fixed Some Bugs (#355)
* 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: Jules <jules-ai-assistant@users.noreply.github.com>
---------
Co-authored-by: Mithun Gowda B <mithungowda.b7411@gmail.com>
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>
2025-09-13 17:28:52 +05:30
|
|
|
|
|
|
|
|
def is_reinstallable(self) -> bool:
|
|
|
|
|
"""
|
|
|
|
|
Whether this component should be re-installed if already present.
|
|
|
|
|
Useful for container-like components that can install sub-parts.
|
|
|
|
|
"""
|
|
|
|
|
return False
|
2025-08-14 08:56:04 +05:30
|
|
|
|
|
|
|
|
def validate_prerequisites(self, installSubPath: Optional[Path] = None) -> Tuple[bool, List[str]]:
|
|
|
|
|
"""
|
|
|
|
|
Check prerequisites for this component
|
|
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
Tuple of (success: bool, error_messages: List[str])
|
|
|
|
|
"""
|
|
|
|
|
errors = []
|
|
|
|
|
|
|
|
|
|
# Check if we have read access to source files
|
|
|
|
|
source_dir = self._get_source_dir()
|
|
|
|
|
if not source_dir or (source_dir and not source_dir.exists()):
|
|
|
|
|
errors.append(f"Source directory not found: {source_dir}")
|
|
|
|
|
return False, errors
|
|
|
|
|
|
|
|
|
|
# Check if all required framework files exist
|
|
|
|
|
missing_files = []
|
|
|
|
|
for filename in self.component_files:
|
|
|
|
|
source_file = source_dir / filename
|
|
|
|
|
if not source_file.exists():
|
|
|
|
|
missing_files.append(filename)
|
|
|
|
|
|
|
|
|
|
if missing_files:
|
|
|
|
|
errors.append(f"Missing component files: {missing_files}")
|
|
|
|
|
|
|
|
|
|
# Check write permissions to install directory
|
|
|
|
|
has_perms, missing = SecurityValidator.check_permissions(
|
|
|
|
|
self.install_dir, {'write'}
|
|
|
|
|
)
|
|
|
|
|
if not has_perms:
|
|
|
|
|
errors.append(f"No write permissions to {self.install_dir}: {missing}")
|
|
|
|
|
|
|
|
|
|
# Validate installation target
|
|
|
|
|
is_safe, validation_errors = SecurityValidator.validate_installation_target(self.install_component_subdir)
|
|
|
|
|
if not is_safe:
|
|
|
|
|
errors.extend(validation_errors)
|
|
|
|
|
|
|
|
|
|
# Get files to install
|
|
|
|
|
files_to_install = self.get_files_to_install()
|
|
|
|
|
|
|
|
|
|
# Validate all files for security
|
|
|
|
|
is_safe, security_errors = SecurityValidator.validate_component_files(
|
|
|
|
|
files_to_install, source_dir, self.install_component_subdir
|
|
|
|
|
)
|
|
|
|
|
if not is_safe:
|
|
|
|
|
errors.extend(security_errors)
|
|
|
|
|
|
|
|
|
|
if not self.file_manager.ensure_directory(self.install_component_subdir):
|
|
|
|
|
errors.append(f"Could not create install directory: {self.install_component_subdir}")
|
|
|
|
|
|
|
|
|
|
return len(errors) == 0, errors
|
|
|
|
|
|
|
|
|
|
def get_files_to_install(self) -> List[Tuple[Path, Path]]:
|
|
|
|
|
"""
|
|
|
|
|
Return list of files to install
|
|
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
List of tuples (source_path, target_path)
|
|
|
|
|
"""
|
|
|
|
|
source_dir = self._get_source_dir()
|
|
|
|
|
files = []
|
|
|
|
|
|
|
|
|
|
if source_dir:
|
|
|
|
|
for filename in self.component_files:
|
|
|
|
|
source = source_dir / filename
|
|
|
|
|
target = self.install_component_subdir / filename
|
|
|
|
|
files.append((source, target))
|
|
|
|
|
|
|
|
|
|
return files
|
|
|
|
|
|
|
|
|
|
def get_settings_modifications(self) -> Dict[str, Any]:
|
|
|
|
|
"""
|
|
|
|
|
Return settings.json modifications to apply
|
|
|
|
|
(now only Claude Code compatible settings)
|
|
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
Dict of settings to merge into settings.json
|
|
|
|
|
"""
|
|
|
|
|
# Return empty dict as we don't modify Claude Code settings
|
|
|
|
|
return {}
|
|
|
|
|
|
|
|
|
|
def install(self, config: Dict[str, Any]) -> bool:
|
|
|
|
|
try:
|
|
|
|
|
return self._install(config)
|
|
|
|
|
except Exception as e:
|
|
|
|
|
self.logger.exception(f"Unexpected error during {repr(self)} installation: {e}")
|
|
|
|
|
return False
|
|
|
|
|
|
|
|
|
|
@abstractmethod
|
|
|
|
|
def _install(self, config: Dict[str, Any]) -> bool:
|
|
|
|
|
"""
|
|
|
|
|
Perform component-specific installation logic
|
|
|
|
|
|
|
|
|
|
Args:
|
|
|
|
|
config: Installation configuration
|
|
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
True if successful, False otherwise
|
|
|
|
|
"""
|
|
|
|
|
# Validate installation
|
|
|
|
|
success, errors = self.validate_prerequisites()
|
|
|
|
|
if not success:
|
|
|
|
|
for error in errors:
|
|
|
|
|
self.logger.error(error)
|
|
|
|
|
return False
|
|
|
|
|
|
|
|
|
|
# Get files to install
|
|
|
|
|
files_to_install = self.get_files_to_install()
|
|
|
|
|
|
|
|
|
|
# Copy framework files
|
|
|
|
|
success_count = 0
|
|
|
|
|
for source, target in files_to_install:
|
|
|
|
|
self.logger.debug(f"Copying {source.name} to {target}")
|
|
|
|
|
|
|
|
|
|
if self.file_manager.copy_file(source, target):
|
|
|
|
|
success_count += 1
|
|
|
|
|
self.logger.debug(f"Successfully copied {source.name}")
|
|
|
|
|
else:
|
|
|
|
|
self.logger.error(f"Failed to copy {source.name}")
|
|
|
|
|
|
|
|
|
|
if success_count != len(files_to_install):
|
|
|
|
|
self.logger.error(f"Only {success_count}/{len(files_to_install)} files copied successfully")
|
|
|
|
|
return False
|
|
|
|
|
|
|
|
|
|
self.logger.success(f"{repr(self)} component installed successfully ({success_count} files)")
|
|
|
|
|
|
|
|
|
|
return self._post_install()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@abstractmethod
|
|
|
|
|
def _post_install(self) -> bool:
|
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@abstractmethod
|
|
|
|
|
def uninstall(self) -> bool:
|
|
|
|
|
"""
|
|
|
|
|
Remove component
|
|
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
True if successful, False otherwise
|
|
|
|
|
"""
|
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
@abstractmethod
|
|
|
|
|
def get_dependencies(self) -> List[str]:
|
|
|
|
|
"""
|
|
|
|
|
Return list of component dependencies
|
|
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
List of component names this component depends on
|
|
|
|
|
"""
|
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
@abstractmethod
|
|
|
|
|
def _get_source_dir(self) -> Optional[Path]:
|
|
|
|
|
"""Get source directory for component files"""
|
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
def update(self, config: Dict[str, Any]) -> bool:
|
|
|
|
|
"""
|
|
|
|
|
Update component (default: uninstall then install)
|
|
|
|
|
|
|
|
|
|
Args:
|
|
|
|
|
config: Installation configuration
|
|
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
True if successful, False otherwise
|
|
|
|
|
"""
|
|
|
|
|
# Default implementation: uninstall and reinstall
|
|
|
|
|
if self.uninstall():
|
|
|
|
|
return self.install(config)
|
|
|
|
|
return False
|
|
|
|
|
|
|
|
|
|
def get_installed_version(self) -> Optional[str]:
|
|
|
|
|
"""
|
|
|
|
|
Get currently installed version of component
|
|
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
Version string if installed, None otherwise
|
|
|
|
|
"""
|
2025-08-14 22:03:34 +02:00
|
|
|
self.logger.debug("Checking installed version")
|
Fix component validation and bump version to 4.0.6 (#292)
* ✨ Enhance documentation with advanced markdown formatting
Major improvements to documentation presentation and usability:
README.md:
- Added centered hero section with framework statistics dashboard
- Created visual support section with donation cards
- Enhanced What's New section with feature grid layout
- Reorganized documentation links into categorized table
- Added professional badges and visual separators
installation.md:
- Centered title with platform badges and quick navigation
- Consolidated 4 installation methods into unified table
- Created visual requirement cards (Required vs Optional)
- Added collapsible troubleshooting sections
- Removed 3 duplicate "What's Next" sections
- Enhanced learning journey with progression tables
quick-start.md:
- Added visual framework architecture flow diagram
- Created component statistics dashboard (21|14|6|6)
- Built comparison table for SuperClaude vs Standard Claude
- Added 4-week learning timeline with milestones
- Enhanced workflow patterns with step-by-step tables
- Created key insights cards explaining framework philosophy
All documents now feature consistent styling with centered titles,
organized tables, emojis for visual scanning, and improved navigation.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
* 🔥 Remove outdated publishing and release instruction files
Cleaned up repository by removing:
- PUBLISHING.md: Outdated publishing guidelines
- RELEASE_INSTRUCTIONS.md: Old release process documentation
These files are no longer needed as the project has evolved
and the processes have been streamlined or moved elsewhere.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
* 🐛 Fix component validation to check metadata file instead of settings.json
Resolves #291 - Validation errors after V4 upgrade
## Changes
- Fixed validation logic to check .superclaude-metadata.json instead of settings.json
- Standardized all component versions to 4.0.4 across the framework
- Fixed agent validation to check for correct filenames (architect vs specialist/engineer)
- Cleaned up metadata file structure for consistency
## Technical Details
The issue was caused by components registering in .superclaude-metadata.json but
validation checking settings.json for component registration. This mismatch caused
false validation errors even though components were properly installed.
## Testing
All components now validate successfully with the corrected logic.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
* 🔖 Bump version to 4.0.6 across entire project
## Summary
Comprehensive version update from 4.0.4 to 4.0.6 with validation fixes
## Changes
- Updated VERSION file, pyproject.toml, and package.json
- Updated all Python __version__ declarations (8 occurrences)
- Updated all component metadata versions (6 components, 25+ occurrences)
- Updated documentation and README version badges (11 files)
- Fixed package.json inconsistency (was 4.0.5)
- Updated legacy backup.py version reference (was 3.0.0)
- Added CHANGELOG entry for version 4.0.6
## Files Modified (26 total)
- Core: VERSION, pyproject.toml, package.json
- Python: SuperClaude/__init__.py, __main__.py, setup/__init__.py, cli/base.py
- Components: core.py, commands.py, agents.py, mcp.py, mcp_docs.py, modes.py
- Docs: README.md, CONTRIBUTING.md, SECURITY.md, installation.md, quick-start.md
- Config: features.json, backup.py, update.py
- User: ~/.claude/.superclaude-metadata.json
## Verification
All version references now consistently show 4.0.6
Historical references in CHANGELOG preserved as intended
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
* 📝 Update README.md installation instructions
---------
Signed-off-by: NomenAK <39598727+NomenAK@users.noreply.github.com>
Co-authored-by: Claude <noreply@anthropic.com>
2025-08-23 12:08:09 +02:00
|
|
|
metadata_file = self.install_dir / ".superclaude-metadata.json"
|
|
|
|
|
if metadata_file.exists():
|
|
|
|
|
self.logger.debug("Metadata file exists, reading version")
|
2025-08-14 08:56:04 +05:30
|
|
|
try:
|
Fix component validation and bump version to 4.0.6 (#292)
* ✨ Enhance documentation with advanced markdown formatting
Major improvements to documentation presentation and usability:
README.md:
- Added centered hero section with framework statistics dashboard
- Created visual support section with donation cards
- Enhanced What's New section with feature grid layout
- Reorganized documentation links into categorized table
- Added professional badges and visual separators
installation.md:
- Centered title with platform badges and quick navigation
- Consolidated 4 installation methods into unified table
- Created visual requirement cards (Required vs Optional)
- Added collapsible troubleshooting sections
- Removed 3 duplicate "What's Next" sections
- Enhanced learning journey with progression tables
quick-start.md:
- Added visual framework architecture flow diagram
- Created component statistics dashboard (21|14|6|6)
- Built comparison table for SuperClaude vs Standard Claude
- Added 4-week learning timeline with milestones
- Enhanced workflow patterns with step-by-step tables
- Created key insights cards explaining framework philosophy
All documents now feature consistent styling with centered titles,
organized tables, emojis for visual scanning, and improved navigation.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
* 🔥 Remove outdated publishing and release instruction files
Cleaned up repository by removing:
- PUBLISHING.md: Outdated publishing guidelines
- RELEASE_INSTRUCTIONS.md: Old release process documentation
These files are no longer needed as the project has evolved
and the processes have been streamlined or moved elsewhere.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
* 🐛 Fix component validation to check metadata file instead of settings.json
Resolves #291 - Validation errors after V4 upgrade
## Changes
- Fixed validation logic to check .superclaude-metadata.json instead of settings.json
- Standardized all component versions to 4.0.4 across the framework
- Fixed agent validation to check for correct filenames (architect vs specialist/engineer)
- Cleaned up metadata file structure for consistency
## Technical Details
The issue was caused by components registering in .superclaude-metadata.json but
validation checking settings.json for component registration. This mismatch caused
false validation errors even though components were properly installed.
## Testing
All components now validate successfully with the corrected logic.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
* 🔖 Bump version to 4.0.6 across entire project
## Summary
Comprehensive version update from 4.0.4 to 4.0.6 with validation fixes
## Changes
- Updated VERSION file, pyproject.toml, and package.json
- Updated all Python __version__ declarations (8 occurrences)
- Updated all component metadata versions (6 components, 25+ occurrences)
- Updated documentation and README version badges (11 files)
- Fixed package.json inconsistency (was 4.0.5)
- Updated legacy backup.py version reference (was 3.0.0)
- Added CHANGELOG entry for version 4.0.6
## Files Modified (26 total)
- Core: VERSION, pyproject.toml, package.json
- Python: SuperClaude/__init__.py, __main__.py, setup/__init__.py, cli/base.py
- Components: core.py, commands.py, agents.py, mcp.py, mcp_docs.py, modes.py
- Docs: README.md, CONTRIBUTING.md, SECURITY.md, installation.md, quick-start.md
- Config: features.json, backup.py, update.py
- User: ~/.claude/.superclaude-metadata.json
## Verification
All version references now consistently show 4.0.6
Historical references in CHANGELOG preserved as intended
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
* 📝 Update README.md installation instructions
---------
Signed-off-by: NomenAK <39598727+NomenAK@users.noreply.github.com>
Co-authored-by: Claude <noreply@anthropic.com>
2025-08-23 12:08:09 +02:00
|
|
|
with open(metadata_file, 'r') as f:
|
|
|
|
|
metadata = json.load(f)
|
2025-08-14 08:56:04 +05:30
|
|
|
component_name = self.get_metadata()['name']
|
Fix component validation and bump version to 4.0.6 (#292)
* ✨ Enhance documentation with advanced markdown formatting
Major improvements to documentation presentation and usability:
README.md:
- Added centered hero section with framework statistics dashboard
- Created visual support section with donation cards
- Enhanced What's New section with feature grid layout
- Reorganized documentation links into categorized table
- Added professional badges and visual separators
installation.md:
- Centered title with platform badges and quick navigation
- Consolidated 4 installation methods into unified table
- Created visual requirement cards (Required vs Optional)
- Added collapsible troubleshooting sections
- Removed 3 duplicate "What's Next" sections
- Enhanced learning journey with progression tables
quick-start.md:
- Added visual framework architecture flow diagram
- Created component statistics dashboard (21|14|6|6)
- Built comparison table for SuperClaude vs Standard Claude
- Added 4-week learning timeline with milestones
- Enhanced workflow patterns with step-by-step tables
- Created key insights cards explaining framework philosophy
All documents now feature consistent styling with centered titles,
organized tables, emojis for visual scanning, and improved navigation.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
* 🔥 Remove outdated publishing and release instruction files
Cleaned up repository by removing:
- PUBLISHING.md: Outdated publishing guidelines
- RELEASE_INSTRUCTIONS.md: Old release process documentation
These files are no longer needed as the project has evolved
and the processes have been streamlined or moved elsewhere.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
* 🐛 Fix component validation to check metadata file instead of settings.json
Resolves #291 - Validation errors after V4 upgrade
## Changes
- Fixed validation logic to check .superclaude-metadata.json instead of settings.json
- Standardized all component versions to 4.0.4 across the framework
- Fixed agent validation to check for correct filenames (architect vs specialist/engineer)
- Cleaned up metadata file structure for consistency
## Technical Details
The issue was caused by components registering in .superclaude-metadata.json but
validation checking settings.json for component registration. This mismatch caused
false validation errors even though components were properly installed.
## Testing
All components now validate successfully with the corrected logic.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
* 🔖 Bump version to 4.0.6 across entire project
## Summary
Comprehensive version update from 4.0.4 to 4.0.6 with validation fixes
## Changes
- Updated VERSION file, pyproject.toml, and package.json
- Updated all Python __version__ declarations (8 occurrences)
- Updated all component metadata versions (6 components, 25+ occurrences)
- Updated documentation and README version badges (11 files)
- Fixed package.json inconsistency (was 4.0.5)
- Updated legacy backup.py version reference (was 3.0.0)
- Added CHANGELOG entry for version 4.0.6
## Files Modified (26 total)
- Core: VERSION, pyproject.toml, package.json
- Python: SuperClaude/__init__.py, __main__.py, setup/__init__.py, cli/base.py
- Components: core.py, commands.py, agents.py, mcp.py, mcp_docs.py, modes.py
- Docs: README.md, CONTRIBUTING.md, SECURITY.md, installation.md, quick-start.md
- Config: features.json, backup.py, update.py
- User: ~/.claude/.superclaude-metadata.json
## Verification
All version references now consistently show 4.0.6
Historical references in CHANGELOG preserved as intended
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
* 📝 Update README.md installation instructions
---------
Signed-off-by: NomenAK <39598727+NomenAK@users.noreply.github.com>
Co-authored-by: Claude <noreply@anthropic.com>
2025-08-23 12:08:09 +02:00
|
|
|
version = metadata.get('components', {}).get(component_name, {}).get('version')
|
2025-08-14 22:03:34 +02:00
|
|
|
self.logger.debug(f"Found version: {version}")
|
|
|
|
|
return version
|
|
|
|
|
except Exception as e:
|
Fix component validation and bump version to 4.0.6 (#292)
* ✨ Enhance documentation with advanced markdown formatting
Major improvements to documentation presentation and usability:
README.md:
- Added centered hero section with framework statistics dashboard
- Created visual support section with donation cards
- Enhanced What's New section with feature grid layout
- Reorganized documentation links into categorized table
- Added professional badges and visual separators
installation.md:
- Centered title with platform badges and quick navigation
- Consolidated 4 installation methods into unified table
- Created visual requirement cards (Required vs Optional)
- Added collapsible troubleshooting sections
- Removed 3 duplicate "What's Next" sections
- Enhanced learning journey with progression tables
quick-start.md:
- Added visual framework architecture flow diagram
- Created component statistics dashboard (21|14|6|6)
- Built comparison table for SuperClaude vs Standard Claude
- Added 4-week learning timeline with milestones
- Enhanced workflow patterns with step-by-step tables
- Created key insights cards explaining framework philosophy
All documents now feature consistent styling with centered titles,
organized tables, emojis for visual scanning, and improved navigation.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
* 🔥 Remove outdated publishing and release instruction files
Cleaned up repository by removing:
- PUBLISHING.md: Outdated publishing guidelines
- RELEASE_INSTRUCTIONS.md: Old release process documentation
These files are no longer needed as the project has evolved
and the processes have been streamlined or moved elsewhere.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
* 🐛 Fix component validation to check metadata file instead of settings.json
Resolves #291 - Validation errors after V4 upgrade
## Changes
- Fixed validation logic to check .superclaude-metadata.json instead of settings.json
- Standardized all component versions to 4.0.4 across the framework
- Fixed agent validation to check for correct filenames (architect vs specialist/engineer)
- Cleaned up metadata file structure for consistency
## Technical Details
The issue was caused by components registering in .superclaude-metadata.json but
validation checking settings.json for component registration. This mismatch caused
false validation errors even though components were properly installed.
## Testing
All components now validate successfully with the corrected logic.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
* 🔖 Bump version to 4.0.6 across entire project
## Summary
Comprehensive version update from 4.0.4 to 4.0.6 with validation fixes
## Changes
- Updated VERSION file, pyproject.toml, and package.json
- Updated all Python __version__ declarations (8 occurrences)
- Updated all component metadata versions (6 components, 25+ occurrences)
- Updated documentation and README version badges (11 files)
- Fixed package.json inconsistency (was 4.0.5)
- Updated legacy backup.py version reference (was 3.0.0)
- Added CHANGELOG entry for version 4.0.6
## Files Modified (26 total)
- Core: VERSION, pyproject.toml, package.json
- Python: SuperClaude/__init__.py, __main__.py, setup/__init__.py, cli/base.py
- Components: core.py, commands.py, agents.py, mcp.py, mcp_docs.py, modes.py
- Docs: README.md, CONTRIBUTING.md, SECURITY.md, installation.md, quick-start.md
- Config: features.json, backup.py, update.py
- User: ~/.claude/.superclaude-metadata.json
## Verification
All version references now consistently show 4.0.6
Historical references in CHANGELOG preserved as intended
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
* 📝 Update README.md installation instructions
---------
Signed-off-by: NomenAK <39598727+NomenAK@users.noreply.github.com>
Co-authored-by: Claude <noreply@anthropic.com>
2025-08-23 12:08:09 +02:00
|
|
|
self.logger.warning(f"Failed to read version from metadata: {e}")
|
2025-08-14 22:03:34 +02:00
|
|
|
else:
|
Fix component validation and bump version to 4.0.6 (#292)
* ✨ Enhance documentation with advanced markdown formatting
Major improvements to documentation presentation and usability:
README.md:
- Added centered hero section with framework statistics dashboard
- Created visual support section with donation cards
- Enhanced What's New section with feature grid layout
- Reorganized documentation links into categorized table
- Added professional badges and visual separators
installation.md:
- Centered title with platform badges and quick navigation
- Consolidated 4 installation methods into unified table
- Created visual requirement cards (Required vs Optional)
- Added collapsible troubleshooting sections
- Removed 3 duplicate "What's Next" sections
- Enhanced learning journey with progression tables
quick-start.md:
- Added visual framework architecture flow diagram
- Created component statistics dashboard (21|14|6|6)
- Built comparison table for SuperClaude vs Standard Claude
- Added 4-week learning timeline with milestones
- Enhanced workflow patterns with step-by-step tables
- Created key insights cards explaining framework philosophy
All documents now feature consistent styling with centered titles,
organized tables, emojis for visual scanning, and improved navigation.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
* 🔥 Remove outdated publishing and release instruction files
Cleaned up repository by removing:
- PUBLISHING.md: Outdated publishing guidelines
- RELEASE_INSTRUCTIONS.md: Old release process documentation
These files are no longer needed as the project has evolved
and the processes have been streamlined or moved elsewhere.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
* 🐛 Fix component validation to check metadata file instead of settings.json
Resolves #291 - Validation errors after V4 upgrade
## Changes
- Fixed validation logic to check .superclaude-metadata.json instead of settings.json
- Standardized all component versions to 4.0.4 across the framework
- Fixed agent validation to check for correct filenames (architect vs specialist/engineer)
- Cleaned up metadata file structure for consistency
## Technical Details
The issue was caused by components registering in .superclaude-metadata.json but
validation checking settings.json for component registration. This mismatch caused
false validation errors even though components were properly installed.
## Testing
All components now validate successfully with the corrected logic.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
* 🔖 Bump version to 4.0.6 across entire project
## Summary
Comprehensive version update from 4.0.4 to 4.0.6 with validation fixes
## Changes
- Updated VERSION file, pyproject.toml, and package.json
- Updated all Python __version__ declarations (8 occurrences)
- Updated all component metadata versions (6 components, 25+ occurrences)
- Updated documentation and README version badges (11 files)
- Fixed package.json inconsistency (was 4.0.5)
- Updated legacy backup.py version reference (was 3.0.0)
- Added CHANGELOG entry for version 4.0.6
## Files Modified (26 total)
- Core: VERSION, pyproject.toml, package.json
- Python: SuperClaude/__init__.py, __main__.py, setup/__init__.py, cli/base.py
- Components: core.py, commands.py, agents.py, mcp.py, mcp_docs.py, modes.py
- Docs: README.md, CONTRIBUTING.md, SECURITY.md, installation.md, quick-start.md
- Config: features.json, backup.py, update.py
- User: ~/.claude/.superclaude-metadata.json
## Verification
All version references now consistently show 4.0.6
Historical references in CHANGELOG preserved as intended
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
* 📝 Update README.md installation instructions
---------
Signed-off-by: NomenAK <39598727+NomenAK@users.noreply.github.com>
Co-authored-by: Claude <noreply@anthropic.com>
2025-08-23 12:08:09 +02:00
|
|
|
self.logger.debug("Metadata file does not exist")
|
2025-08-14 08:56:04 +05:30
|
|
|
return None
|
|
|
|
|
|
|
|
|
|
def is_installed(self) -> bool:
|
|
|
|
|
"""
|
|
|
|
|
Check if component is installed
|
|
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
True if installed, False otherwise
|
|
|
|
|
"""
|
|
|
|
|
return self.get_installed_version() is not None
|
|
|
|
|
|
|
|
|
|
def validate_installation(self) -> Tuple[bool, List[str]]:
|
|
|
|
|
"""
|
|
|
|
|
Validate that component is correctly installed
|
|
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
Tuple of (success: bool, error_messages: List[str])
|
|
|
|
|
"""
|
|
|
|
|
errors = []
|
|
|
|
|
|
|
|
|
|
# Check if all files exist
|
|
|
|
|
for _, target in self.get_files_to_install():
|
|
|
|
|
if not target.exists():
|
|
|
|
|
errors.append(f"Missing file: {target}")
|
|
|
|
|
|
Fix component validation and bump version to 4.0.6 (#292)
* ✨ Enhance documentation with advanced markdown formatting
Major improvements to documentation presentation and usability:
README.md:
- Added centered hero section with framework statistics dashboard
- Created visual support section with donation cards
- Enhanced What's New section with feature grid layout
- Reorganized documentation links into categorized table
- Added professional badges and visual separators
installation.md:
- Centered title with platform badges and quick navigation
- Consolidated 4 installation methods into unified table
- Created visual requirement cards (Required vs Optional)
- Added collapsible troubleshooting sections
- Removed 3 duplicate "What's Next" sections
- Enhanced learning journey with progression tables
quick-start.md:
- Added visual framework architecture flow diagram
- Created component statistics dashboard (21|14|6|6)
- Built comparison table for SuperClaude vs Standard Claude
- Added 4-week learning timeline with milestones
- Enhanced workflow patterns with step-by-step tables
- Created key insights cards explaining framework philosophy
All documents now feature consistent styling with centered titles,
organized tables, emojis for visual scanning, and improved navigation.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
* 🔥 Remove outdated publishing and release instruction files
Cleaned up repository by removing:
- PUBLISHING.md: Outdated publishing guidelines
- RELEASE_INSTRUCTIONS.md: Old release process documentation
These files are no longer needed as the project has evolved
and the processes have been streamlined or moved elsewhere.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
* 🐛 Fix component validation to check metadata file instead of settings.json
Resolves #291 - Validation errors after V4 upgrade
## Changes
- Fixed validation logic to check .superclaude-metadata.json instead of settings.json
- Standardized all component versions to 4.0.4 across the framework
- Fixed agent validation to check for correct filenames (architect vs specialist/engineer)
- Cleaned up metadata file structure for consistency
## Technical Details
The issue was caused by components registering in .superclaude-metadata.json but
validation checking settings.json for component registration. This mismatch caused
false validation errors even though components were properly installed.
## Testing
All components now validate successfully with the corrected logic.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
* 🔖 Bump version to 4.0.6 across entire project
## Summary
Comprehensive version update from 4.0.4 to 4.0.6 with validation fixes
## Changes
- Updated VERSION file, pyproject.toml, and package.json
- Updated all Python __version__ declarations (8 occurrences)
- Updated all component metadata versions (6 components, 25+ occurrences)
- Updated documentation and README version badges (11 files)
- Fixed package.json inconsistency (was 4.0.5)
- Updated legacy backup.py version reference (was 3.0.0)
- Added CHANGELOG entry for version 4.0.6
## Files Modified (26 total)
- Core: VERSION, pyproject.toml, package.json
- Python: SuperClaude/__init__.py, __main__.py, setup/__init__.py, cli/base.py
- Components: core.py, commands.py, agents.py, mcp.py, mcp_docs.py, modes.py
- Docs: README.md, CONTRIBUTING.md, SECURITY.md, installation.md, quick-start.md
- Config: features.json, backup.py, update.py
- User: ~/.claude/.superclaude-metadata.json
## Verification
All version references now consistently show 4.0.6
Historical references in CHANGELOG preserved as intended
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
* 📝 Update README.md installation instructions
---------
Signed-off-by: NomenAK <39598727+NomenAK@users.noreply.github.com>
Co-authored-by: Claude <noreply@anthropic.com>
2025-08-23 12:08:09 +02:00
|
|
|
# Check version in metadata
|
2025-08-14 08:56:04 +05:30
|
|
|
if not self.get_installed_version():
|
Fix component validation and bump version to 4.0.6 (#292)
* ✨ Enhance documentation with advanced markdown formatting
Major improvements to documentation presentation and usability:
README.md:
- Added centered hero section with framework statistics dashboard
- Created visual support section with donation cards
- Enhanced What's New section with feature grid layout
- Reorganized documentation links into categorized table
- Added professional badges and visual separators
installation.md:
- Centered title with platform badges and quick navigation
- Consolidated 4 installation methods into unified table
- Created visual requirement cards (Required vs Optional)
- Added collapsible troubleshooting sections
- Removed 3 duplicate "What's Next" sections
- Enhanced learning journey with progression tables
quick-start.md:
- Added visual framework architecture flow diagram
- Created component statistics dashboard (21|14|6|6)
- Built comparison table for SuperClaude vs Standard Claude
- Added 4-week learning timeline with milestones
- Enhanced workflow patterns with step-by-step tables
- Created key insights cards explaining framework philosophy
All documents now feature consistent styling with centered titles,
organized tables, emojis for visual scanning, and improved navigation.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
* 🔥 Remove outdated publishing and release instruction files
Cleaned up repository by removing:
- PUBLISHING.md: Outdated publishing guidelines
- RELEASE_INSTRUCTIONS.md: Old release process documentation
These files are no longer needed as the project has evolved
and the processes have been streamlined or moved elsewhere.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
* 🐛 Fix component validation to check metadata file instead of settings.json
Resolves #291 - Validation errors after V4 upgrade
## Changes
- Fixed validation logic to check .superclaude-metadata.json instead of settings.json
- Standardized all component versions to 4.0.4 across the framework
- Fixed agent validation to check for correct filenames (architect vs specialist/engineer)
- Cleaned up metadata file structure for consistency
## Technical Details
The issue was caused by components registering in .superclaude-metadata.json but
validation checking settings.json for component registration. This mismatch caused
false validation errors even though components were properly installed.
## Testing
All components now validate successfully with the corrected logic.
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
* 🔖 Bump version to 4.0.6 across entire project
## Summary
Comprehensive version update from 4.0.4 to 4.0.6 with validation fixes
## Changes
- Updated VERSION file, pyproject.toml, and package.json
- Updated all Python __version__ declarations (8 occurrences)
- Updated all component metadata versions (6 components, 25+ occurrences)
- Updated documentation and README version badges (11 files)
- Fixed package.json inconsistency (was 4.0.5)
- Updated legacy backup.py version reference (was 3.0.0)
- Added CHANGELOG entry for version 4.0.6
## Files Modified (26 total)
- Core: VERSION, pyproject.toml, package.json
- Python: SuperClaude/__init__.py, __main__.py, setup/__init__.py, cli/base.py
- Components: core.py, commands.py, agents.py, mcp.py, mcp_docs.py, modes.py
- Docs: README.md, CONTRIBUTING.md, SECURITY.md, installation.md, quick-start.md
- Config: features.json, backup.py, update.py
- User: ~/.claude/.superclaude-metadata.json
## Verification
All version references now consistently show 4.0.6
Historical references in CHANGELOG preserved as intended
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
* 📝 Update README.md installation instructions
---------
Signed-off-by: NomenAK <39598727+NomenAK@users.noreply.github.com>
Co-authored-by: Claude <noreply@anthropic.com>
2025-08-23 12:08:09 +02:00
|
|
|
errors.append("Component not registered in .superclaude-metadata.json")
|
2025-08-14 08:56:04 +05:30
|
|
|
|
|
|
|
|
return len(errors) == 0, errors
|
|
|
|
|
|
|
|
|
|
def get_size_estimate(self) -> int:
|
|
|
|
|
"""
|
|
|
|
|
Estimate installed size in bytes
|
|
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
Estimated size in bytes
|
|
|
|
|
"""
|
|
|
|
|
total_size = 0
|
|
|
|
|
for source, _ in self.get_files_to_install():
|
|
|
|
|
if source.exists():
|
|
|
|
|
if source.is_file():
|
|
|
|
|
total_size += source.stat().st_size
|
|
|
|
|
elif source.is_dir():
|
|
|
|
|
total_size += sum(f.stat().st_size for f in source.rglob('*') if f.is_file())
|
|
|
|
|
return total_size
|
|
|
|
|
|
|
|
|
|
def _discover_component_files(self) -> List[str]:
|
|
|
|
|
"""
|
|
|
|
|
Dynamically discover framework .md files in the Core directory
|
|
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
List of framework filenames (e.g., ['CLAUDE.md', 'COMMANDS.md', ...])
|
|
|
|
|
"""
|
|
|
|
|
source_dir = self._get_source_dir()
|
|
|
|
|
|
|
|
|
|
if not source_dir:
|
|
|
|
|
return []
|
|
|
|
|
|
|
|
|
|
return self._discover_files_in_directory(
|
|
|
|
|
source_dir,
|
|
|
|
|
extension='.md',
|
|
|
|
|
exclude_patterns=['README.md', 'CHANGELOG.md', 'LICENSE.md']
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
def _discover_files_in_directory(self, directory: Path, extension: str = '.md',
|
|
|
|
|
exclude_patterns: Optional[List[str]] = None) -> List[str]:
|
|
|
|
|
"""
|
|
|
|
|
Shared utility for discovering files in a directory
|
|
|
|
|
|
|
|
|
|
Args:
|
|
|
|
|
directory: Directory to scan
|
|
|
|
|
extension: File extension to look for (default: '.md')
|
|
|
|
|
exclude_patterns: List of filename patterns to exclude
|
|
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
List of filenames found in the directory
|
|
|
|
|
"""
|
|
|
|
|
if exclude_patterns is None:
|
|
|
|
|
exclude_patterns = []
|
|
|
|
|
|
|
|
|
|
try:
|
|
|
|
|
if not directory.exists():
|
|
|
|
|
self.logger.warning(f"Source directory not found: {directory}")
|
|
|
|
|
return []
|
|
|
|
|
|
|
|
|
|
if not directory.is_dir():
|
|
|
|
|
self.logger.warning(f"Source path is not a directory: {directory}")
|
|
|
|
|
return []
|
|
|
|
|
|
|
|
|
|
# Discover files with the specified extension
|
|
|
|
|
files = []
|
|
|
|
|
for file_path in directory.iterdir():
|
|
|
|
|
if (file_path.is_file() and
|
|
|
|
|
file_path.suffix.lower() == extension.lower() and
|
|
|
|
|
file_path.name not in exclude_patterns):
|
|
|
|
|
files.append(file_path.name)
|
|
|
|
|
|
|
|
|
|
# Sort for consistent ordering
|
|
|
|
|
files.sort()
|
|
|
|
|
|
|
|
|
|
self.logger.debug(f"Discovered {len(files)} {extension} files in {directory}")
|
|
|
|
|
if files:
|
|
|
|
|
self.logger.debug(f"Files found: {files}")
|
|
|
|
|
|
|
|
|
|
return files
|
|
|
|
|
|
|
|
|
|
except PermissionError:
|
|
|
|
|
self.logger.error(f"Permission denied accessing directory: {directory}")
|
|
|
|
|
return []
|
|
|
|
|
except Exception as e:
|
|
|
|
|
self.logger.error(f"Error discovering files in {directory}: {e}")
|
|
|
|
|
return []
|
|
|
|
|
|
|
|
|
|
def __str__(self) -> str:
|
|
|
|
|
"""String representation of component"""
|
|
|
|
|
metadata = self.get_metadata()
|
|
|
|
|
return f"{metadata['name']} v{metadata['version']}"
|
|
|
|
|
|
|
|
|
|
def __repr__(self) -> str:
|
|
|
|
|
"""Developer representation of component"""
|
|
|
|
|
return f"<{self.__class__.__name__}({self.get_metadata()['name']})>"
|
2025-08-14 22:03:34 +02:00
|
|
|
|
|
|
|
|
def _resolve_path_safely(self, path: Path) -> Path:
|
|
|
|
|
"""
|
|
|
|
|
Safely resolve path with proper error handling and security validation
|
|
|
|
|
|
|
|
|
|
Args:
|
|
|
|
|
path: Path to resolve
|
|
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
Resolved path
|
|
|
|
|
|
|
|
|
|
Raises:
|
|
|
|
|
ValueError: If path resolution fails or path is unsafe
|
|
|
|
|
"""
|
|
|
|
|
try:
|
|
|
|
|
# Expand user directory (~) and resolve path
|
|
|
|
|
resolved_path = path.expanduser().resolve()
|
|
|
|
|
|
|
|
|
|
# Basic security validation - only enforce for production directories
|
|
|
|
|
path_str = str(resolved_path).lower()
|
|
|
|
|
|
|
|
|
|
# Check for most dangerous system patterns (but allow /tmp for testing)
|
|
|
|
|
dangerous_patterns = [
|
|
|
|
|
'/etc/', '/bin/', '/sbin/', '/usr/bin/', '/usr/sbin/',
|
|
|
|
|
'/var/log/', '/var/lib/', '/dev/', '/proc/', '/sys/',
|
|
|
|
|
'c:\\windows\\', 'c:\\program files\\'
|
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
# Allow temporary directories for testing
|
|
|
|
|
if path_str.startswith('/tmp/') or 'temp' in path_str:
|
|
|
|
|
self.logger.debug(f"Allowing temporary directory: {resolved_path}")
|
|
|
|
|
return resolved_path
|
|
|
|
|
|
|
|
|
|
for pattern in dangerous_patterns:
|
|
|
|
|
if path_str.startswith(pattern):
|
|
|
|
|
raise ValueError(f"Cannot use system directory: {resolved_path}")
|
|
|
|
|
|
|
|
|
|
return resolved_path
|
|
|
|
|
|
|
|
|
|
except Exception as e:
|
|
|
|
|
self.logger.error(f"Failed to resolve path {path}: {e}")
|
|
|
|
|
raise ValueError(f"Invalid path: {path}")
|
|
|
|
|
|
|
|
|
|
def _resolve_source_path_safely(self, path: Path) -> Optional[Path]:
|
|
|
|
|
"""
|
|
|
|
|
Safely resolve source path with existence check
|
|
|
|
|
|
|
|
|
|
Args:
|
|
|
|
|
path: Source path to resolve
|
|
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
Resolved path if valid and exists, None otherwise
|
|
|
|
|
"""
|
|
|
|
|
try:
|
|
|
|
|
resolved_path = self._resolve_path_safely(path)
|
|
|
|
|
return resolved_path if resolved_path.exists() else None
|
|
|
|
|
except ValueError:
|
|
|
|
|
return None
|