claude-mpm 5.1.9__py3-none-any.whl → 5.4.3__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of claude-mpm might be problematic. Click here for more details.
- claude_mpm/VERSION +1 -1
- claude_mpm/agents/PM_INSTRUCTIONS.md +46 -0
- claude_mpm/agents/agent_loader.py +10 -17
- claude_mpm/agents/templates/circuit-breakers.md +138 -1
- claude_mpm/cli/commands/agent_state_manager.py +8 -17
- claude_mpm/cli/commands/configure.py +1046 -149
- claude_mpm/cli/commands/configure_agent_display.py +13 -6
- claude_mpm/cli/commands/mpm_init/core.py +158 -1
- claude_mpm/cli/commands/mpm_init/knowledge_extractor.py +481 -0
- claude_mpm/cli/commands/mpm_init/prompts.py +280 -0
- claude_mpm/cli/commands/summarize.py +413 -0
- claude_mpm/cli/executor.py +8 -0
- claude_mpm/cli/parsers/base_parser.py +5 -0
- claude_mpm/cli/startup.py +60 -53
- claude_mpm/commands/{mpm-ticket-organize.md → mpm-organize.md} +4 -5
- claude_mpm/config/agent_sources.py +27 -0
- claude_mpm/core/framework/loaders/agent_loader.py +8 -5
- claude_mpm/core/socketio_pool.py +3 -3
- claude_mpm/core/unified_agent_registry.py +5 -15
- claude_mpm/hooks/claude_hooks/__pycache__/__init__.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/correlation_manager.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/event_handlers.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/hook_handler.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/memory_integration.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/response_tracking.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/tool_analysis.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/correlation_manager.py +60 -0
- claude_mpm/hooks/claude_hooks/event_handlers.py +35 -2
- claude_mpm/hooks/claude_hooks/hook_handler.py +4 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/__init__.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager_http.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/duplicate_detector.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/state_manager.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/subagent_processor.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/connection_manager.py +4 -0
- claude_mpm/scripts/launch_monitor.py +93 -13
- claude_mpm/services/agents/agent_recommendation_service.py +279 -0
- claude_mpm/services/agents/deployment/agent_template_builder.py +3 -2
- claude_mpm/services/agents/deployment/remote_agent_discovery_service.py +322 -53
- claude_mpm/services/agents/git_source_manager.py +20 -0
- claude_mpm/services/agents/sources/git_source_sync_service.py +8 -1
- claude_mpm/services/agents/toolchain_detector.py +6 -5
- claude_mpm/services/analysis/__init__.py +11 -1
- claude_mpm/services/analysis/clone_detector.py +1030 -0
- claude_mpm/services/command_deployment_service.py +0 -2
- claude_mpm/services/event_bus/config.py +3 -1
- claude_mpm/services/monitor/daemon.py +9 -2
- claude_mpm/services/monitor/daemon_manager.py +39 -3
- claude_mpm/services/monitor/server.py +225 -19
- claude_mpm/services/socketio/event_normalizer.py +15 -1
- claude_mpm/services/socketio/server/core.py +160 -21
- claude_mpm/services/version_control/git_operations.py +103 -0
- claude_mpm/utils/agent_filters.py +17 -44
- {claude_mpm-5.1.9.dist-info → claude_mpm-5.4.3.dist-info}/METADATA +1 -77
- {claude_mpm-5.1.9.dist-info → claude_mpm-5.4.3.dist-info}/RECORD +59 -114
- {claude_mpm-5.1.9.dist-info → claude_mpm-5.4.3.dist-info}/entry_points.txt +0 -2
- claude_mpm/dashboard/analysis_runner.py +0 -455
- claude_mpm/dashboard/index.html +0 -13
- claude_mpm/dashboard/open_dashboard.py +0 -66
- claude_mpm/dashboard/static/css/activity.css +0 -1958
- claude_mpm/dashboard/static/css/connection-status.css +0 -370
- claude_mpm/dashboard/static/css/dashboard.css +0 -4701
- claude_mpm/dashboard/static/js/components/activity-tree.js +0 -1871
- claude_mpm/dashboard/static/js/components/agent-hierarchy.js +0 -777
- claude_mpm/dashboard/static/js/components/agent-inference.js +0 -956
- claude_mpm/dashboard/static/js/components/build-tracker.js +0 -333
- claude_mpm/dashboard/static/js/components/code-simple.js +0 -857
- claude_mpm/dashboard/static/js/components/connection-debug.js +0 -654
- claude_mpm/dashboard/static/js/components/diff-viewer.js +0 -891
- claude_mpm/dashboard/static/js/components/event-processor.js +0 -542
- claude_mpm/dashboard/static/js/components/event-viewer.js +0 -1155
- claude_mpm/dashboard/static/js/components/export-manager.js +0 -368
- claude_mpm/dashboard/static/js/components/file-change-tracker.js +0 -443
- claude_mpm/dashboard/static/js/components/file-change-viewer.js +0 -690
- claude_mpm/dashboard/static/js/components/file-tool-tracker.js +0 -724
- claude_mpm/dashboard/static/js/components/file-viewer.js +0 -580
- claude_mpm/dashboard/static/js/components/hud-library-loader.js +0 -211
- claude_mpm/dashboard/static/js/components/hud-manager.js +0 -671
- claude_mpm/dashboard/static/js/components/hud-visualizer.js +0 -1718
- claude_mpm/dashboard/static/js/components/module-viewer.js +0 -2764
- claude_mpm/dashboard/static/js/components/session-manager.js +0 -579
- claude_mpm/dashboard/static/js/components/socket-manager.js +0 -368
- claude_mpm/dashboard/static/js/components/ui-state-manager.js +0 -749
- claude_mpm/dashboard/static/js/components/unified-data-viewer.js +0 -1824
- claude_mpm/dashboard/static/js/components/working-directory.js +0 -920
- claude_mpm/dashboard/static/js/connection-manager.js +0 -536
- claude_mpm/dashboard/static/js/dashboard.js +0 -1914
- claude_mpm/dashboard/static/js/extension-error-handler.js +0 -164
- claude_mpm/dashboard/static/js/socket-client.js +0 -1474
- claude_mpm/dashboard/static/js/tab-isolation-fix.js +0 -185
- claude_mpm/dashboard/static/socket.io.min.js +0 -7
- claude_mpm/dashboard/static/socket.io.v4.8.1.backup.js +0 -7
- claude_mpm/dashboard/templates/code_simple.html +0 -153
- claude_mpm/dashboard/templates/index.html +0 -606
- claude_mpm/dashboard/test_dashboard.html +0 -372
- claude_mpm/scripts/mcp_server.py +0 -75
- claude_mpm/scripts/mcp_wrapper.py +0 -39
- claude_mpm/services/mcp_gateway/__init__.py +0 -159
- claude_mpm/services/mcp_gateway/auto_configure.py +0 -369
- claude_mpm/services/mcp_gateway/config/__init__.py +0 -17
- claude_mpm/services/mcp_gateway/config/config_loader.py +0 -296
- claude_mpm/services/mcp_gateway/config/config_schema.py +0 -243
- claude_mpm/services/mcp_gateway/config/configuration.py +0 -429
- claude_mpm/services/mcp_gateway/core/__init__.py +0 -43
- claude_mpm/services/mcp_gateway/core/base.py +0 -312
- claude_mpm/services/mcp_gateway/core/exceptions.py +0 -253
- claude_mpm/services/mcp_gateway/core/interfaces.py +0 -443
- claude_mpm/services/mcp_gateway/core/process_pool.py +0 -977
- claude_mpm/services/mcp_gateway/core/singleton_manager.py +0 -315
- claude_mpm/services/mcp_gateway/core/startup_verification.py +0 -316
- claude_mpm/services/mcp_gateway/main.py +0 -589
- claude_mpm/services/mcp_gateway/registry/__init__.py +0 -12
- claude_mpm/services/mcp_gateway/registry/service_registry.py +0 -412
- claude_mpm/services/mcp_gateway/registry/tool_registry.py +0 -489
- claude_mpm/services/mcp_gateway/server/__init__.py +0 -15
- claude_mpm/services/mcp_gateway/server/mcp_gateway.py +0 -414
- claude_mpm/services/mcp_gateway/server/stdio_handler.py +0 -372
- claude_mpm/services/mcp_gateway/server/stdio_server.py +0 -712
- claude_mpm/services/mcp_gateway/tools/__init__.py +0 -36
- claude_mpm/services/mcp_gateway/tools/base_adapter.py +0 -485
- claude_mpm/services/mcp_gateway/tools/document_summarizer.py +0 -789
- claude_mpm/services/mcp_gateway/tools/external_mcp_services.py +0 -654
- claude_mpm/services/mcp_gateway/tools/health_check_tool.py +0 -456
- claude_mpm/services/mcp_gateway/tools/hello_world.py +0 -551
- claude_mpm/services/mcp_gateway/tools/kuzu_memory_service.py +0 -555
- claude_mpm/services/mcp_gateway/utils/__init__.py +0 -14
- claude_mpm/services/mcp_gateway/utils/package_version_checker.py +0 -160
- claude_mpm/services/mcp_gateway/utils/update_preferences.py +0 -170
- {claude_mpm-5.1.9.dist-info → claude_mpm-5.4.3.dist-info}/WHEEL +0 -0
- {claude_mpm-5.1.9.dist-info → claude_mpm-5.4.3.dist-info}/licenses/LICENSE +0 -0
- {claude_mpm-5.1.9.dist-info → claude_mpm-5.4.3.dist-info}/top_level.txt +0 -0
|
@@ -59,12 +59,15 @@ class AgentDisplay:
|
|
|
59
59
|
Shows:
|
|
60
60
|
- Agent ID (for selection)
|
|
61
61
|
- Name and description
|
|
62
|
-
-
|
|
62
|
+
- Installed/Available status
|
|
63
63
|
- Model or tools information
|
|
64
64
|
|
|
65
65
|
Args:
|
|
66
66
|
agents: List of agent configurations to display
|
|
67
67
|
"""
|
|
68
|
+
|
|
69
|
+
from ...utils.agent_filters import get_deployed_agent_ids
|
|
70
|
+
|
|
68
71
|
table = Table(
|
|
69
72
|
title=f"Available Agents ({len(agents)} total)",
|
|
70
73
|
box=ROUNDED,
|
|
@@ -77,12 +80,16 @@ class AgentDisplay:
|
|
|
77
80
|
table.add_column("Description", style="bold", width=45)
|
|
78
81
|
table.add_column("Model/Tools", style="dim", width=20)
|
|
79
82
|
|
|
83
|
+
# Get deployed agent IDs
|
|
84
|
+
deployed_ids = get_deployed_agent_ids()
|
|
85
|
+
|
|
80
86
|
for idx, agent in enumerate(agents, 1):
|
|
81
|
-
# Check if agent is
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
87
|
+
# Check if agent is deployed to .claude/agents/
|
|
88
|
+
agent_leaf_name = agent.name.split("/")[-1]
|
|
89
|
+
is_deployed = agent_leaf_name in deployed_ids
|
|
90
|
+
|
|
91
|
+
# Show "Installed" for deployed agents, "Available" otherwise
|
|
92
|
+
status = "[green]Installed[/green]" if is_deployed else "Available"
|
|
86
93
|
|
|
87
94
|
# Format tools/dependencies - show first 2 tools
|
|
88
95
|
tools_display = ""
|
|
@@ -24,6 +24,7 @@ from claude_mpm.utils.display_helper import DisplayHelper
|
|
|
24
24
|
|
|
25
25
|
# Import from sibling modules in the mpm_init package
|
|
26
26
|
from . import display, git_activity, modes, prompts
|
|
27
|
+
from .knowledge_extractor import ProjectKnowledgeExtractor
|
|
27
28
|
|
|
28
29
|
logger = get_logger(__name__)
|
|
29
30
|
|
|
@@ -34,6 +35,7 @@ class MPMInitCommand:
|
|
|
34
35
|
def __init__(self, project_path: Optional[Path] = None):
|
|
35
36
|
"""Initialize the MPM-Init command."""
|
|
36
37
|
self.project_path = project_path or Path.cwd()
|
|
38
|
+
self.claude_mpm_dir = self.project_path / ".claude-mpm"
|
|
37
39
|
self.claude_mpm_script = self._find_claude_mpm_script()
|
|
38
40
|
self.console = Console()
|
|
39
41
|
|
|
@@ -452,6 +454,10 @@ class MPMInitCommand:
|
|
|
452
454
|
self.project_path, project_type, framework, ast_analysis
|
|
453
455
|
)
|
|
454
456
|
|
|
457
|
+
def _is_initialized(self) -> bool:
|
|
458
|
+
"""Check if project is already initialized with .claude-mpm directory."""
|
|
459
|
+
return self.claude_mpm_dir.exists()
|
|
460
|
+
|
|
455
461
|
def _build_update_prompt(
|
|
456
462
|
self,
|
|
457
463
|
project_type: Optional[str],
|
|
@@ -459,10 +465,65 @@ class MPMInitCommand:
|
|
|
459
465
|
ast_analysis: bool,
|
|
460
466
|
preserve_custom: bool,
|
|
461
467
|
) -> str:
|
|
462
|
-
"""Build prompt for update mode."""
|
|
468
|
+
"""Build prompt for update mode with optional knowledge extraction."""
|
|
463
469
|
# Get existing content analysis
|
|
464
470
|
doc_analysis = self.doc_manager.analyze_existing_content()
|
|
465
471
|
|
|
472
|
+
# Check if project is initialized (.claude-mpm exists)
|
|
473
|
+
# If so, use enhanced update mode with knowledge extraction
|
|
474
|
+
if self._is_initialized():
|
|
475
|
+
self.console.print(
|
|
476
|
+
"[cyan]✓ Detected initialized project - activating enhanced update mode[/cyan]"
|
|
477
|
+
)
|
|
478
|
+
|
|
479
|
+
# Extract knowledge from all sources
|
|
480
|
+
extractor = ProjectKnowledgeExtractor(self.project_path)
|
|
481
|
+
|
|
482
|
+
self.console.print("[cyan]✓ Analyzing git history (last 90 days)...[/cyan]")
|
|
483
|
+
git_insights = extractor.extract_from_git(days=90)
|
|
484
|
+
|
|
485
|
+
if git_insights.get("available"):
|
|
486
|
+
arch_count = len(git_insights.get("architectural_decisions", []))
|
|
487
|
+
workflow_count = len(git_insights.get("workflow_patterns", []))
|
|
488
|
+
self.console.print(f" - Found {arch_count} architectural decisions")
|
|
489
|
+
self.console.print(f" - Detected {workflow_count} workflow patterns")
|
|
490
|
+
|
|
491
|
+
self.console.print("[cyan]✓ Analyzing session logs...[/cyan]")
|
|
492
|
+
log_insights = extractor.extract_from_logs()
|
|
493
|
+
|
|
494
|
+
if log_insights.get("available"):
|
|
495
|
+
learning_count = len(log_insights.get("learnings", []))
|
|
496
|
+
self.console.print(f" - Found {learning_count} learning entries")
|
|
497
|
+
|
|
498
|
+
self.console.print("[cyan]✓ Analyzing memory files...[/cyan]")
|
|
499
|
+
memory_insights = extractor.extract_from_memory()
|
|
500
|
+
|
|
501
|
+
if memory_insights.get("available"):
|
|
502
|
+
total_insights = (
|
|
503
|
+
len(memory_insights.get("architectural_knowledge", []))
|
|
504
|
+
+ len(memory_insights.get("implementation_guidelines", []))
|
|
505
|
+
+ len(memory_insights.get("common_mistakes", []))
|
|
506
|
+
+ len(memory_insights.get("technical_context", []))
|
|
507
|
+
)
|
|
508
|
+
self.console.print(f" - Found {total_insights} accumulated insights")
|
|
509
|
+
|
|
510
|
+
self.console.print(
|
|
511
|
+
"[green]✓ Knowledge extraction complete - building enhanced prompt[/green]\n"
|
|
512
|
+
)
|
|
513
|
+
|
|
514
|
+
# Build enhanced prompt with extracted knowledge
|
|
515
|
+
return prompts.build_enhanced_update_prompt(
|
|
516
|
+
self.project_path,
|
|
517
|
+
doc_analysis,
|
|
518
|
+
git_insights,
|
|
519
|
+
log_insights,
|
|
520
|
+
memory_insights,
|
|
521
|
+
project_type,
|
|
522
|
+
framework,
|
|
523
|
+
ast_analysis,
|
|
524
|
+
preserve_custom,
|
|
525
|
+
)
|
|
526
|
+
# Standard update mode (no .claude-mpm directory)
|
|
466
527
|
return prompts.build_update_prompt(
|
|
467
528
|
self.project_path,
|
|
468
529
|
doc_analysis,
|
|
@@ -548,6 +609,11 @@ class MPMInitCommand:
|
|
|
548
609
|
self.archive_manager,
|
|
549
610
|
)
|
|
550
611
|
|
|
612
|
+
# Optimize CLAUDE.md with prompt-engineer if it exists
|
|
613
|
+
claude_md = self.project_path / "CLAUDE.md"
|
|
614
|
+
if claude_md.exists():
|
|
615
|
+
self._optimize_claude_md_with_prompt_engineer()
|
|
616
|
+
|
|
551
617
|
def _display_results(self, result: Dict, verbose: bool):
|
|
552
618
|
"""Display initialization results."""
|
|
553
619
|
display.display_results(self.display, self.console, result, verbose)
|
|
@@ -569,5 +635,96 @@ class MPMInitCommand:
|
|
|
569
635
|
"""Build structured Research agent delegation prompt from git analysis."""
|
|
570
636
|
return prompts.build_research_context_prompt(git_analysis, days)
|
|
571
637
|
|
|
638
|
+
def _optimize_claude_md_with_prompt_engineer(self) -> None:
|
|
639
|
+
"""Optimize CLAUDE.md with prompt-engineer for conciseness and clarity."""
|
|
640
|
+
claude_md_path = self.project_path / "CLAUDE.md"
|
|
641
|
+
if not claude_md_path.exists():
|
|
642
|
+
return
|
|
643
|
+
|
|
644
|
+
try:
|
|
645
|
+
# Read current content
|
|
646
|
+
original_content = claude_md_path.read_text()
|
|
647
|
+
original_tokens = self._estimate_tokens(original_content)
|
|
648
|
+
|
|
649
|
+
# Create backup
|
|
650
|
+
backup_path = self.archive_manager.auto_archive_before_update(
|
|
651
|
+
claude_md_path, update_reason="Before prompt-engineer optimization"
|
|
652
|
+
)
|
|
653
|
+
|
|
654
|
+
if not backup_path:
|
|
655
|
+
logger.warning("Could not create backup before optimization")
|
|
656
|
+
self.console.print(
|
|
657
|
+
"[yellow]⚠️ Skipping optimization - backup failed[/yellow]"
|
|
658
|
+
)
|
|
659
|
+
return
|
|
660
|
+
|
|
661
|
+
self.console.print(
|
|
662
|
+
"\n[cyan]✓ Optimizing CLAUDE.md with prompt-engineer...[/cyan]"
|
|
663
|
+
)
|
|
664
|
+
self.console.print(f" - Original: {original_tokens:,} tokens (estimated)")
|
|
665
|
+
self.console.print(f" - Backup created: {backup_path}")
|
|
666
|
+
|
|
667
|
+
# Build optimization prompt
|
|
668
|
+
prompt = prompts.build_prompt_engineer_optimization_prompt(
|
|
669
|
+
original_content, original_tokens
|
|
670
|
+
)
|
|
671
|
+
|
|
672
|
+
# Run optimization through subprocess
|
|
673
|
+
with Progress(
|
|
674
|
+
SpinnerColumn(),
|
|
675
|
+
TextColumn("[progress.description]{task.description}"),
|
|
676
|
+
console=self.console,
|
|
677
|
+
) as progress:
|
|
678
|
+
task = progress.add_task(
|
|
679
|
+
"[cyan]Running prompt-engineer optimization...", total=None
|
|
680
|
+
)
|
|
681
|
+
|
|
682
|
+
result = self._run_initialization(
|
|
683
|
+
prompt, verbose=False, update_mode=True
|
|
684
|
+
)
|
|
685
|
+
|
|
686
|
+
progress.update(task, description="[green]✓ Optimization complete")
|
|
687
|
+
|
|
688
|
+
# Check if optimization succeeded
|
|
689
|
+
if result.get("status") == OperationResult.SUCCESS:
|
|
690
|
+
# Read optimized content
|
|
691
|
+
optimized_content = claude_md_path.read_text()
|
|
692
|
+
optimized_tokens = self._estimate_tokens(optimized_content)
|
|
693
|
+
|
|
694
|
+
# Calculate reduction
|
|
695
|
+
token_reduction = original_tokens - optimized_tokens
|
|
696
|
+
reduction_percent = (
|
|
697
|
+
(token_reduction / original_tokens * 100)
|
|
698
|
+
if original_tokens > 0
|
|
699
|
+
else 0
|
|
700
|
+
)
|
|
701
|
+
|
|
702
|
+
self.console.print(
|
|
703
|
+
f" - Optimized: {optimized_tokens:,} tokens ({reduction_percent:.1f}% reduction)"
|
|
704
|
+
)
|
|
705
|
+
self.console.print("[green]✓ CLAUDE.md optimization complete[/green]\n")
|
|
706
|
+
# Restore from backup on failure
|
|
707
|
+
elif backup_path and backup_path.exists():
|
|
708
|
+
import shutil
|
|
709
|
+
|
|
710
|
+
shutil.copy2(backup_path, claude_md_path)
|
|
711
|
+
self.console.print(
|
|
712
|
+
"[yellow]⚠️ Optimization failed - restored from backup[/yellow]\n"
|
|
713
|
+
)
|
|
714
|
+
|
|
715
|
+
except Exception as e:
|
|
716
|
+
logger.error(f"Failed to optimize CLAUDE.md: {e}")
|
|
717
|
+
self.console.print(
|
|
718
|
+
f"[yellow]⚠️ Could not optimize CLAUDE.md: {e}[/yellow]\n"
|
|
719
|
+
)
|
|
720
|
+
|
|
721
|
+
def _estimate_tokens(self, text: str) -> int:
|
|
722
|
+
"""Estimate token count for text (rough approximation).
|
|
723
|
+
|
|
724
|
+
Uses a simple heuristic: ~4 characters per token for English text.
|
|
725
|
+
This is a rough estimate but sufficient for displaying progress.
|
|
726
|
+
"""
|
|
727
|
+
return len(text) // 4
|
|
728
|
+
|
|
572
729
|
|
|
573
730
|
__all__ = ["MPMInitCommand"]
|