claude-mpm 4.0.30__py3-none-any.whl → 4.0.32__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.
@@ -24,16 +24,9 @@ class MemoryContentManager:
24
24
 
25
25
  WHY: Memory content requires careful manipulation to maintain structure,
26
26
  enforce limits, and ensure consistency. This class centralizes all content
27
- manipulation logic.
27
+ manipulation logic for simple list-based memories.
28
28
  """
29
29
 
30
- REQUIRED_SECTIONS = [
31
- "Project Architecture",
32
- "Implementation Guidelines",
33
- "Common Mistakes to Avoid",
34
- "Current Technical Context",
35
- ]
36
-
37
30
  def __init__(self, memory_limits: Dict[str, Any]):
38
31
  """Initialize the content manager.
39
32
 
@@ -43,41 +36,21 @@ class MemoryContentManager:
43
36
  self.memory_limits = memory_limits
44
37
  self.logger = logging.getLogger(f"{__name__}.{self.__class__.__name__}")
45
38
 
46
- def add_item_to_section(self, content: str, section: str, new_item: str) -> str:
47
- """Add item to specified section with NLP-based deduplication.
39
+ def add_item_to_list(self, content: str, new_item: str) -> str:
40
+ """Add item to memory list with deduplication.
48
41
 
49
- WHY: Each section has a maximum item limit to prevent information overload
50
- and maintain readability. Additionally, we use NLP-based similarity detection
51
- to prevent duplicate or highly similar items from cluttering the memory.
52
- When similar items are found (>80% similarity), the newer item replaces the
53
- older one to maintain recency while avoiding redundancy.
42
+ WHY: Simplified memory system uses a simple list format. We still use
43
+ NLP-based similarity detection to prevent duplicate or highly similar
44
+ items from cluttering the memory.
54
45
 
55
46
  Args:
56
47
  content: Current memory file content
57
- section: Section name to add item to
58
48
  new_item: Item to add
59
49
 
60
50
  Returns:
61
51
  str: Updated content with new item added and duplicates removed
