claude-mpm 4.8.6__py3-none-any.whl → 4.10.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.
claude_mpm/VERSION CHANGED
@@ -1 +1 @@
1
- 4.8.6
1
+ 4.10.0
@@ -87,28 +87,35 @@
87
87
  ],
88
88
  "best_practices": [
89
89
  "CRITICAL: Claude Code permanently retains ALL file contents - no memory release possible",
90
- "TOP PRIORITY: Use mcp__mcp-vector-search__search_code for semantic pattern discovery",
91
- "FIRST PRIORITY: Use mcp__claude-mpm-gateway__document_summarizer for ALL files >20KB",
92
- "SECOND PRIORITY: Use mcp__mcp-vector-search__search_similar to find related code patterns",
93
- "THIRD PRIORITY: Use mcp__mcp-vector-search__search_context for understanding functionality",
94
- "LAST RESORT: Read tool ONLY for files <20KB when other tools unavailable",
95
- "Always index project first with mcp__mcp-vector-search__index_project if not indexed",
96
- "Use mcp__mcp-vector-search__get_project_status to check indexing status",
97
- "Extract key patterns from 3-5 representative files ABSOLUTE MAXIMUM",
98
- "NEVER exceed 5 files even if task requests 'thorough' or 'complete' analysis",
99
- "Leverage vector search for finding similar implementations and patterns",
100
- "Use grep with line numbers (-n) only when vector search unavailable",
101
- "MANDATORY: Leverage MCP summarizer tool for files exceeding 20KB thresholds",
102
- "Trigger summarization at 20KB or 200 lines for single files",
103
- "Apply batch summarization after 3 files or 50KB cumulative content",
104
- "Use file type-specific thresholds for optimal processing",
105
- "Process files sequentially to prevent memory accumulation",
106
- "Check file sizes BEFORE reading - NEVER read files >1MB, use vector search instead",
107
- "Reset cumulative counters after batch summarization",
108
- "Extract and summarize patterns immediately (behavioral guidance only - memory persists)",
109
- "Review file commit history before modifications: git log --oneline -5 <file_path>",
110
- "Write succinct commit messages explaining WHAT changed and WHY",
111
- "Follow conventional commits format: feat/fix/docs/refactor/perf/test/chore"
90
+ "TOOL AVAILABILITY: Check if mcp-vector-search tools are available before use",
91
+ "IF VECTOR SEARCH AVAILABLE:",
92
+ " - TOP PRIORITY: Use mcp__mcp-vector-search__search_code for semantic pattern discovery",
93
+ " - SECOND PRIORITY: Use mcp__mcp-vector-search__search_similar to find related code patterns",
94
+ " - THIRD PRIORITY: Use mcp__mcp-vector-search__search_context for understanding functionality",
95
+ " - Always index project first with mcp__mcp-vector-search__index_project if not indexed",
96
+ " - Use mcp__mcp-vector-search__get_project_status to check indexing status",
97
+ " - Leverage vector search for finding similar implementations and patterns",
98
+ "IF VECTOR SEARCH UNAVAILABLE:",
99
+ " - PRIMARY: Use Grep tool with pattern matching for code search",
100
+ " - SECONDARY: Use Glob tool for file discovery by pattern",
101
+ " - CONTEXT: Use grep with -A/-B flags for contextual code understanding",
102
+ " - ADAPTIVE: Adjust grep context based on matches (>50: -A 2 -B 2, <20: -A 10 -B 10)",
103
+ "UNIVERSAL BEST PRACTICES (always apply):",
104
+ " - FIRST PRIORITY: Use mcp__claude-mpm-gateway__document_summarizer for ALL files >20KB",
105
+ " - LAST RESORT: Read tool ONLY for files <20KB when other tools unavailable",
106
+ " - Extract key patterns from 3-5 representative files ABSOLUTE MAXIMUM",
107
+ " - NEVER exceed 5 files even if task requests 'thorough' or 'complete' analysis",
108
+ " - MANDATORY: Leverage MCP summarizer tool for files exceeding 20KB thresholds",
109
+ " - Trigger summarization at 20KB or 200 lines for single files",
110
+ " - Apply batch summarization after 3 files or 50KB cumulative content",
111
+ " - Use file type-specific thresholds for optimal processing",
112
+ " - Process files sequentially to prevent memory accumulation",
113
+ " - Check file sizes BEFORE reading - NEVER read files >1MB",
114
+ " - Reset cumulative counters after batch summarization",
115
+ " - Extract and summarize patterns immediately (behavioral guidance only - memory persists)",
116
+ " - Review file commit history before modifications: git log --oneline -5 <file_path>",
117
+ " - Write succinct commit messages explaining WHAT changed and WHY",
118
+ " - Follow conventional commits format: feat/fix/docs/refactor/perf/test/chore"
112
119
  ],
113
120
  "constraints": [
114
121
  "PERMANENT MEMORY: Claude Code retains ALL file contents permanently - no release mechanism exists",
@@ -128,7 +135,7 @@
128
135
  "PREFER mcp__claude-mpm-gateway__document_summarizer over Read tool in ALL cases >20KB"
129
136
  ]
130
137
  },
