claude-mpm 4.13.2__py3-none-any.whl → 4.18.2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- claude_mpm/VERSION +1 -1
- claude_mpm/agents/BASE_ENGINEER.md +286 -0
- claude_mpm/agents/BASE_PM.md +48 -17
- claude_mpm/agents/OUTPUT_STYLE.md +329 -11
- claude_mpm/agents/PM_INSTRUCTIONS.md +227 -8
- claude_mpm/agents/agent_loader.py +17 -5
- claude_mpm/agents/frontmatter_validator.py +284 -253
- claude_mpm/agents/templates/agentic-coder-optimizer.json +9 -2
- claude_mpm/agents/templates/api_qa.json +7 -1
- claude_mpm/agents/templates/clerk-ops.json +8 -1
- claude_mpm/agents/templates/code_analyzer.json +4 -1
- claude_mpm/agents/templates/dart_engineer.json +11 -1
- claude_mpm/agents/templates/data_engineer.json +11 -1
- claude_mpm/agents/templates/documentation.json +6 -1
- claude_mpm/agents/templates/engineer.json +18 -1
- claude_mpm/agents/templates/gcp_ops_agent.json +8 -1
- claude_mpm/agents/templates/golang_engineer.json +11 -1
- claude_mpm/agents/templates/java_engineer.json +12 -2
- claude_mpm/agents/templates/local_ops_agent.json +1217 -6
- claude_mpm/agents/templates/nextjs_engineer.json +11 -1
- claude_mpm/agents/templates/ops.json +8 -1
- claude_mpm/agents/templates/php-engineer.json +11 -1
- claude_mpm/agents/templates/project_organizer.json +10 -3
- claude_mpm/agents/templates/prompt-engineer.json +5 -1
- claude_mpm/agents/templates/python_engineer.json +11 -1
- claude_mpm/agents/templates/qa.json +7 -1
- claude_mpm/agents/templates/react_engineer.json +11 -1
- claude_mpm/agents/templates/refactoring_engineer.json +8 -1
- claude_mpm/agents/templates/research.json +4 -1
- claude_mpm/agents/templates/ruby-engineer.json +11 -1
- claude_mpm/agents/templates/rust_engineer.json +11 -1
- claude_mpm/agents/templates/security.json +6 -1
- claude_mpm/agents/templates/svelte-engineer.json +225 -0
- claude_mpm/agents/templates/ticketing.json +6 -1
- claude_mpm/agents/templates/typescript_engineer.json +11 -1
- claude_mpm/agents/templates/vercel_ops_agent.json +8 -1
- claude_mpm/agents/templates/version_control.json +8 -1
- claude_mpm/agents/templates/web_qa.json +7 -1
- claude_mpm/agents/templates/web_ui.json +11 -1
- claude_mpm/cli/__init__.py +34 -706
- claude_mpm/cli/commands/agent_manager.py +25 -12
- claude_mpm/cli/commands/agent_state_manager.py +186 -0
- claude_mpm/cli/commands/agents.py +204 -148
- claude_mpm/cli/commands/aggregate.py +7 -3
- claude_mpm/cli/commands/analyze.py +9 -4
- claude_mpm/cli/commands/analyze_code.py +7 -2
- claude_mpm/cli/commands/auto_configure.py +7 -9
- claude_mpm/cli/commands/config.py +47 -13
- claude_mpm/cli/commands/configure.py +294 -1788
- claude_mpm/cli/commands/configure_agent_display.py +261 -0
- claude_mpm/cli/commands/configure_behavior_manager.py +204 -0
- claude_mpm/cli/commands/configure_hook_manager.py +225 -0
- claude_mpm/cli/commands/configure_models.py +18 -0
- claude_mpm/cli/commands/configure_navigation.py +167 -0
- claude_mpm/cli/commands/configure_paths.py +104 -0
- claude_mpm/cli/commands/configure_persistence.py +254 -0
- claude_mpm/cli/commands/configure_startup_manager.py +646 -0
- claude_mpm/cli/commands/configure_template_editor.py +497 -0
- claude_mpm/cli/commands/configure_validators.py +73 -0
- claude_mpm/cli/commands/local_deploy.py +537 -0
- claude_mpm/cli/commands/memory.py +54 -20
- claude_mpm/cli/commands/mpm_init.py +39 -25
- claude_mpm/cli/commands/mpm_init_handler.py +8 -3
- claude_mpm/cli/executor.py +202 -0
- claude_mpm/cli/helpers.py +105 -0
- claude_mpm/cli/interactive/__init__.py +3 -0
- claude_mpm/cli/interactive/skills_wizard.py +491 -0
- claude_mpm/cli/parsers/__init__.py +7 -1
- claude_mpm/cli/parsers/base_parser.py +98 -3
- claude_mpm/cli/parsers/local_deploy_parser.py +227 -0
- claude_mpm/cli/shared/output_formatters.py +28 -19
- claude_mpm/cli/startup.py +481 -0
- claude_mpm/cli/utils.py +52 -1
- claude_mpm/commands/mpm-help.md +3 -0
- claude_mpm/commands/mpm-version.md +113 -0
- claude_mpm/commands/mpm.md +1 -0
- claude_mpm/config/agent_config.py +2 -2
- claude_mpm/config/model_config.py +428 -0
- claude_mpm/core/base_service.py +13 -12
- claude_mpm/core/enums.py +452 -0
- claude_mpm/core/factories.py +1 -1
- claude_mpm/core/instruction_reinforcement_hook.py +2 -1
- claude_mpm/core/interactive_session.py +9 -3
- claude_mpm/core/logging_config.py +6 -2
- claude_mpm/core/oneshot_session.py +8 -4
- claude_mpm/core/optimized_agent_loader.py +3 -3
- claude_mpm/core/output_style_manager.py +12 -192
- claude_mpm/core/service_registry.py +5 -1
- claude_mpm/core/types.py +2 -9
- claude_mpm/core/typing_utils.py +7 -6
- claude_mpm/dashboard/static/js/dashboard.js +0 -14
- claude_mpm/dashboard/templates/index.html +3 -41
- claude_mpm/hooks/claude_hooks/response_tracking.py +35 -1
- claude_mpm/hooks/instruction_reinforcement.py +7 -2
- claude_mpm/models/resume_log.py +340 -0
- claude_mpm/services/agents/auto_config_manager.py +10 -11
- claude_mpm/services/agents/deployment/agent_configuration_manager.py +1 -1
- claude_mpm/services/agents/deployment/agent_record_service.py +1 -1
- claude_mpm/services/agents/deployment/agent_validator.py +17 -1
- claude_mpm/services/agents/deployment/async_agent_deployment.py +1 -1
- claude_mpm/services/agents/deployment/interface_adapter.py +3 -2
- claude_mpm/services/agents/deployment/local_template_deployment.py +1 -1
- claude_mpm/services/agents/deployment/pipeline/steps/agent_processing_step.py +7 -6
- claude_mpm/services/agents/deployment/pipeline/steps/base_step.py +7 -16
- claude_mpm/services/agents/deployment/pipeline/steps/configuration_step.py +4 -3
- claude_mpm/services/agents/deployment/pipeline/steps/target_directory_step.py +5 -3
- claude_mpm/services/agents/deployment/pipeline/steps/validation_step.py +6 -5
- claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +9 -6
- claude_mpm/services/agents/deployment/validation/__init__.py +3 -1
- claude_mpm/services/agents/deployment/validation/validation_result.py +1 -9
- claude_mpm/services/agents/local_template_manager.py +1 -1
- claude_mpm/services/agents/memory/agent_memory_manager.py +5 -2
- claude_mpm/services/agents/registry/modification_tracker.py +5 -2
- claude_mpm/services/command_handler_service.py +11 -5
- claude_mpm/services/core/interfaces/__init__.py +74 -2
- claude_mpm/services/core/interfaces/health.py +172 -0
- claude_mpm/services/core/interfaces/model.py +281 -0
- claude_mpm/services/core/interfaces/process.py +372 -0
- claude_mpm/services/core/interfaces/restart.py +307 -0
- claude_mpm/services/core/interfaces/stability.py +260 -0
- claude_mpm/services/core/models/__init__.py +33 -0
- claude_mpm/services/core/models/agent_config.py +12 -28
- claude_mpm/services/core/models/health.py +162 -0
- claude_mpm/services/core/models/process.py +235 -0
- claude_mpm/services/core/models/restart.py +302 -0
- claude_mpm/services/core/models/stability.py +264 -0
- claude_mpm/services/core/path_resolver.py +23 -7
- claude_mpm/services/diagnostics/__init__.py +2 -2
- claude_mpm/services/diagnostics/checks/agent_check.py +25 -24
- claude_mpm/services/diagnostics/checks/claude_code_check.py +24 -23
- claude_mpm/services/diagnostics/checks/common_issues_check.py +25 -24
- claude_mpm/services/diagnostics/checks/configuration_check.py +24 -23
- claude_mpm/services/diagnostics/checks/filesystem_check.py +18 -17
- claude_mpm/services/diagnostics/checks/installation_check.py +30 -29
- claude_mpm/services/diagnostics/checks/instructions_check.py +20 -19
- claude_mpm/services/diagnostics/checks/mcp_check.py +50 -36
- claude_mpm/services/diagnostics/checks/mcp_services_check.py +36 -31
- claude_mpm/services/diagnostics/checks/monitor_check.py +23 -22
- claude_mpm/services/diagnostics/checks/startup_log_check.py +9 -8
- claude_mpm/services/diagnostics/diagnostic_runner.py +6 -5
- claude_mpm/services/diagnostics/doctor_reporter.py +28 -25
- claude_mpm/services/diagnostics/models.py +19 -24
- claude_mpm/services/infrastructure/monitoring/__init__.py +1 -1
- claude_mpm/services/infrastructure/monitoring/aggregator.py +12 -12
- claude_mpm/services/infrastructure/monitoring/base.py +5 -13
- claude_mpm/services/infrastructure/monitoring/network.py +7 -6
- claude_mpm/services/infrastructure/monitoring/process.py +13 -12
- claude_mpm/services/infrastructure/monitoring/resources.py +7 -6
- claude_mpm/services/infrastructure/monitoring/service.py +16 -15
- claude_mpm/services/infrastructure/resume_log_generator.py +439 -0
- claude_mpm/services/local_ops/__init__.py +163 -0
- claude_mpm/services/local_ops/crash_detector.py +257 -0
- claude_mpm/services/local_ops/health_checks/__init__.py +28 -0
- claude_mpm/services/local_ops/health_checks/http_check.py +224 -0
- claude_mpm/services/local_ops/health_checks/process_check.py +236 -0
- claude_mpm/services/local_ops/health_checks/resource_check.py +255 -0
- claude_mpm/services/local_ops/health_manager.py +430 -0
- claude_mpm/services/local_ops/log_monitor.py +396 -0
- claude_mpm/services/local_ops/memory_leak_detector.py +294 -0
- claude_mpm/services/local_ops/process_manager.py +595 -0
- claude_mpm/services/local_ops/resource_monitor.py +331 -0
- claude_mpm/services/local_ops/restart_manager.py +401 -0
- claude_mpm/services/local_ops/restart_policy.py +387 -0
- claude_mpm/services/local_ops/state_manager.py +372 -0
- claude_mpm/services/local_ops/unified_manager.py +600 -0
- claude_mpm/services/mcp_config_manager.py +9 -4
- claude_mpm/services/mcp_gateway/core/__init__.py +1 -2
- claude_mpm/services/mcp_gateway/core/base.py +18 -31
- claude_mpm/services/mcp_gateway/tools/external_mcp_services.py +71 -24
- claude_mpm/services/mcp_gateway/tools/health_check_tool.py +30 -28
- claude_mpm/services/memory_hook_service.py +4 -1
- claude_mpm/services/model/__init__.py +147 -0
- claude_mpm/services/model/base_provider.py +365 -0
- claude_mpm/services/model/claude_provider.py +412 -0
- claude_mpm/services/model/model_router.py +453 -0
- claude_mpm/services/model/ollama_provider.py +415 -0
- claude_mpm/services/monitor/daemon_manager.py +3 -2
- claude_mpm/services/monitor/handlers/dashboard.py +2 -1
- claude_mpm/services/monitor/handlers/hooks.py +2 -1
- claude_mpm/services/monitor/management/lifecycle.py +3 -2
- claude_mpm/services/monitor/server.py +2 -1
- claude_mpm/services/session_management_service.py +3 -2
- claude_mpm/services/session_manager.py +205 -1
- claude_mpm/services/shared/async_service_base.py +16 -27
- claude_mpm/services/shared/lifecycle_service_base.py +1 -14
- claude_mpm/services/socketio/handlers/__init__.py +5 -2
- claude_mpm/services/socketio/handlers/hook.py +13 -2
- claude_mpm/services/socketio/handlers/registry.py +4 -2
- claude_mpm/services/socketio/server/main.py +10 -8
- claude_mpm/services/subprocess_launcher_service.py +14 -5
- claude_mpm/services/unified/analyzer_strategies/code_analyzer.py +8 -7
- claude_mpm/services/unified/analyzer_strategies/dependency_analyzer.py +6 -5
- claude_mpm/services/unified/analyzer_strategies/performance_analyzer.py +8 -7
- claude_mpm/services/unified/analyzer_strategies/security_analyzer.py +7 -6
- claude_mpm/services/unified/analyzer_strategies/structure_analyzer.py +5 -4
- claude_mpm/services/unified/config_strategies/validation_strategy.py +13 -9
- claude_mpm/services/unified/deployment_strategies/cloud_strategies.py +10 -3
- claude_mpm/services/unified/deployment_strategies/local.py +6 -5
- claude_mpm/services/unified/deployment_strategies/utils.py +6 -5
- claude_mpm/services/unified/deployment_strategies/vercel.py +7 -6
- claude_mpm/services/unified/interfaces.py +3 -1
- claude_mpm/services/unified/unified_analyzer.py +14 -10
- claude_mpm/services/unified/unified_config.py +2 -1
- claude_mpm/services/unified/unified_deployment.py +9 -4
- claude_mpm/services/version_service.py +104 -1
- claude_mpm/skills/__init__.py +21 -0
- claude_mpm/skills/bundled/__init__.py +6 -0
- claude_mpm/skills/bundled/api-documentation.md +393 -0
- claude_mpm/skills/bundled/async-testing.md +571 -0
- claude_mpm/skills/bundled/code-review.md +143 -0
- claude_mpm/skills/bundled/database-migration.md +199 -0
- claude_mpm/skills/bundled/docker-containerization.md +194 -0
- claude_mpm/skills/bundled/express-local-dev.md +1429 -0
- claude_mpm/skills/bundled/fastapi-local-dev.md +1199 -0
- claude_mpm/skills/bundled/git-workflow.md +414 -0
- claude_mpm/skills/bundled/imagemagick.md +204 -0
- claude_mpm/skills/bundled/json-data-handling.md +223 -0
- claude_mpm/skills/bundled/nextjs-local-dev.md +807 -0
- claude_mpm/skills/bundled/pdf.md +141 -0
- claude_mpm/skills/bundled/performance-profiling.md +567 -0
- claude_mpm/skills/bundled/refactoring-patterns.md +180 -0
- claude_mpm/skills/bundled/security-scanning.md +327 -0
- claude_mpm/skills/bundled/systematic-debugging.md +473 -0
- claude_mpm/skills/bundled/test-driven-development.md +378 -0
- claude_mpm/skills/bundled/vite-local-dev.md +1061 -0
- claude_mpm/skills/bundled/web-performance-optimization.md +2305 -0
- claude_mpm/skills/bundled/xlsx.md +157 -0
- claude_mpm/skills/registry.py +286 -0
- claude_mpm/skills/skill_manager.py +310 -0
- claude_mpm/tools/code_tree_analyzer.py +177 -141
- claude_mpm/tools/code_tree_events.py +4 -2
- claude_mpm/utils/agent_dependency_loader.py +2 -2
- {claude_mpm-4.13.2.dist-info → claude_mpm-4.18.2.dist-info}/METADATA +117 -8
- {claude_mpm-4.13.2.dist-info → claude_mpm-4.18.2.dist-info}/RECORD +238 -174
- claude_mpm/dashboard/static/css/code-tree.css +0 -1639
- claude_mpm/dashboard/static/js/components/code-tree/tree-breadcrumb.js +0 -353
- claude_mpm/dashboard/static/js/components/code-tree/tree-constants.js +0 -235
- claude_mpm/dashboard/static/js/components/code-tree/tree-search.js +0 -409
- claude_mpm/dashboard/static/js/components/code-tree/tree-utils.js +0 -435
- claude_mpm/dashboard/static/js/components/code-tree.js +0 -5869
- claude_mpm/dashboard/static/js/components/code-viewer.js +0 -1386
- claude_mpm/hooks/claude_hooks/hook_handler_eventbus.py +0 -425
- claude_mpm/hooks/claude_hooks/hook_handler_original.py +0 -1041
- claude_mpm/hooks/claude_hooks/hook_handler_refactored.py +0 -347
- claude_mpm/services/agents/deployment/agent_lifecycle_manager_refactored.py +0 -575
- claude_mpm/services/project/analyzer_refactored.py +0 -450
- {claude_mpm-4.13.2.dist-info → claude_mpm-4.18.2.dist-info}/WHEEL +0 -0
- {claude_mpm-4.13.2.dist-info → claude_mpm-4.18.2.dist-info}/entry_points.txt +0 -0
- {claude_mpm-4.13.2.dist-info → claude_mpm-4.18.2.dist-info}/licenses/LICENSE +0 -0
- {claude_mpm-4.13.2.dist-info → claude_mpm-4.18.2.dist-info}/top_level.txt +0 -0
|
@@ -9,7 +9,8 @@ import json
|
|
|
9
9
|
import subprocess
|
|
10
10
|
from pathlib import Path
|
|
11
11
|
|
|
12
|
-
from
|
|
12
|
+
from ....core.enums import OperationResult, ValidationSeverity
|
|
13
|
+
from ..models import DiagnosticResult
|
|
13
14
|
from .base_check import BaseDiagnosticCheck
|
|
14
15
|
|
|
15
16
|
|
|
@@ -33,9 +34,9 @@ class ClaudeCodeCheck(BaseDiagnosticCheck):
|
|
|
33
34
|
# Check if Claude Code CLI is installed
|
|
34
35
|
install_result = self._check_installation()
|
|
35
36
|
sub_results.append(install_result)
|
|
36
|
-
details["installed"] = install_result.status ==
|
|
37
|
+
details["installed"] = install_result.status == OperationResult.SUCCESS
|
|
37
38
|
|
|
38
|
-
if install_result.status ==
|
|
39
|
+
if install_result.status == OperationResult.SUCCESS:
|
|
39
40
|
# Check version compatibility
|
|
40
41
|
version_result = self._check_version()
|
|
41
42
|
sub_results.append(version_result)
|
|
@@ -49,17 +50,17 @@ class ClaudeCodeCheck(BaseDiagnosticCheck):
|
|
|
49
50
|
# Check MCP integration
|
|
50
51
|
mcp_result = self._check_mcp_integration()
|
|
51
52
|
sub_results.append(mcp_result)
|
|
52
|
-
details["mcp_configured"] = mcp_result.status ==
|
|
53
|
+
details["mcp_configured"] = mcp_result.status == OperationResult.SUCCESS
|
|
53
54
|
|
|
54
55
|
# Determine overall status
|
|
55
|
-
if any(r.status ==
|
|
56
|
-
status =
|
|
56
|
+
if any(r.status == ValidationSeverity.ERROR for r in sub_results):
|
|
57
|
+
status = ValidationSeverity.ERROR
|
|
57
58
|
message = "Claude Code CLI has critical issues"
|
|
58
|
-
elif any(r.status ==
|
|
59
|
-
status =
|
|
59
|
+
elif any(r.status == ValidationSeverity.WARNING for r in sub_results):
|
|
60
|
+
status = ValidationSeverity.WARNING
|
|
60
61
|
message = "Claude Code CLI needs configuration"
|
|
61
62
|
else:
|
|
62
|
-
status =
|
|
63
|
+
status = OperationResult.SUCCESS
|
|
63
64
|
message = "Claude Code CLI properly configured"
|
|
64
65
|
|
|
65
66
|
return DiagnosticResult(
|
|
@@ -73,7 +74,7 @@ class ClaudeCodeCheck(BaseDiagnosticCheck):
|
|
|
73
74
|
except Exception as e:
|
|
74
75
|
return DiagnosticResult(
|
|
75
76
|
category=self.category,
|
|
76
|
-
status=
|
|
77
|
+
status=ValidationSeverity.ERROR,
|
|
77
78
|
message=f"Claude Code CLI check failed: {e!s}",
|
|
78
79
|
details={"error": str(e)},
|
|
79
80
|
)
|
|
@@ -92,7 +93,7 @@ class ClaudeCodeCheck(BaseDiagnosticCheck):
|
|
|
92
93
|
if result.returncode == 0:
|
|
93
94
|
return DiagnosticResult(
|
|
94
95
|
category="Claude Code CLI Installation",
|
|
95
|
-
status=
|
|
96
|
+
status=OperationResult.SUCCESS,
|
|
96
97
|
message="Claude Code CLI is installed and accessible",
|
|
97
98
|
details={
|
|
98
99
|
"installed": True,
|
|
@@ -115,14 +116,14 @@ class ClaudeCodeCheck(BaseDiagnosticCheck):
|
|
|
115
116
|
if path.exists() and path.is_file():
|
|
116
117
|
return DiagnosticResult(
|
|
117
118
|
category="Claude Code CLI Installation",
|
|
118
|
-
status=
|
|
119
|
+
status=OperationResult.SUCCESS,
|
|
119
120
|
message=f"Claude Code CLI found at {path}",
|
|
120
121
|
details={"installed": True, "path": str(path)},
|
|
121
122
|
)
|
|
122
123
|
|
|
123
124
|
return DiagnosticResult(
|
|
124
125
|
category="Claude Code CLI Installation",
|
|
125
|
-
status=
|
|
126
|
+
status=ValidationSeverity.ERROR,
|
|
126
127
|
message="Claude Code CLI not found",
|
|
127
128
|
details={"installed": False},
|
|
128
129
|
fix_description="Install Claude Code CLI from https://claude.ai/code",
|
|
@@ -150,7 +151,7 @@ class ClaudeCodeCheck(BaseDiagnosticCheck):
|
|
|
150
151
|
break
|
|
151
152
|
|
|
152
153
|
# Check minimum version requirement (1.0.60+)
|
|
153
|
-
status =
|
|
154
|
+
status = OperationResult.SUCCESS
|
|
154
155
|
message = f"Version: {version}"
|
|
155
156
|
|
|
156
157
|
return DiagnosticResult(
|
|
@@ -166,7 +167,7 @@ class ClaudeCodeCheck(BaseDiagnosticCheck):
|
|
|
166
167
|
except subprocess.SubprocessError as e:
|
|
167
168
|
return DiagnosticResult(
|
|
168
169
|
category="Claude Code CLI Version",
|
|
169
|
-
status=
|
|
170
|
+
status=ValidationSeverity.WARNING,
|
|
170
171
|
message=f"Could not determine version: {e}",
|
|
171
172
|
details={"version": "unknown", "error": str(e)},
|
|
172
173
|
)
|
|
@@ -178,7 +179,7 @@ class ClaudeCodeCheck(BaseDiagnosticCheck):
|
|
|
178
179
|
if not style_path.exists():
|
|
179
180
|
return DiagnosticResult(
|
|
180
181
|
category="Output Style",
|
|
181
|
-
status=
|
|
182
|
+
status=ValidationSeverity.WARNING,
|
|
182
183
|
message="Output style not deployed",
|
|
183
184
|
details={"deployed": False, "path": str(style_path)},
|
|
184
185
|
fix_command="claude-mpm deploy-style",
|
|
@@ -192,13 +193,13 @@ class ClaudeCodeCheck(BaseDiagnosticCheck):
|
|
|
192
193
|
if "Claude MPM Output Style" in content:
|
|
193
194
|
return DiagnosticResult(
|
|
194
195
|
category="Output Style",
|
|
195
|
-
status=
|
|
196
|
+
status=OperationResult.SUCCESS,
|
|
196
197
|
message="Output style deployed",
|
|
197
198
|
details={"deployed": True, "path": str(style_path)},
|
|
198
199
|
)
|
|
199
200
|
return DiagnosticResult(
|
|
200
201
|
category="Output Style",
|
|
201
|
-
status=
|
|
202
|
+
status=ValidationSeverity.WARNING,
|
|
202
203
|
message="Output style outdated",
|
|
203
204
|
details={
|
|
204
205
|
"deployed": True,
|
|
@@ -211,7 +212,7 @@ class ClaudeCodeCheck(BaseDiagnosticCheck):
|
|
|
211
212
|
except Exception as e:
|
|
212
213
|
return DiagnosticResult(
|
|
213
214
|
category="Output Style",
|
|
214
|
-
status=
|
|
215
|
+
status=ValidationSeverity.WARNING,
|
|
215
216
|
message=f"Could not check output style: {e!s}",
|
|
216
217
|
details={"error": str(e)},
|
|
217
218
|
)
|
|
@@ -224,7 +225,7 @@ class ClaudeCodeCheck(BaseDiagnosticCheck):
|
|
|
224
225
|
if not config_path.exists():
|
|
225
226
|
return DiagnosticResult(
|
|
226
227
|
category="MCP Integration",
|
|
227
|
-
status=
|
|
228
|
+
status=ValidationSeverity.WARNING,
|
|
228
229
|
message="Claude Code CLI config not found",
|
|
229
230
|
details={"configured": False, "config_path": str(config_path)},
|
|
230
231
|
fix_command="claude-mpm mcp install",
|
|
@@ -239,7 +240,7 @@ class ClaudeCodeCheck(BaseDiagnosticCheck):
|
|
|
239
240
|
if "claude-mpm-gateway" in mcp_servers or "claude-mpm" in mcp_servers:
|
|
240
241
|
return DiagnosticResult(
|
|
241
242
|
category="MCP Integration",
|
|
242
|
-
status=
|
|
243
|
+
status=OperationResult.SUCCESS,
|
|
243
244
|
message="MCP server configured",
|
|
244
245
|
details={
|
|
245
246
|
"configured": True,
|
|
@@ -249,7 +250,7 @@ class ClaudeCodeCheck(BaseDiagnosticCheck):
|
|
|
249
250
|
)
|
|
250
251
|
return DiagnosticResult(
|
|
251
252
|
category="MCP Integration",
|
|
252
|
-
status=
|
|
253
|
+
status=ValidationSeverity.WARNING,
|
|
253
254
|
message="MCP server not configured",
|
|
254
255
|
details={
|
|
255
256
|
"configured": False,
|
|
@@ -263,7 +264,7 @@ class ClaudeCodeCheck(BaseDiagnosticCheck):
|
|
|
263
264
|
except Exception as e:
|
|
264
265
|
return DiagnosticResult(
|
|
265
266
|
category="MCP Integration",
|
|
266
|
-
status=
|
|
267
|
+
status=ValidationSeverity.WARNING,
|
|
267
268
|
message=f"Could not check MCP configuration: {e!s}",
|
|
268
269
|
details={"error": str(e)},
|
|
269
270
|
)
|
|
@@ -8,7 +8,8 @@ providing specific fixes for each issue.
|
|
|
8
8
|
import json
|
|
9
9
|
from pathlib import Path
|
|
10
10
|
|
|
11
|
-
from
|
|
11
|
+
from ....core.enums import OperationResult, ValidationSeverity
|
|
12
|
+
from ..models import DiagnosticResult
|
|
12
13
|
from .base_check import BaseDiagnosticCheck
|
|
13
14
|
|
|
14
15
|
|
|
@@ -33,7 +34,7 @@ class CommonIssuesCheck(BaseDiagnosticCheck):
|
|
|
33
34
|
# Check for large .claude.json file
|
|
34
35
|
claude_json_result = self._check_claude_json_size()
|
|
35
36
|
if claude_json_result.has_issues:
|
|
36
|
-
if claude_json_result.status ==
|
|
37
|
+
if claude_json_result.status == ValidationSeverity.ERROR:
|
|
37
38
|
issues_found.append(claude_json_result)
|
|
38
39
|
else:
|
|
39
40
|
warnings_found.append(claude_json_result)
|
|
@@ -62,13 +63,13 @@ class CommonIssuesCheck(BaseDiagnosticCheck):
|
|
|
62
63
|
total_issues = len(issues_found) + len(warnings_found)
|
|
63
64
|
|
|
64
65
|
if issues_found:
|
|
65
|
-
status =
|
|
66
|
+
status = ValidationSeverity.ERROR
|
|
66
67
|
message = f"{len(issues_found)} critical issue(s), {len(warnings_found)} warning(s)"
|
|
67
68
|
elif warnings_found:
|
|
68
|
-
status =
|
|
69
|
+
status = ValidationSeverity.WARNING
|
|
69
70
|
message = f"{len(warnings_found)} known issue(s) detected"
|
|
70
71
|
else:
|
|
71
|
-
status =
|
|
72
|
+
status = OperationResult.SUCCESS
|
|
72
73
|
message = "No known issues detected"
|
|
73
74
|
|
|
74
75
|
details = {
|
|
@@ -90,7 +91,7 @@ class CommonIssuesCheck(BaseDiagnosticCheck):
|
|
|
90
91
|
except Exception as e:
|
|
91
92
|
return DiagnosticResult(
|
|
92
93
|
category=self.category,
|
|
93
|
-
status=
|
|
94
|
+
status=ValidationSeverity.ERROR,
|
|
94
95
|
message=f"Common issues check failed: {e!s}",
|
|
95
96
|
details={"error": str(e)},
|
|
96
97
|
)
|
|
@@ -102,7 +103,7 @@ class CommonIssuesCheck(BaseDiagnosticCheck):
|
|
|
102
103
|
if not claude_json_path.exists():
|
|
103
104
|
return DiagnosticResult(
|
|
104
105
|
category="Large .claude.json",
|
|
105
|
-
status=
|
|
106
|
+
status=OperationResult.SUCCESS,
|
|
106
107
|
message="No .claude.json file",
|
|
107
108
|
details={"exists": False},
|
|
108
109
|
)
|
|
@@ -131,7 +132,7 @@ class CommonIssuesCheck(BaseDiagnosticCheck):
|
|
|
131
132
|
if size_mb > 10: # Critical: >10MB
|
|
132
133
|
return DiagnosticResult(
|
|
133
134
|
category="Large .claude.json",
|
|
134
|
-
status=
|
|
135
|
+
status=ValidationSeverity.ERROR,
|
|
135
136
|
message=f"Critical: .claude.json is {size_mb:.1f}MB (causes memory issues)",
|
|
136
137
|
details=details,
|
|
137
138
|
fix_command="claude-mpm cleanup-memory",
|
|
@@ -140,7 +141,7 @@ class CommonIssuesCheck(BaseDiagnosticCheck):
|
|
|
140
141
|
if size_mb > 1: # Warning: >1MB
|
|
141
142
|
return DiagnosticResult(
|
|
142
143
|
category="Large .claude.json",
|
|
143
|
-
status=
|
|
144
|
+
status=ValidationSeverity.WARNING,
|
|
144
145
|
message=f".claude.json is {size_mb:.1f}MB (may cause memory issues)",
|
|
145
146
|
details=details,
|
|
146
147
|
fix_command="claude-mpm cleanup-memory",
|
|
@@ -149,7 +150,7 @@ class CommonIssuesCheck(BaseDiagnosticCheck):
|
|
|
149
150
|
|
|
150
151
|
return DiagnosticResult(
|
|
151
152
|
category="Large .claude.json",
|
|
152
|
-
status=
|
|
153
|
+
status=OperationResult.SUCCESS,
|
|
153
154
|
message=f".claude.json size acceptable ({size_mb:.2f}MB)",
|
|
154
155
|
details=details,
|
|
155
156
|
)
|
|
@@ -157,7 +158,7 @@ class CommonIssuesCheck(BaseDiagnosticCheck):
|
|
|
157
158
|
except Exception as e:
|
|
158
159
|
return DiagnosticResult(
|
|
159
160
|
category="Large .claude.json",
|
|
160
|
-
status=
|
|
161
|
+
status=ValidationSeverity.WARNING,
|
|
161
162
|
message=f"Could not check .claude.json: {e!s}",
|
|
162
163
|
details={"error": str(e)},
|
|
163
164
|
)
|
|
@@ -170,7 +171,7 @@ class CommonIssuesCheck(BaseDiagnosticCheck):
|
|
|
170
171
|
if not memory_dir.exists():
|
|
171
172
|
return DiagnosticResult(
|
|
172
173
|
category="Memory Usage",
|
|
173
|
-
status=
|
|
174
|
+
status=OperationResult.SUCCESS,
|
|
174
175
|
message="No project memory directory",
|
|
175
176
|
details={"exists": False, "path": str(memory_dir)},
|
|
176
177
|
)
|
|
@@ -200,7 +201,7 @@ class CommonIssuesCheck(BaseDiagnosticCheck):
|
|
|
200
201
|
if size_mb > 100: # >100MB of memory files
|
|
201
202
|
return DiagnosticResult(
|
|
202
203
|
category="Memory Usage",
|
|
203
|
-
status=
|
|
204
|
+
status=ValidationSeverity.WARNING,
|
|
204
205
|
message=f"High memory usage: {size_mb:.1f}MB in {len(memory_files)} files",
|
|
205
206
|
details=details,
|
|
206
207
|
fix_command="claude-mpm memory clean --days 30",
|
|
@@ -209,7 +210,7 @@ class CommonIssuesCheck(BaseDiagnosticCheck):
|
|
|
209
210
|
if old_files:
|
|
210
211
|
return DiagnosticResult(
|
|
211
212
|
category="Memory Usage",
|
|
212
|
-
status=
|
|
213
|
+
status=ValidationSeverity.WARNING,
|
|
213
214
|
message=f"{len(old_files)} memory file(s) older than 30 days",
|
|
214
215
|
details=details,
|
|
215
216
|
fix_command="claude-mpm memory clean --days 30",
|
|
@@ -218,7 +219,7 @@ class CommonIssuesCheck(BaseDiagnosticCheck):
|
|
|
218
219
|
|
|
219
220
|
return DiagnosticResult(
|
|
220
221
|
category="Memory Usage",
|
|
221
|
-
status=
|
|
222
|
+
status=OperationResult.SUCCESS,
|
|
222
223
|
message=f"Memory usage normal ({size_mb:.1f}MB)",
|
|
223
224
|
details=details,
|
|
224
225
|
)
|
|
@@ -226,7 +227,7 @@ class CommonIssuesCheck(BaseDiagnosticCheck):
|
|
|
226
227
|
except Exception as e:
|
|
227
228
|
return DiagnosticResult(
|
|
228
229
|
category="Memory Usage",
|
|
229
|
-
status=
|
|
230
|
+
status=ValidationSeverity.WARNING,
|
|
230
231
|
message=f"Could not check memory: {e!s}",
|
|
231
232
|
details={"error": str(e)},
|
|
232
233
|
)
|
|
@@ -257,7 +258,7 @@ class CommonIssuesCheck(BaseDiagnosticCheck):
|
|
|
257
258
|
if stale_locks:
|
|
258
259
|
return DiagnosticResult(
|
|
259
260
|
category="Lock Files",
|
|
260
|
-
status=
|
|
261
|
+
status=ValidationSeverity.WARNING,
|
|
261
262
|
message=f"{len(stale_locks)} stale lock file(s) found",
|
|
262
263
|
details={"stale_locks": stale_locks},
|
|
263
264
|
fix_command=f"rm {' '.join(stale_locks)}",
|
|
@@ -266,7 +267,7 @@ class CommonIssuesCheck(BaseDiagnosticCheck):
|
|
|
266
267
|
|
|
267
268
|
return DiagnosticResult(
|
|
268
269
|
category="Lock Files",
|
|
269
|
-
status=
|
|
270
|
+
status=OperationResult.SUCCESS,
|
|
270
271
|
message="No stale lock files",
|
|
271
272
|
details={"stale_locks": []},
|
|
272
273
|
)
|
|
@@ -302,7 +303,7 @@ class CommonIssuesCheck(BaseDiagnosticCheck):
|
|
|
302
303
|
if conflicts:
|
|
303
304
|
return DiagnosticResult(
|
|
304
305
|
category="Config Conflicts",
|
|
305
|
-
status=
|
|
306
|
+
status=ValidationSeverity.WARNING,
|
|
306
307
|
message=f"{len(conflicts)} configuration conflict(s)",
|
|
307
308
|
details={"conflicts": conflicts},
|
|
308
309
|
fix_description="Resolve conflicting configurations",
|
|
@@ -310,7 +311,7 @@ class CommonIssuesCheck(BaseDiagnosticCheck):
|
|
|
310
311
|
|
|
311
312
|
return DiagnosticResult(
|
|
312
313
|
category="Config Conflicts",
|
|
313
|
-
status=
|
|
314
|
+
status=OperationResult.SUCCESS,
|
|
314
315
|
message="No configuration conflicts",
|
|
315
316
|
details={"conflicts": []},
|
|
316
317
|
)
|
|
@@ -322,7 +323,7 @@ class CommonIssuesCheck(BaseDiagnosticCheck):
|
|
|
322
323
|
if not cache_dir.exists():
|
|
323
324
|
return DiagnosticResult(
|
|
324
325
|
category="Cache",
|
|
325
|
-
status=
|
|
326
|
+
status=OperationResult.SUCCESS,
|
|
326
327
|
message="No cache directory",
|
|
327
328
|
details={"exists": False},
|
|
328
329
|
)
|
|
@@ -336,7 +337,7 @@ class CommonIssuesCheck(BaseDiagnosticCheck):
|
|
|
336
337
|
if size_mb > 500: # >500MB cache
|
|
337
338
|
return DiagnosticResult(
|
|
338
339
|
category="Cache",
|
|
339
|
-
status=
|
|
340
|
+
status=ValidationSeverity.WARNING,
|
|
340
341
|
message=f"Large cache: {size_mb:.1f}MB",
|
|
341
342
|
details={
|
|
342
343
|
"size_mb": round(size_mb, 2),
|
|
@@ -348,7 +349,7 @@ class CommonIssuesCheck(BaseDiagnosticCheck):
|
|
|
348
349
|
|
|
349
350
|
return DiagnosticResult(
|
|
350
351
|
category="Cache",
|
|
351
|
-
status=
|
|
352
|
+
status=OperationResult.SUCCESS,
|
|
352
353
|
message=f"Cache size normal ({size_mb:.1f}MB)",
|
|
353
354
|
details={"size_mb": round(size_mb, 2), "file_count": len(cache_files)},
|
|
354
355
|
)
|
|
@@ -356,7 +357,7 @@ class CommonIssuesCheck(BaseDiagnosticCheck):
|
|
|
356
357
|
except Exception as e:
|
|
357
358
|
return DiagnosticResult(
|
|
358
359
|
category="Cache",
|
|
359
|
-
status=
|
|
360
|
+
status=ValidationSeverity.WARNING,
|
|
360
361
|
message=f"Could not check cache: {e!s}",
|
|
361
362
|
details={"error": str(e)},
|
|
362
363
|
)
|
|
@@ -11,7 +11,8 @@ from typing import Any, Dict
|
|
|
11
11
|
|
|
12
12
|
import yaml
|
|
13
13
|
|
|
14
|
-
from
|
|
14
|
+
from ....core.enums import OperationResult, ValidationSeverity
|
|
15
|
+
from ..models import DiagnosticResult
|
|
15
16
|
from .base_check import BaseDiagnosticCheck
|
|
16
17
|
|
|
17
18
|
|
|
@@ -52,14 +53,14 @@ class ConfigurationCheck(BaseDiagnosticCheck):
|
|
|
52
53
|
sub_results.append(perm_result)
|
|
53
54
|
|
|
54
55
|
# Determine overall status
|
|
55
|
-
if any(r.status ==
|
|
56
|
-
status =
|
|
56
|
+
if any(r.status == ValidationSeverity.ERROR for r in sub_results):
|
|
57
|
+
status = ValidationSeverity.ERROR
|
|
57
58
|
message = "Configuration has critical issues"
|
|
58
|
-
elif any(r.status ==
|
|
59
|
-
status =
|
|
59
|
+
elif any(r.status == ValidationSeverity.WARNING for r in sub_results):
|
|
60
|
+
status = ValidationSeverity.WARNING
|
|
60
61
|
message = "Configuration has minor issues"
|
|
61
62
|
else:
|
|
62
|
-
status =
|
|
63
|
+
status = OperationResult.SUCCESS
|
|
63
64
|
message = "Configuration is valid"
|
|
64
65
|
|
|
65
66
|
return DiagnosticResult(
|
|
@@ -73,7 +74,7 @@ class ConfigurationCheck(BaseDiagnosticCheck):
|
|
|
73
74
|
except Exception as e:
|
|
74
75
|
return DiagnosticResult(
|
|
75
76
|
category=self.category,
|
|
76
|
-
status=
|
|
77
|
+
status=ValidationSeverity.ERROR,
|
|
77
78
|
message=f"Configuration check failed: {e!s}",
|
|
78
79
|
details={"error": str(e)},
|
|
79
80
|
)
|
|
@@ -85,7 +86,7 @@ class ConfigurationCheck(BaseDiagnosticCheck):
|
|
|
85
86
|
if not config_path.exists():
|
|
86
87
|
return DiagnosticResult(
|
|
87
88
|
category="User Config",
|
|
88
|
-
status=
|
|
89
|
+
status=OperationResult.SUCCESS,
|
|
89
90
|
message="No user configuration (using defaults)",
|
|
90
91
|
details={"path": str(config_path), "exists": False},
|
|
91
92
|
)
|
|
@@ -98,14 +99,14 @@ class ConfigurationCheck(BaseDiagnosticCheck):
|
|
|
98
99
|
if issues:
|
|
99
100
|
return DiagnosticResult(
|
|
100
101
|
category="User Config",
|
|
101
|
-
status=
|
|
102
|
+
status=ValidationSeverity.WARNING,
|
|
102
103
|
message=f"User config has issues: {', '.join(issues)}",
|
|
103
104
|
details={"path": str(config_path), "issues": issues},
|
|
104
105
|
)
|
|
105
106
|
|
|
106
107
|
return DiagnosticResult(
|
|
107
108
|
category="User Config",
|
|
108
|
-
status=
|
|
109
|
+
status=OperationResult.SUCCESS,
|
|
109
110
|
message="User configuration valid",
|
|
110
111
|
details={
|
|
111
112
|
"path": str(config_path),
|
|
@@ -117,7 +118,7 @@ class ConfigurationCheck(BaseDiagnosticCheck):
|
|
|
117
118
|
except yaml.YAMLError as e:
|
|
118
119
|
return DiagnosticResult(
|
|
119
120
|
category="User Config",
|
|
120
|
-
status=
|
|
121
|
+
status=ValidationSeverity.ERROR,
|
|
121
122
|
message="User config has invalid YAML",
|
|
122
123
|
details={"path": str(config_path), "error": str(e)},
|
|
123
124
|
fix_description="Fix YAML syntax errors in the configuration file",
|
|
@@ -125,7 +126,7 @@ class ConfigurationCheck(BaseDiagnosticCheck):
|
|
|
125
126
|
except Exception as e:
|
|
126
127
|
return DiagnosticResult(
|
|
127
128
|
category="User Config",
|
|
128
|
-
status=
|
|
129
|
+
status=ValidationSeverity.WARNING,
|
|
129
130
|
message=f"Could not read user config: {e!s}",
|
|
130
131
|
details={"path": str(config_path), "error": str(e)},
|
|
131
132
|
)
|
|
@@ -137,7 +138,7 @@ class ConfigurationCheck(BaseDiagnosticCheck):
|
|
|
137
138
|
if not config_path.exists():
|
|
138
139
|
return DiagnosticResult(
|
|
139
140
|
category="Project Config",
|
|
140
|
-
status=
|
|
141
|
+
status=OperationResult.SUCCESS,
|
|
141
142
|
message="No project configuration (using defaults)",
|
|
142
143
|
details={"path": str(config_path), "exists": False},
|
|
143
144
|
)
|
|
@@ -150,7 +151,7 @@ class ConfigurationCheck(BaseDiagnosticCheck):
|
|
|
150
151
|
if issues:
|
|
151
152
|
return DiagnosticResult(
|
|
152
153
|
category="Project Config",
|
|
153
|
-
status=
|
|
154
|
+
status=ValidationSeverity.WARNING,
|
|
154
155
|
message=f"Project config has issues: {', '.join(issues)}",
|
|
155
156
|
details={"path": str(config_path), "issues": issues},
|
|
156
157
|
)
|
|
@@ -160,7 +161,7 @@ class ConfigurationCheck(BaseDiagnosticCheck):
|
|
|
160
161
|
if deprecated:
|
|
161
162
|
return DiagnosticResult(
|
|
162
163
|
category="Project Config",
|
|
163
|
-
status=
|
|
164
|
+
status=ValidationSeverity.WARNING,
|
|
164
165
|
message=f"Using deprecated config keys: {', '.join(deprecated)}",
|
|
165
166
|
details={"path": str(config_path), "deprecated_keys": deprecated},
|
|
166
167
|
fix_description="Remove deprecated configuration keys",
|
|
@@ -168,7 +169,7 @@ class ConfigurationCheck(BaseDiagnosticCheck):
|
|
|
168
169
|
|
|
169
170
|
return DiagnosticResult(
|
|
170
171
|
category="Project Config",
|
|
171
|
-
status=
|
|
172
|
+
status=OperationResult.SUCCESS,
|
|
172
173
|
message="Project configuration valid",
|
|
173
174
|
details={
|
|
174
175
|
"path": str(config_path),
|
|
@@ -180,7 +181,7 @@ class ConfigurationCheck(BaseDiagnosticCheck):
|
|
|
180
181
|
except yaml.YAMLError as e:
|
|
181
182
|
return DiagnosticResult(
|
|
182
183
|
category="Project Config",
|
|
183
|
-
status=
|
|
184
|
+
status=ValidationSeverity.ERROR,
|
|
184
185
|
message="Project config has invalid YAML",
|
|
185
186
|
details={"path": str(config_path), "error": str(e)},
|
|
186
187
|
fix_description="Fix YAML syntax errors in the configuration file",
|
|
@@ -188,7 +189,7 @@ class ConfigurationCheck(BaseDiagnosticCheck):
|
|
|
188
189
|
except Exception as e:
|
|
189
190
|
return DiagnosticResult(
|
|
190
191
|
category="Project Config",
|
|
191
|
-
status=
|
|
192
|
+
status=ValidationSeverity.WARNING,
|
|
192
193
|
message=f"Could not read project config: {e!s}",
|
|
193
194
|
details={"path": str(config_path), "error": str(e)},
|
|
194
195
|
)
|
|
@@ -207,14 +208,14 @@ class ConfigurationCheck(BaseDiagnosticCheck):
|
|
|
207
208
|
if not set_vars:
|
|
208
209
|
return DiagnosticResult(
|
|
209
210
|
category="Environment Variables",
|
|
210
|
-
status=
|
|
211
|
+
status=OperationResult.SUCCESS,
|
|
211
212
|
message="No claude-mpm environment variables set",
|
|
212
213
|
details={"variables": {}},
|
|
213
214
|
)
|
|
214
215
|
|
|
215
216
|
return DiagnosticResult(
|
|
216
217
|
category="Environment Variables",
|
|
217
|
-
status=
|
|
218
|
+
status=OperationResult.SUCCESS,
|
|
218
219
|
message=f"{len(set_vars)} environment variable(s) configured",
|
|
219
220
|
details={"variables": set_vars},
|
|
220
221
|
)
|
|
@@ -245,7 +246,7 @@ class ConfigurationCheck(BaseDiagnosticCheck):
|
|
|
245
246
|
if not paths_checked:
|
|
246
247
|
return DiagnosticResult(
|
|
247
248
|
category="Config Permissions",
|
|
248
|
-
status=
|
|
249
|
+
status=OperationResult.SUCCESS,
|
|
249
250
|
message="No configuration files to check",
|
|
250
251
|
details={"paths_checked": []},
|
|
251
252
|
)
|
|
@@ -253,7 +254,7 @@ class ConfigurationCheck(BaseDiagnosticCheck):
|
|
|
253
254
|
if issues:
|
|
254
255
|
return DiagnosticResult(
|
|
255
256
|
category="Config Permissions",
|
|
256
|
-
status=
|
|
257
|
+
status=ValidationSeverity.WARNING,
|
|
257
258
|
message=f"Permission issues: {', '.join(issues)}",
|
|
258
259
|
details={"issues": issues, "paths_checked": paths_checked},
|
|
259
260
|
fix_command="chmod 644 ~/.claude/claude-mpm.yaml",
|
|
@@ -262,7 +263,7 @@ class ConfigurationCheck(BaseDiagnosticCheck):
|
|
|
262
263
|
|
|
263
264
|
return DiagnosticResult(
|
|
264
265
|
category="Config Permissions",
|
|
265
|
-
status=
|
|
266
|
+
status=OperationResult.SUCCESS,
|
|
266
267
|
message="Configuration file permissions are correct",
|
|
267
268
|
details={"paths_checked": paths_checked},
|
|
268
269
|
)
|
|
@@ -9,7 +9,8 @@ import os
|
|
|
9
9
|
import shutil
|
|
10
10
|
from pathlib import Path
|
|
11
11
|
|
|
12
|
-
from
|
|
12
|
+
from ....core.enums import OperationResult, ValidationSeverity
|
|
13
|
+
from ..models import DiagnosticResult
|
|
13
14
|
from .base_check import BaseDiagnosticCheck
|
|
14
15
|
|
|
15
16
|
|
|
@@ -46,14 +47,14 @@ class FilesystemCheck(BaseDiagnosticCheck):
|
|
|
46
47
|
details["structure"] = structure_result.details
|
|
47
48
|
|
|
48
49
|
# Determine overall status
|
|
49
|
-
if any(r.status ==
|
|
50
|
-
status =
|
|
50
|
+
if any(r.status == ValidationSeverity.ERROR for r in sub_results):
|
|
51
|
+
status = ValidationSeverity.ERROR
|
|
51
52
|
message = "File system has critical issues"
|
|
52
|
-
elif any(r.status ==
|
|
53
|
-
status =
|
|
53
|
+
elif any(r.status == ValidationSeverity.WARNING for r in sub_results):
|
|
54
|
+
status = ValidationSeverity.WARNING
|
|
54
55
|
message = "File system has minor issues"
|
|
55
56
|
else:
|
|
56
|
-
status =
|
|
57
|
+
status = OperationResult.SUCCESS
|
|
57
58
|
message = "File system healthy"
|
|
58
59
|
|
|
59
60
|
return DiagnosticResult(
|
|
@@ -67,7 +68,7 @@ class FilesystemCheck(BaseDiagnosticCheck):
|
|
|
67
68
|
except Exception as e:
|
|
68
69
|
return DiagnosticResult(
|
|
69
70
|
category=self.category,
|
|
70
|
-
status=
|
|
71
|
+
status=ValidationSeverity.ERROR,
|
|
71
72
|
message=f"Filesystem check failed: {e!s}",
|
|
72
73
|
details={"error": str(e)},
|
|
73
74
|
)
|
|
@@ -106,7 +107,7 @@ class FilesystemCheck(BaseDiagnosticCheck):
|
|
|
106
107
|
if issues:
|
|
107
108
|
return DiagnosticResult(
|
|
108
109
|
category="Permissions",
|
|
109
|
-
status=
|
|
110
|
+
status=ValidationSeverity.ERROR,
|
|
110
111
|
message=f"{len(issues)} permission issue(s)",
|
|
111
112
|
details={"issues": issues, "checked": checked},
|
|
112
113
|
fix_command="chmod -R 755 .claude",
|
|
@@ -116,14 +117,14 @@ class FilesystemCheck(BaseDiagnosticCheck):
|
|
|
116
117
|
if not checked:
|
|
117
118
|
return DiagnosticResult(
|
|
118
119
|
category="Permissions",
|
|
119
|
-
status=
|
|
120
|
+
status=ValidationSeverity.WARNING,
|
|
120
121
|
message="No project .claude directories found",
|
|
121
122
|
details={"checked": [], "missing": [str(d) for d in critical_dirs]},
|
|
122
123
|
)
|
|
123
124
|
|
|
124
125
|
return DiagnosticResult(
|
|
125
126
|
category="Permissions",
|
|
126
|
-
status=
|
|
127
|
+
status=OperationResult.SUCCESS,
|
|
127
128
|
message="All permissions valid",
|
|
128
129
|
details={"checked": checked},
|
|
129
130
|
)
|
|
@@ -150,7 +151,7 @@ class FilesystemCheck(BaseDiagnosticCheck):
|
|
|
150
151
|
if free_gb < 0.1: # Less than 100MB
|
|
151
152
|
return DiagnosticResult(
|
|
152
153
|
category="Disk Space",
|
|
153
|
-
status=
|
|
154
|
+
status=ValidationSeverity.ERROR,
|
|
154
155
|
message=f"Critical: Only {free_gb:.2f}GB free",
|
|
155
156
|
details=details,
|
|
156
157
|
fix_description="Free up disk space immediately",
|
|
@@ -158,7 +159,7 @@ class FilesystemCheck(BaseDiagnosticCheck):
|
|
|
158
159
|
if free_gb < 1: # Less than 1GB
|
|
159
160
|
return DiagnosticResult(
|
|
160
161
|
category="Disk Space",
|
|
161
|
-
status=
|
|
162
|
+
status=ValidationSeverity.WARNING,
|
|
162
163
|
message=f"Low disk space: {free_gb:.2f}GB free",
|
|
163
164
|
details=details,
|
|
164
165
|
fix_description="Consider freeing up disk space",
|
|
@@ -166,7 +167,7 @@ class FilesystemCheck(BaseDiagnosticCheck):
|
|
|
166
167
|
|
|
167
168
|
return DiagnosticResult(
|
|
168
169
|
category="Disk Space",
|
|
169
|
-
status=
|
|
170
|
+
status=OperationResult.SUCCESS,
|
|
170
171
|
message=f"{free_gb:.1f}GB available",
|
|
171
172
|
details=details,
|
|
172
173
|
)
|
|
@@ -174,7 +175,7 @@ class FilesystemCheck(BaseDiagnosticCheck):
|
|
|
174
175
|
except Exception as e:
|
|
175
176
|
return DiagnosticResult(
|
|
176
177
|
category="Disk Space",
|
|
177
|
-
status=
|
|
178
|
+
status=ValidationSeverity.WARNING,
|
|
178
179
|
message=f"Could not check disk space: {e!s}",
|
|
179
180
|
details={"error": str(e)},
|
|
180
181
|
)
|
|
@@ -196,7 +197,7 @@ class FilesystemCheck(BaseDiagnosticCheck):
|
|
|
196
197
|
if not base_dir.exists():
|
|
197
198
|
return DiagnosticResult(
|
|
198
199
|
category="Directory Structure",
|
|
199
|
-
status=
|
|
200
|
+
status=ValidationSeverity.WARNING,
|
|
200
201
|
message="Project .claude directory missing",
|
|
201
202
|
details={"base_dir": str(base_dir), "exists": False},
|
|
202
203
|
fix_command="mkdir -p .claude/{agents,responses,memory,logs}",
|
|
@@ -213,7 +214,7 @@ class FilesystemCheck(BaseDiagnosticCheck):
|
|
|
213
214
|
if missing:
|
|
214
215
|
return DiagnosticResult(
|
|
215
216
|
category="Directory Structure",
|
|
216
|
-
status=
|
|
217
|
+
status=ValidationSeverity.WARNING,
|
|
217
218
|
message=f"Missing {len(missing)} subdirectory(s)",
|
|
218
219
|
details={
|
|
219
220
|
"base_dir": str(base_dir),
|
|
@@ -226,7 +227,7 @@ class FilesystemCheck(BaseDiagnosticCheck):
|
|
|
226
227
|
|
|
227
228
|
return DiagnosticResult(
|
|
228
229
|
category="Directory Structure",
|
|
229
|
-
status=
|
|
230
|
+
status=OperationResult.SUCCESS,
|
|
230
231
|
message="Directory structure complete",
|
|
231
232
|
details={"base_dir": str(base_dir), "directories": present},
|
|
232
233
|
)
|