62
52
  """
63
53
  lines = content.split("\n")
64
- section_start = None
65
- section_end = None
66
-
67
- # Find section boundaries
68
- for i, line in enumerate(lines):
69
- if line.startswith(f"## {section}"):
70
- section_start = i
71
- elif section_start is not None and line.startswith("## "):
72
- section_end = i
73
- break
74
-
75
- if section_start is None:
76
- # Section doesn't exist, add it
77
- return self._add_new_section(content, section, new_item)
78
-
79
- if section_end is None:
80
- section_end = len(lines)
81
54
 
82
55
  # Ensure line length limit (account for "- " prefix)
83
56
  max_item_length = (
@@ -86,11 +59,13 @@ class MemoryContentManager:
86
59
  if len(new_item) > max_item_length:
87
60
  new_item = new_item[: max_item_length - 3] + "..."
88
61
 
89
- # Check for duplicates or similar items using NLP similarity
62
+ # Find existing items and check for duplicates
90
63
  items_to_remove = []
91
- for i in range(section_start + 1, section_end):
92
- if lines[i].strip().startswith("- "):
93
- existing_item = lines[i].strip()[2:] # Remove "- " prefix
64
+ item_indices = []
65
+ for i, line in enumerate(lines):
66
+ if line.strip().startswith("- "):
67
+ item_indices.append(i)
68
+ existing_item = line.strip()[2:] # Remove "- " prefix
94
69
  similarity = self._calculate_similarity(existing_item, new_item)
95
70
 
96
71
  # If highly similar (>80%), mark for removal
@@ -104,77 +79,45 @@ class MemoryContentManager:
104
79
  # Remove similar items (in reverse order to maintain indices)
105
80
  for idx in reversed(items_to_remove):
106
81
  lines.pop(idx)
107
- section_end -= 1
108
82
 
109
- # Count remaining items after deduplication
110
- item_count = 0
111
- first_item_index = None
112
- for i in range(section_start + 1, section_end):
113
- if lines[i].strip().startswith("- "):
114
- if first_item_index is None:
115
- first_item_index = i
116
- item_count += 1
117
-
118
- # Check if we need to remove oldest item due to section limits
119
- if item_count >= self.memory_limits["max_items_per_section"]:
120
- # Remove oldest item (first one) to make room
121
- if first_item_index is not None:
122
- lines.pop(first_item_index)
123
- section_end -= 1 # Adjust section end after removal
124
-
125
- # Add new item (find insertion point after any comments)
126
- insert_point = section_start + 1
127
- while insert_point < section_end and (
128
- not lines[insert_point].strip()
129
- or lines[insert_point].strip().startswith("<!--")
130
- ):
131
- insert_point += 1
83
+ # Count remaining items
84
+ item_count = sum(1 for line in lines if line.strip().startswith("- "))
85
+
86
+ # Check if we need to remove oldest item due to limits
87
+ max_items = self.memory_limits.get("max_items", 100)
88
+ if item_count >= max_items:
89
+ # Find and remove the first item (oldest)
90
+ for i, line in enumerate(lines):
91
+ if line.strip().startswith("- "):
92
+ lines.pop(i)
93
+ break
132
94
 
95
+ # Add new item at the end of the list
96
+ # Find the insertion point (after header and metadata, before any trailing empty lines)
97
+ insert_point = len(lines)
98
+ for i in range(len(lines) - 1, -1, -1):
99
+ if lines[i].strip():
100
+ insert_point = i + 1
101
+ break
102
+
133
103
  lines.insert(insert_point, f"- {new_item}")
134
104
 
135
105
  # Update timestamp
136
106
  updated_content = "\n".join(lines)
137
107
  return self.update_timestamp(updated_content)
138
108
 
139
- def _add_new_section(self, content: str, section: str, new_item: str) -> str:
140
- """Add a new section with the given item.
141
-
142
- WHY: When agents discover learnings that don't fit existing sections,
143
- we need to create new sections dynamically while respecting the maximum
144
- section limit.
145
-
109
+ def add_item_to_section(self, content: str, section: str, new_item: str) -> str:
110
+ """Legacy method for backward compatibility - delegates to add_item_to_list.
111
+
146
112
  Args:
147
- content: Current memory content
148
- section: New section name
149
- new_item: First item for the section
150
-
113
+ content: Current memory file content
114
+ section: Section name (ignored in simple list format)
115
+ new_item: Item to add
116
+
151
117
  Returns:
152
- str: Updated content with new section
118
+ str: Updated content with new item added
153
119
  """
154
- lines = content.split("\n")
155
-
156
- # Count existing sections
157
- section_count = sum(1 for line in lines if line.startswith("## "))
158
-
159
- if section_count >= self.memory_limits["max_sections"]:
160
- self.logger.warning(f"Maximum sections reached, cannot add '{section}'")
161
- # Try to add to Recent Learnings instead
162
- return self.add_item_to_section(content, "Recent Learnings", new_item)
163
-
164
- # Find insertion point (before Recent Learnings or at end)
165
- insert_point = len(lines)
166
- for i, line in enumerate(lines):
167
- if line.startswith("## Recent Learnings"):
168
- insert_point = i
169
- break
170
-
171
- # Insert new section
172
- new_section = ["", f"## {section}", f"- {new_item}", ""]
173
-
174
- for j, line in enumerate(new_section):
175
- lines.insert(insert_point + j, line)
176
-
177
- return "\n".join(lines)
120
+ return self.add_item_to_list(content, new_item)
178
121
 
