claude-mpm 3.3.0__py3-none-any.whl → 3.3.2__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/agents/templates/data_engineer.json +1 -1
- claude_mpm/agents/templates/documentation.json +1 -1
- claude_mpm/agents/templates/engineer.json +1 -1
- claude_mpm/agents/templates/ops.json +1 -1
- claude_mpm/agents/templates/pm.json +1 -1
- claude_mpm/agents/templates/qa.json +1 -1
- claude_mpm/agents/templates/research.json +1 -1
- claude_mpm/agents/templates/security.json +1 -1
- claude_mpm/agents/templates/test_integration.json +112 -0
- claude_mpm/agents/templates/version_control.json +1 -1
- claude_mpm/cli/commands/memory.py +575 -25
- claude_mpm/cli/commands/run.py +115 -14
- claude_mpm/cli/parser.py +76 -0
- claude_mpm/constants.py +5 -0
- claude_mpm/core/claude_runner.py +13 -11
- claude_mpm/core/session_manager.py +46 -0
- claude_mpm/core/simple_runner.py +13 -11
- claude_mpm/hooks/claude_hooks/hook_handler.py +2 -26
- claude_mpm/services/agent_memory_manager.py +264 -23
- claude_mpm/services/memory_builder.py +491 -0
- claude_mpm/services/memory_optimizer.py +619 -0
- claude_mpm/services/memory_router.py +445 -0
- claude_mpm/services/socketio_server.py +184 -20
- claude_mpm-3.3.2.dist-info/METADATA +159 -0
- {claude_mpm-3.3.0.dist-info → claude_mpm-3.3.2.dist-info}/RECORD +29 -28
- claude_mpm/agents/templates/test-integration-agent.md +0 -34
- claude_mpm/core/websocket_handler.py +0 -233
- claude_mpm/services/websocket_server.py +0 -376
- claude_mpm-3.3.0.dist-info/METADATA +0 -432
- {claude_mpm-3.3.0.dist-info → claude_mpm-3.3.2.dist-info}/WHEEL +0 -0
- {claude_mpm-3.3.0.dist-info → claude_mpm-3.3.2.dist-info}/entry_points.txt +0 -0
- {claude_mpm-3.3.0.dist-info → claude_mpm-3.3.2.dist-info}/licenses/LICENSE +0 -0
- {claude_mpm-3.3.0.dist-info → claude_mpm-3.3.2.dist-info}/top_level.txt +0 -0
|
@@ -254,10 +254,22 @@ class SocketIOServer:
|
|
|
254
254
|
self.app = web.Application()
|
|
255
255
|
self.sio.attach(self.app)
|
|
256
256
|
|
|
257
|
+
# Add CORS middleware
|
|
258
|
+
import aiohttp_cors
|
|
259
|
+
cors = aiohttp_cors.setup(self.app, defaults={
|
|
260
|
+
"*": aiohttp_cors.ResourceOptions(
|
|
261
|
+
allow_credentials=True,
|
|
262
|
+
expose_headers="*",
|
|
263
|
+
allow_headers="*",
|
|
264
|
+
allow_methods="*"
|
|
265
|
+
)
|
|
266
|
+
})
|
|
267
|
+
|
|
257
268
|
# Add HTTP routes
|
|
258
269
|
self.app.router.add_get('/health', self._handle_health)
|
|
259
270
|
self.app.router.add_get('/status', self._handle_health)
|
|
260
271
|
self.app.router.add_get('/api/git-diff', self._handle_git_diff)
|
|
272
|
+
self.app.router.add_options('/api/git-diff', self._handle_cors_preflight)
|
|
261
273
|
|
|
262
274
|
# Add dashboard routes
|
|
263
275
|
self.app.router.add_get('/', self._handle_dashboard)
|
|
@@ -310,6 +322,10 @@ class SocketIOServer:
|
|
|
310
322
|
"port": self.port,
|
|
311
323
|
"host": self.host,
|
|
312
324
|
"clients_connected": len(self.clients)
|
|
325
|
+
}, headers={
|
|
326
|
+
'Access-Control-Allow-Origin': '*',
|
|
327
|
+
'Access-Control-Allow-Methods': 'GET, POST, OPTIONS',
|
|
328
|
+
'Access-Control-Allow-Headers': 'Content-Type, Accept'
|
|
313
329
|
})
|
|
314
330
|
|
|
315
331
|
async def _handle_dashboard(self, request):
|
|
@@ -321,6 +337,18 @@ class SocketIOServer:
|
|
|
321
337
|
return web.FileResponse(str(dashboard_path))
|
|
322
338
|
else:
|
|
323
339
|
return web.Response(text=f"Dashboard not found at: {dashboard_path}", status=404)
|
|
340
|
+
|
|
341
|
+
async def _handle_cors_preflight(self, request):
|
|
342
|
+
"""Handle CORS preflight requests."""
|
|
343
|
+
return web.Response(
|
|
344
|
+
status=200,
|
|
345
|
+
headers={
|
|
346
|
+
'Access-Control-Allow-Origin': '*',
|
|
347
|
+
'Access-Control-Allow-Methods': 'GET, POST, OPTIONS',
|
|
348
|
+
'Access-Control-Allow-Headers': 'Content-Type, Accept, Authorization',
|
|
349
|
+
'Access-Control-Max-Age': '86400'
|
|
350
|
+
}
|
|
351
|
+
)
|
|
324
352
|
|
|
325
353
|
async def _handle_git_diff(self, request):
|
|
326
354
|
"""Handle git diff requests for file operations.
|
|
@@ -336,23 +364,44 @@ class SocketIOServer:
|
|
|
336
364
|
timestamp = request.query.get('timestamp')
|
|
337
365
|
working_dir = request.query.get('working_dir', os.getcwd())
|
|
338
366
|
|
|
367
|
+
self.logger.info(f"Git diff API request: file={file_path}, timestamp={timestamp}, working_dir={working_dir}")
|
|
368
|
+
|
|
339
369
|
if not file_path:
|
|
370
|
+
self.logger.warning("Git diff request missing file parameter")
|
|
340
371
|
return web.json_response({
|
|
372
|
+
"success": False,
|
|
341
373
|
"error": "Missing required parameter: file"
|
|
342
|
-
}, status=400
|
|
374
|
+
}, status=400, headers={
|
|
375
|
+
'Access-Control-Allow-Origin': '*',
|
|
376
|
+
'Access-Control-Allow-Methods': 'GET, POST, OPTIONS',
|
|
377
|
+
'Access-Control-Allow-Headers': 'Content-Type, Accept'
|
|
378
|
+
})
|
|
343
379
|
|
|
344
380
|
self.logger.debug(f"Git diff requested for file: {file_path}, timestamp: {timestamp}")
|
|
345
381
|
|
|
346
382
|
# Generate git diff using the _generate_git_diff helper
|
|
347
383
|
diff_result = await self._generate_git_diff(file_path, timestamp, working_dir)
|
|
348
384
|
|
|
349
|
-
|
|
385
|
+
self.logger.info(f"Git diff result: success={diff_result.get('success', False)}, method={diff_result.get('method', 'unknown')}")
|
|
386
|
+
|
|
387
|
+
return web.json_response(diff_result, headers={
|
|
388
|
+
'Access-Control-Allow-Origin': '*',
|
|
389
|
+
'Access-Control-Allow-Methods': 'GET, POST, OPTIONS',
|
|
390
|
+
'Access-Control-Allow-Headers': 'Content-Type, Accept'
|
|
391
|
+
})
|
|
350
392
|
|
|
351
393
|
except Exception as e:
|
|
352
394
|
self.logger.error(f"Error generating git diff: {e}")
|
|
395
|
+
import traceback
|
|
396
|
+
self.logger.error(f"Git diff error traceback: {traceback.format_exc()}")
|
|
353
397
|
return web.json_response({
|
|
398
|
+
"success": False,
|
|
354
399
|
"error": f"Failed to generate git diff: {str(e)}"
|
|
355
|
-
}, status=500
|
|
400
|
+
}, status=500, headers={
|
|
401
|
+
'Access-Control-Allow-Origin': '*',
|
|
402
|
+
'Access-Control-Allow-Methods': 'GET, POST, OPTIONS',
|
|
403
|
+
'Access-Control-Allow-Headers': 'Content-Type, Accept'
|
|
404
|
+
})
|
|
356
405
|
|
|
357
406
|
async def _generate_git_diff(self, file_path: str, timestamp: Optional[str] = None, working_dir: str = None):
|
|
358
407
|
"""Generate git diff for a specific file operation.
|
|
@@ -370,17 +419,36 @@ class SocketIOServer:
|
|
|
370
419
|
dict: Contains diff content, metadata, and status information
|
|
371
420
|
"""
|
|
372
421
|
try:
|
|
422
|
+
# If file_path is absolute, determine its git repository
|
|
423
|
+
if os.path.isabs(file_path):
|
|
424
|
+
# Find the directory containing the file
|
|
425
|
+
file_dir = os.path.dirname(file_path)
|
|
426
|
+
if os.path.exists(file_dir):
|
|
427
|
+
# Try to find the git root from the file's directory
|
|
428
|
+
current_dir = file_dir
|
|
429
|
+
while current_dir != "/" and current_dir:
|
|
430
|
+
if os.path.exists(os.path.join(current_dir, ".git")):
|
|
431
|
+
working_dir = current_dir
|
|
432
|
+
self.logger.info(f"Found git repository at: {working_dir}")
|
|
433
|
+
break
|
|
434
|
+
current_dir = os.path.dirname(current_dir)
|
|
435
|
+
else:
|
|
436
|
+
# If no git repo found, use the file's directory
|
|
437
|
+
working_dir = file_dir
|
|
438
|
+
self.logger.info(f"No git repo found, using file's directory: {working_dir}")
|
|
439
|
+
|
|
373
440
|
if working_dir is None:
|
|
374
441
|
working_dir = os.getcwd()
|
|
375
442
|
|
|
376
|
-
#
|
|
443
|
+
# For read-only git operations, we can work from any directory
|
|
444
|
+
# by passing the -C flag to git commands instead of changing directories
|
|
377
445
|
original_cwd = os.getcwd()
|
|
378
446
|
try:
|
|
379
|
-
|
|
447
|
+
# We'll use git -C <working_dir> for all commands instead of chdir
|
|
380
448
|
|
|
381
449
|
# Check if this is a git repository
|
|
382
450
|
git_check = await asyncio.create_subprocess_exec(
|
|
383
|
-
'git', 'rev-parse', '--git-dir',
|
|
451
|
+
'git', '-C', working_dir, 'rev-parse', '--git-dir',
|
|
384
452
|
stdout=asyncio.subprocess.PIPE,
|
|
385
453
|
stderr=asyncio.subprocess.PIPE
|
|
386
454
|
)
|
|
@@ -388,6 +456,7 @@ class SocketIOServer:
|
|
|
388
456
|
|
|
389
457
|
if git_check.returncode != 0:
|
|
390
458
|
return {
|
|
459
|
+
"success": False,
|
|
391
460
|
"error": "Not a git repository",
|
|
392
461
|
"file_path": file_path,
|
|
393
462
|
"working_dir": working_dir
|
|
@@ -395,14 +464,14 @@ class SocketIOServer:
|
|
|
395
464
|
|
|
396
465
|
# Get the absolute path of the file relative to git root
|
|
397
466
|
git_root_proc = await asyncio.create_subprocess_exec(
|
|
398
|
-
'git', 'rev-parse', '--show-toplevel',
|
|
467
|
+
'git', '-C', working_dir, 'rev-parse', '--show-toplevel',
|
|
399
468
|
stdout=asyncio.subprocess.PIPE,
|
|
400
469
|
stderr=asyncio.subprocess.PIPE
|
|
401
470
|
)
|
|
402
471
|
git_root_output, _ = await git_root_proc.communicate()
|
|
403
472
|
|
|
404
473
|
if git_root_proc.returncode != 0:
|
|
405
|
-
return {"error": "Failed to determine git root directory"}
|
|
474
|
+
return {"success": False, "error": "Failed to determine git root directory"}
|
|
406
475
|
|
|
407
476
|
git_root = git_root_output.decode().strip()
|
|
408
477
|
|
|
@@ -424,7 +493,7 @@ class SocketIOServer:
|
|
|
424
493
|
|
|
425
494
|
# Find commits that modified this file around the timestamp
|
|
426
495
|
log_proc = await asyncio.create_subprocess_exec(
|
|
427
|
-
'git', 'log', '--oneline', '--since', git_since,
|
|
496
|
+
'git', '-C', working_dir, 'log', '--oneline', '--since', git_since,
|
|
428
497
|
'--until', f'{git_since} +1 hour', '--', file_path,
|
|
429
498
|
stdout=asyncio.subprocess.PIPE,
|
|
430
499
|
stderr=asyncio.subprocess.PIPE
|
|
@@ -439,7 +508,7 @@ class SocketIOServer:
|
|
|
439
508
|
|
|
440
509
|
# Get the diff for this specific commit
|
|
441
510
|
diff_proc = await asyncio.create_subprocess_exec(
|
|
442
|
-
'git', 'show', '--format=fuller', commit_hash, '--', file_path,
|
|
511
|
+
'git', '-C', working_dir, 'show', '--format=fuller', commit_hash, '--', file_path,
|
|
443
512
|
stdout=asyncio.subprocess.PIPE,
|
|
444
513
|
stderr=asyncio.subprocess.PIPE
|
|
445
514
|
)
|
|
@@ -459,7 +528,7 @@ class SocketIOServer:
|
|
|
459
528
|
|
|
460
529
|
# Fallback: Get the most recent change to the file
|
|
461
530
|
log_proc = await asyncio.create_subprocess_exec(
|
|
462
|
-
'git', 'log', '-1', '--oneline', '--', file_path,
|
|
531
|
+
'git', '-C', working_dir, 'log', '-1', '--oneline', '--', file_path,
|
|
463
532
|
stdout=asyncio.subprocess.PIPE,
|
|
464
533
|
stderr=asyncio.subprocess.PIPE
|
|
465
534
|
)
|
|
@@ -470,7 +539,7 @@ class SocketIOServer:
|
|
|
470
539
|
|
|
471
540
|
# Get the diff for the most recent commit
|
|
472
541
|
diff_proc = await asyncio.create_subprocess_exec(
|
|
473
|
-
'git', 'show', '--format=fuller', commit_hash, '--', file_path,
|
|
542
|
+
'git', '-C', working_dir, 'show', '--format=fuller', commit_hash, '--', file_path,
|
|
474
543
|
stdout=asyncio.subprocess.PIPE,
|
|
475
544
|
stderr=asyncio.subprocess.PIPE
|
|
476
545
|
)
|
|
@@ -486,9 +555,45 @@ class SocketIOServer:
|
|
|
486
555
|
"timestamp": timestamp
|
|
487
556
|
}
|
|
488
557
|
|
|
489
|
-
#
|
|
558
|
+
# Try to show unstaged changes first
|
|
559
|
+
diff_proc = await asyncio.create_subprocess_exec(
|
|
560
|
+
'git', '-C', working_dir, 'diff', '--', file_path,
|
|
561
|
+
stdout=asyncio.subprocess.PIPE,
|
|
562
|
+
stderr=asyncio.subprocess.PIPE
|
|
563
|
+
)
|
|
564
|
+
diff_output, _ = await diff_proc.communicate()
|
|
565
|
+
|
|
566
|
+
if diff_proc.returncode == 0 and diff_output.decode().strip():
|
|
567
|
+
return {
|
|
568
|
+
"success": True,
|
|
569
|
+
"diff": diff_output.decode(),
|
|
570
|
+
"commit_hash": "unstaged_changes",
|
|
571
|
+
"file_path": file_path,
|
|
572
|
+
"method": "unstaged_changes",
|
|
573
|
+
"timestamp": timestamp
|
|
574
|
+
}
|
|
575
|
+
|
|
576
|
+
# Then try staged changes
|
|
577
|
+
diff_proc = await asyncio.create_subprocess_exec(
|
|
578
|
+
'git', '-C', working_dir, 'diff', '--cached', '--', file_path,
|
|
579
|
+
stdout=asyncio.subprocess.PIPE,
|
|
580
|
+
stderr=asyncio.subprocess.PIPE
|
|
581
|
+
)
|
|
582
|
+
diff_output, _ = await diff_proc.communicate()
|
|
583
|
+
|
|
584
|
+
if diff_proc.returncode == 0 and diff_output.decode().strip():
|
|
585
|
+
return {
|
|
586
|
+
"success": True,
|
|
587
|
+
"diff": diff_output.decode(),
|
|
588
|
+
"commit_hash": "staged_changes",
|
|
589
|
+
"file_path": file_path,
|
|
590
|
+
"method": "staged_changes",
|
|
591
|
+
"timestamp": timestamp
|
|
592
|
+
}
|
|
593
|
+
|
|
594
|
+
# Final fallback: Show changes against HEAD
|
|
490
595
|
diff_proc = await asyncio.create_subprocess_exec(
|
|
491
|
-
'git', 'diff', 'HEAD', '--', file_path,
|
|
596
|
+
'git', '-C', working_dir, 'diff', 'HEAD', '--', file_path,
|
|
492
597
|
stdout=asyncio.subprocess.PIPE,
|
|
493
598
|
stderr=asyncio.subprocess.PIPE
|
|
494
599
|
)
|
|
@@ -506,14 +611,34 @@ class SocketIOServer:
|
|
|
506
611
|
"timestamp": timestamp
|
|
507
612
|
}
|
|
508
613
|
|
|
614
|
+
# Check if file is from a different repository
|
|
615
|
+
suggestions = [
|
|
616
|
+
"The file may not be tracked by git",
|
|
617
|
+
"The file may not have any committed changes",
|
|
618
|
+
"The timestamp may be outside the git history range"
|
|
619
|
+
]
|
|
620
|
+
|
|
621
|
+
if os.path.isabs(file_path) and not file_path.startswith(os.getcwd()):
|
|
622
|
+
current_repo = os.path.basename(os.getcwd())
|
|
623
|
+
file_repo = "unknown"
|
|
624
|
+
# Try to extract repository name from path
|
|
625
|
+
path_parts = file_path.split("/")
|
|
626
|
+
if "Projects" in path_parts:
|
|
627
|
+
idx = path_parts.index("Projects")
|
|
628
|
+
if idx + 1 < len(path_parts):
|
|
629
|
+
file_repo = path_parts[idx + 1]
|
|
630
|
+
|
|
631
|
+
suggestions.clear()
|
|
632
|
+
suggestions.append(f"This file is from the '{file_repo}' repository")
|
|
633
|
+
suggestions.append(f"The git diff viewer is running from the '{current_repo}' repository")
|
|
634
|
+
suggestions.append("Git diff can only show changes for files in the current repository")
|
|
635
|
+
suggestions.append("To view changes for this file, run the monitoring dashboard from its repository")
|
|
636
|
+
|
|
509
637
|
return {
|
|
638
|
+
"success": False,
|
|
510
639
|
"error": "No git history found for this file",
|
|
511
640
|
"file_path": file_path,
|
|
512
|
-
"suggestions":
|
|
513
|
-
"The file may not be tracked by git",
|
|
514
|
-
"The file may not have any committed changes",
|
|
515
|
-
"The timestamp may be outside the git history range"
|
|
516
|
-
]
|
|
641
|
+
"suggestions": suggestions
|
|
517
642
|
}
|
|
518
643
|
|
|
519
644
|
finally:
|
|
@@ -522,6 +647,7 @@ class SocketIOServer:
|
|
|
522
647
|
except Exception as e:
|
|
523
648
|
self.logger.error(f"Error in _generate_git_diff: {e}")
|
|
524
649
|
return {
|
|
650
|
+
"success": False,
|
|
525
651
|
"error": f"Git diff generation failed: {str(e)}",
|
|
526
652
|
"file_path": file_path
|
|
527
653
|
}
|
|
@@ -630,6 +756,44 @@ class SocketIOServer:
|
|
|
630
756
|
|
|
631
757
|
# Re-broadcast to all other clients
|
|
632
758
|
await self.sio.emit('claude_event', data, skip_sid=sid)
|
|
759
|
+
|
|
760
|
+
@self.sio.event
|
|
761
|
+
async def get_git_branch(sid, working_dir=None):
|
|
762
|
+
"""Get the current git branch for a directory"""
|
|
763
|
+
import subprocess
|
|
764
|
+
try:
|
|
765
|
+
if not working_dir:
|
|
766
|
+
working_dir = os.getcwd()
|
|
767
|
+
|
|
768
|
+
# Run git command to get current branch
|
|
769
|
+
result = subprocess.run(
|
|
770
|
+
["git", "rev-parse", "--abbrev-ref", "HEAD"],
|
|
771
|
+
cwd=working_dir,
|
|
772
|
+
capture_output=True,
|
|
773
|
+
text=True
|
|
774
|
+
)
|
|
775
|
+
|
|
776
|
+
if result.returncode == 0:
|
|
777
|
+
branch = result.stdout.strip()
|
|
778
|
+
await self.sio.emit('git_branch_response', {
|
|
779
|
+
'success': True,
|
|
780
|
+
'branch': branch,
|
|
781
|
+
'working_dir': working_dir
|
|
782
|
+
}, room=sid)
|
|
783
|
+
else:
|
|
784
|
+
await self.sio.emit('git_branch_response', {
|
|
785
|
+
'success': False,
|
|
786
|
+
'error': 'Not a git repository',
|
|
787
|
+
'working_dir': working_dir
|
|
788
|
+
}, room=sid)
|
|
789
|
+
|
|
790
|
+
except Exception as e:
|
|
791
|
+
self.logger.error(f"Error getting git branch: {e}")
|
|
792
|
+
await self.sio.emit('git_branch_response', {
|
|
793
|
+
'success': False,
|
|
794
|
+
'error': str(e),
|
|
795
|
+
'working_dir': working_dir
|
|
796
|
+
}, room=sid)
|
|
633
797
|
|
|
634
798
|
async def _send_current_status(self, sid: str):
|
|
635
799
|
"""Send current system status to a client."""
|
|
@@ -919,4 +1083,4 @@ def stop_socketio_server():
|
|
|
919
1083
|
global _socketio_server
|
|
920
1084
|
if _socketio_server:
|
|
921
1085
|
_socketio_server.stop()
|
|
922
|
-
_socketio_server = None
|
|
1086
|
+
_socketio_server = None
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: claude-mpm
|
|
3
|
+
Version: 3.3.2
|
|
4
|
+
Summary: Claude Multi-agent Project Manager - Clean orchestration with ticket management
|
|
5
|
+
Home-page: https://github.com/bobmatnyc/claude-mpm
|
|
6
|
+
Author: Claude MPM Team
|
|
7
|
+
Author-email: bob@matsuoka.com
|
|
8
|
+
License: MIT
|
|
9
|
+
Keywords: claude,orchestration,multi-agent,ticket-management
|
|
10
|
+
Classifier: Development Status :: 3 - Alpha
|
|
11
|
+
Classifier: Intended Audience :: Developers
|
|
12
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
13
|
+
Classifier: Programming Language :: Python :: 3
|
|
14
|
+
Classifier: Programming Language :: Python :: 3.8
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.9
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
19
|
+
Requires-Python: >=3.8
|
|
20
|
+
Description-Content-Type: text/markdown
|
|
21
|
+
License-File: LICENSE
|
|
22
|
+
Requires-Dist: ai-trackdown-pytools>=1.4.0
|
|
23
|
+
Requires-Dist: pyyaml>=6.0
|
|
24
|
+
Requires-Dist: python-dotenv>=0.19.0
|
|
25
|
+
Requires-Dist: rich>=13.0.0
|
|
26
|
+
Requires-Dist: click>=8.0.0
|
|
27
|
+
Requires-Dist: pexpect>=4.8.0
|
|
28
|
+
Requires-Dist: psutil>=5.9.0
|
|
29
|
+
Requires-Dist: requests>=2.25.0
|
|
30
|
+
Requires-Dist: flask>=3.0.0
|
|
31
|
+
Requires-Dist: flask-cors>=4.0.0
|
|
32
|
+
Requires-Dist: watchdog>=3.0.0
|
|
33
|
+
Requires-Dist: tree-sitter>=0.21.0
|
|
34
|
+
Requires-Dist: tree-sitter-language-pack>=0.8.0
|
|
35
|
+
Provides-Extra: dev
|
|
36
|
+
Requires-Dist: pytest>=7.0; extra == "dev"
|
|
37
|
+
Requires-Dist: pytest-asyncio; extra == "dev"
|
|
38
|
+
Requires-Dist: pytest-cov; extra == "dev"
|
|
39
|
+
Requires-Dist: black; extra == "dev"
|
|
40
|
+
Requires-Dist: flake8; extra == "dev"
|
|
41
|
+
Requires-Dist: mypy; extra == "dev"
|
|
42
|
+
Provides-Extra: monitor
|
|
43
|
+
Requires-Dist: python-socketio>=5.11.0; extra == "monitor"
|
|
44
|
+
Requires-Dist: aiohttp>=3.9.0; extra == "monitor"
|
|
45
|
+
Requires-Dist: python-engineio>=4.8.0; extra == "monitor"
|
|
46
|
+
Dynamic: author-email
|
|
47
|
+
Dynamic: home-page
|
|
48
|
+
Dynamic: license-file
|
|
49
|
+
Dynamic: requires-python
|
|
50
|
+
|
|
51
|
+
# Claude MPM - Multi-Agent Project Manager
|
|
52
|
+
|
|
53
|
+
A powerful orchestration framework for Claude Code that enables multi-agent workflows, session management, and real-time monitoring through an intuitive interface.
|
|
54
|
+
|
|
55
|
+
> **Quick Start**: See [QUICKSTART.md](QUICKSTART.md) to get running in 5 minutes!
|
|
56
|
+
|
|
57
|
+
## Features
|
|
58
|
+
|
|
59
|
+
- 🤖 **Multi-Agent System**: Automatically delegates tasks to specialized agents (PM, Research, Engineer, QA, Documentation, Security, Ops, Data Engineer)
|
|
60
|
+
- 🔄 **Session Management**: Resume previous sessions with `--resume`
|
|
61
|
+
- 📊 **Real-Time Monitoring**: Live dashboard with `--monitor` flag
|
|
62
|
+
- 📁 **Multi-Project Support**: Per-session working directories
|
|
63
|
+
- 🔍 **Git Integration**: View diffs and track changes across projects
|
|
64
|
+
- 🎯 **Smart Task Orchestration**: PM agent intelligently routes work to specialists
|
|
65
|
+
|
|
66
|
+
## Installation
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
# Install from PyPI
|
|
70
|
+
pip install claude-mpm
|
|
71
|
+
|
|
72
|
+
# Or with monitoring support
|
|
73
|
+
pip install "claude-mpm[monitor]"
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
## Basic Usage
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
# Interactive mode (recommended)
|
|
80
|
+
claude-mpm
|
|
81
|
+
|
|
82
|
+
# Non-interactive with task
|
|
83
|
+
claude-mpm run -i "analyze this codebase" --non-interactive
|
|
84
|
+
|
|
85
|
+
# With monitoring dashboard
|
|
86
|
+
claude-mpm run --monitor
|
|
87
|
+
|
|
88
|
+
# Resume last session
|
|
89
|
+
claude-mpm run --resume
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
For detailed usage, see [QUICKSTART.md](QUICKSTART.md)
|
|
93
|
+
|
|
94
|
+
## Key Capabilities
|
|
95
|
+
|
|
96
|
+
### Multi-Agent Orchestration
|
|
97
|
+
The PM agent automatically delegates work to specialized agents:
|
|
98
|
+
- **Research**: Codebase analysis and investigation
|
|
99
|
+
- **Engineer**: Implementation and coding
|
|
100
|
+
- **QA**: Testing and validation
|
|
101
|
+
- **Documentation**: Docs and guides
|
|
102
|
+
- **Security**: Security analysis
|
|
103
|
+
- **Ops**: Deployment and infrastructure
|
|
104
|
+
|
|
105
|
+
### Session Management
|
|
106
|
+
- All work is tracked in persistent sessions
|
|
107
|
+
- Resume any session with `--resume`
|
|
108
|
+
- Switch between projects with per-session directories
|
|
109
|
+
- View session history and activity
|
|
110
|
+
|
|
111
|
+
### Real-Time Monitoring
|
|
112
|
+
The `--monitor` flag opens a web dashboard showing:
|
|
113
|
+
- Live agent activity and delegations
|
|
114
|
+
- File operations with git diff viewer
|
|
115
|
+
- Tool usage and results
|
|
116
|
+
- Session management UI
|
|
117
|
+
|
|
118
|
+
See [docs/monitoring.md](docs/monitoring.md) for full monitoring guide.
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
## Documentation
|
|
122
|
+
|
|
123
|
+
- **[Quick Start Guide](QUICKSTART.md)** - Get running in 5 minutes
|
|
124
|
+
- **[Monitoring Dashboard](docs/monitoring.md)** - Real-time monitoring features
|
|
125
|
+
- **[Project Structure](docs/STRUCTURE.md)** - Codebase organization
|
|
126
|
+
- **[Deployment Guide](docs/DEPLOY.md)** - Publishing and versioning
|
|
127
|
+
- **[User Guide](docs/user/)** - Detailed usage documentation
|
|
128
|
+
- **[Developer Guide](docs/developer/)** - Architecture and API reference
|
|
129
|
+
|
|
130
|
+
## Recent Updates (v3.3.1)
|
|
131
|
+
|
|
132
|
+
### Session Working Directories
|
|
133
|
+
- Each session can now have its own working directory
|
|
134
|
+
- Git operations use the session's directory automatically
|
|
135
|
+
- Switch projects seamlessly without changing terminal directory
|
|
136
|
+
|
|
137
|
+
### Monitoring Improvements
|
|
138
|
+
- Fixed git diff viewer for cross-project files
|
|
139
|
+
- Auto-sync working directory from session data
|
|
140
|
+
- Improved error handling and display
|
|
141
|
+
|
|
142
|
+
See [CHANGELOG.md](CHANGELOG.md) for full history.
|
|
143
|
+
|
|
144
|
+
## Development
|
|
145
|
+
|
|
146
|
+
### Contributing
|
|
147
|
+
See [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines.
|
|
148
|
+
|
|
149
|
+
### Project Structure
|
|
150
|
+
See [docs/STRUCTURE.md](docs/STRUCTURE.md) for codebase organization.
|
|
151
|
+
|
|
152
|
+
### License
|
|
153
|
+
MIT License - see [LICENSE](LICENSE) file.
|
|
154
|
+
|
|
155
|
+
## Credits
|
|
156
|
+
|
|
157
|
+
- Based on [claude-multiagent-pm](https://github.com/kfsone/claude-multiagent-pm)
|
|
158
|
+
- Enhanced for [Claude Code](https://docs.anthropic.com/en/docs/claude-code) integration
|
|
159
|
+
- Built with ❤️ by the Claude MPM community
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
claude_mpm/__init__.py,sha256=uDX48EOBrmJbY8Xv3bBpd8kibulIlmZv5jmczAjHNb8,648
|
|
2
2
|
claude_mpm/__main__.py,sha256=8IcM9tEbTqSN_er04eKTPX3AGo6qzRiTnPI7KfIf7rw,641
|
|
3
|
-
claude_mpm/constants.py,sha256=
|
|
3
|
+
claude_mpm/constants.py,sha256=kquxfabo4JRbeN86KHBTi8g4h2mSdB8OsUCyTq50kVM,4328
|
|
4
4
|
claude_mpm/deployment_paths.py,sha256=JO7-fhhp_AkVB7ZssggHDBbee-r2sokpkqjoqnQLTmM,9073
|
|
5
5
|
claude_mpm/init.py,sha256=gOreOf7BLXkT0_HrQk_As4Kz1OT_NJG_RG0i0hbY0z0,8088
|
|
6
6
|
claude_mpm/agents/BASE_AGENT_TEMPLATE.md,sha256=TYgSd9jNBMWp4mAOBUl9dconX4RcGbvmMEScRy5uyko,3343
|
|
@@ -16,16 +16,16 @@ claude_mpm/agents/system_agent_config.py,sha256=Lke4FFjU0Vq3LLo4O7KvtHxadP7agAwC
|
|
|
16
16
|
claude_mpm/agents/backups/INSTRUCTIONS.md,sha256=3iMs6KyLJ5HzCmzqze1FasWKLKevhqpqwb8PlYiJ7Gw,9155
|
|
17
17
|
claude_mpm/agents/schema/agent_schema.json,sha256=7zuSk4VfBNTlQN33AkfJp0Y1GltlviwengIM0mb7dGg,8741
|
|
18
18
|
claude_mpm/agents/templates/__init__.py,sha256=7UyIChghCnkrDctvmCRYr0Wrnn8Oj-eCdgL0KpFy1Mo,2668
|
|
19
|
-
claude_mpm/agents/templates/data_engineer.json,sha256=
|
|
20
|
-
claude_mpm/agents/templates/documentation.json,sha256=
|
|
21
|
-
claude_mpm/agents/templates/engineer.json,sha256=
|
|
22
|
-
claude_mpm/agents/templates/ops.json,sha256=
|
|
23
|
-
claude_mpm/agents/templates/pm.json,sha256=
|
|
24
|
-
claude_mpm/agents/templates/qa.json,sha256=
|
|
25
|
-
claude_mpm/agents/templates/research.json,sha256=
|
|
26
|
-
claude_mpm/agents/templates/security.json,sha256=
|
|
27
|
-
claude_mpm/agents/templates/
|
|
28
|
-
claude_mpm/agents/templates/version_control.json,sha256=
|
|
19
|
+
claude_mpm/agents/templates/data_engineer.json,sha256=Z63nwhO3Bo3sUjSc4O0yGVFbJVdCmMLAgcBjKJmfc8Y,8793
|
|
20
|
+
claude_mpm/agents/templates/documentation.json,sha256=z5ApzJYOty5dw5yidNxhwX7QU8FICRAzmzD1xdxPkCI,6224
|
|
21
|
+
claude_mpm/agents/templates/engineer.json,sha256=Qt9mJjbVM0wH9GE6kqAhGDRVmLhWbs0fwGW1IoluTZ8,12474
|
|
22
|
+
claude_mpm/agents/templates/ops.json,sha256=b-LRqYRWjMZnXKd8SMPXDLCq6-nRAmCHN60IlJctjXM,6488
|
|
23
|
+
claude_mpm/agents/templates/pm.json,sha256=FbH9TOJ1NUmgHREPEhl5nOuWS8k7ee_KEQlC7cnLj2w,5239
|
|
24
|
+
claude_mpm/agents/templates/qa.json,sha256=UmNbeONvnzSvHFB3GUXwnN8n-TF5wgrk0JaAkYwOvfY,6636
|
|
25
|
+
claude_mpm/agents/templates/research.json,sha256=10XO-W7cV_SGP16SHboagjbNUlKUoGfpbrjrI2tiSWU,13591
|
|
26
|
+
claude_mpm/agents/templates/security.json,sha256=DkiB98uJf5mo5nP7EIhu8hhsvwGhOnR_FA60EJGuNBk,6741
|
|
27
|
+
claude_mpm/agents/templates/test_integration.json,sha256=QqJtUABq23MlkldAaomTviopOvM7hqxNWbaYbUVCJpk,7620
|
|
28
|
+
claude_mpm/agents/templates/version_control.json,sha256=H9GzDk8Ys8KmOEgfTWGr1GakKFscbd_907ObmAqzlzc,6535
|
|
29
29
|
claude_mpm/agents/templates/backup/data_engineer_agent_20250726_234551.json,sha256=lLso4RHXVTQmX4A1XwF84kT59zZDblPO1xCgBj4S4x8,5060
|
|
30
30
|
claude_mpm/agents/templates/backup/documentation_agent_20250726_234551.json,sha256=snfJW2yW9aMv9ldCSIWW7zwnyoQRx5u7xLMkNlfus9I,2258
|
|
31
31
|
claude_mpm/agents/templates/backup/engineer_agent_20250726_234551.json,sha256=21o8TGCM9TO6eocSV9Ev5MmCq-xYwwCqMU7KQESaY2Q,8479
|
|
@@ -37,13 +37,13 @@ claude_mpm/agents/templates/backup/version_control_agent_20250726_234551.json,sh
|
|
|
37
37
|
claude_mpm/agents/test_fix_deployment/.claude-pm/config/project.json,sha256=YZQgq2ri2_Y3qKzvPlC6TmzZKviDv0__GuyUOo1LbT8,146
|
|
38
38
|
claude_mpm/cli/README.md,sha256=exe9V_UEsMSPXOMlvQUv5FsCuhUpPOsMvIhyDSyuFdI,3423
|
|
39
39
|
claude_mpm/cli/__init__.py,sha256=OBcyg1xLPddsPURZPCvVhUfHkeak7Ph2qTvhOGYL7rQ,5506
|
|
40
|
-
claude_mpm/cli/parser.py,sha256=
|
|
40
|
+
claude_mpm/cli/parser.py,sha256=5mzUgDWsdGoQjs1OalgXqhwAm3aQJ1g4F7VRTJc9wGU,15823
|
|
41
41
|
claude_mpm/cli/utils.py,sha256=k_EHLcjDAzYhDeVeWvE-vqvHsEoG6Cc6Yk7fs3YoRVA,6022
|
|
42
42
|
claude_mpm/cli/commands/__init__.py,sha256=6Oh31iPNWcAehZWIIkX2hoSUBTcvFU733P7Q8Ssf56g,509
|
|
43
43
|
claude_mpm/cli/commands/agents.py,sha256=FqqEQcfAfCxjz_E7fGQUtLznloJLz8fWQtnjQhkbalQ,6795
|
|
44
44
|
claude_mpm/cli/commands/info.py,sha256=ETL6jC08OTQVTPjs219Y0m3FzfKOUlI0-yI81AI8FXY,2990
|
|
45
|
-
claude_mpm/cli/commands/memory.py,sha256=
|
|
46
|
-
claude_mpm/cli/commands/run.py,sha256=
|
|
45
|
+
claude_mpm/cli/commands/memory.py,sha256=oaGcEl5eW42vq20CUu52MDX4CGNcrUgo2ZY0ROE8FBU,30124
|
|
46
|
+
claude_mpm/cli/commands/run.py,sha256=ArHaNBr2_jnZL5FuQdyOU1zySL27u6zdFOBGxkz3xcQ,28761
|
|
47
47
|
claude_mpm/cli/commands/tickets.py,sha256=SXyGtHSyGJwTeJwDAHf7kRbdiG1DlZkXkod5UoNy7Ik,2150
|
|
48
48
|
claude_mpm/cli/commands/ui.py,sha256=FhBQiOKW61cNduyryRu0UhC366d6o1eEkBgbPd7Au1w,1900
|
|
49
49
|
claude_mpm/cli_module/__init__.py,sha256=CkMp4gzWKoZZF_qKyBDi2sQaZw_GLWZYLtKouv-4f8s,390
|
|
@@ -60,7 +60,7 @@ claude_mpm/core/agent_registry.py.bak,sha256=cXB0yqhonE1XsXmWcdwyNuvv8yddK_PyZIL
|
|
|
60
60
|
claude_mpm/core/agent_session_manager.py,sha256=6alXQr4gnMR-unT4J1ryEtTxJqQolA0-NgPQN6X3lqY,11212
|
|
61
61
|
claude_mpm/core/base_service.py,sha256=qWI_rUybHmmKroptJxcE4rzPBhK8yeMKIt2JqnqJB7E,29125
|
|
62
62
|
claude_mpm/core/base_service.py.bak,sha256=48A8eI_HPqxYm42X5jaTo8zQVOfFFXe7SqIUo-8IyC4,13124
|
|
63
|
-
claude_mpm/core/claude_runner.py,sha256=
|
|
63
|
+
claude_mpm/core/claude_runner.py,sha256=UTeAvhdeZK7EViNaEiiMIPWBmn44utJvj9fNiqwGNe8,37740
|
|
64
64
|
claude_mpm/core/config.py,sha256=_V0sbCOFNabm9nZUuRAZ9AGe65A03FbFY36QFCrDdHo,13464
|
|
65
65
|
claude_mpm/core/config_aliases.py,sha256=8eqA4wpWViIDm_9pL3f9j7cR_ssmhOYYiY2UzHrfUzg,10058
|
|
66
66
|
claude_mpm/core/container.py,sha256=P4c4nSo_USSfHTxvpR1sQkVGNsgqozZBN27l3IXqiDc,12216
|
|
@@ -74,11 +74,10 @@ claude_mpm/core/minimal_framework_loader.py,sha256=liYS4IyuW_aFK7yhRDZwTwT-3q09f
|
|
|
74
74
|
claude_mpm/core/mixins.py,sha256=rTEH-7FDpNiLB8oo6mSb0CLarJklv4fDJw1xM-gr5wI,5599
|
|
75
75
|
claude_mpm/core/pm_hook_interceptor.py,sha256=PRaloqgxn-Alt9HflrywYXRL2GL3Ixb8Wxov8GfAMMU,7173
|
|
76
76
|
claude_mpm/core/service_registry.py,sha256=wKJUO1g4UFA4dUpE3RkIYz1Ek8kIh4XfvU1kFeLCl2Q,10529
|
|
77
|
-
claude_mpm/core/session_manager.py,sha256=
|
|
78
|
-
claude_mpm/core/simple_runner.py,sha256=
|
|
77
|
+
claude_mpm/core/session_manager.py,sha256=D6ZA7bHAgfdkv0nLKjza0FKDng5iqi___IESrb3nSuk,8292
|
|
78
|
+
claude_mpm/core/simple_runner.py,sha256=UTeAvhdeZK7EViNaEiiMIPWBmn44utJvj9fNiqwGNe8,37740
|
|
79
79
|
claude_mpm/core/socketio_pool.py,sha256=B83uDsmqRF5S0QDwwatyKS-m2SdTvotCVfc3_2uQxd8,22438
|
|
80
80
|
claude_mpm/core/tool_access_control.py,sha256=htZbDhC8s7D7BVqfmk0BwRrYJnlnUAk8_NeJKOaeNlg,6632
|
|
81
|
-
claude_mpm/core/websocket_handler.py,sha256=1PwnZ6AzAOgfTWO5n4T52fSQxAuboj7bHOmL3TItq6M,8895
|
|
82
81
|
claude_mpm/experimental/cli_enhancements.py,sha256=-N5f2u9TaxUcOJegUd3lt1FRz5ErEyYUvvgrNmMRL7Q,11814
|
|
83
82
|
claude_mpm/generators/__init__.py,sha256=l53aBn6kBQSDz3b6bZkMCJBcEmYnV9hHEZq8LKzXgH8,152
|
|
84
83
|
claude_mpm/generators/agent_profile_generator.py,sha256=2HjOscogSyvrtQj8KwdgNPS6Ym_QvgX1BMeauQZewZA,5751
|
|
@@ -99,7 +98,7 @@ claude_mpm/hooks/builtin/ticket_extraction_hook_example.py,sha256=4wNhS2tFUXgdcv
|
|
|
99
98
|
claude_mpm/hooks/builtin/todo_agent_prefix_hook.py,sha256=v_4w2vcZIt0bkZxqdHmgtN79yHZ1gviuhhBws0FHpIQ,10226
|
|
100
99
|
claude_mpm/hooks/builtin/workflow_start_hook.py,sha256=EQrtYD9qLMLSYPl3oQinEheZAJ2i5EO_h2jhhR8lmt0,7490
|
|
101
100
|
claude_mpm/hooks/claude_hooks/__init__.py,sha256=bMUwt2RzDGAcEbtDMA7vWS1uJsauOY0OixIe4pHwgQ0,129
|
|
102
|
-
claude_mpm/hooks/claude_hooks/hook_handler.py,sha256=
|
|
101
|
+
claude_mpm/hooks/claude_hooks/hook_handler.py,sha256=xK7Gr6hQRM3bRsubNEy9l4sc3W4vq8z5UyaYmK9wN6A,30814
|
|
103
102
|
claude_mpm/hooks/claude_hooks/hook_wrapper.sh,sha256=otLBTac_sBI3s5dH--9nok59tU91_U_vV5kmzc2fmRo,1995
|
|
104
103
|
claude_mpm/models/__init__.py,sha256=vy2NLX2KT9QeH76SjCYh9dOYKPLRgxGrnwkQFAg08gc,465
|
|
105
104
|
claude_mpm/models/agent_definition.py,sha256=y9XQOED_maOyiYKhNB8H8MfJJMBN0vIYPS_wCXnRJmA,6647
|
|
@@ -140,7 +139,7 @@ claude_mpm/services/agent_capabilities_generator.py,sha256=hWG0zV2InmzrDMxSbQzjV
|
|
|
140
139
|
claude_mpm/services/agent_deployment.py,sha256=DtK1BX2yCrutUkQdVPD01mYHm-ya36l3EPOnEcaDfog,67961
|
|
141
140
|
claude_mpm/services/agent_lifecycle_manager.py,sha256=fWggWu5rT7FkDQrRHyw05Y4KaNN9cXeaCinsymPJwM4,50127
|
|
142
141
|
claude_mpm/services/agent_management_service.py,sha256=eX5n6w17b9urcogVdr4V-kXcuo7yyjORTrIihjF8PeQ,22853
|
|
143
|
-
claude_mpm/services/agent_memory_manager.py,sha256=
|
|
142
|
+
claude_mpm/services/agent_memory_manager.py,sha256=xFwOxcknDhsZRuMtMoenbroWtbMuWmtSXpc6pcK2bm4,37277
|
|
144
143
|
claude_mpm/services/agent_modification_tracker.py,sha256=uxELrXtFt5Xlv0mhRbq5ynagEowczTRrv3mAp-aRZFc,34519
|
|
145
144
|
claude_mpm/services/agent_persistence_service.py,sha256=B_Vz43zCKWq47zWkoibcia-Qwn2y3gARu7MV5Cpiptc,2893
|
|
146
145
|
claude_mpm/services/agent_profile_loader.py,sha256=4D1Xj0vgqV8wN7Y3r8lijh7ghy5cVGU5t5s931sVqGc,23133
|
|
@@ -151,14 +150,16 @@ claude_mpm/services/deployed_agent_discovery.py,sha256=GoXhho5EBz_FZDDl4xUWW_BnP
|
|
|
151
150
|
claude_mpm/services/framework_agent_loader.py,sha256=QdRSYRurYF3YbAXJwIGei71BffD5AqOVcV3ktRPdk7g,14018
|
|
152
151
|
claude_mpm/services/framework_claude_md_generator.py,sha256=3kHmkRLHTex6HFZ4DhbLVQb48j-5dAoy1q6UW1Qf7U8,22914
|
|
153
152
|
claude_mpm/services/hook_service.py,sha256=hkpN8mXXYCwzdLVJwsoVg_fw5seEmei-q0ZzQyNoCXA,14200
|
|
153
|
+
claude_mpm/services/memory_builder.py,sha256=T-JrR5vlLN5ucXSK0uQsgYQwpFIIXbHFbJOT_U9orz4,19288
|
|
154
|
+
claude_mpm/services/memory_optimizer.py,sha256=YLs9DHH2c7T-t5Mr-OIlV4-vWdvKxS0KN3CIDGiPa5A,23332
|
|
155
|
+
claude_mpm/services/memory_router.py,sha256=opUFx2xJs1vZN6FyGo8yubqLRwQ6apIm1htZ_6yyoBc,17693
|
|
154
156
|
claude_mpm/services/shared_prompt_cache.py,sha256=D04lrRWyg0lHyqGcAHy7IYvRHRKSg6EOpAJwBUPa2wk,29890
|
|
155
157
|
claude_mpm/services/socketio_client_manager.py,sha256=2Ly63iiGA_BUzf73UwQDu9Q75wA1C4O1CWFv8hi8bms,18074
|
|
156
|
-
claude_mpm/services/socketio_server.py,sha256=
|
|
158
|
+
claude_mpm/services/socketio_server.py,sha256=1DIBfm6oqI7whB02bvSjEmNU1KkatrExqJjlxadw0JA,47687
|
|
157
159
|
claude_mpm/services/standalone_socketio_server.py,sha256=XhsJ40Me3eSFHDpweIouy7dIqHK1aubikHCY275mUXk,24764
|
|
158
160
|
claude_mpm/services/ticket_manager.py,sha256=Ki11YjBkDax8BFVSaDdOBk3K4VU5gvdbgq9AmCyyoZ0,7454
|
|
159
161
|
claude_mpm/services/ticket_manager_di.py,sha256=pIsIGncbboKzBYSRQTO7ZX5MuQzV6iFfIflvKe6u1jw,11123
|
|
160
162
|
claude_mpm/services/ticketing_service_original.py,sha256=Dg3TYKsy0Z3JCqV5rlMBXeMrhrkAGxOgAMUNRZtJIhw,16680
|
|
161
|
-
claude_mpm/services/websocket_server.py,sha256=mC033w8TjwUGIv1r4uedtvQBPQQ_X7ZUA-u3ANugdMo,13553
|
|
162
163
|
claude_mpm/services/framework_claude_md_generator/README.md,sha256=_-ty72t2afPagDVVUEizPkhs4BYkCeqCnZDNPgZAYtY,3511
|
|
163
164
|
claude_mpm/services/framework_claude_md_generator/__init__.py,sha256=OtnwxLiJektfFtsKdkHM1X27rKkFiNd_rcf4843ziKw,7334
|
|
164
165
|
claude_mpm/services/framework_claude_md_generator/content_assembler.py,sha256=CZlw84bBWjvK68VQhjAdLnMxXBXipZtcdyPtYWLdrKo,6590
|
|
@@ -212,9 +213,9 @@ claude_mpm/utils/paths.py,sha256=Xv0SZWdZRkRjN9e6clBcA165ya00GNQxt7SwMz51tfA,101
|
|
|
212
213
|
claude_mpm/validation/__init__.py,sha256=bJ19g9lnk7yIjtxzN8XPegp87HTFBzCrGQOpFgRTf3g,155
|
|
213
214
|
claude_mpm/validation/agent_validator.py,sha256=GCA2b2rKhKDeaNyUqWxTiWIs3sDdWjD9cgOFRp9K6ic,18227
|
|
214
215
|
claude_mpm/web/open_dashboard.py,sha256=aXUc6LzUMwmTQMkl_h2jjvICimr-ED4FPMHP_9mnrgQ,1108
|
|
215
|
-
claude_mpm-3.3.
|
|
216
|
-
claude_mpm-3.3.
|
|
217
|
-
claude_mpm-3.3.
|
|
218
|
-
claude_mpm-3.3.
|
|
219
|
-
claude_mpm-3.3.
|
|
220
|
-
claude_mpm-3.3.
|
|
216
|
+
claude_mpm-3.3.2.dist-info/licenses/LICENSE,sha256=cSdDfXjoTVhstrERrqme4zgxAu4GubU22zVEHsiXGxs,1071
|
|
217
|
+
claude_mpm-3.3.2.dist-info/METADATA,sha256=QAeWt_WCNC36nD1Q8d5OdTW0kEUB0-mHLmbagNBflXY,5304
|
|
218
|
+
claude_mpm-3.3.2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
219
|
+
claude_mpm-3.3.2.dist-info/entry_points.txt,sha256=3_d7wLrg9sRmQ1SfrFGWoTNL8Wrd6lQb2XVSYbTwRIg,324
|
|
220
|
+
claude_mpm-3.3.2.dist-info/top_level.txt,sha256=1nUg3FEaBySgm8t-s54jK5zoPnu3_eY6EP6IOlekyHA,11
|
|
221
|
+
claude_mpm-3.3.2.dist-info/RECORD,,
|