claude-mpm 5.4.96__py3-none-any.whl → 5.4.97__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 (31) hide show
  1. claude_mpm/VERSION +1 -1
  2. claude_mpm/agents/{CLAUDE_MPM_FOUNDERS_OUTPUT_STYLE.md → CLAUDE_MPM_RESEARCH_OUTPUT_STYLE.md} +14 -6
  3. claude_mpm/agents/PM_INSTRUCTIONS.md +7 -4
  4. claude_mpm/agents/templates/circuit-breakers.md +26 -17
  5. claude_mpm/cli/commands/autotodos.py +2 -2
  6. claude_mpm/cli/startup.py +1 -1
  7. claude_mpm/core/output_style_manager.py +15 -5
  8. claude_mpm/hooks/claude_hooks/hook_handler.py +4 -3
  9. claude_mpm/hooks/claude_hooks/services/connection_manager_http.py +14 -77
  10. {claude_mpm-5.4.96.dist-info → claude_mpm-5.4.97.dist-info}/METADATA +4 -2
  11. {claude_mpm-5.4.96.dist-info → claude_mpm-5.4.97.dist-info}/RECORD +16 -31
  12. claude_mpm/hooks/claude_hooks/__pycache__/__init__.cpython-311.pyc +0 -0
  13. claude_mpm/hooks/claude_hooks/__pycache__/auto_pause_handler.cpython-311.pyc +0 -0
  14. claude_mpm/hooks/claude_hooks/__pycache__/correlation_manager.cpython-311.pyc +0 -0
  15. claude_mpm/hooks/claude_hooks/__pycache__/event_handlers.cpython-311.pyc +0 -0
  16. claude_mpm/hooks/claude_hooks/__pycache__/hook_handler.cpython-311.pyc +0 -0
  17. claude_mpm/hooks/claude_hooks/__pycache__/installer.cpython-311.pyc +0 -0
  18. claude_mpm/hooks/claude_hooks/__pycache__/memory_integration.cpython-311.pyc +0 -0
  19. claude_mpm/hooks/claude_hooks/__pycache__/response_tracking.cpython-311.pyc +0 -0
  20. claude_mpm/hooks/claude_hooks/__pycache__/tool_analysis.cpython-311.pyc +0 -0
  21. claude_mpm/hooks/claude_hooks/services/__pycache__/__init__.cpython-311.pyc +0 -0
  22. claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager.cpython-311.pyc +0 -0
  23. claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager_http.cpython-311.pyc +0 -0
  24. claude_mpm/hooks/claude_hooks/services/__pycache__/duplicate_detector.cpython-311.pyc +0 -0
  25. claude_mpm/hooks/claude_hooks/services/__pycache__/state_manager.cpython-311.pyc +0 -0
  26. claude_mpm/hooks/claude_hooks/services/__pycache__/subagent_processor.cpython-311.pyc +0 -0
  27. {claude_mpm-5.4.96.dist-info → claude_mpm-5.4.97.dist-info}/WHEEL +0 -0
  28. {claude_mpm-5.4.96.dist-info → claude_mpm-5.4.97.dist-info}/entry_points.txt +0 -0
  29. {claude_mpm-5.4.96.dist-info → claude_mpm-5.4.97.dist-info}/licenses/LICENSE +0 -0
  30. {claude_mpm-5.4.96.dist-info → claude_mpm-5.4.97.dist-info}/licenses/LICENSE-FAQ.md +0 -0
  31. {claude_mpm-5.4.96.dist-info → claude_mpm-5.4.97.dist-info}/top_level.txt +0 -0
claude_mpm/VERSION CHANGED
@@ -1 +1 @@
1
- 5.4.96
1
+ 5.4.97
@@ -1,11 +1,11 @@
1
1
  ---
2
- name: Claude MPM Founders
3
- description: Non-technical explanations for startup founders inspecting codebases
2
+ name: Claude MPM Research
3
+ description: Codebase research tool for founders, PMs, and developers - deep analysis in accessible language
4
4
  ---
5
5
 
6
- # Claude MPM for Founders
6
+ # Claude MPM Research Mode
7
7
 
8
- **Your code inspection companion** - Get clear, actionable insights about your codebase without needing to understand programming.
8
+ **Your codebase research companion** - Get clear, actionable insights about any codebase, whether you're a founder, PM, or developer.
9
9
 
10
10
  ## Core Principle: Accurate but Accessible
11
11
 
@@ -18,14 +18,22 @@ Technical accuracy is never sacrificed for simplicity. You get the same accurate
18
18
  - Use analogies to explain, but note when the analogy has limits
19
19
  - When precision matters (security, compliance, data integrity), call it out explicitly
20
20
 
21
- ## What This Mode Does
21
+ ## What Research Mode Does
22
22
 
23
- Translates technical details into business language so you can:
23
+ Research Mode provides deep codebase analysis that's accessible to everyone:
24
+
25
+ **For Founders & PMs:**
24
26
  - Understand what your developers are building
25
27
  - Assess code quality and team productivity
26
28
  - Make informed decisions about technical priorities
27
29
  - Spot potential risks before they become problems
28
30
 
31
+ **For Developers:**
32
+ - Quickly understand unfamiliar codebases
33
+ - Get architectural overviews of complex systems
34
+ - Identify technical debt and improvement opportunities
35
+ - Research best practices and patterns in existing code
36
+
29
37
  ---
30
38
 
31
39
  ## Quick Assessment Framework
@@ -15,7 +15,7 @@ The Project Manager (PM) agent coordinates work across specialized agents in the
15
15
  2. Use Read tool more than ONCE per session - DELEGATE to Research
16
16
  3. Investigate, debug, or analyze code directly - DELEGATE to Research
17
17
  4. Use Edit/Write tools on any file - DELEGATE to Engineer
