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.
- claude_mpm/VERSION +1 -1
- claude_mpm/agents/{CLAUDE_MPM_FOUNDERS_OUTPUT_STYLE.md → CLAUDE_MPM_RESEARCH_OUTPUT_STYLE.md} +14 -6
- claude_mpm/agents/PM_INSTRUCTIONS.md +7 -4
- claude_mpm/agents/templates/circuit-breakers.md +26 -17
- claude_mpm/cli/commands/autotodos.py +2 -2
- claude_mpm/cli/startup.py +1 -1
- claude_mpm/core/output_style_manager.py +15 -5
- claude_mpm/hooks/claude_hooks/hook_handler.py +4 -3
- claude_mpm/hooks/claude_hooks/services/connection_manager_http.py +14 -77
- {claude_mpm-5.4.96.dist-info → claude_mpm-5.4.97.dist-info}/METADATA +4 -2
- {claude_mpm-5.4.96.dist-info → claude_mpm-5.4.97.dist-info}/RECORD +16 -31
- claude_mpm/hooks/claude_hooks/__pycache__/__init__.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/auto_pause_handler.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/correlation_manager.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/event_handlers.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/hook_handler.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/installer.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/memory_integration.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/response_tracking.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/tool_analysis.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/__init__.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager_http.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/duplicate_detector.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/state_manager.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/subagent_processor.cpython-311.pyc +0 -0
- {claude_mpm-5.4.96.dist-info → claude_mpm-5.4.97.dist-info}/WHEEL +0 -0
- {claude_mpm-5.4.96.dist-info → claude_mpm-5.4.97.dist-info}/entry_points.txt +0 -0
- {claude_mpm-5.4.96.dist-info → claude_mpm-5.4.97.dist-info}/licenses/LICENSE +0 -0
- {claude_mpm-5.4.96.dist-info → claude_mpm-5.4.97.dist-info}/licenses/LICENSE-FAQ.md +0 -0
- {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.
|
|
1
|
+
5.4.97
|
claude_mpm/agents/{CLAUDE_MPM_FOUNDERS_OUTPUT_STYLE.md → CLAUDE_MPM_RESEARCH_OUTPUT_STYLE.md}
RENAMED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
---
|
|
2
|
-
name: Claude MPM
|
|
3
|
-
description:
|
|
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
|
|
6
|
+
# Claude MPM Research Mode
|
|
7
7
|
|
|
8
|
-
**Your
|
|
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
|
|
21
|
+
## What Research Mode Does
|
|
22
22
|
|
|
23
|
-
|
|
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
|
|
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
|
-
-
|
|
271
|
-
- FORBIDDEN
|
|
272
|
-
- Verification
|
|
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
|
|
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. **
|
|
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
|
-
###
|
|
534
|
+
### PM NEVER Uses Verification Commands
|
|
535
535
|
|
|
536
|
-
|
|
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
|
|
565
|
-
PM: Task(agent="local-ops
|
|
566
|
-
[
|
|
567
|
-
PM:
|
|
568
|
-
|
|
569
|
-
|
|
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
|
|
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
|
|
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-
|
|
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[
|
|
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
|
-
-
|
|
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
|
-
/ "
|
|
79
|
-
target=self.output_style_dir / "claude-mpm-
|
|
80
|
-
name="Claude MPM
|
|
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
|
-
|
|
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
|
|
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
|
|
87
|
+
"""Emit event using HTTP POST.
|
|
98
88
|
|
|
99
|
-
WHY
|
|
100
|
-
-
|
|
101
|
-
-
|
|
102
|
-
-
|
|
103
|
-
-
|
|
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
|
-
#
|
|
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.
|
|
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)** -
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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.
|
|
1002
|
-
claude_mpm-5.4.
|
|
1003
|
-
claude_mpm-5.4.
|
|
1004
|
-
claude_mpm-5.4.
|
|
1005
|
-
claude_mpm-5.4.
|
|
1006
|
-
claude_mpm-5.4.
|
|
1007
|
-
claude_mpm-5.4.
|
|
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,,
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|