claude-mpm 3.4.14__py3-none-any.whl → 3.4.16__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.
@@ -15,6 +15,7 @@ import time
15
15
  from datetime import datetime
16
16
  from typing import Set, Dict, Any, Optional, List
17
17
  from collections import deque
18
+ from pathlib import Path
18
19
 
19
20
  try:
20
21
  import socketio
@@ -294,9 +295,12 @@ class SocketIOServer:
294
295
  self.app.router.add_get('/dashboard', self._handle_dashboard)
295
296
 
296
297
  # Add static file serving for web assets
297
- static_path = get_project_root() / 'src' / 'claude_mpm' / 'dashboard' / 'static'
298
- if static_path.exists():
298
+ static_path = self._find_static_path()
299
+ if static_path and static_path.exists():
299
300
  self.app.router.add_static('/static/', path=str(static_path), name='static')
301
+ self.logger.info(f"Static files served from: {static_path}")
302
+ else:
303
+ self.logger.warning("Static files directory not found - CSS/JS files will not be available")
300
304
 
301
305
  # Register event handlers
302
306
  self._register_events()
@@ -346,6 +350,57 @@ class SocketIOServer:
346
350
  'Access-Control-Allow-Headers': 'Content-Type, Accept'
347
351
  })
348
352
 
353
+ def _find_static_path(self):
354
+ """Find the static files directory using multiple approaches.
355
+
356
+ WHY: Static files need to be found in both development and installed environments.
357
+ This uses the same multi-approach pattern as dashboard HTML resolution.
358
+ """
359
+
360
+ # Approach 1: Use module-relative path (works in installed environment)
361
+ try:
362
+ import claude_mpm.dashboard
363
+
364
+ # Try __file__ attribute first
365
+ if hasattr(claude_mpm.dashboard, '__file__') and claude_mpm.dashboard.__file__:
366
+ dashboard_module_path = Path(claude_mpm.dashboard.__file__).parent
367
+ candidate_path = dashboard_module_path / "static"
368
+ if candidate_path.exists():
369
+ self.logger.info(f"Found static files using module __file__ path: {candidate_path}")
370
+ return candidate_path
371
+
372
+ # Try __path__ attribute for namespace packages
373
+ elif hasattr(claude_mpm.dashboard, '__path__') and claude_mpm.dashboard.__path__:
374
+ # __path__ is a list, take the first entry
375
+ dashboard_module_path = Path(claude_mpm.dashboard.__path__[0])
376
+ candidate_path = dashboard_module_path / "static"
377
+ if candidate_path.exists():
378
+ self.logger.info(f"Found static files using module __path__: {candidate_path}")
379
+ return candidate_path
380
+
381
+ except Exception as e:
382
+ self.logger.debug(f"Module-relative static path failed: {e}")
383
+
384
+ # Approach 2: Use project root (works in development environment)
385
+ try:
386
+ candidate_path = get_project_root() / 'src' / 'claude_mpm' / 'dashboard' / 'static'
387
+ if candidate_path.exists():
388
+ self.logger.info(f"Found static files using project root: {candidate_path}")
389
+ return candidate_path
390
+ except Exception as e:
391
+ self.logger.debug(f"Project root static path failed: {e}")
392
+
393
+ # Approach 3: Search for static files in package installation
394
+ try:
395
+ candidate_path = get_project_root() / 'claude_mpm' / 'dashboard' / 'static'
396
+ if candidate_path.exists():
397
+ self.logger.info(f"Found static files using package path: {candidate_path}")
398
+ return candidate_path
399
+ except Exception as e:
400
+ self.logger.debug(f"Package static path failed: {e}")
401
+
402
+ return None
403
+
349
404
  async def _handle_dashboard(self, request):
350
405
  """Serve the dashboard HTML file."""
351
406
  # Try to find dashboard path using multiple approaches
@@ -354,11 +409,24 @@ class SocketIOServer:
354
409
  # Approach 1: Use module-relative path (works in installed environment)
355
410
  try:
356
411
  import claude_mpm.dashboard
357
- dashboard_module_path = Path(claude_mpm.dashboard.__file__).parent
358
- candidate_path = dashboard_module_path / "templates" / "index.html"
359
- if candidate_path.exists():
360
- dashboard_path = candidate_path
361
- self.logger.info(f"Found dashboard using module path: {dashboard_path}")
412
+
413
+ # Try __file__ attribute first
414
+ if hasattr(claude_mpm.dashboard, '__file__') and claude_mpm.dashboard.__file__:
415
+ dashboard_module_path = Path(claude_mpm.dashboard.__file__).parent
416
+ candidate_path = dashboard_module_path / "templates" / "index.html"
417
+ if candidate_path.exists():
418
+ dashboard_path = candidate_path
419
+ self.logger.info(f"Found dashboard using module __file__ path: {dashboard_path}")
420
+
421
+ # Try __path__ attribute for namespace packages
422
+ elif hasattr(claude_mpm.dashboard, '__path__') and claude_mpm.dashboard.__path__:
423
+ # __path__ is a list, take the first entry
424
+ dashboard_module_path = Path(claude_mpm.dashboard.__path__[0])
425
+ candidate_path = dashboard_module_path / "templates" / "index.html"
426
+ if candidate_path.exists():
427
+ dashboard_path = candidate_path
428
+ self.logger.info(f"Found dashboard using module __path__: {dashboard_path}")
429
+
362
430
  except Exception as e:
