claude-mpm 4.9.0__py3-none-any.whl → 4.11.0__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.
@@ -323,6 +323,27 @@ class MCPGatewayOrchestrator:
323
323
  except Exception as e:
324
324
  self.logger.warning(f"Could not load KuzuMemoryService: {e}")
325
325
 
326
+ # MCP Vector Search Service (optional - will auto-install on first use)
327
+ try:
328
+ from .tools.external_mcp_services import MCPVectorSearchService
329
+
330
+ vector_search = MCPVectorSearchService()
331
+ # Try to initialize without interactive prompts during gateway startup
332
+ # This will only succeed if already installed
333
+ init_success = await vector_search.initialize(
334
+ auto_install=False, interactive=False
335
+ )
336
+
337
+ if init_success:
338
+ tools.append(vector_search)
339
+ self.logger.info("MCPVectorSearchService added to built-in tools")
340
+ else:
341
+ self.logger.debug(
342
+ "mcp-vector-search not installed - will be available via auto-install on first use"
343
+ )
344
+ except Exception as e:
345
+ self.logger.debug(f"Could not load MCPVectorSearchService: {e}")
346
+
326
347
  # Ticket tools removed - mcp-ticketer provides ticket functionality
327
348
 
328
349
  if not tools:
@@ -64,21 +64,28 @@ class ExternalMCPService(BaseToolAdapter):
64
64
  execution_time=0.0,
65
65
  )
66
66
 
67
- async def initialize(self) -> bool:
68
- """Initialize the external service."""
67
+ async def initialize(
68
+ self, auto_install: bool = True, interactive: bool = True
69
+ ) -> bool:
70
+ """Initialize the external service.
71
+
72
+ Args:
73
+ auto_install: Whether to automatically install if not found
74
+ interactive: Whether to prompt user for installation preferences
75
+ """
69
76
  try:
70
77
  # Check if package is installed
71
78
  self._is_installed = await self._check_installation()
72
79
 
