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
|
@@ -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
|
)
|
|
@@ -11,8 +11,8 @@ import sys
|
|
|
11
11
|
from pathlib import Path
|
|
12
12
|
from typing import Optional
|
|
13
13
|
|
|
14
|
-
from ....core.enums import OperationResult
|
|
15
|
-
from ..models import DiagnosticResult
|
|
14
|
+
from ....core.enums import OperationResult, ValidationSeverity
|
|
15
|
+
from ..models import DiagnosticResult
|
|
16
16
|
from .base_check import BaseDiagnosticCheck
|
|
17
17
|
|
|
18
18
|
|
|
@@ -55,14 +55,14 @@ class InstallationCheck(BaseDiagnosticCheck):
|
|
|
55
55
|
details["dependencies"] = deps_result.details.get("status")
|
|
56
56
|
|
|
57
57
|
# Determine overall status
|
|
58
|
-
if any(r.status ==
|
|
59
|
-
status =
|
|
58
|
+
if any(r.status == ValidationSeverity.ERROR for r in sub_results):
|
|
59
|
+
status = ValidationSeverity.ERROR
|
|
60
60
|
message = "Installation has critical issues"
|
|
61
|
-
elif any(r.status ==
|
|
62
|
-
status =
|
|
61
|
+
elif any(r.status == ValidationSeverity.WARNING for r in sub_results):
|
|
62
|
+
status = ValidationSeverity.WARNING
|
|
63
63
|
message = "Installation has minor issues"
|
|
64
64
|
else:
|
|
65
|
-
status =
|
|
65
|
+
status = OperationResult.SUCCESS
|
|
66
66
|
message = "Installation is healthy"
|
|
67
67
|
|
|
68
68
|
return DiagnosticResult(
|
|
@@ -76,7 +76,7 @@ class InstallationCheck(BaseDiagnosticCheck):
|
|
|
76
76
|
except Exception as e:
|
|
77
77
|
return DiagnosticResult(
|
|
78
78
|
category=self.category,
|
|
79
|
-
status=
|
|
79
|
+
status=ValidationSeverity.ERROR,
|
|
80
80
|
message=f"Installation check failed: {e!s}",
|
|
81
81
|
details={"error": str(e)},
|
|
82
82
|
)
|
|
@@ -92,7 +92,7 @@ class InstallationCheck(BaseDiagnosticCheck):
|
|
|
92
92
|
if version_info < min_version:
|
|
93
93
|
return DiagnosticResult(
|
|
94
94
|
category="Python Version",
|
|
95
|
-
status=
|
|
95
|
+
status=ValidationSeverity.ERROR,
|
|
96
96
|
message=f"Python {version_info.major}.{version_info.minor} is below minimum required {min_version[0]}.{min_version[1]}",
|
|
97
97
|
details={"version": version},
|
|
98
98
|
fix_description="Upgrade Python to 3.9 or higher",
|
|
@@ -100,13 +100,13 @@ class InstallationCheck(BaseDiagnosticCheck):
|
|
|
100
100
|
if version_info < recommended_version:
|
|
101
101
|
return DiagnosticResult(
|
|
102
102
|
category="Python Version",
|
|
103
|
-
status=
|
|
103
|
+
status=ValidationSeverity.WARNING,
|
|
104
104
|
message=f"Python {version_info.major}.{version_info.minor} works but {recommended_version[0]}.{recommended_version[1]}+ is recommended",
|
|
105
105
|
details={"version": version},
|
|
106
106
|
)
|
|
107
107
|
return DiagnosticResult(
|
|
108
108
|
category="Python Version",
|
|
109
|
-
status=
|
|
109
|
+
status=OperationResult.SUCCESS,
|
|
110
110
|
message=f"Python {version_info.major}.{version_info.minor}.{version_info.micro}",
|
|
111
111
|
details={"version": version},
|
|
112
112
|
)
|
|
@@ -123,7 +123,7 @@ class InstallationCheck(BaseDiagnosticCheck):
|
|
|
123
123
|
|
|
124
124
|
return DiagnosticResult(
|
|
125
125
|
category="Claude MPM Version",
|
|
126
|
-
status=
|
|
126
|
+
status=OperationResult.SUCCESS,
|
|
127
127
|
message=f"Version: {version}",
|
|
128
128
|
details={
|
|
129
129
|
"version": semantic_version,
|
|
@@ -134,7 +134,7 @@ class InstallationCheck(BaseDiagnosticCheck):
|
|
|
134
134
|
except Exception as e:
|
|
135
135
|
return DiagnosticResult(
|
|
136
136
|
category="Claude MPM Version",
|
|
137
|
-
status=
|
|
137
|
+
status=ValidationSeverity.WARNING,
|
|
138
138
|
message="Could not determine version",
|
|
139
139
|
details={"error": str(e)},
|
|
140
140
|
)
|
|
@@ -244,7 +244,7 @@ class InstallationCheck(BaseDiagnosticCheck):
|
|
|
244
244
|
if not methods_found:
|
|
245
245
|
return DiagnosticResult(
|
|
246
246
|
category="Installation Method",
|
|
247
|
-
status=
|
|
247
|
+
status=ValidationSeverity.WARNING,
|
|
248
248
|
message="Installation method unknown",
|
|
249
249
|
details=details,
|
|
250
250
|
)
|
|
@@ -260,7 +260,7 @@ class InstallationCheck(BaseDiagnosticCheck):
|
|
|
260
260
|
container_msg += " with virtual environment"
|
|
261
261
|
return DiagnosticResult(
|
|
262
262
|
category="Installation Method",
|
|
263
|
-
status=
|
|
263
|
+
status=OperationResult.SUCCESS,
|
|
264
264
|
message=container_msg,
|
|
265
265
|
details=details,
|
|
266
266
|
)
|
|
@@ -269,7 +269,7 @@ class InstallationCheck(BaseDiagnosticCheck):
|
|
|
269
269
|
if "pipx" in methods_found:
|
|
270
270
|
return DiagnosticResult(
|
|
271
271
|
category="Installation Method",
|
|
272
|
-
status=
|
|
272
|
+
status=OperationResult.SUCCESS,
|
|
273
273
|
message="Running from pipx environment (recommended)",
|
|
274
274
|
details=details,
|
|
275
275
|
)
|
|
@@ -279,7 +279,7 @@ class InstallationCheck(BaseDiagnosticCheck):
|
|
|
279
279
|
venv_name = Path(sys.prefix).name
|
|
280
280
|
return DiagnosticResult(
|
|
281
281
|
category="Installation Method",
|
|
282
|
-
status=
|
|
282
|
+
status=OperationResult.SUCCESS,
|
|
283
283
|
message=f"Development mode in virtual environment '{venv_name}'",
|
|
284
284
|
details=details,
|
|
285
285
|
)
|
|
@@ -289,7 +289,7 @@ class InstallationCheck(BaseDiagnosticCheck):
|
|
|
289
289
|
venv_name = Path(sys.prefix).name
|
|
290
290
|
return DiagnosticResult(
|
|
291
291
|
category="Installation Method",
|
|
292
|
-
status=
|
|
292
|
+
status=OperationResult.SUCCESS,
|
|
293
293
|
message=f"Virtual environment '{venv_name}'",
|
|
294
294
|
details=details,
|
|
295
295
|
)
|
|
@@ -298,7 +298,7 @@ class InstallationCheck(BaseDiagnosticCheck):
|
|
|
298
298
|
if "development" in methods_found and "homebrew" in methods_found:
|
|
299
299
|
return DiagnosticResult(
|
|
300
300
|
category="Installation Method",
|
|
301
|
-
status=
|
|
301
|
+
status=OperationResult.SUCCESS,
|
|
302
302
|
message="Development mode with Homebrew Python",
|
|
303
303
|
details=details,
|
|
304
304
|
)
|
|
@@ -306,7 +306,7 @@ class InstallationCheck(BaseDiagnosticCheck):
|
|
|
306
306
|
if "development" in methods_found:
|
|
307
307
|
return DiagnosticResult(
|
|
308
308
|
category="Installation Method",
|
|
309
|
-
status=
|
|
309
|
+
status=OperationResult.SUCCESS,
|
|
310
310
|
message="Development mode",
|
|
311
311
|
details=details,
|
|
312
312
|
)
|
|
@@ -316,9 +316,9 @@ class InstallationCheck(BaseDiagnosticCheck):
|
|
|
316
316
|
msg = "Homebrew Python"
|
|
317
317
|
if details.get("pipx_installed"):
|
|
318
318
|
msg += " (pipx is installed but not active - consider using 'pipx run claude-mpm')"
|
|
319
|
-
status =
|
|
319
|
+
status = ValidationSeverity.WARNING
|
|
320
320
|
else:
|
|
321
|
-
status =
|
|
321
|
+
status = OperationResult.SUCCESS
|
|
322
322
|
return DiagnosticResult(
|
|
323
323
|
category="Installation Method",
|
|
324
324
|
status=status,
|
|
@@ -330,7 +330,7 @@ class InstallationCheck(BaseDiagnosticCheck):
|
|
|
330
330
|
if "pip" in methods_found:
|
|
331
331
|
return DiagnosticResult(
|
|
332
332
|
category="Installation Method",
|
|
333
|
-
status=
|
|
333
|
+
status=ValidationSeverity.WARNING,
|
|
334
334
|
message="System pip installation (consider using pipx or venv instead)",
|
|
335
335
|
details=details,
|
|
336
336
|
fix_description="Consider reinstalling with pipx for isolated environment",
|
|
@@ -340,7 +340,7 @@ class InstallationCheck(BaseDiagnosticCheck):
|
|
|
340
340
|
if "system" in methods_found:
|
|
341
341
|
return DiagnosticResult(
|
|
342
342
|
category="Installation Method",
|
|
343
|
-
status=
|
|
343
|
+
status=ValidationSeverity.WARNING,
|
|
344
344
|
message="System Python (consider using pipx or venv)",
|
|
345
345
|
details=details,
|
|
346
346
|
)
|
|
@@ -348,7 +348,7 @@ class InstallationCheck(BaseDiagnosticCheck):
|
|
|
348
348
|
# Fallback for any other combination
|
|
349
349
|
return DiagnosticResult(
|
|
350
350
|
category="Installation Method",
|
|
351
|
-
status=
|
|
351
|
+
status=OperationResult.SUCCESS,
|
|
352
352
|
message=f"Installed via {', '.join(methods_found)}",
|
|
353
353
|
details=details,
|
|
354
354
|
)
|
|
@@ -400,7 +400,7 @@ class InstallationCheck(BaseDiagnosticCheck):
|
|
|
400
400
|
|
|
401
401
|
return DiagnosticResult(
|
|
402
402
|
category="Dependencies",
|
|
403
|
-
status=
|
|
403
|
+
status=ValidationSeverity.ERROR,
|
|
404
404
|
message=f"Missing critical dependencies: {', '.join(missing)}",
|
|
405
405
|
details={
|
|
406
406
|
"missing": missing,
|
|
@@ -415,7 +415,7 @@ class InstallationCheck(BaseDiagnosticCheck):
|
|
|
415
415
|
if warnings:
|
|
416
416
|
return DiagnosticResult(
|
|
417
417
|
category="Dependencies",
|
|
418
|
-
status=
|
|
418
|
+
status=ValidationSeverity.WARNING,
|
|
419
419
|
message=f"Missing optional dependencies: {', '.join(warnings)}",
|
|
420
420
|
details={
|
|
421
421
|
"optional_missing": warnings,
|
|
@@ -427,7 +427,7 @@ class InstallationCheck(BaseDiagnosticCheck):
|
|
|
427
427
|
)
|
|
428
428
|
return DiagnosticResult(
|
|
429
429
|
category="Dependencies",
|
|
430
|
-
status=
|
|
430
|
+
status=OperationResult.SUCCESS,
|
|
431
431
|
message="All dependencies installed",
|
|
432
432
|
details={
|
|
433
433
|
"status": OperationResult.COMPLETED,
|
|
@@ -11,7 +11,8 @@ from collections import defaultdict
|
|
|
11
11
|
from pathlib import Path
|
|
12
12
|
from typing import Dict
|
|
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
|
|
|
@@ -77,14 +78,14 @@ class InstructionsCheck(BaseDiagnosticCheck):
|
|
|
77
78
|
sub_results.append(separation_result)
|
|
78
79
|
|
|
79
80
|
# Determine overall status
|
|
80
|
-
if any(r.status ==
|
|
81
|
-
status =
|
|
81
|
+
if any(r.status == ValidationSeverity.ERROR for r in sub_results):
|
|
82
|
+
status = ValidationSeverity.ERROR
|
|
82
83
|
message = "Found critical issues with instruction files"
|
|
83
|
-
elif any(r.status ==
|
|
84
|
-
status =
|
|
84
|
+
elif any(r.status == ValidationSeverity.WARNING for r in sub_results):
|
|
85
|
+
status = ValidationSeverity.WARNING
|
|
85
86
|
message = "Found minor issues with instruction files"
|
|
86
87
|
else:
|
|
87
|
-
status =
|
|
88
|
+
status = OperationResult.SUCCESS
|
|
88
89
|
message = "Instruction files are properly configured"
|
|
89
90
|
|
|
90
91
|
return DiagnosticResult(
|
|
@@ -98,7 +99,7 @@ class InstructionsCheck(BaseDiagnosticCheck):
|
|
|
98
99
|
except Exception as e:
|
|
99
100
|
return DiagnosticResult(
|
|
100
101
|
category=self.category,
|
|
101
|
-
status=
|
|
102
|
+
status=ValidationSeverity.ERROR,
|
|
102
103
|
message=f"Instructions check failed: {e!s}",
|
|
103
104
|
details={"error": str(e)},
|
|
104
105
|
)
|
|
@@ -146,7 +147,7 @@ class InstructionsCheck(BaseDiagnosticCheck):
|
|
|
146
147
|
if not claude_files:
|
|
147
148
|
return DiagnosticResult(
|
|
148
149
|
category="CLAUDE.md Placement",
|
|
149
|
-
status=
|
|
150
|
+
status=OperationResult.SUCCESS,
|
|
150
151
|
message="No CLAUDE.md files found",
|
|
151
152
|
details={},
|
|
152
153
|
)
|
|
@@ -170,7 +171,7 @@ class InstructionsCheck(BaseDiagnosticCheck):
|
|
|
170
171
|
if issues:
|
|
171
172
|
return DiagnosticResult(
|
|
172
173
|
category="CLAUDE.md Placement",
|
|
173
|
-
status=
|
|
174
|
+
status=ValidationSeverity.WARNING,
|
|
174
175
|
message=f"Found {len(issues)} misplaced CLAUDE.md file(s)",
|
|
175
176
|
details={"issues": issues},
|
|
176
177
|
fix_description=(
|
|
@@ -181,7 +182,7 @@ class InstructionsCheck(BaseDiagnosticCheck):
|
|
|
181
182
|
|
|
182
183
|
return DiagnosticResult(
|
|
183
184
|
category="CLAUDE.md Placement",
|
|
184
|
-
status=
|
|
185
|
+
status=OperationResult.SUCCESS,
|
|
185
186
|
message="CLAUDE.md properly placed in project root",
|
|
186
187
|
details={"count": len(claude_files)},
|
|
187
188
|
)
|
|
@@ -191,7 +192,7 @@ class InstructionsCheck(BaseDiagnosticCheck):
|
|
|
191
192
|
if len(files) < 2:
|
|
192
193
|
return DiagnosticResult(
|
|
193
194
|
category="Duplicate Content",
|
|
194
|
-
status=
|
|
195
|
+
status=OperationResult.SUCCESS,
|
|
195
196
|
message="No duplicate content detected",
|
|
196
197
|
details={},
|
|
197
198
|
)
|
|
@@ -226,7 +227,7 @@ class InstructionsCheck(BaseDiagnosticCheck):
|
|
|
226
227
|
if duplicates:
|
|
227
228
|
return DiagnosticResult(
|
|
228
229
|
category="Duplicate Content",
|
|
229
|
-
status=
|
|
230
|
+
status=ValidationSeverity.WARNING,
|
|
230
231
|
message=f"Found {len(duplicates)} duplicate content block(s)",
|
|
231
232
|
details={"duplicates": duplicates[:5]}, # Limit to first 5
|
|
232
233
|
fix_description=(
|
|
@@ -238,7 +239,7 @@ class InstructionsCheck(BaseDiagnosticCheck):
|
|
|
238
239
|
|
|
239
240
|
return DiagnosticResult(
|
|
240
241
|
category="Duplicate Content",
|
|
241
|
-
status=
|
|
242
|
+
status=OperationResult.SUCCESS,
|
|
242
243
|
message="No significant duplicate content found",
|
|
243
244
|
details={},
|
|
244
245
|
)
|
|
@@ -280,7 +281,7 @@ class InstructionsCheck(BaseDiagnosticCheck):
|
|
|
280
281
|
if conflicts:
|
|
281
282
|
return DiagnosticResult(
|
|
282
283
|
category="Conflicting Directives",
|
|
283
|
-
status=
|
|
284
|
+
status=ValidationSeverity.ERROR,
|
|
284
285
|
message=f"Found {len(conflicts)} potential conflict(s)",
|
|
285
286
|
details={"conflicts": conflicts},
|
|
286
287
|
fix_description=(
|
|
@@ -292,7 +293,7 @@ class InstructionsCheck(BaseDiagnosticCheck):
|
|
|
292
293
|
|
|
293
294
|
return DiagnosticResult(
|
|
294
295
|
category="Conflicting Directives",
|
|
295
|
-
status=
|
|
296
|
+
status=OperationResult.SUCCESS,
|
|
296
297
|
message="No conflicting directives detected",
|
|
297
298
|
details={},
|
|
298
299
|
)
|
|
@@ -330,7 +331,7 @@ class InstructionsCheck(BaseDiagnosticCheck):
|
|
|
330
331
|
if duplicates:
|
|
331
332
|
return DiagnosticResult(
|
|
332
333
|
category="Agent Definitions",
|
|
333
|
-
status=
|
|
334
|
+
status=ValidationSeverity.WARNING,
|
|
334
335
|
message=f"Found {len(duplicates)} duplicate agent definition(s)",
|
|
335
336
|
details={"duplicates": duplicates},
|
|
336
337
|
fix_description=(
|
|
@@ -341,7 +342,7 @@ class InstructionsCheck(BaseDiagnosticCheck):
|
|
|
341
342
|
|
|
342
343
|
return DiagnosticResult(
|
|
343
344
|
category="Agent Definitions",
|
|
344
|
-
status=
|
|
345
|
+
status=OperationResult.SUCCESS,
|
|
345
346
|
message="Agent definitions are unique",
|
|
346
347
|
details={"total_agents": len(agent_definitions)},
|
|
347
348
|
)
|
|
@@ -396,7 +397,7 @@ class InstructionsCheck(BaseDiagnosticCheck):
|
|
|
396
397
|
if issues:
|
|
397
398
|
return DiagnosticResult(
|
|
398
399
|
category="Separation of Concerns",
|
|
399
|
-
status=
|
|
400
|
+
status=ValidationSeverity.WARNING,
|
|
400
401
|
message=f"Found {len(issues)} separation of concerns issue(s)",
|
|
401
402
|
details={"issues": issues},
|
|
402
403
|
fix_description=(
|
|
@@ -409,7 +410,7 @@ class InstructionsCheck(BaseDiagnosticCheck):
|
|
|
409
410
|
|
|
410
411
|
return DiagnosticResult(
|
|
411
412
|
category="Separation of Concerns",
|
|
412
|
-
status=
|
|
413
|
+
status=OperationResult.SUCCESS,
|
|
413
414
|
message="Instruction files properly separated",
|
|
414
415
|
details={},
|
|
415
416
|
)
|