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.
Files changed (33) hide show
  1. claude_mpm/agents/templates/data_engineer.json +1 -1
  2. claude_mpm/agents/templates/documentation.json +1 -1
  3. claude_mpm/agents/templates/engineer.json +1 -1
  4. claude_mpm/agents/templates/ops.json +1 -1
  5. claude_mpm/agents/templates/pm.json +1 -1
  6. claude_mpm/agents/templates/qa.json +1 -1
  7. claude_mpm/agents/templates/research.json +1 -1
  8. claude_mpm/agents/templates/security.json +1 -1
  9. claude_mpm/agents/templates/test_integration.json +112 -0
  10. claude_mpm/agents/templates/version_control.json +1 -1
  11. claude_mpm/cli/commands/memory.py +575 -25
  12. claude_mpm/cli/commands/run.py +115 -14
  13. claude_mpm/cli/parser.py +76 -0
  14. claude_mpm/constants.py +5 -0
  15. claude_mpm/core/claude_runner.py +13 -11
  16. claude_mpm/core/session_manager.py +46 -0
  17. claude_mpm/core/simple_runner.py +13 -11
  18. claude_mpm/hooks/claude_hooks/hook_handler.py +2 -26
  19. claude_mpm/services/agent_memory_manager.py +264 -23
  20. claude_mpm/services/memory_builder.py +491 -0
  21. claude_mpm/services/memory_optimizer.py +619 -0
  22. claude_mpm/services/memory_router.py +445 -0
  23. claude_mpm/services/socketio_server.py +184 -20
  24. claude_mpm-3.3.2.dist-info/METADATA +159 -0
  25. {claude_mpm-3.3.0.dist-info → claude_mpm-3.3.2.dist-info}/RECORD +29 -28
  26. claude_mpm/agents/templates/test-integration-agent.md +0 -34
  27. claude_mpm/core/websocket_handler.py +0 -233
  28. claude_mpm/services/websocket_server.py +0 -376
  29. claude_mpm-3.3.0.dist-info/METADATA +0 -432
  30. {claude_mpm-3.3.0.dist-info → claude_mpm-3.3.2.dist-info}/WHEEL +0 -0
  31. {claude_mpm-3.3.0.dist-info → claude_mpm-3.3.2.dist-info}/entry_points.txt +0 -0
  32. {claude_mpm-3.3.0.dist-info → claude_mpm-3.3.2.dist-info}/licenses/LICENSE +0 -0
  33. {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
- return web.json_response(diff_result)
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
- # Change to the working directory
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
- os.chdir(working_dir)
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
- # Final fallback: Show current working directory changes
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=5wYR7YPHQtjZCreM_lgjoT7IPfujiuRWSb1Qu8coBxc,4216
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=qoUz4nR5dP3ANu-e6Lr5bP_aa1A8_L9cN3iGwZk_B4k,5910
20
- claude_mpm/agents/templates/documentation.json,sha256=ClQ3_zWRSxkCm1_bLuVRi5bl2IYUIjPEINZm82HjJak,3142
21
- claude_mpm/agents/templates/engineer.json,sha256=Vqvxdifa1ldDUiFG1EXYupHCjg1hFYT80YE7Ef1owAk,8922
22
- claude_mpm/agents/templates/ops.json,sha256=uxIu5Tyw-FsnV-RtT-hk2QSy9EJgesmK7eampglL5tk,2988
23
- claude_mpm/agents/templates/pm.json,sha256=T67djHHIaud_OZeyan8BqqfRECyV9GxKHamfjLIz7JU,1350
24
- claude_mpm/agents/templates/qa.json,sha256=ByZw4FT1RW5sRoim2ouUPYipCi-6xI8LDaYEZ26lc6U,3076
25
- claude_mpm/agents/templates/research.json,sha256=Sb0erD1q8qXiG7QhcWC05kbe0XxNCXp1WaW3lepKofM,10013
26
- claude_mpm/agents/templates/security.json,sha256=5RzIlGtRjPIVSKvH_jjx-hzPbjh0TP2SeDBw_7LyfEA,3118
27
- claude_mpm/agents/templates/test-integration-agent.md,sha256=xyauhBApzj8qD24E0G32BF-mPCrGKES1g5S4OWPUtgc,505
28
- claude_mpm/agents/templates/version_control.json,sha256=YPxSufd32PMFTyVzDkOteoS944r74MD3VIToYm4DRCE,3043
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=Cd-_McqKH8uwcD81fHkZMUmQtoZmVMJFenON8V_mZtA,13518
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=6odAe-ReIVoRC6NdCsQHPGss51sF9fBQOlmXub7sysE,7600
46
- claude_mpm/cli/commands/run.py,sha256=FVEoYBgKSPNYoC9CFzjNc8m8irgvIUainqfhGVMiKQc,24173
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=dsLosbf2e7zYof4SirTuLM048EF4OEG1C6tEs7S-ZV8,37520
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=3rO4KGZp8Qd_cUw6OWv4jyxGCUaL_MNPgCCpnwQt12A,6581
78
- claude_mpm/core/simple_runner.py,sha256=dsLosbf2e7zYof4SirTuLM048EF4OEG1C6tEs7S-ZV8,37520
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=BHjMqyr_EiHPYhNa8XY2f8MPwia-KESBloM5CTMm9WU,31687
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=Rs0aHEU2txOGf3v3tYZ-11DCmmhp8osFS9ltxAFWclw,26703
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=hE_Vt5pn952wuZ5aWTjFnsC-vfEX8z773TezqWeH7vQ,39529
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.0.dist-info/licenses/LICENSE,sha256=cSdDfXjoTVhstrERrqme4zgxAu4GubU22zVEHsiXGxs,1071
216
- claude_mpm-3.3.0.dist-info/METADATA,sha256=Duhx4Io5PBaaL2-cPkMQCUaId9WuZuBQxMARVEEjo2k,15029
217
- claude_mpm-3.3.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
218
- claude_mpm-3.3.0.dist-info/entry_points.txt,sha256=3_d7wLrg9sRmQ1SfrFGWoTNL8Wrd6lQb2XVSYbTwRIg,324
219
- claude_mpm-3.3.0.dist-info/top_level.txt,sha256=1nUg3FEaBySgm8t-s54jK5zoPnu3_eY6EP6IOlekyHA,11
220
- claude_mpm-3.3.0.dist-info/RECORD,,
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,,