claude-mpm 4.15.0__py3-none-any.whl → 4.15.1__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.
Potentially problematic release.
This version of claude-mpm might be problematic. Click here for more details.
- claude_mpm/VERSION +1 -1
- claude_mpm/agents/OUTPUT_STYLE.md +48 -3
- 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 +28 -28
- claude_mpm/services/diagnostics/checks/instructions_check.py +20 -19
- claude_mpm/services/diagnostics/checks/mcp_check.py +31 -31
- 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-4.15.0.dist-info → claude_mpm-4.15.1.dist-info}/METADATA +1 -1
- {claude_mpm-4.15.0.dist-info → claude_mpm-4.15.1.dist-info}/RECORD +23 -23
- {claude_mpm-4.15.0.dist-info → claude_mpm-4.15.1.dist-info}/WHEEL +0 -0
- {claude_mpm-4.15.0.dist-info → claude_mpm-4.15.1.dist-info}/entry_points.txt +0 -0
- {claude_mpm-4.15.0.dist-info → claude_mpm-4.15.1.dist-info}/licenses/LICENSE +0 -0
- {claude_mpm-4.15.0.dist-info → claude_mpm-4.15.1.dist-info}/top_level.txt +0 -0
|
@@ -9,9 +9,9 @@ import json
|
|
|
9
9
|
import subprocess
|
|
10
10
|
from pathlib import Path
|
|
11
11
|
|
|
12
|
-
from claude_mpm.core.enums import ServiceState
|
|
12
|
+
from claude_mpm.core.enums import OperationResult, ServiceState, ValidationSeverity
|
|
13
13
|
|
|
14
|
-
from ..models import DiagnosticResult
|
|
14
|
+
from ..models import DiagnosticResult
|
|
15
15
|
from .base_check import BaseDiagnosticCheck
|
|
16
16
|
|
|
17
17
|
|
|
@@ -36,13 +36,13 @@ class MCPCheck(BaseDiagnosticCheck):
|
|
|
36
36
|
# Check if MCP is installed
|
|
37
37
|
install_result = self._check_installation()
|
|
38
38
|
sub_results.append(install_result)
|
|
39
|
-
details["installed"] = install_result.status ==
|
|
39
|
+
details["installed"] = install_result.status == OperationResult.SUCCESS
|
|
40
40
|
|
|
41
|
-
if install_result.status ==
|
|
41
|
+
if install_result.status == OperationResult.SUCCESS:
|
|
42
42
|
# Check MCP configuration
|
|
43
43
|
config_result = self._check_configuration()
|
|
44
44
|
sub_results.append(config_result)
|
|
45
|
-
details["configured"] = config_result.status ==
|
|
45
|
+
details["configured"] = config_result.status == OperationResult.SUCCESS
|
|
46
46
|
|
|
47
47
|
# Check MCP server status
|
|
48
48
|
status_result = self._check_server_status()
|
|
@@ -54,17 +54,17 @@ class MCPCheck(BaseDiagnosticCheck):
|
|
|
54
54
|
sub_results.append(startup_result)
|
|
55
55
|
|
|
56
56
|
# Determine overall status
|
|
57
|
-
if any(r.status ==
|
|
58
|
-
status =
|
|
57
|
+
if any(r.status == ValidationSeverity.ERROR for r in sub_results):
|
|
58
|
+
status = ValidationSeverity.ERROR
|
|
59
59
|
message = "MCP server has critical issues"
|
|
60
60
|
elif not details.get("installed", False):
|
|
61
|
-
status =
|
|
61
|
+
status = ValidationSeverity.WARNING
|
|
62
62
|
message = "MCP server not installed"
|
|
63
|
-
elif any(r.status ==
|
|
64
|
-
status =
|
|
63
|
+
elif any(r.status == ValidationSeverity.WARNING for r in sub_results):
|
|
64
|
+
status = ValidationSeverity.WARNING
|
|
65
65
|
message = "MCP server needs configuration"
|
|
66
66
|
else:
|
|
67
|
-
status =
|
|
67
|
+
status = OperationResult.SUCCESS
|
|
68
68
|
message = "MCP server properly configured"
|
|
69
69
|
|
|
70
70
|
return DiagnosticResult(
|
|
@@ -78,7 +78,7 @@ class MCPCheck(BaseDiagnosticCheck):
|
|
|
78
78
|
except Exception as e:
|
|
79
79
|
return DiagnosticResult(
|
|
80
80
|
category=self.category,
|
|
81
|
-
status=
|
|
81
|
+
status=ValidationSeverity.ERROR,
|
|
82
82
|
message=f"MCP check failed: {e!s}",
|
|
83
83
|
details={"error": str(e)},
|
|
84
84
|
)
|
|
@@ -96,7 +96,7 @@ class MCPCheck(BaseDiagnosticCheck):
|
|
|
96
96
|
if mcp_path.exists():
|
|
97
97
|
return DiagnosticResult(
|
|
98
98
|
category="MCP Installation",
|
|
99
|
-
status=
|
|
99
|
+
status=OperationResult.SUCCESS,
|
|
100
100
|
message="MCP server installed",
|
|
101
101
|
details={"path": str(mcp_path), "installed": True},
|
|
102
102
|
)
|
|
@@ -114,7 +114,7 @@ class MCPCheck(BaseDiagnosticCheck):
|
|
|
114
114
|
path = result.stdout.strip()
|
|
115
115
|
return DiagnosticResult(
|
|
116
116
|
category="MCP Installation",
|
|
117
|
-
status=
|
|
117
|
+
status=OperationResult.SUCCESS,
|
|
118
118
|
message="MCP server installed",
|
|
119
119
|
details={"path": path, "installed": True},
|
|
120
120
|
)
|
|
@@ -123,7 +123,7 @@ class MCPCheck(BaseDiagnosticCheck):
|
|
|
123
123
|
|
|
124
124
|
return DiagnosticResult(
|
|
125
125
|
category="MCP Installation",
|
|
126
|
-
status=
|
|
126
|
+
status=ValidationSeverity.WARNING,
|
|
127
127
|
message="MCP server not installed",
|
|
128
128
|
details={"installed": False},
|
|
129
129
|
fix_command="claude-mpm mcp install",
|
|
@@ -148,7 +148,7 @@ class MCPCheck(BaseDiagnosticCheck):
|
|
|
148
148
|
if not config_path:
|
|
149
149
|
return DiagnosticResult(
|
|
150
150
|
category="MCP Configuration",
|
|
151
|
-
status=
|
|
151
|
+
status=ValidationSeverity.WARNING,
|
|
152
152
|
message="Claude Code config not found",
|
|
153
153
|
details={"configured": False},
|
|
154
154
|
fix_command="claude-mpm mcp config",
|
|
@@ -165,7 +165,7 @@ class MCPCheck(BaseDiagnosticCheck):
|
|
|
165
165
|
if not gateway:
|
|
166
166
|
return DiagnosticResult(
|
|
167
167
|
category="MCP Configuration",
|
|
168
|
-
status=
|
|
168
|
+
status=ValidationSeverity.WARNING,
|
|
169
169
|
message="MCP gateway not configured",
|
|
170
170
|
details={"configured": False, "config_path": str(config_path)},
|
|
171
171
|
fix_command="claude-mpm mcp config",
|
|
@@ -177,7 +177,7 @@ class MCPCheck(BaseDiagnosticCheck):
|
|
|
177
177
|
if not command:
|
|
178
178
|
return DiagnosticResult(
|
|
179
179
|
category="MCP Configuration",
|
|
180
|
-
status=
|
|
180
|
+
status=ValidationSeverity.ERROR,
|
|
181
181
|
message="MCP gateway misconfigured (no command)",
|
|
182
182
|
details={
|
|
183
183
|
"configured": True,
|
|
@@ -190,7 +190,7 @@ class MCPCheck(BaseDiagnosticCheck):
|
|
|
190
190
|
|
|
191
191
|
return DiagnosticResult(
|
|
192
192
|
category="MCP Configuration",
|
|
193
|
-
status=
|
|
193
|
+
status=OperationResult.SUCCESS,
|
|
194
194
|
message="MCP gateway configured",
|
|
195
195
|
details={
|
|
196
196
|
"configured": True,
|
|
@@ -202,7 +202,7 @@ class MCPCheck(BaseDiagnosticCheck):
|
|
|
202
202
|
except json.JSONDecodeError as e:
|
|
203
203
|
return DiagnosticResult(
|
|
204
204
|
category="MCP Configuration",
|
|
205
|
-
status=
|
|
205
|
+
status=ValidationSeverity.ERROR,
|
|
206
206
|
message="Invalid JSON in config file",
|
|
207
207
|
details={"error": str(e), "config_path": str(config_path)},
|
|
208
208
|
fix_description="Fix JSON syntax in Claude Code config",
|
|
@@ -210,7 +210,7 @@ class MCPCheck(BaseDiagnosticCheck):
|
|
|
210
210
|
except Exception as e:
|
|
211
211
|
return DiagnosticResult(
|
|
212
212
|
category="MCP Configuration",
|
|
213
|
-
status=
|
|
213
|
+
status=ValidationSeverity.WARNING,
|
|
214
214
|
message=f"Could not check configuration: {e!s}",
|
|
215
215
|
details={"error": str(e)},
|
|
216
216
|
)
|
|
@@ -231,13 +231,13 @@ class MCPCheck(BaseDiagnosticCheck):
|
|
|
231
231
|
if ServiceState.RUNNING.value in result.stdout.lower():
|
|
232
232
|
return DiagnosticResult(
|
|
233
233
|
category="MCP Server Status",
|
|
234
|
-
status=
|
|
234
|
+
status=OperationResult.SUCCESS,
|
|
235
235
|
message="MCP server is running",
|
|
236
236
|
details={"running": True, "state": ServiceState.RUNNING},
|
|
237
237
|
)
|
|
238
238
|
return DiagnosticResult(
|
|
239
239
|
category="MCP Server Status",
|
|
240
|
-
status=
|
|
240
|
+
status=ValidationSeverity.WARNING,
|
|
241
241
|
message="MCP server not running",
|
|
242
242
|
details={"running": False, "state": ServiceState.STOPPED},
|
|
243
243
|
fix_command="claude-mpm mcp start",
|
|
@@ -245,7 +245,7 @@ class MCPCheck(BaseDiagnosticCheck):
|
|
|
245
245
|
)
|
|
246
246
|
return DiagnosticResult(
|
|
247
247
|
category="MCP Server Status",
|
|
248
|
-
status=
|
|
248
|
+
status=ValidationSeverity.WARNING,
|
|
249
249
|
message="Could not determine server status",
|
|
250
250
|
details={
|
|
251
251
|
"running": "unknown",
|
|
@@ -257,7 +257,7 @@ class MCPCheck(BaseDiagnosticCheck):
|
|
|
257
257
|
except subprocess.TimeoutExpired:
|
|
258
258
|
return DiagnosticResult(
|
|
259
259
|
category="MCP Server Status",
|
|
260
|
-
status=
|
|
260
|
+
status=ValidationSeverity.WARNING,
|
|
261
261
|
message="Server status check timed out",
|
|
262
262
|
details={
|
|
263
263
|
"running": "unknown",
|
|
@@ -268,7 +268,7 @@ class MCPCheck(BaseDiagnosticCheck):
|
|
|
268
268
|
except Exception as e:
|
|
269
269
|
return DiagnosticResult(
|
|
270
270
|
category="MCP Server Status",
|
|
271
|
-
status=
|
|
271
|
+
status=ValidationSeverity.WARNING,
|
|
272
272
|
message=f"Could not check server status: {e!s}",
|
|
273
273
|
details={
|
|
274
274
|
"running": "unknown",
|
|
@@ -290,7 +290,7 @@ class MCPCheck(BaseDiagnosticCheck):
|
|
|
290
290
|
if not issues:
|
|
291
291
|
return DiagnosticResult(
|
|
292
292
|
category="MCP Startup Verification",
|
|
293
|
-
status=
|
|
293
|
+
status=OperationResult.SUCCESS,
|
|
294
294
|
message="Startup verification passed",
|
|
295
295
|
details={"issues": []},
|
|
296
296
|
)
|
|
@@ -304,20 +304,20 @@ class MCPCheck(BaseDiagnosticCheck):
|
|
|
304
304
|
if errors:
|
|
305
305
|
return DiagnosticResult(
|
|
306
306
|
category="MCP Startup Verification",
|
|
307
|
-
status=
|
|
307
|
+
status=ValidationSeverity.ERROR,
|
|
308
308
|
message=f"{len(errors)} critical issue(s) found",
|
|
309
309
|
details={"errors": errors, "warnings": warnings},
|
|
310
310
|
)
|
|
311
311
|
if warnings:
|
|
312
312
|
return DiagnosticResult(
|
|
313
313
|
category="MCP Startup Verification",
|
|
314
|
-
status=
|
|
314
|
+
status=ValidationSeverity.WARNING,
|
|
315
315
|
message=f"{len(warnings)} warning(s) found",
|
|
316
316
|
details={"warnings": warnings},
|
|
317
317
|
)
|
|
318
318
|
return DiagnosticResult(
|
|
319
319
|
category="MCP Startup Verification",
|
|
320
|
-
status=
|
|
320
|
+
status=OperationResult.SUCCESS,
|
|
321
321
|
message="Startup verification passed",
|
|
322
322
|
details={"issues": []},
|
|
323
323
|
)
|
|
@@ -325,7 +325,7 @@ class MCPCheck(BaseDiagnosticCheck):
|
|
|
325
325
|
except Exception as e:
|
|
326
326
|
return DiagnosticResult(
|
|
327
327
|
category="MCP Startup Verification",
|
|
328
|
-
status=
|
|
328
|
+
status=ValidationSeverity.WARNING,
|
|
329
329
|
message=f"Could not verify startup: {e!s}",
|
|
330
330
|
details={"error": str(e)},
|
|
331
331
|
)
|
|
@@ -14,7 +14,8 @@ from typing import Dict, List, Optional, Tuple
|
|
|
14
14
|
|
|
15
15
|
from claude_mpm.core.logger import get_logger
|
|
16
16
|
|
|
17
|
-
from
|
|
17
|
+
from ....core.enums import OperationResult, ValidationSeverity
|
|
18
|
+
from ..models import DiagnosticResult
|
|
18
19
|
from .base_check import BaseDiagnosticCheck
|
|
19
20
|
|
|
20
21
|
|
|
@@ -116,7 +117,9 @@ class MCPServicesCheck(BaseDiagnosticCheck):
|
|
|
116
117
|
fix_result = DiagnosticResult(
|
|
117
118
|
category="MCP Service Fixes",
|
|
118
119
|
status=(
|
|
119
|
-
|
|
120
|
+
OperationResult.SUCCESS
|
|
121
|
+
if fix_success
|
|
122
|
+
else ValidationSeverity.WARNING
|
|
120
123
|
),
|
|
121
124
|
message=fix_message,
|
|
122
125
|
details={"auto_fix_applied": True},
|
|
@@ -134,9 +137,9 @@ class MCPServicesCheck(BaseDiagnosticCheck):
|
|
|
134
137
|
config_result = DiagnosticResult(
|
|
135
138
|
category="MCP Configuration Update",
|
|
136
139
|
status=(
|
|
137
|
-
|
|
140
|
+
OperationResult.SUCCESS
|
|
138
141
|
if config_success
|
|
139
|
-
else
|
|
142
|
+
else ValidationSeverity.WARNING
|
|
140
143
|
),
|
|
141
144
|
message=config_message,
|
|
142
145
|
details={"auto_config_applied": True},
|
|
@@ -191,32 +194,34 @@ class MCPServicesCheck(BaseDiagnosticCheck):
|
|
|
191
194
|
details["connected_count"] = connected_count
|
|
192
195
|
details["total_services"] = total_services
|
|
193
196
|
details["total_tools_discovered"] = total_tools
|
|
194
|
-
details["gateway_configured"] =
|
|
197
|
+
details["gateway_configured"] = (
|
|
198
|
+
gateway_result.status == OperationResult.SUCCESS
|
|
199
|
+
)
|
|
195
200
|
|
|
196
201
|
# Determine overall status
|
|
197
|
-
errors = [r for r in sub_results if r.status ==
|
|
198
|
-
[r for r in sub_results if r.status ==
|
|
202
|
+
errors = [r for r in sub_results if r.status == ValidationSeverity.ERROR]
|
|
203
|
+
[r for r in sub_results if r.status == ValidationSeverity.WARNING]
|
|
199
204
|
|
|
200
205
|
if errors:
|
|
201
|
-
status =
|
|
206
|
+
status = ValidationSeverity.ERROR
|
|
202
207
|
message = f"Critical issues with {len(errors)} MCP service(s)"
|
|
203
208
|
elif installed_count == 0:
|
|
204
|
-
status =
|
|
209
|
+
status = ValidationSeverity.WARNING
|
|
205
210
|
message = "No MCP services installed"
|
|
206
211
|
elif connected_count == total_services:
|
|
207
|
-
status =
|
|
212
|
+
status = OperationResult.SUCCESS
|
|
208
213
|
message = f"All {total_services} MCP services connected ({total_tools} tools available)"
|
|
209
214
|
elif connected_count > 0:
|
|
210
|
-
status =
|
|
215
|
+
status = ValidationSeverity.WARNING
|
|
211
216
|
message = f"{connected_count}/{total_services} MCP services connected, {installed_count} installed"
|
|
212
217
|
elif accessible_count < installed_count:
|
|
213
|
-
status =
|
|
218
|
+
status = ValidationSeverity.WARNING
|
|
214
219
|
message = f"{installed_count}/{total_services} services installed, {accessible_count} accessible"
|
|
215
220
|
elif installed_count < total_services:
|
|
216
|
-
status =
|
|
221
|
+
status = ValidationSeverity.WARNING
|
|
217
222
|
message = f"{installed_count}/{total_services} MCP services installed"
|
|
218
223
|
else:
|
|
219
|
-
status =
|
|
224
|
+
status = ValidationSeverity.WARNING
|
|
220
225
|
message = f"All {total_services} MCP services installed but connections not tested"
|
|
221
226
|
|
|
222
227
|
return DiagnosticResult(
|
|
@@ -230,7 +235,7 @@ class MCPServicesCheck(BaseDiagnosticCheck):
|
|
|
230
235
|
except Exception as e:
|
|
231
236
|
return DiagnosticResult(
|
|
232
237
|
category=self.category,
|
|
233
|
-
status=
|
|
238
|
+
status=ValidationSeverity.ERROR,
|
|
234
239
|
message=f"MCP services check failed: {e!s}",
|
|
235
240
|
details={"error": str(e)},
|
|
236
241
|
)
|
|
@@ -543,7 +548,7 @@ class MCPServicesCheck(BaseDiagnosticCheck):
|
|
|
543
548
|
if not (pipx_installed or accessible):
|
|
544
549
|
return DiagnosticResult(
|
|
545
550
|
category=f"MCP Service: {service_name}",
|
|
546
|
-
status=
|
|
551
|
+
status=ValidationSeverity.WARNING,
|
|
547
552
|
message=f"Not installed: {config['description']}",
|
|
548
553
|
details=details,
|
|
549
554
|
fix_command=f"pipx install {config['package']}",
|
|
@@ -565,16 +570,16 @@ class MCPServicesCheck(BaseDiagnosticCheck):
|
|
|
565
570
|
return DiagnosticResult(
|
|
566
571
|
category=f"MCP Service: {service_name}",
|
|
567
572
|
status=(
|
|
568
|
-
|
|
573
|
+
OperationResult.SUCCESS
|
|
569
574
|
if connection_info.get("connected")
|
|
570
|
-
else
|
|
575
|
+
else ValidationSeverity.WARNING
|
|
571
576
|
),
|
|
572
577
|
message=message,
|
|
573
578
|
details=details,
|
|
574
579
|
)
|
|
575
580
|
return DiagnosticResult(
|
|
576
581
|
category=f"MCP Service: {service_name}",
|
|
577
|
-
status=
|
|
582
|
+
status=ValidationSeverity.WARNING,
|
|
578
583
|
message="Installed via pipx but not in PATH",
|
|
579
584
|
details=details,
|
|
580
585
|
fix_command="pipx ensurepath",
|
|
@@ -588,14 +593,14 @@ class MCPServicesCheck(BaseDiagnosticCheck):
|
|
|
588
593
|
response_time = connection_info.get("response_time_ms")
|
|
589
594
|
tools_count = connection_info.get("tools_discovered", 0)
|
|
590
595
|
message = f"Installed, accessible, connection OK ({tools_count} tools, {response_time}ms)"
|
|
591
|
-
status =
|
|
596
|
+
status = OperationResult.SUCCESS
|
|
592
597
|
else:
|
|
593
598
|
error = connection_info.get("error", "Unknown error")
|
|
594
599
|
message = f"Installed but connection failed: {error}"
|
|
595
|
-
status =
|
|
600
|
+
status = ValidationSeverity.WARNING
|
|
596
601
|
else:
|
|
597
602
|
message = "Installed and accessible"
|
|
598
|
-
status =
|
|
603
|
+
status = OperationResult.SUCCESS
|
|
599
604
|
|
|
600
605
|
return DiagnosticResult(
|
|
601
606
|
category=f"MCP Service: {service_name}",
|
|
@@ -826,7 +831,7 @@ class MCPServicesCheck(BaseDiagnosticCheck):
|
|
|
826
831
|
if fixed:
|
|
827
832
|
return DiagnosticResult(
|
|
828
833
|
category="kuzu-memory Configuration Fix",
|
|
829
|
-
status=
|
|
834
|
+
status=OperationResult.SUCCESS,
|
|
830
835
|
message="Fixed kuzu-memory configuration to use correct args",
|
|
831
836
|
details={
|
|
832
837
|
"old_args": args,
|
|
@@ -837,7 +842,7 @@ class MCPServicesCheck(BaseDiagnosticCheck):
|
|
|
837
842
|
)
|
|
838
843
|
return DiagnosticResult(
|
|
839
844
|
category="kuzu-memory Configuration",
|
|
840
|
-
status=
|
|
845
|
+
status=ValidationSeverity.WARNING,
|
|
841
846
|
message="kuzu-memory has incorrect configuration",
|
|
842
847
|
details={
|
|
843
848
|
"current_args": args,
|
|
@@ -931,7 +936,7 @@ class MCPServicesCheck(BaseDiagnosticCheck):
|
|
|
931
936
|
if not config_file.exists():
|
|
932
937
|
return DiagnosticResult(
|
|
933
938
|
category="MCP Gateway Configuration",
|
|
934
|
-
status=
|
|
939
|
+
status=ValidationSeverity.WARNING,
|
|
935
940
|
message="Claude configuration file not found",
|
|
936
941
|
details={"config_path": str(config_file), "exists": False},
|
|
937
942
|
fix_command="claude-mpm configure --mcp",
|
|
@@ -951,7 +956,7 @@ class MCPServicesCheck(BaseDiagnosticCheck):
|
|
|
951
956
|
if current_project not in projects:
|
|
952
957
|
return DiagnosticResult(
|
|
953
958
|
category="MCP Gateway Configuration",
|
|
954
|
-
status=
|
|
959
|
+
status=ValidationSeverity.WARNING,
|
|
955
960
|
message="Current project not configured in Claude",
|
|
956
961
|
details={
|
|
957
962
|
"config_path": str(config_file),
|
|
@@ -982,7 +987,7 @@ class MCPServicesCheck(BaseDiagnosticCheck):
|
|
|
982
987
|
if not configured_services:
|
|
983
988
|
return DiagnosticResult(
|
|
984
989
|
category="MCP Gateway Configuration",
|
|
985
|
-
status=
|
|
990
|
+
status=ValidationSeverity.WARNING,
|
|
986
991
|
message="No MCP services configured in gateway",
|
|
987
992
|
details=details,
|
|
988
993
|
fix_command="claude-mpm configure --mcp --add-services",
|
|
@@ -992,14 +997,14 @@ class MCPServicesCheck(BaseDiagnosticCheck):
|
|
|
992
997
|
if missing_services:
|
|
993
998
|
return DiagnosticResult(
|
|
994
999
|
category="MCP Gateway Configuration",
|
|
995
|
-
status=
|
|
1000
|
+
status=ValidationSeverity.WARNING,
|
|
996
1001
|
message=f"{len(configured_services)} services configured, {len(missing_services)} missing",
|
|
997
1002
|
details=details,
|
|
998
1003
|
)
|
|
999
1004
|
|
|
1000
1005
|
return DiagnosticResult(
|
|
1001
1006
|
category="MCP Gateway Configuration",
|
|
1002
|
-
status=
|
|
1007
|
+
status=OperationResult.SUCCESS,
|
|
1003
1008
|
message=f"All {len(configured_services)} services configured",
|
|
1004
1009
|
details=details,
|
|
1005
1010
|
)
|
|
@@ -1007,14 +1012,14 @@ class MCPServicesCheck(BaseDiagnosticCheck):
|
|
|
1007
1012
|
except json.JSONDecodeError as e:
|
|
1008
1013
|
return DiagnosticResult(
|
|
1009
1014
|
category="MCP Gateway Configuration",
|
|
1010
|
-
status=
|
|
1015
|
+
status=ValidationSeverity.ERROR,
|
|
1011
1016
|
message="Invalid JSON in MCP configuration",
|
|
1012
1017
|
details={"error": str(e)},
|
|
1013
1018
|
)
|
|
1014
1019
|
except Exception as e:
|
|
1015
1020
|
return DiagnosticResult(
|
|
1016
1021
|
category="MCP Gateway Configuration",
|
|
1017
|
-
status=
|
|
1022
|
+
status=ValidationSeverity.WARNING,
|
|
1018
1023
|
message=f"Could not check configuration: {e!s}",
|
|
1019
1024
|
details={"error": str(e)},
|
|
1020
1025
|
)
|
|
@@ -7,7 +7,8 @@ properly configured and accessible for real-time updates.
|
|
|
7
7
|
|
|
8
8
|
import socket
|
|
9
9
|
|
|
10
|
-
from
|
|
10
|
+
from ....core.enums import OperationResult, ValidationSeverity
|
|
11
|
+
from ..models import DiagnosticResult
|
|
11
12
|
from .base_check import BaseDiagnosticCheck
|
|
12
13
|
|
|
13
14
|
|
|
@@ -33,7 +34,7 @@ class MonitorCheck(BaseDiagnosticCheck):
|
|
|
33
34
|
socketio_result = self._check_socketio()
|
|
34
35
|
sub_results.append(socketio_result)
|
|
35
36
|
details["socketio_available"] = (
|
|
36
|
-
socketio_result.status ==
|
|
37
|
+
socketio_result.status == OperationResult.SUCCESS
|
|
37
38
|
)
|
|
38
39
|
|
|
39
40
|
# Check port availability
|
|
@@ -49,17 +50,17 @@ class MonitorCheck(BaseDiagnosticCheck):
|
|
|
49
50
|
# Check hook service
|
|
50
51
|
hook_result = self._check_hook_service()
|
|
51
52
|
sub_results.append(hook_result)
|
|
52
|
-
details["hooks_enabled"] = hook_result.status ==
|
|
53
|
+
details["hooks_enabled"] = hook_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 = "Monitoring 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 = "Monitoring has minor issues"
|
|
61
62
|
else:
|
|
62
|
-
status =
|
|
63
|
+
status = OperationResult.SUCCESS
|
|
63
64
|
message = "Monitoring properly configured"
|
|
64
65
|
|
|
65
66
|
return DiagnosticResult(
|
|
@@ -73,7 +74,7 @@ class MonitorCheck(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"Monitor check failed: {e!s}",
|
|
78
79
|
details={"error": str(e)},
|
|
79
80
|
)
|
|
@@ -85,7 +86,7 @@ class MonitorCheck(BaseDiagnosticCheck):
|
|
|
85
86
|
|
|
86
87
|
return DiagnosticResult(
|
|
87
88
|
category="SocketIO",
|
|
88
|
-
status=
|
|
89
|
+
status=OperationResult.SUCCESS,
|
|
89
90
|
message="SocketIO library available",
|
|
90
91
|
details={
|
|
91
92
|
"available": True,
|
|
@@ -95,7 +96,7 @@ class MonitorCheck(BaseDiagnosticCheck):
|
|
|
95
96
|
except ImportError:
|
|
96
97
|
return DiagnosticResult(
|
|
97
98
|
category="SocketIO",
|
|
98
|
-
status=
|
|
99
|
+
status=ValidationSeverity.WARNING,
|
|
99
100
|
message="SocketIO not installed",
|
|
100
101
|
details={"available": False},
|
|
101
102
|
fix_command="pip install python-socketio[asyncio]",
|
|
@@ -122,7 +123,7 @@ class MonitorCheck(BaseDiagnosticCheck):
|
|
|
122
123
|
if not available_ports:
|
|
123
124
|
return DiagnosticResult(
|
|
124
125
|
category="Port Availability",
|
|
125
|
-
status=
|
|
126
|
+
status=ValidationSeverity.ERROR,
|
|
126
127
|
message="No monitoring ports available (8765-8785)",
|
|
127
128
|
details={
|
|
128
129
|
"available": [],
|
|
@@ -137,7 +138,7 @@ class MonitorCheck(BaseDiagnosticCheck):
|
|
|
137
138
|
if default_port not in available_ports:
|
|
138
139
|
return DiagnosticResult(
|
|
139
140
|
category="Port Availability",
|
|
140
|
-
status=
|
|
141
|
+
status=ValidationSeverity.WARNING,
|
|
141
142
|
message=f"Default port {default_port} in use, but alternatives available",
|
|
142
143
|
details={
|
|
143
144
|
"available": available_ports,
|
|
@@ -148,7 +149,7 @@ class MonitorCheck(BaseDiagnosticCheck):
|
|
|
148
149
|
|
|
149
150
|
return DiagnosticResult(
|
|
150
151
|
category="Port Availability",
|
|
151
|
-
status=
|
|
152
|
+
status=OperationResult.SUCCESS,
|
|
152
153
|
message=f"{len(available_ports)} monitoring port(s) available",
|
|
153
154
|
details={
|
|
154
155
|
"available": available_ports,
|
|
@@ -160,7 +161,7 @@ class MonitorCheck(BaseDiagnosticCheck):
|
|
|
160
161
|
except Exception as e:
|
|
161
162
|
return DiagnosticResult(
|
|
162
163
|
category="Port Availability",
|
|
163
|
-
status=
|
|
164
|
+
status=ValidationSeverity.WARNING,
|
|
164
165
|
message=f"Could not check ports: {e!s}",
|
|
165
166
|
details={"error": str(e)},
|
|
166
167
|
)
|
|
@@ -209,7 +210,7 @@ class MonitorCheck(BaseDiagnosticCheck):
|
|
|
209
210
|
if not response_logging_enabled:
|
|
210
211
|
return DiagnosticResult(
|
|
211
212
|
category="Response Logging",
|
|
212
|
-
status=
|
|
213
|
+
status=OperationResult.SUCCESS,
|
|
213
214
|
message="Response logging disabled (default)",
|
|
214
215
|
details={"enabled": False},
|
|
215
216
|
)
|
|
@@ -219,7 +220,7 @@ class MonitorCheck(BaseDiagnosticCheck):
|
|
|
219
220
|
if not log_dir.exists():
|
|
220
221
|
return DiagnosticResult(
|
|
221
222
|
category="Response Logging",
|
|
222
|
-
status=
|
|
223
|
+
status=ValidationSeverity.WARNING,
|
|
223
224
|
message="Response logging enabled but directory missing",
|
|
224
225
|
details={"enabled": True, "path": str(log_dir), "exists": False},
|
|
225
226
|
fix_command=f"mkdir -p {log_dir}",
|
|
@@ -231,7 +232,7 @@ class MonitorCheck(BaseDiagnosticCheck):
|
|
|
231
232
|
if not os.access(log_dir, os.W_OK):
|
|
232
233
|
return DiagnosticResult(
|
|
233
234
|
category="Response Logging",
|
|
234
|
-
status=
|
|
235
|
+
status=ValidationSeverity.WARNING,
|
|
235
236
|
message="Response logging directory not writable",
|
|
236
237
|
details={"enabled": True, "path": str(log_dir), "writable": False},
|
|
237
238
|
fix_command=f"chmod 755 {log_dir}",
|
|
@@ -240,7 +241,7 @@ class MonitorCheck(BaseDiagnosticCheck):
|
|
|
240
241
|
|
|
241
242
|
return DiagnosticResult(
|
|
242
243
|
category="Response Logging",
|
|
243
|
-
status=
|
|
244
|
+
status=OperationResult.SUCCESS,
|
|
244
245
|
message="Response logging enabled and configured",
|
|
245
246
|
details={
|
|
246
247
|
"enabled": True,
|
|
@@ -260,7 +261,7 @@ class MonitorCheck(BaseDiagnosticCheck):
|
|
|
260
261
|
|
|
261
262
|
return DiagnosticResult(
|
|
262
263
|
category="Hook Service",
|
|
263
|
-
status=
|
|
264
|
+
status=OperationResult.SUCCESS,
|
|
264
265
|
message="Hook service available",
|
|
265
266
|
details={"available": True},
|
|
266
267
|
)
|
|
@@ -268,14 +269,14 @@ class MonitorCheck(BaseDiagnosticCheck):
|
|
|
268
269
|
except ImportError:
|
|
269
270
|
return DiagnosticResult(
|
|
270
271
|
category="Hook Service",
|
|
271
|
-
status=
|
|
272
|
+
status=ValidationSeverity.WARNING,
|
|
272
273
|
message="Hook service not available",
|
|
273
274
|
details={"available": False},
|
|
274
275
|
)
|
|
275
276
|
except Exception as e:
|
|
276
277
|
return DiagnosticResult(
|
|
277
278
|
category="Hook Service",
|
|
278
|
-
status=
|
|
279
|
+
status=ValidationSeverity.WARNING,
|
|
279
280
|
message=f"Hook service error: {e!s}",
|
|
280
281
|
details={"available": False, "error": str(e)},
|
|
281
282
|
)
|
|
@@ -17,7 +17,8 @@ from datetime import datetime
|
|
|
17
17
|
from pathlib import Path
|
|
18
18
|
from typing import Any, ClassVar, Dict, Optional
|
|
19
19
|
|
|
20
|
-
from
|
|
20
|
+
from ....core.enums import OperationResult, ValidationSeverity
|
|
21
|
+
from ..models import DiagnosticResult
|
|
21
22
|
from .base_check import BaseDiagnosticCheck
|
|
22
23
|
|
|
23
24
|
|
|
@@ -94,7 +95,7 @@ class StartupLogCheck(BaseDiagnosticCheck):
|
|
|
94
95
|
if not log_file:
|
|
95
96
|
return DiagnosticResult(
|
|
96
97
|
category=self.category,
|
|
97
|
-
status=
|
|
98
|
+
status=ValidationSeverity.WARNING,
|
|
98
99
|
message="No startup logs found",
|
|
99
100
|
details={
|
|
100
101
|
"recommendation": "Startup logging will be created on next run"
|
|
@@ -135,7 +136,7 @@ class StartupLogCheck(BaseDiagnosticCheck):
|
|
|
135
136
|
sub_results.append(
|
|
136
137
|
DiagnosticResult(
|
|
137
138
|
category="Error",
|
|
138
|
-
status=
|
|
139
|
+
status=ValidationSeverity.ERROR,
|
|
139
140
|
message=error_type,
|
|
140
141
|
details={"fix": fix},
|
|
141
142
|
)
|
|
@@ -153,7 +154,7 @@ class StartupLogCheck(BaseDiagnosticCheck):
|
|
|
153
154
|
except Exception as e:
|
|
154
155
|
return DiagnosticResult(
|
|
155
156
|
category=self.category,
|
|
156
|
-
status=
|
|
157
|
+
status=ValidationSeverity.ERROR,
|
|
157
158
|
message=f"Startup log check failed: {e!s}",
|
|
158
159
|
details={"error": str(e)},
|
|
159
160
|
)
|
|
@@ -280,13 +281,13 @@ class StartupLogCheck(BaseDiagnosticCheck):
|
|
|
280
281
|
|
|
281
282
|
analysis["recommendations"] = recommendations
|
|
282
283
|
|
|
283
|
-
def _determine_status(self, analysis: Dict[str, Any])
|
|
284
|
+
def _determine_status(self, analysis: Dict[str, Any]):
|
|
284
285
|
"""Determine overall status based on analysis."""
|
|
285
286
|
if analysis["error_count"] > 0:
|
|
286
|
-
return
|
|
287
|
+
return ValidationSeverity.ERROR
|
|
287
288
|
if analysis["warning_count"] > 3 or analysis["warning_count"] > 0:
|
|
288
|
-
return
|
|
289
|
-
return
|
|
289
|
+
return ValidationSeverity.WARNING
|
|
290
|
+
return OperationResult.SUCCESS
|
|
290
291
|
|
|
291
292
|
def _create_message(self, analysis: Dict[str, Any]) -> str:
|
|
292
293
|
"""Create summary message based on analysis."""
|