mirror of
https://github.com/SuperClaude-Org/SuperClaude_Framework.git
synced 2025-12-29 16:16:08 +00:00
fix: Address invalid JSON field in installation suite
- Separate SuperClaude metadata from Claude Code settings.json - Create .superclaude-metadata.json for framework-specific data - Fix JSON validation issues with settings management - Update all components to use proper metadata storage - Maintain compatibility with Claude Code settings format - Add migration support for existing installations 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -97,8 +97,8 @@ class CommandsComponent(Component):
|
||||
|
||||
return files
|
||||
|
||||
def get_settings_modifications(self) -> Dict[str, Any]:
|
||||
"""Get settings modifications"""
|
||||
def get_metadata_modifications(self) -> Dict[str, Any]:
|
||||
"""Get metadata modifications for commands component"""
|
||||
return {
|
||||
"components": {
|
||||
"commands": {
|
||||
@@ -109,6 +109,11 @@ class CommandsComponent(Component):
|
||||
}
|
||||
}
|
||||
|
||||
def get_settings_modifications(self) -> Dict[str, Any]:
|
||||
"""Get settings.json modifications (now only Claude Code compatible settings)"""
|
||||
# Return empty dict as we don't modify Claude Code settings
|
||||
return {}
|
||||
|
||||
def install(self, config: Dict[str, Any]) -> bool:
|
||||
"""Install commands component"""
|
||||
try:
|
||||
@@ -155,13 +160,17 @@ class CommandsComponent(Component):
|
||||
self.logger.error(f"Only {success_count}/{len(files_to_install)} command files copied successfully")
|
||||
return False
|
||||
|
||||
# Update settings.json
|
||||
# Update metadata
|
||||
try:
|
||||
settings_mods = self.get_settings_modifications()
|
||||
self.settings_manager.update_settings(settings_mods)
|
||||
self.logger.info("Updated settings.json with commands component registration")
|
||||
# Add component registration to metadata
|
||||
self.settings_manager.add_component_registration("commands", {
|
||||
"version": "3.0.0",
|
||||
"category": "commands",
|
||||
"files_count": len(self.command_files)
|
||||
})
|
||||
self.logger.info("Updated metadata with commands component registration")
|
||||
except Exception as e:
|
||||
self.logger.error(f"Failed to update settings.json: {e}")
|
||||
self.logger.error(f"Failed to update metadata: {e}")
|
||||
return False
|
||||
|
||||
self.logger.success(f"Commands component installed successfully ({success_count} command files)")
|
||||
@@ -198,13 +207,13 @@ class CommandsComponent(Component):
|
||||
except Exception as e:
|
||||
self.logger.warning(f"Could not remove commands directory: {e}")
|
||||
|
||||
# Update settings.json to remove commands component
|
||||
# Update metadata to remove commands component
|
||||
try:
|
||||
if self.settings_manager.is_component_installed("commands"):
|
||||
self.settings_manager.remove_component_registration("commands")
|
||||
self.logger.info("Removed commands component from settings.json")
|
||||
self.logger.info("Removed commands component from metadata")
|
||||
except Exception as e:
|
||||
self.logger.warning(f"Could not update settings.json: {e}")
|
||||
self.logger.warning(f"Could not update metadata: {e}")
|
||||
|
||||
self.logger.success(f"Commands component uninstalled ({removed_count} files removed)")
|
||||
return True
|
||||
@@ -292,9 +301,9 @@ class CommandsComponent(Component):
|
||||
elif not file_path.is_file():
|
||||
errors.append(f"Command file is not a regular file: {filename}")
|
||||
|
||||
# Check settings.json registration
|
||||
# Check metadata registration
|
||||
if not self.settings_manager.is_component_installed("commands"):
|
||||
errors.append("Commands component not registered in settings.json")
|
||||
errors.append("Commands component not registered in metadata")
|
||||
else:
|
||||
# Check version matches
|
||||
installed_version = self.settings_manager.get_component_version("commands")
|
||||
|
||||
@@ -92,8 +92,8 @@ class CoreComponent(Component):
|
||||
|
||||
return files
|
||||
|
||||
def get_settings_modifications(self) -> Dict[str, Any]:
|
||||
"""Get settings.json modifications"""
|
||||
def get_metadata_modifications(self) -> Dict[str, Any]:
|
||||
"""Get metadata modifications for SuperClaude"""
|
||||
return {
|
||||
"framework": {
|
||||
"version": "3.0.0",
|
||||
@@ -110,6 +110,11 @@ class CoreComponent(Component):
|
||||
}
|
||||
}
|
||||
|
||||
def get_settings_modifications(self) -> Dict[str, Any]:
|
||||
"""Get settings.json modifications (now only Claude Code compatible settings)"""
|
||||
# Return empty dict as we don't modify Claude Code settings
|
||||
return {}
|
||||
|
||||
def install(self, config: Dict[str, Any]) -> bool:
|
||||
"""Install core component"""
|
||||
try:
|
||||
@@ -155,13 +160,20 @@ class CoreComponent(Component):
|
||||
self.logger.error(f"Only {success_count}/{len(files_to_install)} files copied successfully")
|
||||
return False
|
||||
|
||||
# Create or update settings.json
|
||||
# Create or update metadata
|
||||
try:
|
||||
settings_mods = self.get_settings_modifications()
|
||||
self.settings_manager.update_settings(settings_mods)
|
||||
self.logger.info("Updated settings.json with framework configuration")
|
||||
metadata_mods = self.get_metadata_modifications()
|
||||
# Update metadata directly
|
||||
existing_metadata = self.settings_manager.load_metadata()
|
||||
merged_metadata = self.settings_manager._deep_merge(existing_metadata, metadata_mods)
|
||||
self.settings_manager.save_metadata(merged_metadata)
|
||||
self.logger.info("Updated metadata with framework configuration")
|
||||
|
||||
# Migrate any existing SuperClaude data from settings.json
|
||||
if self.settings_manager.migrate_superclaude_data():
|
||||
self.logger.info("Migrated existing SuperClaude data from settings.json")
|
||||
except Exception as e:
|
||||
self.logger.error(f"Failed to update settings.json: {e}")
|
||||
self.logger.error(f"Failed to update metadata: {e}")
|
||||
return False
|
||||
|
||||
# Create additional directories for other components
|
||||
@@ -193,13 +205,13 @@ class CoreComponent(Component):
|
||||
else:
|
||||
self.logger.warning(f"Could not remove {filename}")
|
||||
|
||||
# Update settings.json to remove core component
|
||||
# Update metadata to remove core component
|
||||
try:
|
||||
if self.settings_manager.is_component_installed("core"):
|
||||
self.settings_manager.remove_component_registration("core")
|
||||
self.logger.info("Removed core component from settings.json")
|
||||
self.logger.info("Removed core component from metadata")
|
||||
except Exception as e:
|
||||
self.logger.warning(f"Could not update settings.json: {e}")
|
||||
self.logger.warning(f"Could not update metadata: {e}")
|
||||
|
||||
self.logger.success(f"Core component uninstalled ({removed_count} files removed)")
|
||||
return True
|
||||
@@ -278,9 +290,9 @@ class CoreComponent(Component):
|
||||
elif not file_path.is_file():
|
||||
errors.append(f"Framework file is not a regular file: {filename}")
|
||||
|
||||
# Check settings.json registration
|
||||
# Check metadata registration
|
||||
if not self.settings_manager.is_component_installed("core"):
|
||||
errors.append("Core component not registered in settings.json")
|
||||
errors.append("Core component not registered in metadata")
|
||||
else:
|
||||
# Check version matches
|
||||
installed_version = self.settings_manager.get_component_version("core")
|
||||
@@ -288,18 +300,18 @@ class CoreComponent(Component):
|
||||
if installed_version != expected_version:
|
||||
errors.append(f"Version mismatch: installed {installed_version}, expected {expected_version}")
|
||||
|
||||
# Check settings.json structure
|
||||
# Check metadata structure
|
||||
try:
|
||||
framework_config = self.settings_manager.get_setting("framework")
|
||||
framework_config = self.settings_manager.get_metadata_setting("framework")
|
||||
if not framework_config:
|
||||
errors.append("Missing framework configuration in settings.json")
|
||||
errors.append("Missing framework configuration in metadata")
|
||||
else:
|
||||
required_keys = ["version", "name", "description"]
|
||||
for key in required_keys:
|
||||
if key not in framework_config:
|
||||
errors.append(f"Missing framework.{key} in settings.json")
|
||||
errors.append(f"Missing framework.{key} in metadata")
|
||||
except Exception as e:
|
||||
errors.append(f"Could not validate settings.json: {e}")
|
||||
errors.append(f"Could not validate metadata: {e}")
|
||||
|
||||
return len(errors) == 0, errors
|
||||
|
||||
|
||||
@@ -131,8 +131,8 @@ class MCPComponent(Component):
|
||||
"""Get files to install (none for MCP component)"""
|
||||
return []
|
||||
|
||||
def get_settings_modifications(self) -> Dict[str, Any]:
|
||||
"""Get settings modifications"""
|
||||
def get_metadata_modifications(self) -> Dict[str, Any]:
|
||||
"""Get metadata modifications for MCP component"""
|
||||
return {
|
||||
"components": {
|
||||
"mcp": {
|
||||
@@ -148,6 +148,11 @@ class MCPComponent(Component):
|
||||
}
|
||||
}
|
||||
|
||||
def get_settings_modifications(self) -> Dict[str, Any]:
|
||||
"""Get settings.json modifications (now only Claude Code compatible settings)"""
|
||||
# Return empty dict as we don't modify Claude Code settings
|
||||
return {}
|
||||
|
||||
def _check_mcp_server_installed(self, server_name: str) -> bool:
|
||||
"""Check if MCP server is already installed"""
|
||||
try:
|
||||
@@ -292,13 +297,27 @@ class MCPComponent(Component):
|
||||
self.logger.error(f"Required MCP server {server_name} failed to install")
|
||||
return False
|
||||
|
||||
# Update settings.json
|
||||
# Update metadata
|
||||
try:
|
||||
settings_mods = self.get_settings_modifications()
|
||||
self.settings_manager.update_settings(settings_mods)
|
||||
self.logger.info("Updated settings.json with MCP component registration")
|
||||
# Add component registration to metadata
|
||||
self.settings_manager.add_component_registration("mcp", {
|
||||
"version": "3.0.0",
|
||||
"category": "integration",
|
||||
"servers_count": len(self.mcp_servers)
|
||||
})
|
||||
|
||||
# Add MCP configuration to metadata
|
||||
metadata = self.settings_manager.load_metadata()
|
||||
metadata["mcp"] = {
|
||||
"enabled": True,
|
||||
"servers": list(self.mcp_servers.keys()),
|
||||
"auto_update": False
|
||||
}
|
||||
self.settings_manager.save_metadata(metadata)
|
||||
|
||||
self.logger.info("Updated metadata with MCP component registration")
|
||||
except Exception as e:
|
||||
self.logger.error(f"Failed to update settings.json: {e}")
|
||||
self.logger.error(f"Failed to update metadata: {e}")
|
||||
return False
|
||||
|
||||
# Verify installation
|
||||
@@ -347,13 +366,18 @@ class MCPComponent(Component):
|
||||
if self._uninstall_mcp_server(server_name):
|
||||
uninstalled_count += 1
|
||||
|
||||
# Update settings.json to remove MCP component
|
||||
# Update metadata to remove MCP component
|
||||
try:
|
||||
if self.settings_manager.is_component_installed("mcp"):
|
||||
self.settings_manager.remove_component_registration("mcp")
|
||||
self.logger.info("Removed MCP component from settings.json")
|
||||
# Also remove MCP configuration from metadata
|
||||
metadata = self.settings_manager.load_metadata()
|
||||
if "mcp" in metadata:
|
||||
del metadata["mcp"]
|
||||
self.settings_manager.save_metadata(metadata)
|
||||
self.logger.info("Removed MCP component from metadata")
|
||||
except Exception as e:
|
||||
self.logger.warning(f"Could not update settings.json: {e}")
|
||||
self.logger.warning(f"Could not update metadata: {e}")
|
||||
|
||||
self.logger.success(f"MCP component uninstalled ({uninstalled_count} servers removed)")
|
||||
return True
|
||||
@@ -401,12 +425,18 @@ class MCPComponent(Component):
|
||||
self.logger.error(f"Error updating MCP server {server_name}: {e}")
|
||||
failed_servers.append(server_name)
|
||||
|
||||
# Update settings
|
||||
# Update metadata
|
||||
try:
|
||||
settings_mods = self.get_settings_modifications()
|
||||
self.settings_manager.update_settings(settings_mods)
|
||||
# Update component version in metadata
|
||||
metadata = self.settings_manager.load_metadata()
|
||||
if "components" in metadata and "mcp" in metadata["components"]:
|
||||
metadata["components"]["mcp"]["version"] = target_version
|
||||
metadata["components"]["mcp"]["servers_count"] = len(self.mcp_servers)
|
||||
if "mcp" in metadata:
|
||||
metadata["mcp"]["servers"] = list(self.mcp_servers.keys())
|
||||
self.settings_manager.save_metadata(metadata)
|
||||
except Exception as e:
|
||||
self.logger.warning(f"Could not update settings.json: {e}")
|
||||
self.logger.warning(f"Could not update metadata: {e}")
|
||||
|
||||
if failed_servers:
|
||||
self.logger.warning(f"Some MCP servers failed to update: {failed_servers}")
|
||||
@@ -423,9 +453,9 @@ class MCPComponent(Component):
|
||||
"""Validate MCP component installation"""
|
||||
errors = []
|
||||
|
||||
# Check settings.json registration
|
||||
# Check metadata registration
|
||||
if not self.settings_manager.is_component_installed("mcp"):
|
||||
errors.append("MCP component not registered in settings.json")
|
||||
errors.append("MCP component not registered in metadata")
|
||||
return False, errors
|
||||
|
||||
# Check version matches
|
||||
|
||||
Reference in New Issue
Block a user