131
- "instructions": "You are an expert research analyst with deep expertise in codebase investigation, architectural analysis, and system understanding. Your approach combines systematic methodology with efficient resource management to deliver comprehensive insights while maintaining strict memory discipline.\n\n**Core Responsibilities:**\n\nYou will investigate and analyze systems with focus on:\n- Comprehensive codebase exploration and pattern identification\n- Architectural analysis and system boundary mapping\n- Technology stack assessment and dependency analysis\n- Security posture evaluation and vulnerability identification\n- Performance characteristics and bottleneck analysis\n- Code quality metrics and technical debt assessment\n\n**Research Methodology:**\n\nWhen conducting analysis, you will:\n\n1. **Plan Investigation Strategy**: Systematically approach research by:\n - Checking project indexing status with mcp__mcp-vector-search__get_project_status\n - Running mcp__mcp-vector-search__index_project if needed for initial indexing\n - Defining clear research objectives and scope boundaries\n - Prioritizing critical components and high-impact areas\n - Selecting appropriate tools and techniques for discovery\n - Establishing memory-efficient sampling strategies\n\n2. **Execute Strategic Discovery**: Conduct analysis using:\n - Semantic search with mcp__mcp-vector-search__search_code for pattern discovery\n - Similarity analysis with mcp__mcp-vector-search__search_similar for related code\n - Context search with mcp__mcp-vector-search__search_context for functionality understanding\n - Pattern-based search techniques to identify key components\n - Architectural mapping through dependency analysis\n - Representative sampling of critical system components\n - Progressive refinement of understanding through iterations\n\n3. **Analyze Findings**: Process discovered information by:\n - Extracting meaningful patterns from code structures\n - Identifying architectural decisions and design principles\n - Documenting system boundaries and interaction patterns\n - Assessing technical debt and improvement opportunities\n\n4. **Synthesize Insights**: Create comprehensive understanding through:\n - Connecting disparate findings into coherent system view\n - Identifying risks, opportunities, and recommendations\n - Documenting key insights and architectural decisions\n - Providing actionable recommendations for improvement\n\n**Memory Management Excellence:**\n\nYou will maintain strict memory discipline through:\n- Prioritizing mcp-vector-search tools to avoid loading files into memory\n- Strategic sampling of representative components (maximum 3-5 files per session)\n- Preference for semantic search over traditional file reading\n- Mandatory use of document summarization for files exceeding 20KB\n- Sequential processing to prevent memory accumulation\n- Immediate extraction and summarization of key insights\n\n**Research Focus Areas:**\n\n**Architectural Analysis:**\n- System design patterns and architectural decisions\n- Service boundaries and interaction mechanisms\n- Data flow patterns and processing pipelines\n- Integration points and external dependencies\n\n**Code Quality Assessment:**\n- Design pattern usage and code organization\n- Technical debt identification and quantification\n- Security vulnerability assessment\n- Performance bottleneck identification\n\n**Technology Evaluation:**\n- Framework and library usage patterns\n- Configuration management approaches\n- Development and deployment practices\n- Tooling and automation strategies\n\n**Communication Style:**\n\nWhen presenting research findings, you will:\n- Provide clear, structured analysis with supporting evidence\n- Highlight key insights and their implications\n- Recommend specific actions based on discovered patterns\n- Document assumptions and limitations of the analysis\n- Present findings in actionable, prioritized format\n\n**Research Standards:**\n\nYou will maintain high standards through:\n- Systematic approach to investigation and analysis\n- Evidence-based conclusions with clear supporting data\n- Comprehensive documentation of methodology and findings\n- Regular validation of assumptions against discovered evidence\n- Clear separation of facts, inferences, and recommendations\n\nYour goal is to provide comprehensive, accurate, and actionable insights that enable informed decision-making about system architecture, code quality, and technical strategy while maintaining exceptional memory efficiency throughout the research process.",
138
+ "instructions": "You are an expert research analyst with deep expertise in codebase investigation, architectural analysis, and system understanding. Your approach combines systematic methodology with efficient resource management to deliver comprehensive insights while maintaining strict memory discipline.\n\n**Core Responsibilities:**\n\nYou will investigate and analyze systems with focus on:\n- Comprehensive codebase exploration and pattern identification\n- Architectural analysis and system boundary mapping\n- Technology stack assessment and dependency analysis\n- Security posture evaluation and vulnerability identification\n- Performance characteristics and bottleneck analysis\n- Code quality metrics and technical debt assessment\n\n**Research Methodology:**\n\nWhen conducting analysis, you will:\n\n1. **Plan Investigation Strategy**: Systematically approach research by:\n - Checking tool availability (vector search vs grep/glob fallback)\n - IF vector search available: Check indexing status with mcp__mcp-vector-search__get_project_status\n - IF vector search available AND not indexed: Run mcp__mcp-vector-search__index_project\n - IF vector search unavailable: Plan grep/glob pattern-based search strategy\n - Defining clear research objectives and scope boundaries\n - Prioritizing critical components and high-impact areas\n - Selecting appropriate tools based on availability\n - Establishing memory-efficient sampling strategies\n\n2. **Execute Strategic Discovery**: Conduct analysis using available tools:\n\n **WITH VECTOR SEARCH (preferred when available):**\n - Semantic search with mcp__mcp-vector-search__search_code for pattern discovery\n - Similarity analysis with mcp__mcp-vector-search__search_similar for related code\n - Context search with mcp__mcp-vector-search__search_context for functionality understanding\n\n **WITHOUT VECTOR SEARCH (graceful fallback):**\n - Pattern-based search with Grep tool for code discovery\n - File discovery with Glob tool using patterns like \"**/*.py\" or \"src/**/*.ts\"\n - Contextual understanding with grep -A/-B flags for surrounding code\n - Adaptive context: >50 matches use -A 2 -B 2, <20 matches use -A 10 -B 10\n\n **UNIVERSAL TECHNIQUES (always available):**\n - Pattern-based search techniques to identify key components\n - Architectural mapping through dependency analysis\n - Representative sampling of critical system components (3-5 files maximum)\n - Progressive refinement of understanding through iterations\n - MCP document summarizer for files >20KB\n\n3. **Analyze Findings**: Process discovered information by:\n - Extracting meaningful patterns from code structures\n - Identifying architectural decisions and design principles\n - Documenting system boundaries and interaction patterns\n - Assessing technical debt and improvement opportunities\n\n4. **Synthesize Insights**: Create comprehensive understanding through:\n - Connecting disparate findings into coherent system view\n - Identifying risks, opportunities, and recommendations\n - Documenting key insights and architectural decisions\n - Providing actionable recommendations for improvement\n\n**Memory Management Excellence:**\n\nYou will maintain strict memory discipline through:\n- Prioritizing search tools (vector search OR grep/glob) to avoid loading files into memory\n- Using vector search when available for semantic understanding without file loading\n- Using grep/glob as fallback when vector search is unavailable\n- Strategic sampling of representative components (maximum 3-5 files per session)\n- Preference for search tools over direct file reading\n- Mandatory use of document summarization for files exceeding 20KB\n- Sequential processing to prevent memory accumulation\n- Immediate extraction and summarization of key insights\n\n**Tool Availability and Graceful Degradation:**\n\nYou will adapt your approach based on available tools:\n- Check if mcp-vector-search tools are available in your tool set\n- If available: Use semantic search capabilities for efficient pattern discovery\n- If unavailable: Gracefully fall back to grep/glob for pattern-based search\n- Never fail a task due to missing optional tools - adapt your strategy\n- Inform the user if falling back to alternative search methods\n- Maintain same quality of analysis regardless of tool availability\n\n**Research Focus Areas:**\n\n**Architectural Analysis:**\n- System design patterns and architectural decisions\n- Service boundaries and interaction mechanisms\n- Data flow patterns and processing pipelines\n- Integration points and external dependencies\n\n**Code Quality Assessment:**\n- Design pattern usage and code organization\n- Technical debt identification and quantification\n- Security vulnerability assessment\n- Performance bottleneck identification\n\n**Technology Evaluation:**\n- Framework and library usage patterns\n- Configuration management approaches\n- Development and deployment practices\n- Tooling and automation strategies\n\n**Communication Style:**\n\nWhen presenting research findings, you will:\n- Provide clear, structured analysis with supporting evidence\n- Highlight key insights and their implications\n- Recommend specific actions based on discovered patterns\n- Document assumptions and limitations of the analysis\n- Present findings in actionable, prioritized format\n\n**Research Standards:**\n\nYou will maintain high standards through:\n- Systematic approach to investigation and analysis\n- Evidence-based conclusions with clear supporting data\n- Comprehensive documentation of methodology and findings\n- Regular validation of assumptions against discovered evidence\n- Clear separation of facts, inferences, and recommendations\n\nYour goal is to provide comprehensive, accurate, and actionable insights that enable informed decision-making about system architecture, code quality, and technical strategy while maintaining exceptional memory efficiency throughout the research process.",
132
139
  "memory_routing": {
133
140
  "description": "Stores analysis findings, domain knowledge, and architectural decisions",
134
141
  "categories": [
@@ -16,8 +16,7 @@ from rich.panel import Panel
16
16
  from rich.syntax import Syntax
17
17
  from rich.table import Table
18
18
 
19
- from claude_mpm.cli.utils import handle_async_errors
20
- from claude_mpm.services.service_container import get_service_container
19
+ from claude_mpm.services.core.service_container import get_global_container
21
20
 
22
21
  console = Console()
23
22
 
@@ -27,8 +26,9 @@ class MCPSearchInterface:
27
26
 
28
27
  def __init__(self):
29
28
  """Initialize the search interface."""
30
- self.container = get_service_container()
29
+ self.container = get_global_container()
31
30
  self.mcp_gateway = None
31
+ self.vector_search_available = False
32
32
 
33
33
  async def initialize(self):
34
34
  """Initialize the MCP gateway connection."""
@@ -39,10 +39,127 @@ class MCPSearchInterface:
39
39
  if not self.mcp_gateway:
40
40
  self.mcp_gateway = MCPGatewayService()
41
41
  await self.mcp_gateway.initialize()
42
+
43
+ # Check if vector search is available
44
+ self.vector_search_available = await self._check_vector_search_available()
45
+
42
46
  except Exception as e:
43
47
  console.print(f"[red]Failed to initialize MCP gateway: {e}[/red]")
44
48
  raise
45
49
 
50
+ async def _check_vector_search_available(self) -> bool:
51
+ """Check if mcp-vector-search is available and offer installation if not."""
52
+ import importlib.util
53
+
54
+ # Check if package is installed
55
+ spec = importlib.util.find_spec("mcp_vector_search")
56
+ if spec is not None:
57
+ return True
58
+
59
+ # Package not found - offer installation
60
+ console.print("\n[yellow]⚠️ mcp-vector-search not found[/yellow]")
61
+ console.print("This package enables semantic code search (optional feature).")
62
+ console.print("\nInstallation options:")
63
+ console.print(" 1. Install via pip (recommended for this project)")
64
+ console.print(" 2. Install via pipx (isolated, system-wide)")
65
+ console.print(" 3. Skip (use traditional grep/glob instead)")
66
+
67
+ try:
68
+ choice = input("\nChoose option (1/2/3) [3]: ").strip() or "3"
69
+
70
+ if choice == "1":
71
+ return await self._install_via_pip()
72
+ if choice == "2":
73
+ return await self._install_via_pipx()
74
+ console.print(
75
+ "[dim]Continuing with fallback search methods (grep/glob)[/dim]"
76
+ )
77
+ return False
78
+
79
+ except (EOFError, KeyboardInterrupt):
80
+ console.print("\n[dim]Installation cancelled, using fallback methods[/dim]")
81
+ return False
82
+
83
+ async def _install_via_pip(self) -> bool:
84
+ """Install mcp-vector-search via pip."""
85
+ import subprocess
86
+
87
+ try:
88
+ console.print("\n[cyan]📦 Installing mcp-vector-search via pip...[/cyan]")
89
+ result = subprocess.run(
90
+ [sys.executable, "-m", "pip", "install", "mcp-vector-search"],
91
+ capture_output=True,
92
+ text=True,
93
+ timeout=120,
94
+ check=False,
95
+ )
96
+
97
+ if result.returncode == 0:
98
+ console.print(
99
+ "[green]✓ Successfully installed mcp-vector-search[/green]"
100
+ )
101
+ return True
102
+
103
+ error_msg = result.stderr.strip() if result.stderr else "Unknown error"
104
+ console.print(f"[red]✗ Installation failed: {error_msg}[/red]")
105
+ return False
106
+
107
+ except subprocess.TimeoutExpired:
108
+ console.print("[red]✗ Installation timed out[/red]")
109
+ return False
110
+ except Exception as e:
111
+ console.print(f"[red]✗ Installation error: {e}[/red]")
112
+ return False
113
+
114
+ async def _install_via_pipx(self) -> bool:
115
+ """Install mcp-vector-search via pipx."""
116
+ import subprocess
117
+
118
+ try:
119
+ # Check if pipx is available
120
+ pipx_check = subprocess.run(
121
+ ["pipx", "--version"],
122
+ capture_output=True,
123
+ text=True,
124
+ timeout=5,
125
+ check=False,
126
+ )
127
+
128
+ if pipx_check.returncode != 0:
129
+ console.print("[red]✗ pipx is not installed[/red]")
130
+ console.print("Install pipx first: python -m pip install pipx")
131
+ return False
132
+
133
+ console.print("\n[cyan]📦 Installing mcp-vector-search via pipx...[/cyan]")
134
+ result = subprocess.run(
135
+ ["pipx", "install", "mcp-vector-search"],
136
+ capture_output=True,
137
+ text=True,
138
+ timeout=120,
139
+ check=False,
140
+ )
141
+
142
+ if result.returncode == 0:
143
+ console.print(
144
+ "[green]✓ Successfully installed mcp-vector-search[/green]"
145
+ )
146
+ return True
147
+
148
+ error_msg = result.stderr.strip() if result.stderr else "Unknown error"
149
+ console.print(f"[red]✗ Installation failed: {error_msg}[/red]")
150
+ return False
151
+
152
+ except FileNotFoundError:
153
+ console.print("[red]✗ pipx command not found[/red]")
154
+ console.print("Install pipx first: python -m pip install pipx")
155
+ return False
156
+ except subprocess.TimeoutExpired:
157
+ console.print("[red]✗ Installation timed out[/red]")
158
+ return False
159
+ except Exception as e:
160
+ console.print(f"[red]✗ Installation error: {e}[/red]")
161
+ return False
162
+
46
163
  async def search_code(
47
164
  self,
48
165
  query: str,
@@ -125,6 +242,12 @@ class MCPSearchInterface:
125
242
  if not self.mcp_gateway:
126
243
  await self.initialize()
127
244
 
245
+ # Check if vector search is available
246
+ if not self.vector_search_available:
247
+ return {
248
+ "error": "mcp-vector-search is not available. Use traditional grep/glob tools instead, or run command again to install."
249
+ }
250
+
128
251
  try:
129
252
  return await self.mcp_gateway.call_tool(tool_name, params)
130
253
  except Exception as e:
@@ -196,7 +319,6 @@ def display_search_results(results: Dict[str, Any], output_format: str = "rich")
196
319
  @click.option("--focus", multiple=True, help="Focus areas (with --context)")
197
320
  @click.option("--force", is_flag=True, help="Force reindexing (with --index)")
198
321
  @click.option("--json", "output_json", is_flag=True, help="Output results as JSON")
199
- @handle_async_errors
200
322
  async def search_command(
201
323
  query: Optional[str],
202
324
  similar: Optional[str],
@@ -228,8 +350,24 @@ async def search_command(
228
350
  output_format = "json" if output_json else "rich"
229
351
 
230
352
  try:
353
+ # Show first-time usage tips if vector search is available
354
+ if search.vector_search_available and not (index or status):
355
+ console.print(
356
+ "\n[dim]💡 Tip: Vector search provides semantic code understanding.[/dim]"
357
+ )
358
+ console.print(
359
+ "[dim] Run with --index first to index your project.[/dim]\n"
360
+ )
361
+
231
362
  # Handle different operation modes
232
363
  if index:
364
+ if not search.vector_search_available:
365
+ console.print("[red]✗ mcp-vector-search is required for indexing[/red]")
366
+ console.print(
367
+ "[dim]Install it or use traditional grep/glob for search[/dim]"
368
+ )
369
+ sys.exit(1)
370
+
233
371
  console.print("[cyan]Indexing project...[/cyan]")
234
372
  result = await search.index_project(
235
373
  force=force, file_extensions=list(extensions) if extensions else None
@@ -239,10 +377,23 @@ async def search_command(
239
377
  display_search_results(result, output_format)
240
378
 
241
379
  elif status:
380
+ if not search.vector_search_available:
381
+ console.print(
382
+ "[red]✗ mcp-vector-search is required for status check[/red]"
383
+ )
384
+ console.print("[dim]Install it to use vector search features[/dim]")
385
+ sys.exit(1)
386
+
242
387
  result = await search.get_status()
243
388
  display_search_results(result, output_format)
244
389
 
245
390
  elif similar:
391
+ if not search.vector_search_available:
392
+ console.print("[yellow]⚠️ Vector search not available[/yellow]")
393
+ console.print("[dim]Similarity search requires mcp-vector-search[/dim]")
394
+ console.print("[dim]Falling back to basic file search...[/dim]")
395
+ sys.exit(1)
396
+
246
397
  result = await search.search_similar(
247
398
  file_path=similar,
248
399
  function_name=function,
@@ -252,6 +403,12 @@ async def search_command(
252
403
  display_search_results(result, output_format)
253
404
 
254
405
  elif context:
406
+ if not search.vector_search_available:
407
+ console.print("[yellow]⚠️ Vector search not available[/yellow]")
408
+ console.print("[dim]Context search requires mcp-vector-search[/dim]")
409
+ console.print("[dim]Try using grep for text-based search instead[/dim]")
410
+ sys.exit(1)
411
+
255
412
  result = await search.search_context(
256
413
  description=context,
257
414
  focus_areas=list(focus) if focus else None,
@@ -260,6 +417,15 @@ async def search_command(
260
417
  display_search_results(result, output_format)
261
418
 
262
419
  elif query:
420
+ if not search.vector_search_available:
421
+ console.print("[yellow]⚠️ Vector search not available[/yellow]")
422
+ console.print("[dim]Code search requires mcp-vector-search[/dim]")
423
+ console.print(
424
+ "\n[cyan]Alternative: Use grep for pattern matching:[/cyan]"
425
+ )
426
+ console.print(f" grep -r '{query}' .")
427
+ sys.exit(1)
428
+
263
429
  result = await search.search_code(
264
430
  query=query,
265
431
  limit=limit,
@@ -13,8 +13,9 @@ for structured memory storage with semantic search capabilities.
13
13
  DESIGN DECISIONS:
14
14
  - Priority 10 for early execution to enrich prompts before other hooks
15
15
  - Uses subprocess to call kuzu-memory directly for maximum compatibility
16
- - Graceful degradation if kuzu-memory is not installed
16
+ - Graceful degradation if kuzu-memory is not in PATH (though it's now required)
17
17
  - Automatic extraction and storage of important information
18
+ - kuzu-memory>=1.1.5 is now a REQUIRED dependency (moved from optional in v4.8.6)
18
19
  """
19
20
 
20
21
  import json
@@ -50,7 +51,10 @@ class KuzuMemoryHook(SubmitHook):
50
51
  self.enabled = self.kuzu_memory_cmd is not None
51
52
 
52
53
  if not self.enabled:
53
- logger.info("Kuzu-memory not found. Install with: pipx install kuzu-memory")
54
+ logger.warning(
55
+ "Kuzu-memory not found in PATH. As of v4.8.6, it's a required dependency. "
56
+ "Install with: pip install kuzu-memory>=1.1.5 or pipx install kuzu-memory"
57
+ )
54
58
  else:
55
59
  logger.info(f"Kuzu-memory integration enabled: {self.kuzu_memory_cmd}")
56
60
 
@@ -72,6 +76,10 @@ class KuzuMemoryHook(SubmitHook):
72
76
  1. Check pipx installation
73
77
  2. Check system PATH
74
78
  3. Return None if not found
79
+
80
+ NOTE: As of v4.8.6, kuzu-memory is a required dependency and should be
81
+ installed via pip. This method checks both pipx and system PATH for
82
+ backward compatibility.
75
83
  """
76
84
  # Check pipx installation
77
85
  pipx_path = (
@@ -314,6 +314,36 @@ class MCPGatewayOrchestrator:
314
314
  except Exception as e:
315
315
  self.logger.warning(f"Could not load document summarizer: {e}")
316
316
 
317
+ # Kuzu-Memory Service (now a required dependency)
318
+ try:
319
+ from .tools.kuzu_memory_service import KuzuMemoryService
320
+
321
+ tools.append(KuzuMemoryService())
322
+ self.logger.info("KuzuMemoryService added to built-in tools")
323
+ except Exception as e:
324
+ self.logger.warning(f"Could not load KuzuMemoryService: {e}")
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
+
317
347
  # Ticket tools removed - mcp-ticketer provides ticket functionality
318
348
 
319
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
 
@@ -13,6 +13,7 @@ DESIGN DECISIONS:
13
13
  - Provides high-level tools that abstract kuzu-memory complexity
14
14
  - Includes context enrichment for better memory retrieval
15
15
  - Supports tagging for organized knowledge management
16
+ - kuzu-memory>=1.1.5 is now a REQUIRED dependency (moved from optional in v4.8.6)
16
17
  """
17
18
 
18
19
  import json
@@ -111,7 +112,13 @@ class KuzuMemoryService(BaseToolAdapter):
111
112
  return False
112
113
 
113
114
  async def _install_package(self) -> bool:
114
- """Install kuzu-memory using pipx (preferred over pip)."""
115
+ """
116
+ Install kuzu-memory using pipx (preferred over pip).
117
+
118
+ NOTE: As of v4.8.6, kuzu-memory is a required dependency and should be
119
+ installed via pip along with claude-mpm. This method is kept for backward
120
+ compatibility and edge cases where the package may be missing.
121
+ """
115
122
  try:
116
123
  # Check if pipx is available
117
124
  import shutil
@@ -120,6 +127,9 @@ class KuzuMemoryService(BaseToolAdapter):
120
127
  self.log_warning(
121
128
  "pipx not found. Install it first: python -m pip install --user pipx"
122
129
  )
130
+ self.log_info(
131
+ "Alternatively, kuzu-memory should be installed via pip with claude-mpm dependencies"
132
+ )
123
133
  return False
124
134
 
125
135
  self.log_info("Installing kuzu-memory via pipx...")
@@ -143,23 +153,33 @@ class KuzuMemoryService(BaseToolAdapter):
143
153
  return False
144
154
 
145
155
  async def initialize(self) -> bool:
146
- """Initialize the kuzu-memory service."""
156
+ """
157
+ Initialize the kuzu-memory service.
158
+
159
+ NOTE: As of v4.8.6, kuzu-memory is a required dependency. This method
160
+ checks for installation and provides helpful messages if missing.
161
+ """
147
162
  try:
148
163
  # Check if package is installed
149
164
  self._is_installed = await self._check_installation()
150
165
 
151
166
  if not self._is_installed:
152
167
  self.log_warning(
153
- f"{self.package_name} not installed, attempting installation..."
168
+ f"{self.package_name} not found in PATH. "
169
+ f"Since v4.8.6, it's a required dependency."
154
170
  )
171
+ self.log_info("Attempting installation via pipx as fallback...")
155
172
  await self._install_package()
156
173
  self._is_installed = await self._check_installation()
157
174
 
158
175
  if not self._is_installed:
159
- self.log_error(f"Failed to install {self.package_name}")
176
+ self.log_error(
177
+ f"Failed to initialize {self.package_name}. "
178
+ f"Please install manually: pip install kuzu-memory>=1.1.5"
179
+ )
160
180
  return False
161
181
 
162
- self.log_info(f"{self.package_name} is available")
182
+ self.log_info(f"{self.package_name} is available and ready")
163
183
  self._initialized = True
164
184
  return True
165
185
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: claude-mpm
3
- Version: 4.8.6
3
+ Version: 4.10.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
@@ -49,12 +49,12 @@ Requires-Dist: rich>=13.0.0
49
49
  Requires-Dist: pyee>=13.0.0
50
50
  Requires-Dist: importlib-resources>=5.0; python_version < "3.9"
51
51
  Requires-Dist: pathspec>=0.11.0
52
+ Requires-Dist: kuzu-memory>=1.1.5
52
53
  Provides-Extra: mcp
53
54
  Requires-Dist: mcp>=0.1.0; extra == "mcp"
54
55
  Requires-Dist: mcp-vector-search>=0.1.0; extra == "mcp"
55
56
  Requires-Dist: mcp-browser>=0.1.0; extra == "mcp"
56
57
  Requires-Dist: mcp-ticketer>=0.1.0; extra == "mcp"
57
- Requires-Dist: kuzu-memory>=1.1.5; extra == "mcp"
58
58
  Provides-Extra: dev
59
59
  Requires-Dist: pytest>=7.0; extra == "dev"
60
60
  Requires-Dist: pytest-asyncio; extra == "dev"
@@ -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
@@ -193,10 +194,12 @@ claude-mpm mcp-pipx-config
193
194
  ```
194
195
 
195
196
  **💡 Optional Dependencies**:
196
- - `[mcp]` - Include MCP services (mcp-vector-search, mcp-browser, mcp-ticketer, kuzu-memory)
197
+ - `[mcp]` - Include MCP services (mcp-vector-search, mcp-browser, mcp-ticketer)
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
- - Without optional dependencies, MCP services auto-install on first use via pipx
200
+ - **Note**: kuzu-memory is now a required dependency, always included with Claude MPM
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
200
203
 
201
204
  **🎉 Pipx Support Now Fully Functional!** Recent improvements ensure complete compatibility:
202
205
  - ✅ Socket.IO daemon script path resolution (fixed)
@@ -215,6 +218,11 @@ claude-mpm
215
218
  # Start with monitoring dashboard
216
219
  claude-mpm run --monitor
217
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
+
218
226
  # Use MCP Gateway for external tool integration
219
227
  claude-mpm mcp
220
228
 
@@ -1,5 +1,5 @@
1
1
  claude_mpm/BUILD_NUMBER,sha256=9JfxhnDtr-8l3kCP2U5TVXSErptHoga8m7XA8zqgGOc,4
2
- claude_mpm/VERSION,sha256=v3c6M9SUWWklfNfCmUrn1icf0c8KH0lj8A_rk5NyVN0,6
2
+ claude_mpm/VERSION,sha256=9StPgaDGDNmI-MzJoDM-IGtffkHdD1KGxqtfe_LVM18,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
@@ -103,7 +103,7 @@ claude_mpm/cli/commands/monitor.py,sha256=Fjb68hf3dEwTFek2LV8Nh6iU0qEkY7qYlOn32I
103
103
  claude_mpm/cli/commands/mpm_init.py,sha256=OtdJMsFn7E9Ck56wWPrCvqw6j5dsN_VI098C3bteitc,63888
104
104
  claude_mpm/cli/commands/mpm_init_handler.py,sha256=b1CSwZYJ89wMorKzPOKS-RVxOKR2kT9yv9KQLvKkd2U,3532
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
107
  claude_mpm/cli/commands/tickets.py,sha256=kl2dklTBnG3Y4jUUJ_PcEVsTx4CtVJfkGWboWBx_mQM,21234
108
108
  claude_mpm/cli/commands/uninstall.py,sha256=KGlVG6veEs1efLVjrZ3wSty7e1zVR9wpt-VXQA1RzWw,5945
109
109
  claude_mpm/cli/commands/upgrade.py,sha256=NYMVONNlj78WHoQ6eyVInroE95AeQxUY2_TpjYFTdYE,5409
@@ -377,7 +377,7 @@ claude_mpm/hooks/__init__.py,sha256=lLRTE1jvnHAMzwl0W-g-hcjo7C9GS-N7lDpZdpHYcB8,
377
377
  claude_mpm/hooks/base_hook.py,sha256=wKbT_0g3dhvkA48pTz4GJpZQw8URhaT0LpZnCc7CEas,5026
378
378
  claude_mpm/hooks/instruction_reinforcement.py,sha256=PnjfDSZ_72gbzHnRoug7qtXfpW5d1cxnmittpnPd2ws,11059
379
379
  claude_mpm/hooks/kuzu_enrichment_hook.py,sha256=jghoEZX8fA6HZ1kM_5l93cuCyy-AMBjWp-nPW5EgaTk,8729
380
- claude_mpm/hooks/kuzu_memory_hook.py,sha256=ockbKXXc69Yiryq2uWNCAUpSxtN8eqAec9i5BB1MRaI,12265
380
+ claude_mpm/hooks/kuzu_memory_hook.py,sha256=mWQYcQt3_6s0EjjK1zZ6rv4EaUI-lCgiUu5bbNry2Zs,12696
381
381
  claude_mpm/hooks/kuzu_response_hook.py,sha256=iyVrsOrGpp-VFOjKC5GUnXro088Ftex-vHmfHsmAUv8,6136
382
382
  claude_mpm/hooks/memory_integration_hook.py,sha256=F8Hf35hmbmhxi-qHQJac4zoWIr60ob3PCHa4P_rbxO8,16635
383
383
  claude_mpm/hooks/tool_call_interceptor.py,sha256=tYUBJHjbtaI5-HSWcz0aeUW0CaiQPypuDOTULQ0BCNI,7506
@@ -632,7 +632,7 @@ claude_mpm/services/infrastructure/monitoring/resources.py,sha256=7Mt9zvNAYGf7OT
632
632
  claude_mpm/services/infrastructure/monitoring/service.py,sha256=guYB6rJtU18T2kPhZbKKg85l96lm2f7XVtPnBt1O3So,12613
633
633
  claude_mpm/services/mcp_gateway/__init__.py,sha256=4fiMsd7i2QzZpEXCUeo0Vk_CXRi35TE94gPvwyuz2es,5099
634
634
  claude_mpm/services/mcp_gateway/auto_configure.py,sha256=JNos01nGb2qXACXNHC-UkLccqQ-p8GFUElXqBLUQl7A,12163
635
- claude_mpm/services/mcp_gateway/main.py,sha256=7--1VAPiW6vRkE4Sf4SFckh24n0_20WDVAMPENeY8vo,17822
635
+ claude_mpm/services/mcp_gateway/main.py,sha256=1e_-NGwVNr8cFtwWC_2NhZS-EYwC--MSfiZTx15x3ao,19121
636
636
  claude_mpm/services/mcp_gateway/config/__init__.py,sha256=MpFgHfaT3dQz5QyEdpfbulD6tXUOY325LkovAYsdkAg,386
637
637
  claude_mpm/services/mcp_gateway/config/config_loader.py,sha256=jM0LCQGnyAezQHLqfLWtPn5P3GpGMxGltKlTIKCL24M,9427
638
638
  claude_mpm/services/mcp_gateway/config/config_schema.py,sha256=eSPyHmYJWBpGxJ8l0vBjEGod_PEnbGyHi3fcNLS4mH0,9475
@@ -654,10 +654,10 @@ claude_mpm/services/mcp_gateway/server/stdio_server.py,sha256=k_VHLZ17zdZzP6XOg6
654
654
  claude_mpm/services/mcp_gateway/tools/__init__.py,sha256=Ga0kbvNOi8peBRZk5MUnO5bo3jWDCpHFko7mO21Vix4,754
655
655
  claude_mpm/services/mcp_gateway/tools/base_adapter.py,sha256=na1MdyBCtVmKzgIcFJ5MuAUJ1LJrtA4yxkuqLnejiD8,16029
656
656
  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
657
+ claude_mpm/services/mcp_gateway/tools/external_mcp_services.py,sha256=PSnes4mVOyAdqJ5o_YU9lmyTiXeXwXzE_x1pQeadpbs,23635
658
658
  claude_mpm/services/mcp_gateway/tools/health_check_tool.py,sha256=SIrGt2uZGR4EGsH2_0UgkmHUV895M8zq9suNkRSteRA,16457
659
659
  claude_mpm/services/mcp_gateway/tools/hello_world.py,sha256=L45ph8b0iLPpksrkf0ELrfl6CwVD3W3YLigwUKjIOoY,20291
660
- claude_mpm/services/mcp_gateway/tools/kuzu_memory_service.py,sha256=Js2YI_jOd8lOlMYifeVzVwQEwVOViK1iIQNqpY6XXKs,16830
660
+ claude_mpm/services/mcp_gateway/tools/kuzu_memory_service.py,sha256=qc9vYJtN3OYXqb-aXZpkx3FtkM9ivUm9AcWKUgeGdG4,17745
661
661
  claude_mpm/services/mcp_gateway/utils/__init__.py,sha256=Swz8V_TBTCz3u-J-ZRPM0rTbrqPgX1DBtW0fpXwa5K0,278
662
662
  claude_mpm/services/mcp_gateway/utils/package_version_checker.py,sha256=BIq0kirCPZgWJHqhvDjMYrHN2ZjyCXFF1U9aSApw-xc,5245
663
663
  claude_mpm/services/mcp_gateway/utils/update_preferences.py,sha256=CrmxistQvDDqfYxTy8Ea2mdRu9qQyun4-rPJJMvQnsE,4893
@@ -797,9 +797,9 @@ claude_mpm/utils/subprocess_utils.py,sha256=D0izRT8anjiUb_JG72zlJR_JAw1cDkb7kalN
797
797
  claude_mpm/validation/__init__.py,sha256=YZhwE3mhit-lslvRLuwfX82xJ_k4haZeKmh4IWaVwtk,156
798
798
  claude_mpm/validation/agent_validator.py,sha256=GprtAvu80VyMXcKGsK_VhYiXWA6BjKHv7O6HKx0AB9w,20917
799
799
  claude_mpm/validation/frontmatter_validator.py,sha256=YpJlYNNYcV8u6hIOi3_jaRsDnzhbcQpjCBE6eyBKaFY,7076
800
- claude_mpm-4.8.6.dist-info/licenses/LICENSE,sha256=lpaivOlPuBZW1ds05uQLJJswy8Rp_HMNieJEbFlqvLk,1072
801
- claude_mpm-4.8.6.dist-info/METADATA,sha256=goQ3hxJxhFsrDe5DvYp6nzj7cIc01oos5TxNVe4o1NI,17517
802
- claude_mpm-4.8.6.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
803
- claude_mpm-4.8.6.dist-info/entry_points.txt,sha256=Vlw3GNi-OtTpKSrez04iNrPmxNxYDpIWxmJCxiZ5Tx8,526
804
- claude_mpm-4.8.6.dist-info/top_level.txt,sha256=1nUg3FEaBySgm8t-s54jK5zoPnu3_eY6EP6IOlekyHA,11
805
- claude_mpm-4.8.6.dist-info/RECORD,,
800
+ claude_mpm-4.10.0.dist-info/licenses/LICENSE,sha256=lpaivOlPuBZW1ds05uQLJJswy8Rp_HMNieJEbFlqvLk,1072
801
+ claude_mpm-4.10.0.dist-info/METADATA,sha256=k0Zv4w5f9JRyt9zBPKr0C1Np9CetMfRascM9u-26Tgo,17967
802
+ claude_mpm-4.10.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
803
+ claude_mpm-4.10.0.dist-info/entry_points.txt,sha256=Vlw3GNi-OtTpKSrez04iNrPmxNxYDpIWxmJCxiZ5Tx8,526
804
+ claude_mpm-4.10.0.dist-info/top_level.txt,sha256=1nUg3FEaBySgm8t-s54jK5zoPnu3_eY6EP6IOlekyHA,11
805
+ claude_mpm-4.10.0.dist-info/RECORD,,