claude-mpm 4.3.22__py3-none-any.whl → 4.4.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.
Files changed (31) hide show
  1. claude_mpm/VERSION +1 -1
  2. claude_mpm/cli/commands/doctor.py +2 -2
  3. claude_mpm/hooks/memory_integration_hook.py +1 -1
  4. claude_mpm/services/agents/memory/content_manager.py +5 -2
  5. claude_mpm/services/agents/memory/memory_file_service.py +1 -0
  6. claude_mpm/services/agents/memory/memory_limits_service.py +1 -0
  7. claude_mpm/services/unified/__init__.py +65 -0
  8. claude_mpm/services/unified/analyzer_strategies/__init__.py +44 -0
  9. claude_mpm/services/unified/analyzer_strategies/code_analyzer.py +473 -0
  10. claude_mpm/services/unified/analyzer_strategies/dependency_analyzer.py +643 -0
  11. claude_mpm/services/unified/analyzer_strategies/performance_analyzer.py +804 -0
  12. claude_mpm/services/unified/analyzer_strategies/security_analyzer.py +661 -0
  13. claude_mpm/services/unified/analyzer_strategies/structure_analyzer.py +696 -0
  14. claude_mpm/services/unified/deployment_strategies/__init__.py +97 -0
  15. claude_mpm/services/unified/deployment_strategies/base.py +557 -0
  16. claude_mpm/services/unified/deployment_strategies/cloud_strategies.py +486 -0
  17. claude_mpm/services/unified/deployment_strategies/local.py +594 -0
  18. claude_mpm/services/unified/deployment_strategies/utils.py +672 -0
  19. claude_mpm/services/unified/deployment_strategies/vercel.py +471 -0
  20. claude_mpm/services/unified/interfaces.py +499 -0
  21. claude_mpm/services/unified/migration.py +532 -0
  22. claude_mpm/services/unified/strategies.py +551 -0
  23. claude_mpm/services/unified/unified_analyzer.py +534 -0
  24. claude_mpm/services/unified/unified_config.py +688 -0
  25. claude_mpm/services/unified/unified_deployment.py +470 -0
  26. {claude_mpm-4.3.22.dist-info → claude_mpm-4.4.0.dist-info}/METADATA +1 -1
  27. {claude_mpm-4.3.22.dist-info → claude_mpm-4.4.0.dist-info}/RECORD +31 -12
  28. {claude_mpm-4.3.22.dist-info → claude_mpm-4.4.0.dist-info}/WHEEL +0 -0
  29. {claude_mpm-4.3.22.dist-info → claude_mpm-4.4.0.dist-info}/entry_points.txt +0 -0
  30. {claude_mpm-4.3.22.dist-info → claude_mpm-4.4.0.dist-info}/licenses/LICENSE +0 -0
  31. {claude_mpm-4.3.22.dist-info → claude_mpm-4.4.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,470 @@
1
+ """
2
+ Unified Deployment Service Implementation
3
+ =========================================
4
+
5
+ This module implements the unified deployment service that consolidates all
6
+ deployment-related services using the strategy pattern. It replaces multiple
7
+ specialized deployment services with a single, extensible service.
8
+
9
+ Consolidates:
10
+ - AgentDeploymentService
11
+ - ConfigDeploymentService
12
+ - ResourceDeploymentService
13
+ - TemplateDeploymentService
14
+ - And other deployment-related services
15
+
16
+ Features:
17
+ - Strategy-based deployment for different resource types
18
+ - Rollback support with versioning
19
+ - Batch deployment operations
20
+ - Deployment validation and pre-flight checks
21
+ - Metrics and monitoring integration
22
+ """
23
+
24
+ import asyncio
25
+ from pathlib import Path
26
+ from typing import Any, Dict, List, Optional, Union
27
+
28
+ from claude_mpm.core.logging_utils import get_logger
29
+
30
+ from .interfaces import (
31
+ DeploymentResult,
32
+ IDeploymentService,
33
+ IUnifiedService,
34
+ ServiceCapability,
35
+ ServiceMetadata,
36
+ )
37
+ from .strategies import (
38
+ DeploymentStrategy,
39
+ StrategyContext,
40
+ get_strategy_registry,
41
+ )
42
+
43
+
44
+ class UnifiedDeploymentService(IDeploymentService, IUnifiedService):
45
+ """
46
+ Unified deployment service using strategy pattern.
47
+
48
+ This service consolidates all deployment operations through a
49
+ pluggable strategy system, reducing code duplication and improving
50
+ maintainability.
51
+ """
52
+
53
+ def __init__(self):
54
+ """Initialize unified deployment service."""
55
+ self._logger = get_logger(f"{__name__}.UnifiedDeploymentService")
56
+ self._registry = get_strategy_registry()
57
+ self._deployments: Dict[str, Dict[str, Any]] = {}
58
+ self._deployment_counter = 0
59
+ self._metrics = {
60
+ "total_deployments": 0,
61
+ "successful_deployments": 0,
62
+ "failed_deployments": 0,
63
+ "rollbacks": 0,
64
+ }
65
+ self._initialized = False
66
+
67
+ def get_metadata(self) -> ServiceMetadata:
68
+ """
69
+ Get service metadata.
70
+
71
+ Returns:
72
+ ServiceMetadata: Service metadata
73
+ """
74
+ return ServiceMetadata(
75
+ name="UnifiedDeploymentService",
76
+ version="1.0.0",
77
+ capabilities={
78
+ ServiceCapability.ASYNC_OPERATIONS,
79
+ ServiceCapability.BATCH_PROCESSING,
80
+ ServiceCapability.VALIDATION,
81
+ ServiceCapability.ROLLBACK,
82
+ ServiceCapability.METRICS,
83
+ ServiceCapability.HEALTH_CHECK,
84
+ },
85
+ dependencies=["StrategyRegistry", "LoggingService"],
86
+ description="Unified service for all deployment operations",
87
+ tags={"deployment", "unified", "strategy-pattern"},
88
+ deprecated_services=[
89
+ "AgentDeploymentService",
90
+ "ConfigDeploymentService",
91
+ "ResourceDeploymentService",
92
+ "TemplateDeploymentService",
93
+ ],
94
+ )
95
+
96
+ async def initialize(self) -> bool:
97
+ """
98
+ Initialize the service.
99
+
100
+ Returns:
101
+ bool: True if initialization successful
102
+ """
103
+ try:
104
+ self._logger.info("Initializing UnifiedDeploymentService")
105
+
106
+ # Load deployment history if exists
107
+ await self._load_deployment_history()
108
+
109
+ # Register default strategies
110
+ self._register_default_strategies()
111
+
112
+ self._initialized = True
113
+ self._logger.info("UnifiedDeploymentService initialized successfully")
114
+ return True
115
+
116
+ except Exception as e:
117
+ self._logger.error(f"Failed to initialize: {str(e)}")
118
+ return False
119
+
120
+ async def shutdown(self) -> None:
121
+ """Gracefully shutdown the service."""
122
+ self._logger.info("Shutting down UnifiedDeploymentService")
123
+
124
+ # Save deployment history
125
+ await self._save_deployment_history()
126
+
127
+ # Clear deployments
128
+ self._deployments.clear()
129
+
130
+ self._initialized = False
131
+ self._logger.info("UnifiedDeploymentService shutdown complete")
132
+
133
+ def health_check(self) -> Dict[str, Any]:
134
+ """
135
+ Perform health check.
136
+
137
+ Returns:
138
+ Dict[str, Any]: Health status
139
+ """
140
+ strategies = self._registry.list_strategies(DeploymentStrategy)
141
+
142
+ return {
143
+ "service": "UnifiedDeploymentService",
144
+ "status": "healthy" if self._initialized else "unhealthy",
145
+ "initialized": self._initialized,
146
+ "registered_strategies": len(strategies),
147
+ "active_deployments": len(self._deployments),
148
+ "metrics": self.get_metrics(),
149
+ }
150
+
151
+ def get_metrics(self) -> Dict[str, Any]:
152
+ """
153
+ Get service metrics.
154
+
155
+ Returns:
156
+ Dict[str, Any]: Service metrics
157
+ """
158
+ success_rate = 0.0
159
+ if self._metrics["total_deployments"] > 0:
160
+ success_rate = (
161
+ self._metrics["successful_deployments"]
162
+ / self._metrics["total_deployments"]
163
+ ) * 100
164
+
165
+ return {
166
+ **self._metrics,
167
+ "success_rate": success_rate,
168
+ "active_deployments": len(self._deployments),
169
+ }
170
+
171
+ def reset(self) -> None:
172
+ """Reset service to initial state."""
173
+ self._logger.info("Resetting UnifiedDeploymentService")
174
+ self._deployments.clear()
175
+ self._deployment_counter = 0
176
+ self._metrics = {
177
+ "total_deployments": 0,
178
+ "successful_deployments": 0,
179
+ "failed_deployments": 0,
180
+ "rollbacks": 0,
181
+ }
182
+
183
+ def validate_deployment(
184
+ self, target: Union[str, Path], config: Dict[str, Any]
185
+ ) -> List[str]:
186
+ """
187
+ Validate deployment configuration.
188
+
189
+ Args:
190
+ target: Deployment target
191
+ config: Deployment configuration
192
+
193
+ Returns:
194
+ List[str]: Validation errors
195
+ """
196
+ errors = []
197
+
198
+ # Basic validation
199
+ if not target:
200
+ errors.append("Deployment target is required")
201
+
202
+ if not config:
203
+ errors.append("Deployment configuration is required")
204
+
205
+ # Get deployment type from config
206
+ deployment_type = config.get("type", "unknown")
207
+
208
+ # Select appropriate strategy
209
+ context = StrategyContext(
210
+ target_type=deployment_type,
211
+ operation="validate",
212
+ parameters={"target": target, "config": config},
213
+ )
214
+
215
+ strategy = self._registry.select_strategy(DeploymentStrategy, context)
216
+
217
+ if not strategy:
218
+ errors.append(f"No strategy available for deployment type: {deployment_type}")
219
+ else:
220
+ # Delegate validation to strategy
221
+ strategy_errors = strategy.validate_input(config)
222
+ errors.extend(strategy_errors)
223
+
224
+ return errors
225
+
226
+ def deploy(
227
+ self,
228
+ source: Union[str, Path],
229
+ target: Union[str, Path],
230
+ config: Optional[Dict[str, Any]] = None,
231
+ force: bool = False,
232
+ ) -> DeploymentResult:
233
+ """
234
+ Execute deployment.
235
+
236
+ Args:
237
+ source: Deployment source
238
+ target: Deployment target
239
+ config: Deployment configuration
240
+ force: Force deployment
241
+
242
+ Returns:
243
+ DeploymentResult: Deployment result
244
+ """
245
+ config = config or {}
246
+ self._metrics["total_deployments"] += 1
247
+
248
+ try:
249
+ # Validate deployment
250
+ errors = self.validate_deployment(target, config)
251
+ if errors and not force:
252
+ self._metrics["failed_deployments"] += 1
253
+ return DeploymentResult(
254
+ success=False,
255
+ message=f"Validation failed: {'; '.join(errors)}",
256
+ )
257
+
258
+ # Get deployment type
259
+ deployment_type = config.get("type", "generic")
260
+
261
+ # Select deployment strategy
262
+ context = StrategyContext(
263
+ target_type=deployment_type,
264
+ operation="deploy",
265
+ parameters={
266
+ "source": source,
267
+ "target": target,
268
+ "config": config,
269
+ "force": force,
270
+ },
271
+ )
272
+
273
+ strategy = self._registry.select_strategy(DeploymentStrategy, context)
274
+
275
+ if not strategy:
276
+ self._metrics["failed_deployments"] += 1
277
+ return DeploymentResult(
278
+ success=False,
279
+ message=f"No strategy available for deployment type: {deployment_type}",
280
+ )
281
+
282
+ # Execute deployment using strategy
283
+ self._logger.info(
284
+ f"Deploying {source} to {target} using {strategy.metadata.name}"
285
+ )
286
+
287
+ result = strategy.deploy(source, target, config)
288
+
289
+ # Create deployment record
290
+ deployment_id = self._generate_deployment_id()
291
+ rollback_info = strategy.prepare_rollback(result)
292
+
293
+ self._deployments[deployment_id] = {
294
+ "id": deployment_id,
295
+ "source": str(source),
296
+ "target": str(target),
297
+ "type": deployment_type,
298
+ "strategy": strategy.metadata.name,
299
+ "config": config,
300
+ "result": result,
301
+ "rollback_info": rollback_info,
302
+ "timestamp": self._get_timestamp(),
303
+ }
304
+
305
+ # Update metrics
306
+ if result.get("success", False):
307
+ self._metrics["successful_deployments"] += 1
308
+ deployed_path = Path(target) / Path(source).name
309
+
310
+ return DeploymentResult(
311
+ success=True,
312
+ deployed_path=deployed_path,
313
+ message=f"Successfully deployed using {strategy.metadata.name}",
314
+ metadata=result,
315
+ rollback_info=rollback_info,
316
+ )
317
+ else:
318
+ self._metrics["failed_deployments"] += 1
319
+ return DeploymentResult(
320
+ success=False,
321
+ message=result.get("error", "Deployment failed"),
322
+ metadata=result,
323
+ )
324
+
325
+ except Exception as e:
326
+ self._logger.error(f"Deployment error: {str(e)}")
327
+ self._metrics["failed_deployments"] += 1
328
+ return DeploymentResult(
329
+ success=False,
330
+ message=f"Deployment failed: {str(e)}",
331
+ )
332
+
333
+ def rollback(
334
+ self, deployment_id: str, rollback_info: Dict[str, Any]
335
+ ) -> DeploymentResult:
336
+ """
337
+ Rollback deployment.
338
+
339
+ Args:
340
+ deployment_id: Deployment to rollback
341
+ rollback_info: Rollback information
342
+
343
+ Returns:
344
+ DeploymentResult: Rollback result
345
+ """
346
+ self._metrics["rollbacks"] += 1
347
+
348
+ deployment = self._deployments.get(deployment_id)
349
+ if not deployment:
350
+ return DeploymentResult(
351
+ success=False,
352
+ message=f"Deployment {deployment_id} not found",
353
+ )
354
+
355
+ try:
356
+ # Get the strategy used for deployment
357
+ strategy_name = deployment["strategy"]
358
+ strategy = self._registry.get_strategy(
359
+ DeploymentStrategy, strategy_name
360
+ )
361
+
362
+ if not strategy:
363
+ return DeploymentResult(
364
+ success=False,
365
+ message=f"Strategy {strategy_name} not available for rollback",
366
+ )
367
+
368
+ # Execute rollback
369
+ self._logger.info(f"Rolling back deployment {deployment_id}")
370
+
371
+ # Clean up deployed artifacts
372
+ success = strategy.cleanup(deployment["target"])
373
+
374
+ if success:
375
+ # Mark deployment as rolled back
376
+ deployment["rolled_back"] = True
377
+ deployment["rollback_timestamp"] = self._get_timestamp()
378
+
379
+ return DeploymentResult(
380
+ success=True,
381
+ message=f"Successfully rolled back deployment {deployment_id}",
382
+ )
383
+ else:
384
+ return DeploymentResult(
385
+ success=False,
386
+ message="Rollback failed",
387
+ )
388
+
389
+ except Exception as e:
390
+ self._logger.error(f"Rollback error: {str(e)}")
391
+ return DeploymentResult(
392
+ success=False,
393
+ message=f"Rollback failed: {str(e)}",
394
+ )
395
+
396
+ def list_deployments(
397
+ self, target: Optional[Union[str, Path]] = None
398
+ ) -> List[Dict[str, Any]]:
399
+ """
400
+ List deployments.
401
+
402
+ Args:
403
+ target: Optional filter by target
404
+
405
+ Returns:
406
+ List[Dict[str, Any]]: Deployment list
407
+ """
408
+ deployments = list(self._deployments.values())
409
+
410
+ if target:
411
+ target_str = str(target)
412
+ deployments = [
413
+ d for d in deployments if d["target"] == target_str
414
+ ]
415
+
416
+ return deployments
417
+
418
+ def get_deployment_status(self, deployment_id: str) -> Dict[str, Any]:
419
+ """
420
+ Get deployment status.
421
+
422
+ Args:
423
+ deployment_id: Deployment identifier
424
+
425
+ Returns:
426
+ Dict[str, Any]: Deployment status
427
+ """
428
+ deployment = self._deployments.get(deployment_id)
429
+ if not deployment:
430
+ return {"error": f"Deployment {deployment_id} not found"}
431
+
432
+ return {
433
+ "id": deployment_id,
434
+ "status": "rolled_back" if deployment.get("rolled_back") else "active",
435
+ "type": deployment["type"],
436
+ "strategy": deployment["strategy"],
437
+ "source": deployment["source"],
438
+ "target": deployment["target"],
439
+ "timestamp": deployment["timestamp"],
440
+ "rollback_available": bool(deployment.get("rollback_info")),
441
+ }
442
+
443
+ # Private helper methods
444
+
445
+ def _register_default_strategies(self) -> None:
446
+ """Register default deployment strategies."""
447
+ # Default strategies would be registered here
448
+ # This would be extended with actual strategy implementations
449
+ self._logger.debug("Default strategies registered")
450
+
451
+ async def _load_deployment_history(self) -> None:
452
+ """Load deployment history from persistent storage."""
453
+ # Implementation would load from database or file
454
+ self._logger.debug("Deployment history loaded")
455
+
456
+ async def _save_deployment_history(self) -> None:
457
+ """Save deployment history to persistent storage."""
458
+ # Implementation would save to database or file
459
+ self._logger.debug("Deployment history saved")
460
+
461
+ def _generate_deployment_id(self) -> str:
462
+ """Generate unique deployment ID."""
463
+ self._deployment_counter += 1
464
+ return f"deploy_{self._deployment_counter:06d}"
465
+
466
+ def _get_timestamp(self) -> str:
467
+ """Get current timestamp."""
468
+ from datetime import datetime
469
+
470
+ return datetime.now().isoformat()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: claude-mpm
3
- Version: 4.3.22
3
+ Version: 4.4.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=toytnNjkIKPgQaGwDqQdC1rpNTAdSEc6Vja50d7Ovug,4
2
- claude_mpm/VERSION,sha256=zvccwnBVVw9AaTMuRg9TMmHZyBBTqM3_bRbraHZcyCs,7
2
+ claude_mpm/VERSION,sha256=1OTU6BLh2vxOdg9e4SxI73b4r0HSfL878v8GVQW5z-Y,6
3
3
  claude_mpm/__init__.py,sha256=lyTZAYGH4DTaFGLRNWJKk5Q5oTjzN5I6AXmfVX-Jff0,1512
4
4
  claude_mpm/__main__.py,sha256=Ro5UBWBoQaSAIoSqWAr7zkbLyvi4sSy28WShqAhKJG0,723
5
5
  claude_mpm/constants.py,sha256=cChN3myrAcF3jC-6DvHnBFTEnwlDk-TAsIXPvUZr_yw,5953
@@ -79,7 +79,7 @@ claude_mpm/cli/commands/configure.py,sha256=i5_glZmlSTgUEkbVqWBRQE3T-y4AJhPNsUnP
79
79
  claude_mpm/cli/commands/configure_tui.py,sha256=p158vDexkwL7csWO8_fxt-XAMEoBDN24gf75hIfAlXs,66857
80
80
  claude_mpm/cli/commands/dashboard.py,sha256=0f8_JaXo854kZgcqzZ3cm3VG8muhSsV7JqIzjdSJLcc,11420
81
81
  claude_mpm/cli/commands/debug.py,sha256=qEfmBG9slmOY6a8snoytM1OWCdWwBALzN1lqV7ElIBU,47130
82
- claude_mpm/cli/commands/doctor.py,sha256=A39BXEQ174SnfCCZmguyuk6KroCsc2YozgKe_kC6BmQ,5801
82
+ claude_mpm/cli/commands/doctor.py,sha256=zbCrfTmxJ-DuYFgAjLhuCNse4qVuRVAtqBSr3hOOuUE,5809
83
83
  claude_mpm/cli/commands/info.py,sha256=uiZ2GMkfr-4aeme2l6QhzxyawuhtuyVulfCi66yyvOs,7404
84
84
  claude_mpm/cli/commands/mcp.py,sha256=kgmJVTAi0G7SAnIpYHddU25HqAdIY9mMmTH-C3DSCsY,7221
85
85
  claude_mpm/cli/commands/mcp_command_router.py,sha256=8rTMZLxU3R3Izit9ia1Z_pIOq3bn2QjMPH4uvf1X9XY,6001
@@ -352,7 +352,7 @@ claude_mpm/generators/agent_profile_generator.py,sha256=8h3yjhnpNmgILzSddzPjFstG
352
352
  claude_mpm/hooks/__init__.py,sha256=FzgybZlNaDR8q3NJqWc6Ai55rCeg836sIkfE9RT4cGg,167
353
353
  claude_mpm/hooks/base_hook.py,sha256=YUIjSOsGrSMqFJX2gZ16af96ohRpJnOs3mZLq63MQcA,5025
354
354
  claude_mpm/hooks/instruction_reinforcement.py,sha256=9DeJ8JABi2phn5BeIjgz4og4uQRVpk3Oqg6lvM2b3BQ,11058
355
- claude_mpm/hooks/memory_integration_hook.py,sha256=6dEDu13om331mZ9LmVfvMlZ4IKvIlmGq759VWMyrH2Y,16645
355
+ claude_mpm/hooks/memory_integration_hook.py,sha256=VAazT6soMWoPVlDzP17psft-TDTVdblXNR2pjYpfnh4,16652
356
356
  claude_mpm/hooks/tool_call_interceptor.py,sha256=k3Ghe2KvUs3y-5PcS63uHmBAxtUYraqq1bX9GN0QliU,7462
357
357
  claude_mpm/hooks/validation_hooks.py,sha256=VWQX3eKb9-nx20irK9FcyrJgdid2mm3XhSBVOCU1IVw,6464
358
358
  claude_mpm/hooks/claude_hooks/__init__.py,sha256=b4mud_g3S-3itHY_Dzpbb_SmdMEcJwtUU8fTcqpLqqs,130
@@ -495,11 +495,11 @@ claude_mpm/services/agents/management/agent_management_service.py,sha256=aj8ADCH
495
495
  claude_mpm/services/agents/memory/__init__.py,sha256=cu8XUsFeI06NjPwDIysofA0dSpALEKd1f3_E_hJ9wyI,608
496
496
  claude_mpm/services/agents/memory/agent_memory_manager.py,sha256=ewmfS80ZqLGdoalGCVNxlpPVBp5qf1uGUfUpqPtwtOA,31721
497
497
  claude_mpm/services/agents/memory/agent_persistence_service.py,sha256=1_wMyoXRdAo82xg8yLBd4vR1nl-hze0gECOJDOPwsZc,2757
498
- claude_mpm/services/agents/memory/content_manager.py,sha256=KrT9O-hddQxTk_-J4yXF1GNrTqyklT3WYGmVH8MA6Lw,16419
498
+ claude_mpm/services/agents/memory/content_manager.py,sha256=tWm9GLeKZDWGIJbGFpaKqV7YVb2q9HER9quNkqDyaTs,16468
499
499
  claude_mpm/services/agents/memory/memory_categorization_service.py,sha256=kHReO2lKPLctCzVj_yCfsQizElDS66dnHVIzeZcdHoo,4746
500
- claude_mpm/services/agents/memory/memory_file_service.py,sha256=blkOqTW0KchAR5qh3Hz2gdmk54JCSZ3YUXQp3mqlzSU,4370
500
+ claude_mpm/services/agents/memory/memory_file_service.py,sha256=LKvAOLHLvRun6sykD9yC2cB7oy4g3yPdAlgQtGaMdSc,4430
501
501
  claude_mpm/services/agents/memory/memory_format_service.py,sha256=vQzCsESjfgnsaj4Ybd2lwDT0kx8aCWYf2Mx9HElbceI,6170
502
- claude_mpm/services/agents/memory/memory_limits_service.py,sha256=CyWmsVL5iZb6XKZiVJYFf7lTg5DqWYCg6QUMckaPouo,3329
502
+ claude_mpm/services/agents/memory/memory_limits_service.py,sha256=2l--CgKkyNeZt6hFkWWWsJsdaPej33_IsaCzN98kmUA,3389
503
503
  claude_mpm/services/agents/memory/template_generator.py,sha256=oJuryic9ZhEWb-JLHtNNo4RkHi5SEh9G_IQixqMx1YI,2581
504
504
  claude_mpm/services/agents/registry/__init__.py,sha256=ROBX82Ac4iLHEE7-aFUy7mT3NSz5eIub19ck5Q81NHQ,681
505
505
  claude_mpm/services/agents/registry/deployed_agent_discovery.py,sha256=WqJOCnSrwdUGC0gL5YDj_7gv4kl75mN9d-sN_pDBERc,10244
@@ -691,6 +691,25 @@ claude_mpm/services/ticket_services/formatter_service.py,sha256=MQ981yaFuvXWUDLp
691
691
  claude_mpm/services/ticket_services/search_service.py,sha256=CHDITcE6Dqu_98LOeb55qxr4yNpA7iBYSlnWXMg8KAI,9918
692
692
  claude_mpm/services/ticket_services/validation_service.py,sha256=5Wo4YHLjQmZ1Ey9sYHyTjmtWqidywcV16B1T4zS_d-c,8623
693
693
  claude_mpm/services/ticket_services/workflow_service.py,sha256=qbFMHaV3PlZ6J-YD2RVUugJ6WLVzAy_xCT0xMSPx1SY,7803
694
+ claude_mpm/services/unified/__init__.py,sha256=N5VKRC47hyTZrJkV00bOpTkSQxrix4mzaJNrZS0RFnI,1795
695
+ claude_mpm/services/unified/interfaces.py,sha256=zzplADK3lZLBJ68Tk8z5LUUpmfxvOqsd50UmfShI_Q8,13596
696
+ claude_mpm/services/unified/migration.py,sha256=Ih2UgGxOSdXDYwqco1QOFm5f7t6TLdIUKiTHU9kSa9c,17101
697
+ claude_mpm/services/unified/strategies.py,sha256=tNRghWxAIPRLwP06Hn6dao3-7u4aMnrG94SunIWe4yo,15096
698
+ claude_mpm/services/unified/unified_analyzer.py,sha256=7lmF3eSMpTabspEf70pPGTDGce6ihSdS3mfNjWR510c,17053
699
+ claude_mpm/services/unified/unified_config.py,sha256=-ZjVMoZv0BKxqNePYeks4gpXTwl-Y3oAjROdMLO_phA,22026
700
+ claude_mpm/services/unified/unified_deployment.py,sha256=nR54oKbcM4Q23YpKSNiC8NMYReONvVfKVVlxUZ5NQEw,15052
701
+ claude_mpm/services/unified/analyzer_strategies/__init__.py,sha256=H7xGr81UMJCJxM13S9Y-VpCmamJQ2ttSdootCOC86vQ,1368
702
+ claude_mpm/services/unified/analyzer_strategies/code_analyzer.py,sha256=y_oXFAVXfxPdJEZ7Ewv8vFTtTikqwe9fkYm9SAvKVxo,17065
703
+ claude_mpm/services/unified/analyzer_strategies/dependency_analyzer.py,sha256=JkLEhZu6rLoJTyQQQOEDwuy7PoFZwZBP1udIFbxfES4,23673
704
+ claude_mpm/services/unified/analyzer_strategies/performance_analyzer.py,sha256=q2Y8CJCCfImIKp4w_ekExWkrk06EfXBlhEXHDbK2nnc,31607
705
+ claude_mpm/services/unified/analyzer_strategies/security_analyzer.py,sha256=yrJm_zQ13Y_Q12V05wS024lBI8dRHj4YaTfyENsTgfg,25089
706
+ claude_mpm/services/unified/analyzer_strategies/structure_analyzer.py,sha256=AHLUhVkh8mc556eemIo8UzpoXHnUHdTI1U8f6nJITqQ,24810
707
+ claude_mpm/services/unified/deployment_strategies/__init__.py,sha256=8aBt4x3WPllGEPEae89Dn5wLzJfumI6z51oqfW497UY,2985
708
+ claude_mpm/services/unified/deployment_strategies/base.py,sha256=Rhg2olx377C_cg0tDn99buQ8HKy7QJzd63LvqtwbGQs,17656
709
+ claude_mpm/services/unified/deployment_strategies/cloud_strategies.py,sha256=HcF9h0aDTiHx48Uclm1xHCswD7hxLPngVYZ6y9CI1dg,18370
710
+ claude_mpm/services/unified/deployment_strategies/local.py,sha256=eydq9r6IiFpSTiydDJB2RJ9BltHe6rvbpijLKtc4kdI,20798
711
+ claude_mpm/services/unified/deployment_strategies/utils.py,sha256=n01KIhfTwomYP-3c2ALk5Nit0435GllwyaLhNeW2UnY,18914
712
+ claude_mpm/services/unified/deployment_strategies/vercel.py,sha256=5RBEReTej2hsDomqoF5OthUCjrNArdPnCma2I7qJgQo,15366
694
713
  claude_mpm/services/version_control/__init__.py,sha256=U3bFV1upF3FgNrQGFld0GZt0vb3Eunm71mscgTg7zD0,1510
695
714
  claude_mpm/services/version_control/branch_strategy.py,sha256=IhRDt4qIspvNyeONPJJfVKjtbKVVPTGHjGVgGApxj_Q,23190
696
715
  claude_mpm/services/version_control/conflict_resolution.py,sha256=D7MCcrMifBic-My4CvWPpM0gn84rgYOAhnmpKs7R67Q,26061
@@ -730,9 +749,9 @@ claude_mpm/utils/subprocess_utils.py,sha256=ASpi6jh8vEjaYoIJ-xfvnmI3GSwOLBxVdoeb
730
749
  claude_mpm/validation/__init__.py,sha256=YZhwE3mhit-lslvRLuwfX82xJ_k4haZeKmh4IWaVwtk,156
731
750
  claude_mpm/validation/agent_validator.py,sha256=4jbD3F1isinPTCve4DadwpZ-p5omGFVPRe-oJdVzcDc,20915
732
751
  claude_mpm/validation/frontmatter_validator.py,sha256=u8g4Eyd_9O6ugj7Un47oSGh3kqv4wMkuks2i_CtWRvM,7028
733
- claude_mpm-4.3.22.dist-info/licenses/LICENSE,sha256=lpaivOlPuBZW1ds05uQLJJswy8Rp_HMNieJEbFlqvLk,1072
734
- claude_mpm-4.3.22.dist-info/METADATA,sha256=yMOa2NqWVszM56y-g7UO3i-5jqZPo9wWfxO5F7OvgLM,16150
735
- claude_mpm-4.3.22.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
736
- claude_mpm-4.3.22.dist-info/entry_points.txt,sha256=FDPZgz8JOvD-6iuXY2l9Zbo9zYVRuE4uz4Qr0vLeGOk,471
737
- claude_mpm-4.3.22.dist-info/top_level.txt,sha256=1nUg3FEaBySgm8t-s54jK5zoPnu3_eY6EP6IOlekyHA,11
738
- claude_mpm-4.3.22.dist-info/RECORD,,
752
+ claude_mpm-4.4.0.dist-info/licenses/LICENSE,sha256=lpaivOlPuBZW1ds05uQLJJswy8Rp_HMNieJEbFlqvLk,1072
753
+ claude_mpm-4.4.0.dist-info/METADATA,sha256=9a2hiNWE67yPaIAg5EpT6meugBXq8h7nhGytn_WaBmw,16149
754
+ claude_mpm-4.4.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
755
+ claude_mpm-4.4.0.dist-info/entry_points.txt,sha256=FDPZgz8JOvD-6iuXY2l9Zbo9zYVRuE4uz4Qr0vLeGOk,471
756
+ claude_mpm-4.4.0.dist-info/top_level.txt,sha256=1nUg3FEaBySgm8t-s54jK5zoPnu3_eY6EP6IOlekyHA,11
757
+ claude_mpm-4.4.0.dist-info/RECORD,,