18
- 5. Run verification commands (curl, lsof) - DELEGATE to local-ops
18
+ 5. Run verification commands (`curl`, `wget`, `lsof`, `netstat`, `ps`, `pm2`, `docker ps`) - DELEGATE to local-ops/QA
19
19
 
20
20
  **Violation of any prohibition = Circuit Breaker triggered**
21
21
 
@@ -267,9 +267,12 @@ See mpm-tool-usage-guide skill for complete tool usage patterns and examples.
267
267
  - Investigation keywords trigger delegation, not Read
268
268
 
269
269
  **Bash Tool** (Navigation and git tracking ONLY):
270
- - Allowed: `ls`, `pwd`, `cd`, `git status`, `git add`, `git commit`
271
- - FORBIDDEN: `curl`, `lsof`, `sed`, `awk`, `echo >`, `grep`, `find`, `cat`
272
- - Verification/implementation Delegate to appropriate agent
270
+ - **ALLOWED**: `ls`, `pwd`, `cd`, `git status`, `git add`, `git commit`, `git push`, `git log`
271
+ - **FORBIDDEN** (must delegate):
272
+ - Verification: `curl`, `wget`, `lsof`, `netstat`, `ps`, `pm2 status`, `docker ps`
273
+ - Implementation: `sed`, `awk`, `echo >`, `npm`, `pip`, `make`
274
+ - Investigation: `grep`, `find`, `cat`, `head`, `tail`
275
+ - **WHY**: Verification is technical work requiring domain expertise. Delegate to local-ops/QA.
273
276
 
274
277
  **Vector Search** (Quick semantic search):
275
278
  - MANDATORY: Use mcp-vector-search BEFORE Read/Research if available
@@ -523,23 +523,25 @@ PM: Task(agent="qa", task="Verify bug fix with regression test")
523
523
 
524
524
  ### KEY PRINCIPLE
525
525
 
526
- PM delegates implementation work, then MAY verify results.
526
+ PM delegates ALL work - implementation AND verification.
527
527
 
528
528
  **Workflow:**
529
- 1. **DELEGATE** to agent (using Task tool)
529
+ 1. **DELEGATE** implementation to appropriate agent (using Task tool)
530
530
  2. **WAIT** for agent to complete work
531
- 3. **VERIFY** results (using Bash verification commands OR delegating verification)
532
- 4. **REPORT** verified results with evidence
531
+ 3. **DELEGATE** verification to appropriate agent (local-ops, QA, web-qa)
532
+ 4. **REPORT** verified results with evidence from verification agent
533
533
 
534
- ### Allowed Verification Commands (AFTER Delegation)
534
+ ### PM NEVER Uses Verification Commands
535
535
 
536
- These commands are ALLOWED for quality assurance AFTER delegating implementation:
536
+ **FORBIDDEN for PM** (must delegate to local-ops or QA):
537
537
 
538
- - `curl`, `wget` - HTTP endpoint testing
539
- - `lsof`, `netstat`, `ss` - Port and network checks
540
- - `ps`, `pgrep` - Process status checks
541
- - `pm2 status`, `docker ps` - Service status
542
- - Health check endpoints
538
+ - `curl`, `wget` - HTTP endpoint testing → Delegate to api-qa or local-ops
539
+ - `lsof`, `netstat`, `ss` - Port and network checks → Delegate to local-ops
540
+ - `ps`, `pgrep` - Process status checks → Delegate to local-ops
541
+ - `pm2 status`, `docker ps` - Service status → Delegate to local-ops
542
+ - Health check endpoints → Delegate to api-qa or web-qa
543
+
544
+ **Why PM doesn't verify**: Verification is technical work requiring domain expertise. local-ops and QA agents have the tools, context, and expertise to verify correctly.
543
545
 
544
546
  ### Examples
545
547
 
@@ -550,23 +552,29 @@ These commands are ALLOWED for quality assurance AFTER delegating implementation
550
552
  PM: Bash("npm start") # VIOLATION - implementing
551
553
  PM: "App running on localhost:3000" # VIOLATION - no delegation
552
554
 
555
+ # Wrong: PM using verification commands
556
+ PM: Bash("lsof -i :3000") # VIOLATION - should delegate to local-ops
557
+ PM: Bash("curl http://localhost:3000") # VIOLATION - should delegate to api-qa
558
+
553
559
  # Wrong: PM testing before delegating implementation
554
560
  PM: Bash("npm test") # VIOLATION - testing without implementation
555
561
 
556
562
  # Wrong: "Let me" thinking
557
563
  PM: "Let me check the code..." # VIOLATION - should delegate
558
564
  PM: "Let me fix this bug..." # VIOLATION - should delegate
565
+ PM: "Let me verify the deployment..." # VIOLATION - should delegate to local-ops
559
566
  ```
560
567
 
561
568
  #### ✅ CORRECT Examples
562
569
 
563
570
  ```
564
- # Correct: Delegate first, then verify
565
- PM: Task(agent="local-ops-agent", task="Start app on localhost:3000 using npm")
566
- [Agent starts app]
567
- PM: Bash("lsof -i :3000 | grep LISTEN") # ALLOWED - verifying after delegation
568
- PM: Bash("curl http://localhost:3000") # ALLOWED - confirming deployment
569
- PM: "App verified: Port 3000 listening, HTTP 200 response"
571
+ # Correct: Delegate implementation, then delegate verification
572
+ PM: Task(agent="local-ops", task="Start app on localhost:3000 using npm")
573
+ [local-ops starts app]
574
+ PM: Task(agent="local-ops", task="Verify app is running on port 3000")
575
+ [local-ops uses lsof and curl to verify]
576
+ [local-ops returns: "Port 3000 listening, HTTP 200 response"]
577
+ PM: "App verified by local-ops: Port 3000 listening, HTTP 200 response"
570
578
 
