claude-mpm 5.1.9__py3-none-any.whl → 5.4.48__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/__init__.py +4 -0
- claude_mpm/agents/BASE_AGENT.md +164 -0
- claude_mpm/agents/CLAUDE_MPM_TEACHER_OUTPUT_STYLE.md +1 -1
- claude_mpm/agents/MEMORY.md +1 -1
- claude_mpm/agents/PM_INSTRUCTIONS.md +843 -900
- claude_mpm/agents/WORKFLOW.md +5 -254
- claude_mpm/agents/agent_loader.py +13 -44
- claude_mpm/agents/base_agent.json +1 -1
- claude_mpm/agents/frontmatter_validator.py +2 -2
- claude_mpm/agents/templates/circuit-breakers.md +138 -1
- claude_mpm/cli/__main__.py +4 -0
- claude_mpm/cli/chrome_devtools_installer.py +175 -0
- claude_mpm/cli/commands/agent_state_manager.py +18 -27
- claude_mpm/cli/commands/agents.py +9 -40
- claude_mpm/cli/commands/auto_configure.py +210 -25
- claude_mpm/cli/commands/config.py +88 -2
- claude_mpm/cli/commands/configure.py +1098 -159
- claude_mpm/cli/commands/configure_agent_display.py +25 -6
- claude_mpm/cli/commands/mpm_init/core.py +225 -46
- 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/postmortem.py +1 -1
- claude_mpm/cli/commands/profile.py +277 -0
- claude_mpm/cli/commands/skills.py +218 -197
- claude_mpm/cli/commands/summarize.py +413 -0
- claude_mpm/cli/executor.py +21 -3
- claude_mpm/cli/interactive/agent_wizard.py +2 -2
- claude_mpm/cli/parsers/agents_parser.py +0 -9
- claude_mpm/cli/parsers/auto_configure_parser.py +0 -138
- claude_mpm/cli/parsers/base_parser.py +12 -0
- claude_mpm/cli/parsers/config_parser.py +153 -83
- claude_mpm/cli/parsers/profile_parser.py +148 -0
- claude_mpm/cli/parsers/skills_parser.py +0 -5
- claude_mpm/cli/startup.py +876 -149
- claude_mpm/commands/mpm-config.md +28 -0
- claude_mpm/commands/mpm-doctor.md +9 -22
- claude_mpm/commands/mpm-help.md +5 -287
- claude_mpm/commands/mpm-init.md +81 -507
- claude_mpm/commands/mpm-monitor.md +15 -402
- claude_mpm/commands/mpm-organize.md +120 -0
- claude_mpm/commands/mpm-postmortem.md +6 -108
- claude_mpm/commands/mpm-session-resume.md +12 -363
- claude_mpm/commands/mpm-status.md +5 -69
- claude_mpm/commands/mpm-ticket-view.md +52 -495
- claude_mpm/commands/mpm-version.md +5 -107
- claude_mpm/config/agent_sources.py +27 -0
- claude_mpm/core/config.py +2 -4
- claude_mpm/core/framework/formatters/content_formatter.py +3 -13
- claude_mpm/core/framework/loaders/agent_loader.py +8 -5
- claude_mpm/core/framework/loaders/instruction_loader.py +52 -11
- claude_mpm/core/framework_loader.py +4 -2
- claude_mpm/core/logger.py +13 -0
- claude_mpm/core/optimized_startup.py +59 -0
- claude_mpm/core/shared/config_loader.py +1 -1
- claude_mpm/core/socketio_pool.py +3 -3
- claude_mpm/core/unified_agent_registry.py +5 -15
- claude_mpm/dashboard/static/svelte-build/_app/env.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/0.B_FtCwCQ.css +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/2.Cl_eSA4x.css +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BgChzWQ1.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CIXEwuWe.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CWc5urbQ.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DMkZpdF2.js +2 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DjhvlsAc.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/N4qtv3Hx.js +2 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/uj46x2Wr.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/app.DTL5mJO-.js +2 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/start.DzuEhzqh.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/0.CAGBuiOw.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/1.DFLC8jdE.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/2.DPvEihJJ.js +10 -0
- claude_mpm/dashboard/static/svelte-build/_app/version.json +1 -0
- claude_mpm/dashboard/static/svelte-build/favicon.svg +7 -0
- claude_mpm/dashboard/static/svelte-build/index.html +36 -0
- claude_mpm/hooks/claude_hooks/__pycache__/__init__.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/correlation_manager.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/event_handlers.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/hook_handler.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/installer.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/memory_integration.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/response_tracking.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/tool_analysis.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/correlation_manager.py +60 -0
- claude_mpm/hooks/claude_hooks/event_handlers.py +211 -78
- claude_mpm/hooks/claude_hooks/hook_handler.py +155 -1
- claude_mpm/hooks/claude_hooks/installer.py +33 -10
- claude_mpm/hooks/claude_hooks/memory_integration.py +26 -9
- claude_mpm/hooks/claude_hooks/response_tracking.py +2 -3
- claude_mpm/hooks/claude_hooks/services/__pycache__/__init__.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager_http.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/duplicate_detector.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/state_manager.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/subagent_processor.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/connection_manager.py +30 -6
- claude_mpm/hooks/kuzu_memory_hook.py +5 -5
- claude_mpm/hooks/memory_integration_hook.py +46 -1
- claude_mpm/init.py +63 -19
- claude_mpm/models/git_repository.py +3 -3
- claude_mpm/scripts/claude-hook-handler.sh +58 -18
- claude_mpm/scripts/launch_monitor.py +93 -13
- claude_mpm/services/agents/agent_builder.py +3 -3
- claude_mpm/services/agents/agent_recommendation_service.py +278 -0
- claude_mpm/services/agents/agent_review_service.py +280 -0
- claude_mpm/services/agents/cache_git_manager.py +6 -6
- claude_mpm/services/agents/deployment/agent_deployment.py +29 -7
- claude_mpm/services/agents/deployment/agent_discovery_service.py +4 -5
- claude_mpm/services/agents/deployment/agent_format_converter.py +23 -13
- claude_mpm/services/agents/deployment/agent_template_builder.py +32 -20
- claude_mpm/services/agents/deployment/agents_directory_resolver.py +2 -2
- claude_mpm/services/agents/deployment/async_agent_deployment.py +31 -27
- claude_mpm/services/agents/deployment/local_template_deployment.py +3 -1
- claude_mpm/services/agents/deployment/multi_source_deployment_service.py +247 -35
- claude_mpm/services/agents/deployment/remote_agent_discovery_service.py +392 -87
- claude_mpm/services/agents/git_source_manager.py +53 -4
- claude_mpm/services/agents/loading/base_agent_manager.py +1 -13
- claude_mpm/services/agents/recommender.py +5 -3
- claude_mpm/services/agents/single_tier_deployment_service.py +2 -2
- claude_mpm/services/agents/sources/git_source_sync_service.py +120 -7
- claude_mpm/services/agents/startup_sync.py +22 -2
- claude_mpm/services/agents/toolchain_detector.py +10 -6
- claude_mpm/services/analysis/__init__.py +11 -1
- claude_mpm/services/analysis/clone_detector.py +1030 -0
- claude_mpm/services/command_deployment_service.py +81 -10
- claude_mpm/services/diagnostics/checks/agent_check.py +2 -2
- claude_mpm/services/diagnostics/checks/agent_sources_check.py +1 -1
- claude_mpm/services/event_bus/config.py +3 -1
- claude_mpm/services/git/git_operations_service.py +101 -16
- claude_mpm/services/monitor/daemon.py +9 -2
- claude_mpm/services/monitor/daemon_manager.py +39 -3
- claude_mpm/services/monitor/management/lifecycle.py +8 -1
- claude_mpm/services/monitor/server.py +698 -22
- claude_mpm/services/pm_skills_deployer.py +711 -0
- claude_mpm/services/profile_manager.py +331 -0
- claude_mpm/services/self_upgrade_service.py +120 -12
- claude_mpm/services/skills/__init__.py +3 -0
- claude_mpm/services/skills/git_skill_source_manager.py +130 -2
- claude_mpm/services/skills/selective_skill_deployer.py +704 -0
- claude_mpm/services/skills/skill_to_agent_mapper.py +406 -0
- claude_mpm/services/skills_deployer.py +127 -9
- claude_mpm/services/socketio/dashboard_server.py +1 -0
- claude_mpm/services/socketio/event_normalizer.py +51 -6
- claude_mpm/services/socketio/server/core.py +386 -108
- claude_mpm/services/version_control/git_operations.py +103 -0
- claude_mpm/skills/skill_manager.py +92 -3
- claude_mpm/utils/agent_dependency_loader.py +14 -2
- claude_mpm/utils/agent_filters.py +17 -44
- claude_mpm/utils/migration.py +4 -4
- claude_mpm/utils/robust_installer.py +47 -3
- {claude_mpm-5.1.9.dist-info → claude_mpm-5.4.48.dist-info}/METADATA +53 -87
- {claude_mpm-5.1.9.dist-info → claude_mpm-5.4.48.dist-info}/RECORD +157 -197
- claude_mpm-5.4.48.dist-info/entry_points.txt +5 -0
- claude_mpm-5.4.48.dist-info/licenses/LICENSE +94 -0
- claude_mpm-5.4.48.dist-info/licenses/LICENSE-FAQ.md +153 -0
- claude_mpm/agents/BASE_AGENT_TEMPLATE.md +0 -292
- claude_mpm/agents/BASE_DOCUMENTATION.md +0 -53
- claude_mpm/agents/BASE_OPS.md +0 -219
- claude_mpm/agents/BASE_PM.md +0 -480
- claude_mpm/agents/BASE_PROMPT_ENGINEER.md +0 -787
- claude_mpm/agents/BASE_QA.md +0 -167
- claude_mpm/agents/BASE_RESEARCH.md +0 -53
- claude_mpm/agents/base_agent_loader.py +0 -601
- claude_mpm/cli/commands/agents_detect.py +0 -380
- claude_mpm/cli/commands/agents_recommend.py +0 -309
- claude_mpm/cli/ticket_cli.py +0 -35
- claude_mpm/commands/mpm-agents-auto-configure.md +0 -278
- claude_mpm/commands/mpm-agents-detect.md +0 -177
- claude_mpm/commands/mpm-agents-list.md +0 -131
- claude_mpm/commands/mpm-agents-recommend.md +0 -223
- claude_mpm/commands/mpm-config-view.md +0 -150
- claude_mpm/commands/mpm-ticket-organize.md +0 -304
- 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/entry_points.txt +0 -10
- claude_mpm-5.1.9.dist-info/licenses/LICENSE +0 -21
- {claude_mpm-5.1.9.dist-info → claude_mpm-5.4.48.dist-info}/WHEEL +0 -0
- {claude_mpm-5.1.9.dist-info → claude_mpm-5.4.48.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Chrome DevTools MCP Auto-Installer
|
|
3
|
+
===================================
|
|
4
|
+
|
|
5
|
+
Automatically installs and configures chrome-devtools-mcp on startup
|
|
6
|
+
to enable browser automation and web interaction capabilities in Claude Code.
|
|
7
|
+
|
|
8
|
+
WHY: Users should have browser automation capabilities out-of-the-box without
|
|
9
|
+
manual MCP server configuration.
|
|
10
|
+
|
|
11
|
+
DESIGN DECISION: Non-blocking installation that doesn't prevent startup if it fails.
|
|
12
|
+
Uses the `claude mcp add` command for native Claude Code integration.
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
import json
|
|
16
|
+
import subprocess
|
|
17
|
+
from pathlib import Path
|
|
18
|
+
from typing import Optional, Tuple
|
|
19
|
+
|
|
20
|
+
from ..core.logger import get_logger
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class ChromeDevToolsInstaller:
|
|
24
|
+
"""Manages automatic installation of chrome-devtools-mcp."""
|
|
25
|
+
|
|
26
|
+
MCP_SERVER_NAME = "chrome-devtools"
|
|
27
|
+
INSTALL_COMMAND = ["npx", "chrome-devtools-mcp@latest"]
|
|
28
|
+
|
|
29
|
+
def __init__(self):
|
|
30
|
+
"""Initialize the chrome-devtools installer."""
|
|
31
|
+
self.logger = get_logger(__name__)
|
|
32
|
+
self.claude_config_path = Path.home() / ".claude.json"
|
|
33
|
+
|
|
34
|
+
def is_already_configured(self) -> bool:
|
|
35
|
+
"""
|
|
36
|
+
Check if chrome-devtools-mcp is already configured in Claude.
|
|
37
|
+
|
|
38
|
+
Returns:
|
|
39
|
+
True if already configured, False otherwise
|
|
40
|
+
"""
|
|
41
|
+
try:
|
|
42
|
+
if not self.claude_config_path.exists():
|
|
43
|
+
self.logger.debug("Claude config file not found")
|
|
44
|
+
return False
|
|
45
|
+
|
|
46
|
+
with open(self.claude_config_path) as f:
|
|
47
|
+
config = json.load(f)
|
|
48
|
+
|
|
49
|
+
# Check if chrome-devtools is in mcpServers
|
|
50
|
+
mcp_servers = config.get("mcpServers", {})
|
|
51
|
+
is_configured = self.MCP_SERVER_NAME in mcp_servers
|
|
52
|
+
|
|
53
|
+
if is_configured:
|
|
54
|
+
self.logger.debug(
|
|
55
|
+
f"{self.MCP_SERVER_NAME} already configured in Claude"
|
|
56
|
+
)
|
|
57
|
+
else:
|
|
58
|
+
self.logger.debug(f"{self.MCP_SERVER_NAME} not found in Claude config")
|
|
59
|
+
|
|
60
|
+
return is_configured
|
|
61
|
+
|
|
62
|
+
except json.JSONDecodeError as e:
|
|
63
|
+
self.logger.warning(f"Failed to parse Claude config: {e}")
|
|
64
|
+
return False
|
|
65
|
+
except Exception as e:
|
|
66
|
+
self.logger.debug(f"Error checking Chrome DevTools configuration: {e}")
|
|
67
|
+
return False
|
|
68
|
+
|
|
69
|
+
def install_mcp_server(self) -> Tuple[bool, Optional[str]]:
|
|
70
|
+
"""
|
|
71
|
+
Install chrome-devtools-mcp using the claude CLI.
|
|
72
|
+
|
|
73
|
+
Returns:
|
|
74
|
+
Tuple of (success: bool, error_message: Optional[str])
|
|
75
|
+
"""
|
|
76
|
+
try:
|
|
77
|
+
# Build the command: claude mcp add chrome-devtools -- npx chrome-devtools-mcp@latest
|
|
78
|
+
command = [
|
|
79
|
+
"claude",
|
|
80
|
+
"mcp",
|
|
81
|
+
"add",
|
|
82
|
+
self.MCP_SERVER_NAME,
|
|
83
|
+
"--",
|
|
84
|
+
] + self.INSTALL_COMMAND
|
|
85
|
+
|
|
86
|
+
self.logger.debug(f"Running: {' '.join(command)}")
|
|
87
|
+
|
|
88
|
+
# Run the command with timeout
|
|
89
|
+
result = subprocess.run(
|
|
90
|
+
command,
|
|
91
|
+
capture_output=True,
|
|
92
|
+
text=True,
|
|
93
|
+
timeout=30, # 30 second timeout
|
|
94
|
+
check=False,
|
|
95
|
+
)
|
|
96
|
+
|
|
97
|
+
if result.returncode == 0:
|
|
98
|
+
self.logger.info(
|
|
99
|
+
f"Successfully installed {self.MCP_SERVER_NAME} MCP server"
|
|
100
|
+
)
|
|
101
|
+
return True, None
|
|
102
|
+
|
|
103
|
+
# Command failed
|
|
104
|
+
error_msg = (
|
|
105
|
+
f"Failed to install {self.MCP_SERVER_NAME}: {result.stderr.strip()}"
|
|
106
|
+
)
|
|
107
|
+
self.logger.warning(error_msg)
|
|
108
|
+
return False, error_msg
|
|
109
|
+
|
|
110
|
+
except subprocess.TimeoutExpired:
|
|
111
|
+
error_msg = (
|
|
112
|
+
f"Installation of {self.MCP_SERVER_NAME} timed out after 30 seconds"
|
|
113
|
+
)
|
|
114
|
+
self.logger.warning(error_msg)
|
|
115
|
+
return False, error_msg
|
|
116
|
+
|
|
117
|
+
except FileNotFoundError:
|
|
118
|
+
error_msg = "Claude CLI not found. Is Claude Code installed?"
|
|
119
|
+
self.logger.warning(error_msg)
|
|
120
|
+
return False, error_msg
|
|
121
|
+
|
|
122
|
+
except Exception as e:
|
|
123
|
+
error_msg = f"Unexpected error installing {self.MCP_SERVER_NAME}: {e}"
|
|
124
|
+
self.logger.warning(error_msg)
|
|
125
|
+
return False, error_msg
|
|
126
|
+
|
|
127
|
+
def auto_install(self, quiet: bool = False) -> bool:
|
|
128
|
+
"""
|
|
129
|
+
Automatically install chrome-devtools-mcp if not already configured.
|
|
130
|
+
|
|
131
|
+
Args:
|
|
132
|
+
quiet: If True, suppress console output
|
|
133
|
+
|
|
134
|
+
Returns:
|
|
135
|
+
True if installation succeeded or already configured, False otherwise
|
|
136
|
+
"""
|
|
137
|
+
# Check if already configured
|
|
138
|
+
if self.is_already_configured():
|
|
139
|
+
if not quiet:
|
|
140
|
+
print("✓ Chrome DevTools MCP ready", flush=True)
|
|
141
|
+
return True
|
|
142
|
+
|
|
143
|
+
# Show progress feedback
|
|
144
|
+
if not quiet:
|
|
145
|
+
print("Installing Chrome DevTools MCP...", end=" ", flush=True)
|
|
146
|
+
|
|
147
|
+
# Install the MCP server
|
|
148
|
+
success, error = self.install_mcp_server()
|
|
149
|
+
|
|
150
|
+
if success:
|
|
151
|
+
if not quiet:
|
|
152
|
+
print("✓", flush=True)
|
|
153
|
+
return True
|
|
154
|
+
|
|
155
|
+
# Installation failed
|
|
156
|
+
if not quiet:
|
|
157
|
+
print("(skipped)", flush=True)
|
|
158
|
+
|
|
159
|
+
# Log the error but don't fail startup
|
|
160
|
+
self.logger.debug(f"Chrome DevTools installation skipped: {error}")
|
|
161
|
+
return False
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
def auto_install_chrome_devtools(quiet: bool = False) -> bool:
|
|
165
|
+
"""
|
|
166
|
+
Convenience function to auto-install chrome-devtools-mcp.
|
|
167
|
+
|
|
168
|
+
Args:
|
|
169
|
+
quiet: If True, suppress console output
|
|
170
|
+
|
|
171
|
+
Returns:
|
|
172
|
+
True if installation succeeded or already configured, False otherwise
|
|
173
|
+
"""
|
|
174
|
+
installer = ChromeDevToolsInstaller()
|
|
175
|
+
return installer.auto_install(quiet=quiet)
|
|
@@ -111,14 +111,14 @@ class SimpleAgentManager:
|
|
|
111
111
|
local_agents = self._discover_local_template_agents()
|
|
112
112
|
agents.extend(local_agents)
|
|
113
113
|
|
|
114
|
-
# Discover
|
|
114
|
+
# Discover Git-sourced agents if requested
|
|
115
115
|
if include_remote:
|
|
116
116
|
try:
|
|
117
|
-
|
|
118
|
-
agents.extend(
|
|
119
|
-
self.logger.info(f"Discovered {len(
|
|
117
|
+
git_agents = self._discover_git_agents()
|
|
118
|
+
agents.extend(git_agents)
|
|
119
|
+
self.logger.info(f"Discovered {len(git_agents)} Git-sourced agents")
|
|
120
120
|
except Exception as e:
|
|
121
|
-
self.logger.warning(f"Failed to discover
|
|
121
|
+
self.logger.warning(f"Failed to discover Git-sourced agents: {e}")
|
|
122
122
|
|
|
123
123
|
# Sort agents by name for consistent display
|
|
124
124
|
agents.sort(key=lambda a: a.name)
|
|
@@ -152,7 +152,7 @@ class SimpleAgentManager:
|
|
|
152
152
|
|
|
153
153
|
# Get metadata for display info
|
|
154
154
|
metadata = template_data.get("metadata", {})
|
|
155
|
-
metadata.get("name", agent_id)
|
|
155
|
+
display_name = metadata.get("name", agent_id)
|
|
156
156
|
description = metadata.get(
|
|
157
157
|
"description", "No description available"
|
|
158
158
|
)
|
|
@@ -182,9 +182,10 @@ class SimpleAgentManager:
|
|
|
182
182
|
dependencies=display_tools,
|
|
183
183
|
)
|
|
184
184
|
|
|
185
|
-
# Set deployment status
|
|
185
|
+
# Set deployment status and display name
|
|
186
186
|
agent_config.is_deployed = is_deployed
|
|
187
187
|
agent_config.source_type = "local"
|
|
188
|
+
agent_config.display_name = display_name
|
|
188
189
|
|
|
189
190
|
agents.append(agent_config)
|
|
190
191
|
|
|
@@ -207,20 +208,20 @@ class SimpleAgentManager:
|
|
|
207
208
|
|
|
208
209
|
return agents
|
|
209
210
|
|
|
210
|
-
def
|
|
211
|
-
"""Discover agents from
|
|
211
|
+
def _discover_git_agents(self) -> List[AgentConfig]:
|
|
212
|
+
"""Discover agents from Git sources using GitSourceManager."""
|
|
212
213
|
try:
|
|
213
214
|
from claude_mpm.services.agents.git_source_manager import GitSourceManager
|
|
214
215
|
|
|
215
|
-
# Initialize source manager (uses ~/.claude-mpm/cache/
|
|
216
|
+
# Initialize source manager (uses ~/.claude-mpm/cache/agents by default)
|
|
216
217
|
source_manager = GitSourceManager()
|
|
217
218
|
|
|
218
219
|
# Discover all cached agents from all repositories
|
|
219
|
-
|
|
220
|
+
git_agent_dicts = source_manager.list_cached_agents()
|
|
220
221
|
|
|
221
222
|
# Convert to AgentConfig objects for UI display
|
|
222
223
|
agents = []
|
|
223
|
-
for agent_dict in
|
|
224
|
+
for agent_dict in git_agent_dicts:
|
|
224
225
|
# Extract metadata
|
|
225
226
|
metadata = agent_dict.get("metadata", {})
|
|
226
227
|
agent_id = agent_dict.get("agent_id", "unknown")
|
|
@@ -235,7 +236,7 @@ class SimpleAgentManager:
|
|
|
235
236
|
# Create AgentConfig with source information
|
|
236
237
|
# Store full agent_dict for later use in deployment
|
|
237
238
|
agent_config = AgentConfig(
|
|
238
|
-
name=
|
|
239
|
+
name=name, # Use display name for UI
|
|
239
240
|
description=(
|
|
240
241
|
f"[{category}] {description[:60]}..."
|
|
241
242
|
if len(description) > 60
|
|
@@ -248,6 +249,7 @@ class SimpleAgentManager:
|
|
|
248
249
|
agent_config.source_type = "remote"
|
|
249
250
|
agent_config.is_deployed = is_deployed
|
|
250
251
|
agent_config.display_name = name
|
|
252
|
+
agent_config.agent_id = agent_id # Store technical ID for reference
|
|
251
253
|
agent_config.full_agent_id = agent_id
|
|
252
254
|
agent_config.source_dict = agent_dict # Store full dict for deployment
|
|
253
255
|
|
|
@@ -272,9 +274,9 @@ class SimpleAgentManager:
|
|
|
272
274
|
True if agent is deployed, False otherwise
|
|
273
275
|
"""
|
|
274
276
|
# Check virtual deployment state (primary method)
|
|
277
|
+
# Only checking project-level deployment in simplified architecture
|
|
275
278
|
deployment_state_paths = [
|
|
276
279
|
Path.cwd() / ".claude" / "agents" / ".mpm_deployment_state",
|
|
277
|
-
Path.home() / ".claude" / "agents" / ".mpm_deployment_state",
|
|
278
280
|
]
|
|
279
281
|
|
|
280
282
|
for state_path in deployment_state_paths:
|
|
@@ -319,8 +321,8 @@ class SimpleAgentManager:
|
|
|
319
321
|
leaf_name = agent_id.split("/")[-1]
|
|
320
322
|
agent_file_names.append(f"{leaf_name}.md")
|
|
321
323
|
|
|
322
|
-
# Check .claude
|
|
323
|
-
project_agents_dir = Path.cwd() / ".claude
|
|
324
|
+
# Check .claude/agents/ directory (project deployment)
|
|
325
|
+
project_agents_dir = Path.cwd() / ".claude" / "agents"
|
|
324
326
|
if project_agents_dir.exists():
|
|
325
327
|
for agent_file_name in agent_file_names:
|
|
326
328
|
agent_file = project_agents_dir / agent_file_name
|
|
@@ -330,15 +332,4 @@ class SimpleAgentManager:
|
|
|
330
332
|
)
|
|
331
333
|
return True
|
|
332
334
|
|
|
333
|
-
# Check ~/.claude/agents/ directory (user level)
|
|
334
|
-
user_agents_dir = Path.home() / ".claude" / "agents"
|
|
335
|
-
if user_agents_dir.exists():
|
|
336
|
-
for agent_file_name in agent_file_names:
|
|
337
|
-
agent_file = user_agents_dir / agent_file_name
|
|
338
|
-
if agent_file.exists():
|
|
339
|
-
self.logger.debug(
|
|
340
|
-
f"Agent {agent_id} found as physical file: {agent_file}"
|
|
341
|
-
)
|
|
342
|
-
return True
|
|
343
|
-
|
|
344
335
|
return False
|
|
@@ -157,9 +157,6 @@ class AgentsCommand(AgentCommand):
|
|
|
157
157
|
"configure": self._configure_deployment,
|
|
158
158
|
# Migration command (DEPRECATION support)
|
|
159
159
|
"migrate-to-project": self._migrate_to_project,
|
|
160
|
-
# Auto-configuration commands (TSK-0054 Phase 5)
|
|
161
|
-
"detect": self._detect_toolchain,
|
|
162
|
-
"recommend": self._recommend_agents,
|
|
163
160
|
# Agent selection modes (Phase 3: 1M-382)
|
|
164
161
|
"deploy-minimal": self._deploy_minimal_configuration,
|
|
165
162
|
"deploy-auto": self._deploy_auto_configure,
|
|
@@ -564,7 +561,7 @@ class AgentsCommand(AgentCommand):
|
|
|
564
561
|
"""Deploy agents using two-phase sync: cache → deploy.
|
|
565
562
|
|
|
566
563
|
Phase 3 Integration (1M-486): Uses Git sync service for deployment.
|
|
567
|
-
- Phase 1: Sync agents to ~/.claude-mpm/cache/
|
|
564
|
+
- Phase 1: Sync agents to ~/.claude-mpm/cache/agents/ (if needed)
|
|
568
565
|
- Phase 2: Deploy from cache to project .claude-mpm/agents/
|
|
569
566
|
|
|
570
567
|
This replaces the old single-tier deployment with a multi-project
|
|
@@ -1825,34 +1822,6 @@ class AgentsCommand(AgentCommand):
|
|
|
1825
1822
|
f"Error in interactive configuration: {e}"
|
|
1826
1823
|
)
|
|
1827
1824
|
|
|
1828
|
-
def _detect_toolchain(self, args) -> CommandResult:
|
|
1829
|
-
"""Detect project toolchain without deploying agents.
|
|
1830
|
-
|
|
1831
|
-
Part of TSK-0054 Phase 5: Auto-configuration CLI integration.
|
|
1832
|
-
"""
|
|
1833
|
-
try:
|
|
1834
|
-
from .agents_detect import AgentsDetectCommand
|
|
1835
|
-
|
|
1836
|
-
cmd = AgentsDetectCommand()
|
|
1837
|
-
return cmd.run(args)
|
|
1838
|
-
except Exception as e:
|
|
1839
|
-
self.logger.error(f"Error detecting toolchain: {e}", exc_info=True)
|
|
1840
|
-
return CommandResult.error_result(f"Error detecting toolchain: {e}")
|
|
1841
|
-
|
|
1842
|
-
def _recommend_agents(self, args) -> CommandResult:
|
|
1843
|
-
"""Recommend agents based on project toolchain.
|
|
1844
|
-
|
|
1845
|
-
Part of TSK-0054 Phase 5: Auto-configuration CLI integration.
|
|
1846
|
-
"""
|
|
1847
|
-
try:
|
|
1848
|
-
from .agents_recommend import AgentsRecommendCommand
|
|
1849
|
-
|
|
1850
|
-
cmd = AgentsRecommendCommand()
|
|
1851
|
-
return cmd.run(args)
|
|
1852
|
-
except Exception as e:
|
|
1853
|
-
self.logger.error(f"Error recommending agents: {e}", exc_info=True)
|
|
1854
|
-
return CommandResult.error_result(f"Error recommending agents: {e}")
|
|
1855
|
-
|
|
1856
1825
|
def _migrate_to_project(self, args) -> CommandResult:
|
|
1857
1826
|
"""Migrate user-level agents to project-level.
|
|
1858
1827
|
|
|
@@ -2175,7 +2144,7 @@ class AgentsCommand(AgentCommand):
|
|
|
2175
2144
|
)
|
|
2176
2145
|
|
|
2177
2146
|
# Get remote agents cache directory
|
|
2178
|
-
cache_dir = Path.home() / ".claude-mpm" / "cache" / "
|
|
2147
|
+
cache_dir = Path.home() / ".claude-mpm" / "cache" / "agents"
|
|
2179
2148
|
|
|
2180
2149
|
if not cache_dir.exists():
|
|
2181
2150
|
return CommandResult.error_result(
|
|
@@ -2223,7 +2192,7 @@ class AgentsCommand(AgentCommand):
|
|
|
2223
2192
|
|
|
2224
2193
|
# Get agents from collection
|
|
2225
2194
|
service = MultiSourceAgentDeploymentService()
|
|
2226
|
-
cache_dir = Path.home() / ".claude-mpm" / "cache" / "
|
|
2195
|
+
cache_dir = Path.home() / ".claude-mpm" / "cache" / "agents"
|
|
2227
2196
|
agents = service.get_agents_by_collection(collection_id, cache_dir)
|
|
2228
2197
|
|
|
2229
2198
|
if not agents:
|
|
@@ -2280,7 +2249,7 @@ class AgentsCommand(AgentCommand):
|
|
|
2280
2249
|
|
|
2281
2250
|
# Get agents from collection
|
|
2282
2251
|
service = MultiSourceAgentDeploymentService()
|
|
2283
|
-
cache_dir = Path.home() / ".claude-mpm" / "cache" / "
|
|
2252
|
+
cache_dir = Path.home() / ".claude-mpm" / "cache" / "agents"
|
|
2284
2253
|
agents = service.get_agents_by_collection(collection_id, cache_dir)
|
|
2285
2254
|
|
|
2286
2255
|
if not agents:
|
|
@@ -2335,7 +2304,7 @@ class AgentsCommand(AgentCommand):
|
|
|
2335
2304
|
try:
|
|
2336
2305
|
from ...services.agents.cache_git_manager import CacheGitManager
|
|
2337
2306
|
|
|
2338
|
-
cache_dir = Path.home() / ".claude-mpm" / "cache" / "
|
|
2307
|
+
cache_dir = Path.home() / ".claude-mpm" / "cache" / "agents"
|
|
2339
2308
|
manager = CacheGitManager(cache_dir)
|
|
2340
2309
|
|
|
2341
2310
|
if not manager.is_git_repo():
|
|
@@ -2408,7 +2377,7 @@ class AgentsCommand(AgentCommand):
|
|
|
2408
2377
|
try:
|
|
2409
2378
|
from ...services.agents.cache_git_manager import CacheGitManager
|
|
2410
2379
|
|
|
2411
|
-
cache_dir = Path.home() / ".claude-mpm" / "cache" / "
|
|
2380
|
+
cache_dir = Path.home() / ".claude-mpm" / "cache" / "agents"
|
|
2412
2381
|
manager = CacheGitManager(cache_dir)
|
|
2413
2382
|
|
|
2414
2383
|
if not manager.is_git_repo():
|
|
@@ -2435,7 +2404,7 @@ class AgentsCommand(AgentCommand):
|
|
|
2435
2404
|
try:
|
|
2436
2405
|
from ...services.agents.cache_git_manager import CacheGitManager
|
|
2437
2406
|
|
|
2438
|
-
cache_dir = Path.home() / ".claude-mpm" / "cache" / "
|
|
2407
|
+
cache_dir = Path.home() / ".claude-mpm" / "cache" / "agents"
|
|
2439
2408
|
manager = CacheGitManager(cache_dir)
|
|
2440
2409
|
|
|
2441
2410
|
if not manager.is_git_repo():
|
|
@@ -2467,7 +2436,7 @@ class AgentsCommand(AgentCommand):
|
|
|
2467
2436
|
try:
|
|
2468
2437
|
from ...services.agents.cache_git_manager import CacheGitManager
|
|
2469
2438
|
|
|
2470
|
-
cache_dir = Path.home() / ".claude-mpm" / "cache" / "
|
|
2439
|
+
cache_dir = Path.home() / ".claude-mpm" / "cache" / "agents"
|
|
2471
2440
|
manager = CacheGitManager(cache_dir)
|
|
2472
2441
|
|
|
2473
2442
|
if not manager.is_git_repo():
|
|
@@ -2515,7 +2484,7 @@ class AgentsCommand(AgentCommand):
|
|
|
2515
2484
|
try:
|
|
2516
2485
|
from ...services.agents.cache_git_manager import CacheGitManager
|
|
2517
2486
|
|
|
2518
|
-
cache_dir = Path.home() / ".claude-mpm" / "cache" / "
|
|
2487
|
+
cache_dir = Path.home() / ".claude-mpm" / "cache" / "agents"
|
|
2519
2488
|
manager = CacheGitManager(cache_dir)
|
|
2520
2489
|
|
|
2521
2490
|
if not manager.is_git_repo():
|