claude-mpm 4.13.1__py3-none-any.whl → 4.14.0__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.

Files changed (50) hide show
  1. claude_mpm/VERSION +1 -1
  2. claude_mpm/agents/PM_INSTRUCTIONS.md +68 -0
  3. claude_mpm/cli/__init__.py +10 -0
  4. claude_mpm/cli/commands/local_deploy.py +536 -0
  5. claude_mpm/cli/parsers/base_parser.py +7 -0
  6. claude_mpm/cli/parsers/local_deploy_parser.py +227 -0
  7. claude_mpm/commands/mpm-agents-detect.md +168 -0
  8. claude_mpm/commands/mpm-agents-recommend.md +214 -0
  9. claude_mpm/commands/mpm-agents.md +75 -1
  10. claude_mpm/commands/mpm-auto-configure.md +217 -0
  11. claude_mpm/commands/mpm-help.md +160 -0
  12. claude_mpm/config/model_config.py +428 -0
  13. claude_mpm/core/interactive_session.py +3 -0
  14. claude_mpm/services/core/interfaces/__init__.py +74 -2
  15. claude_mpm/services/core/interfaces/health.py +172 -0
  16. claude_mpm/services/core/interfaces/model.py +281 -0
  17. claude_mpm/services/core/interfaces/process.py +372 -0
  18. claude_mpm/services/core/interfaces/restart.py +307 -0
  19. claude_mpm/services/core/interfaces/stability.py +260 -0
  20. claude_mpm/services/core/models/__init__.py +35 -0
  21. claude_mpm/services/core/models/health.py +189 -0
  22. claude_mpm/services/core/models/process.py +258 -0
  23. claude_mpm/services/core/models/restart.py +302 -0
  24. claude_mpm/services/core/models/stability.py +264 -0
  25. claude_mpm/services/local_ops/__init__.py +163 -0
  26. claude_mpm/services/local_ops/crash_detector.py +257 -0
  27. claude_mpm/services/local_ops/health_checks/__init__.py +28 -0
  28. claude_mpm/services/local_ops/health_checks/http_check.py +223 -0
  29. claude_mpm/services/local_ops/health_checks/process_check.py +235 -0
  30. claude_mpm/services/local_ops/health_checks/resource_check.py +254 -0
  31. claude_mpm/services/local_ops/health_manager.py +430 -0
  32. claude_mpm/services/local_ops/log_monitor.py +396 -0
  33. claude_mpm/services/local_ops/memory_leak_detector.py +294 -0
  34. claude_mpm/services/local_ops/process_manager.py +595 -0
  35. claude_mpm/services/local_ops/resource_monitor.py +331 -0
  36. claude_mpm/services/local_ops/restart_manager.py +401 -0
  37. claude_mpm/services/local_ops/restart_policy.py +387 -0
  38. claude_mpm/services/local_ops/state_manager.py +371 -0
  39. claude_mpm/services/local_ops/unified_manager.py +600 -0
  40. claude_mpm/services/model/__init__.py +147 -0
  41. claude_mpm/services/model/base_provider.py +365 -0
  42. claude_mpm/services/model/claude_provider.py +412 -0
  43. claude_mpm/services/model/model_router.py +453 -0
  44. claude_mpm/services/model/ollama_provider.py +415 -0
  45. {claude_mpm-4.13.1.dist-info → claude_mpm-4.14.0.dist-info}/METADATA +1 -1
  46. {claude_mpm-4.13.1.dist-info → claude_mpm-4.14.0.dist-info}/RECORD +50 -15
  47. {claude_mpm-4.13.1.dist-info → claude_mpm-4.14.0.dist-info}/WHEEL +0 -0
  48. {claude_mpm-4.13.1.dist-info → claude_mpm-4.14.0.dist-info}/entry_points.txt +0 -0
  49. {claude_mpm-4.13.1.dist-info → claude_mpm-4.14.0.dist-info}/licenses/LICENSE +0 -0
  50. {claude_mpm-4.13.1.dist-info → claude_mpm-4.14.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,415 @@
1
+ """
2
+ Ollama Model Provider Implementation for Claude MPM Framework
3
+ =============================================================
4
+
5
+ WHY: Enables local model execution via Ollama for privacy-sensitive content
6
+ analysis. Provides cost-effective alternative to cloud APIs with full control
7
+ over model selection and hosting.
8
+
9
+ DESIGN DECISION: Uses direct HTTP API calls to Ollama service rather than
10
+ heavyweight LangChain dependency. Keeps implementation lightweight and focused.
11
+
12
+ ARCHITECTURE:
13
+ - Direct integration with Ollama API (http://localhost:11434 by default)
14
+ - Task-specific model mapping based on research recommendations
15
+ - Automatic model availability checking and validation
16
+ - Graceful degradation when Ollama not available
17
+
18
+ RECOMMENDED MODELS (from research):
19
+ - SEO Analysis: llama3.3:70b (comprehensive analysis)
20
+ - Readability: gemma2:9b (fast, accurate)
21
+ - Grammar: qwen3:14b (specialized for grammar)
22
+ - Summarization: mistral:7b (concise summaries)
23
+ - Keyword Extraction: seoassistant (specialized SEO tool)
24
+ - General: gemma2:9b (good default balance)
25
+ """
26
+
27
+ import asyncio
28
+ from typing import Any, Dict, List, Optional
29
+
30
+ import aiohttp
31
+
32
+ from claude_mpm.services.core.interfaces.model import ModelCapability, ModelResponse
33
+ from claude_mpm.services.model.base_provider import BaseModelProvider
34
+
35
+
36
+ class OllamaProvider(BaseModelProvider):
37
+ """
38
+ Ollama local model provider.
39
+
40
+ WHY: Provides privacy-preserving local content analysis without sending
41
+ data to cloud services. Cost-effective for high-volume processing.
42
+
43
+ Configuration:
44
+ host: Ollama API endpoint (default: http://localhost:11434)
45
+ timeout: Request timeout in seconds (default: 30)
46
+ models: Dict mapping capabilities to model names (optional)
47
+
48
+ Usage:
49
+ provider = OllamaProvider(config={
50
+ "host": "http://localhost:11434",
51
+ "models": {
52
+ "seo_analysis": "llama3.3:70b"
53
+ }
54
+ })
55
+
56
+ if await provider.is_available():
57
+ response = await provider.analyze_content(
58
+ content="Your content",
59
+ task=ModelCapability.SEO_ANALYSIS
60
+ )
61
+ """
62
+
63
+ # Default model mappings based on research recommendations
64
+ DEFAULT_MODELS: Dict[ModelCapability, str] = {
65
+ ModelCapability.SEO_ANALYSIS: "llama3.3:70b",
66
+ ModelCapability.READABILITY: "gemma2:9b",
67
+ ModelCapability.GRAMMAR: "qwen3:14b",
68
+ ModelCapability.SUMMARIZATION: "mistral:7b",
69
+ ModelCapability.KEYWORD_EXTRACTION: "seoassistant",
70
+ ModelCapability.ACCESSIBILITY: "gemma2:9b",
71
+ ModelCapability.SENTIMENT: "gemma2:9b",
72
+ ModelCapability.GENERAL: "gemma2:9b",
73
+ }
74
+
75
+ def __init__(self, config: Optional[Dict[str, Any]] = None):
76
+ """
77
+ Initialize Ollama provider.
78
+
79
+ Args:
80
+ config: Configuration dict with:
81
+ - host: Ollama API endpoint
82
+ - timeout: Request timeout in seconds
83
+ - models: Custom model mappings
84
+ """
85
+ super().__init__(provider_name="ollama", config=config or {})
86
+
87
+ self.host = self.get_config("host", "http://localhost:11434")
88
+ self.timeout = self.get_config("timeout", 30)
89
+
90
+ # Merge custom models with defaults
91
+ custom_models = self.get_config("models", {})
92
+ self.model_mapping = self.DEFAULT_MODELS.copy()
93
+ if custom_models:
94
+ # Convert string keys to ModelCapability if needed
95
+ for key, value in custom_models.items():
96
+ if isinstance(key, str):
97
+ try:
98
+ capability = ModelCapability(key)
99
+ self.model_mapping[capability] = value
100
+ except ValueError:
101
+ self.log_warning(f"Unknown capability in config: {key}")
102
+ else:
103
+ self.model_mapping[key] = value
104
+
105
+ self._session: Optional[aiohttp.ClientSession] = None
106
+ self._available_models: List[str] = []
107
+
108
+ async def initialize(self) -> bool:
109
+ """
110
+ Initialize Ollama provider.
111
+
112
+ Returns:
113
+ True if initialization successful
114
+ """
115
+ self.log_info(f"Initializing Ollama provider at {self.host}")
116
+
117
+ # Create HTTP session
118
+ timeout = aiohttp.ClientTimeout(total=self.timeout)
119
+ self._session = aiohttp.ClientSession(timeout=timeout)
120
+
121
+ # Check availability
122
+ if not await self.is_available():
123
+ self.log_warning("Ollama service not available")
124
+ self._initialized = False
125
+ return False
126
+
127
+ # Fetch available models
128
+ self._available_models = await self.get_available_models()
129
+ self.log_info(f"Found {len(self._available_models)} available models")
130
+
131
+ self._initialized = True
132
+ return True
133
+
134
+ async def shutdown(self) -> None:
135
+ """Shutdown provider and cleanup resources."""
136
+ self.log_info("Shutting down Ollama provider")
137
+
138
+ if self._session and not self._session.closed:
139
+ await self._session.close()
140
+
141
+ self._shutdown = True
142
+
143
+ async def is_available(self) -> bool:
144
+ """
145
+ Check if Ollama service is available.
146
+
147
+ WHY: Enables auto-fallback routing. Returns False if service
148
+ is not running or unreachable.
149
+
150
+ Returns:
151
+ True if Ollama is reachable and functional
152
+ """
153
+ try:
154
+ # Ensure we have a session
155
+ if not self._session or self._session.closed:
156
+ timeout = aiohttp.ClientTimeout(total=5)
157
+ self._session = aiohttp.ClientSession(timeout=timeout)
158
+
159
+ # Try to fetch tags (models list)
160
+ async with self._session.get(f"{self.host}/api/tags") as response:
161
+ if response.status == 200:
162
+ return True
163
+ self.log_warning(f"Ollama returned status {response.status}")
164
+ return False
165
+
166
+ except aiohttp.ClientError as e:
167
+ self.log_debug(f"Ollama not available: {e}")
168
+ return False
169
+ except Exception as e:
170
+ self.log_warning(f"Error checking Ollama availability: {e}")
171
+ return False
172
+
173
+ async def get_available_models(self) -> List[str]:
174
+ """
175
+ List available models from Ollama.
176
+
177
+ Returns:
178
+ List of model names (e.g., ["llama3.3:70b", "gemma2:9b"])
179
+ """
180
+ try:
181
+ if not self._session or self._session.closed:
182
+ timeout = aiohttp.ClientTimeout(total=5)
183
+ self._session = aiohttp.ClientSession(timeout=timeout)
184
+
185
+ async with self._session.get(f"{self.host}/api/tags") as response:
186
+ if response.status == 200:
187
+ data = await response.json()
188
+ return [model["name"] for model in data.get("models", [])]
189
+ self.log_error(f"Failed to fetch models: status {response.status}")
190
+ return []
191
+
192
+ except Exception as e:
193
+ self.log_error(f"Error fetching available models: {e}")
194
+ return []
195
+
196
+ def get_supported_capabilities(self) -> List[ModelCapability]:
197
+ """
198
+ Return all supported capabilities.
199
+
200
+ WHY: Ollama supports all capabilities, routing to different models.
201
+
202
+ Returns:
203
+ List of all ModelCapability values
204
+ """
205
+ return list(ModelCapability)
206
+
207
+ def _get_model_for_task(self, task: ModelCapability) -> str:
208
+ """
209
+ Get optimal model for task.
210
+
211
+ Args:
212
+ task: Task capability
213
+
214
+ Returns:
215
+ Model name from mapping
216
+ """
217
+ return self.model_mapping.get(
218
+ task, self.DEFAULT_MODELS[ModelCapability.GENERAL]
219
+ )
220
+
221
+ async def analyze_content(
222
+ self,
223
+ content: str,
224
+ task: ModelCapability,
225
+ model: Optional[str] = None,
226
+ **kwargs,
227
+ ) -> ModelResponse:
228
+ """
229
+ Analyze content using Ollama model.
230
+
231
+ Args:
232
+ content: Text content to analyze
233
+ task: Type of analysis
234
+ model: Optional specific model (overrides task mapping)
235
+ **kwargs: Additional options:
236
+ - temperature: Sampling temperature (0.0-1.0)
237
+ - max_tokens: Maximum response tokens
238
+ - stream: Enable streaming (not yet implemented)
239
+
240
+ Returns:
241
+ ModelResponse with analysis results
242
+ """
243
+ # Validate content
244
+ if not self.validate_content(content, max_length=100000):
245
+ return self.create_response(
246
+ success=False,
247
+ model=model or "unknown",
248
+ task=task,
249
+ error="Invalid content provided",
250
+ )
251
+
252
+ # Check if initialized
253
+ if not self._initialized:
254
+ await self.initialize()
255
+
256
+ if not self._initialized:
257
+ return self.create_response(
258
+ success=False,
259
+ model=model or "unknown",
260
+ task=task,
261
+ error="Ollama provider not initialized",
262
+ )
263
+
264
+ # Select model
265
+ selected_model = model or self._get_model_for_task(task)
266
+
267
+ # Check if model is available
268
+ if selected_model not in self._available_models:
269
+ self.log_warning(
270
+ f"Model {selected_model} not found. "
271
+ f"Available: {', '.join(self._available_models[:5])}..."
272
+ )
273
+ return self.create_response(
274
+ success=False,
275
+ model=selected_model,
276
+ task=task,
277
+ error=f"Model {selected_model} not available in Ollama",
278
+ )
279
+
280
+ # Generate prompt
281
+ prompt = self.get_task_prompt(task, content)
282
+
283
+ # Call Ollama API with retry logic
284
+ return await self.analyze_with_retry(
285
+ self._call_ollama,
286
+ prompt,
287
+ task,
288
+ selected_model,
289
+ **kwargs,
290
+ )
291
+
292
+ async def _call_ollama(
293
+ self,
294
+ prompt: str,
295
+ task: ModelCapability,
296
+ model: str,
297
+ **kwargs,
298
+ ) -> ModelResponse:
299
+ """
300
+ Internal method to call Ollama API.
301
+
302
+ Args:
303
+ prompt: Generated prompt
304
+ task: Task capability
305
+ model: Model to use
306
+ **kwargs: Additional options
307
+
308
+ Returns:
309
+ ModelResponse
310
+ """
311
+ try:
312
+ # Prepare request
313
+ payload = {
314
+ "model": model,
315
+ "prompt": prompt,
316
+ "stream": False, # TODO: Implement streaming
317
+ "options": {},
318
+ }
319
+
320
+ # Add optional parameters
321
+ if "temperature" in kwargs:
322
+ payload["options"]["temperature"] = kwargs["temperature"]
323
+ if "max_tokens" in kwargs:
324
+ payload["options"]["num_predict"] = kwargs["max_tokens"]
325
+
326
+ # Make request
327
+ async with self._session.post(
328
+ f"{self.host}/api/generate",
329
+ json=payload,
330
+ ) as response:
331
+ if response.status == 200:
332
+ data = await response.json()
333
+ result_text = data.get("response", "")
334
+
335
+ # Extract metadata
336
+ metadata = {
337
+ "model": model,
338
+ "total_duration": data.get("total_duration", 0)
339
+ / 1e9, # ns to s
340
+ "load_duration": data.get("load_duration", 0) / 1e9,
341
+ "prompt_eval_count": data.get("prompt_eval_count", 0),
342
+ "eval_count": data.get("eval_count", 0),
343
+ }
344
+
345
+ return self.create_response(
346
+ success=True,
347
+ model=model,
348
+ task=task,
349
+ result=result_text,
350
+ metadata=metadata,
351
+ )
352
+ error_text = await response.text()
353
+ return self.create_response(
354
+ success=False,
355
+ model=model,
356
+ task=task,
357
+ error=f"Ollama API error {response.status}: {error_text}",
358
+ )
359
+
360
+ except asyncio.TimeoutError:
361
+ return self.create_response(
362
+ success=False,
363
+ model=model,
364
+ task=task,
365
+ error=f"Request timeout after {self.timeout}s",
366
+ )
367
+ except Exception as e:
368
+ return self.create_response(
369
+ success=False,
370
+ model=model,
371
+ task=task,
372
+ error=f"Request failed: {e!s}",
373
+ )
374
+
375
+ async def get_model_info(self, model: str) -> Dict[str, Any]:
376
+ """
377
+ Get detailed information about a model.
378
+
379
+ Args:
380
+ model: Model name
381
+
382
+ Returns:
383
+ Dictionary with model information
384
+ """
385
+ try:
386
+ if not self._session or self._session.closed:
387
+ timeout = aiohttp.ClientTimeout(total=5)
388
+ self._session = aiohttp.ClientSession(timeout=timeout)
389
+
390
+ async with self._session.post(
391
+ f"{self.host}/api/show",
392
+ json={"name": model},
393
+ ) as response:
394
+ if response.status == 200:
395
+ data = await response.json()
396
+ return {
397
+ "name": model,
398
+ "modelfile": data.get("modelfile", ""),
399
+ "parameters": data.get("parameters", ""),
400
+ "template": data.get("template", ""),
401
+ "details": data.get("details", {}),
402
+ }
403
+ return {
404
+ "name": model,
405
+ "error": f"Status {response.status}",
406
+ }
407
+
408
+ except Exception as e:
409
+ return {
410
+ "name": model,
411
+ "error": str(e),
412
+ }
413
+
414
+
415
+ __all__ = ["OllamaProvider"]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: claude-mpm
3
- Version: 4.13.1
3
+ Version: 4.14.0
4
4
  Summary: Claude Multi-Agent Project Manager - Orchestrate Claude with agent delegation and ticket tracking
5
5
  Author-email: Bob Matsuoka <bob@matsuoka.com>
6
6
  Maintainer: Claude MPM Team
@@ -1,5 +1,5 @@
1
1
  claude_mpm/BUILD_NUMBER,sha256=9JfxhnDtr-8l3kCP2U5TVXSErptHoga8m7XA8zqgGOc,4
2
- claude_mpm/VERSION,sha256=ZWQ9MwsvC5m_OIFP2c-tkiExnFw2ALxqze5YMYSS5AA,7
2
+ claude_mpm/VERSION,sha256=EsbNzYeGHvP0ZGb62vJDP5N02JE01T8kfdSU_SmCX9U,7
3
3
  claude_mpm/__init__.py,sha256=UCw6j9e_tZQ3kJtTqmdfNv7MHyw9nD1jkj80WurwM2g,2064
4
4
  claude_mpm/__main__.py,sha256=Ro5UBWBoQaSAIoSqWAr7zkbLyvi4sSy28WShqAhKJG0,723
5
5
  claude_mpm/constants.py,sha256=sLjJF6Kw7H4V9WWeaEYltM-77TgXqzEMX5vx4ukM5-0,5977
@@ -16,7 +16,7 @@ claude_mpm/agents/BASE_RESEARCH.md,sha256=2DZhDd5XxWWtsyNTBIwvtNWBu1JpFy5R5SAZDH
16
16
  claude_mpm/agents/INSTRUCTIONS_OLD_DEPRECATED.md,sha256=zQZhrhVq9NLCtSjVX-aC0xcgueemSuPhKyv0SjEOyIQ,25852
17
17
  claude_mpm/agents/MEMORY.md,sha256=KbRwY_RYdOvTvFC2DD-ATfwjHkQWJ5PIjlGws_7RmjI,3307
18
18
  claude_mpm/agents/OUTPUT_STYLE.md,sha256=IYbo4jmICihrfnChbdrRpwVk4VobCcNyYqZqd53VXMk,533
19
- claude_mpm/agents/PM_INSTRUCTIONS.md,sha256=8o2i6D-QZDbPIvZxb7EzvFBvPsYklYQsoJ9cFzn8VaY,27638
19
+ claude_mpm/agents/PM_INSTRUCTIONS.md,sha256=sL-SJVMidqhQudyLW6ANKgwNmCdYtWyeUtuU4i34cBg,30363
20
20
  claude_mpm/agents/WORKFLOW.md,sha256=vJ9iXCVqAaeM_yVlXxbcP3bsL210-1BI3ZAanvWv4hI,9085
21
21
  claude_mpm/agents/__init__.py,sha256=jRFxvV_DIZ-NdENa-703Xu3YpwvlQj6yv-mQ6FgmldM,3220
22
22
  claude_mpm/agents/agent-template.yaml,sha256=mRlz5Yd0SmknTeoJWgFkZXzEF5T7OmGBJGs2-KPT93k,1969
@@ -76,7 +76,7 @@ claude_mpm/agents/templates/.claude-mpm/memories/README.md,sha256=vEiG7cPjHRZfwX
76
76
  claude_mpm/agents/templates/.claude-mpm/memories/engineer_memories.md,sha256=KMZSJrQi-wHOwfl2C0m3A4PpC4QuBtDolAtVybGahKc,77
77
77
  claude_mpm/agents/templates/logs/prompts/agent_engineer_20250826_014258_728.md,sha256=UBm4BycXtdaa-_l1VCh0alTGGOUSsnCbpKwbFuI-mUY,2219
78
78
  claude_mpm/agents/templates/logs/prompts/agent_engineer_20250901_010124_142.md,sha256=oPvFSYFnmJ4TkbTe4AZnNHWaJMJ-xqZP2WM6scUKQKo,13089
79
- claude_mpm/cli/__init__.py,sha256=ugJsK0_4hSx_9vzhjHF0oHuSWOlwTxtL70tYpQUSH6U,29745
79
+ claude_mpm/cli/__init__.py,sha256=GHKbVPW76UTMKENKvHKBn4vMDTqlx-Xp1f6TxSj7hr4,30107
80
80
  claude_mpm/cli/__main__.py,sha256=WnVGBwe10InxuZjJRFdwuMF6Gh16aXox6zFgxr0sRXk,847
81
81
  claude_mpm/cli/parser.py,sha256=Vqx9n-6Xo1uNhXR4rThmgWpZXTr0nOtkgDf3oMS9b0g,5855
82
82
  claude_mpm/cli/startup_logging.py,sha256=RTuyd6CbhiFQz7Z07LDDhK_ZAnZfuJ9B0NghVSntHFI,29390
@@ -99,6 +99,7 @@ claude_mpm/cli/commands/dashboard.py,sha256=4jPTmTl97DRNNJlYREWeE1iDdkct1uL-vv24
99
99
  claude_mpm/cli/commands/debug.py,sha256=YCfJ3aYf6hOCvLW_grdfINdEqI4RXVS28VJ7tkZBFS8,47115
100
100
  claude_mpm/cli/commands/doctor.py,sha256=nNKLZG3Qv_UsHNgrmetrWKgS7Pe2Jn5vq5aXyl60wKQ,7310
101
101
  claude_mpm/cli/commands/info.py,sha256=uiZ2GMkfr-4aeme2l6QhzxyawuhtuyVulfCi66yyvOs,7404
102
+ claude_mpm/cli/commands/local_deploy.py,sha256=BTZupWk36_zC0Nc4ANQ6DZa9mevWzVfbTjjJXvLGrzQ,21961
102
103
  claude_mpm/cli/commands/mcp.py,sha256=CLxxRzRNA3zYsiN1YVqks_N_FYThp7tMUIuQe2oZKpM,7153
103
104
  claude_mpm/cli/commands/mcp_command_router.py,sha256=j4tmnPRAmMlmtcP-n8Kl6S4l1vn3YY_dE79R3S4xpQ8,5984
104
105
  claude_mpm/cli/commands/mcp_config.py,sha256=xB5uLPn6QilJu78oVJe-SGC6Vv2AiORuUpLzVf-WWyw,4816
@@ -127,11 +128,12 @@ claude_mpm/cli/parsers/agents_parser.py,sha256=ztzbYFsu4q49MqNKC3oWBPwGPzs5JX4lx
127
128
  claude_mpm/cli/parsers/analyze_code_parser.py,sha256=cpJSMFbc3mqB4qrMBIEZiikzPekC2IQX-cjt9U2fHW4,5356
128
129
  claude_mpm/cli/parsers/analyze_parser.py,sha256=E00Ao0zwzbJPchs_AJt-aoQ7LQEtJPXRCNQ6Piivb4o,3908
129
130
  claude_mpm/cli/parsers/auto_configure_parser.py,sha256=NZWZRb00bsGU7_wgiYiPm2ZcPx1E9zy4Gp7MPecQmUA,7264
130
- claude_mpm/cli/parsers/base_parser.py,sha256=ToWS8WRddEwk-kArkBoZWKkydgqcndh90Fc-wPxhfFU,14467
131
+ claude_mpm/cli/parsers/base_parser.py,sha256=u6Mni33UZHHgiw8b6SwzkaJybVT_1z1nY9WmMFcucAg,14630
131
132
  claude_mpm/cli/parsers/config_parser.py,sha256=wp6NbV8_p9txP28MXFcQrri0JDIfGFM7u4aJbYJXcYQ,2699
132
133
  claude_mpm/cli/parsers/configure_parser.py,sha256=t3cwAQX3BfljDDRJH3i0LplpRprw5jdKcI9Uy3M8xtE,4382
133
134
  claude_mpm/cli/parsers/dashboard_parser.py,sha256=JBCM6v_iZhADr_Fwtk_d3up9AOod1avMab-vkNE61gE,3460
134
135
  claude_mpm/cli/parsers/debug_parser.py,sha256=F7MZdmiXiPfiIPMv21ZUqB2cMT8Ho1LDmpbvCXODLbY,9846
136
+ claude_mpm/cli/parsers/local_deploy_parser.py,sha256=k7CnhRc0zMzb_RtdAF1XlvYed2eJXWBwbu29UuCB0jI,7073
135
137
  claude_mpm/cli/parsers/mcp_parser.py,sha256=2j6ULhdu55Z2k_-Gu2QxIsFoTQFbDCEMSGePXSuPoQQ,6532
136
138
  claude_mpm/cli/parsers/memory_parser.py,sha256=ZwCDxJEgp-w03L-1tZsWTgisiwamP42s424bA5bvDJc,4760
137
139
  claude_mpm/cli/parsers/monitor_parser.py,sha256=PeoznSi_5Bw6THK_Espl8M20o6dKvvBSmFzAbovkaFQ,4920
@@ -149,10 +151,13 @@ claude_mpm/cli_module/args.py,sha256=50_Y3AgMNeidtPjQ5-WZ1o-5Y7G2GAGQwMmllYjVScE
149
151
  claude_mpm/cli_module/commands.py,sha256=zZmjP4J19i9PNMA7gCI5Dl--R1u_H4sCt5ZtOadZkY4,7013
150
152
  claude_mpm/cli_module/migration_example.py,sha256=DtQ59RyoBD6r8FIfrjKXCQ8-xnUiOqP5McBiS6_W1Qc,5183
151
153
  claude_mpm/commands/__init__.py,sha256=paX5Ub5-UmRgiQ8UgKWIKwU2-RjLu67OmNJND-fVtjg,588
152
- claude_mpm/commands/mpm-agents.md,sha256=JnYPJ-eWvIEEtiCB6iPu182P2xDBRvU3ArVXQ7h32kU,1341
154
+ claude_mpm/commands/mpm-agents-detect.md,sha256=CL3arw_hMNHWT7SuD59lfBZ0TGMNdokMw12VDcG3AnI,4862
155
+ claude_mpm/commands/mpm-agents-recommend.md,sha256=2TJYFzJLTdULVJ19RK2w802fqSEgYI1BkAaOUgE_l7I,7121
156
+ claude_mpm/commands/mpm-agents.md,sha256=Mq1BOVP6ejRLYZCHE-K1fZ2HaiND_BaYEfc9SO5XCxQ,3586
157
+ claude_mpm/commands/mpm-auto-configure.md,sha256=vJtXiaEiujmozhKhqU8GsO95gHLs0QQAzkyYfqPkgzQ,5130
153
158
  claude_mpm/commands/mpm-config.md,sha256=79Eb-srRpEVV3HCHDHZc8SKec6_LVP6HbXDEVkZKLgw,2929
154
159
  claude_mpm/commands/mpm-doctor.md,sha256=ut5LhFKVRw-2ecjMSPsnaTiRuFXa6Q9t-Wgl3CCnQvk,590
155
- claude_mpm/commands/mpm-help.md,sha256=zfhpE0Fd-wW5zWmYYAMRMT-xYK8saqbw-HXRD7csJHI,2850
160
+ claude_mpm/commands/mpm-help.md,sha256=DGvnR5XLWJVygYCZis2Gh6RP1INj9DycO1FqAdwoegY,6751
156
161
  claude_mpm/commands/mpm-init.md,sha256=wwYHkToq8U5ALdhu8bDPygqAsKZ77aMaai7ZJC3oBqU,16054
157
162
  claude_mpm/commands/mpm-monitor.md,sha256=onTHf9Yac1KkdZdENtY2Q5jyw0A-vZLYgoKkPCtZLUY,12193
158
163
  claude_mpm/commands/mpm-organize.md,sha256=T-ysjhwgfW9irjUj02vuY_1jeMdabO_zxcShyjmqsiM,10153
@@ -162,6 +167,7 @@ claude_mpm/commands/mpm.md,sha256=tv_Mr6p2olRKIltKui4ljfCNG69VokkyIg951CeMBas,55
162
167
  claude_mpm/config/__init__.py,sha256=V2dyJQ8_gVCpNiCg8zYTQqE1RSeON5Zm8n5Ndkqhp1g,916
163
168
  claude_mpm/config/agent_config.py,sha256=sICpvJoOuJGRzdSIMWvC9ECzKTKF-3Psi-ATSaZQ9LU,14860
164
169
  claude_mpm/config/experimental_features.py,sha256=cH95HqMUEQL-_Hs833dAAC33GHMUE5e26qpOyiEtBWI,7546
170
+ claude_mpm/config/model_config.py,sha256=34JnIb_U19UYns3yLX-jjpuNywDnVZhiUSvvDzGzx0g,12410
165
171
  claude_mpm/config/paths.py,sha256=wTZxXt6LjD-gK9lG4i2QSuSnFRXe5lFaVU4dIr22ap8,7643
166
172
  claude_mpm/config/socketio_config.py,sha256=Z8O438z2taOPX2Eh_so-WOvvv-IHiM_WFbf4UBQ4iqg,11342
167
173
  claude_mpm/core/__init__.py,sha256=2bufzjbIXffZnSg5k-JH9czMDTkmtz-Jb9opgHmQY-0,2598
@@ -186,7 +192,7 @@ claude_mpm/core/hook_manager.py,sha256=Cq3vwYW7-ffKw_HSFqtv1RJTxs8YUpD_qeTiWvua3
186
192
  claude_mpm/core/hook_performance_config.py,sha256=e7a7oFctkRhA3aPXMO5Wavr-E6ku7ikLxMzPU7P1-yg,5779
187
193
  claude_mpm/core/injectable_service.py,sha256=9N4mHt6a_PwoP0pQo-QhVTnXLJlgDCCOg358d0jPEs4,7384
188
194
  claude_mpm/core/instruction_reinforcement_hook.py,sha256=s9KGkdJO8E9ip3MB5PlXo52-dTocHXqsVy5TcxOK8-A,9487
189
- claude_mpm/core/interactive_session.py,sha256=dMFuuZKXsGsDkXLaIgQKxbiG5LRRIEUFEKFFyYnsFbc,21979
195
+ claude_mpm/core/interactive_session.py,sha256=getJBbR4I3RmaOCQwEi_DL9ALe0-HskszK4jVsjjyz4,22106
190
196
  claude_mpm/core/interfaces.py,sha256=RNqXxUioEpV4vOaEoUJ38OvKYPMlpSb3V5Sb97l0w3Q,25625
191
197
  claude_mpm/core/lazy.py,sha256=pyCfEqGHyLz18yXTu_uG52-II-9nCaBcpzwwQGBrQro,14808
192
198
  claude_mpm/core/log_manager.py,sha256=yf82AKC-DYLtl7h0ka5IEoVC8aC0_II-zCjHOwD3RxQ,24661
@@ -575,14 +581,23 @@ claude_mpm/services/core/memory_manager.py,sha256=aajBuvBzTq0-EZrjnBjGRdUSaa6Mpb
575
581
  claude_mpm/services/core/path_resolver.py,sha256=VtqiOEUlskAr9nRsaS9uXQSSjDD8dIrYfNML0zLY2zo,17764
576
582
  claude_mpm/services/core/service_container.py,sha256=3hDwFUahxFZnokPzwgXqBP9swvZhLztKQqwe9xEHgsw,18497
577
583
  claude_mpm/services/core/service_interfaces.py,sha256=dlNp0K4gaMcLiNSZxXjsL-kto6vipYw87pBuFK7oVNo,10770
578
- claude_mpm/services/core/interfaces/__init__.py,sha256=G8-C1bA-LPrt_KxMtiZdxDeQCBJfnxLQDQjM4i0zvuI,6903
584
+ claude_mpm/services/core/interfaces/__init__.py,sha256=WsJ2ptrqGfLAJhwpmkwJ3GmaIuAalDNcI1IbZEP8E00,9080
579
585
  claude_mpm/services/core/interfaces/agent.py,sha256=bbGJCQM2E2T2C2ed2OOTFLzEXy4MR1NCwWiUimu0HNY,16953
580
586
  claude_mpm/services/core/interfaces/communication.py,sha256=evwtLbYCFa3Zb8kEfL10LOBVdwP4-n3a3wa7NqIHmKQ,8887
587
+ claude_mpm/services/core/interfaces/health.py,sha256=igPkOcpqIjhcabfkxXS3g5UHdsW3Zux2t7usKMNs41I,5143
581
588
  claude_mpm/services/core/interfaces/infrastructure.py,sha256=eLtr_dFhA3Ux3mPOV_4DbWhGjHpfpGnj6xOhfQcgZGk,10037
589
+ claude_mpm/services/core/interfaces/model.py,sha256=wExCaoiI1aQH0gzhXg0u7kf_jY84tWGG5v6yT7qyWTk,8422
590
+ claude_mpm/services/core/interfaces/process.py,sha256=oroWwXAUX9All2BOCX2K2tw24CwtjYA3BgPGVKE6vRA,10676
582
591
  claude_mpm/services/core/interfaces/project.py,sha256=O2kAjeuSTInUZ0LrZ6ElxRn3QbXlWseSx8T1ybhg99o,4168
592
+ claude_mpm/services/core/interfaces/restart.py,sha256=O9f5aAwK-H3vBmu6PmhD1TllwJCVauAc_gBB9uIIvWE,9120
583
593
  claude_mpm/services/core/interfaces/service.py,sha256=hNfHXe45LcPCp_dToOmZCfnUZBF5axMf_TdxqCSm2-I,11536
584
- claude_mpm/services/core/models/__init__.py,sha256=ZukIO02FFkkCpJPp-D2GWxCrshYzEPpFHh1WvTAbibI,1242
594
+ claude_mpm/services/core/interfaces/stability.py,sha256=Ppvwj3dlZdrBeVRBkeAffHV3nDOF1psgf9-8X_n4Ezg,8075
595
+ claude_mpm/services/core/models/__init__.py,sha256=OViDQwvlVwvyeCyGXc1bBfx1xEKPLubBl2t3b1nliCs,1973
585
596
  claude_mpm/services/core/models/agent_config.py,sha256=ygu0d7bDunUrmJRLO4lSXtxAY2ju1wrmP0buRzBVFkQ,14178
597
+ claude_mpm/services/core/models/health.py,sha256=5OlWE5kG3PVhkkv-FPLnyXgFdoemE1o96kwCAjNaAiI,5851
598
+ claude_mpm/services/core/models/process.py,sha256=jvEVkw3nnI4NaqAXVtgTh4B5LWk0zSVKxX6cJERQBCA,7855
599
+ claude_mpm/services/core/models/restart.py,sha256=-fSa5LIhnkCKGsPIttT2tB3Gv_n9giwVz_FY-vJxYrE,10032
600
+ claude_mpm/services/core/models/stability.py,sha256=CFCEXY3VkZNTdvYHinLgQTSJa7kz2apZE-J9IPykqLU,8615
586
601
  claude_mpm/services/core/models/toolchain.py,sha256=wkEnZgF944wq1SMqqmQVa91TtSKeFiZgO_Lg1wrO7KM,12167
587
602
  claude_mpm/services/diagnostics/__init__.py,sha256=WTRucANR9EwNi53rotjkeE4k75s18RjHJ8s1BfBj7ic,614
588
603
  claude_mpm/services/diagnostics/diagnostic_runner.py,sha256=PJje2C3_20JAeDBf2LpZ_rfi3rwSWk73EXJmZEkDcvs,9470
@@ -649,6 +664,21 @@ claude_mpm/services/infrastructure/monitoring/network.py,sha256=L874kGjryP_R8tDw
649
664
  claude_mpm/services/infrastructure/monitoring/process.py,sha256=_gh124mIemvHZE2wV1VWuMf-u7qI3VpXAUSSmuCOIJY,11054
650
665
  claude_mpm/services/infrastructure/monitoring/resources.py,sha256=7Mt9zvNAYGf7OTLBUFpGoDQncCuTYkpODRKV42T6wyI,7665
651
666
  claude_mpm/services/infrastructure/monitoring/service.py,sha256=guYB6rJtU18T2kPhZbKKg85l96lm2f7XVtPnBt1O3So,12613
667
+ claude_mpm/services/local_ops/__init__.py,sha256=gxVh8SifrYKgvrcY0Xbj08rrUFRRu8FrNUkCSry1084,4969
668
+ claude_mpm/services/local_ops/crash_detector.py,sha256=bc78Kx78hgqEl7nM-_T_t77nd3AGb37IVBWvKEcyZbo,8813
669
+ claude_mpm/services/local_ops/health_manager.py,sha256=hKS8h30tJiiBfk-FbpOUjvKqxzb0GK9CisM2idEMopc,15226
670
+ claude_mpm/services/local_ops/log_monitor.py,sha256=dCUzEXf2yXcFjcqyS7oWtI6MLR9oj_j3Hibd6ZWe5RI,12861
671
+ claude_mpm/services/local_ops/memory_leak_detector.py,sha256=uZC9AxMCk9rvf2IoOV9hq9ds2sCxOnfiDpJI11-d25c,10118
672
+ claude_mpm/services/local_ops/process_manager.py,sha256=ZAzfQOatz4d05es9yM5GDxqCV7GebBKJeKxHjz3Sl0U,19614
673
+ claude_mpm/services/local_ops/resource_monitor.py,sha256=k_TU4wkOwmJMR0BLSqAOIwckGyw_Xm9P8QXOTRapBA8,11357
674
+ claude_mpm/services/local_ops/restart_manager.py,sha256=HkSXPltljkxSxp_5bns72mTtEn7h7cayKjJLJD5ZRI8,13861
675
+ claude_mpm/services/local_ops/restart_policy.py,sha256=0HknpxkQXnngONu8hYx7b2z0BTZgvh_QQvvgsLw70pU,13452
676
+ claude_mpm/services/local_ops/state_manager.py,sha256=uyurW2r94fc9hCeLyp9LHq68ARObPsj2wKJkAJstspo,11931
677
+ claude_mpm/services/local_ops/unified_manager.py,sha256=Y0jJn6cuBUBhNgf0ZsmZ1_VqRQgq10DqYe58-HoMKBU,21833
678
+ claude_mpm/services/local_ops/health_checks/__init__.py,sha256=y2y7Yu-wawPyG3WW62Xs26t7ICFFTO-RWE3NHu5S40A,894
679
+ claude_mpm/services/local_ops/health_checks/http_check.py,sha256=vVQAvrwycWDdFkk04IJUTZFf-OEDI_p9mTCX1sGOjRQ,8324
680
+ claude_mpm/services/local_ops/health_checks/process_check.py,sha256=bHF8pls4J6G5bYiQdeQbh5DhLlngl-Kl0ID5GEOkbdI,8776
681
+ claude_mpm/services/local_ops/health_checks/resource_check.py,sha256=uEBJX1H8muVDkg-heWdK9asAwZEYYAY6y-JE6yUyeDM,9210
652
682
  claude_mpm/services/mcp_gateway/__init__.py,sha256=4fiMsd7i2QzZpEXCUeo0Vk_CXRi35TE94gPvwyuz2es,5099
653
683
  claude_mpm/services/mcp_gateway/auto_configure.py,sha256=JNos01nGb2qXACXNHC-UkLccqQ-p8GFUElXqBLUQl7A,12163
654
684
  claude_mpm/services/mcp_gateway/main.py,sha256=1e_-NGwVNr8cFtwWC_2NhZS-EYwC--MSfiZTx15x3ao,19121
@@ -689,6 +719,11 @@ claude_mpm/services/memory/router.py,sha256=c92j-7SXF254gvW-DvQ8OzvWKLdhklDndikN
689
719
  claude_mpm/services/memory/cache/__init__.py,sha256=6M6-P8ParyxX8vOgp_IxHgLMvacrQHPnXeZIvwJKtw8,351
690
720
  claude_mpm/services/memory/cache/shared_prompt_cache.py,sha256=sFw-50bNS8_d5mNYQyemuDa9zf3DNlqdpMPscW33MxE,28781
691
721
  claude_mpm/services/memory/cache/simple_cache.py,sha256=rePUw7poI2CM6l9ZuVgBqtsIkQpa_s0ugjXR3Kbgujg,10249
722
+ claude_mpm/services/model/__init__.py,sha256=JOvhp9qHykYOp4LEKJJVkn5EGE6uREL983IgnWnzj2g,4453
723
+ claude_mpm/services/model/base_provider.py,sha256=f7XSEkzLHHlygal2mfUMV2WcIRT4Stl13dKM3onbChw,11325
724
+ claude_mpm/services/model/claude_provider.py,sha256=Ny6UPQ3ATFJ2goy8p9b81QfsQfpjM0WawcMveevwIGg,13407
725
+ claude_mpm/services/model/model_router.py,sha256=cTYTgVJRREsYheOp_KzcAnYpCFYR_8S_TyOhkQuStDQ,14371
726
+ claude_mpm/services/model/ollama_provider.py,sha256=4KhvzNZKV1Xj0qh45xh0oWGsApjLrGVxMhRVXJ8rQTY,14036
692
727
  claude_mpm/services/monitor/__init__.py,sha256=X7gxSLUm9Fg_zEsX6LtCHP2ipF0qj6Emkun20h2So7g,745
693
728
  claude_mpm/services/monitor/daemon.py,sha256=nfOYeAxQHtxlRYx8bv6S9g1P0ofUsfK8RnxJQ5i96FY,25934
694
729
  claude_mpm/services/monitor/daemon_manager.py,sha256=bsl-sc75ih5h6ZeCYLB07RQnADZdkauZ7WZ0cY0XQEY,34210
@@ -819,9 +854,9 @@ claude_mpm/utils/subprocess_utils.py,sha256=D0izRT8anjiUb_JG72zlJR_JAw1cDkb7kalN
819
854
  claude_mpm/validation/__init__.py,sha256=YZhwE3mhit-lslvRLuwfX82xJ_k4haZeKmh4IWaVwtk,156
820
855
  claude_mpm/validation/agent_validator.py,sha256=GprtAvu80VyMXcKGsK_VhYiXWA6BjKHv7O6HKx0AB9w,20917
821
856
  claude_mpm/validation/frontmatter_validator.py,sha256=YpJlYNNYcV8u6hIOi3_jaRsDnzhbcQpjCBE6eyBKaFY,7076
822
- claude_mpm-4.13.1.dist-info/licenses/LICENSE,sha256=lpaivOlPuBZW1ds05uQLJJswy8Rp_HMNieJEbFlqvLk,1072
823
- claude_mpm-4.13.1.dist-info/METADATA,sha256=LFz8M6yorvkQwtrKKtstC5LnFpmt6DzShgeXqFjYzDc,17967
824
- claude_mpm-4.13.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
825
- claude_mpm-4.13.1.dist-info/entry_points.txt,sha256=Vlw3GNi-OtTpKSrez04iNrPmxNxYDpIWxmJCxiZ5Tx8,526
826
- claude_mpm-4.13.1.dist-info/top_level.txt,sha256=1nUg3FEaBySgm8t-s54jK5zoPnu3_eY6EP6IOlekyHA,11
827
- claude_mpm-4.13.1.dist-info/RECORD,,
857
+ claude_mpm-4.14.0.dist-info/licenses/LICENSE,sha256=lpaivOlPuBZW1ds05uQLJJswy8Rp_HMNieJEbFlqvLk,1072
858
+ claude_mpm-4.14.0.dist-info/METADATA,sha256=L28lbbRPKyA6pa5TC_vZhqbq1Sn2fH2G-YtSjOGzepM,17967
859
+ claude_mpm-4.14.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
860
+ claude_mpm-4.14.0.dist-info/entry_points.txt,sha256=Vlw3GNi-OtTpKSrez04iNrPmxNxYDpIWxmJCxiZ5Tx8,526
861
+ claude_mpm-4.14.0.dist-info/top_level.txt,sha256=1nUg3FEaBySgm8t-s54jK5zoPnu3_eY6EP6IOlekyHA,11
862
+ claude_mpm-4.14.0.dist-info/RECORD,,