571
579
  # Correct: Delegate implementation, then delegate testing
572
580
  PM: Task(agent="engineer", task="Fix authentication bug")
@@ -578,6 +586,7 @@ PM: "Bug fix verified by QA: All tests passed"
578
586
  # Correct: Thinking in delegation terms
579
587
  PM: "I'll have Research check the code..."
580
588
  PM: "I'll delegate this fix to Engineer..."
589
+ PM: "I'll have local-ops verify the deployment..."
581
590
  ```
582
591
 
583
592
  ---
@@ -397,7 +397,7 @@ def list_pm_violations(format):
397
397
  for i, violation in enumerate(violations, 1):
398
398
  payload = violation.get("payload", {})
399
399
  click.echo(f"{i}. Pattern: {payload.get('pattern_type', 'Unknown')}")
400
- click.echo(f" Original: \"{payload.get('original_text', '')}\"")
400
+ click.echo(f' Original: "{payload.get("original_text", "")}"')
401
401
  click.echo(f" Should delegate: {payload.get('suggested_action', '')}")
402
402
  click.echo(f" Severity: {payload.get('severity', 'unknown')}")
403
403
  click.echo(f" Timestamp: {violation.get('timestamp', 'Unknown')}")
@@ -502,7 +502,7 @@ def scan_delegation_patterns(text, file, format, save):
502
502
 
503
503
  for i, detection in enumerate(detections, 1):
504
504
  click.echo(f"{i}. Pattern: {detection['pattern_type']}")
505
- click.echo(f" Original: \"{detection['original_text']}\"")
505
+ click.echo(f' Original: "{detection["original_text"]}"')
506
506
  click.echo(f" Suggested Todo: {detection['suggested_todo']}")
507
507
  click.echo(f" Action: {detection['action']}")
508
508
  click.echo()
claude_mpm/cli/startup.py CHANGED
@@ -316,7 +316,7 @@ def deploy_output_style_on_startup():
316
316
  Deploys all styles:
317
317
  - claude-mpm.md (professional mode)
318
318
  - claude-mpm-teacher.md (teaching mode)
319
- - claude-mpm-founders.md (founders mode)
319
+ - claude-mpm-research.md (research mode - for codebase analysis)
320
320
  """
321
321
  try:
322
322
  from ..core.output_style_manager import OutputStyleManager
@@ -27,7 +27,9 @@ _CACHED_CLAUDE_VERSION: Optional[str] = None
27
27
  _VERSION_DETECTED: bool = False
28
28
 
29
29
  # Output style types
30
- OutputStyleType = Literal["professional", "teaching", "founders"]
30
+ OutputStyleType = Literal[
31
+ "professional", "teaching", "research", "founders"
32
+ ] # "founders" is deprecated, use "research"
31
33
 
32
34
 
33
35
  class StyleConfig(TypedDict):
@@ -44,7 +46,7 @@ class OutputStyleManager:
44
46
  Supports three output styles:
45
47
  - professional: Default Claude MPM style (claude-mpm.md)
46
48
  - teaching: Adaptive teaching mode (claude-mpm-teacher.md)
47
- - founders: Non-technical mode for startup founders (claude-mpm-founders.md)
49
+ - research: Codebase research mode for founders, PMs, and developers (claude-mpm-research.md)
48
50
  """
49
51
 
50
52
  def __init__(self) -> None:
@@ -72,12 +74,20 @@ class OutputStyleManager:
72
74
  target=self.output_style_dir / "claude-mpm-teacher.md",
73
75
  name="Claude MPM Teacher",
74
76
  ),
77
+ "research": StyleConfig(
78
+ source=Path(__file__).parent.parent
79
+ / "agents"
80
+ / "CLAUDE_MPM_RESEARCH_OUTPUT_STYLE.md",
81
+ target=self.output_style_dir / "claude-mpm-research.md",
82
+ name="Claude MPM Research",
83
+ ),
84
+ # Backward compatibility alias (deprecated)
75
85
  "founders": StyleConfig(
76
86
  source=Path(__file__).parent.parent
77
87
  / "agents"
78
- / "CLAUDE_MPM_FOUNDERS_OUTPUT_STYLE.md",
79
- target=self.output_style_dir / "claude-mpm-founders.md",
80
- name="Claude MPM Founders",
88
+ / "CLAUDE_MPM_RESEARCH_OUTPUT_STYLE.md",
89
+ target=self.output_style_dir / "claude-mpm-research.md",
90
+ name="Claude MPM Research",
81
91
  ),
82
92
  }
83
93
 
@@ -22,7 +22,7 @@ import os
22
22
  import re
23
23
  import select
24
24
  import signal
25
- import subprocess
25
+ import subprocess # nosec B404
26
26
  import sys
27
27
  import threading
28
28
  from datetime import datetime, timezone
@@ -155,7 +155,7 @@ def check_claude_version() -> Tuple[bool, Optional[str]]:
155
155
  """
156
156
  try:
157
157
  # Try to detect Claude Code version
158
- result = subprocess.run( # nosec B603 - Safe: hardcoded claude CLI with --version flag, no user input
158
+ result = subprocess.run( # nosec B603 B607 - Safe: hardcoded claude CLI with --version flag, no user input
159
159
  ["claude", "--version"],
160
160
  capture_output=True,
161
161
  text=True,
@@ -246,7 +246,8 @@ class ClaudeHookHandler:
246
246
  print(f"Auto-pause initialization failed: {e}", file=sys.stderr)
247
247
 
248
248
  # Backward compatibility properties for tests
249
- self.connection_pool = self.connection_manager.connection_pool
249
+ # Note: HTTP-based connection manager doesn't use connection_pool
250
+ self.connection_pool = None # Deprecated: No longer needed with HTTP emission
250
251
 
251
252
  # Expose state manager properties for backward compatibility
252
253
  self.active_delegations = self.state_manager.active_delegations
@@ -7,9 +7,14 @@ This service manages:
7
7
  DESIGN DECISION: Use stateless HTTP POST instead of persistent SocketIO
8
8
  connections because hook handlers are ephemeral processes (< 1 second lifetime).
9
9
  This eliminates disconnection issues and matches the process lifecycle.
10
+
11
+ DESIGN DECISION: Synchronous HTTP POST only (no async)
12
+ Hook handlers are too short-lived (~25ms lifecycle) to benefit from async.
13
+ Using asyncio.run() creates event loops that close before HTTP operations complete,
14
+ causing "Event loop is closed" errors. Synchronous HTTP POST in a thread pool
15
+ is simpler and more reliable for ephemeral processes.
10
16
  """
11
17
 
12
- import asyncio
13
18
  import os
14
19
  import sys
15
20
  from concurrent.futures import ThreadPoolExecutor
@@ -27,9 +32,6 @@ except ImportError:
27
32
  REQUESTS_AVAILABLE = False
28
33
  requests = None
29
34
 
30
- # Import high-performance event emitter - lazy loaded in _async_emit()
31
- # to reduce hook handler initialization time by ~85% (792ms -> minimal)
32
-
33
35
  # Import EventNormalizer for consistent event formatting
34
36
  try:
35
37
  from claude_mpm.services.socketio.event_normalizer import EventNormalizer
@@ -55,10 +57,6 @@ except ImportError:
55
57
  )
56
58
 
57
59
 
58
- # EventBus removed - using direct HTTP POST only
59
- # This eliminates duplicate events and simplifies the architecture
60
-
61
-
62
60
  class ConnectionManagerService:
63
61
  """Manages connections for the Claude hook handler using HTTP POST."""
64
62
 
@@ -72,17 +70,9 @@ class ConnectionManagerService:
72
70
  self.server_port = int(os.environ.get("CLAUDE_MPM_SERVER_PORT", "8765"))
73
71
  self.http_endpoint = f"http://{self.server_host}:{self.server_port}/api/events"
74
72
 
75
- # EventBus removed - using direct HTTP POST only
76
-
77
- # For backward compatibility with tests
78
- self.connection_pool = None # No longer used
79
-
80
- # Track async emit tasks to prevent garbage collection
81
- self._emit_tasks: set = set()
82
-
83
73
  # Thread pool for non-blocking HTTP requests
84
74
  # WHY: Prevents HTTP POST from blocking hook processing (2s timeout → 0ms blocking)
85
- # max_workers=2: Sufficient for low-frequency HTTP fallback events
75
+ # max_workers=2: Sufficient for low-frequency hook events
86
76
  self._http_executor = ThreadPoolExecutor(
87
77
  max_workers=2, thread_name_prefix="http-emit"
88
78
  )
@@ -94,13 +84,13 @@ class ConnectionManagerService:
94
84
  )
95
85
 
96
86
  def emit_event(self, namespace: str, event: str, data: dict):
97
- """Emit event using high-performance async emitter with HTTP fallback.
87
+ """Emit event using HTTP POST.
98
88
 
99
- WHY Hybrid approach:
100
- - Direct async calls for ultra-low latency in-process events
101
- - HTTP POST fallback for cross-process communication
102
- - Connection pooling for memory protection
103
- - Automatic routing based on availability
89
+ WHY HTTP POST only:
90
+ - Hook handlers are ephemeral (~25ms lifecycle)
91
+ - Async emission causes "Event loop is closed" errors
92
+ - HTTP POST in thread pool is simpler and more reliable
93
+ - Completes in 20-50ms, which is acceptable for hook handlers
104
94
  """
105
95
  # Create event data for normalization
106
96
  raw_event = {
@@ -132,62 +122,9 @@ class ConnectionManagerService:
132
122
  file=sys.stderr,
133
123
  )
134
124
 
135
- # Try high-performance async emitter first (direct calls)
136
- success = self._try_async_emit(namespace, event, claude_event_data)
137
- if success:
138
- return
139
-
140
- # Fallback to HTTP POST for cross-process communication
125
+ # Emit via HTTP POST (non-blocking, runs in thread pool)
141
126
  self._try_http_emit(namespace, event, claude_event_data)
142
127
 
143
- def _try_async_emit(self, namespace: str, event: str, data: dict) -> bool:
144
- """Try to emit event using high-performance async emitter."""
145
- try:
146
- # Run async emission in the current event loop or create one
147
- loop = None
148
- try:
149
- loop = asyncio.get_running_loop()
150
- except RuntimeError:
151
- # No running loop, create a new one
152
- pass
153
-
154
- if loop:
155
- # We're in an async context, create a task with tracking
156
- task = loop.create_task(self._async_emit(namespace, event, data))
157
- self._emit_tasks.add(task)
158
- task.add_done_callback(self._emit_tasks.discard)
159
- # Don't wait for completion to maintain low latency
160
- if DEBUG:
161
- print(f"✅ Async emit scheduled: {event}", file=sys.stderr)
162
- return True
163
- # No event loop, run synchronously
164
- success = asyncio.run(self._async_emit(namespace, event, data))
165
- if DEBUG and success:
166
- print(f"✅ Async emit successful: {event}", file=sys.stderr)
167
- return success
168
-
169
- except Exception as e:
170
- if DEBUG:
171
- print(f"⚠️ Async emit failed: {e}", file=sys.stderr)
172
- return False
173
-
174
- async def _async_emit(self, namespace: str, event: str, data: dict) -> bool:
175
- """Async helper for event emission."""
176
- try:
177
- # Lazy load event emitter to reduce initialization overhead
178
- from claude_mpm.services.monitor.event_emitter import get_event_emitter
179
-
180
- emitter = await get_event_emitter()
181
- return await emitter.emit_event(namespace, "claude_event", data)
182
- except ImportError:
183
- if DEBUG:
184
- print("⚠️ Event emitter not available", file=sys.stderr)
185
- return False
186
- except Exception as e:
187
- if DEBUG:
188
- print(f"⚠️ Async emitter error: {e}", file=sys.stderr)
189
- return False
190
-
191
128
  def _try_http_emit(self, namespace: str, event: str, data: dict):
192
129
  """Try to emit event using HTTP POST fallback (non-blocking).
193
130
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: claude-mpm
3
- Version: 5.4.96
3
+ Version: 5.4.97
4
4
  Summary: Claude Multi-Agent Project Manager - Orchestrate Claude with agent delegation and ticket tracking
5
5
  Author-email: Bob Matsuoka <bob@matsuoka.com>
6
6
  Maintainer: Claude MPM Team
@@ -118,7 +118,7 @@ A powerful orchestration framework for **Claude Code (CLI)** that enables multi-
118
118
 
119
119
  ## Who Should Use Claude MPM?
120
120
 
121
- - 👥 **[Non-Technical Users (Founders/PMs)](docs/usecases/non-technical-users.md)** - Understand and oversee your technical projects without coding experience
121
+ - 👥 **[Non-Technical Users (Founders/PMs)](docs/usecases/non-technical-users.md)** - Research and understand codebases using Research Mode - no coding experience required
122
122
  - 💻 **[Developers](docs/usecases/developers.md)** - Multi-agent development workflows with semantic code search and advanced features
123
123
  - 🏢 **[Teams](docs/usecases/teams.md)** - Collaboration patterns, session management, and coordinated workflows
124
124
 
@@ -195,6 +195,8 @@ ls ~/.claude/agents/ # Should show 47+ agents
195
195
 
196
196
  **💡 Recommended Partners**: Install [kuzu-memory](https://github.com/bobmatnyc/kuzu-memory) (persistent context) and [mcp-vector-search](https://github.com/bobmatnyc/mcp-vector-search) (semantic search) for enhanced capabilities.
197
197
 
198
+ **💡 Tool Version Management**: Use [ASDF version manager](docs/guides/asdf-tool-versions.md) to avoid Python/uv version conflicts across projects.
199
+
198
200
  ---
199
201
 
200
202
  ## Key Features
@@ -1,5 +1,5 @@
1
1
  claude_mpm/BUILD_NUMBER,sha256=9JfxhnDtr-8l3kCP2U5TVXSErptHoga8m7XA8zqgGOc,4
2
- claude_mpm/VERSION,sha256=dwJ4nfENWHzrxZxHyShOuFR4L7MOeuaCoR3u0bClxAM,7
2
+ claude_mpm/VERSION,sha256=BdiMNKt3O_zm2CNWcenla-qyFB2MItaHAgpbSdn2wrk,7
3
3
  claude_mpm/__init__.py,sha256=AGfh00BHKvLYD-UVFw7qbKtl7NMRIzRXOWw7vEuZ-h4,2214
4
4
  claude_mpm/__main__.py,sha256=Ro5UBWBoQaSAIoSqWAr7zkbLyvi4sSy28WShqAhKJG0,723
5
5
  claude_mpm/constants.py,sha256=pz3lTrZZR5HhV3eZzYtIbtBwWo7iM6pkBHP_ixxmI6Y,6827
@@ -7,11 +7,11 @@ claude_mpm/init.py,sha256=YSA2f0evX8FvqyI2Zx_4tvhaw18FPSMlf5yqTR_ilPE,26394
7
7
  claude_mpm/ticket_wrapper.py,sha256=qe5xY579t7_7fK5nyeAfHN_fr7CXdeOD3jfXEc8-7yo,828
8
8
  claude_mpm/agents/BASE_AGENT.md,sha256=UWvKX5S5L2l68F_sn54otC_HDX5kTt8G4ionUcTVpGo,5645
9
9
  claude_mpm/agents/BASE_ENGINEER.md,sha256=I7BusSGQfuV0uSkRBro51qzCzagUEPrXnndIElypPJk,24434
10
- claude_mpm/agents/CLAUDE_MPM_FOUNDERS_OUTPUT_STYLE.md,sha256=d4hZRc2wG2XzLaIxl2eQgdeuW6115C_pm6MtqNHVtOc,12997
11
10
  claude_mpm/agents/CLAUDE_MPM_OUTPUT_STYLE.md,sha256=C61nb8szGeeGaXQd9-VPpL1t79G2pDoYlDsGv_JLOLk,4349
11
+ claude_mpm/agents/CLAUDE_MPM_RESEARCH_OUTPUT_STYLE.md,sha256=OIVDU0Ypw5qrXix9rmMDG4u0V4ePnYDlsu5AoTmfZzs,13294
12
12
  claude_mpm/agents/CLAUDE_MPM_TEACHER_OUTPUT_STYLE.md,sha256=vneNW5vHjfKsRIukkuGbAnvnyp_-EC3qpFzHDdsMOwc,4796
13
13
  claude_mpm/agents/MEMORY.md,sha256=V1mGx5oEaLdN9AYLX3Xetslmr2Ja6vnLPATeEoR6bvw,3303
14
- claude_mpm/agents/PM_INSTRUCTIONS.md,sha256=_PeWJGuXrtmJVCGjaoiZufvChjWhpLNiEL2Qe-nXZDQ,33224
14
+ claude_mpm/agents/PM_INSTRUCTIONS.md,sha256=A0TBjt4sxwahevpnubh2wgVzKOisX2AluBiqyuolQ0E,33500
15
15
  claude_mpm/agents/WORKFLOW.md,sha256=BD5V5wNgz4C2gHPn4ekRmj4i7nn56s1ZF8YnhWBPkFw,3331
16
16
  claude_mpm/agents/__init__.py,sha256=3cCQh2Hf_-2F9XDT5In533Bw7oKuGIqZvOdBW7af6dY,3403
17
17
  claude_mpm/agents/agent-template.yaml,sha256=mRlz5Yd0SmknTeoJWgFkZXzEF5T7OmGBJGs2-KPT93k,1969
@@ -24,7 +24,7 @@ claude_mpm/agents/frontmatter_validator.py,sha256=H0R7rCrNdaok5q7yCxEX2uiIcELU28
24
24
  claude_mpm/agents/system_agent_config.py,sha256=19axX46jzvY6svETjfMaFyAYtgbQO2PRXKJ-VYnCPDk,24137
25
25
  claude_mpm/agents/templates/README.md,sha256=qqhKh10y2CGuoytQmqlQtXCa_RD1ZmeT0m24S5VPQnI,18511
26
26
  claude_mpm/agents/templates/__init__.py,sha256=kghxAWs3KvcAA9Esk3NI7caumYgW6fiW8vRO1-MEndU,2735
27
- claude_mpm/agents/templates/circuit-breakers.md,sha256=Dkk6uDfuv7TceNMbQp_3SkFULnh9uxOt4UVG-H-s958,48780
27
+ claude_mpm/agents/templates/circuit-breakers.md,sha256=K7_nvXWG6PEUDLdj1pqOU3Lj8_snoVN9TPCUavIZ4TA,49497
28
28
  claude_mpm/agents/templates/context-management-examples.md,sha256=ySVsHKB9rh--yP3oNo6Q0cprYb7eKuKOkVl7uIGvzUs,15025
29
29
  claude_mpm/agents/templates/git-file-tracking.md,sha256=r8qckL8pS2nIvZAImFgbjAzpaEhzV44B1lzz6V8Jg8M,18842
30
30
  claude_mpm/agents/templates/pm-examples.md,sha256=Y_A5cqQHWLX7gbLQ9Z5uCLyrkoMS-ewR5POG42pW7ZQ,16804
@@ -42,7 +42,7 @@ claude_mpm/cli/chrome_devtools_installer.py,sha256=efA_ZX1iR3oaJi3222079BQw6DEG8
42
42
  claude_mpm/cli/executor.py,sha256=BswSkXHYbkBFuy0Wg7h1YpPExwK9KZZiev_630EB4Nc,14004
43
43
  claude_mpm/cli/helpers.py,sha256=CypEhw0tbNH6_GzVTaQdi4w7ThCWO43Ep92YbJzPR4I,3638
44
44
  claude_mpm/cli/parser.py,sha256=Vqx9n-6Xo1uNhXR4rThmgWpZXTr0nOtkgDf3oMS9b0g,5855
45
- claude_mpm/cli/startup.py,sha256=N9Hszvh0ZYKcgPXkL7s8p-ANwX6w_Uq78LZt0I0k-cc,62997
45
+ claude_mpm/cli/startup.py,sha256=JyNv5YZa_xC6B8fmw-mNxv0XK-XhIWFibJUz72Tg2H8,63021
46
46
  claude_mpm/cli/startup_display.py,sha256=2b7cIow39gUFdJyarh9lv4uvnicnCWml-onUbKnGGWY,17132
47
47
  claude_mpm/cli/startup_logging.py,sha256=wHokzcCA0AJPxAqFrpY5PMOBh1iOhdhgP1gY1OvD0gY,29392
48
48
  claude_mpm/cli/utils.py,sha256=FSMPftBZM8MeUyTtiB63Lz7oFOgkzwTetQs58RbRb_Q,8785
@@ -58,7 +58,7 @@ claude_mpm/cli/commands/aggregate.py,sha256=v5JzzoWf6Omc4DaWfx_3gm5EWiUmUp6ps3Bd
58
58
  claude_mpm/cli/commands/analyze.py,sha256=NuSreG9PINgf_1_41adMT_sOXz-z695Zqjwef4OEc9w,19162
59
59
  claude_mpm/cli/commands/analyze_code.py,sha256=5FAoubjZbEO_GlErj3xNgNbJXBjhtqSOWE2FkhAzTaM,17256
60
60
  claude_mpm/cli/commands/auto_configure.py,sha256=0Suzil6O0SBNeHUCwHOkt2q7gfuXRTyUu2UC99cCG4Y,40567
61
- claude_mpm/cli/commands/autotodos.py,sha256=c-rCzSnpKkjFDcofa8aUMSCjqXFX-ubD7u-x3qN8mY0,18130
61
+ claude_mpm/cli/commands/autotodos.py,sha256=xJbSp1JXe-uK9OIFxKeQmFkbHyLTfyW_c34jCuPsIRQ,18126
62
62
  claude_mpm/cli/commands/cleanup.py,sha256=RQikOGLuLFWXzjeoHArdr5FA4Pf7tSK9w2NXL4vCrok,19769
63
63
  claude_mpm/cli/commands/cleanup_orphaned_agents.py,sha256=JR8crvgrz7Sa6d-SI-gKywok5S9rwc_DzDVk_h85sVs,4467
64
64
  claude_mpm/cli/commands/config.py,sha256=2M9VUPYcQkBUCIyyB-v1qTL3xYvao9YI2l_JGBUDauA,23374
@@ -208,7 +208,7 @@ claude_mpm/core/mixins.py,sha256=vmZ7Nu2ZOnKjbhN07Ixk4noIej9nsJiknrp-Sclfu0A,534
208
208
  claude_mpm/core/oneshot_session.py,sha256=nA86Zk7W3Rh_yIhPuegFL7Xgc9S63vQ_MqfLk52doV0,21994
209
209
  claude_mpm/core/optimized_agent_loader.py,sha256=yevEwTZWzVeZYEJhV3czD45OU7ukJIaJos4MGnFP7YQ,15857
210
210
  claude_mpm/core/optimized_startup.py,sha256=U5I4f7PNYXCBOLbCkbWT2V2sv01T8iWP2Bw-f928Q9M,17927
211
- claude_mpm/core/output_style_manager.py,sha256=ynFLUliYKPuw3CWtTcJR7h0TDBE_5z2gwDT-XT_-Owk,17491
211
+ claude_mpm/core/output_style_manager.py,sha256=K3EY4w5wvvdjfzNSEZQxSYhzBCxAEexXQHHYAYR9Jcw,17931
212
212
  claude_mpm/core/pm_hook_interceptor.py,sha256=92C8TrpK-XVQD8BiXbqs8lSCX72PU0KZG5oAjhf8GOQ,11197
213
213
  claude_mpm/core/service_registry.py,sha256=QpmAMWCov8XXaxQwE7WiNbgv6u_CRjpKPB64kLYvZKk,11722
214
214
  claude_mpm/core/session_manager.py,sha256=iEDZWKBYHSu001nFX8vFvH33RvQOW0eIgomWhFM53sw,12078
@@ -337,33 +337,18 @@ claude_mpm/hooks/claude_hooks/auto_pause_handler.py,sha256=xDAQZ33I5OhGvtWvA9mxw
337
337
  claude_mpm/hooks/claude_hooks/connection_pool.py,sha256=vpi-XbVf61GWhh85tHBzubbOgbJly_I-5-QmsleND2M,8658
338
338
  claude_mpm/hooks/claude_hooks/correlation_manager.py,sha256=3n-RxzqE8egG4max_NcpJgL9gzrBY6Ti529LrjleI1g,2033
339
339
  claude_mpm/hooks/claude_hooks/event_handlers.py,sha256=ryhpNe9c8wzGb2p3s0kBjFxY8BsVlHjwCo9Xc5RQnhc,45520
340
- claude_mpm/hooks/claude_hooks/hook_handler.py,sha256=5xMBg1iys7l5nGQ0m24uKAQk7mu_0CTWjlWwaC1pYQs,28395
340
+ claude_mpm/hooks/claude_hooks/hook_handler.py,sha256=R2RhUoRvI0q_EGu-d5L9bH7cGg5_OLDskQoNrl3JsU0,28504
341
341
  claude_mpm/hooks/claude_hooks/hook_wrapper.sh,sha256=4lG3TlLVoVfTJipPj1X_ICUlS-KpnkbUp1U3oSq80Bw,2476
342
342
  claude_mpm/hooks/claude_hooks/installer.py,sha256=VbvVGMcrmCXQB3Pf9zOdjeGET2AFqbUDMHDy5KXuvz0,30463
343
343
  claude_mpm/hooks/claude_hooks/memory_integration.py,sha256=73w7A5-3s5i1oYdkbEgw7qhgalQvSuJjfx6OFqfaw64,9963
344
344
  claude_mpm/hooks/claude_hooks/response_tracking.py,sha256=bgX4iVQqmX0L3_GHyKs1q4CSIjnavdxYnJZT0GaT4gs,17148
345
345
  claude_mpm/hooks/claude_hooks/tool_analysis.py,sha256=3_o2PP9D7wEMwLriCtIBOw0cj2fSZfepN7lI4P1meSQ,7862
346
- claude_mpm/hooks/claude_hooks/__pycache__/__init__.cpython-311.pyc,sha256=EGpgXqhPM0iRRZtCqHaLVQ6wDH42OH_M7Gt5GiFLyro,346
347
- claude_mpm/hooks/claude_hooks/__pycache__/auto_pause_handler.cpython-311.pyc,sha256=X7A8O4KPXkuDaLDFbF7Izi1qVDyS0tQjHVo1xy_HzNQ,21172
348
- claude_mpm/hooks/claude_hooks/__pycache__/correlation_manager.cpython-311.pyc,sha256=SQX5iiP9bQZkLL-cj_2tlGH7lpAzarO0mYal7btj3tc,3521
349
- claude_mpm/hooks/claude_hooks/__pycache__/event_handlers.cpython-311.pyc,sha256=YXRFrqgSXTixzi59oYYwFi0dd_EMQ5yeFnsOPaW-F90,44311
350
- claude_mpm/hooks/claude_hooks/__pycache__/hook_handler.cpython-311.pyc,sha256=oanjwor2IoiY_AKIqZcuz3ex-Mp2OndP7VlvAn_4hMQ,30603
351
- claude_mpm/hooks/claude_hooks/__pycache__/installer.cpython-311.pyc,sha256=9mpAKY4gNcbU5VvZ5tGbf2UM0uIEWdreKSUvVr_BKcM,33917
352
- claude_mpm/hooks/claude_hooks/__pycache__/memory_integration.cpython-311.pyc,sha256=YbwauQDKSGvXkT1972faalJLuxwyvq328DYQhkCnel0,10513
353
- claude_mpm/hooks/claude_hooks/__pycache__/response_tracking.cpython-311.pyc,sha256=-L-n4xvi1eHY48MdZ-7v249UaNfkuiIwfwxdPgxwd80,16730
354
- claude_mpm/hooks/claude_hooks/__pycache__/tool_analysis.cpython-311.pyc,sha256=ZjcNfNY5Ht6FhalPeh7M7OzMffcey5iF4AVjDDg9kak,10694
355
346
  claude_mpm/hooks/claude_hooks/services/__init__.py,sha256=OIYOKsUNw1BHYawOCp-KFK5kmQKuj92cCqCEPO0nwo0,585
356
347
  claude_mpm/hooks/claude_hooks/services/connection_manager.py,sha256=6MhoPiSQSkG5Xsb9KjPk_eu60h6-v5uNXjn6ry255aA,10452
357
- claude_mpm/hooks/claude_hooks/services/connection_manager_http.py,sha256=n14k1byOBbviu0nFab3q0gb7p6eMqGO8hS0b7Gt2JRg,10262
348
+ claude_mpm/hooks/claude_hooks/services/connection_manager_http.py,sha256=7YKEsD45us5SNnj-jpSyFBYbU0KrZ8FWoIdZDUeU2gI,7795
358
349
  claude_mpm/hooks/claude_hooks/services/duplicate_detector.py,sha256=Fh9LmEMsVmQM9t0U1v2l_fuBwvNpVkl_0EF8Wu5KLHQ,3882
359
350
  claude_mpm/hooks/claude_hooks/services/state_manager.py,sha256=QB0JPJQThTVg0TGRO3Dc_3y3bac-hkulgMqqzo_71ng,11189
360
351
  claude_mpm/hooks/claude_hooks/services/subagent_processor.py,sha256=nJw1ERCMxq23ioZ5DKwprmwO0fuvuqpdFHJ03XaMiDo,16052
361
- claude_mpm/hooks/claude_hooks/services/__pycache__/__init__.cpython-311.pyc,sha256=xBfLBSqnpcKfcQBWfh7xUm454g1lq1LvbO7SxGvcOPc,644
362
- claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager.cpython-311.pyc,sha256=Q40QpUbg9q_QHgv8kuYdQmRVjqcjewzYUC5BoaHinFo,10152
363
- claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager_http.cpython-311.pyc,sha256=bvZ_QcuI0j125Ebv8RzeWUh1BkuRTUfufGi0NV7HjuY,12359
364
- claude_mpm/hooks/claude_hooks/services/__pycache__/duplicate_detector.cpython-311.pyc,sha256=Yy_REAUhJCiFjOhxeDb4v0qyEvEbUtCmXD9PAz40dhw,5321
365
- claude_mpm/hooks/claude_hooks/services/__pycache__/state_manager.cpython-311.pyc,sha256=TPkEc-Zi3oNS5dCXBpGbSZwg_8RQvzNzd4pVx9B3WeM,12364
366
- claude_mpm/hooks/claude_hooks/services/__pycache__/subagent_processor.cpython-311.pyc,sha256=WffRFbZrgwiOypPUMgcm_LT18AtyGckgDny5IXhkogg,15554
367
352
  claude_mpm/hooks/failure_learning/__init__.py,sha256=iJ80AKFHiT8DjIH2a72DQVJvL6nAFrizNA2yTKwZ4rw,1805
368
353
  claude_mpm/hooks/failure_learning/failure_detection_hook.py,sha256=KENoB5N-dBm5hb0SxeIZtCvNKbmG2BKHOJSrSO-3Z_I,7500
369
354
  claude_mpm/hooks/failure_learning/fix_detection_hook.py,sha256=XUk1bnBVLdfhQ9AMQSvGsTSeFQsKsVud2wbWX-Jjor8,7164
@@ -998,10 +983,10 @@ claude_mpm/utils/subprocess_utils.py,sha256=D0izRT8anjiUb_JG72zlJR_JAw1cDkb7kalN
998
983
  claude_mpm/validation/__init__.py,sha256=YZhwE3mhit-lslvRLuwfX82xJ_k4haZeKmh4IWaVwtk,156
999
984
  claude_mpm/validation/agent_validator.py,sha256=GprtAvu80VyMXcKGsK_VhYiXWA6BjKHv7O6HKx0AB9w,20917
1000
985
  claude_mpm/validation/frontmatter_validator.py,sha256=YpJlYNNYcV8u6hIOi3_jaRsDnzhbcQpjCBE6eyBKaFY,7076
1001
- claude_mpm-5.4.96.dist-info/licenses/LICENSE,sha256=ca3y_Rk4aPrbF6f62z8Ht5MJM9OAvbGlHvEDcj9vUQ4,3867
1002
- claude_mpm-5.4.96.dist-info/licenses/LICENSE-FAQ.md,sha256=TxfEkXVCK98RzDOer09puc7JVCP_q_bN4dHtZKHCMcM,5104
1003
- claude_mpm-5.4.96.dist-info/METADATA,sha256=BY5ASX3bosIsVZC9RA82DFSlA7dTovrqMHeJnvDtQts,14185
1004
- claude_mpm-5.4.96.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
1005
- claude_mpm-5.4.96.dist-info/entry_points.txt,sha256=n-Uk4vwHPpuvu-g_I7-GHORzTnN_m6iyOsoLveKKD0E,228
1006
- claude_mpm-5.4.96.dist-info/top_level.txt,sha256=1nUg3FEaBySgm8t-s54jK5zoPnu3_eY6EP6IOlekyHA,11
1007
- claude_mpm-5.4.96.dist-info/RECORD,,
986
+ claude_mpm-5.4.97.dist-info/licenses/LICENSE,sha256=ca3y_Rk4aPrbF6f62z8Ht5MJM9OAvbGlHvEDcj9vUQ4,3867
987
+ claude_mpm-5.4.97.dist-info/licenses/LICENSE-FAQ.md,sha256=TxfEkXVCK98RzDOer09puc7JVCP_q_bN4dHtZKHCMcM,5104
988
+ claude_mpm-5.4.97.dist-info/METADATA,sha256=hlWS-oaVXxxH2ac2RGflbYhcb3ohULWQYotGwtsqTSc,14349
989
+ claude_mpm-5.4.97.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
990
+ claude_mpm-5.4.97.dist-info/entry_points.txt,sha256=n-Uk4vwHPpuvu-g_I7-GHORzTnN_m6iyOsoLveKKD0E,228
991
+ claude_mpm-5.4.97.dist-info/top_level.txt,sha256=1nUg3FEaBySgm8t-s54jK5zoPnu3_eY6EP6IOlekyHA,11
992
+ claude_mpm-5.4.97.dist-info/RECORD,,