363
431
  self.logger.debug(f"Module-relative path failed: {e}")
364
432
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: claude-mpm
3
- Version: 3.4.14
3
+ Version: 3.4.16
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
@@ -159,7 +159,7 @@ claude_mpm/services/project_analyzer.py,sha256=3Ub_Tpcxm0LnYgcAipebvWr6TfofVqZNM
159
159
  claude_mpm/services/recovery_manager.py,sha256=K46vXbEWbxFUoS42s34OxN1rkddpisGG7E_ZdRyAZ-A,25792
160
160
  claude_mpm/services/shared_prompt_cache.py,sha256=D04lrRWyg0lHyqGcAHy7IYvRHRKSg6EOpAJwBUPa2wk,29890
161
161
  claude_mpm/services/socketio_client_manager.py,sha256=2Ly63iiGA_BUzf73UwQDu9Q75wA1C4O1CWFv8hi8bms,18074
162
- claude_mpm/services/socketio_server.py,sha256=6sCeHdZHW3glxrI_ZzynUwFQ7a-iO5OXnAtIDu7B3oY,81395
162
+ claude_mpm/services/socketio_server.py,sha256=E1i_YrUFa7AKdxfKgNkC0daUzytA8qiHRJxD_JRcXPk,84929
163
163
  claude_mpm/services/standalone_socketio_server.py,sha256=TfdtwdtlKA6cZyTon9O7zkSeu0H-1HpW0te7vu1r3o0,55214
164
164
  claude_mpm/services/ticket_manager.py,sha256=Ki11YjBkDax8BFVSaDdOBk3K4VU5gvdbgq9AmCyyoZ0,7454
165
165
  claude_mpm/services/ticket_manager_di.py,sha256=pIsIGncbboKzBYSRQTO7ZX5MuQzV6iFfIflvKe6u1jw,11123
@@ -213,9 +213,9 @@ claude_mpm/utils/path_operations.py,sha256=6pLMnAWBVzHkgp6JyQHmHbGD-dWn-nX21yV4E
213
213
  claude_mpm/utils/paths.py,sha256=Xv0SZWdZRkRjN9e6clBcA165ya00GNQxt7SwMz51tfA,10153
214
214
  claude_mpm/validation/__init__.py,sha256=bJ19g9lnk7yIjtxzN8XPegp87HTFBzCrGQOpFgRTf3g,155
215
215
  claude_mpm/validation/agent_validator.py,sha256=GCA2b2rKhKDeaNyUqWxTiWIs3sDdWjD9cgOFRp9K6ic,18227
216
- claude_mpm-3.4.14.dist-info/licenses/LICENSE,sha256=cSdDfXjoTVhstrERrqme4zgxAu4GubU22zVEHsiXGxs,1071
217
- claude_mpm-3.4.14.dist-info/METADATA,sha256=A2ldIPNi-3VTlgSXiwiSbnIxAqjov4jOfc1aNYDylAk,6499
218
- claude_mpm-3.4.14.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
219
- claude_mpm-3.4.14.dist-info/entry_points.txt,sha256=3_d7wLrg9sRmQ1SfrFGWoTNL8Wrd6lQb2XVSYbTwRIg,324
220
- claude_mpm-3.4.14.dist-info/top_level.txt,sha256=1nUg3FEaBySgm8t-s54jK5zoPnu3_eY6EP6IOlekyHA,11
221
- claude_mpm-3.4.14.dist-info/RECORD,,
216
+ claude_mpm-3.4.16.dist-info/licenses/LICENSE,sha256=cSdDfXjoTVhstrERrqme4zgxAu4GubU22zVEHsiXGxs,1071
217
+ claude_mpm-3.4.16.dist-info/METADATA,sha256=yLlPpKYEh2CCxxk250Xuo7uSEBNX74LycyuBBHdhQ18,6499
218
+ claude_mpm-3.4.16.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
219
+ claude_mpm-3.4.16.dist-info/entry_points.txt,sha256=3_d7wLrg9sRmQ1SfrFGWoTNL8Wrd6lQb2XVSYbTwRIg,324
220
+ claude_mpm-3.4.16.dist-info/top_level.txt,sha256=1nUg3FEaBySgm8t-s54jK5zoPnu3_eY6EP6IOlekyHA,11
221
+ claude_mpm-3.4.16.dist-info/RECORD,,