claude-mpm 3.9.4__py3-none-any.whl → 3.9.6__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- claude_mpm/VERSION +1 -1
- claude_mpm/__init__.py +13 -0
- claude_mpm/agents/BASE_PM.md +48 -0
- claude_mpm/agents/INSTRUCTIONS.md +28 -1
- claude_mpm/agents/templates/research.json +27 -27
- claude_mpm/agents/templates/research_memory_efficient.json +88 -0
- claude_mpm/cli/__init__.py +3 -1
- claude_mpm/cli/commands/__init__.py +3 -1
- claude_mpm/cli/commands/cleanup.py +430 -0
- claude_mpm/cli/commands/run.py +86 -0
- claude_mpm/cli/parser.py +9 -0
- claude_mpm/constants.py +1 -0
- claude_mpm/core/claude_runner.py +27 -14
- claude_mpm/core/config.py +15 -0
- claude_mpm/core/session_manager.py +108 -4
- {claude_mpm-3.9.4.dist-info → claude_mpm-3.9.6.dist-info}/METADATA +1 -1
- {claude_mpm-3.9.4.dist-info → claude_mpm-3.9.6.dist-info}/RECORD +21 -19
- {claude_mpm-3.9.4.dist-info → claude_mpm-3.9.6.dist-info}/WHEEL +0 -0
- {claude_mpm-3.9.4.dist-info → claude_mpm-3.9.6.dist-info}/entry_points.txt +0 -0
- {claude_mpm-3.9.4.dist-info → claude_mpm-3.9.6.dist-info}/licenses/LICENSE +0 -0
- {claude_mpm-3.9.4.dist-info → claude_mpm-3.9.6.dist-info}/top_level.txt +0 -0
| @@ -1,9 +1,11 @@ | |
| 1 1 | 
             
            """Session ID management for Claude subprocess optimization."""
         | 
| 2 2 |  | 
| 3 3 | 
             
            import uuid
         | 
| 4 | 
            -
            from typing import Optional, Dict, Any
         | 
| 4 | 
            +
            from typing import Optional, Dict, Any, List
         | 
| 5 5 | 
             
            from datetime import datetime, timedelta
         | 
| 6 6 | 
             
            import json
         | 
| 7 | 
            +
            import shutil
         | 
| 8 | 
            +
            import gzip
         | 
| 7 9 | 
             
            from pathlib import Path
         | 
| 8 10 |  | 
| 9 11 | 
             
            from ..core.logger import get_logger
         | 
| @@ -95,11 +97,15 @@ class SessionManager: | |
| 95 97 | 
             
                        self.active_sessions[session_id]["last_used"] = datetime.now().isoformat()
         | 
| 96 98 | 
             
                        self._save_sessions()
         | 
| 97 99 |  | 
| 98 | 
            -
                def cleanup_old_sessions(self, max_age_hours: int = 24):
         | 
| 100 | 
            +
                def cleanup_old_sessions(self, max_age_hours: int = 24, archive: bool = True):
         | 
| 99 101 | 
             
                    """Remove sessions older than max_age_hours.
         | 
| 100 102 |  | 
| 103 | 
            +
                    WHY: We archive old sessions instead of just deleting them to preserve
         | 
| 104 | 
            +
                    conversation history while reducing active memory usage.
         | 
| 105 | 
            +
                    
         | 
| 101 106 | 
             
                    Args:
         | 
| 102 107 | 
             
                        max_age_hours: Maximum age in hours
         | 
| 108 | 
            +
                        archive: Whether to archive sessions before removing
         | 
| 103 109 | 
             
                    """
         | 
| 104 110 | 
             
                    now = datetime.now()
         | 
| 105 111 | 
             
                    max_age = timedelta(hours=max_age_hours)
         | 
| @@ -110,6 +116,10 @@ class SessionManager: | |
| 110 116 | 
             
                        if now - created > max_age:
         | 
| 111 117 | 
             
                            expired.append(session_id)
         | 
