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.
- claude_mpm/VERSION +1 -1
- claude_mpm/commands/mpm-help.md +3 -0
- claude_mpm/commands/mpm-resume.md +372 -0
- claude_mpm/commands/mpm.md +1 -0
- claude_mpm/services/core/base.py +26 -11
- claude_mpm/services/event_bus/relay.py +23 -7
- claude_mpm/services/memory/failure_tracker.py +19 -4
- claude_mpm/tools/code_tree_analyzer/__init__.py +45 -0
- claude_mpm/tools/code_tree_analyzer/analysis.py +299 -0
- claude_mpm/tools/code_tree_analyzer/cache.py +131 -0
- claude_mpm/tools/code_tree_analyzer/core.py +380 -0
- claude_mpm/tools/code_tree_analyzer/discovery.py +403 -0
- claude_mpm/tools/code_tree_analyzer/events.py +168 -0
- claude_mpm/tools/code_tree_analyzer/gitignore.py +308 -0
- claude_mpm/tools/code_tree_analyzer/models.py +39 -0
- claude_mpm/tools/code_tree_analyzer/multilang_analyzer.py +224 -0
- claude_mpm/tools/code_tree_analyzer/python_analyzer.py +284 -0
- {claude_mpm-4.21.0.dist-info → claude_mpm-4.21.3.dist-info}/METADATA +1 -1
- {claude_mpm-4.21.0.dist-info → claude_mpm-4.21.3.dist-info}/RECORD +23 -13
- claude_mpm/tools/code_tree_analyzer.py +0 -1825
- {claude_mpm-4.21.0.dist-info → claude_mpm-4.21.3.dist-info}/WHEEL +0 -0
- {claude_mpm-4.21.0.dist-info → claude_mpm-4.21.3.dist-info}/entry_points.txt +0 -0
- {claude_mpm-4.21.0.dist-info → claude_mpm-4.21.3.dist-info}/licenses/LICENSE +0 -0
- {claude_mpm-4.21.0.dist-info → claude_mpm-4.21.3.dist-info}/top_level.txt +0 -0
|
@@ -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,5 +1,5 @@
|
|
|
1
1
|
claude_mpm/BUILD_NUMBER,sha256=9JfxhnDtr-8l3kCP2U5TVXSErptHoga8m7XA8zqgGOc,4
|
|
2
|
-
claude_mpm/VERSION,sha256=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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.
|
|
998
|
-
claude_mpm-4.21.
|
|
999
|
-
claude_mpm-4.21.
|
|
1000
|
-
claude_mpm-4.21.
|
|
1001
|
-
claude_mpm-4.21.
|
|
1002
|
-
claude_mpm-4.21.
|
|
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,,
|