73
- if not self._is_installed:
74
- self.logger.debug(
75
- f"{self.package_name} not installed - will attempt automatic installation if needed"
80
+ if not self._is_installed and auto_install:
81
+ self.logger.info(
82
+ f"{self.package_name} not installed - attempting installation"
76
83
  )
77
- await self._install_package()
84
+ await self._install_package(interactive=interactive)
78
85
  self._is_installed = await self._check_installation()
79
86
 
80
87
  if not self._is_installed:
81
- self.logger.error(f"Failed to install {self.package_name}")
88
+ self.logger.warning(f"{self.package_name} is not available")
82
89
  return False
83
90
 
84
91
  self.logger.info(f"{self.package_name} is available")
@@ -90,9 +97,21 @@ class ExternalMCPService(BaseToolAdapter):
90
97
 
91
98
  async def _check_installation(self) -> bool:
92
99
  """Check if the package is installed."""
100
+ # First check if importable (faster and more reliable)
101
+ import_name = self.package_name.replace("-", "_")
102
+ try:
103
+ import importlib.util
104
+
105
+ spec = importlib.util.find_spec(import_name)
106
+ if spec is not None:
107
+ return True
108
+ except (ImportError, ModuleNotFoundError, ValueError):
109
+ pass
110
+
111
+ # Fallback: try running as module
93
112
  try:
94
113
  result = subprocess.run(
95
- [sys.executable, "-m", self.package_name.replace("-", "_"), "--help"],
114
+ [sys.executable, "-m", import_name, "--help"],
96
115
  capture_output=True,
97
116
  text=True,
98
117
  timeout=5,
@@ -106,25 +125,133 @@ class ExternalMCPService(BaseToolAdapter):
106
125
  ):
107
126
  return False
108
127
 
109
- async def _install_package(self) -> bool:
110
- """Install the package using pip."""
128
+ async def _install_package(self, interactive: bool = True) -> bool:
129
+ """Install the package using pip or pipx.
130
+
131
+ Args:
132
+ interactive: Whether to prompt user for installation method choice
133
+ """
111
134
  try:
112
- self.logger.info(f"Installing {self.package_name}...")
135
+ install_method = None
136
+
137
+ if interactive:
138
+ # Show user-friendly installation prompt
139
+ print(f"\n⚠️ {self.package_name} not found")
140
+ print("This package enables enhanced functionality (optional).")
141
+ print("\nInstallation options:")
142
+ print("1. Install via pip (recommended for this project)")
143
+ print("2. Install via pipx (isolated, system-wide)")
144
+ print("3. Skip (continue without this package)")
145
+
146
+ try:
147
+ choice = input("\nChoose option (1/2/3) [1]: ").strip() or "1"
148
+ if choice == "1":
149
+ install_method = "pip"
150
+ elif choice == "2":
151
+ install_method = "pipx"
152
+ else:
153
+ self.logger.info(
154
+ f"Skipping installation of {self.package_name}"
155
+ )
156
+ return False
157
+ except (EOFError, KeyboardInterrupt):
158
+ print("\nInstallation cancelled")
159
+ return False
160
+ else:
161
+ # Non-interactive: default to pip
162
+ install_method = "pip"
163
+
164
+ # Install using selected method
165
+ if install_method == "pip":
166
+ return await self._install_via_pip()
167
+ if install_method == "pipx":
168
+ return await self._install_via_pipx()
169
+
170
+ return False
171
+
172
+ except Exception as e:
173
+ self.logger.error(f"Error installing {self.package_name}: {e}")
174
+ return False
175
+
176
+ async def _install_via_pip(self) -> bool:
177
+ """Install package via pip."""
178
+ try:
179
+ print(f"\n📦 Installing {self.package_name} via pip...")
113
180
  result = subprocess.run(
114
181
  [sys.executable, "-m", "pip", "install", self.package_name],
115
182
  capture_output=True,
116
183
  text=True,
117
- timeout=30,
184
+ timeout=120,
118
185
  check=False,
119
186
  )
120
187
 
121
188
  if result.returncode == 0:
122
- self.logger.info(f"Successfully installed {self.package_name}")
189
+ print(f"Successfully installed {self.package_name}")
190
+ self.logger.info(f"Successfully installed {self.package_name} via pip")
123
191
  return True
124
- self.logger.error(f"Failed to install {self.package_name}: {result.stderr}")
192
+
193
+ error_msg = result.stderr.strip() if result.stderr else "Unknown error"
194
+ print(f"✗ Installation failed: {error_msg}")
195
+ self.logger.error(f"Failed to install {self.package_name}: {error_msg}")
125
196
  return False
126
197
 
198
+ except subprocess.TimeoutExpired:
199
+ print("✗ Installation timed out")
200
+ self.logger.error(f"Installation of {self.package_name} timed out")
201
+ return False
202
+ except Exception as e:
203
+ print(f"✗ Installation error: {e}")
204
+ self.logger.error(f"Error installing {self.package_name}: {e}")
205
+ return False
206
+
207
+ async def _install_via_pipx(self) -> bool:
208
+ """Install package via pipx."""
209
+ try:
210
+ # Check if pipx is available
211
+ pipx_check = subprocess.run(
212
+ ["pipx", "--version"],
213
+ capture_output=True,
214
+ text=True,
215
+ timeout=5,
216
+ check=False,
217
+ )
218
+
219
+ if pipx_check.returncode != 0:
220
+ print("✗ pipx is not installed")
221
+ print("Install pipx first: python -m pip install pipx")
222
+ self.logger.error("pipx not available for installation")
223
+ return False
224
+
225
+ print(f"\n📦 Installing {self.package_name} via pipx...")
226
+ result = subprocess.run(
227
+ ["pipx", "install", self.package_name],
228
+ capture_output=True,
229
+ text=True,
230
+ timeout=120,
231
+ check=False,
232
+ )
233
+
234
+ if result.returncode == 0:
235
+ print(f"✓ Successfully installed {self.package_name}")
236
+ self.logger.info(f"Successfully installed {self.package_name} via pipx")
237
+ return True
238
+
239
+ error_msg = result.stderr.strip() if result.stderr else "Unknown error"
240
+ print(f"✗ Installation failed: {error_msg}")
241
+ self.logger.error(f"Failed to install {self.package_name}: {error_msg}")
242
+ return False
243
+
244
+ except FileNotFoundError:
245
+ print("✗ pipx command not found")
246
+ print("Install pipx first: python -m pip install pipx")
247
+ self.logger.error("pipx command not found")
248
+ return False
249
+ except subprocess.TimeoutExpired:
250
+ print("✗ Installation timed out")
251
+ self.logger.error(f"Installation of {self.package_name} timed out")
252
+ return False
127
253
  except Exception as e:
254
+ print(f"✗ Installation error: {e}")
128
255
  self.logger.error(f"Error installing {self.package_name}: {e}")
129
256
  return False
130
257
 
@@ -86,7 +86,7 @@ class StateStorage:
86
86
  return True
87
87
 
88
88
  except Exception as e:
89
- self.logger.error(f"Failed to write JSON to {file_path}: {e}")
89
+ logger.error(f"Failed to write JSON to {file_path}: {e}")
90
90
  self.error_count += 1
91
91
  return False
92
92
 
@@ -106,7 +106,7 @@ class StateStorage:
106
106
  file_path = Path(file_path)
107
107
 
108
108
  if not file_path.exists():
109
- self.logger.debug(f"File not found: {file_path}")
109
+ logger.debug(f"File not found: {file_path}")
110
110
  return None
111
111
 
112
112
  # Auto-detect compression
@@ -125,7 +125,7 @@ class StateStorage:
125
125
  return data
126
126
 
127
127
  except Exception as e:
128
- self.logger.error(f"Failed to read JSON from {file_path}: {e}")
128
+ logger.error(f"Failed to read JSON from {file_path}: {e}")
129
129
  self.error_count += 1
130
130
  return None
131
131
 
@@ -166,7 +166,7 @@ class StateStorage:
166
166
  return True
167
167
 
168
168
  except Exception as e:
169
- self.logger.error(f"Failed to write pickle to {file_path}: {e}")
169
+ logger.error(f"Failed to write pickle to {file_path}: {e}")
170
170
  self.error_count += 1
171
171
  return False
172
172
 
@@ -186,7 +186,7 @@ class StateStorage:
186
186
  file_path = Path(file_path)
187
187
 
188
188
  if not file_path.exists():
189
- self.logger.debug(f"File not found: {file_path}")
189
+ logger.debug(f"File not found: {file_path}")
190
190
  return None
191
191
 
192
192
  # Auto-detect compression
@@ -205,7 +205,7 @@ class StateStorage:
205
205
  return data
206
206
 
207
207
  except Exception as e:
208
- self.logger.error(f"Failed to read pickle from {file_path}: {e}")
208
+ logger.error(f"Failed to read pickle from {file_path}: {e}")
209
209
  self.error_count += 1
210
210
  return None
211
211
 
@@ -262,7 +262,7 @@ class StateStorage:
262
262
  Path(temp_path).replace(file_path)
263
263
 
264
264
  self.write_count += 1
265
- self.logger.debug(f"Atomic write successful: {file_path}")
265
+ logger.debug(f"Atomic write successful: {file_path}")
266
266
  return True
267
267
 
268
268
  finally:
@@ -271,7 +271,7 @@ class StateStorage:
271
271
  Path(temp_path).unlink()
272
272
 
273
273
  except Exception as e:
274
- self.logger.error(f"Atomic write failed for {file_path}: {e}")
274
+ logger.error(f"Atomic write failed for {file_path}: {e}")
275
275
  self.error_count += 1
276
276
  return False
277
277
 
@@ -339,7 +339,7 @@ class StateStorage:
339
339
  f.write(checksum)
340
340
 
341
341
  except Exception as e:
342
- self.logger.warning(f"Could not add checksum: {e}")
342
+ logger.warning(f"Could not add checksum: {e}")
343
343
 
344
344
  def verify_checksum(self, file_path: Union[str, Path]) -> bool:
345
345
  """Verify file checksum for integrity.
@@ -370,13 +370,13 @@ class StateStorage:
370
370
  actual = hasher.hexdigest()
371
371
 
372
372
  if actual != expected:
373
- self.logger.error(f"Checksum mismatch for {file_path}")
373
+ logger.error(f"Checksum mismatch for {file_path}")
374
374
  return False
375
375
 
376
376
  return True
377
377
 
378
378
  except Exception as e:
379
- self.logger.warning(f"Could not verify checksum: {e}")
379
+ logger.warning(f"Could not verify checksum: {e}")
380
380
  return True # Assume valid if can't verify
381
381
 
382
382
  def cleanup_temp_files(self) -> int:
@@ -396,7 +396,7 @@ class StateStorage:
396
396
  if age > 3600:
397
397
  temp_file.unlink()
398
398
  cleaned += 1
399
- self.logger.debug(f"Cleaned up temp file: {temp_file}")
399
+ logger.debug(f"Cleaned up temp file: {temp_file}")
400
400
  except Exception:
401
401
  pass
402
402
 
@@ -408,12 +408,12 @@ class StateStorage:
408
408
  cleaned += 1
409
409
 
410
410
  if cleaned > 0:
411
- self.logger.info(f"Cleaned up {cleaned} temporary files")
411
+ logger.info(f"Cleaned up {cleaned} temporary files")
412
412
 
413
413
  return cleaned
414
414
 
415
415
  except Exception as e:
416
- self.logger.error(f"Error cleaning up temp files: {e}")
416
+ logger.error(f"Error cleaning up temp files: {e}")
417
417
  return 0
418
418
 
419
419
  def get_storage_info(self) -> Dict[str, Any]:
@@ -447,7 +447,7 @@ class StateStorage:
447
447
  }
448
448
 
449
449
  except Exception as e:
450
- self.logger.error(f"Error getting storage info: {e}")
450
+ logger.error(f"Error getting storage info: {e}")
451
451
  return {"storage_directory": str(self.storage_dir), "error": str(e)}
452
452
 
453
453
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: claude-mpm
3
- Version: 4.9.0
3
+ Version: 4.11.0
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
@@ -160,7 +160,8 @@ A powerful orchestration framework for **Claude Code (CLI)** that enables multi-
160
160
  - 🧠 **Persistent Knowledge System**: Project-specific kuzu-memory integration for intelligent context retention
161
161
  - 🔄 **Session Management**: Resume previous sessions with `--resume`
162
162
  - 📊 **Real-Time Monitoring**: Live dashboard with `--monitor` flag
163
- - 🔌 **Optional MCP Services**: mcp-vector-search and kuzu-memory with automatic fallback installation
163
+ - 🔌 **Smart MCP Services**: Interactive auto-install for mcp-vector-search on first use (pip/pipx choice)
164
+ - 🔍 **Semantic Code Search**: Optional vector search with graceful fallback to grep/glob
164
165
  - 📁 **Multi-Project Support**: Per-session working directories with persistent knowledge graphs
165
166
  - 🔍 **Git Integration**: View diffs and track changes across projects
166
167
  - 🎯 **Smart Task Orchestration**: PM agent intelligently routes work to specialists
@@ -197,7 +198,8 @@ claude-mpm mcp-pipx-config
197
198
  - `[monitor]` - Full monitoring dashboard with Socket.IO and async web server components
198
199
  - **Combine both**: Use `"claude-mpm[mcp,monitor]"` to install all features
199
200
  - **Note**: kuzu-memory is now a required dependency, always included with Claude MPM
200
- - Without optional MCP dependencies, other MCP services auto-install on first use via pipx
201
+ - **Auto-Install**: mcp-vector-search offers interactive installation on first use (pip/pipx choice)
202
+ - Without pre-installed MCP dependencies, services install on-demand with user confirmation
201
203
 
202
204
  **🎉 Pipx Support Now Fully Functional!** Recent improvements ensure complete compatibility:
203
205
  - ✅ Socket.IO daemon script path resolution (fixed)
@@ -216,6 +218,11 @@ claude-mpm
216
218
  # Start with monitoring dashboard
217
219
  claude-mpm run --monitor
218
220
 
221
+ # Use semantic code search (auto-installs mcp-vector-search on first use)
222
+ claude-mpm search "authentication logic"
223
+ # or inside Claude Code session:
224
+ /mpm-search "authentication logic"
225
+
219
226
  # Use MCP Gateway for external tool integration
220
227
  claude-mpm mcp
221
228
 
@@ -1,5 +1,5 @@
1
1
  claude_mpm/BUILD_NUMBER,sha256=9JfxhnDtr-8l3kCP2U5TVXSErptHoga8m7XA8zqgGOc,4
2
- claude_mpm/VERSION,sha256=ucY14U7h_QVbv4d5sg77hbXv8X1m3zQsRzVoMpc3MXY,6
2
+ claude_mpm/VERSION,sha256=FFRZhOvxPjL4clpLdj7K74TxFIkhB1BHeUD9jed261o,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=sLjJF6Kw7H4V9WWeaEYltM-77TgXqzEMX5vx4ukM5-0,5977
@@ -54,7 +54,7 @@ claude_mpm/agents/templates/python_engineer.json,sha256=SeTvI1EXS-RTIJzVHX0zu0FS
54
54
  claude_mpm/agents/templates/qa.json,sha256=bccjpuC93a7msGei3LKsCe88UiFMQzk1W40TvEYIHOg,10661
55
55
  claude_mpm/agents/templates/react_engineer.json,sha256=ihmqRAgiU81UVpw3ToSHvUigEZ7MMpoPhUbyXSmfbAo,13151
56
56
  claude_mpm/agents/templates/refactoring_engineer.json,sha256=qmhZdl4aXNyQEjZ-yieSa2NfEaPPi7Z4bYUZ4ohWJiI,12130
57
- claude_mpm/agents/templates/research.json,sha256=0i0FsMT13cQvynOXdtcWuVMrpFtV560Grr2N3mXUOvI,12406
57
+ claude_mpm/agents/templates/research.json,sha256=-U7cDwH0kiffMSvrAuIe_AiA6OmWQbI5MLNjgvUhmhc,14336
58
58
  claude_mpm/agents/templates/ruby-engineer.json,sha256=FDdEGTbXzzAwbeucXH9Ve91mCnD9fGh3J26zbrKi9qs,12412
59
59
  claude_mpm/agents/templates/rust_engineer.json,sha256=0HKDrRGJxyvO5GWqby8d45Trw9IaAoJkeX5ZIkN10xE,12317
60
60
  claude_mpm/agents/templates/security.json,sha256=ekwiFj-TzVDTEj70QfV5Oix1x7zAeCdl-zZ8-QGJIXg,24556
@@ -100,10 +100,12 @@ claude_mpm/cli/commands/mcp_setup_external.py,sha256=hfBHkaioNa0JRDhahNEc8agyrUw
100
100
  claude_mpm/cli/commands/mcp_tool_commands.py,sha256=q17GzlFT3JiLTrDqwPO2tz1-fKmPO5QU449syTnKTz4,1283
101
101
  claude_mpm/cli/commands/memory.py,sha256=O4T5HGL-Ob_QPt2dZHQvoOrVohnaDKrBjyngq1Mcv1w,26185
102
102
  claude_mpm/cli/commands/monitor.py,sha256=Fjb68hf3dEwTFek2LV8Nh6iU0qEkY7qYlOn32IwNaNg,9566
103
- claude_mpm/cli/commands/mpm_init.py,sha256=OtdJMsFn7E9Ck56wWPrCvqw6j5dsN_VI098C3bteitc,63888
104
- claude_mpm/cli/commands/mpm_init_handler.py,sha256=b1CSwZYJ89wMorKzPOKS-RVxOKR2kT9yv9KQLvKkd2U,3532
103
+ claude_mpm/cli/commands/mpm_init.py,sha256=dufJ9WQzS5mbEdpSHqOWTk2rBmSO8xkxSJ1D8gsgzZk,72451
104
+ claude_mpm/cli/commands/mpm_init_handler.py,sha256=M8S2mRl-wyjM8biP-hRl5V1UYOtYxDyD2KQTAhSw8mM,4869
105
105
  claude_mpm/cli/commands/run.py,sha256=PB2H55piOPTy4yo4OBgbUCjMlcz9K79wbwpxQVc9m5Q,48225
106
- claude_mpm/cli/commands/search.py,sha256=_0qbUnop8v758MHsB0fAop8FVxwygD59tec_-iN7pLE,9806
106
+ claude_mpm/cli/commands/search.py,sha256=alv6udvKcn-xkqeBlLuPRvfSDV1yxEX4n9mjjRT5uLM,16581
107
+ claude_mpm/cli/commands/session_pause_manager.py,sha256=YCUrxOdsoFRKCqlAZJVk6x1HYcece8xqGTl7eCiPx9A,13123
108
+ claude_mpm/cli/commands/session_resume_manager.py,sha256=qWFQv3eLhorCln0rtgM8FOGjFlfFNs5c8ctYehgiYqI,18087
107
109
  claude_mpm/cli/commands/tickets.py,sha256=kl2dklTBnG3Y4jUUJ_PcEVsTx4CtVJfkGWboWBx_mQM,21234
108
110
  claude_mpm/cli/commands/uninstall.py,sha256=KGlVG6veEs1efLVjrZ3wSty7e1zVR9wpt-VXQA1RzWw,5945
109
111
  claude_mpm/cli/commands/upgrade.py,sha256=NYMVONNlj78WHoQ6eyVInroE95AeQxUY2_TpjYFTdYE,5409
@@ -123,7 +125,7 @@ claude_mpm/cli/parsers/debug_parser.py,sha256=F7MZdmiXiPfiIPMv21ZUqB2cMT8Ho1LDmp
123
125
  claude_mpm/cli/parsers/mcp_parser.py,sha256=2j6ULhdu55Z2k_-Gu2QxIsFoTQFbDCEMSGePXSuPoQQ,6532
124
126
  claude_mpm/cli/parsers/memory_parser.py,sha256=ZwCDxJEgp-w03L-1tZsWTgisiwamP42s424bA5bvDJc,4760
125
127
  claude_mpm/cli/parsers/monitor_parser.py,sha256=PeoznSi_5Bw6THK_Espl8M20o6dKvvBSmFzAbovkaFQ,4920
126
- claude_mpm/cli/parsers/mpm_init_parser.py,sha256=aGMwrHs7acB61sNDI0M7gf23yGDV4Q7b7iX7XnWC0yQ,7658
128
+ claude_mpm/cli/parsers/mpm_init_parser.py,sha256=1FpjO6-5q0Fqgd2w3RvGVDX5tW8iG5zGJhYq3GibvJI,9531
127
129
  claude_mpm/cli/parsers/run_parser.py,sha256=cs34qNonFZG8uYxTYEt0rXi2LcPz3pw8D8hxiywih6w,4927
128
130
  claude_mpm/cli/parsers/search_parser.py,sha256=L8-65kndg-zutSKpzj-eCvTNkeySCZ-WlSHdhk7pEak,6916
129
131
  claude_mpm/cli/parsers/tickets_parser.py,sha256=FYl-VNH7PrZzfZUCcjnf6F7g6JXnL8YDxwrmR5svIcg,6966
@@ -141,7 +143,7 @@ claude_mpm/commands/mpm-agents.md,sha256=JnYPJ-eWvIEEtiCB6iPu182P2xDBRvU3ArVXQ7h
141
143
  claude_mpm/commands/mpm-config.md,sha256=79Eb-srRpEVV3HCHDHZc8SKec6_LVP6HbXDEVkZKLgw,2929
142
144
  claude_mpm/commands/mpm-doctor.md,sha256=ut5LhFKVRw-2ecjMSPsnaTiRuFXa6Q9t-Wgl3CCnQvk,590
143
145
  claude_mpm/commands/mpm-help.md,sha256=zfhpE0Fd-wW5zWmYYAMRMT-xYK8saqbw-HXRD7csJHI,2850
144
- claude_mpm/commands/mpm-init.md,sha256=5Jqb99qqJ_hQ_41lGmyTyDUhm7V7wQiLCYvksd3tZEo,10696
146
+ claude_mpm/commands/mpm-init.md,sha256=WcEj7r4HyTHQc7-NVpYlDNOtZrlMs4VH-vm3K1X7At8,13329
145
147
  claude_mpm/commands/mpm-monitor.md,sha256=onTHf9Yac1KkdZdENtY2Q5jyw0A-vZLYgoKkPCtZLUY,12193
146
148
  claude_mpm/commands/mpm-organize.md,sha256=T-ysjhwgfW9irjUj02vuY_1jeMdabO_zxcShyjmqsiM,10153
147
149
  claude_mpm/commands/mpm-status.md,sha256=oaM4ybL4ffp55nkT9F0mp_5H4tF-wX9mbqK-LEKEqUU,1919
@@ -632,7 +634,7 @@ claude_mpm/services/infrastructure/monitoring/resources.py,sha256=7Mt9zvNAYGf7OT
632
634
  claude_mpm/services/infrastructure/monitoring/service.py,sha256=guYB6rJtU18T2kPhZbKKg85l96lm2f7XVtPnBt1O3So,12613
633
635
  claude_mpm/services/mcp_gateway/__init__.py,sha256=4fiMsd7i2QzZpEXCUeo0Vk_CXRi35TE94gPvwyuz2es,5099
634
636
  claude_mpm/services/mcp_gateway/auto_configure.py,sha256=JNos01nGb2qXACXNHC-UkLccqQ-p8GFUElXqBLUQl7A,12163
635
- claude_mpm/services/mcp_gateway/main.py,sha256=lczjLqieS5eHhwWO5VXlqURDLAgXgOg6i-724oa590A,18189
637
+ claude_mpm/services/mcp_gateway/main.py,sha256=1e_-NGwVNr8cFtwWC_2NhZS-EYwC--MSfiZTx15x3ao,19121
636
638
  claude_mpm/services/mcp_gateway/config/__init__.py,sha256=MpFgHfaT3dQz5QyEdpfbulD6tXUOY325LkovAYsdkAg,386
637
639
  claude_mpm/services/mcp_gateway/config/config_loader.py,sha256=jM0LCQGnyAezQHLqfLWtPn5P3GpGMxGltKlTIKCL24M,9427
638
640
  claude_mpm/services/mcp_gateway/config/config_schema.py,sha256=eSPyHmYJWBpGxJ8l0vBjEGod_PEnbGyHi3fcNLS4mH0,9475
@@ -654,7 +656,7 @@ claude_mpm/services/mcp_gateway/server/stdio_server.py,sha256=k_VHLZ17zdZzP6XOg6
654
656
  claude_mpm/services/mcp_gateway/tools/__init__.py,sha256=Ga0kbvNOi8peBRZk5MUnO5bo3jWDCpHFko7mO21Vix4,754
655
657
  claude_mpm/services/mcp_gateway/tools/base_adapter.py,sha256=na1MdyBCtVmKzgIcFJ5MuAUJ1LJrtA4yxkuqLnejiD8,16029
656
658
  claude_mpm/services/mcp_gateway/tools/document_summarizer.py,sha256=F86qgDIFW2UXljGV8Tx9CapypqnXFNu3qFvi8XHlcZg,28223
657
- claude_mpm/services/mcp_gateway/tools/external_mcp_services.py,sha256=PCw6egI7Vy7I-2l9ya9BZGusOdnQ3bY0uIJVSVnY_YA,18614
659
+ claude_mpm/services/mcp_gateway/tools/external_mcp_services.py,sha256=PSnes4mVOyAdqJ5o_YU9lmyTiXeXwXzE_x1pQeadpbs,23635
658
660
  claude_mpm/services/mcp_gateway/tools/health_check_tool.py,sha256=SIrGt2uZGR4EGsH2_0UgkmHUV895M8zq9suNkRSteRA,16457
659
661
  claude_mpm/services/mcp_gateway/tools/hello_world.py,sha256=L45ph8b0iLPpksrkf0ELrfl6CwVD3W3YLigwUKjIOoY,20291
660
662
  claude_mpm/services/mcp_gateway/tools/kuzu_memory_service.py,sha256=qc9vYJtN3OYXqb-aXZpkx3FtkM9ivUm9AcWKUgeGdG4,17745
@@ -766,7 +768,7 @@ claude_mpm/services/version_control/version_parser.py,sha256=DbNncYZKKy9--ZUCO9g
766
768
  claude_mpm/services/visualization/__init__.py,sha256=cTtWxRi07rSLXQKVZa7SKZsYfj6nRouw7HVO85Towfg,401
767
769
  claude_mpm/services/visualization/mermaid_generator.py,sha256=6QGgXtMg_N9rKeRn8wYs3IxuWGKdDVAwFMFWKfIw9s4,34277
768
770
  claude_mpm/storage/__init__.py,sha256=DXnmee6iGqC6ctFLW7_Ty1cVCjYDFuCMkwO4EV0i25k,274
769
- claude_mpm/storage/state_storage.py,sha256=YCkqifFbv-lm6zzb53WOoArKJDVsLlSgvAM3FoRwhz8,16886
771
+ claude_mpm/storage/state_storage.py,sha256=6jEZ4z35MjtAuTTUdqETTy4_dbMMK8EN_C2kVa62PjY,16811
770
772
  claude_mpm/tools/__init__.py,sha256=T3GuCYNAHtjVcKCeivY674PaDm48WX96AriQfTKUknY,347
771
773
  claude_mpm/tools/__main__.py,sha256=MtpJoWA2HEmRE_XDsSjjto6DND7Ft0MZoiY4ivNHh5A,5714
772
774
  claude_mpm/tools/code_tree_analyzer.py,sha256=BBkEuSVHd_P1jBlxpBfzsLqUyT01rid3r2_cQCBeGyQ,64818
@@ -797,9 +799,9 @@ claude_mpm/utils/subprocess_utils.py,sha256=D0izRT8anjiUb_JG72zlJR_JAw1cDkb7kalN
797
799
  claude_mpm/validation/__init__.py,sha256=YZhwE3mhit-lslvRLuwfX82xJ_k4haZeKmh4IWaVwtk,156
798
800
  claude_mpm/validation/agent_validator.py,sha256=GprtAvu80VyMXcKGsK_VhYiXWA6BjKHv7O6HKx0AB9w,20917
799
801
  claude_mpm/validation/frontmatter_validator.py,sha256=YpJlYNNYcV8u6hIOi3_jaRsDnzhbcQpjCBE6eyBKaFY,7076
800
- claude_mpm-4.9.0.dist-info/licenses/LICENSE,sha256=lpaivOlPuBZW1ds05uQLJJswy8Rp_HMNieJEbFlqvLk,1072
801
- claude_mpm-4.9.0.dist-info/METADATA,sha256=spXmDr3uBGSclzDSE5Clu2uTb4tQJ1bsMHcOpcf8r3Q,17584
802
- claude_mpm-4.9.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
803
- claude_mpm-4.9.0.dist-info/entry_points.txt,sha256=Vlw3GNi-OtTpKSrez04iNrPmxNxYDpIWxmJCxiZ5Tx8,526
804
- claude_mpm-4.9.0.dist-info/top_level.txt,sha256=1nUg3FEaBySgm8t-s54jK5zoPnu3_eY6EP6IOlekyHA,11
805
- claude_mpm-4.9.0.dist-info/RECORD,,
802
+ claude_mpm-4.11.0.dist-info/licenses/LICENSE,sha256=lpaivOlPuBZW1ds05uQLJJswy8Rp_HMNieJEbFlqvLk,1072
803
+ claude_mpm-4.11.0.dist-info/METADATA,sha256=MEj3DXeNTTBP_5amuoK5rdIplBHmiEwKSSRJvteORTc,17967
804
+ claude_mpm-4.11.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
805
+ claude_mpm-4.11.0.dist-info/entry_points.txt,sha256=Vlw3GNi-OtTpKSrez04iNrPmxNxYDpIWxmJCxiZ5Tx8,526
806
+ claude_mpm-4.11.0.dist-info/top_level.txt,sha256=1nUg3FEaBySgm8t-s54jK5zoPnu3_eY6EP6IOlekyHA,11
807
+ claude_mpm-4.11.0.dist-info/RECORD,,