| 112 118 |  | 
| 119 | 
            +
                    # Archive sessions if requested
         | 
| 120 | 
            +
                    if archive and expired:
         | 
| 121 | 
            +
                        self._archive_sessions([self.active_sessions[sid] for sid in expired])
         | 
| 122 | 
            +
                    
         | 
| 113 123 | 
             
                    for session_id in expired:
         | 
| 114 124 | 
             
                        del self.active_sessions[session_id]
         | 
| 115 125 | 
             
                        logger.info(f"Cleaned up expired session: {session_id}")
         | 
| @@ -180,11 +190,105 @@ class SessionManager: | |
| 180 190 | 
             
                            with open(session_file, 'r') as f:
         | 
| 181 191 | 
             
                                self.active_sessions = json.load(f)
         | 
| 182 192 |  | 
| 183 | 
            -
                            # Clean up old sessions on load
         | 
| 184 | 
            -
                            self.cleanup_old_sessions()
         | 
| 193 | 
            +
                            # Clean up old sessions on load (archive by default)
         | 
| 194 | 
            +
                            self.cleanup_old_sessions(archive=True)
         | 
| 195 | 
            +
                            
         | 
| 196 | 
            +
                            # Also check and clean .claude.json if needed
         | 
| 197 | 
            +
                            self._check_claude_json_size()
         | 
| 185 198 | 
             
                        except Exception as e:
         | 
| 186 199 | 
             
                            logger.error(f"Failed to load sessions: {e}")
         | 
| 187 200 | 
             
                            self.active_sessions = {}
         | 
| 201 | 
            +
                
         | 
| 202 | 
            +
                def _archive_sessions(self, sessions: List[Dict[str, Any]]):
         | 
| 203 | 
            +
                    """Archive sessions to compressed files.
         | 
| 204 | 
            +
                    
         | 
| 205 | 
            +
                    WHY: Archiving preserves conversation history while reducing the size
         | 
| 206 | 
            +
                    of active memory files like .claude.json.
         | 
| 207 | 
            +
                    
         | 
| 208 | 
            +
                    Args:
         | 
| 209 | 
            +
                        sessions: List of session data dictionaries to archive
         | 
| 210 | 
            +
                    """
         | 
| 211 | 
            +
                    if not sessions:
         | 
| 212 | 
            +
                        return
         | 
| 213 | 
            +
                    
         | 
| 214 | 
            +
                    archive_dir = self.session_dir.parent / "archives" / "sessions"
         | 
| 215 | 
            +
                    archive_dir.mkdir(parents=True, exist_ok=True)
         | 
| 216 | 
            +
                    
         | 
| 217 | 
            +
                    # Create timestamped archive file
         | 
| 218 | 
            +
                    timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
         | 
| 219 | 
            +
                    archive_name = f"sessions_archive_{timestamp}.json.gz"
         | 
| 220 | 
            +
                    archive_path = archive_dir / archive_name
         | 
| 221 | 
            +
                    
         | 
| 222 | 
            +
                    try:
         | 
| 223 | 
            +
                        # Compress and save sessions
         | 
| 224 | 
            +
                        with gzip.open(archive_path, 'wt', encoding='utf-8') as f:
         | 
| 225 | 
            +
                            json.dump(sessions, f, indent=2)
         | 
| 226 | 
            +
                        
         | 
| 227 | 
            +
                        logger.info(f"Archived {len(sessions)} sessions to {archive_path}")
         | 
| 228 | 
            +
                    except Exception as e:
         | 
| 229 | 
            +
                        logger.error(f"Failed to archive sessions: {e}")
         | 
| 230 | 
            +
                
         | 
| 231 | 
            +
                def _check_claude_json_size(self):
         | 
| 232 | 
            +
                    """Check .claude.json size and suggest cleanup if needed.
         | 
| 233 | 
            +
                    
         | 
| 234 | 
            +
                    WHY: Large .claude.json files cause memory issues. This provides
         | 
| 235 | 
            +
                    proactive monitoring and suggestions for cleanup.
         | 
| 236 | 
            +
                    """
         | 
