claude-mpm 4.21.0__py3-none-any.whl → 4.21.3__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.

Potentially problematic release.


This version of claude-mpm might be problematic. Click here for more details.

@@ -0,0 +1,284 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ Python Analyzer
4
+ ===============
5
+
6
+ Analyzes Python source code using AST.
7
+
8
+ WHY: Python's built-in AST module provides rich structural information
9
+ that we can leverage for detailed analysis.
10
+ """
11
+
12
+ import ast
13
+ from pathlib import Path
14
+ from typing import List, Optional
15
+
16
+ from ...core.logging_config import get_logger
17
+ from ..code_tree_events import CodeNodeEvent, CodeTreeEventEmitter
18
+ from .models import CodeNode
19
+
20
+
21
+ class PythonAnalyzer:
22
+ """Analyzes Python source code using AST."""
23
+
24
+ def __init__(self, emitter: Optional[CodeTreeEventEmitter] = None):
25
+ self.logger = get_logger(__name__)
26
+ self.emitter = emitter
27
+
28
+ def analyze_file(self, file_path: Path) -> List[CodeNode]:
29
+ """Analyze a Python file and extract code structure.
30
+
31
+ Args:
32
+ file_path: Path to Python file
33
+
34
+ Returns:
35
+ List of code nodes found in the file
36
+ """
37
+ nodes = []
38
+
39
+ try:
40
+ with Path(file_path).open(
41
+ encoding="utf-8",
42
+ ) as f:
43
+ source = f.read()
44
+
45
+ tree = ast.parse(source, filename=str(file_path))
46
+ nodes = self._extract_nodes(tree, file_path, source)
47
+
48
+ except SyntaxError as e:
49
+ self.logger.warning(f"Syntax error in {file_path}: {e}")
50
+ if self.emitter:
51
+ self.emitter.emit_error(str(file_path), f"Syntax error: {e}")
52
+ except Exception as e:
53
+ self.logger.error(f"Error analyzing {file_path}: {e}")
54
+ if self.emitter:
55
+ self.emitter.emit_error(str(file_path), str(e))
56
+
57
+ return nodes
58
+
59
+ def _extract_nodes(
60
+ self, tree: ast.AST, file_path: Path, source: str
61
+ ) -> List[CodeNode]:
62
+ """Extract code nodes from AST tree.
63
+
64
+ Args:
65
+ tree: AST tree
66
+ file_path: Source file path
67
+ source: Source code text
68
+
69
+ Returns:
70
+ List of extracted code nodes
71
+ """
72
+ nodes = []
73
+ source.splitlines()
74
+
75
+ class NodeVisitor(ast.NodeVisitor):
76
+ def __init__(self, parent_name: Optional[str] = None):
77
+ self.parent_name = parent_name
78
+ self.current_class = None
79
+
80
+ def visit_ClassDef(self, node):
81
+ # Extract class information
82
+ class_node = CodeNode(
83
+ file_path=str(file_path),
84
+ node_type="class",
85
+ name=node.name,
86
+ line_start=node.lineno,
87
+ line_end=node.end_lineno or node.lineno,
88
+ has_docstring=bool(ast.get_docstring(node)),
89
+ decorators=[self._decorator_name(d) for d in node.decorator_list],
90
+ parent=self.parent_name,
91
+ complexity=self._calculate_complexity(node),
92
+ signature=self._get_class_signature(node),
93
+ )
94
+
95
+ nodes.append(class_node)
96
+
97
+ # Emit event if emitter is available
98
+ if self.emitter:
99
+ self.emitter.emit_node(
100
+ CodeNodeEvent(
101
+ file_path=str(file_path),
102
+ node_type="class",
103
+ name=node.name,
104
+ line_start=node.lineno,
105
+ line_end=node.end_lineno or node.lineno,
106
+ complexity=class_node.complexity,
107
+ has_docstring=class_node.has_docstring,
108
+ decorators=class_node.decorators,
109
+ parent=self.parent_name,
110
+ children_count=len(node.body),
111
+ )
112
+ )
113
+
114
+ # Visit class members
115
+ old_class = self.current_class
116
+ self.current_class = node.name
117
+ for child in node.body:
118
+ if isinstance(child, (ast.FunctionDef, ast.AsyncFunctionDef)):
119
+ self.visit_FunctionDef(child, is_method=True)
120
+ self.current_class = old_class
121
+
122
+ def visit_FunctionDef(self, node, is_method=False):
123
+ # Determine node type
124
+ node_type = "method" if is_method else "function"
125
+ parent = self.current_class if is_method else self.parent_name
126
+
127
+ # Extract function information
128
+ func_node = CodeNode(
129
+ file_path=str(file_path),
130
+ node_type=node_type,
131
+ name=node.name,
132
+ line_start=node.lineno,
133
+ line_end=node.end_lineno or node.lineno,
134
+ has_docstring=bool(ast.get_docstring(node)),
135
+ decorators=[self._decorator_name(d) for d in node.decorator_list],
136
+ parent=parent,
137
+ complexity=self._calculate_complexity(node),
138
+ signature=self._get_function_signature(node),
139
+ )
140
+
141
+ nodes.append(func_node)
142
+
143
+ # Emit event if emitter is available
144
+ if self.emitter:
145
+ self.emitter.emit_node(
146
+ CodeNodeEvent(
147
+ file_path=str(file_path),
148
+ node_type=node_type,
149
+ name=node.name,
150
+ line_start=node.lineno,
151
+ line_end=node.end_lineno or node.lineno,
152
+ complexity=func_node.complexity,
153
+ has_docstring=func_node.has_docstring,
154
+ decorators=func_node.decorators,
155
+ parent=parent,
156
+ children_count=0,
157
+ )
158
+ )
159
+
160
+ def visit_Assign(self, node):
161
+ # Handle module-level variable assignments
162
+ if self.current_class is None: # Only module-level assignments
163
+ for target in node.targets:
164
+ if isinstance(target, ast.Name):
165
+ var_node = CodeNode(
166
+ file_path=str(file_path),
167
+ node_type="variable",
168
+ name=target.id,
169
+ line_start=node.lineno,
170
+ line_end=node.end_lineno or node.lineno,
171
+ parent=self.parent_name,
172
+ complexity=0,
173
+ signature=f"{target.id} = ...",
174
+ )
175
+ nodes.append(var_node)
176
+
177
+ # Emit event if emitter is available
178
+ if self.emitter:
179
+ self.emitter.emit_node(
180
+ CodeNodeEvent(
181
+ file_path=str(file_path),
182
+ node_type="variable",
183
+ name=target.id,
184
+ line_start=node.lineno,
185
+ line_end=node.end_lineno or node.lineno,
186
+ parent=self.parent_name,
187
+ )
188
+ )
189
+
190
+ def visit_AsyncFunctionDef(self, node):
191
+ self.visit_FunctionDef(node)
192
+
193
+ def _decorator_name(self, decorator):
194
+ """Extract decorator name from AST node."""
195
+ if isinstance(decorator, ast.Name):
196
+ return decorator.id
197
+ if isinstance(decorator, ast.Call):
198
+ if isinstance(decorator.func, ast.Name):
199
+ return decorator.func.id
200
+ if isinstance(decorator.func, ast.Attribute):
201
+ return decorator.func.attr
202
+ return "unknown"
203
+
204
+ def _calculate_complexity(self, node):
205
+ """Calculate cyclomatic complexity of a node."""
206
+ complexity = 1 # Base complexity
207
+
208
+ for child in ast.walk(node):
209
+ if isinstance(
210
+ child, (ast.If, ast.While, ast.For, ast.ExceptHandler)
211
+ ):
212
+ complexity += 1
213
+ elif isinstance(child, ast.BoolOp):
214
+ complexity += len(child.values) - 1
215
+
216
+ return complexity
217
+
218
+ def _get_function_signature(self, node):
219
+ """Extract function signature."""
220
+ args = []
221
+ for arg in node.args.args:
222
+ args.append(arg.arg)
223
+ return f"{node.name}({', '.join(args)})"
224
+
225
+ def _get_class_signature(self, node):
226
+ """Extract class signature."""
227
+ bases = []
228
+ for base in node.bases:
229
+ if isinstance(base, ast.Name):
230
+ bases.append(base.id)
231
+ base_str = f"({', '.join(bases)})" if bases else ""
232
+ return f"class {node.name}{base_str}"
233
+
234
+ # Extract imports
235
+ for node in ast.walk(tree):
236
+ if isinstance(node, ast.Import):
237
+ for alias in node.names:
238
+ import_node = CodeNode(
239
+ file_path=str(file_path),
240
+ node_type="import",
241
+ name=alias.name,
242
+ line_start=node.lineno,
243
+ line_end=node.end_lineno or node.lineno,
244
+ signature=f"import {alias.name}",
245
+ )
246
+ nodes.append(import_node)
247
+
248
+ elif isinstance(node, ast.ImportFrom):
249
+ module = node.module or ""
250
+ for alias in node.names:
251
+ import_node = CodeNode(
252
+ file_path=str(file_path),
253
+ node_type="import",
254
+ name=f"{module}.{alias.name}",
255
+ line_start=node.lineno,
256
+ line_end=node.end_lineno or node.lineno,
257
+ signature=f"from {module} import {alias.name}",
258
+ )
259
+ nodes.append(import_node)
260
+
261
+ # Visit all nodes
262
+ visitor = NodeVisitor()
263
+ visitor.emitter = self.emitter
264
+ visitor.visit(tree)
265
+
266
+ return nodes
267
+
268
+ def _get_assignment_signature(self, node: ast.Assign, var_name: str) -> str:
269
+ """Get assignment signature string."""
270
+ try:
271
+ # Try to get a simple representation of the value
272
+ if isinstance(node.value, ast.Constant):
273
+ if isinstance(node.value.value, str):
274
+ return f'{var_name} = "{node.value.value}"'
275
+ return f"{var_name} = {node.value.value}"
276
+ if isinstance(node.value, ast.Name):
277
+ return f"{var_name} = {node.value.id}"
278
+ if isinstance(node.value, ast.List):
279
+ return f"{var_name} = [...]"
280
+ if isinstance(node.value, ast.Dict):
281
+ return f"{var_name} = {{...}}"
282
+ return f"{var_name} = ..."
283
+ except Exception:
284
+ return f"{var_name} = ..."
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: claude-mpm
3
- Version: 4.21.0
3
+ Version: 4.21.3
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
@@ -1,5 +1,5 @@
1
1
  claude_mpm/BUILD_NUMBER,sha256=9JfxhnDtr-8l3kCP2U5TVXSErptHoga8m7XA8zqgGOc,4
2
- claude_mpm/VERSION,sha256=FBRJIven1CjpDFad_4CqL-Q8ch0caXLcnHLMFHGK3do,7
2
+ claude_mpm/VERSION,sha256=gaAy5kSFh-phT6MDVkEKElmz6b3wUspuKOM5yRdOxJw,7
3
3
  claude_mpm/__init__.py,sha256=UCw6j9e_tZQ3kJtTqmdfNv7MHyw9nD1jkj80WurwM2g,2064
4
4
  claude_mpm/__main__.py,sha256=Ro5UBWBoQaSAIoSqWAr7zkbLyvi4sSy28WShqAhKJG0,723
5
5
  claude_mpm/constants.py,sha256=lK1L7fvo1assVM3WqDFHjkgiozofzU_TVxjrTv71yHM,6202
@@ -180,14 +180,15 @@ claude_mpm/commands/mpm-agents.md,sha256=Mq1BOVP6ejRLYZCHE-K1fZ2HaiND_BaYEfc9SO5
180
180
  claude_mpm/commands/mpm-auto-configure.md,sha256=FWUSpqChD42-oFfk5vGTwfqQBLyq8BXqKmZW7oKrcWQ,6957
181
181
  claude_mpm/commands/mpm-config.md,sha256=79Eb-srRpEVV3HCHDHZc8SKec6_LVP6HbXDEVkZKLgw,2929
182
182
  claude_mpm/commands/mpm-doctor.md,sha256=ut5LhFKVRw-2ecjMSPsnaTiRuFXa6Q9t-Wgl3CCnQvk,590
183
- claude_mpm/commands/mpm-help.md,sha256=8lo0mvhAjFI124hAGX4G8iwkz1k3xDv2QT2Jbyqeg_8,6891
183
+ claude_mpm/commands/mpm-help.md,sha256=6aP6xWzELwXG-ms1gdLGOSnxw3V1y5ECDiVXX91Ux8w,6959
184
184
  claude_mpm/commands/mpm-init.md,sha256=xI7EKQtqGJD8MJAE14yA-UfEDJsfQxYFvnFWxyG0NtI,19730
185
185
  claude_mpm/commands/mpm-monitor.md,sha256=onTHf9Yac1KkdZdENtY2Q5jyw0A-vZLYgoKkPCtZLUY,12193
186
186
  claude_mpm/commands/mpm-organize.md,sha256=T-ysjhwgfW9irjUj02vuY_1jeMdabO_zxcShyjmqsiM,10153
187
+ claude_mpm/commands/mpm-resume.md,sha256=sFxmHzEafQ1GbpOmt2FM9OSQ2MMhCFcygeSOFRJm23E,12248
187
188
  claude_mpm/commands/mpm-status.md,sha256=oaM4ybL4ffp55nkT9F0mp_5H4tF-wX9mbqK-LEKEqUU,1919
188
189
  claude_mpm/commands/mpm-tickets.md,sha256=a2_mW56QDhw7-jMU92ycGaxvSSYpNoQFGhkWbr3MJ88,2356
189
190
  claude_mpm/commands/mpm-version.md,sha256=lwI2QiRYKfA6L5y_FGL8Nkb-4GtO2Z4iuNBbMvfx6Hs,2648
190
- claude_mpm/commands/mpm.md,sha256=_VwGAZPYruPW9Rdh0_xOZWDxVrE3KOT00G7FvPkq_T4,636
191
+ claude_mpm/commands/mpm.md,sha256=TpAYvIOr8LMppXGGrmJMtDXtKws3QyrrgPy-euLmSiM,680
191
192
  claude_mpm/config/__init__.py,sha256=V2dyJQ8_gVCpNiCg8zYTQqE1RSeON5Zm8n5Ndkqhp1g,916
192
193
  claude_mpm/config/agent_config.py,sha256=IpHt9jfY335dnWbFbZHz3fBwQr5afQMvQ1c1Uo4zGmA,14862
193
194
  claude_mpm/config/experimental_features.py,sha256=cH95HqMUEQL-_Hs833dAAC33GHMUE5e26qpOyiEtBWI,7546
@@ -593,7 +594,7 @@ claude_mpm/services/cli/startup_checker.py,sha256=MmztJ7yAnk5O5shArGDzRzwBDmx1Wi
593
594
  claude_mpm/services/cli/unified_dashboard_manager.py,sha256=LH45wbiKn5GqEZWPH-18TQnsisR3vQchvSnxa-_CDZI,15607
594
595
  claude_mpm/services/communication/__init__.py,sha256=b4qc7_Rqy4DE9q7BAUlfUZjoYG4uimAyUnE0irPcXyU,560
595
596
  claude_mpm/services/core/__init__.py,sha256=e4VumzvTv3zw7m_gN6vSgNvRud0fWG_BayV5syTbeIo,3049
596
- claude_mpm/services/core/base.py,sha256=iA-F7DgGp-FJIMvQTiHQ68RkG_k-AtUWlArJPMw6ZPk,7297
597
+ claude_mpm/services/core/base.py,sha256=kXKO30ajZOpVY9a__BRoAqwXQn5OBYCdiQHIiKNJpLU,7978
597
598
  claude_mpm/services/core/cache_manager.py,sha256=dBHvvI6M67kaxFtAubi4IsWfbDZSct1siyKHTmCIrW8,11567
598
599
  claude_mpm/services/core/interfaces.py,sha256=UdAGg5YCFswDBGWUaOFva1WabmTCSmv2yC2EeGODeAI,2545
599
600
  claude_mpm/services/core/memory_manager.py,sha256=aajBuvBzTq0-EZrjnBjGRdUSaa6MpbfqHAtCePnn7aQ,26258
@@ -639,7 +640,7 @@ claude_mpm/services/event_bus/__init__.py,sha256=ETCo4a6puIeyVWAv55uCDjjhzNyUwbV
639
640
  claude_mpm/services/event_bus/config.py,sha256=MJdOBK3XgLpW66N81tetThslnKsFIWYtbqRamyTDxlU,4943
640
641
  claude_mpm/services/event_bus/direct_relay.py,sha256=35kwO6S0gOeKGBq-dZ4aUH3NWno_evKfTyHJcMIzS7A,13623
641
642
  claude_mpm/services/event_bus/event_bus.py,sha256=dgEUHov4QCPG7vyp8Z0I-_JW7v_2r1vE5Em4dyn3OJ8,12408
642
- claude_mpm/services/event_bus/relay.py,sha256=m7S4sfGeagUZ5skvH8iaPoTDN2l4QZ25E46XSG1-d_c,9474
643
+ claude_mpm/services/event_bus/relay.py,sha256=643rRM13HLU2Fo86uNw7jVgW5X1vxxJBfi_RPVofOsc,9939
643
644
  claude_mpm/services/events/__init__.py,sha256=dna3DFYCxt9Y1jgK-0f2KPlX-jFo4n2dJyy9WKZkNlA,1092
644
645
  claude_mpm/services/events/core.py,sha256=rNXwMCDzQelPzCTknwxz5wgHP1_-h8EjGJDiI9DOZFM,16287
645
646
  claude_mpm/services/events/interfaces.py,sha256=bu-x8rRJj36TRVJtHDKjLsD9FimqXeAuPNZl3_kqVLg,5324
@@ -732,7 +733,7 @@ claude_mpm/services/mcp_gateway/utils/package_version_checker.py,sha256=BIq0kirC
732
733
  claude_mpm/services/mcp_gateway/utils/update_preferences.py,sha256=CrmxistQvDDqfYxTy8Ea2mdRu9qQyun4-rPJJMvQnsE,4893
733
734
  claude_mpm/services/memory/__init__.py,sha256=vOZrdDfYdgjV5jhUyqGiICoywAwUNGcE_d7z1XfKTyE,472
734
735
  claude_mpm/services/memory/builder.py,sha256=LG73skuLXlm1qWiB-fYGgRPUy23Z4OQAkh4eqoAq124,34353
735
- claude_mpm/services/memory/failure_tracker.py,sha256=Kzq-caKOXQQ-WxihejcrBvUD-h3XZ_9V_wqCVboqD28,19369
736
+ claude_mpm/services/memory/failure_tracker.py,sha256=GqD0Vs-wBMJ8A54kxsRtvaf76HPwZoxH0CUB549Cv0Y,19831
736
737
  claude_mpm/services/memory/indexed_memory.py,sha256=I_8syn60APW2sY3CgYxLps0yjdjfZ33nU4Ab_DPuBbA,19540
737
738
  claude_mpm/services/memory/optimizer.py,sha256=19zNaQG5UsQ6BLW9zo_44mIyXf1M7a_HdE9PdG_duyQ,22967
738
739
  claude_mpm/services/memory/router.py,sha256=c92j-7SXF254gvW-DvQ8OzvWKLdhklDndikNdjxBYMQ,31060
@@ -965,10 +966,19 @@ claude_mpm/storage/__init__.py,sha256=DXnmee6iGqC6ctFLW7_Ty1cVCjYDFuCMkwO4EV0i25
965
966
  claude_mpm/storage/state_storage.py,sha256=6jEZ4z35MjtAuTTUdqETTy4_dbMMK8EN_C2kVa62PjY,16811
966
967
  claude_mpm/tools/__init__.py,sha256=T3GuCYNAHtjVcKCeivY674PaDm48WX96AriQfTKUknY,347
967
968
  claude_mpm/tools/__main__.py,sha256=MtpJoWA2HEmRE_XDsSjjto6DND7Ft0MZoiY4ivNHh5A,5714
968
- claude_mpm/tools/code_tree_analyzer.py,sha256=hnbqwPwR7xjO6nWU3uiKMur42gNuSmk3iPppwtUub7s,65783
969
969
  claude_mpm/tools/code_tree_builder.py,sha256=8EaW94NjEObraiW811dDoQ8xKixrzCr4YoL6myZdZzU,18145
970
970
  claude_mpm/tools/code_tree_events.py,sha256=2mvKfnfk1Rt2-DWxxUVOZDM5xhN5XBOSpzoEwNaYuNQ,13465
971
971
  claude_mpm/tools/socketio_debug.py,sha256=QpG_GoN9VY8OZ0tcg8bqIF2oB_ZbKTjGp0oD0xYmsFo,22226
972
+ claude_mpm/tools/code_tree_analyzer/__init__.py,sha256=jNSMe7s1kCo3ig0RpF3ij4KxgnBt86raqkf0_8xkijs,1319
973
+ claude_mpm/tools/code_tree_analyzer/analysis.py,sha256=ENxV7qDwNYBGNoqwLoxoYlDl_gGv2LR9M5iN7bQlFZQ,9645
974
+ claude_mpm/tools/code_tree_analyzer/cache.py,sha256=UdL6qs3f7Y8PFORqzyIjB0wyIxfJe9eVtlI0USL9k44,3994
975
+ claude_mpm/tools/code_tree_analyzer/core.py,sha256=asRBFQELXANW7j3RYALkIAteqpwldYbXO2Y3zdyz3bQ,12034
976
+ claude_mpm/tools/code_tree_analyzer/discovery.py,sha256=U9eYjHf4xxsSzsJD3siKUzvKNxgfgGUNj7Lu4QHRiKg,14046
977
+ claude_mpm/tools/code_tree_analyzer/events.py,sha256=TF9hBDVu3DtHeYdrtvh3UNwcJ4YyIq10lZ6NYtSRaJY,5376
978
+ claude_mpm/tools/code_tree_analyzer/gitignore.py,sha256=MPuYMaSAXb7AY5tXH0H9jAxOxaoUVHEmxz_-JZ2w4nY,9762
979
+ claude_mpm/tools/code_tree_analyzer/models.py,sha256=jZ63GOGivZFImbqKfg12fUAo1n57VTEINI0jCLGitSc,928
980
+ claude_mpm/tools/code_tree_analyzer/multilang_analyzer.py,sha256=A7MC11_WFc-e5P6Klazh0QJN2kGzq-PmhrqOU6Q1fj0,8386
981
+ claude_mpm/tools/code_tree_analyzer/python_analyzer.py,sha256=iJsda_pFgXIY36oaqglPuc_vUo8APIpqwW30TUJfgls,11314
972
982
  claude_mpm/utils/__init__.py,sha256=rkxNE0tDfKEN2lr2LLBuToNSvkF-yjF38607eUXL1vk,353
973
983
  claude_mpm/utils/agent_dependency_loader.py,sha256=jxWMeQ3MJx-cPiKszbXZZlCWxl_Auw7m_G8vuGbFsv4,36680
974
984
  claude_mpm/utils/common.py,sha256=6hcs3Y6lx596Oj4H3CEQId-NIn8XEZJw1Ud3GAKwXKA,14341
@@ -994,9 +1004,9 @@ claude_mpm/utils/subprocess_utils.py,sha256=D0izRT8anjiUb_JG72zlJR_JAw1cDkb7kalN
994
1004
  claude_mpm/validation/__init__.py,sha256=YZhwE3mhit-lslvRLuwfX82xJ_k4haZeKmh4IWaVwtk,156
995
1005
  claude_mpm/validation/agent_validator.py,sha256=GprtAvu80VyMXcKGsK_VhYiXWA6BjKHv7O6HKx0AB9w,20917
996
1006
  claude_mpm/validation/frontmatter_validator.py,sha256=YpJlYNNYcV8u6hIOi3_jaRsDnzhbcQpjCBE6eyBKaFY,7076
997
- claude_mpm-4.21.0.dist-info/licenses/LICENSE,sha256=lpaivOlPuBZW1ds05uQLJJswy8Rp_HMNieJEbFlqvLk,1072
998
- claude_mpm-4.21.0.dist-info/METADATA,sha256=gTCDut_ETdjBPPoPcvC58biiW6ulr14ZCztOx14RziQ,25488
999
- claude_mpm-4.21.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
1000
- claude_mpm-4.21.0.dist-info/entry_points.txt,sha256=Vlw3GNi-OtTpKSrez04iNrPmxNxYDpIWxmJCxiZ5Tx8,526
1001
- claude_mpm-4.21.0.dist-info/top_level.txt,sha256=1nUg3FEaBySgm8t-s54jK5zoPnu3_eY6EP6IOlekyHA,11
1002
- claude_mpm-4.21.0.dist-info/RECORD,,
1007
+ claude_mpm-4.21.3.dist-info/licenses/LICENSE,sha256=lpaivOlPuBZW1ds05uQLJJswy8Rp_HMNieJEbFlqvLk,1072
1008
+ claude_mpm-4.21.3.dist-info/METADATA,sha256=_jzYBPfmyQEUiet2hKWOhhO2AcL5QCeAJeYzh0ChNE4,25488
1009
+ claude_mpm-4.21.3.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
1010
+ claude_mpm-4.21.3.dist-info/entry_points.txt,sha256=Vlw3GNi-OtTpKSrez04iNrPmxNxYDpIWxmJCxiZ5Tx8,526
1011
+ claude_mpm-4.21.3.dist-info/top_level.txt,sha256=1nUg3FEaBySgm8t-s54jK5zoPnu3_eY6EP6IOlekyHA,11
1012
+ claude_mpm-4.21.3.dist-info/RECORD,,