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.
@@ -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,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: claude-mpm
3
- Version: 3.9.4
3
+ Version: 3.9.6
4
4
  Summary: Claude Multi-agent Project Manager - Clean orchestration with ticket management
5
5
  Home-page: https://github.com/bobmatnyc/claude-mpm
6
6
  Author: Claude MPM Team
@@ -1,13 +1,13 @@
1
- claude_mpm/VERSION,sha256=qncwOqyY7d82tgxVa7TxJStIKb52qA2UhTpaLs0fB2Y,6
2
- claude_mpm/__init__.py,sha256=ix_J0PHZBz37nVBDEYJmLpwnURlWuBKKQ8rK_00TFpk,964
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=xdYTQfOdrnp_fp2A-P4gA68X-XMq29cCwF6Xdwg3oQE,5217
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=WxBF_Mif5a9hdXdr6m9K5X3KWQ6QKywk19pDV_SHNXI,5905
10
- claude_mpm/agents/INSTRUCTIONS.md,sha256=k5VfQUeUCJYxzav6MvtmC-D3XgIH3B_4HSgWuOfz_UQ,8305
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=pk2Tg0GVSPEkPEnMw5Iax5QUFY8XY7uF1uPG6eHBe14,12336
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=gm_YJQ-4tGZbEP3IB-Px3KxQJjObHCO_-2r_z7qsgvM,6989
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=qdB3ImlWVJplw0eVGztEOi3zvLbHCKKZ3dNzrKULE-M,30708
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=INWIDbjUthoUNwu2DnmFQPlvXwo7rfZbSsI6SFXyCAQ,671
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=8RiN-7whjqJ83zlYDzYSXOhkpuwQf21eZzGoGMj85k4,40097
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=rqUgQL31-oj8hzdcOcrn5HMhqB3X6SA13gA07QnT6bc,65743
81
- claude_mpm/core/config.py,sha256=G-vvQ9SjC8t6vlrvNodAFrHVEMm71GSarLzXt52p78k,28700
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=D6ZA7bHAgfdkv0nLKjza0FKDng5iqi___IESrb3nSuk,8292
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.4.dist-info/licenses/LICENSE,sha256=cSdDfXjoTVhstrERrqme4zgxAu4GubU22zVEHsiXGxs,1071
264
- claude_mpm-3.9.4.dist-info/METADATA,sha256=_rGegraOba_N2dJxC3RuA0Y34dl5raiQVaxdnyNeq0g,8680
265
- claude_mpm-3.9.4.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
266
- claude_mpm-3.9.4.dist-info/entry_points.txt,sha256=3_d7wLrg9sRmQ1SfrFGWoTNL8Wrd6lQb2XVSYbTwRIg,324
267
- claude_mpm-3.9.4.dist-info/top_level.txt,sha256=1nUg3FEaBySgm8t-s54jK5zoPnu3_eY6EP6IOlekyHA,11
268
- claude_mpm-3.9.4.dist-info/RECORD,,
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,,