| 237 | 
            +
                    claude_json_path = Path.home() / ".claude.json"
         | 
| 238 | 
            +
                    
         | 
| 239 | 
            +
                    if not claude_json_path.exists():
         | 
| 240 | 
            +
                        return
         | 
| 241 | 
            +
                    
         | 
| 242 | 
            +
                    file_size = claude_json_path.stat().st_size
         | 
| 243 | 
            +
                    warning_threshold = 500 * 1024  # 500KB
         | 
| 244 | 
            +
                    
         | 
| 245 | 
            +
                    if file_size > warning_threshold:
         | 
| 246 | 
            +
                        size_mb = file_size / (1024 * 1024)
         | 
| 247 | 
            +
                        logger.warning(f".claude.json is {size_mb:.1f}MB - consider running 'claude-mpm cleanup-memory'")
         | 
| 248 | 
            +
                
         | 
| 249 | 
            +
                def archive_claude_json(self, keep_days: int = 30) -> bool:
         | 
| 250 | 
            +
                    """Archive old conversations from .claude.json.
         | 
| 251 | 
            +
                    
         | 
| 252 | 
            +
                    WHY: This is called by the cleanup command to reduce memory usage
         | 
| 253 | 
            +
                    while preserving conversation history.
         | 
| 254 | 
            +
                    
         | 
| 255 | 
            +
                    Args:
         | 
| 256 | 
            +
                        keep_days: Number of days of history to keep
         | 
| 257 | 
            +
                        
         | 
| 258 | 
            +
                    Returns:
         | 
| 259 | 
            +
                        True if successful, False otherwise
         | 
| 260 | 
            +
                    """
         | 
| 261 | 
            +
                    claude_json_path = Path.home() / ".claude.json"
         | 
| 262 | 
            +
                    
         | 
| 263 | 
            +
                    if not claude_json_path.exists():
         | 
| 264 | 
            +
                        logger.info("No .claude.json file to archive")
         | 
| 265 | 
            +
                        return True
         | 
| 266 | 
            +
                    
         | 
| 267 | 
            +
                    try:
         | 
| 268 | 
            +
                        # Create backup first
         | 
| 269 | 
            +
                        archive_dir = Path.home() / ".claude-mpm" / "archives"
         | 
| 270 | 
            +
                        archive_dir.mkdir(parents=True, exist_ok=True)
         | 
| 271 | 
            +
                        
         | 
| 272 | 
            +
                        timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
         | 
| 273 | 
            +
                        backup_name = f"claude_json_backup_{timestamp}.json.gz"
         | 
| 274 | 
            +
                        backup_path = archive_dir / backup_name
         | 
| 275 | 
            +
                        
         | 
| 276 | 
            +
                        # Compress and backup current file
         | 
| 277 | 
            +
                        with open(claude_json_path, 'rb') as f_in:
         | 
| 278 | 
            +
                            with gzip.open(backup_path, 'wb') as f_out:
         | 
| 279 | 
            +
                                shutil.copyfileobj(f_in, f_out)
         | 
| 280 | 
            +
                        
         | 
| 281 | 
            +
                        logger.info(f"Created backup at {backup_path}")
         | 
| 282 | 
            +
                        
         | 
| 283 | 
            +
                        # For now, we don't modify the original .claude.json
         | 
| 284 | 
            +
                        # as we don't know its exact structure.
         | 
| 285 | 
            +
                        # The cleanup command handles this.
         | 
| 286 | 
            +
                        
         | 
| 287 | 
            +
                        return True
         | 
| 288 | 
            +
                        
         | 
| 289 | 
            +
                    except Exception as e:
         | 
| 290 | 
            +
                        logger.error(f"Failed to archive .claude.json: {e}")
         | 
| 291 | 
            +
                        return False
         | 
| 188 292 |  | 
| 189 293 |  | 
| 190 294 | 
             
            class OrchestrationSession:
         | 