179
122
  def exceeds_limits(
180
123
  self, content: str, agent_limits: Optional[Dict[str, Any]] = None
@@ -193,15 +136,13 @@ class MemoryContentManager:
193
136
  size_kb = len(content.encode("utf-8")) / 1024
194
137
  return size_kb > limits["max_file_size_kb"]
195
138
 
196
- def truncate_to_limits(
139
+ def truncate_simple_list(
197
140
  self, content: str, agent_limits: Optional[Dict[str, Any]] = None
198
141
  ) -> str:
199
- """Truncate content to fit within limits.
142
+ """Truncate simple list content to fit within limits.
200
143
 
201
- WHY: When memory files exceed size limits, we need a strategy to reduce
202
- size while preserving the most important information. This implementation
203
- removes items from "Recent Learnings" first as they're typically less
204
- consolidated than other sections.
144
+ WHY: When memory files exceed size limits, we remove oldest items
145
+ (from the beginning of the list) to maintain the most recent learnings.
205
146
 
206
147
  Args:
207
148
  content: Content to truncate
@@ -213,37 +154,45 @@ class MemoryContentManager:
213
154
  lines = content.split("\n")
214
155
  limits = agent_limits or self.memory_limits
215
156
 
216
- # Strategy: Remove items from Recent Learnings first
157
+ # Strategy: Remove oldest items (from beginning) to keep recent ones
217
158
  while self.exceeds_limits("\n".join(lines), agent_limits):
218
159
  removed = False
219
160
 
220
- # First try Recent Learnings
161
+ # Find and remove the first item (oldest)
221
162
  for i, line in enumerate(lines):
222
- if line.startswith("## Recent Learnings"):
223
- # Find and remove first item in this section
224
- for j in range(i + 1, len(lines)):
225
- if lines[j].strip().startswith("- "):
226
- lines.pop(j)
227
- removed = True
228
- break
229
- elif lines[j].startswith("## "):
230
- break
163
+ if line.strip().startswith("- "):
164
+ lines.pop(i)
165
+ removed = True
231
166
  break
232
167
 
233
- # If no Recent Learnings items, remove from other sections
234
- if not removed:
235
- # Remove from sections in reverse order (bottom up)
236
- for i in range(len(lines) - 1, -1, -1):
237
- if lines[i].strip().startswith("- "):
238
- lines.pop(i)
239
- removed = True
240
- break
241
-
242
168
  # Safety: If nothing removed, truncate from end
243
169
  if not removed:
244
170
  lines = lines[:-10]
245
171
 
172
+ # Also check max_items limit
173
+ max_items = limits.get("max_items", 100)
174
+ item_count = sum(1 for line in lines if line.strip().startswith("- "))
175
+
176
+ if item_count > max_items:
177
+ # Remove oldest items to fit within max_items
178
+ items_removed = 0
179
+ target_removals = item_count - max_items
180
+
181
+ i = 0
182
+ while i < len(lines) and items_removed < target_removals:
183
+ if lines[i].strip().startswith("- "):
184
+ lines.pop(i)
185
+ items_removed += 1
186
+ else:
187
+ i += 1
188
+
246
189
  return "\n".join(lines)
190
+
191
+ def truncate_to_limits(
192
+ self, content: str, agent_limits: Optional[Dict[str, Any]] = None
193
+ ) -> str:
194
+ """Legacy method for backward compatibility - delegates to truncate_simple_list."""
195
+ return self.truncate_simple_list(content, agent_limits)
247
196
 
248
197
  def update_timestamp(self, content: str) -> str:
249
198
  """Update the timestamp in the file header.
@@ -254,12 +203,20 @@ class MemoryContentManager:
254
203
  Returns:
255
204
  str: Content with updated timestamp
256
205
  """
257
- timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
258
- return re.sub(
206
+ timestamp = datetime.now().isoformat() + "Z"
207
+ # Handle both old and new timestamp formats
208
+ content = re.sub(
209
+ r"<!-- Last Updated: .+? -->",
210
+ f"<!-- Last Updated: {timestamp} -->",
211
+ content,
212
+ )
213
+ # Also handle legacy format
214
+ content = re.sub(
259
215
  r"<!-- Last Updated: .+ \| Auto-updated by: .+ -->",
260
- f"<!-- Last Updated: {timestamp} | Auto-updated by: system -->",
216
+ f"<!-- Last Updated: {timestamp} -->",
261
217
  content,
262
218
  )
219
+ return content
263
220
 
264
221
  def validate_and_repair(self, content: str, agent_id: str) -> str:
265
222
  """Validate memory file and repair if needed.
@@ -68,7 +68,7 @@ class MemoryTemplateGenerator:
68
68
  def _create_basic_memory_template(
69
69
  self, agent_id: str, limits: Dict[str, Any]
70
70
  ) -> str:
71
- """Create basic memory template when project analysis fails.
71
+ """Create basic memory template as a simple list.
72
72
 
73
73
  Args:
74
74
  agent_id: The agent identifier
@@ -77,45 +77,9 @@ class MemoryTemplateGenerator:
77
77
  Returns:
78
78
  str: Basic memory template
79
79
  """
80
- agent_name = agent_id.replace("_agent", "").replace("_", " ").title()
81
- project_name = self.working_directory.name
82
- timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
83
-
84
- return f"""# {agent_name} Agent Memory - {project_name}
85
-
86
- <!-- MEMORY LIMITS: {limits['max_file_size_kb']}KB max | {limits['max_sections']} sections max | {limits['max_items_per_section']} items per section -->
87
- <!-- Last Updated: {timestamp} | Auto-updated by: {agent_id} -->
88
-
89
- ## Project Context
90
- {project_name}: Software project requiring analysis
91
-
92
- ## Project Architecture
93
- - Analyze project structure to understand architecture patterns
94
-
95
- ## Coding Patterns Learned
96
- - Observe codebase patterns and conventions during tasks
97
-
98
- ## Implementation Guidelines
99
- - Extract implementation guidelines from project documentation
100
-
101
- ## Domain-Specific Knowledge
102
- <!-- Agent-specific knowledge accumulates here -->
103
-
104
- ## Effective Strategies
105
- <!-- Successful approaches discovered through experience -->
106
-
107
- ## Common Mistakes to Avoid
108
- - Learn from errors encountered during project work
109
-
110
- ## Integration Points
111
- <!-- Key interfaces and integration patterns -->
112
-
113
- ## Performance Considerations
114
- <!-- Performance insights and optimization patterns -->
80
+ timestamp = datetime.now().isoformat() + "Z"
115
81
 
116
- ## Current Technical Context
117
- - Project analysis pending - gather context during tasks
82
+ return f"""# Agent Memory: {agent_id}
83
+ <!-- Last Updated: {timestamp} -->
118
84
 
119
- ## Recent Learnings
120
- <!-- Most recent discoveries and insights -->
121
85
  """
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: claude-mpm
3
- Version: 4.0.30
3
+ Version: 4.0.32
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
@@ -5,9 +5,9 @@ claude_mpm/__main__.py,sha256=_kaecmtouDenx_-wueUULnTxu8LirJEerzXIHiKMgew,723
5
5
  claude_mpm/constants.py,sha256=zwu1-qg-FAWyViUIKiTvYHGtgz6ABLDDrhmLiMMhOyc,5677
6
6
  claude_mpm/init.py,sha256=n2W1sBtGUOod2XSMbiYZsqucvQUMuxf0ZudzeQjFv7E,15209
7
7
  claude_mpm/ticket_wrapper.py,sha256=qe5xY579t7_7fK5nyeAfHN_fr7CXdeOD3jfXEc8-7yo,828
8
- claude_mpm/agents/BASE_AGENT_TEMPLATE.md,sha256=-_49H9TBGwdm7UoCfEUm0iZ82yaVic6_3X9BGeZj6EI,5827
8
+ claude_mpm/agents/BASE_AGENT_TEMPLATE.md,sha256=r3EZA186PH7IAPaHsLc3aF3WmB5nwkz207lbAOVwRTA,5965
9
9
  claude_mpm/agents/BASE_PM.md,sha256=SxItl7GEYhrp-rTXi3todB-vcMCpiBchfzieBlFI0w8,8479
10
- claude_mpm/agents/INSTRUCTIONS.md,sha256=T99JZykSdxbZiVzwnU-IcJ9rGlJh9m4nCi_8IGCoBq8,13630
10
+ claude_mpm/agents/INSTRUCTIONS.md,sha256=AvpRqSJZiFhZDKx2bJVvYgeG4gdUDRgO8sqNJNnoHjI,13917
11
11
  claude_mpm/agents/MEMORY.md,sha256=zzwq4ytOrRaj64iq1q7brC6WOCQ4PDDC75TTRT8QudA,3493
12
12
  claude_mpm/agents/OUTPUT_STYLE.md,sha256=iX1vX81PnCq8N92v95hWbvaUfg3JZ2qpGJYfCG97r0c,2854
13
13
  claude_mpm/agents/WORKFLOW.md,sha256=pZPdOzmu4jEredvA4MC_rcEoW4zo5kvOT2174i0Pmzs,18527
@@ -118,7 +118,7 @@ claude_mpm/core/constants.py,sha256=ElBw5FVC2EDce7y1Qcrux75y3ZlCb9HwyJLfePYEO7s,
118
118
  claude_mpm/core/container.py,sha256=3FsdjUXTpQgOZV2BuxvH8sZHg_459EslMw_rO65Ch0E,32327
119
119
  claude_mpm/core/exceptions.py,sha256=lNVLqVuRjygHe89NJg1rPAyevVdzpLOKgHFMQtGSxdA,19654
120
120
  claude_mpm/core/factories.py,sha256=A7WcjYWjhkc-tzUnef0YaW0Jj8oxMP-7_g2jIj1XYa8,7265
121
- claude_mpm/core/framework_loader.py,sha256=eEtrkUuQCKh9037WkSPsaq_Vrd1xH7VuIFfHt1Wyonk,72901
121
+ claude_mpm/core/framework_loader.py,sha256=t8gzs4NZBM3Q7G83uS8Dh60M_HHxah4eGyD-uFNMtIM,76510
122
122
  claude_mpm/core/hook_manager.py,sha256=N-54QwNsyrUZSrH533HAo6hlJKPFbgMeDirg92H8en8,11014
123
123
  claude_mpm/core/hook_performance_config.py,sha256=Cqf-89mjiLlFJ-v4PhxfzsaOVovYYQa5pa-RMm42Ki8,5748
124
124
  claude_mpm/core/injectable_service.py,sha256=HXuviYX-h0sNxOFzgZiYjf-gLDUnQIeG-0-KuWdfCzk,7397
@@ -251,7 +251,7 @@ claude_mpm/services/agents/deployment/__init__.py,sha256=d9l1uaf-G7v_mCxcz8OUQMF
251
251
  claude_mpm/services/agents/deployment/agent_config_provider.py,sha256=iH_N4Qi7gq_Pc4OYqsnaaX5KPVMlJ2dYkQS_PEVmLtY,13312
252
252
  claude_mpm/services/agents/deployment/agent_configuration_manager.py,sha256=VhwSYX1wYYnSQqfqmCpy9goPJ9f2eEA2_DFrdwtO7j4,12180
253
253
  claude_mpm/services/agents/deployment/agent_definition_factory.py,sha256=izcjZGLznts8khXD8wLViUbk_kPhnrqucLHFdfap_8c,2754
254
- claude_mpm/services/agents/deployment/agent_deployment.py,sha256=pEdX-0ahX1KZ22uHW995r2vU3vcEQSL4kstkmaTKESo,49162
254
+ claude_mpm/services/agents/deployment/agent_deployment.py,sha256=7yeap4GN6DB3yUGamSG-RZG7Zh2--Td4I8-LvIK3yUo,51888
255
255
  claude_mpm/services/agents/deployment/agent_discovery_service.py,sha256=0z1y1OXZUt2vJEmY0RCD0KSvSiG7KkpqT68wVVfNEDY,13438
256
256
  claude_mpm/services/agents/deployment/agent_environment_manager.py,sha256=Tx-fqnRmd-XV8goqUv3M6dtfthc98hrh7-Xcvs3QKYU,9936
257
257
  claude_mpm/services/agents/deployment/agent_filesystem_manager.py,sha256=dKDsweubspi-x0X97ah_Ffw1LRPWttD2JKtryrwhjhw,13004
@@ -274,7 +274,7 @@ claude_mpm/services/agents/deployment/lifecycle_health_checker.py,sha256=2dphAvY
274
274
  claude_mpm/services/agents/deployment/lifecycle_performance_tracker.py,sha256=lK_yg0uRL55opUoecOJBL83Tjj6Pu_z4-4EYWPeN6tM,4336
275
275
  claude_mpm/services/agents/deployment/multi_source_deployment_service.py,sha256=UD27Ry1NUXpQIMb2VqVMtbLLvcc1WOHqtKhtaN093vg,22294
276
276
  claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py,sha256=3EUb6rDe7FooDLM8TxMgefM0UE90MGhy0PmhKQXvTSA,11892
277
- claude_mpm/services/agents/deployment/system_instructions_deployer.py,sha256=VTtpO880wU5Bo2kIOLdugScBRi5SjhAsd1tdJfOXSU8,4227
277
+ claude_mpm/services/agents/deployment/system_instructions_deployer.py,sha256=wpXPl0XhWmpoOOlFPz_I8vlWiwqMNrdeot0PpScR3zA,7318
278
278
  claude_mpm/services/agents/deployment/config/__init__.py,sha256=dpyC_WlQWlaOne9VVF0KXzoEO0Davt02bjfk1AJv2jk,397
279
279
  claude_mpm/services/agents/deployment/config/deployment_config.py,sha256=UXWWjzVD6SFVgHxH0mku3oOnhvoTbpqVUuyc_TjvMOo,6429
280
280
  claude_mpm/services/agents/deployment/config/deployment_config_manager.py,sha256=XjW8tlEIxOT0t5qoR6ddL4zWMvcD_ckVLmCT8AvxMhU,7255
@@ -319,10 +319,10 @@ claude_mpm/services/agents/management/__init__.py,sha256=dZcFI9EBajH2KbCoNQWAFQ0
319
319
  claude_mpm/services/agents/management/agent_capabilities_generator.py,sha256=2j5yoyCXhsK41Bpr8gDAS6jXKhTI_lyYPkTa2djPls4,7002
320
320
  claude_mpm/services/agents/management/agent_management_service.py,sha256=ek8qGMHqyAb2kks4GG0GpS123dl-zyhRas9pnn6fUy8,23027
321
321
  claude_mpm/services/agents/memory/__init__.py,sha256=V7Sgx3ISF--XN2pJzk_XduOHxWNxZ0I2H9xOTsV46K8,608
322
- claude_mpm/services/agents/memory/agent_memory_manager.py,sha256=nsEgTYOAl0Co6PdNHNT0vEJH4_0npWNrt6lcq6iCtsQ,48124
322
+ claude_mpm/services/agents/memory/agent_memory_manager.py,sha256=Bs6_-pKDu_Ju29JJi5mHSuvDZLBxNEPiQO0_z69ppxo,46697
323
323
  claude_mpm/services/agents/memory/agent_persistence_service.py,sha256=mx67hEZtpMG-fom_qUvOL0U8HSWam1F55LJj4g4k3nw,2783
324
- claude_mpm/services/agents/memory/content_manager.py,sha256=do1FvWS4ER_-XVRmu7OJ70SLeDsfPJOv8aZ0otMazAg,18728
325
- claude_mpm/services/agents/memory/template_generator.py,sha256=hGYp6l8Wc7qjTgDNDUCwbsRWmSJXjfXWsfch26nVKiA,3845
324
+ claude_mpm/services/agents/memory/content_manager.py,sha256=NoCpUJT4yOx6T6d4ksUo94nX1BvdrnZ0WBwOPKiThZc,16926
325
+ claude_mpm/services/agents/memory/template_generator.py,sha256=ZeXA6r2P4srQb2Frl7HX9Ifgza0OU3im2q4yNMmhXcU,2592
326
326
  claude_mpm/services/agents/registry/__init__.py,sha256=88IdNug1aq52Vc-Uc2zQsbuOOvPawN-zFzQqoPmEVVQ,710
327
327
  claude_mpm/services/agents/registry/deployed_agent_discovery.py,sha256=XKN0A6MxW8NhILRt8dSPFVkNDkrAJDhmhumB_-5Dy0I,10274
328
328
  claude_mpm/services/agents/registry/modification_tracker.py,sha256=iSzt92HpXkkwigrM6yuq7J1wer43fhfWsnabFGB10e4,34053
@@ -460,9 +460,9 @@ claude_mpm/utils/subprocess_utils.py,sha256=e74VlIPozCljZss_0SwLO3J1ZuIKRT9FrrFi
460
460
  claude_mpm/validation/__init__.py,sha256=YZhwE3mhit-lslvRLuwfX82xJ_k4haZeKmh4IWaVwtk,156
461
461
  claude_mpm/validation/agent_validator.py,sha256=szbK9d29v_T6xE_KvW845WLKXbS_yYpXQscrSrSeldI,20937
462
462
  claude_mpm/validation/frontmatter_validator.py,sha256=hFhKnSvlYuYT91lPDxX9V6ICm05MBJw85coZpkL1o1g,7033
463
- claude_mpm-4.0.30.dist-info/licenses/LICENSE,sha256=lpaivOlPuBZW1ds05uQLJJswy8Rp_HMNieJEbFlqvLk,1072
464
- claude_mpm-4.0.30.dist-info/METADATA,sha256=pufZxuo1uqN2muy79MWVFbhQCQgvOY3P1ekIlsgr6SA,12360
465
- claude_mpm-4.0.30.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
466
- claude_mpm-4.0.30.dist-info/entry_points.txt,sha256=FDPZgz8JOvD-6iuXY2l9Zbo9zYVRuE4uz4Qr0vLeGOk,471
467
- claude_mpm-4.0.30.dist-info/top_level.txt,sha256=1nUg3FEaBySgm8t-s54jK5zoPnu3_eY6EP6IOlekyHA,11
468
- claude_mpm-4.0.30.dist-info/RECORD,,
463
+ claude_mpm-4.0.32.dist-info/licenses/LICENSE,sha256=lpaivOlPuBZW1ds05uQLJJswy8Rp_HMNieJEbFlqvLk,1072
464
+ claude_mpm-4.0.32.dist-info/METADATA,sha256=h7icJvuwGLeCtfSME71RrTVPP7TsFjMIjuNHaja7XGk,12360
465
+ claude_mpm-4.0.32.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
466
+ claude_mpm-4.0.32.dist-info/entry_points.txt,sha256=FDPZgz8JOvD-6iuXY2l9Zbo9zYVRuE4uz4Qr0vLeGOk,471
467
+ claude_mpm-4.0.32.dist-info/top_level.txt,sha256=1nUg3FEaBySgm8t-s54jK5zoPnu3_eY6EP6IOlekyHA,11
468
+ claude_mpm-4.0.32.dist-info/RECORD,,