| @@ -1,13 +1,13 @@ | |
| 1 | 
            -
            claude_mpm/VERSION,sha256= | 
| 2 | 
            -
            claude_mpm/__init__.py,sha256= | 
| 1 | 
            +
            claude_mpm/VERSION,sha256=d3i7x6wOmm1dHxwqFEvbXR3fz1QAv2OUzhc_G3o9AHk,5
         | 
| 2 | 
            +
            claude_mpm/__init__.py,sha256=_adJRYaqKpyQFHGdsXrUgODkLmAXt4NRTj8khx4miAY,1512
         | 
| 3 3 | 
             
            claude_mpm/__main__.py,sha256=8IcM9tEbTqSN_er04eKTPX3AGo6qzRiTnPI7KfIf7rw,641
         | 
| 4 | 
            -
            claude_mpm/constants.py,sha256= | 
| 4 | 
            +
            claude_mpm/constants.py,sha256=2r2YXHgILU9Vf_HW3alxx7Ma6rk72C0-arsyDqLMZrY,5248
         | 
| 5 5 | 
             
            claude_mpm/deployment_paths.py,sha256=JO7-fhhp_AkVB7ZssggHDBbee-r2sokpkqjoqnQLTmM,9073
         | 
| 6 6 | 
             
            claude_mpm/init.py,sha256=hK_ROp6FsgTjpi-VJ_Z4FJICNEXwchh6F2KOqms-kfI,14938
         | 
| 7 7 | 
             
            claude_mpm/ticket_wrapper.py,sha256=bWjLReYyuHSBguuiRm1d52rHYNHqrPJAOLUbMt4CnuM,836
         | 
| 8 8 | 
             
            claude_mpm/agents/BASE_AGENT_TEMPLATE.md,sha256=P1H5dBjwT3VsRVGxsCM1Wx7ViFhwCBWxNZOWLeJyRIw,2427
         | 
| 9 | 
            -
            claude_mpm/agents/BASE_PM.md,sha256= | 
| 10 | 
            -
            claude_mpm/agents/INSTRUCTIONS.md,sha256= | 
| 9 | 
            +
            claude_mpm/agents/BASE_PM.md,sha256=0qquMIRvJyXpHe7vs2TNwaZNuC5IdLUkLkJgY6nWgvc,7951
         | 
| 10 | 
            +
            claude_mpm/agents/INSTRUCTIONS.md,sha256=gQK3E0lcWntCyMoTXmwxuXPSyh-9zX94MU8nQT7gbaU,9750
         | 
| 11 11 | 
             
            claude_mpm/agents/MEMORY.md,sha256=zzwq4ytOrRaj64iq1q7brC6WOCQ4PDDC75TTRT8QudA,3493
         | 
| 12 12 | 
             
            claude_mpm/agents/WORKFLOW.md,sha256=K1XqSlPNAs6HkcOSBTrOD7-0BcWCn90Sb6zX1EXtV6c,4686
         | 
| 13 13 | 
             
            claude_mpm/agents/__init__.py,sha256=r-p7ervzjLPD7_8dm2tXX_fwvdTZy6KwKA03ofxN3sA,3275
         | 
| @@ -29,7 +29,8 @@ claude_mpm/agents/templates/engineer.json,sha256=C_90fbF54AZk8gwuxxLOTA5H8aXCt-7 | |
| 29 29 | 
             
            claude_mpm/agents/templates/ops.json,sha256=pXDc2RUQVv5qqDtZ9LGHXYFoccNkH5mBYIYHXSqp1h4,13776
         | 
| 30 30 | 
             
            claude_mpm/agents/templates/project_organizer.json,sha256=d1VKgiT0t7GjUBp88kgqbW6A4txgHrFRYPNvrDYkJ80,17161
         | 
| 31 31 | 
             
            claude_mpm/agents/templates/qa.json,sha256=ObztCsMr9haahOaHvaLDRHYj1TZwRxECuzluKscUb_M,10807
         | 
| 32 | 
            -
            claude_mpm/agents/templates/research.json,sha256= | 
| 32 | 
            +
            claude_mpm/agents/templates/research.json,sha256=WlPnKlojeiCBZ4H75nWexLl_dHU5cSORIqLCDp4tCMM,8419
         | 
| 33 | 
            +
            claude_mpm/agents/templates/research_memory_efficient.json,sha256=WlPnKlojeiCBZ4H75nWexLl_dHU5cSORIqLCDp4tCMM,8419
         | 
| 33 34 | 
             
            claude_mpm/agents/templates/security.json,sha256=KAJOIZeYUPbnC83S2q7ufwdmpS1xrEwWW6H9bvSNVdo,12349
         | 
| 34 35 | 
             
            claude_mpm/agents/templates/ticketing.json,sha256=Kt9lyIXP5R_XTFrTH9ePkkPDnj9y4s-CQv7y4Hy2QVc,30054
         | 
| 35 36 | 
             
            claude_mpm/agents/templates/version_control.json,sha256=yaRwaFA2JjMzCfGki2RIylKytjiVcn-lJKJ3jzTbuyY,11692
         | 
| @@ -49,19 +50,20 @@ claude_mpm/agents/templates/backup/research_agent_2025011_234551.json,sha256=pk2 | |
| 49 50 | 
             
            claude_mpm/agents/templates/backup/research_agent_20250726_234551.json,sha256=o4n_sqSbjnsFRELB2q501vgwm-o2tQNLJLYvnVP9LWU,5629
         | 
| 50 51 | 
             
            claude_mpm/agents/templates/backup/security_agent_20250726_234551.json,sha256=l5YuD-27CxKSOsRLv0bDY_tCZyds0yGbeizLb8paeFY,2322
         | 
| 51 52 | 
             
            claude_mpm/agents/templates/backup/version_control_agent_20250726_234551.json,sha256=too38RPTLJ9HutCMn0nfmEdCj2me241dx5tUYDFtu94,2143
         | 
| 52 | 
            -
            claude_mpm/cli/__init__.py,sha256= | 
| 53 | 
            +
            claude_mpm/cli/__init__.py,sha256=0qY86ZM7_C6xHUTQAGyG7D6kQuRJ_aNU0sqkDujqsYk,7060
         | 
| 53 54 | 
             
            claude_mpm/cli/__main__.py,sha256=vShalycGU13i1-OOixEb_bjl8da4_FolrKdvoiZB-64,769
         | 
| 54 | 
            -
            claude_mpm/cli/parser.py,sha256= | 
| 55 | 
            +
            claude_mpm/cli/parser.py,sha256=ocmgSLo8Wucgw14Q9oBj4F3bfL3f3vwDW6ng_sXzM9E,31010
         | 
| 55 56 | 
             
            claude_mpm/cli/ticket_cli.py,sha256=Jftgan7t7ZGNWo9zuZoPcw5zItCrVpBjPSOWz3FuIXE,919
         | 
| 56 57 | 
             
            claude_mpm/cli/utils.py,sha256=qNIbQcA6iE46lsve-GyoIw6eyd9ksHZz3tQA4bSmtt8,6325
         | 
| 57 | 
            -
            claude_mpm/cli/commands/__init__.py,sha256= | 
| 58 | 
            +
            claude_mpm/cli/commands/__init__.py,sha256=ebHYAmkAlbAv8Y19rrNQF6ZkFOWOnvAU0XYHl-l3oEE,729
         | 
| 58 59 | 
             
            claude_mpm/cli/commands/agents.py,sha256=E8Nyn2NyZqpHmQiK9t7-r1AfcCZFKLFMsKuo6Ed5T08,33831
         | 
| 59 60 | 
             
            claude_mpm/cli/commands/aggregate.py,sha256=rFFIYlOosGnw_DvTuWKw_6sxJeYag3RdACPSz0RHZyE,14869
         | 
| 61 | 
            +
            claude_mpm/cli/commands/cleanup.py,sha256=9N-oMZgHXKf4nAyiMlSG9DbSbjUndac5SxmQEItMZrU,14324
         | 
| 60 62 | 
             
            claude_mpm/cli/commands/config.py,sha256=50LzTVlvR1LbeW25i-oSx4D6BZGa48DXuLLGXKhejyk,9919
         | 
| 61 63 | 
             
            claude_mpm/cli/commands/info.py,sha256=ETL6jC08OTQVTPjs219Y0m3FzfKOUlI0-yI81AI8FXY,2990
         | 
| 62 64 | 
             
            claude_mpm/cli/commands/memory.py,sha256=ymw4EatEKHfvvMHSy6dr4-x9OB7e1nZdJS0EP0f5paI,37350
         | 
| 63 65 | 
             
            claude_mpm/cli/commands/monitor.py,sha256=80_tmSdfn_2cYpzxxPu9GnvFW0eixlSJ4wCqbn8VSCM,12407
         | 
| 64 | 
            -
            claude_mpm/cli/commands/run.py,sha256= | 
| 66 | 
            +
            claude_mpm/cli/commands/run.py,sha256=cn-IcH2S4ss0-NRmyu7R2n0qzk7KIUoRhJXd3h5G7g4,43550
         | 
| 65 67 | 
             
            claude_mpm/cli/commands/tickets.py,sha256=c2v8i510cvw8hvaPjpZR4jnSmLZRyw0xJr3wwzAh9TE,21029
         | 
| 66 68 | 
             
            claude_mpm/cli_module/__init__.py,sha256=CkMp4gzWKoZZF_qKyBDi2sQaZw_GLWZYLtKouv-4f8s,390
         | 
| 67 69 | 
             
            claude_mpm/cli_module/args.py,sha256=nilYpziBsoEySO4W1hQ2MRJyn9TFx3c3TrucyMMhRtk,7970
         | 
| @@ -77,8 +79,8 @@ claude_mpm/core/agent_registry.py,sha256=YvEu-ZBc7XBi9KC2ZV8sWbVAuk0iwi38tg2cK45 | |
| 77 79 | 
             
            claude_mpm/core/agent_session_manager.py,sha256=6alXQr4gnMR-unT4J1ryEtTxJqQolA0-NgPQN6X3lqY,11212
         | 
| 78 80 | 
             
            claude_mpm/core/base_service.py,sha256=qWI_rUybHmmKroptJxcE4rzPBhK8yeMKIt2JqnqJB7E,29125
         | 
| 79 81 | 
             
            claude_mpm/core/cache.py,sha256=QoDzPSs6LFA4aKvoBe_PYdTLn0KbIYL4YlN-Z2iiPoc,18164
         | 
| 80 | 
            -
            claude_mpm/core/claude_runner.py,sha256= | 
| 81 | 
            -
            claude_mpm/core/config.py,sha256= | 
| 82 | 
            +
            claude_mpm/core/claude_runner.py,sha256=tBP1-vHvFr6Db3v-qsDB5iildz98lXzFVKE2IesgMHg,66650
         | 
| 83 | 
            +
            claude_mpm/core/config.py,sha256=lte-9RN19t6AWHApAPiTqOFRrvFgDN2X-ys06f0fW08,29689
         | 
| 82 84 | 
             
            claude_mpm/core/config_aliases.py,sha256=uilRxeIVMY4ZM_I7lnUeR0n4_nmiOpW2jY2_aW4udNA,10105
         | 
| 83 85 | 
             
            claude_mpm/core/config_paths.py,sha256=SwoB02p7GVw5pnEasC5wPyjfFZKxCsQvQmepRCpm-Es,4971
         | 
| 84 86 | 
             
            claude_mpm/core/constants.py,sha256=kR_3uG7iW4vNk780xyYYE3LZ7ERZjCpAzELdFov-Fws,12106
         | 
| @@ -100,7 +102,7 @@ claude_mpm/core/optimized_agent_loader.py,sha256=dJEFVyLI6AXf4t_3ZNJMt_qHvt4Wj1J | |
| 100 102 | 
             
            claude_mpm/core/optimized_startup.py,sha256=bjm3e6YGSQP6i75664A2KEQAOENuoBYIxX-kCgj2VxM,16176
         | 
| 101 103 | 
             
            claude_mpm/core/pm_hook_interceptor.py,sha256=PRaloqgxn-Alt9HflrywYXRL2GL3Ixb8Wxov8GfAMMU,7173
         | 
| 102 104 | 
             
            claude_mpm/core/service_registry.py,sha256=m8V1ifkuvFjTw5jB0gyAjybiqBOxusA7j22SUxqitsg,11903
         | 
| 103 | 
            -
            claude_mpm/core/session_manager.py,sha256= | 
| 105 | 
            +
            claude_mpm/core/session_manager.py,sha256=TzZnF7rumWvphRLf16g1HhSPYix45mrGM9EphVGoiYI,12368
         | 
| 104 106 | 
             
            claude_mpm/core/socketio_pool.py,sha256=sC5gcKo6t_TWC2Reu22EbD3ug-zK-_yWAInWj5tEBCo,29496
         | 
| 105 107 | 
             
            claude_mpm/core/tool_access_control.py,sha256=htZbDhC8s7D7BVqfmk0BwRrYJnlnUAk8_NeJKOaeNlg,6632
         | 
| 106 108 | 
             
            claude_mpm/core/types.py,sha256=Ybl7cmMXC34hybkFO2x_YQr88yH1PzMJOhGNkd4URpw,7817
         | 
| @@ -260,9 +262,9 @@ claude_mpm/utils/session_logging.py,sha256=9G0AzB7V0WkhLQlN0ocqbyDv0ifooEsJ5UPXI | |
| 260 262 | 
             
            claude_mpm/validation/__init__.py,sha256=bJ19g9lnk7yIjtxzN8XPegp87HTFBzCrGQOpFgRTf3g,155
         | 
| 261 263 | 
             
            claude_mpm/validation/agent_validator.py,sha256=OEYhmy0K99pkoCCoVea2Q-d1JMiDyhEpzEJikuF8T-U,20910
         | 
| 262 264 | 
             
            claude_mpm/validation/frontmatter_validator.py,sha256=vSinu0XD9-31h0-ePYiYivBbxTZEanhymLinTCODr7k,7206
         | 
| 263 | 
            -
            claude_mpm-3.9. | 
| 264 | 
            -
            claude_mpm-3.9. | 
| 265 | 
            -
            claude_mpm-3.9. | 
| 266 | 
            -
            claude_mpm-3.9. | 
| 267 | 
            -
            claude_mpm-3.9. | 
| 268 | 
            -
            claude_mpm-3.9. | 
| 265 | 
            +
            claude_mpm-3.9.6.dist-info/licenses/LICENSE,sha256=cSdDfXjoTVhstrERrqme4zgxAu4GubU22zVEHsiXGxs,1071
         | 
| 266 | 
            +
            claude_mpm-3.9.6.dist-info/METADATA,sha256=T65C4-M2SRG0P4IO2FzS-58m3GDtvlHpRUTyB7KvDgw,8680
         | 
| 267 | 
            +
            claude_mpm-3.9.6.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
         | 
| 268 | 
            +
            claude_mpm-3.9.6.dist-info/entry_points.txt,sha256=3_d7wLrg9sRmQ1SfrFGWoTNL8Wrd6lQb2XVSYbTwRIg,324
         | 
| 269 | 
            +
            claude_mpm-3.9.6.dist-info/top_level.txt,sha256=1nUg3FEaBySgm8t-s54jK5zoPnu3_eY6EP6IOlekyHA,11
         | 
| 270 | 
            +
            claude_mpm-3.9.6.dist-info/RECORD,,
         | 
| 
            File without changes
         | 
| 
            File without changes
         | 
| 
            File without changes
         | 
| 
            File without changes
         |